Objective-Cに挑戦

と言っても、参考書も持っていないので一からコーディングはできない。
事の起こりはAppleScript版iTunes&iPod再生履歴送信アプリの開発。
曲名やアーティスト名などに「&」が混じるとPOSTしたときにパラメータが正しく渡らないので、情報はすべてURLエンコーディングしなければならない。
しかし、調べた限り、AppleScript単体ではこれができない。
先日、PHPのencode関数を利用し、shell呼び出しでエンコードするコードを見つけたのでこれを採用していた。しかし、今日実行したところ、エラーになった。
エラーメッセージを意訳すると、「予期せぬ行末」だったのだが、ソースとデータを見比べて原因がわかった。問題になったPHP呼び出しは、
set scpt to “php -r ‘echo urlencode(“” & str & “”);'”
と書かれていた。そして、データ、strに「’」が含まれていたのだ。
そこでパラメータが打ち切られることになるからエラーになってしまったというわけだ。
手持ちの参考書はAppleScript Studioでゼンマイびゅんびゅん!!だけ。これには外部モジュールの呼び出しはshellとObjective-Cが載ってはいるが、ここまで細かいPHPに関する記述はない。
なら、とObjective-Cで挑戦することにしてみた。元になるソースはネット上で見つけられたので、変換エンジンはそのコードを流用。あとは、クラスとして形態を整え、AppleScriptから正しく呼び出せればいいわけだ。
まず、Objective-Cの拾ったコードのデバッグに難儀。文法知らないのだから、英語のコンパイルメッセージを頼りにそれらしく直していく。これは簡単だった。
しかし、AppleScriptからの呼び出しには苦労した。なにしろ、本のサンプルは画像の描画ばかりで文字列を返す関数の受け方なんて書いていない。文字列一つをパラメータで渡す関数のサンプルを見つけるのだって相当時間がかかってしまった。
それでも、なんとか動作させることができた。
ローカルのテーブル表示は正常、サーバに送信したダンプも文字化けはざっと見る限りなかった。
残りは、送信先・パラメータ形式を本番サーバ側スクリプトに合わせることと、最後に送信したデータの「最後に再生した日時」をデータとして保存し、次回以降に使うこと、あたりであろう。
大規模なアプリではないからJava版との差はあまり感じない。個人で使うだけならAppleScript版の方が手を入れればもう少し改善できそうなのでこちらを使うだろう。
他人に公開するならば、Java版を改良し、Windows用にCOMを実装する。そのためのインタフェースは実はJava版には組み込んである。ただし、今はMac環境固定で動くようにしているのと、COMプログラミングをしていないだけなのだ。
多少でも結果が出ると趣味プログラミングは楽しい。

コメント