カーボンかココアか?

Leopard的にはClassicはもう消えちゃったけど、Mac OS Xで動作するアプリケーションにはCarbonベースとCocoaベースとがあります。一般ユーザ的にはどちらでも構わないかもですが、気になる時には気になります。

これを判別する方法は、Technical Q&A QA1372 “How can I identify the runtime environment, Carbon or Cocoa, of the current application?”に示されています。一方、Web検索してみると便利なツールがありました。Takenori Kabeyaさんが作られた、その名もCarbonOrCocoaです。QA1372とは異なる方法みたいですけどね。

carbonorcocoa.png

このCarbonOrCocoaを起動して、適当にいくつかアプリケーションを立ち上げてみました。MaxMSP 4.6.3は予想通りCarbonとの判定ですね。Max 5でCocoaになるのか否かは、ちょいと気になっています。Cocoaベースであれば、RubyCocoaやCocoaColliderみたいにCocoaMaxが作り易くなるんじゃないかな? Carbonベースでもできるのかな??

もうひとつ重要なのは、CocoaならiPhone(OS Xマシン)に移植し易いってこと。テキスト・ベースじゃないMaxは、iPhone向きだと思うんだよね。小さなスクリーンじゃ編集しにくいような気もするけど、Max 5のGUIならスムースに行くんじゃないかな??

noatiklは公案の復活

その昔、SSEYOって会社がKoanと言うMIDIソフトを出してました。いわゆるアルゴリズミック作曲ツールで、Mみたいなものだけど、アンビエント寄りのダラダラ音楽生成に適していたと思います。Brian Enoが使ったことで多少は注目されたものの、コイツはMac版も含めて阿呆Windows丸出しの使い辛いGUIでトホホだったんです。その後、別会社に買収されて、PDAやケータイ向けの音楽システムを目指してたみたいだけど、鳴かず飛ばずでした。

で、そのKoan(公案)の復活が、intermorphicnoatikl(変なネーミングは健在)。チュートリアルには沢山のビデオがリンクされているし、ダウンロードして30日間の試用ができますので、興味があれば試してみてください。他に歌詞ジェネレータらしいliptiklとか、照明ジェネレータらしいoptikl(未リリース)ってのもありますね。

noatikl.png

noatiklの第一印象としてはモダンなGUIデザインなんだけど、実際にはKoanとそれほど変わってないっぽいです(苦笑)。新しい皮袋に古い酒を入れたってとこかな。スタンドアローン・アプリケーションの他に、VST、AU、DXiなどのプラグイン版があるのは便利かも。

ただ、それじゃオマエは使うのか?と尋ねられると、きっと使わないんですけどね(笑)。だって、コンセプトからインプリメントまで、すべからく古過ぎ!ですから。しかし、石の上にも3年どころか、同じことを17年間も続けているのはスゴ過ぎます。Mと並んで生きた化石として珍重されるかもね。いつか花開くのか、歴史に埋もれるのか、それは神のみぞ知る…ってことで。

av.app登場

お久しぶりのiPhone勝手アプリの新作、av.appを公開しました。YouTubeでのデモを見てもらえれば一目瞭然、マイク入力の音量に応じて明滅するオーディオ・ビジュアライザーです。

iphone-av-icon.png iphone-av.jpg

チカチカするだけなので頭悪い感じですが(笑)、かと言ってiTunesのビジュアライザーみたいに派手にする気はありません。単にマイク入力の音量取得を試してみたかっただけなので。

だけど、肝心の音量取得の方法はよく分からないでいます。AVRecorderというクラスがあって、こやつで録音すればaudioCurrentAverageVolumeLevels:andPeakVolumeLevels:でレベル値とピーク値が得られます。しかし、これだと録音ファイルができちゃうので、イマイチ。実際の録音はせずに音量取得だけしたいんだけどな〜まだ未解決です。

と言う訳で、実際には録音ファイルが作られているので、超長時間は使わないで下さい。アプリ終了時に録音ファイルを自動消去していますけどね。

iPhoneデバッグ〜weasel編

NSLog()編に続き、シンプルなデバッガーweaselによるiPhone勝手アプリのデバッグ方法です。

まず、weaselを適当なところ(ソースとかhdm-0.01とかhdm-0.02とか)からダウンロードして、iPhoneの実行パスのあるディレクトリ(例えば、/binとか/usr/binとか)にコピーしておきます。

次に、SSHでMacをiPhoneに接続します。詳しくはNSLog()編参照ね。

ssh -t root@255.255.255.255 “cd /; $SHELL”

それでは、実行ファイルを指定してweaselを起動します。

weasel /Applications/akaRemote.app/akaRemote

[$3000d232 weasel] といったプロンプトが出れば、weaselの起動は成功。実行ファイルが読み込まれて、実行される直前で一時停止している状態です。

ここで、「h」をタイプしてreturnキーを押すと、次のようなヘルプが表示されます。

Available weasel commands:
b set a breakpoint at the given address
c continue execution
d disassemble starting at the given address
(if no address given, continues from last point)
m continue execution and profile the process
n print the symbol table of the main image
p peek at memory starting at the given address
q quit weasel and inferior
r print the current values of the CPU registers
x delete the breakpoint with the given number
v dump all virtual memory addresses
f find a string in memory

この後は、weaselのコマンドを駆使してデバッグしてください。何はともあれ、nコマンド(「n」をタイプしてreturnキーを押す)でシンボル・テーブルを表示させるのがイの一番かな。「00002930 start」みたいなアドレスとシンボル(実行ポイントや変数など)の一覧表がズラズラっと表示されるはずです。こののアドレスを元にブレーク・ポイントを設定したり、変数の内容を表示したりできるわけです。実行を開始するのはcコマンドまたはmコマンドね。

iphone-weasel.png

weaselは、Xcodeが備えるような高機能デバッガじゃないので、ステップ実行したり、変数の内容を型に従って表示したりといったことはできません(涙)。ナイよりはマシといった程度かもしれませんが、それでもこのような環境でiPhoneを解析している人が何人もいらっしゃる訳で、頭が下がる思いです。

iPhoneデバッグ〜NSLog()編

iPhone用の勝手アプリを開発していると、いつも困っちゃうのがデバック。そもそもドキュメントがなくって、ダンプされたヘッダを読み解く(想像する)しかないので、デバッグ機能がないに等しいのは大変なのです。だから来年2月の公式SDKには、マトモなデバッガが備わっていることを強く強く希望したいところ。

それで、現状ではどうするかと言うと、ソースコードにNSLog()を埋め込むか、weaselというシンプルなデバッガを利用するくらいしか方法がないようです。いずれの場合も、SSHを使ってMacからiPhoneに接続してデバッグします。

まず、今回取り上げるNSLog()は標準エラー出力で、printf()みたいなものです。詳しいフォーマットはココを見ていただくとして、よく使うのはこんな感じ。

NSLog(@”Hey!”);
NSLog(@”Superman runs for %d times.”, counter);
NSLog(@”ID=%d Rate=%f Name=%@”, intVar, floatVar, stringVar);

このようなNSLog()を適所に埋め込んだソースコードをコンパイルして、ビルドされたアプリケーションをiPhoneに転送しておきます。それから、Installer.appあるいはiNdependenceを使ってiPhoneにOpenSSHをインストールし、iPhoneのIPアドレスをメモしておきます。

次に、以下のような手順で、MacのターミナルからiPhoneのアプリケーションを起動します。

・Macでターミナルを起動し、以下のコマンドをタイプしてreturnキーを押す。255.255.255.255の部分は、実際にはiPhoneのIPアドレスに置き換える。

ssh -t root@255.255.255.255 “cd /; $SHELL”

・SSHで初めてiPhoneに接続する時は、本当に接続するか確認を求められるので、「yes」とタイプしてreturnキーを押す。
・パスワードを尋ねられるので、「alpine」(Firmware 1.1.Xの場合)または「dottie」(Firmware 1.0.Xの場合)とタイプしてreturnキーを押す。

プロンプトが「bash-3.2#」といった表示になれば、この後は(Macではなく)iPhoneを操作していることになります。この状態で、次のいずれかのコマンドでiPhoneのアプリケーションを起動します。ここではakaRemote.appを例としています。

・アプリケーションのディレクトリ内に移動して、実行ファイルを実行

cd /Applications/akaRemote.app/
./akaRemote

・ディレクトリを移動せずにアプリケーション(の実行ファイル)を実行

/Applications/akaRemote.app/akaRemote

以上で、アプリケーションが起動するので、NSLog()が実行されれば、その内容がターミナルに表示されるハズです。NSLog()の出力を見ることで、プログラムの動作や変数の内容を把握する訳です。もちろん、どこにどのようにNSLog()を埋め込むかが重要になりますね。

iphone-nslog.png

ちなみに、このようにして起動した場合、iPhoneのHomeボタンを押してもアプリケーションは終了しません。アプリケーションを終了するには、Macのターミナルでctrlキーを押しながらCキーを押します。

最後に老婆心ながら、超初級コマンドをいくつか書いておきます。

・ディレクトリ内を表示

ls

・ディレクトリ内をロング表示(パーミッションなどを確認)

ls -l

・パーミッションを変更

chmod 755 akaRemote

・ヘルプを表示

help

・SSH接続を終了

exit

iNdependenceによるアクティベーション

US特派員からのレポート続編です。先の記事にもあったように、iPhoneのFirmwareが1.1.1であればAppSnappを使ってアクテベーションするそうですが、Firmwareが1.0.Xや1.1.2であればiNdependenceを使うそうです。

iNdependenceは1.1.1または1.1.2を直接アクティベートできないので、Firmwareを1.0.2にダウングレードする必要があります。そして、1.0.2でアクティベーションして小細工を施した上で、1.1.1または1.1.2へアップグレードを行い、再度アクティベーションするという流れになります。

このダウングレードやアップグレードには少々時間がかかるので、Firmwareが1.1.1であれば、AppSnappを使うのが吉ってことのようです。しかし、AppSnappでは1.1.1以外を扱えないので、そのような場合はiNdependenceを用いる訳です。

iphone-independence-banner.jpg

それでは、最初にFirmwareファイルを用意します。~/Library/iTunes/iPhone Software Updatesフォルダを開いて、以下のファイルが存在しているか確認します。Firmware 1.0.2ファイルは必須で、Firmware 1.1.1ファイルかFirmware 1.1.2ファイルは、アップグレードしたいバージョンに応じて、いずれかが必要です。

・iPhone1,1_1.0.2_1C28_Restore.ipsw (Firmware 1.0.2ファイル)
・iPhone1,1_1.1.1_3A109a_Restore.ipsw (Firmware 1.1.1ファイル)
・iPhone1,1_1.1.2_3B48b_Restore.ipsw (Firmware 1.1.2ファイル)

これらのうちFirmware 1.0.2ファイルは解凍しておく必要があります。ファイル名に.zip拡張子を付けてダブルクリックし、解凍されたフォルダを「iPhone1,1_1」といった名前にします。元のファイルは.zip拡張子を外して「iPhone1,1_1.0.2_1C28_Restore.ipsw」というファイル名に戻します。

これらのファイルがなければ、AppleのサイトからFirmwareをダウンロードします。

Firmware 1.0.2のダウンロード
Firmware 1.1.1のダウンロード
Firmware 1.1.2のダウンロード

Safariでダウンロードを行なうと、自動解凍によって「iPhone1,1_1」といったフォルダが作られます。解凍されたフォルダはFirmware 1.0.2のフォルダのみが必要なので、他のフォルダはゴミ箱に捨てて構いません。また、元ファイルであるはゴミ箱に捨てられています。そこで、ゴミ箱から拡張子が.zipである元ファイルをゴミ箱から取り出して、デスクトップなどに移動します。そして、ファイル名の最後の.zip拡張子を取り除いておきます。

Firmwareの用意ができれば、実際の作業を始めます。最初に行なうのは、iPhoneをFirmwareバージョン1.0.2へ復元することです。もっとも、Firmwareが1.0.Xであれば、この作業は不要です。

・iPhoneをMacにケーブルで接続する。
・iNdependenceを起動する。
・Firmwareタブの「Enter DFU Mode」ボタンをクリックする。
・Firmwareフォルダを尋ねられるので、「iPhone1,1_1」フォルダを選択する。これはFirmware 1.0.2ファイルを解凍して出来たフォルダのこと。
・「Success」と表示されれば、iNdependenceを終了する。
・iTunesを起動する。
・概要タブが表示されるので、optionキーを押しながら「復元」ボタンをクリックする。
・Firmwareファイルを尋ねられるので、「iPhone1,1_1.0.2_1C28_Restore.ipsw」を選択する。
・数分後にiPhoneに黄色い三角形マークが表示されれば、iTunesを終了する。
・iNdependenceを起動する。

十数秒後にアクティベーション待ち画面(地球の写真)が表示されれば、iPhoneにFirmware 1.0.2がリストアされたことになります。

次いで、Firmware 1.0.2でのアクティベーションを行ないます。

・Jailbreakタブの「Perform Jailbreak」ボタンをクリックする。
・Firmwareフォルダを尋ねられるので、「iPhone1,1_1」フォルダを選択する。

これで「Success」と表示されれば、1.0.2のアクティベーションが完了です。

最後に、1.0.2から1.1.1または1.1.2へアップグレードします。この手順は、アクティベーション済みの1.1.1から1.1.2へのアップグレードする場合でも同じです。

・iTunes Helperを終了させる。このためには、アクティビティモニタを起動し、リスト中の「iTunes Helper」を選択して「プロセスを終了」ボタンをクリックする。
・iPhoneをWi-Fi接続し、IPアドレスをメモしておく。
・SSHタブの「Install SSH/FSTP/SCP」ボタンをクリックする。
・iNdependenceの指示に従って、iPhoneを2回再起動する。
・Firmwareタブの「Pre Firmware Upgrade」ボタンをクリックする。
・iPhoneのIPアドレスを入力し、パスワードには「dottie」(Firmware 1.0.Xの場合)または「alpine」(Firmware 1.1.Xの場合)と入力する。
・「Success」と表示されれば、iNdependenceを終了する。
・iTunesを起動する。
・iPhoneの概要タブを開き、Optionキーを押しながら「アップデート」ボタンをクリックする。
・ファイル選択シートが開くので、アップデートしたいバージョンの.ipswファイルを選択する。
・数分後にアップデート作業が終われば、iTunesを終了する。iPhoneはリカバリー・モードになっている。
・iNdependenceを起動する。
・Activation/SIMタブの「Activate iPhone」ボタンをクリックする。
・数分後にiPhoneの再起動を指示されるので、それに従ってiPhoneを2回再起動する。

以上の手順で「Success」と表示されれば、1.1.Xにおけるアクティベーションと脱獄の完了です。お疲れさま〜

AppSnappによるアクティベーション

US特派員からレポートが入りました。なぜか人様のiPhoneをアクティベーションしたり、脱獄(jailbreak)させたりする機会が多くなり、その手順を備忘録としてまとめたんだそうです。この手の方法はいくつかあって、それを紹介しているWebサイトも沢山ありますが、現時点で彼がもっとも簡単と思う方法らしいです。当然のことながら、試される人は自己責任でお願いします。

まず、対象となるiPhoneのFirmwareのバージョンを確認します。

・iPhoneをMacにケーブルで接続する。
iNdependenceを起動する。
・ウィンドウの下部に表示されるStatusを見て、Firmwareのバージョンを確認する。

Firmwareのバージョンが1.1.1であれば、以下のAppSnappによるアクティベーションを行ないます。これが他の方法に比べて一番手軽に(?)かつ素早くできるそうです。Firmwareが1.0.Xまたは1.1.2であれば、次の記事で紹介するようにiNdependenceによるアクティベーションを行ないます。

iphone-appsnapp.jpg

それでは、Firmwareバージョン1.1.1のiPhoneをAppSnappを使ってアクティベーション&脱獄する手順です。iPhoneはアクティベーション待ち画面(地球の写真)になっているはずですね。

・地球画面の下部のボタンをスライドさせ、緊急ダイアルを表示する。
・「*#307#」とプッシュしてCallボタンをタップする。
・電話が掛かって来たかのようにiPhoneが鳴動する。
・右上の×ボタンをタップして「*#307#」を消去する。
・「0」をタップしてCallボタンをタップする。
・Answerボタンをタップする。
・Holdボタンをタップする。
・再びiPhoneが鳴動するので、Declineボタンをタップする。
・Keypadが表示されるので、Contactsをタップする。
・+ボタンをタップして、新しいコンタクトを作成する。
・First Last(氏名)をタップし、適当な名前を入力してSaveする。
・Add new URLをタップし、URLに「prefs://1F」と入力してSaveする。
・Add new URLをタップし、URLに「http://jailbreakme.com」と入力してSaveする。
・作成したコンタクトをSaveする。
・作成したコンタクトが表示されるので、「prefs://1F」をタップする。
・Settingsが表示されるので、Wi-Fiをタップし、インターネット接続を行う。
・iPhoneのSleepボタンとHomeボタンを押し続ける。
・「slide to power off」と表示されれば、そのボタンをスライドして電源を切る。
・Sleepボタンをしばらく押して、iPhoneを起動する。
・地球画面が表示されれば、緊急ダイアルから上記の手順を繰り返し、Contactsを表示する。
・作成したコンタクトを選択し、今度は「http://jailbreakme.com」をタップする。
・Safariでjailbreakme.comのWebサイトが表示される。
・下にスクロールし、一番下の「Install AppSnapp」をタップする。
・すぐに地球画面が表示される。
・何も操作しないで待つと、しばらく後にiPhoneが自動的に再起動する。

以上の手順でiPhoneはアクティベーションされ、脱獄も完了した状態になっています。Installer.appもスタンバイしていますので、これを使って勝手アプリをインストールできますね。日本語入力をしたい人は、以前に紹介した方法を使ってください。

文章にすれば手順が多くて面倒な気がしますが、実際にはサクサクと作業できるそうです。慎重にゆっくり作業しても数分程度で終わるのではないか、とのことでした。

これが本当のマルチボール

年内の大仕事は一段落して、ちょっと時間の余裕ができた今日この頃。そうなると、しなくてもいい馬鹿なことをしたくなります。と言う訳でやりました、Lemurで一番やりたかったこと、本物のマルチボールです! JazzMutantさん、ごめんなさい!良い子の皆さんは真似をしないでください(笑)。

lemur-multiball.jpg

Lemurは感圧式のタッチ・パネルなので、指でなくてもスタイラスだろうがマジック・ハンドだろうが、圧力さえかければ反応します。ある程度の重みがあれば、コップとか腕時計とかでも自重で位置検出ができるわけです。そこで一番良いだろうと思ったのが球体です。コロコロ転がるから、Lemurを傾けたり、指で弾いたりできますし、接触面は点ですからね。お誂え向きに、LemurにはMultiballというGUIがスタンバイしています。

実際には、必要十分な重みを持った球体を探すのが大変でした。意外と真球である製品はないんですよね。普通のビー玉やスーパーボールでは重みが足りません。ピンポン・ボールも軽過ぎるし、テニス・ボールなら反応するけど大き過ぎ。パチンコはしないしな〜とホームセンターやオモチャ屋で悩んでいました。

そんなこんなで今のところOKが出ているのは、東急ハンズで買った鉄球(直径2cm)、鈴が入った中空の金属球(健身球と言うらしい)、大きめのビー玉といった布陣。大きな(重い)ベアリング・ボールが入手できれば、精度が高いのでモアベターだと思うんだけどね。

それから、まだ適切な駒が見つかっていないけど、Lemurでチェスをしたいな。ジョン・ケージとマルセル・デュシャンのReunionね(笑)。もっとも、Lemurは位置判定はできるけど、物体の区別はできない。でも、初期状態が分かっていて、同時には1個しか動かさない条件にすれば処理できるよね。どなたか金属製など十分な重みのある駒をお持ちでしたら、貸してやってください。パネル・サイズから考えると駒の大きさは2.3cm以内で、圧力なので底面積が小さい程有利なハズです。

LinuxでMaxMSP runtime

MaxMSP MLで知りましたが、Linux+WineでMaxMSP runtimeが動作するそうです。WineはLinux上でWindowsアプリケーションを走らせる互換レイヤーなので、Windows用のMaxMSP runtimeをインストールすることになります。馬鹿PACE故にMaxMSP本体は起動しない(でも可能性はある?)そうなので、パッチの作成や編集はできませんが、Linuxを実行環境として使える訳です。どなたか、試してみてくださいませ。

実行環境だけじゃダメじゃんと言われそうですが、個人的にはincubatorが安価にできるのでウレシイかもです。欧米で馬鹿売れらしいASUSのEee PC(US$199目標ながら現在US$299〜US$399)や、OLPCが「子供ひとりひとりにノートパソコンを」 として開発しているXO(US$100目標ながら現在US$400で2台〜1台は所有、1台は開発途上国に寄付)が使えますからね。Linuxが載っているゲーム機やケータイもあるね。XO用に開発中の携帯型人力発電機もステキ。人里離れた原野でincubatorいたします(笑)。

eee-pc-and-olpc-xo.jpg

HDVビデオ入力が可能に!?

HDVのビデオ・カメラを繋いで、QuickTime Player (Pro)で録画しようとして、いきなり巨大なキャプチャー画面が現れてビックリしちゃいました。なんと、HDVでのリアルタイム入力ができます。従来は、iMovie HDやFinal Cut Proなど特定のアプリケーション・レベルでしか対応していないと思っていたんですけどね。

Webを検索してみると、Final Cut ProやLogic Studioをインストールすれば、QuickTimeレベルでの入力が可能になるAppleHDVCodec.componentがインストールされることが分かりました。私の手元にある構成では、Mac OS X 10.5.1 / QuickTime 7.3.1 / AppleHDVCodec.component 1.3.2 (Final Cut Studio 2)という組み合わせだけでなく、Mac OS X 10.4.11 / QuickTime 7.2 / AppleHDVCodec.component 1.2 (Final Cut Studio 1)という組み合わせでも、HDV入力ができました。と言うことは、もっと前から可能だったのかもしれません(ジョーシキだったらスミマセン〜)。

ともあれ、Jitterで試してみようとjit.qt.grabのヘルプ・パッチを開いたものの、デバイス・リストにもインプット・リストにもHDVカメラが現れません(涙)。しかし、Quartz ComposerではHDVをバッチリ選択できるし、1440ピクセル×1080ピクセルでビデオ映像が入って来ます。レイテンシーはかなりありますが、30fpsで入力できているみたい(実際には、20fpsから70fpsくらいの範囲で変動が激しい)。

qc-hdv-input.jpg

こうなるとJitterでもHDVに対応して欲しいですね。Max 5 (Jitter 2?)と言わずに、インクリメンタル・ダウンロードに入れて欲しいな(と日本語で書いても、C74には届かないけど〜笑)。