2011年10月19日水曜日

xsbt + xsbt-web-plugin + scala 2.9.1のサンプル。

  • sbt 0.11(xsbt)
  • xsbt-web-plugin
  • scala 2.9.1

の組み合わせのサンプルを発見。
バージョン指定の方法で毎度悩むので、2011年10月19日現在の最新(と思われる)この組み合わせを使ってliftをやろうかと。

https://github.com/schmmd/helloworld-scala-servlet

(via https://github.com/siasia/xsbt-web-plugin/wiki/

2011年7月28日木曜日

sbteclipseを使ってxsbt(sbt 0.10系)からeclipse用の設定ファイルを作成する方法

Scalaの作者であるMartin Oderskyさんがinetrviewにて
I personally switched to the Eclipse plugin after 20 years of emacs. Certainly before then, I tried the plugin; but for the complex projects I do, it didn't live up to what I needed. Now, I would now never go back to emacs.
『eclipseのScalaプラグインの出来が素晴らしくて、20年使ってきたけどemacsにはもう戻れません!』
という発言をされていたのでeclipseのScalaプラグイン『Scala IDE for Eclipse』が気になってきまして。

でもscalaにはsbtという素敵なビルドツールがあるし、
  • eclipseはエディタとして使う
  • sbtはビルド用に使う
ということができないかなーと思って、sbtとeclipseの連携方法を調査したのでメモ。

参考リンク。

→sbtecipseを使って、sbtから.projectファイルや.classpathファイルを生成するとのこと。

http://stackoverflow.com/questions/6566470/how-to-add-sbteclipse-plugin-to-sbt-0-10-x
→バージョンの指定方法を参考にしました。


やり方。

  1. build.sbtファイルをproject/plugins配下に作成(デフォルトで存在?)。
    ※sbtを実行したルートディレクトリに作成しても良い模様。
  2.  下記内容を記載。
  3. resolvers += {
      val typesafeRepoUrl = new java.net.URL("http://repo.typesafe.com/typesafe/releases")
      val pattern = Patterns(false, "[organisation]/[module]/[sbtversion]/[revision]/[type]s/[module](-[classifier])-[revision].[ext]")
      Resolver.url("Typesafe Repository", typesafeRepoUrl)(pattern)
    }
    
    libraryDependencies <<= (libraryDependencies, sbtVersion) { (deps, version) => 
      deps :+ ("com.typesafe.sbteclipse" %% "sbteclipse" % "1.2" extra("sbtversion" -> version))
    }
    
  4. ※2011/11/05更新
    resolvers += Classpaths.typesafeResolver
    
    addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse" % "1.4.0")
    
  5.  sbtを起動。 sbteclipseのダウンロードが行われる。 
  6. eclipse create-srcを実行すると、.projectファイルと.classpathファイルが作成される。
  7. eclipseにて、.projectファイルが存在するパスを指定し、プロジェクト毎import。
という感じです。

    2011年7月25日月曜日

    LiftとMongoDBとRogueを使ってみる。(その2:Rogue設定編)

    以前の続きです。


    Rogueを使ってみます。


    Rogueについてはこちらを参照。

    Rogue: A Type-Safe Scala DSL for querying MongoDB

    Foursquareが公開しているMongoDBクエリ用のライブラリ。型安全なScala-DSLだそうで。

    型安全なクエリを実行できるのは素晴らしいですね。
    正直あまりよくわかっていないのですが、ひとまず開発環境の足がかりを作ります。

    ※赤字は追記・変更点。


    まずは2011年7月段階で最新安定版のLift 2.3をダウンロード。

    ダウンロードしたファイルを解答し、「lift_basic」フォルダをどこかに展開。

    project/build/LiftProject.scalaを下記の通り変更。


    import sbt._
    
    class LiftProject(info: ProjectInfo) extends DefaultWebProject(info) {
    
     val liftVersion = "2.3"
    
     // uncomment the following if you want to use the snapshot repo
     val scalatoolsSnapshot = ScalaToolsSnapshots
    
     // If you're using JRebel for Lift development, uncomment
     // this line
     // override def scanDirectories = Nil
    
     override def libraryDependencies = Set(
       "net.liftweb" %% "lift-webkit" % liftVersion % "compile",
       "net.liftweb" %% "lift-mapper" % liftVersion % "compile",
       "org.mortbay.jetty" % "jetty" % "6.1.22" % "test",
       "junit" % "junit" % "4.5" % "test",
       "ch.qos.logback" % "logback-classic" % "0.9.26",
       "org.scala-tools.testing" %% "specs" % "1.6.6" % "test",
       "com.h2database" % "h2" % "1.2.138",
       "com.foursquare" %% "rogue" % "1.0.14-SNAPSHOT" withSources()
      ) ++ super.libraryDependencies
    
    }
    



    sbtを起動し、updateして必要なライブラリをすべてダウンロードできているようであればOKです。

    "com.foursquare" %% "rogue" % "1.0.14-SNAPSHOT" withSources()
    
    の"1.0.14-SNAPSHOT"については、下記のリポジトリを参考にその時々のバージョンを指定して下さい。
    http://scala-tools.org/repo-snapshots/com/foursquare/


    続いてMongoDBへの接続設定。
    正直なところ下記を参照して適当に設定しています。
    http://www.assembla.com/spaces/liftweb/wiki/Mongo_Configuration


    src/main/scala/code/model/MongoConfig.scalaを下記内容で作成。



    package code.model
    import net.liftweb._
    import mongodb._
    import util.Props
    import com.mongodb.{Mongo, ServerAddress}
    
    object MongoConfig {
      def init: Unit = {
        val srvr = new ServerAddress("127.0.0.1", 27017)
    
        MongoDB.defineDb(DefaultMongoIdentifier, new Mongo(srvr), "foo")
      }
    }
    



    別マシンでmongodを実行している場合や、DB名を指定する場合にどういうことをすれば良いのかは不明ですが、まぁ気にしないことにします。 




    そしてsrc/main/scala/bootstrap/liftweb/Boot.scalaにて、上で定義した設定処理を実行するように下記を追記。


    class Boot {
      def boot {
        if (!DB.jndiJdbcConnAvailable_?) {
         //MongoDb boot
         MongoConfig.init
    (後略)
    





    ひとまず設定はこんなところです。




    ********

    TODO
    1. Lift+RogueでCRUDしてみる。
    ********
    サンプルはgithubにて公開。
    https://github.com/RKTM/Lift-MongoDb-Rogue-Sample

    2011年6月19日日曜日

    Windowsの環境変数をsetxで永続的に設定


    Windowsの環境変数を永続的(マシン再起動後にも設定が有効となるように)、かつ、スクリプトで自動で設定できないかなぁと調べてみました。

    Windows Support Toolsに含まれるsetxコマンドを使えば良いとのこと。詳細は以下リンクをご参照。

    setxで環境変数の値を設定する(基本編) 


    で困ったのが、複数の環境変数をsetxで設定した後に、それらをユーザー変数のPATHにどんどん追加しようとした時。何故か最後のsetxのみ有効になってしまうという。

    ということで下記のような書き方で対応。
    一時的な変数USER_PATHにどんどん追加していって、最後にsetxコマンドで環境変数に設定するというやり方です。
    set USER_PATH=%USER_PATH%;"%SCALA_HOME%\bin"
    set USER_PATH=%USER_PATH%;%SBT_HOME%
    setx PATH %USER_PATH%
    ちなみに"%SCALA_HOME%\bin"のところがダブルクオーテーションで囲われているのは、パスに半角スペースが含まれており、それをエスケープするためです。


    参考リンク

    2011年5月12日木曜日

    LiftとMongoDBとRogueを使ってみる。(その1:MongoDB編)

    LiftとMongoDBとRogueを使ってみます。

    MongoDBのダウンロードやらQuick Startなどは
    公式サイトから。


    マシン環境はWindows XP SP3 32bit。
    てことでWindows用の環境構築はこちらを参照。
    http://www.mongodb.org/display/DOCS/Quickstart+Windows


    DLしたファイルを解凍した先を環境変数PATHに設定しておきます。



    ひとまず意識するexeは2つ。
    • mongod.exe - データベースサーバー
    • mongo.exe - 管理用シェル

    チュートリアルの指示通りにデータを保持するフォルダも作っておきます。(今回はe:\data\db)

    PATHを通してあるので、とりあえずコマンドプロンプトで下記のように打ってデータベースサーバーを起動。

    mongod --dbpath e:\data\db
    --dbpathオプションでデータを保持するフォルダを指定しています。


    別のコマンドプロンプトにて、
    mongo
    と打つとシェルが立ち上がります。

    デフォルトではmongo.exeはlocalhost上のmongodサーバーに接続し、testデータベースを使用します。

    データ登録するにはこんな感じ。(mongoを実行しているコマンドプロンプトで実行します)

    db.foo.insert({name:"aaa"})
    これでfooというコレクションにnameがaaaという値が登録されます。
    コレクションはRDBで言うところのテーブルです。create tableしなくても勝手に作ってくれます。
    明示的に作る方法もあるようです。

    上記で登録した値を全件検索するには

    db.foo.find()

    で良いです。


    ********
    TODO

    1. Rogueの設定をする。
    2. RogueでCRUDしてみる。
    3. Lift+RogueでCRUDしてみる。

    2011年4月23日土曜日

    LiftでCamelCaseのsnippetがClass Not Foundとなる件。

    Lift 2.3で発生した問題。

    AccountSnippet.scalaにて下記のように記載。

    class AccountSnippet{
    //色々
    }


    VIEWに以下のように書いて実行。

    <lift:AccountSnippet.post form="POST">
        <ul class="status">
          <li> <accnt:name/> </li>
          <li> <accnt:submit/> </li>
        </ul>
      </lift:AccountSnippet.post> 

    するとブラウザには以下のようなエラーメッセージが。

    Error processing snippet: accountsnippet.post
    Reason: Class Not Found
    XML causing this error:

    <lift:accountsnippet.post form="POST">
        <ul class="status">
          <li> <accnt:name> </accnt:name></li>
          <li> <accnt:submit> </accnt:submit></li>
        </ul>
      </lift:accountsnippet.post>

    わけがわからないなーとぐぐってみると、
    どうやらHTML5のparserはすべてのXML系のタグをすべて小文字に変換するため、
    AccountSnippetとはマッチせず、Class Not Foundになるそうな。

    てことで

    class Accountsnippet{
    //色々
    }

    と変更したらうまく動きましたとさ。なんとも切ない話・・・。

    以下参考リンク。

    SnippetFailure message 
    ※最後のDavid Pollakの発言参照。


    ※2011/07/05追記:
    Html5とXHTMLの差違についてのDPPからの説明。
    Html5 and XHTML are different