<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Apple, iPhone, Ruby, Rails, Programming, web 2.0</description><title>[YS.PRO] :blog</title><generator>Tumblr (3.0; @yspro)</generator><link>http://blog.ys-pro.com/</link><item><title>Happy New Year!!!</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_leaza6u0pB1qa3cr8o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;strong&gt;Happy New Year!!!&lt;/strong&gt;&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/2543582852</link><guid>http://blog.ys-pro.com/post/2543582852</guid><pubDate>Fri, 31 Dec 2010 19:30:06 +0200</pubDate></item><item><title>Я салiдарны</title><description>&lt;p&gt;&lt;a target="_blank" href="http://dec19.org/"&gt;&lt;img height="361" width="510" src="http://pics.livejournal.com/111290/pic/000c9gwe"/&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/2449221083</link><guid>http://blog.ys-pro.com/post/2449221083</guid><pubDate>Fri, 24 Dec 2010 22:08:40 +0200</pubDate><category>electby</category></item><item><title>Delicious is closing... Simple backup your bookmarks</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_ldk9xrRvmT1qzmw0z.png"/&gt;&lt;script src="https://gist.github.com/744614.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/2346500029</link><guid>http://blog.ys-pro.com/post/2346500029</guid><pubDate>Fri, 17 Dec 2010 09:28:53 +0200</pubDate><category>delicious</category><category>backup</category><category>bookmarks</category></item><item><title>A successful Git branching model</title><description>&lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;A successful Git branching model&lt;/a&gt;</description><link>http://blog.ys-pro.com/post/1583233240</link><guid>http://blog.ys-pro.com/post/1583233240</guid><pubDate>Mon, 15 Nov 2010 22:10:45 +0200</pubDate><category>git</category></item><item><title>Easy handle multiple AuthLogic session controllers</title><description>&lt;p&gt;My Rails app using &lt;strong&gt;&lt;a title="AuthLogic" target="_blank" href="https://github.com/binarylogic/authlogic/"&gt;AuthLogic&lt;/a&gt;&lt;/strong&gt; to manage admin, moderator and user sessions(separate controller for each of role).&lt;br/&gt; So I created class method in application_controller.rb to avoid repeating of bunch of methods.&lt;/p&gt;
&lt;script src="https://gist.github.com/673996.js?file=application_controller.rb"&gt;&lt;/script&gt;&lt;p&gt;session_methods generates basic necessary controller methods for dealing with AuthLogic.&lt;br/&gt; Using:&lt;/p&gt;
&lt;script src="https://gist.github.com/674371.js?file=controllers.rb"&gt;&lt;/script&gt;&lt;p&gt;Tricky? Yep, authlogic session handling just became easier&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/1553425740</link><guid>http://blog.ys-pro.com/post/1553425740</guid><pubDate>Fri, 12 Nov 2010 19:23:17 +0200</pubDate><category>authlogic</category><category>rails</category><category>ruby</category><category>session</category></item><item><title>MongoMapper timestamps in Embedded Document</title><description>&lt;p&gt;&lt;script src="https://gist.github.com/667549.js?file=gistfile1.rb"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/1514982255</link><guid>http://blog.ys-pro.com/post/1514982255</guid><pubDate>Mon, 08 Nov 2010 12:18:47 +0200</pubDate><category>mongomapper</category><category>mongodb</category><category>tips</category><category>ruby</category></item><item><title>Странный баг в GNOME</title><description>&lt;p&gt;Ситуация - ноутбук с ubuntu 10.04 был включен и находился примерно 40 минут в пассивном состоянии, тобишь я к нему не притрагивался. Потребовалось залезть в винду, для чего быстрым движением мыши кликнул в трее (хз как его называть в убунте) панели задач на значок выключения и в меню выбрал Restart. Появилось сообщение а действительно ли я хочу этого, а потом через считанные доли секунд экран заблокировался. Вот ведь незадача, я мог и успеть нажать на YES. Почему сразу во время движения мыши не сработала блокировка системы?&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/1312728343</link><guid>http://blog.ys-pro.com/post/1312728343</guid><pubDate>Thu, 14 Oct 2010 15:13:29 +0300</pubDate><category>ubuntu</category><category>bug</category><category>gnome</category></item><item><title>MySQL бэкап с отправкой по sftp используя ruby</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l1ei3wdwWZ1qzmw0z.png"/&gt;&lt;/p&gt;
&lt;p&gt;Накидал простой скриптик на &lt;a title="Ruby Programming Language" target="_blank" href="http://www.ruby-lang.org/en/"&gt;&lt;strong&gt;ruby&lt;/strong&gt;&lt;/a&gt; для резервного копирования баз и последующей отправки на удаленный хост по &lt;a title="ssh file transfer protocol" target="_blank" href="http://en.wikipedia.org/wiki/SSH_file_transfer_protocol"&gt;sftp&lt;/a&gt; протоколу. Все просто - перечисляем базы и параметры доступа к ним, указываем параметры для доступа к удаленному серверу. Дампы хранятся в формате названиеБД_dump_дд-мм-гггг.sql.gz (например &lt;strong&gt;wiki_dump_25-04-2010.sql.gz&lt;/strong&gt;)&lt;/p&gt;
&lt;script src="http://gist.github.com/377961.js"&gt;&lt;/script&gt;</description><link>http://blog.ys-pro.com/post/546418437</link><guid>http://blog.ys-pro.com/post/546418437</guid><pubDate>Sun, 25 Apr 2010 00:54:24 +0300</pubDate><category>mysql</category><category>backup</category><category>ruby</category><category>sftp</category><category>db</category></item><item><title>MySQL dump с FK без проблем</title><description>&lt;p&gt;&lt;img height="291" width="399" alt="mysql logo" src="http://wiki.realxtend.org/images/2/2f/Logo-mysql.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;Иногда случается так, что вам нужно импортировать дамп InnoDB базы, в которой есть constraints и первыми в дампе идут таблицы собственно с внешними ключами. В таком случае импорт не будет успешным и операция прервется из-за ошибки. Чтобы этого избежать необходимо добавить в дамп всего лишь 2 строки:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SET foreign_key_checks = 0;&lt;/strong&gt;&lt;br/&gt;&lt;em&gt;dump statements&amp;#8230;&lt;/em&gt;&lt;br/&gt;&lt;strong&gt;SET foreign_key_checks = 1;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;На время импорта мы просто выключаем проверку внешних ключей. Успешного импорта! )&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/472574090</link><guid>http://blog.ys-pro.com/post/472574090</guid><pubDate>Thu, 25 Mar 2010 16:24:37 +0200</pubDate><category>mysql</category><category>fk</category><category>dump</category><category>import</category><category>db</category></item><item><title>sfDoctrineApplyPlugin problems</title><description>&lt;p&gt;&lt;img height="122" width="448" src="http://media.tumblr.com/tumblr_kyh4r7WwrI1qzmw0z.gif"/&gt;&lt;/p&gt;
&lt;p&gt;Если у вас возникли проблемы при работе с плагином &lt;b&gt;sfDoctrineApplyPlugin&lt;/b&gt;, почитайте &lt;a href="http://forum.symfony-project.org/index.php/mv/tree/25217/"&gt;этот&lt;/a&gt; топик.&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/435524901</link><guid>http://blog.ys-pro.com/post/435524901</guid><pubDate>Tue, 09 Mar 2010 01:45:13 +0200</pubDate><category>symfony</category><category>php</category><category>plugin</category></item><item><title>symfony - xml sitemap generation</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_kyh4r7WwrI1qzmw0z.gif" width="448" height="122"/&gt;&lt;/p&gt;
&lt;p&gt;Довольно часто в проекте необходимо реализовать генерацию &lt;a title="xml sitemap" target="_blank" href="http://www.sitemaps.org/"&gt;xml-sitemap&lt;/a&gt; карты. Это необходимо для того, чтобы поисковым машинам было легче проиндексировать ваш сайт. В &lt;b&gt;symfony&lt;/b&gt; я всегда эту задачу возлагал на &lt;b&gt;task&lt;/b&gt;, который ставится на &lt;b&gt;cron&lt;/b&gt; и с периодичностью скажем каждые 1-2 дня запускается и делает свое дело, никому не мешая.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;В текущем рабочем проекте требовалось создать немаленькую карту (~ 250&amp;#160;000 ссылок), поэтому пришлось делать индекс файл - &lt;b&gt;sitemap_index.xml&lt;/b&gt;,который содержит ссылки на отдельные &lt;b&gt;sitemap.xml &lt;/b&gt;(sitemap1.xml, sitemap2.xml, &amp;#8230; , sitemapN.xml) файлы.&lt;/p&gt;
&lt;p&gt;Алгоритм вообщем-то обкатанный и простой:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;в бесконечном while() цикле делаем выборку из N записей (в моем случае 100) с id &amp;gt; $id и сортируем по id ASC, где $id - переменная для хранения последнего наибольшего id&lt;/li&gt;
&lt;li&gt;если запрос возвращает пустую коллекцию - делаем break иначе проходим &lt;b&gt;foreach&lt;/b&gt;&amp;#8216;ем по коллекции и генерим карту&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;i&gt;ясное дело еще надо проверять количество ссылок и размер файла (см. &lt;a title="xml sitemap protocol" target="_blank" href="http://www.sitemaps.org/"&gt;протокол&lt;/a&gt;) и при необходимости писать в новые файлы, сжимать gzip&amp;#8217;ом и т.д. и т.п.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Написал, запускаю&amp;#8230; получаю &lt;span&gt;&lt;b&gt;PHP Fatal error: Allowed memory size of N bytes exhausted (tried to allocate M bytes) in /very/secret/script.php&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Удивило, потому как на dev машинке выделено больше гига оперативки под &lt;b&gt;cli php&lt;/b&gt;. Вставил вызов функции &lt;a target="_blank" href="http://www.php.net/manual/en/function.memory-get-usage.php"&gt;memory_get_usage(TRUE)&lt;/a&gt; чтобы показывала каждые 50 итераций цикла сколько потребляется памяти. Как оказалось, на каждой итерации улетучивалось в неизвестные края 250 КБ. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;=======================&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;ПОПЫТКИ ОПТИМИЗАЦИИ&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;&lt;br/&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;Попытка РАЗ.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Удаление переменных вызовом unset($var)&amp;#8230; Например получив коллекцию объектов и выполнив цикл foreach() удаляем ее, т.к. она нам уже в этой итерации не понадобится.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;К сожалению к желаемым результатам это не привело, экономия мизерной оказалась (хотя для попытки номер три эти вызовы явно не лишними оказались).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;Попытка ДВА.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Вызов метода free() для &lt;b&gt;Doctrine_Collection&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Потребление памяти заметно снизилось, но все равно &amp;#8220;кушалось&amp;#8221; дай бог (350-380 МБ).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;Попытка ТРИ&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Использование чистого &lt;b&gt;PDO&lt;/b&gt; вместо &lt;b&gt;Doctrine&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Потребление снизилось до 25 мегабайт.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;=======================&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Выводы: если вам требуется производить в цикле много запросов к БД используйте &lt;b&gt;PDO&lt;/b&gt;, это существенно экономит память.&lt;/span&gt;&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/428749029</link><guid>http://blog.ys-pro.com/post/428749029</guid><pubDate>Fri, 05 Mar 2010 22:04:00 +0200</pubDate><category>symfony</category><category>cron</category><category>task</category><category>pdo</category><category>php</category><category>xml</category><category>sitemap</category></item><item><title>symfony - global partials and custom partial_view_class</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_kyh4r7WwrI1qzmw0z.gif"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Symfony&lt;/b&gt; - is the best and only PHP framework для меня, с версией 2.0 нас ждет много вкусностей и полезностей, но пока не об этом.&lt;/p&gt;
&lt;p&gt;Возникла задача написать движок с определенной (отличающейся от привычной нам симфониевской) структурой директорий и поддержкой тем (об этом попозже пост напишу). Дерево папок настроил как надо, переопределил классы для отображений и партиалов. Подвох меня ожидал, когда возникла задача вставить глобальный partial, например &lt;i&gt;include_partial(&amp;#8216;global/header&amp;#8217;)&lt;/i&gt;, нужный файлик просто не находился и бросался exception. Не находился потому что мой дочерний класс, определенный в &lt;b&gt;module.yml&lt;/b&gt; не участвовал в этом, а использовался дефолтный &lt;b&gt;sfPartialView&lt;/b&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; Полез в API доки, посмотрел сорцы, создал &lt;a title="тикет с патчем" target="_blank" href="http://trac.symfony-project.org/ticket/8354"&gt;тикет с патчем&lt;/a&gt;. Проблема возникала из-за того, что &lt;i&gt;global&lt;/i&gt; воспринимался как название модуля. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;P.S.: огорчает что нельзя определить тот же view_class на уровне приложения&lt;/p&gt;
&lt;p&gt;P.P.S.: мое решение подходит лишь для случая когда вы используете свои классы для View и Partial для всех модулей&lt;/p&gt;
&lt;p&gt;&lt;b&gt;UPD 01.03.2010:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;некорректно работает с компонентами, потому что при создании кеша конфига может случиться ситуация, что кеш module.yml какого-то модуля еще не создан&lt;/p&gt;</description><link>http://blog.ys-pro.com/post/414223349</link><guid>http://blog.ys-pro.com/post/414223349</guid><pubDate>Sat, 27 Feb 2010 02:35:00 +0200</pubDate><category>symfony</category><category>enhancement</category><category>partial</category></item></channel></rss>

