しまった。erb がない場合を考えてなかった。 erb/erbl にフォールバックしてても、 erbl 自体がパスに入ってなければ意味がない。
なんとなく index.rb を検出して なんとなく tDiary のソースディレクトリをロードパスに入れるようにしてみよう。
あと、リンク先を 200031231.html 形式から ./?date=20031231 に変えた。 このほうがリファラにも残らなくて便利そうだ。
tdiarygrep 1.39
本当にページを作ろう……。
こないだの 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/ に入ってれば、 ああこれはライブラリだな、と、すぐに (ディレクトリ構造を見ただけで) わかる。 他人の作ったプログラムをいじるときには まずファイルの役割がわからないとあたりがつけられないので、 ファイルの属性がはっきりわかるというのは重要だと思う。 つまり、必ずしも編集のしやすさだけが変更のしやすさを示すのではないと言いたい。
インストーラに関しては、 そもそもインストーラがいらんという話もあったな。 適当に require を検出して展開しファイル一つにしてしまえば cp だけで済む。 ライブラリも zip なり ar なりで提供できるようにすればよい (ruby のほうを改造してしまえばよい)。という感じだったと思う。
でも改めて考えると ReFe のデータベースがインストールできないな。
ついでに言えば、ファイル融合をやるためには ライセンスを統一しとかないとまずそうだよな。 require ならなんとなく灰色で済ませるんだが。
結論としては、「やっぱり俺は setup.rb でいいや。」ということで。
ところで、setup.rb はでかすぎるような気がする。 「インストールするライブラリより setup.rb のほうがデカい」 とか言われると悲しいものだ。 機能を絞ってもっと小さくできないのだろうか。
結論から言うと、たぶん無理だな。
だってさー、なんだかんだ言ってルートディレクトリだけ すりかえてインストールとかしたいでしょ? config オプションが減るのは不便でしょ?
よろしい、ならば setup.rb だ。
……なんでコピペに移行するかな。
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 をビットマップにしてみた。 True が #1f7f1f、False が #cfcf00。 このビットマップを作るスクリプトもいちおう以下のとこに置いておく。
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% を切りたいところだな。
ああ……どうして原稿を書いてると 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 に投げて寝よ
お約束のように runner.rb でエラーが出まくってるのは何かの嫌がらせですか?
ruby だけインストールして libruby.so を入れ換えてなかった。鬱。
test runner トオッタ―――(.A.)―――!
「°」だと「キター!」が斜め上を向いてしまうのが 嫌だったので上下逆にしてみた。世の中、意外となんとかなるものだ。
ところでテストランナーって微妙にネットランナーと似てるな。鬱。
ついでに言えばロードランナーとも似てるかもしれない。!鬱。
Ripper の CVS レポジトリが RubyForge に移りました。
http://rubyforge.org/projects/ripper/
リーダーは Rich Kilmer です。 いちおうぼくもコミット権は保持してるので、 全然進まなくなったら再度奪い取りますが……。
http://www.rubyist.net/~matz/20040103.html#p03
tdiarygrep まつもとさんバージョン。 こう来たか。
とりあえず深く考えないで済むところだけマージしておく。
リンクは今日の日記の最後のほうにあります。
referer_scheme を導入。 これでかなり referer_table がすっきりした。
でも、なんか根本的にとても無駄な作業をしているような気がするんだよなあ。 例えば meta scheme は本来共有できる情報だ。 特に独創的なタイトルを表示したいという人もいないだろうから、 置き換え部分だって共有できるはずだ。 みんなで同じことを指定するのは大いなる無駄である。
と、いうのが @referer_table を維持する方向で考えたこと。
一方で、そもそも @referer_table は書かないほうがいいんじゃないかという気もする。 なぜなら、見ための望ましさを考えると
の順番だと思うからだ。 中途半端にタイトルと URL が混ざっていると非常に汚い。 これは referer_table を維持する原動力にもなるわけだが、 全部の referer にルールを書くのははっきり言ってめんどくさい。 しかも面倒なのが一度や二度じゃなくて、 永遠にメンテしつづけなければならないってのは明らかに問題だろう。
そんなわけで、どっちにするかしばらく考えてる。
ついでに言えば、ymd な referer は 逆日付順 (新しいのが先) に並んでいると便利だなあと思う。 いつだったか、きたさんも書いていたように、 referer で気になるのは最近書かれたコンテンツだ。 日付らしきものを含む URL が逆日付順にソートされていれば、 最も注目したい URL が一番上に来る。 これならば、表示されているのが URL だけでも十分ではないか。
それじゃあ、ymd じゃない URL はどうするか。
……どうしよう?
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
(昨日の続き)
昨日の解析はちょっと誤解していた。 Matz バージョンはヒットしたぶんだけ HTML 化するんだな。 それならマージしてもいいかもしれん。
いや、grep した対象と見ためが一致しないのはあまり嬉しくないな。 でも各日付のページに飛べばやっぱり同じことになるんだから、 各日記のスタイルで表示すべきか?
しかしスタイル対応するということは 恒久的に tDiary の CSS 仕様に追従しなければならないわけか。
いや待て待て、現時点でもテンプレートは 既に tDiary のスタイル仕様に従っているな。 ということは負担は変わらない。
ちょっと整理しよう。 何が気になっているかと言うと、以下の点だ。
最も心配なのが第一点だ。 erb でもちょっとしくじったけど、 tdiary のライブラリとなるともっと不確実である。 例えば、かなり特殊な例ではあるが、この日記の index.rb を挙げよう。
#!/usr/local/bin/ruby $KCODE = 'EUC' load '/usr/local/lib/tdiary/index.rb'
こうなると現実的に tdiary.rb の位置は検出不可能である。
うむ。そうだな。そういうことでやっぱりやめよう。 プラグイン対応したい人は Matz バージョンを使ってね、ということで以上。
チェックアウトしたら全ファイルに実行可能フラグが立ってるし……!
あんまり積極的に関わるのはまずいなあ、と思いつつも、 やっぱり反応してしまうわたし。
http://devlog.moonwolf.com/20040107.html#p04
> CVSのparse.yの日付を見ると2003/12/31だから1.8系列ということなんだろうか?
今の Ripper は 1.8 ベースです。 完成度が上がったら Ruby の CVS レポジトリに入れてもらおうという目論見です。
コンパイルエラーは……場所から言うと struct kwtable ですね。 gperf が古いのかな。
[ruby-dev:22519] で指摘されたところを修正してチェックイン。 ついでに、以前作ったテストを test/unit 用に直して入れておいた。
SOAP・SSL のコードも含めて、1/10 以降に本格的な改造を始める予定です。
めも
■
shugo [中身をぜんぜん見てないのでアレなんですが、formのhiddenか何かで
matz版の機能を使うかどうか指定できるようにしておいて、なおかつ、
require 'tdiary'に成功した時だけmatz版の機能を有効にする、というのはまずいでしょうか?]
なるほど。 require 'tdiary' に成功したらプラグイン適用、 というのはアリだと思います。 いろいろありましたがマージしました。
……本当に、いろいろあったんですよ (泣)
[変更点]
[稼働条件]
[インストールと設定]
[げっとする]
[CVS でげっとする]
% cvs -d :pserver:anonymous@cvs.loveruby.net:/src co tdiarytools
あれえ。/.{,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} や、{,} に対するマッチは必ず失敗する。
むー。
> 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
■
ょゎ [同じくハマったことがあります。< {,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に入れませんか?]
寝すぎて頭が痛い。
tdiarygrep 標準添付ですか。ぼくは特に問題ありません。
ただ、実装に関してちょっと悩んでるんですよね。 一言で言うと、tDiary と癒着すべきか独立にすべきかということです。 癒着すればするほどバージョン依存の問題が出てきてうざったいですからねえ。 いっそのこと、標準添付するのと家で配布するのを完全に別バージョンにしちゃって、 添付するほうは癒着しまくりにしようかとも思ってます。
うーん、検索ヒストリはウケがいまひとつのようだ。
「PageUp」ではわかりにくかったのかな。そうだよなあ。 Shift + PageUp にしないとわからないよなあ (違)
表示されるのが grep だけじゃ寂しいから、 ランダムで ps とか cd を表示してみたりといった小細工も満載なのに……。 しかも ps が SystemV 風に ps -ef なのに……。 もっと通好みのマイナーコマンドも入れておいたほうがよかっただろうか。
RD スタイルだとだめですか……。 うーむ。やっぱり *Diary クラスを使わないとだめなのね。
前田さんのところでエラーになるのは、 たぶんセクションに分割するのがうまくいってないせいだと思います。 これも Diary クラスを使うとうまくいくんじゃないでしょうか。
で、tDiary のライブラリに癒着しまくったバージョンを作りました。
設置方法は前と同じです。 index.rb の隣において、必要ならシンボリックリンクして、 tdiary.conf で @header にフォームを追加。
ファイルにパラメータを書き込ませるのはやめました。 問答無用でテーマを使います。
一方、以下のは趣味に走りまくったバージョンです。 テーマ非対応ドキュメントなし解説なし Ruby 1.8 必須。
以前のが欲しい人は以下からどうぞ。 大変更前の最終版 rev 1.53 を置いておきました。
Wiki書いた → http://i.loveruby.net/w/
ああそうか、ツッコミはぜひ検索すべきだなあ。 これが実装できたら tdiarygrep はしばらくお休みにしよう。
例によって例によって例によってすっかり忘れてました! うおお。土曜までは確かに覚えていたのに。 休みが入ったのがいけなかったのか。
むう。tdiarygrep と言い BitChannel と言い、 めじゃーな分野で何か作ると反応が大きいのね……。
ここぞとばかりに役に立たない話を書こう。
まずきっかけから。
作るきっかけはサイトのページ更新がうざかったこと。 今は HTML なり RD なりを編集して cvs ci して make して rsync なんだけど、 これがめんどくさい。 BitChannel みたいな CVS 内蔵型 Wiki を使えば edit → save で終わる。 流行り言葉で言うと CMSっていうんですか? そういう使いかたがしたかった。
理由の二つめは「ソースコードを読むための技術」。 あれにはメールしか連絡手段がないにも関らず、 いまだに感想とか追加の指摘とかが来ている。 だからこれを Wiki に移してコメントボックスを付けて 簡単に意見が書けるようにすれば、 もっとたくさん意見が来るに違いないと目論んだわけだ。
そこで条件に合う Wiki を探してみた。 その条件はこんなかんじ。
あんまり無理な条件じゃないと思うんだけど この条件に当てはまる Wiki は意外に少なくて、 部分的に当てはまるのが AsWiki, RWiki, VikiWiki あたりだろうか。 一番理想に近そうなのが AsWiki だったのでちょっと改造してみたけども、 改造レベルではなくなってしまったので途中でやめた。
ここで運の悪いことに、ちょうど「rd2html の最小実装」 なるものを書き終えたところで、パーサがもうあった。 あとは実装一直線ですな。もっとも、その後 RD のフル実装は 複雑すぎることがわかって捨てたから結局 rd2html はほとんど役に立たなかった。
どこが「ちょっと」なのだ。まあいいや。 次はポリシーの由来 (?) について。 長々と文章で書くと疲れるので箇条書きでてきとうに書こうかな。
去年の 11 月に『バカが征く』で話が出てたと思うけども、 もはや Wiki と言えどもバージョン管理は必須なのですよ。 だいたいコンテンツを作るのにバージョン管理しないなんて狂気の沙汰だと思うね。
と言いつつ tDiary のデータファイルはバージョン管理していないけども、 毎日全部 tar.gz に固めて三個所に分散バックアップしてるから勘弁してください。
テンプレートライブラリは 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 をお勧めしておけば済むし (マテ
TD4 の実装が進まない。 最後に書いたところからちょっとは進んでるんだけど。
しかし今はまず原稿を手早く終わらせねばな。
それから net/http だ。 そろそろ「いじりたいイオン」が充電されてきたので近いうちに爆発する予感。
BitChannel は意外といじるところがないと思う。 残ってる大物はコメントボックスくらいか。 意図的に削った機能も多いしな。
細かいところで気になってること
tdiarysearch が mod_ruby で動かない原因がわかった。 匿名モジュール上にロードされるからだな。
Module.new.module_eval(<<EOS) class String def m() puts 'OK' end end EOS "str".m # エラー
直しました。rev 1.4
昨日 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 改のデータベースを $tdiary_data_path/tdiarytimes に変えました。 ついでに bar と circle でクラスを分割してリファクタリング。(rev 1.8)
このバージョンにすると線が全部消えてしまうので、 あらかじめデータファイルを mv しておくといいでしょう。 ちなみに機能は全然変わってないのでアップデートする必要はありません。
なお前回はすっかり書き損ねてましたが オリジナルの tdiarytimes は ねういちさんが原作です。 配布場所は http://nmnl.jp/hiki/software/?tDiary+%3A%3A+Plugin 。 言葉足らずでした。申し訳ない。
tdiarysearch と tdiarytimes 改のページを作りました。
おわっ。 Ruby Hotlinks が唐突に終わってしまった。 管理のみなさま、御苦労様でした。
そして後継は samidare ですか。名前は るるりん。 らしい。これは、句点までが名前なんだろうな。
絶対そのうち誰かが「ルルリンたん」って言いだすだろうなーと思ったので 先手を打って言っておく。ルルリンたん。グルタミン酸に似てないこともない。
■ みこみこみこみこみこ [みこみこみこみこみこみこみこみみこみこみこみこみこみこみこみこみこみこみこみこみこみこみこみこみこみおみこみこみこみこみこみこみこみこみこみこみ]
mod_ruby だと tdiarysearch が動かないらしい。 やっぱり環境を用意しないとだめだなあ。
いや、しかし、バグレポートのところに 「mod_rubyで動かない」と報告例を書いておいたら
本当に、mod_ruby で動きません
と来て爆笑しました (笑いごとじゃない)。
対処のほうですが、絶賛余裕なし中につき、 月曜か火曜あたりに調査してみます。すみません。
操作性があーだとかこーだとか、 うだうだ言う前に壁一面モニターになってほしいよな。 いまのモニターは小さすぎるよ。最低 100" は必要だろう。
別にそう無理な要求はしてないと思うんだけどなあ。 例えば本で調べものをするときだったら、 横に三つとか四つ本を並べて見比べたりするじゃない。 それと同じことをしたいだけなのに、 なんでコンピュータではぐちゃぐちゃぐちゃぐちゃ ウインドウを上下しなければいけないのか。 これはそもそも上下する必要があるという時点で間違いでしょ。 俺は「同時に」二つのウィンドウを見たいんであって、 切り替えればいいというのは言いわけにすらなっとらん。
そうだ。いっそのことウィンドウをオーバーラップするのは禁止しよう。 そうすればみんな不便でたまらなくなってモニタが大きくなるはずだ。
特許だな。誰か「オーバーラップウィンドウ」で特許をとって、 法外な特許料を請求しる。
(11:25)
かずひこさんから mod_ruby 用パッチをいただいたので当てておきました。 ありがとうございます。
(14:38)
http://www.microsoft.com/japan/windows/sfu/
SFU 3.5 日本語版リリース age
(20:07)
蛇足ながら追記しておくと、 別に「とにかくキャッシュをなくせば世の中は平和になる」 なんて主張したいわけではないですよ、もちろん。 例えば極端な話、 マザーボードにキャッシュが付いてるからって不満を覚えるわけじゃないし。 それはソフトウェアからは透過だし現実に効果があるからです。 ハードウェアキャッシュがなかったら いかに最新マシンと言えども使いものになりませんからね。 キャッシュ重要。
とは言え、キャッシュがなくても問題ないんなら、ないほうがいいわけですよね。 でも世間は速度が下がる (下がるような気がする) 方向には冷たいので、 我々としては「キャッシュなんて糞」くらいに思ってないと釣合いが取れないと思うのです。 今回のはそういう意図です。
何にしても今回は結果として建設的な方向に進んだので 文句を言っておいてよかったかな。
(20:32)
http://packages.debian.org/unstable/utils/ltrace.html
ライブラリコールをトレースしてくれるツール。 こないだ「ソースコードを読む技術」に追記してるときに知った。
すげえ便利なんだけど、共有ライブラリから呼んだ関数は 表示してくれないので、--enable-shared な ruby なんかは悲しいことになる。 拡張ライブラリも同じ。
(22:38)
この日記はこんな形式で書いてます。
= Services for UNIX 3.5 日本語版 http://www.microsoft.com/japan/windows/sfu/ SFU 3.5 日本語版リリース age
見ため RD なんですが、「==」もインラインも dl もありません。 リストのネストもありません。その代わりに、
という特徴があります (よくよく考えると BitChannel の文法とかなり似てる)。
またインデントによる pre も存在せず、 「--」で開始と終了を明示します。 なんでかって言えばパースが簡単だからです。
いまんところはメールブリッジに仕込んでるんですが、 tdiarygrep を書いてたら tDiary の内部がわかってきたので、 そのうちスタイルにしてみようかなあと思ってます。
(00:59)
こっそり改良されているようです。
一度外した RD スタイルの文法が徐々に復活してる……のかな。
(04:03)
http://www.ogis-ri.co.jp/otc/hiroba/others/OORing/interview25.html
ないわけではありません。例えば、基本的に午前中は本を書いています。 午前中は一番頭が回る良い時間なんですね。私は「黄金の時間」と呼んで います。その時間帯は一番頭を使わなくてはいけない仕事をしています。 -- なるほど。著作をされている方は時間が逆転されているという イメージがあるので、午前に著作活動をされているというのは驚きですね。 でも、良く寝て起きた朝が一番頭が働きますよ。最近はちょっと崩れて きているけど、本当にまじめに本を書いているときは午前を中心にしてますよ。
ぐは
ま、真夜中は……だめですか……
まあでも実際そうだよな。 夜更しして書いたときはロクなことになった覚えがない。
(22:35)
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 (いんてりっくす) ってかっこわるくない? 特に「てり」が。
で 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)
http://www.hatena.ne.jp/info/hatenadiarybook
自分で書いたはてなダイアリーを本にしてくれるサービス。 一冊 1600 円からってめちゃくちゃ安いな。 いったいどういう装丁なんだ。
あ、サンプル PDF があった。 ……ああ、なるほど。言っちゃ悪いが中身は値段なりだな。 もうちょっときれいに飾りつけしてくれるのかと思った。
それでも 100 ページで 1600 円からという激安料金を考えれば十分納得できる範囲かな。 個人でこういうことをやるのは難しいだろうし、おもしろいサービスだと思う。
どういう日記だと印刷したくなるだろうねえ。 やっぱりエッセイぽいのが向いてるだろうな。
(19:47)
ふぇみにん日記 2004-01-23 を読んで、家でも特定日付のページに対するリファラだけを記録することにした。
# tdiary.conf @referer_day_only = true
今までこの変数の意味を誤解してました。 日ごとのページにだけ referer を表示する設定だと思ってた。
(01:00)
12/07の日記 にツッコミがあったのでこっちでも追記。 TD4 でクロックがきっちり 1Hz にならないそうです。
http://www.bea.hi-ho.ne.jp/m-okaniwa/cpu.htm
家の TD4 もクロック・リセットだけはできているので、 ストップウォッチ片手に測ってみました。
結果は 60 秒で 58 クロック。やっぱりちょっとずれてるけど、 ツッコミの人は 53〜54 ということなんで少しはましなのかな。 ふーむ。この違いはなんだろう。
※ どうでもいいが「ツッコミの人」という表現は 「紫のバラの人」の構造に酷似しているような 気がするのは気の迷いですか。そうですか。
TD4 も早く続きをいじりたいんだけど、とりあえず今は締切だにゃ。
ああっ、わかってますってば、書きます! 書きますとも! そんな恨みがましい目をしないでえええ!
(17:50)
http://i.loveruby.net/w/BitChannelRequest.html
やはりページ凍結機能の要望が来てしまったか……。
結論から言うとページ凍結は導入しません。 理由は実装がめんど……じゃなくて、あまり意味がないと思うからです。
例えば、上記のページには凍結が欲しい例として 「SitePolicyを変更されたらやだ」 という例が挙げられていますが、SitePolicy を凍結しといても FrontPage を変更してリンクを張り換えてしまえば効果は同じです。 あるいは、SitePolicy だけ守っても他のページをことごとく消されたら やっぱり困るでしょう。
ではどうするかというと、 基本的には荒らされちゃったらあきらめるしかないのかなあと思います。 でもまあ、何も対策しないってのも悲しいので、
と、復旧機能を充実することで解決しようと思います。
ページを復旧するのは BitChannel では超簡単です。 History → ViewRev → EditThis → SAVE と 4 回クリックするだけで任意のリビジョンを復活できます。
他に、CVS で直接操作する手もあります。 これなら「何でもあり」なので、全ページを特定の日付の状態に戻すなんてのも簡単。 もちろん、バックアップがあるならレポジトリごと戻しても OK。
問題は変更を検出するほうですが、 こっちがまだ弱いんですね。 とりあえずメール送信と RDF 出力は対応します。 問題は口をどこに作るかですが、 まず他の Wiki の状況を調査してからにします。
(19:27)
一つのファイルを SFU の vi でいじりつつ Linux で cvs ci して Cygwin から cvs up すると摩訶不思議なことになるということがわかった。
(01:58)
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)
■
ささだ [1000ページあったとして,各ページに100回くらい機械的な荒らしのアタックがあったとして,更新通知メールは100000通.根本的には対策は無理なんですかね.まぁ,時間制限とかなんとか入れるとしても,いろいろ抜け道はありそう.その中から有用な変更を救おうとすると,さらに大変そう.
根本的な対策は恨みを買わないことくらいなのかなー.]
■
青木 [その回数だとWikiとか関係ないっす。
家の貧弱な環境なら回線がつぶれて終わり。
それに、そこまでやっちゃうと悪戯じゃ
すまないので、荒らすほうとしてもリスクが
高すぎるでしょう。]
■
青木 [と思ったけど、100000セーブくらいじゃだめかな。
個人運営ならその程度でも攻撃と認めてくれるだろうか。]
■ まちゅ [通知メールを送るタイミングをページの更新ではなく、一定時間ごとにすればどうでしょうか。]
■
青木 [ああいや、たぶん実際にメールが100000通来ることはなかろうと思うので
あまり本気で心配はしてません。実際に起きたらなんか考えます。]
http://www.asahi-net.or.jp/~cs8k-cyu/windows/p47.html
D 言語で書いてあるシューティングゲーム。 むずい……。
……なんでシューティングやってますか? > 俺
弾幕記述言語 BulletML というのもあるらしい。
(02:06)
ふと思いついた。
煎茶は好きだ。
玄米茶も好きだ。
ほうじ茶も好きだ。
じゃあ全部混ぜたらどうなるんだろう?
……
…………
……?
……ッ!
……。
……
ふつうかな。
(06:13)
からあげのからってなんだ。 とうのことだろうか。 そんなにむかしにゆにゅうされたのだろうか。
しらべていたらおいしそうなすれをはっけんした。
★★★マイからあげ★★★
http://food2.2ch.net/cook/kako/1007/10074/1007424431.html
とりかわー!
(19:05)
普段行かない料理板なんかにいくと新鮮で面白いな。 「圧力鍋9」とか 「いなれ!:いなり寿司スレ[2袋目]」とか 「ケチャップってマヨネーズのライバルだよな?」とか。
(19:05)
これから Ruby で新しいプログラムを書くとして、 1.6 を対象にすべきか 1.8 を対象にすべきか。
わたくしてきには断然 1.8 をお勧めしたい。
理由
しかしレンタルサーバなどでは いまだに Ruby 1.6 (1.6.7?) が主流だろう。 そういう場合はまず 1.8 を対象にして開発し、 そのあとで 1.6 向けに直していくのがよい。
理由
もっとも、文法だけはどうあがいても対応できないので 新しい文法は避けるべきである。 例えば引数付きの break や next などは使うべきではない。 多重代入とか Proc パラメータまわりも微妙に変わってるので 酷使しないほうがよい。
(19:19)
http://pcweb.mycom.co.jp/news/2004/01/27/009.html (カトゆー家断絶より)
ついにこんなものが買えるようになるんだなあ。 消費電力もめちゃくちゃ少ないらしいので期待大。
(22:10)
http://sheepman.parfait.ne.jp/20040127.html#p02
Wikiの文法が統一されていなくても僕は あんまりヘキヘキしないけど、Wikiの メニューがサイト毎に違うのにはヘキヘキ する。違っていても分かりやすければ 良いんだけど。
まったくです。 BitChannel の仕様を策定するときに いろんな Wiki をまわってリサーチしたんですが、 メニューがてんでばらばらなのにはウンザリしました。
と言って BitChannel がわかりやすいかというと、 そうでもないんですよねえ。 特に List Recent History の違いは一目ではわかりにくい。
では BitChannel の場合はどういう経緯で決定されたか。 まず以下が現在のメニュー順。
Edit Recent List History Annotate Diff Top Help
Edit が一番左で Help が一番右ってのは最初期から決まっていた。
「Edit が一番左」は KoBit 関連の議論を読んで決定。 あと、w3m ではページ見て Enter でいきなり編集できるというのも気に入った。
「Help が一番右」は一般の GUI アプリケーションのメニューの慣習から決定。
残りは以下の項目だ。
使う頻度はたぶん Recent > Diff >> History = Annotate > List = Top なので、Recent を Edit の次にした。 さらに、Recent と List は機能が似てるので隣に配置してみた。 Top は邪魔なんで右端に追いやる。 その残りを適当に並べたのが今のメニューなのね。
でも改めて考えると、 List なんて全然使わないくせに左にありすぎる。 というか、Recent に全部出てくるんだから、そもそも List はいらないんじゃないのか。そうでもないかな。 やっぱりなければないで不便か。
それじゃあ使う頻度順に素直に並べてみると……
Edit Recent Diff History Annotate List Top Help
こうか。なかなかよさげだ。 ついでに Annotate を Ann にすれば Wiki 最短メニューの座をゲットできるか?! (やらんけど)
ところで、BitChannel のメニューが英単語なのにも理由がある。
(02:29)
Tru64UNIX だと iconv の引数が "eucJP" でないとだめだった。
逆に、Linux (GNU iconv) には "eucJP" があるんだから "eucJP" を使うほうがポータブルかなあ。 Solaris も調べる必要があるな。
(21:19)
Solaris だと何やってもエラーが出るよ〜……と思ったら、 そもそもテーブルが入ってなかった。そりゃ動かないわな。 SUNWloc, SUNWjiu8, SUNWjfpu をインストール。
む、Solaris も eucJP なのか。 やっぱりこっちのがよさげだな。
@referer_day_only を指定するときれいにアンテナをはじいてくれるのだが、 アンテナが全然記録されなくなってしまうのも悲しい。 「これはアンテナ」という情報だけを記録しておけるといいかもしれない。 そこでこんなパッチをでっちあげた。
--- tdiary.rb.org Thu Jan 29 19:18:47 2004 +++ tdiary.rb Thu Jan 29 21:30:46 2004 @@ -1257,7 +1257,7 @@ module TDiary super # save referer to latest - if (!@conf.referer_day_only or (@cgi.params['date'][0] and @cgi.params['date'][0].length == 8)) and referer? + if referer? ym = latest_month @date = ym ? Time::local( ym[0], ym[1] ) : Time::now @io.transaction( @date ) do |diaries| @@ -1268,7 +1268,11 @@ module TDiary break if @diary.visible? end if @diary then - @diary.add_referer( @cgi.referer ) + referer = @cgi.referer + if @conf.referer_day_only and @cgi.params['date'][0].to_s.length != 8 + referer = 'http://antenna.example.com/antenna/' + end + @diary.add_referer( referer ) dirty = DIRTY_REFERER end dirty
こうしとくとアンテナからのアクセスが全部 antenna.example.com にまとまって記録されるわけだ。 今日の日記の「various antennas」というのがソレ。 最初はちょっとコードが間違っていたため 他のアンテナも出てしまっているが、明日以降はうまくいくはずだ。
(00:14)
追記: @referer_day_only を流用する必要はないじゃん。 専用の変数を作るほうがいいな。
■
kjana [そのための charset_alias.rb じゃないですか.多分.make の時に何かしないと
iconv.rb を作ってくれないようですが.config.charset を持ってきておいてお
けばいいのかな?]
■
Siena. [です。config.charset を本家から持って来るでもいいですし、とりあえず手軽にこんな内容で作ってテストしてみても良いかと。
#!/bin/sh
# ${newname} \s+ ${oldname}
cat <<EOD
EUCJP EUC-JP
EOD]
■
あおき [いや、実は、このテストはクックブック用にやってたので、
できるだけ追加操作はなしで通したかったんです。
例えば自分で iconv を使ったプログラムを書く場合、
それをインストールする人が config.charset をいじる
必要があるわけですよね。]
■
あおき [ちなみに手元でテストできる範囲だと
eucJP, ISO-2022-JP, UTF-8, SJIS
なら全環境で通ります。]
■
なかだ [config.charsetはLGPLなんで、入れちゃっていいものかどうかと。
あと、それからの生成物はどうなるのかとか。
あの情報を改めて自分で集める気にはならないし。]
■
青木 [それは確かに。自分の使う範囲だけ(日本語関係)
だったらどうにかなりそうですけど、全部だと…]
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ 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..]]]
■ あおき [なるほど、ユークリッドの互除法ですか。
そう考えたらなんとなくわかってきました。
ありがとうございます。]