2012-06-29

GWT:RPCでエラー、its Class object could not be loaded.

GWTのRPCで下記のエラーに遭遇。
Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'XXXXXXXXX' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = XXXXXXXX@d3f8214
ちゃんとSerializeしてるし、変なクラスも呼んでないのにのになんでだろう?と思ったら

  • 引数がゼロのデフォルトコンストラクタを用意しなければならない
という制約があったようですね。今更気づきました。。。(^^ゞ



2012-06-28

GAE/JからSimpleDBを利用する方法

GAEはDatastoreの有料化に伴いとても使いにくくなりました。かといって、他のクラウドサービスはJavaを動かすだけでちょっとお高く、、、という感じで、帯に短しタスキに長しという感じで、個人的にはGAEのプラットフォームはとても好きだけど使えない。。。と悶々としておりました。
 一方、データベースについてはDynamoDBとかSimpleDBなどAWSが魅力的なサービスを提供してますので、GAEとAWSをうまく組み合わせることができたら最高じゃないか?っていうのは誰もが気づくことです。しかし、GAEの制約により、AWSのSDKは使えないということになっています。困ったもんです。。。
ですが、SimpleDBやDynamoDBなどのサービスはRESTインタフェースを持っているわけで、SDKなんか使わなくても単純なRESTアクセスをすれば、GAEからアクセス可能なはずです。だれかそういうことをやっている猛者はいないのかといろいろ探していたのですが、ようやくいいソリューションを発見しました。

Alanwilliamson's Library
RESTを利用してSimpleDBにアクセスする試みってのは探せばあるもんでして、
に、そのライブラリがありました。これを使います。マニュアル等はありませんが、これをつかうことでAWSのSDKなしで純粋なHTTPクラスのみでアクセスできます。ただし、これのみではGAEでは使えません。試したらみたらわかりますが、FileOutputStreamなどを使っているのでこれらがGAEで使えないというエラーが出ます。困りましたね。

Koherent-App-Engine-Library-for-Java
探せばあるもんで、
このライブラリは、
FileOutputStream、FileInputStreamをDatastoreOutputStream、DatastoreInputStreamに置き換える
ということができます。上記のAlanのコードを書き換えましょう。

Content-typeを修正する
上記2つを組み合わせることで、無事動く、、、と言いたいのですが、putAttributeを実行するとなぜか認証エラーがでます。DomainListsの入手では問題ないのに。。。。これは、SimpleDBのRESTの仕様のバグか何か?で
//urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded" );
urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=utf-8" );
のようにヘッダの記述部分を書き換えることで解決します。

おそらく、AWS+GAEの組み合わせを希望しつつ、断念していた人も多いのではないかと思います。しかし、この方法なら大丈夫なはずです。細かいコマンドの動作はまだ試してませんが、後日、ノウハウをまとめたいと思います。


Eclipseの調子が悪くなったら。。。。

Eclipseの調子が悪くなったら、特にプラグイン関係でうまく動かない場合は、
eclipse.exe -clean
で実行すると治ることがあります。

私の場合、最初にGAEの設定ページを開こうとしたら
選択されたプロパティー・ページを作成できませんでした。
(class: com/google/appengine/eclipse/core/properties/ui/GaeProjectPropertyPage, method: createSdkComponent signature: (Lorg/eclipse/swt/widgets/Composite;)V) Bad type in putfield/putstatic
などというエラーが出てプラグインをバージョンアップしても治らず、しかもEclipse自体が起動しなくなるというトラブルに見舞われましたが、神頼みでこのコマンドを実行して無事正常に戻りました。

2012-06-25

Eclipse:WindowBuilderインストールのススメ

WindowBuilder ってGWTのGUIデザインのためのものかと思ってましたがそうじゃないようですね。WindowBuilderというのはあくまでもエンジンで、実際のデザイン環境は
  • GWT Designer
  • SWT Designer
  • Swing Designer
と用意されているようです。

GWTDesigerだけを使う場合
http://dl.google.com/eclipse/inst/d2gwt/latest/3.7
からプラグインをダウンロード。


全部まとめて使いたい場合
http://dl.google.com/eclipse/inst/d2wbpro/latest/3.7
からプラグインをダウンロード。
となります。両者のURLは似ているようで微妙に違いますので注意してください。



DynamoDB:IAMでのUserPolicyによるアクセス制限 ~その2~

DynamoDBのアクセスをIAMで制御する話の続編です。時々トラブルのでメモ書き程度ですが、、、
{ "Statement": [{ "Sid": "Stmt1330073911360", "Action": [ "dynamodb:ListTables" ], "Effect": "Allow", "Resource": [ "*" ] }, { "Sid": "Stmt1330073911361", "Action": ["dynamodb:DeleteItem","dynamodb:GetItem",
"dynamodb:PutItem","dynamodb:BatchGetItem","dynamodb:BatchWriteItem","dynamodb:Query","dynamodb:DescribeTable","dynamodb:ListTables","dynamodb:Scan","dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": [ "arn:aws:dynamodb:us-east-1:XXXXXXXXXXXXXX:table/ochi_*" ] } ] }
上記のようにすれば、
  • ochi_ではじまるテーブルについてのみ操作が可能
となります。ちなみに、操作の記述ですが、Policy Generatorのウィザードを使うと足りないのがあったりします(気のせいだったようです。今見たら全てありました。)Policy Generator使いましょう。


2012-06-14

GWT: No source code is available for type java.util.Calendar; did you forget to inherit a required module?

GWTにおいて表題のようなメッセージが出る原因ですが、GWTでは
  • java.util.Calendar 
  • java.text.SimpleDateFormat
は使えません。(後者については別記事で書きましたが)Calendarクラスの代わりにDateクラスを使いましょう。


AWS:RDSではなくSimple DBを選んだ理由

先日の記事のように、おちラボでは、
  • DynamoDB
  • SimpleDB
の2つをラボのクラウドデータベースの柱として活用することにしたわけですが、今回、RDSではなくSimple DBを選んだその理由についてちょっと書いてみます。

ネットワークセキュリティ
一番の理由はこれですね。ファイヤーウォールの関係で、RDSのように従来のRDBシステムをバックにしたシステムにアクセスするポートは塞がっています。よって、ラボ内からRDSにアクセスできない。。。この問題は、SQL Azureを利用するときにもぶちあたっていて、RDSも同様のシステムなんだから無理なわけで、、、もちろん、申請すればポートなどは開けてもらえますが、この手のクラウドのサービスでは、EndpointのIPも変わるような気がして(未確認)、とにかくセキュリティポリシー上無理だということに。一方、SimpleDBはDynamoDBと同様にRESTインタフェースをベースにしてますから、ふつうにアクセスできます。

シンプルにDBを扱いたい
教育的な視点を考えると、RDBのような一般的なDBを扱わせたいと思う反面、すばやくシステムを作ることを考えると、SimpleDBのような単機能のほうが良いかなと判断しました。

値段的に安い
私の勘違いでなければ
  • RDS ・・・ DBのインスタンス生存時間
  • SimpleDB  ・・・ 実際のCPU処理時間
で、つまり、RDSは使ってなくてもインスタンスが動いていれば課金。SimpleDBは実際のリクエスト処理時間に応じて課金。ということ。ラボの利用みたいに、少人数でアクセス時間も限られている場合であれば、SimpleDBは格安ですむと思われます。

クラウドデータベース選定の一助になれば幸いです。


AWS:SimpleDBをセットアップする

AWSのSimpleDBを使ってみようかと思って、いきなりセットアップでハマったので、、、

SimpleDBってAWSの中では結構ウリのサービスでありながら、AWS Management Consoleにその名がないなどいまいちスタンスがよくわからないサービスです。そして、DynamoDBの登場によりなおさらその存在が微妙になりつつある感じがしますが、おそらくDynamoと並行して残っていくサービスだと思います(根拠なし)。

おちラボではとりあえず、DynamoDBとSimpleDBを併用して運用しようかと考えており、ではさっそくセットアップして使ってみようと思ったものの情報があまりない?。ネットでググッてみてもSDKのなかのコマンドラインツールを使って、、、というのもめんどくさいこと書いてるし、、、と試行錯誤してシンプルなセットアップを見つけましたので、以下に手順を書いていきます。

1.SimpleDBを有効にする
公式サイトにアクセスして、まずは有効にしましょう。

2.IAMでSimpleDBを使えるようにする
ここが一番ハマりました。User PolisiesでSimpleDBを使えるようにPolicyを追加しようとしましたが、Policy TempleteにSimpleDBの項目がない!?でもここで諦めてはいけません。Policy generatorではちゃんとSimple DBはリストにありますので。ここで SimpleDBを使えるようにしましょう。なお、Resouseのところは
arn:aws:sdb:us-east-1:XXXXXXXXX:domain/*
と書けばいいと思いますが、XXXXXXXのところは適切な値にしてください。

3.Eclipse Pluginからアクセスする
ここもポイントです。コマンドラインツールなんか使わなくても、Eclipseの AWS PluginにありAWS xploreを利用すればGUIで操作できます。Domainの作成はボタンクリックでできます。


というわけで、これからSimpleDBも利用していこうと思ってます。ノウハウが見つかればまた書いていきますね。


2012-06-09

GWT:UiBinderでRadioButtonのイベント処理

初歩的ですがUIBinder系のネタがネットにあまりあがってないようだったので、、、
UiBinderでRadioButtonを使う際、ふと疑問に思うところはどうやってその情報を取ってくるのだろうかということ。radioButtonの場合は、
  • ClickEvent
  • ValueChangeEvent
のいずれかを用いて各ボタンの状態が変わった段階を検知するとよいでしょう。その際、
  • 各ボタンへのイベントの割り当ては、{}を利用することで一括して行う
  • どのボタンが選択されたのかはgetSourceメソッドを利用して入手
という点がノウハウとなります。下記は、ClickEventを利用した際の例です。ここでは、ボタンが押された際にそのボタン(ソース)を記録しておいて、後からテキスト情報等を利用して区別するということになるでしょう。
@UiHandler({"radioButtonA","radioButtonB","radioButtonC"})
 void onClickRadio(ClickEvent e) {
         selectedRadioBtn = (RadioButton)e.getSource();
        //Window.alert("Hello!");
 }


2012-06-05

DynamoDB: DynamoDBMapperでBatch処理をする

DynamoDBでBatch処理ができるようになりました。高レベルAPI、つまりDynamoDBMapperを利用した場合のBatch処理についてメモ書きです。というかこれは非常に簡単で、
  • batchSave ・・・ 保存
  • batchDelete ・・・ 削除
  • batchWrite ・・・ 保存と削除
というメソッドが用意されています。対象とするオブジェクトをリストで渡せばOK。
batchWriteというのがちょっと曲者?というかbatchSaveと何が違うのかというと、batchWriteは引数が2つあり、保存するオブジェクトのリストと削除するオブジェクトのリストを同時に渡せるということのようです。> Batch処理をしたほうが、データベースのパフォーマンスも最大限に挙がりますから、積極的に使いたいですね。



mgwt:mgwtにおける画面遷移

mgwtの面白いところは、画面遷移の手法です。GWTアプリってのはAJaxなアプリなわけですから、一般的なウェブアプリのようなページ遷移はありません。すべて画面の描画書き換えとなります。mgwtでも当然そうなりますが、モバイルアプリらしい仕組みが用意されています。
mgwtでは “AnimationHelper”というクラスが用意されており、このクラスに描画したい画面(パネル)と遷移効果を指定することで、あたかも画面が切り替わったかのような処理をしてくれます。
下記は公式サイトにあるサンプルの例ですけど、最後の処理がポイント。第2引数でいろいろ効果を変えることができます。

2012-06-04

Java:Stringクラスのsplitメソッドの挙動に注意

初歩的なところですが、、、、JavaのStringクラスにはsplitメソッドがあります。これを使うことでcsv形式のファイル解析が便利になります。しかし挙動に注意。
String test = ",a,,,,";
String[] result = test.split(",");
とするとresultには何が入っているでしょう?
result[0]="";
result[1]="a"; 
となります。2つ目以降のカンマを区切ってくれません。予想外の結果です。これはちょっとこまりますよね。カンマ区切り数が決まっているのであれば、下記のようにします。
String test = ",a,,,,";
String[] result = test.split(",",5);


2012-06-02

mgwtはじめました

スマートフォン対応のWebアプリケーション開発のフレームワークとして、mgwtを使いはじめました。耳慣れないですが、名前から察しのとおり、GWTのモバイル版です。
ただでさえ、国内ではGWTはマイナーなのに、そのサードパーティ版ということで、ググってもほとんど情報がないということでゼミ生から既に悲鳴があがってます。

ますますマイナーな路線に走っているおちラボですが、これから、ノウハウをアップしていきますので、乞うご期待!?