8/31(Sat)
/** ちょっとPostgreSQL */ cygwin1.3.12_4 + Postgres7.2.1 + J2SE1.4で実験した結果、 ネイティブのJDBCドライバで、日本語のデータをハンドリングするのは、 無理なのではないかという結論に達しました。 もしかしたら、WindowsのShift_JIS(正確にはMS932?)と、cygwinのEUC-JPの、 日本語エンコーディングの違いを、ネイティブのJDBCドライバが 吸収し切れていないのかもしれません。 なので、将来的には解決する可能性があるような気もします。 逆に、ブリッジはその辺を解決しているので、問題が出ないのかも。 なんにしても、cygwinは日本語に弱すぎ(T_T) タダなものに、ケチ付けてもしょうがないんですが... ■OKだったこと ・JDBC-ODBCブリッジで接続すると、支障無く日本語を扱える。(これが現実解っぽいです。) → Linuxでは、ブリッジ使えなさそうだけど、どうしよう(T_T) ・拡張子sqlのファイルに日本語を含んだSQLを書き、EUCに変換した後、psqlで投入すると正しく実行できる。 ・上記データを、以下の形式で取り出すと、ネイティブのJDBCドライバ(pgjdbc2.jar)で正しく取り出せる。 System.out.println(new String(rs.getBytes(1), "EUC-JP")); ■ダメだったこと ・ネイティブのJDBCドライバ(pgjdbc2.jar)経由で、日本語データをINSERTできませんでした。 [実験1] 日本語文字列を"SJIS"でbyte列に分解した後、"EUC-JP"で文字列を組み立て、SQL文にセット [実験2] 日本語文字列を"SJIS"でbyte列に分解した後、"8859_1"で文字列を組み立て、SQL文にセット [実験3] 1) CREATE DATABASE xxx WITH encoding = 'EUC_JP'でデータベース作成 2) ネイティブのJDBCドライバ経由で、"set client_encoding to 'SJIS'"を実行 3) ネイティブのJDBCドライバ経由で、日本語データを含むINSERT文を実行8/30(Fri)
/** java.lang.IncompatibleClassChangeError */ このエラー初めて見ました。 APIドキュメントを読むと、 クラス定義に互換性のない変更があった場合にスローされます。 現在実行中のメソッドが依存しているクラスの定義が、実行開始後に変更されています。 のように書いてあります。 どうやら、JBossのホットディプロイの制限らしく、 前バージョンで、staticメソッドだったものが、 次のバージョンで、同じシグネチャのメソッドが、 static無しのものに変わったことが影響したようです。 とりあえず、staticメソッドに戻して、 ・${JBOSS_DIST}/catalina/work/ ・${JBOSS_DIST}/jboss/tmp 以下のファイルを削除して、JBossを再起動したら直りました。 staticの有り無しが変わっただけでは、 ReDeployの対象にならないのは、ちょっと問題かも知れませんね。8/29(Thu)
/** cygwin環境でのclasspathオプションの使い方 */ javaコマンドのクラスパス区切り文字は、 「:」でも「;」でもなく、「\;」のようです。 すっげぇ微妙。 /** ちょっとPostgreSQL */ 日本語環境に問題アリです(T_T) どうやら、日本語のテーブル名とか、項目名を使うには、 \"日本語の識別子\" のように、エスケープされたダブルクォートでくくらないと、 PostgreSQLのSQLパーサが正しく認識できないようです。 う〜ん。やられた。 1テーブル1クラスで作っているので、 上の方法で回避しようと思ったら、 全テーブル分、Access用とPostgreSQL用を作らなきゃならなくなるので、 非常にめんどうかつ、現実的じゃないです(T_T) なので、テーブル名、項目名から日本語を排除し、 全部アルファベットで構成するようにした方が、 コーディング上は、はるかにラクでしょう。 ちなみにpsqlでは、普通に日本語入力して使えてるので、 JDBCドライバに問題があるんでしょうかねぇ。 とりあえず、PostgreSQLは、JDBC経由の日本語環境に難アリと言わざるを得ません。8/27(Tue)
/** JDBCの裏技? */ っていうほどでもないですが(^^; Accessで、日付をWHEREの条件に設定する場合は、 "WHERE date_field = #2002/08/27#" のように書きます。 ところが、これでは当然Accessに依存してしまい、 このSQL文(の一部)は、Access以外のデータベースでは動作しません。 そこで出てくるのが、データベース非依存な書き方です。 具体的には、 "WHERE date_field = {d '2002-08-27'}" と書きます。 こうすることで、JDBCドライバが、データベース固有な表現 (Accessなら、「WHERE date_field = #8/27/2002#」) に書き換えてくれます。 ちなみに、Connection#nativeSQLを使用することで、 データベース非依存な表現から、データベース固有な表現を取得することができます。 変数を与えたい場合は、 SimpleDateFomrat dtFormat = new SimpleDateFormat("{'d' ''yyyy-MM-dd''}"); "WHERE date_field = " + dtFormat.format(new Date()); などとすれば良いでしょう。 もっとも、PreparedStatementが使える場面であれば、 "WHERE date_field = ?" としておいて、 setDateや、setTimestampで値をセットするところでしょう。 /** Log4jなんてこった(T_T) */ 以前から使っていた、Log4j用ラッパクラスが、 Log4j 1.2.5になった途端、Deplicatedが出たので、 Log4j 1.2.5用に書き直しました。 (Categoryの代わりに、Loggerとかいうのを使うようになったらしい。) が、JBossでそのラッパクラスを使おうと思ったら、 NoClassDefFoundError: org/apache/log4j/Logger が発生... どうやら、JBossに付いてくるLog4jは古いやつらしい。 んじゃあ、置き換えちまえばいいんじゃないの? とか単純に考えるも、JBossのコンソールログに使われているらしく、 見事にJBossが起動しなくなりました(T_T) 当然、混在という危ない状況も、見事にコケて、 結局、Log4j 1.2.5用に書き直したラッパクラスは、 JBoss上で使えないという結果に... 新しけりゃいいってもんじゃないね(-_-; つーか、バージョン間のギャップを埋められない、ラッパクラスがショボいだけ!?8/26(Mon)
/** 鶴見川さんざんだよ...(T_T) */ タマちゃんが再び現れたとかいうウワサの鶴見川ですが、 今朝のとくダネ!で、多摩川との水質比較とかされた上、 「タマちゃんが皮膚病になったり、目が痛くなったりするかも。」 などと言われて、さんざんでした(T_T) つーか、なんでアザラシでフィーバー!? /** ちょっとPostgreSQL */ おんなじ名前のユーザ定義関数を作って、呼んでみると、 こんなエラーがでて、PostgreSQLのサーバが落ちてしまうようです。 (もしかしたら、cygwin + PostgreSQLの環境だけかも。) IpcMemoryCreate: shmget(key=5432001, size=1441792, 03600) failed: Not enough core This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory or swap space. To reduce the request size (currently 1441792 bytes), reduce PostgreSQL's shared_buffers parameter (currently 64) and/or its max_connections parameter (currently 32). The PostgreSQL Administrator's Guide contains more information about shared memory configuration. さらに、「--」を行頭に付けて、コメントアウトしても、 コンパイル対象になるらしく、うまくユーザ定義関数が登録できません(T_T) ちょっと、それってショボくない〜?(+_+; /** ちょっとPostgreSQL */ age関数もどきを作ってみました。 それぞれ、日、週、月の間隔を返します。 わざわざユーザ定義関数にしなくても、よさそうな感じですが、 SQLの可読性を考えれば、やる価値は(きっと)あるでしょう(^^; /* 二つのtimestampの日の差を返す関数 */ CREATE OR REPLACE FUNCTION diffDate (timestamp, timestamp) RETURNS INTEGER AS ' DECLARE date1 alias for $1; date2 alias for $2; BEGIN RETURN (extract(epoch from date1) - extract(epoch from date2)) / 60 / 60 / 24; END; ' LANGUAGE 'plpgsql'; /* 二つのtimestampの週の差を返す関数 */ CREATE OR REPLACE FUNCTION diffWeek (timestamp, timestamp) RETURNS INTEGER AS ' DECLARE date1 alias for $1; date2 alias for $2; BEGIN RETURN diffDate(date1, date2) / 7; END; ' LANGUAGE 'plpgsql'; /* 二つのtimestampの月の差を返す関数 */ CREATE OR REPLACE FUNCTION diffMonth (timestamp, timestamp) RETURNS INTEGER AS ' DECLARE date1 alias for $1; date2 alias for $2; BEGIN return date_part(''year'', age(date1, date2)) * 12 + date_part(''month'', age(date1, date2)); END; ' LANGUAGE 'plpgsql';8/25(Sun)
/** 昨日の中華屋 */ ランチセットで、いかとえびの野菜炒めなるものを食したのですが、 基本的に野菜嫌いな僕にとって、それが小松菜だか、チンゲン菜だか、 区別がつかないもので埋め尽くされ、もう最悪でした(T_T) まあ、そのメインに加え、 ・ごはん ・スープ ・ザーサイ ・杏仁豆腐 のセットで630円なので、まあ、文句は言えないでしょう。 でも、職場近所の中華屋の方がおいしいので、 もう行かないかも。 /** 今日のそば屋 */ あいかわらず、カツ丼とざるそばのセットを頼んでみました。 ざるそばは、きしめんみたいに平べったい麺で、 なかなかおいしかったのですが、 カツ丼は、僕のきらいな甘めの味付けで、いまいちでした(T_T) さらにヤバイのが、カツ焦げて黒くなってました... やっぱり、もう行かないかも。 /** ちょっとPostgreSQL */ age関数で、二つの日付の差を取って、'xx years xx mons xx days' のような形式(intervalという形式らしい)で取得でき、 date_partで、それぞれのフィールドを取得できます。 例えば、 select date_part('day', age(field1)); select date_part('month', age(field1)); select date_part('year', age(field1)); のように。 ところが、あくまで各フィールドの値を取得するだけで、 僕が期待する、日数の差を取得することはできません。 (1年だったら365とか、366とか返してくる機能) 幸い、PostgreSQLには、SQLServerと違って、 ユーザ定義関数を作成できる機能があるので、 age関数の別の実装を作ることになりそうです。 (Accessでいう、DiffDate('d', ...)とか、DiffDate('w', ...)とか、DiffDate('m', ...)とか。) // 1ヶ月以内で収まっている場合に限り、下記SQLで実現できるのだが...の例 // 2002/08/01を基点として、日数差ごとの件数を求めるSQL。 taka=# select * from test; aaa ------------ 2002-08-01 2002-08-02 2002-08-03 (3 rows) taka=# select taka-# date_part('day', age(aaa, '2002/08/01')), taka-# count(*) taka-# from taka-# test taka-# group by taka-# date_part('day', age(aaa, '2002/08/01')) taka-# ; date_part | count -----------+------- 0 | 1 1 | 1 2 | 1 (3 rows) taka=# /** ちょっとPostgreSQL */ 早速ユーザ定義関数を作ってみるべく、 サンプルをコピペして、実行してみると、 Unrecognized language specified in a CREATE FUNCTION: 'plpgsql'. というエラーメッセージが出力されました(T_T) なんでやねんなとか思いつつ、googleで調べてみると、 こんなところに、同じ症状を訴える人がいたりして、 ちゃんとフォローを付けてるエラい人もいました。 というわけで、 createlang plpgsql db_name としてみると、無事にplpgsqlが有効になったのでした(^^) で、サンプルの関数を消そうと思って、SQLServerの感覚で、 DROP FUNCTION add_one としてみるも、 ERROR: parser: parse error at or near "" と出て、消せず(T_T) やっぱり、なんでやねんなとか思いつつ、マニュアルをよく読んでみると、 Examples This command removes the square root function: DROP FUNCTION sqrt(integer); とか書いてありました。 なんと、引数の型まで書いてありました。 これは、オブジェクト指向でいう、オーバロードができることを意味してるんでしょうか!? なにはともあれ、 DROP FUNCTION add_one(integer); で、無事消せたのでした。 先が思いやられるわ〜(T_T)8/24(Sat)
/** 忙しいっぽい */ ネットワーク試験対策&会社の昇格試験対策で、これから忙殺されるかも... /** 北風と太陽ゲット! */ 川崎のTOWER RECORDSに行って買ってきました(^^) なかなか、店員さんの感じもよく、いい店でした。 でも、店舗の広さ的には、柏の新星堂の方が大きいですけどね(^^; 既に、Lost Generationの録画によって、完全バージョンを持ってたので、 ある意味、カップリング曲を買ったようなもんです(^^; でも、YeLLOW Generationの違った面も見えて、良いような気がします。 /** 四代目マウス購入 */ Windows98で使ってたマウスが、WindowsXPでは何故か、 スクロールが逆になるという不具合あったので、 この機にボールマウス(というらしい)から、光学式マウスにしました。 これで、逆転ホイールさばき&掃除から開放されるでしょう(^^) モノは、ELECOMのM-FGUP2RCRというやつです。 ELECOMのホームページ ところがところが。 このマウスにも、やっぱり不具合がありました。 それは、同時押しを正しく認識できないことです。 そう。 マインスイーパをやるときに、とっても困るのです(T_T) 実は、右ボタンを押してから、左ボタンを押すようにすれば、 同時押しとして認識するようですが、 僕には、そんな器用なマネはできそうにありません。 このマウスドライバは、 Microsoftが提供している、HID 準拠マウスというものらしいのですが、 このドライバの出来が悪いのか、マウスがHIDとかいう規格に準拠していないのでしょう。 まあ、マインスイーパやらないだけだから、さほど問題でもないか...8/23(Fri)
/** イエジェネのミュージックステーションデビュー! */ ミュージックステーションを見てしまいました... Yellow Generationは、フルバージョンをCDでね♪ (^^; /** Access */ 今回のプロジェクトでは、SQLServer以外に、 Accessも若干使う必要があったのですが、 このドキュメント整理週間に、Accessオブジェクトの一覧を資料にして欲しい などという要求があったため、mdbを読み込んでExcelにオブジェクト一覧をまとめる というツールを作ってみました。(ワケあって、公開はまだできません...) でも、このテのツールって、どっかに落ちてるんじゃないの? と思い、Vectorで調べてみると、Access97用が多いようで、 Access2000/XP用は無いみたいです。 でもって、適当なキーワードでgoogleを調べてみると、 こんなのが引っかかりました。 「プロが」とかいう辺り、若干引っかかりますが、 書評もよく、それなりに使える本なのではないかと思います。 実際引っ掛けたのはこっち (googleのキャッシュ) で、僕の思い込みなのかも知れませんが、 VBな人って、フォーム好きじゃないですか?? 上の本にしても、 「オブジェクト一覧をExcelに出力するフォームを作成するには」 だし。 なんで、めんどくさいのに、わざわざ作るんだろう...8/22(Thu)
/** ムカツク */ 今日のU21日本 vs 中国の放送で、実況してた人、 「かえし」だの、「リフレクション」だの、 意味わかんねぇ用語使いまくりで、めっちゃ腹立つわ(-_-; 実況全体的にも、ちっとも面白くないので、 やめて欲しいです。。 /** 目指せ! こりずにテクニカルエンジニア(ネットワーク)!! */ 事例解析に載ってた、去年の問題をやってみたところ、 「携帯電話でWebサーバにアクセスする場合、コンテンツを50%に減らすGWを介して...」 という条件を見落として、見事に不正解になっちまいました(>_<; つーか、去年の本番の時にも、おんなじミスしたような気が... 学習能力なしなしですな...しょぼーん(T_T)8/21(Wed)
/** 「北風と太陽」発売! */ オリコンのDaily Rankingで、9位にランクインしたようです。 さすがに、hitomiには勝てなかったかー(>_<; でも、SLTの佐藤竹善には勝ってる(^^; イキオイってやつですかねー。 Weekly Rankingはどうなることやら。 どうでもいいけど、Daily Rankingの、チン☆パラって何??? これか? 多分、つのだ☆ひろのパクりだと思う... /** 目指せ! こりずにテクニカルエンジニア(ネットワーク)!! */ itecのCIRの説明は微妙です... itecの事例解析には、 「網が正常な状態の時に保証される情報転送速度」とあり、 別の本(iStudyがついてるやつ → あんまり使えないっぽい(T_T))には、 「網が輻輳状態になってスループットが低下したときにも、保証できる最低のスループット値」 とあります。 普通の人ならきっと、 「正常な状態 ≠ 輻輳状態」 と考えて、上の二つの説明は、矛盾している! と感じることでしょう。 ところが、itecのネットワーク技術を読むと、 「フレームリレー網が正常な状態、例えば、輻輳時も含め、 フレームリレー交換機が正常に動作する範囲においては、 ユーザが使用できる情報転送速度は、CIR以上、アクセス回線速度以下となる」 だそうです。 つまり、 「正常な状態 ⊃ 輻輳状態」で、 「異常な状態 ⊃ フレームリレー交換機が壊れた時」 という解釈になります。 つーか、3年もやってて、この程度の事に気づかないなんて...(T_T)