HMDT - Logic and Intuition -

about HMDT

HMDT Journal

September, 2007

Sep 28

iPod touchの出荷予定日が、いま確認しに行ったら、何のアナウンスもなく一週間ずらされてた。お届け予定日は10月16日って、半月以上も先かい。

相変わらず傲慢っぷりを見せつけてくれる会社だ。

、、、って書いたのが朝の7時で、12時にAppleからメールが届いた。「予定通り工場を出荷しました。出荷予定日/お届け予定日が長めに表示されてるのは、システムの誤表示です。」

そうなのかい!?いや、ものが届くまで、どっちも信じないでおこう。

Sep 26

今日はテーブル表示。テーブル表示には、UITableクラスを使う。これも、NSTableViewとよく似ている。

まず、テーブルカラムを作る。UITableColumnクラス。そして、それをUITableに追加してやる。テーブルに行を表示するには?もちろん、データソースを使う。

    UITableColumn*  tableColumn;
    tableColumn = [[UITableColumn alloc] initWithTitle:@"title"
            identifier:@"title" width:320];
    
    UITable*    table;
    table = [[UITable alloc] initWithFrame:CGRectMake(0, 48, 320, 432)];
    [table addTableColumn:tableColumn];
    [table setDataSource:self];
    [table setDelegate:self];
    [table setSeparatorStyle:1];
    [table reloadData];

インスタンス化して、テーブルカラム設定して、データソース設定して、デリゲート設定して、reloadData。NSTableViewの流れと、まんま同じだね。

必須データテーブルメソッドも2つ。行の数を返すものと、それぞれの行と列のセルを返すもの。そう。UIKitでもセルを使う。メソッドの名前は、numberOfRowsInTable:と、table:cellForRow:column:。

- (int)numberOfRowsInTable:(UITable*)table
{
    return 10;
}

- (UITableCell*)table:(UITable*)table cellForRow:(int)row column:(int)col
{
    UIImageAndTextTableCell*    cell;
    cell = [[UIImageAndTextTableCell alloc] init];
    [cell setTitle:[NSString stringWithFormat:@"row %d", row]];
    [cell setDisclosureStyle:2];
    [cell setShowDisclosure:YES];
    
    return cell; 
}

行数は、とりあえずここでは10に固定。セルは、UIImageAndTextTableCellというものを使っている。これは、画像とテキストを表示してくれるセル。まぁ、便利。Cocoaにも欲しいわぁ。

実行画面はこんな感じ。

テーブルの表示スタイルは、いくらか変えることができる。まず、右端の三角マーク。これはディスクロージャと呼ぶらしい。このスタイルは、UITableCellのsetDisclosureStyle:で設定する。さきほどのシンプルなものはスタイル2。それに加えて、青丸に白地のものもある。こっちはスタイル1。

style 1

テーブルのセパレータも変更できる。さっきのは1ピクセルだけで、もう少し太くしてみたり。

style 2

無しにしてみたり。

style 0

これらはUITableのsetSeparatorStyle:で設定する。

Sep 24

ナビゲーションバー上のボタンクリックは、デリゲートで受け取る。UINavigationBarに、setDelegate:してやる。呼び出されるのは、次のメソッド。

- (void)navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button;

第二引数のbuttonで、左右どちらのボタンがクリックされたかを検出する。どうも、右が0で左が1みたい。少し注意。

iPod touch来ねぇ。発表の翌日に注文したのに。刻印サービスを付けてしまったのが失敗だったか。

Sep 22

iPhoneにはメニューがない。その代わりに、操作の基本となるのがナビゲーションバーだ。画面の上下に表示して、ボタンを提供する。

ナビゲーションバーは、UINabigationBarクラスで作る。これはUIViewのサブクラス。こんな感じで作る。

    UINavigationBar*    navigationBar;
    navigationBar = [[UINavigationBar alloc] initWithFrame:
            CGRectMake(0, 0, 320, 480)];
    [navigationBar showButtonsWithLeftTitle:@"Hello" 
            rightTitle:@"iPhone" leftBack:YES];
    [navigationBar setBarStyle:0];

初期化は、initWithFrame:。ボタンを追加するには、showButtonsWithLeftTitle:rightTitle:leftBack:というメソッドを使う。これから分かるように、左と右の、2つのボタンを配置するのが基本。3つめのleftBackにYESを指定すると、左側のボタンが戻るボタン、つまり左端が三角形になる。

実行するとこんな感じ。

ボタンの追加には、他にshowLeftButton:withStyle:rightButton:withStyle:ってメソッドもある。これを使うと、ボタンのスタイルを変更することができる。

ちょっと試してみた。styleを0から3まで変化されると、こんな感じ。

style 0

style 1

style 2

style 3

色や形が変わるね。

あと、ナビゲーションバーのスタイルも変更できる。たとえば、1にするとこんな感じ。

Sep 21

iPhoneアプリケーションでは、Cocoaを使う、っていうのは半分しか正解でなくて。Foundationは使う。でもAppKitは使えない。Mac OS Xとはユーザインタフェースが天と地ほども違うから、そりゃしょーがない。

その代わりに、新しいユーザインタフェースのためのフレームワークがある。UIKitだ。これを使う。

UIKitは、AppKitに似ている。AppKitを知っていれば、理解は早い。

UIKitアプリケーションを作るときは、まずUIApplicationクラスのサブクラスを作る。この辺、AppKitの使い方とはちょっと違う。

作成したUIApplicationのクラスは、main関数で、UIApplicationMain()に渡してやる。こんな風に。

int main(int argc, char** argv)
{
    NSAutoreleasePool* pool;
    pool = [[NSAutoreleasePool alloc] init];
    
    return UIApplicationMain(argc, argv, [HelloApplication class]);
}

UIApplicationには、applicationDidFinishLaunching:というメソッドがある。アプリケーション起動処理が終わるとこれが呼び出されるので、このメソッドを上書きして、自分のアプリケーションのための初期化処理を行う。初期化処理で行うのは、ウィンドウの作成とビューの準備。nibファイルは、ないらしい、たぶん。

ウィンドウは、UIWindowクラスになる。インスタンスを作成するには、allocして、initWithContentRect:というメソッドを呼ぶ。表示するには、orderFront:、makeKey:、_setHidden:を呼ぶ。おぉ、AppKitを知っている人ならば、説明不要だ。

ビューは、UIViewクラス。これもNSViewとほとんど同じ。UIViewにはサブクラスがたくさんある。たとえば、テキストの表示、編集を行うUITextViewってのがある。これを使って、Hello Worldをやってみよう。

- (void) applicationDidFinishLaunching:(id)unused
{
    // Get screen rect
    CGRect  screenRect;
    screenRect = [UIHardware fullScreenApplicationContentRect];
    
    // Create window
    UIWindow*   window;
    window = [[UIWindow alloc] initWithContentRect:screenRect];
    
    // Create text view
    CGRect  frame;
    frame.origin = CGPointZero;
    frame.size = screenRect.size;
    
    UITextView* textView;
    textView = [[UITextView alloc] initWithFrame:frame];
    [textView setText:@"Hello World"];
    
    // Set content view
    [window setContentView:textView];
    
    // Show window
    [window orderFront:self];
    [window makeKey:self];
    [window _setHidden:NO];
}

こんな感じ。ほとんど説明もいらないくらいだ。ちょっと気を付けるのは、NSRectではなCGRectを使っているところ。Geometry系はCoreGraphicsのものを使うらしい。

これを実行すると、こうなる。

うーむ。これだけだと、iPhoneで動いているかどうか、分からんな。ナビゲーションバーも付けてみよう。

おぉ、iPhoneらしくなった。

Sep 20

ビルドしたバイナリは、パッケージングする。これは、Mac OS Xとまったくいっしょ。.appフォルダを用意して、その中に実行ファイルとInfo.plistを入れておく。

そして、インストール。インストールはいろんな方法が発展中だけど、一番手っ取り早かったのはiFuntasticを使う。Applicationsフォルダにドラッグ・アンド・ドロップしてやれば、それでおしまいだ。

ただ、トップの画面に登録されないこともあるので、そういうときは、一回電源を落としてやればいい。

これで、完了。タップすれば、おぉ、動く。

しかし、楽しい。やばいくらいに楽しい。他の仕事が手につかなくなるくらい楽しい。あぁ、これはほんとにやばい。

何が楽しいって、あなた、ほんとにCocoaなんだよ。だから、勘で動かせる。ドキュメントもヘッダもないけど、Cocoaだったらこんな流儀だろ、っていう勘でソースコードが書ける。そして、それが動く。うぉー、たまらん。

リンクするライブラリが足りなくても減っちゃらさ。だって、Objective-Cだから。クラスの実装が見つからなくても、たぶんこんなクラスがあるだろうと予測をつけて、NSClassFromString()を使えばビルドは通る。そして、それが実際にある。素晴らしすぎるObjective-C!

こんな楽しい組み込み開発は初めてだ。いや、これ組み込みって呼ぶべきなのか?iPhone開発としか呼び様がねー。

Sep 19

正直、あんまり気は進まなかった。アンオフィシャルな情報に依存して進める事に意味があるんだろうか。あと数ヶ月もすれば、もしかすると事態は好転するかもしれないし。もうすでに乗り遅れている気もするし。

でも、あまりにも各所からの引き合いが多いので、手を染めざるを得ない状況になってしまった。技術者としての守るべき一線を、越えているのではないだろうか、と恐れながら。

嘘でーす!ほんとはノリノリでーす!目の前にこんな面白いおもちゃがあるんだから、しゃぶりつくさぬ訳があるまい。

まずは情報収集と、コンパイル環境整備。

情報は、とりあえず、ここ。The iPhone Dev Wiki。ここで行われているToolchain Project。ここが出発点だ。

新しいデバイスに対する開発を行う場合は、クロスコンパイル環境の整備から始まる。iPhoneはARMプロセッサなので、Intel上で動作するARMコンパイラが必要になる。あと、コンパイルしたオブジェクトファイルをリンクするために、ライブラリも必要だ。

iPhone用ARMプロセッサクロスコンパイラを作ろうというのが、Toolchain Projectだ。gccをはじめとした、必要なバイナリツールがそろっている。ソースコードがsubversionで公開されているので、ダウンロードしてコンパイルできる。でも、でかい!ダウンロードだけで1時間以上かかる。コンパイルもするとなると、うー、めんどくさ。

そんな人のために、コンパイル済みのバイナリも配布されている。たとえば、ここ。Easy iPhone Toolchain Installation。.dmgファイルをダウンロードすると、インストーラがある。それをインストールすれば、おしまい。

インストールすると、「heavenlyファイルが必要」って言われる。天国?これが、コンパイルしたオブジェクトをリンクするためのライブラリになる。名前の由来は、知らない。このリンクするためのライブラリってのは、平たく言っちゃえば、iPhoneのシステムファイルが必要になるってことだ。どうするかっていうと、いろんな入手方法があるらしい。とりあえず、「iPhone heavenly」で検索しよう。

これでコンパイル環境が出来上がる。試しに、Hello Worldをコンパイルしてみた。何遍かの試行錯誤のあげく、おぉ、通った。

続いてはインストール。は、また次回。

Sep 7

iPod touch買った。個人で使うものとしては、3台目になる。

やっぱり、タッチパネルでしょ。一度、iPhoneに触ってしまうと、もうあの感覚が忘れられない。あれが味わえるなら、それだけで買う。容量は、いまのiTunesライブラリが10G程度だから、気にならないし。

それよりも、iPod touchの一番のポイントはiTunes WiFi music storeだな。MacやPCを介さずにコンテンツを購入可能。この仕組みほど、PCを違法ファイルコピーマシンとしてしかとらえていない、コンテンツホルダーの心をくすぐるものはあるまい。

ここで予想をすると、WiFi music storeにしかコンテンツを提供しないコンテンツホルダーは絶対に出てくるね。さらに、iPodからMac上のiTunesのコピーだけど、これを行わせないコンテンツってのも絶対に出てくるね。そしてもちろん、お約束の裁判騒動も起こると。

あと、Apple TVもWiFi music storeに遠からず対応するでしょう。前に、Apple TVが出たときに、「Apple TVから直接iTunes Storeにつなげるようにしろ」って書いたけど、実現しそう。むしろ、動画の販売が始まってからは、Apple TVからの方が本流になる可能性が高い。

いつもダウンロード販売の話を書くと、コメントが充実するので先に言っておくと、ダウンロード販売はユーザ、メーカー、コンテンツホルダーの3者の視点から語ることができる。HMDTでは、メーカーまたはメーカーと一緒にするコンテンツホルダーの視点から考える事が多い。なんでかっていうと、HMDTは零細ながらもソフトウェアメーカーだから。自分の日々の仕事に絡めて考えているから。

back to top content

Copyright © 2002-2006 HMDT. All rights reserved.