エンジニアが発信する【2006年04月】の記事です

エンジニアが作る最新ITブログ トップ>【2006年04月】

2006年04月29日

自分の作ったソフトとか紹介 - 松のページブログ - 楽天ブログ(Blog)

とりあえず、まずは自分の作ってるフリーソフトの紹介から。

あまのいわと 5 IMPERIAL GODDESS II
 データベース操作ツール(SQL実行ツール・SQL入力支援機能付き)です。
 同じような類のソフトウェアはいくつかあるかと思いますが、とりあえずこのソフトの一番の売りは、「SQL入力支援機能」です。一応、サブクエリーも解析してコード補完を行います。
 あまりにキッタナイのでソースコードは非公開です。

Ignis interpreter
 ECMAscript…おそらくJAVAscriptと言った方が通りがいいですね。Javaで書かれたインタプリタの実装です。Javaで開発されたアプリケーションに組み込むことを前提として書かれています。
 気合い入れて作った割にはあまり使い道がないかも?(言っちゃだめだ)
 ソースコードが公開されています。

プリウス・ドライビング・シミュレータ
 愛車(だった)プリウスの動力機構の説明です。Javaアプレットなのでホームページ開いて見るのが一般的な使い方となりますが、ダウンロードして実行することもできます。
 ソースコードが公開されています。

まあ、気が向けば見てやってください。 

2006年04月23日

受け取ってくれないと、いつまでも終わらないということについて

先週、不可解な現象に遭遇した。大阪の話なので、すべて電話越しの情報だが、まとめると以下の感じになる。

本番機では異常に遅い、というか速度にムラがある。あるページを開くのに5sくらいかかる。同じことを開発機でやると1s以内で返ってくる。
手で投げると速い。アプリ(API)から投げると遅い。
レスポンスのサイズが大きいと遅い、小さいと速い。
開発機でサイズが大きいものを作っても、遅くならない。
CPUの負荷はない。ディスクIOもほとんどない。

そもそも構成として、[ブラウザ]→[Apache→APPサーバー]→[Apache→SOAPサーバー]→[Apache→DBサーバー]となっていて、APPサーバーとSOAPサーバーが同じ筐体で、それ以外は別々となっている(3台)。

さらにややこしいのが、本番機はAPPサーバー(+SOAPサーバー)がクラスタしており、DBサーバーも別にクラスタしている。開発機はすべてAPPサーバーとDBサーバーが同じ筐体になっている。

とりあえず、APPサーバー→SOAPサーバーは、別のAPPアプリで再現した。

次に、APPアプリとDB側ApacheとDBサーバーでログを取ったら、すべてにおいて処理時間が4sくらいかかっていた。

となると、DBサーバーの問題じゃないのか?って誰でも思うわけで、とにかくあらゆることを調べたが、何も手がかりがなかった。そもそもデータを同じにしても、再現がまったくできない。

・・・

どーにもならない状態で3日が過ぎたのだが、ふと、クライアントがデータを受け取らなかったら、サーバーはデータを返せないのではないかと考えた。つまり、可能性として、サーバー側のレスポンスデータは一瞬で作れているが、クライアントが受け取らない or ネットワークが流れないときに、処理時間は長くなるのでは・・と。

すると、CPU負荷もディスクIOも説明が付く。ネットワークの要求待ちなのだから。

・・・

で、突破口となったのが、パフォーマンスモニターでネットワークのデータ送受信量を見ていたら、本番機では1度にデータを返さずに、波を打っているらしい。つまり、1MBを返すのに、300KBづつ3回の波があるみたいな感じ。開発機では1MB分を一気に返している。

というわけで、DBサーバーを切り分けるため、Apacheに数MBのファイルを置いてもらって、そのファイルをブラウザからダウンロードしてもらった。それだけで、上記の現象が再現できたので、アプリやDBが原因でない! と言ってみた。

・・・

でも、アプリとDBサーバーのログで処理時間が4sと出ていると、やはりDBサーバー側を疑ってしまうわな。Apache内で一気にバッファリングしているのならば、また話は異なるのだが。まぁDBサーバー側のApacheのソースは持っていないので、来週になってひっくり返される可能性もあるのですけど・・。あぁ、来週でなんとかならんと、GW連休がなくなるな・・。



2006年04月21日

オブジェクトブラウザで閲覧不可?

エディションにもよるのかもしれないが、私の手元にあるVisual Studio.net 2003 ではオフィス用コンポーネントを作成することができる。
また、Office2000 Developerに付いて来るデベロッパーツールでも作成可能である(XPも。2003からは別ツールになったが未入手)。


両方でテストプログラムを作ってみた。

後者のほうは問題は問題がなかったが、前者の方はオブジェクトブラウザで中身が見れなかった。

何か設定等あるのだろうか?今後調査を進めたいところである。


2006年04月20日

Openoffice.orgのマクロ

業務多忙につき今は関わっていないが、その昔、Openoffice.orgに携わったことがある。


当時はVBAライクなマクロであったので解説サイトでも作ろうかなと思っていたことがある。

現在、2.xになって、「VBAとは違うもの」になっているのか、互換性はないらしい。


いずれこちらも攻めていければ、とは思っている。

2006年04月20日

テストケースその2〜匿名クラス

引き続きテストケースを作った。今度は、前回よりも単純なケース。

リストを取得するメソッドと件数を取得するメソッドがあるのですが、リストのサイズと件数を比較することでチェックができる。まぁ内部のことを言えば同じクエリになるのだが、一応API的には別メソッドなので・・。

抽象クラスの抽象メソッドは2つ。

protected abstract List getList();
protected abstract int getCount();

これを使って抽象的なテストケースを書くとこんな感じ。

List list = getList();
assertNotNull(list);
int cnt = getCount();
assertEquals(list.size(), cnt);

さて、この抽象クラスを継承して、各実装クラスを作っていけばいいのだが、数が多くて面倒。なので、匿名クラスにした。つまりテストメソッドはこんな感じ。

public void testProject() {
new BaseCountTest() {
protected List getList() {
return api.getAllProjectList();
}
protected int getCount() {
return api.getAllProjectCount();
}
}.doCount();
}

こんなメソッドがずらずら並んでいる感じです。

で、件数を表示してみると、0件だったりする。ということは、insertの抽象メソッドも定義してやって、抽象クラスのテストメソッドに1件追加するコードを入れてやれば、テストするたびにすべての種類が1件づつ増えていくみたいな感じになる。

まぁinsertをそれぞれに実装していく手間はあるけど、テストのバリエーションを後から抽象クラスに追加するだけで、全実装のテストにすぐ反映できるのはなかなかと思ったりする。

つまり、テストを追加したときに、突然部分的にassertが出たりするのだが、それを特殊なケースだということでテストケースを変えてしまうのではなく、そもそも仕様に細かい矛盾があるという観点でまず調整してから、テストケースを変えるようにすれば改善となっていくのでは・・。まぁ最初から完璧な仕様で設計や実装するなんて無理な話だしね。

※実はListクラスでなかったりしますが、まぁ雰囲気は同じということで・・。


2006年04月19日

Primary Keyの取得

中野です。

SQL文でテーブルのPrimary Keyを取得する方法です。

?SQLServerの場合
SELECT COL.name AS COL_NAME
FROM sysindexkeys IK, sysobjects O, syscolumns COL,
(SELECT I.id, I.indid, I.status FROM sysindexes I WHERE (I.status & 2048)<>0) V_PR
WHERE IK.id = O.id
AND IK.id = COL.id
AND IK.colid = COL.colid
AND IK.id = V_PR.id
AND IK.indid = V_PR.indid
AND O.name = 'テーブル名'
ORDER BY IK.id, IK.indid, IK.keyno


?Oracleの場合
SELECT B.COLUMN_NAME AS COL_NAME
FROM USER_CONSTRAINTS A, USER_CONS_COLUMNS B
WHERE B.TABLE_NAME = A.TABLE_NAME(+)
AND B.CONSTRAINT_NAME = A.CONSTRAINT_NAME(+)
AND B.TABLE_NAME = 'テーブル名'
AND A.CONSTRAINT_TYPE = 'P'


これで"COL_NAME"にフィールド名が入ってきます。


エンジニアが作る最新ITブログ トップ>【2006年04月】

メンバー紹介

タグパネル

ランキング

エンジニアが作る最新ITブログ DODA