Java

とりあえず策

ということでまずは最小限の変更で対応するためにアドホックに。 ...snip out.println("set terminal png"); out.println("plot sin(x)"); out.println("set output"); out.flush(); BufferedImage image1 = ImageIO.read(in); System.err.println(image1); …

対応策

アプローチは大きく分けて二つある。 すなわち標準入出力経由での画像のやり取りでがんばるかすっぱりあきらめるかである。標準入出力を使わない場合は他のチャネルを介することになる。 gnuplot側が使用でき、かつ、ある程度色々なシステムで普通に使えるも…

判断材料

次のようにして、失敗することは分かっているが、 ImageIO.read(in)で二枚目の画像の取得を試み、 失敗して戻ってきた後のストリームの内容を読み出す。 ...snip out.println("set terminal png"); out.println("plot sin(x+pi/10)"); out.println("set outp…

送信されてきたものを見る

では何か余計なものとは何だろう。 image1が作成された後、入力ストリームからのデータを確認してみる。 import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; public class GnuplotUser5 { private static final String …

何が起きているのか考える

さて原因は何だろう。 もし二枚目の画像データが何らかの原因で送られてきていないのなら、 image2に画像オブジェクトの参照を返すImageIO.read(in)自体から返ってこない。 nullを返しているとはいえ、このメソッドから戻っているということは、 データは送…

画像を複数出力させると

二つのプロットを連続して受け取ってみる。 import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; public class GnuplotUser5 { private static final String GNUPLOT = "/usr/bin/gnuplot"; public static void main(Str…

具体的には

import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; public class GnuplotUser5 { private static final String GNUPLOT = "/usr/bin/gnuplot"; public static void main(String[] args) throws IOException, Interrupt…

思い込み

いろいろ試しているうちにAPIリファレンスを眺めて気が付いた。 java.io.PrintWriter(Writer, boolean)を除くコンストラクターで作成されたPrintWriterは、 without automatic line flushingだったのだ。 ということで、Javaからのset outputによるgnuplot側…

少し変える

ImageIO#read(InputStream)は非同期に読み込みを行うのでなく、 ストリームが閉じられるまでブロッキングし画像が完成するのを待ってそれを返す。 閉じられるのを待つストリームはgnuplotからのものであるが、 そのきっかけはgnuplotへの出力の方が閉じられ…

Javaからgnuplotへ複数プロット分のデータを送る

複数のプロット分のデータをJavaで生成しgnuplotにチャートを描かせてJava側でそれを順番に表示する。 前出のコードでは二つのプロセス間のデータ授受に標準入出力を利用している。 手軽ではあるがこれが災いして複数の画像を受け取るときに問題が起きる。 I…

Javaからgnuplotへデータを送る

Javaで生成したデータを与えgnuplotにチャートを描かせてJava側でそれを表示する。 gnuplotによって正弦の計算をさせるのではなく、 Java側で正弦の値を一周期21点分π/5ラジアンごとに計算してgnuplotに与える。 基本的には以前に示したコードそのままである…

7U10

たまにはJavaの話。 最近Javaを触っていなかったので公式ページを見に行ったら、 いつの間にかJDKのUpdate10がリリースされていた。 バージョン8は来年なのかな?

コイン投げ #8

現在二種類のアイテムそれぞれの獲得数は18個*1と27個である。 獲得確率が等しいとすれば、獲得数差が7個以内となるような確率は、 であり、これの余事象が起こることが稀であるというほどではまだない。この値を非効率的に求めるにはJavaなら次のようなコー…

正方形の周長 #28

Squareの情報を表示するコンポーネントだけでなく、 Squareに値を設定するコンポーネントも加えてみる。 import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.…

正方形の周長 #27

SquareParametersPaneとJLabelでSquareの情報を共有するアプレットを作ってみる。 SquareApplet.java import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.BorderFactory; import javax.swing.JApplet; import javax.swing.JLabel; …

正方形の周長 #26

せっかく正方形の情報Squareの変更を通知する仕組みができあがっているのに、 これまでSquareParametersPane自体が正方形の情報を内部で生成、保持していた。 これを外部で生成し、SquareParametersPaneに与えられるようにすることで、 他のクラスからも正方…

正方形の周長 #25

SquareParametersPaneを思い切り変更してみる。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.GroupLayout; import javax.swing…

正方形の周長 #24

とりあえずかなり中途半端にSquareParametersPaneに適用してみる。 ...snip public class SquareParametersPane extends JPanel implements ActionListener, FocusListener, SquareListener { private Square params = new Square(); private JTextField sid…

インストーラの嫌な挙動

更新したJDKのうち、Windows XPに入れたJDK7u2のインストーラが気持ちの悪いことを。 %USERPROFILE%ディレクトリ直下に自分勝手なディレクトリを作成して70MBファイルを放り込んでいる。 作るなら直下ではなくApplication DataなりLocal Settings\Applicatio…

正方形の周長 #23

知らせる情報を表すクラスと知らされる側が持つべきインタフェイスについて定義したので、 今度は知らせる側を作成する。 正方形の諸元を表すSquareParametersにその変更を知らせる機構を付加したクラスSquareを定義する。 Square.java import java.util.con…

不思議なJDK6とJDK7との差異は新updateではどうか

前に述べたJDK6とJDK7でのコンパイラ動作の差について、 両者ともに新しいもの(1.6.0_30と1.7.0_02)が出たので手元の環境を更新して試してみた。 結果は更新前と同じだった。

正方形の周長 #22

正方形の諸元を表すSquareParametersクラスの持つパラメータが変更されたときに、 変更されたことを知りたい者に知らせる機構を付加する。 変更されたという出来事をここではjava.util.EventObjectクラスのサブクラスとして定義しておく。 SquareEvent.java …

正方形の周長 #21

リソース読み込み用のクラスSquareParametersResをUTF-8のプロパティファイルベースに変更する。 といっても、デフォルトコントロールをPropertiesControlに変更するだけである。 ...snip public class SquareParametersRes { private static ResourceBundle…

正方形の周長 #20

PropertiesControlではReaderでプロパティファイルを読み込むように変更しているだけなので、 Unicodeエスケープされたものを解釈するResourceBundle側の振る舞い自体は変わっていない。 したがって、Unicodeエスケープに使われる文字エンコードとProperties…

正方形の周長 #19

PropertiesControlを使ってみる。 以下の三つのプロパティファイルを用意する。 messages.properties 1 = message 1 2 = message 2 3 = message 3 messages_ja.properties (UTF-8) 1 = めっせーじ1 2 = めっせーじ2 messages_ja_JP.properties (UTF-8) 1 =…

正方形の周長 #18

PropertiesControlのソースはJDK1.7以降でないとコンパイルに失敗する。 newBundleメソッドのPropertyResourceBundleによる取り込み部分でリソース付きtry文を利用しているためである。 これはJDK1.7から導入された文法なので、 1.6以前であればreaderをclos…

正方形の周長 #17

JDK1.6よりも前であれば面倒だったけれど、 1.6で導入されたResourceBundle.Controlクラスにより簡単に書くことができるようになった。 ResourceBundle.ControlクラスのAPI仕様にあるXMLベースのリソース取り込みのサンプルとあまり変わりない。 import java…

正方形の周長 #16

ResourceBundleクラスのgetBundleメソッドのデフォルトの振る舞いにしたがう場合、 プロパティファイルベースのリソースでは、文字エンコードがISO-8859-1でなければUnicodeエスケープする必要がある。 自動化されていたり一括管理されている場合なら大して…

列挙子の実装を反復子のインタフェイスで扱う #5

使ってみる。 以前と同じくダイアモンドを使っているのでJDK6では型を明記しないといけない。 ...snip for (String s : iterable(new java.util.Vector<>(java.util.Arrays.asList("Alice", "Bob", "Carol")).elements())) { System.out.println(s); } ...sn…

列挙子の実装を反復子のインタフェイスで扱う #4

使い所があまりないとは思うが、 ついでに、与えられた配列に対する反復子を返すIterable実装を返すメソッドiterableも書いておく。 これも配列からIterator実装を返すメソッドが定義されたクラスと同じクラス内で定義している。 仲介メソッドiterator_の意…