history

青木日記 RSS

<前月 | 最新 | 次月>

2003-01-02

2003年

あけましておめでとうございます。 ことしもよろしくおねがいいたします。

本当に新年なんですか

どうも年が変わった実感がありません。 ていうか 2003 年になってからまだ一言も言葉を発しておりません。 せっかくなので何日話さずにいられるか挑戦してみたいと思います。

今年の抱負

次の原稿をしっかり出す。

地道にジョグする。

地道にライブラリを改善する。

zsh を読む。でもって sh を作る。

シリアル ATA と PCI Express でスカスカの I/O を実現 (それは抱負じゃない)。

新年な気持ちで日記巡回でも

greentea さんの書籍スタックを見て 「ああ、買おうと思ってた本がいっぱいある」としみじみする。

笹田さんの「素数ですよ、素数」にかなりウケる。 ちなみに見た瞬間は「素敵ですよ、素敵」と見えてしまい驚き戸惑って 1 ターン休み。

新年な気持ちでウェブを見てみる

新年っぽい絵とかが溢れてますね。

新年な気持ちでコマンドを打ってみる

ターミナルに映るプロンプトがこころもち清々しく思えます。 もちろん嘘です。

新年な気持ちでプログラムに手を入れてみる

微妙に vi の反応が生き生きとしているように感じられます。 もちろん気のせいです。

新年な気持ちで原稿を書く

年が明けたって書くこた同じです。 つか、そのていどのことで変わってたまるか。

(23:36)

ほん

やぱし、本は読みたくなったその瞬間に手元にないと困る。

(02:02)


2003-01-05

やばい

二週間ばかり連絡を断ちます。

(16:03)


2003-01-07

多段イテレータからの break

あああ、ぜんぜん連絡断ってないよ俺…… でも気になってしまったので気になりながら書くより書いちゃいます。(意味不明)

「バカが征く」での多段イテレータから抜ける話題ですけど、 それは最下層で block.call を使ってるのがまずいんです。 yield 使うか each(&block) でブロック委譲すれば break で 一気に全部抜けられます。

Proc#call から break すると、その Proc#call だけを抜けます。 yield/&block の場合は、ブロックを生成したところの終わりまで抜けます。

この違いには前に net/http でひっかかったことがあるんですよ。 そのときは HTTP#get のブロックから break できなくなってました。

結論だけ言うと、

  • イテレータを制御構造として使う場合は全層を yield で繁がないとまずい

ということです。Proc のまま使ってよいのは

  • すぐにブロックごと委譲してしまうとき (&block を使って渡すとき)
  • signal {....} のようにイベントハンドラを登録するためのメソッド (つまり Proc にするのが前提になっているメソッド)

だけとしておいたほうがよいでしょう。 また、全面委譲では済まない場合は

def iter( &block )
  yield
  @obj.each(&block)
  @obj.each(&block)
  yield
end

のように yield と m(&block) を組み合わせます。 これ (&block を使いつつ yield できること) は意外と気付かないかもしんない。

(20:14)

ensure

ということは、yield や &block を使うときは break で どこのレベルまで抜けるか予想できないということですね。 必要な後処理があればその都度 ensure で囲まなければならないと。

def iter( &block )
  begin
    _iter(&block)
  ensure
    # あとしまつ
  end
end
 
def _iter( &block )
  begin
    _iter0(&block)
  ensure
    # あとしまつ
  end
end
 
def _iter0
  begin
    yield
  ensure
    あとしまつ
  end
end
 
iter {
    break   # ここから、
}
# ちゃんと後始末されてここに抜ける。

Ruby版 rb_protect()

yield と ensure で思い出したけど ありとあらゆるジャンプを Ruby レベルから停止させる裏技。

def rb_protect
  begin
    yield
  ensure
    return
  end
end
 
def main
  # 何やっても無駄
 
  rb_protect { return }
  puts 'return stopped'
 
  rb_protect { exit(1) }
  puts 'exit stopped'
 
  rb_protect { raise "STOP ME!" }
  puts 'raise stopped'
 
  rb_protect { throw(:jump) }
  puts 'throw stopped'
end
 
main

停止させたジャンプの種類を把握できると dRuby とかで使えそうだけども、 さすがにそこまではできんかった。

(20:51)

本日のツッコミ (全3件) [ツッコミを入れる]

arton [もし気付かれてなかったらなんなんで、一応。
http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=RHG%C6%C9%BD%F1%B2%F1]

あおき [気付いてませんでした ^^;;;
ありがとうございます。]

なかだ [setup 3.1.3ですが、若干要望が。
* できればshebangを書き換えるのはinstall時にしてほしい
* CVSディレクトリはたどってほしくない
* gsub(/declear/, 'declare')

diff -u2p setup-3.1.3/src/toplevel.rb.orig setup-3.1.3/src/toplevel.rb
--- setup-3.1.3/src/toplevel.rb.orig Fri Dec 6 03:26:35 2002
+++ setup-3.1.3/src/toplevel.rb Wed Jan 22 17:05:14 2003
@@ -13,5 +13,5 @@ class ToplevelInstaller < Installer
def initialize( root )
super nil, {'verbose' => true}, root, '.'
- Installer.declear_toplevel_installer self
+ Installer.declare_toplevel_installer self
end

diff -u2p setup-3.1.3/src/fileop.rb.orig setup-3.1.3/src/fileop.rb
--- setup-3.1.3/src/fileop.rb.orig Fri Dec 6 03:26:35 2002
+++ setup-3.1.3/src/fileop.rb Wed Jan 22 16:53:45 2003
@@ -82,4 +82,32 @@ module FileOperations
end

+ SHEBANG_RE = /\A\#!\s*\S*ruby\S*/
+
+ def install_script( from, dest, mode, prefix = nil )
+ if verbose?
+ $stderr.puts <<MESSAGE
+install #{from} #{dest}"
+set #! line to "\#!#{config('ruby-path')}" for #{dest} ...
+MESSAGE
+ end
+ return if no_harm?
+
+ realdest = prefix + dest if prefix
+ if dir? realdest
+ realdest += '/' + File.basename(from)
+ end
+ str = File.read_all(from)
+ str.sub!(SHEBANG_RE, '#!' + config('ruby-path'))
+ if diff? str, realdest
+ verbose_off {
+ rm_f realdest if File.exist? realdest
+ }
+ File.write realdest, str
+ File.chmod mode, realdest
+
+ File.open(objdir + '/InstalledFiles', 'a') {|f| f.puts realdest }
+ end
+ end
+
def diff?( orig, targ )
return true unless File.exist? targ
@@ -108,7 +136,14 @@ module FileOperations

def all_dirs( dname )
- Dir.open(dname) {|d|
+ dirs = Dir.open(dname) {|d|
return d.find_all {|n| dir? "#{dname}/#{n}" } - %w(. ..)
}
+ if dirs.include?("CVS")
+ d = "#{dname}/CVS"
+ unless %w(Entries Root Repository).find {|n| !File.file?("#{d}/#{n}")}
+ dirs -= "CVS"
+ end
+ end
+ dirs
end

diff -u2p setup-3.1.3/src/base.rb.orig setup-3.1.3/src/base.rb
--- setup-3.1.3/src/base.rb.orig Fri D...]


2003-01-23

もうちょい

setup.rb のパッチ、ありがとうございました。 あと一週間もしたら正常になるのでそうしたら全部まとめて処理します。

というだけじゃなんだし

こんなのは嫌だシリ〜ズ。

椎名林檎風 strcpy。

char *複写ストリングス(char *dest, const char *src);

(15:23)

本日のツッコミ (全3件) [ツッコミを入れる]

むとぽん [複写ストリングス最高!久しぶりにハラ抱えて笑ってしまいました。]

お茶 [「無題ドキュメント」というのをおもいだしました。]

なかだ [すいません、all_dirsはこうしないと変更する意味が全くありませんでした。

def all_dirs( dname )
dirs = Dir.open(dname) {|d|
d.find_all {|n| dir? "#{dname}/#{n}" } - %w(. ..)
}
if dirs.include?("CVS")
d = "#{dname}/CVS"
unless %w(Entries Root Repository).find {|n| !File.file?("#{d}/#{n}")}
dirs.delete("CVS")
end
end
dirs
end

ついでに、最後にこんなのも定義しておいてもらえると嬉しいなぁとか。

def xecute
PackageManager.new(ARGV.shift).execute
end]


2003-01-29

復活

復活しました。バックログをかたづけるとしよう。 えーと……。何が残ってるんだったかな。

MinGW

みんぐわ。

(05:24)

宴会

うわあ、なんかいいなあ。やっぱ行きたかったなあー。 もう 2、3 日の差だったんだけど。今度はきっと行こう。

(06:36)

初めて使ったruby

初めて使ったのは 1.1 b9 だった。いや b8 だったかな。 いまにして思うと一発目から make したんだよな。 まだ Linux のブラウザの使いかたがわからなかったので、 Windows の IE で落としてフロッピーで移動したんだった。 よくやるなあ。

(08:10)


<前月 | 最新 | 次月>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS