Varnish+Nginx на Centos 5.x

И так, начнем с Varnish — это http accelerator. Если у Вас есть большое количество мелких файлов, отдающихся с диска и дисковый кеш Вас уже не спасает — это решение для Вас. Кроме всего прочего на основе varnish’a (но не только) можно построить архитектуру, позволяющую масштабировать это решение горизонтально без особых проблем.

Но, я его буду использовать в связке с nginx настроенным как бекэнд вот по этой статье

Установка Varnish:

rpm —nosignature -i http://repo.varnish-cache.org/redhat/el5/noarch/varnish-release-2.1-2.noarch.rpm
yum install varnish

Переходим в папочку /etc/varnish/ и открываем файлик default.vcl вносим следующие изменения:

backend default {
.host = «localhost»;
.port = «8080»; # Порт на котором слушает Apache!
}

Дальше в nginx вносим следующие изменения:

proxy_pass http://127.0.0.1:6081; # Трафик в Varnish

Перезапускаем nginx, apache и varnish. Не забудьте добавить varnish в автозагрузку.


Количество просмотров :4028

Поиск с использованием Jquery Ui Autocmplete

Статей в интернете на эту тему очень, но я все же решил написать свой вариант, своими слова. Первое, что нам будет необходимо сделать, это подключить jQuery и jQuery UI. Для этого, качаем их отсюда и отсюда. Скачивать jQuery Ui полностью или только виджет Autocomlete это дело ваше.

Теперь можно подключить скачанное:

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery-ui.js"></script>

Далее сам скрипт Autocomplite :

$(function() {
    var cache = {},
    lastXhr;
    $( "#autocomplete" ).autocomplete({
        minLength: 1,
        source: function( request, response ) {
            var term = request.term;
            if ( term in cache ) {
                response( cache[ term ] );
                return;
            }lastXhr = $.getJSON( "http://eddnet.org/search.php", request, function( data, status, xhr ) {
                cache[ term ] = data;
                if ( xhr === lastXhr ) {
                    response( data );
                }
            });
        }
    });
});

Параметр minLength задает минимальное количество символов при котором срабатывает автокомплит. Файл search.php расположенный по адресу http://eddnet.org/search.php должен выдавать предварительные результаты поиска в формате json. Как пример, файл search.php:

<?php
    function get_update_date($search)
    {
        $query = "SELECT name FROM table WHERE name LIKE ".$search."%'";
        $rt = mysql_query($query);
        while($nt = mysql_fetch_array($rt)){
            $new[] = $nt['name'];
        }
        return $new;
    }
    function prep_json($array)
    {
        foreach($array as $key => $val){
            $new[$key]['label'] = $val;
            $new[$key]['id'] = $key;
            $new[$key]['value'] = $val;
        }
        return $new;
    }
    if($_GET('term')){
        echo json_encode(prep_json(get_update_date(trim(strip_tags($_GET('term'))))));     
    } 
?>

Пример для Codeigniter 2.0.X. И так, в модель Data добавляем две следующие функции:

<?php
    function get_update_name($name = '')
    {
        $this->db->select('name');
        $this->db->like('name',$name,'after');
        $query = $this->db->get('table');
        return $query->result_array();         
    }
    function pre_json($array)
    {
        foreach($array as $key => $val){
            $new[$key]['label'] = $val['name'];
            $new[$key]['id'] = $key;
            $new[$key]['value'] = $val['name'];
        }
        return $new;
    }
?>

В контроллере

<?ph
$search = $this->Data->get_update_name(trim(strip_tags($this->input->get('term'))));
$info['result'] = $this->Data->pre_json($search);
?>

И в view :

<?php
echo json_encode($result);
?>

И не забываем присвоить форме id =»autocomplete»


Количество просмотров :3232

PHP постим в Twitter

И так, нам будет нужен TwitterOAuth PHP Class. Качаем отсюда https://github.com/abraham/twitteroauth. Или прямая ссылка на скачивание https://github.com/abraham/twitteroauth/zipball/0.2.0-beta3.
Из этого архива нам понадобятся только 2 файла, которые находятся в папке «twitteroauth», это — OAuth.php и twitteroauth.php

Дальше, регистрируем свое приложение на твитере. Регистрация доступна по адресу https://dev.twitter.com/apps.

На данном этапе нам необходимо будет ввести стандартные необходимые поля: название нашего приложения (Application Name), его описание (Application Name), сайт нашего приложения (Application Website) , организацию (Organization – если есть).

Ниже необходимо выбрать какой тип приложения мы будем использовать Client или Browser. Так как взаимодействия с браузером и пользователем у нас не будет, то мы выбираем Client (Desktop Client).

Дальше выбираем уровень доступа (Default Access type) Чтение-Запись твиттов (Read & Write) или просто чтение (Read-only).

При необходимости можно загрузить иконку для своего приложения.

Callback URL не указываем, так как нет взаимодействия с веб интерфейсом.

После успешной регистрации вашего приложения вам будут предоставлены 2 ключа доступа – это OAuth Consumer key и Consumer secret.

Создаем первый файлик index.php:

<?php

define('TWITTER_KEY', 'Consumer key');
define('TWITTER_SECRET', 'Consumer secret');

include_once 'twitteroauth.php';

function generateAuthLink()
{
$oauth = new TwitterOAuth(TWITTER_KEY, TWITTER_SECRET);

$request = $oauth->getRequestToken();

$requestToken = $request['oauth_token'];
$requestTokenSecret = $request['oauth_token_secret'];

$requestStr = '<?php' . "\n";
$requestStr .= '$request_token="' . $requestToken . "\"; \n";
$requestStr .= '$request_token_secret="' . $requestTokenSecret . "\"; \n";
$requestStr .= '?>' . "\n";
//echo $requestStr;
file_put_contents('config.php', $requestStr);
// Создаем ссылку
$registerURL = $oauth->getAuthorizeURL($request);
// Показываем ссылку
echo "<br><br><br><a href=\"$registerURL\" target=\"_blank\">Register with Twitter and get PIN</a>";
}

function generateOauthToken($requestToken, $requestTokenSecret, $pin)
{

$oauth = new TwitterOAuth(TWITTER_KEY, TWITTER_SECRET, $requestToken, $requestTokenSecret);

// Создаем коды доступа по PIN коду
$request = $oauth->getAccessToken($pin);
$accessToken = $request['oauth_token'];
$accessTokenSecret = $request['oauth_token_secret'];

$requestStr = '<?php' . "\n";
$requestStr .= '$accessToken="' . $accessToken . "\"; \n";
$requestStr .= '$accessTokenSecret="' . $accessTokenSecret . "\";\n";
$requestStr .= '?>' . "\n";

file_put_contents('access.php', $requestStr);

echo "<br>ok all done<br>";
}
?>

<a href="index.php?step=1">Step 1</a>
<a href="index.php?step=2">Step 2</a>

<?php if($_GET['step'] == 1){
generateAuthLink();
} ?>

<?php if($_GET['step'] == 2){
if(isset($_POST['pin'])){
include_once 'config.php';
$pin = $_POST['pin'];
generateOauthToken($request_token, $request_token_secret, $pin);
echo "U can try to send message now<br>";
}else{
$pin = '';
}
?>
<form action="index.php?step=2" method="post" accept-charset="utf-8">
PIN :<input type="text" name="pin" value="<?php echo $pin; ?>" id="pin"  />
<input type="submit" name="sub" value="Submit"  /></form>
<?php
} ?>

Переходим на эту страницу, и выполняем два действия, Step 1 даем доступ к нашему приложению и генерируем PIN код. На Step 2 вводим полученный PIN код. Далее создаем второй файлик send.php:

<?php
define('TWITTER_KEY', 'AWM4YnXBmEM7HCGu2ZlCw');
define('TWITTER_SECRET', 'YmzuyHsZhl6nHKMDbMv68G14ue0l37ZM4Jd1owBldpQ');
include_once 'twitteroauth.php';
include_once 'access.php';
function sendMessage($accessToken, $accessTokenSecret,$message)
{
$oauth = new TwitterOAuth(TWITTER_KEY, TWITTER_SECRET, $accessToken, $accessTokenSecret);

// Проверяем от кого будут идти сообщение
$credentials = $oauth->get("account/verify_credentials");
echo "Connected as @" . $credentials->screen_name;

// Отправляем сообщение
$oauth->post('statuses/update', array('status' => "VeXell robot: hello world"));
}
sendMessage ($accessToken, $accessTokenSecret,'Hellow word');
?>

Вот собственно и все, однажды сгенирировав токены вы сможете пользоваться ими столько, сколько нужно.
Статья написана по материалам сайта vexell.ru


Количество просмотров :3844

CentOS yum ошибка File «/usr/bin/yum», line 29, in ?

Иногда при использовании плагина fastestmirror, может возникнуть следующая ошибка:

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Traceback (most recent call last):
File «/usr/bin/yum», line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File «/usr/share/yum-cli/yummain.py», line 309, in user_main
errcode = main(args)
File «/usr/share/yum-cli/yummain.py», line 178, in main
result, resultmsgs = base.doCommands()
File «/usr/share/yum-cli/cli.py», line 345, in doCommands
self._getTs(needTsRemove)

Скорее всего, дело в нехватке памяти. Выйти из ситуации можно очень просто, добавляя параметр —noplugins


Количество просмотров :3774

Bash Считываем файл построчно

И так, в bash-е, для того, что бы считать файл построчно:

#!/bin/bash
file="/home/eddnet/data.txt"
while IFS= read -r line
do
# display $line or do somthing with $line
echo "$line"
done <"$file"

или

#!/bin/bash
file="/home/eddnet/data.txt"
while read line
do
# display $line or do somthing with $line
echo "$line"
done < $file

Строка будет записываться в переменную $line


Количество просмотров :19947

Bash Считам количество букв в строке

И так, для подсчета количества букв воспользуемся командой grep. Как пример давайте посчитает количество букв ‘s’ в переменной $x:

x=»This is a test»
grep -o «s» <<<«$x» | wc -l

результат будет:

3

Для того, что бы посчитать ‘s’ и ‘S’:

x=»This is a test. S»
grep -o «[s|S]» <<<«$x» | wc -l

результат:

4

Используя только bash:

x=»This is a test»
y=»${x//[^s]}»
echo «$y»
echo «${#y}»

Для того, что бы посчитать ‘s’ и ‘S’:

x=»This is a test. S»
y=»${x//[^s|S]}»
echo «${#y}»

Количество просмотров :5311

Удаляем MBR

Бывает, что необходимо удалить MBR, например с флешки. Для этого можно использовать команду dd, главное не ошибитесь с именем устройства:

dd if=/dev/zero of=/dev/sdc bs=512 count=1

На выходе будет:

1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00308483 s, 166 kB/s

Количество просмотров :4232

Codeigniter, проверка пароля из базы при помощи Ajax jQuery на примере PyroCMS

Все очень просто и понятно на странице формой пишем следующий скрипт:

$('input[name=password]').bind('keyup focus', function() {

$.post(base_url + 'index.php/ajax/confirm_database', {
server: $('input[name=hostname]').val(),
username: $('input[name=username]').val(),
password: $('input[name=password]').val()
}, function(data) {
if (data.success == 'true') {
$('#confirm_db').html(data.message).removeClass('failure').addClass('success');
}
else {
$('#confirm_db').html(data.message).removeClass('success').addClass('failure');
}
}, 'json'
);

});

проверка будет производиться по средством вызова скрипта index.php/ajax/confirm_database на стороне сервера:

<?php
public function confirm_database()
{

$server = $this->input->post('server');
$username = $this->input->post('username');
$password = $this->input->post('password');
$port = $this->input->post('port');

$host = $server . ':' . $port;

$link = @mysql_connect($host, $username, $password, TRUE);

if ( ! $link )
{
$data['success'] = 'false';
$data['message'] = lang('db_failure').mysql_error();
}
else
{
$data['success'] = 'true';
$data['message'] = lang('db_success');
}

// Set some headers for our JSON
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

echo json_encode($data);

}
?>

Количество просмотров :3862

JS Простое drop-down меню

Есть множество вариантов выпадающих меню, но вот это мне нравиться больше всего, в первую очередь за простоту. И так, все что вам нужно, это скачать вот этот скрипт и вот этот css. Далее между <head></head>:

<link rel="stylesheet" type="text/css" href="/css/drop.css" />
<script type="text/javascript" src="/js/drop.js"></script>

Описание самого меню :

<ul id="sddm">
<li><a href="#"
onmouseover="mopen('m1')"
onmouseout="mclosetime()">Home</a>
<div id="m1"
onmouseover="mcancelclosetime()"
onmouseout="mclosetime()">
<a href="#">HTML Drop Down</a>
<a href="#">DHTML Menu</a>
<a href="#">JavaScript DropDown</a>
<a href="#">Cascading Menu</a>
<a href="#">CSS Horizontal Menu</a>
</div>
</li>
<li><a href="#"
onmouseover="mopen('m2')"
onmouseout="mclosetime()">Download</a>
<div id="m2"
onmouseover="mcancelclosetime()"
onmouseout="mclosetime()">
<a href="#">ASP Dropdown</a>
<a href="#">Pulldown menu</a>
<a href="#">AJAX Drop Submenu</a>
<a href="#">DIV Cascading Menu</a>
</div>
</li>
<li><a href="#">Order</a></li>
<li><a href="#">Help</a></li>
<li><a href="#">Contact</a></li>
</ul>
<div style="clear:both"></div>

Демку вы сможете посмотреть здесь

Взято с javascript-array.com


Количество просмотров :5332

Температура жестких дисков на Centos 5

Нам понадобиться EPEL репозитарий, инструкция по установке тут. Далее устанавливаем hddtemp:

yum install hddtemp

далее выполняем :

hddtemp /dev/sda

результат:

/dev/sda: WDC WD800JD-23LSA0: 16°C

Так же можно узнать температуру из SMART таблицы винчестера, для этого устанавливаем smartmontools:

yum install smartmontools

и выполняем:

smartctl -d ata -A /dev/sda

результатом будет следующая таблица:

smartctl version 5.38 [i686-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0003   169   169   021    Pre-fail  Always       -       2525
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       13
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   200   200   051    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       768
 10 Spin_Retry_Count        0x0013   100   253   051    Pre-fail  Always       -       0
 11 Calibration_Retry_Count 0x0012   100   253   051    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       13
190 Airflow_Temperature_Cel 0x0022   084   059   045    Old_age   Always       -       16
194 Temperature_Celsius     0x0022   127   102   000    Old_age   Always       -       16
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0012   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0009   200   200   051    Pre-fail  Offline      -       0

А вы знали, что объявления из рук в руки можно опубликовать на сайте www.3303.ru


Количество просмотров :2861