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

Year of the iPhone

今年はiPhoneおよびOS Xの年だと思う。個人的にも世間的にもね。もちろん、2007年こそがiPhoneの年だったんだけど、愚鈍なケータイ鎖国日本ではインパクトが薄まっちゃった感は否めない。だけど、今年は3G iPhoneが出るのは確実だし、日本でも発売されるだろうから、その真価が誰の目にも明らかになるハズね。

それはiPhoneだけではなくって、iPod touchやウルトラスリムMac touch(出るのか?)、第2世代Apple TV(出るのか?)、カーナビを含む自動車用デバイス(まだ名称未設定?)などを含めたOS Xベース、マルチタッチ・ベースのポータブル・デバイス群が強力なシナジー効果を発揮することにもなるだろうね。ハイ、何度も言ってますけど、OS X汎神論です。

このことは、本体、ディスプレイ、キーボード、マウスから成るコンピュータの終焉でもあるワケです(形状だけでなくって、UIや利用形態を含めてね)。デスクトップからモバイル、ウェアラブルへの本格的な移行であり、さらにはインプラントへの序曲でもあるね。これまた何度も言っているけど、コンピュータはもうオシマイ!なのです。などなどと考えながら過ごしたお正月でした。

iphone-screens.jpg

ちなみに、ちょっと腰砕けになるけど、制作環境としてのコンピュータは暫く存続するハズね。小さなスクリーンでの効率的な作業環境は、まだまだ確立されていないから。となると、コンピュータとモバイル・デバイスとのシームレスな統合が、今年のもうひとつの鍵になりそう。それはウワサ(と言うか特許出願中)のドッキング・ステーション(熱望!)かもしれないし、今のところ出来の悪い「どこでも My Mac」かもしれない。

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以内で、圧力なので底面積が小さい程有利なハズです。

iPhysicsが面白愉快

クレヨン物理学(Crayon Physics)のiPhone版、iPhysicsが面白いです。力学シミュレーションによるパズル・ゲームで、ほんわかシンプルなんだけど、奥が深いって感じです。当初のiPhysicsは機能が少なかったものの、現時点での最新バージョン0.9では、かなり遊べるるようになっています。遊び方はDeluxe版のムービーを見れば一目瞭然。到達目標は、iPhysicsでは赤い正方形ね。

iphone-iphysics.jpg

iPhysicsはオフィシャル・ソースにもコミュニティ・ソースにも登録されていなくて、独自のソースを登録する必要があります。手順は、Installer.appを起動して、Sourcesを選びます。次いでEditを選び、Addを選びます。これで、URLに「http://iphone.r4m0n.net/repos」を登録すれば、InstallのカテゴリーにiPhysicsが現れるはずです。このカテゴリーからiPhysics本体やレベル・パックをインストールしてください。

それから、iPhysicsでの操作方法などが良く分からなくって、ドキュメントも見つからなかったので、私が遊んでいる範囲で気が付いたことを書いておきます。ただし、自分で探し出す楽しみがなくなっちゃうから、ネタバレ注意!でございます。他にもあれば教えてください。

・ゲームの目標は、青い円を赤い正方形まで移動させること。
・青い円はドラッグなどで直接動かすことはできない。
・閉じていない図形を描くと、直線や折れ線が現れる。
・閉じた図形を描くと、物体(塊)が現れる。
・下向きの重力があり、固定されていない線や物体は落下する。
・線や物体が衝突すると、双方に力がかかる。
・物体をドラッグして、移動したり、投げたりできる。
・線や物体をダブル・タップすると、その物体が消滅する。
・線や物体を横切るように線を描くと、その物体が消滅する。
・何もないところでダブル・タップすると、小さな円(物体)が現れる。
・(場面によっては)何もないところをしばらく押すと、白い小さな円が現れる。
・白い小円を囲むように物体を作ると、その物体は白い小円を支点として回転する。
・プレイ中にiPhoneを振るとナビゲーション・バーが現れる。

マウスとは違って、指では思うように図形が描けないことが多々あるけど、それがまた楽しい(腹立たしい?)かも。レベル・パック(オプション画面)も沢山あって、難易度の高い場面もあるので、なかなか遊び尽くせません。

iPhoneのサウンド設定

iPhoneのサウンド関係の各種設定ファイルは、以下のフォルダにプロパティ・リスト(.plistファイル)として納められているそうです。例えば、SystemSoundMaximumVolume.plistはシステム・サウンドの最大音量ですね。バイブレーション関係のファイルや呼び出し音(?)のシーケンス、サウンドのルーティングや各種動作に対する振る舞いといったファイルもあります。

/System/Library/Frameworks/Celestial.framework/

そこで、SystemSoundMaximumVolume.plistのDefaultのDefalutを1.0に変更し、iPhoneをリスタートすると各種操作音や通話音などの音量が大きくなります。もともと設定値が小さいTouchToneは、効果がはっきりと分かりますね。これらの値を2.0とか5.0とかにすると、素晴らしいディストーション・サウンドが得られます…って訳はないです。

iphone-volume-plist.png

Pogo Stylusでペン操作

Gizmodoに紹介されていましたが、iPhoneをペン操作するための特別なスタイラスがPogo Stylus。ご存知のように、iPhoneのタッチ・スクリーンは静電容量タイプなんだけど、こいつは生指でもないのにタッチできるみたいです。

実際の使い勝手は分かりませんが、取り敢えず,不可能を可能にしたという点で賞賛モノですね。単なる棒にしては破格のUS$24.95という強気の値段も、独自性を伺わせてくれます。特許出願中らしいです。2本あればピンチとかできるのかな?

pogo_stylus.jpg