Team Japan

InterBase DataPump

www.CleverComponents.comで公開されている InterBase DataPumpは BDE/ADO/ODBCのデータソースからInterBaseにデータを移行するためのツールです。

使用するには、http://www.clevercomponents.com/downloads/datapump/dpdownload.asp より、Interbase DataPump v 3.4 standalone applicationをダウンロードします。
ダウンロードした IBPump.zipを解凍し、解凍された IBPump.exeを実行することにより起動します。

このツールを使用して C++Builder/Delphi/RAD Studioに付属しているサンプルの Paradoxファイルを InterBaseへ移行してみました。
実行した手順は以下の通りです。

  1. IBConsoleを使用して、新規のデータベースファイルを作成しておきます。
  2. IBPump.exeを実行します。
  3. 表示された画面上の Source Database Propertiesを BDE Sourceにセットします。
  4. Source DBを DBDEMOSにセットし、Source DBの右横にある [Test Connection]のボタンをクリックして接続を確かめます。
  5. [Build SQL Script]のボタンをクリックすると、Generate SQL Scriptの画面が表示されます。
  6. そのまま [Start]ボタンをクリックします。生成された SQL文が表示され、IBPump.exeと同じディレクトリ内に convbde.sql という名前で保存されます。その後、[Close]ボタンをクリックして、Generate SQL Scriptの画面を閉じます。
  7. IBConsoleで、作成しておいた新規のデータベースファイルに接続します。
  8. ISQLを起動し、生成された convbde.sqlから移行したいテーブルとそれに関連する SQL文を選択して ISQL上で実行し、空のテーブルを作成します。(この例では Customer, Items, Orders, Partsの4つのテーブルとそれに関連するインデックス等のみとしてあります)
  9. IBPump側に戻り、Destination DataBase Properties側(つまり受け取り側の InterBase)を設定します。
  10. Destination DBに、作成した Interbaseのデータベースへのパスをセットして、Destination DBの右横にある [Test Connection]のボタンをクリックして接続を確かめます。
  11. Pump Properties内の [Swich Off all Ref. Constraints which have a loop]のチェックをはずしておきます。
  12. 画面上部の Step2: Orderのタブをクリックします。
  13. [Get Definitions]のボタンをクリックします。それぞれのデータソース内に所属するテーブルの一覧が表示されます。
  14. [Build Relations]のボタンをクリックします。Destination DB:側のテーブルに、Source DB:側のファイルが関連付けられます。
  15. [Update Definitions]のボタンをクリックし、現れた画面上で [Start]ボタンをクリックします。問題が発生しなければそのまま [Close]ボタンを押して画面を閉じます。
  16. 画面上部の Step 3: Pumpのタブをクリックし、[Start]ボタンをクリックするとデータの移行が行なわれます。
  17. IBConsole側でデータが移行されていることを確認できます。

このツールですが、スキーマだけを InterBaseのデータベース上に定義し、ER/Studioを使って、データベース内のテーブルの関連図やドキュメントを作成するなどという使用方法も考えられますね。

Posted by Chikako Yonezawa on July 3rd, 2009 under C++, Database, Delphi | Comment now »


Change Manager 5.1 を試す

高橋(智)です。
今日は、先日リリースされたばかりの「Change Manager 5.1」の機能を少し試してみます。
まずは、データベースのSQL開発に関する機能ですが、実は、Change Manager 5.1にはSQL文をコーディングしたり、その実行計画(クエリープラン)を参照する機能も付属しています。例として、「Oracle 10g R2」の「SCOTT.EMPテーブル」に対して「 SELECT * FROM SCOTT.EMP WHERE SAL*12 > 35000; 」というSELECT文を実行してみます。このSELECT文では、仮にSALカラムにインデックスが設定されていたとしても、そのインデックスは利用されないようです。実際、実行計画で確認すると確かに利用されていません…。

この場合、WHERE句の中に「SAL*12」という計算式が使われているのが原因です。このWHERE句は「 SELECT * FROM SCOTT.EMP WHERE SAL > 35000/12; 」と修正することで、インデックスを利用するようになります。
ですが、最近のOracleでは、「関数インデックス(Function Based Index)」を手軽に利用できるように改善されており、「 CREATE INDEX SCOTT.EMP_SALx12_IDX ON SCOTT.EMP(SAL*12); 」というように、式「SAL*12」を指定することができます。
この関数インデックスを作成した後、もう一度実行計画を確認すると、インデックス「SCOTT.EMP_SALx12_IDX」が利用されるようです。Oracleの関数インデックスって便利ですね~。

では次に「Change Manager 5.1」の主要な機能の1つである「スキーマ情報の比較機能」を試してみます。予めアーカイヴとして保存しておいたオリジナルのスキーマ情報と、インデックスを追加した現在のスキーマ情報との比較を行います。

比較処理が完了すると、検出した不一致な内容等を含んだ詳細なレポートが生成されます。定期的に比較を行うためのバッチファイルを生成することもでき、それをスケジューラに実行させることで、自動的にメールで通知するなどの機能も搭載されています。Eclipseのプラグイン開発機能を使って、この通知機能を拡張することもできるのですが、機会があれば紹介したいと思います。

 

Posted by Tomohiro Takahashi on June 30th, 2009 under Database | Comment now »


デベロッパーキャンプ番外セッション - 懇親会場へのアクセス

さて、今回のデベロッパーキャンプでは、懇親会形式の番外セッションを企画しています。懇親会をお勧めする理由はこちらを見ていただいて、ここでは、懇親会場へのアクセスをご案内したいと思います。

デベロッパーキャンプは、東京国際フォーラムで実施していますが、懇親会場は、ここからちょっと離れています。ほとんど、JRの線路沿いに歩いていけばいいのですが、いちおう写真入りで。

国際フォーラムのB棟1Fからガラス棟側に出ると、緑のある涼しげな空間が広がっています。ここを有楽町駅の方に歩いていきます。

ちょうど目の前に有楽町駅北口と右手にはビックカメラ(昔のそごう)が見えます。この間、つまり線路脇の道を新橋方面に歩いていきます。

ずっと歩いていくと、晴海通りの交差点に出ます。地下鉄日比谷駅の入り口が目印です。この横断歩道を渡ります。

横断歩道を渡ったら、再び線路脇の道へ。ガード下の店に誘われながらも誘惑に打ち勝って先に進みます。

ひとつの角のところに宝くじ売り場があります。その先はアマンドです。ここを右に曲がります。

すると、カラオケ店のひとつ先にHUBの看板が出ています。ここの地下1階です。

えー、懇親会だけ参加、という人はあまりいないと思いますが、その場合は、地下鉄日比谷駅が便利です。日比谷線、ちょっと歩くけど千代田線、都営三田線が利用できます。出口はA4。ここを出ると、晴海通り。先ほどの写真の横断歩道を渡ったところに出ます。

なお、懇親会の会費は、懇親会会場ではなく、デベロッパーキャンプ会場でお支払いください。参加チケットをお渡しします(このチケットの裏面に地図も印刷されています。ご安心を)。会期中いつでもかまいませんので、受付までお越しください。

うっかり懇親会の申込みを忘れた方、当日やっぱり参加したくなった方は、会場受付でお申し出ください。席数に余裕のある限り当日申込みもOKです。

Posted by Hitoshi Fujii on June 29th, 2009 under Event | Comment now »


いよいよ今週デベロッパーキャンプ - 会場へのアクセス

いよいよ7月2日の第13回エンバカデロ・デベロッパーキャンプの開催が近づいてきました。

今回の会場は東京国際フォーラム。有楽町駅前のわかりやすい場所ではありますが、毎回恒例の「会場へのアクセス」です。

JR有楽町駅は、北口が便利。その名のとおり、「国際フォーラム口」というのがありまして、改札を出ると目の前が国際フォーラムです。

国際フォーラム会場は、葉っぱのようなかたちのガラス棟と、A、B、C、Dの4つの棟に分かれています。今回デベロッパーキャンプを行うのは、「B棟」。案内図で黄色の部分です。ちなみに、ガラス棟の地下2階では、OpenSource Worldが開催されています。

ということで、案内版を頼りに、「B棟」をめざします。

こちらが地上の「B棟」入り口。

裏側から回り込んでも入り口があります。

地下鉄を使う場合には、有楽町線が便利です。有楽町駅で降りたら、D5出口を目指します。有楽町線以外のアクセスは、千代田線二重橋駅、日比谷線日比谷駅、ちょっと遠いけど、都営三田線日比谷駅も使えます。

D5からは地下直結で、国際フォーラムに入れます。ちなみに、この地下入り口付近にコンビニがあります。

地下通路を歩いていくと、黄色い「B棟」への誘導サインが見えてきます。ここを入ってエスカレータを上がると、B棟への入り口になります。

さて、デベロッパーキャンプ会場には、もう少しエスカレーターを上らなければなりません。長いエスカレーターを上っていくと、右手に受付が見えてきます。

今回は、OpenSource Worldの併設開催なので、空いた時間にそちらの展示も… と計画している方は、ホール全体の位置関係をチェックしておくといいでしょう。

Posted by Hitoshi Fujii on June 29th, 2009 under Event | Comment now »


VCL for PHP の最新版について

高橋(智)です。
Delphi for PHP Ver2.0 に付属している「VCL for PHP」ですが、2008年11月下旬頃の安定バージョン2.1が搭載されています。
しかし、それ以降[Revision: 263]から[Revision: 271]までの間に、いくつかの問題が解決されたり、新しいプロパティなどが追加されています。
個々の変更点の詳細は、
http://vcl4php.svn.sourceforge.net/viewvc/vcl4php/trunk/?view=log
で確認でき、
例えば、「Smartyテンプレートエンジン」と「VCL for PHP」を組み合わせて利用する際に、「IE8」で発生するようになった問題が
[Revision: 269]
http://vcl4php.svn.sourceforge.net/viewvc/vcl4php?view=rev&revision=269
で対処されています。

それで、VCL for PHPへのパッチを適用するには、上の個々の.phpファイルをダウンロードして、手元の.phpファイルと置き換えれば良いのですが、現在のSourceforgeの内容をTTAR.GZアーカイヴとして一括してダウンロードすることも可能です。こちらのほうがラクかもしれません。
http://vcl4php.svn.sourceforge.net/viewvc/vcl4php/trunk/vcl/ 

の下のほうにある「Download GNU tarball」のリンクをクリックしてみてください。

Posted by Tomohiro Takahashi on June 26th, 2009 under Database, Delphi, PHP | Comment now »


EJB3.0(JPA)で楽観的ロックを試す

高橋(智)です。
今日は、以前blogに書いた「Ruby on Railsで楽観的ロックとトランザクションを試す」と同様の処理を「EJB3.0(JPA)」で実装してみようと思います。環境には「JBuilder 2008 R2, Glassfish V2UR2, MySQL 5.0.x」を使用します。
まず基本的に、Glassfishが搭載しているToplink Essentailを使った場合など、エンティティの更新処理を行う際にRDBMSに対して発行されるUPDATE文のWHERE句には「プライマリキー」のみが付加されます。たとえば、セッションビーン内に以下のような「Userinfoエンティティを更新するビジネスメソッド」が実装されていた場合を考えてみてください。
——————————————-
@Stateless(name = "MySession", mappedName = "MySession")
public class MySession implements IMySessionRemote {
  @PersistenceContext
  EntityManager em;
  public void UpdateTest(String name) {
    Userinfo info = em.find(Userinfo.class, name);
    info.setInfo(info.getInfo()+" X");
  }
}
——————————————-
この処理の結果、MySQLには以下のSQL文が発行されました。これを見ると、確かにWHERE句にはプライマリキーのみが指定されています。これで構わない場合は良いのですが、このままでは複数のクライアントによる同時更新が行われた際に、最後に更新した内容がデータベースに反映されてしまいます。
[MySQL 5.0.xのログ]
——————————————-


SELECT USERNAME, USERID, PSWD, EMAIL, INFO, DISKSIZE FROM userinfo WHERE (USERNAME = ‘ken’);


SET autocommit=0;
UPDATE userinfo SET INFO = ‘info X’ WHERE (USERNAME = ‘ken’);
commit;
SET autocommit=1;
——————————————-

では、この「Userinfoエンティティ」に楽観ロックの機能を追加してみます。
まず、MySQLのuserinfoテーブルに、行のバージョン番号を管理するための「INTEGER型
カラム(デフォルト値=0)」を追加します。カラム名は自由です。
——————————————-
mysql> ALTER TABLE userinfo ADD COLUMN version INTEGER DEFAULT 0;
——————————————-

次に、JBuilderのEJBデザイナで「Userinfoエンティティ」に永続化フィールド「version」を追加し、EJB3.0のORMプロパティの「Version」を「true」に変更します。この処理によって、Userinfoエンティティのソースコードが自動で以下のように変更されます。
一方、最初に掲載したセッションビーン内のビジネスメソッドを変更する必要はありません(※EntityManagerのflushメソッドを呼び出すことはある)。


EJBを再配布した後、MySQLに対して発行されるSQL文がどうなったか確認してみます。SELECT文にversionカラムが追加され、UPDATE文のSET句とWHERE句にversionカラムが追加されています。
[MySQL 5.0.xのログ]
——————————————-


SELECT USERNAME, USERID, INFO, PSWD, EMAIL, VERSION, DISKSIZE FROM userinfo WHERE (USERNAME = ‘ken’);


SET autocommit=0;
UPDATE userinfo SET INFO = ‘info X’, VERSION = 1 WHERE ((USERNAME = ‘ken’) AND (VERSION = 0))
commit;
SET autocommit=1
——————————————-

以上、「EJB2.x」から「EJB3.0(JPA)」にシステム移行される方は、更新処理にくれぐれもご注意ください。

Posted by Tomohiro Takahashi on June 24th, 2009 under Database, Java, Ruby | Comment now »


PHP拡張モジュール - Delphiでラクラク作成

高橋(智)です。
今日は、7月2日に開催する「第13回エンバカデロ・デベロッパーキャンプ」で私が担当するセッションについて簡単に紹介しようと思います。
セッションは
【B3】PHPテクニカルセッション
「DelphiでPHP - 拡張モジュールの作成からWAMP/WIMP環境の構築まで」
というタイトルで、メインのトピックとして「Windowsサーバー上のPHP向けの拡張モジュールの作成手順」を話す予定です。いったん、拡張モジュール(.DLL)を作成する手法をマスターできてしまえば、PHP環境を好きなように拡張できます。Webサービスを呼び出したり、データベースに接続したり、高度な計算や処理をするのに、純粋なPHPで実装するよりも拡張モジュール(.DLL)を使えばどんなにラクでしょう? また、既存の資産やコードも活用できるはずです。

セッションの後半では、「VCL for PHP用の非ビジュアルコンポーネントの作成手順」や「WAMP/WIMP環境の構築手順」を解説しつつ、作成した拡張モジュールを実際に動作させてみます。
PHPに興味のある方は是非ご来場ください。

Posted by Tomohiro Takahashi on June 19th, 2009 under C++, Database, Delphi, Event, PHP | Comment now »


EJB3.0(JPA) - エンティティの検索

高橋(智)です。
今日は、EJB3.0で、Stateless Session Bean から、JPAを使ってEntityを検索する処理について書いてみようと思います。なお、開発環境として「JBuilder 2008 R2」、アプリケーションサーバとして「Glassfish V2UR2」、データベースサーバとして「MySQL 5.0.x」を使用します。
まず、インポートウィザードを使ってuserinfoテーブルからUserinfoエンティティを自動生成し、それからMySessionというセッションビーンを実装したのですが…。
MySessionビーンに2個のビジネスメソッド「Test1」,「Test2」を実装し、どちらのメソッドもパラメータとしてString型の主キー値を受け取って、エンティティマネージャに検索処理を行わせ、戻り値としてUserinfoエンティティを1個返します。ただし、もし合致するUserinfoエンティティが見つからなければ、アプリケーション例外「MyAppException」を送出するように設計しました。クライアントはこの例外をキャッチできるというわけです。
ちなみにUMLモデルは以下のようになっていまして、


コードを以下のように実装しました。


ここまでは良かったのですが、EJBクライアントから無効な主キー値を渡して、検索が失敗するパターンのテストを行ったら、なぜか「Test2」のメソッドでは「MyAppException」を受け取れません。クライアントは、システム例外の「javax.ejb.EJBException」を受け取ってしまいます。「Test1」も「Test2」も、同じように動作することを期待していたのですが…。
実は、このような動作の違いは、セッションビーンをデバッグしつつ、JPAのAPIリファレンスマニュアルを読むと理由が分かります。
EntityManagerのfindメソッドはエンティティが見つからない場合には「null」を返すのに対し、QueryのgetSingleResultメソッドはエンティティが見つからない場合にはチェックされない実行時例外「javax.persistence.NoResultException」を送出するのです。この結果、EJBコンテナによりシステム例外「javax.ejb.EJBException」としてラップされてクライアントに返されます。
参考:
[javax/persistence/EntityManager - find]
http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html#find(java.lang.Class,%20java.lang.Object)
[javax/persistence/Query - getSingleResult]
http://java.sun.com/javaee/5/docs/api/javax/persistence/Query.html#getSingleResult()

ということで、以下のように「Test2」を実装するべきということになります。

Posted by Tomohiro Takahashi on June 18th, 2009 under Database, Java | Comment now »


第13回デベロッパーキャンプセッション紹介 - 「今さら聞けない(?!)C/C++ポインター再入門」

7月2日に開催する第13回エンバカデロ・デベロッパーキャンプ。今日は、前回紹介した夕方最後のセッションの裏番組を紹介します。

16:30~17:30 【B5】C++テクニカルセッション「今さら聞けない(?!)C/C++ポインター再入門」

私自身、その昔、C言語でプログラミングの仕事をしていましたから、ポインターはやっぱり重要だよね、と強くうなずけます。でも、昨今、直接的なメモリ操作を伴わないプログラミングが広まってきて、いまさらポインターなんて、という雰囲気もあります。ポインターにこだわるのは、セグメントの壁に悩みながらプログラミングをしてきたオジサン世代なのか。

いえいえ、現在でもオブジェクトへのリファレンスというかたちで、ポインターの概念はますます重要になっています。この辺を理解していないと、Javaでもばんんばんメモリリークしてしまいます。プログラムがベーシックな部分でどのように動いているのかを理解することは、それがどれほど高度に抽象化されようともやっぱり重要です。

ということで、今さら聞けないどころか、今だからこそ聞くべきポインター再入門。C/C++にこだわらず、聴講すべきセッションだと思います。

Posted by Hitoshi Fujii on June 18th, 2009 under C++, Event | Comment now »


第13回デベロッパーキャンプセッション紹介 - 「Delphiコーディングスタイル バトルトーク」

7月2日に開催する第13回エンバカデロ・デベロッパーキャンプ。今日は、夕方最後のセッションを紹介します。

16:30~17:30 【A5】Delphiテクニカルセッション「Delphiコーディングスタイル バトルトーク」

このセッションは、デベロッパーキャンプにご参加いただいた方からのご意見から生まれたものです。「コーディングスタイルについて」という漠然としたテーマでセッションが可能かどうかを議論したところ

  • コーディングスタイルは個々人の好みの領域でもある
  • でも、人のコーディングスタイルは参考になるし興味もある
  • かといってこれが正当コーディングスタイルです、というセッションをやるほど正当的なスタイルを持っていない
  • 下手すると宗教論争のようになってしまわないか

という意見が出て、企画倒れになりそうになったのでした。しかし、「人のコーディングスタイルは参考になるし興味もある」というところに重きを置き、じゃあそれぞれのスタイルを我流のTipsとして喧々諤々やれば有意義なセッションになるだろうということで決まったものです。時間を最後に持ってきて、それまでのセッションを担当したDelphiプログラマー、今回は登壇機会のなかった講師陣も加わり、バトルトークに仕立てました。

内容は当日のお楽しみですが、事前の打ち合わせでも、さまざまな工夫、そのスタイルを採用するしかるべき理由などが飛び交っており、普段のセッションとは違う、しかしとても役に立つ情報満載のセッションになると期待しています。

1時間に収まりきらなかったときは、番外セッションで続きをやりましょう。

Posted by Hitoshi Fujii on June 16th, 2009 under Delphi, Event | Comment now »




Server Response from: blogs2.codegear.com