「xml」を含む日記 RSS

はてなキーワード: xmlとは

2007-07-19

/* Ten */
if (typeof(Ten) == 'undefined') {
    Ten = {};
}
Ten.NAME = 'Ten';
Ten.VERSION = 0.06;

/* Ten.Class */
Ten.Class = function(klass, prototype) {
    if (klass && klass.initialize) {
	var c = klass.initialize;
    } else if(klass && klass.base) {
        var c = function() { return klass.base[0].apply(this, arguments) };
    } else {
	var c = function() {};
    }
    c.prototype = prototype || {};
    c.prototype.constructor = c;
    Ten.Class.inherit(c, klass);
    if (klass && klass.base) {
        for (var i = 0;  i < klass.base.length; i++) {
	    var parent = klass.base[i];
            if (i == 0) {
                c.SUPER = parent;
                c.prototype.SUPER = parent.prototype;
            }
            Ten.Class.inherit(c, parent);
            Ten.Class.inherit(c.prototype, parent.prototype);
        }
    }
    return c;
}
Ten.Class.inherit = function(child,parent) {
    for (var prop in parent) {
        if (typeof(child[prop]) != 'undefined' || prop == 'initialize') continue;
        child[prop] = parent[prop];
    }
}

/*
// Basic Ten Classes
**/

/* Ten.JSONP */
Ten.JSONP = new Ten.Class({
    initialize: function(uri,obj,method) {
        if (Ten.JSONP.Callbacks.length) {
            setTimeout(function() {new Ten.JSONP(uri,obj,method)}, 500);
            return;
        }
        var del = uri.match(/\?/) ? '&' : '?';
        uri += del + 'callback=Ten.JSONP.callback';
        if (!uri.match(/timestamp=/)) {
            uri += '&' + encodeURI(new Date());
        }
        if (obj && method) Ten.JSONP.addCallback(obj,method);
        this.script = document.createElement('script');
        this.script.src = uri;
        this.script.type = 'text/javascript';
        document.getElementsByTagName('head')[0].appendChild(this.script);
    },
    addCallback: function(obj,method) {
        Ten.JSONP.Callbacks.push({object: obj, method: method});
    },
    callback: function(args) {
        // alert('callback called');
        var cbs = Ten.JSONP.Callbacks;
        for (var i = 0; i < cbs.length; i++) {
            var cb = cbs[i];
            cb.object[cb.method].call(cb.object, args);
        }
        Ten.JSONP.Callbacks = [];
    },
    MaxBytes: 8000,
    Callbacks: []
});

/* Ten.XHR */
Ten.XHR = new Ten.Class({
    initialize: function(uri,opts,obj,method) {
        if (!uri) return;
        this.request = Ten.XHR.getXMLHttpRequest();
        this.callback = {object: obj, method: method};
        var xhr = this;
        var prc = this.processReqChange;
        this.request.onreadystatechange = function() {
            prc.apply(xhr, arguments);
        }
        var method = opts.method || 'GET';
        this.request.open(method, uri, true);
        if (method == 'POST') {
            this.request.setRequestHeader('Content-Type',
                                          'application/x-www-form-urlencoded');
        }
        var data = opts.data ? Ten.XHR.makePostData(opts.data) : null;
        this.request.send(data);
    },
    getXMLHttpRequest: function() {
        var xhr;
        var tryThese = [
            function () { return new XMLHttpRequest(); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
            function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
        ];
        for (var i = 0; i < tryThese.length; i++) {
            var func = tryThese[i];
            try {
                xhr = func;
                return func();
            } catch (e) {
                //alert(e);
            }
        }
        return xhr;
    },
    makePostData: function(data) {
        var pairs = [];
        var regexp = /%20/g;
        for (var k in data) {
            var v = data[k].toString();
            var pair = encodeURIComponent(k).replace(regexp,'+') + '=' +
                encodeURIComponent(v).replace(regexp,'+');
            pairs.push(pair);
        }
        return pairs.join('&');
    }
},{
    processReqChange: function() {
        var req = this.request;
        if (req.readyState == 4) {
            if (req.status == 200) {
                var cb = this.callback;
                cb.object[cb.method].call(cb.object, req);
            } else {
                alert("There was a problem retrieving the XML data:\n" +
                      req.statusText);
            }
        }
    }
});

/* Ten.Observer */
Ten.Observer = new Ten.Class({
    initialize: function(element,event,obj,method) {
        var func = obj;
        if (typeof(method) == 'string') {
            func = obj[method];
        }
        this.element = element;
        this.event = event;
        this.listener = function(event) {
            return func.call(obj, new Ten.Event(event || window.event));
        }
        if (this.element.addEventListener) {
            if (this.event.match(/^on(.+)$/)) {
                this.event = RegExp.$1;
            }
            this.element.addEventListener(this.event, this.listener, false);
        } else if (this.element.attachEvent) {
            this.element.attachEvent(this.event, this.listener);
        }
    }
},{
    stop: function() {
        if (this.element.removeEventListener) {
            this.element.removeEventListener(this.event,this.listener,false);
        } else if (this.element.detachEvent) {
            this.element.detachEvent(this.event,this.listener);
        }
    }
});

/* Ten.Event */
Ten.Event = new Ten.Class({
    initialize: function(event) {
        this.event = event;
    },
    keyMap: {
        8:"backspace", 9:"tab", 13:"enter", 19:"pause", 27:"escape", 32:"space",
        33:"pageup", 34:"pagedown", 35:"end", 36:"home", 37:"left", 38:"up",
        39:"right", 40:"down", 44:"printscreen", 45:"insert", 46:"delete",
        112:"f1", 113:"f2", 114:"f3", 115:"f4", 116:"f5", 117:"f6", 118:"f7",
        119:"f8", 120:"f9", 121:"f10", 122:"f11", 123:"f12",
        144:"numlock", 145:"scrolllock"
    }
},{
    mousePosition: function() {
        if (!this.event.clientX) return;
        return Ten.Geometry.getMousePosition(this.event);
    },
    isKey: function(name) {
        var ecode = this.event.keyCode;
        if (!ecode) return;
        var ename = Ten.Event.keyMap[ecode];
        if (!ename) return;
        return (ename == name);
    },
    targetIsFormElements: function() {
        var target = this.event.target;
        if (!target) return;
        var T = (target.tagName || '').toUpperCase();
        return (T == 'INPUT' || T == 'SELECT' || T == 'OPTION' ||
                T == 'BUTTON' || T == 'TEXTAREA');
    },
    stop: function() {
        var e = this.event;
        if (e.stopPropagation) {
            e.stopPropagation();
            e.preventDefault();
        } else {
            e.cancelBubble = true;
            e.returnValue = false;
        }
    }
});

/* Ten.DOM */
Ten.DOM = new Ten.Class({
    getElementsByTagAndClassName: function(tagName, className, parent) {
        if (typeof(parent) == 'undefined') {
            parent = document;
        }
        var children = parent.getElementsByTagName(tagName);
        if (className) { 
            var elements = [];
            for (var i = 0; i < children.length; i++) {
                var child = children[i];
                var cls = child.className;
                if (!cls) {
                    continue;
                }
                var classNames = cls.split(' ');
                for (var j = 0; j < classNames.length; j++) {
                    if (classNames[j] == className) {
                        elements.push(child);
                        break;
                    }
                }
            }
            return elements;
        } else {
            return children;
        }
    },
    removeEmptyTextNodes: function(element) {
        var nodes = element.childNodes;
        for (var i = 0; i < nodes.length; i++) {
            var node = nodes[i];
            if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
                node.parentNode.removeChild(node);
            }
        }
    },
    nextElement: function(elem) {
        do {
            elem = elem.nextSibling;
        } while (elem && elem.nodeType != 1);
        return elem;
    },
    prevElement: function(elem) {
        do {
            elem = elem.previousSibling;
        } while (elem && elem.nodeType != 1);
        return elem;
    },
    scrapeText: function(node) {
        var rval = [];
        (function (node) {
            var cn = node.childNodes;
            if (cn) {
                for (var i = 0; i < cn.length; i++) {
                    arguments.callee.call(this, cn[i]);
                }
            }
            var nodeValue = node.nodeValue;
            if (typeof(nodeValue) == 'string') {
                rval.push(nodeValue);
            }
        })(node);
        return rval.join('');
    },
    onLoadFunctions: [],
    loaded: false,
    timer: null,
    addEventListener: function(event,func) {
        if (event != 'load') return;
        Ten.DOM.onLoadFunctions.push(func);
        Ten.DOM.checkLoaded();
    },
    checkLoaded: function() {
        var c = Ten.DOM;
        if (c.loaded) return true;
        if (document && document.getElementsByTagName &&
            document.getElementById && document.body) {
            if (c.timer) {
                clearInterval(c.timer);
                c.timer = null;
            }
            for (var i = 0; i < c.onLoadFunctions.length; i++) {
                    c.onLoadFunctions[i]();
            }
            c.onLoadFunctions = [];
            c.loaded = true;
        } else {
            c.timer = setInterval(c.checkLoaded, 13);
        }
    }
});

/* Ten.Style */
Ten.Style = new Ten.Class({
    applyStyle: function(elem, style) {
        for (prop in style) {
            elem.style[prop] = style[prop];
        }
    }
});

/* Ten.Geometry */
Ten.Geometry = new Ten.Class({
    initialize: function() {
        if (Ten.Geometry._initialized) return;
        var func = Ten.Geometry._functions;
        var de = document.documentElement;
        if (window.innerWidth) {
            func.getWindowWidth = function() { return window.innerWidth; }
            func.getWindowHeight = function() { return window.innerHeight; }
            func.getXScroll = function() { return window.pageXOffset; }
            func.getYScroll = function() { return window.pageYOffset; }
        } else if (de && de.clientWidth) {
            func.getWindowWidth = function() { return de.clientWidth; }
            func.getWindowHeight = function() { return de.clientHeight; }
            func.getXScroll = function() { return de.scrollLeft; }
            func.getYScroll = function() { return de.scrollTop; }
        } else if (document.body.clientWidth) {
            func.getWindowWidth = function() { return document.body.clientWidth; }
            func.getWindowHeight = function() { return document.body.clientHeight; }
            func.getXScroll = function() { return document.body.scrollLeft; }
            func.getYScroll = function() { return document.body.scrollTop; }
        }
        Ten.Geometry._initialized = true;
    },
    _initialized: false,
    _functions: {},
    getScroll: function() {
        if (!Ten.Geometry._initialized) new Ten.Geometry;
        return {
            x: Ten.Geometry._functions.getXScroll(),
            y: Ten.Geometry._functions.getYScroll()
        };
    },
    getMousePosition: function(pos) {
        // pos should have clientX, clientY same as mouse event
        if ((navigator.userAgent.indexOf('Safari') > -1) &&
            (navigator.userAgent.indexOf('Version/') < 0)) {
            return {
                x: pos.clientX,
                y: pos.clientY
            };
        } else {
            var scroll = Ten.Geometry.getScroll();
            return {
                x: pos.clientX + scroll.x,
                y: pos.clientY + scroll.y
            };
        }
    },
    getElementPosition: function(e) {
        return {
            x: e.offsetLeft,
            y: e.offsetTop
        };
    },
    getWindowSize: function() {
        if (!Ten.Geometry._initialized) new Ten.Geometry;
        return {
            w: Ten.Geometry._functions.getWindowWidth(),
            h: Ten.Geometry._functions.getWindowHeight()
        };
    }
});

/* Ten.Position */
Ten.Position = new Ten.Class({
    initialize: function(x,y) {
        this.x = x;
        this.y = y;
    },
    subtract: function(a,b) {
        return new Ten.Position(a.x - b.x, a.y - b.y);
    }
});

/*
// require Ten.js
**/

/* Ten.SubWindow */
Ten.SubWindow = new Ten.Class({
    initialize: function() {
        var c = this.constructor;
        if (c.singleton && c._cache) {
            return c._cache;
        }
        var div = document.createElement('div');
        Ten.Style.applyStyle(div, Ten.SubWindow._baseStyle);
        Ten.Style.applyStyle(div, c.style);
        this.window = div;
        this.addContainerAndCloseButton();
        document.body.appendChild(div);
        if (c.draggable) {
            this._draggable = new Ten.Draggable(div, this.handle);
        }
        if (c.singleton) c._cache = this;
        return this;
    },
    _baseStyle: {
        color: '#000',
        position: 'absolute',
        display: 'none',
        zIndex: 2,
        left: 0,
        top: 0,
        backgroundColor: '#fff',
        border: '1px solid #bbb'
    },
    style: {
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px',
        width: '100px',
        height: '100px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px'
    },
    containerStyle: {
        margin: '32px 0 0 0',
        padding: '0 10px'
    },
    // closeButton: 'close.gif',
    closeButton: 'http://s.hatena.com/images/close.gif',
    closeButtonStyle: {
        position: 'absolute',
        top: '8px',
        right: '10px',
        cursor: 'pointer'
    },
    _baseScreenStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        display: 'none',
        zIndex: 1,
        overflow: 'hidden',
        width: '100%',
        height: '100%'
    },
    screenStyle: {},
    showScreen: true,
    singleton: true,
    draggable: true,
    _cache: null
},{
    screen: null,
    windowObserver: null,
    visible: false,
    addContainerAndCloseButton: function() {
        var win = this.window;
        var c = this.constructor;
        var div = document.createElement('div');
        win.appendChild(div);
        Ten.Style.applyStyle(div, c.containerStyle);
        this.container = div;
        if (c.handleStyle) {
            var handle = document.createElement('div');
            Ten.Style.applyStyle(handle, c.handleStyle);
            win.appendChild(handle);
            this.handle = handle;
        }
        if (c.closeButton) {
	    var btn = document.createElement('img');
            btn.src = c.closeButton;
            btn.alt = 'close';
            Ten.Style.applyStyle(btn, c.closeButtonStyle);
            win.appendChild(btn);
            new Ten.Observer(btn, 'onclick', this, 'hide');
            this.closeButton = btn;
        }
        if (c.showScreen) {
            var screen = document.createElement('div');
            Ten.Style.applyStyle(screen, Ten.SubWindow._baseScreenStyle);
            Ten.Style.applyStyle(screen, c.screenStyle);
            document.body.appendChild(screen);
            this.screen = screen;
            new Ten.Observer(screen, 'onclick', this, 'hide');
        }
    },
    show: function(pos) {
        pos = (pos.x && pos.y) ? pos : {x:0, y:0};
        with (this.window.style) {
            display = 'block';
            left = pos.x + 'px';
            top = pos.y + 'px';
        }
        if (this.screen) {
            with (this.screen.style) {
                display = 'block';
                left = Ten.Geometry.getScroll().x + 'px';
                top = Ten.Geometry.getScroll().y + 'px';
            }
        }
        this.windowObserver = new Ten.Observer(document.body, 'onkeypress', this, 'handleEscape');
        this.visible = true;
    },
    handleEscape: function(e) {
        if (!e.isKey('escape')) return;
        this.hide();
    },
    hide: function() {
        if (this._draggable) this._draggable.endDrag();
        this.window.style.display = 'none';
        if (this.screen) this.screen.style.display = 'none';
        if (this.windowObserver) this.windowObserver.stop();
        this.visible = false;
    }
});

/* Ten.Draggable */
Ten.Draggable = new Ten.Class({
    initialize: function(element,handle) {
        this.element = element;
        this.handle = handle || element;
        this.startObserver = new Ten.Observer(this.handle, 'onmousedown', this, 'startDrag');
        this.handlers = [];
    }
},{
    startDrag: function(e) {
        if (e.targetIsFormElements()) return;
        this.delta = Ten.Position.subtract(
            e.mousePosition(),
            Ten.Geometry.getElementPosition(this.element)
        );
        this.handlers = [
            new Ten.Observer(document, 'onmousemove', this, 'drag'),
            new Ten.Observer(document, 'onmouseup', this, 'endDrag'),
            new Ten.Observer(this.element, 'onlosecapture', this, 'endDrag')
        ];
        e.stop();
    },
    drag: function(e) {
        var pos = Ten.Position.subtract(e.mousePosition(), this.delta);
        Ten.Style.applyStyle(this.element, {
            left: pos.x + 'px',
            top: pos.y + 'px'
        });
        e.stop();
    },
    endDrag: function(e) {
        for (var i = 0; i < this.handlers.length; i++) {
            this.handlers[i].stop();
        }
        if(e) e.stop();
    }
});

/* Hatena */
if (typeof(Hatena) == 'undefined') {
    Hatena = {};
}

/* Hatena.User */
Hatena.User = new Ten.Class({
    initialize: function(name) {
        this.name = name;
    },
    getProfileIcon: function(name) {
        if (!name) name = 'user';
        var pre = name.match(/^[\w-]{2}/)[0];
        var img = document.createElement('img');
        img.src = 'http://www.hatena.ne.jp/users/' + pre + '/' + name + '/profile_s.gif';
        img.alt = name;
        img.setAttribute('class', 'profile-icon');
        img.setAttribute('width','16px');
        img.setAttribute('height','16px');
        with (img.style) {
            margin = '0 3px';
            border = 'none';
            verticalAlign = 'middle';
        }
        return img;
    }
}, {
    profileIcon: function() {
        return Hatena.User.getProfileIcon(this.name);
    }
});

/* Hatena.Star */
if (typeof(Hatena.Star) == 'undefined') {
    Hatena.Star = {};
}

/*
// Hatena.Star.* classes //
**/
if (window.location && window.location.host.match(/hatena\.com/)) {
    Hatena.Star.BaseURL = 'http://s.hatena.com/';
} else {
    Hatena.Star.BaseURL = 'http://s.hatena.ne.jp/';
}
Hatena.Star.Token = null;

/* Hatena.Star.User */
Hatena.Star.User = new Ten.Class({
    base: [Hatena.User],
    initialize: function(name) {
        if (Hatena.Star.User._cache[name]) {
            return Hatena.Star.User._cache[name];
        } else {
            this.name = name;
            Hatena.Star.User._cache[name] = this;
            return this;
        }
    },
    _cache: {}
},{
    userPage: function() {
        return Hatena.Star.BaseURL + this.name + '/';
    }
});

/* Hatena.Star.Entry */
Hatena.Star.Entry = new Ten.Class({
    initialize: function(e) {
        this.entry = e;
        this.uri = e.uri;
        this.title = e.title;
        this.star_container = e.star_container;
        this.comment_container = e.comment_container;
        this.stars = [];
        this.comments = [];
    },
    maxStarCount: 11
},{
    flushStars: function() {
        this.stars = [];
        this.star_container.innerHTML = '';
    },
    bindStarEntry: function(se) {
        this.starEntry = se;
        for (var i = 0; i < se.stars.length; i++) {
            if (typeof(se.stars[i]) == 'number') {
                this.stars.push(new Hatena.Star.InnerCount(se.stars[i],this));
            } else {
                this.stars.push(new Hatena.Star.Star(se.stars[i]));
            }
        }
        if (se.comments && !this.comments.length) {
            for (var i = 0; i < se.comments.length; i++) {
                this.comments.push(new Hatena.Star.Comment(se.comments[i]));
            }
        }
        this.can_comment = se.can_comment;
    },
    setCanComment: function(v) {
        this.can_comment = v;
    },
    showButtons: function() {
        this.addAddButton();
        this.addCommentButton();
    },
    addAddButton: function() {
        if (this.star_container) {
            this.addButton = new Hatena.Star.AddButton(this);
            this.star_container.appendChild(this.addButton);
        }
    },
    addCommentButton: function() {
        if (this.comment_container) {
            this.commentButton = new Hatena.Star.CommentButton(this);
            this.comment_container.appendChild(this.commentButton.img);
        }
    },
    showStars: function() {
        var klass = this.constructor;
        // if (this.stars.length > klass.maxStarCount) {
        //     var ic = new Hatena.Star.InnerCount(this.stars.slice(1,this.stars.length));
        //     this.star_container.appendChild(this.stars[0]);
        //     this.star_container.appendChild(ic);
        //     this.star_container.appendChild(this.stars[this.stars.length - 1]);
        // } else {
        for (var i = 0; i < this.stars.length; i++) {
            this.star_container.appendChild(this.stars[i]);
        }
    },
    showCommentButton: function() {
        if (this.can_comment) {
            this.commentButton.show();
            if (this.comments.length) this.commentButton.activate();
        } else {
            // this.commentButton.hide();
        }
    },
    addStar: function(star) {
        this.stars.push(star);
        this.star_container.appendChild(star);
    },
    addComment: function(com) {
        if (!this.comments) this.comments = [];
        if (this.comments.length == 0) {
            this.commentButton.activate();
        }
        this.comments.push(com);
    },
    showCommentCount: function() {
        this.comment_container.innerHTML += this.comments.length;
    }
});

/* Hatena.Star.Button */
Hatena.Star.Button = new Ten.Class({
    createButton: function(args) {
        var img = document.createElement('img');
        img.src = args.src;
        img.alt = img.title = args.alt;
        with (img.style) {
	    cursor = 'pointer';
	    margin = '0 3px';
            padding = '0';
            border = 'none';
            verticalAlign = 'middle';
        }
        return img;
    }
});

/* Hatena.Star.AddButton */
Hatena.Star.AddButton = new Ten.Class({
    base: ['Hatena.Star.Button'],
    initialize: function(entry) {
        this.entry = entry;
        this.lastPosition = null;
        var img = Hatena.Star.Button.createButton({
            src: Hatena.Star.AddButton.ImgSrc,
            alt: 'Add Star'
        });
        this.observer = new Ten.Observer(img,'onclick',this,'addStar');
        this.img = img;
        return img;
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/add.gif'
},{
    addStar: function(e) {
        this.lastPosition = e.mousePosition();
        var uri = Hatena.Star.BaseURL + 'star.add.json?uri=' + encodeURIComponent(this.entry.uri) +
            '&title=' + encodeURIComponent(this.entry.title);
        if (Hatena.Star.Token) {
            uri += '&token=' + Hatena.Star.Token;
        }
        new Ten.JSONP(uri, this, 'receiveResult');
    },
    receiveResult: function(args) {
        var name = args ? args.name : null;
        if (name) {
            this.entry.addStar(new Hatena.Star.Star({name: name}));
            //alert('Succeeded in Adding Star ' + args);
        } else if (args.errors) {
            var pos = this.lastPosition;
            pos.x -= 10;
            pos.y += 25;
            var scroll = Ten.Geometry.getScroll();
            var scr = new Hatena.Star.AlertScreen();
            var alert = args.errors[0];
            scr.showAlert(alert, pos);
        }
    }
});

/* Hatena.Star.CommentButton */
Hatena.Star.CommentButton = new Ten.Class({
    base: ['Hatena.Star.Button'],
    initialize: function(entry) {
        this.entry = entry;
        this.lastPosition = null;
        var img = Hatena.Star.Button.createButton({
            src: Hatena.Star.CommentButton.ImgSrc,
            alt: 'Comments'
        });
        img.style.display = 'none';
        this.observer = new Ten.Observer(img,'onclick',this,'showComments');
        this.img = img;
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/comment.gif',
    ImgSrcActive: Hatena.Star.BaseURL + 'images/comment_active.gif'
},{
    showComments: function(e) {
        if (!this.screen) this.screen = new Hatena.Star.CommentScreen();
        this.screen.bindEntry(this.entry);
        var pos = e.mousePosition();
        pos.y += 25;
        this.screen.showComments(this.entry, pos);
    },
    hide: function() {
        this.img.style.display = 'none';
    },
    show: function() {
        this.img.style.display = 'inline';
    },
    activate: function() {
        this.show();
        this.img.src = Hatena.Star.CommentButton.ImgSrcActive;
    }
});

/* Hatena.Star.Star */
Hatena.Star.Star = new Ten.Class({
    initialize: function(args) {
        if (args.img) {
            this.img = args.img;
            this.name = this.img.getAttribute('alt');
        } else {
            this.name = args.name;
            var img = document.createElement('img');
            img.src = Hatena.Star.Star.ImgSrc;
            img.alt = this.name;
            with (img.style) {
                padding = '0';
                border = 'none';
            }
            this.img = img;
        }
	new Ten.Observer(this.img,'onmouseover',this,'showName');
	new Ten.Observer(this.img,'onmouseout',this,'hideName');
	if (this.name) {
            this.user = new Hatena.Star.User(this.name);
            this.img.style.cursor = 'pointer';
            new Ten.Observer(this.img,'onclick',this,'goToUserPage');
        }
        if (args.count && args.count > 1) {
            var c = document.createElement('span');
            c.setAttribute('class', 'hatena-star-inner-count');
            Ten.Style.applyStyle(c, Hatena.Star.InnerCount.style);
            c.innerHTML = args.count;
            var s = document.createElement('span');
            s.appendChild(img);
            s.appendChild(c);
            return s;
        } else {
            return this.img;
        }
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/star.gif'
},{
    showName: function(e) {
        if (!this.screen) this.screen = new Hatena.Star.NameScreen();
        var pos = e.mousePosition();
        pos.x += 10;
        pos.y += 25;
        this.screen.showName(this.name, pos);
    },
    hideName: function() {
        if (!this.screen) return;
        this.screen.hide();
    },
    goToUserPage: function() {
        window.location = this.user.userPage();
    }
});

/* Hatena.Star.InnerCount */
Hatena.Star.InnerCount = new Ten.Class({
    initialize: function(count, e) {
        this.count = count;
        this.entry = e;
        var c = document.createElement('span');
        c.setAttribute('class', 'hatena-star-inner-count');
        Ten.Style.applyStyle(c, Hatena.Star.InnerCount.style);
        c.style.cursor = 'pointer';
        c.innerHTML = count;
        new Ten.Observer(c,'onclick',this,'showInnerStars');
        this.container = c;
        return c;
    },
    style: {
        color: '#f4b128',
        fontWeight: 'bold',
        fontSize: '80%',
        fontFamily: '"arial", sans-serif',
        margin: '0 2px'
    }
},{
    showInnerStars: function() {
        var url = Hatena.Star.BaseURL + 'entry.json?uri=' +
        encodeURIComponent(this.entry.uri);
        new Ten.JSONP(url, this, 'receiveStarEntry');
    },
    receiveStarEntry: function(res) {
        var se = res.entries[0];
        var e = this.entry;
        if (encodeURIComponent(se.uri) != encodeURIComponent(e.uri)) return;
        e.flushStars();
        e.bindStarEntry(se);
        e.addAddButton();
        e.showStars();
    }
});

/* Hatena.Star.Comment */
Hatena.Star.Comment = new Ten.Class({
    initialize: function(args) {
        this.name = args.name;
        this.body = args.body;
    }
},{
    asElement: function() {
        var div = document.createElement('div');
        with (div.style) {
            margin = '0px 0';
            padding = '5px 0';
            borderBottom = '1px solid #ddd';
        }
        var ico = Hatena.User.getProfileIcon(this.name);
        div.appendChild(ico);
        var span = document.createElement('span');
        with(span.style) {
            fontSize = '90%';
        }
        span.innerHTML = this.body;
        div.appendChild(span);
        return div;
    }
});

/* Hatena.Star.NameScreen */
Hatena.Star.NameScreen = new Ten.Class({
    base: [Ten.SubWindow],
    style: {
        padding: '2px',
        textAlign: 'center'
    },
    containerStyle: {
        margin: 0,
        padding: 0
    },
    handleStyle: null,
    showScreen: false,
    closeButton: null,
    draggable: false
},{
    showName: function(name, pos) {
        this.container.innerHTML = '';
        this.container.appendChild(Hatena.User.getProfileIcon(name));
        this.container.appendChild(document.createTextNode(name));
        this.show(pos);
    }
});

/* Hatena.Star.AlertScreen */
Hatena.Star.AlertScreen = new Ten.Class({
    base: [Ten.SubWindow],
    style: {
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px',
        width: '240px',
        height: '120px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px',
        borderRadius: '6px 6px 0 0',
        MozBorderRadius: '6px 6px 0 0'
    }
},{
    showAlert: function(msg, pos) {
        this.container.innerHTML = msg;
        var win = Ten.Geometry.getWindowSize();
        var scr = Ten.Geometry.getScroll();
        var w = parseInt(this.constructor.style.width) + 20;
        if (pos.x + w > scr.x + win.w) pos.x = win.w + scr.x - w;
        this.show(pos);
    }
});

/* Hatena.Star.CommentScreen */
Hatena.Star.CommentScreen = new Ten.Class({
    base: [Ten.SubWindow],
    initialize: function() {
        var self = this.constructor.SUPER.call(this);
        if (!self.commentsContainer) self.addCommentsContainer();
        return self;
    },
    style: {
        width: '280px',
        height: '280px',
        overflowY: 'auto',
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px',
        borderRadius: '6px 6px 0 0',
        MozBorderRadius: '6px 6px 0 0'
    },
    containerStyle: {
        margin: '32px 0 0 0',
        textAlign: 'left',
        padding: '0 10px'
    },
    getLoadImage: function() {
        var img = document.createElement('img');
        img.src = Hatena.Star.BaseURL + 'images/load.gif';
        img.setAttribute('alt', 'Loading');
        with (img.style) {
            verticalAlign = 'middle';
            margin = '0 2px';
        }
        return img;
    }
},{
    addCommentsContainer: function() {
        var div = document.createElement('div');
        with (div.style) {
            marginTop = '-3px';
        }
        this.container.appendChild(div);
        this.commentsContainer = div;
    },
    showComments: function(e, pos) {
        var comments = e.comments;
        if (!comments) comments = [];
        this.commentsContainer.innerHTML = '';
        for (var i=0; i<comments.length; i++) {
            this.commentsContainer.appendChild(comments[i].asElement());
        }
        if (e.starEntry && !e.can_comment) {
            this.hideCommentForm();
        } else {
            this.addCommentForm();
        }
        var win = Ten.Geometry.getWindowSize();
        var scr = Ten.Geometry.getScroll();
        var w = parseInt(this.constructor.style.width) + 20;
        if (pos.x + w > scr.x + win.w) pos.x = win.w + scr.x - w;
        this.show(pos);
    },
    bindEntry: function(e) {
        this.entry = e;
    },
    sendComment: function(e) {
        if (!e.isKey('enter')) return;
        var body = this.commentInput.value;
        if (!body) return;
        this.commentInput.disabled = 'true';
        this.showLoadImage();
        var url = Hatena.Star.BaseURL + 'comment.add.json?body=' + encodeURIComponent(body) +
            '&uri=' + encodeURIComponent(this.entry.uri) +
            '&title=' + encodeURIComponent(this.entry.title);
        new Ten.JSONP(url, this, 'receiveResult');
    },
    receiveResult: function(args) {
        if (!args.name || !args.body) return;
        this.commentInput.value = ''; 
        this.commentInput.disabled = '';
        this.hideLoadImage();
        var com = new Hatena.Star.Comment(args);
        this.entry.addComment(com);
        this.commentsContainer.appendChild(com.asElement());
    },
    showLoadImage: function() {
        if (!this.loadImage) return; 
        this.loadImage.style.display = 'inline';
    },
    hideLoadImage: function() {
        if (!this.loadImage) return; 
        this.loadImage.style.display = 'none';
    },
    hideCommentForm: function() {
        if (!this.commentForm) return;
        this.commentForm.style.display = 'none';
    },
    addCommentForm: function() {
        if (this.commentForm) {
            this.commentForm.style.display = 'block';
            return;
        }
        var form = document.createElement('div');
        this.container.appendChild(form);
        this.commentForm = form;
        with (form.style) {
            margin = '0px 0';
            padding = '5px 0';
            // borderTop = '1px solid #ddd';
        }
        //if (Hatena.Visitor) {
        //    form.appendChild(Hatena.Visitor.profileIcon());
        //} else {
        //    form.appendChild(Hatena.User.getProfileIcon());
        //}
        var input = document.createElement('input');
        input.type = 'text';
        with (input.style) {
            width = '215px';
	    border = '1px solid #bbb';
            padding = '3px';
        }
        form.appendChild(input);
        this.commentInput = input;
        var img = this.constructor.getLoadImage();
        this.loadImage = img;
        this.hideLoadImage();
        form.appendChild(img);
        new Ten.Observer(input,'onkeypress',this,'sendComment');
    }
});

/* Hatena.Star.EntryLoader */
Hatena.Star.EntryLoader = new Ten.Class({
    initialize: function() {
        var entries = Hatena.Star.EntryLoader.loadEntries();
        this.entries = [];
        for (var i = 0; i < entries.length; i++) {
            var e = new Hatena.Star.Entry(entries[i]);
            e.showButtons();
            this.entries.push(e);
        }
        this.getStarEntries();
    },
    createStarContainer: function() {
        var sc = document.createElement('span');
        sc.setAttribute('class', 'hatena-star-star-container');
        sc.style.marginLeft = '1px';
        return sc;
    },
    createCommentContainer: function() {
        var cc = document.createElement('span');
        cc.setAttribute('class', 'hatena-star-comment-container');
        cc.style.marginLeft = '1px';
        return cc;
    },
    scrapeTitle: function(node) {
        var rval = [];
        (function (node) {
            if (node.tagName == 'SPAN' &&
                (node.className == 'sanchor' ||
                 node.className == 'timestamp')) {
                     return;
            } else if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
                return;
            }
            var cn = node.childNodes;
            if (cn) {
                for (var i = 0; i < cn.length; i++) {
                    arguments.callee.call(this, cn[i]);
                }
            }
            var nodeValue = node.nodeValue;
            if (typeof(nodeValue) == 'string') {
                rval.push(nodeValue);
            }
        })(node);
        return rval.join('');
    },
    headerTagAndClassName: ['h3',null],
    getHeaders: function() {
        var t = Hatena.Star.EntryLoader.headerTagAndClassName;
        return Ten.DOM.getElementsByTagAndClassName(t[0],t[1],document);
    },
    loadEntries: function() {
        var entries = [];
        //var headers = document.getElementsByTagName('h3');
        var c = Hatena.Star.EntryLoader;
        var headers = c.getHeaders();
        for (var i = 0; i < headers.length; i++) {
            var header = headers[i];
            var a = header.getElementsByTagName('a')[0];
            if (!a) continue;
            var uri = a.href;
            var title = '';
            // Ten.DOM.removeEmptyTextNodes(header);
            var cns = header.childNodes;
            title = c.scrapeTitle(header);
            var cc = c.createCommentContainer();
            header.appendChild(cc);
            var sc = c.createStarContainer();
            header.appendChild(sc);
            entries.push({
                uri: uri,
                title: title,
                star_container: sc,
                comment_container: cc
            });
        }
        return entries;
    }
},{
    getStarEntries: function() {
        var url = Hatena.Star.BaseURL + 'entries.json?';
        for (var i = 0; i < this.entries.length; i++) {
            if (url.length > Ten.JSONP.MaxBytes) {
                new Ten.JSONP(url, this, 'receiveStarEntries');
                url = Hatena.Star.BaseURL + 'entries.json?';
            }
            url += 'uri=' + encodeURIComponent(this.entries[i].uri) + '&';
        }
        new Ten.JSONP(url, this, 'receiveStarEntries');
    },
    receiveStarEntries: function(res) {
        var entries = res.entries;
        if (!entries) entries = [];
        for (var i = 0; i < this.entries.length; i++) {
            var e = this.entries[i];
            for (var j = 0; j < entries.length; j++) {
                var se = entries[j];
                if (!se.uri) continue;
                if (encodeURIComponent(se.uri) == encodeURIComponent(e.uri)) {
                    e.bindStarEntry(se);
                    entries.splice(j,1);
                    break;
                }
            }
            if (typeof(e.can_comment) == 'undefined') {
                e.setCanComment(res.can_comment);
            }
            e.showStars();
            e.showCommentButton();
        }
    }
});

/* Hatena.Star.WindowObserver */
Hatena.Star.WindowObserver = new Ten.Class({
    initialize: funct


  

2007-06-27

http://anond.hatelabo.jp/20070627152101

br /が文法違反になるのはxmlじゃなくhtmlで書いてるからなんじゃないの?

ちゃんとdtd宣言に則った書式で書かないと減点されるよ。

2007-05-10

http://anond.hatelabo.jp/20070510100720

Google Baseってどんなんだっけと思って検索して見たけど情報少ないなぁ。

前に名前くらいは聞いた気がしたけどその時もよく分からなかったし、現時点でもベータだったり日本語対応してなさそうな雰囲気だったり。

実際に触ってみてもGoogleが検索用に使うDBって感じで、何か別のDBを構築するのには向いてるのかどうか、そういう機能があるのかもしれないけどそこまで確認して無いです、すまん。

もしかしたら使えるような機能があるのかもしれないんで、また調べて良さそうだったら使うかも、情報サンクス

Googleサービス内で他にカレンダーとかも使いようによっては可能かな。

局別にカレンダー作って(ひとつにしても大丈夫かも)番組と各スポンサーを載せていくとか、wikiみたいに書き込み無制限には出来ないけど編集権限も追加していけるし。

だけどアカウント持ってない人とか見れなかったりするだろうし、Ajaxって気持ち重くてちょっと敬遠してしまってるんだよなぁ、物凄く主観意見だけども。

自前でDB用意しないと不安な性分なのでなんだかなぁというのが本音だったり、XMLか何かで吐いてくれるなら外部から使いようもあるんだけど。

なければwikiか自前でそれっぽいCMS用意するなりで、その前に使えそうなサービスあるかどうかもうちょっとちゃんと調べてみる必要ありそうですね。

なんかこうさくっと便利なDBサイト作る方法ってないのかなぁ、無いわなぁ、まぁあとでグーグル先生に聞いてみよう。

2007-04-20

俺ぐらいのレベルになるとエポック病が意味わからん

LiveDoor認証がでたらしいので、とりあえず寝際にちゃちゃっと書こうとしたのだけどなんかうまくいかない。

ログインURLの有効期限が切れています」とかでちゃうんだ。

なにか間違ってるかな?

phpで書いてみたのだけど、エロイ人アドバイスにょろり。

<?php 
// LiveDoor認証に必要なリンクの生成
// 定数がクラス内に切ってあるので環境にあわせ変更してください
	include_once('authlivedoor.class.php');	// Livedoor認証用クラス
	$obj_auth = new AuthLiveDoor(LIVEDOOR_APIKEY, LIVEDOOR_SECRET);
	$livedoorloginurl = $obj_auth->getLoginUrl();

?>
<div style="border:solid 1px #666666;">
<a href="<?= $livedoorloginurl ?>">ライブドア認証を利用してログインする<br />
<img src="http://auth.livedoor.com/img/cmn/head_livedoor.gif" border="0">
<img src="http://auth.livedoor.com/img/cmn/head_logo.gif" border="0">
</a><br />


authlivedoor.class.php

<?php
// this code is writen by utf-8 &amp; lf 

//http://auth.livedoor.com/login/?app_key=<app_key>&amp;perms=<perms>&amp;t=<time>&amp;v=1.0&amp;userdata=<userdata>&amp;sig=<sig>

// LiveDoor外部認証APIを利用する
// キーは各開発者ごとに取得が必要です。 http://auth.livedoor.com/ ここより取得できます。
// コールバックURLには authlivedoor.php を指定してください

// --- 下記宣言を環境に合わせて変更してください。 ---
define("LIVEDOOR_APIKEY" ,"");	// アプリケーションキー
define("LIVEDOOR_SECRET" ,"");	// LiveDoor認証秘密キー
// --- ここまで ---


class AuthLiveDoor {

    const LIVEDOOR_AUTH_PORT = 80;		// ポート
    const LIVEDOOR_AUTH_TIMEOUT  = 10;	// タイムアウト
    const LIVEDOOR_AUTH_VERSION  = '1.0';	// 認証APIプロトコルバージョン
    const LIVEDOOR_AUTH_PERMS  = 'id';	// 認証APIアクセスconst LIVEDOOR_AUTH_FORMAT  = 'xml';	// 認証APIの取得フォーマット



	const LIVEDOOR_AUTHURL = "auth.livedoor.com";	// LiveDoor認証URL

	private $login_state = false;
	private $login_id = "";
	private $err_msg = "";

	private $apikey = "";
	private $secret = "";

	public function __construct($apikey, $secret) {
		$this->apikey = $apikey;
		$this->secret = $secret;
	}

	// 
	// $cert = $_GET['token'];
    public function getAuth($token) {
		if ($token == "" ) {
			return;
		}

		$api_time = date('U');	// エポック秒で
		$param_ary = array($this->apikey
						,AuthLiveDoor::LIVEDOOR_AUTH_FORMAT
						,$token
						,api_time
						,AuthLiveDoor::LIVEDOOR_AUTH_VERSION
						);
		sort($param_ary);
		$api_sig = hash_hmac('sha1',implode('',$param_ary),$this->secret);


		$param = "app_key=".$this->apikey
			."&amp;format=".AuthLiveDoor::LIVEDOOR_AUTH_FORMAT
			."&amp;token=".$token
			."&amp;t=".$api_time
			."&amp;v=".AuthLiveDoor::LIVEDOOR_AUTH_VERSION
			."&amp;sig=".$api_sig;

		$fp = fsockopen(AuthLiveDoor::LIVEDOOR_AUTHURL
				, AuthLiveDoor::LIVEDOOR_AUTH_PORT
				, $errno
				, $errstr
				, AuthLiveDoor::LIVEDOOR_AUTH_TIMEOUT);
		if (!$fp) {
			$this->err_msg = "$errstr ($errno)<br />\n";
		} else {
			$out = "POST /rpc/auth?$param HTTP/1.1\r\n";
			$out .= "Host: auth.livedoor.com\r\n";
			$out .= "Connection: Close\r\n\r\n";

			fwrite($fp, $out);
			$ret = "";
			while (!feof($fp)) {
				$ret .= fgets($fp, 2048);
			}
			fclose($fp);
		}

		// LiveDoorの認証XMLパターン
		$pattern = '/(\s*<livedoor_id>)(.*)(<\/livedoor_id>)/';
		preg_match_all($pattern,$ret,$getAry);
		$livedooruserid = $getAry[2][0];

		// ユーザーIDを取得できた場合
		if ($livedooruserid != "") {
			// ログイン成功
			$this->login_state = true;
			$this->login_id = $livedooruserid;
			return ture;
		} 
	}

	public function getLoginState(){
			return $this->login_state;
	}

	public function getLoginId(){
			return $this->login_id;
	}

	public function getLoginUrl() {
		# http://auth.livedoor.com/guide/
		# http://auth.livedoor.com/login/?app_key=<app_key>&amp;perms=<perms>&amp;t=<time>&amp;v=1.0&amp;userdata=<userdata>&amp;sig=<sig>
		# app_key 必須 登録時に発行されたアプリケーションキー 
		# perms 必須 要求するアクセス権、現状userhashとidの2種類がある 
		# t 必須 URLが生成された時間をエポック秒で表したもの 
		# v 必須 プロトコルバージョン現在は1.0で固定 
		# userdata 任意 コールバックURLに引き継ぎたい値を255バイトまで自由に設定できる 
		# sig 必須 このURLの正当性を確認するためのシグネチャ 


	// ログインURLの有効期限が切れています
	// ヾ(。o、゜)ノ ここらへんがわからん!! 
//		$api_time = time()+32400;	// エポック秒で
		$api_time = date('U')+32400;	// エポック秒で
//		$api_time = date('U');	// エポック秒??もしかして、それはポエティック病ではありませんか?
		$param_ary = array($this->apikey
						,AuthLiveDoor::LIVEDOOR_AUTH_PERMS
						,api_time
						,AuthLiveDoor::LIVEDOOR_AUTH_VERSION
//						,data
						);
		sort($param_ary);
		$api_sig = hash_hmac('sha1',implode('',$param_ary),$this->secret);
		$loginurl = "http://auth.livedoor.com/login/"
			."?app_key=".$this->apikey
			."&amp;perms=".AuthLiveDoor::LIVEDOOR_AUTH_PERMS
			."&amp;t=".$api_time
			."&amp;v=".AuthLiveDoor::LIVEDOOR_AUTH_VERSION
//			."&amp;userdata="
			."&amp;sig=".$api_sig;

		return $loginurl;
	}


}

もう疲れたので寝る。ライブドアなんてーーーー!!!

訂正。

秘密キーとか、そのままのっけちゃった (ーωー|||)

そしてなかなか訂正できなくてあせった。。

2007-04-11

私が躓きかけたjavascriptと他言語の違い

http://anond.hatelabo.jp/20070411180408の人へ

Javascript言語仕様を読めば、語句があって構文があって構造化やらオブジェクトやら関数やらなんやらの作り方がわかる。

私もそれについては何の問題もなかった。少々、特徴はあるけれど、さほど困惑するほどのものではなかった。

ただ、それから先で、はたと困惑するんだよね。やりたいことをどう作っていけば良いのかわからない。それ、よくわかる。

Javascript(正確にはちょっと違うのだけれど)の特異な点は、こちらがJavascriptの枠組みで何か設計する前に、すでに互いに関連しあったインスタンスがある、または他の枠組み(HTMLやらXMLやら)でインスタンスを生成したあとJavascriptで操作する、って所なんだ。

他の言語は、I/OやI/Fを設計して、それをその言語で作って操作して、という手順になるんだよね。プログラミングはそのI/OやI/Fを作ることから始まることが多い。

しかし、Javascriptはその部分ほとんどインスタンスとしてブラウザが作った後に動く。すでに形になっているインスタンス群がある状態で動く。そして、プロトタイプ言語だから、インスタンスを作る際に他のインスタンスを使用する事が多い。

つまり、すでに出来ているインスタンス群の状態を知る、つまりDOMを知って、実際にどんなインスタンスが出来ているのか、どんなインスタンスを作ればよいのか、を知る必要がありました。

以上、prototype.jsも満足に使えないへぼい奴からの言葉です。

javascriptが分からない

いや、仕様は大体本読めば分かるんだよ。

全部がオブジェクトで実は中身はハッシュだとか、プロトタイプベースオブジェクト指向だとかそう言うのは。

ただ、具体的にプロダクトにこう言う機能を実現させたい!って時に何をやればいいのかさっぱりイメージが浮かんでこない。

例えば、ちょっとテーブルで表を作ってどこかのカラムクリックしたら入力フォームになってデータ入力出来る様にしたい、とかでも何から手をつけていいやら。

結局色んなライブラリを探してその説明通りちょこちょこ流用できる時以外は、あうあうあうああーーで全然ナニやれば良いのか頭が働かない。

DOMの操作が分からないってだけなのかなぁ?

phpとかでXML文書をパースして色んな処理、とかは特に躓かなかったんだけど。

AJAXとかprototype.jsとかMochiKitとか色んな技術を使おうとワケワカメになってるのもあるのかも。

昔から地道にwindowオブジェクトチョコチョコ弄って、とかのjavascriptを書いてきた経験が無いから。

何か良い書籍とか教えてください増田

2007-04-04

Re: anond:20070404200550

anond:20070404150650の人ではないけれど。

HTML + CSSだとそれを解釈するWebブラウザ限定になっちゃうじゃん。

anond:20070404144349

に対して

RSSXMLパーサに依存してるよ。

anond:20070404150650

と言ったわけだ。

つまり、「HTML+CSSを扱えるのがWebブラウザに限定されるように、RSSを扱えるのはXMLパーサに限定されてる、どっちも同じようなもの」ってことでしょ。

で、ここからは私の意見なのだけれど、RSSに見た目を求める人ってのは、なんでRSSを使うのだろう。

上の「HTML+CSSRSSは似た様なもの」ってのは、ある意味正しいのだけれど、でも、現状では「似たような物」ではない。ちゃんと用途別に使われている。

RSSが出てきたのは、この「用途」の違いじゃないの?

HTML+CSSブラウザレンダリングして人が見るために豊かな表現力を持つ。それと引き換えに、ブラウザの消費する(開発とかも含む)リソースは多い。

そういうのじゃなく、もっと軽やかな仕組みのために、表現力を落として意味付けに重点を置いたのがRSSでしょ。RSSHTML+CSSのような表現を求めてもしょうがないと思うけどなぁ。というか、そこまでするなら、UAみて振り分ければよいのに。

http://anond.hatelabo.jp/20070404105254

横槍だけど、無理かと。

まずHTML意味的役割を無視したサイトが多すぎる。hn要素系が無いだとか、親要素がdivだけで意味づけが不明だとかはよくあることで、非道いのだとtitleが無いだとか、altの無いimg要素だとか、そんなサイトが溢れ返ってる。

更に、ある程度strictな構文であっても思想的な違いがあるから、文書構造が想定不可能で、CSSだけだと意図した見栄えにならない可能性が非常に高いかと。

所詮、HTML+CSSでの可能範囲なんて、ユーザCSSでちょっと文字サイズとか変えたり、pdfリンクの場合に注意文入れたりするくらいで、あとは制作者側が用意したCSSに任せきりにするか、やるにしても思いっきり殺伐としたスタイルを適用するくらいが限界なんじゃないのかな。

もちろん、元記事で書かれてるのはRSSっていうよりXMLの利点だし、XHTML+XSLTまで含めればかなり柔軟性は増すんだろうけど、xhtml+xmlで提供してくれてるところなんてあまり無いし。

2007-03-06

反省・・・

なんかスパムみたいに長くなっちゃった。。。ごめんみんな

エクセルってgroup by とか使うレベルSQLって書けるの?

なんか職業別分類とか個人的に興味があったので一覧でみてみたいなと思ったんだけど、縦に記述されてるのでエクセルソートだと厳しい。

ちゃんと計算して値をだしたいんだけどエクセルってどこまでやってくれるのだろうか?

そこまでやるんだったらマクロで集計→別シートに起こす→ソートのほうがいいのかな?

官報も2.0になってAPIかなんかで基礎情報返してくれればいいのに

誰か、国勢調査の値をDBに落とし込んで外からのリクエストに応じてxml返すみたいなのつくってちょ。

結構需要はあると思う。たぶんプログラム的なところを言えば学生レベルでできるだろうし、システムレンタル鯖いっこで充分。

誰かやってみないか?

そういう使い方ができるかどうか電話してみよう。。

めも。。

総務省統計統計調査部

国勢統計審査発表

http://www.stat.go.jp/data/kokusei/toiawase.htm

2007-01-28

なんかもうcometとか不要じゃね?

リアルタイム通信を必要とするようなリッチjavascriptを動かす環境なら、当然のようにFlash Playerもインストールされてるのではなかろうか。

それならjavascriptからswfを制御して、swfからXML Socket叩いて通信した方が、取りこぼしが少なくクロスプラットフォームに書ける気がする。

100% pure javascriptである必要があるのか?

2007-01-24

replyは単なるリンクだから

あれば便利で良いけど。なくてもtitleさえ渡せればいいよ。GMで追加するから。

私はanond:20070124114742に賛成。一覧はシンプルに時系列、パーマリンクで色々詳細。

あとあと。記事毎の情報(って今のところtitleとtrackbackぐらいか)をXMLで取得できるといいな。そうすればsuVeneさんとかがGMでぐりぐりやってくれそうだから!

またお昼休みに遊んでみて。

2007-01-11

イザ!トラックバックできない

リクエスト

POST /news/newsarticle/34435/TrackBack/ HTTP/1.0

Host: www.iza.ne.jp

Content-Type: application/x-www-form-urlencoded

Content-Length: 239

Accept: */*

url=http://anond.hatelabo.jp/20070111050543&title=%E8%8B%A5%E8%80%85%E3%81%AE%E3%83%A2%E3%83%A9%E3%83%AB%E3%81%8C%E4%BD%8E%E4%B8%8B%E3%81%97%E3%81%A6%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8C

応答:

HTTP/1.1 500 Internal Server Error

(もっとつづく)

trackback仕様上、エラーXMLフォーマットで返ってくるべきなのに、500って恥ずかしいよね。

え?エラーになるようなリクエストを送る方が恥ずかしいって?ごもっとも。

2006-12-24

博士課程の学生クリスマスに冷やかしを言う

http://today.reuters.com/news/articlenews.aspx?type=oddlyEnoughNews&storyID=2006-12-22T140413Z_01_L22159443_RTRUKOC_0_US-CHINA-CHRISTMAS-STUDENTS.xml&WTmodLoc=NewsHome-C3-oddlyEnoughNews-3

なんか日本バブル期っぽいな。

博士課程の学生クリスマスに冷やかしを言う

北京12月22日 ロイター) 中国メディアが金曜に伝えたところによると、3つの一流大学から集まった10人の博士課程の学生が、地域のクリスマスのお祝いを酷評するための、ネット上の請願書を投稿し、人々に「西洋文化の侵略に抵抗する」ことを呼びかけた。

中国日報が伝えたところによると、北京大学、清華大学、中国人大学という一流大学学生は、「アメリカヨーロッパの文化」が「その科学技術的、経済的な支配」をともなって、中国全土に広がっていると罵った。

西洋の文化は、穏やかなシャワーというよりむしろ嵐のように、この国を掃き尽してしまっている」と新聞は請願を引用して伝えた。その請願の日付は、中国伝統的な旧暦で書かれていた。

それは「部分的には、経済発展を促進する一方で中国伝統を維持できなかった政府の失敗である」

著者の学生たちは、祝祭を商売のために使っていると言って小売業者を非難し、その行事の起源も知らずに浮かれ騒いでいると言って中国の人々を非難した。

クリスマスイブには、北京や他の中国都市において、殆ど全てのレストランで席を待たなくてはならない」と著者たちは悲しんだ。

近年、クリスマスバレンタインデーのような西洋の祝祭が、中国若者の間でポピュラーになった。しかし、伝統的な中国文化が、まっしぐらな経済の急発展の中で押し流されてしまっていると危惧する人々もいる。

中国コミュニスト政府は、公式にはたった一つの伝統的祭日だけを承認している――中国旧正月である。その他の、ドラゴンボートフェスティバルのような祭日は、いまもって香港台湾でのみ正式に認められている。

2006-12-23

ホワイトカラーエグゼンプション

厚生労働省の課長以上には、管理職手当という手当が支給される代わりに残業代が一切支給されない(公務員労働基準法適用除外、ということで一応合法らしい)。ということで、「絶対に『わかった』とは言わない」どころか、すでにやっているわけですな。

http://anond.hatelabo.jp/20061222134941

 

この人はホワイトカラーエグゼンプションについては理解しているようだが、官僚制度の知識はウトイようだ。

国家公務員の課長は、民間企業の課長とはまったく違う。

国家公務員の課長職は、職級でいうと9級以上の上級幹部職員。国家公務員の職級順位は係員(1-2級)<係長(3-4級)<課長補佐(5-6級)<室長(7-8級)<課長(9-10級)という順位となっており、人数的には官僚ピラミッドの上から0.8%ぐらいまでが課長級以上。

霞ヶ関の本省には国家公務員が約17万人いるが、9級の課長は全省庁で1400人、10級の課長は66人しかいない。地方公務員でたとえると局長など、知事が出席する会議に出るような立場国家公務員の課長だ。民間企業なら営業部長工場長や支社長クラス

http://www.jinji.go.jp/kyuuyo/pdf/18koumukyuyo.pdf

国家公務員幹部に超過勤務が支払われていないのは事実だ。しかし、政府が提案しているホワイトカラー・エグゼンプションは、国家公務員の課長クラスを対象としているのではなく、国家公務員でいえば3級の係長とか棒級の高い2級のベテランの係員の残業までサービス残業を合法化してしまえという提案だ。

だから国家公務員の9級の課長以上が超過勤務手当てが無いことをもって、政府が提案しているホワイトカラーエグゼンプション国家公務員が「すでにやっている」とはいえない。

もし国家公務員の9級の課長以上が超過勤務手当てが無いことを基準とするなら、ホワイトカラーエグゼンプション年収2000万円以上の役職者だけに限定すべきということになり、それは現在政府が提案している内容とはまるで異なる。

国家公務員の課長をホワイトカラーエグゼンプション適用の基準とするならなおさら、政府提案のホワイトカラーエグゼンプションはひどすぎると考えるべきだろう。

 

国家公務員はの平の係員にはサービス残業が蔓延しており、残業しても超過勤務手当てが支払われないケースがかなりある。

超過勤務手当てが全額支給されている職員は全体の10.4%程度。実際に支払われている超過勤務手当ては、本来支給すべき超過勤務手当てのおおよそ5割程度だ。

 

http://www.kokko-net.org/kokkororen/1119zu3.gif

 

なぜ国家公務員残業の多くがサービス残業になっているのかというと、組織で使える残業の上限があらかじめ決められていることがひとつの理由。組織としての残業代の上限をいっぱいまで使い切ってしまったら、のこりの残業は、突発的な災害でも起こらない限り、原則としてサービス残業になる。

それがいやなら残業せずにすむよう仕事を効率化して早く帰れ、というのが人事院の言い分だ。が、多くの組織はどこも絶対的に人手不足なので、そんなことはできるはずもない。

たしかに、ヒマ組織も一部あり、そういう組織では、残業代の上限を使い切らないと残業予算が削られるのでしなくてもいい残業をしていることがある。だからそういうムダのないよう不要な残業予算を削ることは必要だ。

だが、人事院財務省は必要/不用の判断を実態を調べて判断せずに機械的に残業予算を割り当てている。その結果、本当に残業が必要な組織ではサービス残業が蔓延し、ヒマ組織では上限いっぱいまで残業することが固定化されてしまうことになる。これでは悪循環だ。

仕事を効率化させるのはあたりまえとしても、それと賃金不払いは別問題。現実残業労働に対しルールどおりの賃金が支払われないという現状は、労働法違反であり違法である。

だからサービス残業をやめさせろと組合は再三主張しているし、「国家公務員残業改善に関する請願」も国会に提出している。誰もサービス残業という現状に納得して好き好んでサービス残業しているわけではない。

多くの組織では人手が足りない。足りないにもかかわらず公務員改革の名のもとで定数を極限まできりつめる。だからますます人手不足となり、残業が増える。残業が増えても公務員改革の名のもとで残業予算をつけないから、サービス残業となる。結果、過労による労働効率は低下し、不満は高まり、職場の士気は落ち、労働効率は逆に悪化する。

行政サービスが人的問題によって劣化して困るのは、結局は国民だ。

 

http://www.shugiin.go.jp/itdb_seigan.nsf/html/seigan/1541351.htm

 

国公労の調査によれば、年360時間以上の残業者は全体の6割占めており慢性的な長時間労働となっていることが明らかになっている。過重労働による公務災害の認定要件とされる「残業時間月80時間以上」と回答している職員は、ほぼ2割(18.9%)に達している。調査対象となった職員の7.2%(364名)が過労死の危険を「現在感じている」と回答を寄せている事実も明らかになった。

 

http://www.kokko-net.org/kokkororen/s1119.htm

 

こんな現状だから、厚労省は自分の職員に対してホワイトカラー・エグゼンプションを導入する気などさらさらない。もし導入すれば「違法なサービス残業固定化だ」という批判が組織内部から一斉におこる。そしてその主張はまったく正しい。だから霞ヶ関は自分の職員に対してホワイトカラー・エグゼンプションを導入したくてもできない。するつもりもない。

つまり、自分ではできもしないルールを、国民に対してだけ、厚労省は求めようとしているということだ。

 

http://www.sannichi.co.jp/kyodo/news.php?genre=National&id=2006122101000602.xml

http://anond.hatelabo.jp/20061221135126

2006-12-21

愛国者なら無賃残業過労死はあたりまえだ、ってか

規制撤廃は過労死促進」元管理職らの批判広がる

 労働時間規制を一部撤廃するホワイトカラー・エグゼンプション(適用除外)を議論する厚生労働省審議会は21日、労働者側の合意が得られないまま導入に向けて結論を出す見通しが強まった。これに対し、働き過ぎで死にかかった体験を持つ元管理職らから「長時間労働を拡大する過労死促進法だ」との批判の声が広がっている。

 夫や息子の過労死、自殺の悲劇を体験した遺族らは、厚労省に導入撤回を申し入れたのを皮切りに、東京都内オフィス街で反対を訴えたり、審議会メンバー全員に手紙を送るなど要請行動を展開している。

 大手ゼネコンの元技術者秋山光夫さん(56)は「自律的な働き方なんてない。ノルマ成果主義に強制される働き方だ。厚労省は法改悪ではなく、労働時間を守らせ、長時間労働や過労死を減らす対策を強めるべきではないか」と訴える。

http://www.sannichi.co.jp/kyodo/news.php?genre=National&id=2006122101000602.xml

 

労働者側の合意が得られないまま導入に向け結論って、じゃあなんのために労働者側を入れて議論していたんだ、と。

セレモニーにすぎない議論の結論なんて、誰も納得しない。

ホワイトカラー・エグゼンプションなんてとんでもないルール国民押し付ける前に、厚労省の課長以上の官僚自衛官の佐官以上の全員の給与を、全部ホワイトカラー・エグゼンプションにすべきではないかな。

教師に「愛国心教育」を強制しているのだから、政府官僚ホワイトカラー・エグゼンプションに参加して愛国心を示してもらおうじゃないか。そうすればかなりの節税になって国民の理解も得られるだろう。

などと提案しても、連中は絶対に「わかった」とは言わないだろう。

自分でできもしないルール国民にだけおしつけようという厚労省の魂胆が気にいらない。

 

どうしても、ホワイトカラー・エグゼンプションを導入したいのならば、日本株会社総本山である、公務員への導入から初めて頂きたい。多くのサラリーマン根本を揺るがすホワイトカラー・エグゼンプションは、「隗より始めよ」である。

http://news.livedoor.com/webapp/journal/cid__2855485/detail

2006-12-09

はてブ』によってイノベーションを起こし得る5つの理由

(前回:『はてな』がイノベーターに成り得ない5つの理由 - はてな匿名ダイアリー

1.『はてブ』は国内ブックマークサービス巨人である
現実として、『はてブ』(正式名称:はてなブックマーク)は国内で最も規模の大きなブックマークサービスである。はてブ』は今後も頑なに規模の拡大を目指すべきである
はてブ』はfirefoxのグリースモンキー拡張を筆頭にはてなの中で唯一、想定外の利用法が次々と産まれているサービスだからであります。
はてな陣営はこの事実を非常に重く受け止めるべきだ

では、なぜ『はてブ』だけが特別な存在に成り得たのか?
理由は簡単であります。はてブ』はサービス提供者が利用者を把握できる規模以上の存在を許したからであります。
(参照:はてなブックマーク件数取得APIとは - はてなダイアリー
2.『はてブ』はお行儀が良いだけの存在ではない
この事実は非常に重要な要素であり、そして『はてブ』がイノベーションを起こしていない要因の一つであります。
はてブ』利用者が不特定多数に忌憚無い意見を公開できる場を設けたことはとても評価できる。
そして非常に残念なことに、現状の『はてブ』はこの状況に満足してしまっているように見受けられる。
私は大変不満である。私、ご立腹はてな陣営』はこの事実を非常に重く受け止めるべきだ。

解決策の一つとして、海外発のdiggコメント機能を参考にすると良い。
しかし、私はツリー表示を捨てることを推奨する。
その代わりに、評価の高い順・更新順にソートする機能、マイナス評価の灰色or小フォント表示機能、コメントのないブックマークをページの最後にもってきて、NoComment_Tagsとでもして全て表示することをお勧めする。これだけで、はてブユーザビリティは飛躍的に向上するのに、現状『はてブ』の変化が乏しいことに私は不思議で堪らない。

はてブ』が第一に理解すべきはソーシャルブックマークの本質である
ソーシャルブックマークの本質とは、不特定多数の人による情報の淘汰を効率的に起こす事であることを『はてブ』製作者はよく理解しなければならない。
3.『はてブ』はサービス間の垣根を超越する存在である
この事実は具体例を挙げれば事足りる。
前述したfirefoxグリーモンキー拡張機能によって現実に起こっている。
googleとの垣根を簡単に超越したりlivedoorreaderとの垣根をいとも容易く乗り越えてしまっていることは厳然たる事実である。

はてブ』はXMLの利用をさらに進め、マイクロソフトGoogleヤフーなどの大企業に『ブックマークコメントの標準書式』を提言すべきである。これによって、ソーシャルブックマークは次のステップを迎えることを『はてブ』は理解すべきだ。
ここでの利用とはコメント評価、時刻などをXMLフィードにした小さなファイル仕様を公開して別のサービスに利用を促進することをさしており、『はてブ』全体をHXMLXHTML書式で構成せよといっているわけではない。ちなみにRSSATOMXMLを用いられている。
4.『はてブ』にはイノベーションを起こせる具体的な方法がある
はてブ』は情報世代を次のステップへ進める具体的な可能性がある。
それは3ペインRSSリーダーを作れる体制を整えることである。
2ペインはLivedoorReaderでほぼ仕様が固まっているので、はてな陣営はこれを参考に3ペイン目、つまり、ブックマークボタンコメント表示andソート欄を加えたものを作れるようにすべきである。
ここで忘れてならないのは3で述べたコメントXML書式を統一することである。そうすることで2chブラウザ群のように新しいアプリケーションが出てくる道が開けるからである

では、なぜこれがイノベーションと呼べるのか?
これを説明するのは大変難しい、なぜならイノベーションとは起こってからでしか定義できない類のものだからだ
しかし、こう説明すれば納得できるかもしれない。さまざまな組織による情報工作の主戦場が『はてブ』に変わることは立派な変革である。
5.『はてブ』は『はてブ』によってイノベーションを起こり得る5つの訳』の5つ目を生み出しうる
なぜなら、この記事の基点は前回の記事のコメント欄だからである。私は大いに彼ら『はてブuser感謝すべきだ。否、感謝いたします。また、私は記事をはてな匿名ダイアリーアップロードする以上の労力を行っていない。最初にブックマークした人間コメントを書いた人間ブックマーク欄の記事要約を整理した人間は大いに賞賛されるべきだ。否、賞賛致します。彼らの力で私の記事が100overのuser表示となったのだから。私が新しい種類の共同作業を行えた事に深い感慨を得たことは紛れも無い事実だ。

故に、必然的に、絶対的に、5つ目を生み出す可能性は『はてブ』にはあるはずなのです。

はてブ』の未来は、スバラシゲ満ち溢れてますよ!


20:02:05 - 2006/12/09(土)

ブックマークコメントによりタイトル修正。

18:15:30 - 2006/12/10(日)

ブックマークコメントにより、3章の文末にXMLに関する文章を追加。多謝。

ログイン ユーザー登録
ようこそ ゲスト さん