Your SlideShare is downloading. ×
Cоздание приложений со знанием Perl
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

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

905
views

Published on

Доклад с #yr2012 …

Доклад с #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
905
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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