H2 の Embedded モードではファイルは何処に作られる? [NT]
HSQLDB、Derby も良さそうなんだけど、それ以上に評判のよさそうな H2 を試している。用途は今のところ組み込みのみ。サーバ用途での利用は考えていない。
H2 の Embedded モードでアプリケーションから H2に Connection を作成するには、h2 の jar ファイルをクラスパスに通してから、アプリケーションのコードで
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:test", "sa", "");
とすれば良い。ここで、test という部分がデータベースのファイルになる。NetBeans で適当なプロジェクトを作り上記の設定で Connection を開いたところ、プロジェクトディレクトリ直下に test*.db ファイルが作成された。プロジェクトディレクトリ直下とは build.xml があるディレクトリのこと。
test が作成されるディレクトリを変更するには
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:n:/test", "sa", "");
とする。 この場合、Windows ならば n ドライブの直下に test*.db ファイルが作成される。
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:n/test", "sa", "");
の場合は相対パスとなり、NetBeans 上で実行した場合は、プロジェクトディレクトリ直下に n というディレクトリが作成され、その中に test*.db が保存される。
尚、H2 の資料としては公式なマニュアルである http://www.h2database.com/h2.pdf にまとまっている。ただ、組み版は頂けない。もう少し読みやすいと良いと思う。
自動的に表示される広告を外すには? [NT]
ボックス広告表示仕様変更のお知らせ:What's new?:So-netブログ によると、2009年5月14日以降、
■対象ブログ
・最終更新日より60日以上更新がないブログ
・サイドバーにボックス広告が表示されていないブログ
・So-net ユーザーIDでご利用のブログ
■表示箇所
・サイドバーの「プロフィール」の下部
・サイドバーに「プロフィール」の表示がない場合は、サイドバーの一番上
の条件で広告が表示されることになった。
それは別に構わないのだが、プロフィールの下部に表示された広告はどうやって削除するのだろうか?
調べたところ、ボックス広告(旧サイドバー広告):使い方 マニュアル:So-netブログ に答えはあった。
最終更新日から60日以上更新のないブログには、ボックス広告がサイドバーに自動的に表示されます。
自動的に表示されたボックス広告は、記事を投稿し、管理ページの[レイアウト]のページでボックス広告を外すことができます。
ボックス広告表示仕様変更のお知らせ:What's new?:So-netブログ にも広告を外す方法を記載しておくか、リンクを張っておいて欲しかった。
なお、これによって表示された広告は、記事の投稿・更新を行うことで、管理ページより外すことができるようになります。
とは書いてあるけれど、 できれば、『[レイアウト]のページでボックス広告を外す』の部分も重要じゃないかな?
数字のタッチタイピング(ブラインドタッチ)を練習するには? [NT]
私は英文字のタッチタイピング(ブラインドタッチ)は、困らない程度にできるが、数字キーのブラインドタッチは出来るとは言い難い。
そこで、数字のタッチタイピングを練習するのに便利なソフトとWEBサイトを調べたので備忘録代わりに紹介する。
タッチタイピングを練習するソフト。数字キーのみの練習モードがあり、また、キーのガイドを表示することも出来る。どのキーをどれくらい間違えたのかなど詳細な履歴も確認できる。フリーソフト。
タイピング型ガンシューティングゲーム。数字キーのみ使用する。 Adobe Flash で作成されている。Adobe Flash は大抵の PC にはインストールされているので、ブラウザでアクセスするだけで使えるのが便利。
タイピングゲーム。一定の数をタイピングすると数字の列が増え、あるタイミングで「コンボ」が発生しスコアが加算されるようだ。ゲーム性が他の2つに比べ強い。NO SHOT と同様に Adobe Flash で作成されているので、大抵、ブラウザでアクセスすれば利用できる。
e-typing はインターネットでタイピングできるサイト。様々な状況でタイピングの練習ができ、スコアを登録してランキングで競い合える。数字キーの入力をマスターしたいのなら「タイピング バラエティ」-「ビジネス」-「金額」がお勧め。「金額」なので、「,」や「ENN」などの入力も求められるが、これはこれで練習になるだろう。 「タイピング バラエティ」-「テンキー」もあるのだけれど、これは、完全にテンキー向けで数字キーのタッチタイピング向けとは言い難い。 このサイトも Adobe Flash で作成されているので、大抵、ブラウザでアクセスすれば利用できる。e-typing の利点は画面の下段にキーのガイドが表示される点。キーの入力に慣れるまでは便利。
数字キーのタッチタイピングを純粋にマスターしたいのなら タイプウェルオリジナル がお勧め。ある程度出来るようになったら、「フラッシュゲーム NO SHOT(ナンバーショット)」、「ふわふわピエロ(タイピングゲーム)」、「e-typing {インターネットでタイピング練習}」で高得点を狙うと良いかも。
ジャンクションを利用してリンクを張るには? [NT]
Subversion + NetBeans 6.5 + Dropbox の問題 の続き。
Subversion のパスに空白が含まれてしまうために問題が生じていた。これをジャンクションを利用して解決してみる。
ジャンクションとはディレクトリに対するシンボリックリンクみたいなものである。Windows 2000 以降でファイルシステムが NTFS なら利用できる。
ジャンクションを作成するソフトウェアは幾つかあるが、リンク作成シェル拡張 for Windows 2000/2003/XP 再配布ページ を利用した。ソフトの説明は 窓の杜 - 【NEWS】NTFS用ハードリンク作成ソフト「リンク作成シェル拡張 for Windows 2000」 がわかりやすい。
ただ、注意点としてはジャンクションとして作成したディレクトリを削除する場合、リンク元のディレクトが削除されてしまうようだ。詳しくは ジャンクションの罠 | 水無月ばけらのえび日記 を参照。
しかし、私が実験してみたところ、explorer で削除(ゴミ箱へ移動したわけではない)した限りでは、ジャンクションとして作成したディレクトリのみが削除され、リンク元のディレクトリ内容は維持された。安全のためには RD コマンドを利用した方が良いだろう。
ジャンクションを利用して N:\dropbox\My Dropbox\Repository を N:\Repository へリンクを張った。この後に、NetBeans でプロジェクトを Subversion からインポートし直し、ファイルの履歴を参照したところ、次図のように期待する動作を得た。
そもそも、Dropbox が管理しているディレクトリは必ず「My Dropbox」というディレクトリ以下になるのがよろしくない。
この問題に関しては Dropbox の User Forum でも意見が出ている。
- Location of Dropbox-Folder - I really becoming angry! « Dropbox Forums
- DropboxPath - change or move dropbox folder name without reinstall « Dropbox Forums
Subversion + NetBeans 6.5 + Dropbox の問題 [NT]
Subversion のリポジトリをバックアップするのが手間なので、Dropbox のディレクトリに置いている。
こうすれば自動的にバックアップが取得されるので便利だ。
ただ問題が一つあった。NetBeans 6.5 で Subversion を利用しているときに、Dropbox のディレクトリのリポジトリを参照していると、履歴を検索できない。例えば、次図のように実行して履歴を検索すると...
このように、SVN が失敗してしまう。コミットやチェックアウトは問題なくできたので、これまで放っておいたのだが、やはり面倒だ。
SVN が失敗してしまう理由は、リポジトリに空白が含まれているパスを利用しているからかなと見当を付けていた。
しかし、リポジトリを Dropbox の管理下に置きたい。そこで、ジャンクションを利用することにした。
続く。
java.exe に SIGINT を送信するには? [NT]
ant の java タスクで起動したプログラムは CTRL-C を受け取れない の続き。
CTRL-C は SIGINT シグナルのことである。だから、java.exe に CTRL-C を送信できれば、必ずしもターミナルから送信する必要は無い。
結局、kill コマンドを使えばよい。windows の場合でも kill コマンドは存在する。
最終的に、
tlist | grep bin\\java.exe | tail -n 1 | groovy -n -e " println line.split(' ')[0]" | xargs kill
という one-liner で処理することにした。
tlist でプロセスの一覧を出力し、それから bin\\java.exe が含まれる行のみを取り出し、複数の java.exe が合った場合に備え、最後の 1 行だけを抽出し、その行を空白を区切り文字として分割して PID を得て、xargs で kill に渡すと。
grep や xargs の入手については以前に GNU utilities for Win32:experiment に記載した。
わざわざ groovy を使う必要は無く、ruby -e でも awk でも、なんでもできそうだけど、split が簡単に使えたのと、少し前に groovy をインストールしたので使ってみたかった、というどうでも良い理由による。
で、上記 one-liner を bat として置いておけば、簡単に runserver した java.exe を停止できる。
java.exe を runserver 以外で使わないという条件があるけど、その条件を回避するのは手間の費用対効果の観点から実装しない。
ant の java タスクで起動したプログラムは CTRL-C を受け取れない [NT]
GAE/J の開発で ant を使うと java.exe プロセスが残る の続き。
java.exe プロセスが残る原因は、ant と google の runserver の仕様に原因があった。
ant は java タスクを記述すると ant から java コマンドを起動できる。 その詳細は Java Task に記載されている。
runserver は実際には java コマンドを fork=true で呼び出している。この場合、ant の java とは別の java プロセスが実行される。
新しく起動した java プロセスの標準入力として input か inputstring 属性を利用できるが、インタラクティブに CTRL-C を送信する方法を見つけることはできなかった。
Nabble - Ant - Users - How to kill child process with control-c でも似たような議論があるけれど、結局 fork しないで java コマンドを使えばできるかも(適当な意訳)となっていて、質問者が最終的にどうしたのかはよく分からない。
GAE/J の SDK がバージョンアップ [NT]
Google App Engine の Java 版(ここでは GAE/J と表記する)の話。
UTF-8で日本語表示が可能に:「Google App Engine SDK for Java 1.2.1」リリース - ITmedia エンタープライズ によると 2009/05/13 付けで Google App Engine SDK が公開された。
Google の公式発表は Google App Engine Blog: Java SDK version 1.2.1 now available 。
これまでは、*.jsp ファイルにシステムのデフォルトエンコーディングしか利用できなかった。 例えば、Windows なら Shift_JIS(正確にはちょっと違うらしいけど)が利用される。
エンコーディングを変更できない不具合は GAE のフォーラム でも幾つかトピックがあがっていて、しょうがないから、jar をデコンパイルしてパッチを作った人もいた。そこまですると、規約的にまずいかなーと思っていたところ、Google が正式に修正版を出したので、一安心。
まだ Early Look なのでバグが枯れるには、しばし時間がかかりそう。
GAE/J の開発で ant を使うと java.exe プロセスが残る [NT]
Google App Engine の Java 版(ここでは GAE/J と表記する)の話。
GAE/J で Web アプリケーションを開発してサーバにアップロードする前に local で動作確認をすることを考える。
GAE/J では ant スクリプトが用意されていて、ant runserver と記述するとテスト用のサーバが起動する。起動したサーバを停止しようとして「CTRL-C」をタイプすると、ant は終了するが、プロセスを確認すると java.exe が残ったままになる。
この java.exe はサーバプロセスであり、内部的には jetty のようだ。
The Java Development Server - Google App Engine - Google Code によると、Running the Development Web Server 節で、
appengine-java-sdk\bin\dev_appserver.cmd [options] war-location
を実行してサーバを起動して、終了するときは
To stop the web server, press Control-C (on Windows, Mac or Linux).
とある。 Google の資料のように dev_appserver.cmd を利用した場合、CTRL-C でサーバは停止し、java.exe プロセスは残らない。しかし、ant runserver の場合はプロセスが残ってしまう。
もしかして、ant.bat/ant.cmd を実行しているのが問題なのかと思い、ant を java コマンドで起動してみた。ant を java コマンドで起動するには Running Apache Ant の解説を読むと良い。ant を java コマンドで起動した場合であっても runserver すると java.exe プロセスが残ってしまった。
runserver で動作しているサーバは内部的には jetty のようだ。jetty の場合は、Running Jetty-6.1.x - Jetty - Codehaus の Stopping にある操作をすると別のシェルから jetty を停止できる。
java - Java アプリケーション起動ツール などによると、java コマンドの -D オプションは JVM に対して与えるプロパティである。ant runserver から呼び出される ant-macros.xml に jetty の -D オプションを追加したが netstat -a で確認すると、STOP 用のポートは開かれない。
ant-macros.xml を解析すると com.google.appengine.tools.KickStart を呼び出しているので、直接 java コマンドで KickStart と -D オプションを付けてみたりもしたが、やはり STOP 用のポートは開かれない。STOP 用のポートは jetty の start.jar で処理しているのかもしれない。
結局、 dev_appserver を直接呼び出した場合はプロスセスが残らないので、ant との組み合わせの問題か、ant スクリプトの記述方法が問題なのかもしれない。dev_appserver の末端まで CTRL-C が通知できていない気がするんだよね~。
※私は Windows 2000 で動作確認しているので、他の環境では結果が異なるかもしれません。
[追記]このエントリには続きがあります。
GAE/J の Datastore API では Map を保存できない [NT]
Google App Engine の Java 版(ここでは GAE/J と表記する)の話。
GAE/J ではデータベース(RDB)は使用できない。その代わりに Datastoe API を利用する。これは、JDO とか JPA を利用して、要は、オブジェクトをシリアライズして保存しましょうという機能である。
あるデータを保存したいとする。保存したいデータは entity という役割を持つクラスにまとめる必要があり、最終的に entity のプロパティとして格納する必要がある。これらの仕様は Defining Data Classes - Google App Engine - Google Code に記載されている。
問題はそのページの「Collections」である。一部を引用する。
A datastore property can have more than one value. In JDO, this is represented by a single field with a Collection type, where the collection is of one of the core value types or a Serializable class. The following Collection types are supported:
- java.util.ArrayList<...>
- java.util.HashSet<...>
- java.util.LinkedHashSet<...>
- java.util.LinkedList<...>
- java.util.List<...>
- java.util.Set<...>
- java.util.SortedSet<...>
- java.util.Stack<...>
- java.util.TreeSet<...>
- java.util.Vector<...>
上記リストには Map インターフェースを実装するクラス(例えば、HashMap、TreeMap)が無い。
試しに TreeMap を保存しようとしたところ次の例外が発生した。
Map が使えないとちょっと不便だが、Map を使いたいのならば、素直に、key、value の組み合わせ自体を JDO で書き込んで欲しいということかな?