Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Monocle
とかいうのがありまして
2015/05/30 Naoki Aoyama (@aoiroaoino)
おまえ誰だよ?
Naoki Aoyama
Twitte/GtiHub: @aoiroaoino
Maverick., inc
Programmer(Scala, JavaScript)
にゃーん
BSONとかいうのがありまして
BSONは主にMongoDBのデータストレージ及びネッ
トワーク転送フォーマットとして利用されている、
データ交換フォーマットである。 単純なデータ構
造や連想配列(MongoDBではオブジェクトまたは
ドキュメ...
http://mongodb.github.io/mongo-java-driver/3.0/bson/documents/
BSON type - Java type
例えば、こんなBSONがありまして
// bson1
{
"id": 1,
"name": "Aoino",
"address": [
"Tokyo",
"Ibaraki"
]
}
// bson2
[
1,
2,
3
]
BSONデータの作成
(in Java MongoDB Driver)
val bson1 = new BsonDocument()

.append("id", new BsonInt64(1))
.append("name", new Bs...
BSONの操作
(in Java MongoDB Driver)
scala> val reader = new BsonDocumentReader(bison1)
reader: org.bson.BsonDocumentReader = ...
チョットつらい…
Prismを定義してみる
object BSONPrism {
type BSONValue = org.bson.BsonValue
type BSONArray = org.bson.BsonArray
type BSONInt32 = o...
BSONの操作 [1] 

(Scala + Monocle)
(bsonDocument composeOptional index("id")
composePrism bsonInt64
).getOption(bson1)
//=> S...
BSONの操作 [2] 

(Scala + Monocle)
(bsonArray composeOptional index(1)
composePrism bsonInt32
).set(999)(bson2)
//=> BsonArra...
https://github.com/julien-truffaut/Monocle/wiki/Release-note-1.0
Alias methods
\もっと短く書ける/
(bsonDocument ^|-? index("address")
^<-? bsonArray
^|-? index(0)
^<-? bsonString)
.modify(_.toLowerCase)(bison1...
まとめ
MonocleでPrismを定義する方法
Prismを使っての操作方法
もしかしてJavaのライブラリ包む時に便利かも?
Prochain SlideShare
Chargement dans…5
×

Monocleとかいうのがありまして

2 715 vues

Publié le

2015/05/30 Lens&Prism勉強会

Publié dans : Logiciels
  • Identifiez-vous pour voir les commentaires

Monocleとかいうのがありまして

  1. 1. Monocle とかいうのがありまして 2015/05/30 Naoki Aoyama (@aoiroaoino)
  2. 2. おまえ誰だよ? Naoki Aoyama Twitte/GtiHub: @aoiroaoino Maverick., inc Programmer(Scala, JavaScript) にゃーん
  3. 3. BSONとかいうのがありまして BSONは主にMongoDBのデータストレージ及びネッ トワーク転送フォーマットとして利用されている、 データ交換フォーマットである。 単純なデータ構 造や連想配列(MongoDBではオブジェクトまたは ドキュメントと表す)を示すバイナリ構造であ り、 名称はJSON由来であり"バイナリ型JSON"の略 語である。(wikipedia - BSON より)
  4. 4. http://mongodb.github.io/mongo-java-driver/3.0/bson/documents/ BSON type - Java type
  5. 5. 例えば、こんなBSONがありまして // bson1 { "id": 1, "name": "Aoino", "address": [ "Tokyo", "Ibaraki" ] } // bson2 [ 1, 2, 3 ]
  6. 6. BSONデータの作成 (in Java MongoDB Driver) val bson1 = new BsonDocument()
 .append("id", new BsonInt64(1)) .append("name", new BsonString("Aoino")) .append("address", new BsonArray(Arrays.asList( new BsonString("Tokyo"), new BsonString("Ibaraki"))) val bson2 = new BsonArray(Arrays.asList( new BsonInt32(1), new BsonInt32(2), new BsonInt32(3)))
  7. 7. BSONの操作 (in Java MongoDB Driver) scala> val reader = new BsonDocumentReader(bison1) reader: org.bson.BsonDocumentReader = org.bson.BsonDocumentReader@2d81357d scala> reader.readStartDocument() scala> reader.readName() res33: String = id scala> reader.readInt64() res34: Long = 1 scala> reader.readString() // あっ、readName()忘れた! res35: String = Aoino scala> reader.readName() res36: String = address scala> reader.readString() // BsonArrayに対してreadString()呼んじゃった! org.bson.BsonInvalidOperationException: readString can only be called when CurrentBSONType is STRING, not when CurrentBSONType is ARRAY. at org.bson.AbstractBsonReader.verifyBSONType(AbstractBsonReader.java:655) at org.bson.AbstractBsonReader.checkPreconditions(AbstractBsonReader.java:687) at org.bson.AbstractBsonReader.readString(AbstractBsonReader.java:428) ... 43 elided
  8. 8. チョットつらい…
  9. 9. Prismを定義してみる object BSONPrism { type BSONValue = org.bson.BsonValue type BSONArray = org.bson.BsonArray type BSONInt32 = org.bson.BsonInt32 type BSONInt64 = … val bsonArray = Prism[BSONValue, List[BSONValue]]{ case x: BSONArray => Option(x.getValues.toList) case _ => None }(new BSONArray(_)) val bsonInt32 = Prism[BSONValue, Int]{ case x: BSONInt32 => Option(x.getValue) case _ => None }(new BSONInt32(_)) … }
  10. 10. BSONの操作 [1] 
 (Scala + Monocle) (bsonDocument composeOptional index("id") composePrism bsonInt64 ).getOption(bson1) //=> Some(1) (bsonDocument composeOptional index("address") composePrism bsonArray composeOptional index(0) composePrism bsonString ).modify(_.toLowerCase)(bson1) //=> { "id" : { "$numberLong" : "1" }, "name" : "Aoino", "address" : ["tokyo", "Ibaraki"]} ※(1)
  11. 11. BSONの操作 [2] 
 (Scala + Monocle) (bsonArray composeOptional index(1) composePrism bsonInt32 ).set(999)(bson2) //=> BsonArray{values=[ BsonInt32{value=1},BsonInt32{value=999},BsonInt32{value=3}]} ※(2) (bsonArray composeTraversal each composePrism bsonInt32 ).modify(_ * 100)(bson2) //=> BsonArray{values=[ BsonInt32{value=100},BsonInt32{value=200},BsonInt32{value=300}]} ※(3)
  12. 12. https://github.com/julien-truffaut/Monocle/wiki/Release-note-1.0 Alias methods
  13. 13. \もっと短く書ける/ (bsonDocument ^|-? index("address") ^<-? bsonArray ^|-? index(0) ^<-? bsonString) .modify(_.toLowerCase)(bison1) //=> (1)に同じ (bsonArray ^|-? index(1) ^<-? bsonInt32 ).set(999)(bson) //=> ※(2)に同じ (bsonArray ^|->> each ^<-? bsonInt32 ).modify(_ * 1000)(bson) //=> ※(3)に同じ
  14. 14. まとめ MonocleでPrismを定義する方法 Prismを使っての操作方法 もしかしてJavaのライブラリ包む時に便利かも?

×