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

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

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

続きを読む

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

「現場で役立つシステム設計の原則」を読んだ

この記事を書いたあたりから、よりDDDについて知りたくなって追加で読み始めた本

takanamito.hateblo.jp

業務におけるプログラミングでオブジェクト指向を実践するにはどうすればよいかを、ここまで具体的に書いてくれてる本は初めてだったので読んでよかった。

  • 1章からいきなりドメインオブジェクトの軽い説明と例示
  • 3章ではドメインロジックをドメインオブジェクトに抽出していく説明
  • 4章ではさらにその手前の、業務フローからドメインオブジェクトを見つけていく手法と、ドメインオブジェクトの育て方
  • 少し飛んで8章ではドメインオブジェクトとAPIレスポンスをどう対応させるかについて

この辺の話が印象に残っていて
特に4章の「ドメインオブジェクトの見つけ方」にかかれていた「業務の関心事の3分類 ヒト・モノ・コト」の話に関しては
普段自分が仕事で要件や仕様を整理する時に意識していたことが言語化されていて感動した上に
そこで整理したドメイン知識やロジックをいかにドメインオブジェクトとして表現するのかについて、DDDでいうとこの戦術的なアプローチが紹介されていて学びがあった。

またDDDの文脈からは少し外れるけど
7章では画面とドメインオブジェクトの設計をどう連動させるかの話の中で、複雑な画面のデータを表現するドメインオブジェクトを作るのではなく
ドメインオブジェクトに合わせて画面を分割/分解する手法が紹介されていたのもよかった。

技術的なアプローチではなく、そもそもの画面仕様を変更することを検討する内容で
同じような場面に遭遇する気がするのでその時に使えそう。

また4,9章ではそれぞれドメインモデルを見つける/伝えるにあたって必要な資料や図、ドキュメントについて
何が必要なのかが詳細に書かれていて、こちらは1年目に読んでると精度高くプログラム以外の資産も残せたんだろうなーと思える内容だった。

DDDを通じてオブジェクト指向を実現するためのテクニックや手法の解説

業務でアプリケーションを開発をする上で必要な勘所

の2つを解説してくれている、とても実践的な本でした。おすすめ。

「オブジェクト指向設計実践ガイド」がすごくよかった

普段RailsでWebアプリを作っていて、いつクラスを作るべきか、どんなインターフェイスを作るべきか、そもそもよい設計やコードとは何なのかよくわからなくなっていた。

同僚に相談したらこの本を勧められて2017年に1回途中まで、年明けにもう1回全部通して読み直したのでいったんまとめる。

この本を読んでなおいろんな機能が詰まりまくったServiceクラスを作るPullRequestを出した自分に
丁寧にapp/models以下に単一責任の原則に基づいたプレーンなクラスを作って、ドメインモデルを表現するコードレビューをしてくれた同僚がいた。

ちょうどそのレビューの最中に教えてもらった記事がある。

qiita.com

この記事に出てくるダメServiceクラスみたいなものを本当に作りかけていて危機感を覚えたし、具体的な問題意識を持って本を読み直すきっかけになった。

いまその時とは違う職場で働いているが、当時のコードレビューや本、記事で言われている内容がかなり役立っている。

新しい環境でコードを読みながらキャッチアップする機会が多く再認識したことがあって
今までapp/models以下にActiveRecordを継承したモデルクラスだけが存在し、そのサービスのドメインロジックはそれっぽい名前のServiceクラスに手続き的な処理の羅列として閉じ込めるような書き方がされているコードをよく見た気がするし自分でもめっちゃ書いてた記憶がある。

こういうクラスがある場合に新しい環境でコードを読み始めてつらいと思ったのが、そのクラスがいったい何の責任を持ったクラスなのかわからなかったり、staticな呼び出しをされまくる便利クラスになっていて変更のためのコストが異常に高かったりすること。

たくさんの引数を渡してその内容によって処理の分岐をするif文の羅列、それに伴って膨らむrspecのcontextブロック
ロジックが詰め込まれていてしかもstaticに呼び出されたりすると、処理の内容を変更しようもんなら影響範囲がどこまで及ぶのか関数名でgrepして確認をしないといけない。(grepすれば調べられる分まだマシかも)

この本を読んでそういうコードを生まないためにどう対処するべきか、少しずつクリアに見えるようになり始めた。

特に役立ったと感じるのは

  • 2.2 単一の責任を持つクラスをつくる
  • 3.2 疎結合なコードを書く
  • 4.3 パブリックインターフェースを見つける -> 「どのように」を伝えるのではなく「何を」を頼む
  • 4.5 デルメルの法則
  • 5 ダックタイピングでコストを削減する

のあたり。

オブジェクトが「メッセージ」を送っている。という話がRubysendメソッドと自分の中で結びついて気持ちよかったり
単一責任の話や、ダックタイプの話が直接先述のServiceクラスをリファクタするヒントになっていたりして
「明日、あのコードをどう直すか」というスピード感で自分の指針になったことにはとても感動した。

しかもありがたいことに今の職場でもこの本がデスクに置かれている同僚がいて、設計の相談が来た時にちょうどこの本に載っているような問題に遭遇して「あのパターンが使えるね」って話しながら設計に落とし込めたりする体験もできた。

ただ単にこの本を読んだ自分の考えを押し付けるわけでもなく「なぜそう思うか」を具体的に言語化した上でレビューしたり、共通の認識を持った上でお互いに納得いく設計にできたりしているので、当初思っていたよりもかなり読む価値のある本になっていた。ラッキー。

ドメイン駆動設計あたりが自分の中でホットなので冷めないうちに次はこの本を読んでみようと思う。

2017年に買ってよかったもの

今年買ってよかったものを書きます

酔い止め薬 アネロン「ニスキャップ」

【指定第2類医薬品】アネロン「ニスキャップ」 9カプセル

【指定第2類医薬品】アネロン「ニスキャップ」 9カプセル

薬剤師の資格持ちの同僚の勧めで購入。どうやら最強酔い止めらしい。
調べてみたところ、とにかく酔い止め関連の効能がある成分が1番数多く入ってる薬らしく
昔から乗り物酔いがひどい僕が、小さいボートで東京湾に出てぐわんぐわん揺れても一切酔わなかった。ヘビロテ確定。

珪藻土バスマット

もっと吸水、さらに速乾!珪藻土バスマット(カイテキサラサラ SP 40X55) | ニトリ公式通販 家具・インテリア・生活雑貨通販のニトリネット

すごくいい。前まで布のバスマット使ってたけど
洗濯めんどいし、清潔感に欠けて嫌だったのが全部解決

劇場版 パワーレンジャー

劇場版 パワーレンジャー [Blu-ray]

劇場版 パワーレンジャー [Blu-ray]

成績は散々だったけども、個人的にベイビードライバーに並んで今年ベストに推したい作品

特撮ファンの僕は20年前の劇場版やTV版を子供の時に死ぬほど見ていて
今回のリメイクめっちゃ楽しみなくせに、期待値上げると爆死しそうだからという理由で斜に構えながら見に行ったら
もうそんな不安を吹き飛ばしてくれるほどいい感じのリメイクで、しっかり現代ティーンエイジャーの青春物語へと昇華されていて大満足

なんとか次回作で追加戦士トミーの登場を見てみたい

iPhoneで電源ON/OFFできるスマートコンセント

Wi-FiにつながってiPhoneのSiriやコントロールセンター経由でON/OFFできるコンセント
うちでは加湿器や照明で使用中
ベッドから動かずに家電をつけたり消したりできるので寝落ちする時に幸せ

この記事を書いた時に合わせて導入した

takanamito.hateblo.jp

素焼きミックスナッツ 1kg

ベッドから動かずに生活できるようになった結果太りまして
食生活を見直そうと購入

朝ごはんに毎日菓子パンを食べてたので、それをやめるべく
ヨーグルト + バナナ + ミックスナッツという
OLが食べてそうな朝食に変えたところ見事に体重減。

バナナとナッツでエネルギー摂取して、消化もいいっぽいので見事に昼前にはおなか減ってくる感じの生活になって最高

サフィールノワール ミラーグロス ワックス

痩せたということでおしゃれがしたい。
以前買った革靴の鏡面磨きに挑戦すべく、評判のよかったサフィールのワックスを購入。
鏡面磨きはやったことがなかったけど、このワックスがあればそんな僕でも初回からけっこういい感じに光らせられました。

お刺身脱水 ピチットシート

オカモト 業務用ピチット 32R(32枚ロール)

オカモト 業務用ピチット 32R(32枚ロール)

痩せたら美味しいお刺身が食べたくなりまして
同僚からオススメされたこともあり導入。

透明な半透膜シートで
マグロの柵とかに巻いて冷蔵庫で20分くらい放置するといい感じに脱水してくれる。

以前は冷凍マグロを家で解凍して食べると水っぽいことが多かったんですが
これを導入してからは美味しいお刺身のお店っぽい、身が締まった刺身を食べることができるようになりました。

おすすめレシピは
しょうゆ 2 : 料理酒 1 : みりん 1の漬けダレに
解凍してから20分ほどピチットシートで脱水したマグロを5-15分ほど漬け込んで食べるマグロ丼です。

Nintendo Switch

ベタ中のベタっぽいですが、今年はこれが1番よかった。
買ったゲームはゼルダ、マリオ、マリオカートスプラトゥーン、マイクラ、ヒューマンリソースマシンで全部めっちゃ楽しい。
かつてこんな体験をしたことがない。

特にゼルダとマリオについては自分の中のゲーム概念が覆る感じで
見えてるとこだいたいどこでも行けて、怪しいところにはだいたい何かあり、こうすりゃ何か起こりそうだな〜と思って試すと何か起こっちゃう体験がとにかく最高でした。