2009/03/18


twitterのOAuthベータが開始されたので、さっそく軽量Web Application Framework「MENTA」でOAuthする物を作ってみた。
構成も簡単で │  .htaccess
│  menta.cgi
├─app
│  ├─controller
│  │      callback.pl
│  │      request.pl
│  ├─data
│  └─static
├─bin
├─lib
└─plugins
        session.pl
こんな感じ。トップページからrequest.plに飛び、OAuthのcallbackとしてcallback.plがキックされる。
要のrequest.plは以下の様な感じ use MENTA::Controller;
use URI;
use OAuth::Lite::Consumer;

sub run {
    my $consumer = OAuth::Lite::Consumer->new(
        consumer_key       => config()->{application}->{consumer_key},
        consumer_secret    => config()->{application}->{consumer_secret},
        site               => 'http://twitter.com/',
        request_token_path => 'http://twitter.com/oauth/request_token',
        access_token_path  => 'http://twitter.com/oauth/access_token',
        authorize_path     => 'http://twitter.com/oauth/authorize',
    );

    my $request_token = $consumer->get_request_token();
    my $uri           = URI->new( $consumer->{authorize_path} );
    $uri->query(
        $consumer->gen_auth_query(
            "GET", "http://twitter.com/", $request_token
        )
    );
    redirect( $uri->as_string );
}

そしてcallback.plはこんな感じ
use utf8;
use MENTA::Controller;
use OAuth::Lite::Consumer;
use JSON;

sub run {
    my $consumer = OAuth::Lite::Consumer->new(
        consumer_key       => config()->{application}->{consumer_key},
        consumer_secret    => config()->{application}->{consumer_secret},
        site               => 'http://twitter.com/',
        request_token_path => 'http://twitter.com/oauth/request_token',
        access_token_path  => 'http://twitter.com/oauth/access_token',
        authorize_path     => 'http://twitter.com/oauth/authorize',
    );

    my $access_token = $consumer->get_access_token( token => param('oauth_token') );
    my $res = $consumer->request(
        method => 'POST',
        url    => q{http://twitter.com/statuses/update.json},
        token  => $access_token,
        params =>
          { status => 'おうっふー', token => $access_token },
    );
    if ( $res->is_success ) {
        my $status = from_json( $res->content );
        redirect( "http://twitter.com/"
              . $status->{user}->{screen_name}
              . "/status/"
              . $status->{id} );
    }
    else {
        redirect("http://twitter.com/");
    }
}
ちなみにこのアプリケーションを"Accept"にするとtwitteのステータスラインに「おうっふー」がポストされます。自分で作る方はtwitterのアプリケーション登録画面から得られるconsumer_keyとconsumer_secretをmenta.cgiのapplication項目に設定するのをお忘れなく。
簡単ですね!
Posted at by




vimはファイルを開く際、iconvを使用してfileencodingsの順に変換を試し、正しく変換出来た物をfileencodingとして使用する仕組みになっています。
つまり化けたファイルだと、どのfileencodingsにもマッチせずencodingで指定されたエンコーディングでファイルが開かれステータス行に「変換失敗」と表示される事になります。
しかしながらそのファイルのエンコーディングが分かっている場合もあります。vimでは++encオプションを指定する事で指定のfileencodingでファイルを開く事が出来ます。
:e ++enc=utf-8 foo.txt
この場合、vimはiconvで変換出来なかった文字を?という文字で置き換えてしまいます。
# echo あいうえお | iconv -f char -t utf-8 > utf8.txt
# echo あいうえお | iconv -f char -t cp932 > sjis.txt
# cat utf8.txt sjis.txt > bad.txt
# vim
cp932の場合は文字集合の区画が広い為、vimではutf-8が構成するバイト列をcp932の範囲内として開いてしまいます。 :e ++enc=cp932 bad.txt
縺ゅ>縺?縺医♀
あいうえお
またutf-8の場合はcp932の区画は範囲外になります。つまり :e ++enc=utf-8 bad.txt
あいうえお
??????????
この様に?に変換されてしまう事になります。ステータス行には何行目で変換が失敗したかを警告するメッセージも表示されますが、元のテキストは失われます。
こういったファイルを開くのにフィルタを使用する人もいるかもしれません。
:%!nkf -Ws
これでも良いのですが、nkfが変換出来ない文字は削られてしまいます。
実はvimの:eコマンドには++badオプションという物があり、この?の挙動を変更出来る様になっています。
                                                                *++bad*
The argument of "++bad=" specifies what happens with characters that can't be
converted and illegal bytes.  It can be one of three things:
    ++bad=X      A single-byte character that replaces each bad character.
    ++bad=keep   Keep bad characters without conversion.  Note that this may
                 result in illegal bytes in your text!
    ++bad=drop   Remove the bad characters.

The default is like "++bad=?": Replace each bad character with a question
mark.
例えば++badオプションに%を指定すると :e ++enc=utf-8 bad.txt
あいうえお
%%%%%%%%%%
となるのです。現在の所1文字の場合はその文字で置き換える様になっています。また++badオプションにkeepを指定すると、何も変換せずに開いてくれます。
:e ++enc=utf-8 ++bad=keep bad.txt
あいうえお
<82><a0><82><a2><82><a4><82><a8><82><a6>
さらにdropを指定する事で不正な文字を削除してファイルを開く事も出来ます。
あいうえお

vimでファイルが開けなくなってしまった方、一度++badオプションを試してみては如何でしょうか?
Posted at by



2009/03/13


ruby版C版なでしこ版と書いたので最後(きっと)にvim版


Posted at by