query: tag:ruby

 Passenger + Nginx でアプリケーションを起動しようとしたときに、下記のようなエラーが出ました。

sh>>
git://github.com/nzifnab/msgpack-rails.git (at master) is not checked out. Please run bundle install (Bundler::GitError)
<<--

 もちろん bundle install は実行済みです。msgpack-rails を使用するために、Gemfile に下記のような記述をしてあるのですが、色々調べたところ、Passenger が git からインストールした gem を認識してくれないようです。

ruby>>
gem 'msgpack-rails', :git => 'git://github.com/nzifnab/msgpack-rails.git'
<<--

 bundle install --deployment で解決するという情報も見つけたのですが、これは vendor ディレクトリにgemを持ってくるため結構な時間がかかります。デプロイでは世代管理していて、デプロイ時に新しいディレクトリを作成してデプロイしているので、開発環境のサーバへデプロイするたびに時間がかかるのはちょっと困るので他の方法を探したところ、bundle package
でOKという情報を見つけました。これはgemのキャッシュを vendor ディレクトリに持つもので、すぐに終わります。ただオプションで --all を指定しないと git 経由のgemをキャッシュしてくれないようです。

sh>>
bundle package --all
<<--

とすることで、git からの gem も見つけてくれるようになりました。

(参考サイト)deploying rails3 apps with bundler and phusion passenger: .bundle dir not found

posted by akanuma akanuma on Wed 25 Dec 2013 at 06:01 with 0 comments

rvm の対話インターフェイスが変わってとまどったのでメモ。

普通に rvm install 2.0.0 とやると、インストールに必要なパッケージが足りていない場合に

pre>>
rvm requirements
<<--

が実行されて、sudo することを求められます。
これでは sudo できないユーザーでrvm install できないので、
足りないパッケージを root でインストールしてあげればいいのですが、
何が足りないのか教えてくれません。

足りないパッケージを知るには、一度

pre>>
rvm autolibs read-only
<<--

してから

pre>>
rvm install 2.0.0
<<--

すると、

pre>>
Missing required packages: ...
<<--

と教えてくれるので、これをインストールして再度 rvm install すれば ok
です。

posted by genki genki on Wed 15 May 2013 at 08:38 with 0 comments

SystemTimerのようにruby1.9以降では必要ないばかりか、インストールしようとするとコンパイルエラーが発生するような場合には、以下のようにGemfileの中で
プラットフォームを指定して場合分けを行うことができます。

ruby>>
gem 'SystemTimer', :platforms => :ruby_18
<<--

posted by genki genki on Tue 21 Aug 2012 at 18:40 with 0 comments

現状ではrvm経由でMountain Lionにインストールできるrubyは1.9.3しか無いようですが、
1.8.7を使いたい場合は以下のようにすれば良いようです。

  • XQuartz をインストール
  • 以下を実行

pre>>
CC=/usr/local/bin/gcc-4.2 CPPFLAGS=-I/opt/X11/include rvm install 1.8.7
<<--

See Also:

posted by genki genki on Wed 15 Aug 2012 at 12:43 with 0 comments

下記日程で第2回Chiyoda.rbを開催いたしますのでお知らせします。

今回はサイバーエージェントベンチャーズ様のStartup Base Camp 会議室 (東京都港区赤坂8-5-26 赤坂DSビル3階)をお借りして開催いたします。

お誘い合わせの上ふるってご参加ください。

posted by genki genki on Mon 19 Mar 2012 at 14:17 with 0 comments

Pryで過去の実行結果にアクセスするには、_out_ 変数を配列のように使うことができます。

ruby>>
[1] pry(main)> "Hello, " + "world!"
=> "Hello, world!"
[2] pry(main)> out[1]
=> "Hello, world!"
[3] pry(main)> out[-1]
=> "Hello, world!"
<<--

同様に、_in_ 変数を配列のように使って入力文字列にアクセスできるようです。

ruby>>
[6] pry(main)> in[1]
=> ""Hello, " + "world!"\n"
<<--

posted by genki genki on Tue 6 Mar 2012 at 11:32 with 0 comments

Pryで過去に入力した文字列にアクセスするには以下のようにすればok

ruby>>
[1] pry(main)> "Hello, world!"
=> "Hello, world!"
[2] pry(main)> Pry.history.to_a[-2]
=> ""Hello, world!""
<<--

posted by genki genki on Mon 5 Mar 2012 at 23:43 with 0 comments

久々にrubygemsをリリースしました。

Rack::Requestで検索エンジンのbotからのアクセスかどうか判定します。

ruby>>
request.bot? #=> true or false
<<--

これだけ。

githubで検索してみたら、個別に実装している例がたくさん見つかったわりに、単体で切り出されているものがあまりなさそうだったので作ってみました。

posted by genki genki on Sun 25 Dec 2011 at 06:00 with 0 comments

.rvmrc ファイルを置いておくと自動的に使用するRubyのバージョンを切り替えられるので便利ですが、デプロイ先で利用する場合に毎回 .rvmrc を信頼するか Yes/No? と聞かれるのが自動化と相性が良くないので、

pre>>
% cd /path/to/.rvmrc
% rvm rvmrc trust
<<--

しておくとその後何も聞かれなくなります。

posted by genki genki on Tue 13 Dec 2011 at 09:10 with 0 comments

新しい地域Rubyコミュニティ Chiyoda.rb を発足いたしました。

千代田区周辺のRubyに縁のある企業に会場をお借りして定期的に会合を開催し、Rubyプログラマーの間で情報交換を行う場所を提供する事を目的としております。

株式会社万葉様のご協力により、第1回の会合を開催する運びとなりました。

Rubyistの皆様方におかれましてはお誘い合わせの上ご参加いただければ幸いです。
よろしくお願いいたします。

posted by genki genki on Mon 12 Dec 2011 at 19:44 with 0 comments

rvmを使ってcapistranoでアプリケーションごとに異なるrubyのバージョンを利用するには、Capfileの先頭に以下のような記述をすればok

ruby>>
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
set :rvm_ruby_string, '1.9.3'
set :rvm_type, :user
<<--

ついでに ROOT に .rvmrc を追加して中身に

pre>>
rvm 1.9.3
<<--

のようにしておけば cd したときにrubyのバージョンが切り替わって便利です。

posted by genki genki on Sun 20 Nov 2011 at 21:38 with 0 comments

結構需要がありそうな割に、決定版的なツールがなんなのかわからなかったのですが、とりあえずこれを使えば目的を果たせます。

使い方:

pre>>
% gem install magic-commenter
% cd /path/to/root/of/ruby/files
% magic-commenter
<<--

あとは自動的にmultibyteキャラクタを含んでいる rbファイルを見つけて
マジックコメントを挿入してくれます。

posted by genki genki on Sun 20 Nov 2011 at 16:56 with 0 comments

database.ymlに

yaml>>
development:
timeout: 2000
<<--

のようにタイムアウトをミリ秒で指定すればok
デフォルトでは 0 になっていて掲題の例外が発生するようです。

posted by genki genki on Tue 8 Nov 2011 at 04:15 with 0 comments

ブロック引数を1つとるブロックつき関数を呼び出すときに

ruby>>
create_table do |t|
t.string :foo
end
<<--

ブロック仮引数を省略した場合、暗黙のうちにブロック引数に対する instance_eval を挟むようにすると

ruby>>
create_table do |t|
t.instance_eval do
string :foo
end
end
<<--

色々と綺麗にかけるようになる気がします。

ruby>>
create_table do
string :foo
end
<<--

ついでに、省略されたブロック引数に $ とかでアクセスできると

ruby>>
[1,2,3].map{to_s}.select{$>2}
<<--

みたいな事ができて楽しいかもです。
ついでに case の値もこんなふうに

ruby>>
case price # <= この値を $ で参照したい
when $ < 5; #...
when $ < 10; #...
end
<<--

参照できるといいな。

posted by genki genki on Wed 31 Aug 2011 at 07:36 with 0 comments

前回(uninitialized constant MysqlCompat::MysqlResの対処法参照)はSnow Leopard でしたが、
今回はLionです。
OSのバージョンが変わるたびに問題が起こる気がします。
今回は、以下で回避できるようです。

pre>>
% install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /path/to/rubygems/gems/mysql-2.8.1/lib/mysql_api.bundle
<<--

See Also

posted by genki genki on Wed 31 Aug 2011 at 03:46 with 0 comments

以下のようにメソッド引数のデフォルト値を設定すれば、
呼び出す時に省略することができます。

ruby>>
def foo(a = nil)
a
end

foo #=> nil
foo("test") => "test"
<<--

では、引数が省略されたかどうか判別するにはどうすればいいでしょうか。
以下のようにすれば判別が可能です。

ruby>>
def foo(a = (a_default = true) && nil)
[a,a_default]
end

foo #=> [nil, true]
foo("test") #=> ["test", nil]
<<--

Rubyの引数のデフォルト値は、式を記述でき、省略された場合だけ評価されるのでそれを利用できます。

posted by genki genki on Tue 9 Aug 2011 at 04:47 with 0 comments

開発環境でしか使っていないので我慢してきたのですが、
どうも MacOS 10.6.8 における Socket.getaddrinfo の挙動が不安定なようです。
以下のように、タイミングによって動作したりしなかったりします。

pre>>
ruby-1.8.7-p302 :012 > Socket.getaddrinfo("localhost", nil)
SocketError: getaddrinfo: nodename nor servname provided, or not known
from (irb):12:in `getaddrinfo'
from (irb):12
ruby-1.8.7-p302 :013 > Socket.getaddrinfo("localhost", nil)
=> [["AF_INET", 0, "en.localhost", "127.0.0.1", 2, 2, 17], ["AF_INET", 0, "en.localhost", "127.0.0.1", 2, 1, 6], ["AF_INET6", 0, "localhost", "::1", 30, 2, 17], ["AF_INET6", 0, "localhost", "::1", 30, 1, 6]]
<<--

MacOS環境でのSocket.getaddrinfoは鬼門なようで、
これまでにも様々な問題が報告されているようですね。

今回は全く同じ条件下で挙動が変わるというものなので、なかなか手ごわい感じです。

posted by genki genki on Sun 7 Aug 2011 at 14:17 with 0 comments

RubyのStructは便利なのでよく使いますが、いくつか欠点があります。

  • 無名Structを継承すると、スクリプトのreload時にsuperclass mismatchエラーが出る
  • 同一構造のStructを定義しようとしても別なStructオブジェクトが返ってくる
  • 名前付きStructの場合、Struct::StructName のような名前空間に定義されるので衝突が心配

これらの問題を回避するために、以下のように Struct.[] を定義することにしました。

ruby>>
def Struct.
name = members.map(&:to_s).sort.map(&:upcase).join('__')
const_defined?(name) ? const_get(name) : new(name, *members)
end
<<--

これを使って

ruby>>
class Dog < Struct[:name, :age, :height, :weight]
end
<<--

のように利用すれば、既に定義済みの場合には定義済みのStructを参照し、そうでない場合には新たにStructを定義するようになるので、上述の問題は解決できます。

なにより、

ruby>>
Struct.new(:name, :age, :height, :weight)
<<--

と書くよりスッキリします。

posted by genki genki on Sun 7 Aug 2011 at 00:24 with 0 comments

Rubyを使い初めてから結構たちますが、まだ新しい発見というのはあるものですね。

class_evalでブロックを渡す時に、引数も渡したいと思っていたのですが、
class_execはちょうどその目的に使えるようです。

ruby>>
FOO = lambda{|bar| puts bar}

class Foo
class_exec("Foo", &FOO)
end #=> Foo
<<--

posted by genki genki on Sat 6 Aug 2011 at 19:23 with 0 comments

kyotocabinet用のRubygemがbuildできない状態になっていたので、
配布元のkyotocabinet-rubyからgemを書き起こしました。

Gemfile

ruby>>
gem 'kyotocabinet-ruby', '~> 1.27',
:require => 'kyotocabinet'
<<--

posted by genki genki on Mon 1 Aug 2011 at 04:10 with 0 comments

Rubyのリファレンスを参照するときは、いつもGoogleで検索していたのですが、なぜか検索結果からのリンクがリンク切れに。
昔のリファレンスは

にあったのですが、以下のように新しいURLに移動したようです。

旧版は以下に移動した模様。

検索インデックスが新しくなるようにGoogle botに頑張って欲しいです。

See Also

posted by genki genki on Thu 21 Jul 2011 at 13:25 with 0 comments
5th Tue

Slim雑感

Sinatra 1.2からサポートされたSlimについての調査メモ。

  • http://slim-lang.com
  • 基本的にHamlの亜種的な立ち位置でもっとシンプル。
  • 拡張子は.slim
  • a href=foo のようにquoteされてない場合は右辺値がrubyコードとして評価されるのがcool。
  • = はデフォルトでHTML escapeされる。escapeしない場合は ==
    • inline形式では #{{hoge}} でエスケープしない。
  • #my_id.my_class はhamlと一緒。tag省略はdivも一緒。
  • 行末 \\ や行頭|で複数行など、複数行のサポートが充実
  • filterは coffee: のように:を後置。hamlとは逆
posted by genki genki on Tue 5 Jul 2011 at 00:02 with 0 comments

ActiveRecordを使っている場合、
YamlDb
を使うと比較的簡単にデータの移行ができるようです。
script/consoleあたりから、

ruby>>
YamlDb.dump "/path/to/data.yml" # dump
YamlDb.load "/path/to/data.yml" # load
<<--

という感じに使えます。structureは作ってくれないので、migrationなどであらかじめ用意しておきます。

posted by genki genki on Mon 20 Jun 2011 at 16:04 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

またプロセスがハングアップする問題が発生したため、システム構成を見直し。
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

古い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

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

monk-glue-0.0.1
に含まれている Monk::Glue::Reloaderには微妙な
バグがあり、developmentモードでソースコードを更新したときに
自動リロードが上手くかからない事があるようです。

Rack::Reloaderの問題かと思っていたのですが、
調べてみると Monk::Glue::Reloader の処理に問題があることがわかりました。

reload!メソッドを以下のように修正したところ正常に動作することが確認できました。

ruby>>
def reload!
expanded_loaded_features = $LOADED_FEATURES.map do |path|
File.expand_path(path)
end
hash = Hash[expanded_loaded_features.zip($LOADED_FEATURES)]
deletes = []
files.each do |file|
if path = hash[File.expand_path(file)]
$LOADED_FEATURES.delete(path)
end
end
<<--

$LOADED_FEATURESに絶対パスと相対パスが混在していることがあるようで、
その場合にうまく処理できていないようでした。

$LOADED_FEATURESは全て絶対パスで保持するようにしたほうが良い気がします。

posted by genki genki on Fri 22 Apr 2011 at 15:27 with 0 comments

The main reason of which I was felt in love with Merb is it uses same context for controller and view.
By sharing same context, view_helpers and instance variables become simple.
You just use them in controller then you can use them in view by same manner.
But as you know, Rails3 doesn't.

The reason Rails3 doesn't is probably for caching.
If the view has many outer variables that affects its result, the cache key tends to be very complicated.
In the manner of Rails3, we can use both action caching and partial caching easily. Because the all variables used in view are clear and small.

But in these days, I am doubting the use of those caching.
Now we don't use browsers that has no capability of JavaScript.
In addition, Google treats Ajax pages for indexing well.
Haven't you ever seen the URI that has '#!'?
That's for it.
So now, the most of pages can be provided as static html with dynamic JSON. They are combined by JavaScript.
There's few situations that the action caching and the partial caching go well.

In conclusion, I think the context should be shared between view and controller so that we can use view helpers simply.

posted by genki genki on Wed 12 Jan 2011 at 09:33 with 0 comments

I added a new feature to irb_rocket.
It's a simple utility for ease of daily irb use.
Have you ever felt annoying for typing left cursor to enclose exprs by parens to be receiver like this?

ruby>>
irb> 1 + 2 + 3 # Oh, I want to call "to_s"
irb> (1 + 2 + 3 # back to the head
irb> (1 + 2 + 3).to_s # return to the tail
<<--

I've experienced stuffs like this very often.
Very annoying.

So I added the new feature named "irb_dollar"
Its usage is simple, like this.

ruby>>
irb> require "irb_dollar"
irb> 1 + 2 + 3 $ to_s #=> "6"
<<--

Nice!

You can use "$" sign to make the left hand statement be receiver by installing irb_rocket version that is newer than 0.2.0

Enjoy :)

Links

posted by genki genki on Mon 3 Jan 2011 at 18:56 with 0 comments

MacOS 10.6でmysql gemを使っていると発生するようだ。

pre>>
% sudo ARCHFLAGS="-arch x86_64" gem install mysql
<<--

こんな感じにgemをインストールすればokでした。

posted by genki genki on Wed 13 Oct 2010 at 20:12 with 0 comments

しばらくGemをリリースしてなかったですが、gemcutterを使って
以下のようにすれば、rubygems.orgにgemをリリースできるようです。

pre>>
% gem push pkg/hoge-x.y.z.gem
<<--

rubygems.orgにアカウントを作っておき、gemcutterをgem installしておく必用があります。
非常に簡単になりましたね。

posted by genki genki on Wed 6 Oct 2010 at 02:00 with 0 comments

Thorを使ってタスクを追加する場合、
通常以下のような感じで名前空間付きのタスクが追加されます。

pre>>
"クラス名":"タスク名"
<<--

グローバルな名前空間にタスクを追加したい場合は、

"help" という名前のタスクを追加すれば良いようです。

posted by genki genki on Sun 15 Aug 2010 at 05:41 with 0 comments

中置記法と暗黙変換のコンビネーションでRubyの後置rescue的なものをScalaで実装してみました。

ruby>>
class Rescueable[A](a: => A) {
def rescue[B](b: => B) = try{a}catch{case _ => b}
}

implicit def anyToRescueable[A](a: => A) = new Rescueable(a)

println("12341234".toLong rescue 0) // => 12341234
println("1234x1234".toLong rescue 0) // => 0
<<--

call-by-nameがポイントです。

Update

bがcall-by-nameになっていなかったので修正しました。

posted by genki genki on Tue 11 May 2010 at 11:03 with 0 comments

RubyistがScalaを簡単に把握できるように、
Google Spreadsheet で対応表をつくってみようかと思いました。

気が向いたら項目を追加していきます。

だれでも編集できる状態なので、加筆修正welcomeです :)

See Also

posted by genki genki on Fri 7 May 2010 at 21:09 with 0 comments

このブログシステムは長いことapache2/passengerで運用してきましたが、
頻繁にrubyプロセスが暴走してアクセスできなくなるということが発生していたので、apache2/mod_proxy_balancer/mongrel_clusterの構成に変えてみました。

しばらく様子見です。

posted by genki genki on Sat 3 Apr 2010 at 21:30 with 0 comments

しばらく前から安定性が悪くなってきたのですが、ここに来て頻繁にPassengerのプロセスが暴走するようになってきました。

  • ruby 1.8.7 (2009-04-08 patchlevel 160) [i686-linux]
  • Passengerのバージョンは2.2.8
  • Rails 2.3.5

プログラムやシステム構成はここしばらくほとんど変えておらず、トラフィックも大きな変動はないので、うわさのEC2のサービス劣化の影響でしょうか。

posted by genki genki on Thu 25 Feb 2010 at 02:06 with 0 comments

しばらくGemを作ってなかったので気がつかなかったのですが、
Gem作りを取り巻く環境が結構変わっているようですね。

まず、newgemやcutagem, hoeのようにgemのひな形を作ってくれる
jeweler
というtoolが結構使われているようです。これはgithubにインテグレートされていて非常に便利です。

githubはちょっと前からgemをホストするgemリポジトリサービスをやめてしまったようで、代わりに
Gemcutterを使うようになっています。
jewelerを使う事で、gemcutterやrubyforgeにgemをpushする事ができます。

posted by genki genki on Sat 17 Oct 2009 at 09:15 with 0 comments

たまにRubyforgeが落ちていてgem installする事ができなくなっている場合がありますが、そんな場合には以下のミラーサーバが利用できるかもしれません。

ローカルにダウンロードしてから sudo gem install します。

posted by genki genki on Sat 10 Oct 2009 at 20:00 with 0 comments
私の場合はCucumberのfeatureをもちろん英語で書いた方が楽なんだけど、日本で生活している以上、日本語で書いた方がいい場合もある。そのため、簡単な日英対訳表をCucumber v0.3.101時点の[languages.yml](http://github.com/aslakhellesoy/cucumber/blob/master/lib/cucumber/languages.yml)からまとめました。 フィーチャの定義 ===========
英語 (原文)日本語 (推奨)日本語 (alt)
Featureフィーチャ機能
Background背景-
Scenarioシナリオ-
Scenario Outlineシナリオアウトラインシナリオテンプレート
テンプレ
シナリオテンプレ
シナリオの定義 (Given-When-Then) ============
英語 (原文)日本語 (推奨)日本語 (alt)
Featureフィーチャ機能
Given前提-
Whenもし-
Thenならば-
Andかつ-
Butしかし但し
Examplesサンプル
参考リンク ====== * [Cucumberの翻訳定義ファイル](http://github.com/aslakhellesoy/cucumber/blob/master/lib/cucumber/languages.yml) * [moroさん作](http://d.hatena.ne.jp/moro/20090603/1244042258)の[misoというwebrat用 日本語step_definitionジェネレータ](http://github.com/moro/miso/tree)は便利だよ
posted by lchin lchin on Fri 18 Sep 2009 at 23:02 with 0 comments

Heroku経由でSinatraを使ってみているのですが、ModelとしてSequelを使ってみることにしました。

###Userクラスを作る
DBをオンメモリにしておいて、テーブル作成・クラスの宣言
shell>>
% irb
require 'rubygems'
require 'sequel'

DB = Sequel.sqlite
DB << "CREATE TABLE users (id INTEGER PRIMARY KEY, name VARCHAR(255) not NULL)"

class User < Sequel::Model
end
<<--

これから、User.なんとかでデータの作成などできます。

shell>>
User.create(:name => 'satoko')

User.find(:name => 'satoko')
User.find(:id => 1).update(:name => 'satoko')
User.find(:id => 1).delete
User.first

User.all
=> [#<User @values={:name=>"satoko", :id=>1}>]

DB[:users].filter(:name => 'satoko').sql
=> "SELECT * FROM users WHERE (name = 'satoko')"
<<--

###findは1件操作なので、複数件の場合はfilterで行う
shell>>
User.filter("id > ?", 0).limit(10).each {|u| p[:name]}
=> #<Sequel::SQLite::Dataset: "SELECT * FROM users WHERE (id > 0)">
<<--

また、@orepuriさんに教えてもらったのですが、all、first、eachなどがあって初めてSQLが発行されるそうで、なかなか面白いです

###References
Sequel概要(2年前の資料なので、コード的には古いかもしれません)
http://www.slideshare.net/zhesto/ruby-off-rails-japanese

チートシート
http://sequel.rubyforge.org/rdoc/files/doc/cheat_sheet_rdoc.html
http://cheat.errtheblog.com/s/sequel/

Classリファレンス:ModelやDatasetなど
http://sequel.rubyforge.org/documentation.html

posted by satoko satoko on Wed 16 Sep 2009 at 21:30 with 0 comments

Snow LeopardでMySQLの64-bitバイナリのインストールまではメモなしでできてしまうけど、その後のmysql gemのインストールするためのおまじないはなかなか覚えられないからメモ書きする。

shell-unix-generic>>
sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
<<--

なぜARCHFLAGSが必要かというと、gem installする時に32-bitと64-bit両方に対応するgemをビルドしようとするけど、mysqlのバイナリは64-bitのみ(つまりUniversalじゃない)からARCHFLAGSでx86_64を明示的に指定しないとビルドが失敗する。mysql gemは例外的なケースらしいから、tmtmさんに早く直してほしいな。

参考リンク

posted by lchin lchin on Tue 8 Sep 2009 at 16:42 with 0 comments

GAEなどでファイル数の多いライブラリを使うために、gemのパッケージから不要そうなファイルを消してjarファイルにまとめるために作ったスクリプトです。

ruby>>
#!/usr/bin/env ruby

def run(command)
puts command
system command
end

case ARGV[0]
when 'install'
run "jgem install -i ./gems --no-ri --no-rdoc #{ARGV[1]}"
when 'uninstall'
run "jgem uninstall -i ./gems #{ARGV[1]}"
end

Dir['gems/gems/'].each do |dir|
%w(
Generaters TODO README.
README
spec// test// examples// tasks//
tutorial// demo// website/**/*
CHANGES CHANGES.txt CHANGELOG
LICENSE MIT-LICENSE Rakefile CONTRIBUTORS
Manifest.txt History.txt install.rb setup.rb
).each do |pattern|
Dir[File.join(dir, pattern)].each do |path|
run "rm -rf #{path}"
end
end
end

Dir['gems/cache', 'gems/bin', 'gems/doc'].each do |path|
run "rm -rf #{path}"
end

run "jar cf lib/merb.jar -C ./gems ."
<<--

posted by genki genki on Mon 7 Sep 2009 at 19:14 with 2 comments

事前にパスの調整をする。Macでは 、/etc/pathsで定義した方が楽だ。どのシェルを使っても、デフォで入るパス設定だ。以下のようにするといいかな。
shell-unix-generic>>
$ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/local/sbin
/usr/sbin
/sbin
<<--
パスがこうなる:
shell-unix-generic>>
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/X11/bin
<<--
/usr/X11/bin/etc/paths.d/X11から設定されている。詳しくはman path_helperで。

MacではReadlineのかわりにBSD系Editlineを使っているけど、これは日本語などとの相性が悪くいためMac標準のRubyのirbが使いものにならない。なので、まずは最新のReadlineを入れる。
shell-unix-generic>>
curl -O ftp://ftp.cwru.edu/pub/bash/readline-6.0.tar.gz
tar xzf readline-6.0.tar.gz
cd readline-6.0
./configure --enable-multibyte --enable-shared
make
sudo make install
<<--

Readlineの用意ができたら、Rubyを入れる。Ruby 1.9でもいいけど、まだ自信がないので1.8.7にする。
shell-unix-generic>>
curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz
tar xzf ruby-1.8.7-p174.tar.gz
cd ruby-1.8.7-p174
./configure --enable-shared --enable-pthread --with-readline-dir=/usr/local CFLAGS=-D_XOPEN_SOURCE=1
make
sudo make install
<<--

しめとしてRubyGems
shell-unix-generic>>
curl -O http://files.rubyforge.vm.bytemark.co.uk/rubygems/rubygems-1.3.5.tgz
tar xzvf rubygems-1.3.5.tgz
cd rubygems-1.3.5
sudo /usr/local/bin/ruby setup.rb
<<--

はい、カンタンですね。これくらいなら、まだまだMacPortsは要らない。

posted by lchin lchin on Mon 7 Sep 2009 at 17:49 with 0 comments