Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

StoryboardでUIImagePickerControllerを扱いたい

答えはこちら
http://stackoverflow.com/questions/13713242/prepareforsegue-with-uiimagepickercontroller

  1. storyboardでUIViewControllerを配置
  2. 配置したUIViewControllerのCustom Classの欄にUIImagePickerControllerと入力する
  3. prepareForSegueで遷移するときに捕まえて設定をする

これだけでうまく行きました。Storyboardで管理できる画面が増えるとViewを分離できる部分が多くなるので便利

NavigationControllerに接続していたのでこんな感じでprepareForSegueの中身を書きました。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if( [segue.identifier isEqualToString:@"cameraSegue"] )
    {
        UINavigationController* controller = segue.destinationViewController;
        UIImagePickerController* pickerController = (UIImagePickerController*)controller.topViewController;
        // ここで好きなように設定をする
    }
}

UICollectionViewのリロードは表示されてるセルしか実際には実行されない

で、UICollectionViewを使ってデータを表示しているときに

セルを再利用するので、セルの中身を非同期で読み込んだりしていると意図しないセルの中身を書き換えたりしまうことがある。
セルを保持しないようにしないといけないので、リロードでうまくいくか試してみた。

UICollectionView:reloadItemsAtIndexPaths
で、リロードをするときに画面に表示されてないセルに対してリロードを実行してもcellForItemAtIndexPathが呼ばれなかった。

セルを保持しないでどんどんリロードしてもよさそう。

Promiseの実装練習

翻訳: ”命令型のコールバック、関数型のプロミス: Node が逸した最大の機会” by James Coglan
これのコードを読んでいてイマイチ理解が出来なかったので、実行出来る形にコードを補完して写経してみた。

元記事のコードに出てくるPromiseクラスの完全版はたぶんこれ→ https://github.com/tildeio/rsvp.js/blob/master/lib/rsvp/promise.js


最後の方まで気づかなかったので、とりあえず簡単な自作Promiseクラスを実装したものをここに→ https://github.com/nilfs/promise-sample


値の依存関係に注目したプログラミングはもう少し練習して実践に生かして行きたいところ。


Node.jsは初めてだったけど、今回はサーバーコードじゃなかったし、firebug上でちょっと書くの余り変わらなかったな

Promiseの実装練習2

Objective-c版を実装し始めた。
C言語だと可変長引数の扱いどうしようとかトラブってなかなか進んでいない。一旦thenとresolve関数だけ実装してみた。

https://github.com/nilfs/promise-objc

メンバメソッドを呼ぶためにオブジェクトと関数ポインタ(セレクタ)を取っておく必要があってそれはNSInvocationというクラスを使うとうまくいく。

そもそも可変長引数のメソッドをどう扱おうと思ったときはここを参考にした

http://d.hatena.ne.jp/Kazzz/20120211/p1

NSInvocationというクラスの存在がわかったので少し光が見えてきたわけ。

NSInvocationクラスの使い方はここを参考にした

http://d.hatena.ne.jp/Kazzz/20120211/p1

まだ導入してないけど、このNSInvocationを生成するカテゴリは便利そう。
http://taoru.hateblo.jp/entry/20121119/1353290439


だんだんObjectiveCでも約束を守る実装が作れそうな気がしてきた。ObjCで出来るからC++でもどうにかなるかなぁ・・・。可変長引数を取っておく辺りのメモリ管理とか考えないとダメか

CAS(Compare And Swap)をしたいんだけど

Lock-freeにしたいところがあってobjective-cでどうやって書くか調べてみました。

#import
とimport文を書いて

    NSMutableArray * arrayA = [[NSMutableArray array] autorelease];
    NSMutableArray * arrayB = [[NSMutableArray array] autorelease];
    
    [arrayA addObject: [NSNumber numberWithInt:100]];
    [arrayA addObject: [NSNumber numberWithInt:200]];
    [arrayA addObject: [NSNumber numberWithInt:300]];
    
    NSLog( @"arrayA:%@ arrayB:%@", arrayA, arrayB );
    if ( OSAtomicCompareAndSwapPtr(arrayB, arrayA, (void * volatile *)&arrayB) ){
        printf("success");
    }
    NSLog( @"arrayA:%@ arrayB:%@", arrayA, arrayB );

という感じで、OSAtomicCompareAndSwapXXX関数を使えばいい。

メモリバリアあり版となし版があるようなので、そこは適宜。

他にどんな関数があるかはリファレンスを参照するとよさげ。

http://developer.apple.com/library/mac/#documentation/System/Reference/OSAtomic_header_reference/Reference/reference.html


ARCを有効にしているとidからvoid*への変換が許されないようなので、ARCを無効になるようにプロジェクトを設定するか
-fno-objc-arc
ってオプションをつけておかないとダメです。

マウスやキーボードの共有ツールで新しいものを見つけたので試してみました

Windowsマシンが増えたので、Synergyを入れようとぐぐっていたところ

Mouse without Borders
というアプリケーションを発見。解説はこちら

ダウンロードはこちら

インストールは、特に難しくなく接続するマシン名とセキュリティーコードを入力するだけですぐに繋がりました。
Windows同士だったらかなりオススメです。


2週間ほど使っていますが特にストレスはないです。一度だけ接続が切れることがありましたが、設定画面で再接続したら特に問題なく稼働しています。


特に便利なのが、Win+LでPCロックが出来ると思いますが、接続しているリモートマシンも一緒にロックする事が出来ます。
ロック忘れがなくなってよいですね。