2008年07月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31





継続ビルド [2008年07月15日(火)]

継続ビルド環境を構築しています。

CruiseContorolという Javaのプロダクトを採用しています。
Javaに特化しているのでAntとかJunitとかが前提になっているところが
多いのですが、C++とかでもまあ使えます。

そのまま、サイトからダウンロードしても、そのまま動きます。
Daemonでプロセスが起動して、ソース版管理システムから最新版を取得して、
Build、テストを実行してくれるなかなか、ステキな仕組みです。

まあ、Antが前提だったりするのですが。
しかも、内部にJettyが組み込まれているので、Webサービスで状況が確認できる優れものです。

イントラ内で素で使用するだけなら、特に何も設定しなくても動くのですが、
Webサービスへの認証追加とか、ネットワーク経由でのコントロールとか
いろいろ機能を追加しようと思うと、結構めんどくさかったりします。

まあ、いろいろ弄ってみるとJava特化なので、.NetのためのCRUSICONTROL.NETとか、Ruby用のCRUISECONTROL.rbyとかが作られることに納得できます。

携帯 [2008年06月28日(土)]

携帯のブラウザーでサイトを見たとき、AuとSBは、
サイトに自分のIDが必ず通知される仕様になってます。

まあ、設定であえてOFFにすれば、通知されなくなりますが、
基本どんなサイトに対しても、IDが通知されます。
ちなみに、Auの場合IDは電話番号そのものでした。

で、DoCoMoの場合は、公式サイトで、ある特定の条件を満たすときだけ、
(GETパラメータに uid=XXXXXXXXXXXX が条件)
サイトにIDが通知される仕組みでした。

そのため、勝手サイトでは端末を特定するIDを自動で取得できなくなっていました。
一応、utnと言うキーワードを<A>につければ、確認ダイアログがでて、UTNやFORMAカード番号を送るかどうか確認する仕組みになっているけど
拒否できるし、送信されるのはその1回のリクエストだけ、

と言うわけで、使う側にするとサイトに自分の足跡が残らない、非常にすばらしいけど、サイトを作る側としては面倒な仕組みでした。

ですが、ついこの間の仕様変更で、公式サイト以外でも、GETパラメータに
特定のパラメータをつければ、公式サイトのIDとは別だけど、
個人に割り当てられたIDが残る仕組みになりました。

まあ、サービスインと同時に、即効で絶対送信しない設定にしたけど

ちなみに、昔はvodafoneでしたけど、そのときもID非通知設定でした。

オフショア開発 [2008年06月13日(金)]

プログラムの仕事を長くしていると、日本では要件定義と基本設計だけして、
詳細設計とコーディングはオフショアって経験をそれなりにします。

初めての、オフショア開発の経験は、就職して半年、インドで開発されたソース
要求仕様に対して、IN/OUTが正しく動作するんだけど、
テクニックを駆使してすっごくコンパクトにまとめられているため、
アルゴリズムが当時は、解析できなかった。
で、仕様追加が着たけど、元ソースを弄れない。
全部コメントアウトして、一から作り直しました。
その直後に、仕様追加が取り消された
まあ、最後にはまた仕様追加で修正分は、必要になったからよかったけど

で、最近は、中国をオフショアで使ってます。
確かに、要求仕様は満たしているけど、パフォーマンスをちっとも意識していないので、
実環境で一寸負荷が高くなると駄目駄目に、
JavaとかC#を使っているのに、継承を使わない、コピペの嵐。
数千ステップの関数はざら。
DBのトランザクションは理解していないし。
酷いものです。

いろいろと、情報を集めると、そこはもっとレベルが高いんだけど、
値段をケチってるから、質の低いのや新人がまわされてるし、
手を抜かれているって。

そんな状況なのに、基本設計からオフショアに丸投げするから、
日本側で内部が全然わかんなくて、いろいろ問題に。

で、日本で、フレームワークとライブラリを実開発までして、基本設計までは
きちんとするって、1回言ったのに、

実際やったら、コストがかかりすぎたから、障害対応や調査含めて
丸投げしますって orz

こんな調子だから、日本は駄目になるんだなー

ローカル変数 [2008年05月22日(木)]

Javaの場合、クラスの=演算は基本的にポインタの代入。

だから クラスのプライベート変数を外から参照するための、
Geter関数って、内部のプライベート変数のポインターそのものが、
外部に引き渡される。

って、それってスコープ崩れてないか?

折角、内部に隠蔽してるのに外部からオブジェクトに触れるのは
言語設計的に間違ってると思う。

で、実際に String型で考えてみた。

クラスのGeterで内部変数のStringを受ける。
これは、確かに内部で隠蔽されているStringと同じポインター
で、ここでString オブジェクトの内部のバッファーを弄れば
隠蔽されているはずのオブジェクトを外部から変更できる!!

って 思ったけど String型に内部バッファを弄るIFが無い

Geterで受けたString型に別の文字列をセットすると、
ポインターが入れ替わるだけで、バッファには影響が無い。
String型に実装されている文字列操作関数は、バッファの文字列を操作した
新しい文字列を返す関数で、内部のバッファを変更しない。

そうか、String型や、Integer型とかってだからスコープが維持されるんだ


って、じゃあ オブジェクトの内部の値を直接変更できるSeter持ったクラスだったらどうなるだ

変更できるね、やっぱり崩れてる

オフショアのレベル [2008年05月13日(火)]

今、お客さんのシステム開発って言うか保守してます。
で対象が、商品管理システムで、オフショアで 10億人の国に出した管理ツールに
不足分の機能追加をしています。

で、新規追加機能する画面で、商品IDを入力するので、
商品IDの存在チェックのため、商品IDから商品情報を取得する既存のクラスの商品ID取得用のDAOクラスを使うことにしました。
で、そのクラスの商品IDで商品情報を取得するメソッドを見たら何故か
update文が2つも実行されている。
商品の販売期間が管理ツールで扱える範囲外だったら
範囲内に開始期間と、終了期間をそれぞれ更新するupdate文が
しかも、where句には、販売期間のみ、そう、商品テーブルすべてに対して
updateを実行するSQLが二つも実行する

orz 欝だ こいつらパフォーマンスって物を意識しないのか?
普通、商品情報を取得してクラスにセットするときに、
範囲内に置き換えるんだろ、
で、商品情報の登録や更新で範囲外だったらエラーにするか
強制的にシステムの開始日か終了日に置き換えて登録するってのが基本でしょ。

別のシステムで SQLの効率が悪いので、SQLを分割の修正させたら。
SQL分割時に、DBとのコネクションすら分けたとの話も、
しかも、更新系 普通 1SQLを 複数に分割した場合は、
少なくとも、1トランザクション内で実行だろ、
それを、DBコネクションまで分割
あきれて物も言えん

で、担当のSEが怒ったら、
「SQL文 1つ毎に接続を作るのがルールです」
と 胸を張って意味不明の返答があったそうです。

当然、その改修は本番リリースを取り消しで切り戻すことに、

あの国のITレベルってかなり低いとしか思えない。
それとも、オフショア先のレベルが低いだけ?

ファイル部分読み込み [2007年12月19日(水)]

Javaで、ファイルアクセスする場合に、
入力ストリームを使っても全サイズ分のバッファが必要ななぞの仕様と書いたが
回避方法が見つかった。

skip(0)を使用して、読み込み済みバッファを破棄するか
read(b) で、1Bytずつ処理するかだとは、
気が付かなかった。
って、skip(0)は、なしだろ

ついでに、
HTTPレスポンスの応答中にTCPコネクションが切れた場合は、
出力ストリームから IOExceptionが返る。
これは、予想通り

ファイルアクセス [2007年12月15日(土)]

Javaで、ファイルを読み込み出力するプログラムを開発している。

今回の予定では、500k程度のファイルが最大サイズの想定だが、
最終的には、数M単位のファイルを扱う予定。
かつ、出力自身は分割で複数回に分けて出力する仕様

そうなるとメモリパフォーマンスやファイルIOの負荷を考え、
ファイル全部を一度に読み込んで処理するのではなく、
4k程度のファイルに読み込んでは随時出力する事にした。
で、実際に動かしてみると、例外発生。
しかもバッファが足りないと言う。
4kのバッファに、4k読み込んでいるのに何故?

で、ログを出しながら詳しく読み込んでみると、
どうも、ループの2回目で例外が出ている。

で、JavaDocを読んでみると、指定されたバッファに、FileInputStreamから、
指定差入れたオフセットから指定したサイズ分読み込むとある。
おかしい、落ちる理由がわからない。

で、JavaDocを元クラスにまでさかのぼって調べてみる。

ふむふむ バッファサイズが オフセット+サイズより小さいと例外発生と、

え、ちょっと待て、
バッファサイズが、オフセット+サイズ 以上だって
つまり、200Bytから100Byt読み込みたいときって、300Bytいるって事か

ストリームなのに部分読み込みできず、読む込むファイルサイズ分のバッファを確保しろと言うのか
どこが、ストリームだ、ファイルサイズが 5Mあるときに、
部分ダウンロードで、4Mから1000Byt出力するときに、
4Mのバッファを確保しろと言うのか、
しかも、4Mまでは読み飛ばすから実際に読むのは出力する 1000Bytだけ。
4Mのメモリは、まったくの無駄。
ファイルの先頭から 4,000,001Byt目は、必ずバッファの4,000,001Bytに書くって
頭がおかしいとしか思えない。

実際は ポインターを使用しているのにポインターを隠蔽してるふりしてる弊害か?
それとも、何も考えていないだけか?

それ以前に、このバッファにオフセットとサイズを指定して読み込む関数は何のために存在するんだ

全部一度に読み込む関数のJavaDocを読んでみると、
ブロッキングとある。



もしかして、大きなファイルを読み込むと、読み込みに時間がかかって
ブロッキングされ止まってしまうし、ファイルIOも長く使用されてしまう。
それを防ぐために、何回かに分けて読むだけ?
ファイルの部分処理が目的では無く、単なるブロッキング対策

ふざけんなー 何でパイプ処理できないんだーー

使えねー orz

誰か、ファイルの部分読み込みの方法おしえて…

テスト [2007年12月05日(水)]

テストがNGの原因は、予想通り
提供されたデータが間違ってるだけって落ちだった。

データが間違ってるんだから当然、外部のシステムと結合テストすれば
NGになるよな、

まあ、予測してた結果ではあったが。

でも、それってNGの原因をきちんと調べればすぐにわかった話
なんだよな、
テストした形跡がないのは、1件目のテストでNGになったから
2項目目からテストしてなかっただけって事だろうけど、
じゃあ、全項目NGなって嘘の連絡よこすなよな。

てすと [2007年12月04日(火)]

頼むから、テストしたなら結果を正確に伝えて欲しい
NGだったとだけ言われても原因の調べようがない。

で、サーバのログを調べてみると、テストした形跡がない。
何時ものことながら、いい加減にして欲しい。
まったく、1年近く 付き合いがあるが、何時も同じ。
こちらからしている依頼の内容をまったく理解していないんだろうな

どう考えても、正しくテストしてないんだよな。

前なんか、ケースA NG ケース B OK と連絡があったから調査したら
ケースBに関して実行したログが存在しない。
ケースAに関して 設定のミスやこちらでの単体テストの結果は
問題が見つからない。
Bに関して、テストした形跡がないことを指摘したら
ケースA OK ケースB 未テストでした
って 殺す

今回も、テストしました NGでした
とだけ、連絡が来る。

調査してみると、案の定 テストしたログがサーバにない。
テストをしていないのは間違いない。
で、開発の人がテストをしたら、しっかりログが残ってるんだよな。

で、実は今回のテストは、すでに本番で正常にサービスインしてる
実績があって、設定パラメータのテストしてるだけなんだよな
実は

教えると、テストしないような気がするから教えてないけど
trackback Blog by isao.net