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

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

2006年07月30日

AM5:SQL Mk-2 - 松のページブログ - 楽天ブログ(Blog)

 まえにちょっとだけ書いていた、「あまのいわと5 IMPERIAL GODDESS II」のADO版、一応公開です。

AM5:SQL Mk-2

 一応というのは、まあ、単に動くだけという…ロゴすら変えてないよ?って状態です。

 機能追加がないどころか削除された機能もちらほら…ADOのサーバー側カーソルとクライアント側カーソルには悩まされた。サーバー側カーソルにすると、Oracleのデータディクショナリへのアクセスがおかしくなるし、クライアント側カーソルにすると大量データの読み込みに問題が…。

 とはいえ、インストーラなしで使えるようになったし、BDE(Borland Database Engine) がもうバージョンアップされないことを考えると、ADO化はさけられないです。

 ちなみに今後も当面は「あまのいわと5 IMPERIAL GODDESS II」(BDE版)もメンテする予定です。

2006年07月27日

WHEREの後がないクエリ

#最近、同じネタのあちこちマルチポストしまくりですが・・

SELECT COUNT(*) FROM TBL WHERE』で一言書いたんですが、何気にWHEREの後に何も指定しないクエリを書いたらDB2で動いてしまった。結果は全件の件数が取得できます。

「これって常識ですか?」と隣のおじさんに聞いたら、普通エラーになる(はず)と思うと言われた。とりあえず試してみた。

○全件の件数が取得できる

  • DB2 v8.1 , v9

×構文エラー

  • MaxDB v7.5
  • Oracle 8i
  • SQL Server 2000(v8.0)

#どう考えてもDB2が特殊だと思うんだが・・



2006年07月25日

続)func(++i, ++i, ++i)の結果

func(++i, ++i, ++i)の結果」の続き:

#その前が「func(++i, ++i, ++i)@はてな」ですが、id:kazuhookuさんにお礼をコメントするのを忘れていました。

Javaでは試したけど、Cではやっていなかった(環境が手元になかったので)。そこで、とりあえずMSのVC++ v6.0でやってみた。

Cのソース  アセンブリ言語出力したソース(Debugビルド)

アセンブリ言語のソースを見ると、何だか長ったらしいことやっとるなぁ・・ということでよく見たらDebugビルドであった。そこで、Releaseビルドにしてみると・・。

アセンブリ言語出力したソース(Releaseビルド)

「push 3」が3回並んでいるのはなんで!?と思って実行してみると、

x=3, y=3, z=3

になりました。最適化で全部3になっちゃったんだね(笑)。

というわけで、func(++i, ++i, ++i);のコードが危険だということがよーく分かりました。

・・・

ちなみにJavaのソースと逆アセンブラ出力したソースです。

Javaのソース  逆アセンブラ出力(javap -c)

・・・

(追記)

さらにVisual Studio .NET 2003で作れるプロジェクトで試してみた。

  • Visual Basic .NET ⇒さすがにBASICで++iはできんだろう(笑)。パス
  • Visual C# .NET ⇒結果はx=1, y=2, z=3。そりゃJavaだもんな。
  • Visual C++ .NET ⇒結果はx=3, y=3, z=3。DebugビルドとReleaseビルドも同じ。
  • Visual J# .NET ⇒そんなもんがあったのか。ビルド環境がエラーとなって用意できなかった。

というわけで、C#はJavaと同じで、C++は最適化のために思った通りの結果にはならないのでした。

まあDebugビルドとReleaseビルドで結果が変わる方がヒドイ!!と思ったりもするのだが・・。



2006年07月25日

スタックに積む(push)ということ

前のエントリのアセンブリ言語を見ていて、

0000c 50 push eax
0000d 51 push ecx
0000e 52 push edx
0000f 68 00 00 00 00 push OFFSET FLAT:label1
00014 e8 00 00 00 00 call _printf
00019 83 c4 10 add esp, 16 ; 00000010H

「add esp, 16」ってなんだ!?と思いつつ、4回pushしたスタックポインタ(sp)を戻すことはすぐに気が付いたけど、そういえばpushするとspを引くんだった。⇒ということを何年ぶりかに思い出した。

というのも、JavaのArrayListでスタックを実装すると、pushのときはaddして添字を足していくんだよね。反対にpopの場合は、添字を引くことになる。

これはなんでだろうか?

とりあえずArrayListの場合は可変長配列だからかな。お尻が決まっていないので、お尻からスタートして引いていくことができない。

もし固定長配列のスタックを実装した場合(要は自前のクラスを作った場合)、予めprivate変数に配列を確保するわけだが、pushの際に添字を足していくだろうか? 引いていくだろうか?

なんか今作ると、0からスタートして、添字を足していく実装になってしまう気がする。というか、仕様を任せれば、8割以上が添字を足していく実装をするんじゃないかな?

・・・

では、そもそもアセンブリ言語のpushは何故spを引いていく仕様になっているんだろうか?

むかしは、コードの後ろにスタック領域を取っていたからなのかな。

でもx86の場合、SS(スタックセグメント)レジスタがあるので、普通はCS(コードセグメント)とは別のメモリ空間になりますわな。

確かにz80だったら、狭いメモリ空間のお尻から引いていくというのも、何となく分かるような気もするが・・。



2006年07月22日

beaフォルダにeclipse31が入っているのだが・・

たまたま気が付いたのが、BEA AquaLogicを入れたときに、BEAフォルダにeclipse31なんてある。これを起動してみると、eclipse v3.1.1であった。

で、plug-in一覧を見るとBEAのpluginが山のように入っている。

新規作成メニューを見ると、AquaLogic Service BusとかWeb Servicesとか普段見かけないものがいろいろ入っているのだが、この中にJavaが入っていない。

いつもならば当たり前に入っているJDTが入っていないので、このままではJavaの開発ができない。なんだかどうよ!?って感じ。



2006年07月21日

ADOでパラメーターマーカー

中野です。

ADOでOracleに接続し、パラメーターマーカー(バインド変数)を利用して
データを抽出する方法です。

条件を動的に設定することができるので、条件が違うだけのSQLを繰り返し実行する際は
この方法のほうが高速に処理されます。
INSERT,UPDATE,DELETEも同様の方法でOKです。

簡単なサンプルを記述します。
-------------------------------------------------------------------------------------

Private poDbConnection As ADODB.Connection
Private poCmd As ADODB.Command
Private poPrm As ADODB.Parameter


'データベース接続
poDbConnection.ConnectionString = "Provider=OraOLEDB.Oracle;" & _
"Data Source=データソース名;" & _
"User ID=ユーザ名;" & _
"Password=パスワード;" & _
"PLSQLRSet=1;"
poDbConnection.Open

'コマンドの確立
Set poCmd = New ADODB.Command
Set poCmd.ActiveConnection = poDbConnection


'SQL文構築
Dim dsSQL As String
dsSQL = "SELECT * FROM テーブル名 WHERE 項目名1=? AND 項目名2=?"
poCmd.CommandText = dsSQL


'パラメーターの準備
Set poPrm = New ADODB.Parameter
'「8」は項目名1の長さ
Set poPrm = poCmd.CreateParameter("項目名1", adChar, adParamInput, 8)
poCmd.Parameters.Append poPrm
Set poPrm = poCmd.CreateParameter("項目名2", adInteger, adParamInput)
poCmd.Parameters.Append poPrm


Dim doRecset As ADODB.Recordset
Do ループ条件
  'パラメータのセット
  poCmd.Parameters("項目名1").Value = 値
  poCmd.Parameters("項目名2").Value = 値

  'レコードセットの取得
  Set doRecset = poCmd.Execute

  ・
  ・
  ・

Loop

'データベース切断
poDbConnection.Close

2006年07月21日

トリプルクリック

むかしむかし、MC68040時代のマックを使っていた時に、トリプルクリックで1行選択が出来ていた(ダブルクリックは単語選択)。開発環境のエディタでこれをやると便利だった。

で、Windowsのieでタン・タン・タンと3回クリックすると、1行選択となる。Firefoxも同様。おぉ、対応しているじゃん。

で、テキストエディタ(EmEditor)でやったら残念ながら、タン・タンで単語選択で、3回目で解除になってしまった。あぁ要望を出そうかな。なお、メモ帳(notepad)でも同様であった。

  • ○ie 6.0
  • ○firefox 1.5
  • ×メモ帳
  • ×EmEditor 5.0 Pro
  • ×Visual Studio 6.0 / .NET 2003
  • ×Eclipse 3.1.1

・・・

(7/21追記)

xyzzyというエディタが対応しているらしい。

と聞いて試してみると、ホントだ!!! タン・タン・タンと3回目のクリックをドラッグするとそのまま選択できる。つまり、選んだ行の前後の行の選択ができる。こりゃ使いやすい。(キー操作だと、HOME押してShift+↑↓みたいな感じ)

・・・

(7/25追記)

gvimというviクローンのエディタが対応しているらしい。

と聞いてv6.4で試してみると、4回クリックで短形選択となる。これはクワドラプルクリック(quadruple click)か!?



2006年07月20日

web.config に healthMonitoring 要素を追加して、SimpleMailWebEventProvider を使って web アプリのエラー情報をメールで飛ばす

例外が発生したら、メールが飛ぶようにします

2006年07月19日

func(++i, ++i, ++i)の結果

func(int x, int y, int z)というメソッドがあり、

int i=0;
func(++i, ++i, ++i);
をやったらどうなるかやってみた。結果は、
x=1, y=2, z=3
でした。パラメータの式は前(左)から評価されます。
・・・
何かの本で「C言語かPascalか忘れたけど、ひねくれた処理系ではx=3, y=2, z=1になる場合がある」と呼んだ記憶があったのだけど、Javaの場合は前からであった。
#2度とこんなコーディングはしないけど・・。
・・・
(7/25追記)
どうやらx=3, y=2, z=1が常識で、x=1, y=2, z=3がひねくれたというのが正しかったかもしれない。(インテル族としては・・)
 


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

メンバー紹介

タグパネル

ランキング

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