ファイルの読み込みを Java SE7 から追加された try-with-resources文 を使って書き直す
Java SE7 から追加された try-with-resources文 の使い方を、SE6 以前の書き方との比較も含めてメモっとく。 普段の業務では SE6 しか使ってないから、資格の勉強で1度覚えても忘れちゃうんよな。 (サンプルのソースは Java SE6 以前の方も SE7 以降の try-with-resources文使用ヴァージョンも テキストファイル「test.txt」の内容をすべて出力するという物 )
まず、Java SE6 以前での書き方。 ポイントは finally 句で close() すること。 また、その際に BufferedReader のインスタンスが null である場合を考慮して if で処理を分岐すること。 これしとかないと NullPointerException が発生してしまう。
public static void main( String[] args ) { BufferedReader br = null; try { br = new BufferedReader( new FileReader( "./test.txt" ) ); String text; while ( (text = br.readLine()) != null ) { System.out.println( text ); } } catch ( IOException e ) { e.printStackTrace(); } finally { if ( br != null ) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } }
で、Java SE7 から追加された try-with-resources文 を使用したヴァージョン。 見た目での一番の違いは
try の後いきなり () 小かっこが登場しているところ。 この中かっこの中には、 ・java.lang.AutoCloseable ・java.io.Closeable のどちらかのインタフェースの実装クラスのリソースの生成処理を書く。
ここ、Oracle 認定 Java Programmer SE7 GOLD で必ず試験に出ます。(個人の感想です。)
また、この小かっこの中では複数のリソースの生成処理を書くこともできる。(ここに関してはまた今度書く。) で、小かっこの中に生成したリソースは自動的に close() が呼ばれ、解放される。
次に、なんやこれ?ってところは finnaly 句でやってる
e.getSuppressed();
getSuppressed() は Java SE7 で Throwable クラスに追加されたメソッドで、抑制された例外の配列を取得するメソッドであり、ここれは、自動的に呼び出された close() メソッド実行中に発生した例外を取得している。
Java SE6 以前のソースと比較すると、それまで finnaly 句でやっていた close するための分岐やら何やらが無くなってすっきりしている気がする。 自前で書かなきゃいけない内容があると、それだけいらんミスする可能性が増えるしね。
public static void main ( String[] args ) { try ( BufferedReader br = new BufferedReader( new FileReader("./text.txt") ); ) { String text; while ( (text = br.readLine()) != null ) { System.out.println( text ); } } catch ( IOException e ) { e.printStackTrace(); Throwable[] suppressedArr = e.getSuppressed(); for ( Throwable throwable : suppressedArr ) { throwable.printStackTrace(); } } }
JavaScript(Backbone.js)で、jsonファイルの読み込み方メモ
アプリケーションの設定値を定義した json ファイルの設定値を Backbone.Model を継承したオブジェクトで保持するようにしたら、 jQuery の ajax をそのまま使うよりすっきり出来た気がする(個人の感想)のでメモっとく。
もっと良いやり方あったらおしえてください。
まず html 側。 大事なのは head タグ内の script タグ部分。 Backbone.js には jQuery と underscore が必要なので、それらのライブラリを読み込んでいます。
stylesheet 読み込み部分はどうでもいいです。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <title>title</title> <link rel='stylesheet' href='./css/style.css'/> <!-- 各ライブラリの読み込み --> <script src="./script/lib/jquery-2.1.4.min.js"></script> <script src="./script/lib/underscore-min.js"></script> <script src="./script/lib/backbone-min.js"></script> <!-- 今回書くJavaScriptファイル --> <script src="./script/app.js"></script> </head> <body> <p>sample</p> </body> </html>
で、次、読み込み対象の .json ファイルについて 今回は2つ .json ファイルを読み込むことにする。
一つ目の .json ファイル アプリケーションの名前とバージョンを持っている設定ファイルの想定。
config1.json
{ "app_name": "アプリケーション名", "version": "1.00" }
二つ目 画面か警告とかエラーとかの文言を定義している設定ファイルの想定。
config2.json
{ "MESSAGE_001": "メッセージゼロゼロイチ", "MESSAGE_002": "メッセージゼロゼロニ" }
で、最後に実際に、上記の json ファイルを読み込んでいるJavaScriptファイルについて。
app.js
var app = app || {}; // config.jsonを読み込むオブジェクト app.Config1 = Backbone.Model.extend({ // .json ファイルのパスを設定 url: './config1.json', }); app.Config2 = Backbone.Model.extend({ // .json ファイルのパスを設定 url: './config2.json', }); (function(){ 'use strict'; var config1 = new app.Config1(); var config2 = new app.Config2(); config1.fetch().then( function() { app.config1 = config1; return config2.fetch(); }).then( function () { app.config2 = config2; console.log( app.config1.get('app_name') ); console.log( app.config1.get('version') ); console.log( app.config2.get('MESSAGE_001') ); console.log( app.config2.get('MESSAGE_002') ); }); }());
ちょっと長くなってしまった。 まず、前半部分
var app = app || {}; // config.jsonを読み込むオブジェクト app.Config1 = Backbone.Model.extend({ // .json ファイルのパスを設定 url: './config1.json', }); app.Config2 = Backbone.Model.extend({ // .json ファイルのパスを設定 url: './config2.json', });
各jsonを読み込むためのクラスを Backbone.Model を継承して定義しています。 Backbone.Model は url 属性に定義したリソースを取得、作成、更新、削除を行う機能を持っているのでそれを使って楽します。 なので、クラスの定義は url 属性を定義するだけでおしまい。
次、後半部分
(function(){ 'use strict'; var config1 = new app.Config1(); var config2 = new app.Config2(); config1.fetch().then( function() { app.config1 = config1; return config2.fetch(); }).then( function () { app.config2 = config2; console.log( app.config1.get('app_name') ); console.log( app.config1.get('version') ); console.log( app.config2.get('MESSAGE_001') ); console.log( app.config2.get('MESSAGE_002') ); }); }());
まず、前半部分で定義したクラスを new して変数に代入します。
それで、ここからが個人的にややこしいと感じた部分。
config1.fetch() は実際には 前半部分のクラスの定義設定した url に対して HTTPリクエストのGETメソッドで非同期で取得しにいっている。 で、非同期ってことは
config1.fetch(); console.log( config1.get('app_name') ); console.log( config1.get('version') );
こんな風に書くと、config1.fetch(); でjsonファイルを読み込みに行ってるんだけど、読み込み終わらないうちに、2行目の処理に進んじゃんって、 コンソールには undefined undefined って出力される可能性が高い。
で、それを防ぐためにどうしたかって言うと、 .fetch() で jQuery のDifferedオブジェクトが返ってくるので、Differedオブジェクトの then()メソッドを使用して、fetch(実際には HTTP の GETメソッド )が終了するのを待って、次の処理に移るようにしています。
今回の場合 config1.json の読み込みが正常に終わったらば、次は config2.json の読み込みをして、 それもちゃんと終わったらば、確認のために、それぞれの読み込んだ値をコンソールに表示するようにしています。
console.log( app.config1.get('app_name') ); console.log( app.config1.get('version') ); console.log( app.config2.get('MESSAGE_001') ); console.log( app.config2.get('MESSAGE_002') );
GitHubに学生時代に作った論理回路エディタを上げた
GitHubのリポジトリが1個だけっていうのも寂しいし、 学生時代に作った論理回路エディタを上げた。
https://github.com/jsuzuki20120311/logic_circuit_editor
こんな感じで論理回路を描けるらしい。
せっかくなのでAWSにもデプロイした。
http://ec2-54-191-139-159.us-west-2.compute.amazonaws.com:8080/logic_circuit_editor_3/
Java EE で アプリケーション起動時になんか処理するやり方
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
あとはServletContextListenerを実装したクラスを追加する。 例では、起動時にアプリケーションの名前とバージョンを設定から引っ張ってきて表示している。
@WebListener public class InitListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println( " == Application start == " ); System.out.println( Config.getInstance().getAppName() ); System.out.println( Config.getInstance().getVersion() ); System.out.println( " ======================= " ); } @Override public void contextDestroyed(ServletContextEvent arg0) { // do nothing } }
Mac OS X で X509形式の公開鍵と、PKCS8形式の秘密鍵を生成する手順
忘れないようにX509形式の公開鍵とPKCS8形式の秘密鍵生成手順をメモっとく
ssh-keygen Generating public/private rsa key pair.
どこにファイルを作るか聞いてくる。ここではカレントディレクトリに test という名前のファイルで作成するように指定している。 Enter file in which to save the key (/Users/Jun/.ssh/id_rsa): ./test
パスフレーズを聞いてくる。同じパスフレーズを2回入力する。 Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ./test. Your public key has been saved in ./test.pub.
次に X509形式の公開鍵を生成する openssl rsa -pubout -in test -out test.x509
パスフレーズを入力 Enter pass phrase for gonzo: writing RSA key
X509形式の公開鍵が test.X509 に出力されているはず
次に PKCS8形式の秘密鍵を生成する openssl pkcs8 -in test -out test.p8 -topk8 -nocrypt
パスフレーズを入力 Enter pass phrase for gonzo:
PKCS8形式の秘密鍵が test.p8 に出力されているはず。
おわり。
JavaScriptでプライベートなメンバ変数を作る方法メモ
はじめに普通にオブジェクト(ここでは type, name 属性を持った Catオブジェクト)を作る
function Cat (type, name) { this.type = type; this.name = name; } var tama = new Cat('ペルシャ', 'タマ'); alert(tama.type); // ペルシャが表示される。 tama.type = '雑種'; // typeを変更できてしまう。 alert(tama.type); // 雑種が表示される。血統書付きのペルシャ猫が雑種呼ばわりとはあんまりだ。
タマが雑種呼ばわりされないために、Catクラスを↓のように書き換えてみる。
function Cat (type, name) { // これから猫種を調べるときはこのメソッドを使うこととする。 this.getType = function () { return type; }; this.getName = function () { return name; }; } var tama = new Cat('ペルシャ', 'タマ'); alert(tama.getType()); // ペルシャが表示される。 tama.type = '雑種'; alert(tama.getType()); // 上のコード実行後もペルシャが表示される。