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日の分については、また後日アップしたいと思います。

2011/12/14

GAEのことでやってみたい事のメモ

GAEを使ってやってみたい事を忘れないようにメモメモ。
  1. 簡単なアプリを作って公開する
  2. RDB→Bigtable(Key-Value)のDB設計方法の変換
  3. Slim3プロジェクトのディレクトリ構成の変更方法をまとめる
  4. ログのフォーマット変換とローカル環境でのログファイル保存方法

1は自分の勉強のため。
まずログイン処理をする。 そのあと、簡単な掲示板を作ってみる。 これで、一連の処理の流れを押さえられる、と思うから。

2は、RDBとは異なり敢えて非正規化をすることが必要とあるけど、 実際にはどのように設計すればいいのか、という具体例を見つけることができなかった。 (私の検索能力の問題だな・・・) だから、RDBでの簡単なテーブル2,3個をBigtable用にデザイン変更にしてみようかと。

3は、Slim3のデフォルトのディレクトリ構成が個人的に好きでないからww

4は、仕事上、ログのフォーマットを記録する必要があったから調べたので。 それを忘れないようにまとめておこうかと思います。

AndroidやGAEの事を考えると、 Googleさんは”JavaVM”という仮想OSを新しいOSとして利用することで、 マルチプラットホームを実現して、より簡単にアプリとかのサービスを 展開していこうとしているんだろうな~
となると、今のOSの未来も変わってくるのかな??

さて、今日はメモだけで寝ようかな~

2011/12/11

【GAE】Eclipseローカルで起動時に出るエラーメッセージ

会社のようなプロキシ経由で外部ネットワークに接続する場合、 Google App Engine(以降、GAE)をローカルで実行する際に 以下のようなエラーメッセージが表示されることがある。 (バージョン情報は伏せ時にしてます。)
Unable to access https://appengine.google.com/api/updatecheck?runtime=java&release=x.x.x×tamp=xxxxx1&api_versions=['x.x']
どうやら実行時にアプリのGAE SDKのバージョンと 公開されている最新のGAE SDKのバージョンの比較をするらしい。 その時、プロキシのせいで問い合わせができずにエラーが出ているみたい。 そこで、下図の画面で実行時のプロキシ設定を追加。

【画面表示】
プロジェクトを右クリック > Run As > Run Configrations > Argmentsタブをクリック

【追加内容】
proxy hostやproxy postは適宜変更で。

-Dhttp.proxyHost=<proxy host>
-Dhttp.proxyPort=<proxy port>

-Dhttps.proxyHost=<proxy host>
-Dhttps.proxyPort=<proxy post>

【実行環境】

Eclipse EE3.7
Java SDK1.0.27

【参考サイト】
Eclipse(Galileo)のGAEでプロキシ

2011/06/23

FlexPMDのEclipseプラグイン

仕事でFlash作成を行った。

開発環境:Flash Builder(Eclipseプラグイン)
開発言語:ActionScript3
コンパイラ:Flex4

結合テストの際に、ActionScriptのステップ数のカウントを行うためのプラグインを
探していたら、FlexPMDを発見した。
そのインストール手順の備忘録。
Eclipseのバージョンとかは以下のサイトを参考に。

参考URL:http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD+Eclipse+plugin

◆インストール
1.Eclipseのメニュー Help > Install new software
2.Addボタンをクリックして、新規リポジトリの登録を行う。
 名前:FlexPMD
 場所:http://opensource.adobe.com/svn/opensource/flexpmd/plugin/trunk/flex-pmd-eclipse-plugin-site
3.FlexPMDをインストール
4.Eclipse再起動


◆設定
設定のためには、いくつかダウンロードが必要。
1.FlexPMDのコマンドライン.jarをダウンロード
 zipファイル
2.ダウンロードしたファイルを適当なディレクトリに展開。
 ただし、ディレクトリ名に半角スペースがあると、うまく動かない様子。
 (http://www.kei3.jp/diary.php?id=7561より)
 ちなみに、私はFlexSDKを以下のディレクトリに入れていたので、同じディレクトリに展開。
 <C:\tools\Flex\flex-pmd-all-in-one-bundle-1.1>
3.EclipseのFlexPMDアドインにコマンドライン.jarを登録する
 Eclipseメニュー > Window > Preferences > FlexPMD と設定画面を表示。
 ・FlexPMD command line installation:(2)のディレクトリ\flex-pmd-command-line.jar
 ・FlexPMD custom ruleset:今はブランクで
 ・FlexCPD command line installation:(2)のディレクトリ\flex-pmd-cpd-command-line.jar
 ※ファイル名にはダウンロードしたバージョンが入っている場合有
4.Apply > OK

以上で設定終了。


◆動作確認
検証したいファイル/ディレクトリを右クリック > FlexPMD > Run FlexPMD

これで検証結果が表示されれば、インストール&設定が完了!!
ただし、ワークスペース名に半角スペースがあると、うまく動かない様子。
 (http://www.kei3.jp/diary.php?id=7561より)


◆監査ルールの取得
1.監査ルールの設定ファイル(xml)のダウンロード
 URL:http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-ruleset-creator.html

2.上記サイトにアクセスし、画面下部の「Export」ボタンをクリック。
もし、ルールを変更したい場合は、画面内を操作してカスタマイズ可能。

3.ダウンロードしたファイルの格納場所は適当な場所へ。
 私の場合、以下のディレクトリに格納。
 ルールファイルはxmlなので、テキストエディタで編集可能。
  ・C:\tools\Flex\FlexPMD_Ruleset

4.ダウンロードしたルールファイルの設定
 Eclipseメニュー > Window > Preferences > FlexPMD と設定画面を表示。
 ・FlexPMD custom ruleset:(3)でダウンロードしたファイル


以上で、一通り動くはず!

2011/05/09

Flash(AS3)で外部XMLファイルを参照する方法



Flash(ActionScript3)でXMLファイルを読み込む手順について
解説されているサイトは沢山あったけど、今回自分がやりたかったのは、
<Flexプロジェクト>でのやり方。

これについては、なかなか紹介されているサイトがなく、
悩んだので、実現できた方法を忘れないようにまとめます。

ちなみに作成環境は以下の通り。
・Windows Vista
・Flash Develop(フリーのFlash開発環境統合ソフト)

【手順】
1)Flash Developにて<Flex3プロジェクト>を新規作成
 パッケージ:test
 テンプレートのコピーをする

2)src/test/Main.mxml の編集
~~~~~ Main.mxml ここから ~~~~~
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[
      import test.asFile.ShowMessage;
    ]]>
  </mx:Script>
  
  <!-- レイアウト -->
  <mx:Text id="messe" text="以下に表示するファイル名を入力"/>
  <mx:TextInput id="textBox" text="test.xml" />
  <mx:Button id="button" label="Click!!"
    click="new ShowMessage(textBox, textArea)" />
  <mx:TextArea id="textArea"
    width="500" height="200"
    text="ここに指定したXMLファイルの内容が表示されます。" />
</mx:Application>
~~~~~ Main.mxml ここまで ~~~~~

3)asファイルの作成
~~~~~ ShowMessage.as ここから ~~~~~
package test.asFile {
  import flash.events.Event;
  import flash.net.URLLoader;
  import flash.net.URLRequest;
  import mx.controls.TextArea;
  import mx.controls.TextInput;

  /** XMLファイルの内容を表示するためのクラス */
  public class ShowMessage {
    /** XMLファイルを設置するディレクトリ */
    private const XML_HOME_DIR:String = "test/xml/";

    /** コンストラクタ */
    public function ShowMessage(
      textInput:TextInput, textArea:TextArea) {
      var fileName:String = textInput.text;
      ReadXMLFile(fileName, textArea);
    }
    
    /** ファイル内容の取得 */
    private function ReadXMLFile(
      fileName:String, textArea:TextArea):void {
      
      var xml:XML = new XML();
      var urlRequest:URLRequest =
        new URLRequest(XML_HOME_DIR + fileName);
      var urlLoader:URLLoader = new URLLoader(urlRequest);
      
      urlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
      
      function xmlLoaded(event:Event):void {
        xml = XML(urlLoader.data);
        trace(xml.toString());
        textArea.text = xml.toString();
      }
    }
  }
}
~~~~~ ShowMessage.as ここまで ~~~~~

4)xmlファイル作成
~~~~~ test.xml ここから ~~~~~
<?xml version="1.0" encoding="utf-8" ?>
<data>
 <member>
  <name>first</name>
 </member>
 <member>
  <name>second</name>
 </member>
</data>
~~~~~ test.xml ここまで ~~~~~

5)最終的なディレクトリ構成

XMLファイルを設置する場所がポイント!
swfファイルが設置されているディレクトリが
ホーム扱いになるので、
そこから相対パスで参照できるようにする
必要がある点に注意。

これに関しては、EclipseにFlash Developerのプラグインを入れてコンパイルすると
自動でディレクトリが作成されるからsrcディレクトリに入れると行ける。

2011/04/19

便利なEclipseのプラグイン~JStyle~

Eclipseを使ってJavaの開発を行ってます。

その時にいつも困っているのが、インデント。
半角4つだったり、タブだったり・・・
その区別もソースを見ただけだと判断できません。。。

そこで、Eclipseの設定を変更していました。
Window→Preferences→General→Editors→Text Editors
ここの「Show whitespace characters」にチェックを入れます。
そうすると、タブと改行の部分が明示的に表示されるようになります。

しかし、個人的にはタブは表示してほしいけど、改行は不要でした。
んで、見つけたのがJStyleというプラグイン!!
こいつがかなりナイスな働きをしてくれます!

JStyleでは以下の項目の表示/非表示が選択できます。
・改行
・タブ
・全角スペース
・半角スペース

私は、これの「タブ」と「全角スペース」にチェックを入れました。
「全角スペース」にもチェックを入れたのは、
以前ソースコード中に全角スペースを入れてしまいコンパイルエラーになったことがあるから・・・

参考サイトは検索してみてください。
ダウンロード、インストールなど色々な情報がありますので。

以上です。

2011/02/04

UbuntuサーバのMySqlにNaviCatでリモートアクセス~その2~

UbuntuのMySqlにVistaのNaviCatからリモート接続にリトライした。

まず、先日行ったことと同じことをやった。

UbuntuサーバのMySqlにNaviCatでリモートアクセス


1.以下のファイルの53行目をコメントアウト。
/etc/mysql/my.cnf
 53行目 →  # bind-address = 127.0.0.1

2.MySqlを再起動
sudo /etc/init.d/mysql restart


次にNaviCatの設定を。
3.新しい接続で、MySqlを選択

4.基本設定は以下の通り
  接続名:自分が分かりやすいもの
  ホスト名/IPアドレス:Ubuntu ServerのIPアドレス(プライベートアドレス)
  ポート:3306(初期設定)
  ユーザー名:root
  パスワード:MySqlインストール時に設定した値

5.SSH設定は以下の通り
  SSHトンネルを使用する:チェックを入れる
  ホスト名/IPアドレス:4で設定したIPアドレス
  ポート:22(初期設定)
  ユーザー名:Ubuntu Serverログインのユーザー名
  認証方法:「パスワード」
  パスワード:Ubuntu Serverログインのパスワード

6.「接続をテストする」を押下

これをやったが接続できなかった・・・

で、MySqlのユーザー設定を確認したら、以下の感じだった。
コマンド:select host, user from mysql.user
+------------+------------------+
| host | user |
+------------+------------------+
| 127.0.0.1 | root |
| localhost | debian-sys-maint |
| localhost | root |
| ubuntu-ser | root |
+------------+------------------+

これを見ると、4で設定したユーザーのrootが
localhostからじゃないと接続できないって感じ。

そこで、MySqlに新しいユーザーを登録。
7.GRANT ALL PRIVILEGES ON *.* TO ユーザー名 IDENTIFIED
  BY 'パスワード' WITH GRANT OPTION;

これで、4の設定したユーザーとパスワードを
7で作成したユーザの設定に変更。
そんで、接続テスト。

やっと接続できた!!!!!!!!
これで、GUIでテーブル内容を確認できそうです♪

2011/01/25

UbuntuサーバのMySqlにNaviCatでリモートアクセス

UbuntuサーバのMySqlにWindowsからNaviCatでアクセスしようとした時の覚書。

SSHトンネルして接続しようとしたけど、以下のようなエラーが。
「2013 - List connection to MySQL server at 'reading initial communication packet', system error: 0」

調べてみたら、MySQLは初期設定でローカルからのアクセスしか許可していない様子。
参照URL:http://mipin.blog6.fc2.com/blog-entry-102.html

参考にしたサイトの通り、以下のファイルの53行目をコメントアウト。
/etc/mysql/my.cnf
 53行目 →  # bind-address = 127.0.0.1

これで、接続確認。

結果。再起動はOKだった。
しかし、NaviCatからもコマンドからもMySQLにログインできなかった。
「1130 - Host '***.***.***.***' is not allowed to connect to this MySQL server」

ん~こりゃ別の方法を探さなきゃかな。。。
参考にしたサイトではVMwareを使ってるから、うまくできなかったのかもな・・・
残念・・・

2010/12/12

【DB】テーブルの移行

現在の仕事でテーブルの移行作業がある。
そのための手順について勉強したから、参考用にまとめておく。

【要求】
・サービスの改定に伴い、テーブル定義の変更が発生
・これまでのテーブルに登録された内容はそのまま移行
・ALTER TABLEの使用禁止
・追加するカラムには、定数が入る

【テスト環境】
・OS:Windows Vista
・RDBMS:SQLite3

【手順】
1.現在のテーブルのバックアップテーブルを作成する
 create table BackUpTable as select * from OriginalTable;

2.現在のテーブルを削除する
 drop table OriginalTable;

3.新しいテーブルを作成する
 create table NewTable(カラム名 属性, 追加カラム名 属性, ...);

4.バックアップテーブルから新しいテーブルにレコードをコピー
 insert into NewTable
  as select カラム名, 追加カラム名の値, ...
  from BackUpTable;


以上で移行ができるはず。
だけど、DBMSによって、SQL文に修正が必要かもしれない。
あと、SQLiteは型の制約がないから簡単にできたけど、他がどうかは分からない。
まず、実環境と同じ環境でテストし、動作確認が必要だな。

参考URL:
・テーブルデータの移行 - Database Expert - @IT
 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=40910&forum=26

2010/12/11

思ふこと

俺にとって
 仕事って?
 同僚って?
 同期って?

評価を
 どうされたい?
 だれにされたい?


今週ずっと残業してた。
毎日勤務開始1時間前に出勤して、23時くらいまで仕事してた。

先輩とチームで仕事をしてるから、俺の作業の遅れで迷惑をかけたくないって
気持ちでいた。

今日は先輩に飲みに誘われた。
同期も参加するって感じになった。
誘ってもらって、俺も行きたいって言った。

けど、行けなかった。
行けないって連絡もしなかった。。。

連絡する機会は何度もあった。
先輩が先に行く時、何度も気にして言ってくれた。
けど、俺は気づかなかった。
どこかで、”伝えてくれる”って甘えてたのかも。

約束の時間10分前に、同期が連絡くれてた。
サイレントにしてて全然気付かなかった。
けど、約束をしていたんだから携帯に注意を向けておくべきだった。

と、今更考えても「自分が悪い」って結論しか出てこない。


「俺=仕事を理由にして約束を破るやつ」


そんな風に評価されたいのか?
そんなん嫌と思ってるくせに、なぜ行動できなかった??

お前はこうやって自分から嫌われにいってる。
嫌われたくない癖に。

どうしないといけないか考えろ。
考えろ、考えろ、考えろ。。。

2010/07/30

LUMIX:メモモードのデータをSDカードへ

デジカメのメモモードで数枚の写真を撮りました。
その写真をPCに取り込もうと思ったら・・・

(* ̄□ ̄*;

見れない(TдT)

取扱説明書を見ても分からない( ;∀;)


ということで、Google大先生に質問してみたら、
価格.comでイイ掲示板を発見!!


<サイト>
http://bbs.kakaku.com/bbs/00501911286/SortID=8394588/


<デジカメ>
Panasonic LUMIX DMC-FX60


<手順>
メモモード(内蔵メモリ)の写真をSDカードにコピー

1.モードをメモモードへ
2.再生モードへ
3.メニューの「画像コピー」を選択
4.コピーする画像を選択し、決定
5.必要枚数だけ4を繰り返し


これで、PCに取り込めるようになりました∠( ゚д゚)/

以上です。ではでは♪

2010/02/17

拡張子 ip のファイル

現在,ObjectDockとRKLauncherの二つのDockを使用している.

今日,Win Customizeというサイトで,
IconPackagerというカテゴリのアイコン集をダウンロードした.

「ip」という拡張子は初めてだった.
軽くグーグル先生に質問してみると,

「zip」の「z」が落ちただけ

という一文を発見.
それなら,ということで,インストールしている解凍ソフトに投入!

あっさり解凍でき,アイコンが使用可能になった♪
これで,また色々なアイコンで遊べそうだ(∩´∀`)∩ワーイ

2010/02/15

Windows Vista のタスクバーを Mac OS X 風に変更する

共同研究をやっている方が,医療機関の方で,
Macユーザーなため,自分で使用している.

Mac環境に少しでも慣れるため,自宅のWindows機のタスクバーを
画面上部に表示している.

XP だとあまり気にならないのだけど,Vistaだとスタートボタンの大きさが気になる...
あと,タスクバーそのものの幅も太い.

そこで,タスクバーをMac Leopard風に.
その際に参考にしたのが,次の2つのページ.

1)StyleSelector 万歳.ようやく|Blog.Ikubon.com
http://blog.ikubon.com/?eid=840219

2)StyleSelectorでWindows Vistaのビジュアルスタイルを変更する|Health is better than wealth
http://miracleblues.blog46.fc2.com/blog-entry-256.html


使用したソフトは,「StyleSelector」というフリーソフト.

ま,うまく行ったと思う.