メニュー

関連ページリンク

トップ > common > common - 人気ブログ(Blog)検索結果詳細 (2008年12月1日 9時)

[Rails][Ruby]Rails2.2でRuby1.9.1-preview1がさっぱり動かない件

Ruby on Rails 2.2 Release Notes

1.2. Compatibility with Ruby 1.9 and JRuby

Along with thread safety, a lot of work has been done to make Rails work well with JRuby and
 the upcoming Ruby 1.9. With Ruby 1.9 being a moving target, running edge Rails on edge Ruby
 is still a hit-or-miss proposition, but Rails is ready to make the transition to Ruby 1.9 when the latter is released.

おぉ,それじゃあruby1.9.1-preview1で試してみるか.

% mkdir sample_1_9_1_pre1
% cd sample_1_9_1_pre1/
% rails-1.9.1-pre1 .
% ruby-1.9.1-pre1 ./script/server                  
/1.9.1/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in 
`require': no such file to load -- test/unit/error (MissingSourceFile)

ちょ.動かん.

test/unit/自体もう1ヶ月前に削除されてるのに..

 

ただgithubを観てみると着々と1.9対応は進んでいるようで.

ちょこちょこ修正するとかろうじて動きました..

rails自体は悪くない感じで主にrackとかそこら辺のライブラリが怪しい..

Rails2.3では1.9.1がちゃんと動いてくれそうですね.

f:id:authorNari:20081202004039p:image

追記

rackがruby1.9.1で動かない件は文字列のeachを使用している所にあったのでパッチを投げておいた.

というかgithubだったのでforkしてpull requestしたってだけだけど.

作者:authorNari

更新日:2008年12月2日 0時20分

このブログのホーム

[NaCl]Unlambdaについて〜第8回NaCl勉強会〜

今日の勉強会はyharaさんの「Unlambdaについて」です.

いつも通り,午後六時頃から.

本日はUstreamなしです.

感想

終わりました.

λすげー!

引き算とかマジで凄すぎた.

昔の人は頭良いなぁー.

作者:authorNari

更新日:2008年12月1日 10時15分

このブログのホーム

[Ruby]そろそろ分かっておきたいY Combinator

もうすぐ年明けだし,Yコンビネータの魔法みたいな動きに惑わされる人

たちがでてくるんじゃないかなと思ってRubyで解説してみます.

 

参考に

[ruby-list:35058] Y Combinator

Y Combinator

Y Combinator

 

Y Combinatorって何?

3年周期くらいでお騒がせのYさんってそもそも何なのかという話ですが,動機として

再帰の時に自分の名前を使わずに,なんとかして関数そのものを呼びたい

というのがあって,例えば階乗とかしたいときに

def fact(n); n == 0 ? 1 : n * fact(n-1); end
#                            ここを消したい!

と言う事です.

何が嬉しいのかというと,さっぱり分かりませんし,arguments.calleeとか普通に名前使える所では使えばいいんじゃないのかな.

 

前置き

Ruby1.9のlambdaでは

->{|n| puts n}[3] #=> 3

ちょっとネストしたりすると分かりづらいので説明では

lambda{|n| puts n}[3] #=> 3

としますね.

ちなみに[]は配列の要素指定では無く.『.call』の別名です.

 

Rubyで分かるY Combinator

これのfactという名前をなんとか消したい.

def fact(n); n == 0 ? 1 : n * fact(n-1); end

 

だったら,factのメソッドを生成するものを定義すればいいじゃないかという事で.

fact_makerというfactを生成するlambda作る事にします.

fact_maker = lambda{|proc| lambda{|n| n == 0? 1 : n * proc[(n-1)] }}
puts fact_maker[5] #=> <Proc:0xb7c399cc@./ycombinator.rb:8>

引数に5を入れたらProcが返ってきた!Rubyのバグですか!

違います.よく見ると当然のことですね.

fact_makerはfactを生成するだけですので,それに5とか与えられてもね.

 

これが正しい呼び出し方

fact_maker = lambda{|proc| lambda{|n| n == 0? 1 : n * proc[proc][(n-1)] }}
puts fact_maker[fact_maker][5]

 

変更した点は二箇所

  1. fact_maker[fact_maker]
  2. proc[proc]

つまり

  1. fact_maker呼び出し
  2. 次回に呼ぶfact_maker渡し
  3. 生成された関数に引数渡し

という流れになります.

しかし,やっぱりfact_makerという名前が残ってしまった.しかもproc[proc]というのもちょっとダサい.

そこでfact_maker[fact_maker]の部分を生成するものを作ることにしましょう.

これには

5 #=> 5
lambda{|n| n}[5] #=> 5

が等価だって事を利用します.

上と下が違うのはlambdaを挟んで遅れて評価しているという点です.(これ重要)

  

これを何も考えずに当てはめてみると.

fact_maker = lambda{|proc| lambda{|n| n == 0? 1 : n * lambda{|args| proc[proc][args] }[(n-1)]} }
puts fact_maker[fact_maker][5] #=> 120

になります.

 

そして,ここから一気にその部分を外に抜き出すと..

fact_maker = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
proc_proc = lambda{|proc| fact_maker[lambda{|args| proc[proc][args] }]}

これでproc[proc]という呼び出しが fact_maker のlambda内から消えましたね.

 

次は肝心の fact_maker[fact_maker] の部分を消す所ですが,これは簡単ですね.

なぜなら fact_maker って proc[proc] の事なんですから.

fact_maker = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
proc_proc = lambda{|proc| fact_maker[lambda{|args| proc[proc][args] }]}
puts proc_proc[proc_proc][5] #=> 120

 

次は proc_proc から fact_maker という名前も消したいと思います.

これも引数から取るようにすればいいので.

fact_maker = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
proc_proc = lambda{|f| lambda{|proc| f[lambda{|args| proc[proc][args] }]}}
puts proc_proc[fact_maker][proc_proc[fact_maker]][5] #=> 120

 

次はproc_proc[proc_proc]の部分を一つにしてしまいましょう.

面倒ですので.

fact_maker = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
pppp = lambda do |f| 
  lambda{|proc| f[lambda{|args| proc[proc][args] }]}[
    lambda{|proc| f[lambda{|args| proc[proc][args] }]}
  ]
end
puts pppp[fact_maker][5] #=> 120

  

次に fact_maker はもう fact_ を make しないので名前を変えてしまいましょう.

fact = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
pppp = lambda do |f| 
  lambda{|proc| f[lambda{|args| proc[proc][args] }]}[
    lambda{|proc| f[lambda{|args| proc[proc][args] }]}
  ]
end
puts pppp[fact][5] #=> 120

 

それで Y Combinator って何かっていうと.

fact = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
Y = lambda do |f| 
  lambda{|proc| f[lambda{|args| proc[proc][args] }]}[
    lambda{|proc| f[lambda{|args| proc[proc][args] }]}
  ]
end
puts Y[fact][5] #=> 120

これの事なんですね.

factが参照しているlambdaの引数に自分自身の名前を入れてくれるようなんです.

ファンタジーですね.

 

Unlambda

The Unlambda Programming Language

について調べていたら Y Combinator なんて勉強する羽目に..恐ろしい子.

作者:authorNari

更新日:2008年11月30日 1時45分

このブログのホーム

[emacs][rails]rails.elの設定ではまった

色々バグフィックスされているがまったくリリースする気なさげなので最新を取得しておく.

$ svn co http://emacs-rails.rubyforge.org/svn/trunk/

yasnippetとの相性

ちょっと併用して使えないので

(add-hook 'rails-minor-mode-hook
 	  '(lambda ()
 	     (yas/minor-mode-off)))

でオフした.

Ctr+Enter

rails.elでは,

render :partial => "hoge"
render :action => "fuga"

などの部分でCtr+Enterを押すとそのテンプレートに飛んでくれる.

しかし,".rhtml"拡張子にしか対応してない.

最近のRailsでは".html.erb"を使うのでこれを修正した.

Index: rails-core.el
===================================================================
--- rails-core.el       (リビジョン 232)
+++ rails-core.el       (作業コピー)
@@ -236,14 +236,14 @@
   "Return the file name of partial NAME."
   (if (string-match "/" name)
       (concat "app/views/"
-        (replace-regexp-in-string "\\([^/]*\\)$" "_\\1.rhtml" name))
+        (replace-regexp-in-string "\\([^/]*\\)$" "_\\1.html.erb" name))
     (concat (rails-core:views-dir (rails-core:current-controller))
-      "_" name ".rhtml")))
+      "_" name ".html.erb")))
 
 (defun rails-core:view-name (name)
   "Return the file name of view NAME."
   (concat (rails-core:views-dir (rails-core:current-controller))
-          name ".rhtml")) ;; BUG: will fix it
+          name ".html.erb")) ;; BUG: will fix it
 
 (defun rails-core:helper-file (controller)
   "Return the helper file name for the controller named
@@ -669,6 +669,6 @@
 
 (defun rails-core:rhtml-buffer-p ()
   "Return non nil if the current buffer is rhtml file."
-  (string-match "\\.rhtml$" (buffer-file-name)))
+  (string-match "\\.html.erb$" (buffer-file-name)))
 
 (provide 'rails-core)
Index: rails-view-minor-mode.el
===================================================================
--- rails-view-minor-mode.el    (リビジョン 232)
+++ rails-view-minor-mode.el    (作業コピー)
@@ -43,7 +43,7 @@
           (insert  "\n")
           (split-window-vertically)
           (other-window 1)
-          (find-file (concat "_" name ".rhtml"))
+          (find-file (concat "_" name ".html.erb"))
           (goto-char (point-min))
           (erase-buffer)
           (insert content)

かなりアドホックだけど..まぁいいか.

作者:authorNari

更新日:2008年11月29日 13時20分

このブログのホーム

atokx3のiiim-propertiesがsegvする

久々にPCを再起動するとATOKのCtr+Spaceが復活した.

原因はiiim-propertiesのsegvにあるらしい.

 $ iiim-properties

で起動して「適用」ボタンを押すと

 zsh: segmentation fault  iiim-properties

ちょ..

 

原因は設定ファイルである~/.gconf/desktop/input_methods/%gconf.xmlの肥大化にあるそうだ.

対策は以下のサイトを参考させていただいた.

ubuntu hardy amd64 で ATOK X3 の iiim-properties を動作させる - Assemblr

 

これはしかし酷いバグだなぁ.

作者:authorNari

更新日:2008年11月29日 13時5分

このブログのホーム

[抜粋]ユートピアとは

f:id:authorNari:20081127211323p:image

ユートピアは現実には決して存在しない理想的な社会として描かれ、その意図は
現実の社会と対峙させることによって、現実への批判をおこなうことであった。

(via ユートピア - Wikipedia)

作者:authorNari

更新日:2008年11月27日 21時14分

このブログのホーム

[Rails][Ruby]Rails2.2でRuby1.9.1-preview1がさっぱり動かない件

Ruby on Rails 2.2 Release Notes

1.2. Compatibility with Ruby 1.9 and JRuby

Along with thread safety, a lot of work has been done to make Rails work well with JRuby and
 the upcoming Ruby 1.9. With Ruby 1.9 being a moving target, running edge Rails on edge Ruby
 is still a hit-or-miss proposition, but Rails is ready to make the transition to Ruby 1.9 when the latter is released.

おぉ,それじゃあruby1.9.1-preview1で試してみるか.

% mkdir sample_1_9_1_pre1
% cd sample_1_9_1_pre1/
% rails-1.9.1-pre1 .
% ruby-1.9.1-pre1 ./script/server                  
/1.9.1/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in 
`require': no such file to load -- test/unit/error (MissingSourceFile)

ちょ.動かん.

test/unit/自体もう1ヶ月前に削除されてるのに..

 

ただgithubを観てみると着々と1.9対応は進んでいるようで.

ちょこちょこ修正するとかろうじて動きました..

rails自体は悪くない感じで主にrackとかそこら辺のライブラリが怪しい..

Rails2.3では1.9.1がちゃんと動いてくれそうですね.

f:id:authorNari:20081202004039p:image

追記

rackがruby1.9.1で動かない件は文字列のeachを使用している所にあったのでパッチを投げておいた.

というかgithubだったのでforkしてpull requestしたってだけだけど.

作者:authorNari

更新日:2008年12月1日 15時20分

このブログのホーム

[NaCl]Unlambdaについて〜第8回NaCl勉強会〜

今日の勉強会はyharaさんの「Unlambdaについて」です.

いつも通り,午後六時頃から.

本日はUstreamなしです.

感想

終わりました.

λすげー!

引き算とかマジで凄すぎた.

昔の人は頭良いなぁー.

作者:authorNari

更新日:2008年12月1日 1時15分

このブログのホーム

[Ruby]そろそろ分かっておきたいY Combinator

もうすぐ年明けだし,Yコンビネータの魔法みたいな動きに惑わされる人

たちがでてくるんじゃないかなと思ってRubyで解説してみます.

 

参考に

[ruby-list:35058] Y Combinator

Y Combinator

Y Combinator

 

Y Combinatorって何?

3年周期くらいでお騒がせのYさんってそもそも何なのかという話ですが,動機として

再帰の時に自分の名前を使わずに,なんとかして関数そのものを呼びたい

というのがあって,例えば階乗とかしたいときに

def fact(n); n == 0 ? 1 : n * fact(n-1); end
#                            ここを消したい!

と言う事です.

何が嬉しいのかというと,さっぱり分かりませんし,arguments.calleeとか普通に名前使える所では使えばいいんじゃないのかな.

 

前置き

Ruby1.9のlambdaでは

->{|n| puts n}[3] #=> 3

ちょっとネストしたりすると分かりづらいので説明では

lambda{|n| puts n}[3] #=> 3

としますね.

ちなみに[]は配列の要素指定では無く.『.call』の別名です.

 

Rubyで分かるY Combinator

これのfactという名前をなんとか消したい.

def fact(n); n == 0 ? 1 : n * fact(n-1); end

 

だったら,factのメソッドを生成するものを定義すればいいじゃないかという事で.

fact_makerというfactを生成するlambda作る事にします.

fact_maker = lambda{|proc| lambda{|n| n == 0? 1 : n * proc[(n-1)] }}
puts fact_maker[5] #=> <Proc:0xb7c399cc@./ycombinator.rb:8>

引数に5を入れたらProcが返ってきた!Rubyのバグですか!

違います.よく見ると当然のことですね.

fact_makerはfactを生成するだけですので,それに5とか与えられてもね.

 

これが正しい呼び出し方

fact_maker = lambda{|proc| lambda{|n| n == 0? 1 : n * proc[proc][(n-1)] }}
puts fact_maker[fact_maker][5]

 

変更した点は二箇所

  1. fact_maker[fact_maker]
  2. proc[proc]

つまり

  1. fact_maker呼び出し
  2. 次回に呼ぶfact_maker渡し
  3. 生成された関数に引数渡し

という流れになります.

しかし,やっぱりfact_makerという名前が残ってしまった.しかもproc[proc]というのもちょっとダサい.

そこでfact_maker[fact_maker]の部分を生成するものを作ることにしましょう.

これには

5 #=> 5
lambda{|n| n}[5] #=> 5

が等価だって事を利用します.

上と下が違うのはlambdaを挟んで遅れて評価しているという点です.(これ重要)

  

これを何も考えずに当てはめてみると.

fact_maker = lambda{|proc| lambda{|n| n == 0? 1 : n * lambda{|args| proc[proc][args] }[(n-1)]} }
puts fact_maker[fact_maker][5] #=> 120

になります.

 

そして,ここから一気にその部分を外に抜き出すと..

fact_maker = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
proc_proc = lambda{|proc| fact_maker[lambda{|args| proc[proc][args] }]}

これでproc[proc]という呼び出しが fact_maker のlambda内から消えましたね.

 

次は肝心の fact_maker[fact_maker] の部分を消す所ですが,これは簡単ですね.

なぜなら fact_maker って proc[proc] の事なんですから.

fact_maker = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
proc_proc = lambda{|proc| fact_maker[lambda{|args| proc[proc][args] }]}
puts proc_proc[proc_proc][5] #=> 120

 

次は proc_proc から fact_maker という名前も消したいと思います.

これも引数から取るようにすればいいので.

fact_maker = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
proc_proc = lambda{|f| lambda{|proc| f[lambda{|args| proc[proc][args] }]}}
puts proc_proc[fact_maker][proc_proc[fact_maker]][5] #=> 120

 

次はproc_proc[proc_proc]の部分を一つにしてしまいましょう.

面倒ですので.

fact_maker = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
pppp = lambda do |f| 
  lambda{|proc| f[lambda{|args| proc[proc][args] }]}[
    lambda{|proc| f[lambda{|args| proc[proc][args] }]}
  ]
end
puts pppp[fact_maker][5] #=> 120

  

次に fact_maker はもう fact_ を make しないので名前を変えてしまいましょう.

fact = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
pppp = lambda do |f| 
  lambda{|proc| f[lambda{|args| proc[proc][args] }]}[
    lambda{|proc| f[lambda{|args| proc[proc][args] }]}
  ]
end
puts pppp[fact][5] #=> 120

 

それで Y Combinator って何かっていうと.

fact = lambda{|f| lambda{|n| n == 0? 1 : n * f[(n-1)]} }
Y = lambda do |f| 
  lambda{|proc| f[lambda{|args| proc[proc][args] }]}[
    lambda{|proc| f[lambda{|args| proc[proc][args] }]}
  ]
end
puts Y[fact][5] #=> 120

これの事なんですね.

factが参照しているlambdaの引数に自分自身の名前を入れてくれるようなんです.

ファンタジーですね.

 

Unlambda

The Unlambda Programming Language

について調べていたら Y Combinator なんて勉強する羽目に..恐ろしい子.

作者:authorNari

更新日:2008年11月29日 16時45分

このブログのホーム

[emacs][rails]rails.elの設定ではまった

色々バグフィックスされているがまったくリリースする気なさげなので最新を取得しておく.

$ svn co http://emacs-rails.rubyforge.org/svn/trunk/

yasnippetとの相性

ちょっと併用して使えないので

(add-hook 'rails-minor-mode-hook
 	  '(lambda ()
 	     (yas/minor-mode-off)))

でオフした.

Ctr+Enter

rails.elでは,

render :partial => "hoge"
render :action => "fuga"

などの部分でCtr+Enterを押すとそのテンプレートに飛んでくれる.

しかし,".rhtml"拡張子にしか対応してない.

最近のRailsでは".html.erb"を使うのでこれを修正した.

Index: rails-core.el
===================================================================
--- rails-core.el       (リビジョン 232)
+++ rails-core.el       (作業コピー)
@@ -236,14 +236,14 @@
   "Return the file name of partial NAME."
   (if (string-match "/" name)
       (concat "app/views/"
-        (replace-regexp-in-string "\\([^/]*\\)$" "_\\1.rhtml" name))
+        (replace-regexp-in-string "\\([^/]*\\)$" "_\\1.html.erb" name))
     (concat (rails-core:views-dir (rails-core:current-controller))
-      "_" name ".rhtml")))
+      "_" name ".html.erb")))
 
 (defun rails-core:view-name (name)
   "Return the file name of view NAME."
   (concat (rails-core:views-dir (rails-core:current-controller))
-          name ".rhtml")) ;; BUG: will fix it
+          name ".html.erb")) ;; BUG: will fix it
 
 (defun rails-core:helper-file (controller)
   "Return the helper file name for the controller named
@@ -669,6 +669,6 @@
 
 (defun rails-core:rhtml-buffer-p ()
   "Return non nil if the current buffer is rhtml file."
-  (string-match "\\.rhtml$" (buffer-file-name)))
+  (string-match "\\.html.erb$" (buffer-file-name)))
 
 (provide 'rails-core)
Index: rails-view-minor-mode.el
===================================================================
--- rails-view-minor-mode.el    (リビジョン 232)
+++ rails-view-minor-mode.el    (作業コピー)
@@ -43,7 +43,7 @@
           (insert  "\n")
           (split-window-vertically)
           (other-window 1)
-          (find-file (concat "_" name ".rhtml"))
+          (find-file (concat "_" name ".html.erb"))
           (goto-char (point-min))
           (erase-buffer)
           (insert content)

かなりアドホックだけど..まぁいいか.

作者:authorNari

更新日:2008年11月29日 4時20分

このブログのホーム

atokx3のiiim-propertiesがsegvする

久々にPCを再起動するとATOKのCtr+Spaceが復活した.

原因はiiim-propertiesのsegvにあるらしい.

 $ iiim-properties

で起動して「適用」ボタンを押すと

 zsh: segmentation fault  iiim-properties

ちょ..

 

原因は設定ファイルである~/.gconf/desktop/input_methods/%gconf.xmlの肥大化にあるそうだ.

対策は以下のサイトを参考させていただいた.

ubuntu hardy amd64 で ATOK X3 の iiim-properties を動作させる - Assemblr

 

これはしかし酷いバグだなぁ.

作者:authorNari

更新日:2008年11月29日 4時5分

このブログのホーム

[抜粋]ユートピアとは

f:id:authorNari:20081127211323p:image

ユートピアは現実には決して存在しない理想的な社会として描かれ、その意図は
現実の社会と対峙させることによって、現実への批判をおこなうことであった。

(via ユートピア - Wikipedia)

作者:authorNari

更新日:2008年11月27日 12時14分

このブログのホーム