雑記帳 2005年 2月第4週

2005/02/20 Sun.

何が悲しくて日曜日を早起きしなければいけないんだ。と、文句を垂れても納期は変わりません。しょうがねぇな。
日曜日の朝だというのに、青梅線がやたらと混んでるし。ってか、朝の青梅線で座れたことってほとんど無いな。
昨日は職場に自分含めて3人でしたが、今日は4人。あんまり変わんないな。とりあえず黙って仕事をします。

で、ここ数日は何がややこしかったかって言うと、jarがDBからデータを拾ってきてJSPに吐き出す部分の修正。
聞いた感じではそんなにややこしくないと自分も思ってたんだけど、取得項目の変更だけで酷い目にあったぞ。
えらい適当だけど簡単な例として、機材コードを機材情報テーブルから取ってきて表に吐き出すと考えてみます。

//    DBからのデータ取得クラス
public class DB {
    Connection conn;
    Statement stmt;
    ResultSet rs;
    String sSql;
    //    コンストラクタ
    public DB() {
        conn = null;
        stmt = null;
        rs = null;
        sSql = "";
    }
    //    DB接続
    public String connectDB (String sPath) {
        String sRet = new String();
        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            conn = DriverManager.getConnection (sPath);
            stmt = conn.createStatement();
        } catch (SQLException eSql) {
            sRet = eSql.getErrorCode() + " - " + eSql.getMessage();
        }
        return sRet;
    }
    //    DB切断
    public void disconnectDB() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.commit();
                conn.close();
            }
        } catch (SQLException eSql) {
          //
        }
    }
    //    データ取得
    public String getCode (String sName) {
        String sRet = new String();
        sSql = "select 機材コード from 機材情報 where 機材名称 = '" + sName + "'";
        try {
            rs = stmt.executeQuery (sSql);
            if (rs.next()) {
                sRet = rs.getString (1);
            }
        } catch (SQLException eSql) {
            sRet = eSql.getErrorCode() + " - " + eSql.getMessage();
        }
        return sRet;
    }
}

まぁこんなんでいいのかな。これをJSPで呼び出すには、インスタンスを生成してメソッドを呼べばOK。
別に難しいものじゃないんだけど、この例みたいに取得データが一つではなく複数の場合はちょっと違う。
複数項目に及ぶ場合は、最後にカンマ区切りにして一つのデータにまとめ、そのカンマ区切りのデータをJSPで分割する。

//    取得データの数だけループ
StringTokenizer stk = new StringTokenizer (sData, ",");
String sName = stk.nextToken().trim();
String sDate = stk.nextToken().trim();

だが、後になって「sNameとsDateの間にsInfoを取得する」事になったとする。しかも、sInfoの中にはカンマが入りうる。
本来ならば二つのデータが三つに増えるだけなのだが、sInfoにカンマがあるとそれもデータの区切りとして見なされてしまう。

//    取得データの数だけループ
StringTokenizer stk = new StringTokenizer (sData, ",");
String sName = stk.nextToken().trim();
String sInfo = stk.nextToken().trim();
String sDate = stk.nextToken().trim();

例えば、上記のsDataが「機材0001,Made in Japan,20040527」とかの場合なら、カンマ区切りデータが3つで問題ない。
ところが、sInfoにカンマが入ると「機材0006,CPU for USA, Canada,20040527」のようなデータになりうる場合もある。
こうなってしまうと、sDateに「Canada」というデータが入ってワケわからんことになる。こういう類の修正ばっかでした。
カンマをサニタイズして後から元に戻せよ、ってのは無しで。何でもそう都合良くはいかないものなのです。はぁ。
禁則文字とかが存在するため、その類の文字に一時変換してもいいかと思ったんだけど、これもやるワケにはいかない。
「$」や「|」や「?」はPDFやCSVデータ作成用の区切り文字になってて、使える代替文字が全く存在しないんだよね。
結局はカンマが入りうる箇所はデータを取得せずに、そのデータを使う個々の箇所でSQLを投げて取得せざるを得ない事に。
パフォーマンスが激しく悪いのはわかりきってるが、現状ではこれ以外に打破できる方法が無いんだからしょうがない。
しかも、この類の修正の影響範囲が広いこと広いこと。そもそもjarの中身が改変される事を想定してないだろうし。
このjarを使ってデータ取得をしている部分は片っ端から修正するハメになった。これは本気で疲れるぞ……。

ついでに、StringTokenizerのメモ。例えばこんなソースを作った。これってループ回数が同じに見えて違うのね。
データが取得できない際には何故か半角スペースに置き換えてる部分が数多くあったけど、これが原因なのか。

import java.util.*;
class testToken {
    public static void main(String[] args) {
        String sData = "1,2,3,4,5";
        String sData2 = "A,B,,,E";
        String sData3 = "a,b, , ,e";
        int i = 0;
        StringTokenizer stk = new StringTokenizer (sData, ",");
        while (stk.hasMoreTokens()){
            i++;
            String sTemp = stk.nextToken();
            System.out.println(i + " : " + sTemp);
        }
        System.out.println();
        i = 0;
        StringTokenizer stk2 = new StringTokenizer (sData2, ",");
        while (stk2.hasMoreTokens()){
            i++;
            String sTemp = stk2.nextToken();
            System.out.println(i + " : " + sTemp);
        }
        System.out.println();
        i = 0;
        StringTokenizer stk3 = new StringTokenizer (sData3, ",");
        while (stk3.hasMoreTokens()){
            i++;
            String sTemp = stk3.nextToken();
            System.out.println(i + " : " + sTemp);
        }
    }
}

sDataのwhileは5回ループしてくれますが、sData2のwhileは3回しかループしない。空データはトークンとして見ないのね。
sData3のように空白文字でもセットしてあれば、ちゃんと規定の回数だけ回ってくれる。恥ずかしながら知らんかったよ。
個々のクラスなんて全部の概要を覚えてらんないよなー。言われないと知らないことも多いし。要勉強って事ですかい。
ちなみに、最近になってJavaの良さがわかってきた気がする。ほんの少しだけどね。ってか、まだ使いこなせてないし。

帰りに立川に寄って、Zippoの石とオイルを購入。目薬も切れそうだったので、いつものように2つ買って帰ることに。
はぁ、明日からまた7時起きかよ。週末なのに体力を削られるとはこれ如何に。休む日と書いて休日じゃないのか。

2005/02/21 Mon.

土日で必死こいて何とかしたせいで、今日は比較的気楽に作業が出来た。やっぱり忙しいのは嫌なもんだな。
それは置いといて、何やら自分の好きな言語であるPerlを叩きまくる「Perlの食えない事情」を見つけた。
一通り目を通してみたが、何つーか先入観バリバリの文章だな。ネタとしてとらえて、突っ込みでもしていこうかな。

初心者に勧めるべき言語は他ならぬPHPなのである。
PHPはmod_phpを導入するだけで、コンパイルおよびエラーの表示などをやってくれるのだから。

全く以ってその通りだが、特定の手段を使わないとデバッグが出来ないというクソなPGを生み出しかねない。
もとからあるデバッガーを使って何が悪いと言われるかもしれないが、こういう連中は机上デバッグが出来ないのでは?

それにC、Javaをある程度深くやってきた私には

あぁ、お決まりのセリフが出てきました。説得力を増そうとしているんでしょうが、笑いの対象にしかならん。
そもそも、サーバーサイドと制御系の言語を同じ枠内に置いて話をしている時点で痛すぎると思うんだが。
ここには抜粋してないけどVBやってたとか書いてありますが、この人はVBが経歴にでもなると思ってるんだろうか?
あれだ、VBマクロ書いて初心者騙しで慢心している人の代表例でしょうか。書いてて惨めになりませんか?

奇妙な演算子の数々

Perlでの文字列比較演算子「eq」が変とか言ってます。しかも、この後ろでとんでもない事を書いている。

eqとつまり一般的なプログラミング言語の(==)にあたる

おいおい、こいつは本当にプログラミングやってんのか?JavaでString型を==で比較演算するつもりか?笑えますな。
後から文字列演算子と書いてフォローしているように見えるが、わざとまどろっこしい書き方してませんか?
文章能力の無さは自覚はしているようで。こういう書き方をしないと読者を誤魔化すことすらできないのでしょうね。

何を判定しているのか?というのを分かりやすく書くために使われているのだろうが、返って複雑化しているし、
そういうのはコメントでしっかり説明しておく方が有効ではないだろうか?

要するに、コメントで解説されていればソースで理解できなくてもいいということですか?
この人はコメントに100%依存しなければソースを読めないプログラマなんでしょうか。
「返って複雑化」とか言ってますが、言語の特徴を全て欠点としてしか見なせない哀れな頭脳の持ち主なんでしょうかね。

なぜ、こんな機能があるのに初期のPerlには参照やポインタといった機能が無かったのか?

こんな機能とは範囲演算子の「..」を指しています。ちなみにこの部分の書き方、すんげー汚いのな。
原文だと「なぜ、こんな機能があるのに初期のPerlには参照やポインタといった機能が無かったのか?」となっている。
おいおい、「初期の」ってところを太字部分からわざと抜かして誤解を与えようとしてるだろ。終わってるな。
しかも、同サイト内の「他の言語」のページを見て欲しい。一番下の部分にPerlについて触れてある。

初期バージョンはポインタが無かったり、オブジェクト指向が無かったりなどしていたが、
Perl5になってある程度これらの問題は解消された。

こっちにはしっかり書いてあるくせに、太字部分周辺の紛らわしい書き方は何なんですか?
ってか、最近でPerl5未満を使ってるのなんてほとんど見たことねぇから!リファレンスやポインタ使えますから!

置換演算子:s///
(PHPと比べて)どちらが簡単か?分かりやすいか?というのは人それぞれによるかもしれませんが、私はPHPです。

ちょっと待て、それってお前の主観以外の何物でもないだろ。主観丸出しでPerl叩きですか?必死君ですな。

自作関数宣言文:sub
サブ、なんか自分の作った関数を侮辱されているように感じるのは私だけでしょうか?

こいつにアホ認定書をくれてやる。関数だのfunctionだの叫んでるからそういう頭になってしまうんだ。哀れなヤツめ。
Perlにはサブルーチンって言葉があるんだよ、Subroutineって言葉が。何だか文章見てたら可哀想で涙出てきたぞ。
しかも、functionとかの言葉も出している割には、このページ内でサブルーチンという言葉を一切使ってないし。卑怯だな。

最後に・・・
昔の人はとても頑固モノである。

それってお前のことだろ。PHPがPerlよりも優れているという正当性をアピールしたいなら主観を混ぜるな。アホかと。

例えば「今の若いモンは鉛筆も削れんのか!」と嘆いた唄い文句が過大評価されました。
しかし、文明の発達は止まりません。シャープペンシルが出てきました。
そして彼らは口々に言うでしょう。「便利な時代になったもんだなぁ・・・」と。

執筆者は小学生か?最後の最後にあえて抽象的な書き方での論点のすり替えをしてまでの低脳証明お疲れ様です。

2005/02/22 Tue.

今日も比較的ゆったりとした作業で済んだ。とりあえず手を付けている機能はほとんど完成に近いところだろう。
しかし、何やら来週の28日までに新機能を追加してテストして本番環境に上げるとかいう話を小耳に挟んだりもしたが。
今週は取れるものなら有休を一日どこかで使いたいと思っていたんだが、結局無理になりそうな勢いだな。
ところで今日の作業で気になったんだけど、JavascriptでPOSTする際のパラメータの長さって限界はあるんだっけ?
現状では300バイトくらいだから全然気にすることも無いんだけど、他の機能でパラメータ長が問題になったとか。
勝手な予想だけど、多分2048バイトが4096バイトだと思う。調べ方が悪いのか、検索してもあまり出てこないし。
さて、おそらく明日からは画面の追加とかをやる事になるんだろう。うわ、どう見ても激しくメンドいっぽい。
それにしても、嫌だ嫌だと思っていたJavaもある程度は使えるようになってきたのかな。慣れは重要です。
PerlとかもOOPはできるけど、やっぱり言語そのものがOOで作られている方が当然OOPしやすいよな。
とりあえずは、多少落ち着いている時間がある時にでも体力を回復しておかなければ。先週はキツかったからなー。

2005/02/23 Wed.

もうやってらんねぇよ。後から後から聞いてない話が来るし。画面追加が今日までなんて一言も聞いてませんが?
そんなにメンドい作業じゃないけどさ、こっちにもペース配分って問題があんのよ。その辺わかってんのかよ。
そもそも、グラフ生成やら修正したjarファイルとかの適用っていつになるんだ。ってかリリース予定表はないのか?
いい加減にアホらしくなってきた。何が悲しくて定時後になってから新規の開発を始めなければならないんだ。

最近はPCハードウェア情報からすっかり遠ざかっていたけど、久々にあれこれニュース見てみたらすごいのな。
Pentium 4も今年中には4GHzと突破するんだろうか。むしろクロック数よりも消費電力とファンが気になるところだが。
現在最高クロックはPentium 4で3.6GHz、Extreme Editionの方だと3.73GHzを達成。2GHzで喜んでたのが懐かしいな。
そもそもこのクラスのCPUはハイエンドコンシューマー向けなんだろうけど、それでもやっぱり欲しくなってしまうって。
今のマシンでも画像処理はもたつく時もあるし、メモリとCPUはどれだけ早くしても早くしすぎることはないだろう。
そろそろ新マシン購入も考えて、また「週刊アスキー」でも読み出そうかな。あれ読まないと業界ネタに遅れ気味になるし。

2005/02/24 Thu.

さっさと楽になりてぇ……。今の機能と関連する他の機能の担当者と相談しようと思ってたのに、よりによって休みかい。
さらにグラフの表示形式をああしろこうしろと、一体何パターンのサンプルを提出して差し上げれば気がお済になられますか?
おかげで、思うように進捗が進まない。次に控えている修正も、見るからに工数がかかりまくるってわかってるしなぁ。
DBのテーブル変更とかはJSPもjarにも色々と影響出てきそうだし。大掛かりな部分には極力手を付けたくないんだがな。

ウチの新聞は朝日でも読売でも毎日でもなく微妙にローカル新聞なのですが、夕刊に非常に面白い記事が載っていました。

外国人犯罪最多4万7124件

まぁ相変わらず多いってことは見て取れますが、そんなことよりも次に書かれているサブタイトルの方が気になるワケで。

中国人、全体の36%

なぁ、やっぱり中華ごときの存在価値なんか無いって。調子こいたツラして日本に出稼ぎに来て地下銀行でも利用ですか。
ちなみにソースは「ここ」です。ウチが取っているのは「東京新聞」なのです。朝日と毎日は、一家揃って文章が嫌いなのだ。
「キャッシュカードやクレジットカードの偽造にかかわる犯罪の摘発件数の八割は中国人によるものだった」らしいし。
しかも摘発人数で言えば、中華に次ぐ二番目は半島国家らしい。もうね、お前らアジア圏から消え去れと。用無しだと。
いわゆる犯罪誘発人種なので、彼らが「IKEMEN JAPAN」を信用してしまう頭の弱さを持ち合わせてるのも許してやりましょう。
「IKEMEN JAPAN」を知らない人は「成城トランスカレッジ!」の「ここ」のページを参照。ったく、民度の低い人民どもは……。

2005/02/25 Fri.

何とかして午前中に修正版のをリリース。久々に朝イチから頭をフル回転させてたよ。あー、午前中だけで疲労困憊。
午後からは今回の修正で動かなくなっている部分を改造する作業に。別にバグでも何でもなく、そうなるのはわかってた。
それにしても、DBのテーブル変更に対応させるってのは随分とメンドいものだな。jarに渡すハッシュの構造が全く違うし。
しかも何十種類ものカンマ区切りのデータがン百行とかで返ってくるから、StringTokenizer使いまくりでワケわからん。
区切り文字もやたらと多いし。「|」なのか「,」なのか「$」なのか「?」なのか……。データ構造がわかりにくいです。

後輩の一人が引っ越しをしたとのメールが来た。4月から就職するはずだが、どこに引っ越したのかと訊くと浜田山らしい。
勤務地はどこだっけと訊くと、横浜だとか答えてるし。ってかさ、井の頭沿線に住んで横浜勤務って遠くないのか?
それにしても妙な時期に引っ越しをするものだ。あれか、3月とかになるといい物件の確保が難しくなってくるんだろうか。
どうやら12畳の1Kが管理費・水道代込みで75,000円らしい。バスとトイレは別。高いのか安いのか妥当なのか微妙です。
あまり知られていない話だけど、井の頭線って関東の私鉄の中で最初に冷暖房率100%を達成した路線だったりします。

2005/02/26 Sat.

久々に昼の14時まで寝られた。そっかー、昼過ぎに起きたのは二週間ぶりなのか。我ながら先週から今週はよく耐えた。
それでも昨日は寝たのが朝の5時だったりする。休日の前の日になると寝られなくなるのは何とかならないものだろうか。
とりあえずまともに熟睡できたので、それなりに気力も回復。やっぱり睡眠はちゃんと取らないと倒れそうになるな。
で、今日は何をしたかといえば何もしないで一日中家でゴロゴロしてただけだったり。外へ出る気力までは無いっす。

そういえば、配布CGIの中に微妙なバグを見つけてしまった。おかしいな、何故か知らんが以前は使えてた機能なのに。
しかも、今回も原因不明ときたモンだ。ソースを見ても何がおかしいのかがわからん。テストはしてるんだけどなぁ。
それほど頻繁に使う機能ではないので支障は少ないだろうけど、やっぱりバグがあるバージョンを配布するのはアレかと。
時間があったら色々と直したい部分もあるんだけど、Perlは集中してやらないと適当なコーディングになりそうな気もする。
それにしても、Javaとは全く違うため慣れるまでまた時間食うんだろうけど。OOPを導入してみるってのもいいかもしれない。
そもそもほとんどがグローバル変数で使っているため、ソースを遡る際に途中でワケわからなくなってくるんだよな。
ある程度OOPの概念がつかめたところで切り替えていかないと、この冗長なコーディングのスタイルからは脱却できないし。
まぁ立川に帰ってもし暇な時間ができたら、その時には色々と考えてみよう。あー、でもやっぱりバグ取りメンドくせぇ。