>> 忙しすぎて頭にブースターケーブルを繋がれたような感じがします。えーと、書くべきことと言えば、とくとくとミームの話を他人に話していたら電波あつかいされてショックを受けたことぐらいです。なんとひどい。それから、この前は(昨日か一昨日か)に塩を摂る話を書きましたが、あれは嘘で、本当はトウガラシばかり食べていました。この前も(昨日か一昨日か)、しょうこりもなく豆のトマト煮を作っていたら、気がつくとチリコンカンになっていました。味付けは震えるほど辛く。そんなところでしょうか。
できました。本当は動的 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 }