Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Создание приложений   со знанием Perl     Анатолий Шарифулин      YAPC::Russia 2012
Hello, World!
«СчастливыйPerl-программист»   Андрей Шитов про меня
Я стал меньшепрограммировать на Perl    Но не стал его меньше любить :-)
JFDI превратилось JFTI      Just F*cking Talk about It
Success-storyодного приложения  И как Perl мне/нам помог в этом
Нам — это Applifto
www.applifto.ru
Наши приложения
Опрос аудитории
DLTTR.com
Подробно«Зачем?» и «Почему?»http://www.slideshare.net/sharifulin/ss-12313103
Веский повод для меня Я переезжал с ЖЖ в Posterous, написал скриптыпереноса, но настроил кросс-постинг в Твиттер и    Фейс...
Существующее  аналоги — не оченьМедленные, неудобные, некрасивые, «криво» удаляют:      TwitWipe, TwitCide, Delete My Twee...
«Хватить техдирить,пора попрограммировать»    И выступить на #yr2012 с докладом :-)
Подход и решение
Основные цели• Приложение должно быстро удалять твиты• Чёткое удаление• Кросс-платформенное приложение:  iOS, Android, Web...
Серверное API —     привет, Perl!Вся логика на стороне сервера (не Твиттер API),       клиенты — «тупые» интерфейсы
Знакомствос Твиттер API
Опыта мало:• Получение профилей пользователей  после авторизации через Твиттер на сайте• Автоматический постинг в Твиттер ...
Блокирующий вариантНа базе Net::Twitter(::Lite) можно решить задачу
LWP::UserAgent::POEМожно заменить транспорт в Net::Twitter(::Lite)
НЕТ
Идея — 2 независимыеасинхронные очереди    Получение таймлайна и удаление твитов,используя REST Twitter API и асинхронные ...
Такой вариант должен  работать быстро!
Авторизация и OAuth
Net::OAuth::All Мы давно написали свой модуль для OAuth.Поддерживает все версии OAuth (1.0, 1.0A, 2.0).
Net::OAuth::Allhttps://github.com/likhatskiy/Net-OAuth-All
my $oauth = Net::OAuth::All->new(	 consumer_secret => $conf->{consumer_secret},	 consumer_key => $conf->{consumer_key },	 ...
$oauth	 ->via(GET)	 ->protected_resource_url(https://api.twiiter.com/...’)	 ->put_extra(	 	 include_rts => true,	 	 user_i...
Пропатчил модуль     Пользователь неавторизован:   ограничение150 запрос в час по IP,а не 350 запросов в час на пользователя
Асинхронные запросы
Я использую Mojolicious      Ни для кого не секрет :-)
Mojo::UserAgent Mojo::IOLoopОтличный асинхронный HTTP-клиент
my $delay = Mojo::IOLoop->delay;for (@$tasks) {   ...   $delay->begin;   $ua->get($url => {Authorization => $h} => sub {  ...
Серверное API
Серверное APIAPI поддерживает GET и POST запросы,  формат передачи данных — JSON,        коды ответа: 200 и 50x.
Серверное API   Starman + MojoliciousMojolicious::Plugin::ApiHelpers
Серверное API   http://api.dlttr.com
package App::Api;use App::Base -controller,  with => [ App::Task, App::User ];sub error { shift->api_error(code => 1) }sub...
my $api = $r->route(/api)->to(api#, api => 1);$api->route(/:action, action => qr/login|oauth/)->to;my $apiu = $api->bridge...
10 методов,123 теста   и документацияБольшинство методов требуют авторизациюпользователя и проверка sign (api_id + secret)
Test::Mojo и Test::More       Тестируется доуступ к методам API,входные-выходные данные, проверка подписи и т.д.
Test::Mojo и Test::MoreСтавится реальная задача от тестового пользователя
Покрыты все методы Но нет никаких Mock-объектов, нет проверки,    правильный ли удалён диапазон твитов
Это трудоёмко    и излишне  Нет тестирования реального цикла:постинг твитов — удаление — проверка
$t->get_ok("$url/")  ->status_is(200)  ->header_is(Access-Control-Allow-Origin, *)  ->json_content_is({hello => Hello DLTT...
Опасно тестить на своём аккаунте :-)— Тебе всё равно на свой Твиттер?— Да!— Давай я удалю все твиты?— Нееееееееет!!!
Простой      debug-запросовДля проверки качества работы «клиентов» удобно        логировать запросы с помощью         befo...
Три очереди-демона
1. Очередь работы       с таймлайномФильтрация и поиск нужных для удаления ID твитов,     пейджинг с помощью since_id и ma...
1. Очередь работы   с таймлайном Максимум 200 твитов за один запрос, получение таймлайна один за одним,         проверка R...
«Ограничения»         ТвиттераНет доступа ко всем твитам, только к последним  ~3200 или не позднее определённой даты,     ...
2. Очередь  по удалению твитовУдаление «пачками» по 200 штук, нет ограничений.      «Отбойный молоток» или «Пушка» :-)
2. Очередьпо удалению твитов   Обработка ошибок — не всегда ошибкаот Твиттер API означает невыполнение задачи
3. Очередь        по отправке Push                         Для iOS     Net::APNS::Persistent (ещё есть AnyEvent::APNS),для...
3. Очередь   по отправке Push                Для AndroidWWW::Google::C2DM и WWW::Google::ClientLogin
База данных
Очень просто — mysql    Для хранения и очереди задач,     чтобы не парится совсем :-)
Два нюанса:
1. Правильно создать      индексы      Для очередей задач
2. Отключитькеширование запросов select SQL_NO_CACHE * from task where ...
Сайт и веб-версия
www.dlttr.com
www.dlttr.com
Сайт и веб-версия• Starman + Mojolicious• Mojolicious::Plugin::I18N2  — мой форк I18N-плаггина• Mojolicious::Plugin::OAuth...
Админ и статистика
«Большой Брат»Есть вся информация по пользователям, количеству   задач, фидбекам, а также риал-тайм статистика
Статистика по пользователям
Стена пользователей
Такой статистики нет у «обычных»   приложений
Удалено 1М+ твитов, 3К+ пользователей,   20% покупают       За 2 месяца
Промоутинг
Промоутинг в Твиттере  Фолловинг, фаворитс, поиск и реплаинг —             Net::Twitter(::Lite)
Промоутинг в Твиттере   Но меня уже три раза заблочили :-)
Резюме
Плюсы• Получилось простое решение на Perl  (чистое время разработки ~30 часов)• Быстро, очень быстро работает• Чётко удаля...
Единственный минусУпал/сломался сервер — не работает приложение,пользователи негодуют, ставят колы и матерят :-)
Check out DLTTR!http://dlttr.com/app http://dlttr.com/android                www.dlttr.com
«С виду простое   приложение, а на самом деле— крутое и на Perl»
P. S.
На #BarCampKrr      я рассказывал«Разработка приложения:   от идеи до запуска» (без упоминания о Perl)
И всё свелось к ...       Perl :-)«На каком языке программирования пишите?»,                «А почему?», «Трудно ли найти ...
use Perl or die;
Спасибо за внимание!     Анатолий Шарифулин      YAPC::Russia 2012
Cоздание приложений со знанием Perl
Cоздание приложений со знанием Perl
Upcoming SlideShare
Loading in …5
×

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

1,664 views

Published on

Доклад с #yr2012

Оригинал http://www.slideshare.net/sharifulin/developing-apps-using-perl

Published in: Education
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Создание приложений со знанием Perl Анатолий Шарифулин YAPC::Russia 2012
  2. 2. Hello, World!
  3. 3. «СчастливыйPerl-программист» Андрей Шитов про меня
  4. 4. Я стал меньшепрограммировать на Perl Но не стал его меньше любить :-)
  5. 5. JFDI превратилось JFTI Just F*cking Talk about It
  6. 6. Success-storyодного приложения И как Perl мне/нам помог в этом
  7. 7. Нам — это Applifto
  8. 8. www.applifto.ru
  9. 9. Наши приложения
  10. 10. Опрос аудитории
  11. 11. DLTTR.com
  12. 12. Подробно«Зачем?» и «Почему?»http://www.slideshare.net/sharifulin/ss-12313103
  13. 13. Веский повод для меня Я переезжал с ЖЖ в Posterous, написал скриптыпереноса, но настроил кросс-постинг в Твиттер и Фейсбук, получил реплаи «Толя, хватит!»
  14. 14. Существующее аналоги — не оченьМедленные, неудобные, некрасивые, «криво» удаляют: TwitWipe, TwitCide, Delete My Tweets, ...
  15. 15. «Хватить техдирить,пора попрограммировать» И выступить на #yr2012 с докладом :-)
  16. 16. Подход и решение
  17. 17. Основные цели• Приложение должно быстро удалять твиты• Чёткое удаление• Кросс-платформенное приложение: iOS, Android, Web, ...
  18. 18. Серверное API — привет, Perl!Вся логика на стороне сервера (не Твиттер API), клиенты — «тупые» интерфейсы
  19. 19. Знакомствос Твиттер API
  20. 20. Опыта мало:• Получение профилей пользователей после авторизации через Твиттер на сайте• Автоматический постинг в Твиттер с помощью Net::Twitter(::Lite)• AnyEvent::Twitter::Stream для риал-тайм поиска (привет, @miyagawa!)
  21. 21. Блокирующий вариантНа базе Net::Twitter(::Lite) можно решить задачу
  22. 22. LWP::UserAgent::POEМожно заменить транспорт в Net::Twitter(::Lite)
  23. 23. НЕТ
  24. 24. Идея — 2 независимыеасинхронные очереди Получение таймлайна и удаление твитов,используя REST Twitter API и асинхронные запросы
  25. 25. Такой вариант должен работать быстро!
  26. 26. Авторизация и OAuth
  27. 27. Net::OAuth::All Мы давно написали свой модуль для OAuth.Поддерживает все версии OAuth (1.0, 1.0A, 2.0).
  28. 28. Net::OAuth::Allhttps://github.com/likhatskiy/Net-OAuth-All
  29. 29. 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},);
  30. 30. $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;
  31. 31. Пропатчил модуль Пользователь неавторизован: ограничение150 запрос в час по IP,а не 350 запросов в час на пользователя
  32. 32. Асинхронные запросы
  33. 33. Я использую Mojolicious Ни для кого не секрет :-)
  34. 34. Mojo::UserAgent Mojo::IOLoopОтличный асинхронный HTTP-клиент
  35. 35. my $delay = Mojo::IOLoop->delay;for (@$tasks) { ... $delay->begin; $ua->get($url => {Authorization => $h} => sub { my ($ua, $tx) = @_; ... $delay->end( ... ); });}say $delay->wait;
  36. 36. Серверное API
  37. 37. Серверное APIAPI поддерживает GET и POST запросы, формат передачи данных — JSON, коды ответа: 200 и 50x.
  38. 38. Серверное API Starman + MojoliciousMojolicious::Plugin::ApiHelpers
  39. 39. Серверное API http://api.dlttr.com
  40. 40. 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;
  41. 41. 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);
  42. 42. 10 методов,123 теста и документацияБольшинство методов требуют авторизациюпользователя и проверка sign (api_id + secret)
  43. 43. Test::Mojo и Test::More Тестируется доуступ к методам API,входные-выходные данные, проверка подписи и т.д.
  44. 44. Test::Mojo и Test::MoreСтавится реальная задача от тестового пользователя
  45. 45. Покрыты все методы Но нет никаких Mock-объектов, нет проверки, правильный ли удалён диапазон твитов
  46. 46. Это трудоёмко и излишне Нет тестирования реального цикла:постинг твитов — удаление — проверка
  47. 47. $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}});
  48. 48. Опасно тестить на своём аккаунте :-)— Тебе всё равно на свой Твиттер?— Да!— Давай я удалю все твиты?— Нееееееееет!!!
  49. 49. Простой debug-запросовДля проверки качества работы «клиентов» удобно логировать запросы с помощью before_dispatch + after_dispatch
  50. 50. Три очереди-демона
  51. 51. 1. Очередь работы с таймлайномФильтрация и поиск нужных для удаления ID твитов, пейджинг с помощью since_id и max_id
  52. 52. 1. Очередь работы с таймлайном Максимум 200 твитов за один запрос, получение таймлайна один за одним, проверка Rate Limit
  53. 53. «Ограничения» ТвиттераНет доступа ко всем твитам, только к последним ~3200 или не позднее определённой даты, счётчик не-ноль и т.д.
  54. 54. 2. Очередь по удалению твитовУдаление «пачками» по 200 штук, нет ограничений. «Отбойный молоток» или «Пушка» :-)
  55. 55. 2. Очередьпо удалению твитов Обработка ошибок — не всегда ошибкаот Твиттер API означает невыполнение задачи
  56. 56. 3. Очередь по отправке Push Для iOS Net::APNS::Persistent (ещё есть AnyEvent::APNS),для проверки валидности токенов — Net::APNS::Feedback
  57. 57. 3. Очередь по отправке Push Для AndroidWWW::Google::C2DM и WWW::Google::ClientLogin
  58. 58. База данных
  59. 59. Очень просто — mysql Для хранения и очереди задач, чтобы не парится совсем :-)
  60. 60. Два нюанса:
  61. 61. 1. Правильно создать индексы Для очередей задач
  62. 62. 2. Отключитькеширование запросов select SQL_NO_CACHE * from task where ...
  63. 63. Сайт и веб-версия
  64. 64. www.dlttr.com
  65. 65. www.dlttr.com
  66. 66. Сайт и веб-версия• Starman + Mojolicious• Mojolicious::Plugin::I18N2 — мой форк I18N-плаггина• Mojolicious::Plugin::OAuth — логин через Net::OAuth::All• Mojolicious::Plugin::ShareHelpers• Mojolicious::Plugin::UtilHelpers
  67. 67. Админ и статистика
  68. 68. «Большой Брат»Есть вся информация по пользователям, количеству задач, фидбекам, а также риал-тайм статистика
  69. 69. Статистика по пользователям
  70. 70. Стена пользователей
  71. 71. Такой статистики нет у «обычных» приложений
  72. 72. Удалено 1М+ твитов, 3К+ пользователей, 20% покупают За 2 месяца
  73. 73. Промоутинг
  74. 74. Промоутинг в Твиттере Фолловинг, фаворитс, поиск и реплаинг — Net::Twitter(::Lite)
  75. 75. Промоутинг в Твиттере Но меня уже три раза заблочили :-)
  76. 76. Резюме
  77. 77. Плюсы• Получилось простое решение на Perl (чистое время разработки ~30 часов)• Быстро, очень быстро работает• Чётко удаляет твиты• Любое изменение, доработка, расширение сервисов по удалению — на стороне сервера, несложно• Риал-тайм статистика
  78. 78. Единственный минусУпал/сломался сервер — не работает приложение,пользователи негодуют, ставят колы и матерят :-)
  79. 79. Check out DLTTR!http://dlttr.com/app http://dlttr.com/android www.dlttr.com
  80. 80. «С виду простое приложение, а на самом деле— крутое и на Perl»
  81. 81. P. S.
  82. 82. На #BarCampKrr я рассказывал«Разработка приложения: от идеи до запуска» (без упоминания о Perl)
  83. 83. И всё свелось к ... Perl :-)«На каком языке программирования пишите?», «А почему?», «Трудно ли найти таких программистов?» :-)
  84. 84. use Perl or die;
  85. 85. Спасибо за внимание! Анатолий Шарифулин YAPC::Russia 2012

×