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

Network scanning
Network scanningNetwork scanning
Network scanningoceanofwebs
 
Web Application Vulnerabilities
Web Application VulnerabilitiesWeb Application Vulnerabilities
Web Application VulnerabilitiesPreetish Panda
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기AWSKRUG - AWS한국사용자모임
 
Pentesting GraphQL Applications
Pentesting GraphQL ApplicationsPentesting GraphQL Applications
Pentesting GraphQL ApplicationsNeelu Tripathy
 
Cisco asa fire power services
Cisco asa fire power servicesCisco asa fire power services
Cisco asa fire power servicesTapan Doshi
 
How to Prevent RFI and LFI Attacks
How to Prevent RFI and LFI AttacksHow to Prevent RFI and LFI Attacks
How to Prevent RFI and LFI AttacksImperva
 
Mobile security part 1(Android Apps Pentesting)- Romansh yadav
Mobile security part 1(Android Apps Pentesting)- Romansh yadavMobile security part 1(Android Apps Pentesting)- Romansh yadav
Mobile security part 1(Android Apps Pentesting)- Romansh yadavRomansh Yadav
 
Firmware Extraction & Fuzzing - Jatan Raval
Firmware Extraction & Fuzzing - Jatan RavalFirmware Extraction & Fuzzing - Jatan Raval
Firmware Extraction & Fuzzing - Jatan RavalNSConclave
 
【AI:ML#16】Amazon Lexを用いたチャットボットの構築.pdf
【AI:ML#16】Amazon Lexを用いたチャットボットの構築.pdf【AI:ML#16】Amazon Lexを用いたチャットボットの構築.pdf
【AI:ML#16】Amazon Lexを用いたチャットボットの構築.pdfTakeshiFukae
 
Deep understanding on Cross-Site Scripting and SQL Injection
Deep understanding on Cross-Site Scripting and SQL InjectionDeep understanding on Cross-Site Scripting and SQL Injection
Deep understanding on Cross-Site Scripting and SQL InjectionVishal Kumar
 
Intrusion Detection Presentation
Intrusion Detection PresentationIntrusion Detection Presentation
Intrusion Detection PresentationMustafash79
 
CEHv9 : module 17 - cloud computing
CEHv9 : module 17 - cloud computingCEHv9 : module 17 - cloud computing
CEHv9 : module 17 - cloud computingteknetir
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
A8 cross site request forgery (csrf) it 6873 presentation
A8 cross site request forgery (csrf)   it 6873 presentationA8 cross site request forgery (csrf)   it 6873 presentation
A8 cross site request forgery (csrf) it 6873 presentationAlbena Asenova-Belal
 
DoS ve DDoS Saldırıları ve Korunma Yöntemleri
DoS ve DDoS Saldırıları ve Korunma YöntemleriDoS ve DDoS Saldırıları ve Korunma Yöntemleri
DoS ve DDoS Saldırıları ve Korunma YöntemleriBGA Cyber Security
 
Introduction to Web Application Penetration Testing
Introduction to Web Application Penetration TestingIntroduction to Web Application Penetration Testing
Introduction to Web Application Penetration TestingRana Khalil
 
Google Cloud Forensics & Incident Response
Google Cloud Forensics & Incident ResponseGoogle Cloud Forensics & Incident Response
Google Cloud Forensics & Incident ResponseChristopher Doman
 
Jwt == insecurity?
Jwt == insecurity?Jwt == insecurity?
Jwt == insecurity?snyff
 
Lateral Movement: How attackers quietly traverse your Network
Lateral Movement: How attackers quietly traverse your NetworkLateral Movement: How attackers quietly traverse your Network
Lateral Movement: How attackers quietly traverse your NetworkEC-Council
 

What's hot (20)

Network scanning
Network scanningNetwork scanning
Network scanning
 
Web Application Vulnerabilities
Web Application VulnerabilitiesWeb Application Vulnerabilities
Web Application Vulnerabilities
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
Pentesting GraphQL Applications
Pentesting GraphQL ApplicationsPentesting GraphQL Applications
Pentesting GraphQL Applications
 
Wazuh Security Platform
Wazuh Security PlatformWazuh Security Platform
Wazuh Security Platform
 
Cisco asa fire power services
Cisco asa fire power servicesCisco asa fire power services
Cisco asa fire power services
 
How to Prevent RFI and LFI Attacks
How to Prevent RFI and LFI AttacksHow to Prevent RFI and LFI Attacks
How to Prevent RFI and LFI Attacks
 
Mobile security part 1(Android Apps Pentesting)- Romansh yadav
Mobile security part 1(Android Apps Pentesting)- Romansh yadavMobile security part 1(Android Apps Pentesting)- Romansh yadav
Mobile security part 1(Android Apps Pentesting)- Romansh yadav
 
Firmware Extraction & Fuzzing - Jatan Raval
Firmware Extraction & Fuzzing - Jatan RavalFirmware Extraction & Fuzzing - Jatan Raval
Firmware Extraction & Fuzzing - Jatan Raval
 
【AI:ML#16】Amazon Lexを用いたチャットボットの構築.pdf
【AI:ML#16】Amazon Lexを用いたチャットボットの構築.pdf【AI:ML#16】Amazon Lexを用いたチャットボットの構築.pdf
【AI:ML#16】Amazon Lexを用いたチャットボットの構築.pdf
 
Deep understanding on Cross-Site Scripting and SQL Injection
Deep understanding on Cross-Site Scripting and SQL InjectionDeep understanding on Cross-Site Scripting and SQL Injection
Deep understanding on Cross-Site Scripting and SQL Injection
 
Intrusion Detection Presentation
Intrusion Detection PresentationIntrusion Detection Presentation
Intrusion Detection Presentation
 
CEHv9 : module 17 - cloud computing
CEHv9 : module 17 - cloud computingCEHv9 : module 17 - cloud computing
CEHv9 : module 17 - cloud computing
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
A8 cross site request forgery (csrf) it 6873 presentation
A8 cross site request forgery (csrf)   it 6873 presentationA8 cross site request forgery (csrf)   it 6873 presentation
A8 cross site request forgery (csrf) it 6873 presentation
 
DoS ve DDoS Saldırıları ve Korunma Yöntemleri
DoS ve DDoS Saldırıları ve Korunma YöntemleriDoS ve DDoS Saldırıları ve Korunma Yöntemleri
DoS ve DDoS Saldırıları ve Korunma Yöntemleri
 
Introduction to Web Application Penetration Testing
Introduction to Web Application Penetration TestingIntroduction to Web Application Penetration Testing
Introduction to Web Application Penetration Testing
 
Google Cloud Forensics & Incident Response
Google Cloud Forensics & Incident ResponseGoogle Cloud Forensics & Incident Response
Google Cloud Forensics & Incident Response
 
Jwt == insecurity?
Jwt == insecurity?Jwt == insecurity?
Jwt == insecurity?
 
Lateral Movement: How attackers quietly traverse your Network
Lateral Movement: How attackers quietly traverse your NetworkLateral Movement: How attackers quietly traverse your Network
Lateral Movement: How attackers quietly traverse your Network
 

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超入門