пятница, 17 февраля 2012 г.

Первая техническая втреча Kiev.pm

16 Февраля 2012 года, в 19:30 в помещении GL Club, Киев состоялась техническая встреча Kiev.pm - группы пользователей Perl. Посетило встречу около 12 человек. Провели 2 доклада, на остальные не хватило времени и решили перенести на следующий раз.

Доклады:
  1. "Nginx. По следам мастер-класса Игоря Сысоева" Денис Жданов. Презентация 
  2. "Redis. Protocol::Redis"  Сергей Засенко. Презентация





пятница, 13 января 2012 г.

Валидация данных в Mojolicious

Написал небольшой плагин для Mojolicious  - Mojolicious::Plugin::ValidateTiny. По сути - это обертка над Validate::Tiny с дополнительными удобными плюшками.

Для валидации входящий параметров мы просто используем хелпер:
$self->do_validation($validate_rules);
$validate_rules - это описание проверок в формате Validate::Tiny.

По-умолчанию, включена опция "autofields", которая позволяет использовать сокращенный вариант правил проверки. И вместо:
  {  
     fields => ['user', 'pass'],
     checks => [user => is_required(), pass => is_required()] 
  }
можно писать:
 [ user => is_required(), pass => is_required() ]
и fields автоматически заполнятся исходя из описания проверок.

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

Кроме хелпера "validator_error", есть еще хелпер "validator_any_error".
  my $errors     = $self->validator_error;         # hashref with errors
  my $pass_error = $self->validator_error('pass'); # password error text
  my $any_error  = $self->validator_any_error;     # any error

четверг, 5 января 2012 г.

Быстрая установка зависимостей Perl-приложения

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

 Все модули я ставлю с CPAN в локальную директорию пользователя, использую для этого "local::lib".

Предварительно необходимо описать все зависимости приложения в Makefile.PL. Например, файл может выглядеть вот так:

Процедура установки:
  1. Копируем код приложения на чистый сервер.
  2. Устанавливаем и настраиваем "local::lib" (инструкция)
  3. Устанавливаем "App::cpanminus" в локальную директорию ( возможно придется установить вручную - make, make test, make install ).
  4. Переходим в папку с приложением и выполняем команду - "cpanm --installdeps ." и ждем пока установятся все зависимости.
Вот так все просто и быстро :)

вторник, 8 ноября 2011 г.

Теперь постом можно поделиться в социальных сетях

Я наконец-то добавил кнопки публикации информации про пост в социальных сетах. Пришлось немного порыться в интернетах, а то у меня используется нестандартный шаблон для блога и блогспот не мог к нему автоматически добавить эти кнопочки. Теперь можно поставить +1 любому понравившемуся посту. Пользуемся, не стесняемся ;).

Mojlicious: Использование роутов в javascript

Мне нравится, как реализованы роуты в Mojolicious и особенно мне нравится то, что их можно именовать. Именую я роуты всегда в соответствии с именем контроллера и метода.
Например,
$r->get('/messages/:id')->to('messages#show')->name('messages_show');
$r->post('/messages/:id/delete')->to('messages#delete')->name('messages_delete');
И затем в контроллере:
$self->redirect_to('messages_show', id =>123);
Такой подход позволяет изменять роуты с меньшим влиянием на остальной код. И все бы хорошо, но часто приходится использовать роуты не только на стороне сервера, но и на стороне клиента. Например,
var some_id = 123;
$.getJSON('/messages/' + some_id, function(data){ ... });
$.post('/messages/' + some_id + '/delete', function(data){ ... });
Хотелось бы иметь возможность использовать имена роутов и на клиентской стороне. Для этой задачи и был написан плагин "Mojolicious::Plugin::JSUrlFor". Достаточно добавить в основной ваш лейаут:
<%= js_url_for %>
и в клиентском javascript-е будет доступна функция "url_for"( аналогична хелперу "url_for" с "Mojolicious::Plugin::DefaultHelpers"):
var some_id = 123;
$.getJSON( url_for('messages_show', {id:some_id}), function(data){  } );
$.post( url_for('messages_delete', {id:some_id}), function(data){  } );
Модуль "Mojolicious::Plugin::JSUrlFor" пока еще только на Github, но заброшу на CPAN сразу, как покрою тестами.

вторник, 1 ноября 2011 г.

Mojolicious и защита от Cross Site Request Forgery (CSRF)

Немного теории
Я полагаю многие знают, что такое CSRF. Но для новичков озвучу. CSRF (Cross Site Request Forgery) - это межсайтовая подделка запросов. И происходит она следующим образом.

Допустим, на вашем сайте, назовем его "mysite.com", есть ссылка, которая удаляет сообщение. Ссылка вида - "http://mysite.com/myprofile/delete?message=123".

Злоумышленник может вставить эту ссылку на свой сайт "attackerssite.com", например,  в виде картинки -
<img src="http://mysite.com/delete?message=123" />
И если Вы зайдете на "attackerssite.com", то будет отправлен запрос на загрузку картинки с вашего сайта, но вместо загрузки картинки будет удалено сообщение. Проблем с авторизацией не будет, так как будет отправлена ваша кука, запрос же отправляется с вашего браузера.

Таким образом возможно подделать абсолютно любой запрос.
Есть разные методы борьбы с этим, но реально работает только один - необходимо с каждым запросом,  который изменяет данные, посылать секретную строку.
Эта строка должны быть уникальна для каждой сессии.

среда, 26 октября 2011 г.

Интересности Perl

Как-то совсем давно я ничего не писал, думаю уже пора :). Не так давно прошла конференция BlackPerl 2011. Я думаю, что уже многие в курсе относительного этого события.
Я на конференцию ехал без доклада, просто с желанием познакомится с Perl-комьюнити, послушать других и пофотографировать сие действо. Но вдохновленный докладчиками, решил и сам соорудить небольшое выступление. Поскольку, конкретной темы у меня не было, я решил просто рассказать про интересные вещи в Perl. Ничего особенного, но возможно кто-то найдет для себя что-то новое.

Приступим.

Приватные методы
В Perl возможно реализовать приватные методы и делается это следующим образом:

Недостаток такого подхода в том, что caller будет нам возвращать "__ANON__" в качестве имени нашего метода. И stack trace будет нечитабельным.