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

iPhoneのヘッダー情報

Appleの公式SDKはまだまだ先の話ですが、勝手開発チームの進撃は続いているようで、「iPhone Headers Documentation」が公開されました。これまでの勝手SDKでは、class-dumpでドドっと作られた.hファイルが単純に詰め込まれていましたが、これらのヘッダー情報が整理整頓され、検索機能などが付いたWebインターフェースとしてまとめられています。

iphone-headers-doc.png

Firmware 1.1.1からのヘッダーらしいので最新ピカピカだし、欲しかったクラス・ツリーもあります。知らなかったクラスや見落としていたクラスが恐ろしく沢山ありますね。すべてを読み解くには膨大な量ですが、宝の山であることは間違いないです。これでまた夜も眠れない人が続出しているハズ。

ちなみに、この情報はiPhone勝手ワールドで一躍有名になった女流計算機科学者のErica Sadun氏のサイトにあります。トップページのブログも要チェックね。

iPhone公式SDKは来年2月

AppleがiPhoneのSDKを来年2月に提供すると発表しました。追伸ながら(笑)iPod touchでも同様となっています。iPhone Human Interface Guidelinesで予見されていたので、ビックリはしませんが、ついに!とうとう!待ってた!という感じです(でも、Leopardには間に合わなかったのでガッカリ)。

2月までかかる理由として、オープンなプラットフォームを提供することと、ウィルスやマルウェアからプラットフォームを守ることとを両立させるために、必要な作業があるからだとしています。

まぁ、それはそうなんでしょうけど、ガチガチのサンドボックスを作られても困るなぁ。あるいは、Nokiaの例を挙げているように、デジタル署名認証になって契約や審査を経なければ公開できない(動作しない)ってことになるのかも。「an advanced system」がどうなるか、お手並み拝見ですね。

iphone-sdk-announcement.gif

ともあれ、私は2月までiPhone関係の開発を中断します(笑)。

【追記】ちゃんと伏線がありました。コレですね。特に2番目の「署名入りアプリケーション」はピタリと照準が合ってます。

Preview of next aka.iphone

Here’s a preview of the next version of aka.iphone.
I can’t say about the release schedule but it will have:
– Multiple screens
– Transition effect
– Accelerometer
– XY slider
– Vertical and horizontal sliders
– Large and small buttons
– OSC port configuration
– Sending and Receiving values
– New protocol (over OSC)
– Multiple iPhone support

– No multi-touch support
– No GUI configuration

akaiphone3-preview.jpg

aka.iphone / experiment 2に最小限の機能しか持たせていないせいだと思いますが、いろいろと問い合わせが多いので、次期aka.iphoneはこんな雰囲気ってのを載せておきます。

iPhoneでOSC

aka.iphone2OSC (OpenSound Control) というプロトコル(下位レイヤーはUDP/IP)を使って通信しています。Maxではお馴染みの方法で、udpsendやudpreceiveで一発OKですね。

でも、Maxとは違ってiPhoneではOSCが標準じゃないから、自分でケアしなければなりません。もちろん、スクラッチから書くのは大変なので、私が利用したのはChandrasekhar “Sekhar” Ramakrishnan氏が開発したObjCOSCというObjective-C用のOSCライブラリ。

それで、ObjCOSCを使ったOSCの送信はとっても簡単。Objective-Cのコードはちょっとクセがあるけど、なんとなく分かるでしょ?

OSCPort* port = [OSCPort oscPortToAddress: address portNumber: portNumber];
[port sendTo:"/foo" types:"f", 0.2061f];

受信もコールバック関数を登録しておくだけ。

OSCInPort* portIn = [[OSCInPort alloc] initPort: inportno];
[portIn newMethodNamed: "foo" under: [portIn topLevelContainer]
callback:fooCallback context: myController];

だけど、受信にはハマりまくりました。コールバック関数が呼び出されるところまでは問題ないんだけど、その後がダメダメです。全然うまくいかなかったので、現在公開しているaka.iphone2は送信だけなのね。

ハマった箇所は2つあって、ひとつはエンディアン問題。OSCは数値をビッグ・エンディアンで扱っているのに対して、iPhone(あるいはIntel Macなど)はリトル・エンディアンみたいです。ObjCOSCのサンプル・コード(main.c)なら、PrintOSCArgs()で整数と実数をエンディアン変換する必要があったわけです。変換する部分だけ抜き出しておきます。

int intValue;
intValue = CFSwapInt32BigToHost(intValue);

float floatValue;
CFSwappedFloat32 swappedFloatValue;
swappedFloatValue.v = floatValue;
floatValue = CFConvertFloat32SwappedToHost(swappedFloatValue);

ただ、送信は変換ナシに扱えてるんだから、受信だけ変換が必要ってのはイマイチなんじゃない?って思いますけどね。シンボル(文字列)の受信は問題ないです。

もうひとつのポイントは、受信のコールバック関数から他のインスタンスのメソッドを呼び出すには、メイン・スレッドから行なう必要があるみたいってこと。これをやるのがperformSelectorOnMainThreadね。myControllerというインスタンスがあるとして、そのtest:メソッド(パラメータはNSNumber)をメイン・スレッドから呼び出すのは、こんな感じ。

[myController performSelectorOnMainThread:@selector(test:)
withObject:[NSNumber numberWithFloat:floatValue] waitUntilDone:NO];

以下のように、直接呼び出すとiPhoneがフリーズします(笑)。こっちがフツーなんですが…

[myController test:[NSNumber numberWithFloat:floatValue]];

このあたりは、永野哲久くんがヘルプ&ヒントをくれました。多謝多謝。彼はObjective-Cでオーディオ・ビジュアル系の作品を作っていて(大雑把ですまない〜)、こーゆー人がIAMASに在学しているのは有り難いです。どっちが先生で、どっちが生徒だ?って気もしますけどね(笑)。彼の記事にトラックバックを入れておきます。

UITouchDiagnosticsLayer

コレ何でしょうね? 以下の画像は、iPhoneの上部にボタンとスライダーを置いて、下部にUITouchDiagnosticsLayerというオブジェクトを配置したもの。スクリーンをタップorドラッグすると、その位置がUITouchDiagnosticsLayer(タッチ診断レイヤー?)に数ポイントの履歴付きで表示されます。

ナゾなのはスライダーに対しては、電位マップのような網目が表示されること。ボタンや余白部分では表示されないんですけどね。網目はタッチごとに微妙に違っているように見えるものの、タッチの仕方を変えても、それほど大きくは変化しないみたいです。

uitouchdiagnosticslayer.JPG

なんだか意味ありげだけど、どのように利用するのかは分かりません。マルチ・タッチをしても、同時に数点が押されているようには表示されないですね。ただ、次のような現象を確認することはできました。

人差し指で押す(1点タッチ) → 人差し指の位置が表示される。
中指で押す(2点タッチ)   → 中指の位置が表示される。
薬指で押す(3点タッチ)   → 薬指の位置が表示される。
薬指を離す(2点タッチ)   → 中指の位置が表示される。
中指を離す(1点タッチ)   → 人差し指の位置が表示される。
人差し指を離す(タッチなし) → 何も表示されない(以前の表示が残る)。

明らかに、フツーのタッチ・スクリーンではないってことは分かるんですが、さて,この後どうしたらいんでしょう?

Xcodeで勝手アプリ開発

Xcodeで勝手アプリを開発するためのテンプレートが公開されていました。このあたりの説明を参考にセットアップね。これで、Xcodeで新規プロジェクトを作る時に、iPhone UIKit Applicationが選べるようになります。

早速、私もこれまでのコードをXcodeプロジェクトに移行。ソースを編集するのは楽々だし、ビルドもバッチリです。嬉しがってクラス・モデルを表示してみたりして…(階層が深くないので、ほとんど意味ナシ〜笑)。

iphone-xcode_m.jpg

いかにもモダンな統合開発環境って感じですが、実際にはtoolchainベースであることには変わりなく、ビルドはMakefileを呼び出しているだけね。それでも、使い慣れたXcodeで作業できるのは、ターミナル嫌いの私にとっては精神的にとっても楽です(笑)。

後は、UIKitなどのクラス・ツリーを表示したり、ヘッダへのアクセスを簡単にしたいのですが、どうしたらいいんでしょう? どなたか教えてください。

iPhone Human Interface Guidelines

AppleがiPhone Human Interface Guidelinesなるドキュメントを公開しました。その名の通り、iPhoneにおけるヒューマン・インターフェースのガイドラインです(笑)。

かつてMacintoshの登場から間もなくして刊行された「Human Interface Guidelines:The Apple Desktop Interface」は、コンピュータGUIデザインのバイブルとして超有名(読んでない人はモグリ!)。一方、Mac OS X/Auqa版の「Apple Human Interface Guidelines(旧Aqua Human Interface Guidelines)」では、Apple自身が逸脱しちゃったりでイマイチでしたけど、今回のドキュメントはどう評価されるんでしょうね。

ともあれ、最近のAppleの動向を考えながら、このドキュメントを読むと結構笑えますよ。最初のページからして”Currently, developers create web applications for iPhone, not native applications.”ですからね。そして、すぐにWebアプリでは不可能な事柄についての説明がどんどん登場します。つまり、ネイティブ・アプリをデザインするための情報を、Appleが公式に出している訳です。

iphone-human-interface-guidelines-navigation.jpg

iPod touchで予見され、先週から現実のものとなった勝手iPhone&勝手アプリ撲滅キャンペーンから考えると、このHIG公開は明らかに矛盾しています。と言うことは、近くAppleから公式SDKと公式アプリ動作環境が提供されると期待するのがスジってものです(笑)。今月はLeopard登場(のハズ)だしね。

iPhoneで斜めスライダー

もしかしてと思って試してみたら出来ました、斜めスライダー。setRotationBy:をスライダーに送るだけで、ハイ、この通り。ちゃんと斜めに動きます。本当は縦スライダーを作ろうとしていたんですけどね。

akaiphone2-sliders.jpg

setRotationBy:はUIView-Geometry.hに定義されていて、GUIオブジェクトはUIViewのサブクラスなので、何でも回転できちゃうハズ。setTransform:でアフィン変換もできるみたいだから、歪んだGUIも作れますね。OS XたるiPhoneの能力の高さを再認識しましたです。

こんな風に上位クラスを調べるのは、お宝探しっぽくて楽しいですよ。Cocoa/Objective-Cだから、たぶんこんな感じかなとコードを書けば、それなりに動いてくれるのも快感。でも、正解を見つけるまでのトライ&エラーは大変面倒なんですけどね。

【追記】斜めスライダーに喜んだのも束の間、本来の目的の縦スライダーの表示が微妙に変。ノブが少しズレてるみたい。うむむ??

iPhoneの開発キットを簡単インストール

iPhoneの勝手アプリ開発キットとして、Toolchainと呼ばれる一連のツールが公開されていました。でも、この開発キットをインストールするのがとっても大変だったのです。そこで、コンパイルに何度も失敗した人(私だ〜笑)のためにワンタッチ(でもないけど)インストーラが作られ、簡単にセットアップできるようになりました。拍手〜!

iphone-dvekit-installer.jpg

以下、簡単になった開発キットのインストール手順です。

1. iPhone software restore file(直リンク、91.2MB)をダウンロードする。
2. 694-5262-39.dmgの暗号を解除し、マウントする。
3. /usr/local/arm-apple-darwin/heavenlyフォルダを作成する。
4. マウントされたディスクの中身をheavenlyフォルダにコピーする。
5. iPhoneToolchainv05.dmg(51.5MB)をダウンロードし、マウントする。
6. マウントされたディスクにあるiPhoneToolchainを起動し、インストールを行なう。
7. マウントされたディスクにあるOoo Shiny!!を起動する。

これでも面倒と思われるかもしれませんが、これまでは多くのファイルをダウンロードして、環境変数を設定して、コンパイルして…と無茶苦茶過酷だったので、かなり天国気分です。

あとですね、これまでに公開されている勝手アプリのMakefileとは互換性がない場合があるので、そのような場合はMakefileのヘッダ部分を以下のように書き換えると良いそうです。

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

iPhone/SafariでのJavaScript動作不良?

いろいろと多忙を極めつつあるのですが、楽しい誘惑には素直に負けることにしていて、マルチ・タッチMaxコントローラを目指して実験中です。まぁ、それほど時間が取れないのが残念なのですが。

それで、iPhone/SafariではonMouseMoveハンドラが動かないようです。Mac/Safariなら、ちゃんと動くシンプルなJavaScriptが、まるで反応してくれません。これは私の未熟なスクリプトのせいではないのかも。それが証拠に、Yahoo! UI Libraryで作ったスライダーもノブをドラッグすることができません。(Mapsアプリケーションではなく)iPhone/SafariでのGoogle Mapsでも、地図やノブのドラッグができないのです。

これはバグではなくて、意図的な処置かもしれません。つまり、iPhone自体のUIとしてのページ・ドラッグとの競合を避けているんじゃないかな? しかし、metaダグでuser-scalable=0等と指定して、ページ・ドラッグが不要な状態にしても、症状は同じです。メッセージ・ヒエラルキー的にはユーザUIを優先しても良さそうなんですけど、セキュリティ的な懸念でシステムUI優先なのかもしれません。

てなわけで、スライダー一本まともに動かせない状況で、何か抜け道を探す必要がありそうです。テスト用のWebページを作っているので、iPhoneをお持ちの方は追試していただけないでしょうか? Webプログラム初心者なので、何か間違っていることがあれば指摘してください。スマートな解決法があれば、とっても有り難いです。

iphone-yui-slider.jpg

以上はUS特派員によるテスト結果で、私のiPhoneはペーパークラフトですからね!ってのは、もういいですよね。しかし、私の知り合いには初日からiPhoneを使いまくっている人が多くて、本当いいよね〜って感じです。この体験が1日遅れても大したことないですけど、1年遅れると致命傷なんじゃないかな。