´・ω・)<ときどき書くよ このページをアンテナに追加 RSSフィード

2009-03-12

EC2 カスタマイズAMI 関連コマンドまとめ

AMI の作成*1

ec2-bundle-vol -d /mnt --privatekey /mnt/pk-XXXXX.pem --cert /mnt/cert-XXXXX.pem --user <アカウントナンバー>

AMIアップロード

ec2-upload-bundle --bucket <バケット名>*2 --manifest image.manifest.xml --access-key <アクセスキー> --secret-key <シークレットキー>

AMI の登録

ec2-register <バケット名>/image.manifest.xml

AMI の登録解除

ec2-deregister <AMI ID>

AMI の削除

ec2-delete-bundle --bucket <バケット名> --manifest image.manifest.xml --access-key <アクセスキー> --secret-key <シークレットキー>

*1:事前にpem ファイルを/mnt に転送

*2:foo/bar/baz のように階層化可能

2009-02-03

mobirc とmod_proxy を連携させる

mobirc を使うためにport 5678 を空けるのはださいので

mod_proxy と組み合わせるための備忘録。


mod_proxy と組み合わせたときの問題点として以下が挙がった。

  • 環境変数で%ENV{REMOTE_ADDR} が取れない
  • ローカルホストのApache 経由なので、$req->address が127.0.0.1 となる

ぐぐっても情報が出ないのだが、私の環境だけなのだろうか。


仕方ないのでApache のRequestHeader を使ってmobircケータイのリモートアドレスを渡し、

それを使ってIP アドレスチェックをするようにした。


httpd.conf

RequestHeader set X_FORWARDED_FOR %{Remote_Addr}e

ProxyPass / http://127.0.0.1:5678/
ProxyPassReverse / http://127.0.0.1:5678/

mobirc/extlib/HTTP/Session/State/MobileAttributeID.pm

if ($self->check_ip) {
#    my $ip = $ENV{REMOTE_ADDR} || $req->address || die "cannot get address";
    my @forwarded_for = $req->headers->header('X_FORWARDED_FOR');
    my $ip = $forwarded_for[1] || $req->address || die "cannot get address";
    if (!$ma->isa_cidr($ip)) {
        die "SECURITY: invalid ip($ip, $ma, $user_id)";
    }
}

mobirc/lib/App/Mobirc/Web/C/Account.pm

# if ($ma->isa_cidr(req->address)) {
my @forwarded_for = req->headers->header('X_FORWARDED_FOR');
if ($ma->isa_cidr($forwarded_for[1])) {
    session->set('authorized', 1);
    return redirect('/');
} else {
    return redirect('/account/login?invalid_cidr=1');
}

mobirc/extlib/HTTP/Session/State/MobileAgentID.pm にも類似の箇所があったのだが

こちらは修正しなくても今のところ問題が出ていないので放置している。


これでIP アドレスのチェックをパスできるが、チャンネルに入ろうとすると

Can't locate object method "is_foma" via package "HTTP::MobileAttribute::Agent::DoCoMo" at /path/to/mobirc/lib/App/Mobirc/Pictogram.pm line 53.

と怒られる。自分しか使わないので


mobirc/lib/App/Mobirc/Pictogram.pm

if ($ma->is_docomo) {
#    if ($ma->is_foma) {
        'I.uni'
#    } else {
#        'I.sjis'
#    }

ちなみに、FOMA から利用するときはURL にguid=ON を付けなくてはいけないのも注意。

2009-02-02

mod_rewrite とmod_asis を使って任意のステータスコードを返す

あるディレクトリ以下に限り、存在しないファイルにリクエストされたときに

404 ではなく204 を返す必要があったので以下のような設定をした。


.htaccess の場合

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ /path/to/204.asis

httpd.conf の場合

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^/path/to/.*$ /path/to/204.asis

204.asis

Status: 204 No Content
Content-type: text/html



mod_asisを使うと、ステータスコードも含めてテキストに書いたままの内容で

ブラウザにレスポンスが送信される。

204.asis の下に改行を二つ入れているのはそのため。


はじめはmod_asis の存在を知らず以下のようなCGIでっち上げていた。

204.cgi

#!/usr/bin/perl

use strict;
print "Status: 204 No Content\n";
print "Content-Type: text/plain\n\n";


__END__

IRC でアドバイスをくれたhasegaw blog中の人に感謝(2回目)。

2009-02-01

タイトルを入れて見出しのことを忘れてた

ぼけぼけすぎる。しょんぼり

2009-01-30

FastestCSV がヤクい件

Ruby の標準添付CSV パーサが遅いというのは有名な話なので

これまでは主にFasterCSV を使っていました。


FasterCSV のベンチマーク - *Trace Output* にあるとおり、標準のパーサと比較して

結果

csv を parse して行数を数えるだけのスクリプト(後述)の実行時間を GNU time で測定しました。

対象結果
ruby 1.8.4 + 標準添付の csv12分26秒56
ruby 1.8.4 + FasterCSV 0.1.92分34秒92

FasterCSV は標準添付の csv パーサの 5〜6 倍速いようです。

と、それなりに満足していたのですが、とあるPHP で書かれた「CSV を解析してほげほげする処理」を

Ruby で書き直してみたところ、10倍以上の時間が掛かるようになってしまいました。

# 4万行↑のCSV のため、数十秒以上の開きが……。


そこで、先ほどのベンチマークにコメントされていた

moonwolf 2006/06/02 14:28

flexを使ってFastestCSVという拡張ライブラリを書いてみました。

Pythonの2〜3倍くらいの実行時間にまで早くなりましたw


http://d.hatena.ne.jp/miyamuko/20060301#c1149226101

id:moonwolf 氏のFastestCSV を試してみることに。


ちょっと見つけにくかったですが、RAA - csvscan にありました。

CSVScan が正式名称なのでしょうか。

インストールはREADME.ja を見ればすぐに分かるので割愛。


試してみた結果は非常に満足。PHP とほぼ同じくらいの速度で解析されているようです。


使い方が標準のCSV やFasterCSV と少しだけ違うので気をつけないといけないですね。

require "csvscan"   # ライブラリのロード

open(ARGV.shift) {|io|
   CSVScan.scan(io) {|row|
      p row
   }
}