cоздание приложений со знанием perl

87
Создание приложений со знанием Perl Анатолий Шарифулин YAPC::Russia 2012

Upload: anatoly-sharifulin

Post on 11-Jun-2015

984 views

Category:

Education


2 download

DESCRIPTION

Доклад с #yr2012 Оригинал http://www.slideshare.net/sharifulin/developing-apps-using-perl

TRANSCRIPT

Page 1: Cоздание приложений со знанием Perl

Создание приложений со знанием Perl

Анатолий ШарифулинYAPC::Russia 2012

Page 2: Cоздание приложений со знанием Perl

Hello, World!

Page 3: Cоздание приложений со знанием Perl

«СчастливыйPerl-программист»

Андрей Шитов про меня

Page 4: Cоздание приложений со знанием Perl

Я стал меньше программировать на Perl

Но не стал его меньше любить :-)

Page 5: Cоздание приложений со знанием Perl

JFDI превратилось JFTIJust F*cking Talk about It

Page 6: Cоздание приложений со знанием Perl

Success-storyодного приложения

И как Perl мне/нам помог в этом

Page 7: Cоздание приложений со знанием Perl

Нам — это Applifto

Page 9: Cоздание приложений со знанием Perl

Наши приложения

Page 10: Cоздание приложений со знанием Perl

Опрос аудитории

Page 12: Cоздание приложений со знанием Perl

Подробно«Зачем?» и «Почему?»

http://www.slideshare.net/sharifulin/ss-12313103

Page 13: Cоздание приложений со знанием Perl

Веский повод для меняЯ переезжал с ЖЖ в Posterous, написал скрипты переноса, но настроил кросс-постинг в Твиттер и Фейсбук, получил реплаи «Толя, хватит!»

Page 14: Cоздание приложений со знанием Perl

Существующее аналоги — не очень

Медленные, неудобные, некрасивые, «криво» удаляют:TwitWipe, TwitCide, Delete My Tweets, ...

Page 15: Cоздание приложений со знанием Perl

«Хватить техдирить, пора попрограммировать»

И выступить на #yr2012 с докладом :-)

Page 16: Cоздание приложений со знанием Perl

Подход и решение

Page 17: Cоздание приложений со знанием Perl

Основные цели

• Приложение должно быстро удалять твиты• Чёткое удаление• Кросс-платформенное приложение:

iOS, Android, Web, ...

Page 18: Cоздание приложений со знанием Perl

Серверное API — привет, Perl!

Вся логика на стороне сервера (не Твиттер API),клиенты — «тупые» интерфейсы

Page 19: Cоздание приложений со знанием Perl

Знакомствос Твиттер API

Page 20: Cоздание приложений со знанием Perl

Опыта мало:

• Получение профилей пользователей после авторизации через Твиттер на сайте

• Автоматический постинг в Твиттерс помощью Net::Twitter(::Lite)

• AnyEvent::Twitter::Stream для риал-тайм поиска (привет, @miyagawa!)

Page 21: Cоздание приложений со знанием Perl

Блокирующий вариантНа базе Net::Twitter(::Lite) можно решить задачу

Page 22: Cоздание приложений со знанием Perl

LWP::UserAgent::POE Можно заменить транспорт в Net::Twitter(::Lite)

Page 23: Cоздание приложений со знанием Perl

НЕТ

Page 24: Cоздание приложений со знанием Perl

Идея — 2 независимые асинхронные очередиПолучение таймлайна и удаление твитов,

используя REST Twitter API и асинхронные запросы

Page 25: Cоздание приложений со знанием Perl

Такой вариант должен работать быстро!

Page 26: Cоздание приложений со знанием Perl

Авторизация и OAuth

Page 27: Cоздание приложений со знанием Perl

Net::OAuth::AllМы давно написали свой модуль для OAuth.Поддерживает все версии OAuth (1.0, 1.0A, 2.0).

Page 28: Cоздание приложений со знанием Perl

Net::OAuth::Allhttps://github.com/likhatskiy/Net-OAuth-All

Page 29: Cоздание приложений со знанием Perl

my $oauth = Net::OAuth::All->new( consumer_secret => $conf->{consumer_secret}, consumer_key => $conf->{consumer_key },

token => $data->{access_token }, token_secret => $data->{access_token_secret},);

Page 30: Cоздание приложений со знанием Perl

$oauth ->via('GET') ->protected_resource_url('https://api.twiiter.com/...’) ->put_extra( include_rts => 'true', user_id => $user->{id}, count => 200, ) ->request('protected_resource');$oauth->to_header;$oauth->url; # $oauth->url_with_extra;

Page 31: Cоздание приложений со знанием Perl

Пропатчил модульПользователь неавторизован:

ограничение150 запрос в час по IP, а не 350 запросов в час на пользователя

Page 32: Cоздание приложений со знанием Perl

Асинхронные запросы

Page 33: Cоздание приложений со знанием Perl

Я использую MojoliciousНи для кого не секрет :-)

Page 34: Cоздание приложений со знанием Perl

Mojo::UserAgentMojo::IOLoop

Отличный асинхронный HTTP-клиент

Page 35: Cоздание приложений со знанием Perl

my $delay = Mojo::IOLoop->delay;for (@$tasks) { ... $delay->begin; $ua->get($url => {'Authorization' => $h} => sub { my ($ua, $tx) = @_; ... $delay->end( ... ); });}

say $delay->wait;

Page 36: Cоздание приложений со знанием Perl

Серверное API

Page 37: Cоздание приложений со знанием Perl

Серверное APIAPI поддерживает GET и POST запросы,формат передачи данных — JSON,

коды ответа: 200 и 50x.

Page 38: Cоздание приложений со знанием Perl

Серверное APIStarman + Mojolicious

Mojolicious::Plugin::ApiHelpers

Page 39: Cоздание приложений со знанием Perl

Серверное APIhttp://api.dlttr.com

Page 40: Cоздание приложений со знанием Perl

package App::Api;use App::Base -controller, with => [ 'App::Task', 'App::User' ];

sub error { shift->api_error(code => 1) }sub any { shift->api_error(code => 5) }

...

1;

Page 41: Cоздание приложений со знанием Perl

my $api = $r->route('/api')->to('api#', api => 1);$api->route('/:action', action => qr/login|oauth/)->to;

my $apiu = $api->bridge->to('#auth', sign => 1);$apiu->bridge('/task/new')->to('#task_check') ->route->to('#task_new');

$api->bridge('/')->to('#auth', maybe => 1, sign => 0) ->route->to('#hello');

Page 42: Cоздание приложений со знанием Perl

10 методов,123 теста и документация

Большинство методов требуют авторизацию пользователя и проверка sign (api_id + secret)

Page 43: Cоздание приложений со знанием Perl

Test::Mojo и Test::MoreТестируется доуступ к методам API,

входные-выходные данные, проверка подписи и т.д.

Page 44: Cоздание приложений со знанием Perl

Test::Mojo и Test::MoreСтавится реальная задача от тестового пользователя

Page 45: Cоздание приложений со знанием Perl

Покрыты все методыНо нет никаких Mock-объектов, нет проверки, правильный ли удалён диапазон твитов

Page 46: Cоздание приложений со знанием Perl

Это трудоёмкои излишне

Нет тестирования реального цикла:постинг твитов — удаление — проверка

Page 47: Cоздание приложений со знанием Perl

$t->get_ok("$url/") ->status_is(200) ->header_is('Access-Control-Allow-Origin', '*') ->json_content_is({hello => 'Hello DLTTR!'});

$t->get_ok(sign get => "$url/task/new") ->status_is(200) ->json_content_is({error => {msg => 'User authorization failed', code => 2}});

Page 48: Cоздание приложений со знанием Perl

Опасно тестить на своём аккаунте :-)

— Тебе всё равно на свой Твиттер?— Да!— Давай я удалю все твиты?— Нееееееееет!!!

Page 49: Cоздание приложений со знанием Perl

Простой debug-запросов

Для проверки качества работы «клиентов» удобно логировать запросы с помощью before_dispatch + after_dispatch

Page 50: Cоздание приложений со знанием Perl

Три очереди-демона

Page 51: Cоздание приложений со знанием Perl

1. Очередь работыс таймлайном

Фильтрация и поиск нужных для удаления ID твитов,пейджинг с помощью since_id и max_id

Page 52: Cоздание приложений со знанием Perl

1. Очередь работыс таймлайном

Максимум 200 твитов за один запрос,получение таймлайна один за одним,

проверка Rate Limit

Page 53: Cоздание приложений со знанием Perl

«Ограничения» Твиттера

Нет доступа ко всем твитам, только к последним ~3200 или не позднее определённой даты,

счётчик не-ноль и т.д.

Page 54: Cоздание приложений со знанием Perl

2. Очередь по удалению твитов

Удаление «пачками» по 200 штук, нет ограничений.«Отбойный молоток» или «Пушка» :-)

Page 55: Cоздание приложений со знанием Perl

2. Очередь по удалению твитовОбработка ошибок — не всегда ошибка

от Твиттер API означает невыполнение задачи

Page 56: Cоздание приложений со знанием Perl

3. Очередь по отправке Push

Для iOSNet::APNS::Persistent (ещё есть AnyEvent::APNS),

для проверки валидности токенов — Net::APNS::Feedback

Page 57: Cоздание приложений со знанием Perl

3. Очередь по отправке Push

Для AndroidWWW::Google::C2DM и WWW::Google::ClientLogin

Page 58: Cоздание приложений со знанием Perl

База данных

Page 59: Cоздание приложений со знанием Perl

Очень просто — mysqlДля хранения и очереди задач, чтобы не парится совсем :-)

Page 60: Cоздание приложений со знанием Perl

Два нюанса:

Page 61: Cоздание приложений со знанием Perl

1. Правильно создать индексыДля очередей задач

Page 62: Cоздание приложений со знанием Perl

2. Отключить кеширование запросов

select SQL_NO_CACHE * from task where ...

Page 63: Cоздание приложений со знанием Perl

Сайт и веб-версия

Page 66: Cоздание приложений со знанием Perl

Сайт и веб-версия

• Starman + Mojolicious

• Mojolicious::Plugin::I18N2— мой форк I18N-плаггина

• Mojolicious::Plugin::OAuth— логин через Net::OAuth::All

• Mojolicious::Plugin::ShareHelpers

• Mojolicious::Plugin::UtilHelpers

Page 67: Cоздание приложений со знанием Perl

Админ и статистика

Page 68: Cоздание приложений со знанием Perl

«Большой Брат»Есть вся информация по пользователям, количеству задач, фидбекам, а также риал-тайм статистика

Page 69: Cоздание приложений со знанием Perl

Статистика по пользователям

Page 70: Cоздание приложений со знанием Perl
Page 71: Cоздание приложений со знанием Perl

Стена пользователей

Page 72: Cоздание приложений со знанием Perl

Такой статистикинет у «обычных» приложений

Page 73: Cоздание приложений со знанием Perl

Удалено 1М+ твитов,3К+ пользователей,

20% покупаютЗа 2 месяца

Page 74: Cоздание приложений со знанием Perl

Промоутинг

Page 75: Cоздание приложений со знанием Perl

Промоутинг в ТвиттереФолловинг, фаворитс, поиск и реплаинг —

Net::Twitter(::Lite)

Page 76: Cоздание приложений со знанием Perl

Но меня уже три раза заблочили :-)

Промоутинг в Твиттере

Page 77: Cоздание приложений со знанием Perl

Резюме

Page 78: Cоздание приложений со знанием Perl

Плюсы• Получилось простое решение на Perl

(чистое время разработки ~30 часов)

• Быстро, очень быстро работает• Чётко удаляет твиты• Любое изменение, доработка, расширение сервисов по удалению — на стороне сервера, несложно

• Риал-тайм статистика

Page 79: Cоздание приложений со знанием Perl

Единственный минусУпал/сломался сервер — не работает приложение, пользователи негодуют, ставят колы и матерят :-)

Page 80: Cоздание приложений со знанием Perl

Check out DLTTR!http://dlttr.com/app http://dlttr.com/android

www.dlttr.com

Page 81: Cоздание приложений со знанием Perl
Page 82: Cоздание приложений со знанием Perl

«С виду простое приложение, а на самом деле

— крутое и на Perl»

Page 83: Cоздание приложений со знанием Perl

P. S.

Page 84: Cоздание приложений со знанием Perl

На #BarCampKrrя рассказывал

«Разработка приложения: от идеи до запуска»

(без упоминания о Perl)

Page 85: Cоздание приложений со знанием Perl

И всё свелось к ... Perl :-)

«На каком языке программирования пишите?», «А почему?»,

«Трудно ли найти таких программистов?» :-)

Page 86: Cоздание приложений со знанием Perl

use Perl or die;

Page 87: Cоздание приложений со знанием Perl

Спасибо за внимание!Анатолий Шарифулин

YAPC::Russia 2012