tag:blogger.com,1999:blog-26242570417109675362024-02-20T08:54:54.424-08:00Блог программистаUnknownnoreply@blogger.comBlogger11125tag:blogger.com,1999:blog-2624257041710967536.post-32186562814586922482012-04-30T04:13:00.000-07:002012-04-30T04:13:00.452-07:00Putty: vim кириллица в Debian 6Если у ваш клиент putty ну никак не хочет отображать кириллицу в редактор vim, а русская локаль на сервере устеновленна<br />
<blockquote class="tr_bq">
$ locale</blockquote>
<blockquote class="tr_bq">
<span style="font-size: x-small;">en_US.utf8<br />POSIX<br />ru_RU.utf8 </span></blockquote>
Следует проверить настройки самого клиента putty.<b>Window - Translation - > UTF-8</b><br />
<blockquote class="tr_bq">
<br />
</blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-82874152712287561832011-10-03T09:26:00.000-07:002011-10-03T09:26:33.222-07:00Problem with autogen syntax error near unexpected token 1.9.6 AM_PATH_CPPUNIT(1.9.6) - Install rtorrentТак как из репов ставилась старая версия rtorrent'a, color-path не захотел натягиваться на него.<br />
Пришлось собирать из сорсов.<br />
Столкнулся с такой проблемой при запуске autogen.sh<br />
<blockquote>Problem with autogen syntax error near unexpected token 1.9.6 AM_PATH_CPPUNIT(1.9.6) </blockquote>ее решило<br />
apt-get install libcppunit-dev<br />
Система Debian 6Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2624257041710967536.post-80788280636290020132011-10-03T08:56:00.000-07:002011-10-03T08:56:28.810-07:00Патч для раскрашивания rtorrentНеплохой фак по патчингу популярного торрент клиента под никсы rtorrent<br />
<br />
http://binhng.wordpress.com/2010/04/16/rebuilding-rtorrent-with-color-patch-on-debian/Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-48240865512953543282011-07-13T22:39:00.000-07:002011-07-13T22:39:10.093-07:00substr не работает с русским алфавитомВышла тут задачка вырезать из русской строки несколько символов. Столкнулся с проблемой что ни substr, ни mb_substr не корректно обрезали строку, возвращав пустой результат.<br />
Решение довольно быстро нашлось добавить 4 параметр, кодировку.<br />
<blockquote>$str = mb_substr($urlstr,0,5,'UTF-8');</blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-55457366222829103292011-07-10T11:49:00.000-07:002011-07-10T11:49:20.519-07:00Не теряйте домены!У ребят и брайн куба проэкспайрился домен. В их блоге <strike>есть</strike> были довольно интресные наработки по CI 2 Template Library. Копипастю себе в блог, для истории.<br />
<a name='more'></a>В части 2 цикла статей о подготовке фреймворка мы работаем над шаблонизатором. Определим наши задачи: <br />
<ul><li>Один файл шаблона с header и footer областями, разный контент.</li>
<li>Возможность подгружать любые файлы в header и footer области шаблона, а так же выбирать разный шаблон.</li>
<li>Возможность скреплять методы add_header и add_footer в цепочки используя method chaining.</li>
<li>Предусмотреть поддержку AJAX.</li>
</ul><span id="more-210"></span> <span class="five-o"></span> <div class="singlebuttonwrap"><a class="button" href="http://proismy.name/res/articles/ci_start2/htdocs.zip" title="Скачать исходный код">Исходники</a></div><h3>Зачем это нужно</h3>Шаблонизатор позволяет избегать повторов в разметке: постоянно копировать <i>header</i> и <i>footer</i> области в каждом файле view. Конечно, всегда можно создать 2 файла <em>header_view.php</em> и <em>footer_view.php</em>, и подгружать их отдельно. Однако, это требует повторов в коде и определенной концентрации внимания на подобных мелочах. Метод, который я предлагаю, намного удобнее. Идея этого шаблонизатора взята из дебрей nettuts, за что им огромный респект. <h3>Как это будет работать</h3>В каждом контроллере мы будем использовать новую библиотеку (library), которая будет осуществлять все операции по подгрузке шаблона. Вот как будет выглядеть контроллер Home из первой части цикла статей: <pre class="brush: php">class Home extends Controller {
function __construct() {
parent::__construct();
$this->tpl->set_title('My title');
}
public function index() {
$data = array();
if ($this->_isAjaxRequest()) {
$this->load->view('home_view_ajax', $data);
}
else {
$this->tpl->view('home_view', $data);
}
}
private function _isAjaxRequest() {
return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}
}
</pre><h3>Создаем нашу библиотеку</h3>Создадим <em>app/libraries/Tpl.php</em>. Обратите внимание, первая буква названия написана в верхнем регистре, это важно. Обращаться к нашей библиотеке из CI мы будем тоже как «Tpl» <pre class="brush: php; highlight: [51]"><?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/*
* Code by BrainCube.ru - Smart solutions for the Web.
* @author Max Degterev <max@braincube.ru>
* @copyright (c) 2010 BrainCube
*/
class Tpl {
private $CI;
private $title_for_layout = NULL;
private $title_separator = ' | ';
private $header = array();
private $footer = array();
public function __construct() {
$this->CI =& get_instance();
}
public function set_title($title) {
$this->title_for_layout = $title;
return $this;
}
public function view($view_name, $params = array(), $layout = 'default') {
$rendered_view = $this->CI->load->view($view_name, $params, TRUE);
if ($this->title_for_layout !== NULL) {
$this->title_for_layout = $this->title_separator . $this->title_for_layout;
}
$this->CI->load->view('layouts/' . $layout, array(
'content_for_layout' => $rendered_view,
'title_for_layout' => $this->title_for_layout
));
}
public function __call($name, $arguments) {
if (substr($name,0,4) == 'get_') {
$property = substr($name,4);
return $this->_parseIncludes($property);
}
else if (substr($name,0,4) == 'add_') {
$property = substr($name,4);
if (!isset($arguments[1])) {
$this->CI->load->helper('url'); // Just in case!
$project = ((stripos(base_url(), 'http://') !== FALSE) ? base_url() : 'http://'.base_url());
array_push($this->$property, $project . $arguments[0]);
}
else {
array_push($this->$property, $arguments[0]);
}
}
return $this;
}
private function _parseIncludes($arrayname) {
$final_includes = '';
foreach ($this->$arrayname as $include) {
if (preg_match('/js$/', $include)) {
$final_includes .= '<script src="' . $include . '"></script>';
}
elseif (preg_match('/css$/', $include)) {
$final_includes .= '<link rel="stylesheet" href="' . $include . '" />';
}
}
return $final_includes;
}
}
</pre>Часть методов вполне понятна сама по себе. Дополнительные пояснения к коду: <ul><li>9-16 строки инициализируют переменные. <b>$CI</b> требуется для утилизации API CI, <b>$title_separator</b> – разделитель для тега <i><title></i> шаблона. Остальные переменные содержат необходимые для работы данные (сам заголовок, массив с файлами <i>header</i> и <i>footer</i>)</li>
<li>18-20 получаем инстанцию CI для работы с API. Этот трюк необходим при работе над любой библиотекой CI т.к. прямой доступ к API мы имеем только в контроллерах.</li>
<li>40-60 магия PHP5. Чтобы не дублировать одинаковый код для методов <i>add_header</i> и <i>add_footer</i>, мы воспользуемся magic методом __call. <b>$name</b> — вызываемый метод, <b>$arguments</b> — передаваемые ему аргументы. Сначала мы определяем требуемое действие. В случае вызова «get_» метода, мы передаем действие сторонней функции, которую мы рассмотрим чуть ниже. В случае «add_» метода мы добавляем в соответствующий массив (<b>$header</b> или <b>$footer</b>) новый элемент. Далее мы возвращаем инстанцию класса <b>$this</b> для возможности создавать цепочки методов. Обратите внимание на строку 51, этого действия можно избежать. В случае, если вы вводили адрес сайта в виде строки в переменной <b>$config['base_url']</b>. Поскольку мы внесли изменения в конфигурацию, при работе с localhost будет ошибка с загрузкой <i>css</i> и <i>javascript</i>. Чтобы исправить это недоразумение требуется небольшая проверка.</li>
<li>62-75 метод, отвечающий за выдачу файлов в <i>header</i> и <i>footer</i> области шаблона. Определяем тип элемента и создаем соответствующие теги.</li>
<li>27-38 метод, загружающий шаблон. Его мы будем вызывать из контроллеров. Ожидаемые параметры: файл view, массив данных и файл шаблона. По умолчанию используется «default». Далее мы получаем view в виде строки, готовим заголовок документа и вызываем шаблон. Данные из view файла передаются в общем массиве с заголовком и загружаются в шаблон.</li>
</ul><h3>Создаем шаблон по умолчанию</h3>Для этой задачи возьмем за основу наработки замечательного ресурса <a href="http://html5boilerplate.com/" rel="nofollow">HTML5 ★ Boilerplate</a>. Архив содержит множество интересных файлов и папок, и определенно заслуживает отдельной статьи. Однако, нам требуются только папки <em>css</em>, <em>js</em>; и файлы <em>index.html</em>, <em>apple-touch-icon.png</em>, <em>favicon.ico</em>. Переместим все, кроме <em>index.html</em>, с которым нам придется поработать, в корень нашего CI. <em>apple-touch-icon.png</em>, <em>favicon.ico</em> это иконки нашего сайта для аппаратов Apple и обычных браузеров соответственно.<br />
<figure> <a href="http://proismy.name/res/articles/ci_start2/1.jpg"><img alt="Содержимое архива" src="http://proismy.name/res/articles/ci_start2/1.jpg" /></a> <figcaption>Содержимое архива с HTML5 Boilerplate</figcaption> </figure> Создадим <em>app/views/layouts/default.php</em>:<br />
<pre class="brush: php"><?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
* Code by BrainCube.ru - Smart solutions for the Web.
* @author Max Degterev <max@braincube.ru>
* @copyright (c) 2010 BrainCube
*/
// Get year property for copyright and some other stuff.
$year = (date("Y") == '2010') ? date("Y") : ('2010-'.date("Y"));
$project = ((stripos(base_url(), 'http://') !== FALSE) ? base_url() : 'http://'.base_url());
?>
<!doctype html>
<!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
<!--[if IE 7 ]> <html lang="en" class="no-js ie7"> <![endif]-->
<!--[if IE 8 ]> <html lang="en" class="no-js ie8"> <![endif]-->
<!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="description" content="" />
<meta name="author" content="BrainCube.ru - Smart solutions for the Web" />
<meta name="copyright" content="" />
<title>Company<?php echo $title_for_layout ?></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="<?php echo $project;?>favicon.ico">
<link rel="apple-touch-icon" href="<?php echo $project;?>apple-touch-icon.png">
<link rel="stylesheet" href="<?php echo $project;?>css/style.css?v=2">
<script src="<?php echo $project;?>js/libs/modernizr-1.6.min.js"></script>
<?php echo $this->tpl->get_header(); ?>
</head>
<body>
<header>
</header>
<?php echo $content_for_layout; ?>
<footer>
<?php echo $year; ?> &copy; Company
</footer>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script>
<script>!window.jQuery && document.write(unescape('%3Cscript src="<?php echo $project;?>js/libs/jquery-1.4.4.js"%3E%3C/script%3E'))</script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script>
<script>!window.jQuery && document.write(unescape('%3Cscript src="<?php echo $project;?>js/libs/jquery-ui-1.8.6.custom.min.js"%3E%3C/script%3E'));</script>
<script src="<?php echo $project;?>js/script.js"></script>
<?php echo $this->tpl->get_footer(); ?>
<!--[if lt IE 7 ]>
<script src="<?php echo $project;?>js/libs/dd_belatedpng.js"></script>
<script src="<?php echo $project;?>js/ie6fix.js"></script>
<![endif]-->
</body>
</html>
</pre>HTML прост как топор. Небольшие пояснения по части PHP: <ul><li>9-10 получаем переменные <b>$year</b> — требуется для футера, а также <b>$project</b>, которая указывает абсолютный путь до файлов в зависимости от base_url().</li>
<li>26, 43 выводят передаваемые в шаблон заголовок и контент.</li>
<li>34, 55 отвечают за выгрузку дополнительных файлов в области хедера и футера.</li>
</ul><h3>Проверим в действии!</h3>Для этого добавим нашу библиотеку в автозагрузку. В <em>app/config/autoload.php</em>: <pre class="brush: php">$autoload['libraries'] = array('Tpl');
</pre>Приведем наш контроллер <em>app/controllers/home.php</em> к следующему виду: <pre class="brush: php"><?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/*
* Code by BrainCube.ru - Smart solutions for the Web.
* @author Max Degterev <max@braincube.ru>
* @copyright (c) 2010 BrainCube
*/
class Home extends Controller {
function __construct() {
parent::__construct();
$this->tpl
->set_title('Welcome to our index page')
->add_header('css/handheld.css')
->add_footer('js/plugins.js');
}
public function index() {
$data = array();
if ($this->_isAjaxRequest()) {
$this->load->view('home_view_ajax', $data);
}
else {
$this->tpl->view('home_view', $data);
}
}
private function _isAjaxRequest() {
return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}
}
</pre>Разберемся, что тут происходит: <ul><li>12 строка мы загружаем в нашу библиотеку данные о заголовке и дополнительных файлах областей <i>header</i> и <i>footer</i>.</li>
<li>17-22 мы определяем тип запроса. В случае, если это AJAX запрос, шаблонизатор нам не требуется, и мы просто загружаем файл view.</li>
</ul><h3>Заключение</h3><figure> <a href="http://proismy.name/res/articles/ci_start2/2.jpg"></a> <figcaption>Можете смело похлопать себя по плечу. Эта штука работает!</figcaption> </figure> После проделанной работы у нас на руках гибкий шаблонизатор с массой возможностей. Однако, это еще не все. В части 3 мы рассмотрим как изменить стандартную страницу ошибки 404 фреймворка.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-24893249275636315532011-06-23T00:58:00.000-07:002011-06-23T00:58:23.706-07:00Установка Sphinx на Debian 6.При установке поискового движка Сфинкса на дебиан столкнулся с такой проблемой<br />
ERROR: cannot find MySQL include files. Далее было предложение установить mysql-devel, но по такому названия пакета apt-get ничего не находил. Решение нашел очень быстро на оффициальном сайте поддержки сфинкса<br />
<br />
<pre class="code">aptitude install libmysql++-dev libmysqlclient15-dev checkinstall</pre>После чего ./configure прошло без ошибок.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-86272964800467591432011-06-23T00:29:00.000-07:002011-06-23T00:29:02.888-07:00Stopping MySQL database server: mysqld failed!При переносе базы через rsync на новый сервер, подменился пароль на пользователя debian-sys-maint со старого сервера.<br />
При попытке перезапустить сервер выдавалась ошибка<br />
<span style="font-size: x-small;">/etc/init.d/mysql restart <br />
Stopping MySQL database server: mysqld <span style="color: red;">failed</span>! <br />
Starting MySQL database server: mysqld already running. </span><br />
После не долгого гугления проблема была решена таким образом.<br />
Посмотрел текущий пароль пользователя<br />
<span style="font-size: x-small;">cat /etc/mysql/debian.cnf | grep password</span><br />
<span style="font-size: x-small;"><span style="font-size: small;">Скопировал вывденный пароль подсоединился к mysql:</span></span><br />
<span style="font-size: x-small;">mysql -u root -p<pass></span><span style="font-size: x-small;"><span style="font-size: small;"> </span></span><br />
<span style="font-size: x-small;"><span style="font-size: small;">И изменил пароль для пользователя debian-sys-admin на скопированный пароль: </span></span><br />
<span style="font-size: x-small;"><span style="font-size: small;"> </span><span class="keyword">GRANT</span> <span class="op">ALL</span> <span class="keyword">PRIVILEGES</span> <span class="keyword">ON</span> *.* <span class="keyword">TO</span> <span class="string">'debian-sys-maint'</span>@<span class="string">'localhost'</span> IDENTIFIED <span class="keyword">BY</span> <span class="string">'<password>'</span> <span class="keyword">WITH</span> <span class="keyword">GRANT</span> <span class="keyword">OPTION</span>; </span><br />
После проделанных манипуляций сервер начал перегружаться нормально.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-69061147578043119872011-06-20T10:57:00.000-07:002011-06-20T10:57:50.560-07:00PHP5 в fastcgi - php отдавалось текстом в Debian 6Пол часа бился с пытался почему на свежем серваке php скрипты отдавались с текстом. Оказалось дело все в dotdeb.com Оттуда тянулся не понятные сорсы пыхи для debian 6. Как следствие не смог нормально встать php 5.3<br />
<code><br />
killall php-cgi<br />
aptitude purge -y `dpkg -l | sed -e 's/ /\n/g' | grep php5`<br />
</code><br />
Подчистил source list<br />
<code><br />
vim /etc/apt/source.list<br />
</code>Удалил оттуда строчку с dotdeb.com<br />
Добавил <br />
<code><br />
deb http://debian.intergenia.de/debian/ squeeze main contrib non-free<br />
deb-src http://debian.intergenia.de/debian/ squeeze main contrib non-free<br />
</code><br />
Оттуда стянулся нормальный пыха и проблема была решена. <br />
<br />
<br />
<br />
<pre><code> </code></pre><pre><code> </code></pre><pre><code> </code></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-55239353890488681712011-06-20T08:53:00.000-07:002011-06-20T08:53:09.067-07:00Если тормозит авторизация по SSH через PUTTYПодвисает после строчки login....<br />
То нужно добавить в конфиг ssh<br />
<em>/etc/ssh/sshd_config</em><br />
добавить строчку <em>UseDNS no </em>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-89549765073890304042011-06-18T08:25:00.000-07:002011-06-20T02:35:13.746-07:00RSYNC: Бекап и перенос серверовrsync - это замечательная unix программка для переноса/синхронизации файлов на разных машинах.<br />
Предположим что у нас есть два сервера:<br />
<ol><li> SOU - сервер источник, с которого мы хотем скопировать информацию</li>
<li>BAC - сервер на который мы хотим сделать бекап </li>
</ol>Для начала нужно установить её на обоих машинах:<br />
<code>apt-get install rsync</code><br />
Мы хотим делать бекапы через крон. Для этого нам нужно создать публичный ключ, который мы скопируем на сервер BAC.<br />
Создаем публичный ключ на сервере SOU:<br />
<code><br />
cd /root/.ssh<br />
ssh-keygen -t rsa</code><br />
<code><br />
</code><br />
Ввыжно на предложение ввести пароль нужно просто надать ентер два раза.<br />
Полученный файл перенесем на сервер BAC, можно через обычный <a href="http://ru.wikipedia.org/wiki/SCP">scp</a><br />
И уже скопированный файл добавляем на сервере BAC в authorized_keys<br />
<code>cat id_rsa.pub >> authorized_keys</code><br />
После чего на сервере SOU:<br />
<code>rsync -avz -e ssh /home/www/ root@YOU.IP.ADD.RES:/home/www</code><br />
Параметр -a заменяет большинство нужных и часто используемых параметров. v - визуализация того что делает rsync.<br />
Этот код можно поместить в крон, и настроить для ежедневного бЭкапа нужных вам файлов.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2624257041710967536.post-80428127778264949082011-06-09T11:35:00.000-07:002011-06-09T11:35:26.379-07:00Заметки программистаДобрый день дамы и господа. В этом уютном бложике я буду выкладывать свои заметки. Программирую на php, python. Если вдруг у Вас какие вопросы возникают, пишите в комментарии, не стесняйтесь!Unknownnoreply@blogger.com0