<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8673849167023621130</id><updated>2011-11-30T21:41:11.362-08:00</updated><category term='scribefire'/><category term='admin'/><category term='client'/><category term='web'/><category term='bug'/><category term='rsa'/><category term='perl'/><category term='apt-get'/><category term='xargs'/><category term='оптимизация'/><category term='pdo'/><category term='unicod rewriter'/><category term='sed'/><category term='evolution'/><category term='memcache'/><category term='gnome'/><category term='bazaar'/><category term='test'/><category term='sshfs'/><category term='inheritance'/><category term='spl'/><category term='Дерьмо'/><category term='svn+ssh'/><category term='python'/><category term='pdt'/><category term='utf8'/><category term='grep'/><category term='svnadmin'/><category term='debian'/><category term='todo'/><category term='forms'/><category term='macro'/><category term='vim'/><category term='eclipse'/><category term='compiz'/><category term='port'/><category term='DBUnit'/><category term='closures'/><category term='fstab'/><category term='hook'/><category term='update'/><category term='repository'/><category term='debug'/><category term='php 5.3'/><category term='fixtures'/><category term='keyboard indicator'/><category term='забавно'/><category term='transaction'/><category term='ubnunt'/><category term='author'/><category term='mysql'/><category term='php'/><category term='mount'/><category term='shit'/><category term='gtk'/><category term='ssh'/><category term='editors'/><category term='zend studio'/><category term='php-долбоавторы'/><category term='memory'/><category term='mamba'/><category term='django'/><category term='blog'/><category term='nix'/><category term='extenstion'/><category term='Кино'/><category term='trac'/><category term='beril'/><category term='ctags'/><category term='trick'/><category term='imap'/><category term='vfat'/><category term='PHPUnit'/><category term='xdebug'/><category term='exception'/><category term='mp3'/><category term='ubuntu'/><category term='dockblock'/><category term='yii'/><category term='loggin'/><category term='amarok'/><category term='mercurial'/><category term='gmail'/><category term='ide'/><category term='svn'/><title type='text'>Простые вещи</title><subtitle type='html'>Немного о php программировании и вещами его окружающими.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7516803485891267410</id><published>2011-08-24T02:23:00.001-07:00</published><updated>2011-08-24T03:05:40.967-07:00</updated><title type='text'>Крик души, мнение о Zend Framework.</title><content type='html'>Меня тошнит от Zend Framework. Вот получили задание, переписать существующий сайт на Zend Framework. Задача не сложная, текущий код "портяночный", неправильный, там нет разделения логики от вида и т.д. Но вот я смотрю его, он простой, легко читаемый, прозрачный. Видно что его писал неглупый, возможно неопытный человек. Но в нем присутствует стройность. Более того, я считаю, что код вполне соответствует задаче.&lt;br /&gt;&lt;br /&gt;И вот мы начинаем его переписывать. В своей жизни я создал порядка 5ти сайтов на ZF. Начинал еще с версии 0.6, потом 0.9, далее не помню. Тем не менее считаю что сам фреймворк не знаю абсолютно. &lt;br /&gt;&lt;br /&gt;И вот как я представлю в какое умно все это превратится. И ведь даже выразить это невозможно. &lt;br /&gt;&lt;br /&gt;Я уважаю Zend Framework как набор компонент, они удобны, хороши, просты, с ними мало проблем.  И я удивляюсь, насколько убого создано то, что является MVC Framework'ом на основе этих компонент. &lt;br /&gt;&lt;br /&gt;Ребята похоже заигрались в "крутых ооп" программистов. Все такое независимое, компонентное, легко расширяемое, маштабируемое и прочая, прочая, прочая. &lt;br /&gt;&lt;br /&gt;Читаю последние обзоры, примеры мануалы. Я в шоке, там все такие крутые перцы. Сидят обсуждают преимущества и недостатки одних паттернов от других. Сервисный слой блять, бизнес логика, толстая модель, тонкий ибать контроллер, датамаппер, тейблгейтвей, иок. Я вот читая форумы обзоры флеймы аж вспотел, зачастую чтобы понять кого то мне приходилось освежать память. &lt;br /&gt;&lt;br /&gt;Так сука и хочется спросить. Если вы такие умные хуле вы на пхп пишете?&lt;br /&gt;&lt;br /&gt;Казалось бы нытье? Наверное да. Но вот открываю я quickstart zf. А конкретно http://framework.zend.com/manual/en/learning.quickstart.create-model.html вот этот раздел. &lt;br /&gt;&lt;br /&gt;Нас в мануале учат что для работы с базой мы будем использовать DataMapper, который нам вернет модели, которые мы assign в темлейте и будем там использовать. Т.е. получается. &lt;br /&gt;&lt;br /&gt;1. наследни DbTable&lt;br /&gt;2. Кастомный DataMapper&lt;br /&gt;3. Кастомная модель??? Структура с кучей геттеров. &lt;br /&gt;&lt;br /&gt;Что я вижу? &lt;br /&gt;&lt;br /&gt;1. Классы не требуются, т.е. это идет на уровне соглашения. Т.е. в мануале нам говорят как писать, но это не требуется, более того применения не будет. &lt;br /&gt;2. Весь такой клевый гибкий ооп зенд, в своем мануале нам показывает как в DataMapper ОБЪЕКТ!! превращают в сырой массив (словарь,хэш) который передается дальше! Вообще в этом так то плохого ничего нет. Но как это делается!!!&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;foreach ($resultSet as $row) {&lt;br /&gt;            $entry = new Application_Model_Guestbook();&lt;br /&gt;            $entry-&gt;setId($row-&gt;id)&lt;br /&gt;                  -&gt;setEmail($row-&gt;email)&lt;br /&gt;                  -&gt;setComment($row-&gt;comment)&lt;br /&gt;                  -&gt;setCreated($row-&gt;created);&lt;br /&gt;            $entries[] = $entry;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Что меня тут убивает. Вообще row я как понимаю инстанс Zend_Db_Tale_Row у котого есть метод toArray() &lt;br /&gt;&lt;br /&gt;Application_Model_GuestBook в конструкторе может принимать массив значений. &lt;br /&gt;&lt;br /&gt;т.е. написать $entries[] = new Application_Model_Guestbook( $row-&gt;toArray() ) ; Видимо религия не позволяет. &lt;br /&gt;&lt;br /&gt;Ну конечно они возможно хотели показать как должны идти преобразования данных в том случае когда хранение данных отличается от доменной модели. Но ведь нет таких объяснений. И пример крайне неудачный. Даже далеко не у самых глупых программистов должен возникнуть простой вопрос. А на хрена? &lt;br /&gt;&lt;br /&gt;Насколько пользователей нужно считать идиотами я даже не знаю. Конечно можно возразить что это мануал, а  умный напишет как правильно, да блин 60% клинических идиотов потом так и будут писать. Вот в текущей задаче есть таблица на 40 полей. Конечно скорее всего база данных будет изменена, но блин вот напишут мне модельку из 40 геттеров, 40 сеттеров, 40 филдов. А потом внутри датамаппера 40 строчек сета, вот красота то будет. А потом ищи опечатку среди этого бардака. &lt;br /&gt;&lt;br /&gt;Ну ладно так то мелочь и можно забыть, таки мануал и я 100% уверен что люди так не пишут. НО!!!&lt;br /&gt;&lt;br /&gt;http://habrahabr.ru/blogs/zend_framework/123285/&lt;br /&gt;&lt;br /&gt;Финиш. Все. Приплыли. Люди так пишут! Правда они умные, они блять парсят sql. И генерят код чтобы не опечататься. &lt;br /&gt;&lt;br /&gt;У них ведь даже базовые классы появились :( &lt;br /&gt;&lt;br /&gt;Бли до какой степени все убого, даже углубляться не хочется :( Как я люблю yii framework. &lt;br /&gt;&lt;br /&gt;Ну вот получите&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;class I_Love_Zend_Naming_Huh_Model&lt;br /&gt;{&lt;br /&gt;	protected $_properties = array();&lt;br /&gt;&lt;br /&gt;	protected $_data = array();&lt;br /&gt;&lt;br /&gt;	public function __construct(array $options = null )&lt;br /&gt;	{&lt;br /&gt;		if ($options !== null ) &lt;br /&gt;			$this-&gt;fromArray($options);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public function __set($name, $value)&lt;br /&gt;	{&lt;br /&gt;		$this-&gt;__checkProperty($name);//check if property exists &lt;br /&gt;&lt;br /&gt;		$setterMethod = 'set'.$name;//buid setterName&lt;br /&gt;		&lt;br /&gt;		if (method_exists($this, $setterMethod))// if setter exists&lt;br /&gt;			return $this-&gt;$setterMethod($value);//call it &lt;br /&gt;&lt;br /&gt;		$this-&gt;_data[$name] = $value;//no setter, remember data&lt;br /&gt;		return $this;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public function __get($name)&lt;br /&gt;	{&lt;br /&gt;		$getterMethod = 'get'.$name;&lt;br /&gt;&lt;br /&gt;		if (method_exists($this, $getterMethod))&lt;br /&gt;			return $this-&gt;$getterMethod();&lt;br /&gt;&lt;br /&gt;		if (key_exists($name, $this-&gt;_data))&lt;br /&gt;			return $this-&gt;_data[$name];&lt;br /&gt;		&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public function toArray()&lt;br /&gt;	{&lt;br /&gt;		return $this-&gt;_data; &lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;    public function fromArray(array $options)&lt;br /&gt;    {&lt;br /&gt;		foreach ($options as $key =&gt; $value)&lt;br /&gt;			$this-&gt;$key = $value;&lt;br /&gt;&lt;br /&gt;        return $this;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;	private function __checkProperty($name)&lt;br /&gt;	{&lt;br /&gt;		if (!in_array($name, $this-&gt;_properties))&lt;br /&gt;			throw new Exception('Undefined property ' . $name );&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вот сука нате, получите и распишитесь, тупорылая модель домена. Как использовать&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;class Super_Puper_Model extends I_Love_Zend_Naming_Huh_Model&lt;br /&gt;{&lt;br /&gt;   protected $_properties = array('id', 'first_name', 'last_name'); &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Все бля работает. А как же ибать сеттеры? Вдруг я потом поменяю логику извлечения айдишника? &lt;br /&gt;&lt;br /&gt;Да на те &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;class Super_Puper_Model extends I_Love_Zend_Naming_Huh_Model&lt;br /&gt;{&lt;br /&gt;   protected $_properties = array('id', 'first_name', 'last_name'); &lt;br /&gt;&lt;br /&gt;   public function getId()&lt;br /&gt;   {&lt;br /&gt;       return $this-&gt;first_name . $this-&gt;last_name;&lt;br /&gt;   } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Все, можете не париться, ваш код как вызывал $entity-&gt;id, так и вызывает, а поведение поменялось. &lt;br /&gt;&lt;br /&gt;А мне в ответ: "Ага! У тебя волшебные методы, все пиздец приплыли тормоза!" А в мануале их бля нет.... &lt;br /&gt;&lt;br /&gt;Я еще про могучие плагины не рассказал, а инверсия зависимостей ага, работает. Хрен найдешь что вызывается на самом деле. Код нельзя прочитать! (Ну конечно можно, особенно с опытом) Но вот на yii я написал 3 сайта, и считаю что его уже знаю. А на zf  5 и считаю что его не знаю :( &lt;br /&gt;&lt;br /&gt;Я не спорю что он крутой. Но такой некрасиый, такой нестройный. Такой не логичный. В yii framework достаточно понять смысл CComponent класс вроде из (40-100) строк, и дальше уже все понятно. А тут :(. &lt;br /&gt;&lt;br /&gt;Да господи, они со своей гибкостью вообще шизданулись. Когда возникает вопрос зачастую находишь перлы, что нужно писать так, но это не работает поэтому вот такой грязный хак, другой пишет так незя писать нужно вот такой хак использовать. :( &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7516803485891267410?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7516803485891267410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7516803485891267410' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7516803485891267410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7516803485891267410'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2011/08/zend-framework.html' title='Крик души, мнение о Zend Framework.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-3162609780456116098</id><published>2011-03-29T22:25:00.001-07:00</published><updated>2011-06-28T00:32:03.220-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extenstion'/><category scheme='http://www.blogger.com/atom/ns#' term='yii'/><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>yii, облегчаем прототипирование.</title><content type='html'>&lt;h3&gt;Введение&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Я давно работаю с yii framework. И пока это единственный framework в мире php. Из минусов для меня то, что он слишком низкоуровневый, отсутствует много плюшек, которые я с успехом возмещаю разумным использованием Zend компонент. Как набор компонент Zend хорош, чего не скажешь о его framework'е.&lt;/p&gt;&lt;p&gt; Ну так вот, возвращаясь к низкоуровневому yii. Его CRUD хорош, хорош для прототипирования, но плодит кучу файлов. Многие из которых со временем вырезаются и сильно модифицируются. Моим кошмаром была работа на небольшим по объему backend проектом. Где вся работа сводилась к администрированию кучи таблиц с текстовыми и буленовскими полями. При помощи CRUD все было сделано быстро, но большую часть времени я потратил на украшение админки, checkboxes вместо input, фильтры вида true|false вместо 0,1 и тому подобной ерунды. Таблиц было много, view еще больше. Я с нежностью вспоминал django и жалел что проект на PHP. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Прошло время, и вот во время работы над очередным проектом выдалась несколько часов, в результате которых было рождено небольшое расширение над CRUD. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Краткая суть. CRUD очень похожи, и их можно объединить. Второй задачей является способ указания системе типов данных в моделях, для того чтобы CRUD мог на основе этих типов создавать фильтры, приводить к строковому виду автоматически. &lt;br /&gt;&lt;/p&gt;&lt;/p&gt;Это получилось, пока начало, но проект не закончен. Но уже можно пользоваться. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Что получилось? Получился модуль который позволяет не запуская CRUD получить CRUD странички над любой моделью при условии что она отнаследована от особого ActiveRecord + в ней определен один единственный метод. В качестве небольшого бонуса есть простая возможность слегка менять список полей и их порядок на полученных страницах.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ниже небольшой туториал как заставить это работать. Текста много, но он расчитан на новичка в yii. Если вы накоротке с yii можете сразу читать с установки модуля.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Инициализация yii проекта &lt;/h3&gt;&lt;br /&gt;Можно пропустить, если хотите воспользоваться существующим.&lt;br /&gt;&lt;a aiotitle="click to expand" href="javascript:togglecomments('INIT_YII_APP')"&gt;Описание как создать yii проект с нуля. Для того чтобы потом использовать модуль.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="commenthidden" id="INIT_YII_APP"&gt;&lt;br /&gt; &lt;h4&gt;Создание директории проекта. &lt;/h4&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt; Я буду использовать локальный вебсервер, с дефолтными настройками. Проект создам в папке AdminTest внутри моего document root /var/www/&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;   claymore:$ mkdir /var/www/AdminTest&lt;br /&gt;   claymore:$ cd /var/www/AdminTest/&lt;br /&gt;   claymore:$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; Папка создана, скачиваем yii-framework&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;   Среда 2011-03-30 11:03   box:/var/www/AdminTest&lt;br /&gt;   claymore:$ wget http://yii.googlecode.com/files/yii-1.1.7.r3135.tar.gz&lt;br /&gt;   --2011-03-30 11:12:58--  http://yii.googlecode.com/files/yii-1.1.7.r3135.tar.gz&lt;br /&gt;   Преобразование адреса yii.googlecode.com... 74.125.87.82&lt;br /&gt;   Устанавливается соединение с yii.googlecode.com|74.125.87.82|:80... соединились.&lt;br /&gt;   Запрос HTTP послан, ожидание ответа... 200 OK&lt;br /&gt;   Длина: 2550331 (2,4M) [application/x-gzip]&lt;br /&gt;   Saving to: «yii-1.1.7.r3135.tar.gz»&lt;br /&gt;&lt;br /&gt;   100%[=============================================================================================================================&gt;] 2 550 331    780K/s   в 3,2s     &lt;br /&gt;&lt;br /&gt;   2011-03-30 11:13:01 (780 KB/s) - «yii-1.1.7.r3135.tar.gz» saved [2550331/2550331]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; Распаковываем&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;   claymore:$ tar xf yii-1.1.7.r3135.tar.gz &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; Переименовываем, или делаем символическую ссылку( кому как удобнее), я переименовываю, т.к. работаю в рамках демонстрации&lt;br /&gt;&lt;pre class="prettyprint"&gt;   &lt;br /&gt;   claymore:$ mv yii-1.1.7.r3135 yii&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; Удаляю скаченный архив  &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;   claymore:$ rm yii-1.1.7.r3135.tar.gz &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; Проверяем что у нас есть распаковааная папка с yii framework&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;  claymore:$ ls&lt;br /&gt;  yii&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; Переходим в папку со скриптами yii framework&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;  claymore:$ cd yii/framework/&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt; Запускаем скрипт создания проекта &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;   claymore:$ ./yiic  webapp /var/www/AdminTest/&lt;br /&gt;   Create a Web application under '/var/www/AdminTest'? [Yes|No] Yes&lt;br /&gt;      mkdir /var/www/AdminTest/css&lt;br /&gt;      generate css/form.css&lt;br /&gt;      generate css/main.css&lt;br /&gt;      generate css/bg.gif&lt;br /&gt;      generate css/ie.css&lt;br /&gt;      generate css/screen.css&lt;br /&gt;      generate css/print.css&lt;br /&gt;      mkdir /var/www/AdminTest/assets&lt;br /&gt;      mkdir /var/www/AdminTest/images&lt;br /&gt;      generate index.php&lt;br /&gt;      generate index-test.php&lt;br /&gt;      mkdir /var/www/AdminTest/themes&lt;br /&gt;      mkdir /var/www/AdminTest/themes/classic&lt;br /&gt;      mkdir /var/www/AdminTest/themes/classic/views&lt;br /&gt;      mkdir /var/www/AdminTest/themes/classic/views/site&lt;br /&gt;      mkdir /var/www/AdminTest/themes/classic/views/layouts&lt;br /&gt;      generate themes/classic/views/.htaccess&lt;br /&gt;      mkdir /var/www/AdminTest/themes/classic/views/system&lt;br /&gt;      mkdir /var/www/AdminTest/protected&lt;br /&gt;      mkdir /var/www/AdminTest/protected/data&lt;br /&gt;      generate protected/data/schema.sqlite.sql&lt;br /&gt;      generate protected/data/testdrive.db&lt;br /&gt;      generate protected/data/schema.mysql.sql&lt;br /&gt;      generate protected/yiic&lt;br /&gt;      mkdir /var/www/AdminTest/protected/messages&lt;br /&gt;      mkdir /var/www/AdminTest/protected/tests&lt;br /&gt;      mkdir /var/www/AdminTest/protected/tests/unit&lt;br /&gt;      mkdir /var/www/AdminTest/protected/tests/functional&lt;br /&gt;      generate protected/tests/functional/SiteTest.php&lt;br /&gt;      generate protected/tests/phpunit.xml&lt;br /&gt;      generate protected/tests/bootstrap.php&lt;br /&gt;      generate protected/tests/WebTestCase.php&lt;br /&gt;      mkdir /var/www/AdminTest/protected/tests/fixtures&lt;br /&gt;      mkdir /var/www/AdminTest/protected/tests/report&lt;br /&gt;      mkdir /var/www/AdminTest/protected/views&lt;br /&gt;      mkdir /var/www/AdminTest/protected/views/site&lt;br /&gt;      mkdir /var/www/AdminTest/protected/views/site/pages&lt;br /&gt;      generate protected/views/site/pages/about.php&lt;br /&gt;      generate protected/views/site/login.php&lt;br /&gt;      generate protected/views/site/index.php&lt;br /&gt;      generate protected/views/site/contact.php&lt;br /&gt;      generate protected/views/site/error.php&lt;br /&gt;      mkdir /var/www/AdminTest/protected/views/layouts&lt;br /&gt;      generate protected/views/layouts/column1.php&lt;br /&gt;      generate protected/views/layouts/column2.php&lt;br /&gt;      generate protected/views/layouts/main.php&lt;br /&gt;      mkdir /var/www/AdminTest/protected/runtime&lt;br /&gt;      generate protected/.htaccess&lt;br /&gt;      mkdir /var/www/AdminTest/protected/components&lt;br /&gt;      generate protected/components/Controller.php&lt;br /&gt;      generate protected/components/UserIdentity.php&lt;br /&gt;      mkdir /var/www/AdminTest/protected/config&lt;br /&gt;      generate protected/config/main.php&lt;br /&gt;      generate protected/config/test.php&lt;br /&gt;      generate protected/config/console.php&lt;br /&gt;      mkdir /var/www/AdminTest/protected/commands&lt;br /&gt;      mkdir /var/www/AdminTest/protected/commands/shell&lt;br /&gt;      mkdir /var/www/AdminTest/protected/controllers&lt;br /&gt;      generate protected/controllers/SiteController.php&lt;br /&gt;      mkdir /var/www/AdminTest/protected/models&lt;br /&gt;      generate protected/models/ContactForm.php&lt;br /&gt;      generate protected/models/LoginForm.php&lt;br /&gt;      mkdir /var/www/AdminTest/protected/extensions&lt;br /&gt;      generate protected/yiic.bat&lt;br /&gt;      generate protected/yiic.php&lt;br /&gt;      mkdir /var/www/AdminTest/protected/migrations&lt;br /&gt;&lt;br /&gt;   Your application has been created successfully under /var/www/AdminTest.&lt;br /&gt;   Среда 2011-03-30 11:03   box:/var/www/AdminTest/yii/framework&lt;br /&gt;   claymore:$ &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt; Проверяем &lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;   claymore:$ wget http://127.0.0.1/AdminTest/index.php -q -O - | grep Yii&lt;br /&gt;....&lt;br /&gt;   Congratulations! You have successfully created your Yii application.&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; Создаем базу данных admintest. При помощи вашего любимого средства.&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;   mysql&gt; create database admintest;&lt;br /&gt;   Query OK, 1 row affected (0.02 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Прописываем настройки базы данных в protected/config/main.php&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Теперь у нас есть болванка для веб сайта на основе шаблона yii.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Установка модуля.&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt; Переходим в директорию расширений. (Если пропустили первый шаг, замените /var/www/AdminTest/ на путь до папки вашего проекта, содержащей protected)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;   claymore:$ cd /var/www/AdminTest/protected/extensions/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Скачиваем расширение.&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;   claymore:$ hg clone -q https://yii-rextensions.googlecode.com/hg/ YiisyCrudAdmin -r YiisyCrudAdmin&lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;&lt;p&gt;[Опционально] удаляем информацию о репозитории, особенно ваш проект уже под системой контроля версий. &lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt; &lt;br /&gt;   claymore:$ rm -rf YiisyCrudAdmin/.hg&lt;br /&gt;   Среда 2011-03-30 11:03   box:/var/www/AdminTest/protected/extensions&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;&lt;p&gt;Модуль установлен.&lt;/p&gt;&lt;br /&gt; &lt;br /&gt;&lt;h3&gt;Пример создания crud административной страницы. &lt;/h3&gt;&lt;br /&gt;&lt;p&gt; Для примера нам понадобится любая модель.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Создаем таблицу в созданной базе данных.&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;  &lt;br /&gt;  mysql&gt; create table example(id int primary key auto_increment, name char(20), is_good_record tinyint(1) default 0 , long_description text);&lt;br /&gt;  Query OK, 0 rows affected (0.08 sec)&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;p&gt;Переходим в папку protected&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;  &lt;br /&gt;  claymore:$ cd /var/www/AdminTest/protected&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;p&gt;Создаем модель.&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;  &lt;br /&gt;  claymore:$ ./yiic shell config/main.php&lt;br /&gt;  Yii Interactive Tool v1.1 (based on Yii v1.1.7)&lt;br /&gt;  Please type 'help' for help. Type 'exit' to quit.&lt;br /&gt;  &gt;&gt; model Example example&lt;br /&gt;     generate models/Example.php&lt;br /&gt;     generate fixtures/example.php&lt;br /&gt;     generate unit/ExampleTest.php&lt;br /&gt;&lt;br /&gt;  The following model classes are successfully generated:&lt;br /&gt;   Example&lt;br /&gt;&lt;br /&gt;  If you have a 'db' database connection, you can test these models now with:&lt;br /&gt;   $model=Example::model()-&gt;find();&lt;br /&gt;   print_r($model);&lt;br /&gt;  &gt;&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Модифицируем модель.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Цель. Отнаследоваться от расширения CActiveRecord объявленному в YiisyCrudAdmin.RActiveRecord. И реализовать абстрактный метод getFieldsDescription&lt;/p&gt;&lt;br /&gt;&lt;P&gt;Открываем /var/www/AdminTest/protected/models/Example.php в любимом редакторе &lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;   &lt;br /&gt;  Yii::import("ext.YiisyCrudAdmin.RActiveRecord"); //Добавляем эту строчку импорта в верх файла.  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;В модель Example добавляем новый метод&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;   &lt;br /&gt;Yii::import("ext.YiisyCrudAdmin.RActiveRecord");  &lt;br /&gt;class Example extends RActiveRecord &lt;br /&gt;{&lt;br /&gt;//...&lt;br /&gt;        // в последней версии данный метод не требуется в модели, может создаваться по желанию в классе ExampleAdmin&lt;br /&gt;        public function getFieldsDescription()&lt;br /&gt;        {&lt;br /&gt;                return array(&lt;br /&gt;                        'is_good_record' =&gt; 'RDbBoolean',&lt;br /&gt;                        'long_description' =&gt; 'RDbText',&lt;br /&gt;                );&lt;br /&gt;        }&lt;br /&gt;//... &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;       &lt;br /&gt;&lt;p&gt;Этот метод предоствляет расширенную информацию о полях модели. На данный момент реализованы пока Bool и Text.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Т.к. метод абстрактный ( чтобы про него не забывали), реализация обязательна, метод может возвращать пустой массив если нет желания заморачиваться. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Создаем в вашем любимом редакторе controllers/ExampleController.php&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;    &lt;br /&gt;Yii::import('ext.YiisyCrudAdmin.RController');&lt;br /&gt;class ExampleController extends RController &lt;br /&gt;{&lt;br /&gt;        protected $_modelName = 'Example';&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;     &lt;br /&gt;&lt;p&gt;Тестируем&lt;p&gt;&lt;br /&gt;&lt;p&gt;Открываем в браузере http://127.0.0.1/AdminTest/index.php?r=example/admin&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Получаем типичный yii crud с небольшими улучшениями.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Поля, отмеченные как boolean, отображаются в виде чекбоксов при редактировании. Также в наличии встроенный фильтр для этих полей на странице actionAdmin.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Текстовые поля при редактировании редактируются в textarea. При просмотре в griidview обрезаются. (Пока и в view обрезаются, но это уже решаемый вопрос :) )&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;     &lt;br /&gt;&lt;p&gt;Из плюсов такого подхода, все сделано стандартными средствами yii. Т.е. после этапа прототипирования, вы уже можете использовать существующую базу кода, достаточно заглянуть в RController&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Гибкость, например в  методе getFieldsDescription модели, элеметом массива может быть массив, формирующий CGridColumn, в этом случае все обрабатывается в обычном для yii ключе.&lt;p&gt;&lt;br /&gt;&lt;h3&gt;Улучшаем внешний вид&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;&lt;i&gt;Как поменять порядок полей в actionAdmin ? &lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Прямо в файле модели создаем класс &lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;    &lt;br /&gt;Yii::import('ext.YiisyCrudAdmin.RModelAdmin');&lt;br /&gt;class ExampleAdmin extends RModelAdmin&lt;br /&gt;{&lt;br /&gt;        public function getAdminFields()&lt;br /&gt;        {&lt;br /&gt;                return array(&lt;br /&gt;                        'name', 'long_description', 'is_good_record', 'id'&lt;br /&gt;                );&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;После этого в actionAdmin наблюдаем поля в  указанном порядке&lt;p&gt;. &lt;br /&gt;&lt;p&gt;&lt;i&gt;Как исключить поле из отображения в actionAdmin ? &lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;   &lt;br /&gt;Yii::import('ext.YiisyCrudAdmin.RModelAdmin');&lt;br /&gt;class ExampleAdmin extends RModelAdmin&lt;br /&gt;{&lt;br /&gt;        public function getAdminExcludedFields()&lt;br /&gt;        {&lt;br /&gt;                return array(&lt;br /&gt;                        'id',&lt;br /&gt;                );&lt;br /&gt;        }&lt;br /&gt;}  &lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;&lt;p&gt;И это все. Оба метода можно комбинировать.&lt;/p&gt;&lt;br /&gt;   &lt;br /&gt;&lt;p&gt;Ну и вот  интерфейс RModelAdmin, отвечающий за порядок и отображаемые поля&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;  &lt;br /&gt;   public function getViewExcludedFields();// список полей для исключения в actionView &lt;br /&gt;&lt;br /&gt;   public function getAdminExcludedFields();//список полей для исключения в actionAdmin&lt;br /&gt;&lt;br /&gt;   public function getViewFields();// список полей для отображения в actionView&lt;br /&gt;&lt;br /&gt;   public function getSearchFields();//список полей для отображения в расширенной форме поиска actionAdmin&lt;br /&gt;&lt;br /&gt;   public function getAdminFields();// список полей для отображения в actionAdmin&lt;br /&gt;&lt;br /&gt;   public function getFormFields();// список полей для создания/редактирования. &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;   &lt;br /&gt;&lt;p&gt;Почему методы а не массивы? Например для динамической генерации в зависимости от условий.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATED:&lt;/b&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;В последней версии метод getFieldsDescription перенесен из модели в ModelAdmin класс. &lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-3162609780456116098?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/3162609780456116098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=3162609780456116098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3162609780456116098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3162609780456116098'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2011/03/test-spoiler-expanded-text.html' title='yii, облегчаем прототипирование.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7988628478719144906</id><published>2010-08-26T19:09:00.000-07:00</published><updated>2010-08-26T19:44:37.397-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='оптимизация'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Немного об оптимизации веб-сайтов. часть 1.</title><content type='html'>&lt;p&gt;Большую часть работы я трачу на поддержку и развитие уже написанных сайтов. Немалую долю времени при поддержке приходится тратить на оптимизацию. Именное ей и будет посвящен набор статей виде отдельных историй об одном абстрактном программисте. &lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Этап 1 - становление. &lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;Опыт 1. &lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Начинающий веб программист получает заказ на небольшой сайт. На удивление сайт завершен за 2 недели до сроков, даже с учетом затребованных изменений. Программист понимает что код его далек от идеала, многие вещи реализованы не оптимально. Принято решение заняться оптимизацией сайта. Сказал - сделал. Время генерации сайта до оптимизации 0.02 секунды, время генерации сайта после оптимизации 0.015 секунды. Т.е. страница генерируется на 25% быстрее.  Итак по мнению программиста сайт обслужит на 25% больше пользователей. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Проверка. &lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Пусть следующий скрипт эмулирует сайт до оптимизации. &lt;/p&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &lt;br /&gt;$echo “&amp;lt;?php usleep(20000);”  &gt; /var/www/site_before.php &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;А следующий после:&lt;/p&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &lt;br /&gt;$echo “&amp;lt;?php usleep(15000);?&gt;”  &gt; /var/www/site_after.php &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Запускаем проверку.&lt;/p&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &lt;br /&gt;$ ab -q -n 1000 -c 150  http://127.0.0.1/site_before.php  | grep "Requests per second"&lt;br /&gt;Requests per second:    64, 3[#/sec] (mean) (усреднено по трем замерам)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &lt;br /&gt;$ ab -q -n 1000 -c 150  http://127.0.0.1/site_after.php  | grep "Requests per second"&lt;br /&gt;Requests per second:    64 [#/sec] (mean) (усреднено по трем замерам)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;h3&gt;Результат.&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Прироста в 25% нет.  Есть падение производительности в рамках погрешности. &lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Предположение.&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;При   фиксированных параметрах веб серверва и  физических ресурсах сервера есть некое пороговое значение времени выполнения процесса ниже которого оптимизация теряет смысл.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Подтверждение&lt;/h3&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt; &lt;br /&gt;$echo “&amp;lt;?php ”  &gt; /var/www/site_null.php &lt;br /&gt;$ ab -q -n 1000 -c 150  http://127.0.0.1/site_null.php  | grep "Requests per second"&lt;br /&gt;Requests per second:    67 [#/sec] (mean) (усреднено по трем замерам)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Т.е. даже если убрать весь код из нашего проекта мы получим лишь 4% прирост производительности вебсервера. &lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Объяснение.&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Пороговая производительность веб сервера при выполнении какой либо задачи напрямую связана с типом задачи. В нашем примере скорее всего значительную часть времени было потрачено на запуск интерпретатора, что составляло настолько большую долю в процессе отдачи страницы, что временем выполнения скрипта вообще можно было пренебречь.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Резюме.&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;При выполнении оптимизации вы должны быть четко уверены в том что она нужна. &lt;br /&gt;Перед оптимизацией кода будьте уверены что проблема именно в нем. Есть много способов оптимизации сайта, которые не затрагивают исходные коды.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Мое мнение.&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Вообще вывод тривиален, да, согласен. Но я склонен считать что этой ошибке подвержены все начинающие веб программисты. В целом нет ничего плохого в том, что делал наш абстрактный программист, он изучал возможности языка и это очень полезное качество. Вопрос тут в другом. Нужно правильно расставлять акценты. Не нужно подменять понятия. В своей жизни я видел задержки проектов по срокам, из-за подобной деятельности, при этом человек занявшись "оптимизацией" (на самом деле просто игрался), начинал сам верить что оптимизирует сайт и даже обижался когда ему указывали на срыв сроков. И начинал заговариваться утверждая, что его действия необходимы для поддержки и развития проекта. Начинающий программист должен понимать, что если он занимается оптимизацией, а никаких оснований для этого нет, то он просто изучает язык, приемы, но никак не улучшает конечный продукт.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7988628478719144906?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7988628478719144906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7988628478719144906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7988628478719144906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7988628478719144906'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2010/08/1.html' title='Немного об оптимизации веб-сайтов. часть 1.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-6764452234762134757</id><published>2010-06-22T23:11:00.000-07:00</published><updated>2010-06-22T23:17:49.687-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dockblock'/><category scheme='http://www.blogger.com/atom/ns#' term='author'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Смена @author в eclipse|zend docblock</title><content type='html'>eclipse постоянно подставлял в phpdoc или скажем в pydoc напротив тэга @author имя текущего пользователя в системе, как я сильно от этого мучался. В итоге  я потратил время на поиск решения и даже нашел:&lt;br /&gt;&lt;br /&gt;- решение 1. &lt;br /&gt;&lt;br /&gt;Запускать со следующими параметрами : &lt;br /&gt;&lt;br /&gt;./eclipse -vmargs -Duser.name="User name"&lt;br /&gt;&lt;br /&gt;- Решение 2.  &lt;br /&gt;&lt;br /&gt;Вручную заменив во всех шаблонах переменную ${user} на ваше имя. &lt;br /&gt;&lt;br /&gt;Взято &lt;a href="http://dev.eclipse.org/newslists/news.eclipse.newcomer/msg00139.html"&gt;отсюда&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-6764452234762134757?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/6764452234762134757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=6764452234762134757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6764452234762134757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6764452234762134757'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2010/06/author-eclipsezend-docblock.html' title='Смена @author в eclipse|zend docblock'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-4003623253691422718</id><published>2010-05-27T20:07:00.000-07:00</published><updated>2010-08-26T19:02:43.086-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>php type hinting</title><content type='html'>Навеяно &lt;a href="http://habrahabr.ru/blogs/php/94714/"&gt;http://habrahabr.ru/blogs/php/94714/&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;В статье обсуждаются предлагаемые в будущих реализациях механизмы проверки типов, в комментариях задевается текущая. А я хочу рассказать о том как я боролся с проверкой типов, в том числе и примитивных, в php средствами php. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Идеология. Проверка типов должна быть легко отключаема, или поведение на несоотвестие типов должно легко подменяться. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Набросок использования предполагаемого решения  для проверки типов данных на примере Yii framework. (В принципе от yii тут только component, что например в Zend может быть сделано на Registry, если там ничего не появилось нового, или на Toolkit в limb, ну или уж в крайнем случае singleton, глобальные переменные) &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;class AnyClass &lt;br /&gt;{&lt;br /&gt;   /**&lt;br /&gt;   * anyFunction description &lt;br /&gt;   * &lt;br /&gt;   * @param integer $arg1&lt;br /&gt;   * @param string $arg2&lt;br /&gt;   */ &lt;br /&gt;   public function anyFunction($arg1, $arg2)&lt;br /&gt;   {&lt;br /&gt;       Yii::app()-&gt;typeHintingComponent-&gt;assertFunctionArgs($this,'anyFunction'  get_funciton_args());&lt;br /&gt;   //orYii::app()-&gt;typeHintingComponent-&gt;assertFunctionArgs(__CLASS__,__METHOD__,  get_funciton_args()); &lt;br /&gt;   } &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Ожидаемое поведение : в случае если тип $arg1 не integer или тип $arg2 не string или полученное количество аргументов не совпадает, мы  получаем например RuntimeException. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Реализация : &lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;По классу и имени метода получаем Reflection Method&lt;/li&gt; &lt;br /&gt;&lt;li&gt;У Reflection Method получаем docsting&lt;/li&gt; &lt;br /&gt;&lt;li&gt;Из dostring вытаскиваем типы данных &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Проверяем &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Делаем что душа пожелает, тут можно использовать либо стратегию (оно же вызывать call_back) , либо наследников с переопределением обработки ошибок, чтобы менять поведение. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;В моем примере поведение меняется заданием component в конфиге.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;В результате получаем отключаемую проверку типов, и можем управлять поведением. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Основным недостатком мне видится необходимость каждый раз явно указывать объект, метод, передавать полученные аргументы &lt;br /&gt;&lt;br /&gt;Мое решение это написать функцию обертку что берет эти данные из debug_backtrace&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;//docstring&lt;br /&gt;public function func($arg1, $arg2) &lt;br /&gt;{&lt;br /&gt;   Yii::app()-&gt;typeHintingComponent-&gt;assertFunctionArgs();&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;//...&lt;br /&gt;public function assertFunctionArgs()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;  $backTrace = debug_backtrace();&lt;br /&gt;  if ( ! isset($backTrace[1]['object'], $backTrace[1]['function'], $backtrace[1]['args']))&lt;br /&gt;   throw new RCAssertException(/* Details */);&lt;br /&gt;   &lt;br /&gt;  $obj = $backTrace[1]['object']; &lt;br /&gt;  $function = $backTrace[1]['function'];&lt;br /&gt;  $args = $backTrace[1]['args'];&lt;br /&gt;                //далее по предыдущему алгоритму&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Еще один недостаток, на этапе разработки можно получить несоотвествие документации и ождаемых параметров, лично я это к недостаткам не отношу, т.к. позволит поддерживать актуальность документации как минимум. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Ну а самый большой недостаток такой реализации, это все же необходимость в методе постоянно вызывать ....-&gt;assertFunctionArgs(), если этого не делать, то и схема получится не работающая, это уже нужно насаждать на уровне review кода. &lt;br /&gt;&lt;br /&gt;Зато самое большое преимущество это возможность проверять даже не существующие  типы&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @param mixed $var ну и нафига проверка типов если используются такие переменные? :)&lt;br /&gt;* @param string|integer $var2 тоже смешно, но на промежуточном этапе рефакторинга может пригодится&lt;br /&gt;*/&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;На практике у меня это не прижилось т.к. пытался насадить это вместе с кучей других требований и это не было приоритетным, возможно теперь перейдя на yii framework и реализовав это в виде компоненты у меня получится это сделать со второй попытки. Но тем не менее мне пришлось при рефакторинге одного запутанного кода использовать эту наработку активно, просто в том проекте одни и те же функции/методы использовались для разных целей, и соотвественно передаваемые типы данных были непредсказуемыми. &lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-4003623253691422718?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/4003623253691422718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=4003623253691422718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4003623253691422718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4003623253691422718'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2010/05/php-type-hinting.html' title='php type hinting'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1048953210779926423</id><published>2010-03-26T02:42:00.000-07:00</published><updated>2010-03-26T05:19:28.890-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='closures'/><category scheme='http://www.blogger.com/atom/ns#' term='php 5.3'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Забавный php5.3</title><content type='html'>В debian testing неожиданно для меня появился 5.3, спустя час после этого "счастья", LAMP заработал как и раньше. Захотелось экспериментов, вот что в итоге получилось, на мой взгляд забавно для php. &lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;BaseObject&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;extends&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;stdClass&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__call&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$method&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$args&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;call_user_func_array&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$method&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$args&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//call&amp;nbsp;closure&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;Create&amp;nbsp;className&amp;nbsp;instance&amp;nbsp;add&amp;nbsp;getIncrementedAge,&amp;nbsp;getName&amp;nbsp;behaviours&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;string&amp;nbsp;$className&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;integer&amp;nbsp;$age&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;string&amp;nbsp;$name&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;object&amp;nbsp;same&amp;nbsp;type&amp;nbsp;as&amp;nbsp;$className&amp;nbsp;&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Type&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$props&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;func_get_args&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$className&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;array_shift&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$props&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//classname&amp;nbsp;should&amp;nbsp;be&amp;nbsp;first&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$refFunction&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ReflectionFunction&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Type'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$props&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;array_combine&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;make&amp;nbsp;dictionary&amp;nbsp;from&amp;nbsp;function&amp;nbsp;arg&amp;nbsp;names&amp;nbsp;(from&amp;nbsp;phpdoc)&amp;nbsp;and&amp;nbsp;function&amp;nbsp;arguments&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;array_map&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//extract&amp;nbsp;variable&amp;nbsp;names&amp;nbsp;from&amp;nbsp;phpdoc&amp;nbsp;@param&amp;nbsp;line&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$docString&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//search&amp;nbsp;variable&amp;nbsp;name&amp;nbsp;and&amp;nbsp;return&amp;nbsp;it&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;preg_match&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'/\$(\w+)/'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$docString&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$data&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$data&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;];&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;array_filter&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//make&amp;nbsp;lines&amp;nbsp;array&amp;nbsp;from&amp;nbsp;phpdoc,&amp;nbsp;filtering&amp;nbsp;all&amp;nbsp;except&amp;nbsp;strings&amp;nbsp;with&amp;nbsp;@param&amp;nbsp;and&amp;nbsp;skip&amp;nbsp;string&amp;nbsp;with&amp;nbsp;$className&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;explode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$refFunction&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getDocComment&lt;/span&gt;&lt;span style="color: #007700"&gt;()),&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strpos&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'param'&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strpos&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'$className'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;),&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$props&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$className&lt;/span&gt;&lt;span style="color: #007700"&gt;();&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$props&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$name&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;function&amp;nbsp;()&amp;nbsp;use(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;name&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getIncrementedAge&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;function&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$inc&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;use(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;age&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;+&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$inc&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$ob&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Type&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'BaseObject'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;10&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'cd'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$stas&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Type&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'BaseObject'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;20&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'stas'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;var_dump&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cd&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getName&lt;/span&gt;&lt;span style="color: #007700"&gt;());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;var_dump&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cd&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getIncrementedAge&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;var_dump&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$stas&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getName&lt;/span&gt;&lt;span style="color: #007700"&gt;());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;var_dump&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$stas&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getIncrementedAge&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;3&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Результат&lt;br /&gt;&lt;code&gt;&lt;br /&gt;php test.php &lt;br /&gt;string(2) "cd"&lt;br /&gt;int(12)&lt;br /&gt;string(4) "stas"&lt;br /&gt;int(23)&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1048953210779926423?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1048953210779926423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1048953210779926423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1048953210779926423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1048953210779926423'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2010/03/php53.html' title='Забавный php5.3'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7265713765343750334</id><published>2010-03-22T08:41:00.001-07:00</published><updated>2010-03-22T08:46:55.148-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php-долбоавторы'/><title type='text'>Так документировать код нельзя.</title><content type='html'>Сижу поздним ночером, хочу спать, нужно чуть изменить функционал модуля. Открываю, вижу&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; &lt;br /&gt;/**&lt;br /&gt;  * Returns the data model based on the primary key given in the GET variable.&lt;br /&gt;  * If the data model is not found, an HTTP exception will be raised.&lt;br /&gt;  * @param integer the primary key value. Defaults to null, meaning using the 'id' GET variable&lt;br /&gt;  */&lt;br /&gt; public function loadUser()&lt;br /&gt; {&lt;br /&gt;  if($this-&gt;_model===null)&lt;br /&gt;  {&lt;br /&gt;   if(Yii::app()-&gt;user-&gt;id)&lt;br /&gt;    $this-&gt;_model=User::model()-&gt;findbyPk(Yii::app()-&gt;user-&gt;id);&lt;br /&gt;   if($this-&gt;_model===null)&lt;br /&gt;    $this-&gt;redirect(Yii::app()-&gt;controller-&gt;module-&gt;loginUrl);&lt;br /&gt;  }&lt;br /&gt;  return $this-&gt;_model;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Ну и как это вообще называется? Я бы убивал таких документаторов. &lt;br /&gt;&lt;br /&gt;Где exception? &lt;br /&gt;Где GET? &lt;br /&gt;Где param int ? &lt;br /&gt;Что return ? &lt;br /&gt;&lt;br /&gt;Я уже промолчу про шедевральный &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Yii::app()-&gt;controller-&gt;module-&gt;loginUrl&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В корне поменявший поведение по умолчанию.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S. &lt;br /&gt;&lt;br /&gt;Понял откуда это взялось, эту документацию и метод yii генерирует в контроллере  при использовании crud  команды. (За исключением @param int )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7265713765343750334?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7265713765343750334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7265713765343750334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7265713765343750334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7265713765343750334'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2010/03/blog-post.html' title='Так документировать код нельзя.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-8951196020489569862</id><published>2009-08-16T21:08:00.000-07:00</published><updated>2009-08-16T21:10:43.101-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Gtk-Message: Failed to load module "globalmenu-gnome"</title><content type='html'>Некогда пробовал gnome-globalmenu, не понравилось, убил. &lt;br /&gt;&lt;br /&gt;С тех пор ловил при каждом запуске gtk приложения такую бяку:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Gtk-Message: Failed to load module "globalmenu-gnome": libglobalmenu-gnome.so: cannot open shared object file: No such file or directory&lt;br /&gt;и&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Решение тут: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://magnus-k-karlsson.blogspot.com/2009/02/remove-gnome-globalmenu.html"&gt;http://magnus-k-karlsson.blogspot.com/2009/02/remove-gnome-globalmenu.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вкратце в gconf-editor /apps/gnome-settings-daemon/gtk-modules задизейблить ( убрать галочку) globalmenu-gnome&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-8951196020489569862?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/8951196020489569862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=8951196020489569862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8951196020489569862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8951196020489569862'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2009/08/gnome-globalmenu.html' title='Gtk-Message: Failed to load module &quot;globalmenu-gnome&quot;'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-5524325449524756289</id><published>2009-08-12T22:07:00.000-07:00</published><updated>2009-08-12T22:47:36.193-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>php и циклические ссылки</title><content type='html'>После отпуска пришлось оптимизировать небольшое консольное приложение, работающее в рамках нашего проекта, исходное время выполнения было 2.5 часа. &lt;br /&gt;&lt;br /&gt;После беглого просмотра кода и сопутствущих классов, время было оптимизировано до минуты. Проблема была в том, что   первоначальная версия была написана не очень хорошим программистом, а остальные ленились кардинально переписать приложение. Также для генерации отчета в циклах использовались классы, которые на многие действия совершали запросы к базе, а вызывались эти методы внутри цикла. Использовав упреждающее чтение всех необходимых данных в память и минимальную модификацию классов для использования получанных данных в случае их наличия, приложение стало работать гораздо быстрее (1 минута из которой 40 секунд происходит чтение всех необхомых данных в память, 20 секунд непосредственно обработка и запись данных). Ну а количество запросов сократилось до 3-х вместо 3*количество записей в обрабатываемых таблицах. &lt;br /&gt;&lt;br /&gt;В идеале можно было бы обойтись без преобразования данных в коде, выполнив его на уровне базы данных, но от этого пришлось отказаться из за того, что на боевой базе данных, подобного рода запросы иногда вызывали проблемы в репликации данных. &lt;br /&gt;&lt;br /&gt;Вторая проблема которую я увидел это то, что это приложение было по сути копипастом из одного часто используемого метода, в итоге переписав и то, и другое, я получил скрипт, который исправно работал, но в 10 раз медленнее минутной версии, но обладал замечательным свойством, что был готов для повторного использования, стал более гибким, и читать его стало проще. Однако возникла следующая проблема, уже на 200.000 записях он стал отжирать 4 гб памяти и операционной системе это очень не нравилось, впрочем как и мне. Почистив код, я убедился что происходит утечка памяти. &lt;br /&gt;&lt;br /&gt;Вот код, который вольно воспроизводит сложившуюся ситуацию. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt; &lt;br /&gt;&lt;?php&lt;br /&gt;&lt;br /&gt;class DataSource // в моем случае это был итератор по таблице базы данных &lt;br /&gt;{&lt;br /&gt; protected $_counter = 1; &lt;br /&gt; public function next()&lt;br /&gt; {&lt;br /&gt;  return array('xxxxxxxxxxxxxxxxxxxxxxxx' =&gt; 'yyyyyyyyyyyyyyyyyyy'); &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class UserHelper // род классов, для получения данных связаных с пользователями, но выходящих за рамки этого объекта&lt;br /&gt;{&lt;br /&gt; protected $_u = null; &lt;br /&gt; public function __construct(User $u)&lt;br /&gt; {&lt;br /&gt;  $this-&gt;_user = $u; &lt;br /&gt; }&lt;br /&gt; public function getSomeData()&lt;br /&gt; {&lt;br /&gt;  return array('x' =&gt; 10, 'y' =&gt; 20); &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public function __desctruct()&lt;br /&gt; {&lt;br /&gt;  $this-&gt;_u = null;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class User &lt;br /&gt;{&lt;br /&gt; protected $_dbRow = array(); &lt;br /&gt; protected $_helpers = array(); &lt;br /&gt; public function __construct(array $data ) &lt;br /&gt; {&lt;br /&gt;  $this-&gt;_dbRow = $data; &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public function getHelper()// получения хелпера, в данном случае ситуация урезана до одного&lt;br /&gt; {&lt;br /&gt;  if ( isset($this-&gt;_helpers['x'] ) ) &lt;br /&gt;   return $this-&gt;_helpers['x']; &lt;br /&gt;  return $this-&gt;_helpers['x'] = new UserHelper($this); // автор посчитал это полезным &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public function __destruct()&lt;br /&gt; {&lt;br /&gt;  unset($this-&gt;_dbRow); &lt;br /&gt;  $this-&gt;_helpers['x'] = null; &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// кусок кода вызвавший проблему. &lt;br /&gt;$ds = new DataSource(); &lt;br /&gt;for($i= 1; $i++; $i&lt; 1000000) &lt;br /&gt;{&lt;br /&gt; $u = new User($ds-&gt;next()); // загружаем пользвоателя напрямую по данным&lt;br /&gt; $helper = $u-&gt;getHelper(); &lt;br /&gt; $helperData = $helper-&gt;getSomeData();// получаем данные хелпера&lt;br /&gt; //делаем то что нужно с данными&lt;br /&gt; unset($helperData); &lt;br /&gt;        unset($helper); &lt;br /&gt; unset($u); // думаем что убили пользователя&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;При запуске этого скрипта и запущенном топе, видим как память отжирается без остановки. &lt;br /&gt;&lt;br /&gt;Проблема в циклических ссылках. Не охота это описывать можно почитать &lt;a href="http://blog.akhkharu.ru/2009/07/php.html"&gt;ТУТ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;После того как я нашел утечку. Код переписан в таком виде&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ds = new DataSource(); // получаем итератор&lt;br /&gt;for($i= 1; $i++; $i&lt; 1000000) &lt;br /&gt;{&lt;br /&gt; $u = new User($ds-&gt;next()); // загружаем пользвоателя напрямую по данным&lt;br /&gt; //$helper = $u-&gt;getHelper();  вот тут и была проблема. &lt;br /&gt;        $helper = new UserHelper($u); &lt;br /&gt; $helperData = $helper-&gt;getSomeData();// получаем данные хелпера&lt;br /&gt; //делаем то что нужно с данными&lt;br /&gt;        unset($helper); &lt;br /&gt; unset($u); // думаем что убили пользователя. &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;После этого, время выполнения приложения стало чуть больше 20 % от первоначальной минуты, ну а раход памяти стал фиксированным ~300-400 MB&lt;br /&gt;&lt;br /&gt;Вывод: Консольные приложения обычно пишутся для больших объемов данных, и то что прощается при выполнении маложивущей веб-страницы, выходит боком при долгой работе приложения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-5524325449524756289?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/5524325449524756289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=5524325449524756289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5524325449524756289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5524325449524756289'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2009/08/php.html' title='php и циклические ссылки'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-3239245849469509597</id><published>2009-05-03T19:05:00.000-07:00</published><updated>2009-05-03T19:26:57.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Неоднозначности PHP</title><content type='html'>За три месяца молчания накопились "прелести" PHP  с которыми можно и поделиться. &lt;br /&gt;Меньше слов больше консоли. &lt;br /&gt;&lt;br /&gt;Для начала кусок докуметации о сравнении массивов&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Для массивов $a и $b &lt;br /&gt;$a == $b   Равно   TRUE в случае, если $a и $b содержат одни и те же элементы&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;php -a &lt;br /&gt;php &gt; $a = array(1,2);&lt;br /&gt;php &gt; $b = array(2,1);&lt;br /&gt;php &gt; var_dump($a == $b);&lt;br /&gt;bool(false)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Для меня это оказалось несколько неожиданным изходя из документации, однако следущий код неожиданно вносит ясность. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;php &gt; class X {};&lt;br /&gt;php &gt; $x1 = new X();&lt;br /&gt;php &gt; $x2 = new X();&lt;br /&gt;php &gt; $a = array($x1, $x2);&lt;br /&gt;php &gt; $b = array($x2, $x1);&lt;br /&gt;php &gt; var_dump($a == $b);&lt;br /&gt;bool(true)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В принципе все это объяснимо, во втором примере используются ссылки, и объекты (суть элементы)  действительно одни и теже, в первом же используются числа и думаю во внутреннем представлении это все таки разные эелементы, но отсуствие концепции в целом все таки настораживает. &lt;br /&gt;&lt;br /&gt;Еще замечательный пример с которым я столкнулся в практике. &lt;br /&gt;&lt;br /&gt;Во время рефакторинга, значение метода в случае ошибки (false) было изменено на (null) проверку понятное дело я забыл сделать, а по дефолту метод возвращал объект известного типа. В итоге код вида &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;php &gt; $x = $object-&gt;getResult();&lt;br /&gt;php &gt; $x-&gt;value = 'smth';&lt;br /&gt;php &gt; $x-&gt;callSmth();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Возвращал Fatal error: Call to undefined method stdClass::callSmth() in php ... некоторое время я тупил удивляясь откуда взялся stdClass, (и сразу пошел в неверном направлении, греша на serialize при работе с memcache), однако быстро понял что дело не в этом. &lt;br /&gt;&lt;br /&gt;Ниже код который все объясняет, и столкнувшись с этим теперь понятно что виновато преобразование типов. Ну и конечно же я, который не проверил возвращаемое значение. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;php &gt; $a = null&lt;br /&gt;php &gt; ;&lt;br /&gt;php &gt; $a-&gt;x = 10;&lt;br /&gt;php &gt; var_dump($a);&lt;br /&gt;object(stdClass)#1 (1) {&lt;br /&gt;  ["x"]=&gt;&lt;br /&gt;  int(10)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Если провести тесты не с null, а скажем с boolean значением, получем тот же результат, по идее все логично, тогда код со строкой, должен отрабатывать эквивалентно. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;php &gt; $b = 'sdf';&lt;br /&gt;php &gt; $b-&gt;x = 10;&lt;br /&gt;&lt;br /&gt;Warning: Attempt to assign property of non-object in php shell code on line 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Все страньше и страньше. Ну и на последок забавный код. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;php &gt; class null{};#я думал так нельзя&lt;br /&gt;php &gt; class false extends null{};# можно и так &lt;br /&gt;php &gt; class true extends false { function __toString() { return 'false'; } } ; #это уже понятно&lt;br /&gt;php &gt; $false = 'false';&lt;br /&gt;php &gt; $true = new True();&lt;br /&gt;php &gt; var_dump($$true);#ну это уже стеб. &lt;br /&gt;string(5) "false"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Велики возможности PHP !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-3239245849469509597?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/3239245849469509597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=3239245849469509597' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3239245849469509597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3239245849469509597'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2009/05/php.html' title='Неоднозначности PHP'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-6634361833229854409</id><published>2009-02-20T08:46:00.000-08:00</published><updated>2009-02-20T09:24:13.061-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Размышения о php, его применении</title><content type='html'>Статья о моих метаниях в процессе разработки и правильном использовании PHP. &lt;br /&gt;&lt;br /&gt;Для затравки желательно прочитать &lt;a href="http://handynotes.ru/2008/09/10-principov-php.html"&gt;статью 10 принципов PHP специалистов&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В принципе ничего нового. Теперь что думаю я. &lt;br /&gt;&lt;br /&gt;1. PHP медленный язык.  И не надо рассказывать о том, что большую часть времени занимает работа с базой, мемкэшем, файлами и т.д. &lt;br /&gt;Даже вызов PHP фукнции достаточно дорогая операция. А уж подключения библиотеки - кошмар.  &lt;br /&gt;&lt;br /&gt;2. Фреймворки - монструозны, а если это сложить с пунктом один, получаем, что они еще и тормозны по определению. &lt;br /&gt;&lt;br /&gt;Исходя из этих требования, а также под угрозами бешеных нагрузок я участвовал в написании проекта, который был минималистичен в плане порождения сущностей. На удобстве  и скорости разработки это мало сказалось, т..к была изобретен минимальный фундамент (велосипед), который не давал скатиться в написание портянок. Зато время генерации при небольшой и средней нагрузках было 0.01-0.03 сек. Но т.к. администратор выбрал распределённую фс, это выразилось в подскакивании времени генерации до 0.1 сек. &lt;br /&gt;&lt;br /&gt;В ходе этого я выяснил. &lt;br /&gt;&lt;br /&gt;3. Проблемы описанные в пп 1,2 неприятны, но решаемы, в основном кэшированием и настройками серверов, или отказом от PHP. &lt;br /&gt;&lt;br /&gt;Скажем так, оптимизация веб-сервера (отключение модулей апача, extensions php) дало прирост 10-20%,  (смена апача на lighttpd +fcgi) дало прирост еще на 30%. Я бы не смог настолько оптимизировать код по всему проекту. &lt;br /&gt;&lt;br /&gt;Затем оказалось что нагрузки миф, политика партии поменялась, и нам нужно внедрять кучу странной логики, во главе встало удобство поддержки проекта, которая в свою очередь требует другого подхода к разработке. &lt;br /&gt;&lt;br /&gt;В итоге я ударяюсь (контролируемо) в другую крайность, в правильную разработку. Т.е. играемся с проектированием на всю катушку. Начинаем смотреть в сторону ОРМ уже в качестве необходимости. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;Прошло время я наигрался и  тем, и с другим. Сразу условлюсь что проект я предлагал делать на java, но руководство выбрало php по понятным всем причинам. &lt;br /&gt;&lt;br /&gt;А теперь пример, который просто меня убил. &lt;br /&gt;&lt;br /&gt;Задача : написать ладдерную систему для неких игр. Грубо говоря чем с более крутым человеком ты играешь, тем больше очков ты получишь, тем выше будет твой рейтинг. &lt;br /&gt;&lt;br /&gt;Итак, есть игрушки, которые потенциально кидают много запросов. Есть рейтинг игроков который нужно пересчитывать по определенным формулам. &lt;br /&gt;&lt;br /&gt;Реализация на php: &lt;br /&gt;&lt;br /&gt;скрипт сохранения результатов, пишет их в файл. В ночное время, результаты пересчитываются, сбрасывается кэш. При просмотре результатов, страница кэшируется на сутки. Получилось дешево ( в плане ресурсов), недорого. Это решение было написано нормально, но из-за кучи модификаций ее стало трудно поддерживать, причем не по причине кривости кода, а по причине сложной логики вокруг него. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Реализация на python: &lt;br /&gt;&lt;br /&gt;Twisted server, который в памяти хранит пользователей, отсортированных по результатам. При новых результатах, пользователь удаляется из отсортированного листа, ему начисляется новый скоринг, и он вставляется в список. Сам сервер по xmlrpc умеет отдавать результаты - веб серверу. &lt;br /&gt;Веб сервер работает на старом движке, вместо запросов к базе - запросы к xmlrpc-server. &lt;br /&gt;&lt;br /&gt;Реализация - быстрее чем на php(по времени разработки и отладки), скорость работы - выше, удобство использования - выше. &lt;br /&gt;&lt;br /&gt;Самый большой плюс, система работает online!&lt;br /&gt;&lt;br /&gt;Из недостатков - новая сложность системы в виде нового сервера. &lt;br /&gt;&lt;br /&gt;Конечно, можно было бы написать такой сервер и на PHP, но не думаю чтобы мы добились его нормальной работы за приемлемое для нас время. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Также могу привести еще несколько подобных вещей. В общем мое мнение ниша PHP - это все-таки fron-end, который отображает информацию от кучи разнородных сервисов, где собственно и будет реализована вся логика.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-6634361833229854409?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/6634361833229854409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=6634361833229854409' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6634361833229854409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6634361833229854409'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2009/02/php.html' title='Размышения о php, его применении'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-3204978782930683466</id><published>2009-02-08T22:57:00.000-08:00</published><updated>2009-02-08T23:21:27.530-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHPUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='DBUnit'/><title type='text'>PHPUnit, DBUnit, тестирование или Class PHPUnit_Extensions_Database_TestCase could not be found</title><content type='html'>Пытаюсь внедрять тестирование, т.к. перед проектом изначально были поставлены одни жесткие требования, и за время его реализации политика партии поменялась настолько, что важнее становится легкость поддержки и надежность продукта, чем производительность. &lt;br /&gt;&lt;br /&gt;Вместе с внедрением тестирования, пытаюсь при необходимости покрывать тестами более старые участки кода. В качестве framework был выбран PHPUnit за интеграцию с Zend Studio + некоторые приятные вещи. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В процессе написания тестов возникла необходимость в инструменте для работы с fixtures + тестирования изменений в базе данных, DBUnit как extension к PHPUnit подошел замечательно. &lt;br /&gt;&lt;br /&gt;Далее грустная история о нескольких часах дебага. И об ошибке "Class PHPUnit_Extensions_Database_TestCase could not be found"&lt;br /&gt;&lt;br /&gt;1. Изначально был тест XXX_Test &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;require_once 'PHPUnit/Framework/TestCase.php';&lt;br /&gt;class XXX_Test extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt; public function testSmth()&lt;br /&gt; {&lt;br /&gt;  $this-&gt;assertTrue(true); &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Файл назван xxxTest.php&lt;br /&gt;&lt;br /&gt;За некоторое время работы с phpunit я отвык пользоваться формой запуска &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$phpunit TestClassName path/to/test/file.php&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;И пишу просто &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$phpunit path/xxxTest.php&lt;br /&gt;PHPUnit 3.3.10 by Sebastian Bergmann.&lt;br /&gt;&lt;br /&gt;..&lt;br /&gt;&lt;br /&gt;Time: 0 seconds&lt;br /&gt;&lt;br /&gt;OK (1 test, 1 assertion)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Т.е. все хорошо, мой класс несколько шире, и мне хочется тестировать его на основе PHPUnit_Extensions_Database_TestCase, для чего пользуюсь туториалом &lt;a href="http://www.ds-o.com/archives/63-PHPUnit-Database-Extension-DBUnit-Port.html"&gt;отсюда&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В итоге класс становится таким. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;require_once 'PHPUnit/Extensions/Database/TestCase.php';&lt;br /&gt;class XXX_Test extends PHPUnit_Extensions_Database_TestCase&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; protected function getConnection()&lt;br /&gt; {&lt;br /&gt;  return null;// $this-&gt;createDefaultDBConnection($this-&gt;_dbObject,'sqlite'); &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; protected function getDataSet()&lt;br /&gt; {&lt;br /&gt;  return '';//$this-&gt;createFlatXMLDataSet('path/to/fixtures/dummy.xml');&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function testSmth()&lt;br /&gt; {&lt;br /&gt;  $this-&gt;assertTrue(true);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Функции коннекта и загрузки данных, преднамеренно реализованы криво. &lt;br /&gt;&lt;br /&gt;Запускаем. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$phpunit path/xxxTest.php&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;О***ваем&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;PHPUnit 3.3.10 by Sebastian Bergmann.&lt;br /&gt;&lt;br /&gt;Class PHPUnit_Extensions_Database_TestCase could not be found in /var/www/toox.com.lottery/core/classes/db/query/Rapid_Db_Query_IteratorTest.php&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Я повяз в дебаге на пару часов, т.к. это был мой первый опыт работы с DBUnit + также приведенный пример сильно упрощен по сравнению с тем файлом, с которым я работал. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В итоге оказалось, что при работе с DBUnit обязательно использовать полную форму запуска phpunit &lt;br /&gt;&lt;br /&gt;Т.е. при запуске нужно было указать имя тестируемого класса. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$phpunit XXX_Test path/xxxTest.php&lt;br /&gt;&lt;br /&gt;PHPUnit 3.3.10 by Sebastian Bergmann.&lt;br /&gt;&lt;br /&gt;E&lt;br /&gt;&lt;br /&gt;Time: 0 seconds&lt;br /&gt;&lt;br /&gt;There was 1 error:&lt;br /&gt;&lt;br /&gt;1) testSmth(XXX_Test)&lt;br /&gt;Argument 1 passed to PHPUnit_Extensions_Database_DefaultTester::__construct() must implement interface PHPUnit_Extensions_Database_DB_IDatabaseConnection, null given, called in /usr/share/php/PHPUnit/Extensions/Database/TestCase.php on line 146 and defined&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Т.е. теперь уже посыпались человеческие ошибки, которые говорят что я не реализовал необходимый для работы интерфейс. Ну оно и понятно...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-3204978782930683466?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/3204978782930683466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=3204978782930683466' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3204978782930683466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3204978782930683466'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2009/02/phpunit-dbunit-class.html' title='PHPUnit, DBUnit, тестирование или Class PHPUnit_Extensions_Database_TestCase could not be found'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-2434984914845040241</id><published>2009-02-05T19:29:00.000-08:00</published><updated>2009-02-05T19:39:14.439-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='repository'/><category scheme='http://www.blogger.com/atom/ns#' term='svnadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>перенос svn репозитория.</title><content type='html'>Три раза менял vds. Было жалко свой svn репозиторий, и озадачился вопросом его переноса на другую машину. &lt;br /&gt;Оказалось все просто как всегда. &lt;br /&gt;&lt;br /&gt;Сначала скидываем репозиторий в dump file. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#svnadmin dump /home/svn/repo/ &gt; /tmp/mysvn.dump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Т.е. svnadmin dump выплевывает dumpfile-formatted строки в stdout, который перенаправляется в наш файл /tmp/mysvn.dump&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;На другой машине &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#scp login@host:/tmp/mysvn.dump /tmp&lt;br /&gt;#svnadmin create /new/repo/path&lt;br /&gt;#svnadmin load /new/repo/path &lt; /tmp/mysvn.dump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Копируем при помощи scp файл себе локально, затем создаем новый репозиторий при помощи svnadmin create , далее командой svnadmin load, которая как раз читает из stdin dumpfile-formatted строки, переносим сдампленные данные. &lt;br /&gt;&lt;br /&gt;Хотя в последнее время все чаще смотрю на mercurial, и даже начинаю использовать, пока нравится, но интересно посмотреть на это когда буду работать не один. В случае hg перенос был бы обычным бранчем, который он умеет делать через ssh (Как я думаю, могу и ошибаться).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-2434984914845040241?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/2434984914845040241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=2434984914845040241' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2434984914845040241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2434984914845040241'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2009/02/svn.html' title='перенос svn репозитория.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7831507646866580200</id><published>2009-01-28T22:11:00.000-08:00</published><updated>2009-01-28T22:20:41.509-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='port'/><category scheme='http://www.blogger.com/atom/ns#' term='svn+ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>svn+ssh на другом порту</title><content type='html'>поломали хостинг по моей безалаберности, сижу перенастраиваю. &lt;br /&gt;&lt;br /&gt;В работе часто использую svn, т.к. по сути он на 90% single мне хватает svn+ssh протокола (++ в том, что не нужно ничего настраивать). &lt;br /&gt;&lt;br /&gt;Перенес sshd порт с дефолтного на другой, svn+ssh://host:port/path не работает. Решение нашел достаточно быстро вот &lt;a href="http://blog.unixstyle.ru/index.php?/archives/11-Subversion_over_SSH_na_nestandartnom_portu.html"&gt;здесь&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ниже копипаст одного из решений. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;Существуют два варианта решения. Первый - добавить в конфигурационный файл ~/.subversion/config строчки:&lt;br /&gt;[tunnels]&lt;br /&gt;tunnel_name = /usr/bin/ssh -p port&lt;br /&gt;&lt;br /&gt;И в дальнейшем использовать вызов svn co snv+tunnel_name://hostname/path. Например,&lt;br /&gt;[tunnels]&lt;br /&gt;foobar = /usr/bin/ssh -p 8022&lt;br /&gt;&lt;br /&gt;Тогда вызов будет выглядеть как:&lt;br /&gt;svn co snv+foobar://hostname/path&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7831507646866580200?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7831507646866580200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7831507646866580200' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7831507646866580200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7831507646866580200'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2009/01/svnssh.html' title='svn+ssh на другом порту'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-2171216517626805170</id><published>2009-01-26T21:23:00.000-08:00</published><updated>2011-11-30T21:41:11.373-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='sed'/><title type='text'>Perl как замена sed, или perl однострочные скрипты.</title><content type='html'>Был занят, занимался самообразованием, т.к. почувствовал что погряз в  одном и том же. Расширяю кругозор, узнаю новое, к чему то стремлюсь, это очень интересно и занимает очень много времени. &lt;br /&gt;&lt;br /&gt;Теперь по делу. &lt;br /&gt;&lt;br /&gt;Операционная система у меня ubuntu ++ постоянно по работе приходится сидеть в консоли. Очень часто возникает задача, быстро по шаблону поменять что то в файле. Ответ на вскидку = sed. В свое время я читал про него, но понял что при помощи perl могу делать то же самое. Прошло время, sed я забыл совершенно, а вот perl тоже стал забываться, и я постоянно не могу найти пример однострочных скриптов. &lt;br /&gt;&lt;br /&gt;Теперь по порядку. &lt;br /&gt;&lt;br /&gt;Задача: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Дано. &lt;br /&gt;Есть файл xx.txt в котором лежат числа от 1-го до 5-ти, каждое число, новая строка. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd@laptop:~/data/tmp$ cat xx.xx&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Нужно: &lt;br /&gt;&lt;br /&gt;Хочется заменить все вхождения строки 3 на что то свое, пусть это будет строка "hello" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Решение:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd@laptop:~/data/tmp$ perl -ig -ne 's/3/hello/;print $_; ' xx.xx&lt;br /&gt;cd@laptop:~/data/tmp$ cat xx.xx&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;hello&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Или &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd@laptop:~/data/tmp$ perl -ig -pe 's/3/hello/; ' xx.xx&lt;br /&gt;cd@laptop:~/data/tmp$ cat xx.xx&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;hello&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;cd@cd-acer:~/data/tmp$ ls *g&lt;br /&gt;9.jpg  xx.xxg&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Объяснение. &lt;br /&gt;&lt;br /&gt;perl позволяет запускать однострочные скрипты, не создавая файл с кодом скрипта. &lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd@laptop:~/data/tmp$ perl -e 'print "test\n"'&lt;br /&gt;test&lt;br /&gt;cd@laptop:~/data/tmp$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;За это отвечает опция -e после которой идет код для выполнения. &lt;br /&gt;&lt;br /&gt;Однострочные скрипты, после кода, могут принимать параметром файл, а также, можно заставить выполнять код указанный -e для каждой строки. &lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd@laptop:~/data/tmp$ perl -ne "print ;" xx.xx&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;hello&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Т.е. в данном случае мы попросили перл, выполнить распечатку строки по умолчанию, а т.к. была указана опция -n то это команда применялась к каждой строке файла xx.xx, т.е. получили cat&lt;br /&gt;&lt;br /&gt;Также существует параметр -p, который после выполнения кода распечатывает строку. Т.е. логично что команда вида &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;perl -ne "dosmth; print $_;" file&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;будет аналогична &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;perl -pe "dosmth" file&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ну а теперь завершая. Мы добились того, что можем выполнять любые операции над каждой строкой в файле, и печатать это в stdout, однако первоначальная постановка задачи, звучала как замена строк в файле на лету. Именно для этого и существует опция -i&lt;br /&gt;&lt;br /&gt;т.е. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;perl -i -pe "dosmth" file &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;выполнит код dosmth для отдельно взятой строки и заменит ее в указанном файле. &lt;br /&gt;&lt;br /&gt;опция -i может принимать необязательный параметр, и тогда, скрипт перед началом работы сделает backup копию файла &lt;br /&gt;&lt;br /&gt;Пример. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd@laptop:~/data/tmp/1$ perl -ibak -ne 'print;' 1.txt &lt;br /&gt;cd@laptop:~/data/tmp/1$ ls &lt;br /&gt;1.txt  1.txtbak&lt;br /&gt;cd@laptop:~/data/tmp/1$ cat 1.txt&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;cdlaptop:~/data/tmp/1$ cat 1.txtbak &lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;cd@laptop:~/data/tmp/1$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь само решение должно быть понятно, а также понятно почему я привел два варианта.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Upd:&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Появилась простая задачка, в одном из конфигов нужно увеличивать на единицу одно из значений, пусть условно это будет номер билда. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Возьмем пример файла конфига &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;cd:$ cat config &lt;br /&gt;Key1 Value2&lt;br /&gt;build=projectname.005&lt;br /&gt;one more line&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Допустим нам нужно получить такой же конфиг но с build=projectnam.006&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;perl -i -pe  's/(projectname\.)(\d+)/sprintf("%s%03d", $1, $2+1)/e' config &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Пояснения. &lt;br /&gt;&lt;br /&gt;-i -pe объяснялось выше. &lt;br /&gt;&lt;br /&gt;Что изменилось? В конце регулярного выражения добавился флаг e, который означает что правая часть выражения будет выполняться как код perl и только после выполнения результат подставится для замены. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Можно было бы конечно сделать что то вроде&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;perl -pe  's/(projectname\.)(\d+)/$1 . ($2+1)/e' config&lt;br /&gt;Key1 Value2&lt;br /&gt;build=projectname.6&lt;br /&gt;one more line&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;! опция -i была убрана, я хотел чтобы файл не менялся, а результат был в output&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Как видим пропадают два ведущих нуля, именно поэтому была использована функция sprintf&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-2171216517626805170?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/2171216517626805170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=2171216517626805170' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2171216517626805170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2171216517626805170'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2009/01/perl-sed-perl.html' title='Perl как замена sed, или perl однострочные скрипты.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-792910958449767625</id><published>2008-11-14T03:11:00.001-08:00</published><updated>2008-11-14T03:11:19.756-08:00</updated><title type='text'>Эмоции</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Завал и на работе и дома. &lt;br /&gt;&lt;br /&gt;Пока второй день прут эмоции. &lt;br /&gt;&lt;br /&gt;twisted - жжот!!!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-792910958449767625?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/792910958449767625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=792910958449767625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/792910958449767625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/792910958449767625'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/11/blog-post.html' title='Эмоции'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-9140683339910452224</id><published>2008-10-28T09:49:00.000-07:00</published><updated>2009-02-05T19:41:03.389-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forms'/><category scheme='http://www.blogger.com/atom/ns#' term='exception'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>PHP, Excetion облегчают обработку форм.  Ностальгия блин.</title><content type='html'>Теряя время в интернете на поиск интересных блогов связанных или с php или с веб программированием так, чтобы я мог увидеть в этом что то интересное для себя, набрел на блог &lt;a href="http://alt-f4.ru"&gt;http://alt-f4.ru&lt;/a&gt;. Поковырял статьи, особо сказать ничего не могу, кто-то делиться своим опытом, просто времена когда мне бы его опыт пригодился бы остались в прошлом. &lt;br /&gt;&lt;br /&gt;В итоге набрел на статью "Авторизация посетителей на PHP", в которой по шагам, потихонечку написано как кому чего делать чтобы у него было счастье. &lt;br /&gt;&lt;br /&gt;Ну а теперь самое интересное, наткнулся на код обработки формы. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?&lt;br /&gt;if ($_SERVER['REQUEST_METHOD'] == 'POST') {&lt;br /&gt;   $rLogin = trim($_POST['rLogin']);&lt;br /&gt;   $rPass  = trim($_POST['rPass']);&lt;br /&gt;   $rPass2 = trim($_POST['rPass2']);&lt;br /&gt;   $rEmail = trim($_POST['rEmail']);&lt;br /&gt;   if ($rLogin == '') {&lt;br /&gt;      die("Поле 'Логин' не заполнено\n");&lt;br /&gt;   // Логин может состоять из букв, цифр и подчеркивания&lt;br /&gt;   }elseif (!preg_match("/^\w{3,}$/", $rLogin)) {&lt;br /&gt;      die("В поле 'Логин' введены недопустимые символы\n");&lt;br /&gt;   }&lt;br /&gt;   if ($rEmail == '') {&lt;br /&gt;      die("Поле 'E-mail' не заполнено\n");&lt;br /&gt;   // Проверяем e-mail на корректность&lt;br /&gt;   }elseif (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)) {&lt;br /&gt;      die("Указанный 'E-mail' имеет недопустимый формат\n");&lt;br /&gt;   }&lt;br /&gt;   if ($rPass == '' || $rPass2 == '') {&lt;br /&gt;      die("Поле 'Пароль' не заполнено\n");&lt;br /&gt;   }elseif($rPass !== $rPass2) {&lt;br /&gt;      die("Поля 'Пароль' и 'Повтор пароля' не совпадают\n");&lt;br /&gt;   // Пароль может состоять из букв, цифр и подчеркивания&lt;br /&gt;   }elseif(!preg_match("/^\w{3,}$/", $rPass)) {&lt;br /&gt;      die("В поле 'Пароль' введены недопустимые символы\n");&lt;br /&gt;   }&lt;br /&gt;   // В базе данных у нас будет храниться md5-хеш пароля&lt;br /&gt;   $mdPassword = md5($rPass);&lt;br /&gt;   // А также временная метка (зачем - позже)&lt;br /&gt;   $time = time();&lt;br /&gt;   // Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль)&lt;br /&gt;   $link = mysql_connect('localhost', $dbuser, $dbpass);&lt;br /&gt;   if (!$link) {&lt;br /&gt;      die("Не могу соединиться с базой данных");&lt;br /&gt;   }else {&lt;br /&gt;      // Выбираем базу данных&lt;br /&gt;      mysql_select_db('authorize', $link);&lt;br /&gt;      // Записываем в базу (не используем addslashes - экранировать нечего)&lt;br /&gt;      mysql_query("INSERT INTO users (login, pass, email, timestamp)&lt;br /&gt;                   VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link);&lt;br /&gt;      if (mysql_error($link) != "") {&lt;br /&gt;         die("Пользователь с таким логином уже существует, выберите другой\n");&lt;br /&gt;      }&lt;br /&gt;      echo "Юзер добавлен\n";&lt;br /&gt;      mysql_close($link);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В общем, про использование прямых запросов сразу молчим, но что наглядно, форма из 4-х полей, а уже 3 вложенных условия, да и вообще логика не простая. &lt;br /&gt;&lt;br /&gt;Самое что главное, если заменить способы валидации, то к своему стыду получается что я писал подобный код не так давно. И только натолкнувшись на совсем сумасшедшую логику, прикрутил Exceptions и чудо&lt;br /&gt;1. Объем кода уменьшился в два раза. &lt;br /&gt;2. Количество вложенных условий сократилось до 1-го&lt;br /&gt;3. Ошибки стало проще выводить. &lt;br /&gt;&lt;br /&gt;Ну и применительно к данному коду, применя преобразовния не меняющие логику получим что то вроде. . &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;class DbException extends Exception {};&lt;br /&gt;&lt;br /&gt;if ($_SERVER['REQUEST_METHOD'] != 'POST')&lt;br /&gt;{&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt;  foreach ( array('rLogin' =&gt; 'Логин' , 'rPass' =&gt; 'Пароль' , 'rPass2' =&gt; 'Повторный пароль', 'rEmail' =&gt; 'E-mail' ) as $val =&gt; $fieldName)&lt;br /&gt;  { &lt;br /&gt;   if ( isset($_POST[$val] ) ) &lt;br /&gt;       $val = trim($_POST[$val]); //create rLogin, rPass, rPass2, rEmail variables &lt;br /&gt;   else &lt;br /&gt;       throw new Exception("Поле $fieldName не заполнено\n");&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  if (!preg_match("/^\w{3,}$/", $rLogin)) &lt;br /&gt;      throw new Exception("В поле 'Логин' введены недопустимые символы\n");&lt;br /&gt;      &lt;br /&gt;  if (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)) &lt;br /&gt;      throw new Exception("В поле 'Логин' введены недопустимые символы\n");&lt;br /&gt;      &lt;br /&gt;  if($rPass !== $rPass2) &lt;br /&gt;      throw new Exception("Поля 'Пароль' и 'Повтор пароля' не совпадаютn");&lt;br /&gt;      &lt;br /&gt;  if(!preg_match("/^\w{3,}$/", $rPass)) &lt;br /&gt;      throw new Exception("В поле 'Пароль' введены недопустимые символы\n");&lt;br /&gt;      &lt;br /&gt;  $mdPassword = md5($rPass);&lt;br /&gt;  // А также временная метка (зачем - позже)&lt;br /&gt;  $time = time();&lt;br /&gt;  // Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль)&lt;br /&gt;  $link = mysql_connect('localhost', $dbuser, $dbpass);&lt;br /&gt;  if (!$link)&lt;br /&gt;      throw new DbException("Не могу соединиться с базой данных");&lt;br /&gt;  // Выбираем базу данных&lt;br /&gt;  mysql_select_db('authorize', $link);&lt;br /&gt;  // Записываем в базу (не используем addslashes - экранировать нечего)&lt;br /&gt;  mysql_query("INSERT INTO users (login, pass, email, timestamp)  VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link);// поле timestamp можно сделать чтобы по умолчанию подставлялось базой, такие вещи лучше перекладывать на базу. &lt;br /&gt;  if (mysql_error($link) != "")&lt;br /&gt;      DbException("Пользователь с таким логином уже существует, выберите другой\n");&lt;br /&gt;  echo "Юзер добавлен\n";&lt;br /&gt;      mysql_close($link);&lt;br /&gt; }&lt;br /&gt; catch (DbException $e)&lt;br /&gt; {&lt;br /&gt;     die("DB ERROR: " . $e-&gt;getMEssage()); &lt;br /&gt; }&lt;br /&gt; catch ( Exception $e) &lt;br /&gt; {&lt;br /&gt;     die( "Form validation error: ". $e-&gt;getMessage()); &lt;br /&gt; }&lt;br /&gt;} &lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;В итоге. &lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Кода меньше. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Читается проще. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Вывод ошибок в одном месте. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;При необходимости разные виды ошибок ловим в нужных нам местах. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-9140683339910452224?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/9140683339910452224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=9140683339910452224' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/9140683339910452224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/9140683339910452224'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/php-excetion.html' title='PHP, Excetion облегчают обработку форм.  Ностальгия блин.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1335689964238013864</id><published>2008-10-27T11:09:00.000-07:00</published><updated>2008-10-27T21:00:28.364-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='забавно'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='Дерьмо'/><category scheme='http://www.blogger.com/atom/ns#' term='shit'/><title type='text'>Как я люблю php, или танцы с false</title><content type='html'>Еще одна из кривостей моего любимого php. Писать не буду, приведу пример интерактивного шела. &lt;br /&gt;Cюрприз #2&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;pcd@cd-laptop:~$ php -a&lt;br /&gt;php &gt; error_reporting(E_ALL);// устанавливаем уровень ошибок, &lt;br /&gt;&lt;br /&gt;php &gt; $ar = array(); // создаем массив&lt;br /&gt;php &gt; var_dump($ar[1]); // обращаемся к несуществующему индексу&lt;br /&gt;Notice: Undefined offset:  1 in php shell code on line 1//логично&lt;br /&gt;NULL&lt;br /&gt;&lt;br /&gt;php &gt; $null = null;// создаем переменну инициализированную нулом&lt;br /&gt;php &gt; var_dump($null[1]);// обращаемся к нему как к массиву&lt;br /&gt;NULL// ошибки нет, это уже не совсем логично, т.к. &lt;br /&gt;&lt;br /&gt;php &gt; var_dump( (array) $null ) ; // при преобразовании нула в массив&lt;br /&gt;array(0) {&lt;br /&gt;}// получается пустой массив без индекса 1. &lt;br /&gt;//ну хотя можно как то объяснить, т.к. null это особый тип.  &lt;br /&gt;&lt;br /&gt;php &gt; $false = false;// boolean переменная, инициализированная ложью&lt;br /&gt;php &gt; var_dump($false[1]);// обращение как к массиву при этом к несуществующиему индексу&lt;br /&gt;NULL// а как объяснить это????&lt;br /&gt;&lt;br /&gt;php &gt; var_dump((array)$false);// смотрим как ложь приводится к массиву. &lt;br /&gt;array(1) {&lt;br /&gt;  [0]=&gt;&lt;br /&gt;  bool(false)&lt;br /&gt;}// этого я  не ожидал&lt;br /&gt;// но  тогда получается что ... &lt;br /&gt;&lt;br /&gt;php &gt; echo (array) false ? 'true' : 'false';&lt;br /&gt;true // ну а это просто п***ц, сколько человек могло попасть так!&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ну и навскидку надуманный пример, похожий на правду. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt; cd@cd-laptop:~$ cat ex1.php &lt;br /&gt;&lt;?php&lt;br /&gt;class ExampleDb&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * This function return list of users as array, &lt;br /&gt;  * empty array on failure&lt;br /&gt;  */&lt;br /&gt; public function findAll($testValue = true)&lt;br /&gt; {&lt;br /&gt;  return (array ) $this-&gt;_fetch_all($testValue);  &lt;br /&gt; }&lt;br /&gt; protected function _fetch_all($testValue = true ) &lt;br /&gt; {&lt;br /&gt;  $goodData = array(&lt;br /&gt;   0 =&gt; array(&lt;br /&gt;    'name' =&gt; 'vasya',&lt;br /&gt;    'pass' =&gt; 'oyamd5withsolt',&lt;br /&gt;   ),&lt;br /&gt;   1 =&gt; array(&lt;br /&gt;    'name' =&gt; 'vasay',&lt;br /&gt;    'pass' =&gt; 'oyamd5withsolt2',&lt;br /&gt;   ),&lt;br /&gt;  );&lt;br /&gt;  try &lt;br /&gt;  {&lt;br /&gt;   ;//do smth&lt;br /&gt;  }&lt;br /&gt;  catch (Exception $e)&lt;br /&gt;  {&lt;br /&gt;    return false; //strange architector&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  $retValue = $testValue ? $goodData : false; &lt;br /&gt;  var_dump($retValue); &lt;br /&gt;  return $retValue; &lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$ob = new ExampleDb();&lt;br /&gt;$users = $ob-&gt;findAll(false);// error happens !&lt;br /&gt;&lt;br /&gt;//strange dev&lt;br /&gt;if ( isset($users[0]) ) &lt;br /&gt; echo "You win! Your prize 10000k euros from dev salary!"; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;cd@cd-laptop:~$ php ex1.php &lt;br /&gt;(bool)false // мы видим что была ошибка &lt;br /&gt;You win! Your prize 10000k euros from dev salary!cd@cd-laptop:~$  &lt;br /&gt;// но тем не менее кто то выйграл. &lt;br /&gt;//Ну что теперь 10 лет работаем на еду?&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1335689964238013864?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1335689964238013864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1335689964238013864' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1335689964238013864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1335689964238013864'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/php-false.html' title='Как я люблю php, или танцы с false'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-5301946750493744659</id><published>2008-10-26T09:31:00.000-07:00</published><updated>2008-10-26T09:39:44.069-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='trac'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><title type='text'>Update старых записей.</title><content type='html'>Обновил &lt;a href="http://zadoev.blogspot.com/2008/10/trac-macros.html"&gt;пост&lt;/a&gt; о создании макроса в trac. (Чуть-чуть причесал код, заменив формирование html вместо строк теперь использую genshi.builder.tag&lt;br /&gt;&lt;br /&gt;Также настройки доступа к базе, скрипт получает теперь из конфига трака. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Обновил &lt;a href="http://zadoev.blogspot.com/2008/01/ssh_25.html"&gt;пост&lt;/a&gt; об авторизации по ssh без пароля, оказывается некоторые вещи которые я делал руками делаются одной командой :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-5301946750493744659?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/5301946750493744659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=5301946750493744659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5301946750493744659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5301946750493744659'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/update.html' title='Update старых записей.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1808277084469346194</id><published>2008-10-24T23:21:00.000-07:00</published><updated>2008-10-24T23:36:33.456-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='pdo'/><title type='text'>PHP, PDO, веселье при наследовании и включенной опции persistent connect</title><content type='html'>За что я люблю PHP? &lt;br /&gt;&lt;br /&gt;За то что это глобально и надежно. Ну какой еще другой язык может мне в пятницу утром сломать мозг. &lt;br /&gt;&lt;br /&gt;Этой статьей открою растянутый список статей в которых опишу подводные камни удобно предоставленные PHP нашей команде. &lt;br /&gt;&lt;br /&gt;Cюрприз #1&lt;br /&gt;&lt;br /&gt;В проекте есть класс DB, отнаследованный от PDO. Было обнаружено неадекватное поведение объектов. 3 часа ломания мозга дали следующий тестовой код воспроизводящий проблему. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;КОму интересно, попробуйте угадать результат&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;ini_set ( 'display_errors', 'on' );&lt;br /&gt;error_reporting ( E_ALL );&lt;br /&gt;&lt;br /&gt;class MyDB extends PDO {&lt;br /&gt; public $connectionId = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MyFactory {&lt;br /&gt;&lt;br /&gt; protected static $_storage = array ();&lt;br /&gt; &lt;br /&gt; static public function get($id) {&lt;br /&gt;  if ( isset ( self::$_storage[$id] ))&lt;br /&gt;   return self::$_storage[$id];&lt;br /&gt;   &lt;br /&gt;  self::$_storage[$id] = new MyDB ( 'mysql:host=127.0.0.1;dbname=toox2;', 'root', '123', array (PDO::ATTR_PERSISTENT =&gt; true ) );&lt;br /&gt;  self::$_storage[$id]-&gt;connectionId = $id;&lt;br /&gt;  return self::$_storage[$id];&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$db1 = MyFactory::get( 1 );&lt;br /&gt;$db2 = MyFactory::get( 2 );&lt;br /&gt;&lt;br /&gt;var_dump( $db1 );&lt;br /&gt;var_dump( $db2 );&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ну а для тех кто думал ровно как и я что в результате  $dbq-&gt;connectionId и $db2-&gt;connectionId буду разными привожу код &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;cd@cd-laptop:~/tmp/php-tests$ php test.php &lt;br /&gt;object(MyDB)#1 (1) {&lt;br /&gt;  ["connectionId"]=&gt;&lt;br /&gt;  int(2)&lt;br /&gt;}&lt;br /&gt;object(MyDB)#2 (1) {&lt;br /&gt;  ["connectionId"]=&gt;&lt;br /&gt;  int(2)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Проблема в &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;array (PDO::ATTR_PERSISTENT =&gt; true )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Если его убрать, то поведение становится ожидаемым, но однако, почему persistent connect ломает ооп в пхп :) &lt;br /&gt;&lt;br /&gt;А ну и на закуску, хотя из приведенного кода выше это видно&lt;br /&gt;&lt;br /&gt;var_dump($db1 === $db2) === false&lt;br /&gt;&lt;br /&gt;Кому интересно&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;cd@cd-laptop:~/tmp/php-tests$ php -v&lt;br /&gt;PHP 5.2.4-2ubuntu5.3 with Suhosin-Patch 0.9.6.2 (cli) (built: Jul 23 2008 06:44:49) &lt;br /&gt;Copyright (c) 1997-2007 The PHP Group&lt;br /&gt;Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;На slackware товарищ воспроизводил проблему также.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1808277084469346194?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1808277084469346194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1808277084469346194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1808277084469346194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1808277084469346194'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/php-pdo-persistent-connect.html' title='PHP, PDO, веселье при наследовании и включенной опции persistent connect'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1311505625002740050</id><published>2008-10-22T10:37:00.001-07:00</published><updated>2008-10-24T23:12:06.943-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='memcache'/><title type='text'>memcache namespace php? выход похоже найден</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Наткнулся на. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/memcached-tag/"&gt;http://code.google.com/p/memcached-tag/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Проект содержит патч к серверу memcached и патч к php-memcached расширению. В патче добавлен следующий функционал. &lt;br /&gt;&lt;br /&gt;Есть таги. (Пространство имен) &lt;br /&gt;Ключ можно привязать к тагу &lt;br /&gt;tag_add tag key&lt;br /&gt;&lt;br /&gt;Все ключи относящиеся к одному тагу можно махом грохнуть&lt;br /&gt;tag_del tag&lt;br /&gt;&lt;br /&gt;Если у тага не остается ни одного ключа, он убивается автоматически.&lt;br /&gt;&lt;br /&gt;То что нужно, пойду собирать и пропихивать чтобы нам его в тестовом режиме начали ставить. &lt;br /&gt;/me очень рад :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update Сбт Окт 25 00:49:01 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Радость оказалась преждевременной. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt; 1. Скачать, пропатчить, собрать не вызвало проблем хоть и не делал этого ни разу. Единственное пришлость переобозвать папку. &lt;br /&gt; 2. Заявленный функционал работает. &lt;br /&gt; 3. Проверил жалобы, не нашел, но на сайте проекта висит баг от May 02, 2008   &lt;a href="http://code.google.com/p/memcached-tag/issues/detail?id=1"&gt;http://code.google.com/p/memcached-tag/issues/detail?id=1&lt;/a&gt;  и за полгода до сих пор не поправлен. &lt;br /&gt; 4. Баг был мной повторен. &lt;br /&gt; 5. Сей код был отдан на растерзание нашему cpp отделу, квалификация товарищей сомнений не вызвает. &lt;br /&gt; Резюме. Посоветовавшись с cpp отделом, решили что чем использовать эту поделку, они нам предоставят свою реализацию. &lt;br /&gt;&lt;br /&gt; Жду, думаю несколько месяцев до тестов. &lt;br /&gt;&lt;br /&gt; В качестве вариантов находили несколько реализаций на java. По отзывам товарищей все эти реализации медленнее memcached, из за обилия разных финтифлюшек, где namespaces самая мелкая финтифлюшка. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1311505625002740050?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1311505625002740050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1311505625002740050' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1311505625002740050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1311505625002740050'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/memcache-namespace-php.html' title='memcache namespace php? выход похоже найден'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-3209059372912926810</id><published>2008-10-22T10:21:00.001-07:00</published><updated>2008-10-26T09:34:44.517-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='trac'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='macro'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Пример создания trac macros</title><content type='html'>Cтавим trac (на примере debian)&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;sudo apt-get install trac&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Подготавливаем папку для тестов&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;cd@cd-laptop: cd&lt;br /&gt;cd@cd-laptop: mkdir tests&lt;br /&gt;cd@cd-laptop: cd tests&lt;br /&gt;cd@cd-laptop: mkdir tracdir&lt;br /&gt;cd@cd-laptop: trac-admin tracdir initenv&lt;br /&gt;жмем энтер :)&lt;br /&gt;Запускаем через stand-along&lt;br /&gt;cd@cd-laptop: tracd /home/cd/tests/tracdir --port 8888&lt;br /&gt;cd@cd-laptop: firefox http://127.0.0.1:8888/tracdir&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/zadoev/SP9de8X16gI/AAAAAAAAAD4/nKBf8EyTVbY/%5BUNSET%5D.png?imgmax=800"/&gt;&lt;br /&gt;&lt;br /&gt;Трак установлен, для тестирования нам такого хватит. &lt;br /&gt;&lt;br /&gt;останавливаем&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;cd@cd-laptop: Ctrl+C &lt;br /&gt;cd@cd-laptop:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Создаем macro Hello&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;cd plugins&lt;br /&gt;touch Hello.py&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Содержимое Hello.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;from trac.core import *&lt;br /&gt;from trac.wiki.macros import WikiMacroBase&lt;br /&gt;from trac.util import escape&lt;br /&gt;&lt;br /&gt;__all__ = ['HelloMacro']&lt;br /&gt;&lt;br /&gt;class HelloMacro(WikiMacroBase):&lt;br /&gt;    def expand_macro(self,formatter, name, args):&lt;br /&gt;         return "Hello %s" % args or '&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Использование. Внутри тикета или wiki напишите&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;[[Hello(cd)]]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Результат &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Hello cd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Т.е. для написания минимального макроса, достаточно отнаследоваться от WikiMacroBase, реализовать один метод, возращающий html. &lt;br /&gt;&lt;br /&gt;Пример ставшего для меня полезным макроса. &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;  1 from trac.core import *&lt;br /&gt;  2 from trac.wiki.macros import WikiMacroBase&lt;br /&gt;  3 from trac.util import escape&lt;br /&gt;  4 from trac.util.html import escape,html,plaintext&lt;br /&gt;  5 from genshi.builder import tag&lt;br /&gt;  6 &lt;br /&gt;  7 &lt;br /&gt;  8 __all__ = ['XxxMacro']&lt;br /&gt;  9 &lt;br /&gt; 10 &lt;br /&gt; 11 class RwebtableMacro(WikiMacroBase):&lt;br /&gt; 12         """&lt;br /&gt; 13         Show table schema&lt;br /&gt; 14         {{{&lt;br /&gt; 15         [[Xxx(tablename)]]&lt;br /&gt; 16         }}}&lt;br /&gt; 17 &lt;br /&gt; 18         """&lt;br /&gt; 19         def expand_macro(self, formatter, name, args):&lt;br /&gt; 20                 # args will be `None` if the macro is called without parenthesis.&lt;br /&gt; 21                 table = args or ''&lt;br /&gt; 22                 if not table :&lt;br /&gt; 23                         return 'no table specified'&lt;br /&gt; 24 &lt;br /&gt; 25                 import MySQLdb&lt;br /&gt; 26                 user = self.env.config.get('cddb', 'user')#требует опции в trac.ini секции [cddb]&lt;br /&gt; 27                 host = self.env.config.get('cddb', 'host')&lt;br /&gt; 28                 passwd = self.env.config.get('cddb', 'passwd')&lt;br /&gt; 29                 dbname = self.env.config.get('cddb', 'dbname')&lt;br /&gt; 30                 db = MySQLdb.connect(user=user, host=host, passwd=passwd, db=dbname)&lt;br /&gt; 31                 cursor = db.cursor()&lt;br /&gt; 32                 sql = "DESCRIBE %s" % table&lt;br /&gt; 33                 cursor.execute(sql)&lt;br /&gt; 34                 table = tag.table(border=1)&lt;br /&gt; 35                 table.append(tag.tr( tag.th('Field'), tag.th('Type') , tag.th('Null') , tag.th('Key') , tag.th('Default'), tag.th('Extra') ) )&lt;br /&gt; 36                 res =  cursor.fetchall()&lt;br /&gt; 37                 for row in res :&lt;br /&gt; 38                         tr = tag.tr()&lt;br /&gt; 39                         for i in row :&lt;br /&gt; 40                                  tr.append(tag.td(str(i)) )&lt;br /&gt; 41                         table.append(tr)&lt;br /&gt; 42                 return str(table)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Например &lt;br /&gt;[[Xxxtable(country)]]&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt; Null&lt;/th&gt;&lt;th&gt; Key  &lt;/th&gt;&lt;th&gt;Default      &lt;/th&gt;&lt;th&gt;        Extra &lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;country_id&lt;/td&gt;&lt;td&gt;int(11)&lt;/td&gt;&lt;td&gt;NO&lt;/td&gt;&lt;td&gt;PRI&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;auto_increment&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;iso&lt;/td&gt;&lt;td&gt;varchar(3)&lt;/td&gt;&lt;td&gt;YES&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;varchar(50)&lt;/td&gt;&lt;td&gt;YES&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-3209059372912926810?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/3209059372912926810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=3209059372912926810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3209059372912926810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3209059372912926810'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/trac-macros.html' title='Пример создания trac macros'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/zadoev/SP9de8X16gI/AAAAAAAAAD4/nKBf8EyTVbY/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-5394778700418510845</id><published>2008-10-21T10:52:00.001-07:00</published><updated>2008-10-21T11:30:09.933-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='trac'/><category scheme='http://www.blogger.com/atom/ns#' term='hook'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>hook pre-commit в svn. Реализация на питоне.</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Задача : при коммите в svn, хочется чего то делать, например закрывать тикет в trac. &lt;br /&gt;&lt;br /&gt;Для этого в svn есть механизм хуков. Далее по шагам как я это делал я.&lt;br /&gt;&lt;br /&gt;Создание репозитория, начальный checkout &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;директория для тестов&lt;br /&gt;cd@cd-laptop:~$ mkdir tests&lt;br /&gt;cd@cd-laptop:~$ cd tests&lt;br /&gt;директория для репозитория&lt;br /&gt;cd@cd-laptop:~/tests$ mkdir repo&lt;br /&gt;создание репозитория&lt;br /&gt;cd@cd-laptop:~/tests$ svnadmin create repo&lt;br /&gt;директория для чекаутов&lt;br /&gt;cd@cd-laptop:~/tests$ mkdir checkout-dir&lt;br /&gt;первый чекаут&lt;br /&gt;cd@cd-laptop:~/tests$ svn checkout file:///home/cd/tests/repo/ checkout-dir/&lt;br /&gt;Checked out revision 0.&lt;br /&gt;создаем, добавляем, коммитим файл. &lt;br /&gt;cd@cd-laptop:~/tests$ touch checkout-dir/x.txt&lt;br /&gt;cd@cd-laptop:~/tests$ svn add checkout-dir/x.txt &lt;br /&gt;checkout-dir/x.txt&lt;br /&gt;cd@cd-laptop:~/tests$ svn ci checkout-dir/x.txt -m'first commit'&lt;br /&gt;Adding  checkout-dir/x.txt&lt;br /&gt;Transmitting file data .&lt;br /&gt;Committed revision 1.&lt;br /&gt;cd@cd-laptop:~/tests$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Репозиторий создан, для теста сделал один коммит.&lt;br /&gt;&lt;br /&gt;Теперь собственно создаем хук.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Заходим в папку репозитоия&lt;br /&gt;cd@cd-laptop:~/tests$ cd repo/&lt;br /&gt;смотрим чего есть. Интересует папка hooks&lt;br /&gt;cd@cd-laptop:~/tests/repo$ ls&lt;br /&gt;conf  dav  db  format  hooks  locks  README.txt&lt;br /&gt;cd@cd-laptop:~/tests/repo$ cd hooks/&lt;br /&gt;Заходим в нее. &lt;br /&gt;cd@cd-laptop:~/tests/repo/hooks$ ls&lt;br /&gt;post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl&lt;br /&gt;post-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl&lt;br /&gt;Создаем, делаем права на запуск, заполняем&lt;br /&gt;cd@cd-laptop:~/tests/repo/hooks$ touch pre-commit&lt;br /&gt;cd@cd-laptop:~/tests/repo/hooks$ chmod +x pre-commit&lt;br /&gt;cd@cd-laptop:~/tests/repo/hooks$ cat &gt; pre-commit&lt;br /&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;sys.stderr.write('Test error')&lt;br /&gt;sys.exit(1)&lt;br /&gt;&lt;br /&gt;cd@cd-laptop:~/tests/repo/hooks$ cd ../..&lt;br /&gt;cd@cd-laptop:~/tests$ echo '1' &gt;&gt; checkout-dir/x.txt &lt;br /&gt;cd@cd-laptop:~/tests$ svn ci checkout-dir/x.txt -m'test'&lt;br /&gt;Sending        checkout-dir/x.txt&lt;br /&gt;Transmitting file data .svn: Commit failed (details follow):&lt;br /&gt;svn: 'pre-commit' hook failed with error output:&lt;br /&gt;Test error&lt;br /&gt;cd@cd-laptop:~/tests$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В папке репозитория в подпапке hoosk был создан файл pre-commit и ему поставлены права на запуск. &lt;br /&gt;Теперь когда свн его увидит, будет запускать после получения данных непосредственно перед коммитом. При коде возврата не 0, commit не пройдет. Собственно сам скрипт можно писать на любом скриптовом языке, главное чтобы была шибанг строка. &lt;br /&gt;&lt;br /&gt;Подробнее о коде pre-commit&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;#пишем в STDERR&lt;br /&gt;sys.stderr.write('Test error')&lt;br /&gt;#выходим с кодом возврата 1 &lt;br /&gt;sys.exit(1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Т.е. сам хук создан, он запускается, не дает нам сделать коммит, теперь хочется уметь работать с информацией, которая приходит перед коммитом. Нас интересуют такие вещи как&lt;br /&gt; автор, &lt;br /&gt; текст комментария,&lt;br /&gt; содержимое файлов и т.д. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Здесь я маленько не разобрался, в основном попробовал методом тыка, поэтому напишу как я понял. Не факт что будет совсем правильно, но пользуясь тем как я это понял, у меня чего то получается делать.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для получения информации о предстоящем коммите, полезна утилита &lt;br /&gt;&lt;br /&gt;svnlook &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Формат запуска следующий&lt;br /&gt;&lt;br /&gt;svnlook SUBCOMMAND REPOS_PATH [ARGS &amp;amp; OPTIONS ...]&lt;br /&gt;&lt;br /&gt;Где subcommand одна из следующего списка&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   author&lt;br /&gt;   cat&lt;br /&gt;   changed&lt;br /&gt;   date&lt;br /&gt;   diff&lt;br /&gt;   dirs-changed&lt;br /&gt;   help (?, h)&lt;br /&gt;   history&lt;br /&gt;   info&lt;br /&gt;   lock&lt;br /&gt;   log&lt;br /&gt;   propget (pget, pg)&lt;br /&gt;   proplist (plist, pl)&lt;br /&gt;   tree&lt;br /&gt;   uuid&lt;br /&gt;   youngest&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REPOS_PATH путь до репозитория, аргументы и опции могут зависеть от subcommand нас интересуют только две &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;any subcommand which takes the '--revision' and '--transaction'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;--revision понятно, выполняет subcommand по определенной ревизии&lt;br /&gt;--transaction интереснее, выполняет subcommand по транзакции, с этим я не разобрался, но понял так. &lt;br /&gt;&lt;br /&gt;Если взглянуть на pre-commit.tpl (файл созданные в репозитории по умолчанию) увидим там следующее&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;REPOS="$1"&lt;br /&gt;TXN="$2"&lt;br /&gt;&lt;br /&gt;# Make sure that the log message contains some text.&lt;br /&gt;SVNLOOK=/usr/bin/svnlook&lt;br /&gt;$SVNLOOK log -t "$TXN" "$REPOS" |  grep "[a-zA-Z0-9]" &gt; /dev/null || exit 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Где видно что параметр --transaction он же -t используется с переменной TXN, которая является вторым аргументом передаваемым в pre-commit. Т.е. эта штука у нас на руках, и svnlook умеет с ней работать. &lt;br /&gt;&lt;br /&gt;Итак при обработке pre-commit у нас нет ревизии (мы ее создаем ) зато есть транзакция. Теперь что мы можем из этого получить. &lt;br /&gt;&lt;br /&gt;Пример pre-commit который выводит автора и не дает закоммититься. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;#обертка над svnlook для запуска любой команды&lt;br /&gt;def cmd_out(subcommand, transaction, repo) : &lt;br /&gt;    cmd = '/usr/local/bin/svnlook %s -t "%s" "%s"' % (subcommand, transaction, repo) &lt;br /&gt;    str  = os.popen(cmd, 'r').read() &lt;br /&gt;    return str.strip('\n')  &lt;br /&gt;&lt;br /&gt;#вызвает нашу оберку, для подкомманды author &lt;br /&gt;def look_author(transaction, repo) : &lt;br /&gt;    return  cmd_out('author', transaction, repo ) &lt;br /&gt;&lt;br /&gt;#читаем репозиторий, транзакцию&lt;br /&gt;repos = sys.argv[1]&lt;br /&gt;txn = sys.argv[2]&lt;br /&gt;&lt;br /&gt;#получаем автора&lt;br /&gt;author = look_author(txn, repos)&lt;br /&gt;&lt;br /&gt;#пишем автора в STDERR&lt;br /&gt;sys.stderr.write('Author :%s:' % author )  &lt;br /&gt;#выходим с ошибкой, запрещая коммит&lt;br /&gt;sys.exit(1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Единственное нужно указать правильный путь до svnlook&lt;br /&gt;&lt;br /&gt;Ну теперь собственно все. Т.е. при помощи svnlook можно получить очень много информации о предстоящем коммите :) &lt;br /&gt;&lt;br /&gt;Например получения текста лога для данного коммита.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;def look_log (transaction, repo) : &lt;br /&gt;    return cmd_out('log', transaction, repo)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;И так далее. Ну а наконец, скрипт который просматривает лог, ищет в определенном формате номер тикета, и пишет комментарий в трак к тикету, и закрывает тикет по необходимости. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#!/usr/bin/python &lt;br /&gt;&lt;br /&gt;import sys, os, string, re&lt;br /&gt;&lt;br /&gt;# return true or false if this passed string is a valid comment&lt;br /&gt;&lt;br /&gt;php_devs = ('xx', 'xxx', 'yy', 'yyy', 'zz', 'zzz') #only for this dev's rules allowed&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def cmd_out(subcommand, transaction, repo) : &lt;br /&gt;    cmd = '/usr/local/bin/svnlook %s -t "%s" "%s"' % (subcommand, transaction, repo) &lt;br /&gt;    str  = os.popen(cmd, 'r').read() &lt;br /&gt;    return str.strip('\n')  &lt;br /&gt;&lt;br /&gt;def look_info(trans, repo) : &lt;br /&gt;    return cmd_out('tree --full-paths', trans, repo) &lt;br /&gt;&lt;br /&gt;def look_author(transaction, repo) : &lt;br /&gt;    return  cmd_out('author', transaction, repo ) &lt;br /&gt;&lt;br /&gt;def look_log (transaction, repo) : &lt;br /&gt;    return cmd_out('log', transaction, repo)&lt;br /&gt;&lt;br /&gt;def check_comments(comment ):#return ticket id if find in comment&lt;br /&gt;    p = re.compile('\s*ticket:(\d+)(:close)?\s+(.*)$', re.MULTILINE)&lt;br /&gt;    res = p.match(comment)&lt;br /&gt;    try:&lt;br /&gt;        ticket_id = res.group(1)&lt;br /&gt;    except: &lt;br /&gt;        ticket_id = None&lt;br /&gt;    return ticket_id&lt;br /&gt;&lt;br /&gt;def need_close(comment) : #i know it's copy paste, but i had choice, write into blog, or rewrite it ... &lt;br /&gt;    p = re.compile('\s*ticket:(\d+)(:(close))?\s+(.*)$', re.MULTILINE) &lt;br /&gt;    res = p.match(comment)&lt;br /&gt;    try: &lt;br /&gt;        is_closed = res.group(3)&lt;br /&gt;    except:&lt;br /&gt;        is_closed = ''&lt;br /&gt;    return  is_closed == 'close' &lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;def update_ticket_in_trac(ticket, author, comment, data  ) : &lt;br /&gt;    import xmlrpclib&lt;br /&gt;    s = xmlrpclib.ServerProxy('http://tracuser:tracpast@domain.com:port/path_to_Trac/login/xmlrpc')#create service&lt;br /&gt;    try: &lt;br /&gt;        ticketInfo = s.ticket.get(ticket)#try get ticket&lt;br /&gt;        status = ticketInfo[3]['status'] &lt;br /&gt;        if status == 'closed' : &lt;br /&gt;            sys.stderr.write("Ticket already closed, need reopen it first !!!") &lt;br /&gt;            return 1 &lt;br /&gt;    except: #can catch here protocol err, it mean no rights &lt;br /&gt;        sys.stderr.write("No ticket found in trac for id %s" % ticket ) &lt;br /&gt;        return 1 &lt;br /&gt;    comment = comment.replace(':close','')&lt;br /&gt;    s.ticket.update(ticket,comment.replace("ticket:%s" % ticket, '%s killed himself with message : \n' % author , data) , data) &lt;br /&gt;    return 0 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def main(repos, txn):&lt;br /&gt;    comment = look_log(txn, repos) &lt;br /&gt;    author = look_author(txn,repos)&lt;br /&gt;    if not (author in php_devs)  : &lt;br /&gt;        return 0 &lt;br /&gt;    ticket = check_comments(comment)&lt;br /&gt;    if ticket == None  :  &lt;br /&gt;        sys.stderr.write("\nticket:num must be at the comment begin where num is ticket id, if not exists create it please!")&lt;br /&gt; return 1&lt;br /&gt;    data = dict()&lt;br /&gt;    if ( need_close(comment) ) : &lt;br /&gt;        data['status'] = 'closed'&lt;br /&gt;    return update_ticket_in_truck(ticket, author,comment, data )&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    if len(sys.argv) &amp;lt; 3 : &lt;br /&gt;        sys.stderr.write("Usage: %s REPOS TXN\n" % (sys.argv[0]))&lt;br /&gt;    else:&lt;br /&gt;        sys.exit(main(sys.argv[1], sys.argv[2])) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-5394778700418510845?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/5394778700418510845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=5394778700418510845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5394778700418510845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5394778700418510845'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/hook-pre-commit-svn.html' title='hook pre-commit в svn. Реализация на питоне.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-56446046384652184</id><published>2008-10-17T10:12:00.001-07:00</published><updated>2008-10-17T10:18:55.280-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spl'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Php, не все так плохо как кажется на первый взгляд.</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;   С полгода назад, пришлось реализовать для удобства IArrayAccess. И только после реализации решил замерить насколько оно медленнее массива, и запомнилась мне следующая удивительная цифра. Что то на 10.000 итераций Объект реализовавший IArrayAccess был медленнее на десяток секунд. (На не сильно слабой машине). &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;   Решил сегодня это печальное событие задокументировать с цифрами.  Результат приятно удивил. &lt;br/&gt;&lt;br/&gt;Исходники &lt;br/&gt;array.php&lt;br/&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;error_reporting(E_ALL);&lt;br /&gt;$array = array(); &lt;br /&gt;&lt;br /&gt;for ( $k = 1; $k &lt; 10; $k++)&lt;br /&gt;{&lt;br /&gt; unset($array);&lt;br /&gt; $array = array(); &lt;br /&gt; &lt;br /&gt; for ($i = 0 ; $i &lt; 100000; $i++)&lt;br /&gt; {&lt;br /&gt;  $array[$i] = $i + $k;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;spl-array.php&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;class SplArrayTest implements ArrayAccess &lt;br /&gt;{&lt;br /&gt; protected $_data; &lt;br /&gt; &lt;br /&gt; public function __construct()&lt;br /&gt; {&lt;br /&gt;  $this-&gt;_data = array(); &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function offsetExists($offset)&lt;br /&gt; {&lt;br /&gt;  return isset($this-&gt;_data[$offset]); &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function  offsetGet($offset)&lt;br /&gt; {&lt;br /&gt;  return $this-&gt;_data[$offset];&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function offsetSet($offset, $value)&lt;br /&gt; {&lt;br /&gt;  $this-&gt;_data[$offset] = $value; &lt;br /&gt; }&lt;br /&gt; public function offsetUnset($offset) &lt;br /&gt; {&lt;br /&gt;  unset($this-&gt;_data[$offset]);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function __destruct()&lt;br /&gt; {&lt;br /&gt;  unset($this-&gt;_data);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$array = new SplArrayTest(); &lt;br /&gt;&lt;br /&gt;for ( $k = 1; $k &lt; 10; $k++)&lt;br /&gt;{&lt;br /&gt; unset($array);&lt;br /&gt; $array = new SplArrayTest(); &lt;br /&gt; &lt;br /&gt; for ($i = 0 ; $i &lt; 100000; $i++)&lt;br /&gt; {&lt;br /&gt;  $array[$i] = $i + $k;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;spl2-array.php&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;class SplArrayTest implements ArrayAccess &lt;br /&gt;{&lt;br /&gt; public function __construct()&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function offsetExists($offset)&lt;br /&gt; {&lt;br /&gt;  return isset($this-&gt;$offset); &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function  offsetGet($offset)&lt;br /&gt; {&lt;br /&gt;  return $this-&gt;$offset;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function offsetSet($offset, $value)&lt;br /&gt; {&lt;br /&gt;  $this-&gt;$offset = $value; &lt;br /&gt; }&lt;br /&gt; public function offsetUnset($offset) &lt;br /&gt; {&lt;br /&gt;  $this-&gt;$offset;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public function __destruct()&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$array = new SplArrayTest(); &lt;br /&gt;&lt;br /&gt;for ( $k = 1; $k &lt; 10; $k++)&lt;br /&gt;{&lt;br /&gt; unset($array);&lt;br /&gt; $array = new SplArrayTest(); &lt;br /&gt; &lt;br /&gt; for ($i = 0 ; $i &lt; 100000; $i++)&lt;br /&gt; {&lt;br /&gt;  $array[$i] = $i + $k;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;PHP 5.2.4-2ubuntu5.3  (2 ядра, системя с запущенными иксам, не сильно загружена) &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Запуск через time php array.php&lt;br/&gt;Среднее время выполнения - 1.6 секунды&lt;br/&gt;Среднее время выполнения при включенном xcache  - 1.3&lt;br/&gt;На нашем прод сервере + apc = 0.5 секунды &lt;br/&gt;&lt;br/&gt;Запуск через time php spl-array.php&lt;br/&gt;Среднее время выполнения - 3.9 секунды&lt;br/&gt;Среднее время выполнения при включенном xcache  - 3.72&lt;br/&gt;На нашем прод сервере + apc = 1.2 секунды &lt;br/&gt;&lt;br/&gt;Запуск через time php spl2-array.php&lt;br/&gt;Время выполнения 4.7 секунды&lt;br/&gt;Среднее время выполнения при включенном xcache  - 4.2&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Выводы. &lt;br/&gt;&lt;br/&gt;На 1.000.000 элементарных операций разница всего на 2-3 секунды. На моем ноуте. &lt;br/&gt;Разница в полсекунды на прод сервере. &lt;br/&gt;&lt;br/&gt;Для примера в zend framework по умолчанию  порядка 2.000-4.000 таких и не очень элементарных вызовов. &lt;br/&gt;В простейшей реализации страницы на limb &lt;br/&gt;10.000 и выше. (за счет их любимых тулкитов). &lt;br/&gt;&lt;br/&gt;Т.е. получается что для обычной страницы вы потеряете при активном использовании SPL IArrayAccess сотые доли секунды. Чем можно пренебрегать очень смело. &lt;br/&gt;&lt;br/&gt;В итоге бояться использовать SPL  я перестаю, хотя все равно на душе будет не спокойно. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-56446046384652184?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/56446046384652184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=56446046384652184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/56446046384652184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/56446046384652184'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/php.html' title='Php, не все так плохо как кажется на первый взгляд.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-3563338177159519132</id><published>2008-10-16T08:03:00.001-07:00</published><updated>2008-10-16T08:03:58.589-07:00</updated><title type='text'>сервера</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;  Долгое время не было времени ни на что. &lt;br/&gt;&lt;br/&gt;  Сначала провозился с переездом хостинга, настройкой веб серверов. Долго писать не охота. Поэтому вкратце. &lt;br/&gt;&lt;br/&gt; 1. Линух без свапа - говно. &lt;br/&gt; 2. FreeBsd на малых ресурсах - рулит. &lt;br/&gt; 3. Апач на малых ресурсах неадекватен. &lt;br/&gt; 4. lighthttpd - рулит :) &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Зато в перерыве устав нажимать ctrl +F для поиска в программе футбола, сваял. &lt;a href='http://tv.quicknotes.ru/'&gt;http://tv.quicknotes.ru/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-3563338177159519132?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/3563338177159519132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=3563338177159519132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3563338177159519132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3563338177159519132'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/10/blog-post.html' title='сервера'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-4809983746102088889</id><published>2008-09-29T12:14:00.001-07:00</published><updated>2008-09-29T12:14:58.048-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='fixtures'/><title type='text'>django fixtures использование</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Изучаю джанго. &lt;br/&gt;&lt;br/&gt;Понадобились fixtures. Полез в новую джанго-книжку, написано много, как использовать. А как их создавать непонятно. &lt;br/&gt;В итоге. &lt;br/&gt;&lt;br/&gt;Пусть есть модель page для ее есть админка, лежит в application yyy&lt;br/&gt;&lt;br/&gt;Я делал так. &lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;&lt;ol&gt;&lt;li&gt;Создал необходимые данные для этой модели через админку.&lt;/li&gt;&lt;li&gt;Перешел в директорию проекта набрал ./manage.py dumpdata --indent=2  yyy &amp;gt; ./data/fixtures/xxx.json&lt;/li&gt;&lt;li&gt;Прописал в settings.py FIXTURE_DIRS = (  PROJECT_ROOT + '/data/fixtures/',)&lt;/li&gt;&lt;li&gt;И уже при установке сначала ./manage syncdb&lt;/li&gt;&lt;li&gt;Затем ./manage.py loaddata xxx&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-4809983746102088889?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/4809983746102088889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=4809983746102088889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4809983746102088889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4809983746102088889'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/09/django-fixtures.html' title='django fixtures использование'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1194736955299972635</id><published>2008-09-23T10:16:00.001-07:00</published><updated>2008-09-23T10:18:42.528-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exception'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='trick'/><title type='text'>Конвертирование ошибок в exceptions.</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Задача &lt;br /&gt; Преобразовать все ошибки в исключения (exceptions) для более удобной их обработки.&lt;br /&gt;Решение подсмотрено на php.net в комментариях.&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;class My_Exception  extends Exception {&lt;br /&gt; public static function errorHandlerCallback($code, $string, $file, $line, $context) &lt;br /&gt; {&lt;br /&gt;  $e = new self($string, $code);&lt;br /&gt;  $e-&amp;gt;line = $line;&lt;br /&gt;  $e-&amp;gt;file = $file;&lt;br /&gt;  $e-&amp;gt;context = $context;&lt;br /&gt;  throw $e;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set_error_handler(array("My_Exception", "errorHandlerCallback"), E_ALL);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь практически все ошибки будут преобразованны в Exception. Теперь достаточно легко и непринужденно мы можем отлавливать ошибки php в одном месте, например&lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;&lt;br /&gt;// bla bla bla&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;   $controller-&amp;gt;dosmth();&lt;br /&gt;}&lt;br /&gt;catch( Controller_Wrong_Data_Exeption $e) &lt;br /&gt;{&lt;br /&gt;// do smth&lt;br /&gt;} &lt;br /&gt;catch ( My_Exception $e)&lt;br /&gt;{&lt;br /&gt;// we know it's php error &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Такой метод не ловит фаталы, а очень хочется. Где то встречал решение с использованием особенности ob_start, ob_flush, если найду завтра добавлю.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1194736955299972635?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1194736955299972635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1194736955299972635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1194736955299972635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1194736955299972635'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/09/exceptions.html' title='Конвертирование ошибок в exceptions.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7949329434901792567</id><published>2008-09-22T10:15:00.001-07:00</published><updated>2008-09-22T10:46:43.135-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inheritance'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='trick'/><title type='text'>Php, агрегация, псевдонаследование</title><content type='html'>Задача на примере. &lt;br /&gt; Есть класс View. Хочется создать класс Cache_View который будет агрегировать внутри себя объект класса $view, а внешне иметь такой же интерфейс как и класс view. &lt;br /&gt;&lt;br /&gt; Понятно что на это многие покрутят пальцем у виска, отправят учить ооп, и скажут что нибудь про наследование. Для остальных продолжу мысль. &lt;br /&gt;&lt;br /&gt;  Простейшая реализация  (наследование не подходит, нужно агрегировать)- агрегировать, и определить кучу методов вида &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;   public function xxx($param1,$param2)&lt;br /&gt;   {&lt;br /&gt;      return $this-&gt;agregatedObject-&gt;xxx($param1, $param2); &lt;br /&gt;   }&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Реализация где не придется реализовывать эту кучу методов. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;class A&lt;br /&gt;{&lt;br /&gt;  public function f1()&lt;br /&gt;  {&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class B&lt;br /&gt;{&lt;br /&gt;   protected $_a = null; &lt;br /&gt;   public function __construct(A $a) &lt;br /&gt;   {&lt;br /&gt;      $this-&gt;_a = $a; &lt;br /&gt;   } &lt;br /&gt;   public function  __call($function, $params)&lt;br /&gt;   {&lt;br /&gt;      return call_user_func_array(array(&amp;$this-&gt;_a, "A::$function"), $params );&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//как работает&lt;br /&gt;$a  = A();&lt;br /&gt;$b = B($a);&lt;br /&gt;&lt;br /&gt;$a-&gt;f1();&lt;br /&gt;$b-&gt;f1();// тоже самое что и строчкой выше. Произойдет вызов метода f1 объекта $a&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Если кому то еще интересно, ниже пример использования. &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;class View &lt;br /&gt;{&lt;br /&gt;  public function render($template)&lt;br /&gt;  {&lt;br /&gt;   //return html&lt;br /&gt;  }&lt;br /&gt;  public function f1()&lt;br /&gt;  {&lt;br /&gt;  }&lt;br /&gt;  //...&lt;br /&gt;  public function f120()&lt;br /&gt;  { &lt;br /&gt;  } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Cache_View &lt;br /&gt;{&lt;br /&gt;   protected $_view = null; &lt;br /&gt;   protected $_cache = null&lt;br /&gt;   public function setCache($cache) &lt;br /&gt;   { &lt;br /&gt;      $this-&gt;_cache = $cache; &lt;br /&gt;   } &lt;br /&gt;   public function __construct(View $v) &lt;br /&gt;   {&lt;br /&gt;      $this-&gt;_view = $v; &lt;br /&gt;   } &lt;br /&gt;   public function  __call($function, $params)&lt;br /&gt;   {&lt;br /&gt;      return call_user_func_array(array(&amp;$this-&gt;_view, "View::$function"), $params );&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function render($template)&lt;br /&gt;   {&lt;br /&gt;    if ( $this-&gt;_cache != null &amp;&amp; ! $this-&gt;_cache-&gt;mis($this-&gt;makeKey($template))// если объект кэша есть и в нем чего то лежит&lt;br /&gt;      return $this-&gt;_cache-&gt;get($this-&gt;makeKey($template));// то вернем закэшированные данные&lt;br /&gt;&lt;br /&gt;    $out = $this-&gt;_view-&gt;render($template);&lt;br /&gt;    if ( $this-&gt;_cache != null) &lt;br /&gt;      $this-&gt;_cache-&gt;set($this-&gt;makeKey($template), $out); &lt;br /&gt;    return $out; &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function makeKey($str)&lt;br /&gt;   {&lt;br /&gt;      retirm md5($str); &lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//примеры исползования&lt;br /&gt;&lt;br /&gt;$view  = View();&lt;br /&gt;$cache = Cache::create(Cache::File);&lt;br /&gt;$cachedView = Cached_View($view);&lt;br /&gt;$cachedView-&gt;setCache($cache): &lt;br /&gt;&lt;br /&gt;$view-&gt;test();&lt;br /&gt;$cachedView-&gt;test();// тоже самое что и строчкой выше. Вызов метода агрегированного класса&lt;br /&gt;$cachedView-&gt;render('splash.php'); // а вот здесь будет предприняты попытка заглянуть в кэш и вернуть закэшированные результаты, если их нет, то произойдет отработка обычного $view-&gt;render и результат положится в темплейт&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Пример реализации чего то похожего внешне на множественное наследование&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;&lt;br /&gt;class Base()&lt;br /&gt;{&lt;br /&gt;  public function base_function() {}; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class A&lt;br /&gt;{&lt;br /&gt;  public function f1()&lt;br /&gt;  {&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class B extends Base&lt;br /&gt;{&lt;br /&gt;   protected $_a = null; &lt;br /&gt;   public function __construct(A $a) &lt;br /&gt;   {&lt;br /&gt;      $this-&gt;_a = $a; &lt;br /&gt;   } &lt;br /&gt;   public function  __call($function, $params)&lt;br /&gt;   {&lt;br /&gt;      return call_user_func_array(array(&amp;$this-&gt;_a, "A::$function"), $params );// понятно что тут можно проверять наличичие метода поочереди у пула объектов, и вызывать их&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$a = new A();&lt;br /&gt;$b = new B($a);&lt;br /&gt;$b-&gt;base_function(); //ok child Base&lt;br /&gt;$b-&gt;f1(); // looks like child A&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7949329434901792567?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7949329434901792567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7949329434901792567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7949329434901792567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7949329434901792567'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/09/php_22.html' title='Php, агрегация, псевдонаследование'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7922973801048856049</id><published>2008-09-17T09:54:00.001-07:00</published><updated>2008-09-17T11:20:20.913-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='loggin'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Простые вещи, php</title><content type='html'>При работе с проектом хотелось не слишком много, просто отслеживать время выполнения скриптов, а также количество вызвов скриптов.&lt;br /&gt;   Простое решение -  в конце каждого скрипта ( у нас правда это один index.php)  пишется в файл uri + и время выполнения скрипта. &lt;br /&gt;&lt;br /&gt;  Однако выяснилось, что из за кусков кода вроде этого &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;header("Location: bla bla bla"); &lt;br /&gt;exit();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Некоторые вещи просто не ловятся. А очень хочется понять не в них ли вся проблема :) &lt;br /&gt;&lt;br /&gt;Решение оказалось простым. Использовать &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;register_shutdown_function('callback');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Например в нашем проекте есть класс Rapid в котором лежат жизненно необходимые нам вещи. &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;class Rapid&lt;br /&gt;{&lt;br /&gt;  //...&lt;br /&gt;  public static function quit()&lt;br /&gt;  {&lt;br /&gt;    //write to log&lt;br /&gt;  }&lt;br /&gt;  //..&lt;br /&gt;}&lt;br /&gt;// тут как раз регистрируем статическую функцию, как функцию по завершению&lt;br /&gt;register_shutdown_function(array('Rapid', 'quit'));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ньюанс&lt;/span&gt; : эта функция вызвается даже после php fatal error!&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd@cd-laptop:~/tmp$ cat 2.php &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;register_shutdown_function('quit'); &lt;br /&gt;echo 'start'; &lt;br /&gt;require_once('none.php'); // у меня нет файла, будет фатал. &lt;br /&gt;echo 'end'; &lt;br /&gt;function quit() &lt;br /&gt;{&lt;br /&gt;    echo 'quit';&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd@cd-laptop:~/tmp$ php 2.php &lt;br /&gt;start&lt;br /&gt;Warning: require_once(none.php): failed to open stream: No such file or directory in /home/cd/tmp/2.php on line 7&lt;br /&gt;Fatal error: require_once(): Failed opening required 'none.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/cd/tmp/2.php on line 7&lt;br /&gt;quit&lt;br /&gt;cd@cd-laptop:~/tmp$&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7922973801048856049?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7922973801048856049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7922973801048856049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7922973801048856049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7922973801048856049'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/09/php.html' title='Простые вещи, php'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-4411436838008363199</id><published>2008-07-20T21:08:00.001-07:00</published><updated>2008-07-21T20:10:30.519-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='bazaar'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Распределённые системы управления версиями</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Давным давно читал похвальные отзывы об mercurial, bazaar и иже с ними.  &lt;br/&gt;В силу природного любопытства нашел таки время прочитать про них подробнее - понравилось. &lt;br/&gt;Очень порадовала возможность забирать себе изменения с какого то конкретного бранча, причем делается это легко и непринужденно. &lt;br/&gt;Прочитав - забыл. Т.к. основной проект на svn и проблема в том чтобы обучить дизайнеров и flash программистов новой софтине (на svn то с трудом заставили их переходить). &lt;br/&gt;Тут возникает новый проект, ни с чем не связанный, отказываемся от php (устал я от него) в пользу python + django (интересно, удобно) заодно решили и репозиторий сменить. &lt;br/&gt;Из консоли вдвоем поделали тесты (я bazaar, другой сотрудник mercurial) в общем простейшие операции прошли на ура. Все просто. (Для базаар пришлось пару модулей питоновских поставить только)&lt;br/&gt;&lt;br/&gt;В чем же жопа? В плагинах к эклипсу. Я давным давно пришел ко мнению что ide должно быть ide а не редактором, и eclipse (полюбился он мне тем, что есть поддержка многих языков)  плагины к двум вышеперечисленным клиентам убогие. mercurial плагин отмел сразу, три кнопки и в тех не разобраться. С bazaar ковырялся чуть подольше  в надежде на чудо, сам плагин нормальный, в плане локальный commit, diff etc... . Танцы с бубном начались на push, и заявленная поддержка (только sftp) у меня не работала. &lt;br/&gt;Осталось впечатление крайней сырости и недоделанности. &lt;br/&gt;&lt;br/&gt;В общем как ни грустно, буду сидеть на svn + через полгодика попробую опять. &lt;br/&gt;&lt;br/&gt;P.S. В голове еще крутится идея чтобы испльзовать bzr-svn, но крайне боюсь глюков, что может быть черевато на основном проекте, хотя может через некоторое время попробую, хотя бы из интереса. &lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-4411436838008363199?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/4411436838008363199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=4411436838008363199' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4411436838008363199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4411436838008363199'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/07/blog-post_20.html' title='Распределённые системы управления версиями'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-2734835458887974893</id><published>2008-07-15T23:18:00.001-07:00</published><updated>2008-07-15T23:20:38.201-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='apt-get'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>debian/ubuntu apt-get NO_PUBKEY</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Все время забываю&lt;br/&gt;Проблема &lt;br/&gt;&lt;pre&gt;&lt;br/&gt;apt-get update &lt;br/&gt;W: GPG error: http://mirror.yandex.ru stable Release: Следующие подписи не могут быть проверены, так как недоступен общий ключ: NO_PUBKEY 07DC563D1F41B907&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;Решение&lt;br/&gt;&lt;pre&gt;&lt;br/&gt;# gpg --keyserver wwwkeys.eu.pgp.net --recv-keys 07DC563D1F41B907&lt;br/&gt;gpg: requesting key 1F41B907 from hkp server wwwkeys.eu.pgp.net&lt;br/&gt;gpg: /root/.gnupg/trustdb.gpg: trustdb created&lt;br/&gt;gpg: key 1F41B907: public key "Christian Marillat &amp;lt;marillat@debian.org&amp;gt;" imported&lt;br/&gt;gpg: no ultimately trusted keys found&lt;br/&gt;gpg: Total number processed: 1&lt;br/&gt;gpg:               imported: 1&lt;br/&gt;#  gpg --armor --export 1F41B907 | apt-key add -&lt;br/&gt;&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-2734835458887974893?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/2734835458887974893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=2734835458887974893' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2734835458887974893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2734835458887974893'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/07/debianubuntu-apt-get-nopubkey.html' title='debian/ubuntu apt-get NO_PUBKEY'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-5496326459925382788</id><published>2008-07-09T09:16:00.001-07:00</published><updated>2008-07-09T09:16:43.413-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='keyboard indicator'/><category scheme='http://www.blogger.com/atom/ns#' term='ubnunt'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Все гениальное просто</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Блин. Сколько я мучался с zend debuger  + zend studio. &lt;br/&gt;А ларчик открывался просто&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;Thursday, May 8, 2008&lt;br/&gt;ZSE + XDEBUG&lt;br/&gt;3:07AM PDT · dtaylor7 &lt;br/&gt;I think Zend hates xdebug... But the ZSE contains a full PDT (it has xdebug support). So, remove (move) the plugins/com.zend.php.debug*, then start the studion with "ZendStudio -clean"&lt;br/&gt;&lt;br/&gt;Hmm, there will be xdebug support in the PHP Debugger select... I tested it, works.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-5496326459925382788?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/5496326459925382788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=5496326459925382788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5496326459925382788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5496326459925382788'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/07/blog-post.html' title='Все гениальное просто'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-4205861440236231256</id><published>2008-07-09T09:15:00.001-07:00</published><updated>2008-07-09T09:15:09.214-07:00</updated><title type='text'>test</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;test&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-4205861440236231256?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/4205861440236231256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=4205861440236231256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4205861440236231256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4205861440236231256'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/07/test.html' title='test'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-9112826462418930491</id><published>2008-06-22T22:02:00.001-07:00</published><updated>2008-10-24T14:25:26.755-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Флаги языков в апплете индикатора расскладки gnome.</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Долго мучался без флагов с дефолтным индикатором расскладки. &lt;br/&gt;В итоге нашел решение. &lt;br/&gt;копируем флаги в папоку ~/.icons/flags &lt;br/&gt;обызываем ru.png us.png &lt;br/&gt;открываем gconf-editor&lt;br/&gt;desktop/gnome/peripherals/keyboard/indicator/showFlags&lt;br /&gt;&lt;br/&gt;ставиь галочку show country flag&lt;br/&gt;и все. &lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-9112826462418930491?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/9112826462418930491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=9112826462418930491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/9112826462418930491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/9112826462418930491'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/06/gnome.html' title='Флаги языков в апплете индикатора расскладки gnome.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-6643953425201250794</id><published>2008-04-29T04:25:00.001-07:00</published><updated>2008-04-29T04:27:44.082-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>perl</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Проработав с php забываю какой красивый перл&lt;br /&gt;Скрипт который парсит логи и выводит список проблемных пользователей&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; perl -n -e '$out{$1}=1  if  /user (\S+) without confirm/ ;END{ print  keys %out}'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-6643953425201250794?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/6643953425201250794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=6643953425201250794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6643953425201250794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6643953425201250794'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/04/perl.html' title='perl'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-6192557186466200306</id><published>2008-04-29T04:09:00.001-07:00</published><updated>2008-04-29T04:16:07.139-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='забавно'/><title type='text'>Сроки разработки. Боян но правда.</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Если бы не сталкивался с таким каждый день, может быть так и не ржал. &lt;br /&gt;&lt;br /&gt; Краткая памятка о сроках по работе с [неразборчиво].«Сегодня» — завтра.&lt;br /&gt;«Завтра» — напомнить завтра, что уже сегодня (см. «сегодня»).&lt;br /&gt;«В течение недели» — в следующую среду.&lt;br /&gt;«В течение недели, но до выходных, пожалуйста» — в понедельник.&lt;br /&gt;«Через две недели» — месяц.*&lt;br /&gt;«Месяц» — неопределенная, очень большая величина времени.&lt;br /&gt;«Три месяца» — три неопределенные, очень большие величины времени.&lt;br /&gt;«К осени» — когда выпадет снег. Снег выпадает каждый год, поэтому «к осени» является наиболее благоприятным сроком, пропустить который практически невозможно. &lt;br /&gt;«Через год» — не используется, ибо есть «к осени».&lt;br /&gt;* — Популярно заблуждение, что две недели — это 14 дней. Это не так. Две недели — это 14 дней + «в течение недели» (ибо вторая неделя еще не кончилась) + завтра («один день погоды не сделает»). В особых случаях отсчет «двух недель» начинается со следующего понедельника, так выигрывается еще несколько дней.Если повезет, то в результате выходит месяц срока и опоздание всего на один день («завтра»).&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-6192557186466200306?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/6192557186466200306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=6192557186466200306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6192557186466200306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6192557186466200306'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/04/blog-post.html' title='Сроки разработки. Боян но правда.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-6177977341807929302</id><published>2008-02-12T23:50:00.001-08:00</published><updated>2008-02-12T23:50:22.497-08:00</updated><title type='text'>It работа</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Включил на работе все протоколы что были в пиджине ( раньше висел тока рабочий jabber)&lt;br /&gt;По интенсивности валящихся мессаг возникает ощущение что на работе никто не работает. &lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-6177977341807929302?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/6177977341807929302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=6177977341807929302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6177977341807929302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6177977341807929302'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/02/it.html' title='It работа'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-2553782649653268509</id><published>2008-02-10T22:40:00.001-08:00</published><updated>2008-02-10T22:42:23.850-08:00</updated><title type='text'>Eclipse pdt ubuntu 7.10 x64</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Срочно понадобился PDT, &lt;br /&gt;скачал с сайта all_in_one &lt;br /&gt;(все время глючит когда ставлю плагинами)&lt;br /&gt;Не работает. Пишет javat terminated error code 13 и ругается на loaders/svg_loader.so&lt;br /&gt;&lt;br /&gt;Помимо решения, скачать 64 битный еклипс и установить pdt через менеджер обновлений, &lt;br /&gt;нашел вот что&lt;br /&gt;&lt;br /&gt;&lt;a href='http://dmartin.org/weblog/eclipse-on-ubuntu-linux-for-amd64'&gt;http://dmartin.org/weblog/eclipse-on-ubuntu-linux-for-amd64&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В кратце &lt;br /&gt;&lt;br /&gt;Ставим жаву&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class='code'&gt;#sudo apt-get install ia32-sun-java5-bin&lt;br /&gt;в моем случае&lt;br /&gt;&lt;/span&gt;&lt;span class='code'&gt;sudo apt-get install ia32-sun-java6-bin&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Делаем ярлык для запуска куда провисываем путь до джавы. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd ~/eclipse // перехожу в папку где установлен эклипс&lt;br /&gt;touch eclipse.sh&lt;br /&gt;chmod +x eclipse.sh&lt;br /&gt;vim eclipse.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; #!/bin/bash&lt;br /&gt; PATH=/usr/lib/jvm/ia32-java-6-sun/bin:$PATH&lt;br /&gt; /home/user/eclipse/eclipse&lt;br /&gt;chmod +x eclipse.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-2553782649653268509?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/2553782649653268509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=2553782649653268509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2553782649653268509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2553782649653268509'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/02/eclipse-pdt-ubuntu-710-x64.html' title='Eclipse pdt ubuntu 7.10 x64'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1038096501348750305</id><published>2008-02-07T22:19:00.001-08:00</published><updated>2008-02-07T22:19:10.265-08:00</updated><title type='text'>squid http proxy минимум</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Через провайдера на работе не было связи до моего домашнего провайдера, а там для меня лежала нужная инфа. &lt;br /&gt;Через хостинг линксом все работает, но не удобно. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; apt-get install squid&lt;br /&gt;&lt;br /&gt;vim /etc/squid/squid.conf&lt;br /&gt;нашел &lt;br /&gt;http_access allow localhost&lt;br /&gt;&lt;br /&gt;Поменял на &lt;br /&gt;acl allowed_hosts src xx.xx.xx.xx/255.255.255.0&lt;br /&gt;http_access allow allowed_hosts&lt;br /&gt;&lt;br /&gt;Где xx.xx.xx.xx мой айпи наружу. &lt;br /&gt;/etc/init.d/squid restart&lt;br /&gt;&lt;br /&gt;Firefox + mm proxy swith &lt;br /&gt;&lt;br /&gt;Прописываю proxy myhosting:3128&lt;br /&gt;&lt;br /&gt;Все работает&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1038096501348750305?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1038096501348750305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1038096501348750305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1038096501348750305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1038096501348750305'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/02/squid-http-proxy.html' title='squid http proxy минимум'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-6515522808739271291</id><published>2008-01-29T19:16:00.001-08:00</published><updated>2008-01-29T19:16:47.572-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Кино'/><category scheme='http://www.blogger.com/atom/ns#' term='Дерьмо'/><title type='text'>Отрыжка камеди.</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Посмотрел это гавно "Самый лучший фильм" (с) Экслер. &lt;br/&gt;Лучше не скажешь. &lt;br/&gt;Я просто в шоке, как можно &lt;strike&gt;нае**ть людей &lt;/strike&gt;раскрутить фильм.&lt;br/&gt;В общем пендосовская &lt;strike&gt;херня&lt;/strike&gt; комедия, да какая нафик комедия. Улыбнулся три раза, остальное время был в шоке. &lt;br/&gt;Смотрел для галочки, просто в ужасе. Есть подозрение что если бы не харламов, плевался бы раза в 2 меньше. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-6515522808739271291?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/6515522808739271291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=6515522808739271291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6515522808739271291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6515522808739271291'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/01/blog-post_29.html' title='Отрыжка камеди.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1859824019050776691</id><published>2008-01-27T19:56:00.001-08:00</published><updated>2008-01-27T19:56:10.699-08:00</updated><title type='text'>Этиология и патогенез московских пробок.</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Интересная статья &lt;br/&gt;&lt;a href='http://polit.ru/lectures/2008/01/24/probki_print.html'&gt;http://polit.ru/lectures/2008/01/24/probki_print.html&lt;/a&gt;&lt;br/&gt;Вещи очень интересные и познавательные. Можно многое извлечь для себя. &lt;br/&gt;Однако по окончании прочтения стало грустно, особенно после фразы. &lt;br/&gt;&lt;br/&gt;&lt;b&gt;Принимают решение одни, а знают другие.&lt;br/&gt;&lt;br/&gt;&lt;/b&gt;Имхо ключевая фраза, особенно по всем вопроса/проектам м которые вызывают удивление. &lt;b&gt;&lt;br/&gt;&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1859824019050776691?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1859824019050776691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1859824019050776691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1859824019050776691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1859824019050776691'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/01/blog-post.html' title='Этиология и патогенез московских пробок.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-3946121199737887753</id><published>2008-01-25T01:08:00.001-08:00</published><updated>2008-10-27T11:07:24.447-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rsa'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>ssh авторизация через ключи? или логин без пароля на сервер</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Updated at 28 october 2008 04:32&lt;/span&gt;&lt;br /&gt;Проблема : надоело вводить пароль на ssh хост(пипец длинный) &lt;br /&gt;&lt;br /&gt;Решение. &lt;br /&gt;1. Нужно сгенерить ключ (если еще не сделан)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[user@host ~]$ ssh-keygen -t rsa&lt;br /&gt;Generating public/private rsa key pair.&lt;br /&gt;Место для хранения ключа (я нажал enter)&lt;br /&gt;Enter file in which to save the key (/home/user/.ssh/id_rsa): &lt;br /&gt;Enter passphrase (empty for no passphrase): &lt;br /&gt;Enter same passphrase again: &lt;br /&gt;Your identification has been saved in /home/user/.ssh/id_rsa.&lt;br /&gt;Your public key has been saved in /home/user/.ssh/id_rsa.pub.&lt;br /&gt;The key fingerprint is:&lt;br /&gt;xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host&lt;br /&gt;[user@host ~]$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ключ сгенерен, теперь нужно положить его на серве&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;user@host$ ssh-copy-id user2@host2&lt;br /&gt;Now try logging into the machine, with "ssh 'user2@host2'", and check in:&lt;br /&gt;&lt;br /&gt;  .ssh/authorized_keys&lt;br /&gt;&lt;br /&gt;to make sure we haven't added extra keys that you weren't expecting.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Все, теперь можете логиниться. &lt;br /&gt;&lt;br /&gt;Если нет ssh-copy-id&lt;br /&gt;&lt;br /&gt;Можно сделать так&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Копируем через scp&lt;br /&gt;user@host$ scp ~/.ssh/id_rsa.pub user2@host2:/home/user2/&lt;br /&gt;Коннектимся&lt;br /&gt;ДОбавляем публичный ключ&lt;br /&gt;user@host2$cat ~/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys2 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Текст первоначальной статьи&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Проблема : надоело вводить пароль на хост(пипец длинный) &lt;br /&gt;Есть домашний комп, и хост. &lt;br /&gt;Например&lt;br /&gt;user@desktop, user2@server&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;user@desktop:~$ ssh-keygen -t rsa&lt;br /&gt;Generating public/private rsa key pair.&lt;br /&gt;Enter file in which to save the key (/home/cd/.ssh/id_rsa): &lt;br /&gt;Enter passphrase (empty for no passphrase): &lt;br /&gt;Enter same passphrase again: &lt;br /&gt;// оставил пустыми &lt;br /&gt;Your identification has been saved in /home/user/.ssh/id_rsa.&lt;br /&gt;Your public key has been saved in /home/user/.ssh/id_rsa.pub.&lt;br /&gt;The key fingerprint is:&lt;br /&gt;xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@desktop&lt;br /&gt;&lt;br /&gt;user@desktop:~$ cat /home/user/.ssh/id_rsa.pub &lt;br /&gt;&lt;span style='color: red;'&gt;ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx== user&lt;/span&gt;@desktop&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Копируем от ssh-rsa до user включительно (красным)&lt;br /&gt;&lt;br /&gt;Коннектимся на сервер &lt;br /&gt;&lt;br /&gt;vim .ssh/authorized_keys2&lt;br /&gt;&lt;br /&gt;Получаем &lt;br /&gt;&lt;div style='border: thin solid black;'&gt;&lt;br /&gt;ssh-rsa ннннннннннннн== another-user&lt;br /&gt;пустая строка &lt;br /&gt;&lt;span style='color: red;'&gt;ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx== user&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Режим редактирования, идем в конец файла, я вставил скопированную срочку через пробел&lt;br /&gt;&lt;br /&gt;:wq (сохраняем закрываем) &lt;br /&gt;&lt;br /&gt;Теперь пускает без всякого пароля &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Updated at 25 october 2008 04:32&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Блин только щас узнал что все эти танцы с бубном заменяются на одну простую вещь :)  Понятно правда что генерацию ключа никто не отменял&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ssh-copy-id login@host&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-3946121199737887753?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/3946121199737887753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=3946121199737887753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3946121199737887753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3946121199737887753'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/01/ssh_25.html' title='ssh авторизация через ключи? или логин без пароля на сервер'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-9061470103436017244</id><published>2008-01-24T22:01:00.001-08:00</published><updated>2008-01-27T04:47:36.218-08:00</updated><title type='text'>Настройка Subversion в Debian Etch</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;понадобился svn репозитарий для своего хостинга (firstvds.ru) система debian etch т.к. хостинг свехдешевый, и места во время создания было мало.&lt;br/&gt;&lt;br/&gt;Человек я ленивый и далеко не админ. Читать svn hand book лень. &lt;br/&gt;Благо добрые люди выложили описание step by step &lt;br/&gt;Копипаст и все работает. &lt;br/&gt;Единственное &lt;br/&gt;&lt;pre&gt;askeet замените на название своего репозитария. &lt;br/&gt;&lt;br/&gt;localhost (в конце при разметке репозитария на firstvds.ru нужнозаменить на 127.0.0.1) &lt;br/&gt;&lt;br/&gt;репозитарий будет доступен потом по урл http://host/svn/name_of_repository&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;a href='http://ubunterra.blogspot.com/2007/11/subversion-debian-etch.html'&gt;http://ubunterra.blogspot.com/2007/11/subversion-debian-etch.html&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class='poweredbyperformancing'&gt;Если нужно чтобы пароль был на все операции закоменнтируете &lt;pre&gt;&lt;br /&gt;#&amp;lt;LimitExcept GET PROPFIND OPTIONS REPORT&amp;gt;&lt;br /&gt;  Require valid-user&lt;br /&gt;#&amp;lt;/LimitExcept&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-9061470103436017244?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/9061470103436017244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=9061470103436017244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/9061470103436017244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/9061470103436017244'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/01/subversion-debian-etch.html' title='Настройка Subversion в Debian Etch'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7685331515068918775</id><published>2008-01-17T21:36:00.001-08:00</published><updated>2008-01-24T22:04:49.495-08:00</updated><title type='text'>Ubuntu gutsy 64b flash player</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Установил себе 64 битную ubuntu gutsy. &lt;br /&gt;Все хорошо, все отлично. &lt;br /&gt;2 проблемы. &lt;br /&gt;1. Skype - находил некоторые решения, но не работающие. &lt;br /&gt;2. Flash player, поставил себе gnash с баннерами справляется. но не больше. Зашел на сайт starcraft2.com не смог посмотреть ролики :(. Расстроился. &lt;br /&gt;В итоге нашел решение &lt;br /&gt;http://www.daryl.mu/2008/01/12/howto-install-flash-9-on-ubuntu-gutsy-gibbon-64-bit/&lt;br /&gt;&lt;br /&gt;Привожу для себя вырезку из этого блога. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;wget http://fpdownload.macromedia.com/get/flashplayer&lt;br /&gt;/current/install_flash_player_9_linux.tar.gz&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;tar -xvzf ./install_flash_player_9_linux.tar.gz&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mkdir ~/.mozilla/plugins&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cp install_flash_player_9_linux/libflashplayer.so ~/.mozilla/firefox/plugins&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sudo apt-get  install nspluginwrapper&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.so&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Тут мне выдало&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.sonspluginwrapper: /home/cd/.mozilla/plugins/libflashplayer.so is not a valid NPAPI plugin&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Оказалось что файл ~/.mozilla/plugins/libflashplayer.so просто не скопировался. &lt;br /&gt;Updated&lt;br&gt;&lt;br /&gt;Иногда падает, флеш не отображается, иногда отэтого помогает рефреш страницы. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7685331515068918775?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7685331515068918775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7685331515068918775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7685331515068918775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7685331515068918775'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/01/ubuntu-gutsy-64b-flash-player.html' title='Ubuntu gutsy 64b flash player'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7624015414179469780</id><published>2008-01-06T21:05:00.001-08:00</published><updated>2008-01-06T21:08:07.233-08:00</updated><title type='text'>Моя новая убунту</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;На праздниках для отдохновения души поставил себе ubuntu 7.10 с нуля. До этого была перекуроченная тестовая версия убунты почти годичной давности которая тихо умирала. &lt;br /&gt;Девиз был ни грамма kde :) &lt;br /&gt;&lt;br /&gt;Получилось интерсно &lt;br /&gt;&lt;a target='_blank' href='http://rentabiliweb.net/cd/2.png'&gt;&lt;br /&gt;&lt;img width='400' src='http://rentabiliweb.net/cd/2.png'/&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Сама система как и водится встала без проблем. &lt;br /&gt;Для включения compiz потребовалась установка проприетарных драйверов (ati radeon x1100) &lt;br /&gt;После них заработал compiz. В отличии от моей предыдущей установки найстройки применяются не сразу, а после рестарта компиза. &lt;br /&gt;&lt;br /&gt;Внешний вид настроился очень просто &lt;br /&gt;Внешний вид -&amp;amp;gt; темы (скачал с gnome-look.org blubuntu-murrine) установил&lt;br /&gt;Gdm -&amp;amp;gt; leopard theme (к сожалению скрина под рукой нет, но выглядит отпадно)&lt;br /&gt;Icons -&amp;amp;gt; Vista-inspirate1_0 (kde-look.org) for gnome (по старой привычке) &lt;br /&gt;Прозрачная панель. &lt;br /&gt;Emerald theme aqua-button-look (подходит под wallpaper) &lt;br /&gt;Вместо window manager -&amp;amp;gt; avant-window-manager к нему же поставил плагинами меню, переключатель окон, и быструю панель ( в vim ее использовать не получилось по esc закрывается) &lt;br /&gt;&lt;br /&gt;Вначале пробовал gdesklets они начали безбожно глючить, поставил всместо них screenlets for compiz &lt;br /&gt;Календари screenlets берут информацию о событиях из google.calendar.com&lt;br /&gt;Получилось неплохо на мой взгляд. &lt;br /&gt;&lt;br /&gt;Gnome-terminal прозрачный внутри, мне удобно. &lt;br /&gt;KDocker для gnome-terminal (одну консоль держу постоянно открытой и сворачиваю ее в трей, при использовании alltray у меня не работает прозрачность)&lt;br /&gt;Alltray для evolution &lt;br /&gt;&lt;br /&gt;File manager - mucommander &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7624015414179469780?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7624015414179469780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7624015414179469780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7624015414179469780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7624015414179469780'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2008/01/ubuntu.html' title='Моя новая убунту'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1734106432956520132</id><published>2007-11-20T21:03:00.001-08:00</published><updated>2007-11-20T21:04:37.358-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scribefire'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='client'/><title type='text'>Тестируем новый блог клиент</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Наткнулся на http://feeds.feedburner.com/~r/linux2/~3/186258877/270, перепробовал все. Т.к. мне не очень хочется сидеть и разбирацо какие настройки куда писать (считаю блог клиент сам все это должен делать) то понравился только ScribeFire - firefox extension, удобно тем что броузер открыт всегда, и если появлецо желание что либо добавить, оставить себе на память, то все под рукой + он сразу скушал настройки аккаунта, на чем предыдущие клиенты гукнулись. &lt;br/&gt;&lt;br/&gt;В общем это мой выбор и он думаю облегчит мне жизнь. &lt;br/&gt;&lt;br/&gt;Updated &lt;br/&gt;Technorati Tags: &lt;a rel='tag' href='http://technorati.com/tag/blog' class='performancingtags'&gt;blog&lt;/a&gt;, &lt;a rel='tag' href='http://technorati.com/tag/client' class='performancingtags'&gt;client&lt;/a&gt;, &lt;a rel='tag' href='http://technorati.com/tag/scribefire' class='performancingtags'&gt;scribefire&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1734106432956520132?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1734106432956520132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1734106432956520132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1734106432956520132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1734106432956520132'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/11/blog-post_783.html' title='Тестируем новый блог клиент'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-6559480494857773548</id><published>2007-11-04T19:26:00.000-08:00</published><updated>2007-11-04T19:28:42.379-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='imap'/><category scheme='http://www.blogger.com/atom/ns#' term='evolution'/><title type='text'>gmail, imap</title><content type='html'>Настроил gmail через imap в evolution.&lt;br /&gt;&lt;br /&gt;Порадовало.&lt;br /&gt;1. Ярлыки в виде папок. &lt;br /&gt;2. Отметки о прочтении остаюстся, имап таки.&lt;br /&gt;Огорчило.&lt;br /&gt;1. Очень медленно, часты попапы виды "imap.gmail.com" разорвал соединение. &lt;br /&gt;2. Непонятна папка gmail в которой лежит all mails, (бардак) а также все сообщения из google talk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-6559480494857773548?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/6559480494857773548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=6559480494857773548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6559480494857773548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/6559480494857773548'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/11/gmail-imap.html' title='gmail, imap'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-8043082070871995209</id><published>2007-11-04T18:27:00.000-08:00</published><updated>2007-11-04T20:28:11.121-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mamba'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Тест</title><content type='html'>Забавно http://habrahabr.ru/blog/php/29229.html#habracut&lt;br /&gt;updated&lt;br /&gt;ссылко закрыто, смысл такой : мамбо разработчики выложили тест, пройдя который можно к ним устроицо на работу. &lt;br /&gt;Тому кто приведет программиста к ним приз 500 баксов. &lt;br /&gt;Подробнее &lt;a href="http://www.corp.mamba.ru/test/promo.phtml"&gt;http://www.corp.mamba.ru/test/promo.phtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Учиться, учиться и еще раз учиться. &lt;br /&gt;Имхо завалился на битовых операциях, немножко на sql, шеле, svn. &lt;br /&gt;&lt;a href="http://www.corp.mamba.ru/test/promo.phtml"&gt;&lt;img border="0" src="http://www.corp.mamba.ru/test/widget.phtml?id=2509" /&gt;&lt;/a&gt;&lt;br /&gt;Updated&lt;br /&gt;Уточнил в мане svn annotate, blame&lt;br /&gt;&lt;a href="http://www.corp.mamba.ru/test/promo.phtml"&gt;&lt;img border="0" src="http://www.corp.mamba.ru/test/widget.phtml?id=2510" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На мамба программиста не тяну :)&lt;br /&gt;&lt;br /&gt;updated&lt;br /&gt;&lt;br /&gt;Простой скрипт который выводит все результаты до 2518 попытки&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;for&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2518&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;++)&lt;br /&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;lt;img&amp;nbsp;border="0"&amp;nbsp;src="http://www.corp.mamba.ru/test/widget.phtml?id='&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$i&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'"&amp;nbsp;/&amp;gt;'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Т.к. айдишники открытые, то соотвественно можно подобрать себе изображение супер крутого,  например : http://www.corp.mamba.ru/test/widget.phtml?id=118&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.corp.mamba.ru/test/promo.phtml"&gt;&lt;img border="0" src="http://www.corp.mamba.ru/test/widget.phtml?id=118" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-8043082070871995209?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/8043082070871995209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=8043082070871995209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8043082070871995209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8043082070871995209'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/11/httphabrahabr.html' title='Тест'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-8678424207742685479</id><published>2007-11-01T23:13:00.000-07:00</published><updated>2007-11-01T23:22:13.986-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='transaction'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='pdo'/><title type='text'>Транзакции в mysql + pdo</title><content type='html'>Не работал PDO::rollBack();&lt;br /&gt;&lt;br /&gt;Решение. &lt;br /&gt;&lt;br /&gt;1. Таблица обязательно innoDb или DBD (мануал mysql)&lt;br /&gt;&lt;br /&gt;После этого ничего не изменилось. &lt;br /&gt;&lt;br /&gt;2. Перед транзакцией нужно set autocommit = 0; после set autocommit = 1 (mysql manual)&lt;br /&gt;В итоге&lt;br /&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**&lt;br /&gt;*&amp;nbsp;@var&amp;nbsp;PDO&amp;nbsp;$db&lt;br /&gt;*/&lt;/span&gt;&lt;span style="color: #007700"&gt;/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$db&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;exec&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'set&amp;nbsp;autocommit=0'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;false&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;===&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$db&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;beginTransaction&lt;/span&gt;&lt;span style="color: #007700"&gt;()&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Exception&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'bla&amp;nbsp;bla&amp;nbsp;bla&amp;nbsp;'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;do&amp;nbsp;smth&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$db&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;commit&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;}&lt;br /&gt;catch&amp;nbsp;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Exception&amp;nbsp;$e&lt;/span&gt;&lt;span style="color: #007700"&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$db&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;rollBack&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$logger&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;error&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$e&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getMessage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$db&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;exec&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'set&amp;nbsp;autocommit=1'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-8678424207742685479?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/8678424207742685479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=8678424207742685479' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8678424207742685479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8678424207742685479'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/11/mysql-pdo.html' title='Транзакции в mysql + pdo'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-8224781021782793807</id><published>2007-10-15T22:50:00.000-07:00</published><updated>2007-10-15T23:06:49.510-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zend studio'/><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='pdt'/><title type='text'>eclipse pdt vs ZendStudio Neon</title><content type='html'>Вначале об eclipse pdt. &lt;br /&gt;Пересел на него сразу после релиза с редактора vim. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Недостатки. &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Не интуитивные настройки, особенно после zend studio &lt;= 5.5. Или по сравнению с .vimrc&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Медленный, особенно перерисовка окон ( со временем сгладилось) &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Не смог настроить Database Development&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Нет удаленного сайта, sshfs которым я восторгался - не решение, т.к. eclipse сканит все файлы, и все просто тормозит. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Subversion plugin кривой, часть видов выдает exception, не смог сделать проект из репозитария&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Очень долго настраивал дебагер (xdebug) к сайту с modrewrite, через 3 дня заработало, больше похоже на танцы с бубном.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Стремный редактор js,css&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Хотел поставить aptana плагином, все поломалось. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Понравилось&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Project outline ( не работает если проект из репозитория)&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Показ ошибок прямо в броузере проекта. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Поддержка дебагера &lt;/li&gt; &lt;br /&gt;&lt;li&gt; Бесплатный &lt;/li&gt; &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;А все остальное стандартно вроде. &lt;br /&gt;&lt;br /&gt;Поставил ZendStuio Neon (beta) &lt;br /&gt;&lt;br /&gt;Блин вот это то, чего я так долго ждал. &lt;br /&gt;По сути тот же pdt, только доведенный до ума, работает по сути из коробки. &lt;br /&gt;Особенно понравилась поддержка PhpUnit + Автоматическое создаение TestSuite на основе всех тестов в проекте. &lt;br /&gt;&lt;br /&gt;Из минусов пока видел только поддержку зендовского дебагера, а также проблема при работе с database development перспективой ( неправильная кодировка символов, ломается на части таблиц) &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Резюме: &lt;/span&gt;&lt;br /&gt;В общем этот редактор это шаг в перед, остальные это ковыряние лопаткой в песочнице, по сравнению с экскаватором. Судя по всему он стоит денег, вопрос только сколько, когда я в последний раз смотрел  информации не было.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-8224781021782793807?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/8224781021782793807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=8224781021782793807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8224781021782793807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8224781021782793807'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/10/eclipse-pdt-vs-zendstudio-neon.html' title='eclipse pdt vs ZendStudio Neon'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1557104460251262818</id><published>2007-09-25T23:22:00.000-07:00</published><updated>2007-09-25T23:50:03.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amarok'/><category scheme='http://www.blogger.com/atom/ns#' term='utf8'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='unicod rewriter'/><title type='text'>Проблема с кодировками в mp3 тагах (amarok)</title><content type='html'>Известная проблема с тагами, rusxmms я не использую потому что не нравится, слушаю музыку при помощи amarok т.к. нравится его библиотека, возможность организовать свою коллекцию, получить лирику. &lt;br /&gt;&lt;br /&gt;Раньше пользовался какой то навороченной софтиной, чтобы переконверитровать таги, причем ей нужен был xmms установленный. &lt;br /&gt;&lt;br /&gt;Сегодня нашел &lt;a href="http://libc6.blogspot.com/2007/01/id3v1-id3v2-mp3-russian-cyrillic-tags.html"&gt;http://libc6.blogspot.com/2007/01/id3v1-id3v2-mp3-russian-cyrillic-tags.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Мотаем вниз читаем про  Unicode Rewriter.&lt;br /&gt;&lt;br /&gt;Вкратце &lt;br /&gt;качаем &lt;a href="http://sourceforge.net/projects/unicoderewriter/"&gt;отсюда&lt;/a&gt;&lt;br /&gt;ставим :&lt;br /&gt;&lt;pre&gt; java -jar  скачанный.jar&lt;/pre&gt;&lt;br /&gt;Запускаем&lt;br /&gt;&lt;pre&gt; java -jar кудапоставили/bin/UnicodeRewriter.jar &lt;/pre&gt;&lt;br /&gt;Ставим в поле кодировки cp1251, выбираем кталог (делаем бэкап) запускаем.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1557104460251262818?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1557104460251262818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1557104460251262818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1557104460251262818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1557104460251262818'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/mp3-amarok.html' title='Проблема с кодировками в mp3 тагах (amarok)'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-8410507773073600873</id><published>2007-09-24T00:59:00.000-07:00</published><updated>2007-09-24T01:00:09.906-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spl'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Себе, почитать.</title><content type='html'>Увидел на хостинге - угарно. &lt;br /&gt;http://www.sitepoint.com/print/php5-standard-library&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-8410507773073600873?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/8410507773073600873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=8410507773073600873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8410507773073600873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8410507773073600873'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/blog-post_24.html' title='Себе, почитать.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-1715764867127282191</id><published>2007-09-24T00:32:00.000-07:00</published><updated>2007-09-24T00:48:06.419-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='editors'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='sshfs'/><category scheme='http://www.blogger.com/atom/ns#' term='mount'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Eclipse pdt, монтирование серваков.</title><content type='html'>C опозданием узнал что зарелизился eclise pdt. Ждал я этого долго, скачал 100 метров all in one (научен горьким опытом установки плагинами ). &lt;br /&gt;Все хорошо, ожидаемо , но фтп/сфтп плагина в комплекте нет. &lt;br /&gt;2 раза я уже искал нормальные плагины под eclipse для удобной работы по sftp, ftp, чтобы было так же удобно как скажем в зенд студии- не нашел,  &lt;br /&gt;Хотел было положить в темный чулан этот редактор, и опять взяться за vim, но подумал, это линух или нет? Может можно замонтировать? Поискал в гугле ssh fs .&lt;br /&gt;&lt;a href="http://linux-ru.blogspot.com/2007/03/sshfs-ssh_12.html"&gt;http://linux-ru.blogspot.com/2007/03/sshfs-ssh_12.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ставим как написано. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sudo apt-get install sshfs&lt;br /&gt;modprobe fuse &lt;br /&gt;sudo usermod -a -G fuse имя_пользователя&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Монтируем, &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sshfs username@host: ~/work/mnt/hosting1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;и работаем через локально подмонтированную директорию на серваке :) &lt;br /&gt;(Лучше отключить кэшировани) &lt;br /&gt;Единственный ньюанс, создаю проекты в ~/workspace/projectname/ а монтирую например в ~/work/mnt/hosting&lt;br /&gt;затем просто симлинк&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ls -s ~/work/mnt/hosting1/public_html ~/workspace/projectname/httdocs &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ну и размонтирование&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;fusermount -u ~/work/mnt/hosting1&lt;br /&gt;или&lt;br /&gt;sudo umount ~/work/mnt/hostring1&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-1715764867127282191?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/1715764867127282191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=1715764867127282191' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1715764867127282191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/1715764867127282191'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/eclipse-pdt.html' title='Eclipse pdt, монтирование серваков.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7796405647524354944</id><published>2007-09-22T22:29:00.000-07:00</published><updated>2007-09-22T22:30:52.977-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='todo'/><title type='text'>себе</title><content type='html'>забавно, нужно почитать когда время будет. &lt;br /&gt;http://necromant-2005.livejournal.com/&lt;br /&gt;Обратить внимание на zf time exec. ( у мну такое же мнение) &lt;br /&gt;Подумать о своем фреймворке, тоже наверное нужно компилировать файлы в один.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7796405647524354944?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7796405647524354944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7796405647524354944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7796405647524354944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7796405647524354944'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/blog-post_22.html' title='себе'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-7146138972592699775</id><published>2007-09-19T19:06:00.000-07:00</published><updated>2007-09-19T19:21:52.568-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xargs'/><category scheme='http://www.blogger.com/atom/ns#' term='grep'/><category scheme='http://www.blogger.com/atom/ns#' term='nix'/><title type='text'>Пакетная обработка файлов, обратный grep</title><content type='html'>Линух знаю плохо, но стараюсь учиться. Поэтому долго и нудно ищу решения повторяющихся проблем.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Проблема.&lt;/span&gt; : Нужно применить одну команду к списку файлов. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Решение &lt;/span&gt;xargs: &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Пример : &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Данные&lt;/span&gt;&lt;br /&gt;ls -la &lt;br /&gt;1.deb &lt;br /&gt;2.deb &lt;br /&gt;Установка всех деб пакетов. &lt;br /&gt;ls *.deb | xargs sudo dpkg -i &lt;br /&gt;&lt;span style="font-style:italic;"&gt;Данные &lt;/span&gt;&lt;br /&gt;Директория с исходниками, нужно найти файлы где встречается строка "xxxx"&lt;br /&gt;find ./ (найти все файлы )&lt;br /&gt;find ./ | xargs grep "xxxx" (найти все файлы в каждом файле найти строчку "xxxx"&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Проблема &lt;/span&gt;&lt;br /&gt;Встречаются директории и имена файлов разделенных пробелами, xargs считает это разными входыми парамертами, &lt;br /&gt;&lt;span style="font-style:italic;"&gt;Например&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$:~/tests$ ls&lt;br /&gt;xxx  xx x&lt;br /&gt;$:~/tests$ find ./ | xargs ls&lt;br /&gt;ls: ./xx: No such file or directory&lt;br /&gt;ls: x: No such file or directory&lt;br /&gt;./:&lt;br /&gt;xxx  xx x&lt;br /&gt;./xxx:&lt;br /&gt;cd@cd-laptop:~/tests$&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Решение&lt;/span&gt;&lt;br /&gt;Решение найдено тут : &lt;a href="http://linux.presscom.org/25924.html"&gt;http://linux.presscom.org/25924.html&lt;/a&gt;&lt;br /&gt;Чтобы не забыть пишу для себя. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; Проблема очевидна, пробел в имени совпадает с разделителем аргументов. &lt;br /&gt;Решение простое - и find  и  xargs умеют создавать и принимать список аргументов, разделеных нуль-байтом.&lt;br /&gt; $ find ./ -name "t*" -print0 | xargs -0 ls&lt;br /&gt;./test  ./te st&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Т.е. для моего примера это будет&lt;br /&gt;$find ./ -print0 | xargs -0 lj &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Проблема&lt;/span&gt;&lt;br /&gt;Нужен инверированный grep (обратный) &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Решение&lt;/span&gt;&lt;br /&gt;grep -v (долго искал, ман плохо читал ) &lt;br /&gt;Например&lt;br /&gt;Поиск строки  в исходниках, не показывая svn каталоги&lt;br /&gt;find ./ | grep -v 'svn' | xargs grep "xxxx"&lt;br /&gt;(найти все файлы, исключить строки где есть svn, в каждом файле из полученного списка применить поиск "xxx")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-7146138972592699775?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/7146138972592699775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=7146138972592699775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7146138972592699775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/7146138972592699775'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/grep.html' title='Пакетная обработка файлов, обратный grep'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-5494610074851123659</id><published>2007-09-18T03:12:00.000-07:00</published><updated>2007-09-18T03:13:55.771-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='memory'/><title type='text'>Себе на память</title><content type='html'>Вечно забываю синтаксис  GRANT в mysql &lt;br /&gt;Вот с примерами. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&gt; GRANT ALL PRIVILEGES ON *.* TO ferst@localhost&lt;br /&gt;IDENTIFIED BY 'some_pass' WITH GRANT OPTION;&lt;br /&gt;&lt;br /&gt;mysql&gt; GRANT ALL PRIVILEGES ON *.* TO ferst@"%"&lt;br /&gt;IDENTIFIED BY 'some_pass' WITH GRANT OPTION;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-5494610074851123659?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/5494610074851123659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=5494610074851123659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5494610074851123659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5494610074851123659'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/blog-post_18.html' title='Себе на память'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-2399407477649566239</id><published>2007-09-16T07:53:00.000-07:00</published><updated>2007-09-16T08:08:55.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fstab'/><category scheme='http://www.blogger.com/atom/ns#' term='vfat'/><category scheme='http://www.blogger.com/atom/ns#' term='mount'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>монтирование fat</title><content type='html'>В который раз забываю как монтировать фат, периодически всплывает, и тратить лишние 10-15 минут неохота. &lt;br /&gt;Посмотреть разделы&lt;br /&gt;sudo fdisk -l &lt;br /&gt;sudo vim /etc/fstab &lt;br /&gt;добавить &lt;br /&gt;/dev/hda1 /mnt/win vfat iocharset=utf8,codepage=866,rw,umask=000,showexec,quiet 0 0&lt;br /&gt;&lt;br /&gt;(где /dev/hda1 раздел который мы получили из вывода fdisk) &lt;br /&gt;где: /mnt/win - точка монтирования(тоесть место куда попадет раздел с виндой после монтирования)&lt;br /&gt;iocharset=utf8 - локаль вашей системы &lt;br /&gt;codepage=866 кодировка windows раздела&lt;br /&gt;umask=000 - позволяет записывать на fat раздел всем юзерам системы.&lt;br /&gt;showexec - нужна чтобы как исполняемые отображались файлы с расширениями com, exe, bat; если её не указать, все файлы будут отображаться как исполняемые.&lt;br /&gt;quiet - Т.к. ф.с. fat не хранит информацию о владельце файла и правах доступа, то при попытке записи такой информации будут выдаваться сообщения о невозможности её записать, что не несёт полезной информации, а только мешает; опция quiet отключает такие сообщения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-2399407477649566239?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/2399407477649566239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=2399407477649566239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2399407477649566239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/2399407477649566239'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/fat.html' title='монтирование fat'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-3719677003782455315</id><published>2007-09-13T23:25:00.000-07:00</published><updated>2007-09-13T23:30:36.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='beril'/><category scheme='http://www.blogger.com/atom/ns#' term='compiz'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Бывают же чудеса.</title><content type='html'>У меня адекватно заработал compiz. &lt;br /&gt;Как это было. &lt;br /&gt;При замене ноутбука сразу захотелось поставить себе берил, оказалось что атишный чипсет не особо то лучше сисовского. :( Через три дня я с горем пополам поставил его. Счастье было недолгим, фпс было мало. В общем побаловался, почувствовал себе обиженным и забил. Черзе некоторое время настроил себе компиз, в общем получилось то же самое. Затем ноут был в ремонте, (2 раза по месяцу) и вот решил глянуть что у меня тут. Обновил систему, берил такой же тормозной :( . Уже было совсем обиделся, включил компиз и ахнул. Все летает, как и не было тормозов. &lt;br /&gt;Вот такая вот история... Сижу теперь радуюсь как ребенок.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-3719677003782455315?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/3719677003782455315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=3719677003782455315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3719677003782455315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3719677003782455315'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/blog-post_13.html' title='Бывают же чудеса.'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-3626995481873036942</id><published>2007-09-11T20:50:00.000-07:00</published><updated>2008-12-11T09:58:40.408-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='ctags'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>ctags &amp;&amp; vim</title><content type='html'>Т.к. я уже четвертый месяц пытаюсь использовать в качестве IDE vim, постоянно наталкиваюсь на некоторые трудности. &lt;br /&gt;Давным давно использовал плагин TList + Project, достаточно удобная связка, но много ручной работы сводят преимущества на нет, особенно при создании нового проекта. &lt;br /&gt;Со временем я нашел замену, TagExplore (File explorer + tag list view  в одном флаконе ), &lt;br /&gt;все было хорошо особенно нравилась возможность прямо в окне file exporer открыть закрыть список функций, переменных. , Но после окончательного перехода на 5-й php в коде стало появляться все больше и больше классов, и сейчас уже весь проект на них, а у ctags который используется этим плагином, был большой недостаток - не показывал он методы классов и все. Нашел патч на исходные коды исправляющий эти проблемы, но я люблю пакетные системы и ненавижу собирать софт. К тому же, на удаленных серверах где и стоит вим, не очень то и пособираешь пакеты - к тож мне рута даст? &lt;br /&gt;В очердной раз пошукав в гугле обнаружил что ctags обновился и в новой 5.7 версии появилось &lt;br /&gt;&lt;br /&gt;* Added support for interfaces and static/public/protected/private functions [PHP].&lt;br /&gt;&lt;br /&gt;Обновился, и все заработало! (правда .deb пакета не нашел, но скачал rpm пакет и сконвертировал db при помощи alien -d ctags-.5.7-i386.rpm&lt;br /&gt;&lt;br /&gt;Ниже скрин. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_dtE7gAM2uxk/RudmG7OLRuI/AAAAAAAAABY/ad53_AlanT4/s1600-h/vim_tagexporer_part.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_dtE7gAM2uxk/RudmG7OLRuI/AAAAAAAAABY/ad53_AlanT4/s320/vim_tagexporer_part.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5109164571437516514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Но не обошлось без ложки дегтя&lt;br /&gt;1. Методы показываются не в классе, а в функциях.&lt;br /&gt;2. Появляются совершенно непонятные методы, (некоретно парсятся phpdoc таги) &lt;br /&gt;&lt;br /&gt;Но все равно я доволен.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-3626995481873036942?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/3626995481873036942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=3626995481873036942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3626995481873036942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/3626995481873036942'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/ctags-vim.html' title='ctags &amp;&amp; vim'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dtE7gAM2uxk/RudmG7OLRuI/AAAAAAAAABY/ad53_AlanT4/s72-c/vim_tagexporer_part.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-4791124669549776895</id><published>2007-09-06T22:46:00.000-07:00</published><updated>2007-09-06T22:56:03.690-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Проблемы в php?</title><content type='html'>Наткнулся на непонятный баг (судя по всему php).&lt;br /&gt;Fedora Core 5, &lt;br /&gt;php 5.1.5.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Опсание&lt;/span&gt;&lt;br /&gt;Xdebug выдает&lt;br /&gt;(середина trace, до этого около сотни вызовов) &lt;br /&gt;0.0148     118816 -&gt; func1() /xxxx/template.php:16&lt;br /&gt;0.0148     118816 -&gt; func2() /xxx/template.php:16&lt;br /&gt;0.2626     118672 -&gt; func3() /xxx/splash.php:188&lt;br /&gt;0.2626     118672  -&gt; func4() /xxx/base.php:63&lt;br /&gt;(далее еще сотня вызовов) &lt;br /&gt;&lt;br /&gt;суммарное время выполнения - 0.3 &lt;br /&gt;&lt;br /&gt;около 300 вызовов. &lt;br /&gt;Сервер мощный. &lt;br /&gt;Каждый вызов - тысячные доли. &lt;br /&gt;Нет ни базы данных, ни сетевых операций, файловых (за исключением пожалуй инклюдов) &lt;br /&gt;Сервер один, не загружен, &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Поведение&lt;/span&gt;&lt;br /&gt;1. При перезагрузке страницы лаг в одном и том же месте. &lt;br /&gt;2. Изменение кода переносит лаг в другое место. &lt;br /&gt;3. При перезагрузке страницы лаг в том же месте. &lt;br /&gt;4. Тормозит по сути на любых функциях, ловил тормоза на echo, print, prin_r, microtime, join, split, и на своих фукциях&lt;br /&gt;5. Данных по сути нет. &lt;br /&gt;6. Страница просто выплевывает html через include()&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Перенес на локальную машину. &lt;br /&gt;Результат. &lt;br /&gt;&lt;/span&gt;Суммарное время выполнения 0.3 &lt;br /&gt;Каждая итерация занимает сотые доли, лага на 2 десятых не вижу. &lt;br /&gt;php 5.2. &lt;br /&gt;Есть подозрение что дело в мэнеджере памяти.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-4791124669549776895?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/4791124669549776895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=4791124669549776895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4791124669549776895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/4791124669549776895'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/php.html' title='Проблемы в php?'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-5605278159955717916</id><published>2007-09-06T22:30:00.000-07:00</published><updated>2007-09-06T22:56:41.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xdebug'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>php xdebug extension</title><content type='html'>Пока настраивается сервер, выдалась свободная минута.&lt;br /&gt;Уже полгода наталкивался на php extension xdebug.&lt;br /&gt;http://xdebug.org/&lt;br /&gt;Сначала использовал только tracer, причем у меня отрабатывала только функция xdebug_start_trace() но более ничего не делалось. Обнаружил что она возвращает имя файла куда кладется trace, собственно и начал использовать&lt;br /&gt;$tracer = xdebug_start_trace();&lt;br /&gt;echo '&amp;lt;pre&amp;gt';&lt;br /&gt;echo file_get_contents($tracer);&lt;br /&gt;Получается примерно следующее.&lt;br /&gt;.0042      94560     -&gt; require_once(file.php) /path/index.php:44&lt;br /&gt;0.0043      95984       -&gt; require_once(file2.php) /path/file.php:16&lt;br /&gt;0.0044      95808     -&gt; ClassName-&gt;__construct() /path/index.php:45&lt;br /&gt;&lt;br /&gt;Где первая строчка время, вторая память, далее метод(функция) путь, строка.&lt;br /&gt;&lt;br /&gt;Затем понадобился профайлер, ранее использовал zend_platform но trial закончился.&lt;br /&gt;Смотрим тот же xdebug&lt;br /&gt;http://www.xdebug.org/docs/profiler&lt;br /&gt;Настраиваем php.ini&lt;br /&gt;sudo apt-get install kcachegrind&lt;br /&gt;И все работает!.&lt;br /&gt;&lt;br /&gt;После этого я всерьез заинтересовался xdebug и захотелось собственно сам отладчик&lt;br /&gt;http://www.xdebug.org/docs/remote&lt;br /&gt;Поддерживаются ide:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://devphp.sf.net/"&gt;Dev-PHP&lt;/a&gt;&lt;/b&gt; (IDE: Windows)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Eclipse &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169408"&gt;plugin&lt;/a&gt;&lt;/b&gt;, which has been submitted as an enhancement for the &lt;a href="http://www.eclipse.org/php/"&gt;PDT&lt;/a&gt; (IDE).&lt;/li&gt;&lt;li&gt;ActiveState's &lt;b&gt;&lt;a href="http://activestate.com/products/komodo_ide/?src=AScom&amp;type=bn&amp;amp;X=HP&amp;campaign=KMD"&gt;Komodo&lt;/a&gt;&lt;/b&gt; (IDE: Windows, Linux, Mac).&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm"&gt;Notepad++&lt;/a&gt;&lt;/b&gt; &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=189927&amp;amp;package_id=236520"&gt;plugin&lt;/a&gt; (IDE: Windows).&lt;/li&gt;&lt;li&gt;WaterProof's &lt;b&gt;&lt;a href="http://www.waterproof.fr/products/PHPEdit/"&gt;PHPEdit&lt;/a&gt;&lt;/b&gt; (IDE, from version 2.10: Windows).&lt;/li&gt;&lt;li&gt;Anchor System's &lt;b&gt;&lt;a href="http://www.anchorsystems.co.jp/anchor/ashp/peggy/pegindex.html"&gt;Peggy&lt;/a&gt;&lt;/b&gt; (IDE: Windows, Japanese).&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://protoeditor.sourceforge.net/"&gt;Protoeditor&lt;/a&gt;&lt;/b&gt; (Editor: Linux).&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://tswebeditor.net.tc/"&gt;tsWebeditor&lt;/a&gt;&lt;/b&gt; (Editor: Windows).&lt;/li&gt;&lt;li&gt;Xored's &lt;b&gt;&lt;a href="http://www.xored.com/trustudio"&gt;TrueStudio IDE&lt;/a&gt;&lt;/b&gt; (IDE).&lt;/li&gt;&lt;li&gt;&lt;b&gt;VIM &lt;a href="http://www.vim.org/scripts/script.php?script_id=1929"&gt;plugin&lt;/a&gt;&lt;/b&gt; (&lt;a href="http://tech.blog.box.net/2007/06/20/how-to-debug-php-with-vim-and-xdebug-on-linux/"&gt;Tutorial&lt;/a&gt;) (Editor Plugin).&lt;/li&gt;&lt;li&gt;Maguma's &lt;b&gt;&lt;a href="http://www.maguma.com/products/?article=Workbench"&gt;WorkBench&lt;/a&gt;&lt;/b&gt; (IDE).&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://code.google.com/p/xdebugclient/"&gt;XDebugClient&lt;/a&gt;&lt;/b&gt; - Standalone Windows client&lt;/li&gt;&lt;/ul&gt;Так как Zend Studio  дорогой для меня продукт, я начал переходить на vim, соотвественно  заинтеросовала возможность интеграции отладчика в него.&lt;br /&gt;Глянул туториал http://tech.blog.box.net/2007/06/20/how-to-debug-php-with-vim-and-xdebug-on-linux/&lt;br /&gt;И все заработало - чудеса да и только :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-5605278159955717916?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/5605278159955717916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=5605278159955717916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5605278159955717916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/5605278159955717916'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/09/blog-post.html' title='php xdebug extension'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-8696006165928694038</id><published>2007-03-21T22:26:00.000-07:00</published><updated>2007-03-21T22:35:38.016-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shit'/><title type='text'>Первый пост</title><content type='html'>Первый пост ради теста&lt;br /&gt;Занес, глянул, а там уже тест то был :)&lt;br /&gt;Цель создания : скидывать неожиданные находки, мои личные открытия.&lt;br /&gt;Тематика :&lt;br /&gt;Книги&lt;br /&gt;Музыка&lt;br /&gt;web development (php, perl)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-8696006165928694038?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/8696006165928694038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=8696006165928694038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8696006165928694038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/8696006165928694038'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2007/03/blog-post.html' title='Первый пост'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8673849167023621130.post-480803228513160382</id><published>2006-12-19T02:03:00.001-08:00</published><updated>2006-12-19T02:03:21.969-08:00</updated><title type='text'>test</title><content type='html'>test&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8673849167023621130-480803228513160382?l=zadoev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zadoev.blogspot.com/feeds/480803228513160382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8673849167023621130&amp;postID=480803228513160382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/480803228513160382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8673849167023621130/posts/default/480803228513160382'/><link rel='alternate' type='text/html' href='http://zadoev.blogspot.com/2006/12/test.html' title='test'/><author><name>cd</name><uri>http://www.blogger.com/profile/14117454681183335904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_dtE7gAM2uxk/SPjDGnLXb9I/AAAAAAAAADc/m3wZg_XGaNE/S220/cd.jpg'/></author><thr:total>0</thr:total></entry></feed>
