nginxとRackとX-Accel-Mappingと。その2 このエントリーを含むはてなブックマーク はてなブックマーク - nginxとRackとX-Accel-Mappingと。その2

2017 年 8 月 15 日 コメントはありません

GitHubからの通知メールがいくつかまとめて来てたため見逃してしまっていたのですが、この前Rackに投げたPRがマージされていました。

手元でパッチを当てていたので、嬉しい。詳細については↓に書いています。

nginxとRackとX-Accel-Mappingと。 » サイキョウライン
まず、課題となっている場所はここで、いまの実装はこんな感じ。

カテゴリー: Rails, Ruby タグ:

nginxとRackとX-Accel-Mappingと。 このエントリーを含むはてなブックマーク はてなブックマーク - nginxとRackとX-Accel-Mappingと。

2017 年 7 月 3 日 Comments off

Rack

https://github.com/rack/rack/blob/master/lib/rack/sendfile.rb#L149
まず、課題となっている場所はここで、いまの実装はこんな感じ。

def map_accel_path(env, path)
  if mapping = @mappings.find { |internal,_| internal =~ path }
    path.sub(*mapping)
  elsif mapping = env['HTTP_X_ACCEL_MAPPING']
    internal, external = mapping.split('=', 2).map(&:strip)
    path.sub(/^#{internal}/i, external)
  end
end

nginx

設定はこう。「X-Accel-Mapping」を複数定義している。

server {
  location ~ /foo/(.+) {
    internal;
    alias /path/to/real/foo/$1;
  }

  location ~ /bar/(.+) {
    internal;
    alias /path/to/real/bar/$1;
  }

  location / {
    proxy_set_header X-Sendfile-Type X-Accel-Redirect;
    proxy_set_header X-Accel-Mapping '/path/to/releases/\d{14}/abc/=/foo/';
    proxy_set_header X-Accel-Mapping '/path/to/releases/\d{14}/def/=/bar/';
  }
}

説明

複数の「X-Accel-Mapping」が定義されていると、Rackの「env[‘HTTP_X_ACCEL_MAPPING’]」に渡ってくる時は「, 」(カンマとスペース)で区切られた状態になる。

/path/to/releases/\d{14}/abc/=/foo/, /path/to/releases/\d{14}/def/=/bar/

こうなると、いまのRackの実装ではいきなり「=」でsplitしている(ひとつしか定義されていない前提)ため、結果として「internal」と「external 」はこんな感じになって、正しいパスを返せなくなる。

internal #=> '/path/to/releases/\d{14}/abc/'
external #=> '/foo/, /path/to/releases/\d{14}/def/=/bar/'

対策

そこで、複数の「X-Accel-Mapping」が定義されることも考慮して、この様にしてみた。

def map_accel_path(env, path)
  if mapping = @mappings.find { |internal,_| internal =~ path }
    path.sub(*mapping)
  elsif mapping = env['HTTP_X_ACCEL_MAPPING']
    mapping.split(',').map(&:strip).each do |m|
      internal, external = m.split('=', 2).map(&:strip)
      new_path = path.sub(/^#{internal}/i, external)
      return new_path unless path == new_path
    end
    path
  end
end

これで「X-Accel-Mapping」の数に関わらず、定義したパスを返せるようになった。

ので、PR出してみた。どうかな。
https://github.com/rack/rack/pull/1187

カテゴリー: Rails タグ:

ATOK 2017 for Macの予約が始まった。 このエントリーを含むはてなブックマーク はてなブックマーク - ATOK 2017 for Macの予約が始まった。

2017 年 6 月 2 日 Comments off


した。

カテゴリー: ATOK タグ:

ansible_os_familyの値について。 このエントリーを含むはてなブックマーク はてなブックマーク - ansible_os_familyの値について。

2017 年 5 月 16 日 Comments off

ドキュメント読んでも一覧を見つけられなかったのでソースを読みにいったメモ。定義場所はここ。

ansible/facts.py at devel · ansible/ansible

# A list with OS Family members

今日時点のものなのでリンク先の行は変わるだろうけど、ファイルまでは変わらんだろ、っていう。

カテゴリー: プログラミング一般 タグ:

MacのPostgreSQLをアップグレードする。 このエントリーを含むはてなブックマーク はてなブックマーク - MacのPostgreSQLをアップグレードする。

2017 年 5 月 1 日 Comments off

brew upgrade postgresql したら下記のエラーが出て起動しなくなったので、対応したメモ。

FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.5, which is not compatible with this version 9.6.2.

ログは

% tail `brew --prefix`/var/log/postgres.log

にあるはず。

公式のドキュメントは→https://www.postgresql.jp/document/9.6/html/pgupgrade.html

まず動いているプロセスを停止していまのdataを退避し、代わりに空のdataを作る。

% launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
% mv `brew --prefix`/var/postgres `brew --prefix`/var/postgres_95
% initdb `brew --prefix`/var/postgres -E utf8

退避したdataから新しく作ったdataにコピー。

% pg_upgrade \
  -b `brew --prefix`/Cellar/postgresql/9.5.4_1/bin \
  -B `brew --prefix`/Cellar/postgresql/9.6.2/bin \
  -d `brew --prefix`/var/postgres_95 \
  -D `brew --prefix`/var/postgres

最後に下記のメッセージが出るので、「正常に起動することを確認した後に」それぞれのスクリプトを実行して完了。

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

起動する。

% launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

インストールのメモはこちら

カテゴリー: Mac, PostgreSQL タグ:

毎週聴いているTBSラジオ番組。2017年4月 このエントリーを含むはてなブックマーク はてなブックマーク - 毎週聴いているTBSラジオ番組。2017年4月

2017 年 4 月 25 日 Comments off

口コミ大作戦「#TBSラジオきいてみて」キャンペーン|TBSラジオAM954+FM90.5~聞けば、見えてくる~

よく聴く番組名を書くだけでもいいですし、その番組のおススメポイント、さらにはradikoのシェアボタンで、印象に残った部分を紹介していただくのも大歓迎です! radikoタイムフリー機能では放送後1週間、番組を聴けます。シェアラジオ機能をどんどん使ってみて下さい!

キャンペーンは終わってしまったのだけれど、毎週聴いている番組のまとめ。
移動中だったり仕事中だったり、ヘッドホンしているときはだいたい流れてます。

その他の番組はパーソナリティ繋がりだったり、途中に流れる番宣だったりをきっかけにして、聴いたり聴かなかったり。

いまアプリでTBSラジオを聴く方法がradikoTBSラジオクラウドに分かれている状態で、radikoは本編そのまま、TBSラジオクラウドは本編の抜粋+アフタートークのようなオリジナルコンテンツ、となんだか半端な状態。
本編からアフタートークのネタに言及していたりその逆もあったりで、全部聴こうとすると2つのアプリを使わないといけないのがつらい。大人の事情っぽいのだけれど。

日常生活に組み込まれているのでTBSラジオにはいまの感じでずっといて欲しくて、聴取率みたいなやつ的に一番効果がある聴き方が出来るといいなと思ったりするのだけれど、どういう聴き方が運営側にとって一番嬉しいんですかねぇ。

ともあれ、ラジオいいよラジオ。

カテゴリー: 日記 タグ:

libの場所について。 このエントリーを含むはてなブックマーク はてなブックマーク - libの場所について。

2017 年 3 月 6 日 Comments off

autoload – Rails 5: Load lib files in production – Stack Overflow

Putting lib in app/lib is recommended by rails members

こんなやりとりを見て「おっ、そうなの?」ってことでまるっと移動してみたら、自分で作ったrakeタスクが見えなくなってしまった。
えー、ってことでソースを読んだからこんな感じになってた。

rails/engine.rb at v5.0.2 · rails/rails

paths[“lib/tasks”].existent.sort.each { |ext| load(ext) }

Rails.root直下に置くならconfig.eager_load_pathsに追加しなきゃならないし、app下に置くならrakeタスクは元の場所に残さなければならないから「lib」というディレクトリが2つ存在することになるしで、どっちがいいかちょっと悩ましい。のでした。後者かなぁ。

カテゴリー: Rails タグ:

例外の定義について。 このエントリーを含むはてなブックマーク はてなブックマーク - 例外の定義について。

2017 年 2 月 26 日 Comments off

えっ、ってことで確認したら、たのしいRuby第5版のP191にありました。

いままで

class MyError < StandardError; end

のように書いて、なんか据わりが悪い感じがしていたので、今度からClass.newを使っていきたいと思います。
ちなみにclass文との違いは新たにメソッドの定義などが出来ないことですが、そもそもStandardErrorを継承したクラスが作れればいいだけなので、問題ありませんね。(と、本にも書いてありました。たしかに。)

カテゴリー: Ruby タグ:

tarで展開する時にSCHILY云々と言われた。 このエントリーを含むはてなブックマーク はてなブックマーク - tarで展開する時にSCHILY云々と言われた。

2017 年 2 月 13 日 Comments off

過去に遭遇した気がするようなしないような状態でググってみたら、弩ストライクなエントリを書いている方がいらして助かりました。
ひと言で言うと「そのtarボール、Macで固めたやつをLinuxで展開しようとしてない?」ということ。

Capistranoを使ってデプロイするとtarのエラーになる tar: Ignoring unknown extended header keyword – Qiita

どうやらMacがBSDのtarを使ってデプロイ先がGNUのtarを使っているために、正しく解釈できなくなっているらしい。

ありがとうございましtar。

カテゴリー: Linux, Mac タグ:

JSONリクエストの時のCSRF対策について。 このエントリーを含むはてなブックマーク はてなブックマーク - JSONリクエストの時のCSRF対策について。

2017 年 1 月 14 日 Comments off

ちゃんとドキュメントがあったのでメモ。

ActionController::RequestForgeryProtection

It’s important to remember that XML or JSON requests are also affected and if you’re building an API you should change forgery protection method in ApplicationController (by default: :exception):

カテゴリー: Rails タグ: