2015年11月15日

実家に格安SIM+Rasberry Pi+NUC録画機を設置した話


半年以上前の話になるのですが、この前の実家への帰省の際に地元のTVやラジオをいつでも視聴できるよう設置してきました。
(上の写真はその時参加したサイクリング大会のやつです)

構成

  • Pocket WiFi LTE GL06P
    • インターネットへ接続するルーター
    • ヤフオクで買ったやつ
    • 電源はコンセントから常時供給しておく
  • OCNモバイルONE
    • ルーターに入れる格安SIM
    • この価格帯でグローバルIPが振られるSIMはこれしかなさそうだった
  • Intel DC3217BY
    • TVやラジオ視聴を処理するNUC
    • 地デジ録画(SKNet Monster TV HDUSを接続)
    • FMラジオ受信(RTL2832Uチップ搭載のUSBワンセグチューナーを接続)
    • リモートから電源を入れられる対応を実施済み
  • Raspberry Pi 1 Model B
  • TENVIS JPT3815W
    • ネットワークカメラ
    • 両親の様子を、、じゃなくて単純に外の風景を撮影
    • DDNS更新をONにしてRasPiがDNS更新に失敗した時のバックアップも


帰省前の準備


普段使いのサーバーとかであれば自分で赴いてメンテナンスできるのですが、実家に設置となると気軽にそういう事はできませんので、いろいろな対策を考える必要がありました。
  • 問題が起こった際の復帰手段と予防策
    • SSH -R(autossh)などで、こちらから接続できない場合の別ルートの確保
    • 定期的な死活監視と週次での自動再起動
  • 両親のPCリテラシーは高くないので、細かい操作は期待できない
    • 電話口で機器の様子を見てもらったり、電源入れ直してもらったりする程度
  • 実家に負担がかからないようにする
    • 通信費→帯域やレイテンシー的に固定回線を引きたいけど格安SIMで代替
    • 電気代→サーバーは常時起動ではなく必要な時のみ電源を入れる/落とせる
これらのうち、事前にプログラミングや工作が必要だったものは自宅で行い、最終的な動作テストののち帰省数日前に梱包して送付しました。気分的には火星探査機を開発している気分です(笑)

設置後のトラブル


準備段階で気をつけていたつもりだったのですが、やはり完璧とはいかずさまざまなトラブルに見舞われました。
  • 無線LANの設定が自宅の設定のままになっている
    • 実家を出る数時間前に発覚
    • 急いで近くの家電量販店にキーボードとHDMIケーブルを買いに行って修正
      • 最近のTVはPCモニター代わりになって便利
  • ネットワークカメラの設置場所が不安定
    • 窓を開ける取っ手が邪魔、高さが足りず撮影できない
    • ホームセンターで板切れを買って棚を作り対応
  • ルーターの電源が落ちる
    • 自宅に戻って設定をいじってたら突然接続断
    • 仕方ないので実家に電話して見てもらったら”充電中”になってた
      • 通信し続けると充電を中断してバッテリー駆動になる?
一番致命的なのは最後のルーター周りで、録画データは一括送信できないのでsplitコマンドで50MBくらいに分割し、cronで間欠的に送信するようにしました。おかげで1時間番組を録画してもこっちで視聴できるまでに3日ぐらいかかります。。

また、レイテンシーの遅さも予想以上で、通信の少なそうな深夜帯でも500msくらいかかるので、リアルタイムに視聴する系はほぼ諦めてます。。

あとトラブルというわけではないのですが、実家の両親に火事の心配をされました。確かに機器は常時電源接続されており、特にルーターはリチウムイオン電池も入っているのでその辺の配慮が足りなかったのは反省点です。

おわりに

いろいろ問題はありましたが、なんとか最低限の目標は達成できました。ネットワークカメラも当初は固定で一場面の撮影のみでしたが、パンチルトを操作するAPIを使って二場面を撮影できるようにし、温度/湿度センサーの値を画像に合成するようにしました。
(「なんかカメラが定期的に首振るんだけど!」と実家から電話がかかってきましたがw)

来年の帰省の際は、グローバルIPを諦めてもっと安いSIMに乗り換える(IIJ系SIMはIPv6が使えるらしいけど。。)、RasPi側に録画視聴を集約する(RasPi2化する)あたりを検討中です。最近IoTが話題ですが、それらを考えるきっかけとしてもオススメです。

2015年7月6日

BME280を使ってRaspberry Pi 2から温度/湿度/気圧を取得しようとした(できました)


以前挑戦してダメだったRaspberry Pi 2とBME280ですが、こちらの記事でセンサー情報取得プログラムにPython版が出たことを知り、合わせてI2C用プルアップ抵抗?の接続も不要のように見えたので、以前と同様にジャンパー線で直接接続する形にしてみました。

この方式だと3.3VとGNDを余計に消費してしまいますが、それ以外のセンサーを繋ぐ予定も無いため、とりあえずはこれで運用してみようと思います。

2015年6月21日

Go Conference 2015に参加してきました

先々月にGunosy.go#12にお邪魔させてもらったりと、今年はGo言語と触れ合う機会が多いのですが、今日は抽選で外れたものの繰り上げ当選する事ができたGo Conference 2015にお邪魔してきました。

内容の詳細は発表者さんが公開されているプレゼン資料をご確認頂くとして、とりあえずメモを載せておきます。

It's an exciting time to be a gophar(キーノート:Francesc Campoy@google さん)

  • Golangのチームに入って3年
  • Golangは今年で5歳
  • 今年8月頃にGo 1.5がリリース予定
  • Go 1.5は全てをGo言語で記述
  • C言語を知らなくてもGo言語の改善に貢献できるようになる
  • SSA(Single Static Assignment)
  • New SSA Backend planはGo 1.6から
  • go vet
  • ソース分析で使われるgo oracle
    • サポートがあるエディターはvim(vim-go)とemacs
  • godoc -anlytics=pointerでgodoc中に呼び出し元一覧が記載される
  • gomobile tool
  • とりあえず今はAndroidのみサポート
    • これ全てでアプリを記述するのは難しそう
  • 依存性管理ツールが今後提供されるかも?

What I Talk About When I Talk About CLI Tool By Golang(SOTA@楽天 さん)

  • 社内でcloud foundryを使っている
  • 直感的なUI/UX
  • https://github.com/docker/docker/tree/master/pkg/mflag
    • ロングオプションとショートオプションを同時に指定できる
  • https://github.com/mitchellh/cli
    • サブコマンドのインターフェースを定義
    • テストがしやすい
  • 他のコマンドと協調動作する
  • os.Exitはdeferを実行せず終了するので、mainでExitする
  • io.WriterをRun()に渡すとテストがしやすい
  • https://github.com/tcnksm/go-latest
    • 使われているコマンドが最新版かチェック
  • https://github.com/tcnksm/gcli
    • いい感じのコマンドラインツール雛形を出力してくれる
  • 質疑応答
    • 引数を渡すとき--hogeの後空白か=だとどっちがいい? → =つけずにやってる
    • cliパッケージを作るときにcli.goとの違い → フラグが独自のカスタマイズがされている、exitコードが独自
    • エラーコード以外の情報を返すべきか → iota使ってやってる
    • 標準入力(ファイル入力)の使い方 -とかファイル名なかったりとか → 普通に下手にベタに書いてる

Generative Programming in Go(MIYAKE Yusuke@GMO Pepabo さん)

  • コードからコードを出力する
  • Goでは標準でコードをパースしてASTを出力する機能がある
  • 構造体のコメント欄に"+AR"があるとActiveRecordの振る舞いを生成
  • generics:構造体に対して個々の型を扱う共通のメソッドを生成
  • https://github.com/clipperhouse/gen
  • パフォーマンス:コード生成でリフレクションを回避
  • https://github.com/pquerna/ffjson
  • DSL:ASTのメソッド名/コメント/タグから定義を補完して生成
  • なんでもgenerateはよくない
  • テストは生成物に対して行う
  • 質疑応答
    • ソースコード管理はどうするか?→ 生成した結果までバージョン管理する
    • 参考にした資料 → clipperhouse/genなど

GoのASTをいじくって新しいツールを作る(vvakame@topgate さん)

  • structのjsonタグを都度書くのはつらい
  • https://github.com/favclip/jwg
  • 構造体のコメントに+jwgを書いてgo:generateするとjsonタグを自動生成
  • 内部情報や開発環境のみ出力といった対応も可
  • ASTで構造体の各要素(名前、種類、変数名、変数の型)が取れる
  • https://github.com/favclip/genbase
  • jwgのライセンスはMIT

A Tale of Go REPL(motemen@hatena さん)

  • https://github.com/motemen/gore
  • Go言語でREPL環境
  • Goのeval = go run
  • ASTに一旦変換して.goにして実行
  • go runした結果を出力する
  • 変数やパッケージが使われてない系のエラーは無理やり使って対応
  • 質疑応答
    • goreの補完はどうやっているか? → gocodeに問い合わせている
    • goreの副作用のあるコードはundoやclearと合わせて今後対応予定

Debugging Go Code with GDB(kaneshin@eureka さん)

  • print debugのデメリット アドホックなコードを書いてしまう
  • GDBを使うと処理の中断ができる
  • gcflagsで最適化オプションをOFFにする
  • ldflags -wでバイナリサイズが減る
  • WAFはRevelを使っている
    • Revelにした理由:CTOが選んだ。なるべく枯れているものを利用
    • 個人的にはWAF使わない方がいいんじゃないか
  • WAFとgdbは相性が悪い
  • gdbのバージョンを確認する

Scaling Sourcegraph with Go(Gabriel Aszalos@sourcegraph さん)

1binary 自己完結型の 形態素解析器 kagome を 作ってみた話(ikawaha@パシフィックポーター さん)

  • https://github.com/ikawaha/kagome
  • pure goな形態素解析器
  • 辞書同梱
  • Javaで実装された形態素解析器Kuromoji
  • 辞書はJarの中に含まれている
  • Goの場合はgo-bindataで含める

Gaurun / A general push notification server in Go(cubicdaiya@mercari さん)

  • https://github.com/mercari/gaurun
  • Push通知リクエストをHTTP APIで受けて非同期にAPNsやGCMに送信処理を実行
  • - goroutineの数はパフォーマンスが下がるので無制限に作らない
  • - https://github.com/fukata/golang-stats-api-handler
  • - サーバーのモニタリング内容を出力
  • - 質疑応答
  •   - APIでエラーが出たときのハンドリング → アクセスログとエラーログを別に出力
  •   - リークしてた事の解決方法 → 外部のライブラリが悪さしてたのでforkして修正
  •   - goroutineを使ってキューシステムのチューニング → 定常用とキャンペーン用でプロセスを分ける

Goと電子工作とロボット(HideyukiTakei@beatrobo さん)

ピクシブ社内広告サーバーでのGoの開発・運用(catatsuy@pixiv さん)

  • UNIX Domain Socketで繋いでいる理由=TCP 3way Handshakeのコストが高かった
  • https://github.com/circus-tent/circus
  • mozilla製プロセス管理ツール
  • ダウンタイムを起こさないようにするために利用
  • go build ldflagsでgitのリビジョン番号を埋め込む
  • https://github.com/pmylund/go-cache
  • memcachedへのアクセスが重いためアプリケーション側でキャッシュ
  • cpufrequtilsで常にCPUがフルスピードで動くように
    • 広告サーバーとMySQLサーバーでは効果があった
  • ログ出力はCircusから直接Goが出力するように変更
  • プロファイリングが取りやすいのでパフォーマンスが必要な場合でも使いやすい
  • 質疑応答
    • インフラは何を使っているか → 実サーバーを使っている
    • ログをCircus経由で出すとリソースを食う原因は? → Circus自体の調査はしていない

Goで共通基盤システムを作っている話(Ryota Nishio@CyberAgent さん)

  • Realtime Messaging Platformを作っている(OSS化予定)
  • mqtt, websocket, protobuf, msgpack, zeromq, consul
  • 開発体制は3名
  • デプロイが非常に容易
  • テストやベンチマークが標準装備
  • versioning/vendoringの問題 現在はgodepを使っている
  • 標準パッケージが宝の山
  • 選定の際は自分でベンチマークを取る
  • genericsないのどうしてる? reflectは使わない

懇親会&LT大会(リンクのみ)