2012/12/03

GAE/Jのアノテーション@Modelでの注意点

実際に経験して、しばらく解決ができなかった事象について共有します。 

業務でGAE/JでSlim3をフレームワークとしてWebアプリを作っています。
以下のようなルールを設定して使用するEntityを作成していました。


  • Javaのクラスは末尾に「Model」をつける
  • Kind名には「Model」を付けない
    →アノテーションでKind名を設定する
     例)@Model(kind="カインド名")


新規でEntityを作ってアノテーションを設定していました。
そしたら、以下のような状況が発生しました。


  • ローカルの開発環境ではデータがうまく取得できる
  • GAE環境にデプロイしたらデータがうまく取得できない
  • GAE管理画面では該当のKINDにデータが投入されていることは確認できた


ん〜ってソースを見なおしていたら・・・

@Model(kind=" カインド名")

こんな感じになっていました。
??
一見間違いはない。問題はない。

よーく見ると・・・

@Model(kind=" カインド名")

そう、カインド名の前に半角スペースが!!
ローカルの開発環境ではうまく動くっていうのが非常に辛い><

皆様ご注意下さい。。。

MacのEclipse Juno(4.2)にstepcounterをインストール

とある事情があってMacにインストールしたEclipse Juno(4.2)にstepcounterをインストールしました。
stepcounterは、以前ProjectAmaterasのページで公開されていました(Version2.0まで)。現在は、Githubで開発・公開が進められているそうな。




無事に使えましたw

2012/10/07

GAE/Jでメール送信機能を実装してみた

GAE/Jでメールを送信する機能が必要となったので、調べて実装してみました。
参考にしたGoogle App Engineの日本語サイトは こちら(※1)
⇒https://developers.google.com/appengine/docs/java/mail/overview?hl=ja

このページによると、Mail Service Java API は、メール メッセージの送信用に JavaMail(javax.mail)インターフェースをサポートしているそうです。基本的なメール送信の実装方法はこちらのサイトをご参考ください。

ちなみにローカルで実行した場合には、メールは送信されません。 その代わりに、コンソールに送信しようとしたメールの内容が出力されます。 ここで困ったことは、メール本文は出力されなかったこと。 現在も表示方法がわからないので、もしご存知の方がいたら教えていただけると幸いです^^

GAE/Jにデプロイしてケータイにメール送信をして動作確認してみました。 そしたら、英語の件名、本文はきちんと送信されました。

が、しかし!!

日本語の件名が文字化けしていました;;
本文の日本語はきちんと表示されていたんですけど、件名だけが・・・
画面から入力した日本語を含む件名をGAE管理画面でログ出力するように実装して確認したら、きちんと表示されていました。。。

色々と調べてみたら、分かりやすいサイト(※2)を発見しました。
件名はきちんと文字コードを設定しないと文字化けしてしまうようです。 しかも、"ISO-2022-JP"にしないといけない、という事でした。
ということで、以下のように変更してみました。

変更前:msg.setSubject("日本語の件名");

変更前:msg.setSubject("日本語の件名", "ISO-2022-JP");

が、コンパイルが通らない。。。
よくよくサイトを見ると、もう一箇所修正が必要でした。

変更前:Message msg = new MimeMessage(session);

変更後:MimeMessage msg = new MimeMessage(session);

これでコンパイルが通り、日本語の件名も使えるようになりました!!
本文についても、文字コードを指定してあげる方が安全かもしれません。私はやっておきました。

以上!!

参考サイト

2012/08/04

GAE/Jアプリのローカル・データストアのアップ・ダウンロード

Google App Engine SDK for Java を利用したアプリを開発している。
ユーザ認証をするときにGoogleアカウントを利用せず、データストアにユーザマスタを作成して行っている。

データのアップロード・ダウンロードにはGoogle App Engine SDK for Pythonで公開されているappcfg.pyとbulkloader.yamlを使った一括ローダーが一般的だろう。
データのアップロードとダウンロード

しかし、「開発用サーバーへのデータのロード」にローカル環境へのコマンドが記載されているが、同じようにやってもうまく行かず、結局イマイチよく分からなかった。これってpythonで作ったアプリに対してだけなのかな、って判断した。なので、マスタ登録用のロジックを組んで・・・って感じで登録を行っていた。

これが相当面倒・・・
できれば、ユーザマスタとか他のマスタデータをエクセルやCSVファイルとかで用意して、ローカル環境で動作確認をしたかった。

色々調べたり、試してみたりしていたところ、
httplib.BadStatusLine
という例外が発生していた。

これを調べてみるとProxy設定の記事にたどり着いた。

おや?

会社からGAE環境にアップするときには、会社のProxy設定をしている。
ということは??ローカルURLでProxy設定を行うのか?????

やってみよう!!

ということで、やってみた。

・・・

・・・・・・

でけたーーーーーーーーー!


という事で、データアップロードの手順とかまとめる。
諸々のインストールとかEclipseからGAE/JでWebApplicationとして実行できるとか、yamlファイルを作成と編集とか、そこらへんは割愛!

  • 設定内容
    • OS:Windows
    • ポート番号:8888
    • リモートAPIのパス:http://localhost:8888/remote_api
    • アップするデータファイル:CSVファイル

  1. Google App Engine for Pythonにパスを通す
    set PATH=%PATH%;appEnginePython¥bin
  2. Proxy設定を行う
    set HTTP_PROXY=http://localhost:8888
    set HTTPS_PROXY=http://localhost:8888
  3. Eclipseで該当のアプリを起動
  4. アップロードコマンドの実行!
    appcfg.py upload_data
    --filename=xxxxx.csv
    --config_file=bulkloader.yaml
    --url=http://localhost:8888/remote_api
    --kind=xxxx
    -v --no_cookies --email=test@example.com --passin
  5. メールアドレスのパスワードの入力が求められるので、入力

上記手順でローカル環境へのアップロードが完了する!(はず・・・)

ちなみに、プロキシはEclipseの起動オプションで設定したものを、メールアドレスとパスワードは何でもOKです。
ポイントはアップロードコマンドにアプリケーションIDを指定するオプションを使用しないこと。

理由は分からないけど、アプリケーションIDを指定してしまうと、データが行方不明になりましたw

ダウンロードも同様の設定でできた〜

2012/05/15

良いソースとは?-Javaの参照型変数と引数- 私の結論

先日5月7日に記事を一つ書かせていただいた。
良いソースとは?-Javaの参照型変数と引数

簡単におさらいを。


最近の悩み。「良い設計・ソースとは」
【要件】
あるクラスの中で、0から9までの整数を格納しているリストが必要である。
今回はこのリスト取得のために、1つメソッドを作成したい。
メソッドは以下の要件を満たすこと。
  • アクセス修飾子:private
  • メソッド名:createList
と、上記のように2人のコーダーに伝えたとする。 すると、下記のようなメソッドが納品された。

【納品物1】
private void createList(List <Integer> list) {
    for(int i = 0; i < 10; i++) {
        list.add(new Integer(i));
    }
}

【納品物2】
private List<Integer> createList() {
    List<Integer> result = new ArrayList<Integer>();
    for(int i = 0; i < 10; i++) {
        result.add(new Integer(i));
    }
    return result;
}


「1と2でどちらが良いか」についてコメントをいただいた。
コメントを頂戴いただいた方々、この場を持って御礼申し上げます。
ありがとうございました。

頂いたコメントをまとめるとこんな感じ。
  • 2が良い。
  • 1はNullチェックや引数のリストに対して追加をする場合には良い。(条件付)

私も2が良いと考える。その理由は以下の通り。
  • 要件から「作成したメソッドを呼び出すことで、必要なリストが作成される」と読み取れ、満足するのは2である。
  • 1を使用する場合、呼び出し元で予期せぬデータ操作が行われてしまう可能性がある。
  • 1を使用する場合、予期しない例外が発生する可能性がある。
つまり、コメント頂いた方々と同じ理由だ。

もし、1のように実装する場合は、呼び出し側で明示的に入れ替える処理を記載するようにListをreturnするのが良いと思う。
そうすれば、呼び出し元で予期しないデータ操作を幾らか回避することができると考える。

コメントでも頂いたのだが、
結局はそのメソッドの責務を明確にすることが重要で、その責務に見合った引数と戻り値を設定することが大切ではないか
ということだと思う。
後輩に説明する際には、コメント頂いた内容を参考にさせていただきます。

2012/05/07

良いソースとは?-Javaの参照型変数と引数

仕事で詳細設計と実装をやっていたり、後輩のソースコードレビューをしたり。 そこで最近の悩み。

「良い設計・ソースとは」

私自身、”何が良い”という好みはある。けど、後輩に指導するときの根拠として弱いと思う。 そこで、皆さんのご意見をお聞かせ頂けたら、と思って今回のブログを書かせていただきたい。 今回は実際に私が困った事と類似の例を紹介させていただく。


【要件】
あるクラスの中で、0から9までの整数を格納しているリストが必要である。
今回はこのリスト取得のために、1つメソッドを作成したい。
メソッドは以下の要件を満たすこと。

  • アクセス修飾子:private
  • メソッド名:createList
と、上記のように2人のコーダーに伝えたとする。 すると、下記のようなメソッドが納品された。

【納品物1】

private void createList(List<Integer> list) {
 for(int i = 0; i < 10; i++) {
  list.add(new Integer(i));
 }
}

【納品物2】

private List<Integer> createList() {
 List<Integer> result = new ArrayList<Integer>();
 for(int i = 0; i < 10; i++) {
  result.add(new Integer(i));
 }
 return result;
}


どちらも要件を満たしているが・・・

  • どちらが”良い”ソースだと思いますか?
  • それはなぜですか?
コメントに皆様のご意見をお書き頂けたら幸いです。

2012/05/06

JavaOne Tokyo 2012に参加して~4月5日~

遅くなってしまいましたが、4月4日と5日に開催された JavaOne の二日目の5日の参加報告です。

【参加したセッション】

  1. 9:00-11:00 [JK2-01] Technology Keynote
  2. 11:15-12:15 [JS2-01] Chuck Munn Lee 「The Java EE 6 Programming Model Explained」
  3. 12:30-13:30 ランチセッション-エンジニアに直接質問してみよう!
  4. 13:15-14:15 休憩
  5. 14:30-15:30 [JS2-24] 輪島 裕之 「ビジネスの継続的改善に貢献するJava EEアーキテクチャとアジャイル開発」
  6. 15:45-16:45 [JS2-33] 山本 裕介 「JSR 353: Java API for JSON Processing」
  7. 17:00-18:00 [JS2-41] Douglas Clarkeis 「Java Persistence API on the Grid」
  8. 18:15-19:15 [BoF2-04] 木村 貴由、寺田 佳央 「The New JSR-107 Caching Standard 」
  9. 19:30-20:30 スペシャルセッション


1. 9:00-11:00 [JK2-01] Technology Keynote

■SE 7での主な変更点

  1. MapやらListの宣言時の型宣言を行うジェネリックス
     -> 左辺だけ記述して、右辺については省略可能
  2. Switch文の条件にStringが使用可能に
  3. try-catchのcatch句で条件をor表記可能に
     -> 例) catch(NullPointerException | NumberFormatException)
  4. FileStreamのclose()が不要になる
     -> try-with-resourceを使って自動close

(1)については非常に嬉しい!
MapのMapを作ったときには1行が200文字程度になったりするから・・・ ま、そんなMapを作るくらいならBeanをうまく作った方が現実的なような気がしますが(汗)

(2)これについても嬉しい!
Stringの比較をする際にはIf文が大変なことになるから。 それがSwitch文で書ければ、分岐が分かりやすくなる。

(3)今まで予期したExceptionのCatch句が複数になる場合、 ログ出力とかはそのクラス内でprivateメソッドを作って共通処理化して、 そのメソッドを呼び出すようにしていた。 結局テストのし易さとかで判断するようになると思うけど、 今はまだ旨みが分からんな。。。

(4)これってDBのトランザクションもだっけ?
それだったらかなり嬉しい!ちょっと調査が必要だな。

2.11:15-12:15 [JS2-01] Chuck Munn Lee 「The Java EE 6 Programming Model Explained」

正直なところ、英語も早かったし、通訳も早かった。。。 途中まで、というか最初しか付いていけなかった。

分かった範囲では、次の感じ。

  • これまでWeb.xmlに書いていたサーブレットの設定がアノテーションでできる
  • 同じくフィルターの設定もアノテーションでできる

これでweb.xmlの記載量が減ることは確か。
でも、一方のサーブレットから他方のサーブレットを呼びたい時はどうすんだ? サーブレットクラス自身には自分のマッピングルールだけ書けば、 他のサーブレットからでも、そのマッピングルールが参照できるってこと? 1ユースケース内であればイイと思うけど、ユースケースの入り口のような 複数箇所から呼ばれそうなサーブレットはweb.xmlに記載して共通化した方が チーム開発では便利なような気がする。。。

フィルタに関してはSaStrutsでも同じようにできるようになるのか? それならweb.xmlが太ることなく設定できるからいいかも。 けど、どのクラスに設定したかは探すのが大変になりそうだ。 でも、パッケージ構成とかクラス名とかを工夫すれば解決できるか。 ん~どうなんだろ??

3.12:30-13:30 ランチセッション-エンジニアに直接質問してみよう!

正直なところ、ご飯を食べてるだけで、ほとんど英語でディスカッションされていたので、 内容が分からなかった。。。 本来はネイティブな方が通訳になってくれて、日本語での質問がOKだったのに、10回中3回くらいしか日本語なかった。

4.13:15-14:15 休憩

ノートPCとケータイの充電が(私の体力も)切れてしまったので、カフェで1時間休憩した。
この間にGmailに来てたメールを処理したり、ブログ書くようにまとめ作業を行ったりした。 カフェは窓際に面していて、東京タワーやスカイツリーが見えた。風景写真を撮影している人も居た。 とても明るく開放的な雰囲気で、電源タップが用意されていたので、PCを触ったり食事をしながら雑談をしたり、って感じ。 あとは、各協賛会社のブースもあって、かなりにぎわっていた。

5.14:30-15:30 [JS2-24] 輪島 裕之 「ビジネスの継続的改善に貢献するJava EEアーキテクチャとアジャイル開発」

アジャイル開発の事例紹介が聞けると思って参加。確かに事例は聞くことができた。
他の会社がどのように開発スケジュールをひいているのか、を聞くことができた。 また、要員確保の方法と契約方法について、どのような契約方法があってどのような特徴があるのかを知ることができた。

6.15:45-16:45 [JS2-33] 山本 裕介 「JSR 353: Java API for JSON Processing」

TwitterだけでなGoogle、Yahoo!でも使用されているJSON(JavaScript Object Notation)。 現在最もポピュラーなWebAPIであるJSONについて標準化を行っていること、その内容についてお話いただいた。 XMLと比較して、JSONは設定が簡単で人間でも読みやすいのが特徴。

■Javaの標準化に関する略称

  • JCP:Java Community Process Java標準化機構
  • JSR:Java Specification Request Java新機能提案
  • TCK:Technology Compability Kit 準拠判断テストツール

JSONについては、JSR353で標準化作業が行われている。 標準として策定されるためにはTCKも作成する必要がある。

このセッションの中で一番驚いたのが、 JSONのモデリングにVisitorパターンが採用されていること。 Visitorパターンをちゃんと把握しているわけではないけど、ちょっと違和感を感じた。 Template Methodの方がしっくりくるような気もするけど。。。

このJSR353が策定・承認されて、Javaの標準APIとして搭載されるようになれば、 独自でAPIを突っ込む必要がなくなるので、楽になるだろうなぁ。

6.17:00-18:00 [JS2-41] Douglas Clarkeis 「Java Persistence API on the Grid」

このセッションではJavaとDatabaseとの関連について話があったみたい。 正直私の頭では、ついていくことがかなり難しかった。。。

ついていけたのは
「Java Persistence API(JPA)は、POJOとDBのEntityをマッピングしてくれる」
ということ。
このマッピングルールはアノテーションまたはXMLで設定する。 実際のマッピング処理は、Entity Manager Factoryが行う。 JPAはキャッシュを行うので、パフォーマンス向上も図れる。 けど、キャッシュ上にあるデータとDB上にあるデータでの不整合発生が問題点だったからコントロールできるようにした。 それがData Gridらしい。

ここら辺から「コヒーエンス」とか知らない単語がバンバン出てきて付いていけなくなってしまった。。。 とりあえず、アノテーションとかXMLを利用することで、DBのエンティティとのマッピングを自動化できることが分かった。 具体的な使い方については、分からないので、調べて試してみる必要があるな。

7.18:15-19:15 [BoF2-04] 木村 貴由、寺田 佳央 「The New JSR-107 Caching Standard」

Java EE 7で本格導入されるJavaのキャッシュについてのお話。 寺田さんと木村さんの絶妙なやり取りが面白く、飽きないプレゼンだった。

JCache(JSR107)がJava Objectのキャッシュ。 使い方はConcurrentMapに類似していて、Java SE/EE 6以降で使用可能。 mavenを使用することでAPIをインポートすることができる。

Google App Engineではmemcahceが該当する。

キャッシュの対象にすべきデータは下記の4種。

  • DBから取得した値(参照回数の多いデータ)
  • ネットワーク越しの処理結果
  • オブジェクト生成に時間のかかる処理結果
  • 大規模Session情報(Sessionに大きな情報を格納すると読み書きバッファが多くかかるから)

GAEではレスポンス時間とデータ量がポイントになってくるから、 Sessionとキャッシュとリクエストとをうまく使い分けていく必要があると感じた。 どのタイミングで確定させるのがいいのかな?やっぱり詳細設計の段階かな~

8.19:30-20:30 スペシャルセッション

スペシャルセッションでは、各勉強会の主催者によるパネルディスカッション。 社内の勉強も大切だがそれだけでは不十分なんだな、って感じました。 私個人では自分で勉強会を立ち上げるのは、ちょっと厳しいので既存の勉強会から参加して勉強をしていこうと思った。

2012/04/09

JavaOne Tokyo 2012に参加して~4月4日~

7年ぶりに日本でJavaOneが開催されました。

私が4月4日に参加したセッションについて、技術的な内容については他の方々のBlogを参考にしてください。 ここでは私の感想を主に書いて、他には備忘録を書きたいと思います。

【 参加したセッション】

  1. 9:00-11:00 [JK1-01] Strategy Keynote
  2. 11:15-12:15 [JS1-04] 櫻庭 祐一 「NIO.2を使って、簡単ファイル操作」
  3. 12:30-13:30 ランチセッション-GlassFish
  4. 13:15-14:15 [JS1-14] 斉藤 賢哉 「Java EE 6時代におけるエンタープライズシステムのあり方」
  5. 14:30-15:30 [JS1-21] John Clingan 「Pragmatic Cloud and PaaS with Java EE 7 (and GlassFish)」
  6. 15:45-16:45 [JS1-33] 寺田 佳央 「What's coming in Java Message Service 2.0」
  7. 17:00-18:00 [BoF1-02] 佐藤 直生 「Windows AzureでのスケーラブルなJavaアプリケーション構築」
  8. 18:15-19:15 [BoF1-04] 谷本 心 江里口 温 「トラブルシューターの頭の中身 ~7年間のJavaトラブルシュートサービスから」
  9. 19:30-20:30 スペシャルセッションLT

1. 9:00-11:00 [JK1-01] Strategy Keynote

 このセッションでは、主に下記の2点についての報告があった(と思う)

  • これまでの標準化の進捗状況や今後のスケジュールについて
  • Java 7に搭載される各Editionの機能紹介
     (Java SE 7/Java EE 7/Java FX 2.0/GlassFish など)
あとはJavaがここまで発展したのは、コミュニティの存在が大きかったらしい。
各講演の中でスピーカーは常々、使ってみて不便なところがあったらメーリングリストにメールを投げて欲しい、コミュニティで発言して欲しい、と仰っていたのが印象的。Javaを一緒に作っていきましょう!という強いメッセージを感じた。

 続いて、Education分野であるOracle資格についての講演があった。
この中で話題になったのは、以下の2点。
・Javaの資格がOracleDBと同様にBronze、Silver、Goldという3形態になること
・現在のJava資格の合格者は日本だと合格点ぎりぎりだが、インドではほぼ満点。
日本人、頑張らないと仕事がなくなりそうって感じた。

資格については興味があったので、資格のレベルをまとめる。
【Gold】単独で開発が可能なレベル
【Silver】上級者のサポートの元で、開発が可能なレベル
【Bronze】Javaに関する基本知識レベル
そいや今はJavaSEに対してはOJC-Pが、JavaEEにはOJC-WCが、対応している認識だけど、これからはどうなるんだろう??


2.11:15-12:15 [JS1-04] 櫻庭 祐一 「NIO.2を使って、簡単ファイル操作」
■NIO2でできるようになったこと
・ファイルのコピーが簡単になった
・ファイルのメタデータの操作が可能になった
・ディレクトリツリーに対する操作も簡単になった
・ファイルを使用する際に冗長だった記述が非常にシンプルになった

これまで私個人の見解としては「Javaはファイル操作が苦手だ、」というイメージを持っていたけど、NIO2の登場によって、そんなイメージも完全になくなりそうな予感。
Java FXと組み合わせることで、Javaでかなり使い勝手の良いファイル操作アプリが作れそうな予感もする!


3.12:30-13:30 ランチセッション - GlassFish
GlassFishとはOracleが提供しているアプリケーションサーバーの開発プロジェクトのこと。
他に有名なJavaのアプリケーションサーバーにはTomcatがある。
GlassFishのライセンスはオープンソースになっているものもある。

GlassFish3はJava EE 6に、GlassFish4はJava EE 7に対応。

セッション開始時には、GlassFishのTシャツを投げる。
また、終了時にはGlassFishのシールを配布する、というイベントがあった。


4.13:15-14:15 [JS1-14] 斉藤 賢哉 「Java EE 6時代におけるエンタープライズシステムのあり方」
■Java EE5からの特徴
・開発容易性を実現
→POJO:シンプルなクラス
→アノテーション:XML地獄からの開放・テスト容易性の確保

■Java EE 6の特徴
・JSF2.0(Java Server Faces)
 Webアプリケーション標準フレームワーク
 【特徴】
 1.HTMLにJSFタグを埋め込むだけ(モックアップが不要)
 2.JSF拡張フレームワーク
 3.JS + JAX-RSパターン(ネットワークの切れ目=担当者の切れ目)
・EJB(Enterprise Java Beans)
 トランザクション管理、インターフェースが省略可
 シングルトンSessionBean

■デザインパターン
・EE 5:プレゼンテーション層+ビジネスロジック層+DAO層
 ※各層を疎結合にすることが目的。
 ※ただし、各層をつなぐための”グレーコード”(DTO)が必要。
  詰め替えを行うための不要な処理が必要となり、コード量が増大
・EE 6:フルスタックなフレームワーク
 ※CDIによって各コンポーネントの結合が楽になる
 ※”グレーコード”(DTO)が不要

■CDIを使用することで、
保守性・生産性がアップするらしい。
アプリ実装範囲の軽減することができるらしい。
モデリングが容易になるらしい(オブジェクト指向、モデリングスキルが必要だけど)
設定ファイルが不要になるらしい


5.14:30-15:30 [JS1-21] John Clingan 「Pragmatic Cloud and PaaS with Java EE 7 (and GlassFish)」

このセッションに関しては途中までしか把握できなかった。
把握できた内容は以下の通り。

Java EE 7は「PaaS」でクラウドに対応するよう作られている。
そのために、WebサーバとしてGlassFishが提供されている。

・SaaS:Software as a Service → PaaSに加えてWebアプリまでを提供。Webメールなど
・PaaS:Platform as a Service → IaaSに加えてWebサーバまでを提供(Webアプリとデータは自分で用意)
・IaaS:Infrastructure as a Service → サーバそのものを提供(Webアプリサーバなどは自分でインストール)

SaaSは業務でも開発しているものなので把握していたが、他の二つについてはきちんと把握できなかったから、復習になった。


6.15:45-16:45 [JS1-33] 寺田 佳央 「What's coming in Java Message Service 2.0」
大きな変更点
・アプリケーションサーバを利用
 →JDBCと同じように、コネクションプーリングの利用が可能
・EJBコンテナを利用して
 →コネクション接続の記述不要(コード削減)
・例外の実装方法が変更
 →7のtry-with-resourceに対応(コネクションのクローズ処理を書かなくてOK)
・ある例外を非チェック例外にした
 →try-catch不要(rollbackの記載が不要)
・Messageスケジューリングもできる(非同期通信として処理可能)

今まで使ったことはないが、かなり使いやすそう、というイメージを持った。
GAEだとTaskQueueがあるけど、そんな感じで使えるんだと思う。
AjaxでTaskQueueを動かしておいて、完了時にMessageを返して、って感じで使うといいのかなぁ~って思った。


7.17:00-18:00 [BoF1-02] 佐藤 直生 「Windows AzureでのスケーラブルなJavaアプリケーション構築」

サーバは世界に6台(日本にはない)。アプリデプロイ時にメインサーバを選択できる。
(ただし、すべてのサーバに自動バックアップされる)

■Azureで使えるもの
・テーブル:Key-Valueストア
・キュー
・BLOB:ファイル形式
・Drive:マウントしてローカルドライブのように使える

・データについては、SQL Azure DB(SQL Server)を利用
→論理サーバを提供
・Trafic Manager
→データセンター毎にクラッシュした場合、他方のセンターへ割り振り
・staticなデータはキャッシュしておく
(キャッシュサーバは日本にもある)

GAEとは異なり、デプロイ時にメインサーバを選べたり、サーバの設定ができるらしい。
GAEと同様にJavaアプリが動くので、状況によって使い分けることが大切になりそう。
あとは互いの特徴を調べて比較しないと何とも言えんな。


8.18:15-19:15 [BoF1-04] 谷本 心 江里口 温 「トラブルシューターの頭の中身 ~7年間のJavaトラブルシュートサービスから」
事例の紹介と、それに対し「どのように原因を究明するのか」の実演が行われた。
キーワードはこちら。
java -XX:+HeapDumpOnOutOfMemoryError
jvisualvm
jstack
Jメーターで負荷テスト

私自身、作成したロジックのパフォーマンスを実際に検証することはなかった。
特にWebアプリを作っていると、ApachやTomcatの設定、SQLパフォーマンスに目が行き、Javaそのもののパフォーマンスを考えることが少ないように思う。
だけど、今回この話を聞いてパフォーマンス検証の重要性を感じた。
ヒープダンプを取ったりスレッドの状態をチェックしたりやってみよう。
Eclipseのプラグインでも見れるのかな?


9.19:30-20:30 スペシャルセッションLT

ここでは何人だったかな?5分で思いのたけを話すLTでした。
LTだけあってかなりユニークなプレゼンもありました。
一番びっくりしたのは「;」なしで色々実装した、というプレゼン。
そんな発想が私にはなかったので。。。ただただ「すげー」だった。。。

スペシャルセッションではご飯も出ました。
おにぎり2個とから揚げとたくあんと出し巻き卵と・・・
そんなくらいだったかな?
おにぎりの1個はJavaマスコットのDukeになってましたww



初日はこんな感じでした。
かなり刺激的な一日で途中からパンクしていました。。。

あとは、業務の中で、JavaでWebアプリ開発をしているけど、Javaについて知っていることは、ほんの一部でしかないことを実感しました。
全部を全部、自分だけで勉強することは難しいから、業務で知りえた範囲から一歩外側も勉強して知識を少しずつでもいいから増やしていきたい、と感じました。

2日目の5日の分については、また後日アップしたいと思います。