• 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
  • 31
 
 

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/155

最近まで知らなかったRubyの豆知識。

:'a*!//bc'.class => Symbol

文字列リテラルの頭にコロンを書けば、どんな文字列でもシンボルになります。

最近のRailsでは、名前空間の無いRakeタスクがDeprecatedになったので、Rakeタスクの依存関係を指定するときに、

task :foo => [:'bar:baz'] do ...

のように書けて便利かも。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/155

posted by Png genki on Thu 11 Jan 2007 at 23:09

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/154

たいしたものじゃないですが、dJavaScriptの実装をRailsプラグインとして作ってみました。

http://svn.labs.drecom.jp/rails/plugins/trunk/djavascript

サーバ側でやることは、プラグインをインストールし、json.js, djavascript.jsをjavascript_include_tagして、コントローラの中で

djavascript :object_name

のように公開するオブジェクトを登録します。
実際には、session[:object_name]が公開されます。

あとは、クライアントサイドから以下のような感じで使います。

var obj = new DJSObject('http://foo.bar.com/controller_name/djavascript');
alert(obj.methods());

new DJSObject( ... ) の呼び出しでリモートオブジェクトのpublicメソッド一覧を取得して、プロクシメソッドをobjに定義します。

obj.methods() で、リモートオブジェクトの 'methods'メソッドを呼び出し、戻り値をto_jsonして返します。

通信にXHRを使っているので、同一ドメイン内でしか使えません。
scriptタグをappendChlidする方式にすればドメイン境界を越えられますが、戻り値をreturnできないのがかっこ悪かったので、XHRにしてます。

もうちょっとちゃんと作れば、RESTとかXML-RPCに代わるAPIの一種として使えないこともないかも。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/154

posted by Png genki on Thu 11 Jan 2007 at 21:52
9th Tue

dJavaScript

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/153

dRubyのJavaScript版は既にあるのかな。まだないなら作ってみたい。

var obj = new DJSObject('djavascript://foo.bar.com:1234');
obj.foo();

とはいっても、dRubyと同じものを全部JavaScriptで実装するわけじゃなくて、dRubyサーバと通信できるJavaScriptで実装されたクライアントを作ろうという事ですね。Cometを使えば双方向通信できそうだけど、最初はクライアント側からリモートオブジェクトのメソッドを呼び出すだけのものが良いかな。

プロクシであるDJSObjectのほかに、dRubyサーバ側のスタブも実装しないといけないな。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/153

posted by Png genki on Tue 9 Jan 2007 at 10:16

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/151

detachしたGNU screenのセッションに、別なサーバから再接続したり、一度ログアウトしてから再接続しようとすると、SSH Agent Forwardingがうまく機能しなくなってしまいます。 この問題は、screen作成時に設定されたSSH関連の環境変数(SSH_XXXX)が、再接続時には無効な値となっていることにscreenが気づかないために起こります。

従って、この問題を解決するためには、再接続の直前に接続元の SSH関連の環境変数をコピーし、接続後にその値を再設定する必要があります。 以下は、これを実施するためのShellスクリプトの例です。

# fix ssh env
if [ "$TERM" = "screen" ]; then
  alias fixsshenv='cat ~/.ssh/fix_ssh_env | sh'
  alias ssh='fixsshenv; ssh'
  alias svn='fixsshenv; svn'
else
  export | grep '^SSH_' > ~/.ssh/fix_ssh_env
fi
これを~/.bashrcや~/.zshrcに記述しておけば、SSH Agent Forwardingが うまく行かなくなったときに
$ fixsshenv
を実行する事で復帰させる事ができます。 便利のためにsshとsvnコマンドはaliasを設定しています。 screenへのre-attach時に、自動的にfixsshenvを実行するようにできたらスマートですね。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/151

posted by Png genki on Sun 31 Dec 2006 at 05:55

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/150

Rails1.1.6で作成したアプリケーションについて、EdgeRailsおよびRails1.2RC1で動作検証したところ、ActiveRecord::Base.lock_mutex/unlock_mutexを使っている場合にエラーが発生するようです。

代わりに次のように書き換えると動作するようです。

#ActiveRecord::Base.lock_mutex
ActiveRecord::Base.send :increment_open_transactions

#ActiveRecord::Base.unlock_mutex 
ActiveRecord::Base.send :decrement_open_transactions 
この辺を参考にしました。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/150

posted by Png genki on Sat 30 Dec 2006 at 23:21

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/146

Ruby on Railsには、IntegrationTestを行う機能がありますが、このIntegrationTestの中でrender_componentを呼び出す処理を行う場合に、

No action responded to XXXXX
というエラーが出てしまうという現象が発生して困っていました。

FunctionalTestや実際の運用環境では問題なく動作するのですが、IntegrationTestの場合は上記のエラーが出てしまうんですよね。 色々調べてみても原因が突き止められなかったのですが、思いがけないところから解決の糸口を発見する事ができました。

ちょうどEdgeRailsとRuby-GetText-Packageの問題の解決策を調べていたのですが、この角谷さんの投稿を見てでピンと来ました。

ENV['REQUEST_URI'] = url_for('controller' => 'foo', 'action' => 'bar')
render_component 'controller' => 'foo', 'action' => 'bar'
これでOKでした。角谷さんありがとうございます。

注: この方法がうまく行くのは、いまのところEdgeRailsだけのようです。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/146

posted by Png genki on Sat 30 Dec 2006 at 15:01

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/149

Rails 1.2のReleace候補が出てからしばらくたちますし、 そろそろ検証してみないとと思って色々やってみたところ、 Ruby-GetText-Packageを使っていると

Rails 1.2RC1にてエラーの報告
という問題が起きる事がわかりました。

この問題は、CVS版のRuby-GetText-Package version 1.9.0を使うと回避できます。 加えて、角谷さんが投稿してくれているpatchも適用した方がいいようです。

それから、下記のDEPRECATION WARNINGに遭遇しました。

model is deprecated

ActionController::DependenciesモジュールのmodelメソッドはRails2.0で使えなくなりますよ、という警告。modelメソッドについてはこの記事が詳しい。

この場合、単純にmodelディレクティブを削除すれば良いかな。 ただし、namespace付きのARを使ってる場合は注意が必要なようです(この辺で報告されている)

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/149

posted by Png genki on Sat 30 Dec 2006 at 13:23

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/148

Rubyのnewメソッドとallocateメソッドの挙動に関するメモ。

$ irb
>> class Foo
>>   def initialize(a)
>>     @foo = a
>>   end
>>   def foo
>>     initialize("test")
>>   end
>> end
=> nil
>> a = Foo.new("bb")
=> #<Foo:0x40203ce0 @foo="bb">
>> b = Foo.allocate
=> #<Foo:0x401f4b50>
>> b.foo
=> "test"
>> b
=> #<Foo:0x401f4b50 @foo="test">
new*1 = allocate + initialize*2 ということですね。ファクトリーパターンを実装するのが楽になりそう。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/148

  1. 1 args

  2. 2 args

posted by Png genki on Fri 29 Dec 2006 at 14:40

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/147

西さん(a.k.a. maiha)のRuby on Rails入門のp112に書かれてる偽STIが面白そうだったので、 instantiateのソースコードをメモ。

# File src/rails-1.1.6/activerecord/lib/active_record/base.rb, line 975
def instantiate(record)
  object = 
    if subclass_name = record[inheritance_column]
      if subclass_name.empty?
        allocate
      else
        require_association_class(subclass_name)
        begin
          compute_type(subclass_name).allocate
        rescue NameError
          raise SubclassNotFound,
            "The single-table inheritance mechanism failed to locate the subclass: '#{ record[inheritance_column] }'. " +
            "This error is raised because the column '#{ inheritance_column }' is reserved for storing the class in case of inheritance. " +
            "Please rename this column if you didn't intend it to be used for storing the inheritance class " +
            "or overwrite #{ self.to_s }.inheritance_column to use another column for that information."
        end
      end
    else
      allocate
    end

  object.instance_variable_set("@attributes", record)
  object
end
ソースコードはここから持ってきました。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/147

posted by Png genki on Fri 29 Dec 2006 at 13:02

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/145

WirbleというRubyGemsの話です。

from RubyInside:

Wirble: Tab-Completion and Syntax Coloring for irb
これを使うとirbの出力をカラフルにして視認性をよくすることができます。

使い方は、まずWirbleをインストールします。

$ sudo gem install wirble --include-dependencies
続いて、~/.irbrcに以下の記述を追記します。
require 'rubygems'
require 'wirble'
Wirble.init
Wirble.colorize
以上で完了です。irbコマンドだけでなく、script/consoleやscript/breakpointerでも色づけされた結果が表示されます。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/145

posted by Png genki on Mon 18 Dec 2006 at 17:55