SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
Scala + Lift で遊ぼう

             よーく(@youku_s)


    わんくま同盟 名古屋勉強会 #19
自己紹介

HN:よーく(@youku_s)
新社会人プログラマ in 名古屋

仕事で使っている(た)もの:
 VB.NET, Java

興味があるもの:
 Scala, C++, Haskell, 離散数学
 幸せになるための方法全般, TRPG, etc…




            わんくま同盟 名古屋勉強会 #19
本日の内容

• Liftについて
 – 概要
 – 機能の紹介


• Liftのプロジェクトを作ろう
 – セットアップ
 – Viewの記述方法
 – Modelの記述方法


             わんくま同盟 名古屋勉強会 #19
Scalaとは

•   関数型+オブジェクト指向の静的型付け言語
•   Javaとの互換性がある
•   Javaに比べて高機能にかつ短く書ける
•   便利な機能がたくさん
    – 型推論
    – パターンマッチ
    – 高階関数+ラムダ式
    – immutableなコレクションの操作
    – Option/Either型(null とか絶対おかしいよ!)

               わんくま同盟 名古屋勉強会 #19
詳しいことは・・・

とりあえずこの本を読めばいいと思います




       わんくま同盟 名古屋勉強会 #19
Liftについて

• フルスタックなWebフレームワーク
• 特徴
 – Viewを中心としたアーキテクチャ
 – Comet/AjaxをScalaコードだけで実現できる
 – ORMapper、NoSQLのサポート
 – 脆弱性への対応
 – 設定はScalaのコード/DSLで記述




           わんくま同盟 名古屋勉強会 #19
Viewに着目したアーキテクチャ簡略図

                               LiftFilter

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

Boot.scala                     Snippet
                                      データアクセス
             DB接続、etc
                                Model


                わんくま同盟 名古屋勉強会 #19
View First アプローチ

• View = テンプレート + Snippet
• テンプレート
  – HTML(5)/XHTMLで記述
  – ロジックはコンポーネントごとにSnippetへ分離
  – Snippetとの関連付けに特殊な記号を用いない
    • HTMLとして単体で見た目を確認できる
• Snippet
  – Scalaで記述
  – テンプレートのタグに処理を流し込む

             わんくま同盟 名古屋勉強会 #19
Comet/Ajax

• ScalaのコードだけでAjaxな処理を記述可能
  – 処理内容として関数を渡す(Function Mapping)
    • JavaScriptのコードが生成される


• Comet
  – サーバー側で発生したイベントをクライアントから
    のRequestなしに、クライアントに通知する機能
  – Scalaの並列処理機能のActorを用いて実装され
    ている


             わんくま同盟 名古屋勉強会 #19
用意するもの

• Lift 2.4M4
  – http://liftweb.net/
  – /解凍済みフォルダ/scala_29/lift_basic
     • すでにいろいろ設定されているLiftプロジェクト
     • テンプレートにHTML5を使える
• Scala 2.9.1-final
  – http://www.scala-lang.org/
• simple build tool(sbt) 0.11.0
  – https://github.com/harrah/xsbt/wiki

                 わんくま同盟 名古屋勉強会 #19
sbtについて

• Scalaで書かれたScalaの開発環境
 – 依存関係の管理、ビルド、CIっぽいこととか
• 大別して0.7.x系と0.10.x系(以降)がある
 – 互換性がほとんどない
 – 多くのプロジェクトで0.10.x系への移行が進んで
   いる…らしい
 – Lift2.4M4のデフォルトは0.7.x系
• 0.10.x系使いましょう
 – 現在(2011/10/15)最新はsbt 0.11.0

             わんくま同盟 名古屋勉強会 #19
sbtの設定 0.7.x → 0.11.0

• プロジェクトの依存関係の設定
   – build.sbt(長いので次へ)
• sbt webプラグインの設定
   – project/plugins.sbt
libraryDependencies <+= sbtVersion(v =>
"com.github.siasia" %% "xsbt-web-plugin" % (v+"-0.2.4"))

• sbtバージョンの指定
   – project/build.properties
sbt.version=0.11.0

                     わんくま同盟 名古屋勉強会 #19
プロジェクトの依存関係の設定(build.sbt)
name := “project_name"

seq(webSettings: _*)

resolvers ++= Seq(
  "Java.net Maven2 Repository" at "http://download.java.net/maven/2/",     ライブラリの入手
  "Scala Tools Snapshots" at "http://scala-tools.org/repo-snapshots",
  "Typesafe Snapshots" at "http://repo.typesafe.com/typesafe/snapshots"    元
)

libraryDependencies ++= {
  val liftVersion = "2.4-M4" // Put the current/latest lift version here
  Seq(
   "net.liftweb" %% "lift-webkit" % liftVersion % "compile->default",
   "net.liftweb" %% "lift-mapper" % liftVersion % "compile->default",
                                                                           Liftライブラリ
   "net.liftweb" %% "lift-wizard" % liftVersion % "compile->default")
}

libraryDependencies ++= Seq(
  "org.mortbay.jetty" % "jetty" % "6.1.22" % "container",
  "org.scala-tools.testing" % "specs_2.9.0" % "1.6.8" % "test",
  "junit" % "junit" % "4.8" % "test->default",
                                                                           その他のライブ
  "javax.servlet" % "servlet-api" % "2.5" % "provided->default",           ラリ群
  "com.h2database" % "h2" % "1.2.138",
  "ch.qos.logback" % "logback-classic" % "0.9.26" % "compile->default"
)                                     わんくま同盟 名古屋勉強会 #19
Liftでよく使うClass / Objectについて

• net.liftweb.http.S
  – HTTP Request/Response情報を扱う
  – セッション・Cookie管理, リダイレクト, etc
• net.liftweb.http.SHtml
  – htmlのタグを生成する
  – Ajaxコンポーネントなども扱う
• net.liftweb.http.LiftRules
  – Liftの設定を行う
  – コードのディレクトリ, jQueryの使用, etc

                 わんくま同盟 名古屋勉強会 #19
Liftでよく使うClass / Objectについて

• net.liftweb.common.Box
  – Full, Empty, Failureの三種類の値を持ちうる型
     • 有効な値が取れればFull
     • Liftの例外処理で使われている
• net.liftweb.http.RequestVar
  – Requestを受け取るためのObject
  – 継承して用いる
object name extends RequestVar("")



                  わんくま同盟 名古屋勉強会 #19
Liftプロジェクトの構成
• src/main/scala/code
   – Snippet、ModelのScalaコード
• src/main/scala/bootstrap/lift
  web
   – Boot.scala
• src/main/webapp
   – テンプレートなど
• target
   – コンパイル時に生成

わんくま同盟 名古屋勉強会 #19
Boot.scala

• メニューの設定
         – SiteMap()の要素にMenuを追加する
         – Menu(S ? ”表示名”) / ”テンプレートの相対パス”
class Boot {
 def boot {
   /* DB設定略 */

        Schemifier.schemify(true, Schemifier.infoF _, User)

        LiftRules.addToPackages("code")

        def sitemap = SiteMap(
          Menu.i("Home") / "index" >> User.AddUserMenusAfter,
          Menu(Loc("Static", Link(List("static"), true, "/static/index"), "Static Content")))
        /* HTML5、jQuery、Ajaxなどの設定 略 */
    }
}                                  わんくま同盟 名古屋勉強会 #19
Boot.scala

• Schemefier
         – 指定したModelとDBのテーブルを自動同期

class Boot {
 def boot {
   /* DB設定略 */

        Schemifier.schemify(true, Schemifier.infoF _, User)

        LiftRules.addToPackages("code")

        def sitemap = SiteMap(
          Menu.i("Home") / "index" >> User.AddUserMenusAfter,
          Menu(Loc("Static", Link(List("static"), true, "/static/index"), "Static Content")))
        /* HTML5、jQuery、Ajaxなどの設定 略 */
    }
}                                  わんくま同盟 名古屋勉強会 #19
テンプレートについて

• <body class="lift:content_id=main">
    – id=“main”を持つ要素の内容をテンプレートとして
      処理する
    – 省略すると、テンプレート全体が処理される
Template(抜粋)
<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">
     Welcome to your Lift app at <span id="time">Time goes here</span>
   </span>
  </p>
 </div>
</body>                    わんくま同盟 名古屋勉強会 #19
テンプレートについて

• <div(中略)class="lift:surround?with=default;at=content">
    – 囲まれた内容を処理し、レイアウトdefault.html
      の”content”の位置に流し込む


Template(抜粋)
<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">
     Welcome to your Lift app at <span id="time">Time goes here</span>
   </span>
  </p>
 </div>
</body>                    わんくま同盟 名古屋勉強会 #19
テンプレートについて

• <span class="lift:helloWorld.howdy">
    – 囲まれた範囲にhelloWorld Snippetのhowdyメ
      ソッドのレンダリング処理を適用する

Template(抜粋)
<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">
     Welcome to your Lift app at <span id="time">Time goes here</span>
   </span>
  </p>
 </div>
</body>                    わんくま同盟 名古屋勉強会 #19
レイアウトについて
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:lift="http://liftweb.net/">
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <meta name="description" content="" />
  <meta name="keywords" content="" />
 </head>
 <body>
  <div class="container">
    <div class="column span-6 colborder sidebar">
     <hr class="space" >
     <span class="lift:Menu.builder"></span>
     <div class="lift:Msgs?showAll=true"></div>
     <hr class="space" />
    </div>
    <div class="column span-17 last">
     <div id="content">The main content will get bound here</div>
    </div>
  </div>
 </body>
</html>                    わんくま同盟 名古屋勉強会 #19
レイアウトについて

• webapp/template-hidden以下のhtml
  – <div id="content"></div>
    • テンプレートのlift:surround at=“content”で指定した内
      容の埋め込み位置
    • <lift:bind name=“content” />でも可
  – <span class="lift:Menu.builder"></span>
    • Boot.scalaで設定したMenu Snippetを用いて、タグの
      位置にメニューを生成する
  – <div class="lift:Msgs?showAll=true"></div>
    • タグの位置にメッセージの表示を行うSnippet


                 わんくま同盟 名古屋勉強会 #19
Snippet

• メソッドが一つのコンポーネントに対応する
   – <lift:helloWorld.howdy>タグ内
   – class=”lift:helloWorld.howdy”が指定されたタグ
Template(抜粋)
<span class="lift:helloWorld.howdy">
   Welcome to your Lift app at <span id="time">Time goes here</span>
</span>

Snippet
class HelloWorld {
  lazy val date: Box[Date] = DependencyFactory.inject[Date]
  def howdy = "#time *" #> date.map(_.toString)
}
                      わんくま同盟 名古屋勉強会 #19
Snippet

• Snippetとテンプレートの関連付け
   – Helpers.bindを用いる方法
       • 割愛(こっちは資料多いし…)
   – CSSセレクタを用いる方法
       • #>演算子を使う
Snippet
def howdy = "#time *" #> date.map(_.toString)
Template(抜粋)
Welcome to your Lift app at <span id="time">Time goes here</span>
id=“time”を持つ要素の内容を左辺の文字列で置換

                       わんくま同盟 名古屋勉強会 #19
左辺                    CSSセレクタによる関連付け
記法                  意味
#hoge               id=“hoge”を持つ要素を選択する
.(ピリオド)hoge         classにhogeを含む全ての要素を選択する
attr_name=value     属性attr_nameの値がvalueである全ての要素を選択する
置換規則      例                意味
(なし)      “#hoge”          一致した全ての要素を右辺で置換
*         “#hoge *”        一致した全ての要素の内容を右辺で置換
[attr]    “#hoge [href]”   一致した全ての要素の属性attrの値を右辺で置換

右辺
• String, Box, NodeSeq, List[String], List[NodeSeq], etc
• コレクションを要素の内容に適用した場合、要素が個数分コ
  ピーされる

                           わんくま同盟 名古屋勉強会 #19
Model

• classとコンパニオンobjectの使い分け
      – スキーマ定義:class
          • traitのミックスインによってModelに機能を追加できる
              – IdPK:主キーにIdを自動で振る機能を追加するtrait
          • 属性はobject(シングルトンなオブジェクト)で定義

class TwitterId extends LongKeyedMapper[TwitterId] with IdPK {
 override def getSingleton = TwitterId

    object screenName extends MappedString(this, 100)
    object password extends MappedString(this, 100)
    object user extends MappedLongForeignKey(this, User)
}

                          わんくま同盟 名古屋勉強会 #19
Model

• classとコンパニオンobjectの使い分け
   – コンパニオンobject?
       • 同じファイル内で定義されたclassと同じ名前のobject
       • 同名クラスのprivateなメンバにアクセスできる


   – Modelへの操作、設定:コンパニオンobject
       • LongKeyedMetaMapper traitのミックスインでCURD
         操作のAPIを追加

object TwitterId extends TwitterId with LongKeyedMetaMapper[TwitterId]



                        わんくま同盟 名古屋勉強会 #19
参考

• Lift全般
  – 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/




                     わんくま同盟 名古屋勉強会 #19
参考

• sbtの設定
 – sbt – GitHub
    • https://github.com/harrah/xsbt/wiki
 – sbt徹底解説
    • http://www.slideshare.net/KenjiYoshida/scalakaigi1
      sbt
 – siasia / xsbt-web-plugin - GitHub
    • https://github.com/siasia/xsbt-web-plugin
 – lacy / lift-quickstart - GitHub
    • https://github.com/lacy/lift-quickstart

                   わんくま同盟 名古屋勉強会 #19
ご清聴ありがとうございました!




     わんくま同盟 名古屋勉強会 #19

Mais conteúdo relacionado

Mais procurados

sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策scalaconfjp
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
Angular js or_backbonejs
Angular js or_backbonejsAngular js or_backbonejs
Angular js or_backbonejsOmasa Yusaku
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理土岐 孝平
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
FIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScriptFIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScriptterurou
 
let UIWebView as WKWebView
let UIWebView as WKWebViewlet UIWebView as WKWebView
let UIWebView as WKWebViewTaketo Sano
 
Spring Fest 2018 Spring Bootで作るRESTful Web Service
Spring Fest 2018 Spring Bootで作るRESTful Web ServiceSpring Fest 2018 Spring Bootで作るRESTful Web Service
Spring Fest 2018 Spring Bootで作るRESTful Web ServiceWataruOhno
 

Mais procurados (12)

sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
HTML5最新動向
HTML5最新動向HTML5最新動向
HTML5最新動向
 
Angular js or_backbonejs
Angular js or_backbonejsAngular js or_backbonejs
Angular js or_backbonejs
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
いまさらJavaScript
いまさらJavaScriptいまさらJavaScript
いまさらJavaScript
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
FIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScriptFIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScript
 
let UIWebView as WKWebView
let UIWebView as WKWebViewlet UIWebView as WKWebView
let UIWebView as WKWebView
 
Spring Fest 2018 Spring Bootで作るRESTful Web Service
Spring Fest 2018 Spring Bootで作るRESTful Web ServiceSpring Fest 2018 Spring Bootで作るRESTful Web Service
Spring Fest 2018 Spring Bootで作るRESTful Web Service
 

Semelhante a scala+liftで遊ぼう

Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
Rails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionRails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionSatomi Tsujita
 
Pro aspnetmvc3framework chap15
Pro aspnetmvc3framework chap15Pro aspnetmvc3framework chap15
Pro aspnetmvc3framework chap15Hideki Hashizume
 
Magento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMagento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMiho Nakano
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
JavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData APIJavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData APIHajime Fujimoto
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップYasuhito Yabe
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
CMSMix Sapporo vol.3 (Drupal の回)
CMSMix Sapporo vol.3 (Drupal の回)CMSMix Sapporo vol.3 (Drupal の回)
CMSMix Sapporo vol.3 (Drupal の回)Kenji Shirane
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとかyouku
 
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発Akira Inoue
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Toshiro Shimizu
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説Akira Inoue
 

Semelhante a scala+liftで遊ぼう (20)

UnicastWS vol.2
UnicastWS vol.2UnicastWS vol.2
UnicastWS vol.2
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
Rails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3editionRails初心者レッスン lesson3 3edition
Rails初心者レッスン lesson3 3edition
 
Pro aspnetmvc3framework chap15
Pro aspnetmvc3framework chap15Pro aspnetmvc3framework chap15
Pro aspnetmvc3framework chap15
 
Magento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMagento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for Design
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
JavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData APIJavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData API
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
CMSMix Sapporo vol.3 (Drupal の回)
CMSMix Sapporo vol.3 (Drupal の回)CMSMix Sapporo vol.3 (Drupal の回)
CMSMix Sapporo vol.3 (Drupal の回)
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
 
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0Progressive Framework Vue.js 2.0
Progressive Framework Vue.js 2.0
 
Webに今求められているレベル: HTML5 コントロールを利用した開発
Webに今求められているレベル: HTML5 コントロールを利用した開発Webに今求められているレベル: HTML5 コントロールを利用した開発
Webに今求められているレベル: HTML5 コントロールを利用した開発
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
 

scala+liftで遊ぼう

  • 1. Scala + Lift で遊ぼう よーく(@youku_s) わんくま同盟 名古屋勉強会 #19
  • 2. 自己紹介 HN:よーく(@youku_s) 新社会人プログラマ in 名古屋 仕事で使っている(た)もの: VB.NET, Java 興味があるもの: Scala, C++, Haskell, 離散数学 幸せになるための方法全般, TRPG, etc… わんくま同盟 名古屋勉強会 #19
  • 3. 本日の内容 • Liftについて – 概要 – 機能の紹介 • Liftのプロジェクトを作ろう – セットアップ – Viewの記述方法 – Modelの記述方法 わんくま同盟 名古屋勉強会 #19
  • 4. Scalaとは • 関数型+オブジェクト指向の静的型付け言語 • Javaとの互換性がある • Javaに比べて高機能にかつ短く書ける • 便利な機能がたくさん – 型推論 – パターンマッチ – 高階関数+ラムダ式 – immutableなコレクションの操作 – Option/Either型(null とか絶対おかしいよ!) わんくま同盟 名古屋勉強会 #19
  • 6. Liftについて • フルスタックなWebフレームワーク • 特徴 – Viewを中心としたアーキテクチャ – Comet/AjaxをScalaコードだけで実現できる – ORMapper、NoSQLのサポート – 脆弱性への対応 – 設定はScalaのコード/DSLで記述 わんくま同盟 名古屋勉強会 #19
  • 7. Viewに着目したアーキテクチャ簡略図 LiftFilter 主に作成する部分 View テンプレート 画面中のコンポーネントの レンダリング Boot.scala Snippet データアクセス DB接続、etc Model わんくま同盟 名古屋勉強会 #19
  • 8. View First アプローチ • View = テンプレート + Snippet • テンプレート – HTML(5)/XHTMLで記述 – ロジックはコンポーネントごとにSnippetへ分離 – Snippetとの関連付けに特殊な記号を用いない • HTMLとして単体で見た目を確認できる • Snippet – Scalaで記述 – テンプレートのタグに処理を流し込む わんくま同盟 名古屋勉強会 #19
  • 9. Comet/Ajax • ScalaのコードだけでAjaxな処理を記述可能 – 処理内容として関数を渡す(Function Mapping) • JavaScriptのコードが生成される • Comet – サーバー側で発生したイベントをクライアントから のRequestなしに、クライアントに通知する機能 – Scalaの並列処理機能のActorを用いて実装され ている わんくま同盟 名古屋勉強会 #19
  • 10. 用意するもの • Lift 2.4M4 – http://liftweb.net/ – /解凍済みフォルダ/scala_29/lift_basic • すでにいろいろ設定されているLiftプロジェクト • テンプレートにHTML5を使える • Scala 2.9.1-final – http://www.scala-lang.org/ • simple build tool(sbt) 0.11.0 – https://github.com/harrah/xsbt/wiki わんくま同盟 名古屋勉強会 #19
  • 11. sbtについて • Scalaで書かれたScalaの開発環境 – 依存関係の管理、ビルド、CIっぽいこととか • 大別して0.7.x系と0.10.x系(以降)がある – 互換性がほとんどない – 多くのプロジェクトで0.10.x系への移行が進んで いる…らしい – Lift2.4M4のデフォルトは0.7.x系 • 0.10.x系使いましょう – 現在(2011/10/15)最新はsbt 0.11.0 わんくま同盟 名古屋勉強会 #19
  • 12. sbtの設定 0.7.x → 0.11.0 • プロジェクトの依存関係の設定 – build.sbt(長いので次へ) • sbt webプラグインの設定 – project/plugins.sbt libraryDependencies <+= sbtVersion(v => "com.github.siasia" %% "xsbt-web-plugin" % (v+"-0.2.4")) • sbtバージョンの指定 – project/build.properties sbt.version=0.11.0 わんくま同盟 名古屋勉強会 #19
  • 13. プロジェクトの依存関係の設定(build.sbt) name := “project_name" seq(webSettings: _*) resolvers ++= Seq( "Java.net Maven2 Repository" at "http://download.java.net/maven/2/", ライブラリの入手 "Scala Tools Snapshots" at "http://scala-tools.org/repo-snapshots", "Typesafe Snapshots" at "http://repo.typesafe.com/typesafe/snapshots" 元 ) libraryDependencies ++= { val liftVersion = "2.4-M4" // Put the current/latest lift version here Seq( "net.liftweb" %% "lift-webkit" % liftVersion % "compile->default", "net.liftweb" %% "lift-mapper" % liftVersion % "compile->default", Liftライブラリ "net.liftweb" %% "lift-wizard" % liftVersion % "compile->default") } libraryDependencies ++= Seq( "org.mortbay.jetty" % "jetty" % "6.1.22" % "container", "org.scala-tools.testing" % "specs_2.9.0" % "1.6.8" % "test", "junit" % "junit" % "4.8" % "test->default", その他のライブ "javax.servlet" % "servlet-api" % "2.5" % "provided->default", ラリ群 "com.h2database" % "h2" % "1.2.138", "ch.qos.logback" % "logback-classic" % "0.9.26" % "compile->default" ) わんくま同盟 名古屋勉強会 #19
  • 14. Liftでよく使うClass / Objectについて • net.liftweb.http.S – HTTP Request/Response情報を扱う – セッション・Cookie管理, リダイレクト, etc • net.liftweb.http.SHtml – htmlのタグを生成する – Ajaxコンポーネントなども扱う • net.liftweb.http.LiftRules – Liftの設定を行う – コードのディレクトリ, jQueryの使用, etc わんくま同盟 名古屋勉強会 #19
  • 15. Liftでよく使うClass / Objectについて • net.liftweb.common.Box – Full, Empty, Failureの三種類の値を持ちうる型 • 有効な値が取れればFull • Liftの例外処理で使われている • net.liftweb.http.RequestVar – Requestを受け取るためのObject – 継承して用いる object name extends RequestVar("") わんくま同盟 名古屋勉強会 #19
  • 16. Liftプロジェクトの構成 • src/main/scala/code – Snippet、ModelのScalaコード • src/main/scala/bootstrap/lift web – Boot.scala • src/main/webapp – テンプレートなど • target – コンパイル時に生成 わんくま同盟 名古屋勉強会 #19
  • 17. Boot.scala • メニューの設定 – SiteMap()の要素にMenuを追加する – Menu(S ? ”表示名”) / ”テンプレートの相対パス” class Boot { def boot { /* DB設定略 */ Schemifier.schemify(true, Schemifier.infoF _, User) LiftRules.addToPackages("code") def sitemap = SiteMap( Menu.i("Home") / "index" >> User.AddUserMenusAfter, Menu(Loc("Static", Link(List("static"), true, "/static/index"), "Static Content"))) /* HTML5、jQuery、Ajaxなどの設定 略 */ } } わんくま同盟 名古屋勉強会 #19
  • 18. Boot.scala • Schemefier – 指定したModelとDBのテーブルを自動同期 class Boot { def boot { /* DB設定略 */ Schemifier.schemify(true, Schemifier.infoF _, User) LiftRules.addToPackages("code") def sitemap = SiteMap( Menu.i("Home") / "index" >> User.AddUserMenusAfter, Menu(Loc("Static", Link(List("static"), true, "/static/index"), "Static Content"))) /* HTML5、jQuery、Ajaxなどの設定 略 */ } } わんくま同盟 名古屋勉強会 #19
  • 19. テンプレートについて • <body class="lift:content_id=main"> – id=“main”を持つ要素の内容をテンプレートとして 処理する – 省略すると、テンプレート全体が処理される Template(抜粋) <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"> Welcome to your Lift app at <span id="time">Time goes here</span> </span> </p> </div> </body> わんくま同盟 名古屋勉強会 #19
  • 20. テンプレートについて • <div(中略)class="lift:surround?with=default;at=content"> – 囲まれた内容を処理し、レイアウトdefault.html の”content”の位置に流し込む Template(抜粋) <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"> Welcome to your Lift app at <span id="time">Time goes here</span> </span> </p> </div> </body> わんくま同盟 名古屋勉強会 #19
  • 21. テンプレートについて • <span class="lift:helloWorld.howdy"> – 囲まれた範囲にhelloWorld Snippetのhowdyメ ソッドのレンダリング処理を適用する Template(抜粋) <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"> Welcome to your Lift app at <span id="time">Time goes here</span> </span> </p> </div> </body> わんくま同盟 名古屋勉強会 #19
  • 22. レイアウトについて <html xmlns="http://www.w3.org/1999/xhtml" xmlns:lift="http://liftweb.net/"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <meta name="description" content="" /> <meta name="keywords" content="" /> </head> <body> <div class="container"> <div class="column span-6 colborder sidebar"> <hr class="space" > <span class="lift:Menu.builder"></span> <div class="lift:Msgs?showAll=true"></div> <hr class="space" /> </div> <div class="column span-17 last"> <div id="content">The main content will get bound here</div> </div> </div> </body> </html> わんくま同盟 名古屋勉強会 #19
  • 23. レイアウトについて • webapp/template-hidden以下のhtml – <div id="content"></div> • テンプレートのlift:surround at=“content”で指定した内 容の埋め込み位置 • <lift:bind name=“content” />でも可 – <span class="lift:Menu.builder"></span> • Boot.scalaで設定したMenu Snippetを用いて、タグの 位置にメニューを生成する – <div class="lift:Msgs?showAll=true"></div> • タグの位置にメッセージの表示を行うSnippet わんくま同盟 名古屋勉強会 #19
  • 24. Snippet • メソッドが一つのコンポーネントに対応する – <lift:helloWorld.howdy>タグ内 – class=”lift:helloWorld.howdy”が指定されたタグ Template(抜粋) <span class="lift:helloWorld.howdy"> Welcome to your Lift app at <span id="time">Time goes here</span> </span> Snippet class HelloWorld { lazy val date: Box[Date] = DependencyFactory.inject[Date] def howdy = "#time *" #> date.map(_.toString) } わんくま同盟 名古屋勉強会 #19
  • 25. Snippet • Snippetとテンプレートの関連付け – Helpers.bindを用いる方法 • 割愛(こっちは資料多いし…) – CSSセレクタを用いる方法 • #>演算子を使う Snippet def howdy = "#time *" #> date.map(_.toString) Template(抜粋) Welcome to your Lift app at <span id="time">Time goes here</span> id=“time”を持つ要素の内容を左辺の文字列で置換 わんくま同盟 名古屋勉強会 #19
  • 26. 左辺 CSSセレクタによる関連付け 記法 意味 #hoge id=“hoge”を持つ要素を選択する .(ピリオド)hoge classにhogeを含む全ての要素を選択する attr_name=value 属性attr_nameの値がvalueである全ての要素を選択する 置換規則 例 意味 (なし) “#hoge” 一致した全ての要素を右辺で置換 * “#hoge *” 一致した全ての要素の内容を右辺で置換 [attr] “#hoge [href]” 一致した全ての要素の属性attrの値を右辺で置換 右辺 • String, Box, NodeSeq, List[String], List[NodeSeq], etc • コレクションを要素の内容に適用した場合、要素が個数分コ ピーされる わんくま同盟 名古屋勉強会 #19
  • 27. Model • classとコンパニオンobjectの使い分け – スキーマ定義:class • traitのミックスインによってModelに機能を追加できる – IdPK:主キーにIdを自動で振る機能を追加するtrait • 属性はobject(シングルトンなオブジェクト)で定義 class TwitterId extends LongKeyedMapper[TwitterId] with IdPK { override def getSingleton = TwitterId object screenName extends MappedString(this, 100) object password extends MappedString(this, 100) object user extends MappedLongForeignKey(this, User) } わんくま同盟 名古屋勉強会 #19
  • 28. Model • classとコンパニオンobjectの使い分け – コンパニオンobject? • 同じファイル内で定義されたclassと同じ名前のobject • 同名クラスのprivateなメンバにアクセスできる – Modelへの操作、設定:コンパニオンobject • LongKeyedMetaMapper traitのミックスインでCURD 操作のAPIを追加 object TwitterId extends TwitterId with LongKeyedMetaMapper[TwitterId] わんくま同盟 名古屋勉強会 #19
  • 29. 参考 • Lift全般 – 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/ わんくま同盟 名古屋勉強会 #19
  • 30. 参考 • sbtの設定 – sbt – GitHub • https://github.com/harrah/xsbt/wiki – sbt徹底解説 • http://www.slideshare.net/KenjiYoshida/scalakaigi1 sbt – siasia / xsbt-web-plugin - GitHub • https://github.com/siasia/xsbt-web-plugin – lacy / lift-quickstart - GitHub • https://github.com/lacy/lift-quickstart わんくま同盟 名古屋勉強会 #19
  • 31. ご清聴ありがとうございました! わんくま同盟 名古屋勉強会 #19