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 by



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 by



2011/07/14


GoogleのGo 節電 プロジェクトが全然Go言語に関係なくて悲しかったので、本日公開されたGo節電プロジェクトAPIを叩くインタフェースライブラリを書いた。
mattn/go-setsuden - GitHub

interface to gosetsuden API.

https://github.com/mattn/go-setsuden
使い方はexampleフォルダにある物を参照下さい。
package main

import "github.com/mattn/go-setsuden"

func main() {
    println("■東京の最新計測値")
    pu, _ := setsuden.GetActualUsage("tokyo")
    for _, p := range pu {
        println("時間", p.Datetime)
        println("間隔", p.Duration)
        println("値 ", p.Value)
    }
    println()

    println("■東京の最新予測値")
    pu, _ = setsuden.GetEstimatedUsage("tokyo")
    for _, p := range pu {
        println("時間", p.Datetime)
        println("間隔", p.Duration)
        println("値 ", p.Value)
    }
    println()

    println("■東京の最新瞬時値")
    pu, _ = setsuden.GetInstantUsage("tokyo")
    for _, p := range pu {
        println("時間", p.Datetime)
        println("間隔", p.Duration)
        println("値 ", p.Value)
    }
    println()

    println("■東京の電力供給ピーク値")
    pp, _ := setsuden.GetPeakOfSupply("tokyo")
    for _, p := range pp {
        println("開始", p.Start)
        println("終了", p.End)
        println("値 ", p.Value)
    }
    println()

    println("■東京の電力供給ピーク予想値")
    pp, _ = setsuden.GetPeakOfDemand("tokyo")
    for _, p := range pp {
        println("開始", p.Start)
        println("終了", p.End)
        println("値 ", p.Value)
    }
    println()
}
さっき実行したらこんな感じでした。
■東京の最新計測値
時間 2011-07-14T10:00:00+09:00
間隔 3600
値  43480000

■東京の最新予測値
時間 2011-07-14T19:00:00+09:00
間隔 3600
値  41580000

■東京の最新瞬時値
時間 2011-07-14T11:25:00+09:00
間隔 300
値  44360000

■東京の電力供給ピーク値
開始 2011-07-14T09:00:00+09:00
終了 2011-07-14T20:00:00+09:00
値  52700000

■東京の電力供給ピーク予想値
開始 2011-07-14T14:00:00+09:00
終了 2011-07-14T15:00:00+09:00
値  45500000

Go言語、全然関係無いですね!
Posted at by