読者です 読者をやめる 読者になる 読者になる

KOYAMA Yoshiaki のブログ

プログラミングについての試行錯誤をつらつら書き溜めていきます。

'The iPhone Developer's Cookbook' & 'iPhone SDKプログラミング大全' & 'ニンテンドーDSi'

正月に読むつもりで amazon.co.jp から 'The iPhone Developer's Cookbook'

と手に入れるのが簡単になった 'ニンテンドーDSi ブラック'を購入しました。
また、'iPhone SDKプログラミング大全'

も予約しておきました。'The iPhone Developer's Cookbook'、'ニンテンドーDSi ブラック' は正月前に、'iPhone SDKプログラミング大全' は 2009/01/07(Wed) に届きました。


'The iPhone Developer's Cookbook'、'iPhone SDKプログラミング大全' に触れる前に、私自身驚いた 'ニンテンドーDSi' について一言書きたいと思います。


まず、'ニンテンドーDSi' が今までの携帯ゲーム機に比べて何が違うかというと内蔵メモリに 'DSiウェア'と呼ばれるソフトウェアを入れることができます。'DSiウェア' は 'ニンテンドーDSiショップ' という名前の内蔵ソフト( 'DSiウェア'と違いはないと思います) を使って購入できます。

また 'ニンテンドーDSi' にはカメラが2つ付いているのですが、それを利用した 'DSiウェア' の 'うつすメイドインワリオ' や内蔵ソフト 'ニンテンドー DSi カメラ' などは iPhone でよく見かけるアプリと同じテーストです。

特に技術的に可能なら 'ニンテンドー DSi カメラ' や 'うごくメモちょう' などは iPhone にも欲しいソフトだと思います。

さらに、'ニンテンドーDSiブラウザー' と呼ばれる Opera 製のウェブブラウザーもあります。さすがにフォントも汚いし、動作速度も遅いので iPhoneSafari には劣ります。


しかし、これはもう iPhone というか iPod touch の機能を下げた下位機種といっていいほど同じ土壌の製品だと思います。いずれ 'ニンテンドーDSi' の後継機が出れば GPS や 加速度センサーが付いてくる可能性すらあります。

内蔵メモリが増えてくれば iPod touch との差も埋まってくると思います。
違いはその時の最新の技術を使うか、枯れた技術を使うかの差だと思います。携帯電話もあるし今後どういう風に進化するか1ユーザーとして大変楽しみです。


'ニンテンドーDSi' で音楽を聴くには SD カードを利用します。対応しているフォーマットは AAC です。
iTunes Store で買った曲には著作権フリーなものもあります。
iTunes を起動して、曲を表示しているテーブルのヘッダを右クリックしてメニューを出し、種類にチェックを入れてください。'種類' ヘッダをクリックするとソートされます。AAC の種類は

購入した AAC オーディオファイル
保護された AAC オーディオファイル

の二通りあると思います。'購入した AAC オーディオファイル' が著作権フリーの曲です。


曲を選んで右クリックしてメニューを出し、'Finder で表示' を選択してください。ファイルが表示されます。SDカードに適当なフォルダ (私の場合 Music) を作って、SDカードにコピーしました。

私が iTunes Store で購入した曲で著作権フリーなものは20曲ほどありました。ニンテンドーDSi で何の問題もなく聞くことができました。


'ニンテンドーDSi' 用に '漢字そのまま DS楽引辞典'

を購入しました。iPod touch と同じような使い方になってしまいそうです。


'ニンテンドーDSi' で '漢字そのまま DS楽引辞典' を利用して思ったのですが、タッチペンを使ったボタンなどのデザインが垢抜けていないし、インターフェイスが定まっていない気がします。iPhone のような GUIフレームワークを持っていれば面白いのですが!


'ニンテンドーDSi' の話はここまでにして、'The iPhone Developer's Cookbook' と 'iPhone SDKプログラミング大全' を読み終えたので感想を書きたいと思います。


'iPhone SDKプログラミング大全' は2,3日で読めました。入門用だと思います。基礎を固めるのにちょうど良いと思います。ただし、'The iPhone Developer's Cookbook' では触れられていない OpenGL についての簡単な説明があります。また、アニメーションの解説は大変勉強になりました。


'The iPhone Developer's Cookbook' は、実際に自作アプリを作成するのに必要な機能をサンプルコードを交えて説明されているので大変参考になります。

The iPhone Developer's Cookbook
目次
Chapter 1: Getting Started with the iPhone SDK
Chapter 2: Views
Chapter 3: View Controllers
Chapter 4: Alerting Users
Chapter 5: Basic Tables
Chapter 6: Advanced Tables
Chapter 7: Media
Chapter 8: Control
Chapter 9: People, Places, and Things
Chapter 10: Connecting to Services
Chapter 11: One More Thing: Programming Cover Flow


Chapter 2: Views - P53 で使われている円の内側か判定する関数 (下記 pointInside: ) などはプログラムリストより円の不等式で表した方が簡単です。

Chapter 2 Views
P53
サンプル
04a - Clipped Views

#define SIDELENGTH 57

// Detect whether the touch "hits" the view
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{
	CGPoint pt;
	float HALFSIDE = SIDELENGTH / 2.0f;

	// normalize with centered origin
	pt.x = (point.x - HALFSIDE) / HALFSIDE;
	pt.y = (point.y - HALFSIDE) / HALFSIDE;
	
	// x^2 + y^2 = radius
	float xsquared = pt.x * pt.x;
	float ysquared = pt.y * pt.y;
	
	// If the radius < 1, the point is within the clipped circle
	if ((xsquared + ysquared) < 1.0) return YES;
	return NO;
}

円の不等式
(x - x0)^2 + (y - y0)^2  < r^2

中心 x0, y0
半径 r

より、上のプログラムを円の不等式に書き換えると

(point.x - HALFSIDE) ^2 + (point.y - HALFSIDE)^2 < HALFSIDE^2

両辺を HALFSIDE^2 で割ると

(point.x - HALFSIDE)^2 / HALFSIDE^2 + (point.y - HALFSIDE)^2 / HALFSIDE^2 < 1

((point.x - HALFSIDE) / HALFSIDE)^2 + ((point.y - HALFSIDE) / HALFSIDE)^2 < 1

を満たす時、点 (point.x, point.y) は円の内側にある。


また、本のプログラムリストと

http://www.ericasadun.com

でダウンロードしたサンプルと違う箇所が結構ありました。P125の Recipe 4-8 などが典型的な例です。

また、非公開だけど便利な API がたくさん紹介されています。


説明されれば納得できるのですが

Chapter 8 Controls
P238
Recipe: Animation Button Response

サンプルコード
C08 - Controls
03a - AnimButtonFlip

の通り、UIButton ( UIControl ) が UIView を継承しているので Animation を利用できるんですね。驚きました!


P240 の Expoloring UIControl View Hierarchy では

Chapter 8 Controls
P240
サンプル
04b - Explode

/*
 UISwitch:UIControl
 --_UISwitchSlider:UISlider
 ----UIImageView:UIView
 ----UIImageView:UIView
 ----UIView:UIResponder
 ------UILabel:UIView
 ------UILabel:UIView
 ----UIImageView:UIView
*/ 

#define outstring(anObject) [[anObject description] UTF8String]

- (void) explode: (id) aView level: (int) aLevel
{
	for (int i = 0;  i < aLevel; i++) printf("--", aLevel);
	printf("%s:%s\n", outstring([aView class]), outstring([aView superclass]));
	for (UIView *subview in [aView subviews])
		[self explode:subview level:(aLevel + 1)];
}

UISwitch がどんな構造になっているか調べることができます。

当たり前かもしれませんが UILabel や UIImageView を利用して作られているんですね!UIControl を継承する独自の部品を作成するのに参考になりそうです。