2009年6月29日月曜日

「地図から検索」を公開

ずっと以前から作ってみたいなと思っていたアプリケーションを
作ってみた。

初期版なので、まだまだ機能が弱い部分もあるけど、とりあえず、
公開することにしてみる。

どういうアプリケーションかと言うと、自分の身の回りにある
イベント情報やお得な情報を共有できるようなサイト。
しかも、それは、地図上を探索することによって見つけられる
というようなサイトを作ってみたかった。

本来は、もっと地域情報の共有を図れるようにしたかったのですが、
情報の陳腐化が激しい分、最初は、ハードルが高いかなと言うことで、
まずは、お店のチラシの情報を登録できるというようなアプリケーションにしました。

アプリケーションのURLはこちら。
http://loarsh.appspot.com/

使い方は、イメージをつかむために上記のURLをクリックしたら
「表示」ボタンを押してください。
右側に、この地域の周辺のチラシ情報のリンクが出てきます。

登録する場合には、下のほうから、
下記の項目を入力して「登録」ボタンを押してください。
URL:  チラシのURL
タイトル: お店の名前
住所:   お店の住所を入力後確定ボタンを押してください。
      住所がわからない場合には、近所で検索して、マーカーを移動させても
      OKです。

現状は、画面から削除機能が無いので、誤って登録してしまった場合には、
ご連絡いただければ削除します。
#削除機能は、近々につけようと思います。

なおこのアプリケーションは、Googleの技術を利用して作成しております。

ご意見、ご要望はこちらからコメントしていただければと思います。
ご要望いただいたものを優先的に改善していきたいと思います。

2009年6月24日水曜日

Google App EngineのDatastoreでカラム追加してみる

本日は、既存のデータに対して、プロパティの追加を行ったらどうなるんだろうと
試したくなって試してみた。

データベースで言うところのカラム追加です。

既存のentityに対し、下記のような感じでプロパティを追加してみたところ、

@Persistent
private int updateCount;

ロジック自体は修正していないもののエラーが出るようになったしまった。

null値がうんぬんと書かれていたので、intのようなprimitiveな型は追加できないのかと
思い、Integerというオブジェクト型にしてみたところ、うまく動作するようだった。

直感的な動作どおり、追加前に入っていたデータは、nullとして入っているようです。

つまり、entityのプロパティを追加する場合には、Integerなどのクラスにしなくては
いけないということになるのでしょうか。

2009年6月23日火曜日

GoogleMap(GWT)でDrag後のMarkerの位置取得

昨日の続きで本日は、GWTで作ったGoogleMap上でドラッグしたMarkerの位置を取得してみた。

本日、新たに利用したクラスはこちら。
MarkerDragEndHandler


こんな感じで書いてみたら思ったとおりに動作してくれました。
=======================================

Marker marker = new Marker(point,mo);
marker.addMarkerDragEndHandler(new MarkerDragEndHandler(){
public void onDragEnd(MarkerDragEndEvent event){
Marker mk = event.getSender();
displayLatLng(mk.getLatLng());
}
});


=======================================

毎日、少しずつ進めていきます。

2009年6月22日月曜日

GoogleMap(GWT)で動かせるMarkerを配置する

Google Web Toolkit を使ったGoogleMapにてMarkerを配置する歳に
そのマーカーをドラッグできるようにする方法について書いてみます。

だいたい、大まかには、Markerクラスを生成する時に、MarkerOptionsを指定してあげればよさそうです。
ちなみに下記のような感じで書いたら思ったように動作してくれました。
=========================================

MarkerOptions mo = MarkerOptions.newInstance();
mo.setClickable(true);
mo.setDraggable(true);
Marker marker = new Marker(point,mo);
marker.setDraggingEnabled(true);
map.addOverlay(marker);

=========================================

参考にしたJavadocはこちら。
Marker
MarkerOptions

2009年6月21日日曜日

Google App Engine SDKの更新

最近、GoogleAppEngineの開発環境を起動すると、下記のエラーが出てきて
どうやって直すのかと適当にやってみた。


WARN] ********************************************************
There is a new version of the SDK available.
-----------
Latest SDK:
Release: 1.2.1
Timestamp: Sat May 09 09:49:14 JST 2009
API versions: [1.0]

-----------
Your SDK:
Release: 1.2.0
Timestamp: Sat Apr 04 06:53:20 JST 2009
API versions: [1.0]

-----------
Please visit http://code.google.com/appengine for the latest SDK.
********************************************************



最新のSDKはeclipseのsoftware updateから更新していたので、
プロジェクトのGoogleAppEngineの蘭を右クリックして、propertyをクリックして
そこから最新バージョンを選ぶことにより解消された。

2009年6月18日木曜日

正規表現テストツール

GoogleAppEngineの練習もかねてスクラッチでプログラムを作ってみた。

簡単な、正規表現のチェック用プログラムです。
ちなみに言葉があっているかどうかはわかりませんが、2ヶ国語に対応させて見ました。

昨日書いた「?locale=de」が聞かないというのは、開発環境だけで、
実際のサーバでは正しく動作するようでした。

画面を作るのは、やっぱり大変ですね。
画面開発において、Delphiの簡単さを痛切に感じました。

ちなみにサイトのURLはこちら。
http://gaetooltk.appspot.com/

英語版はこちら
http://gaetooltk.appspot.com/?locale=de

#locale=deというのは、サンプルの影響を受けました。

国際化対応もめんどくさいけど、こんなに簡単にできるのはやっぱり便利ですね。

2009年6月16日火曜日

GWTで多言語対応の方法

以前は、ふ~~ん。こんなのあるんだぁと読み飛ばしていた、
多言語対応の方法について試してみる。

参考にしたページは下記のページ。
Internationalizing a GWT Application

意外に難しいかと思ったら簡単だった。
単純化すると、下記の手順でできる。

1.Constantsを拡張したInterface StockWatcherConstants を作成。
  (デフォルト文字列は、@DefaultStringValueアノテーションをつけておく)
2.同じフォルダにStockWatcherConstants _de.properties
というファイルを作っておく
  (deは言語により変わってくる)

ファイルの内容は、1で作成したInterFaceのメソッドに対応して下記のような
テキストファイルになる

============================
stockWatcher = Aktienbeobachter
symbol = Symbol
price = Kurs
change = Änderung
remove = Entfernen
add = Hinzufügen
============================

3.ソース本文は、下記のように宣言する

private StockWatcherConstants constants = GWT.create(StockWatcherConstants.class);

このインスタンスから、リソースストリングを取得する。

4.StockWatcher.gwt.xmlに下記の部分を追記


<extend-property name="locale" values="de"/>


これで、多言語対応が完了なはず。

ただ、実際に動作してみると、
http://localhost:8888/StockWatcher.html?locale=de
という風にアクセスしても正しく動かなかった。

ただ、もう一つの方法であるHTMLファイルに下記の分を記述する方法


<meta name="gwt:property" content="locale=de">


だとうまく動作してくれた。

バグなのかどうか良くわからないけども、とりあえず1つの方法はうまく動作することが
わかったので、よかった。

これで、多言語対応のアプリケーションも作成できることがわかった。

2009年6月11日木曜日

Google App Engineのデータ設計

GoogleAppEngineのデータストアは、普通のRDBに慣れてしまった人だと、
やや強い制約がある。

制約については、下記に書いてあるとおりになるのだけど、
http://code.google.com/intl/ja/appengine/docs/java/datastore/queriesandindexes.html#Restrictions_on_Queries

簡単に書いておくと下記のような感じ
  • 不等号のWhere条件は、1つのカラムしか指定できない
  • OR条件や否定の条件は利用できない
  • 当然、計算式を含む条件も設定できない

これを回避するためには、データの設計についても

従来のRDBとは異なる設計をしなくてはいけない。

おそらく、下記のようなプロパティを持つオブジェクトが合った時に

・賛成意見

・反対意見

反対意見が50%を超えるものを検索するというようなアプリケーションを作る場合には、

従来のRDBであれば、「反対意見>賛成意見」みたいなWhere節を書けばいいのだろうけど

Google App Engineの場合には、更新時に、平均値も計算して保管しておく必要が

あるのだと思う。

そして、「平均値>50%」みたいな検索をすることになると思う。

実際に、データ型を決めてみたら結構気持ち悪いくらい冗長なデータ型になってしまった

一応、下記のような記事もあったので、メモがてらにリンクしておく。

クラウド環境ではデータベースは「非正規化」して使う?

GWTでGoogleユーザ認証を行う

今までやったところで、とりあえず、自分が描くアプリケーションを
作ってみている。

そこで、一つ、やり方がわからない部分が出てきた。

それは、GWTを使ってかつGoogleのアカウント認証を行うのはどうしたらいいのだろうか。

ちょっと調べてみると、下記のページにサンプルが合ったので、早速やってみた。

http://code.google.com/intl/ja/webtoolkit/tutorials/1.6/appengine.html#user
このサンプルでは、StockWatcherをさらに改良して、ユーザごとに管理できるようにする
というサンプル。

基本的には、リンク先のように、

・ログインを管理するサービスの作成。
 LoginService.java:
 LoginServiceAsync.java
 LoginServiceImpl.java

・GWT-RPCを使いこれらの情報をやり取りするためのクラスの作成。
 LoginInfo.java

あとは、
com.google.gwt.user.client.ui.Anchor
というクラスと使ってサービスから帰ってきたログイン用のURLにリンクを張る

という感じでやると、GWTで作った画面もログインが管理できるようになるらしい。

たぶん、これでやりたいことができるようになってきた。

Eclipseプロジェクトで途中からGoogle App Engine にチェックを入れた場合

最初にプロジェクトを作成する時には、Google App Engine にチェックを入れていなくて
途中でプロパティから変更してチェックを入れてみたら、エラーになってしまった。

これは、不具合なのかもしれないが、とりあえず、
他のプロジェジェクトから下記のファイルをコピーしてあげることにより
動くようになった。

appengine-web.xml
logging.properties

途中からの変更はまぁしないだろうけど、もしした場合には、そうすれば
大丈夫みたいです。