「Ruby」カテゴリーアーカイブ

Mac OS X Lion RVMのRuby1.9.3でSegmentation fault

RVMでMac OS X LionにRuby1.9.3をインストール後、bundleしたらSegmentation faultが発生。

$ bundle
Fetching source index for https://rubygems.org/
/Users/pistolfly/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:799: [BUG] Segmentation fault
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.3.0]
...

解決方法

$ rvm pkg install openssl
$ rvm install 1.9.3 --with-openssl-dir=$rvm_path/usr

Ruby 1.9.3 + Rails 3.2.1 で segmentation fault -> 解決 - さとうようぞうのblog
RVM: Ruby Version Manager - 'rvm pkg install openssl'

CentOSにRVMをマルチユーザ用にインストール

マルチユーザ用にRVMをインストール

マルチユーザ用にRVMをインストールするには、sudo でインストールする。
RVM: Ruby Version Manager - Installing RVM

$ sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
Downloading RVM from wayneeseguin branch stable
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). The default
 bundle is named curl-ca-bundle.crt; you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
Could not download 'https://github.com/wayneeseguin/rvm/tarball/stable'.
  Make sure your certificates are up to date as described above.
  To continue in insecure mode run 'echo insecure >> ~/.curlrc'.

curlのSSL証明書の検証でエラーになった。
CA証明書が古いらしい。
新しいCA証明書を取得する。

CA証明書のアップデート

$ sudo mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt.bak # バックアップ
$ sudo curl http://curl.haxx.se/ca/cacert.pem -o /etc/pki/tls/certs/ca-bundle.crt

curlでまたSSLのエラーが出たので対処 - kanonjiの日記
cURL - Details on Server SSL Certificates
cURL - Extract CA Certs from Mozilla
再度sudoでRVMをインストール。

$ sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
Downloading RVM from wayneeseguin branch stable
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  796k  100  796k    0     0   170k      0  0:00:04  0:00:04 --:--:--  340k
Installing RVM to /usr/local/rvm/
installing - /usr/local/rvm/man/man1/rvm.1 -
installing - /usr/local/rvm/man/man1/rvm.1.gz -
    Creating RVM system user group 'rvm'
# RVM:  Shell scripts enabling management of multiple ruby environments.
# RTFM: https://rvm.beginrescueend.com/
# HELP: http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net)
# Screencast: http://screencasts.org/episodes/how-to-use-rvm
# In case of any issues read output of 'rvm requirements' and/or 'rvm notes'
Installation of RVM in /usr/local/rvm/ is complete.
# XXXXXXXXX,
#
#   Thank you for using RVM!
#   I sincerely hope that RVM helps to make your life easier and more enjoyable!!!
#
# ~Wayne

sudoでマルチユーザ用にインストールすると、RVMは /usr/local/rvm にインストールされる。

sudoを使うのは、RVM自体のインストール時のみ。

以降の操作は、sudoを使わない。rvm installやgem install など、/usr/local/rvm 下に書き込む操作は、rvmグループに所属しているユーザで行う。(/usr/local/rvmのグループがrvmになっている。)
RVM: Ruby Version Manager - Troubleshooting RVM
RVM をマルチユーザー用にセットアップする: ひ日記
ユーザのグループにrvmを追加。

# usermod -a -G rvm <ユーザ名>

ユーザをrvmグループに追加したら、いったんログアウトしてから、rubyやgemをインストール。
sudo しない。

$ rvm install 1.9.3
$ rvm use 1.9.3
$ gem install rails

RVMのアップデートも、sudoを使わず、rvmsudoを使う。

$ rvmsudo rvm get latest

Can't install RMagick 2.13.1. Can't find MagickWand.h.

ImageMagick 6.7.3-7をソースからインストールした環境に、gemでRMagickをインストールしようとしたら、以下のエラーが発生した。

$ sudo gem install rmagick
Building native extensions.  This could take a while...
ERROR:  Error installing rmagick:
	ERROR: Failed to build gem native extension.
        /opt/ruby-enterprise-1.8.7-2011.03/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for gcc... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no
Can't install RMagick 2.13.1. Can't find MagickWand.h.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.
Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/opt/ruby-enterprise-1.8.7-2011.03/bin/ruby
Gem files will remain installed in /opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/gems/1.8/gems/rmagick-2.13.1 for inspection.
Results logged to /opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/gems/1.8/gems/rmagick-2.13.1/ext/RMagick/gem_make.out

ImageMagickは6.7.3-7をソースからインストールしている。
ImageMagick 6.6.9-10の場合は、Rmagickをインストールできた。

対処方法

エラーメッセージに、

Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable

とあるので、MagickCore.pcが含まれているディレクトリを探して、PKG_CONFIG_PATHにセットするとインストールできた。

$ find /usr/local -name MagickCore.pc
/usr/local/lib/pkgconfig/MagickCore.pc
$ sudo PKG_CONFIG_PATH=/usr/local/lib/pkgconfig gem install rmagick
Building native extensions.  This could take a while...
Successfully installed rmagick-2.13.1
1 gem installed
Installing ri documentation for rmagick-2.13.1...
Installing RDoc documentation for rmagick-2.13.1...

RubyGemsのバージョンダウン、バージョンアップ

バージョンダウン

目的のバージョンのrubygems-updateをインストールする。

$ sudo gem install rubygems-update -v 1.6.2

もし、目的のバージョンより新しいバージョンのrubygems-updateがインストールされている場合は、アンインストールする。

$ sudo gem uninstall rubygems-update -v 1.8.15

update_rubygemsコマンドを実行する。

$ sudo update_rubygems 
[sudo] password for admin: 
RubyGems 1.6.2 installed

=== 1.6.2 / 2011-03-08

Bug Fixes:

* require of an activated gem could cause activation conflicts.  Fixes
  Bug #29056 by Dave Verwer.
* `gem outdated` now works with up-to-date prerelease gems.


------------------------------------------------------------------------------

RubyGems installed the following executables:
	/opt/ruby-enterprise-1.8.7-2012.02/bin/gem

どんなバージョンがあるのかは以下で表示できる。

$ gem search -ar rubygems-update

*** REMOTE GEMS ***

rubygems-update (1.8.24, 1.8.23, 1.8.22, 1.8.21, 1.8.20, 1.8.19, 1.8.18, 1.8.17, 1.8.16, 1.8.15, 1.8.14, 1.8.13, 1.8.12, 1.8.11, 1.8.10, 1.8.9, 1.8.8, 1.8.7, 1.8.6, 1.8.5, 1.8.4, 1.8.3, 1.8.2, 1.8.1, 1.8.0, 1.7.2, 1.7.1, 1.7.0, 1.6.2, 1.6.1, 1.6.0, 1.5.3, 1.5.2, 1.5.0, 1.4.2, 1.4.1, 1.4.0, 1.3.7, 1.3.6, 1.3.5, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.0, 1.1.1, 1.1.0, 1.0.1, 1.0.0, 0.9.5, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.11, 0.8.10, 0.8.8, 0.8.6, 0.8.5, 0.8.4, 0.8.3)

バージョンアップ

特定バージョンへのバージョンアップもバージョンダウンと同様。
最新版へアップデートする場合は、バージョン指定せずにrubygems-updateをインストールして、update_rubygemsを実行する。

注意

gemのバージョンダウンをしたら、passengerで以下のような例外が発生した。

*** Exception NoMethodError in PhusionPassenger::ClassicRails::ApplicationSpawner (undefined method `full_name' for nil:NilClass) (process 2338, thread #<Thread:0x270f268>):
... 以下略

passenger-install-apache2-moduleでpassengerを再インストールして、httpdをreloadしたらなおったけど、httpdのreloadだけでよかったかも。

RubyGemsをバージョンダウンしたりバージョンアップしたり - アインシュタインの電話番号☎

RVM, Ruby 1.8.7 and OSX Lion

Mac OSX Lion で RVMでインストールしたRuby 1.8.7 で、

$ gem install rails

などとやると、

ruby-1.8.7-p352/lib/ruby/1.8/timeout.rb:60: [BUG] Segmentation fault

というエラーになってしまう。
その解決方法。
.bash_profileなどに、

export CC=gcc-4.2

とやっておいてから、RVMでRuby をインストールする。
ただし、後述するように、Xcode 4.2.1にはgccが含まれていない。別途gccを入れる必要がある。
私は、.bash_profileへの追加はせずに、RVMでのRubyインストール時に、

$ CC=/usr/bin/gcc-4.2 rvm install 1.8.7

とした。

Xcode 4.2.1 にはgcc-4.2が入っていないので、gcc-4.2を別途インストールする必要がある。
rvm requirements に記載があった。
まず、kennethreitz/osx-gcc-installer - GitHub でgccをインストール。
その後、必要があれば、Xcode 4.2.1をインストールすればよい。

osx-gcc-installerをインストールする前にXcodeをアンインストールした方がいいらしい。
Xcode4.3以降は、アンインストールはXcode.appを削除するだけでいい。

Do not install this if you already have Xcode installed! Mixing Xcode and osx-gcc-installer is known to cause various difficult-to-diagnose problems and is not recommended.

If you intend to only use command line tools you should first uninstall Xcode entirely before installing osx-gcc-installer, or see below for other options.

※ 1.9.2では、上記の問題は発生しなかった。
※ Snow Leopard では、RVMでのRubyインストール時に、

$ rvm pkg install readline
$ rvm install 1.9.2 --with-readline-dir=$rvm_path/usr

とやらないと、irbで日本語が入力できなかったが、Lionではreadlineの互換ライブラリlibeditが改善され、ふつうにインストールすれば大丈夫になった。
RVM, Ruby 1.8.7 and OSX Lion « frymanet.com

open-uriにtimeoutを設定する方法

require 'open-uri'
require 'resolv-replace'
require 'timeout'
TIMEOUT = 3
begin
  timeout(TIMEOUT) do
    open(url) do |f|
      # 処理
    end
  end
rescue TimeoutError => e
  # タイムアウト時の例外処理
rescue => e
  # その他の例外処理
end
  • timeout による割り込みはRubyのThreadによって実現されており、C言語レベルで実装されRuby のスレッドが割り込めない処理では無効なので、SocketでDNSの名前解決に時間がかかった場合にタイムアウトしない。そのため、resolvライブラリを使うようにresolv-replaceでメソッドの書き換えを行う。
  • タイムアウト時のTimeoutErrorはStandardErrorのサブクラスではないので、捕捉するためには明示的に捕捉するクラス(TimeoutError)をrescueに指定する必要がある。

open-uriにtimeoutを設定する方法 | やむにやまれず

Mac OSXにHaru Free PDF Libraryをインストール

libHaruはPDFを生成するCのライブラリ。
Ruby、Delphi/Free Pascal、C#(Microsoft .NET platform)、PHP、Perlから利用可能にするbindingもある。
libHaru.org wiki
ダウンロードページからソースをダウンロードしてインストールする。
libpngはMacPortsでインストールしているので、--with-png=/opt/local を指定。

$ tar xzvf libharu-2.1.0.tar.gz
$ cd libharu-2.1.0/
$ ./configure --with-png=/opt/local
$ make
$ sudo make install

Ruby用のライブラリをインストールする。
Documentation/Bindings - libHaru.org wiki

$ cd if/ruby/
$ ruby extconf.rb
$ sudo make install