調査目的
「Mojo::Log で学ぶイベント駆動プログラミング入門」という記事を作成するための事前調査。
対象読者
- 初歩的なプログラミングの知識を身につけた入門者
- イベント駆動が面白そうだと感じているが、自分で書くとなるとピンとこない人
目標
- Perlでイベント駆動プログラミングの基礎的な知識が得られる
実施日
2025-12-29
参照元 (URL)
公式ドキュメント
- Mojo::Log 公式ドキュメント(英語): https://docs.mojolicious.org/Mojo/Log
- Mojo::Log MetaCPAN: https://metacpan.org/pod/Mojo::Log
- Mojo::Log 公式ドキュメント(日本語訳): https://mojodoc.perlzemi.com/Mojo::Log.html
- Mojo::EventEmitter 公式ドキュメント(英語): https://docs.mojolicious.org/Mojo/EventEmitter
- Mojo::EventEmitter 公式ドキュメント(日本語訳): https://mojodoc.perlzemi.com/Mojo::EventEmitter.html
- Mojolicious 公式サイト: https://mojolicious.org/
- Mojolicious ドキュメント: https://docs.mojolicious.org/
参考記事
- Perl+Mojoでイベント駆動プログラミング (Qiita): https://qiita.com/skaji/items/c226f894581881796ed1
- PythonでのイベントObserverパターンとPubSubの実装 (Qiita): https://qiita.com/Tadataka_Takahashi/items/475f6d160e94984156d2
- The Observer vs Pub-Sub Pattern (Design Gurus): https://www.designgurus.io/blog/observer-vs-pub-sub-pattern
- Observer pattern (Wikipedia): https://en.wikipedia.org/wiki/Observer_pattern
- イベント駆動型プログラミング (Wikipedia): https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
- イベントループ (Wikipedia): https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97
- Stack Overflow: Mojo::Log how to log to file and to stderr?: https://stackoverflow.com/questions/75815292/mojolog-how-to-log-to-file-and-to-stderr
発見・結論
1. Mojo::Log の基本情報
Mojo::Log とは何か
- Mojoliciousフレームワークで使われるシンプルなロガーモジュール
Mojo::EventEmitterを継承しており、イベント駆動機能を持つ- 軽量で拡張性が高く、入門者にイベント駆動を学ぶのに最適な教材
公式ドキュメントURL
- 英語版: https://docs.mojolicious.org/Mojo/Log
- 日本語訳: https://mojodoc.perlzemi.com/Mojo::Log.html
- MetaCPAN: https://metacpan.org/pod/Mojo::Log
バージョン情報
- Mojo::Log は Mojolicious ディストリビューションに含まれる
- 現在の最新バージョン: Mojolicious 9.42 以降(2025年12月時点)
- Mojolicious のバージョンアップに合わせて更新される
主要なAPIと機能
コンストラクタ:
| |
ログ出力メソッド:
$log->trace('メッセージ')- 最も詳細なログ$log->debug('メッセージ')- デバッグ情報$log->info('メッセージ')- 一般情報$log->warn('メッセージ')- 警告$log->error('メッセージ')- エラー$log->fatal('メッセージ')- 致命的エラー
主要な属性:
color- ログ出力の色付けformat- ログフォーマットコールバックhandle- 出力先ファイルハンドルlevel- ログレベルpath- ログファイルパスhistory/max_history_size- ログ履歴保持
2. Mojo::Log のイベント駆動機能
Mojo::Log が発火するイベント
Mojo::Log は message イベントを発火する:
| |
on メソッドによるイベント購読
| |
emit メソッドによるイベント発火
emit メソッドは Mojo::EventEmitter から継承:
| |
実際のイベント駆動コード例
| |
3. イベント駆動プログラミングの基礎概念
イベント駆動プログラミングとは何か
- 「何かが起きたときに、それに応じて処理を実行する」設計思想
- ユーザーの操作、データの更新、センサー信号などの「イベント」を検知して動く
- GUIアプリ、Webサービス、IoTなど幅広く使われる
特徴:
- 非同期処理がしやすい
- 部品同士の結合度が低く、柔軟に設計できる
- 拡張や変更に強い
従来の同期処理との違い:
| |
Observerパターン(Pub/Subパターン)との関係
Observerパターン:
- 1つの「Subject」(監視対象)が複数の「Observer」(監視者)を持つ
- Subjectに変化があるとObserver全員に通知
- Mojo::EventEmitter はこのパターンを実装
| |
Pub/Subパターン:
- Publisher(発行者)と Subscriber(購読者)が直接関与しない
- 間に「ブローカー/イベントバス」が入る
- より疎結合で、分散システムに適している
比較:
| 項目 | Observer | Pub/Sub |
|---|---|---|
| 結合度 | やや強い | 弱い(仲介あり) |
| スコープ | 同一プロセス内 | 複数システム、分散環境 |
| 通知方法 | 同期・直接呼び出し | 非同期・イベントバス経由 |
Mojo::EventEmitter は Observer パターン の実装であり、同一プロセス内でのイベント通知に適している。
イベントループとの違い
イベント駆動プログラミング:
- 設計スタイル・考え方
- 「イベントが来たら動く」「普段は待つ」
イベントループ:
- イベント駆動プログラミングを実現するための仕組み(技術)
- 「イベントキューを監視し、処理すべきイベントがあれば対応する」ループ構造
| |
Perlでの例:
Mojo::IOLoop- Mojolicious のイベントループIO::Async::Loop- IO::Async のイベントループ
Mojo::Log との関係:
- Mojo::Log 自体はイベントループを必要としない
- イベント発火(emit)は同期的に処理される
- イベントループと組み合わせることで非同期処理も可能
4. Mojo::EventEmitter との関係
Mojo::EventEmitter の役割
- イベント発行・購読を簡単に扱える基底クラス
- 複数のイベントリスナー(callback)を登録可能
- 任意のイベントを自由に発行&購読できる
Mojo::Log が継承している機能
Mojo::Log は Mojo::EventEmitter を継承:
| |
これにより以下のメソッドが使える:
emit('event', @args)- イベント発行on('event' => sub {...})- イベントリスナー追加once('event' => sub {...})- 一度だけ実行されるリスナーhas_subscribers('event')- 購読者の有無確認subscribers('event')- 購読者リスト取得unsubscribe('event')- 購読解除
他のMojo::*モジュールでのイベント駆動例
Mojo::IOLoop:
| |
Mojo::UserAgent:
| |
Mojo::Transaction:
| |
5. 実用例・ユースケース
ログのカスタマイズ(フォーマット変更)
| |
JSON形式のログ:
| |
複数のログ出力先への同時配信
| |
エラー時の通知システム
| |
ログレベルによる出力先の振り分け
| |
6. 関連記事・内部リンク調査
このリポジトリ内の関連記事
以下のタグを持つ記事が関連性が高い:
- perl: 多数の記事あり
- mojo-ioloop: 非同期処理・イベントループ関連
- async: 非同期処理関連
特に関連性の高い記事:
Mojolicious入門 — Mojolicious::Liteで始めるPerlのWeb開発 (2025/12/04)
- タグ: perl, Mojolicious, Web, Tutorial
- Mojoliciousフレームワークの入門記事
Perlでの非同期処理 — IO::Async と Mojo::IOLoop (2025/12/17)
- タグ: perl, async, io-async, mojo-ioloop, non-blocking
- イベントループとイベント駆動の関係を理解するのに役立つ
PerlでのWebスクレイピング - Web::Scraper と Mojo::UserAgent (2025/12/22)
- タグ: perl, web-scraping, web-scraper, mojo-useragent, mojo-dom
- Mojoliciousのツールキット使用例
参照すべき外部リソース
公式リソース:
- Mojo::Log 公式ドキュメント: https://docs.mojolicious.org/Mojo/Log
- Mojo::EventEmitter 公式ドキュメント: https://docs.mojolicious.org/Mojo/EventEmitter
- Mojolicious チュートリアル: https://docs.mojolicious.org/Mojolicious/Guides/Tutorial
日本語リソース:
- Mojolicious日本語ドキュメント: https://mojodoc.perlzemi.com/
- Perl+Mojoでイベント駆動プログラミング (Qiita): https://qiita.com/skaji/items/c226f894581881796ed1
概念理解に役立つリソース:
- Observer pattern (Wikipedia): https://en.wikipedia.org/wiki/Observer_pattern
- イベント駆動型プログラミング (Wikipedia): https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
次のステップ
アウトライン作成依頼 (search-engine-optimizationエージェント)
- 調査結果に基づいて記事のアウトライン案を3つ作成
- 各案は異なる視点やアプローチを持つ
記事作成 (perl-mongerエージェント)
- 入門者向けのわかりやすいコード例を多用
- Mojo::Log を題材にイベント駆動の概念を解説
挿絵の追加 (illustration-craftspersonエージェント)
- イベント駆動の仕組みを図解(Mermaid記法)
- Observer パターンの図解
校正・SEO (各エージェント)
- proofreaderエージェントによる校正
- search-engine-optimizationエージェントによるSEO最適化
記事作成時の注意点
入門者向けのポイント
イベント駆動の「なぜ」を先に説明
- 従来の逐次処理との違い
- イベント駆動のメリット(疎結合、拡張性)
Mojo::Log を題材にする理由
- シンプルで理解しやすい
- 実用的なユースケースがある
- Mojoliciousの他のモジュールへの橋渡し
段階的な説明
- まず
onとemitの基本 - 次に
messageイベントの活用 - 最後に実用例(複数出力、通知など)
- まず
コード例は動作するものを
- コピー&ペーストで動くコード
- コメントで各行の意味を説明
推奨タグ
- perl
- mojolicious
- event-driven
- mojo-eventemitter
- mojo-log