rubyで㈱などの機種依存文字をUTF-8に変換する

“㈱”や”㈲”などの文字をCSVなどからShift_JISで取り込み、rubyでUTF-8に変換するときにUndefinedConversionでハマった。

"㈱".encode('UTF-8', 'Shift_JIS')
> "\x87\x8A" from Shift_JIS to UTF-8
> /User/sanojimaru/workspace/example/lib/string.rb:849:in `encode': "\x87\x8A" from Shift_JIS to UTF-8 (Encoding::UndefinedConversionError)

Shift_JISは一部の機種依存文字に対応していないので、CP932(Windows-31J)を使えば良い。

"㈱".encode('UTF-8', 'CP932')

Tags: ruby

ActiveRecordのattribute methodをオーバーライドするとき

ActiveRecordのattributeメソッドをオーバーライドする場合、オーバーライド元のattributeを呼ぶには(read|write)_attributeを使う。

例えば、とあるモデルExampleのhogeという属性が空の場合に、fugaという属性の中身を代替として返したい場合。

class Example < ActiveRecord::Base
  def hoge
    read_attribute(:hoge) || fuga
  end

  def fuga
    read_attribute(:fuga) || 'なんもないっす'
  end
end

また、hogeに値をセットしたとき、fugaが空ならfugaにも同じ値をセットしたい場合。

class Example < ActiveRecord::Base
  def hoge=(value)
    write_attribute(:hoge, value)
    fuga = value if fuga.empty?
  end
end

これは、ActiveRecordの[]、[]=と同じ実装だ。 attributeメソッドは動的に作られているので、以下のようにsuperを使うのは間違い。

class Example < ActiveRecord::Base
  def hoge
    super|| fuga
  end
end

emacsの画面分割

左右に分割:

M-x 3

上下に分割:

M-x 2

現在の領域を削除:

M-x 0

ハインリッヒの法則

1件の重大事故の前には29件の軽微な事故があり、その前には300件のヒヤリとする出来事が起きている、という法則。

塵も積もれば何とやら、は塵を小まめに片付ければ難なく防げる。

ビタミンの最小律の法則

日々摂取している様々なビタミンのうち、実際に栄養素として作用するのは最も少なかったビタミンの摂取量に制限されてしまう。

過ぎたるは及ばざるが如し。