iTerm2にて三点リーダなどが半角幅で表示される

iTerm2のバージョンは1.0.0。
…や■が半角幅で表示される。
ターミナル上でemacsを起動して三点リーダ等を入力した場合には、同様の問題に加えてさらにカーソルずれが発生する。

で、設定のProfiles -> Text から、
"Treat ambiguous-width characters as double width"
にチェックを入れたら解決。
emacsでのカーソルずれもなおった。

Unicodeの仕様に起因する問題らしい。
三点リーダなどは、Unicodeにて"ambiguous-width"(曖昧な文字幅)として定義されていて、文脈によって文字幅の変わる文字という扱いらしい。
http://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85

ただこの設定すると、シェル上で三点リーダの前後に文字入力すると表示がバグる問題が別に発生する。
http://slashdot.jp/journal/549921/MacOSX%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A8iTerm2%E3%81%A8%E5%9B%9B%E8%A7%92%E8%A8%98%E5%8F%B7%E5%85%A8%E8%A7%92%E5%8D%8A%E8%A7%92%E5%95%8F%E9%A1%8C

Homebrewとpkg-config

めも。pkg-configって知らなかった。
pkg-config - Wikipedia

.pcファイルに依存パッケージが書いてあれば、そちらの.pcファイルも読みにいってくれる。便利。

Homebrewで入れたパッケージの場合は、デフォルトなら.pcファイルはだいたい/usr/local/lib/pkginfo内にリンク張られてる。
なのでPKG_CONFIG_PATHに/usr/local/lib/pkginfoを指定してやるとよい。

sinatraでenable :lockでもコネクションプール数が影響?

sinatra

enable :lock

としてればActiveRecordのコネクションプール数は1でも問題ないのかと思ったが、1にするとすぐに"could not obtain a database connection within 5 seconds"のエラーが出る。
で、2ならとりあえずエラーは出ないけど、たまに遅い。
とりあえず5ぐらいにしておけば快適に動く。

何か理解不足なのかも。
要調査。

追記

enable :lockはmutexでロックかけて、一度にひとつのリクエストしか処理しないようにするだけで、シングルプロセスシングルスレッドにするものではなかった。
実際にマルチプロセス/マルチスレッドになってるかどうかは、サーバーの設定による?

私が試した環境だとたぶんマルチプロセスで動いてた。
コネクションプールが1だとうまくいかなかったのは、リクエストの処理終了時点でまだコネクションがプールに返却されてなかったから?

herokuでdatabase.ymlの設定

herokuではdatabase.ymlをアップしても無視される。
何か設定したい場合は、DATABASE_URLにクエリとして設定する。

例: poolを15に設定する場合

heroku config:set DATABASE_URL=postgres://dummy:dummy@dymmy:12345?pool=15
補足

強制的にherokuによって用意されたdatabase.ymlが使用される。
このherokuによって用意されたdatabase.ymlはERBテンプレートになっており、その内容はheroku run bashをしてconfig/database.ymlをチェックすれば確認できる。

肝心そうな部分だけ引用すると、こうなってる。

<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
  <%= attribute "adapter",  adapter %>
  <%= attribute "database", database %>
  <%= attribute "username", username %>
  <%= attribute "password", password, true %>  
  <%= attribute "host",     host %>
  <%= attribute "port",     port %>

<% params.each do |key, value| %>
  <%= key %>: <%= value.first %>
<% end %>

Rack::Protectionを使うと、IEでajax通信を行った時にセッションが切れる。

sinatraでRack::Protectionを使っていたところ、IEからajax通信を行うたびにセッションが切れていた。

調べたところ原因は、IE9にて通常の通信時とajax通信時でAccept-Languageが異なるためのよう。
通常の通信時は"ja-jp"、ajax通信時は"jp"となっている。
ちなみにインターネットオプションでの設定は"ja-jp"。
ajax通信時の"jp"がどこで設定されたものなのかは不明。

で、前回の通信とAccept-Languageが異なるとRack::Protection::SessionHijackingが働いて、セッションが乗っ取られたと判断され、セッションが切れる。

今回はとりあえずセッションハイジャックの監視をオフにして対処した。

use Rack::Protection, except: :session_hijacking 

Rack::Protectionでセッションハイジャックを監視したい場合は、Accept-Languageを監視対象のヘッダから外すか、あるいはクライアント側でajax通信時にAccept-Languageを設定するなどの対処が必要と思われる。


なお、IEajax通信時に通常とAccept-Languageが違ってしまう理由、および詳細な発生条件については未調査(ajax通信時に常に発生するわけではないかもしれない)

Google Analyticsで自分のアクセスを除外する

GoogleAnalyticsのレポートから自分のアクセスを除外する方法 - くろまほうさいきょうでんせつ

javascript: _gaq.push(['_setVar', 'no_report']);

あとはアカウント設定のフィルタの「ユーザ定義」でno_reportを弾く。

_setVarはdeprecatedだから_setCustomVarを使えとヘルプには書いてあるけれど、_setCustomVarだとアカウント全体のフィルタではじけない(個々のレポート?ごとにフィルタを設定することは可、だけど面倒くさい)。
自分は個人で使うだけなのでとりあえず当面は_setVarを使うことにする。

sinatraでCSRF対策

sinatraCSRF対策をやろうとして、適当な良いライブラリとかないかな〜って探してたら、sinatraでは1.3.0以降、rack-protectionという各種攻撃対策ライブラリを使っててそれでCSRF対策もできるらしい。
http://blog.udzura.jp/2011/10/04/sinatra-1-3-0-and-padrino-0-10-3-released-1/

英語版のチュートリアルにも書いてあった。2012/10時点で日本語版にはまだなし。
Sinatra: README


詳しい使い方について日本語版の情報が見つからなかったので、githubのページとか見ながら調べた。CSRF対策についてだけだけど。

使い方

rack-protectionのバージョンは1.1.0
基本的には次のコードを追加するだけ。

use Rack::Protection

これだけで各種攻撃対策が有効になる。具体的にどんなものがあるかはこちらが詳しい。

CSRF対策が具体的にどんなふうに行われるかというと、POST等のメソッドについて
リファラが確認できない
リファラが外部
のいずれかの場合に、トークンのチェックを行ってCSRFを検知し403を返す。

もし外部ホスト等からPOSTする場合は、フォームにトークンを埋め込む必要がある。こちらを参照。


今回の私の場合は外部からのPOSTアクセスはなかったので、useした以外はコードに変更なしで楽ちん。


特定の攻撃対策だけ有効にしたいとかいうのも可能なよう
GitHub - sinatra/rack-protection: NOTE: This project has been merged upstream to sinatra/sinatra