varnishとnginxを使っているサーバをマイグレーションすることになり、今まで外部のLBを通していたのを直接処理することになった。
そこで問題になるのはSSLの扱い。varnishはSSLを扱えないため(作者はopensslのコードはクソだ、と一刀両断している)、httpsのフロントエンドとしては使えない。
そこで順序を入れ替え、nginxをフロントエンドに、varnishを挟んでunicornに投げるようにした。

More »

このサーバのフロントエンドをapacheからnginxに入れ替えた。
passenger経由で動かしていたredmineがとても遅いというクレームがあったのと、最近apacheいじってなくて設定にちょっと不安が出てきたので。つーかnginxのが設定項目が少なくて楽だし。
参考にしたのはここここここ。init scriptとかまんまコピペですいません。

More »

Rails3.1でasset pipelineが導入された関係で、3.0のままのレシピでデプロイするといくつか問題が出る。

まずpublic/images、public/stylesheets、public/javascriptsがないというエラー。
エラーが出ても実害はないが、赤文字がずらずら流れるので心臓によろしくない。
これの解決は簡単で、deploy.rbに

set :normalize_asset_timestamps, false

を追加するだけでOK。

ちょっと悩ましいのが、rake assets:precompileをいつ実行するかということ。
ヒューマンエラーをなくすために、まずはdeploy時に実行するようにしてみる。
(deploy.rbではなく)Capfileに

require "deploy/assets"

Gemfileに

gem 'execjs'

を追加。さらにサーバ側にnode.jsをインストールしておく。
これでcap deployすると自動的にrake assets:precompileが実行される・・・んだけど、実はassets:precompileはかなり遅い。appサーバが複数あると全部で実行されるし、大変に効率が悪い。node.jsが簡単にインストールできない環境だとそれも面倒だし。(Ubuntuならapt-getするだけだが)
というわけで、assets:precompileはローカルで実行してリポジトリに含めておくことにした。

More »

ロードバランサを置いている時、バックエンドのアプリケーションサーバはなるべくタイトな構成にしたくなるのが人情というもの。
ところが、unicornだけ走らせているはずのアプリケーションサーバに比べて、フロントエンドのhttpd(nginx)が走っているテスト用サーバの方が何倍も早いという現象が発生した。
条件を色々変えて確かめた結果、意外な結果になった。

とりあえず結論から書くと、unicornだけを走らせてLBから直接叩くのに比べて、間にhttpd(nginx)を挟んだ方が何倍も速い。

More »

xdg-open [URL]

Emacsからbrowse-urlで「規定のブラウザ」を呼び出すには

(setq browse-url-browser-function 'browse-url-generic
      browse-url-generic-program "xdg-open")

何も設定してないとfirefox-binを呼び出してるっぽい?それともどっかで設定したかな…

新年の記事Visor便利!と書いたけど、Emacs上で同じようなことをするelispがあった。
shell-pop.elを使うと、Emacsのどこからでもホットキーでshell-modeあるいはansi-termを呼び出し、もう一度ホットキーを押すと閉じることができる。
ちょっとだけコマンド実行したい時に便利。
こんな感じで設定している。

;; shell-pop with ansi-term
(require 'shell-pop)
(shell-pop-set-internal-mode "ansi-term")
(shell-pop-set-internal-mode-shell shell-file-name)

(defvar ansi-term-after-hook nil)
(add-hook 'ansi-term-after-hook
(function
(lambda ()
(define-key term-raw-map "\C-z" 'shell-pop))))
(defadvice ansi-term (after ansi-term-after-advice (arg))
"run hook as after advice"
(run-hooks 'ansi-term-after-hook))
(ad-activate 'ansi-term)

(global-set-key "\C-z" 'shell-pop)

C-tに設定する人が多いようだけど(Terminalだろう)、C-tは分割フレーム間の移動に割り当てているのでC-z(Zsh)にした。
デフォルトのC-z(Minimize)は使わない、と言うかうっかり触って最小化することが多いので無効にしてるし。ああでも-nwで起動した時はScreenとぶつかって邪魔だから何か考えないと…

なお、Cocoa Emacsだとなぜか画面半分くらいで折り返されてしまって使いにくい。
font spacingの問題っぽいんだけど、解決策は今のところ不明。

emacsの設定はプラットフォームごとにまちまちで、統合したいなーといつも思っていた。
一時期gitで管理したりもしたんだけど、設定をいじる→リポジトリに登録→push→各プラットフォームでpullという作業があまりにも煩わしく、ついついおろそかになってしまう。
ここらへんを自動化すべく、elisp群をDropboxに置いてみた。

More »

screenを縦に分割して2画面で作業する方法。
Ubuntuの場合:
既にパッチの当たったscreenが入っているので、修飾キー(C-zとか)→|(パイプ)で分割
Macの場合:
macportsのものだとうまく動かないので、tscreenをソースから入れ、.screenrcを.tscreenrcに書き換えて

bind v split -v

とか書いておく

ログやautospecを流しながら作業ができて便利ではあるんだけど、とにかく遅い。script/serverみたいにコンソールと同期するものは動作が止まったりする。ついでにマウスでコピペができなくなる(左右まとめて選択してしまう)のも厄介。実用性は微妙かも知れない…

開発環境はLinuxなのでgrowlはないんだけど、gnomeの通知システムにメッセージを送るnotify-sendというツールがある。
libnotify-binをインストールしておけば、

notify-send '送信したいメッセージ' -i "アイコン"

で通知を送ることができる。なお、アイコンは/usr/share/pixmaps/に置き、拡張子を除いて記述する。
(多分~/.usr/あたりにも置けると思う)

More »