らいむぎばたけ

つかまえなくてだいじょうぶ

メディレコでカラムで持っていた値をテーブルで持つようにした

はじめに

メディレコ は三年くらい前に FJORD BOOT CAMP の最終課題で作った Web アプリ。詳しくはこちらの記事にかいているけど、今読むとちょっとけっこうかなりとても恥ずかしい。自分のために作ったアプリだったが、両親も割と使ってくれていて、バグの報告をしてくれるので助かっている。

lime1024.hateblo.jp

当時はテーブル設計について特に考えていなかったが、最近になって見てみるとテーブルに分離したほうが良さそうなカラムに気づいたので、新しいテーブルの作成・移行・カラムの削除を行った。

テーブル

変更前のスキーマ (一部省略)

  • medical_bills
カラム名 備考
day 日付
cost 費用
classification 医療費区分 (治療費・医薬品費・交通費)

変更後のスキーマ (一部省略)

  • classifications
カラム名 備考
name 医療費区分 (治療費・医薬品費・交通費)
  • medical_bills
カラム名 備考
day 日付
cost 費用
classification_id 紐づく classifications テーブルの id

やったこと

細かい手順書は issue にまとめてある

1. 新しいテーブルの作成

  • 医療費テーブル (medical_bills) でカラムとしてもっていた医療費区分 (medical_bills.classification) を医療費区分テーブル (classifications) にした
  • カラム名とテーブル名が同じになるので、一時的にテーブルへのアソシエーションにアンスコをつけて _classifications とした
    • medical_bill.classification: カラムのときの医療費区分
    • medical_bill._classification: テーブル分離後の医療費区分
  • seed の用意
    • 医療費区分は、治療費・医薬品費・交通費の 3 つに決まっているので DB に流す seed を用意した

2. 移行スクリプトの作成と移行

  • 移行スクリプトの作成
    • medical_bill.classification 内の文字列 (治療費・医薬品費・交通費) を見て medical_bill.classification_id を追加
  • 移行作業
    • DB のバックアップ
    • テーブル作成のコードのデプロイ
    • seed データを流す
    • 移行対象数を数えるスクリプトを流す
    • 移行スクリプトを実行する
    • 移行対象数を数えるスクリプトを流す (0 になっていたら完了)

3. 後片付け

  • カラムの削除 (medical_bills.classification)
  • アソシエーションの修正 (medical_bills._classification のアンスコをやめる)
  • 一時的に NULL を許可していたカラムの NULL 許可をやめる

さいごに

  • 移行中は一時的にカラムの NULL を許可しないといけないものがあったことに後から気づいて大変だった
  • 移行スクリプトもテストを書いていたので安心できた
  • 移行手順書を書いてたので安心できた、事前準備は大事

家二郎 (凛)

夫の誕生日プレゼントに家二郎をしたので記録として。 夫は二郎の中でも二郎インスパイアの凛が好きなので、豚骨ベースに完全味付けで完全に味をつけていきます。作り方は雰囲気です。

  • 完全味付け

チャーシュー

f:id:lime1024:20220210205043p:plain:w300:h300
脂がすごい

食べたい量の豚バラと豚ロースのブロックを、醤油・酒・みりん・味の素を適量入れて煮込む。 このとき旭ポンズのストックがなかったのでとりあえず酢も投下。長ネギの青いとこ、しょうがも投下して美味しくなるまで煮込む。

なお、旭ポンズは翌日に買ってきてダバダバいれた。

豚骨スープ

豚骨を砕く。家の駐車場で布に包んでトンカチでガッガッとやった。

f:id:lime1024:20220210141226j:plain:w300:h300
げんこつ

下茹で。この後に豚骨を軽く洗うのでアクは逐一取らなかった。

f:id:lime1024:20220210212733p:plain:w300:h300
アクがそのうちめっちゃ出てくるけど放置

軽く洗った豚骨に、長ネギの青いとこ、しょうが、にんにくを投下。冷蔵庫にりんごもあったので丸のまま投下。

f:id:lime1024:20220210213556p:plain:w300:h300
りんごはなくてもいい

加水しながら白く濁るまで煮込む。

f:id:lime1024:20220210213730p:plain:w300:h300
二時間後
f:id:lime1024:20220210213821p:plain:w300:h300
四時間後
f:id:lime1024:20220210213933p:plain:w300:h300
五時間後
f:id:lime1024:20220210214057p:plain:w300:h300
七時間半後

八時間煮込んで濾した。

f:id:lime1024:20220210214234p:plain:w300:h300
きらきらしてる

麺は作ってないので、市販の極太と書いているものを適当に買った。リングイネフィットチーネでも良さそう。

野菜

キャベツともやしを耐熱ボウルに入れてラップしてチン

盛り付け

丼にお湯をいれてあっためて、味の素ダバー

f:id:lime1024:20220210214811p:plain:w300:h300
あればあるだけうまい

チャーシューの煮汁ダバー

f:id:lime1024:20220210215027p:plain:w300:h300
煮込んで溶けた脂がいい感じに背脂感

豚骨スープダバー

f:id:lime1024:20220210215209p:plain:w300:h300
味を見て物足りなければ旭ポンズで調整

完成

f:id:lime1024:20220210215353p:plain:w300:h300
にんにくもあればあるだけうまい

反応

喜んでそうで良かった。

なお、我が家の誕生日には前夜祭・後夜祭制度があるので、前夜祭は寿司を握った。

f:id:lime1024:20220210204658p:plain:w300:h300
小さいシャリだとホタテのサイズが合わない

ecspresso をより安全に使うために

この記事は Classi developers Advent Calendar 2021 5 日目の記事です。 adventar.org

昨日は Sab さんiOS15からのキーボード回避[UIKit] でした。

Classi でサーバサイドエンジニアとして働きながら週末は野菜を育てているらいむです。我が家の畑は夏野菜が終わり、最近は秋・冬野菜を育てています。白菜が無事結球したのでホッとしています。

今回は野菜ではなくて、業務で使っている ecspresso をより安全に使うために行ったことを書きます。本記事は ecspresso を例に書きますが、ecspresso に限った話ではないので、CircleCI でバイナリの checksum を比較したり、バイナリをキャッシュしたいときに同じやり方が使えると思います。

はじめに

  • 元々は CircleCI 上で都度 ecspresso をインストールして、それをそのまま使っていた
    • 弊社では 3rd party orb を許可しないポリシーなので、ecspresso の CircleCI orb が使えず自前でインストールしている
  • f:id:lime1024:20211202103737p:plain
  • id:aereal さんの発言を見てたしかにとなった 🦀
  • 提供元の checksum と CircleCI で落としてきたファイルの checksum を比較することで、経路上で不正にファイルが書き換えられていないかを確認できる

と思ったので実際にやってみました。

バイナリの checksum を比較する

CircleCI で ecspresso をインストールする command に以下を加えました。

FILENAME="ecspresso_<< parameters.ecspresso_version >>_linux_amd64.tar.gz"
curl -fsSLo /tmp/checksums.txt "https://github.com/kayac/ecspresso/releases/download/v<< parameters.ecspresso_version >>/checksums.txt"
cd /tmp && cat /tmp/checksums.txt | grep ${FILENAME} | sha256sum -c
  • ecspresso では tar で圧縮された状態の checksum がバージョン毎に用意されている
    • Releases · kayac/ecspresso
    • v1.6.0 からなので、それ以前を使っている場合は別の方法でやらないといけない
  • 公式の checksum と CircleCI 内で落としてきた圧縮された状態のファイルの checksum で比較する

バイナリをキャッシュする

CircleCI の restore_cachesave_cache を使いました。key は今回 ecspresso の version にしましたが、ここは実行ファイルの checksum でも良いと思います。

- restore_cache:
    name: Restore ecspresso cache
    key: ecspresso-v<< parameters.ecspresso_version >>

- save_cache:
    name: Save ecspresso cache
    key: ecspresso-v<< parameters.ecspresso_version >>
    paths:
      - .bin

バイナリのキャッシュを扱う

ここが一番ハマりどころが多かったです。

before

steps:
  - checkout
  - run:
    name: Install ecspresso
    command: |
      FILENAME=ecspresso_<< parameters.ecspresso_version >>_linux_amd64.tar.gz
      cd /tmp
      curl -sLO https://github.com/kayac/ecspresso/releases/download/<< parameters.ecspresso_version >>/${FILENAME}
      tar xzvf ${FILENAME}
      sudo install ${FILENAME} /usr/local/bin/ecspresso

after

steps:
  - checkout
  - run:
      name: Install ecspresso
      command: |
        if [ ! -x .bin/ecspresso ]; then
          FILENAME=ecspresso_<< parameters.ecspresso_version >>_linux_amd64.tar.gz
          mkdir .bin
          curl -fsSLo /tmp/${FILENAME} https://github.com/kayac/ecspresso/releases/download/v<< parameters.ecspresso_version >>/${FILENAME}
          tar xzvf /tmp/${FILENAME} -C .bin
          curl -fsSLo /tmp/checksums.txt https://github.com/kayac/ecspresso/releases/download/v<< parameters.ecspresso_version >>/checksums.txt
          cd /tmp && cat /tmp/checksums.txt | grep ${FILENAME} | sha256sum -c
        fi
  • 実行ファイルがあるかの判定が必要
    • キャッシュがないときだけ、インストールをしたいので条件分岐を追加した
    • -x じゃなくて -f とか -e でも良よさそう
  • 元々 sudo install/usr/local/bin 以下にコピーしていたのをやめた
    • restore_cachepermission denied でコケる
    • 代わりに ~/projects/.bin 以下にした
  • 注意点として checkout してから ecspresso をインストール する必要がある
    • まっさらな状態じゃないと checkout できないことを忘れていてハマった
    • これは今回に限った話じゃなくて、キャッシュを使う場合に気をつける

便利なツールはたくさんありますが、安全に使っていけるようにこれからも気をつけていきたいと思います。

明日は @youichiro さんです!