Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

⾃⼰紹介 • @kazuph / 本間 和弘 • 株式会社Gaiax 元新卒Webプログラマー • 独⽴しIoTプロダクト「Akerun」の開発者に • 創業メンバー / 取締役 / CTO • メインアーキテクト / メインプログラマ 
 →エンジニア統括 • Perl→Ruby→Java→Obj-C→C→Golang→GAS(??) • Tuba(チューバ)歴11年、リアルあの世界で
 過ごしました

Slide 3

Slide 3 text

YAPC::Asia Tokyo

Slide 4

Slide 4 text

4NBSU-PDL3PCPU

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

IoTと⼯場

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

IoTで⼯場も⾃動化する!

Slide 18

Slide 18 text

どうやってつくった?

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

⼯場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* γϦΞϧ௨৴ #-&௨৴
 ֎෦ηϯαʔ

Slide 21

Slide 21 text

実際のフロー
 ※v2.0の場合

Slide 22

Slide 22 text

ファームウェアの書き込み エンジニアが丹精込めてファームウェアの
 バイナリを作成する
 ↓
 Raspberry Piに配置
 ↓
 WebAPIで品番に対応するID情報を取得
 ↓
 ID部分をPerlワンライナーで置換
 IntelHex形式のものはPython/Rubyで頑張って変換
 ↓
 UART/JLinkを使って基板にファームウェアを書き込む ʜ ʜ

Slide 23

Slide 23 text

書込後基板の検査 ファームウェア書込済み基板の検査開始
 ↓
 有線シリアル通信や無線BLE通信で各センサーの 値を取得し基準値か確認
 ↓
 最後に出荷モードもしくは
 出荷⽤ファームウェアを別途書き込み
 ↓
 WebAPI経由で書込み・検査が終了した旨を送る
 ↓
 Slackなどで通知

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

できたもの

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Rubyから雑に叩く result = RestClient.get “#{url}/#{id}“ 
 p firmware_id = `./build_akerun_firmware.sh \ '#{result["device_addr"]}' \ '#{result["uuid"]}' \
 … '#{result["local_name"]}'`

Slide 30

Slide 30 text

⼯場ツール v1.1

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

⼯場ツール v1.1 • Arduinoで基板のE2Eテストのようなことも⾏っ た • LED、スピーカーなど • 輝度・⾊・⾳量などデジタルにわからないこ とを中⼼に

Slide 33

Slide 33 text

⼯場ツール v2.0

Slide 34

Slide 34 text

⼯場ツール v2.0

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

⼯場ツール v2.0

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

޻৔πʔϧW
 Β΂ΔΜ

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

知⾒

Slide 41

Slide 41 text

結局デーモンにするので 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で常駐プロセス化

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

続きはAkerun Advent Calendarで!

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

※同業者向け添付資料

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

うちでは両⽅の
 ⽅法を試した

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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