Perl
Moose

[Perl]どうせ新しいモジュール書くならMoose使いましょ?

要旨

CGIの全盛時代に培ったPerlの技術を、安全かつモダンに使える方法を私なりの方法で提供したいので、自作のモジュールの紹介とその作成方法について共有します。

こんなモジュールを作りました

Text::Password::AutoMigration - generate and verify Password with any contexts

日本語で要約すると

Text::Password::AutoMigrationは怠惰な管理者のためのモジュールです。
パスワードのハッシュを新規作成する分にはSHA-5121を用いる一方、
認証においてはCORE::crypt,MD5,SHA-1 by hex,SHA-256及び SHA-512を自動的に識別します。
したがって、

  • このモジュールを使い
  • DBに保存している認証用ハッシュを定期的に置き換えるだけ

で、暗号化強度の低いハッシュから強固なハッシュへの移行が可能になる2というものです。

作り方ダイジェスト

核となるモジュールは低級です。いやむしろ低級であるべき3です。
以前、こちらで記事にした際にも全く誰にも見向きもされなかった4モジュールが原本です。(正確には、CORE::cryptからMD5への、今思えば執筆時点でさえほぼ無意味の駄作でした。)

これをあえてCORE::crypt用MD5用に分離し、Mooseによる継承をして差分を書くということを徹底します。
そして、それらを継承する形で、本来目指すSHA内での移行を行うモジュールを書きます。
最後に、全てを包括し、自動的に認証を行うモジュールに仕上げます。

メリットの話

  • まず何より継承とその管理が楽チン
    @ISAで考えてみよう。Perl5の暗黒面に再び触れる度胸があるのかい?

  • 機能別にpackageを切り分けた方が保守が楽
    テクニカルな話になりますけど、どこかを直そうと思った時に、ファイル名で検索できるのすごい大事。

  • テストを書く時に機能別に分割されてた方が楽
    これ実際にやってみると全然違います。

  • 上記の前提だとエンバグしにくい(バグの発見が容易い)
    機能とテストが正しく分別されていれば、当然そうなりますね。

  • coercionが強力
    ま、今回これには使ってないけどな

  • 強制的にオブジェクト指向化
    もともとこのモジュールは

    継続してblessすべき適当なデータが見つからない

という理由でコンストラクタを持っていませんでした。でもパッケージ変数とかに変に値持たせる(エンバグ要因)より、初めから継承される前提でhasしちゃった方が健全だという結論にたどり着きました。

デメリットの話とか

  • 遅いとか言われてるけど、それ本番に関係あるの?
    PSGIなりMojoなり使う時ってplackupmorboでコンパイルしますよね?

  • ちょうど良いドキュメントがない
    Mooseやって見ました程度の記事は見つかるけど、なんかこうそのちょっと先の記事はないかもわかんないです、ってかそれがこの記事書いた動機です。



  1. SHA-2のうちの一つ 

  2. 認証完了直後ハッシュが古ければ置き換える、というロジックを実装するコストは別途かかるでしょうけど 

  3. 可読性及び保守の観点から 

  4. この記事を執筆した時点で0いいね0ストック4764view