20 modules i haven't yet talked about

Post on 05-Dec-2014

12,618 views 4 download

description

 

transcript

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)

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 &amp; Schwern</heroes>

What’s wrong?

<?xml version=”1.0”?><shout>I &hearts; Perl</shout>

What’s wrong?

<?xml version=”1.0”?><shout>I &#x2665; 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&amp;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