Home

Предыдущие 20

16 Дек, 2009

Saint Perl 2009

18 декабря 2009 года в Санкт-Петербурге пройдет воркшоп Saint Perl 2009.
День выбран не случайно – это день рождения языка Perl, уже 22 :)

Мероприятие насчитало уже 85 человек (ого-го) из Москвы, Питера, Ростова-на-Дону (я :) и Екатеринбурга (снова перловое мероприятие посетит делегация с УрГУ и они везут половину докладов, круто!).

Я планирую рассказать про Mojo, прокаченная версия доклада с BY Perl 2009.
Расписание докладов.

Пока южная столица, привет северная :)

До встречи в Питере!


use Perl or die;

JFDI


7 Дек, 2009

Perl. Пересекаются ли два массива?

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


На Perl это делается так:
use common::sense;
 
my @a = qw(q w e r t y);
my @b = qw(u i o p q);
 
say 1 if grep { defined } @{{ map { $_ => 1 } @a }}{ @b };

Исходник

Задача решена с помощью анонимного хеша, который строится на лету, и с помощью срезов.
Очень просто, элегантно, без лишних переменных и в одно условие, код написан именно так, как звучит задача. Даа, это красиво :)


UPD: Спасибо [info]what_me за решение на perl 5.10:

use common::sense;
 
my @a = qw(q w e r t y);
my @b = qw(u i o p q);

say @a ~~ {map { $_ => 1 } @b};



ЗЫ: Диалог с сишником++:

– Я не понимаю, зачем нужно учить Perl?
– Давай, я покажу п*здатый код, а ты сам решай. Простая задача – пересекаются ли два списка, ответ да или нет.
(Пошла ржака)
– А массивы одинаковой длины?
(бугага)
– Массивы строк или чисел?
(бугага)
– Вот код (показываю этот код)
– Даа, круто! Что такое map, grep, qw?
(бугага) Смотри задача решена без единой лишней переменной и с помощью анонимного хеша
– Это как лямбда-функция?
(бугага)
– В си тоже есть hashmap
– (бугага) Учи Perl! :)


UPD ЗЫ: Другой сишник мне написал: "и все-таки оно будет работать медленнее чем 2 цикла" (бугага) x 100500


ЗЫЗЫ: RostovOnDon.pm offline #3 permalink.gmane.org/gmane.comp.lang.perl.perl-mongers.rostovondon/343



use Perl or die;

JFDI

30 Ноя, 2009

RostovOnDon.pm – оффлайн встреча #3 Будет! :)

Оффлайн встреча Perl-сообщества RostovOnDon.pm #3 пройдет 6 декабря 2009 года (воскресенье) на факультете математики, механики и компьютерных наук ЮФУ (мехмат), расположенного по адресу ул. Мильчакова 8а (точнее, еще точнее).

Все любители, ценители, интересующиеся, ненавистники Perl, а также похапашники приглашаются на встречу.
Будет несколько технических докладов, касаемых Perl, их обсуждение, живое общение и конечно же социальная часть в "Ташире" :-)

http://rostovondon.pm.org/#news


UPD:
permalink.gmane.org/gmane.comp.lang.perl.perl-mongers.rostovondon/343


use Perl or die;

JFDI

26 Ноя, 2009

Новая тема: say 'hello, world' or die 'hello, world';

Perl крут, новая тема:

use common::sense;

say 'hello, world' or die 'hello, world';

По-моему, очень смешно :)

Исходник

Подсмотрел здесь
Метки: , ,

10 Ноя, 2009

Perl. Форматирование чисел

Сегодня потребовалось написать функцию по форматированию чисел, приведение к читаемому виду: 1234567 => 1 234 567.
Написал следующую короткую и красивую функцию:
sub D($) {
	for (scalar reverse shift) {
		s/(\d{3})(?=\d)/$1 /g;
		return scalar reverse;
	}
}

say D 12345;
say D 123456;
say D 1234.56;
Спасибо [info]pavel_kudinov за подсказку использовать (?=pattern) positive look-ahead assertion (perlre).
Вместо этого у меня была вторая простая регекспа, которая удаляла лишний символ с конца.

Функция умеет работать и с флоатом, где количество знаков после запятой максимум 3, опять же благодаря (?=\d).

scalar reverse заставляет работать reverse в скалярном котексте при использовании в списковом контексте :)

По-моему, очень красиво получилось )))

Исходник


ЗЫ: С Павлом Кудиновым сошлись на мнении, что наверня-ка на CPAN есть модуль на несколько экранов с похожим функционалом :)


use Perl or die;

JFDI

Метки: , ,

2 Ноя, 2009

South Perl – сегодня ровно год :)

2 ноября 2008 года в Ростове-на-Дону прошел третий Российский Perl-воркшоп "South Perl".
Было в первый раз, было круто, было интересно :)

Сайт http://rpw2008.perlrussia.ru/
Выступления http://event.perlrussia.ru/rpw2008/talks
ЖЖ http://sharifulin.livejournal.com/tag/southperl
Фото http://www.flickr.com/photos/sharifulin/sets/72157608365664301/show/
Видео:

Just fun! :)

Меня все больше посещают мысли провести South Perl – 2.
Варианты Ростов-на-Дону, Ставрополь (о.О), Волгоград (на парад Победы), Краснодар (Krasnodar.pm жив?!), Сочи (это вообще пи**ец :).

use Perl or die;

JFDI


Метки: , ,

26 Окт, 2009

BY Perl Too Too

Минский воркшоп BY Perl Too, о котором я недавно писал, прошел успешно.
Мне очень понравилось как в Минске, так и на самом мероприятие (и, конечно, социальная часть :)

В поезде я все-таки успел подготовить 2 доклада, выступал под вечер, когда все почти устали, но слушали внимательно :)

Первый доклад про Mojo.
Получилось много слайдов, но я не обо всем рассказал, расширю доклад в следующий раз.



Блиц-доклад про CPAN.
Очередная версия доклада про CPAN и про сервис http://cpan.perlrussia.ru

View more documents from Anatoly Sharifulin.
 
</div>
Организатор(ы) позаботились о wifi и некоторые доклады я транслировал в интернет через twitcam.com.
Надеюсь, скоро все выступления появятся на yapc.tv (да, Андрей?)

use Perl or die;

JFDI



ЗЫ: Твиттер лента )
Метки: , , ,

15 Окт, 2009

BY Perl Too

В субботу 17 октября 2009 года в Минске пройдет второй пёрл-воркшоп "BY Perl Too". Подробная информация о мероприятие тут.

Я
, кстати, еду, сейчас собираю вещи и буду готовить доклады, впереди сутки в поезде, надеюсь успеть всё сделать и поспать :)


"Минск", use Perl, JFDI or die;

:)

8 Окт, 2009

Continuity и Squatting. Чат?!


Попробовал Continuity и микро-фреймворк Squatting на примере чата, где сервер – Push, клиент – long-polling.
Я разочаровался, нагрузку ни чистый Continuity, ни Squatting::On::Continuity не держат. Уже при 4-5 одновременных клиентах, которые постоянно пишут, сервер сильно тормозит :(

Пример чата на Continuity и Squatting можно найти в дистрибутиве модулей, в примерах.
Пример чата на Squatting + AnyEvent на Github.com (также тормозит).

Вообще, Squatting злая штука :)

Попробовал для реализации чата: APE (сложная штука на Си, клиент на мутулс, вообще не понравилась), Meteord (не сразу завелся, не очень), NginxHttpPushModule (как-то не так работает, плюс пару раз воркеры nginx ушли почти в 100% CPU). Не стал пробовать dklab multiplex на Event::Lib и POE::Component::Server::Bayeux.

Очень хочется попробовать сделать чат на XMPP, по-моему, это правильно :)

28 Сент, 2009

AnyEvent, AnyEvent::HTTP и Mojo::ByteStream

Удивление, удивление-два и привычка :)

Был удивлен, но оказывается AnyEvent/EV не позволяет выполнять вложенные condvar, получается рекурсия.
Вложенные кондвары не нужны, код легко модифицировать на работу либо с одним (самое главное send вызвать в самый последний момент, чтобы вся асинхронная работа была выполнена), либо с несколькими, тогда вызовы должны быть последовательными. Пример.

Так же был удивлён, что AnyEvent::HTTP автоматически заполняет заголовок Referer у запроса (для работы по умолчанию это лишнее) и не искейпит символы в урле (очень плохо, LWP::UserAgent и/или PoCo::Client::HTTP это делают на автомате, т.к. используют HTTP::Request).

За последнее время я так привык работать с Mojo (напомню, Mojo – pure perl http-фреймворк, "почти" без зависимостей, "веб в коробке"), что при возникновение задач вне окружения Mojo, которые связаны с перекодированием символом, не задумываясь, использую модуль Mojo::ByteStream. Например, для искейпинга символов в урле (проблема с AnyEvent::HTTP) использую следующий код:
Mojo::ByteStream->new($str)->url_escape

Для перевода html-последовательности символов вида &#1043; в печатные символы использую следующий код:

Mojo::ByteStream->new($str)->encode('utf8')->html_unescape

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


use Perl or die;

JFDI



Метки: , , ,

20 Сент, 2009

Mojo. Первый критичный баг

Нашел в Mojo критичный баг, а именно – при запуске сервера как демон-префорк (Mojo::Server::Daemon::Prefork), рабочий процесс (чайлд) падает при работе с пайпами; при запуске сервера как демон или CGI такой проблемы нет.
Подробное описание и тест в рассылке (кстати, мне там сделали замечание, как писать об ошибке). Надеюсь, что я доступно объяснил и показал баг, чтобы автор Mojo и/или кто-нибудь другой нашли решение. Сам пока не нашел.

Реальная задача, которая обнаружила это – отправка сообщения через sendmail в обработчике. Скорее всего ошибка в том, что возникает сигнал завершения потомка и он завершает работу воркера, а не пайпа.

Временное решение проблемы. Есть два варианта:
  • отправлять сообщения не сразу, а накапливать в очередь и какой-нибудь внешний процесс должен заниматься отправкой сообщений (плюс такого решения в том, что некоторые сообщения можно отменять)
  • урлы, в обработчиках которых возможна отправка сообщений, направлять не на демон-префорк, а на чистый демон (легко разруливается через nginx-конфиг)
Mojo настолько хорош, что фикс бага должен обязательно найтись :)

UPD: Решение найдено!  github.com/sharifulin/mojo/commit/416b0b15b637ed0fe8d9bf3ca3ba348e16d07f2b

Метки: , , ,

11 Сент, 2009

Запуск проектов на AnyEvent и Mojo


AnyEvent


Запустили твиттеры всех пользователей СТАНЦИИ 2.0, о котором я писал в предыдущем посте.
Используем AnyEvent::Twitter::Stream. Сам API находится в альфа-тестировании, поэтому мы работаем так же :)

Получилось очень круто, иногда интересней, чем ЧАТЕГ :)
Пишите в твиттер и слушайте СТАНЦИЮ 2.0!


Mojo


На днях запустили Рыков.ру, это первый публичный проект, полностью написанный на Mojolicious, в качестве шаблонизатора простой php-like шаблонизатор Mojo::Template, в качестве интерфейса – daemon_prefork, в момент разработки –  daemon c установленной переменной окружения MOJO_RELOAD  (изменения применяются без перезапуска), профилирование – с помошью Devel::NYProf и CGI.

В тестовом режиме запустили API для Маруси. Серверная часть написана на Mojolicious::Lite + MojoX::Renderer::JSON.
Получилось очень круто и все в одном файле, всего 246 строк :)


Что можно сказать про Mojo. Нет стабильной версии, постоянно выходят новые версии без обратной совместимости, но это нормально :)
Многие фичи приходится дописывать самому, автор лоялен к обсуждению функционала Mojo, принимает патчи, фиксит баги.
Иногда меня и мои просьбы не понимает )))
В целом, мне Mojo/Mojolicious нравится, простой и очень удобный. Даже шаблонизатор мне понравился, хотя в начале я не понимал его.



use Perl or die;

JFDI


3 Сент, 2009

Риалтайм твиттер – риал? тайм!

У отличного сервиса Twitter есть хороший API, особенность – Streaming API, возможность получать данные из твиттера мгновенно, почти в реальном времени (риалтайм веб?).

Меня заинтересовала такая возможность, тем более есть необходимость получать статусы из твиттера всех пользователей СТАНЦИИ 2.0 (конечно, у кого есть твиттер) и отображать их на странице в реальном времени. Похожая идея реализована тут, только это видимость реального времени, т.к. делается один запрос на сервер, и постепенно по одному статусу показывается на странице, затем следующий запрос и так далее :)

Read more... )


17 Авг, 2009

Perl. use strict; use warnings; use features; use Modern::Perl; use common::sense;

Почти каждый Perl-программист знает, что всегда нужно писать:
use strict;
use warnings;
С выходом perl 5.10 еще и:

use features '...';

Некоторые решили, что приходится писать слишком много "буковок". Так появился модуль Modern::Perl и новая веха в развитии Perl 5, получившая одноименное название. Модуль подключает и импортирует в пространство имен прагмы strict, warnings, features и mro. Теперь скрипты должны начинаться со следующей строчки:
use Modern::Perl;
 
Оказывается, можно пойти дальше и написать так:
use common::sense;

Что это такое? Это почти тоже самое, что и Modern::Perl, только круче :)
use strict qw(vars subs);
use feature qw(say state switch);
no warnings;
Содержимое модуля:
sub import {
   # no warnings
${^WARNING_BITS} ^= ${^WARNING_BITS}; # use strict vars subs
$^H |= 0x00000600; # use feature
$^H{feature_switch} = $^H{feature_say} = $^H{feature_state} = 1; }
Преимущество – использует меньше памяти, чем другие решения.

Обоснование и подробности на CPAN'е.


ЗЫ: Вопреки всем убеждениям в своем коде не использую use warnings или -w, я научился чувствовать и понимать, почему я могу этим пренебречь в той или иной ситуации (за что большое спасибо [info]pavel_kudinov ). Так что common::sense мне вполне подходит :)

ЗЫ2: Автор common::sense – Марк Лехманн (AnyEvent, Coro, EV, BDB).


use Perl or die;

JFDI


23 Июн, 2009

Ax, Perl, сколько задач приходиться решать на работе, не связанных с тобой :)

По другому этот пост не назовешь.

Прошла неделя и Perl'а было совсем немного, зато очень много оптимизации MySQL, настройки nginx, тонкой настройки, мониторинг графиков Munin'а, написание JavaScript'а, даже на PHP пришлось пофигачить (об этом следующий пост, обещаю, ой, как я плевался, монитор несколько раз протирал :).
Меня несколько раз спрашивали: "А правда, что Perl – write-only?!", мои следующие посты обязательно ответят на этот вопрос.

Вернусь к теме простых и функциональных скриптов на Perl.
15 минут и 37 строчек кода позволяют осуществить трансляцию RSS с поиска по блогам от Яндекса.
По-моему, очень просто, парсинг RSS вообще не составляет труда, используя XML::Feed.
Структура сообщений не позволила использовать ту же таблицу для проверки уникальности записей (обычно: unique id + insert ignore), поэтому Storable в помощь.

Единственное: в отличии от Твиттера, поиск по блогам не риал-тайм, поэтому опираться на дату создания поста было нецелесообразно, многие посты тонули в бездне ЧАТЕГА :) Поэтому они раскидываются с минутным интервалом.

use Perl or die;

JFDI





Метки: , ,

13 Июн, 2009

CPAN: modules, authors and documentation

Hello, Iron Man! I have a good time during my hollyday (beer + Black sea + gprs), but I ought to write post to the Iron Man Planet :) I want to present my service – http://cpan.perlrussia.org. It is best service for CPAN, try it. Thanks Acme::CPANAuthors and Perl 5.10 :)

Привет, Iron Man! Хоть я отлично провожу время на отдыхе (3 дня выходных, Точка кипения на море :), но япомню об Iron Man :)
Хочу рассказать о CPAN-сервисе, который недавно разработал – http://cpan.perlrussia.org.

Блиц-доклад в Норвегии на NPW2009 и 20-минутный доклад на YAPC::Russia 2009 стимулировали разработку сервиса для CPAN-авторов.
Получить RSS по авторам конкретной страны или по определенному автору стало очень легко. Так, например, RSS русских CPAN-авторов – http://cpan.perlrussia.ru/Russian/rss.xml (недавно на сайте Moscow.pm стал выводится этот фид) или RSS моих публикаций на CPAN – http://cpan.perlrussia.ru/Russian/SHARIFULN/rss.xml . Также на сервисе есть различные CPAN faces. Спасибо Acme::CPANAuthours::* и Perl 5.10 :)

Руслан Закиров решил помочь с поиском поддомена на cpan.org. Обсуждение имени в рассылку Mocsow.pm. Круто :)

Планы: сделай различные RSS для отслеживания модулей по ключевому слову и трансляция в твиттер.

Подписывайтесь в Google Reader, регистрируйте и обновляйте свои подможества Acme::CPANAuthors и будьте счастливы )))

use Perl or die;

JFDI
Метки: , ,

12 Май, 2009

Perl. Are you ugly?

Synopsis: Are you an ugly programmer? I try to write my Perl scripts use the Perl style and Perl features. Sorry, sometimes I'm ugly :) link1 link2

Cтал ловить себя на мысли, что я ugly-программист или просто Perl-программист :)
Я стараюсь писать на Perl на Perl'е, а не классически (например, как на Си), т.е. так, как сможет прочитать любой программист, даже не знающий Perl: с большим количеством переменных, постоянными комментариями, с пробелами вместо табуляции :). Во многом на меня повлиял[info]pavel_kudinov, спасибо ему за это и за это :)


Сегодня столкнулся с необходимостью написать так:
$page = int $page;

Затем написал так:
$_ = int for $page;
Интересный вариант, перловый, но скрывает суть.


В коде оставил последний вариант, чтобы потом порадоваться, когда встречу его. Вот такой я ugly-программист :)

Два года назад я решил проверить, на сколько реально написать цепочный код, используя map и grep. Реально!
Но больше я так не злоупотребляю :)


Метки: , ,

6 Май, 2009

Perl. Get F*cking Blogging

Продолжаю тему с Iron Man.

Сегодня опубликовали первое видео с Perl-воркшопа в Осло NPW2009:



Мэтт Троут очень ярко рассказал про тему с Iron Man. Призывает писать раз в неделю о Perl в блогах.

Get F*cking Blogging!

Just F*cking Do It!


Метки: , ,

30 Апр, 2009

Perl. JAPH или полная интроспекция или вынос мозга

[info]what_me меня очень сильно удивил и порадовал. На раз пишет JAPH, который удовлетворяет всем требованиям интроспекции на Perl и просто выносит мозг :) Эволюция кода и ответы на вопросы: зачем и почему в предыдущем посте.

s bbq oprint
q as a and print
grep!
m aca, grep!
m cac, a.. c, a..
c and print q aq a and print grep!
m pnp, grep!
m npn, n.. p and print and print
grep!
m pnp, grep!
m npn, n.. p and print grep!
m cac, grep! m aca, a..
c and print q qe and q and printobe and print
q as a and print
grep!
m aca, grep!
m cac, a.. c, a..
c and print q aq a and print grep!
m pnp, grep!
m npn, n.. p and print and print
grep!
m pnp, grep!
m npn, n.. p and print grep!
m cac, grep! m aca, a..
c and print q qe and q and print
Perl – великий язык, как хорошо, что не перевелись на земле русской богатыри (здесь я имею в виду перловика what_me из Минска :)!

ЗЫ: предыдущие 2 поста и этот маркированы тегом ironman, подробности www.enlightenedperl.org/ironman.html www.shadowcat.co.uk/blog/matt-s-trout/iron-man/ ironman.enlightenedperl.org/; вкратце: каждую неделю пост о Perl, про Perl и на Perl, 4 поста в месяц и так полгода, в результате я стану  Железным Человеком, а пока бумажный :)

26 Апр, 2009

Perl. Полная интроспекция кода

На May Perl 2009 будет доклад "Курс Perl в УрГУ", так сказать "Hello world" с Урала :)

На сайте курса нашел примеры полной интроспекции кода на Perl (т.е. нужно показать исходный код программы, не используя чтение/запись файла).

Решил написать свой вариант на Perl (только перловый, а не академический), а потом посмотреть на имеющиеся. Долго думать не стал, получилось следующее:
print, printf 'q(%s)', $_ for q(print, printf 'q(%s)', $_ for )
Из готовых вариантов понравился:
print <DATA>x2 __DATA__
print <DATA>x2 __DATA__

Вариант с наполнением массива я еще на Паскале писал (ну как писал, больше гуглил :).

О! Френды-перловики, хотелось бы увидеть ваши варианты.

UPD: 


Вариант от [info]mcfist :
require B::Deparse;
'B::Deparse'->compile->();
$_ = 'Hello World!';
Вариант от [info]pavel_kudinov  :
s{[[:digit:]]|^(?!.)}{s{[[:digit:]]|^(?!.)}{1} while !length...0;print} while !length...0;print
Вариант от [info]what_me :

s ffq bprint q ts t, chr 0146, chr 0146, qq tq t, chr 0142 and print and print chr 0142, chr 0146, q te;t and printbfe;print q ts t, chr 0146, chr 0146, qq tq t, c



Предыдущие 20

sharifulin

Декабрь 2009

Вс Пн Вт Ср Чт Пт Сб
  12345
6789101112
13141516171819
20212223242526
2728293031  

Реклама

Метки

Трансляция

RSS Atom
Разработано LiveJournal.com