Ищите, Находите И Не Теряйтесь

Друзья, хотим рассказать вам о нашем сервисе ШДМка.

рф и некоторые подробности его изготовления.

Под катом статья про воздушные шары, CouchDB, Lisp и пару картинок.



Ищите, находите и не теряйтесь

Праздники уже не за горами и, возможно, кто-то из вас найдет идею для подарка.

Многие видели, как клоуны лепят собак из воздушных шаров.

Очень мило и очень смешно.

Возможно, кто-то даже пытался крутить шарики самостоятельно.

Сегодня из воздушных шаров изготавливают невероятное количество красивых вещей.

Проведенный фестивали и просто интересные события.

Мы создали сайт-каталог аэродизайнеров (и постепенно дизайнеров стали так называть), и главное на сайте — фотографии работ аэродизайнеров.

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

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



Ищите, находите и не теряйтесь

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



Лисп

Сайт написан на Common Lisp (реализация SBCL).

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

Под наши нужды были доработаны только две библиотеки, и то очень незначительно; остальное работало из коробки.

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

Хочется верить, что это утверждение выдержит проверку хабраэффектом :)

CouchDB

CouchDB используется в качестве хранилища данных.

Здесь хранятся фотографии и миниатюры к ним, а также информация о пользователях.

CouchDB включает в себя довольно удобную среду управления данными.

Футон , у которого есть один недостаток — весь JS-код, который используется для управления базой данных (представления, функции списков и т. д.), сериализуется в строку и практически невозможно редактировать в самой среде.

Для решения этой проблемы воспользуйтесь утилитой приложение для дивана .



CouchApp
Это небольшая утилита Python, которая позволяет создавать автономные приложения на CouchDB. Утилита генерирует код приложения по шаблону и, что самое важное, позволяет загрузить приложение в CouchDB одной командой.

При этом само приложение имеет древовидную структуру файловой системы, где код разных элементов, например представлений или вспомогательного кода, располагается в разных папках.

В обычном человеческом облике.

Кроме того, утилита позволяет добавлять в приложение CouchApp разные элементы — представления, списки и т. д. — по мере разработки.

Например вот так:

  
  
  
   

couchapp generate view check-user

Здесь check-user — это имя сгенерированного представления.

Утилита создает каталогviews/check-user, который будет содержать шаблоны для функций карты и сокращения.



Обновление функций
Поскольку в CouchDB данные никогда не перезаписываются, а только добавляются в базу, очень важным элементом работы является наличие ревизии документа.

Практически любой доступ к документу для записи требует знания версии документа.

Это не всегда удобно.

У CouchDB есть функции обновления (функции обновления), позволяющие манипулировать документами на стороне сервера (не загружая их на клиент), не зная их ревизии.

В документации этот момент описан достаточно скромно, но в то же время функции обновления позволяют делать интересные вещи:

function(doc, req) { if (!doc) { doc = { _id: req.id, type: 'idGenerator', count: 0 }; } doc.count++; return [doc, '"' + doc.count + '"']; }

Данный фрагмент кода увеличивает поле счетчика документа при каждом вызове функции.

Вот как на CouchDB реализован генератор последовательных чисел.

Вызов функции, кстати, осуществляется следующим образом:

curl -X POST http://localhost:5984/database/_design/view-doc/_update/generateOrderNo/counterDoc

Здесь view-doc — проектный документ в базе данных,generorderNo — функция обновления, counterDoc — документ в базе данных.

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

Аналог поля с автоинкрементом для SQL. CouchApp, однако, не умеет генерировать функции обновления, однако, если вручную создать каталог обновлений и поместить в него функцию вышеуказанного контента, то приложение легко загружается в CouchDB.

Подмена кода
CouchDB не позволяет функциям просмотра использовать какой-либо библиотечный код. CouchApp решает эту проблему очень, на мой взгляд, элегантно.

В коде функции отображения (или функции сокращения) можно указать конструкцию

function (doc) { .

// !code vendor/myapp/common.js .

}

и в то место кода, где встречается эта строка, будет вставлено содержимое файла common.js, расположенного в соответствующей папке приложения.

Хоть это и не самое красивое решение, но оно позволяет написать общий код один раз.



Рамки

В качестве основы для интерфейса был выбран фреймворк.

Чернила .

Имеет интересную внутреннюю структуру и расширенный функционал.

Кроме того, фреймворк развивается довольно быстро.



Заключение

В общем, когда захотите отпраздновать, подумайте о воздушных шарах.

Особенно в пятницу в четверг вечером перед праздником.

Ну а аэродизайнеров, которые смогут устроить этот праздник, можно найти на нашем сайте.

На главной странице есть ссылка на страницу с дизайнерами вашего региона.

Если окажется, что там никого нет, можно нажать кнопку «Я хочу, чтобы они были!» кнопка.

и мы пригласим авиадизайнеров из ваших городов по вашему интересу.

Чтобы привлечь внимание, на картинке изображен талисман FreeBSD из воздушных шаров, логотип CouchDB и один из логотипов Lisp из кофе.



Ищите, находите и не теряйтесь

Напоследок несколько предпраздничных ссылок: Воздушный шар-талисман FreeBSD Geeklatte.com, IT-рисунки на кофе Спасибо за внимание! Критика и предложения приветствуются.

Теги: #balloons #CouchDB #Lisp #NoSQL #FreeBSD #занимаюсь пиаром

Вместе с данным постом часто просматривают: