Development」カテゴリーアーカイブ

T4Two.app登場

2人で遊べるiPhone用テニス・ゲームT4Two.appを公開しました。早い話がPONGですけど、iPhoneを挟んで各自がそれぞれの指を使ってラケットを操作できるようになっています。加速度センサーの情報も使っていて、iPhoneの傾きがボールの動きに影響を与えます。なので、お一人様でもiPhoneを傾けて遊べます(かな?)。

iphone-t4two-icon.png iphone-t4two-1.jpg iphone-t4two-2.jpg

元々はマルチ・タッチ機能を試していて、ちょっと発展させてゲームに仕立てたものです。ゲーマじゃないし、ゲームを作ることもあまりないんだけど、シンプルに2人で遊べるゲームってちょっといいなと思った次第です。指を左右に滑らせたり、iPhoneを傾けたりして、それなりに体感係数が高いような気がしますね。ダイナミック(動的)でセンソリー(感覚的、身体的)なものをプログラミングで作るって、まさにDSPでございます。

それから、マルチ・タッチ(ってか2点タッチ)自体は簡単に扱えますが、得られたデータをどう使うかは、なかなかの研究課題になります。このゲームでも、最初はラケットを自由に動かせるようにしていたものの、それぞれの指を区別できる訳ではないので、場合によっては相手のラケットと入れ替わっちゃう事態が発生(笑)。それに衝突判定も格段に面倒になるので、元祖PONGっぽくラケットは直線移動するだけに路線変更。危うく泥沼にハマるところでした(苦笑)。

Pericam.app登場

iPhoneの内蔵カメラを使ってインターバル撮影を行うアプリケーション、Pericam.appを公開しました。時間間隔、画像サイズ、画像品質を指定してStartボタンを押せば、後は一定時間ごとに自動的に撮影が行われます。インターバル撮影自体はバックグラウンドで処理されるので、Pericam.appを終了して他のアプリを起動しても構いません。

iphone-pericam-icon.png iphone-pericam-1.png iphone-pericam-2.png

インターバル撮影と言えば、雲の動きや花の開花などの低速度撮影(早回し再生)もあるけど、iPhoneを胸ポケットに入れて(レンズを覗かせて)歩き回るとかもいいんじゃないかな。それ何?と尋ねられても、他のアプリを見せれば撮影を意識させないで済むしね。

そう言えば、数年前にライフスライス(LifeSlice)プロジェクトやら、LifeLogプロジェクト、MyLifeBitsプロジェクトなどが話題になったよね。当時のLifeSliceカメラは機能的にはショボかったけど、iPhoneとPericam.appなら少々マシなことができるような気がします。iPhoneのカメラもブレがちなのが難点なんだけど。

ちなみに、撮影&リサイズは人様のコマンド・ライン・ツールを使っていて、それをcronで定期的に駆動しています。つまり、Pericam.appはGUIとcrontabの編集をしているだけね。iPhoneがUnixマシンであることの証ですね。ただし、スリープさせちゃうとcronも眠っちゃうみたいで、インタバール撮影は中断されちゃいます。もっとも、アラームなどはスリープしていても動き出すから、このあたりのメカニズムを探求したいところ。

それから、Pericam.appのインストールはちょいと面倒です。ターミナルを使える人なら問題ないと思いますけど、Installer.appしか使ったことがない人には少々敷居が高いかも。Installer.app用のスクリプトを書けば良いような気もしますが、取り敢えずはUnixの基礎知識がある人限定ということでお願いします。

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

aka.iphone2.1登場

aka.iphone / experiment 2.1を公開しました。

akaiphone21.jpg

ほぼ予告通りですが、新機能は以下の通り。

– 複数画面
– トランジッション効果
– 加速度センサー
– XYスライダー
– 縦および横スライダー
– 大小ボタン
– OSCポートの設定
– 値の送受信
– 新プロトコル(OSC上)
– 複数のiPhoneの利用

ただし、以下の機能はまだ実現できていません。
– マルチ・タッチ
– GUIの編集・設定

この手の開発はキリがないので、一応バグが潰れたと思われる現時点で公開しました。それでなくても泣きそうに忙しい今日この頃なので、この辺で手を離しておかないとね〜と思った次第です(笑)。

勝手アプリ3分間クッキング

iPhoneの勝手アプリを3分間で作る方法です。Objective-Cなんて知らないよ〜ってアナタも大丈夫。指定したURLを開く(だけの)ネイティブ・アプリが、手軽に出来ちゃいます。

手順は、MacのSafariでiPhone Apperにアクセスして、名称(Title)とURLを入力し、アイコン画像のPNGファイルを指定したら、App Me!ボタンをクリックするだけ。これで、オリジナル勝手アプリがダウンロードされるので、iFuntasticやiNdependenceあたりで、iPhoneに転送してください。

iphone-apper.jpg

Safariのブックマークと一緒でしょ?と思った人は、半分当たっていて半分外れています。機能的にはブックマークなんだけど、オリジナル・アイコンをホーム・スクリーンに表示して、ワンタッチでアクセスできますからね。知らない人に見せて、自慢してください。iPod touchでも動くんじゃないかな?(無責任)

と言う訳で、iPhone Apperで作らせていただいた2061.appを以下に入れておきます。このサイトを開く専用アプリね。アイコン画像は以前に作っていたので(料理は下ごしらえが肝心〜笑)、3分間どころか1分以内にできちゃいました。

iphone-2061icon.png 2061.appをダウンロード

ちなみに、作られたアプリのパッケージを開くと、指定したアイコンがicon.pngとして存在していて、Info.plistのEmbarkURLプロパティに指定したURLが記述されています。指定した名称はInfo.plistのCFBundleIdentifierプロパティとアプリの名前に反映されています。

このあたりのことが分かっていれば、自分でアプリを複製して勝手アプリを増殖させることができますね。http://の代わりにtel:を付ければ、指定した番号に電話をかけるアプリになります。プライベートな電話番号であれば、自己増産方式が安全ですね。

Yes|No.app登場

Mac OS X 10.5、Xcode 3.0、toolchain 0.3無事稼働記念ということで、新しいiPhone用アプリケーションを作りました。起動するとランダムにYesまたはNoを表示するだけの、シンプルな意思決定ツール、Yes|No.appです。

なんじゃそれ?と思われるかもしれませんが、とっても便利です。例えば、こんな風に使います。
「部屋を掃除しようかな?」→Yes|No.app起動→Noと表示→「そうか、止めておこう」
「モヒカンにしようかな?」→Yes|No.app起動→Yesと表示→「よし、決行じゃ!」
「あいつが真犯人だろう?」→Yes|No.app起動→Yesと表示→「それ、逮捕!」

iphone-yesno-icon.png iphone-yesno_m.jpg

ちなみに、勝手アプリが登場し始めた頃に、やられた〜と思ったのは、Erica Sadun女史のLight.app(当時はiLight.appという名前だった気がする)でした。これは全面的にスクリーンを白くするアプリケーションで、単に白い画像を表示しているだけね。でも、これでiPhoneを懐中電灯のように使える訳です。超簡単なプログラミングで納得できる機能を提供する、ってのは素晴らしいでしょ?

それで、Light.appの次にシンプルでお役立ちなツールとして考えたのがYes|No.appなのです。だから、複数のグループから選べたり、表示するテキストを編集できたり、といった拡張計画は一切ありません。でも、ジャンケン.appやサイコロ.appならいいかもね。

ところで、これまでiPhone用アプリケーションは、aka.objectsサイトにて公開していましたが、今回からaka.iphoneサイトにまとめることにしました。HTML流用の手抜きサイトですが、こちらもご贔屓に!

あと、Installer.appからダウンロードできるようにしたいんだけど、どうすればいいのかな?

Xcode 3.0/toolchain 0.3用テンプレート

Xcode 3.0/toolchain 0.3用テンプレートですが、ちょこっとやってみたら、ちゃんと動いているみたい。先の記事と同じようにMakefileを書き換えただけです。このテンプレートは、以下のリンクからダウンロードしてください。

Xcode3 iPhone Template for toolchain 0.3

テンプレートは、従来とは置き場所が変わったので、

/Developer/Library/Xcode/Project Templates/Application/

にコピーします。これで、最新バージョンでの開発体制が整うことになります。

xcode3-iphone-template.png

toolchain 0.3は最新のヘッダファイルを揃えているし、Xcode 3.0は便利な機能満載なので、これを使わない手はありませんね。後は、toolchain 0.3の簡単インストーラが登場すればイイのにね!(他人任せ)

ちなみに、従来のtoolchan 0.2用に開発していたXcode 2.0用のプロジェクトも、Makefileを書き換えるだけで、そのまま動作するようです。ヘッダ・ファイルが最新のものになっているので、多少の修正が必要になるかもしれませんね。aka.iphoneの場合は、Makefile以外の修正はナシで大丈夫でした。

当然のことながら、toolchain 0.2な人やXcode 2.xな人はこちらを使ってください。

Leopardでtoolchain 0.3

iPhoneが1.1.1、Mac OS Xが10.5となれば、iPhoneの開発環境も最新版のtoolchain 0.3でなきゃね〜ってことでセットアップしてみました。ただし、toolchain 0.2ならワンタッチ・インストーラがあるので簡単ですが、現時点では自分でtoolchain 0.3をビルドしなければなりません。軟弱者にとってはトホホです。しかも、toolchain 0.2のビルドでは丸3日間ハマリまくったので、イヤな予感(もしくはトラウマ)に満ち溢れていました。

ところが、実際には0.3のビルドは、自分でも驚くくらいスムースでした。総作業時間は3時間くらいだったので、24倍速ですね。3時間と言っても、その大半はソースコードのダウンロード(svn)とコンパイルの時間なので、ターミナルを叩いている時間はちょっとだけです。

iphone-toolchain03.jpg

具体的な手順は、HOWTO build the toolchainに載っています。Leopardでは上手く行かない箇所が2点ありましたが、Issuesにおいて既に解決済みでした。今後のアップデートによって、問題が解消するかもしれませんが、今回のトラブル・シューティングを書いておきます。

【トラブルその1】Build odcctoolsのmakeで、

..//include/libkern/machine/OSByteOrder.h:51: error: redefinition of ‘_OSSwapInt16’

などのエラーが出る。

【解決方法】ターミナルで、

export INCPRIVEXT=”-isysroot /Developer/SDKs/MacOSX10.4u.sdk”

と環境変数を設定した後、makeする。(Issue 31より)

【トラブルその2】Configure and make LLVM-GCC.の
make LLVM_VERSION_INFO=2.0-svn-iphone-dev-0.3-svnで、

/usr/local/bin/arm-apple-darwin-ld: can’t locate file for: -ldylib1.10.5.o

というエラーが出る。

【解決方法】llvm-gcc-4.0-iphone/configureをテキスト・エディタで開き、4970行目の、

FLAGS_FOR_TARGET=

FLAGS_FOR_TARGET=${FLAGS_FOR_TARGET-}

と変更し、ファイル保存した後、configureする。
さらに、ターミナルで、

export FLAGS_FOR_TARGET=”-mmacosx-version-min=10.1″

と環境変数を設定した後、makeする。(Issue 92より)

残るはMakefileの書き換えで、少々試行錯誤した結果、次のような設定でHelloWorldのビルドができるようになりました。これが必要十分にして最適解かどうかは分からないんだけどね。

CC=/usr/local/bin/arm-apple-darwin-gcc
CXX=/usr/local/bin/arm-apple-darwin-g++
CFLAGS=-fsigned-char
LDFLAGS=-lobjc -ObjC -mmacosx-version-min=10.1 -framework CoreFoundation -framework Foundation -framework UIKit -framework LayerKit -framework CoreGraphics -framework GraphicsServices -framework Celestial -framework MusicLibrary
LD=$(CC)

といったあたりで力尽きたので、今日はここまで。さらには、Xcode 3.0用のプロジェクト化なども必要ですが、そのうちね!…ってか、どなたか作ってください。

【追記】Leopardでのtoolchain 0.3の修正版ビルド方法が公開されました。上記のトラルブ・シューティング2点が反映されているようです。これが1日早く公開されてたら、私のビルド時間は1時間くらい短縮できたんじゃないかな(笑)。いずれ、大元の説明も更新されるでしょうね。