RewriteRule を .htaccess に記述する際の罠

先日、ちょっとやりたいことがあり、 mod_rewrite を使ったのですが、うまく動かなくてapache の mod_rewrite のドキュメントを確認したところ、意外な罠があったのでそのメモです。

私がやろうとしたのは以下のようなものです。

  • myapp ディレクトリのなかに .htaccess と test.py がある
  • http://www.example.com/myapp/q/param へのアクセスを http://www.example.com/myapp/search.py/param と書き換えて、 search.py に PATH_INFO として "/param" が渡るようにする

最初に書いた失敗例の .htaccess はこんな感じです。

RewriteEngine on
RewriteRule ^q/ search.py/$1 [L]

で、結局正しい記述はこう。

RewriteEngine on
RewriteBase /myapp/
RewriteRule ^q/ search.py/$1 [L]

あ、それは知ってる、って人もいるとは思いますが、これ、PATH_INFO じゃなくて、パラメータとして渡す場合は、RewriteBaseを書いていなくても大丈夫だったりと、意外と複雑なトリックが隠されています。

.htaccess では RewriteRule の挙動が変わる

続きを読む

CentOS 5 に Python 2.6 & PIP を導入(EPELリポジトリの利用)

我が家には CentOS 5 で動作しているサーバーがいるのですが、そいつに新しいことをやらせたくて、Python 環境をアップグレードしようとしたので、今日はそのメモです。

CentOS 5 は Python 2.4 が標準となっていますが、PIP以前ネタにした setuptools の上位版のようなもの)は、2.6以降にしか対応していません。 CentOS のオフィシャルなリポジトリには Python のアップデートはありませんので、今回は EPEL リポジトリを有効にしてそちらから Python 2.6 を入れ、その上で easy_install と PIP を導入しました。

続きを読む

Tiny Tiny RSS のアップデート

以前、Google Reader がサービス終了になった際、私は乗り換え先として Tiny Tiny RSS (以下、TTRSS) を選択しました。サーバー設置型なので、同じような憂き目に合うことは無いですし、公式のAndroid アプリもあるので、自分の用途にはこれで十分です。

私がインストールした当初は、TTRSSは適当なタイミングで新しいバージョン番号が振られてリリースされ、告知のRSSなんかも飛んでいたのですが、最近は、ローリングリリース形式になったので、気をつけていないと置いていかれがちです。頻繁なアップデートに合わせて、できるだけ作業は定式化しておくのが良いでしょう。

というわけで、TTRSSのアップデートについて、自分の事情込みの手順をメモしておきます。

アップデート手順

続きを読む

Android Studio を Ubuntu 14.04 (64bit) にインストール

久々にちょっとAndroidでやりたいことがあったのですが、Ubuntuクリーンインストールでアップグレードしたため手元に開発環境が無く、せっかくなので昔は無かった Android Studio をインストールしてみようとしたところ、微妙にハマったので今日はその小ネタです。

インストール方法

続きを読む

AVRで秋月のI2C接続小型キャラクターLCDを動かす

ひさしぶりに、電子工作で作りたいものができたので、ちょっとリハビリを兼ねて、AVRの触ったことない機能&触ったことないデバイスを触ってみよう、と思い、秋月でI2C接続小型キャラクターLCDを買ってきて動かしたので、今日はそのメモです。

AVRでI2Cデバイスを動かす場合、内蔵のTWI機能を使うのが基本です。TWIを使うことで、I2Cデバイスのマスターもスレイブも簡単に作れますし、クロックストレッチ(スレーブ側の処理が間に合わないときにスレーブがクロック信号をGNDに押さえつけることで、クロックを一時停止させ、通信を遅らせる仕組み)やマスターが複数いる場合の競合の検出などもハードできちんと対応してくれています。その代わり、TWIはmega系など、8bit AVR の中でもややリッチめなデバイスにしか搭載されていなかったりしますので、それ以外のマイコンではソフトで実装してやる必要があります。競合検出なんかの実装は結構面倒なので、ソフト実装で対応する場合はそのような面倒な仕様は省略してシングルマスターのみ対応とかで妥協しちゃうことが多いんじゃないでしょうか。

ともあれ、今日は素直にTWI使って実装してみました。

続きを読む

localvimrc: ディレクトリごとに別の .vimrc を適用する

色々なソフトウェアプロジェクトを掛け持ちしていたり、一つのプロジェクトが複数のプロジェクトの寄せ集めだったりすると、プロジェクトごとにコーディングルールなどが異なっていて、エディタの設定を使いわけたくなることがあります。そんな時に便利なのが localvimrc という vimプラグインです。

インストール方法

まず、vim.org の localvimrc のページに行き、最新バージョンの localvimrc.vba をダウンロードします。
あとは、そのファイルを vim で開いて、以下の vim コマンドを打つだけです。

:so %

これで、 ~/.vim/plugin/localvimrc.vim がインストールされます。
ダウンロードしたファイルは削除してしまってかまいません。

使いかた

特別な設定を加えたいソースコードツリーのトップディレクトリに .lvimrc という名前のファイルを作成すると、それ以下のファイルを開く際は、通常の ~/.vimrc に加えてその .lvimrc も読み込まれるようになります。

ただし、セキュリティ的な観点から、読み込み時に毎回「読み込んで良いか?」と聞いてきて鬱陶しいので、以下のいずれかの設定を ~/.vimrc に追加しておいた方が良いでしょう。

let g:localvimrc_ask=0        " いちいち聞かずに勝手に読み込む
let g:localvimrc_persistent=2 " 一度聞いたファイルを記録しておき、次回からは自動で読み込む
let g:localvimrc_persistent=1 " 聞いたときに大文字のY/N/Aで答えた場合のみ上記の動作をする

私は一番最後の設定で使っています。なお、選択の記録はファイル ~/.localvimrc_persistent (設定で変更可)に保存されます。

また他にも .lvimrc は(これもセキュリティ的に) sandbox で実行されるのですが、それを避ける設定や、複数の .lvimrc が見つかった場合にどう処理するか(ぜんぶ実行、一番深いところのもののみ実行など)、といったいろいろな設定が可能です。詳しくは下記の公式のドキュメントを参照してください。

https://github.com/embear/vim-localvimrc/blob/master/doc/localvimrc.txt

打ち込めないような名前のファイルでもシェルで操作する方法

今日は小ネタです。
日本語のファイル名だったり、操作ミスなどで制御文字を含んだような名前のファイルができてしまった際に、そのファイルをシェル上で消したりリネームしたりする方法をご紹介。

1. "ls -li" で該当ファイルの inode 番号を取得

まず、対象のinode番号を取得します。たとえばこんな感じです。

$ ls -li
合計 0
2490401 -rw-r--r-- 1 over80 over80 0  4月 17 23:04 binname_???????????????_.txt
2490385 -rw-r--r-- 1 over80 over80 0  4月 17 23:02 日本語ファイル名.txt

一番最初のカラムに表示されている数字が、そのファイルの inode 番号です。この番号はそのファイルシステム下で一意なので、ファイル名の代わりにこの番号でファイルを指定するわけです。

ちなみに、上記の例の1つめのファイルは、16進で "0x01" から "0x0f" の制御文字を含んだ名前のファイルにしてみました。"ls" はその端末の locale で表示できない文字は "?" で置き換えてくれるので、表示は崩れません。この機能はオプションで明示するか、パイプ等でターミナル以外に出力する場合は off になります。

$ ls | hexdump -C
00000000  62 69 6e 6e 61 6d 65 5f  01 02 03 04 05 06 07 08  |binname_........|
00000010  09 0a 0b 0c 0d 0e 0f 5f  2e 74 78 74 0a e6 97 a5  |......._.txt....|
00000020  e6 9c ac e8 aa 9e e3 83  95 e3 82 a1 e3 82 a4 e3  |................|
00000030  83 ab e5 90 8d 2e 74 78  74 0a                    |......txt.|
0000003a
2. "find -inum (inode番号)" で得たファイル名をコマンドに渡す

たとえば、"日本語ファイル名.txt" (i-node 番号は 2490385) を mv で ascii.txt にリネームする場合、こうします。

$ mv "$(find -inum 2490385)" ascii.txt

シェルで $(コマンド) と書くと、そのコマンドを実行した結果がそこに埋め込まれます(バッククオートで括るのと同じですが、ここでは見やすさ重視でこちらで書いています)。ファイル名に空白文字などが入っていると、そのままではそれが再評価されてしまうので、ダブルクォートで括って再評価を避けています。

なお、わざわざ一旦ファイル名を出力しなくても、find の -exec オプションで同等のことができますので、そちらでやっても良いでしょう。

$ find -inum 2490385 -exec mv "{}" ascii.txt ";"

ただ、find に慣れている人であればこちらが素直だと思いますが、慣れていない人に教えるには find の引数の与え方が特殊なので、前者の方法でやっていただいた方が良いかと思います。


(以下、2014-06-08 追記)
なお、 find は周知の通り、指定したディレクトリ(デフォルトはカレントディレクトリ)から、再帰的にファイルを探しにいきますので、サブディレクトリ等がたくさんある場合は時間がかかります。今回のようにカレントディレクトリに存在すると分かっている場合は、探索の深さを制限してやるとよいでしょう。

$ mv "$(find -inum 2490385 -maxdepth 1)" ascii.txt
$ find -inum 2490385 -maxdepth 1 -exec mv "{}" ascii.txt ";"