<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>одиссей-стайл # программирование # чудеса


var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));

try {
var pageTracker = _gat._getTracker("UA-12201376-2");
pageTracker._trackPageview();
} catch(err) {}</description><title>Кодоблог</title><generator>Tumblr (3.0; @rudi-src)</generator><link>http://rudi-src.05bit.com/</link><item><title>Передернуть экран</title><description>&lt;p&gt;Обнаружили случайно стремный забавный глюк в Firefox 4. Если добавлять флешку динамически на страницу - при помощи js - используя тот же SWFObject, то она не сразу начинает отрисовываться. Причем иногда, а не всегда - очень мило с его стороны :)&lt;/p&gt;

&lt;p&gt;Это не ошибка верстки. Это, видимо, оптимизация рендера в броузере.&lt;/p&gt;

&lt;p&gt;Нашли workaround.&lt;/p&gt;

&lt;p&gt;После добавления флешки:&lt;/p&gt;

&lt;pre class="brush: js"&gt;
/* seems a bug in FF4 with dynamycally added flash! */
if (navigator.userAgent.indexOf('Firefox/4') &gt;= 0) {
    shakeScreen();
}
&lt;/pre&gt;

&lt;p&gt;И функция.&lt;/p&gt;

&lt;pre class="brush: js"&gt;
function shakeScreen() {
    setTimeout('window.scrollBy(0, 1.0)', 50);
    setTimeout('window.scrollBy(0, -1.0)', 100);    
}
&lt;/pre&gt;

&lt;p&gt;Это я назвал “передернуть экран”.&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/6029947573</link><guid>http://rudi-src.05bit.com/post/6029947573</guid><pubDate>Tue, 31 May 2011 10:13:00 +0400</pubDate><category>firefox</category><category>flash</category><category>javascritp</category><category>workaround</category></item><item><title>Django: Private File Upload and Serving</title><description>&lt;a href="http://nemesisdesign.net/blog/coding/django-private-file-upload-and-serving/"&gt;Django: Private File Upload and Serving&lt;/a&gt;</description><link>http://rudi-src.05bit.com/post/2055137138</link><guid>http://rudi-src.05bit.com/post/2055137138</guid><pubDate>Wed, 01 Dec 2010 05:40:37 +0300</pubDate><category>python</category><category>python-django</category></item><item><title>Python Spawning</title><description>&lt;a href="http://pypi.python.org/pypi/Spawning"&gt;Python Spawning&lt;/a&gt;: &lt;p&gt;Ещё один способ запуска веб-приложений на Python. Очень элегантно и, &lt;a href="http://www.eflorenzano.com/blog/post/spawning-django/" target="_blank"&gt;как утверждается&lt;/a&gt;, не уступает по скорости связке Apache + mod_wsgi.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Spawning is a fast, easy to use, and flexible HTTP server for hosting python web applications which conform to the WSGI interface.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://rudi-src.05bit.com/post/814667220</link><guid>http://rudi-src.05bit.com/post/814667220</guid><pubDate>Thu, 15 Jul 2010 14:00:00 +0400</pubDate><category>python</category><category>deployment</category></item><item><title>NIH-синдром</title><description>&lt;p&gt;Каждый раз, приступая к нетривиальной задаче, я ощущаю приступ &lt;a href="http://en.wikipedia.org/wiki/Not_Invented_Here" target="_blank"&gt;NIH-синдрома&lt;/a&gt;. Во-первых, иногда хочется попробовать сделать какой-то механизм самому. Во-вторых, очень часто меня не устраивает scope готовых решений - то есть, они берут на себя слишком много, или слишком мало.&lt;/p&gt;

&lt;p&gt;То, что это называется них-синдром, я узнал сегодня, случайно. Вот что пишет про это &lt;a href="http://www.joelonsoftware.com/articles/fog0000000007.html" target="_blank"&gt;Джоел Спольски в 2001&lt;/a&gt;, а вот Джеймс Беннет, разработчик Django, &lt;a href="http://www.b-list.org/weblog/2006/oct/21/django-and-nih/" target="_blank"&gt;тоже пишет про то, что когда-то их ругали за NIH, почем зря&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;В общем-то, я стараюсь использовать чужие библиотеки, если они “живые”, даже пусть они и немного не доработаны.&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/710233824</link><guid>http://rudi-src.05bit.com/post/710233824</guid><pubDate>Fri, 18 Jun 2010 08:02:46 +0400</pubDate><category>programming</category><category>thoughts</category></item><item><title>Zachary Voase, крутой парень, python, ruby, web development</title><description>&lt;a href="http://zacharyvoase.com"&gt;Zachary Voase, крутой парень, python, ruby, web development&lt;/a&gt;: &lt;p&gt;Прекрасно структурированный блог у него :) И вообще :) Ещё, он убрал комментарии из блога вообще - говорит, базар не любит разводить - пишите в почту :) За наводку - спасибо &lt;a href="http://vorushin.ru" target="_blank"&gt;Ворушину&lt;/a&gt;.&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/656329444</link><guid>http://rudi-src.05bit.com/post/656329444</guid><pubDate>Wed, 02 Jun 2010 15:03:11 +0400</pubDate><category>people</category><category>blogs</category></item><item><title>RSS/Blogs и Wiki</title><description>&lt;p&gt;Похоже на то, что RSS и блоги обесценивают ценную информацию. То есть, она “проходит” в них на том же уровне, что и не очень ценная информация. Часто приходится нажимать “mark all as read”.&lt;/p&gt;

&lt;p&gt;Блог больше подходит для “анонсов” - чтобы поставить “якорь” - что такая информация есть и что найти её можно там-то. Либо, для коротких отчетов об экспериментах.&lt;/p&gt;

&lt;p&gt;Но &lt;em&gt;кристаллизировать&lt;/em&gt; информацию в блоге не получается - если информация в посте устарела или найдены ошибки, у автора почти нет мотивации исправлять старый пост :) Он лучше напишет новый для привлечения новых читателей.&lt;/p&gt;

&lt;p&gt;По этой причине перехожу на новый формат:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;в блог: ссылки, анонсы, наброски, небольшие посты - сюда либо в английский&lt;/li&gt;
&lt;li&gt;в вики: руководства, примеры и другие большие материалы - на &lt;a href="http://rudi.05bit.com" target="_blank"&gt;rudi.05bit.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;И мозг мой будет спокоен :)&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/656284624</link><guid>http://rudi-src.05bit.com/post/656284624</guid><pubDate>Wed, 02 Jun 2010 14:40:10 +0400</pubDate><category>announcement</category><category>wiki</category><category>knowledge management</category></item><item><title>Я поражен</title><description>&lt;p&gt;&lt;a href="http://elance.com" target="_blank"&gt;Elance.com&lt;/a&gt; для подтверждения номера сотового телефона звонит на сотовый и просит сказать код подтверждения голосом. Он его распознает и говорит ‘Thank you! Good Bye!’&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/650561992</link><guid>http://rudi-src.05bit.com/post/650561992</guid><pubDate>Mon, 31 May 2010 21:50:52 +0400</pubDate><category>freelance</category><category>services</category></item><item><title>iКуча, анонс итерации номер 2</title><description>&lt;a href="http://rudyryk.livejournal.com/174595.html"&gt;iКуча, анонс итерации номер 2&lt;/a&gt;</description><link>http://rudi-src.05bit.com/post/629229413</link><guid>http://rudi-src.05bit.com/post/629229413</guid><pubDate>Tue, 25 May 2010 02:11:21 +0400</pubDate><category>django</category><category>python</category><category>project</category><category>announce</category><category>ikucha</category></item><item><title>Преобразование строк из/в Unicode</title><description>&lt;p&gt;В дополнение к &lt;a href="/post/622163967/funny-characters" target="_blank"&gt;посту о funny characters&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Преобразование utf-8 в cp866 (в ASCII кодировку)&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
    &gt;&gt;&gt; u'ы'.encode('cp866')
    '\xeb'
&lt;/pre&gt;

&lt;p&gt;Преобразование cp866 в utf-8&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
    &gt;&gt;&gt; 'ы'.decode('cp866')
    u'\u044b'
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;decode&lt;/strong&gt; - декодирует последовательность байтов в юникод, &lt;strong&gt;encode&lt;/strong&gt; - кодирует юникод в последовательность байтов. Последовательность байтов всегда должна интерпретироваться с учетом кодировки - в примере получаются последовательности байтов в кодировке cp866. :)&lt;/p&gt;

&lt;p&gt;PS.
А в Python 3 концепция работы с юникодом круче, как &lt;a href="http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit" target="_blank"&gt;обещает документация&lt;/a&gt; :)&lt;/p&gt;

&lt;p&gt;Cтрока (str) - всегда UTF-8, то есть действительно строка, в универсальной кодировке. А все остальное - последовательности байт bytes, про которые нужно знать, в какой они кодировке, если нужно их перевести в строку.&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/622223789</link><guid>http://rudi-src.05bit.com/post/622223789</guid><pubDate>Sat, 22 May 2010 19:12:00 +0400</pubDate><category>python</category><category>unicode</category><category>python3k</category></item><item><title>Опасаться funny characters</title><description>&lt;h3&gt;Предыстория&lt;/h3&gt;

&lt;p&gt;Во время написания &lt;a href="http://ikucha.ru" target="_blank"&gt;iКучи&lt;/a&gt; я столкнулся с несовершенством мира. У меня появилась такая задача: по ссылке узнать title страницы. Теоретически, задача не сложная, но проявились нюансы, связанные с кодировками.&lt;/p&gt;

&lt;p&gt;Чтобы сразу проверять работу парсера, я тестировал все в консоли. И иногда print вылетал с UnicodeEncodeError. Это явление известно как &lt;a href="http://www.google.ru/search?hl=ru&amp;newwindow=1&amp;safe=off&amp;q=python+funny+characters&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=&amp;gs_rfai=" target="_blank"&gt;funny characters&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Пример&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;символ ‘ы’ имеет код U+044B&lt;/li&gt;
&lt;li&gt;символ ‘©’ имеет код U+00A9&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="brush: python"&gt;
    &gt;&gt;&gt; a = u'ы'
    &gt;&gt;&gt; a
    u'\u044b'
    &gt;&gt;&gt; b = u'\u00a9'
    &gt;&gt;&gt; b
    u'\xa9'
&lt;/pre&gt;

&lt;p&gt;Пробуем напечатать:&lt;/p&gt;

&lt;pre class="brush: python"&gt;
    &gt;&gt;&gt; print a
    ы
    &gt;&gt;&gt; print b
    ...
    UnicodeEncodeError: 'charmap' codec can't encode character u'\xa9' in position 0: character maps to &lt;undefined&gt;
    &gt;&gt;&gt;
&lt;/pre&gt;

&lt;p&gt;Пробуем сложить сроки и записать в файл:&lt;/p&gt;

&lt;pre class="brush: python"&gt;
    &gt;&gt;&gt; f = open('test.txt', 'w')
    &gt;&gt;&gt; f.write((a + b).encode('utf-8'))
    &gt;&gt;&gt; f.close()
&lt;/pre&gt;

&lt;p&gt;Работает!&lt;/p&gt;

&lt;h3&gt;Выводы&lt;/h3&gt;

&lt;p&gt;Даже не знаю. Похоже, что этот явление проявляется только в консоли, при печати. В общем, это что-то неведомое, чего стоит опасаться, на всякий случай.&lt;/p&gt;

&lt;p&gt;Вот здесь предлагается “вычищать” эти символы из текста: &lt;a href="http://code.activestate.com/recipes/546517-accent2htmlcodepy-convert-accents-and-special-char" target="_blank"&gt;http://code.activestate.com/recipes/546517-accent2htmlcodepy-convert-accents-and-special-char&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Но, похоже, что вычищать не совсем правильно, так как они проходят через encode без ошибок.&lt;/p&gt;

&lt;h3&gt;Почитать для знания&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.joelonsoftware.com/articles/Unicode.html" target="_blank"&gt;http://www.joelonsoftware.com/articles/Unicode.html&lt;/a&gt;
&lt;a href="http://www.stereoplex.com/2009/nov/8/python-unicode-and-unicodedecodeerror/" target="_blank"&gt;http://www.stereoplex.com/2009/nov/8/python-unicode-and-unicodedecodeerror/&lt;/a&gt;&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/622163967</link><guid>http://rudi-src.05bit.com/post/622163967</guid><pubDate>Sat, 22 May 2010 18:45:00 +0400</pubDate><category>python</category><category>unicode</category></item><item><title>=&gt; rudi-src.05bit.com</title><description>&lt;a href="http://rudi-src.05bit.com"&gt;=&gt; rudi-src.05bit.com&lt;/a&gt;: &lt;p&gt;Все-таки, сменил адрес блога на тот, который хотел сделать с самого начала, но почему-то передумал :)&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/609717736</link><guid>http://rudi-src.05bit.com/post/609717736</guid><pubDate>Tue, 18 May 2010 14:23:00 +0400</pubDate><category>announcement</category></item><item><title>Kodoblog in English</title><description>&lt;p&gt;Разные знания и премудрости отныне буду писать на английском здесь: &lt;a href="http://kodoblog.05bit.com" target="_blank"&gt;http://kodoblog.05bit.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;А на русском буду писать всякое разное о программинге и просто так :)&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/583610580</link><guid>http://rudi-src.05bit.com/post/583610580</guid><pubDate>Sun, 09 May 2010 13:24:36 +0400</pubDate><category>announcement</category><category>link</category></item><item><title>Хостинг. Вопрос жизни</title><description>&lt;a href="http://rudyryk.livejournal.com/173486.html"&gt;Хостинг. Вопрос жизни&lt;/a&gt;: &lt;p&gt;Итоги прошедших 2-х лет в поиске хостинга написал в ЖЖ. Пока не настроил кросспостинг, да будет так.&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/583566578</link><guid>http://rudi-src.05bit.com/post/583566578</guid><pubDate>Sun, 09 May 2010 12:53:56 +0400</pubDate></item><item><title>Контрибьюшн</title><description>&lt;p&gt;В библиотеке django-treebeard есть теперь &lt;a href="http://bitbucket.org/tabo/django-treebeard/changeset/6e740b76775d/" target="_blank"&gt;мой небольшой кусочек кода&lt;/a&gt; :) Я доволен :)&lt;/p&gt;

&lt;p&gt;Кстати, я сначала прицепил к своему сниппету лицензию BSD, но когда Густаво посмотрел код и решил его внедрить к себе, то попросил поменять лицензию на Apache2 чтобы prevent a headaches. Я был конечно не против, но я думал, что эти лицензии разрешают все и совместимы поэтому. Оказывается, не совсем.&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/501621129</link><guid>http://rudi-src.05bit.com/post/501621129</guid><pubDate>Wed, 07 Apr 2010 02:27:14 +0400</pubDate><category>python</category><category>python-django</category><category>python-lib</category></item><item><title>Nicedit wysiwyg</title><description>&lt;p&gt;Обычно, wysiwyg - это какая-то боль. Зачем-то нужно качать 1 мегабайтовую библиотеку и получить 100 кнопок, а потом методично отключать 90% ненужного функционала. И все равно будет тормозить и глючить. Не люблю wysiwyg. :)&lt;/p&gt;

&lt;p&gt;Nicedit мне понравился, по первому впечатлению. Весит 35 кб, кнопочек всего 16 и все компактно лежат в gif-ке размером 3 кб. Можно конфигурировать. Синтаксис для подключения - симпатичный.&lt;/p&gt;

&lt;p&gt;Вот так например, можно подключить его на все textarea в Django:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;script type="text/javascript" src="{{ MEDIA_URL }}js/nicEdit.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
bkLib.onDomLoaded(function() {
    nicEditors.allTextAreas({iconsPath : '{{ MEDIA_URL }}js/nicEditorIcons.gif'});
});
&lt;/script&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nicedit wysiwyg:
&lt;a href="http://nicedit.com" target="_blank"&gt;http://nicedit.com&lt;/a&gt;&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/486659947</link><guid>http://rudi-src.05bit.com/post/486659947</guid><pubDate>Wed, 31 Mar 2010 17:48:00 +0400</pubDate><category>javascript</category><category>wysiwyg</category><category>programming</category><category>django</category></item><item><title>Python money formatting # Форматирование вывода денег # moneyfmt</title><description>&lt;a href="http://docs.python.org/library/decimal.html#recipes"&gt;Python money formatting # Форматирование вывода денег # moneyfmt&lt;/a&gt;: &lt;p&gt;Поиском находится плохо. Чтобы лучше искалось, решил запостить ссылку :)
(thanks to &lt;a href="http://vorushin.ru" target="_blank"&gt;Vorushin&lt;/a&gt;)&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/480127467</link><guid>http://rudi-src.05bit.com/post/480127467</guid><pubDate>Mon, 29 Mar 2010 02:16:15 +0400</pubDate><category>pytho</category><category>python-snippet</category></item><item><title>django-bricks # Generic Django application for storing content blocks in models</title><description>&lt;a href="http://bitbucket.org/rudi/django-bricks/"&gt;django-bricks # Generic Django application for storing content blocks in models&lt;/a&gt;</description><link>http://rudi-src.05bit.com/post/435097741</link><guid>http://rudi-src.05bit.com/post/435097741</guid><pubDate>Mon, 08 Mar 2010 22:28:38 +0300</pubDate><category>python</category><category>django</category><category>django-app</category><category>programming</category></item><item><title>Python Goodies</title><description>&lt;p&gt;Это специальный пост для тех, кто не попробовал ещё Python в деле :) И особенно специально для &lt;a href="http://generaltheory.ru" target="_blank"&gt;Хаафа&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Вот такие плюсы есть у Python по сравнению с чем-нибудь ещё.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0. Painless.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;В общем - главное :))) Лаконично и работает.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Интерактивный интерпретатор.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;То есть, ставишь себе &lt;a href="http://python.org/download/" target="_blank"&gt;Python&lt;/a&gt;, запускаешь в командной строке &lt;em&gt;python&lt;/em&gt; - и можно уже играться.&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
&gt;&gt;&gt; a,b,c = 1,3,4
&gt;&gt;&gt; max(a,b)
3
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;2. Мощный набор встроенных методов и типов, паттернов, базовых синтаксических конструкций&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;“Из коробки”, без всяких инклудов-импортов, есть списки, хэш-мэпы, min/max’ы, “декораторы”, лямбда-функции, преобразования кодировок, работа с файлами.&lt;/p&gt;

&lt;p&gt;Примеры без экзотики:&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
def is_str_quoted(var):
    return var[0] == var[-1] and var[0] in ("'", '"')
&lt;/pre&gt;

&lt;p&gt;var[-1] - последний элемент в var. Гениально. Отрицательная индексация - это шедевр! :)&lt;/p&gt;

&lt;p&gt;“Нарезка” строк, списков по индексу делается универсальной конструкцией, вот так:&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
&gt;&gt;&gt; a = 'Little Johny'
&gt;&gt;&gt; 'Big ' + a[7:-1]
'Big John'
&lt;/pre&gt;

&lt;p&gt;Или вот - применить ко всем элементам списка функцию и вернуть список результатов:&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
&gt;&gt;&gt; add_ly = lambda x: x + 'ly'
&gt;&gt;&gt; map(add_ly, ['rapid', 'kind', 'identical'])
['rapidly', 'kindly', 'identically']
&lt;/pre&gt;

&lt;p&gt;Пояснение: &lt;em&gt;lambda x: x + ‘ly’&lt;/em&gt; - это функция, которая принимает &lt;em&gt;x&lt;/em&gt; и возвращает &lt;em&gt;x + ‘ly’&lt;/em&gt;, анонимные функции их ещё называют или лямбда-функции.&lt;/p&gt;

&lt;p&gt;Очень часто - просто не нужны классы, хватает встроенного типа &lt;em&gt;dict&lt;/em&gt;, чтобы представить какой-то объект:&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
&gt;&gt;&gt; response = {'code': 1, 'message': "Hi, I'm ok."}
&gt;&gt;&gt; print response['code']
1
&lt;/pre&gt;

&lt;p&gt;И вот - функция с произвольным набором параметров:&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
def show_args(*args, **kwargs):
    times = kwargs['times']
    for i in range(times):
        for a in args:
            print a

&gt;&gt;&gt; show_args('Rabbits', 'like', 'fuel', times=3)
Rabbits
like
fuel
Rabbits
like
fuel
Rabbits
like
fuel
&lt;/pre&gt;

&lt;p&gt;Неименованные параметры - принимаются как список, именованные - как обычный dict (хэш-мэп).&lt;/p&gt;

&lt;p&gt;Или вот - объявление класса, конструирование, наследование - ничего лишнего.&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
class GenericBoss:
    def __init__(self, owner=None):
        self.owner = owner

    def say_what_should_we_do(self):
        print self.owner.say_what_should_we_do()

class BigBoss(GenericBoss):
    def say_what_should_we_do(self):
        print "Work!"

&gt;&gt;&gt; GenericBoss(owner=BigBoss()).say_what_should_we_do()
'Work!'
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;3. Библиотеки&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Много крутых библиотек про для работы с сетью, с текстовыми данными, с базами данных, с картинками.&lt;/p&gt;

&lt;p&gt;Хорошие - это вот, например:&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
&gt;&gt;&gt; import feedparser
&gt;&gt;&gt; d = feedparser.parse("http://rudi-kodoblog.05bit.com/rss")
&lt;/pre&gt;

&lt;p&gt;или&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
from PIL import Image
im = Image.open("bride.jpg")
im.rotate(45).save("bride_rot_45.jpg")
&lt;/pre&gt;

&lt;p&gt;Для GUI, интерактивной графики - поменьше конечно, но нарождается. Есть bind’ы к C/C++ библиотекам. Вот такое даже есть - &lt;a href="http://www.pythonogre.com" target="_blank"&gt;pythonogre.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. &lt;a href="http://vorushin.ru" target="_blank"&gt;Роман Ворушин&lt;/a&gt; и &lt;a href="http://vostryakov.ru" target="_blank"&gt;Анатолий Востряков&lt;/a&gt; программируют на питоне.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;А это вам не хухры мухры.&lt;/p&gt;

&lt;p&gt;:)&lt;/p&gt;</description><link>http://rudi-src.05bit.com/post/429133183</link><guid>http://rudi-src.05bit.com/post/429133183</guid><pubDate>Sat, 06 Mar 2010 03:24:00 +0300</pubDate><category>programming</category><category>python</category><category>hello world</category></item><item><title>Mercurial # Руководство # Manual # Tutorial # How to</title><description>&lt;a href="http://hginit.com"&gt;Mercurial # Руководство # Manual # Tutorial # How to&lt;/a&gt;</description><link>http://rudi-src.05bit.com/post/418578248</link><guid>http://rudi-src.05bit.com/post/418578248</guid><pubDate>Mon, 01 Mar 2010 02:48:10 +0300</pubDate></item><item><title>Django # Грабли с отловом exceptions в декорированных views # Debug output for decorated views fails</title><description>&lt;p&gt;Нашел грабли :) Надо будет сделать баг-репорт, но пока - просто workaround.&lt;/p&gt;

&lt;p&gt;Грабли - если view задекорирован и в нем возникает ошибка, то джанга не всегда правильно обрабатывает traceback - дебажный вывод не показывает, точнее слетает в самом дебажном выводе :)&lt;/p&gt;

&lt;p&gt;Пример:&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
from decorators import render_to

@render_to('main.html')
def main_view(request):
    # тут что-то пошло не так
    raise Exception('AAA!!!')
    return context
&lt;/pre&gt;

&lt;p&gt;Так вот, чтобы дебажный вывод работал правильно (как обычно), &lt;em&gt;render_to&lt;/em&gt; должен быть объявлен:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;либо в &lt;em&gt;этом же модуле&lt;/em&gt; view&lt;/li&gt;
&lt;li&gt;либо в &lt;em&gt;другом package’е&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Если &lt;em&gt;render_to&lt;/em&gt; импортится из того же package, что и view, то дебажный вывод сходит с ума и не может правильно определить, в каком файле произошла ошибка.&lt;/p&gt;

&lt;p&gt;То есть, вот так - сломается: есть &lt;em&gt;views.py&lt;/em&gt;, где лежат views, и рядом &lt;em&gt;decorators.py&lt;/em&gt;, в котором объявлен &lt;em&gt;render_to&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Работает - так (main_view должен быть не в myproject.utils :)&lt;/p&gt;

&lt;pre class="brush: python;"&gt;
from myproject.utils.decorators import render_to

# ...
&lt;/pre&gt;</description><link>http://rudi-src.05bit.com/post/415286356</link><guid>http://rudi-src.05bit.com/post/415286356</guid><pubDate>Sat, 27 Feb 2010 15:37:00 +0300</pubDate><category>django</category><category>python</category><category>programming</category><category>debug</category></item></channel></rss>

