• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
 
 

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

使い方:

   1  % gem install magic-commenter
   2  % cd /path/to/root/of/ruby/files
   3  % magic-commenter

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

posted by Png genki on Sun 20 Nov 2011 at 16:59

database.ymlに

   1  development:
   2    timeout: 2000

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

posted by Png genki on Tue 8 Nov 2011 at 04:17

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

   1  create_table do |t|
   2    t.string :foo
   3  end

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

   1  create_table do |t|
   2    t.instance_eval do
   3      string :foo
   4    end
   5  end

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

   1  create_table do
   2    string :foo
   3  end

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

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

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

   1  case price # <= この値を $ で参照したい
   2  when $ < 5; #...
   3  when $ < 10; #...
   4  end

参照できるといいな。

posted by Png genki on Wed 31 Aug 2011 at 07:52

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

   1  % 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 Png genki on Wed 31 Aug 2011 at 03:51

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

   1  def foo(a = nil)
   2    a
   3  end
   4  
   5  foo #=> nil
   6  foo("test") => "test"

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

   1  def foo(a = (a_default = true) && nil)
   2    [a,a_default]
   3  end
   4  
   5  foo #=> [nil, true]
   6  foo("test") #=> ["test", nil]

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

posted by Png genki on Tue 9 Aug 2011 at 04:54

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

   1  ruby-1.8.7-p302 :012 > Socket.getaddrinfo("localhost", nil)
   2  SocketError: getaddrinfo: nodename nor servname provided, or not known
   3          from (irb):12:in `getaddrinfo'
   4          from (irb):12
   5  ruby-1.8.7-p302 :013 > Socket.getaddrinfo("localhost", nil)
   6   => [["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 Png genki on Sun 7 Aug 2011 at 14:22

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

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

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

   1  def Struct.[](*members)
   2    name = members.map(&:to_s).sort.map(&:upcase).join('__')
   3    const_defined?(name) ? const_get(name) : new(name, *members)
   4  end 

これを使って

   1  class Dog < Struct[:name, :age, :height, :weight]
   2  end

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

なにより、

   1  Struct.new(:name, :age, :height, :weight)

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

posted by Png genki on Sun 7 Aug 2011 at 00:32

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

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

   1  FOO = lambda{|bar| puts bar}
   2  
   3  class Foo
   4    class_exec("Foo", &FOO)
   5  end #=> Foo

posted by Png genki on Sat 6 Aug 2011 at 19:28

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

Gemfile

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

posted by Png genki on Mon 1 Aug 2011 at 04:22

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

  • http://www.ruby-lang.org/ja/man/html/*

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

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

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

See Also

posted by Png genki on Thu 21 Jul 2011 at 13:29