よーく(@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と同等のパフォーマンス
    ◦ コンパイル時のチェック
Requestとか
                    LiftFilter

主に作成する部分
             View
                テンプレート
                          画面中のコンポーネントの
                          レンダリング

Boot.scala          Snippet
                          データアクセス

                     Model
   ページを構成するコンポーネントの見た目
    ◦ 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>        lift:Snippetのクラス名.メソッド名
 </div>
</body>
 コンポーネントの動的な部分のレンダリング
 Scalaで記述
 テンプレートのタグに処理を流し込む
    ◦ LiftではScalaのXMLリテラルとしてテンプレートを
      扱い、Snippetを処理している
    ◦ なので、Snippetのメソッドの戻り値型はNodeSeq
     XMLノードのシーケンスの型
Template(抜粋)
<span class="lift:HelloWorld.howdy">
   <span id="time">Time goes here</span>
</span>                        id=“time”のタグの内
                               容を#>の右辺で置き
Snippet                        換えますヨ!
class HelloWorld {
   def howdy = "#time *" #> "9:02pm"
}
Template(抜粋)
<span class="lift:HelloWorld.howdy">
   <span id="time">Time goes here</span>
</span>

Snippet
class HelloWorld {
   def howdy = "#time *" #> “9:02pm”
}
Template(レンダリング後)
<span class="lift:HelloWorld.howdy">
   <span id="time">9:02pm</span>
</span>
   イベントに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(""))
                               nameにセットする
def form = {                   無名関数
     "#txtbox *" #> SHtml.text(name.openOr(""),
        v => name(Full(v))) &
     "#submit *" #> SHtml.submit("Send",
        () => {println(name.openOr(""))})
  }
object name extends RequestVar(Full(""))
                             nameの中身を取り出し、
def form = {                 コンソールに出力する
                             無名関数
     "#txtbox *" #> SHtml.text(name.openOr(""),
        v => name(Full(v))) &
     "#submit *" #> SHtml.submit("Send",
        () => {println(name.openOr(""))})
  }
<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/
ご清聴ありがとうございました!

ScaLa+Liftとか