JavaとJavaEEプログラマのブログ

JavaEEを中心にしたをソフトウェア開発についてのブログ

初心者が読むべき技術書

UNIXという考え方―その設計思想と哲学
Mike Gancarz
オーム社
売り上げランキング: 15,126
ハッカーと画家 コンピュータ時代の創造者たち
ポール グレアム
オーム社
売り上げランキング: 20,748

開発技法やツール関係

実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる (Object Oriented SELECTION)

実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる (Object Oriented SELECTION)


読み込んで、うまいAPIをデザインできるようになりたい。

トヨタ生産方式―脱規模の経営をめざして

トヨタ生産方式―脱規模の経営をめざして


内容は全く古びていない。アジャイルな開発手法の原典。

アジャイルなゲーム開発 スクラムによる柔軟なプロジェクト管理

アジャイルなゲーム開発 スクラムによる柔軟なプロジェクト管理


アリスとボブのGit入門レッスン

アリスとボブのGit入門レッスン


課題管理システム JIRA入門

課題管理システム JIRA入門



チケット駆動開発

チケット駆動開発


Unityによる3Dゲーム開発入門 ―iPhone/Android/Webで実践ゲームプログラミング

Unityによる3Dゲーム開発入門 ―iPhone/Android/Webで実践ゲームプログラミング



ウェブデザインのつくり方、インターフェイスデザインの考え方。

ウェブデザインのつくり方、インターフェイスデザインの考え方。

モバイル関係

Androidプログラミング上達読本

Androidプログラミング上達読本


内容が濃くて非常に参考になった。
現場で使える〔逆引き+実践〕 Androidプログラミングテクニック

現場で使える〔逆引き+実践〕 Androidプログラミングテクニック



Androidゲームプログラミング A to Z

Androidゲームプログラミング A to Z


Smartphone Design [スマートフォンデザイン] ~スマートフォンアプリ開発者とデザイナのための総合情報誌

Smartphone Design [スマートフォンデザイン] ~スマートフォンアプリ開発者とデザイナのための総合情報誌


モバイルデザインパターン― ユーザーインタフェースのためのパターン集

モバイルデザインパターン― ユーザーインタフェースのためのパターン集


Android対応 マスコットアプリ プログラミング

Android対応 マスコットアプリ プログラミング

HTML5、JavaScript関係

WebGL+HTML5 3DCGプログラミング入門

WebGL+HTML5 3DCGプログラミング入門


主流になる…か?
すべての人に知っておいてほしい HTML5 & CSS3 の基本原則

すべての人に知っておいてほしい HTML5 & CSS3 の基本原則


すべての人に知っておいてほしい スタイルシートデザインの基本原則

すべての人に知っておいてほしい スタイルシートデザインの基本原則

コアjQuery+プラグイン/jQuery UI 開発実践技法 (Programmer’s SELECTION)

コアjQuery+プラグイン/jQuery UI 開発実践技法 (Programmer’s SELECTION)


jQueryを使うなら、まずはこれから。
ステートフルJavaScript ―MVCアーキテクチャに基づくWebアプリケーションの状態管理

ステートフルJavaScript ―MVCアーキテクチャに基づくWebアプリケーションの状態管理


JavaScriptMVCが一番使いやすいと思う。

現場のワークフローで覚える Webサイト制作教室

現場のワークフローで覚える Webサイト制作教室


分かりやすかった。

JavaScriptグラフィックス ―ゲーム・スマートフォン・ウェブで使う最新テクニック

JavaScriptグラフィックス ―ゲーム・スマートフォン・ウェブで使う最新テクニック



jQuery Mobile

jQuery Mobile




enchant.js スマートフォンゲーム開発講座 PRO対応 (SMART GAME DEVELOPER)

enchant.js スマートフォンゲーム開発講座 PRO対応 (SMART GAME DEVELOPER)

AWS関係

Amazon Web Servicesプログラミング ―APIの基礎からElastic Beanstalkの利用まで

Amazon Web Servicesプログラミング ―APIの基礎からElastic Beanstalkの利用まで


AWSを使うなら必須。チュートリアルをまだ終えていない…
Amazon Web Services クラウドデザインパターン 設計ガイド

Amazon Web Services クラウドデザインパターン 設計ガイド


各サービスの使い方が参考になる。

Java関係

Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)

Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)


Enterprise JavaBeans 3.1 第6版

Enterprise JavaBeans 3.1 第6版


この2冊は今後のJava開発では必須。

サーブレット&JSPコンプリートマスター

サーブレット&JSPコンプリートマスター


Servlet3.0が詳しい。

Javaセキュアコーディングスタンダード CERT/ Oracle版

Javaセキュアコーディングスタンダード CERT/ Oracle版


リアライザーションなど余り使わない機能への注意が嬉しい。

Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集

Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集


Apache POI入門

Apache POI入門

GlassFish4でWebsocket〜JSR 356〜

JSR 356 はJavaEE7で策定されるWebSocketを利用するための標準API
そのEarly Draftを使って、NetBeansでサンプルを動かしてみる。

参考:
http://orablogs-jp.blogspot.jp/2012/10/websocket-applications-using-java-jsr.html
http://jcp.org/en/jsr/detail?id=356

  1. GlassFish 4.0 Promoted Buildをダウンロードしてインストール。

GlassFish 4.0 Promoted Buildのダウンロードはここから。
http://dlc.sun.com.edgesuite.net/glassfish/4.0/promoted/

インストール時の画面やインストール先のディレクトリにはGlasFish3と出るが、気にせずインストール(インストール先のディレクトリはGlassFish4にしておくと分かりやすい)。
インストールした後は、(現在の最新バージョンであるGlassFish4.0 build 60時点では管理画面が動かないので)asadminコマンドでwebSocketを有効にする。

asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.websockets-support-enabled=true
  1. NetBeansにGlassFish4を追加し、プロジェクトを作成する。

左メニューのサービスタブをクリック。サーバーツリーを右クリック→サーバーを追加 でインストールしたGlasFish4を選択する。
ファイル→新規プロジェクト→Maven→Webアプリケーションを選択。サーバーに先ほど追加したGlassFish4を指定する。
pom.xmlにWebSocketのdependency↓を追加してビルド。

        <dependency>
            <groupId>javax.net.websocket</groupId>
            <artifactId>javax.net.websocket-api</artifactId>
            <version>1.0-b06</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.glassfish.websocket</groupId>
            <artifactId>websocket-api</artifactId>
            <version>0.2</version>
            <scope>provided</scope>
        </dependency>
  1. クラスと画面を作る。

WebSocketの処理を行う次のクラスを作る。
現在の仕様では@WebSocketEndpointアノテーションからpath属性が無くなり、文字列だけでpathを指定できるようになっている。

package org.example;

import javax.net.websocket.annotations.WebSocketEndpoint;
import javax.net.websocket.annotations.WebSocketMessage;

/**
 *
 * @author masayasu
 */
@WebSocketEndpoint("/hello")
public class HelloWorld  {

    @WebSocketMessage
    public String sayHello(String name, Session session) {
        return session + ": hello " + name;
    }
}

画面はHTML5で作成。新規作成ウィザードからindex.htmlを作成する。
接続先のURLはプロジェクトのコンテキストパス(プロジェクトを右クリック→実行で表示される)に合わせて修正する。
( var host = "ws://localhost:8080/(ここにコンテキストパスを指定する)/hello";
index.html

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {

    var socket;
    var host = "ws://localhost:8080/webSocket-study/hello";

    try{
        socket = new WebSocket(host);
        message('<p class="event">Socket Status: ' + socket.readyState);

        socket.onopen = function(){
            message('<p class="event">Socket Status: '+socket.readyState+' (open)');
        }

        socket.onmessage = function(msg){
            message('<p class="message">Received: '+msg.data);
        }

        socket.onclose = function(){
            message('<p class="event">Socket Status: '+socket.readyState+' (closed)');
        }
    } catch(exception){
        message('<p>Error'+exception);
    }

    function send() {
        var text = $('#text').val();
        if(text==""){
            message('<p class="warning">Please enter a message');
            return ;
        }
        try {
            socket.send(text);
            message('<p class="event">Sent: '+text)
        } catch(exception){
            message('<p class="warning">');
        }
        $('#text').val("");
    }

    function message(msg){
        $('#chatLog').append(msg+'</p>');
    }

    $('#text').keypress(function(event) {
        if (event.keyCode == '13') {
            send();
        }
    });

    $('#disconnect').click(function(){
        //socket.close();
    });
});
</script>
<meta charset=utf-8 />
<style type="text/css">
body{font-family:Arial, Helvetica, sans-serif;}
#container{
    border:5px solid #808080;
    width:800px;
    margin:0 auto;
    padding:10px;
}
#chatLog{
    padding:5px;
    border:1px solid black; 
}
#chatLog p{margin:0;}
.event{color:#999;}
.warning{
    font-weight:bold;
    color:#CCC;
}
</style>
<title>Hello World</title>

</head>
<body>
  <div id="wrapper">

    <div id="container">

        <h1>WebSocket Hello World</h1>

        <div id="chatLog">

        </div>
        <p id="examples">Type your name and press &lt;enter&gt;</p>

        <input id="text" type="text" />
        <button id="disconnect">Disconnect</button>

    </div>

  </div>
</body>
</html>

Webページを右クリック→新規→標準のデプロイメント・ディスクリプタでWEB-INF/web.xmlを作成。web.xmlをindex.htmlに変更する(web.xmlを開いてページタブ→開始ファイルで選択してもよい)。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>


プロジェクトを右クリックからビルドし、実行するとブラウザが開かれ、nameを入力してenterキーを押すと画面にSessionの内容+":hello "+入力したnameが表示される。

JSR 356 のAPI Docはhttp://jcp.org/en/jsr/detail?id=356のDownload pageをたどるとダウンロードできる。
RESTful APIJAX-RSと同じようにpathの一部をパラメータとして渡せる。