iftopコマンドを使うと、特定のインターフェイス/ポート番号における通信量を調べることができます。

ローカルのポート1234への通信量を調べる例:

pre>>
iftop -i lo -B -f "dst port 1234"
<<--

転送されるデータ量を測定してチューニング、使ってるか使ってないかわからないサーバプロセスの発見などに使えます。

ubunut/debianなら、

pre>>

apt-get install iftop

<<--

でインストールできます。

posted by genki genki on Tue 31 May 2011 at 06:11 with 0 comments

spec_helper.rbの中でRSpec.configure を呼び出している場合、
以下のような警告が出てくることがあります。

pre>>


DEPRECATION WARNING: you are using deprecated
behaviour that will be removed from RSpec 3.

You have set some configuration options after an
example group has already been defined. In RSpec 3,
this will not be allowed. All configuration should
happen before the first example group is defined.
The configuration is happening at:

/path/to/app/spec/spec_helper.rb:50


<<--

これは spec_helper.rb が何度も呼び出されてしまうことで、
configureブロックが2回以上呼び出されてしまうために起こる問題です。

そもそも Ruby の require は一度しかファイルを読み込まないように
なっていますが、読み込んだかどうか判定する基準となるのが
読み込み対象のファイルの絶対パスではなく、require に渡された引数であるため、同じファイルをrequireしてもパスの指定の仕方によって何度も読み込まれてしまうのです。

そこで、以下のように spec_helper.rb の先頭に記述することで、
二度読みを回避して警告されないようにすることができます。

ruby>>
$LOADED_FEATURES.push File.expand_path(FILE)
def require(path)
path = File.expand_path(path) if path =~ %r{^[./]}
super path
end
<<--

require を上書きして引数が "." か "/" で始まっている場合に expand_path を呼び出して正規化しています。
自分自身が呼び出される時のrequireは上書きできないので、
$LOADED_FEATURESに自分自身の絶対パスを追加しておきます。
require は $LOADED_FEATURESにpathが存在するする場合はスクリプトを読み込まなくなります。

posted by genki genki on Mon 30 May 2011 at 13:00 with 0 comments

rake gems:unpack GEM=foo などでvender/gems 以下にunpackしたgemとbundlerを併用したい場合があります。
最近では、locale_rails-2.0.5にパッチをあてたものを利用したい局面でそうなりました。

こんな場合には、Gemfile にて

ruby>>
gem 'locale_rails', '=2.0.5', :path => 'vendor/gems/locale_rails-2.0.5'
<<--

というように記述しておけば、unpack したgemを使ってくれます。
第二引数のversionは必須っぽいのでご注意。

posted by genki genki on Sun 29 May 2011 at 07:25 with 0 comments

bundlerを使うとRubyアプリケーションごとに閉じたgemの依存関係を構築できるので、gemのバージョンの違いや環境ごとの違いで悩まされることが減ります。
これは非常に便利なのですが、rakeやunicornのようにコマンドをインストールするgemの場合、

pre>>
% bundle exec unicorn
<<--

のように、bundle execを介して実行する必用があって面倒です。
しかし、rvmを使えばこれを賢く解決できます。

比較的新しめのrvmとbundlerが必用になるので、
あらかじめ最新版をインストールしておいてください。

まず、以下のように適当なアプリケーション名などでgemsetを作ります。

pre>>
% rvm gemset create foo-app
<<--

作成したgemsetは

pre>>
% rvm gemset use foo-app
<<--

のようにしてアクティベートできます。新規に作成したgemsetの中身は
こんな感じになっています。

pre>>
% gem list

*** LOCAL GEMS ***

bundler (1.0.2)
rake (0.8.7)
<<--

bundler-1.0.2はちょっと古いので、gem udpateして最新のbundlerにします。

この状態であらかじめ用意しておいたGemfileに従ってgemをインストールします。

pre>>
% bundler install --system
<<--

これで foo-app gemset にはGemfileで指定したgem群が入った状態になり、rake, unicornなどのコマンド群もrvmがいい感じに取り計らってくれます。
あとは、rvm gemset use xxx を使えば適宜必用なgem環境を切り替えることができます。

ただ、アプリケーションが複数ある場合に、頻繁にgem環境を切り替えるのは面倒です。
アプリケーションのrootディレクトリに .rvmrc というファイルを作って

pre>>
rvm use ruby-1.8.7-p302@foo-app
<<--

のように記述しておいておくと、cd した時にrvmが勝手にgemsetを切り替えてくれます。これで完璧ですね!

Bye bye gem hell!

posted by genki genki on Sat 28 May 2011 at 21:36 with 0 comments

Rubyはメソッド定義内で begin/end が無くても直接rescueやensureを記述できますが、これは無駄な記述を減らす上でとても魅力的な文法だと思います。

ruby>>
def foo
puts "hello world :-)"
rescue
puts "something wrong :'-("
end
<<--

この書き方のまま、所定回数だけretryしたい場合、retry回数を覚えておくカウンタ変数を用意する場所に困ったりするのですが
(ローカル変数として定義すると、retry後に再初期化されてしまいますからね)
以下のように引数として用意しておくと、methodが定義するブロックよりも外側のライフタイムを持つので、retryカウンタとして使えます。

ruby>>
def foo(bar = 0)
puts bar
raise
rescue
bar += 1
retry if bar < 10
end

foo
<<--

実行した結果は以下の通り

pre>>
0
1
2
3
4
5
6
7
8
9
<<--

posted by genki genki on Sat 28 May 2011 at 01:21 with 1 comment

request.host などがちゃんとリモートホストのドメイン名を指すように、
以下のように設定します。

pre>>
location / {

..snip..

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

..snip..

}
<<--

ちょっと設定を忘れていてRSS中のGUIDがlocalhsotを指すという問題が発生しておりました。現在は復旧しております。
ご不便をおかけいたしましたことをお詫びいたします。

posted by genki genki on Wed 25 May 2011 at 23:07 with 0 comments

またプロセスがハングアップする問題が発生したため、システム構成を見直し。
passengerからunicornに切り替えました。
正確な構成は、

  • rails-2.3.11
  • rack-1.1.2
  • unicorn-3.6.2
  • nginx-1.0.0

という感じです。

unicornのマスタープロセスのPIDを取得するために、以下のようなスクリプトを使ってます。

unicorn_master.rb

ruby>>
port = ARGV.shift
pids = lsof -i:#{port} | awk "{print \\$2}".split("\n")[1..-1]
pids.each do |pid|
puts pid if ps --ppid #{pid}.split("\n").size > 1
end

USAGE:

ruby unicorn_master.rb <#port>

<<--

またしばらく様子をみてみます。

posted by genki genki on Wed 25 May 2011 at 13:02 with 0 comments

rackupしようとすると、1.3.0と1.1.0でコンフリクトして無理、というお馴染みのメッセージが出ていて困ったのですが、bundlerを使っている場合、

pre>>
% bundle exec rackup
<<--

すればOKなようだ。

posted by genki genki on Wed 25 May 2011 at 09:21 with 0 comments

古いRailsアプリをBundler仕様にする場合、

ruby>>
config.gem "foo",
:version => "0.0.1",
:lib => "bar",
:source => "http://gems.github.com"
<<--

と等価なGemfileの記述方法は

ruby>>
source "http://gems.github.com"
gem "foo", "0.0.1", :require => "bar"
<<--

で良いようです。バージョン指定をしない場合は第二引数を省略可。

posted by genki genki on Wed 25 May 2011 at 08:26 with 0 comments

本日の午前中、比較的長期間当ブログにアクセス出来ない状態が発生しておりました。ご不便をおかけいたしましたことをお詫びいたします。

原因としては、Railsプロセスが暴走していたことが考えられます。
そのため、当blogで使用しているRailsのバージョンを 2.3.5から2.3.11に
アップグレードいたしました。
またしばらく様子を見て対応を考えます。

よろしくお願いいたします。

posted by genki genki on Sun 15 May 2011 at 04:35 with 0 comments

Rubygemsが新しすぎると、掲題のようなエラーが出る場合があります。
とりあえず回避するには

pre>>

gem update --system 1.6.2

<<--

までダウングレードすればok

posted by genki genki on Sun 15 May 2011 at 04:17 with 0 comments

Rubygems-1.8.2 にアップデートして色々と痛い目にあっています。
ちょっと時期尚早な気がしたので、一旦過去のバージョンに戻すことに。
以下のようにすればokです。

pre>>

gem update --system 1.7.1

<<--

posted by genki genki on Sun 15 May 2011 at 04:03 with 0 comments

Rubyスクリプト中から

ruby>>
require "hoge"
<<--

されている hoge のソースを見てみたい時には、

sh>>
vim gem which hoge.rb
<<--

すると見つけてきてくれます。

posted by genki genki on Sun 8 May 2011 at 17:08 with 0 comments

CDH3に同梱されているgen-rbファイル群は若干古いらしく、上手く動かないのでif/hadoopfs.thrift を使って手動で生成します。

pre>>
% thrift --gen rb /path/to/if/hadoopfs.thrift
<<--

これで gen-rb/ ディレクトリの中にRuby用インターフェイスが生成されます。

posted by genki genki on Sun 8 May 2011 at 10:45 with 1 comment

最初にhadoopを入れておく。

続いてhbase-0.90.2をダウンロード。

/usr/local/hbase あたりに展開し、/usr/local/hbase/bin にPATHを通す。

rootディレクトリの設定

conf/hbase-site.xmlを開いて <configuration>の中に以下を記述。

xml>>

hbase.rootdir
hdfs://127.0.0.1/hbase


hbase.cluster.distributed
true


hbase.zookeeper.quorum
127.0.0.1


hbase.zookeeper.property.clientPort
2222

<<--

後は

sh>>
% start-hbase.sh
<<--

すると起動する。jps コマンドを実行すると以下のような感じになる。

sh>>
% jps
21245 DataNode
15141 JobTracker
21615 HRegionServer
21330 SecondaryNameNode
22236 Jps
21152 NameNode
15224 TaskTracker
22068 HQuorumPeer
<<--

posted by genki genki on Sat 7 May 2011 at 15:10 with 0 comments

まずはhadoop-0.21.0をダウンロード

hadoop-envの設定

$HADOOP_HOME/conf/hadoop-env.sh を開いて JAVA_HOMEを
/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Homeあたりに設定。

$HADOOP_HOME/binにPATHを通して

pre>>
% start-dfs.sh
% start-mapred.sh
<<--

でHadoopを起動。0.21.0ではstart-all.shはdeprecatedらしい。

停止は

pre>>
% stop-mapred.sh
% stop-dfs.sh
<<--

注意点として、ssh で localhost にログインできるようにしておく。

"システム環境設定" -> "共有" から、"リモートログイン"にチェックでok

初期化・設定

$HADOOP_HOME/conf/hdfs-site.xmlに以下のような感じで記入

xml>>


fs.default.name
hdfs://127.0.0.1


dfs.replication
2


<<--

hdfsを初期化。

pre>>
hdfs namenode -format
<<--

mapredの設定

$HADOOP_HOME/conf/mapred-site.xmlの<configuration>の中に以下を記入。

xml>>

mapred.job.tracker
localhost:54311

<<--

あとは起動して http://localhost:50070 あたりを見ると状態を確認できます。

posted by genki genki on Sat 7 May 2011 at 10:17 with 1 comment

Mac OS環境ではRiakをbrew install riak でインストール出来ますが、
Xcode4が入っている環境ではコンパイルエラーが発生して上手くいかないようです。どうやらllvm-gccが使われてるのが原因らしい。

以下のように--use-gccで強制的にgccを使うようにすれば良さそうです。

pre>>

brew -v install --use-gcc riak

<<--

posted by genki genki on Fri 6 May 2011 at 05:56 with 0 comments

ubuntuのバージョンを調べるには

pre>>
% lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.10
Release: 10.10
Codename: maverick
<<--

とやれば良いらしい。

posted by genki genki on Fri 6 May 2011 at 04:32 with 0 comments
posted by genki genki on Fri 6 May 2011 at 02:54 with 0 comments
Contents rssrss
光ファイバーを二次元振動させて走査するAR用ディスプレイ
因果の取り違え
Swift2's defer for CoffeeScript
mongodb-3.0からcreateIndexのdropDupsが無くなったらしい
mongodb-3.0以降のWiredTigerの設定を動的に変更する方法
一般楕円の高速生成アルゴリズムへの道標
farro mantecatoのレシピ
Droonga関連の記事のまとめ
RuntimeErrorの特定のメッセージに限定してrescueする方法
jQueryでscriptタグを実行せずにappendする
Tags
memorubygemtipsblogbundlebundlerhadoopmacRiakubuntuお知らせbrewhbasenginxrailsRSpecrvmthriftunicorn
Comments rssrss
瀧内元気 瀧内元気: MacOS版は以下にあります genki/ViMouse 01/16 05:40
dsjf dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これでも出... 01/08 23:23
瀧内元気 瀧内元気: おお、チェックしてみます。thx! 12/24 05:23
overisland overisland: Reeder for iPhone もこの UI を実装していますね。 12/24 05:13
瀧内元気 瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 http:... 12/01 12:20
tkawa tkawa: http://devcenter.heroku.com/articles/rails31_herok... 12/01 10:47
瀧内元気 瀧内元気: どもー。いまはgithubに置いてあります https://github.com/genki/irb... 07/10 08:31
ともち ともち: こんにちは! すばらしいプログラムをありがとうございます。しかし、merbiのドメイン、切れているみ... 07/10 02:30
Services from s21g
MagicBag
MagicBagは、Cloudflare R2やS3互換ストレージをMacのFinderから扱えるファイル同期クライアントです。
アンテナショップめぐり
東京にある全国のアンテナショップ、イベント、特産品を地図や条件から探せるサービスです。
YOMU Web小説リーダー
YOMUは、Web小説の読み上げに特化したiPhoneアプリです。
補助探
公開されている補助金・助成金情報を集約し、条件に合う制度を探しやすくするサービスです。
jotter.me
jotter.meは、考えやアイデア、情報を書き留めるためのノートサービスです。