Amazon byteflow http://blog.piranha.org.ua Пробегающие байты Sun, 18 Mar 2007 16:57:00 +0000 http://wordpress.org/?v=2.0.8 en Django без Django http://blog.piranha.org.ua/2007/03/18/django-without-itself/ http://blog.piranha.org.ua/2007/03/18/django-without-itself/#comments Sun, 18 Mar 2007 16:57:00 +0000 Alexander Solovyov Python web jinja colubrid routes sqlalchemy formencode inspired markdown post http://blog.piranha.org.ua/2007/03/18/django-without-itself/ Где-то с месяц назад мне показали Jinja - систему темплейтов, которую можно назвать слизанной с Джанги с некоторыми дополнениями (на ходу так не вспоминаются отличия, но они есть).

А вот только что я наткнулся на Colubrid, который является обработчиком запросов для веба, который разбирает урлы, GET/POST запросы и т.д. Ну и, судя по документации и вообще сайту, порядочно inspired Джангой. Написан тем же автором, специально чтобы отказаться от Джанго. При этом предоставляет парочку очень интересных способов разбора адресов (хех, в том числе и routes).

Ну и напоследок статья о том, как написать сайт без фреймворка. Берётся набор инструментов и всё склёпывается в подобие фреймворка. :D Про этот самый Colubrid, Jinja, SQLAlchemy, markdown и FormEncode (хм, вот что это - я еще не знаю, надо посмотреть).

]]>
http://blog.piranha.org.ua/2007/03/18/django-without-itself/feed/
Сессии в Django http://blog.piranha.org.ua/2007/03/18/sessions-in-django/ http://blog.piranha.org.ua/2007/03/18/sessions-in-django/#comments Sun, 18 Mar 2007 16:06:23 +0000 Alexander Solovyov Python Programming web login_id sessions scalability drop sha256 dear smith john http://blog.piranha.org.ua/2007/03/18/sessions-in-django/ Сменил я тут недавно работу - раньше работал администратором никсовым, а сейчас - программистом на питоне. Даже, если говорить точнее, на Django - как раз использую то, к чему последний почти год (где-то с апреля-мая) сам не только пристально присматривался, но и даже пытался что-то писать. ;) Понятное дело, что работа раскрывает взор на кучу вещей, которых просто так я бы не узнал.

И из самого интересного - это то, как мы поступили с пользователями залогинившимися. Я раньше использовал только встроенный django’вый фреймворк sessions. Эта штука очень удобна, на самом деле даёт возможность вообще ни о чём не думать (как выразился… CTO? ну не важно, выразился - when you start using sessions, you can’t drop them. Прям наркотики ;)). Но у них есть один порядочный недостаток, над которым я раньше никогда не задумывался.

Закешировать можно, как понятно любому человеку в здравом уме и светлой памяти, только те страницы, у которых всё (абсолютно всё) передаётся в GET-запросе. То есть любые параметры, которые приходят из формы или берутся из базы по какой-то внутренней логике, которую нельзя привязать к GET’у, мешают кэшировать документ. Не дают кешировать его вообще. И это, понятное дело, очень сильно убивает производительность, т.н. scalability.

Сами сессии работают довольно просто - генерируется какой-то уникальный ключ (md5, sha256 - это не важно), и ставится в куки пользователю. С этим же ключём в базу заносится запись, содержащая словарь каких-то переменных. Обычно - имя, фамилия, емейл там и всё прочее. Становится понятно, почему любые страницы, на которые приходят пользователи с куки с login_id, не могут быть закешированы.

Чтобы избежать такой потери производительности (цифр у меня нету, но есть все заверения о том, что тесты были проделаны, от людей, которые запускали очень крупный сайт - собственно, от этого CTO и его друзей), применяется очень хитрая штука. Сайт разделяется не на две (анонимный/вошедший посетитель), а на три (анонимный/вошедший/изменяющий посетитель). Изменяющий - это условно, в том смысле, что он либо там пишет себе в блог, либо отсылает себе новый пароль, либо что-то ещё. И ставится любому залогинившемуся посетителю в куки не только его login_id, но и прочая не сильно важная информация (которую можно подсмотреть в профиле пользователя) - как то его имя, фамилия, возраст и прочее. И тогда странички и показывают персонализированное “Hello, dear John Smith”, и не делают запросов в базу (ну и кешируются).

Но когда пользователю приходит идея что-то изменить - тогда и делается проверка этого login_id. Но так как POST-форму и так нельзя никак закешировать, никаких потерь это нам не приносит. И волки целы, и овцы сыты.

]]>
http://blog.piranha.org.ua/2007/03/18/sessions-in-django/feed/
Bugatti http://blog.piranha.org.ua/2007/03/18/bugatti/ http://blog.piranha.org.ua/2007/03/18/bugatti/#comments Sun, 18 Mar 2007 12:30:00 +0000 Alexander Solovyov auto bugatti head alfa races marque instances bugattis winning http://blog.piranha.org.ua/2007/03/18/bugatti/ Bugattis flooded European racetracks for almost two decades, winning more races than any other marque. But in those instances when Bugatti went head-to-head with Alfa, Bugatti usually lost.


The P2 quickly dominated racing and continued to be competitive over a period of six years. The Type 35 Bugatti also dates from 1924, but in virtually every instance where the Alfa and Bugatti raced together, the Alfa won.

Here.

]]>
http://blog.piranha.org.ua/2007/03/18/bugatti/feed/
Kamaelia http://blog.piranha.org.ua/2007/03/16/kamaelia/ http://blog.piranha.org.ua/2007/03/16/kamaelia/#comments Fri, 16 Mar 2007 08:43:29 +0000 Alexander Solovyov Python Programming kamaelia introduction sourceforge http://blog.piranha.org.ua/2007/03/16/kamaelia/ Похоже, интересная штука. Даже очень.

http://kamaelia.sourceforge.net/Introduction

]]>
http://blog.piranha.org.ua/2007/03/16/kamaelia/feed/
Mac OS X http://blog.piranha.org.ua/2007/03/02/mac-os-x/ http://blog.piranha.org.ua/2007/03/02/mac-os-x/#comments Fri, 02 Mar 2007 15:10:14 +0000 Alexander Solovyov misc используют http://blog.piranha.org.ua/2007/03/02/mac-os-x/ Насмотрелся я тут на людей на новой работе, которые её используют. Стало реально интересно, надо будет самому как-то попробовать.

Думаю, если проапгрейдить комп интеловским процом, то можно вполне себе и поставить.

]]>
http://blog.piranha.org.ua/2007/03/02/mac-os-x/feed/
Поддерживаю? http://blog.piranha.org.ua/2007/02/13/tema/ http://blog.piranha.org.ua/2007/02/13/tema/#comments Tue, 13 Feb 2007 15:43:00 +0000 Alexander Solovyov misc people http://blog.piranha.org.ua/2007/02/13/%d0%bf%d0%be%d0%b4%d0%b4%d0%b5%d1%80%d0%b6%d0%b8%d0%b2%d0%b0%d1%8e/ Тёму?

Еще как поддерживаю. Вообще нравится и ководство, и бизнес-линч очень-очень-очень. Хорошо люди работают. А дизайн people.net.ua… ну не знаю, может это я один не понимаю, нафига так всё раскидано.

А так - всё очень и очень.

]]>
http://blog.piranha.org.ua/2007/02/13/tema/feed/
Кстати http://blog.piranha.org.ua/2007/02/11/%d0%ba%d1%81%d1%82%d0%b0%d1%82%d0%b8/ http://blog.piranha.org.ua/2007/02/11/%d0%ba%d1%81%d1%82%d0%b0%d1%82%d0%b8/#comments Sun, 11 Feb 2007 12:09:10 +0000 Alexander Solovyov misc talmuth http://blog.piranha.org.ua/2007/02/11/%d0%ba%d1%81%d1%82%d0%b0%d1%82%d0%b8/ Talmuth тоже переполз (интересно, совсем или как я?) на отдельный блог. :)

]]>
http://blog.piranha.org.ua/2007/02/11/%d0%ba%d1%81%d1%82%d0%b0%d1%82%d0%b8/feed/
Удобная штука http://blog.piranha.org.ua/2007/02/06/kyivstar-redial/ http://blog.piranha.org.ua/2007/02/06/kyivstar-redial/#comments Tue, 06 Feb 2007 20:20:39 +0000 Alexander Solovyov Useful paid «proit» помощью http://blog.piranha.org.ua/2007/02/06/kyivstar-redial/ Оператор мобильной связи компания «Киевстар» ввел услугу «Перезвони мне», с помощью которой абонент, сумма на счету которого составляет менее 1 грн., может отправить бесплатный запрос знакомому абоненту сети «Киевстар» с просьбой перезвонить. Об этом «proIT» сообщили в пресс-службе компании.

Для того чтобы воспользоваться услугой, необходимо отправить запрос в формате *130*38(код сети «Киевстар»)(номер абонента-получателя)# и нажать кнопку «Вызов». После чего абонент, которому был направлен запрос получает sms-сообщение с просьбой перезвонить на номер отправителя. В свою очередь на номер отправителя приходит sms -сообщение, которое проинформирует об успешности доставки запроса выбранному абоненту.

Услуга действительна для pre-paid абонентов, у которых менее 1 грн. на счету, а также для контрактных абонентов, даже если у них на счету отрицательная сумма. В течение одних суток запрос «Перезвони мне!» можно отправить 5-ти абонентам сети «Киевстар» (считаются только успешные запросы). Пользование услугой бесплатное.

А еще можно почитать о тарифах PEOPLEnet вот тут.

]]>
http://blog.piranha.org.ua/2007/02/06/kyivstar-redial/feed/
Django render_to_response http://blog.piranha.org.ua/2007/01/28/django-render_to_response/ http://blog.piranha.org.ua/2007/01/28/django-render_to_response/#comments Sun, 28 Jan 2007 18:26:21 +0000 Alexander Solovyov Python Programming render_to_response requestcontext output things things people people template http://blog.piranha.org.ua/2007/01/28/django-render_to_response/ Есть в Django одна очень часто используемая мной функция - шорткат render_to_response. По сути, её параметрами является имя темплейта и словарь передаваемых в него переменных. И вот переменные можно передать двумя путями. Либо явно указать его здесь в словаре, либо заставив рендерер использовать в качестве обработчика контекста класс django.template.RequestContext и в переменной TEMPLATE_CONTEXT_PROCESSORS в settings указав необходимые функции. Все переменные, которые вернут эти функции, будут видны в любом темплейте, который отрисовывается с помощью RequestContext‘а.

И вот тут начинается куча лишнего кода. Потому что каждый вызов rendertoresponse начинает выглядеть так:

return render_to_response('cool/template.html',
                          {'people': people, 'things': things},
                          context_instance=RequestContext(request))

Меня реально очень раздражала необходимость писать каждый раз этот самый context_instance. И сегодня придумался декоратор, который делает всю нудную работу. :]

from django.shortcuts import render_to_response
from django.template import RequestContext

def render_to(tmpl):
    def renderer(func):
        def wrapper(request, *args, **kw):
            output = func(request, *args, **kw)
            if not isinstance(output, dict):
                return output
            return render_to_response(tmpl, output,
                                      context_instance=RequestContext(request))
        return wrapper
    return renderer

Теперь отрисовывать всё можно с помощью декоратора:

@render_to('cool/template.html')
def view(request):
    return {'people': people, 'things': things}

Если функция вернёт словарь - render_to обернёт его в render_to_response и отпустит на волю, а если что-то другое (к примеру, HttpResponse - перенаправление какое-нибудь) - то просто отпустит на волю. :] Для меня это оказалось очень удобным решением.

P.S. Ну и как водится, через минут 10 после всего я обнаружил, что в принципе изобрёл велосипед - вот тут уже есть подобный декоратор. Хотя мой велосипед просто проще. ;)

]]>
http://blog.piranha.org.ua/2007/01/28/django-render_to_response/feed/
Поворачиваемость http://blog.piranha.org.ua/2007/01/27/cornering/ http://blog.piranha.org.ua/2007/01/27/cornering/#comments Sat, 27 Jan 2007 18:12:36 +0000 Alexander Solovyov misc http://blog.piranha.org.ua/2007/01/27/cornering/ Когда ты видишь дерево, о которое сейчас ударишься, - это называется недостаточная поворачиваемость. А вот когда только слышишь и чувствуешь - это избыточная. ;)

]]>
http://blog.piranha.org.ua/2007/01/27/cornering/feed/