「state」を含む日記 RSS

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

2007-10-26

ブックマークスパム多重アカウント疑惑(関西暴力団アダルトサイト)

アカウントを大量に所持し、ブックマークスパムを繰り返して情報操作を行っているとの疑惑について。

 

ソース

http://b.hatena.ne.jp/entry/http://5.movie-connection.com/

 

同一人物が管理運用ブックマークをつけていると思われるユーザーIDは以下の通り。

id:yh4a1uj4r2ew id:kelopa id:xn--icktho51ho02a id:jk23d1sx id:kd1321ks3241 id:ldf132d11h1h id:z1sx12tfd3g1h id:juhytfsdsadgh id:udfhfkrio id:srtyukrgnyujk id:ojkhfetybjhji id:ohgtyihgdryu id:lapvnfdkxsldie id:lphybcgfn id:adeftgvmkhg id:dkfjfureydkdlcjdh id:yglpsjeyfg id:ijuyvnfjko id:yutydfre id:ueowidkei id:uloijeiss id:ieowicvkhjl id:kiebjieudls id:iueiwodjbmf id:utiuyeowos id:ioiojfibalsieu id:uurwoisoigbm id:lakaiajaigiekwl id:iuwoiunolzzxc id:uaoiuveullsiu id:hilineosilew id:hy4a654yer id:kisiritooru id:bh6s34 id:hs3s4 id:sd3gf35 id:dtbghj354 id:sfgsfg5 id:fsgs5646f id:dgsf5453 id:adf3a432aa id:af3432sss id:af34a34a id:aef4afae id:dfae324adef id:fae456ae id:fgaera4654ae id:fatre354adf id:agfa3245atae id:gafea4854s3r id:fata6541aga id:agaw32456afga id:aea453165g id:a6544a id:gae52487r id:gae284tg id:gfaefa8543ht56f id:ws21496af id:hgara354ga id:hseg5154f id:ada254f id:dae326a id:dsf6454sfd id:dfs654654sdf id:jah4785 id:anj1458 id:hajba54716 id:dafh478549 id:ajdk14785 id:dh215 id:dh21485 id:dj54ds5 id:ys65 id:nsd1485 id:bhs1th8545 id:syh5 id:sth18 id:hth51 id:hs24t8 id:h8t4hg5 id:jdydt8452s id:fa414a7yh5 id:a464ag5 id:a4189j1a45 id:hs34h654a id:s65ts54hg id:a654ya id:a68t4a8a46a id:aga56444ga id:a64a5at4r id:g23r6s2s id:sa5546y6a id:ju54a56sa id:ha56ag64a id:at568421sae id:ae5234afre id:yws35t25a56 id:ga5g24e42d id:j7j54g8 id:yjs6t581f id:ts515gt8 id:shj321js5r7 id:sjs4851s2 id:js24sh16 id:je6a15ta21 id:shj3549s id:jhs548s35 id:shs95s47 id:shs54s54 id:sys54sy54 id:sh24158hs id:stsrs547s id:str5s47 id:sts548 id:sr514h2s5 id:sg5rg5487s id:s5rtsf4578 id:htrsg548 id:srsag9544s id:hs54s87h id:hjsr51s56 id:hsfsg484s id:ggg48 id:f2r4t25f1 id:ik1gtf5y5 id:ta64a2eerr id:ya6y4a21y487a id:a654y2a34a id:ayt67a4ewe5 id:yfag56a15ewr63 id:a64a524rehgy3 id:ua327a3a id:uhwe354gt4r id:aekds34a1r54a id:h674atat id:hay64e314w id:yayuh354a31a id:a56a065syt0a id:g0a6544ae56e0 id:a655ya15ea id:dk6ldk3sdk id:dtu6fj63dhs id:druik5kdgt id:g6gd52cud id:fkuf34gk id:fogvk3fiuy5 id:jdshb25hdsjh3s id:dst6hjdsh5h id:dj5dhjs5dsh id:jdf5dj5d id:djjdsh52dj id:shs64jhs id:h56dj65sh id:jdt3jdsh id:shsth5dh id:shs5hshs id:hjsr1465s id:h3s343 id:sdjszf34sauj id:hargf8ahg id:hsaar3setat id:arg2srggarr id:jhs56dhs id:taa354ha id:gsar34sga id:hara6agar id:gafg63gha id:hsfdh3zh id:aghs6ga id:yhxd52gh id:arett3agta id:fga63rfgas id:asarg3agtg id:sg6a id:agtta52sgha id:aa6hatta id:jysrah5shsra id:ash5gfa id:gadaf2atgta id:atr4hsfda id:hsr35hggar id:jyesr35ad id:dga5ata id:ae2satf id:hga57shye id:hhy54 id:ar35454a id:ae6354sarr id:ueko22toteti id:ueko21toteti id:ueko20toteti id:ueko19toteti id:ueko18toteti id:ueko17toteti id:ueko16toteti id:ueko15toteti id:ueko14toteti id:ueko13toteti id:ueko12toteti id:ueko11toteti id:ueko10toteti id:ueko09toteti id:ueko08toteti id:ueko07toteti id:ueko06toteti id:ueko05toteti id:ueko04toteti id:ueko03toteti id:ueko02toteti id:ueko01toteti id:uttyann137 id:uttyann136 id:uttyann135 id:uttyann134 id:aea34g34 id:uethy234 id:sj684stt8dgh4 id:uttyann122 id:uttyann120 id:uttyann130 id:uttyann133 id:uttyann132 id:uttyann131 id:uttyann129 id:uttyann128 id:uttyann127 id:uttyann126 id:uttyann125 id:uttyann124 id:uttyann123 id:uttyann121 id:uttyann119 id:uttyann117 id:kye851dj4d id:asjdyj541dsu id:ijkfd48415 id:sjhty5445d id:jfsj8yx5yy4 id:hs5741a5 id:hid3543ik id:e7g3avc1h3s id:af34a354fa4 id:hsth5723 id:ghs9845s id:fsr84sg145 id:adfa18fgs2 id:da354ga id:g345ag id:hg54gj5 id:gjs354s1 id:ahotte47484 id:afa84727h id:aaa5454awg id:d4f75hgd4 id:gh75h8d4 id:s6d5c9 id:s427a8s7 id:f417f82g5 id:zz9578zgf id:f45f478z id:f454f4599 id:fdfdf8479 id:fsdfg245 id:hikken id:kuro_utopia id:yuri_hanataba id:toge_hitoki id:kuroi_maria id:syounen_boy id:spray_de_egaita id:nite_and_day id:like_a_angel id:kuro_no_postol id:sea_you id:beams_ah_beams id:yasashii_higeki id:ice_my_life id:for_dear id:mac_wo_kiwameru id:powerbook_g id:my_win_good id:my_mac_saikou id:wansegu_yoi id:selves_xxxx id:in_sairensu id:dezaia_l id:end_obu_sorrow id:ra_se_n id:g_god_g id:wizu_rabu id:fakexxxx id:civilize_luna id:feisu_to_feisu id:inoran_ken id:true_b id:call_for_love id:ueto_dakishime id:ueto_kiss id:ueto_renai id:genki_c id:hutsuka_yoi id:atama_itai id:orona_min_c id:kasaneta_kuti id:kasaneta_yubi id:queen_for_you id:mist_of_tears id:hatujouki id:more_trance id:risoukyou id:shilk_shilk id:last_eve_for id:equal_jesus id:sutekina_yume id:i_believe_y id:tsuki_wo_omou id:chess_chess id:nugget id:karatani id:cocoron20 id:kami_ga_warau id:the_slain id:kagirinaku_t id:shade_shade id:branch_road id:samdhi_taimu id:taimu_izu id:precious_xxxx id:decide_ones id:ima_ha_fate id:hurry_up_mode id:milmilmilmil id:ayapon565

 

多重アカウントを所持しブックマークスパムを支持していると思われる業者のドメイン(の一部)はこれ。

 

high.movie-connection.com

5.movie-connection.com

4.movie-connection.com

2.movie-connection.com

1.movie-connection.com

www.movie-connection.com

xn--cck0cya3lt22posxn4qgqh.movie-connection.com

www.movie-connection.com

azuqun.blog103.fc2.com

mlink.blog111.fc2.com

eroikoeroiko.eroiko-daisuki.com

sexs.sex-sexs.net

de.coco-de-aeru.net

ero.ero-moe.net

xn--n8j214gc5b6wwz3a.sblo.jp

xn--h9ja3mb0426g1hwa.sblo.jp

ブックマークスパムによる情報操作を発注していると思われるMOVIE-CONNECTION.COMについての情報分析。

Domain Name: MOVIE-CONNECTION.COM
Registrar: KEY-SYSTEMS GMBH 
Whois Server: whois.rrpproxy.net 
Referral URL: http://www.key-systems.net 
Name Server: NS1.VALUE-DOMAIN.COM 
Name Server: NS2.VALUE-DOMAIN.COM 
Name Server: NS3.VALUE-DOMAIN.COM 
Status: ok 
Updated Date: 15-mar-2007 
Creation Date: 15-mar-2007 
Expiration Date: 15-mar-2008 
DOMAIN: MOVIE-CONNECTION.COM 
RSP: DigiRock Inc. 
URL: http://www.value-domain.com 
created-date: 2007-03-15 
updated-date: 2007-03-15 
registration-expiration-date: 2008-03-15 
owner-contact: P-TGK215 
owner-organization: Personal 
owner-title: student 
owner-fname: takahiro 
owner-lname: kubo 
owner-street: koyama1-1-5 None 
owner-city: koubesinisiku 
owner-state: hyougo-to 
owner-zip: 651-2144 
owner-country: JP 
owner-phone: 090-1005-6622
owner-email: gongongon1221@yahoo.co.jp 
admin-contact: P-TGK215 
admin-organization: Personal 
admin-title: student 
admin-fname: takahiro 
admin-lname: kubo 
admin-street: koyama1-1-5 None 
admin-city: koubesinisiku 
admin-state: hyougo-to 
admin-zip: 651-2144 
admin-country: JP 
admin-phone: 090-1005-6622 
admin-email: gongongon1221@yahoo.co.jp 
tech-contact: P-TGK215 
tech-organization: Personal 
tech-title: student 
tech-fname: takahiro 
tech-lname: kubo 
tech-street: koyama1-1-5 None 
tech-city: koubesinisiku 
tech-state: hyougo-to 
tech-zip: 651-2144 
tech-country: JP 
tech-phone: 090-1005-6622 
tech-email: gongongon1221@yahoo.co.jp 
billing-contact: P-TGK215 
billing-organization: Personal 
billing-title: student 
billing-fname: takahiro 
billing-lname: kubo 
billing-street: koyama1-1-5 None 
billing-city: koubesinisiku 
billing-state: hyougo-to 
billing-zip: 651-2144 
billing-country: JP 
billing-phone: 090-1005-6622 
billing-email: gongongon1221@yahoo.co.jp 
nameserver: ns1.value-domain.com 
nameserver: ns2.value-domain.com 
nameserver: ns3.value-domain.com 

<<

どうやらブックマークスパムの元締め関係者は、神戸市西区小山クボタヒロという人らしい。(偽名の可能性あり)

なお、登録されている電話番号は090-1005-6622だが、この電話番号でググルとこの出会い系サイト利用規約に書いてある電話番号と完全に一致する。

 

http://72.14.235.104/search?q=cache:tjQsEzlAt-UJ:love-ag.com/use.html

<第1条> 目的

規約は会員が無料コンテンツサービス[LOVEアゲイン](以下、弊社又は当サイト)を利用する上で遵守すべき規約を定める事を目的とします。 個人間で発生したトラブルには一切の責任を負いかねます。

(略)

【管理主】〒542-0067 大阪府大阪市中央区松屋町9-20

管理者:木村勇登

TEL:090-1005-6622

MAIL:info@love-ag.com

さらにこのlove-ag.comというドメインWhois検索するとこういう情報が出てくる。

 

Domain Name: LOVE-AG.COM 
Registrar: ENOM, INC. 
Whois Server: whois.enom.com 
Referral URL: http://www.enom.com 
Name Server: NS1.LOVE-AG.COM 
Name Server: NS2.LOVE-AG.COM 
Status: clientTransferProhibited 
Updated Date: 23-oct-2007 
Creation Date: 04-oct-2007 
Expiration Date: 04-oct-2008 
Domain name: love-ag.com 
Registrant Contact: 
personal 
masasi odazima (iyaiyatereruna@yahoo.co.jp) 
+80.52368569 
Fax: - 
aogakidai 1-3 none 
nara-shi, nara-ken 631-0053 
JP 
Administrative Contact: 
personal 
masasi odazima (iyaiyatereruna@yahoo.co.jp) 
+80.52368569 
Fax: - 
aogakidai 1-3 none 
nara-shi, nara-ken 631-0053 
JP 
Technical Contact: 
personal 
masasi odazima (iyaiyatereruna@yahoo.co.jp) 
+80.52368569 
Fax: - 
aogakidai 1-3 none 
nara-shi, nara-ken 631-0053 
JP 
Status: Locked 
Name Servers: 
ns1.love-ag.com 
ns2.love-ag.com 

ドメイン奈良県奈良市青垣台のオダジママサシなる人物が管理しているらしい。(やはり偽名の可能性あり)

 

以上の情報から分析すると、数十のアダルトサイトを同時に運用している組織による情報操作であることから、前述の疑惑はてなIDは、関西組織暴力団関係者によって運用されている可能性は極めて高いと思われる。

2007-07-30

anond:20070730135823

そら日本共産党の俺違うよ理論もとい独自解釈だ。"Communist State"と呼ばれる国家普通にあった・ある。それが日本語ではhogehoge社会主義共和国となぜか訳されてたりするんだが。共産主義目標として掲げて第一歩としての社会主義確立をはかった(と標榜した)国家ごろごろしてる。

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-07-11

めいろさくせーぷろぐらむつくってみたー

http://anond.hatelabo.jp/20070711013155

人待ちの間暇だったから作ってみたよー。

さっくり作ったから無駄が多い気がするけど、とりあえず動いた。

全体が埋まったかどうかの判定をしないでひたすらまわしまくってるし、なんか綺麗な形じゃないけど、とりあえず投稿しちゃうよ!

これ綺麗な形にするの結構難しいんじゃないかな。面白いね。

class Maze
	class Box
		WALL = 0
		LOAD = 1
		def initialize(state = LOAD)
			@state = state
		end
		def is_wall?
			return true if @state == WALL
			false
		end
		def is_load?
			return true if @state == LOAD
			false
		end
		def set_wall
			@state = WALL
		end
		def set_load
			@state = LOAD
		end
	end
	TOP = 10
	RIGHT = 11
	BOTTOM = 12
	LEFT = 13
	def initialize(height = 100, width = 60)
		@height = height
		@width  = width
		@data = Array.new
		self.fillbox
		@counter = 1000
		@root = Array.new
	end
	def choose_random
		return rand(@width-3)+1, rand(@height-3)+1
	end
	def choose_direct
		t = rand(4)+10
		return t
	end
	def move(x, y, t)
		new_x = x
		new_y = y
		case t
		when TOP
			new_y -= 1
		when RIGHT
			new_x += 1
		when BOTTOM
			new_y += 1
		when LEFT
			new_x -= 1
		end
		return new_x, new_y
	end
	def make_load?(x, y)
		return false if x < 0 or y < 0 or x > @width-1 or y > @height-1
		return false if @data[x][y].is_load?
		true
	end
	def dead_end?(x, y, t)
		case t
		when TOP
			if make_load?(x-1, y) and \
				 make_load?(x-1, y-1) and\
				 make_load?(x, y-1) and\
				 make_load?(x+1, y-1) and\
				 make_load?(x+1, y) then
				 return false
			end
		when RIGHT
			if make_load?(x, y-1) and \
				 make_load?(x+1, y-1) and\
				 make_load?(x+1, y) and\
				 make_load?(x+1, y+1) and\
				 make_load?(x, y+1) then
				 return false
			end
		when BOTTOM
			if make_load?(x-1, y) and \
				 make_load?(x-1, y+1) and\
				 make_load?(x, y+1) and\
				 make_load?(x+1, y+1) and\
				 make_load?(x+1, y) then
				 return false
			end
		when LEFT
			if make_load?(x, y+1) and \
				 make_load?(x-1, y+1) and\
				 make_load?(x-1, y) and\
				 make_load?(x-1, y-1) and\
				 make_load?(x, y-1) then
				 return false
			end
		end
		true
	end
	def check_all?(stack)
		for i in TOP..LEFT do
			return false if !stack.include?(i)
		end
		true
	end
	def extend(x, y)
		@data[x][y].set_load
		check_stack = Array.new
		loop do
			t = choose_direct
			check_stack << t
			new_x, new_y = move(x, y, t)
			if enable_new_point?(new_x, new_y)
				if !dead_end?(new_x, new_y, t) then
					@root << ["ex", new_x, new_y, t]
					extend(new_x, new_y)
					break
				end
			end
			break if check_all?(check_stack)
		end
	end
	def enable_new_point?(x, y)
		return false if x<=0 or y <= 0 or x > @width-1 or y > @height-1
		return false if @data[x][y].is_load?
		true
	end
	def _make
		x = y = 0
		loop do
			x, y = choose_random
			break if @data[x][y].is_load?
		end
		@root << [x,y]
		extend(x, y)
	end
	def make_goal
		x = @width - 2
		y = @height - 1
		for i in 1..@width-3
			if @data[x-i][y-1].is_load? then
				@data[x-i][y].set_load
				break
			end
		end
	end
	def make_start
		for i in 1..@width-3
			if @data[i][1].is_load? then
				@data[i][0].set_load
				break
			end
		end
	end
	def make
		self.fill_all
		x, y = choose_random
		@root << [x,y]
		@data[x][y].set_load
		extend(x,y)
		while(!is_fill?) do
			_make
		end
		make_goal
		make_start
		self
	end
	def is_fill?
		@counter -= 1
		return true if @counter < 0
		false
	end
	def fillbox
		for i in 0...@width do
			@data[i] = Array.new
			for j in 0...@height do
				@data[i][j] = Box.new
			end
		end
	end
	def fill_all
		for i in 0...@width do
			for j in 0...@height do
				@data[i][j].set_wall
			end
		end
	end
	def output
		for i in 0...@height do
			for j in 0...@width do
				if @data[j][i].is_wall? then
					print "#" 
				else
					print " "
				end
			end
			print "\n"
		end
	end
end

Maze.new(30, 30).make.output

## output

# ############################
#  ##    # #     ##    #     #
##    ##   ## ## #  ##   ### #
### #  ###  #  #   #### ###  #
#   # ## ## ## ### #  #  #  ##
### #  #  #  #   #### ## # ###
##  ## ## ## ###   #  ## #   #
#  ### #  #   #### # ##  ## ##
# ## #   ####    #    # ###  #
#  # ###  # #### # ## # #   ##
##     ## #      #  ### ######
######  ### #######   ###    #
#    ##   ###   # # #   ## # #
# #######  #  # # # ###  ### #
#   # # ##   ##   #   ##   # #
### #    ######## ########   #
#   # ## ##     #    #     ###
# ### ##  ## ##   ##   ##### #
#      ##  # #  #  ###  #    #
# ######## # #####   ## # # ##
#       ## #  #  #####  # #  #
####### #  ## # ## #   ## ## #
##    ### ###   ##   ####### #
#  ##  ##   ## ##  ###    ## #
# ####  ###  # #  ## # ##    #
#  # ##   ## # # ###    ######
## #  # #  # # #   ## #    ###
#    ## ## #   # #  # # ##  ##
# # ##  ##   # # ##   #  ##  #
########################### ##

はてなスターソースコードの最後に更新履歴が載ってた

2007-07-11 v1.2 Release version

2007-05-30 v1.1 Added fold stars feature

2007-03-29 v1.0 Changed screens using Ten.SubWindow, you can d&d!

2007-03-28 v0.9 Changed Hatena.* classes to Ten v0.05.

2007-03-25 v0.8 Fixed Safari popup problem

2007-03-22 v0.7 Added active state to comment buttons

2007-03-21 v0.6 Added Comment function

2007-03-05 v0.5 Changed uri to Ridge-based paths.

2007-01-24 v0.4 Added Hatena.Diary.Entry class,

Changed Hatena.Star.Entry methods using class method

Added author parameters.

2007-01-23 v0.3 Added Hatena.Star.User class, added Hatena.js, Hatena.Star.js compatibility

2007-01-06 v0.2 Changed name spaces. Using Hatena.*, Hatena.Star.*

2007-01-05 v0.1 Initial version

4月前に大体出来てたって事かな

2007-04-08

http://anond.hatelabo.jp/20070408152058

http://www.sitnews.us/HowardDean/060104_dean.html

Electronic Voting - Not Ready For Prime Time

By Howard Dean

June 01, 2004

Tuesday

In December 2000, five Supreme Court justices concluded that a recount in the state of Florida's presidential election was unwarranted. This, despite the desire of the Florida Supreme Court to order a statewide recount in an election that was decided by only 537 votes. In the face of well-documented voting irregularities throughout the state, the U.S.

Supreme Court's decision created enormous cynicism about whether the votes of every American would actually be counted. Although we cannot change what happened in Florida, we have a responsibility to our democracy to prevent a similar situation from happening again.

Some politicians believe a solution to this problem can be found in electronic voting. Recently, the federal government passed legislation encouraging the use of "touch screen" voting machines even though they fail to provide a verifiable record that can be used in a recount. Furthermore, this equipment cannot even verify as to whether a voter did indeed cast a ballot for their intended candidate. Unfortunately, this November, as many as 28% of Americans - 50 million people - will cast ballots using machines that could produce such unreliable and unverifiable results.

Only since 2000 have touch screen voting machines become widely used and yet they have already caused widespread controversy due to their unreliability. For instance, in Wake County, N.C. in 2002, 436 votes were lost as a result of bad software. Hinds County, Miss. had to re-run an election because the machines had so many problems that the will of the voters could not be determined. According to local election officials in Fairfax County, Va., a recent election resulted in one in 100 votes being lost. Many states, such as New Hampshire and most recently Maine, have banned paperless touch screen voting and many more are considering doing so.

Without any accountability or transparency, even if these machines work, we cannot check whether they are in fact working reliably. The American public should not tolerate the use of paperless e-voting machines until at least the 2006 election, allowing time to prevent ongoing errors and failures with the technology. One way or another, every voter should be able to check that an accurate paper record has been made of their vote before it is recorded.

Both Democrats and Republicans have a serious interest in fixing this potentially enormous blow to democracy. A bipartisan bill, sponsored by Rep. Rush Holt (D-N.J.), is one of several paper trail bills in the House and Senate and it should be passed as soon as possible. A grassroots movement for verified voting, led by organizations like VerifiedVoting.org, is gaining momentum nationwide.

There is nothing partisan about the survival of our democracy or its legitimacy. We cannot and must not put the success of one party or another above the good of our entire country and all our people. To the governments of the fifty states, Republican or Democrat, I ask you to put paperless e-voting machines on the shelf until 2006 or until they are reliable and will allow recounts. In a democracy you always count the votes no matter who wins. To abandon that principle is to abandon America.

電子投票---表舞台にはまだ早い」

(Electronic Voting - Not Ready For Prime Time

by ハワードディーン

2000年12月、連邦最高裁の5人の判事は、フロリダ州大統領選挙投票の数えなおしは是認できないと結論するに至った。この決定により、フロリダ州最高裁が州内全ての投票の数えなおしを要求したにもかかわらず、僅か537票差で勝敗を決定する大統領選挙を生み出すことになったのだ。州内での選挙不正に関する明確な情報に直面して、合衆国の最高司法の決定は、全てのアメリカ人投票が実際に数えられるかどうかについて重大な不信感を作り出した。フロリダ州で起こったことを今更ひっくり返すことはできないが、同じ事態が再び起こることを防ぐために、私たちは民主主義に対する責任を負っている。

政治家の中には、この問題を解決する答えは電子投票にあると信じる者もいるようだ。最近連邦政府は、「タッチスクリーン投票機の利用を促進する法案を成立させたが、当の電子投票システムは票集計内容を記録する機能を持たないために、票の再集計ができない。さらに、その電子投票機は、投票者が本当に希望する候補者投票したかどうかを確認する機能すら持たないのだ。あいにく、今年11月には、アメリカ国民の内28%、約5,000万人が、その電子投票システムを利用することになるわけで、信頼できない不確実な投票結果が生じる可能性がある。

2000年に利用されはじめたばかりのタッチスクリーン電子投票システムは、利用が拡大するにつれ、信頼性の欠如による問題を発生させている。例えば、ノースカロライナ州ウェイク郡では、2002年に、ソフト不具合により436票が消失している。ミシシッピー州ハインズ郡では、投票機のトラブルが多すぎて有権者投票できず、選挙そのものをやり直すことになった。ヴァージニア州フェアファックス選挙管理担当者によれば、最近選挙では100人につき1人の票が消失していたそうだ。多くの州では、ニューハンプシャー州メーン州の例のように、紙の記録を残さない(ペーパーレスタッチスクリーン投票機の利用を禁止することになり、他の州でも同様の決定を行う計画であるという。

信頼性も透明性も欠如している状況では、いくら機械が動作しても、正しく動作しているのかどうかを検証することができない。アメリカ国民は、少なくとも進行中の不具合技術的失敗の防止に必要な時間を確保するため、2006年選挙までは、ペーパーレス電子投票機の利用を容認すべきではないのである。なんとしてでも、全ての有権者が、投票が集計される前に、自分の投票内容を、正確な紙の記録を残すことによって確認できるようにすべきであろう。

民主党支持者も共和党支持者も、この民主主義に対する重大な打撃となる可能性を修正することに、真剣に取り組もうとしている。ラッシュ・ホルト議員(ニュージャージ議員/民主党)の提出した超党派の法案は、紙の記録を求める法案のひとつだが、できるだけ早く議会で承認されるべきであろう。VerifiedVoting.orgなどの組織によって活発化している、確認可能な投票システムを支持する草の根活動は、国民全体の機運に適ったものなのである。

私たちの民主主義や分別を存続することは、党派には無関係である。国民国家全体の価値以上に、片方の党派の成功を優先するようなことはできないし、してはならない。50州をまとめる政府として、共和党員・民主党員のどちらに対しても、2006年まで、あるいは充分に信頼できる状態で再集計が可能になる日まで、ペーパーレス電子投票機を箱に収めたままにしておくことをお願いしたい。誰が勝利しようと、民主主義の下では全ての票は数えられるべきなのである。その基本原則を廃止することは、アメリカを捨てることと同じだ。

ブッシュ大統領選挙には以前からイカサマ疑惑ささやかれています。

フロリダ州電子投票機に「ブッシュ票が多すぎる」との疑惑

http://headlines.yahoo.co.jp/hl?a=20041119-00000001-wir-sci

不正が横行するアメリカ大統領選挙

http://tanakanews.com/e1008election.htm

大手メディアが伝えない大統領選挙不正調査

http://hiddennews.cocolog-nifty.com/gloomynews/?06150300

アメリカ正義の国で悪い人は一人もいませんので、私はこんな話は信じませんが、みなさんはどう思いますか?

ブッシュはイカサマ師で、腰巾着小泉氏は国家の恥 250

腰巾着国家の恥ではないが髪型が個人的恥 19

恥ではない。犯罪である。(腰巾着が) 23

恥ではない。犯罪である。(髪型が) 9

どうでもいいけどたかがネットワーカーにこんなことを言われる筋合いはない。 64

黒田さんと東野幸治は別人である。 135

2007-01-08

症候的分類に基づくハルヒの病跡学(インチキ)

http://anond.hatelabo.jp/20070107222255

 

ハルヒの作中パーソナリティをみる限り、発症するなら統合失調症じゃないような気がする。それと、言っている内容はかなり妄想めいてはいるんだけど、「自分が電波を受信する」「自分に入ってくる」ような自我障害は認められない((ただし、DSM導入後、シュナイダーの一級症状としての自我障害が統合失調症に特異的な症状であるという見解に疑問符はついているが))から、統合失調症妄想臭さを感じないんだよなぁ。彼女は、自分はまともで周りに面白い人がやってくると期待しているけれど、統合失調症妄想なら、もっと自分にまつわる体験を妄想するような気がするんですよ。

 

・もうちょっと影のある性格なら、(何でも出来るのは親の自己愛を備給する為のスーパーガールとして詰め込まれたからという設定で)境界性人格障害系列のメンタリティを持っているって話になるんだけど、それにしては屈託が無さ過ぎる。

 

・じゃあボーダーっ気の無い自己愛パーソナリティ障害の可能性ならあるかもしれない?

 →キメるべき肝心な場面では自分と対象との区別がしっかり出来ているのがなぁ。団員を自分の手足のようにコキ使う態度や「超監督」などと名乗るメンタリティはいかにも自己愛パーソナリティ障害っぽいんだけど、もっと、「私をみてみてみてみてみて!」とか「団員への心配りの無い冷淡さ」とか「私が楽しければ他の団員が楽しくなくない状況は無視」ってところがまだ弱いか。

 

結論:現時点では病気っぽさが無い。敢えていくなら自己愛パーソナリティ障害のケがある?

 

 

 あ、そうだ。双極性障害を忘れていた。軽躁状態??軽い鬱状態の巡回するハルヒ、か。これなら無理やりこじつけられるか。脱抑制や観念奔逸を呈する手前ぐらいの、ごく軽いhypomanic stateとみるなら、一応当てはめられないことはない。でもこじつけチック過ぎるなぁ。やっぱり駄目だどれも上手く当てはまらないなぁ。

 

 

 

 別に当てはまらなくてもいいよ、そんなの。

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