2012年2月13日月曜日

Squerylでunion

scalaのO/R mapperのSquerylでunionを行う方法

複合Keyとかでin句が使えない場合のunion構文の実装方法のメモ

Queryクラスのunionメソッドを使います。



val table = Table[CompositeKey2Object]

val ids = List( (1,2),(1,3),(2,5) )

inTransaction{
def toQuery( id : (Int,Int) ) = {
from(table)(t => where( (t.pk1 === id._1) and (t.pk2 === id._2)))
}
ids match{
case id :: tails => {
ids.foldLeft(toQuery(id))( (query,id) => query.union(toQuery(id))).toList
}
case _ => Nil
}
}

2012年1月23日月曜日

JDBCで使えるURL一覧

JDBCに指定するURLとDriverClassのまとめ




DB名DriverClass種別url
MySQLcom.mysql.jdbc.Driverサーバーjdbc:mysql://[server_name]:[port=3306]/[database_name]
H2DBorg.h2.Driverサーバーjdbc:h2:tcp://[server]:[port]/[path]/[database_name]
ファイルjdbc:h2:file:[path][database_name]
メモリjdbc:h2:mem:[database_name]
Oracleoracle.jdbc.driver.OracleDriverサーバーjdbc:oracle:thin:@[server_name]:[port=1521]:[database_name]
Microsoft SQL servercom.microsoft.jdbc.sqlserver.SQLServerDriveサーバーjdbc:microsoft:sqlserver://[server_name]:[port=1433]/[database_name]; DatabaseName=[database_name]
Derbyorg.apache.derby.jdbc.EmbeddedDriverファイルjdbc:derby:[path]/[database_name];create=true
メモリjdbc:derby:memory:[database_name]
PostgreSQLorg.postgresql.Driverサーバーjdbc:postgresql://[server_name]:[port=5432]/[database_name]
Sqliteorg.sqlite.JDBCファイルjdbc:sqlite:[path]/[database_name]
org.sqlite.JDBC

2012年1月7日土曜日

Scalaの標準jsonライブラリの使い方

意外にscala標準ライブラリのjsonライブラリの説明をしてくれているサイトが少ないので自分で試したことをまとめ。



ちなみに、簡単なJSONをパースするだけなら、標準ライブラリでいい気はするけど、
オブジェクトのJSON化したいなら、sjsongsonなどのライブラリを使用したほうがよさそうです。



JSONのパース



JSONのパースはscala.util.parsing.json.JSONクラスを使います。parseFullとparseRawの2つのメソッドがありますが、動作は同等です。パースしたJSONは以下のようなscalaのクラスにマップされます。

JSON typeJSON.parseFullJSON.parseRaw
JSON MapMap[String,Any]JSONObject
JSON ArrayList[Any]JSONArray
文字列StringString
数値DoubleDouble


コードではこのような感じになります。

import scala.util.parsing.json.JSON;

val json : Object[Any] = JSON.parseFull("""
{
"key1" : "string",
"key2" : 20,
"key3" : ["Array",1],
"key4" : {
"key5" : "hoge"
}
}
""")

/*
このようなオブジェクトが帰ります
json.get == Map(
"key1" -> "string",
"key2" -> 20.0,
"key3" -> List("Array",1.0),
"key4" -> Map( "key5" -> "hoge")
)

*/



数値がDoubleにマップされるのに注意してください。
また、jsonフォーマットが間違っている場合などは、戻り値がNoneとなります。




JSON化



JSON化にはJSONObject,JSONArrayを使います。


JSONObject(Map(
"key1" -> "string",
"key2" -> 20,
"key3" -> JSONArray(List("Array",1)),
"key4" -> JSONObject(Map( "key5" -> "hoge"))
)))


JSONObjectやJSONArrayで囲まないとだめなのが超イケてない。

2012年1月6日金曜日

Scalatraでオレオレ例外をErrorHandling

Scalatraでは、errorメソッドを使うことで処理中に投げられた特定の例外を捕まえて、途中処理を挟むことができます。そのまま例外を投げ返すことで、HttpStatus=500(Internal server error)の結果をブラウザへと返してくれます。


class MyFilter extends ScalatraFilter {

error{
case e : MyException => {
// do anything.
throw e
}
}
}



ただ場合によっては、500番以外のHttpStatusCodeも返したいということもあると思います。
その時は次のようにすることで、特定の例外をキャッチして好きな結果を返すことができます。




class MyFilter extends ScalatraFilter {

error{
case e : NullPointerException => {
response.setStatus(200)
response.addHeader("Content-type","text/plain")
renderResponse("ガッ")
}
case e : AzunyanException => {
response.setStatus(400)
response.addHeader("Content-type","text/plain")
renderResponse("ペロペロ")
}
}
}

2011年12月14日水曜日

Mavenでたまにchecksumエラーで依存を解決できない

最近、mavenで依存性解決しようとすると、
Checksum validation failed, no checksums available from the repository

なエラーでてライブラリを取ってこれないことがある。

レポジトリを確認してみると、本来はpomやjarとともにそのmd5やshaのハッシュ値ファイルも置かれているはずが、それらのレポジトリにはそのファイルが無くどうもそのせいでChecksumが出来ずに失敗してしまっているっぽい。最近だと例えば
org.scala-tools.testing:scalacheck_2.9.0-1:jar:1.9
とか失敗したんだけど、どうもsbt(というかivy?)でデプロイされてそうなやつっぽい。

とりあえず解決策としては、--lax-checksumsのオプションを付けてMavenを実行してやれば解決はする。

PS.ちなみにIntelliJを使っているなら、Run/Debug Configuration > General > Checksum PolicyをWarnにすれば、--lax-checksumsオプションを付けて実行してくれる。

2011年9月22日木曜日

Javaのクラスに同名、同引数のメソッドが定義される件

javaの仕様?と思われますが、ある特定の条件下でリフレクションを使用した場合、困ったことになります。

例えば、このようなクラスを定義します。

scala

trait FirstDef[T]{
def id : T
}

class Conc extends FirstDef[Long]{
def id = 23L
}


java

interfaceFirstDef{
public T id();
}

class Conc implements FirstDef{
public Long id() = 23L
}

そして、ConcクラスをReflectionにかけると・・・


> classOf[Conc].getMethods(println(_))

public long Conc.id()
public java.lang.Object Conc.id()
public final native void java.lang.Object.wait(long) th
public final void java.lang.Object.wait() throws java.l
public final void java.lang.Object.wait(long,int) throw
public boolean java.lang.Object.equals(java.lang.Object
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.ge
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()



なんと、引数なしのid()メソッドが2つ定義されてしまいます!!!
しかし、戻り値はlongとjava.lang.Object。
Reflectionをがりがり使うライブラリを使用している場合、高確率でバグが出ちゃいます。

これは、継承しているTrait(Interface)の型テンプレートを実現するためと思われ、回避不可能です。Reflectionを使用するライブラリを作る場合はこのようなことがあるということに気をつけましょう。

2011年8月5日金曜日

Githubの小技

githubでの小技紹介


便利度★★★



Sourceタブで、tキーを押すとソース検索モードになります。
Pushされているファイルの中から簡単にファイルを探し出せます。




便利度★★



Wikiに、直接MarkdownやTexitileフォーマットのファイルをPushして編集できます。
Wiki -> Git access から見れるレポジトリがWiki用のレポジトリになっています。