Новый движок моего блога (на Haskell)

Февраль 28, 2011, 16:03

Пе­ре­пи­сал свой блог — те­перь это Haskell! За­хо­ди­те вы ко мне на сайт, по­чи­тать это со­об­ще­ние, а в это вре­мя, на да­ле­ком сер­ве­ре, лямб­да функ­ции за­мы­ка­ют­ся и ре­ду­ци­ру­ют­ся, мо­на­ды одна в дру­гую транс­фор­ми­ру­ют­ся, сан­ки фор­сят­ся и про­ис­хо­дит раз­ная дру­гая ма­гия.

Пока немно­го те­зис­но что, как и по­че­му, часть тем буду в бу­ду­щем раз­во­ра­чи­вать:

Web Frame­work — свой соб­ствен­ный

Я про­смот­рел всё что сей­час есть из фрейм­вор­ков на Haskell (их уже мно­го), од­на­ко ни­че­го меня не за­це­пи­ло. На­пи­сал свой ми­ни­а­тюр­ный фрейм­ворк. Для вза­и­мо­дей­ствия с web-сер­ве­ром ис­поль­зую fastc­gi. Тут осо­бо без ва­ри­ан­тов, хотя на­ча­ли по­яв­лять­ся дру­гие ре­а­ли­за­ции fcgi, но я их пока не смот­рел. К fastc­gi есть неко­то­рые во­про­сы по ар­хи­тек­ту­ре, и я на­пи­сал свою неболь­шую оберт­ку. Но в це­лом хо­ро­шее впе­чат­ле­ние про­из­во­дит.

Если Web-про­грам­ми­ро­ва­ние на Haskell не за­бро­шу, обя­за­тель­но рано или позд­но на­пи­шу свой пол­но­цен­ный фрейм­ворк.

База дан­ный — CouchDb

Ис­поль­зую CouchDB. Дав­но уже на неё по­смат­ри­ваю, ре­шил по­про­бо­вать в деле. Для неё су­ще­ству­ет оберт­ка для Haskell (CouchDB), но в на­сто­я­щее вре­мя она под­дер­жи­ва­ет да­ле­ко не весь API, в част­но­сти там нет ат­та­чей (и не толь­ко, мно­го чего нет). Так что я на­пи­сал свой бин­динг (тоже, по­нят­но, не пол­ный :) ), бла­го API у CouchDB про­стой — бе­решь до­ку­мен­та­цию и пи­шешь. Для HTTP ис­поль­зую curl, хо­ро­шая шту­ка, ре­ко­мен­дую, API у него не са­мый оче­вид­ный, но мощ­ный, уме­ет всё, libcurl он и есть libcurl. Вы­кла­ды­вать бин­динг к CouchDB пока не буду, он до­воль­но сы­рой и ис­поль­зу­ет «спе­ци­фи­че­ский» JSON (см. ниже).

Ещё, в ка­че­стве за­мет­ки: в CouchDB для на­пи­са­ния view иде­аль­но бы по­до­шел чи­стый функ­ци­о­наль­ный язык, а то по фак­ту по­боч­ные эф­фек­ты мы ис­поль­зо­вать не мо­жем (view по­ло­ма­ет­ся са­мым непред­ска­зу­е­мым об­ра­зом) но на­пи­сать код, к при­ме­ру, ис­поль­зу­ю­щий те­ку­щее вре­мя мы мо­жем, и CouchDB ни­как нам в этом не по­ме­ша­ет. Так что у меня есть за­дум­ка на­пи­сать CouchDB view serv­er на Haskell, бла­го CouchDB API в этом ме­сте тоже про­стой, и по­боч­ные эф­фек­ты во view бу­дут от­се­кать­ся на уровне чи­стых функ­ций язы­ка.

Та­к­же CouchDB на­пи­са­на на функ­ци­о­наль­ном язы­ке Er­lang, и те­перь у меня пол­но­стью «функ­ци­о­наль­ный» сайт :) .

Про JSON

Биб­лио­тек под­держ­ки JSON для Haskell су­ще­ству­ет уже боль­ше де­сят­ка, я сна­ча­ла на­чал пи­сать на json т. к. он со­здал впе­чат­ле­ние са­мо­го на­вер­ну­то­го, од­на­ко в ре­аль­ном деле его API ока­зал­ся очень гро­мозд­ким и не удоб­ным для ис­поль­зо­ва­ния. В ито­ге я его ис­поль­зую как пар­сер и ге­не­ра­тор, а сами JSON объ­ек­ты у меня са­мо­пи­сан­ные, с удоб­ным для меня ин­тер­фей­сом. И ис­поль­зую я «свой JSON» вез­де, вклю­чая вза­и­мо­дей­ствие с CouchDB, по­это­му и не буду пока ин­тер­фейс к ней вы­кла­ды­вать.

Надо бы про­ве­сти ка­кой-то срав­ни­тель­ный ана­лиз су­ще­ству­ю­щих ре­а­ли­за­ций JSON-а, мо­жет есть что-то бо­лее удоб­ное, ну или свою ре­а­ли­за­цию на­пи­сать :) .

Шаб­ло­ни­за­тор

Это са­мая удач­ная часть. Мне очень нра­вит­ся Mus­tache, вот толь­ко для Haskell его нет. Но та­кой ме­ло­чью меня не оста­но­вить, на­пи­сал свою ре­а­ли­за­цию. По­лу­чи­лось, на мой взгляд, не пло­хо. Надо её немно­го при­че­сать, на­пи­сать до­ку­мен­та­цию и вы­ло­жить.

UPD: На­пи­сал про Mus­tache

UPD: Вы­ло­жил свою ре­а­ли­за­цию это­го шаб­ло­ни­за­то­ра — Has­tache

Свет­лое бу­ду­щее

В об­щем, есть что рас­ска­зы­вать и есть куда дви­гать­ся. Глав­ное чтоб меня лень не одо­ле­ла это де­лать :) . Haskell, на мой взгляд, ве­ли­ко­леп­но под­хо­дит для сер­вер­но­го web-про­грам­ми­ро­ва­ния, для мно­гих язы­ков имен­но на­ли­чие класс­но­го Web Frame­work'а ста­ло огром­ным толч­ком в по­пу­ляр­но­сти, при­чин, по­че­му бы это­му не про­изой­ти для Haskell, я не вижу. Ду­маю, чем боль­ше раз­ных фрейм­вор­ков бу­дет на­пи­са­но на Haskell, и чем боль­ше он бу­дет ис­поль­зо­вать­ся ря­дом с Ruby on Rails, Djan­go, Py­lons, Lift и т. д. тем луч­ше. По­ста­ра­юсь вне­сти в этот про­цесс свою по­силь­ную леп­ту.

UPD: С 26.11.2012 устрой­ство мо­е­го бло­га вновь из­ме­ни­лось.

blog comments powered by Disqus
Сергей Лымарь © 2005-2014, Все права защищены.