>> 忙しすぎて頭にブースターケーブルを繋がれたような感じがします。えーと、書くべきことと言えば、とくとくとミームの話を他人に話していたら電波あつかいされてショックを受けたことぐらいです。なんとひどい。それから、この前は(昨日か一昨日か)に塩を摂る話を書きましたが、あれは嘘で、本当はトウガラシばかり食べていました。この前も(昨日か一昨日か)、しょうこりもなく豆のトマト煮を作っていたら、気がつくとチリコンカンになっていました。味付けは震えるほど辛く。そんなところでしょうか。
できました。本当は動的 HTML で文字を点滅させるとかしたほうがいいのでしょうが、もう死ぬほど面倒なので alert で逃げます。前時代的ですみません。
# conflict-sniffer.rb
module ::Hiki
class Command
private
def cmd_lm
page = @cgi.params['p'][0]
lm = @db.get_last_update(page)
print "Content-Type: text/plain\r\n\r\n"
print lm.to_i
end
end
end
add_edit_proc {
<<"EOS"
<script language="JavaScript">
<!--
function getXMLHTTPObj() {
var xmlhttp;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
xmlhttp = false;
}
}
@end @*/
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
function check(xmlhttp, loadtime) {
xmlhttp.open("GET", "#{@conf.cgi_name}#{cmdstr('lm', 'p=')}" +
encodeURI("#{@page}"), true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var lastmodified = xmlhttp.responseText;
if (parseInt(lastmodified) > loadtime)
alert("Hey, someone seems to change your editing page.\\n" +
"You'd better save the texts and try again.");
}
};
xmlhttp.send(null);
}
var xmlhttp = getXMLHTTPObj();
var loadtime = new Date().getTime() / 1000;
setInterval("check(xmlhttp, loadtime)",
#{@conf['csniffer.interval'] || 30} * 1000);
//-->
</script>
EOS
}
def saveconf_csniffer
if @mode == 'saveconf' then
@conf['csniffer.interval'] = @cgi.params['csniffer.interval'][0].to_i
end
end
add_conf_proc('csniffer', 'conflict sniffer') {
saveconf_csniffer
<<-HTML
<h3 class="subtitle">auto conflict sniffer</h3>
<p>set inteval time (second): <input name="csniffer.interval" size="2" value="#{@conf['csniffer.interval']}"></p>
HTML
}