2011/06/16


タイトル長い!

言ったからには自分で書こう...
Twitter / mattn: 当たり前だと思うけど、PerlerならWeb::Sc ...

当たり前だと思うけど、PerlerならWeb::Scraperでアカウント名取ってNet::Twitter::Liteでfollowするよね? #perl http://d.hatena.ne.jp/...

https://twitter.com/mattn_jp/status/81320211634069504
所要時間、約10分
use strict;
use warnings;

use Config::Pit;
use Net::Twitter::Lite;
use URI;
use Web::Scraper;

my $uri = URI->new('http://d.hatena.ne.jp/sugyan/20110616/1308203734');

my $config = pit_get('api.twitter.com');
my $nt     = Net::Twitter::Lite->new(%$config);

my $helper = scraper {
    process '//div[@class="body"]//a[contains(@href,"http://twitter.com/")]',
      'link[]' => '@href';
};

$helper->user_agent->env_proxy;

my $res = $helper->scrape($uri);
for my $link (@{$res->{link}}) {
    print "$link\n";
    $link =~ s!.*/!!;
    #$nt->follow( $link ); # ココのコメント外してね
}

※ただし、動かした事がない。

Posted at by



2011/04/04


昔どこぞのパクリブログ対策でやってた奴をPlack::Middlewareで。

mattn/Plack-Middleware-ReplaceToUnko - GitHub

plack middleware for replacing images to shit image that referer from external sites.

https://github.com/mattn/Plack-Middleware-ReplaceToUnko

指定の仕方も簡単で、ウンコ画像のURLを指定するだけ。
use strict;
use warnings;
use utf8;
use lib 'lib';
use Plack::Builder;
use Path::Class qw(file);

my $app = sub { [ 302, [ "Location" => "/index.html" ], [] ] };

builder {
    enable 'ReplaceToUnko'unko_image_url => "/unko.png";
    enable 'Static',
      path     => qr{^/.},
      root     => file(__FILE__)->absolute->dir,
      encoding => 'utf-8';
    $app;
};

こうしておけば
replace-to-unko1
普段はこう見えるけど、リファラが違うドメインで直リンされてる場合は
replace-to-unko2
こうなっちゃう><

いかんせんモジュール名がPlack::Middleware::ReplaceToUnkoなので使いたい人はモジュール名変えて使って下さい。

えっ?自分で変えろ?



やだ!


Posted at by




富田さんが書かれた、「CPANモジュールガイド」を献本頂きました。
Growl::Anyを紹介して頂いています。

ざっと目を通しましたが「perlの今」が分かる、読んでてとてもワクワクする本です。各モジュールにサンプルコードが示されていて今ホットなCPANモジュールが150本程紹介されています。perlを知ってる方ならば「あーあのモジュールか。」とニタニタしながら読むことが出来ますし、perlをこれから始める方にとっても「へー最近良く聞くあのモジュールは、こういう機能があって、こう使うんだ。」と分かりやすく書いてあります。
その中にも、サンプルコードで他のモジュールを絡めて書かれている為、アプリケーションを書く上での基礎知識が得られる、持っていて絶対損のないガイドブックになっていると思います。
ボリューム感もあるので、僕もしばらく通勤電車の中でニタニタする事が出来ると思います。


さて、Growl::Anyですが、このモジュールは各OS上で動作するGrowl、もしくはGrowlライクなアプリケーションに対して共通インタフェースを提供するアダプタモジュールです。
Growl::Any - search.cpan.org

Growl::Any - Common interface to Growl

http://search.cpan.org/dist/Growl-Any/
先日gfxさんに大改良して頂き、わかりやすい構成になりました。

実は僕はMac OSXを持っていません。なのでGrowl::Anyが無くても直接困る人でもありません。僕がこれを書いたのは、miyagawaさんなんかが良く書いてるMac OSX上で動くGrowlアプリケーションを、Mac OSXを持ってない人が簡単な修正だけで動かせる様にしてもらいたいと思ったからです。もちろん僕自身もその一人です。
僕はWindows上で動作するGrowl、Growl For Windowsへ通知が出来るCPANモジュールGrowl::GNTPを作っている事もあり、なおかつGrowl For Windowsの中身もまぁまぁ知ってるので(コミット権も持ってるけどあまりコミットしてない苦笑)、たぶんGrowl::AnyのAUTHORとしては適任なのかもしれない。
もちろんGrowlだけじゃなく、あのカッコいいperlアプリケーションをWindowsで動かしたいなと思ってる人は僕だけじゃないと信じています。
そしてMac OSX上で動くイカしたアプリケーションを他のOSで動作させる為のグルー的な役割を、ブログなんかで冗談混じりに紹介し、ポーティングの楽しさ、CPANモジュールの便利さアピールするのが僕の役目なんだろうなと勝手に思っています。

良いアダプタになれればいいなと思います。

さて先日Data::Deduperというモジュールを書きました。
mattn/p5-Data-Deduper - GitHub

remove duplicated item from array

https://github.com/mattn/p5-Data-Deduper
Growlを使ったアプリケーションを書く場合RSSフィードから新着表示したりする訳ですがこの場合、前回フェッチ時のエントリから今回増えたエントリを抽出してGrowl通知する事になります。
そんな場合に役立つんじゃないかと思っています。中身はとても短いコードのモジュールですが、RSSフィードの新着エントリを表示するスクリプトがこんな風に書けます。
#!perl
use strict;
use warnings;
use Encode;
use Data::Deduper;
use XML::Feed;

my $uri = URI->new( "http://api.twitter.com/1/statuses/public_timeline.rss" );

my $dd = Data::Deduper->new(
    expr => sub {
        my ( $a$b ) = @_;
        $a->link eq $b->link;
    },
    size => 50,
);

while (1) {
    my $feed = XML::Feed->parse( $uri );
    for ( $dd->dedup$feed->entries ) ) {
        print encode_utf8 $_->content->body."\n";
    }
    sleep 3;
}
実は、こういったスクリプトを書く際にはこれまでtokuhiromさんが書いたXML::Feed::Deduperを使っていたのですが、RSSフィードの新着確認であればフィード内のエントリ数分だけ管理出来ていれば良くて、特にGrowl通知アプリケーションなんかの場合は大概常駐アプリになるので、DB_Fileを使わなくてもいいんじゃないかという発想で書きました。
まぁ便利かもと思ったのは僕だけかも知れないけど。

こういった、何かの手順を簡素に出来るモジュールをこれからも書いていけたらなぁと思っています。
Posted at by