10 августа 2011 г.

Qrme! Расширение для Google Chrome.

Вчера вечером написал расширение для Google Chrome, которое называется Qrme!
Скачать его можно по вот этой ссылке.
Расширение реализует в простом виде концепцию (What You Capture Is What You Get) Deep Shot от Google, когда фотографируя веб-страницу на свой Андроид, моментально перемещаешься на неё в браузере устройства.

Реализация сделана с использованием QR-кодов. URL страницы превращается в QR за один щелчок мышью. Сфотографировав его в своём Barcode Scanner'е на Андроиде или другом устройстве, перемещаешься сразу на этот URL.

Атомарность в MongoDb, хранимые функции, выполнение кода на стороне сервера

Атомарность и Lock в MongoDb
Как известно, атомарность операций типа update не присуща MongoDb. Это создаёт некоторые трудности. В качестве примера можно привести классическую проблему с инкрементом поля в записи. В случае с атомарными операциями мы получили бы следующее:
Клиент 1: в записи значение 1, запрос, в записи значение 2
Клиент 2: ------------------------------ в записи значение 2, запрос, в записи значение 3 ...
...
В случае с Mongo:
Клиент 1: в записи значение 1, запрос, в записи значение 2

Клиент 2: в записи значение 1, запрос, в записи значение 2
...


Это объясняется тем, что Mongo предоставляет клиентам 2, 3 и т.д. те данные, которые сохранены персистентно в самой свежей ревизии записи в коллекции, не дожидаясь, пока клиент 1 закончит свою операцию. На этом в Mongo строится неблокирующий доступ к данным (клиенты не дожидаются друг друга). Чуть подробнее про неблокирующий доступ к общим ресурсам можно узнать на Википедии и в специализированных статьях, а мы пойдём к простому примеру и решению проблемы.


Пускай наше приложение занимается учётом переходов по некоторой ссылке, при каждом запросе увеличивая значение числа переходов в записи, соответствующей URL'у ссылки.
Наверное, более правильно было бы не увеличивать значение поля, а сохранять в таблице (коллекции) каждый запрос, и когда какому-нибудь клиенту потребуются данные о количестве переходов, производить подсчёт количества записей, однако здесь на лицо другие проблемы — требуется больше памяти, необходимо удаление старых записей и т.п.
Создадим коллекцию, содержащую запись о переходах по URL'у этого блога в MongoDb:

> var a = {queries: 0, url:'http://joydevel.blogspot.com/'};
> db.stat.save(a);
Оказывается, дальше всё очень просто. Согласно документации MongoDb, Mongo позволяет выполнять на сервере JS-код. Сам js-код выполняется в javascript-машине MongoDb (spidermonkey) в основном потоке. Как известно, js-код не реализует многопоточность. И как нас особо предупреждает документация, выполнение js-кода блокирует работу базы. Таким образом, мы получаем средство для реализации блокировки.
API для выполнения js-кода на стороне сервера предусматривает метод db.eval, получающий на вход js-функцию и параметры к ней.
Создадим такую функцию:

var incQueriesForPage = function( url ) { 
urlRecord = db.stat.findOne( { "url" : url } );
if (urlRecord != null) {
urlRecord.queries++;
db.stat.save(urlRecord);
return urlRecord.queries;
}
else return false;
}
Теперь, чтобы производить атомарный инкремент поля queries, мы просто вызываем эту функцию через db.eval вот так:


На этом всё про атомарность, реализуемую с помощью блокировок.

Хранимые функции
Порой появляется необходимость в обновлении данных в базе скопом. Конечно, можно посылать для каждого обновления запрос к базе, что будет нагружать как сервер СУБД, так и канал до него. Однако, можно пойти иным путём: создать хранимую функцию, реализующую обновления необходимых объектов и сохранить её прямо в базе. Для этого MongoDb предоставляет удобный API db.system.js. Сохраним необходимую функцию:
> db.system.js.save ({_id:"someFunc", value:function(x) {return x*x;}});
db.system.js ведёт себя как обычная коллекция, поэтому код вызова только что сохраненной функции выглядит так:

> db.eval(db.system.js.findOne({_id:"someFunc"}).value, 15);
225


Использовать хранимые функции можно точно также, как и stored procedures в MySQL, Postgresql, Oracle.
На этом, пожалуй, всё. Не забывайте, что выполнение js на server-side'е блокирует доступ! ;-)



9 августа 2011 г.

Google APIs: Charts, Infographics, Fusion Tables, Geo

Привет, редкий читатель! Недавно натолкнулся на ряд API Гугла для визуализации и обработки данных.

Одним из таких API является Google Charts API, который позволяет вставлять в веб-страницу формулы, QR-коды, графики и диаграммы, , которые генерируются на серверах Гугль.
Другое заинтересовавшее меня API — Fusion Tables. Fusion Tables позволяют хранить на серверах Гугль данные в виде таблиц, включая геоданные — координаты точек, маршруты и геометрию, привязанную к географическим координатам. Кроме этого, Fusion Tables имеет простое REST API для построения выборок и визуализации их на Google Maps и в Google Earth с использованием Google Earth Engine (один из новых продуктов Гугла, достойных отдельного внимания).
Но обо всём по порядку...

Добавить формулу на веб-страницу
API Google Infographics, позволяющее создавать формулы доступно по этому адресу http://code.google.com/intl/ru-RU/apis/chart/infographics/docs/formulas.html.
Формулы, создаваемые с помощью API передаются в виде GET-запроса в нотации TeX. Вот пример запроса: https://chart.googleapis.com/chart?cht=tx&chl=cht=tx&chl=a^2%2Bb^2=c^2&chs=50
Ответ приходит от серверов Гугла в виде такого изображения:
У изображения можно менять высоту (при этом ширина будет расчитываться автоматически), за это отвечает параметр chs.

Добавить QR-код на веб-страницу
Тот же API позволяет создавать QR-коды с передаваемыми в запросе данными:
https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82,%20%D1%87%D0%B8%D1%82%D0%B0%D1%82%D0%B5%D0%BB%D1%8C!

(передана строка «Привет, читатель!»)

В ответ получаем вот такое изображение:

Добавить диаграмму Google Chart
Документация по созданию диаграмм доступно вот тут: http://code.google.com/intl/ru/apis/chart/image/docs/making_charts.html
Генерация диаграмм работает точно также, как и генерация QR-кодов и формул — посылаешь GET с параметрами, получаешь картинку. Также возможно для интерактивности добавлять <area> HTML-элементы.
Однако в отличие, от упомянутого API у Google Chart есть Мастер создания диаграмм, доступный по вот этому адресу: http://code.google.com/intl/ru/apis/chart/image/docs/chart_wizard.html
Вот какие примеры:



Google Fusion Tables
Fusion Tables позволяет хранить данные, строить по ним выборки и визуализировать их на карте, легко вставлять в блог или на сайт, с помощью embed-кода HTML. 

Fusion Tables – это служба управления крупными коллекциями табличных данных в "облаке". С его помощью можно загружать таблицы размером до 100 МБ и публиковать их для сотрудников или размещать в открытом доступе. Данные можно фильтровать и объединять, отображать их на картах и различных диаграммах, соединять данные из нескольких таблиц и экспортировать их в Интернет или в файлы CSV. Помимо этого, с помощью службы Fusion Tables вы сможете вести обсуждение данных на разных уровнях детализации (например, на уровне строк, столбцов и отдельных ячеек).

Во Fusion Tables возможно хранить маршруты и геометрию в формате KML (формат хранения маршрутов для GPS-устройств), а выборки можно делать в частности и по гео-данным.
О возможностях Google Fusion можно посмотреть в блоге Google Geo Developers: http://googlegeodevelopers.blogspot.com/2011/08/geo-apis-summer-learning-series-gis.html

Чтобы начать работу с Fusion Tables, достаточно зайти со своим Google-аккаунтом вот сюда: http://www.google.com/fusiontables/Home
Здесь можно найти какую-нибудь таблицу с тестовыми данными. Например, BEELINE SHOPS. Это карта показывает расположение каких-то магазинов в Китае. http://www.google.com/fusiontables/DataSource?dsrcid=1009012&search=BEELINE&cd=0
Далее выбрав Visualize->Map мы получим карту, с нанесенными баблами этих точек:

Страничка Google Code этого проекта находится тут http://code.google.com/intl/ru-RU/apis/fusiontables/, где сказано, что таблицы Fusion Tables могут быть источниками данных для Google Maps и Google Chart Tools.

Вот так выглядит карта, заэмбеженная в блог (кликабельно):



Google Earth Engine
Google Earth Engine позволяет создавать свои слои на картах Google Earth. Выглядит круто, но эта технология доступна только для корпоративных пользователей. Как круто это выглядит, можно узнать по этой ссылке http://earthengine.googlelabs.com/#gallery (для просмотра нужен Google Earth)