2007年 10月 15日

末尾再帰とか継続とか

解説ページをかなり前に一回、結構前に一回読んだんだけど、その二回とも「うーん、よくわからない……」でおわった。ループへの変換とかそういうのが、いまいちよくわかってなかった。

でも読んでから、ときどきそれを思い出して、反芻しているうちに理解できてくる。あぁそうかって思える。わけのわからないものだったけど、「こういうもの」っていうのがだんだん実感できてきて、継続なんかは末尾再帰のループ化にも繋ったりしておもしろい。継続は継続なんだなって思えてくる (ちゃんと理解して使えているかというと、ぜんぜんそんなことはないんんだけど、イメージができてくる)。本とか文書を読んで、そこでちゃんと理解する、っていうのは、頭が良くないとできないんだと思う。

そうなってから更めて Wikipedia とか見てみると納得できる。この確認作業も好きだ。

切ないに近いけれど、もう少し重い感情

っていうのは言葉にすると何になるんだろう……

AKG のケーブル

K271s のケーブルがミニプラグ側で断線ぎりぎり……

商品が見つかりません|サウンドハウス

たけー! 暇なときにミニプラグ側切ってそこらのステレオプラグにはんだ付けしよう。

他人の日記の生データみるやつ

見えない部分への考えかたがわかってしまいますね。

はてな記法は、例えば

aaaaaaa
bbbbbbb

aaaaaaa

bbbbbbb

は同じ (どっちも段落二つ) なので、どっちで書くかは人によったりたり。

Class.new(DelegateClass(Object)).allocate が nil を返すように見える問題 (あるいは inspect の上書きは慎重に)

--- delegate.rb.orig	2007-10-15 03:54:11.000000000 +0900
+++ delegate.rb	2007-10-15 04:01:23.000000000 +0900
@@ -95,7 +95,7 @@
   klass = Class.new
   methods = superclass.public_instance_methods(true)
   methods -= ::Kernel.public_instance_methods(false)
-  methods |= ["to_s","to_a","inspect","==","=~","==="]
+  methods |= ["to_s","to_a","==","=~","==="]
   klass.module_eval {
     def initialize(obj)
       @_dc_obj = obj
@@ -137,6 +137,11 @@
       raise NameError, "invalid identifier %s" % method, caller(3)
     end
   end
+  klass.module_eval do
+    def inspect
+        "#<#{self.class}:#{"%#0x8d"%self.object_id}:DelegateClass->#{@_dc_obj.inspect}>"
+    end
+  end
   return klass
 end

実際にはちゃんとインスタンスが返ってた。でも inspect まで丸投げしてるのでそれがわからなかった。inspect をそのまま委譲するのは正しいとは思えない。inspect が信用できなくなる。

require "delegate"
p Class.new(DelegateClass(Object)).allocate
#=> before: nil
#=>  after: #<#<Class:0x1ef50>:0xe6b48d:DelegateClass->nil>

location_of... がエラーでるのはこれとはまた別の問題……ここまで気付くのに数時間かかった……

そういえば tmpdir が予想と違った

なんとなく Tempfile の親戚だとおもって /tmp/hoge.9999.1 とかかえすとおもったら、たんに /tmp とか返すだけだった。

で、そういうディレクトリが欲しいときって自分で $$ とか書かないといけなくて嫌なんだけど、Tempfile はファイルを作って返すので使えず残念な感じになってしまう。個人的には Pathname に一時的なパスをつくるメソッドがあればいいと思った。

require "tmpdir"
require "pathname"

class Pathname
	@@tempname_number = 0
	def self.tempname(base=$0, dir=Dir.tmpdir)
		@@tempname_number += 1
		name = "#{dir}/#{File.basename(base)}.#{$$}.#{@@tempname_number}"
		path = new(name)
		at_exit do
			path.rmtree if path.exist?
		end
		path
	end
end

# ファイル
Pathname.tempname.open("w") do |f|
	f << "aaaaa"
end

# ディレクトリ
path =  Pathname.tempname
path.mkpath
10.times do |i|
	(path+"test#{i}.rb").open("w") {|f| f << "test" }
end

こんな感じのやつがほしい。特別ファイルをつくったりせず (Pathname なら作るの簡単だし)、ファイルでもディレクトリでもつかえる。

at_exit とファイナライザだと at_exit のほうが簡単な気がするけど、なんか問題あるのかな。デーモンだとたくさんできすぎるからかな。

そういえば、Pathname#mkpath が nil を返すけど、self を返してほしいと思うなぁ。

dir = Pathname.tempname.mkpath

みたいに書けると幸せ

GM

alert(document.getElementById("flvplayer"));
//=> [object XPCNativeWrapper [object HTMLEmbedElement]]
alert(unsafeWindow.document.getElementById("flvplayer"));
//=> [object HTMLEmbedElement]
alert(unsafeWindow.document.getElementById("flvplayer") === document.getElementById("flvplayer"));
//=> false
alert(unsafeWindow.document.getElementById("flvplayer") === document.getElementById("flvplayer").wrappedJSObject);
//=> true

ちょっと前に GetVariable でごにょごにょしてたときハマった……(XPCNativeWrapper 経由だと呼べない)

Ruby 書くとき

クラスを独自に拡張したのをどこに書くかで悩む……

そういうのに依存してしまうとコード単体で日記にはりつけたりがやりにくくなるしなぁ……ファイルの最初に書くぐらいしかないよなぁ

スター

消せないほうがいいなぁ、消せても今回の変更程度がぎりぎりだなぁと思う。まとめて消せるようになったら絶対嫌だなぁ。あくまでミスって一個つけちゃった、に対応できる、がいいと思う……

連打しといてあとでやっぱ消したいってのはなんかなぁ。