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

D10028d8eef9ccf032c79a6719e9b373?s=47 Kazuhiro Homma
December 03, 2016

動け!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

D10028d8eef9ccf032c79a6719e9b373?s=128

Kazuhiro Homma

December 03, 2016
Tweet

Transcript

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

  2. ⾃⼰紹介 • @kazuph / 本間 和弘 • 株式会社Gaiax 元新卒Webプログラマー •

    独⽴しIoTプロダクト「Akerun」の開発者に • 創業メンバー / 取締役 / CTO • メインアーキテクト / メインプログラマ 
 →エンジニア統括 • Perl→Ruby→Java→Obj-C→C→Golang→GAS(??) • Tuba(チューバ)歴11年、リアルあの世界で
 過ごしました
  3. YAPC::Asia Tokyo

  4. 4NBSU-PDL3PCPU

  5. None
  6.  "LFSVO ىۀ "LFSVO1SP  "LFSVOൢച։࢝  1SP։ൃ։࢝  1SPൢച։࢝

    4NBSU-PDL3PCPU *P5੡඼Λͨ͘͞Μͭͬͨ͘Α ࣮͸"LFSVOҎ֎ͷ৽ϓϩμΫτ΋ଓʑग़͍ͯ͠Δ͕ɺ શମϦιʔεΛ͢΂ͯ࢖͏΄ͲͰͳ͔ͬͨͨΊɺࠓ·Ͱ ͷӡ༻Ͱ΋ͳΜͱ͔ͳͬͨɻ
  7. IoT開発に必要な要素 Ϗδωε ϑΝΠφϯε ϚʔέςΟϯά Ӧۀ ޿ใ ϝΧ ΤϨΩ ϑΝʔϜ΢ΣΞ εϚϗΞϓϦ

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

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

    αʔόʔαΠυ $4 ௐୡ ޻৔ ։ൃ ੡଄ ϩδεςΟΫε
  10. None
  11. 今⽇はこんな感じの内容を話します • ⼯場で動くIoTツール • iOSアプリ経由での基板・製品検査 • シールプリンターをIoT的に動かす • 初めての中国…/// (LCC)

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

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

  14. IoTと⼯場

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

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

    • ⼯場での時間はそのままコストになる • ⾃動化したい
  17. IoTで⼯場も⾃動化する!

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

  19. ⼯場IoTツールでの⾃動化 • v1.0(2015初期) • FW書込みを⾃動化 • 組み⽴て後検査を⾃動化 • v1.1(2015中期〜) •

    FW書込み後検査を⾃動化 • v2.0(2016) • 新製品のためにすべてをブ ラッシュアップ "84 3BJMT 8FC"1* γϦΞϧ௨৴ #-&௨৴
 ֎෦ηϯαʔ
  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) "84 3BJMT 8FC"1* γϦΞϧ௨৴ #-&௨৴
 ֎෦ηϯαʔ
  21. 実際のフロー
 ※v2.0の場合

  22. ファームウェアの書き込み エンジニアが丹精込めてファームウェアの
 バイナリを作成する
 ↓
 Raspberry Piに配置
 ↓
 WebAPIで品番に対応するID情報を取得
 ↓
 ID部分をPerlワンライナーで置換


    IntelHex形式のものはPython/Rubyで頑張って変換
 ↓
 UART/JLinkを使って基板にファームウェアを書き込む ʜ ʜ
  23. 書込後基板の検査 ファームウェア書込済み基板の検査開始
 ↓
 有線シリアル通信や無線BLE通信で各センサーの 値を取得し基準値か確認
 ↓
 最後に出荷モードもしくは
 出荷⽤ファームウェアを別途書き込み
 ↓
 WebAPI経由で書込み・検査が終了した旨を送る


    ↓
 Slackなどで通知
  24. 組み⽴て後製品の検査 書込み済み基板や他の部品・筐体を全部組み 合わせて製品を完成させる
 ↓
 組み⽴て後に検査は⼈の⼿とiPodにて⾏う
 ↓
 作業①→検査①→作業②→検査②・・・
 ↓
 動作試験が完了したら出荷状態にして
 梱包して発送しておわり

  25. できたもの

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

  27. ⼯場ツール v1.0 • 製品開発の忙しいときに作成しないといけなかったの で、「今⽇はツールハッカソンの⽇」として突貫でほ ぼ1⽇でつくった • 256⾏のapp.rbと43⾏のshellのみ • 1ファイルのSinatraになったが⼤きなツールじゃない

    ので、最後まで困らなかった • Slack連携を最初からしていたので、失敗が続くとき は、こちらから⼯場へ連絡して作業の改善を⾏った
  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
  29. Rubyから雑に叩く result = RestClient.get “#{url}/#{id}“ 
 p firmware_id = `./build_akerun_firmware.sh

    \ '#{result["device_addr"]}' \ '#{result["uuid"]}' \
 … '#{result["local_name"]}'`
  30. ⼯場ツール v1.1

  31. ⼯場ツール v1.1 • 最初は組み⽴てたあとの検査しかなかったが、⼿戻り が多いので、基板を組み込む前に検査しようとなった • Macで書込みを⾏っていたので、そのままMacのデス クトップアプリをつくることに • グラフィカルなUIとBLEの制御をCoreBluetoothで⾏

    うことなどが加えられたが、書込み時は裏でv1.0の APIを叩いてJSONを整形するRubyとビルド⽤のShell をObj-Cから叩くことで資産が流⽤できた
  32. ⼯場ツール v1.1 • Arduinoで基板のE2Eテストのようなことも⾏っ た • LED、スピーカーなど • 輝度・⾊・⾳量などデジタルにわからないこ とを中⼼に

  33. ⼯場ツール v2.0

  34. ⼯場ツール v2.0

  35. ⼯場ツール v2.0 • 裏ではShellがうごめいていてバイナリ置換とビルドと書込みを⾏っている • 他は全部Golang • Webサーバー部分は net/http •

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

  37. ⼯場ツール v2.0 • v1系のときは全部Obj-Cで書いていたが、全部 Swiftで書き直した • 本番アプリでOjb-Cで書いてあるところすら全 部Swiftで書き直した • CocoaPodsも捨ててCarthage⼀択

    • 結果的にビルドも超⾼速で快適だった
  38. ޻৔πʔϧW
 Β΂ΔΜ

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

    • なんとJSのSDKがあるので、全部をブラウザで動かせ る! • 遠隔からシールプリントできる!
  40. 知⾒

  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で常駐プロセス化
  42. ビルド等めんどい部分は Shellにすべてを押し込める • LL側でビルドを扱いたくない • その辺はmakeに全部押し込める、もしくは バイナリの直接の置換に倒す • 置換処理付きのshellでmakeをラップする •

    LLではそのshellを叩くだけにする
 ※細かい話は添付資料に書きました
  43. BLEのAPIについて • Obj-C、Swift、Golang、書いてないがNodeの全部それ なりの実装をした経験がある • 基本的は普通にやるとコールバック地獄になる • ⾔語特性的にGolangは楽 • ゴルーチンとチャネルでなんちゃってでシリアルで

    かける • 他はRxXXを使わないと死ぬ
  44. そういえば中国いきまいた ※なんでかはわかりませんが

  45. 中国インターネット事情 • つらい • 基本的にブチブチ切れる • 10回くらいリトライしても無理な場合もある • VPNにつなぐと遅いがある程度確実になる •

    ◯◯のWi-Fiに繋いで、VPNに繋げばググれる • Slackは弾かれてないみたいなので余裕で使えた • WeChatがすごく使いやすい、◯◯の⼈からWeChatで連絡来るw
  46. まとめ • ⼯場で使うツールはWeb・スマホアプリを使う と⼤分⾃動化できる • ⾜りない部分はハードウェアをつくったり、 SDKを組み合わせて作成する(例: シールプリン ターのSDKなど) •

    ⼯場でもIoT!
  47. 続きはAkerun Advent Calendarで!

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

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

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

  51. ファームウェアのビルドの⾃動化 • 個体毎にIDが違うイメージをつくるためには
 基本的に以下の⼆つの⽅法を選択する • ソースコードを都度置換し、都度ビルド • 確実だが遅い • 出来上がったバイナリの中⾝を⾒て置換

    • 速いが怖い
  52. うちでは両⽅の
 ⽅法を試した

  53. ソース置換ビルド • BLEのチップごとに開発⽤のSDKが異なる上にWindowsで GUIでビルドという苦⾏がある • ただし掘り返せばCLIにたどり着けることも • ex) IDE →

    make → SDK付属toolchain • makeさえ動けばこっちのもの • コンパイルとチップへのDownloadはSDKに任せる • ソースコードをPerlで置換して都度ビルドして書込み
  54. バイナリ置換 • SDKによってはWindowsのGUIツールでしか実質無 理なビルドもある • ex) Windowsの有料コンパイラーでしか、現実 的なバイナリサイズにまで圧縮できない • ex)

    Mac/Linux版がない • makeもあきらめて、バイナリを直接置換して書込み
  55. IntelHex形式の部分置換 • ビルド後に.hexな形式で出⼒されて中⾝を⾒た ら、intelhex形式だったので、そのままでは単純 な置換ができない • ⼀度intelhex形式からbin形式にするとSiP的に欲 しかった情報が失われる • 部分的にbin化して置換し、元に戻す時にrubyで

    ゴリゴリsumの計算をして修復した