RemoteKey

RemoteKey
カテゴリ/ユーティリティ
\230
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=301472359&mt=8

技術的に興味があったので購入してみました。無線 LAN 環境が必要です。(Mac に AirMac カードが内蔵されていれば、利用できます。設定方法は、下の URL の右下 ‘外出先での接続方法’ を参考にしてください。)

RemoteKey
http://hmdt.jp/remotekey/index-jp.html

iPod touch 上で RemoteKey を動作させた後、上の URL から ダウンロードし、Mac 上にインストールした RemoteKey Connect を起動します。
Devices (私の場合は iPod touch) を選んで Connect ボタンを押します。これで Mac の RemoteKey Connect で入力した文字が iPod touch の Remotekey に表示されます。
RemoteKey Connect で Mail ボタンを押せば iPod touch 上のメールが起動し、入力した文字列が本文として入力されています。RemoteKey Connect を終了するには、メニューバーの右端のアイコンからメニュー ‘Quit RemoteKey Connect’ を選択してください。

動作原理を調べてみました。間違っている記述もあると思いますが、メモとして残しておきます。

RemoteKey は Bonjour を利用して Mac と iPhone または iPod touch 間で動作します。
サンプルコード WiTap が参考になりそうです。(ソースを覗いてみましたが、私には理解するのに苦労しそうです。) WiTap は Bonjour を利用して2台の iPhone で 動作します。もちろん iPhoneiPod touch でも動作します。

WiTap
http://developer.apple.com/iphone/library/samplecode/WiTap/index.html
(iPhone Dev Center に登録していないと閲覧できません。)

私自身、iPod touch 1台しか所有していないので、WiTap を iPod touch 32GB、iPhone Simulator.app にそれぞれインストールして、両方の WiTap を実行し動作確認しました。WiTap は、カラーパッドをタップすると、もう一方の端末の WiTap のカラーパッドが点滅します。

iPod touch 上の ‘メール’、’マップ’ を起動するには NSURL、NSApplication を利用します。
‘メール’ を起動する例です。

	UIApplication *application;
NSURL *url;
url = [NSURL URLWithString:@"mailto:foo@me.com"];
application = [UIApplication sharedApplication];
[application openURL:url];

また、自分が作成したアプリケーションに Custom URL Schemes を登録して、他のアプリから起動させることもできます。動作確認には iPod touchiPhone Simulator.app 上の Safari の URL に Custom URL Schemes を含んだ URL を入力して試すと良いようです。下の例では URL は “xyzlist://Sample.koyama.jp/?test#20090221” です。

-- 起動されるアプリケーションの Info.plist (今回の例ではアプリケーション名 Sample) --
▼ Information Property List
▼ URL types
▼ Item 1                    : jp.koyama.Sample
URL identifier
▼ URL Schemes
Item 1               : xyzlist
//アプリケーション Sample を起動させるソースコード
UIApplication *application;
NSURL *url;
url = [NSURL URLWithString:@"xyzlist://Sample.koyama.jp/?test#20090221"];
application = [UIApplication sharedApplication];
[application openURL:url];

下記の URL が参考になります。(ただし、以降に出てくる Apple の URL は iPhone Dev Center に登録していないと閲覧できません。)

iPhone Application Programming Guide: Customizing Your Application’s Behavior
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ApplicationEnvironment/chapter_3_section_6.html#//apple_ref/doc/uid/TP40007072-CH7-SW22
The Core Application
Customizing Your Application’s Behavior
Communicating with Other Applications

The iPhone Developer's Cookbook: Building Applications with the iPhone SDK (Developer's Library)
Erica Sadun
10 Connecting to Services
Recipe: Subscribing Application to Custom URL Schemes
P303

上の本も参考にした方が理解しやすいと思います。また、’The iPhone Developer’s Cookbook’ [ asin:0321555457 ] は、

日本語に翻訳された本 ‘iPhone デベロッパーズ クックブック’ [ asin:4797352418 ] が発売されています。

他のアプリケーションから起動されたアプリケーションは

UIApplicationDelegate Protocol Reference
http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html
Opening a URL Resource
- application:handleOpenURL:  optional method  

が呼び出され、起動します。

//   アプリケーション Sample の UIApplicationDelegate
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
//   url = @"xyzlist://Sample.koyama.jp/?test#20090221"
NSString *taskName = [url query];
NSString *dateString = [url fragment];
NSLog(@"%@ %@", taskName, dateString);
}

起動されるアプリケーション (上の例では Sample) の UIApplicationDelegate に上のソースを追加し、iPhone Simulator.app の Safari で URL “xyzlist://Sample.koyama.jp/?test#20090221” で起動させると、/アプリケーション/ユーティリティ/コンソール.app の ‘ログ・データベース・クエリー/コンソールメッセージ’ で下のメッセージを見つけることができます。

09/02/21 18:49:35 Sample[3392] test 20090221

また URL を利用して渡される値は下記の URL を参考にしてください。’メール’、’マップ’ を起動する時に渡すパラメーターが、Mail、Phone、Text、 Map、YouTubeiTunes Links としてそれぞれ説明してあります。

Apple URL Scheme Reference: Introduction
https://developer.apple.com/iphone/library/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007891
NSURL Class Reference
https://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/doc/uid/20000301-4355
RFC 1808 - Relative Uniform Resource Locators
http://tools.ietf.org/html/rfc1808

'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 を継承する独自の部品を作成するのに参考になりそうです。

iPhone Developer Program Standard

iPhone プログラミングに挑戦していたのですが、iPod touch も購入したことだし iPhone シュミレータ上ではなく、実機で試してみたくなりました。

iPhone 用の自作アプリを実機 (iPod touch) で動作させるには iPhone Developer Program を購入する必要があります。

iPhone Developer Program
http://developer.apple.com/iphone/program/

ネットなどでいろいろ情報が出ていますが、一番肝になるのは iPhone Dev Center にログインすると First Name、Last Name が ?? ?? と表示されていることです。住所などの情報が日本語だと後々トラブルの元になるようです。(ネットなどの情報によると App Store にアプリを申請すると Pending Contract と表示され、アプリが公開されない状態が続くことがあるようです。)

アプリの Pending Contract 問題についてはわかりませんが、iPhone Dev Center のログイン名については、結論から言うとアップルに直接メールを送り、修正してもらう必要はありません。

iPhone Developer Program Standard 購入手続きの途中で請求書住所が表示された時に Update Now リンクをクリックして氏名、住所を英語表記に変更することができます。(また規約に同意して途中でキャンセルすると最初からやり直しできないので注意してください。iPhone Developer Program を購入できなくなります。)

購入手続きの顛末を書いておこうと思います。ただし、私の経験で書いているので、間違いがあるかもしれません。自己責任でお願いします。

私の場合、なるべくトラブルに巻き込まれたくなかったので、念のため MobileMe にログインし、アカウント/個人情報/通知の ‘Apple ID を管理’ のリンクから Apple ID の情報を言語が日本語のままログインして、姓: ローマ字、名:ローマ字、住所:ローマ字など英語表記 に変更しました。(これはあまり意味がなかったかもしれません。)

その後、iPhone Developer Program Standard を購入しました。購入過程で個人を選択、規約に同意すると請求住所が表示されます。文字化けした氏名 ??、住所が表示されますが、ここで Update Now をクリックして英語表記に修正しました。

後は日本のアップルストアを選択するとカートに iPhone Developer Program Standard が入っているので購入しました。(請求書住所の都道府県、フリガナは日本語に変更しました。)

数日後 Activation Code の通知メールが届いたので、Activation code link をクリックして activate しようとしたのですが、失敗します。

どうしようもないので Activation Code の通知メールにある contact us をクリックして、 activate できない旨を英語で文章を書き、エラーメッセージを付けて送信しました。

翌日、返事が日本語で届きました。Apple Store 購入時のお届け先情報が日本語だったのが問題だったようです。『Apple Store ご注文内容の確認』のメールを転送して欲しいと言われたので、メールにコピーして送りました。

その後、お客様のアカウント情報を調整したので、 Activation Code 通知メール本文のリンク部をクリックして認証手続きをおこなって欲しいというメールが届きました。

今度は Activation code link をクリックして activate に成功しました。

早速、iPhone Dev Center にログインし、右上の iPhone Developer Program – Program Portal から Standard Program Portal User Guide for iPhone OS 2.1 (現在は Standard Program Portal User Guide for iPhone OS 2.2) をダウンロードして、自作アプリを iPod Touch にインストールしました。

私が設定した時は、Xcode ウインドウ左上のポップアップメニューを ‘Device – 2.2 | Debug’ を選択しないとコード署名IDが選択可能状態になりませんでした。

実際に実機で動作させると格別ですね。開発している自作アプリは2つあります。RSS リーダーとマインスイーパーです。

RSS リーダーは気に入ったものがなかったので、自作してみました。残念ですが、動作はあまり安定していません。

私が欲しかった RSS リーダーは Web 上のサービスを使うものではなく、RSS フィードの新着タイトルをクリックするとすぐにリンク先が表示され、指定された期間が過ぎると削除される単純なものです。

最後に実行画面を付けておきます。

おまけ。

以前から、’どうぶつの森‘ を一度は遊んでみたいと思っていたので、’街へいこうよ どうぶつの森(「Wii スピーク」同梱)’ を

購入してみました。

後、iTunes StoreApp Store から

Rogue
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=298113808&mt=8
カテゴリー/ゲーム
無料
大辞林
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=299029654&mt=8
カテゴリ/レファレンス
\2500

をダウンロードしてみました。大辞林は技術力の高さに感服しました。

Rogue は懐かしいですね。英語は苦手ですが、私の iPod touch には ウィズダム英和・和英辞典、i英辞郎などの辞書ソフトも入っているので問題ありません。’街へいこうよ どうぶつの森‘ で遊ぶつもりが、途中で中断しても再開できるので Rogue ばかりプレーしています。