$30 off During Our Annual Pro Sale. View Details »

protocol_buffers.pdf

Kyohei Ito
November 20, 2016
6.1k

 protocol_buffers.pdf

Kyohei Ito

November 20, 2016
Tweet

Transcript

  1. ͜Ε͔Β࢝ΊΔ
    Protocol Buffers ಋೖ
    2016/11/20 iOSΦʔϧελʔζ2

    View Slide

  2. About Me
    ҏ౻ɹګฏ
    Github : KyoheiG3
    Twitter : @KyoheiG3

    View Slide

  3. protobufʢུʣ

    View Slide

  4. protobufͷ؆୯ͳྺ࢙
    • Google͕։ൃͨ͠ɺ௨৴΍ӬଓԽͰͷར༻Λ໨తͱͨ͠γ
    ϦΞϥΠζϑΥʔϚοτ
    • ॳ൛͸2008೥7݄7೔Β͍͠ʢWikipediaΑΓʣ
    • ࠷৽൛͸3.1.0

    View Slide

  5. ͳͥࠓprotobufͳͷ͔ʁ
    • swiftͷprotobufͷϥΠϒϥϦ͸ͦͦ͜͜લ͔Β͋ͬͨ1
    • appleͷgithubʹswift-protobufͷϦϙδτϦ͕ެ։͞Εͨ2
    2 swift-protobuf
    1 protobuf-swift

    View Slide

  6. "I guess Apple decided that JSON
    is a relic of the past along with
    Objective-C" - @cjwirth

    View Slide

  7. Apple͞ΜͷτϨϯυʹ৐͔ͬΓ·͠ΐ͏ʂ

    View Slide

  8. ֓ཁ

    View Slide

  9. JSON΍XMLͷ͓͞Β͍
    • Key Value
    • Text
    • Ϛοϐϯά

    View Slide

  10. protobufͷ࢓૊Έ
    • .protoఆٛ
    • γϦΞϥΠζ/σγϦΞϥΠζ
    • όΠφϦσʔλ௨৴

    View Slide

  11. protobufͷϝϦοτ
    • σʔλྔ
    • ߴ଎
    • ҆શ
    • ڞ༗

    View Slide

  12. protobufͷσϝϦοτ
    • ίϯύΠϧ
    • ಋೖखॱ
    • ֬ೝखॱ

    View Slide

  13. .protoͰఆٛͰ͖Δجຊͷܕ3
    int32
    sint32
    sfixed32
    uint32
    fixed32
    int64
    sint64
    sfixed64
    uint64
    fixed64
    bool
    float
    double
    string
    bytes
    3 apple/swift-protobufͷAPI OverviewΑΓൈਮ

    View Slide

  14. ಋೖ

    View Slide

  15. Կ͸ͱ΋͋ΕprotobufΛೖΕΔ
    $ brew install protobuf

    View Slide

  16. protobufͷSwiftϓϥάΠϯΛ࡞੒
    checkout͢Δλά͸࠷৽ͷ΋ͷ
    $ git clone https://github.com/apple/swift-protobuf.git
    $ cd swift-protobuf
    $ git checkout tags/0.9.24
    $ swift build
    > .build/debug/protoc-gen-swift

    View Slide

  17. ࡞੒ͨ͠ϓϥάΠϯΛ࢖͑ΔΑ͏ʹ͢Δ
    ඞཁʹԠͯ͡೚ҙͷ৔ॴʹஔ͍ͯPATHΛ௨͢
    $ mkdir ~/.protoc
    $ cp .build/debug/protoc-gen-swift ~/.protoc/protoc-gen-swift
    $ echo 'export PATH=$PATH:$HOME/.protoc' >> ~/.bash_profile
    $ source ~/.bash_profile

    View Slide

  18. .protoͷ࡞੒

    View Slide

  19. DataModel.proto
    syntax = "proto3";
    message BookInfo {
    int64 id = 1;
    string title = 2;
    string author = 3;
    }
    message MyLibrary {
    int64 id = 1;
    string name = 2;
    repeated BookInfo books = 3;
    map keys = 4;
    }
    quick-example

    View Slide

  20. syntax
    syntax = "proto3";
    • proto3ͱهड़͠ͳ͍ͱproto2ͱΈͳ͞ΕΔ

    View Slide

  21. message
    message BookInfo {
    }
    • ॴҦΫϥεఆٛ
    • ͜ͷதʹϑΟʔϧυΛఆ͍ٛͯ͘͠

    View Slide

  22. Field Types
    int64 id = 1;
    string title = 2;
    string author = 3;
    • ܕͱม਺໊Λઃఆ͢Δ

    View Slide

  23. Tags
    int64 id = 1;
    string title = 2;
    string author = 3;
    • message಺ͰҰҙͷ਺஋ΛׂΓ౰ͯΔ
    • ॱং͸ߟྀ͠ͳͯ͘΋ྑ͍

    View Slide

  24. Field Rules
    repeated BookInfo books = 3;
    • repeatedͰ഑ྻΛఆٛͰ͖Δ

    View Slide

  25. ͦͷଞ
    • package
    • map
    • enum
    • etc..
    ৄ͘͠͸Language GuideΛࢀর͍ͯͩ͘͠͞ɻ

    View Slide

  26. ΋͏Ұ౓DataModel.proto
    syntax = "proto3";
    message BookInfo {
    int64 id = 1;
    string title = 2;
    string author = 3;
    }
    message MyLibrary {
    int64 id = 1;
    string name = 2;
    repeated BookInfo books = 3;
    map keys = 4;
    }

    View Slide

  27. .protoͷίϯύΠϧ

    View Slide

  28. PATHΛ௨͍ͯ͠Δ৔߹
    $ protoc --swift_out=. DataModel.proto

    View Slide

  29. ϓϥάΠϯΛࢦఆ࣮ͯ͠ߦ͢Δ৔߹
    $ protoc --plugin=protoc-gen-swift=.build/debug/
    protoc-gen-swift --swift_out=. DataModel.proto

    View Slide

  30. ׬੒ !
    ࡞੒͞Εͨ.pb.swiftΛϓϩδΣΫτʹ௥Ճ͠·͠ΐ͏

    View Slide

  31. ͪͳΈʹprotobuf-swiftͩͱ
    $ brew install protobuf-swift
    $ protoc --swift_out=. DataModel.proto

    View Slide

  32. ྫ͑͹goͩͱ
    $ go get github.com/golang/protobuf/protoc-gen-go
    $ protoc --go_out=. DataModel.proto

    View Slide

  33. ࢖͍ํ

    View Slide

  34. ϥΠϒϥϦͷ௥Ճ
    • Package Manager
    dependencies: [
    .Package(url: "https://github.com/apple/swift-protobuf.git", Version(0,9,24))
    ]
    • CocoaPods
    pod 'SwiftProtobuf', git: 'https://github.com/apple/swift-protobuf.git', :tag => '0.9.24'
    ※ϓϥάΠϯΛ࡞੒ͨ࣌͠ͷtagͱΠϯετʔϧόʔδϣϯΛ߹
    Θ͍ͤͯͩ͘͞ɻ

    View Slide

  35. Binary serializable
    γϦΞϥΠζ
    let library = MyLibrary()
    let data = try library.serializeProtobuf()
    σγϦΞϥΠζ
    let library = try MyLibrary(protobuf: data)

    View Slide

  36. JSON serializable
    γϦΞϥΠζ
    let library = MyLibrary()
    let json = try library.serializeJSON()
    σγϦΞϥΠζ
    let json = String(bytes: data, encoding: String.Encoding.utf8)!
    let library = try MyLibrary(json: json)

    View Slide

  37. JSONͱͷڞଘ

    View Slide

  38. JSON request
    let url = URL(string: "http://localhost:8080/")!
    var request = URLRequest(url: url)
    let value = "application/json"
    request.setValue(value, forHTTPHeaderField: "Accept")

    View Slide

  39. protobuf request
    let url = URL(string: "http://localhost:8080/")!
    var request = URLRequest(url: url)
    let value = "application/protobuf"
    request.setValue(value, forHTTPHeaderField: "Accept")

    View Slide

  40. response
    let library = MyLibrary()
    let accept = request.headers["Accept"]
    if accept == "application/protobuf" {
    response.headers["Content-Type"] = "application/protobuf"
    response.send(data: try library.serializeProtobuf())
    } else {
    response.headers["Content-Type"] = "application/json; charset=UTF-8"
    response.send(try library.serializeJSON())
    }

    View Slide

  41. Tips

    View Slide

  42. protobufͷϑΟʔϧυͷมߋʹ͍ͭͯ
    • ϑΟʔϧυͷ௥Ճ͸Մೳ
    • ϑΟʔϧυ໊ͷมߋ͚ͩͳΒಈ͘
    • ϑΟʔϧυܕ·ͰมΘΔ৔߹͸ΤϥʔͱͳΔ

    View Slide

  43. λά൪߸ʹ͍ͭͯ
    • λά൪߸ͰϑΟʔϧυΛࣝผ͢ΔͷͰॏෳແ͘ࢦఆ͢Δ͜ͱ
    • ޙͰมߋ͢Δͷ͸NG

    View Slide

  44. Int64ͷѻ͍ʹ͍ͭͯ
    • jsonʹγϦΞϥΠζͨ͠৔߹ͷৼΔ෣͍
    • ྫ͑͹goͩͱ਺஋ͰฦΔ͕swiftͩͱจࣈྻͰฦΔ

    View Slide

  45. protobufͷόʔδϣϯʹ͍ͭͯ
    • ར༻͢ΔprotocϓϥάΠϯ͕αϙʔτ͢Δprotobufͷόʔδ
    ϣϯͱɺ.proto͔ΒίʔυΛੜ੒͢Δࡍͷprotobufͷόʔδ
    ϣϯΛಉ͡ʹ͢Δ͜ͱ
    ࢀߟʣHomebrewͰچόʔδϣϯͷύοέʔδΛΠϯετʔ
    ϧ͍ͨ͠

    View Slide

  46. ͲͷϓϥάΠϯΛར༻͢Δ͔
    • apple/swift-protobuf ͸ struct
    • alexeyxo/protobuf-swift ͸ class

    View Slide

  47. ੜ੒ϑΝΠϧͷهड़ྔ
    apple/swift-protobuf < alexeyxo/protobuf-swift

    View Slide

  48. Swift Protobuf ͷ஫ҙ఺
    • ίʔυޓ׵ੑ͕ແ͘ͳΔΑ͏ͳੵۃతͳվม͕ߦΘΕ͍ͯΔ
    • ϝδϟʔόʔδϣϯ͸·ͩ 0

    View Slide

  49. σϞ
    https://github.com/KyoheiG3/ProtobufExample

    View Slide

  50. Thanks!

    View Slide