Rails 6 から入った multi environment credentials を使う

最初は社内ブログに書いてたけど、動機は「探してもあんまり日本語のよさそうな情報がなかったから」なのでここに書きます。適当な理解という感じですが、いまのところうまくいっています。

前提

❯❯❯ be rails --version
Rails 6.0.0
❯❯❯ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]

tl;dr

  • 環境ごとに credentials ファイルとその鍵を分けられるようになりました。
    • bundle exec rails credentials:edit --environment staging のような感じで編集します。
  • RAILS_MASTER_KEY に、 RAILS_ENV と一致した適切な鍵を入れれば自動で decrypt されて実行されます。
    • Rails.application.credentials.muse[:minami_kotori] たとえばこんな感じでアクセスできます。

rails/rails の実装 PR

Add support for multi environment credentials. by morgoth · Pull Request #33521 · rails/rails

やりかた

  • いままでの bundle exec rails credentials:edit に option を付け加えるだけです。実際どういう風に中身を書いてアクセスするかは後述します。
    • ex: bundle exec rails credentials:edit --environment production
    • ex: bundle exec rails credentials:edit --environment staging
    • ex: bundle exec rails credentials:edit --environment development
    • ex: bundle exec rails credentials:edit --environment test
  • decrypt するには、後述するようなディレクトリ構造で鍵を持ってきて置くか、実行する RAILS_ENV に応じた RAILS_MASTER_KEY を設定します。
  • 実行している RAILS_ENVcredential が存在するときはそこを勝手に読みにいってくれるので(実装参照)、特に追加する設定はないです。 .gitignore にも追加してくれます。
    • ただ、 secret_key_base については、 production のは最初からあった config/credentials.yml.enc から持ってくると楽です。
    • staging のものは bundle exec rake secret とかで出したものを設定するとよいでしょう。

https://github.com/rails/rails/pull/33521/files#diff-19128a84fe2ae7019ccdb86efc86f684R281-R299

def credentials_available_for_current_env?
  File.exist?("#{root}/config/credentials/#{Rails.env}.yml.enc")
end

def default_credentials_content_path
  if credentials_available_for_current_env?
    File.join(root, "config", "credentials", "#{Rails.env}.yml.enc")
  else
    File.join(root, "config", "credentials.yml.enc")
  end
end

def default_credentials_key_path
  if credentials_available_for_current_env?
    File.join(root, "config", "credentials", "#{Rails.env}.key")
  else
    File.join(root, "config", "master.key")
  end
end

ディレクトリ構造とか

こういう風になります。

❯❯❯ tree config/credentials
config/credentials
├── development.key
├── development.yml.enc
├── production.key
├── production.yml.enc
├── staging.key
├── staging.yml.enc
├── test.key
└── test.yml.enc

ファイルの中身はこんな感じ。

muse:
  minami_kotori: kawaii
  private_key: |
    -----BEGIN RSA PRIVATE KEY-----
    naisyo no kagi dayo
    -----END RSA PRIVATE KEY-----

secret_key_base: himitsu <3

コードからは、こういう感じでアクセスできます。

kotori = Rails.application.credentials.muse[:minami_kotori]
key = OpenSSL::PKey::RSA.new(Rails.application.credentials.muse[:private_key])

うれしいこと

  • 権限に応じて適切に見られる情報を管理できる
    • たとえば、 production.key は正社員とかつよい権限のひとしか知らない、とかができる
    • 業務委託でお願いするひとには test.keydevelopment.key だけわたす、とか
  • 環境によって変化する値を気にしなくてよくなる
    • unstable と production で値が異なるときとか
  • kubesec とかでやるにはむずかしい機微情報を管理できる?
    • 環境変数に入っちゃうのは良し悪しだと思うので…。

tips

  • VSCode とかで編集したいひとは EDITOR='code --wait' をつけるとよいです。
    • EDITOR='code --wait' bundle exec rails credentials:edit --environment staging みたいな。
  • 鍵がなかったり間違っていたりして decrypt に失敗したときは nil が入るので、気をつけないと肝心なところで壊れます。
    • kubesec とか CircleCI で RAILS_MASTER_KEY を入れている場合は改行が入っていないか気をつけましょう。

魔王城でおやすみが好き

この記事は2018年オススメのマンガ Advent Calendar 2018の12/10分の記事です。
遅刻しました。

全部で5記事書くことになっているうち、これは1つめです。

魔王城でおやすみ

ということで今日書くのは「魔王城でおやすみ」という作品です。いま調べたところ、週刊少年サンデーで連載しているみたいですね。異様に刊行ペースが早いなと思っていたんですが、それならかなり納得です。

簡単なあらすじとしては、人類統一国家(なんと人類の国家は1つだけ!!)の姫が魔王に誘拐されるんですがなんだかんだあって快適な睡眠を求めるためになんやかんやして馴染んでワイワイみたいな感じですかね。
あらすじって書くのむずかしくないですか?でも大体の流れは姫が寝るためにあらゆる手段を取って殺したり死んだり生き返ったりしているのでたぶんあってると思います。
ジャンルとしてはコメディ…かな?

1巻はこれ↓、まとめ買いはこれです。
はてなブログの独自タグよくわからない…

好きなところ

たぶんオススメの理由とかを書くべきなんでしょうけれど、個人の好みでオススメって言ってしまうのはあんまり…となってしまうので、わたしが好きな理由をただ書いていこうと思います。

絵がかわいい

まあこれは大事ですね。
ただ、かわいいにも種類があると思っていて、いわゆる萌え萌えきゅん的なもの、絵がうまい、デフォルメ的なもの、しぐさがかわいく見えるもの、愛嬌があるもの、などたくさんあると思うんですが、「魔王城でおやすみ」はしぐさ+愛嬌+絵がうまいで構成されていると!個人的に!思っています。
基本的な舞台が魔王城なので、さまざまな種類の魔物が出てくるんですが、どれも特徴をとらえた愛嬌のある見た目に書かれているし、しぐさ/言動が愛着を持てるよう描かれていてすごくよいです。
姫もかわいくて、姫は本当にすべてがかわいいです。絵もしぐさも言動もかわいい。好き。

キャラクターが覚えやすい

前述の通り主人公たちに加えてさまざまな種類の魔物が出てきます。
しかしほとんどの登場人物(魔物)に明らかな特徴づけがなされており、その特徴に合った特徴的なエピソードが用意されているのですぐ思い出すことができます。また、姫も名前ではなく見た目や種族ベースのあだ名で呼んでいるので覚えるコストが低いです。あと面白い。
新刊が出るたびに「これ誰だっけ?」となってすべて読み直すみたいな、 O(n^2) をしなくて良いのでかなり脳に優しいです。

姫が寝ている

あらすじにも書きましたが、この本は「姫が寝る」お話です。つまり、要するに、(関係性の蓄積や行動の蓄積などはありますが)ストーリーがわかりやすいです。過去の文脈にほぼ依存しません。
たとえば他の作品を考えてみると(たとえばリゼロやマリみて、H×Hでもよい)、数ヶ月ぶりに新刊を読んだ時にキャラクターやストーリーを忘れていて、結局今までのをちらちら読み返しながら読む or めんどいから読むのをやめる、となったりするんですが、「魔王城でおやすみ」で思い出す目的で読み返したことはありません。(もっかい読みたい!となって読み返したことは何度もあります)

単行本の空白ページがかわいい

単行本派なので、雑誌がどうなってるか知らないんですが、各話の間にさまざまな職業の格好(というかコスプレ)をした姫が載っていて、すごく、かわいいんですね…
これを各話ごとにやっているので、おそらく100種類以上やっていて、ここまで思いつくのがすごいなあと思ったりします。次巻が楽しみです。

ということで

魔王城でおやすみ」の紹介というか好きなところでした。
ゆるふわな感じの脳にやさしい、日常系っぽいけど女の子だらけではないシュールな感じのものが読みたくなったらぜひ読んでみてください。

ISUCON 2017 参加記録

@li_saku, @kyuridenamida, @akensho でluminousというチーム名で出ました。
最終的には 20位 203,319 luminous ぽいです。
参加記書かなさすぎて何を書いたら良いか忘れたので適当に書きます。

きゅうりの参加記→ ISUCON2017参加記 - kyuridenamidaのブログ

記憶に残っていること 時系列ばらばらかも
  • akensho さんが起動時に実行するスクリプトとか、解析用のツールとかを全部用意してくれてて、特に pprof とかめっちゃ便利でこれを元にボトルネック潰しまくれたので、サイコーだった。
  • kyuridenamida が ssh うまくいかなくて github 繋がらんとか言い出しては?って言いながらなんとか一緒にがんばっていた
  • ソース読む前にアプリケーション一通りさわってみて、この URL はこの挙動をするみたいなのを一通り把握した。
  • 画像がそのまま BINARY として DB にいれられていたから、やべーだろということでファイルに書き出すようにした。←ここ戦犯ポイント
    • この時点でファイルサイズを見るべきで、いろんなユーザの /profile を見ていたはずでアイコンなんかでかいなとは思ってたはずなのにサイズを見られてなかったから、もっとキャッシュについて調べることに気づくべきだった・・・;;
  • Nginx でキャッシュを効かせる方法を調べて、画像ファイルは静的を返すようにおまじない書いたらスコアが爆上がりした。
  • ベンチマークはかるページ?ポータル?で出てるメッセージを見るとなんか webfont とかがあるので、 MIME を調べて conf に追加したりする。
  • サーバ1台でやってたけど、 web1 サーバを Nginx 専用、 web2 サーバをアプリケーション専用にすることにしていい感じにしてもらう。
  • /fetch についてがんばったりしてたんだけど、よく考えるとスコア加算されないから、 /message とか /profile とか /login を見るべきだった、レギュレーション読み込みがあまりにも遅かった。
  • /fetch がスコア加算されないってレギュレーションに書いてあったのに無限にリクエスト飛んできてたから、参考実装に書いてあった sleep を復活させるとスコアが爆上がりした。ここで sleep ガチャもするべきだった。
  • ベンチマーク動かしてるときに Nginx 用で top -c を眺めて、 akensho さんが「このCPU使用率はスコア17万ぐらいやで」とか「これは徐々に下がってきてるからたぶん数万やで」とか言い出して、謎のスキルを会得していた。スコア予測マスタリ★
  • 最終的に、まったく同じアプリケーションを動かすのに reboot 前後でスコアが17万ぐらいの差が出るようになって、ガチャやんけとなり40分ほどチキってガチャを回さなくなって、20万ぐらいでやめてしまった。
  • sleep 入れるとスコア上がるのがわからなくて、その間別の処理出来るからじゃね?(適当)みたいなことを言いまくっていたんだけど、よくわからないままだった。
  • 最大の戦犯ポイントはここで、やめようって言い出したのはわたしで、最大スコアは 215,000 ぐらいだったので、もし回し続けていれば予選通過できていたはず。
  • くやしい;;
モチベーション
  • 本戦がある 11/25 は CODE FESTIVAL 2017 の開催日であって、 kyuridenamida と akensho さんは関係者のため出られない。
  • わたしは誕生日なので出られない。
  • よって、本戦通過してドヤ顔で「誕生日なので棄権します!!」って言いたかった
  • もう少しで言えた。・゚・(ノД`)・゚・。
おもしろ commit log

f:id:li_saku:20171025132243p:plain

  • そのに
  • これは sleep ガチャ回そうとしていたところかな

f:id:li_saku:20171025132310p:plain

おわりに

めっちゃ悔しくて、もっと web アプリケーションの速度についてとかインフラとか SQL 文とか解析についての能力があれば予選通過余裕で出来ていたかもしれないのに、後悔が多すぎてめっちゃ悲しい。
頼りっぱなしだったし、 N+1 問題も頭フル回転してる kyuridenamida に全部任せてしまったけど、分担できればもっと潰せたはず。
悔しいよーーーーーーーーーーーーーーーーーーーーー
でも楽しかったのでありがとうございました。開催&出題ありがとうございました。

OPENREC のアーカイブをmp4で保存する

毎回忘れてぐぐるのでメモる。rubyで書いた記憶があるんだけど、コマンドを回しただけだった。

他人の黒歴史残したい人、動画化したいけどキャプチャしたりするのだるいし画質悪い…って人向け。

必須:ブラウザ(ページのソースが見られればなんでもいい)、ffmpeg

ffmpeg 入ってないひとは、 (ここ)https://www.ffmpeg.org/download.htmlGet the packages で自分の OS を選んで、リンクに飛んでダウンロードする。使い方は…調べたほうが早そう。簡単に言うと、Macならなにも考えなくても使えそう。 Windowsならダウンロードして解凍→cmdでそこに移動して実行する。

わかりやすいと思った→windowsにffmpegをインストールする | ぱーくん plus idea

残したいアーカイブのソースを見る。
  • Chromeなら右クリック→ページのソースを表示。
  • m3u8 で検索すると url がひっかかるので、それをメモる。
  • 期待するURL : https://*.cloudfront.net/*/normal.m3u8 適当に脳内変換してね。
  • 仕様が変わって https://*.cloudfront.net/*/playlist.m3u8 になったぽい
ffmpeg につっこむ。
  • コマンドプロンプトffmpeg -i "ここにメモった url を入れる" -c copy out.ts で、ひとまずローカルに out.ts という名前でファイルが落ちてくる。
  • 長いので気長にまつ。だいたい放送時間 / 3秒ぐらいはかかる。
  • 出力なくなったら(終わった雰囲気出てたら)おわり。
  • 期待する結果: out.ts って名前の動画ファイル。
mp4 に変換する
  • ffmpeg で変換してあげる。面倒なので音声とか映像コーデック変えたりしません。
  • ファイル名そのままなら ffmpeg -i out.ts out.mp4 とかする。
  • エンコードは時間かかるので気長に。わたしのスペックならだいたい放送時間 / 2秒ぐらい。あとCPUパワーもけっこう食う。ファンがうるさい。
  • 期待する結果: out.mp4 って名前の動画ファイル。

これで mp4 動画が落ちてくるので、黒歴史保存し隊もニッコリですね。

異世界スマホ11話はすごい

結論

全然やばくないしやばいって言ってる人間はなろう読み慣れてないだけ

以下蛇足

異世界スマホ11話がやばい、拷問、脳が溶けたような会話、問題点しかないと話題でした。
見たときからそんなにやばいか?と思ってたんだけど、12話見てもやっぱりやばいと思わなかったので記事を書きます。書きたいなーと思ってたんだけど機会を逃してたので。

11話のあらすじ

まあ色んな所で書かれてるんですけど、空中庭園見つけてマスターになって女の子が増えて正妻の余裕を見せつけて会議が行われる。終わり

見つけた/思いついた問題点について反論してみる

  1. 異世界スマホ11話、面白くなさすぎる、拷問すぎる

    1話から雰囲気変わらないと思うので1話で切ってください。11話で拷問って思うなら1話ですら拷問だと思いますね…

  2. 目的がないまま話が進んでいく

    一生こころがぴょんぴょんするとかゆゆ式は神アニメとか桜Trick桜Trick)とか言うなよ

  3. ハーレムすぎない?

    そういうアニメって最初の数話でわかってたしなんで11話まで見ていたのか疑問があります。それを承知で11話で公認ハーレム会議が開かれたのが意味不明で受け付けないって人にちょっとわかってほしいことがあって、あのハーレム会議、すごくないですか?
    ユミナが正妻である余裕をもって、「わたしは正妻であって、正妻に提案されたことを実行してしまうと第二夫人以下になる」という暗黙の条件が存在する場を設けるんですよ。すごいですよ、これは。正妻でしか出来ないことです。
    そして、望月冬夜に心酔しているエルゼ、リンゼ、八重はそれを実行するしかない(しないと将来的に離れる or 非公式な愛人になる)という勝ちしか見えない状況で仕掛けるというの、王女としての本能と教育を感じます。
    すごいですよね、「穏やかだったり安心感があるから見続けてきた」っていう層に「安心できますよ」と言ってるんですよ、すごくないですか?つまり、彼女たちに明確な序列が出来て争いがなくなるんですよ。1位ユミナ、2位リンゼ、3位同列リンゼ/八重という、夫人の序列が明確になって順位争いの影での争いがなくなって、安心して放送されてるものを享受できるんですよ。ひどいというよりむしろ"やさしい"ですよね。
    明確に序列を設定しているので、Re:ゼロとかそのあたりよりかなり大胆なことを行っていると思いませんか、これは拷問とかではないですよ。他の作品が敵とかイベントとかで誤魔化してベールにくるんで見ないようにしてるものを、全部剥いでありのままにして明確にしようとしてるの、すごいですよ。すごいとしか言ってないけど、これはほんとうにすごいですよ。
    アニメ、基本的に書籍化されたものを使っているから、なろうの流行から3周遅れみたいなイメージあるんですけど、正妻の余裕を見せつけて公妾とか愛人とかしだしたのって1.5周前ぐらいじゃないですか?それを映像化したのがさすがだと思います。脚本家と原作者の勇気だと思います。

  4. 後半失速しすぎ

    いやなろうもので後半失速してないものあります?30話程度で完結するものでも普通に20話あたりぐだるんだしそんなものじゃないですか?
    完結してるものならまるごと飛ばしても問題ない話をアニメ化したらああなって当然だなって感想だし、わざわざ指摘する事項でもない気がします。

これでよくない?

個人的には面白いというか、そんなに酷評されるか?とは思いました。
おもしろがって過剰に言ってるだけで実はそんなにパターンかなーと思ったので、そんなに言わなくていいんじゃないかなって…みんな色々言ってるのに何も思わなかったのがおかしいのかなと感性を疑ったんですが、やっぱり多様性だよなと思ったので「異世界スマホは悪くない」を主張します。 ひどいというか、拷問というより、前述したように逆に挑戦的な良いアニメだと思いました。

むすび

良いアニメ化だったと思いました。なんか色々言ってるひとはとりあえず ISUCA とか見るといいんじゃないかな…これでだめならビビッドレッド・オペレーションとかもハマるかもしれない。ささみさん@がんばらないはめっちゃ好き。
(正直拷問度ならキルミーベイベーのほうが高いと思った)