eclipse + scala-2.8.0.RC3 + scalatest-1.2-for-scala-2.8.0.RC3-SN

以下のサイトを参考にしてeclipse + scala-2.8.0.RC3 + scalatest-1.0を試そうとしたんだけど、

http://groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse

こんなエラーがでてはまってた。

error while loading Spec, Scala signature Spec has wrong version expected: 5.0 found: 4.1

原因は、scala-2.8とscala-2.7にバイナリ互換がないから。
http://www.scala-lang.org/node/2124

試そうとしていたscalatest-1.0はscala-2.7でコンパイルされたものなのでscala-2.8では動かない。

解決にはscalatestをソースからscala-2.8でコンパイルする必要がある。

でもJavaの環境に不慣れで途方にくれていたら、以下の場所にscalatest-1.2-for-scala-2.8.0.RC3-SNAPSHOT.jarがあった。こっちを使うようにしたらちゃんとscalatestが動いた。

http://scala-tools.org/repo-snapshots/org/scalatest/scalatest/1.2-for-scala-2.8.0.RC3-SNAPSHOT

Ruby勉強会@札幌-12に参加してきました

Ruby勉強会@札幌-12に参加してきました。

はじめて参加しましたが、初心者にオープンな感じでとても楽しかったです。

内容も硬軟おりまぜてあるので、自分のレベルにあった話、高度な話の両方が聞けて、
お得感がすごいなと思いました。主催者のみなさん、ありがとうございました。

勉強したこと:

  • 「初めてのRuby」の読み合わせ(第4章-4.2文字クラスあたりまで)
  • RubyConfの報告 前田さん
  • Sapporo.rb parse.yコードリーディング告知 mrknさん
  • 「ふりかえりのふりかえり」 Maraigueaさん
  • rubyの中でphpを呼び出すライブラリの紹介(ライブラリ名は失念) 前田さん

msvcr90d.dll not found

Visual Studio 2008 Express Editionでデバッグ版のDLLを作成して起動しようとするとmsvcr90d.dllが見つからないというエラーが発生するようになった。公式な解決方法はまだ見つかってないみたいなんだが、どうもファイルシステムFAT32だと起こるようだ。私の環境だとMSDN Forumでthymiarasという人が投稿した以下の方法で回避できた。

プロジェクトの[プロパティ]->[マニュフェストツール]->[FAT32次善策の使用]を"はい"にする。
http://forums.microsoft.com/msdn/showpost.aspx?postid=2512846&siteid=1&sb=0&d=1&at=7&ft=11&tf=0&pageid=1

ちなみになんで私の環境のファイルシステムFAT32になっているかとういうと、BootCampを利用してMacBook上でWindowsを動かしているからだ。ファイルシステムFAT32にしておくとMac側から書き込みができて便利なのだ。

RubyでCSVを扱うときは配列をハッシュにすると便利な件

RubyCSVを扱う場合は標準ライブラリのCSVか、FasterCSVを使うことが多いと思います。どちらのライブラリも以下のような感じでCSVの1行を配列にしてブロックに渡してくれます。

CSV.open("test.csv", 'r') do |row|
  p row # => ["Yamada", "30", "180"]
  p row[0] # => "Yamada"
  p row[1] # => "30"
  p row[2] # => "180"
end

このときCSVのカラム数が少なければrow[0], row[1]のようにして配列のインデックスアクセスで十分なのですが、カラム数が多くなると、あのデータは何カラム目にあるだっけ? となることがよくあります。

そこでハッシュですよ。

例えば、CSVデータが名前、年齢、身長の順に並んでいるなら、以下のようにカラム名をキーとしたハッシュにすると便利です。

keys = [:name, :age, :height]
CSV.open("test.csv", 'r') do |row|
  p hashed_row = Hash[*keys.zip(row).flatten] # => {:age=>"30", :height=>"180", :name=>"Yamada"}
  p hashed_row[:name]   # => "Yamada"
  p hashed_row[:age]    # => "30"
  p hashed_row[:height] # => "180"
end

Unicodeの数値文字参照をUTF-8とかUTF-16に変換する

NKFの--numchar-inputオプションでできます。

例えばUnicodeの「あ」(U+3042)をUTF-8エンコードした結果を知りたい場合は、

> echo -n 'あ' | nkf -w --numchar-input > hoge.txt

でOK。数値文字参照セミコロンを忘れないように。

nkfの-wは入力をUTF-8に変換します。UTF-16に変換したい場合は、-w16にすればいいです。

echoの-nオプションは改行を出力しないようにするためのものです。

NKFの--numchar-inputオプションは、Unicodeの「叱」(U+20B9F)とかのサロゲートペアが必要なコードポイントもちゃんと変換できます。

NKFの-wオプションはwの後に続けて, 8, 16, B, L, 0を付加することで変換方法を選べます。

C++のマニピュレータはいらない子なの?

ひさしぶりにマニピュレータに触れる機会があった。プログラムの動作がおかしいので調べてみると、固定長じゃないとだめなフィールドにstd::setwで幅を指定していた。set::setwは表示幅を設定するもので、指定幅を超えた場合は切り詰めるんじゃなくてそのまま出力される。なので固定長フィールドが可変長になってしまっていたというものだった。固定長ならofstream::writeを使う。

std::setwの動作を確認しておこうと思ってググってみると、情報少なっ! Cだとちゃんとしたリフェレンスページがすぐ見つかるのに。C++って意外とWeb上のリファレンスが見つからなかったりする。そもそも「マニピュレータ」って。なんのひっかかりもない単語ですな。ちょっと口にだしてみるのが照れる感じもある。

C++のマニピュレータって人気ないなー。無視されているというか。実際私も使ってない。もっぱらprintf派。boost::formatがはやく標準になればいいのに。

MonoDevelopが起動後すぐにUnhandled Exceptionを投げてハングアップする

なぜかソリューションを選択しようとするとUnhandled Exceptionが発生して固まってしまう...
ググって以下の記述を発見。~/.config/MonoDevelopフォルダにあるファイルを全部削除すればOK。

Hello, I had this bug myself, and a long google session came up with the following simple step done from a command line:

rm -rf ~/.config/MonoDevelop

this causes MonoDevelop to reload its list of installed addins or something, did the trick for me at least! (be careful, rm -rf is pretty gnarly if you use it on the wrong directory, if you don't know already.)

http://www.nabble.com/MonoDevelop-doesn't-run---%22MonoDevelop-Deployment%22-exception-td16353720.html