読者です 読者をやめる 読者になる 読者になる

WEB+DB PRESS Vol.98 読了

ようやく最新号を読み終えました。

WEB+DB PRESS Vol.98

WEB+DB PRESS Vol.98


 
Dockerの特集記事が個人的には良かったです。
これ1冊で十分ではないですが、入門書としては良いかもしれません。
個人で運用していても、MacLinuxの差異を時々感じることがあるので、もう少し勉強して開発環境で使ってみたいと思います。

これからはじめるDockerメモ

各種ツール

Vagrant: 仮想環境をコマンドラインで操作できるようにしたもの
Chef: 構成管理ツール。cookbook/recipe と呼ばれる設定ファイルを通し、環境(dev,test,prod)を問わずに同じ環境を再現する仕組み

Vagrantで仮想マシンのOS環境を整える
Chef(Puppet, Ansible)でミドルウェアを整える
Capistanoでアプリケーションのデプロイをする

というように利用。

問題

  • 増える環境(local, test, ci, staging, production)
  • 環境差異(ミドルウェアの有無、バージョンや依存関係の有無)

そこでDocker

アプリケーションを素早く開発、移動、実行するためのプラットフォーム。
Linuxカーネルのコンテナ技術(プロセスなどの名前空間の分離、control groupによりリソース設定)
仮想サーバとは異なる。あくまでもプロセスやファイルシステム、ネットワークが独立して見えるだけ。

  • コンテナの起動が早い
  • ディスク容量が少ない

Rails の seed.rb に冪等性を持たせる

rake db:seed を何回やっても大丈夫なようにするには auto increment の管理が必要になります。
本番環境で何度も実行することは、ほぼあり得ないし、開発環境であれば直接DBをわさわさしちゃえば間に合うので、まともに実装する必要はないんでしょうが、少し調べてみました。

自前で拡張

sql - Rails way to reset seed on id field - Stack Overflow
reset_pk_sequence というメソッドを追加していますが、面白いのが PostgreSQL の場合 reset_pk_sequence! というメソッドを呼ぶだけのようで、Rails自体に実装されています。
しかし、MySQLは考慮さえされておらず(MySQL用に拡張するのは簡単だと述べられていますが)DB格差が生まれています。

PostgreSQL実装

# active_record/connection_adapters/postgresql/schema_statements.rb
        def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc:
          (略)

            select_value(<<-end_sql, 'SCHEMA')
              SELECT setval('#{quoted_sequence}', (SELECT COALESCE(MAX(#{quote_column_name pk})+(SELECT increment_by FROM #{quoted_sequence}), (SELECT min_value FROM #{quoted_sequence})) FROM #{quote_table_name(table)}), false)
            end_sql

MySQLも考慮してみる

config/initializers 以下に格納。
こんな感じでしょうか。

module ActiveRecord
  class Base
    def self.reset_pk_sequence
      case ActiveRecord::Base.connection.adapter_name
      when "Mysql2"
        new_max = maximum(primary_key) || 0
        update_seq_sql = "alter table #{table_name} auto_increment = 1;"
        ActiveRecord::Base.connection.execute(update_seq_sql)
      when "SQLite"
        new_max = maximum(primary_key) || 0
        update_seq_sql = "update sqlite_sequence set seq = #{new_max} where name = '#{table_name}';"
        ActiveRecord::Base.connection.execute(update_seq_sql)
      when "PostgreSQL"
        ActiveRecord::Base.connection.reset_pk_sequence!(table_name)
      else
        raise "Task not implemented for this DB adapter"
      end
    end
  end
end

database_cleaner

ついでに test でお世話になっている DatabaseCleaner はどういう実装かというと、基本Truncateで処理しSQLiteの場合は sqlite_sequence を delete していました。

# database_cleaner-1.6.1/lib/database_cleaner/active_record/truncation.rb
    module SQLiteAdapter
      def delete_table(table_name)
        execute("DELETE FROM #{quote_table_name(table_name)};")
        if uses_sequence
          execute("DELETE FROM sqlite_sequence where name = '#{table_name}';")
        end
      end
      alias truncate_table delete_table

最近買ったスニーカーが軽すぎて最高

何年振りかにRunnig Shoes兼普段履きのスニーカを書いました。
もともとassicsのRunnig Shoesを1足持っていたのですが、そこそこ軽くて結構頑丈で良いのですが、どうも見た目がかっこ悪い。
もうちょっとかっこいいやつないかと探してみたら、最近は軽い、かっこいい、安いの3拍子揃ったやつが結構あるようで、色々迷いました。
最終的にはNIKEのFREE RN FLYKNIT 2017 を購入。

Nike メンズ

Nike メンズ


 
これが非常に良いです。
割と歩くのが好きで、1日5-10kmぐらい平気で歩くのですが、この靴にしてから足の疲労度が全然違います。もっと早く出会いたかった。
以下の記事でもあるように、スニーカー軽くておしゃれで色々捗るのでおすすめです。
 
シリコンバレーの大物たちが履くスニーカー24選 | BUSINESS INSIDER JAPAN