順次、選択、そして繰り返し

プログラミングのことやITのこと、たまに演劇のことも書きます。

JavaDayTokyo2016に参加してきた

かなり遅くなったが、
セッションについてまとめてみようと思う。

Java Day Tokyo 2016|日本オラクル


【基調講演】
Innovate, Collaborate, with Java

今後のJavaについて説明。
スライドに書かれていた『あなたはJavaを愛していますか?』に
少し笑ってしまった。
あとはJava9の目玉として「Project Jigsaw」という
モジュール化について説明していた。
「Project Jigsaw」によってクラスパスの問題などが
解決されるみたい。
[速報]JavaOne開幕。Java 9は「Project Jigsaw」でクラスパスの問題とJDK肥大化の問題を解決する。JaveOne 2015 - Publickey


JavaEE
Introduction to MVC 1.0 (JSR 371)

JavaEE8から追加されるアクションベースのMVCについての説明。
JavaEE7まではコンポーネントベースのMVCしかなかったため、
開発方法の選択肢を増やすために追加した。

コンポーネントベースとは
JSF Wicket Tapestryとかが有名
コントローラーが大体の処理をする
MVが開発の範囲

アクションベースとは
Struts SpringMVCが有名。
MVCが開発の範囲
リクエストが単位
開発者の負担が大きい

リファレンス実装としてOzarkがある。
→実装が可能だということを証明している

Ozark

JavaEEの中にあるものでMVCを作りたかった
モデル
CDI BeanValidation JPA
ビュー
→Faceless JSP
コントローラー
JAX-RS

【JavaSE】
JavaFX 8 and the future

SwingやAWTではなく、JavaFX使おう。
バイルも対応している。

GUIのツールキット
デスクトップ、モバイル、組み込みもできる。

JavaFX8でいいところ
Swingと相互利用ができるところ

JavaFX8の新しい部分
DatePicker
→カレンダーの定義 CSSもサポートしてる

TreeTableView

ModenaUITheme
→全体的に丸み、フラットな感じになっている
 シンプルデザイン

アクセシビリティ
→音声案内

ダイアログが追加
→アラートも出せる
 OSに合わせたボタン

JavaFX9(JDK9)
jigsawModularity
→実行に必要最低限な依存関係のみのモジュールを
 選択するようにする

モジュールを必要最低限にすることでランタイムの
実行が短くなる

JavaEE
What HTTP/2 means to Java Developers?

HTTP/2になった時、Javaではどうするべきかの説明。

HTTP/1.1での問題点
陳腐化したプロトコル

Webページの使われ方が違うのに
プロトコルが変わっていない

Webページのサイズが増えてきている

1.1は遅延性の問題がある
→速やかにページをレンダリングする必要がある

Head-of-Line booking
リクエストの順番にレスポンスを
返す仕様なので途中で遅延すると
後続も遅延する

HTTP/2は遅延性を抑える
RFC7540 7541

モダンなブラウザはすべてHTTP/2

バイナリベースのプロトコルであること
→1.1はテキストベース

1つのストリームで2つのデータを送る

バイナリフレームになるが開発者は意識することはない

ServerPush
→クライアントから要求がなくてもリソースを送る
 WebSocketみたいな感じ?

HPack
→httpヘッダの変更した箇所だけを送信するようにする

HTTP/2 Java
Jetty
JavaSE9で取り込む予定
JEP110
JEPのゴールは古いものを新しくする

http://www.oracle.co.jp/jdt2016/pdf/4-B.pdf


特に気になったのは「Project Jigsaw」と「HTTP/2」かな...。
ちゃんと理解ができていないのでもっと調べる必要があるな。

JavaDayTokyo2016に向けて予習

1.MVC1.0(JSR371)

JavaEE8.0の新機能。

JSFというJavaEE標準でWebアプリケーションフレームワーク
存在するが、コンポーネントベースのフレームワークである。

コンポーネントベース
→表示する画面とそれに対応する画面処理クラスがあるイメージ。
 (1つの画面に対して、その画面専用の処理クラスがある)
 リクエスト時はViewに直接アクセスする。
 Viewに直接アクセスするため、開発とデザインを分業できる。
 (JSPのように処理クラスを介さなくても、画面イメージを表示できる)

アクションベース
→全てのリクエストがアクションクラスを経由し、アクションクラス内で
 表示するViewを決定する。

JavaEE標準でアクションベースのフレームワークが求められている。
SpringMVCのような機能がJava標準の機能になるみたいな感じ。

【参考サイト】
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
【JavaEE】今からでも間にあうJSF入門
JSR 371(MVC 1.0) Early Draft version 1.0 の日本語訳(前編) - Java EE 事始め!

2.Oracle Cloud Platform

Oracle Cloud Platformはオラクルが提供するPaaS。

クラウドサービスの種類について
IaaS
→ネットワーク・ハードウェア・OSとOSレイヤから
 下を提供する

PaaS
→ネットワーク・ハードウェア・OS・ミドルウェア
 ミドルウェア層までを提供する

SaaS
→ネットワーク・ハードウェア・OS・ミドルウェア・アプリケーション
 までを完全にサービス化しているもの

Oracle Cloud Platformは
Oracle Database Cloud Service」と「Oracle Java Cloud Service」の
サービスがあり前者がDB関係、後者がJavaEEアプリの開発/実行基盤関係

また、「Oracle Java Cloud Service」以外にもJavaSEやNode.jsに対応した
ものもある。

【参考サイト】
開発/検証環境にクラウドを活用する3つのポイントとは?:Oracle Cloud Platformを使うべき理由──他と何がどう違うのか (3/3) - @IT
IaaS PaaS SaaSの違い|クラウドエース(Cloud Ace)

3.JavaFX

リッチインターネットアプリケーションのGUIライブラリ。
AWTやSwingとは異なるもの。
JavaFX1ではJavaFXScriptという言語で開発する仕組みだったが、
JavaFX2からJavaAPIに置き換わった。

4.HTTP/2

GoogleがSPDYというプロトコルを作成していて、
その進化版がHTTP/2。

HTTP/1.1ではHTTPパイプラインという前回のリクエストを
待たずに次のリクエストを送信できる仕組みがあった。
しかし、サーバーはリクエストの順番にレスポンスを返すという
制限があるため、最初のほうのリクエスト処理が遅くなると
後続のリクエスト処理が遅くなるということがある。

HTTP/2では1つの接続にストリームの多重化を行うことで
HTTPパイプラインの問題を解消している。

JavaSE9でHTTP/2のサポートが実現される。

【参考サイト】
HTTP/2の特徴 HTTP/1.1との違いについて | REDBOX Labo






 

初夏のJavaScript祭りで発表されたスライドを集めてみた

5月14日(土)に開催されていたが所用で
参加できなかった。

初夏のJavaScript祭2016 inテコラス – JavaScript祭


なので、発表で使われた(であろう)スライドを
探して集めてきた。


14:55 – 15:10
フロントエンドのNPM活用法
hello npm // Speaker Deck


16:25 – 16:40
ES2015の今とこれから
ES2015の今とこれから


16:45 – 17:00
JAVASCRIPTでデバイス連携してみて出会える技術!広がる知識!
2016初夏のJavaScript祭り20160514


LT
Ramdaで手軽に関数型プログラムを始めよう
Ramdaで手軽に関数型言語を始めよう // Speaker Deck


今回はJavaScript祭りに参加できなかったけど、
21日にはJJUG CCC 2016 Spring、24日にはJavaDayTokyoに参加予定なので楽しみ。

Java8のOptionalを試してみた1

Java8のOptionalでは値が無い場合は
nullではなく、emptyというオブジェクトが返ってくるらしい。

以下、ソースコード
JavaTrial/OptionalTest.java at master · sndstudy/JavaTrial · GitHub

package test.java;

import java.util.Optional;

/**
 * Optionalのテスト
 *
 */
public class OptionalTest {

	public static void main(String[] args) {

		/********************************/
		/*				*/
		/*nullの判定(Optional未使用)	*/
		/*				*/
		/********************************/

		String hoge = "hoge";

		if(null != hoge){
			System.out.println(hoge);
		}


		/********************************/
		/*				*/
		/*nullの判定(Optional使用)	*/
		/*				*/
		/********************************/

		//値をラッパーする
		Optional<String> hogeOpt = Optional.ofNullable(hoge);

		//isPresent()は値がある場合はtrue
		//nullの場合はfalseを返す
		if(hogeOpt.isPresent()){
			//get()で値を取得する
			System.out.println(hogeOpt.orElse(hogeOpt.get()));
		}


		/********************************/
		/*				*/
		/*nullの判定(ラムダ式使用)	*/
		/*				*/
		/********************************/

		//ifPresent()はnull以外の場合に処理を実行する
		hogeOpt.ifPresent(str -> System.out.println(str));


	}

}

今までの値のnull判定はこうだった。

/********************************/
/*				*/
/*nullの判定(Optional未使用)	*/
/*				*/
/********************************/

String hoge = "hoge";

if(null != hoge){
	System.out.println(hoge);
}

Optionalではこうなる

/********************************/
/*				*/
/*nullの判定(Optional使用)	*/
/*				*/
/********************************/

//値をラッパーする
Optional<String> hogeOpt = Optional.ofNullable(hoge);

//isPresent()は値がある場合はtrue
//nullの場合はfalseを返す
if(hogeOpt.isPresent()){
	//get()で値を取得する
	System.out.println(hogeOpt.orElse(hogeOpt.get()));
}

ソースコード量はあまり変わらないが、Optionalを使用することで
"この値は空の可能性がある"ということを明示的にすることができるみたい。


ラムダ式で書くとこうスッキリする。

/********************************/
/*				*/
/*nullの判定(ラムダ式使用)	*/
/*				*/
/********************************/

//ifPresent()はnull以外の場合に処理を実行する
hogeOpt.ifPresent(str -> System.out.println(str));

Java8で追加されたOptionalを使いこなせば、
NullPointerExceptionが起きにくいコードが書けるようになるかも。

必要最低限のMVCモデル(PHP)

PHPを調べてたらこんな記事が。

PHP10行で作る超シンプルフレームワーク - かってぃのブログ | choilog [チョイログ]

ほー面白そう。やってみよう。

とりあえず、.htaccessから
.htaccessはサーバーの動作を制御する設定ファイルみたいなものらしい。

<IfModule mod_rewrite.c>
    DirectoryIndex index.php
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ dispatch.php?url=$1 [QSA,L]
</IfModule>

以下の部分がすべてのアクセスをdispatch.php
集約するようになるらしい。

RewriteRule ^(.*)$ dispatch.php?url=$1 [QSA,L]

次にdispatch.php

<?php

/************************************************/
/* dispatch.php 				*/
/* 全てのアクセスを一旦dispatch.phpに集約させる */
/* 設定は.htaccessで行う 			*/
/************************************************/

/* グローバル変数読み込み */
require_once('./global.php');

$dataTransfer = 100;

/* URI取得 */
$url = "";

if(!empty($_GET['url'])){
	$url = $_GET['url'];
	$uri = explode('/', $url);
	$uri = array_shift($uri);
}

/* ファイルの存在確認 */
if(file_exists('./'.$uri.'Controller.php')){

	/* URIをもとにコントローラーへ */
	include ('./'.$uri.'Controller.php');

}else{

	/* エラー画面へ */
	include ('./error.php');
}

?>

http://localhost/プロジェクト名/xxxxxxxxの
xxxxxxxxを抽出して、コントローラーを割り振る。
抽出処理は以下の部分

if(!empty($_GET['url'])){
	$url = $_GET['url'];
	$uri = explode('/', $url);
	$uri = array_shift($uri);
}


今回はxxxxxxxxの部分をtestというURIにして実装する。
以下の部分で$uriに"test"という文字列が格納されているので、
testController.phpに遷移する。

/* URIをもとにコントローラーへ */
include ('./'.$uri.'Controller.php');

testController.php

<?php

/************************************************/
/* testController.php 				*/
/* コントローラーの役割 			*/
/************************************************/

	/* Modelを読み込む */
	require_once('./'.$uri.'Model.php');

	/* Modelの関数を実行 */
	$dataTransfer = execute($dataTransfer);

	/* Viewの読み込み */
	include ('./'.$uri.'View.php');

?>

処理を記載するtestModel.php
今回は与えられた値を2倍にして返すだけの処理を記載

<?php

/************************************************/
/* testModel.php 				*/
/* 処理を行う(ここでDBアクセスとかするイメージ)	*/
/************************************************/

	/* 実行する関数 */
	function execute($params){
		return $params * 2;
	}

?>

処理結果を出力するtestView.php

<?php
/************************************************/
/* testView.php 				*/
/* 出力画面 					*/
/************************************************/
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>シンプルフレームワーク</title>
    </head>
    <body>
        <h1><?php echo $dataTransfer; ?></h1>
    </body>
</html>

グローバル変数をまとめたglobal.php

<?php

/* データを受けとる変数 */
global $dataTransfer;

/* URIを格納する変数 */
global $uri;

?>

http://localhost/プロジェクト名/testでアクセスすると
正常に動作する。


全体の流れとしては……

全てのアクセスをdispatch.phpにまとめる

dispatch.phpでコントローラーを決定する。

モデルで処理を行う。

ビューで処理結果を基に出力する。

今回は記事をもとにして、実装を行った。
コントローラーの設定などがPHPファイルに直書きなので、設定内容とかを
XMLに記載し、それをPHPで読み込ませて反映させるとか
色々と改良できると思う。

手動DIを試してみた

DI(DependencyInjection)とは依存性の注入のこと。

Dependencyは依存という意味らしいがDIについて調べてみると
依存というのは使われる側のオブジェクト(依存オブジェクト)のことを
指してるみたい。

やはりあなた方のDependency Injectionはまちがっている。 — A Day in Serenity (Reloaded) — PHP, FuelPHP, Linux or something

SpringMVCのDIコンテナを使用してソースを書いている時、
DIコンテナインスタンスが生成されているから
newしてインスタンス生成する必要がない。
これは自動的なDIらしい。

なので、今回は手動でDIをやってみる。

DIの種類には3つあるみたい。

  1. インターフェース注入
  2. setter注入
  3. コンストラクタ注入

依存性の注入 - Wikipedia

今回はコンストラクタでの注入でやってみる。

まずはメイン(実行)のクラス(DITest.java)

package di;

/**
 *
 *	手動DIのテスト
 *
 */
public class DITest {
	public static void main(String[] args) {

		//ここで生成するインスタンスを変えると処理結果が変わる
		OutputService outputServiceImpl = new FooOutputServiceImpl();

		//依存性の注入を行っている
		Client client = new Client(outputServiceImpl);

		client.execute();

	}

}

依存性を注入するクラス(Client.java)

package di;

/**
 *
 * クライアントクラス
 * このクラスではnewでインスタンスを生成していないため
 * 依存性は無い
 *
 */
public class Client {

	private OutputService outputServiceImpl;

	/**
	 * コンストラクタ
	 */
	public Client(OutputService outputService) {

		/* コンストラクタ・インジェクション */
		this.outputServiceImpl = outputService;

	}

	/**
	 * 実行メソッド
	 */
	public void execute() {

		outputServiceImpl.execute();

	}

}

インターフェース(OutputService.java)

package di;

public interface OutputService {

	void execute();
}

実装クラス1(HogeOutputServiceImpl.java)

package di;

public class HogeOutputServiceImpl implements OutputService {

	@Override
	public void execute() {
		System.out.println("Hoge");

	}

}

実装クラス2(FooOutputServiceImpl.java)

package di;

public class FooOutputServiceImpl implements OutputService {

	@Override
	public void execute() {
		System.out.println("Foo");
	}

}

DITestクラスでClientクラスのインスタンスを生成しているが、
生成時にFooOutputServiceImplクラスのインスタンスを引数で渡している。
その部分で依存性の注入が行われている。
この場合、Clientクラスのコンストラクタで依存性の注入を行っているため
コンストラクタインジェクション」という。

実際に手動でDIをしてみると、ただnewしていないからDIしているという
訳ではなくそのクラス内でnewが行われず、外部からインスタンスが渡されている
からDIなんだということが理解できてよかった。

PHPを始めてみた(環境構築からHelloWorld出力まで)

少し気になってた言語、PHPを始めてみた。

色々なサイトを見てみるとJSPに近い感じなのかと思った。

PHPは動的にウェブページを実現するための
サーバーサイド・スクリプト言語みたい。

PHP: Hypertext Preprocessor - Wikipedia

まずは環境構築から。
XAMPPとeclipseでローカルにPHP開発環境を構築する - うろ覚えメモ
↑上のサイトを参考にXAMPPをインストール。

Download XAMPP
↑ダウンロードサイトには32bitって書いてあるが、Windows10の
64bitでも動作できた。

インストールが完了したら下記の画面が表示される。
f:id:sndstudy:20160327233436p:plain

ApacheのStartボタンをおすとサーバーが起動する。

次はEclipseの設定。

ワークスペースをXAMPPのホームディレクトリに設定。
f:id:sndstudy:20160327233652p:plain

xamppフォルダ直下のhtdocsフォルダがXAMPPのホームディレクトリらしい。

EclipsePHP開発を行うためにPDT (PHP Development Tools)をインストールする。
Eclipseのヘルプ>Eclipseマーケットプレースで"PDT"と検索する。
f:id:sndstudy:20160327234104p:plain
PHP開発者ツールを選択し、インストールする。


次に"phptest"というプロジェクトを作成し、その中にindex.phpを作成する。
f:id:sndstudy:20160327234239p:plain


コードはこんな感じ。

<?php
echo "Hello World"
?>

Apacheを起動した状態で、"http://localhost/phptest/"にアクセスすると出力される。
f:id:sndstudy:20160327234439p:plain


今回はHelloWorldの出力だけしかしてないので、
次はhtmlタグを織り込ませながらページを作成していきたい。