Hatena::ブログ(Diary)

SPEAKER BREAKA このページをアンテナに追加 RSSフィード

2009-08-09

GAE ログ画面の日時を JST にする Greasemonkey スクリプト

タイトル通りですが、初めての Greasemonkey ユーザースクリプト作ってみました。


最近の Web 開発だと、ASP.NET で楽してたり携帯 Web 開発ばっかりだったもので、JavaScript なんて遥か遠い記憶しかありません。フォーマット出力どうやるの?とか parseInt("08") でなんで 0 が返ってくるの?なんていうダサい四苦八苦をしながら書いたので、お洒落な JavaScripter になれるように是非とも突っ込み下さいませ。


Google App Engine のログ画面(Logs)の日時表示が UTC-7 で(これってどこかで設定とか変更とかできたりするもんなんでしょうか?)、すげー不便だなーと思ってたので、JST に表示変換するだけのものです。本当は他の管理画面(Admin Logs とか Cron Jobs とか)でも変換できるようにしたかったんですが、とりあえず。


// ==UserScript==
// @name           GAE Logs Datetime JST
// @namespace      http://tiwtter.com/ae35
// @description    GoogleAppEngine の Logs を UTC-7 から JST に変換
// @include        https://appengine.google.com/logs?*
// @version        0.1.1
// ==/UserScript==
(function(){

    function main(){
        var allLogs = document.evaluate(
        	'//li[@class="ae-log"]//h5/span',
        	document,
        	null,
        	XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        	null);
        for (var i = 0; i < allLogs.snapshotLength; i++) {conv(allLogs.snapshotItem(i));}
    }

    function conv(o){
        // 08-05 10:37PM 38.425
        var m = o.innerHTML.match(/(\d{2})-(\d{2}) (\d{2}):(\d{2})(\w{2}) (\d{2})\.(\d+)/);
        if (m == null) return;

        var _month, _day, _hour, _minute, _ampm, _sec, _msec;
        _month 	= RegExp.$1;
        _day 	= RegExp.$2;
        _hour 	= RegExp.$3;
        _minute = RegExp.$4;
        _ampm 	= RegExp.$5;
        _sec 	= RegExp.$6;
        _msec 	= RegExp.$7;
        if (_ampm == 'PM') _hour = parseInt(_hour, 10) + 12;

		var s = "";
		s += new Date().getFullYear();
		s += "/";
		s += _month;
		s += "/";
		s += _day;
		s += " ";
		s += _hour;
		s += ":";
		s += _minute;
		s += ":";
		s += _sec;
		var d = new Date(s);
		// UTC-7 -> UTC+9
		d.setTime(d.getTime() + 16 * 60 * 60 * 1000);

        o.innerHTML = fmtdate(
			d.getFullYear(), d.getMonth(), d.getDate(),
			d.getHours(), d.getMinutes(), d.getSeconds(),
			_msec);
    }

    function fmtdate(year, month, day, hour, minute, sec, msec){
        var s = "";
        s += zeropadding(month + 1);
        s += "-";
        s += zeropadding(day);
        s += " ";
        s += zeropadding(from24to12(hour));
        s += ":";
        s += zeropadding(minute);
        s += ampm(hour);
        s += " ";
        s += zeropadding(sec);
        s += ".";
        s += msec;
        return s;
    }

    function zeropadding(val){
        return (parseInt(val, 10) < 10) ? "0" + val: val;

    }
    function from24to12(hour){
        return (hour > 12) ? (hour - 12) : hour;
    }

    function ampm(hour){
        return (hour < 12) ? "AM": "PM";
    }

    document.body.addEventListener("DOMNodeInserted",
    function(event) {
        var elems = event.target.getElementsByTagName('span');
        for (var i = 0; i < elems.length; i++) {conv(elems[i]);}
    }, false);

    main();

})();

ダウンロードはこちら

http://bitbucket.org/ae35/gaelogsdatetimejst/downloads/GAELogsDatetimeJST.user.js