OSTRACISM CO.

ScalaとHaskellとPythonと...

要求仕様

 shuffle_Xは指定ディレクトリ下のMP3ファイルリストをを乱数でシャッフルして指定された数の上位のファイルを指定されたディレクトリに連番ファイル名でコピーするプログラム。実際に携帯オーディオプレーヤーで使うために書いた。最初のバージョンはRuby。Ruby版で何があったかは前述の通り。最近はPythonに書きなおした版を使っている。それを元にもうちょっと色々整理して、ScalaとHaskellに移植してみた。現在は試しにHaskell版を使ってみてる。実際動きは大差ない。実行スピードはHaskellが速いような気もする。

 ディレクトリやファイルの重み付けの設定ファイルを shuffle_weight_utf_8.cfg とする。

 中身の仕様は、
1. <0以上の実数の重み値> <タブ> <ディレクトリ名またはファイル名>
2. 重み値は1で通常扱い(設定なしと同等)。
3. 重み値は0.5で確率半分、2で確率倍。
4. *は必ず選択される
5. 行頭#はコメント行
6. 文字エンコードはUTF-8にする必要がある。

 UTF-8なのはHaskellでUTF-8以外を扱うのが面倒そうだっただけ。実際問題UTF-8以外にする積極的理由はない。

 出力先の拡張子を.m3uにするとM3Uプレイリストを出力する。これはWALKMAN(非Android)をマウントしてMUSICディレクトリをカレントにして動作させることを想定している。


 epub2to3_XはCalibreの生成したEPUB2ファイルをEPUB3形式にコンバートするプログラム。縦書きに対応させるのが主眼だが、それはパラメタ --direction v を指定した時。最初のバージョンはScalaで書いた。RuleTransformerクラスを使う応用だった。参考にしたコードがcase文でElemクラスのコンストラクトパターンを使った上で、コンストラクタで戻り値を作るというもので、そのまま真似たコードだった。今回Scalaのバージョンを2.8から2.10に上げ、コンパイルエラーになった。えええぇ。Elemコンストラクタにパラメタが増えたのだ。コンストラクタを変更してまで追加したパラメタなのでさぞ重要なものだろうと思ったが、空の要素を省略表現するかどうかのフラグが追加されただけだった。ウワァジュウヨウダァ。そんなことあるかボケ。ヒトの書いたコードをゴミにして楽しいか、学者ドモ。これだから研究者ってやつは。case文はもっと普通にラベルの値で比較し、戻り値はcopyメソッドに置き換えた。

 epub2to3_XはZIPファイルとXMLを応用する例として。すなわち、最近流行の言語はZIPファイルやXMLくらい普通に扱えなくちゃ使って貰えないよね、って部分の例題となっている。C#というか.NET Frameworkは2012年の4.5でようやく公式にZIPファイルに対応した。そろそろVisual Studio 2008から移行するか。


2014.07.27


「インデックス」へ戻る


OSTRACISM CO.

OSTRA / Takeshi Yoneki