0
Создание приложений   со знанием 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

991

Published on

Доклад с #yr2012

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

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
991
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×