2011年3月10日木曜日

iOS4以降で実装されたマルチタスキング対応アプリの状態遷移をまとめてみました。

iOSアプリの状態遷移

iOS4.0からアプリのマルチタスキングが導入され、アプリはバックグラウンドという状態を持てるようになりました。それ以前にはアプリの状態というのは起動中(アクティブ)かそうでないかぐらいの区別しかなかったものが、これによってぐぐっと複雑になり、アプリケーションガイドを一度見たくらいではたぶん完全には理解できなくなったのではないでしょうか。(ガイドにはちょっと嘘も書いてあります)

アプリケーションガイドによると、アプリの状態というのは下記5種類があるそうです。
・非実行
・非アクティブ
・アクティブ
・バックグラウンド
・一時停止(サスペンド)

フォアグラウンドっていう状態はないみたいですね。たしかApplicationDelegateにapplicationWillEnterForegroundっていうのがあったはずですが、あれはフォアグラウンド状態に遷移するときに呼ばれるんじゃないんでしょうか。
そうなんです。フォアグラウンドっていう状態はないんです。このへん、自分でもよくわからなくなったので、あちこち調べて理解したのですが、最近人に聞かれる機会があったので図にしてみました。

IOS4以降のアプリ状態遷移図

ログ入れて実機(iPhone4)で調べたので実際の動作と同じになっていると思います。(間違いあったらご指摘お願いします)
図中、起動系は赤、終了系は青の線と色分けしています。
先程のフォアグラウンドの件、これがフォアグラウンドだという明確な記述は見つけられませんでしたが、たぶんACTIVEかINACTIVEかのどちらかにいる時をフォアグラウンドといってるっぽいですね。

ローカル通知はどう受け取るか

どういうときに状態遷移を理解していると便利かという事例として、時刻がくると発報するローカル通知を使ったアプリを作っている時に、通知イベントの動作で困ったことがありましたのでそれを紹介します。
通常、ローカル通知イベントが発生するとアラートウィンドウが出ますが、アプリが動いている(わざとあいまいな表記をしています)時に発生したローカル通知イベントは、アラートウィンドウを出さずにApplicationDelegateに通知されます。アプリからは、アラートウィンドウが出たかどうかを知る手段がないんです。
そこでログを入れて調べていますと
  • アラートウィンドウが出るパターン (メソッド名は一部省略しています)
EnterForeground → Notify通知 → BecomeActive
  • アラートウィンドウが出ないパターン
BecomeActive → Notify通知

となっていました。どうやらNotify通知を受け取るのがapplicationDidBecomeActiveの前か後かによって判別できそうです。フラグをBecomeActive時にYES、ResignActive時にNOになるフラグを作って、フラグがYESの時は自力でアラートウィンドウを出すという対策を施しました。
でも、すべての場合についてこれで良いかどうか確信が持てません。こういう時はテストして調べることになるのですが、すべての状態を網羅しないと完全とは言えません。
このような場合に状態遷移図を見てテストケースを決めるわけです。
今回の場合は、メールなどのアラートを出していたりするときのNotify通知のテストが漏れていることがわかりました。(ちゃんと動きました)

参考になれば幸いです。

2011年3月4日金曜日

Facebookにページを作りました

Facebook勉強中です。
とりあえずページを作ってみました。よろしくお願いします!

ついでにここのテンプレートいじってShareボタンといいね!ボタンを各投稿の下↓につけてみました。(こちらを参考にさせていただきました)

2011年2月16日水曜日

OpenGL勉強会まとめ(2) OpenGLアプリの最小構成

OpenGLはプラットフォーム非依存
コノルさんの勉強会ではiPhoneでのOpenGL ESアプリを作ることを目標に、基本的な描画、テクスチャ、バンプマッピング、マルチテクスチャまでを勉強しました。

このブログはおさらいという意味で、勉強会のソースをアリの目でもう一度追学習してみようと考えています。

OpenGL自体はプラットフォーム非依存で、実際に画面に表示するウィンドウを作るなどという部分は含まれていません。そのあたりを扱う有名なライブラリに、glutなどがありますし、本家でもEGLという、プラットフォーム依存部分のインターフェースを規定しているものもあるようです(iOSでのEAGLViewはEGLのApple実装らしい)。

iOSではglutは使えませんから、私も参考書などにあるソースがそのまま動かなかったりして戸惑いました。逆にEAGLViewは当然他の環境にはありませんので、この記事はiOSでのOpenGL ES1.1をターゲットにしていますが、iPhone独自部分についてはあまり深く追わず、OpenGL ES1.1として一般的な内容になるように心がけてみます。

2011年2月14日月曜日

OpenGL勉強会まとめ(1) OpenGLとは何か

わかりにくいOpenGL
言わずと知れた3D API、OpenGL。巷では、OpenGLはステートマシンだとか、クライアント&サーバー型だとかいう説明がされていますが、それにしても分かり難くないでしょうか。こう書くんだよ、というサンプルをアレンジして使ってみるのですが、それぞれの命令が何に対して働きかけているものなのか、どうも命令が整理されていないように感じるのです。

例えば、頂点配列を定義するのはglVertexPointer、カレントカラーを指定するのはglColor、というAPIがあるのですが、その設定値を読み出すのは両方共glGetというAPIです。さらに読み出す値の型によってインターフェースを分けています。
整数型の値ならば glGetIntegerv
浮動小数点の値ならば glGetFloatv
などと機能的なまとまりでなく、型によってAPIが分かれています。いったいどうしてなのか。私はこれはソフトウェア的な思想ではないように思うのです。

OpenGLはデバイスドライバの成れの果て?
それはOpenGL自体の設計が古い(1992年頃)というのもあるのですが、私はOpenGLを3DグラフィックアクセラレータのLSIのレジスタを抽象化したデバイスドライバのようなものだと捉えています。基本はSGIが使用していた描画回路をもとに標準化されたのではないかと思います。

一般的に、LSIには機能を制御するレジスタ群があり、ここに値を書き込んだり、読み出したりすることで制御を行います。


xxxx番地のbit0に1を書きこむと描画開始、などと決まっています。またレジスタには値を記憶したり、読み出したり、またLSIの処理状態によって勝手に変化するものがあったりします。どれがどういう機能を持つかはLSIのユーザーズマニュアルのレジスタマップを参照しますが、これでは分かりにくいしハードの仕様がちょっと変わっただけでソフトウェアのかなりの部分を変更しなくてはいません。

それでソフトウェアにはドライバというレイヤを設けてこのハードウェアを抽象化して使いやすくするわけです。そのドライバの中でも基本的な機能に、レジスタの読み書きがあります。レジスタにはそのレジスタの機能を表す名前をつけ、その名前を元にレジスタを読み書きするAPIを設けます。
先程のOpenGLのglGetがこの読み込みAPIに当たります。ものすごく低位なレイヤのAPIをそのまま標準化してしまったわけです。

また、レジスタはハードウェアのブロックに直結しているだけあって、ある機能を実現するためのモノがあっちこっちに分散していたりします。○○機能を有効にするために、xxxxレジスタとyyyyレジスタのbitどこそこを1にする、とかです。このへんもOpenGLの手数の多さと似ています。
余談ですがLSIのレジスタはメモリと違い、すべてのレジスタが書き込みできるとは限らず、読み出ししか出来ないものや、あるタイミングで勝手にクリアされたりするものもあります。

OpenGLの付き合い方が分かってきた
そんな目でOpenGLをみてみると、上記の特徴も、
  • ステートマシンである 
→ 書き込み値はレジスタに保存されるので、次に書き換えるか、制御の結果書き換わるかするまで変化しない。
  • クライアント&サーバー型である
→ ソフトウェアでコマンドを発行(レジスタ書き込み)し描画エンジンが実行する、という意味ではクライアント&サーバといえなくもない。描画LSIな訳ですから少なくとも自発的に動いたりしないわけで。いちいちコマンドで指示してやる必要があるわけです。

というようにしっくりする気がします。

描画命令というよりも、LSIの制御シーケンスを書いていると思えばよいのです。(と言って納得していただけるのは組込み系経験のある人だけかもしれませんが…笑)

これC++のクラスにでもしたくなりますね(笑) そのうちするかもしれません。

これからしばらく、OpenGLについての勉強をかねて、使い方を俯瞰していきたいと思います。

2011年2月11日金曜日

OpenGL勉強会まとめ

OpenGL勉強会まとめ

先日、Conolさん主催のOpenGL勉強会に参加してきました。

自分でも勉強しているんですが、OpenGLって日本語のリファレンスとか少ないです。

「こう書けば、こうなる」的にパターンで覚えて行くのもいいんですけど、昔から仕組みを理解しないと納得がいかないタイプなので、まずは勉強会で使ったAPIを整理して、構造を推測して見ることにします。

Posted from dPad on my iPad ゆうぞら

2010年11月5日金曜日

たくらみ

思うところあってMagsafeレセプタクルのジャンクパーツを手に入れました。

Magsafeレセプタクルパーツ BlogBooster-The most productive way for mobile blogging. BlogBooster is a multi-service blog editor for iPhone, Android, WebOs and your desktop


何に使うかというと、HyperMacの充電端子をMagsafeにしたいのです。
そうすればアダプタ二つ持ち歩かなくても済むかなと思って。
あとHyperMacの付属アダプタでは充電状態が表示されないのも不満(ACつながなくてもバッテリに接続するだけでLEDが点灯します)。MagsafeコネクタのLEDを制御できないか検討中です。
ちなみにMagsafeコネクタのピンアサインは こちらに http://ja.wikipedia.org/wiki/MagSafe
試しにACアダプタを接続してみたんですが、それだけではコネクタLEDは点灯しませんでした。緑またはオレンジ表示にするための制御が必要です。


追記
Magsafeコネクタというか純正ACアダプタは端子オープン状態では6.5vしか給電されずLED消灯、何かしら負荷がある場合(電流が流れている場合)に16.5v給電かつLED点灯するようになっているそうです。その際の緑か橙かの色を中心のControlピンで制御するようです。

iPhoneからの投稿テストです

BlogBoosterという無料アプリを使ってみてます。日本語で投稿できるかのテストです。