Info

Posts from the Google App Engine Category

WicketをAppEngineで動かしてみた。
http://wicketonengine.appspot.com/

必要なjarファイル。

  • wicket-1.4.6.jar
  • slf4j-api-1.6.1.jar
  • slf4j-log4j12-1.6.1.jar
  • log4j-1.2.9.jar

1. プロジェクト作成
Eclipseから「Web Application Project」を作成する。

2. jarの配置、Build Path設定
上の4のjarファイルを /war/WEB-INF/lib/ に入れる。
Java Build Pathの設定で、wicket-1.4.6.jarとslf4j-api-1.6.1.jarを追加

3. web.xml

<display-name>wicket on engine</display-name>	

<filter>
	<filter-name>WicketFilter</filter-name>
	<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
	<init-param>
		<param-name>applicationClassName</param-name>
		<param-value>com.appspot.wicketonengine.WicketApplication</param-value>
	</init-param>
	<init-param>
		<param-name>wicket.configuration</param-name>
		<param-value>deployment</param-value>
	</init-param>
</filter>

<filter-mapping>
	<filter-name>WicketFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

4. appengine-web.xml

<sessions-enabled>true</sessions-enabled>

5. パッケージ、クラス作成
パッケージ:com.appspot.wicketonengine
クラス:WicketApplication.java

public class WicketApplication  extends WebApplication{    

	public WicketApplication(){

	}

	public Class getHomePage(){
		return HomePage.class;
	}

	@Override
	protected ISessionStore newSessionStore() {
		return new HttpSessionStore(this);
	}

	@Override
	protected void init() {
		super.init();
		getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
		getRequestCycleSettings().setResponseRequestEncoding("UTF-8");
		getResourceSettings().setResourcePollFrequency(null);
	}
}

以上で、HomePage.javaなど作成して普通のwicket開発〜

————————————————————————————————————————
メモ:
エラー
Uncaught exception from servlet
java.lang.NoClassDefFoundError: Could not initialize class com.google.apphosting.runtime.security.shared.stub.java.lang.management.ManagementFactory

対象法:wicket-***.jarファイルを削除。

エラー
vm_global_library.vmなんちゃ言われたときは、空のvm_global_library.vmファイルをwarに作成して置く。

使えないメソッド?
Form.setVersioned(true);
setDefaultModelObject();
————————————————————————————————————————

GAE/J デプロイエラー:

Unable to update app: Error posting to URL: https://appengine.google.com/api/appversion/create?app_id=term&version=1&409 ConflictAnother transaction by user dongrikim is already in progress for this app and major version. That user can undo the transaction with appcfg.py’s “rollback” command.
See the deployment console for more detailsUnable to update app: Error posting to URL: https://appengine.google.com/api/appversion/create?app_id=term&version=1&409 ConflictAnother transaction by user dongrikim is already in progress for this app and major version. That user can undo the transaction with appcfg.py’s “rollback” command.

解決法:

$ cd eclipse/plugins/com.google.appengine.eclipse.sdkbundle.***/appengine-java-sdk-***/bin/
$ ./appcfg.sh rollback ~/developer/myapp/war/

appengine-java-php

1. Quercusライブラリダウンロード
http://quercus.caucho.com/ から Quercus 3.1.6をダウンロードする(Quercus 4.0.1は文字化けが発生するので、今回は3.1.6を使うようにする)
jar xf quercus-3.1.6.war
(quercus.jar, resin-util.jar, script-10.jar)

2. Jettyライブラリダウンロード
http://dist.codehaus.org/jetty/jetty-6.1.17/ から jetty-6.1.17.zip をダウンロード
(jetty-6.1.17.jar, jetty-util-6.1.17.jar)

3. ライブラリをlibフォルダに入れる
1と2で取得したjarファイルを war/WEB-INF/lib に入れる

4. 設定ファイル修正
4-1 appengine-web.xml

<static-files>
  <exclude path="/**.php" />
</static-files>
<resource-files>
  <include path="/**.php" />
</resource-files>

 
4-2 web.xml

<servlet>
  <servlet-name>Quercus Servlet</servlet-name>
  <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
  <init-param>
    <param-name>script-encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>ini-file</param-name>
    <param-value>WEB-INF/php.ini</param-value>
    </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>Quercus Servlet</servlet-name>
  <url-pattern>*.php</url-pattern>
</servlet-mapping>

 
4-3 php.ini ファイル作成
war/WEB-INF の下に php.ini ファイルを新規作成

unicode.semantics=on
unicode.http_input_encoding=UTF-8
unicode.output_encoding=UTF-8
unicode.runtime_encoding=UTF-8

 
5. info.php
warの下にinfo.phpを作成

<?php
phpinfo();
?>

 
6. アクセスしてみる。
http://localhost:8080/info.php

001最近iPhoneアプリの開発に夢中になって、なかなか時間が取れなかったのですが、今日やっと時間がすこしあったので、前からやってみたかった app engine for java を試すことにしました。Pythonの時はSDKをダウンロードして、秀丸なり好きなエディターでコードを書いてましたが、今回はEclipseのプラグインという素晴らしい選択肢がありました。もちろんJava版のSDKも用意してますけど。

推奨されてるJavaバージョンは6ですが、5でも大丈夫みたいです。Javaはすでにイスントールしてあるので、Eclipseのプラグインを入れることにしました。使ってたEclipse3.3.1にプラグインを入れようとしましたが、「org.eclipse.wst.xml.core」が必須ですと怒られて、本体のUpdateを行いましたが、今度はEclipseの起動すらできませんでした。ショック!しょうがないんでEclipse3.4でチャレンジすることにしました。

まずは、こちらからEclipse3.4.2をダウンロード(http://www.eclipse.org/downloads/packages/

英語が得意ではないんで日本語化(http://mergedoc.sourceforge.jp/index.html#/pleiades.html

次はGoogle Plugin for Eclipseを入れる。(http://dl.google.com/eclipse/plugin/3.4)

完了すると、メニューに三つのアイコンが出てきます。(可愛い~)左からプロジェクト作成、コンパイル、デプロイです。新規でプロジェクトを作成するとテンプレートでAjaxを使ったサンプルコードが自動生成されます。試しにappspotにデプロイしたのがこちら(http://term.appspot.com/)。これだけだと寂しいんでGuestBookも入れようとしましたが、失敗しました。ローカルでは問題なく動きますが、appspotにデプロイするとServer Errorが発生します。
「java.lang.ClassCastException: com.google.appengine.api.users.UserServiceFailureException cannot be cast to javax.servlet.ServletException」
どうもこれが原因らしい。(http://groups.google.com/group/google-appengine-java/browse_thread/thread/3263e14c37391830

やってみて、Pythonの時と比べると少しは楽かと思いました、少なくとも言語がJavaなんで言語そのものの勉強は要らないですね。さ~何を作ってみようかな?時間があるときですけど。時間は自分が作るものだと言われてますが、なかなか難しいですね・・・

前回はPHPとFlickrAPIを使って自分の写真を表示するようなことをやってみましたが、今回は最近人気上昇中のGoogleAppEngine(GAE)を使ってFlickrタグ検索をやってみたいと思います。GAEの説明はここでは省略します。が参考になるページを紹介します。
Google Code – Google App Engine
さっそくHello Worldから作ってみた
Google App Engine を使ってみよう

Flickr APIページを見るとPythonのライブラリもありましたが、決して使う気になりませんでした。一つ一つ調べながら遊びたいからです。以下がタグ検索して画面に表示するコードになります。キーワードになるものとしては、google.appengine.api.urlfetch と xml.dom.minidom です。

main.py

#!/usr/bin/env python
#
import cgi,os
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.api import urlfetch
from xml.dom import minidom

class MainPage(webapp.RequestHandler):
  def get(self):
    api_url    = "http://api.flickr.com/services/rest/?"
    api_key    = "5f5ffa7c9fcf9f65bc0aae95ad71****"
    api_method = "flickr.photos.search"
    tag = self.request.get("tag")
    if tag == "":
      tag = "Flower"
    url = api_url+"api_key="+api_key+"&method="+api_method+"&tags="+tag
    result = urlfetch.fetch(url)
    dom = minidom.parseString(result.content)
    photos = dom.getElementsByTagName("photo")
    galleries=[]
    for photo in photos:
      farm   = photo.getAttribute("farm")
      server = photo.getAttribute("server")
      id     = photo.getAttribute("id")
      secret = photo.getAttribute("secret")
      img = "http://farm"+farm+".static.flickr.com/"+server+"/"+\
             id+"_"+secret+"_s.jpg"
      galleries.append(img)
    values = { 'galleries': galleries, 'tag':tag, }
    path = os.path.join(os.path.dirname(__file__), "main.html")
    self.response.out.write(template.render(path, values))
application = webapp.WSGIApplication([
  ('/', MainPage)
], debug=True)

def main():
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()


main.html

<form action="" method="get">
Tag:<input type="text" name="tag" value="{{ tag }}">
<input type="submit" value="Search">
</form>
</div>
<div id="galllery">
	{% for galllery in galleries %}
	<img src="{{ galllery }}" class="gallery-img">
	{% endfor %}
</div>


ちょっと工夫をするとこのようなページが作れます。

http://kings.appspot.com/gallery/

一か月ほど前Googleから発表された新しいサービス「App Engine」ですが、今日やっと試すことになりました。他社(Amazon)のサービスと比べ、Google Bigtableにアクセスできて、GoogleFileSystemデータストレージサービスから構成されてるのが魅力だと思います。

1.まずは、Pythonの環境を作成。
http://www.python.org/download/ から Pythos2.5のインストール。
インストール完了後パスの設定を行います。
バージョン確認

C:\>python -V
Python 2.5.2

C:\>

2.SDKインストール。
http://code.google.com/appengine/downloads.html から自分のプラットフォームに合わせてSDKをダウンロードして、インストール。今回はWindowsで試したので、GoogleAppEngine_1.0.2.msi をダウンロードしてインストールしました。

3.デモを実行してみる。
AppEngineのインストールが完了すると C:\Program Files\Google\google_appengine が出来上がるので、コマンドプロンプトからそこに移動します。

C:\>cd C:\Program Files\Google\google_appengine
C:\Program Files\Google\google_appengine>dev_appserver.py demos\guestbook

http://localhost:8080 にアクセスしてみる。ゲストブックが表示されてることを確認

4.Hello Worldを作成してみる。
google_appengineの下に新たに helloworld フォルダを作成、その下に app.yaml と main.py ファイル作成。

app.yaml
application: helloworld
version: 1
runtime: python
api_version: 1

handlers:
– url: .*
script: main.py

main.py
#!/usr/bin/env python
print “Hello World”

作成完了後もう一度http://localhost:8080にアクセスしてみる。「Hello Wolrd」ができた!

ローカルで作成したアプリケーションを公開するためにはアカウントが必要ですが、まだ貰えませんでした。待つ……