20090911 seasar conference2009 autumn
DESCRIPTION
Seasar Conference2009 Autumn Javaプログラマに捧げるScala入門TRANSCRIPT
![Page 1: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/1.jpg)
Javaプログラマに
捧げる
Scala入門Seasar Conference 2009 Autumn
2009年9月12日土曜日
![Page 2: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/2.jpg)
自己紹介
ID:yuroyoroゆろよろ
2009年9月12日土曜日
![Page 3: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/3.jpg)
自己紹介
• 尾崎 智仁(ゆろよろ)
• ID:yuroyoro(はてな、twitter、wassr)
• フリーエンジニア
• JavaとかScalaとかpythonとか
2009年9月12日土曜日
![Page 4: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/4.jpg)
好きなキャラに脳内で変換して
聞いてください・・・
2009年9月12日土曜日
![Page 5: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/5.jpg)
それでは・・・
2009年9月12日土曜日
![Page 6: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/6.jpg)
質問たーいむ!!
2009年9月12日土曜日
![Page 7: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/7.jpg)
Q.Scala本読みました?
2009年9月12日土曜日
![Page 8: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/8.jpg)
今日の内容
•scalaの紹介!
•デモ2連発っ!
•言語仕様弾丸ツアー!
•まとめっ!2009年9月12日土曜日
![Page 9: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/9.jpg)
scalaの紹介!
2009年9月12日土曜日
![Page 10: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/10.jpg)
Q.scalaってなに?
2009年9月12日土曜日
![Page 11: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/11.jpg)
A.幼女です
(id: kumajet)2009年9月12日土曜日
![Page 12: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/12.jpg)
みんな大好きついったーもscalaで動いてます
2009年9月12日土曜日
![Page 13: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/13.jpg)
すからたんが“変態Post”を
処理してると思うと萌えますね?
2009年9月12日土曜日
![Page 14: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/14.jpg)
• jvmで動きます!
•オブジェクト指向 + 関数型
•ファーストクラス関数
•静的型付け + 型推論
•Javaとの相互運用
scalaの特徴
2009年9月12日土曜日
![Page 15: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/15.jpg)
•インタプリタで動作確認が
できる!
•型推論で簡潔なコード
•でも静的型付け言語
scalaの気持ちいいところ
2009年9月12日土曜日
![Page 16: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/16.jpg)
•クロージャ + 充実したコレ
クションライブラリ
•Object,traitで進化したオ
ブジェクト指向
scalaの気持ちいいところ
2009年9月12日土曜日
![Page 17: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/17.jpg)
case class UserTimeline( maxId:Long )
object UserTimelineActor extends Actor{ import Main._
def act = { var cnt:Long = 0 loop{ react{ case UserTimeline( maxId ) => getUserTimeline( maxId ) match { case (xml:Node , nextMaxId:Long ) => outputter.add( xml ) cnt += 200 Thread.sleep(interval) this ! UserTimeline( nextMaxId - 1) case _ => outputter.close exit } } }
scalaのソース(例)
2009年9月12日土曜日
![Page 18: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/18.jpg)
2009年9月12日土曜日
![Page 19: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/19.jpg)
ちょwwwイwwミwwフwwwなにwwwこれww
2009年9月12日土曜日
![Page 20: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/20.jpg)
Scalaは業務では使えない?
2009年9月12日土曜日
![Page 21: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/21.jpg)
No!!2009年9月12日土曜日
![Page 22: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/22.jpg)
今から実証
してやんよ!
2009年9月12日土曜日
![Page 23: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/23.jpg)
デモっ!
2009年9月12日土曜日
![Page 24: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/24.jpg)
demo その1
•scalaで簡単なスクリプトを書いてみる!
•twitter検索でs2conのハッシュタグを検索
•目標5分!
2009年9月12日土曜日
![Page 25: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/25.jpg)
demo その2
•S2Console!•Seasarプロダクトをインタプリタで動作確認
•LLフレームワークの対話環境をJavaにも!
2009年9月12日土曜日
![Page 26: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/26.jpg)
Scala言語仕様弾丸ツアー!
2009年9月12日土曜日
![Page 27: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/27.jpg)
インタプリタで動作を
確認してみよう!
2009年9月12日土曜日
![Page 28: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/28.jpg)
基本編
2009年9月12日土曜日
![Page 29: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/29.jpg)
変数(var,val)
• var/valで変数を宣言• var 変数名:型 = 値• varは変更可能、valは変更不可(final)
2009年9月12日土曜日
![Page 30: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/30.jpg)
変数(var,val)
scala> val i:Int = 1i: Int = 1scala> i = 2<console>:13: error: reassignment to val i = 2 ^scala> var j = 10j: Int = 10scala> j = 20j: Int = 20
varは代入可能
valは再代入できない変数(javaのfinal)
代入しようとするとエラー
2009年9月12日土曜日
![Page 31: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/31.jpg)
型推論
•変数、関数の戻り値は省略可能
•コンパイラーが推論する•型パラメータも含めて推論•関数の引数は省略できない
2009年9月12日土曜日
![Page 32: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/32.jpg)
scala> val list:List[Int] = List(1,2,3,4)
list: List[Int] = List(1, 2, 3, 4)
scala> val list = List(1,2,3,4)
list: List[Int] = List(1, 2, 3, 4)
scala> val a = List(1,2,3).map( _.toString )(0)
a: java.lang.String = 1
省略!
省略できる
関数の戻り値から推論!
型推論
2009年9月12日土曜日
![Page 33: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/33.jpg)
if文
• if/else文は値を返す• ifの条件はBoolean• elseが無い場合は値を返さない(Unit型が結果となる)
• if文の結果を変数に代入できる(三項演算子的な)
2009年9月12日土曜日
![Page 34: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/34.jpg)
scala> val s = "abcdef"s: java.lang.String = abcdef
scala> if( s.startsWith("abc") ) s.length else 0res4: Int = 6
scala> val r = if(s.length > 1) s.substring(1) else ""r: java.lang.String = bcdef
Int型が返る
条件は(Boolean)
if文
結果を代入!
2009年9月12日土曜日
![Page 35: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/35.jpg)
for式によるループ
• for式でコレクションの反復処理(javaの拡張forに相当)
• for( 変数 <- コレクション) { ... }• コレクション生成 - for( 変数 <- コレクション) yield { ... }
• フィルター - for ( n <- 1 to 10 ; if n % 2 == 0) yield { ... }
• break/continueはない! (2.8で実装)2009年9月12日土曜日
![Page 36: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/36.jpg)
scala> for( n <- 1 to 10 if n %2 == 0 ){ print(n * 2 + ",") }4,8,12,16,20,
scala> val g = for( s <- List("a","b","c"); l = s.length )yield { s + ":" + l }g: List[java.lang.String] = List(a:1, b:1, c:1)
1から10のなかで偶数のみ
for式によるループ
結果を代入!
2009年9月12日土曜日
![Page 37: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/37.jpg)
関数編
2009年9月12日土曜日
![Page 38: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/38.jpg)
関数
def countChar ( s:String, c:Char ) : Int = {
var cnt:Int = 0
for( ct <- st if ct == c) {
cnt += 1
}
cnt
}
戻り値の型
関数名
引数仮引数:型
defで関数定義
最後に評価された値が戻り値
2009年9月12日土曜日
![Page 39: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/39.jpg)
• def 関数名( 引数 ): 結果型 = { ... }• val f = 関数名 _ で関数オブジェクト• 関数リテラル - 無名関数的な
関数
val f = (x:Int,y:Int) => { x + y }
• 関数リテラルでは _ で引数のプレースホルダ
引数仮引数:型
本体
2009年9月12日土曜日
![Page 40: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/40.jpg)
scala> def isEven(i:Int):Boolean = { return ( i % 2 == 0 ) } isEven: (Int)Boolean
scala> def isEven(i:Int) = i % 2 == 0isEven: (Int)Boolean
scala> val func = isEven _func: (Int) => Boolean = <function>
scala> val f = (i:Int) => i % 2 == 0f: (Int) => Boolean = <function>
省略!
Javaっぽく書くとこんな感じ
関数をオブジェクトとして変数に
代入!
関数リテラル!
関数
2009年9月12日土曜日
![Page 41: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/41.jpg)
カリー化と部分適用
• def hoge(i:Int)(j:Int) = i + j•引数を()で分けるとカリー化• hoge( 1 )(_:Int)•引数に_を指定して関数を部分適用
2009年9月12日土曜日
![Page 42: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/42.jpg)
scala> def add(n:Int)(m:Int)=n+madd: (n: Int)(m: Int)Int
scala> val add3 = add( 3 ) _add3: (Int) => Int = <function>
scala> def curryingAdd( n:Int ) = add( n ) _curryingAdd: (Int)(Int) => Int
カリー化っ!!
カリー化された”関数”を返す関数
カリー化と部分適用
“_”で部分適用!
2009年9月12日土曜日
![Page 43: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/43.jpg)
ネスト関数とクロージャ
•関数は入れ子(ネスト)にできる!
•関数の外側の変数(自由変数)を参照できる
•自由変数への参照を実行時に取り込む (クロージャ )
2009年9月12日土曜日
![Page 44: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/44.jpg)
def outer ( i:Int, s:String ) = {
val v:String = s + ":" + i
def inner( p:String ) = p + v
inner _
}
入れ子の関数から外側の変数
を参照
自由変数Vを取り込んだinner関数オブジェクト
を返す
ネスト関数とクロージャ
scala> val inf = outer( 5, "hoge" )inf: (String) => java.lang.String = <function>scala> inf("foo - ")res2: java.lang.String = foo - hoge:5
2009年9月12日土曜日
![Page 45: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/45.jpg)
• scalaのコレクションは引数に関数を取るものが多い
• map,filter,foreach,exist ...•柔軟なコレクションの操作• List,Map,Setなど
コレクションに関数を
2009年9月12日土曜日
![Page 46: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/46.jpg)
scala> val list = List(1,2,3,4)res1: List[Int] = List(1, 2, 3, 4)
scala> list.map( {(n:Int) => n * 2} )res2: List[Int] = List(2, 4, 6, 8)
scala> list.filter( _ % 2 == 0 )res3: List[Int] = List(2, 4)
scala> list.filter( func ) res4: List[Int] = List(2, 4)
偶数の要素を抽出
map操作関数リテラルで各要素を2倍
関数オブジェクトを引数に渡す!
コレクションに関数を
2009年9月12日土曜日
![Page 47: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/47.jpg)
クラス編
2009年9月12日土曜日
![Page 48: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/48.jpg)
• class <クラス名>(コンストラクタ引数)• objectでシングルトン定義• ネスト classの中にclassやobject• staticがないscalaでは、コンパニオンオブジェクトを利用する
• 同一スコープに同じ名前のclassとobjectがあると特権的な アクセス権
ObjectFoo
classFoo
privateへのアクセス
クラスとオブジェクト
2009年9月12日土曜日
![Page 49: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/49.jpg)
クラスとオブジェクト
class Foo ( s:String, i:Int ) {
val p1:String = s
var p2:Int = i
private var p3 = 1
def hoge = s * p3
}
object Foo {
val aaa ="aaa"
def setP3( foo:Foo, i:Int) = foo.p3 = i
}
フィールドvalは変更不可varは変更化
クラス名コンストラクタ引数
classでclass定義
関数objectでSingletonobject 同一クラス名の
クラスのprivateフィールドにアクセスできる
2009年9月12日土曜日
![Page 50: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/50.jpg)
• trait は実装をもてるinterface• classやobjectに複数のtraitをMix-In• trait の中で実装を持たないメンバはabstract
traitとmixin
classFoo
traitBar
traitBaz
BarとBazから実装を
継承
2009年9月12日土曜日
![Page 51: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/51.jpg)
traitとmixin
trait Bar {
val bs:String = "Bar"
def bar( n:Int ) = bs * n
}
trait Baz { def baz( n:Int ) = "Baz" * n }
class Foo extends Bar with Baz
traitはフィールド関数をもてる
trait名traitでtrait定義
withで複数のtraitをmixin
2009年9月12日土曜日
![Page 52: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/52.jpg)
• case class <クラス名>(コンストラクタ引数)
• case class は名前(...)でインスタンス生成( immutable object)
• case クラスはパターンとして使える• matchはswitchの強力なやつ• 値 match { case パターン => 処理 ...}• パターン には、値/型/caseクラスを指定
caseクラスとパターンマッチ
2009年9月12日土曜日
![Page 53: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/53.jpg)
abstract class Pt
case class CC(s:String) extends Pt
case class DD(i:Int ,s:String) extends Pt
def test(p:Pt) = p match {
case CC( s ) => println( s )
case DD( 3 ,_) => println(“match DD”)
}
case class定義
抽象クラス
matchしたcase classの値を利用
caseクラスとパターンマッチ
case classをパターンとして
match
2009年9月12日土曜日
![Page 54: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/54.jpg)
他にも変態的な言語仕様が盛りだくさん
ExtractorImplicit conversion
Structural typing
Lazy value
Partial Function
XMLリテラル
Implicitparameter
Existential type
Specialized annotation
2009年9月12日土曜日
![Page 55: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/55.jpg)
• implicit conversion - 暗黙の型変換( StringからDoubleに自動変換etc)
• implict parameter- 型による自動判別を行うデフォルト引数
• structual typing- type safeなダックタイピング
• lazy value- 遅延評価
ちょっとだけよ・・・
2009年9月12日土曜日
![Page 56: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/56.jpg)
• XMLリテラル- xmlをリテラルで評価
• 共変/反変なGenerics- Array[String]はArray[Any]のサブクラス
• actorライブラリ- mesage base非同期処理
• Lift web framework- 関数型webフレームワーク
ちょっとだけよ・・・
2009年9月12日土曜日
![Page 57: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/57.jpg)
まとめっ!
2009年9月12日土曜日
![Page 58: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/58.jpg)
フリーダムすぐる
言語仕様を楽しめ!!
2009年9月12日土曜日
![Page 59: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/59.jpg)
JavaとLLの融合!!
2009年9月12日土曜日
![Page 60: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/60.jpg)
進化したオブジェクト指向でJavaの常識を破壊せよ!!
2009年9月12日土曜日
![Page 61: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/61.jpg)
関数型言語の概念を加えた次世代の
プログラミングパラダイム!!
2009年9月12日土曜日
![Page 62: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/62.jpg)
情報源
•公式サイトhttp://www.scala-lang.org/
• Scala 東北https://sites.google.com/site/scalatohoku/
• Scala-behttp://groups.google.co.jp/group/scala-be
•Programming in Scalahttp://www.amazon.co.jp/Programming-Scala-Comprehensive-Step-step/dp/0981531601
2009年9月12日土曜日
![Page 63: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/63.jpg)
Have fun with
Scala !!
2009年9月12日土曜日
![Page 64: 20090911 Seasar Conference2009 Autumn](https://reader036.vdocuments.us/reader036/viewer/2022062709/559223391a28abb1068b4682/html5/thumbnails/64.jpg)
ご清聴ありがとうございました!
2009年9月12日土曜日