hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

MacのDockerもVersion 18.06.0-ceになってdocker buildが改善

github.com

7/18に先行してリリースされていたDockerの18.06.0-ceですが、 for Macにも対応されました。

今回の改善でかなりbuild速度が改善されているということで今後もDockerがコンテナ技術を引っ張っていきそうですね。

dockerjp.connpass.com

Docker Meetup Tokyo #24 (DockerCon 2018報告会) に参加してきたのですが、

www.slideshare.net

ここにまとめてくださっています。 簡単にまとめると

  • docker buildの速度が大幅に改善されている
  • 並列化された
  • キャッシュが使えるようになった
  • BuildKit を使うことでいろいろ多機能になったのと今後の拡張性が展開される予定

今後はリリースタイミングは半年ペースに落ち着くのですが、目が離せない技術ですね。

orderで特定の文字列順に並び替える

数字順で昇順、降順で並び替えるのはよくありますが、 カラムに文字列を設定してしまっていると、並び替えたくなったときにすこし不便ですね。 そんなときにはfieldを使うとうまく並び替えれます。

select 
  id, 
  name
from items
order by field(items.size, 'XL', 'LL', 'L', 'M', 'S', 'SS', 'XS')

なようなことができます。

Railsで使う場合もscopeに登録しておくと便利そうです。

scope :order_size, -> { order("field(items.size, 'XL', 'LL', 'L', 'M', 'S', 'SS', 'XS')") }

WWDCがあったけどこのタイミングで新しいMacBookProが発表されたよ

www.apple.com

サプライズ!?なのかこのタイミングで新しいMacBookProが発表になりましたね。 私としてはスペックが上がって嬉しいところではあるものの価格とキーボードが気になるところです。

私のほしいスペックで見積もり見てみたのですが、税別で27万5800円なので、30万近くになってしまいます。 f:id:hotoolong:20180713114408p:plain

高い買い物になるので、なかなか悩みどころですね。

13inchで32G詰めると嬉しいところなんですがね。。

Railsのmigrationでchange_columnを利用する

change_column

Railsのmigrationでカラムの情報を変更したい場合によく使うchange_columnですが、

change_column(table_name, column_name, type, options = {})

と変更したいtypeを設定してoptionsを設定すればいいので、add_columnなどとインターフェイスが変わらず設定できます。

change_column_null

NULLのtrue/falseを切り替えたいだけの場合は change_column_nullが便利ですね。

change_column_null(:users, :nickname, false)

このように設定できます。

change_column_comment

カラムに設定するコメントのみを変更する場合はchange_column_commentですね。 nilを入れることで設定しているコメントを削除することもできます。

change_column_comment(:users, :id, 'comment')
change_column_comment(:users, :nickname, nil)

change_column_default

最後にカラムのデフォルト値を変更するchange_column_defaultなのですが、 このメソッドは引数にHashで:from と :to で設定することで可逆的な設定がすることができます。

change_column_default(:posts, :state, from: nil, to: "draft")

これは便利ですね。 テストで作ったけど戻したい等の場合はとても役に立ちます。

mysqldumpでテーブルを対象、対象外にする

mysqldumpを定期的にするのですが、 対象外にしたいテーブルが複数でてきたときの対応方法をメモしておきます。

ダンプファイルと取るときには直接テーブル名を選択すればいいケースもあります。 以下のコマンドですと一番上を選択してデータベースを指定して登録したいテーブル名を後ろに列挙するといいですね。

shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム

オプションはいろいろあるので見てもらうとして、対象外にしたい場合は--ignore-tableをつければ良さそうです。

ただ複数テーブル対象外にしたい場合は少し厄介で、--ignore-table=db_name.table_name をたくさん作らないといけなくなります。

shellで書くとすると以下みたいにつくります。

  db_host=hogehoge_host
  db_name=hogehoge_db
  db_user=hogehoge_user

  ignore_tables=("tests" "users" "accounts")
  ignore_option_str=""
  for tab in $ignore_tables[@]; do
    ignore_option_str=$ignore_option_str" --ignore-table=$db_name.$tab"
  done
  mysqldump --single-transaction $ignore_option_str -h $db_host -u $db_user -p $db_name

対象のテーブル名の方が少ない場合はテーブル名を列挙して取るのが早そうなので、ケースによって判断して取得するのがいいですかね。

Ruby2.6が早くもpreveiw2をリリース

今年のRubyKaigiは少し大きめのリリースがあったので残念ながら会社でお仕事してました。

Ruby 2.6.0-preview2 Released

preview2がリリースされたということで早速インストールしてみました。
brewからruby-buildを入れているので以下のように設定して置きました。

➜  ~ brew upgrade ruby-build
➜  ~ rbenv install --list | grep 2.6.0
  2.6.0-dev
  2.6.0-preview1
  2.6.0-preview2
➜  ~ rbenv install 2.6.0-preview2
➜  ~ rbenv global 2.6.0-preview2
➜  ~ ruby -v
ruby 2.6.0preview2 (2018-05-31 trunk 63539) [x86_64-darwin17]

これでしばらくruby2.6.0-preview2で生活してみます。