2011/01/30

fibonacci number


fib(param) + fib(param - 1) と本番で書いてしまった。。(※) なんで気付かなかったんだろう(涙

(※)無論、無限ループになる

[ Update January 31st 0:35 JST by mumumu ]

勿論for文でも書ける。こちらの方がスタックを使わない。

2011/01/29

[memo] gimp alpha channel

gimp で何か書いて、背景を透明にしたい、と思ったときにちょい手間取ったのでメモ。
gimp 2.6.9 @ Windows 7 で確認

----

画像を生成し、生成した画像を右クリックし、「レイヤー」→「透明部分」→「色を透明に」を選択し、透明にしたい部分の色を選択すればよい。大抵は背景の白部分を透明にしたいだろうから、デフォルトの状態でプレビューすれば背景を透明にできるはずだ。

特定の色で塗られた部分を透明にしたいならば、色を選択すればその部分を透明にできる。

2011/01/25

mod_rewrite and MultiViews

http://www.fya.jp/blog/2007/09/14/mod_rewritemultiviews/
http://httpd.apache.org/docs/2.2/content-negotiation.html

Apache には mod_rewrite というリクエストを内部で自在に書き換えるための黒魔術が備わっており、それをWebアプリケーションフレームワークでREST風なURLを解釈させるために以下のように使うのは、割とPHPな世界では普通に行われていることである。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

これはファイルが存在してサイズが0以上のリクエストに対してはそのままリクエストを実行。そうでなければ index.php を頭につけるようにURLを書き換えている。

こうしたやり方に対して、Options MultiViews は相性が悪い場合がある。特に 同じプレフィックスのファイルが複数存在した場合がタチが悪い。

MultiViews 機能は、拡張子が表記されていないリクエストがあった場合に、それが仮に存在しない場合は拡張子ありの同じファイルを自動的に探してくれる機能である。たとえば http://example.com/hoge がリクエストされた場合に、MultiViews がドキュメントルートで有効だと hoge.txt や hoge.html 等から適当に選んでレスポンスを返してくれる。

----

ちょっと複雑だが、ここで俺がハマった mod_rewrite と MultiViews の相性でハマった例を記す。

A) ドキュメントルートで MultiViews が有効
B) 上記のような RewriteRule を設定している
C) index.php と index.html がドキュメントルートに存在する
D) この状態で、/index/search をリクエストした場合

この状態で /index/search のレスポンスが 404 だったのでびっくらこいた。本当は、index.php/search となって、フレームワーク側で PATH_INFO を解釈してほしいのに。

起こっていたことは以下のとおりである。

1. MultiViews によって、/index/search を index.html/search とApacheがみなす
2. index.html/search に RewriteRule が適用される
3. index.html が存在するので、Pass Through され、そのまま index.html/search へのリクエストとみなされる
4. index.html/search は存在しないので 404 になる

何のことだかわからないかもしれないが、要するに、Options MultiViews は意味もわからず有効にしない。そして、mod_rewrite と混ぜる場合は注意、ということである。

2011/01/12

sudo and environment variable

http://archive.linux.or.jp/JM/html/sudo/man8/sudo.8.html

sudo は外部のコマンドをできるだけ安全に実行しようとする。
環境変数を扱うにあたって、二つの異なる行き方がある。デフォルトでは、 sudoers の env_reset
オプションが有効になっている。 この場合は、最小限の環境でコマンドが実行されることになるが、
その環境とは、
TERM
, PATH
, HOME
, SHELL
, LOGNAME
, USER
, USERNAME
、それに sudo という 呼び出し側のプロセスから来た変数で、sudoers の env_check や env_keep
オプションによって許可されたものである。言わば、 環境変数のホワイトリストが存在することに
なるわけだ。

要するに sudo ではデフォルトでsudoを実行するユーザの環境変数は引き継がれないということだ。これは環境変数が重要な環境 (例:Python の virtualenv にworkonした状態) で sudoすると思った結果が得られないことに繋がる。

たとえば以下のような状態では pip-requirement.txt の内容は virtualenv 内にはインストールされず、システムグローバルな環境に入ってしまう。workon した時点で山のように設定された環境変数を見てインストール先が決まるのだが、sudoした時点でそれらは引き継がれないからである。

$ workon somevm
(somevm)$ sudo pip install -r pip-requirement.txt

Ubuntu みたく「何かするときには sudo」みたいな環境も増えてきたけど、こういうこともある。

2011/01/11

instant reset

無心でXXな作業をすると心がリセットされる、という瞬間を最近手に入れた。それは「皿洗い」である。笑われるだろうか。

週末に無理やりにでも何かを作って食べ、皿洗いを **無心で** やって台所を綺麗にすると週末の日曜プログラミングモードから一旦解き放たれる。その瞬間に妙にハマってる最近である。

2011/01/07

Capistrano Installation notes

https://github.com/capistrano/capistrano/wiki/2.x-Getting-Started

最近 Rubyを覚えたついでに簡単な Deploy Script を書いてみるようになった。
以下、Debian Lenny でのインストールノート。

# aptitude install rubygems
# gem sources -a http://gems.github.com/
# gem -v

-- バージョンが 1.2.0 なので 1.4 以降に rubygems をアップデートする --
-- ここは Debian 特有の手順が必要 --

# gem install rubygems-update
# /var/lib/gems/1.8/bin/update_rubygems

-- Capistrano のインストール --

# aptitude install libopenssl-ruby
# gem install capistrano

-- インストール完了 --

# cap
Please specify at least one action to execute.
Usage: cap [options] action ...
-d, --debug Prompts before each remote command execution.
-e, --explain TASK Displays help (if available) for the task.
-F, --default-config Always use default config, even with -f.
-f, --file FILE A recipe file to load. May be given more than once.
-H, --long-help Explain these options and environment variables.
-h, --help Display this help message.
-l [STDERR|STDOUT|file] Choose logger method. STDERR used by default.
--logger
-n, --dry-run Prints out commands without running them.
-p, --password Immediately prompt for the password.
-q, --quiet Make the output as quiet as possible.
-r, --preserve-roles Preserve task roles
-S, --set-before NAME=VALUE Set a variable before the recipes are loaded.
-s, --set NAME=VALUE Set a variable after the recipes are loaded.
-T, --tasks [PATTERN] List all tasks (matching optional PATTERN) in the loaded recipe files.
-t, --tool Abbreviates the output of -T for tool integration.
-V, --version Display the Capistrano version, and exit.
-v, --verbose Be more verbose. May be given more than once.
-X, --skip-system-config Don't load the system config file (capistrano.conf)
-x, --skip-user-config Don't load the user config file (.caprc)