SlideShare a Scribd company logo
1 of 29
Download to read offline
Grails超入門チュートリアル
WebApp爆速開発できるまでのポイント
Grailsの入門でつまづきやすいポイント
 Grailsで、アプリを開発しようとすると、チュートリアルが古い。
 サンプルプログラムはGrailsの爆速なところが生かし切れて
いない。例えば、respondなどはかなり便利ですが、他のフ
レームワークにもみられるようなrenderばかりが、使われてい
るものもあります。
 肝心なオフィシャルドキュメントも、読み込まないとGrailsの爆
速なところが生かされない。機能が豊富で、ついつい他のフ
レームワークのような冗長な書き方をしてしまいがち。
 これからGrailsを始める人が、はまらないように、ポイントがま
とまっていない。
 サンプルアプリが散在していて、簡単にHelloWorldまで行け
るが、カスタムしようとすると、???となる。
 GSPはすごいのに、単純なviewとして流されている。
お断り
 このチュートリアルは、Grailsの基本性能を理解するため
に作られています。バリデーションやエラー処理、テスト
を含む、実際の運営では欠かせない部分は、入門の内
容のため、含まれていませんので、ご了承ください。
 スライドの見栄えのバランスを整えるためにスペースの
幅をずらしています。コードを写す場合は、注意をお願い
します。
 用語の使用方法で、専門用語の代わりに平易な言葉が
使われている部分があります。厳密な解釈から部分的
に逸脱がある場合があります。
このスライドの中身は?
 Grailsを使用してToDoアプリ(やることメモリスト)を作成
します。
 Grailsの強みを引き出しながら、開発の肝となるGrailsの
ポイントを押さえます。
 Grails3.3.6を基準にしています。
 DBはMySQLを使用します。
 JAVA8を使用します。
フレームワークのダウンロード
 適当なフォルダに移動します
$cd /grailsをインストールしたいフォルダパス
 Grailsフレームワークをダウンロードします
$sudo wget https://github.com/grails/grails-core/releases/download/v3.3.6/grails-3.3.6.zip
 解凍します
$sudo unzip grails-3.3.6.zip
 demoという名前のWebAppを作成します
$sudo ./grails-3.3.6/bin/grails create-app demo
 これで現在のディレクトリにdemoという名前のフォルダが作成されているはずです。
基本的な開発の手順
 ※以降、コマンドとソースコードの記述では小文字と大文字の違いに注意してください。
 以下のような流れでチュートリアルを進めます。
1. 環境設定を行います。
2. データベースに保存するデータをdomainとして定義します。
3. Webアクセスに対する処理をcontrollerに書いていきます。
4. viewにHTMLを生成する処理を書いていきます。
5. 必要に応じてcontrollerとviewを編集します。
 ※Linux、MySQL、JAVA8JDKのインストールと設定は、済んでいるものとします。
データベースの準備
 MySQLにgrailsという空のデータベースを作成してくださ
い。
 エンコードはutf8-binなどutf8系にしてください。
 以降の設定ではDataBaseの名前をgrailsとして設定を
行っていきます。もちろん何でもいいので、変更した場合
は、以降の説明で出てくる環境設定を書き換えることを
お忘れななく。
 Grailsはテーブルを自動生成してくれます。DBさえ作って
しまえば、あとはMySQLを操作する必要は激減します。
環境設定
 下記のファイルを編集してください。エディタの指定は今回は行いません。
 /demo/build.graidle
51行目付近
変更前:runtime "com.h2database:h2“
変更後:runtime “mysql:mysql-connector-java:8.0.11”
 上記では8.0.11のmysql-connectorを使用していますが、最新バージョンは下記のURLで確認
できます。
https://mvnrepository.com/artifact/mysql/mysql-connector-java
環境設定
 /demo/grails-app/conf/application.yml
91行目付近とそれ以降
削除:driverClassName: org.h2.Driver
 ただ削除してください。grails-3.3.5から自動付与されるため、mysqlの場合、 driverClassName:
com.mysql.cj.jdbc.Driver と書かなく良くなりました。
変更:username: mysqlのユーザネーム
変更:password: ‘mysqlのパスワード’
変更前:
url:jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FAL
SE
変更後:
url: jdbc:mysql://localhost:3306/grails?useSSL=false&requireSSL=false&characterEncoding=utf8
 このurl:は3か所あります。3か所とも変更してください。ここでgrailsと書かれている部分が実
際のDB名になります。独自に名前を変更した場合はここを変えてください。
環境設定(おまけ)
 Grailsでは、Tomcatというアプリケーションサーバがセットになっているフルスタックフレーム
ワークです。これはとても便利で、例えばソースコード一部を変更した場合、自動リロードが
行われ、わざわざ、再コンパイル、ビルド、サーバの再起動を行わずに、即座に変更が反映
されます。JAVA関係のフレームワークとしては画期的です。
 しかし、開発環境によっては、すでにTomcatがインストールされていることもあるでしょう。そ
の場合ポート番号がかぶってしまいますので、ポート番号を変更します。
 /demo/grails-app/conf/application.yml
追記:
---
server:
port: 8081
---
 application.ymlファイルでは、「---」ハイフン3つは区切り記号として、使用できます。
 文字の先頭をずらす場合、ymlファイルではタブは禁止ですので、スペースを入れてください。
いったん実行してみよう
 ここまで設定が終わったら、いったん実行してみましょう。
 demoフォルダ内へ移動します。
$cd /demoフォルダがあるパス/demo
Grailsが作成したアプリケーションフォルダにはgrailsのラッパーであるgrailswが入っています。
ここでは、demoフォルダの中に初めから入っている、grailswを使用します。
 アプリケーションを実行します。
$sudo ./grailsw run-app
初めての実行の場合、依存関係にあるパッケージのダウンロードが行われます。
少し時間がかかりますので待ちましょう。
しばらくすると、最後に8081ポート(先ほど設定おまけで追記していなければ、通常8080)で
アプリが実行されていると表示されると思います。
例: Grails application running at http://localhost:8081
ブラウザから http://localhost:8081 へアクセスしてみましょう。コントローラへのリンクがあります。
コマンドライン補足
 アプリケーションの実行が確認出来たら、アプリケーションサーバを止める場合は、
「Ctrl+C」を押してください。コマンドラインに戻ることができます。
 補足!
 Ubuntuで開発を行っている方は、grailsのコマンドを実行した後に、コマンドラインで
BackSpaceキーを押すと「^H」と表示されてしまうことがあります。その場合は以下のコマンド
を実行すると、元に戻すことができます。
$stty erase ^H ←この^HはそのままBackSpaceキーを押して表示させます。
ドメイン
 それでは、実際に開発をはじめましょう。
 今回作るアプリは「やること(ToDo)メモ」です。データベースにはtodoという名前のテーブル
を作成してmemoという名前のデータを格納するようにしましょう。
 以降の開発用のコマンドは、すべてdemoフォルダ内からgrailswを呼び出しているとします。
$sudo ./grailsw create-domain-class todo
 コードの編集
 /demo/grails-app/domain/demo/Todo.groovy
package demo
class Todo {
String memo //これを追記memoというデータを定義します
static constraints = {
}
}
 idの定義は自動で行われますので必要ありません。
コントローラ
 コントローラはWebアクセスに対して応答し、実際に処理を振り分ける役割をします。
 コントローラの作成
$sudo ./grailsw create-controller todo
 今回のチュートリアルでは、使いませんが、Grailsにはgenerate-allという強力なコマンドもあり
ます。特定のドメインクラスに対して、そのドメインクラスのデータを一覧、作成、表示、編集、
削除(CRUD)できる、コントローラ、ビューのセットを一発で自動生成します。例えば今回の
todoドメインクラスでは次のようになります。
$sudo ./grailsw generate-all todo
 generate-allしてアプリを実行(run-app)すると、簡単にデータベースにアクセスしデータを管
理できるアプリが完成しているのがわかると思います。初めてGrailsのフレームワークの便
利さを体験してみるには、一度、generate-allも試してみてください。
 しかし、フレームワークを使うのが初めてで、自動生成された膨大なコードを元に、編集する
のは、混乱を招くと思います。チュートリアルでは、コントローラを単体で作成して、コードを
書いていきます。それでもGrailsは簡単ですし、練習のための最小のコードを知ることができ
ると思います。
コントローラ
 作成されたコントローラを編集しましょう
 /demo/grails-app/contoller/demo/TodoController.groovy
package demo
import grails.validation.ValidationException //追記
import static org.springframework.http.HttpStatus.* //追記
class TodoController {
def index() { //ここで定義される関数をアクションといいます
respond Todo.list() //追記
}
}
 ここですごいのはrespondです。respond Todo.list()と書くと、Todoドメインのデータの一覧が
データベースから作成され、決められた規則により、todoListという名前でviewへ渡されます。
viewは指定がなければ、コントローラと同名のフォルダ内でアクションと同名のファイルが自
動で使われます。Grailsではほとんどが自動で行われるため、一覧を作成するためのコント
ローラの記述も1行で終わりです。
ビュー
 それでは、viewファイルを作成しましょう。viewは実際にブラウザに渡されるHTMLデータを
定義します。
 すでにコントローラを作成した時点で同名のフォルダが自動で作成されていますので、そこ
にビューファイルを作成します。
 /demo/grails-app/views/todo フォルダにアクション名と同名で拡張子が.gspのファイルを作成
してください。今回はindex.gspです。以下のように記述してください。通常のHTMLと似ていま
す。見栄えを良くするため、とりあえず既定のcssを含むlayoutを<meta>タグで指定します。
 /demo/grails-app/views/todo/index.gsp
<html>
<head>
<meta name="layout" content="main" />
<title>やることメモ</title>
</head>
<body>
</body>
</html>
ビュー
 それでは、実際にデータの一覧が表示できるようにviewを編集します。
 /demo/grails-app/views/todo/index.gsp
<body>
<ul>
<g:each in=“${todoList}”>
<li>${it.memo}</li>
</g:each>
</ul>
</body>
 <body>タグの間にメモの一覧がリスト表示されるようにします。gspファイルでは<g:>タグで
様々な処理を行えます。これもGrailsが強力なところです。コントローラから受け取ったリスト
を<g:findAll>で再処理することもできるため、DBへの負担の軽減とviewへのデータの受け渡
しが極めて容易になります。
 <g:each>内で使われている${it}は、リストからeachで分割された一つのデータを表す予約語
です。${it.memo}でtodoドメインで定義されたmemoデータにアクセスできます。
 ここでのGarilsの特徴はtodoListが空かどうかの判定がいらない点です。
新しいデータを追加する
 フォームから新しいメモを投稿して、データベースに登録してみましょう。
 gspには、フォーム生成のための専用のタグ<g:form>があります。
 gspには、フォームからサブミットされたデータを自動的に、ドメインと結び付けてくれるため、
一つ一つのパラメータを受け取る処理をcontrollerに書く必要はありません。
 それでは、コントローラとviewを編集しましょう。
 /demo/grails-app/controllers/TodoController.groovy
def index(){
respond Todo.list()
respond new Todo() //追記
}
まず、フォームから投稿されるデータが格納されることになるTodoドメインをnewで生成します。
respondは、一つのアクションの中で複数使用することができます。
これにより、viewとの連携がGrailsではとても簡単です。renderと同時使用はできません。
フォームの自動生成と、値とモデルの紐づけが、きわめて簡単でタグの自由度も高いです。
フォームを生成
 続いてviewを編集します。
 /demo/grails-app/views/todo/index.gsp
<g:each in=${todoList}>
(先ほど追加したeachのコード)
</g:each>
先ほど追加したg:eachの下に下記を追記してください。
<g:form resource=“${this.todo}” action=“save” method=“POST”>
<fieldset class="form">
<g:hiddenField name="id" value="${this.todo.id}" />
<f:field bean=“todo” property=“memo” label=“メモ"/>
</fieldset>
<fieldset class="buttons">
<g:submitButton name=“create” class=“save” value=“保存” />
</fieldset>
</g:form>
フォームとドメインクラス
 resourceに${this.コントローラ}とactionを指定することで、リンクが自動生成されます。
 <f:field>はGrails Fields Pluginにより提供される機能です。このプラグインは標準でロードされ
るPluginです。
 <f:filed> では、
bean=“コントローラでnewしたドメインクラス”
property=“値を紐づけるドメインクラスの値”
label=“インプットフィールドのラベル”
を指定することで、ドメインに関連した値を送信することができるフィールドを生成します。
 beanで、ドメインクラスを指定することで、サブミットされた値が自動的にドメインに格納されま
す。そのため、Grailsでは、サブミットされた値をコントローラで受け取り、それをわざわざパラ
メータとして個別に処理したり、SQLに代入するといった作業がまったく必要ありません。
 idはGrailsで自動割り振りを任せているので、ユーザが指定する必要はないため、非表示と
しています。<g:hiddenField name="id" value="${this.person.id}" />
フォームの値をコントローラで受取る
 viewの<g:form>で指定したように、フォームのサブミットボタンが押されると、TodoController
のsaveアクションが呼び出されます。コントローラにsaveアクションを定義しましょう。
 /demo/grails-app/controllers/demo/TodoController.groovy
class TodoController {
def index(){省略}
//これ以降を追記
def save(Todo todo){
todo.save(flush: true)
redirect(controller:“todo", action: "index")
} //←ここまで
}
 saveアクションの1行目でtodo.save()があります。基本的には1行で、フォームから投稿された
値をデータベースに保存するのは終わりです。そのため、フォームからサブミットされた値を
個別に受け取ったり、SQLに代入したりする処理は全くありません。1行で終わりです。その
後、todoの内容を一覧するためindexアクションにリダイレクトします。
 ここまで出来たらいったんアプリを実行してみましょう。 $sudo ./grailsw run-app
リダイレクトもGrailsはすごい
 さて、ここまでで、メモを保存して一覧するアプリができました。
 先ほどは単純にリダイレクトしましたが、実際はリダイレクトするときに、「保存が成功した」な
どのメッセージを含めたいことがあるでしょう。ここでもGrailsはすごいんです。
 他のフレームワークでは、リダイレクトする際に、変数としてメッセージなどを含める場合、リ
ダイレクト先のindexアクションでもその値を受け取れるように、パラメータの受け取り処理を
追加する必要があります。
 よくあることですが、indexアクションは、直接ブラウザからアクセスされる場合と、リダイレクト
でアクセスされる場合が出てきます。そのため、パラメータが空の場合を考える必要があり
ます。(リダイレクトの時だけ値が入るパラメータが出てくる。)
 すると、indexアクションにはパラメータの状態をチェックする処理を追記することになります。
そしてフレームワークによっては、viewでエラーを出さないために、ニセの値を格納する必要
がある場合もあります。つまり、ちょっと面倒くさいのです。
 Grailsならindexアクションは全く変更する必要ありません。リダイレクトで増えた値について、
まったくindexアクションで触れる必要はありません。にもかかわらず、メッセージなどの新し
い値をindexアクションを経由してview(index.gsp)に表示できます。indexアクションが飛ばさ
れているわけではなく、indexアクションで定義されたrespondも機能します。
リダイレクトにメッセージを含める
 /demo/grails-app/controllers/demo/TodoController.groovy
def save(Todo todo){
todo.save()
redirect(controller:“todo", action: "index")
}
を次のように変更します。
def save(Todo todo){
todo.save()
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.created.message', args: [‘メモ’, todo.memo])
redirect(controller:“todo", action: "index")
}
}
}
 詳細は割愛しますが、 ‘default.created.message‘とは、標準のメッセージでi18n対応です。
ビューを変更する
 /demo/grails-app/views/todo/index.gsp
 先ほどのForm生成タグの上にメッセージを表示させるためのタグを追加しましょう。
 リダイレクト以外ではメッセージはnullですので、<g:if>タグで判定します。
 <g:if>タグ内のtestとは、if判定をするための決まった予約語です。
<g:each 略>
(略)
</g:each>
<g:if test="${flash.message}">
<div class="message" role="status">${flash.message}</div>
</g:if>
<g:form 略>
(略)
</g:form>
メモを削除できるようにする
 ToDoメモを不要になったら削除できる機能を追加しましょう。
 まず、それぞれのメモの横に「削除」リンクを追加しましょう。
 <g:each>の部分を編集します。たった1行です。
 /demo/grails-app/views/todo/index.gsp
<ul>
<g:each in=“${todoList}”>
<li>${it.memo}
<g:link action=“delete” id=“${it.id}”>削除</g:link> //追記
</li>
</g:each>
</ul>
<g:if 略>
</g:if>
<g:form 略>
</g:form>
 deleteアクションにmemoのidを渡します。id=“”とするだけです。
削除の機能を実装する
 controllerに削除の機能を実装します。deleteアクションを追加します。
 /demo/grails-app/contollers/demo/TodoController.groovy
class TodoController {
def index() { (略)
}
def delete(Long id){
def todo = Todo.get(id)
todo.delete(flush: true)
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.deleted.message', args: [‘メモ’, todo.memo])
redirect(controller:“todo", action: "index")
}
}
 viewとcontrollerの間でidの受け渡しが簡単でパラメータから切り出す必要もありません。
メモを編集できるようにする
 ToDoメモを編集できるようにします。先ほどフォームからコントローラへ投稿された値を、保
存するのはやりました。しかし、編集するとなると、すでに保存された値をフォームに戻すこと
になります。ここでもGrailsは超簡単です。フレームワークによっては、コントローラからフォー
ムに値を渡すのは、フォームデータを保存する時よりコードの量が多くなります。
 viewに「編集」リンクを追加します。
 /demo/grails-app/views/todo/index.gsp
<ul>
<g:each in=“${todoList}”>
<li>${it.memo}
<g:link action=“delete” id=“${it.id}”>削除</g:link>
<g:link action=“edit” id=“${it.id}”>編集</g:link> //追記
</li>
</g:each>
</ul>
 編集機能を追加するわけですから、「編集」リンクを追記するのは、分かりやすいですね。
 しかし、<g:form>タグは全く変更しません。Grailsならそれでいいのです。他のフレームワーク
だったら、「もしフォームに値が渡されたらフィールドにその値をセットして…」とか大変です。
編集の機能を実装する
 コントローラに編集の機能を追加します。editアクションを追加します。
 /demo/grails-app/contollers/demo/TodoController.groovy
class TodoController {
def index() { (略)
}
def delete(Long id){
}
def edit(Long id){
respond Todo.list()
respond Todo.get(id), view: “index”
}
}
 じゃーん。これだけです。本当に驚きです。
 respondは、viewを指定できます。指定しなければアクションと同名のファイルが使用されま
すが、ここでは、index.gspを使用したいので、view: “index” とします。
まとめ
 ここまでGrailsを見てきましたが、いかにGrailsが優れた
フレームワークであるか、ご覧いただけたかと思います。
 JAVAとGroovyのいいとこどりで、JAVAの経験を生かせる
ことも、もちろんですが、実は、Groovyの特徴を生かせる
ことも大きなメリットがあります。
 それでは、Grailsをお楽しみください。

More Related Content

What's hot

大規模トラフィックにどのように備えて負荷対策を実施しているのか?
大規模トラフィックにどのように備えて負荷対策を実施しているのか?大規模トラフィックにどのように備えて負荷対策を実施しているのか?
大規模トラフィックにどのように備えて負荷対策を実施しているのか?Yusuke Shirakawa
 
Jenkins 2を使った究極のpipeline ~ 明日もう一度来てください、本物のpipelineをお見せしますよ ~
Jenkins 2を使った究極のpipeline ~ 明日もう一度来てください、本物のpipelineをお見せしますよ ~Jenkins 2を使った究極のpipeline ~ 明日もう一度来てください、本物のpipelineをお見せしますよ ~
Jenkins 2を使った究極のpipeline ~ 明日もう一度来てください、本物のpipelineをお見せしますよ ~ikikko
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
電子署名(PKI)ハンズオン資料 V1.00
電子署名(PKI)ハンズオン資料 V1.00電子署名(PKI)ハンズオン資料 V1.00
電子署名(PKI)ハンズオン資料 V1.00Naoto Miyachi
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
JSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方についてJSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方についてAya Ebata
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門tsukasamannen
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法Kazuto Kusama
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮Hibino Hisashi
 
トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2Takashi Hoshino
 
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...Shinji Takao
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 

What's hot (20)

C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
大規模トラフィックにどのように備えて負荷対策を実施しているのか?
大規模トラフィックにどのように備えて負荷対策を実施しているのか?大規模トラフィックにどのように備えて負荷対策を実施しているのか?
大規模トラフィックにどのように備えて負荷対策を実施しているのか?
 
Jenkins 2を使った究極のpipeline ~ 明日もう一度来てください、本物のpipelineをお見せしますよ ~
Jenkins 2を使った究極のpipeline ~ 明日もう一度来てください、本物のpipelineをお見せしますよ ~Jenkins 2を使った究極のpipeline ~ 明日もう一度来てください、本物のpipelineをお見せしますよ ~
Jenkins 2を使った究極のpipeline ~ 明日もう一度来てください、本物のpipelineをお見せしますよ ~
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
電子署名(PKI)ハンズオン資料 V1.00
電子署名(PKI)ハンズオン資料 V1.00電子署名(PKI)ハンズオン資料 V1.00
電子署名(PKI)ハンズオン資料 V1.00
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
JSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方についてJSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方について
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
 
トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2
 
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 

Similar to Grails超入門

1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門Tatsuya Kosuge
 
Androidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradleAndroidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradleamayaw9
 
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)Yuichi Murata
 
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法 クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法 Hiroki Yata
 
Glide活用イメージ紹介20220421
Glide活用イメージ紹介20220421Glide活用イメージ紹介20220421
Glide活用イメージ紹介20220421kazu_1803
 
01 slack導入の提案
01 slack導入の提案01 slack導入の提案
01 slack導入の提案ssuser68dea4
 
The Internal of Serverless Plugins
The Internal of Serverless PluginsThe Internal of Serverless Plugins
The Internal of Serverless PluginsTerui Masashi
 
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜Yuji Nojima
 
DDDをScrumで廻す あるいは ScrumをDDDで廻す
DDDをScrumで廻す あるいは ScrumをDDDで廻す DDDをScrumで廻す あるいは ScrumをDDDで廻す
DDDをScrumで廻す あるいは ScrumをDDDで廻す Kiro Harada
 

Similar to Grails超入門 (12)

1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門
 
Androidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradleAndroidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradle
 
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)
 
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法 クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
クロスプラットフォームはまだ早い!既存のアプリをクロスプラットフォームっぽくする方法
 
cochica
cochicacochica
cochica
 
Glide活用イメージ紹介20220421
Glide活用イメージ紹介20220421Glide活用イメージ紹介20220421
Glide活用イメージ紹介20220421
 
01 slack導入の提案
01 slack導入の提案01 slack導入の提案
01 slack導入の提案
 
The Internal of Serverless Plugins
The Internal of Serverless PluginsThe Internal of Serverless Plugins
The Internal of Serverless Plugins
 
Serverless on GCP
Serverless on GCPServerless on GCP
Serverless on GCP
 
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
 
DDDをScrumで廻す あるいは ScrumをDDDで廻す
DDDをScrumで廻す あるいは ScrumをDDDで廻す DDDをScrumで廻す あるいは ScrumをDDDで廻す
DDDをScrumで廻す あるいは ScrumをDDDで廻す
 
Google Product
Google ProductGoogle Product
Google Product
 

Grails超入門