Upload
tomohito-ozaki
View
1.584
Download
1
Tags:
Embed Size (px)
Citation preview
scala/Lifton
GAE/J
BP Study #22
2009年6月28日日曜日
自己紹介
• 尾崎 智仁( ゆろよろ)
• ID:yuroyoro(はてな、twitter、wassr)
• フリーエンジニア
• JavaとかScalaとかpythonとか
2009年6月28日日曜日
コミュニティ
• java-ja (自重しません)
• wicket-ja (wicketイカス)
• django-ja (最近です)
• j iemamy project
• shibuya-trac (p lugin書いたり)
• scalaユーザー会2009年6月28日日曜日
はじめに・・・
2009年6月28日日曜日
遅刻しちゃってゴメンナサイ・・・
2009年6月28日日曜日
今日の話は・・・
2009年6月28日日曜日
GAE/Jってなに?みたいな話じゃありません
2009年6月28日日曜日
今日の話は・・・
2009年6月28日日曜日
スライドいっぱいあるけどさらっと流します。
ちょwwwおまwww
2009年6月28日日曜日
今日の話は・・・
2009年6月28日日曜日
好きなキャラに脳内で変換して
聞いてください・・・
2009年6月28日日曜日
質問たーいむ!!
2009年6月28日日曜日
お客様の中にどなたか
scalaのコードを書いたことが
ある方はいらっしゃいませんか?
2009年6月28日日曜日
scalaはもっと普及
すべきである
2009年6月28日日曜日
今日の内容
•GAE/JでのLift
•scalaの紹介!
•Liftの紹介っ!
•ざっくりアーキテクチャ!
•デモっ!
•まとめっ!2009年6月28日日曜日
GAE/JでのLift
2009年6月28日日曜日
war
GAE/J
JVM
scalaがGAE/Jで動く訳
scalaのソースをコンパイルするとclassファイルが生成される
deploy
コンパイル
.scala.scala
.scala.class
classファイルなのでそのまま動く!
scalaLibrary.jar
war
.scala.class
scalaLibrary.jar
2009年6月28日日曜日
GAE/JでのLift
• mavenでproject作成
•JPAが使える(JDOも)
• SDK内のdatanucleus-
enhancerを1.1.3に差し替える
•Deployすればフツーに動く
2009年6月28日日曜日
いまうごいてるやつ
• Liftで書いたTropyクローン
2009年6月28日日曜日
GAE/Jの話は終わりです。
2009年6月28日日曜日
scalaってどんな言語?
2009年6月28日日曜日
scalaの特徴
• jvmで動きます!
•オブジェクト指向 + 関数型
•ファーストクラス関数
•静的型付け + 型推論
•Javaとの相互運用
2009年6月28日日曜日
scalaの特徴
•作者:Martin Odersky
• caseクラス、パターンマッチ
• XMLリテラル
• Actorライブラリ
•DSLとしてのscala
2009年6月28日日曜日
ちょっとしたscalaのDEMO
2009年6月28日日曜日
インタプリタで動作を
確認してみよう!
2009年6月28日日曜日
型推論
scala>vallist:List[Int]=List(1,2,3,4)
list:List[Int]=List(1,2,3,4)
scala>vallist=List(1,2,3,4)
list:List[Int]=List(1,2,3,4) 省略!
省略できる
2009年6月28日日曜日
関数オブジェクト
scala>defisEven(i:Int):Boolean={return(i%2==0)}isEven:(Int)Boolean
scala>defisEven(i:Int)=i%2==0isEven:(Int)Boolean
scala>valfunc=isEven_func:(Int)=>Boolean=<function>
省略!
Javaっぽく書くとこんな感じ
関数をオブジェクトとして変数に
代入!
2009年6月28日日曜日
高階関数とカリー化
scala>defadd(n:Int)(m:Int)=n+madd:(n:Int)(m:Int)Int
scala>valadd3=add(3)_add3:(Int)=>Int=<function>
scala>defcurryingAdd(n:Int)=add(n)_curryingAdd:(Int)(Int)=>Int
カリー化っ!!
カリー化された”関数”を返す関数
2009年6月28日日曜日
Listの操作
scala>l.map({(n:Int)=>n*2})res1:List[Int]=List(2,4,6,8)
scala>list.filter(_%2==0)res2:List[Int]=List(2,4)
scala>list.filter(func)res3:List[Int]=List(2,4)
偶数の要素を抽出
map操作無名関数で各要素を2倍
関数オブジェクトを引数に渡す!
2009年6月28日日曜日
パターンマッチ
deftest[T](list:List[T])=listmatch{case1::xs=>print("start1")case2::xs=>print("start2")case"Test"::xs=>print("startTest")casex::Nil=>print("oneelemnt")casex::xs=>print("start"+x)case_=>print("default")}
先頭が文字列で”Test”
Listの先頭が1の場合
要素が一つ
2009年6月28日日曜日
クラスとオブジェクト
scala>classFoo(valn:Int,vals:String){defbar=print(n+s)}definedclassFoo
scala>objectFooObj{valn=3vals="Bar"defbar=print(n+s)}definedmoduleFooObj
Singletonオブジェクト
クラス名の後にコンストラクタ
2009年6月28日日曜日
他にも変態的な言語仕様が盛りだくさん
trait
CompanionObject
ExtractorImplicit conversion
Structural typing
Lazy value
Partial Function
XMLリテラル
Implicitparameter
Existential type
Specialized annotation
2009年6月28日日曜日
Liftの紹介っ!
2009年6月28日日曜日
scala = 階段(イタリア語)
2009年6月28日日曜日
Lift = エレベータ
2009年6月28日日曜日
Functional Web Framework
Lift
2009年6月28日日曜日
Liftの特徴
•Scalaです!
•フルスタックです!
•いいとこどりしてます!
2009年6月28日日曜日
Liftの特徴
•現在のVersion 1.0
•scala 2.7.3
•Githubにソース
•チーフコミッタ David
Pollak
2009年6月28日日曜日
Liftの特徴
•Scalaの関数型言語や
型推論に加え、既存の
java資産が利用できるん
です!
2009年6月28日日曜日
Liftの特徴
•インストールやサーバ
の起動はrailsみたいに
Mavenコマンド一発。
•組み込みDB (Derby)
2009年6月28日日曜日
Liftの特徴
•設定はCocとScala
コード。XMLなし!
•SiteMapやACL
•アプリのテンプレート
2009年6月28日日曜日
Liftの特徴
•jQueryによるAjax!
•Cometを簡単に!
•各種Widgetがあるよ!
•GAE/Jでも動くよ!
2009年6月28日日曜日
ざっくりアーキテクチャ!
2009年6月28日日曜日
Liftのアーキテクチャ
Model
LiftFilter
LiftServlet
Boot
LiftRule
LiftSession
RequestState
Snippet
HTML Template
Requestを受けるfilter
URLのDispatchなどのルール
DBなどの動作環境の設定情報
Reqeustの種類(Commet,Ajax)による振り分け
Sessionを扱うRequestの処理。
RequestとResponseの情報。
XHTMLでのテンプレート
Viewへの出力やModelの操作など
KeyedMapper
KeyedMetaMapperORMでのtrait
CRUD関連処理を継承
フォームの入力値などを参照
Modelの操作
XHTMLタグでSnippetを埋め込む
URLなどからTemplateを検索
URLによる振り分け
2009年6月28日日曜日
LiftのアーキテクチャLiftはscalaで実装されたフルスタックのWebアプリケーションフレームワーク
であり近年のフレームワークのエッセンスを取り入れている。Liftのアーキテ
クチャはView Firstでありリクエストに対しての (開発者が意識すべき) コント
ローラというものは存在しない。リクエストに対してはtemplateのレンダリン
グの過程でbindされたsnipetをliftが呼び出すことで出力が行われる。snipet
は、後述するmodelを利用した動的な出力の生成などを行う。また、snipetで
出力を生成する際に、特定のHTML上のコンポーネントに対してのイベントハ
ンドラを独自に用意したFunctionオブジェクトに割り当てる(Function
Mapping)ことが可能であり、さらに、snipet自体がstateを保持することが可
能になっているおかげで、snipet=コンポーネントという形での開発スタイル
が確立されている。このようなアーキテクチャを拡張する形で、近年のwebア
プリケーション開発では必須ともいえるajaxのサポートが提供されており、
簡便なAPIで出力上のHTMLエレメントに対してのajaxイベントを特定の
functionに割り当て、動的なjavascriptやjsonを簡単に出力できる。このajax
を利用したcometを実現するsnipetも提供されており、今はすでに無きLingrの
ようなインタラクティブなwebアプリケーションを少ない行数で実現すること
が出来るのである。さらに、LiftのORMライブラリはActiveRecordを意識した
2009年6月28日日曜日
2009年6月28日日曜日
開発者がつくるもの
LiftFilter
LiftServlet
LiftRule
LiftSession
RequestState
Requestを受けるfilter
URLのDispatchなどのルール
Reqeustの種類(Commet,Ajax)による振り分け
Sessionを扱うRequestの処理。
RequestとResponseの情報。
KeyedMapper
KeyedMetaMapperORMでのtrait
CRUD関連処理を継承
フォームの入力値などを参照
Modelの操作
XHTMLタグでSnippetを埋め込む
URLなどからTemplateを検索
URLによる振り分け Model
Boot
Snippet
HTML Template
DBなどの動作環境
の設定情報
XHTMLでのテンプ
レートViewへの出力
やModelの操作
2009年6月28日日曜日
開発者がつくるもの
•設定 Boot (scala)
•テンプレート(XHTML)
• Snipet(scala)
• Model(scala)
2009年6月28日日曜日
LiftのView
2009年6月28日日曜日
LiftのView
•Snipetアプローチ
classHelloWorld{
defhowdy=<span>Welcometohelloworldat
{new_root_.java.util.Date}</span>
}
Snipet(scala)
<p><lift:helloWorld.howdy/></p>Template
2009年6月28日日曜日
LiftのView
•コントローラが中心では
なく、Viewを中心とした
アーキテクチャ
Viewsnipet model
snipet model
2009年6月28日日曜日
LiftのView
•テンプレートはXHTML。独
自の名前空間のXMLタグと
Snippetを結合!
snipetView XMLタグ
2009年6月28日日曜日
LiftのView
• Function Mapping•イベントに”関数オブジェク
ト”を動的に割り当てる!
ブラウザ class snipet{def bar(xhtml:Group):NodeSeq ={ ....}
ボタンクリックで関数を実行
レンダリング時に動的に割り当て
2009年6月28日日曜日
LiftのView
•テンプレートの例 (Form)
<lift:SampleSnipet.addform="POST">
<entry:description/>
<entry:amount/><br/>
<entry:submit/>
</lift:SampleSnipet.add>
snipetのクラス名 メソッド名
2009年6月28日日曜日
LiftのView
• Snipetの例 (Form)classSampleSnipetdefadd(xhtml:NodeSeq):NodeSeq={vardesc=""varamount="0"defprocessEntryAdd(){...}bind("entry",xhtml,"description"->SHtml.text(desc,desc=_),"amount"->SHtml.text(amount,amount=_),"submit"->SHtml.submit(Add,processEntryAdd))}}
submitされたときにprocessEntryAddメソッドを呼び出す
snipetクラス
メソッド
2009年6月28日日曜日
LiftのModel
2009年6月28日日曜日
LiftのModel
•MappingはCoC
•schemifyによる同期
•動的SQL
•(s2jdbc的な…)
•CRUDify(trait)•JPAサポート
2009年6月28日日曜日
LiftのModel
•Mapper (trait)‣ entityクラス
‣ カラムの定義
‣ crud操作 (save,update,delete)
•MetaMapper (trait)‣ sigleton、Maperのファクトリ
‣ findなどのメソッド
‣ ユーティリティ(order定義、form生成,validate…)
2009年6月28日日曜日
Database
LiftのModel
Mapper
MetaMapper
aaa bbb 1ccc ddd 2eee fff 3
1レコードに対応
テーブル単位の操作
Schemify
CoCでmapping
Insert,Update,Delete
Select
migration インスタンス生成
2009年6月28日日曜日
LiftのModel
•Mapperの例 classExpenseextendsLongKeyedMapper[Expense]withIdPK{
defgetSingleton=Expense
objectdateOfextendsMappedDateTime(this)
objectdescriptionextendsMappedString(this,100)
objectamountextendsMappedDecimal(this,
MathContext.DECIMAL64,2)
objectaccountextends
MappedLongForeignKey(this,Account)
}
KeyedMapperを継承
PK
カラムの定義(型、桁数…)
外部キーリレーション
2009年6月28日日曜日
LiftのModel
•MetaMapperの例 objectExpenseextendsExpensewithLongKeyedMetaMapper[Expense]{
overridedeffieldOrder=
List(dateOf,description,amount)
}
Mapperを継承
KeyedMetamapper
並び順(form生成など)
2009年6月28日日曜日
LiftのModel
•検索するときは…
valmyEntries1=Expense.findAll
valmyEntries2=Expense.findAll(By_>(Expense.amout,5))
valrecentEntries=Expense.findAll(
BySql("dateOf>(CURRENT_DATE-interval’30days’)",
IHaveValidatedThisSQL("dchenbecker","2008-12-03"))
全件検索
amount >5 で検索
SQLで検索
2009年6月28日日曜日
LiftのModel
• entityの操作は…varmyEntr=Expense.create
myEntry.dateOf(newDate).description("Asampleentry")
myEntry.amount(BigDecimal("127.20"))
myEntry.save
myEntry.delete
2009年6月28日日曜日
デモっ!
2009年6月28日日曜日
demo その1
• Liftの真骨頂はcometにあり!
• scalaのactorを利用したsinpet
•TwitterのTimelineを流すデモ
•ソースはGithubhttp://github.com/yuroyoro/s2condemo/tree/master
2009年6月28日日曜日
demo その2
• Lift Console!
•インタプリタで動作確認
• mvn scala:console• (new bootstrap.liftweb.Boot).boot
2009年6月28日日曜日
demo その3
• Crudfy!•ModelからCRUD画面生成
•MetaMapperにtraitをwith
2009年6月28日日曜日
まとめっ!
2009年6月28日日曜日
まとめ
• Liftはフルスタック!
• scalaのパワーをwebアプリ
ケーションへ
• Snipetアプローチ!
• ajax/cometが強み!
2009年6月28日日曜日
情報源
•公式サイトhttp://liftweb.net/
•Google Group Lifthttp://groups.google.com/group/liftweb
•The Lift bookhttp://groups.google.com/group/liftweb
2009年6月28日日曜日
Liftで関数型Webアプリケーションの
世界へ!!
2009年6月28日日曜日
ご清聴ありがとうございました!
2009年6月28日日曜日