Hatena::ブログ(Diary)

すにぺっと

2011-05-05

clojureプログラミング入門-35 clojureアプリをgoogle app engineで使う

| 22:59 | clojureプログラミング入門-35 clojureアプリをgoogle app engineで使う - すにぺっと を含むブックマーク

clojureの基礎もひととおりやり、WEBフレームワークもやってみたので、

次はWEBアプリGoogle App Engineデプロイしてみる。

どうもappengine-magicというのを使用すると楽らしい。

https://github.com/gcv/appengine-magic

1.GAE SDKインストール

javaでもpythonでもいいのでインストールしておく。


2.新規プロジェクト作成

$ lein new gaehello

leinで新しいプロジェクトをつくる。

作成したディレクトリに移動。


3.core.cljを削除

$ rm src/gaehello/core.clj

このあとappengine-magicが生成するので、デフォルト

core.cljを削除。


4.project.cljを編集

(defproject gaehello "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.2.1"]]
  :dev-dependencies [ [appengine-magic "0.4.1"]])

appengine-magicの依存関係を追加。


5.必要なライブラリを用意

$lein deps

初回はかなり時間がかかるかも。

15分くらいかかった。


6.gae用ファイルを生成

$lein appengine-new

7. jarを作成してWEB-INF/libにコピー

$lein appengine-prepare

8.ローカルで確認

${GAE-SDK}/bin/dev_appserver.sh war/


9.IDを記述し、アップロード

${GAE-SDK}/bin/appcfg.sh  update war/

アップロードする前に

https://appengine.google.com

でApplicationを登録しておく。

そのIDをwar/WEB-INF/appengine-web.xmlのapplicationタグに記述。

アップロードは1分くらいでおわると思う。

アップロード完了後、

http://{アプリケーションID}.appspot.com/

にアクセスすると、デフォルトhello worldが表示される。


これでclojureのWebアプリを公開可能に。

また、appengine-magicのgithubにはdatastoreの使い方とか

いろいろ書いてあるので参考に。


プログラミングClojure
プログラミングClojure
posted with amazlet at 11.05.05
Stuart Halloway
オーム社
売り上げランキング: 162537

2011-02-17

GAEの管理コンソール

| 23:23 | GAEの管理コンソール - すにぺっと を含むブックマーク

いつも忘れるので。


・本番用管理画面

https://appengine.google.com/

・ローカル用管理画面

http://localhost:8888/_ah/admin

2010-10-28

Google App EngineでHttpUrlConnectionつかったときにIllegalAccessException

| 13:00 | Google App EngineでHttpUrlConnectionつかったときにIllegalAccessException - すにぺっと を含むブックマーク

scala + playframeworkでGAE上にてうごかしてたら上記エラー。

どうも最後にdisconnect()メソッドを呼んでたとこで落ちてるらしい。

消したら動いたけど、これって呼ばなくてもいいんだろうか。

2010-10-10

sienaを使おう

| 11:20 | sienaを使おう - すにぺっと を含むブックマーク

GAEで動作確認ができたので、次はdatastore。

ここまでできればひととおりアプリの機能は実装できるはず。

sienaというplayの拡張モジュールがあるので、それを使用してみる。

ほんとはslim3のdatastoreが使いやすそうなんだけど。

1.sienaをインストール

$ play install siena
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC1, http://www.playframework.org
~ framework ID is server01
~
~ Will install siena-1.3
~ This module is compatible with: 1.0
~ Do you want to install this version (y/n)? y
~ Installing module siena-1.3...
~
~ Fetching http://www.playframework.org/modules/siena-1.3.zip
~ [--------------------------100%-------------------------] 22823.9 KiB/s   
~ Unzipping...
~
~ Module siena-1.3 is installed!
~ You can now use it by add adding this line to application.conf file:
~
~ module.siena=${play.path}/modules/siena-1.3
~

2.アプリ機能

localhost:9000にアクセスして、

firstNameとlastNameのクエリを指定すると、その名前でデータを登録、

localhost:9000/showにアクセスすると登録されたperson一覧を表示する

というサンプルを作成。


3.application.conf編集。

sienaの設定を追加。


conf/application.conf

# Additional modules
# ~~~~~
# A module is another play! application. Add a line for each module you want
# to add to your application. Modules path are either absolutes or relative to
# the application root.
# They get loaded from top to bottom; Syntax: module.{name}={path}
#
# Keep the next line as is to help the play script to manage modules.
# ---- MODULES ----
module.scala=${play.path}/modules/scala-0.7.3
module.gae=${play.path}/modules/gae
module.siena=${play.path}/modules/siena-1.3


4.routesファイル編集。

データ登録のためのURLと表示のためのURLを記述。


conf/routes

# Home page
GET     /                          Application.index
GET     /show                  Application.show

5.モデルクラスを作成

Modelを継承する。

idはLongじゃなきゃいけないらしい。


app/model/Person.scala

package model

import siena._
class Person extends Model {
  @Id
  var id: Long = 0
  var firstName: String = ""
  var lastName: String = ""

  def all(): Query[Person] = {
    Model.all(classOf[Person]);
  }
}

6.Applicationクラスを変更


app/controllers/controller.scala

package controllers

import model.Person
import play._
import play.mvc._
import scala.collection.JavaConversions._

object Application extends Controller {

    def index(firstName: String = "taro",lastName: String = "nanashi") = {
    	val p = new Person
    	p.firstName = firstName
    	p.lastName = lastName
    	//登録
    	p.insert()
    	
       <h1>insert id= {p.id}</h1>
    }

    def show() = {
    	val p = new Person
    	//全部取得
    	val  personList = p.all.fetch()
    	render(personList)
    }
}

7.表示結果HTML作成

showメソッド結果表示されるHTMLを作成。

views/Application/show.html

#{extends 'main.html' /}
#{set title:'Home' /}
<div>
#{list items:personList, as:'person'}
  ${person.id} ${person.lastName} ${person.firstName} 
  <br>
#{/list}
</div>

これで動作確認はできたけど、GAE上では未確認。

2010-10-09

playframeworkとGAEとscalaで

| 11:07 | playframeworkとGAEとscalaで - すにぺっと を含むブックマーク

さて、play+GAE、play+Scalaとできたので、当然play+GAE+Scalaもできる 。

さっきのアプリGAE化してアップロードする。

1.モジュールを追加

# Additional modules
# ~~~~~
# A module is another play! application. Add a line for each module you want
# to add to your application. Modules path are either absolutes or relative to
# the application root.
# They get loaded from top to bottom; Syntax: module.{name}={path}
#
# Keep the next line as is to help the play script to manage modules.
# ---- MODULES ----
module.scala=${play.path}/modules/scala-0.7.3
module.gae=${play.path}/modules/gaeモジュール名

2.サーバーを起動する

appengine-web.xmlを生成させるために一度実行。

syuta-pc:testproject nakamurashuuta$ play run scalaApp
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC1, http://www.playframework.org
~ framework ID is server01
~
~ Ctrl+C to stop
~ 
Listening for transport dt_socket at address: 8000
10:51:17,213 INFO  ~ Starting /projectpath/scalaApp
10:51:17,216 INFO  ~ Module gae is available (/playpath/modules/gae)
10:51:17,216 INFO  ~ Module scala is available (/playpath/modules/scala-0.7.3)
10:51:17,818 WARN  ~ 
10:51:17,818 WARN  ~ Google App Engine module
10:51:17,818 WARN  ~ ~~~~~~~~~~~~~~~~~~~~~~~
10:51:17,818 WARN  ~ No Google App Engine environment found. Setting up a development environement
10:51:17,833 WARN  ~ Don't forget to define your GAE application id in the 'war/WEB-INF/appengine-web.xml' file
10:51:17,833 WARN  ~ 
10:51:17,833 WARN  ~ You're running Play! in DEV mode
10:51:17,922 INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...
10:51:34,781 INFO  ~ Application 'scalaApp' is now started !

起動が成功したのを確認したらCtrl+Cで止めておく。


3.appengine-web.xml編集

以前と同じく、

https://appengine.google.com/

にアクセスし、create an applicationボタンを押下して

アプリケーションを作成しておく。

仮に「sampleScalaApplication」とする。


登録したIDにあわせてwar/WEB-INF/appengine-web.xmlを編集。

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
	<application>sampleScalaApplication</application>
	<version>1</version>
</appengine-web-app>

4.warを作成

$ play war scalaApp -o scalaApp.war
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC1, http://www.playframework.org
~ framework ID is server01
~
11:01:22,382 INFO  ~ Starting /projectpath/scalaApp
11:01:22,385 INFO  ~ Module gae is available (/playpath/modules/gae)
11:01:22,385 INFO  ~ Module scala is available (/playpath/modules/scala-0.7.3)
11:01:22,998 WARN  ~ 
11:01:22,998 WARN  ~ Google App Engine module
11:01:22,998 WARN  ~ ~~~~~~~~~~~~~~~~~~~~~~~
11:01:22,998 WARN  ~ No Google App Engine environment found. Setting up a development environement
11:01:23,007 WARN  ~ 
11:01:23,007 INFO  ~ Precompiling ...
11:01:31,166 INFO  ~ Done.

~ Packaging current version of the framework and the application to /projectpath/scalaApp.war ...
~ Done !
~
~ You can now load /projectpath/scalaApp.war as a standard WAR into your servlet container
~ You can't use play standard commands to run/stop/debug the WAR application...
~ ... just use your servlet container commands instead
~
~ Have fun!
~

5.GAEアップロード

$ /appengine-java-sdk-1.3.7/bin/appcfg.sh update scalaApp.war
Reading application configuration data...
2010/10/09 11:01:59 com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
???: Successfully processed scalaApp.war/WEB-INF/appengine-web.xml
2010/10/09 11:01:59 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
???: Successfully processed scalaApp.war/WEB-INF/web.xml
Beginning server interaction for testscalaapp...
0% Creating staging directory
5% Scanning for jsp files.
20% Scanning files on local disk.
25% Initiating update.
28% Cloning 208 application files.
31% Cloned 100 files.
33% Cloned 200 files.
40% Uploading 84 files.
52% Uploaded 21 files.
61% Uploaded 42 files.
68% Uploaded 63 files.
73% Uploaded 84 files.
77% Initializing precompilation...
90% Deploying new version.
95% Will check again in 1 seconds.
98% Will check again in 2 seconds.
99% Will check again in 4 seconds.
99% Will check again in 8 seconds.
99% Will check again in 16 seconds.
99% Will check again in 32 seconds.
99% Closing update: new version is ready to start serving.
99% Uploading index definitions.

Update completed successfully.
Success.
Cleaning up temporary files...

無事成功したら、

http://自分でつけたID.appspot.com

にアクセス。

GAE上でもちゃんと動作する。