最新はzt日記になりました。
結構参照されているようなので、2001-09-23追記として全ファイルのパーミッションをまとめ直してみました。
状態をあらわすのにこんなのを思いついた。st.foo!
とかst.bar!
で状態変更でst.foo?
や:foo === st
で状態のチェックができる。===
を定義しているので、case ... when
で使うのが便利。
class State
def initialize(*arg)
@states = arg.collect{|s|
case s
when Symbol
s
when String
s.intern
else
raise ArgumentError, "#{s} is not a symbol or a string"
end
}
@states.each do |i|
eval %Q{
def #{i}!
@state = :#{i}
self
end
def #{i}?
@state == :#{i}
end
}
end
__send__ "#{@states[0]}!"
end
attr_reader :states, :state
def ===(state)
@state == state or @state == state.intern
end
def ==(o)
@states == o.states and @state == o.state
end
def to_s
@state.to_s
end
def _dump(lv)
"#{@state} " << @states.join(' ')
end
def State._load(s)
state, *states = s.split
State.new(*states).__send__ "#{state}!"
end
end
if __FILE__ == $0
st = State.new(:a,:b,:c)
st.b!
st.c? #=> false
case st
when :a
# a
when :b
# b
when :c
# c
end
end
コマンドを省略可能にするのにこんな感じで逆にマッチするようにすれば(?:...)?
の入れ子でややこしくならなくて済みそうだけど、引数までまとめてチェックするのは無理という弱点が。これを使うのならあらかじめsplitしてからになりそう。
module OmitableMatch
def ===(o)
/^#{Regexp.quote o.to_s[0, self.size]}/.match self
end
module IgnoreCase
def ===(o)
/^#{Regexp.quote o.to_s[0, self.size]}/i.match self
end
end
end
# 使用例
hoge = 'hoge'
hoge.extend OmitableMatch
hoge === 'hoe' #=> nil
hoge === 'hog' #=> MatchData
hoge.extend OmitableMatch::IgnoreCase
hoge === 'Hoge' #=> MatchData
>に関してはXML 1.0 日本語版の2.4 キャラクタデータ・マークアップによると「大なり不等号 (>) は,"
」と書かれていて(原文では「>
" という文字列を使って表わされてもよくTheright angle bracket (>) may be represented using the string "
」)となっているので「>」のままでも構わないと思います。>
"互換性のため (for compatibility)
というのはSGMLとの互換性なので、HTMLやXHTMLではこだわる必要はないと思います。
orphanは簡単にできたけどorphanのページからリンクを開くと、リンクされてなかったから読み込まれてなかったファイルが読み込まれてしまう。
許可が出たので幹にcommit。ということは次にRWikiがリリースされるときには入るはず。
をゐなり日誌のように脚注をtitleでつけてみるのはどうだろうと思って、某所のRWikiにapply_to_Footnote
に%Q[<a name="footnote:#{num}" href="#foottext:#{num}" title="#{CGI.escapeHTML content.to_s.gsub(/<[^>]+>/, '')}"><sup><small>] +
という感じでtitle属性をつけてみた。タグは問答無用で消すのでいいのかどうかが悩ましい。
コメントや閉じタグは思いっきり忘れてました…。コメントタグってIE独自拡張の<comment>のことですか?っていうわかりにくいぼけはおいといて、<!-- これ -->
は注釈宣言っていうのが正式名称のようです。とりあえずタグじゃないというのは覚えておいた方がいいいと思います。
Refererチェックメールって本日のリンク元が0から1になるときだけということにすれば専用のステートは持たなくていいと思ったんですが、書き忘れてたかも。
閲覧者に警告が見えるのって適切なclassがついててユーザスタイルシートで隠蔽できればなんとか。HNSのも自分で隠す設定にしておけばいいのか。調べておこう。
RWikiのRDをそのままCVSで管理しようとすると、CVSというページがあるとまずいというのは.rdをつけてからCVSにいれることで回避していたが、CVSのキーワード($Date$など)があるとまずいかもしれないというのを気にせず放置していたら、CGIで見事に罠にはまってしまったので、cvs admin -ko *.rd; cvs upした後、$Date$を消しておいた。
普段はブラウザがエラー処理としてやってくれることをCGIの方で代わりにやっておいて少しでもvalidなHTMLにしようというつもりなので、最後の出力の直前でいいと思います。
HNSのように閲覧者に警告が見えるシステムはなんか間違ってる気がするので、警告するなら更新の時に。
機能があっても気づかなければ意味がない対策としてリンク元置換リストにないURLからのリンクがあったときはツッコミと同じようにメールで通知するというのを思い付きました。
Vine専用ではないけど置く場所に悩んだのでvineディレクトリにrpmVersionCompare.pyとrpmLabelCompare.pyをおいてみた。
rpm-pythonが必要。
rpmVersionCompare.pyは*.rpmかrpmdb(インストールされているrpmの情報のデータベース)から情報を取り出してバージョンの比較をするスクリプト。引数の末尾が.rpmならファイルとみなしてそこから情報をとりだし、そうでなければrpmdbから。rpmdbに複数あった場合は見つかったものを全部出力して一番最初のと最後のを比較します。
% rpmVersionCompare.py kernelcfg kernelcfg_0.6-9vl1_i386.rpm
kernelcfg 0.6 9vl1 == kernelcfg 0.6 9vl1 # 0 0
% rpmVersionCompare.py libruby_1.6.4-0vl2_i386.rpm libruby_1.6.4-0vl8_i386.rpm
libruby 1.6.4 0vl2 << libruby 1.6.4 0vl8 # -6 6
rpmLabelCompare.pyはあらかじめname version releaseに分割しておいてから引数に渡すとrpm.labelCompare
を呼び出して比較した結果を標準出力にprintするだけというかなり不便な手抜きスクリプト。rpmVersionCompare.pyでrpmdbから複数見つかったときの比較には使えるかも。
% rpmLabelCompare.py man 1.5i 10vl1.2 man 1.5i 10vl1
1