воскресенье, 20 марта 2011 г.

Поведение MongoKit для DBRef

Столкнувшись с проблемами в MognoKit при использовании вложенных массивов DBRef'ов и словарей с ними, у меня порой возникали ошибки при получении данных с этих документов. Я решил немного разобраться в этом поведении. Решил я идти не путем чтения кода, потому что, это заняло бы очень много времени, а так сказать, экспериментальным путем.

Начну по порядку. По умолчанию, когда вы имеете вложенные DBRef, то вы не можете явно искать по полям вложенных документов, так как база видит только DBRef. Например, если у вас есть документ поста блога, и в качестве автора DBRef на документ пользовательского аккаунта, то вы можете найти все посты автора используя запрос {'author.$id': author._id}.

Тоже самое поведение, и вызывало ошибки, когда я пытался получить внутренние данные именно пользовательского аккаунта. MongoKit dereference'ит только при явном запросе документа, будь он вложен в массив, или просто поле объекта. Поэтому, иногда нужно идти на ухищрения, и не паниковать, если возникают ошибки KeyError, или unicode не имеет метода или поля.

Гибкость MongoKit, таит некоторую сложность, и при сложной структуре документов, требуется внимательно следить, какие запросы вы делаете и как вы получаете данные.

Это так же подтверждается, если вы загляните в Google Group проекта. Там много вопросов связанных именно с такими проблемами, хотя встречаются и ошибки. Так что, если у вас все таки какие-то проблемы возникли, смело обращайтесь к автору, он отзывчив и всегда помогает.

Приятного использования MongoKit.


P.S. Постараюсь выложить в дальнейшем код, для демонстрации. Если будет время, или не забуду.

MongoAlchemy - Внимание! Опасность!

Как и обещал, покопался малость в MongoAlchemy. Больше всего меня волновал вопрос поддержки отношений в базе. MongoAlchemy имеет поле DocumentField, как раз для встраивания документов.

Для проверки его работы, я решил написать небольшой тест. С двумя документами, который включает один в другой. В итоге, выяснил, что на самом деле, это не DBRef вовсе. MongoAlchemy просто копирует документ в другой документ, а не вставляет DBRef, и не dereference его.

В итоге, если использовать MongoAlchemy в базе, где так или иначе используют отношения, то весьма вероятна ситуация излишнего копирования данных. И в зависимости от данных, оно может быть очень излишним. Второй проблемой будет, если какие из объектов, на которые ссылаются - будут изменены. Копии то, останутся не тронутыми. Это может привести к поломкам базы.

Исследуя эту проблему, я не упустил возможность заглянуть в трекер MongoAlchemy на GitHub. У них уже пятый месяц висит задача на реализацию поддержки DBRef, и судя по всему, оно еще не реализовано.

Вывод: используйте MongoAlchemy аккуратно. Если ваш проект гарантирует то, что данные в базе не будут требовать отношений, то можете ее использовать. Но в любом случае, преимуществом будет использовать MongoKit, который на данный момент является лучшей ORM для MongoDB.

пятница, 18 марта 2011 г.

Краткий обзор ORM для MongoDB на Python

Постепенно интересуясь альтернативами MongoKit, я решил глянуть на альтернативы, и на то, что они предлагают. К сожалению, на данный момент, альтернатив в области Python MongoDB ORM мало, и они, не будем кривить душой, пока слабы. Но даже для их молодости, они уже вполне юзабельны, и могут использоваться. Во многом, здесь заслуга самой MongoDB, и разработчиков PyMongo.

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

воскресенье, 6 марта 2011 г.

I2P - свободный интернет

Тут в Juick, от пользователя @godfrey, проскочила просьба, перепостить его краткий FAQ, по вопросам, что такое I2P. За славой я не гонюсь, а идея такой анонимной сети в общем-то интересна, хотя лично я, пока не пользуюсь ей, по разного рода причинам. Но тем не менее. Под катом, краткий сборник формата вопрос-ответ о I2P.

Оригинал статьи: http://godfreystone.livejournal.com/837.html. По словам автора, там вероятно будут публиковаться еще несколько статей, касательно I2P.

пятница, 4 марта 2011 г.

Flask Tips - пред и пост обработка запроса на основе аргументов URL Rule

Проектируя дипломный проект, и разбираясь попутно в возможностях Flask и Werkzeug решил для себя небольшую задачку, и нашел удобные средства, которые могут решаться без применения middleware, на уровне приложения и модуля, что весьма удобно.

Объект Request в Flask, позволяет получить доступ к аргументам, полученным после парсинга URL. К примеру, у нас имеется Rule('/user/<username>'). При получении запроса, совпадающего с этим правилом, в request будет создан не пустой словарь request.view_args, который будет содержать аргументы для view. Но иногда, есть задачи, когда на основе этих аргументов требуется выполнять какую-то одну и ту же обработку в нескольких view, либо требуется, чтобы такая обработка была выполнена перед выполнением самого view, или возможно постобработка.

В Flask, приложение имеет возможность задать пост и пред обработчики, как уровня приложения, так и уровня модуля (если модули используются в приложении), и при последнем варианте, модуль может объявлять свои обработчики уровня приложения. Все они выполняются после создания объекта _RequestContext, объекты которого будут доступны, при запросе из в обработчиках. Это request, session, g и остальные. Поэтому, в обработчиках можно задействовать и request.view_args.

Рассмотрим на примере. Пример взят из моего дипломного проекта.

HTML5 - куда смотрят разработчики браузеров?

HTML5 уже давно не новое веяние, и его все активно ждут, ждут когда им можно будет нормально пользоваться.

На самом деле, его использовать можно уже и сейчас. Легко и просто, без всяких причин. Но как всегда есть НО.

Для начала стоит посмотреть на поддержку стандарта на HTML5 Test. Я посмотрел свой Chromium 10.0.602.0 (68214) и Opera 11.01 (1190). Хром еще как то, Опера - слабо. Откровенно слабо по баллам.

Но, радоваться было рано. На сайт с тестами, я зашел уже после W3 Schools. Там есть хороший учебник и описание нового стандарта, а также возможность опробовать все это на месте.

четверг, 3 марта 2011 г.

Немного впечатлений от MongoDB, и WSGI-инструментария, в ходе разработки дипломного проекта

На носу "госы". А я каждый день хожу с мыслями о дипломе, и как его сделать. Спасибо куратору, который, можно сказать, заразил сделать систему управления проектами.

Конечно, все не так просто на деле, и с такого масштабного уровня, я опустился на более приземленный. Всего лишь bug tracker.

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

В этом посте, не хочу говорить, как заправский разработчик, или знаток технологий (так как попросту таковым не являюсь), а лишь хочу поделиться своими личными впечатлениями.