Skip to content

Java (Scala) で言語判定

Java (Scala) で言語判定 published on Java (Scala) で言語判定 へのコメントはまだありません

やりたい事

  • Java (Scala) で、ある文字列が何語(日本語、英語、など)なのかを判別する
  • 入力文字列は以下の2通り
    • ユーザーから入力された検索文字列(1単語、数文字〜数単語、数十文字)
    • 検索対象となる文章(数十単語〜数十ページ程度)
  • 対応する言語
    • 当初は日本語と英語
    • 今後は5言語程度

なぜこれをやりたいかは、以下のエントリーを参照。

Elasticsearch多言語化その2 – K blog

Continue reading Java (Scala) で言語判定

Play! frameworkのJsPath.readNullableの挙動

Play! frameworkのJsPath.readNullableの挙動 published on Play! frameworkのJsPath.readNullableの挙動 へのコメントはまだありません

はじめに

Play! framework の JSON ライブラリって、慣れればまぁ普通に使えるけど、ドキュメントがイマイチだし、やりたいことをどう書けばいいかが分からなくて時間を使うことが多い。

今回書くのは、JSONデータである要素が存在しない場合にそれをどう扱うか、という話題。

「なんだ readNullable 使うだけでしょ?」

と思う人もいるかもしれない。まぁ実際にはそうなんだけど、readNullable の挙動が若干分かりにくかったので、それについて。

やりたいこと

JSONデータで、ある要素が存在する場合と存在しない場合が考えられるとき、その要素が存在する場合は Some 、存在しない場合は None としてパースしたい。

具体的な例で説明すると、Facebook APIから以下のようなJSONが返ってくるとする。内容はあるFacebookグループへの書き込み。

Continue reading Play! frameworkのJsPath.readNullableの挙動

Comparing nullable columns in Squeryl

Comparing nullable columns in Squeryl published on Comparing nullable columns in Squeryl へのコメントはまだありません

How to compare nullable columns in Squeryl

Suppose we have a table definition like this:

case class T1 (
  id: Int,
  col1: Option[Int]
)
object FooDb extends Schema {
  val t1 = table[T1]("t1")
}

And, we want to execute a query like the following:

select * from t1 where col1 < 10

The correct statement in Squeryl is shown below:

from(FooDb.t1)( t1 =>
  where(t1.col1 lt Some(10))
  select(t1)
)

This isn’t very intuitive, and actually, it took me a lot of time to get to this answer.

Here are some that I tried and failed

The most intuitive one doesn’t compile:

  where(t1.col1 lt 10) // -> doesn't compile

This one causes NoSuchElementException:

  where(t1.col1.get lt 10) // -> NoSuchElementException

Another one that causes NoSuchElementException:

  where(t1.col1.map(_ lt 10).get) // -> NoSuchElementException

Official site should have example

I’ve found some guys that were having the same issue:

I think the Squeryl web site should have an example that uses nullable column in the where clause.

Scala や Play! framework で DI

Scala や Play! framework で DI published on Scala や Play! framework で DI へのコメントはまだありません

自分用メモ

 

sbtでstacktraceを全部表示させる

sbtでstacktraceを全部表示させる published on sbtでstacktraceを全部表示させる への2件のコメント

自分用メモ。

Play! frameworkを使った開発で、エラー発生時にstacktraceが途中で途切れてしまう事がある、

ScalaTestの場合は、こちらにあるように以下のように指定する。

testOptions in Test += Tests.Argument("-oD")

sbt自身の話だが、デフォルトでは大抵のstack traceは隠されてしまう。

By default, sbt hides the stack trace of most exceptions thrown during execution. It prints a message that indicates how to display the exception. However, you may want to show more of stack traces by default.

表示するためには以下のようにする。詳しくはマニュアル参照。

> set every traceLevel := 0

最初からonにしててくれればいいのに。

追記:

xuwei_kさんからのコメントの通り、lastとやると、最後に実行したコマンドに関するログが出力される。マニュアルの一番上に書いてある。

When a command is run, more detailed logging output is sent to a file than to the screen (by default). This output can be recalled for the command just executed by running last.

ScalaのFutureがブロックする?(深く調べてない)

ScalaのFutureがブロックする?(深く調べてない) published on ScalaのFutureがブロックする?(深く調べてない) への3件のコメント

ScalaのFutureで(あるいはPlay?)で処理がブロックされてしまう現象があった。

環境

  • Scala 2.10.1
  • Play 2.1.3
  • (Playのモデルクラスを使っているだけで、scalaコマンドから起動されるバッチ処理)

簡略化するとこんなコード(実際はもっと分割されてるし、whileじゃなくてtailrecだけど)。

import scala.concurrent.Await
import scala.concurrent.duration._
import play.api.libs.concurrent.Execution.Implicits._
 
for {
  photo <- listOfPhotos
} yield {
  // downloadはサードパーティライブラリのメソッドで
  // Future[java.io.File]を返す
  val fut = photo.download map { file =>
    Logger.debug("start!") //ここまでは実行される。
    // SomeApi.postFileの挙動は、responseが返るまでブロックする。
    // しかし、↓が実行されない
    SomeApi.postFile(file) map { jobId =>
      var complete = false
      var result = None
      while (!complete) {
        Thread.sleep(5000)
        val job = SomeApi.getJob(jobId)
        if (job.isComplete()) {
          complete = true
          result = job.getResult()
          // resultに対して処理
        }
      }
    }
  }
  try {
    Await.result(fut, 120 seconds)
  } catch {
    case e: Exception => Logger.error(e.getMessage())
  }
}

Continue reading ScalaのFutureがブロックする?(深く調べてない)

Play! framework 2.xでJSONを扱う方法をいくつか

Play! framework 2.xでJSONを扱う方法をいくつか published on Play! framework 2.xでJSONを扱う方法をいくつか へのコメントはまだありません

Webサイト作ってると、JSONを扱うことが多い。なので、Play! frameworkで、ScalaのオブジェクトからJSON文字列に、あるいはその逆をやりたいよね、と(特に前者)。

そんな今回はObject -> JSONの方法をいくつかまとめてみた。

環境は Play 2.1.1。そのうち2.2にアップグレードしようと思うけど。

ちなみに Scala Advent Calendar 2013 の 12日目の記事ですら。

Continue reading Play! framework 2.xでJSONを扱う方法をいくつか

Lift CSS SelectorとAjax

Lift CSS SelectorとAjax published on Lift CSS SelectorとAjax へのコメントはまだありません

相変わらずボチボチLiftを触ってる。Lift 2.2 M1から入った便利な機能として、CSS Selectorがある。詳しくはWikiの該当のエントリを見てもらうとして、それとAjaxを組み合わせる方法。

■環境

Lift 2.2

■やりたい事

<form>タグを使った例はSimply Liftの4.8に載っているんだけど、普通のボタン(ajaxButton)を使いたかった。

DBのテーブルよりデータを取得して、HTMLの表にして出力。各行についているボタンをクリックすると、その行のデータに対する何らかの処理が行われるようにしたい。

結論から言うと簡単。

Continue reading Lift CSS SelectorとAjax

Scala EnumerationとLift MappedEnum

Scala EnumerationとLift MappedEnum published on Scala EnumerationとLift MappedEnum へのコメントはまだありません

■MappedEnum

LiftにはMappedEnumという型がある。型引数の1つでEnumerationの子クラスを取る。モデルクラスのフィールドにそれを指定すると、フォームではEnumerationの各要素がプルダウンで選択できるようになる。

MappedEnumのシグニチャは以下の通り。

abstract class MappedEnum[T<:Mapper[T], ENUM <: Enumeration] (val fieldOwner: T, val enum: ENUM)
extends MappedField[ENUM#Value, T] 

Continue reading Scala EnumerationとLift MappedEnum

Liftで画像表示

Liftで画像表示 published on Liftで画像表示 へのコメントはまだありません

タイトル通りだけど、<img src="foo.jpg" />とかそう言う話ではなく、DB内やファイルシステムにある画像ファイルを読み込んで、それをブラウザに出力する方法。以前、アップロードされた画像をDBに格納する方法についてエントリを書いたので、それと併せて読むといいかも。

■環境

  • Lift 2.2 (古いバージョンでも基本は一緒のはず)
  • Scala 2.8

 

Continue reading Liftで画像表示