LINUX.ORG.RU

MVC::Neaf - Not Even A (Web) Framework

 


0

2

Тут меня некоторые попрекают, что я в 2016 году начинаю проект на perl. Вы будете смеяться, на я ещё и фреймворк под него напилил. Простенький, но, как мне кажется, не лишённый некоторых здравых идей. Суть такова:

1. Приложение разбивается на маленькие процедуры-хэндлеры, привязанные к пути в URI (см. тж. https://metacpan.org/pod/Dancer )

2. Хэндлер получает на вход объект запроса, из которого потом достаются параметры, куки, заголовки и т.д. (см. тж. https://metacpan.org/pod/Kelp )

3. Параметры и куки нельзя достать без валидации, например, при помощи регулярного выражения:

  $req->param( foo => qr/\d+/ );

См. тж. perl -T

В качестве альтернативы есть самовалидирующиеся формы на базе Validator::LIVR или самописного каличного движка (но ЛИВР лучше).

См. тж. https://metacpan.org/pod/Validator::LIVR и https://metacpan.org/pod/Data::CGIForm

4. Хэндлер может вернуть ссылку на хэш с какими угодно параметрами, которая затем передаётся в шаблонизатор для рендеринга. На данный момент поддерживается Template::Toolkit и JSON/JSONP

Также есть ограниченный набор ключей с минусом, которые используются для управления самим фреймворком - -template, -status и т.п

5. Хэндлер может выбросить исключение: die 404 - легальный способ вернуть настраиваемую страницу not found. Все нормальные исключения (не трёхцифренные и не специальные объекты самого Neaf) трактуются как error 500.

6. Один и тот же код может в неизменном виде запускаться как cgi, psgi и под Apache2 + mod_perl (с некоторым бубном). Также поддерживается дебаг из командной строки:

   perl myapp.pl --help
   perl myapp.pl --list

7. Кроме этого есть поддержка статических страниц (не надо держать отдельно нормальный веб-сервер, чтобы проверить CSS или логотип), сессий (в несколько недоделанном виде, планируется улучшение), отложенные действия, выполняемые после запроса, ну и по мелочи ещё.

8. Также есть экспериментальный синтаксический сахар типа get '/foo' => sub { ... }; и экспериментальные же хуки, позволяющие воткнуться в обработку запроса за пределами хэндлера. Хуки привязаны к путям, т.е. для /foo/bar будут выполнены как «/», так и «/foo» и «/foo/bar».

Пример кода:

    use strict;
    use warnings;
    use MVC::Neaf;

    MVC::Neaf->route( "/" => sub {
        my $req = shift;

        return {
            -template => \'Hello, [% name %]!',
            -type     => 'text/plain',
            name      => $req->param( name => qr/\w+/, "Stranger" ),
        },
    });

На каждую фичу есть небольшой пример, они же используются как дополнительные смоук-тесты к 80% покрытию юнит-тестами. см. https://github.com/dallaylaen/perl-mvc-neaf/tree/master/example

Собственно проект:

https://github.com/dallaylaen/perl-mvc-neaf

★★★★

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

linearisation
()
Ответ на: комментарий от linearisation

Можно.

get '/foo' => \&handler, path_info_regex => qr/.../;

sub handler {
    my $req = shift;

    my $path = $req->path_info; 
        # не работает (точнее, deprecated) без regex выше
};

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

lodin ★★★★
() автор топика

в 2016 году начинаю проект на perl

У Perl'а очень интересная и богатая на упоротых почитателей загробная жизнь.

не лишённый некоторых здравых идей

Когда-то Mojolicious стартовал как обобщение опыта разработки Catalyst и новых идей (зачастую из других, не перловых, фреймворков). Была выделена база, комплекс библиотек для создания фреймворков: Mojo. Была реализация (Mojolicious) на основе Mojo. Сейчас (даже спустя годы) это решение выглядит очень современно, развивается.

Писать свой фреймворк (если бы упоролся наркотой), я бы пожалуй стал проторенным путем - взяв за основу Mojo. Все остальные идеи считаю далекими от здравого смысла.

Если пишете поделку для себя, то норм. Если для коммерческой разработки, то карма летит в бесконечно искривленное пространство. Уже сейчас хватает спецов по Mojolicious.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

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

Deleted
()

И вопрос: я могу на этой штуке запилить микросервис, который через websocket обменивается с подписчиками json'ом?

outtaspace ★★★
()
Ответ на: комментарий от Deleted

Сейчас времена такие, многие про моджо знают и умеют готовить. Есть выбор.

Простой пример (все совпадения случайны): Дядька с бородой писал полжизни свою поделку на mod_perl. Ищет второго программиста в проект. Все на него завязано, исходники помнят еще Perl 5.6. Мегабайты говнокода, неудобный тулинг, зоопарк библиотек, постоянные «делаем закат солнца руками», вместо документации код и тесты.

Дядька с усами (любит яркие рубашки). Все писал сразу на моджо, тулинг от моджо (хорошо продуман, грамотно реализован), все библиотеки от моджо (он на 99% самодостаточен - все для WEB), есть документация, есть коммьюнити и все стандартное без самописных костылей.

Я бы обходил стороной таких бородачей.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Вы хоть понимаете, что описали тот же vendor lock-in, только с разницей в 10 лет? И никуда от этого не деться, технологии меняются, комьюнити разбегается, код остаётся и работает. Хоть бакенбарды отрасти.

А моджо, конечно, молодцы, раз столько времени остаются на гребне.

lodin ★★★★
() автор топика
Ответ на: комментарий от anonymous

Чем лучше mojolicious?

1. return \%hash - очень выразительная конструкция (приближающая нас, конечно же, к чистым функциям, функциональным ЯП и прочим монадам). Т.е. контроллер просто разместил объяву вернул данные, а там хоть JSON, хоть Storable, хоть 10 уровней кеша - нас это не волнует. В идеале было бы довести до того, чтобы можно было вообще распараллелить рендерилку и логику - хотя, полагаю, те, кому нужны такие оптимизации, давно используют не perl.

2. Роутинг и хуки проще организованы. Лучше ли - время, конечно, покажет.

3. Меньше вламывается в логику приложения - название обязывает! Т.е. тащить с Neaf на next big thing будет куда проще, чем с апача на моджо.

4.

use MVC::Neaf;
use Test::More;
require 'myapp.pl';
my ($status, $header, $content) = MVC::Neaf->run_test( '/foo?bar=42' );

# ......
done_testing;

Good luck with Mojo (хотя можно, не сомневаюсь).

Вообще неизучение Mojo, конечно, мой провтык. Я смотрел на Dancer и Catalyst как раз. Постараюсь исправить :)

lodin ★★★★
() автор топика

perl5 - жив, и будет жить ещё долго. Огромным плюсом является именно его «немодность», орды хипсторов-выебщиков давно сбежали на что-то другое.

perl6 - рождён мертвым. Очень большое влияние рубей, нет plain-типов, нет совместимости, никакая скорость, от количества сахара слипается всё на свете.

rperl перспективен, но сказывается нехватка ресурсов, кикстартер не сильно помог.

Про mojo(licious) уже сказали выше.

P.S. Есть потребность переписывания старых проектов с mod_perl на что-либо посовременнее. osc-inventory-server, octopussy, rt. Netdisco уже сбежал (слава п-треку). Не хочешь посмотреть первые 2?

anonymous
()
Ответ на: комментарий от anonymous

perl5 - жив, и будет жить ещё долго

Свершилось чудо. Пятый перл умер. Все что мы сейчас наблюдаем - загробная жизнь.

Огромным плюсом является именно его «немодность»

Плюс настолько огромный, что нет нормальной работы. До ближайшей приличной конторы надо на тракторе добираться.

outtaspace ★★★
()
Ответ на: комментарий от anonymous

perl5 - жив, и будет жить ещё долго. Огромным плюсом является именно его «немодность», орды хипсторов-выебщиков давно сбежали на что-то другое.

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

Вот и имеем, что в перл дофига фич, в том же питоне только запилили годную либу для вебскрапинга два года назад, а вебскраперы уже уходят на покой (спасибо libwww, mechanize, etc за долгую службу). В перл развиваются регэкспы, грамматики, остальные только копируют, а то и вовсе остаются на pcre. В перл есть анализаторы, gdb-like дебаггеры, профайлеры уровня nytprof, остальные только пишут.

В перл сообществе есть инфраструктура {meta}cpan/cpan-testers/rt/backpan/perlmonks которая расширяется {pre,cloud}pan, perlhub. А в остальных скриптовых - бледная тень, вроде pypi/gem.

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

Перл сообщество почти 10 лет назад скооперировалось чтоб написать спеки, и создать язык программирования силами всего сообщества. Что тут сказать о конкурентах?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от outtaspace

Свершилось чудо. Пятый перл умер. Все что мы сейчас наблюдаем - загробная жизнь.

ты о вакансиях, да? Бо в разработке он фору даст конкурентам.

Deleted
()
Ответ на: комментарий от Deleted

Да, именно о нише в промышленной разработке. Десяток вакансий на 2 страны, из которых только 3 относительно нормальные, это совсем беда.

Умельцев писать однострочники не считаем.

outtaspace ★★★
()
Ответ на: комментарий от anonymous

Спасибо, что поддерживаете развал образования.

это моя месть образованию, за потерянное детство.

outtaspace

Да, именно о нише в промышленной разработке. Десяток вакансий на 2 страны, из которых только 3 относительно нормальные, это совсем беда.

о какой промышленной разработке ты ведёшь речь? Для массового программирования Perl не подходит. Когда-то он был как С++ сейчас, практически безальтернативен, и многие на нём писали. Но самоконтроля в разработке на perl, имхо, нужно больше, нежели на питоне, или рубях. Программисты должно быть, дороже. Кадров поменьше. В общем, невыгоден он для массовки.

Deleted
()
Ответ на: комментарий от outtaspace

Вот по 4му, например: http://mojolicious.org/perldoc/Test/Mojo#SYNOPSIS

Ну восхитительно, свой Test::More с пеферансом и поэтессами сочинили авторы Mojo, а за велосипед чихвостят почему-то меня!

Если серьёзно, конечно, у философии «всё своё ношу с собой» есть свои плюсы, но есть и минусы. Мне больше нравится подход «do one thing, and do it good». Хотя и зоопарк библиотек, да.

lodin ★★★★
() автор топика
Ответ на: комментарий от lodin

свой Test::More

Вовсе нет. Это не своя интерпретация модуля, а дополнения для тестирования web-транзакций. Test::More они не изобретали заново.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Ну кто тебе виноват, что в кyеве остались одни галеры с похапе. Это не проблема перла. :-)

anonymous
()
Ответ на: комментарий от anonymous

в кyеве остались одни галеры с похапе

Дык писал об этом - на 2 страны всего несколько приличных вакансий. За работой надо ехать к эльфам, на тракторе.

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

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

на 2 страны всего несколько приличных вакансий

Это можно и про весь рынок в целом написать. 30% - 1C, 40% - вебмакаки всех сортов, ещё 10% - работа в динамичноразвивающейся и очень гордой компании за дошик.

Молодняку просто негде стартовать.

В перл идут из повседневной скриптоты, когда шелла становится мало, а на питон не стоит. В результате он или становится вспомогательным языком для прогера, на котором пишут «для себя» или остаётся основным для админа. Чистых перловых вакансий действительно мало, но его знание требуется много где.

anonymous
()
Ответ на: комментарий от anonymous

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

Именно об этом и писал выше.

outtaspace ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.