TITLE:Java Tips

Posted by at 2011-01-25

Java Tips

概要

Java のデバッグ(Swing)、Java用のバッチファイル、API-doc 翻訳などに関するメモをまとめています。

Swing debug agent

Javadoc 翻訳

Javadoc

  • Javadoc/Japanese
    • 日本語訳で修正した方が良さそうなもの。
  • Javadoc/Nitpick
    • 翻訳元から修正した方が良さそうなもの。
  • Javadoc/Typo
    • Typo、変換ミスなど。
  • Javadoc/JDK7
    • Java SE 7 API のドキュメントで未翻訳なもの(主にSwing関係)。

JRuby

「Java Swing Hacks」本のレビュー

Java その他

  • Java API Doc の「日本語、英語」をブックマークレットで切り替える
    • JavaのAPIドキュメントをブックマークレットを使って、日本語と英語で切り替えます。

Java メモ

環境変数

  • http://cr.openjdk.java.net/~gbenson/zero-08/raw_files/new/hotspot/src/share/vm/utilities/vmError.cpp
    // List of environment variables that should be reported in error log file.
    const char *env_list[] = {
      // All platforms
      "JAVA_HOME", "JRE_HOME", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "CLASSPATH",
      "JAVA_COMPILER", "PATH", "USERNAME",
    
      // Env variables that are defined on Solaris/Linux
      "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY",
      "HOSTTYPE", "OSTYPE", "ARCH", "MACHTYPE",
    
      // defined on Linux
      "LD_ASSUME_KERNEL", "_JAVA_SR_SIGNUM",
    
      // defined on Windows
      "OS", "PROCESSOR_IDENTIFIER", "_ALT_JAVA_HOME_DIR",
    
      (const char *)0
    };
    

コマンドプロンプトからデフォルトのロケールを変更

> javac -J-Duser.language=en Test.java
> java -Duser.language=en Test
  • Java 国際化 FAQ
    アプリケーションの外部からデフォルトのロケールを設定できますか。
    
    使用している Java プラットフォームの実装によって異なります。通常、初期のデフォルトロケールは、ホストオペレーティングシステムのロケールによって決まります。Sun の JRE のバージョン 1.4 以降では、コマンド行から user.language、user.country、および user.variant の各システムプロパティを設定することで、初期のデフォルトロケールを変更できます。たとえば、初期のデフォルトロケールとして Locale("th", "TH", "TH") を選択するには、次のコマンドを使用します。
    java -Duser.language=th -Duser.country=TH -Duser.variant=TH MainClass
    
    この機能を使用できない実行環境もあるため、この機能はテスト目的だけに使用してください。

コード整形

個人的な好みと習慣で、Javaのソースコードのインデントは、エディタでは4space、Webサイトにソースコードを表示する場合は2spaceにしているので、xyzzy などのエディタから以下のように整形。

astyle --style=java --mode=java --indent=spaces=2
astyle --style=java --mode=java --indent=spaces=2 Hoge.java

Markdown 形式の Stack Overflow などにソースコードを貼り付ける場合は、以下のようにして、行頭にタブ(またはスペース4つ)を追加。

astyle --style=java --mode=java --indent=spaces=2 | sed -e "s/^\(.*\)$/\t\1/"
astyle --style=java --mode=java --indent=spaces=2 | sed -e "s/^\(.*\)$/    \1/"

ソースコードのコピー

Java に限らず、以下、Opera 12.50で、Clipboard API を使い、preタグで囲まれたソースコードを簡単にコピーする方法のテスト。

(function() {
  var listener = function(e) {
    var tx = document.createElement("textarea"),
        div = document.createElement("div"),
        closeListener = function(e) {
      switch(e.type) {
        case 'copy':
        case 'cut':
          var dataTransfer = e.clipboardData;
          dataTransfer.items.add(this.innerText, 'text/plain');
          this.parentNode.replaceChild(this.originalPre, this);
          e.preventDefault();
          break;
      }
    };

    tx.style.width  = parseInt(getComputedStyle(this,"").width).toString()+"px";
    tx.style.height = "240px";
    tx.originalPre  = this;

// ctrl-c 無しでコピーできるかもと思ったけど…
//       var event = new ClipboardEvent('copy', { bubbles: true, cancelable: true } );
//       var dataTransfer = event.clipboardData;
//       dataTransfer.items.add("aaaaaaaaaaaaaaaaaaaaaaa", "text/plain");
//       //this.parentNode.replaceChild(this.originalPre, this);
//       document.dispatchEvent(event);
//       //event.preventDefault();

    tx.addEventListener("keydown", function(e) {
      if(e.keyCode=="27") { // ESC
        this.parentNode.replaceChild(this.originalPre, this);
      }
    }, false);
    tx.addEventListener("dblclick", function(e) {
      this.parentNode.replaceChild(this.originalPre, this);
    }, false);
    div.innerHTML = this.innerHTML.replace(/<br[ \/]*>/ig, "\n").replace(/<.*?>/mg, "");
    tx.value = div.childNodes[0].nodeValue.replace(/\xA0/g, ' ');
    this.tx = tx;
    this.parentNode.replaceChild(this.tx, this);
    this.tx.focus();
    this.tx.select();

    tx.addEventListener('copy',     closeListener, false);
    tx.addEventListener('cut',      closeListener, false);
  },
  pre = document.getElementsByTagName("pre"),
  i = 0, len = pre.length;
  for(; i<len; i++) {
    pre[i].addEventListener("dblclick", listener, false);
  }
}());

コメント