差分ソフトの設定

Mercurial標準のkDiffだと日本語が文字化けしてイマイチだったので
使い慣れたやつに設定する手順。


MercurialとTortoiseHGは既に入っている状態として

1,エクスプローラの適当な所で右クリック、TortoiseHG - Global Settings を選択

2,設定画面が表示されるので右上の「ファイルを開く」ボタンを押す

3,エディタで開かれるので下のような感じで使いたい差分エディタのパスを入力

[extdiff]
cmd.vdiff = C:\Program Files\WinMerge\WinMergeU.exe

4,Saveボタンクリック、OKボタンクリックして終わり。

Groovyに年賀状(宛名印刷)

あんまりGroovy関係無かったかもしれませんが、
年賀状宛名印刷が面倒なので作りました。

nenGa(@irofさんから命名頂きました、感謝)を持ってきて、
Address.xlsに印刷したい方の住所などを入れて
nenGa.groovy を実行すると動きます。
初回起動時のみ関連ライブラリをダウンロードするので時間がかかります。

■注意点
・レイアウトは家のプリンタに合わせてあります。
・フォントはゴシックにしてあります。(ポップな年賀状なので)
 MS明朝に変更
・仕様も結構適当です。
・変数名とかは気にしないでください。
Windowsのみ動作確認、macとかLinux系は未検証
 (誰か結果を教えて頂ければ。。)

 mac,Linux共にMS系のフォントが入っていないようなので、
 多分表示が崩れる。
 (JasperReportsでスタイル定義とOSによっての割り振りで可能かも)
・環境依存文字のハイフンを使用するとうまく表示されないかもしれないです。

■課題
・もっとGroovyに
・GExcelAPIを使いたい

■おまけ
Atena.jrxmlをいじると位置とかフォントとか調整できます。
iReportを入れると楽です。

NetBeans+MercurialでSSHを使用して外部リポジトリにプッシュする

忘れやすいのでメモ

NetBeansに何も設定してない状態で
メニュー「チーム」→「Mercurial」→「共有」→「デフォルトへプッシュ」
を実行すると以下のエラーメッセージが表示される

Mercurial プッシュ

                          • -

情報 - プッシュ中: ssh://リポジトリパス ...
ERROR - コマンドが失敗しました:
コマンド: [hg, outgoing, -v, --template=rev:{rev}\nauth:{author}\nuser:{author|user}\ndesc:{desc}\ndate:{date|hgdate}\nid:{node|short}\n\nendCS:\n, --repository, E:\EchoSystem\Develop\Living\SeisanKanri, ssh://リポジトリパス]
出力: [comparing with ssh://リポジトリパス, running "ssh ユーザ名 "hg -R リポジトリ名 serve --stdio"", remote: 'ssh' は、内部コマンドまたは外部コマンド、, remote: 操作可能なプログラムまたはバッチ ファイルとして認識されていません。, abort: no suitable response from remote hg!]
情報: Mercurial プッシュの終了

SSHが機能していないようなメッセージなのでぐぐってみたところNetBeansの公式Wiki
How do I set up SSH with Mercurial?
というのがあって、内容はMercurial.iniを直せって事みたいなので、とりあえず開いていみると

; In order to push/pull over ssh you must specify an ssh tool
;ssh = "C:\Progra~1\TortoiseSVN\bin\TortoisePlink.exe" -ssh -2
;ssh = C:\cygwin\bin\ssh

SSHの箇所に何も設定されていないので、上のTortoiseSVNの部分を参考に
以下の一文を追加

; In order to push/pull over ssh you must specify an ssh tool
;ssh = "C:\Progra~1\TortoiseSVN\bin\TortoisePlink.exe" -ssh -2
;ssh = C:\cygwin\bin\ssh
ssh = "C:\Program Files\TortoiseHg\TortoisePlink.exe" -ssh -2

これでNetBeans上でもSSHでのプッシュとかプルができるようになりました。
今回はWindowsでしたが、Wikiを見た感じではLinuxとかも同じ対応でOKかと。

色んなローカル的DBを使ってみよう

ちょっとした小物ツールを作る時、作り込んでくるとやはりデータの保存というのが課題になります。

大きめのものや、複数人で共有する場合はMySQLPostgreSQLといったDBになりますが、そこまで大したものではないのでやはりローカル的なDBを使うことになると思います。

調べてみると結構な数があり、どれを使えばいいのか分からないので、
これから時間を見ながら調べてみようという所です。

一応これから試そうとしているDBの候補など(却下含む)
Excel(POI)
 POIを使って簡単な読み書きはできるけども、
 検索には不向きなので却下

Access
 コスト的に却下(あと個人的にも)

HSQLDB
 ローカルなRDBMS Java製 
 OpenOfficeLibreOfficeのBaseはこれを使っているらしい

SQLite
 ローカルなRDBMS
 iPhoneAndroidのアプリに使われていて、結構なシェアらしい

db4o
 オブジェクトデータベース
 クラスをそのままデータベースに格納したり、検索ができる
 BMWボーイング社の工場でも使っているようで、信頼性は高い
 GPLライセンスなので商用利用時は注意、
 (でも社内利用だから問題ないかなと)

・NeoDatis ODB
 オブジェクトデータベース
 db4oLGPL版みたいなもの、
 クエリの組み方はHibernateに似ているので使いやすいけども
 1.9以降は日本語に対応していないのと、2010/11辺りから
 開発が止まっているのでなんとも微妙、
 データが壊れるという報告もあり。
 でもオブジェクトブラウザーが標準で付いているのが魅力的
 (結構エラーになるけども)

 
却下になったもの以外を使って以下の流れをサンプルにしてみたいと思います。

1,データベースファイル作成
2,テーブル作成(ODB除く)
3,サンプルデータ追加
4,いろんな条件で検索
5,CRUD基本動作

おまけとして
6,バックアップ&リストア
7,データメンテナンスの仕方 

HSQLDBを使ってみた

色々と試行錯誤しましたが最終的なサンプルとして。

実行環境は相変わらずWindowsですが、パスは絶対パスで指定する場合は // から始めないといけないようでした。
あと、
sql.execute("COMMIT;")
sql.execute("SHUTDOWN;")
は必須みたいで忘れるとそれまでの作業が無かった事になるので注意が必要なようです。
途中例外が発生した場合はロックされたままになるので、SHUTDOWNをちゃんとするようにしたほうが良さそう。

@Grab(group='org.hsqldb', module='hsqldb', version='2.2.4')
@GrabConfig(systemClassLoader=true)
import groovy.sql.Sql

driver = 'org.hsqldb.jdbcDriver'
path   = '//E:/TestDB'

sql = Sql.newInstance("jdbc:hsqldb:file:$path", "", "", "$driver")
sql.execute("DROP TABLE TestTable IF EXISTS;")
sql.execute("CREATE TABLE TestTable (ID INT NOT NULL, Name VARCHAR(30));")
sql.execute("INSERT INTO TestTable(ID, Name) VALUES(1, 'Test1');")
sql.execute("INSERT INTO TestTable(ID, Name) VALUES(2, 'Test2');")
sql.execute("INSERT INTO TestTable(ID, Name) VALUES(3, 'Test3');")
sql.execute("DELETE FROM TestTable Where ID = 3;")
sql.execute("COMMIT;")

sql.eachRow("SELECT * FROM TestTable") {
    println "$it.id:$it.name"
}

sql.execute("SHUTDOWN;")

LibreOfficeのBaseで扱えるようにしたかったけど、それが出来なかったので宿題。

NetBeansのユーザフォルダを変更する(Windows)

NetBeansをインストールしたフォルダにあるコンフィグファイル、Windowsの場合は
C:\ApplicationUserData\etc\netbeans.conf
を開いて

# ${HOME} will be replaced by JVM user.home system property
netbeans_default_userdir="${HOME}/.netbeans/7.0"

# ${HOME} will be replaced by JVM user.home system property
netbeans_default_userdir="D:\ApplicationUserData\.netbeans\7.0"

のように変更するとそこにユーザフォルダが生成されるようになる。

iReportでも同じようにユーザフォルダの場所を変更する事が出来ました。
他のもできるはずですが、GIMPがちょっと見てもわかんなかったので放置。

Hibernateでの検索高速化(個人的に)

Hibernateで検索処理を実装する時に、普段は

Criteria criteria = session.createCriteria(Hoge.class);
criteria.add(Restrictions.eq("Delete", false));
  :
  様々な条件設定
  :
List<Hoge> list = criteria.list();
for(Hoge hoge : list) {
 :
 テーブルに表示など
 :
}

としていたのですが、マッピング定義がイマイチ苦手なせいか、クラスによっては
検索に数十秒掛かる状態になっていました。

criteria.setFetchMode("HogeDetail", FetchMode.JOIN);

の様に関連のあるクラスをsetFetchMode()で連結することで高速化も図れますが、
イマイチ高速化は図れずという状態でした。
実はそんな状態を数ヶ月放置していたのですが、そういえばと思って下の方法を試してみました。

Criteria criteria = session.createCriteria(Hoge.class);
criteria.add(Restrictions.eq("Delete", false));
  :
  様々な条件設定
  :
// 上記条件にマッチする主キーの一覧を取得
criteria.setProjection(Projections.groupProperty("CD"));
List<Integer> keyList = criteria.list();

// 主キー一覧をIn条件に設定する
criteria = session.createCriteria(Hoge.class);
criteria.add(Restrictions.in("CD", keyList));

List<Hoge> list = criteria.list();
for(Hoge hoge : list) {
 :
 テーブルに表示など
 :
}

条件にマッチする主キーをListで受け取り、それに対してInを指定するという流れです。

結果的に検索時間は5分の1位に短縮されました。
それでもまだ遅いですし、そもそもマッピング定義が多分ダメなので
根本的な解決にはなりませんが、恒久的な暫定対応と言うダメな感覚で。。