Fork me on GitHub

2011/07/20


このエントリーをはてなブックマークに追加
なんだか楽しそう。
Amon2::Liteでmarkdownその他のリアルタイムプレビュー - すぎゃーんメモ

Amon2::Liteでmarkdownその他のリアルタイムプレビュー Perl Amon2::Lite というモジュールを Amon2 に添付してみました。 - TokuLog 改メ tokuhir...

http://d.hatena.ne.jp/sugyan/20110720/1311146296
こういうの皆で共有したいよねと思ったので最近話題のPaaS、fluxflexにデプロイしてみた。
fluxflex

Easy One-Click Install for Web Applications You can install various OSS in a second just with one-cl...

http://www.fluxflex.com
http://text-converter.fluxflex.com
ちょっとハマった点が、fluxflexにはcpanm等による自動インストール機能が無い事。自前でextlibみたいなのに放り込めばいいんだけど、これがなかなか面倒くさい。適当なcgiを書いてどのモジュールの読み込みで失敗しているか調べた結果でいろいろ添付してます。
正直、要らない物もあがってるかもしれません。
とりあえず動いたので、負荷かけない程度に遊んで下さい。

一応CGIのコード貼っておきます。
#!/usr/bin/perl
use strict;
use warnings;

use lib qw( ../lib );
use Amon2::Lite;
use Encode 'encode_utf8';
use Text::Markdown 'markdown';
use Text::Xatena;
use Pod::Simple::XHTML;
use Plack::Handler::CGI;

$ENV{REQUEST_METHOD} ||= 'GET';
$ENV{SCRIPT_NAME} ||= $0;
$ENV{PATH_INFO} ||= '/';

my $converters = {
    markdown => sub {
        my $text = shift;
        return markdown($text);
    },
    xatena => sub {
        my $text = shift;
        return Text::Xatena->new->format($text);
    },
    pod => sub {
        my $text = shift;
        my $parser = Pod::Simple::XHTML->new;
        $parser->html_header('');
        $parser->html_footer('');
        $parser->output_string(\my $html);
        $parser->parse_string_document($text);
        return $html;
    },
};

get '/' => sub {
    my ($c) = @_;
    return $c->render('index.tt');
};

post '/preview' => sub {
    my ($c) = @_;
    my $converter = $converters->{$c->req->param('format')};
    my $html = $converter ? $converter->($c->req->param('text')) : '';
    return $c->create_response(200, ['Content-Type' => 'text/plain'], [encode_utf8($html)]);
};

Plack::Handler::CGI->new->run(__PACKAGE__->to_app);
あと、頭の方でやってるENVの初期値設定は、これが無いとエラーで動かなかった為。この辺は後でフィードバックしておきます。
dotcloudの時もそうでしたが、__DATA_トークンにあったテンプレートはtmpl/index.ttに配置して動作させています。

おまけで、Text::Xatenaの出力を少し変えて(codeというclass属性をprettyprintに変更)、google code prettifyによる色付け機能を足してあります。
#ちょさん!変更出来る様にして下さい!

SuprePre記法で遊んで下さい!
Posted at 19:21 in ソフトウェア::lang::perl
Tagged as: Amon2, fluxflex, perl
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2011/07/19


このエントリーをはてなブックマークに追加
なんか呼ばれたけど、勉強しとかなくちゃ答えるにも答えれないだろうなと思ったので、ちょっとくらいは勉強しておこうとAmon2でgyazoを書いてdotcloudにpushしてみた。
まず
# amon2-setup.pl --flavor=Lite Gyazo
として雛形を作る。
POSTハンドラを書く。
post '/' => sub {
    my $c = shift;
    my $imagedata = $c->req->param('imagedata');
    $imagedata = read_file($c->req->uploads->{imagedata}->pathbinmode => ':raw'unless $imagedata;
    my $filename = "image/" . md5_hex($imagedata) . ".png";
    write_file($filename, {binmode => ':raw'}, $imagedata);
    my $url = $c->req->base() . $filename;
    return $c->create_response(200, ['Content-Type' => 'text/plain'], [$url]);
};
セッション使わないのでプラグイン読み込み処理をカットして、Plack::Middleware::Staticでimageディレクトリを見える様にした。あとdotcloudで動かす為に__DATA__トークンに書かれているindex.ttをtmpl/index.ttに移した。
app.psgiの全体コードはこんな感じ。
use strict;
use warnings;
use File::Spec;
use File::Basename;
use File::Slurp;
use Digest::MD5 qw( md5_hex );
use lib File::Spec->catdir(dirname(__FILE__), 'extlib''lib''perl5');
use lib File::Spec->catdir(dirname(__FILE__), 'lib');
use Plack::Builder;
use Amon2::Lite;

# put your configuration here
sub config {
    +{
    }
}

get '/' => sub {
    my $c = shift;
    return $c->render('index.tt');
};

post '/' => sub {
    my $c = shift;
    my $imagedata = $c->req->param('imagedata');
    $imagedata = read_file($c->req->uploads->{imagedata}->pathbinmode => ':raw'unless $imagedata;
    my $filename = "image/" . md5_hex($imagedata) . ".png";
    write_file($filename, {binmode => ':raw'}, $imagedata);
    my $url = $c->req->base() . $filename;
    return $c->create_response(200, ['Content-Type' => 'text/plain'], [$url]);
};

# for your security
__PACKAGE__->add_trigger(
    AFTER_DISPATCH => sub {
        my ( $c$res ) = @_;
        $res->header'X-Content-Type-Options' => 'nosniff' );
    },
);

builder {
    enable 'Plack::Middleware::Static',
        path => qr{^(?:/static/|/robot\.txt$|/favicon.ico$|/image/)},
        root => File::Spec->catdir(dirname(__FILE__));
    enable 'Plack::Middleware::ReverseProxy';

    __PACKAGE__->to_app();
};
最後にdotcloud.ymlに
www:
    type: perl
    requirements:
        File::Slurp
        Digest::MD5
        Amon2
を書いてgitでcommitした後に
# dotcloud push mattn
すれば、あとはdotcloudが自動で依存物をワンサカワンサカ入れてくれて、動くようになる。(mattnというのはdotcloud createで作った際のapplication。上記wwwはservice)
できあがったサーバはこれ

なんか知らない間にhttp://gyazo.mattn.dotcloud.comみたいなURLで公開出来なくなっちゃったので、ひとまず我慢します。

最後に一言

それAmon2じゃなくてもおk
Posted at 02:46 in ソフトウェア::lang::perl
Tagged as: amon2, dotcloud, gyazo
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

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 20:36 in ソフトウェア::lang::perl
Tagged as: perl
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2011/04/04


このエントリーをはてなブックマークに追加
富田さんが書かれた、「CPANモジュールガイド」を献本頂きました。
Growl::Anyを紹介して頂いています。

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

Perl CPANモジュールガイド Perl CPANモジュールガイド
冨田尚樹
ワークスコーポレーション / ¥ 2,730 (2011-04-08)
 
発送可能時間:在庫あり。


さて、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 01:19 in ソフトウェア::lang::perl
Tagged as: perl
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip