Twitter Weekly Updates for 2012-01-16

  • I'm at 相模原北警察署 (緑区西橋本5-4-25, 相模原市) http://t.co/fnbKejiL #
  • このケーブル、クルマとカバンとデスクように買った。 #
  • ドリームハウスで、電源ケーブルと床暖房のケーブルにビスで穴を空ける「予想外の出来事」とかやってる辺りとか、設計から実装までスリル感を楽しめた #
  • スマホ対応の手袋ってトラックパッドも操作できるんかな。手が冷たい。 #

Twitter Weekly Updates for 2012-01-02

  • あけましておめでとう #
  • 高みから見降ろしてる感じが。 #
  • 金ピカサチコ、金ピカアーチャー、何か雰囲気似てる #
  • 読み直してる。/ 35歳を超えたエンジニアの5つの働き方 http://t.co/FyOIsb1Q #
  • 伊達巻よりだし巻きの方が好きです。御節は全部だし巻きにしたらいいのに。 #
  • しかし、そろそろコストコでの取り扱い復活してほしい。もう色んなとこで普通に割引して売ってるんだしさ。また20%OFFクーポンを出して欲しいなと #
  • 今iTunesカードは何処で買うと安いんかな?サークルKとかかな。 #
  • ふと「夜明けの晩に」っていつ?と調べてみたけど、結局いつなのかはわからない。 #

Twitter Weekly Updates for 2011-12-26

  • 「みんなのしおり.jp Wチャンスキャンペーン」 @kodanshahonyakuをフォロー&このツイートをRTするだけの簡単応募!ベストセラー公式伝記「スティーブ・ジョブズ」を100名様に! http://t.co/zKlgz7Rw #しおり #
  • 前代未聞麻薬的爽快遊戯 #
  • ソーサリアンの次はドラゴンスレイヤーとか出して欲しい。タモリが出てくるやつ。 #
  • また、通知がポッポッポッポッポッーンになってきた。 #
  • ワシのネストは108段まであるぞ! #
  • powとか遅くて使ってられないし、ぷんすか。って事で #
  • 駐車場の契約を更新した。5駅違うだけで2〜3倍も値段違うのね。 #
  • ヒルズの療法食(キャットフード)は猫さんに評判がいいけど、たかい。せめてサイエンスダイエットくらいだったら #
  • うん、だいたい出来た。帰ってテストしよ。 #
  • ZOZOナンバー[114284]番でした。残念! http://t.co/vIxwEnH9 #ZOZONUM #
  • 猫にマグロとか鰹節とか小魚とか余り食わせるなと言うけど、缶詰はマグロ・鰹節ものが多いし。おやつは小魚とか。意味が分からない。 #
  • 猫は肉食なのだろうか?キャットフードがドッグフードほど肉々していないのは何でなん。 #

Twitter Weekly Updates for 2011-12-19

  • 「みんなのしおり.jp Wチャンスキャンペーン」 @kodanshahonyakuをフォロー&このツイートをRTするだけの簡単応募!ベストセラー公式伝記「スティーブ・ジョブズ」を100名様に! http://t.co/zKlgz7Rw #しおり #
  • 「使っているところをビデオに撮ってユーザビリティを確認する」 #shibuya_sp #
  • Flash and cocos2d 気になる #shibuya_sp #
  • RT @takayama: iOSアプリケーションの Unit Test http://t.co/qq60itve #shibuya_sp #
  • すぐに使える(xcodeにバンドルされてる)方から慣れた方が良さそう #shibuya_sp #

Twitter Weekly Updates for 2011-12-12

  • http://t.co/CedEob8P CROSS 新年会 #yidev #
  • IBOutletCollectionはiOS4からだっけ #yidev #
  • 今、電子書籍買うと紙の本も http://t.co/NfBdDEF8 #yidev #
  • なげやりすぎるバルス #yidev #
  • ふらふらは、ばるすだったのか #
  • そいえば、明日yidev、行けそうだから行こうかなー #
  • 今日はWinMergeが欲しい #
  • お、明日コストコ座間オープンか。 #
  • ソースコード検索エンジン欲しい。 #
  • 今まで買ったPCの中で1番安いだろうな。ぴゅう太もたしか4,5万くらいはしたよ。そう考えると、今の製造業界はホントヤバイ #
  • つか、メモリもずいぶん安いんだなぁ #
  • 嫁のPCが壊れたので、Lenovo買った。安いのう。http://t.co/RawXu9EC #
  • ceil #

Twitter Weekly Updates for 2011-12-05

  • ドリランドに続きドラゴンコレクションにも挫折したー #
  • 色々 advent calender 見てると自分がいかに勉強不足か痛感させられるな #
  • miil はinline 表示のAPIあるのかな #
  • gdbが落ちる #
  • #iosadvent2011 三日目書きました! / NSOrderedSet と集合と順序と CoreData: http://t.co/uoo0KKPO #
  • 青色申告の説明を聞きながら、advent calenderのテーマを考えていたので、あまり頭に入っていなかった #
  • 青色申告説明会 #
  • なんだか復帰、再起動するたびに修飾キーの設定をやり直してる気がする。 #
  • 3人目! 何書こうかな? #iosadvent2011 / iOS Advent Calendar 2011 : ATND http://t.co/uFIaHjbM via @atnd #
  • リカーシブに #
  • UNLOCALIZED_RESOURCES_FOLDER_PATH にいれればいいのかな #
  • みんなミクシィすきだな #
  • Bundle 配下の HTML ディレクトリツリーのメンテが意外と面倒だなぁ。何か良い方法はないものか #
  • Publish sync for Google+ & Facebook connected successfully!: http://t.co/L9Vv79gE #
  • あしがしびれた #
  • 痺れるだろう? http://t.co/c7nOUTNF #

NSOrderedSet と集合と順序と CoreData

iOS Advent Calendar 2011 3日目です。

今日は iOS5 から新しく仲間になった中でも影が薄い子 NSOrderedSet を紹介します。

そもそも NSArray は使うけど NSSet は馴染みが薄いという人も多いと思いますので、まずは NSSet の復習から入ります。

NSSetと集合

NSSet は NSArray や NSDictionary と同じコレクションクラスで集合を扱うためのクラスです。
UNION(和集合), INTERSECT(積集合), EXCEPT(差集合) などの集合計算が得意で、ある集合に任意の要素がマッチするかどうかという判定が多い場面では有効なクラスです。

和集合:いくつかの集合に含まれている要素を全て集める

    NSArray *worldA = [NSArray arrayWithObjects:@"Kyoma", @"Kurisu", nil];
    NSArray *worldB = [NSArray arrayWithObjects:@"Kyoma", @"Mayuri", nil];
 
    NSMutableSet* worldS = [[NSMutableSet alloc] init];
    [worldS unionSet:[NSSet setWithArray:worldA]];
    [worldS unionSet:[NSSet setWithArray:worldB]];
    NSLog(@"%@", worldS);
    [worldS release];

Kurisu, Mayuri, Kyoma

worldA と worldB の和集合の世界 worldS。

積集合:集合と集合の共通要素を抽出する

    NSArray *worldA = [NSArray arrayWithObjects:@"Kyoma", @"Kurisu", @"Itaru", nil];
    NSArray *worldB = [NSArray arrayWithObjects:@"Kyoma", @"Mayuri", @"Itaru", nil];
 
    NSMutableSet* common = [NSMutableSet setWithArray:worldA];
    [common intersectSet:[NSSet setWithArray:worldB]];
    NSLog(@"%@", common);

Itaru, Kyoma

worldA と worldB の共通要素の積集合の世界 worldC。

差集合:集合から別の集合に含まれる要素を全て取り除く

    NSArray *laboMem = [NSArray arrayWithObjects:@"kyoma", @"Mayuri", @"Itaru", @"Kurisu", @"Moeka", @"Ruka", @"Rumiho", @"Suzuha", nil];
    NSArray *mens = [NSArray arrayWithObjects:@"kyoma", @"Itaru", @"Ruka", nil];
 
    NSMutableSet* notMen = [NSMutableSet setWithArray:laboMem];
    [notMen minusSet:[NSSet setWithArray:mens]];
    NSLog(@"%@", notMen);

Kurisu, Rumiho, Suzuha, Moeka, Mayuri

laboMem から mens を取り除いた差集合 notMen。

NSSetと順序
NSSet 自体には順序情報が無いので、決められた順序で処理をしたい場合には NSArray にする必要があります。
次の様にすることで NSSet の要素を順番に扱うことができます。

    NSArray *laboMem = [NSArray arrayWithObjects:@"Kyoma", @"Mayuri", @"Itaru", @"Kurisu", @"Moeka", @"Ruka", @"Rumiho", @"Suzuha", nil];
 
    NSSet *mySet = [NSSet setWithArray:laboMem];
    NSArray* sorted = [mySet sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"" ascending:NO]]];
    NSLog(@"%@", mySet);
    NSLog(@"%@", sorted);

Kurisu, Rumiho, Suzuha, Itaru, Moeka, Ruka, Mayuri, Kyoma
Itaru, Kurisu, Kyoma, Mayuri, Moeka, Ruka, Rumiho, Suzuha

mySet は順不同ですが、sorted は昇順になりました。

NSSetと順序とCoreData
集合を扱うのが得意な NSSet は CoreData の要素(Entity)の対多関係(To-Many Relationship)で使われています。

一つ前の例では要素(文字列)自体の順番で並べていますが、NSSetを任意の順番で取り出したり、ユーザーによる並び替え等を実現するためには要素の中に順序を表す情報を付加したりします。

@interface Folder : NSManagedObject
@property (nonatomic, retain) NSSet *items;
@end
 
@interface Item : NSManagedObject
@property (nonatomic, retain) NSNumber * order;
@property (nonatomic, retain) Folder *folder;
@end
    NSManagedObjectContext *context = self.managedObjectContext;
    Folder *aFolder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder"
                                                    inManagedObjectContext:context];
    for (int i=0; i<4; i++) {
        Item *aItem = [NSEntityDescription insertNewObjectForEntityForName:@"Item"
                                                  inManagedObjectContext:context];
        aItem.order = [NSNumber numberWithInt:i];
        [aFolder addItemsObject:aItem];
    }
    [context save:nil];
 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" 
                                        inManagedObjectContext:context]];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES]]];
    NSArray *fetchedArray = [context executeFetchRequest:fetchRequest error:nil];

このような感じで NSSet の Item を order の昇順で取り出すことができるようになります。
(ここでは Folder に Item を4件追加して、Item の order 順で NSArray にしています)

しかし、さらに「Item を複数の FavoriteFolder で管理して、FavariteFolder 毎に並び順を変えたい」となると、順序情報を要素から切り出して別に扱う必要が出てきますが、こうなると処理が結構面倒に・・・


そして NSOrderedSet と CoreData
iOS5 で待望の順序付きNSSetである NSOrderedSet が入って来ました!

    NSArray *laboMem = [NSArray arrayWithObjects:@"Kyoma", @"Mayuri", @"Itaru", @"Kurisu", @"Moeka", @"Ruka", @"Rumiho", @"Suzuha", nil];
    NSOrderedSet *myOrder = [NSOrderedSet orderedSetWithArray:laboMem];
    NSLog(@"%@", myOrder);

Kyoma, Mayuri, Itaru, Kurisu, Moeka, Ruka, Rumiho, Suzuha

きちんと元の NSArray の順番を覚えていてくれます!
地味ですが sortedArrayUsingComparator:(NSComparator)cmptr が使えるようになったのもポイントが高いです。
(sortedArrayUsingDescriptors:(NSArray *)sortDescriptors より自由度が高くなりました)
NSMutableOrderedSet を使えば moveObjectsAtIndexes:toIndex: や exchangeObjectAtIndex:withObjectAtIndex: なども。

肝心の CoreData ですが Relationship の設定に “Ordered” が増えています。

これを on にすると NSOrderedSet に!?

error: Unsupported Feature: to-many relationship Folder.items option requires Mac OS X 10.7 or later