6月2008

iPhone SDKの話題を書きたいなー

iPhones SDKの内容は、今のところその辺で話をしてはいけないことになっているので、当然このブログでも書きませんが、iPhone Programming Guideを見ていると、つい話たくなってしまうことがたくさんあります。特に、Appleの携帯デバイスのあり方についての考え方が伝わってくる部分を読むと、iPhoneがなぜこれほどまでに熱いのか、その理由がわかる気がします。後々、iPhone SDKがパブリックになったときにブログに書こうと思っています。

ところで、SDKの話をしてはいけないのは、まだbeta版だからという理由だと思っています。私は最近ドキュメントを読み始めたので、特にAPIの変更とかで困ったことは無いのですが、どうやら最初のbeta版のSDKから今までの間に、結構なAPIの変更があったらしいです。もし、最初のbeta版の解説とかをWEB上で流してしまったら、情報が錯綜してしまいますからね。

さて、最近この本が気になってしょうがないです。パソコンの本かつ600ページくらいのボリュームの割に、値段が4000円くらいと、パソコンの本にしては安いなと思ったりしています。

4873113636 ビューティフルコード
Andy Oram Greg Wilson 久野 禎子
オライリージャパン 2008-04-23

by G-Tools

iChatの画面共有

この前の土曜日、友達がノートパソコンを買いたいらしく、私に何かオススメのノートパソコンはないかと、メールで相談してきました。彼の家には1台のデスクトップPCがあるようですが、彼はプログラミングを含めたコンピュータについての勉強を本格的にするようなので、自分のノートパソコンが欲しいとのことでした。とりあえず、私はコストパフォーマンスの高いMacBookを勧めてみました。念のため、Macにするにあたって唯一問題になるであろう、ゲームはやるのかどうかを聞いたところ、特にゲームについてはよい、という返事があったので、Windows PCの方がいいよ、とは言いませんでした。

その翌日の日曜日の夕方、「ユーザー登録で入力切り替えができない」というメールが届き、まさかMacBookを買ってしまったのかと聞いたところ、MacBook白のハイスペックな方を買ったということがわかりました。こんなに早く買うとは思っていなかったので、もう少しゲーム以外の注意もしておきたかったのですが、いまさらWindowsの方がいいよといっても遅いので、Macの基本操作などをiChatの画面共有機能を使って教えてあげようと思いました。

彼は今までそれほどパソコンを使っていなかったので、当然iChatのようなメッセンジャーアプリケーションを知りませんでした。そこで、どうにかメールで指示して、.MacアカウントとiChatの設定をしてもらい、やっとiChatでの通信ができるようになりました。ちなみに、最初に届いたメールの「入力切り替えができない」というのは、「かな」キーを押しても切り替えができなかったらしく、結局原因不明のままでした。

そこからは画面共有と音声チャット、もちろんマイクは標準搭載なので、特に設定せずに音声チャットはスムーズにスタートできました。それで、この画面共有が思っていたよりも便利で、回線が安定していれば遠隔操作で、普通に向こうのMacを操作できるのではないかと思ってしまうほどでした。この音声チャットと画面共有を使いながら、2時間くらいだらだらと基本操作の説明と、入れておいた方がよいアプリケーションやプラグインをインストールしました。途中、ニコニコ動画に入って動画を再生してみたところ、少し動画のコマ落ちはしますが、音声も流れ、画面共有越しに二人でみれるようだったので、これはこれで面白いなと思ったりしました。向こうの回線がADSLでなく光だったら、もう少し画面共有のパフォーマンスが上がっていたのではないかと思います。

とまあ、こんな感じで、今ならどのMacを購入してもカメラとマイクは付いているので、必要に応じてiChatを使うといいでしょう。普通は周りにあわせてMicrosoft Messengerとか、面倒なのでAdiumを使っている人が多いと思うので、こんな便利な機能もあるということを、頭の片隅にでもおいておくとよいかもしれません。

ところで、この記事で最も重要になるかもしれないことを言います。

.Macのフリートライアル期間が過ぎても、そのアカウントでiChatはできるようです。

iPhoneはただのテンキー式キーボードではない

これって書いても大丈夫だろうか…写真まで公開されてるんだし大丈夫ですよね。

噂通り、iPhone 2.0には新しい日本語キーボードが搭載されるようですが、写真で見る限りは、携帯電話と同じ単なるテンキー式のキーボードに見えます。

この記事の下の方の写真でキーボードが見れます。
HSDPA対応の「iPhone 3G」、7月11日発売

しかし、実際は一般の携帯電話の入力方法とは異なります。例えば「あ」の部分に触れていると、上下左右に「い」「う」「え」「お」が表示されるのです。そして、その任意の文字に指をスライドさせて離すと文字を入力することができます。

この入力方法ならば、キーボードも大きいので打ち間違いも少なく、さらに打つ回数も激減するので、なかなか優れたキーボードを用意してきたな、と思います。ソフトウェアキーボードだからこそ実現できる入力方法ですね。

っていうか、結構このキーボード凄いんじゃないでしょうか。実際に触ってみたいですね。

Appleのドキュメントは充実している

もちろん、日本でiPhoneが発売するとなれば、私がiPhone SDKに興味を持たないはずがありません。というわけで、ここ数日iPhone Programming Guideを読んだり、iPhone Application Tutorialを実践したりしています。

やはりAppleのドキュメントの多さには驚きますね。この前、ちょっとDirect Xのプログラミングをやろうと思ったのですが、結局MSDNだけじゃ初期化の流れがわからず、しょうがなく本を借りました。

Appleのドキュメントは、基本的なプログラミングができることを前提書かれていることが多いですが、逆に言うと、Macのことを知らなくても、プログラミングさえわかっていれば、容易に学習できることを意味します。iPhoneをきっかけに、Cocoaプログラマが増えるかもしれませんね。

8GB $199ですか

ついでに言うと16GBは$299…手が届く価格だ。安い。

日本では何円になるだろうか…7/11に発売らしい
http://store.apple.com/jp/browse/home/shop_iphone/family/iphone?mco=MTE2NTQ

Interface Builderで作るパネル

今回はCocoa初心者向けのTipsとして、Interface Builderで簡単にパネルを作ってみようと思います。ちなみに、これを応用してNSUserDefaultsにパネルに置いた各種コントロールをバインディングしていけば、それだけで環境設定パネルの出来上がりです。

適当にアプリケーションを作成し、Interface Builderを開きます。まず、ライブラリからパネルを適当な場所へドラッグしましょう。パネルが作成されます。

次に、作成されたパネルのAttributesを変更します。パネルのAttributesを開くには、nib上の作成されたパネルを選択し、メニューからTools-Attributes Inspectorを選択します。変更するAttributesで最も重要な項目は、Release When Closedです。これはパネルを閉じたときに、パネルを解放(破棄)するかどうかを決める項目で、ここのチェックを外すことで、パネルを閉じても、パネルをまた開けるようになります。あとは、Visible At Launchの項目もチェックを外しましょう。これは起動したときに、パネルを表示するかどうかの設定です。必要に応じて、ResizeやMinimizeのチェックも外すと良いでしょう。

attributes

これでパネルの設定は完了です。あとは、パネルを表示するアクションを作るわけですが、これは既にパネルに実装されているmakeKeyAndOrderFrontやorderFontアクションを使えば良いので、これにボタンやメニューからアクション接続してやれば終わりです。

とりあえずPreferencesとアクション接続してみます
connection

makeKeyAndOrderFrontかorderFrontを選びましょう。
orderfront

これでパネルを作成できたはずです。ビルドして実行してみましょう。

build

あとで環境設定パネルの作り方も記事にしたいと思いますが、そのときはCocoaらしくパネルのnibを独立させて作るようにしようと思います。

WWDC前にiPhoneについてまとめてみる

まさかのWWDC前の不意打ちで、SoftBankがiPhoneを年内に発売する契約をAppleとしたことを発表したようです。

「iPhone」について | ソフトバンクモバイル株式会社

というわけで、ついでに今思いつく限りのiPhoneについての情報をまとめてみます。

快適なWEBブラウズ

iPhoneで最も嬉しいのは、おそらくSafariでのWEBブラウズでしょう。スクロールがスムーズで、ダブルタップで最適な大きさにビューを拡大してくれる機能が特にすばらしいです。携帯端末の中では、最もPCサイトのWEBブラウズが快適にできる端末だと思います。

インストール不要のWEBアプリ

iPhoneが発表されたとき、デベロッパに用意された開発環境はWEBアプリケーションだけで、多くのデベロッパが失望しました。しかし、今では結構な数のWEBアプリがリリースされているようで、iPhone向けに最も手軽に開発できる環境としての魅力があります。

Apple – Web apps

ちなみに、日本でもアプリケーションを開発している方はいますが、Jane touchという2chブラウザがなかなかよくできています。実際にiPod touchなどで閲覧するとわかりますが、WEBアプリケーションを感じさせないデザインに仕上がっています。WEBアプリケーションでも十分に開発の余地があることを教えてくれます。

Jane touch

ソフトウェアキーボードによる文字入力

気になる文字入力ですが、今のところ画面上に出てくるQWERTY配列のキーボードで、PCと同じように入力する方法が用意されています。日本語キーボードは、予測変換で対応しています。下のリンク先の記事の下の方に、文字入力について詳しく書かれています。

アイデア満載のキーボードとsafariの機能性に驚く・「iPod touch」レビュー(後編)

実際に使っている人の話では、やはりこの入力スピードには限界があり、日本の携帯電話の方が早く打てるという話を聞きます。ちなみに、iPhone OS 2.0では、携帯電話と同じ入力方式に対応するという噂があります。

Phone・iPod touch の次期ファームウェア、携帯ライクな文字入力対応へ

期待されるネイティブアプリケーション

Appleは発売当初とは一変して、ネイティブアプリケーションの開発環境であるiPhone SDKを発表しています。Beta版が今年の2月からリリースされており、ADCから入手することができます。現在はBeta6までバージョンアップしましたが、おそらく今月9日のWWDC後に正式版がリリースされることでしょう。

iPhoneアプリケーションの開発はCocoa touchフレームワークで行います。これはMac上のCocoa=Foundation+AppKitに対し、Cocoa touch=Foundation+UIKitという構成になっています。これは、アプリケーションのインターフェース部以外の部分は、Cocoaアプリケーションと全く同じものを使って開発できることを意味します。具体的には、Foundationが提供している、NSString,NSArray,NSDictionaryなどの基本データ構造から、ファイルの入出力やネットワークまで同じフレームワークを使用することができるのです。

少々残念な点は、正式なiPhoneデベロッパになるためには年間99ドルのStandard Programを購入しなければならないことです。おそらく、これがないと、iPhone実機にアプリケーションをインストールすることはできないでしょう。

Apple Developer Connection

ADCを見てもらえばわかりますが、iPhoneの開発環境は非常に充実していると思います。XcodeやInterface Builderの対応も含め、Mac上でアプリケーションの動作をデバッグできるiPhone Simulator、リファレンスやガイドも既に書かれており、すぐにアプリケーションの開発を始めることができるでしょう。これだけしっかりとした環境が用意されていると、今後たくさんのアプリケーションが開発されることを十分に期待できるでしょう。

vector配列(←なぜかコピーされる)

Objective-Cに慣れすぎてしまったせいで、すっかりC++/ActiveBasic風のオブジェクトのインスタンス化についての感覚がどこかへ消えてしまったようです。

NSObject *object = [[NSObject alloc] init];
//何か処理
[object release];

Objective-Cでは、このような方法でしかオブジェクトのインスタンス化を行うことができません。C++のnew/deleteでインスタンスを作る方法と一緒です。

しかしC++などでは、こちらの方法でインスタンス化をすることでしょう。ただ単に、クラス名を型に持ってきて、変数を宣言する方法です。

MyObject object;

それで、このタイプのインスタンスであると、関数に値を渡すときに、引数に新しくオブジェクトが作成されるわけです。作成といってもコピーですが。

例えばこんなクラスを定義して調べてみます。コピーコンストラクタが呼ばれたときに、カウントを1増やすオブジェクトです。

#include <iostream>

class Object {
public:
	int count;

	Object()
	{
		count = 0;
		std::cout << "construct object " << count << std::endl;
	}

	~Object()
	{
		std::cout << "destroy object " << count << std::endl;
	}

	Object(const Object& object)
	{
		count = object.count+1;
		std::cout << "copy construct " << count << std::endl;
	}

	void print()
	{
		std::cout <<"print " << count << std::endl;
	}
};

このクラスを使い、適当に関数を作って実行してみます。

void fx(Object anObject)
{
	anObject.print();
}

int main(int argc, char *argv[])
{
	Object object;
	fx(object);
	return 0;
}

実行結果:

construct object 0
copy construct 1
print 1
destruct object 1
destruct object 0

当然ですね。引数に値コピーするので、コピーコンストラクタが1回呼ばれます。引数を参照型にすれば、コピーされることはありません。

さて、ここまでは前置きです。ここでSTLのlist配列に入れて検証してみましょう。

int main(int argc, char *argv[])
{
	using namespace std;

	Object object;
	list<Object> array;

	for ( int i = 0; i < = 8; i++ ) {
		array.push_back(object);
	}

	for ( list<Object>::iterator it = array.begin(); it != array.end(); ++it ) {
		(*it).print();
	}
	return 0;
}

実行結果:

construct object 0
copy construct 1
copy construct 1
copy construct 1
copy construct 1
copy construct 1
copy construct 1
copy construct 1
copy construct 1
copy construct 1
print 1
print 1
print 1
print 1
print 1
print 1
print 1
print 1
print 1
destruct object 1
destruct object 1
destruct object 1
destruct object 1
destruct object 1
destruct object 1
destruct object 1
destruct object 1
destruct object 1
destruct object 0

これは期待通りの動作です。list配列に入れるときにオブジェクトをコピーするのは納得です。もしここで実態が同じオブジェクトを配列に入れてしまうと、簡単にバグを引き起こしかねません。

ところで、これと同じことを今度はvector配列でやってみます。

int main(int argc, char *argv[])
{
	using namespace std;

	Object object;
	vector<:Object> array;

	for ( int i = 0; i < = 8; i++ ) {
		array.push_back(object);
	}

	for ( vector<Object>::iterator it = array.begin(); it != array.end(); ++it ) {
		(*it).print();
	}

実行結果:

construct object 0
copy construct 1
copy construct 2
copy construct 1
destruct object 1
copy construct 3
copy construct 2
copy construct 1
destruct object 2
destruct object 1
copy construct 1
copy construct 4
copy construct 3
copy construct 2
copy construct 2
copy construct 1
destruct object 3
destruct object 2
destruct object 1
destruct object 1
copy construct 1
copy construct 1
copy construct 1
copy construct 5
copy construct 4
copy construct 3
copy construct 3
copy construct 2
copy construct 2
copy construct 2
copy construct 2
copy construct 1
destruct object 4
destruct object 3
destruct object 2
destruct object 2
destruct object 1
destruct object 1
destruct object 1
destruct object 1
print 5
print 4
print 3
print 3
print 2
print 2
print 2
print 2
print 1
destruct object 5
destruct object 4
destruct object 3
destruct object 3
destruct object 2
destruct object 2
destruct object 2
destruct object 2
destruct object 1
destruct object 0

listとは大きく違い、多くのコピーが発生しています。なぜこのようなコピーが発生するのかといえば、おそらくvector内部で再度メモリ確保を行ってオブジェクトを移動する際、すべてコピーされていると推測することができます。

このような動作をするから何か問題があるというわけではありませんが、vector配列でコピーが起こす意図が分かりません。おそらく、コピーを発生させないようにもvector配列は実装できると思うのですが…