вторник, 8 апреля 2008 г.

Вкратце о Google App Engine.

Google открыл платформу для создания и запуска server-side приложений на серверах Google. Ключевые моменты:

Готовое окружение для программирования на Python, c некоторыми ограничениями.


Python запускается в sandbox, который не позволяет использовать некоторый функционал, относящийся к OS — осуществлять запись в файловую систему, использовать сокеты, threads, fork, exec, системные вызовы. Учитывая то, что приложение как бы висит в воздухе, такие ограничения объяснимы. В связи с этим некоторые модули заменены на заглушки.
Подозреваю, такая же судьба у модулей, написанных на C. Я пока что не пробовал импортировать такие модули, но без знания архитектуры и набора системных библиотек той машины, на которой будет исполняться код, такие модули бесполезны.
Вместо низкоуровневой работы с сокетами предоставлен модуль для запросов по HTTP. Отдельный модуль для email. Вместо файловой системы — Google BigTable с SQL-like интерфйсом (об этом ниже). Все остальное — обычный Python 2.5. Django — в комплекте :). Методы развертывания — от простого print до WSGI-приложения.

Вместо файловой системы - распределенное хранилище Google BigTable.


От файловой системы остаются только те статические файлы, которые загружены вместе с приложением — их можно читать. Для всего остального — BigTable. API очень смахивает на Django DB/Model API. Язык запросов — GQL — на SQL. Все просто и понятно.

Интеграция с Google Accounts


Позволяет аутентифицировать пользователей, используя механизм, принятый в Google; доступны некоторые данные текущего залогиненного пользователя Google, работающего с приложением. Что это дает? Догадайтесь.

Выводы


В-общем, к многочисленным API Google добавил возможность развертывания практически любых пользовательских приложений на своих серверах. Ограничения касаются только приложений, для которых необходимо низкоуровневое сетевое взаимодействие (за пределами HTTP). Ну или требующих некоторой специфической функциональности, типа обработки изображений, для которой обычно используются модули, реализованные на C.

Немаловажно, что бесплатный пакет — 500 Мб места и 5 млн. хитов в месяц. Цены на то что сверху пока не озвучены, но что-то мне подсказывает, что многие хостеры будут не очень довольны таким оборотом событий. А как все это приятно программистам на Python, об этом вообще речи не идет :)

В-общем, по-моему это — бомба. Не буду пока писать про большое поле возможностей для всякой социальщины вокруг Google Accounts и всяких приложений Google, про то, как это касается Facebook и т.п. - пока не все мысли созрели. Платформа, конечно, заслуживает более подробного обзора, вернусь к этому когда получу там аккаунт и попробую.

Ну а сейчас — дискотекакино по теме.




среда, 26 сентября 2007 г.

Социальный веб: “Мы уже на Марсе”.

Вслед за изобретением распределенных методов аутентификации, таких как OpenID сообщество закономерно озаботилось также и возможностью этих пользователей связывать разные свои ипостаси воедино, со всеми причитающимися хвостами типа списка френдов. Идея уже давно летает в воздухе, и даже реализована много раз, правда пока не в глобальных масштабах, а в рамках отдельных сервисов. Теперь сообщество, точнее было бы сказать "Те Же Лица", дошло до того чтобы собрать все эти наработки и выкатить стандарт.

среда, 29 августа 2007 г.

javascript.options.strict в Firefox

Дин Эдвардс написал о странных тормозах у некоторых пользователей, открывающих его сайт в Firefox, что лечилось отключением Firebug.
Причина была в установке опции javascript.options.strict в конфигурации Firefox (about:config).

Если эта опция включена, Firefox кроме серьезных ошибок в скриптах будет сообщать о возможных ошибках. Если при этом в консоли Firebug включена опция Show JavaScript Warnings, то эти сообщения вываливаются в консоль, что и порождает описанные тормоза.

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

В-общем, отключайте эти опции если вы просто ходите по вебу, но обязательно включайте их при тестировании собственных скриптов. Можете увидеть много интересного.

пятница, 11 мая 2007 г.

Итерирование по свойствам объекта в JavaScript.

Любой объект в JavaScript может быть расширен в рантайме. Более того, прототип (свойство prototype) любого объекта может быть также расширен, что влечет за собой изменение свойств всех объектов, унаследованных от измененного. Все добавленные в объект либо в прототип объекта-предка свойства и методы будут видны при использовании for (name in obj) {...}.

четверг, 3 мая 2007 г.

JSON validation: the Schema By Example.

[lang_en]Есть по-русски
There are a lot of JSON data currently around, and virtually no standard means to validate it against a schema, the way everybody accustomed to in the XML world.

A fair number of proposals for a schema language occurred recently, and I'm going to add my 5 cents. The idea is that the schema should be expressed as JSON (no need to invent languages), and represent an example of a valid data structure of the data to be validated against. I call this "Schema By Example".[/lang_en]
[lang_ru]English version available
Формат JSON стал очень популярен в сфере обмена данными, но до сих пор пока не существует стандартных механизмов валидации, таких как схема, к каким люди уже давно привыкли, если имеют дело с XML.

Немало хороших предложений языка схемы для валидации JSON возникло в последнее время, и я хочу добавить к ним еще кое-что от себя. Моя идея в том, что схема должна быть описана в том же формате JSON (нет нужды изобретать новые языки), и представлять собой пример правильной структуры данных. По этому примеру и следует проверять действительность полученных данных. Назовем это "Схема по примеру".[/lang_ru]

вторник, 24 апреля 2007 г.

Интерфейс Python для Flickr API.

Некоторое время назад нужно было использовать Flickr API. Конечно, есть и готовые Python API для Flickr, но тут сработал синдром NIH и захотелось чего-то своего, понятного и простого. Публикую как иллюстрацию развития идеи от простого к усложнению, но не слишком сложному :) Опять же, как у меня часто получается, тут скорее не про Flickr, а про Python.

вторник, 17 апреля 2007 г.

Удаленная отладка приложений на Python в Eclipse с Pydev Extensions

Тем кто до сих пор не определился с тем, какой IDE для Python лучше всех, скажу, что лучший IDE — это Eclipse с плагином Pydev. Функции и вкусности перечислять не буду, скажу только что всё чего вам скорее всего захочется, в нем есть, и можно органично использовать все остальные прелести Eclipse, например интеграцию с системой контроля версий. Можете со мной спорить, но это мой блог, что хочу то и пишу :)

К базовому бесплатному Pydev также существует расширение Pydev Extensions, которое, кроме того что все-таки уже стоит денег — $42,5, на которые финансируется разработка "бесплатного" Pydev — хотя, по правде говоря, позволяет работать и бесплатно, только настойчиво напоминая о том, что хочет денег. Pydev Extensions дополняет базовый пакет некоторыми приятными возможностями, среди которых — возможность удаленной отладки. Под удаленной я имею в виду отладку во внешнем по отношению к Eclipse процессе. Он может работать как на той же машине, на которой работает Eclipse, так и на удаленной, "разговаривая" с Eclipse по TCP/IP. Простая отладка возможна и без использования Pydev Extensions.

пятница, 23 марта 2007 г.

ctypes: использование произвольных функций из библиотек на C из Python

Часто бывает, что хочется использовать функции из библиотеки на C, но для нее не написан модуль-обертка для Python, либо по какой-то причине нам не хочется использовать то что написано. Что ж, выход есть. Модуль ctypes (который включен в стандартную библиотеку Python начиная с версии 2.5, а до этого доступен в качестве стороннего модуля) позволяет нам вызывать практически что угодно откуда угодно.

понедельник, 22 января 2007 г.

OpenID & phishing, продолжение

Идею, описанную во вчерашнем посте, подхватил Дмитрий Шехтман.
Он значительно упростил ее, также добавив некоторые аспекты, о которых я до этого не подумал. Разберу его замечания, и добавлю кое-что от себя.

воскресенье, 21 января 2007 г.

OpenID & phishing

Если вы не в курсе, спецификация OpenID версии 2.0 уже в финальной стадии. Учитывая усиливающийся buzz, касающийся OpenID, мы скоро увидим очень много мест, где эту валюту принимают (я сам тоже собираюсь приложить к этому руку :).
Если вы не в курсе о чем речь, то дальнейшее будет довольно сложно понять :)

понедельник, 25 декабря 2006 г.

10 ловушек в Python (10 Python pitfalls)

В продолжение статьи о "бородавках" предлагаю вам перевод другой хорошей статьи на эту тему — 10 Python pitfalls автора Hans Nowak. Существует еще немало подобных статей, но эти две я бы выделил благодаря их ясности и важности адресуемых проблем.

Итак, последняя статья про ловушки, и с наступающим Новым Годом!

пятница, 8 декабря 2006 г.

Публичная бета Firebug 1.0

Вышла публичная бета Firebug 1.0. Что могу сказать. Автор Joe Hewitt жжот. Слов нет. Кто еще не знает, что такое Firebug, и при этом программирует что-то на client-side JavaScript, то очень советую посмотреть. Предыдущая версия уже произвела революцию. Новая просто взрывает мозг.

Дополнительная авторизация для Django. One-time code.

Термин one-time code (одноразовый код) известен из криптографии. Это — некий код произвольного содержания, который запускает процесс, который ожидает появления этого кода. После разглашения кода и запуска процесса, код становится бесполезен, и больше не действует. Вы наверняка слышали о таких фразах как "В Сантьяго идет дождь", "Над всей Испанией безоблачное небо", "Начинайте восхождение на гору Ниитака", которые, по сути не содержащие никаких важных сведений, оказали существенное влияние на историю XX века. Это — одноразовые коды.

Чем могут быть полезны одноразовые коды для веб-программирования? Применений может быть много. Первое, что приходит в голову — это возможность авторизовать посетителя, предоставившего одноразовый код, не требуя от него обычных логина и пароля. Например, по заходу по ссылке, которую мы посылаем ему по email, которая ведет на часть сайта, требующую авторизации, и содержащую одноразовый код. Возможны и другие сценарии, например, запуск специального механизма, устанавливающего скидку клиенту в интернет-магазине, или перенаправление клиента на некую "секретную" страницу, на которую нельзя попасть по ссылке.

среда, 29 ноября 2006 г.

“Бородавки” в Python (Python Warts)

Эта статья - перевод известной статьи Andrew Kuchling — Python Warts.
Слово "wart" дословно переводится с английского как "бородавка", и именно в этом контексте используется в английском программистском сленге. Словарь Lingvo также содержит аналогичный перевод этого слова в том же контексте, уже для русского программистского сленга. В своей практике я такого термина в русском языке не встречал, но поверю словарю и не стану изобретать более "приятного" перевода :)

Python Warts — это то, что обязательно к прочтению начинающими программистами на Python, но также не будет вредно и для опытных зубров.

вторник, 28 ноября 2006 г.

Важное дополнение к статье о трансляции кодировок — HTML character entities.

В предыдущей статье я показал, как можно написать middleware для Django, которая транслирует данные запроса из "внешней" кодировки во "внутреннюю" и обратно. Обсуждение статьи в LiveJournal вскрыло серьезный недостаток первого подхода к решению данной проблемы.

вторник, 21 ноября 2006 г.

Трансляция charset в объектах request и response в Django

В одном из Django-приложений, которое я разрабатываю, возникла ситуация, когда очень хочется, чтобы сайт общался с клиентами в кодировке UTF-8.

При этом стандартной кодировкой системы (шаблоны, данные в базе данных), в которой работает это приложение, является Windows-1251. Конвертировать данные в базе и т.п. - not an option, т.к. с этими данными работает еще куча уже написанного софта, который так привык. Соответственно, во избежание глюков с кодировкой, желательно, чтобы DEFAULT_CHARSET был Windows-1251, и все внутренние операции со строками и базой были в этой кодировке.

Что делаем? Пишем middleware.

пятница, 17 ноября 2006 г.

ScientificPython, распределенные вычисления

Разработчики ScientificPython включили в новую версию модуль для распределенных вычислений (анонс). Для организации вычислений запускаются master и slave-процессы, мастер раздает задания, slave их выполняют, и master собирает результаты. В принципе, должно быть не очень сложно организовать цепочки, в которых master-процессы могут быть slave для других master-процесов. Для коммуникации используется Pyro, что позволит распределить процессы по неограниченному количеству машин. Само собой, задачи могут быть и не только "научные", а сугубо практические. К примеру, распределенные поисковые алгоритмы.

вторник, 7 ноября 2006 г.

Декораторы функций и методов в Python

Начиная с версии 2.4 в Python введена новая синтаксическая конструкция — декоратор функции/метода. С ее помощью можно "декорировать" функции — дополнять их новой функциональностью без внесения изменений в сами функции и методы. Слово "декоратор" часто используется в связи с паттеном Декоратор, описанным в знаменитой книге "Банды четырех". Это не совсем тот случай, имейте в виду, хотя некоторое сходство имеется. В этой статье я опишу механизм декораторов и рассмотрю примеры его применения.

четверг, 2 ноября 2006 г.

Дескрипторы в Python

Попробую дать определение, что такое классы-дескрипторы. Классы-дескрипторы — это классы "нового стиля" (new-style classes), которые определяют один или несколько специальных методов, перечисленных ниже. Эти методы переопределяют процедуру доступа к атрибуту класса через класс или экземпляр класса (класс тоже нового стиля) в том случае, если в качестве этого атрибута выступает экземпляр класса-дескриптора. Кто понял это с первого раза, тому пирожок.

понедельник, 9 октября 2006 г.

Межпроцессная диспетчеризация событий в web-приложениях Python, часть 2

В первой статье цикла о межпроцессной диспетчеризации событий в Python я описал ситуацию с долгоживущими процессами веб-приложения. При необходимости поддержки данных состояния приложения в такой системе нам нужен механизм, позволяющий передавать события, возникшие в одном из процессов другим процессам, подобно тому как события передаются внутри процесса. В этом механизме также будет использоваться PyDispatcher, как средство генерирования и диспетчеризации событий внутри всех процессов, участвующих в обмене.

Постоянные читатели