2007年6月20日

CGI::Application はじめました

いろいろあって、CGI::Application を一度は触っておこうという事になったので、その備忘録とかいろいろ、たぶん、綴っていく予定、、。
とりあえず、sample的なものを作りはじめた。
ディレクトリ構成は今のところ、こんな感じ
/index.cgi
/MyApp -- /Dispatch.pm
/Welcome.pm
index.cgi
#!/usr/bin/env perl

use strict;

use MyApp::Dispatch;
MyApp::Dispatch->dispatch();

exit;
MyApp::Dispatch
package MyApp::Dispatch;

use strict;
use base 'CGI::Application::Dispatch';

sub dispatch_args {
return {
prefix => 'MyApp',
table => [
'' => { app => 'Welcome', rm => 'start' },
':app/:rm' => { },
],
};
}

1;
MyApp::Welcome
package MyApp::Welcome;

use base 'CGI::Application';

use strict;
use CGI::Application::Plugin::AutoRunmode;

sub cgiapp_init {
my $self = shift;
$self->header_props(-type => 'text/html; charset=SJIS');
}

sub setup {
}

sub start : StartRunmode {
my $self = shift;

my $q = $self->query();

my $output .= $q->start_html(-title => 'Welcome CGI::Application!!');

$output .= '<h1>Welcome CGI::Application!!</h1>';

$output .= $q->end_html();

return $output;
}
"setup" Method が無いと動かない模様、、。まぁ、そのうち使うだろうから定義だけはしておくべし。。。
上記のように作成すると、URL とかが、
http://www.exsample.com/index.cgi/welcome/start
とかアクセスできる

2007年6月15日

CGI - Perl から、Excel の出力

また、いつか使う時が来ると思うので、備忘録的に残しておこう、、サンプルコード。
どこかで、調べてコピッただけ、だけど、、、orz
use Jcode;
use Spreadsheet::WriteExcel::Big;
use Unicode::String qw(utf8 utf16);

print 'Content-type: application/vnd.ms-excel', "\n",
'Content-Disposition: attachment; filename="結果.xls"', "\n\n";

my $workbook = Spreadsheet::WriteExcel::Big->new("-");
my $worksheet = $workbook->add_worksheet;
my $format = $workbook->addformat(font => "MS PGothic");

my ($row_num, $col_num) = (0,0);
for my $row (@rows) {
for my $col (@$row) {
$worksheet->write_unicode(
$row_num, $col_num++,
utf8(Jcode->new($col)->utf8)->utf16, $format,
);
}
$row_num++;
}
$workbook->close;
注意点としては、、
Spreadsheet::WriteExcel::Big を使う事で、大量データのエクセルを作成できる、Big じゃないものだと、途中で落ちる、、??とか、あったような、、
あと、utf16 じゃないと文字化けする??
とか、こんな感じで Excel 作れたよって話し。。。
最新のモジュールとか見直してみた方がいいかも、、、。

sleep は、SIGALRM で解除できる。

最近、daemontools を利用した、perl プログラムを、以下のように書いている
my $END_FLG = 0;
$SIG{HUP} = $SIG{TERM} = sub {
$END_FLG = 1;
};

while (sleep 60) {
# ... bla bla bla ...
exit if $END_FLG;
}
っで、SIGHUP とか SIGTERM とかが来たら、安全な場所で、プログラム停止ができるように組み込んだ、あと、調べて分かった事が、ひとつふたつあるので紹介。SIGKILL は、捕捉したり無視したりできないという事がわかった、それと、SIGSTOP も同じという事が発覚した、、。
参考:perlドキュメント日本語訳 - Perlのプロセス間通信#Signals
そこで、SIGSTOP が捕捉できないって事は、例えば、他サーバーと通信中に SIGSTOP とか受信したら、どうなるんだ??通信相手には、STOP なんて知らせて無いのに強制停止、この時、返答が来たらどうなるの??それに、通信中に停止すると、何も通信が無くなるから途中で、コネクションが強制切断されたりする可能性があるし、かなり困るなぁ、、、SIGSTOP が捕捉できないというのは、仕様としてどうなのだろう、、、??

それと、タイトルの件だけど、sleep が SIGALRM で再開できるってのは、師匠の話によると、alarm を使って、sleep が実装されているとの事、なるほどぉ~!

っで、ふと思ったのだけど、上記に書いた実装方法だと、おそらくだけど、sleep に入って、1秒経過する前に SIGALRM を受信してしまうと、ループから抜けてしまう気がする、、。。

2007年6月8日

Windows ユーザ必見のツール!!

以前にもう一つのブログでも紹介したのですが、いろいろと Tips がたまって来たので、こちらで紹介させて頂きます。ソフトウェアの紹介については、こちらの記事で、、。
っで早速、Launchy の Tips を紹介。

■Launchy から TeraTerm を起動して任意のマクロファイルを実行する

TeraTerm Menu を使わなくても、キーボードだけで、簡単にアクセスできるので非常に便利なワザ。
使い方
ALT + Space → "tt 127.0.0.1" → Enter
etc...
設定方法
  1. Launchy の検索対象のディレクトリ配下に、ショートカットを作成、ショートカットの名前を「tt 127.0.0.1」。※ドメイン名とかが分かり易い
  2. リンク先 「"C:\Program Files\TTERMPRO\ttermpro.exe" /M=ttl\127.0.0.1.ttl /nossh」
  3. ショートカットをIndexに登録させるため、コンテキストメニューより [Rebuild Index] を実行

■Launchy から NextFTP を起動して任意の接続先に接続する

使い方
ALT + Space → "nf 127.0.0.1" → Enter
etc...
設定方法
  1. NextFTP の「ホストに接続」ダイアログにて、ショートカットを作成したいホストを選択し、右側の[ショートカット作成]を押す
  2. デスクトップにショットカットが作成されるので、Launchy の検索対象のディレクトリ配下に、ショートカットを移動
  3. ショートカットの名前を「nf 127.0.0.1」に変更
  4. ショートカットを、インデックスに登録させるため、コンテキストメニューより [Rebuild Index] を実行
※ちなみに、NextFTP のコマンドラインオプションは、ココが詳しい

■Launchy から いろいろな Windows コマンドを実行する

使い方
ALT + Space → "cmd" → TAB → "ping 127.0.0.1" → Enter
ALT + Space → "cmd" → TAB → "ipconfig /all" → Enter
etc...
設定方法
  1. 下記のバッチファイルを、Launchy の検索対象のディレクトリ配下に作成
  2. ショートカットを、インデックスに登録させるため、コンテキストメニューより [Rebuild Index] を実行

ファイル名:cmd.bat
@echo cmd command line for here
@echo off
cd c:\
cmd /K "%1 %2 %3 %4 %5 %6 %7 %8"
っと、そんなわけで、Windows での開発環境も、それなりにストレスの溜まらない方向へ、、まぁ、、Mac が使えればそれで、いいのだけどね、、orz
でも、Windows のコマンドラインも、Launchy があれば、それなりに使えるようになります。。というネタでした、、、。

2007年6月4日

今さら「Fizz-Buzz問題」に取り組む。。。

今さらですが、やってみました、、、

どうしてプログラマに・・・プログラムが書けないのか?

とりあえず、問題だけ見て一回目は、1分程で以下のように、、
for (1..100) {
print ("FizzBuzz\n"), next if ($_ % 3) == 0 && ($_ % 5) == 0;
print ("Fizz\n"), next if ($_ % 3) == 0;
print ("Buzz\n"), next if ($_ % 5) == 0;
print "$_\n";
}
っで、これはひどいので、さらに考えてみた、、
print 
+(($_ % 3) == 0 && ($_ % 5) == 0 ? 'FizzBuzz'
: ($_ % 3) == 0 ? 'Fizz'
: ($_ % 5) == 0 ? 'Buzz'
: $_)
, "\n" for 1..100;
あまり変わって無い気がしますが、、、とりあえず、鰯の回答は以上、、後は、他の方のを見て勉強させてもらいます、、、。