GWのガイガーカウンタ自作チャレンジ(2台目) ネクスト(22)グラフ化ツール

| | トラックバック(0)
何とも、iPad/iPhone/iPod Touchでは、Javaアプレットが動作しないということなので、グラフを、JPEG画像ファイルへ出力するJavaアプリを作ってみた。これを、定期的に実行して、Webサーバへ置いておけば、iPad/iPhone/iPod Touchでも、グラフとして、自作ガイガーカウンタの計測値が見れる。

gmgraph_20110622.jpgこのJavaアプリのソースプログラムは、、、、


import java.awt.*;
import java.util.*;
import java.io.*;
import java.net.*;
import java.applet.Applet; 
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.geom.*;
import java.io.IOException;

public class test_img 
{

	public static void main(String args[]){

		int sx=2;
		int sy=3;
		int wx=320;
		int wy=240;
		int sz_x = 410;
		int sz_y = 240;
		int oft_y=0;
		int oft_x=100;

		Date dt = new Date();
		Calendar cal = Calendar.getInstance();

		int myYear = cal.get(Calendar.YEAR);
		int myMon = cal.get(Calendar.MONTH) + 1;
		int myDay = cal.get(Calendar.DATE);

		String myDate;

		BufferedImage myImage = new BufferedImage( sz_x, sz_y, 
			BufferedImage.TYPE_INT_BGR);

		try {
			// width=410, height=290
			myImage = ImageIO.read(new File("background.jpg")); // バックグランド画像
		} catch (Exception e) {
			e.printStackTrace();
		}
		Graphics2D off = myImage.createGraphics();
		off.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
			RenderingHints.VALUE_ANTIALIAS_ON);

		myDate = "" + myYear;
		if (myMon < 10) {
			myDate = myDate + "0" ;
		}
		myDate = myDate + myMon;
		if (myDay < 10) {
			myDate = myDate + "0" ;
		}
		myDate = myDate + myDay + ".";

		String url;    String host = "example.com";  // 自分のwebサーバのホスト名
		int port = 80;
		Socket sock;
		BufferedReader sockin;
		BufferedWriter sockout;
		String str;
		int x=30,y=30,h=40,n=3;
		int i=0;
		int j=0;
		int px_cur=0, py_cur=0;
		int px_prv=0, py_prv=0;

		// urlの下記パスは自分のwebサーバのに合わせてね
		url = "http://" + host +  "/demo/gmdata_" + myDate + "csv";
//		System.out.println( url );

		try {
			wx = sx * 24 * 6;
			off.setColor( Color.BLACK );
			off.drawLine(0+oft_x,wy-1+oft_y,
				wx+oft_x,wy-1+oft_y ); // X
			off.drawLine(0+oft_x,wy-10*sy+oft_y,
				wx+oft_x, wy-10*sy+oft_y ); // X

			for (i=0; i<8; i++ ) {
				off.drawLine(0+oft_x,10*i*sy+oft_y,
					wx+oft_x,10*i*sy+oft_y); // X
			}
			off.drawLine(0+oft_x,0+oft_y,
				0+oft_x,wy+oft_y); // Y
			for (i=12; i<(6*24); i+=12 ) {
				off.drawLine(sx*i+oft_x,sy*10+oft_y,
					sx*i+oft_x,wy+oft_y); // Y
			}
			off.drawLine(sx*i+oft_x,0+oft_y,
				sx*i+oft_x,wy+oft_y); // Y

			off.setColor( Color.BLUE );
			off.drawString( "DATE: " + myYear 
				+ "/" + myMon + "/" + myDay, 
				7+oft_x, 15+oft_y );

			sock = new Socket ( host, port );
			sockin = new BufferedReader(
			new InputStreamReader(sock.getInputStream()));
			sockout = new BufferedWriter(
			new OutputStreamWriter(sock.getOutputStream()));

			sockout.write("GET " + url +" HTTP/1.1\r\n");
			sockout.write("Host: " + host + "\r\n");
			sockout.write("Connection: close\r\n");
			sockout.write("\r\n");
			sockout.flush();

			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);
			str = sockin.readLine();
			System.out.println(str);

			int py_sum = 0;

			off.setPaint( Color.red );

			while ((str = sockin.readLine()) != null) {
				System.out.println(str);

				px_cur = j * 1;

				StringTokenizer st = new StringTokenizer(str, ",");
				st.nextToken();
				st.hasMoreTokens();
				py_cur = Integer.valueOf(
					st.nextToken().replaceAll(" ", "" ))*sy;
				py_sum += py_cur;

				off.draw( new Line2D.Double(
					px_prv*sx+oft_x, wy-py_prv+oft_y, 
					px_cur*sx+oft_x, wy-py_cur+oft_y 
				) );

				j++;
				px_prv = px_cur;
				py_prv = py_cur;
			}

			sockout.close();
			sockin.close();
			sock.close();

			int cpm_avg = (py_sum*10) / (j * sy);

			off.setColor( Color.BLUE );
			off.drawString( "J305Beta/Gamma AVG: " 
				+ cpm_avg + "/10 [CPM]", 
				7+oft_x, 28+oft_y );

			} catch (Exception ex) {
				ex.printStackTrace();
			}

			try {
				boolean result 
					= ImageIO.write( myImage, "jpg", 
					new File( "gmgraph_" + myDate + "jpg")); 
				// 何処にグラフ画像を書き出すかの上記パスも、自分のに合わせてね
			} catch( Exception e ) {
				e.printStackTrace();
			}

			System.exit(0);	
	  }
}
こんな感じ。これを、計測プログラムの直後に実行するように、タスクスケージュールしてみている。

【雑感】
  • 取り敢えず、これで、自作ガイガーカウンタ用のソフトウェアの作成は完結。
  • 定点観測は、あくまでもその場所の各論であって、一般論への拡張は、粘性流体たる空気の挙動には、多少のリスクがあるん。微妙な線だが、センサーネットの有用性が高くなるん。
  • しかし、1人月程かかった感。そのまま、会社の外向け作業人件費で金額に換算すると、私の職位だと、200万円ぐらいはとられるな。うち、私の取り分は、半分よりずっと少ないことは、確かだな。自分の人件費入れたら、完成品を買ったほうが安いのが、残念な時代だな
  • これで、次の自作ガイガーカウンタの製作へ、、、そうしないといじくるたんびに、測定が中断で、やくにたあないんね(^_^;)

トラックバック(0)

このブログ記事を参照しているブログ一覧: GWのガイガーカウンタ自作チャレンジ(2台目) ネクスト(22)グラフ化ツール

このブログ記事に対するトラックバックURL: http://the.nerd.jp/blogs/cgi-bin/mt-tb.cgi/4627

リンク用バナ画像

Thank you for visitors:

from 7th, May. 2005

2013年11月

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

MY TWITTER

今月のイラスト/ムービー

応援サイト、その他




Visit RenderSan
<-- script type="text/javascript" src="http://swf.mikunavi.net/miku" width=150 height=44 --><-- /script --><-- br / -->
 

このブログ記事について

このページは、Digi Pontaが2011年6月23日 20:09に書いたブログ記事です。

ひとつ前のブログ記事は「GWのガイガーカウンタ自作チャレンジ(2台目) ネクスト(21) J305β版24h動作確認」です。

次のブログ記事は「GWのガイガーカウンタ自作チャレンジ(2台目) ネクスト(23) web公開の暫定ソフト3」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01

マイサイト





Trackback People






注)「Calture」の正しい綴りは、「Culture」です。お間違いないように。