ついに完結!友達の家でふもっふのラグビーの話を見てから幾年月、長かった!賀東先生、お疲れさまでした。
読み終えたばかりなのであまりまとまらないけど、とりあえず書く。以下ネタバレ注意。
ついに完結!友達の家でふもっふのラグビーの話を見てから幾年月、長かった!賀東先生、お疲れさまでした。
読み終えたばかりなのであまりまとまらないけど、とりあえず書く。以下ネタバレ注意。
ruby 1.9.2が出たのでrvmを入れ直して整理した。
$ gem install --user-install rvm $ PATH=$HOME/.gem/bin:$PATH $ rvm-install $ vi ~/.zshrc # ~/.gem/binをパスに追加、rvmの初期化コードを追加 $ exit
1.9.2と1.8.7をインストールする。 ただしMacPortsで入れたreadlineを使うために今回はオプションを付ける。
$ rvm install 1.8.7 -C "--enable-shared=true,--with-opt-dir=/opt/local" $ rvm install 1.9.2 -C "--enable-shared=true,--with-opt-dir=/opt/local"
とりあえず1.8.7にRails2.3のgemsetを作り、1.9.2にRails3 RCのgemsetを作る。 そして前者をデフォルト(シェルを立ち上げたときに最初に読み込む)のgemsetとする。
$ rvm use 1.8.7@rails23 --create --default $ gem install rails -v 2.3.8 $ rvm use 1.9.2@rails3rc --create $ gem install rails --pre
rails2.3で作ったプロジェクトでは1.8.7@rails23を使いたいので、RAILS_ROOTで次のように.rvmrcを作る。rails3rcのほうも同様。
$ echo "rvm use 1.8.7@rails23" > .rvmrc
例えば、外部にある認証系がこちらのAPIを叩く場合など、セッションが継続してないからsessionからデータを入れられないんだけど、session_idはわかってるからどうにかしたいな、というときに。
今更ながらRails 2.2.2で試してみた。2.3.x以降ではCGIモジュールは破棄されてRackに移行したので、全く変わってる気がする。
class SomeController < ActionController::Base
session :off
def index
session_id = (get session_id ...)
# CgiRequestとRackRequestに対応
options = request.class.get_const("DEFAULT_SESSION_OPTIONS").merge(:session_id => session_id)
my_session = CGI::Session.new(request.cgi, options.stringify_keys)
my_session[:foo] = :bar
my_session.close
end
end
まずMacPortsで本体と辞書を入れて読み込む辞書を設定する。
$ sudo port install mecab $ sudo port install mecab-ipadic-utf8 $ sudo vi /opt/local/etc/mecabrc # 編集内容は下記を参照
mecabrcは次のように書き換える。
dicdir = /opt/local/lib/mecab/dic/ipadic-utf8
次にrubyバインディングのmecab-rubyをインストールする。 ソースを SourceForge から落としてきて展開し、そのディレクトリで以下を実行。
$ ruby extract.rb $ vi Makefile # 編集内容は下記を参照 $ make $ ruby test.rb # これでエラーが出なければ問題無し $ sudo make install
Makefileは次のように/opt/local/libを読むように修正を加える。
LIBS = -lstdc++ -ldl -lobjc -L/usr/local/lib -L/opt/local/lib -lmecab
参考: MeCab + Ruby で形態素解析(わかち書き)
irbで次をやってみる。
require 'MeCab'
wakati = MeCab::Tagger.new('-O wakati')
puts wakati.parse('最近の夜は寒い')
mecab = MeCab::Tagger.new()
node = mecab.parseToNode('最近の夜は寒い')
while node do
puts "#{node.surface}\t#{node.feature}"
node = node.next
end
参考: MeCab + Ruby で形態素解析(わかち書き)
地味にはまったのがnewするときの引数。特にオプションを指定しないなら上記のようになにも与えないか、もしくは空の文字列を与える。明示的にnilを与えるとエラーになるので要注意。
モデルの機能ごとにモジュールにまとめてあとからまとめてincludeしたいというときに、どうせならその機能のために用意したちょっと複雑なnamed_scopeも同じように外に出してしまいたい。
そんな場合にはincludedとclass_evalを使う。
class Message < ActiveRecord::Base
include Extensions::Search
end
module Extensions
module Search
def self.included(mod)
mod.class_eval do
named_scope :name_like, lambda { |arg| {
:conditions => ["name LIKE ?", "%%arg%%"]
}}
end
end
end
end
> Message.name_like("ob").first.name #=> "Bob"
named_scopeも結局はクラスメソッド。この方法はnamed_scope以外にも利用できる。
oauth gem(0.4.0)のoauth_callbackでちょっとはまったのでメモ。
/rubyを参考に、Twitterに登録しているコールバックURLとは別にテスト用のURL(が使いたかったので、いろいろ試してみた結果、次で動いた。
test_callback = "http://example.org/login" request_token = consumer.get_request_token(:oauth_callback => test_callback) aurhorize_url = request_token.authorize_url(:oauth_callback => test_callback)
なんで両方で指定しなければならないのかは謎。
以前daemonを起動してリポジトリ立てる方法について書いたけど、今回はgitのリポジトリを立てる(SSH経由) を参考にSSH経由でできるようにやってみた。
リポジトリを置くサーバのホスト名はexampleとする。
リポジトリを操作するためのgitユーザをexampleサーバに追加する。 Mac OS 10.6の場合、ユーザは dsclで追加 する。
このときシェルにgit-shell(MacPortsで入れたなら /opt/local/bin/git-shell にある)を設定する。こうすることでpush,pullのみを受け付けるようになる。
example:/Users/gitディレクトリ配下にリポジトリを集約するreposディレクトリを作成し、今回はprojectというリポジトリを作成してみる(末尾に.gitを付けるのは慣習?)。
% cd /Users/git % sudo -u git mkdir repos % sudo -u git mkdir repos/project.git % cd repos/project.git % sudo -u git git init --bare
gitユーザにSSHでログインするための鍵を追加する。
% cat ~/.ssh/id_rsa.pub > /Users/git/.ssh/authorized_keys
$ git clone git@example:repos/project.git
$ cd project
$ git push origin push
ただこのときに次のようなエラーがでるかもしれない。
$ git push -v origin master Pushing to git@example:repos/project.git To git@example:repos/project.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@example:repos/project.git' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details.
原因はよくわかってないのであれだけど、とりあえず-fオプションをつけて再度実行すればちゃんとpushされている。
プロジェクトの設定画面で「リポジトリ」タブを選択し、「バージョン管理システム」にgit、「Path to .git directory」に「/Users/git/repos/project.git」を設定すれば良い。
iPhoneアプリを開発する際にiPhone Dev Centerでやる作業がこまごまとして面倒くさいので、そのときに参考にしたサイトをまとめておく。
アプリを実機で動かす を参照。
このときProvisioning Portalで作成したAppIDは申請フローの際に使い回す。
全体の流れは 【iPhone】App Store申請用アプリをビルドする を参照するとよい。
審査をするアプリを作る際のDistributionというConfigurationの作り方は 目指せ!iPhoneアプリ開発エキスパート 第10回 App Storeでアプリを開 を参照。
申請の際、スクリーンショットの追加方法がちょっと分かりづらい。 Choose Fileボタンでファイルを追加していき、Upload Filesボタンで一気にアップロードする。 このとき優先度の低いものから追加していく。つまり一番最後に追加した画像がPrimary Screenshotとして扱われる。
iAd、Game Centerまわりの影響で、ここ1ヶ月ぐらいで申請フローがちょっと変更されたらしい。iAdは使用しないならEnable欄は操作せずにContinueして良し、Game Centerも利用しないならNoでContinueすれば良し。
一時的に任意のディレクトリをHTTPサーバに公開したくなったので、WEBrickを起動するスクリプトを組んでみた。既存のものがある気がしなくはないけど、OptionParserの勉強という意味も含めて。
#!/usr/bin/env ruby
require 'optparse'
require 'webrick'
include WEBrick
# WEBrickを起動する際のオプションのデフォルト値
WebrickOptions = {
:Port => 8000,
:DocumentRoot => Dir::pwd,
}
OptionParser.new do |opt|
# パース方法を設定する
# オプションが指定されていた場合にブロックが評価される
opt.on('-p', '--Port N', Integer) { |v| WebrickOptions[:Port] = v }
opt.on('-d', '--DocumentRoot PATH') { |v| WebrickOptions[:DocumentRoot] = v }
# 実際にパースを行う
opt.parse!(ARGV)
end
# WEBrickを起動する
s = HTTPServer.new(WebrickOptions)
trap("INT") { s.shutdown }
s.start
オプションを指定しない場合は8000番ポートにカレントディレクトリをドキュメントルートとして起動する。
$ ruby webrick
-pオプションもしくは–Portオプションでポート番号を指定し、-dオプションもしくは–DocumentRootでドキュメントルートを指定する。
$ ruby webrick -p 8080 -d ~/Sites
これらの値を指定しない場合にはOptionParser::MissingArgumentが投げられる。
$ ruby webrick -p #=> OptionParser::MissingArgument
なおここでは使っていないが、オプションの引数を必須としない場合には次のように[を含める。
opt.on('-p', '--Port [N]', Integer) { |v| WebrickOptions[:Port] = v }
引数が与えられたときにはopt.onのブロックにその値が渡され、引数が与えられなかった場合には「オプションが指定された」という意味でtrueが渡される。
NSPreferredMailCharset on LeopardをSnow Leopardに対応させようとしたけど、ちょっと挫折した。
やったことをとりあえずメモっておく:
Console.appを見ながら作業したのでここまでは合ってるはずなんだけど、ここで”Domain=NSCocoaErrorDomain Code=3588″が出た。どっかでエラーが出てるんだけど、今すぐにはちょっとわからない。