# 066

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

>> (Ajax を使った) Hiki 用更新衝突自動検出プラグイン

できました。本当は動的 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
}
[]

«前の日記(# 059) 最新