SlideShare a Scribd company logo
1 of 51
Download to read offline
実践Realm
Realm meetup #1
@yusuga_
菅原 祐
@yusuga_
Picos LLC.
• 札幌
• 自社アプリ開発
• Web制作の受託業務
Aplosの課題
• CoreDataを使用。
• Fetchは高速だがInsert, Updateが重い。
• データベースが肥大化するにつれて指数関
数的に処理時間が増える。
詳しくは
- CoreDataをRealmに移行し高速化できた
のでベンチマークで性能を比較してみた。
- CoreDataからRealmに移行してわかった
メリット/デメリット
Search: qiita yusuga
1. 基本編
2. 実践編
3. JPさんに聞いてみた
基本編
#1
テーブル定義
{
"venues": [
{
"id": "4c82f252d92ea09323185072",
"name": "Golden Gate Park",
"contact": {
"phone": "4152522590"
},
"location": {
"lat": 37.773835608329,
"lng": -122.41962432861,
"postalCode": "94103",
"cc": "US",
"state": "California",
"country": "United States"
}
}
]
}
// Venue.h
@interface Venue : RLMObject
@property NSString *id;
@property NSString *name;
@property Contact *contact;
@property Location *location;
@end
// Contact.h
@interface Contact : RLMObject
@property NSString *phone;
@end
// Location.h
@interface Location : RLMObject
@property double lat; // latitude
@property double lng; // longitude
@property NSString *postalCode;
@property NSString *cc;
@property NSString *state;
@property NSString *country;
@end
テーブル定義 == クラス定義
Insert
1 //Extract the array of venues from the response
2 NSArray *venues = json[@"venues"];
3
4 RLMRealm *realm = [RLMRealm defaultRealm];
5 [realm beginWriteTransaction];
6 // Save one Venue object (and dependents)
7 // for each element of the array
8 for (NSDictionary *venue in venues) {
9 [Venue createOrUpdateInDefaultRealmWithObject:venue];
10 }
11 [realm commitWriteTransaction];
Insert
1 // Create object
2 Person *author = [[Person alloc] init];
3 author.name = @"David Foster Wallace";
4
5 // Get the default Realm
6 RLMRealm *realm = [RLMRealm defaultRealm];
7 // You only need to do this once (per thread)
8
9 // Add to Realm with transaction
10 [realm beginWriteTransaction];
11 [realm addObject:author];
12 [realm commitWriteTransaction];
contextに依存しない
Update
1 // Update an object with a transaction
2 [realm beginWriteTransaction];
3 author.name = @"Thomas Pynchon";
4 [realm commitWriteTransaction];
Delete
1 Book *cheeseBook = ... //Book we made previously
2
3 // Update an object with a transaction
4 [realm beginWriteTransaction];
5 [realm deleteObject:cheeseBook];
6 [realm commitWriteTransaction];
Fetch
1 // Query using a predicate string
2 RLMResults *tanDogs = [Dog objectsWhere:
@"color = 'tan' AND name BEGINSWITH 'B'"];
3
4 // Query using an NSPredicate object
5 NSPredicate *pred = [NSPredicate predicateWithFormat:
@"color = %@ AND name BEGINSWITH %@“, @"tan", @"B"];
6 tanDogs = [Dog objectsWithPredicate:pred];
Fetch
1 RLMResults *tanDogs =
[Dog objectsWhere:@"color = ‘tan'"];
2 RLMResults *tanDogsWithBNames =
[tanDogs objectsWhere:@"name BEGINSWITH 'B'"];
Chaining Queries
Fetch
1 // Sort tan dogs with names starting with "B" by name
2 RLMResults *dogs = [Dog objectsWhere:
@"color = 'tan' AND name BEGINSWITH 'B'"];
3 RLMResults *sortedDogs = [dogs sortedResultsUsingProperty:
@"name" ascending:YES];
Sort
RLMResults
RLMResults *tweets = [Tweet objectsWhere:@"retweeted = YES"];
• NSFetchedResultsControllerのモデル版の様なもの
• 変更タイミングはNotificationを利用
Async
1 dispatch_async(queue, ^{
2 // Get realm and table instances for this thread
3 RLMRealm *realm = [RLMRealm defaultRealm];
4
5 [realm beginWriteTransaction];
6
7 for (NSInteger idx = 0; idx < 1000; idx++) {
8 [Person createInRealm:realm
9 withObject:@{@"name" : [self randomString],
10 @"birthdate" : [self randomDate]}];
11 }
12
13 // Commit the write transaction
14 // to make this data available to other threads
15 [realm commitWriteTransaction];
16 });
Migration
1 [RLMRealm setSchemaVersion:1
2 forRealmAtPath:[RLMRealm defaultRealmPath]
3 withMigrationBlock:^(RLMMigration *migration,
4 NSUInteger oldSchemaVersion) {
5 // We havent migrated anything yet so oldSchemaVersion == 0
6 if (oldSchemaVersion < 1) {
7 // Nothing to do!
8 // Realm will automatically detect new properties and removed
9 properties
10 // And will update the schema on disk automatically
11 }
12 }];
Realm Browser
実践編
#2
Realm
あるある
例外
テーブル定義 (おさらい)
{
"venues": [
{
"id": "4c82f252d92ea09323185072",
"name": "Golden Gate Park",
"contact": {
"phone": "4152522590"
},
"location": {
"lat": 37.773835608329,
"lng": -122.41962432861,
"postalCode": "94103",
"cc": "US",
"state": "California",
"country": "United States"
}
}
]
}
// Venue.h
@interface Venue : RLMObject
@property NSString *id;
@property NSString *name;
@property Contact *contact;
@property Location *location;
@end
// Contact.h
@interface Contact : RLMObject
@property NSString *phone;
@end
// Location.h
@interface Location : RLMObject
@property double lat; // latitude
@property double lng; // longitude
@property NSString *postalCode;
@property NSString *cc;
@property NSString *state;
@property NSString *country;
@end
Init
[[Venue alloc] initWithObject:venue];
• NSString, NSDate, NSDataはnilを許容できない。
• + (NSDictionary *)defaultPropertyValues
• + (NSArray *)ignoredProperties
• NSNullは例外
• JSONオブジェクトからNSNullを削除
• -initWithObject:を自前で実装
• API, DBがコントロール可能か。
Notification
1 // Observe Realm Notifications
2 self.token = [realm addNotificationBlock:^(NSString *note,
3 RLMRealm * realm) {
4 [myViewController updateUI];
5 }];
• 強参照必須

(内部はweak to weakのNSMapTable)
In memory
+ (instancetype)inMemoryRealmWithIdentifier:(NSString *)identifier;
• 強参照必須
• Documentに空のDBファイルができる。

永続化しているDBともIdentifierが被らないように注意。
Multi thread
1 RLMRealm *realm = [RLMRealm realmWithPath:realmPath];
2
3 dispatch_async(queue, ^{
4 RLMRealm *realm = [RLMRealm realmWithPath:realmPath];
5 };
• RLMRealm, RLMObjectなどは異なるスレッド間をまたげ
ない。
• RLMRealmはスレッドID毎にキャッシュされている。
RLMResults
1 [realm beginWriteTransaction];
2 RLMResults *results = … // Fetch
3 for (NSObject *obj in results) {
4 /* Update */
5 }
6 [realm commitWriteTransaction];
• RLMResultsをforin内で変更すると列挙される順序も変更
される。
for-in
Unsupported predicates
LIKE
MATCHES
ALL
All key path collection queries
(@avg, @count, @min, @max, @sum)
SUBQUERY
https://github.com/realm/realm-cocoa/issues/1490
Unsupported predicates
// Realm(0.88.0) Unsupported operator.
// Multi-level object equality link queries are not supported.
[Tweet objectsWhere:@"retweeted_status.user != nil"];
Unsupported predicates
// hastagsでいずれかの要素が空要素でない -> 1つ以上要素を持つ
[Tweet objectsWhere:@"ANY hashtags.text != ''"];
@countしたい…
現状の仕様の中で
乗り切る
Completion
1 dispatch_async(queue, ^{
2 RLMRealm *realm = [self realm];
3 [realm beginWriteTransaction];
4 /* Write process */
5 [realm commitWriteTransaction];
6 dispatch_async(dispatch_get_main_queue(), ^{
7 [[self realm] refresh]; // Ensure update
8 if (completion) completion();
9 });
10 });
Async fetch
1 dispatch_async(queue, ^{
2 /* Complex fetch */
3
5 Class resultClass = ...;
6 NSString *primaryKey = ...;
7 NSArray *primaryIDs = ...;
8
9 dispatch_async(dispatch_get_main_queue(), ^{
10 RLMResults *results = [resultClass objectsInRealm:[self realm]
11 where:@"%K IN %@", primaryKey, primaryIDs];
12 });
13 });
• primary keyがある場合限定
• RLMResultsが条件で反映されないのでおすすめはできない
CoreData ObjectID
vs
Realm %K IN %@
http://qiita.com/yusuga/items/2a2cbf13080e1bed642f
Delete ruleがない
1 NSArray *relatedObjects [user oneToOneRelatedObjects];
2 NSArray *objects = [@[user]
arrayByAddingObjectsFromArray:relatedObjects];
3
4 [realm deleteObjects:objects];
• 子オブジェクトが消えない
• Add, Delete時に注意
JPさんに
#3
聞いてみた
Q. Async Fetchしたいです!
background-query
を予定!
Q. Delete ruleも欲しいです!
cascading deletes
を予定!
Q. nullで困ってます
Nullable typesを予定!
- nullがそのまま入るように。
- BOOLとかprimitive型の対応も考えて
る。
https://github.com/realm/realm-cocoa/issues/628
Q. NSPredicateの対応はどこ
まで?
できる限りカバーする。

https://github.com/realm/realm-cocoa/issues/1490
Q. Realmごとにテーブル定義を
したい
+[RLMRealm
registerModelClasses:forRealmsAtPath:]
のような対応を予定。
優先度は低い。
https://github.com/realm/realm-cocoa/issues/1506
Q. Limitがないのはどういう設
計思想?
モバイルアプリにおいてデータは
全て表示するべき。
どうしてもLimitしたい場合は、
RLMResultsから表示数を限定。
Q. それだと基本、全件Fetch
だけどメモリの問題は?
ノープロブレム!
Realmのメモリ使用について
• DBのデータは一切メモリに展開していない。
• データは直接DBファイルにアクセスしているので、
RLMResultsは全データのポインタのみを保持。
• FetchしてRLMResultsが生成出来た時点でメモリが
足りているなら、今後Realmが起因するメモリワー
ニングは発生しない。
Q. 1.0のリリース予定日は?
Swiftみたいに 不完全なもの
はリリースさせたくない。

時期未定。
Work In Progress
- Multiprocess
- Fine-grain notifications
- Async queries
- Cascading deletes
- Nullable types
- Sync
- Open source Core
まとめ
• モダン/コード量が減る
• 高速
• 現状でも通常の利用要件は満たすレベル
• 速さとのトレードオフ
Realm v0.91.1
今後の更なる発展を期待

More Related Content

What's hot

Getting Started Japanese Search and Calculate Similarity with Apache Lucene
Getting Started Japanese Search and Calculate Similarity with Apache LuceneGetting Started Japanese Search and Calculate Similarity with Apache Lucene
Getting Started Japanese Search and Calculate Similarity with Apache LuceneEiji Shinohara
 
Hadoop Troubleshooting 101 - Japanese Version
Hadoop Troubleshooting 101 - Japanese VersionHadoop Troubleshooting 101 - Japanese Version
Hadoop Troubleshooting 101 - Japanese VersionCloudera, Inc.
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringEiji Shinohara
 
RubyもApache Arrowでデータ処理言語の仲間入り
RubyもApache Arrowでデータ処理言語の仲間入りRubyもApache Arrowでデータ処理言語の仲間入り
RubyもApache Arrowでデータ処理言語の仲間入りKouhei Sutou
 
Androidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリAndroidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリYukiya Nakagawa
 
JavaScriptから利用するFirebase
JavaScriptから利用するFirebaseJavaScriptから利用するFirebase
JavaScriptから利用するFirebaseTakuji Shimokawa
 
How Smalltalker Works
How Smalltalker WorksHow Smalltalker Works
How Smalltalker WorksSho Yoshida
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!Kouhei Sutou
 
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)Hadoop / Spark Conference Japan
 
AngularFireで楽々バックエンド
AngularFireで楽々バックエンドAngularFireで楽々バックエンド
AngularFireで楽々バックエンドYosuke Onoue
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発Fumihiko Shiroyama
 
Terraform始めました
Terraform始めましたTerraform始めました
Terraform始めましたw1mvy pine
 
お金をかけないDBチューニング
お金をかけないDBチューニングお金をかけないDBチューニング
お金をかけないDBチューニングKazuya Sato
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアKouhei Sutou
 
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発Nomura Yusuke
 
Programming Hive Reading #3
Programming Hive Reading #3Programming Hive Reading #3
Programming Hive Reading #3moai kids
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Daisuke Kikuchi
 
Hatoholのログ蓄積・検索機能 2014/12版
Hatoholのログ蓄積・検索機能 2014/12版Hatoholのログ蓄積・検索機能 2014/12版
Hatoholのログ蓄積・検索機能 2014/12版Kouhei Sutou
 

What's hot (20)

Getting Started Japanese Search and Calculate Similarity with Apache Lucene
Getting Started Japanese Search and Calculate Similarity with Apache LuceneGetting Started Japanese Search and Calculate Similarity with Apache Lucene
Getting Started Japanese Search and Calculate Similarity with Apache Lucene
 
Hadoop Troubleshooting 101 - Japanese Version
Hadoop Troubleshooting 101 - Japanese VersionHadoop Troubleshooting 101 - Japanese Version
Hadoop Troubleshooting 101 - Japanese Version
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 Spring
 
RubyもApache Arrowでデータ処理言語の仲間入り
RubyもApache Arrowでデータ処理言語の仲間入りRubyもApache Arrowでデータ処理言語の仲間入り
RubyもApache Arrowでデータ処理言語の仲間入り
 
Androidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリAndroidで使えるJSON-Javaライブラリ
Androidで使えるJSON-Javaライブラリ
 
JavaScriptから利用するFirebase
JavaScriptから利用するFirebaseJavaScriptから利用するFirebase
JavaScriptから利用するFirebase
 
How Smalltalker Works
How Smalltalker WorksHow Smalltalker Works
How Smalltalker Works
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
 
AngularFireで楽々バックエンド
AngularFireで楽々バックエンドAngularFireで楽々バックエンド
AngularFireで楽々バックエンド
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
 
Terraform始めました
Terraform始めましたTerraform始めました
Terraform始めました
 
お金をかけないDBチューニング
お金をかけないDBチューニングお金をかけないDBチューニング
お金をかけないDBチューニング
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェア
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
MapReduce入門
MapReduce入門MapReduce入門
MapReduce入門
 
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発
 
Programming Hive Reading #3
Programming Hive Reading #3Programming Hive Reading #3
Programming Hive Reading #3
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)
 
Hatoholのログ蓄積・検索機能 2014/12版
Hatoholのログ蓄積・検索機能 2014/12版Hatoholのログ蓄積・検索機能 2014/12版
Hatoholのログ蓄積・検索機能 2014/12版
 

Similar to 実践Realm

RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -次朗 永島
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5Nishida Kansuke
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門Hisashi HATAKEYAMA
 
Beginning Java EE 6 勉強会(2) #bje_study
Beginning Java EE 6 勉強会(2) #bje_studyBeginning Java EE 6 勉強会(2) #bje_study
Beginning Java EE 6 勉強会(2) #bje_studyKinji Akemine
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-uedayou
 
WebAppDev勉強会 #2 at cafe? IKAGAWA DO
WebAppDev勉強会 #2 at cafe? IKAGAWA DOWebAppDev勉強会 #2 at cafe? IKAGAWA DO
WebAppDev勉強会 #2 at cafe? IKAGAWA DOKohei Noda
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 TokyoYoshiyuki Asaba
 
Cinnamon - simple deploy tool
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy toolYuki Shibazaki
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413Funato Takashi
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews, Inc.
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクションAkio Mitobe
 
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーション.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーションYoshifumi Kawai
 
20181031 springfest spring data geode
20181031 springfest spring data geode20181031 springfest spring data geode
20181031 springfest spring data geodeMasaki Yamakawa
 

Similar to 実践Realm (20)

RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
RestKitの紹介 - Webサービスのクライアント実装補助フレームワーク -
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
Teclab3
Teclab3Teclab3
Teclab3
 
Beginning Java EE 6 勉強会(2) #bje_study
Beginning Java EE 6 勉強会(2) #bje_studyBeginning Java EE 6 勉強会(2) #bje_study
Beginning Java EE 6 勉強会(2) #bje_study
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
 
AWS小ネタ集
AWS小ネタ集AWS小ネタ集
AWS小ネタ集
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
 
WebAppDev勉強会 #2 at cafe? IKAGAWA DO
WebAppDev勉強会 #2 at cafe? IKAGAWA DOWebAppDev勉強会 #2 at cafe? IKAGAWA DO
WebAppDev勉強会 #2 at cafe? IKAGAWA DO
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
 
Ansible入門
Ansible入門Ansible入門
Ansible入門
 
Cinnamon - simple deploy tool
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy tool
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413
 
Gossip事始め
Gossip事始めGossip事始め
Gossip事始め
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクション
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーション.NET最先端技術によるハイパフォーマンスウェブアプリケーション
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
 
20181031 springfest spring data geode
20181031 springfest spring data geode20181031 springfest spring data geode
20181031 springfest spring data geode
 
Heroku Postgres
Heroku PostgresHeroku Postgres
Heroku Postgres
 

実践Realm