2011-07-30

DAOBaseクラスでObjectify-appengineを使いやすくする

Objectify-appengineでは、
ObjectifyService.registerメソッドを記述して、Entityを登録する
という手順が必要となります。これはちょっと面倒なんですが、もっと厄介なのは
同じクラスを登録するとエラーが発生する
という仕様になっている点です。クラスの情報はスタティックな領域に記録されているので、registerメソッドで同じものを登録しないように気を付けなければなりません。その解は、公式サイトのBestPracticeに書いてあります。DAOBaseクラスを使えと、、、
public class DAO extends DAOBase
{
    static {
        ObjectifyService.register(ここに利用するEntityを記述);
     }

  //DAOとしてデータベース周りのラッパーメソッドを以下に書いていけば良い
}
基本的に上述のようなDAOクラスを継承したクラスを作っておけば、あとは下記のように呼び出せばOK。
DAO dao = new DAO();
dao.ofy().find(........);
dao.ofy().put(......);

ただこのようにfindやputを呼び出すよりも、実際は、DAOクラスに関連するラッパーメソッドを実装して呼び出すようにするのがいいですね。

2011-07-26

Eclipse:GWTDesignerのUIBinder対応について


先日の記事でGWT Designerのことを少し書きましたが、いつの間にかUIBinderにも対応してますね。ui.xmlファイルを選択するとDesignパネルがあることに今更気づきました。いつから対応していたのか、、、

まあ、RADな環境としては正直デキは悪いです。ただ、XMLだけだと自分がつくっているUIを想像しなければいけませんので、ちょっとマシかなという印象。そうですね。AndroidアプリでもGUI部分はデザイナーで雛形を作りますが、それと同じ感覚で使えばいいのかもしれません。

2011-07-25

GWTで他のページ(モジュール)に移動する 

GWTというのはJavaScriptが実体ですから、ページの移動というのは原則行わずJavaScriptによる描画切り替えが実質的な画面遷移になります。この場合、全ての画面情報がJavaScriptによって記述されているわけですから、画面が増えてくるとJavaScriptが肥大化してきます。また、分担開発もやりにくくなるでしょう。
そこでGWTモジュールを複数用意して転送するというのがやり方になると思いますが、さてGWTでページの移動(モジュール間の移動)はどうやるのか?それは、
Window.Location.replaceメソッド
を利用すればOKです。もし、セッション(ユーザー)情報を維持したい場合は、memchacheにその情報を保持し、redirect時に参照キーをパラメーターとして渡すようにするとOKでしょう。

2011-07-24

Eclipse: GWT Designerを入れておくと便利

EclipseでGWT開発をする際は、GPEを入れればよいがさらに
  • GWT Designerプラグイン
を入れておくことをおすすめします。GWTDesignerとはGWTのRADツールでUIをペタペタ貼り付けることができます。ただ、UIBinderには対応してないようなので(今のところ)個人的には使ってません。では、なぜこのプラグインをすすめるかというと、GWT-RPCの作成が容易になるからです。先日の記事でEclipseでのGWT-RPCのことを書きましたが、これはGWTDesignerを入れておかないとダメです。
GWTDesignerを利用するには、
http://dl.google.com/eclipse/inst/d2gwt/latest/3.7

をプラグインサイトとして登録すればインストールできます。
GWTDesignerが有効になっていると下記の図のようなメニューが追加されます。GWT remote serviceの他、他のウィザードもデフォルトのより便利かもしれせん。



Eclipse:GWT+WTP併用時のライブラリの重複について

EclipseでGWTと戯れていたら
org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.store.appengine" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/C:/Users/ochi/......../eclipse-workspace/test/war/WEB-INF/lib/datanucleus-appengine-1.0.9.final.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/....."
というエラーがでてきた。このメッセージを見るかぎりは、
  • datanucleus-appengine-1.0.9.final.jar
が重複してライブラリ登録されてるぞということ。身に覚えがない。いや、以前の記事で「EclipseでのGAE/Jアプリ開発はじめの一歩 ~WTPと併用する~」というのを紹介したが、これが悪さをしている感じ。で、プロジェクトが参照しているライブラリを確認すると、
  • AppEngineSDK
  • Web App Libraries
の2つのライブラリが重複している。当然前者は消せないわけで、後者はWTPを追加したことで出てきた雰囲気。。。
よって、後者のライブラリをエイヤッと消しました。(^^; これで今のところ問題ありません。


2011-07-22

GWTで初期パラメーターを受け取る

GWTというのは実体はJavaScriptであり、その実行プロセスは
コンテナとなるHTMLファイルの呼び出し→JavaScriptファイルのロード→表示
という手順を踏む。ここで、呼び出し時の初期パラメーターの設定はできないのだろうか?HTMLファイルを呼び出すわけだから、そんなことは無理なのでは?実際、 EntryPointクラスのonModuleLoadでも初期パラメータを受け取るような引数はないし、、、、と諦めていましたが、どうやら出来るようです。その方法は、
  • Locationクラス
を利用することで解決します。Locationクラスには、幾つかのメソッドが存在しており
  • リクエストパラメータ
  • ホスト名
などコンテナの呼び出し情報を入手することができます。これを利用することで例えば、
http://~.com/xxxx.html?id=3
という呼び出し方をした場合にonLoadModule()内で
String id = Location.getParameter("id");
といった記述によりidを取ってくることができます。

これができて嬉しいのは、モジュール間の連携が容易になるということ。GWTはシステムが複雑になると肥大してきますので、適度にモジュールを区別するのが望ましい。しかし、モジュールを別にするとデータの連携にひと工夫必要になりどうしたものか、、、と悩んでいたわけです。これからこの方法を重宝しそうです。

GAEでTwitter4Jを利用する 

JavaでTwitterクライアントを作るにはTwitter4Jを使えば簡単らしいが、GAE上で実装する場合はちょっとした工夫がいるようだ。

appengine-web.xmlの設定
設定のポイントは2つ。
  • sessionを使えるようにする
  • consumerKeyとconsumerSecretは、System-propertyとして記述
以上を実現するには以下のように記述するとよい。

サーブレットでの記述方法
下記に2つ載せますが、1つ目が最初に呼ばれるサーブレットで、2つ目はコールバックされるサーブレットです。1つ目では、
  • twitterクラスのインスタンス
  • requestToken情報
をセッションで保存しておくというのがポイントです。これは、memcacheに入れてもいいのかな?とにかく、状態を残しておかないといけません。
コールバックされるサーブレットでは、リクエストパラメータから「oauth_verifier」を受け取っておいてください(自動的に付与されます)。それを用いてAccessTokenを入手することになります。
参考URL
本サイトの内容は、下記のサイトを参考にさせていただきました。ありがとうございます。


2011-07-20

EclipseでのGWT-RPCサービスの作り方

GWT-RPCを利用する際には、
  • 「~Service」インタフェース(クライアント側)
  • 「~ServiceAsync」インタフェース(クライアント側)
  • 「~ServiceImpl」クラス(サーバ側)
の3種類が必要ですが、これらを手書きで書くのは面倒です。Eclipseでもそれなりに関連ファイルを自動作成してくれますが、手順が重要です。

各種ファイル生成の手順
  1. プロジェクト名の上で右クリックし、コンテキストメニューを表示します。そこで、【Google Web Tool kit】→【GWT remote service】を選択。
  2. リモートサービス名を入力。「~Service」という名前にするのが流儀っぽい?パッケージ名は、自分がつくっているプロジェクトでのclientパッケージを選択すればよい。
  3. この処理で生成されるのは、クライアント側の「~Service」というインタフェースと、サーバ側の「~ServiceImpl」というクラスだけ。クライアント側で「~Async」インタフェースはできてない。
  4. 「~Service」というインタフェースで「~Async」がないというエラーが出てるので、クリックで生成。必ずインタフェースにしてください。
メソッドの記述
  1. 最初に「~Service」インタフェース(クライアント側)のファイルにメソッドを追記します。
  2. するとエラーがでるので、クリックして「~Async」インタフェースにメソッドを追記するようにします。
  3. 「~ServiceImpl」というクラスのほうでもエラーが出ているので、クリックしてメソッドを実装します。

以上の手順で、記述すべきファイルならびに内容が半自動で用意されます。

2011-07-14

参加報告:計測自動制御学会関西支部講習会 ~すぐに役立つ最新画像処理技術の基礎理論と実践テクニック~

現在、画像処理系の研究プロジェクトを遂行中なため、技術的な調査ならびに再勉強もかねて標題の講習会に参加してきました。その報告です。下記の4件の発表がありました。

ディジタル画像処理のはじめの一歩(寺田先生@徳島大)
寺田先生は前職でもお世話になった先生でありますが、講義を聞くのは初めて。内容は画像処理の基本的なところでしたが、演習を交えたやり方はいろいろ参考になりました。

超解像処理技術(田中先生@東工大)
この話は以前どこか何かで聞いたことがあったのですが、こうした形で聞くのは初めてです。この技術を何か応用できないかなと思ったり、、、、

動画像処理による3次元モデル化とカメラ位置推定(神原先生@奈良先端大)
カメラの位置推定とカメラ映像からの3次元モデルの生成についての話、、、何か両者が密接に関係しているので切り口が難しいところですが、カメラ位置推定というのはちょっと今まで気付かなかった視点で面白かったですね。

拡張現実感とプロジェクタカメラフィードバックによる見かけの制御(天野先生@山形大)
プロジェクター投影の研究ってのは知っていますが、その使い方が興味深かったですね。僕も3年ほど前にプロジェクターの色処理についての基礎的な研究をやっていたのですが、やはりその道のプロがやるといろいろ細かいところをやるんだなぁ、、という印象です。

先生方の話を聞いていてあらためて感じてのは、
  • 画像処理系の研究には経験的な要素が必要
ということ。まあ、これはどの研究もそうかもしれませんが、教育システム系研究者の私が画像処理を応用する場合、この画像処理系の経験的なコツを理解しておかないと、応用するにも無駄や不適切な処理があったりするかもしれません。また、画像処理研究のコツを教育システム研究にうまくフィードバックできないか、、、とも思ったりしました。



2011-07-11

GAEでJCacheを利用する

前記事でmemcacheについて書きましたが、JCacheについても載せておきます。
try {
            CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
            cache = cacheFactory.createCache(Collections.emptyMap());
          // 登録
            cache.put("name", "おちらぼ");

          // 検索
            value = cache.get(name);


        } catch (CacheException e) {
            // ...
        }
どちらを使うべきかですが、Googleの公式サイトではMemcache Java APIにおいてJCacheを優先的に書いています。GAEにおいてはmemcacheは低レベルAPIであるため、JCacheのほうが使いやすいかもしれません(ほとんど記述は変わりませんが)。ただ、

  • JCacheは開発中のライブラリであり、実装されてない機能がある場合がある
  • より多くの機能を利用するなら memcache API
  • JCacheはJava標準であるため記述に汎用性がある。
という認識はもっておいてください。


GAEでMemcacheを利用する

Datastoreに頻繁にアクセスすると、システムの動作が遅くなったりサーバの負荷がかかってくるようなので、そんな時はMemcacheを用いるとよい。Memcacheは、いわゆるハッシュテーブル(マップ)みたいなもの。キーとバリューの組を格納していくだけ。GAEではデータを共有できるようになっているのが特徴だが、いろいろなシステムで使っているとキーの衝突も起こりうる。そこで、NameSpaceで区別できるようになっている。
//TEST1というネームスペースで設定
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService("TEST1");
memcache.put("name", "おち");
String result = memcache.get("name");
基本はこれだけ。GAEを使っているとCPUの負荷等が気になるが、Memcacheを利用するとその減少に効果があるらしい。Datastoreとの使い分けについては

  • 頻繁にアクセスするデータはDatastoreを何回も見に行くのではなく、Memchacheの値を取り出すようにする
  • Memcacheに値がない場合は、DatastoreにアクセスしMamcacheに保存しておく
というのが無難でしょう。Memcacheはあくまでも一時的なデータ保存領域なので。ただ、この使い分けをどうするかは、設計者の腕の見せどころだと思います。

なお、JCacheというJavaの標準の方も利用できるようです。このあたりの使い分けもちょっと調べてみます。


2011-07-08

ゼミ勉強会 ~Kinect SDK,GWT~


先月公開されたマイクロソフトのKinect SDKについての調査発表を4年生にしてもらいました。マイクロソフト公式ということで、OpenNIIなどより使いやすくなっているようです。まあ、ライブラリにこだわりはないので、とにかくシステム開発に利点のあるライブラリを採用することが第一。雰囲気的に、OpenNIIからKinect SDKに乗り換えかなぁ。環境設定などは後日このBLOGでも紹介しようと思いますが、Windows7かつVisual Studio 2010 限定という制約があるらしく、ちょっと面倒。研究室のマシン環境を変えないといけない。。。

もう1名の4年生には、現在卒研で取り組んでいるシステムの開発状況とGWTについての説明をしてもらいました。先日急遽指示したので、スライドが中途半端でしたが、まあいいでしょう。GWTについては早いところ慣れてほしいですね。


2011-07-06

IEEE広島支部学生シンポジウムへのエントリー

IEEE広島支部が主催の学生シンポジウムに発表エントリーすることを急遽決めました。今年より、広島支部エリア外も募集をするということらしく、話が回ってきました。院生に発表させる予定です。
学生が主体となって企画・運営しているイベントのようで、発表はもちろんのこと会自体にもちょっと関心がありますね。アクティブな学生の集まりでいろいろ得るものがあるのではないでしょうか。
とりあえず、概要エントリーの提出が来月で、審査が通ったら原稿執筆&提出です。研究の進捗から考えてちょうどいい時期なので、このシンポジウムをいいペースメーカーにできればと思ってます。

2011-07-02

Twitterizerはじめの一歩

ちょっと触った印象だが、かなり使いやすい気がする。ただ、
  • 一部実装できてないようなクラスがあったりする
  • 日本語のサイトが少ない(日本では無名?海外でも?)
というところが欠点かな。
参照設定
dllを利用する場合は、
  • Twitterizer2.dll
  • Newtonsoft.Json.dll
の2つを参照設定に追加する。あとは、クラスをstaticに呼び出すだけ。
Tokenの入手方法
OAuthUtilityクラスを用いる。
requestToken = OAuthUtility.GetRequestToken(tokens.ConsumerKey, tokens.ConsumerSecret, "oob");//第2引数はよくわからないのでとりあえずoobとした
 Uri authorizationUri = OAuthUtility.BuildAuthorizationUri(requestToken.Token);
 //ブラウザ起動
Process.Start(authorizationUri.ToString());
//入手したPINCODEを利用してTokenを取ってくる
OAuthTokenResponse accessToken = OAuthUtility.GetAccessToken(tokens.ConsumerKey,tokens.ConsumerSecret, requestToken.Token, txtPincode.Text);

ホームタイムラインを取ってくる
TwitterTimelineクラスを用いる。
TwitterResponse<twitterstatuscollection> statuss= TwitterTimeline.HomeTimeline(tokenss);
 foreach (TwitterStatus tweet in statuss.ResponseObject) {
     Debug.Write(tweet.Text);
 }
            
ユーザタイムラインを取ってくる
TwitterUserクラスを用いる。
TwitterResponse<twitteruser> showUserResponse = TwitterUser.Show(tokenss, "oyouji");
           if (showUserResponse.Result == RequestResult.Success) {
               label2.Text = showUserResponse.ResponseObject.Name + " (" + showUserResponse.ResponseObject.ScreenName + ")";
              Debug.Write(showUserResponse.ResponseObject.Status.Text);
           }
上記コード内の細かいところは、適当に無視&マニュアルを参照のこと。

OAuthTokensクラスの扱いがやっかい?
Twitterizerのクラスでは、OAuthに関係するTokenの情報は、OAuthTokensクラスを利用することになっている(上記でいうtokenss変数がそれに相当)。こいつに各種情報を入れておいて渡すだけで、様々なメソッドを実行することが出来る感じ。ただ、これはTwitterizer専用みたいになっていて、一部のフィールドが参照不可になっていたりする。もし、個別にTokenを管理しようと思ってもこのクラスを流用できないので注意。まあ、そんな使い方するのがダメなんでしょうけど。。。。

2011-07-01

[C#]TwitterクライアントライブラリはTwitterizerがイイみたい

C#でTwitterクライアントを実装しているのだが、
Twitterizer
というのがいいらしい。下記のようにクラスが用意されている
  • OAuthUtility ・・・認証系
  • TwitterUser ・・・ ユーザ情報系
  • TwitterStatus ・・・ ステータス処理系
  • TwitterDirectMessage ・・・ダイレクトメッセージ処理系
  • TwitterList  ・・・ リスト機能系
  • TwitterSearch ・・・ 検索処理系
  • TwitterFriendship ・・・各種フォロワーの情報系
  • TwitterFavorite ・・・ Favorite機能系
  • TwitterTimeline  ・・・ タイムライン取得系

ちょっと使い方にクセがあったりもするが、だいたい見切った。今、院生に作らせているアプリはこれに変更する予定。XML周りの処理をしなくても良いというのは便利なところ。。
まあ、研究上では以下のところ特に高機能なものは必要ないのだが、将来的な拡張を考えればこの手のライブラリに手を出しておいて悪くはないだろう。ちょっと心配なのは、こちらがやりたい細かな検索に対応しているのかどうか、、、いろいろ試行錯誤しながら、こまかなプログラムについてはこのBLOGでも取り上げておこうと思う。