1. Top » 
  2. Java

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Genre:

Javaで画像のデータを取り出してGnuplotと合わせる

引き続き。

test.jpg

よくあるサンプルピクチャの一つ。
あまり大きいのもあれなので、それを小さくした物です。
これをtest.jpgで保存する。

プログラムを実行するときデータを画面に出されても困るのでリダイレクトしよう。

java ReadImageTest > test.csv



こんな感じでcsvファイルを作った物を適当にGnuplotで
読んでグラフ化する、んで値がどんな感じで分布してるかを見る。

hist.jpg

こうなる。
画像からも分かるけど赤色が多いよね。

Javaで画像の画素操作を思い出す

あぁ、メモ書き再開。
Javaで画像を扱いのはBufferedImageやImageIOやなんかを使うのが普通。
たぶん。久しぶりに思い出して書いてみる。

package parabola;

import java.awt.image.*;
import java.io.*;
import javax.imageio.*;

public class ReadImageTest {
public static void main(String[] args) throws Exception {
BufferedImage im = ImageIO.read(new File("test.jpg"));

int[] red = new int[256];
int[] green = new int[256];
int[] blue = new int[256];

for (int i = 0; i < im.getWidth(); i++) {
for (int j = 0; j < im.getHeight(); j++) {
int rgb = im.getRGB(i, j);
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb >> 0) & 0xFF;
red[r]++;
green[g]++;
blue[b]++;
}
}
for (int i = 0; i < 255; i++)
System.out.printf("%d %d %d %d\n", i, red[i], green[i], blue[i]);
}
}



Red、Green、Blueの色の強さを取得して、0~255の個数を足していく。
んでその個数を出力するプログラム。

Java6での新機能、軽量HTTPサーバを試す

Javaも1.4と呼ばれていたときから5に一気にバージョンアップして
その後6になってしばらくたちますね。
私が初めてさわったのは1.3でしたけれども、だいぶ機能が追加されています。
バージョン5の新機能も実はすべて知らないのですが・・・

Ver5.で一番よく使ってるのはやはり総称型ですかね。
拡張for文も今度勉強しようと思いますが、今回はVer6.の話。

軽量HTTPサーバ
Javaのプログラムでサーバの仕事を簡単にさせてくれる機能が追加されたみたい。
どれどれ、いかにして使うのか試してみよう。

package parabola;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class HttpServerTest {

public static void main(String[] arguments) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/webapp/", new HelloHttpHandler());
server.start();
}
private static class HelloHttpHandler implements HttpHandler {
public void handle(HttpExchange exchange) throws IOException {
StringBuffer buffer = new StringBuffer();
buffer.append("<html>");
buffer.append("<head>");
buffer.append("<title>Hello</title>");
buffer.append("</head>");
buffer.append("<body>");
buffer.append("<h1>Hello</h1>");
buffer.append("</body>");
buffer.append("</html>");

byte[] response = buffer.toString().getBytes();
exchange.sendResponseHeaders(200, response.length);
OutputStream output = exchange.getResponseBody();
output.write(response);
output.close();
}
}
}



実に短いです。
仕組み的には、仮想的なサーバを表す抽象クラスなんでしょうね。
HttpServerというクラスがね。
それに対してCreateで実際に作成していろいろ設定するとサーバー代わりの動作をすると。
実際にウィンドウズのファイアフォールから警告が出るので、実際のサーバーと同じような仕事でしょう。


これで最初に指定した/webappというやつにアクセスすると
確かにHelloと表示されます。

アクセス先 http://localhost:8080/webapp/



あー、実におもしろいね。
プログラムは楽しんでやるのが一番!

Javaで音を作る(WAVE)

Java、メモ書き。
どうも音楽関係のjavax.soundのパッケージがあるらしいと分かったので
いろいろ調べて使ってみます。

import java.io.*;
import javax.sound.sampled.*;

public class MakeWave {
  public static void main(String[] args) throws IOException{
    //time
    int t = 10;
    //data
    byte[] data = new byte[44100*2*2*t];
    int f = Integer.parseInt(args[0]);
    for(int i=0; i        data[i] = (byte)(Math.sin(i/2.0/Math.PI/f)*17);

    //Audio Format
    AudioFormat af = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                           44100.0F, // sample rate
                           16, // sample bit
                           2, // channnel
                           4, // frame size
                           44100.0F, // frame rate
                           false // big endian
               );
    //outout
    InputStream in = new ByteArrayInputStream(data);
    //inputstream(data), audioformat,frame
    AudioInputStream ais = new AudioInputStream(in, af, 44100*t);
    //kind of audio file
    AudioFileFormat.Type ttype = AudioFileFormat.Type.WAVE;
    //output file
    File file = new File(args[1]);
    //write
    AudioSystem.write(ais, ttype, file);
  }
}




このプログラムを次みたいに使う

java MakeWave 10 out10.wav
java MakeWave 20 out20.wav
java MakeWave 40 out40.wav



「ぶーん」

っていう何にも使えない意味不明な音がでけた。

Android

さ。
そろそろ日本にもAndroidの雰囲気が漂ってきました。
Docomoから出されるものが非常に興味があります。
私はあれです、携帯が今のになって1年弱なので機種変は出来ませんが。


というわけですので、Androidシミュレータで遊びます。
(まぁ、普段学校でLispばかりなのでストレス解消ですね)
基本的にはjavadriveのサイトを読みます。
便利な世の中です。




SDKはここです
SDKを解凍したらディレクトリ下のtoolsにPathを通しておく。
その後emulatorとするとエミュレータが立ち上がります。


開発はEclipseを使いますか。
Android Development Toolプラグインです。

更新のリモートサイトに以下を追加してAndroid Pluginを。
https://dl-ssl.google.com/android/eclipse/
※これでは上手く行きませんでした。
http://dl-ssl.google.com/android/eclipse/site.xml
でいけるかもしれません。

Eclipseにプラグインをインストールした後は
設定→AndroidでSDKを解凍した場所を指定しておく。


というのをEee PCでやりました。
最近、Eee PCが開発拠点になってます。

 Cygwin + gcc + flex + bison
 java , Eclipse
 Emacs

便利に持ち歩けますね。

サーブレット/JSP 二行目:最も基本的なJSP

<html>
<head>
<title>JSP Test</title>
</head>
<body>

<h2>JSPのテスト</h2>

1+1=<%= 1+1 %>

</body>
</html>



アクセス方法

http://localhost:8080/___/test.jsp


___はtest.jsp(上のようなHTMLファイル)が存在する場所


埋め込みの方法は大きく分けて2種類

1.JSPの式 <%= ~ %>
 ~に書かれたJavaの式の結果が出力される。
 このときセミコロンはいらない

2.スクリプトレット <% ~ %>
 式ではなく、Javaの複数行のソースコードを埋め込む


スクリプトレットの例

<html>
<head>
<title>JSP Test</title>
</head>
<body>

<%
int count = 0;
for(int i=0; i<10; i++)
count += i;
%>

count = <%= count %>

</body>
</html>




出力用の変数out
 暗黙オブジェクトの一つ
 暗黙オブジェクトとははじめから宣言されているもので、宣言なしで利用できるもの。
 outはサーブレットでのPrintWriterに相当する

outを用いた出力の例

<html>
<head>
<title>JSP Test</title>
</head>
<body>

<%
int count = 0;
for(int i=0; i<10; i++)
count += i;
out.println("count="+ count);
%>

</body>
</html>




日本語の文字化けを回避するためのコンテンツタイプの指定とimport

<%page contentType="text/html; charset=Windows-31J" %>



これはサーブレットでresponseに設定したsetContentTypeと同じように書ける。
また他のパッケージのインポートは次のように書く

<%page import="java.util.*, java.io.*"%>

サーブレット/JSP 一行目:最も基本的なサーブレット

以下、最も基本的なサーブレットプログラム

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
response.setContentType("text/html; charset=Windows-31J");
PrintWriter out = response.getWriter();
out.println("Hello Servlet World");
}
}



以下、それをTomcatで動作するためのweb.xmlの書き方


// web.xml
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>




アクセス方法

http://localhost:8080/___/HelloServlet


___はアプリケーションのディレクトリの名前

JavaでPDFを操作する-Fontの指定-

以前の記事
JavaでPDFを操作する-準備-
JavaでPDFを操作する-とりあえず作ってみる-



メモ
・ChunkにはFontを一つ設定できる
・日本語と英語ではFONTの設定が大切
・英語のFontは特に気にしなくてよい
・日本語のFontはそのエンコードが大切

使用できる日本語FONT
 明朝体
  KozMinPro-Regular
 明朝体
  HeiseiMin-W3
 ゴシック体
  HeiseiKakuGo-W5

使用できるエンコーディング
 Adobe日本語文字用ユニコードエンコーディング
  UniJIS-UCS2-H
 UniJIS-UCS2-Hの縦書き用
  UniJIS-UCS2-V
 プロポーショナル文字を半角文字に変更する
  UniJIS-UCS2-HW-H
 UniJIS-UCS2-HW-Hの縦書き用
  UniJIS-UCS2-HW-V


// PDFを開く→要素(Chunk)を追加→PDFを閉じる
doc.open();

// 英語
Font f1 =
new Font(Font.HELVETICA, 10, Font.BOLD, new Color(255, 0, 0));

// 日本語
BaseFont bf = BaseFont.createFont(
"HeiseiKakuGo-W5",
"UniJIS-UCS2-H",
BaseFont.NOT_EMBEDDED
);
Font f2 = new Font(bf, 10, 0, new Color(255, 0, 0));

// 追加
doc.add(new Chunk("Hello",f1));
doc.add(new Chunk("Hello",f2));
doc.add(new Chunk("こんにちは",f1));
doc.add(new Chunk("こんにちは",f2));

doc.close();

// 実際にPDFファイルを作成する
out = new FileOutputStream(new File("c:/test2.pdf"));




作成結果
こんな感じです
test_pdf2.jpg



後書き
記念すべきリニューアル後のブログ、200記事目はJavaでした

JavaでPDFを操作する-とりあえず作ってみる-

以前の記事
JavaでPDFを操作する-準備-



JavaでPDFを扱うために
※主に作成する側

 iText
 iTextAsian

の二つを準備しました。
これを利用して次のように書きます。
※最も簡単にHelloと書かれたPDFを作る例

import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import java.io.*;

public class makePDFTest {
public static void main(String[] args) {
// variable
ByteArrayOutputStream baos = null;
Document doc = null;
OutputStream out = null;

try {
// PDFを作成するためのインスタンス
baos = new ByteArrayOutputStream();

// PDFの外枠、Documentの定義
doc = new Document();

// 二つの関連づけ
PdfWriter.getInstance(doc, baos);

// PDFを開く→要素(Chunk)を追加→PDFを閉じる
doc.open();
doc.add(new Chunk("Hello"));
doc.close();

// 実際にPDFファイルを作成する
out = new FileOutputStream(new File("c:/test.pdf"));

// ファイルへ書き込み
out.write(baos.toByteArray());

} catch (DocumentException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}




作成結果

test_pdf.jpg



いろいろ使えそうですね?
※もう少し詳しく「要素」の概念について考えてみなければ!

Javaでマルチスレッド 四行目

定番の例として、銀行のお金を扱ってみる。
参考書は引き続き、結城浩氏の「改訂版 Java言語プログラミングレッスン下」です。

悪い銀行



public class BadBank{
  private int value = 0;
  public void addMoney(int money){
    //現金残高の保存
    int currentValue = value;
    //状況を表示
    System.out.println(Thread.currentThread() + "がaddMoneyに入りました");
    //現在残高を変更
    value += money;
    //矛盾がないかどうかチェック
    if(currentValue + money != value){
      System.out.println(Thread.currentThread() + "で矛盾が発生");
      System.exit(-1);
    }
    //状況を表示
    System.out.println(Thread.currentThread() + "がaddMoneyから出ました");
  }
}




悪い銀行を使う



public class BadBankTest extends Thread{
  BadBank bank;
  public BadBankTest(BadBank bank){
    this.bank = bank;
  }
  public void run(){
    while(true){
      bank.addMoney(100);
      bank.addMoney(-100);
    }
  }
  public static void main(String[] args){
    BadBank bank = new BadBank();
    new BadBankTest(bank).start();
    new BadBankTest(bank).start();
  }
}



利用例では、自分自身をThreadのサブクラスにしています。
インスタンスを設定してStartでThreadを生成する方式です。


今回の例、必ず矛盾が起きて止まります。
なぜなら二つのスレッドの切り替えのタイミングが問題になるからです。


 1.1つ目のスレッドで残高を保存して表示(0円)
<Thread切り替え>
 2.2つ目のスレッドで残高を保存して表示(0円)
<Thread切り替え>
 3.1つ目のスレッドがvalueにmoneyを足す(value=100)
 4.1つ目のスレッドで矛盾チェック(0+100=100)・・・OK→出力
<Thread切り替え>
 5.2つ目のスレッドで矛盾チェック(100+100!=100)・・・NG→出力
 6.矛盾発生して終了



これはインスタンス変数がインスタンスに1つしかないことから発生します。
お互いが同じ変数を参照するのはいいにしても
それを書き換え始めると、非常に危険なことが起きるわけです。
つまり、その時読み込んでいるデータが今の最新データとは限らない
又は自分が読み出した後に書き込まれてしまうと整合性が崩れます

これを解決するには、マジックワード「synchronized」です。
また次回。

Page Top

訪問者

お引っこし。 http://parabola.sblog.jp/

プロフィール

parabola0

Author:parabola0
Twitter用ですが…。
プロフィール

最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
リンク

このブログをリンクに追加する

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。