<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>LXj's blog</title>
	
	<link>http://lxj.endofinternet.net/blog</link>
	<description>*scratch*</description>
	<lastBuildDate>Thu, 15 Dec 2011 00:14:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/LXj" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="lxj" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FLXj" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FLXj" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/LXj" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FLXj" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FLXj" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.addtoany.com/?linkname=LXj%27s%20blog&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2FLXj&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><item>
		<title>Андроидные приложения</title>
		<link>http://lxj.endofinternet.net/blog/2011/12/android-apps/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/12/android-apps/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 23:09:00 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=417</guid>
		<description><![CDATA[В начале года я купил Android-смартфон LG Optimus One, а на днях какой-то андроидный телефон купил мой брат. Для него я сделал список приложений, которые за это время накопились на моём телефоне, и заодно публикую этот список здесь. В него не входят клиенты для всяких твиттеров, дропбоксов и прочих форскверов, ну и те приложения, которые [...]]]></description>
			<content:encoded><![CDATA[<p>В начале года я купил Android-смартфон LG Optimus One, а на днях какой-то андроидный телефон купил мой брат. Для него я сделал список приложений, которые за это время накопились на моём телефоне, и заодно публикую этот список здесь. В него не входят клиенты для всяких твиттеров, дропбоксов и прочих форскверов, ну и те приложения, которые стоят на LG-шных смартфонах по умолчанию.</p>
<p><a href="https://market.android.com/details?id=com.rechild.advancedtaskkiller">Advanced Task Killer</a><br />
Многие говорят, что это самое нужное приложение на андроиде :) Если честно, я от его использования особой разницы в &laquo;тормозах&raquo; не заметил. Выключить-включить обычно надёжнее :) (а ещё лучше просто удалить виновное приложение)</p>
<p><a href="https://market.android.com/details?id=com.rovio.angrybirds">Angry Birds</a><br />
Птички, куда же без них.</p>
<p><a href="https://market.android.com/details?id=com.splunchy.android.alarmclock">AlarmDroid</a><br />
Настраиваемый будильник</p>
<p><a href="https://market.android.com/details?id=mobi.beyondpod">BeyondPod</a><br />
Подкаст-фетчер, бесплатная версия не умеет сама по расписанию проверять и скачивать подкасты, и ограничена одной закачкой одновременно. У меня на Оптимусе ощутимо подтормаживает, но какое-то другое приложение для подкастов, которое я пробовал, было ещё тормознее, а скачивать вручную и слушать встроенным плеером &#8212; неудобно.</p>
<p><a href="https://market.android.com/details?id=com.bbb.btr">Burn the Rope</a><br />
Прикольная игрушка. В принципе, я редко играю на мобильнике, но если что-то и запускаю &#8212; то обычно именно её</p>
<p><a href="https://market.android.com/details?id=com.google.android.apps.chrometophone">Chrome to Phone</a><br />
Или же <a href="https://market.android.com/details?id=fi.xd.android.apps.khrometophone">Khrome to Phone</a><br />
Приложение + экстеншн для Хрома для быстрого открытия ссылки из &laquo;большого&raquo; браузера на телефоне. Первый был почему-то недоступен для установки, но второй замечательно у меня работает</p>
<p>Собственно, экстеншн для Хрома брать <a href="https://chrome.google.com/webstore/detail/oadboiipflhobonjjffjbfekfjcgkhco">тут</a></p>
<p><a href="https://market.android.com/details?id=com.apksoftware.compass">Compass</a><br />
Компас. Duh.</p>
<p><a href="https://market.android.com/details?id=com.zeptolab.ctr.paid">Cut the Rope</a><br />
Ещё одна игрушка. Я её ставил из какого-то альтернативного аппстора, там она по акции раздавалось бесплатно.</p>
<p><a href="https://market.android.com/details?id=mobi.mgeek.TunnyBrowser">Dolphin Browser HD</a><br />
Альтернативный браузер, есть вкладки и поддерживает экстеншены. Собственно, поставил я его ради экстеншена LastPass for Dolphin HD (LastPass &#8212; сервис для хранения и синхронизации паролей)</p>
<p>Слышал, как хвалили/ругали андроидную Оперу, не пробовал</p>
<p><a href="https://market.android.com/details?id=org.geometerplus.zlibrary.ui.android">FBReader</a><br />
Читалка</p>
<p><a href="https://market.android.com/details?id=com.mediawoz.goweather">GO Weather</a><br />
Красивый виджет с погодой. Также умеет менять фон &laquo;рабочего стола&raquo; в зависимости от погоды и времени суток</p>
<p><a href="https://market.android.com/details?id=com.google.android.apps.unveil">Google Goggles</a><br />
Фотопоиск. Умеет сканировать штрихкоды, решать судоку и теоретически находить информацию о чём угодно, на что ты направил камеру. Лично я немного с ним поигрался и оставил как сканер QR-кодов</p>
<p><a href="https://market.android.com/details?id=com.mxtech.videoplayer.ad">MX Video Player</a><br />
Проигрыватель видео со своими кодеками. Нужен, потому что встроенный плеер понимает далеко не все видеоформаты/кодеки (скажем, DivX). Естественно, на смартфоне с маленьким экраном и слабым процессором особо не насмотришься, но при желании (и везении) &#8212; можно :)</p>
<p><a href="https://market.android.com/details?id=com.bfs.papertoss">Paper Toss</a><br />
Игрушка</p>
<p><a href="https://market.android.com/details?id=ua.privatbank.ap24">Privat24</a><br />
Мобильная версия Приват24. У приложения гвоздями прибит портретный режим, из-за этого очень неудобно набирать пароль (а возможности запомнить нет), поэтому почти не пользуюсь</p>
<p><a href="https://market.android.com/details?id=com.skype.raider">Skype</a><br />
Skype для андроида. В своё время были проблемы с устновкой через маркет, так что пришлось качать пакет с форума 4pda.ru. У меня он тормозил и иногда просто зависал, так что не пользуюсь</p>
<p><a href="https://market.android.com/details?id=ua.gradsoft.android.tpoptimizer">Tariff Plan Optimizer UA</a><br />
Анализирует статистику звонков/смсок и показывает, сколько бы ты денег потратил на разных тарифах.</p>
<p><a href="https://market.android.com/details?id=com.iba.ussdchecker">USSD Checker</a><br />
Проверяет состояние счёта через USSD-запрос и выводит на виджет. Платная версия может автоматически обновлять счёт после каждого исходящего звонка/SMS, бесплатная проверяет только раз в сутки в 23:55 (можно проверить вручную в любой момент в два касания)</p>
<p>Ну и на выбор две киноафиши:<br />
<a href="https://market.android.com/details?id=ua.in.leopard.androidCoocooAfisha">PopCornUA</a><br />
<a href="https://market.android.com/details?id=ru.yandex.afisha">Яндекс.Киноафиша</a></p>
<p>Преимущество PopCornUA &#8212; он умеет загрузить информацию на телефон, и потом работать без подключения к интернету. Для Яндекс.Киноафиши постоянно требуется инет, зато она более удобная, красивая, и от православного Яндекса</p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/JfZMKqYCvKE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/12/android-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>django-mediagenerator</title>
		<link>http://lxj.endofinternet.net/blog/2011/12/django-mediagenerator/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/12/django-mediagenerator/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 23:24:17 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=415</guid>
		<description><![CDATA[django-mediagenerator &#8212; менеджер статических файлов &#171;от создателей&#187; Django-nonrel. Сейчас уже все знают, что для управления статическими файлами есть django.contrib.staticfiles, но на самом деле стандартным он стал совсем недавно, в Django 1.3, а до этого успели написать несколько разных решений. Что же такого интересного в django-mediagenerator, что отличает его от staticfiles?
Во-первых, JS и CSS-файлы можно собирать [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.allbuttonspressed.com/projects/django-mediagenerator">django-mediagenerator</a> &#8212; менеджер статических файлов &laquo;от создателей&raquo; Django-nonrel. Сейчас уже все знают, что для управления статическими файлами есть django.contrib.staticfiles, но на самом деле стандартным он стал совсем недавно, в Django 1.3, а до этого успели написать несколько разных <a href="http://djangopackages.com/grids/g/asset-managers/">решений</a>. Что же такого интересного в django-mediagenerator, что отличает его от staticfiles?</p>
<p>Во-первых, JS и CSS-файлы можно собирать в &laquo;бандлы&raquo; &#8212; проще говоря, множество файлов можно собрать в один, что уменьшит необходимое количество запросов. При этом прозрачно поддерживаются всевозможные SASS, CoffeeScript и прочие &laquo;улучшатели&raquo; CSS и JS, вплоть до того, что итоговый CSS файл можно собрать из комбинации нескольких файлов CSS, SASS, LESS и т.д. Заодно при генерации итогового файла для заливки на продакшн-сервер его можно автоматически сжать YUICompressor или другим компрессором (на отладочном сервере они так и будут отдаваться как множество файлов и без всякой компрессии)</p>
<p>Во-вторых, абсолютно все файлы версионируются. Другими словами, больше не будет ситуации когда заказчик после обновления сайта по-прежнему видит старый дизайн, поскольку, к примеру, <code>main.css</code> в одной версии автоматически переименовывается в <code>main-4f3fcb40.css</code>, а в следующей &#8212; уже в <code>main-390ba896.css</code>. Заодно можно указать в настройках кэширования, чтобы файлы в каталоге со статическими файлами никогда не устаревали</p>
<p>При этом на отладочном сервере вся &laquo;магия&raquo; происходит через middleware и генерируемые файлы никуда не складируются, а перед установкой на продакшн достаточно запустить <code>manage.py generatemedia</code>.</p>
<p>Увы, пока что django-mediagenerator имеет кучу проблем, если пытаться использовать его на серьёзных проектах.</p>
<p>Во-первых, на отладочном сервере он уж очень сильно увеличивает время генерации страницы, когда количество статических файлов начинает исчисляться сотнями. В обсуждении на багтрекере уже даже <a href="https://bitbucket.org/wkornewald/django-mediagenerator/issue/29/making-mediagenerator-blazingly-fast-in#comment-727880">разобрались</a>, почему так происходит, но пока что для исправления этой проблемы есть только сторонний патч, требующий перезапуска сервера после каждого изменения в статических файлах.</p>
<p>Во-вторых, к отдельным CSS и JS-файлам по идеологии django-mediagenerator просто так не обратиться, нужно обязательно определять бандл. А бандл, к тому же, можно задавать только в корневом settings.py проекта, что усложняет написание повторно используемых приложений.</p>
<p>Ну и в-третьих необходимость особым образом работать с именами всех статических файлов (а не просто добавлять <code>{{ STATIC_URL }}</code> в путь) добавляет головной боли. В конечном итоге, я прикинул, как бы мне добавить поддержку django-mediagenerator в django-tinymce, и очень быстро раздумал это делать :)</p>
<p>Всё те же разработчики сделали CMS <a href="http://www.allbuttonspressed.com/projects/allbuttonspressed">All Buttons Pressed</a> (поскольку другие CMS на Django не совместимы с Django-nonrel), в которой, конечно же, использовали django-mediagenerator. Примечательно, что статических файлов с ней идёт немного, и вместо WYSIWYG-редактора предполагается использовать разновидность вики-разметки. Сейчас я переделываю эту CMS под себя, и уже использую staticfiles и django-tinymce.</p>
<p>Ну и самое главное &#8212; авторы Django-nonrel совсем недавно объявили, что прекращают заниматься своими Django-проектами. Для самого Django-nonrel уже нашёлся новый мейнтейнер, но будут ли дальше развивать ABP и mediagenerator, пока непонятно</p>
<p>Добавка: <a href="http://stackoverflow.com/a/8498467/292080">расписал на StackOverflow</a>, как правильно использовать staticfiles c Django-nonrel/djangoappengine</p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/v8nCloJw-qo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/12/django-mediagenerator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Django и AppEngine: даты и диапазоны</title>
		<link>http://lxj.endofinternet.net/blog/2011/10/django-gae-range-filter/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/10/django-gae-range-filter/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 08:28:35 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=407</guid>
		<description><![CDATA[В последнее время активно осваиваю Google AppEngine и Django-nonrel. Писать под nosql-БД &#8212; это, оказывается, весьма интересно и познавательно. Если реляционные БД хорошо изучены, и различные аспекты представления данных в табличном виде давно задокументированы, то переориентировашись на BigTable или Mongo, приходится думать самому &#8212; как бы так распихать данные по таблицам, чтобы было и эффективно, [...]]]></description>
			<content:encoded><![CDATA[<p>В последнее время активно осваиваю Google AppEngine и Django-nonrel. Писать под nosql-БД &#8212; это, оказывается, весьма интересно и познавательно. Если реляционные БД хорошо изучены, и различные аспекты представления данных в табличном виде давно задокументированы, то переориентировашись на BigTable или Mongo, приходится думать самому &#8212; как бы так распихать данные по таблицам, чтобы было и эффективно, и без JOIN&#8217;ов.</p>
<p>Но нереляционные БД &#8212; это не только денормализация табличек, это ещё и дополнительные ограничения. Например, через некоторое время работы с AppEngine, я наткнулся на <a href="http://code.google.com/intl/ru/appengine/docs/python/datastore/queriesandindexes.html#Restrictions_on_Queries">вот такое</a>:</p>
<blockquote><p>Запрос может использовать фильтры неравенства (<, <=, >=,>, !=) только по одному свойству среди всех своих фильтров.</p></blockquote>
<p>Дело в том, что в разрабатываемом мной сайте есть несколько моделей с полями вроде date1 и date2, и, соответственно, время от времени нужно выводить список объектов по дате date, у которых date1 <= date <= date2. Спрашивается, как это делать используя не более двух операций неравенства?</p>
<p>Я решил воспользоваться тем, что BigTable поддерживает поля типа <a href="http://code.google.com/intl/ru/appengine/docs/python/datastore/typesandpropertyclasses.html#ListProperty">ListProperty</a> (Django-nonrel, соответственно, <a href="http://www.allbuttonspressed.com/projects/djangoappengine#field-types">поддерживает поля типа ListField</a>, вот только документации по нему нет ^^), при этом <a href="http://code.google.com/intl/ru/appengine/docs/python/datastore/entitiesandmodels.html#Lists">вхождение в список</a> в GQL проверяется вовсе не оператором IN (который ограничен 30-ю значениями), а оператором &#8216;=&#8217;</p>
<p>Непосредственно в джанго-приложении это выразилось таким кодом:</p>
<pre><code># models.py

def _date_range(date1, date2):
    result = []
    while (date1 <= date2):
        result.append(date1)
        date1 += datetime.timedelta(1)
    return result

class MyModel(models.Model):
    # ...
    date1 = models.DateField('Дата начала')
    date2 = models.DateField('Дата окончания')
    date_range = ListField(models.DateField(), blank=True)
    # ...
    def save(self):
        self.date_range = _date_range(self.date1, self.date2)
        super(MyModel, self).save()</code></pre>
<pre><code># views.py

def transp(request, day, month, year):
    # ...
    objects = Transport.objects.order_by('-updated')
    if (day):
        the_date = datetime.datetime(int(year), int(month), int(day))
        objects = objects.filter(date_range__exact = the_date)
    # ...
</code></pre>
<p>Тут есть один странный подводный камень -- нужно использовать именно datetime.datetime, а не datetime.date (не смотря на то, что у меня везде DateField, а не DateTimeField). </p>
<p>На первый взгляд кажется, что такое представление данных -- очень неэффективно. Но если посмотреть на эту модель с точки зрения того, каким образом будут работать индексы, то окажется, что поиск с такой моделью будет работать быстрее! Не случайно в AppEngine ограничены именно фильтры неравенства: фильтр равенства сводится к простой и эффективной выборке по определённому индексу.</p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/c54iFO8xbwQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/10/django-gae-range-filter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Django Forms Usage</title>
		<link>http://lxj.endofinternet.net/blog/2011/10/advanced-django-forms-usage/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/10/advanced-django-forms-usage/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 15:40:30 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=385</guid>
		<description><![CDATA[Один из самых познавательных докладов на недавнем DjangoCon&#8217;е &#8212; Advanced Django Forms Usage
Вот, к примеру код, подобный которому можно встретить в любом туториале по Django: 

Автор доклада показывает, как тоже самое можно описать более кратко и наглядно:

Число строк кода сократилось с 9 до 6, и форма инстанцируется всего в одном месте. Ниже я привёл несколько [...]]]></description>
			<content:encoded><![CDATA[<p>Один из самых познавательных докладов на недавнем DjangoCon&#8217;е &#8212; <a href="http://blip.tv/djangocon/advanced-django-form-usage-5573287">Advanced Django Forms Usage</a></p>
<p>Вот, к примеру код, подобный которому можно встретить в <a href="http://www.djangobook.com/en/2.0/chapter07/#cn149">любом туториале по Django</a>: </p>
<p><a href="http://lxj.endofinternet.net/blog/2011/10/advanced-django-forms-usage/djangoforms1/" rel="attachment wp-att-390"><img src="http://lxj.endofinternet.net/blog/wp-content/uploads/2011/10/djangoforms1-500x371.png" alt="" title="djangoforms1" width="500" height="371" class="aligncenter size-large wp-image-390" /></a></p>
<p>Автор доклада показывает, как тоже самое можно описать более кратко и наглядно:</p>
<p><a href="http://lxj.endofinternet.net/blog/2011/10/advanced-django-forms-usage/djangoforms2/" rel="attachment wp-att-391"><img src="http://lxj.endofinternet.net/blog/wp-content/uploads/2011/10/djangoforms2-500x375.png" alt="" title="djangoforms2" width="500" height="375" class="aligncenter size-large wp-image-391" /></a></p>
<p>Число строк кода сократилось с 9 до 6, и форма инстанцируется всего в одном месте. Ниже я привёл несколько полезных сниппетов из того же доклада:</p>
<pre><code>
# view with a form

def my_view(request, template_name='myapp/myform.html'):
    form = MyForm(request.POST or None)
    if form.is_valid():
        do_x()
        return redirect('home')
    return render(request, template_name, {'form': form})

# view with files

def my_view(request, template_name='myapp/myform.html'):
    form = MyForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        do_x()
        return redirect('home')
    return render(request, template_name, {'form': form})

# view for editing a model instance

def my_model_edit(request, slug=slug, template_name='myapp/my_model_form.html'):
    mymodel = get_object_or_404(MyModel, slug=slug)
    form = MyModelForm(request.POST or None, instance=mymodel)
    if form.is_valid():
        mymodel = form.save()
        // ...
        mymodel.save()
        return redirect('home')
    return render(request, template_name, {'form': form, 'mymodel': mymodel})

# view for creating a model instance

def my_model_add(request, slug=slug, template_name='myapp/my_model_form.html'):
    form = MyModelForm(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect('home')
    return render(request, template_name, {'form': form})

# forms overloading

class MyModelForm(forms.ModelForm):
    def __init__(self):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['name'].required = True
        self.fields['age'].required = True
        self.fields['profession'].required = True
        self.fields['profession'].help_text = _('Hi professor')

    class Meta:
        model = MyModel  

# dynamically adding fields to a form

def my_view(request, template_name='myapp/my_model_form.html'):
    form = MyModelForm(request.POST or None)

    # Let's add a field on the go, needs to be done before validating it
    form.fields['favorite_color'] = forms.ChoiceField(
        ...
    )

    if form.is_valid():
        # Let's get user's favorite color,
        # you can do whatever you want with it
        favorite_color = form.cleaned_data['favorite_color']

        form.save()
        return redirect('home')

    return render(request, template_name, {'form': form})
</code></pre>
<p>Добавлено: <code>render</code> и <code>redirect</code> импортятся, конечно же, из <a href="https://docs.djangoproject.com/en/1.3/topics/http/shortcuts/">django.shortcuts</a>. Обратите внимание, что render добавлен в Django 1.3 (и его удобно использовать вместо <code>render_to_response</code> и <code>direct_to_template</code>).</p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/PEBV6-IBnsM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/10/advanced-django-forms-usage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon Kindle 3G: впечатления</title>
		<link>http://lxj.endofinternet.net/blog/2011/08/kindle/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/08/kindle/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 14:58:12 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[Гаджеты]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=367</guid>
		<description><![CDATA[Что-то я с апреля никак не опубликую эту заметку. Надо бы наконец-то привести её в порядок и выложить :)
Экран, конечно, не идеально белый, и требует хорошего освещения (впрочем, как и обычные книги). Но читать с него приятно. Размер 6&#8243; меня вполне устраивает &#8212; для чтения PDFов всё равно лучше накопить на планшет. Для художественных книг [...]]]></description>
			<content:encoded><![CDATA[<p>Что-то я с апреля никак не опубликую эту заметку. Надо бы наконец-то привести её в порядок и выложить :)</p>
<p><strong>Экран</strong>, конечно, не идеально белый, и требует хорошего освещения (впрочем, как и обычные книги). Но читать с него приятно. Размер 6&#8243; меня вполне устраивает &#8212; для чтения PDFов всё равно лучше накопить на планшет. Для художественных книг в PDF также помогает <a href="http://www.willus.com/archive/">вот эта программа</a> (см. также <a href="http://vyazovoi.blogspot.com/2011/07/e-ink-pdf.html">эту заметку</a>)</p>
<p><strong>Управление</strong> не идеальное, ибо в 2011 году устройство без тача кажется слегка устаревшим. Но совсем неудобным его не назвать. Наверное, в следующем Kindle будет тач, но учитывая периодичность выхода новых поколений Kindle (кроме DX) &#8212; они сменяются примерно раз в полтора года, так что следующий Kindle нужно было бы ждать ещё год (купил я его в марте).</p>
<p>Кожаная <strong>обложка</strong> смотрится весьма солидно, хорошо держится на креплении, и главное &#8212; имеет выдвижной фонарик, который питается от самого устройства. Этой подсветки почти хватает для комфортного чтения (всё-таки правый верхний угол освещён хорошо, а левый нижний &#8212; слабо). За такую обложку не жалко и 60$&#8230; Почти :) Не хватает только <a href="http://xkcd.com/548/">надписи &laquo;DON&#8217;T PANIC&raquo;</a></p>
<p>(Есть варианты обложки подешевле, но без встроенной подсветки)</p>
<p><strong>Браузер</strong> действительно позволяет бесплатно смотреть любые сайты. Даже если там есть куча джаваскрипта и анимация. Естественно, анимация выглядит весьма забавно на таком экране, прокрутка экрана ощутимо тормозит, а ссылки приходится выбирать джойстиком. Но всё равно &#8212; иметь возможность бесплатно выйти в интернет по всему миру &#8212; это просто круто. Можно проверять почту и писать в твиттер. Наверняка можно общаться через какой-нибудь GTalk, хотя я не пробовал.</p>
<p>Понятное дело, скачать никакие файлы не дают. Но самое неприятное другое &#8212; из-за отсутствия вкладок браузер не переваривает ссылки, которые должны открываться в новой вкладке/окне. Потому, например, если вы пришлёте себе ссылку по электронке, а затем на Киндле попробуете зайти на GMail и &laquo;кликнуть&raquo; по этой ссылке, то увидите только окошко с ошибкой. Та же проблема &#8212; и с Google Reader.</p>
<p>Зато чем хорош Google Reader &#8212; так это своим клавиатурным управлением: j/k для предыдущей/следующей заметки (или n/p для выбора и o для отрытия), u для скрытия панели со списком каталогов/лент &#8212; и читать из него становится относительно удобно. Но только если в соответствующих лентах тексты заметок отдаются полностью. Мне как раз в одно время с покупкой Kindle брат показал <a href="http://storyofgrubas.livejournal.com/">вот этот блог</a>, я подписался на него в Google Reader, занёс все заметки в starred, и большую часть прочитал именно на Kinde&#8217;е.</p>
<p>Шрифт, правда, на большинстве веб-сайтов всё-таки мелковат для долгого чтения. Можно, конечно, увеличить его до 150%, но на том же Google Reader тогда сильно расползается вёрстка и браузер начинает ощутимо тормозить.</p>
<p>&laquo;Умной&raquo; подгонки ширины текста в многоколоночной вёрстке, как на современных мобильных браузерах, тоже нет. Так что на некоторых сайтах (к примеру, <a href="http://teamliquid.net">TeamLiquid</a>), если не сделать приближения, то текст будем слишком мелким, а если приблизить &#8212; часть текста будем обрезана по левому или правому краю. </p>
<p><strong>Kindle Store</strong> вполне удобен. Что касается цен &#8212; вот, например, <a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=pd_sim_b_1">Design Patterns: Elements of Reusable Object-Oriented Software</a> в печатном виде на Amazon&#8217;е стоит $59.99 ($41.56 при доставке по Штатам), а в версии для Kindle &#8212; $28.39. Конечно же, с DRM, и конечно, байты не пощупать и не понюхать, но &#8212; разница налицо. Правда, видел упоминания в блогах, что некоторые книги &#8212; наоборот, неоправданно дороги (см. также <a href="http://feedproxy.google.com/~r/MaxIschenkoRU/~3/PpxHPW4HFEc/9219288259">заметку Макса Ищенко</a>). Купленные книги в любой момент можно скачать из Амазона. Напомню также, что их можно читать с помощью приложений <a href="http://www.amazon.com/gp/feature.html/ref=kinw_myk_dv_reg_ln?ie=UTF8&#038;docId=1000493771">на куче разных платформ</a> &#8212; Linux&#8217;а там, правда, нет, но не давно <a href="http://itc.ua/news/amazon_vypustila_veb-versiyu_kindle_cloud_reader_optimizirovannuyu_dlya_ipad_55011">была запущена веб-версия</a>.</p>
<p>Устройство видится с компьютера, как обычная флешка, но лучше всё-таки использовать <a href="http://calibre-ebook.com/">Calibre</a> &#8212; хотя бы потому, что форматов Kindle понимает мало, а Calibre их все умеет конвертировать. Также замечу, что гугл может помочь вам найти прошивки с русификацией и поддержкой русской клавиатуры &#8212; сам я их, впрочем, не пробовал.</p>
<p>В целом, если сравнивать с другими читалками, то недостатки Kindle явно менее критичные, чем его преимущества. Бесплатный доступ к интернету практически где угодно &#8212; это настолько killer feature, что даже объяснять как-то неудобно. </p>
<p><a href="http://www.mobile-review.com/articles/2010/amazon-kindle3.shtml">Обзор Mobile Review</a><br />
<a href="http://www.exler.ru/expromt/09-11-2010.htm">Обзор Экслера</a></p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/KWywcrhhuVE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/08/kindle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Срывая покровы</title>
		<link>http://lxj.endofinternet.net/blog/2011/06/unveiling/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/06/unveiling/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 14:35:04 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[In the web]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=371</guid>
		<description><![CDATA[Наткнулся тут случайно на эту не очень новую заметку:
Всем ведь вокруг очевидно, что в онлайн-играх с внутриигровым магазином списки новых и популярных товаров поддерживают ручное редактирование? И подозреваю, что не только в играх.
Так вот, во всех сайтах-магазинах, которые я делал (а за последний год я их наделал немало), поля &#171;хит продаж&#187; или &#171;новинка&#187; были всего [...]]]></description>
			<content:encoded><![CDATA[<p>Наткнулся тут случайно на эту <a href="http://orvind.livejournal.com/104357.html">не очень новую заметку</a>:</p>
<blockquote><p>Всем ведь вокруг очевидно, что в онлайн-играх с внутриигровым магазином списки новых и популярных товаров поддерживают ручное редактирование? И подозреваю, что не только в играх.</p></blockquote>
<p>Так вот, во всех сайтах-магазинах, которые я делал (а за последний год я их наделал немало), поля &laquo;хит продаж&raquo; или &laquo;новинка&raquo; были всего лишь полем-флажком в свойствах товара. Так что не сомневайтесь, да.</p>
<p>(Хотя во всяких Амазонах и Озонах наверняка не ленятся строить эти списки по реальной статистике)</p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/KbqL_F0z89Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/06/unveiling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Хроники StarCraft</title>
		<link>http://lxj.endofinternet.net/blog/2011/03/starcraft-chronicles/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/03/starcraft-chronicles/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 18:00:01 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[Игры]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=363</guid>
		<description><![CDATA[Вот это видео с WCG USA 2005  сегодня появилось на целой куче киберспортивных сайтов:

Вообще-то США были не очень сильны своими StarCraft-игроками &#8212; не то что на фоне Кореи, но даже на фоне Европы. Но гораздо интереснее другое: главные герои этого видео &#8212; Sean &#171;Day9&#8243; Plott, Nick &#171;Tasteless&#187; Plott и Dan &#171;Artosis&#187; Stemkoski за прошедшие [...]]]></description>
			<content:encoded><![CDATA[<p>Вот это видео с WCG USA 2005  сегодня появилось на <a href="http://www.teamliquid.net/forum/viewmessage.php?topic_id=197809">целой</a> <a href="http://www.gosugamers.net/starcraft/news/14787-artosis-and-plott-brothers-in-unique-esports-footage">куче</a> <a href="http://www.reddit.com/r/starcraft/comments/fvue7/footage_of_artosis_day9_and_tasteless_at_wcg_usa/">киберспортивных</a> сайтов:</p>
<p><iframe title="YouTube video player" width="560" height="349" src="http://www.youtube.com/embed/v0fV5KADifY" frameborder="0" allowfullscreen></iframe></p>
<p>Вообще-то США были не очень сильны своими StarCraft-игроками &#8212; не то что на фоне Кореи, но даже на фоне Европы. Но гораздо интереснее другое: главные герои этого видео &#8212; Sean &laquo;Day9&#8243; Plott, Nick &laquo;Tasteless&raquo; Plott и Dan &laquo;Artosis&raquo; Stemkoski за прошедшие 6 лет стали самыми известными и успешными StarCraft/StarCraft II комментаторами.</p>
<p>Artosis: я бросил работу 6 недель назад, чтобы готовиться к WCG. Для меня это &#8212; лучшая часть года.</p>
<p>Day9: я немного перепил RedBull и меня два раза вырвало, но теперь я чувствую себя хорошо и спокоен перед игрой с Artosis&#8217;ом</p>
<p>Tasteless (после проигрыша брату в пером же туре он комментировал на сцене): А мне это понравилось&#8230; Может, мне позволят это делать ещё?</p>
<p>Ну и в каком-то смысле продолжение этого видео:</p>
<p><iframe title="YouTube video player" width="560" height="349" src="http://www.youtube.com/embed/NJztfsXKcPQ" frameborder="0" allowfullscreen></iframe></p>
<p>Кстати, первое видео смотрел во время обеда с телефона &#8212; и как оказалось, первый StarCraft на маленьком экране выглядит отлично :)</p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/aG5gVRPuf3k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/03/starcraft-chronicles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Social Network</title>
		<link>http://lxj.endofinternet.net/blog/2011/02/the-social-network/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/02/the-social-network/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 22:25:42 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[Кино]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=359</guid>
		<description><![CDATA[Никто из людей, работающих в Facebook, включая основателя Марка Цукерберга, не принимал участия в создании фильма. Сопоставить показанное в фильме с реальными судебными баталиями сложно ввиду того, что они велись в закрытом режиме и по окончании процесса все участники подписали соглашение о неразглашении. Прототипы главных героев от фильма дистанцировались, заявив, что он «не про них»
Реальный [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Никто из людей, работающих в Facebook, включая основателя Марка Цукерберга, не принимал участия в создании фильма. Сопоставить показанное в фильме с реальными судебными баталиями сложно ввиду того, что они велись в закрытом режиме и по окончании процесса все участники подписали соглашение о неразглашении. Прототипы главных героев от фильма дистанцировались, заявив, что он «не про них»</p></blockquote>
<p>Реальный Марк Закенберг до сих пор встречается с той же девушкой, с которой он встречался до создания Фейсбука. Но, конечно, в голливудском фильме невозможно объяснить гиковскую мотивацию, поэтому и придумали тот факт, что &laquo;он поссорился с девушкой&raquo;. На самом деле, всё конечно же было <a href="http://yandex.ua/yandsearch?clid=46511&#038;text=just+for+fun&#038;rdrnd=192078&#038;lr=142">just for fun</a>. Но за этим небольшим исключением, <a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C_%28%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%29">фильм</a>, конечно же, отличный, наравне с классикой вроде <a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%80%D0%B0%D1%82%D1%8B_%D0%A1%D0%B8%D0%BB%D0%B8%D0%BA%D0%BE%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9_%D0%B4%D0%BE%D0%BB%D0%B8%D0%BD%D1%8B_%28%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%29">Пиратов Силиконовой Долины.</a></p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/EcMWVQWMmtA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/02/the-social-network/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 и кодеки</title>
		<link>http://lxj.endofinternet.net/blog/2011/01/html5-codecs/</link>
		<comments>http://lxj.endofinternet.net/blog/2011/01/html5-codecs/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 08:56:39 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[In the web]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Технологии]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=354</guid>
		<description><![CDATA[Когда-то я хотел написать заметку про HTML5, кодеки H.264 и мою ненависть к Apple. Но потом мне показалось, что заметка слишком занудная и слишком полна ненависти, и я похоронил её в черновиках. А тут вдруг тема стала актуальной, потому что Google вдруг решил отказаться от поддержки H.264 в Chrome, но за меня всё и так [...]]]></description>
			<content:encoded><![CDATA[<p>Когда-то я хотел написать заметку про HTML5, кодеки H.264 и мою ненависть к Apple. Но потом мне показалось, что заметка слишком занудная и слишком полна ненависти, и я похоронил её в черновиках. А тут вдруг тема стала актуальной, потому что Google вдруг решил отказаться от поддержки H.264 в Chrome, но за меня всё и так <a href="http://softwaremaniacs.org/blog/2011/01/11/no-h264-in-chrome/">написал Иван Сагалаев</a>.</p>
<p>Ситуация с кодеком H.264 напоминает &laquo;славные&raquo; времена Internet Explorer 6. Ты либо делаешь сайты (и браузеры) по &laquo;стандартам&raquo; этого замечательного браузера, либо ты &#8212; Opera. Потом появился Firefox и испортил всю малину пользователям IE6 и верстальщикам сайтов. </p>
<p>Сейчас Firefox и Opera &#8212; это два самых заметных браузера, не поддерживающих формат H.264. По удивительному совпадению Microsoft вновь оказалась по другую сторону баррикад &#8212; а именно среди держателей патентов на этот формат. А вместе с ней там же обнаружилась и известная компания Apple. Та самая Apple, которая не хочет поддерживать Theora в своих браузерах, потому что якобы боится патентных преследований.</p>
<p>Что-то я опять скатываюсь в занудство и ненависть. Но ведь Стив Джобс <a href="http://www.searchengines.ru/blog/archives/010647.html">не может быть не прав</a>, правда?</p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/FDrsf7BZHf8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2011/01/html5-codecs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вдребезги!</title>
		<link>http://lxj.endofinternet.net/blog/2010/12/shatter/</link>
		<comments>http://lxj.endofinternet.net/blog/2010/12/shatter/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 21:51:44 +0000</pubDate>
		<dc:creator>LXj</dc:creator>
				<category><![CDATA[Игры]]></category>

		<guid isPermaLink="false">http://lxj.endofinternet.net/blog/?p=351</guid>
		<description><![CDATA[Предновогодняя неделя проходит с большими потерями. Всё началось с того, что с одной стороны я, глядя на видео про Steam-распродажу вдруг подумал &#171;Defense Grid за  2? The Witcher за 4? А почему бы и нет, не всё же пиратить!&#187;. Параллельно с этим шумел Humble Indie Bundle #2 &#8212; а щёлкнуть по носу умных дядек, [...]]]></description>
			<content:encoded><![CDATA[<p>Предновогодняя неделя проходит с большими потерями. Всё началось с того, что с одной стороны я, глядя на видео про Steam-распродажу вдруг подумал &laquo;Defense Grid за  2? The Witcher за 4? А почему бы и нет, не всё же пиратить!&raquo;. Параллельно с этим шумел Humble Indie Bundle #2 &#8212; а щёлкнуть по носу умных дядек, которые говорят, что линуксом пользуются одни халявщики, всегда приятно!</p>
<p>&#8230;в общем, распродажа ещё не закончилась, а я уже накупил столько игр, сколько я никогда в жизни игр и софта не покупал. Интересно, сколько из них я так и не запущу до следующего крисмас-сейла.</p>
<p>Вот и сегодня за какие-то $2.50 продаётся <a href="http://store.steampowered.com/app/20820/">вот такая прелесть</a>:</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/Vwx2czYmlT0?fs=1&amp;hl=ru_RU&amp;hd=1&amp;color1=0x3a3a3a&amp;color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Vwx2czYmlT0?fs=1&amp;hl=ru_RU&amp;hd=1&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>
<p>Вы не смотрите, что это выглядит, как клон &laquo;Арканоида&raquo;. Это и правда очень красочный продвинутый клон &laquo;Арканоида&raquo; с кучей дополнительных элементов, управляемой гравитацией и боссами (!). Shatter сначала подкупает своей кажущейся простотой (ну &laquo;Арканоид&raquo; же!), а затем неожиданно раскрывает интересные и глубокие возможности геймплея. При этом он очень эффектно оформлен &#8212; музыка и графические эффекты на высоте &#8212; но при этом не старается показывать красивые картинки исключительно ради самого процесса, <a href="http://www.youtube.com/watch?v=6Vh7WMnMU_w">как, к примеру Polynomial </a> (по ссылке &#8212; настоящий взрыв цвета!). Последний, при всём уважении к его <a href="http://dmytry.com/index.html">создателям</a>, сильно сдаёт по части затягивающего геймплея (по крайней мере, по моим впечатлениям от видео).</p>
<p>Впрочем, меня пытаются убедить, что Shatter &#8212; это игра на один вечер. Я пока ещё немного в него успел поиграть &#8212; спешу опубликовать заметку быстрее, пока ещё действует скидка &#8212; но даже на один вечер, да за такую низкую цену фана эта игра доставит предостаточно</p>
<img src="http://feeds.feedburner.com/~r/LXj/~4/RDKpd7SnUJk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://lxj.endofinternet.net/blog/2010/12/shatter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

