present? と blank? が嫌い

params の中身のように入っているオブジェクトのクラスが事前に分からないものに対して空っぽい文字列の場合と存在しない場合を区別したくないときに限って blank? を使うのは分かるけど、 nil チェックをするために blank? を使ったり、配列が空かどうかをチェックしたいだけなのに blank? を使ったりすると、 blank? の挙動を正確に理解して nil と空配列を区別したくないから使っているのか、それとも nil がくるかどうか分からないので適当に防御的に blank? を使っているのか、 あるいは blank? しか知らないのかが読みとれずにめんどくさいと思うことがよくある。 かわりに empty? を使っていれば empty? を持っているオブジェクトは blank? を持っているオブジェクトより少ないので読み手に伝わる情報量が大きくなるし、 かわりに nil? を使っていればその変数や引数が nil かもしれないことが考慮されているということが伝わりやすい。 blank? を気軽に使う人たちは ' '.blank?' '.blank? の結果を知って使ってるのかも気になる。 これらを知った上で blank? が適切だと判断し blank? を使ってるならいいけど、そうは思えないようなコードをよく見る。

似たような理由でブロック無しの any? が嫌いで、 !ary.empty? のかわりに ary.any? と書く人たちがいるけど、[nil].any?[false].any? の結果を知った上でその挙動を意図して書いているのか、単に ! と empty? を書くのがめんどくさくてそうしているのかが読みとりにくい。

Rails アプリでオンラインでカラムの削除やリネームを行うには

前提知識

Rails アプリにおいて、テーブルの追加やカラムの追加は簡単なものの、カラムの削除やリネームは慎重に行う必要がある。たとえアプリからそのカラムを参照してないとしても、いきなりカラムを削除するとエラーになる可能性が大いにある。

というのも Rails にはスキーマキャッシュというものがあり、テーブルのカラム情報をモデルがキャッシュしているからだ。このキャッシュはたとえばいわゆる N+1 クエリ問題を避けるために includes (eager_load) するときに参照される。 SELECT 句で t0_r0 のような機械的に別名が振られるようなクエリを見たことがある Rails エンジニアは多いと思う。

機械的に全カラムを取得するためにスキーマキャッシュを利用しているため、このようなクエリが実行されてる中でカラムを削除したりリネームしたりすると、スキーマキャッシュをもとに並べらたカラムの一部が消えてしまうため、不正なクエリとなってエラーになってしまう。 このせいで Rails においてカラムの削除やリネームは面倒なものになっている。

Rails 5.x 以降のやりかた

Rails 5.0 からは ignored_columns というオプションが追加され、ここに追加されたカラムは Rails からは見えなくなる。 このオプションはまさに Rails のオンラインスキーマ変更のやりにくさを解消するために追加された。僕が Rails 5.0 で最も好きな改善の一つだ。

https://github.com/rails/rails/pull/21720

なのでカラム削除の手順としては、

  1. アプリケーションコード内でそのカラムを参照している箇所を直す (これはスキーマキャッシュとは無関係に当然やる必要がある)
  2. Model.ignored_columnsカラム名を追加してデプロイ (1と同時でもよい)
  3. 実際にカラムを削除またはリネーム
  4. Model.ignored_columns を元に戻してデプロイ

という流れになる。

Rails 4.x でのやりかた

ignored_columns は使えないが、DB からカラム情報を取得するところにモンキーパッチをあてて特定のカラムを隠すようにすればなんとかいける。 具体的には MySQL を使っている場合は mysql2 adapter のメソッドをフックする。

module ActiveRecordInvisibleColumn
  INVISIBLE_COLUMNS = {
    'foos' => ['bar'],
  }.freeze
  def columns(table_name)
    super.delete_if { |column| INVISIBLE_COLUMNS.fetch(table_name, []).include?(column.name) }
  end
end

ActiveSupport.on_load :active_record do
  ActiveRecord::ConnectionAdapters::Mysql2Adapter.prepend(ActiveRecordInvisibleColumn)
end

この方法は foos というテーブル名が (たとえ複数の DB を使っていても) グローバルに一意という前提を置いている点に注意する必要がある。 これで Rails 5.x の ignored_columns と同じような効果が得られるので、あとは同じ流れでカラムの削除を進めることができる。 過去に某巨大 Rails アプリで実際に成功したのでまぁたぶんだいたいいけると思う。

とはいえ Rails 5.0 以上にさっさとバージョンアップして ignored_columns を使ったほうがいいことは言うまでもない。

(ネタバレあり) 魔法少女リリカルなのは Reflection 初日感想

文章にまとめられなかったので箇条書きで。

  • まず劇場に入る直前に Detonation が 2018 年公開という掲示を見て戸惑う。そこに映ってるなのはの姿は Reflection と一緒だし、キャスト一覧を見ても変わってないし、つまり……? という気持ちで入場した
  • はやてが自分の足で走ってる姿にまず感動。立って歩いてる姿は 2nd A’s にもあったけど、こう普通に生活できてるんだな感が
  • 今までは海鳴市という架空の場所だったのに、急に東京とか新宿とかが出てきて驚いた。これ今までのなのはシリーズの中で結構大きな変化な気がするけど……?
  • 咄嗟にワイヤーで反撃するのがとてもなのはらしくてよかった。強い
  • キリエがなのはやフェイトの顔面を全力で殴ってて笑った。実質 Vivid Strike!
  • リインがキリエに抵抗しているのがかわいかったし、キリエもちゃんと手加減していて傷付けることが目的ではないことを表せていてよかった
  • なのはが今度こそ助けると決意している横顔をアリサが心配しているシーン…… ここが実になのはらしくアリサらしく、今回の映画の中で特に好きなシーンの一つ
  • 闇の書事件を回想するときに「2年前」と言われていて実際作中だとそうなんだけど、こっちは5年待ったよ!!という気持ちで見ていた
  • シャーリー出てくるの意外すぎた
  • マテリアルズの登場。紫天一家大好きなので事前情報で登場が分かった時点で喜んだし劇場アニメで動いている姿を見れて感謝……
  • なのは対シュテル、高火力の魔法のぶつかり合いは見ていて楽しい。そういえばこのときってレイハさん無しで戦ってた?
  • ユーノくんの結界強すぎる
  • フェイト対レヴィは、フェイトの最後の必殺技ですね…… バインドをかけて全力全開といいながら撃つ姿は 1st のなのはのそれでここも特に好きなシーン
  • リンディを母さんと呼ぶシーンはとても感動的なんだけど、バインドをかけられてるとはいえレヴィがすぐ近くにいることを思うとちょっと
  • はやて、基本後方支援型なので全体的に得意分野じゃない戦闘で苦戦したり変身シーンもカットされたりでやや不遇だった……
  • イリスが嘘を告白するシーン。全部が嘘ってのもちょっと無理があると感じたし Detonation で回収されてほしい
  • そしてユーリ登場。一応 BoA や GoD のストーリーを知ってる身としては特に設定が変わったように見えたけど、とはいえ Reflection の時点では情報が少なすぎてなんとも。個人的にはイリスが言ってる内容には一部間違いというか勘違いみたいなのが含まれていると思っているけど、どうなるんでしょうね
  • なのはが立ち向かおうとしたところで終わり。入場前に見た Detonation の掲示と合わせて、前後編か~~という気持ちになった
  • 最後の週変わりの映像特典、マテリアルズがメインでしゃべってるだけで嬉しいし、来週は初代リインフォースも出るっぽいので楽しみですね

(ネタバレあり) アイカツスターズ! イリュージョン Show Time 感想

アイカツスターズ! の VR ステージ「アイカツスターズ! イリュージョン Show Time」を何度か見てきた。 http://www.aikatsu.com/stars/event/aikatsustars_illusionshowtime/

A パターンと B パターンの2つがあって、両方とも見た。実際のところ A と B の差分はそこまで大きくはなくて、曲目と順序や MC パートは共通で一部の曲で歌うユニットやコーデが違うという程度。

VR ステージ

VR ステージというのを見るのは初めてで、少し前にプリキュアでもやってるのを知ってたけど、実際に見たのは今回が初めて。 メガネをつけずに楽しめる VR ステージがどんなものか期待と不安があったが、実際に見てみるとすごくよく出来ていて感動した。 フル CG によるライブはテレビアニメとかアーケードとかで見慣れているわけだけど、VR ステージだと立体感が全然違うというのもあるし、テレビアニメだとカメラワークによってメインだけが映されていたりするものが VR ステージだと本物のライブのときのように常に全体をみわたせてそれぞれのよさがあった。 とくに MC パートではキャラクターの背後に影ができていたり、レイが話している間に観客のほうをきょろきょろして落ち着きがないきららがいたり、本物感を感じられた。スポットライトがあたっていないときの挙動にそれぞれのキャラクターの個性が出ているのがよい。

途中にファッション Show Time という撮影 OK のコーナーがあるのでそこでの写真。暗闇の中なのでうまく撮るのがむずかしい…… なんとなく後ろに影があるのがわかると思う。

映像の出来は大満足だったんだけど、あえて不満点を上げるなら前後の移動がほとんど無いことだろうか。キャラクター同士が交差することはあっても、前後の移動が極端に小さいように感じた。技術的制約なのかもしれない。 キャラクターが前に出てくるのに合わせて背景等が動くことで前に出てきてる感は出ていたけど。

ライブ

基本的に曲は全部ショートバージョンなんだけど、みんな大好き episode Solo だけがフルバージョンで、フルだとわかった瞬間に自分含めて会場全体でどよめきがおこった体験がよかったですね…… 荒野の奇跡ではステンドグラスが割れるシーンが VR でも再現されていてよかったし、舞っていた羽がラストで空中で停止する演出もかっこよかった。停止するのはアニメ53話ともアーケードとも違うので独自だと思う。

A パターンでは One Step がアニメ31話の SKY-GIRL バージョンで、個人的にはゆずこしょうのユニットが好きではあるんだけどこれはこれでよい。 またアニマルカーニバルではゆずとあこのバージョンで始まった後、途中できららが入ってくるという楽しい演出があった。ゆずといいきららといい、スターズになってからポップの自由なアイドルが好きになった。 一方 B パターンではアニマルカーニバルがアニメ42話のゆずリリバージョンだった。ありがとうございます。One Step はゆずこしょうバージョン。 それ以外の A、B の差分だと、Miracle Force Magic でツバサのコーデが変わっていたり、A ではみつばちのキスがゆめロラで B ではアニメ44話のまひロラバージョンだったり。どちらが好きかが諸説ありそうだけど個人的には A がより好きです。

その他

ライブシーン以外にもニコニコしてしまう場面がいくつかあって、リリィのステージが終わったときに壇上に出てきて甘やかしていくゆずとか、ファッション Show Time での香澄姉妹の掛け合いとか、エルザとかと立っているときららの身長が低めな点が目立ったりとか。 それとエンディングで2人ずつペアで登場して締めの挨拶をしていくところは外せなくて、最初いきなりひめツバが手を繋いで登場したときにヒッと声が出たけど、その後ゆずリリ、よぞまひ、あこはる、ゆめロラと全員手を繋いで登場して感謝しかなかった。 カプ厨にやさしい。

分離式キーボード MiSTEL BAROCCO MD600 を使ってみた感想

https://www.amazon.co.jp/dp/B01KN6VEYG/ これを買って3週間ほど仕事とプライベートで使ってみた感想。 先に結論を書いておくと、現在は使わなくなってしまった。

きっかけ

Nintendo Switch を発売日に手に入れてゼルダの伝説 BotW を楽しんでいたところ、プロコンのほうがより正確に操作しやすいと感じつつも、左右に分かれた Joy-Con での操作がとても楽であることを実感し、分離式キーボードにも興味を持って MiSTEL BAROCCO MD600 を買ってしばらく使ってみることにした。

前提

RealforceThinkPad のワイヤレスキーボードをよく使っていて、単純にキーボードとしては Realforce が一番良いと思いつつも、ThinkPadトラックポイントとワイヤレス (Bluetooth) も便利だと思って使っている。 どちらも物理的には JIS 配列のキーボードであるものの、論理的には US 配列として使っている、いわゆる物理 JIS 論理 US の状態。 余った無変換キーとか変換キーとかを Esc や Shift にリマップして使っている。 https://github.com/eagletmt/dotfiles/blob/master/dot.Xmodmap

良かった点

楽な姿勢で使える

そもそもこれを期待して買ったわけだけど、実際に左右に分かれていることでより楽な姿勢で使うことができた。個人的にはこれだけでも結構でかい。左右のキーボードをつなぐ付属の USB ケーブルがやたら短いのが気になったけど……

悪かった点

右手でも左手でも押したいキーがあるのに押せない

自分は b と y のキーを普段は両方とも左手で押しつつもたまに右手で押したりする。 左右に分離しているキーボードである以上、右側にあれば常に右手、左側にあれば常に左手で押さなければならない。これが結構きつかった。 y キーを右手で押すように矯正するのはそれほど大変ではなかったけど、普段左手で押してる b キーも時折右手で押していることに気付いて、これらを完全に矯正しきるのはなかなか大変そうだと思った。

物理 US のキーボードである

前提でも書いたけど、普段は無変換キーや変換キーを Esc や Shift にリマップしている環境で生きていて、それらができない時点でストレスがあった。 物理 US の環境は仕事で触れる機会もあるので一時的に使う分には問題無いけど、ストレスなく常用できるまではいけなかった……

一部キーが Fn と同時押しである

矢印キーやバッククォート、チルダを押すのに Fn と同時押しで厳しい。物理 US であることにも関連するけど、自由にリマップできるとはいえそもそもキーの数が少なすぎる。

うるさい

メカニカルキーボードうるさい……

まとめ

分離式で、JIS 配列で、左右に y と b キーがある、Realforce がほしい。

Docker と nftables

Docker は iptables を前提として書かれており、nftables を使っている環境ではそのままだと動かない。 issue は既にあったんだけど nftables を使っている環境はまだまだ少なそうだし進まなそう https://github.com/moby/moby/issues/26824 。 とはいえ iptables でやってることは少ないので、ちょっと設定を足せば動かせる。

とりあえず dockerd に iptables を触らせないようにして、

# /etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --iptables=false

あとは nftables の設定で masquerade を足せばいい。nftables だと変数使えて便利ですね。

define docker_bridges = {"docker0", "br-0123456789ab"}

table inet filter {
  chain forward {
    type filter hook forward priority 0;
    policy drop;

    ct state {established, related} accept;
    ct state invalid drop;

    iifname $docker_bridges accept;
  }
}

table ip nat {
  chain prerouting {
    type nat hook prerouting priority 0;
  }

  chain postrouting {
    type nat hook postrouting priority 0;
    oifname != $docker_bridges masquerade;
  }
}

Docker の network を作成すると br-${network_id} というブリッジが作成されるので、Docker の network を作成するたびに手動で編集する必要があるのがだるいけど、まぁ network を増やすことはそんなに発生しないはず。

2016年の思い出

しゃかいじんさんねんめ

去年は http://eagletmt.hateblo.jp/entry/2015/12/31/212651

仕事

hako の開発と環境作りがメインだった。 https://github.com/eagletmt/hako

Docker を使ったアプリケーションの動作環境作りは 去年もやってた んだけど、Amazon ECS が出てきたのでそれを利用した環境とそのためのデプロイツールの開発をしていた。 開発自体は去年の9月頃から始めていたんだけど、ツール面でもインフラ面でもちゃんと使える状態にして、実際に使われ始めたのが今年だった。 社内で新規に Web アプリケーションを作ったりバッチジョブを作ったりする上で標準的な選択肢になってきている。 http://techlife.cookpad.com/entry/2016/03/16/100043

発表

Rails Upgrade Casual Talks に誘われて発表してきた。発表は今年だけど内容的には 2年前のもの なのであんまり今年感は無い。 https://speakerdeck.com/eagletmt/activerecord-3-dot-2-4-dot-1

あとは hako の話を JAWS-UG おコンテナ支部 #5 でした。Amazon ECS を使ってこういう環境を用意して、そのために hako というツールを作っているという話。 https://speakerdeck.com/eagletmt/ecs-woli-yong-sitadepuroihuan-jing

趣味開発

envchain の Linux 対応 をしたのが自分にとって地味に一番インパクトあった気がする。個人でも仕事でも利用している。

あとは 録画スケジューラで試しに gRPC 使ってみたりmitamae を高速化してみたり かな…… こう書いてみるとあんまコード書いてない気はする。

VPS と自宅の間に Site-To-Site VPN はったり IPv6 対応したりして、ちょっとだけネットワークまわりの経験値をためた。 Docker のネットワークまわりの理解の助けにもなった気がする。iptables に対する苦手意識が減った。

アニメ

アイカツ終わってしまいましたね…… アイカツスターズ、最初はちょっとうーんと思っていたけど、劇場版がすばらしくてそこからテレビシリーズのほうの印象も一気によくなった。毎週楽しみです。

ViVid Strike! が魔法少女感はないもののやっぱりリリカルなのはだこれってかんじの話でとてもよかった。これとあわせてついに Reflection の上映日も発表されて本当に楽しみですね。

BD 買ったのはアイカツアイカツスターズプリズマイリヤドライ、ViVid Strike!、(まだきてないけど) ブレイブウィッチーズ、と結局代わり映えしないかんじになってた。

ゲーム

星のカービィロボボプラネット、スターフォックスゼロ世界樹の迷宮5、そしてポケモンサン・ムーンが買って面白かった。あと地味にピクロスにはまってピクロスeのシリーズを買ったりしていた。

ペルソナ5うたわれるもののために PS4 を買った。PlayStation 系のハードを買ったのはこれが初めて。友人にやらせてもらったり、友人から PSP を借りてなのはのゲームをやったことはあったけど。 どちらのゲームもたいへんよかった。

アイカツスターズの筐体デビューしてゲーセンに行く習慣ができた。 その結果、最近スクフェス AC をやって楽しんでる。EXTREME まではついていけるけど CHALLENGE はがんばりが必要そう。 音ゲー勢からはチュウニズムをすすめられているので来年は。