TouchJSONを使ってみる

Twitter APIから受け取ったJSONをNSDictionaryにしたいので、TouchJSONを使ってみる。

TouchCode/TouchJSON – GitHubからTouchJSONのソースコードを取得(git clone https://github.com/TouchCode/TouchJSON.git)。

TouchJSON/Sourceをプロジェクトに追加。

#import “CJSONDeserializer.h”を使用するファイルに記述。

Twitterからデータを受信したら

NSError *error = nil;
NSDictionary *dictionary = [[CJSONDeserializer deserializer] deserialize:data error:&error];

Cinderのメモ

Cinder | The library for professional-quality creative coding in C++のメモ。

CinderのライセンスはBSDライセンス。
C++で記述。
Mac/Windows/iOSで利用可能。
3D/2D/Audioの他に、OpenCV 2.1 のオブジェクト指向ライトウェイトラッパーもあるらしい。
cinder::cocoaってのがあってMacやiOSのCocoaオブジェクトの取り扱いも簡単そう。
CinderのXcodeプロジェクトはTinderBoxというGUIツールで簡単に作成できるらしい。スクラッチで作成もできるが、いろいろ面倒そう。

OpenCV使ったiPhoneでのARマーカーの検知動画をYouTubeで公開してみた

iPhoneでARマーカーを検知する動画をYouTubeで公開してみました。
YouTubeにあげること自体が初めてでドキドキ。
あんまりうまく撮影できてないのがかこわるいですが。

OpenCV使ってます。C++インターフェース使ってます。

マーカーの横に表示される数字は、マーカーの中の図形コードの数値です。図形コードの横のブロックでマーカーの方向を検知しています。

iOSにおけるCoreGraphicsによるオフスクリーンでの線分の描画例

描画スクリーンサイズは480×640で設定している。

以下の例では原点は左上になる。

UIGraphicsBeginImageContext(CGSizeMake(480, 640));
CGContextRef context = UIGraphicsGetCurrentContext();
 
CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
CGContextSetLineWidth(context, 3);
CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, 100, 100);
CGContextStrokePath(context);
 
CGImageRef imageRef = CGBitmapContextCreateImage(context);
self.view.layer.contents = (id)imageRef;
 
CGImageRelease(imageRef);
 
UIGraphicsEndImageContext();

以下の例では原点は左下になる。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, 480, 640, 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace);
 
CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
CGContextSetLineWidth(context, 3);
CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, 100, 100);
CGContextStrokePath(context);
 
CGImageRef imageRef = CGBitmapContextCreateImage(context);
self.view.layer.contents = (id)imageRef;
 
CGImageRelease(imageRef);
CGContextRelease(context);

原点の移動は以下のように行う。これにより原点を左下から左上に変更できる。

CGContextTranslateCTM(context, 0, 640);
CGContextScaleCTM(context, 1.0, -1.0);

インストールしたiOS Firmwareの保存場所

iTunesのアップデートでインストールしたiOS Firmwareの保存場所は、Macでは~/Library/iTunesにあるiPad Software UpdatesフォルダやiPhone Software Updatesフォルダで、各々のイメージファイルがそのフォルダに入っている。

過去のバージョンが必要な場合はそこから取得できるかもしれない。iPadのVer3.2系イメージが欲しかったので、iPad Software Updatesフォルダを確認したら入っていた。

Windowsでは
C:\Documents and Settings\Account\Application Data\Apple Computer\iTunes\
らしい。未確認。

もし手元になければiPod, iPhone and iPad Firmware Downloadから取得できるらしいが信頼性は不明。

iOSで自動的にロックしないように設定する方法

iOSではユーザが設定した時間が経過すると自動的にロックされてスリープに入ります。これを自動的にロックされないようにする方法。

[UIApplication sharedApplication].idleTimerDisabled = YES;

これをロックされるように戻すには逆にNOを設定します。

私はFTPサーバを起動してファイルをiOSアプリに転送している時に設定。ゲームアプリでは良く使うのかな。

MPMoviePlayerControllerで戻る・進むボタンが機能しない場合の対処法

先日MPMoviePlayerControllerでローカルファイルを再生するコードを書いたのですが、戻る・進むボタンが正常に機能しませんでした。

具体的には

  • 再生後すぐに戻るボタンをタップすると動画再生が停止する
  • 進むボタンをタップすると動画再生が停止する
  • 少し再生した後に戻るボタンをタップするとはじめから再生される(正常に動作)

という状況でした。

検索しても答えは見つからず、Twitterで質問してみましたが、この現象を解決する回答はありませんでした。(が、今後役に立つであろう事を教えてもらえました。ありがとうございました。)

再度Stack Overflowで検索したところやっと解決方法を見つけました。

To fix back/forward (or previous/next) buttons you should do the following:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackStateDidChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];

– (void) moviePlayerPlaybackStateDidChange: (NSNotification *) notification {
if (moviePlayer.playbackState == MPMoviePlaybackStateStopped) {
[moviePlayer setContentURL:[moviePlayer contentURL]];
[moviePlayer play];
}
}

[From MPMoviePlayerController problems on iPad – Stack Overflow]

これが答えでした。つまりPlaybackStateが変更された時に、playbackStateがMPMoviePlaybackStateStoppedだったらコンテンツURLを再設定して再生するというコードです。

これって、わざわざこのようなコードを入れないといけないのは少し変です。バグなのでしょうか?それともドキュメントのどこかに書いてあることなのでしょうか?