[Debug Hacks] #66.手元のx86マシンが64bitモード対応かどうかを調べる

本日オライリージャパン様より「Debug Hacks――デバッグを極めるテクニック&ツール」の献本をいただきました。著者の皆様、出版社の皆様ありがとうございます。

とりあえず、ざっくりと気になる章だけをかいつまんで読んでみたのですが、最後の章「#66.手元のx86マシンが64bitモード対応かどうかを調べる」では、/proc/cpuinfo で lm の文字列を探す方法と、以下のような CPUID 命令を発行して今自分が使っているマシンのCPUが64bitに対応しているかどうかを調べるハックが紹介されていました。

#include <stdio.h>

void cpuid(int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) {
  __asm__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (op));
}


int main() {
  unsigned int eax, ebx, ecx, edx;
  cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
  if (eax < 0x80000001) return 0;
  cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
  if (!((1<<29) & edx)) return 0;
  printf("64bit Long mode is supported.\n");
  return 1;
}

ただし、このハックの問題点は、CPUが64bitをサポートしているかどうかだけをチェックしていて、実際に64bitロングモードか32bitのx86互換モードで動いているかどうかを検出できないことにあります。

そこで、現在のCPUが64bitロングモードで動作しているかどうかをチェックする簡単なPerlスクリプトを書いてみました。

#!/usr/bin/perl

use DynaLoader;

sub x86_sub {
my ($func, $x86) = @_;
if ($^O eq "linux") {
require 'syscall.ph';
syscall(&SYS_mprotect,(unpack"L",pack"P",$x86)&~4095,4096*2,7);
}
DynaLoader::dl_install_xsub(caller(0)."::$func",unpack"L",pack"P",$x86);
}

x86_sub check64bit => do {
our $LM64bit = "?";

"\xb8\x31\x00\x00\x00".    # mov eax, 0x31

"\x48".                    # dec eax // 64bit REX PREFIX
"\xa2".pack("P",$LM64bit). # mov [$LM64bit], al
"\xc3";                    # ret

};

&check64bit();

warn $LM64bit; # "0" => 32bit, "1" => 64bit

これは、DynaLoader::dl_install_xsubでx86の機械語を直接実行させるサブルーチンを定義して、64bitロングモード特有のREX PREFIXを解釈するかどうかで判別している方法になります。32bitのx86互換モードでは dec eax が実行され $LM64bit=’0′ となりますが、64bitロングモードではこのような1byte decは解釈されず、直後のmov命令のREX PREFIXを指定することになるので、$LM64bit=’1′ となります。

したがって、x86_64対応の「Intel(R) Xeon(R) CPU           E5430  @ 2.66GHz」が搭載されているマシンでもCentOS 5.2(i386)のような64bitに対応していないOSで動かしてしまっている場合は、32bitと判定されます。

本Hackはデバッグには関係ありませんが、普段スクリプト言語を書いておられる方にも興味を持っていただければ幸いです。

Pure Perl で Acme::x86::CPUID を作りました

Perlでアセンブリプログラミングしているとき、実行マシンのCPUを判別してプログラムの処理を分岐したいときがでてくると思います。

そういうときに困ってしまわないように Acme::x86::CPUID を作ってみました。

package Acme::x86::CPUID;

use DynaLoader;

sub ProcessorBrandString {
my $cpu = "\0" x 48;
my $x86 = ""
. "S\xbf" . pack("P", $cpu)
. "\xb8\x02\x00\x00\x80"
. ("P\x0f\xa2\x89\x07\x89_\x04\x89O\x08\x89W\x0c\x8d\x7f\x10X\x8d\@\x01" x 3)
. "[\xc3"
;
DynaLoader::dl_install_xsub("X",unpack"L",pack"P",$x86);&X;
$cpu =~ s/\0+//g;
$cpu =~ s/^ +//;
$cpu;
}

### print Acme::x86::CPUID::ProcessorBrandString, "\n";

1;

DynaLoaderはPerlコアに標準でバンドルされているとっても便利なモジュールです。

※ Acme::x86::CPUID は 100% Pure Perl で書かれているため、別途CコンパイラやXSモジュールなどをインストールする必要がありません。

■ 実行結果

以下、手元にある複数の環境で Acme::x86::CPUID::ProcessorBrandString の値を調べてみました。

※ Linux/Windows/FreeBSDのx86環境でそれぞれ動作確認しましたが、それ以外の環境ではシステムがクラッシュする可能性がありますので実行はお勧めしません。

1. WindowsXP(32bit) – ブログを書いているDELLデスクトップ

Intel(R) Pentium(R) 4 CPU 3.40GHz

2. CentOS5.2(i386) – wafful.org で使用しているVPSレンタルサーバ

Intel(R) Xeon(R) CPU           E5430  @ 2.66GHz

3. CentOS4.4(x86_64) – Linux/AMD64 の開発環境

AMD Opteron(tm) Processor 240 EE

4. FreeBSD(i386) – 奥さんから借りている jail 環境

Intel(R) Pentium(R) 4 CPU 3.20GHz

うまく CPU の情報を取ってこれているみたいですね!

■ まとめ

次回Shibuya.pmで発表の機会があれば、この辺の DynaLoader を活用した基礎的なテクニックを簡単にお話ししようと思います。

XS Niteよりも低レベルな内容ですので、Perlや正規表現に詳しくない人でも安心して聞けると思います。どうぞご安心ください。

Module-Starter-1.470

Module-Starter が 1.470 にバージョンアップしました。v1.470 より以前報告のあったmodule-starter を実行すると Unknown placeholder in Makefile.PL というエラーが出る問題は解消されました。

 

Revision history for Perl extension Module::Starter
1.46    Fri Nov  9 18:36 America/New_York 2007

        [FIXES]
        * undo some bugs introduced by changing API of subclassable "guts"
          methods

ということで、今週から記事中の手順で問題なく module-starter が使えると思います。

$ module-starter --version
module-starter v1.470
$ module-starter --module=My::Yakudoshi
Created starter directories and files

バグ報告いただいた皆さん、ありがとうございました。

カテゴリー: Perl

[訂正] Webプログラミング実力アップ Part1 正しいPerl/CGIの書き方:ITpro



2007/11/14 追記:
Module-Starter-1.470 のバージョンアップによって、下記不具合は解消されました。
記事中の手順で問題なく module-starter が使えるようになっています。

以前、日経ソフトウエア2007.03(1月24日発売)に書いた特集記事
Webプログラミング実力アップ Part1 正しいPerl/CGIの書き方:ITpro
──Webプログラミング初心者からの脱出の手引き


としてITpro上で公開されましたが、その間にCPANモジュールのModule-Starterのバージョンアップがあって、module-starterが動作しない例がありました。

■ 問題点

module-starter を実行すると Unknown placeholder

in Makefile.PL

というエラーが出る。

http://b.hatena.ne.jp/kits/20071023#bookmark-6249546

2007年10月23日
[perl][programming]module-starter –module=My::Yakudoshi したら Unknown placeholder

in Makefile.PL

と言われた。

cpanを使ってみる – いつの間にか27歳日記

sudo perl -MCPAN -e shell
get Module::Starter
force install Module::Starter

が、いざ使ってみるとやっぱり。

Unknown placeholder <MAIN PM FILE> in Makefile.PL

むむ~~。

たしかに、最新の Module-Starter-1.44(Ricardo SIGNES 版)だとうまくいかない模様。

同様の指摘を古川さんよりメールでいただきました。

■ 解決方法

古いバージョンの Module-Starter-1.42(Andy Lester 版)をインストールする。

$ cpan P/PE/PETDANCE/Module-Starter-1.42.tar.gz

このようにすると、記事中の module-starter –module=My::Yakudoshi がうまく実行できると思います。

■ pmsetupを使う(別の解決方法)

正直、Module::Starter::PBP は Damian Conway臭が強すぎるので、結局自分でモジュールのテンプレートを弄るのであれば、
宮川さん作のpmsetupを使う手もあります。

テンプレートが一つのファイルにまとまっているのでカスタマイズが容易で、svkとの連携も簡単です。

pmsetup のインストール手順
$ wget http://svn.yappo.jp/repos/public/misc/pmsetup
$ vi pmsetup
$ sudo install -m 0755 pmsetup /usr/local/bin

実行には Template, YAML, Module::Install, Test::Perl::Critic の CPANモジュールが必要です。事前にインストールしてください。

$ cpan Template
$ cpan YAML
$ cpan Module::Install
$ cpan Test::Perl::Critic (エラーが出る場合はforce installしてください)

pmsetup初回実行時には以下の項目を聞かれるので自分用の設定を入力します。

Your name:  [] Yoshinori TAKESAKO
Your email:  [] takesako{at}shibuya.pm.org
Your svk base scratch DEPOTPATH: [//scratch] [] //scratch
Your svk base mirror DEPOTPATH: [//mirror] [] //mirror
Your workdir: [/home/takesako/tmp] /home/takesako/tmp
pmsetup でモジュールを作る
$ pmsetup My::Yakudoshi
$ cd My-Yakudoshi
$ perl Makefile.PL
$ make test
$ make manifest (MANIFEST の作成)
$ make dist     (tarball の作成)

これをカスタマイズして、自分用のpmsetupを作ってみるのもいいと思います。

  1. YappoLogs: 自分用のpmsetupを作った

以上、ご参考まで。

カテゴリー: Perl

日経ソフトウエアのPerl/CGI記事がオンラインで公開

既にはてなブックマーク経由でご存知の方もいらっしゃるかと思いますが、
以前、日経ソフトウエア2007.03(1月24日発売)に書いた特集記事がITpro上で公開され、オンラインで読めるようになりました。

  1. Webプログラミング実力アップ Part1 正しいPerl/CGIの書き方:ITpro


    ──Webプログラミング初心者からの脱出の手引き
  2. 対談「初心者とハッカーが共存できるPerl」:ITpro


    ──KENT-WEB 見上氏 & Shibuya.pm 竹迫氏

また、ちょうど1年前にKENT さんと対談させていただいたときの記事も併せて公開されました。編集の皆様どうもありがとうございました。

カテゴリー: Perl

core dumpするコードの短さを競う「Core Golf」

まめめもさんの core golf のエントリー(6/27)より

さて、core dump するコードの短さで競う core golf はゲームとして成立するでしょうか。明らかに環境や処理系に依存するのでルールの決め方が難しいです。とりあえずうちでは core dump した C のコード (15B) 。もっと短くなる?

core dumpの定義はいろいろあると思いますが、とりあえず手元の環境 CentOS Linux x64_64 で segmentation fault が起きるコードで。

(1) C言語で core dump

早速、core dumpした5byteのCのコード。
(via. λx.x K S K @ はてな – core golf

main;
実行結果
$ echo -n "main;" > a.c && cc a.c && ./a.out 
a.c:1: 警告: データ定義が型や記憶クラスを持っていません
a.c:1:6: 警告: no newline at end of file
zsh: segmentation fault  ./a.out

コンパイラの警告は出るけどちゃんと実行バイナリができて、それを実行するとsegmentation faultしてくれます。

(2) Perlでcore dump

正規表現でsegmentation faultを起こすのが簡単かな、と思ってトライ。Perlで22byte。
(via. [perl #33945] Segmentation fault with deep recursion in regex engine

$x=qr/(??{$x})/;""=~$x
実行結果
$ perl -e'$x=qr/(??{$x})/;""=~$x' 
zsh: segmentation fault  perl -e'$x=qr/(??{$x})/;""=~$x'

barewordを使ってもよければもう1byte節約することができますが、とりあえずここまで。

(3) Rubyでcore dump

ruby-devのMLには、最新のrubyをcore dumpさせるコードがたくさん投稿されているようです。以下、手元の環境で再現した5byteのコードです。
(via. [ruby-dev:31085] 0..:" dumps core

0..:"
実行結果
$ ruby -e '0..:"'
-e:1: unterminated string meets end of file
-e:1: empty symbol literal
-e:1: [BUG] Segmentation fault
ruby 1.8.5 (2006-08-25) [x86_64-linux]

アボートしました

最強言語 Ruby ?

あと、Ruby 1.8系では正常に(?)core dumpできませんが、Ruby 1.9 では 4byte で core dump 可能なコードもいくつか報告されているみたいでした。
もしかしたら最新のリリースビルドでは再現できないかもしれません。

$ ruby -e '$&;[]'
$ ruby -e '$`;0'
$ ruby -e '$1;0'
$ ruby -e '{*0}'

ということで、現在 Ruby 1.9 が 4 byte で Core Golf 最強になっていますが、3 byte 以下で core dumpできる処理系をご存知の方がいらっしゃいましたら教えてください。

FizzBuzz – Golf Challenge

FizzBuzzプログラムを書くのが流行っているみたいなので私も参加してみることに。

Perl部門

1. 目指せ最短 (perl -eも含めて56byte)

perl -e’die+map{(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/}1..1e2′

※ perl -lオプションを使わずに最短を目指す。標準エラー出力がNGの場合はprintを使って57byteに

perl -e’print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..1e2′

anarchy golf – FizzBuzz で換算すると48byteでPerl最短 (perl -eを含めない)

print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..1e2

これだと perl FizzBuzz.pl と実行できて Code Golf に参加できます。

お約束の展開

2. ppencodeバージョンで

perl -e "print q q print q and print chr oct oct ord uc q map m and print chr oct oct oct ord uc q else and print chr ord uc qw q for q and print chr ord q tie gt and print chr length q x rename sethostent srand pack pipe setpwent syscall else eq split sleep endservent qw require symlink ne keys ord require x and print chr length q q splice srand getservbyname setnetent ne reset endprotoent foreach scalar rewinddir cos setnetent not else getprotobyname q and print chr oct oct oct ord uc q rmdir and print chr oct hex ord uc q dump and and print chr oct oct oct ord uc qw q binmode q and print chr oct hex ord uc q my m and print chr oct oct oct ord uc q oct no and print chr oct oct ord uc q rmdir and print chr oct hex ord uc qw q wait q and print chr oct oct ord uc qw q fcntl q and print chr oct hex ord q q eq and print chr ord uc qw q bind q and print chr ord q dump and and print chr length q q splice srand getservbyname setnetent ne reset endprotoent foreach scalar rewinddir cos setnetent not else getprotobyname q and print chr length q q splice srand getservbyname setnetent ne reset endprotoent foreach scalar rewinddir cos setnetent not else getprotobyname q and print chr oct oct oct ord uc q rmdir and print chr oct hex ord uc q dump and and print chr oct oct oct ord uc qw q bless q and print chr oct hex ord uc q my m and print chr oct oct oct ord uc q lc eval and print chr oct ord uc q each ne and print chr oct hex ord uc qw q wait q and print chr oct oct hex ord qw q die q and print chr oct oct hex ord qw q die q and print chr oct oct oct ord uc qw q binmode q and print chr oct hex ord uc q my m and print chr oct oct ord uc qw q bind q and print chr oct oct oct ord uc qw q binmode q and print chr oct oct ord uc qw q gt q and print chr ord qw q for q and print chr ord q xor x and print chr ord q or no and print chr ord q q q and print chr oct oct oct ord q eq ne and print chr oct oct ord uc qw q fcntl q and print chr oct oct ord uc qw q for q and print chr oct oct oct ord q eq le and print chr ord q ne sin and print chr hex ord q m alarm" | perl

※ perlの予約語だけでプログラミングした場合

他の Perl Monger の解答

3. 404 Blog Not Found:ブクマゴルフってどうよ? (66byte)

perl -le ‘print $_%15?$_%5?$_%3?$_:Fizz:Buzz:FizzBuzz for(1..100)’

※オーソドックスな実装

4. ひおにっき(2007-05-09) [Program] FizzBuzz (56byte)

perl -le’print+(Fizz)[$_%3].(Buzz)[$_%5]||$_ for 1..100′

※インスパイヤの元ネタ。おそらくこれが最短でスマートな実装かも。hioさんの実装よりも短くしようと頑張ったけど、結局抜けませんでした。

5. Golf Challenge: FizzBuzz (この中から面白い実装をピックアップ)

perl -le ‘print+($_,Fizz,Buzz,FizzBuzz)[3&19142723>>2*$_%30]for 1..100′

※ あとでググって見つけたページ。自分の解答もかぶっててちょっと悔しかったです。(><)

6. YappoLogs: FizzBuzzのPerlさいたんきろくたっせい(34ばいと) (Yappoさんのwarn実装)

perl -le’warn((Fizz)[$_%3].(Buzz)[$_%5]||$_)for 1..100′

※ FizzBuzz at -e line 1. みたいな表示になるけど、hioさんの実装より1byte短くなる

7. Acme::FizzBuzz を使えば、これ最強

SET PERL5OPT=-MAcme::FizzBuzz                 # MS-DOSの場合
setenv PERL5OPT="-MAcme::FizzBuzz"            # tcsh系の場合
PERL5OPT="-MAcme::FizzBuzz"; export PERL5OPT  # bash系の場合

※ 環境変数PERL5OPTを使う方法はmiyagawaさんに教えてもらいました。

perl -e1

やっぱりPerl最強です。Ruby や Python でもこの最短記録を抜けるのかな?

anarchy golf – FizzBuzz #Language Ranking ではPerlを抜いてBashが1位で43byte、すげー。どんなコードなんだろうか。興味津々です。

Multi-USB::MissileLauncher for Win32

YAPC::Asia 2007 Tokyo で大人気だった USB::MissileLauncher をマルチに制御するパッチを作りましたので公開します。

Multi-USB::MissileLauncher for Win32 binary package
http://namazu.org/~takesako/pub/usblauncher-20070501.zip

Triple USB Missile Launcher

■ ctlmissileコマンド使用法

Usage: ctlmissile [ up | down | left | right | fire | stop ] [ 3000]

オリジナルからの変更点

http://www.earth.li/~noodles/files/usblauncher-0.0.3.tar.gz からの変更点

* ctlmissile.c.patch

  1. コンパイルオプション -DLINUX -DWIN32 の追加
    (Linux以外のWindows、Mac OS X の環境でも動作するように)
  2. msec秒でコマンドを発行するコマンドライン引数 [ 3000 ] を追加
  3. 複数のUSBミサイルランチャーの接続に対応
    同時制御と逐次制御が可能

■ インストール方法

Windows の場合

事前にLibUsb-Win32からダウンロードできるlibusb-win32-filter-bin-0.1.12.1.exeをインストール

$ gcc -DWIN32 ctlmissile.c -o ctlmissile -lusb

Linux の場合

ディストリビューション付属のlibusbパッケージをインストール

$ gcc -DLINUX ctlmissile.c -o ctlmissile -lusb

Mac OS X の場合

libusbをインストール

$ gcc ctlmissile.c -o ctlmissile -lusb

■ 応用

POE::Component::Server::TCPを使って、USBミサイルランチャーを制御するTCPデーモンを1時間で書く。

missile_server.pl

#!/usr/bin/perl
use POE qw(Component::Server::TCP);
use strict;

sub main {
  my $bind_port = $ARGV[0] || 6969;

  my $kernel = POE::Component::Server::TCP->new(
    Port     => $bind_port,
    Error    => \&error_handler,
    Concurrency => -1,

    ClientInput        => \&handle_client_input,
    ClientConnected    => \&handle_client_connect,
    ClientDisconnected => \&handle_client_disconnect,
    ClientError        => \&handle_client_error,
    ClientFlushed      => \&handle_client_flush,
    ClientShutdownOnError => 0,
  );

  POE::Kernel->run();
}

sub accept_handler {
  my ($socket, $remote_address, $remote_port) = @_[ARG0, ARG1, ARG2];
}

sub error_handler {
  my ($syscall_name, $error_number, $error_string) = @_[ARG0, ARG1, ARG2];
}

sub exe {
  my ($cmd) = @_;
  $cmd =~ s/[^\s\d\w]//g;
  system split(/\s+/, $cmd);
}

sub handle_client_input {
  my $heap = $_[HEAP];
  my $kernel = $_[KERNEL];
  my $input_record = $_[ARG0];
  my $msg = "yes sir, $input_record";
  if ($input_record =~ m/(shutdown|quit)/i) {
    $kernel->yield("shutdown");
    $msg = "connection closed...";
  } elsif ($input_record =~ m/help/i) {
    $msg = "Ugage: [ up | down | left | right | fire | stop ] [ 3000 ]";
  } elsif ($input_record =~ m/^\s*$/ims) {
    $msg = "help";
  } else {
    exe("ctlmissile $input_record");
  }
  $heap->{client}->put($msg);
}

sub handle_client_error {
  my ($syscall_name, $error_number, $error_string) = @_[ARG0, ARG1, ARG2];
}

sub handle_client_connect {
  my $heap = $_[HEAP];
  $heap->{client}->put("connected on USB-Missile-Launcher 200 OK");
}

sub handle_client_disconnect {}

sub handle_client_flush {}

main();

1;

POEのプログラミングは初めてでしたが、perldoc POE::Component::Server::TCP 見ながら簡単に書けました。

■参考URL

YappoLogs: ミサイルは国境を越える 
http://blog.yappo.jp/yappo/archives/000504.html

Google Maps: ミサイルが本当に国境を越えてる???
http://maps.google.com/maps?q=38.22657,-112.299&z=18&t=k

Tilting Google Maps and MissileLauncher - SlideShare (miyagawa-san at osdc.tw)
http://www.slideshare.net/miyagawa/tilting-google-maps-and-missilelauncher/

throw new CybozuLabsException() - libusbを使うPHP Extensionを作りました
http://labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/43

TokuLog 改め Perl を極めて結婚するブログ - missile on ruby.
http://d.hatena.ne.jp/tokuhirom/20070407/1175935832

西尾泰和のブログ @ Cybozu Labs: PythonワンライナーでUSBミサイルランチャーを制御
http://labs.cybozu.co.jp/blog/nishio/2007/04/pythonusb.html

*BSDでのUSBデバイスドライバーの実装
http://www.ofug.net/~yamajun/presentation/2003/usb.html

ToDo

ctlmissile.cで複数のミサイルランチャーを制御する拡張コマンドを追加したので
(ひ)メモ – Assurer::Plugin::Notify::Missileの概要設計の実装が待たれるところです。

カテゴリー: Perl

KENTさんとの対談写真が見れるのは日経ソフトウエアだけ

今日発売の日経ソフトウエア2007.03(1月24日発売)に特集記事を10ページほど書かせていただきました。

日経ソフトウエア2007.03(1月24日発売) 新春Perl対談「初心者とハッカーが共存できるPerl」KENT-WEB 見上氏 & Shibuya.pm 竹迫氏

特集:Webプログラミング実力アップ講座

生産性や品質に差が出る「プロの作り方」を学ぶ

  • Part 1.「初心者とプロはどこが違うのか」これが生産性と品質を上げるカギだ!(斉藤国博)RFCを読もう(大森敏行)
  • Part 2.「正しいPerl/CGIの書き方」Webプログラミング初心者からの脱出の手引き(竹迫良範)
  • 新春Perl対談「初心者とハッカーが共存できるPerl」KENT-WEB 見上氏 & Shibuya.pm 竹迫氏
  • Part 3.「Webアプリケーション・フレームワーク入門」(斉藤国博)
  • Part 4.「セキュアWebプログラミング入門」入力と出力・設計に潜むワナ(大垣靖男)
  • Part 5.「テストを自動化する注目のツールSelenium」こまめなテストがバグ早期発見の決め手に(笹谷真也)

「初心者のレベルから脱出できない」──そんな悩みを抱えているWebプログラマの方のために「プロのやり方」をまとめました。
プロのスキルを身に付けて1ランク上のWebプログラマを目指しましょう。

特集記事では、通常のPerl/CGIの解説書とは異なり、
いきなりModule::Starter::PBPを使ってPerl5のモジュールを作る方法から始めてみました。
テストファーストでクラスを設計し、Test::Moreで単体テストを先に書く。
モジュールの実装ではClass::Accessor::Fastを使ってアクセサを定義する。
POD(Plain Old Document)形式でソースの中にドキュメントを埋め込むこと、
そして、Module::Buildでパッケージングする方法について解説しました。

こうしてできたPerlモジュールを呼び出す形でCGIプログラムを作成し、
HTMLテンプレートエンジンとHTML::FillInFormを使って、
デザインと実装を分離するサンプルプログラムを作成しました。

今回、私が書かせていただいた記事の内容は以上になります。

フレームワークやWebセキュリティ、ブラウザのテスト自動化についてはPart 3.以降の記事に譲り、
Perlの有名なWebフレームワークであるCatalystCGI::ApplicationSledgeJiftySoozyなどについては、名前を紹介する程度にとどめました。
その他、minicpanや、perltidyによるソースコード整形、Perlで日本語の文字コードを扱うときの注意点としてjperlからjcode.plJcode.pmEncode.pmUnicode::Japaneseレガシーエンコーディングまでの
歴史と各サンプルプログラムを載せた原稿も書いたのですが、思いっきりページオーバーとなり、泣く泣くごっそり削除しました。
力及ばず、すみませんでした。

今回の私の担当編集さんは
東京の勉強会やカンファレンスでよくお見かけする
大森敏行さん
でした。

大森さんは私にはない才能を持っていらっしゃる方で、個人的に尊敬申し上げている編集者の一人です。
私の原稿の提出が大幅に遅れてしまったにもかかわらず、忍耐強く待っていただき、
限られた時間の中で、キャッチーなフレーズと、わかりやすい図を描いていただき、
さらに綺麗で読みやすい文章の記事にまとめていただきました。
大変ありがとうございました。

新春Perl対談「初心者とハッカーが共存できるPerl」KENT-WEB 見上氏 & Shibuya.pm 竹迫氏

そして、去年の11月に:: KENT WEB – CGIスクリプト :: で有名な KENT さんと対談させていただいたときの記事が写真つきで載っています。
KENTさんの写真が見れるのは日経ソフトウエア2007.03(1月24日発売)だけです。
まだ見ていない方は、書店にゴー。Amazon.co.jpでも購入できます。

このたびは、このような貴重な機会を与えてくださり、ありがとうございました。

KENTさんと対談しました

先日、日経ソフトウエア様の対談企画で、
:: KENT WEB – CGIスクリプト :: で有名な KENT さんと対談させていただきました。
このような貴重な機会を与えてくださった編集部の英断に感謝いたします。

KENTさんの最新著書:最速攻略 CGI/Perl 作り方入門「はじめに」より

もし、他人が書いたPerlプログラムのコードを見て、残念なことに
その未熟さを批評する人がいたとしたら、実は彼自身のほうが未熟です。
彼はPerlが何たるかを理解していないからです。

この言葉の書かれているページにKENTさんご本人のサインをいただきました。ありがとうございます!

最速攻略 CGI/Perl 作り方入門

Perlの哲学でもあるTMTOWTDI (There’s more than one way to do it.) のスローガンは
Perlのコミュニティの中でも浸透していて、
There’s more Dan the way to do it. といった形式で今もその一端を見ることができます。

続きを読む