Homebridge on Docker on RaspberryPiとNatureRemoで自宅IoT環境の改善

この記事は ZOZOテクノロジーズ Advent Calendar 2018 - Qiita 10日目の記事です。

2年ほどラズパイ上でHomebridgeの運用をしていましたが、新型NatureRemoの発売に伴い構成を見直すことにしました。 takanamito.hateblo.jp

新型NatureRemoはIRKitと違い、温度・湿度・照度が取れるのでお部屋モニタリングが捗ります。

続きを読む

Aurora MySQLのローカルストレージ不足で事故ったログ

日次でDB内のとあるテーブルのデータ全件をBigQueryに同期するバッチがあって
RDS for MySQLからデータをselectしていたが、先日Aurora MySQL(5.6.10)に移行した直後から急にバッチがこけはじめた。

原因調査

バッチは使用しているMySQLクライアントの設定値(3600秒)に従ってタイムアウトし落ちていた。

バッチの実行時間帯のCloud Watchメトリクスを確認してみると
AuroraのCPU使用率が30分間ほど平常値から外れて高くなっていた。

しかしバッチを実行しているEC2のネットワークインプットメトリックは特に変動がなく、Auroraからselectした結果を受け取れてなさそうなことも同時にわかった。

DBへの接続がタイムアウトするまでに1時間かかっているのに、selectによるCPU負荷が30分程度しか上昇していないので
クエリが何らかの理由で異常終了している可能性を疑い始める。

続きを読む

Netflix製のjsonシリアライザgem fast_jsonapiを試す

先日OpenAPIのスキーマからRubyのクラスを自動生成するgemを作りました。

OpenAPIのschema定義からRubyのクラスを生成するgem「openapi2ruby」をつくりました - Start Today Technologies TECH BLOG

このgemを作って自動生成しようとしたのがActiveModel::Serializer(AMS)のシリアライザで
他にも自動生成できるものがないか調べていたときに、ちょっと前に話題になったNetflixのgemを見つけたので使ってみることに。

github.com

なんでも

serialization time is at least 25 times faster than Active Model Serializers on up to current benchmark of 1000 records.

らしい。速い。

続きを読む

EH-TW650とYAS-207でホームシアター環境をつくる

EPSONのEH-TW650とYAMAHAのYAS-207でホームシアター環境をつくりました。

f:id:takanamito:20180729151634j:plain

もくじ

  • 3100ルーメンと台形補正
  • 3Dサラウンドと配線レス接続
  • 我が家の配線状況
  • 感想
続きを読む

ふるさと納税で届いたシマアジを刺身とだし茶漬けにして食べました

こないだのスーパーセールで買ったふるさと納税シマアジが届きました。

美味しんぼ 4話 「活きた魚」でおなじみのシマアジ
この回を見て以来、シマアジを見ると食べずにはいられない体になってしまった。

続きを読む

誕生日から年齢を計算するhappybirthday gemをリリースしました

happybirthday | RubyGems.org | your community gem host

使い方は以下の通り

require 'happybirthday'

birthday = Happybirthday.born_on('2000-01-01')
birthday.age.years_old
# => 18
続きを読む

Dockerでデータ入りのMySQLボリュームイメージをつくる

普段お仕事でRailsアプリケーションを作ってて、今はチーム内共通のMySQLサーバーをみんなが参照している。
これをDocker化してうまくみんなにイメージを配布したかった。

前職ではMySQLにデータが投入済みのDockerイメージを作成して、コマンド一発でデータが入った状態のMySQLコンテナが立ち上がるようになっていたので、そのやり方を元同僚に聞いて再現してみることにした。

構成

docker-composeを使って

  • 公式のMySQLコンテナ
  • volume用コンテナ

の2つを立ち上げて利用する。

流れ

まずはデータ入りDockerイメージ作成

  • 公式MySQLイメージからコンテナを立ち上げてdumpデータ投入
  • データ入りのファイルをホストに/var/lib/mysql以下をコピー
  • 新規でホストからコンテナに↑の手順でコピーしてきたデータをCOPYするDockerfileを作成
  • docker buildすれば出来上がり

続いてデータ入りのイメージから、データ投入済みMySQLコンテナを立ち上げる

  • さっき docker buildしたimageを起動
  • ↑で起動したコンテナをvolume指定して、公式MySQLイメージからMySQLコンテナを起動

順を追って詳細説明していきます。

データ入りDockerイメージ作成

公式イメージからMySQLコンテナの起動
起動したらDB作成とデータ投入

$ docker run -d --name db -e 'MYSQL_ALLOW_EMPTY_PASSWORD=yes' -p 3306:3306 mysql:latest

データ入りのファイルをホストにコピー

$ mkdir -p ./data/var/lib
$ docker cp db:/var/lib/mysql ./data/var/lib

Dockerfileの作成

FROM busybox
RUN mkdir -p /var/lib/mysql
COPY data/var/lib/mysql /var/lib/mysql
RUN chown -R 999:999 /var/lib/mysql
VOLUME /var/lib/mysql
CMD tail -f /dev/null

最後に

$ docker build .

データ投入済みMySQLコンテナを立ち上げる

docker-compose.ymlをつくって $ docker-compose up

version: '2'
services:
  db-storage:
    image: {さっきつくったdocker image}
    volumes:
      - /var/lib/mysql
  db:
    image: mysql:latest
    ports:
      - 3306:3306
    volumes_from:
      - db-storage

storage用のimageをDockerHubなどのレジストリにpushしておけば、他の開発者はプロジェクトのリポジトリをcloneして docker-compose upするだけでデータ入りのDBが即座に立ち上がる。

雑感

最初これを作ろうとしたとき VOLUME指定をするとimageにデータが保存されなくて困っていたところ、元同僚から「Dockerfileの中でVOLUMEを指定する前に追加したデータはimageに含まれるんですよ」というアドバイスをもらい無事に実現できたのでありがとうありがとうという感じ。

とりあえずやりたいことは実現できたが、微妙にやり切れてないのがdocker-compose.ymlをversion: 3で書くことで、version3から volumes_fromが消えていてうまく書けなかったりしている。

ちょうど趣味プロジェクトでまあまあのデータ量のDBを扱うアプリケーションを作ろうとしていたので、Docker化をして友達の開発者とかに「こんな感じで動くよ」ってすぐに見せられて便利。
Docker imageにでっかいデータをのっけることの筋が良い悪い話はいったん置いといてください。

github.com