nDiki : CGI

2003年11月9日 (日)

[ WiKicker ] SpeedyCGI 対応するも……

WiKicker の高速化のために SpeedyCGI 対応作業。

  • Singleton パターンの除去
  • リクエスト処理後にデータベースunlock処理を必ず実施するようにする
  • DATAハンドルの読み込みを最初にキャッシュ

等を行う。 手元では動くようになった。

で今度は www.naney.org 上でテストしてみたのだが、無念 SpeedyCGI 自体がうまく動かない (FreeBSD 4.4-RELEASE + Perl 5.005_03)。 CGI で呼び出すと

 failed to open log file
 fopen: Permission denied

エラー。make test でもこけているテストがあったし(t/sh_bang、t/timeout)このサーバじゃ動かんのかな?

と思ったら動いた

CGI スクリプトの先頭に

 #!/home/.../bin/speedy -w -- -M30 -t300 -r30 -p/home/.../bin/speedy_backend

のように記述していたのだが path部分が長かったため sh-bang の限界を越えてしまっていたようだ。-p オプションで指定している speedy_backend のパスの方はデフォルトが Makefile.PL 実行時に適切に設定されているはずだから、実際には省略可。

ということで、

 #!/home/.../bin/speedy -w -- -M30 -t300 -r30

としてみたら動いた。 よっしゃ。 これでリクエスト毎のプログラムのローディングの必要がなくなるので、レスポンスの遅さが改善されるはず。 パラメータは

  • -M30 (MaxBackends: これ以上だとサーバによろしくない?)
  • -t300 (Timeout: デフォルトの 3600=1時間だと長いかな。不要なプロセスは早めに止めておきたい)
  • -r30 (MaxRuns: まだバグメモリリーク等があるかもしれないので30回呼ばれたらバックエンドを re-exec するように)

としておく。様子をみて微調整。 これからは、WiKicker を更新したら Wiki CGI スクリプトを touch する事を忘れないようにしなくては(SpeedyCGI にバックエンドを再起動させなおさせるため)。

スポンサード リンク
[ 11月9日全て ]

2004年2月25日 (水)

[ 映画鑑賞 ] 20:30 ゼブラーマン

やまだ君と久しぶりに映画を観に川崎へ。 映画は去年の9月に座頭市を観て以来。

JR川崎駅で待ち合わせた後、映画の話などをしつつ夕食。 その後先にチケットを買って(全席指定だと思ってたら自由席だった)、DOS/Vパラダイス、DICE内のさくらやをぷらぷらした後、上映30分ぐらい前に劇場へ。

チネチッタ - チネグランデ

座席数は多いのだが、シートは一世代前。 最近のシネコンの高い背もたれのあるシートに馴れるとちと頭が疲れる。 決して悪いグレードではないのだけれどね。

客入りはレイトショーということもあってかなり少なめ。30人ぐらい? J列中央に座ったが前方には誰もいなかった。

ゼブラーマン

私とゼブラーマン

映画の方は中盤まではテンポが良く楽しめた。

後半だんだん真面目な展開になってくるのだが若干中途半端な感がある。 70年代特撮物のテイストでいきたいのか、それとも現代的なイメージでいきたいのが読み切れない。 中途半端にCGI(エンドロールを見て気になったのだがCG ではなくて CGIなんだな。Computer Generated Image)を多く使わないで、より特撮っぽい方が個人的にはよかったのになと思う。

コメントとして書くと辛口になってしまうが、男性諸氏はそれなりに楽しめる映画だと思う。女性の人にとってはあんまりかも。

教頭はムーが好き。

渡部篤郎

やっぱ格好いい。

今年は「××実写化」が多いなか、キューティーハニーの予告が流れていた。 この予告だと全然観る気しない。 やっぱり注目は「キャシャーン」、「サンダーバード」あたりかな。


image:ASIN:B000228XH8

ゼブラーマン プレミアムBOX - 白黒つけるぜ!! 浅野さん!!

[ 2月25日全て ]

2004年5月15日 (土)

[ WiKicker ] CGI.pm の依存度減らし

CGI::Link や start_html の呼び出しをやめて自前で処理したり。

CGI.pm では徹底的といえるほど AUTOLOAD を使うようになっていて、サブルーチンを最初に呼び出したときに _compile 中で eval により定義するようになっている。

使わないサブルーチンの構文解析等に時間がかからないというメリットがあるかわりに、_compile はそれなりに時間もかかるので自前でやれる部分は自分でやった方がちょっと速くなる。

[ 5月15日全て ]

2004年8月19日 (木)

Module::CoreList

Perl に標準バンドルされているモジュールが、どのバージョンで提供されるようになったかの情報をチェックすることのできるモジュール。

corelist というユーティリティが付属している。

チェックできるPerlバージョンの一覧

 corelist -v

 Modue::CoreList has info on the following perl versions:
 5.00307
 5.004
 5.00405
 5.005
 5.00503
 5.00504
 5.006
 5.006001
 5.006002
 5.007003
 5.008
 5.008001
 5.008002
 5.008003
 5.008004
 5.008005
 5.009
 5.009001

Perlにバンドルされている CGI モジュールのバージョン

 corelist -a CGI

 CGI  was first released with perl 5.004
   5.004      2.36
   5.00405    2.42
   5.005      2.42
   5.00503    2.46
   5.00504    2.46
   5.006      2.56
   5.006001   2.752
   5.006002   2.752
   5.007003   2.80
   5.008      2.81
   5.008001   3.00
   5.008002   3.00
   5.008003   3.01
   5.008004   3.04
   5.008005   3.05
   5.009      3.00
   5.009001   3.04

Perl 5.005_03 にバンドルされているモジュール

 perl -MModule::CoreList \
   -e 'print join("\n", map { "$_ $Module::CoreList::version{5.00503}{$_}" } sort keys %{$Module::CoreList::version{5.00503}})'

 AnyDBM_File
 AutoLoader
 AutoSplit 1.0303
 B
 B::Asmdata
 B::Assembler
 B::Bblock
 B::Bytecode
 B::C
 B::CC
 B::Debug
 B::Deparse 0.56
 B::Disassembler
 B::Lint
 B::Showlex
 B::Stackobj
 B::Terse
 B::Xref
 Benchmark
 CGI 2.46
 CGI::Apache 1.1
 CGI::Carp 1.13
 CGI::Cookie 1.06
 CGI::Fast 1.01
 CGI::Push 1.01
 CGI::Switch 0.06
 CPAN 1.48
 CPAN::FirstTime 1.36
 CPAN::Nox 1.00
 Carp
 Class::Struct
 Config
 Cwd 2.01
 DB_File 1.65
 Data::Dumper 2.101
 Devel::SelfStubber 1.01
 DirHandle
 Dumpvalue
 DynaLoader 1.03
 English
 Env
 Exporter
 ExtUtils::Command 1.01
 ExtUtils::Embed 1.2505
 ExtUtils::Install 1.28
 ExtUtils::Installed 0.02
 ExtUtils::Liblist 1.25
 ExtUtils::MM_OS2
 ExtUtils::MM_Unix 1.12602
 ExtUtils::MM_VMS
 ExtUtils::MM_Win32
 ExtUtils::MakeMaker 5.4302
 ExtUtils::Manifest 1.33
 ExtUtils::Mkbootstrap 1.14
 ExtUtils::Mksymlists 1.17
 ExtUtils::Packlist 0.03
 ExtUtils::XSSymSet 1.0
 ExtUtils::testlib 1.11
 Fatal 1.02
 Fcntl 1.03
 File::Basename 2.6
 File::CheckTree
 File::Compare 1.1001
 File::Copy 2.02
 File::DosGlob
 File::Find
 File::Path 1.0401
 File::Spec 0.6
 File::Spec::Mac 1.0
 File::Spec::OS2
 File::Spec::Unix
 File::Spec::VMS
 File::Spec::Win32
 File::stat
 FileCache
 FileHandle 2.00
 FindBin 1.42
 GDBM_File 1.00
 Getopt::Long 2.19
 Getopt::Std 1.01
 I18N::Collate
 IO
 IO::File 1.06021
 IO::Handle 1.1505
 IO::Pipe 1.0902
 IO::Seekable 1.06
 IO::Select 1.10
 IO::Socket 1.1603
 IPC::Msg 1.00
 IPC::Open2 1.01
 IPC::Open3 1.0103
 IPC::Semaphore 1.00
 IPC::SysV 1.03
 Math::BigFloat
 Math::BigInt
 Math::Complex 1.26
 Math::Trig 1
 NDBM_File 1.01
 Net::Ping 2.02
 Net::hostent
 Net::netent
 Net::protoent
 Net::servent
 O
 ODBM_File 1.00
 OS2::ExtAttr 0.01
 OS2::PrfDB 0.02
 OS2::Process 0.2
 OS2::REXX
 Opcode 1.04
 POSIX 1.02
 Pod::Functions
 Pod::Html 1.01
 Pod::Text 1.0203
 SDBM_File 1.00
 Safe 2.06
 Search::Dict
 SelectSaver
 SelfLoader 1.08
 Shell
 Socket 1.7
 Symbol 1.02
 Sys::Hostname
 Sys::Syslog
 Term::Cap
 Term::Complete
 Term::ReadLine
 Test 1.122
 Test::Harness 1.1602
 Text::Abbrev
 Text::ParseWords 3.1
 Text::Soundex
 Text::Tabs 96.121201
 Text::Wrap 98.112902
 Thread 1.0
 Thread::Queue
 Thread::Semaphore
 Thread::Signal
 Thread::Specific
 Tie::Array 1.00
 Tie::Handle
 Tie::Hash
 Tie::RefHash
 Tie::Scalar
 Tie::SubstrHash
 Time::Local
 Time::gmtime 1.01
 Time::localtime 1.01
 Time::tm
 UNIVERSAL
 User::grent
 User::pwent
 VMS::DCLsym 1.01
 VMS::Filespec
 VMS::Stdio 2.1
 attrs 1.0
 autouse 1.01
 base
 blib 1.00
 constant 1.00
 diagnostics
 fields 0.02
 integer
 less
 lib
 locale
 ops
 overload
 re 0.02
 sigtrap 1.02
 strict 1.01
 subs
 vars
 vmsish
[ 8月19日全て ]

2004年9月14日 (火)

XMLRPC::Lite + 自前の HTTP::Daemon サーバ

既に HTTP::Daemon で作成されているHTTPサーバで、XML-RPC インタフェースを提供したい。 前回のチェックで XMLRPC::Lite を使う事にした(RPC::XMLActivePerl 5.6.1 build638 でテストが通らない)。 このパッケージで用意されているサーバ向けモジュールは、主に単独CGI プログラムで使うモジュールと、自前で HTTP::Daemon をまわすサーバタイプ。

そのままでは使えないので、以下のように。

  1. XMLRPC::Transport::HTTP::CGI のサブクラスを作成し、handle をオーバライドする。中身は SOAP::Transport::HTTP::Server::handle を呼ぶだけ (SUPER::handle では駄目)。
  2. XML-RPC リクエストがきたら、上記インスタンスの request メソッドで HTTP::Request オブジェクトを渡す。
  3. handle を実行。
  4. response メソッドで HTTP::Response を受け取り、クライアントに送信。

handle メソッドで入出力をさせないようにするのがポイント。

[ 9月14日全て ]

2004年12月15日 (水)

ノート PCApache Virtual Host

メインノート PC で動かしている Apache のバーチャルホスト設定を整理。 以前から WiKicker その他 CGI アプリケーションのテスト用にいくつかバーチャルホストを設定して利用していたのだが、ごちゃごちゃしてきた。

パーソナル用、仕事パーソナル用、各プロジェクト用を新設。 デフォルトと含めて5つのバーチャルホストを設定。 今まで設定していなかったアクセス制限(ローカルホストからかか認証ユーザからのアクセスのみ許可)もきちんとかけておく。 デフォルト以外のバーチャルホストには簡単にメモがおけるように、wiki をセットアップ。

パーソナル用には Another HTML-lint gateway や dwww などもセットアップ。 今後Webベースのツールはここにおいて利用するかな。

基本的に DHCP で割りあてた IP アドレスを点々とすPCホストなので、今のところ hosts に明示的にバーチャルホスト名を書かないと(それとユーザ・パスワードの設定をしないと)外部から利用できない。 基本的には自分専用なので問題ないのだけれど、ダイナミックDNSとかそのあたりの実験はこんどしてみたいところ。

[ 12月15日全て ]

2005年1月18日 (火)

ホームネットワークカメラ BL-C10 買っちゃった

naney:3069753179

結局買っちゃった。 無駄遣いかなぁと思いつつ、どうせ最後には買っちゃう自分が目に見えていたので。

家に帰ってからちょっといじる。 最近周辺機器を買った時のパターンと同じく、(主 にLinux で使用・管理するので)付属のCD-ROMWindows BOX にインストールする事なくセットアップする方向で。

接続

カメラ本体に LAN ケーブル、AC アダプタを接続。 製品出荷時はネットワークは自動設定になっている。

ここで通常「添付 CD-ROM に入っている Windows 用のソフトを起動してMACアドレス一覧からカメラを選んで設定へ」という流れになる。

…… nmap でスキャン。192.168.x.253 に発見。 Firefox で接続できた。

後は基本的に Web ブラウザから設定できるので、説明書通り作業できる。

設定

動画を見ることができたのを確認してから、ちょこちょこ設定をいじる。 ファームウェアバージョンアップを押したら、ファームウェアイメージをアップロードする画面に。 取消を押しても取り消せない……。 再起動しても、またこの画面だし。

あげときますか。 Panasonic のサイトから最新のファームウェアイメージをとってきて、BL-C10アップロードし更新。

これで通常の作業ができるようになった。 びっくりしたなぁ。

パン/チルト

じゅうたんの上においていじっていたのだが、下の方ばかり映っている。 あれ? 上方向には+10度しか動かないのか……。 誤算。 構造上の制約なのか、太陽・天井光源をうつさないようにする配慮なのか。悪用防止のためなのか?

設定の際には高めの位置にするか、少し角度をもたせて置いた方が良さそうだ。

静止画の取得など

BL-C10 自体にFTPクライアント機能やメールクライアント機能があってサーバへのアップロードが可能だが、画像加工を一旦してからサーバに上げるなど柔軟にやりたいのでPCで静止画を取得したい。

Panasonic のネットワークカメラは「ネットワークカメラCGI利用説明書*1」が公開されている。上位機種向けの仕様書だが、基本はBL-C10でも同じと思われる(ズームなど無い機能をのぞいて)。 実際、対応するURLにリクエストすることで静止画の取得やカメラの制御などを行えた。

ということで 10分おきの www.naney.org へのアップロードは、BL-C10 から Wget して使う事に。 こちらは定点撮影にしたいので、BL-C10で設定できるプリセットの1つをライブカメラ用にして一旦これを呼び出してから、撮影するようにするとする。


[ 製品レポート ]

*1CGIというのは誤用だと思うが

[ 1月18日全て ]

2006年2月18日 (土)

Perl CGI プログラムのテストには WWW::Mechanize::CGI

CGI プログラムを書いていて、いつも困るのがリグレッションテスト

パッケージのビルド時に実行するテストスーツ (make check / make test 用テストプログラム群) に含めておきたいが、さすがにその場で Web サーバの下へセットアップするわけにもいかない。 ミニ Web サーバを同梱してテストスーツ内で起動する方法はちょっとおおがかかりだし、ポート番号の選択やらサーバの停止の問題もあって、かなり面倒。

結局、テストスーツの中で環境変数や標準入力など CGI リクエスト環境をセットアップして、CGI プログラムを実行するという王道(?)かつ泥臭いテストを書くことになったりする。

何かいいものはないかと探していたところ、WWW::Mechanize::CGI というものをみつけた。

LWP::UserAgent を継承した WWW::Mechanize モジュールは Web ブラウジングを容易にする有名どころのモジュールである。

WWW::Mechanize::CGI モジュールはさらにこれを拡張したモジュールで、HTTP リクエストを、仮想的に CGI プログラムやサブルーチンへの呼出しにしてくれる。 これを用いるとあたかも Web サーバ上の CGI プログラムにリクエストしレスポンスを受けとっているかのように、テストプログラムを書くことができる。

素晴しい。

さっそく WiKicker のテストを書き換えてみた:

 use Test::More tests => 2;
 use WiKicker::WikICGI::Controller;
 use WWW::Mechanize::CGI;
 use File::Temp qw(tempdir);
 use File::Spec;
 my $www_dir = tempdir(CLEANUP => 1);
 my $mech = WWW::Mechanize::CGI->new;
 $mech->cgi(sub {
              $ENV{PATH_INFO} = '' if $ENV{PATH_INFO} eq '/';
              WiKicker::WikiCGI::Controller->new->run});
 $mech->env($mech->env,
            SCRIPT_FILENAME => File::Spec
                                 ->catfile($www_dir . '/wiki'),
            SCRIPT_NAME => '/wiki');
 my $response = $mech->get('http://localhost/wiki');
 ok($response->is_success);
 like($response->content,
      qr|<title>WikiForum\[WiKicker\]: FrontPage</title>|);

WWW::Mechanize::CGI オブジェクトを new した後、cgi メソッドで CGI サブルーチンを指定するか、cgi_application メソッドで外部 CGI プログラムを指定する。 ここでは直接、CGI サブルーチン (WiKicker::WikiCGI::Controller->new->run を実行)を指定した。

なおここで WWW::Mechanize::CGI が使っている HTTP::Request::AsCGI 0.5 における PATH_INFO の扱いが Apache などとは違って、空でも必ず '/' が入るようになっている。 これだと WiKicker では困るので、サブルーチンのところで修正している。

後は必要ならば WWW::Mechanize::CGI::env で、追加の環境変数設定を行っておく。

セットアップが済めば通常の WWW::Mechanize と同様に get 等でリクエストを行いレスポンスを受けとることができるようになる。

いい。しばらく試してみて不具合がなさそうなら、定番のテストスタイルにしたい。

ちなみに Test::Harness 用の Test::WWW::Mechanize にあわせて、Test::WWW::Mechanize::CGI というものもある。 これらを用いるとさらにテストを書くのが楽になるが、依存するモジュールも多いので無理に使わないほうがいいかもしれない。

[ 2月18日全て ]

2006年3月2日 (木)

FreeBSDApache::Htpasswd

WiKicker認証ドライバの1つとして、まずは Apachehtpasswd パスワードファイル(AuthUserFile ディレクティブ用パスワードファイル)形式のものを作成することにする。 これなら htpasswd で作成することができるので、最悪最初の段階では WiKicker に登録・削除機能を入れないで済む。

Perl からこのパスワードファイルを扱うモジュールとしては Apache::Htpasswd や、Authen::Htpasswd がある。 CPAN にある CGI-Application-Plugin-Authentication は前者を、Catalyst-Plugin-Authentication-Store-Htpasswd では後者を使用している。

機能的にはほぼ同じか。 Authen::Htpasswd の方がユーザ名に対応するオブジェクトを取得するメソッドがあり便利といえば便利だが、まあなくても困らないだろう。

ということで今回は、依存モジュールの少ない Apache::Htpasswd を選択した。 Perl 5.005_03 にはない warnings プラグマが使われているが、Htpasswd.pm の

 use warnings;

1行を削除すれば問題無し。

FreeBSD 4.4-RELEASE #3 + Perl 5.005_03 + Apache-Htpasswd 1.7 だと、crypt 関連のテストケースが失敗する(not ok 17)のがちょっと気になるところ。 MD5 ベースのパスワードの読み書きは問題ないので、この環境ではこちらを使うことにしよう。

[ 3月2日全て ]

2008年11月18日 (火)

MAILPIA による Twitter リプライチェック

リプライのチェックは Twitter 検索での「@自分」検索結果 + MAILPIA にしていた。しかし夏ぐらいから Twitter 検索Twitter API仕様変更であまり検索がヒットしなくなってしまいリプライをメールで受信できなくなってしまった。

まだ使ったことないけど「あらったー!」も取りこぼしがあるらしいし、replies API を使うクローズドアルファバージョンは登録受付終了中。

とりあえず replies.atom をさらす Perl CGI スクリプトを作って、それを MAILPIA に読ませることにした。 骨子はこんな感じのみ(実際には一応パスワード暗号化して保存しておいたりしている)。

 use CGI;
 use LWP::UserAgent;

 my $url = 'http://twitter.com/statuses/replies.atom';
 my $query = CGI->new;
 my $user_name = 'myusername';
 my $password = 'mypassword';

 my $ua = LWP::UserAgent->new;
 $ua->credentials('twitter.com:80', 'Twitter API', $user_name, $password);
 my $response = $ua->get($url);

 print $query->header('application/atom+xml; charset=utf-8');
 print $response->content;

これを設置した URLMAILPIA に登録して出来上がり。

Twitter Search

考えてみたら Twitter 公式の検索があるんだっけ。 日本語検索が駄目駄目なので使っていないけれど、リプライ検索には使える。

新しいリプライもすぐひっかかるようなので Twitter Search + MAILPIA の方がいいな。 パスワードサーバにおいておかなくても良いし。

……と思ったらフィードの title にリプライした人の名前が入っていないな (author に入っている)。これだと MAILPIA からのメールに名前がはいらないかもしれない。

ま今回は自作スクリプト経由にしておくか。


[ Twitter 関連サービス ]

[ 11月18日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.064649s / load averages: 0.41, 0.41, 0.44
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker