Upgrade to Pro — share decks privately, control downloads, hide ads and more …

動け!Golang 〜圧倒的IoTツール開発へようこそ〜

動け!Golang 〜圧倒的IoTツール開発へようこそ〜

「――くやしくって死にそう。」

このままこの子達を公開できなかったら。

IoTベンチャーを起業して2年。製品だけがIoTじゃない!
裏でうごめくIoTツール達の開発をこの機会に一挙大放出\(^o^)/

・[メイン]工場で動け!最強のIoTツール (net/http, gatt, go-bindata-assetfs...)
・基板の検査?それiOS(Swift, CoreBluetooth)でできるよ!
・工場でのID管理、シールプリンターを外部制御でIoT化(Windows10 ,IE11 ,JS)
・IoTの実験ツールで効率化!(Google Apps Script, Swift, CoreBluetooth)
・プロトタイプ開発ならRaspberry Pi(PaSoRi, Python, Node, RxJS)
・ゼロから始めるバイナリ生活(Ruby, Python, Perl)
・初めての中国…/// (LCC)
・他

そして、次のIoTが始まるのです!

https://builderscon.io/builderscon/tokyo/2016/session/8ea5b1e1-ba5a-4e47-9b2b-37ef36213406

Kazuhiro Homma

December 03, 2016
Tweet

More Decks by Kazuhiro Homma

Other Decks in Technology

Transcript

  1. 動け!Golang
    〜圧倒的IoTツール開発へようこそ〜
    2016/12/03 builderscon 2016
    株式会社Photosynth 取締役CTO
    本間 和弘 @kazuph

    View Slide

  2. ⾃⼰紹介
    • @kazuph / 本間 和弘
    • 株式会社Gaiax 元新卒Webプログラマー
    • 独⽴しIoTプロダクト「Akerun」の開発者に
    • 創業メンバー / 取締役 / CTO
    • メインアーキテクト / メインプログラマ 

    →エンジニア統括
    • Perl→Ruby→Java→Obj-C→C→Golang→GAS(??)
    • Tuba(チューバ)歴11年、リアルあの世界で

    過ごしました

    View Slide

  3. YAPC::Asia Tokyo

    View Slide

  4. 4NBSU-PDL3PCPU

    View Slide

  5. View Slide


  6. "LFSVO
    ىۀ
    "LFSVO1SP

    "LFSVOൢച։࢝

    1SP։ൃ։࢝

    1SPൢച։࢝
    4NBSU-PDL3PCPU
    *P5੡඼Λͨ͘͞Μͭͬͨ͘Α
    ࣮͸"LFSVOҎ֎ͷ৽ϓϩμΫτ΋ଓʑग़͍ͯ͠Δ͕ɺ
    શମϦιʔεΛ͢΂ͯ࢖͏΄ͲͰͳ͔ͬͨͨΊɺࠓ·Ͱ
    ͷӡ༻Ͱ΋ͳΜͱ͔ͳͬͨɻ

    View Slide

  7. IoT開発に必要な要素
    Ϗδωε
    ϑΝΠφϯε
    ϚʔέςΟϯά
    Ӧۀ
    ޿ใ
    ϝΧ
    ΤϨΩ
    ϑΝʔϜ΢ΣΞ
    εϚϗΞϓϦ
    αʔόʔαΠυ
    $4
    ௐୡ
    ޻৔
    ։ൃ ੡଄
    ϩδεςΟΫε

    View Slide

  8. IoT開発に必要な要素
    Ϗδωε
    ϑΝΠφϯε
    ϚʔέςΟϯά
    Ӧۀ
    ޿ใ
    ϝΧ
    ΤϨΩ
    ϑΝʔϜ΢ΣΞ
    εϚϗΞϓϦ
    αʔόʔαΠυ
    $4
    ௐୡ
    ޻৔
    ։ൃ ੜ࢈؅ཧ
    ϩδεςΟΫε
    Internet
    +of Things

    View Slide

  9. IoT開発に必要な要素
    Ϗδωε
    ϑΝΠφϯε
    ϚʔέςΟϯά
    Ӧۀ
    ޿ใ
    ϝΧ
    ΤϨΩ
    ϑΝʔϜ΢ΣΞ
    εϚϗΞϓϦ
    αʔόʔαΠυ
    $4
    ௐୡ
    ޻৔
    ։ൃ ੡଄
    ϩδεςΟΫε

    View Slide

  10. View Slide

  11. 今⽇はこんな感じの内容を話します
    • ⼯場で動くIoTツール
    • iOSアプリ経由での基板・製品検査
    • シールプリンターをIoT的に動かす
    • 初めての中国…/// (LCC)
    • 他

    View Slide

  12. 正直つくっていたら思ってい
    たよりもマニアックになった

    View Slide

  13. GolangというよりもIoTの同
    業者向けの資料になりました
    (汗)

    View Slide

  14. IoTと⼯場

    View Slide

  15. ⼯場でなにをやっているの?
    w੡඼ͷ૊Έཱͯɺࠝแɺൃૹ
    w޻ఔ؅ཧܥ
    wϑΝʔϜ΢ΣΞͷ*%
    w࡞ۀͷ੒ޭɾࣦഊͷ೺Ѳ
    wج൘΍ᝑମʹషΔγʔϧͷൃߦ
    wݕࠪܥ
    wج൘ͷݕࠪ
    w෦඼ͷݕࠪ
    w૊Έཱͯޙͷݕࠪ
    ճ࿏ ෦඼
    ᝑମ

    View Slide

  16. ⼯場で必要なもの
    • 単なる玩具と違いすべての個体が別々のIDを持つ
    • 基板(マイコン)への書込み時に、なんらかの書き換え作業が必要
    • 世の中にはExcel台帳+⼿作業でがんばっている⼈もいると聞い
    たことがあるが無理
    • 基板・筐体の検査をすべて⼿作業は時間がかかる
    • ⼯場での時間はそのままコストになる
    • ⾃動化したい

    View Slide

  17. IoTで⼯場も⾃動化する!

    View Slide

  18. どうやってつくった?

    View Slide

  19. ⼯場IoTツールでの⾃動化
    • v1.0(2015初期)
    • FW書込みを⾃動化
    • 組み⽴て後検査を⾃動化
    • v1.1(2015中期〜)
    • FW書込み後検査を⾃動化
    • v2.0(2016)
    • 新製品のためにすべてをブ
    ラッシュアップ
    "843BJMT
    8FC"1*
    γϦΞϧ௨৴
    #-&௨৴

    ֎෦ηϯαʔ

    View Slide

  20. ⼯場IoTツール構成
    • v1.0(2015初期)
    • mac + Chrome(sinatra)+ shell
    • iPod + iOS app(Obj-C)
    • v1.1(2015中期〜)
    • mac + app(Obj-C) + shell
    • Arduino
    • iPod + iOS app(Obj-C)
    • v2.0(2016)
    • Raspberry Pi + golang + shell
    • iPod + iOS app(Swift)
    "843BJMT
    8FC"1*
    γϦΞϧ௨৴
    #-&௨৴

    ֎෦ηϯαʔ

    View Slide

  21. 実際のフロー

    ※v2.0の場合

    View Slide

  22. ファームウェアの書き込み
    エンジニアが丹精込めてファームウェアの

    バイナリを作成する

    ↓

    Raspberry Piに配置

    ↓

    WebAPIで品番に対応するID情報を取得

    ↓

    ID部分をPerlワンライナーで置換

    IntelHex形式のものはPython/Rubyで頑張って変換

    ↓

    UART/JLinkを使って基板にファームウェアを書き込む
    ʜ
    ʜ

    View Slide

  23. 書込後基板の検査
    ファームウェア書込済み基板の検査開始

    ↓

    有線シリアル通信や無線BLE通信で各センサーの
    値を取得し基準値か確認

    ↓

    最後に出荷モードもしくは

    出荷⽤ファームウェアを別途書き込み

    ↓

    WebAPI経由で書込み・検査が終了した旨を送る

    ↓

    Slackなどで通知

    View Slide

  24. 組み⽴て後製品の検査
    書込み済み基板や他の部品・筐体を全部組み
    合わせて製品を完成させる

    ↓

    組み⽴て後に検査は⼈の⼿とiPodにて⾏う

    ↓

    作業①→検査①→作業②→検査②・・・

    ↓

    動作試験が完了したら出荷状態にして

    梱包して発送しておわり

    View Slide

  25. できたもの

    View Slide

  26. ⼯場ツール v1.0
    • ⼯場の⼈達が実際に↓をいじりながら作業していた
    • FWの書込みの成功失敗がわかり⼿順をわかりやすく表⽰した

    View Slide

  27. ⼯場ツール v1.0
    • 製品開発の忙しいときに作成しないといけなかったの
    で、「今⽇はツールハッカソンの⽇」として突貫でほ
    ぼ1⽇でつくった
    • 256⾏のapp.rbと43⾏のshellのみ
    • 1ファイルのSinatraになったが⼤きなツールじゃない
    ので、最後まで困らなかった
    • Slack連携を最初からしていたので、失敗が続くとき
    は、こちらから⼯場へ連絡して作業の改善を⾏った

    View Slide

  28. CLIから普通に使えるShellを書き
    #!/bin/bash -eu
    # Usage) ./write.sh …
    DEVICE_ADDR=$1
    SERVICE_UUID=$2

    DEVICE_NAME=${11}
    echo “ஔ׵ॲཧ…”
    perl -i -p -e "s/(__ID_AKERUN) (.*)?$/\$1 ${SERVICE_UUID}/"
    $AKERUN_DB_H_FILE

    perl -i -p -e "s/(DEVICE_NAME) (.*)?$/\$1 ""\"$
    {DEVICE_NAME}""\"/" $AKERUN_H_FILE
    echo "MAKE"
    cd $SDK_PATH && ./make clean && ./make akerun download

    View Slide

  29. Rubyから雑に叩く
    result = RestClient.get “#{url}/#{id}“

    p firmware_id = `./build_akerun_firmware.sh \
    '#{result["device_addr"]}' \
    '#{result["uuid"]}' \


    '#{result["local_name"]}'`

    View Slide

  30. ⼯場ツール v1.1

    View Slide

  31. ⼯場ツール v1.1
    • 最初は組み⽴てたあとの検査しかなかったが、⼿戻り
    が多いので、基板を組み込む前に検査しようとなった
    • Macで書込みを⾏っていたので、そのままMacのデス
    クトップアプリをつくることに
    • グラフィカルなUIとBLEの制御をCoreBluetoothで⾏
    うことなどが加えられたが、書込み時は裏でv1.0の
    APIを叩いてJSONを整形するRubyとビルド⽤のShell
    をObj-Cから叩くことで資産が流⽤できた

    View Slide

  32. ⼯場ツール v1.1
    • Arduinoで基板のE2Eテストのようなことも⾏っ

    • LED、スピーカーなど
    • 輝度・⾊・⾳量などデジタルにわからないこ
    とを中⼼に

    View Slide

  33. ⼯場ツール v2.0

    View Slide

  34. ⼯場ツール v2.0

    View Slide

  35. ⼯場ツール v2.0
    • 裏ではShellがうごめいていてバイナリ置換とビルドと書込みを⾏っている
    • 他は全部Golang
    • Webサーバー部分は net/http
    • BLE操作は paypal/gatt
    • クレデンシャル情報は.envからロードしてバイナリに含めるやつを書いた
    • 基本的に1バイナリ+複数のShellにして、⼯場でのぞかれても元のソース
    が⾒れないようにした
    • HTML、CSS、JS付近もすべてバイナリに含めるようにした
    • サーバーとしてRaspberry Piを仕様してsystemdで常駐化

    View Slide

  36. ⼯場ツール v2.0

    View Slide

  37. ⼯場ツール v2.0
    • v1系のときは全部Obj-Cで書いていたが、全部
    Swiftで書き直した
    • 本番アプリでOjb-Cで書いてあるところすら全
    部Swiftで書き直した
    • CocoaPodsも捨ててCarthage⼀択
    • 結果的にビルドも超⾼速で快適だった

    View Slide

  38. ޻৔πʔϧW

    Β΂ΔΜ

    View Slide

  39. ⼯場ツール v2.0
    • GolangからWebSocket経由でブラウザが信号を受けと
    り、任意のIDをラベルプリントする
    • ⼈間の操作は⼀切いらない
    • BrotherのラベルプリンタのSDKを使って開発した影響で
    IE11でしか動かない
    • なんとJSのSDKがあるので、全部をブラウザで動かせ
    る!
    • 遠隔からシールプリントできる!

    View Slide

  40. 知⾒

    View Slide

  41. 結局デーモンにするので
    Webサーバーにした
    • ⼯場で常に稼働するツールであり、作業者のためのUIも作成す
    る必要があったので、ChromeやIEで動くWebブラウザアプリ
    にした
    • RubyならSinatra、Golangならnet/httpでゴリゴリ書いた
    • Macなら⼯場での作業フローに沿いOS起動時に作業者が
    automatorを叩いて起動
    • git pull; bundle install; bundle exec ruby app.rb
    • Raspberry Piのときは、systemdで常駐プロセス化

    View Slide

  42. ビルド等めんどい部分は
    Shellにすべてを押し込める
    • LL側でビルドを扱いたくない
    • その辺はmakeに全部押し込める、もしくは
    バイナリの直接の置換に倒す
    • 置換処理付きのshellでmakeをラップする
    • LLではそのshellを叩くだけにする

    ※細かい話は添付資料に書きました

    View Slide

  43. BLEのAPIについて
    • Obj-C、Swift、Golang、書いてないがNodeの全部それ
    なりの実装をした経験がある
    • 基本的は普通にやるとコールバック地獄になる
    • ⾔語特性的にGolangは楽
    • ゴルーチンとチャネルでなんちゃってでシリアルで
    かける
    • 他はRxXXを使わないと死ぬ

    View Slide

  44. そういえば中国いきまいた
    ※なんでかはわかりませんが

    View Slide

  45. 中国インターネット事情
    • つらい
    • 基本的にブチブチ切れる
    • 10回くらいリトライしても無理な場合もある
    • VPNにつなぐと遅いがある程度確実になる
    • ◯◯のWi-Fiに繋いで、VPNに繋げばググれる
    • Slackは弾かれてないみたいなので余裕で使えた
    • WeChatがすごく使いやすい、◯◯の⼈からWeChatで連絡来るw

    View Slide

  46. まとめ
    • ⼯場で使うツールはWeb・スマホアプリを使う
    と⼤分⾃動化できる
    • ⾜りない部分はハードウェアをつくったり、
    SDKを組み合わせて作成する(例: シールプリン
    ターのSDKなど)
    • ⼯場でもIoT!

    View Slide

  47. 続きはAkerun Advent Calendarで!

    View Slide

  48. そして、次のIoTが
    はじまるのです!

    View Slide

  49. ご清聴ありがとうございました!
    話してない内容は質疑応答か懇親会で!

    View Slide

  50. ※同業者向け添付資料

    View Slide

  51. ファームウェアのビルドの⾃動化
    • 個体毎にIDが違うイメージをつくるためには

    基本的に以下の⼆つの⽅法を選択する
    • ソースコードを都度置換し、都度ビルド
    • 確実だが遅い
    • 出来上がったバイナリの中⾝を⾒て置換
    • 速いが怖い

    View Slide

  52. うちでは両⽅の

    ⽅法を試した

    View Slide

  53. ソース置換ビルド
    • BLEのチップごとに開発⽤のSDKが異なる上にWindowsで
    GUIでビルドという苦⾏がある
    • ただし掘り返せばCLIにたどり着けることも
    • ex) IDE → make → SDK付属toolchain
    • makeさえ動けばこっちのもの
    • コンパイルとチップへのDownloadはSDKに任せる
    • ソースコードをPerlで置換して都度ビルドして書込み

    View Slide

  54. バイナリ置換
    • SDKによってはWindowsのGUIツールでしか実質無
    理なビルドもある
    • ex) Windowsの有料コンパイラーでしか、現実
    的なバイナリサイズにまで圧縮できない
    • ex) Mac/Linux版がない
    • makeもあきらめて、バイナリを直接置換して書込み

    View Slide

  55. IntelHex形式の部分置換
    • ビルド後に.hexな形式で出⼒されて中⾝を⾒た
    ら、intelhex形式だったので、そのままでは単純
    な置換ができない
    • ⼀度intelhex形式からbin形式にするとSiP的に欲
    しかった情報が失われる
    • 部分的にbin化して置換し、元に戻す時にrubyで
    ゴリゴリsumの計算をして修復した

    View Slide