サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
猫
netpenguin.hatenadiary.org
このエントリは Scala Advent Calendar の 18 日目になります。 Dispatch というライブラリを使ってみます。 Dispatch とは Dispatch というのは、Scala 用 の HTTP クライアントライブラリです。Dispatch には classic と reboot という二種類があり、前者は古い方、後者は一から書き直された新しい方っぽいです。 そして、「Dispatch scala」でみつかる http://dispatch.databinder.net/Dispatch.html は reboot の方です。でも、github で 単に dispatch となっているのは classic で、reboot の方は dispatch/reboot です。ドキュメント上は無印=reboot、github上は無印=classicという感じでなんだか混
ものすごい久々にブログを書くのですが、あまり役に立たない情報です(汗 ここ半年ほど C# を使用するプロジェクトに携わっています。C# は 4.0 から?だと思うのですが、ジェネリクスの型パラメータに変位指定(in とか out とか)ができるようになっています。 共変が 、反変が と、型パラメータを使用できる場所が分かりやすい指定になっています(out = 戻り値の型として使用可能、in = 仮引数の型として使用可能)。 また、いつのころからか導入されていた LINQ もあるのでリスト操作を非常にやりやすくなっています。しかも基本的に遅延リスト(というか、IEnumerable といイテレータを取得可能なインタフェース)なのも、慣れると嬉しいです。 しかしながら、LINQ を使っていればいるほど、SelectMany(Scala でいうところの flatMap) を使っていればいるほど、
Scala から S2JDBC を利用するときに気付いたこととかを、いくつか書いておきます。 タイプセーフ API S2JDBC では Operations クラスや S2JDBC-Gen により生成した Names クラスを、以下のように利用することで型や名前の間違いをコンパイル時に気付けるようになっています。 // インポート import static org.seasar.extension.jdbc.operation.Operations.*; import static sample.entity.FooNames.*; // eq は Operations, name() は FooNames のメソッド public List<Foo> findByName(String name) { return jdbcManager.from(Foo.class) .where(
トレイトのメンバとして抽象 val を宣言した場合、初期化処理のタイミングでは、その val の値が null になっていることがあります。 以下の例では、Foo の初期化時には value2 が null になっています。 object Sample1 { def main(args: Array[String]) { val foo = new FooImpl println("[main]foo.value1 is "+foo.value1) println("[main]foo.value2 is "+foo.value2) } trait Foo { // value は実装クラスで設定する val value1: String val value2: String // Foo の初期化処理 println("[foo]value1 is "+value1) println("
Cake Pattern の説明は Programming Scala よりも、http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/ の方が分かりやすかったです。 一応、自分なりに理解できたつもりでいるので、とりあえず簡単な例を書いておきます。 出現するコンポーネントは Foo、Bar の二つ。Bar が Foo に依存している例です。 package sample01 trait FooComponent { val foo: Foo class Foo { def output(text: String) = println(text) } } trait BarComponent { self: FooComponent => val bar: Bar class Bar { def pr
Liftを使用しての開発では mvn scala:cc と mvn:jetty:run をしてファイル保存のタイミングで変更が反映されるようにしていました。 scala ファイルを変更すると scala:cc により自動でコンパイルが実行され、class ファイルが変更されたことにより Jetty がクラスをリロードするという流れです。 ただ、ときどき Jetty がリロードしてくれなかったりと、ちょっと動作がいまいちな時があったので、JRebel を使用して HotDeploy する方法に変えました。 JRebel の設定などは JavaRebelとscala:ccで快適Lift開発 - スコトプリゴニエフスク通信 を参考にしました。 また、JRebel は scala を応援しているらしく、scala から生成したクラスファイルに限り無償でライセンスを得ることができます。scala 開
冬休み中にARをやってみようと思い*1、とりあえずサンプルを動かしてみました。 Java で使える AR 用のライブラリを探したところ、ARToolkit を Java に移植した NyARToolkit というものがあったので、これを試すことにしました。 NyARToolkit は http://nyatla.jp/nyartoolkit/wiki/index.php から入手しました。「ダウンロード」のリンク先から NyARTookkit for Java の zip ファイル(NyARToolkit-2.4.2.zip)をダウンロードしました。 続いて、ダウンロードした zip ファイルに含まれる readme.ja.txt に従いいくつかのソースフォルダを eclipse のプロジェクトにインポートします。とりあえず JMF + Java3D のサンプルをためそうと思い、以下のフォ
前に、Java の DI コンテナと Scala の組み合わせはどうにもいまいちと Twitter でつぶやいていたら、とある人から Programming Scala に DI のサンプルがあるよ!っておしえてもらいました。 以下の URL は Programming Scala の DI についての箇所です。*1 http://programming-scala.labs.oreilly.com/ch13.html#DependencyInjectionInScala 以下、私が理解した内容を忘れないようにメモっておきます。 読んでみると、DI コンテナのかわりに Cake パターンなる方法で、DI が対象とする問題を解決出来る模様です。*2 例として出ている Twitter クライアントのコンポーネントをクラス図にしてみました。 各コンポーネントの役割は以下のとおり。 Twitter
Lift の練習として、Comet を使用してみることにした。最終的には Comet によるチャットが作れればいいかな・・・(希望) とりあえずは、表示されている時間を Comet を使用して1秒毎に更新してみる。 情報源は id:yuroyoro さんのエントリと、TheLiftBook.pdf*1(以後、PDFと記す)を使用。 Comet によるチャットは Lift の wiki にもあるのだけど、そこはスルーの方向で。 雛形作成 お約束だけど、mvn の archtype:generate で雛形作成。 Windows の場合、\ で次行に入力を続けることが出来ないので、\ を除去して一行で入力。 >mvn archetype:generate -U \ -DarchetypeGroupId=net.liftweb \ -DarchetypeArtifactId=lift-arche
Java のライブラリを利用していると None を返してほしいところで null を扱うことになります。if (value == null) ... とか value match { case null => .... } とか書くのに嫌気がさしてきたので、implicit conversion を利用して Option 型に変換するようにしました。 作成した implicit conversion のコードは以下のとおり。 object OptionConversion { implicit def anyToOptionConversion[T](value: T) = new OptionConversion(value) } class OptionConversion[T](value: T) { def toOption: Option[T] = value match {
Scala の Actor は、メッセージ処理中に例外が発生すると Actor 自体が終了するようになっています。 例外を処理したい場合に、今までは case を try 〜 catch で囲んでいたのですがどうもいまいちな感じでした。以下は try 〜 catch で囲んでいる例です。 actor { loop { react { case 'foo => try { ... } catch { ... } case 'bar => try { ... } catch { ... } } } } しばらくは忘れていたのですが、ふとしたときに link を使って例外を処理する Actor を作ればよいことに気付きました。 下記の例では、1 秒後に正常終了、2 秒後に例外発生、3 秒後にプログラムを終了する(トリガになる) Actor が起動します。 import scala.actors.
Scala では Console.readLine などを使うことで、標準入力を読み出せます。 val line = readLine println(line) 一方、すべての行を読み出す場合は Stream を使うと、Scala らしく書けました。 val lines = { def tail: Stream[String] = readLine match { case null => Stream.empty case line => Stream.cons(line, tail) } tail } lines foreach println
※(2009/12/14)現在は、IntelliJ IDEA 9 の正式版がリリースされています。Plugin Manager より Scala Plugin を正常に利用できるため、正式版の利用をお勧めします。 ちょっと前に IntelliJ IDEA がオープンソース化しました。Eclipse の Scala プラグインはまっとうに動かないので、これを機に Scala 用の IDE として、IntelliJ + Scala Plugin を使ってみようかと。 前に試したときは Scala プラグインが incompatible になってしまいうまく動いてくれなかったのですが、先日 twitter 上で親切な方(@tatsuya6502)に「EAP ならできるよ!」とおしえてもらった*1ので、さっそく私もインストール&セットアップしました。 事前準備 JDK が未インストールならば、ht
カスタムコンポーネントを作っていて、ちょっとはまりそうになったことのメモです。 Flex の作法ではプロパティ値の変更時にいきなり UI を更新してはいけません。プロパティ値が変更されたときは、変更を記録しておいて invalidateProperties を呼び出すに留めます。invalidateProperties を呼び出しておくと、一連の処理後*1に commitProperties が呼び出されます。このタイミングで変更のあった*2プロパティの値とそれに影響される他の値を確定し、必要であれば invalidateSize や invalidateDisplayList を呼び出して、UI を更新します。 この辺りのことは、id:s-ohira さんの asでカスタムコンポーネント(1)、(2)、(3) が詳しいです。 簡単にまとめると、 プロパティ値を変更する invalidat
共変 Java の型パラメータは共変では無いので、List<Number> に List<Integer> を代入できないのは有名。これを許容していないのは、型の安全性を保つために他ならないのだけど、配列は許容していたりする*1。 Number[] array = new Integer[1]; array[0] = 0.1d; ただ、Java の配列は共変なのだけど、型の安全性をコンパイル時に保障してくれないというおまけつき。実際に Integer の配列を Object[] の変数に代入して、Double とかを格納しようとすると、実行時に例外がでる。 Exception in thread "main" java.lang.ArrayStoreException: java.lang.Double at CoVariantArray.main(CoVariantArray.java:
ずいぶん前から気にはなっていたのだけど、CentOS を入れている自鯖で、5秒間隔ぐらいで HDD へのアクセスが発生し続けています。 HDD を省電力状態で動かそうとしている人達も、同様の現象で困っているらしく原因と解決策がいくつか見つかったので試してみました。(でも、改善していません(汗)) pdflush の動作間隔を長くする http://lets-ubuntu.yui.at/tips/tips_hdparm.html を参考に設定。 一時的に設定するのであれば、ThinkItの記事(http://www.thinkit.co.jp/free/tech/23/5/)にあるように、echo を使用して書き込む手も。 [root@gentoo ~]# echo 600000 > /proc/sys/vm/dirty_writeback_centisecs [root@gentoo ~]
適当にメモ。 alias_maps mydestination に合致したメールアドレスのユーザ名を対象とする 通常、ユーザ名部分のみが対象として渡される でも、念のために正規表現は /^username(@.+)?$/ のように、@ 以降の有無に影響されないようにしておく ユーザ名部分のみを対象とするため、サブドメインの違いにより異なる動作をさせることはできない username "| /foo/bar/baz.sh" な書式で、プログラムを起動できる 通常は username realusername で、username@mydestination 宛てのメールを、realusername 宛てのメールとして扱える alias_maps=hash:/etc/aliases, regexp:/etc/postfix/aliases.regexp (main.cf 内) hash のテー
197X という 1970年代生まれの人らによる集まりで、Scala の布教活動してきました。 197X と当日の様子については以下を参照。 197Xs's wiki Twitter #197X 発表に使用したスライドはこちら。 197x 20090704 Scalaで並行プログラミングView more presentations from NetPenguin. アクターを使って作ったクイックソートのソースコードは CodeRepos に置いてあります。興味のある方はどうぞ。 http://svn.coderepos.org/share/lang/scala/sandbox/samples/actor/QuickSorter.scala 説明しきれませんでしたが actor も receive も react も loop も !、!?、!! もすべてメソッドです。 Scala の場合
すでに物理マシン上で稼働している CentOS を、試しに VMWare ESXi に移行してみます。 参考にしたサイトは http://blog.yunayuna.net/2008/12/ です。 VMWare Converter の入手 http://www.vmware.com/download/converter/ にアクセスして、ページの右側からアカウントを登録し、メールによるアクティベーションを行います。 アクティベーション後、Windows 用と Linux 用の VMWare Converter がダウンロードできるようになります。 今回は CentOS の移行なので、Linux 用の VMWare Converter をダウンロードします。 VMWare Converter のインストール ダウンロードした VMWare Converter を展開、インストールします。
S2JDBC を使用している Web アプリを Jetty 上で起動した場合に、以下のような java.lang.LinkageError が発生することがあります。 java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.seasar.extension.dbcp.impl.XAConnectionImpl.getXAResource()Ljavax/transaction/xa/XAResource;" the class loader (instance of org/mortbay/jetty/webapp/WebAppClassLoader) of the current class, org/seasar/
複数のカードを一つにまとめられる Coin とかとおなじようなアレ。 Coin と違うのは、IC チップや NFC にも対応している点。 公式ページは https://plastc.com/ です。 以下、メモ。 EMV 規格に対応した IC チップ VISA, Master, Amex, DISCOVER, JCB, Union Pay に対応らしい アプリ画面のスクリーンショットをみると citi bank のロゴも…… 日本の銀行のキャシュカードの IC チップにも対応してほしぃ…… (EMV 規格みたいなのがないのかな?) support not available at launch の記述があり、後日ファームウェア更新により対応するっぽい https://faq.plastc.com/hc/en-us/articles/207648696-Will-Plastc-Card-wo
仕事で、JavaScript を使用して画面内の入力項目を無効にする処理を書きました。最初は以下のような感じです。 ※説明を簡単にするために input タグのみを処理対象としています。 var tags = document.all.tags("input"); for (i=0; i<tags.length; i++) { tags[i].disabled = true; } ためしに動かしたときは、上記内容で特に問題なく動作していました。 が、対象となる input タグの個数が増えると、急激に処理に時間がかかるようになってしまいました。 入力タグを無効にしているだけなのですが、300個ぐらいで40秒〜1分近く時間がかかってしまいます。 どうやら、type="text" や type="password" の入力タグの有効・無効を切り替えるのが遅いようです。なので、切り替えずに、無効
このページを最初にブックマークしてみませんか?
『NetPenguinの日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く