My Brain is Open.

思いついたことを適当に列列と

メソッド定義のカラクリ

Twitter APIのラッパーである"Rubytter"を使おうと思ってドキュメントを漁ってたんですが、
RubyGems.orgからリンクされているこちらのドキュメントにメソッドが足りない事に気づきました。
http://rubydoc.info/gems/rubytter/1.4.2/frames

じゃあ、ソース見るしかないね、と思って見に行ったら、なかなか面白い実装法。
https://github.com/jugyo/rubytter/blob/master/lib/rubytter.rb

  1. Rubyメソッド、TwitterAPIのパス、HTTPメソッドの3要素を組にして、並べた配列を定義する。
  2. Twitter APIのうち変数として格納する部分は "%s" (printfフォーマットみたいな?)で埋めておく。
  3. def - end のメソッド定義を文字列として作成し、evalで評価することでメソッドが定義される。
  4. %sの有無でパラメータが必要かどうか決定。

メソッドの一覧が見通せるからうまいなぁ、と思ったけど、
ドキュメントに残らないとか入力チェックが実装できないという意味ではちょっと難かも。

とても参考にはなりました。

pTeX on MacPorts

個人的に、大学1年の頃からTeX組版をやっていたため、未だに履歴書とかTeXで作成・保存・更新したりしています。

しかしこれまでTeXを触ってきた環境はWindows(またはLinux)であったため、
Macでの組版環境のインストールに関して今やっと調べているところです。

D&D pTeX などあるようですが、せっかくXcode+MacPortsもいれているので、portでいれてみることにしました。
参考にしているのは、こちら。

http://www.churadesign.com/2008/12/10/osx%E3%81%ABlatex%E7%92%B0%E5%A2%83emacsyatexlatextexshop%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%A6pdf%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%99%E3%82%8B

$ sudo port install pTeX +utf8 +motif +hiragino +otf +macosx

いれてみてわかったんですが、ちゃんと日本語新ドキュメントクラスのjsarticle.clsとか、プレゼン作成のbeamer.clsとか含まれてる。

便利だなぁ、これ。

Mongoid 2.0.0.rc.4への更新で早速ハマる

Mongoid の正式版リリースに向けて、rc.4まで出ていたのでインストールしてみた。
その他、Rails3.0.3 もあったりしたので、Gemfileに以下を記述して bundle update 実行。

gem 'rails', '3.0.3'
gem 'mongoid', '2.0.0.rc.4'

問題なく動くんだけど、一部association(参照)の部分でValidationError。

# app/models/parent.rb
references_one :partner

みたいな参照関係があると、こちらに関して自動的にValidationを行うらしい。
参考 : http://mongoid.org/docs/upgrading/
一応、ちゃんと参照してて parent.partner でオブジェクトは得られるのに、ValidationErrorが返ってくる謎仕様。
ひとまず上記ドキュメントにある :validate => false を指定して対応した。

うーん。どうなんだ、これ。

需要ある?

総務省が以下で公開している情報があるのですが、WordやPDFしかないのでデータとして探しづらい。
http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/shigai_list.html

そこで、自前でCSVに変換してみる。

といっても、ベースはPDFの方からテキスト部分をコピペしてスクリプトに乗っけて、
後は改行マッチの正規表現で分割していくだけ。

# -*- coding: utf-8 -*-
require "pp"

pp ary = DATA.read.scan(/([\d-]+) ([^E]*) (\d+) ([CDE]+)/m).map { |data|
  data[1] = data[1].delete("\n")
  data
}
File.open("shigai_list.csv", "w") do |f|
  ary.each { |d| f.puts d.join(',') }
end

__END__
1 北海道江別市、札幌市、北広島市、空知郡南幌町 11 CDE
2 北海道恵庭市、千歳市 123 DE
3 北海道夕張市(富野を除く。) 123 DE

誰得ですけどね。

Fakerモジュールが国際化対応

掲題のとおり、Fakerモジュールが0.9.0からI18Nに対応するようになったようですが、
default = "ja" になってたりすると、日本語の対応する文字列がないよ!って言われてテストが通らなくなっちゃう。

というわけで、以下の指定を$RAILS_ROOT/Gemfileにしてアップデート回避。

group :test do
  gem 'faker', '0.3.1'
end

つか、しばらく更新がなくて枯れてると思ったら、0.3.1 => 0.9.0 っていきなりですな。

rvm+passenger3+nginxで作るRailsアプリケーションサーバ

  • rvm : Ruby Version Manager。コマンド一つでRubyバージョンを切り替えたりgemsetとかを切り替えたりできます。
  • nginx : 軽量WebProxy。HTTPサーバとしても使えます。
  • Passenger : mod_railsとも。Ruby on Railsをデプロイするときに超便利。

まぁ、ここを見ればとりあえずはいいわけですが。

[RVM Document : Passenger]
http://rvm.beginrescueend.com/integration/passenger/

僕の方ではこうしました。

  • RVMはSystem Wide Install ( prefix = /usr/local/rvm )
  • アプリケーション用のバージョンとgemsetをインストールしておく
rvm install 1.9.2-head
rvm use 1.9.2-head
rvm gemset create my_app
rvm gemset use my_app
cd /RailsApp/Path/
gem install bundler # (Rails3の場合)
bundle install # (Rails3の場合)
  • nginx は既存のアプリケーションと分けるためにホームディレクトリ以下におく ( /home/user/nginx )
  • nginx.confには次のような内容を記述
passenger_root /usr/local/rvm/gem/1.9.2-head@my_app/gems/passenger-3.0.2 ;
passenger_ruby /usr/local/rvm/wrapper/1.9.2-head/ruby ;

location / {
    port 8080;
    # ...
    passenger_enabled on;
    root /RailsApp/Path/public;
}

これでアプリケーションを動かすことができる。

rvmを使った理由は、以下の環境を同時に構築するため。

むちゃくちゃさせてる気がするけど、動いてるからよし。

references_oneの挙動

MongoDBの(埋め込みでない)参照を用いる references_one の挙動について。

class Person
  include Mongoid::Document
  field :name
  references_one :car
end

class Car
  include Mongoid::Document
  field :name
  referenced_in :person
end

モデルがこうなっているときに、次のような車の取り合いをやってみますw

p1 = Person.new(:name => "hoge") # => BSON::ObjectId('...000001')
p2 = Person.new(:name => "fuga") # => BSON::ObjectId('...000002')
c = Car.new(:name => "toyoda") # => BSON::ObjectId('...000003')

p1.car = c
p1.save #=> true
c.save #=> true
c.person_id #=> BSON::ObjectId('...000001')

p2.car = c
p2.save #=> true
c.person_id #=> BSON::ObjectId('...000002')

p1.car == c #=> true

参照される側で参照元IDを取得できるのですが、それは一旦最新のものに置き換わってしまうようです。
一方で、ちゃんと参照元から車を参照できることに変わりはない…と。
そうなると、場合によっては validates_uniqueness_of :car とかで制限することになるんでしょうか。
今のところ譲渡するようなロジックを組む予定はないですが、こういう所は埋込みにするなり考えないとダメですね。