import java.io.IOException; import java.net.URL; import java.net.HttpURLConnection; import java.util.ArrayList; import java.util.List; import java.io.BufferedInputStream; public class GetWave { public static void main( String[] args ) { HttpURLConnection httpURLConnection = null; try { URL url = new URL( "https://suzulang.com/" ); httpURLConnection = (HttpURLConnection)url.openConnection(); httpURLConnection.setRequestMethod( "GET" ); String ContentType = httpURLConnection.getHeaderField("Content-Type") ; String[] cts = ContentType.split("[;/= ]"); /* ↑ HTTPレスポンスヘッダのContent-Typeを取得する。 Content-Type: text/html; charset=shift_jis のような形をしているので、各特殊記号とスペースを区切り文字としてsplitして、 charsetの次に入っているのが文字列と判断。(↓コード) ただし、Content-Type: text/html;で終わっている場合もある。 */ //文字コードの判別 String CharSet = null; for( int i = 0; i < cts.length; i++){ if( cts[i].toLowerCase().equals("charset") ){ if( i+1 == cts.length ){ CharSet = null; } else{ CharSet = cts[i+1]; } } } if( CharSet == null ){ //文字コード指定がなかったらとりあえずUTF-8にする CharSet = "UTF-8"; } /* ただのInputStreamはreadする度に読みに行くので効率が悪いらしい。 BufferedInputStreamは一度のアクセスで大量のデータを取得する htttp://e-class.center.yuge.ac.jp/jdk_docs/ja/api/java/io/BufferedInputStream.html */ BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream() ); List<Byte> alldata = new ArrayList<Byte>(); //HTML取得 byte [] buf = new byte[1024*4]; int readsize; while( ( readsize = bis.read(buf) ) >= 0 ){ for(int i = 0; i < readsize; i++){ alldata.add( buf[i] ); } } //バイトの配列に変換 byte tostr[] = new byte[ alldata.size() ]; for(int i = 0; i < alldata.size(); i++){ tostr[i] = alldata.get(i); } /* Stringはコンストラクタで文字コードを指定できる。 String(byte[] , Charset)の場合、byteの中の文字コードがCharsetであることを示す。結果、 resultにはUTF-8に変換された文字列が入る。 */ //表示 String result = new String(tostr, CharSet); System.out.println(result); } catch( IOException e ) { e.printStackTrace(); } finally { if( httpURLConnection != null ) { httpURLConnection.disconnect(); } } } }
コンパイル:
>javac GetWave.java
実行
>java GetWave
参考文献:
http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000803.html
私のマシンはi7-2066K (3.40GHz) のRAM 8.00GBと、普段使いにはかなりオーバースペック(必要以上に高性能)なんだが、なぜこんな機械を買ったのかという話。
ひとことでいうと、何に使うかがわからないからだ。
例えば、最近3DCGを始めたんだが、簡単にこんな絵を作れる。
ふーんと言う感じだが、実はこれの元は
こんな感じののっぺらぼーな立体図形だったりする。
こういうのを"モデル"といって、3DCGではこのような"モデル"を作ってから、モデルの材質(反射するか、何色か等)や、撮影するカメラの位置や光源の位置を決めて、"レンダリング"という作業をすることで最初に挙げたような絵を作り上げる。
このレンダリングという作業では、「モデルに光があったら、青く反射して、後ろは影にして」という計算をひたすらにやって色をつけていくわけだが、リアルに色づけをしようと思ったら大変なことになる。
なにしろ、現実世界では光は至る所で反射し続けていて、例えば太陽光がアスファルトに当たったら近くの木に反射して、その反射光は人の服に反射して、さらにその反射光は・・・と無限に繰り返される。
一昔前まではコンピュータでもそんな計算はできなかったので、「光の反射は一回だけ」のようなところで妥協していた。
ところが最近はコンピュータの処理能力が高くなったので、3DCGのソフトが "物理的に正しい" 光の計算をするようになってきた。
最初に出した画像を描いたのはLuxRenderというフリーソフトなんだが、このソフト、
現実では無限に反射を続けるって?
だったら無限に計算すればいいじゃない!
という発想で、ユーザーが中止するまで永遠に計算し続ける。
最初に出した画像は単純なので、1時間くらいかけたら結構綺麗になったが、もっと複雑で大きなシーンなら二日とか三日とかかけないと満足のいく結果が得られない。
動画ならどれくらいかかるかって?考えたくないね!
最初の話に戻るんだが、もし私が低スペックのマシンを買っていたら、「3DCGをやってみたい」と思っても、一日かかっても満足できる絵が描けなくて、つまらなくてやめてしまっていたかもしれない。
パソコンなんて嫌いだ!メールとYahooニュースだけあればいいんだ!とはっきり言い切れるなら、それに適した機械を購入すれば十分だ。
だがパソコンというものに何らかの可能性を見いだしているなら、スペックにはちょっと余裕を持って色々試してみるといい。
OpenGLでテクスチャを視線方向に並べてボリュームレンダリングしていたが、256枚ポリゴンを書いているはずなのに、マシンによっては6枚ぐらいしか表示されないという現象が発生した。
調査したところ、
glOrtho(-m_aspw, m_aspw, -m_asph, m_asph, -1000.0, 1000.0);
となっていたので
glOrtho(-m_aspw, m_aspw, -m_asph, m_asph, -10.0, 10.0);
に書き換えたら直った。もともとそんな遠くまで表示させる必要はなかったのでこれで解決だが、本当に-1000~1000まで必要な場合はどうするのだろう。
昨日のドングリ。発根していなかったもののその後。
ちょっと数が多かったのでポットという訳にもいかず、一所においておくことにした。
乾燥すると死んでしまい発芽しないので、土をかぶせ、ある程度の湿度を維持し続けなければならない。
出荷前ですか?
という状態なんだが、そういえば過去、どこぞの政治家が女性を生む機械に例えて問題になった事件があった。発言しただけであの騒ぎ。
ドングリ王国があったら死刑確定である。
もちろん、この後ちゃんと土はかぶせておいたがそういう問題じゃないよね
なんかたくさんきていた、以下のようなメール。
【重要なお知らせ】
「セントラル調査事務所」様より、下記内容を特定記録メール便にて送信依頼がありましたのでご確認ください。【送信内容】
弊社は調査業務、情報管理及び和解手続き代行等を主とした調査機関でございます。本日ご連絡致しましたのは、現在貴方がご契約されている総合コンテンツ提供サービス会社からの再三の通告を放置し、利用料金を長期延滞している事に対して、同社が起訴準備期間に入った事を報告致します。
この通知を最終通告と致しますので、本日、当社営業時間までにご連絡が無い場合、管轄裁判所から裁判日程を決定する呼出状が発行され、記載期日に指定裁判所へ出廷となります。
尚、裁判を欠席されますと、相手方の言い分通りの判決が出され、執行官立ち会いのもと、給料、財産や不動産、有価証券等の差押えを含めた強制執行となりますので、ご注意下さい。弊社は、今回運営会社様より和解等の最終判断を委託されましたので、双方にとってより良い解決に向かうためのご相談に乗らせて頂きます。本日弊社営業時間までに早急にお電話にてご相談ください。
早期解決を望まれるお客様から優先にて、弊社もご対応させて頂きます。
※時間帯によって繋がりにくい場合がございますので、その際は恐れ入りますが、再度お掛け直し頂きますようお願い致します。
尚、メールでの返答には対応しておりません。ご了承下さい。~~お問い合わせ先~~
セントラル調査事務所
【担当部署】お客様センター
担当:黒崎・小石川・多田
【電話番号】03-4589-4505
【お問い合わせ時間】午後13:00~午後18:30以上
※本メールは特定記録メール便のサービスとして、メール開封日時の記録及びメール内容の保管を日本デジタル郵便が第三者機関として行っております。
尚、本メールアドレスへの返信をされましても、特定記録メール便送信専用となりますので、当社では確認及び対応することが出来ません。
また、依頼者様へメールが転送されることもありませんので、返信はされませんようお願い申し上げます。
そもそも、見出しと差出人逆だよな?
見出し: [親展]重要
差出人:特定記録メール便
のほうがまだ違和感ない・・・よな?というか、業者も不景気で大変だとは思うが、
自分とこのメールアドレスぐらい載せろよ!
騙す気あんのか!
注:載せないほうが難しいです。念のため
読書をしようと思って森に入ったら、足下にドングリが落ちていたので拾ってきた。
種類を調べようと思ったがよくわからない(http://dongurikorokoro.fc2web.com/miwakekata_m1.html)。典型的なドングリにこんなに種類があるとは。
土の比較的軟らかく湿った位置に落ちていたものうち、何個かは発根していた。
来春には葉が生えるだろうから、種類が特定できるだろう。
package fxdemo; import java.io.File; import java.net.URL; import javafx.scene.layout.BorderPane; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class ui extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { BorderPane root = FXMLLoader.load(getClass().getResource("sample.fxml")); Scene scene = new Scene(root); stage.setTitle("Menu Test"); stage.setScene(scene); stage.show(); } }
<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <BorderPane prefHeight="150.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml" fx:controller="fxdemo.Controller" > <top> <MenuBar> <menus> <Menu text="松" > <MenuItem text="五葉松" fx:id="oomine" onAction="#handle_goyou" /> <MenuItem text="黒松" fx:id="okutyou" onAction="#handle_kuro" /> <MenuItem text="赤松" fx:id="chichibu" onAction="#handle_aka" /> </Menu> </menus> </MenuBar> </top> </BorderPane>
package fxdemo; import javafx.fxml.FXML; import javafx.fxml.Initializable; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; public class Controller implements Initializable { @FXML public void handle_goyou(ActionEvent event) { System.out.println( "五葉松" ); } @FXML public void handle_kuro(ActionEvent event) { System.out.println( "黒松" ); } @FXML public void handle_aka(ActionEvent event) { System.out.println( "赤松" ); } @Override public void initialize(URL url, ResourceBundle rb) { } }
コンパイル
javac fxdemo\ui.java fxdemo\Controller.java
実行
java fxdemo.ui
各メニュー項目をクリックするとコンソールに文字列が表示される
ui.java
package fxdemo; import java.io.File; import java.net.URL; import javafx.scene.layout.BorderPane; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class ui extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { BorderPane root = FXMLLoader.load(getClass().getResource("sample.fxml")); Scene scene = new Scene(root); stage.setTitle("Menu Test"); stage.setScene(scene); stage.show(); } }
ここではBorderPaneを使っているが、AnchorPaneやPaneでもできないことはない。
ただし、BorderPane以外を使う場合は以下のfxml内の<top>を外さないとエラーになる
sample.fxml
<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <BorderPane prefHeight="150.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml"> <top> <MenuBar> <menus> <Menu text="落葉高木" > <MenuItem text="銀杏" /> <Menu text="桜"> <Menu text="エドヒガン" > <MenuItem text="天城吉野" /> <MenuItem text="雨情枝垂" /> <MenuItem text="薄毛大島" /> </Menu> <Menu text="チョウジザクラ" > <MenuItem text="オオミネザクラ" /> <MenuItem text="オクチョウジザクラ" /> <MenuItem text="チチブザクラ" /> </Menu> </Menu> <Menu text="松" > <MenuItem text="蝦夷松" /> <MenuItem text="唐松" /> <MenuItem text="五葉松" /> </Menu> <Menu text="梅" /> </Menu> <Menu text="落葉低木" /> </menus> </MenuBar> </top> </BorderPane>
コンパイル
>javac fxdemo\ui.java
実行
java fxdemo.ui
JavaFXで複数の窓を表示する。
で示したコードの、Fxml1.javaを以下のように書き換える
import javafx.scene.Scene; import javafx.stage.Stage; import javafx.stage.Modality; public class Fxml1 extends Application { public static void main(String[] args) { launch(args); } public Stage newStage = null; @Override public void start(Stage stage) throws Exception { AnchorPane root = FXMLLoader.load(getClass().getResource("sample.fxml")); Scene scene = new Scene(root); stage.setTitle("FXML Test"); stage.setScene(scene); stage.show(); newStage = new Stage(); newStage.initModality(Modality.NONE); newStage.initOwner(stage); newStage.setScene( new Scene(FXMLLoader.load(getClass().getResource("sample.fxml") ) ) ); newStage.show(); } }
新しくStageをnewして、setSceneしてshowするだけ。
途中、initModalityの引数に関しては以下。
http://docs.oracle.com/javafx/2/api/javafx/stage/Modality.html
の三つがある。