ひこぽんのーと

覚書と雑記です。

JavaEE 7をやってみよう。 HSQLDB/DBeaver/データソースエクスプローラ その1

前シリーズと似たような話題。

前シリーズでSQLiteを試しておいて、
あっさり次のDBの登場となりました。

JPAのサンプルを作ってみようとして試行錯誤中、
O/Rマッパー用のBeanを自動生成する段階で
どうしても生成したクラスがビルドエラーとなるのでSQLiteは諦めた。

似たようなDBにHyperSQL DBというのがあるので、
これを使ってみようと思う。

HSQLDBにはEmbeddedモードとServerモードがあって、
EmbeddedモードはSQLiteと同じようにJDBCドライバから直接DBファイルを参照できる。
ただし、1箇所で接続している間はロックされてしまうので、
開発にはちょっと使いにくい。
そんなわけで、HSQLDBのServerモードを利用することにした。

導入手順は以下の通り。

1. ファイルの入手
HSQLDBのサイトからファイルをダウンロード
http://hsqldb.org/
2. インストール
ダウンロードしたファイルを適当な場所に解凍。終了。
3. シェルスクリプトの作成
環境がWindowsの場合は不要。
要は起動用のスクリプトDOSバッチでしか提供されていないので、
元ネタをコピーしてシェルスクリプト化するだけ。
javaコマンドで目的のクラスを呼んでいるだけなので、難しくない。
4. 起動
コンソールからHSQLDBの{インストールディレクトリ}/binへ移動して、runServer.sh*1を実行するだけ。
パラメータ未指定でも動作はするが、DBファイル名やDB名がデフォルトになってしまうので、気になる場合はパラメータで指定すると良い。
パラメータ書式効果
--database.{i} file:{fileName}DBファイル名の定義。
{i}にはインデックスを指定する。
{fileName}にはファイル名を指定する。
実際にはこれに拡張子が付いたファイルが生成される。
ex. --database.0 file:localDB
--dbname.{i} {dbname}DB名の定義。
{i}にはインデックスを指定する。
{dbName}にはDB名を指定する。
ex. --dbname.0 localDB
--helpヘルプをみる。
5. DBファイルの確認
runServer.shの中でHSQLDBの{インストールディレクトリ}/dataへ移動しているので、このディレクトリの中を覗いてみるといくつかファイルが作られているはず。
これがDBのデータファイルとなる。
6. 終了
コンソールにも表示されるが、Ctrl+Cのシグナルを送ると終了となる。

といったところで、次回へ続く。

*1:runServer.batを自前でshに書き換えたもの。

ジョイスティックの連射機能

Ubuntuで古い昔のシューティングゲームをたまにやる。
アメリカ陸軍の戦闘機がなぜかミッドウェイにいる空母から発艦して
旧日本海軍の戦艦を撃沈するあのゲームとか、
あの時代のシューティングゲームが気軽に楽しめるので好きなのだが、
今、PC上でプレイするとある種の不満も出る。

それはやたらと必要になる「連射」。

古いゲームは連射機能が無いので、プレイ中の連射がなかなかシンドイ。
PC用コントローラを使ってもシンドイ。
WindowsにはJoyToKeyという
ジョイスティックのボタンにキーボードのボタンを割り当てるアプリがあり、
そのアプリに連射モードもあったのでよく利用していた。

Ubuntuにも同じようなアプリでantimicroというものがあるので、
導入手順についてメモしておく。

ジョイスティックの導入
USBのPC用コントローラなら何もしなくても認識するが、もしのも為、メモしておく。
jstest-gtkはジョイスティックの動確・調整に使える。
sudo apt-get install joystick jstest-gtk
antimicroの導入
ppaを追加してインストールすることになる。
Dashから起動できる。
$ sudo add-apt-repository ppa:ryochan7/antimicro
$ sudo apt-get update
$ sudo apt-get install antimicro

起動するとこんな画面が出る。
f:id:nagamitsu1976:20150828180229p:plain

コントローラマッピングでantimicroのボタン定義に対してコントローラのボタン割り当てを行う。
f:id:nagamitsu1976:20150828180443p:plain

例えば、XボタンにキーボードのAを割り当てるとしたらXボタンのボタンを押して、
設定画面を出してキーを登録する。連射モードの設定もここで行える。
対象のゲームのShotボタン(キーボード操作での)を登録すればOK。
f:id:nagamitsu1976:20150828180654p:plain

antimicroを起動した状態で目当てのゲームを実行すれば
連射モードが無くても連射が使えるようになる。
また、ジョイスティック未対応のゲームでもキーボードのコントロールをantimicroに設定しておけば、
ジョイスティックでゲームができる。

Linuxも便利になったなぁ、としみじみ思う。

JavaEE 7をやってみよう。 SQLite/DBeaver その5

その4のつづき。
今更だけど、このシリーズ、JavaEE関係ないなぁとは思うけど、
横着できるツールを探して時短に活用するってのもテクニックなので、
無駄かもしらんけれど、こんな調査もたまには必要だよねっ。

ちなみに今回はSQLを書かずに、諸々の操作ができて、
データ出力とか検索とか使いやすい機能が揃っているか、
DBViewerと比べてどうかってのが調査の観点です。

気を取り直して、
DBeaverでのデータ入力、行ってみよう。

データ入力
目的のテーブルを開いて、データのタブを選ぶとデータ参照の表が表示される。
今は空なので、ツールからデータ入力をしてみる。
f:id:nagamitsu1976:20150902152319p:plain
ウィンドウ下部の「+」ボタンを押すと行が追加され、セルが編集可能となる。f:id:nagamitsu1976:20150902152407p:plain
適当に入力し、ウィンドウ下部の「レ」ボタンを押すと保存される。「×」は取り消し。
データの表示
目的のテーブルを開いて、データのタブを選ぶとデータが自動で抽出される。
f:id:nagamitsu1976:20150902153747p:plain
表示されるカラムだとか順序はフィルターボタンから開くダイアログで好きに変えることができる。f:id:nagamitsu1976:20150902154300p:plain
データの絞り込みはフィルター入力ボックスに条件を入力することで行える。
f:id:nagamitsu1976:20150902154502p:plain
表示形式もグリッド表示とテキスト表示で切り替えることができる。f:id:nagamitsu1976:20150902155144p:plain
また、通常はY方向(下方向)にデータが表示されるが、X方向(横方向)に表示することもできる。
ただし、1レコードづつだけれど。f:id:nagamitsu1976:20150902155416p:plain
SQL自動生成
表示データを選択した後、コンテキストメニューから「Generate SQL」を選ぶことで、「Select by Unique Key]、「Insert]、「Delete by Unique Key]の3種類のSQLを生成できる。
f:id:nagamitsu1976:20150902155611p:plain
データ削除
グリッドから対象行を選択して、コンテキストメニューから削除を選ぶか、Deleteを押すと削除マーカーがつく。
編集後、ウィンドウ下部の「レ」ボタンを押すと保存され、「×」で取り消しとなるのは入力と同じ。f:id:nagamitsu1976:20150902155909p:plain
データエクスポート
Database Navigatorからテーブルを選択し、コンテキストメニューから「データのエクスポート」を選ぶと出力形式を選択するダイアログが表示される。f:id:nagamitsu1976:20150902160126p:plain
出力形式は、XML, HTML, CSV, SQLとひと通りあり、なおかつ「データベース」なんてのもある。
テーブルからテーブルへ、select 〜, insertなんだろうけど、SQL書くのとどっちが早いのだろう。
ファイル出力に関しては、直接クリップボードにも出力できるので便利。

出力結果はこんな感じ。

<?xml version="1.0" ?>
<!DOCTYPE EMP [
  <!ELEMENT EMP (DATA_RECORD*)>
  <!ELEMENT DATA_RECORD (EMPNO?,ENAME?,JOB?,MGR?,HIREDATE?,SAL?,COMM?,DEPTNO?)+>
  <!ELEMENT EMPNO (#PCDATA)>
  <!ELEMENT ENAME (#PCDATA)>
  <!ELEMENT JOB (#PCDATA)>
  <!ELEMENT MGR (#PCDATA)>
  <!ELEMENT HIREDATE (#PCDATA)>
  <!ELEMENT SAL (#PCDATA)>
  <!ELEMENT COMM (#PCDATA)>
  <!ELEMENT DEPTNO (#PCDATA)>
]>
<EMP>
  <DATA_RECORD>
    <EMPNO>1</EMPNO>
    <ENAME>Prince Umayado</ENAME>
    <JOB>Regent</JOB>
    <MGR></MGR>
    <HIREDATE>1965/01/04</HIREDATE>
    <SAL>1,000</SAL>
    <COMM>1,000</COMM>
    <DEPTNO>1</DEPTNO>
  </DATA_RECORD>
  <DATA_RECORD>
    <EMPNO>2</EMPNO>
    <ENAME>Hirofumi Ito</ENAME>
    <JOB>Prime ministar</JOB>
    <MGR></MGR>
    <HIREDATE>1986/01/04</HIREDATE>
    <SAL>1,000</SAL>
    <COMM>1,000</COMM>
    <DEPTNO>1</DEPTNO>
  </DATA_RECORD>
  <DATA_RECORD>
    <EMPNO>3</EMPNO>
    <ENAME>Souseki Natsume</ENAME>
    <JOB>Novelist</JOB>
    <MGR></MGR>
    <HIREDATE>2007/04/02</HIREDATE>
    <SAL>1,000</SAL>
    <COMM>1,000</COMM>
    <DEPTNO>1</DEPTNO>
  </DATA_RECORD>
  <DATA_RECORD>
    <EMPNO>4</EMPNO>
    <ENAME>Hideyo Noguchi</ENAME>
    <JOB>Doctor</JOB>
    <MGR></MGR>
    <HIREDATE></HIREDATE>
    <SAL>1,000</SAL>
    <COMM>1,000</COMM>
    <DEPTNO>1</DEPTNO>
  </DATA_RECORD>
</EMP>
  • HTML

EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
1Prince UmayadoRegent 1965/01/041,0001,0001
2Hirofumi ItoPrime ministar 1986/01/041,0001,0001
3Souseki NatsumeNovelist 2007/04/021,0001,0001
4Hideyo NoguchiDoctor 1,0001,0001

"EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO"
1,Prince Umayado,Regent,,"1965/01/04","1,000","1,000",1
2,Hirofumi Ito,Prime ministar,,"1986/01/04","1,000","1,000",1
3,Souseki Natsume,Novelist,,"2007/04/02","1,000","1,000",1
4,Hideyo Noguchi,Doctor,,,"1,000","1,000",1
INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES (
1,'Prince Umayado','Regent',NULL,'1965/01/04',1000.0,1000.0,1);
INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES (
2,'Hirofumi Ito','Prime ministar',NULL,'1986/01/04',1000.0,1000.0,1);
INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES (
3,'Souseki Natsume','Novelist',NULL,'2007/04/02',1000.0,1000.0,1);
INSERT INTO EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES (
4,'Hideyo Noguchi','Doctor',NULL,'',1000.0,1000.0,1);
データのインポート
DataNavigatorからテーブルを選んでコンテキストメニューから「import Data」で実行できるが、
これは少しイケてない。
データベースからデータベースへのインポートしか備えていない。
これではデータをエクスポートする意味があまりない。

と、検索、追加、削除などをプラグインで操作してみたが、データのインポートだけが劣るぐらいでDBViewerと比べても機能の見劣りはさほどない。
多彩なRDBに対応しているし、ドライバもセットアップ時にダウンロードできる仕組みなので、
DBViewrの代替には十分成りうる。

もっともフリーのDBクライアントもいくつかあるので、これにこだわる必要があるか、というと、考えるところ。
結局は、自分の使いやすいツールを見つけて使うか、ってところに落ち着くのか。

JavaEE 7をやってみよう。 SQLite/DBeaver その4

その3のつづき。

DEPT表のDDLを作り、SQLエディタから流してみる。

CREATE TABLE DEPT (
  DEPTNO INTEGER NOT NULL,
  DNAME TEXT(14),
  LOC TEXT(13),
  PRIMARY KEY  (DEPTNO)
)

SQLの実行はCTRL + ENTERとのこと。
コミットしてもDatabase Navigaterには反映されないが、内部では正しくコミットされている。
Database Navigaterをリフレッシュするとちゃんと表示される。
f:id:nagamitsu1976:20150827184544p:plain

最後に外部キーを追加してみる。

外部キーの追加
EMP表をダブルクリックし外部キータブを開く。コンテキストメニューから「新規登録 外部キー」を選ぶ。
f:id:nagamitsu1976:20150827185522p:plain
親子関係を選択
参照テーブルを選択。(ダイアログの上側の表) ここではDEPT表を選ぶ。
すると列(ダイアログの下側の表)に参照関係の列が自動で表示される。
列はプルダウンとなっていて候補が複数ある場合は自分で選択もできる。
削除時や更新時の動作もここで指定できる。f:id:nagamitsu1976:20150827185536p:plain
完了
完了ボタンを押すと外部キーが作成される。
f:id:nagamitsu1976:20150827185722p:plain
コミット
編集内容を保存すると、やはりダイアログにDDLが表示される。永続化ボタンを押して反映する。
f:id:nagamitsu1976:20150827190246p:plain
と思ったら、エラーった。
SQLiteはAlterが使えないのか。f:id:nagamitsu1976:20150827190353p:plain

思わぬところで。。。*1
まぁ、他のRDBならこんな感じでOKなんだろう。

気を取り直して、次回はデータの登録と検索、削除なんかをやってみよう。

*1:SQLiteの外部キーは癖がある模様。とりあえず、Alterはダメっぽい。
sql - How do I add a foreign key to an existing sqlite (3.6.21) table? - Stack Overflow

JavaEE 7をやってみよう。 SQLite/DBeaver その3

その2のつづき。

DBeaverでテーブルを一つ作ってみる。
テーブルのサンプルとしては、あのemp表にしてみようかと思う。

新規登録テーブル
Database Navigaterからリソースのテーブルを選択、
右クリックしてコンテキストメニューから「新規登録テーブル」を選ぶと
リソースにNewTableが追加され、テーブル情報のウィンドウが開く。
f:id:nagamitsu1976:20150827174715p:plain
テーブル名変更
テーブルの名前を変える。
テーブル名の値を変えればOK。
ここでは仮に「emp」とした。
f:id:nagamitsu1976:20150827174943p:plain
列の追加
列のタブを開き、コンテキストメニューから「新規登録 列」を選ぶ。
ビューにカラムが追加されるので、列名と型、属性などを設定する。
f:id:nagamitsu1976:20150827180300p:plain
プライマリキーの設定
Unique Keyのタブを開き、コンテキストメニューから「新規 Unique Key」を選ぶ。
ダイアログからキーとする項目をチェックしてOKを押すと設定される。
f:id:nagamitsu1976:20150827180525p:plain
外部キーの設定
外部キーのタブを開き…
DEPT表がまだないので、詳細は割愛。
Unique Keyと同じイメージで作成できる。
DDLの確認
入力内容を保存するとダイアログが開き、DDLが表示される。
「永続化」ボタンを押すとテーブルが作成される。
f:id:nagamitsu1976:20150827180849p:plain
コミット
OracleなんかだとDDLは自動コミットなのだが、SQLiteDDLを流してもコミットされないため、
手動でコミットする必要がある。(auto-commitをOFFにしたから。。。)
しかし、ぱっと見てもコミットボタンが見当たらない。
メニューバーのSQLエディタからSQLエディタを開くと、ツールバーにコミットボタンがお出ましになる。
忘れずにコミットしないと水の泡。
f:id:nagamitsu1976:20150827183146p:plain

コミット/ロールバックのボタン表示/非表示以外は他のアプリとそう大差がなく扱いやすい。
もっとも、テーブルを作るならDDLを書いたほうが早いよ、多分。

というわけで、次回へ続く。

JavaEE 7をやってみよう。 SQLite/DBeaver その2

その2のつづき。

EclipseプラグインでDB参照できるものといえば、
真っ先に思いつくのがDBViewer。
仕事では大変お世話になった。
このプラグインは少し使うにはいいのだが、
かゆいところに手が届いていないなぁ、といつも思っている。

そこで何か新しいDBを操作できるプラグインが無いかと
Eclipseマーケットプレイスを見てみると、
「DBeaver」というプラグインを見つけた。

各種のDBに対応している様で、SQLiteにも対応している。
都合がいいので「DBeaver」を使ってみることにした。

データベースリソースを作るまでの手順を以下にメモしておく。

パースペクティブ
DBeaverのパースペクティブを開く。
f:id:nagamitsu1976:20150827170404p:plain
接続設定の追加
Database Navigaterを右クリックして「新規登録 接続」を選択するとダイアログが開く。
接続するDBの種類を選択 
使用するDBにあった項目を選ぶ。
SQLiteを使うので、それを選んだ。
f:id:nagamitsu1976:20150827170419p:plain
接続先の設定
SQLiteの場合、読み込むファイルの選択といった具合になる。
ちなみに初めて利用する場合、
DriverファイルをDBeaverのサイトからダウンロードするかどうか尋ねられる。
Driverを用意していない場合、この提案に乗ると手間が省けて楽。
Driverファイルはワークスペースのmetadataフォルダに格納される。
f:id:nagamitsu1976:20150827172334p:plain
接続の設定
デフォルトでも良いかと思ったが、auto-commitがONになっていたので、これだけはOFFにした。
f:id:nagamitsu1976:20150827172643p:plain
接続のテスト
接続テストを実施して、接続できることを確認。
f:id:nagamitsu1976:20150827172740p:plain
完了
Database Navigaterにリソースが追加される。
f:id:nagamitsu1976:20150827172804p:plain

Driverファイルをウィザードの途中でダウンロードできるのがなんとも便利だなぁと思った。
次回はテーブル作成を行う。
といったところで、次回へ続く。

JavaEE 7をやってみよう。 SQLite/DBeaver その1

JavaEEJPA機能、O/Rマッパーの機能を今後試してみる予定だが、
それにはDBがいる。
MySqlとかPostgreSQLとか都合の良いのがあるのだが、
仰々しいDBをインストールするのも気が引ける。
「なら、Java DBでいいじゃん」って思ったのだが、
OpenJDKを使っているので、インストールもされていない。
Apacheから取ってきて設定するのでは、
MySqlなんかを使うのと違いがなくなってしまい、メリットが薄い。

というわけで、
簡単に設定が済むSQLiteを使うことにした。

Ubuntuなら導入はコマンド一発で済む。

sudo apt-get install sqlite3

下記のサイトを情報源としたので、
詳しく知りたい人は下記のサイトを読むと良いと思う。

SQLite入門

試した内容を以降に記載する。

データベース作成/データベースを開く
指定ファイルがない場合、新規作成。(プログラム終了時にファイルが作られる)
sqlite3 <ファイル名>

f:id:nagamitsu1976:20150827155313p:plain

ヘルプを見る
.helpを入力するとヘルプを見ることができる。
f:id:nagamitsu1976:20150827155954p:plain
終了する
.quitを入力するとSQLiteを終了できる。
f:id:nagamitsu1976:20150827160040p:plain

テーブル作成とかクエリ発行なんかは、OracleSQL+なんかと大差ないので割愛。
EclipseプラグインからSQLiteを操作する方法について考えてみる。

といったところで、次回へ続く。