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'
Xenの仮想サーバでclockを設定
VPSのXenの仮想サーバで時刻がずれていた。
ntpdで設定されるようにしているが、ずれたまま。
DomUの時刻は、Dom0からのみ更新できるというXenの仕様によるものらしい。
検閲Tech: XenのDomUでNTPを使う
ということは、Dom0の時刻がずれているのか。
DomUでNTPを使って時刻が設定できるようにした。
# echo 1 > /proc/sys/xen/independent_wallclock
/etc/sysctl.conf
xen.independent_wallclock = 1
ntpdをセットアップ。
$ sudo yum install ntp $ sudo /sbin/chkconfig ntpd on $ sudo /etc/init.d/ntpd start
ntpdが時刻を同期する様子は以下で確認できる。
# ntpq -p
時刻が大幅にずれている場合はntpdでは時刻が補正されないので、ntpdateで時刻を合わせておく。
# /etc/init.d/ntpd stop # ntpdate <ntpサーバ> # /etc/init.d/ntpd start
ただし注意!
時刻が戻るとdovecotがダウンした。dovecotの仕様らしい。
/var/log/maillog
Feb 23 19:40:48 mail dovecot: Time just moved backwards by 105 seconds. This might cause a lot of problems, so I'll just kill myself now. http://wiki.dovecot.org/TimeMovedBackwards
dovecotのリスタートが必要だった。
この現象は、Dom0の時刻がずれている限り、DomUを再起動するたびに起きてしまう。
つまり、DomUを再起動したら、dovecotを再起動しないといけない。
TextMateで全角スペースや行末のスペースをハイライト
TextMateのBundleをあまりよく分かっていない。(分かろうともしていない)
TextMateで全角スペースや行末のスペースをハイライトしたいとき、セットアップのたびにいつも苦労するので、メモしておく。
Bundles -> Bundle Editor -> Edit Languages... で、各languageに下記のように追加。
Ruby
トップレベルブロックの patterns = () の中。
{ ... patterns = ( ... { name = 'invalid.trailing-whitespace'; match = '\s+$'; }, { name = 'invalid.zenkaku-whitespace'; match = ' '; }, ...
PHP
トップレベルと
repository > language ブロックの patterns = () の中。
{ ... patterns = ( ... { name = 'invalid.trailing-whitespace'; match = '\s+$'; }, { name = 'invalid.zenkaku-whitespace'; match = ' '; }, ); repository = { language = { patterns = ( ... { name = 'invalid.trailing-whitespace'; match = '\s+$'; }, { name = 'invalid.zenkaku-whitespace'; match = ' '; }, ); };
HTML
repository ブロックの中。
repository = { ... zenkaku-whitespace = { patterns = ( { name = 'invalid.zenkaku-whitespace'; match = '( )'; }, ); }; }; }
patterns()の中。
{ ... patterns = ( { include = '#zenkaku-whitespace'; },
repository > php ブロックの中。
repository = { php = { begin = '(?=(^\s*)?<\?)'; end = '(?!(^\s*)?<\?)'; patterns = ( { include = 'source.php'; }, { include = '#zenkaku-whitespace'; }, ); };
GDBでポインタを配列として表示する
配列はprintコマンド(p)で参照できるが、配列を引数で受け取った場合などポインタになっている場合は、@演算子を用いるとうまく表示できる。
@演算子は、左項をアドレスとみなし、左項の型のデータを右項の数だけ配列のように表示する。
(gdb) list 34 35 void func(int v[], int len) 36 { (gdb) p v[0] @ len $1 = {4470, 5197, 2482, 1016, 4154, 9986, 8313, 6873, 8517, 5857, 9019, 8002, 349, 9817, 365, 1018, 2269, 9759, 7092, 8674, 4902, 3890, 9746, 7668, 792, 3842, 4053, 6422, 630, 4880, 9996, 7164, 8392, 8469, 2959, 8380, 6533, 1795, 4296, 9964, 8259, 7474, 72, 2948, 3681, 501, 3994, 508, 9544, 941, 8054, 2186, 7418, 8684, 3224, 7322, 3822, 5022, 3085, 8341, 2296, 4073, 1034, 9839, 7067, 1197, 739, 7028, 2809, 6610, 8633, 483, 3017, 9634, 4758, 8101, 7604, 4018, 2174, 5014, 6600, 3754, 2854, 4798, 3921, 2124, 9889, 1147, 2409, 6105, 224, 6973, 5937, 2953, 8614, 9101, 3399, 8431, 2226, 3548} (gdb) p *v @ len $2 = {4470, 5197, 2482, 1016, 4154, 9986, 8313, 6873, 8517, 5857, 9019, 8002, 349, 9817, 365, 1018, 2269, 9759, 7092, 8674, 4902, 3890, 9746, 7668, 792, 3842, 4053, 6422, 630, 4880, 9996, 7164, 8392, 8469, 2959, 8380, 6533, 1795, 4296, 9964, 8259, 7474, 72, 2948, 3681, 501, 3994, 508, 9544, 941, 8054, 2186, 7418, 8684, 3224, 7322, 3822, 5022, 3085, 8341, 2296, 4073, 1034, 9839, 7067, 1197, 739, 7028, 2809, 6610, 8633, 483, 3017, 9634, 4758, 8101, 7604, 4018, 2174, 5014, 6600, 3754, 2854, 4798, 3921, 2124, 9889, 1147, 2409, 6105, 224, 6973, 5937, 2953, 8614, 9101, 3399, 8431, 2226, 3548}
Source: Arrays - Debugging with GDB
CapistranoでPATH等の環境変数を設定する
Capfileに
load 'deploy/assets'
を追加すると、デプロイ時にassets:precompileを実行できるが、assets:precompile実行時に、
/usr/bin/env: ruby : そのようなファイルやディレクトリはありません
というエラーになってしまった。
ssh経由でのshellの実行時にPATHが通っていないのが原因と思われる。
解決方法
CapistranoでPATH等の環境変数を設定するには、:default_environmentを使う。
set :default_environment, { 'PATH' => "/opt/ruby-enterprise-1.8.7-2011.03/bin:$PATH" }
Change PATH environment with Rails and Capistrano - pastbedti.me
How do I configure capistrano to use my rvm version of Ruby - Stack Overflow
プリコンパイルする場合、config/environments/production.rbで、
config.assets.compile = false
にするが、assetsにapplication.js, application.css以外のjs、cssを使う場合は、以下のようにconfig.assets.precompileに追加する必要がある。追加しないと、smart_phone.css isn't precompiled のようなエラーになる。
config/environments/production.rb
config.assets.compile = false # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) config.assets.precompile += %w( smart_phone.css web_app_theme.css )
Mac OS X Lion の cron で tput: No value for $TERM and no -T specified
以下のようにTERMを設定したら解消。
$ crontab -e
TERM=xterm
class_inheritable_accessorからclass_attributeに移行する際の注意点
Rack Middleware
mod_proxyでバックエンドのサーバがダウンすると復旧しても 503 Service Temporarily Unavailable
mod_proxyでバックエンドのサーバがいったんダウンすると、復旧しても一定時間(デフォルトでは60秒)は 503 Service Temporarily Unavailable になってしまう。
リトライするまでの時間は、ProxyPassディレクティブ の retry パラメータで指定することができる。
(ProxyPass ディレクティブのスキームが balancer:// で始まる場合は、対応する <Proxy> セクション中の BalancerMember ディレクティブに retry パラメータを指定できる。)
ProxyPass / http://localhost:3000/ retry=5 ProxyPassReverse / http://localhost:3000/
ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ <Proxy balancer://mycluster/> BalancerMember http://localhost:9001 loadfactor=10 retry=5 BalancerMember http://localhost:9002 loadfactor=10 retry=5 BalancerMember http://localhost:9003 loadfactor=10 retry=5 </Proxy>
mod_proxy - Apache HTTP サーバ
ProxyPass には retry=?? を指定しておく - daily dayflower
BalancerMemberにはretry=??を指定しておく - cys b