<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6180190261543881757</atom:id><lastBuildDate>Sun, 27 May 2012 18:12:47 +0000</lastBuildDate><category>Яндекс</category><category>чтиво</category><category>Хабрахабр</category><category>Избранное</category><category>видео</category><category>javascript</category><category>Администрирование</category><category>разработка</category><category>sphinx</category><category>MoscowDjango Meetup</category><category>Спокойно.ру</category><category>github</category><category>Тестирование</category><category>События</category><category>Django Days</category><category>Новости</category><category>django</category><category>fc.tape</category><category>PHP</category><category>jquery</category><category>вёрстка</category><category>python</category><category>zend framework</category><category>jquery ui</category><category>Eclipse</category><category>производительность</category><category>ZenCoding</category><category>Проекты</category><category>Банкоматор</category><category>БЭМ</category><category>GDD</category><category>музыка</category><category>google</category><category>HTML5</category><title>Блог студии Future Colors</title><description>Пишем про python, Django, вёрстку и не только.</description><link>http://blog.futurecolors.ru/</link><managingEditor>noreply@blogger.com (Илья Барышев)</managingEditor><generator>Blogger</generator><openSearch:totalResults>93</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/futurecolors" /><feedburner:info uri="futurecolors" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>futurecolors</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Ffuturecolors" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Ffuturecolors" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-5169021403064131632</guid><pubDate>Sat, 26 May 2012 18:01:00 +0000</pubDate><atom:updated>2012-05-27T22:12:47.876+04:00</atom:updated><title>Чтиво на выходные 26-27 мая</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Сегодня вас ждёт небольшой спецвыпуск про python и Django only. Наслаждайтесь :)&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;


Django + Python&lt;/h3&gt;
&lt;div&gt;
В мае появился новый подкаст, &lt;a href="http://3rdaverad.io/shows/django-podcast/"&gt;посвящённый Django&lt;/a&gt;. Ребята успели записать пару выпусков, первый про новинки Django 1.4, второй - про Celery и очереди задач. Рекомендуется новичкам с хорошим знанием английского.&lt;br /&gt;
&lt;br /&gt;
Принят &lt;a href="http://www.python.org/dev/peps/pep-0405/"&gt;PEP 405: Python Virtual Environments&lt;/a&gt; от Карла Майера, автора virtualenv. В питоне 3.3 этой осенью нас ждёт виртуалэнв из коробки, это не может не радовать. &lt;br /&gt;
&lt;br /&gt;
Ещё принят &lt;a href="http://www.python.org/dev/peps/pep-0420/"&gt;PEP 420: Implicit namespace packages&lt;/a&gt;, не менее интересное предложение, одним из результатов которого станет отсутствие необходимости в __init__.py во всех питоновских пакетах (подробности по ссылке).  &lt;br /&gt;
&lt;br /&gt;
Недавно зарелизился замечательный пакет &lt;a href="https://github.com/jezdez/django-discover-runner"&gt;django-discover-runner&lt;/a&gt;, позволяющий сделать обнаружение тестов более удобоваримым, а именно discovery из unittest2. Подробнее в презентации того же Карла Майера &lt;a href="http://blog.futurecolors.ru/2012/04/testing-and-django-carl-meyer.html"&gt;Testing and Django&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Люди жаловались, что python-сообщество &lt;a href="http://grokcode.com/746/dear-python-why-are-you-so-ugly/"&gt;не ценит дизайн&lt;/a&gt;, а вышедший в декабре &lt;a href="http://perone.github.com/stallion/"&gt;менеджер пакетов Stallion&lt;/a&gt; пытается это опровергнуть. Он отличается от классических pip, easy_install тем, что предоставляет визуализацию установленных пакетов и несколько функций для управления ими. Написан на Flask и использует Twitter bootstrap. Похвастать оригинальностью тут нечем, зато аккуратно и симпатично.&lt;br /&gt;
&lt;br /&gt;
История сервиса для шаринга &lt;a href="http://highscalability.com/blog/2012/5/21/pinterest-architecture-update-18-million-visitors-10x-growth.html"&gt;Pinterest&lt;/a&gt;, написанного на Django, очень напоминает Instagram за исключением покупки: облачная архитектура, быстрый рост, огромное количество данных и небольшое количество сотрудников.&lt;br /&gt;
&lt;br /&gt;
Статья на Хабре про &lt;a href="http://habrahabr.ru/post/144161/"&gt;Django + MySQL&lt;/a&gt;, особенности использования с InnoDb и транзакции. Advanced-чтиво, очень полезно всем, кто ещё не переключился на Postgresql.&lt;br /&gt;
&lt;br /&gt;
Пост с кучей &lt;a href="http://satyajit.ranjeev.in/2012/05/17/python-a-few-things-to-remember.html"&gt;полезных советов по питону&lt;/a&gt;&amp;nbsp;и &lt;a href="http://habrahabr.ru/post/144614/"&gt;перевод на Хабре&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-5169021403064131632?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/n5kGgI1-Q7M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/n5kGgI1-Q7M/26-27.html</link><author>noreply@blogger.com (Илья Барышев)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/26-27.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-1062930173643381822</guid><pubDate>Thu, 24 May 2012 19:51:00 +0000</pubDate><atom:updated>2012-05-24T23:51:46.434+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">видео</category><category domain="http://www.blogger.com/atom/ns#">производительность</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>High Performance Python (Ian Ozsvald)</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;После небольшого перерыва - продолжаем обозревать годные видео с различных PyCon`ов. На этот раз речь пойдёт о проблеме, которую питонисты поднимают неохотно, а зачастую даже избегают её, оправдываясь фразами вроде "зато разрабатывать быстро" или "зато код читабельный", или ещё что-то в этом роде. И проблема эта - производительность. Одна из немногих проблем, которая действительно имеет место и с которой мало кто знает как бороться.&lt;br /&gt;
&lt;br /&gt;
Зато это знает &lt;a href="http://ianozsvald.com/"&gt;Ian Ozsvald&lt;/a&gt;. На последнем американском PyCon`е он выступил, вероятно, с самым большим докладом (в двух частях, по 3 часа каждый), в котором достаточно подробно, пошагово, осветил современные и недорогие методы увеличения производительности Python-кода - от компиляции отдельно взятых модулей через трансляцию в C-код (небезызвестный проект &lt;a href="http://cython.org/"&gt;Cython&lt;/a&gt;) до параллельных вычислений. В интерактивном режиме, докладчик вместе с аудиторией построчно улучшает скорость выполнения функции создания множества Мандельброта (в качестве образцово-показательного примера), постепенно увеличив её более чем в 50 раз. Да-да, время отработки уменьшилось с 50 до 0.7 секунд, на одном ядре. Потрясающий результат.&lt;br /&gt;
&lt;br /&gt;
Докладчик занимается проблемой искусственного интеллекта, активно использует в своей работе &lt;a href="http://numpy.scipy.org/"&gt;numpy&lt;/a&gt;, поэтому для него скорость выполнения особо сложных вычислений стоит более остро, чем для рядового веб-разработчика. Но, тем не менее, целый ряд приёмов наверняка будет полезен многим питонистам, независимо от сферы применения языка. 6 часов видео осилить непросто, но это стоит ваших выходных :)&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/Iw9-GckD-gQ" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/xHqlzuPq_qQ" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-1062930173643381822?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/8InRGQtHlzw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/8InRGQtHlzw/high-performance-python-ian-ozsvald.html</link><author>noreply@blogger.com (Роман Семирук)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/Iw9-GckD-gQ/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/high-performance-python-ian-ozsvald.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-3773030125763288241</guid><pubDate>Sat, 19 May 2012 09:48:00 +0000</pubDate><atom:updated>2012-05-19T13:52:29.799+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">чтиво</category><title>Чтиво на выходные 19-20 мая</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;h3 style="text-align: left;"&gt;

Django&lt;/h3&gt;
Добрые люди выкачали все видеозаписи с последнийх PyCon и сделали торрент-раздачи: &lt;a href="http://rghost.ru/37691125"&gt;PyCon US 2011 Atlanta&lt;/a&gt; и &lt;a href="http://rghost.ru/37676315"&gt;2012 Santa Clara&lt;/a&gt;. Есть также торрент на &lt;a href="http://rutracker.org/forum/viewtopic.php?t=4062835"&gt;PyCon 2012 Santa Clara рутрекере&lt;/a&gt;. Спасибо Михаилу Феоктистову и Михаилу @mktums.&lt;br /&gt;
&lt;br /&gt;
Неплохая обзорная статья про &lt;a href="http://habrahabr.ru/post/143789/"&gt;варианты кеширования в Django&lt;/a&gt;. Рассмотрены как готовые решения, так и общие рецепты для собственных решений.&lt;br /&gt;
&lt;br /&gt;
Подробный разбор безопасности Django в &lt;a href="http://www.slideshare.net/Voulnet/case-study-of-django-web-frameworks-that-are-secure-by-default"&gt;отличной презентации ”Case Study of Django: Web Frameworks that are Secure by Default”&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;

WebDev&lt;/h3&gt;
Инструмент для экспорта слоев Фотошопа в css. Обещают &lt;a href="http://csshat.com/"&gt;скорый релиз&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;

Разное&lt;/h3&gt;
RFC-документы, содержащие спецификации и стандарты, широко применяемые в интернете:&amp;nbsp;&lt;a href="http://pretty-rfc.herokuapp.com/"&gt;все в одном месте, красиво оформленные и с поиском&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;

События&lt;/h3&gt;
2-го июня пройдёт &lt;a href="http://kharkivpy.org.ua/"&gt;4-й KharkivPy&lt;/a&gt; (Харьков, Украина) и ещё не поздно зарегистрироваться. Пока ожидается 5 докладов про Flask, Django и Python в общем, но скорее всего их будет больше. Рома Семирук будет там и подготовит отчёт, как всегда, для тех, у кого не получится приехать.&lt;br /&gt;
&lt;br /&gt;
В этот же день в Минске пройдёт &lt;a href="http://events.yandex.ru/public/subbotnik/schedule.xml"&gt;Яндекс.Субботник&lt;/a&gt; и жаль, что Рома не умеет клонироваться :) Некоторые доклады повторяются, но есть и новые темы. Субботники всегда вызывают аншлаг, поэтому &lt;a href="http://events.yandex.ru/public/subbotnik/reg.xml"&gt;регистрироваться на событие&lt;/a&gt; лучше уже прямо сейчас.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-3773030125763288241?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/1eru1OQPMp8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/1eru1OQPMp8/19-20.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/19-20.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-807864899914611666</guid><pubDate>Sun, 13 May 2012 06:10:00 +0000</pubDate><atom:updated>2012-05-13T10:10:42.354+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">чтиво</category><title>Чтиво на воскресенье 13 мая</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;h3 style="text-align: left;"&gt;
Django + Python&lt;/h3&gt;
&lt;div&gt;
Продолжаем делиться опенсорсом: &lt;a href="http://blog.futurecolors.ru/2012/05/django-14.html"&gt;django-future-url&lt;/a&gt; от Виталия Олевинского. Как без особых проблем сделать все теги {% url %} совместимыми с будущими версиями Django.&lt;br /&gt;&lt;br /&gt;Ребята из dabapps рассказывают про свой &lt;a href="http://dabapps.com/blog/higher-level-query-api-django-orm/"&gt;подход к работе с ORM&lt;/a&gt;: заменяйте низкоуровневые вызовы кастомными Queryset-менеджерами. У себя в студии мы делаем примерно то же самое.&lt;br /&gt;&lt;br /&gt;Несколько полезных ссылочек, которые были озвучены на Moscow Django Meetup (&lt;a href="http://moscowdjango.timepad.ru/events"&gt;timepad&lt;/a&gt;, &lt;a href="http://www.facebook.com/groups/MoscowDjango/"&gt;facebook&lt;/a&gt;).&lt;br /&gt;Достойная альтернатива Django Compressor — &lt;a href="https://github.com/trilan/django-gears"&gt;django-gears&lt;/a&gt;.&lt;br /&gt;С документацией Class Based Generic Views дела обстоят не очень хорошо, &lt;a href="http://ccbv.co.uk/"&gt;http://ccbv.co.uk/&lt;/a&gt; отличный помощник в этом.&lt;br /&gt;&lt;br /&gt;Небольшой но &lt;a href="http://nimnull.posterous.com/flask-methodview-restful-registration"&gt;полезный сниппет для Flask&lt;/a&gt; - декоратор для быстрой разработки RESTful-сервисов.&lt;br /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;
Webdev&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Советы верстальщикам или как не надо готовить БЭМ. Статья нашего главного фронтендера Артёма Голикова “.&lt;a href="http://blog.futurecolors.ru/2012/05/b-left-b-right.html"&gt;b-left или .b-right?&lt;/a&gt;”&lt;br /&gt;&lt;br /&gt;Образец клиентской оптимизации &lt;a href="http://blog.jphpsf.com/2012/04/28/front-end-performance-case-study-github/"&gt;на примере Github&lt;/a&gt;. Много конкретики, все рекомендации по делу. Кстати в эту тему недавний &lt;a href="https://github.com/blog/1135-the-making-of-octicons"&gt;апдейт их иконок&lt;/a&gt;, которые стали векторными.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/prototypes-in-javascript-what-you-need-to-know/"&gt;Что такое прототипы в JavaScript&lt;/a&gt; и как их готовить. Для начинающих, просто и лаконично. Там же, рядом, аналогичная &lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/closures-front-to-back/"&gt;статья про замыкания&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;
Конференции&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Успешно прошёл &lt;a href="http://blog.futurecolors.ru/2012/05/moscow-django-meetup-3.html"&gt;Moscow Django Meetup #3&lt;/a&gt;.&lt;br /&gt;Мы выложили свой &lt;a href="http://blog.futurecolors.ru/2012/05/blog-post_09.html"&gt;отчёт о киевском Яндекс.Субботнике&lt;/a&gt;.&lt;br /&gt;Девконф начал &lt;a href="http://devconf.ru/offers/"&gt;голосование за доклады&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-807864899914611666?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/S89tCjmWc74" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/S89tCjmWc74/13.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/13.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-6833157472510070424</guid><pubDate>Sat, 12 May 2012 11:40:00 +0000</pubDate><atom:updated>2012-05-12T15:45:20.597+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">События</category><category domain="http://www.blogger.com/atom/ns#">MoscowDjango Meetup</category><title>Moscow Django Meetup #3</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span id="internal-source-marker_0.0842288164421916" style="text-align: -webkit-auto;"&gt;&lt;b&gt;&lt;img height="476" src="https://lh4.googleusercontent.com/DMb_yQEqcMa12Mclf8mAW1bb9eB_oChNALlkZ7lQgNiAticnTu2t94x-Sz49xE2OPVnDOwq2L6QZQ0ihamq-zR8uXbcCrgpcfjlChEdirqCeNMZVy_s" width="640" /&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;Хотим поделиться впечатлениями от третьей московской встречи Django-девелоперов, она же Moscow Django Meetup. Благодаря организаторам из GreenfieldProject и Seven Quark в этот раз удалось подыскать для встречи отличное место: один из вместительных залов &lt;a href="http://modmoscow.com/"&gt;MOD Design&lt;/a&gt;. Очень уютное, близко к центру, а главное, всем хватило места и было удобно. Огромный проекционный экран, кликер для докладчика, вкусный кофе в перерыве, что ещё надо для хорошего митапа.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/MoscowDjango/3-moscowdjango-meetup"&gt;Презентации на SlideShare&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.facebook.com/groups/MoscowDjango/"&gt;Группа Moscow Django в Facebook&lt;/a&gt;&lt;br /&gt;&lt;a href="http://moscowdjango.timepad.ru/events"&gt;События на timepad&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
В программе были заявлены 5 докладов: 3 полноценных по 20 минут и два укороченных по 10, разделённые одним кофебрейком. Сколько пришло народу из почти сотни зарегистрированных сказать сложно, человек 50-60, вероятно, кто-то не успел&lt;br /&gt;прийти&amp;nbsp;в себя после праздников. На фото зал минут за 10-15 до начала, потом народ ещё подтянулся.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div&gt;
&lt;h3 style="text-align: left;"&gt;


&lt;br /&gt;Доклады&lt;/h3&gt;
&lt;div&gt;
Александр Емелин из Mail.ru Group доступно рассказал про &lt;a href="http://www.slideshare.net/MoscowDjango/class-based-generic-views-django"&gt;Class-based generic views&lt;/a&gt;.  Тем кто до сих пор не пользуется вьюхами на классах, рекомендуем обратить на них внимание, порой они экономят очень много boilerplate-кода. Тем же, кто активно их применяет, неплохая ссылочка по рекомендации Александра: &lt;a href="http://ccbv.co.uk/"&gt;Classy CBV&lt;/a&gt; - замена официальной путаной и неудобной документации по видам на классах. Доставило обсуждение CBV vs functional views, когда уместно использовать тот или иной вариант и почему.&lt;br /&gt;
&lt;br /&gt;
Владимир Филонов из WebCanFly поведал про &lt;a href="http://www.slideshare.net/MoscowDjango/django-12897050"&gt;расширяемые приложения&lt;/a&gt;. На примере небольшой части интернет-магазина рассмотрели различные варианты реализации API для подключения плагинов к django-приложениям. Подробно, много кода, но всё понятно и логично выстроено. Хороший доклад, думаем, при разработке сложных систем со слабым связыванием компонентов всем придётся столкнуться с чем-либо подобным.&lt;br /&gt;
&lt;br /&gt;
Михаил Юматов про &lt;a href="http://www.slideshare.net/MoscowDjango/django-12897095"&gt;статику в Django&lt;/a&gt;. &lt;br /&gt;
Доклад можно было смело назвать &lt;a href="https://github.com/trilan/django-gears"&gt;django-gears&lt;/a&gt;, поскольку речь шла в основном об этой амбициозной билиотеке, которую разрабатывают ребята из Trilan. Она призвана заменить django-compressor и webassets, обладает большей частью их функциональности, к тому же хранит зависимости прямо в css/js (по аналогии с &lt;a href="https://github.com/sstephenson/sprockets#readme"&gt;sprockets&lt;/a&gt;). Пока приложение ещё не в продакшене, но от этого не менее интересно.&lt;br /&gt;
&lt;br /&gt;
Иван Вирабян про &lt;a href="http://www.slideshare.net/MoscowDjango/django-12897658"&gt;производительность в Django&lt;/a&gt;.&lt;br /&gt;
По большей части речь шла об ORM. Иван объяснил, почему «db_index=True не творит чудеса», показал каким иногда непредсказуемым может быть генератор SQL, объяснил как нужно использовать «Defer()», а так же описал основные подходы к инвалидации кеша и оптимизации контекст процессоров в Django. Самое продвинутое выступление явно не для новичков, жаль, что всего лишь на 10 минут, такая тема достойна больших временных рамок. Обязательно посмотрите слайды, очень полезный и наиболее прикладной доклад.&lt;br /&gt;
&lt;br /&gt;
Александр Шлемин про &lt;a href="http://www.slideshare.net/MoscowDjango/django-android"&gt;Django на Андроиде&lt;/a&gt;.&lt;br /&gt;
Докладчик наглядно показал, что Django это не только про Web и что его можно запускать в том числе на мобильных устройствах. Александр продемонстрировал нам это на примере мобильного телефона на базе Android. Доклад вызвал, наверное, самую бурную реакцию аудитории со смехом и овацией.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Для тех кто захочет попробовать свои силы и поставить Django на Android, Александр советует запускать &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;manage.py runserver &lt;/span&gt;с ключом &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;--noreload&lt;/span&gt; — это увеличит время жизни вашего аккумулятора :)&lt;br /&gt;
Используя силу root доступа к телефону и несколько батареек (к Django), мы получаем доступ к списку контактов или базам данных других приложений. А стандартная админка Django покажет все эти данные в приемлемом оформлении.&lt;br /&gt;
Взаимодействие с API телефона происходит через Python драйвер, таким образом мы можем вибрировать телефоном, писать смски, получать данные GPS и даже звонить!&lt;br /&gt;
В общем, для любителей «экстремального» программирования!&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;


 Заключение&lt;/h3&gt;
Ещё раз спасибо организаторам, ребята явно постарались учесть все пожелания и сделали встречу лучше &lt;a href="http://blog.futurecolors.ru/2012/04/moscow-django-meetup-2.html"&gt;предыдущей&lt;/a&gt;. И конечно же докладчикам, нескучные выступления и темы были актуальны. &lt;br /&gt;
&lt;br /&gt;
В планах провести Django-спринт или Django-dash, в общем покодить совместно этим летом. Активисты и прочие желающие приглашаются &lt;a href="http://www.facebook.com/groups/MoscowDjango/"&gt;в группу на фейсбуке&lt;/a&gt;, там сейчас идёт активное обсуждение.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
P.S. Ждём следующего митапа через месяц. Там один из нас снова попробует свои силы за микрофоном у проектора с докладом.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Илья Барышев&lt;br /&gt;Виталий Олевинский&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-6833157472510070424?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/ty_xyekwruE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/ty_xyekwruE/moscow-django-meetup-3.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/moscow-django-meetup-3.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-741087710497367894</guid><pubDate>Fri, 11 May 2012 08:36:00 +0000</pubDate><atom:updated>2012-05-11T12:38:50.272+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">вёрстка</category><category domain="http://www.blogger.com/atom/ns#">БЭМ</category><title>.b-left или .b-right?</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;

&lt;h3&gt;О наименованиях&lt;/h3&gt;

&lt;p&gt;В вёрстке абсолютно независимыми блоками, как ни странно, главное - корректно назвать блок/элемент/модификатор, и это достаточно трудоёмкий процесс. Почему это важно? Класс элемента, сконструированный с соблюдением единого принципа, однозначно указывает на его смысл и назначение. При этом хорошо читается его роль (блок, элемент блока) и/или модификация.&lt;/p&gt;

&lt;p&gt;Каким должно быть это название? Во-первых, уникальным. Для блока - в рамках проекта, а для элемента - в рамках блока. Во-вторых, понятно и органично проекту описывающим назначение блока / элемента. Название должно максимально соответствовать системе терминов, принятой в проекте. Названия моделей, их атрибутов и т.п. должны соответствовать названиям блоков, их отображающих.&lt;/p&gt;

&lt;p&gt;Нельзя допустить, чтобы название говорило о том, как элемент должен выглядеть, или какой тег ему соответствует. Много лучше, когда название объясняет, что это такое, каков смысл нахождения этого здесь. Про соответствие названия тегу вы, думаю, сами догадываетесь: ничто не вечно, и сегодня это &amp;lt;p&amp;gt;, а завтра &amp;lt;div&amp;gt; и т.д.&lt;/p&gt;

&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top"&gt;
&lt;i&gt;Плохо:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;div class="left"&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;p class="news__p"&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;ul class="ul"&amp;gt;
    &amp;lt;li class="ul__li"&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td valign="top"&gt;
&lt;i&gt;Хорошо:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;p class="article__teaser"&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;ul class="menu"&amp;gt;
    &amp;lt;li class="menu__item"&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p style="color: #777;"&gt;Лирическое отступление. У меня иногда возникает ситуация, когда я с трудом даю определение блоку / элементу. И в основном это связано с «красотой» дизайна, не несущего смысловой нагрузки. В эти моменты я грущу, так как бессмысленность дизайнерскоро решения отражается на коде, усложняя его, приводит к потенциальным проблемам, усложняет рефакторинг. Уверен, хороший дизайнер всегда задаёт себе вопросы: что это? почему это здесь?..&lt;/p&gt;

&lt;h3&gt;О дублировании кода&lt;/h3&gt;

&lt;p&gt;Рефакторинг, перевёрстка - все эти слова больше не пугают, если названия хорошо сконструированы, не пересекаются, а стили изолированы друг от друга. Тут есть один тонкий момент, связанный с пересечением вёрстки. Часто возникает соблазн вынести общие стили, например, скругления уголков или одинаковые отступы справа, в отдельные классы или даже блоки и примешивать их к одному и тому же html. С одной стороны, это уменьшает дублирование кода, создаёт свой внутрипроектовый фреймворк, позволяет в одном месте изменить значение внешний вид блоков / элементов, к которым добавлены эти примеси. С другой стороны, если увлечься, вёрстка становится размытой и внешний вид блока определяет не один css, связанный только с ним, но также и куча других правил, раскиданных по проекту, а количество класов на тегах становится устрашающим. Ещё один минус - потеря семантики, так как эти примеси говорят скорее о внешнем виде, чем о сути, и, о ужас, в проекте могут появится теги, на которые повешены только лишь классы примесей, говорящие не о смысле, а о внешнем виде его. Эта тенденция похожа на деградацию до старых каскадов и глобальных стилей. Рефакторинг такой вёрстки затрудняется. Всё это говорит о том, что не стоит перебарщивать с вынесением общих стилей.&lt;/p&gt;

&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" colspan="2"&gt;
&lt;i&gt;Плохо:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;div class="news i-col50 i-left i-nowrap i-rounded-borders"&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;
&lt;i&gt;Плохо:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;section class="blog"&amp;gt;
    &amp;lt;div class="i-col60"&amp;gt;
        &amp;lt;article class="blog__post"&amp;gt;
            ...
        &amp;lt;/article&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="i-col40"&amp;gt;
        &amp;lt;aside class="blog__author"&amp;gt;
            ...
        &amp;lt;/aside&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td valign="top"&gt;
&lt;i&gt;Хорошо:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;section class="blog"&amp;gt;
    &amp;lt;div class="blog__posts"&amp;gt;
        &amp;lt;article class="blog__post"&amp;gt;
            ...
        &amp;lt;/article&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="blog__description"&amp;gt;
        &amp;lt;aside class="blog__author"&amp;gt;
            ...
        &amp;lt;/aside&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;h3&gt;О префиксах&lt;/h3&gt;

&lt;p&gt;Что касается префиксов, то из использование не имеет особой необходимости. Раньше я использовал разные префиксы: b-, l-, .h, g- и т.п. Если посмотреть на код, то большинство классов получало префикс b-, и это не несло эффективной смысловой нагрузки, только усложняло редактирование. Некоторые префиксы, как h- раньше или i- сейчас, имеют проблемы, связанные с их пониманием. Например, i- префикс предлагается использовать для глобальных блоков, примесей, а также для интерактивных элементов, что само по себе неопределённо и размыто. С другой стороны, иногда использую префикс g- для глобальных стилей (например, g-clear или g-hide) и префикс m- для темизации страницы (вешаю на &amp;lt;body /&amp;gt;). Если возвратиться к старым префиксам, то можно отметить префикс l-, который имеет некоторый смысл в плане улучшения читаемости кода. Если подвести итог, то префиксы по большому счёту не нужны и только загромождают код.&lt;/p&gt;

&lt;h3&gt;О тегах&lt;/h3&gt;

&lt;p&gt;Так как блок является смысловой единицей, главный, «рутовый» тег блока должен являтся смысловым в плане html-разметки страницы. Такими тегами являются section, article, aside, footer, header, nav. Тег div особой смысловой нагрузки не несёт, как и span, является нейтральным; их стоит использовать для задач оформления, то есть для экстра-разметки, необходимой, чтобы повторить изыски дизайна в вёрстке.&lt;/p&gt;

&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top"&gt;
&lt;i&gt;Плохо:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;div class="page"&amp;gt;
    &amp;lt;section class="page_content"&amp;gt;
        &amp;lt;div class="header"&amp;gt;
            &amp;lt;header class="logo"&amp;gt;
                ...
            &amp;lt;/header&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;
    ...
    &amp;lt;footer class="footer"&amp;gt;
        ...
    &amp;lt;/footer&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td valign="top"&gt;
&lt;i&gt;Хорошо:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;section class="page"&amp;gt;
    &amp;lt;header class="header"&amp;gt;
        ...
    &amp;lt;/header&amp;gt;
    &amp;lt;section class="greeting"&amp;gt;
        ...
    &amp;lt;/section&amp;gt;
    &amp;lt;section class="hews"&amp;gt;
        ...
    &amp;lt;/section&amp;gt;
    &amp;lt;footer class="footer"&amp;gt;
        ...
    &amp;lt;/footer&amp;gt;
&amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;h3&gt;О выделении блоков&lt;/h3&gt;

&lt;p&gt;При выявлении блоков наиболее удобным кажется направление сверху вниз. Это значит, что вёрстка начинается с внешнего блока, затем верстаются его элементы, а когда становится ясным, что элемент имеет свою нетривиальную структуру, или он может повторится в другом месте, или отчётливо видно различие смысла / предназначения верстаемого блока и этого элемента, тогда происходит выделение элемента в отдельный блок.&lt;/p&gt;

&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top"&gt;
&lt;i&gt;Было:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;section class="blog"&amp;gt;
    &amp;lt;article class="blog__post"&amp;gt;
        &amp;lt;header class="blog__post-info"&amp;gt;
            ...
        &amp;lt;/header&amp;gt;
        &amp;lt;div class="blog__post-teaser"&amp;gt;
            ...
        &amp;lt;/div&amp;gt;
    &amp;lt;/article&amp;gt;
    &amp;lt;aside class="blog__author"&amp;gt;
        &amp;lt;div class="blog__author-name"&amp;gt;
            ...
        &amp;lt;/div&amp;gt;
    &amp;lt;/aside&amp;gt;
&amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;td valign="top"&gt;
&lt;i&gt;Стало:&lt;/i&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;section class="blog"&amp;gt;
    &amp;lt;article class="post"&amp;gt;
        &amp;lt;header class="post__info"&amp;gt;
            ...
        &amp;lt;/header&amp;gt;
        &amp;lt;div class="post__teaser"&amp;gt;
            ...
        &amp;lt;/div&amp;gt;
    &amp;lt;/article&amp;gt;
    &amp;lt;aside class="author"&amp;gt;
        &amp;lt;div class="author__name"&amp;gt;
            ...
        &amp;lt;/div&amp;gt;
    &amp;lt;/aside&amp;gt;
&amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-741087710497367894?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/dt4F2oTL1ng" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/dt4F2oTL1ng/b-left-b-right.html</link><author>noreply@blogger.com (Артём Голиков)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/b-left-b-right.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-3145642958798319083</guid><pubDate>Thu, 10 May 2012 12:06:00 +0000</pubDate><atom:updated>2012-05-10T16:06:41.199+04:00</atom:updated><title>Миграция на Django 1.4</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Если вы тоже столкнулись с проблемой переноса старых проектов на Django 1.4, то этот пост для вас.&lt;br /&gt;
&lt;br /&gt;
Первое что довольно сильно напрягает это «Deprecation warnings» в логах:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;DeprecationWarning: The syntax for the url template tag is changing. Load the url tag from the future tag library to start using the new behavior.&lt;/li&gt;
&lt;li&gt;The ADMIN_MEDIA_PREFIX setting has been removed; use STATIC_URL instead.&lt;/li&gt;
&lt;li&gt;Authentication backends without a `supports_inactive_user` attribute are deprecated. Please define it ...&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
К слову, в&amp;nbsp;Django&amp;nbsp;1.4 этот &lt;a href="https://docs.djangoproject.com/en/dev/internals/deprecation/#id1"&gt;список&lt;/a&gt; довольно большой.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Один вариант решения это «Забить!» и вставить в manage.py пару строчек:&lt;br /&gt;
&lt;pre&gt;&lt;code class="python"&gt;import warnings
warnings.filterwarnings('ignore', category=DeprecationWarning)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
Другой — это заменить в строке выше 'ignore' на 'error' и попробовать исправить все ошибки.&amp;nbsp;«ADMIN_MEDIA_PREFIX» и «supports_inactive_user» решаются довольно быстро, а вот с шаблонными «url» тегами придётся повозиться:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Добавить в шаблон тег «&lt;code class="django"&gt;{% load url from future %}&lt;/code&gt;».&lt;/li&gt;
&lt;li&gt;Обновить теги ссылок например «&lt;code class="django"&gt;{% url myapp:view-name arg arg2 as the_url %}&lt;/code&gt;» должно стать «&lt;code class="django"&gt;{% url 'myapp:view-name' arg arg2 as the_url %}&lt;/code&gt;».&lt;/li&gt;
&lt;/ul&gt;
При мысле о том, что нужно бегать по всем шаблонам и ручками добавлять кавычки и «load» теги, становится как-то дурно и хочется воспользоваться вариантом&amp;nbsp;«Забить!»,&lt;strike&gt; что я и сделал&lt;/strike&gt;. Но дабы упростить себе жизнь я написал небольшой &lt;a href="https://github.com/futurecolors/django-future-url"&gt;скрипт&lt;/a&gt;, который делает это автоматически.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Работает очень просто:&lt;br /&gt;
1.&amp;nbsp;&lt;a href="https://github.com/futurecolors/django-future-url#installation"&gt;Ставим&lt;/a&gt; пакет.&lt;br /&gt;
2.&amp;nbsp;Заходим в папку с django проектом.&lt;br /&gt;
3.&amp;nbsp;Для начала запускаем скрипт с ключом «--dry-run»: &lt;code class="bash"&gt;django-make-future-url.py&amp;nbsp;--dry-run.&lt;/code&gt;&lt;br /&gt;
4.&amp;nbsp;Внимательно смотрим что на что заменяется.&lt;br /&gt;
5.&amp;nbsp;Обновляем файлы по-настоящему:&amp;nbsp;&lt;code class="bash"&gt;django-make-future-url.py&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь во всех *.html, *.txt файлах правильные «url» теги.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-3145642958798319083?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/bn834NQbKIM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/bn834NQbKIM/django-14.html</link><author>noreply@blogger.com (Виталий Олевинский)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/django-14.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-1359124923073400629</guid><pubDate>Wed, 09 May 2012 16:58:00 +0000</pubDate><atom:updated>2012-05-10T10:01:25.382+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Яндекс</category><category domain="http://www.blogger.com/atom/ns#">События</category><title>Киевомайский Яндексосубботник</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;img border="0" height="426" src="http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash2/149357_217663925011947_100003050228257_334520_1440750368_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
Наш специальный корреспондент Роман (то есть я), заблаговременно отправив заявку на участие в ежегодном майском &lt;a href="http://events.yandex.ru/public/subbotnik/"&gt;Яндекс.Суботнике&lt;/a&gt;, оказался в числе приглашённых на эту замечательную конференцию для веб-технологов. Судя по уровню проведения - совсем недалеко от нашумевшей в прошлом году московской &lt;a href="http://events.yandex.ru/public/yac/"&gt;YaC&lt;/a&gt; (там я тоже имел честь побывать). &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Посудите сами: арендован конференц-зал в шикарном пятизвёздочном отеле "Опера", в центре Киева...&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash4/383426_217665545011785_100003050228257_334570_514771366_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;img border="0" height="426" src="http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash3/543515_217663835011956_100003050228257_334518_1411103699_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
...4 кофе-брейка и лёгкий обед...&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash3/577595_217663661678640_100003050228257_334513_1566930965_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
...11 докладов от сотрудников Яндекса, в основном про БЭМ/фронтенд; большое-пребольшое количество людей в зале, несколько большее, чем предполагали организаторы, поэтому многим пришлось слушать доклады стоя, у входа в зал. И это несмотря на то, что с отеля выжали все стулья :)&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash3/536520_217664185011921_100003050228257_334527_25319029_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style="text-align: left;"&gt;Открытие &lt;/h2&gt;Начинать конференцию с кофе и плюшек - это хорошая традиция, особенно когда действие начинается с самого утра и без кофе ну никак не проснуться. Стол регистрации начал свою работу точно по расписанию, в 9:30&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a1.sphotos.ak.fbcdn.net/hphotos-ak-snc7/581307_217663971678609_100003050228257_334521_1301247136_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
...и уже через 15 минут большая часть сидячих мест в зале была занята. Я не знаю на что рассчитывал Яндекс, пригласив такое количество людей. Видимо, на то, что часть не придёт... а зря :) Сама церемония открытия длилась недолго, нам представили всех докладчиков, докладчики представились нам лично. Всё быстро, чётко, отработано, без заминок.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash2/33960_217663711678635_100003050228257_334515_1342826175_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;img border="0" height="426" src="http://a8.sphotos.ak.fbcdn.net/hphotos-ak-snc7/574811_217664118345261_100003050228257_334524_1754357856_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;img border="0" src="http://a2.sphotos.ak.fbcdn.net/hphotos-ak-ash4/401574_217664591678547_100003050228257_334544_1997032227_n.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style="text-align: left;"&gt;Первая секция&lt;/h2&gt;Первые два доклада оказались практически развлекательного характера. Очаровательная Ольга Онойко поведала залу об асессорах Яндекса, благодаря чему я узнал, что существует такая профессия как "асессор" и что есть специально надрессированные люди, которые особым образом обучают нейронную сеть собственного поискового движка.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a1.sphotos.ak.fbcdn.net/hphotos-ak-ash3/562018_217664458345227_100003050228257_334540_366645675_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
Было безумно интересно и вопросов осталось больше, чем ответов. Подпортили веру в человечество только вопросы из зала. У сеошников заблестели глаза от возможности приоткрыть завесу тайны алгоритма релевантности в Яндексе. Увы, недалёкие сеошники так и не поняли, что асессоры не имеют никакого отношения к порядку поисковой выдачи. Никто не может гарантировать именно порядок выдачи, можно лишь скорректировать решения нейронной сети, вручную, на базе целого набора критериев. Ольга неоднократно повторила это во время доклада и, тем не менее, десяток вопросов из зала был про или около сео. Ну дурынды, что с них взять?..&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash3/525484_217664551678551_100003050228257_334542_429701703_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;(человек на фото - представитель касты "вопрошающих", здесь только для иллюстрации)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
А вот доклад "Дизайнер в поиске" от Анастасии Ларкиной, увы, ни о чём. Да, интересно наблюдать эволюцию дизайна специальных интерактивных сниппетов, будь то карта, или организация, или пробки, но совершенно никаких полезных знаний доклад в себе не несёт. Типа "вот так когда-то было, а вот так теперь стало + добавилась новая сущность!" Круто, круто, круто...&lt;br /&gt;
&lt;br /&gt;
Сидим, слушаем дальше. Александр Зинчук, с повестью о новом API Яндекс.Карт, открыл череду технологических докладов, заодно немного оживив публику. Ничего такого, чего нельзя было бы узнать из документации, увы, не проскочило. Хотя узнать от первоисточника каковы были основные мотивы того или иного архитектурного решения и как происходит процесс разработки - безусловно бесценная информация.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash4/383467_217664698345203_100003050228257_334548_731774069_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;img border="0" height="426" src="http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash3/535357_217664718345201_100003050228257_334549_1124123095_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
Нам, кстати, пообещали, что в этом году будут англоязычные тайлы карт не только Турции, как сейчас, но и всего СНГ... хотя к Евро 2012 точно не успеют. Поэтому геосервисы для иностранцев на Яндекс.Картах лучше пока не делать.&lt;br /&gt;
&lt;br /&gt;
Небольшой перерыв, пьём кофе, разминаемся.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash3/548483_217664835011856_100003050228257_334552_1496028977_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;img border="0" height="426" src="http://a7.sphotos.ak.fbcdn.net/hphotos-ak-prn1/524189_217665215011818_100003050228257_334562_1931122789_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style="text-align: left;"&gt;Вторая секция &lt;/h2&gt;Переходим к следующему докладу "Используем git без проблем" от Сергея Сергеева, для "сомневающихся svn-щиков". Если вы уже используете  git, то доклад можно не смотреть, ничего нового не узнаете. Несколько рекомендаций общего  характера можно, конечно, вынести и здесь. Например, про использование  cherry-pick только для тех веток, которые вы гарантированно не будете в  будущем merge`ить с другими.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" src="http://a1.sphotos.ak.fbcdn.net/hphotos-ak-snc6/148792_217665241678482_100003050228257_334563_558169206_n.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
Известный факт, что у Яндекса много сложного клиент-сайда и наверняка существуют какие-то гайдлайны по написанию JS-кода, возможно какие-то внутренние стандарты... Так я думал, пока Дмитрий Щадей не выступил с докладом о jsLint. Это широко извеcтный JavaScript code quality tool, главная задача которого - автоматическое обнаружение анти-паттернов и различного рода вольностей, которые часто позволяют себе разработчики и которые ухудшают читабельность и усложняют отладку кода. Так вот оказалось, что jsLint и есть той самой "совестью" и широко применяется внутри Яндекса в качестве кнута для веб-технологов. Нет никаких описанный в вики стандартов - есть jsLint и его форк jsHint.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash4/398187_217665311678475_100003050228257_334565_716191077_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
После чего сразу два человека, Евгений Батовский и Николай Птущук, выступили с докладом "Современный станок верстальщика". Много интересной инсайдерской  информации, эволюция инструментов для мультибраузерного тестирования внутри Яндекса, от удалённых виртуалок до достаточно необычного решения на базе продуктов от Novell (виртуализация) и Microsoft (платформа). Это представляет из себя некий бандл-пакет, весом около 15 гигабайт, с  Windows 7 в качестве базовой платформы и десятками установленных в ней актуальных версий браузеров (точную цифру, увы, не помню). Этот пакет  особым образом конфигурируется и доступен любому верстальщику, его можно развернуть локально на своей рабочей машине, что позволяет вручную (!) проверять вёрстку в любой версии любого браузера: Firefox (более десятка версий), Chrome (несмотря на автообновления браузера, держат зоопарк из нескольких последних мажорных версий), Opera и IE 7/8/9. Сами инструменты разработки не стандартизированы, верстальщик в праве выбрать себе как платформу, так и редактор для повседневной работы. Обычно это Mac OS X или Windows, с редактором Sublime. Что характерно, в украинском офисе Яндекса, в Симферополе, все поголовно на "маках", в Москве же обратная ситуация - на маках единицы, обычно это Windows или Ubuntu.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash3/578950_217665355011804_100003050228257_334566_335936038_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style="text-align: left;"&gt;Обед &lt;/h2&gt;Как только кто-то из зала как бы в шутку крикнул: "Когда же нас будут кормить?!", - лишний раз дав почву для иронических хохлошуток (я сам украинец, чего уж там), армия официантов быстро организовала столики с кофе, чаем, плюшками, каким-то странным овощными ассорти, фруктами и прочим. Часть людей забаррикадировала Бобука, чтобы позадавать свои архиважные вопросы, ну или чтобы просто тупо поглазеть на звезду рунета.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash3/581509_217665115011828_100003050228257_334558_237093653_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;img border="0" height="426" src="http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash3/576353_217664405011899_100003050228257_334537_212677353_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;img border="0" src="http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash3/560439_217665171678489_28731560_n.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
Я же, перекусив, вышел на улицу продышаться и только тогда обратил внимание на фирменный автобус знаменитого футбольного клуба "Шахтёр", который стоял прямо напротив входа в отель.&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a2.sphotos.ak.fbcdn.net/hphotos-ak-ash3/546584_217663881678618_100003050228257_334519_1521650686_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
Оказалось, что "горняки" тоже приехали на Субботник, но их никто не пустил :) Вообще богатые дяденьки и тётеньки, которым "посчастливилось" в тот день снять номер в "Опере" были, мягко говоря, недовольны происходящим. Надеюсь, администрации не сильно влетело. Один из докладчиков, Александр Зинчук, даже на рояле в холле сыграл, что как бы +1 к общей интеллигентности и мирности мероприятия :)&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash2/33954_217665618345111_100003050228257_334572_1410502440_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
В общем хватит прохлаждаться, не ради халявной еды мы сюда пришли (хотя кто как). &lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a2.sphotos.ak.fbcdn.net/hphotos-ak-snc7/148973_217665645011775_100003050228257_334573_1041552643_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style="text-align: left;"&gt;Третья секция&lt;/h2&gt;Виталий Харисов - первый, нанятый в 2006-м году, сотрудник украинского офиса Яндекса в Симферополе. Сейчас он руководитель разработки в Украине и после обеденного перерыва, в рамках небольшого 15-минутного доклада, поведал несколько интересных фактов об особенностях украинского Яндекса. Оказывается, украинский Яндекс работает практически автономно и децентрализовано. Преимущественная платформа разработки - Mac (несколько человек использует Ubuntu). С Москвой происходит синхронизация по специальному, быстрому каналу. Чего я не услышал, или прослушал, - почему был выбран именно Симферополь в качестве стартовой площадки, а не, скажем, более подходящие для этого Харьков, Днепропетровск, Донецк, Киев? В целом, доклад каких-то особых откровений в себе не содержит, что, впрочем, не делает его неинтересным.&lt;br /&gt;
&lt;br /&gt;
Александру Титула-Бойченко - отдельное спасибо. Благодаря его докладу "Приложения для соцсетей", я впервые осознал целесообразность применения bem-tools. Оказывается, это действительно может иметь смысл :)&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash3/552884_217665681678438_100003050228257_334574_1559091206_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
Мне всегда казалось, что яндексовые фронтендщики - больные на всю голову шизоиды, которые хотят описать JSON`ом весь мир и которые серьёзно усложняют себе жизнь невнятным набором сборщиков, оптимизаторов и минификаторов. На самом же деле, всё кажется каким-то адом лишь на этапах описания задачи в терминах БЭМ и построении соответствующего БЭМ-дерева. Все дальнейшие модификации - это лишь правка модифицирующих JSON-файлов, и на примере создания простейшего приложения сразу для нескольких социальных сетей преимущество данного подхода стало очевидным. В общем, вместо моего пересказа, рекомендую дождаться видеозаписи и вдумчиво, без предрассудков, посмотреть её. Просветление гарантировано.&lt;br /&gt;
&lt;br /&gt;
"bem server: система сборки фронтенда" - логическое продолжение предыдущего доклада. Сергей Белов терпеливо, несмотря на постоянную зевоту в зале, рассказывал о ядре bem-tools, о том как именно работает сборщик (он же отладочный веб-сервер). Это самый гиковский доклад из всех, без пол-литра, с наскока, никак не разобраться, и чтобы не сказать какую-нибудь ерунду - рекомендую интересующимся и сочувствующим дождаться видеозаписи доклада. Сергей постарался описать процессы доступным языком, были даже вопросы из зала, а значит кто-то что-то понял. Спорный момент - возможность применения инструмента вне Яндекса, по крайней мере в том виде, в котором нам показали.&lt;br /&gt;
&lt;br /&gt;
Перерыв, кофебрейк, многие стали уходить по домам с морщинами глубокой мысли на лице, Бобук абстрагировался от происходящего в коридоре, а зал заметно поредел. &lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a2.sphotos.ak.fbcdn.net/hphotos-ak-prn1/543196_217665378345135_100003050228257_334567_2044921842_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;img border="0" height="426" src="http://a1.sphotos.ak.fbcdn.net/hphotos-ak-ash3/577329_217663778345295_100003050228257_334516_1332360014_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style="text-align: left;"&gt;Четвёртая секция&lt;/h2&gt;Да, нельзя сказать, что БЭМ - доступная каждому тема, хотя Яндекс делает всё возможное, чтобы популяризировать методологию и оправдать применение bem-tools вокруг неё. Владимир Гриненко, на примере небезызвестной Фоторамы, показал как писать декларативный объектно-ориентированный JavaScript в БЭМ-терминах с помощью i-bem.js. Честно говоря - самый бестолковый инструмент из всего семейства bem-tools, как по мне. Это уже какой-то БЭМ ради БЭМ и велосипед всех велосипедов. Всё, что нам показали можно решить средствами обычного jQuery и Backbone.js. Думаю, что i-bem.js создан как раз для того, чтобы сделать bem-стек полным и самодостаточным, в этом его суть.&lt;br /&gt;
&lt;br /&gt;
И, наконец, последний доклад для выживших, от Кира Белевича, о применении БЭМ в процессе создания сайтов под iOS/Android. В принципе, ничего нового нам не рассказали, весь процесс в деталях обрисовали два предыдущих докладчика. Модификаторы, БЭМ-дерево, сборщик - всё это мы уже видели и слышали. Сам же Кир, который наверняка хороший специалист, совершенно никудышний докладчик: нудно, вяло, неинтересно.&lt;br /&gt;
&lt;br /&gt;
Под конец вообще устали все, и слушатели в зале, и организаторы. Многим докладчикам в тот же вечер надо было ехать в аэропорт, а оттуда лететь в Симферополь, поэтому программу никто не затягивал, а Бобук предложил задать пару-тройку вопросов общего характера - и по домам. На том и разошлись.&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style="text-align: left;"&gt;Fin &lt;/h2&gt;Видно, что Яндекс уже собаку съел на организации подобных мероприятий. Всё чётко, продумано, без технических заминок. 2 камеры снимали действие на видео,&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a5.sphotos.ak.fbcdn.net/hphotos-ak-prn1/546130_217664078345265_100003050228257_334523_1489282497_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
фотограф наверняка отщёлкал немало клёвых фотографий (ждём, ждём),&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" height="426" src="http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash3/581274_217664571678549_100003050228257_334543_46632176_n.jpg" width="640" /&gt;&lt;br /&gt;
&lt;br /&gt;
работало 3 проектора, чтобы презентацию было видно из любой точки зала, девочки с микрофонами бегали по залу во время "вопросов из зала",&lt;br /&gt;
&lt;br /&gt;
&lt;img border="0" src="http://a7.sphotos.ak.fbcdn.net/hphotos-ak-snc7/398937_217664498345223_100003050228257_334541_1012965682_n.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
интересные, качественные доклады. Все докладчики охотно отвечали на любые вопросы в перерывах между секциями, никто не прятался. В общем у Яндекса, как всегда, есть чему поучиться. &lt;br /&gt;
&lt;br /&gt;
Будем надеяться, что подобные Субботники будут проходить в Киеве чаще одного раза в год. Да и Москва тут недалеко, ждём YaC 2012! :)&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Официальные видео и фото появятся в течение недели-двух, об этом я сообщу дополнительно и дополню статью соответствующими ссылками.&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-1359124923073400629?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/ZDF3KaiMWFc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/ZDF3KaiMWFc/blog-post_09.html</link><author>noreply@blogger.com (Роман Семирук)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/blog-post_09.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-2224955487483817606</guid><pubDate>Sun, 06 May 2012 19:48:00 +0000</pubDate><atom:updated>2012-05-10T10:01:06.865+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">чтиво</category><title>Чтиво на майские праздники</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;h3 style="text-align: left;"&gt;
Django&lt;/h3&gt;
&lt;div&gt;
Отец-основатель Django рассказывает о &lt;a href="http://www.holovaty.com/writing/django-github/"&gt;подводных камнях перевода крупного опенсорс-проекта с SVN на git и гитхаб&lt;/a&gt;. Будем надеяться, что у разработчиков получится поженить их развесистый workflow на Trac и гитхабовские пуллреквесты.&lt;br /&gt;&lt;br /&gt;Батарейка недели: &lt;a href="https://crate.io/packages/django-htmlmin/"&gt;django-htmlmin&lt;/a&gt;. Полагаем, все пользуются gzip-сжатием, отдавая свои странички через nginx. Чтобы ещё&amp;nbsp;сэкономить&amp;nbsp;ещё больше трафика, предлагается использовать middleware, которая автоматически будет удалять лишние пробелы и комментарии в HTML.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.robgolding.com/blog/2011/11/12/django-in-production-part-1---the-stack/"&gt;Джанго в продакшене&lt;/a&gt;, серия из 3-х статей, которая раскрывает самую недостаточно освещенную, но достаточно важную тему: как же всё-таки деплоить эти джанго-проекты.&lt;br /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;
Webdev&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Замечательный сервис &lt;a href="http://travis-ci.org/"&gt;Travis CI&lt;/a&gt;, бесплатно предоставляющий услуги continuous integration для опенсорсных проектов на куче языков, запустил в бета-режиме новую киллер-фичу. Теперь они умеют &lt;a href="http://about.travis-ci.org/blog/announcing-pull-request-support/"&gt;тестировать пулл-реквесты на гитхабе&lt;/a&gt;, это очень круто.&lt;br /&gt;&lt;br /&gt;Кстати, товарищ Дэвид Крамер из Disq.us поделился своими &lt;a href="http://justcramer.com/2012/05/03/using-travis-ci/"&gt;best practices по использованию Travic CI и Python (и Django)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;
Конференции&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
На этой неделе в Киеве прошёл &lt;a href="http://events.yandex.ru/public/subbotnik/"&gt;Яндекс.Субботник&lt;/a&gt;, собравший полный зал участников. Впечатлениями по ходу дела в твитере делился наш &lt;a href="http://twitter.com/semirook"&gt;Рома Семирук&lt;/a&gt;. Кто не успел поучаствовать или посмотреть прямой эфир ждут видеозаписей, а &lt;a href="http://events.yandex.ru/public/subbotnik/theses.xml"&gt;слайды уже доступны&lt;/a&gt;. Немного &lt;a href="http://www.facebook.com/media/set/?set=a.217663088345364.40420.100003050228257&amp;amp;type=1"&gt;фоток&lt;/a&gt; (фейсбук).&lt;br /&gt;&lt;br /&gt;В следующий четверг, сразу после праздников, пройдёт &lt;a href="http://blog.futurecolors.ru/2012/05/django-10.html"&gt;Moscow Django Meetup №3&lt;/a&gt;. Мы с нетерпением ждём и обязательно примем участие. &lt;a href="http://moscowdjango.timepad.ru/event/24606"&gt;Записывайтесь&lt;/a&gt; и приходите, обещают клёвые доклады и хорошие условия. Не забывайте про &lt;a href="http://www.facebook.com/groups/MoscowDjango/"&gt;группу на фейсбуке&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В июне 9 числа в Москве пройдёт ежегодная конференция &lt;a href="http://devconf.ru/"&gt;DevConf&lt;/a&gt;, которая соберёт вебразработчиков &lt;a href="http://devconf.ru/offers/"&gt;всех мастей&lt;/a&gt;: php, js, python, ruby, perl и даже asp.net. Печально, но докладов в &lt;a href="http://devconf.ru/offers/python"&gt;python-секции&lt;/a&gt; кот наплакал.&lt;br /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;
Clientside&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Пол Айриш делится хорошим &lt;a href="http://paulirish.com/2012/talk-tooling-the-webapp-development-stack/"&gt;набором приложений и инструментов&lt;/a&gt; для фронтенд-разработчика.&lt;br /&gt;&lt;br /&gt;Вот ещё небольшой блиц:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;a href="http://www.adobe.com/devnet/html5/articles/unit-test-javascript-applications-with-jasmine.html?utm_source=javascriptweekly&amp;amp;utm_medium=email"&gt;Unit test JavaScript applications with Jasmine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://benalman.com/news/2012/05/multiple-var-statements-javascript/?utm_source=javascriptweekly&amp;amp;utm_medium=email"&gt;Multiple var statements in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fixiejs.com/"&gt;Fixie.js is an open source tool that automatically adds filler content to HTML documents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;Всем хороших праздников!&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-2224955487483817606?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/4D1ih-QvMUs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/4D1ih-QvMUs/blog-post.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-3903000976373162957</guid><pubDate>Fri, 04 May 2012 17:12:00 +0000</pubDate><atom:updated>2012-05-04T21:14:20.109+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">github</category><category domain="http://www.blogger.com/atom/ns#">Проекты</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">Хабрахабр</category><title>GeoIP и Django #2</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: right;"&gt;
&lt;a href="http://4.bp.blogspot.com/-IxaZr3VevwY/T6QC-LfoHWI/AAAAAAAAALs/UW1d8ZBfC3o/s1600/c388aad82a435b7dadce99c8c67dbbf5.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-IxaZr3VevwY/T6QC-LfoHWI/AAAAAAAAALs/UW1d8ZBfC3o/s1600/c388aad82a435b7dadce99c8c67dbbf5.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;Мы зарелизили django-geoip две недели назад и опубликовали эту заметку&amp;nbsp;&lt;/i&gt;&lt;i&gt;в&amp;nbsp;&lt;a href="http://habrahabr.ru/post/142347/"&gt;блоге Джанго&lt;/a&gt;&amp;nbsp;на Хабре&lt;/i&gt;&lt;i&gt;.&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Вебразработчики частенько сталкиваются с классической задачей определения местоположения пользователя по его IP-адресу. Существует множество различных решений, например на основе мировой базы Maxmind Geolite или российской IpgeoBase. Все они обладают достаточно низкуровневыми API, ну оно и понятно: на входе айпишник, на выходе страна, либо город и, если повезёт, ещё какая-нибудь полезная информация. &lt;br /&gt;
&lt;br /&gt;
У всех сайтов с GeoIP, которые мы запускали, есть общая черта: они не только нуждаются в простой геолокации, необходимо также выводить различный контент на сайте в зависимости от месторасположения пользователя. Чтобы упростить для себя эту задачу мы &lt;a href="http://django-geoip.readthedocs.org/"&gt;написали небольшую батарейку django-geoip&lt;/a&gt;, вдохновившись приложением django-ipgeobase.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;





Django-geoip&lt;/h3&gt;
Основное достоинство приложения: оно умеет автоматически определять географию пользователя и передавать её в объект request. Теперь контент на сайте, обладающий «региональностью», легко отфильтровать во views.py по значению request.location.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;





Фичи&lt;/h3&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;pip install django-geoip и ещё несколько простых шагов для установки;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://django-geoip.readthedocs.org/en/latest/index.html"&gt;подробная документация&lt;/a&gt; на ReadTheDocs;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://secure.travis-ci.org/#!/futurecolors/django-geoip"&gt;покрытие тестами&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;обновление базы management-командой;&lt;/li&gt;
&lt;li&gt;понятный API для создания «своей» модели географии в дополнение к существующим;&lt;/li&gt;
&lt;li&gt;пользователь может поменять свой регион с помощью &lt;a href="http://django-geoip.readthedocs.org/en/latest/usage.html#switching-user-s-location"&gt;вьюхи&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;интеграция с &lt;a href="http://django-hosts.readthedocs.org/en/latest/index.html"&gt;django-hosts&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;





Особенности реализации&lt;/h3&gt;
&lt;div&gt;
Приложение django-geoip поддерживает иерархию географии Страна — Область — Город, которая хранится в нормализованном виде в СУБД. Данные по диапазонам IP-адресов со связями ко всем элементам географии — в четвёртой таблице. Текущая версия работает только с данными ipgeobase.ru, это почти тысяча городов России и Украины и 150 тысяч IP-диапазонов.&lt;br /&gt;
&lt;br /&gt;
Одной из причин хранения данных в БД является потребность в создании своей модели географии, отвечающей задачам бизнес-логики. Например, в одном из проектов мы ограничиваем определение локации пользователя областями России, в другом — набором городов, в которых присутствует компания. Эта модель реализует паттерн «фасада» к иерархии географии ipgeobase, позволяя гибко настроить геолокацию под себя.&lt;br /&gt;
&lt;br /&gt;
Представим, что наш сайт имеет несколько региональных «версий», каждая из которых может содержать свой контент. При этом регион может иметь произвольное имя и, к примеру, содержать несколько областей РФ (таблица geo_location на схеме):&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://django-geoip.readthedocs.org/" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="372" src="http://4.bp.blogspot.com/-8_FOXS0VkMk/T6QDxN0EAJI/AAAAAAAAAL0/389glzUPplE/s640/e8c4487c63b9178d64e6110c96d27999.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="background-color: white; font-family: Verdana, sans-serif; font-size: 13px; line-height: 20px; text-align: left;"&gt;Вот пример того, как это настраивается и работает. Определим свою модель географии MyCustomLocation:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;&lt;code class="python"&gt;# geo/models.py
class MyCustomLocation(GeoLocationFacade):
    name = models.CharField(max_length=100)
    region = models.OneToOneField(Region, related_name='my_custom_location')
    is_default = models.BooleanField(default=False)

    @classmethod
    def get_by_ip_range(cls, ip_range):
        """ Получаем модель географии по IP-дапазону.
            В данном примере диапазон связан с регионом, тот, в свою очередь,  
      связан с нашей кастомной моделью географии
        """
        return ip_range.region.geo_location

    @classmethod
    def get_default_location(cls):
     """ Локация по-умолчанию, на случай, 
         если не смогли определить местоположение по IP"""
        return cls.objects.get(is_default=True)

    @classmethod
    def get_available_locations(cls):
        return cls.objects.all()

    class Meta:
    db_table = 'geo_location'
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Это обычная джанго-модель, дополненная тремя классметодами, реализующие “интерфейс” фасада GeoIP. Назначение каждой функции понятно из названия и докстринга. Осталось заполнить базу названиями городов и привязать их к моделям djagno-geoip.&lt;br /&gt;
&lt;br /&gt;
Прописываем в settings.py:&lt;br /&gt;
&lt;pre&gt;&lt;code class="python"&gt;GEOIP_LOCATION_MODEL = 'geo.models.MyCustomLocation'&lt;/code&gt;&lt;/pre&gt;
Добавляем middleware для автоматического определения региона:
&lt;br /&gt;
&lt;pre&gt;&lt;code class="python"&gt;MIDDLEWARE_CLASSES = (...
    'django_geoip.middleware.LocationMiddleware',
    ...
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
И вуаля: request.location теперь содержит значение нашей модели MyCustomLocation для каждого пользователя.&lt;br /&gt;
&lt;div&gt;
&lt;pre&gt;&lt;code class="python"&gt;def my_view(request):
    """ Passing location into template """
    ...
    context['location'] = request.location
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
Если пользователь не оказался ни в одном из этих городов, ему будет присвоен регион по-умолчанию (get_default_location). &lt;br /&gt;
&lt;br /&gt;
Данный подход сильно облегчает задачу создания «региональных» сайтов, отличающихся друг от друга содержимым в зависимости от месторасположения пользователя.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;



Что дальше&lt;/h3&gt;
Приложение хотя и альфа, неплохо работает у нас в продакшене (версия 0.2.2). Статус альфа намекает, что в будущем API будет меняться. Мы планируем поддерживать и развивать его дальше, в том числе реализовать определение региона не только для России, но и для &lt;a href="http://www.maxmind.com/app/geolitecity"&gt;остального&lt;/a&gt; &lt;a href="http://habrahabr.ru/post/135596/"&gt;мира&lt;/a&gt;. Также показалось интересной идея &lt;a href="http://habrahabr.ru/post/138536/"&gt;оптимизации поиска подходящего IP-диапазона по базе&lt;/a&gt;&amp;nbsp;а также отделение механизма геолокации от кастомной модели (например, если определение страны происходит с помощью стороннего софта).&lt;br /&gt;
&lt;br /&gt;
Исходные коды доступны &lt;a href="https://github.com/futurecolors/django-geoip"&gt;на гитхабе&lt;/a&gt;, жду ваших комментариев.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-3903000976373162957?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/57YRHSb7AIw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/57YRHSb7AIw/geoip-django-2.html</link><author>noreply@blogger.com (Илья Барышев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-IxaZr3VevwY/T6QC-LfoHWI/AAAAAAAAALs/UW1d8ZBfC3o/s72-c/c388aad82a435b7dadce99c8c67dbbf5.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/geoip-django-2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-2814777158221706350</guid><pubDate>Thu, 03 May 2012 11:02:00 +0000</pubDate><atom:updated>2012-05-03T15:10:08.859+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">видео</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">Тестирование</category><title>Testing with mock (Michael Foord)</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Майкл Форд - опытный python-разработчик, автор книжки про IronPython, мейнтейнер unittest в третьей ветке питона (и unittest2, соответственно). Кроме того, он отличился, написав&amp;nbsp;&lt;a href="http://pypi.python.org/pypi/mock"&gt;замечательную библиотеку создания mock-объектов&lt;/a&gt; для тестирования с одноименным названием, о которой и пойдёт речь в рекомендуемом видео.&amp;nbsp;Mock позволяет заменять определённые части вашей программы на так называеме «объекты-пустышки» в целях тестирования.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2011-testing-with-mock-4899484"&gt;Видео (33:22)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="334" src="http://blip.tv/play/g4VigquGAAI.html?p=1" width="596"&gt;&lt;/iframe&gt;&lt;embed src="http://a.blip.tv/api.swf#g4VigquGAAI" style="display: none;" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/div&gt;
&lt;br /&gt;
Майкл рассказывает, чем mock отличается от других похожих библиотек, рассказывает чем она хороша, когда надо использовать моки, а когда от них лучше отказаться. Одна из самых важных мыслей, на мой взгляд: не тестируйте реализацию, тестируйте поведение ваших программ, это позволит сделать тесты более гибкими и менее ломкими.&lt;br /&gt;
&lt;br /&gt;
Видео с PyCon 2011, но оно по-прежнему актуально. С этого времени успела выйти версия 0.8 и даже &lt;a href="http://www.voidspace.org.uk/python/weblog/arch_d7_2012_03_24.shtml#e1237"&gt;1.0alpha&lt;/a&gt;, было принято решение включить mock в стандартную библиотеку python 3.3 в пространстве имён unittest.&lt;br /&gt;
&lt;br /&gt;
Кроме того при написании заметки обнаружилась небольшая серия более свежих презентаций от Canonical, где трудится автор:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=d3_LdLzWSXQ"&gt;A Gentle Introduction to Mock for Python&lt;/a&gt;&amp;nbsp;(13:06)&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=ADIcwu2GeEU"&gt;Why Use Mock?&lt;/a&gt; (03:28)&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=yFA-FFaEZPo"&gt;Mock and Django&lt;/a&gt;&amp;nbsp;(38:24)&lt;br /&gt;
&lt;br /&gt;
На первый взгляд не менее интересные, чем исходное видео.&lt;br /&gt;
&lt;br /&gt;
P.S. Если не любите английский - есть неплохая &lt;a href="http://habrahabr.ru/post/141209/"&gt;статья на хабре&lt;/a&gt; с обзором возможностей mock.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-2814777158221706350?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/1-gcSVo_QlE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/1-gcSVo_QlE/testing-with-mock-michael-foord.html</link><author>noreply@blogger.com (Илья Барышев)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/testing-with-mock-michael-foord.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-4546432452807879851</guid><pubDate>Wed, 02 May 2012 14:36:00 +0000</pubDate><atom:updated>2012-05-03T15:09:35.944+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">События</category><category domain="http://www.blogger.com/atom/ns#">MoscowDjango Meetup</category><title>Третья московская встреча Django разработчиков 10 мая</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-CWDJH59t2sM/T3BTMqqYYNI/AAAAAAAAAJk/FYlgmN8AMO4/s1600/moscow_django.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-CWDJH59t2sM/T3BTMqqYYNI/AAAAAAAAAJk/FYlgmN8AMO4/s200/moscow_django.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
3-й Московский Django Meetup&lt;/div&gt;
В московском центре дизайна «&lt;a href="http://www.modmoscow.com/contacts/"&gt;MOD Design&lt;/a&gt;»&lt;br /&gt;&lt;b&gt;&lt;a href="http://maps.yandex.ru/-/CNrCZFyE"&gt;Малый Конюшковский переулок, дом 2&lt;/a&gt;&amp;nbsp;(м. Баррикадная)&lt;br /&gt;10 мая 2012, 19:00&lt;/b&gt;&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Через неделю в Москве пройдёт очередная встреча людей, которым небезынтересен Django и Python.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style="text-align: left;"&gt;
Темы докладов&amp;nbsp;&lt;/h3&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Разработка расширяемых приложений с плагинами (20 мин)&lt;/li&gt;
&lt;li&gt;Продвинутые инструменты для работы со статикой в Django (20 мин)&lt;/li&gt;
&lt;li&gt;Class-Based Views (20 мин)&lt;/li&gt;
&lt;li&gt;Django на Android (10 мин)&lt;/li&gt;
&lt;li&gt;Производительность Django (10 мин)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;
Почему стоит сходить&lt;/h3&gt;
&lt;div&gt;
&lt;span style="text-align: left;"&gt;Наши отчёты о&amp;nbsp;&lt;/span&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/moscow-django-meetup-1.html" style="text-align: left;"&gt;первой&lt;/a&gt;&lt;span style="text-align: left;"&gt;&amp;nbsp;и &lt;/span&gt;&lt;a href="http://blog.futurecolors.ru/2012/04/moscow-django-meetup-2.html" style="text-align: left;"&gt;второй&lt;/a&gt;&lt;span style="text-align: left;"&gt;&amp;nbsp;встречах Moscow Django Meetup. Почитайте, чтобы иметь представление о том, что это такое, если не были на предыдущих митапах. В этот раз организаторы постарались учесть недостатки предыдущей встречи и обещали&amp;nbsp;&lt;/span&gt;удобную аудиторию, экран для презентаций в человеческий рост, микрофон и колонки.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Future Colors тоже там будет, подходите в перерывах - пообщаемся.&lt;/div&gt;
&lt;div&gt;
&lt;span style="text-align: left;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style="text-align: left;"&gt;
&lt;a href="http://www.facebook.com/groups/367203686641943/"&gt;Группа на facebook&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;a href="http://moscowdjango.timepad.ru/event/24606"&gt;&lt;span style="font-size: x-large;"&gt;Регистрация&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-4546432452807879851?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/cKxYAIojfUY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/cKxYAIojfUY/django-10.html</link><author>noreply@blogger.com (Илья Барышев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-CWDJH59t2sM/T3BTMqqYYNI/AAAAAAAAAJk/FYlgmN8AMO4/s72-c/moscow_django.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/05/django-10.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-4841808788056497377</guid><pubDate>Sun, 29 Apr 2012 12:22:00 +0000</pubDate><atom:updated>2012-05-03T15:10:16.789+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">чтиво</category><title>Чтиво на выходные 29 апреля - 1 мая</title><description>&lt;h3&gt;Python&lt;/h3&gt;&lt;p&gt;Django &lt;a href="https://groups.google.com/group/django-developers/browse_thread/thread/3f4685a4b779a037?pli=1"&gt;теперь&lt;/a&gt; на &lt;a href="https://github.com/django/django"&gt;гитхабе&lt;/a&gt;!&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Сравнение дизайна аналогичных продуктов на python и ruby не в пользу первых. &lt;a href="http://grokcode.com/746/dear-python-why-are-you-so-ugly/ "&gt;Dear Python, Why Are You So Ugly&lt;/a&gt;?&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Галопом по европам, &lt;a href="http://www.youtube.com/watch?v=_VyPNATTC4w"&gt;как Yandex использует Python и Django&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Client-side&lt;/h3&gt;&lt;p&gt;Презентация Вячеслава Олиянчука на тему правил хорошего тона в CSS. &lt;a href="http://vimeo.com/34212051"&gt;Причеши свой CSS&lt;/a&gt;, наконец! &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Неплохое flash/html5 &lt;a href="http://www.uploadify.com/"&gt;приложение&lt;/a&gt; для мультизагрузки файлов и &lt;a href="https://github.com/tstone/django-uploadify/wiki"&gt;Django app&lt;/a&gt; к нему.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Как &lt;a href="http://clubs.ya.ru/bem/replies.xml?item_no=1359"&gt;заставить&lt;/a&gt; динамический сайт работать по БЭМ.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://coding.smashingmagazine.com/2012/04/27/yahoos-doug-crockford-on-javascript/?utm_source=javascriptweekly&amp;utm_medium=email"&gt;Интервью&lt;/a&gt; с javascript-гуру Дагом Крокфордом.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Работаем с навигацией каретки в RIA. Надеюсь, до такого низкого уровня вам не суждено опуститься, но если вдруг захочется хардкора, то &lt;a href="http://bolinfest.com/javascript/caret-navigation.html?utm_source=javascriptweekly&amp;utm_medium=email"&gt;вперд&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Подборка &lt;a href="http://garann.github.com/template-chooser/?utm_source=javascriptweekly&amp;utm_medium=email"&gt;движков&lt;/a&gt; javascript-шаблонизации.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Разное&lt;/h3&gt;&lt;p&gt;РИФ + КИБ. Выложены &lt;a href="http://2012.russianinternetforum.ru/"&gt;видео-материалы&lt;/a&gt; конференции.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://habrahabr.ru/company/google/blog/142748/"&gt;Гугло-диск&lt;/a&gt; или dejà vu?&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;6-ти дневная неделя под &lt;a href="http://naturesoundsfor.me/"&gt;урчание котэ или шум дождя&lt;/a&gt;? &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Ну, и напоследок, &lt;a href="http://www.youtube.com/watch?v=4pj-wfHQJMA&amp;feature=player_embedded"&gt;Opera TV browser&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-4841808788056497377?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/3nV4-lngbck" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/3nV4-lngbck/29-1.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/29-1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-45156449299839075</guid><pubDate>Sat, 28 Apr 2012 08:37:00 +0000</pubDate><atom:updated>2012-04-28T12:37:53.905+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">fc.tape</category><category domain="http://www.blogger.com/atom/ns#">jquery</category><category domain="http://www.blogger.com/atom/ns#">jquery ui</category><title>fc.tape — js-библиотека для простой анимации спрайтов</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div style="margin: 0 0 1em 2em; float: right;"&gt;
&lt;img src="http://habrastorage.org/storage2/b32/e9e/074/b32e9e074c80f7298d568d5f8e33e2db.png"/&gt;
&lt;/div&gt;
&lt;p&gt;Пару недель назад нами была представлена javascript-библиотека &lt;a href="http://github.com/futurecolors/fc.tape/"&gt;&lt;strong&gt;fc.tape&lt;/strong&gt;&lt;/a&gt; (&lt;a href="http://habrahabr.ru/post/141745/"&gt;пост на Хабре&lt;/a&gt;), которая предназначена для управления анимацией спрайтов (склеенных кадров).&lt;/p&gt;

&lt;p&gt;Эта библиотека используется в наших проектах, например, в &lt;a href="http://futurecolors.ru/tnkracing/"&gt;TNK Racing Team&lt;/a&gt;. Она предоставляет low-, medium- и high level API для управления анимацией.&lt;/p&gt;

&lt;p&gt;
Для использования fc.tape вам понадобятся &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; (1.6+), &lt;a href="http://jqueryui.com/"&gt;jQuery UI&lt;/a&gt; (1.8+), компоненты Core и Widget. Создать спрайт из отдельных файлов изображений можно утилитой convert, входящей в пакет &lt;a href="http://www.imagemagick.org"&gt;ImageMagick&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;Вчера fc.tape была обновлена до версии 0.2 и вот список изменений:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;появилась новая настройка loop для управления зацикливанием анимации;&lt;/li&gt;
&lt;li&gt;для методов windTo, stepInTo и setPosition позиция, на которую нужно перейти, задаётся в форматах 15 или '30%' (параметра isRelative теперь нет);&lt;/li&gt;
&lt;li&gt;настройка gradually переименована в smooth;&lt;/li&gt;
&lt;li&gt;починена демонстрационная страница.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Посмотреть на работу виджета можно на &lt;a href="http://source.futurecolors.ru/fc.tape/"&gt;demo-странице&lt;/a&gt;. Проект хостится &lt;a href="http://github.com/futurecolors/fc.tape/"&gt;на гитхабе&lt;/a&gt;, будем рады пуллреквестам и идеям по развитию.&lt;/p&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-45156449299839075?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/xHobeyZ6b_E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/xHobeyZ6b_E/fctape-js.html</link><author>noreply@blogger.com (Артём Голиков)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/fctape-js.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-2689454574934577484</guid><pubDate>Mon, 23 Apr 2012 09:22:00 +0000</pubDate><atom:updated>2012-05-03T15:11:46.942+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Избранное</category><category domain="http://www.blogger.com/atom/ns#">Проекты</category><title>Промо-сайт крутой бритвы от Panasonic</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;

&lt;div style="float: right; margin: 0 0 10px 15px;"&gt;&lt;a href="http://5blades.panasonic.ru/"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-81G1tTCPPIM/T5UaRQZojRI/AAAAAAAAAXY/SSdqM8c54Zc/s1600/5blades.png" /&gt;&lt;/a&gt;&lt;/div&gt;

В нашем портфолио появилась ещё одна работа — &lt;a href="http://futurecolors.ru/5blades/"&gt;промо-сайт бритвы от Panasonic «5 лезвий»&lt;/a&gt;. Концепция и дизайн, а также 3D-рендеры были созданы студией &lt;a href="http://nile.ru/" target="_blank"&gt;Nile&lt;/a&gt;.

&lt;br /&gt;
&lt;br /&gt;
В этом проекте перед нами стояла задача разработать сайт, основным элементом которого является крутящаяся бритва. Её анимацию нужно было реализовать без использования Flash. Результат можно посмотреть на &lt;a href="http://5blades.panasonic.ru/"&gt;http://5blades.panasonic.ru/&lt;/a&gt;.

&lt;br /&gt;
&lt;br /&gt;
При переходе к каждой из семи технологий бритва меняет ракурс, а описание выбранной технологии появляется сбоку. У вращения бритвы есть особенность: если тянуть за саму бритву, то она воспринимает движение мыши по горизонтали, а если тянуть за ползунок на дугообразном «прогресбаре», то бритва чувствительна к движению по этой дуге. Если посетитель доведёт ползунок до промежуточного состояния, то бритва самостоятельно займёт ближайшее положение.

&lt;br /&gt;
&lt;br /&gt;
В этом проекте был использован &lt;a href="http://documentcloud.github.com/backbone/"&gt;backbone.js&lt;/a&gt;, что позволило сделать javascript-код модульным.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-2689454574934577484?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/gC6eX6EgY_s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/gC6eX6EgY_s/panasonic.html</link><author>noreply@blogger.com (Артём Голиков)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-81G1tTCPPIM/T5UaRQZojRI/AAAAAAAAAXY/SSdqM8c54Zc/s72-c/5blades.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/panasonic.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-746691351577443213</guid><pubDate>Sat, 21 Apr 2012 10:56:00 +0000</pubDate><atom:updated>2012-04-21T14:59:50.478+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">чтиво</category><title>Чтиво на выходные 21-22 апреля</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;h3&gt;Python&lt;/h3&gt;Андрей Светлов рассказал о том, что &lt;a href="http://asvetlov.blogspot.com/2012/04/importlib.html"&gt;реализация импорта в Python 3.3 переписана на чистый Питон&lt;/a&gt; и что в этом хорошего.&lt;br /&gt;
&lt;br /&gt;
Опубликованы расписания &lt;a href="https://ep2012.europython.eu/p3/schedule/ep2012/"&gt;EuroPython 2012&lt;/a&gt; и &lt;a href="http://2012.djangocon.eu/schedule/"&gt;DjangoCon Europe 2012&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Добрый самаритянин &lt;a href="http://www.facebook.com/feoktistov.mihail"&gt;Michael Feoktistov&lt;/a&gt; сделал &lt;a href="http://rghost.ru/37676315"&gt;торрент-раздачу&lt;/a&gt; всех видео с последнего PyCon US. Несмотря на то, что они &lt;a href="http://pyvideo.org/category/17/pycon-us-2012"&gt;все есть&lt;/a&gt; на YouTube, вероятно кому-то будет полезно просто выкачать их в разрешении 480p.&lt;br /&gt;
&lt;br /&gt;
Большая статья про &lt;a href="http://tratt.net/laurie/tech_articles/articles/fast_enough_vms_in_fast_enough_time"&gt;интерпретаторы, виртуальные машины и скорость выполнения кода&lt;/a&gt; (англ.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Webdev&lt;/h3&gt;Чудесный наброс  «&lt;a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/"&gt;PHP: a fractal of bad design&lt;/a&gt;» на тему почему PHP — унылое говно. Кому больше нравится на русском, есть &lt;a href="http://habrahabr.ru/post/142140/"&gt;перевод на Хабре&lt;/a&gt;. Мы, кстати, осознанно отказались от использования PHP в студии в конце 2010 года и полностью перешли на Python ;)&lt;br /&gt;
&lt;br /&gt;
Яндекс запустил &lt;a href="http://api.yandex.ru/maps/new_api.xml"&gt;новую версию API Карт&lt;/a&gt; под номером 2.0. Быстрее, красивее, не нужны API-ключи, поддержка мобильной платформы, кластеризация из коробки. 26 апреля в четверг команда Карт устраивает &lt;a href="http://ymapsapi.ya.ru/replies.xml?item_no=159"&gt;APIшник&lt;/a&gt;, где расскажет про все новинки и можно будет пообщаться с разработчиками.&lt;br /&gt;
&lt;br /&gt;
На базе LESS ребята из Twitter сделали &lt;a href="http://twitter.github.com/recess/"&gt;RECESS&lt;/a&gt; — инструмент для проверки, сжатия и компиляции кода.&lt;br /&gt;
&lt;br /&gt;
Концепт новой революционной IDE &lt;a href="http://www.kickstarter.com/projects/306316578/light-table"&gt;LightTable&lt;/a&gt; собирает деньги на Kickstarter.&lt;br /&gt;
&lt;br /&gt;
Свежий доклад от Яндекса про &lt;a href="http://clubs.ya.ru/yasubbotnik/replies.xml?item_no=315"&gt;масштабируемые javascript-приложения&lt;/a&gt; (к слову, 5-го мая в Киеве пройдёт &lt;a href="http://events.yandex.ru/public/subbotnik/schedule.xml"&gt;Яндекс.Субботник&lt;/a&gt;, ещё не поздно зарегистрироваться)&lt;br /&gt;
&lt;br /&gt;
Расставляем точки. В чём же &lt;a href="http://stackoverflow.com/questions/176264/whats-the-difference-between-a-uri-and-a-url"&gt;разница между URI и URL&lt;/a&gt;?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-746691351577443213?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/CBzFeNgB0kQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/CBzFeNgB0kQ/21-22.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/21-22.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-5123529852635438937</guid><pubDate>Thu, 19 Apr 2012 07:49:00 +0000</pubDate><atom:updated>2012-04-19T15:52:07.980+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">видео</category><category domain="http://www.blogger.com/atom/ns#">django</category><title>Django in Depth (James Bennett)</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Продолжаем новый формат и повышаем планку. На этот я предлагаю вам потратить 3 часа своей жизни ради интереснейшего доклада с PyCon US 2012 - &lt;b&gt;Django in Depth&lt;/b&gt;, это дополненная современными реалиями версия одноименного доклада с PyCon US 2010, от того же докладчика. Докладчика, к слову, зовут &lt;a href="http://www.b-list.org/about/"&gt;James Bennett&lt;/a&gt;, который помимо основной работы в Mozilla успевает быть контрибьютором и релиз-менеджером Django, да и вообще стоял у истоков его создания. Доклад, в целом, рассчитан на разработчиков с опытом, повествование построено снизу вверх, то есть с глубинных процессов внутри Django - на поверхность. И несмотря на свою длину, интересен до последней минуты.&lt;br /&gt;
&lt;br /&gt;
Обязательно к просмотру всем, кого интересует какие механизмы работают внутри Django и почему. Ну и, конечно, советы от Django-гуру не повредят вашему мастерству :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://www.youtube.com/watch?v=t_ziKY1ayCo"&gt;Видео (3 часа 5 минут)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/t_ziKY1ayCo" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
По существу, в докладе освещены такие темы:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. ORM&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;архитектура Django 1.4;&lt;/li&gt;
&lt;li&gt;как работает Django ORM, вся цепочка от database backend до model;&lt;/li&gt;
&lt;li&gt;менеджеры, кастомные QuerySet-классы;&lt;/li&gt;
&lt;li&gt;корректная работа в несколькими БД (роутинг, шардинг);&lt;/li&gt;
&lt;li&gt;трюки с переопределением методов модели .save() и .delete();&lt;/li&gt;
&lt;li&gt;абстрактные и прокси- модели;&lt;/li&gt;
&lt;li&gt;Q- и F- выражения.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;2. Формы&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;кастомные виджеты/мультивиджеты;&lt;/li&gt;
&lt;li&gt;валидаторы;&lt;/li&gt;
&lt;li&gt;динамическое создание форм;&lt;/li&gt;
&lt;li&gt;медиа-файлы.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;3. Шаблоны&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;как работает загрузчик шаблонов;&lt;/li&gt;
&lt;li&gt;low-level работы шаблонизатора;&lt;/li&gt;
&lt;li&gt;темплейт-теги и их парсер;&lt;/li&gt;
&lt;li&gt;что есть контекст на самом деле и как происходит рендеринг.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;А также:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;request/response;&lt;/li&gt;
&lt;li&gt;URL resolution;&lt;/li&gt;
&lt;li&gt;handlers;&lt;/li&gt;
&lt;li&gt;views (в том числе любимые нами class-based);&lt;/li&gt;
&lt;li&gt;middlewares;&lt;/li&gt;
&lt;li&gt;админка (оговорены некоторые возможности кастомизации, что можно и что не стоит переопределять).&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Ну и некоторые факты с доклада, для затравки:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;"Oracle is weird" (Джеймс о базе данных, неоднократно упрекнул её в "магичности");&lt;/li&gt;
&lt;li&gt;имплементация класса Query занимает 1900 строк кода, это один из самых сложных и загадочных (here be dragons) модулей во всём Django;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Query.__str__()&lt;/span&gt; возвращает скомпилированный SQL-запрос;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;QuerySet.exists()&lt;/span&gt; намного эффективней обычной булевой проверки&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;"Just don't use classmethods, use managers". Аргументы не до конца ясны, но смысл в том, что нужно описывать действия над моделью на уровне менеджера модели. Видимо потому, что менеджер имеет больше отношения к объекту типа queryset, чем classmethod и концептуально вписывается в архитектуру ORM (что тоже не аргумент, но поверим опытному дядьке). Обсуждение вопроса на 51-й минуте видео.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-5123529852635438937?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/ookp0Ev6ZEc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/ookp0Ev6ZEc/django-in-depth-james-bennett.html</link><author>noreply@blogger.com (Роман Семирук)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/t_ziKY1ayCo/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/django-in-depth-james-bennett.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-4885988192962388118</guid><pubDate>Sat, 14 Apr 2012 08:06:00 +0000</pubDate><atom:updated>2012-04-16T23:35:40.612+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">чтиво</category><title>Чтиво на выходные 14-15 апреля</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;h3 style="text-align: left;"&gt;


Django, Python&lt;/h3&gt;
&lt;div&gt;
Facebook купил Instagram за 1 млрд. $ и многие с удивлением узнали что сервис использует Django Framework. Вообще интересно почитать &lt;a href="http://instagram-engineering.tumblr.com/"&gt;про архитектуру Инстаграма в их технологическом блоге&lt;/a&gt;. И, конечно, на &lt;a href="http://www.insight-it.ru/masshtabiruemost/arkhitektura-instagram/"&gt;Insight IT&lt;/a&gt; по-русски.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;a href="http://www.python.org/news/index.html#Wed11April20121600-0500"&gt;Вышли версии Python&lt;/a&gt; 2.6.8/2.7.3/3.1.5/3.2.3 c багфиксами, в том числе закрыли нашумевшую &lt;a href="http://bugs.python.org/issue13703"&gt;дырку с атакой на хэш-таблицу&lt;/a&gt;. Обратите внимение, что &lt;a href="http://mail.python.org/pipermail/python-dev/2012-April/118676.html"&gt;фикс по-умолчанию отключён&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
На Хабре недавно появилась статья из &lt;a href="http://habrahabr.ru/post/141411/"&gt;двух&lt;/a&gt; &lt;a href="http://habrahabr.ru/post/141501/"&gt;частей&lt;/a&gt; о декораторах в Python. Таких было уже предостаточно, но эта, судя по всему, самая доходчивая. Всё, что вы хотели знать, но боялись спросить.&lt;br /&gt;
&lt;br /&gt;
Несколько русскоязычных видео-уроков по новым фичам Django 1.4. Пока доступно 3 урока, автор &lt;a href="http://softwaremaniacs.org/forum/django/42594/"&gt;обещает&lt;/a&gt; выкладывать новые раз в неделю, по использованию методов ORM &lt;a href="http://www.youtube.com/watch?v=08Gq53C4Njg"&gt;prefetch_related&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=P-8Vik7jUxM"&gt;bulk_create&lt;/a&gt; и &lt;a href="http://www.youtube.com/watch?v=SAL8n8NZfPo"&gt;админки&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Зарелизился &lt;a href="http://www.jetbrains.com/pycharm/whatsnew/"&gt;Pycharm 2.5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;


Javascript&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Мы зарелизили небольшую jQuery-библиотеку &lt;a href="http://source.futurecolors.ru/fc.tape/"&gt;fc.tape&lt;/a&gt;, с помощью которой мы анимируем спрайты: сайт гоночной команды &lt;a href="http://www.tnk-racing.ru/"&gt;ТНК&lt;/a&gt;, страница &lt;a href="http://futurecolors.ru/team/"&gt;команды&lt;/a&gt; Future Colors. &lt;a href="http://habrahabr.ru/post/141745/"&gt;Пост на Хабре&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/build-a-contacts-manager-using-backbone-js-part-1/"&gt;Раз&lt;/a&gt;, &lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/build-a-contacts-manager-using-backbone-js-part-2/"&gt;два&lt;/a&gt;, &lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/build-a-contacts-manager-using-backbone-js-part-3/"&gt;три&lt;/a&gt;, &lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/build-a-contacts-manager-using-backbone-js-part-4/"&gt;четыре&lt;/a&gt;, &lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/build-a-contacts-manager-using-backbone-js-part-5/"&gt;пять &lt;/a&gt;- на Nettuts Backbone опять.&lt;br /&gt;
&lt;br /&gt;
Быстрый &lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/getting-cozy-with-underscore-js/"&gt;вводный курс в Underscore&lt;/a&gt; - библиотеки, которая расширяет возможности функционального программирования в JS (и которая, заодно, является вечным спутником Backbone).&lt;br /&gt;
&lt;br /&gt;
И ещё раз про Backbone. Благодаря стараниям некоторых хабровчан, он, наконец, обзавёлся &lt;a href="http://backbonejs.ru/"&gt;русскоязычной документацией&lt;/a&gt;. Будем надеяться, что это немного снизит порог вхождения в технологию для тех, кому английский даётся с трудом.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;


Webdev&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://css-tricks.com/on-target/"&gt;Трюк с псевдоселектором :target&lt;/a&gt;. Позволяет динамически стилизировать блок, если его id и hash в адресной строке совпадают.&lt;br /&gt;
&lt;br /&gt;
Небольшой How To по работе с &lt;a href="http://net.tutsplus.com/tutorials/html-css-techniques/toying-with-the-html5-filesystem-api/"&gt;HTML5 File System API&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
БЭМ продолжает покорять сердца и обзаводится своими фан-клубами. Один из них разработал толковый и доступный каждому &lt;a href="http://bemclub.in/"&gt;сайт с описанием самой методологии&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Познавательная &lt;a href="http://www.slideshare.net/profyclub_ru/ss-12266758"&gt;презентация об адаптивном веб-дизайне&lt;/a&gt; от Mail.ru. Недавний редизайн главной страницы сделал её адаптивной и им точно есть что сказать по этому поводу.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;


Дизайн&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Создатели 5∞px.com сделали крутые &lt;a href="http://design.artgorbunov.ru/post/yuridicheskiy-tekst-na-5pxcom"&gt;страницы с Terms of Use&lt;/a&gt; их сервиса понятные для обычных людей, а не только с юридическим образованием. &lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;


Разное&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Теперь можно&lt;a href="http://utinet.ru/ecology/"&gt; оставить заявку на утилизацию бытовой электроники в Москве&lt;/a&gt;, вам никуда ехать не нужно — за ней приедут и заберут, бесплатно. &lt;br /&gt;
&lt;br /&gt;
Любопытное &lt;a href="http://www.omgubuntu.co.uk/2012/04/video-how-linux-is-built/"&gt;видео&lt;/a&gt; от Linux Software Foundation о том, как создаётся и где используется Linux в наши дни.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-4885988192962388118?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/ZDXjfPJyUyA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/ZDXjfPJyUyA/14-15.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/14-15.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-6138994498478893857</guid><pubDate>Thu, 12 Apr 2012 10:01:00 +0000</pubDate><atom:updated>2012-04-13T09:23:19.454+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">видео</category><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">Тестирование</category><title>Testing and Django (Carl Meyer)</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
В дополнение к &lt;a href="http://blog.futurecolors.ru/search/label/%D1%87%D1%82%D0%B8%D0%B2%D0%BE"&gt;субботней рубрике&lt;/a&gt;&amp;nbsp;попробуем новый формат: рекомендации самых интересных выступлений с PyCon, DjangoCon и других конференций. Ребята будут советовать самые любопытные и полезные на их взгляд видео, которые точно стоит посмотреть.&lt;br /&gt;
&lt;br /&gt;
Карл Майер (один из django core developers) делится своими соображениями о best practices тестирования django-приложений. Доклад рассчитан на опытную аудиторию, знакомую как с django, так и с основыми принципами тестирования.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://carljm.github.com/django-testing-slides/"&gt;Слайды&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://www.youtube.com/watch?v=ickNQcNXiS4"&gt;Видео (47:15)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/ickNQcNXiS4" width="640"&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;br /&gt;
Вот ключевые моменты доклада:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;как правильно запускать тесты django или 14 секунд из жизни, которые не вернуть;&lt;/li&gt;
&lt;li&gt;как правильно организовать обнаружение тестов (test discovery) и избавиться от беспомощных импортов в &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;tests/__init.py;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: inherit;"&gt;почему надо &lt;a href="http://carljm.github.com/django-testing-slides/#17"&gt;выделять из сложных методов модели части&lt;/a&gt;, взаимодействующие с БД в отдельные методы;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: inherit;"&gt;зачем нужен &lt;a href="https://github.com/dnerdy/factory_boy"&gt;factory_boy&lt;/a&gt; и почему нужно срочно выбросить фикстуры в помойку;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;как лучше всего юнит-тестировать вьюхи;&lt;/li&gt;
&lt;li&gt;чем &lt;a href="http://habrahabr.ru/post/91471/"&gt;WebTest&lt;/a&gt; лучше стандартного django.test.Client;&lt;/li&gt;
&lt;li&gt;когда какие типы тестов использовать (юнит, интеграционные. с использованием селениума);&lt;/li&gt;
&lt;li&gt;пара новых фич Django 1.4 в примерах (override_settings и in-browser testing);&lt;/li&gt;
&lt;li&gt;тестируем примеры из документации;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Предлагаю обсудить презентацию в комментариях.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-6138994498478893857?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/cHPRyOD566A" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/cHPRyOD566A/testing-and-django-carl-meyer.html</link><author>noreply@blogger.com (Илья Барышев)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/ickNQcNXiS4/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/testing-and-django-carl-meyer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-8703585828912879945</guid><pubDate>Sun, 08 Apr 2012 16:58:00 +0000</pubDate><atom:updated>2012-04-08T22:52:49.825+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">События</category><category domain="http://www.blogger.com/atom/ns#">MoscowDjango Meetup</category><title>Moscow Django Meetup #2</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://4.bp.blogspot.com/-9ZtGTXYXWNc/T4G2m1GC3UI/AAAAAAAAAEA/IT_Wl5cJbOM/s640/IMG_2222.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;Предисловие&lt;/h3&gt;&lt;br /&gt;
MoscowDjango #2 прошёл 5-го апреля, через 5 дней после &lt;a href="http://habrahabr.ru/post/141208/"&gt;KyivPy #6&lt;/a&gt;, на котором я также имел честь побывать. Тот факт, что с докладом выступит мой коллега Илья Барышев (&lt;a href="https://twitter.com/#%21/coagulant"&gt;@coagulant&lt;/a&gt;) лишний раз подогревал интерес к событию. И после рабочего дня мы всей командой поехали по указанному в &lt;a href="http://moscowdjango.timepad.ru/event/21169"&gt;анонсе&lt;/a&gt; адресу. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Критиковать может каждый и я, конечно, понимаю, что организовать встречу, найти докладчиков, договориться о помещении - это труд и спасибо организаторам за то, что они делают то, что делают. Столь бурный рост локального сообщества восхищает. К сожалению, у меня не получилось попасть на премьерный, &lt;a href="http://blog.futurecolors.ru/2012/03/moscow-django-meetup-1.html"&gt;первый MoscowDjango&lt;/a&gt;, но говорят, что на втором митапе людей было как минимум в два раза больше, чем на первом. Не менее 60 человек. Уже этот факт говорит о том, что московским питонистам-джанговодам интересно собираться для общения и обмена опытом, для полезных знакомств и просто приятной тусовки. Дай волю - собирались бы каждую неделю :)&lt;br /&gt;
&lt;br /&gt;
Но. Мне начинает казаться, что есть определённый набор косяков, которые обязательны на всех конференциях такого уровня. Как всегда нет карты проезда, слава навигаторам. Но даже они не решают проблему КПП и парковки. Как всегда ни единого указателя или вывески. Сделать переносную стойку с плакатом и поставить её у входа в здание - это несложно. Там же можно было бы разместить официальный хештег мероприятия (я не верю, что за всё время митапа было так мало твитов, вероятно твитили с разными хештегами).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://4.bp.blogspot.com/-XDXY6zfS1QI/T4G2zUiKIbI/AAAAAAAAAFk/PSe4ExCm-MA/s640/IMG_2297.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Забегая чуть вперёд скажу, что докладчики не переключали слайды самостоятельно и вместо них это  делал один из организаторов - Валентин Домбровский. Я лично не понял в чём профит, стоит или придумать что-то с пультом, или дать возможность подключать к проектору свой ноутбук и выступать за стойкой. Зато не забыли про вай-фай, вот за это отдельное спасибо. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-ZtLkMjKUQ1U/T4G2okFJPKI/AAAAAAAAAEM/Yo2_jy2nQ1A/s640/IMG_2228.jpg" width="640" /&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="color: black; font-family: inherit;"&gt;(как бы следим за твит-лентой) &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Хоть мы и приехали вовремя, зал был уже практически забит  под завязку и нам пришлось разместиться на галёрке. Оттуда, к слову, нихрена не было видно на слайдах.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="425" src="http://1.bp.blogspot.com/-81xWmf8IHpQ/T4G2rNxyfRI/AAAAAAAAAEc/qR10MOiH4-g/s640/IMG_2234.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
На заметку докладчикам - используйте крупные заголовки, гротескные шрифты и делайте слайды монохромными. Помимо того, что было плохо видно, некоторых докладчиков было неважно слышно. Микрофона в зале, увы, не оказалось. В итоге полностью в теме были только люди с первых рядов. Я надеюсь, что видеозапись, которая вот-вот должна появиться, и слайды позволят просмотреть всё ещё раз, с толком и расстановкой.&lt;br /&gt;
&lt;br /&gt;
Первый доклад "&lt;a href="http://digitaldemiurge.ru/slides/templates"&gt;Шаблоны проектов на основе PasteScript и Django 1.4&lt;/a&gt;" - это как раз тот случай, когда интересная тема доклада утонула в плохих слайдах и тихом голосе докладчика. Я не услышал и не увидел практически ничего. Если кто-то сидел ближе и всё слышал - отпишитесь, пожалуйста, в комментариях что вы вынесли с доклада.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-xyE9ByVyTY0/T4G2n_iS05I/AAAAAAAAAEE/gLZSW3rL4zE/s640/IMG_2224.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
Одного из докладчиков не оказалось на месте, поэтому произошёл сдвиг в программе митапа и для нашего Ильи освободилось время (а ты переживал), благодаря чему на доклад "&lt;a href="http://www.slideshare.net/Coagulant/django-14"&gt;Что нового в Django 1.4&lt;/a&gt;" было столько времени, сколько нужно. Сама тема была интересна, несмотря на то, что Django 1.4 мы используем ещё с ранней альфы. Оказалось, что я ничего не знаю про assignment-теги и про таймзоны. Теперь знаю :) Напомню, что приквелом этого доклада был недавний &lt;a href="http://blog.futurecolors.ru/2012/04/django-14.html"&gt;цикл статей о Django 1.4&lt;/a&gt; в нашем блоге. Никогда не поздно почитать, если вы этого ещё не сделали.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-jPuoOLYN_N4/T4G2srPGxbI/AAAAAAAAAEs/br3KS3lC6L8/s640/IMG_2243.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://1.bp.blogspot.com/-twUmM85cOTQ/T4G2tQYvqjI/AAAAAAAAAE4/Roy8Ncf-yYM/s640/IMG_2250.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
Доклад "&lt;a href="http://braintrace.ru/talks/djmeetup.html#slide1"&gt;Django + SQLAlchemy&lt;/a&gt;" вызвал самую неоднозначную реакцию зала. Холиварная, сама по себе, тема подтолкнула зал к общению и процесс было уже не остановить.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-ja6VndVSUDw/T4G21m63_VI/AAAAAAAAAFw/KflPZNYbjH0/s640/IMG_2313.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-4R1-nWZUbMk/T4G207ImI6I/AAAAAAAAAFo/E3oeOO7xHbU/s640/IMG_2310.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
Диалог между зрителями продолжался дольше и был местами интереснее самого доклада.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://4.bp.blogspot.com/-oQ_xPr00xwM/T4G238IztbI/AAAAAAAAAGA/P1F6yuAp6HM/s640/IMG_2319.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
В любом случае лично я так и не понял в чём конкретно состоит преимущество "алхимии" над Django ORM, какие задачи она решает лучше, работает ли быстрее, в общем больше вопросов, чем ответов. Наверное это и хорошо, есть желание разобраться в теме. Я также не понял почему слайды были на английском, а доклад на русском. По-моему это странно и слайдов не так уж и много, чтобы их нельзя было перевести.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://1.bp.blogspot.com/-FC0DhGyxoMw/T4G2xEupaGI/AAAAAAAAAFM/7CWfiZfMePU/s640/IMG_2283.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
А последняя тема "&lt;a href="http://www.slideshare.net/MoscowDjango/deploy"&gt;Простой и удобный деплоймент проекта&lt;/a&gt;" получает приз как "самая нераскрытая тема митапа". Фактически весь доклад можно уместить в одно приложение: "есть fabric и git, с помощью которых можно и нужно деплоить проекты". Ни примера типового решения, ни best practices. Совсем начинающие не поймут проблемы, а тем, кто уже использует этот стек и эти решения было неинтересно слушать столь очевидные вещи. Но на некоторых лицах было заметно лёгкое удивление во время рассказа о Fabric, поэтому наверняка найдутся люди, которые вынесли для себя что-то и с этого доклада.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-4-q8zeWnH-M/T4G27xQE5rI/AAAAAAAAAGg/trjyBHQLu78/s640/IMG_2329.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
В конце официальной части мероприятия, нам сообщили немного "инсайдерской" информации по поводу дальнейших планов развития MoscowDjango.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-fSHrj-Nfhgc/T4G2-C9wlFI/AAAAAAAAAG0/ew_YfnHVqUI/s640/IMG_2345.jpg" width="426" /&gt;&lt;/div&gt;&lt;br /&gt;
Интересно, что организацию 3-го митапа не откладывают в долгий ящик и вполне возможно, что он пройдёт в ближайший месяц-полтора. Также есть вероятность того, что небольшие спринты будут проходить ещё чаще. Сейчас в &lt;a href="http://www.facebook.com/groups/MoscowDjango/"&gt;группе на Facebook&lt;/a&gt; проходит голосование "как часто стоит собираться". Это моё личное мнение, но если конференция будет проходить слишком часто, тогда событие перестанет быть ожидаемым, а на подготовку толковых докладов будет просто мало времени. Из зала поступило толковое предложение собираться почаще для совместного кодинга. Правда, было бы круто совмещать теорию с практикой, надеюсь организаторы придумают формат и для таких встреч.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-bcvlEa659cM/T4G25ki5fmI/AAAAAAAAAGQ/a-bq5VysF70/s640/IMG_2325.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
В чём прелесть любой конференции - так это в свободном общении. Четверг, конечно, не самый удачный выбор для подобных мероприятий, потому-что пятница это всё ещё рабочий день, а хочется пообщаться подольше в неформальной обстановке и никуда не спешить.&lt;br /&gt;
&lt;br /&gt;
В коридоре мы встретили наших друзей из Яндекса и проговорили с ними не менее часа.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-1xbgRu8oRIE/T4G2-92v2wI/AAAAAAAAAG8/T64miU50VO8/s640/IMG_2349.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
Никто не спешил уходить, но, к сожалению, время поджимало и ни о какой автопати не было и речи. Да и вблизи здания не было замечено ни одного кафе или ресторана. Не страшно, наверстаем упущенное общение на следующих встречах :)&lt;br /&gt;
&lt;br /&gt;
Спасибо всем, кто пришёл. Благодаря вам митап состоялся. Спасибо докладчикам за то, что они создали повод прийти. И отдельное спасибо организаторам за то, то взяли на себя это бремя :)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;img border="0" height="426" src="http://4.bp.blogspot.com/-Zg7kUufPuRE/T4G2vR2NaSI/AAAAAAAAAFI/xJn-aSwVKqU/s640/IMG_2279.jpg" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;
До следующего MoscowDjango! Следите за активностью в &lt;a href="http://www.facebook.com/groups/MoscowDjango/"&gt;группе на Facebook&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Резюме&lt;/h3&gt;&lt;br /&gt;
&lt;a href="http://www.facebook.com/DigitalDemiurge"&gt;Vitaliy Korobkin&lt;/a&gt;. Шаблоны проектов на основе PasteScript и Django 1.4: &lt;a href="http://digitaldemiurge.ru/slides/templates"&gt;http://digitaldemiurge.ru/slides/templates&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.facebook.com/profile.php?id=100000764232977"&gt;Илья Барышев&lt;/a&gt; Что нового в Django 1.4: &lt;a href="http://www.slideshare.net/Coagulant/django-14"&gt;http://www.slideshare.net/Coagulant/django-14&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.facebook.com/andrey.popp"&gt;Андрей Попп&lt;/a&gt;. Django + SQLAlchemy: &lt;a href="http://braintrace.ru/talks/djmeetup.html#slide1"&gt;http://braintrace.ru/talks/djmeetup.html#slide1&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.facebook.com/korneevm"&gt;Михаил Корнеев&lt;/a&gt;. Простой и удобный деплоймент проекта: &lt;a href="http://www.slideshare.net/MoscowDjango/deploy"&gt;http://www.slideshare.net/MoscowDjango/deploy&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Бонусы&lt;/h4&gt;&lt;br /&gt;
&lt;a href="http://www.facebook.com/media/set/?set=oa.405073566188288&amp;amp;type=1"&gt;Ещё фотографии&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://docs.google.com/spreadsheet/viewform?formkey=dDh5T2JsLW9kdXlZbWNrZDlrVzZVZXc6MA"&gt;Анкета-опросник&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-8703585828912879945?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/fDNN3sXv6yU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/fDNN3sXv6yU/moscow-django-meetup-2.html</link><author>noreply@blogger.com (Роман Семирук)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-9ZtGTXYXWNc/T4G2m1GC3UI/AAAAAAAAAEA/IT_Wl5cJbOM/s72-c/IMG_2222.jpg" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Москва, Россия</georss:featurename><georss:point>55.7427928 37.6154009</georss:point><georss:box>55.4567773 36.983686899999995 56.028808299999994 38.2471149</georss:box><feedburner:origLink>http://blog.futurecolors.ru/2012/04/moscow-django-meetup-2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-8191994865486761320</guid><pubDate>Sat, 07 Apr 2012 17:07:00 +0000</pubDate><atom:updated>2012-04-08T22:27:32.635+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">чтиво</category><title>Чтиво на выходные 7-8 апреля</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;h3 style="text-align: left;"&gt;

&lt;span style="text-align: left;"&gt;Django&lt;/span&gt;&lt;/h3&gt;
Якоб Каплан-Мосс делится своим видением, как может быть &lt;a href="https://gist.github.com/2245327"&gt;улучшен auth.User&lt;/a&gt;, скорее всего в Django 1.5 будет улучшена модель пользователя.&lt;br /&gt;
&lt;br /&gt;
Батарейка &lt;a href="https://github.com/playpauseandstop/tddspry"&gt;tddspry&lt;/a&gt;, расширяющая возможности тестирования Django-проектов с помощью nose и twill. Представляет собой набор различных хелперов и тест-кейсов, и позволяет, например, осуществлять автоматический поиск тестов по всему проекту (не обязательно складывать их в папку test внутри приложения), использует twill вместо django.test.Client и умеет делать некоторые другие, не менее полезные в тестировании вещи.&lt;br /&gt;
&lt;br /&gt;
Набор полезных Mixin’ов &lt;a href="http://brack3t.com/our-custom-mixins.html"&gt;Braces&lt;/a&gt; для class-based views для Django 1.3+&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;

Webdev&lt;/h3&gt;
&lt;a href="https://github.com/kennethreitz/legit"&gt;Legit&lt;/a&gt; - «Git с человеческим лицом», надстройка над git, добавляющая кучу полезных комманд, облегчающих ежедневную рутину. Например:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
sync [&amp;lt;branch&amp;gt;]&lt;br /&gt;
Syncronizes the given branch. Defaults to current branch. Stash, Fetch, Auto-Merge/Rebase, Push, and Unstash. You can only sync published branches.&lt;/blockquote&gt;
&lt;div style="text-align: left;"&gt;
Правильное&amp;nbsp;&lt;a href="http://evanmiller.org/how-not-to-sort-by-average-rating.html"&gt;вычисление рейтинга продукта&lt;/a&gt;&amp;nbsp;на основе данных пользовательского голосования. Может показаться странным, но индекс популярности != (количество положительных оценок) - (количество негативных оценок).&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style="text-align: left;"&gt;

Javascript&lt;/h3&gt;
&lt;a href="http://ricostacruz.com/backbone-patterns/"&gt;Backbone patterns&lt;/a&gt;, как видно из названия, коллекция паттернов, рекоммендаций и соглашений по использованию Backbone.js.&lt;br /&gt;
&lt;br /&gt;
Одним велосипедом меньше - гибкий и функциональный &lt;a href="http://addyosmani.github.com/backbone.paginator/"&gt;пагинатор для Backbone.js&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Каждый четверг яндексоиды делятся своими&amp;nbsp;&lt;a href="http://clubs.ya.ru/ui/"&gt;наборами ссылочек про вёрстку, js и дизайн&lt;/a&gt;, не пропускайте.&lt;br /&gt;
&lt;br /&gt;
Консоль для CofeeScript под Хром: &lt;a href="http://snook.ca/archives/browsers/coffeeconsole"&gt;&lt;span id="goog_1101320596"&gt;&lt;/span&gt;CoffeeConsole&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;a href="http://www.blogger.com/"&gt;&lt;span id="goog_1101320597"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;

Администрирование&lt;/h3&gt;
Очень толковый &lt;a href="http://tav.espians.com/fabric-python-with-cleaner-api-and-parallel-deployment-support.html"&gt;набор рецептов&lt;/a&gt; и best practices для &lt;a href="http://docs.fabfile.org/"&gt;Fabric&lt;/a&gt;, популярного инструмента автоматизации деплоя (и не только) ваших проектов.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;

Досуг&lt;/h3&gt;
Fallout 1 раздают бесплатно в течении 48-ми часов, до 8 апреля 20:00 (по Москве) &lt;a href="http://www.gog.com/en/gamecard/fallout"&gt;http://www.gog.com/en/gamecard/fallout&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-8191994865486761320?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/FPu6Jue0xCM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/FPu6Jue0xCM/7-8.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/7-8.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-899009267819173656</guid><pubDate>Thu, 05 Apr 2012 20:43:00 +0000</pubDate><atom:updated>2012-04-08T22:29:01.675+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Избранное</category><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">Django Days</category><title>Что нового в Django 1.4</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;script async="" class="speakerdeck-embed" data-id="4f7e958fe711f600220029a0" data-ratio="1.3333333333333333" src="//speakerdeck.com/assets/embed.js"&gt;
&lt;/script&gt;
&lt;br /&gt;
Моя презентация с прошедшего 5 апреля Django Meetup #2.&lt;br /&gt;
Она подводит итог под серией &lt;a href="http://blog.futurecolors.ru/search/label/Django%20Days"&gt;Django Days&lt;/a&gt;, вот список&amp;nbsp;всех&amp;nbsp;постов:&lt;br /&gt;
&lt;br /&gt;
&lt;h2 dir="ltr"&gt;


&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 19px; white-space: pre-wrap;"&gt;Django days или обзор новинок Django 1.4&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol style="font-weight: bold;"&gt;
&lt;li style="font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/django-14-day-1-orm.html"&gt;ORM&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/django-14-day-2.html"&gt;Безопасность и Формы&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/django-14-day-1.html"&gt;Тестирование&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/django-14-day-4.html"&gt;Админка&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;"&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/django-14-day-5.html"&gt;Структура проекта&lt;/a&gt;&amp;nbsp;(manage.py)&lt;/li&gt;
&lt;li style="font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;"&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/django-14-day-6.html"&gt;Структура проекта&lt;/a&gt;&amp;nbsp;(свои шаблоны)&lt;/li&gt;
&lt;li style="font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/django-14-day-7-templates.html"&gt;Шаблоны&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="font-family: Arial; font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;"&gt;&lt;span style="vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="http://blog.futurecolors.ru/2012/03/django-14-day-8-timezones.html"&gt;Таймзоны&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-899009267819173656?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/lvwhywDUqq4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/lvwhywDUqq4/django-14.html</link><author>noreply@blogger.com (Илья Барышев)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/django-14.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-1581244456541211925</guid><pubDate>Wed, 04 Apr 2012 15:47:00 +0000</pubDate><atom:updated>2012-04-04T20:11:35.757+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">вёрстка</category><category domain="http://www.blogger.com/atom/ns#">ZenCoding</category><title>Воскресшая вёрстка</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Случалось ли вам поддерживать вёрстку, которая уже прошла этап оживления? Если да, то наверняка возникало желание посмотреть, какой она была первоначально, до оживления. Мы практикуем такой метод:&lt;br /&gt;
&lt;br /&gt;
В комментарии к вёрстке блока, в css-файле, прописывается не только название блока, но и его разметка в формате &lt;a href="http://code.google.com/p/zen-coding/"&gt;ZenCoding&lt;/a&gt;. Если вам потребовалась разметка, просто скопируйте строчку и преобразуйте её в HTML (например, в PyCharm'е ZenCoding поддерживается из коробки).&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="css"&gt;/**
&amp;nbsp;* @section&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Элемент списка
&amp;nbsp;* article.item.js-item&amp;gt;((header.item__header&amp;gt;((div.item__image&amp;gt;img)+(span.item__favorite&amp;gt;span.favorite)+(h1.item__title&amp;gt;a)+div.item__subtitle))+(div.item__expand&amp;gt;span.item__expand-icon.js-item__expand)+section.item__content.js-item__content)
&amp;nbsp;*/

.item {...}
.item__header {...}
.item__image {...}
.item__favorite {...}
.item__title {...}
.item__subtitle {...}
.item__expand {...}
.item__expand-icon {...}
.item__content {...}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Вот так в данном примере будет выглядеть разметка:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;article class="item js-item"&amp;gt;
    &amp;lt;header class="item__header"&amp;gt;
        &amp;lt;div class="item__image"&amp;gt;&amp;lt;img src="" alt=""&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;span class="item__favorite"&amp;gt;&amp;lt;span class="favorite"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;h1 class="item__title"&amp;gt;&amp;lt;a href=""&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;div class="item__subtitle"&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;div class="item__expand"&amp;gt;
        &amp;lt;span class="item__expand-icon js-item__expand"&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;section class="item__content js-item__content"&amp;gt;&amp;lt;/section&amp;gt;
&amp;lt;/article&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-1581244456541211925?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/tOX8wemeQ7g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/tOX8wemeQ7g/blog-post.html</link><author>noreply@blogger.com (Артём Голиков)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/04/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-8371571823352996467</guid><pubDate>Sat, 31 Mar 2012 11:24:00 +0000</pubDate><atom:updated>2012-04-08T22:27:44.441+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">чтиво</category><title>Чтиво на выходные 31 марта - 1 апреля</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;h3 style="text-align: left;"&gt;
Python&lt;/h3&gt;
&lt;div&gt;
Парочка холиворов с хабра: наброс &lt;a href="http://habrahabr.ru/company/radmin/blog/137497/"&gt;Ruby vs Python&lt;/a&gt; и &lt;a href="http://habrahabr.ru/post/140939/"&gt;грамотный ответ&lt;/a&gt;. Что бы вы ни выбрали, вы останетесь в выигрыше.&lt;br /&gt;&lt;br /&gt;Спорная, но интересная статья про &lt;a href="http://habrahabr.ru/post/140581/"&gt;стиль кодирования и классы в python&lt;/a&gt;. Видно, у автора своё понимание чистоты кода.&lt;br /&gt;&lt;br /&gt;Замечательный модуль &lt;a href="http://www.voidspace.org.uk/python/mock/"&gt;mock&lt;/a&gt; станет частью unittest, и &lt;a href="http://www.voidspace.org.uk/python/weblog/arch_d7_2012_03_24.shtml"&gt;будет доступен из коробки уже в python 3.3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вышла &lt;a href="http://www.jetbrains.com/pycharm/nextversion/index.html"&gt;бета Pycharm 2.5&lt;/a&gt;: управление пакетами, virtualenv, remote interpreters.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;
Веб-разработка&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Забавная &lt;a href="http://browserquest.mozilla.org/"&gt;браузерная MMORGP от Mozilla&lt;/a&gt; на HTML5 (node.js, вебсокеты, require.js, modernizr, jquery, underscore)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://easings.net/"&gt;Шпаргалка easing-функций&lt;/a&gt; для описания скорости анимации.&lt;br /&gt;&lt;br /&gt;Новый, открытый под лицензией CC шрифт с набором широко используемых пиктограмм - &lt;a href="http://www.entypo.com/"&gt;Entypo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Единый GUI-клиент для различных СУБД (MySQL, Postgres, MongoDB) &lt;a href="http://inductionapp.com/"&gt;Induction.app&lt;/a&gt; (OS X only)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4 style="text-align: left;"&gt;
Django&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
Очередная коллекция скринкаcтов про Django - &lt;a href="http://godjango.com./"&gt;http://godjango.com.&lt;/a&gt; Пока обновляется, надеемся так и будет в дальнейшем.&lt;br /&gt;&lt;br /&gt;Один из многочисленных “&lt;a href="http://agiliq.com/books/djangodesignpatterns/index.html"&gt;Django design patterns&lt;/a&gt;”, местами тривиальный, местами же довольно толковый. Здесь, кстати, нельзя не упомянуть знаменитый &lt;a href="http://stevelosh.com/blog/2011/06/django-advice/"&gt;Django Advice&lt;/a&gt;. Обязателен к прочтению, если вы с ним ещё не сталкивались.&lt;br /&gt;&lt;br /&gt;Делаем модную штуку с помощью модного стека. &lt;a href="https://github.com/fatiherikli/scrumboard"&gt;ScrumBoard&lt;/a&gt; на Django + Backbone.js + Tastypie. Это не туториал, а уже готовый проект на GitHub`е.&lt;br /&gt;&lt;br /&gt;Любопытная батарейка &lt;a href="http://datadesk.latimes.com/posts/2012/03/introducing-django-bakery/"&gt;django-bakery&lt;/a&gt;. Позволяет превратить динамический контентный сайт в набор статических HTML, дабы избежать хабраэффекта. Ограничение: Django 1.3+, надо использовать class-based views (всем рекомендуем, кстати).&lt;br /&gt;Кстати, для flask давно уже есть &lt;a href="http://packages.python.org/Frozen-Flask/"&gt;Frozen-Flask&lt;/a&gt; для этих целей.&lt;br /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;
Облака&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://habrahabr.ru/post/140525/"&gt;Дыра&lt;/a&gt; в безопасности Scalaxy. В течение недели из-за ошибки в API можно было выкачать список всех инстансов.&lt;br /&gt;&lt;br /&gt;Профилактические работы у Селектела привели к почти &lt;a href="http://habrahabr.ru/post/140862/"&gt;5-часовому даунтайму&lt;/a&gt; виртуальных машин в облаке. В конце дня появился подробный &lt;a href="http://habrahabr.ru/post/140862/#comment_4710015"&gt;отчёт&lt;/a&gt; о проблеме.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-8371571823352996467?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/j77rdNFE8Kc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/j77rdNFE8Kc/31-1.html</link><author>noreply@blogger.com (Future Colors)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/03/31-1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6180190261543881757.post-924587318264963509</guid><pubDate>Tue, 27 Mar 2012 12:01:00 +0000</pubDate><atom:updated>2012-03-27T16:08:09.615+04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">Django Days</category><title>Новинки Django 1.4, day 8: Timezones</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;blockquote class="tr_bq" style="text-align: right;"&gt;
Посвящается часовым поясам без DST.&lt;/blockquote&gt;
&lt;br /&gt;
Это предпоследний пост в серии &lt;a href="http://blog.futurecolors.ru/search/label/Django%20Days"&gt;Django Days&lt;/a&gt;. В этот раз будет затронуто одно из самых масштабных изменений в фреймворке: &lt;a href="https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/"&gt;работу с часовыми поясами&lt;/a&gt;. Документация по этой теме достаточно подробная, мы попробуем рассказать это более интересно и по возможности сжато.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Что это и зачем&lt;/span&gt;&lt;br /&gt;
В Django до версии 1.4 все даты хранились и отображались для одного часового пояса, того, который указанны в настройках &lt;a href="https://docs.djangoproject.com/en/1.4/ref/settings/#std:setting-TIME_ZONE"&gt;settings.TIME_ZONE&lt;/a&gt;.&amp;nbsp;Теперь же появилась возможность хранить все даты в формате&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/%D0%92%D1%81%D0%B5%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B5_%D0%BA%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B2%D1%80%D0%B5%D0%BC%D1%8F"&gt;UTC&lt;/a&gt;&amp;nbsp;и удобно выводить их с поправкой на часовой пояс пользователя.&lt;br /&gt;
&lt;br /&gt;
Дополнительным плюсом нового подхода к хранению дат является обход &lt;a href="http://pytz.sourceforge.net/#problems-with-localtime"&gt;проблем с переводом часов на летнее время и обратно&lt;/a&gt;, которые могут возникать раз в год. Например, 31 октября 2010 года, когда последний раз переводили стрелки осенью в России, время 02:10&amp;nbsp;утра&amp;nbsp;по местному времени нельзя однозначно интерпретировать (так как час с 2:00 до 3:00 «проходит» дважды: до и после перевода стрелок). Для биллинговых систем это мелочью не назовёшь, поэтому лучше для машин хранить время в UTC, а выводить&amp;nbsp;для людей&amp;nbsp;с учётом часового пояса. Упомянутые «02:10&amp;nbsp;31 октября 2010» превратятся в понятные программистам&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;"2010-10-30T22:10:00+04:00"&lt;/span&gt; и&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;"2010-10-30T23:10:00+03:00".&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Основные понятия&lt;/span&gt;&lt;br /&gt;
Объекты типа&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;datetime&lt;/span&gt; в Python поддерживают указание часовых поясов с помощью атрибута &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://docs.python.org/library/datetime.html#datetime.tzinfo"&gt;tzinfo&lt;/a&gt;&lt;/span&gt;. Если атрибут заполнен, дата называется «timezone-aware», в противном случае это «naive» дата.&lt;br /&gt;
&lt;br /&gt;
В новых проектах на Django 1.4, или если вы пожелали воспользоваться новой фичей при обновлении, установив&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="https://docs.djangoproject.com/en/1.4/ref/settings/#std:setting-USE_TZ"&gt;settings.USE_TZ&lt;/a&gt;=True&lt;/span&gt;, Джанго использует timezone-aware даты.&lt;br /&gt;
&lt;br /&gt;
Часовым поясом по-умолчанию (default timezone) называется пояс, указанный в&amp;nbsp;&lt;a href="https://docs.djangoproject.com/en/1.4/ref/settings/#std:setting-TIME_ZONE"&gt;settings.TIME_ZONE&lt;/a&gt;&amp;nbsp;(например, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;'Europe/Moscow'&lt;/span&gt;).&lt;br /&gt;
Текущим часовым поясом (current timezone) считается тот, что активирован для пользователя в данный момент, об этом ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Текущий часовой пояс&lt;/span&gt;&lt;br /&gt;
Чтобы показать пользователю дату и время из его часового пояса, необходимо для начала выяснить откуда он. Можно напрямую &lt;a href="https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/#selecting-the-current-time-zone"&gt;спросить пользователя&lt;/a&gt;&amp;nbsp;и сохранить timezone в сессии, а можно воспользоваться базами вроде maxmind, угадав пояс по ip, или даже использовать&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Date.getTimezoneOffset()&lt;/span&gt; в js&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.&lt;/span&gt;&amp;nbsp;Так или иначе, на основе этого выбора нам придётся &lt;a href="https://docs.djangoproject.com/en/1.4/ref/utils/#django.utils.timezone.activate"&gt;активировать&lt;/a&gt; часовой пояс пользователя, чтобы повлиять на отображение дат и времени в шаблонах и формах.&lt;br /&gt;
&lt;br /&gt;
Пример установки текущего часового пояса в middleware (из документации):&lt;br /&gt;
&lt;pre&gt;&lt;code class="python"&gt;from django.utils import timezone

class TimezoneMiddleware(object):
    def process_request(self, request):
        tz = request.session.get('django_timezone')
        if tz:
            timezone.activate(tz)
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
Необходимая функциональность для работы с датами сосредоточена в модуле&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="https://docs.djangoproject.com/en/1.4/ref/utils/#django-utils-timezone"&gt;django.utils.timezone&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Шаблоны&lt;/span&gt;&lt;br /&gt;
Работа с датами широко поддерживается не только в питон-коде, но и &lt;a href="https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/#template-tags"&gt;в шаблонах&lt;/a&gt;:&lt;br /&gt;
&lt;pre&gt;&lt;code class="django"&gt;# В данном блоке даты будут сконвертированы в парижский часовой пояс
# (а не текущий)
{% timezone "Europe/Paris" %}
    Paris time: {{ value }}
{% endtimezone %}

# В данном блоке даты будут выведены как они хранятся (UTC)
{% localtime off %}
    {{ value }}
{% endlocaltime %}
&lt;/code&gt;&lt;/pre&gt;
Это лишь небольшая демонстрация, в документации &lt;a href="https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/#template-tags"&gt;более подробно&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Мигрируем&lt;/span&gt;&lt;br /&gt;
1. Включаем &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;settings.USE_TZ = True&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
2. &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;pip install pytz&lt;/span&gt; (чтобы точней работало, см. ниже)&lt;/div&gt;
&lt;div&gt;
3. Пользователи PostgreSQL пропускают шаг, остальные конвертируют свои даты в БД из местного часового пояса в UTC (если он отличается, конечно).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Теперь ваш код уже поддерживает часовые пояса. Осталось починить некоторые места, в которых Django исправляет старый код за нас, преобразовывая naive-даты в timezone-aware.&amp;nbsp;В противном случае могут возникать ошибки во время перевода на летнее время.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Для полноценной миграции пригодится уже упомянутый модуль&amp;nbsp;&lt;a href="https://docs.djangoproject.com/en/1.4/ref/utils/#module-django.utils.timezone"&gt;django.utils.timezone&lt;/a&gt;&amp;nbsp;и отлов мест, где даты в старом формате сравниваются «новыми».&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-size: large;"&gt;pytz&lt;/span&gt;&lt;br /&gt;
Это библиотека, позволяющая удобно работать с часовыми поясами в питоне. Она включает в себя &lt;a href="http://en.wikipedia.org/wiki/Tz_database"&gt;базу таймзон Олсона&lt;/a&gt;&amp;nbsp;и&amp;nbsp;&lt;a href="http://pytz.sourceforge.net/"&gt;неплохой API&lt;/a&gt; для различных вычислений с часовыми поясами. Несмотря на то, что она необязательна для работы часовых поясов в Django 1.4, разработчики настоятельно рекомендуют установить её, так как это позволит фреймворку не угадывать часовой пояс по-умолчанию при вычислениях, а также предоставляет список доступных поясов для вывода пользователю.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Заключение&lt;/span&gt;&lt;br /&gt;
Данный обзор повторяет документацию, фокусируясь на ключевых для понимания вещах, но многое оставляет за кадром. Почитайте&amp;nbsp;&lt;a href="https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/"&gt;доки&lt;/a&gt;&amp;nbsp;и особенно&amp;nbsp;&lt;a href="https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/#faq"&gt;FAQ&lt;/a&gt;&amp;nbsp;напоследок для закрепления&lt;br /&gt;
материала :)&lt;br /&gt;
&lt;br /&gt;
В следующий раз я подведу итог по всей серии постов, ещё раз выделив самые интересные моменты Django 1.4. Вероятно до &lt;a href="http://moscowdjango.timepad.ru/event/21169"&gt;Moscow Django Meetup №2&lt;/a&gt; в блоге также появится моя презентация на эту же тему.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6180190261543881757-924587318264963509?l=blog.futurecolors.ru' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/futurecolors/~4/-K2qT_UVPFE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/futurecolors/~3/-K2qT_UVPFE/django-14-day-8-timezones.html</link><author>noreply@blogger.com (Илья Барышев)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.futurecolors.ru/2012/03/django-14-day-8-timezones.html</feedburner:origLink></item></channel></rss>

