21
よーく(@youku_s)

ScaLa+Liftとか

  • Upload
    youku

  • View
    2.300

  • Download
    3

Embed Size (px)

Citation preview

よーく(@youku_s)

HN:よーく(@youku_s) 新社会人初心者丸出しプログラマ

仕事で使っている(た)もの:

VB.NET, Java

最近興味があるもの:

Scala, C++, HaskeLL, 離散数学,

幸せになるための方法全般, TRPG, etc…

関数型+オブジェクト指向の静的型付け言語

Javaとの互換性がある

Twitterとかで使われてる

便利な機能がたくさん ◦型推論

◦パターンマッチ

◦高階関数+無名関数

◦ immutableなコレクションの操作

◦ Option/Either型(nuLL とか絶対おかしいよ!)

初心者(僕のことです)的にうれしいところ ◦段階的にパラダイムや機能を導入できる柔軟性

◦ とりあえず短く書ける

関数型脳欲しい(;ω;)

Scalaちゃん可愛い! ◦ http://twitter.com/#!/scalachan

◦眼鏡掛けたい(褒め言葉)

とりあえずこの本を読みましょう!

フルスタックなWebフレームワーク ◦ foursquareとかSiemensで使われてるっぽい

特徴 ◦ Viewを前面に出したアーキテクチャ

◦ Function Mappingによるイベントの記述

formのsubmit処理

Ajaxの実行とか

◦ Cometのサポート

◦脆弱性への対応

◦設定はScala/DSLで記述

シンプルに書ける

他言語を同時に扱う量が減る ◦ XML

◦ JavaScript

Scalaの強みを生かせる ◦並列処理との親和性

Comet、並列レンダリング…

◦ Javaと同等のパフォーマンス

◦ コンパイル時のチェック

Boot.scala Snippet

Model

テンプレート

画面中のコンポーネントの

レンダリング

データアクセス

View 主に作成する部分

LiftFilter Requestとか

ページを構成するコンポーネントの見た目 ◦ HTMLで記述

レンダリングロジックは直接記述しない ◦動的な部分はSnippetのメソッドへ分離

Snippetによるレンダリング適用位置の指定 ◦ タグのclass属性、接頭語lift:を用いたタグを使用

◦ HTMLとして単体で見た目を確認できる

<body class="lift:content_id=main">

<div id="main"class="lift:surround?with=default;at=content">

<h2>Welcome to your project!</h2>

<p>

<span class="lift:HelloWorld.howdy">

<span id="time">Time goes here</span>

</span>

</p>

</div>

</body>

lift:Snippetのクラス名.メソッド名

コンポーネントの動的な部分のレンダリング

Scalaで記述

テンプレートのタグに処理を流し込む ◦ LiftではScalaのXMLリテラルとしてテンプレートを扱い、Snippetを処理している

◦ なので、Snippetのメソッドの戻り値型はNodeSeq

XMLノードのシーケンスの型

class HelloWorld {

def howdy = "#time *" #> "9:02pm"

}

Snippet

<span class="lift:HelloWorld.howdy">

<span id="time">Time goes here</span>

</span>

Template(抜粋)

id=“time”のタグの内容を#>の右辺で置き換えますヨ!

class HelloWorld {

def howdy = "#time *" #> “9:02pm”

}

Snippet

<span class="lift:HelloWorld.howdy">

<span id="time">Time goes here</span>

</span>

Template(抜粋)

<span class="lift:HelloWorld.howdy">

<span id="time">9:02pm</span>

</span>

Template(レンダリング後)

イベントにGUIDを割り当てる ◦ RequestでGUIDを受け取ると、対応する関数オブジェクトがサーバ側で実行される

◦ JavaScriptを生成してテンプレートに注入する関数オブジェクトを与えるとAjaxを記述できる

GUIDはセッション固有

object name extends RequestVar(Full(""))

def form = {

"#txtbox *" #> SHtml.text(name.openOr(""),

v => name(Full(v))) &

"#submit *" #> SHtml.submit("Send",

() => {println(name.openOr(""))})

}

object name extends RequestVar(Full(""))

def form = {

"#txtbox *" #> SHtml.text(name.openOr(""),

v => name(Full(v))) &

"#submit *" #> SHtml.submit("Send",

() => {println(name.openOr(""))})

}

入力文字列を受け取り、nameにセットする 無名関数

object name extends RequestVar(Full(""))

def form = {

"#txtbox *" #> SHtml.text(name.openOr(""),

v => name(Full(v))) &

"#submit *" #> SHtml.submit("Send",

() => {println(name.openOr(""))})

}

nameの中身を取り出し、コンソールに出力する 無名関数

<form method="POST">

<div id="txtbox">

<input value="" name="F1213629648567AELZKU"

type="text">

</div>

<div id="submit">

<input type="submit" name="F1213629748568P2ZWC0"

value="Send">

</div>

</form>

Scala実践プログラミング

Scala+Liftによる実践Webアプリケーション開発 ◦ http://codezine.jp/article/corner/322

Exploring Lift ◦ http://exploring.liftweb.net/

Lift Wiki ◦ http://www.assembla.com/wiki/show/liftweb/

ご清聴ありがとうございました!