Skip to content

Couchbase Meet Upで話してきました。

具体的に追加されてたものだけの紹介です。
他にももちろんいろんな機能があります。

詳しくは公式で。

今はローカルのDBってそこまで活用されてはいないかもしれませんが、ずいぶん手軽に使えるので、これがきっかけに使い始められるといいなあ。

Unityで、当たり判定を保ったままオブジェクトを浮かせて移動させる方法

どうも、unity初心者です。

さっき書いた方法だと、移動させることはできるけど、当たり判定とかMassとかを無視して動かしちゃうから、色々と都合がわるいことが起きた。

調べてたらJointって機能を使ってみればいけるんじゃ?と考え試してみたらビンゴだった。
これで、スカイリムとかオブリビオンとか、FallOutみたいな物の移動ができる!やったぞー!

以下ソース
※前提として、カメラにFixedJointを追加し、Is Kineticをtrueにしています。

これで、Massも、当たり判定もすべて考慮されてものを動かすことが出来る。

ブルブルするけどねw

Unity3Dでオブジェクトを持ち上げ、投げる方法

オブリビオンみたいに、物を持ち上げられないかなーと研究中。
オブリビオンみたいにはできてないけど、暫定で出来たものが以下。

これだと、対象のものを持ち上げて移動し、落とすことは出来るんだけど、持ち上げている時にメインカメラの子にしているから(?)持ち上げ時にものを通り抜けてしまう。

やりたいのは、持ち上げた時にものが通らなかったら通らなくしたい。スターウォーズのフォースみたいに遠隔で持ち上げて操作するっていうのがしたいんだけどどうしたらいいんだろ…。うーん…。

 

Couchbase LiteのCBLUITableSourceを動かしてみた

新たに追加されたクラス、CBLUITableSourceを動かしてみた。
どういうものかというと、UITableViewのDataSourceとCouchbaseLiteのLiveQueryを組み合わせたもの。
CouchbaseLiteにドキュメントを追加すれば、すぐにそれをTableViewが検知して、UITableViewにそのデータが反映される。

Couchbaseが配布している、ToDoLiteにも使われているやつです。

XIBでの利用を前提に作っているらしいのでそれにしたがって設定してみた。
各種環境はできている前提です。

動かしてみよう

まずはプロパティ宣言。
IBOutletを忘れずに。

@property (nonatomic) IBOutlet CBLUITableSource* dataSource;

そしてXIBを開き、ViewにUITableViewを配置。
そしてObjectsにNSObjectを配置し、ClassをCBLUITableSourceに変更します。

そして、さっき配置したUITableViewを以下のように接続

★TableView:
dataSource:さっき配置したCBLUITableSource
delegate:FilesOwner
tableView:CBLUITableSource内にあるtableView

★FilesOwner

dataSource:さっき配置したCBLUITableSource

そして最後に、ViewDidLoadなどで

    self.dataSource.labelProperty = @"text";    // Cellに表示したいドキュメントのプロパティ名
    
    AppDelegate *ap = ApplicationDelegate;
    
    if (_dataSource){
        _dataSource.query = [[ap.database queryAllDocuments] asLiveQuery]; //ここがライブクエリ設定部分
        _dataSource.query.descending = NO;
    }

としてあげれば準備完了です。
あとはドキュメントを追加したりすれば勝手にUITableViewの更新などをやってくれます。お手軽!

UITableViewの見た目や設定を変更したければ、Delegateメソッド用意しているからオーバーライドしていじってみてね、と公式にはあります。

手軽なだけ?

で、手軽にここまで出来るのはいいんですが、実際カスタムするとなると今まで慣れ親しんできたやり方でやりたいなーと思った。
この実装がこの手法でしかできないかって言うとそういうわけでもないですし。

普通に、UITableView配置して、LiveQuery作成して、その通知拾って、更新かける、というのを自分で書いちゃえばいいし、そっちのが今ロールしやすくない?って思っちゃう。

もしかするとそのデリゲートメソッドになにか便利なものがあるかもしれないからなんとも言えないですけどね。
ともかく今回は触ってみたってことで。

Couchbase Lite beta 1.0 では、リレーションシップが組めて面白い。

いま、ごちゃごちゃと触って記事をまとめているのですが、面白かったからこれだけ先に書きたい。

Couchbase LiteのベータがCouchbaseから配布されています。

以前、Couchbase Meet Up で発表をしたのですが、その時からパワーアップしていました。

ほんでちょいちょい触ってみたのですが、CBLModelを利用したリレーションシップが面白い!

そもそも、前回発表した時は、ドキュメント自体はModelを利用せず、NSDictionaryを利用して使っていました。
しかし、CBLModelを利用すれば、

@interface ShoppingItem : CBLModel

@property BOOL      check;
@property (nonatomic, copy)    NSString *type;
@property (nonatomic, copy)    NSString *text;
@property (nonatomic, copy)    NSDictionary *dictionary;
@property (nonatomic, copy)    NSArray *array;
@property (nonatomic, strong)  NSDate *created_at;

@end

@implementation ShoppingItem

@dynamic type, check, text, created_at, dictionary, array;

@end

とすれば、簡単にモデル化でき、あとはこのモデルを初期化して、値を入れてセーブすれば保存が完了します。
以下のように

    // カラのmodelを作成
    ShoppingItem *item = [[ShoppingItem alloc] initWithNewDocumentInDatabase:ap.database];
    
    // プロパティに各種値を入れる
    item.type = @"spItem";
    item.text = numberStr;
    item.check = NO;
    item.created_at = [NSDate date];
    item.dictionary = @{@"key": @"value",
                        @"key2":@"value2"};
    item.array      = @[@"obj1",@"obj2",@"obj3",@"obj4",@"obj5"];
    
    // Save
    NSError *error;
    BOOL ok = [item save:&error];

NSDictionaryで管理するよりめっちゃ簡単。CBLModelを利用すれば、NSDataだって、かってにbase64化してくれるので画像保存もできます。

そして面白いのが、リレーションシップを組めるということです!

新たに別のモデル、ShoppingItemHoldというモデルを作成します。
これは、上記のShoppingItemというモデルに一つだけBoolを追加したものとします。

その場合、以下のように宣言します。

@class ShoppingItem;

@interface ShoppingItemHold : CBLModel

@property (nonatomic, copy) NSString *type;
@property (assign)          ShoppingItem *item;
@property                   BOOL hold;

@end

@implementation ShoppingItemHold
@dynamic type, item, hold;
@end

先ほど作ったModelをそのまんまプロパティとして宣言します(ここはassignのほうが良いと公式でありました)
そうすると、同期先(CouchDBとか)では、その対象となるDocumentIDが保存され、Xcodeプロジェクト内では、そのIDのShoppingItemが勝手に生成されます。

以前NSDictionaryで組んでいた自分としては衝撃的です。だってすんごいめんどくさかったんだもん。
それをたったこれだけで解決できるなんて…。なんていいやつなんだ!

NoSQL、とくにCouchbaseはリレーションが組みにくいって話を1年位前に聞きましたが、こうやってサクッとリレーションが組めるように成って来ているのはいい流れですね。
ドキュメントの構成も考えやすくなるね。

iOS7の、NavigationBarやStatusBarによるレイアウトの潜り込みを解消する

iOS7で、画面左上を起点とするレイアウトが追加されてレイアウトがずれたりします。

今まで知らずに、無理やりレイアウト変えてたんですが、以下でさっくりできました

if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){
        self.edgesForExtendedLayout = UIRectEdgeNone;
}

iOS7で「edgesForExtendedLayout」というプロパティが追加されてたんですね。知らんかったわ…。

intを簡単にカンマ区切りにする

金額とかにカンマ入れますよね。
それって実は簡単にできるようになってた。
以下な感じ。

    int num;
    // 数値にカンマを追加
    NSNumberFormatter *formatter = [NSNumberFormatter new];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    NSString *sPformatted       = [formatter stringFromNumber:[NSNumber numberWithInteger:num]];
    NSString *price             = [NSString stringWithFormat:@"¥%@",sPformatted];

;

調べてみるとこのNSNumberFormatterって色々できるのね。すごい。
その他は以下のほうが詳しい。とても参考になります。

http://dev.classmethod.jp/smartphone/ios-tips-3/