外部コマンドの実行

同じWindowsバッチに異なる引数を渡して何度も実行したかったのだが、毎回引数を設定するのが煩わしかったので、どうにかして引数を自動で設定できないかと模索してたら、javaで外部コマンドを実行できるとのこと!
早速、簡単な外部コマンドを実行するプログラムを作ってみた。

実行環境

サンプル

以下のプロセスを実行したい。
cmd.exe /c date /T*1

サンプルコード

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * 
 * @author hmeguro
 *
 */
public class ExecCmd {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// 日付出力コマンド
			ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "date", "/T");
			// プロセス開始
			Process process = pb.start();
			
			// プロセスが終了するまで待機
			process.waitFor();
			
			// 結果を標準出力に書き出す
			System.out.println("↓ プロセス実行結果");
			System.out.println("==================================================================");
			BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
			String str;
			while ((str = in.readLine()) != null) {
				System.out.println(str);
			}
			System.out.println("==================================================================");
			
			// プロセスのexit値を取得・表示
			System.out.println("プロセスの終了値 : " + process.exitValue());
			
			// 終了処理作業
			process.destroy();
			in.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

実行結果

↓ プロセス実行結果
==================================================================
2009/06/26 
==================================================================
プロセスの終了値 : 0

うまく出力できた。
引数を設定してバッチ処理を行う場合は

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "date", "/T");

の部分を

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "start", "/wait", "<バッチファイル名>", "<引数>");

にすればいけるはず!

*1:コマンドプロンプト起動と同時に本日の日付を表示する

ロックの解除方法

あるアプリのデバッグ中に、間違ってAPサーバを停止してしまい、ロックされたままになってしまった。
その時に調べたロックの解除方法。

ロック原因のセッション抽出

 SELECT SID,
        SERIAL#
   FROM V$SESSION
  WHERE SID IN (SELECT SID
                  FROM V$LOCK
                  WHERE TYPE IN ('TM','TX')
               );

つまり、表ロック、行ロックを保持するセッションIDを含むセッションIDとセッション・シリアル番号を抽出しています。

ロックの解除

 ALTER SYSTEM KILL SESSION '<SID>, <SERIAL#>';

※SID、SERIAL#には、さきほど抽出したセッション情報を入力します。

注意事項

DBA権限がないと、上記のクエリは実行できないです。

最後に

APサーバが停止時に、自動的にロールバックするようにすればいいんじゃね?
今度、作成してみよう!!

Hello World!

最近、よく聞くscalaという言語を使ってみた。

以下のサイトより、ダウンロード
Download | The Scala Programming Language

Hello Worldをやってみる。

object HelloWorld {
	def main(args: Array[String]) = {
		println("Hello World!");
	}
}

コンパイル方法

C:\scala>scalac HelloWorld.scala

コンパイルすると、HelloWorld$.classとHelloWorld.classの2種類のファイルが生成される。

実行方法

C:\scala>scala HelloWorld
Hello World!

ちゃんと表示された。

scalaだと、行末にセミコロンを書かなくてもよいらしいが、違和感があるので書きたくなるなぁ…