2009/08/22 @Tokyo




def speaker = new Cast(name:”T.Yamamoto”,version:”G*S-2009-08-22”)
(                   )


 DTP                                Web
           90%Grails
JGGUG(                 )
 Grails                9-11
Grails Acegi Plugin



 http://d.hatena.ne.jp/mottsnite/
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
$ grails create-app eventer
$ cd eventer




grails.project.plugins.dir="work_tmp/plugins"
grails.project.work.dir="work_tmp/work"


development {
 dataSource {
  dbCreate = "update"
  url = "jdbc:hsqldb:file:work_tmp/devDB;shutdown=true"
$ grails run-app
$ grails create-domain-class org.jggug.Event



$ grails create-controller org.jggug.Event
package org.jggug

class Event {

    /**               */
    String eventName
    /**       */
    Date eventDate
    /**            */
    String eventDesc
    /**     */
    String place
    /**          */
    String groupName
    /**     */               package org.jggug
    String content           class EventController {
                               def scaffold = true
    Date dateCreated         }
    Date lastUpdated

    static constraints = {
    }
}
$ grails run-app
class Event implements Serializable {

   static mapping = {
     id generator:'uuid.hex',
     params:[type:'string']
   }
   String id
 ...




static constraints = {
  eventName nullable:false,blank:false
  eventDate nullable:false,blank:false
  eventDesc nullable:false,blank:false
  place nullable:false,blank:false
  groupName nullable:false,blank:false
  content nullable:false,
          blank:false,maxSize:4000
  dateCreated display:false
  lastUpdated display:false
}
event.label =
       event.eventName.label =




/**                 */
String eventName                 /**(.*)*/n(.*) (.*)

/**       */                     event.$3.label = $1
Date eventDate

/**            */
String eventDesc                      event.eventName.label =
                                      event.eventDate.label =
                                      event.eventDesc.label =
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
$ grails generate-all org.jggug.Event




$ grails run-app
G* on GAE/J 挑戦編
$ grails install-plugin calendar


  <head>
<calendar:resources lang="en" theme="tiger"/>



<calendar:datePicker name="eventDate"
  defaultValue="${eventInstance?.eventDate}"
  dateFormat="%Y/%m/%d" />
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
yui-css               (        )
grails install-plugin http://grails.jp/sample/grails-yui-css-2.7.0-M2.zip
grails yui-css




<head>             content=”main”    “yui-t1”
<meta name="layout" content="main" />

<meta name="layout" content="yui-t1" />
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
export APPENGINE_HOME=/opt/appengine-java-sdk-1.2.2


google.appengine.sdk='/opt/appengine-java-sdk-1.2.2'
$ grails install-plugin app-engine


Do you want to use JPA or JDO for persistence? (jpa, jdo)
jpa



                grails-app/conf/

datastore-indexes.xml
persistence.xml


  grails-app/conf/Config.groovy GAE
google.appengine.application="jggugv4"

 Grails
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
$ grails install-plugin gorm-jpa


resources.groovy       entityManagerFactory         transactionManager
entityManagerFactory(org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean)
{
  beanClassLoader = ref("classLoader")
}

transactionManager(org.springframework.orm.jpa.JpaTransactionManager) {
  entityManagerFactory = entityManagerFactory
}


      datanucleus-enhancer*.jar
cp $APPENGINE_HOME/lib/tools/orm/datanucleus-enhancer-1.1.4.jar lib
G* on GAE/J 挑戦編
import org.datanucleus.jpa.annotations.Extension
import javax.persistence.*;

@Entity
class Event implements Serializable {

  @Id
  @GeneratedValue (strategy = GenerationType.IDENTITY)
  @Extension (vendorName = "datanucleus",
               key = "gae.encoded-pk", value = "true")
  String id

  /**                */
  @Column //
  String eventName
def save = {
  def eventInstance = new Event(params)
  Event.withTransaction{
    if(eventInstance.save(flush:true)) {
      flash.message = "Event ${eventInstance.id} created"
      redirect action:"show", id:eventInstance.id
    }
    else {
      render view:'create', model:[eventInstance:eventInstance]
    }
  }
}
$ grails set-version 1


$ grails app-engine run
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
$ grails app-engine package
$ rm target/war/WEB-INF/lib/jul-to-slf4j-1.5.6.jar
$ appcfg.sh update ./target/war
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
export APPENGINE_HOME=/opt/appengine-java-sdk-1.2.2
export PATH=$PATH:$APPENGINE_HOME/bin


$ dev_appserver.sh -h
$ appcfg.sh -h

※Windows     .sh→.cmd
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
$ dev_appserver.sh ./war

※Windows     .sh→.cmd
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
View
request.setAttribute 'list', [1, 2, 3, 4]
request.setAttribute 'date', new Date()
 
forward 'display.gtpl'
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
G* on GAE/J 挑戦編
import com.google.appengine.api.datastore.Entity

def person = new Entity("person")

person['name'] = "           "
println person['name']

person.age = 31
println person.age

//
person.save()

//
person.delete()

//
def q = new Query('person')
def list = datastoreService.prepare(q).asList(
                Builder.withLimit(20).offset(0) )
G* on GAE/J 挑戦編
<system-properties>
  <property name="file.encoding" value="UTF-8"/>
  <property name="groovy.source.encoding"
            value="UTF-8"/>
</system-properties>
G* on GAE/J 挑戦編
Grails/Groovy
http://www.jggug.org/

More Related Content

PDF
PDF
G*なクラウド ~雲のかなたに~
PDF
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
PDF
第3回Grails/Groovy勉強会名古屋「Grails名古屋座談会」
PDF
第4回 g* ワークショップ はじめてみよう! Grailsプラグイン
PDF
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
PDF
G*なクラウド 雲のかなたに ショートバージョン
PDF
多治見IT勉強会 Groovy Grails
G*なクラウド ~雲のかなたに~
名古屋SGGAE/J勉強会 Grails、Gaelykでハンズオン
第3回Grails/Groovy勉強会名古屋「Grails名古屋座談会」
第4回 g* ワークショップ はじめてみよう! Grailsプラグイン
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
G*なクラウド 雲のかなたに ショートバージョン
多治見IT勉強会 Groovy Grails

What's hot (20)

PDF
Jggug 2010 330 Grails 1.3 観察
PDF
Javascript Continues Integration in Jenkins with AngularJS
PDF
World of Logging
PDF
Quicli - From zero to a full CLI application in a few lines of Rust
PDF
お題でGroovyプログラミング: Part A
PDF
わかった気になるgitit-0.8
PDF
React for Beginners
PPTX
CouchDB Day NYC 2017: MapReduce Views
PDF
GPars For Beginners
PDF
Do something in 5 with gas 3-simple invoicing app
PDF
Do something in 5 minutes with gas 1-use spreadsheet as database
PDF
PHP 机智问答
PDF
エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -
PDF
Do something in 5 with gas 4- Get your analytics profiles to a spreadsheet
PDF
ES6 generators
PDF
Twib in Yokoahma.pm 2010/3/5
PDF
Do something in 5 with gas 7-email log
KEY
gunicorn introduction
PDF
Virthualenvwrapper
PDF
Do something in 5 with gas 2-graduate to a database
Jggug 2010 330 Grails 1.3 観察
Javascript Continues Integration in Jenkins with AngularJS
World of Logging
Quicli - From zero to a full CLI application in a few lines of Rust
お題でGroovyプログラミング: Part A
わかった気になるgitit-0.8
React for Beginners
CouchDB Day NYC 2017: MapReduce Views
GPars For Beginners
Do something in 5 with gas 3-simple invoicing app
Do something in 5 minutes with gas 1-use spreadsheet as database
PHP 机智问答
エロサイト管理者の憂鬱3 - Hokkaiodo.pm#4 -
Do something in 5 with gas 4- Get your analytics profiles to a spreadsheet
ES6 generators
Twib in Yokoahma.pm 2010/3/5
Do something in 5 with gas 7-email log
gunicorn introduction
Virthualenvwrapper
Do something in 5 with gas 2-graduate to a database
Ad

Similar to G* on GAE/J 挑戦編 (20)

PDF
混搭移动开发:PhoneGap+JQurey+Dreamweaver
PDF
After max+phonegap
PPT
DWR, Hibernate and Dojo.E - A Tutorial
PDF
Modular and Event-Driven JavaScript
PDF
jQuery secrets
PDF
Building Grails Plugins - Tips And Tricks
PDF
Secrets of JavaScript Libraries
PDF
Android Best Practices
PDF
How Kris Writes Symfony Apps
KEY
Symfony2 Building on Alpha / Beta technology
PPT
Building Robust jQuery Plugins
PDF
international PHP2011_Bastian Feder_jQuery's Secrets
PDF
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
PDF
The Open Web and what it means
PDF
Ten useful JavaScript tips & best practices
PDF
Writing Maintainable JavaScript
PDF
Clean Javascript
KEY
jQuery: Tips, tricks and hints for better development and Performance
PDF
Writing JavaScript that doesn't suck
PDF
JavaScript APIs - The Web is the Platform - MDN Hack Day, Sao Paulo
混搭移动开发:PhoneGap+JQurey+Dreamweaver
After max+phonegap
DWR, Hibernate and Dojo.E - A Tutorial
Modular and Event-Driven JavaScript
jQuery secrets
Building Grails Plugins - Tips And Tricks
Secrets of JavaScript Libraries
Android Best Practices
How Kris Writes Symfony Apps
Symfony2 Building on Alpha / Beta technology
Building Robust jQuery Plugins
international PHP2011_Bastian Feder_jQuery's Secrets
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
The Open Web and what it means
Ten useful JavaScript tips & best practices
Writing Maintainable JavaScript
Clean Javascript
jQuery: Tips, tricks and hints for better development and Performance
Writing JavaScript that doesn't suck
JavaScript APIs - The Web is the Platform - MDN Hack Day, Sao Paulo
Ad

More from Tsuyoshi Yamamoto (20)

PDF
JJUG CCC 20150411 grails3 Spring-boot
PDF
Groovy Grails eXchage 2014 報告
PDF
JGGUG grails-spring-boot
PDF
Grailsx@London 2011 報告
PDF
Grails 2.0.0.M1の話
PDF
Grails 1.4.0.M1 メモLT
PDF
G * magazine 1
PDF
G * magazine 0
PDF
JGGUG 2011-02 LT
PDF
Grailsx@ロンドンへ行ってきた報告。
PDF
Grailsのススメ(仮)
PDF
G*ワークショップ in 仙台 Grails(とことん)入門
PDF
groovyプラプラとか「はやい、はやいよ」
PDF
第1回名古屋Grails/Groogy勉強会「Grailsを始めてみよう!」
PDF
Groovy ネタ NGK 忘年会2009 ライトニングトーク
PDF
JGGUG Camp 2009 いっぽう熱海では、
PDF
ExtJS勉強会@名古屋
PDF
はじめてのGroovy
PDF
GrailsでSpringをGroovyにしよう!
PDF
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
JJUG CCC 20150411 grails3 Spring-boot
Groovy Grails eXchage 2014 報告
JGGUG grails-spring-boot
Grailsx@London 2011 報告
Grails 2.0.0.M1の話
Grails 1.4.0.M1 メモLT
G * magazine 1
G * magazine 0
JGGUG 2011-02 LT
Grailsx@ロンドンへ行ってきた報告。
Grailsのススメ(仮)
G*ワークショップ in 仙台 Grails(とことん)入門
groovyプラプラとか「はやい、はやいよ」
第1回名古屋Grails/Groogy勉強会「Grailsを始めてみよう!」
Groovy ネタ NGK 忘年会2009 ライトニングトーク
JGGUG Camp 2009 いっぽう熱海では、
ExtJS勉強会@名古屋
はじめてのGroovy
GrailsでSpringをGroovyにしよう!
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo

G* on GAE/J 挑戦編

  • 1. 2009/08/22 @Tokyo def speaker = new Cast(name:”T.Yamamoto”,version:”G*S-2009-08-22”)
  • 2. ( ) DTP Web 90%Grails JGGUG( ) Grails 9-11 Grails Acegi Plugin http://d.hatena.ne.jp/mottsnite/
  • 11. $ grails create-app eventer $ cd eventer grails.project.plugins.dir="work_tmp/plugins" grails.project.work.dir="work_tmp/work" development { dataSource { dbCreate = "update" url = "jdbc:hsqldb:file:work_tmp/devDB;shutdown=true"
  • 13. $ grails create-domain-class org.jggug.Event $ grails create-controller org.jggug.Event
  • 14. package org.jggug class Event { /** */ String eventName /** */ Date eventDate /** */ String eventDesc /** */ String place /** */ String groupName /** */ package org.jggug String content class EventController { def scaffold = true Date dateCreated } Date lastUpdated static constraints = { } }
  • 16. class Event implements Serializable { static mapping = { id generator:'uuid.hex', params:[type:'string'] } String id ... static constraints = { eventName nullable:false,blank:false eventDate nullable:false,blank:false eventDesc nullable:false,blank:false place nullable:false,blank:false groupName nullable:false,blank:false content nullable:false, blank:false,maxSize:4000 dateCreated display:false lastUpdated display:false }
  • 17. event.label = event.eventName.label = /** */ String eventName /**(.*)*/n(.*) (.*) /** */ event.$3.label = $1 Date eventDate /** */ String eventDesc event.eventName.label = event.eventDate.label = event.eventDesc.label =
  • 20. $ grails generate-all org.jggug.Event $ grails run-app
  • 22. $ grails install-plugin calendar <head> <calendar:resources lang="en" theme="tiger"/> <calendar:datePicker name="eventDate" defaultValue="${eventInstance?.eventDate}" dateFormat="%Y/%m/%d" />
  • 25. yui-css ( ) grails install-plugin http://grails.jp/sample/grails-yui-css-2.7.0-M2.zip grails yui-css <head> content=”main” “yui-t1” <meta name="layout" content="main" /> <meta name="layout" content="yui-t1" />
  • 40. $ grails install-plugin app-engine Do you want to use JPA or JDO for persistence? (jpa, jdo) jpa grails-app/conf/ datastore-indexes.xml persistence.xml grails-app/conf/Config.groovy GAE google.appengine.application="jggugv4" Grails
  • 43. $ grails install-plugin gorm-jpa resources.groovy entityManagerFactory transactionManager entityManagerFactory(org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean) { beanClassLoader = ref("classLoader") } transactionManager(org.springframework.orm.jpa.JpaTransactionManager) { entityManagerFactory = entityManagerFactory } datanucleus-enhancer*.jar cp $APPENGINE_HOME/lib/tools/orm/datanucleus-enhancer-1.1.4.jar lib
  • 45. import org.datanucleus.jpa.annotations.Extension import javax.persistence.*; @Entity class Event implements Serializable { @Id @GeneratedValue (strategy = GenerationType.IDENTITY) @Extension (vendorName = "datanucleus", key = "gae.encoded-pk", value = "true") String id /** */ @Column // String eventName
  • 46. def save = { def eventInstance = new Event(params) Event.withTransaction{ if(eventInstance.save(flush:true)) { flash.message = "Event ${eventInstance.id} created" redirect action:"show", id:eventInstance.id } else { render view:'create', model:[eventInstance:eventInstance] } } }
  • 47. $ grails set-version 1 $ grails app-engine run
  • 54. $ grails app-engine package $ rm target/war/WEB-INF/lib/jul-to-slf4j-1.5.6.jar $ appcfg.sh update ./target/war
  • 70. View request.setAttribute 'list', [1, 2, 3, 4] request.setAttribute 'date', new Date()   forward 'display.gtpl'
  • 75. import com.google.appengine.api.datastore.Entity def person = new Entity("person") person['name'] = " " println person['name'] person.age = 31 println person.age // person.save() // person.delete() // def q = new Query('person') def list = datastoreService.prepare(q).asList( Builder.withLimit(20).offset(0) )
  • 77. <system-properties> <property name="file.encoding" value="UTF-8"/> <property name="groovy.source.encoding" value="UTF-8"/> </system-properties>