SlideShare a Scribd company logo
1 of 67
Google App Engine
     for Java
初めてなんだから・・・やさしくしてね?編


       2012.3.24
        つっちぃ
      @takuya0301
Outline

• Google App Engine for Java (GAE/J) といろ
  いろ組み合わせるとすごそうなので、
  そのすごそうさ具合を説明します。

• 最後に、簡単なデモとその作り方を紹
  介します。
Agenda

• GAE/J のいいところを紹介
• Eclipse で開発環境を構築
• GAE/J プロジェクトの実行
• デモ:ゲストブック
What is
Google App Engine?
Google App Engine
Google App Engine

• 無料*の PaaS 環境(Python, Java, Go)
• NoSQL データストア (BigTable)
• いろいろなサービスへの API
• そこそこ充実している管理画面
  * いろいろな制限はありますが、課金で制限を緩和できます。
GAE for Java




   Duke の存在感www
GAE for Java




可哀想なのでフレームをつけてあげましたw
Why GAE for Java?
• Java は不滅!(あと10年くらいは……)
• Google Web Toolkit (GWT) との親和性
• VMware と Google のクラウド連携強化*
 -   Spring, Google App Engine, SpringSource Tool Suite

 -   Spring Roo, Google Web Toolkit

 -   Spring Insight, Google Speed Tracer
* http://www.vmware.com/jp/company/news/releases/vmware-google.html
GAE/J
      Specification
• Servlet 2.5
• JSP 2.2 (except Unified EL)
• JSTL 1.1
• JDO 2.3
• JPA 1.0
Google Web Toolkit
Google Web Toolkit

• Java で AJAX フロントエンドを記述
• JavaScript にコンパイルして実行
• クロスブラウザ(Internet Explorer 6 対応)
• 豊富なウィジェット (3rd party: Ext GWT*)
      * http://www.sencha.com/products/extgwt
http://www.sencha.com/examples/
Building
Development
Environment
Pre-required
     Software

• Java SE Development Kit 6
• Google Chrome (optional)
• 英語のドキュメントに負けない気持ち
Eclipse
Eclipse

• いわずと知れた重厚長大な IDE
• Google 推奨の GAE/J 開発環境
• なんだかんだ言って便利
• Eclipse IDE for Java EE Developers 推奨
or...


orz じゃないですよ。
Pleiades All in One




すみません、NetBeans じゃないです。個人的には NetBeans が好きです。
Pleiades All in One

• 日本語化版 Eclipse +便利プラグイン
• Pleiades = Eclipse プラグイン日本語化プラグイン
• Pleiades All in One for Java Developers 推奨
Google Plugin
 for Eclipse
Google Plugin
    for Eclipse
• GAE/J & GWT 開発用プラグイン
• ローカル実行用サーバー環境
• GAE デプロイツール
• GWT コンパイラ
Ex. Development
   Environment
• Windows XP Professional SP3
• Java SE Development Kit 6 Update 31
• Google Chrome 17.0
• Pleiades All in One for Java Developers
  (based on Eclipse Indigo 3.7.2)
• Google Plugin for Eclipse*
     * Eclipse マーケットプレースからインストールする。
Installation Note
  • Pleiades のインストールフォルダ*
    推奨:C:¥pleiades
    自分:C:¥Document and Settings¥takuya¥My Documents¥pleiades


  • Google Plugin のインストール
    1. Eclipse を起動
    2. ヘルプ>Eclipse マーケットプレースをクリック
    3. Google Plugin で検索してインストール


* Windows では、パスが長いとインストール(ZIP の解凍)に失敗するそうです。
Google Plugin for Eclipse
Running
GAE/J Project
Create GAE Project
1. Eclipse を起動

2. ファイル>新規>プロジェクトをクリック

3. Google>Web アプリケーション・プロジェクトをクリック

4. Windows ファイアウォールの警告:ブロック解除

5. 新規 Web アプリケーション・プロジェクトウィザード
  プロジェクト名:Guestbook
  パッケージ名:com.example.guestbook
  Google Web ツールキットを使用:使用しない
よくある Web アプリケーションのディレクトリ構成
Run Application
1. 実行>実行をクリック

2. http://localhost:8888/guestbook にアクセス

•   エラーの場合、下記を設定*
    1. プロジェクト>プロパティをクリック
    2. 実行/デバッグ設定>Guestbook>編集をクリック
    3. 引数>VM 引数>につぎの引数を追加
     -Dappengine.user.timezone=UTC


          * バグみたいです。(2012年3月17日現在)
Hello, world ですw
Demo Application
   “Guestbook”*


* Google App Engine のサイトにあるチュートリアルをベースにしてつくってます。
http://ipu-tokyo.appspot.com
1. Specification

• コメントの閲覧・投稿
• Google アカウント対応
• 通りすがりの投稿可能
• エラー処理:空コメント
2. Page Design


• 完成イメージを HTML で作成
CSS?なにそれ?おいしいの?
1	 <!DOCTYPE	 html>
	 2	 <html>
	 3	 <head>
	 4	 <meta	 charset="UTF-8">
	 5	 <title>Guestbook</title>
	 6	 </head>
	 7	 <body>
	 8	 	 <h1>Guestbook</h1>
	 9	 	 <p><a	 href="#">サインイン</a>するとコメントに名前が表示されます。</p>
10	 	 <p>こんにちは、takuya0301	 さん。(<a	 href="#">サインアウト</a>)</p>
11	 	 <ul>
12	 	 	 <li>つっちぃ	 (@takuya0301)	 です。自己紹介して	 Twitter	 ID	 を晒しましょうw
13	 	 	 	 --	 takuya0301	 (2012-03-24	 04:24:43)</li>
14	 	 </ul>
15	 	 <form	 method="POST"	 action="/guestbook">
16	 	 	 <input	 type="text"	 size="80">
17	 	 	 <input	 type="submit">
18	 	 </form>
19	 	 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p>
20	 </body>
21	 </html>




                                                                    index.html
3. Google Account


• Google アカウントでのログイン機能
• ログイン状態による表示切り替え
ローカルではテスト用ログイン画面になります。
16	 public	 class	 GuestbookServlet	 extends	 HttpServlet	 {
17	 	 	 	 	 public	 void	 doGet(HttpServletRequest	 request,	 HttpServletResponse	 response)
18	 	 	 	 	 	 	 	 	 	 	 	 	 throws	 IOException,	 ServletException	 {
19	 	 	 	 	 	 	 	 	 //	 User	 サービスの取得
20	 	 	 	 	 	 	 	 	 UserService	 userService	 =	 UserServiceFactory.getUserService();
21	 
22	 	 	 	 	 	 	 	 	 //	 ログイン中ユーザーの取得(ユーザーがいないときは	 null)
23	 	 	 	 	 	 	 	 	 User	 user	 =	 userService.getCurrentUser();
24	 
25	 	 	 	 	 	 	 	 	 //	 ログイン/ログアウト用	 URL	 の生成(引数は戻り	 URL)
26	 	 	 	 	 	 	 	 	 String	 loginURL	 =	 userService.createLoginURL(request.getRequestURI());
27	 	 	 	 	 	 	 	 	 String	 logoutURL	 =	 userService.createLogoutURL(request.getRequestURI());
28	 
29	 	 	 	 	 	 	 	 	 request.setAttribute("user",	 user);
30	 	 	 	 	 	 	 	 	 request.setAttribute("loginURL",	 loginURL);
31	 	 	 	 	 	 	 	 	 request.setAttribute("logoutURL",	 logoutURL);
32	 
33	 	 	 	 	 	 	 	 	 request.getRequestDispatcher("/guestbook.jsp").forward(request,	 response);
34	 	 	 	 	 }
35	 }




                                                                        GuestbookServlet.java
1	 <%@	 page	 contentType="text/html;charset=UTF-8"	 %>
	 2	 <%@	 page	 trimDirectiveWhitespaces="true"	 %>
	 3	 <%@	 taglib	 uri="http://java.sun.com/jsp/jstl/core"	 prefix="c"	 %>
	 4	 <!DOCTYPE	 html>
	 5	 <html>
	 6	 <head>
	 7	 <meta	 charset="UTF-8">
	 8	 <title>Guestbook</title>
	 9	 </head>
10	 <body>
11	 	 <h1>Guestbook</h1>
12	 	 <%--	 ログインユーザーの有無で分岐	 --%>
13	 	 <c:choose>
14	 	 	 <c:when	 test="${empty	 user}">
15	 	 	 	 <p>
16	 	 	 	 	 <a	 href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。
17	 	 	 	 </p>
18	 	 	 </c:when>
19	 	 	 <c:otherwise>
20	 	 	 	 <p>
21	 	 	 	 	 こんにちは、${user.nickname}	 さん。(<a	 href="${logoutURL}">サインアウト</a>)
22	 	 	 	 </p>
23	 	 	 </c:otherwise>
24	 	 </c:choose>
25	 </body>
26	 </html>


                                                                  guestbook.jsp
4. Comment Posting

 • HTML フォームからコメントを投稿
 • JDO* でコメントを永続化
 • エラー処理:空コメント

* JDO (Java Data Objects) は、Java オブジェクトの永続性に関する仕様です。
ローカルでも管理画面があり、データストアが見れます。
4	 <!DOCTYPE	 html>
	 5	 <html>
	 6	 <head>
	 7	 <meta	 charset="UTF-8">
	 8	 <title>Guestbook</title>
	 9	 </head>
10	 <body>
11	 	 <h1>Guestbook</h1>
12	 	 <%--	 ログインユーザーの有無で分岐	 --%>
13	 	 <c:choose>
14	 	 	 <c:when	 test="${empty	 user}">
15	 	 	 	 <p>
16	 	 	 	 	 <a	 href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。
17	 	 	 	 </p>
18	 	 	 </c:when>
19	 	 	 <c:otherwise>
20	 	 	 	 <p>
21	 	 	 	 	 こんにちは、${user.nickname}	 さん。(<a	 href="${logoutURL}">サインアウト</a>)
22	 	 	 	 </p>
23	 	 	 </c:otherwise>
24	 	 </c:choose>
25	 	 <%--	 コメント投稿フォーム	 --%>
26	 	 <form	 method="POST"	 action="/guestbook">
27	 	 	 <input	 type="text"	 name="comment"	 size="80">	 <input	 type="submit">
28	 	 </form>
29	 	 <%--	 空コメントの場合、エラーメッセージを表示	 --%>
30	 	 <c:if	 test="${isEmptyCommentError}">
31	 	 	 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p>
32	 	 </c:if>
33	 </body>
34	 </html>
                                                                     guestbook.jsp
39	 	 	 	 	 public	 void	 doPost(HttpServletRequest	 request,	 HttpServletResponse	 response)
40	 	 	 	 	 	 	 	 	 	 	 	 	 throws	 IOException,	 ServletException	 {
41	 	 	 	 	 	 	 	 	 String	 comment	 =	 request.getParameter("comment");
42	 
43	 	 	 	 	 	 	 	 	 //	 エラー:空コメント
44	 	 	 	 	 	 	 	 	 if	 (comment.isEmpty())	 {
45	 	 	 	 	 	 	 	 	 	 	 	 	 request.setAttribute("isEmptyCommentError",	 true);
46	 	 	 	 	 	 	 	 	 	 	 	 	 doGet(request,	 response);
47	 	 	 	 	 	 	 	 	 	 	 	 	 return;
48	 	 	 	 	 	 	 	 	 }
49	 
50	 	 	 	 	 	 	 	 	 UserService	 userService	 =	 UserServiceFactory.getUserService();
51	 	 	 	 	 	 	 	 	 User	 user	 =	 userService.getCurrentUser();
52	 
53	 	 	 	 	 	 	 	 	 String	 id	 =	 user	 !=	 null	 ?	 user.getUserId()	 :	 "";
54	 	 	 	 	 	 	 	 	 String	 name	 =	 user	 !=	 null	 ?	 user.getNickname()	 :	 "";
55	 	 	 	 	 	 	 	 	 Date	 postingDate	 =	 new	 Date();
56	 
57	 	 	 	 	 	 	 	 	 //	 コメントオブジェクトの生成
58	 	 	 	 	 	 	 	 	 Comment	 c	 =	 new	 Comment(id,	 name,	 comment,	 postingDate);
59	 
60	 	 	 	 	 	 	 	 	 //	 コメントオブジェクトの永続化
61	 	 	 	 	 	 	 	 	 PersistenceManager	 pm	 =	 PMF.get().getPersistenceManager();
62	 	 	 	 	 	 	 	 	 try	 {
63	 	 	 	 	 	 	 	 	 	 	 	 	 pm.makePersistent(c);
64	 	 	 	 	 	 	 	 	 }	 finally	 {
65	 	 	 	 	 	 	 	 	 	 	 	 	 pm.close();
66	 	 	 	 	 	 	 	 	 }
67	 
68	 	 	 	 	 	 	 	 	 doGet(request,	 response);
69	 	 	 	 	 }
                                                                        GuestbookServlet.java
12	 @PersistenceCapable
13	 public	 class	 Comment	 {
14	 	 	 	 	 @PrimaryKey
15	 	 	 	 	 @Persistent(valueStrategy	 =	 IdGeneratorStrategy.IDENTITY)
16	 	 	 	 	 private	 Key	 key;
17	 
18	 	 	 	 	 @Persistent
19	 	 	 	 	 private	 String	 id;
20	 
21	 	 	 	 	 @Persistent
22	 	 	 	 	 private	 String	 name;
23	 
24	 	 	 	 	 @Persistent
25	 	 	 	 	 private	 String	 comment;
26	 
27	 	 	 	 	 @Persistent
28	 	 	 	 	 private	 Date	 postingDate;
29	 
30	 	 	 	 	 public	 Comment(String	 id,	 String	 name,	 String	 comment,	 Date	 postingDate)	 {
31	 	 	 	 	 	 	 	 	 this.id	 =	 id;
32	 	 	 	 	 	 	 	 	 this.name	 =	 name;
33	 	 	 	 	 	 	 	 	 this.comment	 =	 comment;
34	 	 	 	 	 	 	 	 	 this.postingDate	 =	 postingDate;
35	 	 	 	 	 }
36	 
	 	 	 	 	 	 	 //	 ゲッターメソッドが続く
56	 }

                                                                                      Comment.java
1	 package	 com.example.guestbook;
	 2	 
	 3	 import	 javax.jdo.JDOHelper;
	 4	 import	 javax.jdo.PersistenceManagerFactory;
	 5	 
	 6	 public	 final	 class	 PMF	 {
	 7	 	 	 	 	 private	 static	 final	 PersistenceManagerFactory	 pmfInstance	 =
	 8	 	 	 	 	 	 	 	 	 	 	 	 	 JDOHelper.getPersistenceManagerFactory("transactions-optional");
	 9	 
10	 	 	 	 	 private	 PMF()	 {}
11	 
12	 	 	 	 	 public	 static	 PersistenceManagerFactory	 get()	 {
13	 	 	 	 	 	 	 	 	 return	 pmfInstance;
14	 	 	 	 	 }
15	 }




        インスタンス生成処理負荷軽減のためのシングルトンラッパークラスです。
                                          PMF.java
5. Comment List


• コメントをリスト表示
10	 <body>
11	 	 <h1>Guestbook</h1>
12	 	 <%--	 ログインユーザーの有無で分岐	 --%>
13	 	 <c:choose>
14	 	 	 <c:when	 test="${empty	 user}">
15	 	 	 	 <p><a	 href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。</p>
16	 	 	 </c:when>
17	 	 	 <c:otherwise>
18	 	 	 	 <p>
19	 	 	 	 	 こんにちは、${user.nickname}	 さん。(<a	 href="${logoutURL}">サインアウト</a>)
20	 	 	 	 </p>
21	 	 	 </c:otherwise>
22	 	 </c:choose>
23	 	 <%--	 コメント投稿フォーム	 --%>
24	 	 <form	 method="POST"	 action="/guestbook">
25	 	 	 <input	 type="text"	 name="comment"	 size="80">	 <input	 type="submit">
26	 	 </form>
27	 	 <%--	 空コメントの場合、エラーメッセージを表示	 --%>
28	 	 <c:if	 test="${isEmptyCommentError}">
29	 	 	 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p>
30	 	 </c:if>
31	 	 <%--	 コメントリスト	 --%>
32	 	 <ul>
33	 	 	 <c:if	 test="${not	 empty	 newComment}">
34	 	 	 	 <li>${newComment.comment}	 --	 ${newComment.name}	 (${newComment.postingDate})</li>
35	 	 	 </c:if>
36	 	 	 <c:forEach	 var="comment"	 items="${comments}">
37	 	 	 	 <li>${comment.comment}	 --	 ${comment.name}	 (${comment.postingDate})</li>
38	 	 	 </c:forEach>
39	 	 </ul>
40	 </body>
                                                                                guestbook.jsp
20	 	 	 	 	 public	 void	 doGet(HttpServletRequest	 request,	 HttpServletResponse	 response)
	 21	 	 	 	 	 	 	 	 	 	 	 	 	 throws	 IOException,	 ServletException	 {

	 	 	 	 	 	 	 	 	 	 	 	 /*	 user,	 loginURL,	 logoutURL	 などを	 request	 属性に設定	 */

	 35	 	 	 	 	 	 	 	 	 PersistenceManager	 pm	 =	 PMF.get().getPersistenceManager();
	 36	 	 	 	 	 	 	 	 	 try	 {
	 37	 	 	 	 	 	 	 	 	 	 	 	 	 //	 コメントの取得
	 38	 	 	 	 	 	 	 	 	 	 	 	 	 Query	 query	 =	 pm.newQuery(Comment.class);
	 39	 	 	 	 	 	 	 	 	 	 	 	 	 query.setOrdering("postingDate	 desc");
	 40	 	 	 	 	 	 	 	 	 	 	 	 	 query.setFilter("postingDate	 <	 dateParam");
	 41	 	 	 	 	 	 	 	 	 	 	 	 	 query.declareParameters("java.util.Date	 dateParam");
	 42	 
	 43	 	 	 	 	 	 	 	 	 	 	 	 	 try	 {
	 44	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 //	 コメント投稿直後の特別処理
	 45	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 //	 コメントがデータストアに反映されていないこともあるので、
	 46	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 //	 新しいコメントは独立して表示し、それ以前の投稿を取得する。
	 47	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 List<Comment>	 comments;
	 48	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 Comment	 newComment	 =	 (Comment)	 request.getAttribute("newComment");
	 49	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 if	 (newComment	 !=	 null)	 {
	 50	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 comments	 =	 ((List<Comment>)	 query.execute(newComment.getPostingDate()));
	 51	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 }	 else	 {
	 52	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 comments	 =	 (List<Comment>)	 query.execute(new	 Date());
	 53	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 }
	 54	 
	 55	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 request.setAttribute("comments",	 comments);
	 56	 
	 57	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 request.getRequestDispatcher("/guestbook.jsp").forward(request,	 response);
	 58	 	 	 	 	 	 	 	 	 	 	 	 	 }	 finally	 {
	 59	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 query.closeAll();
	 60	 	 	 	 	 	 	 	 	 	 	 	 	 }
	 61	 	 	 	 	 	 	 	 	 }	 finally	 {
	 62	 	 	 	 	 	 	 	 	 	 	 	 	 pm.close();
	 63	 	 	 	 	 	 	 	 	 }
	 64	 	 	 	 	 }                                                                                   GuestbookServlet.java
66	 	 	 	 	 public	 void	 doPost(HttpServletRequest	 request,	 HttpServletResponse	 response)
	 67	 	 	 	 	 	 	 	 	 	 	 	 	 throws	 IOException,	 ServletException	 {
	 68	 	 	 	 	 	 	 	 	 //	 エラー:空コメント
	 69	 	 	 	 	 	 	 	 	 String	 comment	 =	 request.getParameter("comment");
	 70	 	 	 	 	 	 	 	 	 if	 (comment.isEmpty())	 {
	 71	 	 	 	 	 	 	 	 	 	 	 	 	 request.setAttribute("isEmptyCommentError",	 true);
	 72	 	 	 	 	 	 	 	 	 	 	 	 	 doGet(request,	 response);
	 73	 	 	 	 	 	 	 	 	 	 	 	 	 return;
	 74	 	 	 	 	 	 	 	 	 }
	 75	 
	 76	 	 	 	 	 	 	 	 	 //	 User	 データの取得
	 77	 	 	 	 	 	 	 	 	 UserService	 userService	 =	 UserServiceFactory.getUserService();
	 78	 	 	 	 	 	 	 	 	 User	 user	 =	 userService.getCurrentUser();
	 79	 
	 80	 	 	 	 	 	 	 	 	 String	 id	 =	 user	 !=	 null	 ?	 user.getUserId()	 :	 "";
	 81	 	 	 	 	 	 	 	 	 String	 name	 =	 user	 !=	 null	 ?	 user.getNickname()	 :	 "";
	 82	 	 	 	 	 	 	 	 	 Date	 postingDate	 =	 new	 Date();
	 83	 
	 84	 	 	 	 	 	 	 	 	 //	 コメントオブジェクトの生成
	 85	 	 	 	 	 	 	 	 	 Comment	 newComment	 =	 new	 Comment(id,	 name,	 comment,	 postingDate);
	 86	 
	 87	 	 	 	 	 	 	 	 	 //	 コメントオブジェクトの永続化
	 88	 	 	 	 	 	 	 	 	 PersistenceManager	 pm	 =	 PMF.get().getPersistenceManager();
	 89	 	 	 	 	 	 	 	 	 try	 {
	 90	 	 	 	 	 	 	 	 	 	 	 	 	 pm.makePersistent(newComment);
	 91	 	 	 	 	 	 	 	 	 }	 finally	 {
	 92	 	 	 	 	 	 	 	 	 	 	 	 	 pm.close();
	 93	 	 	 	 	 	 	 	 	 }
	 94	 
	 95	 	 	 	 	 	 	 	 	 //	 新しいコメントを属性として設定
	 96	 	 	 	 	 	 	 	 	 request.setAttribute("newComment",	 newComment);
	 97	 
	 98	 	 	 	 	 	 	 	 	 doGet(request,	 response);
	 99	 	 	 	 	 }
                                                                                GuestbookServlet.java
Conclusion
Google App Engine for
 Java を使いましょう!


単に制限のある Servlet & JSP コンテナじゃねーかという突っ込みはなしでw
次回機会があれば
 Google Web Toolkit
すごいぜプレゼンやります


   ちゃんと説明できるくらいに勉強しておきます。
もしくは Spring Roo
すごいぜプレゼンやります


 こっちもちゃんと説明できるくらいに勉強しておきます。
というか、PaaS 勉強会を
         開催しませんか?


AWS Elastic Beanstalk も熱いですね。Windows Azure や Heroku も興味あります。
  てか、PaaS 勉強会って絶対あると思うんで調べて参加しろって話ですね。
興味のある方は、Twitter
 @takuya0301 まで!
Thank you for listening!

More Related Content

What's hot

node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccMasatoshi Tada
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJBTsunenaga Hanyuda
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 
Jetpack Library 事始め
Jetpack Library 事始めJetpack Library 事始め
Jetpack Library 事始めTomohiro Kaizu
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会Mugen Fujii
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackkimukou_26 Kimukou
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017hirokiky
 
Glassfish勉強会(JavaEE6について)
Glassfish勉強会(JavaEE6について)Glassfish勉強会(JavaEE6について)
Glassfish勉強会(JavaEE6について)Ryo Asai
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittrkenjis
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallMasatoshi Tada
 
Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁
Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁
Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁Yutaro Miyazaki
 
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”Norito Agetsuma
 
DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話Nakazawa Yuichi
 

What's hot (20)

node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
G * magazine 1
G * magazine 1G * magazine 1
G * magazine 1
 
Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
Jetpack Library 事始め
Jetpack Library 事始めJetpack Library 事始め
Jetpack Library 事始め
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hack
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
 
Web Component概要
Web Component概要Web Component概要
Web Component概要
 
Glassfish勉強会(JavaEE6について)
Glassfish勉強会(JavaEE6について)Glassfish勉強会(JavaEE6について)
Glassfish勉強会(JavaEE6について)
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittr
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
 
Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁
Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁
Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁
 
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
 
DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話
 

Similar to Google App Engine for Java

React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門spring_raining
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Yuji Kubota
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~Fujio Kojima
 
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会Jumpei Ogawa
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとかyouku
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 

Similar to Google App Engine for Java (20)

React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 
Spring と TDD
Spring と TDDSpring と TDD
Spring と TDD
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
 
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
 
Form libraries
Form librariesForm libraries
Form libraries
 
Form libraries
Form librariesForm libraries
Form libraries
 
Node.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャーNode.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャー
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
Visualforce + jQuery
Visualforce + jQueryVisualforce + jQuery
Visualforce + jQuery
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 

More from Takuya Tsuchida

Mikatus エンジニアの成長戦略
Mikatus エンジニアの成長戦略Mikatus エンジニアの成長戦略
Mikatus エンジニアの成長戦略Takuya Tsuchida
 
コンポーネントアプローチによるソフトウェア開発の俊敏性と品質向上の実現~カスタマーショーケース
コンポーネントアプローチによるソフトウェア開発の俊敏性と品質向上の実現~カスタマーショーケースコンポーネントアプローチによるソフトウェア開発の俊敏性と品質向上の実現~カスタマーショーケース
コンポーネントアプローチによるソフトウェア開発の俊敏性と品質向上の実現~カスタマーショーケースTakuya Tsuchida
 
帳票も今や HTML でつくる時代!?日本の税理士を支えるサーバーレス帳票基盤
帳票も今や HTML でつくる時代!?日本の税理士を支えるサーバーレス帳票基盤帳票も今や HTML でつくる時代!?日本の税理士を支えるサーバーレス帳票基盤
帳票も今や HTML でつくる時代!?日本の税理士を支えるサーバーレス帳票基盤Takuya Tsuchida
 
Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Takuya Tsuchida
 
Essential Scala 第4章 トレイトによるデータモデリング
Essential Scala 第4章 トレイトによるデータモデリングEssential Scala 第4章 トレイトによるデータモデリング
Essential Scala 第4章 トレイトによるデータモデリングTakuya Tsuchida
 
Essential Scala 第3章 オブジェクトとクラス
Essential Scala 第3章 オブジェクトとクラス Essential Scala 第3章 オブジェクトとクラス
Essential Scala 第3章 オブジェクトとクラス Takuya Tsuchida
 
Essential Scala 第2章 式、型、値
Essential Scala 第2章 式、型、値Essential Scala 第2章 式、型、値
Essential Scala 第2章 式、型、値Takuya Tsuchida
 
youtube-dl に Pull Request 送ったった
youtube-dl に Pull Request 送ったったyoutube-dl に Pull Request 送ったった
youtube-dl に Pull Request 送ったったTakuya Tsuchida
 
Waze Map Editor クイックスタートガイド
Waze Map Editor クイックスタートガイドWaze Map Editor クイックスタートガイド
Waze Map Editor クイックスタートガイドTakuya Tsuchida
 

More from Takuya Tsuchida (9)

Mikatus エンジニアの成長戦略
Mikatus エンジニアの成長戦略Mikatus エンジニアの成長戦略
Mikatus エンジニアの成長戦略
 
コンポーネントアプローチによるソフトウェア開発の俊敏性と品質向上の実現~カスタマーショーケース
コンポーネントアプローチによるソフトウェア開発の俊敏性と品質向上の実現~カスタマーショーケースコンポーネントアプローチによるソフトウェア開発の俊敏性と品質向上の実現~カスタマーショーケース
コンポーネントアプローチによるソフトウェア開発の俊敏性と品質向上の実現~カスタマーショーケース
 
帳票も今や HTML でつくる時代!?日本の税理士を支えるサーバーレス帳票基盤
帳票も今や HTML でつくる時代!?日本の税理士を支えるサーバーレス帳票基盤帳票も今や HTML でつくる時代!?日本の税理士を支えるサーバーレス帳票基盤
帳票も今や HTML でつくる時代!?日本の税理士を支えるサーバーレス帳票基盤
 
Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理
 
Essential Scala 第4章 トレイトによるデータモデリング
Essential Scala 第4章 トレイトによるデータモデリングEssential Scala 第4章 トレイトによるデータモデリング
Essential Scala 第4章 トレイトによるデータモデリング
 
Essential Scala 第3章 オブジェクトとクラス
Essential Scala 第3章 オブジェクトとクラス Essential Scala 第3章 オブジェクトとクラス
Essential Scala 第3章 オブジェクトとクラス
 
Essential Scala 第2章 式、型、値
Essential Scala 第2章 式、型、値Essential Scala 第2章 式、型、値
Essential Scala 第2章 式、型、値
 
youtube-dl に Pull Request 送ったった
youtube-dl に Pull Request 送ったったyoutube-dl に Pull Request 送ったった
youtube-dl に Pull Request 送ったった
 
Waze Map Editor クイックスタートガイド
Waze Map Editor クイックスタートガイドWaze Map Editor クイックスタートガイド
Waze Map Editor クイックスタートガイド
 

Recently uploaded

情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイントonozaty
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑Akihiro Kadohata
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員Sadaomi Nishi
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用KLab Inc. / Tech
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。iPride Co., Ltd.
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdkokinagano2
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperleger Tokyo Meetup
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfTakayuki Nakayama
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルCRI Japan, Inc.
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一瑛一 西口
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計atsushi061452
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521Satoshi Makita
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )iwashiira2ctf
 
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルLoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルCRI Japan, Inc.
 

Recently uploaded (14)

情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルLoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
 

Google App Engine for Java

  • 1. Google App Engine for Java 初めてなんだから・・・やさしくしてね?編 2012.3.24 つっちぃ @takuya0301
  • 2. Outline • Google App Engine for Java (GAE/J) といろ いろ組み合わせるとすごそうなので、 そのすごそうさ具合を説明します。 • 最後に、簡単なデモとその作り方を紹 介します。
  • 3. Agenda • GAE/J のいいところを紹介 • Eclipse で開発環境を構築 • GAE/J プロジェクトの実行 • デモ:ゲストブック
  • 6. Google App Engine • 無料*の PaaS 環境(Python, Java, Go) • NoSQL データストア (BigTable) • いろいろなサービスへの API • そこそこ充実している管理画面 * いろいろな制限はありますが、課金で制限を緩和できます。
  • 7. GAE for Java Duke の存在感www
  • 9. Why GAE for Java? • Java は不滅!(あと10年くらいは……) • Google Web Toolkit (GWT) との親和性 • VMware と Google のクラウド連携強化* - Spring, Google App Engine, SpringSource Tool Suite - Spring Roo, Google Web Toolkit - Spring Insight, Google Speed Tracer * http://www.vmware.com/jp/company/news/releases/vmware-google.html
  • 10. GAE/J Specification • Servlet 2.5 • JSP 2.2 (except Unified EL) • JSTL 1.1 • JDO 2.3 • JPA 1.0
  • 12. Google Web Toolkit • Java で AJAX フロントエンドを記述 • JavaScript にコンパイルして実行 • クロスブラウザ(Internet Explorer 6 対応) • 豊富なウィジェット (3rd party: Ext GWT*) * http://www.sencha.com/products/extgwt
  • 15. Pre-required Software • Java SE Development Kit 6 • Google Chrome (optional) • 英語のドキュメントに負けない気持ち
  • 17. Eclipse • いわずと知れた重厚長大な IDE • Google 推奨の GAE/J 開発環境 • なんだかんだ言って便利 • Eclipse IDE for Java EE Developers 推奨
  • 19. Pleiades All in One すみません、NetBeans じゃないです。個人的には NetBeans が好きです。
  • 20. Pleiades All in One • 日本語化版 Eclipse +便利プラグイン • Pleiades = Eclipse プラグイン日本語化プラグイン • Pleiades All in One for Java Developers 推奨
  • 21. Google Plugin for Eclipse
  • 22. Google Plugin for Eclipse • GAE/J & GWT 開発用プラグイン • ローカル実行用サーバー環境 • GAE デプロイツール • GWT コンパイラ
  • 23. Ex. Development Environment • Windows XP Professional SP3 • Java SE Development Kit 6 Update 31 • Google Chrome 17.0 • Pleiades All in One for Java Developers (based on Eclipse Indigo 3.7.2) • Google Plugin for Eclipse* * Eclipse マーケットプレースからインストールする。
  • 24. Installation Note • Pleiades のインストールフォルダ* 推奨:C:¥pleiades 自分:C:¥Document and Settings¥takuya¥My Documents¥pleiades • Google Plugin のインストール 1. Eclipse を起動 2. ヘルプ>Eclipse マーケットプレースをクリック 3. Google Plugin で検索してインストール * Windows では、パスが長いとインストール(ZIP の解凍)に失敗するそうです。
  • 25. Google Plugin for Eclipse
  • 27. Create GAE Project 1. Eclipse を起動 2. ファイル>新規>プロジェクトをクリック 3. Google>Web アプリケーション・プロジェクトをクリック 4. Windows ファイアウォールの警告:ブロック解除 5. 新規 Web アプリケーション・プロジェクトウィザード プロジェクト名:Guestbook パッケージ名:com.example.guestbook Google Web ツールキットを使用:使用しない
  • 28.
  • 30. Run Application 1. 実行>実行をクリック 2. http://localhost:8888/guestbook にアクセス • エラーの場合、下記を設定* 1. プロジェクト>プロパティをクリック 2. 実行/デバッグ設定>Guestbook>編集をクリック 3. 引数>VM 引数>につぎの引数を追加 -Dappengine.user.timezone=UTC * バグみたいです。(2012年3月17日現在)
  • 31.
  • 32.
  • 34. Demo Application “Guestbook”* * Google App Engine のサイトにあるチュートリアルをベースにしてつくってます。
  • 36.
  • 37. 1. Specification • コメントの閲覧・投稿 • Google アカウント対応 • 通りすがりの投稿可能 • エラー処理:空コメント
  • 38. 2. Page Design • 完成イメージを HTML で作成
  • 40. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Guestbook</title> 6 </head> 7 <body> 8 <h1>Guestbook</h1> 9 <p><a href="#">サインイン</a>するとコメントに名前が表示されます。</p> 10 <p>こんにちは、takuya0301 さん。(<a href="#">サインアウト</a>)</p> 11 <ul> 12 <li>つっちぃ (@takuya0301) です。自己紹介して Twitter ID を晒しましょうw 13 -- takuya0301 (2012-03-24 04:24:43)</li> 14 </ul> 15 <form method="POST" action="/guestbook"> 16 <input type="text" size="80"> 17 <input type="submit"> 18 </form> 19 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p> 20 </body> 21 </html> index.html
  • 41. 3. Google Account • Google アカウントでのログイン機能 • ログイン状態による表示切り替え
  • 42.
  • 44.
  • 45. 16 public class GuestbookServlet extends HttpServlet { 17 public void doGet(HttpServletRequest request, HttpServletResponse response) 18 throws IOException, ServletException { 19 // User サービスの取得 20 UserService userService = UserServiceFactory.getUserService(); 21 22 // ログイン中ユーザーの取得(ユーザーがいないときは null) 23 User user = userService.getCurrentUser(); 24 25 // ログイン/ログアウト用 URL の生成(引数は戻り URL) 26 String loginURL = userService.createLoginURL(request.getRequestURI()); 27 String logoutURL = userService.createLogoutURL(request.getRequestURI()); 28 29 request.setAttribute("user", user); 30 request.setAttribute("loginURL", loginURL); 31 request.setAttribute("logoutURL", logoutURL); 32 33 request.getRequestDispatcher("/guestbook.jsp").forward(request, response); 34 } 35 } GuestbookServlet.java
  • 46. 1 <%@ page contentType="text/html;charset=UTF-8" %> 2 <%@ page trimDirectiveWhitespaces="true" %> 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta charset="UTF-8"> 8 <title>Guestbook</title> 9 </head> 10 <body> 11 <h1>Guestbook</h1> 12 <%-- ログインユーザーの有無で分岐 --%> 13 <c:choose> 14 <c:when test="${empty user}"> 15 <p> 16 <a href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。 17 </p> 18 </c:when> 19 <c:otherwise> 20 <p> 21 こんにちは、${user.nickname} さん。(<a href="${logoutURL}">サインアウト</a>) 22 </p> 23 </c:otherwise> 24 </c:choose> 25 </body> 26 </html> guestbook.jsp
  • 47. 4. Comment Posting • HTML フォームからコメントを投稿 • JDO* でコメントを永続化 • エラー処理:空コメント * JDO (Java Data Objects) は、Java オブジェクトの永続性に関する仕様です。
  • 48.
  • 49.
  • 50.
  • 52. 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta charset="UTF-8"> 8 <title>Guestbook</title> 9 </head> 10 <body> 11 <h1>Guestbook</h1> 12 <%-- ログインユーザーの有無で分岐 --%> 13 <c:choose> 14 <c:when test="${empty user}"> 15 <p> 16 <a href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。 17 </p> 18 </c:when> 19 <c:otherwise> 20 <p> 21 こんにちは、${user.nickname} さん。(<a href="${logoutURL}">サインアウト</a>) 22 </p> 23 </c:otherwise> 24 </c:choose> 25 <%-- コメント投稿フォーム --%> 26 <form method="POST" action="/guestbook"> 27 <input type="text" name="comment" size="80"> <input type="submit"> 28 </form> 29 <%-- 空コメントの場合、エラーメッセージを表示 --%> 30 <c:if test="${isEmptyCommentError}"> 31 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p> 32 </c:if> 33 </body> 34 </html> guestbook.jsp
  • 53. 39 public void doPost(HttpServletRequest request, HttpServletResponse response) 40 throws IOException, ServletException { 41 String comment = request.getParameter("comment"); 42 43 // エラー:空コメント 44 if (comment.isEmpty()) { 45 request.setAttribute("isEmptyCommentError", true); 46 doGet(request, response); 47 return; 48 } 49 50 UserService userService = UserServiceFactory.getUserService(); 51 User user = userService.getCurrentUser(); 52 53 String id = user != null ? user.getUserId() : ""; 54 String name = user != null ? user.getNickname() : ""; 55 Date postingDate = new Date(); 56 57 // コメントオブジェクトの生成 58 Comment c = new Comment(id, name, comment, postingDate); 59 60 // コメントオブジェクトの永続化 61 PersistenceManager pm = PMF.get().getPersistenceManager(); 62 try { 63 pm.makePersistent(c); 64 } finally { 65 pm.close(); 66 } 67 68 doGet(request, response); 69 } GuestbookServlet.java
  • 54. 12 @PersistenceCapable 13 public class Comment { 14 @PrimaryKey 15 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 16 private Key key; 17 18 @Persistent 19 private String id; 20 21 @Persistent 22 private String name; 23 24 @Persistent 25 private String comment; 26 27 @Persistent 28 private Date postingDate; 29 30 public Comment(String id, String name, String comment, Date postingDate) { 31 this.id = id; 32 this.name = name; 33 this.comment = comment; 34 this.postingDate = postingDate; 35 } 36 // ゲッターメソッドが続く 56 } Comment.java
  • 55. 1 package com.example.guestbook; 2 3 import javax.jdo.JDOHelper; 4 import javax.jdo.PersistenceManagerFactory; 5 6 public final class PMF { 7 private static final PersistenceManagerFactory pmfInstance = 8 JDOHelper.getPersistenceManagerFactory("transactions-optional"); 9 10 private PMF() {} 11 12 public static PersistenceManagerFactory get() { 13 return pmfInstance; 14 } 15 } インスタンス生成処理負荷軽減のためのシングルトンラッパークラスです。 PMF.java
  • 56. 5. Comment List • コメントをリスト表示
  • 57.
  • 58. 10 <body> 11 <h1>Guestbook</h1> 12 <%-- ログインユーザーの有無で分岐 --%> 13 <c:choose> 14 <c:when test="${empty user}"> 15 <p><a href="${loginURL}">サインイン</a>するとコメントに名前が表示されます。</p> 16 </c:when> 17 <c:otherwise> 18 <p> 19 こんにちは、${user.nickname} さん。(<a href="${logoutURL}">サインアウト</a>) 20 </p> 21 </c:otherwise> 22 </c:choose> 23 <%-- コメント投稿フォーム --%> 24 <form method="POST" action="/guestbook"> 25 <input type="text" name="comment" size="80"> <input type="submit"> 26 </form> 27 <%-- 空コメントの場合、エラーメッセージを表示 --%> 28 <c:if test="${isEmptyCommentError}"> 29 <p>エラー:コメントを入力してから送信ボタンをクリックしてください。</p> 30 </c:if> 31 <%-- コメントリスト --%> 32 <ul> 33 <c:if test="${not empty newComment}"> 34 <li>${newComment.comment} -- ${newComment.name} (${newComment.postingDate})</li> 35 </c:if> 36 <c:forEach var="comment" items="${comments}"> 37 <li>${comment.comment} -- ${comment.name} (${comment.postingDate})</li> 38 </c:forEach> 39 </ul> 40 </body> guestbook.jsp
  • 59. 20 public void doGet(HttpServletRequest request, HttpServletResponse response) 21 throws IOException, ServletException { /* user, loginURL, logoutURL などを request 属性に設定 */ 35 PersistenceManager pm = PMF.get().getPersistenceManager(); 36 try { 37 // コメントの取得 38 Query query = pm.newQuery(Comment.class); 39 query.setOrdering("postingDate desc"); 40 query.setFilter("postingDate < dateParam"); 41 query.declareParameters("java.util.Date dateParam"); 42 43 try { 44 // コメント投稿直後の特別処理 45 // コメントがデータストアに反映されていないこともあるので、 46 // 新しいコメントは独立して表示し、それ以前の投稿を取得する。 47 List<Comment> comments; 48 Comment newComment = (Comment) request.getAttribute("newComment"); 49 if (newComment != null) { 50 comments = ((List<Comment>) query.execute(newComment.getPostingDate())); 51 } else { 52 comments = (List<Comment>) query.execute(new Date()); 53 } 54 55 request.setAttribute("comments", comments); 56 57 request.getRequestDispatcher("/guestbook.jsp").forward(request, response); 58 } finally { 59 query.closeAll(); 60 } 61 } finally { 62 pm.close(); 63 } 64 } GuestbookServlet.java
  • 60. 66 public void doPost(HttpServletRequest request, HttpServletResponse response) 67 throws IOException, ServletException { 68 // エラー:空コメント 69 String comment = request.getParameter("comment"); 70 if (comment.isEmpty()) { 71 request.setAttribute("isEmptyCommentError", true); 72 doGet(request, response); 73 return; 74 } 75 76 // User データの取得 77 UserService userService = UserServiceFactory.getUserService(); 78 User user = userService.getCurrentUser(); 79 80 String id = user != null ? user.getUserId() : ""; 81 String name = user != null ? user.getNickname() : ""; 82 Date postingDate = new Date(); 83 84 // コメントオブジェクトの生成 85 Comment newComment = new Comment(id, name, comment, postingDate); 86 87 // コメントオブジェクトの永続化 88 PersistenceManager pm = PMF.get().getPersistenceManager(); 89 try { 90 pm.makePersistent(newComment); 91 } finally { 92 pm.close(); 93 } 94 95 // 新しいコメントを属性として設定 96 request.setAttribute("newComment", newComment); 97 98 doGet(request, response); 99 } GuestbookServlet.java
  • 62. Google App Engine for Java を使いましょう! 単に制限のある Servlet & JSP コンテナじゃねーかという突っ込みはなしでw
  • 63. 次回機会があれば Google Web Toolkit すごいぜプレゼンやります ちゃんと説明できるくらいに勉強しておきます。
  • 64. もしくは Spring Roo すごいぜプレゼンやります こっちもちゃんと説明できるくらいに勉強しておきます。
  • 65. というか、PaaS 勉強会を 開催しませんか? AWS Elastic Beanstalk も熱いですね。Windows Azure や Heroku も興味あります。 てか、PaaS 勉強会って絶対あると思うんで調べて参加しろって話ですね。
  • 67. Thank you for listening!

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n