メソッド定義のカラクリ
Twitter APIのラッパーである"Rubytter"を使おうと思ってドキュメントを漁ってたんですが、
RubyGems.orgからリンクされているこちらのドキュメントにメソッドが足りない事に気づきました。
http://rubydoc.info/gems/rubytter/1.4.2/frames
じゃあ、ソース見るしかないね、と思って見に行ったら、なかなか面白い実装法。
https://github.com/jugyo/rubytter/blob/master/lib/rubytter.rb
- Rubyメソッド、TwitterAPIのパス、HTTPメソッドの3要素を組にして、並べた配列を定義する。
- Twitter APIのうち変数として格納する部分は "%s" (printfフォーマットみたいな?)で埋めておく。
- def - end のメソッド定義を文字列として作成し、evalで評価することでメソッドが定義される。
- %sの有無でパラメータが必要かどうか決定。
メソッドの一覧が見通せるからうまいなぁ、と思ったけど、
ドキュメントに残らないとか入力チェックが実装できないという意味ではちょっと難かも。
とても参考にはなりました。
pTeX on MacPorts
個人的に、大学1年の頃からTeXで組版をやっていたため、未だに履歴書とかTeXで作成・保存・更新したりしています。
しかしこれまでTeXを触ってきた環境はWindows(またはLinux)であったため、
Macでの組版環境のインストールに関して今やっと調べているところです。
D&D pTeX などあるようですが、せっかくXcode+MacPortsもいれているので、portでいれてみることにしました。
参考にしているのは、こちら。
$ 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
誰得ですけどね。
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 とかで制限することになるんでしょうか。
今のところ譲渡するようなロジックを組む予定はないですが、こういう所は埋込みにするなり考えないとダメですね。