ScalaのArrayなどで、Rubyのeach_with_indexのようなインデックス付きイテレーションを使う

Rubyでは

[scala][‘one’, ‘two’, ‘three’].each_with_index |value, index|
p "#{index}番目は#{value}です"
end[/scala]

というような書き方が出来ます。

これをScalaで書くにはどうするか。

[scala]
val list = List("one", "two", "three")
list.zipWithIndex.foreach{ case(value, index) => println("%d番目は%sです".format(index, value)) }[/scala]

という感じになります。

さて、このzipWithIndexですが、ややパフォーマンスが悪いのが難点です。

このzipWithIndexというのは、scala.collection.ItelateLikeにあるメソッドなのですが
もう一つ、zipWithIndexscala.collection.Iteratorにも存在しています。
こちらの方はパフォーマンスが良いようで
こちらを使いたいと思います。

[scala]list.iterator.zipWithIndex.foreach{ case(value, index) => println("%d番目は%sです".format(index, value)) }[/scala]

と、listzipWithIndexの間にiteratorを入れるだけですね。

これでパフォーマンスが上がります。

RailsからMySQLのテーブルを作成する時にLONGBLOBなカラムを作成する方法

RailsからMySQLのテーブルを作成するには

Railsのマイグレート機能には、カラム属性としてbinaryがあるのですが、これを指定してもMySQL上ではBLOBというカラム属性になります。

構文としては
[ruby]create_table :user_photos do |t|
  t.string :name
  t.binary :photo_image
end[/ruby]
もっと大容量のLONGBLOBが欲しい!

という時にはbinaryの所にオプションで:limit => 16.megabyte を指定します。
[ruby]create_table :user_photos do |t|
  t.string :name
  t.binary :photo_image, :limit => 16.megabyte
end[/ruby]
こんな感じですね。