PerlでCGI::Sessionがcoreserverではうまく動かない

Perlでセッション管理の話です。
PHPだとセッションはsession_start()と$_SESSIONで楽に扱えますが、Perlではたまに苦しみます。
さて、今回はローカルのVistaのActivePerlでは正常に動くスクリプトをcoreserverにアップすると挙動が違うのです。
クッキーは更新されているのに、セッションファイルが更新されません。
クッキーがない場合はセッションファイルを作成しているのですが、それ以降の更新が行えません。
また、クッキーだけ残してセッションファイルを削除するとセッションファイルの作成すらしてくれません。
極めつけはアクセスすると1分ごとにセッションファイルが量産されていくのです。
もちろんセッションの有効期限はそんなに短くありません。
どうしてかな~と、いじっているとどうやらリダイレクトが悪さをしているようです。
たとえばログイン処理でログインに成功するとログイン後のトップページへリダイレクトするわけですが、そうすると正常にセッションが更新されません。
リダイレクトをやめて一度ページを表示するなど出力をクローズしておけば期待した動きをしてくれます。

でも、CGI::redirectとCGI::Sessionの相性が悪いという話は聞いたことがありません。自分の開発環境では一度もそういう現象には出くわしたことがありません。
環境が違う点といえば・・・cgiwarpぐらいかな。「CGI::Session coreserver」とかでぐぐっても同じ現象の記事が見つからないので自分の書き方が悪いのかな~

UTF-8とUnicode

文字を扱うときは普段からUTF-8を使用します。Shift_JISやeucはめったに使いません。
さて、UTF-8はUnicodeなのですが、表記の方法で躓きました。
PerlやPHPなどのスクリプトで扱う場合は、たとえば「あ」なら「\xe3\x81\x82」と記述するのですが、「U+xxxx」という表記が必要な自体にでくわしました。
Flashで文字のコードを取得使用とするとこの表記でしか取得できないようで、文字を管理するにはコードで管理したほうが楽なのでこのコードで扱うことに島した。
さてここで問題です。「U+xxxx」の表記ってコレいったいナニ?といろいろ調べていくと、「UCS2」というコード体系だということが判明。Perでこの表記を取得するには以下のとおり。

my $string = 'あ';
&from_to( $string, 'utf8', 'ucs2' );
print unpack('H*', $string );
# 3042


JcodeよりもEncodeのほうがいいらしい?この当たりは試してないのでどちらとも。ただ、日本語に依存するものがないときは基本的にEncodeを使ったほうが安全という話。今回はUTF-8からUCS2なので、下手に日本語環境を考えるとコードが化けたりしかねない。
これで、文字を管理することができるようになりました。
UCS2って今まで気にしなかったコード名です。他にもUCS4とかあるようです。

Flashへのフォント埋め込みは無法地帯?

Flashはいろいろできてとても便利です。
画像や図形、それに肝心の文字。
さて、ここで文字を表示するためのフォントのお話です。

Adobeがライセンスを持っているフォント(FlashやAdobeReaderにバンドルされているもの)は自由に埋め込むことができます。
しかし、Windowsについているフォントや、オフィス系ソフトを入れると入るフォントはライセンス上そのアプリケーションとセットでなければなりません。
そして、そのフォントは商用利用できないことがほとんどです。
つまり、「このフォントを使って何がしを注文できます」と商売はできないということです。

商用フォントであればこれらの制限はないものが多いですが、Flahsへの埋め込みは別です。
Flashへの埋め込みは個人であってもNGなものがほとんどのようです。
静止画テキストであればその文字限定ということで画像と同じ扱いなのか、特に問題はないものの、ユーザが個別に入力できる文字にそのフォントで表示できるようなダイナミックテキストになるとほとんどアウトです。
つまり、フォント情報をフォントとして扱える状態で埋め込むことは配布と同じことになり、ライセンス違反となります。
フォント自体に埋め込めない機能があればいいのですが、パスとして引っ張り出せば回避されますからね。

さて、web上で名刺などをデザインできるサイトがちらほらありますが、アクセスしたパソコンにあるフォントしか表示できなかったり、フォントの都合で出来上がりは見た目と違うと断ってあるサイトはさておき、「パソコンになければサーバからダウンロードします」と露骨にライセンス違反と思われる行為を宣言しているサイトを見つけました。
おそらくフォントを埋め込んだswfを個別に読み込むのでしょう。システムとしては理に適っていますがライセンス的には・・・
ここまで露骨だとある意味ほほえましいですが、フォントベンダーが放置している理由も良くわかりません。相手にするほどでもないというのか、正規の配布ライセンスを持ているのか(フォントサーバ扱いのライセンスになるのでン百万ぐらいするらしい)謎です。

ちなみに埋め込みに関するライセンスを回避するには、フォントとして再利用できない形で表示するのであれば問題ないようです。つまり、フォントデータから自由に「文字を表示」できる状態を用意することが問題で、文字ではない画像で表示するのであればフォントを再利用できない状態であると判断されるとのことです。だって、そうじゃないと校正をFAXやメールに添付して送ることもライセンス違反になっちゃいますからね。

何がいいたいかというと、フォントを利用した何かを転送することが問題なのではなく、フォントの情報そのものが転送されることに問題があるということです。結論として画像でやれと。

失敗を認めた日本でのセカンドライフ

今日のワールドビジネスサテライト(以下、WBS)で仮想空間の特集をやってましたが、いまごろになってやっとセカンドライフの失敗を認めましたね。
電通(博報堂もだったか?)のしかけたこのビジネスは、ネットをしらないビジネスユーザには受けたものの、日本のカルチャーであるゲームに興味を持っていた者には既知のサービスでしかも空振りで失敗に終わっていたことは誰もがしっていた。当時のアスキーの記事には失笑したものだが。
そして、アメーバのアバタサービスが成功したかのような記事があったけれど、「もともとのユーザが多いだけでアバタサービスが新しいわけではない」ことをきちんと取り上げるべきだ。
アバタサービスなんてはるか昔からあるわけだし、個人的にちょっとやっていたけれど、知る人ぞ知る動物のアバタサービス「gopets」が突然終わったこともはるか昔。
正直、今頃アバタを取り上げるなんて、あの映画とタイアップしているのか。WBSも広告の言いなりに落ちたわけではあるまい?
最近のWBSには、ところどころほころびが生じている。取材の能力が落ちているとしか言いようがない。ガイアやルビコンのほうがまだましに思えることもある。
昔のWBSなら全方面から取材をこなし、一方ではこうだが他方ではこうだとどこから見ても納得できる内容だった。
だが最近はどうだ、片方からしかも狭い見地からしか取材を行っていないものが増えている。
失敗談をきちんと取り上げるトレたまが最後の砦だ。

Adobe Flash CS4の不可解な挙動

いろいろいじくっていると、パブリッシュ時にエラーを吐いてくれます。
もちろん、構文に問題があるからなのですが。
で、出くわしたこんなエラー
「ReferenceError: Error #1065: 変数 ComponentShim は定義されていません。」
グーグル先生に尋ねても知らん振り。
仕方がないので何千行もあるソースをコメントアウトしたりtraceの場所を増やしてみても変えたりしてもこのメッセージ1行のみ。
つまりコンパイル時のエラーらしい。

ならコンパイルエラーと書け。
構文エラーじゃないじゃん?

いろいろ弄っていると、いつの間にかシンボルの1つが画面から消えているのに気がついた。
オブジェクトとしては存在するんだけれど、表示されない。
ボタンでは表示できるがムービークリップでは表示できない。
一度ファイルを閉じて開きなおしてみるが、なぜか保存時のものに回復されず、最新の状態が復帰してしまう。
これはまさに顔面蒼白という状態である。

もうどうにでもなれと、アプリケーションを落として再起動してみると・・・
なんてことはない。
正常に機能していた。

そういえば操作を戻す作業をしてからおかしくなったような・・・?
どうやらFlashのガベージコレクションには欠陥があるようだ。
どういう手順で発症するのかわからないが、何らかの条件で最新の状態のみが優先されリセットされていないらしい。
それで戻る操作をすると整合性が取れなくなり、コンパイラのどっかで構文エラーが発生してパブリッシュに失敗するようだ。
しかし検索してもヒットしないエラーにお目にかかれるとは。

Adobeの体験版をインストールしたらひどい目にあった

IllustratorのデザインをHTMLに起こす作業が必要になって、Dreamweaverなら一発で変換できるかもしれないと入れてみた。
結論からするとできなかったわけだが、後で気がついたことがいろいろと。

まずファイルの関連付けが強制的に変更される。
テキスト関係の関連付けがごっそりと入れ替わってひどい目にあった。
それに、コンテキストメニューにAdobe Driveというよくわからないメニューが追加されて非常にうっとうしい。しかも表示しない設定がどこにもない。

Adobeの技術にはいろいろとお世話になっているけれど、こういう所はまったくもって共感できない。
レジストリいじるしかないのかなぁ。はぁ。

能勢名物くれべのでっちようかん

突然ですが食べ物のお話です。
年末年始は実家に帰省してました。
そのあいだに自宅鯖がダウンしたり波乱のあった年越しでしたが。

さて、実家は猪名川、猪名川といえば能勢(むちゃくちゃや)でウマいものといえば「くれべ」の「でっちようかん」
能勢で買おうと思ってもちょっとっ遠いので(能勢は近いがくれべが遠い)ので、地元で探したものの店においてない。
しかたがないので、いつもの様に清和台の消防署前にあるショッピングモールで手に入れた。

やはりウマい。
本当にウマいと思える食べ物は
この能勢(大阪)の「くれべ」の「でっちようかん」
そして鳴門(徳島)の「そば処 橋本」のそば

グルメではないから食べ歩きなどはしないが、また食べたいと思う食べ物は30年以上生きててもまだこの2つしかない。
ちなみに、行列のできる店で何度か食べたことがあるが、待たされてやっと食べられたからウマいと勘違いしているだろうだけで、はっきりいってウマい店は一つもない。まぁ、マズくはないレベルである。

CentOS5.4のGUIをVNCでリモート操作する

SSHも便利なのだろうが、クライアントの設定も必要なので使ってない。
基本的な設定などはWebminですむので特に問題はないが、あえてGUIで操作したいときにはVNCが重宝する。
自宅のネットワークにあるLinuxは全てVNCで操作しているが、たとえば手元にない場合、VNCを使うにはどうすればいいのか試してみた。
Google先生が教えてくれたサイトの情報は古いものやどうでもいい質問掲示板などがヒットして、はっきりいって役にたたなかった。

まずVNCの基本からおさらい。
通常はVNCうを使ったリモートデスクトップ機能でログイン中のユーザの画面をそのまま扱えるが、これはログインしていなければならない。うっかり再起動したものなら、このリモートデスクトップ機能は使えなくなり、まったく操作できなくなってしまう。
そこで、リモートからログイン自体が可能にならなければならない。

とりあえず「vncserver」と入力してvncserverを起動してみると、初回ならパスワードを設定するよう求められる。
よくわからないまま放置しているがユーザごとにパスを変えられるのかはよくしらない。

次に、起動方法の設定を行う
ディスプレイ番号1をrootでログインする場合、「/etc/sysconfig/vncservers」に以下のように追加する

VNCSERVERS="1:root"
VNCSERVERARGS[1]="-geometry 800x600 -nolisten tcp -nohttpd -localhost"


あらかじめコメントアウトされている2行をコピーして数値を書き換えるだけで問題ないだろう。
それでサービスを再起動する

/etc/init.d/vncserver restart

VNCサーバーの起動に成功すれば、手順として7割終了といってもいいだろう。
複数のディスプレイをサービスで起動する方法が良くわからないので、誰か教えてください。

ちなみに0はリモート用に予約されているのか使えないので1からとなる(みたい)
アクセスするにはこのディプレイ番号に5900を足したポートに接続することになる。
つまり1なら5901ポートなので、ファイアウォールの穴を開けるのを忘れないようにする。
オプションいついては良くわからないのでそのままにしてある。(だめじゃん)
かいても最後の番号が有効になるらしい。

さて、ここでVNC Viewerでリモート接続してみる。
サーバのIPが192.168.11.2だとすると「192.168.1.2:5901」で接続する。
接続できればパスワードを求められるので入力するとログインできる。
しかし、GNOMEになれているとTwmという見慣れないGUIが表示される。
GUIなので、ターミナルからコマンドを入れれば何でも起動するのだけれど、メニューがほしい。
というかGNOMEが使えればというか使えないと意味がないので、使えるようにする。

今までの設定はVNC Serverへのログインで、そのユーザではどう表示するかの設定をする必要がある。
通常と同じにしてくれればいいのに、いちいち設定しないとだめなのは少し面倒くさい。(やり方があるのかも?)
設定ファイルは「/root/.vnc/sstartup」にあるが、隠しファイルを表示しないと見えないので注意。
「twm &」とある行をコメントアウトして「gnome-session &」と追加する。

結論から言えばここまでで成功ですが、これより理解できないことが多いので箇条書きに書いておく。

GNOMEでログインできるのは1プロセスのみ?
すでにrootでログインしていてGNOMEを使っているとVNCではGNOMEが使えないので、twmの出来損ないのような画面になる。(「twm &」に戻せばtwmで正常になる)
ログインs知恵いるユーザをログアウトさせても、GNOMEが使えない状態が残る。
システムをリブートして誰もログインせずにリモートからつなごうとすると5901ポートではなく5900ポートでリモートから接続できるようになっている。そしてGNOMEが使える。さらに、直接ログインするとそのデスクトップのリモート機能は使えない。つまり、先にリモートでログインしてしまうとリモートデスクトップ機能はしぬ。しかも、うっかりリモートをログアウトするとリモートからは永久にログインできなくなる・・・

つまり、リモートでログインしたければ、直接ログインしてはならない、うっかりログインしてしまった場合は、一度ログアウトしてログインしなおしてリモートデスクトップ機能で共有するしか方法がないようです。

この現象はGNOMEを選択した場合に限られ、twmのままであれば関係ないようです。

ちなみにユーザが違う場合は・・・やっぱり同じ現象でだめでした。
つまり・・・どういうことだ?
SSHじゃないと誰もログインしていないマシンをリモートで操作することはできないのか?
な訳ないよな・・・
だんだん混乱してきた。

vncserversの設定でroot以外を設定するとリモートからのログインができなくなった。
これはrootでvncserverを起動したからで、ほかのユーザでログインするにはそのユーザでvncserverを起動してパスワードを設定しなければならないようだ。
つまり、rootユーザ限定の前提で考えた場合、
rootでvncserverのパスを設定する。
vncserversの設定はパス設定済みのユーザを指定しなければならない。
vncserversで設定したユーザで一度ログインしてしまうとリモート系の機能は麻痺する(らしい)

う~ん、わかったようなわからないままのような。
まぁ、リモートで操作する前提なら直接ログインすることはないだろうから・・・
でもいざというときが怖いですね。やっぱりSSH入れろってか?orz=3

CentOS5.4でCPANを更新すると警告が大量に出た

えらいことになった。
とりあえずTerm::ReadKeyを入れればいいらしい

[root@localhost ~]# cpan
Sorry, we have to rerun the configuration dialog for CPAN.pm due to
some missing parameters...

Normally CPAN.pm keeps config variables in memory and changes need to
be saved in a separate 'o conf commit' command to make them permanent
between sessions. If you set the 'auto_commit' option to true, changes
to a config variable are always automatically committed to disk.

 
Always commit changes to config variables to disk? [no] 

A Build.PL is run by perl in a separate process. Likewise we run
'./Build' and './Build install' in separate processes. If you have any
parameters you want to pass to the calls, please specify them here.

Typical frequently used settings:

    --install_base /home/xxx             # different installation directory

 
Parameters for the 'perl Build.PL' command? [] 

Parameters for the './Build' command? Setting might be:

    --extra_linker_flags -L/usr/foo/lib  # non-standard library location

 
Your choice: [] 

Do you want to use a different command for './Build install'? Sudo
users will probably prefer:

    su root -c ./Build
 or
    sudo ./Build
 or
    /path1/to/sudo -u admin_account ./Build

 
or some such. Your choice: [./Build] 

Parameters for the './Build install' command? Typical frequently used
setting:

    --uninst 1                           # uninstall conflicting files

 
Your choice: [] 



Please remember to call 'o conf commit' to make the config permanent!

Constant subroutine __USE_POSIX undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 8,  line 5.
Constant subroutine __USE_POSIX2 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 9,  line 5.
Constant subroutine __USE_POSIX199309 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 10,  line 5.
Constant subroutine __USE_POSIX199506 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 11,  line 5.
Constant subroutine __USE_XOPEN undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 12,  line 5.
Constant subroutine __USE_XOPEN_EXTENDED undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 13,  line 5.
Constant subroutine __USE_UNIX98 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 14,  line 5.
Constant subroutine __USE_LARGEFILE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 16,  line 5.
Constant subroutine __USE_LARGEFILE64 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 17,  line 5.
Constant subroutine __USE_FILE_OFFSET64 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 18,  line 5.
Constant subroutine __USE_BSD undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 19,  line 5.
Constant subroutine __USE_SVID undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 20,  line 5.
Constant subroutine __USE_MISC undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 21,  line 5.
Constant subroutine __USE_GNU undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 23,  line 5.
Constant subroutine __USE_REENTRANT undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 24,  line 5.
Constant subroutine _POSIX_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 49,  line 5.
Constant subroutine _POSIX_C_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 51,  line 5.
Constant subroutine _XOPEN_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 53,  line 5.
Constant subroutine _XOPEN_SOURCE_EXTENDED undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 55,  line 5.
Constant subroutine _LARGEFILE64_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 57,  line 5.
Constant subroutine _LARGEFILE_SOURCE undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 104,  line 5.
Constant subroutine __USE_ISOC99 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 108,  line 5.
Constant subroutine __GNU_LIBRARY__ undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 156,  line 5.

cpan shell -- CPAN exploration and modules installation (v1.9402)
Enter 'h' for help.

                                                                                Can't ioctl TIOCGETP: 無効な引数です
Consider installing Term::ReadKey from CPAN site nearby
        at http://www.perl.com/CPAN
Or use
        perl -MCPAN -e shell
to reach CPAN. Falling back to 'stty'.
        If you do not want to see this warning, set PERL_READLINE_NOWARN
in your environment.


どうやらTerm::ReadKeyというものが必要なようなので、いれてみる。

cpan[1]> install Term::ReadKey
CPAN: Storable loaded ok (v2.15)
Going to read '/root/.cpan/Metadata'
  Database was generated on Tue, 15 Dec 2009 08:56:54 GMT
Running install for module 'Term::ReadKey'
Running make for J/JS/JSTOWE/TermReadKey-2.30.tar.gz

  CPAN: checksum security checks disabled because Digest::SHA not installed.
  Please consider installing the Digest::SHA module.

CPAN: Time::HiRes loaded ok (v1.9717)
Scanning cache /root/.cpan/build for sizes
............................................................................DONE
CPAN: Compress::Zlib loaded ok (v1.42)
CPAN: Archive::Tar loaded ok (v1.54)
TermReadKey-2.30/
TermReadKey-2.30/genchars.pl
TermReadKey-2.30/Makefile.PL
TermReadKey-2.30/Configure.pm
TermReadKey-2.30/test.pl
TermReadKey-2.30/ReadKey.pm
TermReadKey-2.30/META.yml
TermReadKey-2.30/ReadKey.xs
TermReadKey-2.30/ppport.h
TermReadKey-2.30/MANIFEST
TermReadKey-2.30/README
CPAN: File::Temp loaded ok (v0.22)
CPAN: YAML loaded ok (v0.70)

  CPAN.pm: Going to build J/JS/JSTOWE/TermReadKey-2.30.tar.gz

Checking if your kit is complete...
Looks good
Writing Makefile for Term::ReadKey
cp ReadKey.pm blib/lib/Term/ReadKey.pm
AutoSplitting blib/lib/Term/ReadKey.pm (blib/lib/auto/Term/ReadKey)
/usr/bin/perl -I/usr/lib/perl5/5.8.8 genchars.pl

Writing termio/termios section of cchars.h... Done.
Checking for sgtty...
        Sgtty NOT found.
Writing sgtty section of cchars.h... Done.
/usr/bin/perl /usr/lib/perl5/5.8.8/ExtUtils/xsubpp -noprototypes -typemap /usr/lib/perl5/5.8.8/ExtUtils/typemap  ReadKey.xs > ReadKey.xsc && mv ReadKey.xsc ReadKey.c
gcc -c   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables   -DVERSION=\"2.30\" -DXS_VERSION=\"2.30\" -fPIC "-I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE"   ReadKey.c
/bin/sh: gcc: command not found
make: *** [ReadKey.o] エラー 127
  JSTOWE/TermReadKey-2.30.tar.gz
  /usr/bin/make -- NOT OK
Running make test
  Can't test without successful make
Running make install
  Make had returned bad status, install seems impossible
Failed during this command:
 JSTOWE/TermReadKey-2.30.tar.gz               : make NO


makeに失敗しました。
しかたがないのでyumからいれてみることに

[root@localhost ~]# yum install perl-Term-ReadKey
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: rsync.atworks.co.jp
 * base: rsync.atworks.co.jp
 * extras: rsync.atworks.co.jp
 * updates: rsync.atworks.co.jp
Setting up Install Process
No package perl-Term-ReadKey available.
Nothing to do

orz=3
えっと、あとはどうすればいいんだろう?