Модули Net::*, использующие LWP::UserAgent – зло?!

34
Модули Net::*, использующие LWP::UserAgent зло?! YAPC::Russia 2009 Блиц-доклад 17 мая 2009 г.

description

YAPC::Russia 2009 "May Perl 2"

Transcript of Модули Net::*, использующие LWP::UserAgent – зло?!

Page 1: Модули Net::*, использующие LWP::UserAgent – зло?!

Модули Net::*, использующие

LWP::UserAgent – зло?!YAPC::Russia 2009Блиц-доклад

17 мая 2009 г.

Page 2: Модули Net::*, использующие LWP::UserAgent – зло?!

YAPC Russia 200817 мая 2009 г.

Page 3: Модули Net::*, использующие LWP::UserAgent – зло?!

CGI.pm – зло!?17 мая 2009 г.

Page 4: Модули Net::*, использующие LWP::UserAgent – зло?!

Net::* и WWW::*

• Net::LastFM

• Net::LastFM::Submission

• Net::Twitter

• Net::FriendFeed

• WWW::Alexa::TrafficRank

17 мая 2009 г.

Page 5: Модули Net::*, использующие LWP::UserAgent – зло?!

Net::* и WWW::*

• Net::LastFM

• Net::LastFM::Submission

• Net::Twitter

• Net::FriendFeed

• WWW::Alexa::TrafficRank

17 мая 2009 г.

Page 6: Модули Net::*, использующие LWP::UserAgent – зло?!

Perl interface to the XXX API

17 мая 2009 г.

Page 7: Модули Net::*, использующие LWP::UserAgent – зло?!

use LWP::UserAgent;

17 мая 2009 г.

Page 8: Модули Net::*, использующие LWP::UserAgent – зло?!

Net::* и WWW::*my $submit = Net::LastFM::Submission->new( . . ., ua => LWP::UserAgent->new( agent => 'nls', timeout => 5, ),);

my $twitter = Net::Twitter->new( . . ., useragent_class => LWP::UserAgent->new(...),);

my $alexa = WWW::Alexa::Traffic->new(timeout => 5);

17 мая 2009 г.

Page 9: Модули Net::*, использующие LWP::UserAgent – зло?!

Все хорошо, все работает!

17 мая 2009 г.

Page 10: Модули Net::*, использующие LWP::UserAgent – зло?!

но...

17 мая 2009 г.

Page 11: Модули Net::*, использующие LWP::UserAgent – зло?!

LWP::UserAgent – блокирующий

17 мая 2009 г.

Page 12: Модули Net::*, использующие LWP::UserAgent – зло?!

LWP::UserAgent::POE – неблокирующий

17 мая 2009 г.

Page 13: Модули Net::*, использующие LWP::UserAgent – зло?!

Не решает всех проблем :)

17 мая 2009 г.

Page 14: Модули Net::*, использующие LWP::UserAgent – зло?!

Не решает всех проблем

• «Связывает» руки

• Невозможно использовать свой POE-клиент

• Хочу AnyEvent, IO::Lambda или что-то свое :)

17 мая 2009 г.

Page 15: Модули Net::*, использующие LWP::UserAgent – зло?!

POE::Component::WWW::Alexa::TrafficRank

non-blocking wrapper around WWW::Alexa::TrafficRank

17 мая 2009 г.

Page 16: Модули Net::*, использующие LWP::UserAgent – зло?!

use POE::Wheel::Run;Форкается :)

17 мая 2009 г.

Page 17: Модули Net::*, использующие LWP::UserAgent – зло?!

НехорошоТ. к. нужно выполнить только блокирующий запрос

LWP::UserAgent

17 мая 2009 г.

Page 18: Модули Net::*, использующие LWP::UserAgent – зло?!

Что же делать?

17 мая 2009 г.

Page 19: Модули Net::*, использующие LWP::UserAgent – зло?!

POE::Component::TwitterСобственная реализация Twitter API,

не использует Net::Twitter

17 мая 2009 г.

Page 20: Модули Net::*, использующие LWP::UserAgent – зло?!

НехорошоТ. к. не использует Net::Twitter

Клон!? :)

17 мая 2009 г.

Page 21: Модули Net::*, использующие LWP::UserAgent – зло?!

Что же делать?

• Net::LastFM::Submission

• разделить механизм создания запроса и обработки ответа от посылки запроса и ожидания ответа

• решает все проблемы• очень легко!• гармонично :)

17 мая 2009 г.

Page 22: Модули Net::*, использующие LWP::UserAgent – зло?!

Net::LastFM::Submission

• Создание запросов: HTTP::Request

• _request_handshake

• _request_now_playing

• _request_submit

• Обрабокта ответа: HTTP::Response

• _response

17 мая 2009 г.

Page 23: Модули Net::*, использующие LWP::UserAgent – зло?!

Не использовать в этих методах

die / croak / confessРекомендация

17 мая 2009 г.

Page 24: Модули Net::*, использующие LWP::UserAgent – зло?!

Net::LastFM::Submission no strict 'refs'; for my $m ('handshake', 'now_playing', 'submit') { *{$m} = sub { my $self = shift; my $r = $self->${\"_request_$m"}(@_); . . . my $data = $self->_response( $self->{'ua'}->request($r) ); . . . return $data; }; }

17 мая 2009 г.

Page 25: Модули Net::*, использующие LWP::UserAgent – зло?!

POE::Component::Net::LastFM::Submission

non-blocking wrappertruelly asynchronously

17 мая 2009 г.

Page 26: Модули Net::*, использующие LWP::UserAgent – зло?!

POE::Component::Net::LastFM::Submission

use POE::Component::Client::HTTP;также поддерживает возможность использовать

свой POE-клиет

17 мая 2009 г.

Page 27: Модули Net::*, использующие LWP::UserAgent – зло?!

POE::Component::Net::LastFM::Submission(map { my $m = $_; $m => sub { my $request = $_[HEAP]->{'submit'} ->${\"_request_$m"}($_[ARG1]); . . . $_[KERNEL]->post( $_[HEAP]->{'client'} => 'request' => 'response', $request, ); };} 'handshake', 'now_playing', 'submit'),

17 мая 2009 г.

Page 28: Модули Net::*, использующие LWP::UserAgent – зло?!

Net::LastFM::SubmissionP::C::N::LastFM::Submission

http://github.com/sharifulin/net-lastfm-submission

17 мая 2009 г.

Page 29: Модули Net::*, использующие LWP::UserAgent – зло?!

Net::LastFMP::C::Net::LastFM

http://github.com/sharifulin/net-lastfm

17 мая 2009 г.

Page 30: Модули Net::*, использующие LWP::UserAgent – зло?!

Модули Net::*, использующие тупо

LWP::UserAgent – зло!

17 мая 2009 г.

Page 31: Модули Net::*, использующие LWP::UserAgent – зло?!

Net::FriendFeedКаппа, я тебя убедил?

Внесешь изменения в свой модуль? :)

17 мая 2009 г.

Page 32: Модули Net::*, использующие LWP::UserAgent – зло?!

use Perlor die

17 мая 2009 г.

Page 33: Модули Net::*, использующие LWP::UserAgent – зло?!

JFDI

17 мая 2009 г.

Page 34: Модули Net::*, использующие LWP::UserAgent – зло?!

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

RostovOnDon.pm

17 мая 2009 г.