SlideShare a Scribd company logo
1 of 49
Download to read offline
LastafluteでKotlinをはじめよう
DBFluteフェス2018 1
DBFluteフェス 2018
■ 名前: 菅谷信介
■ オープンソース活動:
➔ Fess, DBFlute関連, Apache PredictionIO,...
■ 2015年からDBFluteフェスのこの枠で...
自己紹介
2
DBFluteフェス 2018
LastaFluteを使っていますか?
3
DBFluteフェス 2018
Java以外の言語?
4
DBFluteフェス 2018
LastaFluteで
Kotlinを
使いましょう!
5
DBFluteフェス 2018
Kotlin入門
6
DBFluteフェス 2018
■ JetBrains社が作ったJVMで動く静的型付け言語
■ 2017年からAndroidの公式開発言語
■ Javaと相互運用可能(”100% interoperable”)
■ Javaを簡潔/安全になるように改良した言語
➔型推論、関数型プログラミング、null安全...etc
■ JavaでできることはほとんどKotlinでもできる
➔JavaのライブラリはKotlinからも使える
➔Javaより簡潔に書けることが多い
➔コンパイル時間はJavaと比べて気にならない
Kotlinとは
7
DBFluteフェス 2018
■ JetBrains社がJavaからKotlinへの移行を念頭に
2011年から開発開始
➔2012年 OSS化
■ 歴史
➔2016年 2月 v1.0
➔2017年 3月 v1.1
➔2017年 5月 Androidの公式開発言語として採用
➔2017年 11月 v1.2
➔2018年 10月 v1.3
Kotlinの歴史
8
DBFluteフェス 2018
■ JVM上で動作
➔サーバサイドやAndroid
■ Kotlin/JS
➔KotlinのコードをJSに変換できる
■ Kotlin/Native
➔Kotlinのコードをネイティブコードに変換できる(LLVM)
Kotlinの種類
9
DBFluteフェス 2018
Kotlinの文法
10
DBFluteフェス 2018
■ Javaと互換だが、見た目は結構違う(?)
➔セミコロンが省略可
➔top-level(クラスと同レベル)に関数や変数が宣言できる
➔省略表現が豊富
➔...etc
文法
11
package project.kotlin // パッケージ名
import java.util.* // インポート
val PI = 3.14 // 定数
class Person constructor(val firstName: String, val lastName: String) {
...
}
fun main(args : Array<String>) {
println(“Hello World!”)
}
DBFluteフェス 2018
■ if-else, try-catch
➔Javaのようにも書けるが...
文法: if, try
12
var max: Int
if (a > b) {
max = a
} else {
max = b
}
try {
readFile()
return true
} catch (e: IOException) {
e.printStackTrace()
return false
}
DBFluteフェス 2018
■ Kotlinではifやtryは式(expression)
➔以下の書き方もできる
文法: if, try
13
val max = if(a > b) a else b
val success = try {
readFile()
true
} catch (e: IOException) {
false
}
DBFluteフェス 2018
■ switch文はなく、代わりにwhenを使う
➔ifやtryと同様, 式として扱われる
➔必要に応じてelseで指定する
文法: when
14
fun isZeroOrOne(x: Int) : String {
return when (x) {
0 -> "xは0です"
1 -> "xは1です"
else -> "xは0でも1でもありません"
}
}
print( isZeroOrOne(0) ) // “xは0です”
DBFluteフェス 2018
■ for文はforeach方式で書く
➔while, do-whileはJavaと同じ
文法: for, while
15
val nameList = listOf(“Taro”, “Hanako”)
for (name in nameList) {
println(name)
}
val names = arrayOf("Taro", "Hanako")
for(i in names.indices) {
println(names[i])
}
while (x > 0) {
x--
}
DBFluteフェス 2018
■ val(読み取り専用)とvar(可変)
➔valはJavaで言うfinalがついた変数
➔コンパイラが型推論できる場合は型の宣言は不要
■ インスタンスの生成
➔newキーワードは不要
変数の定義
16
val name = "Taro"
val name : String = “Taro”
var str = "text"
var str: String = "Text"
val sb = StringBuilder("Hello")
sb.append(" ").append("World!")
print(sb) // Hello World!
DBFluteフェス 2018
■ Javaと同じくnullがある
■ Optionalのような機能を文法レベルでサポート
➔Nullableな変数には”(型名)?"をつける
➔Nullableな変数を使うときは
■ "?"(nullの時は実行されない)
■ "!!"(nullでも強制的に実行)
Nullable
17
var str: String? = null
str?.length() // strがnullの時実行されない
str!!.length() // strがnullなら当然NullPointerExceptionがthrow
DBFluteフェス 2018
■ エルビス演算子 ?:
➔左式の評価でnullが発生した場合に右式が評価される
■ Smart casts
➔型チェックやnullチェックなどをすると暗黙的に安全な型変換を
してくれる機能(コンパイラが追跡できる範囲で)
Nullable
18
var person: Person? = ...
val name: String = person?.name ?: "NoName"
fun printStringLength(str: String?) {
if (str != null) {
println(str.length) // strはString?からStringにキャストされる
}
}
DBFluteフェス 2018
■ ==は構造等価性, ===は参照等価性
➔Javaのようにequalsメソッドを呼ぶ必要はない
➔a == b は “a?.equals(b) ?: (b === null) “と同じ意味
➔!=, !==も同様
文法: ==と===
19
val actual = getFirstName()
val expected = “Taro”
assertTrue(actual == expected)
assertTrue(actual !== expected)
DBFluteフェス 2018
■ Javaで言うプリミティブ型(int, double, ...)はなく、すべ
てオブジェクト化(Int, Double...)
➔JavaのInteger, Double...に相当
■ コンパイラが型推論してくれるので型の宣言は省略
できることが多い
■ 配列はArray<(型名)>
➔Javaの[]に相当
➔基本的な型(Int等)には最適化されたArray(intArray等)がある
型
20
val a = arrayOf(1, 2, 3)
val b = intArray(1, 2, 3) // 速い
DBFluteフェス 2018
■ すべてのクラスのスーパークラス
■ Javaで言うObject
➔equals(), hashCode(), toString()しか持たないので完全に同じ
ではない
■ 任意の型を取る場合は”var any: Any? = null”など
とできる
特殊な型: Any
21
DBFluteフェス 2018
■ Javaで言うvoid型
■ 返り値がない関数などはUnit型
➔省略可
特殊な型: Unit
22
fun printStringLength(str: String?) { // Unit型の関数
if (str != null) {
println(str.length)
}
}
DBFluteフェス 2018
■ JavaのStringとほとんど同じ
➔JavaのString[]はArray<String>
➔Javaの標準ライブラリとは別にStringBuilder等もある
■ String Template
➔$変数名, ${式}で文字列中に値を埋め込める
String
23
val num = 1
print(“num is $num and 2*num is ${2*num}”)
val input = readLine(input)
print(“the input is $input”)
DBFluteフェス 2018
■ コンストラクタはクラス名の後
➔セカンダリコンストラクタも作れる
➔constructorは省略可
■ getter, setterは自動で生成される
➔person.firstNameなどで自動でsetter, getterが呼ばれる
■ init でコンストラクタに共通処理が書ける
■ 継承される可能性があるときはopenを付ける
➔何も付けなければfinal class
■ interfacesやabstract classは標準でopenとなる
クラス
24
class Person constructor(val firstName: String, var lastName: String) {}
val person = Person(“Taro”, “Sato”)
DBFluteフェス 2018
■ 生成されるPerson.classをJavaにデコンパイルすると....
Javaだと...
25
public final class Person {
@NotNull
private final String firstName;
@NotNull
private String lastName;
@NotNull
public final String getFirstName() {
return this.firstName;
}
@NotNull
public final String getLastName() {
return this.lastName;
}
public final void setLastName(@NotNull String string) {
Intrinsics.checkParameterIsNotNull((Object)string, (String)"<set-?>");
this.lastName = string;
}
public Person(@NotNull String firstName, @NotNull String lastName) {
Intrinsics.checkParameterIsNotNull((Object)firstName, (String)"firstName");
Intrinsics.checkParameterIsNotNull((Object)lastName, (String)"lastName");
this.firstName = firstName;
this.lastName = lastName;
}
}
DBFluteフェス 2018
■ staticな変数や関数のみの集まりを定義したい場合
などに使う
➔シングルトンの実装などに使える
object
26
object HttpClient {
var host : String
init {
host = getHost()
}
fun httpGetRequest(path: String) : String {
return getResponse("GET", host + path)
}
}
print(HttpClient.httpGetRequest("/test/"))
DBFluteフェス 2018
■ 各インスタンスで共通のフィールドやメソッドをクラ
ス内で定義したいとき等に使う
➔Javaでいうstaticフィールドやstaticメソッド
➔top-levelに宣言した方が良い場合も
companion object
27
class MyClass{
companion object Factory {
fun create(): MyClass = MyClass()
}
}
val myClass = MyClass.create()
DBFluteフェス 2018
■ データを保持するためのクラス
➔コンストラクタ等を書く必要がない
■ equals() , hashCode(), toString()などを自動的に
生成してくれる
➔copy(), componentN()なども
Data Class
28
data class User(val name: String, val email: String)
val taro = User(name = "Taro", age = 18)
DBFluteフェス 2018
■ Javaと同じくジェネリクスをサポート
■ Javaとの違い
➔変性(<? extends T>的な)はinとoutで書ける
Generics
29
interface Source<out T> {
fun nextT(): T
}
fun demo(strs: Source<String>) {
val objects: Source<Any> = strs
}
class Box<T>(t: T) {
var item = t
}
val box: Box<Int> = Box<Int>(1)
DBFluteフェス 2018
■ ラムダ式は{}で囲む
■ ラムダ式の中からアクセスできる
➔Javaと違い、値の変更も可
ラムダ式
30
val sum = {x: Int, y: Int -> x + y} // sumの型は "(Int, Int) -> Int"
println(sum(1,2)) // sum.invoke(1,2) でもOK
var sum = 0
val ints = arrayOf(1, 2, 3)
ints.filter { it > 0 }.forEach { sum += it } // ラムダ式の外側の()は省略可
println(sum)
DBFluteフェス 2018
■ 既存のクラスに対して関数を定義できる
➔新しくメソッドを追加するために継承クラスを新しく作る必要が
ない
➔スコープ関数など便利な拡張関数が用意されている
拡張関数
31
class Person constructor(val firstName: String, val lastName: String) {}
fun Person.printFullName() {
println("${this.firstName} ${this.lastName}")
}
DBFluteフェス 2018
■ List, Set, Mapなどのコレクションが用意
➔基本的にImmutable
➔MutableList, MutableSet, MutableMapなどもある
➔listOf(), setOf(), mapOf()などインスタンス生成用のメソッドが
用意されている
➔map, filter, forEachがある(JavaのStream APIと同じ)
Collections
32
val readOnlyList = listOf(1, 2, 3, 4)
println(readOnlyList) // "[1, 2, 3, 4]"
val hashMap = hashMapOf("r" to 0, "g" to 1, "b" to 2)
println(hashMap["g"]) // "1"
print( readOnlyList.filter{ it % 2 == 0 } ) // "[2, 4]"
hashMap.forEach{ key, value -> print("$key $value") } // "r 0b 2g 1"
DBFluteフェス 2018
■ Javaとほぼ同じ(try, catch, finally, throw)
➔ただし、Kotlinにはchecked exceptionがない
Kotlinの例外処理
33
try {
// ...
} catch (e: SomeException) {
// ...
} finally { // 省略可
// ...
}
DBFluteフェス 2018
■ package名を適切に指定すればプロジェクト内で相
互に参照可能
➔javaとkotlinのディレクトリを作ってコードを管理
■ KotlinからJavaを使う場合はそのまま使える
■ JavaからKotlinを使う場合はKotlinコードにアノテー
ション等を付与して調整可能
Javaとの相互運用
34
DBFluteフェス 2018
■ 基本的にJvmアノテーションを付与する
■ Jvmアノテーション
➔top-levelのクラスやメソッドを使いたい → ファイルの先頭に@JvmName
➔クラスのフィールドをつかいたい → @JvmField
➔companion objectの中身を使いたい → @JvmStatic
➔その他にも@Throwsや@Voaltile等々
JavaからKotlinを使う
35
@file:JvmName("User")
...
class User {
@JvmField val userID = 0
companion object {
@JvmStatic
private val EMPTY_INSTANCE = Test()
}
}
DBFluteフェス 2018
LastaFluteで使う
36
DBFluteフェス 2018
■ IntelliJ
➔Kotlinの開発元(JetBrains)のエディタ
➔Kotlin用の機能が豊富
➔Java → Kotlinのコード変換機能
所々自分で修正が必要(他のJavaコードから呼び出されている部分や、実装が
入り組んでいる場合は適切に変換されないことが多いので大幅に書き直しが必
要なことも)
■ Eclipse
➔公式のEclipse用のプラグインが提供されている
➔でも、IntelliJを使ったほうが良さそう…
■ Maven, GradleでもKotlinが使える
開発環境
37
DBFluteフェス 2018
■ Kotlinを利用したLastaFluteのプロジェクト
■ Java版のHarborをKotlin化
■ Mavenのプロジェクト
■ 自動生成されるコードはJavaのまま
➔DBFluteの機能はそのまま使える
■ Javaプロジェクトからの移行の参考に…
https://github.com/lastaflute/lastaflute-example-paradeplaza
Paradeplaza
38
DBFluteフェス 2018
Kotlinへの移行
39
DBFluteフェス 2018
■ JavaとKotlinを共存させる
➔変更内容の確認はHarborをdiffすると良い
■ kotlin-maven-pluginを追加
➔src/main/javaとsrc/main/kotlin
■ maven-compiler-pluginを変更
■ kotlin-stdlibを依存関係に追加
pom.xml
40
DBFluteフェス 2018
■ Javaのままにしておくもの
➔DBFluteで生成するコード
➔mylastaに生成されるコード
■ 上記以外はIntelliJの変換機能で.ktにする
Kotlinにするコード
41
DBFluteフェス 2018
■ 〜Boot.ktのmain関数でJettyBootを起動
■ Java的には〜BootKt.classになる
➔pom.xmlでmainClassは〜BootKtを指定する
JettyBoot
42
fun main(args: Array<String>) {
JettyBoot(8090, "/paradeplaza").asDevelopment(isDevelopment()).bootAwait()
}
DBFluteフェス 2018
■ @Resourceで指定しているコンポーネント
➔Kotlinへの自動変換がうまくいかない
■ valになるので、lateint varに変える
DIするコンポーネント
43
// 自動変換だと以下になる…
// @Resource
// private val responseManager: ResponseManager? = null
@Resource
private lateinit var responseManager: ResponseManager
DBFluteフェス 2018
■ Nullableの整理が必要
■ ラムダの整理が必要
➔ たまにラムダの変換が失敗している
■ ifなどは式である(return if ….みたいな)
■ 定数のconstがなくなる
■ StringBuilderをbuildStringにする
■ String Templateを使う
その他の自動変換問題
44
DBFluteフェス 2018
■ 書き方は大きくは変わらない
実行メソッド
45
@Execute
fun index(): HtmlResponse {
val recentProducts = mappingToProducts(selectRecentProductList())
val highPriceProducts = mappingToProducts(selectHighPriceProductList())
return asHtml(ParadeplazaHtmlPath.path_Mypage_MypageHtml)
.renderWith { data ->
data.register("recentProducts", recentProducts)
data.register("highPriceProducts", highPriceProducts)
}
}
DBFluteフェス 2018
■ Nullableなvarになる
Formクラス
46
class MemberAddForm {
@Required
var memberName: String? = null
@Required
var memberAccount: String? = null
@ValidateTypeFailure // using calendar so basically unneeded but just in case
var birthdate: LocalDate? = null
@Required
var memberStatus: CDef.MemberStatus? = null
}
DBFluteフェス 2018
■ 普通にBhvを使える
➔dataクラスにするいいことがあるか(?)
DBFlute関連
47
private fun insertMember(form: MemberAddForm) {
val member = Member()
member.memberName = form.memberName
member.memberAccount = form.memberAccount
member.birthdate = form.birthdate
member.memberStatusCodeAsMemberStatus = form.memberStatus
if (member.isMemberStatusCodeFormalized) {
member.formalizedDatetime = timeManager.currentDateTime()
}
memberBhv.insert(member)
}
DBFluteフェス 2018
まとめ
48
DBFluteフェス 2018
■ LastaFluteでもKotlinを使える
➔ DBFlute/LastaFluteの最適化は必要
■ Paradeplazaを参考にしてください
■ DBFluteの自動生成は利用できる
■ 既存プロジェクトでも部分適用も可能
まとめ
49

More Related Content

What's hot

BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo dbYuji Isobe
 
Reladomo入門 JJUGナイトセミナー #jjug
Reladomo入門 JJUGナイトセミナー #jjugReladomo入門 JJUGナイトセミナー #jjug
Reladomo入門 JJUGナイトセミナー #jjugHiroshi Ito
 
Shibuya Perl Mongers#12 No Sql Couch Db
Shibuya Perl Mongers#12 No Sql Couch DbShibuya Perl Mongers#12 No Sql Couch Db
Shibuya Perl Mongers#12 No Sql Couch DbMakoto Ohnami
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Jun Ohtani
 
20181031 springfest spring data geode
20181031 springfest spring data geode20181031 springfest spring data geode
20181031 springfest spring data geodeMasaki Yamakawa
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-uedayou
 
Tokyo Webmining #12 Hapyrus
Tokyo Webmining #12 HapyrusTokyo Webmining #12 Hapyrus
Tokyo Webmining #12 HapyrusKoichi Fujikawa
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜Takahiro Inoue
 
ARC-009_RDB 技術者のための NoSQL ガイド
ARC-009_RDB 技術者のための NoSQL ガイドARC-009_RDB 技術者のための NoSQL ガイド
ARC-009_RDB 技術者のための NoSQL ガイドdecode2016
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
MyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatypeMyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatypeToshi Harada
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
chapter6
chapter6chapter6
chapter6ymk0424
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Shinsuke Sugaya
 
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)ひとし あまの
 
MySQLのインデックス入門
MySQLのインデックス入門MySQLのインデックス入門
MySQLのインデックス入門Yuto Suzuki
 

What's hot (20)

Sc2009autumn s2robot
Sc2009autumn s2robotSc2009autumn s2robot
Sc2009autumn s2robot
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
月間10億pvを支えるmongo db
月間10億pvを支えるmongo db月間10億pvを支えるmongo db
月間10億pvを支えるmongo db
 
Reladomo入門 JJUGナイトセミナー #jjug
Reladomo入門 JJUGナイトセミナー #jjugReladomo入門 JJUGナイトセミナー #jjug
Reladomo入門 JJUGナイトセミナー #jjug
 
Shibuya Perl Mongers#12 No Sql Couch Db
Shibuya Perl Mongers#12 No Sql Couch DbShibuya Perl Mongers#12 No Sql Couch Db
Shibuya Perl Mongers#12 No Sql Couch Db
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
 
20181031 springfest spring data geode
20181031 springfest spring data geode20181031 springfest spring data geode
20181031 springfest spring data geode
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
 
Tokyo Webmining #12 Hapyrus
Tokyo Webmining #12 HapyrusTokyo Webmining #12 Hapyrus
Tokyo Webmining #12 Hapyrus
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
Cassandra v0.6-siryou
Cassandra v0.6-siryouCassandra v0.6-siryou
Cassandra v0.6-siryou
 
ARC-009_RDB 技術者のための NoSQL ガイド
ARC-009_RDB 技術者のための NoSQL ガイドARC-009_RDB 技術者のための NoSQL ガイド
ARC-009_RDB 技術者のための NoSQL ガイド
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
MyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatypeMyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatype
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
chapter6
chapter6chapter6
chapter6
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
 
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)
 
MySQLのインデックス入門
MySQLのインデックス入門MySQLのインデックス入門
MySQLのインデックス入門
 

Similar to LastaFluteでKotlinをはじめよう

asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章YOSHIKAWA Ryota
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成Akineko Shimizu
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„和弘 井之上
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書くHideyuki Tanaka
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門Tomo Mizoe
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio CodeAkira Inoue
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 

Similar to LastaFluteでKotlinをはじめよう (20)

asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書く
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 

More from Shinsuke Sugaya

PredictionIOでSparkMLを使った開発方法
PredictionIOでSparkMLを使った開発方法PredictionIOでSparkMLを使った開発方法
PredictionIOでSparkMLを使った開発方法Shinsuke Sugaya
 
PredictionIOのPython対応計画
PredictionIOのPython対応計画PredictionIOのPython対応計画
PredictionIOのPython対応計画Shinsuke Sugaya
 
PredictionIO構築入門
PredictionIO構築入門PredictionIO構築入門
PredictionIO構築入門Shinsuke Sugaya
 
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発Shinsuke Sugaya
 
Elasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFessElasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFessShinsuke Sugaya
 
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバElasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバShinsuke Sugaya
 
ElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作るレコメンドシステムElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作るレコメンドシステムShinsuke Sugaya
 
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころShinsuke Sugaya
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようShinsuke Sugaya
 
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールElasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールShinsuke Sugaya
 
DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成Shinsuke Sugaya
 
DBFluteを用いて開発されている全文検索システムFess
DBFluteを用いて開発されている全文検索システムFessDBFluteを用いて開発されている全文検索システムFess
DBFluteを用いて開発されている全文検索システムFessShinsuke Sugaya
 
elasticsearchプラグイン入門
elasticsearchプラグイン入門elasticsearchプラグイン入門
elasticsearchプラグイン入門Shinsuke Sugaya
 
Solrベースの全文検索サーバ Fess
Solrベースの全文検索サーバ FessSolrベースの全文検索サーバ Fess
Solrベースの全文検索サーバ FessShinsuke Sugaya
 
オフィスに1台!全文検索Fess
オフィスに1台!全文検索Fessオフィスに1台!全文検索Fess
オフィスに1台!全文検索FessShinsuke Sugaya
 

More from Shinsuke Sugaya (15)

PredictionIOでSparkMLを使った開発方法
PredictionIOでSparkMLを使った開発方法PredictionIOでSparkMLを使った開発方法
PredictionIOでSparkMLを使った開発方法
 
PredictionIOのPython対応計画
PredictionIOのPython対応計画PredictionIOのPython対応計画
PredictionIOのPython対応計画
 
PredictionIO構築入門
PredictionIO構築入門PredictionIO構築入門
PredictionIO構築入門
 
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
 
Elasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFessElasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFess
 
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバElasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバ
 
ElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作るレコメンドシステムElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作るレコメンドシステム
 
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールElasticsearch Authプラグインでアクセスコントロール
Elasticsearch Authプラグインでアクセスコントロール
 
DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成
 
DBFluteを用いて開発されている全文検索システムFess
DBFluteを用いて開発されている全文検索システムFessDBFluteを用いて開発されている全文検索システムFess
DBFluteを用いて開発されている全文検索システムFess
 
elasticsearchプラグイン入門
elasticsearchプラグイン入門elasticsearchプラグイン入門
elasticsearchプラグイン入門
 
Solrベースの全文検索サーバ Fess
Solrベースの全文検索サーバ FessSolrベースの全文検索サーバ Fess
Solrベースの全文検索サーバ Fess
 
オフィスに1台!全文検索Fess
オフィスに1台!全文検索Fessオフィスに1台!全文検索Fess
オフィスに1台!全文検索Fess
 

LastaFluteでKotlinをはじめよう