投稿

Mac Fanの表紙が動きます(Mac Fan X ARART)

イメージ
Mac Fanの表紙が動きます。 Mac Fan (マックファン) 2013年 06月号の表紙がアマゾンで見れるようになりました。表紙の前田敦子さんの右肩あたりに 表紙が動き出す!! iPhoneアプリ「Mac Fan X ARART」で表紙を覗いてみよう という文字が見えます。どういうことでしょうか? このARARTとは iPhoneのカメラで取得した映像がディスプレイの中で動き出す というアート作品です。 例えば、花のつぼみの絵にカメラを向けてディスプレイに映すと、アプリの中でその映像を分析し、つぼみの位置のところを開花する花の動画に変換し表示します。ユーザーには現実の世界(つぼみ)とは違う別の世界(開花の様子)がディスプレイの中に見えます(まあこの拡張世界をどううまく作るかはセンスが必要ですが)。 下のが公式のビデオです。 ARARTチームはいろいろな会社の宣伝活動に技術を提供しているようです(たぶん)。 今回、このARARTがMac Fanの表紙で体験できるようになります。 Mac Fanの表紙用に作ったアプリ「Mac Fan X ARART」をダウンロードして紙面に向けて実行すれば出来ます。 Mac Fanがどのような世界を用意しているかは見てのお楽しみということで、とりあえずこのARARTというのをやってみます。 アプリはこちらで取得出来ます。(Mac Fan + ARARTのアプリとは別) ARART やり方は アプリをダウンロードとインストール 絵画が置いてあるサイトを表示 アプリを実行 です。 詳しく説明していきます。 アプリをダウンロードとインストール アプリを起動後に追加でインストールするデータがかなりあります。そちらは回線に余裕のある環境でダウンロードしてください。 サイトを表示 パソコンでこちらのサイトを表示します。 http://arart.info/museum/ 絵を紙に印刷してもアプリを実行できます。 アプリを実行 アプリを起動するとカメラ機能が有効になり、画面にはカメラに取り込んだ映像が表示されます。 まずは絵画が画面に入るようにして下さい。停止させた状態で少し(1〜2秒)経つと動画が始まります。 無理な体勢で全部の絵画を見ていくと手が疲れる...

Form Sheetの画面回転処理

あるViewControllerから別のViewControllerをモーダルで呼び出すときにform sheetという表示方法がある。このform sheetというのは画面全体を覆うのではなく"回"のように中央に小さなViewを表示するタイプ。 この呼びだされたもの自体もViewControllerなので、デバイス回転に対するメソッドを持つことが出来るが、form sheetの場合はその回転メソッドは無視して、呼び出し(親)の向きに従うようである。 iOS View Controllerプログラミングガイドにこう書かれています。 画面全体を占めないView Controllerは一般に、向きを考慮しなくても構いません。親View Controllerか ら描画領域を指定されるので、その中に描画すればよいのです。一方、ルートView Controller(ある いは画面全体を表すView Controller)は、デバイスの向きを意識することが多いでしょう。 ということで「親View Controllerか ら描画領域を指定される」に「向き」も含まれていると解釈すれば、親ViewControllerに従うという理解で良さそうです。 ただ、 iOS5とiOS6で挙動が若干違うようです。 記述してある対応画面が親コントローラと子コントローラで同じならばいいんですが、問題となるのはiOS5で違う場合の処理です。いろいろやってみたのですが、どうも法則がつかめず。 パターン1 親の対応方向が子の対応方向を含む わからない (例) 親コントローラ:全方向 子コントローラ:rightのみ iOS5 親は回転に反応せず。子はrightのみ。 iOS6 親が全方向に対応し、それに子も従う (例) 親コントローラ:全方向 子コントローラ:UpSideDownのみ iOS5 親は回転に反応せず。子はUpSideDownのみ。 iOS6 親が全方向に対応し、それに子も従う (例) 親コントローラ:全方向 子コントローラ:rightとUpSideDownのみ iOS5 親も子もrightとUpSideDown。 iOS6 親が全方向に対応し、それに子も従う (例) 親コントローラ:全方向 子コントローラ:portraitとUpSideDownのみ iOS5 親も子もpor...

NSStringいろいろ

NSStringについてのいろいろ。 記事を書いた時のiOSバージョンはiOS6.1.3です。 初期化時の複数バイトエンコーディングの扱い - (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; は引数にencodingがあるが、複数バイトエンコーディングのものを指定すると、全て0となっているバイトで文字列末端とみなされるようだ。 例えば2バイトで 00000000 10101010 と表される文字があるとすると00000000のバイトを文字列末端とみなすらしい。 長い文字列のはずが、いきなり初めのほうで文字列が終わってしまう。 + (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc も同様。 上位8ビットが0の時だけでなく下位8ビットが0の時でも末端と見るようだ。 おそらく 8ビット毎に取り出して char selectedChar = 取り出し関数(); if(selectedChar == 0){ 末端処理 }else{ switch(エンコード){ 各エンコード別の処理 } } のような処理だ。 そもそも8ビットの0を内部に含むエンコーディングはC言語文字列の定義から外れるという考え方なんだろう。 対策は – initWithBytes:length:encoding:(これはどのエンコードでもいけそう) - initWithCharacters:length:(UTF-16限定?) + stringWithCharacters:length:(UTF-16限定?) などを使う。 第3水準、第4水準の漢字に対応しているか まず、漢字の分類方法なのだが、第1、第2、第3、第4とあり、数字が大きいほうに使用頻度の低い漢字が割り当てられている。 第4水準の初めの文字は「毎」のカンムリだけを取り出したようなもの。読み方はわからず。このブログでは表示出来ない。 で、この漢字をiOSで扱えるのか? Unicodeに含まれていれば対応しているんではないか?と思うかもしれ...

Unicodeについて

Unicodeで日本語が該当する箇所 Unicodeの中で日本語が該当する所を調べてみました。 漢字は基本的に、日本語で使われるか中国語で使われるかは区別されません。ですからこれらの範囲の中には中国でしか使われない漢字も含まれています。 ここでは割り当てられている領域を書いています。実際に文字が割り当てられている範囲が書かれている資料とは終わりの値が若干異なることがあります。 ひらがなU+3040~U+309F(ひらがな文字は U+3041~U+3096) カタカナU+30A0~U+30FF(カタカナ文字はU+30A1~U+30FA) 「CJK統合漢字」U+4E00~U+9FFFに、約20,000字 「CJK統合漢字拡張A」U+3400~U+4DBFに、6,500字強 「CJK統合漢字拡張B」U+20000~U+2A6DFに、約42,000字 「CJK統合漢字拡張C」U+2A700~U+2B73F(2009年10月制定のUnicode5.2.0) 「CJK統合漢字拡張D」U+2B740~U+2B81F(2010年10月制定のUnicode6.0) また、一覧の中から私が目視で日本語ぽいと判断したものに U+2E80-2EFF CJK部首補助 U+2F00-2FDF 康熙部首 U+3000-303F CJKの記号及び句読点 U+31F0-31FF 片仮名拡張 U+3200-32FF 囲みCJK文字・月 U+3300-33FF CJK互換用文字 U+FE30-FE4F CJK互換形(たてがき?) U+FE50-FE6F小字形(たてがき?) U+FF00-FFEF半角・全角形 があります。 漢字ではこれらの「CJK統合漢字」や「CJK統合漢字拡張A~D」とは別に、 U+F900~U+FAFFとU+2F800~U+2FA1Fに「互換漢字」 U+E0100〜U+E01EFにIVS用のバリエーション符号 があります。 Objective-CでのUnicode文字列の扱い iOSの文字列の文字コードはUnicodeです。Unicodeには表現方法がいくつかあって、おそらく、UTF-16という方法を用いていると思います。(はっきりした資料が見当たらず予想という前程) このUTF-16はほとんどの文字を2バイトで表現...

konashi 1.0を詳しく見てみる

Getting started サイトにある Getting started を読んでみます。 最初にkonashiライブラリを取得します。 githubから取得するか「こちらから最新版のライブラリをダウンロード」からzipファイルをダウンロードすればOKです。 手元にkonashiがありませんので、プロジェクトの作成はしませんが、引き続きGetting startedに目を通してみます。 核になる部分は2つのメソッド [Konashi pinMode:LED2 mode:OUTPUT]; [Konashi digitalWrite:LED2 value:HIGH]; です。 上のコードで「pin番号がLED2のものをOUTPUTに設定」して 下のコードで「LED2にHIGHを書き込み」しています。 ちなみにLED2 OUTPUT HIGHはint型に#defineされています。 LED2が点灯すれば成功となります。 このGetting startedで行うことは全部でviewDidLoadに3行追加と、konashiReadyメソッドの追加。たったこれだけでLEDを点灯させることが出来ます。 Documents Documents を見ます。 ピン、端子の種類について デジタル、アナログ、PWM、I2C、UARTとあります。一つの端子がいろいろ兼用していますので言葉でまとめるのは困難です。表があるとわかりやすいかもしれません。 専門用語 わからない専門用語をいくつか調べました。内部プルアップ、I2C、UARTなど。 サンプルコード PioDrive デジタル入出力のサンプルです。 これが一番わかりやすいので、最初に試すといいと思います。 konashi本体上のスイッチとLEDを使ってデータを送受信します。 本体のスイッチによってLED1を制御。LED2から4はアプリの画面より制御します。 (本体のスイッチとLEDを使う時は本体のジャンパーのショートをする必要があります。) AioSample アナログ入出力のサンプルです。 AIO0(エーアイオーゼロ)に入力、AIO1に出力します。 HardwareSample konashiの電波強度とバッテリーの状況を取得するサンプルです。 電波はiO...

iOS6 deprecated

iOS6より画面切り替え系のメソッドでdeprecatedになったものがあります。 - (void)dismissModalViewControllerAnimated:(BOOL)animated - (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated です。以下のものに置き換えます。 - (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

supportedInterfaceOrientations

iOS6から画面の回転に関する処理が変わりました。 ViewControllerに2つのメソッド、 (BOOL)shouldAutorotate (NSUInteger)supportedInterfaceOrientations を追加します。 これらのメソッドの大まかな説明は省きます。 この(NSUInteger)supportedInterfaceOrientationsの戻り値ですが、 UIInterfaceOrientationMaskPortraitのような 〜Mask〜 というものを指定します。 これは各ビットがそれぞれの方向に対応しており、どの方向に対応するかを一つの変数で表せます。 Portrait基本形のみ対応する場合でもUIInterfaceOrientationMaskPortraitというMask付きのものを指定します。単一指定ならMaskがついてなくても値は同じだろうと早とちりしてしまいUIInterfaceOrientationPortrait(Maskが付かないやつ)を指定してしまうと、 Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES という実行時エラーが出ます。 定義を調べると以下のようになっています。 typedefが少し独特ですが、どこかで#defineされているんでしょう。 typedef NS_ENUM(NSInteger, UIDeviceOrientation) { UIDeviceOrientationUnknown, UIDeviceOrientationPortrait, // Device oriented vertically, home button on the bottom UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top UIDeviceOrientationLandscapeLeft, // Device oriented horizontally, home bu...