■2004-10-03
* [今月のAcme] Acme::BadExample
ばたばたして結局9月分ですが。Acme::BadExample。悪いお手本。文法的には妥当なのに、コードとしては滅茶苦茶というモジュールです。動きません。動かせたら作者が100ドルくれるそうです。で、これのドキュメントにも登場するPPIというモジュールは、PurePerlなPerlパーサ(Parse::Perl::Isolated)で非常に興味深いものです。そのうち訳してみたいなあ。そのPPIは正しく解析できるけれども、現実には動かない……だからBadExampleということだそうで。このモジュールはコードの面白さが肝なので、別ページにて紹介です。
* [Perl] EncodeとMIME-Header
Re: 全角半角変換という記事(この紹介からEncode+mod_perlとphpの比較経由)で、"utf8 -> MIME-Header への Encode では、行末の折り返しが一般化できないため、現時点では=?UTF-8?= 決め打ちになっています"
とあります。どうやらJEncodeに加えたISO-2022-JPエンコード用クラスの処理は何か間違っているらしいのですが、何が問題なのかわかりません。う〜ん、どうしよう…… (ちなみにJcodeのChangesによると、日本語変換に関して現在のJcodeはEncodeよりも高速)。
その問題はひとまず置いておいて、JEncodeの機能追加。渡された文字列のUTF8フラグをチェックするようにしました。CPANモジュールの中にはPerl5.8以降で使用するとutf8エンコーディングされた文字にUTF8フラグを勝手に立ててしまうものがあるので、その対応です。use utf8
したコード内部でも正しく動作するはずです。ただしその場合は$JEncode::UTF8を真にします。$j->utf8
で返される値にUTF8フラグを立て整合性をとります。また、print "$j"
とやったときにもeuc-jpではなくUTF8フラグ付きのutf8エンコーディングされた文字列が出力されます。
[追記]
ああ、そうか。Encode::MIME::Headerの実装は、utf8を1キャラクタずつ取り出してbytes::lengthでバイト数を計算し、75バイトを超えると折り返すようになっているのですが、これだとiso-2022-jpのバイト数を計算できないですね。iso-2022-jpを1バイト毎に取り出せば正しく折り返せますが、折り返しの部分でESCが切られちゃうとメーラによってはうまくdecodeできません。かといって単純にlengthを計算する前にiso-2022-jpに変換すると、非asciiが1文字ごとにESCで挟まれてしまい、エンコードされた文字列がとんでもなく長くなっちゃうし。
Danさんの書かれているとおり、正しく綺麗に処理させるのは結構面倒なので、現状JEncodeの実装である「mime-encodeする直前にiso-2022-jpに変換」のままにしておきます。"ア1イ2ウ3エ4オ5カ6キ7ク8ケ9コ0"みたいなエスケープシーケンスに挟まれまくりのサブジェクトでない限りは、utf8で計算されたバイト数を超えることもないでしょう。
[追記] JEncode v.1.33で解決しました。(2004-11-04)
■2004-10-09
* [雑感] 勤務風景
先日勤め先でバイトを募集しようということになりました。それで募集広告用の社内風景写真を撮ったのですが、その中から今日は皆様に何枚かをご紹介します(プライバシー保護のためモザイクかけてます)。
管理者近影:皆様ご存じの当サイト管理人です。
朝のミーティング:壇に立って報告をしています。
同僚との楽しい語らいの一時:見ての通りです。
結局そのとき撮った写真は広告業者に拒否されたことを今日知りました。みんなで苦労して撮ったのに。 ……風邪気味で熱っぽいです。
* [今月のAcme] Acme::Japarl(自作)
今日は台風のため半ドンになりました。思いがけず時間が出来たので今月のAcme。でもCPANモジュールではなく自作のやつです。例えば次のコードをみてみましょう。
print join('',reverse(split(//,$str)));
慣れていないとわかりにくいですね。そこでAcme::Japarlです。これを使うとこうなります。
出力 結合('',逆転(分割('',$変数)));
ほら、なんてわかりやすいんでしょう。
use Acme::Japarl 'euc-jp' => 'shiftjis'; my $ほげ = "これはテストです"; my @配列 = 0..8; my @ふー; 出力 結合('',逆転(分割('',$ほげ))),改行; # print 'すでトステはれこ' 反復 { $_++ } @配列; # <=> for(@array){ code } @ふー = 倶列附 { $_ % 2 } @配列; # <=> grep { condition } @array 出力 @ふー,改行; @ふー = 地図 { $_, $_ * 2 } @ふー; # <=> map { code } @array my $条件 = 1; もし {$条件 == 1} ならば { 出力 "ok\n" } あるいは {$条件 == 2} ならば { 出力 "elsif1\n" } しからずんば { 出力 "else\n" }; 出力 木魚(); sub 木魚 { 帰還 'ぽくぽく'; }
* [メモ] 恫喝
虚偽の歴史を押し付ける。自分の気に入らないことについては言論の自由を認めたくない人達のお話。
■2004-10-14
* [雑感] 定食屋さんにて
近所に安くておいしい定食屋さんがあるのですが、夏場はゴキブリの幼虫が闊歩しています。最近は涼しくなったから大丈夫かなと思って久しぶりに行ってみました。向いの壁に大きいのが! それでもそれ一匹だけだから気にせず食事をして、口を拭おうと横に置いてあったティッシュボックスに手をかけたら……
ワラワラと。
* [雑感] 言論テロル
前回の言論の自由を認めたくない人達のお話ですが、とうとう休載に追い込まれたそうで(ここ経由)。やっぱり議員の圧力は大きいのかなあ…… あとここのサイトの荒らされぷっりが圧巻。言論テロルを支える人達の品性の下劣さには唖然とするばかり。
■2004-10-20
* [Perl] 正規表現によるウィルスチェック
CPANのFile::Scan。PurePerlなウィルススキャンモジュール。ウィルスのシグネチャを書き出す方法が付属していて面白そうだったのでメモ。正規表現でシグネチャを調べていくとのこと。
■2004-10-24
* [Perl] reverseの挙動
前回のAcme::Japarlでreverseを例に使っていましたが、よく考えたら reverse $str
($strは文字列)だけで、文字列はひっくり返るんですよね。わざわざsplitする必要なんてなかったわけです。まだまだ精進が足りません。
いうまでもなく、use utf8
されている状態(あるいは正しくencodingsを使用している場合)では、マルチバイト文字も適切にひっくり返してくれます。
_ み [何かと世知辛い昨今、忙しい合間にもさりげないウィットとユーモア感覚を忘れずにいたいですね。]
_ まかまか [いやあ、本当ですね。上のアナウンスはウィットに富んでいるんだか直球なんだかよくわかりませんが、とりあえずツボにはまり..]