Download - 20 modules i haven't yet talked about
20 modules I haven’t yet talked about
Tatsuhiko MiyagawaShibuya Perl Mongers / Six Apart
20 modules I haven’t yet talked about
Tatsuhiko MiyagawaShibuya Perl Mongers / Six Apart
10
#1
YAPC and WiFi
HTTP::ProxyPAC use HTTP::ProxyPAC; use LWP::UserAgent;
my $ua = LWP::UserAgent->new; my $uri = URI->new("http://portal.titech.ac.jp/proxy.pac"); my $pac = HTTP::ProxyPAC->new($uri);
my $res = $pac->find_proxy("http://www.google.com/");
if ($res->direct) { # ... } elsif ($res->proxy) { $ua->proxy('http' => $res->proxy); }
use JavaScript::Runtime;
sub init { my($class, $code) = @_;
my $runtime = JavaScript::Runtime->new; my $context = $runtime->create_context();
for my $func (@HTTP::ProxyPAC::Functions::PACFunctions) { no strict 'refs'; $context->bind_function( name => $func, func => sub { &{"HTTP::ProxyPAC::Functions::$func"}(@_) }); }
$context->eval($code);
bless { context => $context }, $class;}
package HTTP::ProxyPAC::Functions;# stolen from HTTP::ProxyAutoConfig
sub isPlainHostName { my ($host) = @_;
return (($host =~ /\./) ? 0 : 1);}
sub dnsResolve { my ($host) = @_; return unless isResolvable($host); return inet_ntoa(inet_aton($host));}
sub myIpAddress { return inet_ntoa(inet_aton(hostname()));}
ENODEMOSpindermonkey (libjs) and OS X
hate each other :<
#2(speaking of JavaScript...)
pQueryWeb::Scraper’s friend
use pQuery::DOM;
my $v = pQuery::DOM->fromHTML('<div id="foo">bar</div>') ->getElementById('foo')->innerHTML;
use pQuery::DOM;no capitalization ‘pQuery::DOM’;
my $v = pQuery::DOM->fromHTML('<div id="foo">bar</div>') ->get_element_by_id('foo')->innerHTML;
#3(speaking of P...)
MigratingPHP apps to Perl
6 years ago...• I’ve got a call from our sales guy
• “We’re closing a deal to migrate PHP apps to Perl”
• “... while keeping PHP apps writing data and Perl for more views”
• and I was drunken
Crazy Idea:share PHP session with Perl
PHP sessions
• PHP data serialization
• /tmp/{session_id}
PHP::Session use PHP::Session;
my $session = PHP::Session->new($id);
# session id my $id = $session->id;
# get/set session data my $foo = $session->get('foo'); $session->set(bar => $bar);
I’ve never used it.
#4(speaking of “many people use it”)
Ruby on RailsActiveSupport
when = 60.days.agodatasize = 200.megabytes
autobox
use autobox; use autobox::DateTime::Duration;
# equivalent to DateTime::Duration->new(months => 1, days => 2); $duration = 1->month + 2->days;
# equivalent to DateTime->now->add(years => 2); $datetime = 2->years->from_now;
# equivalent to DateTime->now->add(months => 4, years => 5); $datetime = (4->months + 5->years)->from_now;
# equivalent to DateTime->now->subtract(days => 3); $datetime = 3->days->ago;
See also:autobox::Numeric::(Bytes|Time)
on CodeRepos (hirose31)
#5(speaking of numbers)
my $ttl = 608400; # 7 days
my $ttl = 608400; # 7 days604800
my $ttl = 24 * 60 * 60 * 7; # 7 days
use Time::Duration::Parse;
my $ttl = parse_duration “7 days”;
Useful to set values in .conf filesbecause it’s a string and readable
#6(speaking of strings...)
UnicodeDo you understandPerl & Unicode?
UnicodeDo you really understand
Perl & Unicode?
I guess not.
$x = “\x{5bae}”; # Unicode$y = “\xe5\xae\xae”; # UTF-8
$z = $x . $y;
$x = “\x{5bae}”; # Unicode$y = “\xe5\xae\xae”; # UTF-8
$z = $x . $y; \x{5bae}\x{e5}\x{ae}\x{ae}
Perl DTRTbut not DWIM
Fix It (correctly)use Encode;
$x = “\x{5bae}”; # Unicode$y = “\xe5\xae\xae”; # UTF-8
$z = $x . decode_utf8($y);
Fix It (evilly)use Encode::DoubleEncodedUTF8;
$x = “\x{5bae}”; # Unicode$y = “\xe5\xae\xae”; # UTF-8
$z = $x . $y;$z = decode(“utf-8-de”, $z);
my $latin1_as_utf8 = "[\xC2\xC3][\x80-\xBF]";
my $valid_utf8_regexp = <<'.' ; [\x{00}-\x{7f}] | [\x{c2}-\x{df}][\x{80}-\x{bf}] | \x{e0} [\x{a0}-\x{bf}][\x{80}-\x{bf}] | [\x{e1}-\x{ec}][\x{80}-\x{bf}][\x{80}-\x{bf}] | \x{ed} [\x{80}-\x{9f}][\x{80}-\x{bf}] | [\x{ee}-\x{ef}][\x{80}-\x{bf}][\x{80}-\x{bf}] | \x{f0} [\x{90}-\x{bf}][\x{80}-\x{bf}] | [\x{f1}-\x{f3}][\x{80}-\x{bf}][\x{80}-\x{bf}][\x{80}-\x{bf}] | \x{f4} [\x{80}-\x{8f}][\x{80}-\x{bf}][\x{80}-\x{bf}].
sub decode { my($obj, $buf, $chk) = @_;
$buf =~ s{((?:$latin1_as_utf8){2,3})}{ _check_utf8_bytes($1) }ego; $_[1] = '' if $chk; # this is what in-place edit means
Encode::decode_utf8($buf);}
sub _check_utf8_bytes { my $bytes = shift; my $copy = $bytes;
my $possible_utf8 = ''; while ($copy =~ s/^(.)(.)//) { $possible_utf8 .= chr( (ord($1) << 6 & 0xff) | ord($2) ) }
$possible_utf8 =~ /$valid_utf8_regexp/xo ? $possible_utf8 : $bytes;}
#7(speaking of UTF-8)
http://ja.wikipedia.org/wiki/メインページ http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%
E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
use utf8;use URI::Find;
my $text = <<TEXT;Japanese Wikipedia home page URL ishttp://ja.wikipedia.org/wiki/メインページTEXT
my $finder = URI::Find->new(\&cb);$finder->find(\$text);
sub cb { warn shift }
# http://ja.wikipedia.org/wiki/
use utf8;use URI::Find::UTF8;
my $text = <<TEXT;Japanese Wikipedia home page URL ishttp://ja.wikipedia.org/wiki/メインページTEXT
my $finder = URI::Find::UTF8->new(\&cb);$finder->find(\$text);
sub cb { my($uri, $orig) = @_;}# http://ja.wikipedia.org/wiki/メインページ
#8(speaking of Japanese...)
How to spell your namesin Japanese Passport
Hepburn Romanization
ミヤガワ タツヒコMIYAGAWA TATSUHIKO
カトウ シュウヘイKATOU SHUUHEIKATOH SYUHEIKATO SHUHEIKATOH SHUHEI
Katakana <-> Alphabet
• Lingua::JA::Romanize::Japanese
• Lingua::JA::Kana
• Text::Kakasi
• Lingua::JA::Romaji
Lingua::JA::Hepburn::Passport
use Lingua::JA::Hepburn::Passport;
my $hepburn = Lingua::JA::Hepburn::Passport->new;$hepburn->romanize("かとう しゅうへい");
# KATO SHUHEI
#9(speaking of Passport/ID ...)
Online ID/PW management
How to manage
• Password manager (IE/Firefox)?
• SSH Agent?
• Keychain?
• 1Password or KeePassX?
What about Perl?my $user = “miyagawa”;my $pass = “blahblah”;
$api->login($user, $pass);
LWP::UserAgent with Keychain
use LWP::UserAgent::Keychain;
my $ua = LWP::UserAgent::Keychain->new; $ua->get("http://proteceted.example.com/");
DEMO
#10(speaking of the Web...)
XML
What’s wrong?
<?xml version=”1.0”?><heroes>Larry & Schwern</heroes>
What’s wrong?
<?xml version=”1.0”?><heroes>Larry & Schwern</heroes>
What’s wrong?
<?xml version=”1.0”?><shout>I ♥ Perl</shout>
What’s wrong?
<?xml version=”1.0”?><shout>I ♥ Perl</shout>
What’s wrong?
<?xml version=”1.0”?><div><a href=”/search?q=YAPC&Asia”>link</a></div>
What’s wrong?
<?xml version=”1.0”?><div><a href=”/search?q=YAPC&Asia”>link</a></div>
What’s wrong?<?xml version=”1.0”?><rss><channel><item><summary>YAPC rocks</summary><xhtml:body>YAPC <xhtml:strong>really</xhtml:strong> rocks.</xhtml:body></item></channel></rss>
What’s wrong?<?xml version=”1.0”?><rss xmlns:xhtml=”http://www.w3.org/1999/xhtml”><channel><item><summary>YAPC rocks</summary><xhtml:body>YAPC <xhtml:strong>really</xhtml:strong> rocks.</xhtml:body></item></channel></rss>
People are stupidCloud is full of crapSoftware can fix it
XML::Liberal
• Uses XML::LibXML diagnostics to automatically fixed the errors
• Badly named (“That’s NOT an XML you’re talking about”)
use XML::LibXML;my $parser = XML::LibXML->new;my $doc = $parse->parse_string($xml);
use XML::Liberal;my $parser = XML::Liberal->new(‘LibXML’);my $doc = $parse->parse_string($xml);
Bonus
•No performance penalty if the given XML is valid
That’s it!
• Go to search.cpan.org/~miyagawa for more!
• I want to hear your version of this talk if you have > 10 modules on CPAN
Thank you