2012年7月30日月曜日

Javaのジェネリクスのコンパイルエラー

よくわからないコンパイルエラーに遭遇したからそのメモ。未解決。。。 -> 追記(2012/08/22)

例えば、
ArrayList<Double> data = new ArrayList<Double>();
として、
javac -1.6 *.java
とコンパイルすると

The type ArrayList is not generic; it cannot be parameterized with arguments <Double>

と言われた。

ちなみに

$javac -version
Eclipse Java Compiler v_677_R32x, 3.2.1 release, Copyright IBM Corp 2000, 2006. All rights reserved.

バージョン的にはgenericを使えそうな気がするけど。。。
今のところ原因は不明。

普段は別なコンパイラ使ってるから問題ないけど、なんか気になる。


追記(2012/08/22)
どうやら単純に javac のバージョンが古かっただけみたい。
つまり、javac コマンドのときに -1.6 というオプションを付けていても対応しきれてない部分がある感じ。
なんとなくそんな気がする。
なぜジェネリクスだけがひっかかるのかは謎。。。

2012年7月12日木曜日

SAC で色を付けてプロット

複数の波形を読み込んで p2 とかでプロットするときには、色分けしてないと見にくい。
波形を色分けするには

p2 color on increment

としておけば、それぞれ違う色でプロットされる。
ただし、このままではデフォルトのカラーリストが読み込まれて、

Red, Green, Blue, Yellow, Cyan, Magenta, Black

となっていて、白い背景に黄色は非常に見づらい。というか見えない。

ということで、自分で色を指定する。
赤、緑、青でプロットしたい場合

p2 color on increment list red green blue

とすればいい。

ちなみに、同時に

background black
とか
skeleton blue

とかすると、背景と軸の色も変えられる。

Javaで計算時間を測る

計算時間を測るために、開始時と終了時の時間を取得して表示する

long start = System.currentTimeMilis();

  {処理}

long end = System.currentTimeMillis();
System.out.println("Calculation Time: " + (end-start)/1000. + " sec");

これは実時間を計測している。
つまり、どのくらいCPUを使ったかとかではなく、現実にかかった時間。
途中で何かのトラブルでCPUをフルに使えなかった場合なんかは、その分時間がかかる。

上の例では単純に計算にかかった時間を表示している。
夜中にバックグラウンドで計算させておいて、朝にいつ計算が終わったのかを知りたいときなんかもある。
そんなときには Date クラスを使う。
Date クラスは非推奨のメソッドがいくつかあるけど、今回の目的にはこれで十分だし、便利。

さっきと同じように、最初と最後に処理をして、計算の開始時刻と終了時刻を timestamp.txt に書き込む。

Date start = new Date();

  {処理}

Date end = new Date();
try{
  BufferedWriter bw = new BufferedWriter(new FileWriter("timestamp.txt"));
  bw.write("start: " + start);
  bw.newLine();
  bw.write("end: " + end);
  bw.flush();
  bw.close();
}
catch(IOException ioe){
  ioe.printStackTrace();
}

としておくと、timestamp.txt に開始時刻と終了時刻が
曜日 月 DD HH:MM:SS タイムゾーン YYYY
のフォーマットで書き込まれる。
タイムゾーンは、例えば、中央ヨーロッパの夏時間なら CEST と書き込まれる。




2012年7月6日金曜日

シェルスクリプトの中でSACを使う

SAC にはフィルターとか便利な関数がいろいろ入ってる。
それに、例えば、SAC ファイルのある時刻を切り出すのを複数のファイルに対して行いたい場合とか、シェルスクリプトの中から SAC を呼び出すと便利。

以下は、abc.sac の10秒から20秒まで切り出して、abc_10_20.sac として保存する場合。

#!/bin/bash

sac << EOF > /dev/null
  cut 10 20
  r abc.sac
  w abc_10_20.sac
  q
EOF

出力は邪魔なので /dev/null に投げてしまう。
注意する点は、最後に q がないと怒られる。。

2012年7月4日水曜日

ファイルの中身を後ろから表示

ファイルの最後を確認したい場合とか

tac abc.txt | more

tac がファイルの後ろから逆に表示させるコマンド。
このままだと全部表示されちゃうので、 more に投げて、一画面ごとに表示させる。

2012年7月3日火曜日

Java でデータファイルの読み込み

データを読み込むとき、昔なら StringTokenizer を使っていたけど、推奨されてないから、split を使う。

昔バージョン
try {
 BufferedReader br = new BufferedReader(new FileReader("abc.txt"));
 String line;
 while((line=br.readLine) != null){
  StringTokenizer st = new StringTokenizer(line);
  st.nextToken();
  data.add(Double.valueOf(st.nextToken()));
 }
 br.close()
}
catch(IOException ioe){
 ioe.printStackTrace();
}

abc.txt ファイルの中身の2列目を Doubleにしてから data リストに追加している。
例えば、1列目が時間で2列目がデータの時系列を読む場合とか。

で、今では
try {
 BufferedReader br = new BufferedReader(new FileReader("abc.txt"));
 String line;
 while((line=br.readLine) != null){
  String[] elements = line.split("\t");
  data.add(Double.valueOf(elements[1]));
 }
 br.close()
}
catch(IOException ioe){
 ioe.printStackTrace();
}
とすればいい。
たいして変わらないけど。