ラベル scala の投稿を表示しています。 すべての投稿を表示
ラベル scala の投稿を表示しています。 すべての投稿を表示

2013年4月3日水曜日

Scala SlickでIN演算子を実現するには?


Slickというか、ScalaQuery時代の記法のようですが、
Slick 1.0.0でも使えました。

書き方:

val ids = 1 :: 2 :: 3 :: Nil
for(u <- Users if u.id inSet ids) yield u.name
引用元: IN operator in WHERE clause 

※IN、ってググらビリティが低いので悩みました。

2013年3月21日木曜日

jacoco4sbtのバージョン2.0.0はPlay 2.1では動かない?

背景

Play 2.1でテストコードを書きながら、コードカバレッジを把握したいなーと思って調べていたところ、
jacoco4sbtなるものを発見しまして。

https://bitbucket.org/jmhofer/jacoco4sbt

問題

で最新が2.0.0ということで色々設定をした後、playコマンドでsbt起動後に
jacoco:cover
 としてみると下記のエラーが。
java.lang.IncompatibleClassChangeError: class org.jacoco.core.internal.flow.ClassProbesVisitor has interface org.objectweb.asm.ClassVisitor as super class

で、どうも同じ症状が出ている人は世の中にいるらしく。
https://bitbucket.org/jmhofer/jacoco4sbt/issue/18/the-conflict-about-asm-library-in-play

 上のリンクの方の推測によると、
Playで使っているASMのバージョンと、Jacocoで使っているASMのバージョンが違うんじゃない?
とのこと。

回避策

jacoco4sbtの1.2.4を使えばいいよ!とのことでした。

pkugin.sbtはこんな感じ。
//Jacoco
libraryDependencies ++= Seq(
  "org.jacoco" % "org.jacoco.core" % "0.5.9.201207300726" artifacts(Artifact("org.jacoco.core", "jar", "jar")),
  "org.jacoco" % "org.jacoco.report" % "0.5.9.201207300726" artifacts(Artifact("org.jacoco.report", "jar", "jar")))

addSbtPlugin("de.johoop" % "jacoco4sbt" % "1.2.4")


その他

ASMって初めて知ったのですが、Javaのbytecodeを操作したり分析したりするフレームワークだそうな。
http://asm.ow2.org/

2013年2月11日月曜日

ScalaMock 3では、引数ありのコンストラクタのモックは作成できない

背景


Scalaでモックを作るには何がいいのかな~ってところで
ScalaMock を使い始めました。

困ったこと


引数ありのコンストラクタのモックを作ろうとしても
error: not enough arguments for constructor XXX.
というエラーメッセージが出てコンパイルできません。

引数ありコンストラクタを持つクラスはモックを作れないことが判明


http://stackoverflow.com/questions/14274020/scalamock-mock-a-class-that-takes-arguments

にて
Right now, ScalaMock3 can only mock traits and no-args classes.

今のところ、ScalaMock3ではトレイトと引数なしのクラスのみモックできるよ。

 てことで、少なくとも現時点では、引数ありのコンストラクタを持ったクラスのモックは作成できない模様。
テスト対象のクラスを引数なしのコンストラクタにして、引数に渡したかったものはsetter使って渡す形ですかねー。
Traitで定義しておいたほうが楽ですね。
※まぁscalamockのオフィシャルページにも似たようなことが書いてあったのでやっぱりかー、というところ。

2013年2月4日月曜日

Play ScalaでのカスタムPathBindableの作成方法(へのリンク)

メモ。

Play Frameworkで独自に作成したクラスなどを
URLパスに指定したい場合、PathBindableを実装する必要があります。

そのやり方を説明してくれているサイトを発見したので備忘録的に書いておきます。

www.soutier.de/blog/2012/12/11/playframework-routes-part-2-advanced/

implicit objectという手があるのかー、
と自分のScala力の低さに悶々としてます。

2013年2月3日日曜日

sbtでscalacにコンパイルオプションを渡す方法。

背景

sbtでコンパイルを走らせた際にwarningが出で「-xxxっていうコンパイルオプションをつけてもう一度やってね」って言われるものの、
そのコンパイルオプションの付け方がわからん!


ということが起こった時にググって解決したものの、それを忘れていたせいで今日困ったので
メモしておきます。

設定の仕方

sbtを起動したら、

set scalacOptions += "-xxx"

を実行。
あとは普通にコンパイルするだけです。

他のやり方は?

build.sbtなどに設定する方法はあるのですが、
ファイルを書き換えるのは手間なので、上記のやり方でやってます。


2012年7月15日日曜日

ScalaでAndroidのAsyncTaskを使う際に可変長引数でAbstractMethodErrorが発生する件

Androidアプリにて非同期処理を実現しようとするとAsyncTaskを使うわけですが、
Scalaで書こうとすると実行時にAbstractMethodErrorが発生する訳です。
で、これはどうもJava側での可変長引数をScalaでよろしく処理できないためのようで。

てことで検索したら解決策を発見したのでメモ。

https://gist.github.com/1175555

@Override
   protected Result doInBackground(Params... params) {
      return doInBackground(params.length > 0 ? params[0] : null);
   }

   abstract protected Result doInBackground(Params param);


AsyncTaskを継承したJavaクラスを作成し、可変長引数を受け取ったらその1個目の引数を使ってabstractメソッドに処理を移譲しています。

2012年4月25日水曜日

jberkel / android-plugin とEclipse

ScalaでAndroidコードを書きたいなぁ、ということで調べていたら下記のsbtのプラグインがヒットしました。

/ android-plugin

Scala書くときにはEclipseのScala IDEがなかなか使えるし、
Androidのリソースを編集するのにも向いていていいよねー、てことでEclipse用に環境を構築しました。
結果的には、ほとんど下記の方の記事と一緒の設定になりました。

sbteclipse を android-plugin に適用して eclipse で編集する


ちょっと違うのは、私が使ったandroid-pluginが0.6.1だからか、sbteclipse-pluginが2.0.0だからなのか、
Eclipseにインポートした後にしたことは、Build PathのSourceタブにおいて、
  • src/main/res をビルドパスに追加
しただけでした。

逆にしなかったこととしては、
  • src/main/resources、src/test/resources の削除は不要。
  • Librariesタブで、target[scalaバージョン]/classes の追加は不要。
でした。


ひとまず、Eclipse上でエラーが表示されることはなくなりました。

2011年11月20日日曜日

xsbtでScalaのcompileのオプションを設定する方法。

Liftで書いていて、xsbtの

compile
 時に

there were 1 deprecation warnings; re-run with -deprecation for details
と出てきていたものの、どうやって設定するのやら悩んでいましたが、
下記の設定でOKでした。

set scalacOptions += "-deprecation"

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年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