Scala

Dispatch を使ってみる

このエントリは Scala Advent Calendar の 18 日目になります。 Dispatch というライブラリを使ってみます。 Dispatch とは Dispatch というのは、Scala 用 の HTTP クライアントライブラリです。Dispatch には classic と reboot という二種類があり、前者…

ダウンキャスト

Scala でプログラミングしていると型パラメータやパターンマッチがあるからか、ダウンキャストが必要になることがあまり無いです。なのですが、パターンマッチの多用によりインデントが深くなってしまうのが悩ましかったりします。 例えば dispatch.json (sj…

リスト操作対応表

おもいつきでだらだら書いたので、足りていない可能性の方が高いです。 ちなみに Perl には Scala の List 見たいなものや、Stream みたいなものは標準では用意されていないため、通常は配列を使います。 @ で始まる変数が配列です。でも配列への参照も良く…

おまけ

ついでに、良く使う範囲での Scala と C# のリスト操作対応表。 Scala C# map Select flatMap SelectMany filter Where foldLeft Aggregate *1 foldRight なし reduceLeft Aggregate *2 reduceRight なし foreach なし zip Zip *3 すぐに思いつくのは、この…

S2JDBC で UUID 型を利用する

テーブルの主キーに UUID を使いたい場面は結構あるとおもうのですが、S2JDBC は UUID を利用できるようにはなっていないようです。 ならばってことで、Dialect を拡張して、UUID を使えるようにしてみました。対象の DBMS は H2 です。H2 ならば UUID 型を…

Scala から S2JDBC を利用するときに気をつけること

Scala から S2JDBC を利用するときに気付いたこととかを、いくつか書いておきます。 タイプセーフ API S2JDBC では Operations クラスや S2JDBC-Gen により生成した Names クラスを、以下のように利用することで型や名前の間違いをコンパイル時に気付けるよ…

トレイトの初期化処理で抽象 val にアクセスする

トレイトのメンバとして抽象 val を宣言した場合、初期化処理のタイミングでは、その val の値が null になっていることがあります。 以下の例では、Foo の初期化時には value2 が null になっています。 object Sample1 { def main(args: Array[String]) { …

Chain of Responsibility っぽいことを trait を利用して実装してみる

Chain of Responsibility というよりも、http://itpro.nikkeibp.co.jp/article/COLUMN/20081009/316549/?P=2 の方法を変形しただけなんですけどね。まず、リクエストを処理するメソッドを持つ、ハンドラの trait をつくります。 trait Handler { def handleR…

Cake Pattern の簡単な例を書いておく

Cake Pattern の説明は Programming Scala よりも、http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/ の方が分かりやすかったです。一応、自分なりに理解できたつもりでいるので、とりあえず簡単な例を書いておきます。 出現す…

親トレイトで定義されている val を、子トレイトで override するとインスタンス化に失敗する

子側のトレイトで親の val を override すると、コンパイルは成功するにも関わらず、実行時に ClassFormatError が出ます。 以下は現象を再現させるコード。 trait Base { val value: String = "base" } trait Child extends Base { override val value: Str…

SiteMap も JRebel(JavaRebel) で HotDeploy されるようにする

Liftを使用しての開発では mvn scala:cc と mvn:jetty:run をしてファイル保存のタイミングで変更が反映されるようにしていました。 scala ファイルを変更すると scala:cc により自動でコンパイルが実行され、class ファイルが変更されたことにより Jetty が…

main メソッドが見つからないといわれたら・・・

先日、Scala プログラムを書いていたときのことです。object に main メソッドを定義しているにもかかわらず、main メソッドが見つからないといわれました。 以下のようなプログラムです。 import java.awt.Dimension import javax.swing.JFrame object Samp…

The Cake Pattern による DI

前に、Java の DI コンテナと Scala の組み合わせはどうにもいまいちと Twitter でつぶやいていたら、とある人から Programming Scala に DI のサンプルがあるよ!っておしえてもらいました。以下の URL は Programming Scala の DI についての箇所です。*1 …

null を None に変換する implicit conversion

Java のライブラリを利用していると None を返してほしいところで null を扱うことになります。if (value == null) ... とか value match { case null => .... } とか書くのに嫌気がさしてきたので、implicit conversion を利用して Option 型に変換するよう…

scala.swing.PopupMenu を実装

Scala には swing をラップした scala.swing というパッケージが標準で含まれています。Panel、Button、Table などのコンポーネントが Scala から扱いやすい形で提供されている一方、 JPopupMenu や JTree といったコンポーネントは提供されていません。 し…

Actorでの例外処理

Scala の Actor は、メッセージ処理中に例外が発生すると Actor 自体が終了するようになっています。 例外を処理したい場合に、今までは case を try 〜 catch で囲んでいたのですがどうもいまいちな感じでした。以下は try 〜 catch で囲んでいる例です。 a…

標準入力をリストみたいに扱う

Scala では Console.readLine などを使うことで、標準入力を読み出せます。 val line = readLine println(line) 一方、すべての行を読み出す場合は Stream を使うと、Scala らしく書けました。 val lines = { def tail: Stream[String] = readLine match { c…

Scala 発火村(hack-a-thon)にいってきました

22(日)に行われた Scala 発火村に行ってきました。主催の id:yuroyoro さん、お疲れ様でした。 皆さん、黙々と学習&コーディングという感じでした。私はというと、twitter 上の TL 読むのに忙しくて*1、あまりコーディングできていなかったりします(汗 それ…

IntelliJ IDEA 9 Community Edition + Scala Plugin セットアップ手順

※(2009/12/14)現在は、IntelliJ IDEA 9 の正式版がリリースされています。Plugin Manager より Scala Plugin を正常に利用できるため、正式版の利用をお勧めします。ちょっと前に IntelliJ IDEA がオープンソース化しました。Eclipse の Scala プラグインは…

リストからインデクスをキーとしたマップを生成 - 解決

昨日の続きです。 id:yuroyoro さんのおかげで、ものすごいすっきり書けちゃいました。 val map = Map(list.zipWithIndex.map(_.swap): _*)これだけ。なんてすっきり! Java だったら・・・ final Map<Integer, String> map = new HashMap<Integer, String>(); for (int i=0; i</integer,></integer,>

リストからインデクスをキーとしたマップを生成

まれに必要になる処理なのですが、美しく書くにはどうしたものか・・・ リストのサイズと Range を使えばもっとシンプルにかけることに気付きました。というか、気付けよ私(ase scala> val list = List("foo", "bar", "baz") list: List[java.lang.String] =…

共変とか反変とか

共変 Java の型パラメータは共変では無いので、List<Number> に List<Integer> を代入できないのは有名。これを許容していないのは、型の安全性を保つために他ならないのだけど、配列は許容していたりする*1。 Number[] array = new Integer[1]; array[0] = 0.1d; ただ、Java </integer></number>…

Lift フレームワークを使って Comet をためす(1)

Lift の練習として、Comet を使用してみることにした。最終的には Comet によるチャットが作れればいいかな・・・(希望) とりあえずは、表示されている時間を Comet を使用して1秒毎に更新してみる。情報源は id:yuroyoro さんのエントリと、TheLiftBook.pdf…

implicit def を使って、Scala で null 結合演算子を実現してみた

Scala の implicit def を利用して、C# などにある null 結合演算子を実現してみました。null 結合演算子というのは、対象としている値が null だった場合に別の値を返す演算子です。*1たとえば以下の C# コードでは、value3 の "foo" が表示されます。 stri…

Actor の返信待ちでタイムアウトを指定

返信待ちでタイムアウトみたいなキーワードで飛んできた人がいたようなので、即席でためしてみました。 import scala.actors.TIMEOUT import scala.actors.Actor._ object WaitResponseWithTimeout extends Application { val foo = actor { loop { receiveW…

型レベルプログラミング

kmizu(id:kmizushima)さんが twitter でつぶやいていたリンク先を、ちょろっと試してみました。 まーたScalaで型レベルプログラミングやろうとしてるけったいな人が。 http://twitter.com/kmizu/statuses/3630059097 リンク先: http://apocalisp.wordpress.c…

LT 大会で Scala のアクターについて発表しました

197X という 1970年代生まれの人らによる集まりで、Scala の布教活動してきました。 197X と当日の様子については以下を参照。 197Xs's wiki Twitter #197X 発表に使用したスライドはこちら。197x 20090704 Scalaで並行プログラミングView more presentation…

Actor の link について訂正

以前、Actor の link について、以下のように書いたのだけど、勘違いしてたみたいなので訂正。 注意点?として link は、リンク元のアクタ内で設定する必要があります。 リンクは双方向になるように設定されるため、リンク元とか関係ないです。 link メソッ…

アクタモデルによるプログラミング

Scala でアクタ(scala.actor.Actor)を使ってプログラミングしていると、他のコンポーネントというかアクタに処理を依頼したあと、処理結果が帰ってくるまで待つような書き方をしなくなってくる。 一応、Actor では「!?」を使ってメッセージそ送信することで…

PartialFunction

PartialFunction - syttruの日記 orElseというのは、PartialFunction同士をつなげて力を合わせるメソッドです。部分的にしか機能しなかったろくでなしの関数たちが、お互い補完しあって協力する関数を作ることができます。 var superPf = (pf1 orElse pf2 or…