Internal Server Error

Previous Entry Share Next Entry
Web.pm first week
ihrd
Я, Carl и Stephen приступили к работе над грантом. Наша цель -- создать легковесный web framework на Perl6 под Rakudo. Рабочее название -- Web.pm, но многие считают его слишком общим и расплывчатым. Поэтому в ходе работы мы постараемся найти более подходящее. Я думаю мы сможем подобрать название, когда уже будет что называть.

Несмотря на наличие примерного плана разработки, как он описан в нашей заявке [1], первые же дни работы ввергли меня в замешательство. Слишком много вариантов реализации, идей и мнений. Наша IRC канал и рассылка стали необычно активными [2], Daniel Ruoso предложил свой вариант диспатчера [3].

Чтобы справится с хаосом в голове, я постарался выделить главное для себя, и пришел к первому тезису:

-- Максимально использовать стандартные инструменты Perl6.

Perl6 "большой" и богатый язык. Создавая фреймворк мы должны минимизировать число надстроек. Код должен быть организован с использованием стандартных классов, модулей, ролей. Не нужно много специфичной магии. Эта базовая мысль помогла мне выбрать позицию по активно обсуждаемому диспатчеру:

-- Использовать Perl6 MMD (Milti Methods Dispatcher[4]) для диспетчеризации запросов.

Moritz Lenz поддержал эту мысль и предложил свой, простой вариант реализации. Совмещение этой мысли с архитектурой REST [5] и влиянием Waves [6] навела меня на организацию код в виде ресурсов. Где ресурс это класс, а его методы, это собственно методы HTTP:

class Topic {
    multi method GET () { ... } # index
    multi method GET (Int $id) { ... } #show Topic by id
    multi method PUT (Int $id, %data) { ... } # update Topic by id
    multi method POST (%data) { ... } # create new Topic
...
}


Роль диспатчера при таком подходе -- выбрать верный ресурс для вызова метода, остальное делает MMD. Развивая эту мысль я делаю набросок, который назвал Forest, посмотрим, что из этого получится.

Одна из первых мыслей высказанных Ruoso -- взять идею :Chained из Catalyst [7], и построить всю диспетчеризацию как расширенную систему цепочек. Мне нравится эта идея и в Forest я хочу реализовать возможность связывания ресурсов в цепочку.

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

Моя первая неделя работы над грантом была омрачена простудой. Эффективно поработать удалось совсем не много и мне пришлось сделать перерыв. Надеюсь продолжить работу с середины следующей недели.

(С удивлением обнаружил, что доступ к perl6.ru для меня закрыт. Поэтому посты по теме пока пишу сюда.)

1: http://github.com/masak/web/blob/b5b6bf6980f027fdfab217ab2daf3a1b08c80e26/doc/GRANT-PROPOSAL.pod
2: используем IRC канал #november-wiki на irc.freenode.org и рассылку november-wiki@googlegroups.com
3: смотрите логи IRC начиная с http://irclog.perlgeek.de/november-wiki/2009-03-09 и переписку в рассылке
4: http://feather.perl6.nl/syn/S12.html
5: http://en.wikipedia.org/wiki/Representational_State_Transfer
6: http://rubywaves.com/
7: http://www.catalystframework.org/
Tags: ,

Круто ! Круто !
У меня есть просьб: а давайте плкгинную систему вы сделаете на столько гибкую, чтобы без особых проблни иожно было сделать авторизацию по опенайди плпгином ?
ну и конечно же хочется разные рендереры, в количестве. Вот у меня сейчас кажется получится зарелизить xslt.

Ещё вопрос: Треды ? fastcgi ? http ?

> У меня есть просьб: а давайте плкгинную систему вы сделаете на столько гибкую, чтобы без особых проблни иожно было сделать авторизацию по опенайди плпгином ?

Постараемся :) Я бы даже с удовольствием попробовал родить его сам для Maya.

> ну и конечно же хочется разные рендереры, в количестве. Вот у меня сейчас кажется получится зарелизить xslt.

все что сможем сделаем. Но у нас совсем не вагон времени, как может показатся. Писать _рабочий_ код под Rakudo все еще очень долгое дело. Я только пока черновичек маленький набрасывал запостил два мерзеньких бага. А сейчас вот отлавливал банальные "Use of unitialized value" в November в течении получаса. Потому что где это случилось Rakudo говорить все еще не научился :(

> Ещё вопрос: Треды ?
А?!
В тредах я лох, честно говоря.

> fastcgi ?
FastCGI хочу, но кто бы дал нам хоть примитивное IO, а? Мы только файлики читать можем, да STDIN, STDOUT юзать ничего больше.

> http ?
хочется сделать целиком и полностью, вон Carl портирует Rack во всю.

IO я сделаю. В следующие выходные. Так что и fastcgi и http можно будет сделать.

УРА! Хочу IO! :)

Ну я за вчера чуток отрессюректил io/socket_unix.c. Осталось его завернуть в Socket.pmc и начну проталкивать в Parrot.

Да, за всякие opendir/readdir я не брался ещё. Надо?

Эта, а в pdd написано что оно должно быть мультиплексирующее.
Это правда ? С событиями о прочитанных данных ?

Ну да. Только вот для начала я таки сделаю синхронный вариант.

Нееееееееееет !
Бацек нинада.
Я уже год назад хотел сделатль ио, потому что не хватает реально, и не решился.
По тому как я нормально мультиплексное не сделаю. а если сделать и закоммитиь обычное, которое буит требовать реализации select в программе, то народ поставит в головах галочку 'готово' и начнёт использовать.
И потом нормальное ио ты никогда уже не внедришь.
Давай лучше починим евенты, сделаем треды, а только потом, под весь этот огород сделаем ио.
У меня есть времени по выходным.
А ребята пока libfastcgi через nci поюзают ?

bacek@icering:~/src/parrot$ cat s.pir                                                                           
.sub 'main' :main
    $P0 = socket 2,1,0
    $P0.'connect'('www.ibm.com:80')
    $P0.'send'("HEAD /en/us HTTP/1.0\r\nHost: www.ibm.com\r\nConnection: close\r\n\r\n")

  loop:
    $S0 = $P0.'recv'()
    unless $S0 goto done
    print $S0
    goto loop
  done:
    say ""
    say "DONE!!!"
.end

# vim: ft=pir
bacek@icering:~/src/parrot$ ./parrot s.pir 
HTTP/1.1 404 Not Found
Date: Mon, 23 Mar 2009 12:11:20 GMT
Server: IBM_HTTP_Server
Content-Type: text/html
Cache-Control: no-cache
Expires: Sun, 22 Mar 2009 12:11:20 GMT
Last-Modified: Thu, 06 Sep 2007 07:41:58 GMT
ETag: "21f0-a835dd80"
Accept-Ranges: bytes
Content-Length: 8688
Kp-eeAlive: timeout=10, max=69
Connection: Keep-Alive


DONE!!!


Хех :)

а в чем там проблематика с IO если в 2х словах?
мне оно не надо, но т.к. я с io копался долго и упорно, мож оно мне понравится настолько что я сам полезу

А вот ты как раз умеешь такое делать, помню помню.
Фишка в том, что IO должно быть с блэкджеком и шлюхами, мультиплексированное и через события.
Вообщем: http://docs.parrot.org/parrot/latest/html/docs/pdds/pdd22_io.pod.html

Бацек, а ведь я придумал как легко и безопасно начать делать треды.
Пока что для фряхи ... и евенты вроде тоже ...
У нас есть где нить дока, как работает система сборки ?

Я не думаю, что фряхоспецифичное возьмут в паррот. Или даже зависимость от какого-нибудь libnevent согласяться подтянуть. Ибо винда.

А зачем тебе деать треды??? Они же вроде работают.

.sub 'main' :main
    .local pmc thr
    .local pmc pool

    pool = new 'ResizablePMCArray'
    
    $P0 = get_hll_global 'thread_func'
    thr = new ['ParrotThread']
    thr.'run_clone'($P0, 3)
    push pool, thr
    thr = new ['ParrotThread']
    thr.'run_clone'($P0, 1)
    push pool, thr
    thr = new ['ParrotThread']
    thr.'run_clone'($P0, 2)
    push pool, thr

    .local pmc it
    it = iter pool
  loop:
    unless it goto done
    $P0 = shift it
    $P0.'join'()
    goto loop
  done:
.end

.sub 'thread_func'
    .param int sl
    say "IN THREAD"
    say sl
    sleep sl
    say "OUT THREAD"
    say sl
.end

bacek@icering:~/src/parrot$ ./parrot t.pir 
IN THREAD
3
IN THREAD
1
IN THREAD
2
OUT THREAD
1
OUT THREAD
2
OUT THREAD
3


Хм ... работают ... и действительно треды ...
А почему тогда в ParrotThread.pmc так пусто ?

Они на самом деле не работают... Вернее треды работают, а вот GC уже нет :(

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

А зачем тебе ивенты, если есть кложуры?

корутины ?
И самому очередь задач держать ?

1. А почему бы и не держать?
2. Ну и по любому треды не работают... :(

Позже! Мне самому сокеты хочется заполучить :)

Илья, вот тоглко честно скажи, а вы можете пока без ио ?
Просто берёшь libfastcgi и через nci им пользуешься ?
Немножко через задницу, зато быстро, и fastcgi engine с появлением норммального ио рефакторить не придётся ?

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

bacek@icering:~/src/parrot$ ./parrot httpd.pir 
Running webserver on port 1234 of localhost.
The Parrot documentation can now be accessed at http://localhost:1234
Be sure that the HTML docs have been generated with 'make html'.
served file './docs/html/docs/tests.pod.html'
served file './docs/resources/parrot.css'
served file './docs/resources/parrot_logo.png'
served file './docs/html/index.html'
served file './docs/resources/parrot.css'
served file './docs/resources/parrot_logo.png'


Ну вот можно подчищать и пробовать протолкнуть в паррот :)

я как раз сейчас тоже натыкаюсь на ио, не очень приятно, но мне сильно легче, rakudo я оставил на сладкое, сейчас просто присматриваю за ним, чтобы при работе вплотную синтаксис не меня не оттолкнул =)
я сейчас пишу на голом пире, xml парсер и xslt процессор к нему.
Парсер уже ... проходит тесты, я довольно.

Так вот, а мысль следующая:
вот есть у вас аппликейшен сервер на пэйроте (я недавно узнал как оно правильно произносится).
Так вот он есть в виде одного процесса.
У него есть один тред мудьтиплексный http или fastcgi сервер, который запросы получает, и тут же пробрасывает их работающим тредам. [треды сейчас исследую, общее вчепятление - не работают =(]
Так вот, на получсение запроса и посыл ответа никакого проца не надо, всё в одном потоке сделать можно, а мысль в том, что таких потоков внутри можно поднять разных, в конфигурации с fastcgi - Engine::FastCGI, при работе с http - Engine::HTTP, и чтоб они отдавали запрос в одинаковом виде в диспатчер, ну диспатчер у вас простенький, MRO говорят во всю работает.

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

И того, получается некая система, в которой крутятся пользовательские воркеры, и общаются через очередь с пользователем через http, с логами через логгер, друг с другом через хранилище, или через очередь задач. Кста, а вот евенты кажись работают.

И мы получаем фреймворк мечты, в который не составит труда вставить jabber транспорт, и диспатчить его сообщения стандартным способом.

ЗЫ, я клоню к тому, что я точно захочу в это вставить видео маршрутизатор для видео чатов, уже где то год об этом мечтаю =)

Как ты красиво Каталист расписал :)

Каталист собака без взаимодействия между воркерами и вообщем то только для http. =(

А так - да =)

http://search.cpan.org/~druoso/Catalyst-Engine-XMPP2-0.3/lib/Catalyst/Engine/XMPP2.pm

Взаимодействие между воркерами делается одной строчкой в App.pm: our %shared : shared;

Гы ..... Нада попробовать, вечерком ...
А то я только http://search.cpan.org/~nperez/POE-Component-Jabber-3.00/lib/POE/Component/Jabber.pm
Пробовал, понравилось. Но нет потоков.

прошу прощения, что встреваю

fonyarkopff

2009-03-23 05:48 am (UTC)

>вот есть у вас аппликейшен сервер на пэйроте (я недавно узнал как оно правильно произносится).

parrot [pærət] все-таки не пэйрот читается


Re: прошу прощения, что встреваю

deepone

2009-03-23 11:47 am (UTC)


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

> я сейчас пишу на голом пире, xml парсер и xslt процессор к нему.
> Парсер уже ... проходит тесты, я довольно

Carl хочет реализовать шаблонизатор тип Genshi, я думаю ему может пригодится XML-прасер, где бы на него посмотреть?

Сча тестю, через неделю тогда отдам.

You are viewing ihrd