更新時刻 (mtime) を比べて、変更のないファイルをスキップする。1,500 ファイルの 2 回目の実行が約 5 秒から 0.08 秒になる。一方で while ループの if が増え始める問題も見えてくる。
Path::Tiny で再帰的にファイルをコピーするバックアップツールを作る。同じディレクトリを2回続けて実行し、毎回全ファイルをコピーしてしまう弱点を数字で確かめる。
Perl と Moo でテキスト処理パイプラインを作りながら、Chain of Responsibility と Decorator を学ぶ全6回の連載。目次を兼ねた案内板で、読む順と各回の内容をまとめています。
自作のフィルターを、既存のコードを変えずに外から読み込めるプラグイン機構を作る。開放閉鎖の原則 (OCP) を実装で確かめ、全6回のパイプラインを仕上げる。
Apache のアクセスログを解析する。ログのパース、ステータスコードでの絞り込み、上位 N 件の抽出を新しいフィルターとして足し、これまでの部品を組み合わせて Top 10 URL や IP 別の件数を出す。
行を絞る処理とは別に、全行を見てから1つの結果を返す集約処理を足す。CountFilter と StatsFilter を作り、タイムスタンプが集計に混ざる問題を ExtractFilter で直す。
フィルターを繋げるには最後の1つから逆順に作る必要があった。PipelineBuilder を作り、メソッドチェーン (Fluent Interface) で読んだ順に組み立てられるようにする。
GrepFilter に SortFilter と UniqFilter を足すため、共通の基底クラスを作って機能を重ねられるようにする。Decorator の考え方と、繋げたときに見つかる問題を確かめる。
Unix の cat | grep を Perl と Moo で再現する。正規表現で行を絞るフィルターを作り、2つ繋げて動かしながら Chain of Responsibility の入口に立つ。
Perl と Moo で航空管制シミュレーターを作りながら Mediator パターンを学ぶ全8回の連載。目次を兼ねた案内板で、読む回の選び方と各回の内容をまとめています。
ここまで作った「管制塔が機体同士のやり取りを仲介する」設計は、GoF の Mediator パターンだった。登場人物の対応表と、チャットなど他の応用例を整理する。
燃料切れの機体も、先着順のキューでは順番を待たされる。緊急宣言した機体を待機列の先頭に入れ、通常の機体より先に着陸させる。Perl と Moo で実装する。
滑走路が使用中だと、着陸を断られた機体は二度と着陸できない。管制塔に待機キューを持たせ、先に要求した機体から順に着陸させる (FIFO)。
管制塔のフラグ1つで滑走路を管理するのをやめ、Runway クラスに切り出す。使用中かの判定、占有、解放を滑走路自身に持たせ、同時に1機しか使えないようにする。
旅客機・貨物機・小型機が増えても、管制塔は同じ呼び方で通信したい。Moo::Role で requires を使い、航空機が守るべきメソッドを決めておく。