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側でそれを順番に表示する。 前出のコードでは二つのプロセス間のデータ授受に標準入出力を利用している。 手軽ではあるがこれが災いして複数の画像を受け取るときに問題が起きる。 I…
Javaで生成したデータを与えgnuplotにチャートを描かせてJava側でそれを表示する。 gnuplotによって正弦の計算をさせるのではなく、 Java側で正弦の値を一周期21点分π/5ラジアンごとに計算してgnuplotに与える。 基本的には以前に示したコードそのままである…
たまにはJavaの話。 最近Javaを触っていなかったので公式ページを見に行ったら、 いつの間にかJDKのUpdate10がリリースされていた。 バージョン8は来年なのかな?
現在二種類のアイテムそれぞれの獲得数は18個*1と27個である。 獲得確率が等しいとすれば、獲得数差が7個以内となるような確率は、 であり、これの余事象が起こることが稀であるというほどではまだない。この値を非効率的に求めるにはJavaなら次のようなコー…
Squareの情報を表示するコンポーネントだけでなく、 Squareに値を設定するコンポーネントも加えてみる。 import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.…
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; …
せっかく正方形の情報Squareの変更を通知する仕組みができあがっているのに、 これまでSquareParametersPane自体が正方形の情報を内部で生成、保持していた。 これを外部で生成し、SquareParametersPaneに与えられるようにすることで、 他のクラスからも正方…
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…
とりあえずかなり中途半端に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…
知らせる情報を表すクラスと知らされる側が持つべきインタフェイスについて定義したので、 今度は知らせる側を作成する。 正方形の諸元を表すSquareParametersにその変更を知らせる機構を付加したクラスSquareを定義する。 Square.java import java.util.con…
前に述べたJDK6とJDK7でのコンパイラ動作の差について、 両者ともに新しいもの(1.6.0_30と1.7.0_02)が出たので手元の環境を更新して試してみた。 結果は更新前と同じだった。
正方形の諸元を表すSquareParametersクラスの持つパラメータが変更されたときに、 変更されたことを知りたい者に知らせる機構を付加する。 変更されたという出来事をここではjava.util.EventObjectクラスのサブクラスとして定義しておく。 SquareEvent.java …
リソース読み込み用のクラスSquareParametersResをUTF-8のプロパティファイルベースに変更する。 といっても、デフォルトコントロールをPropertiesControlに変更するだけである。 ...snip public class SquareParametersRes { private static ResourceBundle…
PropertiesControlではReaderでプロパティファイルを読み込むように変更しているだけなので、 Unicodeエスケープされたものを解釈するResourceBundle側の振る舞い自体は変わっていない。 したがって、Unicodeエスケープに使われる文字エンコードとProperties…
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 =…
PropertiesControlのソースはJDK1.7以降でないとコンパイルに失敗する。 newBundleメソッドのPropertyResourceBundleによる取り込み部分でリソース付きtry文を利用しているためである。 これはJDK1.7から導入された文法なので、 1.6以前であればreaderをclos…
JDK1.6よりも前であれば面倒だったけれど、 1.6で導入されたResourceBundle.Controlクラスにより簡単に書くことができるようになった。 ResourceBundle.ControlクラスのAPI仕様にあるXMLベースのリソース取り込みのサンプルとあまり変わりない。 import java…
ResourceBundleクラスのgetBundleメソッドのデフォルトの振る舞いにしたがう場合、 プロパティファイルベースのリソースでは、文字エンコードがISO-8859-1でなければUnicodeエスケープする必要がある。 自動化されていたり一括管理されている場合なら大して…
使ってみる。 以前と同じくダイアモンドを使っているのでJDK6では型を明記しないといけない。 ...snip for (String s : iterable(new java.util.Vector<>(java.util.Arrays.asList("Alice", "Bob", "Carol")).elements())) { System.out.println(s); } ...sn…
使い所があまりないとは思うが、 ついでに、与えられた配列に対する反復子を返すIterable実装を返すメソッドiterableも書いておく。 これも配列からIterator実装を返すメソッドが定義されたクラスと同じクラス内で定義している。 仲介メソッドiterator_の意…