history

青木日記 RSS

<前月 | 最新 | 次月>

2004-05-02

Rubyレシピブック

昨日も明日も楽しい打ち合わせです。 午前も午後も打ち合わせです。 昨日も (なぜか) たくさんのネタが開拓されました。

(その1) 「越えられない壁」演算子

2ch でお馴染みの

C,C++ > Java > C# >> Perl > Python >>>>>>>>>>>>>>>(越えられない壁)>>>>>>>>>> Ruby

みたいなやつのこと。 確か、Array#<< の逆の操作を行う「>>」があったらどうなるか、 という話題の途中で登場したんだと思った。 優先順位はこのあたり?

+@ -@
* / %
+ -
<< >>
&
| ^
> >= < <=
                       ← このへん
<=> == === != =~ !~
&&
||

(その2) 「隙間」理論

0-origin のインデックスは要素の隙間についている番号だという、 それ自体はそれなりに一般的な考えかたのこと。 Ruby の「点三つ範囲」は隙間理論で考えたほうがすっきりする。

                ary[2...7]
          |<----------------->|
  0   1   2   3   4   5   6   7   8   9
  +---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+

しかし ary[3...5] について 「3番目の隙間から5番目の隙間の間にある要素」 とコメントを書いておいたことから著者間で議論が紛糾し、 「じゃあインデックス 0 は何なんだ」と問われて 「そこには特殊な『論理隙間』があるんだよ!」 と強弁したことから「隙間理論」が成立した。

疲れてたせいか、なんか妙にうけた。

(その3) machine epsilon

特定のアーキテクチャで浮動小数点演算をしたとき、 (1 + e) - 1 が 0 にならない e の最小値が machine epsilon。 それが機械イプシロンと訳されていると椎名林檎っぽい *1 ね、というだけのネタ。

※1 漢字二文字 + カタカナならなんでも椎名林檎ぽいという、 激しくナイーブな論理展開。

(20:14)

AlphaServer ES40

http://page6.auctions.yahoo.co.jp/jp/auction/f19524674

21264 の 4 発機がありえない値段で出ている。

(20:18)

Solaris door

ファイルが Solaris door かどうか Ruby で判定するコード

class File::Stat
  S_IFDOOR = 0xD000
 
  def door?
    mode() & 0xF000 == S_IFDOOR
  end
end
 
def File.door?(path)
  stat(path).door?
end
 
p File.door?('/etc/sysevent/sysevent_door')   #=> true

(22:57)

キャベツ

知っていたか!

半分に切ったキャベツでさえ、長く放っておくと成長することを……

(01:49)


2004-05-04

ドラクエ

http://d.hatena.ne.jp/chepooka/

どこからどう見てもドラクエなはてなダイアリー。すごい!

業務連絡

これから一週間くらいの間に loveruby.net の DNS サーバを変更します。 両方稼働したまま移行しますが、何か影響が出るかもしれません。

(21:44)


2004-05-05

一貫性

知らないうちに BitChannel を徹夜でいじってしまって WikiFarm が実装された感じってのはまあ置いといて、 設定項目名が非常に一貫性に欠けるなあと思った。

  • site_name
  • logo_url
  • templatedir
  • locale
  • cgi_url
  • cgi_url
  • css_url
  • use_html_url
  • cmd_path
  • wc_read
  • wc_write
  • cachedir
  • logfile
  • repository
  • datadir
  • farm_url
  • node_url
  • themedir
  • theme_url

どうも「……dir」には下線を付けず、 「……url」には下線を付ける習性があるようだ。

それ以外のところはだいたい下線を入れるで一定しているように見えるが command だけ cmd と省略してたりするのが微妙に気持ち悪い。 つうか、なんで cvs じゃなくて cmd_path なんだろうなあ。 ああそうか、ちょっとだけ CVS 独立にしてみようかと 余計な色気を出したのが原因だな。

あ、wc (working copy) も省略されてるか。

logfile は下線がない。やっぱ微妙だ……

(06:39)


2004-05-06

DNS (1)

よりによって MX レコードの設定を間違えてました。 ML 管理者のみなさんごめんなさい……。

(05:32)

DNS (2)

というか、まだ間違ってたりするのか? 単に DNS キャッシュが残ってるだけならいいんだけど。 不安だ。

(06:53)

DNS (3)

おかしい……まだなんかおかしいぞ……。 くそ、今日は 16:10 まであるんだっけ。まずい。 そもそもこんなときに DNS の移行なんぞするのが間違いだった。 何もこんな原稿がおおづめのときに移行しなくても。

DNS (4)

aamine AT mx.edit.ne.jp はプロバイダ止めなので、 なにかあるかたはそちらにお願いします。

DNS (5)

時間が限界なので出かけます。 帰ったら直ってるといいんだけど。

(07:49)

DNS (6)

ルータの 53 番が閉じてたのが原因?! まだ安心できないな。

DNS (7)

53 番を開けたはずなのに開いてない。 いったいどうなってるんだ。

(21:02)

DNS (8)

開けたはずのポートはやっぱりちゃんと開いてたようだ。 メールが復活して、スパムがドカドカ届きはじめた。 スパムがこんなに嬉しく感じる日は初めてです。

ともあれ、御迷惑をおかけしました。

(21:27)

ゆるゆる言語

Haskellっぽい型無し言語ってないですかねえ。

なんつーかね、遅延評価だけ欲しいんですよ。 遅延評価したいところだけをテキト〜〜〜〜〜に書きたいんです。

そんで IO 関係は、K&R C のごとく、 ヤバげなところに警告だけ出してとにかく通しちゃう。 そんなゆるゆるな仕様の言語が使ってみたい。

(00:58)

(追記1) 静的型付けでなくなった瞬間、 Haskellっぽいとは言えなくなるような気がしないでもない。

(追記2) む、Cleanって動的型付けもできるのか?

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

kawaji [Scheme に遅延評価できる仕組みって無かったでしたっけ?
マクロだったかな?]

shugo [delay/forceですかね。]

mput [delayは手動で指定してもまぁいいけど、forceは勝手にかかってほしいなと思うのはmputだけ?Promiseが値として評価されそうになったら自動でforceしてくれるとずいぶん楽になる気がしますが…]

KM [論文誌にこんなのがhttp://www.ipsj.or.jp/members/Trans/Jpn/03/2001/4211/article014.html]

kjana [Q とか。"streams" (a "lazy" variant of lists) っていうのが about にあったってだけですが。
http://q-lang.sourceforge.net/]


2004-05-07

DNS その後

突然思い出した。 やっぱりルータの 53 番は開けても通らなかったんだ。 で、その後ダメもとで (ルータの) ファイアウォールを切ったら通るようになった。 つまりファイアウォールにも問題があるように思える。

(22:11)

バグリスト

いい感じにバグやら要望やらがたまってまいりました。

えーと……、また明日!

(22:12)

ゆるゆる

うわあ。やっぱり言語の話題だと反応が多いですね。 数々のツッコミありがとうございます。

そもそもドメインが loveruby.net なくせに この日記は Ruby ネタが少なすぎる。 BitChannel を Ruby ネタということにすれば多少は増えるけど、詐欺くさいな。

それはともあれ「ゆるゆる言語」、 ぼくの書きかたが中途半端だったせいで誤解を生んだようなのですが、 言語の中の一部分だけ遅延評価ではなく、プログラム全体が遅延評価ってことです。 もちろん Scheme の delay/force みたいな手間もかけずにやってほしい。

んで、肝は「やばそうなところは警告だけ出して適当に実行」って部分でした。 真面目に研究する人達はこんなヘタレなことは考えなさそうなので ^^;;;

とりあえず、Q を眺めてみようと思います。

※ 参考までに、昔の一文字言語の話題 http://i.loveruby.net/d/20020522.html#p03

(23:43)

webrick/cgi な CGI のデバッグ

cgi.rb には、普通に実行するとコマンドラインから パラメータを与えられる機能がありますよね。 あれの webrick/cgi 版をでっちあげました。

# cgienv.rb
 
ENV['GATEWAY_INTERFACE'] ||= 'CGI/1.1'
 
ENV['SERVER_PROTOCOL'] ||= 'HTTP/1.0'
ENV['SERVER_SOFTWARE'] ||= 'DummyHttpServer/1.0'
ENV['SERVER_NAME'] ||= 'localhost'
ENV['SERVER_ADDR'] ||= '127.0.0.1'
ENV['SERVER_PORT'] ||= '80'
 
ENV['REMOTE_ADDR'] ||= '127.0.0.0'
ENV['REMOTE_PORT'] ||= '33992'
 
ENV['HTTP_ACCEPT'] ||= '*/*'
ENV['HTTP_ACCEPT_LANGUAGE'] ||= 'ja,en'
ENV['HTTP_HOST'] ||= 'localhost'
ENV['HTTP_USER_AGENT'] ||= 'DummyAgent/1.0'
 
script = ARGV.shift or raise ArgumentError, 'no file'
ENV['SCRIPT_URI'] ||= 'http://localhost/' + File.basename(script)
ENV['SCRIPT_URL'] ||= ENV['SCRIPT_URI']
ENV['SCRIPT_NAME'] ||= '/' + File.basename(script)
ENV['SCRIPT_FILENAME'] = File.expand_path(script)
 
ENV['REQUEST_METHOD'] ||= 'GET'
ENV['QUERY_STRING'] ||= ARGV.join(';')
 
load File.expand_path(script)

こんなふうに実行できます。

~/public_html/bc % PATH_INFO=/test ruby cgienv.rb farm.cgi name=FrontPage cmd=annotate
Status: 200
Cache-Control: no-cache
Connection: close
Date: Fri, 07 May 2004 18:05:43 GMT
Content-Type: text/html; charset=euc-jp
Server: DummyHttpServer/1.0
Content-Length: 2332
Pragma: no-cache
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
以下略

(03:07)

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

gotoyuzo [なるほど。本体に組み込むか、サンプルに突っ込んでもよさそう。
ちなみに、ApacheがターゲットならSCRIPT_URIよりもREQUEST_URIのほうがいいですね。]


2004-05-08

RAA-SOAP インターフェイス

RAA の SOAP インターフェイスが [ruby-talk:99611] で紹介されている。

% ruby -r pp -r soap/wsdlDriver -e '
raa = SOAP::WSDLDriverFactory.new(
        "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
      ).create_driver
pp raa.gem("tmail")
'
#<SOAP::Mapping::Object:0x4038a468
 @category=#<SOAP::Mapping::Object:0x4035a2b4 @major="Library", @minor="Mail">,
 @created=#<DateTime: 13243981342437209/5400000000,3/8,2299161>,
 @id=600,
 @owner=
  #<SOAP::Mapping::Object:0x40352758
   @email=#<URI::MailTo:0x201c598c URL:mailto:aamine@loveruby.net>,
   @id=45,
   @name="Minero Aoki">,
 @pass=nil,
 @project=
  #<SOAP::Mapping::Object:0x4038a274
   @dependency=[],
   @description=
    "TMail is an email handling library.\r\nAlmost all RFC2822/MIME specification is supported.\r\n",
   @download=
    #<URI::HTTP:0x201c99ba URL:http://i.loveruby.net/archive/tmail/tmail-0.10.8.tar.gz>,
   @history=[],
   @license="LGPL",
   @name="tmail",
   @short_description="TMail",
   @status="stable",
   @updated=nil,
   @url=#<URI::HTTP:0x201cb954 URL:http://i.loveruby.net/en/tmail.html>,
   @version="0.10.8">,
 @updated=#<DateTime: 10597199881960969/4320000000,3/8,2299161>>

おおっ。これは凄い。なんか無性に凄い。

以下は、同じく ruby-talk で紹介された、 プロジェクトのバージョンアップを自動化するスクリプト。

name = 'sampleproject'
pass = 'sampleproject'
gem = raa.gem(name)
gem.project.version.succ!
gem.updated = Time.now
raa.update(name, pass, gem)

いいねえ。便利だねえ。 何かのバージョンを上げてみたいな…… (本末転倒)

どういうメソッドがあるんだろう。

~ % ruby -r pp -r soap/wsdlDriver -e '
raa = SOAP::WSDLDriverFactory.new(
        "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
      ).create_driver
puts raa.methods(false)
' | sort
dependents
gem
list_by_category
list_by_owner
list_created_since
list_owner
list_recent_created
list_recent_updated
list_updated_since
names
owner
search
search_description
search_name
search_owner
search_short_description
search_status
search_version
size
tree_by_category
update
update_pass

へー。

(01:47)

endの重さ

class に対応する end は def に対応する end より重い。

def に対応する end は if に対応する end より重い。

だからおれとしては end か {} かというよりも、 この二種類の end を区別できるほうが嬉しい。

かと言って end class とか end def と書きたいかというと、 それはそれでまた気持ち悪い。 dne とか ssalc よりはマシだけど。

それで結局、現実的には

class C
 
  def m
    if ....
      ....
    end
  end
 
end

こんなふうに class の内側に空行を入れることで 対応しているのであった。

(02:41)

BitChannelの隠しポリシー

唐突に BitChannel のポリシーを一つ思い出した。

  • 全ページの先頭の目立つところに更新時刻を表示すること

(02:43)

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

なひ [endが関係ない、classとdefの間にも空行が入ることから(なひも入ります)、「endが重い」というより「defの密度は高くあるべし」かも。凝集度も高くなったと勘違いできるし(おい

ところで99661じゃなくて99611です。]

青木 [ML番号は直しておきました。

「defの密度が高い」というのはあるかもしれません。
昔はメソッドの途中でよく空行を入れてたんですが、
最近は滅多なことじゃ入れなくなりました。
(前はメソッドの長さ自体も長かった)]


2004-05-09

BitChannel / WikiFarm

WikiFarmっぽいものが実装できた。 まだ自分で公開サーバに設置しないあたりに完成度の低さが見てとれます。

そろそろ ver 0.3 を出そう。

(01:35)


2004-05-10

そうか……

配布自体を隠蔽するシステムにしないといけないってことだな。 ウィルスを使って自動拡散にする?

(19:23)

BitChannel / subversion?

BitChannelComment で 「WindowsでCVSは辛いからsubversionに対応してほしい」 という要望が出てるんだけども、 よく考えたら fork 連発してる時点でだめだよな。

いや、同期実行しかしてないので spawn を使えばいいんかなあ。 VC++ な Ruby でパイプってつなげるんだっけ。

確か使えるってレシピブックに書いた記憶がある。 ということは使えるんだろうな。じゃあ問題ないか。

BitChannel / subversion? (2)

そういえば subversion には C API があるんだっけ。 Ruby インターフェイスはないのかな。ないらしい。

……

……いや、書かないって!

BitChannel / subversion? (3)

いっそのこと Ruby で CVS クライアントを書いてしま

本末転倒なことはやめよう。

(00:25)

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

ささだ [BitChannel を Subversion で使うメリットってどういうのがあるんでしょうか。あんまり思いつきません。CVSが入ってないってことはないだろうし。]

kjana [subversion の ruby binding はメンテナがおっつかなくなったんで obsoleted,
だったと思う.http://www.sodan.org/%7Epenny/diary/020816.html#0824 という
頃には少なくともコンパイルは通っていたようだし.]

青木 [む、なるほど、インターフェイスはいちおうあったんですね。
ありがとうございます。使うかどうかわからないけど、
眺めてみます。]

青木 [いや、入れるのが大変ということじゃないかな > WindowsでCVS
と、少なくともぼくはそう解釈してたんですけど。]

提案者 [WindowsにCVS入れるのが大変ということです、はい。それに比べてSubversionは鼻をほじりながらでも入れられるほど簡単なのです。]

ano [CygwinのCVSではまずいの?
CygwinSubversion(ソースからmake)もやったことあるけど何故かCVSよりよく動いてた。
あと単にマシンが調達できないという理由ならlinux on coLinuxでCVSでもいいと思うけど。
そもそもどうしても絶対Windows上で動かさなければならないのですか?]

ささだ [「Windows で CVS を入れるのがつらい」という部分をスコーンと読み飛ばしてました。そうか、大変だったのか。WinCVS だったら鼻歌交じりで出来た記憶があるんですが、Win上にリポジトリを作って管理したことがないんであまりあてにならないかも。(しかし、何が辛いのだろう)

Subversion はどうにも信頼性が。ディレクトリまできちんと管理するなどの点でsvnはとてもすばらしいと思うんだけど、BitChannel はそういうの必要ないし、CVSでええやん、と考えてました。]

提案者 [なんか反対意見が多いので提案は撤回します。青木さんのリソースを無駄に消費させてしまうのも申し訳ないので。すみません。]

ano [でもSubversion好きですけどね。
Apache動かしてその上でCGI動いてCVS動かしてとなると、WindowsでやるほうがLinuxとかBSDでやるより「わざわざ」感が大きいので、WindowsでやりたいからSubversion、というのはよくわからん論理であったのでした。WindowsにもCVSあるし。
Subversion対応が実現するならWindowsでなくてもバックエンドをCVSじゃなくSubversionで動かしたい人もいるんじゃないかなあ、と書いておこう:)]

ano [ちょっと待った。
http://i.loveruby.net/w/BitChannelImplementation.html
大文字小文字を区別しないファイルシステムでは動作が変になる。
がーん、そもそもWindowsだめじゃん。]

青木 [実はメソッドを二つ変更すれば通るのですよ。
module FilenameEncoding あたりを見るとよいと思う。]

ささだ [あー、反対するつもりは無くて、単純に何がうれしいのかわからなかっただけです。青木さんならさくさくと作ってくれるに違いない。]

青木 [ふっふっふ、そいつはどうかな……]

ささだ [ああそうか、Rubyでバージョン管理システム作り直すんでしたっけ。]

とおりすがり [ ちょっと話がそれますが、Subversionって不安定なんですか?
会社のバージョン管理システムCVSからSubversionにしようかなって思ってたとこなんで気になります。
自宅で使ってるかぎりでは大丈夫そうですが。
まあ実際使うときには、バックアップとるんでしょうけど。]


2004-05-11

47氏逮捕

一日考えたがやはり納得がいかないな。 警察はできるだけ一般的で普遍的な問題にしたてあげようとしてるけど、 ぶっちゃけて言ってさ、今回問題になってるのって 一般的な著作権侵害問題ですらないだろ。 だってこれって、金と権力のある側が既得権益を確保するために パワーを行使してるだけじゃん。 そんなつまらないことのために可能性が潰されるっていうのが一番腹が立つ。 ついでに言えば、そんなつまらない事情がまかりとおってしまうこの社会にもまた腹が立つ。 やっぱり「インターネッ党」でも作って利益づくで対抗するしかないのかしら。

(01:00)


2004-05-12

BitChannel / subversion

いやいや、遠慮するこたないと思いますよ。 何を言われてもぼくが不要と思えば実装しませんし、 自分で必要だと思ったから To Do に入れたわけです。 要望はストレートに言ってくれたほうが助かります。

イントラネットで動かす場合を考えると Windows 2000 あたりは重要なターゲットですし、 インストールが簡単になるにこしたことはないと思います。 最終的な目的は「共同作業をすること」であって 「BitChannel を使う」ではないのですから、 プラットフォームの違いとかバックエンドの違いなんてのは本質的とは言えません。 本質的でない部分はできる限り気にしないで済むのが適切です。

その前提を踏まえたうえで特に Subversion 対応を考える理由としては、 まずマーケティング的な効果が挙げられます。 どう考えたって「CVS 対応!」よりは 「Subversion 対応!」のほうがインパクトがあるに決まってる。 なにしろ流行りものだし。

第二に、サーバ構築の手間が挙げられます。 現在は基本的にローカルレポジトリを念頭に置いて開発してますが、 別にリモートでまずいってことは全然ありません。 特にこれからは CVS で直接手を出せるようにしたいと思っているので、 そうなればリモートレポジトリも重要になるでしょう。 が、しかし、CVS サーバの構築って死ぬほど面倒なんですね。 その点 Subversion はサーバを作るのが簡単なので、 対応しておくにこしたことはないと思います。

ただしここで一言言っておきたいのですが、 ぼくは Subversion を信用していません。 だから Subversion に対応しても自分では使いませんし、お勧めもしません。

(18:35)

Rubyレシピブック

『Rubyレシピブック』 2800 円で 5 月 28 日配本だそうです。 配本つーことは、本屋にはもうちょい後にならぶ? あ、31 日出版となってるな。

とにかくそのあたりです!

(19:27)

Subversionが嫌い

Subversion を信用できない理由はただ一つで、 Berkeley DB を使ってるからです。 別に RCS じゃなくてもいいんだけど、 テキストベースのデータベースでありさえすれば何も文句はありません。 なぜテキストがいいかと言えば、 いざとなったら ls と cat と vi で管理できるからです。 バイナリデータベースは vi で直接いじれません。

もちろん反論があるのは知ってますが、 これまで見た限りでは説得力を感じませんでした。例えば "Dispelling Subversion FUD" では「普通データためるなら RDB (= バイナリデータベース) 使うだろ、 なぜ Subversion には文句を言うのか」と言ってますが、 ことバージョン管理システムに関しては文句を言われるべきだと思います。

なぜならば、バージョン管理システムの本質とは即ち安心担保システムだからです。 昔のコードは全部残ってるからどんどん変更してください、 プログラムもデータベースフォーマット (RCS) も枯れてて安定してます、 それでも万一の場合はエディタで直接編集できます、 という保証があるからこそ安心してソースコードをいじれるんです。 いつ古いコードに戻れなくなるかわからないという不安があったら XP なんかできません。

ここで重要なのは心理的な効果であって、 本当に vi 編集が必要になるか、それで復旧できるかどうかは問題ではありません。 「もしそうなっても安心だ」と思える (信じられる) ことが肝心なのです。 その点、ぼくは vi で編集できればどうにかなると信じられます。 しかし vi が使えないんでは直す自信はありません。 従って Subversion は信じられません。 さらに言えば、そういう心理的な安心感を考慮してくれない Subversion 開発チームも信用できません。

(22:43)

Subversionが嫌い (2) 安定度?

まあ CVS に比べりゃ不安定だと思いますが、 (一般的なアプリケーションに比べて) 特に不安定ってことはないんじゃないですか。 いや、使ってないから知りませんけど。

しかしぼくが文句を言いたいのはあくまで データベースの設計それ自体であって、 プログラムの安定度じゃないということは追記しておきたいと思います。 また、新しい機能がほしいわけでもありません。 さらに言うならば、CVS サーバは文句なしに最低です。

(22:51)

Subversionが嫌い (3) 新機能?

あとさー、Subversion の新機能って 実はたいして嬉しくなくない?

  • シンボリックリンクが管理できる

Windows でもチェックアウトできんの?

  • バイナリファイルの扱いがよくなった

別に PNG が画像的に diff できるってわけじゃないんでしょ?

  • ディレクトリが管理できる

ふーん。

  • ファイルの移動も管理できる

これは重要な進歩だな。

  • アトミックなコミット

必要な人は必要なんだろうけどねえ。

  • C インターフェイス

あるにこしたことはないよね。

  • サーバ構築が簡単になった

この点は文句なしに素晴しい。つーか CVS がダメすぎ。

ということで総合すると、おれにとって文句なしに長所で、 どうしても欲しいと思える特徴は「サーバ構築が容易」ってところだけだ。 あとはどうでもいいか、CVS でも妥協できるレベルだな。

(23:03)

RHG読書会

今週土曜日は RHG 読書会です。 案内は

あたりを参照してください。

ちなみに今回は p.267 (10 章「パーサ」の途中) からで、 たぶん「状態付きスキャナ」に入るでしょう。 きついんだここが。

(03:44)

100,000

ruby-talk がいまにも 10 万通を越えそうだ。

(03:45)

100,000

越えた! [ruby-talk:100000]

(03:52)

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

sugi [Subversion を信頼してないというのは、やはりまだ枯れてないということでしょうか。
それとも、他に理由があったりするのでしょうか?]

とおりすがり [新機能がそんなに魅力的でないというのはあくまで「よりよい CVS」ですから仕方がないですね。
心理的安心感に関しては、コミットごとに dump すればそれなりに得られます。dump してしまえば、フォーマットは単純ですし、手で編集も出来ます。]

なかだ [コミットごとにdumpしてCVSに…]

ano [MSWin版ではfork未対応で停止しますね(当然か
http://ruby-talk.com/blade/60221
入れてごにょごにょしたら動きました。]

青木 [なるほど、win32-popen なんてのがあるんですね。
ありがとうございます。こちらでも動作を検証してみます。]

青木 [両方の嫌なところだけ合成されるに 20 ルピー > dumpしてCVS管理]

テシ [個人的にはテキストベースの方がエンコード云々で全く信用ならないんですが・・・]

rero [>テキストベースのデータベースでありさえすれば何も文句はありません。
こう言ってるのだから,データベースは1世代で構わないわけでしょう.ということは,「コミットごとに dump」とは別問題ですね.じゃあ,berkdb でも dump して vi で編集して undump すればいいのでは?たまにしか起こらないデータ破壊の対策として毎回効率の悪いテキストベースのデータベースを使うなんて.]

青木 [逆に言えば、速度しか利点がないじゃないですか。
俺は速度よりも安心感が欲しいんです。]

rero [dump して vi で編集して undump では駄目なんですか?

「安全性」ではなく「安心感」ってところがミソなんですかね.安全性を追求するならもっと他のやり方がありそうな気がするので.]

rero [>バージョン管理システムの本質とは即ち安心担保システムだからです。

これも個人的には納得できません.安心感を得ることが本質なら,もはや差分管理はやらないと思います.ハードディスクも巨大化していますし.差分管理しなければ diff も DB も不要になります.
実際は diff や branch など,情報整理の利便性が追求されていると思います.]

青木 [> dump して vi で編集して undump では駄目なんですか?

データベースが壊れていたら dump が動くとは限りません。

> >バージョン管理システムの本質とは即ち安心担保システムだからです。
>
> これも個人的には納得できません.安心感を得ることが本質なら,
> もはや差分管理はやらないと思います.ハードディスクも巨大化
> していますし.差分管理しなければ diff も DB も不要になります.
> 実際は diff や branch など,情報整理の利便性が追求されていると思います.

べつに差分じゃなくてもいいんじゃないですか。
「それなりに手軽に使えて、すぐ元に戻せるシステム」
のうちで今のとこベストなのが CVS だから使ってるだけで、
その実装がすべて理想にかなっているなんて言ってません。]

rero [> 「それなりに手軽に使えて、すぐ元に戻せるシステム」
> のうちで今のとこベストなのが CVS だから使ってるだけで、
> その実装がすべて理想にかなっているなんて言ってません。

なるほど.]


2004-05-14

Winny は「名前のないインターネット」

Winny = internet - URI

という公式を思いついた。

(17:37)

(追記) 最初は nameless internet と書いたけど、 これだとちょっと意味合いが違うな。 identifier-less のほうがいいか。

Winny は「名前のないインターネット」 (2) MMR

とんでもないことがわかったぞ……

Microsoft は Winny の成功を見て WinFS を開発したんだよ!

な (ry

(17:43)

Subversionが嫌い (4)

http://www.hyuki.com/tf/20040513081624.html

結城さんに同意してもらえるとかなり心強いですねえ。 いや実を言えば

「いまだにテキスト信奉かよ、おめでてえな (w」

とか

「オールドタイプはすっこんでろ」

とか煽られまくるのではないかと怯えてたんですが、意外にないっすね。 単に見てる人が少ないせいか、はたまた反論するまでもないと思われたか……。

(21:41)

Subversionが嫌い (5)

つーか、紙。デジタルなんて信用できない。

(22:45)

Subversionが嫌い (6)

CVS をリプレースすると言うからには、 FreeBSD と NetBSD を乗り換えさせてほしい。

(23:09)

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

shiro [昔、自作のBIOSでFDDに書き込んでいた頃は、本当に大事なデータはROMに焼いていました…]

青木 [前半と後半のどっちにツッコミを入れればいいんでしょうか……]

zunda [紙はどこかに行っちゃうんですよー。CD-ROMもどこかに行っちゃうけど。]

青木 [自分では散逸を防ぐためにノートに書いてます。
単独のプリント類は超整理法でなんとか。]


2004-05-16

RHG読書会 reloaded #9

今回はいつにも増して各種雑談に熱が入っていたため 10.3 スキャナしか読めず。記録はいつも通り RWiki に書きました。

http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=RHG%C6%C9%BD%F1%B2%F1%3A%3A%C5%EC%B5%FE+Reloaded

RHG読書会 2-9、独断と偏見によるトピックス: 設定ファイルをどうするか

一言で要約すると XML と YAML と Ruby スクリプト。 それぞれの特性に合わせて選びましょうね、 という、はしょってしまうとあまり面白くない結論?

BitChannel の設定ファイルも Ruby スクリプト (bitchannelrc) ですが、 これはあえてユーザにスタートアップの責任を押しつけ敷居を上げようとして採用しました。 もうちょっと真面目な理由としては、 Ruby のロードパスとか $KCODE を設定するのが楽そうだったという事情もあります。

ちなみに、Ruby スクリプトを使うにしてもデータを受け渡す方法には いくつか選択肢があり、それぞれ長短があります。

  • インスタンス変数で渡す (tDiary)
@datapath = '/var/tdiary'
  • グローバル変数で渡す (Hiki, AsWiki, その他いろいろ)
$DATADIR = '/var/tdiary'
  • 定数 (モジュール) で渡す (ftpup, その他いろいろ)
module AppConfig
  DataDir = '/var/tdiary'
end
  • メソッド定義で渡す (BitChannel)
def bitchannel_context
  require 'bitchannel'
  BitChannel::Repository.new({:datadir => '/var/bitchannel'})
end
  • 最後の値で返す (これは見たことがない)
{:datadir => '/var/tdiary'}

ちょうど arton さんの日記にも設定ファイルの話があるなあ。

http://arton.no-ip.info/diary/20040515.html#p04

BitChannel と CVS

今回の RHG 読書会で akr さんに教えてもらったところによると ruby-cvs はローカル CVS の代わりに使えるそうです。 なんで、これをダイレクトに使うオプションを作ろうと思ってます。

(22:39)

『Rubyレシピブック』内容紹介

5/31 発売予定の『Rubyレシピブック』の内容を簡単に紹介しておきます。

まず、この本はクックブックの類で、 かなり細かい、独立したセクションに分割されています。 話題がつながっているわけではないので、頭から読む必要はありません。 必要になったときに検索して読んでください。

※ いまのところ本文を公開する予定はありませんが、 本文を検索して見出しを出すシステムは欲しいねえ…… と勝手に話し合ってます。

  • 第1章「Rubyの文法」……Rubyの文法の要約。あくまでまとめであって、これだけでRubyが書けるわけではない。
  • 第2章「文字列」……文字列処理
  • 第3章「配列とハッシュ」……コレクション (Enumerable) の処理
  • 第4章「ファイルとディレクトリ」……ファイルシステム関連の操作。dirname とか unlink とか
  • 第5章「入出力」……IO。よーするに read write
  • 第6章「数値」…… Numeric, Math, Rational, Complex, ...
  • 第7章「時刻」…… Time, Date, DateTime
  • 第8章「環境とのかかわり」……他の章に入れられなかったもの全部
  • 第9章「プロセスとプロセス間通信」……sleep とか fork とかソケットとか、そのあたり
  • 第10章「CGI」…… CGI プログラミング特有の話題。
  • 第11章「オブジェクト」……クラス、モジュール、リフレクション

ぼくは文字列・環境・IPC・オブジェクトの 4 章を担当しました。 その中では文字列処理、特に日本語処理を重視しています。 紹介した処理について逐一マルチバイト処理が可能かどうかチェックして、 できないものにはその旨追記し、代案を示します。

また、対応する Ruby は 1.6.7〜1.8.1 (基準は1.8) です。 こちらもまた全処理について動作をチェックして、 バージョン間の非互換をすべてリストアップし、 可能ならバージョン独立な書きかたを示しました。

ついでに言えば、今回は Windows での動作についてかなり真面目に調べました。 ただし NT 系のみです。9x 系は忘れてください。

最後に、そのうち項目見出しも公開します。

(23:51)


2004-05-19

fcgi.rb

[ruby-talk:99910] Pure Ruby FastCGI performance bug?

「pure Ruby 版の fcgi ライブラリを使っている場合、 長いデータを送ると反応が妙に遅れることがある」らしい。 もしかしてこれって家の BitChannel で時々ピタッと止まるのと同じ現象かな。 なんだろうと思ってたんだよー。

……

調べるだけのつもりだったのに、 うっかり書き直してしまった……。

やっぱり止まるじゃん。だめじゃん。

とりあえず pack テンプレートの signed と unsigned を間違ってるだろう。

うううう、なんだこれは。 BasicSocket.for_fd を使うと次々にプロセスが増殖していく。 やっぱり Socket.for_fd でないとだめっぽい。

一回だけ accept してると思ってたのに、 実はセッションごとに回線がブチブチ切れていた。 ということは、むしろ積極的に close すべきなのか? あ、直った。

嘘だった。 連続でリクエストするとなぜか SEGV するようになった。 原因もわからず停止するよりはこっちのがマシか? いや、GC 関係なのでやっぱり嫌だ。

いや違う、また嘘。ruby が二週間も前のやつだった。 二週間前の HEAD なんて、食料で言えばとっくに賞味期限切れレベルである。

Ruby をアップデートしたらなおった! 10000 リクエスト連続でもへこたれない。すばらすい。

そんなわけで、リライトした fcgi.rb 置いておきます。

そういえば無意識のうちに Ruby 1.8 を仮定していたような気がするな。 HEAD までは必要ないはず。

(06:05)

fcgi.rb (2)

オリジナルの fcgi.rb ならこんな感じでなおりそうな気がする。

--- fcgi.rb.org 2004-05-19 06:25:10.000000000 +0900
+++ fcgi.rb     2004-05-19 06:25:12.000000000 +0900
@@ -239,6 +239,8 @@ rescue LoadError
           end # type of request
         end # until @ns.eof
         return nil
+      ensure
+        @ns.close
       end # accept
 
       def close

起きたときに気が向いたらテストします……。

(06:29)

fcgi.rb (3)

だめだやっぱり徹夜はだめだ、 こんなところで close してどうする。こうか。

--- fcgi.rb.org 2004-05-19 06:25:10.000000000 +0900
+++ fcgi.rb     2004-05-19 06:43:31.000000000 +0900
@@ -197,6 +197,7 @@ rescue LoadError
       def accept
         rec = Record.new
         if @ns.eof?
+          @ns.close
           @ns, = @server.accept
         end
         until @ns.eof?

本当に練る。もとい寝る。

(06:44)

fcgi.rb

昨日の fcgi.rb のパッチではだめだった。 他のところもいじらないといけないようだ。 間違っている可能性としてはこんなところかな。

  • pack/unpack のテンプレート
  • eof? を使わないようにする

だめだ、これを変えても直らない。 すっぱりあきらめよう。

気になる人はリライトしたほうも試してみてください。 BitChannel ではこっちを CVS に入れちゃいました。

(03:51)

ruby-dev summary

しまったー、すっかり ruby-dev summary のことを忘れてた。 スキップが続くのはよくないなあ……。

(04:24)


2004-05-21

Wikigraph?

wema で箱と線を書けてるんだから、 同じ手法で任意の (無向) グラフを描画できるはずだ。 とうぜん Wiki のページとハイパーリンクも描画できるだろう。

どうやってきれいなグラフにするかが問題か。

いやもしかして、自動できれいにしなくてもいいんじゃないか。 wema を改造して付箋 (ノード) 移動だけを許し、手動で並び変えたらどうだろう。 つまりビジュアルな FrontPage みたいなものになる。 グラフを (制約の多い) 言語で表現しておいて Wiki のページとして保持すれば、 自動的にバージョン管理や diff や annotate の対象にもできる。

(18:24)

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

mput [グラフ記述言語といえばdot
http://www.research.att.com/~erg/graphviz/info/lang.html]

青木 [いや、dot は知ってますが、この場合は
1. ノードが増減できてはならず、
2. 枝も定まっていて、
3. ノードの絶対位置を指定できる
ことが必要……って、これ、
グラフの記述じゃないじゃん (自己解決)]


2004-05-22

tdiarysearch

tdiarysearch バグ直しの日々。

  • Blogkit + title_navi.rb で動かない

なんかねー、day モードで初期化すると title_navi.rb が Month オブジェクトを作りにいって、 そこでなんかエラーになるらしい。 しかたがないので @mode="month" で初期化してみる。 こういう逃げかたをすると他のプラグインでエラーが起きそうで嫌だが、解決策が思いつかない。

  • not visible? なのに検索結果に表示されてしまう

これはチェックしてるはずなのにおかしい……と悩んのだが、 Diary オブジェクトを作るときに自分で @show をセットしなければいけなかったらしい。

  • ツッコミ検索

tdiarysearch のほうは簡単そうだったので対応した。 「簡単そうだったので」とか言ってるわりに意外に手間取ったのは秘密だ。

(04:22)


2004-05-25

BitChannel / 地道にデバッグ

編集の衝突を検出しそこねていたのを修正した。 原因は (CGI クエリーの) org と orig のスペル間違い。 余分なクエリーもチェックしてねこそぎ弾いたほうがいいかな。

(01:41)

つれづれなるままにやうやう白くなりゆく

淡々とバグ報告を書く日記というのもおもしろくないなあ。 やはりもうちょっと感想とか思想っぽいものを書くべきかもしれない。 ルサンチマンとか純粋持続とか差延とか、 ちょっと高級そうな雰囲気漂う専門用語も ふんだんに散りばめてだ (思想違い)。

話は変わるが、昔ウェブ日記を小バカにするときに 「一般人の日常生活なんて描写されてもおもしろくもなんともない」 というような言いぶんがあったが、果たしてそうであろうか。 例えばいくらなんでも 「生協のボールサインは 10 円安い」とか 「70 円コーヒーの砂糖はキャラメルのような味がする」とか 「松屋の転機。鬱」とか、 いやすみませんこれは全部ぼくの (紙の) 日記に書いてある話題なんですが、 そこまであからさまに日常な日記は意外とないのではないか。

だからどうだと言われても困ります。 今日は散文モードなんです。

今日突然思いついたんだけど (と、ここで突然―――高階的に―――思いついたんだけど (という括弧の入れかたは arton さんぽいと思った (さすがに三重に括弧を重ねると読みにくいな (やはりS式には構造的に欠陥があ(以下略)))))、 思うに俺は「今日突然思いつ」くことが多いような気がする。 それこそ akr さんが「ふと気づ」くのと同じくらい多いような気がする。 tdiarygrep を駆使して検証してみよう。

思ったより少なかった。

えー、ここでスタックから話題を戻しますよ。 今日突然思いついたんだけど、 うわっ、何を思いついたか忘れたよ。 困ったな、プログラムのアイデアだったんだけどな。

あ、思い出した。 『Rubyレシピブック』の検索の話だ。

『Rubyレシピブック』をオンラインで検索できる CGI を作ろうと思って、 tdiarysearch と BitChannel からコードを切り貼りして書いたのね。 とりあえず基本機能は動いたんだけど、 やっぱり「章を限定して検索」とか 「サンプルコードのみ検索」とか欲しいよなあ、って思ったのだった。 アイデアじゃないじゃん。

なんか、ここまで話題が迷走するということは睡眠不足っぽいのでもう寝ます。

補足: なぜか「つれづれなるままに」の次に 「やうやう白くなりゆく」と出てしまい それ以外の可能性を考えられなくなってしまったので やむなく原文を検索したところ、こんなサイトを発見した。

http://www.tsurezuregusa.com/

これはなんと言うのだろう―――恋^H 故意^H^H 未必の故意^H^H^H^H^H いわゆる、「不覚にもワラタ」という気分でしょうか。いとおかし。

(02:37)

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

arton [「松屋の転機。鬱」の公開に一票。想像もつきません(と書いて突然気付いたが銀座の松屋じゃなくて豚ドンの松屋か……)]

ただただし [つーか、紙の日記をつけてるのがオドロキ]

青木 [やっぱ最後は紙ですよ。バッテリー切れないし軽いし閲覧性能
抜群だし視野角広いし。液晶なんざ敵じゃないです。

ちなみに「松屋の転機」は、国立(くにたち)駅前の松屋が工事を
始めてしまってこれからどこで朝食を食べたらいいんだ困ったな、
というだけの話でした。しかもいつのまにか近くに吉野家が
できてたことがわかったのでどーでもいいらしいです。]

ogino. [つーか、紙に日記にも「VS アジの開き」とか書いてあるのかどうか気になる。]

青木 [それはありえナイ……]


2004-05-26

BitChannel / 衝突検出

昨日のではバグを直しきれてなかった。 -kb でチェックインすると結構挙動が変わるなあ。 -ko にすべきだったか。

(20:39)

Wikiばなアフター

えらい豪華メンバーだなあ……

(04:34)


2004-05-27

BitChannel / 衝突検出

くくくくそ〜〜〜! CVS が古いとまだだめらしい。 外部コマンドはこういうとこが苦しい。

これか! これが原因か!

* A behavior change in `cvs up -jrev1 -jrev2' for modified files with a base
  revision of rev2 (ie, checked-out version matches rev2 and file has been
  modified).  The operation is no longer ignored and instead is passed to
  diff3.  This will potentially re-apply the diffs between the two revisions to
  a modified local file.  Status messages like from a standard merge have also
  been added when the file would not or does not change due to this merge
  request ("[file] already contains the changes between [revisions]...").
 
(cvs-1.11.16/NEWS より)

この変更は 1.11.10 か。うぅ、これを回避する方法は…… sticky にせずに古いリビジョンをワーキングコピーに復活させなきゃだめなのか。 一番手っ取り早いのは CVS/Entries 書き換えかなあ。

(20:05)

つかれた

だめ

もう

ねる

(20:07)

そもそも

そもそもなんで眠いかと言えばゆうべ例の電車の話を読んで

さらにそのあと隣にあったスレも全部読んでしまって

気付いたら 5 時。起きるのは 7 時。

という経緯です。

(20:35)

BitChannel / 衝突検出

マージは自前でやるという手もある。

(21:50)

そんなもんか

http://www.kyoto-np.co.jp/article.php?mid=P2004052700029&genre=C1&area=K00 (京都新聞「winnyの衝撃(1)罪に問われた利用者」)

内容はどうでもいいとしてさ、

初期ノード、IPアドレス、キャッシュ…。
高度な専門用語が飛び交う会社員の公判。

高度な専門用語?!

(22:00)

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

通りすがり [http://www.haruya.net/news/read.php?dat=1084410067]

shiro [wilikiでは、2つのバージョンA, Bと共通の祖先Cがある時に、C->AのeditlistとC->Bのeditlistを並行して当てる(というか、両方をキューにしといて当てられるものを当ててゆく)というふうにしています。CVSのmergeはもちっと賢い気がします。]

zunda [ごめんなさーい。
$ rpm -q cvs
cvs-1.11.6-81
$ /usr/local/bin/ruby -v
ruby 1.9.0 (2004-05-21) [i686-linux]
なんだけど。
(早くビルドマシンがほしいのう…)]

青木 [CVSのマージ機能だと候補を両方入れてくれたりしますしね。
自分でマージのコードを書くのも面倒だし、なんとかして
CVSの機能を使うようにしてみようと思います。]


2004-05-29

CVSクラック

げげげ、ruby-lang.org もか。 ここまでオープンソース関連が狙われてるところを見ると、 意図的にやってるんだろうなあ。しかも日本のサーバばっかりとは。

レポジトリ……独立してるのは去年の 12 月のしかないや。 あとは全部 cvsup で上書きされちゃってる。

(18:33)

負荷削減策 (1)

再起動直後、tDiary に 10 発くらい同時アクセスを食らって load average が 1720 まで上がっていた。さすがにこれはきつい。 本気で負荷削減策を考えるべきか。

(20:41)

負荷削減策 (2)

disp_referer2.rb の負担が大きいのは以前からわかっているの