SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Kotlin勉強会 in Ehime
GDG四国
@bornknow108
目次
・Kotlin とは
・基本文法
・配列、コレクション
・SAM変換
・TypeAlias、Extension、スコープ関数
・Java混在で開発する時
・さいごに
Kotlin とは
Kotlin - Wikipedia
https://ja.wikipedia.org/wiki/Kotlin
JetBrains社(チェコ)の研究開発拠点(ロシア)で生ま
れた言語。
Android Studio 3.0 からフルサポートされる。
最新バージョンは 1.1.3。(2017/7/1 現在)
基本文法(Javaとの違い)
・Null セーフティです。
・プリミティブ型(基本データ型)はありません。
・new は不要です。
・引数にデフォルト値が設定できます。
・セミコロンは不要です。
・三項演算子はありません。
etc ….
基本文法(Null セーフティです。)
// コンパイルエラー
var notNullableVariable: String = null
// OK
var nullableVariable: String? = null
// OK
String notNullableVariable = null;
// OK
String nullableVariable = null;
Kotlin Java
基本文法(Null セーフティです。)
var notNullableVariable: String = ""
notNullableVariable.isEmpty()
// return true
var nullableVariable: String? = null
nullableVariable.isEmpty()
// コンパイルエラー
nullableVariable?.isEmpty()
// return null
nullableVariable?.isEmpty() ?: false
// return false
nullableVariable = ""
nullableVariable!!.isEmpty()
// return true
Kotlin
String nullableVariable = null;
nullableVariable.isEmpty();
// NullPointerException
if (nullableVariable != null) {
return nullableVariable.isEmpty();
}
return null;
// return null
if (nullableVariable != null) {
return nullableVariable.isEmpty();
}
return false;
// return false
Java
基本文法(プリミティブ型(基本データ型)はありません。 )
var intVariable: Int = 0
var floatVariable: Float = 0f
var doubleVariable: Double = 0.0
var longVariable: Long = 0L
var shortVariable: Short = 0
var byteVariable: Byte = 0
var booleanVariable: Boolean = false
// 型推論を使う場合
var intVariable = 0
var floatVariable = 0f
var doubleVariable = 0.0
var longVariable = 0L
var booleanVariable = false
int intVariable = 0;
float floatVariable = 0;
double doubleVariable = 0;
long longVariable = 0;
short shortVariable = 0;
byte byteVariable = 0;
boolean booleanVariable = false;
Kotlin Java
基本文法(new は不要です。)
val intent = Intent() Intent intent = new Intent();
Kotlin Java
基本文法(引数にデフォルト値が設定できます。 )
class ClassA {
public void methodA() {
methodA("a", "b", "c");
}
public void methodA(String arg1) {
methodA(arg1, "b", "c");
}
public void methodA(String arg1, String arg2) {
methodA(arg1, arg2, "c");
}
public void methodA(String arg1, String arg2, String arg3) {
System.out.println(arg1 + " " + arg2 + " " + arg3);
}
public void methodA2(String arg2) {
System.out.println("a" + " " + arg2 + " " + "c");
}
public void main() {
methodA(); // a b c
methodA("d"); // d b c
methodA("d", "e"); // d e c
methodA("d", "e", "f"); // d e f
methodA2("g"); // a g c
}
}
Kotlin Java
class ClassA {
fun methodA(arg1: String = "a", arg2: String = "b", arg3: String = "c"){
print("${arg1} ${arg2} ${arg3}")
}
fun main() {
methodA() // a b c
methodA("d") // d b c
methodA("d", "e") // d e c
methodA("d", "e", "f") // d e f
methodA(arg2 = "g") // a g c
}
}
}
基本文法(引数にデフォルト値が設定できます。 )
class ClassA {
private String arg1 = "";
public ClassA() {
this("a");
}
public ClassA(String arg1) {
this.arg1 = arg1;
}
public String getArg1() {
return arg1;
}
public void setArg1(String arg1) {
this.arg1 = arg1;
}
}
Kotlin Java
class ClassA(var arg1: String = "a")
class ClassA(arg1: String = "a") {
var arg1 = arg1
}
class ClassA(arg1: String = "a") {
var arg1 = arg1
set(value) {
field = value
}
get() {
return arg1
}
}
基本文法(三項演算子はありません。 )
fun test(a: Int): Int {
return if (a >= 1) {
100
} else {
999
}
}
public int test(int a) {
return a >= 1 ? 100 : 999;
}
Kotlin Java
配列、コレクション
・読み取り専用なコレクションと書き込み可能なコレクションがわか
れています。
・Java8 の Stream API が Kotlin のコレクションに組み込まれて
います。
val array = arrayOf(1, 2, 3)
val intArray = intArrayOf(1, 2, 3) // floatArrayOf, charArrayOf, booleanArrayOf etc...
val blankArray: Array<Int?> = arrayOfNulls(10) // nullのから配列:要素数10個
val list = listOf("a", "b", "c") // List<String>
val mutableList = mutableListOf("a", "b", "c") // ArrayList<String>
val map = mapOf("a" to 1, "b" to 2, "c" to 3) // Map<K, V>
val map2 = mapOf<String, Int>("a" to 1, "b" to 2, "c" to 3)
val mutableMap = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val set = setOf(1, 2, 3)
val mutableSet = mutableSetOf(1, 2, 3)
配列、コレクション(関数をつかった宣言方法 )
Kotlin
配列、コレクション(Stream API相当の実装)
val array = listOf("aaaa", "bbbb", "cccc")
val count = array.filter { it == "aaaa" }.count()
ArrayList<String> array = new ArrayList<>();
array.add("aaaa");
array.add("bbbb");
array.add("cccc");
Long count = array.stream()
.filter(s -> s.equals("aaaa")).count();
Kotlin Java
SAM変換
・Single Abstract Method 変換
・Java で定義した interfaceにしかSAM 変換は、適用できませ
ん。
・Kotlin で定義した interface に SAM 変換は効きません。
SAM変換
view.setOnClickListener {
Log.d("debug", "onClick")
}
view.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("debug", "onClick")
}
});
// Java8 Lambda
view.setOnClickListener(v -> {
Log.d("debug", "onClick")
});
Kotlin Java
SAM変換
Kotlin
interface OnClickListener {
fun onClick(view: View)
}
// compile error
// val listener: OnClickListener = {
// Log.d("debug", "onCick")
// }
val listener: OnClickListener = object: OnClickListener {
override fun onClick(view: View) {
Log.d("debug", "onCick")
}
}
class Test {
var onClickListener: ((view: View) -> Unit)? = { view ->
Log.d("debug", "onClick")
}
fun test() {
onClickListener?.invoke(View(context))
}
}
SAM変換
Kotlin
TypeAlias、Extension、スコープ関数
・TypeAliasは、既存の型や関数リテラル(匿名関数/無名関数)に
別名をつけるための機能です。
・Extension(= 拡張関数)は、継承無しでクラスを拡張するための
機能です。
TypeAlias、Extension、スコープ関数(型の別名)
Kotlin
typealias Centimeter = Int
typealias Kilogram = Int
class Man {
var height: Centimeter = 0
var weight: Kilogram = 0
}
TypeAlias、Extension、スコープ関数(関数の別名)
Kotlin
var onClickListener: ((view: View) -> Unit)? = { view ->
Log.d("debug", "onClick")
}
fun test() {
onClickListener?.invoke(View(context))
}
typealias OnClickListener = (view: View) -> Unit
val listener: OnClickListener = { view ->
Log.d("debug", "onClick")
}
fun test() {
listener.invoke(View(context))
}
TypeAlias、Extension、スコープ関数(Extension)
Kotlin
fun Date.formatShort(): String {
val formatString = “m月d日”
return SimpleDateFormat(formatString, Locale.getDefault()).format(this)
}
fun Date.formatLong(): String {
val formatString = “y年m月d日”
return SimpleDateFormat(formatString, Locale.getDefault()).format(this)
}
Date().formatShort() // 7月1日
TypeAlias、Extension、スコープ関数(apply)
Kotlin
val webview = WebView(context).apply {
settings.apply {
javaScriptEnabled = true
setGeolocationEnabled(true)
setSupportZoom(true)
useWideViewPort = true
}
}
・apply は渡されたレシーバーを返します
TypeAlias、Extension、スコープ関数(let)
Kotlin
val doubleLength = text?.let { it.length * 2 } ?: 0
・let は実行された関数の結果を返します
・あと、with とか also とかがありますが、使いみちが
わかってないです。
Java混在で開発する時
・Kotlin の実装を Java で呼び出すときは、Annotation を使いま
しょう。
・Java の実装を Kotlin で呼び出すときは、省略表記活用しましょ
う。
・Android で Annotation を活用する Java のライブラリ(Dagger2
とか Databinding) 使うなら Kapt を有効にしましょう
Java混在で開発する時(java から呼び出す)
class ClassA {
var hoge: String = ""
@JvmOverloads
fun bar(arg0: String = "", arg1: Int = 0, arg2:
Int = 0) { //NOP
}
companion object {
@JvmField
var foo: String = ""
@JvmStatic
fun test() { //NOP
}
}
}
ClassA classA = new ClassA();
// メンバはこう見えます
String hoge = classA.getHoge();
classA.setHoge(hoge);
// JvmOverloadsはこう見えます
classA.bar();
classA.bar("a");
classA.bar("a", 2);
classA.bar("a", 2, 3);
// JvmFieldはこう見えます
String foo = ClassA.foo;
// JvmStaticはこう見えます
ClassA.test();
ClassA.Companion.test();
Kotlin Java
public class ClassB {
private String mFoo = "";
public void setFoo(String value) {
mFoo = value;
}
public String getFoo() {
return mFoo;
}
}
val classB = ClassB()
classB.foo = "test"
print(classB.foo)
Java混在で開発する時(kotlin から呼び出す)
Kotlin Java
さいごに
Kotlin入門までの助走読本
https://drive.google.com/file/d/0Bylpznm149-gTG
RjOFRkWm9PODg/view
Try Kotlin
https://try.kotlinlang.org/

Contenu connexe

Tendances

Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.specKent Ohashi
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】株式会社ランチェスター
 
From Java To Clojure
From Java To ClojureFrom Java To Clojure
From Java To ClojureKent Ohashi
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Mr. Vengineer
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.specKent Ohashi
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerlShunsuke Maeda
 
Clojure REPL: The Good Parts
Clojure REPL: The Good PartsClojure REPL: The Good Parts
Clojure REPL: The Good PartsKent Ohashi
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorialkocha2012
 
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSLClojureで作る"simple"なDSL
Clojureで作る"simple"なDSLKent Ohashi
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3DKouji Hosoda
 
2017年夏のPerl
2017年夏のPerl2017年夏のPerl
2017年夏のPerlcharsbar
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122nothingcosmos
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGParsfumokmm
 

Tendances (20)

Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
PHP language update 201211
PHP language update 201211PHP language update 201211
PHP language update 201211
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
GraphQL入門
GraphQL入門GraphQL入門
GraphQL入門
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
 
Go guide for Java programmer
Go guide for Java programmerGo guide for Java programmer
Go guide for Java programmer
 
From Java To Clojure
From Java To ClojureFrom Java To Clojure
From Java To Clojure
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
From JS To CLJS
From JS To CLJSFrom JS To CLJS
From JS To CLJS
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.spec
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerl
 
Clojure REPL: The Good Parts
Clojure REPL: The Good PartsClojure REPL: The Good Parts
Clojure REPL: The Good Parts
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorial
 
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSLClojureで作る"simple"なDSL
Clojureで作る"simple"なDSL
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
2017年夏のPerl
2017年夏のPerl2017年夏のPerl
2017年夏のPerl
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 

Similaire à Kotlin勉強会 in ehime

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyYasuharu Nakano
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語gypsygypsy
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
B lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめB lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめShinichi Hirauchi
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うTatsumi Naganuma
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)tnoda
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるMasashi Haga
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてkimukou_26 Kimukou
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compilernothingcosmos
 

Similaire à Kotlin勉強会 in ehime (20)

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
B lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめB lack jumbodog 運転と改造のすすめ
B lack jumbodog 運転と改造のすすめ
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべる
 
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用についてLayout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用について
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
 

Plus de Eigoro Yamamura

コストエクスプローラーをつかいこなそう
コストエクスプローラーをつかいこなそうコストエクスプローラーをつかいこなそう
コストエクスプローラーをつかいこなそうEigoro Yamamura
 
はじめてのクラウドサーバー AWSとGCEを使い比べてみた
はじめてのクラウドサーバー AWSとGCEを使い比べてみたはじめてのクラウドサーバー AWSとGCEを使い比べてみた
はじめてのクラウドサーバー AWSとGCEを使い比べてみたEigoro Yamamura
 
Twitter bootstrapのススメ
Twitter bootstrapのススメTwitter bootstrapのススメ
Twitter bootstrapのススメEigoro Yamamura
 
CMSについておさらいしてみよう
CMSについておさらいしてみようCMSについておさらいしてみよう
CMSについておさらいしてみようEigoro Yamamura
 
すだちハッカソン発表資料
すだちハッカソン発表資料すだちハッカソン発表資料
すだちハッカソン発表資料Eigoro Yamamura
 
すごいぞ!Google Chrome
すごいぞ!Google Chromeすごいぞ!Google Chrome
すごいぞ!Google ChromeEigoro Yamamura
 
プログラマがWebデザインについて考えてみた
プログラマがWebデザインについて考えてみたプログラマがWebデザインについて考えてみた
プログラマがWebデザインについて考えてみたEigoro Yamamura
 
「LESS」ことはじめ
「LESS」ことはじめ「LESS」ことはじめ
「LESS」ことはじめEigoro Yamamura
 
よんでよんでよまれてよんで
よんでよんでよまれてよんでよんでよんでよまれてよんで
よんでよんでよまれてよんでEigoro Yamamura
 

Plus de Eigoro Yamamura (9)

コストエクスプローラーをつかいこなそう
コストエクスプローラーをつかいこなそうコストエクスプローラーをつかいこなそう
コストエクスプローラーをつかいこなそう
 
はじめてのクラウドサーバー AWSとGCEを使い比べてみた
はじめてのクラウドサーバー AWSとGCEを使い比べてみたはじめてのクラウドサーバー AWSとGCEを使い比べてみた
はじめてのクラウドサーバー AWSとGCEを使い比べてみた
 
Twitter bootstrapのススメ
Twitter bootstrapのススメTwitter bootstrapのススメ
Twitter bootstrapのススメ
 
CMSについておさらいしてみよう
CMSについておさらいしてみようCMSについておさらいしてみよう
CMSについておさらいしてみよう
 
すだちハッカソン発表資料
すだちハッカソン発表資料すだちハッカソン発表資料
すだちハッカソン発表資料
 
すごいぞ!Google Chrome
すごいぞ!Google Chromeすごいぞ!Google Chrome
すごいぞ!Google Chrome
 
プログラマがWebデザインについて考えてみた
プログラマがWebデザインについて考えてみたプログラマがWebデザインについて考えてみた
プログラマがWebデザインについて考えてみた
 
「LESS」ことはじめ
「LESS」ことはじめ「LESS」ことはじめ
「LESS」ことはじめ
 
よんでよんでよまれてよんで
よんでよんでよまれてよんでよんでよんでよまれてよんで
よんでよんでよまれてよんで
 

Kotlin勉強会 in ehime