DropTalk HD申請しました


HMDTでは、障害を持った子供達に向けたアプリとして、DropTalkっていうアプリを開発しています。dropletプロジェクトさんといっしょに作っています。

AAC (Augmentative and Alternative Communication)とかVOCA (Voice Output Communication Aid)とか呼ばれるタイプのアプリで、コミュニケーションを補助してくれるものです。私は、そちらの専門的なことはよく分からないのですが、DropTalkは絵がかわいいのが気に入っています。Googleの画像検索でAACを検索すると、うーん、あんまりかわいくない。

で、そんなDropTalkですが、とうぜんiPad版が欲しいという要求がありました。それはもう、iPadが登場した直後からずっとありまして。確かに欲しいですよね。でも、どうせ出すなら機能的にしっかりしたものをと考えていたら、思ったよりも開発が難しくて、えらいこと時間がかかっちゃいました。

それをどうにか完成させて、先日App Storeに申請する事ができました。最初に手を付けたときから、2年以上が経過しています。長かったー。でも、iOSアプリらしく、シンプルかつ高機能なものができたと思っています。

いま、dropletさんのブログの方で、DropTalk HDの機能紹介をやっているので、興味がある方はのぞいてやってください。iPhone版と比べるとたくさんの機能があるので、紹介も大変みたい。

特に問題がなければ、あと10日ほどで公開されるはずです。本当にお待たせしました。

UIImageからハッシュ値を求めるときのパフォーマンス


画像を開いた2つのUIImageがあるとき、それが同じ画像かどうか判断したいときがある。いちばん負荷が少ないのは、画像を開くときのパスなりURLなりから判断する事だけど、そうもいかなくて、UIImageインスタンスを直接比較するしかない、ってときがある。

こんなときはハッシュを使うのが一般的だ。ハッシュを使えば、大きなバイナリデータも、その特徴を表す16バイトのデータを取得できる。これを比較してやればいい。iOSの場合は、CommonCryptoフレームワークにMD5ハッシュを取得するための関数があるので、これを使う。

となると次の問題は、どうやってバイナリデータを取得するか、ということだ。つまり、UIImageから、その画像を表すデータを取得したい。ざっと思いついたのは、次の3つの方法だ。

1. UIImagePNGRepresentationを使ってPNGデータを取得する

unsigned char   hash[16];
NSData*         data;
data = UIImagePNGRepresentation(image);
CC_MD5([data bytes], [data length], hash);

2. UIImageJPEGRepresentationを使ってJPEGデータを取得する

unsigned char   hash[16];
NSData*         data;
data = UIImageJPEGRepresentation(image, 1.0f);
CC_MD5([data bytes], [data length], hash);

3. CGImageからCGDataProviderを取得してビットマップデータを取得する

unsigned char       hash[16];
CGDataProviderRef   dataProvider;
NSData*             data;
dataProvider = CGImageGetDataProvider(image.CGImage);
data = (NSData*)CFBridgingRelease(CGDataProviderCopyData(dataProvider));
CC_MD5([data bytes], [data length], hash);

どの手法であっても、比較すること自体は問題ない。あとは、パフォーマンスの差だけだ。

ということで実測してみた。iPad 3rdで、1255 x 1322サイズの画像のハッシュ値を求めた。結果は次の通り。

1. PNG 1.647941sec

2. JPEG 0.442495sec

3. Data Provider 0.323576sec

ということで、Data Providerを使う手法がいちばんパフォーマンスが良かった。これを使うのがいいかな。

ちなみに、実行時間のほとんどはバイナリデータを取得する処理にかかっていた。ハッシュを求める計算が占める割合は、とても低かった。PNGへの変換は、エライこと時間がかかるわけね。

Drift Diaryさんで「音楽のある情景」紹介


ご存知Drift Diaryさんで、「音楽のある情景」を紹介してもらいました。ありがとうございます!

日本以外で使ってもらえると、このアプリ、グッと楽しくなります。西海岸で増える事を期待しております。指摘してもらったtypoも、弊社内バグトラッキングシステムに登録しました。というか、登録と同時に修正しました。

drikinさんとは、一緒に仕事した事はないものの、前職の縁でつながっているなんか不思議な関係。去年のWWDCでサンフランシスコに行ったとき、Westin近くの本屋を出たところでバッタリ出会い、その夜中に急遽ホテルのバーでお話しさせてもらったのが、懐かしいです。

PDFと格闘中


久しぶりに、PDFと格闘中。

遠い昔に、PDFからテキストを抽出するという話を書いた事があるけど、その続きって感じですな。

Adobeから取って来れるPDFの仕様書を、ひたすら読む。まずは、座標系の話を中心に読む。あと、テキスト座標系と、グリフ座標系と。しっかりとした仕様書を読むのは楽しい。

meet iさんで「音楽のある情景」紹介


音楽のある情景」、meet iさんで紹介してもらいました。ありがとうございます。

『きっとより身近に、今みんなが聴いている音楽を肌で感じることができるサービスという意味では、最高のアプリだと思います。』と、言っていただきました。

Map Kitのアノテーションは、バックグラウンドで触らない方がいい


音楽のある情景」の絡みで、Map Kitをいじることが多いんだけど。

地図ベースのアプリでは、地図上に多数のアノテーションを作る事になる。ちょっと油断すると、その数は軽く1,000を超える。そこで、このアノテーションの作成や更新をいかに軽くするか、ということが重要になってくる。

ある程度の数がある以上、どんなにがんばっても処理時間は0にはならないので、バックグラウンドに持っていく事になる。そのとき、どこまでもバックグラウンドでやって、どこからをメインスレッドでやるかの見極めがとても重要になる。

Cocoaプログラミングの原則では、ビューに関する操作はメインスレッドでやることになる。じゃあ、ビューじゃなければバックグラウンドでもいいかというと、これがケースバイケースだったりする。

今日はまっていたのは、地図上でアノテーションを表すMKAnnotation。MKAnnotationはプロトコルなんで、それを実装したクラスはこちらで作る事になる。特に親クラスは指定されない。これだったら、バックグラウンドで触ってもいいだろう、と思ってたら、どうもいかんらしい。バックグラウンドスレッドからアノテーションのcoordinateを触ると、どうにも挙動がおかしい。

想像だけど、一度アノテーションがMKMapViewに追加されるとそっちの管理下におかれるみたい。この状態でアクセスするとビューを触るのと一緒になって、バックグラウンドからのアクセスは厳禁、って理屈だろうか?

とりあえず、メインに持っていったら期待通りの挙動になった。難しいのー!

薄いiMacが来た!


発表されて予約可能になってからすぐ購入した薄いiMacである「新しいiMac」。昨年末に出荷されたんだけど、仕事納めで受け取れなかったので、1月になってからようやくてもとに来た。

新しいマシンが来ると、いつの間にやら社員の人がゾロゾロと集まってきて、お披露目会となる。で、届いたブツを受け取ってみると、なんかいつもと違う。箱がななめってる。

これねぇ、箱が台形になってるんですよ。上の方が細くなっている。分かりにくい?じゃあ、2つ並べてみた。

おぉ、ぴったりだ!こうすることで、輸送時のスペースを節約しているんだな。いや、やってないと思うけど。

で、開封しました。じゃーん!

うーん、正面からじゃよく分からん。少し斜めから見ると、

おぉっ!薄いぜ!

もっと斜めから見よう。

こんだけ斜めでもまだ薄いぜ!

真横から見るとこんな感じ。

あー、こうやってみると、それなりに厚さあるね。しかし、前方から見たときの薄さ加減は、かなりの衝撃ものだ。

Retina MacBookと並べてみた。

いやぁ、遜色ない薄さだ。こうして、デスクトップとノートブックの差はなくなっていくのかもしれん。いや、そんなことはないけど。

新しいiMacは薄いだけかぁと思ってたけど、実際に目の当たりにすると、薄さは正義だった。

あけましておめでとうございます


あけましておめでとうございます。今年もよろしくお願いします。

とりあえず、今年の抱負でも述べてみましょうと思いますが、今年はですね、2013年はですね、えーっと、やることは去年とそんなに変わらないかな。粛々といろんなアプリを作り続けます。

一つだけ違うとしたら、今年はOS Xアプリケーションを作りたいなー、と思っております。実際そんな案件も舞い込んでおりますし。iOSだけだと、どうしてもソリューションとして未完成になるし。だからって、ブラウザ+サーバでやると、みったくないものになってしまうし。どう考えてもOS Xアプリケーションにするのが自然だろ、ってものが色々あるので、そんなやつらはOS Xでやります。いやー、久しぶりだな。

どうでもいいけど、iOSだとアプリで、OS Xだとアプリケーションっていいたくなるね。Appleのドキュメントでも、iOSの方はApp、OS Xの方はApplicationって書いてある事が多いような気がする。気のせいかも。

DropletさんとDropTalk HD


HMDTでは、DropTalkっていうアプリを開発してます。自閉症や言語障害を持つ方のコミュニケーションを助ける、AAC(補助代替コミュニケーション)っていうタイプのソフトウェアです。

これは、Droplet Projectっていうところから依頼を受けて開発しているんですが、先日ATAC2012というイベントがありまして、これは『「テクノロジー」と「コミュニケーション」をキーワードに,社会の中で困難さを抱える人たちを支援する技術と考え方を多くの人と共有する』ってものなんだそうですけど、そこで発表を行ったそうです。

で、ATAC2012は東京で開催されたので、Droplet Projectの方々が、HMDTのオフィスに遊びに来てくれました。Dropletの方々は、いつもは長野で活動しています。そのときの様子が、Droplet Blogで紹介されています。なんか、弊社オフィスとスタッフの写真も載っているし。

で、そこにチラッと書いてありますが、DropTalkのiPad版である、DropTalk HDを開発しています。というか、開発は佳境でもうほぼ出来上がっています。ATACでお披露目されたそうなので、そのときの反響をもとに最後の改善を行って、来年1月にリリース予定です。

リニューアル式さんで「音楽のある情景」紹介


音楽のある情景」、リニューアル式さんで紹介してもらいました。ありがとうございます。

『最近売れている音楽は、音楽の海の表面のようなもの。
面白いものは、海中を深く潜るほど見つかるはずだ。

利用者が増えるほど面白くなるアプリ。一緒に潜ろうぞ!』

と、言っていただきました。