cmigemoの再インストールではまった話

homebrewを使ってインストールしたcmigemoを再インストールした時にはまった話。

経緯

cmigemoはいっとき、homebrewからインストール出来ない状態が続いていました。ここ参照
たしか、Cellarというディレクトリにインストールされないで、/usr/local に直接インストールされるのはだめよって意味だと思います。 ここ参照
なので、brew doctor するとwarningが必ず出ていたんですが、下手にいじるとmigemo使えなくなりそうな気がして、放っておきました。
でも、最近 このコミット で対処されたようなので、warningを消そうと意気込んでみました。

やったこと

brew doctor すると、このようなWarningが出る。

-> brew doctor 
	Warning: Your Homebrew is outdated
You haven't updated for at least 24 hours, this is a long time in brewland!
Warning: Unbrewed dylibs were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
    /usr/local/lib/libmigemo.1.1.0.dylib

意味は

homebrewが意図しないファイルがあるから削除しないとビルドする時にトラブルの原因になるよ

ということ。ここにも対処法が出ている。

でも、これを放っておいて、cmigemoを再インストールしようとすると

-> brew install cmigemo
==> Downloading http://cmigemo.googlecode.com/files/cmigemo-default-src-20110227.zip
######################################################################## 100.0%
==> Patching
patching file src/wordbuf.c
==> chmod +x ./configure
==> ./configure --prefix=/usr/local/Cellar/cmigemo/20110227
==> make osx
==> make osx-dict
==> make utf-8
==> make osx-install
==> Caveats
See also https://gist.github.com/457761 to use cmigemo with Emacs.
You will have to save as migemo.el and put it in your load-path.
Warning: Could not link cmigemo. Unlinking...
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link cmigemo'
==> Summary
/usr/local/Cellar/cmigemo/20110227: 21 files, 12M, built in 7 seconds

とエラーになる。

なので、無駄なcmigemoが残ってるんだろうということで

-> brew remove cmigemo   
Uninstalling /usr/local/Cellar/cmigemo/20110227...

として再度インストールしてもやっぱり同じようなエラーになる。

では、最初に戻って brew の言うとおりやってみる。
まずはインストール時のエラーメッセージの通り brew link cmigemo をやってみる。

brew link cmigemo
Linking /usr/local/Cellar/cmigemo/20110227... Warning: Could not link cmigemo. Unlinking...

Error: Could not symlink file: /usr/local/Cellar/cmigemo/20110227/bin/cmigemo
Target /usr/local/bin/cmigemo already exists. You may need to delete it.
To force the link and delete this file, do:
  brew link --overwrite formula_name

To list all files that would be deleted:
  brew link --overwrite --dry-run formula_name

--overwirte オプションをつけろと。。。

-> brew link --overwrite cmigemo 
Linking /usr/local/Cellar/cmigemo/20110227... Warning: Could not link cmigemo. Unlinking...

Error: Could not symlink file: /usr/local/Cellar/cmigemo/20110227/lib/libmigemo.dylib
/usr/local/lib/libmigemo.dylib may already exist.
/usr/local/lib may not be writable.

/usr/local/lib/libmigemo.dylib がすでにあるから link 出来ないよってことらしい。。。

では再度cmigemoを削除して brew doctor で言われた通りやってみる。

-> brew remove cmigemo 
Uninstalling /usr/local/Cellar/cmigemo/20110227..

-> ls /usr/local/lib/libmigemo.*
/usr/local/lib/libmigemo.1.dylib /usr/local/lib/libmigemo.dylib

-> rm /usr/local/lib/libmigemo.*

brew doctorでは /usr/local/lib/libmigemo.1.1.0.dylib だけが無駄っぽいことが書いてあったけど全部削除しちゃいました。

最後に

brew install cmigemo 
==> Downloading http://cmigemo.googlecode.com/files/cmigemo-default-src-20110227.zip
Already downloaded: /Library/Caches/Homebrew/cmigemo-20110227.zip
==> Patching
patching file src/wordbuf.c
==> chmod +x ./configure
==> ./configure --prefix=/usr/local/Cellar/cmigemo/20110227
==> make osx
==> make osx-dict
==> make utf-8
==> make osx-install
==> Caveats
See also https://gist.github.com/457761 to use cmigemo with Emacs.
You will have to save as migemo.el and put it in your load-path.
==> Summary
/usr/local/Cellar/cmigemo/20110227: 21 files, 12M, built in 5 seconds

となって無事インストールできました。

よかったよかった。。

rails2.2.2からrails2.3.14へアップデート

参考url

とりあえずrailsのバージョンを上げる

   gem install rails -v2.3.14 --no-rdoc --no-ri

testの継承元がActiveSupportに変更されている。

test/test_helper.rbで

   -class Test::Unit::TestCase
   +class ActiveSupport::TestCase

とする。

controllelr/application.rbがcontroller/application_controller.rbにかわっている

中身は変える必要がなさそうなので単純にリネームする。

config/boot.rbとconfig/enviroments/test.rbを変更する

rails2.2に上げる時にもやったんだけどrailsguideのscaffoldあたりまでを新しいrailsバージョンでやっておいて
config配下の設定ファイルをdiffで差分を確認しています。

config/boot.rb

    def load_initializer
      require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
      Rails::Initializer.run(:install_gem_spec_stubs)
   +  Rails::GemDependency.add_frozen_gem_path
    end

    rescue Gem::LoadError => load_error
   -  $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
   -   exit 1
   +   if load_error.message =~ /Could not find RubyGem rails/
   +     STDERR.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
   +     exit 1
   +   else
   +     raise
   +   end

    def load_rubygems
   +   min_version = '1.3.2'
       require 'rubygems'
   -   min_version = '1.3.1'

config/environments/test.rb

   + config.action_view.cache_template_loading            = true

validates_date_timeでエラーになる

こんなふうにHogeモデルを初期化すると

   hoge = Hoge.new('written_on(1i)' => "", 'written_on(2i)' => "", 'written_on(3i)' => "")
   hoge#written_on_before_type_cast  => '-00-00'

ってなってしまう。

なので、validates_date_timeプラグインの中で

   + raw_value = nil if (raw_value == "" || raw_value =~ /-00-00/)

ってコードを追加した。

根本的な問題解決ではないので、この対処はやっちゃだめ(やってる自分が言ってるのって説得力ないな)。
最低限アプリ側のコードで対処しろってツッコミが来そうですな。このあとのrails3.0へのアップグレードで対応しました。

反省点

  • validates_date_timeの対処がイマイチ感満載だなぁ
  • rails newで作った各ファイルたちをdiffで確認するのはかなりおすすめ

rails2.1.2からrails2.2.3へのアップデート

個人的に作成、使用しているrailsアプリをrails2.1.2からrails2.2.3へアップデートした時の記録。すごーく今更感満載な記事です。。。

gettext-railsが未対応

rails2.2から標準で国際化の仕組みとしてi18nをサポートするようになりました。
さらにgettext-railsはrails2.2はサポートされてないし、特にこだわりがなければrailsの標準の機能をつかっとこうということでi18nへ変更しました。

gettextの呼び出しを削除

config/environment.rbを修正

config.gem "gettext", :lib => "gettext/rails" # これを削除

app/controller/application.rbを修正

init_gettext "personal_management"     # これを削除
i18n_generatorsをインストールする

バージョンは1.1.0を指定する。environment.rbのconfig.gemに指定してはいけない。i18n_generatorsのload errorになる。

gem install i18n_generators -v1.0.0 --no-rdoc --no-ri
script/generate i18n ja
とりあえずgetttextの_メソッドをi18nのtメソッド等に置き替える
  • '_'メソッドとか'N_'メソッドをtメソッドに変更する。
  • '_'メソッドは固定的に翻訳するだけのメソッドで
  • 'N_'メソッドは翻訳文字列に動的に文字列を入れている。

i18nで動的に文字列を入れこむには

t('view.hello_rails', :hoge => 'ほげ')

とやって

view:
  hello_rails: '%{hoge}こんにちわrails'

とオプション引数を設定して、翻訳ファイル上に%{option_key}と書く。ただし、これはrails2.3以上の機能なので、2.2では動的に変更することはあきらめる。

rails2.2はあくまでもrails2.3へのステップアップバージョン。まぁテストが通ればいい。

untranslateを使用している箇所を削除する

エラーメッセージにはActiveRecordのメソッドっぽいのが出ていたけど
gettextで翻訳対象か否かのメソッドなので、こいつを宣言しているモデルは単純にconfig/localesの翻訳ファイルに入れなければいいだけ。

反省

たぶん、国際化の部分をi18nにする以外の部分は何も触らなくてもアップデートは可能です。
gettext-railsもrails2.3にすると対応しているバージョンが存在するし、すでにrails自体のバージョンが3系になっている現在、rails2.2を経由する必要はなく、rails2.1からrails2.3へアップデートしても問題は無いと思います。

MacOSX lionにXcode4.3 rvm ruby1.8.7をインストールしてみる

ruby1.9.3は普通にインストール可能だと思うので割愛。

Xcode4.3へのアップデート

App Storeからインストール

mobileなんたらのインストールをうながされるのでインストール。

Xcode 4.2.1などの古いXcodeを削除されるか聞かれるので削除を選ぶ

f:id:tomiacannondale:20120722022143p:image

Downloadタブから「Command Line Tools」をインストール

f:id:tomiacannondale:20120722021712p:image

いちおうbrew doctorをしてみます。

$ brew doctor
$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

やっぱりxcode-selectをしなさいと出るので

$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

をします。

他の情報では

$ sudo xcode-select -switch /Developer

をしなさいと出ますが、先ほどの古いXcodeの削除をしたところでやったから必要ないんでしょう。

ruby1.8.7のインストール

apple-gcc42のインストール

ruby1.8.7のインストールに必要です。

homebrewを使ってインストールします。

$ brew tap homebrew/dupes
$ brew install homebrew/dupes/apple-gcc42

apple-gcc42のformulaはhomebrew標準のformulaには入っていなくて、
homebrew-dupus というリポジトリで管理されています。

ruby1.8.7のインストール
$ CC=/usr/local/bin/gcc-4.2 rvm install 1.8.7
$ rvm use 1.8.7
Using /Users/tomi/.rvm/gems/ruby-1.8.7-p358
$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [i686-darwin11.4.0]

とりあえずrails2を普通使いのgemsetと分けて開発できそうです。
よかったよかった。

MacOSX lion Xcode4.3 homebrew rvm(rbenv)で ruby1.9.3 と ruby1.8.7をインストールしたい

件名の通り、出来るって記事じゃなくって「したい!」って記事です。

全然さわっていないrails2系のアプリをもういいかげん3系にあげておかんとと思って環境構築しようとしたらもう時間切れなんでしょうねぇ。。。
途中経過を書いておきます。

前提

僕の使用している環境

  • MacOSXのバージョン
    • lion
  • Xcodeのバージョン
    • 4.3(今は4.2。これもアップデートが必要)
  • パッケージ管理
    • homebrew
  • rubyのバージョン管理ツール
    • rvm

Xcodeのアップデート

そもそもbrewXcodeを4.3に上げろというんです(brew doctorのメッセージ)。gitとかもアップデート出来ない。

アップデート自体はあまり問題ないようですが、インストール先が変更されているので、以下のようにしないとだめのようです。

sudo xcode-select -switch /Developer
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

: brew doctor
をすると上記のようなメッセージが出てくるらしい。

Homebrew + Command Line Tools for Xcode + rbenv 環境構築 « tamo's blog


しかし、最近は僕のようにhomebrewだけのためにXcodeを入れるのではなく、
「Command Line Tools for Xcode」というunixツールだけを集めたパッケージも作成されているようです。

ruby1.9.3をインストールする方法

Xcode4.3であればなんら問題無し。直近のバージョンのrvmでもrbenv(ruby-build)でもインストール可能。

ruby1.8.7をインストールする方法

Xcode4.3から使用するコンパイラgccからlvm-gccもしくはclangというものに変更されており、この新しいコンパイラではruby1.9.3以降でしかコンパイルできないらしい。

OS X で rbenv を使って ruby 1.9.3 の環境を作る #Ruby #開発環境 #AdventCalendar - Qiita

ではどうすればいいか

Xcodeを4.2のままにするbrewで新規にインストール出来ないので、なんとかXcodeを4.3にしてかつruby1.8.7を入れたい。

brewからapple-gcc42というツールをインストールする
たぶんこれが解決策なんだけど、ruby1.8.7をインストールする時だけコンパイラを指定するって方法あるんですかね。。

って思ってたら解決策あった!

Mac(Lion)上でRVMを使用しRubyをインストール #Ruby #Mac - Qiita

とりあえず今日はここまで。

era_jaというgemを公開しました

半年ぶりの更新です。まぁ宣伝です。

era_jaというrubyのDateとTimeインスタンスを和暦に変換するgemを公開しました。
era_ja | RubyGems.org | your community gem host

今はこれだけの機能ですが、調子にのったら和暦 <=> 西暦 への交互変換が可能になったらうれしいなぁと思っています。

もともと仕事で書いているスクリプトで西暦から和暦に変換することをちょこちょことやっていました。
やることといえば西暦から平成への変換なので数字の引き算だけなのですが、いちいち平成の開始年をwikipediaで調べるのが面倒になって、ネットで調べてみたら、t-diaryのソースから和暦変換の機能だけをとりだして使用しているという方法が多かった。

今はbundlerで依存ライブラリの管理をしているので、可能であればそういう機能もgemで管理したい。
簡単そうだからいっそつくってしまおうと思って作成してみました。

実は元号の開始、終了年月日って昭和から平成以外はいいかげんというかコンピュータでの計算に適さないことになっています。
1926年年12月25日で大正は終っているんだけど、昭和の開始日は同じ日になっている。
要するに1926年12月25日は大正15年12月25日と変換しても昭和元年12月25日と変換しても正しい。
明治から大正も同様になっています。
era_jaでは1926年12月25日は大正15年12月25日としています。
これも調子にのったら引数で選択出来るようになったらいいのかなぁ。

最後に使用方法を(まぁREADMEそのまんまですが)

Timeでの使用

require 'era_ja/time'
Time.mktime(2012,4,29).to_era   # => "H24.4.29"
Time.mktime(2012,4,29).to_era("%O%E年%m月%d日") # => "平成24年4月29日"

Dateでの使用

require 'era_ja/date'
Date.new(2012,4,29).to_era     # => "H24.4.29"
Date.new(2012,4,29).to_era("%O%E年%m月%d日") # => "平成24年4月29日"

つかってケロ!

sinatraでテストの入門の入門(その3)sinatraでcapybara

以前書いたものの続きです。
rspecと同様ほとんど変りはありません。と言ったら違うか。。

サンプルコード

require './hello_world'
require 'capybara'
require 'capybara/dsl'
require 'test/unit'

class HelloWorldTest < Test::Unit::TestCase
  include Capybara::DSL
  # Capybara.default_driver = :selenium

  def setup
    Capybara.app = Sinatra::Application.new
  end

  def test_it_works
    visit '/'
    assert page.has_content?('Hello World')
  end
end

コードの理解

capybaraを使う場合は

  • capybara
  • capybara/dsl

をrequireする必要があります。
元のページではインクルードするのはCapybaraモジュールでしたが、テストを動かすと「CapybaraでなくCapybara::DSLをインクルードしなさい」と警告が出るので直しています。
後はcapybaraっぽく書けば出来そうですね。

ドライバーを変えるには

capybaraの得意技の一つであるブラウザドライバの変更ですが、サンプルコードでコメントになっている部分

Capybara.default_driver = :selenium

のように指定すればよいです。

がしかし!

Failures:

  1) The HelloWorld App works
     Failure/Error: visit '/'
     Selenium::WebDriver::Error::WebDriverError:
       unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055)
     # ./hello_by_capybara_spec.rb:20:in `block (2 levels) in <top (required)>'

Finished in 73.62 seconds
1 example, 1 failure

Failed examples:

rspec ./hello_by_capybara_spec.rb:19 # The HelloWorld App works

となってブラウザが動かなくなってる。。。どうしたものかー。下書きした時はうまく動いたのになー

と悩んでいるうちにcapyabaraのissueで議論されていました。
https://github.com/jnicklas/capybara/pull/460です。

ようするにcapybara1.0.0で依存指定するselenium-webdriverのバージョンが古かったようです。
selenium-webdriverって最新だと2.5なんだけど、capybaraでは0.2を指定していたという。。
他の要件でselenium-webdriver入れてたら、こんなこと起らんもんなぁ。。

capybara1.0.1にするとselenium-webdriverが新しいバージョンが入るので解決出来ます。

rspecでは?

こんな感じでした。

require './hello_world'
require 'capybara'
require 'capybara/dsl'
require 'rspec'

describe 'The HelloWorld App' do
  include Capybara::DSL
  # Capybara.default_driver = :selenium

  before do
    Capybara.app = Sinatra::Application.new
  end

  it 'works' do
    visit '/'
    page.should be_has_content('Hello World')
  end
end

まとめ

1. sinatraのテストでcapybaraを使うことも簡単(test/unit、rspecともに)
2. includeするのはCapybaraでなく、Capybara::DSL
3. ドライバーの変更も出来る。
(テスト毎にドライバーを変更するやり方は未調査)
4. ライブラリは最新版を使いましょう。