---
title: Java Tips
author: aterai
keywords: [Java, install, JAVA_HOME]
description: JDKのインストール、Java Swingのデバッグ方法、環境変数で実行するjava.exeを切り替えるバッチファイルなどのメモ
pubdate: 2011-01-25
---
#contents

* 概要 [#y77453b1]
`JDK`のインストール、`Java Swing`のデバッグ方法、環境変数で実行する`java.exe`を切り替えるバッチファイルなどのメモの一覧です。

* Ubuntu に、oracle-java7 をインストール [#o7e2c25c]
- `apt-get install`でインストール
-- [http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html Install Oracle Java 7 in Ubuntu via PPA Repository ~ Web Upd8: Ubuntu / Linux blog]

 sudo add-apt-repository ppa:webupd8team/java
 sudo apt-get update
 sudo apt-get install oracle-java7-installer
 sudo update-alternatives --config javac

- `tar.gz`をダウンロードしてインストール
-- [http://www.oracle.com/technetwork/java/javase/downloads/index.html Java SE Downloads]から、`jdk-7uxx-linux-xxxx.tar.gz` をダウンロード

 sudo tar zxvf jdk-7u11-linux-i586.tar.gz -C /usr/lib/jvm

 export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_11
 export PATH=$PATH:$JAVA_HOME/bin

* Swing debug agent[#l59af361]
- [[Swingコンポーネントの再描画をJXLayerのDebugPainterを使ってデバッグ>Tips/DebugPainterAgent]]
-- `JXLayer`の`DebugPainter`を使ってコンポーネントの再描画を可視化する`javaagent`を作成してデバッグを行います。

- [[SwingアプリケーションのLookAndFeelを外部から切り替える>Tips/LookAndFeelDebugAgent]]
-- `Swing`アプリケーションの`LookAndFeel`を`agent`を使って外部から切り替えてデバッグします。

* Javadoc 翻訳 [#h4010d75]
[[Javadoc]]に移動

* JRuby [#rd5be1f5]
[[JRuby]]に移動

//* 「Java Swing Hacks」本のレビュー [#ef1cba4d]
//- [http://d.hatena.ne.jp/aterai/20060502 「Java Swing Hacks」本のレビュー - てんぷらメモ@はてな]
//-- [http://d.hatena.ne.jp/aterai/searchdiary?word=%2a%5bSwing%20Hacks%5d 記事一覧]
//-- [http://d.hatena.ne.jp/aterai/archive?word=%2a%5bSwing%20Hacks%5d タイトル一覧]

* Java その他 [#i6c38ca4]
- [[環境変数JAVA_HOMEを変更して使用するJDKを切り替える>Tips/SetJAVA_HOME]]
-- 環境変数`JAVA_HOME`を変更するバッチファイルを作成して、コマンドプロンプトで使用する`JDK`を切り替えます。

- [[Rhinoでgoogle-prettify.jsを実行する>Tips/GooglePrettifyRhino]]
-- `Rhino`で`google-prettify.js`を実行し、ソースコードをハイライトされた`Html`(`google sites`用)に変換します。

- [[JNIでJFrameのHWNDを取得>Tips/JNI_HWND]]
-- `JNI`(`Java Native Interface`)で`JFrame`(`SunAwtFrame`)の`HWND`(ウィンドウハンドル)を取得します。

- Java API Doc の「日本語、英語」をブックマークレットで切り替える
-- [[Java API Doc の「日本語、英語」をブックマークレットで切り替える>JavaScript/APIDocEnJa]]に移動

* Java メモ [#afdfdb63]

** 環境変数 [#n357d6c7]
- http://cr.openjdk.java.net/~gbenson/zero-08/raw_files/new/hotspot/src/share/vm/utilities/vmError.cpp
#code{{
// 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
};
}}

** コマンドプロンプトからデフォルトのロケールを変更 [#p9b18e96]
 > javac -J-Duser.language=en Test.java

 > java -Duser.language=en Test

- [http://java.sun.com/javase/technologies/core/basic/intl/faq_ja.jsp#set-default-locale 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
 
 この機能を使用できない実行環境もあるため、この機能はテスト目的だけに使用してください。

** コード整形 [#k1323c34]
個人的に、`Java`のソースコードのインデントは、エディタでは`4space`、`Web`サイトにソースコードを表示する場合は`2space`にしているので、`xyzzy`の`filter-buffer`(`C-x #`)で`astyle`を呼び出して以下のように整形。

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

コマンドラインなどから、ファイルを指定する場合も同様。

 > astyle --style=java --mode=java --indent=spaces=4 MainPanel.java

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

 astyle --style=java --mode=java --indent=spaces=2 < Hoge.java | sed -e "s/^\(.*\)$/\t\1/" > /dev/clipboard
 astyle --style=java --mode=java --indent=spaces=2 | sed -e "s/^\(.*\)$/\t\1/"
 astyle --style=java --mode=java --indent=spaces=2 | sed -e "s/\A\(.*\)\z/    \1/"

*** Checkstyle(sun_checks.xml) [#dd78623b]
 astyle --style=java --mode=java --indent=spaces=4 --pad-oper --pad-header --unpad-paren

キャストの後にスペースを入れる方法は?
 int h = (int)(.5 + baseline / height);
 //(int)の後に空白を入れたい...
 int h = (int) (.5 + baseline / height);

*** asyle 2.04 [#xbabc1fe]
 $ astyle --version
 Artistic Style Version 2.04

- 以下の様なソースコード(最後の`}`の直後に`EOF`)を`astyle`で変換すると、余計な`}`が追加される?

#code{{
class Hoge
{
    public static void main(String[] args)
    {
        System.out.println("aaaaaaa");
    }
}
}}

- [http://sourceforge.net/p/astyle/bugs/305/ Artistic Style / Bugs / #305 Last character always repeated in output when reading from stdin]
-- 次バージョンで修正される模様

** ブラウザで表示されているソースコードのコピー [#c8b1879b]
[[JavaScriptでpreタグで囲まれたソースコードをtextareaにコピーする>JavaScript/pre2textarea]]に移動

* PMD: GodClass [#vd1a820f]
- [http://pmd.sourceforge.net/pmd-5.0.0/rules/java/design.html Ruleset: Design]
#code{{
/**
  * Very high threshold for WMC (Weighted Method Count). See: Lanza.
  * Object-Oriented Metrics in Practice. Page 16.
  */
private static final int WMC_VERY_HIGH = 47;

/**
 * Few means between 2 and 5. See: Lanza. Object-Oriented Metrics in
 * Practice. Page 18.
 */
private static final int FEW_THRESHOLD = 5;

/**
 * One third is a low value. See: Lanza. Object-Oriented Metrics in
 * Practice. Page 17.
 */
private static final double ONE_THIRD_THRESHOLD = 1.0 / 3.0; //0.33333

if (wmcCounter >= WMC_VERY_HIGH && atfdCounter > FEW_THRESHOLD && tcc < ONE_THIRD_THRESHOLD) {/**
  * Very high threshold for WMC (Weighted Method Count). See: Lanza.
  * Object-Oriented Metrics in Practice. Page 16.
  */
private static final int WMC_VERY_HIGH = 47;

/**
 * Few means between 2 and 5. See: Lanza. Object-Oriented Metrics in
 * Practice. Page 18.
 */
private static final int FEW_THRESHOLD = 5;

/**
 * One third is a low value. See: Lanza. Object-Oriented Metrics in
 * Practice. Page 17.
 */
private static final double ONE_THIRD_THRESHOLD = 1.0 / 3.0; //0.33333

if (wmcCounter >= WMC_VERY_HIGH && atfdCounter > FEW_THRESHOLD && tcc < ONE_THIRD_THRESHOLD) {
}}

* PMD: SimplifiedTernary [#r2a81003]
- [http://pmd.sourceforge.net/snapshot/pmd-java/rules/java/basic.html PMD Java – Basic]
#code{{
public class SimplifiedTernaryTest {
  public static void main(String... args) {
    //boolean condition = true;
    boolean b1 = condition ? true  : something(); // can be as simple as condition || something();
    boolean b2 = condition ? false : something(); // can be as simple as !condition && something();
    boolean b3 = condition ? something() : true;  // can be as simple as !condition || something();
    boolean b4 = condition ? something() : false; // can be as simple as condition && something();
  }
  private static boolean something() {
    return true;
  }
}
}}

- 例:
#code{{
model2 = new BasicDirectoryModel(getFileChooser()) {
  @Override public boolean renameFile(File oldFile, File newFile) {
    //return oldFile.canWrite() ? super.renameFile(oldFile, newFile) : false;
    return oldFile.canWrite() && super.renameFile(oldFile, newFile);
  }
};
}}

- `PMD 5.4.0`
-- `PMD 5.4.0`では、以下のような三項演算子も修正可と誤認識される
--- `repaintRect = prevRollover ? r.union(table.getCellRect(prevRow, prevCol, false)) : r;`
-- [http://sourceforge.net/p/pmd/bugs/1424/ PMD Issues #1424 False negative with ternary operator]

* 偶数・奇数の判断 [#p14852ed]
#code{{
public class EvenOddTest {
  public static void main(String... args) {
    for (int i = 0; i < 5; i++) {
      if (i % 2 == 0) {
        System.out.format("%d is even%n", i);
      } else {
        System.out.format("%d is odd%n", i);
      }
      if ((i & 1) == 0) { // ビット演算子の & は、== より優先順位が低いので(i & 1)と囲む必要がある
        System.out.format("%d is even%n", i);
      } else {
        System.out.format("%d is odd%n", i);
      }
    }
  }
}
}}

* 正の数と負の数を反転 [#t6341d2a]
- [https://community.oracle.com/thread/1253898 How do you Invert signed numbers? | Oracle Community]

#code{{
public class InvertSignedNumbersTest {
  private static void print(int i) {
    System.out.println(i);
    System.out.format(" :%d\n", ~i + 1);
    System.out.format(" :%d\n", (i > 0 ? -1 : 1) * Math.abs(i));
    System.out.format(" :%d\n", ~--i);
  }
  public static void main(String... args) {
    print(256);
    print(-256);
    print(Integer.MAX_VALUE);
    print(Integer.MIN_VALUE + 1);
    print(Integer.MIN_VALUE);
  }
}
}}

* コメント [#k546af30]
#comment
- [[Nitpick]]を[[Javadoc]]以下に分割して移動。 -- &user(aterai); &new{2011-11-11 (金) 16:57:12};

#comment