BitChannelComment

2008-08-23 22:24:01 +0900 (4d); rev 102

BitChannel に関する意見・提案・質問などがあったらどうぞ。 ただし取り込まれるかどうかはわかりません。

また以下のページも参考にしてください。

※ 以下、新しい項目を上に書いてください

UTF-8 対応

ja_JP.UTF-8 で使おうとすると文句を言われます。 ロケールリストに UTF-8 のエントリが入っていないようです。 以下のようにした上で、(少なくとも read-only では) きちんと UTF-8 で使えることを確認しました。 (小林)

--- lib/bitchannel/locale/ja.rb.orig    Wed Sep  1 21:19:49 2004
+++ lib/bitchannel/locale/ja.rb Thu Jul 13 21:05:24 2006
@@ -103,4 +103,7 @@
   loc = Locale_ja.new('ja_JP.iso2022jp', 'iso-2022-jp')
   Locale.declare_locale 'ja_JP.iso2022jp', loc

+  loc = Locale_ja.new('ja_JP.UTF-8', 'utf-8')
+  Locale.declare_locale 'ja_JP.UTF-8', loc
+
 end

青木: ありがとうございます。すっかり遅くなりましたが、コミットしておきました。

青木: どうも書き込みでエラーが出るのでテスト。大丈夫だなあ。なんだったんだ。

カタカナ・キホウについて

片仮名をナカグロ(・)をはさんでつなげるというページ名規約のアイディアがあります。 ページ名が「ニホンゴ・ページメイ」の場合、URLは例えば "/wiki.cgi?nihonngo_pe-jimei" になります。

現在、http://vwta.kir.jp/KanaWiki/ でその有効性について実験中です。

理論上BracketNameと衝突してしまうという問題点はあるものの、 BitChannelには割とフィットしそうな気がするのですが、いかがでしょうか。--SHIMADA

コンフリクトできない

system revision 1.162 でコンフリクトが起きるようにページを編集したら下記のエラーになりました。

BitChannel Error
undefined method `unlink' for #<BitChannel::CaseSensitiveFileSystem:0x120155d28> (NoMethodError)
/.../lib/bitchannel/repository.rb:607:in `merge'
/.../lib/bitchannel/repository.rb:807:in `checkin'
/.../lib/bitchannel/repository.rb:804:in `lock'

下記の修正で期待通りに動くようです。

Index: lib/bitchannel/repository.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/repository.rb,v
retrieving revision 1.98
diff -u -u -r1.98 repository.rb
--- lib/bitchannel/repository.rb        13 Nov 2005 21:56:10 -0000      1.98
+++ lib/bitchannel/repository.rb        10 Dec 2005 05:58:57 -0000
@@ -604,7 +604,7 @@
         merged = read(name)
         rev = revision(name)
         # prevent next writer from conflict
-        @fs.unlink name; cvs_update_A name
+        @fs.rm_rf name; cvs_update_A name
         raise EditConflict.new('conflict found', merged, rev)
       end
     end

コメントボックスが機能してないようですが

BitChannelSyntax 等に記述されているコメントボックスが機能してないように見えます。

手元の環境だと 1.8.2 だとちゃんと表示されて 1.8.3 では表示されないようです。 1.8.3 の環境では lib/bitchannel/syntax.rb の

BLOCKEXT = /?A?[?[?#(?w+)(:.*?)??]?]$/

の最後の $ を削除すると表示されるようになるのですが……

「index.cgi」が省略されたときに正しく処理する

http://hogehoge.com/w/?cmd=view;name=PageA などと index.cgi を省略した URL でページを指定してアクセスすると、 そのページから他のページへのリンクの URL が http://hogehoge.com/w/w?cmd=view;name=PageB などとなってうまく辿れません。 (小林)

私も Ruby のバージョンを 1.8.3 にしてから同様の現象が発生しています。

--- lib/bitchannel/cgi.rb.orig  Fri Sep 30 16:41:15 2005
+++ lib/bitchannel/cgi.rb       Fri Sep 30 16:55:47 2005
@@ -30,7 +30,13 @@
     private

     def guess_cgi_url(req)
-      return File.basename(req.path) if req.path
+      if req.path
+        if req.path =~ %r{/$}
+          return ''
+        else
+          return File.basename(req.path)
+        end
+      end
       return req.script_name if req.script_name
       return File.basename(::Apache.request.filename) if defined?(::Apache)
       return File.basename($0) if $0

差分のないdiffもちゃんと表示する

下の「特定のリビジョンと最新版との差分が欲しい」で指定したリビジョンが 最新版だった場合にエラーが表示されてしまいました: undefined method `strip' for nil:?NilClass

Index: lib/bitchannel/repository.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/repository.rb,v
retrieving revision 1.96
diff -u -r1.96 repository.rb
--- lib/bitchannel/repository.rb        16 Mar 2005 22:23:31 -0000      1.96
+++ lib/bitchannel/repository.rb        1 Sep 2005 23:30:39 -0000
@@ -427,7 +431,7 @@

       def Diff.parse(fs, mod, chunk)
         meta = chunk.slice!(/?A.*?(?=^@@|?z)/m).to_s
-        file = meta.slice(/?A(?:Index:)??s*(?S+)/, 1).strip
+        file = (meta.slice(/?A(?:Index:)??s*(?S+)/, 1) || '').strip
         if /---/ !~ meta
           # empty new file.
           now = Time.now

特定のリビジョンと最新版との差分が欲しい

あるページの翻訳版を作ったあと、元のページの、翻訳の元になったリビジョンと現在の差分を示して、翻訳を促進したい。

下記のパッチでは、rev2を指定しないでdiffを見ようとした時にHEADとの差分を表示するようにしてあります。

Index: lib/bitchannel/handler.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/handler.rb,v
retrieving revision 1.63
diff -u -r1.63 handler.rb
--- lib/bitchannel/handler.rb   17 Mar 2005 05:48:44 -0000      1.63
+++ lib/bitchannel/handler.rb   29 Aug 2005 21:46:45 -0000
@@ -148,7 +148,7 @@
     def handle_diff(req)
       return nil unless req.page_name
       return nil unless @wiki.exist?(req.page_name)
-      return nil unless req.rev1 and req.rev2
+      return nil unless req.rev1
       @wiki.diff(req.page_name, req.rev1, req.rev2).response
     end

Index: lib/bitchannel/repository.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/repository.rb,v
retrieving revision 1.96
diff -u -r1.96 repository.rb
--- lib/bitchannel/repository.rb        16 Mar 2005 22:23:31 -0000      1.96
+++ lib/bitchannel/repository.rb        29 Aug 2005 21:46:45 -0000
@@ -387,7 +387,11 @@
     end

     def cvs_diff(rev1, rev2, name)
-      d = diff('-u', "-r1.#{rev1}", "-r1.#{rev2}", @fs.encode(name))
+                       if rev2
+                               d = diff('-u', "-r1.#{rev1}", "-r1.#{rev2}", @fs.encode(name))
+                       else
+                               d = diff('-u', "-r1.#{rev1}", @fs.encode(name))
+                       end
       d.kill if @killlist[name].overlap?(d.revision_range)
       d
     end
Index: template/diff.rhtml
===================================================================
RCS file: /src/bitchannel/template/diff.rhtml,v
retrieving revision 1.20
diff -u -r1.20 diff.rhtml
--- template/diff.rhtml 16 Mar 2005 22:24:13 -0000      1.20
+++ template/diff.rhtml 29 Aug 2005 21:46:45 -0000
@@ -11,7 +11,7 @@

 .include menu

-<h1><%= logo_url() %><%= page_name() %> : Diff rev <%= rev1() %> &lt;=&gt; rev <%= rev2() %></h1>
+<h1><%= logo_url() %><%= page_name() %> : Diff rev <%= rev1() %> &lt;=&gt; <%= rev2() ? "rev #{rev2()}" : 'HEAD' %></h1>

 <p class="revnavi">
 [<%  if rev1() > 1  %>
@@ -21,10 +21,15 @@
 [rev0 &lt;=&gt;
 <%  end
 %>
-<a href="<%= cgi_url() %>?cmd=view;rev=<%= rev1() %>;name=<%= page_url() %>">rev <%= rev1() %></a>
+<a href="<%= cgi_url() %>?cmd=view;rev=<%= rev1() %>;name=<%= page_url() %>">rev<%= rev1() %></a>
 &lt;=&gt;
-<a href="<%= cgi_url() %>?cmd=view;rev=<%= rev2() %>;name=<%= page_url() %>">rev <%= rev2() %></a>
-<a href="<%= page_view_url() %>">&gt;&gt;HEAD</a>]
+<% if rev2() %>
+<a href="<%= cgi_url() %>?cmd=view;rev=<%= rev2() %>;name=<%= page_url() %>">rev<%= rev2() %></a>
+<a href="<%= page_view_url() %>">&gt;&gt;HEAD</a>
+<% else %>
+<a href="<%= page_view_url() %>">HEAD</a>
+<% end %>
+]
 </p>

 <% log = diff() %>

conflict/mergeしてくれない

手元の環境 (cvs-1.11.6) では、二人の人が同時に編集した場合(origrevが同じ場合)に、

  1. ファイルを書く
  2. cvs update -j1.#{origrev} -jHEAD

だけでは、後からSaveした人の編集結果だけが反映されてしまっています。 みなさんのところではこのような不具合はありませんでしょうか?

手元では、下記のように、

  1. cvs update -r1.#{origrev}
  2. ファイルを書く
  3. cvs update -A

ようにすると、期待通りにconflictまたはmergeしてくれるようになりました。 (副作用としてcvs add -kbではなくcvs add -koするようになっています。)

Index: lib/bitchannel/repository.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/repository.rb,v
retrieving revision 1.93
diff -u -r1.93 repository.rb
--- lib/bitchannel/repository.rb        6 Nov 2004 21:13:28 -0000       1.93
+++ lib/bitchannel/repository.rb        7 Dec 2004 19:04:36 -0000
@@ -680,8 +680,10 @@
     public

     def merge(name, origrev, new_text)
+      cvs('admin', '-ko', encode_filename(name))
+      cvs_update_r name, origrev
       write name, new_text
-      out, err = *cvs('up', '-ko', "-j1.#{origrev}", '-jHEAD', encode_filename(name))
+      out, err = *(cvs_update_A name)
       if /conflicts during merge/ =~ err
         log "conflict: #{name}"
         merged = read(name)
@@ -694,7 +696,7 @@

     def cvs_add(name)
       assert_chdir
-      cvs 'add', '-kb', encode_filename(name)
+      cvs 'add', '-ko', encode_filename(name)
     end

     def cvs_checkin(name, log)
@@ -707,6 +709,11 @@
       cvs 'up', '-A', encode_filename(name)
     end

+    def cvs_update_r(name, rev)
+      assert_chdir
+      cvs 'up', "-r1.#{rev}", encode_filename(name)
+    end
+
     def cvs_update(name)
       assert_chdir
       cvs 'up', encode_filename(name)

右端のテーブルセルが空だと、その左のセルの内容が消える

右端のセルが空の場合その左、以下の例では b が、HTMLになると消えます。

||| left  ||| center  ||| right
|| a      || b        ||
leftcenterright
ab
Index: syntax.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/syntax.rb,v
retrieving revision 1.5
diff -u -r1.5 syntax.rb
--- syntax.rb   6 Nov 2004 21:15:43 -0000       1.5
+++ syntax.rb   21 Nov 2004 19:12:49 -0000
@@ -302,7 +302,6 @@
       rows.each do |cols|
         while cols.last and cols.last[0].strip.empty?
           cols.pop
-          cols.pop
         end
       end
       n_maxcols = rows.map {|cols| cols.size }.max

青木: ありがとうございます。とりこみました。

httpsにもリンクしてほしい

Index: lib/bitchannel/syntax.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/syntax.rb,v
retrieving revision 1.4
diff -u -r1.4 syntax.rb
--- lib/bitchannel/syntax.rb    1 Sep 2004 15:58:56 -0000       1.4
+++ lib/bitchannel/syntax.rb    6 Nov 2004 02:55:02 -0000
@@ -414,7 +414,7 @@

     WikiName = /?b(?:[A-Z][a-z0-9]+){2,}?b/n
     BracketLink = /?[?[[!-~]+??]?]/n
-    SeemsURL = URI.regexp(%w(http ftp))
+    SeemsURL = URI.regexp(%w(http https ftp))
     NeedESC = /[&"<>]/

     def text(str)

青木: ありがとうございます。とりこみました。

WEBrick 環境でテーマ(スタイルシート)が反映されない

Cygwin + standalone.rb で BitChannel を動かしているのですが、 スタイルシートが反映されません。 下記のパッチでスタイルシートが読めるようになりますが、 第3引数があまりスマートではないですね…。

--- bitchannel/standalone.rb    2004-04-28 18:17:35.000000000 +0900
+++ bitchannel/standalone.rb     2004-10-15 11:27:59.732750400 +0900
@@ -19,5 +19,6 @@
   :CGIPathEnv   => ENV["PATH"]
 )
 server.mount '/', BitChannel::WebrickServlet, *bitchannel_context()
+server.mount '/theme/', WEBrick::HTTPServlet::FileHandler, '/var/bitchannel/theme/'
 trap(:INT){ server.shutdown }
 server.start

青木: これは各自やってもらうしかないのではないかと思います。 もともと standalone.rb は stderr に出力が出たりして そのまま使えるようにはできていませんし。 (なにより現在の実装だとスレッドセーフになっていないので WEBrick servlet として使うにはかなり問題があります)

ま、しかし、もうちょっと簡単でもよさそうですね。

cvs 1.12.9 で History がエラーになる

cvs 1.12.9 では cvs log の際に date: を "2004-06-11 10:39:56 +0000" のような形式で出力するため Time.rcslogdate に失敗します。 https://ccvs.cvshome.org/source/browse/ccvs/src/log.c?r1=1.95&r2=1.96

Index: lib/bitchannel/repository.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/repository.rb,v
retrieving revision 1.92
diff -u -u -r1.92 repository.rb
--- lib/bitchannel/repository.rb        8 Oct 2004 15:41:05 -0000       1.92
+++ lib/bitchannel/repository.rb        11 Oct 2004 22:02:25 -0000
@@ -30,9 +30,9 @@
   Time.utc(m[3], m[2], m[1], m[4], m[5], m[6])
 end

-# "2004/06/11 10:39:56" (UTC)
+# "2004/06/11 10:39:56" or "2004-06-11 10:39:56 +0000" (UTC)
 def Time.rcslogdate(t)
-  m = %r<(?d{4})/(?d{2})/(?d{2}) (?d{2}):(?d{2}):(?d{2})>.match(t)
+  m = %r<(?d{4})[/-](?d{2})[/-](?d{2}) (?d{2}):(?d{2}):(?d{2})>.match(t)
   raise ArgumentError, "not RCS log date: #{t.inspect}" unless m
   Time.utc(*m.captures)
 end

青木: ありがとうございます。たぶん対応しました。

farm の一部として index.cgiを動かす

通常 index.cgi(bitchannelrc) で動作させる場合、pages/ 以下を手動インポートするが、 ファームの機能を使って cvs init 以外をおまかせする。 また、二系統のフローを一つにまとめたい。

あまり書換えないようにしましたが、提案として張り付けます。(長くてすみません)

(パッチだけ消しました)

青木: 動機としては、初期化を簡単にしたいってことですよね? それであれば misc にツールを作るのがいいんではないでしょうか。 シングルノードの Wiki と Farm ではオブジェクト単位で かなりきっちりとコードが分かれているので、 共通化する価値はあまりないと思います。

機能としては非常に便利になってよいと思います。 BitChannelToDo 行き。

(追記: misc/init.rb として実装してみました)

misc/refresh-linkcache.rb が動作しない

initialize_environment() が obsolete のため動作しません。

現在、ひとつの CVS リポジトリに対して 2 箇所で bitchannel を動かして同期を取ろうと しているのですが、refresh-linkcache が動いてほしいです(相手の更新に追随できる?)

青木: refresh-linkcache.rb を直すのはそれはそれで必要なんですが、 同期を取る場合は refresh-linkcache.rb ではまずいです。 あれは全ページを一気に処理するので無駄が多すぎますし、 たしかちゃんとロックしてなかったと思いました。 特定ページだけをロックしてアップデートする手段を提供しないとだめですね。 今週は余裕がないので、来週のどこかで対応したいと思います。

(追記) refresh-linkcache.rb のバグは CVS HEAD で直しました。

conflict でエラー

diff -u -r1.89 repository.rb
--- lib/bitchannel/repository.rb        2 Sep 2004 05:57:01 -0000       1.89
+++ lib/bitchannel/repository.rb        29 Sep 2004 07:51:21 -0000
@@ -657,7 +657,7 @@
         log "conflict: #{name}"
         merged = read(name)
         rev = revision(name)
-        File.unlink encode_filename(filename)   # prevent next writer from conflict
+        File.unlink encode_filename(name)   # prevent next writer from conflict
         cvs_update_A name
         raise EditConflict.new('conflict found', merged, rev)
       end

青木: ありがとうございます。コミットしました。

ページ名とページタイトルの分離

もともと文法に「"="一つで始まるものはタイトル」というものを付け加えるためだけにやっていたのですが、 [diary:20040822.html]的な使い方も出来そうだったので書いてみました。

パッチサイズが10KB程度あるのでここに貼り付けるのは差し控えますが、興味ありますでしょうか?

青木: すごくあります。直メールででも投げてもらえると嬉しいです。

(追記) メールでパッチをいただきました。 基本的にそのままとりこもうと思います。

置き場所が出来たのでパッチを公開しました<http://www.callcc.net/archive/bitchannel-ja-20050212.patch>。 お送りしたものには若干不備があったので、こちらをベースにしたほうがよいかもしれません。

Last Modified

CGIにおいて、HTTPRequestにIf-Modified-Sinceがつくとheader出力中にタイムアウトする。(Apache/2.0.48)

Response#update_forでHTTPResponseにLast-Modifiedを付加するからのようです。

webrick初心者zundaがいぢってみました。タブとスペースが混ざってますが…。

Index: lib/bitchannel/cgi.rb
===================================================================
RCS file: /src/bitchannel/lib/bitchannel/cgi.rb,v
retrieving revision 1.6
diff -u -r1.6 cgi.rb
--- lib/bitchannel/cgi.rb       23 Jun 2004 15:28:41 -0000      1.6
+++ lib/bitchannel/cgi.rb       6 Nov 2004 03:57:01 -0000
@@ -21,6 +21,9 @@
       wiki, = *@options
       wiki.session(guess_cgi_url(req)) {
         bcres = Handler.new(wiki).handle(Request.new(req, wiki.locale, false))
+                               if ( ims = req['if-modified-since']) && Time.parse( ims ) >= Time.parse( bcres.last_modified )
+                                       raise WEBrick::HTTPStatus::NotModified
+                               end
         bcres.update_for res
       }
     end

青木: 報告 & パッチありがとうございます。 zunda さんのパッチを参考にしつつ別の個所で対応しました。

日本語BracketName@kakasi

あとある程度でいいのでスペースと記号を含む場合もどうにかしたいけどそれはおいといて。

つっこみに書きすぎたので(すみません)こっちに書きますが。

あんまり考えないでソースをいじってみました。 案山子実装自体は4行(3行?)で済むので("kakasi -oeuc -C -Ha -Ka -Ja -Ea -ka"するだけなんで)実装についてはどうでもいいんですが。

いいとこ
だめなとこ

えーととりとめなくて申し訳ないです。resolv_interwikiと同じようなことも試してみます。

既にtikiで「も」考察されまくってるなあ。あおきさんも当然のように考察済みだし。http://todo.org/cgi-bin/tiki/tiki.cgi?c=v&p=%C6%FC%CB%DC%B8%ECWikiName%A4%CB%B4%D8%A4%B9%A4%EB%B9%CD%BB%A1 いつの間にかリンクされてるのが欲しいなら、とりあえずいろんな方式をぶち込んでおけば良いような気がする、のでいろいろ突っ込んでみるわけだが。

青木: そんなに簡単にできましたか。ちょっと意外。

やはり kakasi は拡張ライブラリが必要なのが一番ネックですかねえ。 他の問題は工夫すればなんとかできそうな感じです。 あと、結局 BracketName が必要なところが惜しいですね。

さらに考察してみます。

(追記)

漢字を常に同じ読みにマップする方法なら kakasi を使わず pure Ruby でいけそうな気がしてきました。

(通りすがりの臆病者)

思いつきですが、日本語のままひっかけるなら、読み仮名つき とかいいかもしれません。

先行者(センコウシャ)

書き手が意識する必要があるのは同じです。でなければ、はてな方式しかないですし。

 「ページの新規作成」機能の実装をしないのはなぜですか?


system revision 1.162