雑記帳 2006年 4月第2週

2006/04/02 Sun.

open (FILE, "+<index.html");
flock (FILE, 2);
@line = <FILE>;
foreach (@line) {
    $_ =~ s/\<A class=\"(dairy|sat|sun)\" href=\"(.+)\"\>/\<A href=\"$2\" class=\"$1\"\>/g;
    push (@new, $_);
}
seek (FILE, 0, 0);
print FILE @new;
truncate (FILE, tell (FILE));
close FILE;

3月10日の雑記で書いたHTMLのタグの要素の記述順を修正するソース。と言っても、全然大したことしてないけど。
2004年度のHTMLを全部手動で更新したのがアホらしいな。この程度のソース、最初から真面目に書いておけばよかった。
そんなこんなで、自サイト関連の作業を色々と。やはりPerlは趣味の範囲にとどめておくのが正しい判断っぽいな。
ぶっちゃけ、画像を表示させているviewer.cgiも微妙なんじゃないかと思う。ただの画像へのリンクに戻すべきか?
つーか、VGA以上のサイズの画像は自動的に縮小してるようにしてるけど、この機能もいらない予感が満載だ。

2006/04/03 Mon.

#    URL自動リンク化サブルーチン(継続処理)
sub auto_link {
    #    引数は掲示板に書き込む本文全体
    my $value = shift;
    #    URLに該当する部分を引数に、URL文字列のリンク化サブルーチン(継続処理)呼び出し
    $value =~ s/((http|ftp|https):\/\/[\w\.\-\/~?&+=:@%;\#,|]+)/&anchor($1)/eg;
    #    戻り値を設定
    return $value;
}

#    URL文字列のリンク化サブルーチン(継続処理)
sub anchor {
    #    引数はリンクを貼るURL
    my $url = shift;
    #    URLに「http://www7a.biglobe.ne.jp/~junmix」が含まれている場合
    if ($url =~ /^(http|ftp|https):\/\/www7a\.biglobe\.ne\.jp\/\~junmix/) {
        #    スタイルシートのクラスを設定
        $class = "inner";
    #    URLに「http://www7a.biglobe.ne.jp/~junmix」が含まれていない場合
    } else {
        #    スタイルシートのクラスを設定
        $class = "outer";
    #    戻り値を設定
    return "<A href=\"$url\" target=\"_blank\" class=\"$class\">$url</A>";
}

ちょっと奥さん、これでバグ取れたんじゃありません?以前に話した自サイトで使用している掲示板系CGIのバグの部分。
コメント機能の部分と掲示板系CGIのURLリンクも問題無くなるはず!ってか、ソース見ないとバグがわからないんだけどね。
mixi」のコミュニティ最強すぎ。どこぞの某巨大掲示板よりかは遥かに役に立つぞ。あー、今日はこれだけですげー満足。

……なんて、気分最高のままで一日が終われてたまるかぁ!はいはい仕事仕事。つーか、この時期に仕様変更かよ。
さらにタチが悪いのが、仕様変更する箇所が1年と2ヶ月前にリリースした箇所。もうね、アホかと。馬鹿かと。
今の開発と全然関係ない部分だし、平行して作業しないといかん。しかも、近日中に終わらせろとか言ってるし。
期限を訊くと、水曜くらいにはソースの修正が終わっているくらいがいいとか。また肺に穴で空けて寝こんでやろうかと。
今週の土曜にはリリースが控えているというのに、何つータイミングの悪さだ。そんなにすぐ終わらせられるんかいな。

2006/04/04 Tue.

public static String cutString(String sData, int iLength) throws Exception {
    String sNewData;
    try {
        byte[] bData = sData.getBytes("SJIS");
        sNewData = new String(bData, 0, iLength);
        if (sNewData == null || sNewData.equals("")) {
            sNewData = new String(bData, 0, iLength - 1);
        }
        return sNewData;
    } catch (Exception e) {
        throw e;
    }

Javaの方がPerlと比べて文字列の切り出しが簡単だな。とりあえず使い勝手がよさそうってことで「この」ソースを更新。
つーか、文字列の切り詰めをsubstring()のみでやってる部分が今の開発ソースにあった。問題出てないからいいか。
PerlだとShift_JISかEUCかによって処理が変わりすぎる。ってか、Shift_JISだと正確に文字列操作を行えないしな。
例えば、Shift_JISで書かれた文字列を10文字読み出すってだけでも、EUCに変換しないとバグが出る可能性がある。
JavaやJSPも色々と覚えてきたことだし、この際だから「Programming」で配布しているソースのJSP版でも作ってみるか?
Perlで言うところの「jcode.pl」のJSP版とかって無いのかな。JSPで細かい日本語処理をするってのがありえないか。
逆に言えば、使えない機能は片っ端から切り捨てられるから、実際に作るとなれば手間は省けるな。マジでやってみるか。
簡単にJSP版に換装できそうなのは「junmix BBS」と「Graphic Counter」、「Text Counter」、「Online Notepad」くらいか。
画像関係を扱う「junmix Icon BBS」とかは画像サイズ取得ライブラリとかを使ってるし、簡単には作り変えられないだろう。
あ、「Graphic Counter」も画像使ってるか。JSPで使える画像連結や画像サイズ取得ライブラリとかって無いのかな。
Fake 2ch BBS」とかをJSP版に作り変えるとかになると、工数を想像しただけで気が狂いそうになるから即却下だ。
そういや、「Simple Scheduler」の配布ページを作るとか作らないとか言ってた気がする。あれはかなり微妙だからなぁ。

2006/04/05 Wed.

普通に仕事して、普通にメシ食って、普通に帰っただけだから、今日は取り立てて書けるような内容が無いんだよな。
珍しく朝から真面目に仕事したってのはあるけど。ってか、今月末リリースの修正内容が簡単なようでややこしい。
フローチャートもコーディングも簡単なのはいいのだが、その修正内容を他人に説明して理解させるのが激しく疲れる。
何つーか、試験ケースが多いんだよな。イレギュラーなケースの対応を突き詰めていったらキリがありませんよ。

職場で使ってる落ちまくりのノートPCを修理部門に見てもらうことになったらしく、午前中に代わりのノートPCが来た。
どう見てもスペックがカスです、本当にありがとうございました。つーか、今のマシンが意外に性能いいんだよな。
ただ、50,000行くらいあるテキストファイルを開いてCtrl+Aで全選択してコピーしようとすると数秒固まるのが欠点。
メモリ関連に何か不具合あるのか?家のマシンでも数万行コピーしただけじゃ固まったりはしないが。何が原因だか。
原因不明の落ちまくり現象もメモリ関連じゃないのかな。何の脈絡もなく落ちるなんて、メモリが原因以外考えにくい。

2006/04/06 Thu.

結構気温が低かったせいか朝から晩まで寒気がするし、頭が痛いわ仕事はメンドいわでやってられない一日。
突然意味不明な緊急対応もあったりしたけど、頭が痛いせいで効率が上がらん。何とか終わらせて家帰って即寝る。
今週は睡眠が少ない日が多いのがキツい。しかも土曜日の朝9時の出社が確定してるし、今日で睡眠時間を確保するぞ。

                         ,、- ''''''''' ー 、
                      ,、 '"- ''"´´´>''≧、-ー、 ヽ、  ,,,、-ー'"レiri,,,,
                     ,r'"'"_,,,、-ー-z'~テ≦彡;;;;;彡ノ  ̄       (
                   /从''";r''"'~;;;;、-勿;;;爪Yシテ|            `7
                 ッ''"((((ii|;;;((;;/彡二ヲ;;;;彡r)),|  出 緊 あ な  7
                (从;;;((((从从ミ从{//,,;;;彡彡''";;;;;;;;j  し 急 ろ  に  /
、__、、_r、ノ''ー'"(_、ノ|  iiミミii、ミ;;;ミミミ;;;ゝii|;;;;ゝ//;;;<从ー--;;j   た 対 う  様  く
 )           L,,,(|ミミ、;;ヲ;;;;;;;从;;;;;;从从i|i||;;;;ヽヽ;;;;;;;;〈   以 応 と  で  /
マ             / l、マミ;;ツii;;;;;|iiリ;;;;;〈'''リ;;i|;;;;;;ttヽ;; ト;;;l、;;;|  上 依       ヽ
)     な コ 決  レミ;;;之|从i|;;;;レi|;;;|从イ;;|;;|ヽ;;;ヽヽリ;;リ |/ノ     頼       {
ノ     い ス 着   | ゝ;;;;;i|i|从iiヽ;;;从从ヽ;;;;;;ヽ、从リノ、ノ 勿    を      r-'
ろ    と  ト は   |ミ;;ツ};;j ,,;;;;;;;;;;;;;;;;;;iiitヽ{;;;;;;;;;;;、;;z;二'';;ミ`ヽ;、         /
ろ.    心 増.     ヽ(;;;;;;〈;;'";;ッモ;zヲミ;;;{ ~'彡ィ'ニヽ-''>:ゝ  ヽ;|,、--ーァ,,、- 、r'
ノ     得 以      (  |;;;;;} '"'''''' ""´::| " ~':::::.. ̄     |;;;リ.l|;;;;;;从
ヽ    よ 外      ( ノ;;;;;;i   ..:::::::::::::i  ',    ~""    |;;/i.リ;;i|;;::从
 )     //       //'イi|i;;', '""""""(;:'Y''''':y        |/''''ノ从;;从ヽ
 勹   ・・        |'""/リリt-',      ::ヽ;;''"         リ'ーr";;|、tt;;从ヽ
  /           〉 ノ;/イ. 〉、',     ;;r'''ー- 、,_      /  ';;;;;、ヽtt;;从ヽ
 /''" ̄)_  /\(~'/''/ノ /  ti、    "二二 ̄ `    ,r':::   ';;ヽ;:~''' 、;;;|レ;;
       ヽ';;''"  /'/" /  ,r|:ヽ    """"~     /:::"   ';;;|;:;:;:;:;:;~''-、
.       /;;"  /''/'"  i| /:;:;〉 ::ヽ         ,、 "::::::"   ,i|;;|;:;:;:;:;:;;:;:;:;:;
      /;/  /'',/''   /;:;:;/;;;', ::::::ヽ、,    _,、 ':::::::::::::" ,、-'" |;;|;:;:;:;:;:;;:;:;:;:;:
      〈;/  /'' /''   /;:;:;:;:;/;/i|', :::::: :::: ̄ ̄;;''" ::::::::::;、-'"   i;|;:;:;:;:;:;;:;:;:;:;:;
      i|||  /'' i||  ,r";:;:;:;:;:;;:/;;l i ', :::::  '''::::::::::::::::;、-'""      i|;:;:;:;:;:;;:;:;:;:;:;;
      ~'-/,,、、-ー''";:;:;:;:;:;;:;:;/;;;;| ', ヽ  :::  :::::;、-'"'"     ,、-'j|;:;:;:;:;:;;:;:;:;:;:;;:
   ,,、、-ー''",,、-ー''/;:;:;:;:;:;;:;:;:;:;i;;;;;;|  ヽヽ  ::::;、-'" '"    ,、-,,'~,, '''||;:;:;:;:;:;;:;:;:;:;:;;:
ー''":::::::-ー''"::::::::::::/;:;:;:;:;:;;:;:;:;:;:/;;;;;;|   ヽヽ::::",、 "    ,、 '" '''    ||;:;:;:;:;:;;:;:;:;:;:;;:;

2006/04/07 Fri.

class PrintTest {
    public static void main(String[] args) {
        try {
            System.out.println(args[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

こんな感じで引数を表示するだけのクラスを作る。んで、次にこのソースをコンパイルしてからクラスファイルを呼ぶ。

#!/bin/sh
javac PrintTest.java
java PrintTest $1

こんなシェルを書く。引数に渡した文字列を表示するだけの簡単なモノなのだが、昨日はこの部分で色々メンドかった。
Unixマシンを持っている人なら、とりあえずこんなのを実行して欲しい。俺は知らなかった。回りも知らなかった。

echo *

ただ単に「*」を表示するだけのものかと思ったら、そのディレクトリ下にあるディレクトリ及びファイル一覧を取得する。
シェルの中で記述している「java PrintTest $1」に「*」を渡すと、ディレクトリ内の一覧を取得した結果の先頭が表示される。
一部の機能で「*」を引数に渡している部分があって、シェルを介してJavaのクラスを実行するために変な結果になるワケだ。
ちなみにWindowsマシンはシェルの代わりにバッチファイルを作成することで実行できる。バッチへの引数は「%n」で参照。

javac PrintTest.java
java PrintTest %1

Windowsマシンでもバッチの引数に「*」を指定すると、ディレクトリ及びファイル一覧の先頭の結果を表示してる。どういう事?
そのくせにWindowsマシンで「echo *」とやっても、単に「*」が表示されるだけ。意味がわからん。Unixの「*」は厄介だな。
とにかく、引数に数値もしくは「*」が入ってくる部分があって、「*」の場合は全部異常終了しているケースを修正しましたよ。
つーか、Unix上のシェルの引数に渡された「*」を特別な文字扱いしないで、普通にそのまま扱う方法って無いんかな?
エスケープでもするかと思って「\$1」とかやっても無理だし、別変数使ってあれこれやっても結局無理だったとか。
シェルだけで修正できれば簡単なのに、結局シェル上で「*」の扱いを変える方法が不明だったので、Javaのソースを修正。

これは一例だけど、とにかく昨日は突如としてあれこれ降ってきて大変だった。おかげで真面目に仕事しちゃったぞ。
緊急対応ってのは不思議なもので、個別に一つ一つ来るんじゃなくて、一斉にすげー量が降りかかってくるから困る。
今日は比較的落ち着いた一日だ。リリースの準備をしたり、時期リリースの詳細設計仕様書を書いたりとか。つまらんけど。

  そ だ |------、`⌒ー--、
  れ が |ハ{{ }} )))ヽ、l l ハ
  が   |、{ ハリノノノノノノ)、 l l
  い   |ヽヽー、彡彡ノノノ}   に
  い   |ヾヾヾヾヾヽ彡彡}    や
  ! !   /:.:.:.ヾヾヾヾヽ彡彡} l   っ
\__/{ l ii | l|} ハ、ヾ} ミ彡ト
彡シ ,ェ、、、ヾ{{ヽ} l|l ィェ=リ、シ} |l
lミ{ ゙イシモ'テ、ミヽ}シィ=ラ'ァ、 }ミ}} l
ヾミ    ̄~'ィ''': |゙:ー. ̄   lノ/l | |
ヾヾ   "  : : !、  `  lイノ l| |
 >l゙、    ー、,'ソ     /.|}、 l| |
:.lヽ ヽ   ー_ ‐-‐ァ'  /::ノl ト、
:.:.:.:\ヽ    二"   /:::// /:.l:.:.
:.:.:.:.:.::ヽ:\     /::://:.:,.::l:.:

2006/04/08 Sat.

はいはい休日出社です休日出社です。あのな、いい加減に休祝祭日にリリースするのやめませんか?頭悪いですよ?
そもそも「休む日」と書いて休日なのに、「休む日に会社に出る」と書く休日出社ってのは矛盾してると思うんですよ。
今日のリリースは本番環境を対象としたものだけど、そんなにややこしいリリースじゃないから楽なのが救いかな。
200倍もの性能改善を達成したデータの保存機能、これをリリースしたことによってユーザーの利便性も向上するだろう。

結局正午になるかならないかくらいで作業が無事に終了したので、多摩センで「SUBWAY」でも食って帰ることにする。
チキンサラダサンドなどという美味そうなものがあったので、それのポテトセットを頼んでみる。これで660円也。

かなり当たり。この類の商品は量が少ないのはしょうがないが、味がよければそれでいい。つーか、「SUBWAY」は久しぶり。
高校の時に新百合ヶ丘で食ったのが最後かな。多摩センにできてからは、行こう行こうと思ってて今日まで行かなかった。
これだけじゃ食い足りないので、ツナラップを追加。野菜が多いサンドイッチ系は最近はハマり気味かもしれないな。

午前中までは天気悪かったんだけど、午後になって急に回復してきたので、通称「TCP」やウチの近所を散歩して帰る。
ウチの近くに宝野公園っていうのがあるんだけど、多摩セン周辺ではここは毎年この時期は花見の名所になってる。

デジカメを持っていなかったのが残念だ。携帯の写真じゃかなり荒っぽくなる。ま、晴天の日はいい場所ですよってこと。
さすがに今日と明日が花見をするチャンスとしては最後になるかな?来週もまた雨が降る日があるっぽいしね。

さて、コメント機能を実装した直後に残っていたURLの自動リンク機能にバグがあったのは先日に話をしたと思う。
それを修正した方法が4月3日の雑記に書いた通りなんだけど、あの2つのサブルーチンを直接使ったためにバグが出てた。
あの2つのサブルーチンで返す文字列は、実際にはJavascriptの中で使われるもの。要するに、エスケープをミスってた。
Javascriptの「parent.document.getElementById("c060407").innerHTML = "...";」の「...」の部分の文字列が問題。
ここにログから読み出した本文を入れるんだけど、Javascriptで「""」で囲った文字列の中に「"」があるとエラーなんです。
例えば、「parent.document.getElementById("c060407").innerHTML = ""文字列"";」って書くとダメなんだよね。
Javascriptの「""」の中で「"」と使うには、「"\"文字列\""」みたいに、「"」をエスケープしないとダメなんです。
それに気付いたのがついさっきで、とりあえずこの部分をささっと修正。いやー、バグを見つけられてよかった。

#    URL文字列のリンク化サブルーチン(継続処理)
sub anchor {
    #    引数はリンクを貼るURL
    my $url = shift;
    #    URLに「http://www7a.biglobe.ne.jp/~junmix」が含まれている場合
    if ($url =~ /^(http|ftp|https):\/\/www7a\.biglobe\.ne\.jp\/\~junmix/) {
        #    スタイルシートのクラスを設定
        $class = "inner";
    #    URLに「http://www7a.biglobe.ne.jp/~junmix」が含まれていない場合
    } else {
        #    スタイルシートのクラスを設定
        $class = "outer";
    #    戻り値を設定
    return "<A href=\\\"$url\\\" target=\\\"_blank\\\" class=\\\"$class\\\">$url</A>";
}

これで完了。Perlで「""」で囲った文字列の中にさらに「""」で囲う文字列があると、見た目がワケわからんな。
しかも、その文字列をJavascriptの中で使用するから、さらに「\」でエスケープ。Perlで「\」を出力するには「\\」と書く。
ヒアドキュメントで返すのもいいけど、あれって一番最後に改行が入るし。後から改行取る処理入れるのも何かアホっぽい。

ついでに、Javascriptのファイルの配置も修正。一つのディレクトリの中にまとめて突っ込むと、管理がややこしくなるしね。
自分のサイトを管理してるフォルダの中の総ファイル数が1,400前後くらいか。もっと管理しやすい方法でも模索してみよう。