Framework для web-приложений на Haskell (Даже не скажешь, что yet another: их не так уж много)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Framework для web-приложений на Haskell

Сообщение Portnov »

Разрабатываю вот такую вещь.
Это фреймворк для создания web-приложений на языке Haskell. Проект в стадии активной разработки.

Состоит фреймворк из следующих частей:

  • HTTP сервер (т.е. приложение на этом фреймворке будет общаться с внешним миром по HTTP, "апач не нужен", хотя для отдачи статики или управления виртуальными хостами имеет смысл поставить nginx/lighthttpd)
  • Модуль для работы с Cookies
  • Модуль для работы с пользовательскими сессиями (в настоящий момент, данные сессий хранятся в файлах, но можно написать другой backend)
  • Модуль для кэширования чего угодно (бэкенды - filesystem, memcached и fake)
  • URL dispatcher
  • Модуль для работы с БД (использует HDBC, в настоящий момент полноценно работает только с PostgreSQL, sqlite3 поддерживает не все запросы, бэкенд MySQL есть, но не протестирован)
  • EDSL для описания моделей данных (таблиц БД)
  • EDSL для формирования SQL-запросов по моделям данных
  • Templating Engine - шаблоны пишутся в отдельных файлах с синтаксисом a la Django, но при сборке приложения компилируются в результирующий бинарник
  • Подсистема обработки форм (генерация HTML формы по объекту, валидация форм, показ недозаполненной формы)


В директории Blog/ - тестовое приложение ("типо блог"), не надо предъявлять к его функционалу претензий, его задача - протестировать работу фреймворка.

Depends on cabal packages: hdbc, hdbc-mysql, hdbc-postgresql, hdbc-sqlite3, haskell-memcached, network, http, MissingH, Takusen, hgettext, data-hash. Компилируется ghc 6.10.

Текущая версия README.ru
Документация (haddock)
Страничка проекта
Git репозиторий: git://iportnov.ru/framework.git, он же через web

Предложения/пожелания/багрепорты/etc приветствуются. Хотелось бы также найти желающих поучаствовать в разработке (самого фреймворка или хотя бы приложений на нём - чтобы выявить места, над которыми требуется работа). Для этого не обязательно быть профессионалом в Haskell: я сам ещё даже не newbie (в смысле, ещё не написал свой monad tutorial) ;) Зато это, имхо, может быть познавательно: у меня используются чуть ли не все "фишки" современного haskell-а :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

Re: Framework для web-приложений на Haskell

Сообщение gcc »

почему Haskell?

кто на нем пишет веб в СНГ?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: Framework для web-приложений на Haskell

Сообщение Portnov »

gcc писал(а):
13.07.2009 00:22
почему Haskell?

Высокоуровневый язык, уровнем выше того же python-а, не говоря про php, что означает быструю разработку и простую поддержку. При этом язык компилируемый, что даёт производительность на порядок-два больше чем python/php. В вебе, правда, производительность приложения зависит далеко не только от языка, но всё же...

gcc писал(а):
13.07.2009 00:22
кто на нем пишет веб в СНГ?

Я :) Ну и хотя бы http://happs.ru/, хотя тот сайт чего-то давненько не обновляется.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

Re: Framework для web-приложений на Haskell

Сообщение gcc »

Portnov писал(а):
13.07.2009 08:30
даёт производительность на порядок-два больше чем python/php.


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

вот я написал статью CRUD: http://www.lissyara.su/?id=196
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Framework для web-приложений на Haskell

Сообщение MakkyWelly »

Здравствуйте, проект ещё в разработке? Пока ещё не ознакомился, но хотел спросить вот что - вы строите все библиотеки проекта "с нуля" (ну, может в целях самообучения...), или делаете поверх пакетов с haskell.org, судя по их списку или по статье там не мало web-ориентированных библиотек.

З.Ы. http://www.happs.ru не работает, но на языке судя по всему у нас таки пишут :))
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: Framework для web-приложений на Haskell

Сообщение Portnov »

Некоторые библиотеки используются, конечно. Network.HTTP, например, для работы с http-заголовками, и несколько других. Собственно веб-сервер свой, основанный на Network.Shed.Httpd (допилен). Happstack не используется - у них там довольно специфическая архитектура (в частности, от реляционных СУБД товарищи отказались), идея там, насколько я понял, состоит в том, чтобы изобрести архитектуру, наиболее соответствующую свойствам языка. У меня архитектура более традиционная, я ориентируюсь на архитектуру Django.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Framework для web-приложений на Haskell

Сообщение MakkyWelly »

А можно небольшой примерчик относительно:

>> Подсистема обработки форм (генерация HTML формы по объекту, валидация форм, показ недозаполненной формы)

Поясню - я сейчас колотил велосипед на лиспе - там были такие макросы, вроде def-ui, с помощью которых определялись элементы интерфейса - меню, кнопки, окошки поиска - в общем контейнеры, их внешний вид конечно определялся в css а поведение в javascript, но в итоге получался ряд генераторов DHTML кода, так что его писать уже как бы и не надо. А далее все определённые ui иерархически выстраивались в def-page - что-то вроде DSL для веб страниц, но этот DSL вполне естественный - иерархия DOM элементов изоморфна иерархии ui элементов в макросе (т.е. дереву, списку и т.п.). Я тогда задался целью построить минималистичный интерфейс как в stackoverflow.com, потому что у них css библиотечные (с sstatic.com вроде) и js тоже (jQuery с google-хоста), при наличии библиотеки ui-элементов получалось коротко и наглядно:

Код: Выделить всё

(def-page
    :css "http://sstatic.net/so/all.css?v=6314"
    :script "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"
    :body
    (container
        (header
            (top-bar
                (panel (links "login" | "careers" | "about" | "faq")
                       (search-panel)))
            (white-down)
            (logo)
            (menu
                (navigation :left (buttons "Questions" "Tags" "Users" "Badges" "Unanswered"))
                (navigation :right (buttons "Ask Question"))))
        (content
            (quation
                (title "Haskell, Lisp, and verbosity")
                (post "...")
                (tag-list "haskell" "lisp" "comparison"))
            (answs
              ;;; в том же духе
))))


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

Кстати - когда вы компилируете свой код (эту библиотеку) у вас примерно какой размер получается бинарника, а то у меня это больная тема ))
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: Framework для web-приложений на Haskell

Сообщение Portnov »

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

Процитированное - про довольно общую задачу. Дан объект (ну, например, "пользователь"), перечислены его поля и их типы. Нужно создать html-форму для редактирования этого объекта, обеспечить её валидацию (скажем, поле "имя пользователя" должно быть непустым, или ещё что), в случае неправильного заполнения - показать её снова, причём правильно заполненные поля должны остаться заполненными, а рядом с неправильно заполненными должна быть подпись, поясняющая, что именно неправильно и почему. Со стороны приложения это у меня в итоге выглядит так (это из моего тестового приложения "блог", контроллер для редактирования поста):

Код: Выделить всё

editpost :: StrAction
editpost sid = loginRequired $ do
    (form,err) <- update postModel (read sid) "/blog/"
    renderToResponseM "editpost.html" [("form", C form),  ("invalid", C err)]


loginRequired объявляет, что дальнейшее доступно только залогиненным пользователям. Обработка формы - функция update. postModel - это описание модели поста (перечисление полей: заголовок, автор, тело поста итп, и их типов). sid - это ID поста. renderToResponseM генерирует HTML по шаблону (передавая туда переменные form и err) и отдаёт этот html клиенту.

Это самое приложение Blog в скомпилированном виде после strip - 5.8Mb. Это результат статической линковки (ghc 6.10), плюс в бинарнике все шаблоны. Если использовать ghc 6.12 и динамическую линковку - размер сильно уменьшится.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Framework для web-приложений на Haskell

Сообщение MakkyWelly »

Я просто в шоке от возможности стат. и дин. линковки конечно. А линковаться с си-библиотеками или поставлять библиотеки с которыми сможет слинковаться си-код случайно нельзя ?))

Пошёл учить синтаксис, а то ничего не понятно )) $ напоминает оператор && в shell, а <- я мог бы принять за присваивание, но сдаётся мне не всё так просто ;)
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: Framework для web-приложений на Haskell

Сообщение Portnov »

MakkyWelly писал(а):
12.02.2010 22:48
А линковаться с си-библиотеками или поставлять библиотеки с которыми сможет слинковаться си-код случайно нельзя ?))

Можно и то и то. См. FFI (foreign function interface).

$ - это оператор применения, f $ x обозначает f (x) - доллар используют чтобы не писать лишних скобок. <- имеет нечто общее с присваиванием, но всё-таки не совсем - см. любой из многочисленных туториалов по монадам.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Ответить