Здание, в котором мы находимся, исчезнет с лица земли через десять минут. Возьмите одну часть 98%-ной дымящей азотной кислоты, и смешайте с тремя частями концентрированной серной кислоты. Делать это надо на ледяной бане. Затем добавляйте глицерин по капле из глазной пипетки. Вы получили нитроглицерин.

Я знаю это, потому что это знает Тайлер.

Смешайте нитроглицерин с опилками, и вы получите отличный пластит. Некоторые предпочитают смешивать нитроглицерин с ватой и английской солью. Это тоже дает неплохой результат. А некоторые мешают нитру с парафином. Но при этом получается ненадежная взрывчатка.

Мы с Тайлером находимся на вершине небоскреба “Паркер-Моррис”. Ствол пистолета засунут мне в рот. Издалека доносится звук бьющегося стекла.
Загляни за край крыши. День пасмурный, даже на этой высоте солнца не видно. Это самое высокое здание в мире, так что на вершине его холодно даже летом.

Чак Паланик, «Бойцовский клуб»

Все любят Bootstrap. В своё время я его тоже полюбил, и начал искать, как бы его лучше всего прикрутить для форм в Django. Оказалось, что есть сразу несколько пакетов, которые в этом помогают — тогда мне лень было разбираться, и я просто начал использовать вот этот django-bootstrap

Сегодня я решил ещё раз взглянуть на всё это разнообразие, и оказалось, что сам разработчик django-bootstrap уже забросил его развитие, и рекомендует django-crispy-forms. django-crispy-forms — это продолжение развития django-uni-form. django-uni-form в своё время хвалили в докладе Advanced Django Form Usage на DjangoCon 2011, на который я уже ссылался. Если вы этот доклад не видели — очень советую посмотреть, там рекомендуют довольно много чего полезного.

В общем, взглянув на описание django-crispy-forms, мне даже лень стало углубляться в различия django-bootstrap-form и django-bootstrap-toolkit. Оба можно поставить через pip, оба добавляют template filter для вывода формы (кстати, django-bootstrap вместо этого определял свои Form-классы). Но django-crispy-forms умеет всё это, плюс позволяет удобно управлять группировкой элементов форм, определять кнопки непосредственно в коде, поддерживает различные CSS-фреймворки и вообще выглядит как must-have пакет.

AppEngine существует уже 4 года, но до сих пор страдает от каких-то странных детских болезней. Самое очевидное — это «голые» домены: они просто не поддерживаются. Можно только разместить сайт на www.ваш-домен.com и изощряться с редиректами. Казалось бы, в 2012 году уже пора бы избавляться от www в адресах, но тут от этого никуда не деться. Запрос в багтрекере AppEngine’а висит с 2008 года, ни о каких планах Гугла это исправить не слышно.

Или вот в прошлом году выпустили поддержку Python 2.7, а вместе с ней — поддержку нескольких полезных библиотек (в том числе PIL) и возможность обрабатывать запросы одним инстансом в несколько потоков (что довольно важно, поскольку чем больше инстансов запускается, тем дороже обходится сайт). Казалось бы, можно радоваться? Как бы не так, перейдя на новую версию Python’а разработчики с удивлением обнаруживают, что время выполнения скриптов увеличивается в 2-3 раза, а когда для ответа на запрос AppEngine запускает новый инстанс, то это может занимать 30 секунд и больше для тяжёлых фреймворков, вроде Django-nonrel. Вот этот ответ на StackOverflow отлично описывает ситуацию. Главная проблема в том, что использование многопоточности должно было сгладить увеличение расходов из-за новой модели ценообразования, введённой в прошлом году, но в результате от Python 2.7 толку до сих пор немного.

Есть и другие проблемы — тормозной SDK, отсутствие поддержки SSL и некоторые смешные баги, вроде такого.

При всём этом, AppEngine по-прежнему остаётся во многом интересной и перспективной платформой. Но скорость, с которой его разработчики решают все эти проблемы, сильно настораживает.

Когда обсуждают Google AppEngine и его стоимость, то обычно ведут речь об оплате процессорного времени. Изначально биллинг считал, сколько процессорного времени тратилось на обработку запросов, и за эти самые секунды выставлял счёт. В последствии, когда AppEngine вышел из стадии бета-тестирования, модель поменялась: Google стали брать за время работы инстансов, обслуживающих запросы. Но это всё на самом деле не интересно, и заметка будет совсем о другом :)

Один из основных компонентов AppEngine — это хранилище данных. Стандартным для новых приложений является High Replication Datastore, о нём и пойдёт речь. Замечу, что есть ещё Google Cloud SQL (по сути — «MySQL в облаке»), но он пока что находится на стадии тестирования, и сколько он будет стоить через год, ещё неизвестно довольно дорогой, да и кому этот SQL нужен (шутка). Модель рассчётов за использование хранилища данных такова:

Стоимость Бесплатная квота
Хранение данных $0.24/гигабайт/месяц 1 гигабайт
Операции записи $0.10 за 100k операций 50k операций/день
Операции чтения $0.07 за 100k операций 50k операций/день
«Малые» операции $0.01 за 100k операций 50k операций/день

В приведённой выше таблице под операцией чтения или записи имеются в виду низкоуровневые операции. К примеру, выполнение запроса к базе — это одна операция чтения + операция чтения на каждую возвращённую запись. Если же делать запрос, возвращающий не записи, а только ключи, то это будет посчитано как операция чтения + малая операция на каждую запись. Создание новой записи — это 2 операции записи + 2 операции записи на каждое индексированное поле + 1 операция записи на каждый композитный индекс.

Тут мы приходим к интересному выводу: если вы пробуете делать различные «игрушечные» проекты на AppEngine (чем я занимался в последнее время), и не хотите выходить за пределы бесплатных квот, то приходится довольно сильно ограничивать себя в количестве объектов, которые хочется поместить в базу: стоит туда запихнуть какую-то тысячу записей, как вы уже приближаетесь к суточному пределу операций записи. А если эти объекты ещё и должны несколько раз обрабатываться в течении дня, то уж точно нужно задумываться о переходе на платную модель.

Для серьёзных проектов, конечно, желательно приблизительно знать, с каким объёмом данных вам придётся работать в течении дня, и во сколько это будет обходиться. В принципе, можно очень приблизительно прикинуть, что запись несколько тысяч объектов (в пределах одной Django-модели) будет обходиться в 10 центов, что в принципе не так уж и много. Учитывая, что перейдя на платную модель, приходится тратить не менее 8 долларов в месяц, в пределах этого бюджета можно оперировать довольно большими объёмами данных.

На самом деле, при определённых объёмах данных (несколько тысяч записей) довольно легко хранить их в обыкновенных списках и словарях, которые можно сериализовать в JSON или pickle-объекты, и хранить в memcache, время от времени сохраняя в базу. Для волатильных данных такой подход будет очень даже актуален.

Самое главное — данная модель ценообразования основана на принципе «плачу за то, что использую». Если в один день у вас большой поток данных, то на следующий вы вполне можете уложиться в бесплатные квоты, никакие настройки при этом менять не надо. Amazon Dynamo DB, к примеру требует резервировать определённый набор ресурсов, и постоянно за них платить. Если на том же Amazon EC2 хостить инстансы с MongoDB, то принцип тарификации будет тот же. В итоге, использование AWS требует определять максимальную нагрузку, и всегда её оплачивать, с AppEngine’овским же датастором вы задаёте лимиты, но платите только за те ресурсы, которые потребили.

Like, totally!

Новый канал Фелиши Дэй и её друзей

В начале года я купил Android-смартфон LG Optimus One, а на днях какой-то андроидный телефон купил мой брат. Для него я сделал список приложений, которые за это время накопились на моём телефоне, и заодно публикую этот список здесь. В него не входят клиенты для всяких твиттеров, дропбоксов и прочих форскверов, ну и те приложения, которые стоят на LG-шных смартфонах по умолчанию.

(далее…)

django-mediagenerator — менеджер статических файлов «от создателей» Django-nonrel. Сейчас уже все знают, что для управления статическими файлами есть django.contrib.staticfiles, но на самом деле стандартным он стал совсем недавно, в Django 1.3, а до этого успели написать несколько разных решений. Что же такого интересного в django-mediagenerator, что отличает его от staticfiles?

(далее…)

В последнее время активно осваиваю Google AppEngine и Django-nonrel. Писать под nosql-БД — это, оказывается, весьма интересно и познавательно. Если реляционные БД хорошо изучены, и различные аспекты представления данных в табличном виде давно задокументированы, то переориентировашись на BigTable или Mongo, приходится думать самому — как бы так распихать данные по таблицам, чтобы было и эффективно, и без JOIN’ов.

Но нереляционные БД — это не только денормализация табличек, это ещё и дополнительные ограничения. Например, через некоторое время работы с AppEngine, я наткнулся на вот такое:

Запрос может использовать фильтры неравенства (< , <=, >=,>, !=) только по одному свойству среди всех своих фильтров.

(далее…)

Один из самых познавательных докладов на недавнем DjangoCon’е — Advanced Django Forms Usage

Вот, к примеру код, подобный которому можно встретить в любом туториале по Django:

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

Число строк кода сократилось с 9 до 6, и форма инстанцируется всего в одном месте. Ниже я привёл несколько полезных сниппетов из того же доклада:

(далее…)

Что-то я с апреля никак не опубликую эту заметку. Надо бы наконец-то привести её в порядок и выложить :)

Экран, конечно, не идеально белый, и требует хорошего освещения (впрочем, как и обычные книги). Но читать с него приятно. Размер 6″ меня вполне устраивает — для чтения PDFов всё равно лучше накопить на планшет. Для художественных книг в PDF также помогает вот эта программа (см. также эту заметку)

Управление не идеальное, ибо в 2011 году устройство без тача кажется слегка устаревшим. Но совсем неудобным его не назвать. Наверное, в следующем Kindle будет тач, но учитывая периодичность выхода новых поколений Kindle (кроме DX) — они сменяются примерно раз в полтора года, так что следующий Kindle нужно было бы ждать ещё год (купил я его в марте).

Кожаная обложка смотрится весьма солидно, хорошо держится на креплении, и главное — имеет выдвижной фонарик, который питается от самого устройства. Этой подсветки почти хватает для комфортного чтения (всё-таки правый верхний угол освещён хорошо, а левый нижний — слабо). За такую обложку не жалко и 60$… Почти :) Не хватает только надписи «DON’T PANIC» (далее…)

Следующая страница »