<?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-4003278278600033478</id><updated>2011-12-30T11:22:03.904+02:00</updated><category term='ruby'/><category term='fuck'/><category term='wiki'/><category term='podcast'/><category term='javascript'/><category term='Perl poetry'/><category term='news'/><category term='developers.org.ua'/><category term='perl'/><category term='perlmova2009'/><category term='काताल्य्स्त'/><category term='benchmark'/><category term='regexp'/><category term='SQLite'/><category term='укртелеком'/><category term='скутеры'/><category term='wtf'/><category term='monkey patch'/><category term='юмор'/><category term='Perl Mova'/><category term='ASP.NET'/><category term='test'/><category term='например'/><category term='NYTProf'/><category term='python'/><category term='Перл'/><category term='ORM'/><category term='rss'/><category term='video'/><category term='windows'/><category term='catalyst'/><category term='webdev'/><category term='Ruby on Rails'/><category term='cmd'/><category term='SQL::Translator'/><category term='gantry'/><category term='CakePHP'/><category term='perl future moose catalyst'/><category term='MySQL'/><category term='english'/><category term='php'/><category term='фреймворк'/><category term='programming'/><category term='deployment'/><category term='engine'/><category term='user perl or die'/><category term='mojo'/><category term='wishmaker'/><category term='web framework'/><category term='links'/><category term='goto'/><category term='необъяснимо'/><category term='C#'/><category term='mvc'/><category term='ынтырнет'/><category term='Far East Perl Workshop'/><category term='android'/><category term='cgi'/><category term='moose'/><category term='sql'/><category term='осень'/><category term='Django'/><category term='отпуск'/><category term='движок'/><category term='features'/><category term='Perl 6'/><category term='database designer'/><category term='cpp'/><title type='text'>bless $this, Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-8069575288715129176</id><published>2011-10-20T13:05:00.000+03:00</published><updated>2011-10-20T13:05:05.989+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cmd'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Слив локального DNS кэша</title><content type='html'>&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;Когда таскаешь свою ноут со всякими Ораклами, сайтами на &lt;/span&gt;IIS&lt;span lang="RU" style="mso-ansi-language: RU;"&gt; и т.д. по разным сетям, &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;То команда:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;&lt;strong&gt;ipconfig /flushdns&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="RU" style="mso-ansi-language: RU;"&gt;просто спасает жизнь.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-8069575288715129176?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/8069575288715129176/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2011/10/dns.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8069575288715129176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8069575288715129176'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2011/10/dns.html' title='Слив локального DNS кэша'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-3610919837789820713</id><published>2009-11-26T18:21:00.000+02:00</published><updated>2009-11-26T18:23:26.899+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fuck'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl’овщики – самые сквернословные среди программистов</title><content type='html'>&lt;div align="center"&gt;Вот так вот, даже круче чем Сишники ;)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i.imgur.com/ng5aS.png" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-3610919837789820713?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/3610919837789820713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/3610919837789820713'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/11/perl.html' title='Perl’овщики – самые сквернословные среди программистов'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-7291845446508831086</id><published>2009-11-14T15:46:00.003+02:00</published><updated>2009-11-14T16:16:43.208+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Subtitle mixer</title><content type='html'>Я изучаю английский… нет, я думаю, что изучаю английский, просматривая англоязычные фильмы с английскими субтитрами. Кроме на глубокого эстетического наслаждения, от этого все таки есть эффект: я стал лучше воспринимать слова на слух.&lt;br /&gt;Но, есть одна проблема: иногда встречаются слова, значения которых я не знаю, и лежа не диванчике, очень не хочется останавливать фильм и искать слово в словаре.&lt;br /&gt;&lt;br /&gt;Для решения этой проблемы, я очень быстро создал скрипт на Perl, который переводит и смешивает субтитры через Google Translate с английского языка на русский. Таким образом, сверху у меня есть английский вариант – а снизу – машинный русский перевод.&lt;br /&gt;&lt;br /&gt;Выглядит примерно так:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;132&lt;br /&gt;00:09:28,680 --&gt; 00:09:32,615&lt;br /&gt;Call me back?&lt;br /&gt;Yeah, yeah. You, too.&lt;br /&gt;Перезвоните мне? Да, да. Ты тоже.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Скрипт сырой и не доработанный, и для перевода каждой реплики делается отдельный запрос на Google Translate, поэтому работает долго. Но, мою проблему он пока решил и дорабатывать скрипт я не планирую.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для запуска меняем значение переменной $source_file на исходный английский файл субтитров.&lt;br /&gt;&lt;blockquote&gt;my $langpair = "en|ru";&lt;br /&gt;my $dest_text = "";&lt;br /&gt;my $source_file = '&lt;span style="font-weight:bold;"&gt;State.Of.Play.2009.DvDRip-FxM.srt&lt;/span&gt;';&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;А output редиректим на целевой файл:&lt;br /&gt;perl subtitle_mixer.pl &gt; my_State.Of.Play.2009.DvDRip-FxM.srt&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/dzhariy/home/mixer/subtitle_mixer.zip"&gt;Ссылка на исходные коды скрипта&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-7291845446508831086?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='' href='http://sites.google.com/site/dzhariy/home/mixer/subtitle_mixer.zip' length='0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7291845446508831086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7291845446508831086'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/11/subtitle-mixer.html' title='Subtitle mixer'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-4661068544174295786</id><published>2009-10-22T23:43:00.001+03:00</published><updated>2009-10-22T23:47:01.178+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='goto'/><title type='text'>Perldoc и чувство юмора ;)</title><content type='html'>Как показывают наблюдения, с чувством юмора на Perldoc все в норме :)&lt;br /&gt;Вот такой вот &lt;a href="http://perldoc.perl.org/index-functions.html#G"&gt;дескрипшен для оператора goto&lt;/a&gt;: &lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2505/4035736636_1f92ddac5e_o.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-4661068544174295786?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4661068544174295786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4661068544174295786'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/10/perldoc.html' title='Perldoc и чувство юмора ;)'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-8449399978644780594</id><published>2009-08-24T21:39:00.003+03:00</published><updated>2009-08-24T21:46:18.367+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Поддержка Perl будет добавлена в Google Android</title><content type='html'>&lt;img src="http://farm3.static.flickr.com/2647/3853436488_8885871c60_t.jpg" align="right"&gt;Как сообщает &lt;a href="http://perlbuzz.com/"&gt;PerlBuzz&lt;/a&gt;, поддержка Perl будет добавлена в операционную систему для мобильных телефонов – &lt;a href="http://ru.wikipedia.org/wiki/Android"&gt;Android&lt;/a&gt;. &lt;br /&gt;Запрос на добавление Perl &lt;a href="http://code.google.com/p/android-scripting/issues/detail?id=32"&gt;уже был принят (FIXED)&lt;/a&gt;. И &lt;a href="http://code.google.com/p/android-scripting/source/browse/#hg/perl"&gt;код для поддержки Perl&lt;/a&gt; уже был добавлен в ветку разработки ASE (Android Scripting Environment). Это означает то, что со следующей стабильной версией ASE мы увидим поддержку Perl. &lt;br /&gt;&lt;br /&gt;Подробнее можно прочитать тут: &lt;br /&gt;&lt;a href="http://perlbuzz.com/2009/08/perl-coming-to-android-phones.html"&gt;PerlBuzz :: Perl coming to Android phones&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-8449399978644780594?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8449399978644780594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8449399978644780594'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/08/perl-google-android.html' title='Поддержка Perl будет добавлена в Google Android'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2647/3853436488_8885871c60_t.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-6250911821460466</id><published>2009-08-24T02:05:00.004+03:00</published><updated>2009-08-24T02:08:45.373+03:00</updated><title type='text'>A Href / Codepad - Online компилятор/интерпретатор кода</title><content type='html'>&lt;p&gt;Хочу поделиться ссылкой на интересный сервис – &lt;a href="http://codepad.org/"&gt;Codepad&lt;/a&gt;, который умеет компилировать/интерпретировать код онлайн. Я попытался повесить сервис при помощи простеньких скриптиков на Perl – по не получилось. А еще говорят, что Перл «опасный» и «не контролируемый» – это бред.&lt;/p&gt;&lt;p align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JFz5Cnq_TQ0/SpHLvNjPgdI/AAAAAAAAAGk/h26JUbg5Ngk/s1600-h/codepad.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 282px;" src="http://3.bp.blogspot.com/_JFz5Cnq_TQ0/SpHLvNjPgdI/AAAAAAAAAGk/h26JUbg5Ngk/s400/codepad.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5373299842381480402" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-6250911821460466?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/6250911821460466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/6250911821460466'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/08/href-codepad-online.html' title='A Href / Codepad - Online компилятор/интерпретатор кода'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_JFz5Cnq_TQ0/SpHLvNjPgdI/AAAAAAAAAGk/h26JUbg5Ngk/s72-c/codepad.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-1433943275207266537</id><published>2009-06-16T23:21:00.002+03:00</published><updated>2009-06-16T23:24:35.250+03:00</updated><title type='text'>Блин, прикольная штука этот Джуик</title><content type='html'>Я так себе раньше думал: есть твиттер, а все остальное – это клоны. Но, нет вот Джуик – это не клон твиттера, хоть и сервис микроблогинга. &lt;br /&gt;Смысл в чем, работать с ним можно только через Jabber,  через ваш любимый мессанджер. Постыть, читать, подписываться и удалять заметки можно только из своего мессанджера, по средствам специальных команд, &lt;a href="http://juick.com/help/"&gt;читайте хелп&lt;/a&gt;. &lt;br /&gt;Многие люди просто записывают какие-то заметки, которые не хотеться забывать и не жалко поделаться с общественностью, &lt;a href="http://juick.com/dzhariy/"&gt;я же пока пишу всякий бред&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Кому интересно, валкам на Джуик:  &lt;a href="http://juick.com/"&gt;http://juick.com/&lt;/a&gt;&lt;br /&gt;Вот такой микропост про микроблог :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-1433943275207266537?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1433943275207266537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1433943275207266537'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/06/blog-post.html' title='Блин, прикольная штука этот Джуик'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-866207779556455885</id><published>2009-06-10T00:38:00.002+03:00</published><updated>2009-06-10T00:44:46.580+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>От нашего Гуглридера – Вашему. RSS-ки по Perl</title><content type='html'>Решил почистить свой гуглридер. Выживут только самые интересные, и тогда живые RSS-ки позавидуют мертвым (мда… что-то меня понесло). &lt;br /&gt;&lt;br /&gt;RSS ленты, посвященные разработке на языке Perl:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://our.coldhardcode.com/jshirley/ "&gt;jshirley&lt;/a&gt;&lt;br /&gt;Интересный блог Perl разработчика, пишет на Perl, использует Catalyst. Интересный блог, заслуживающий быть упомянутым первым. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nabble.com/Catalyst-Web-Framework-f19245.html"&gt;Catalyst Web Framework mailing list&lt;/a&gt;&lt;br /&gt;Пожалуй, самый удобны аггрегатор почтовых рассылок. Пока что я этот сервис использую только для чтения рассылок по Catalyst.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://perlbuzz.com/"&gt;$perl-&gt;buzz&lt;/a&gt;&lt;br /&gt;Один из немногих крупных и популярных ресурсов для Перл разработчика. Регулярно публикуют интересные новостные посты. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.onemogin.com/blog/"&gt;One Mo’ Gin &lt;/a&gt;&lt;br /&gt;Заметки про Perl, Catalyst, разработчик Chart::Clicker. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.webquills.net/scroll/"&gt;Scroll - Webquills.net: Better Perl for a Better Web&lt;/a&gt;&lt;br /&gt;Perl и веб разработка на Перл. Интересные посты про различные фишечьки языка, фреймворки и прочие. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://amazing-perl.blogspot.com/"&gt;Amazing Perl&lt;/a&gt;&lt;br /&gt;Интересные эксперименты и исследования, вместе с извращениями над языком Perl. Интересно почитать для тех, кому хочется узнать, что можно делать с Perl’ом по назначению и не только. ( // какую-то фигню написал :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infinityperl.org/"&gt;Infinity Perl&lt;/a&gt;&lt;br /&gt;Как пишет сам автор: Infinity Perl : slack-get, Perl, Qt, KDE, Open source, etc. что еще можно добавить?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://usestrict.net/"&gt;use strict ;#)&lt;/a&gt;&lt;br /&gt;Да, да! Первое правило Перловщега! Всегда use strict; :)&lt;br /&gt;Кроме того это хороший ресурс, известный своими Perl Crash Course’ами по различным языковым аспектам. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://perlsphere.net/"&gt;Perlsphere&lt;/a&gt;&lt;br /&gt;Аггрегатор Перловых блогов. Кучка хороших, качественных блогов для Перл разработчиков. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://ironman.enlightenedperl.org/"&gt;Planet Perl Iron Man&lt;/a&gt;&lt;br /&gt;Не просто кучка, а аггрегатор огромной куу-у-учищи перловых блогов :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://zag.ru/"&gt;zag's personal blog&lt;/a&gt;&lt;br /&gt;Стоит подписаться только потому, что этот человек знает как сбилдать Rakudo под FreeBSD. ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rjbs.manxome.org/rubric"&gt;Rubric: rjbs's entries with a body&lt;/a&gt;&lt;br /&gt;Около линуксовые, околожизненные и околоперловые заметки. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://perlmonks.org.ru/vorota_v_perl/"&gt;::Ворота в Perl::&lt;/a&gt;&lt;br /&gt;Русскоязычный качественный блог по Perl. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.netcubed.de/"&gt;netCUBED Blog&lt;/a&gt;&lt;br /&gt;Блог по веб-разработке на Perl, базам данных, DBIC, Catalyst и как это все делать под Mac ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.shadowcat.co.uk/"&gt;Shadowcat Systems Limited&lt;/a&gt;&lt;br /&gt;Это самый энергичный Perl-разработчик :). Вы бы видели записи его видео докладов :))&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jackal.in/"&gt;Блог Джакала&lt;/a&gt;&lt;br /&gt;Русскоязычный блог по разработке на Perl и Catalyst&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sial.org/blog/"&gt;Jeremy Mates’s Blog&lt;/a&gt;&lt;br /&gt;Блог Perl-разработчика. Пишет про самые различные аспекты программирования на Perl. Блог ведет и июля 2006-го года, интересных материалов – куча. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lumberjaph.net/blog/"&gt;i’m a lumberjaph&lt;/a&gt;&lt;br /&gt;Фух, сколько же этих Перловщиков. Задолбываюсь писать одно и тоже :). &lt;br /&gt;Но, и это не исключение, да, блог перл-разработчика. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://perlid.blogspot.com/"&gt;Perl Ideas&lt;/a&gt;&lt;br /&gt;Да, да, вы не поверите, но это еще один блог Perl-разработчика. Интересные посты и совету по программированию на языке Perl. &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/4003278278600033478-866207779556455885?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/866207779556455885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/866207779556455885'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/06/rss-perl.html' title='От нашего Гуглридера – Вашему. RSS-ки по Perl'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-1907535079111615433</id><published>2009-06-08T23:11:00.002+03:00</published><updated>2009-06-08T23:16:16.879+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Видео доклады по Perl, Linux, FreeBSD, СУБД на FOSSLC</title><content type='html'>Только что нашел замечательный ресурс -- FOSSLC  (Free and Open Source Software Learning Center), содержащий бесплатные видео доклады по веб программированию, *nix’овым Осям, работе с базами данных. &lt;br /&gt;Ресурс англоязычный, но так как доклады технической тематики, то все прекрасно понятно. &lt;br /&gt;Формат представления презентации мне показался очень удобным, так как вместе с фейсом докладчика, синхронно идут слайды презентации, кроме того, можно перемещается на произвольный слайд. &lt;br /&gt;Выглядит так: &lt;br /&gt;&lt;center&gt;&lt;a href="http://hosting3.epresence.tv/fosslc/1/watch/153.aspx"&gt;&lt;img src="http://farm4.static.flickr.com/3412/3608661214_d5ec2c886d.jpg?v=0" border="0"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;Ссылка на список докладов:&lt;br /&gt;&lt;a href="http://hosting3.epresence.tv/fosslc/1.aspx"&gt;http://hosting3.epresence.tv/fosslc/1.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-1907535079111615433?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1907535079111615433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1907535079111615433'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/06/perl-linux-freebsd-fosslc.html' title='Видео доклады по Perl, Linux, FreeBSD, СУБД на FOSSLC'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-6236293933340996268</id><published>2009-05-27T22:53:00.002+03:00</published><updated>2009-05-27T22:56:02.072+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='cgi'/><title type='text'>Почему на Catalyst так не рекомендуют использовать под голый CGI</title><content type='html'>Вот около месяц назад решил заняться своим блогом. Хотел написать его на Catalyst и разместить на дешевом хостинге, который у меня уже есть. Просто ради того, чтобы написать что-то на Catalyst под CGI. &lt;br /&gt;&lt;br /&gt;Я думал как, напишу сейчас небольшой собственный движок для блога, за это время добавлю в него контента, а к этому времени уже и на более приличный хостинг можно будет потратиться, и тогда, не переписывая код моего движка мне можно будет запустить его и под FastCGI, ведь Catalyst, собственно спроектирован для работы в многопоточном  режиме, а однопоточный – это как частный случай многопоточного (ух, закрутил). &lt;br /&gt;Но, не тут то было. &lt;br /&gt;&lt;br /&gt;Во-первых, Catalyst жрет много ресурсов и времени при инициализации. В CGI режиме эта инициализация проходит при каждом запросе – в многопоточном (FCGI/Mod_perl), в зависимости от настроек, может происходить вообще один раз только при старте приложения. Ну, да ладно, к этому я был готов. &lt;br /&gt;&lt;br /&gt;Во-вторых, как следствие из первого пункта, мне пришлось отказаться от моих любимых модулей в пользу менее ресурсоемких, и это было первой каплей. Ну ладно, можно смирится. &lt;br /&gt;&lt;br /&gt;В третьих, оказалось, что мое приложение, работающие в режиме CGI, инициализировалось при каждом запросе. Похоже на пункт один :). Но, при каждом запросе любой картинки, или другого статического файла. Соответственно, при запросе каждой картинки инициализировался не только Catalyst, но и новое соединение с БД, после чего мой MySQL сервер куда-то уходил :(. Это можно было исправить, но было последней каплей. Под CGI на Catalyst писать нельзя.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-6236293933340996268?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/6236293933340996268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/6236293933340996268'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/05/catalyst-cgi.html' title='Почему на Catalyst так не рекомендуют использовать под голый CGI'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-8499465947379517617</id><published>2009-05-14T13:50:00.002+03:00</published><updated>2009-05-14T13:59:52.812+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Простой RSS аггрегатор на Perl + Catalyst</title><content type='html'>Очень интересная серия статей про то, как создать простой аггрегатор на Perl и Catalyst:&lt;br /&gt;&lt;div style="border-left: 3px solid silver; margin-left: 15px; padding-left: 8px;"&gt;&lt;br /&gt;Following &lt;a href="http://www.shadowcat.co.uk/blog/matt-s-trout/iron-man/"&gt;matt’s post&lt;/a&gt; about people not blogging enough about Perl, I’ve decided to try to post once a week about Perl. So I will start by a series of articles about what we call modern Perl. For this, I will write a simple feed agregator (using &lt;a href="http://search.cpan.org/%7Edrolsky/Moose-0.75/lib/Moose.pm"&gt;Moose&lt;/a&gt;, &lt;a href="http://search.cpan.org/%7Eribasushi/DBIx-Class-0.08101/lib/DBIx/Class.pm"&gt;DBIx::Class&lt;/a&gt;, &lt;a href="http://search.cpan.org/%7Enuffin/KiokuDB-0.27/lib/KiokuDB.pm"&gt;KiokuDB&lt;/a&gt;), some tests, and a basic frontend (with &lt;a href="http://search.cpan.org/%7Eflora/Catalyst-Runtime-5.80002/lib/Catalyst.pm"&gt;Catalyst&lt;/a&gt;). This article will be split in four parts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://lumberjaph.net/blog/index.php/2009/04/27/a-simple-feed-aggregator-with-modern-perl-part-1/"&gt;the first one&lt;/a&gt; will explain how to create a schema using &lt;span style="font-weight: bold;"&gt;DBIx::Class&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lumberjaph.net/blog/index.php/2009/04/28/a-simple-feed-aggregator-with-modern-perl-part-2/"&gt;the second&lt;/a&gt; will be about the aggregator. I will use &lt;span style="font-weight: bold;"&gt;Moose&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;KiokuDB&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lumberjaph.net/blog/index.php/2009/05/06/a-simple-feed-aggregator-with-modern-perl-part-3/"&gt;the third&lt;/a&gt; one will be about writing tests with &lt;span style="font-weight: bold;"&gt;Test::Class&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lumberjaph.net/blog/index.php/2009/05/13/a-simple-feed-aggregator-with-modern-perl-part-4/"&gt;the last one&lt;/a&gt; will focus on &lt;span style="font-weight: bold;"&gt;Catalyst&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Вот что получилось:&lt;br /&gt;&lt;img src="http://lumberjaph.net/blog/wp-content/uploads/2009/05/show_entry.png"&gt;&lt;br /&gt;&lt;br /&gt;Исходный код сего творения можно скачать с github: &lt;a href="http://github.com/franckcuny/ironman-myfeedreader/tree/master"&gt;http://github.com/franckcuny/ironman-myfeedreader/tree/master&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-8499465947379517617?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8499465947379517617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8499465947379517617'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/05/rss-perl-catalyst.html' title='Простой RSS аггрегатор на Perl + Catalyst'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-5484445949657484288</id><published>2009-05-13T20:26:00.002+03:00</published><updated>2009-05-13T20:35:53.544+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moose'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Заметка про Moose на Хабре</title><content type='html'>Только что опубликовал &lt;a href="http://habrahabr.ru/blogs/perl/59512/"&gt;заметку про Moose на Хабре&lt;/a&gt;. &lt;br /&gt;Перед публикацией, решил заменить слова &lt;span style="font-style:italic;"&gt;члены-переменные&lt;/span&gt; на &lt;span style="font-style:italic;"&gt;свойства&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;Весело было искать члены в заметке: ;)&lt;br /&gt;&lt;center&gt;&lt;img src="http://farm3.static.flickr.com/2189/3528995400_38a0b7b4eb_o.png"&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-5484445949657484288?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5484445949657484288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5484445949657484288'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/05/moose.html' title='Заметка про Moose на Хабре'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-8387936291844846629</id><published>2009-05-13T01:37:00.002+03:00</published><updated>2009-05-13T01:39:30.871+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Юмор /  Perl делает людей счастливыми ;)</title><content type='html'>Да, прямо как наркотик :) &lt;br /&gt;По результатам одного твитерологичеческого исследования, было установлено, что люди, программирующие на Perl самые счастливые ;)&lt;br /&gt;&lt;a href="http://blog.doloreslabs.com/2009/05/the-programming-language-with-the-happiest-users/"&gt;The Programming Language with the Happiest Users&lt;/a&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img src="http://assets.doloreslabs.com/images/LangSent.png"&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Читая этот пост, наткнулся на еще одну писькомерку языков программирования:&lt;br /&gt;&lt;a href="http://langpop.com/"&gt;Programming Language Popularity&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-8387936291844846629?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8387936291844846629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8387936291844846629'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/05/perl.html' title='Юмор /  Perl делает людей счастливыми ;)'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-2022942177940427249</id><published>2009-05-12T20:13:00.000+03:00</published><updated>2009-05-12T20:14:31.002+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>A href / Полезные RSS ленты для Perl программиста</title><content type='html'>Примерно месяц–полтора началось блоггерсоке соревнование IronMan. Смысл – публиковать новые материалы про Perl,  которые будут аггрегироватся в одной ленте. &lt;br /&gt;Посмотреть и подписаться можно тут:  &lt;a href="http://ironman.enlightenedperl.org/"&gt;Planet Perl Iron Man&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;И еще один полезный аггрегатор: &lt;a href="http://perlsphere.net/"&gt;Perlsphere&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-2022942177940427249?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2022942177940427249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2022942177940427249'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/05/href-rss-perl.html' title='A href / Полезные RSS ленты для Perl программиста'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-8956508998006851208</id><published>2009-04-19T13:39:00.001+03:00</published><updated>2009-04-19T13:44:17.044+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moose'/><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Вот и вышел Catalyst 5.8001</title><content type='html'>В данном случае, это очень значимый релиз, который, я думаю, может определить дальнейшее развитие фреймворка. &lt;a href="http://search.cpan.org/perldoc?Catalyst::Runtime"&gt;Это стабильный релиз, который уже доступен на CPAN&lt;/a&gt;. &lt;br /&gt;В основном, отличие ветки 5.8 от предыдущей 5.7 в том, что все модули пакета Catalyst-Runtime были переписаны под &lt;a href="http://search.cpan.org/dist/Moose/"&gt;Moose – ООП расширение для Perl 5&lt;/a&gt;, которое делает его похожем на будущей 6-й Перл. &lt;br /&gt;Я сам немного скептически отношусь к Moose. С одной стороны, на нем пишется четкий и понятный код, он более декларативный, сравнительно с родным Перловым ООП, но с другой стороны, он не родной для 5-го Перла, книг, даже англоязычных, по нему нет, и приходится изучать по слайдам, туториалам, и тестам. &lt;br /&gt;Но, чтобы использовать Catalyst 5.8, вам не нужно изучать Moose. Moose обеспечивает полную обратную совместимость с родным Перловым ООП. А значит, и новый Catalyst совместим с вашим уже существующим кодом. &lt;br /&gt;По сути, это тоже самое, что и старое доброе Перловое ООП, но засыпанное кучей синтаксического сахара. &lt;br /&gt;Единственный негативный момент – это зависимости. Да, если вы будете требовать в своем приложении Catalyst 5.8, то он потянет за собой довольно таки не маленький Moose. &lt;br /&gt;С другой стороны, если вы будете &lt;a href="http://dzhariy.blogspot.com/2009/04/catalyst-shared-freebsd.html"&gt;использовать PAR для разворачивания Catalyst приложений&lt;/a&gt; на продакшен сервере, то проблем у вас будет не много, и много времени это не займет. &lt;br /&gt;&lt;br /&gt;На счет производительности пока что сказать ничего не могу, будем тестировать. &lt;br /&gt;Более подробно об &lt;a href="http://search.cpan.org/perldoc?lib/Catalyst/Delta.pod"&gt;изменениях в ветке 5.8 можно прочитать тут&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-8956508998006851208?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/8956508998006851208/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2009/04/catalyst-58001.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8956508998006851208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8956508998006851208'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/04/catalyst-58001.html' title='Вот и вышел Catalyst 5.8001'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-8956048408216973572</id><published>2009-04-18T19:17:00.006+03:00</published><updated>2009-04-18T19:34:50.516+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='cgi'/><title type='text'>Catalyst и shared хостинг под FreeBSD (для виндузняков)</title><content type='html'>Недавно купил себе обычный shared хостинг. Ничего особенного, 100 Мб места, пару баз MySQL и стандартный дистрибутив Perl.&lt;br /&gt;Я хочу создать небольшой движок блога на Catalyst, и установить его там. Я понимаю, что люди говорят, что Catalyst – это не для работы под CGI, но все же, ради эксперимента, я хочу выяснить, насколько это так.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ограничения:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CGI – говорят, что будет тормозить ;). Никакого FCGI, mod_perl нет (и не будет)&lt;/li&gt;&lt;li&gt;SSH доступа у меня нет. Только FTP;&lt;/li&gt;&lt;li&gt;Я не могу установить новые перловые модули обычным способом, через команду cpan. Я не могу скопировать существующие XS (бинраные) модули вместе с проектом, так как моя рабочая система – Windows. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Задача: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Скопировать приложение со всеми его зависимостями на сервер. Все XS модули должны быть собраны под конкретную OS сервера.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;План действий следующий: &lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Узнаем что там за операционка на сервере&lt;/li&gt;&lt;li&gt;Качаем ее дистрибутив и ставим на виртуальную машину&lt;/li&gt;&lt;li&gt;Допиливаем проект, чтобы он запустился на виртуалке и качаем проект со всеми зависимостями на сервер. &lt;/li&gt;&lt;li&gt;Настраиваем, запускаем и радуемся ;)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Операционная система, установленная на сервере&lt;/h3&gt;Если бы у меня был ssh, то я бы просто ввел команду:&lt;br /&gt;&lt;blockquote&gt;uname –a&lt;/blockquote&gt;Которая бы вывела мне практически всю интересующую меня информацию, но так как SSH у меня нет, то пришлось написать небольшой скрипт, который и запускал необходимую команду на сервере:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/local/bin/perl&lt;br /&gt;print "Content-type:text/html\n\n";&lt;br /&gt;print `uname -a`;&lt;br /&gt;&lt;/pre&gt;Вот то, что мне было необходимо:&lt;br /&gt;&lt;blockquote&gt;FreeBSD s11.[% hostername %].com 6.4-RELEASE FreeBSD 6.4-RELEASE #0: Wed Mar 4 01:31:21 MSK 2009 root@s11. [% hostername %].com:/usr/obj/usr/src/sys/S14 i386&lt;/blockquote&gt;Да, как ни странно это оказалась FreeBSD ;) Я без проблем скачал дистрибутив, и установил его на &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;. Хоть я и видел живой FreeBSD три раза в жизни, но инсталляция особых трудностей не составила.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Установка Catalyst&lt;/h3&gt;&lt;br /&gt;Каталист лучше устанавливать из портов, как написано в мануале:&lt;br /&gt;&lt;a href="http://cpan.uwinnipeg.ca/htdocs/Catalyst-Runtime/INSTALL.html"&gt;http://cpan.uwinnipeg.ca/htdocs/Catalyst-Runtime/INSTALL.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;FreeBSD&lt;/span&gt;&lt;br /&gt;FreeBSD users can get up and running quickly by typing cd /usr/ports/www/p5-Catalyst-Devel &amp;amp;&amp;amp; make install, or portinstall p5-Catalyst-Devel if portinstall is installed on your system.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Можно также воспользоваться&lt;br /&gt;&lt;span style="font-style:italic;"&gt;portinstall www/p5-Task-Catalyst&lt;/span&gt;&lt;br /&gt;Которая установит наиболее популярные модули, но я не хотел тратить время, и установил только все самое необходимое.&lt;br /&gt;Опять же, установка Catalyst под FreeBSD прошла без всяческих затруднений.&lt;br /&gt;Я запустил проект на своей виртуальной FreeBSD, и теперь мне необходимо перенести его со всеми зависимостями на сервер моего хостера и запустить там. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Перенос Perl-проекта, со всеми зависимостями&lt;/h3&gt;&lt;br /&gt;И тут все очень просто. Есть специальная утилита, которая создает архив проекта со всеми используемыми модулями. В последствии, содержимое этого архива просто копируется на сервер хостера, и те модули, которые я не мог установить у хостера, просто будут лежать в локальной папке проекта. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ставим PAR (Perl Archive Toolkit)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;# cpan &lt;a href="http://search.cpan.org/perldoc?PAR"&gt;PAR&lt;/a&gt;&lt;br /&gt;# cpan &lt;a href="http://search.cpan.org/~smueller/PAR-Packer-0.991/lib/PAR/Packer.pm"&gt;PAR::Packer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Добавляем строчку &lt;span style="font-style:italic;"&gt;catalyst_par();&lt;/span&gt;  в Makefile.PL проекта на Catalyst:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;# IMPORTANT: if you delete this file your app will not work as&lt;br /&gt;# expected.  you have been warned&lt;br /&gt;use inc::Module::Install;&lt;br /&gt;&lt;br /&gt;name 'MyApp';&lt;br /&gt;all_from 'lib/MyApp.pm';&lt;br /&gt;&lt;br /&gt;requires 'Catalyst::Runtime' =&gt; '5.7014';&lt;br /&gt;requires 'Catalyst::Plugin::ConfigLoader';&lt;br /&gt;requires 'Catalyst::Plugin::Static::Simple';&lt;br /&gt;requires 'Catalyst::Action::RenderView';&lt;br /&gt;requires 'parent';&lt;br /&gt;requires 'Config::General'; # This should reflect the config file format you've chosen&lt;br /&gt;                 # See Catalyst::Plugin::ConfigLoader for supported formats&lt;br /&gt;catalyst;&lt;br /&gt;&lt;br /&gt;install_script glob('script/*.pl');&lt;br /&gt;auto_install;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;catalyst_par();&lt;/span&gt;&lt;br /&gt;WriteAll;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;И создаем par-архив:&lt;br /&gt;&lt;blockquote&gt;# perl Makefile.PL&lt;br /&gt;# make catalyst_par&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;У меня появился архив &lt;span style="font-style:italic;"&gt;my_app_name.par&lt;/span&gt;, это обычный .tar.gz архив, который я перенес на свою хост-машину, и уже там распаковал и залил на сервер хостера. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Запуск Catalyst в режиме CGI&lt;/h3&gt;&lt;br /&gt;Для того, чтобы Catalyst запустился в режиме CGI, необходимо использовать загрузчик из &lt;span style="font-style:italic;"&gt;script/ myapp_cgi.pl &lt;/span&gt;&lt;br /&gt;Для переадресации всех запросов этому загрузчику, в корневой папке сайта (Аля public_html) необходимо создать файл .htaccess со следующим содержимым:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;Options +FollowSymLinks +ExecCGI&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteCond %{REQUEST_URI} !^/?cgi-bin/myapp/script/myapp_cgi.pl&lt;br /&gt;RewriteRule ^(.*)$ cgi-bin/myapp/script/cgi.pl/$1 [PT,L]&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;И если вам повезет, так же как и мне, то после того, как вы введете адрес вашего сайта, то увидите стандартную стартовую страницу Catalyst, а это значит, что it's alive!&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/4003278278600033478-8956048408216973572?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8956048408216973572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8956048408216973572'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/04/catalyst-shared-freebsd.html' title='Catalyst и shared хостинг под FreeBSD (для виндузняков)'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-5494607577002857877</id><published>2009-03-24T23:19:00.002+02:00</published><updated>2009-03-24T23:22:53.494+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='regexp'/><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Юмор / Древнеегипетские регулярные выражения</title><content type='html'>Вот такие вот были регулярные выражения еще задолго до нашей эры (до 1970 года, наверно :). Сурово. &lt;br /&gt;&lt;center&gt;&lt;img src="http://farm4.static.flickr.com/3565/3382625547_83c9a7c901_o.jpg" alt="Древнеегипетские регулярные выражения"&gt;&lt;/center&gt;&lt;br /&gt;Источник тут: &lt;a href="http://punxter.com/pic/ancient-egyptian-regexp"&gt;http://punxter.com/pic/ancient-egyptian-regexp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-5494607577002857877?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5494607577002857877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5494607577002857877'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/03/blog-post_24.html' title='Юмор / Древнеегипетские регулярные выражения'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-2352733423422907719</id><published>2009-03-22T23:25:00.000+02:00</published><updated>2009-03-22T23:26:26.801+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fuck'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>Юмор / Жутко стыдно</title><content type='html'>Недавно нашел в старом своем скрипте, который уже давно живет в репозитории заказчика в комментариях слово “fuck”. Теперь, если я его удалю и отправлю коммит, то это станет сразу же заметно. &lt;br /&gt;&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/4003278278600033478-2352733423422907719?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2352733423422907719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2352733423422907719'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/03/blog-post.html' title='Юмор / Жутко стыдно'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-4953236658875342966</id><published>2009-03-12T00:22:00.003+02:00</published><updated>2009-03-12T00:41:12.572+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perlmova2009'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Use Perl::Mova qw[ 2 ]; # perlmova2009</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3570/3347938012_8ecd16675e_o.jpg" align="left"&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;center&gt;&lt;img src="http://farm4.static.flickr.com/3648/3347100979_2928fb5120.jpg"&gt;&lt;/center&gt;&lt;br&gt;&lt;br /&gt;Из того, что впечатлило. Во первых это  доклады от  Джонатана...  нет, не произнесу эту фамилию правильно, и поэтому напишу как в оригинале Jonathan Worthington  :) и Питера Эдвардса. Первый, Джонатан, пообещал что бета, ну хотя бы такая маленькая беточька 6-го Перла будет к концу этого года. Ловлю его на слове. Питер, удивил той супер отрепетированностью приложения, над которым он работает. Сложность была в том, что это приложение, которое реально используется в BBC состоит из админ. части и самого ядра, так вот админ. часть (GUI) работает под Виндами, в то время, как серверная часть под Unix и без иксов. Так вот, тесты для его приложения одинаково хорошо запускаются под различными операционными системами. Да, это не так просто объяснить, нужно увидеть :)&lt;br /&gt;&lt;center&gt;&lt;img src="http://farm4.static.flickr.com/3654/3347101047_bee268c825_o.jpg"&gt;&lt;/center&gt;&lt;br /&gt;Еще запомнился доклад Алексея Капранова, про гуманитарный менеджмент. Это серьезный доклад. А вот его доклад про CAPCHA был очень веселым, там было все, от степени защищенности капчи, яндекса и яху, до порносайтов и людей которые зарабатывают на жизнь набором капчи. Наверное, прибыльный бизнес :)&lt;br /&gt;&lt;br /&gt;Конечно же, доклад Дмитрия Карасика не оставил равнодушным никого. Он рассказывал о многом, плавно переходя от теме к теме. Было и о создании DSL на базе Перла, и о оптическом  распознавании текста(OCR) при помощи регулярных выражений, о том как хачить перловые OP-коды и про ангельскую функцию amb и демоническую demonic.&lt;br /&gt;&lt;br /&gt;По веб разработке рассказывали мало. Был доклад по фреймворку WebDAO от Александра Загацкого, хорошая разработка, но мне лично она показалась немного устаревшей. Автор (доклада и платформы) сам признался, что начал разрабатывать ее вроде в 2001 — 2002 году. Тогда, несомненно, технологий позволяющих абстрагировать код от среды выполнения было очень мало. И контрастом к этому докладу был лайтинг от Вячеслава Тихановского про молодой, но очень резвый веб фреймворк Mojo. Это даже не веб фреймворк, а фреймворк позволяющий строить свои фреймворки.&lt;br /&gt;&lt;br /&gt;Вот, интересная фотка получилась с доклада Максима Вуйца:&lt;br /&gt;&lt;center&gt;&lt;img src="http://farm4.static.flickr.com/3612/3347938118_1e56be403d.jpg"&gt;&lt;/center&gt;&lt;br /&gt;Собственно да, все мы такие – &lt;span style="font-weight: bold;"&gt;одержимые!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Спасибо &lt;a href="http://moscow.pm.org/"&gt;Moscow.pm&lt;/a&gt; за организацию воркшопа. Спасибо &lt;a href="http://www.globallogic.com.ua/globallogic/index.php?option=com_content&amp;amp;task=view&amp;amp;id=17213&amp;amp;Itemid=125"&gt;GlobalLogic за G-Club&lt;/a&gt;.&lt;br /&gt;Спасибо всем докладчикам за действительно интересные доклады. Было весело :)&lt;br /&gt;&lt;br /&gt;Посмотреть презентации можно тут: &lt;a href="http://event.perlukraine.org/upw2009/talks"&gt;http://event.perlukraine.org/upw2009/talks&lt;/a&gt;&lt;br /&gt;Видео с воркшопа, скорее всего будет на &lt;a href="http://www.yapc.tv/"&gt;http://www.yapc.tv/&lt;/a&gt;, но вот только когда это будет – не знаю. Мне так кажется, что через неделю – две.&lt;br /&gt;&lt;br /&gt;Спасибо Максу за &lt;a href="http://maxim.vuets.name/tmp/perlmova2009/"&gt;фотки с воркшопа&lt;/a&gt;. Кстати, за обновлением видео/аудио материалов можно следить в &lt;a href="http://event.perlukraine.org/upw2009/wiki"&gt;вики воркшопа&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-4953236658875342966?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4953236658875342966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4953236658875342966'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/03/use-perlmova-qw-2-perlmova2009.html' title='Use Perl::Mova qw[ 2 ]; # perlmova2009'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3648/3347100979_2928fb5120_t.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-480417254663948509</id><published>2009-03-01T01:59:00.001+02:00</published><updated>2009-03-01T02:04:55.560+02:00</updated><title type='text'>A href / FastCGI-приложение на Perl</title><content type='html'>Замечательный туториал от Михаила Иванова (&lt;a href="http://m-ivanov.livejournal.com/profile"&gt;&lt;img src="http://p-stat.livejournal.com/img/userinfo.gif" alt="[info]" style="border: 0pt none ; vertical-align: bottom; padding-right: 1px;" width="17" height="17" /&gt;&lt;/a&gt;&lt;a href="http://m-ivanov.livejournal.com/"&gt;&lt;b&gt;m_ivanov&lt;/b&gt;&lt;/a&gt;) о том, как писать под  FastCGI на Perl и зачем это нужно:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://m-ivanov.livejournal.com/4436.html"&gt;FastCGI-приложение на Perl. Часть первая.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://m-ivanov.livejournal.com/4831.html"&gt;FastCGI-приложение на Perl. Часть вторая.&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Ждем продолжения ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-480417254663948509?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/480417254663948509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/480417254663948509'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/03/href-fastcgi-perl.html' title='A href / FastCGI-приложение на Perl'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-5214926668304507189</id><published>2009-02-26T21:36:00.001+02:00</published><updated>2009-02-26T21:40:52.648+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl 6'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl Mova'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='NYTProf'/><title type='text'>print join " ", Perl =&gt; Links or die;</title><content type='html'>В &lt;a href="http://ru.wikipedia.org/wiki/Perl_6"&gt;Rakudo&lt;/a&gt;, интерпретаторе Перла 6, пофиксили много ошибок, и сейчас интерпретатор проходит более 7000 тестов по спецификации языка. Это сообщает JonathanWorthington, разработчик, и, не побоюсь этого слова, Евангелист 6-го Перла.&lt;br /&gt;Более подробно можно почитать тут:&lt;br /&gt;&lt;a href="http://use.perl.org/%7EJonathanWorthington/journal/38550"&gt;Rakudo: More bugs squished, over 7000 passing spectests&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Между прочем, этот человек будет готовит доклад на воркшоп &lt;a href="http://event.perlukraine.org/upw2009/talks"&gt;Perl Mova 2009&lt;/a&gt;, который пройдет 7-го марта в Киеве.&lt;br /&gt;&lt;br /&gt;А вот интересный и полезный пост, посвященный так называемым однострочникам в Перле. С объяснениями как и почему оно работает: &lt;a href="http://www.catonmat.net/blog/perl-one-liners-explained-part-one/"&gt;Famous Perl One-Liners Explained, Part I &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Скринкаст, посвященный великому и могучему NYTProf, профайлеру перлового исходного кода: &lt;a href="http://blip.tv/file/1812013"&gt;NYTProf talk at LPW 2008&lt;/a&gt;&lt;br /&gt;И еще одна ссылочка в тему: &lt;a href="http://avilella.blogspot.com/2009/02/amazing-perl-profiling-with-perl_16.html"&gt;Amazing Perl profiling with perl -d:NYTProf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;И, в завершение, полезная ссылка на очень полезный блог человека, работающего с Perl веб-фреймворком Catalyst в связке с &lt;a href="http://our.coldhardcode.com/jshirley/"&gt;DBIx::Class&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-5214926668304507189?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5214926668304507189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5214926668304507189'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/02/print-join-perl-links-or-die.html' title='print join &quot; &quot;, Perl =&gt; Links or die;'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-2293055345593826863</id><published>2009-02-24T23:19:00.002+02:00</published><updated>2009-02-24T23:25:31.713+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl poetry'/><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Юмор =&gt;  Следуй за мной!</title><content type='html'>Получив это письмо, я просто не могу не ответить:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3309/3307617882_6b26a06e98_o.png" alt="Gmail screen" border="0" /&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;Но, не будьте слишком строгим (не надо добавлять use strict в первую строчку скрипта)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;HEY: $you = president, bless [ Ukraine ];&lt;br /&gt;    do your, work; not wait for  [ others ];&lt;br /&gt;    my $president, listen ( people, [ many =&gt; times ] )&lt;br /&gt;    and respect us;&lt;br /&gt;    shift moralities =&gt; Europe&lt;br /&gt;    and be =&gt; with_us while $you-&gt;can('live');&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Я так же призываю всех Itшников Украины следовать за нашим президентом в Twitter:&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://twitter.com/Ushenko"&gt;http://twitter.com/Ushenko&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-2293055345593826863?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2293055345593826863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2293055345593826863'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/02/blog-post.html' title='Юмор =&gt;  Следуй за мной!'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-4489035801516677546</id><published>2009-02-24T00:17:00.003+02:00</published><updated>2009-02-24T00:23:26.837+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>print Perl =&gt; News or die;</title><content type='html'>Появился второй подкаст про  Перл! Спасибо Ивану Серёжкину ;)&lt;br /&gt;Вот ссылка на страницу подкаста: &lt;a href="http://clubs.ya.ru/4611686018427388089/replies.xml?item_no=1392"&gt;Russian perlcast #2&lt;/a&gt;&lt;br /&gt;Вот прямая ссылка на подкаст: &lt;a href="http://ivan.serezhkin.com/pm/perlcast/rpc2.mp3"&gt;http://ivan.serezhkin.com/pm/perlcast/rpc2.mp3&lt;/a&gt;&lt;br /&gt;И краткое описание:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;впечатления от новой работы&lt;/li&gt;&lt;li&gt;периодичность, вдохновение и каталист&lt;/li&gt;&lt;li&gt;http://2009.perlukraine.org&lt;/li&gt;&lt;li&gt;всё поменять на новом месте&lt;/li&gt;&lt;li&gt;совсем не фреймворки&lt;/li&gt;&lt;li&gt;а я больше не пишу фреймворки&lt;/li&gt;&lt;li&gt;CGI.pm - Зло&lt;/li&gt;&lt;li&gt;HTTP::Body - добро&lt;/li&gt;&lt;li&gt;А POE совсем рулит&lt;/li&gt;&lt;li&gt;Rakudo Built-ins Can Now Be Written In Perl 6&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Perl Foundation  опубликовала список активных грантов:&lt;br /&gt;&lt;a href="http://news.perlfoundation.org/2009/02/running_grants_2009_-_iv.html"&gt;http://news.perlfoundation.org/2009/02/running_grants_2009_-_iv.html&lt;/a&gt;&lt;br /&gt;Из этого всего лично меня интересует: Test::Builder 2,  Mojo Documentation Project и Moose docs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-4489035801516677546?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4489035801516677546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4489035801516677546'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/02/print-perl-news-or-die.html' title='print Perl =&gt; News or die;'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-2780467053293974958</id><published>2009-02-22T12:32:00.003+02:00</published><updated>2009-02-22T12:37:12.416+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><title type='text'>A href / Популярные wiki-движки на разных языках программирования</title><content type='html'>Каталог ссылок на реализации wiki-движков на самых различных языках программирования, таких как:&lt;br /&gt;Perl, Java, JavaScript, Lua, Microsoft, .NET/Mono, Pascal, PHP, Python, Ruby, Smalltalk и др. :&lt;br /&gt;&lt;br /&gt;Тут:  &lt;b&gt;&lt;a href="http://blackbookproject.net/widgets/wiki-and-collaboration-software-list"&gt;Wiki And Collaboration Software List&lt;/a&gt;&lt;/b&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/4003278278600033478-2780467053293974958?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2780467053293974958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2780467053293974958'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/02/href-wiki.html' title='A href / Популярные wiki-движки на разных языках программирования'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-2154852853282731716</id><published>2009-02-08T14:06:00.005+02:00</published><updated>2009-02-08T14:21:19.228+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><title type='text'>Perl / Catalyst web framework: новости и полезные ссылки</title><content type='html'>&lt;img src="http://www.developers.org.ua/wordpress/wp-content/uploads/2008/10/catlogo.png" alt="Catalyst Perl web framework" width="72" align="left" height="187"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Начнем с самой свежей новости:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ура! появился первый русскоязычный подкаст, посвященный Каталисту:&lt;br /&gt;Слушаем\качаем тут: &lt;a href="http://ivan.serezhkin.com/pm/perlcast/rpc1.mp3"&gt;http://ivan.serezhkin.com/pm/perlcast/rpc1.mp3&lt;/a&gt;&lt;br /&gt;Собственно, это первый перловый русскоязычный подкаст ;)&lt;br /&gt;Автор подкаста: &lt;a href="http://clever-one.ya.ru/"&gt;Иван Серёжкин&lt;/a&gt; (&lt;a href="http://moscow.pm.org/"&gt;Moscow.pm&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Новость из англоязычной рассылки: catalyst&lt;at&gt;lists.scsys.co.uk, с содержимым которой вы можете ознакомится с помощью &lt;a href="http://www.nabble.com/Catalyst-Web-Framework-f19245.html"&gt;http://www.nabble.com/Catalyst-Web-Framework-f19245.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Готовится новая книга по Каталисту, которая будет завершена в июне этого года.&lt;br /&gt;Вот ссылка на страницу издательства:  &lt;a href="http://www.apress.com/book/view/1430223650"&gt;http://www.apress.com/book/view/1430223650&lt;br /&gt;&lt;/a&gt;Вот на mail-thread: &lt;a href="http://www.nabble.com/New-Catalyst-Book--to21858733.html"&gt;http://www.nabble.com/New-Catalyst-Book--to21858733.html&lt;/a&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;Русскоязычные переводы мануала по Catalyst:&lt;br /&gt;Источник: &lt;a href="http://kamus.livejournal.com/tag/catalyst"&gt;http://kamus.livejournal.com/tag/catalyst&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.google.com/View?docid=dds78tsz_4gf4bptdj"&gt;Catalyst::Manual::Tutorial::CatalystBasics - Основы Catalyst &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.google.com/Doc?id=dds78tsz_3d2mqj9gf"&gt;Catalyst::Manual::Tutorial::Intro - Введение &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.google.com/Doc?id=dds78tsz_1dzcdbpck"&gt;Catalyst::Manual::About - философия Catalyst&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.google.com/Doc?id=dds78tsz_04gwd5vdg"&gt;Catalyst::Manual::Installation - установка Catalyst &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; Огромное спасибо товарищу &lt;a href="http://kamus.livejournal.com/"&gt;Kamus&lt;/a&gt; за русскоязычные переводы документации по Catalyst.&lt;br /&gt;Идем дальше! Переводы документации по Catalyst от Kiev.pm:&lt;br /&gt;&lt;br /&gt;&lt;/at&gt;&lt;ul&gt;&lt;li&gt;&lt;at&gt;&lt;a href="http://kiev.pm.org:8000/Kiev.PM/wiki/CatalystBasics"&gt;Основные концепции Catalyst&lt;/a&gt;&lt;/at&gt;&lt;/li&gt;&lt;li&gt;&lt;at&gt;&lt;a href="http://kiev.pm.org:8000/Kiev.PM/wiki/BasicCrud"&gt;Catalyst::Manual::Tutorial::BasicCRUD - руководство Catalyst - Часть 4: Основы CRUD&lt;/a&gt;&lt;/at&gt;&lt;/li&gt;&lt;/ul&gt;&lt;at&gt;И еще! Вот небольшой туториал на тему того, как сделать свой блог на Каталисте:&lt;br /&gt;&lt;a href="http://sys.bessarabov.ru/xul/takahashi-ru.xul?data=blog#page1"&gt;http://sys.bessarabov.ru/xul/takahashi-ru.xul?data=blog#page1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Презентация сделана в стиле Такахаси, и это значит что &lt;span style="font-weight: bold;"&gt;смотреть нужно через FireFox&lt;/span&gt;.&lt;br /&gt;&lt;/at&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-2154852853282731716?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2154852853282731716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2154852853282731716'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/02/perl-catalyst-web-framework.html' title='Perl / Catalyst web framework: новости и полезные ссылки'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-4056429330084934477</id><published>2009-01-30T19:30:00.002+02:00</published><updated>2009-01-30T19:33:35.018+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><title type='text'>MySQL / Тест  производительности InnoDB и MyISAM</title><content type='html'>Время от времени задумываюсь о том, насколько InnoDB быстрее/медленнее MyISAM.&lt;br /&gt;Вот результаты небольшого теста для InnoDB и MyISAM:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;database&lt;/th&gt;&lt;th&gt;insert time (s)&lt;/th&gt;&lt;th&gt;select time (s)&lt;/th&gt;&lt;th&gt;delete time (s)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;InnoDB, no FK&lt;/td&gt;&lt;td&gt;4.5&lt;/td&gt;&lt;td&gt;0.25&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;InnoDB,  FK&lt;/td&gt;&lt;td&gt;4.0&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MyISAM&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;td&gt;0.75&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;Как оказывается, что операция select в InnoDB с внешними ключами работает быстрее чем в MyISAM.&lt;br /&gt;Это радует, так как я сейчас юзаю именно InnoDB + FK (хотя, зачем юзать InnoDB без FK? :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://agileperl.blogspot.com/2009/01/mysql-bench-marks-comparing-myisam-to.html"&gt;Подробно тут...&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-4056429330084934477?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4056429330084934477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4056429330084934477'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/01/mysql-innodb-myisam.html' title='MySQL / Тест  производительности InnoDB и MyISAM'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-764352512644540633</id><published>2009-01-25T00:55:00.002+02:00</published><updated>2009-01-25T01:00:12.460+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='database designer'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Дизайнер баз данных в вашем браузере!</title><content type='html'>Браузерный дизайнер баз данных. Написан на JavaScript с небольшими Perl/PHP бекэндами. Опенсорсный. С поддержкой нескольких локализаций. &lt;br /&gt;Вот скриншот (кликабельно, ссылка на демо):&lt;br /&gt;&lt;a href="http://ondras.zarovi.cz/sql/demo/?keyword=default" title="WWW SQL Designer allows users to create database designs, which can be saved/loaded and exported to SQL scripts"&gt;&lt;img src="http://farm4.static.flickr.com/3344/3223901292_cbd9a03be3_o.png" width="398" height="233" alt="Дизайнер баз данных в вашем браузере!" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Вот ссылка на страницу проекта: &lt;br /&gt;&lt;a href="http://code.google.com/p/wwwsqldesigner/"&gt;http://code.google.com/p/wwwsqldesigner/&lt;/a&gt;&lt;br /&gt;Автору зачет! &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-764352512644540633?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/764352512644540633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/764352512644540633'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/01/blog-post.html' title='Дизайнер баз данных в вашем браузере!'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-6272217169869979963</id><published>2009-01-19T20:06:00.005+02:00</published><updated>2009-01-19T20:15:54.576+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mojo'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl / Mojo. Велосипед или эволюция?</title><content type='html'>&lt;img src="http://kraih.com/mojo.png" align="left" border="0" /&gt; Интересная обзорная заметка, рассказывающая об активно развивающимся Perl веб &lt;span style="font-style: italic;"&gt;фреймворке для... веб фреймворков&lt;/span&gt; – &lt;span style="font-weight: bold;"&gt;Mojo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;На сегодняшний день, новый веб фреймворк – это баян. &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Но, Фреймворк для создания Фреймворков – это интересно.&lt;/span&gt;&lt;br /&gt;Читаем на kiev.pm: &lt;span style="text-decoration: underline;"&gt;Mojo&lt;/span&gt;&lt;a href="http://kiev.pm.org/node/285"&gt;-- Велосипед или эволюция?&lt;/a&gt;&lt;br /&gt;------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-6272217169869979963?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kiev.pm.org/node/285' title='Perl / Mojo. Велосипед или эволюция?'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/6272217169869979963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/6272217169869979963'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/01/perl-mojo.html' title='Perl / Mojo. Велосипед или эволюция?'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-7187823461906786962</id><published>2009-01-18T14:08:00.004+02:00</published><updated>2009-01-18T14:17:14.244+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='monkey patch'/><title type='text'>Perl / Catalyst: грязные хаки и Monkey Patching</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3404/3204936352_0a2297346e.jpg?v=0" align="left" border="0" /&gt;Catalyst  – удобный веб фреймворк, но удобный до тех пор, пока ты играешь по его правилам. Как то на днях, мне не понравился его механизм инициализации компонентов. &lt;br /&gt;Конкретно, я хотел оставить ядро некоторой системы в стандартных папках контроллеров, моделей и представлений, а все расширения вынести в отдельные. &lt;br /&gt;Собственно, было так:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;SomeCMS::Controller&lt;br /&gt;SomeCMS::Model&lt;br /&gt;SomeCMS::View&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;А должно стать так:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;SomeCMS::Controller&lt;br /&gt;SomeCMS::ControllerX&lt;br /&gt;SomeCMS::Model&lt;br /&gt;SomeCMS::ModelX&lt;br /&gt;SomeCMS::View&lt;br /&gt;SomeCMS::ViewX&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;При этом модуль, который находится в директории ControllerX должен иметь точно такие же права, что и контроллер в директории Controller: Каталист должен автоматически подхватывать его и создавать экземпляр; прописывать все экшкны модуля в dispatch таблице. &lt;br /&gt;&lt;br /&gt;Вроде бы ничего сложного... ха! Но не тут то было! &lt;br /&gt;Оказывается, что Каталист ищет компоненты по захардкодженным условием, т.е. такие директории как ControllerX, ModelX, ViewX для него вообще нечто чужеродное. &lt;br /&gt;&lt;br /&gt;Выход один – лезть в ядро системы. &lt;br /&gt;Конечно же, я не должен руками в конкретный файл ядра каталиста и что-то там менять. Нет, ведь это может повлиять на работоспособность других приложений. Я должен сделать изменения только в своем приложении. &lt;br /&gt;&lt;br /&gt;Итак, вот что нужно сделать:&lt;br /&gt;1.Указать Каталисту, что модули нужно искать в *X папках&lt;br /&gt;2.Каталист должен автоматически создавать таблицу диспатчинга для этих модулей. &lt;br /&gt;&lt;br /&gt;С первым пунктом, о чудо, оказалось все довольно просто. &lt;br /&gt;Необходимый метод – setup_components – который осуществляет поиск доступных компонентов и их настройку находится в модуле Catalyst.pm, а базовый модуль моего приложения SomeCMS.pm – это как раз прямой его наследник. Кроме того, оказалось что необходимые дополнительные пути можно добавить через обычный конфиг:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;package SomeCMS;&lt;br /&gt;# ...&lt;br /&gt;__PACKAGE__-&gt;config( setup_components =&gt; { search_extra =&gt; [ '::ControllerX', '::ModelX', '::ViewX' ] } );&lt;br /&gt;&lt;br /&gt;#...&lt;br /&gt;1;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;После этих строчек новые модули в *X папках начали подхватывается Каталистом. Первая часть задачи решена. Кроме того, просматривая модуль Catalyst.pm, я заметил некоторый хардкод в поиске компонентов. Так что, возможно, в будущем мне придется переопределить такие методы как:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;$c-&gt;controller($name)&lt;br /&gt;$c-&gt;model($name)&lt;br /&gt;$c-&gt;controllers&lt;br /&gt;$c-&gt;view($name)&lt;br /&gt;$c-&gt;models&lt;br /&gt;$c-&gt;component($name)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Но, это позже. Теперь когда Каталист «узнает» мои *X модули необходимо разобратся с таблицей диспатчинга. Я столкнулся со следующий проблемой:&lt;br /&gt;&lt;br /&gt;Я создал контроллер SomeCMS::ControllerX::Sample с единственным экшеном sub index :Path :Args(0) { ... }. Очень странно, но хоть этот модуль и обрабатывался, но правила /sample/index в таблице диспатчинга не создавалось. &lt;br /&gt;И  правил для контроллера SomeCMS::ControllerX::Sample  не создавалось вообще. &lt;br /&gt;Оказалось, что при регистрации экшенов, Каталист сначала нашел экшен index в  SomeCMS::ControllerX::Sample и создал для него правило /index. Потом нашел родной для Каталиста SomeCMS::Controller::Root и там тоже нашел метод индекс, для которого так же прописал правило /index, чем успешно перетер правило  для SomeCMS::ControllerX::Sample. &lt;br /&gt;&lt;br /&gt;Тут вот в чем вопрос, почему это для  SomeCMS::ControllerX::Sample::index создалось правило /index, хотя должно было бы создаться /sample/index? – Тогда бы проблемы и не было. &lt;br /&gt;&lt;br /&gt;Ответ опять же прост. В модуле Catalyst::Utils есть метод class2classprefix который содержит захардкодженное регулярное выражение:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;sub class2classprefix {&lt;br /&gt;    my $class = shift || '';&lt;br /&gt;    my $prefix;&lt;br /&gt;    if ( $class =~ /^(.+?::([MVC]|Model|View|Controller))::.+$/ ) {&lt;br /&gt;        $prefix = $1;&lt;br /&gt;    }&lt;br /&gt;    return $prefix;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;А мне нужно добавить туда  еще ModelX|ViewX|ControllerX. Что-то там унаследовать и переопределить я не могу. Остается только один выход – это Monkey Patching. &lt;br /&gt;Т.е. я создам свой метод, выполняющий функции class2classprefix и просто подменю его в таблице Catalyst::Utils, используя glob. &lt;br /&gt;&lt;br /&gt;Вот что получилось:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;package SomeCMS;&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;&lt;br /&gt;use Catalyst::Runtime '5.70';&lt;br /&gt;&lt;br /&gt;# Set flags and add plugins for the application&lt;br /&gt;#&lt;br /&gt;#         -Debug: activates the debug mode for very useful log messages&lt;br /&gt;#   ConfigLoader: will load the configuration from a Config::General file in the&lt;br /&gt;#                 application's home directory&lt;br /&gt;# Static::Simple: will serve static files from the application's root &lt;br /&gt;#                 directory&lt;br /&gt;&lt;br /&gt;use parent qw/Catalyst/;&lt;br /&gt;&lt;br /&gt;our $VERSION = '0.01';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# ======== HACKS ================================&lt;br /&gt;&lt;br /&gt;*Catalyst::Utils::class2appclass = sub {&lt;br /&gt;    my $class = shift || '';&lt;br /&gt;    my $appname = '';&lt;br /&gt;    if ( $class =~ /^(.+?)::([MVC]|ModelX|ViewX|ControllerX|Model|View|Controller)::.+$/ ) {&lt;br /&gt;        $appname = $1;&lt;br /&gt;    }&lt;br /&gt;    return $appname;    &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;*Catalyst::Utils::class2classprefix = sub {&lt;br /&gt;    my $class = shift || '';&lt;br /&gt;    my $prefix;&lt;br /&gt;    if ( $class =~ /^(.+?::([MVC]|ModelX|ViewX|ControllerX|Model|View|Controller))::.+$/ ) {&lt;br /&gt;        $prefix = $1;&lt;br /&gt;    }&lt;br /&gt;    return $prefix;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;*Catalyst::Utils::class2prefix = sub {&lt;br /&gt;    my $class = shift || '';&lt;br /&gt;    my $case  = shift || 0;&lt;br /&gt;    my $prefix;&lt;br /&gt;    if ( $class =~ /^.+?::([MVC]|ModelX|ViewX|ControllerX|Model|View|Controller)::(.+)$/ ) {&lt;br /&gt;        $prefix = $case ? $2 : lc $2;&lt;br /&gt;        $prefix =~ s{::}{/}g;&lt;br /&gt;    }&lt;br /&gt;    return $prefix;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;/code&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/4003278278600033478-7187823461906786962?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7187823461906786962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7187823461906786962'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/01/perl-catalyst-monkey-patching.html' title='Perl / Catalyst: грязные хаки и Monkey Patching'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-8668437368917223101</id><published>2009-01-17T13:27:00.001+02:00</published><updated>2009-01-17T13:32:44.718+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='user perl or die'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Про «Integration Watch: The end for Perl?»</title><content type='html'>Обычно, вместе &lt;a href="http://dzhariy.blogspot.com/2009/01/perl_14.html"&gt;оптимистической статьей про Перл&lt;/a&gt;, появляется что-то вроде: «Ну, все. Сегодня Перл умрет, ну точно умрет». Именно такую статью написал Andrew Binstock:&lt;a href="http://www.sdtimes.com/INTEGRATION_WATCH_THE_END_FOR_PERL_/About_JAVA_and_PERL_and_PYTHON_and_GOOGLE/33186"&gt; Integration Watch: The end for Perl?&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;На сколько я уловил смысл, автор ставит Питон и Руби в пример Перлу, и говорит о том, что вот они очень крутые и синтаксис простой, и интегрируются с .NET'ом и Google активно юзает Питон, и то что раньше Перл был самым крутым после Джавы... В общем читайте сами. &lt;br /&gt;&lt;br /&gt;При этом, в статье, он опирается на &lt;a href="http://tiobe.com/"&gt;Tiobe index&lt;/a&gt;, &lt;a href="http://www.google.com/trends?q=perl,+python,+ruby"&gt;Google Trends&lt;/a&gt;, и статистику &lt;a href="http://www.ohloh.net/languages/8"&gt;Ohloh&lt;/a&gt;. Нельзя не согласится с тем, что на графиках прослеживается явное падение рейтинга Перл и приближения его рейтинга к таким языкам как Руби и Питон. С другой стороны, эти графики показывают то, что и Руби и Питон развиваются минимальными темпами. &lt;br /&gt;&lt;br /&gt;С другой стороны есть и статистика буржуйского &lt;a href="http://www.indeed.com/jobtrends?q=perl%2Cpython%2Cjava%2Cc%2B%2B"&gt;Indeed: Job Trends&lt;/a&gt;, которая показывает сохранения востребованности Перловиков по отношению к Питонщикам, и даже прирост этого спроса к началу 2009-го года. Но, это статистика буржуйская. &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/4003278278600033478-8668437368917223101?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8668437368917223101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/8668437368917223101'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/01/integration-watch-end-for-perl.html' title='Про «Integration Watch: The end for Perl?»'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-7712614917382080740</id><published>2009-01-15T00:07:00.003+02:00</published><updated>2009-01-15T00:23:57.279+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Организация Perl-просвещения</title><content type='html'>&lt;a href="http://www.enlightenedperl.org"&gt;&lt;img src="http://www.enlightenedperl.org/public/resources/images/logo5.png" border="0" align="left"&gt;&lt;/a&gt;Есть такая мистическая комьюнити – &lt;a href="http://www.enlightenedperl.org/"&gt;The Enlightened Perl Organization (EPO)&lt;/a&gt;,  в интересах которой развитие, осветление и поддержка современных Перл технологий. &lt;br /&gt;Подробнее можно прочитать &lt;a href="http://www.dev411.com/blog/2009/01/14/perl-5-for-the-future-the-enlightened-perl-organization"&gt;тут(http://www.dev411.com/blog/...enlightened-perl-organization)&lt;/a&gt; и на &lt;a href="http://www.enlightenedperl.org/"&gt;официальном сайте&lt;/a&gt;. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-7712614917382080740?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7712614917382080740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7712614917382080740'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/01/perl_15.html' title='Организация Perl-просвещения'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-1968005401949155735</id><published>2009-01-14T23:34:00.002+02:00</published><updated>2009-01-15T00:06:31.495+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl future moose catalyst'/><title type='text'>Perl: проверка здоровья</title><content type='html'>&lt;h1&gt;Будущее Perl&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;Если вы спросите, какие языки актуальны в данный момент, то услышите, что люди говорят о Ruby, C#, JavaScript, Erlang, Python. И скорее всего, не упомянут про Perl.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Текущее состояние Perl чем-то похоже на то состояние, в котором был  JavaScript пару лет назад.  JavaScript воспринимался как неприятный, напичканный  хаками язык, который был настолько ужасен, что вызывал отвращение к написанному на нем коду. С развитием таких чудесный фреймворков, как &lt;a href="http://jquery.com/"&gt;Jquery&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt;, &lt;a href="http://mootools.net/"&gt;MooTools&lt;/a&gt; &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt; и благодаря публикации Дугласа Крокфорда &lt;a href="http://oreilly.com/catalog/9780596517748/index.html"&gt;JavaScript: The Good Parts&lt;/a&gt;,  люди поняли что, фактически, это реально хороший язык со своими особенностями и причудами.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Перл начинал свою жизнь как язык для системных администраторов, возможно потому, что его создатель, &lt;a href="http://www.wall.org/~larry/"&gt;Лари Уолл&lt;/a&gt;, работал в это время системным администратором. С выходом Perl 5, язык был изменен с целью поддержки более общего программирования. Эти изменение лишили Перл некоторых странностей и синтаксических структур, которые выглядели очень не читабельно. Но, если вы посмотрите на важные аспекты Perl, то увидите в них действительно хороший язык. По крайней мере, таких апектов два. С одной стороны на этом языке можно быстро писать так называемые «однострочники» - быстро написанный скрипт в одну строку для решения задач, связных с системным администрированием; с другой стороны, вы можете использовать «более изысканный» синтаксис для программ, которые в итоге будут развиваться и поддерживаться.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;И это было разделение сущности языка. Ведь есть люди, которые повидали нечитабельный код от школы однострочного программирования, игры в &lt;a href="http://codegolf.com/"&gt;Perl Golf&lt;/a&gt;, соревнования по обфускации кода на &lt;a href="http://www.perlmonks.org/?node=Obfuscated%20Code"&gt;Перл&lt;/a&gt;, ужасный код, написанный ковбоями и людьми, которые не знали ничего лучшего в доткомовском пузыре( да, вы можете решить проблему, используя ужасный Перловый код, но легче разбить головой стену, чем попытаться изменить в нем что-то). И эти люди думаю, что это все на что способен Перл. И то, что на Перл можно писать только так.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Но, есть и другой Перл. Это язык, на котором работают такие проекты как: &lt;a href="http://imdb.com/"&gt;Internet Movie Database&lt;/a&gt;, &lt;a href="http://slashdot.org/"&gt;Slashdot&lt;/a&gt;, &lt;a href="http://booking.com/"&gt;Booking.com&lt;/a&gt;, &lt;a href="http://www.vox.com/"&gt;Vox.com&lt;/a&gt;, &lt;a href="http://www.livejournal.com/"&gt;LiveJournal&lt;/a&gt; и &lt;a href="http://hiveminder.com/"&gt;HiveMinder&lt;/a&gt;. Это язык, который позволяет людям писать и поддерживать код больших проектов годами. И этот код поддерживается разработчиками в состоянии хорошей документированости и замечательного тестового покрытия. И это язык, который вы должны рассматривать для своего следующего проекта.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Perl 6&lt;/h1&gt;&lt;br /&gt;Perl 6 слишком, слишком...&lt;br /&gt;&lt;br /&gt;Ну, а дальше, на английском:&lt;br /&gt;&lt;a href="http://www.heise-online.co.uk/open/Healthcheck-Perl-The-Perl-Future--/features/112388/0"&gt;Читать дальше &amp;gt;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Автор заметки: Piers Cawley&lt;br /&gt;Источник: http://www.heise-online.co.uk/open/Healthcheck-Perl-The-Perl-Future--/features/112388/0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-1968005401949155735?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1968005401949155735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1968005401949155735'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2009/01/perl_14.html' title='Perl: проверка здоровья'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-2977043559615647708</id><published>2008-10-27T20:49:00.001+02:00</published><updated>2008-10-27T20:51:01.922+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ынтырнет'/><category scheme='http://www.blogger.com/atom/ns#' term='укртелеком'/><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'>Хм... вот уже 2 раза так было.&lt;br /&gt;Я пытаюсь подключится к Интернету – выдает ошибку что-то вроде «такое имя пользователя и пароль недопустимы в этом домене». Я ввожу пароль еще раз, по новой. Результат тот же. Я перезапускаю модем и ввожу логин и пароль еще раз – тоже самое.&lt;br /&gt;Я перегружаю машину, и ввожу все тот же логин и пароль. &lt;br /&gt;Я звоню в службу поддержки Укртелекома. Как всегда, там нет свободного оператора и мне телефонный бот предлагает мне подождать, послушав классическую музыку :). &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/4003278278600033478-2977043559615647708?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2977043559615647708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2977043559615647708'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/10/blog-post.html' title='Паро-нормальная  служба поддержки от Укртелеком'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-1132325173150833755</id><published>2008-10-15T21:30:00.003+03:00</published><updated>2008-10-15T21:34:34.402+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL::Translator'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>SQL::Translator. Конвертируем схемы таблиц MySQL в SQLite</title><content type='html'>Сабж на Хабре&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-1132325173150833755?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://dzhariy.habrahabr.ru/blog/42400/' title='SQL::Translator. Конвертируем схемы таблиц MySQL в SQLite'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1132325173150833755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1132325173150833755'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/10/sqltranslator-mysql-sqlite.html' title='SQL::Translator. Конвертируем схемы таблиц MySQL в SQLite'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-6064300413231118670</id><published>2008-10-14T14:16:00.004+03:00</published><updated>2008-10-14T21:40:52.628+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moose'/><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>[Perl Catalyst]: Релизнулся Catamoose</title><content type='html'>&lt;img  src="http://farm4.static.flickr.com/3109/2915031818_bf006c1abf.jpg?v=0" border="0" alt="" align="left"/&gt;&lt;br /&gt;Вчера, 13 октября, вышел релиз Catalyst::Runtime 5.8. Версия 5.8 – это результат работы над проектом "Catamoose": &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt; с использованием нового ООП Фреймворка &lt;a href="http://www.iinteractive.com/moose/"&gt;Moose&lt;/a&gt;. &lt;br /&gt;Смысл Moose в том, что он позволяет использовать те новшества особенности ООП Перл 6 уже в 5-й ветке Перла.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-6064300413231118670?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/6064300413231118670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/6064300413231118670'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/10/perl-catalyst-catamoose.html' title='[Perl Catalyst]: Релизнулся Catamoose'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-1980200750294117547</id><published>2008-10-05T15:59:00.003+03:00</published><updated>2008-10-05T16:09:53.993+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='Far East Perl Workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Видео: Обзор Catalyst с далекого-далекого Far East Perl Workshop 2008. (Владивосток, 26 сентября 2008)</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3109/2915031818_bf006c1abf.jpg?v=0" align="left"&gt;Советую посмотреть доклад Романа Беликина, посвященный Perl MVC веб-фреймворку – Catalyst. &lt;br /&gt;&lt;a href="http://yapc.tv/2008/fe/roman-catalyst/"&gt;http://yapc.tv/2008/fe/roman-catalyst/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Краткое содержание доклада:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Что такое  «мясо» в Perl исходниках&lt;br /&gt;&lt;li&gt;Catalyst -- Perl MVC Фреймворк&lt;br /&gt;&lt;li&gt;Установка и создание приложений на Catalyst: обзор Моделей, Контроллеров и Представлений&lt;br /&gt;&lt;li&gt;Что такое $c? И как использовать объект контекста&lt;br /&gt;&lt;li&gt;Модели (ORM DBIx::Class и его грабли)&lt;br /&gt;&lt;li&gt;Представления и шаблонизатор Template toolkit&lt;br /&gt;&lt;li&gt;PHP -- шаблонизатор для Catalyst ;)&lt;br /&gt;&lt;li&gt;Контроллеры: Root, Dispatcher и URL-Mapping, атрибуты Действий&lt;br /&gt;&lt;li&gt;Engine – интерфейс между сервером(Apache/IIS/FastCGI и т.д.) и Catalyst &lt;br /&gt;&lt;li&gt;Плагины и расширение контекста ($c)&lt;br /&gt;&lt;li&gt;Ждем Catamoose…&lt;br /&gt;&lt;li&gt;Полезные ссылки&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-1980200750294117547?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1980200750294117547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1980200750294117547'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/10/perl-far-east-perl-workshop-2008-26.html' title='Видео: Обзор Catalyst с далекого-далекого Far East Perl Workshop 2008. (Владивосток, 26 сентября 2008)'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-1531770730467214622</id><published>2008-10-04T10:23:00.003+03:00</published><updated>2008-10-04T15:15:03.304+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CakePHP'/><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='Django'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>MVC Марафон</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3113/2911223299_dd0ac00e3d.jpg?v=0" align="left"&gt;Замечательная ссылка на статью, посвященную сравнению MVC фреймворков. Прочитал с огромным интересом и считаю этот материал колоссально полезным. &lt;br /&gt;&lt;br /&gt;В сравнении участвуют:  ASP.NET MVC: Preview 3, CakePHP: 1.2RC2, Catalyst: 5.7, Django: 0.96, Ruby on Rails: 2.1&lt;br /&gt;&lt;br /&gt;Читаем тут:&lt;br /&gt;&lt;a href="http://chrislaco.com/articles/mvc-marathon/"&gt;MVC Marathon&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-1531770730467214622?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://chrislaco.com/articles/mvc-marathon/' title='MVC Марафон'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1531770730467214622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1531770730467214622'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/10/mvc.html' title='MVC Марафон'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-542468811964854918</id><published>2008-10-03T17:30:00.002+03:00</published><updated>2008-10-04T22:03:30.888+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='features'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Скрытые возможности Perl</title><content type='html'>Сегодня наRSSил интересное обсуждение:&lt;br /&gt;&lt;a href=""&gt;Hidden features of Perl  на stackoverflow.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Должен сказать, что почерпнул для себя очень много интересного. Я бы не сказал полезного – просто интересного :)&lt;br /&gt;Вот, например:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;The "for" statement can be used the same way "with" is used in Pascal:&lt;br /&gt;for ($item)&lt;br /&gt;{&lt;br /&gt;    s/&amp;amp;nbsp;/ /g;&lt;br /&gt;    s/&lt;.*?&gt;/ /g;&lt;br /&gt;    $_ = join(" ", split(" ", $_));&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;You can apply a sequence of s/// operations, etc. to the same variable without having to repeat the variable name.&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/161872/hidden-features-of-perl#163481"&gt;http://stackoverflow.com/questions/161872/hidden-features-of-perl#163481&lt;/a&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/4003278278600033478-542468811964854918?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/542468811964854918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/542468811964854918'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/10/perl.html' title='Скрытые возможности Perl'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-9222658200917340265</id><published>2008-10-02T20:35:00.002+03:00</published><updated>2008-10-02T20:39:25.367+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developers.org.ua'/><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='webdev'/><title type='text'>Опубликовал заметку про Catalyst для ДОУ</title><content type='html'>С самой заметкой можно ознакомится вот тут:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.developers.org.ua/archives/dmitryzhariy/2008/10/01/catalyst-mvc-perl-web-framework/"&gt;Catalyst – Perl веб-фреймворк в лучших традициях MVC&lt;/a&gt;&lt;br /&gt;(комментировать прошу там же)&lt;br /&gt;&lt;br /&gt;Цель этой заметки, скорее, привлечь внимание к тому, что существует такой Перловый фреймворк – Catalyst и то, что он ничем не уступает своим MVC – аналогам, написанным  на других  ЯП. Собственно, про Каталист можно рассказать очень и очень много: есть там и магия, есть там и философия, есть и грабли... Но, я думаю, что для обзорной статьи букафф там достаточно :)&lt;br /&gt;Давно чо-то про Перл в русскоязычном инете не писали... &lt;br /&gt;&lt;br /&gt;P.S.: Пока бороздил просторы сети, наткнулся на небольшое сравнение производительности Питоновского Джанго с Перловым Каталистом, вот:&lt;br /&gt;&lt;a href="http://langs-tech-stuff.blogspot.com/2007/03/benchmarks-pythondjango-vs-perl.html"&gt;Benchmarks: python. Django vs. perl-&gt; Catalyst&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-9222658200917340265?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/9222658200917340265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/9222658200917340265'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/10/catalyst.html' title='Опубликовал заметку про Catalyst для ДОУ'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-7430993375238662607</id><published>2008-09-27T00:44:00.003+03:00</published><updated>2008-09-27T00:48:22.655+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl все таки сильнее C#! ;)</title><content type='html'>Сегодня днем хотел попробовать как работают ASP.NET приложения под &lt;a href="http://www.mono-project.com/Start"&gt;Mono&lt;/a&gt;. Долго не думая, я скачал для тестов один из самых популярных блоговых движков, написанных под .NET – &lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.NET&lt;/a&gt; . К чести автора, блог действительно очень хороший, это я узнал сам, таки запустив его под Mono (это значит, что он будет хорошо работать и на *nix серверах). Запустил я это дело под XSP – это такой специальный веб-сервер для разработчиков, который служит для того, чтобы приложение можно было бы быстро запустить, без утомительных настроек «реального» веб-сервера. К слову XSP написан на C#. А, по умолчанию, сервер использует для работы порт 8080.&lt;br /&gt;Удовлетворив свой интерес, я переключился на разработку в Perl‘овом &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt;. Там также есть свой собственный development web server, написанный на Perl. По умолчанию, этот сервер также прослушивает порт 8080. &lt;br /&gt;По истечении некоторого времени, я заметил что XSP до сих пор висит у меня в задачах. Я посмотрел на его вывод – XSP захлебывался в сообщениях об ошибках. Я гуманно убил XSP, чтобы не подливать его мучения. При этом сервер для разработки Catalyst работал отлично. &lt;br /&gt;Вот так вот, в равной схватке за порт Perl победил и поставил на колени  C#. :))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-7430993375238662607?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7430993375238662607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7430993375238662607'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/09/perl-c.html' title='Perl все таки сильнее C#! ;)'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-3249795085475652223</id><published>2008-08-16T23:42:00.001+03:00</published><updated>2008-08-16T23:44:25.734+03:00</updated><title type='text'>На пути изучения C#</title><content type='html'>Сначала этого месяца я занялся изучением .NET и языка C#. Давно хотел узнать, что же это такое – управляемый код, и считаю очень полезным  уметь создавать кросс платформенные приложения. После разговоров с людьми, чтения форумов и оценки популярности технологий по открытым вакансиям на сайтах по поиску работы, понял, что в принципе нет особой разницы что изучать: C# или Java. &lt;br /&gt;И .NET и C# есть проект Mono, который, вроде бы не поддерживается официально Мелкомягкими, но вполне доказывает свою работоспособность. Сейчас, как я понял, у ребят из Novel уже готова адаптация второго фреймворка под все популярные платформы. &lt;br /&gt;Плюс, по синтаксису Си Шарп больше чем Ява похож на C++. Для меня это весомый аргумент. &lt;br /&gt;Должен сказать, что, прочитав и изучив довольно не малый объем информации, я не разочаровался в своем выборе по поводу C#.  Я бы сказал, что, по синтаксису C# это косметически подправленный C++, мне понравилось то что:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Добавился оператор foreach. К нему я привык, используя скриптовые языки, такие как Perl и 4Test.&lt;br /&gt;&lt;li&gt;Упростились перегрузки операторов. Индексаторы вынесены в отдельную конструкцию. &lt;br /&gt;&lt;li&gt;Добавились анонимные функции, на базе делегатов. И появилась возможность использовать их при сортировке списков и массивов. &lt;br /&gt;&lt;li&gt;Контейнеры стали называться коллекциями, а итераторы  слились с коллекциями в единое целое. Это, на мой взгляд, очень удобно.&lt;br /&gt;&lt;li&gt;Появилась поддержка свойств. &lt;br /&gt;&lt;li&gt;Не надо ставить точку с запятой после завершающей фигурной скобочки объявления класса :)&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Собственно, список того, что мне понравилось в новом языке можно продолжать и дальше, но что-то лень :)&lt;br /&gt;&lt;br /&gt;По части обработки и анализа текстовых данных виде C# не оправдал моих надежд. Люди, знакомые с Perl, поймут, о чем я говорю. Какими бы небыли крутыми классы для работы с регулярными выражениями – они никогда не будут настолько же простыми и удобными как это реализовано в Perl. Так же мне не понравилась реализация хешей. Они не стали лучше и гибче тех, которые реализованы в STL C++. &lt;br /&gt;С#, по сравнению с C++, стал немного проще и удобней в использовании. Но, смотря на код через призму этой простоты, гибкости ООП, безопасности типов и супер-пупер сборщика мусора –  нужно не забывать о том, что реализовывать или использовать готовые типы нужно очень осмотрительно, так как ошибка при выборе типа может повлечь за собой чрезмерный перерасход ресурсов операционной системы при выполнении приложения. &lt;br /&gt;Нужно хорошо знать о том, как устроен этот  .NET изнутри и что на самом деле стоит за каждым из предлагаемых классов. Только тогда я смогу сказать, что хорошо разбираюсь в C# и платформе .NET, а пока я могу сказать, что сделал только первые шаги в сторону изучения новой для меня технологии.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-3249795085475652223?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/3249795085475652223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/3249795085475652223'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/08/c.html' title='На пути изучения C#'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-3236257990290130658</id><published>2008-08-12T01:18:00.000+03:00</published><updated>2008-08-12T01:19:43.551+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='काताल्य्स्त'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Catalyst deployment немного сосет (подсасывает)</title><content type='html'>Меня просто достает то, что я не могу установить ни одного известного мне приложения на, созданного на фреймворке Catalyst. Все они тянут за собой пол-CPAN’а зависимостей, при этом эти самые депенденсы либо не компилируются(Foorum), либо зависают на тестах(Mojomojo) либо даже после установки всех задекламированных депенденсов требуют еще кучу модулей (Blog). &lt;br /&gt;&lt;br /&gt;Приложения на Каталисте интересны тем, что, во первых, они могут запускаться при помощи отдельного development-сервера, который идет вместе с каждым приложением и работать с СУБД базой SQLite, если используется какой-нибудь ORM, по типу DBIx::CLass. Это означает, что вам нужно скачать приложение, запустить сервер и юзать интересующее приложение под любой платформой. &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/4003278278600033478-3236257990290130658?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/3236257990290130658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/3236257990290130658'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/08/catalyst-deployment.html' title='Catalyst deployment немного сосет (подсасывает)'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-5487041886616620530</id><published>2008-08-03T16:13:00.000+03:00</published><updated>2008-08-03T16:14:41.222+03:00</updated><title type='text'>Разбираюсь с intensedebate</title><content type='html'>Поставил себе внешний сервис для комментирования заметок – &lt;a href="http://www.intensedebate.com/"&gt;IntenseDebate&lt;/a&gt;. Сейчас тестирую как работает.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-5487041886616620530?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5487041886616620530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5487041886616620530'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/08/intensedebate.html' title='Разбираюсь с intensedebate'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-760290975128700941</id><published>2008-05-29T00:37:00.001+03:00</published><updated>2008-05-29T00:42:26.014+03:00</updated><title type='text'>Perl 5: Срезы хешей могут заменить циклы</title><content type='html'>Насколько часто вы используете цикл &lt;i&gt;for&lt;/i&gt;,  чтобы сделать что-то простое с хешем, и при этом задумываетесь, что, скорее всего, должен быть более подходящий способ сделать это. Использование срезов хешей может заменить эти простые циклы и ускорить время выполнения вашего скрипта. &lt;br /&gt;Срез хешей это синтаксическое средство для доступа к множеству значений через однострочную операцию. Это краткая и эффективная техника, но это, также представитель той коллекции примеров кода, из-за которой Перл приобрел репутацию нечитабельного языка программирования. Однако, изучив эту технику, вы почувствуете себя более искусным в программировании человеком! Я хочу представить парочку примеров того, как срезы хешей помогли сделать мой код короче и быстрее.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Базовый синтаксис срезов&lt;/h2&gt;&lt;br /&gt;Для того чтобы получить срез значений хеша, обращение к хешу должно быть следующим: перед именем хеша ставится знак массива @, так как будет возвращен массив значений. На месте индекса, который стоит после имени переменной хеша и заключен в фигурные скобки, должен стоять список из имен требуемых ключей хеша.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Statement"&gt;use strict&lt;/span&gt;; &lt;span class="Statement"&gt;use warnings&lt;/span&gt;;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%number_for&lt;/span&gt; = (&lt;span class="String"&gt;one &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;1&lt;/span&gt;, &lt;span class="String"&gt;two &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;2&lt;/span&gt;, &lt;span class="String"&gt;three &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;span class="Comment"&gt;# Обычный пример получения значения по ключу&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Identifier"&gt;$number_for&lt;/span&gt;{one}; &lt;span class="Comment"&gt;# 1&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Срез хеша. Получение множества значений. Обратите внимание на  '@'&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Identifier"&gt;@number_for&lt;/span&gt;{&lt;span class="String"&gt;qw(&lt;/span&gt;&lt;span class="String"&gt;one two three&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;}; &lt;span class="Comment"&gt;# 123&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# И это тоже работает&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Identifier"&gt;@number_for&lt;/span&gt;{&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;one&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;,&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;two&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;,&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;three&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;}; &lt;span class="Comment"&gt;# 123&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Примечание:&lt;/b&gt; при обычном обращении к значению по ключу, вы можете не заключать имя ключа в скобочки - Перл сделает это за вас. При использовании срезов, вы обязаны  заключить имя каждого ключа хеша в скобочки. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Слияние двух хешей&lt;/h2&gt;&lt;br /&gt;Срез хеша может находиться с левой стороны от оператора присвоения. Это свойство используется для слияния одного хеша в другой. Общим примером слияния может служить то, когда вы получаете конфигурационные данные более чем из одного источника, но вы хотите объединить их в одном месте.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Statement"&gt;use strict&lt;/span&gt;; &lt;span class="Statement"&gt;use warnings&lt;/span&gt;;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%your_numbers&lt;/span&gt; = (&lt;span class="String"&gt;two &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;2&lt;/span&gt;, &lt;span class="String"&gt;four &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;4&lt;/span&gt;, &lt;span class="String"&gt;six &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;6&lt;/span&gt;);&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%number_for&lt;/span&gt;   = (&lt;span class="String"&gt;one &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;1&lt;/span&gt;, &lt;span class="String"&gt;three &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;3&lt;/span&gt;, &lt;span class="String"&gt;five &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;5&lt;/span&gt;, &lt;span class="String"&gt;six &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;7&lt;/span&gt;);&lt;br /&gt;&lt;span class="Comment"&gt;# Я получаю все числа! &lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# (И ваше значение перепишет мое, если они различаются)&lt;/span&gt;&lt;br /&gt;&lt;span class="Identifier"&gt;@number_for&lt;/span&gt;{&lt;span class="Statement"&gt;keys&lt;/span&gt; &lt;span class="Identifier"&gt;%your_numbers&lt;/span&gt;} = &lt;span class="Statement"&gt;values&lt;/span&gt; &lt;span class="Identifier"&gt;%your_numbers&lt;/span&gt;;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Statement"&gt;sort&lt;/span&gt; &lt;span class="Statement"&gt;values&lt;/span&gt; &lt;span class="Identifier"&gt;%number_for&lt;/span&gt;; &lt;span class="Comment"&gt;# 12346&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Получение значений ключей в заданном порядке&lt;/h2&gt;&lt;br /&gt;Это общий пример, который встречается в веб программировании. Вы получили данные формы и уже проверили их. Данные формы находятся в хеше и вы хотите сохранить их в базу данных. У вас уже есть подготовленный SQL-запрос, но он требует того, что порядок ваших значений будет соответствовать порядку полей таблицы, заданных в запросе. К сожалению, функция &lt;i&gt;values&lt;/i&gt; не может обеспечить тот порядок следования значений хеша, который вам необходим. (К тому же, вы не хотите получить значение от кнопки "submit"!)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Statement"&gt;use strict&lt;/span&gt;; &lt;span class="Statement"&gt;use warnings&lt;/span&gt;;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%number_for&lt;/span&gt; = (&lt;span class="String"&gt;one &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;1&lt;/span&gt;, &lt;span class="String"&gt;two &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;2&lt;/span&gt;, &lt;span class="String"&gt;three &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;3&lt;/span&gt;, &lt;span class="String"&gt;four &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;4&lt;/span&gt;, &lt;span class="String"&gt;six &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;6&lt;/span&gt;);&lt;br /&gt;&lt;span class="Comment"&gt;# получить значение от вашей функции валидации формы&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%validated&lt;/span&gt; = &lt;span class="Identifier"&gt;%number_for&lt;/span&gt;;&lt;br /&gt;&lt;span class="Comment"&gt;# Порядок следования значений, требуемый в вашем  SQL-запросе&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;@columns&lt;/span&gt; = &lt;span class="String"&gt;qw(&lt;/span&gt;&lt;span class="String"&gt;six one three&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="Comment"&gt;# Получить срез значений&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;@bind&lt;/span&gt; = &lt;span class="Identifier"&gt;@validated&lt;/span&gt;{&lt;span class="Identifier"&gt;@columns&lt;/span&gt;}; &lt;span class="Comment"&gt;# 6,1,3&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Statement"&gt;join&lt;/span&gt;(&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;,&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;, &lt;span class="Identifier"&gt;@bind&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Получение значений из хеша, отсортированного по ключам&lt;/h2&gt;&lt;br /&gt;Предположим, что вы хотите отсортировать хеш по его ключам и взять значения ключей из этого отсортированного порядка. Используя представленные выше данные, возможно, вы хотите напечатать цифры в алфавитном порядке.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Identifier"&gt;@number_for&lt;/span&gt;{&lt;span class="Statement"&gt;sort&lt;/span&gt; &lt;span class="Statement"&gt;keys&lt;/span&gt; &lt;span class="Identifier"&gt;%number_for&lt;/span&gt;}; &lt;span class="Comment"&gt;# 41632&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Срез ссылки на хеш&lt;/h2&gt;&lt;br /&gt;Со временем, вы обнаружите, что представленный выше синтаксис срезов не работает для ссылок на хеши. Вы можете попробовать три-четыре разных комбинаций, но Перл по-прежнему продолжает выдавать ошибки компиляции. Не задавайтесь!  Вы можете получить срез из ссылки на хеш, но давайте сначала рассмотрим то, как можно получить значение по одному ключу.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Statement"&gt;use strict&lt;/span&gt;; &lt;span class="Statement"&gt;use warnings&lt;/span&gt;;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%number_for&lt;/span&gt; = (&lt;span class="String"&gt;one &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;1&lt;/span&gt;, &lt;span class="String"&gt;two &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;2&lt;/span&gt;, &lt;span class="String"&gt;three &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;3&lt;/span&gt;, &lt;span class="String"&gt;five &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;5&lt;/span&gt;, &lt;span class="String"&gt;six &lt;/span&gt;=&amp;gt; &lt;span class="Number"&gt;6&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$num_for&lt;/span&gt; = &lt;span class="Identifier"&gt;\%number_for&lt;/span&gt;;&lt;br /&gt;&lt;span class="Comment"&gt;# Общий синтаксис получения значения по ключу&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Identifier"&gt;$num_for&lt;/span&gt;-&amp;gt;{one}; &lt;span class="Comment"&gt;# 1&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Альтернативный, ленивый способ &lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Identifier"&gt;$$num_for&lt;/span&gt;{two}; &lt;span class="Comment"&gt;# 2&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Альтернативный, подробный способ &lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; ${&lt;span class="Identifier"&gt;$num_for&lt;/span&gt;}{six}; &lt;span class="Comment"&gt;# 6&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ключ к получению среза хеша в том, чтобы использовать альтернативные способы получения значения хеша, заменяя первый знак скаляра $ на знак массива @. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;@columns&lt;/span&gt; = qw [six one three];&lt;br /&gt;&lt;span class="Comment"&gt;# Альтернативный, ленивый способ &lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Identifier"&gt;@$num_for&lt;/span&gt;{&lt;span class="Identifier"&gt;@columns&lt;/span&gt;}; &lt;span class="Comment"&gt;# 613&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Альтернативный, подробный способ &lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; @{&lt;span class="Identifier"&gt;$num_for&lt;/span&gt;}{&lt;span class="Identifier"&gt;@columns&lt;/span&gt;}; &lt;span class="Comment"&gt;# 613&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Примечание:&lt;/b&gt;Способ со стрелочкой не используется, так как стрелочка подразумевает использование скаляра, в то время, как нам нужен список.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Мощный синтаксис&lt;/h2&gt;&lt;br /&gt;Срезы хешей - это продвинутый синтаксис, демонстрирующий краткость и выразительность Perl. Теперь вы сможете распознать срезы, когда столкнетесь с ними, и возможно, применить их в своем проекте для экономии времени и объема кода. (Но, запомните: используйте супер силу Perl только в пользу Добра, но не Зла!)&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;h2&gt;Отменятинна:&lt;/h2&gt;&lt;br /&gt;Оригинал этой заметки на английском языке вы можете найти &lt;a href="http://www.webquills.net/scroll/2008/05/perl-5-hash-slices-can-replace.html" target="_blank"&gt;тут&lt;/a&gt;.&lt;br /&gt;Эта заметка показалась мне настолько интересной, что я решил перевести ее на русский язык. Это мой первый перлевод. Надеюсь продолжить время от времени, деятельность подобного рода в корыстных целях совершенствования своего английского и бескорыстных - поделиться интересным, на мой взгляд, материалом с читателями моего блога.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-760290975128700941?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/760290975128700941/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/05/perl-5.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/760290975128700941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/760290975128700941'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/05/perl-5.html' title='Perl 5: Срезы хешей могут заменить циклы'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-2992299769920935001</id><published>2008-04-27T20:09:00.000+03:00</published><updated>2008-04-27T20:14:18.312+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web framework'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>прЭлюдия.pm  за нас! Фреймворк для веб разработки на Perl</title><content type='html'>&lt;a href="http://search.cpan.org/~dmow/Eludia-08.03.13.1198/Eludia.pm"&gt;Eludia.pm&lt;/a&gt; – это веб фреймворк для быстрой веб разработки. Авторы обещают, что для разработки тривиального &lt;a href="http://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete"&gt;CRUD&lt;/a&gt; функциональности достаточно 5-ти минут. Фреймворк поддерживает работу с сессиями, авторизацию пользователей, абстракцию при работу с различными СУБД (свой слой SQL абстракций), независимость от сервера и много другое. &lt;br /&gt;Подробно можно &lt;a href="http://eludia.ru/wiki/index.php"&gt;почитать на сайте разработчиков&lt;/a&gt;. &lt;br /&gt;На базе элюдии есть еще одна разработка, имя которой больше напоминает тост. Это Zanas. Пока я его не смотрел, но по описанием видно, что это Perl-фреймворк, заточенный на работу и создание DHTML виджетов. &lt;br /&gt;&lt;a href="http://linux.softpedia.com/get/Programming/Libraries/Zanas-pm-28089.shtml"&gt;Почитать про Занас можно тут&lt;/a&gt;, а &lt;a href="http://library.pantek.com/Programming/Perl/CPAN/authors/id/D/DM/DMOW/"&gt;скачать отсюда&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-2992299769920935001?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/2992299769920935001/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/04/pm-perl.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2992299769920935001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2992299769920935001'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/04/pm-perl.html' title='прЭлюдия.pm  за нас! Фреймворк для веб разработки на Perl'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-9001529740072195997</id><published>2008-04-27T17:29:00.001+03:00</published><updated>2008-04-27T17:32:48.887+03:00</updated><title type='text'>Какая польза от Интерфейсов в Perl?</title><content type='html'>Интерфейс – это класс с набором чистых (пустых, нереализованных) виртуальных функций, которые должны быть реализованных в классах-наследниках. Одним из преимуществ использования интерфейсов есть четкость и ясность работы классов наследников. Интерфейс должен быть реализован в классах наследниках. Таким образом, интерфейс – это класс с набором функций, которые должны быть у каждого класса-наследника интерфейса. Интерфейсы задают протокол работы классов-наследников и могут существенно облегчить поиск ошибок и понимание работы системы. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Пример: &lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Это интерфейс. Все функции интерфейса должны быть реализованы.&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Иначе - кто-то сдохнет. &lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;package&lt;/span&gt;&lt;span class="Type"&gt; ISQLDriver;&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;select&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;{ &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;I'm pure!&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt; }&lt;br /&gt;&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;insert&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;{ &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;I'm pure!&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt; }&lt;br /&gt;&lt;span class="Number"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Это класс-наследник. Это правильный наследник, &lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# потому что он реализует все функции наследуемого интерфейса.  &lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;package&lt;/span&gt;&lt;span class="Type"&gt; MySQLDriver;&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;use base&lt;/span&gt; qw[ISQLDriver];&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;new&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;{ &lt;span class="Operator"&gt;bless&lt;/span&gt; {}, &lt;span class="Statement"&gt;shift&lt;/span&gt; }  &lt;span class="Comment"&gt;# Очень мелкий конструктор&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;select&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;{&lt;br /&gt;    &lt;span class="Statement"&gt;my&lt;/span&gt;(&lt;span class="Identifier"&gt;$this&lt;/span&gt;, &lt;span class="Identifier"&gt;$table&lt;/span&gt;, &lt;span class="Identifier"&gt;$conditions&lt;/span&gt;) = &lt;span class="Identifier"&gt;@_&lt;/span&gt;;&lt;br /&gt;    &lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;SELECT * FROM &lt;/span&gt;&lt;span class="Identifier"&gt;$table&lt;/span&gt;&lt;span class="String"&gt; WHERE &lt;/span&gt;&lt;span class="Identifier"&gt;$conditions&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;insert&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;{&lt;br /&gt;    &lt;span class="Statement"&gt;my&lt;/span&gt;(&lt;span class="Identifier"&gt;$this&lt;/span&gt;, &lt;span class="Identifier"&gt;$table&lt;/span&gt;, &lt;span class="Identifier"&gt;$values&lt;/span&gt;) = &lt;span class="Identifier"&gt;@_&lt;/span&gt;;&lt;br /&gt;    &lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;INSERT INTO &lt;/span&gt;&lt;span class="Identifier"&gt;$table&lt;/span&gt;&lt;span class="String"&gt; VALUES(&lt;/span&gt;&lt;span class="Identifier"&gt;$values&lt;/span&gt;&lt;span class="String"&gt;)&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt; ;&lt;br /&gt;}&lt;br /&gt;&lt;span class="Number"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# А у этого наследника нереализованная функция insert. &lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Ничего страшного -&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Она будет унаследована от ISQLDriver и при вызове &lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# insert от класса SQLightDriver - ваш скрипт сдохнет. &lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;package&lt;/span&gt;&lt;span class="Type"&gt; SQLightDriver;&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;use base&lt;/span&gt; qw[ISQLDriver];&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;new&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;{ &lt;span class="Operator"&gt;bless&lt;/span&gt; {}, &lt;span class="Statement"&gt;shift&lt;/span&gt; }&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;select&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;{&lt;br /&gt;    &lt;span class="Statement"&gt;my&lt;/span&gt;(&lt;span class="Identifier"&gt;$this&lt;/span&gt;, &lt;span class="Identifier"&gt;$table&lt;/span&gt;, &lt;span class="Identifier"&gt;$conditions&lt;/span&gt;) = &lt;span class="Identifier"&gt;@_&lt;/span&gt;;&lt;br /&gt;    &lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;SELECT * FROM &lt;/span&gt;&lt;span class="Identifier"&gt;$table&lt;/span&gt;&lt;span class="String"&gt; WHERE &lt;/span&gt;&lt;span class="Identifier"&gt;$conditions&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;span class="Number"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;package&lt;/span&gt;&lt;span class="Type"&gt; main;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# Эта функция создает новую запись в блоге независимо от &lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# драйвера для работы со СУБД.&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;insert_record&lt;/span&gt;&lt;span class="Function"&gt; &lt;/span&gt;{&lt;br /&gt;    &lt;span class="Statement"&gt;my&lt;/span&gt; (&lt;span class="Identifier"&gt;$db_driver&lt;/span&gt;, &lt;span class="Identifier"&gt;$body_text&lt;/span&gt;) = &lt;span class="Identifier"&gt;@_&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="Conditional"&gt;if&lt;/span&gt; ( !&lt;span class="Identifier"&gt;$db_driver&lt;/span&gt;-&amp;gt;isa(&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;ISQLDriver&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;) ) {&lt;br /&gt;        &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="Identifier"&gt;$db_driver&lt;/span&gt;&lt;span class="String"&gt; is not an ISQLDriver&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="Identifier"&gt;$db_driver&lt;/span&gt;-&amp;gt;insert(&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;Records(body)&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;, &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="Identifier"&gt;$body_text&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$dbh_1&lt;/span&gt; = &lt;span class="Statement"&gt;new&lt;/span&gt; MySQLDriver;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$dbh_2&lt;/span&gt; = &lt;span class="Statement"&gt;new&lt;/span&gt; SQLightDriver;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;All records from MySQL:&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;span class="Identifier"&gt;$dbh_1&lt;/span&gt;-&amp;gt;&lt;span class="Statement"&gt;select&lt;/span&gt;(&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;Records&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;, &lt;span class="String"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;All records from SQLight:&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;span class="Identifier"&gt;$dbh_2&lt;/span&gt;-&amp;gt;&lt;span class="Statement"&gt;select&lt;/span&gt;(&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;Records&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;, &lt;span class="String"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;Add new record (MySQL)&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;insert_record &lt;span class="Identifier"&gt;$dbh_1&lt;/span&gt;, &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;blah blah blah&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;Add new record (SQLight)&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;insert_record &lt;span class="Identifier"&gt;$dbh_2&lt;/span&gt;, &lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;blah blah blah&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Вывод будет следующим:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;All records from MySQL:&lt;br /&gt;SELECT * FROM Records WHERE &lt;br /&gt;&lt;br /&gt;All records from SQLight:&lt;br /&gt;SELECT * FROM Records WHERE &lt;br /&gt;&lt;br /&gt;Add new record (MySQL)&lt;br /&gt;INSERT INTO Records(body) VALUES('blah blah blah')&lt;br /&gt;&lt;br /&gt;Add new record (SQLight)&lt;br /&gt;I'm pure! at example.pl line 5.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вся проблема в том, что SQLightDriver не реализовал метод insert. Очевидно, что это баг реализации SQLightDriver. Очевидно, потому что insert есть в ISQLDriver, но не реализована в SQLightDriver. &lt;br /&gt;С другой стороны, у нас есть функция insert_record, которая добавляет новую запись в таблицу. Insert_record знает, что если она работает с интерфейсом ISQLDriver, то в объекте драйвера, который приходит как параметр, точно должна быть функция insert. В противном случае – баг в классе объекта. В данном случае, функции insert_record достаточно убедится, что класс объекта наследуется от ISQLDriver:&lt;br /&gt;&lt;br /&gt;if ( !$db_driver-&gt;isa('ISQLDriver') ) {&lt;br /&gt;    die "$db_driver is not an ISQLDriver";&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;У нас может появиться новый класс-драйвер для СУБД. И если этот класс реализовывает ISQLDriver – то код функции insert_record менять не нужно будет. &lt;br /&gt;&lt;br /&gt;Так что есть место для интерфейсных классов, при программировании на  Perl.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-9001529740072195997?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/9001529740072195997/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/04/perl_27.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/9001529740072195997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/9001529740072195997'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/04/perl_27.html' title='Какая польза от Интерфейсов в Perl?'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-4215702581164158124</id><published>2008-04-21T22:51:00.004+03:00</published><updated>2008-04-25T18:02:03.021+03:00</updated><title type='text'>Link::Dumper</title><content type='html'>&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;a href="http://chainsawblues.vox.com/library/post/three-ways-to-shoot-yourself-in-the-head---the-dangers-of-too-much-magic.html"&gt;Три способа застрелится в голову – опасность излишней магии (англ)&lt;br /&gt;Three ways to shoot yourself in the head - the dangers of too much magic&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Автор пишет об опасности применения излишней магии в при программировании на Perl. Особо интересным мне показался способ с использованием &lt;a href="http://en.wikipedia.org/wiki/Monkey_patch"&gt;Monkey Patching&lt;/a&gt;. В этой части дается совет, как избежать опасности. &lt;br /&gt;Согласен в части с фильтрацией кода (использования чего-то подобного на C-препроцессор). Конечно, макросы – это мощная вещь, но в интерпретируемом языке без них нужно обойтись.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;a href="http://www.insidecpp.ru/art/40/"&gt;Локальные переменные&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Продолжаем тему о процессе программинга и хорошем коде. На сайте Inside C++ появилась новая заметка, в которой идет речь о вреде большого количества локальных переменных в одной функции:&lt;br /&gt;&lt;blockquote&gt;Большое количество локальных переменных также может представлять собой помесь нескольких контекстов. Это означает, что функция пытается решать сразу несколько задач. В этом, очевидно, тоже нет ничего хорошего.&lt;/blockquote&gt;&lt;br /&gt;В &lt;a href="http://www.insidecpp.ru/antipatterns/spaghetti/"&gt;очень больших функциях&lt;/a&gt; иногда бывает очень много багов, причину которых найти бывает очень затруднительно. &lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;a href="http://www.businessinweb.com/"&gt;BIW - online-журнал бизнеса в интернете&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На днях открыл для себя этот ресурс. Читая некоторые посты, украдкой думаешь: «По-моему,  я это уже где-то видел... ». Но, должен сказать, что заметки там интересные. &lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;a href="http://www.liveinternet.ru/users/nokt/post72928288/"&gt;Как узнать, что ваш сын компьютерный хакер?(Is Your Son a Computer Hacker?)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Это перевод серьезной статьи, написанной серьезным человеком. Но, в наше несерьезное время ее можно определить  в раздел «Компьютерный юмор». Советую почитать. &lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;a href="http://www.frankmahler.de/mshame/index.html"&gt;Доска почета и позора Пользовательских интерфейсов&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Хорошая подборка примеров относительно юзабильности пользовательских интерфейсов. Должен заметить, что примеры хороших интерфейсов уже немного устарели, но зато примеры хреновых интерфейсов не устареют никогда :) &lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-4215702581164158124?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/4215702581164158124/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/04/linkdumper.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4215702581164158124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4215702581164158124'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/04/linkdumper.html' title='Link::Dumper'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-4285340195405403032</id><published>2008-04-19T18:12:00.001+03:00</published><updated>2008-04-19T18:26:00.330+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wishmaker'/><category scheme='http://www.blogger.com/atom/ns#' term='движок'/><category scheme='http://www.blogger.com/atom/ns#' term='фреймворк'/><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='gantry'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='engine'/><category scheme='http://www.blogger.com/atom/ns#' term='web framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Перл'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Вперед, к движковым вершинам!</title><content type='html'>Хочу написать свой движок, аля фреймворк для комфортной веб разработки на Perl. Почему на Perl? – потому что язык очень гибкий и удобный для меня. Писать на Perl – это программерсоке удовольствие :). &lt;br /&gt;Почему свой? Есть у меня идеи, реализацию которых я не видел в уже существующих Perl веб-фреймворках. Во-первых, фреймворк должен поддерживать как компонентную архитектуру так и архитектуру &lt;a href="http://ru.wikipedia.org/wiki/MVC"&gt;MVC&lt;/a&gt;. Компонентная архитектура очень удобна для небольших проектов. У меня уже есть одна старая разработка, на которой уже больше года работает мой корпоративный веб-сайтик для мониторинга результатов автоматизированного тестирования на двух десятках машин. Исходники движка можно &lt;a href="http://code.google.com/p/wme/source/checkout"&gt;скачать с Google code&lt;/a&gt;. &lt;br /&gt;Он построен на базе компонентной архитектуры: основная  логика работы находится в шаблонах. Шаблоны подключают компоненты, через которые работают с базой данных. Суть движка в том, что вся логика работы с базой данных реализовывалась в компонентах (это обычные ООПерловые модули) а логика взаимодействия этих компонентов между собой и представление данных – в &lt;a href="http://template-toolkit.org/"&gt;Template toolkit&lt;/a&gt; шаблонах, которые динамически подключали нужные им компоненты. &lt;br /&gt;Компонентная архитектура очень удобна для того, чтобы можно было бы быстренько и понятно состряпать нужную веб страничку. Ненужно играться с всякими там контроллерами. Есть шаблон, подключил компоненты – и вызывай себе их методы для дальнейшего отображения данных. &lt;br /&gt;Движок этот, в принципе, не плохой получился.  Но, только для создания небольших вспомогательных сайтов и домашних страничек. Я допустил несколько довольно значительных ошибок при проектировании движка, которое проходило вместе с его реализацией :)&lt;br /&gt;Сейчас же я решил разработать MVC фреймворк. Пораскинув мозгами, я заметил, что, на самом деле компонентная архитектура – это частный случай MVC. В этом случае, контроллер универсален и лишь запускает обработку шаблона. Шаблоны в свою очередь непосредственно могут подключать и работать с моделями напрямую. Это делается красиво и без проблем, если использовать такой мощный шаблонизатор как Template toolkit. Но, я не хочу затачивать фреймворк под конкретный шаблонизатор, точно так же как и не хочу затачивать его под конкретную реализацию &lt;a href="http://ru.wikipedia.org/wiki/ORM"&gt;ORM&lt;/a&gt;’a или модуля для доступа/создания/валидации форм. Должна быть возможность в любой момент времени заменить один модуль системы на другой, более удобный для решения конкретной задачи. &lt;br /&gt;В такой ситуации может помочь применения интерфейсного программирования. Интерфейсы будут описывать правила работы фреймворка, внося ясность в то, как функционирует система. Нечто похожее есть в веб-фреймворке &lt;a href="http://catalyst.perl.org/"&gt;Catalyst&lt;/a&gt;. Там, к примеру, плагин для конкретного шаблонизатора наследует класс Catalyst::View, который содержит метод process для обработки шаблона.  Хотя, таких общих методов для разных шаблонизаторов может быть и побольше, так как это реализовано в &lt;a href="http://www.usegantry.org/"&gt;Gantry&lt;/a&gt;. &lt;br /&gt;Интерфейсный подход жизненно необходим при разработки приложений, использующих технологию &lt;a href="http://ru.wikipedia.org/wiki/Component_Object_Model"&gt;COM&lt;/a&gt;. Но, насколько он  будет полезен при создании веб приложений – нужно будет еще узнать на практике.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-4285340195405403032?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/4285340195405403032/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/04/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4285340195405403032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4285340195405403032'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/04/blog-post.html' title='Вперед, к движковым вершинам!'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-2348201707109515823</id><published>2008-04-13T11:32:00.000+03:00</published><updated>2008-04-13T11:34:17.356+03:00</updated><title type='text'>VIM – это самый непродуктивный редактор в мире!</title><content type='html'>Вот так вот, открыл файл, чтобы подправить пару строчек. Ага, нужно было сделать несколько однотипных действий. Записал макрос. Замапил его на клавишу &lt;F2&gt;. Применил к каждой строчке. Вспомнил, что в VIM можно пользоваться диапазонами строк для применения макроса. Откатил изменения, воспользовался диапазонами. Вспомнил, что недавно скачал подсветку borland.vim. Попробовал ее. Вроде нормально. Открыл _vimrc в новом буфере, изменил там цветовую схему по умолчанию. Появился MiniBufExplorer – плагин, с помощью которого можно переключатся между буферами. Захотел вернутся на предыдущей файл. Можно было бы, конечно, кликнуть по его имени мышкой – но это не прикольно. Вспомнил команду bprev для возврата в предыдущей буфер. Длинно как-то. Полазил в хелпе. Оказывается есть bp...&lt;br /&gt;Потратил 25 минут на файл, который можно было бы отредактировать за минуту в Блокноте. &lt;br /&gt;Честно говоря, VIM – это не редактор, а хобби :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-2348201707109515823?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/2348201707109515823/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/04/vim.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2348201707109515823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/2348201707109515823'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/04/vim.html' title='VIM – это самый непродуктивный редактор в мире!'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-831861808718391692</id><published>2008-04-06T00:48:00.002+03:00</published><updated>2008-04-06T00:52:10.244+03:00</updated><title type='text'>System Refresh – это очень полезно</title><content type='html'>Должен сказать, что переустановка Виндов – бодрит. Раньше я переустанавливал Винды каждый месяц. Винды, прожившие больше 25 дней – это была редкость для меня. Со временем на этот священный обряд у меня уже не хватало ни времени, ни желания.&lt;br /&gt;Как же так! Ведь столько полезного мусора в папке «Мои документы», столько полезных программ в меню Пуск, столько часто используемых ярлыков на «Рабочем столе»... Очень не хочется терять кучу таких важных экскрементов... Вот она и прожила рекордный термин – 204 дня... Так, стоп... можно было бы, конечно, призадуматься: стоит ли обрывать жизнь Винды в таком юном возрасте, если бы у меня не лежала целая пачка готовых запакованных системных образов на любой вкус и цвет, со всеми нужными дровами и необходимым софтом, с настроенным подключением к Интернету и запущенным Апачем.&lt;br /&gt;&lt;br /&gt;Остается только доставить недостающие приложения – и все незавершенные дела можно продолжать после 30 минутной приостановки, но, уже с чистой, незаэкскременчиной системой. &lt;br /&gt;&lt;br /&gt;Должен заметить, что переустановка системы вдохновляет меня больше на продолжение работы над незавершенными делами, чем та старая система с кучей мусора и неоправданными тормозами.&lt;br /&gt;&lt;br /&gt;Да... ведь в этом посте должно быть что-то полезное :)&lt;br /&gt;Хочу посоветовать вам программку для упаковки/распаковки образов системы – &lt;a href="http://www.acronis.ru/" target="_blank"&gt;Acronis True Image.&lt;/a&gt; Интересен тот факт, что распаковать новую систему можно прямо из старой, это означает, что вам не нужно грузится со всяких загрузочных CD и т.д.: просто выбираем нужный образ, жмем: Дальше, Дальше, Дальше, Окей – и идем на перекур. По возвращению нас будет ждать уже новая готовая к работе система. &lt;br /&gt;Эта фича Акрониса может быть использована, например, в автоматизированном тестировании приложения: после завершения тестов (например, &lt;a href="http://en.wikipedia.org/wiki/Smoke_testing"&gt;smoke-тестов&lt;/a&gt; ), скрипт может сам отправить результат, записать необходимую конфигурационную информацию на диск D:, распаковать чистую систему, запустится на чистой системе и ожидать нового билда приложения для тестирования.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-831861808718391692?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/831861808718391692/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/04/system-refresh.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/831861808718391692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/831861808718391692'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/04/system-refresh.html' title='System Refresh – это очень полезно'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-1998748874391075008</id><published>2008-04-05T19:50:00.003+03:00</published><updated>2008-04-29T11:38:42.609+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='cpp'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>Обмен переменных значениями: самый быстрый и самый Perl'овый способ</title><content type='html'>Не часто, но иногда у меня возникают такие ситуации, когда необходимо сделать обмен значений пары переменных. Самое тривиальное решение этой задачи  -  использование временной переменной:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;use strict; use warnings;&lt;br /&gt;my $min = 10;&lt;br /&gt;my $max = 2;&lt;br /&gt;print "Before: \$min = $min; \$max = $max\n";&lt;br /&gt;my $tmp = $min;&lt;br /&gt;$min = $max;&lt;br /&gt;$max = $tmp;&lt;br /&gt;print "After: \$min = $min; \$max = $max\n";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Это способ хороший, но содержит очень много букв. Ведь есть более Perl'овый способ обмена переменных значениями, заключающийся в использовании списков:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;use strict; use warnings;&lt;br /&gt;&lt;br /&gt;my $min = 10;&lt;br /&gt;my $max = 2;&lt;br /&gt;&lt;br /&gt;print "Before: \$min = $min; \$max = $max\n";&lt;br /&gt;($min, $max) = ($max, $min);&lt;br /&gt;print "After: \$min = $min; \$max = $max\n";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Это самый красивый способ обмена, но существует еще один способ: использование бинарной операции XOR. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;use strict; use warnings;&lt;br /&gt;&lt;br /&gt;my $min = 10;&lt;br /&gt;my $max = 2;&lt;br /&gt;&lt;br /&gt;print "Before: \$min = $min; \$max = $max\n";&lt;br /&gt;$min = $min ^ $max;&lt;br /&gt;$max = $max ^ $min;&lt;br /&gt;$min = $min ^ $max;&lt;br /&gt;&lt;br /&gt;# $min ^= $max;&lt;br /&gt;# $max ^= $min;&lt;br /&gt;# $min ^= $max;&lt;br /&gt;&lt;br /&gt;print "After: \$min = $min; \$max = $max\n";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Хм... самый напрягающий способ. Он то работает... но... как? Разобраться тут, с  первого взгляда, не просто:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# $min == 1010&lt;br /&gt;# $max == 0010&lt;br /&gt;&lt;br /&gt;$min = $min ^ $max;&lt;br /&gt;# $min == 1010 $min == 1000&lt;br /&gt;# $max == 0010&lt;br /&gt;&lt;br /&gt;$max = $max ^ $min;&lt;br /&gt;# $min == 1000  &lt;br /&gt;# $max == 0010 $max == 1010&lt;br /&gt;&lt;br /&gt;$min = $min ^ $max;&lt;br /&gt;# $min == 1000 $min == 0010&lt;br /&gt;# $max == 1010&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Это сложный способ. Для использования в Perl-скриптах - абсолютно не подходит. Но, он может быть полезен при оптимизации кода в других языках, например C или C++. Все дело в том, что при таком подходе не используется вспомогательная переменная, а это экономия памяти. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Кто быстрее?&lt;/h2&gt;&lt;br /&gt;Следующий код изменяет производительность описанных выше способов обмена переменных значениями:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;use strict; use warnings;&lt;br /&gt;use Benchmark qw(:all);&lt;br /&gt;&lt;br /&gt;sub bin_xchg(\$\$) {&lt;br /&gt; my ($var_ref1, $var_ref2) = @_;&lt;br /&gt; $$var_ref1 ^= $$var_ref2;&lt;br /&gt; $$var_ref2 ^= $$var_ref1;&lt;br /&gt; $$var_ref1 ^= $$var_ref2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub list_xchg(\$\$) {&lt;br /&gt; my ($var_ref1, $var_ref2) = @_;&lt;br /&gt; ($$var_ref1, $$var_ref2) = ($$var_ref2, $$var_ref1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub helper_xchg(\$\$) {&lt;br /&gt; my ($var_ref1, $var_ref2) = @_;&lt;br /&gt; my $tmp = $$var_ref1;&lt;br /&gt; $$var_ref1 = $$var_ref2;&lt;br /&gt; $$var_ref2 = $tmp;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;my $a = 10;&lt;br /&gt;my $b = 1;&lt;br /&gt;&lt;br /&gt;cmpthese(10000000, {&lt;br /&gt;        'BIN'    =&gt; sub { bin_xchg($a, $b)    },&lt;br /&gt;        'HELPER' =&gt; sub { helper_xchg($a, $b) },&lt;br /&gt;        'LIST'   =&gt; sub { list_xchg($a, $b)   },&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Этот бенчьмарк выдал следующие результаты:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Rate BIN LIST HELPER&lt;br /&gt;BIN 109228/s -- -2% -4%&lt;br /&gt;LIST 111001/s 2% -- -3%&lt;br /&gt;HELPER 114318/s 5% 3% --&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В этом бенчьмарке, чем больше значение Rate - тем быстрее работает код. Оказывается, что бинарный способ не только плохо читается, но еще и работает медленнее. Использование вспомогательной переменной - самый быстрый способ в Perl, но он ненамного быстрее самого красивого и читабельного способа, использующего списки. &lt;br /&gt;&lt;br /&gt;Для Perl я выбираю "золотую середину": &lt;span style="font-weight:bold;"&gt;($a, $b) = ($b, $a);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Я упоминал, что бинарный подход может быть полезен при использовании в C или C++. Следующий код измеряет время, требуемое на выполнение операций бинарного обмена значений и обмена с использованием вспомогательной переменной:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;const int ITERATIONS = 400000000;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; long l;&lt;br /&gt; int min = 10;&lt;br /&gt; int max = 1;&lt;br /&gt; &lt;br /&gt; cout &lt;&lt; "Xchg with helper variable\n";&lt;br /&gt; l = clock();&lt;br /&gt; for ( int i = 0; i &lt; ITERATIONS; i++ ) {&lt;br /&gt;  int tmp = min;&lt;br /&gt;  min = max;&lt;br /&gt;  max = tmp;&lt;br /&gt; }&lt;br /&gt; cout &lt;&lt; (clock()-l)/1000.0 &lt;&lt; "s.\n";&lt;br /&gt;&lt;br /&gt; cout &lt;&lt; "Xchg with binary XOR\n";&lt;br /&gt; l = clock();&lt;br /&gt; for ( int i = 0; i &lt; ITERATIONS; i++ ) {&lt;br /&gt;  min ^= max;&lt;br /&gt;  max ^= min;&lt;br /&gt;  min ^= max;&lt;br /&gt; }&lt;br /&gt; cout &lt;&lt; (clock()-l)/1000.0 &lt;&lt; "s.\n";&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Результат выполнения у меня получился следующий: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Xchg with helper variable&lt;br /&gt;13.018s.&lt;br /&gt;Xchg with binary XOR&lt;br /&gt;23.434s.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Это означает, что бинарный XOR не только выглядит непонятно, но и работает почти в 2 раза медленнее. Для себя я решил, что XOR-способ мне не подходит. Я не вижу в нем преимуществ, а вот недостатки - огромны.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-1998748874391075008?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/1998748874391075008/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/04/perl_05.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1998748874391075008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/1998748874391075008'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/04/perl_05.html' title='Обмен переменных значениями: самый быстрый и самый Perl&apos;овый способ'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-4457178218595036374</id><published>2008-04-02T23:55:00.000+03:00</published><updated>2008-04-03T00:09:49.167+03:00</updated><title type='text'>Шаблонизатор Template toolkit теперь и в Python</title><content type='html'>Еще в январе 2008 года вышел релиз порта шаблонизатора Template toolkit 2 для языка Python. Проект Template toolkit был запущен для Perl еще в середине бородатых 90-х. Вклад Template toolkit в развитие разработки веб-приложений на языке Perl – колоссален. Но, насколько полезным может быть TT2 при использовании в Python?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Хм... а Mako то чем не угодил?&lt;/strong&gt;&lt;br /&gt;К сожалению или к счастью, реализация TT2 для Python появилась сравнительно поздно. Потребность в мощном шаблонизаторе для таких языков, как Perl, Python и Ruby, в которых удобные средства генерации HTML не реализованных на языковом уровня,   выражается особо остро, по сравнению, например, с PHP, который сам является мощным шаблонизатором. Такая потребность и повлекла за собой появление различных шаблонизаторов на любой вкус и цвет. Один шаблонный движок покрывает функциональность другого. Вся разница лишь в философии движка и его синтаксисе.&lt;br /&gt;&lt;a href="http://template-toolkit.org/"&gt;TT2&lt;/a&gt; практически не отличается от &lt;a href="http://www.makotemplates.org/"&gt;Mako&lt;/a&gt; или любого другого известного шаблонного движка по функциональности, но зато он здорово отличается в подходах создания шаблонов и их взаимодействия с основным кодом приложения.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Синтаксический сахар и собственный язык для шаблонов&lt;/strong&gt;&lt;br /&gt;TT2 использует свой простой язык для построения шаблонов. На этом языке можно описать практически все, что вам нужно не прибегая к использованию чистого Python в шаблонах. Но, между тем, Template toolkit поддерживает специальные блоки, в которых может быть использован код на чистом Питоне (PYTHON / RAWPYTHON).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Новые языковые конструкции: UNLESS и SWITCH / CASE&lt;/strong&gt;&lt;br /&gt;Конструкция UNLESS, подобна IF, только наоборот :). Блок unless выполняется, если условие ложно. Это наследство от языка Perl. Такая конструкция есть в Ruby. Просматривая буржуйский Перловый код, я не раз замечал, что эта конструкция используется очень часто. Мне же больше по душе старый добрый IF.&lt;br /&gt;Пример:&lt;br /&gt;&lt;strong&gt;[%&lt;/strong&gt; name    = 'Билл'  &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;[%&lt;/strong&gt; surname = 'Гейтс' &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;[%&lt;/strong&gt; &lt;i&gt;&lt;strong&gt;UNLESS&lt;/strong&gt;&lt;/i&gt;  name == 'Билл' &amp;amp;&amp;amp;  surname == 'Гейтс' &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;Нам сказали таких не пущать! :(&lt;br /&gt;&lt;strong&gt;[%&lt;/strong&gt; &lt;strong&gt;&lt;i&gt;ELSE&lt;/i&gt;&lt;/strong&gt; &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;Захады, дарагой, гостэм будешь! :)&lt;br /&gt;[&lt;strong&gt;%&lt;/strong&gt; &lt;strong&gt;&lt;i&gt;END&lt;/i&gt;&lt;/strong&gt; &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;IF&lt;/i&gt;&lt;/strong&gt;  !(name == 'Билл' &amp;amp;&amp;amp;  surname == 'Гейтс') &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;Нам сказали таких не пущать! :(&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;ELSE&lt;/i&gt; %]&lt;/strong&gt;&lt;br /&gt;Захады, дарагой, гостэм будешь! :)&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;END&lt;/i&gt; %]&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Результат:&lt;br /&gt;&lt;blockquote&gt;Захады, дарагой, гостэм будешь! :)&lt;br /&gt;Захады, дарагой, гостэм будешь! :)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;А вот конструкция SWITCH / CASE будет полезной заменой цепочек if-elif-else и извращений с анонимными ассоциативными массивами.&lt;br /&gt;Пример:&lt;br /&gt;&lt;strong&gt;[% &lt;/strong&gt;age    = 16  &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;[%&lt;/strong&gt; &lt;strong&gt;&lt;i&gt;SWITCH&lt;/i&gt;&lt;/strong&gt; age&lt;strong&gt; %]&lt;/strong&gt;&lt;br /&gt;[&lt;strong&gt;% &lt;/strong&gt;&lt;i&gt;&lt;strong&gt;CASE&lt;/strong&gt;&lt;/i&gt; 0 &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt; Это шутка такая, да?&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;CASE&lt;/i&gt;&lt;/strong&gt; [1..17] &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt; А может лучше на футбол, чем на этом сайте сидеть?&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;CASE&lt;/i&gt;&lt;/strong&gt; [18, 19, 20, 21, 22, 23, 24 ] &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt; В двери стучат из военкомата...&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;CASE DEFAULT&lt;/i&gt; %]&lt;/strong&gt;&lt;br /&gt; Фух, хоть сейчас можно на сайте спокойно посидеть :)&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;END&lt;/i&gt; %]&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Результат:&lt;br /&gt;&lt;blockquote&gt;А может лучше на футбол, чем на этом сайте сидеть?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Template toolkit поддерживает и другие языковые конструкции и операторы, аналоги которых есть в Питоне:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;FOREACH – аналог for. Поддерживается несколько форм записи.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;WHILE – аналог обычного, старого доброго while.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;IF / UNLESS / ELSIF / ELSE – ветвление&lt;br /&gt;&lt;/li&gt;&lt;li&gt;USE – это аналог import. Служит для загрузкигрузки плагинов, написанных на Python.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TRY / THROW / CATCH / FINAL – Обработка исключений непосредственно внутри шаблона.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;NEXT, LAST – управление итерациями цикла. NEXT == continue;  LAST ==break.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;RETURN, STOP – Это остановка обработки только включаемого шаблона и полная остановка обработки всех шаблонов соответственно.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;Манипуляция блоками текста: фильтры, включения, блоки, обвертки и макросы&lt;/strong&gt;&lt;br /&gt;Удобство при работе с блоками текста – это, на мой взгляд, самая необходимая функциональность, предоставляемая шаблонным движком. И у Template toolkit она развита на достаточно высоком уровне.&lt;br /&gt;&lt;br /&gt;Включения позволяют собирать шаблон страницы из частей, разбросанных по разным файлам либо вызывать именованные шаблоны. Template toolkit поддерживает 3 вида включения:&lt;br /&gt;INSERT – включить шаблон без обработки&lt;br /&gt;INCLUDE – включить и обработать шаблон. Все переменные включаемого файла или именованного шаблона будут находиться в локальном пространстве имен.&lt;br /&gt;PROCESS – аналог INCLUDE, при этом все переменные будут жить в глобальном пространстве имен “главного” шаблона.&lt;br /&gt;Кроме этого, PROCESS и INCLUDE используются для обработки текстовых блоков BLOCK.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Обвертки и блоки&lt;/strong&gt;&lt;br /&gt;BLOCK – это именованный шаблон, вызываемый с помощью директив PROCESS, INCLUDE, INSERT, WRAPPER. По принципу действия блок похож на функцию, которая возвращает текстовые данные. Блок можно вызывать как с параметрами, так и без, в любом месте обрабатываемого шаблона.&lt;br /&gt;Обвертки – это специальный вид блоков, один из параметров которого есть текст, который был заключен в директиву WRAPPER. Этот текст доступен через специальную переменную [% content %] внутри BLOCK. Сначала обрабатывается содержимое переменной [% content %], и лишь потом оно обрамляется в данные блока.&lt;br /&gt;К примеру, в блоке может быть реализована шапка и подвал страницы (т.е. ее макет; layout). А содержимое страницы может непосредственно попадать в готовый макет посредствам директивы WRAPPER.&lt;br /&gt;Пример:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;BLOCK &lt;/i&gt;&lt;/strong&gt;layout &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;Это шапка сайта&lt;br /&gt;Заголовок: &lt;strong&gt;[%&lt;/strong&gt; title or 'Без имени' &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;---------------&lt;br /&gt;&lt;strong&gt;[%&lt;/strong&gt; content &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;---------------&lt;br /&gt;А это подвал&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;END&lt;/i&gt; %]&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;WRAPPER&lt;/i&gt;&lt;/strong&gt; layout title='My title' &lt;strong&gt;%]&lt;/strong&gt;&lt;br /&gt;А тут содержимое страницы!&lt;br /&gt;&lt;strong&gt;[% &lt;i&gt;END&lt;/i&gt; %]&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Результат:&lt;br /&gt;&lt;blockquote&gt;Это шапка сайта&lt;br /&gt;Заголовок: My title&lt;br /&gt;---------------&lt;br /&gt;А тут содержимое страницы!&lt;br /&gt;---------------&lt;br /&gt;А это подвал&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;В отличие от блоков – макросы возвращают результаты вычислений, описанных непосредственно в шаблоне, это обычная функция. Для объявления макроса используется директива MACRO. Вызываются макросы по имени и могут участвовать в условиях и вычислениях.&lt;br /&gt;Директива FILTER  по принципу действия подобна WRAPPER. Отличие состоит в том, что FILTER вызывает специальную функцию, написанную на Python для обработки куска текста, а не именованный шаблон, как это делает  WRAPPER.&lt;br /&gt;Есть еще много того, о чем я не рассказал: о включение кода на Python внутри шаблона, о богатых возможностях конфигурирования шаблонного движка, о некоторых директивах... Все это вы можете узнать из руководств по Template toolkit’у, ссылки на которые я приведу в конце заметки.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Так зачем же нужен еще один шаблонизатор?&lt;/strong&gt;&lt;br /&gt;Template toolkit предоставляет свой подход при работе с шаблонами. Основная изюминка TT в том, что он использует свой, простой для изучения язык для составления шаблонов, который, при обработке движком, компилируется в Perl или Python. Так что вы не много потеряете в производительности, получая при этом удобство при программировании шаблонов. Хоть этот язык и прост для освоения, но при этом он поддерживает необходимые конструкции ветвления, циклы и управление временем выполнения шаблона, вызов методов переданных объектов и подключенных Питоновских модулей.&lt;br /&gt;Template toolkit будет очень удобен для программистов, которые после освоения Перла изучают Питон, так как теперь шаблонизатор можно использовать в обоих языках.&lt;br /&gt;Template toolkit – это мощь, скорость и гибкость в одном флаконе.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Что почитать дальше?&lt;/strong&gt;&lt;br /&gt;Конечно же, официальный ресурс &lt;a href="http://template-toolkit.org/"&gt;Template toolkit 2&lt;/a&gt; и не забыть зайти на страницу &lt;a href="http://template-toolkit.org/python/index.html"&gt;Template toolkit для Python&lt;/a&gt; – там есть ссылка на &lt;a href="http://template-toolkit.org/svnweb/Template-Python"&gt;svn-репозиторий&lt;/a&gt;, откуда можно взять свежий релиз.  Когда вам наскучат эти английские буковки –&lt;a href="http://template-toolkit.ru/"&gt; почитайте русскоязычную документацию&lt;/a&gt;. Информация о &lt;a href="http://ru.wikipedia.org/wiki/Template_Toolkit"&gt;TT есть и в Wiki&lt;/a&gt;.&lt;br /&gt;Скачав TT с svn-репозитория – читайте документацию в файле template/ __init__.py.&lt;br /&gt;В папке t – вы обнаружите кучу тестов, а тесты, как известно – лучшая документация для программиста.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Установка&lt;/strong&gt;&lt;br /&gt;&lt;blockquote&gt;$ python setup.py install&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Приятного тэмплэйтинга!&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-4457178218595036374?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/4457178218595036374/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/04/template-toolkit-python.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4457178218595036374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/4457178218595036374'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/04/template-toolkit-python.html' title='Шаблонизатор Template toolkit теперь и в Python'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-5835315553942221698</id><published>2008-03-30T14:57:00.000+03:00</published><updated>2008-03-30T14:59:23.145+03:00</updated><title type='text'>Создал проект на code.google.com для своего Google Charts URL парсера</title><content type='html'>При заполнении формочки для нового проекта на Гугле придумал имя моему проекту:&lt;br /&gt;yagc-server: &lt;a href="http://code.google.com/p/yagc-server/"&gt;Yet Another Google Charts server&lt;/a&gt;.&lt;br /&gt;Пока что это pre-pre-alpha версия сервера. Т.е. пока что я добился того, что он может строить PieChart (p) и Pie3DChart и то, только по будним дням и после молитвы.&lt;br /&gt;&lt;br /&gt;Исходники доступны тут:&lt;br /&gt;&lt;blockquote&gt;# Non-members may check out a read-only working copy anonymously over HTTP.&lt;br /&gt;svn checkout http://yagc-server.googlecode.com/svn/trunk/ yagc-server-read-only&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-5835315553942221698?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/5835315553942221698/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/03/codegooglecom-google-charts-url.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5835315553942221698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/5835315553942221698'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/03/codegooglecom-google-charts-url.html' title='Создал проект на code.google.com для своего Google Charts URL парсера'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-307518160958619492</id><published>2008-03-29T13:18:00.000+02:00</published><updated>2008-03-29T13:23:19.488+02:00</updated><title type='text'>Собственный сервис создания графиков на базе формата Google Charts</title><content type='html'>Миллионы программистов всего мира бьются над глобальной проблемой&lt;br /&gt;интернет-сообщества: хорошего класса-обвертки Google Charts API для PHP нет.&lt;br /&gt;Каждый день, неутомимыми энтузиастами, в их гаражах изобретаются все новые и новые велосипеды-обвертки, в большинстве из которых реализовано расширенное кодирование данных, но не реализовано простое – Simple encoding (это же фигня, что у нашего велосипеда нет заднего колеса, зато у нас есть одно переднее и среднее).&lt;br /&gt;В это не легкое время процветания велостроительной промышленности, находятся такие люди, которые готовы посягнуть на самое святое – создать собственный Google Charts сервис. Да, да товарищи, вы не ослышались (если вы слушаете эту заметку в аудио формате): не оболочку для создания УРЛов в Google Charts формате, а анализатор этих самых URLов для последующего создания графиков.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;(WTF)Вот зе фак, или зачем оно нужно?&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;При всей крутости Google Charts API – это не идеальное средство для построения графиков, но вместе с этим – очень удобное.&lt;br /&gt;Причины для создания собственного модуля построения графиков следующие:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Небезопасно передавать конфиденциальную информации компании, в которой я работаю какому-то поисковику. Для меня это главная причина.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ограничения. Раньше количество генераций графиков относительно одного хота было ограниченно. Сейчас это ограничение снято, но осталось еще одно, техническое ограничение. Методом GET больше 3кб данных не передать. Так что модно забыть о построение графиков с высокой детализацией. Это ограничение снимается за счет метода POST, но только (или пока что) на собственном сервере. Ведь данные методом POST можно и AJAX’ом передать.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Возможность настройки. К сожалению графики Google  создаются только в одном стиле: в стиле Google Charts. Google Charts поддерживает довольно большой спектр настроек, но и его может быть недостаточно: маркеры не нравятся, хочется машинку на задний фон влепить и т.п. И это легко реализовать с помощью вашей любимой библиотеки, но не с помощью Google Charts.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Хорошим решением для решения описанных проблем является использование собственного модуля для построение графиков. И этот модуль должен:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Генерировать графики по переданным ему в URL  параметрам.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Самый известный и хорошо документированный формат передачи данных для построения графиков – Google Charts API. На официальной странице находиться довольно не плохая документация сервиса с хорошими примерами использования.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Существует немалая кучка классов оболочек для генерации URL’ов в формате Google Charts API для различных языков программирования.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Использовать уже готовый движок для создания графиков. Таких движков уже существует немалое количество. Мне больше всего приглянулся jpGraph, потому что он многофункциональный и не плохо документирован. Содержит большое количество примеров использования.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;За счет использования готовой библиотеки построения графиков, функциональность которой покрывает функционал Google Charts – я упростил себе задачу: необходимо написать парсер для перевода параметров из запроса в более удобно программируемый – объектно-ориентируемый  вид для дальнейшего построения графиков при помощи используемой библиотеки.&lt;br /&gt;&lt;br /&gt;И этот парсер уже готов на 80%. В следующий заметках я выложу его код и примеры использования.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-307518160958619492?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/307518160958619492/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/03/google-charts.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/307518160958619492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/307518160958619492'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/03/google-charts.html' title='Собственный сервис создания графиков на базе формата Google Charts'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4003278278600033478.post-7360117222645727462</id><published>2008-03-27T22:34:00.000+02:00</published><updated>2008-03-27T22:36:55.527+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='например'/><category scheme='http://www.blogger.com/atom/ns#' term='отпуск'/><category scheme='http://www.blogger.com/atom/ns#' term='осень'/><category scheme='http://www.blogger.com/atom/ns#' term='скутеры'/><title type='text'>Blog-&gt;create_instance()</title><content type='html'>Тест&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4003278278600033478-7360117222645727462?l=dzhariy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dzhariy.blogspot.com/feeds/7360117222645727462/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://dzhariy.blogspot.com/2008/03/blog-createinstance.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7360117222645727462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4003278278600033478/posts/default/7360117222645727462'/><link rel='alternate' type='text/html' href='http://dzhariy.blogspot.com/2008/03/blog-createinstance.html' title='Blog-&gt;create_instance()'/><author><name>Дмитрий Жарий</name><uri>http://www.blogger.com/profile/16764200273707689152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/-0ZixJeGlgWU/Tr8CqP8YAZI/AAAAAAAABHk/7wHAoOXt-O0/s220/200_photo.png'/></author><thr:total>2</thr:total></entry></feed>
