koba::blog

小林聡: プログラマです

Perl

天鳳の牌譜形式を解析する(4)

天鳳の牌譜形式を解析する(3) - koba::blog のプログラムにバグがあったので修正する。今までのプログラムは天鳳のログをそのままの順序で電脳麻将の形式に変換していたが、これだとカンの表示に不具合があった。

天鳳の牌譜形式を解析する(3)

天鳳の牌譜形式を解析する(1) - koba::blog、天鳳の牌譜形式を解析する(2) - koba::blog の続き。天鳳の牌譜形式のXML要素を1つ1つ電脳麻将の牌譜形式に変換していく。

天鳳の牌譜形式を解析する(2)

天鳳の牌譜形式を解析する(1) - koba::blog の続き。前回は天鳳の牌譜形式のXML要素・属性の意味を説明したので、今回はそれを解析するプログラムについて。「牌番号」「面子コード」は複数の要素で使われているが、これを 麻雀の手牌の文字列表現 - koba::b…

天鳳の牌譜形式を解析する(1)

天鳳の牌譜は http://tenhou.net/0/log/ から取得することができる。第五期 天鳳名人戦 最終節 最終戦 であれば以下のURLになる。 http://tenhou.net/0/log/?2016031822gm-0009-10011-896da481 形式はXMLっぽいが、要素名自体がデータになっていたり入れ子構…

向聴数を求めるプログラム

麻雀の向聴数を求めるプログラムを書いてみた。向聴数を求めるアルゴリズムについては、以下のページに詳しい説明がある。 向聴数を求めるアルゴリズム - あらの(一人)麻雀研究所 国士無双と七対子は考慮せず、一般の4面子1雀頭の形式に限れば、 向聴数 =…

HTTP::Request::Common をより使いやすくする

HTTP::Request::Common は HTTP::Request のインスタンスを生成する簡易な方法ですが、2つ不満がありました。 GET のパラメータをURLエンコードするのが面倒 POST でファイルアップロードするときの構文が特殊なのがかっこう悪い なので、HTTP::Request::Com…

HTTP::Request::AsCGI で CGI をテストする

CGIの単体テストは面倒です。Perlお決まりの Test::More と prove でテストしたいし、Webサーバを立ち上げるのかという問題もある。どうやらこういう場合の定番は HTTP::Request::AsCGI のようなので、試してみた。こんな感じ。

mod_perl でも動作するCGIを書く

Perl製CGIの高速化と言えば mod_perl であるが、たいていは後付けで PerlHandler に Apache::Registry やら Apache::PerlRun を指定する方法が紹介されている。けれど、すでにオブジェクト指向スタイルでCGIを書いているのであれば、入り口を mod_perl のハ…

Minillaでbuild時に .pmファイルを変更する

Minillaを使ってモジュールのひな形を作る - koba::blog の続き。モジュール作成時にインストールされる環境に合わせてソースを書き換えたい場合がある。具体的には内部で実行するコマンドのパス名の変更とか。C だと configure が Makefile を生成するとき…

Minillaを使ってモジュールのひな形を作る

CPAN形式のモジュールを開発するときには ExtUtils::MakeMaker や Module::Build が定番なのだが、最近は Minilla が流行らしいので試してみた。お試し結果はこちら。 https://github.com/kobalab/Foo-Bar

Perlモジュールのインストール

Mavericksがやってきた - koba::blogの続き。Leopard時代にインストールしていたPerlモジュールをインストールする。今までは、 perl Makefile.PL && make && make test && sudo make installという原始的なやり方だったんだけど、cpanmを使うことにする。

iPod touch の歌詞表示を左寄せにする(再)

以前 iPod touch の歌詞表示を左寄せにする - koba::blog で紹介した方法がiOS5では使えなくなっていたのですが、iOS6で再び使えるようになりました。ただし、以前よりちょっと面倒です。

OAuth APIのproxyを作ってみた

OAuth APIのproxyを作ってみました。生のリクエストに署名してAPIに転送し、結果を返します。

JSONのutf8フラグを落とす

JSONモジュールのutf8フラグの扱いに悩まされていたんだけど、解決したように思うのでメモ。

Twitter APIを使ってみる

OAuth::LiteではてなのOAuth対応APIを使う - koba::blog で、はてなのOAuth対応APIは使ってみたので、今度はTwitterのAPIにチャレンジ。Twitter APIのドキュメントは以下にある。 https://dev.twitter.com/docs/api

汚染モードの罠

Perlの汚染モードは安全なプログラムを書くための便利な道具なのですが、三項演算子の扱いにバグがあるみたいです*1。 *1:Perl 5.8.8の場合。以降のバージョンでは試してません。

LWP::UserAgentの使い方

今さらながらLWP::UserAgentのメモ。

JSONを見やすく表示する

WebAPIの返すJSONは、おいそれと読めるもんじゃない。例えばTwitterのpublic_timelineだとこんな感じ。 https://api.twitter.com/1/statuses/public_timeline.json そこで、JSONを見やすく表示するCGIを作ってみた。

OAuth::Lite の gen_auth_header の罠

とある事情から OAuth::Lite::Consumer の gen_auth_header を使う必要が発生した。gen_auth_header は、 my $header = $consumer->gen_auth_header($method, $url, { realm => $realm, token => $token, }); という呼び出し形式でOAuthのAuthorizationヘッ…

OAuth::LiteではてなのOAuth対応APIを使う

OAuth::Liteを使って、はてなでOAuth認証 - koba::blogで認証はできたので、はてなのOAuth対応APIを使ってみる。JSONを扱う必要があるので、以下のPerlモジュールをインストールした。 common::sence JSON::XS JSON

OAuth::Liteを使って、はてなでOAuth認証

OAuth::Liteを使って、はてなのOAuth対応APIを使ってみる。はてなのOAuth対応APIのドキュメントは以下 http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth 何はともあれ、まずは認証から。認証まわりの説明は以下にある。 http://developer.hatena…

OAuth::Lite のインストール

OAuth対応のプログラムをちょっと作ってみたくなったので、OAuth::Liteをインストールした。 OAuth::Lite 依存するモジュールがたくさんあって結構面倒。以下のモジュールをインストールしました。 Class::ErrorHandler Class::Data::Accessor Digest::SHA C…

OpenIDをハックする

「OpenIDの業界団体、4月に日本支部設立へ - ITmedia エンタープライズ」とかで何かとOpenIDが話題になっているので、今更ながらOpenID Consumerのサンプルコードを書いてみた(しかもさらに今更ながら OpenID 1.1 対応)。Perlには Net::OpenID::Consumer と…

XSS対策に汚染モードを使う

XSS対策の基本は、信頼できない入力をすべてチェックし、出力時に正しくエスケープすることにつきる。そんなことわかっているのにXSSが発生してしまうのは、エスケープ漏れを機械的に判別する方法がない(すなわち人手によるレビューに頼っている)から。*1Per…

mod_perlから200以外のステータスコードを返す

CGI.pm を使って200以外のステータスコードを返すには、 my $cgi = new CGI; print $cgi->header( -status => '404 Not Found', ); print $error_document; # 自前のエラードキュメントを出力。 のようにすればいいのですが、mod_perl環境下で上のコードを実…

PukiWikiのプラグインの正規表現(3)

しくじった...PukiWikiのプラグインの正規表現(2) - koba::blogの正規表現だと &plugin{&}; にマッチしないですね。それから丸括弧の中に文字がないパターンもマッチしない。 my $plugin_regex; $plugin_regex = qr/ &\w+ (?: \( (?>[^\)]*) \) )? (?: { (?:…

PukiWikiのプラグインの正規表現(2)

PukiWikiのプラグインの正規表現 - koba::blogは、正しくないソースに対してものすごく時間がかかる場合があるので修正。 my $plugin_regex; $plugin_regex = qr/ &\w+ (?: \( (?>[^\)]+) \) )? (?: { (?: (??{$plugin_regex}) | (?>[^&}]*) )+ } )? ; /x; …

PukiWikiのプラグインの正規表現

こんな感じかな。 my $plugin_regex; $plugin_regex = qr/ &\w+ (?: \( .*? \) )? (?: { (?: (??{$plugin_regex}) | .*? )+ } )? ; /x; 動的正規表現を使えない場合は、こんな感じで5段の入れ子までは大丈夫。 my $p1 = qr/&\w+(?:\(.*?\))?(?:{(?:.*?)+})?;…