history

青木日記 RSS

<前月 | 最新 | 次月>

2004-01-01

^2004

あけおめ!

ことよろ。

tdiarygrep

しまった。erb がない場合を考えてなかった。 erb/erbl にフォールバックしてても、 erbl 自体がパスに入ってなければ意味がない。

なんとなく index.rb を検出して なんとなく tDiary のソースディレクトリをロードパスに入れるようにしてみよう。

あと、リンク先を 200031231.html 形式から ./?date=20031231 に変えた。 このほうがリファラにも残らなくて便利そうだ。

tdiarygrep 1.39

本当にページを作ろう……。


2004-01-02

setup.rb フォーマットの長所と短所

こないだの RHG 読書会で、 Ruby プログラムのインストールイメージに関する話題があった。 よーするに、setup.rb の要求するディレクトリツリーが 非人道的で有罪でインタプリタの利点をスポイルしてしまうという話だ。 なんでかって言うと、ユーザが自分でライブラリを編集したいと思った場合、 毎回インストールしないと変更が反映されないから。

それでは自分の場合はどうかというと、 いちいちインストールするのはうざいのでシンボリックリンクを作ってるんだな。 こういうふうに。

~/lib/ruby/refe@     -> ~/c/refe/lib/refe
~/lib/ruby/tmail@    -> ~/c/tmail/lib/tmail
~/lib/ruby/racc@     -> ~/c/racc/lib/racc
~/lib/ruby/amstd@    -> ~/c/amstd/lib/amstd
~/lib/rubyext/tmail@ -> ~/c/tmail/ext/tmail

これで ~/lib/ruby と ~/lib/rubyext を $RUBYLIB に入れとく。 これで常に変更が反映するというわけだ (その代わり、何を使っても必ず最新版が動いてしまうという不便さもある)。

で、この作業をユーザにも強いるのか、極悪だダメダメだ非人道的だと言われたので、 それじゃあこれがだめならどーするんだ対案を出せと小一時間問い詰め^H^H^H^H みんなの協力のもとに検討したところ、次のような案が出た。

bin/refe
bin/mkrefe_rubyrefm
refe/database.rb         # ライブラリ
refe/.....
test/test*.rb

つまり、Ruby のライブラリパスにカレントディレクトリが入ってるんだから それをベースに考えようってことだな。 bin が残っているのは、bin/refe と refe/ が衝突するということが判明したから。

しかしこの方法にもいくつか欠点がある。

  • どのファイルをインストールすればいいのか明示的に記述する必要がある。
  • しかもその表は継続的にメンテする必要がある。めんどくさい。
  • 拡張ライブラリが入ってきたら一巻の終わり
  • setup.rb フォーマットでも lib に cd すればほとんど同じじゃないのか

あと、setup.rb フォーマットのほうがいいと思った点が、

  • パッと見てパッケージ内のファイルの役割がすぐわかる

というところだと思う。たとえば lib/ に入ってれば、 ああこれはライブラリだな、と、すぐに (ディレクトリ構造を見ただけで) わかる。 他人の作ったプログラムをいじるときには まずファイルの役割がわからないとあたりがつけられないので、 ファイルの属性がはっきりわかるというのは重要だと思う。 つまり、必ずしも編集のしやすさだけが変更のしやすさを示すのではないと言いたい。

インストーラに関しては、 そもそもインストーラがいらんという話もあったな。 適当に require を検出して展開しファイル一つにしてしまえば cp だけで済む。 ライブラリも zip なり ar なりで提供できるようにすればよい (ruby のほうを改造してしまえばよい)。という感じだったと思う。

でも改めて考えると ReFe のデータベースがインストールできないな。

ついでに言えば、ファイル融合をやるためには ライセンスを統一しとかないとまずそうだよな。 require ならなんとなく灰色で済ませるんだが。

結論としては、「やっぱり俺は setup.rb でいいや。」ということで。

setup.rb はもっと小さくならないのか?

ところで、setup.rb はでかすぎるような気がする。 「インストールするライブラリより setup.rb のほうがデカい」 とか言われると悲しいものだ。 機能を絞ってもっと小さくできないのだろうか。

結論から言うと、たぶん無理だな。

だってさー、なんだかんだ言ってルートディレクトリだけ すりかえてインストールとかしたいでしょ? config オプションが減るのは不便でしょ?

よろしい、ならば setup.rb だ。

……なんでコピペに移行するかな。

setup.rb.petite

と言いつつもやってみた。 名前は setup.rb.petite (ぷち) にしよう。 女性名詞なのか。

……

9KB しか減らなかった。敗北。

互いに素

算譜の記 2004-01-02から。

x と y が互いに素であるか判定するプログラム。 型を付けて引用するとこうなる。

ss :: [[Bool]]
ss = map s [0..]
 
s :: Int -> [Bool]
s 0 = cycle [False]
s 1 = cycle [True]
s n = cycle $ map (!! n) $ take n ss

(ss !! x) !! y で、x と y が互いに素かどうか判定できるらしい。 「!!」は Ruby で言う ary[i] みたいなもんだ。

うーん。仕組みが全然わからないよ……。

それはともあれ、モナドとモナコは似てないこともない。

追記: いや、さすがに Bool の二次元配列になってるとこまではわかるんですが、 その表がどういう理屈でどういう構造 (配置) になってるのかがわからないのです。 無限リストだと簡単に表示するというわけにもいかないし。

と愚痴ってるあいだに表示してみよう。 とりあえず 8 × 8 くらい表示すればいいかな。

*Tmp> map ((ss !! 0) !!) [0..7]
[False,False,False,False,False,False,False,False]
*Tmp> map ((ss !! 1) !!) [0..7]
[True,True,True,True,True,True,True,True]
*Tmp> map ((ss !! 2) !!) [0..7]
[False,True,False,True,False,True,False,True]
*Tmp> map ((ss !! 3) !!) [0..7]
[False,True,True,False,True,True,False,True]
*Tmp> map ((ss !! 4) !!) [0..7]
[False,True,False,True,False,True,False,True]
*Tmp> map ((ss !! 5) !!) [0..7]
[False,True,True,True,True,False,True,True]
*Tmp> map ((ss !! 6) !!) [0..7]
[False,True,False,False,False,True,False,True]
*Tmp> map ((ss !! 7) !!) [0..7]
[False,True,True,True,True,True,True,False]

頭の悪い方法だが、見やすいからいいとしよう。 もうちょい整形するとこうなる。

[False  False   False   False   False   False   False   False]
[True   True    True    True    True    True    True    True]
[False  True    False   True    False   True    False   True]
[False  True    True    False   True    True    False   True]
[False  True    False   True    False   True    False   True]
[False  True    True    True    True    False   True    True]
[False  True    False   False   False   True    False   True]
[False  True    True    True    True    True    True    False]

(0,1) 以外は線対称かな。線対称ですね。

いやでもやっぱ結果だけ表示してもわからないな。 どうなったら理解したと言えるんだろう。

追記 2: しつこく ss を見やすくしてみる。

- - - - - - - -
o o o o o o o o
- o - o - o - o
- o o - o o - o
- o - o - o - o
- o o o o - o o
- o - - - o - o
- o o o o o o -

なにか閃いたらしい

「互いに素」マップ (640 × 640)

ss image

前項の ss をビットマップにしてみた。 True が #1f7f1f、False が #cfcf00。 このビットマップを作るスクリプトもいちおう以下のとこに置いておく。

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

arton [setup.rb.petite ぶちっと減ったってことですね。]

shiro [ssは2次元の表ですな。]

nobsun [http://www.sampou.org/cgi-bin/cahier.cgi?Cahier%3a2004-01-02&l=jp とか。]

あおき [ありがとうございます。リンク張り直しました。]

はら [あけましておめでとうござます。

面白いです。数学的な内容はユークリッドの互除法ですね。

mprime :: Int -> Int -> Bool
mprime _ 0 = False
mprime _ 1 = True
mprime m n = mprime n (mod m n)

みたいな感じで、

ss = [[mprime i j | i <- [0..]] | j <- [0..]]]

あおき [なるほど、ユークリッドの互除法ですか。
そう考えたらなんとなくわかってきました。
ありがとうございます。]


2004-01-03

tdiarygrep rev 1.41

PC関係のメモより

ErbEvaluator = ErbLight
 
はERbLightでは?帰ったら試してみよう。
 
追記: 書き換えたら使えるようになった。

という指摘をいただいたので、こちらでも直しました。 rev 1.41 です。

そういえば、どこで見たのか忘れてしまいましたが BlogRD スタイル対応もマージしておきました。ありがとうございます。

クックブック

今日こそは、今日こそは真面目に原稿を書くんだ!

現状

~/c/cookbook/book2 % ./tools/show-flags.rb -ms
done 47%, most 30%, not yet 21%

今日中に not yet 10% を切りたいところだな。

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

杉野 [すいません、以前から気になっていたのですが、
~/c/ってのはどういうディレクトリなのでしょうか?
変なこと聞いてすいません^^;;]

あおき [いや、別に変じゃないと思いますよ ^^;;
c は CVS のワーキングコピーです。
でも最近は単なる作業用ディレクトリ置き場になってますけど。]

杉野 [なるほどありがとうございます。
1文字にまで略すってのは結構見慣れないもので
目新しく感じました。
入力が楽でよさそう。]


2004-01-04

Alpha で unpack がバグる

ああ……どうして原稿を書いてると Ruby のバグに当たるんだろう。

こないだの pack("N") の話の続きなんですけどね。 pack は確認したけど unpack を確認してなかった自分のバカさ加減を呪いたい。

aamine@asv800 % ./ruby -ve 'p "\000\000\000\001".unpack("N")'
ruby 1.9.0 (2004-01-01) [alpha-netbsd]
[4294967296]

なぜか今回はあっさりバグの原因にたどりついた。 簡単に言うと、 pack はマシンのエンディアンに合わせて処理を変えないといけないが unpack("N") は常にビッグエンディアンでないといけないってことだな。

えーと、テストはどうしようかなあ。 sizeof(long) != 32 じゃないと意味がないから 64 ビット環境だろ。 Alpha は今動いてる NetBSD/Alpha でいいとして、 ビッグエンディアンも欲しいな。 Solaris/SPARC64 を使おう。

gcc -g -m64  main.o dmyext.o libruby-static.a -ldl -lcrypt -lm   -o miniruby
ld: fatal: dlopen() of support library (libmakestate.so.1) failed with error: ld.so.1: /usr/ccs/bin/sparcv9/ld: fatal: libmakestate.so.1: open failed: No such file or directory
collect2: ld returned 1 exit status
*** Error code 1
make: Fatal error: Command failed for target `miniruby'

なんでだ……。

えー?

おや?

答え: GNU make を使うのが正解。 Solaris make が妙な環境変数 (SGS_SUPPORT) を設定してしまうようだ。

ああ、2 時間もはまってしまった。 やっとテストできるよ。

### NetBSD/Alpha
aamine@asv800 % file ruby
ruby: ELF 64-bit LSB executable, Alpha (unofficial), version 1 (SYSV), for NetBSD, dynamically linked (uses shared libs), not stripped
 
aamine@asv800 % ./ruby -v test_pack.rb
ruby 1.9.0 (2004-01-01) [alpha-netbsd]
Loaded suite test_pack
Started
...
Finished in 0.035738 seconds.
 
3 tests, 19 assertions, 0 failures, 0 errors
 
 
### Solaris/SPARCv9
aamine@ultra30 % file ruby
ruby:           ELF 64-bit MSB executable SPARCV9 Version 1, dynamically linked, not stripped
 
aamine@ultra30 % ./ruby -v test_pack.rb
ruby 1.9.0 (2004-01-01) [sparc-solaris2.9]
Loaded suite test_pack
Started
...
Finished in 0.025441 seconds.
 
3 tests, 19 assertions, 0 failures, 0 errors
 
 
### Linux/i686
~/c/ruby % file ruby
ruby: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked, not stripped
 
~/c/ruby % ./ruby -v test/ruby/test_pack.rb
ruby 1.9.0 (2004-01-01) [i686-linux]
Loaded suite test/ruby/test_pack
Started
...
Finished in 0.001345 seconds.
 
3 tests, 19 assertions, 0 failures, 0 errors

よしっ!

あーもう dev に投げて寝よ


2004-01-05

で、

お約束のように runner.rb でエラーが出まくってるのは何かの嫌がらせですか?

ruby だけインストールして libruby.so を入れ換えてなかった。鬱。

test runner トオッタ―――(.A.)―――!

「°」だと「キター!」が斜め上を向いてしまうのが 嫌だったので上下逆にしてみた。世の中、意外となんとかなるものだ。

ところでテストランナーって微妙にネットランナーと似てるな。鬱。

ついでに言えばロードランナーとも似てるかもしれない。!鬱。


2004-01-06

Ripper

Ripper の CVS レポジトリが RubyForge に移りました。

http://rubyforge.org/projects/ripper/

リーダーは Rich Kilmer です。 いちおうぼくもコミット権は保持してるので、 全然進まなくなったら再度奪い取りますが……。

しつこく tdiarygrep

http://www.rubyist.net/~matz/20040103.html#p03

tdiarygrep まつもとさんバージョン。 こう来たか。

とりあえず深く考えないで済むところだけマージしておく。

  • stdout.binmode
  • RD / BlogRD モードの区切り正規表現のバグ取り

リンクは今日の日記の最後のほうにあります。

tDiary / @referer_table

referer_scheme を導入。 これでかなり referer_table がすっきりした。

でも、なんか根本的にとても無駄な作業をしているような気がするんだよなあ。 例えば meta scheme は本来共有できる情報だ。 特に独創的なタイトルを表示したいという人もいないだろうから、 置き換え部分だって共有できるはずだ。 みんなで同じことを指定するのは大いなる無駄である。

と、いうのが @referer_table を維持する方向で考えたこと。

一方で、そもそも @referer_table は書かないほうがいいんじゃないかという気もする。 なぜなら、見ための望ましさを考えると

  • 全部タイトルが表示される
  • 全部 URL が表示される
  • タイトルと URL が混ざって表示される

の順番だと思うからだ。 中途半端にタイトルと URL が混ざっていると非常に汚い。 これは referer_table を維持する原動力にもなるわけだが、 全部の referer にルールを書くのははっきり言ってめんどくさい。 しかも面倒なのが一度や二度じゃなくて、 永遠にメンテしつづけなければならないってのは明らかに問題だろう。

そんなわけで、どっちにするかしばらく考えてる。

tDiary / @referer_table (2)

ついでに言えば、ymd な referer は 逆日付順 (新しいのが先) に並んでいると便利だなあと思う。 いつだったか、きたさんも書いていたように、 referer で気になるのは最近書かれたコンテンツだ。 日付らしきものを含む URL が逆日付順にソートされていれば、 最も注目したい URL が一番上に来る。 これならば、表示されているのが URL だけでも十分ではないか。

それじゃあ、ymd じゃない URL はどうするか。

……どうしよう?

tdiarygrep (2)

http://shugo.net/jit/20040106.html#p05

RD スタイルだと検索結果にインラインエレメントが出てしまうとのこと。

うーん、どうしたものかな。 tDiary の提供しているクラスを使ってパースするほうが確実に正しいんだが、 「それは面白くない」という致命的な欠点 (?) がある。 なにしろ grep だからな。grep は grep らしく働かなければなるまい。

ついでに遅そうでもある。 tdiarygrep は基本的にデータファイルを全部なめるので、 全日記をパースするのは避けたい。

どうしようかな。 さすがに記述フォーマットが増えることは滅多にないだろうから、 ReFe の RD タグ除去メソッドをひっつけてごまかすか。

ごまかした ↓

CVS
% cvs -d :pserver:anonymous@cvs.loveruby.net:/src co tdiarytools
本日のツッコミ (全2件) [ツッコミを入れる]

たけうち [(rev1.43)までhrefに入っていて404です。]

あおき [しまった。直しました。]


2004-01-07

tdiarygrep (3)

(昨日の続き)

昨日の解析はちょっと誤解していた。 Matz バージョンはヒットしたぶんだけ HTML 化するんだな。 それならマージしてもいいかもしれん。

いや、grep した対象と見ためが一致しないのはあまり嬉しくないな。 でも各日付のページに飛べばやっぱり同じことになるんだから、 各日記のスタイルで表示すべきか?

しかしスタイル対応するということは 恒久的に tDiary の CSS 仕様に追従しなければならないわけか。

いや待て待て、現時点でもテンプレートは 既に tDiary のスタイル仕様に従っているな。 ということは負担は変わらない。

ちょっと整理しよう。 何が気になっているかと言うと、以下の点だ。

  • ポータブルに require 'tdiary' できるか (ロードパスを tDiary と同じにできるか)
  • たかだか検索結果の表示のためにパースしてプラグインかける必要があるのか
  • 速度はどーなんだ

最も心配なのが第一点だ。 erb でもちょっとしくじったけど、 tdiary のライブラリとなるともっと不確実である。 例えば、かなり特殊な例ではあるが、この日記の index.rb を挙げよう。

#!/usr/local/bin/ruby
$KCODE = 'EUC'
load '/usr/local/lib/tdiary/index.rb'

こうなると現実的に tdiary.rb の位置は検出不可能である。

うむ。そうだな。そういうことでやっぱりやめよう。 プラグイン対応したい人は Matz バージョンを使ってね、ということで以上。

Ripper

チェックアウトしたら全ファイルに実行可能フラグが立ってるし……!

あんまり積極的に関わるのはまずいなあ、と思いつつも、 やっぱり反応してしまうわたし。

http://devlog.moonwolf.com/20040107.html#p04

> CVSのparse.yの日付を見ると2003/12/31だから1.8系列ということなんだろうか?

今の Ripper は 1.8 ベースです。 完成度が上がったら Ruby の CVS レポジトリに入れてもらおうという目論見です。

コンパイルエラーは……場所から言うと struct kwtable ですね。 gperf が古いのかな。

net/http

[ruby-dev:22519] で指摘されたところを修正してチェックイン。 ついでに、以前作ったテストを test/unit 用に直して入れておいた。

SOAP・SSL のコードも含めて、1/10 以降に本格的な改造を始める予定です。

めも

  • HTTP#put で、リクエストボディをストリームで渡せるようにする
  • WebDAV のリクエストクラスを作る
  • soap/netHttpClient.rb の basic-auth 対応
  • soap/netHttpClient.rb の persisitent connection 対応
  • net/https, net/protocols, net/pops をマージ

どまんなか

[ruby-talk:89341]

来る一月十日に UNIX epoch の真ん中がやってくるらしい。

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

shugo [中身をぜんぜん見てないのでアレなんですが、formのhiddenか何かで
matz版の機能を使うかどうか指定できるようにしておいて、なおかつ、
require 'tdiary'に成功した時だけmatz版の機能を有効にする、というのはまずいでしょうか?]


2004-01-09

まだまだ tdiarygrep

なるほど。 require 'tdiary' に成功したらプラグイン適用、 というのはアリだと思います。 いろいろありましたがマージしました。

……本当に、いろいろあったんですよ (泣)

[変更点]

  • 可能ならば tDiary のスタイルクラスを使ってパースし、プラグインを適用する (Matz 版マージ)
  • CGI で設定した tdiary.conf も見るようになった (Matz 版マージ)
  • 大衆に媚びたスタイルをデフォルトにした。(USE_THEME=true)
  • リンクのターゲットを日付じゃなくてセクションにした
  • 謎の検索ヒストリを追加

[稼働条件]

  • secure モードじゃない tDiary が動いていること
  • 自分で CGI プログラムを追加できる権限がある
  • それなりにマシンパワーが必要かもしれない

[インストールと設定]

  • tdiary.conf と同じディレクトリに置く。 ファイル名は制限に応じて grep.rb とか grep.cgi にする。
  • 実行可能にする。必要なら #! を書き換える。
  • 好みに応じて、ファイル先頭にあるフラグを書き換えてもよい。
  • ファイル先頭に書いてあるフォームをページのどこかに入れる。 意味がよくわからなければ tdiary.conf の HEADER に入れればよい。
  • ページキャッシュを更新しないと見えない鴨

[げっとする]

[CVS でげっとする]

% cvs -d :pserver:anonymous@cvs.loveruby.net:/src co tdiarytools

/.{,n}/

あれえ。/.{,n}/ と /.{0,n}/ って違うんだっけか?

% ruby -e 'p "aaa".slice(/.{,3}/)'
nil
% ruby -e 'p "aaa".slice(/.{0,3}/)'
"aaa"

むー。

% ruby-onig -e 'p "aaa".slice(/.{,3}/)'
nil
% ruby-onig -e 'p "aaa".slice(/.{0,3}/)'
"aaa"

むー。

うお、リファレンスマニュアルに載ってた。さすがだ。

    の繰り返し。{,n} や、{,} に対するマッチは必ず失敗する。

むー。

オーバーライドされたメソッドを呼ぶ

zt日記 2004-01-08より

> Ruby/GTKでfreezeがoverrideされているものがあるので
> Object#freezeが呼べるのかどうか考えてみた。

alias かなあ。

class C
  def freeze
    puts 'override'
  end
end
 
class Object
  alias _freeze freeze
end
 
c = C.new
c._freeze
p c.frozen?   #=> true
本日のツッコミ (全7件) [ツッコミを入れる]

ょゎ [同じくハマったことがあります。< {,n}
{0,n}と同じ意味にすると、何かマズいことがあるんでしょうかねえ。]

あおき [例によって「Unixの伝統」か、
はたまた「数学的に深淵なる理由がある」の
どちらかだと思うんですが、何でしょうねえ。]

こさこ [/a{,3}/.match("a{,3}")]

shugo [おお、ありがとうございました:)]

あおき [むー、それが通ってもあんまり嬉しくないような……]

せざーる [はじめまして。RDスタイルで tdiarygrep r1.53 を使ってみたのですが、素直に動いてくれませんでした。
次の二点で引っかかっているようです。

* class RDSection なので eval に失敗する( rd_style.rb の方が悪い?)
* Diary.split_topics でサブタイトルの = が split で失われてしまう

あと、冒頭にサブタイトルなしで書き始めてしまうことがあるので、 subtitle が nil になることも想定していただけると助かります。]

ただただし [tdiarygrep、tDiaryのcoreに入れませんか?]


2004-01-12

あー

寝すぎて頭が痛い。

tdiarygrep 標準添付しちゃうぞ話

tdiarygrep 標準添付ですか。ぼくは特に問題ありません。

ただ、実装に関してちょっと悩んでるんですよね。 一言で言うと、tDiary と癒着すべきか独立にすべきかということです。 癒着すればするほどバージョン依存の問題が出てきてうざったいですからねえ。 いっそのこと、標準添付するのと家で配布するのを完全に別バージョンにしちゃって、 添付するほうは癒着しまくりにしようかとも思ってます。

tdiarygrep / 検索ヒストリ

うーん、検索ヒストリはウケがいまひとつのようだ。

「PageUp」ではわかりにくかったのかな。そうだよなあ。 Shift + PageUp にしないとわからないよなあ (違)

表示されるのが grep だけじゃ寂しいから、 ランダムで ps とか cd を表示してみたりといった小細工も満載なのに……。 しかも ps が SystemV 風に ps -ef なのに……。 もっと通好みのマイナーコマンドも入れておいたほうがよかっただろうか。

tdiarygrep 改め tdiarysearch

RD スタイルだとだめですか……。 うーむ。やっぱり *Diary クラスを使わないとだめなのね。

前田さんのところでエラーになるのは、 たぶんセクションに分割するのがうまくいってないせいだと思います。 これも Diary クラスを使うとうまくいくんじゃないでしょうか。

で、tDiary のライブラリに癒着しまくったバージョンを作りました。

設置方法は前と同じです。 index.rb の隣において、必要ならシンボリックリンクして、 tdiary.conf で @header にフォームを追加。

ファイルにパラメータを書き込ませるのはやめました。 問答無用でテーマを使います。

一方、以下のは趣味に走りまくったバージョンです。 テーマ非対応ドキュメントなし解説なし Ruby 1.8 必須。

以前のが欲しい人は以下からどうぞ。 大変更前の最終版 rev 1.53 を置いておきました。

BitChannel

Wiki書いた → http://i.loveruby.net/w/

tdiarygrep / 課題

ああそうか、ツッコミはぜひ検索すべきだなあ。 これが実装できたら tdiarygrep はしばらくお休みにしよう。

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

まちゅ [mod_ruby環境では、検索後に「q=test undefined method `jsplit' for "test":String」と表示されます。CGI経由では正常に動作しました。(Apache/1.3.26 (Unix) mod_ruby/1.0.7 Ruby/1.8.0 search.rb/1.3)]

あおき [むむ、なんかよくわかりませんが、調べてみます。
少々おまちください。]


2004-01-13

ruby-dev summary

例によって例によって例によってすっかり忘れてました! うおお。土曜までは確かに覚えていたのに。 休みが入ったのがいけなかったのか。

BitChannel についてちょっとだけ話そうじゃないかっ

むう。tdiarygrep と言い BitChannel と言い、 めじゃーな分野で何か作ると反応が大きいのね……。

ここぞとばかりに役に立たない話を書こう。

まずきっかけから。

作るきっかけはサイトのページ更新がうざかったこと。 今は HTML なり RD なりを編集して cvs ci して make して rsync なんだけど、 これがめんどくさい。 BitChannel みたいな CVS 内蔵型 Wiki を使えば edit → save で終わる。 流行り言葉で言うと CMSっていうんですか? そういう使いかたがしたかった。

理由の二つめは「ソースコードを読むための技術」。 あれにはメールしか連絡手段がないにも関らず、 いまだに感想とか追加の指摘とかが来ている。 だからこれを Wiki に移してコメントボックスを付けて 簡単に意見が書けるようにすれば、 もっとたくさん意見が来るに違いないと目論んだわけだ。

そこで条件に合う Wiki を探してみた。 その条件はこんなかんじ。

  • Ruby で書いてある
  • バージョン管理できる。できれば CVS がいい。
  • 文法は RD (ブロック文法のみ)
  • 家のサーバ (Celeron 333A) で我慢できる速度が出る
  • せっかく Wiki なので WikiName とかも使ってみたい

あんまり無理な条件じゃないと思うんだけど この条件に当てはまる Wiki は意外に少なくて、 部分的に当てはまるのが AsWiki, RWiki, VikiWiki あたりだろうか。 一番理想に近そうなのが AsWiki だったのでちょっと改造してみたけども、 改造レベルではなくなってしまったので途中でやめた。

ここで運の悪いことに、ちょうど「rd2html の最小実装」 なるものを書き終えたところで、パーサがもうあった。 あとは実装一直線ですな。もっとも、その後 RD のフル実装は 複雑すぎることがわかって捨てたから結局 rd2html はほとんど役に立たなかった。

BitChannel / ポリシー決定

どこが「ちょっと」なのだ。まあいいや。 次はポリシーの由来 (?) について。 長々と文章で書くと疲れるので箇条書きでてきとうに書こうかな。

  • CVS 必須

去年の 11 月に『バカが征く』で話が出てたと思うけども、 もはや Wiki と言えどもバージョン管理は必須なのですよ。 だいたいコンテンツを作るのにバージョン管理しないなんて狂気の沙汰だと思うね。

と言いつつ tDiary のデータファイルはバージョン管理していないけども、 毎日全部 tar.gz に固めて三個所に分散バックアップしてるから勘弁してください。

  • amrita は使わない
  • キャッシュ追放
  • Ruby 1.8 以上対応

テンプレートライブラリは amrita か erb だろう。 しかし amrita は使いかたを知らない。 あと、どうも amrita が勝手にキャッシュするみたいなことが どっかに書いてあったので (これは間違いかも)、なんとなく嫌だった。

最近はとにかくキャッシュが嫌いなのだ。 tDiary でほとんど唯一気に食わないのもキャッシュだし。 家のメインマシンの CPU は P4 2.4GHz なわけで、 キャッシュなんかなくても高速に動くのだ。 それにも関らず必ずキャッシュしてくれちゃうもので、 tdiary.conf を編集するたびに rm -rf cache/tdiary するのがうざくてたまんない。 キャッシュは嫌だ。キャッシュは悪だ。世界の敵だ。 ブギーポップが出現しちゃうくらいダメだ。

あと amrita は標準添付でないというのも非常に大きい。 あんまりいろんなライブラリをインストールさせるのは面倒なので、 できることなら (1.8 の) 標準添付の範囲で済ませたかった。 1.6 を対象にしてしまうと time.rb とか uri.rb が使えないことになり、 いくらなんでもつらすぎるので捨てることにした。

  • 削った文法

ある文法が必要かどうかは「RHG で必要になったかどうか」で判断した。 RHG で使ったマークアップは必要。 使わなかったマークアップは不要。 「そんなもん RHG でも使わなかったぞ!」と言われると、 なんとなく納得できない? この基準に従って、というか、もうちょっと厳しくしたけど、 斜体とか打ち消し線とか深さ 5 以上のキャプションとかを排除。

  • そのほかいろいろ

でもって最後に、 たださんのポリシーとかなり一致する のは偶然でもなんでもなく、 そのへんの仕様は全部たださんの意見を参考にして決定されたからです。 12 月に「ただのにっき」で KoBit を検索しまくっていたのはわたしだ! (いばるな) WikiFarm に肯定的なのもそのへんの議論が理由。

あとは Tiki とか PukiWiki とか FreeStyleWiki とか YukiWiki とか 「 Wikiの文法の標準化に関するWiki」 を微妙に参考にしつつ、欲しい機能をピックアップして終わり。

まいなーは楽だ

それにつけても思うのは、マイナーで行くと割り切ってしまうと プログラムを書くのがすごく楽だということだ。

容赦なく「Ruby 1.8 以降対応」とか言えるし。 容赦なくマークアップを削れるし。 一般人向けの機能を要求するユーザには Hiki か RWiki をお勧めしておけば済むし (マテ


2004-01-14

困惑するときー

起きたら午前 0 時だったときー

はと

http://human2.2ch.net/test/read.cgi/male/1073172896/

食うものに困って鳩を食う 1


2004-01-15

進んでないもの

TD4 の実装が進まない。 最後に書いたところからちょっとは進んでるんだけど。

しかし今はまず原稿を手早く終わらせねばな。

それから net/http だ。 そろそろ「いじりたいイオン」が充電されてきたので近いうちに爆発する予感。

BitChannel

BitChannel は意外といじるところがないと思う。 残ってる大物はコメントボックスくらいか。 意図的に削った機能も多いしな。

細かいところで気になってること

  • 大文字小文字を区別しないファイルシステムで困るはず (対応する気なし)
  • CVS 1.10 だと cvs ann -F がないのを自動処理すべき
  • BitChannel の外から CVS で直接コミットするための補助ツールを用意する (枠組み自体はもうできている)
  • 西山さんの指摘の通り、 wc_read の CVS/Entries に "dummy time stamp" が入らないことを確認すべき。 気付いてはいたのだが CVS のソースコードを見るのが面倒でさぼってた。
  • デフォルトのページ群をもうちょっと整備する。

tdiarysearch

tdiarysearch が mod_ruby で動かない原因がわかった。 匿名モジュール上にロードされるからだな。

Module.new.module_eval(<<EOS)
class String
  def m() puts 'OK' end
end
EOS
"str".m   # エラー

直しました。rev 1.4

cacheless tdiary を目指して

昨日 tDiary のキャッシュについてぐちぐち文句を書いたら、 きたさんから鋭いツッコミが! (?)

http://kitaj.no-ip.com/tdiary/20040115.html#p02

あおきさんご所望のキャッシュ追放は
 
  eval(<<MODIFY_CLASS, TOPLEVEL_BINDING)
  module TDiary
     class TDiaryBase
	alias :initialize_orig :initialize
	def initialize(cgi, rhtml, conf)
	   initialize_orig(cgi, rhtml, conf)
	   @ignore_parser_cache = true
	end
 
	def store_cache(cache, prefix)
	end
     end
  end
  MODIFY_CLASS
 
こんなのをtdiary.confに書いておけば良いかと.

わたくしが間違っておりました。

さっそく設定しよう。 ちょっと変えてこうしてみた。

::TDiary::TDiaryBase.module_eval {
  alias initialize_org initialize
  #remove_method :initialize   # removing initialize causes warning
  remove_method :store_cache
 
  def initialize(cgi, rhtml, conf)
    initialize_org cgi, rhtml, conf
    @ignore_parser_cache = true
  end
 
  def store_cache(cache, prefix)
  end
}

どうだっ!

~ % ls var/cache/tdiary
disp_referrer2.cache  disp_referrer2.cache~  tdiarytimes

_| ̄|○

うーむ……。disp_referrer は置いとくとして、 tdiarytimes のログがキャッシュに入ってるのはおかしいな。 そういえばこれは改造するときにも思ったような気がする。 @conf.data_path に記録するようにしよう。

tdiarytimes 改

そんな感じの理屈で tdiarytimes 改のデータベースを $tdiary_data_path/tdiarytimes に変えました。 ついでに bar と circle でクラスを分割してリファクタリング。(rev 1.8)

このバージョンにすると線が全部消えてしまうので、 あらかじめデータファイルを mv しておくといいでしょう。 ちなみに機能は全然変わってないのでアップデートする必要はありません。

なお前回はすっかり書き損ねてましたが オリジナルの tdiarytimes は ねういちさんが原作です。 配布場所は http://nmnl.jp/hiki/software/?tDiary+%3A%3A+Plugin 。 言葉足らずでした。申し訳ない。

tdiarysearch / tdiarytimes 改のページ

tdiarysearch と tdiarytimes 改のページを作りました。

「でん」

「おでん」の「お」は御だろうか。 ということは「おでん」は「でん」か。 「でん」って何だ。

田楽刺し?

やっぱり田楽と関係があるようだ。

cacheless tDiary

tDiary のキャッシュ話をまとめました。

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

zunda [disp_referrerのキャッシュは設定画面から無効にしてくださいまし〜。]

あおき [うう、調べてないのがバレバレ……。
@options['disp_referrer2.no_cache']=true ですね。
ありがとうございます。]


2004-01-16

Ruby Hotlinks

おわっ。 Ruby Hotlinks が唐突に終わってしまった。 管理のみなさま、御苦労様でした。

そして後継は samidare ですか。名前は るるりん。 らしい。これは、句点までが名前なんだろうな。

絶対そのうち誰かが「ルルリンたん」って言いだすだろうなーと思ったので 先手を打って言っておく。ルルリンたん。グルタミン酸に似てないこともない。

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

みこみこみこみこみこ [みこみこみこみこみこみこみこみみこみこみこみこみこみこみこみこみこみこみこみこみこみこみこみこみこみおみこみこみこみこみこみこみこみこみこみこみ]


2004-01-17

tdiarysearch on mod_ruby

mod_ruby だと tdiarysearch が動かないらしい。 やっぱり環境を用意しないとだめだなあ。

いや、しかし、バグレポートのところに 「mod_rubyで動かない」と報告例を書いておいたら

本当に、mod_ruby で動きません

と来て爆笑しました (笑いごとじゃない)。

対処のほうですが、絶賛余裕なし中につき、 月曜か火曜あたりに調査してみます。すみません。

いちめんのえきしょう いちめんのえきしょう いちめんのえきしょう いちめんのえきしょう いちめんのえきしょう いちめんのえきしょう いちめんのえきしょう かすかなるくどうおん いちめんのえきしょう

操作性があーだとかこーだとか、 うだうだ言う前に壁一面モニターになってほしいよな。 いまのモニターは小さすぎるよ。最低 100" は必要だろう。

別にそう無理な要求はしてないと思うんだけどなあ。 例えば本で調べものをするときだったら、 横に三つとか四つ本を並べて見比べたりするじゃない。 それと同じことをしたいだけなのに、 なんでコンピュータではぐちゃぐちゃぐちゃぐちゃ ウインドウを上下しなければいけないのか。 これはそもそも上下する必要があるという時点で間違いでしょ。 俺は「同時に」二つのウィンドウを見たいんであって、 切り替えればいいというのは言いわけにすらなっとらん。

そうだ。いっそのことウィンドウをオーバーラップするのは禁止しよう。 そうすればみんな不便でたまらなくなってモニタが大きくなるはずだ。

特許だな。誰か「オーバーラップウィンドウ」で特許をとって、 法外な特許料を請求しる。

(11:25)

tdiarysearch

かずひこさんから mod_ruby 用パッチをいただいたので当てておきました。 ありがとうございます。

(14:38)

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

smbd [窓をディスプレイにする技術
http://slashdot.jp/article.pl?sid=04/01/16/2129246&topic=103&mode=nested
こんなのはどうでしょうか?(笑]

青木 [あ、実はそれを見て書きました。
壁一面のサッシが全部モニターになるのかー!
と期待したんですが、ちっこくてがっかり。]


2004-01-18

CVS HEAD

性懲りもなくサーバの ruby を CVS HEAD に上げた。

で、これが更新テストというわけだ。

(15:47)


2004-01-20

Services for UNIX 3.5 日本語版

http://www.microsoft.com/japan/windows/sfu/

SFU 3.5 日本語版リリース age

(20:07)

erbscan

キャッシュは世界の敵だと言った手前と言うか Wiki に書き込みまでしてもらったので、 責任をとって家にも erbscan を導入しました。

速くなったかな?

キャッシュ

蛇足ながら追記しておくと、 別に「とにかくキャッシュをなくせば世の中は平和になる」 なんて主張したいわけではないですよ、もちろん。 例えば極端な話、 マザーボードにキャッシュが付いてるからって不満を覚えるわけじゃないし。 それはソフトウェアからは透過だし現実に効果があるからです。 ハードウェアキャッシュがなかったら いかに最新マシンと言えども使いものになりませんからね。 キャッシュ重要。

とは言え、キャッシュがなくても問題ないんなら、ないほうがいいわけですよね。 でも世間は速度が下がる (下がるような気がする) 方向には冷たいので、 我々としては「キャッシュなんて糞」くらいに思ってないと釣合いが取れないと思うのです。 今回のはそういう意図です。

何にしても今回は結果として建設的な方向に進んだので 文句を言っておいてよかったかな。

(20:32)

ltrace

http://packages.debian.org/unstable/utils/ltrace.html

ライブラリコールをトレースしてくれるツール。 こないだ「ソースコードを読む技術」に追記してるときに知った。

すげえ便利なんだけど、共有ライブラリから呼んだ関数は 表示してくれないので、--enable-shared な ruby なんかは悲しいことになる。 拡張ライブラリも同じ。

(22:38)

tDiary記述形式

この日記はこんな形式で書いてます。

= Services for UNIX 3.5 日本語版
 
http://www.microsoft.com/japan/windows/sfu/
 
SFU 3.5 日本語版リリース age

見ため RD なんですが、「==」もインラインも dl もありません。 リストのネストもありません。その代わりに、

  • URL は勝手にリンクになる
  • HTML タグが素通し

という特徴があります (よくよく考えると BitChannel の文法とかなり似てる)。

またインデントによる pre も存在せず、 「--」で開始と終了を明示します。 なんでかって言えばパースが簡単だからです。

いまんところはメールブリッジに仕込んでるんですが、 tdiarygrep を書いてたら tDiary の内部がわかってきたので、 そのうちスタイルにしてみようかなあと思ってます。

(00:59)

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

arton [青木さんもパスポートに登録したのかな? (.NET Frameworkをダウンロードするのは登録フリーなのに……)]

あおき [登録してしまいました。悔しい。
しかも SFU のダウンロードのときには
IT 関連企業に就職してるのが前提のような質問がっ]

arton [見るからにUnixからWindowsへの乗り換えキャンペーンの販促名簿集めっぽいですよね。]

あおき [「>>Microsoft必死だな (w」ですねえ。
ただ実際に有効なことが多いのがなんとも。]


2004-01-21

ruby

configure.in が Interix 対応してる! 対応早っ。

(00:21)

今日のBitChannel

こっそり改良されているようです。

  • 箇条書きの折り返し
  • RD スタイルの dl
  • インデントによる pre
  • InterWikiName を使ったインラインイメージの URL 縮約

一度外した RD スタイルの文法が徐々に復活してる……のかな。

(04:03)


2004-01-22

「OOエンジニアの輪!」第25回:結城浩さんの巻

http://www.ogis-ri.co.jp/otc/hiroba/others/OORing/interview25.html

ないわけではありません。例えば、基本的に午前中は本を書いています。
午前中は一番頭が回る良い時間なんですね。私は「黄金の時間」と呼んで
います。その時間帯は一番頭を使わなくてはいけない仕事をしています。
 
-- なるほど。著作をされている方は時間が逆転されているという
イメージがあるので、午前に著作活動をされているというのは驚きですね。
 
でも、良く寝て起きた朝が一番頭が働きますよ。最近はちょっと崩れて
きているけど、本当にまじめに本を書いているときは午前を中心にしてますよ。

ぐは

ま、真夜中は……だめですか……

まあでも実際そうだよな。 夜更しして書いたときはロクなことになった覚えがない。

(22:35)

SFU 3.5

telnet が使えるのは便利だ。 まずは uname から。

~ % uname -a
Interix nocturne 3.5 SP-8.0.1969.1 x86 Pentium III/Celeron (rev0x0806)

変なの。

~ % w
w: Command not found.

w がない。who, last はある。finger もある。

~ % ll -d /bin /lib /usr/bin /usr/lib
lrw-rw-r--  1 Administrator  +Administrators      7 Nov 14 07:14 /lib@ -> usr/lib
lrw-rw-r--  1 Administrator  +Administrators      6 Nov 14 07:15 /usr/bin@ -> ../bin
drwxrwxr-x  1 Administrator  +Administrators  40960 Jan 20 23:15 /bin/
drwxrwxr-x  1 Administrator  +Administrators  16384 Jan 22 23:02 /usr/lib/

なんでそういうことをするんだよ。 /usr か / かどっちかに揃えろよ。

~ % ll /proc/235
total 0
crw-------  1 Administrator  H5    0,   0 Jan 22 23:34 as%
cr--------  1 Administrator  H5    0,   0 Jan 22 23:34 cmdline%
c-w-------  1 Administrator  H5    0,   0 Jan 22 23:34 ctl%
cr--------  1 Administrator  H5    0,   0 Jan 22 23:34 environ%
dr-xr-xr-x  1 Administrator  H5         0 Jan 22 23:34 lwp/
cr--------  1 Administrator  H5    0,   0 Jan 22 23:34 map%
cr--r--r--  1 Administrator  H5    0,   0 Jan 22 23:34 psinfo%
cr--r--r--  1 Administrator  H5    0,   0 Jan 22 23:34 stat%
cr--------  1 Administrator  H5    0,   0 Jan 22 23:34 status%

procfs はディレクトリらしい。 お、スレッド (LWP) が見えてる。

ところで Interix (いんてりっくす) ってかっこわるくない? 特に「てり」が。

SFU 3.5 で ruby をコンパイルしてる人の数 → (4)

で ruby だ。 CVS 入れるのは面倒だからソースコードは Cygwin の CVS で取ろう。 parse.y も Cygwin の bison で処理しとく。

% ./configure CFLAGS=-g --prefix=/usr/local/pkg/ruby-20040122 --enable-shared

てな感じでやってみた。

うだうだ言われるものの、コンパイルは通るねえ。 とりあえず無茶してみるか。

~/src/ruby-sfu/test % ruby runner.rb
/usr/local/pkg/ruby-20040122/lib/ruby/1.9/i586-interix3/nkf.so:
[BUG] Segmentation fault
ruby 1.9.0 (2004-01-22) [i586-interix3]
 
Abort (core dumped)

よし。(なにがだ)

(23:56)

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

babie [Interix(インタリクス)と呼んでいます。こっちの方がかっこいいので。(多分)]

青木 [「インタリクス」いいですね。
僕もそっちで呼ぶことにします。]


2004-01-23

はてなダイアリーを書籍化

http://www.hatena.ne.jp/info/hatenadiarybook

自分で書いたはてなダイアリーを本にしてくれるサービス。 一冊 1600 円からってめちゃくちゃ安いな。 いったいどういう装丁なんだ。

あ、サンプル PDF があった。 ……ああ、なるほど。言っちゃ悪いが中身は値段なりだな。 もうちょっときれいに飾りつけしてくれるのかと思った。

それでも 100 ページで 1600 円からという激安料金を考えれば十分納得できる範囲かな。 個人でこういうことをやるのは難しいだろうし、おもしろいサービスだと思う。

どういう日記だと印刷したくなるだろうねえ。 やっぱりエッセイぽいのが向いてるだろうな。

(19:47)

@referer_day_only

ふぇみにん日記 2004-01-23 を読んで、家でも特定日付のページに対するリファラだけを記録することにした。

# tdiary.conf
@referer_day_only = true

今までこの変数の意味を誤解してました。 日ごとのページにだけ referer を表示する設定だと思ってた。

(01:00)


2004-01-24

TD4 / クロック精度

12/07の日記 にツッコミがあったのでこっちでも追記。 TD4 でクロックがきっちり 1Hz にならないそうです。

http://www.bea.hi-ho.ne.jp/m-okaniwa/cpu.htm

家の TD4 もクロック・リセットだけはできているので、 ストップウォッチ片手に測ってみました。

結果は 60 秒で 58 クロック。やっぱりちょっとずれてるけど、 ツッコミの人は 53〜54 ということなんで少しはましなのかな。 ふーむ。この違いはなんだろう。

※ どうでもいいが「ツッコミの人」という表現は 「紫のバラの人」の構造に酷似しているような 気がするのは気の迷いですか。そうですか。

TD4 も早く続きをいじりたいんだけど、とりあえず今は締切だにゃ。

ああっ、わかってますってば、書きます! 書きますとも! そんな恨みがましい目をしないでえええ!

(17:50)

BitChannel / ページ凍結

http://i.loveruby.net/w/BitChannelRequest.html

やはりページ凍結機能の要望が来てしまったか……。

結論から言うとページ凍結は導入しません。 理由は実装がめんど……じゃなくて、あまり意味がないと思うからです。

例えば、上記のページには凍結が欲しい例として 「SitePolicyを変更されたらやだ」 という例が挙げられていますが、SitePolicy を凍結しといても FrontPage を変更してリンクを張り換えてしまえば効果は同じです。 あるいは、SitePolicy だけ守っても他のページをことごとく消されたら やっぱり困るでしょう。

ではどうするかというと、 基本的には荒らされちゃったらあきらめるしかないのかなあと思います。 でもまあ、何も対策しないってのも悲しいので、

  • 何か変なことがあったらすぐにわかる
  • できるだけ簡単に復旧できる

と、復旧機能を充実することで解決しようと思います。

ページを復旧するのは BitChannel では超簡単です。 History → ViewRev → EditThis → SAVE と 4 回クリックするだけで任意のリビジョンを復活できます。

他に、CVS で直接操作する手もあります。 これなら「何でもあり」なので、全ページを特定の日付の状態に戻すなんてのも簡単。 もちろん、バックアップがあるならレポジトリごと戻しても OK。

問題は変更を検出するほうですが、 こっちがまだ弱いんですね。 とりあえずメール送信と RDF 出力は対応します。 問題は口をどこに作るかですが、 まず他の Wiki の状況を調査してからにします。

(19:27)

SFU + Cygwin = ...

一つのファイルを SFU の vi でいじりつつ Linux で cvs ci して Cygwin から cvs up すると摩訶不思議なことになるということがわかった。

(01:58)

mput'sちゃんねる

http://mput.dip.jp/mput/

見ればわかる。

(03:50)

Java並列プログラミングTips

http://www.netgene.co.jp/java/concurrentTips.html より引用 (とくひろ日記@tDiary経由)

The Java SeriesにはDoug Lea著の「Javaスレッドプログラミング」があるが,こ
れについても補足しておこう.この本の原題は"Concurrent Programming in
Java:Design principles and patterns"で,このタイトルから判断すると本来は
並列プログラミングの書籍である.(略)
……
原文で読んでも理解するのはかなり難しく並列プログラミングを知る者にさえも
内容を把握するのは困難.少なくともほとんどのベテランプログラマーを含む
「並列プログラミング初心者」には,絶対に勧められない代物となっている.
 
「Java言語で学ぶデザインパターン入門マルチスレッド編」や「Javaプログラム
デザイン」のマルチスレッド関連の解説も,Doug Leaの「Javaスレッドプログラ
ミング」を参考にしているらしい.このため,これらのいずれもが Javaを使った
並列プログラミングの参考には,あまりならないと考えられる.

げげ、そ、そうなの?

内容もすごすぎ。Tips とかいうレベルじゃない。

(04:59)

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

ささだ [1000ページあったとして,各ページに100回くらい機械的な荒らしのアタックがあったとして,更新通知メールは100000通.根本的には対策は無理なんですかね.まぁ,時間制限とかなんとか入れるとしても,いろいろ抜け道はありそう.その中から有用な変更を救おうとすると,さらに大変そう.

根本的な対策は恨みを買わないことくらいなのかなー.]

青木 [その回数だとWikiとか関係ないっす。
家の貧弱な環境なら回線がつぶれて終わり。
それに、そこまでやっちゃうと悪戯じゃ
すまないので、荒らすほうとしてもリスクが
高すぎるでしょう。]

青木 [と思ったけど、100000セーブくらいじゃだめかな。
個人運営ならその程度でも攻撃と認めてくれるだろうか。]

まちゅ [通知メールを送るタイミングをページの更新ではなく、一定時間ごとにすればどうでしょうか。]

青木 [ああいや、たぶん実際にメールが100000通来ることはなかろうと思うので
あまり本気で心配はしてません。実際に起きたらなんか考えます。]


2004-01-25

PARSEC47

http://www.asahi-net.or.jp/~cs8k-cyu/windows/p47.html

D 言語で書いてあるシューティングゲーム。 むずい……。

……なんでシューティングやってますか? > 俺

弾幕記述言語 BulletML というのもあるらしい。

(02:06)


2004-01-26