PHPからiTunesのライブラリファイルをパースする
では、コマンドラインインターフェイスを使用したサンプルとして、iTunesの曲リストを集計し、ジャンルごとの統計をターミナル上に表示するコマンドを作成してみましょう。
iTunesのライブラリファイルは、ユーザーのホームディレクトリ下の、./Music/iTunes/iTunes Music Library.xmlです。拡張子からも分かるように、XML形式のファイルですが、やや特殊な形式ですので、今回は下記のURLで提供されている「iTunes XML PHP Parser」を使用します。
関連リンク: | |
Code Triangle :: iTunes XML Parser for PHP http://codetriangle.com/products/iTunesXmlParser/ |
このパーサクラスを使用すると、iTunesライブラリのXMLファイルを解析した結果がPHPの連想配列で返されます。今回は、曲データの「ジャンル」ごとに曲数をカウントし出力しますので、全配列をループして「Genre」をキーとする要素をジャンル名として取得し、結果配列にジャンル名をキーとした要素の数値をインクリメントしてカウントしています。
#!/usr/bin/php <?php include 'itunes_xml_parser_php5.php'; // iTunesライブラリファイルをパース $iTunesLibraryXML = '/Users/shigeta/Music/iTunes/iTunes Music Library.xml'; $library = iTunesXmlParser($iTunesLibraryXML); // パース結果をジャンルごとにカウント $result = array(); foreach ($library as $music) { $genre = strlen($music['Genre']) ? $music['Genre'] : 'その他'; if (!array_key_exists($genre, $result)) { $result[$genre] = 0; } $result[$genre]++; } ksort($result); // 出力処理 print "iTunes ライブラリの統計\n"; foreach ($result as $_genre => $_count) { print "{$_genre}: {$_count}\n"; } print "-----------------------------\n"; printf("合計: %d\n", array_sum($result)); ?>
このスクリプトファイルitunes-analyze.phpとパーサクラスitunes_xml_parser_php5.phpファイルを同じディレクトリに配置し、itunes-analyze.phpに実行権限を付与して実行すると結果が出力されます。
$ ./itunes-analyze.php
Folk: 33
J-Pop: 34
Podcast: 1
Pop: 166
Rock: 96
その他: 24
-----------------------------
合計: 357
CLI版PHPといっても、このように出力するデータがHTMLかそうでないかといった違いのみで、基本的にはPHPの記述、文法に大きな違いはなく、これまで経験してきた知識をそのまま活用できるのです。
PHPからMac OS Xの外部コマンドを実行する
クライアントサイドアプリケーションの実行環境は何も文字端末に限った話ではありません。外部のプログラムを呼び出したり、外部プロセスへ情報をプッシュするなどの手段を使えば、よりリッチなインターフェイスを実現できます。
ここからはクライアントサイドPHPの特色を生かし、PHP開発に役立つツールを作ってみましょう。デバッグ中のエラーをトリガーとして、外部プログラムを起動し、エラーを通知するツールです。
PHPから外部コマンドを実行するにはexec()関数やsystem()関数を取得します。単純に外部プログラムを実行するだけでなく、標準入出力経由でメッセージをやり取りすることも可能です。このあたりはMacやPHP特有の仕様ではなく、LinuxでもWindowsでも差異はありません。
ではMac OS X特有の外部コマンドをPHPから呼び出してみましょう。Mac OS Xではsayというコマンドが実装されており、引数で渡した文字列を指定の声のパターンで読み上げる機能があります。sayコマンドは引数に文字列を渡すだけで、文章を読み上げてくれます。まずはこのコマンドをターミナルで実行してみましょう。
-vオプションで人名を指定すれば、声色を変更することも可能です。
このコマンドをプログラムから呼び出してみましょう。exec()関数の引数にコマンドを渡すだけです。
<?php exec('say "I bought a new MacBook Pro! "'); ?>
このコマンドを活用して、PHPでエラーが発生したときにエラーメッセージを声に出して読み上げるエラーハンドラを作ってみましょう。sayコマンドは英文しか対応していませんが、PHPのエラーは幸いにもすべて英文であるため、sayコマンドで読み上げるのに問題はありません。
PHPでは、エラーが起きたタイミングで指定のユーザー関数をコールするエラーハンドラという機構があります。これを利用して、エラーがあったタイミングでsayコマンドを実行する関数をコールさせます。エラーハンドラは、set_error_handler()関数に、エラー処理を記述した関数の名前を文字列で渡せば、エラー発生時にそのエラー処理関数を実行します。
PHPのエラー機構はエラー発生時にこのコールバック関数にいくつかの情報を引数経由で渡します。順に、(1)エラーレベル、(2)エラーメッセージ、(3)ファイル名、(4)行数の4つです。通常はこの4つのなかから必要な情報を、ログや画面に出力します。今回は、エラーメッセージだけをsayコマンドに渡しています。
<?php /** * 音声読み上げエラーハンドラ */ function say_error_handler($level, $msg, $file, $line) { if ($level !== E_STRICT && $level !== E_NOTICE) { $cmd = sprintf("say %s > /dev/null 2>&1 &", escapeshellarg($msg)); exec($cmd); } } // エラーハンドラとして登録 set_error_handler('say_error_handler'); ?>
大量ループなどで厳格なエラーレベルE_STRICTとE_NOTICEが発生すると非常にうるさいので、エラーハンドラ内で無視しています。
この関数は、あくまでもデバッグや開発において使用すべきです。sayコマンドがない環境で実行しようとするとエラーとなりますので、ソースコード中に実装すべきではありません。
開発中のファイルとリリース時のファイルで記述を書き換えるのは面倒なので、設定ファイルphp.iniのauto_prepend_fileを設定することで解決しましょう。auto_prepend_fileで指定されたファイルは、PHPの実行時にあらかじめインクルードされます。この設定の記述を開発環境の設定ファイルphp.iniや、.htaccessなどに記述すれば、アプリケーション側のコードを環境によって書き換える必要はなくなります。
2/3 |
Index | |
ネイティブMacアプリをPHPで操作しよう | |
Page1 クライアントサイド言語としてのPHP シェルスクリプトとしてのPHP |
|
Page2 PHPからiTunesのライブラリファイルをパースする PHPからMac OS Xの外部コマンドを実行する |
|
Page3 PHPからファイルやフォルダを開く Growlを使ってPHPからデスクトップにメッセージ通知 |
Mac OS X+PHPでオールインワン環境 |
Mac OS X関連記事 |
プログラマーを引き付けるMac OS Xの魅力 続々移行するそのワケとは Mac一筋という熱狂的なユーザーだけでなく、「面白いことをしたい」と考えるエンジニアもMac OS Xを利用し始めている。いったいなぜだろう |
|
Mac OS XでAMP構築 3通りの方法で整備できる開発環境 Mac OS Xの上にWebアプリケーションの定番、AMP(Apache+MySQL+PHP)環境を3通りの方法で導入してみましょう |
|
Mac OS Xで動かす軽量プログラミング言語 導入からPHP拡張モジュール組み込みまで Leopardでは、インストール直後からいくつかの軽量プログラミング言語が利用できます。早速試してみませんか? |
|
Objective-Cは特殊な言語? Cocoaの素、Objective-Cを知ろう(1) iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基本を理解しよう |
|
Mac内にPHP4、5、6を同居させるコツ Mac OS X+PHPでオールインワン環境(インストール編) PHP4の開発は終了したが、移行の問題は残されている。異なるバージョンのPHPをスムーズに切り替えるには? |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|