プログラミングに関する私的メモ

java

最終更新:

gen3

- view
だれでも歓迎! 編集

java

javaドキュメンテーションコメント多言語フィルタ

2013-11-23 以下はあまり役に立たないアイデア。javascriptにでも既定の言語を検出して表示するdivを選択するようなコードを書くほうがすっきりする。
javadocを多言語化する方法として、ドキュメントコメントを例えば次のように書いておき、
/**
 * <div lang="ja">これは日本語のコメントです。
 * 第二行目から詳細コメントになるのはjavadocの仕様です。
 * </div>
 * <div lang="en">This is a English comment.
 * The second line and belows are details, because of javadoc specification.
 * </div>
 */
 void Dummy() {}
これを処理するdocletで例えば
-sellang ja
とすれば
 void Dummy()
      これは日本語のコメントです。
       第二行目から詳細コメントになるのはjavadocの仕様です。
となり
-sellang en,ja
とすれば
 void Dummy()
      This is a English comment.
      The second line and belows are details, because of javadoc specification.
      これは日本語のコメントです。第二行目から詳細コメントになるのはjavadocの仕様です。     
となるようなカスタムdocletが比較的簡単に作れる気がする。
docletの処理内容は、単に<div lang=xx>のブロックを選択したり並べ替えたりするだけで、あとは標準のjavadocの処理に任せればよい。
まあ、@xxxみたいなタグもあるので<span lang="ja">みたいなのも処理できたほうがいいのかな。
というわけで書いてみたらわりと目処が付いたみたいなので、そのうち公開予定。

javaでMP3ファイルのID3タグを読む

JavaでID3タグを見る件に関しては、Java ID3 Tag Libraryが老舗らしい。
ファイルオブジェクトを引数としてコンストラクタを呼べば、
取得したオブジェクトからID3の中身の曲名とかアルバムタイトルとかを各種getメソッドで取得できるらしい。設定も出来る模様。日本語環境で扱う場合は文字エンコードに注意しなければならないこともある様子だが。

java.util.logging.Loggerの設定がgetConnectionで書き換わるバグ...ではなかった

以下は
System.setProperty("hsqldb.reconfig_logging", "false");
とすればよい、とHSQLDBのヘルプフォーラムで回答をもらった。以下は同様にはまるかもしれないヒトのために整理しながら残しておく。

getConnectionの後に、java.util.Loggerのメッセージが出なくなるとかで悩んだ。
以下、再現可能なコード。

   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.sql.SQLException;
   import java.util.logging.Level;
   import java.util.logging.Logger;

   /**
    * 最小構成。新規のパス(URL)を与えて新たにDBを作成すると、Connectionの後のLOGが出ない。
    * @author usr1
    */
   public class LogTest {
       private static final Logger LOG = Logger.getLogger("TEST");

       public static void main(String[] args) {
           LOG.setLevel(Level.ALL);
           Connection c = null;
           try {
               LOG.info("getConnection前");
               System.out.println(LOG.getParent().getHandlers()[0].getFormatter().getClass().getName());
               c = DriverManager.getConnection("jdbc:hsqldb:file://" + args[0] + ";shutdown=true;", "SA", "");
               System.out.println(LOG.getParent().getHandlers()[0].getFormatter().getClass().getName());
               LOG.setLevel(Level.ALL);
               LOG.info("getConnection後");
               c.close();
           } catch (SQLException e) {
           }
       }
   }
上記のコードにて、DBのパスを書き換えた直後の実行(つまり新たなDBを作成して接続する場合)では、以下のようにログメッセージ「getConnection後」が出力されない。Loggerのフォーマッタやハンドラが書き換わってしまっている。
(1回目)
C:\>java -jar LoggerTest.jar c:\test\test99
11 23, 2013 1:00:29 午後 newpackage.LogTest main
情報: getConnection前
java.util.logging.SimpleFormatter
org.hsqldb.lib.BasicTextJdkLogFormatter
(2回目)
C:\>java -jar LoggerTest.jar c:\test\test99
11 23, 2013 1:00:44 午後 newpackage.LogTest main
情報: getConnection前
java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter
11 23, 2013 1:00:46 午後 newpackage.LogTest main
情報: getConnection後

上のように常に二回目以後が大丈夫ならまだいいのだが、これとは違うもっと大きなコードの中では二回目以後も出力されずに困る。
Logger.getGlobal().setLevel(Level.INFO)
も試したが効果は無い。
ネットを検索するとJava SE 7 の logger にはバグがあるそうだが、それとの関係は不明。
NetBeansのデバッグモードで見るとLOG.manager.propsは正常なら9個の配列で、
LOG.manager.props[3]
"java.util.logging.ConsoleHandler.formatter => java.util.logging.SimpleFormatter"
とコンソールへの出力が標準のフォーマッタに設定されている。
これが新規のパスにgetConnectionした後だと、
java.util.logging.ConsoleHandler.formatter => org.hsqldb.lib.BasicTextJdkLogFormatter
という結果になり、DriverManagerがログの設定を書き換えたまま戻していないようである。

HSQLDBのヘルプフォーラムで質問すると速攻で
System.setProperty("hsqldb.reconfig_logging", "false");
で解決すると回答をもらった。HSQLDBは2,3のシステムプロパティを使っているとのこと。


添付ファイル
最近更新されたページ