技術
今更YAMLを知る
プログラマ崩れとして生きていると、時にシリアライズしたブツをリモートに投げたり、データ構造を視覚的に確認したりしたいこともあるものだ。つーか最近もう頻繁に。
で、YAMLを知って超歓喜。まあ、凄く今更っぽいんだけど。今風味のコードを書こうとするのとか久々だったもので。
つーか、こういうツリー構造のデータをテキスト化するのに使えるのってXMLくらいしか知らなくて、JSONは昔見たけど忘れてた。まあ、どっちも見る分には見辛い。特にXMLは話にならない。書くのも辛いし、読み書きのAPIも何かえらいことになってるし。
んで、YAMLは何かもう、欲しかった物そのものだった。いやー、時代から遅れるって辛いスね。ろくにプログラム書いてなかったから仕方ないけど。
というわけで、ダンプしたのを見てデバッグしたり、zlib掛けてメッセージ投げたりスキーマレスDB風味にしたり、便利ですなあ。しかもシリアライザとしても相当コンパクトだった。Pythonだとpickleより縮んだりするし。汎用性が低いとかかな。速度は微妙っぽいけど、別に何回も呼び出さないからなあ。特にブロックスタイルでzlib通すと縮むような。スペース多用するからか。
まあ、とりあえず技術力を少し磨かないとなあ、と久々に思った。ここんとこ半端過ぎて無駄スキル気味だったしなあ。
Pythonを使うことに
まあ色々あって、Python2.5.4を導入する。元々Pythonには興味があったからいいのだが、どのバージョン入れていいのかよく分からん。まあ適当でも死にはしないだろう。2.5.5はWindows版バイナリが無いんで見なかったことに。
で、ネットでチュートリアルとか適当に読む。Perlの時はラクダ本にお世話になったが、今はタダで日本語の資料がごろごろしてて有り難い。
そして、軽く概要を見た辺りでおとなしく読むのに飽きて、対話モードで超適当に憶測で色々やってみる。ほほう、これは面白い。デフォで多倍長整数演算できるんか。楽ですなあ。Perlと違って、無駄な揺らぎを許容しませんなあ。これはこれで。記号も全然出てこないんだな。いかにも素性の良さそうな。ふへへへへ。Perlのずぼらな感じも好きだけど。
まあ、実行速度も既にPerlよりPythonやRubyの方が上みたいだしなあ。Rubyが速くなってると聞くと少し興味はあるのだが、作者が苦手なんでまだ回避。機会があれば普通に触るだろうけど。
で、Perl同様、タイプ数は削ぎ落とされてる感じ。まあこの辺はみんなそうか。それでも、無茶な短縮はしないあたりが品の良さか。ふへへ。
つーことで、手慣らしにちょっとしたコードを書こうとしてハマる。EUC-JPのデコードでUnicodeDecodeError投げてくるのだが。どこだよ引っ掛かってるのは。
慣れない言語を少しずつ使い慣らしながら調べてみると、ローマ数字で引っ掛かってた。PerlのEncodeモジュールでは出来てたのに。機種依存文字だった気がするが、今もそうなのかはもうよく分からん。文字コードの規格多すぎて。
RubyやPHPは知らんけど、PerlやPythonは恐らく基本的に内部UCSで、必要なとこでencode/decodeする形だろうから、変換が通らないとどうにもならん。
で、色々と解決方法を探る。自前変換とか書くくらいならPython捨ててScalaかJava勉強するか、とか投げやりな思考が浮かんだりもしたが、何となくcodec仕様を調べてみると、euc-jis-2004とかいうエンコーディングの存在に気付く。使ってみたら変換出来た。わーい。理屈分からんけどもうめんどくせえからこれでいいや。
そして、今度はHTML実体参照(ユニコード数値含む)のデコードライブラリが無いのに気付く。めんどくせえ。調べてみても、一発変換関数は無さそうな雰囲気だ。何で今時。まあ書くか…。
ActivePerlのglobの悩みをどうにかする
未だにPerl使いである。
別に大好きな訳ではない。似たようなことの出来るスクリプト言語を他に覚えてないだけだ。
今からアレ系を新しく覚えるなら、まあ、Pythonなのかな。PHPも便利そうだ。どちらも別にさほど苦労せず覚えられそうな甘い気持ちは若干あるが、必要に迫られないといまいちなあ。
まあそれに、大好きってほどではないけど、気を抜いて書き捨てやすいPerlの緩さは結構好きだ。Larry Wallのアレっぷりも割と。
で、ActivePerlを使っている。まあWindowsだし。だいぶ昔に入れたっきりだが、めんどくさいので更新してない。別に鯖でもないし平気だろう。5.10.0ならそこそこ新しい方だろうし。
そして、書きっぱ気味のスクリプトなどでバリバリ使うのだが、globがどうもバグってる。File::Glob::Windowsとか入れても駄目。ディレクトリ部に特定の文字を含むglobを掛けるとおかしくなる。どうせマルチバイトの問題だろう。新しい奴なら直ってるかもしれんけど。
んで、めんどくさいんで、どうにかしようと試した。どうにかなった。DirHandleなりopendirなりで一括readしたのをgrepでもすればいいようだ。めでたしめでたし。具体的には、
sub glob_re ($$) { my ( $dir, $re ) = @_; my $dh = new DirHandle $dir; return grep /$re/, $dh->read; }
こんな感じか。呼び出しは
glob_re '.', qr/\.txt$/i;
みたいな。動作確認しないままだらだら書いてるが、気持ちが伝わればいいのではなかろうか。さっき似たようなコード書いて動いたしさ。つーか正規表現globなんて既製モジュールありそうなくらい普通に欲しい関数だよな。まあいいか、短いから自作でも。Perlだし。
ああ、いかん。今は5.10用スクリプトをuse utf8でUTF-8対応テキストエディタで書いてるから、Windowsだとエンコード掛けないと日本語ファイル名でやばかったんだよな。つーか元々それが目的じゃないか(笑)。ついでにglob互換にするなら.
と..
も除外してパスも付けないとな。
sub glob_re ($$) { my ( $dir, $re ) = @_; my $dh = new DirHandle encode 'cp932', $dir; return map { File::Spec->canonpath( File::Spec->catfile( $dir, $_ ) ) } grep /$re/, File::Spec->no_upwards( map { decode 'cp932', $_ } $dh->read ); }
こうですね。多分。動作確認してないけど。つーかどんどん書き捨て臭が。まあいいか、Perlだし。
IrfanView愛用者
何でだったか忘れたけど、かなり昔から画像表示にはIrfanViewを愛用している。デフォルトアイコンがアレなこと以外は全て気に入っている。
特に捨てがたいのが、Spaceでフォルダ内の次の画像が見えること、Enterでフルスクリーン気味になること、しかもフルスクリーンは設定次第で常時ぎりぎりまでアスペクト比維持で拡大表示してくれること、さらにLanczosフィルタが選べること、L-Rで左右回転できること。これが(キーバインドは何でもいいのだが)全てワンキーでできないと、俺的にはかなり困るのである。できればガンマをいじるキーもあるといいのだが。これらが全部出来て軽くて安定してるのがあれば検討対象になるが、ちょっと期待しにくい気もする。
で、久しぶりに最新版を拾おうとして、更新履歴をぼーっと見てたら、
-Support for MAG format (MAKI, Formats PlugIn)
とかいう一行が目に入った。さすが。いや何で今頃(笑)。
つーかSusieプラグインを無理矢理IrfanViewプラグインとしてアレするようなナニとか出来ないんかな。最近フリゲにちょっかい出してるからxyz形式とか見たいし(笑)。