<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:mkdir</id>
  <title>Event Log Messages</title>
  <subtitle>Бортжурнал программиста</subtitle>
  <author>
    <name>Творец</name>
  </author>
  <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom"/>
  <updated>2007-05-26T13:19:07Z</updated>
  <lj:journal username="mkdir" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://mkdir.livejournal.com/data/atom" title="Event Log Messages"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:13087</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/13087.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=13087"/>
    <title>И снова в этом зале нет пустого места )</title>
    <published>2007-05-26T13:19:07Z</published>
    <updated>2007-05-26T13:19:07Z</updated>
    <content type="html">Всем привет!&lt;br /&gt;&lt;br /&gt;Вот уже в пятый раз провожу семинар по моему любимому языку программирования &lt;a href="http://www.python.org" title="Открыть в этом окне"&gt;Python&lt;/a&gt;. Комьюнити в Украине развивается семимильными шагами. За последние полгода появилась масса новых вакансий для питонистов, об этом языке заговорили большие компании и уже сделали свои первые успешные шаги в направлении к разработке на Python. И это не может не радовать.&lt;br /&gt;&lt;br /&gt;На этот раз, семинар вновь соберет программистов, которые по-настоящему увлечены работой и преданы своему делу. Когда я вижу этих заинтересованных людей с горящими глазами, которые с интересом поглащают инфу, то на душе становится приятно ;-) Все эти увлекательные беседы во время кофе-паузы, смешные моменты во время докладов, пиво после семинара - все это очень здорово!&lt;br /&gt;&lt;br /&gt;Итак, &lt;strong&gt;2 июня 2007 года&lt;/strong&gt; в Киеве состоится очередной семинар по программированию на языке Python - &lt;a href="http://exception.org.ua/exception_05/" title="Открыть в этом окне"&gt;Exception #05&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Темой пятого семинара будет тема построения и использования гибкой компонентной модели в веб-проектах и GUI-приложениях. Докладчики расскажут о взаимодействии интерфейсов вместо взаимодействия объектов, о достоинствах различных реализаций для одного описания интерфейса на примере динамической смены скина, дадут оценку производительности, расскажут о личном опыте применения, а так же приведут исчерпывающие примеры использования компонентной модели.&lt;br /&gt;&lt;br /&gt;Доклады непосредственно связаны с новой версией объектно-ориентированного сервера приложений Zope3 (в частности zope.interface), а так же с фреймворком для GUI-приложений Ocean, который разработал наш докладчик Андрей Светлов. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Вход бесплатный&lt;/strong&gt;, как всегда =)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/exception_05/"&gt;&lt;strong&gt;Подробнее...&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/exception_05/register.html"&gt;&lt;strong&gt;Регистрация...&lt;/strong&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:12975</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/12975.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=12975"/>
    <title>С чем едят GotAPI</title>
    <published>2007-05-04T09:34:29Z</published>
    <updated>2007-05-04T09:34:29Z</updated>
    <category term="полезное"/>
    <content type="html">Всем привет!&lt;br /&gt;&lt;br /&gt;Хочу поделиться ссылкой на очень полезный и крайне удобный справочный сервис, который я использую по тысячу раз на день.&lt;br /&gt;&lt;br /&gt;Встречайте, &lt;a href="http://www.gotapi.com" title="Открыть в этом окне"&gt;&lt;strong&gt;gotAPI.com&lt;/strong&gt;&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Что же такое gotAPI?&lt;/strong&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://www.gotapi.com" title="Открыть в этом окне"&gt;gotAPI.com&lt;/a&gt; - quick developer reference for CSS, HTML, JavaScript, PHP, AJAX, SQL and more&lt;/blockquote&gt;&lt;br /&gt;&lt;strong&gt;Чем является gotAPI лично для меня:&lt;/strong&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Быстрый и очень удобный поиск нужной функции или метода для &lt;a href="http://ru.wikipedia.org/wiki/JavaScript" title="Открыть в этом окне"&gt;JavaScript&lt;/a&gt; или &lt;a href="http://ru.wikipedia.org/wiki/Python" title="Открыть в этом окне"&gt;Python&lt;/a&gt;.&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Мгновенное получение необходимой информации о свойстве &lt;a href="http://ru.wikipedia.org/wiki/CSS" title="Открыть в этом окне"&gt;CSS&lt;/a&gt; или о &lt;a href="http://ru.wikipedia.org/wiki/SQL" title="Открыть в этом окне"&gt;SQL&lt;/a&gt;-команде для &lt;a href="http://ru.wikipedia.org/wiki/PostgreSQL" title="Открыть в этом окне"&gt;PostgreSQL&lt;/a&gt;.&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; gotAPI позволяет мне &lt;strong&gt;вспоминать&lt;/strong&gt; названия функций, медотов, свойств, команд и т.д., которые я вдруг забыл.&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Удобный интерфейс с добавлением/удалением закладок.&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; gotAPI подсказывает ключевые слова поиска пока я набираю то, что мне нужно.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;В чем идея gotAPI?&lt;/strong&gt;&lt;br /&gt;gotAPI знает много онлайновых мануалов и осуществляет быстрый поиск по ним. Это, как бы, отправная точка для поиска нужной документации. gotAPI избавляет программиста от хождения по различным докам, которые находятся на разных ресурсах.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Что "знает" gotAPI?&lt;/strong&gt;&lt;br /&gt;HTML, CSS, CSS2, JavaScript/DOM, Google GWT, Prototype.js, jQuery 1.0.3, Yahoo! UI, XML, XSL, XPath, C, C++, PHP, Ruby, RoR, Python, Perl, ActionScript, Groovy, Drupal CMS, Flickr API, Prolog, MySQL, PostgreSQL, Oracle, Java, J2SE, J2EE, Struts, Hibernate, Spring, JUnit, J2ME, Apache Ant... и многое другое.&lt;br /&gt;&lt;br /&gt;Лично я храню gotAPI на панели закладок своего браузера, чего и вам советую :-)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:12705</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/12705.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=12705"/>
    <title>PHP: светлые воспоминания</title>
    <published>2007-04-04T23:11:37Z</published>
    <updated>2007-04-06T13:46:28Z</updated>
    <content type="html">&lt;span class='ljuser' lj:user='mourk' style='white-space: nowrap;'&gt;&lt;a href='http://mourk.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://mourk.livejournal.com/'&gt;&lt;b&gt;mourk&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;: Кстати, после джавы я не могу понять, почему в PHP нету команды gc()?&lt;br /&gt;&lt;span class='ljuser' lj:user='mkdir' style='white-space: nowrap;'&gt;&lt;a href='http://mkdir.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://mkdir.livejournal.com/'&gt;&lt;b&gt;mkdir&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;: Потому что автоматическая отчистка мусора есть.&lt;br /&gt;&lt;b style="color:red"&gt;Zurg:&lt;/b&gt; Так в джаве, ведь, тоже есть.&lt;br /&gt;&lt;b style="color:blue"&gt;Mkdir:&lt;/b&gt; Зато PHP - это простой, удобный и чисто объектно-ориентированный язык.&lt;br /&gt;&lt;b style="color:blue"&gt;Mkdir:&lt;/b&gt; PHP очень гибок!&lt;br /&gt;&lt;b style="color:red"&gt;Zurg:&lt;/b&gt; И красив.&lt;br /&gt;&lt;b style="color:blue"&gt;Mkdir:&lt;/b&gt; Согласен. Читаемость кода очень высока.&lt;br /&gt;&lt;b style="color:blue"&gt;Mkdir:&lt;/b&gt; Выше чем у перла.&lt;br /&gt;&lt;b style="color:red"&gt;Zurg:&lt;/b&gt; А масштабирование в PHP -- просто сказка, куда лучше чем в Pascal!&lt;br /&gt;&lt;b style="color:blue"&gt;Mkdir:&lt;/b&gt; И лучше поддерживается, нежели разные диалекты языка Basic.&lt;br /&gt;&lt;b style="color:red"&gt;Zurg:&lt;/b&gt; За что очень люблю PHP, так это за четкое следование его создателями простых и удобных code conventions!&lt;br /&gt;&lt;b style="color:blue"&gt;Mkdir:&lt;/b&gt; Пожалуй, в этом самое главное преимущество этого языка. А еще PHP хорошо справляется с задачами, которые я решаю с его помощью. Ведь не в языке дело, а в том, насколько он успешно решает мои задачи. Поэтому мой выбор - PHP!&lt;br /&gt;&lt;b style="color:red"&gt;Zurg:&lt;/b&gt; Нельзя не упомянуть профессионализм сообщества PHP-разработчиков, да, заработкам этих ребят можно позавидовать.&lt;br /&gt;&lt;b style="color:red"&gt;Zurg:&lt;/b&gt; Типичный код на PHP имеет хорошую стройную архитектуру. В этом можно убедиться, зайдя в любую библиотеку бесплатных скриптов.&lt;br /&gt;&lt;b style="color:blue"&gt;Mkdir:&lt;/b&gt; Да, PHP действительно имеет богатейшую базу кода -- сотни абстрктных классов для работы с MySQL, тысячи высококлассных CMS-систем!&lt;br /&gt;&lt;b style="color:red"&gt;Zurg:&lt;/b&gt; Кроме того, PHP-программисты всегда обрабатывают ошибки, а не выводят стектрейс пользователям. А так же используют мощную базу MySQL, даже не представляю более удобной СУБД!&lt;br /&gt;&lt;b style="color:blue"&gt;Mkdir:&lt;/b&gt; Согласен с тобою по всем пунктам.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:12526</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/12526.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=12526"/>
    <title>Активный форум для питонистов.</title>
    <published>2007-02-21T11:54:38Z</published>
    <updated>2007-02-21T11:54:38Z</updated>
    <category term="python"/>
    <content type="html">Всем привет.&lt;br /&gt;&lt;br /&gt;Хочу рассказать об одном из самых активных русскоязычных форумов (или даже о самом активном форуме) по языку Python.&lt;br /&gt;Это форум на сайте python.com.ua: &lt;a href="http://python.com.ua/forum/"&gt;http://python.com.ua/forum/&lt;/a&gt;&lt;br /&gt;Основной контингент форума по странам: Россия, Украина, Белоруссия и Казахстан.&lt;br /&gt;&lt;br /&gt;Размеры и активность форума растут на удивление быстро.&lt;br /&gt;Темы форума охватывают практически все области применения python.&lt;br /&gt;Форумчане демонстрируют дружелюбность и соучастие. Вместе решают проблемы, вместе переводят документации и вместе радуются этому замечательному языку программирования =)&lt;br /&gt;&lt;br /&gt;Сразу хочу оговориться, что я не являюсь заинтересованной стороною и пишу пост не для пиара, а просто в качестве рекомендации хорошего и правильного ресурса.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:12126</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/12126.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=12126"/>
    <title>SSH через модуль Pexpect</title>
    <published>2007-01-31T12:58:27Z</published>
    <updated>2007-01-31T12:59:38Z</updated>
    <category term="python"/>
    <content type="html">На блоге &lt;a href="http://www.palovick.com/"&gt;Douglas Palovick&lt;/a&gt;'а нашёл запись в блоге  "&lt;a href="http://www.palovick.com/code/python/python-ssh-client.php"&gt;Python SSH SCP and Expect Example Script&lt;/a&gt;", в которой рассказывается о простом способе использования SSH и SCP без SSH-ключей при помощи модуля &lt;a href="http://pexpect.sourceforge.net/"&gt;Pexpect&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.palovick.com/code/python/python-ssh-client.php"&gt;читать ...&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:11970</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/11970.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=11970"/>
    <title>Exception #03</title>
    <published>2007-01-31T09:47:52Z</published>
    <updated>2007-01-31T09:49:30Z</updated>
    <content type="html">28 января 2007 года - прошёл очередной семинар по языку Python в Киеве - "&lt;a href="http://exception.org.ua/exception_03/photos/"&gt;Exception #03"&lt;/a&gt;.&lt;br /&gt;Семинар проводился в конференц-зале гостиницы "Санкт-Петербург" (бул. Т. Шевченко 4) и длился 3 часа.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/exception_03/photos/IMG_0213.jpg"&gt;Сергей&lt;/a&gt; &lt;a href="http://exception.org.ua/exception_03/photos/IMG_0182.jpg"&gt;Щетинин&lt;/a&gt; рассказал о метапрограммировании в Python на примере декораторов (прим. декораторы в Python аналогичны annotations в Java). &lt;a href="http://exception.org.ua/exception_03/photos/IMG_0227.jpg"&gt;Олег&lt;/a&gt; &lt;a href="http://exception.org.ua/exception_03/photos/IMG_0215.jpg"&gt;Нога&lt;/a&gt; портировал Traits на Python и поведал о том, как можно решить некоторые проблемы множественного наследования.&lt;br /&gt;Доклады были интересны и познавательны.&lt;br /&gt;&lt;br /&gt;В конце семинара провели &lt;a href="http://exception.org.ua/exception_03/photos/IMG_0273.jpg"&gt;дискуссию&lt;/a&gt;. Участники семинара разделились на два лагеря: те кто поддерживает Traits и те, кто против него =)&lt;br /&gt;Были приведены интересные доводы "за" и "против" Traits и множественного наследования вообще.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/exception_03/photos/IMG_0214.jpg"&gt;Уютная&lt;/a&gt; &lt;a href="http://exception.org.ua/exception_03/photos/IMG_0186.jpg"&gt;атмосфера&lt;/a&gt; семинара способствовала плодотворному общению и обмену опытом.&lt;br /&gt;Кто приходил, оставьте, пожалуйста, свои отзывы )&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/exception_03/photos/"&gt;Фотографии&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:11620</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/11620.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=11620"/>
    <title>Python sidebar</title>
    <published>2007-01-31T09:25:12Z</published>
    <updated>2007-01-31T13:00:02Z</updated>
    <category term="firefox"/>
    <category term="python"/>
    <content type="html">&lt;a href="http://www.edgewall.org/python-sidebar/"&gt;&lt;strong&gt;Python sidebar&lt;/strong&gt;&lt;/a&gt; - это "плагин" для браузера &lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;FireFox&lt;/a&gt;, который позволяет получать быстрый и более удобный доступ к документации по языку &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/data/python-sidebar.jpg" title="Открыть в этом окне"&gt;&lt;img src="http://exception.org.ua/data/python-sidebar_.jpg" width="100" height="80" border="0" alt="python-sidebar screenshot" /&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:11302</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/11302.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=11302"/>
    <title>Семинар по языку Python в Киеве</title>
    <published>2006-11-21T09:46:49Z</published>
    <updated>2006-11-21T10:38:54Z</updated>
    <category term="python"/>
    <content type="html">&lt;a href="http://exception.org.ua/"&gt;&lt;img src="http://exception.org.ua/img/logo.png" width="265" height="136" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;30 ноября 2006&lt;/b&gt; - в Киеве состоится очередной семинар по языку программирования Python - "&lt;a href="http://exception.org.ua/exception_02/"&gt;Exception #02&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Главной темой второго семинара будет тема использования Python совместно с другими языками программирования. Докладчики поведают об особенностях взаимодействия Python с языками &lt;b&gt;C&lt;/b&gt; и &lt;b&gt;C++&lt;/b&gt; на примере применения таких инструментов как FFI, SWIG, Boost::Python, SIP, Ctypes, и приведут множество примеров где Python хорошо зарекомендовал себя как вспомогательный язык, облегчающий процесс разработки на C/C++.&lt;br /&gt;&lt;br /&gt;Семинар "&lt;b&gt;Exception #02&lt;/b&gt;" будет интересен как системным программистам, так и разработчикам прикладных программ, которые нуждаются в расширении функциональности за счёт внедрения скриптового языка. Так же, Python отлично подходит в качестве скриптового языка для прототипирования и умелое применение его с этой целью выведет процесс разработки вашего программного обеспечения на новый качественный уровень.&lt;br /&gt;&lt;br /&gt;На этом преимущества данного мероприятия не исчерпываются. На семинаре у вас есть шанс обрести единомышленников, найти друзей, задать интересующие вопросы, обменяться опытом, а так же встретить потенциальных партнёров по работе =)&lt;br /&gt;&lt;br /&gt;Всех заинтересовавшихся просим к регистрации: &lt;a href="http://exception.org.ua/exception_02/register.html"&gt;http://exception.org.ua/exception_02/register.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S.: Главным организатором семинара по-прежнему остаюсь я.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:11232</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/11232.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=11232"/>
    <title>Как я живу под Ubuntu GNU/Linux</title>
    <published>2006-11-15T08:54:48Z</published>
    <updated>2006-11-15T16:14:46Z</updated>
    <category term="linux"/>
    <content type="html">Решил поделиться с общественностью своими скриншотами и заодно рассказать о софте, который использую.&lt;br /&gt;&lt;br /&gt;Пожалуй, начну с десктопа. У меня стоит &lt;a href="http://ru.wikipedia.org/wiki/Xgl"&gt;XGL&lt;/a&gt; + &lt;a href="http://www.beryl-project.org/"&gt;Beryl&lt;/a&gt;.&lt;br /&gt;Замечательная штука! "Плавающие" резиновые окна, десктопы, располагающиеся на кубе, который можно вращать мышью, куча различных эффектов сворачивания/разворачивания окон (например, при сворачивании, окно сжимается и стягивается вниз или воспламеняется), Zoom десктопа и многое многое другое.&lt;br /&gt;&lt;br /&gt;Что такое XGL + Beryl и с чем его едят можно увидеть, поискав в &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt; и &lt;a href="http://video.google.com/"&gt;Google Video&lt;/a&gt;.&lt;br /&gt;Вот несколько ссылочек для начала: &lt;a href="http://video.google.com/videoplay?docid=4471114863140451531&amp;amp;q=XGL+beryl"&gt;раз&lt;/a&gt;, &lt;a href="http://video.google.com/videoplay?docid=8140106088360388627&amp;amp;q=XGL+beryl"&gt;два&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=8hVyoLhMcyA&amp;amp;mode=related&amp;amp;search="&gt;три&lt;/a&gt;.&lt;br /&gt;Возможно, когда-нибудь и своё видео сделаю =)&lt;br /&gt;&lt;br /&gt;Поехали дальше. Первые два окна демонстрируют прозрачность и обрамление окон.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/data/XGL1_big.jpg"&gt;&lt;img src="http://exception.org.ua/data/XGL1.jpg" width="188" height="150" border="0"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://exception.org.ua/data/XGL2_big.jpg"&gt;&lt;img src="http://exception.org.ua/data/XGL2.jpg" width="188" height="150" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;На следующем скриншоте можно увидеть как работает Internet Explorer 6.0. Кстати, у меня одновременно стоят IE5.0, IE5.5 и IE6.0 :-)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/data/XGL3_big.jpg"&gt;&lt;img src="http://exception.org.ua/data/XGL3.jpg" width="188" height="150" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вот так выглядит мой &lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;FireFox 2.0&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/data/XGL4_big.jpg"&gt;&lt;img src="http://exception.org.ua/data/XGL4.jpg" width="188" height="150" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Тут &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; с плагином &lt;a href="http://pydev.sourceforge.net/"&gt;PyDev&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/data/XGL5_big.jpg"&gt;&lt;img src="http://exception.org.ua/data/XGL5.jpg" width="188" height="150" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;А эти два скриншота демонстрируют работу словаря &lt;a href="http://stardict.sourceforge.net/"&gt;StarDict&lt;/a&gt;.&lt;br /&gt;Кстати, он мне больше нравится чем Lingvo: удобнее интерфейс + больше словарей.&lt;br /&gt;Чтобы получить перевод слова достаточно его выделить. Ну разве это не замечательно?! =)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/data/XGL6_big.jpg"&gt;&lt;img src="http://exception.org.ua/data/XGL6.jpg" width="188" height="150" border="0"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://exception.org.ua/data/XGL7_big.jpg"&gt;&lt;img src="http://exception.org.ua/data/XGL7.jpg" width="188" height="150" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Так и живём. Кстати, пост посвящается выходу новой Windows Vista =)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE:&lt;/b&gt; В комментах мне открыли глаза на криво настроенные шрифты.&lt;br /&gt;Я исправляюсь:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/data/fonts_big.jpg"&gt;&lt;img src="http://exception.org.ua/data/fonts.jpg" width="188" height="150" border="0" /&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:10855</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/10855.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=10855"/>
    <title>Семинар по python прошёл успешно!</title>
    <published>2006-11-05T08:55:41Z</published>
    <updated>2006-11-05T09:00:38Z</updated>
    <category term="python"/>
    <content type="html">&lt;a href="http://www.python.org"&gt;&lt;img src="http://python.org/images/python-logo.gif" width="211" height="71" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Всем привет!&lt;br /&gt;В своём &lt;a href="http://mkdir.livejournal.com/10595.html"&gt;предыдущем посте&lt;/a&gt; я писал о том, что намереваюсь провести семинар по языку программирования Python в Киеве - "&lt;a href="http://exception.org.ua/"&gt;Exception&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Рад сообщить, что мероприятие прошло очень удачно и все участники остались довольны.&lt;br /&gt;Докладчики хорошо подготовились и интересно рассказали, за что им отдельное спасибо.&lt;br /&gt;&lt;br /&gt;Фотографии, материалы и видео с моей взволнованной речью можно найти на сайте: &lt;a href="http://exception.org.ua/"&gt;http://exception.org.ua/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S.: Единственный недочёт - это отсутствие аудио.&lt;br /&gt;Я взял диктофон, но подвели аккумуляторы в самый ответственный момент.&lt;br /&gt;Аккумуляторы заряжались непосредственно перед семинаром. Видимо, сдохли.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:10595</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/10595.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=10595"/>
    <title>Семинар по языку Python в Киеве</title>
    <published>2006-10-16T14:50:19Z</published>
    <updated>2006-12-20T11:37:53Z</updated>
    <category term="python"/>
    <content type="html">&lt;a href="http://exception.org.ua/"&gt;&lt;img src="http://exception.org.ua/img/logo.png" width="265" height="136" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Привет, друзья!&lt;br /&gt;Хочу немного похвастаться и заодно попиарить себя и мероприятие, организатором которого являюсь =)&lt;br /&gt;&lt;b&gt;24 октября&lt;/b&gt; в Киеве пройдёт первый в Украине семинар по языку &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt;. Название: "&lt;a href="http://exception.org.ua/"&gt;Exception #01&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Надобность в серьёзном собрании была осознана в следствии проведения мною четырёх сходок питонистов.&lt;br /&gt;Сходки показали что в Киеве достаточно много людей, интересующихся питоном и зарабатывающих питоном на жизнь.&lt;br /&gt;Поэтому нужно создавать и развивать комьюнити! Популяризировать язык, активно делиться опытом в виде докладов и дискуссий.&lt;br /&gt;&lt;br /&gt;На &lt;a href="http://exception.org.ua/"&gt;Execption #01&lt;/a&gt; будут представлены два доклада, основной темой которых является веб-разработка: веб-фреймворки, их скорость, достоинства/недостатки, много будет сказано о &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;, докладчики уделят внимание &lt;a href="http://www.fastcgi.com/"&gt;FastCGI&lt;/a&gt;, &lt;a href="http://wsgi.org/wsgi"&gt;WSGI&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;agile development&lt;/a&gt;, &lt;a href="http://peak.telecommunity.com/DevCenter/setuptools"&gt;setuptools&lt;/a&gt;, &lt;a href="http://www.modpython.org/"&gt;mod_python&lt;/a&gt;, будет рассказано о скорости интерпретатора и о работе с памятью.&lt;br /&gt;&lt;br /&gt;Так же, после докладов и уютного кофе-брейка, намечается дискуссия на тему "Так ли необходим Python в веб-разработке?" =) Павел Шевело берёт на себя роль противника веб-разработки на python'e и будет защищать сторону &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt; и &lt;a href="http://www.perl.com"&gt;Perl&lt;/a&gt;, а остальные участники должны будут отстоять свою точку зрения =)&lt;br /&gt;&lt;br /&gt;Подведя итог, скажу, что данное мероприятие обещает быть очень интересным и полезным.&lt;br /&gt;Желающие прийти должны зарегистрироваться в обязательном порядке.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:red"&gt;Внимание!&lt;/span&gt; Вход бесплатный.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://exception.org.ua/"&gt;Страничка мероприятия с подробной информацией&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;img src="http://exception.org.ua/exception_01/photo1.jpg" width="456" height="360" alt="photo 1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://exception.org.ua/exception_01/photo2.jpg" width="453" height="360" alt="photo 2" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://exception.org.ua/exception_01/photo3.jpg" width="454" height="361" alt="photo 3" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://exception.org.ua/exception_01/photo4.jpg" width="453" height="360" alt="photo 4" /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:10393</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/10393.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=10393"/>
    <title>Emacs. Больше чем редактор.</title>
    <published>2006-08-15T08:27:29Z</published>
    <updated>2006-08-15T09:02:37Z</updated>
    <category term="emacs"/>
    <content type="html">Пожалуй, &lt;b&gt;одними из самых лучших редакторов в мире являются &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; и &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;Какой из них лучше, рассуждать не буду. И тот и другой являются мощными инструментами для редактирования кода. И тот и другой - лучшее продолжение рук для хорошего программиста =)&lt;br /&gt;&lt;br /&gt;Но всё вышесказанное не является очевидным для коренных пользователей MS Windows, которые привыкли к стандартным интерфейсам и стандартным shortcut'ам виндовых редакторов. Доказывать долго не нужно: посадите любого приверженца Windows за Emacs и дайте ему поредактировать код. Ровно через 3 минуты он забудет о нём как о кошмарном сне =) Результатом будет негативное впечатление и недоумение "как этим вообще можно пользоваться?".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Так уж исторически сложилось, что я сам являюсь пользователем Windows&lt;/b&gt; =) И, поскольку меня периодически навещает патриотическое opensource-настроение, я снова и снова совершаю попытки перейти на Vim. Прохожу туториал, настраиваю подсветку кода, некоторое время редактирую в нём код, пытаясь не обращать внимание на неудобства которые связанны с непривычкой, и всё напрасно. Инерция вновь и вновь возвращает меня к виндовым редакторам, как наркомана к наркотикам =)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Несколько раз пробовал Emacs&lt;/b&gt;. Впрочем, "пробовал" звучит несколько не точно. Правильнее сказать - "запускал и тут же закрывал". А всё из-за того, что привык к стандартным интерфейсам винды, которые позволяют без особых усилий разобраться в неизвестном софте. Но в случае с Emacs и Vim всё по-другому - сперва нужно было потратить некоторое время на ознакомление с интерфейсом и возможностями, которые не доступны интуитивно, а уж потом пользоваться. "Время терять не хотелось", - думал я, оправдывая свою лень =)&lt;br /&gt;&lt;br /&gt;В результате, долгое время я пребывал во тьме невежества =) Периодически искал нормальные редакторы под windows, менял их, искал снова. В каждом обнаруживались свои недостатки. В одних они были незначительны, в других не хватало возможностей, третьи тормозили. В последнее время долго пользовался &lt;a href="http://scite.ruteam.ru/"&gt;&lt;b&gt;SciTE&lt;/b&gt;&lt;/a&gt;. Хороший редактор, но хотелось еще большего.&lt;br /&gt;&lt;br /&gt;И вот, в один прекрасный момент, я увидел как &lt;span class='ljuser' lj:user='dan_kom' style='white-space: nowrap;'&gt;&lt;a href='http://dan-kom.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://dan-kom.livejournal.com/'&gt;&lt;b&gt;dan_kom&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; использует win-версию Emacs для редактирования исходников на питоне. Тогда я задал Диме очевидный вопрос: "&lt;b&gt;А почему именно Emacs?&lt;/b&gt;" и получил ответ: "Потому что других редакторов я не знаю". Сперва я подумал, что он действительно не знает других редакторов, но, как оказалось, Дима в своё время перепробовал очень много различных вариантов и остановился на Emacs'е как на лучшем.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Когда я увидел Emacs в действии, то снова был вдохновлён&lt;/b&gt;! В тот момент я твёрдо решил "пересесть" на Emacs, понимая что придётся некоторое время преодолевать инерцию windows-like редакторов, непривычный подход к shortcut'ам и нежелание читать документацию ;-) И я сделал это. Теперь в моих руках хороший инструмент, которым я доволен и которым я восхищаюсь.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Итоги:&lt;/b&gt; Я не агитирую использовать Emacs или Vim. Я просто хочу сказать, что не использовать первый или второй - это большое заблуждение =)&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;h3&gt;Скриншотичег&lt;/h3&gt;&lt;img src="http://flexx.kiev.ua/data/emacs_screen.gif" width="680" height="734" alt="Emacs in action"&gt;&lt;br /&gt;&lt;br /&gt;Вот так я использую Emacs. На скриншоте видно, что основное окно разбито на три части:&lt;ul style="margin-top:0;"&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;В первой части&lt;/b&gt; у меня запущен интерпретатор питона, в котором я тут же тестирую некоторые участки кода.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Во второй части&lt;/b&gt; окна я редактирую самое начало файла где находится импортирование модулей. Это удобно, так как не требуется каждый раз подниматься в самое начало файла чтобы проимпортировать еще один модуль.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;В третьей части&lt;/b&gt; я непосредственно редактирую код.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;По-моему удобно. Итак, мой выбор - Emacs.&lt;br /&gt;Спасибо за внимание.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;+ Bonus:&lt;/b&gt; полезная ссылка по Emacs: &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/SiteMap" title="EmacsWiki"&gt;EmacsWiki&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:10214</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/10214.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=10214"/>
    <title>New version of pycolorizer</title>
    <published>2006-08-11T12:54:14Z</published>
    <updated>2006-08-11T13:31:19Z</updated>
    <category term="python"/>
    <content type="html">&lt;b&gt;Новость:&lt;/b&gt; появился на свет &lt;a href="http://mkdir.livejournal.com/9377.html"&gt;pycolorizer&lt;/a&gt; v0.3b&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Изменения:&lt;/b&gt;&lt;br /&gt;* Bugfix: не открывались файлы, если в пути были русские буквы.&lt;br /&gt;* Bugfix: колорайзер не подсвечивал ключевое слово 'elif'.&lt;br /&gt;* Bugfix: файл lastpath.dat создавался в директории из которой запускалось приложение. Теперь в директории с запускным файлом.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Downloads:&lt;/b&gt;&lt;br /&gt;* &lt;a href="http://flexx.kiev.ua/data/pycolorizer/pycolorizer_0.3b.exe"&gt;&lt;b&gt;Windows installer&lt;/b&gt;&lt;/a&gt; [2,85Mb]&lt;br /&gt;* &lt;a href="http://flexx.kiev.ua/data/pycolorizer/pycolorizer_0.3b_src.zip"&gt;&lt;b&gt;Sources&lt;/b&gt;&lt;/a&gt; [9,66Kb]</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:9930</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/9930.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=9930"/>
    <title>GUI for PyColorizer 0.2b</title>
    <published>2006-08-02T10:00:56Z</published>
    <updated>2006-08-11T13:28:31Z</updated>
    <category term="python"/>
    <content type="html">Привет!&lt;br /&gt;Продолжаю тему &lt;a href="http://mkdir.livejournal.com/9377.html"&gt;расцветки питоновского синтаксиса&lt;/a&gt; для постинга в ЖЖ.&lt;br /&gt;Колорайзер работает замечательно, но из командной строки юзать его несколько неудобно. Поэтому я дописал GUI на &lt;a href="http://www.wxpython.org/"&gt;wxPython&lt;/a&gt;'e и сделал инсталлятор под Windows.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Downloads:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://flexx.kiev.ua/data/pycolorizer/pycolorizer_setup.exe"&gt;&lt;b&gt;Инсталлятор под Win32&lt;/b&gt;&lt;/a&gt;  обновлённая версия [2,82Mb]&lt;br /&gt;&lt;a href="http://flexx.kiev.ua/data/pycolorizer/pycolorizer_0.2b_src.zip"&gt;&lt;b&gt;source of version 0.2b&lt;/b&gt;&lt;/a&gt; [2,86Kb]&lt;br /&gt;&lt;br /&gt;P.S.: Инсталлятор не требует питона.&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE:&lt;/b&gt; Благодаря &lt;span class='ljuser' lj:user='lexasoft' style='white-space: nowrap;'&gt;&lt;a href='http://lexasoft.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://lexasoft.livejournal.com/'&gt;&lt;b&gt;lexasoft&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; вышла версия 0.2b. Теперь колорайзер умеет "на лету" разукрашивать исходники из Clipboard'a.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;+Bonus:&lt;/b&gt; Самая свежая версия: &lt;a href="http://mkdir.livejournal.com/10214.html"&gt;http://mkdir.livejournal.com/10214.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:9543</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/9543.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=9543"/>
    <title>parse_url</title>
    <published>2006-07-31T12:11:52Z</published>
    <updated>2006-07-31T12:57:32Z</updated>
    <content type="html">Написал полный аналог PHP-шной функции &lt;a href="http://php.net/parse_url"&gt;parse_url&lt;/a&gt; на питоне.&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Код:&lt;/b&gt;&lt;br /&gt;&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:16px"&gt;
&lt;b style="color:#00007F"&gt;import&lt;/b&gt; re
&lt;b style="color:#00007F"&gt;from&lt;/b&gt; urllib &lt;b style="color:#00007F"&gt;import&lt;/b&gt; unquote


&lt;b style="color:#00007F"&gt;def&lt;/b&gt; &lt;b style="color:#007F7F"&gt;parseurl&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;url&lt;b&gt;)&lt;/b&gt;:
    match = re.findall&lt;b&gt;(
        &lt;/b&gt;r&lt;span style="color:#7F007F"&gt;'^([a-z0-9]+)://(([^:]+)(:[^@]*)?@)?([^/:]+?)(:[0-9]+)?(/[^?#]+)?(\?[^#]+)?(#.*)?$'&lt;/span&gt;,
         url&lt;b&gt;)&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; &lt;b style="color:#00007F"&gt;not&lt;/b&gt; match:
        &lt;b style="color:#00007F"&gt;return&lt;/b&gt; False
    res = &lt;b&gt;{&lt;/b&gt;&lt;b&gt;}&lt;/b&gt;
    match = match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;
    res&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#7F007F"&gt;'scheme'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;
    res&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#7F007F"&gt;'host'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;   = match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;4&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;2&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;:
        res&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#7F007F"&gt;'user'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = unquote&lt;b&gt;(&lt;/b&gt;match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;2&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;3&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;:
        res&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#7F007F"&gt;'pass'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = unquote&lt;b&gt;(&lt;/b&gt;match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;3&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;1&lt;/span&gt;:&lt;b&gt;]&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;5&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;:
        res&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#7F007F"&gt;'port'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;5&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;1&lt;/span&gt;:&lt;b&gt;]&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;6&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; and match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;6&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; != &lt;span style="color:#7F007F"&gt;"/"&lt;/span&gt;:
        res&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#7F007F"&gt;'path'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = unquote&lt;b&gt;(&lt;/b&gt;match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;6&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;7&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;:
        res&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#7F007F"&gt;'query'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = unquote&lt;b&gt;(&lt;/b&gt;match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;7&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;1&lt;/span&gt;:&lt;b&gt;]&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;8&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;:
        res&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#7F007F"&gt;'fragment'&lt;/span&gt;&lt;b&gt;]&lt;/b&gt; = unquote&lt;b&gt;(&lt;/b&gt;match&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;8&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;&lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;1&lt;/span&gt;:&lt;b&gt;]&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;return&lt;/b&gt; res
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Демо:&lt;/b&gt;&lt;br /&gt;&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:16px"&gt;
&lt;b style="color:#00007F"&gt;from&lt;/b&gt; parseurl &lt;b style="color:#00007F"&gt;import&lt;/b&gt; parseurl

url = &lt;span style="color:#7F007F"&gt;"http://username:password@hostname/path?arg=value#anchor"&lt;/span&gt;
res = parseurl&lt;b&gt;(&lt;/b&gt;url&lt;b&gt;)&lt;/b&gt;
&lt;b style="color:#00007F"&gt;for&lt;/b&gt; k, v &lt;b style="color:#00007F"&gt;in&lt;/b&gt; res.items&lt;b&gt;(&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;:
    &lt;b style="color:#00007F"&gt;print&lt;/b&gt; k, &lt;span style="color:#7F007F"&gt;"=&amp;gt;"&lt;/span&gt;, v
&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Результаты:&lt;/b&gt;&lt;br /&gt;&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:16px"&gt;
fragment =&amp;gt; anchor
pass =&amp;gt; password
host =&amp;gt; hostname
user =&amp;gt; username
query =&amp;gt; arg=value
path =&amp;gt; /path
scheme =&amp;gt; http
&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:9377</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/9377.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=9377"/>
    <title>PyColorizer v0.1b - подсветка питоновских исходников.</title>
    <published>2006-07-30T04:29:34Z</published>
    <updated>2006-08-11T13:25:11Z</updated>
    <category term="python"/>
    <content type="html">Привет!&lt;br /&gt;&lt;br /&gt;В комментариях меня часто спрашивают чем я делаю &lt;b&gt;расцветку питоновских исходников&lt;/b&gt; в своих постах. Реальность заключается в том, что делаю я это вручную при помощи поиска/замены по регулярным выражениям в текстовом редакторе.&lt;br /&gt;&lt;br /&gt;Но любому терпению рано или поздно наступает конец. Два или три раза можно позволить себе поиграться таким образом, после чего охота отпадает напрочь =)&lt;br /&gt;&lt;br /&gt;Итак, ленивый &lt;span class='ljuser' lj:user='mkdir' style='white-space: nowrap;'&gt;&lt;a href='http://mkdir.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://mkdir.livejournal.com/'&gt;&lt;b&gt;mkdir&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; решил написать колорайзер питоновских исходников, предназначенный для вставки в ЖЖ-посты. На самом деле, я изобрёл велосипед. В природе уже существуют готовые разукрашиватели, такие как py2html. Но исходный код моего "велосипеда" гораздо меньше, не требует внешних библиотек и полностью отвечает моим нуждам =)&lt;br /&gt;&lt;br /&gt;Забрать колорайзер можно здесь: &lt;a href="http://flexx.kiev.ua/data/pycolorizer.py"&gt;pycolorizer.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Демонстрация результатов:&lt;/b&gt;&lt;br /&gt;&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:16px"&gt;
&lt;span style="color:#7F7F7F"&gt;# Search content of the &amp;lt;title&amp;gt; and &amp;lt;link&amp;gt; tags&lt;/span&gt;
&lt;span style="color:#7F7F7F"&gt;# and generate SQL file.&lt;/span&gt;

&lt;b style="color:#00007F"&gt;import&lt;/b&gt; re

data     = open&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#7F007F"&gt;"pdb.xml"&lt;/span&gt;, &lt;span style="color:#7F007F"&gt;"r"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;.read&lt;b&gt;(&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
pattern  = re.compile&lt;b&gt;(&lt;/b&gt;r&lt;span style="color:#7F007F"&gt;"&amp;lt;title&amp;gt;(.+?)&amp;lt;/title&amp;gt;&amp;lt;link&amp;gt;(.+?)&amp;lt;/link&amp;gt;"&lt;/span&gt;, re.DOTALL&lt;b&gt;)&lt;/b&gt;
fp = open&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#7F007F"&gt;"out.sql"&lt;/span&gt;, &lt;span style="color:#7F007F"&gt;"w"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;
&lt;b style="color:#00007F"&gt;for&lt;/b&gt; title, link &lt;b style="color:#00007F"&gt;in&lt;/b&gt; pattern.findall&lt;b&gt;(&lt;/b&gt;data&lt;b&gt;)&lt;/b&gt;:
    title = title.replace&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#7F007F"&gt;"'"&lt;/span&gt;, r&lt;span style="color:#7F007F"&gt;"\'"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;
    title = title.replace&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#7F007F"&gt;"\n"&lt;/span&gt;, r&lt;span style="color:#7F007F"&gt;"\n"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;
    fp.write&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#7F007F"&gt;"INSERT INTO feeds_list (title, link) VALUES ('%s', '%s');\n"&lt;/span&gt; % &lt;b&gt;(&lt;/b&gt;title, link&lt;b&gt;)&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
fp.close&lt;b&gt;(&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:16px"&gt;
&lt;b style="color:#00007F"&gt;from&lt;/b&gt; re &lt;b style="color:#00007F"&gt;import&lt;/b&gt; findall

&lt;span style="color:#FF8000"&gt;"""
Pycolorizer demo.
"""&lt;/span&gt;

&lt;b style="color:#00007F"&gt;try&lt;/b&gt;:
    &lt;span style="color:#7F7F7F"&gt;# bla-bla-bla&lt;/span&gt;
&lt;b style="color:#00007F"&gt;except&lt;/b&gt; Exception, e:
    &lt;span style="color:#7F7F7F"&gt;# preved&lt;/span&gt;
    &lt;b style="color:#00007F"&gt;pass&lt;/b&gt;
&lt;b style="color:#00007F"&gt;finally&lt;/b&gt;:
    &lt;b style="color:#00007F"&gt;print&lt;/b&gt; &lt;span style="color:#7F007F"&gt;"Hello world!"&lt;/span&gt;

&lt;b style="color:#00007F"&gt;def&lt;/b&gt; &lt;b style="color:#007F7F"&gt;functionName&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;param&lt;b&gt;)&lt;/b&gt;:
    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; param:
        &lt;b style="color:#00007F"&gt;print&lt;/b&gt; param
    &lt;b style="color:#00007F"&gt;else&lt;/b&gt;:
        &lt;b style="color:#00007F"&gt;print&lt;/b&gt; &lt;span style="color:#7F007F"&gt;"Fuck #not comment"&lt;/span&gt;
        &lt;b style="color:#00007F"&gt;print&lt;/b&gt; &lt;span style="color:#7F007F"&gt;'"""'&lt;/span&gt;
        &lt;b style="color:#00007F"&gt;print&lt;/b&gt; &lt;span style="color:#7F007F"&gt;"   \"  "&lt;/span&gt;
    &lt;span style="color:#7F7F7F"&gt;# comment&lt;/span&gt;
    bac = &lt;b&gt;[&lt;/b&gt;&lt;span style="color:#007F7F"&gt;1&lt;/span&gt;, &lt;b style="color:#00007F"&gt;None&lt;/b&gt;, True, False&lt;b&gt;]&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;for&lt;/b&gt; abc &lt;b style="color:#00007F"&gt;in&lt;/b&gt; bac:
        &lt;b style="color:#00007F"&gt;if&lt;/b&gt; &lt;b style="color:#00007F"&gt;not&lt;/b&gt; abc:
            &lt;b style="color:#00007F"&gt;continue&lt;/b&gt;
        &lt;b style="color:#00007F"&gt;else&lt;/b&gt;:
            &lt;b style="color:#00007F"&gt;break&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;del&lt;/b&gt; bac
    &lt;b style="color:#00007F"&gt;raise&lt;/b&gt; Exception&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#7F007F"&gt;"Medved"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;
    &lt;b style="color:#00007F"&gt;print&lt;/b&gt; &lt;span style="color:#007F7F"&gt;12345&lt;/span&gt;

&lt;b style="color:#00007F"&gt;class&lt;/b&gt; &lt;b style="color:#0000FF"&gt;ClassName&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;MegaClass&lt;b&gt;)&lt;/b&gt;:
    &lt;b style="color:#00007F"&gt;pass&lt;/b&gt;
    
&lt;b style="color:#00007F"&gt;lambda&lt;/b&gt; x, y: &lt;b style="color:#00007F"&gt;return&lt;/b&gt; x+y    
&lt;/pre&gt;&lt;br /&gt;Короче, думаю, основная идея ясна :)&lt;br /&gt;&lt;br /&gt;P.S.: А сделайте кто-нибудь под колорайзер GUI. Будет здорово!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;+Bonus:&lt;/b&gt; Теперь есть GUI. См: &lt;a href="http://mkdir.livejournal.com/9930.html"&gt;http://mkdir.livejournal.com/9930.html&lt;/a&gt;&lt;br /&gt;&lt;b&gt;++Bonus:&lt;/b&gt; Самая свежая версия: &lt;a href="http://mkdir.livejournal.com/10214.html"&gt;http://mkdir.livejournal.com/10214.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:8380</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/8380.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=8380"/>
    <title>TaskTimer</title>
    <published>2006-03-29T13:33:06Z</published>
    <updated>2006-03-29T13:33:06Z</updated>
    <category term="win32"/>
    <category term="javascript"/>
    <category term="php"/>
    <category term="ajax"/>
    <content type="html">Выложил еще два скриншота для &lt;a href="http://mkdir.livejournal.com/6836.html"&gt;TaskTimer on Ajax&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://flexx.kiev.ua/data/tt_screen1.gif"&gt;Скриншот №1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://flexx.kiev.ua/data/tt_screen2.gif"&gt;Скриншот №2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://flexx.kiev.ua/data/tt_scrshoot.gif"&gt;Старый скриншот&lt;/a&gt;&lt;/strong&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:7756</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/7756.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=7756"/>
    <title>Python и Crontab. Блокировка повторного запуска.</title>
    <published>2006-03-28T10:40:05Z</published>
    <updated>2006-03-28T10:49:53Z</updated>
    <category term="python"/>
    <content type="html">Продолжение &lt;a href="http://mkdir.livejournal.com/7484.html"&gt;предыдущего поста про блокировку&lt;/a&gt;.&lt;br /&gt;Всё то же самое, но на языке Python.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Использование модуля&lt;/b&gt;:&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:16px"&gt;
&lt;b style="color:#00007F"&gt;import&lt;/b&gt; pidLock
lock = pidLock.pidLock&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#FF8000"&gt;"/var/lock"&lt;/span&gt;, &lt;span style="color:#FF8000"&gt;"lockName"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:16px"&gt;
&lt;b style="color:#00007F"&gt;import&lt;/b&gt; os, sys

&lt;b style="color:#00007F"&gt;class&lt;/b&gt; &lt;b style="color:#0000FF"&gt;pidLock&lt;/b&gt;:
    
    &lt;b style="color:#00007F"&gt;def&lt;/b&gt; &lt;b style="color:#007F7F"&gt;__init__&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;self, lockDir = &lt;span style="color:#FF8000"&gt;"."&lt;/span&gt;, name&lt;b&gt;)&lt;/b&gt;:
        self.name     = name
        self.lockDir  = lockDir
        self.fileName = self.getLockFile&lt;b&gt;()&lt;/b&gt;
        &lt;b style="color:#00007F"&gt;if &lt;/b&gt;self.locked&lt;b&gt;()&lt;/b&gt;:
            sys.exit&lt;b&gt;()&lt;/b&gt;
        self.lock&lt;b&gt;()&lt;/b&gt;


    &lt;b style="color:#00007F"&gt;def&lt;/b&gt; &lt;b style="color:#007F7F"&gt;__del__&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;self&lt;b&gt;)&lt;/b&gt;:
        &lt;b style="color:#00007F"&gt;if &lt;/b&gt;self.locked&lt;b&gt;()&lt;/b&gt;:
            self.unlock&lt;b&gt;()&lt;/b&gt;


    &lt;b style="color:#00007F"&gt;def&lt;/b&gt; &lt;b style="color:#007F7F"&gt;getLockFile&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;self&lt;b&gt;)&lt;/b&gt;:
        &lt;span style="color:#FF8000"&gt;"""
        returns filename for lock-file.
        """&lt;/span&gt;
        fileName = self.lockDir + &lt;span style="color:#FF8000"&gt;"/"&lt;/span&gt; + self.name + &lt;span style="color:#FF8000"&gt;".lock"&lt;/span&gt;
        &lt;b style="color:#00007F"&gt;return&lt;/b&gt; fileName


    &lt;b style="color:#00007F"&gt;def&lt;/b&gt; &lt;b style="color:#007F7F"&gt;locked&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;self&lt;b&gt;)&lt;/b&gt;:
        &lt;span style="color:#FF8000"&gt;"""
        returns boolean. TRUE - already locked, FALSE - unlocked 
        """&lt;/span&gt;
        &lt;b style="color:#00007F"&gt;if not&lt;/b&gt; os.path.isfile&lt;b&gt;(&lt;/b&gt;self.fileName&lt;b&gt;)&lt;/b&gt;:
            &lt;b style="color:#00007F"&gt;return&lt;/b&gt; False
        pid = open&lt;b&gt;(&lt;/b&gt;self.fileName, &lt;span style="color:#FF8000"&gt;"r"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;.read&lt;b&gt;()&lt;/b&gt;
        res = os.popen&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#FF8000"&gt;"ps "&lt;/span&gt;+pid, &lt;span style="color:#FF8000"&gt;"r"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;.readlines&lt;b&gt;()&lt;/b&gt;
        &lt;b style="color:#00007F"&gt;if &lt;/b&gt;len&lt;b&gt;(&lt;/b&gt;res&lt;b&gt;)&lt;/b&gt; == &lt;span style="color:#007F7F"&gt;1&lt;/span&gt;:
           self.unlock&lt;b&gt;()&lt;/b&gt;
           &lt;b style="color:#00007F"&gt;return&lt;/b&gt; False
        &lt;b style="color:#00007F"&gt;return&lt;/b&gt; True
	
    
    &lt;b style="color:#00007F"&gt;def&lt;/b&gt; &lt;b style="color:#007F7F"&gt;lock&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;self&lt;b&gt;)&lt;/b&gt;:
        &lt;span style="color:#FF8000"&gt;"""
        Create .lock file for this process &lt;b&gt;(&lt;/b&gt;start lock-session&lt;b&gt;)&lt;/b&gt; 
        """&lt;/span&gt;
        fp = open&lt;b&gt;(&lt;/b&gt;self.fileName, &lt;span style="color:#FF8000"&gt;"w"&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;
        fp.write&lt;b&gt;(&lt;/b&gt;str&lt;b&gt;(&lt;/b&gt;os.getpid&lt;b&gt;()&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
        fp.close&lt;b&gt;()&lt;/b&gt;

    
    &lt;b style="color:#00007F"&gt;def&lt;/b&gt; &lt;b style="color:#007F7F"&gt;unlock&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;self&lt;b&gt;)&lt;/b&gt;:
        &lt;span style="color:#FF8000"&gt;"""
        Delete .lock file for this process.
        """&lt;/span&gt;
        &lt;b style="color:#00007F"&gt;try&lt;/b&gt;:
            os.unlink&lt;b&gt;(&lt;/b&gt;self.fileName&lt;b&gt;)&lt;/b&gt;
        &lt;b style="color:#00007F"&gt;except&lt;/b&gt;:
            pass
&lt;/pre&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:7484</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/7484.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=7484"/>
    <title>PHP-CLI и Crontab. Блокировка повторного запуска.</title>
    <published>2006-03-21T08:21:28Z</published>
    <updated>2006-03-23T15:05:50Z</updated>
    <category term="php"/>
    <content type="html">Не часто приходится сталкиваться с cron-скриптами, время выполнения которых может занять &lt;b&gt;больше чем полчаса&lt;/b&gt;. Но такие скрипты в природе реально существуют и, в принципе, имеют право быть.&lt;br /&gt;&lt;br /&gt;Довелось мне писать несколько &lt;b&gt;spider'ов&lt;/b&gt; на PHP. Каждый выполняет свою задачу во время путешествия по "паутине".&lt;br /&gt;Время выполнения некоторых из них может занять как две минуты, так и целый час, в зависимости от того, насколько "далеко" полезет паучок.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Итак, задача:&lt;/b&gt; Spider'ы запускаются по крону. Например, каждые 5 минут. Если один из них не успел выполнить свою задачу за этот промежуток времени, то при повторном запуске должна срабатывать блокировка, предотвращающая двойной запуск одного и того же паука.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Решение:&lt;/b&gt;&lt;br /&gt;Решил задачу применением файлов с расширением .lock. Внутри этого файла находится &lt;b&gt;pid&lt;/b&gt; процесса, который создал этот .lock-файл. Все .lock-файлы лежат в отдельной директории &lt;b&gt;locks&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;1. Спайдер запускается и первым делом смотрит: "Есть ли в директории &lt;i&gt;locks&lt;/i&gt; файл, блокирующий меня?".&lt;br /&gt;2. &lt;b&gt;Если файла нет&lt;/b&gt;, то спайдер создаёт его и продолжает работу.&lt;br /&gt;3. &lt;b&gt;Если файл есть&lt;/b&gt;, то спайдер читает из него pid и проверяет "Выполняется ли в данный момент процесс с этим pid?".&lt;br /&gt;4. Если такой pid существует, то спайдер отваливается.&lt;br /&gt;5. Если процесс с таким pid уже не существует (например, был убит командой kill), то спайдер пересоздаёт файл и работает дальше.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;"Красивое" решение будет работать на PHP5 и заключается в использовании конструктора и деструктора.&lt;br /&gt;Мы просто создаём экземпляр класса Lock и "забываем" о нём. Конструктор класса сам позаботится о проверке на наличие блокировки и её создании при необходимости, а деструктор занимается снятием блокировки по завершении работы скрипта.&lt;br /&gt;&lt;br /&gt;Всё достаточно просто и удобно. Если на момент запуска конструктора, блокировка существует, то конструктор завершает скрипт с кодом возврата 3. Почему 3? Ну просто мне так захотелось :)&lt;br /&gt;&lt;br /&gt;На практике создание автоматического блокиратора происходит так:&lt;br /&gt;&lt;br /&gt;$lock = new Lock($pathToLocks);&lt;br /&gt;где, $pathToLock - абсолютный или относительный путь к директории с .lock-файлами.&lt;br /&gt;&lt;br /&gt;Теперь код (Большая просьба не бить по почкам за плохой английский! Обещаю его освоить!):&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:14px"&gt;
&lt;span style="color: #000000"&gt;
&lt;span style="color: #0000BB"&gt;&amp;lt;?php

&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**
&amp;nbsp;*&amp;nbsp;Class&amp;nbsp;for&amp;nbsp;the&amp;nbsp;automatic&amp;nbsp;locking&amp;nbsp;the&amp;nbsp;dual&amp;nbsp;processes.
&amp;nbsp;*/

&lt;/span&gt;&lt;span style="color: #007700"&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Lock&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;{

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;{{{&amp;nbsp;properties

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Flag&amp;nbsp;"is&amp;nbsp;locked"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;&amp;nbsp;&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@access&amp;nbsp;&amp;nbsp;private
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;private&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFlag&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;false&lt;/span&gt;&lt;span style="color: #007700"&gt;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Path&amp;nbsp;to&amp;nbsp;directory&amp;nbsp;with&amp;nbsp;.lock&amp;nbsp;files.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;&amp;nbsp;&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@accrss&amp;nbsp;&amp;nbsp;private
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;private&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$pathToLocks&lt;/span&gt;&lt;span style="color: #007700"&gt;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;}}}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;{{{&amp;nbsp;__construct

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;If&amp;nbsp;file&amp;nbsp;already&amp;nbsp;locked&amp;nbsp;-&amp;nbsp;exit.&amp;nbsp;Else&amp;nbsp;set&amp;nbsp;lock.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;$pathToLocks
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@access&amp;nbsp;&amp;nbsp;public
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__construct&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$pathToLocks&lt;/span&gt;&lt;span style="color: #007700"&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;pathToLocks&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$pathToLocks&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;isLocked&lt;/span&gt;&lt;span style="color: #007700"&gt;())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;3&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;setLock&lt;/span&gt;&lt;span style="color: #007700"&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;}}}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;{{{&amp;nbsp;__destruct

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Unset&amp;nbsp;lock.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;__destruct&lt;/span&gt;&lt;span style="color: #007700"&gt;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;lockFlag&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;unsetLock&lt;/span&gt;&lt;span style="color: #007700"&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;}}}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;{{{&amp;nbsp;isLocked

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Returns&amp;nbsp;boolean.&amp;nbsp;TRUE&amp;nbsp;-&amp;nbsp;already&amp;nbsp;locked,&amp;nbsp;FALSE&amp;nbsp;-&amp;nbsp;unlocked
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@access&amp;nbsp;&amp;nbsp;public
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;isLocked&lt;/span&gt;&lt;span style="color: #007700"&gt;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFile&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getLockFileName&lt;/span&gt;&lt;span style="color: #007700"&gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;file_exists&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFile&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ob_start&lt;/span&gt;&lt;span style="color: #007700"&gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;system&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'ps&amp;nbsp;'&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;trim&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;file_get_contents&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFile&lt;/span&gt;&lt;span style="color: #007700"&gt;)));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$res&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ob_get_contents&lt;/span&gt;&lt;span style="color: #007700"&gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ob_end_clean&lt;/span&gt;&lt;span style="color: #007700"&gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$res&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;trim&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$res&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$res&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;explode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$res&lt;/span&gt;&lt;span style="color: #007700"&gt;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;count&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$res&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@&lt;/span&gt;&lt;span style="color: #0000BB"&gt;unlink&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFile&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;false&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;true&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;false&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;}}}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;{{{&amp;nbsp;getLockFileName

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Returns&amp;nbsp;filename&amp;nbsp;for&amp;nbsp;lock-file.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@access&amp;nbsp;&amp;nbsp;public
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getLockFileName&lt;/span&gt;&lt;span style="color: #007700"&gt;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;preg_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'!^(.+)\.[a-z0-9]+$!i'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'\\1.lock'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;basename&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$_SERVER&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'PHP_SELF'&lt;/span&gt;&lt;span style="color: #007700"&gt;]));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;pathToLocks&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'/'&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$file&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;}}}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;{{{&amp;nbsp;setLock

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Create&amp;nbsp;.lock&amp;nbsp;file&amp;nbsp;for&amp;nbsp;this&amp;nbsp;process&amp;nbsp;(start&amp;nbsp;lock-session)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@access&amp;nbsp;&amp;nbsp;public
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;setLock&lt;/span&gt;&lt;span style="color: #007700"&gt;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFile&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getLockFileName&lt;/span&gt;&lt;span style="color: #007700"&gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;@&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fopen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFile&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'w'&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;false&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$res&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;@&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fwrite&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getmypid&lt;/span&gt;&lt;span style="color: #007700"&gt;());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$res&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@&lt;/span&gt;&lt;span style="color: #0000BB"&gt;unlink&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFile&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;false&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@&lt;/span&gt;&lt;span style="color: #0000BB"&gt;chmod&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lockFile&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0666&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;lockFlag&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;true&lt;/span&gt;&lt;span style="color: #007700"&gt;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;true&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;}}}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;{{{&amp;nbsp;unsetLock

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Delete&amp;nbsp;.lock&amp;nbsp;file&amp;nbsp;for&amp;nbsp;this&amp;nbsp;process.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@access&amp;nbsp;&amp;nbsp;public
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;unsetLock&lt;/span&gt;&lt;span style="color: #007700"&gt;()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;@&lt;/span&gt;&lt;span style="color: #0000BB"&gt;unlink&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$this&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getLockFileName&lt;/span&gt;&lt;span style="color: #007700"&gt;());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;}}}
&lt;/span&gt;&lt;span style="color: #007700"&gt;}

&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;Если есть вопросы - спрашивайте. Всегда готов ответить.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:7386</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/7386.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=7386"/>
    <title>Фрактал "Папоротник"</title>
    <published>2006-03-18T07:10:01Z</published>
    <updated>2006-03-24T12:52:44Z</updated>
    <category term="python"/>
    <content type="html">Скачал себе &lt;a href="http://www.pythonware.com/products/pil/"&gt;PIL&lt;/a&gt; (Python Imaging Library), поставил и, на радостях, решил создать какой-нибудь "шедевр" =)&lt;br /&gt;После часа кропотливой работы мозга, получилось вот это:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://flexx.kiev.ua/img/fern.png" width="400" height="680"&gt;&lt;br /&gt;&lt;br /&gt;Долго бьюсь головою об стену и не могу понять причину таких "худых" листьев папоротника.&lt;br /&gt;По-идее они должны быть на порядок шире и ветвистее...&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre style="margin:10px;padding:10px;border:1px solid #ccc;background:#FAFAFE;font-family:courier;font-size:16px"&gt;
&lt;b style="color:#00007F"&gt;import&lt;/b&gt; Image
&lt;b style="color:#00007F"&gt;from&lt;/b&gt; random &lt;b style="color:#00007F"&gt;import&lt;/b&gt; random
&lt;b style="color:#00007F"&gt;from&lt;/b&gt; random &lt;b style="color:#00007F"&gt;import&lt;/b&gt; randint
&lt;b style="color:#00007F"&gt;from&lt;/b&gt; math   &lt;b style="color:#00007F"&gt;import&lt;/b&gt; ceil

maxit    = &lt;span style="color:#007F7F"&gt;70&lt;/span&gt;
max_rand = &lt;span style="color:#007F7F"&gt;10&lt;/span&gt;
magnify  = &lt;span style="color:#007F7F"&gt;65&lt;/span&gt;
x_shift  = &lt;span style="color:#007F7F"&gt;170&lt;/span&gt;
y_shift  = &lt;span style="color:#007F7F"&gt;10&lt;/span&gt;

img = Image.new&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#FF8000"&gt;'RGB'&lt;/span&gt;, &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;400&lt;/span&gt;, &lt;span style="color:#007F7F"&gt;680&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;, &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;, &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;, &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;

&lt;b style="color:#00007F"&gt;for&lt;/b&gt; iterat &lt;b style="color:#00007F"&gt;in&lt;/b&gt; xrange&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;30000&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;:
    x = &lt;b&gt;(&lt;/b&gt;random&lt;b&gt;()&lt;/b&gt; * max_rand&lt;b&gt;) /&lt;/b&gt; &lt;span style="color:#007F7F"&gt;50000&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;
    y = &lt;b&gt;(&lt;/b&gt;random&lt;b&gt;()&lt;/b&gt; * max_rand&lt;b&gt;) /&lt;/b&gt; &lt;span style="color:#007F7F"&gt;50000&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;
    &lt;b style="color:#00007F"&gt;for&lt;/b&gt; i &lt;b style="color:#00007F"&gt;in&lt;/b&gt; xrange&lt;b&gt;(&lt;/b&gt;maxit&lt;b&gt;)&lt;/b&gt;:
        rand_num = ceil&lt;b&gt;(&lt;/b&gt;random&lt;b&gt;()&lt;/b&gt; * max_rand * &lt;span style="color:#007F7F"&gt;100&lt;/span&gt;&lt;b&gt;) /&lt;/b&gt; &lt;span style="color:#007F7F"&gt;100&lt;/span&gt;
        &lt;b style="color:#00007F"&gt;if&lt;/b&gt; rand_num &amp;lt; &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;01&lt;/span&gt; * max_rand:
            x = &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;
            y = &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;16&lt;/span&gt; * y
        &lt;b style="color:#00007F"&gt;elif&lt;/b&gt; rand_num &amp;lt; &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;86&lt;/span&gt; * max_rand:
            x = &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;85&lt;/span&gt; * x&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;04&lt;/span&gt; * y&lt;b&gt;)&lt;/b&gt;
            y = &lt;b&gt;(&lt;/b&gt;-&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;04&lt;/span&gt; * x&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;85&lt;/span&gt; * y&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; &lt;span style="color:#007F7F"&gt;1&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;6&lt;/span&gt;
        &lt;b style="color:#00007F"&gt;elif&lt;/b&gt; rand_num &amp;lt; &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;93&lt;/span&gt; * max_rand:
            x = &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;2&lt;/span&gt; * x&lt;b&gt;)&lt;/b&gt; - &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;26&lt;/span&gt; * y&lt;b&gt;)&lt;/b&gt;
            y = &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;23&lt;/span&gt; * x&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;22&lt;/span&gt; * y&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; &lt;span style="color:#007F7F"&gt;1&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;6&lt;/span&gt;
        &lt;b style="color:#00007F"&gt;else&lt;/b&gt;:
            x = &lt;b&gt;(&lt;/b&gt;-&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;15&lt;/span&gt; * x&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;28&lt;/span&gt; * y&lt;b&gt;)&lt;/b&gt;
            y = &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;26&lt;/span&gt; * x&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;24&lt;/span&gt; * y&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;44&lt;/span&gt;

    &lt;b style="color:#00007F"&gt;if&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;x &amp;gt;= -&lt;span style="color:#007F7F"&gt;5&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;&lt;b&gt;)&lt;/b&gt; &lt;b style="color:#00007F"&gt;and&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;x &amp;lt;= &lt;span style="color:#007F7F"&gt;5&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;&lt;b&gt;)&lt;/b&gt; &lt;b style="color:#00007F"&gt;and&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;y &amp;gt;= &lt;span style="color:#007F7F"&gt;0&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;&lt;b&gt;)&lt;/b&gt; &lt;b style="color:#00007F"&gt;and&lt;/b&gt; &lt;b&gt;(&lt;/b&gt;y &amp;lt;= &lt;span style="color:#007F7F"&gt;10&lt;/span&gt;.&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;:
        x = int&lt;b&gt;(&lt;/b&gt;x * magnify&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; x_shift
        y = int&lt;b&gt;(&lt;/b&gt;y * magnify&lt;b&gt;)&lt;/b&gt; &lt;b&gt;+&lt;/b&gt; y_shift
        r = randint&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;, &lt;span style="color:#007F7F"&gt;128&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;
        g = randint&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;128&lt;/span&gt;, &lt;span style="color:#007F7F"&gt;255&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;
        b = randint&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#007F7F"&gt;0&lt;/span&gt;, &lt;span style="color:#007F7F"&gt;128&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;
        &lt;b style="color:#00007F"&gt;try&lt;/b&gt;:
            img.putpixel&lt;b&gt;(&lt;/b&gt;&lt;b&gt;(&lt;/b&gt;x, y&lt;b&gt;)&lt;/b&gt;, &lt;b&gt;(&lt;/b&gt;r, g, b&lt;b&gt;))&lt;/b&gt;
        &lt;b style="color:#00007F"&gt;except&lt;/b&gt; IndexError:
            &lt;b style="color:#00007F"&gt;pass&lt;/b&gt;

img.save&lt;b&gt;(&lt;/b&gt;&lt;span style="color:#FF8000"&gt;'fern.png'&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/pre&gt;&lt;br /&gt;Время генерации папоротника на PIII-500: &lt;b&gt;53&lt;/b&gt; секунды&lt;br /&gt;В данном примере выполняется &lt;b&gt;70&lt;/b&gt; * &lt;b&gt;30 000&lt;/b&gt; = &lt;b&gt;2 100 000&lt;/b&gt; итераций&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:7056</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/7056.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=7056"/>
    <title>PHP vs Python</title>
    <published>2006-03-06T11:48:32Z</published>
    <updated>2006-03-06T11:57:04Z</updated>
    <category term="google"/>
    <category term="php"/>
    <category term="python"/>
    <content type="html">Общался по аське с &lt;span class='ljuser' lj:user='ttyv0' style='white-space: nowrap;'&gt;&lt;a href='http://ttyv0.livejournal.com/profile'&gt;&lt;img src='http://p-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://ttyv0.livejournal.com/'&gt;&lt;b&gt;ttyv0&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; и слова, которые он сказал, я хочу зацитировать, чтобы не забыть =)&lt;br /&gt;&lt;div style="border:1px solid #9AA;background:#F5F5FF;padding:5px;margin:2px"&gt;Сейчас законодатель "моды" - Google. А гуглевые интерфейсы - на &lt;a href="http://www.python.org/" title="The Python language site"&gt;питоне&lt;/a&gt;.&lt;br /&gt;Так что, за кем будущее - это очевидно. Может &lt;a href="http://www.ruby-lang.org/" title="The Ruby language site"&gt;Ruby&lt;/a&gt; еще.&lt;br /&gt;&lt;br /&gt;Google в сторону &lt;a href="http://www.php.net" title="The PHP language site"&gt;PHP&lt;/a&gt; даже не смотрел. Как только GMail появился, интерес к питону стремительно возрос.&lt;br /&gt;&lt;br /&gt;Вообще, я думаю, они тоже там немало перебирали всякого, в поисках нужного языка. Гугловцы, как показывает практика, знают, что делают. А ведь могли бинари на си заюзать. Но не стали почему-то.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Золотые слова!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:6836</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/6836.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=6836"/>
    <title>Task Timer on Ajax</title>
    <published>2006-02-24T11:51:18Z</published>
    <updated>2006-03-29T13:37:16Z</updated>
    <category term="win32"/>
    <category term="javascript"/>
    <category term="php"/>
    <category term="ajax"/>
    <content type="html">Сколько ни программирую, а до сих пор не научился &lt;b&gt;правильно оценивать время&lt;/b&gt; на поставленную задачу.&lt;br /&gt;Либо справляюсь с нею гораздо быстрее, чем сам же предсказал, либо опаздываю. Конечно же, бывают случаи, когда время все-таки совпадает :-)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Чтобы научиться точно оценивать время&lt;/b&gt;, я решил накопить список разнообразных задач c потраченным временем на каждую. Таким образом, я буду чётко знать, сколько времени трачу на ту или иную задачу. Пройдёт некоторое время, и оценивать станет гораздо проще (вот наивный!) =)&lt;br /&gt;&lt;br /&gt;Итак, полез я в гугл искать таймеры... Много разных пересмотрел - ничего не пришлось по вкусу. Зато, в голове вырисовалась чёткая картина таск-таймера, который я хочу:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Он должен лежать прямо на рабочем столе! System Tray - это слишком сложно.&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Это не таймер для одной задачи - это таймер для списка из n-задач.&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Одновременно можно запускать несколько таймеров.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Короче, пришлось писать самому :-)&lt;br /&gt;Засучив рукава, радостно принялся ваять. Повесил на рабочий стол страницу (WinXP/Active Desktop) и начал делать форму... Но, очень быстро выяснил, что при сабмите формы открывается окно IE с результатом. Нажатие на ссылку срабатывает точно также. Иными словами, Active Desktop позволяет размещать на рабочем столе &lt;b&gt;только статические страницы&lt;/b&gt;, точнее страницы, где не меняется location.&lt;br /&gt;&lt;br /&gt;Выход из ситуации нашёлся очень быстро. Ключевое слово - &lt;b&gt;jsHTTPRequest&lt;/b&gt; или, в простонародье, &lt;b&gt;Ajax&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;За несколько вечеров с кружкой чая напрограммил Task Timer и остался вполне доволен результатом. Получился эдакий &lt;b&gt;ToDo-list&lt;/b&gt; с таймером на каждую задачу. Безмерно кайфую :-)&lt;br /&gt;&lt;br /&gt;Скачать это "удовольствие" можно здесь: &lt;a href="http://flexx.kiev.ua/data/task_timer.zip"&gt;task_timer.zip&lt;/a&gt; (16кб)&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://flexx.kiev.ua/data/tt_scrshoot.gif" target="_blank"&gt;&lt;span style="font-size:1.2em;font-weight:bold;"&gt;скриншот #1&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://flexx.kiev.ua/data/tt_screen1.gif" target="_blank"&gt;&lt;span style="font-size:1.2em;font-weight:bold;"&gt;скриншот #2&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://flexx.kiev.ua/data/tt_screen2.gif" target="_blank"&gt;&lt;span style="font-size:1.2em;font-weight:bold;"&gt;скриншот #3&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Установка&lt;/h3&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Распакуйте содержимое архива :)&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Файлы из папки task_timer залейте на (локальный?) сервачок.&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; MySQL (желательно 4.1.*): Создайте базу данных и залейте в неё дамп из файла task_timer.sql&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Откройте config.inc.php и пропишите настройки базы.&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; На рабочий стол добавьте страницу для Task Timer, указав его URL. (Правый клик на рабочем столе -&amp;gt; Свойства -&amp;gt; закладка "Desktop" -&amp;gt; кнопка "Customize Desktop..." -&amp;gt; закладка "Web" -&amp;gt; добавляете страницу)&lt;br /&gt;&lt;b&gt;6.&lt;/b&gt; Должно заработать.&lt;br /&gt;&lt;b&gt;7.&lt;/b&gt; Если п.5 не сработал - большая просьба отписать в комменты!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Использование&lt;/h3&gt;&lt;br /&gt;Интерфейс интуитивно-понятный. Единственное, что требует внимания - это &lt;b&gt;переименование таска&lt;/b&gt;.&lt;br /&gt;Чтобы переименовать таск, просто кликните два раза на его названии :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPD:&lt;/b&gt; Добавил еще два скриншота.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:6613</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/6613.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=6613"/>
    <title>Internet Explorer 7.0</title>
    <published>2006-02-07T14:15:34Z</published>
    <updated>2006-02-07T14:16:27Z</updated>
    <category term="ie"/>
    <content type="html">Как вы уже, наверное, знаете, совсем скоро грядёт выход стабильной версии браузера &lt;strong&gt;Internet Explorer 7.0&lt;/strong&gt;.&lt;br /&gt;Событие, которого многие веб-разработчики ждут, затаив дыхание ;-)&lt;br /&gt;&lt;br /&gt;В интернете даже появился сайт, посвящённый новой версии IE. Итак, встречайте:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:large"&gt;&lt;a href="http://www.ie7.com"&gt;www.IE7.com&lt;/span&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:6094</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/6094.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=6094"/>
    <title>mkdir @ 2005-12-23T16:27:00</title>
    <published>2005-12-23T14:26:30Z</published>
    <updated>2005-12-23T14:27:31Z</updated>
    <category term="php"/>
    <content type="html">Придумал новый способ обхода сложных массивов :-) Ржунимагу =)))&lt;br /&gt;Вопщем, идея такая. У нас есть массив &lt;span style="font-weight: bold;"&gt;$array&lt;/span&gt; (любой сложности) . Делаем следующее:&lt;pre&gt;ob_start();
print_r($array);
$buffer = ob_get_contents();
ob_clean();
&lt;/pre&gt;А затем пишем парсилку на регулярных выражениях, которая будет анализировать переменную &lt;span style="font-weight: bold;"&gt;$buffer&lt;/span&gt; и принимать решения =))))</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:mkdir:5774</id>
    <link rel="alternate" type="text/html" href="http://mkdir.livejournal.com/5774.html"/>
    <link rel="self" type="text/xml" href="http://mkdir.livejournal.com/data/atom/?itemid=5774"/>
    <title>View source code</title>
    <published>2005-12-16T16:43:40Z</published>
    <updated>2005-12-16T16:44:37Z</updated>
    <category term="javascript"/>
    <content type="html">Так уж сложилось, сейчас мне приходится писать сложные динамические интерфейсы на JavaScript с непосредственным использованием DOM.&lt;br /&gt;Первая проблема с которой я столкнулся, это желание посмотреть сгенерированный код =)&lt;br /&gt;Ведь его не просмотришь просто заглянув в сорцы страницы.&lt;br /&gt;&lt;br /&gt;И вот как я решил выкрутиться:&lt;pre&gt;
function debug(id) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; el = document.getElementById(id);
&amp;nbsp;&amp;nbsp;&amp;nbsp; source = el.innerHTML;
&amp;nbsp;&amp;nbsp;&amp;nbsp; source = source.replace(/&amp;lt;/g, '&amp;amp;lt;');
&amp;nbsp;&amp;nbsp;&amp;nbsp; source = source.replace(/&amp;gt;/g, '&amp;amp;gt;');
&amp;nbsp;&amp;nbsp;&amp;nbsp; source = source.replace(/\n/g, '&amp;lt;br&amp;gt;');
&amp;nbsp;&amp;nbsp;&amp;nbsp; source = source.replace(/ /g, '&amp;amp;nbsp;');
&amp;nbsp;&amp;nbsp;&amp;nbsp; win = window.open('', 'debug'+id, 'width=500,height=450,resizable=yes,scrollbars=yes,titlebar=yes');
&amp;nbsp;&amp;nbsp;&amp;nbsp; win.document.write(source);
}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Например, у меня есть родительский div в который добавляется невероятное количество чилдов.&lt;br /&gt;&amp;lt;div id="rows"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;В нужный момент я вызываю свою функцию: debug('rows');&lt;br /&gt;И в новом окне я преспокойно рассматриваю получившийся код =)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Вопрос:&lt;/span&gt; существуют ли более гуманные способы сделать это?</content>
  </entry>
</feed>
