Developing apps using Perl
Upcoming SlideShare
Loading in...5

Developing apps using Perl



Talk from PerlMova 2012 and YAPC::Russia "May Perl"

Talk from PerlMova 2012 and YAPC::Russia "May Perl"



Total Views
Views on SlideShare
Embed Views



13 Embeds 2,889 1680 1110 72 16 3 1 1 1 1 1 1 1 1



Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

Developing apps using Perl Developing apps using Perl Presentation Transcript

  • Developing apps using Perl Anatoly Sharifulin YAPC::Russia 2012
  • Hello, World!
  • «Happy Perl developer» about me by Andy Shitov
  • I program in Perl less But it doesnt mean I love it less :-)
  • JFDI became JFTI Just F*cking Talk about It
  • Success-story of one appAnd how Perl helped me/us with it
  • By us I mean Applifto
  • Our applications
  • Audience polling
  • «Why?» and «For what?» in details
  • A powerful reason for me I was moving from LiveJournal to Posterous,used transfer scripts and changed Twitter and Facebook crossposting settings when started to get replies like Tolya! Stop it! Enough!
  • Current analogues are nice... not! Slow, awkward, plain, trouble working:TwitWipe, TwitCide, Delete My Tweets, ...
  • «Stop managering,let’s start programming» And have a talk at #yr2012 :-)
  • Approach and solutions
  • Main aims for me• App must delete tweets quickly• Appropriate deleting• Cross-platform app: iOS, Android, Web, ...
  • Server API — hello, Perl!All logic — on our server API (not Twitter API), clients is simple interface
  • Getting to know Twitter API
  • Little experience:• Getting user profiles after login through Twitter on websites• Auto-posting to Twitter with Net::Twitter(::Lite)• AnyEvent::Twitter::Stream for real-time search (hey, @miyagawa!)
  • Blocking wayTask can be solved with Net::Twitter(::Lite)
  • LWP::UserAgent::POETransport may be changed in Net::Twitter(::Lite)
  • NO
  • Idea — 2 separate asynchronous queuesGet timeline and delete tweets using REST Twitter API and asynchronous requests
  • This has to work fast!
  • Authorization and OAuth
  • Net::OAuth::AllWeve written our OAuth module long time ago, supports all OAuth versions (1.0, 1.0A, 2.0)
  • Net::OAuth::All
  • 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},);
  • $oauth ->via(GET) ->protected_resource_url(’) ->put_extra( include_rts => true, user_id => $user->{id}, count => 200, ) ->request(protected_resource);$oauth->to_header;$oauth->url; # $oauth->url_with_extra;
  • Patched the module Unauthorized user:limit of 150 requests per hour from one IP, not 350 requests per hour from one user
  • Asynchronous requests
  • I use Mojolicious Not a secret at all :-)
  • Mojo::UserAgent Mojo::IOLoop Good asynchronous HTTP client
  • my $delay = Mojo::IOLoop->delay;for (@$tasks) { ... $delay->begin; $ua->get($url => {Authorization => $h} => sub { my ($ua, $tx) = @_; ... $delay->end( ... ); });}say $delay->wait;
  • Server API
  • Server APIAPI supports GET and POST requests, JSON transmission format, response codes 200 and 50x.
  • Server API Starman + MojoliciousMojolicious::Plugin::ApiHelpers
  • Server API
  • 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;
  • 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);
  • 10 methods,123 tests and documentation Most methods require user authorization and check sign (api_id + secret)
  • Test::Mojo Test::More Testing API methods access,input-output data, signature check and etc.
  • Test::Mojo Test::MoreA real task from a test user
  • All methods are covered Without Mock-objects, no checkif a correct cluster of tweets have been deleted
  • Too laboriousand needless A real cycle cannot be tested:posting tweets – deleting – check
  • $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}});
  • Too risky to test onyour own account :-)— You dont care about you Twitter acc, do you?— Yep!— So I can delete all your tweets?— Nooooooooooooooo!!!
  • Simple debug reguestsTo check the quality of client work requests/responses with before_dispatch + after_dispatch may be used
  • Three queues
  • 1. Queue for timelines Search and filters on tweets ID to delete, paging with since_id and max_id
  • 1. Queue for timelines Max. 200 tweets per request, getting timeline one by one per user, Rate Limit check
  • «Limits» by Twitter No access to all tweets,only the latest ~3200 or starting from any exact date, counter is not on zero and etc.
  • 2. Queue for deleting tweetsDeleting with clusters of 200 tweets, no limits. «Buster» or «Cannon» :-)
  • 2. Queue for deleting tweets Error processing — Twitter API error doesnt always mean a failure
  • 3. Queue for Push notify On iOS Net::APNS::Persistent (also AnyEvent::APNS),to check if tokens are valid — Net::APNS::Feedback
  • 3. Queue for Push notify On AndroidWWW::Google::C2DM and WWW::Google::ClientLogin
  • Database
  • So easy — mysql Storing and task orders, just to relax :-)
  • 2 finer points:
  • 1. Create correct index For queues
  • 2. Disable request cachingselect SQL_NO_CACHE * from task where ...
  • Site and web-version
  • Site and web-version• Starman + Mojolicious• Mojolicious::Plugin::I18N2 — my fork of I18N plugin• Mojolicious::Plugin::OAuth — login through Net::OAuth::All• Mojolicious::Plugin::ShareHelpers• Mojolicious::Plugin::UtilHelpers
  • Admin and statistics
  • «Big Brother»All details on users, number of tasks, feedbacks and real-time statistics
  • Statistics on users
  • Users wall
  • «Ordinary» apps donthave statistics like that
  • 1M+ tweets deleted, 3K+ users,20% make purchase For 2 months
  • Promotion
  • Promotion on Twitter Following, favorites, replies and search — Net::Twitter(::Lite)
  • Promotion on Twitter But they blocked me three times already :-)
  • Summary
  • Positive• Easy solution using pure Perl (work time is about 30 hours)• Works fast, really fast• Right delete tweets• Any changes, updates, new services — everythings on the server, no hard• Real-time statistics
  • Only one negative: Servers down — the app doesnt work,users become mad, low rates and spell curses :-)
  • Check out DLTTR!
  • «Seems like a simple app but in fact its awesome and in Perl»
  • P. S.
  • At #BarCampKrr I had a talk «Developing app from idea to release»(Perl wasnt mentioned)
  • But everything came down to... Perl «What language do you use?», «But why?»,«Is it difficult to find programmers like those?» :-)
  • use Perl or die;
  • Thanks! Anatoly SharifulinYAPC::Russia 2012