Memo/Java

http://dexlab.net/pukiwiki/index.php?Memo%2FJava
 

MenuBar

Java


Windows向けバッチファイル

  • example.jar を起動する例
    1. @echo off
    2. IF EXIST "C:/Program Files/Java/jre8/bin/java.exe" (GOTO JRE8_64)
    3. IF EXIST "C:/Program Files (x86)/Java/jre8/bin/java.exe" (GOTO JRE8_32)
    4. IF EXIST "C:/Program Files/Java/jre7/bin/java.exe" (GOTO JRE7_64)
    5. IF EXIST "C:/Program Files (x86)/Java/jre7/bin/java.exe" (GOTO JRE7_32)
    6.  
    7. GOTO NOTFOUND
    8.  
    9. :JRE8_64
    10. set JAVA_PATH="C:/Program Files/Java/jre8/bin/"
    11. GOTO EXEC
    12.  
    13. :JRE8_32
    14. set JAVA_PATH="C:/Program Files (x86)/Java/jre8/bin/"
    15. GOTO EXEC
    16.  
    17. :JRE7_64
    18. set JAVA_PATH="C:/Program Files/Java/jre7/bin/"
    19. GOTO EXEC
    20.  
    21. :JRE7_32
    22. set JAVA_PATH="C:/Program Files (x86)/Java/jre7/bin/"
    23. GOTO EXEC
    24.  
    25. :NOTFOUND
    26. echo Java Not Found
    27. set JAVA_PATH=
    28. GOTO EXEC
    29.  
    30. :EXEC
    31. %JAVA_PATH%java -version
    32. %JAVA_PATH%java -jar example.jar
    33.  
    34. :END

JVMはDNS解決するとIPアドレスをキャッシュする

JVMのデフォルトでは起動時にDNS解決したIPアドレスを無期限(-1)で使う。
これはAWS ELB等動的にIPアドレスが変わるサービスではトラブルの原因となるため、DNSキャッシュしないか、短めの値を使った方が良い

  • -1は無期限(デフォルト)、0はキャッシュしない
  • networkaddress.cache.ttl=60
  • sun.net.inetaddr.ttl=0
  • sun.net.inetaddr.negative.ttl=0
  1. grep networkaddress.cache.ttl /usr/java/jdk1.8.0_20/jre/lib/security/java.security
  2. #networkaddress.cache.ttl=-1
  • 記事

メモリーダンプを取得する

  • 実行ユーザで取得すると詳細が取れる。サイズが大きいので注意
    1. pgrep -u <USER NAME> java
    2. 2222
    3.  
    4. # または $JAVA_HOME/bin/jps -v | grep [PROCESS_NAME]
    5.  
    6. $JAVA_HOME/bin/jmap -dump:file=/tmp/memorydump.$(date +%Y%m%d).map 2222
    7. gzip /tmp/memorydump.*.map

スレッドダンプ/ヒープダンプを取得する

ログにも出ないようなエラーが発生した時に便利。

  • スレッドダンプの取得。実行ユーザで取得すると詳細が取れる
    1. pgrep -u <USER NAME> java
    2. 2222
    3.  
    4. # または $JAVA_HOME/bin/jps -v | grep [PROCESS_NAME]
    5.  
    6. $JAVA_HOME/bin/jstack -F 2222 | gzip > /tmp/threaddump.$(date +%Y%m%d).log.gz
    • kill -3 [PID] だと、catalina.out に出る
  • ヒープダンプの取得(ヒープサイズによっては数十分程度時間がかかる)
    1. $JAVA_HOME/bin/jmap -F -dump:format=b,file=heapdump.map 2222 | gzip > /tmp/heapdump.$(date +%Y%m%d).log.gz

jps:javaプロセスだけ表示

  • CentOSの場合、jdk-1.6.0, java-1.6.0-openjdk-develパッケージに入っていた
    1. # プロセスID, 実行クラス名
    2. $JAVA_HOME/bin/jps
    3.  
    4. # 実行クラス名が完全修飾名(FQCN)で表示
    5. $JAVA_HOME/bin/jps -l
    6.  
    7. # 詳細情報
    8. $JAVA_HOME/bin/jps -v

入門


Apache Maven

  • wikipedia Apache_Maven
    1. cd /tmp/
    2. wget http://ftp.riken.jp/net/apache/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.tar.gz
    3. tar xvfz apache-maven-3.0.4-bin.tar.gz
    4. sudo mv apache-maven-3.0.4 /usr/share/
    5. sudo ln -s /usr/share/apache-maven-3.0.4 /usr/share/maven
    6.  
    7. sudo vim /etc/profile.d/maven.sh
    8. ----
    9. export M2_HOME=/usr/share/maven
    10. export M2=$M2_HOME/bin
    11. export PATH=$M2:$PATH
    12. ----
    13. source /etc/profile.d/maven.sh

複数バージョンをalternativesで切り替えて使う

CentOS5.x, 6.xをインストールする時にjavaパッケージをインストールすると、デフォルトのjavaとして"gcj"がインストールされる。
他のバージョンのjavaを簡単に切り替えて使うための設定をする

  1. # 追加。複数ファイルで構成されている場合は--slaveオプションも付ける
  2. # --install [シンボリックリンク名] [グループ名] [バイナリ本体] [優先度] \
  3. #   --slave [シンボリックリンク名] [グループ名] [バイナリ本体]
  4. # ※優先度は大きいほど高い
  5. alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_31/bin/java 16031 \
  6.   --slave /usr/bin/jar java-jar /usr/java/jdk1.6.0_31/bin/jar \
  7.   --slave /usr/bin/javac java-javac /usr/java/jdk1.6.0_31/bin/javac \
  8.   --slave /usr/bin/javadoc java-javadoc /usr/java/jdk1.6.0_31/bin/javadoc \
  9.   --slave /usr/bin/javaws java-javaws /usr/java/jdk1.6.0_31/bin/javaws \
  10.   --slave /usr/bin/jcontrol java-jcontrol /usr/java/jdk1.6.0_31/bin/jcontrol
  11.  
  12. # 手動選択
  13. alternatives --config java
  14. # 自動選択
  15. alternatives --set java /usr/java/jdk1.6.0_31/bin/java
  16.  
  17. # 削除
  18. # --remove [グループ名] [削除したいバイナリ本体]
  19. alternatives --remove java /usr/java/jdk1.6.0_31/bin/java
  20.  
  21. # 現在の設定
  22. alternatives --display java
  23. java - ステータスは手動です。
  24. リンクは現在 /usr/java/jdk1.6.0_31/bin/java を指しています。
  25. /usr/java/jdk1.6.0_31/bin/java - 優先項目 30
  26. 現在の「最適」バージョンは /usr/java/jdk1.6.0_31/bin/java です。
  27.  
  28. # 設定情報
  29. ls -l /etc/alternatives/

バージョン確認

  • java
    1. java -version
    2.  
    3. # 複数のjavaがインストールされている場合
    4. alternatives --display java
  • tomcat
    1. ps aux | grep -o -P 'tomcat-\d\.\d' | sort | uniq -c
  • tomcatのバージョン
    1. /opt/tomcat-8.0/bin/version.sh  | grep -i "jvm version"
    2. JVM Version:    1.8.0_66-b17

md5を文字列として取得

  1. import java.security.MessageDigest;
  2. import java.security.NoSuchAlgorithmException;
  3.  
  4. String md5( String str ) throws NoSuchAlgorithmException
  5. {
  6. MessageDigest md = MessageDigest.getInstance("MD5");
  7. byte[] dat = str.getBytes();
  8. md.update(dat);//dat配列からダイジェストを計算する
  9. byte[] digest = md.digest();
  10.  
  11. StringBuilder sb = new StringBuilder();
  12. for (int i = 0; i < digest.length; i++) {
  13. sb.append(String.format("%02x", 0xff & digest[i]));
  14. }
  15. return sb.toString();
  16. }
  17.  
  18. System.out.printf("md5: %s\n", md5("1234567890")); // => md5: e807f1fcf82d132f9bb018ca6738a19f

配列内を検索する

  • http://commons.apache.org/lang/ から commons-lang3-3.0.1-bin.zip をダウンロードし、適当なフォルダに展開
  • プロジェクトを右クリック > ビルド・パス > ビルド・パスの構成 > ライブラリタブ > 外部Jarの追加で指定
  1. import org.apache.commons.lang3.*;
  2.  
  3. String[] string = {"A", "B", "C"};
  4.  
  5. System.out.println(ArrayUtils.indexOf(string, "A")); // => 0
  6. System.out.println(ArrayUtils.indexOf(string, "X")); // => -1

配列のコピー

デフォルトでは参照扱いなので、配列のコピーをしようと思っても参照コピーになる
1次元配列と多次元配列では結果が異なる

  • ディープコピー(値渡し)
    1. Arrays.copyOf(src, src.length); Arrays.copyOfRange(src, from, to); System.arraycopy(src, src_pos, dst, dst_pos, len);
  • シャローコピー(参照渡し)
    1. Object.clone() // 1次元:ディープコピー、多次元:シャローコピー
  • 2次元配列のコピー
    • 失敗
      1. String[][] a = {
      2. { "a", "b", "c"},
      3. { "d", "e", "f"},
      4. };
      5.  
      6. String[][] b = a;
      7. a[0][0]="g";
      8. System.out.printf("%s\n", b[0][0]); // => "g"
    • 単純なループ
      1. String[][] a = {
      2. { "a", "b", "c"},
      3. { "d", "e", "f"},
      4. };
      5.  
      6. String[][] b = new String[2][3];
      7. for(int i=0; i<2; i++){
      8. for(int j=0; j<3; j++){
      9. b[i][j] = a[i][j];
      10. }
      11. }
      12. a[0][0]="g";
      13. System.out.printf("%s\n", b[0][0]); // => "a"
    • Arrays.copyOf()を使う
      1. import java.util.Arrays;
      2.  
      3. String[][] a = {
      4. { "a", "b", "c"},
      5. { "d", "e", "f"},
      6. };
      7.  
      8. String[][] b = new String[2][]; // b=Arrays.copyOf(a, a.length); だとシャローコピーになって失敗
      9. for(int i=0; i<2; i++){
      10. b[i] = Arrays.copyOf(a[i], 3);
      11. }
      12. a[0][0]="g";
      13. System.out.printf("%s\n", b[0][0]); // => "a"

変数のダンプ

  • 変数
    1. String str="test";
    2. System.out.printf("%s\n", str); // test
  • 多次元配列 (JDK 1.5)
    1. import java.util.Arrays;
    2.  
    3. int[][] matrix = { {0,1,2}, {3,4,5}, {6,7,8} };
    4. System.out.println(Arrays.deepToString(matrix)); // [[0, 1, 2], [3, 4, 5], [6, 7, 8]]

キュー構造

  • Queue java 1.5.0以降
    1. import java.util.LinkedList;
    2. import java.util.Queue;
    3.  
    4. Queue<String> q = new LinkedList<String>();
    5. q.offer("1");
    6. q.offer("2");
    7.  
    8. System.out.println(q.poll()); //=> 1
    9. System.out.println(q.poll()); //=> 2

スタック構造

  • Stack java 1.5.0 以降
    1. import java.util.Stack;
    2.  
    3. Stack<String> st = new Stack<String>();
    4. st.push("var");
    5. st.push("foo");
    6.  
    7. System.out.println(st.pop()); //=> foo

ソースの文字コード

  • ソースファイルの文字コード指定
    1. javac -encoding UTF-8 Hello.java
  • 実行時のコード指定
    1. java -Dfile.encoding=UTF-8 Hello
  • UTF-8,UTF8
  • Shift_JIS,SJIS
  • Windows-31J,MS932 : SJIS+Windows拡張文字
  • ISO-2022-JP,ISO2022JP
  • EUC-JP,EUC_JP

空きメモリ量を得る

Runtime.getRuntime().freeMemory()
Runtime.getRuntime().totalMemory()

プリプロセッサを使う

デバック時だけ有効にしたいコード等を使用する事ができる。

  • Cコンパイラのプリプロセッサ機能のみを使う方法 [#v0555ad8]
    • コマンドラインのBorland C++Compiler 5.5が無償提供されているので、その中のcpp32.exeを使う。出力は 「.i」ファイルとなる。
    • Visual Studio の「cl.exe /P」を使う。.CPPしか入力できないので、.javaを.cppにリネームする
    • 参考リンク
  • その他
  • http://denchu.jp/java/
    • JavaDoc?形式(/** 〜 */)のコメント時エラー、__LINE__が展開されない不具合あり。パッチ作成し、作者に報告済み。
    • DoJa?用ビルドスクリプト
      fileDoJa_build_bat.zip
    • パッチ適用後の「JavaPP」「ビルドスクリプト」をパスの通った場所にコピー
    • DoJa?でメニューの設定 -> ビルドの設定で以下のようにする
      • ビルド前スクリプト
        set PATH=C:\WINDOWS\SYSTEM32\;C:\java\j2sdk1.4.2_08\bin;
        JavaPP_start.bat
      • ビルド後スクリプト
        set PATH=C:\WINDOWS\SYSTEM32\;C:\java\j2sdk1.4.2_08\bin;
        JavaPP_end.bat
    • ビルド実行するだけ。ただし、コンパイルに失敗するとソースが元に戻らないので注意が必要。

チェックサム

  • 1byte
    	/**
    	* チェックサム
    	*
    	* @note
    	* - 1byte チェックサム
    	* - 順序エラーは検出できない
    	*/
    	public String checksum(String str)
    	{
    		int sum = 0;
    		byte[] bytes = null;
    		try{
    			bytes = str.getBytes("SJIS");
    		}catch(Exception ex){
    		}
    		for(int i=0; i < bytes.length; i++){
    			sum += bytes[i];
    			sum &= 0xFF;
    		}
    		String s = Integer.toHexString(sum);
    		if(s.length() < 2) s = "0" + s;
    		
    		return s;
    	}

簡単な暗号化

  • rot13
    	/**
    	* rot13
    	*
    	* @note
    	* - シーザー暗号で 13 文字ずらして、かつ大文字小文字を保存する方法を rot13 という。\n
    	* 例えば "a" だったら 13 文字ずらすと "n"、"N" は "A" になる。\n
    	* alphabet は 26 文字なので、rot13 暗号化を 2 回繰り返せば、元に戻る。
    	* - 'a'〜'z'、'A' 〜 'Z'が暗号化される。
    	*/
    	public String rot13(String str)
    	{
    		String buf = null;
    		byte[] bytes = null;
    		try{
    			bytes = str.getBytes("SJIS");
    		}catch(Exception ex){
    		}
    		for(int i=0; i < bytes.length; i++){
    			int c = bytes[i];
    			if ( c < 'A' ){
    			}else if (c <= 'M'){
    				c = (c + 13);
    			}else if (c <= 'Z'){
    				c = (c - 13);
    			}else if (c < 'a'){
    			}else if (c <= 'm'){
    				c = (c + 13);
    			}else if (c <= 'z') {
    				c = (c - 13);
    			}
    			bytes[i] = (byte)c;
    		}
    		try{
    			buf = new String(bytes, "SJIS");
    		}catch(Exception ex){
    		}
    		return buf;
    	}
  • rot47
    	/**
    	* rot47
    	*
    	* @note
    	* - シーザー暗号で 47 文字ずらす。
    	* - 半角英数字が暗号化される。
    	* - 全角文字はそのまま
    	* - 2回関数を呼ぶと平文に戻る
    	*/
    	public String rot47(String str)
    	{
    		String buf = null;
    		byte[] bytes = null;
    		try{
    			bytes = str.getBytes("SJIS");
    		}catch(Exception ex){
    		}
    		for(int i=0; i < bytes.length; i++){
    			int c = bytes[i];
    			if ( c < '!' ){
    			}else if ( c <= 'O' ){
    				c =  (c + 47);
    			}else if ( c <= '~' ){
    				c = (c - 47);
    			}
    			bytes[i] = (byte)c;
    		}
    		try{
    			buf = new String(bytes, "SJIS");
    		}catch(Exception ex){
    		}
    		return buf;
    	}

16進数ダンプ

「sun.misc.HexDumpEncoder?」がある。

byte[] bytes = new byte[100];
for ( int i=0; i<bytes.length; i++ ) bytes[i] = (byte)i;

HexDumpEncoder encoder = new HexDumpEncoder();
System.out.println( encoder.encodeBuffer(bytes) );

try {
    encoder.encodeBuffer( bytes, System.out );
} catch ( IOException ioex ) {}

byte型配列への変換サポート

int a = 1000;
byte b[];
ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeInt(a); // 変数aの内容を書き出す
b = out.toByteArray(); // 書き出した結果のbyte配列を取得
dout.close();
out.close();

負荷テストツールJMeter


添付ファイル: fileJavaPP2.0a_plus.zip 1708件 [詳細] fileJavaPP200a_patch.lzh 1030件 [詳細] fileDoJa_build_bat.zip 1664件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-10-30 (月) 19:04:06 (177d)