<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://let.hatelabo.jp/lieutar/rss">
    <link>https://let.hatelabo.jp/lieutar/rss</link>
    <description></description>
    <title>Bookmarklets from lieutar</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/hLHXw5OyhaIv"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/hJmdq7L4gqQm"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/hJmdzYPc-8VX"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/hJmd7ouP1951"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/hJmdtq-R4LcT"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/hLHVsZr6oIlk"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/hLHUqPvRvJQh"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/gYC-y6mnio2MGA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/gYC-x5zT_JWBOA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/gYC-x6Sd-5-fOg"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/gYC-y5v_lOSpCw"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/gYC-x5v27O2TXg"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/gYC-y5HznpPGYQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/gYC-x4S4-tOCPw"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/lieutar/let/gYC-x4T176C2Kg"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/hLHXw5OyhaIv">
    <link>https://let.hatelabo.jp/lieutar/let/hLHXw5OyhaIv</link>
    <dc:date>2017-08-25T11:45:39Z</dc:date>
    <description>メタブ表示</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] メタブ表示</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FhLHXw5OyhaIv.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;メタブ表示&lt;/a&gt;&lt;pre&gt;// ==UserScript==
// @name        メタブ表示
// @description メタブ表示
// @include     http://b.hatena.ne.jp/*
// ==/UserScript==

/*
 * @title メタブ表示
 * @description メタブ表示
 * @include http://b.hatena.ne.jp/*
 * @license MIT License
 * @require 
 */
////
(function(){

  ////////////////////////////////////////////////////////////
  var win = this,
      doc = this.document,
      loc = this.location,
      con = this.console;
  var gm  = typeof(win.GM_info) === 'undefined';
  var setTimeout = this.setTimeout;

  var DEBUG        = true;

  ////////////////////////////////////////////////////////////

  var HATEB_DOMAIN = &amp;quot;http://b.hatena.ne.jp&amp;quot;;
  var API_DOMAIN   = &amp;quot;//b.hatena.ne.jp&amp;quot;;
  var ICON_DOMAIN  = &amp;quot;http://cdn1.www.st-hatena.com/users/&amp;quot;;
  var JSONP_MAX_BYTES = 1800;
  var LOADING_GIF     = HATEB_DOMAIN + '/images/loading.gif';

  ////////////////////////////////////////////////////////////
  var CSS = [
    '.metab-popup-locker {',
    '  position:   fixed;',
    '  top:        0px;',
    '  left:       0px;',
    '  width:      100%;',
    '  height:     100%;',
    '  z-index:    9000;',
    '  background: rgba(0,0,0,0.25);',
    '}',
    '.metab-popup {',
    '  height:        90%;',
    '  width:         600px;',
    '  margin:        2.5% auto;',
    '  padding:       10px;',
    '  border-radius: 20px;',
    '  overflow:      auto;',
    '  background:    #F8F8F8;',
    '}',
    '.metab-container {',
    '  margin:        5px;',
    '  padding:       5px;',
    '  border: solid   #9CF 1px;',
    '  border-radius: 10px;',
    '}',
    'ul.bookmark-list &amp;gt; li &amp;gt; .metab-container {',
    '  max-height: 600px;',
    '  overflow: auto;',
    '}',
    '.metab-container &amp;gt; .metab-title &amp;gt; .title{',
    '  display:   inline-block;',
    '  margin:    0px 10px 0px 0px;',
    '  font-size: 11px;',
    '  color:     #69F;',
    '}',
    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.head-part &amp;gt;  .metab-count, ',
    '.metab-container &amp;gt; .metab-title &amp;gt; .metab-count{',
    '  font-size:        10px;',
    '  font-weight:      900;',
    '  color:            #F00;',
    '  background-color: #FCC;',
    '  display:          inline-block;',
    '  text-decoration:  none;',
    '  line-height:      12px !important;',
    '  padding:          2px;',
    '  margin:           10px 0px;',
    '}',
    '.metab-container &amp;gt; .metab-title &amp;gt; .metab-count-detail{',
    '  display:   inline-block;',
    '  margin:    0px 10px;',
    '  font-size: 11px;',
    '  color:     rgb(153, 153, 153);',
    '}',
    '.metab-container &amp;gt; ul{',
    '  display: block;',
    '  margin: 0px;',
    '  padding: 0px;',
    '}',
    '.metab-container &amp;gt; ul &amp;gt; li{',
    '  margin:        0px;',
    '  padding:       11px 0px 11px 30px;',
    '  border-bottom: solid #CCC 1px;',
    '}',
    '.metab-container &amp;gt; ul.comments &amp;gt; li{',
    '  width:      auto !important;',
    '  display:    block;',
    '  list-style: none;',
    '}',
    '.metab-container &amp;gt; ul.no-comments &amp;gt; li{',
    ' width:      auto !important;',
    ' margin:     0px 11px 0px 0px;',
    ' border:     none;',
    ' list-style: none;',
    ' display:    inline-block;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.head-part &amp;gt; a.profile-icon {',
    '  margin-left: -30px;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.head-part &amp;gt;  a.profile-icon &amp;gt; img{',
    '  width:  24px;',
    '  height: 24px;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.head-part &amp;gt;  a.username{',
    '  font-size: 12px;',
    '  display: inline-block;',
    '  margin:  0px 11px;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt;  span.tags{',
    '  display: inline-block;',
    '  margin:  0px 11px 0px 0px;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.comment{',
    '  font-size: 12px;',
    '}',

    '.metab-container .user-comment-meta{',
    '  font-size: 11px;',
    '  color: rgb(153,153,153);',
    '}',
    '.metab-container a{',
    '  color: rgb(0, 143, 222);',
    '}',
    '.metab-container a.user-comment-link {',
    '  background-image: url(&amp;quot;/images/v3/comment-link.png&amp;quot;);',
    '  background-position: left center;',
    '  background-repeat: no-repeat;',
    '  background-size: 15px 15px;',
    '  color: rgb(153, 153, 153);',
    '  font-size: 11px;',
    '  font-weight: normal;',
    '  margin: 0 8px 0 -1px;',
    '  padding-left: 16px;',
    '  text-decoration: none;',
    '}',
    ''].join(&amp;quot;\n&amp;quot;);

  ////////////////////////////////////////////////////////////
  var PageType = ((function(pn){
    if(pn.match(/^\/entry\//)){
      if(pn.match(/^\/entry\/\d+\/comment\//)) return 'comment';
      return 'entry';}
    return 'other';
  })(String(loc.pathname)));


  ////////////////////////////////////////////////////////////

  var p = function p() {
    if ( !DEBUG ) return;
    con.log.apply(con, arguments);};


  var forEach = function forEach(a,f){
    if(!a) return;
    for (var i=0,l=a.length;i&amp;lt;l;i++){
      if(f(a[i]) === false) break;}};

  var gensym = (function(){
    var rnd = function(){return Math.floor(Math.random() * (1&amp;lt;&amp;lt;30)).toString(16);};
    var cnt = 0;
    var prefix = 'metabsym_' + Date.now().toString(16) + '_' + rnd() + '_';
    return function gensym(){ return prefix + (cnt++).toString(16); };})();

  var receiver = function receiver(cb){
    var name = gensym();
    win[name] = function(){
      delete win[name];
      cb.apply(this, arguments);};
    return name;};


  var jsonp = function jsonp(url, opt){
    var query = '';
    for(var f in opt){
      var v = opt[f];
      if(v instanceof Function) v = receiver(v);
      query += '&amp;amp;' + encodeURIComponent(f) + '=' + encodeURIComponent(v);}
    url += query.replace(/^./, url.match(/\?/) ? '&amp;amp;' : '?');

    var script = doc.createElement('script');
    script.src = url;
    script.type = 'text/javascript';
    doc.querySelector('head').appendChild(script);};


  var elementModifier = function(fun){
    var FLAG = 'httb-modifier-modified';
    return function(n){
      if(n.getAttribute(FLAG)) return null;
      n.setAttribute(FLAG, 'true');
      return fun(n);};};

  ////////////////////////////////////////////////////////////

  var withHatena = function(cb){(function(){
    if(typeof(win.Hatena) === 'undefined'){
      setTimeout(arguments.callee, 100);
      return;}
    cb(win.Hatena);})();};

  var withStar = function(cb){
    withHatena(function(Hatena){(function(){
      if(typeof(Hatena.Star) === 'undefined'){
        setTimeout(arguments.callee, 100);
        return;}
      cb(Hatena.Star, Hatena);})();});};

  var withBookmark = function(cb){
    withHatena(function(Hatena){(function(){
      if(typeof(Hatena.Bookmark) == 'undefined'){
        setTimeout(arguments.callee, 100);
        return;}
      cb(Hatena.Bookmark, Hatena);})();});};

  ////////////////////////////////////////////////////////////

  var withUserInfo = (function(){
    var users = {};
    return function(user, cont){
      var slot = (users[user] || (users[user] = {data: null, cont: []}));
      if(slot.data){
        cont(slot.data, user);
        return;}
      slot.cont.push(cont);
      if(slot.data === false) return;
      slot.data = false;
      var done = 0;
      var rs   = {};
      var Xhr  = win.XMLHttpRequest;
      ['information', 'services'].forEach(function(field){
        var req = new Xhr();
        req.onreadystatechange = function(){
          if(req.readyState !== Xhr.DONE) return;
          rs[field] = req.status == 200 ? req.responseText : '';
          done++;
          if(done &amp;lt; 2) return;
          var div = doc.createElement('div');
          div.innerHTML = rs.information + rs.services;
          slot.data = div;
          slot.cont.forEach(function(cont){cont(slot.data, user);});};
        req.open('GET', 'http://b.hatena.ne.jp/'+user+'/partial.' + field, true);
        req.send();});};})();

  var profileIconUrl = function(user){
    return ICON_DOMAIN + '/' + user.substring(0,2) + '/' + user +
      '/profile_l.gif'; };

  var profileIcon = function(user){
    var a  = doc.createElement('a');
    a.href      = HATEB_DOMAIN + '/' + user + '/';
    a.target    = '_blank';
    a.title     = user;
    a.className = 'profile-icon';
    var icon = doc.createElement('img');
    icon.src = profileIconUrl(user);
    icon.alt = user;
    a.appendChild(icon);
    return a; };


  ////////////////////////////////////////////////////////////
  var PageEid = (function(){
    var ucl = doc.querySelector('a.user-comment-link');
    if(!ucl) return null;
    return String(ucl.href).replace(/^\/entry\//,'').replace(/\/comments\/.*/,'');});

  var domifyIcon = function(bm){
    return profileIcon(bm.user);};

  var domifyUsername = function(bm, entry){
    var a  = doc.createElement('a');
    var date    = String(bm.timestamp).replace(/ .+$/,'').replace(/\//g,'');
    a.href      = '/' + bm.user + '/' + date + '#bookmark-' + entry.eid ;
    a.target    = '_blank';
    a.title     = bm.user;
    a.className = 'username';
    a.appendChild(doc.createTextNode(bm.user));
    return a;};

  var domifyUsermetab = function(bm, entry){
    var ph = doc.createElement('span');
    ph.className = 'user-metab-ph';
    ph.setAttribute('title', bm.user);
    return ph;};

  var domifyTags = function(bm){
    var tags = bm.tags || [];
    if(tags.length &amp;lt; 1) return doc.createDocumentFragment();
    var tagSpan = doc.createElement('span');
    tagSpan.className = 'tags';
    forEach(tags , function(tagName){
      var tagLink = doc.createElement('a');
      tagLink.className = 'user-tag';
      tagLink.href =
        HATEB_DOMAIN + '/' + bm.user + '/' + encodeURIComponent(tagName);
      tagLink.appendChild(doc.createTextNode(tagName));
      tagSpan.appendChild(tagLink);});
    return tagSpan;};

  var domifyComment = (function(){

    var reURL = (function(){
      var RE_HEX    = '%[a-fA-F0-9][a-fA-F0-9]';
      var RE_SCHEME = '[a-z]+:';
      var RE_CHAR   = '(?:[a-zA-Z0-9\-_\.]|' + RE_HEX + ')';
      var RE_STR    = RE_CHAR + '+';
      var RE_STR0   = RE_CHAR + '*';
      var RE_HOST   = RE_STR;
      var RE_PATH   = '(?:/(?:' + RE_STR + '/)*' + RE_STR0 + ')';
      var RE_QV     = RE_STR0 + '=' + RE_STR0;
      var RE_QUERY  = '(?:\\?(?:(?:' + RE_QV + '&amp;amp;)*'+RE_QV+')?|'+RE_QV+')';
      var RE_HASH   = '(?:#' + RE_STR0 + ')';
      var RE_URL    = 'https?://' + RE_HOST + RE_PATH +'?' +
            RE_QUERY + '?' + RE_HASH + '?';
      return  new RegExp('(.*?)(' + RE_URL + ')(.*)');
    })();

    return function(bm){
      var comment = bm.comment;
      var R = doc.createElement('span');
      R.className = 'comment';
      while(comment.length &amp;gt; 0){
        var match = comment.match(reURL);
        if(!match){
          if(comment.length &amp;gt; 0) R.appendChild(doc.createTextNode(comment));
          break;
        }
        var head = match[1];
        var url  = match[2];
        comment = match[3];
        if(head.length &amp;gt; 0) R.appendChild(doc.createTextNode(head));
        var a = doc.createElement('a');
        a.href = url;
        a.target = '_blank';
        a.appendChild(doc.createTextNode(url));
        R.appendChild(a);
      }
      return R;};})();

  var domifyMeta = function(bm, entry){
    var meta = doc.createElement('div');
    meta.className = 'user-comment-meta';

    var plink = doc.createElement('a');
    plink.className = 'user-comment-link';
    plink.href  = '/entry/' + entry.eid + '/comment/' + bm.user;
    plink.title = 'パーマリンク';
    plink.target = '_blank';
    plink.appendChild(doc.createTextNode('リンク'));
    meta.appendChild(plink);

    var tspan = doc.createElement('span');
    tspan.className = 'timestamp';
    tspan.appendChild(doc.createTextNode(bm.timestamp));
    meta.appendChild(tspan);

    var star = doc.createElement('span');
    star.className = 'hatena-bookmark-star';
    meta.appendChild(star);
    return meta;};

  var domifyCount = function(entry){
    var count = entry.count;
    var frgn = doc.createDocumentFragment();
    var a = doc.createElement('a');
    a.className = 'metab-count';
    a.href = entry.entry_url;
    a.target = &amp;quot;_blank&amp;quot;;
    a.appendChild(doc.createTextNode(String(count) + &amp;quot; users&amp;quot;));
    frgn.appendChild(a);
    var bmc = (entry.bookmarks || []).length;
    if(count != bmc){
      var span = doc.createElement('span');
      span.className = 'metab-count-detail';
      span.appendChild(doc.createTextNode(String(bmc) + &amp;quot; comments + &amp;quot; +
                                          String(count - bmc)));
      frgn.appendChild(span);}
    return frgn;};

  var domifyBookmarks = function(entry){
    var node = doc.createDocumentFragment();
    if((entry.bookmarks || []).length &amp;lt; 1) return node;
    var comments   = doc.createElement('ul');
    comments.className = 'comments';
    var noComments = doc.createElement('ul');
    noComments.className = 'no-comments';
    forEach(entry.bookmarks, function(bm){
      var li = doc.createElement('li');
      li.className = 'metab';
      var headPart = doc.createElement('span');
      headPart.className = 'head-part';
      headPart.appendChild(domifyIcon(     bm, entry));
      headPart.appendChild(domifyUsername( bm, entry));
      headPart.appendChild(domifyUsermetab(bm, entry));
      li.appendChild(headPart);
      li.appendChild(domifyTags(    bm, entry));
      li.appendChild(domifyComment( bm, entry));
      li.appendChild(domifyMeta(    bm, entry));
      (String(bm.comment).length &amp;gt; 0 // || tags.length &amp;gt; 0
       ? comments : noComments).appendChild(li);});
    if(comments.firstChild)  node.appendChild(comments);
    if(noComments.firstChild) node.appendChild(noComments);
    return node;};

  var domifyTitle = function(entry, title){
    if(!(title &amp;amp;&amp;amp; title.length &amp;gt; 0)) return doc.createDocumentFragment();
    var node = doc.createElement('div');
    node.className = 'metab-title';
    var tspan = doc.createElement('span');
    tspan.appendChild(doc.createTextNode(title));
    tspan.className = 'title';
    node.appendChild(tspan);
    node.appendChild(domifyCount(     entry));
    return node; };

  var domifyEntry = function(entry, title){
    if((entry || {count:0}).count &amp;lt; 1) return doc.createDocumentFragment();
    var node = doc.createElement('div');
    node.className = 'metab-container';
    node.appendChild(domifyTitle(entry, title));
    node.appendChild(domifyBookmarks( entry));
    return node;};

  var addStars = function(node){ withStar(function(Star, Hatena){
    var entries = [];
    forEach(node.querySelectorAll('li.metab') || [], function(li){
      var uri = li.querySelector('a.username').href;
      //        var uri = li.querySelector('a.user-comment-link').href;
      var sc = li.querySelector('.hatena-bookmark-star');
      var cc = doc.createElement('span');
      sc.parentNode.insertBefore(cc, sc);
      var earg = {
        entryNode:         li,
        uri:               uri,
        title:             Star.EntryLoader.scrapeTitle(li) || '',
        comment_container: cc,
        star_container:    sc};
      var e = new Star.Entry(earg);
      e.showButtons();
      entries.push(e);});

    //
    var receive = function(res){
      var entries_ = res.entries;
      var encodedUriToEntryInfoMap = {};
      if (!entries_) entries_ = [];
      forEach(entries_, function(entryInfo){
        if ( !entryInfo.uri ) return;
        var eURI = entryInfo.eURI;
        if ( !eURI ) eURI = entryInfo.eURI = encodeURIComponent( entryInfo.uri );
        encodedUriToEntryInfoMap[eURI] = entryInfo;});
      forEach(entries, function(e){
        if ( e.hasBoundToStarEntry() ) return;
        if ( !e.eURI ) e.eURI = encodeURIComponent(e.uri);
        var entryInfo = entryInfo = encodedUriToEntryInfoMap[e.eURI];
        if ( entryInfo ) e.bindStarEntry( entryInfo );
        if (typeof(e.can_comment) == 'undefined') e.setCanComment(res.can_comment);
        e.showStars();
        e.showCommentButton();});
      if (res.rks) {
        if (!Hatena.Visitor || typeof(Hatena.Visitor) == 'undefined') {
          Hatena.Visitor = {};}
        if (!Hatena.Visitor.RKS) {
          Hatena.Visitor.RKS = res.rks;}}
      Hatena.Star.User.RKS.ready(res.rks);};

    // getStarEntries
    (function(){
      if (!entries.length) return;
      var jsonpBase = Star.BaseURL.replace(
          /^http:/, Star.BaseURLProtocol) + 'entries.json?';
      var url = jsonpBase;
      for (var i = 0; i &amp;lt; entries.length; i++) {
        if (url.length &amp;gt; JSONP_MAX_BYTES) {
          jsonp(url, {callback: receive});
          url = jsonpBase;}
        url += 'uri=' + encodeURIComponent(entries[i].uri) + '&amp;amp;';}
      if (!Hatena.Visitor) url += 'timestamp=1';
      jsonp(url, {callback: receive});})();});};

  var addBehaviors = function(node){
    if(! node.tagName) return node;
    addStars(node);
    forEach(node.querySelectorAll('span.user-metab-ph'), function(ph){
      var user = ph.getAttribute('title');
      reserveUserMetab(user, function(entry){
        if(!entry){
          if(ph.parentNode) ph.parentNode.removeChild(ph);
          return;
        }
        var a = doc.createElement('a');
        a.appendChild(doc.createTextNode(entry.count + ' users'));
        a.className = 'metab-count';
        a.href = 'javascript:undefined;';
        a.addEventListener('click', function(e){
          e.stopPropagation();
          e.preventDefault();
          popupUserMetab(user);
        }, false);
        (function(){
          if(!ph.parentNode){
            setTimeout(arguments.callee, 100);
            return; }
          //console.log(user, '&amp;lt;-', ph.parentNode, a);
          //ph.appendChild(a);
          ph.parentNode.replaceChild(a, ph);
        })(); });
    });
    return node;};


  ////////////////////////////////////////////////////////////
  var metabToDOM, receivedMetab, reserveMetab;

  (function(){
    var entries = {};

    metabToDOM = function(entry, uri, title){
      var slot = entries[uri];
      var node = slot.dom || (slot.dom = node = domifyEntry(entry,title));
      return addBehaviors(node.cloneNode(true));};

    receivedMetab = function(entry, uri, title){
      var slot = entries[uri];
      slot.entry = entry || false;
      slot.cont.forEach(function(c){c(entry, uri, title);});};

    reserveMetab = function(uri, cont_, title_){
      var slot = (entries[uri] ||
                  (entries[uri] = {entry: null, cont:[], req: false}));
      var title = title_ || '';
      var cont = cont_ instanceof Function ? cont_ : (function(){
        var container = cont_;
        if(container.className == 'metab-popup'){
          var e = new Error();
          console.log(e.stack);
          throw e;
        }
        return function(entry){
          container.appendChild(metabToDOM(entry, uri, title));};})();
      if(slot.entry !== null){
        cont(slot.entry, uri, title);
        return; }
      slot.cont.push(cont || function(){});
      if(slot.req) return;
      slot.req = true;
      jsonp(API_DOMAIN + '/entry/jsonlite/',
            {url: uri,
             callback: function(entry){receivedMetab(entry, uri, title);}});};})();

  var reserveUserMetab = function reserveUserMetab(user, cont_, title_){
    var uri = HATEB_DOMAIN + '/' + user + '/';
    var title = title_ ||  'metab for id:'+user;
    reserveMetab(uri, cont_, title);};

  ////////////////////////////////////////////////////////////
  var popupUserMetab = (function(){
    var popups = {};
    var locker = null;
    var makeLocker = function(){
      var div = doc.createElement('div');
      div.className = 'metab-popup-locker';
      div.addEventListener('click', function(e){
        if(e.target !== div) return;
        hidePopup();});
      return div;};
    var getLocker = function(){ return locker || (locker = makeLocker()); };

    var lockPage,
        unlockPage;
    (function(){
      var html = null,        body = null,
          cssTextHtml = null, cssTextBody = null;
      var init = function(){
        if(html) return;
        html = doc.querySelector('html');
        body = doc.body;
        cssTextHtml = html.style.cssText;
        cssTextBody = body.style.cssText;};
      lockPage = function(){
        init();
        html.style.cssText = 'overflow: hidden;';
        body.style.cssText = 'overflow: hidden;';};
      unlockPage = function(){
        init();
        html.style.cssText = cssTextHtml;
        body.style.cssText = cssTextBody;};})();

    var showLocker = function(){
      var locker = getLocker();
      lockPage();
      doc.body.appendChild(locker);
      return locker; };
    var hideLocker = function(){
      var locker = getLocker();
      unlockPage();
      doc.body.appendChild(locker);
      return locker;; };

    var makePopup = function(user){
      var popup = doc.createElement('div');
      popup.className = 'metab-popup';
      var icon = profileIcon(user);
      popup.appendChild(icon);
      withUserInfo(user, function(dom){
        if(dom.innerHTML != &amp;quot;&amp;quot;) popup.replaceChild(dom.cloneNode(true), icon);});
      reserveUserMetab(user, function(entry, uri, title){
        var metabdom  = metabToDOM(entry, uri, title);
        if(!popup.querySelector('.metab-container')){
          popup.appendChild(metabdom);}});
      return popup; };

    var showPopup = function(popup){
      hidePopup();
      showLocker().appendChild(popup);};

    var hidePopup = function(){
      var locker = hideLocker();
      locker.innerHTML = '';
      locker.parentNode.removeChild(locker);};

    return function(user){
      var popup = popups[user] || (popups[user]=makePopup(user));
      showPopup(popup); };})();
    

  ////////////////////////////////////////////////////////////

  var applyStyle = function(){
    var style = doc.createElement('style');
    style.type = 'text/css';
    style.appendChild(doc.createTextNode(CSS));
    doc.querySelector('head').appendChild(style);};


  var showCommentMetab = elementModifier(function(n){
    if(PageType != 'entry') return;
    var nparent = n.parentNode;
    if(nparent.className == 'metab-popup') return;
    var cl = nparent.querySelector('a.user-comment-link');
    if(!cl) return;
    reserveMetab(cl.href, nparent, 'metab for this comment');
    var user = n.href.match(/([^\/]+)\/$/)[1];
    reserveUserMetab(user, nparent);});


  ////////////////////////////////////////////////////////////
  var updateStarBehavior = elementModifier( function(n){
    var a = n.parentNode;
    if(String(a.tagName).toLowerCase() != 'a') return;
    n.style.width     = '24px';
    n.style.height    = '24px';
    var user = (function(m){return m[1];})(a.href.match(/([^\/]*)\/?$/));
    a.style.display          = 'inline-block';
    a.style.paddingTop       = '8px';
    a.style.borderRadius     = '6px';
    a.style.border           = 'double rgba(0,0,0,0.5) 3px';
    a.style.margin           = '1px';
    a.style.width            = '24px';
    a.style.height           = '34px';
    a.style.backgroundRepeat = 'no-repeat';
    a.style.backgroundSize   = '8px 8px';
    a.style.backgroundImage  = 'url('+n.src+')';
    a.style.position         = 'relative;';
    n.src = profileIconUrl(user);
    reserveUserMetab( user, function(entry){
      if(entry){
        a.style.borderColor = 'rgba(255,0,0,0.5)';
        a.style.paddingTop   = '0px';
        var miniCount = doc.createElement('span');
        miniCount.appendChild(doc.createTextNode(String(entry.count)));
        miniCount.style.cssText = [
          '  display:         block;',
          '  text-align:      right;',
          '  margin:          1px;',
          '  color:           red;',
          '  height:          8px;',
          '  overflow:        hidden;',
          '  font-size:       8px !important;',
          '  line-height:     8px !important;',
          '  text-decoration: none !important;'
        ].join(&amp;quot;\n&amp;quot;);
        a.insertBefore(miniCount,n);
        a.addEventListener('click', function(ev){
          ev.stopPropagation();
          ev.preventDefault();
          popupUserMetab(user);}, false);}
      else{
        a.style.border = null;}});} );

  var expandHatenaStar = elementModifier(function(n){
    n.dispatchEvent(new win.MouseEvent('click'));});

  ////////////////////////////////////////////////////////////
  var classnameActions = {
    'profile-icon':            showCommentMetab,
    'hatena-star-inner-count': expandHatenaStar,
    'hatena-star-star':        updateStarBehavior };


  var observeMutation = function(){
    var modify = function(n, selector, modifier){
      if(n.className == selector) setTimeout(function(){modifier(n);},100);
      forEach(n.querySelectorAll(selector), function(n){
        setTimeout(function(){modifier(n);}, 100);});};

    var mo = new win.MutationObserver(function(ms){ms.forEach(function(m){
      var cn,act;
      switch(m.type){
      case 'childList':{
        forEach(m.addedNodes, function(n){
          if(!n.tagName) return;
          for(cn in classnameActions){
            modify(n, '.'+cn, classnameActions[cn]);}});
        break;}
      case 'attributes':{
        var n = m.target, av;
        switch(m.attributeName){
        case 'class':{
          for(cn in classnameActions){
            if(cn != n.className) continue;
            setTimeout( function(){
              classnameActions[n.className].call(null,n);},100);}
          break;}
        default:{
          break;}}
        break;}
      default: {
        break;}}});});
    mo.observe(doc.body, {
      subtree: true,
      childList: true,
      attributes: true,
      attributeFilter: ['class']});};



  ////////////////////////////////////////////////////////////
  var main = function(){
    applyStyle();
    for(var cn in classnameActions)
      forEach(doc.querySelectorAll('.'+cn), classnameActions[cn]);
    observeMutation(); };

  var gm_main = function(field){
    var src = '(' + field.toSource() + ').call(this);';
    var script = doc.createElement('script');
    script.type = 'text/javascript';
    script.appendChild(doc.createTextNode(src));
    doc.querySelector('head').appendChild(script);  };

  if(gm) main();
  else   gm_main(arguments.callee);

}).call(this);

// Local Variables:
// mode: hatena-let
// coding: utf-8-dos
// End:
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/hJmdq7L4gqQm">
    <link>https://let.hatelabo.jp/lieutar/let/hJmdq7L4gqQm</link>
    <dc:date>2016-08-15T11:22:44Z</dc:date>
    <description>メタブ表示</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] メタブ表示</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FhJmdq7L4gqQm.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;メタブ表示&lt;/a&gt;&lt;pre&gt;/*
 * @title メタブ表示
 * @description メタブ表示
 * @include http://b.hatena.ne.jp/*
 * @license MIT License
 * @require 
 */
////
(function(){

  ////////////////////////////////////////////////////////////
  var win = this,
      doc = this.document,
      loc = this.location,
      con = this.console;
  var gm  = typeof(win.GM_info) === 'undefined';
  var setTimeout = this.setTimeout;

  var DEBUG        = true;

  ////////////////////////////////////////////////////////////

  var HATEB_DOMAIN = &amp;quot;http://b.hatena.ne.jp&amp;quot;;
  var API_DOMAIN   = &amp;quot;//b.hatena.ne.jp&amp;quot;;
  var ICON_DOMAIN  = &amp;quot;http://cdn1.www.st-hatena.com/users/&amp;quot;;
  var JSONP_MAX_BYTES = 1800;
  var LOADING_GIF     = HATEB_DOMAIN + '/images/loading.gif';

  ////////////////////////////////////////////////////////////
  var CSS = [
    '.metab-popup-locker {',
    '  position:   fixed;',
    '  top:        0px;',
    '  left:       0px;',
    '  width:      100%;',
    '  height:     100%;',
    '  z-index:    9000;',
    '  background: rgba(0,0,0,0.25);',
    '}',
    '.metab-popup {',
    '  height:        90%;',
    '  width:         600px;',
    '  margin:        2.5% auto;',
    '  padding:       10px;',
    '  border-radius: 20px;',
    '  overflow:      auto;',
    '  background:    #F8F8F8;',
    '}',
    '.metab-container {',
    '  margin:        5px;',
    '  padding:       5px;',
    '  border: solid   #9CF 1px;',
    '  border-radius: 10px;',
    '}',
    '.metab-container &amp;gt; .metab-title &amp;gt; .title{',
    '  display:   inline-block;',
    '  margin:    0px 10px 0px 0px;',
    '  font-size: 11px;',
    '  color:     #69F;',
    '}',
    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.head-part &amp;gt;  .metab-count, ',
    '.metab-container &amp;gt; .metab-title &amp;gt; .metab-count{',
    '  font-size:        10px;',
    '  font-weight:      900;',
    '  color:            #F00;',
    '  background-color: #FCC;',
    '  display:          inline-block;',
    '  text-decoration:  none;',
    '  line-height:      12px !important;',
    '  padding:          2px;',
    '  margin:           10px 0px;',
    '}',
    '.metab-container &amp;gt; .metab-title &amp;gt; .metab-count-detail{',
    '  display:   inline-block;',
    '  margin:    0px 10px;',
    '  font-size: 11px;',
    '  color:     rgb(153, 153, 153);',
    '}',
    '.metab-container &amp;gt; ul{',
    '  display: block;',
    '  margin: 0px;',
    '  padding: 0px;',
    '}',
    '.metab-container &amp;gt; ul &amp;gt; li{',
    '  margin:        0px;',
    '  padding:       11px 0px 11px 30px;',
    '  border-bottom: solid #CCC 1px;',
    '}',
    '.metab-container &amp;gt; ul.comments &amp;gt; li{',
    '  width:      auto !important;',
    '  display:    block;',
    '  list-style: none;',
    '}',
    '.metab-container &amp;gt; ul.no-comments &amp;gt; li{',
    ' width:      auto !important;',
    ' margin:     0px 11px 0px 0px;',
    ' border:     none;',
    ' list-style: none;',
    ' display:    inline-block;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.head-part &amp;gt; a.profile-icon {',
    '  margin-left: -30px;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.head-part &amp;gt;  a.profile-icon &amp;gt; img{',
    '  width:  24px;',
    '  height: 24px;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.head-part &amp;gt;  a.username{',
    '  font-size: 12px;',
    '  display: inline-block;',
    '  margin:  0px 11px;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt;  span.tags{',
    '  display: inline-block;',
    '  margin:  0px 11px 0px 0px;',
    '}',

    '.metab-container &amp;gt; ul &amp;gt; li &amp;gt; span.comment{',
    '  font-size: 12px;',
    '}',

    '.metab-container .user-comment-meta{',
    '  font-size: 11px;',
    '  color: rgb(153,153,153);',
    '}',
    '.metab-container a{',
    '  color: rgb(0, 143, 222);',
    '}',
    '.metab-container a.user-comment-link {',
    '  background-image: url(&amp;quot;/images/v3/comment-link.png&amp;quot;);',
    '  background-position: left center;',
    '  background-repeat: no-repeat;',
    '  background-size: 15px 15px;',
    '  color: rgb(153, 153, 153);',
    '  font-size: 11px;',
    '  font-weight: normal;',
    '  margin: 0 8px 0 -1px;',
    '  padding-left: 16px;',
    '  text-decoration: none;',
    '}',
    ''].join(&amp;quot;\n&amp;quot;);

  ////////////////////////////////////////////////////////////
  var PageType = ((function(pn){
    if(pn.match(/^\/entry\//)){
      if(pn.match(/^\/entry\/\d+\/comment\//)) return 'comment';
      return 'entry';}
    return 'other';
  })(String(loc.pathname)));


  ////////////////////////////////////////////////////////////
  
  var p = function p() {
    if ( !DEBUG ) return;
    con.log.apply(con, arguments);};


  var forEach = function forEach(a,f){
    if(!a) return;
    for (var i=0,l=a.length;i&amp;lt;l;i++){
      if(f(a[i]) === false) break;}};

  var gensym = (function(){
    var rnd = function(){return Math.floor(Math.random() * (1&amp;lt;&amp;lt;30)).toString(16);};
    var cnt = 0;
    var prefix = 'metabsym_' + Date.now().toString(16) + '_' + rnd() + '_';
    return function gensym(){ return prefix + (cnt++).toString(16); };})();

  var receiver = function receiver(cb){
    var name = gensym();
    win[name] = function(){
      delete win[name];
      cb.apply(this, arguments);};
    return name;};


  var jsonp = function jsonp(url, opt){
    var query = '';
    for(var f in opt){
      var v = opt[f];
      if(v instanceof Function) v = receiver(v);
      query += '&amp;amp;' + encodeURIComponent(f) + '=' + encodeURIComponent(v);}
    url += query.replace(/^./, url.match(/\?/) ? '&amp;amp;' : '?');

    var script = doc.createElement('script');
    script.src = url;
    script.type = 'text/javascript';
    doc.querySelector('head').appendChild(script);};


  var elementModifier = function(fun){
    var FLAG = 'httb-modifier-modified';
    return function(n){
      if(n.getAttribute(FLAG)) return null;
      n.setAttribute(FLAG, 'true');
      return fun(n);};};

  ////////////////////////////////////////////////////////////

  var withHatena = function(cb){(function(){
    if(typeof(win.Hatena) === 'undefined'){
      setTimeout(arguments.callee, 100);
      return;}
    cb(win.Hatena);})();};

  var withStar = function(cb){
    withHatena(function(Hatena){(function(){
      if(typeof(Hatena.Star) === 'undefined'){
        setTimeout(arguments.callee, 100);
        return;}
      cb(Hatena.Star, Hatena);})();});};

  var withBookmark = function(cb){
    withHatena(function(Hatena){(function(){
      if(typeof(Hatena.Bookmark) == 'undefined'){
        setTimeout(arguments.callee, 100);
        return;}
      cb(Hatena.Bookmark, Hatena);})();});};

  ////////////////////////////////////////////////////////////

  var withUserInfo = (function(){
    var users = {};
    return function(user, cont){
      var slot = (users[user] || (users[user] = {data: null, cont: []}));
      if(slot.data){
        cont(slot.data, user);
        return;}
      slot.cont.push(cont);
      if(slot.data === false) return;
      slot.data = false;
      var done = 0;
      var rs   = {};
      var Xhr  = win.XMLHttpRequest;
      ['information', 'services'].forEach(function(field){
        var req = new Xhr();
        req.onreadystatechange = function(){
          if(req.readyState !== Xhr.DONE) return;
          rs[field] = req.status == 200 ? req.responseText : '';
          done++;
          if(done &amp;lt; 2) return;
          var div = doc.createElement('div');
          div.innerHTML = rs.information + rs.services;
          slot.data = div;
          slot.cont.forEach(function(cont){cont(slot.data, user);});};
        req.open('GET', 'http://b.hatena.ne.jp/'+user+'/partial.' + field, true);
        req.send();});};})();

  var profileIconUrl = function(user){
    return ICON_DOMAIN + '/' + user.substring(0,2) + '/' + user +
      '/profile_l.gif'; };

  var profileIcon = function(user){
    var a  = doc.createElement('a');
    a.href      = HATEB_DOMAIN + '/' + user + '/';
    a.target    = '_blank';
    a.title     = user;
    a.className = 'profile-icon';
    var icon = doc.createElement('img');
    icon.src = profileIconUrl(user);
    icon.alt = user;
    a.appendChild(icon);
    return a; };


  ////////////////////////////////////////////////////////////
  var PageEid = (function(){
    var ucl = doc.querySelector('a.user-comment-link');
    if(!ucl) return null;
    return String(ucl.href).replace(/^\/entry\//,'').replace(/\/comments\/.*/,'');});

  var domifyIcon = function(bm){
    return profileIcon(bm.user);};

  var domifyUsername = function(bm, entry){
    var a  = doc.createElement('a');
    var date    = String(bm.timestamp).replace(/ .+$/,'').replace(/\//g,'');
    a.href      = '/' + bm.user + '/' + date + '#bookmark-' + entry.eid ;
    a.target    = '_blank';
    a.title     = bm.user;
    a.className = 'username';
    a.appendChild(doc.createTextNode(bm.user));
    return a;};

  var domifyUsermetab = function(bm, entry){
    var ph = doc.createElement('span');
    ph.className = 'user-metab-ph';
    ph.setAttribute('title', bm.user);
    return ph;};

  var domifyTags = function(bm){
    var tags = bm.tags || [];
    if(tags.length &amp;lt; 1) return doc.createDocumentFragment();
    var tagSpan = doc.createElement('span');
    tagSpan.className = 'tags';
    forEach(tags , function(tagName){
      var tagLink = doc.createElement('a');
      tagLink.className = 'user-tag';
      tagLink.href =
        HATEB_DOMAIN + '/' + bm.user + '/' + encodeURIComponent(tagName);
      tagLink.appendChild(doc.createTextNode(tagName));
      tagSpan.appendChild(tagLink);});
    return tagSpan;};

  var domifyComment = (function(){

    var reURL = (function(){
      var RE_HEX    = '%[a-fA-F0-9][a-fA-F0-9]';
      var RE_SCHEME = '[a-z]+:';
      var RE_CHAR   = '(?:[a-zA-Z0-9\-_\.]|' + RE_HEX + ')';
      var RE_STR    = RE_CHAR + '+';
      var RE_STR0   = RE_CHAR + '*';
      var RE_HOST   = RE_STR;
      var RE_PATH   = '(?:/(?:' + RE_STR + '/)*' + RE_STR0 + ')';
      var RE_QV     = RE_STR0 + '=' + RE_STR0;
      var RE_QUERY  = '(?:\\?(?:(?:' + RE_QV + '&amp;amp;)*'+RE_QV+')?|'+RE_QV+')';
      var RE_HASH   = '(?:#' + RE_STR0 + ')';
      var RE_URL    = 'https?://' + RE_HOST + RE_PATH +'?' +
            RE_QUERY + '?' + RE_HASH + '?';
      return  new RegExp('(.*?)(' + RE_URL + ')(.*)');
    })();

    return function(bm){
      var comment = bm.comment;
      var R = doc.createElement('span');
      R.className = 'comment';
      while(comment.length &amp;gt; 0){
        var match = comment.match(reURL);
        if(!match){
          if(comment.length &amp;gt; 0) R.appendChild(doc.createTextNode(comment));
          break;
        }
        var head = match[1];
        var url  = match[2];
        comment = match[3];
        if(head.length &amp;gt; 0) R.appendChild(doc.createTextNode(head));
        var a = doc.createElement('a');
        a.href = url;
        a.target = '_blank';
        a.appendChild(doc.createTextNode(url));
        R.appendChild(a);
      }
      return R;};})();

  var domifyMeta = function(bm, entry){
    var meta = doc.createElement('div');
    meta.className = 'user-comment-meta';

    var plink = doc.createElement('a');
    plink.className = 'user-comment-link';
    plink.href  = '/entry/' + entry.eid + '/comment/' + bm.user;
    plink.title = 'パーマリンク';
    plink.target = '_blank';
    plink.appendChild(doc.createTextNode('リンク'));
    meta.appendChild(plink);

    var tspan = doc.createElement('span');
    tspan.className = 'timestamp';
    tspan.appendChild(doc.createTextNode(bm.timestamp));
    meta.appendChild(tspan);

    var star = doc.createElement('span');
    star.className = 'hatena-bookmark-star';
    meta.appendChild(star);
    return meta;};

  var domifyCount = function(entry){
    var count = entry.count;
    var frgn = doc.createDocumentFragment();
    var a = doc.createElement('a');
    a.className = 'metab-count';
    a.href = entry.entry_url;
    a.target = &amp;quot;_blank&amp;quot;;
    a.appendChild(doc.createTextNode(String(count) + &amp;quot; users&amp;quot;));
    frgn.appendChild(a);
    var bmc = (entry.bookmarks || []).length;
    if(count != bmc){
      var span = doc.createElement('span');
      span.className = 'metab-count-detail';
      span.appendChild(doc.createTextNode(String(bmc) + &amp;quot; comments + &amp;quot; +
                                          String(count - bmc)));
      frgn.appendChild(span);}
    return frgn;};

  var domifyBookmarks = function(entry){
    var node = doc.createDocumentFragment();
    if((entry.bookmarks || []).length &amp;lt; 1) return node;
    var comments   = doc.createElement('ul');
    comments.className = 'comments';
    var noComments = doc.createElement('ul');
    noComments.className = 'no-comments';
    forEach(entry.bookmarks, function(bm){
      var li = doc.createElement('li');
      li.className = 'metab';
      var headPart = doc.createElement('span');
      headPart.className = 'head-part';
      headPart.appendChild(domifyIcon(     bm, entry));
      headPart.appendChild(domifyUsername( bm, entry));
      headPart.appendChild(domifyUsermetab(bm, entry));
      li.appendChild(headPart);
      li.appendChild(domifyTags(    bm, entry));
      li.appendChild(domifyComment( bm, entry));
      li.appendChild(domifyMeta(    bm, entry));
      (String(bm.comment).length &amp;gt; 0 // || tags.length &amp;gt; 0
       ? comments : noComments).appendChild(li);});
    if(comments.firstChild)  node.appendChild(comments);
    if(noComments.firstChild) node.appendChild(noComments);
    return node;};

  var domifyTitle = function(entry, title){
    if(!(title &amp;amp;&amp;amp; title.length &amp;gt; 0)) return doc.createDocumentFragment();
    var node = doc.createElement('div');
    node.className = 'metab-title';
    var tspan = doc.createElement('span');
    tspan.appendChild(doc.createTextNode(title));
    tspan.className = 'title';
    node.appendChild(tspan);
    node.appendChild(domifyCount(     entry));
    return node; };

  var domifyEntry = function(entry, title){
    if((entry || {count:0}).count &amp;lt; 1) return doc.createDocumentFragment();
    var node = doc.createElement('div');
    node.className = 'metab-container';
    node.appendChild(domifyTitle(entry, title));
    node.appendChild(domifyBookmarks( entry));
    return node;};

  var addStars = function(node){ withStar(function(Star, Hatena){
    var entries = [];
    forEach(node.querySelectorAll('li.metab') || [], function(li){
      var uri = li.querySelector('a.username').href;
      //        var uri = li.querySelector('a.user-comment-link').href;
      var sc = li.querySelector('.hatena-bookmark-star');
      var cc = doc.createElement('span');
      sc.parentNode.insertBefore(cc, sc);
      var earg = {
        entryNode:         li,
        uri:               uri,
        title:             Star.EntryLoader.scrapeTitle(li) || '',
        comment_container: cc,
        star_container:    sc};
      var e = new Star.Entry(earg);
      e.showButtons();
      entries.push(e);});

    //
    var receive = function(res){
      var entries_ = res.entries;
      var encodedUriToEntryInfoMap = {};
      if (!entries_) entries_ = [];
      forEach(entries_, function(entryInfo){
        if ( !entryInfo.uri ) return;
        var eURI = entryInfo.eURI;
        if ( !eURI ) eURI = entryInfo.eURI = encodeURIComponent( entryInfo.uri );
        encodedUriToEntryInfoMap[eURI] = entryInfo;});
      forEach(entries, function(e){
        if ( e.hasBoundToStarEntry() ) return;
        if ( !e.eURI ) e.eURI = encodeURIComponent(e.uri);
        var entryInfo = entryInfo = encodedUriToEntryInfoMap[e.eURI];
        if ( entryInfo ) e.bindStarEntry( entryInfo );
        if (typeof(e.can_comment) == 'undefined') e.setCanComment(res.can_comment);
        e.showStars();
        e.showCommentButton();});
      if (res.rks) {
        if (!Hatena.Visitor || typeof(Hatena.Visitor) == 'undefined') {
          Hatena.Visitor = {};}
        if (!Hatena.Visitor.RKS) {
          Hatena.Visitor.RKS = res.rks;}}
      Hatena.Star.User.RKS.ready(res.rks);};

    // getStarEntries
    (function(){
      if (!entries.length) return;
      var jsonpBase = Star.BaseURL.replace(
          /^http:/, Star.BaseURLProtocol) + 'entries.json?';
      var url = jsonpBase;
      for (var i = 0; i &amp;lt; entries.length; i++) {
        if (url.length &amp;gt; JSONP_MAX_BYTES) {
          jsonp(url, {callback: receive});
          url = jsonpBase;}
        url += 'uri=' + encodeURIComponent(entries[i].uri) + '&amp;amp;';}
      if (!Hatena.Visitor) url += 'timestamp=1';
      jsonp(url, {callback: receive});})();});};

  var addBehaviors = function(node){
    if(! node.tagName) return node;
    addStars(node);
    forEach(node.querySelectorAll('span.user-metab-ph'), function(ph){
      var user = ph.getAttribute('title');
      reserveUserMetab(user, function(entry){
        if(!entry){
          if(ph.parentNode) ph.parentNode.removeChild(ph);
          return;
        }
        var a = doc.createElement('a');
        a.appendChild(doc.createTextNode(entry.count + ' users'));
        a.className = 'metab-count';
        a.href = 'javascript:undefined;';
        a.addEventListener('click', function(e){
          e.stopPropagation();
          e.preventDefault();
          popupUserMetab(user);
        }, false);
        (function(){
          if(!ph.parentNode){
            setTimeout(arguments.callee, 100);
            return; }
          //console.log(user, '&amp;lt;-', ph.parentNode, a);
          //ph.appendChild(a);
          ph.parentNode.replaceChild(a, ph);
        })(); });
    });
    return node;};


  ////////////////////////////////////////////////////////////
  var metabToDOM, receivedMetab, reserveMetab;

  (function(){
    var entries = {};

    metabToDOM = function(entry, uri, title){
      var slot = entries[uri];
      var node = slot.dom || (slot.dom = node = domifyEntry(entry,title));
      return addBehaviors(node.cloneNode(true));};

    receivedMetab = function(entry, uri, title){
      var slot = entries[uri];
      slot.entry = entry || false;
      slot.cont.forEach(function(c){c(entry, uri, title);});};

    reserveMetab = function(uri, cont_, title_){
      var slot = (entries[uri] ||
                  (entries[uri] = {entry: null, cont:[], req: false}));
      var title = title_ || '';
      var cont = cont_ instanceof Function ? cont_ : (function(){
        var container = cont_;
        if(container.className == 'metab-popup'){
          var e = new Error();
          console.log(e.stack);
          throw e;
        }
        return function(entry){
          container.appendChild(metabToDOM(entry, uri, title));};})();
      if(slot.entry !== null){
        cont(slot.entry, uri, title);
        return; }
      slot.cont.push(cont || function(){});
      if(slot.req) return;
      slot.req = true;
      jsonp(API_DOMAIN + '/entry/jsonlite/',
            {url: uri,
             callback: function(entry){receivedMetab(entry, uri, title);}});};})();

  var reserveUserMetab = function reserveUserMetab(user, cont_, title_){
    var uri = HATEB_DOMAIN + '/' + user + '/';
    var title = title_ ||  'metab for id:'+user;
    reserveMetab(uri, cont_, title);};

  ////////////////////////////////////////////////////////////
  var popupUserMetab = (function(){
    var popups = {};
    var locker = null;
    var makeLocker = function(){
      var div = doc.createElement('div');
      div.className = 'metab-popup-locker';
      div.addEventListener('click', function(e){
        if(e.target !== div) return;
        hidePopup();});
      return div;};
    var getLocker = function(){ return locker || (locker = makeLocker()); };

    var lockPage,
        unlockPage;
    (function(){
      var html = null,        body = null,
          cssTextHtml = null, cssTextBody = null;
      var init = function(){
        if(html) return;
        html = doc.querySelector('html');
        body = doc.body;
        cssTextHtml = html.style.cssText;
        cssTextBody = body.style.cssText;};
      lockPage = function(){
        init();
        html.style.cssText = 'overflow: hidden;';
        body.style.cssText = 'overflow: hidden;';};
      unlockPage = function(){
        init();
        html.style.cssText = cssTextHtml;
        body.style.cssText = cssTextBody;};})();

    var showLocker = function(){
      var locker = getLocker();
      lockPage();
      doc.body.appendChild(locker);
      return locker; };
    var hideLocker = function(){
      var locker = getLocker();
      unlockPage();
      doc.body.appendChild(locker);
      return locker;; };

    var makePopup = function(user){
      var popup = doc.createElement('div');
      popup.className = 'metab-popup';
      var icon = profileIcon(user);
      popup.appendChild(icon);
      withUserInfo(user, function(dom){
        if(dom.innerHTML != &amp;quot;&amp;quot;) popup.replaceChild(dom.cloneNode(true), icon);});
      reserveUserMetab(user, function(entry, uri, title){
        var metabdom  = metabToDOM(entry, uri, title);
        if(!popup.querySelector('.metab-container')){
          popup.appendChild(metabdom);}});
      return popup; };

    var showPopup = function(popup){
      hidePopup();
      showLocker().appendChild(popup);};

    var hidePopup = function(){
      var locker = hideLocker();
      locker.innerHTML = '';
      locker.parentNode.removeChild(locker);};

    return function(user){
      var popup = popups[user] || (popups[user]=makePopup(user));
      showPopup(popup); };})();
    

  ////////////////////////////////////////////////////////////

  var applyStyle = function(){
    var style = doc.createElement('style');
    style.type = 'text/css';
    style.appendChild(doc.createTextNode(CSS));
    doc.querySelector('head').appendChild(style);};


  var showCommentMetab = elementModifier(function(n){
    if(PageType != 'entry') return;
    var nparent = n.parentNode;
    if(nparent.className == 'metab-popup') return;
    var cl = nparent.querySelector('a.user-comment-link');
    if(!cl) return;
    reserveMetab(cl.href, nparent, 'metab for this comment');
    var user = n.href.match(/([^\/]+)\/$/)[1];
    reserveUserMetab(user, nparent);});


  ////////////////////////////////////////////////////////////
  var updateStarBehavior = elementModifier( function(n){
    var a = n.parentNode;
    if(String(a.tagName).toLowerCase() != 'a') return;
    n.style.width     = '24px';
    n.style.height    = '24px';
    var user = (function(m){return m[1];})(a.href.match(/([^\/]*)\/?$/));
    a.style.display          = 'inline-block';
    a.style.paddingTop       = '8px';
    a.style.borderRadius     = '6px';
    a.style.border           = 'double rgba(0,0,0,0.5) 3px';
    a.style.margin           = '1px';
    a.style.width            = '24px';
    a.style.height           = '34px';
    a.style.backgroundRepeat = 'no-repeat';
    a.style.backgroundSize   = '8px 8px';
    a.style.backgroundImage  = 'url('+n.src+')';
    a.style.position         = 'relative;';
    n.src = profileIconUrl(user);
    reserveUserMetab( user, function(entry){
      if(entry){
        a.style.borderColor = 'rgba(255,0,0,0.5)';
        a.style.paddingTop   = '0px';
        var miniCount = doc.createElement('span');
        miniCount.appendChild(doc.createTextNode(String(entry.count)));
        miniCount.style.cssText = [
          '  display:         block;',
          '  text-align:      right;',
          '  margin:          1px;',
          '  color:           red;',
          '  height:          8px;',
          '  overflow:        hidden;',
          '  font-size:       8px !important;',
          '  line-height:     8px !important;',
          '  text-decoration: none !important;'
        ].join(&amp;quot;\n&amp;quot;);
        a.insertBefore(miniCount,n);
        a.addEventListener('click', function(ev){
          ev.stopPropagation();
          ev.preventDefault();
          popupUserMetab(user);}, false);}
      else{
        a.style.border = null;}});} );

  var expandHatenaStar = elementModifier(function(n){
    n.dispatchEvent(new win.MouseEvent('click'));});

  ////////////////////////////////////////////////////////////
  var classnameActions = {
    'profile-icon':            showCommentMetab,
    'hatena-star-inner-count': expandHatenaStar,
    'hatena-star-star':        updateStarBehavior };


  var observeMutation = function(){
    var modify = function(n, selector, modifier){
      if(n.className == selector) setTimeout(function(){modifier(n);},100);
      forEach(n.querySelectorAll(selector), function(n){
        setTimeout(function(){modifier(n);}, 100);});};

    var mo = new win.MutationObserver(function(ms){ms.forEach(function(m){
      var cn,act;
      switch(m.type){
      case 'childList':{
        forEach(m.addedNodes, function(n){
          if(!n.tagName) return;
          for(cn in classnameActions){
            modify(n, '.'+cn, classnameActions[cn]);}});
        break;}
      case 'attributes':{
        var n = m.target, av;
        switch(m.attributeName){
        case 'class':{
          for(cn in classnameActions){
            if(cn != n.className) continue;
            setTimeout( function(){
              classnameActions[n.className].call(null,n);},100);}
          break;}
        default:{
          break;}}
        break;}
      default: {
        break;}}});});
    mo.observe(doc.body, {
      subtree: true,
      childList: true,
      attributes: true,
      attributeFilter: ['class']});};



  ////////////////////////////////////////////////////////////
  var main = function(){
    applyStyle();
    for(var cn in classnameActions)
      forEach(doc.querySelectorAll('.'+cn), classnameActions[cn]);
    observeMutation(); };

  var gm_main = function(field){
    var src = '(' + field.toSource() + ').call(this);';
    var script = doc.createElement('script');
    script.type = 'text/javascript';
    script.appendChild(doc.createTextNode(src));
    doc.querySelector('head').appendChild(script);  };

  if(gm) main();
  else   gm_main(arguments.callee);

}).call(this);

// Local Variables:
// mode: hatena-let
// coding: utf-8-dos
// End:
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/hJmdzYPc-8VX">
    <link>https://let.hatelabo.jp/lieutar/let/hJmdzYPc-8VX</link>
    <dc:date>2016-08-08T03:39:12Z</dc:date>
    <description>Enno.jp でアクティヴなテキストエリアをチェック</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] Enno.jp でアクティヴなテキストエリアをチェック</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FhJmdzYPc-8VX.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Enno.jp でアクティヴなテキストエリアをチェック&lt;/a&gt;&lt;pre&gt;/*
 * @title Enno.jp でアクティヴなテキストエリアをチェック
 * @description Enno.jp でアクティヴなテキストエリアをチェック
 * @include http://*
 * @license MIT License
 * @require 
 */

(function(){

  var win = this,
      doc = this.document;

  var ENNO_CHECKER = 'http://enno.jp/check';
  var MES_EMPTY = [
    'テキストが選択されていません。送信を行わずに終了します。',
    '',
    'ヒント: ブラウザでCtrl-A (Macなら⌘-A) キーを押すと全文選択できます。'
  ].join(&amp;quot;\n&amp;quot;);
  var MES_SEND = [
    '選択したテキストはインターネット上のenno.jpに送信してもよいテキストですか?',
    '',
    '[キャンセル]をクリックすれば送信せずに終了します。',
    '',
    '[OK]をクリックすると、選択したテキストを3秒後にenno.jpに送信し、'+
      'チェック結果の表示ページに移動します。'
  ].join(&amp;quot;\n&amp;quot;);


  var getSelectedText = function() {
    var ae = doc.activeElement;
    if(ae){
      switch(String(ae.tagName).toLowerCase()){
      case 'textarea':
      case 'input':   { return ae.value; }
      default: {}}}
    return win.getSelection().toString();};

  var postToEnno = function(sel){
    var form = doc.createElement('form');
    var textarea = doc.createElement('textarea');
    form.style.display = 'none';
    form.appendChild(textarea);
    form.action        = ENNO_CHECKER;
    form.method        = 'POST';
    form.enctype       = 'application/x-www-form-urlencoded';
    form.acceptCharset = 'utf-8';
    form.name          = &amp;quot;form_typo&amp;quot;;
    form.target        = '_blank';
    textarea.name      = 'typotext';
    textarea.appendChild(doc.createTextNode(sel));
    doc.body.appendChild(form);
    form.submit();
    win.setTimeout(function(){doc.body.removeChild(textarea);},100);};

  var sel = getSelectedText();
  if (sel === ''){
    win.alert(MES_EMPTY);
  } else {
    if (!win.confirm (MES_SEND)) return;
    win.setTimeout(function() {postToEnno(sel);}, 3000 - Date.now());
  }
}).call(null);

// Local Variables:
// mode: hatena-let
// coding: utf-8-dos
// End:
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/hJmd7ouP1951">
    <link>https://let.hatelabo.jp/lieutar/let/hJmd7ouP1951</link>
    <dc:date>2014-07-26T07:04:45Z</dc:date>
    <description>ブコメクリックで個別ページに飛ぶのがうざい。</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] ブコメクリックで個別ページに飛ぶのがうざい。</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FhJmd7ouP1951.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;ブコメクリックで個別ページに飛ぶのがうざい。&lt;/a&gt;&lt;pre&gt;/*
 * @title ブコメクリックで個別ページに飛ぶのがうざい。
 * @description ブコメクリックで個別ページに飛ぶのがうざい。
 * @include http://b.hatena.ne.jp/entry/*
 * @license MIT License
 * @require 
 */


(function(d){
[].forEach.call(
  d.querySelectorAll('span.comment'),
  function(e){
    var s = d.createElement('span');
    s.innerHTML = e.innerHTML;
    e.parentNode.replaceChild(s,e);
 }
);
setTimeout(arguments.callee.bind(null,d),1000);
})(document);&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/hJmdtq-R4LcT">
    <link>https://let.hatelabo.jp/lieutar/let/hJmdtq-R4LcT</link>
    <dc:date>2014-05-01T06:45:51Z</dc:date>
    <description>http://www.examword.com/toefl で紹介されている TOEFL Vocabulary List をフラッシュカード化</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] TOEFL Vocabulary List をフラッシュカード化</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FhJmdtq-R4LcT.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;TOEFL Vocabulary List をフラッシュカード化&lt;/a&gt;&lt;pre&gt;/*
 * @title TOEFL Vocabulary List をフラッシュカード化 
 * @description http://www.examword.com/toefl で紹介されている TOEFL Vocabulary List をフラッシュカード化
 * @include http://www.examword.com/toefl/practice.aspx
 * @license MIT License
 * @require 
 */


(function(console){

   var KEY_RETURN = 13;

   var shuffle = function(a) {
     var i = a.length, j, temp;
     if ( i == 0 ) return;
     while ( --i ) {
       j = Math.floor( Math.random() * ( i + 1 ) );
       temp = a[i];
       a[i] = a[j];
       a[j] = temp;
     }
   };

   var lcs = function (lcstest, lcstarget) {
     var matchfound = 0;
     var lsclen = lcstest.length;
     for(var lcsi=0; lcsi&amp;lt;lcstest.length; lcsi++){
       var lscos=0;
       for(var lcsj=0; lcsj&amp;lt;lcsi+1; lcsj++){
         var re = new RegExp(&amp;quot;(?:.{&amp;quot; + lscos + &amp;quot;})(.{&amp;quot; + lsclen + &amp;quot;})&amp;quot;, &amp;quot;i&amp;quot;);
         var temp = re.test(lcstest);
         re = new RegExp(&amp;quot;(&amp;quot; + RegExp.$1 + &amp;quot;)&amp;quot;, &amp;quot;i&amp;quot;);
         if(re.test(lcstarget)){
           matchfound=1;
           var result = RegExp.$1;
           break;
         }
         lscos = lscos + 1;
       }
       if(matchfound==1){return result; break;}
       lsclen = lsclen - 1;
     }
     return &amp;quot;&amp;quot;;
   };


   var map = function(ar, cb){
     var l = ar.length;
     var R = new Array(l);
     for(var i=0;i&amp;lt;l;i++){
       R[i] =  cb(ar[i],i);
     }
     return R;
   };

   var googlingURL = function(word){
     return (
       &amp;quot;https://www.google.com/search?q=&amp;quot;+
         encodeURIComponent(word) +
         &amp;quot;&amp;amp;oe=utf-8&amp;quot;
     );
   };

   var sentenceURL = function(word){
     return (
       'http://sentence.yourdictionary.com/' +
         encodeURIComponent(word)
     );
   };

   var imgSearchURL = function(word){
     return googlingURL(word) + '&amp;amp;tbm=isch';
   };

   var dictURL = function(word){
     return googlingURL('define:' + word);
   };

   var translateURL = function(word){
     return (
       &amp;quot;http://translate.google.com/#en/ja/&amp;quot; +
         encodeURIComponent(word)
     );
   };




   var dumpData = function(data, title){
     if(!title) title = data.substr(0,20);
     var win = window.open();
     var doc = win.document;
     doc.open();
     doc.write('&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;title&amp;gt;'+title+'&amp;lt;body&amp;gt;');
     doc.close();
     doc.body.appendChild(doc.createTextNode(data));
   };





   var createFlashCard = function(target, note){

     var getWordFromElement = function(wordElem){
       var content = wordElem.textContent;
       return content.replace(/:$/, '');
     };

     var getExplain = function(wordElem){
       for(var n = wordElem.nextSibling;n;n = n.nextSibling){
         if(String(n.className) == 'listWordExplanation') return n;
       }
       return null;
     };

     var getBRs = function(exp){
       var R = [];
       for(var n = exp.nextSibling;n;n=n.nextSibling){
         if(String(n.tagName).toLowerCase() == 'br')R.push(n);
         if(String(n.tagName).toLowerCase() == 'span')break;
       }
       return R;
     };

     var exp = getExplain(target);
     
     var card = {
       text:    getWordFromElement(target),
       word:    target,
       explain: exp,
       brs:     getBRs(exp),
       note:    note,
       container: null,

       getScore: function(){
         var ld = this.getLearningData();
         return Math.min((ld.count || 0) / 15, 1);
       },

       hide: function(){
         this.container.style.display = 'none';
       },

       show: function(){
         this.container.style.display = null;
       },

       getExpires: function(){
         var ld = this.getLearningData();
         if(!ld.start) return null;
         if(!ld.date){
           return Date.now() - 3600000 * 24;
         }
         var R = ld.date + (10 * Math.pow(2, (ld.count || 0))) * 1000;
         if(isNaN(R)) console.log(this.text, 
                                  ld.date,
                                  Math.pow(1.5, (ld.count || 0)), ld);
         return R;
       },

       getLearningData: function(){
         return this.note.getLearningData(this.text);
       },


       init: function(){
         var parent = this.word.parentNode;
         parent.removeChild(this.word);
         parent.removeChild(this.explain);
         var brs = this.brs;
         for(var i=0,l=brs.length;i&amp;lt;l;i++){
           parent.removeChild(brs[i]);
         }
         var container = document.createElement('div');
         this.container = container;
         container.appendChild(this.word);
         container.appendChild(this.explain);
       },

       explainList: function(){
         var exp = this.explain.cloneNode(true);
         exp.style.display = 'block';
         var content = exp.textContent;
         if(!content) return exp;
         var all = content.split(/\s*;\s*/);
         if(all.length &amp;lt; 2) return exp;
         var ul = document.createElement('ul');
         for(var i=0,l=all.length;i&amp;lt;l;i++){
           var li = document.createElement('li');
           li.appendChild(document.createTextNode(all[i]));
           ul.appendChild(li);
         }
         return ul;
       },

       makeQuestion: function(wait){
         var container = this.note.wordContainer;
         var ld = this.getLearningData();
         container.innerHTML = '';
         if(ld.repeat){
           container.style.background = '#FFC';
         }
         var input = document.createElement('input');
         var self = this;
         input.addEventListener(
           'keyup',
           function(ev){
             if(ev.keyCode != KEY_RETURN) return;
             self.checkAnswer(input.value);
           }
         );
         if(ld.repeat == 1){
           input.type = 'password';
         }
         var exp = this.explainList();
         container.appendChild(input);
         container.appendChild(exp);
         input.style.fontSize = '2em';
         input.style.opacity = '0';
         input.disabled = true;
         setTimeout(
           function(){
             input.style.opacity = null;
             input.disabled = false;
             input.focus();
           },
           (wait || 0));
       },

       showAnswer: function(answer, repeat){
         var success   = (answer === null || answer === undefined);
         var container = this.note.wordContainer;
         container.innerHTML = '';
         container.style.background = success ? '#CFC' : '#FCC';
         var correct = document.createElement('div');
         correct.appendChild(document.createTextNode(
                              repeat == 1 ? this.text.replace(/./g,'*') : this.text
                             ));
         correct.style.fontSize = '2em';
         container.appendChild(correct);
         if(!success){
           var youwrote = document.createElement('div');
           youwrote.appendChild(document.createTextNode(answer));
           youwrote.style.color = '#C99';
           container.appendChild(youwrote);
         }
         var exp = this.explainList();
         container.appendChild(exp);

         var ul = document.createElement('ul');
         ul.innerHTML = 
           [
             '&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;',dictURL(this.text),
             '&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;search definition of &amp;amp;quot;',
             this.text,'&amp;amp;quot;.&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;',
             '&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;',imgSearchURL(this.text),
             '&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;search images about &amp;amp;quot;',
             this.text, '&amp;amp;quot;.&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;',
             '&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;',sentenceURL(this.text),
             '&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;sentences with &amp;amp;quot;',
             this.text, '&amp;amp;quot;.&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;',
             '&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;',translateURL(this.text),
             '&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Google translate: &amp;quot;',this.text,'&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;'
           ].join('');
         container.appendChild(ul);
         ul.style.fontSize = '11px';

         var button = document.createElement('div');
         button.appendChild(document.createTextNode('NEXT TERM'));
         button.style.cssText = [
           'background: '+(success ? 'lime;' : 'red;'),
           'color:black;',
           'border-radius: 10px;',
           'text-align: center;',
           'padding: 5px;',
           'margin: 5px;',
           'cursor: pointer;',
           ''
         ].join('\n');
         button.tabIndex = 0;
         var self = this;
         var wait = (repeat || -1) == 1 ? 10 * 1000 : 0;
         var lstnr = function(){
           container.style.background = null;
           container.innerHTML = '';
           self.note.nextQuestion(wait);
         };
         button.addEventListener('click',lstnr, false );
         button.addEventListener(
           'keyup',
           function(ev){
             if(ev.keyCode == KEY_RETURN) lstnr();
           }, false
         );
         container.appendChild(button);
         if(success &amp;amp;&amp;amp; !repeat){
           var ld = this.getLearningData();
           var score = document.createElement('div');
           score.appendChild(document.createTextNode(
                               'You succeed: ' + ld.count+ ' times'));
           score.style.cssText = [
             'text-align:right;',
             'font-size: 11px;'
           ].join('\n');
           container.appendChild(score);
         }
         button.focus();
         this.note.updateScore();

       },

       checkAnswer: function(answer){
         if(this.text == answer) return this.success();
         return this.fail(answer);
       },


       learned: function(){
         var slot = this.getLearningData();
         var now = Date.now();
         if(!slot.start){
           console.log(this.text, &amp;quot;is already learned....&amp;quot;);
           slot.start = now;
           slot.date  = now - 3600000;
           slot.count = 10;
         }else{
           if(slot.repeat){
             slot.repeat--;
           }else{
             slot.date = now;
             slot.count++;
           }
         }
         this.note.saveToStorage();
       },

       success: function(){
         var ld = this.getLearningData();
         var rep = ld.repeat;
         this.learned();
         this.showAnswer(null, rep);
         return true;
       },


       forget: function(){
         var slot = this.getLearningData();
         if(!slot.start) slot.start = Date.now();
         slot.repeat = 2;
         slot.count = 0;
         this.note.saveToStorage();
       },

       fail: function(answer){
         this.forget();
         this.showAnswer(answer);
         return false;
       }


     };
     card.init();
     return card;
   };

   
   var detectId = function(){

     var getQuery = function(){
       var src = location.search;
       if(!src || src.length &amp;lt; 3) return {};
       var pairs = src.substring(1).split(&amp;quot;&amp;amp;&amp;quot;);
       var R = {};
       for(var i=0,l=pairs.length;i&amp;lt;l;i++){
         var kv = pairs[i].split(&amp;quot;=&amp;quot;);
         var key = decodeURIComponent(kv[0]);
         var val = decodeURIComponent(kv[1]);
         R[key]=val;
       }
       return R;
     };

     var query = getQuery();
     return query.id;
   };


   var createNote = function(){


     var note = {
       id: detectId(),
       cards: null,
       session: {memorised:{}},
       container: document.querySelector('#core div.ewnormaltextPanel'),
       infoContainer: null,
       wordContainer: null,
       currentCard: null,


       getLearningData: function(word){
         var slot = this.session.memorised[word];
         if(slot &amp;amp;&amp;amp; slot.start) return slot;
         slot = {count: 0};
         this.session.memorised[word] = slot;
         return slot;
       },

       loadFromStorage: function(){
         var stored = sessionStorage.getItem(note.id);
         try{
           if(!stored) throw new Exception();             
           var data = JSON.parse(stored);
           if(!data.memorised) data.memorised = {};
           this.session = data;
         }catch(e){
           this.session = {
             memorised: {}
           };
           return;
         }
       },

       saveToStorage: function(){
         sessionStorage.setItem(note.id, JSON.stringify(this.session));
       },

       initContainer: function(){
         var cont = this.container;
         cont.style.width = '600px';
         var frgn = document.createDocumentFragment();
         while(cont.firstChild){
           var e = cont.firstChild;
           cont.removeChild(e);
           frgn.appendChild(e);
         }
         this.savedFragment = frgn;
         var ic = document.createElement('div');
         var wc = document.createElement('div');
         cont.appendChild(ic);
         cont.appendChild(wc);
         ic.style.fontSize  = '11px';
         ic.style.textAlign = 'right';
         ic.style.height    = '1em';
         this.infoContainer = ic;
         this.wordContainer = wc;
       },

       init: function(){
         this.loadFromStorage();
         this.initContainer();
         var words = this.cards;
         for(var w in words){
           var s = words[w];
         }
       },

       reset: function(){
         this.session = {};
         this.saveToStorage();
         location.reload();
       },

       dump: function(){
         dumpData(JSON.stringify(this.session));
       },

       getAllCards: function(){
         var R = [];
         var cards = this.cards;
         for(var f in cards) R.push(cards[f]);
         return R;
       },

       getCurrentCard: function(){
         var cards = this.cards;
         var R = null;
         var minExp = null;
         var noExp = null;
         for(var f in cards){
           var c = cards[f];
           var e = c.getExpires();
           if(e === null){
             if(!noExp){
               noExp = c;
             }
           }else if(!minExp ||
                    e &amp;lt; minExp){
             R = c;
             minExp = e;
           }
         }
         if(!R) return noExp;
         if(minExp &amp;gt; Date.now()) return noExp;
         return (R || noExp);
       },

       nextQuestion: function(wait){
         this.updateScore();
         this.getCurrentCard().makeQuestion(wait);
       },


       updateScore: function(){
         var round = function(n){
           return Math.floor(n * 100) / 100;
         };
         var sc = this.getScore();
         var ic =  this.infoContainer;
         ic.innerHTML = '';
         ic.appendChild(document.createTextNode(
                          round(sc.score) + ' / ' +
                            sc.all +  ' : ' +
                            round(sc.rate * 100) + '%'
                        ));
       },


       getScore: function(){
         var all   = 0;
         var score = 0;
         var cards = this.cards;
         for(var f in cards){
           score += cards[f].getScore();
           all++;
         }
         return {
           score: score,
           all: all,
           rate: score / all
         };
       }

     };

     note.cards = (
       function(note){
         var R = {};
         var words = document.querySelectorAll(&amp;quot;.listWordWord&amp;quot;);
         if(!(words &amp;amp;&amp;amp; words.length)){
           words = document.querySelectorAll(&amp;quot;.listWordWord2&amp;quot;);
         }
         var cards=0;
         for(var i=0,l=words.length;i&amp;lt;l;i++){
           var target = createFlashCard(words[i], note);
           R[target.text] = target;
           cards++;
         }
         return R;
       }
     )(note);

     return note;
   };


   var createControler = function(note){
     var genButton = function(title, action){
       var span = document.createElement('span');
       span.appendChild(document.createTextNode(title));
       span.addEventListener('click', action, false);
       var csstext = Array.prototype.slice.apply(
         arguments, [2]
       ).join(&amp;quot;\n&amp;quot;);
       span.style.cssText = csstext;
       span.style.display = 'inline-table';
       span.style.margin       = '2px';
       span.style.padding      = '1px 3px';
       span.style.borderRadius = '3px';
       span.style.cursor       = 'pointer';
       return span;
     };

     var initGUI = function(ctrl){
       var container = document.querySelector('div#core td.rdtop_title');
       var dump = genButton(
         'dump', function(){ ctrl.dump(); },
         'background-color: #CCC;',
         'color: #666;'
       );
       container.appendChild(dump);
       var reset = genButton(
         'reset', function(){
           if(confirm('really?')) ctrl.reset();
         },
         'background-color: red;',
         'color: white;'
       );
       container.appendChild(reset);
     };

     var ctrl = {
       note: note,
       reset: function(){
         this.note.reset();
       },
       dump: function(){
         this.note.dump();
       },
       init: function(){
         initGUI(this);
       }
     };
     return ctrl;
   };


   var main = function(){
     var note = createNote();
     var ctrl = createControler(note);
     note.init();
     ctrl.init();
     note.nextQuestion();
   };
   

   main();
})(window.console ? window.console : {log:function(){}});


&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/hLHVsZr6oIlk">
    <link>https://let.hatelabo.jp/lieutar/let/hLHVsZr6oIlk</link>
    <dc:date>2014-04-22T21:13:42Z</dc:date>
    <description>http://www.examword.com/toefl で紹介されている TOEFL Vocabulary List の機能拡張</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] TOEFL Vocabulary List で覚えたワードを消したりテストしたりできるようにするもの</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FhLHVsZr6oIlk.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;TOEFL Vocabulary List で覚えたワードを消したりテストしたりできるようにするもの&lt;/a&gt;&lt;pre&gt;/*
 * @title TOEFL Vocabulary List で覚えたワードを消したりテストしたりできるようにするもの
 * @description http://www.examword.com/toefl で紹介されている TOEFL Vocabulary List の機能拡張
 * @include http://www.examword.com/toefl/practice.aspx
 * @license MIT License
 * @require 
 */

(function(){

   

   var findWords = function(){

     var getWordFromElement = function(wordElem){
       var content = wordElem.textContent;
       return content.replace(/:$/, '');
     };

     var getExplain = function(wordElem){
       for(var n = wordElem.nextSibling;n;n = n.nextSibling){
         if(String(n.className) == 'listWordExplanation') return n;
       }
       return null;
     };

     var getBRs = function(exp){
       var R = [];
       for(var n = exp.nextSibling;n;n=n.nextSibling){
         if(String(n.tagName).toLowerCase() == 'br')R.push(n);
         if(String(n.tagName).toLowerCase() == 'span')break;
       }
       return R;
     };

     var R = {};
     var words = document.querySelectorAll(&amp;quot;.listWordWord&amp;quot;);
     for(var i=0,l=words.length;i&amp;lt;l;i++){
       var target = words[i];
       var word = getWordFromElement(target);
       var explain = getExplain(target);
       var brs = getBRs(explain);
       R[word] = {
         text: word,
         word: target,
         explain: explain,
         brs: brs
       };
     }
     return R;
   };
   
   var detectId = function(){

     var getQuery = function(){
       var src = location.search;
       if(!src || src.length &amp;lt; 3) return {};
       var pairs = src.substring(1).split(&amp;quot;&amp;amp;&amp;quot;);
       var R = {};
       for(var i=0,l=pairs.length;i&amp;lt;l;i++){
         var kv = pairs[i].split(&amp;quot;=&amp;quot;);
         var key = decodeURIComponent(kv[0]);
         var val = decodeURIComponent(kv[1]);
         R[key]=val;
       }
       return R;
     };

     var query = getQuery();
     return query.id;
   };

   var createNote = function(){
     var note = {
       id: detectId(),
       wordsList:findWords(),
       session: {memorised:{}},
       container: document.querySelector('#core div.ewnormaltextPanel'),
       wordContainer: null,

       initWordButton: function(s){
         var note = this;
         var container = document.createElement('div');
         var word = s.word;
         var exp  = s.explain;
         var brs  = s.brs;
         word.parentNode.insertBefore(container, word);
         var elems = [word, exp].concat(brs);
         for(var i=0,l=elems.length;i&amp;lt;l;i++){
           var e = elems[i];
           e.parentNode.removeChild(e);
           if(String(e.tagName).toLowerCase() == 'br')continue;
           container.appendChild(e);
         }
         s.container = container;

         var button = document.createElement('span');
         button.appendChild(document.createTextNode('X'));
         button.style.cssText = [
           'display: inline-blodk;',
           'width: 10px;',
           'height: 10px;',
           'line-height: 8px;',
           'font-size: 8px;',
           'color: white;',
           'background-color: red;',
           'border-radius: 5px;',
           'font-weight:900;',
           'cursor: pointer;'
         ].join('\n');
         button.addEventListener(
           'click',
           function(){
             note.hide(s);
             note.learned(s.text);
           },
           false
         );
         s.deleteButton = button;

         word.insertBefore(document.createTextNode(' '), word.firstChild);
         word.insertBefore(button, word.firstChild);

         if(this.session.memorised[s.text]){
           this.hide(s);
         }
       },

       learned: function(word){
         this.session.memorised[word] = true;
         this.saveStorage();
       },

       hide: function(s){
         s.container.style.display = 'none';
       },

       show: function(s){
         s.container.style.display = null;
       },

       loadStorage: function(){
         var stored = sessionStorage.getItem(note.id);
         if(!stored){
           this.session = {
             memorised: {}
           };
           return;
         }  
         var decoded = decodeURIComponent(stored);
         this.session = JSON.parse(decoded);
       },

       saveStorage: function(){
         var decoded = JSON.stringify(this.session);
         var encoded = encodeURIComponent(decoded);
         sessionStorage.setItem(note.id, encoded);
       },

       initContainer: function(){
         this.container.style.width = 
           this.container.clientWidth + 'px';
       },

       init: function(){
         this.loadStorage();
         this.initContainer();
         var words = this.wordsList;
         for(var w in words){
           var s = words[w];
           this.initWordButton(s);
         }
       },

       isMemorised: function(s){
         return !!this.session.memorised[s.text];
       },

       update: function(){
         var words = this.wordsList;
         for(var w in words){
           var s = words[w];
           if(this.isMemorised(s)){
             this.hide(s);
           }else{
             this.show(s);
           }
         }
       },

       reset: function(){
         this.session.memorised = {};
         this.saveStorage();
         if(this.savedFragment){
           this.endQuestion();
         }else{
           this.update();
         }
       },

       getMemorised: function(){
         var tmp = this.session.memorised;
         var R = [];
         for(var f in tmp) R.push(f);
         return R;
       },

       examine: function(){

         var memorised = this.getMemorised();
         if(memorised.length &amp;lt; 1){
           alert('You memorised no words.');
           return;
         }


         var shuffle = function(a) {
           var i = a.length, j, temp;
           if ( i == 0 ) return;
           while ( --i ) {
             j = Math.floor( Math.random() * ( i + 1 ) );
             temp = a[i];
             a[i] = a[j];
             a[j] = temp;
           }
         };
         shuffle(memorised);

         this.questions = memorised;
         var frgn = document.createDocumentFragment();
         var cont = this.container;
         while(cont.firstChild){
           var e = cont.firstChild;
           cont.removeChild(e);
           frgn.appendChild(e);
         }
         this.savedFragment = frgn;
         this.nextQuestion();
       },

       nextQuestion: function(){
         var word = this.questions.shift();
         if(!word){
           this.endQuestion();
           return;
         }
         this.container.innerHTML = '';
         var s = this.wordsList[word];
         var input = document.createElement('input');
         var self = this;
         input.addEventListener(
           'keyup',
           function(ev){
             if(ev.keyCode != 13) return;
             self.checkAnswer(s, input.value);
           }
         );
         var exp = s.explain.cloneNode(true);
         exp.style.display = 'block';
         this.container.appendChild(input);
         this.container.appendChild(exp);
         input.focus();
       },

       checkAnswer: function(s, answer){
         if(s.text != answer){
           delete this.session.memorised[s.text];
           this.saveStorage();
           this.container.style.background = '#FCC';
           this.container.innerHTML = '';
           this.container.appendChild(document.createTextNode(s.text));
           var exp = s.explain.cloneNode(true);
           exp.style.display = 'block';
           this.container.appendChild(exp);
           var self = this;
           var lstnr = function(){
             self.container.style.background = null;
             self.nextQuestion();
             self.container.removeEventListener('click',lstnr, false );
           };
           this.container.addEventListener(  'click',lstnr, false );
         }else{
           this.nextQuestion();
         }
       },

       endQuestion: function(){
         this.container.innerHTML = '';
         this.container.appendChild(this.savedFragment);
         delete this.questions;
         delete this.savedFragment;
         this.update();
       }

     };
     return note;
   };


   var createControler = function(note){
     var genButton = function(title, action){
       var span = document.createElement('span');
       span.appendChild(document.createTextNode(title));
       span.addEventListener('click', action, false);
       var csstext = Array.prototype.slice.apply(
         arguments, [2]
       ).join(&amp;quot;\n&amp;quot;);
       span.style.cssText = csstext;
       span.style.display = 'inline-table';
       span.style.margin       = '2px';
       span.style.padding      = '1px 3px';
       span.style.borderRadius = '3px';
       span.style.cursor       = 'pointer';
       return span;
     };

     var initGUI = function(ctrl){
       var container = document.querySelector('div#core td.rdtop_title');
       var reset = genButton(
         'reset', function(){
           if(confirm('really?')) ctrl.reset();
         },
         'background-color: red;',
         'color: white;'
       );
       var exam = genButton(
         'examine', function(){
           ctrl.examine();
         },
         'background-color: green;',
         'color:white;'
       );
       container.appendChild(exam);
       container.appendChild(reset);
     };

     var ctrl = {
       note: note,
       reset: function(){
         this.note.reset();
       },
       examine: function(){
         this.note.examine();
       },
       init: function(){
         initGUI(this);
       }
     };
     return ctrl;
   };


   var main = function(){
     var note = createNote();
     var ctrl = createControler(note);
     note.init();
     ctrl.init();
   };
   

   main();
})();


&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/hLHUqPvRvJQh">
    <link>https://let.hatelabo.jp/lieutar/let/hLHUqPvRvJQh</link>
    <dc:date>2013-09-25T21:20:04Z</dc:date>
    <description>自動クッキー叩き、いくつかの実績取得に合わせた自動購入、そしてチート</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] クッキーのアレを遊ぶ</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FhLHUqPvRvJQh.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;クッキーのアレを遊ぶ&lt;/a&gt;&lt;pre&gt;/*
 * @title クッキーのアレを遊ぶ
 * @description 自動クッキー叩き、いくつかの実績取得に合わせた自動購入、そしてチート
 * @include http://orteil.dashnet.org/cookieclicker/
 * @license MIT License
 * @require 
 */

(function(){
   window.GameX = {};

   GameX.Cheats = {};
   GameX.CheatCommands = {};
   GameX.Autopilots = {};
   

   var AbstractCheat = function(opt){
     opt = opt || {};
     this.name   = opt.name;
     this.enabled = 'enabled' in opt ? opt.enabled : false;
     this.Init = opt.init || function(){};
     this.Logic = opt.logic || function(){};
     this.Init();
     var self = this;
     var onToggle = opt.onToggle || function(){};
     this.Toggle = function(e){
       self.enabled = !self.enabled;
       onToggle.apply(self, [self.enabled]);
     };
     this.Iter = function(){
       if(!self.enabled) return;
       self.Logic();
     };

     this.UpdateButton = function(button){
       button.innerHTML = '';
       button.className = 'option' + (self.enabled ? ' enabled' : '');
       button.appendChild(document.createTextNode(self.name + ' ' + (self.enabled ? 'ON' : 'OFF')));
     };
     this.MakeButton =function(list){
       var button = document.createElement('a');
       list.appendChild(button);
       button.onclick=function(e){
         self.Toggle();
         self.UpdateButton(button);
       };
       self.UpdateButton(button);
     };
   };

   var GetCheatedCookie = function(){
     if(!this.enabled &amp;amp;&amp;amp; Game.Achievements['Cheated cookies taste awful']) return;
     Game.Win('Cheated cookies taste awful');
   };

   GameX.Cheat = function(opt){
     opt = opt || {};
     if(!('enabled' in opt))opt.enabled = false;
     AbstractCheat.apply(this, [opt]);
     this.Iter = (
       function(orig){
         return function(){
           GetCheatedCookie();
           orig.apply(this, arguments);
         };
       }
     )(this.Iter);
     GameX.Cheats[this.name] = this;
   };

   GameX.Autopilot = function(opt){
     AbstractCheat.apply(this, arguments);
     GameX.Autopilots[this.name] = this;
   };

   GameX.CheatCommand = function(opt){
     opt = opt || {};
     this.name   = opt.name;
     this.action = opt.action;
     GameX.CheatCommands[this.name]=this;
     var self = this;
     this.MakeButton = function(list){
       var button = document.createElement('a');
       list.appendChild(button);
       button.className = 'option';
       button.appendChild(document.createTextNode(self.name));
       button.onclick = function(){
         GetCheatedCookie();
         self.action();
       };
     };
   };

   new GameX.Autopilot(
     {
       name: 'auto clicking',
       logic: function(){
         Game.ClickCookie();
       }
     }
   );

   new GameX.Cheat(
     {
       name: 'rapid production of golden cookies',
       init: function(){
         var self = this;
         var R = null;
         var g = Game.goldenCookie;
         (function(c){
            c=g.choose;
            g.choose=function(){
              if(!self.enabled) return c();
              R = g.wraith&amp;lt;=0 ? c() : choose(['chain cookie',
                                              'blood frenzy']);
              return R;
            };
          })(g.choose);
         
         (function(C){
            g.click=function(){
              C();
              if(!self.enabled) return;
              setTimeout(function(){g.delay=0;},
                         {'frenzy': 77000,
                          'blood frenzy': 6000,
                          'click frenzy': 6000}[R]||0);
            };
          })(g.click);
       },
       onToggle: function(flag){
         if(!flag) return;
         Game.goldenCookie.life=0;
         Game.goldenCookie.delay=0;
       },
       logic: function(){
       }
     }
   );

   new GameX.Cheat(
     {
       name: 'rapid research',
       init: function(){
       },
       logic: function(){
         Game.researchT=0;
       }
     }
   );

   new GameX.Autopilot(
     {
       name: 'auto clicking of golden cookies',
       logic: function(){
         var g = Game.goldenCookie;
         if(g.delay == 0)g.click();
       }
     }
   );



   new GameX.Autopilot(
     {
       name: 'auto purchase',
       logic: function(){

         if(!Game.Achievements['Just wrong'].won &amp;amp;&amp;amp;
            Game.Objects['Grandma'].amount &amp;gt; 0)
           Game.Objects['Grandma'].sell();
       
         var limit =  {
           'Cursor':200,
           'Grandma': 100,
           'Farm':100,
           'Factory':100,
           'Mine':100,
           'Shipment':100,
           'Alchemy lab':100,
           'Portal':100,
           'Time machine':100,
           'Antimatter condenser':100
         };

         if(!Game.Achievements['Mathematician'].won){
           limit = {
             'Cursor':128,
             'Grandma':128,
             'Farm':128,
             'Factory':64,
             'Mine':32,
             'Shipment':16,
             'Alchemy lab':8,
             'Portal':4,
             'Time machine':2,
             'Antimatter condenser':1
           };
           for(var name in limit){
             var o = Game.Objects[name];
             var sell = o.amount - limit[name];
             for(var i=0;i&amp;lt;sell;i++){
               o.sell();
             }
           }
         }else{
           var flag = true;
           for(var obj in limit){
             if(limit[obj] &amp;lt;= Game.Objects[obj].amount) continue;
             flag = false;
             break;
           }
           if(flag){
             limit['Cursor'] = 0;
             limit['Grandma'] = 0;
             limit['Portal'] = 0;
             limit['Antimatter condenser'] = 0;
           }
         }

         var item = {price: Game.cookies+1, buy: function(){}};
         for(var i in Game.ObjectsById)(
           function(o){
             var max = limit[o.name];
             if(max &amp;gt; 0 &amp;amp;&amp;amp; max &amp;lt;= o.amount) return;
             if(o.price &amp;lt;= Game.cookies &amp;amp;&amp;amp; o.price &amp;lt; item.price){
               item = {
                 price: o.price,
                 buy: function(){
                   o.buy();
                 }
               };
             }
           }
         )(Game.ObjectsById[i]);
         for(var i in Game.UpgradesById)(
           function(o){
             var price = o.basePrice;
             if({
                  'One mind': true,
                  'Communal brainsweep': true,
                  'Elder Pact': true,
                  'Elder Pledge': true,
                  'Revoke Elder Covenant':true
                }[o.name]) return;
             if(!o.unlocked || o.bought || price &amp;gt; Game.cookies || item.price &amp;lt; price) return;
             item = {price: price, 
                     buy: function(){
                       o.buy();
                     }};
           }
         )(Game.UpgradesById[i]);
         item.buy();
       }
     }
   );

   new GameX.CheatCommand(
     {
       name: &amp;quot;earn heavenly chips&amp;quot;,
       action: function(){
         if(Game.prestige['Heavenly chips'] &amp;lt; 1){
           Game.prestige['Heavenly chips'] = 1;
         }else{
           Game.prestige['Heavenly chips'] *= 10;
         }
       }
     }
   );


   
   GameX.Iter = function(){
     var name;
     for(name in GameX.Autopilots){
       GameX.Autopilots[name].Iter();
     }
     for(name in GameX.Cheats){
       GameX.Cheats[name].Iter();
     }
   };


   (function(L){
      if(Game._cheat_installed_) return;
      Game._cheat_installed_ = true;

      (function(orig){
         Game.UpdateMenu = function(){
           orig();
           if(Game.onMenu == 'prefs'){
             var subs = document.querySelector('#menu &amp;gt; .subsection');
             var set = {
               Autopilot: GameX.Autopilots,
               Cheat: GameX.Cheats,
               'Cheat Command': GameX.CheatCommands
             };
             for(var section in set) (
               function(section){

                 var title = document.createElement('div');
                 subs.appendChild(title);
                 title.className = 'title';
                 title.appendChild(document.createTextNode(section));
                 var list = document.createElement('div');
                 list.className = 'listing';
                 subs.appendChild(list);
                 for(var name in set[section]){
                   set[section][name].MakeButton(list);
                 }
               }
             )(section);
           }
         };
       })(Game.UpdateMenu);

      Game.Loop = function(){
        GameX.Iter();
        L();
      };
      Game.Popup('Bookmarklet is installed.&amp;lt;br&amp;gt;Show the [Menu] screen.&amp;lt;br&amp;gt;');

    })(Game.Loop);

 })();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/gYC-y6mnio2MGA">
    <link>https://let.hatelabo.jp/lieutar/let/gYC-y6mnio2MGA</link>
    <dc:date>2011-01-03T05:54:52Z</dc:date>
    <description>URLのクエリ文字列を見やすく表示するもの。ウインドウクリックで消去</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] display-query-string</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FgYC-y6mnio2MGA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;display-query-string&lt;/a&gt;&lt;pre&gt;/*
 * @title display-query-string
 * @description URLのクエリ文字列を見やすく表示するもの。ウインドウクリックで消去
 * @include http://*
 * @license MIT License
 * @require 
 */

(function(){

   if(!('JCT8836' in window)){
     window.JCT8836 = false;
     var script = document.createElement('script');
     script.src = 'http://www.drk7.jp/pub/js/ecl_test/ecl_new.js';
     document.body.appendChild(script);
   }

   if(!window.JCT8836){
     setTimeout(arguments.callee, 100);
     return;
   }

   var decode_uri = function(src){
     if(!src.match(/%[0-9A-Fa-f]{2}/)) return src;
     var code = GetEscapeCodeType(src);
     var meth = 'Unescape' + code;
     return window[meth](src) + &amp;quot; (&amp;quot;+code+&amp;quot;)&amp;quot;;
   };

   var href = location.href;
   var match = href.match(/\?([^#]*)/);
  if(!match) return;
   var params = [];

   var dl = document.createElement('dl');
   document.body.appendChild(dl);
   match[1].split(/&amp;amp;/).forEach(
     function(pair_src){
       var pair = pair_src.split(/=/,2);
       var key  = decode_uri(pair[0]);
       var val  = decode_uri(pair[1]);
       var dt = document.createElement('dt');
       dl.appendChild(dt);
       var dd = document.createElement('dd');
       dl.appendChild(dd);
       dt.appendChild(document.createTextNode(key));
       dd.appendChild(document.createTextNode(val));
     }
   );

   dl.style.cssText = &amp;quot;&amp;quot; +
     &amp;quot;position:fixed;&amp;quot; +
     &amp;quot;z-index: 65536;&amp;quot; +
     &amp;quot;overflow: auto;&amp;quot; +
     &amp;quot;max-height: 300px;&amp;quot; +
     &amp;quot;background: rgba(200,200,200,0.85);&amp;quot; +
     &amp;quot;padding: 10px;&amp;quot; +
     &amp;quot;width: 40%;&amp;quot; +
     &amp;quot;&amp;quot;;

   dl.style.top = (window.innerHeight - dl.clientHeight) / 2 + 'px';
   dl.style.left = (window.innerWidth - dl.clientWidth) / 2 + 'px';

   dl.addEventListener(
     'click', function(ev){
       ev.stopPropagation();
     }, false
   );

   window.addEventListener(
     'click', function(ev){
       dl.parentNode.removeChild(dl);
       window.removeEventListener('click', arguments.callee, false);
     }, false
   );

})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/gYC-x5zT_JWBOA">
    <link>https://let.hatelabo.jp/lieutar/let/gYC-x5zT_JWBOA</link>
    <dc:date>2010-12-30T06:12:55Z</dc:date>
    <description>はてなハイクで実行すると、星を打ちあう簡単な対戦型シューティングが初まる。カーソルキーで移動、Zで星発射。ESCで終了</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] はてなハイク STAR FIGHTERS</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FgYC-x5zT_JWBOA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;はてなハイク STAR FIGHTERS&lt;/a&gt;&lt;pre&gt;/*
 * @title はてなハイク STAR FIGHTERS
 * @description はてなハイクで実行すると、星を打ちあう簡単な対戦型シューティングが初まる。カーソルキーで移動、Zで星発射。ESCで終了
 * @include http://h.hatena.ne.jp/*
 * @include http://h1beta.hatena.ne.jp/*
 * @license MIT License
 * @require 
 */
//

(function(){

   var STARS = [
     'http://s.hatena.ne.jp/images/star.gif',
     'http://s.hatena.ne.jp/images/star-green.gif',
     'http://s.hatena.ne.jp/images/star-red.gif',
     'http://s.hatena.ne.jp/images/star-blue.gif',
     'http://s.hatena.ne.jp/images/star-purple.gif'
   ];


   var CSS_DIALOG = [
     'z-index:             131072;',
     'opacity:                0.9;',
     'display:              table;',
     'padding:               20px;',
     'font-size:             40px;',
     'font-weight:            900;',
     'background:            #C99;',
     'color:                 #FFF;',
     '-moz-border-radius:    20px;',
     '-webkit-border-radius: 20px;',
     'border-radius:         20px;',
     'position:             fixed;'
   ].join(&amp;quot;\n&amp;quot;);

   var CSS_NAMEPLATE= [
     'background:            #EEE;',
     'color:                 #339;',
     'font-size:             12px;',
     '-moz-border-radius:     5px;',
     '-webkit-border-radius:  5px;',
     'border-radius:          5px;'
   ].join(&amp;quot;\n&amp;quot;);

   var CSS_TITLE = [
     'position:             fixed;',
     'z-index:              65536;',
     'background:            #FFF;',
     'border:      solid #363 3px;',
     'color:                 #669;',
     'padding:               20px;',
     'font-size:             20px;',
     'font-weight:            900;',
     '-moz-border-radius:    10px;',
     '-webkit-border-radius: 10px;',
     'border-radius:         10px;'
   ].join(&amp;quot;\n&amp;quot;);

   var CSS_TITLE2 = [
     'font-size:             12px;'
   ].join(&amp;quot; &amp;quot;);

   var CSS_KBD = [
     'display:       inline-block;',
     'background:            #CCC;',
     'min-width:            1.2em;',
     'height:               1.2em;',
     'padding:                1px;',
     'border:       solid #EEE 1px;',
     'border-color: #EEE #999 #999 #EEE;',
     'margin:                  1px;'
   ].join(&amp;quot; &amp;quot;);

   var HTML_TITLE = [
     '&amp;lt;img    src=&amp;quot;http://h.hatena.ne.jp/images/haiku_logo.gif&amp;quot;&amp;gt;',
     '&amp;lt;div style=&amp;quot;&amp;quot;&amp;gt;HATENA STAR FIGHTERS&amp;lt;/div&amp;gt;',
     '&amp;lt;div style=&amp;quot;'+CSS_TITLE2+'&amp;quot;',
     '  &amp;gt;PRESS &amp;lt;kbd style=&amp;quot;'+CSS_KBD+'&amp;quot;&amp;gt;Z&amp;lt;/kbd&amp;gt; KEY to START&amp;lt;/div&amp;gt;',
     '&amp;lt;div style=&amp;quot;'+CSS_TITLE2+'&amp;quot;',
     '  &amp;gt;PRESS &amp;lt;kbd style=&amp;quot;'+CSS_KBD+'&amp;quot;&amp;gt;ESC&amp;lt;/kbd&amp;gt; KEY to EXIT&amp;lt;/div&amp;gt;'
   ].join(&amp;quot;\n&amp;quot;);

   ////////////////////////////////////////////////////////////

   if(! 'forEach' in Array.prototype){
     Array.prototype.forEach = function(cb){
       for(var i=0,l=this.length;i&amp;lt;l;i++){
         cb(this[i],i);
       }
     };
   }

   if(! 'map' in Array.prototype){
     Array.prototype.map = function(cb){
       var R = [];
       for(var i=0,l=this.length;i&amp;lt;l;i++){
         R.push(cb(this[i],i));
       }
       return R;
     };
   }

   ////////////////////////////////////////////////////////////

   var defclass = function(spec, initializer){
     var base = spec.base;
     var klass = function(){};
     klass.prototype = base.prototype;
     var proto = new klass;
     if(!('initialize' in proto)) proto.initialize = function(){};
     var R     = function(){
       this.constructor = arguments.callee;
       this.initialize.apply(this,arguments);
     };

     R.prototype = proto;
     R._name      = spec.name;
     R._base      = base;
     R.getName    = function(){  return this._name;  };

     R.getBaseClasses = function(){
       var R = [this];
       if('getBaseClasses' in base){
         R.push.apply(R, base.getBaseClasses());
       } else {
         R.push(base);
       }
       return R;
     };

     initializer.apply(
       proto,
       [
         base.prototype,
         R
       ]
     );

     return R;
   };

   ////////////////////////////////////////////////////////////

   var AbstractKeyManager = defclass(
     {
       name: 'AbstractKeyManager',
       base: Object
     },
     function(SUPER, Class){
       this.initialize = function(){
         this._hooks     = [];
         this._lastKey   = null;
         this._lastEvent = null;
       };

       this.addHook = function(hook){
         this._hooks.push(hook);
       };

       this.deleteHook = function(hook){
         var hooks = this._hooks;
         var found = null;
         for(var i=0,l=hooks.length;i&amp;lt;l;i++){
           if(hook === hooks[i]){
             found = i;
             break;
           }
         }
         if( found !== null ){
           hooks.splice( found, 1 );
         }
       };

       this._runHooks = function(){
         var self = this;
         this._hooks.forEach(
           function(hook){
             hook.apply(self, []);
           }
         );
       };

       this.pushKey = function(k){
         this._lastKey = k;
         this._lastEvent = 'push';
       };

       this.releaseKey = function(k){
         this._lastKey = k;
         this._lastEvent = 'release';
       };
     }
   );

   var ShotKeyManager = defclass(
     {
       name: 'ShotKeyManager',
       base: AbstractKeyManager
     },
     function(SUPER, Class){
       this.pushKey = function(k){
         SUPER.releaseKey.apply(this, [k]);
         this._runHooks();
       };
       this.releaseKey = function(k){
         SUPER.releaseKey.apply(this, [k]);
         this._runHooks();
       };
     }
   );

   var ArrowKeyManager = defclass(
     {
       name: 'ArrowKeyManager',
       base: AbstractKeyManager
     },
     function(SUPER, Class){

       this.initialize = function(){
         SUPER.initialize.apply(this,[]);
         this.pressed = {n:0,s:0,w:0,e:0};
       };

       this.pushKey = function(k){
         var pressed = this.pressed;
         switch(k){
         case 'n':
           pressed.n = (pressed.s &amp;gt; 0) ? 2 : 1;
           break;
         case 's':
           pressed.s = (pressed.n &amp;gt; 0) ? 2 : 1;
           break;
         case 'w':
           pressed.w = (pressed.e &amp;gt; 0) ? 2 : 1;
           break;
         case 'e':
           pressed.e = (pressed.w &amp;gt; 0) ? 2 : 1;
           break;
         }
         this._runHooks();
       };

       this.releaseKey = (
         function(){
           var timer = null;
           return function(k){
             var pressed = this.pressed;
             switch(k){
             case 'n':
               pressed.n = 0;
               break;
             case 's':
               pressed.s = 0;
               break;
             case 'w':
               pressed.w = 0;
               break;
             case 'e':
               pressed.e = 0;
             }
             var self = this;
             if(timer){
               clearTimeout(timer);
               timer = null;
             }
             timer = setTimeout(
               function(){
                 self._runHooks();
                 timer = null;
               },
               50
             );
           };
         }
       )();

       this.getCurrentDirection = function(){
         var pressed = this.pressed;
         var x = 0;
         var y = 0;
         if(pressed.s != pressed.n) y = pressed.s &amp;gt; pressed.n ? 1 : -1;
         if(pressed.w != pressed.e) x = pressed.e &amp;gt; pressed.w ? 1 : -1;
         return {x:x, y:y};
       };

     }
   );

   ////////////////////////////////////////////////////////////

   var Game = new (
     defclass(
       {
         base: Object,
         name: 'Game'
       },
       function(SUPER, Class){
         this.initialize = function(opt){
           this.currentState  = null;
           this._states       = {};
           this._end          = false;
           var akman = new ArrowKeyManager();
           var skman = new ShotKeyManager();
           var self = this;
           this.listeners = [
             [ document,
               'keypress',
               function(e){ e.preventDefault();},
               false ],
             [ window,
               'keydown', function(e){
                 e.stopPropagation();
                 e.preventDefault();
                 //       console.log(e.keyCode);
                 switch(e.keyCode){
                 case 27: // ESC
                   self.end();
                   break;
                 case 37: // LEFT
                   akman.pushKey('w');
                   break;
                 case 38: // UP
                   akman.pushKey('n');
                   break;
                 case 39: // RIGHT
                   akman.pushKey('e');
                   break;
                 case 40: // DOWN
                   akman.pushKey('s');
                   break;
                 case 90: // Z
                   skman.pushKey(1);
                 }
               }, true ],
             [ window,
               'keyup', function(e){
                 e.stopPropagation();
                 e.preventDefault();
                 switch(e.keyCode){
                 case 37: // LEFT
                   akman.releaseKey('w');
                   break;
                 case 38: // UP
                   akman.releaseKey('n');
                   break;
                 case 39: // RIGHT
                   akman.releaseKey('e');
                   break;
                 case 40: // DOWN
                   akman.releaseKey('s');
                   break;
                 case 90: // Z
                   skman.releaseKey(1);
                 }
               }, true]
           ];
           this.arrowKeyManager = akman;
           this.shotKeyManager  = skman;
           this.initEventListeners();
         };

         this.initEventListeners = function(){
           this.listeners.forEach(
             function(spec){
               spec[0].addEventListener(spec[1],spec[2],spec[3]);
             }
           );
         };

         this.removeEventListeners = function(){
           this.listeners.forEach(
             function(spec){
               spec[0].removeEventListener(spec[1],spec[2],spec[3]);
             }
           );
         };

         this.registerState = function(key, state){
           this._states[key] = state;
         };

         this.unregisterState = function(){
         };

         this.gotoState = function(key){
           if(this._end) return;
           if(this.currentState){
             this.currentState.end();
           }
           this.currentState = this._states[key];
           if(this.currentState){
             this.currentState.start();
           } else {
             this.end();
           }
         };

         this.end = function(){
           this._end = true;
           if(!this.currentState) return;
           this.removeEventListeners();
           this.currentState.end();
         };

       }) // end of defclass
   ); // end of new

   ////////////////////////////////////////////////////////////
   var GameState = defclass(
     {
       base: Object,
       name: 'GameState'
     },
     function(SUPER, Class){
       this.initialize = function(){
       };
       this.start = function(){
       };
       this.end = function(){
       };
     }
   );

   var GameTitleState = defclass(
     {
       base: GameState,
       name: 'GameTitleState'
     },
     function(SUPER, Class){
       this.initialize = function(){
       };

       this.start = function(){
         var div = document.createElement('div');
         div.style.cssText = CSS_TITLE;
         div.innerHTML     = HTML_TITLE;
         document.body.appendChild(div);
         div.style.top     = (window.innerHeight - div.clientHeight) / 2 + 'px';
         div.style.left    = (window.innerWidth  -  div.clientWidth) / 2 + 'px';
         this._dialog      = div;
         var self = this;
         this._shotHook = function(){
           Game.gotoState('play');
         };
         Game.shotKeyManager.addHook(this._shotHook);
       };

       this.end = function(){
         Game.shotKeyManager.deleteHook(this._shotHook);
         this._dialog.parentNode.removeChild(this._dialog);
       };
     }
   );

   var GamePlayingState = defclass(
     {
       base: GameState,
       name: 'GamePlayingState'
     },
     function(SUPER, Class){


         this.initialize = function(){
           this.allElems     = {};
           this.elemDic      = {};
           this.timer        = null;
           this.running     = false;
           this._initializer = null;
         };

         this.setInitializer = function(cb){
           this._initializer = cb;
         };


         this.getElementsByClass  = function(cls){
           var elemDic = this.elemDic;
           var slot    = elemDic[cls._name || ''] || {};
           var R = [];
           for(var f in slot) R.push(slot[f]);
           return R;
         };

         this.registerElement = function(elem){
           var self = this;
           var elemDic = this.elemDic;
           this.allElems[elem.key] = elem;
           elem.constructor.getBaseClasses().forEach(
             function(cl){
               if(!cl._name) return;
               (elemDic[cl._name] || (elemDic[cl._name] = {}))[elem.key] = elem;
             }
           );
         };

         this.unregisterElement = function(elem){
           delete this.allElems[elem.key];
           var elemDic = this.elemDic;
           elem.constructor.getBaseClasses().forEach(
             function(cl){
               if(!(cl._name &amp;amp;&amp;amp; elemDic[cl._name])) return;
               delete elemDic[cl._name][elem.key];
             }
           );
         };

         this.iter = function(){
           var allElems = this.allElems;
           var elemDic  = this.elemDic;
           var i,l, ff;
           var elem;
           for(f in allElems){
             allElems[f].step();
           }

           var checked = {};
           for(f in allElems){
             elem = allElems[f];
             var tclasses = elem.getTargetClasses();
             l = tclasses.length;
             if(l &amp;lt; 1) continue;
             var chslot = (checked[f] || (checked[f] = {}));
             for(i=0,l=tclasses.length;i&amp;lt;l;i++){
               var edslot = elemDic[tclasses[i]];
               for(ff in edslot){
                 if(chslot[ff]) continue;
                 chslot[ff] = true;
                 var target = edslot[ff];
                 if(!elem.checkHit(target)) continue;
                 (checked[target.key] ||
                  (checked[target.key] = {}))[f] = true;
                 elem.onHit(target);
                 target.onHit(elem);
               }
             }
           }

           for(f in allElems){
             allElems[f].redraw();
           }
         };

         this.end = function(){
           if(!this.running) return;
           this.running = false;
           var allElems = this.allElems;
           for(var f in allElems){
             allElems[f].dispose();
           }
           Game.gotoState('title');
         };

         this.reset = function(){
           var allElems = this.allElems;
           for(var f in allElems){
             allElems[f].dispose();
           }
           if(this.timer) clearTimeout(this.timer);
           this.start();
         };

         this.start = function(){
           if(Game._end) return;
           var self = this;
           this._initializer();
           this.running = true;
           (function(){
              if(!self.running) return;
              self.iter();
              self.timer = setTimeout(arguments.callee, 10);
            })();
         };
     }
   );



   ////////////////////////////////////////////////////////////
   var titlebox = function(msg){
     return div;
   };

   var dialog = function(msg){
     var div = document.createElement('div');
     div.appendChild(document.createTextNode(msg));
     div.style.cssText = CSS_DIALOG;
     document.body.appendChild(div);
     div.style.left = (( window.innerWidth  - div.clientWidth  ) / 2 )+'px';
     div.style.top  = (( window.innerHeight - div.clientHeight ) / 2 )+'px';
     return div;
   };


   var StateLock = false;

   var endgame = function(msg){
     if(StateLock) return;
     StateLock = true;
     var div = dialog(msg);
     setTimeout(
       function(){
         div.parentNode.removeChild(div);
         var gameover = dialog('GAME OVER');
         setTimeout(
           function(){
             StateLock = false;
             gameover.parentNode.removeChild(gameover);
             Game.currentState.end();
           }, 3000
         );
       }, 3000);
   };

   var nextgame = function(msg){
     if(StateLock) return;
     StateLock = true;
     var div = dialog(msg);
     setTimeout(
       function(){
         div.parentNode.removeChild(div);
         StateLock = false;
         Game.currentState.reset();
       }, 3000);
   };


   ////////////////////////////////////////////////////////////

   var genImage = function(url , container){
     var img = document.createElement('img');
     img.src = url;
     return img;
   };

   var GameElement = defclass(
     {
       base: Object,
       name: 'GameElement'
     },
     function(SUPER, Class){
       var counter = 0;
       
       this.initialize = function(x,y){
         this.key    = 'elem_'+ counter++;
         this._x     = x;
         this._y     = y;
         this._pre_x = NaN;
         this._pre_y = NaN;
         this._speed = 1;
         this._dx    = 0;
         this._dy    = 0;
         this._pdx   = 0;
         this._pdy   = -1;
         this._elem  = this.makeElem();
         this.initElem(this._elem);
         Game.currentState.registerElement(this);
         this.redraw();
       };

       this.makeElem = function(){
         var div = document.createElement('div');
         div.style.border = 'solid black 2px';
         return div;
       };

       this.initElem = function(elem){
         document.body.appendChild(elem);
         elem.style.zIndex   = 65536;
         elem.style.position = 'fixed';
       };

       this.setSpeed = function(s){
         this._speed = s;
       };

       this.setPosition = function(x,y){
         this._x = x;
         this._y = y;
       };

       this.getPosition  = function(){
         return {
           x: this._x ,
           y: this._y
         };
       };

       this.getPreviousPosition = function(){
         return {
           x: this._pre_x,
           y: this._pre_y
         };
       };

       this.getSize = function(){
         var elem = this._elem;
         return {
           width: elem.clientWidth,
           height: elem.clientHeight
         };
       };

       this.getHitAreaSize = function(){
         return this.getSize();
       };
       
       this.getSpeed = function(){
         return this._speed;
       };
       
       this.setDirection = function(x, y){
         this._dx = x;
         this._dy = y;
       };

       this.getDirection = function(){
         return { x:this._dx, y:this._dy };
       };

       this.setShotDirection = function(x,y){
         this._pdx = x;
         this._pdy = y;
       };
       
       this.getShotDirection = function(){
         return { x:this._pdx, y:this._pdy };
       };

       this.step = function(){
         this._pre_x = this._x;
         this._pre_y = this._y;
         this._x = this._x + this._dx * this._speed;
         this._y = this._y + this._dy * this._speed;
       };

       // 
       this.dispose = function(){
         this.disposeElements();
         Game.currentState.unregisterElement(this);
         for(var f in this){
           if('function' == typeof this[f]){
             this[f] = function(){};
           }
         }
       };

       this.disposeElements = function(){
         var img = this._elem;
         if(img.parentNode) img.parentNode.removeChild(img);
       };
       
       // フレームごとの計算結果を元に
       this.redraw = function(){
         if(this._dispose){
           this.dispose();
           return;
         }
         var sx  = this._x;
         var sy  = this._y;
         var elem = this._elem;
         elem.style.top  = (sy - elem.clientHeight / 2) + 'px';
         elem.style.left = (sx - elem.clientWidth / 2) + 'px';
       };

       // 当たり判定の対象となるクラス群
       this.getTargetClasses = function(){
         return [];
       };
       

       this.getHitRectangle = function(){
         var size = this.getHitAreaSize();
         var w = size.width;
         var h = size.height;
         var sx = this._x;
         var sy = this._y;
         var x0 = sx - w / 2;
         var y0 = sy - h / 2;
         return { 
           x1: x0, 
           y1: y0,
           x2: x0 + w,
           y2: y0 + h
         };
       };

       // elem との当り判定を書く
       // TODO すりぬけない方法について学習する
        this.checkHit = function(elem){
          var sr = this.getHitRectangle();
          var er = elem.getHitRectangle();
          var x0 = sr.x1;
          var x1 = sr.x2;
          var x2 = er.x1;
          var x3 = er.x2;
          var y0 = sr.y1;
          var y1 = sr.y2;
          var y2 = er.y1;
          var y3 = er.y2;
          return (x0 &amp;lt; x3 &amp;amp;&amp;amp; x2 &amp;lt; x1 &amp;amp;&amp;amp; y0 &amp;lt; y3 &amp;amp;&amp;amp; y2 &amp;lt; y1);
        };

        // elem 衝突時の振舞い
        this.onHit = function(elem){
        };

        this.onScreen = function(){
          var sx = this._x;
          var sy = this._y;
          return (sx &amp;gt;= 0 &amp;amp;&amp;amp; sx &amp;lt; window.innerWidth &amp;amp;&amp;amp;
                  sy &amp;gt;= 0 &amp;amp;&amp;amp; sy &amp;lt; window.innerHeight);
        };


        this.backToScreen = function(){
          var sx = this._x;
          var sy = this._y;
          if(sx &amp;lt; 0){
            this._x = 0;
          } else if (sx &amp;gt;= window.innerWidth){
            this._x = window.innerWidth - 1;
          }
          if(sy &amp;lt; 0){
            this._y = 0;
          } else if (sy &amp;gt;= window.innerHeight){
            this._y = window.innerHeight - 1;
          }
        };

       this.pacmanWarp = function(){
         var sx = this._x;
         var sy = this._y;
       };

      }
    );

   var Explode = defclass(
     {
       base: GameElement,
       name: 'Explode'
     },

     function(SUPER, Class){
       this.initialize = function(x, y){
         SUPER.initialize.apply(this, [x, y]);
         this._frame = 0;
         this._stars = null;
       };

       this.makeElem = function(){
         var div = document.createElement('div');
         div.style.width  = '100px';
         div.style.height = '100px';
         var stars = [];
         this.stars = stars;
         for(var i =0; i &amp;lt; 16; i++){
           var img  = genImage(STARS[i % STARS.length]);
           img.style.position = 'absolute';
           img.width = 24;
           img.height = 24;
           stars.push(img);
           div.appendChild( img );
         }
         return div;
       };

       this.step   = function(){
         this._frame++;
         if(this._frame &amp;gt; 40){
           this.dispose();
         }
       };

       this.redraw = function(){
         SUPER.redraw.apply(this, []);
         var imgs = this.stars;
         var frame = this._frame;
         var sx    = this._x;
         var sy    = this._y;
         for(var i = 0;i&amp;lt;16;i++){
           var rad = i / 16 * 2 * Math.PI;
           var x = (Math.cos(rad)) * frame;
           var y = (Math.sin(rad)) * frame;;
           imgs[i].style.top  = (50 + y) + 'px';
           imgs[i].style.left = (50 + x) + 'px';
         }
       };
     }

   );



   ////////////////////////////////////////////////////////////
   var Bullet = defclass(
     {
       base: GameElement,
       name: 'Bullet'
     },
     function(SUPER, Class){
       this.initialize = function(x,y){
         SUPER.initialize.apply(this,[x, y]);
         this.setDirection(0,-1);
         this.setSpeed(10);
       };


       this.step = function(){
         SUPER.step.apply(this, []);
         if(!this.onScreen()) this._dispose = true;
       };
     }
   );

   var EBullet = defclass(
     {
       base: Bullet,
       name: 'EBullet'
     },
     function(SUPER, Class){
       this.makeElem = function(){
         return genImage('http://s.hatena.ne.jp/images/star.gif');
       };
     }
   );

   var PBullet = defclass(
     {
       base: Bullet,
       name: 'PBullet'
     },
     function(SUPER, Class){
       this.makeElem = function(){
         return genImage('http://s.hatena.ne.jp/images/star-green.gif');
       };
     }
   );

   ////////////////////////////////////////////////////////////
   var Rock = defclass(
     {
       base: GameElement,
       name: 'Rock'
     },
     function(SUPER, Class){
       this.makeElem = function(){
         var img = genImage('http://h.hatena.ne.jp/favicon.ico');
         img.width = 32;
         img.height = 32;
         return img;
       };

       this.getTargetClasses = function(){
         return ['Bullet'];
       };

       this.onHit = function(elem){
         if(elem instanceof Bullet){
           var dir = elem.getDirection();
           var dx  = dir.x;
           var dy  = dir.y;
           var pp  = elem.getPreviousPosition();
           var sp  = this.getPosition();
           var w   = sp.x - pp.x;
           var h   = sp.y - pp.y;
           var r   = w == 0 ? (h &amp;lt; 0 ? -Infinity : Infinity) : h / w;
           if      ((w &amp;gt; 0 &amp;amp;&amp;amp; r &amp;gt;  1) || (w &amp;lt; 0 &amp;amp;&amp;amp; r &amp;lt;  -1)){// from north
             dy = - dy;
           } else if(w &amp;gt; 0 &amp;amp;&amp;amp; r &amp;lt; 1 &amp;amp;&amp;amp; r &amp;gt;= -1){             // from west
             dx = -dx;
           } else if((w &amp;gt; 0 &amp;amp;&amp;amp; r &amp;lt; -1) || (w &amp;lt; 0 &amp;amp;&amp;amp; r &amp;gt;= 1)){// from sourh
             dy = -dy;
           } else {                                          // from east
             dx = -dx;
           }
           elem.setDirection(dx, dy);
         }
       };
     }
   );
   ////////////////////////////////////////////////////////////
   var Motion;
   var RandomMotion;

   var User = defclass(
     {
       base: GameElement,
       name: 'User'
     }, function(SUPER,Class){

       this.initialize = function(name){
         this.name    = name;
         SUPER.initialize.apply(this,[0,0]);
         this._defaultSpeed = 5;
         this.setDirection(0, -1);
         this.setSpeed(0);
       };

       this.makeElem = function(){
         var name = this.name;
         var div  = document.createElement('div');
         var img  = genImage(
           'http://www.st-hatena.com/users/' + name.substring(0,2) +
             '/' + name + '/profile.gif'
         );
         div.appendChild(img);
         var label = document.createElement('div');
         div.appendChild(label);
         label.innerHTML = 'id:' + name;
         label.style.cssText = CSS_NAMEPLATE;
         return div;
       };

       this.getHitAreaSize = function(){
         var size = this.getSize();
         return {
           width: Math.floor(size.width / 3),
           height: Math.floor(size.height / 3)
         };
       };

       this.step = function(){
         SUPER.step.apply(this, []);
         if(!this.onScreen()){
           this.backToScreen();
         }
       };

       this.explode = function(){
         new Explode(this._x, this._y);
         this.dispose();
       };
        
     }
   );

   var Enemy = defclass(
     {
       base: User,
       name: 'Enemy'
     },
     function(SUPER, Class){
       this.initialize = function(name){
         SUPER.initialize.apply(this,[name]);
         var img = this._elem;
         this._x = Math.floor((window.innerWidth - img.clientWidth ) / 2
                             );
         this._y = img.clientHeight;
         this._motion = new RandomMotion( this );
       };

       this.setMotion = function(motion){
         this._motion = motion;
       };

       this.step = function(){
         this._motion.step();
         SUPER.step.apply(this, []);
       };

       this.getTargetClasses = function(){
         return ['PBullet'];
       };

       this.onHit = function(elem){
         if(elem instanceof PBullet){
           this.explode();
           nextgame('You Win!!');
         }
       };
     }
   );

   var Player = defclass(
     {
       base: User,
       name: 'Player'
     }, function(SUPER, Class){

       this.initialize = function(name){
         SUPER.initialize.apply(this,[name]);
         var self = this;
         var img = this._elem;
         this._arrowHook = function(){
           var dir = this.getCurrentDirection();
           self.setDirection(dir.x, dir.y);
         };
         Game.arrowKeyManager.addHook( this._arrowHook );
         this._shotHook = function(){ self.shot(); };
         Game.shotKeyManager.addHook( this._shotHook );
         this._x      =
           Math.floor((window.innerWidth - img.clientWidth ) / 2
                     );
         this._y      =
           (window.innerHeight - img.clientHeight - 10);
       };

       this.dispose = function(){
         Game.arrowKeyManager.deleteHook( this._arrowHook );
         Game.shotKeyManager.deleteHook( this._shothook );
         SUPER.dispose.apply(this, []);
       };

       this.getTargetClasses = function(){
         return ['Enemy', 'EBullet', 'Rock'];
       };

       this.onHit = function(elem){
         if(elem instanceof Enemy){
           this.explode();
           elem.explode();
           endgame('Draw');
         }
         if(elem instanceof EBullet){
           this.explode();
           endgame('You Lose');
         }
       };

       this.shot = function(){
         var pos = this.getPosition();
         var bullet = new PBullet(pos.x, pos.y);
         var dir = this.getDirection();
         bullet.setDirection(dir.x, dir.y);
         bullet.setSpeed(this._defaultSpeed + 2);
       };

       this.setDirection = function(x, y){
         if(x == 0 &amp;amp;&amp;amp; y == 0){
           this.setSpeed(0);
         } else {
           this.setSpeed(this._defaultSpeed);
           SUPER.setDirection.apply(this, [x,y]);
         }
       };
     }
   );

   ////////////////////////////////////////////////////////////

   Motion = defclass(
     {
       base: Object,
       name: 'Motion'
     },
     function(SUPER, Class){
       this.initialize = function(elem){
         this.elem = elem;
       };
       this.step = function(){
       };
     }
   );

   RandomMotion = defclass(
     {
       base: Motion,
       name: 'RandomMotion'
     },
     function(SUPER, Class){
       this.initialize = function(elem){
         SUPER.initialize.apply(this, [elem]);
         this._turn_at = null;
         this._iter    = 0;
         this._changeDir();
       };

       this.getPlayersDirection = function(){
         var elem  = this.elem;
         var player = (Game.currentState.getElementsByClass(Player) ||
                       [])[0] || null;
         if(!player) return this.getRandomDirection();
         var dx = player._x - elem._x;
         var dy = player._y - elem._y;
         var ddx, ddy;
         if(Math.abs(dx) &amp;gt; Math.abs(dy)){
           ddx = dx &amp;lt; 0 ? -1 : 1;
           if(dy == 0){
             ddy = 0;
           } else {
             ddy = dy / Math.abs(dx);
           }
         }else{
           ddy = dy &amp;lt; 0 ? -1 : 1;
           if(dx == 0){
             ddx = 0;
           } else{
             ddx = dx / Math.abs(dy);
           }
         }
         return {x:ddx, y:ddy};
       };

       this.getRandomDirection = function(){
         return { x: Math.random() * 2 - 1,
                  y: Math.random() * 2 - 1 };
       };

       this._changeDir = function(){
         this._turn_at = 50;
         var elem = this.elem;
         var dir  = ((this._iter++ &amp;gt; 3 &amp;amp;&amp;amp;
                      Math.random() * 3 &amp;lt; 1)
                     ? this.getPlayersDirection()
                     : this.getRandomDirection());
         elem.setDirection(dir.x, dir.y);
         elem.setSpeed(Math.random() * 10);
       };

       this.step = function(){
         if(this._iter &amp;gt; 10){
           switch(this._turn_at){
           case 40:
             this.shot(this.getPlayersDirection(), 10);
             break;
           case 30:
             this.shot(this.getRandomDirection(), 10);
             break;
           case 20:
             this.shot(this.getPlayersDirection(), 10);
             break;
           case 10:
             this.shot(this.getRandomDirection(), 10);
             break;
           case 0:
             this.shot(this.elem.getDirection(), this.elem.getSpeed() + 10);
             break;
           }
         } else {
           switch(this._turn_at){
           case 40:
           case 30:
           case 20:
           case 10:
           case 0:
             this.shot(this.elem.getDirection(), this.elem.getSpeed() + 10);
             break;
           }
         }
         if(this._turn_at-- &amp;lt; 0){
           this._changeDir();
         }
       };


       this.shot = function(dir, speed){
         var pos = this.elem.getPosition();
         var bullet = new EBullet(pos.x, pos.y);
         bullet.setDirection(dir.x, dir.y);
         bullet.setSpeed(speed);
       };

     }
   );

   ////////////////////////////////////////////////////////////

   var newgame = function(){   
     var name = (
       function(){
         var users_icon = document.evaluate(
           '/html/body/div[2]/div/div/div[2]/div/div/div/a/img',
           document.body,
           null,
           XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
           null
         );
         var src = users_icon.snapshotItem(0).src;
         return src.match(/([^/]+?)\/profile\.gif/)[1];
       }
     )();
     
     var enemies = document.evaluate(
       './/*[@id=&amp;quot;leftbar&amp;quot;]//img[@class=&amp;quot;profile-image&amp;quot;]/@alt',
       document.body,
       null,
       XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
       null
     );
     var enemy_id = enemies.snapshotItem(
       Math.floor(
         enemies.snapshotLength * Math.random()
       )
     ).value;

     for(var i=0; i &amp;lt; 10; i++){
       var x = 30 + Math.random() * (window.innerWidth - 60);
       var y = 30 + Math.random() * (window.innerHeight - 60);
       new Rock(x,y);
     }

     new Player(name);
     new Enemy(enemy_id);
   };


   var titleState = new GameTitleState();
   Game.registerState('title', titleState);

   var gamePlayState = new GamePlayingState();
   gamePlayState.setInitializer(newgame);
   Game.registerState('play', gamePlayState);

   //debugger;
   Game.gotoState('title');
   
 })();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/gYC-x6Sd-5-fOg">
    <link>https://let.hatelabo.jp/lieutar/let/gYC-x6Sd-5-fOg</link>
    <dc:date>2010-12-28T09:40:37Z</dc:date>
    <description>ほげぇ</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] カラーピッカーを作ってみる</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FgYC-x6Sd-5-fOg.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;カラーピッカーを作ってみる&lt;/a&gt;&lt;pre&gt;/*
 * @title カラーピッカーを作ってみる
 * @description ほげぇ
 * @include http://*
 * @license MIT License
 * @require 
 */


(function(){
   var TEST_MODE = true;
   var L_R = 0.29891;
   var L_G = 0.58661;
   var L_B = 0.11448;

   var NS = 'sa-ka-na.info,2010/js/ColorPicker';
   var HTML_Container =
     &amp;quot;&amp;lt;div class='head'                                  &amp;quot; +
     &amp;quot;    &amp;lt;div class='tabs'                              &amp;quot; +
     &amp;quot;        &amp;gt;&amp;lt;span class='tabHls tab'&amp;gt;HLS&amp;lt;/span        &amp;quot; +
     &amp;quot;    &amp;gt;&amp;lt;canvas class='closer' width='16' height='16' &amp;quot; +
     &amp;quot;    &amp;gt;&amp;lt;/canvas                                      &amp;quot; +
     &amp;quot;&amp;gt;&amp;lt;/div                                             &amp;quot; +
     &amp;quot;&amp;gt;&amp;lt;div class='panes'                                &amp;quot; +
     &amp;quot;  &amp;gt;&amp;lt;div class='paneHls pane'                       &amp;quot; +
     &amp;quot;      &amp;gt;&amp;lt;canvas class='canvasHls'                   &amp;quot; +
     &amp;quot;               width='360'                         &amp;quot; +
     &amp;quot;              height='360'&amp;gt;&amp;lt;/canvas&amp;gt;&amp;lt;/div          &amp;quot; +
     &amp;quot;  &amp;gt;&amp;lt;/div                                           &amp;quot; +
     &amp;quot;&amp;gt;&amp;quot;;

   var CSS_CONTAINER = {
     head: &amp;quot;&amp;quot; +
       &amp;quot;display: table;&amp;quot;+
       &amp;quot;&amp;quot;,
     tabs: &amp;quot;&amp;quot; +
       &amp;quot;display: table-cell;&amp;quot;+
       &amp;quot;&amp;quot;,
     closer: &amp;quot;&amp;quot;+
       &amp;quot;display: table-cell;&amp;quot;+
       &amp;quot;&amp;quot;
     
   };

   var walkNode = function(node, cb){
     switch(cb(node)){
       case 'BREAK':
       return 'BREAK';
       case 'STOP':
       return undefined;
     }
     var cn = node.childNodes;
     for(var i=0, l = cn ? cn.length : 0; i &amp;lt; l; i++){
       switch(walkNode(cn[i],cb)){
         case 'BREAK':
         return 'BREAK';
         case 'STOP':
         return 'STOP';
       }
     }
     return undefined;
   };

   var walkElem = function(elem, cb){
     walkNode(
       elem, function(node){
         if(node.nodeType !== document.ELEMENT_NODE) return undefined;
         return cb(node);
       }
     );
   };

   var makeClassNameDic = function(elem){
     var dic = {};
     walkElem(
       elem,
       function(elem){
         if(elem.className){
           var cns = elem.className.split(/\s+/);
           cns.forEach(
             function(cn){
               if(cn.length){
                 if(dic[cn]){
                     dic[cn].push(elem);
                 } else {
                   dic[cn] = [elem];
                 }
               }
             }
           );
         }
       }
     );
     return dic;
   };

   var makeContainer = function(){
     var container = document.createElement('div');
     container.innerHTML = HTML_Container;
     var dic = makeClassNameDic(container);
     for(var cn in CSS_CONTAINER){
       var css  = CSS_CONTAINER[cn];
       var slot = dic[cn] || [];
       for(var i=0,l=slot.length;i&amp;lt;l;i++){
         slot[i].style.cssText = css;
       }
     }
     return {
       root: container,
       elements: dic,
       element: function(name){ return this.elements[name][0]; }
     };
   };

   var rgb2l = function(rgb){
     var r     = rgb.r;
     var g     = rgb.g;
     var b     = rgb.b;
     return (L_R * r / 255) + (L_G * g / 255) + (L_B * b / 255);
   };

   var rgb2hls = function(rgb){
     var r     = rgb.r;
     var g     = rgb.g;
     var b     = rgb.b;
     var max   = null;
     var min   = null;
     var max_r = false;
     var max_g = false;
     var max_b = false;

     if(r &amp;gt;= g){
       if(r &amp;gt;= b){
         max_r = true;
         if( g &amp;gt;= b){
           max = r;
           min = b;
         } else {
           max = r;
           min = g;
         }
       } else {
         max_b = true;
         max = b;
         min = g;
       }
     } else {
       if(g &amp;gt;= b){
         max_g = true;
         if(r &amp;gt;= b) {
           max = g;
           min = b;
         } else {
           max = g;
           min = r;
         }
       } else {
         max_b = true;
         max = b;
         min = r;
       }
     }
     var d = (max - min);
     var h = null;
     if(d == 0){
       h = 0;
     } else {
       if(max_r){
         h = (g - b) / d;
       } else if(max_g){
         h = (b - r) / d + 1 / 3;
       } else {
         h = (r - g) / d + 2 / 3;
       }
       if(h &amp;lt; 0) h += 1; else if(h &amp;gt; 1) h -= 1;
       h *= 360;
     }
     var v = max;
     var s = max == 0 ? 0 : 255 * (max - min) / max;
     return {h:h,v:v,s:s};

   };

   var hls2rgb = function(hls){
     var h = hls.h;
     var l = hls.l;
     var s = hls.s;
     var m2 = ( l &amp;lt;= 0.5 ) ? (l*(1+s)) : (l - l*s + s);
     var m1 = 2.0*l - m2;
     var _value = function(n1,n2,hue){
       if(    hue &amp;gt; 360 ) hue -= 360; else
       if(    hue &amp;lt;   0 ) hue += 360;

       if( hue &amp;lt;  60 ) return n1 + hue * ( n2-n1 )/60.0;
       if( hue &amp;lt; 180 ) return n2;
       if( hue &amp;lt; 240 ) return n1 + ( 240-hue ) * ( n2-n1 )/60.0;
       return n1;
     };
     var r = _value( m1, m2, h + 120 );
     var g = _value( m1, m2, h );
     var b = _value( m1, m2, h - 120 );
     return {
       r:Math.round(255 * r), g:Math.round(255 * g), b:Math.round(255 * b)
     };
   };


   var Grabbed = function(){};

   var initHlsTab = function(container, cb){

     var canvas  = container.element('canvasHls');
     var context = canvas.getContext('2d');
     var hls_blank = {r:0, g:0, b:0};
     var LSs       = [];
     var H = 0;
     var S = 0;
     var V = 0;

     canvas.addEventListener(
       'mousedown', function(ev){
         var px = ev.clientX;
         var py = ev.clientY;
         Grabbed = function(ev){
           var mx = ev.clientX;
           var my = ev.clientY;
           var w  = px - mx;
           px = mx;
           py = my;
           H = (H + w) % 360;
           update(H);
         };
       }, false
     );     


     var grayImage = (
       function(){
         var R = context.createImageData(256,256);
         var data = R.data;
         return R;
       }
     )();

     var drawH  = function(imageData, opt){

       var hue     = opt.hue;
       var dWidth  = imageData.width;
       var dHeight = imageData.height;
       var data    = imageData.data;
       var rox     = opt.ox;
       var roy     = opt.oy;
       var width   = opt.width;
       var height  = opt.height;

       var ox      = Math.floor(width  * 0.5);
       var oy      = Math.floor(height * 0.45);
       var rad2    = Math.PI * 2;

       for(var y=0; y &amp;lt; height; y++){

         var ry   = (
           (y &amp;lt;= oy)
             ? (oy - y - 1) / oy
             : (y - oy) / (height - oy)
         );


         var ew   = Math.round(width * Math.sqrt(1 - ry * ry));

         var minX = Math.floor((width - ew) / 2);
         var maxX = width - minX;
         var yy   = y - oy;

         for(var x=minX; x &amp;lt; maxX; x++){

           var base = 4 * (rox + x + (roy + y) * dWidth);
           var r = 255;
           var g = 127;
           var b = 0;

           var xx  = (x - ox) * height / width;
           var rr  = Math.sqrt(xx * xx + yy * yy);
           var rad = Math.acos(xx / rr);
           var deg = Math.round(rad / rad2 * 360);
           //var alp = Math.round(255 * rr / ew * 2);
           var alp = 255;

           if(yy &amp;gt; 1) deg = 180 - (180 + deg) % 360;

           var rgb = hls2rgb({h: (hue + deg) % 360, s:1, l:0.5});

           data[base + 0] = rgb.r;
           data[base + 1] = rgb.g;
           data[base + 2] = rgb.b;
           data[base + 3] = alp;
         }
       }
     };


     var drawLs = function(imageData, opt){

       var data      = imageData.data;
       var dWidth    = imageData.width;
       var dHeight   = imageData.height;
       var h         = opt.hue;
       var ox        = opt.ox;
       var oy        = opt.oy;
       var size      = opt.size;
       var hsize     = Math.floor(size / 2);
       var size_     = size  - 1;
       var hsize_    = hsize - 1;

       var rgb  = hls2rgb({h:h,s:1,l:0.5});
       var nrgb = hls2rgb({h:(h + 180) % 360, s:1, l:0.5});

       for(var y = 0; y &amp;lt; size; y++){

         var l = size_ - y;
         var base = null;
         var xa = null, ya = null;
         var r, g, b, gg;

         var ww = Math.round(size * (hsize - Math.abs(y - hsize)) / hsize);
         var x  = Math.floor( (size - ww) / 2 );
         var xMax = size - x;

         for(; x &amp;lt; hsize; x++){

           xa = 1 - (hsize - x) / ww * 2;

           if(y &amp;lt; hsize_){
             ya =  y / hsize_;
             r = (nrgb.r * ya + size_ * (1 - ya)) * (1 - xa);
             g = (nrgb.g * ya + size_ * (1 - ya)) * (1 - xa);
             b = (nrgb.b * ya + size_ * (1 - ya)) * (1 - xa);

           } else {

             ya = (size - y) / hsize_;
             r = nrgb.r * ya * (1 - xa);
             g = nrgb.g * ya * (1 - xa);
             b = nrgb.b * ya * (1 - xa);

           }

           gg = l * xa;
           base = 4 * ((ox + x) + (oy + y) * dWidth);
           data[base + 0] = Math.round(gg + r);
           data[base + 1] = Math.round(gg + g);
           data[base + 2] = Math.round(gg + b);
           data[base + 3] = 255;

         }

         for(;x &amp;lt; xMax; x++){

           xa = x == xMax ? 0 : 1 - (x - hsize) / ww * 2;

           if(y &amp;lt; hsize_){

             ya = y / hsize_;
             r = (rgb.r * ya + size_ * (1 - ya)) * (1 - xa);
             g = (rgb.g * ya + size_ * (1 - ya)) * (1 - xa);
             b = (rgb.b * ya + size_ * (1 - ya)) * (1 - xa);

           } else {

             ya = (size - y) / hsize_;
             r = rgb.r * ya * (1 - xa);
             g = rgb.g * ya * (1 - xa);
             b = rgb.b * ya * (1 - xa);

           }
           gg = l * xa;
           base = 4 * ((ox + x) + (oy + y) * dWidth);
           data[base + 0] = Math.round(gg + r);
           data[base + 1] = Math.round(gg + g);
           data[base + 2] = Math.round(gg + b);
           data[base + 3] = 255;
         }

       }
     };

     var update = function(h){
       var imageData = context.createImageData(360,360);
       drawH(imageData, {
               hue: h,
               ox: 84,
               oy: 272,
               width: 192,
               height: 64
             });
       drawLs(imageData, {
                hue: h,
                ox: 52,
                oy: 32,
                size: 256
              });
       context.putImageData(imageData, 0, 0);
     };

     update(H);

   };

   var writeCloser = function(canvas){
     var context = canvas.getContext('2d');
     context.fillStyle = 'rgb(255,0,0)';
     context.fillRect(0,0,canvas.width,canvas.height);
     context.strokeStyle = 'rgb(255,255,255)';
     context.lineWidth = 2;
     context.beginPath();
     context.moveTo(4,4);
     context.lineTo(canvas.width - 4, canvas.height - 4);
     context.stroke();
     context.beginPath();
     context.moveTo(4,canvas.width - 4);
     context.lineTo(canvas.height - 4, 4);
     context.stroke();
   };


   var createColorPicker = function(cb){
     var container = makeContainer();
     var elem = container.root;
     initHlsTab(container, cb);
     var closer = container.element('closer');
     writeCloser(closer);

     var listeners = [
       ['mouseup', function(){
          Grabbed = function(){};
        }, false],
       ['mousemove', function(ev){
         Grabbed(ev);
       }, false]
     ];

     for(var i=0,l=listeners.length;i&amp;lt;l;i++){
       window.addEventListener.apply(window, listeners[i]);
     }


     return {
       close: function(){
         cb(null);
         this.hide();
       },
       show: function(){
         elem.style.display = 'block';
       },
       hide: function(){
         elem.style.display = 'none';
       },
       remove: function(){
         for(var i=0,l=listeners.length;i&amp;lt;l;i++){
           window.removeEventListener.apply(window, listeners[i]);
         }
         elem.parentNode.removeChild(elem);
       },
       closer: closer,
       container: container,
       element: elem
     };
   };


   if(TEST_MODE)(
     function(picker){
       var elem = picker.element;
       picker.closer.addEventListener(
         'mousedown', function(ev){
           picker.close();
           picker.remove();
         }, false
       );
       document.body.appendChild(elem);
       elem.style.cssText = &amp;quot;&amp;quot;+
         &amp;quot;             position: fixed;                 &amp;quot; +
         &amp;quot;              z-index: 65536;                 &amp;quot; +
         &amp;quot;               border: solid black 2px;       &amp;quot; +
         &amp;quot;         border-color: #DDD #666 #666 #DDD;   &amp;quot; +
         &amp;quot;           background: #CCC;                  &amp;quot; +
         &amp;quot;           background: rgba(191,191,191,0.85);&amp;quot; +
         &amp;quot;   -moz-border-radius: 10px;                  &amp;quot; +
         &amp;quot;-webkit-border-radius: 10px;                  &amp;quot; +
         &amp;quot;        border-radius: 10px;                  &amp;quot; +
         &amp;quot;              padding: 5px                    &amp;quot; +
         &amp;quot;&amp;quot;;
       var y = ((window.innerHeight-elem.offsetHeight)/2);
       var x = ((window.innerWidth -elem.offsetWidth) /2);
       
       elem.style.top = y + 'px';
       elem.style.left = x + 'px';

     })(createColorPicker(
          function(rgb){
            if(window.console)  console.log(rgb);
          }
        ));


   window[NS] = {
     create: createColorPicker
   };
 })();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/gYC-y5v_lOSpCw">
    <link>https://let.hatelabo.jp/lieutar/let/gYC-y5v_lOSpCw</link>
    <dc:date>2010-12-13T13:45:05Z</dc:date>
    <description>http://h.hatena.ne.jp/keyword/%E8%AA%B0%E3%81%8B%E3%80%81%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%AE%E5%8B%95%E3%81%8B%E3%81%97%E6%96%B9%E3%81%8A%E3%81%97%E3%81%88%E3%81%A6%E3%81%91%E3%82%8C%E3%80%82</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] アイコンの動かし方</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FgYC-y5v_lOSpCw.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;アイコンの動かし方&lt;/a&gt;&lt;pre&gt;/*
 * @title アイコンの動かし方
 * @description http://h.hatena.ne.jp/keyword/%E8%AA%B0%E3%81%8B%E3%80%81%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%AE%E5%8B%95%E3%81%8B%E3%81%97%E6%96%B9%E3%81%8A%E3%81%97%E3%81%88%E3%81%A6%E3%81%91%E3%82%8C%E3%80%82
 * @include http://*
 * @license MIT License
 * @require 
 */

(function(){
  var imgs = document.getElementsByTagName('img');
  var Icons = [];
  for(var i=0,l=imgs.length;i&amp;lt;l;i++){
    var img = imgs[i];
    if(img.className != 'profile-image') continue;
    Icons.push(img);
    var x = img.offsetLeft;
    var y = img.offsetTop;
    img.style.position = 'absolute';
    img.style.top = y + 'px';
    img.style.left = x + 'px';
  }
  var mv = function(){
     var xloop = arguments.callee;
     var tindex = Math.floor(Math.random() * Icons.length);
     var target = Icons[tindex];
     var L = 0;
     var x = Math.floor(Math.random() * 3) - 1;
     var y = Math.floor(Math.random() * 3) - 1;
     (function (){
       var iloop = arguments.callee;
       target.style.top  = (target.offsetTop + y) + 'px';
       target.style.left = (target.offsetLeft + x) + 'px';
       L++;
       setTimeout(L &amp;lt;= 30 ? iloop : xloop, 10);
     })();
  };
  mv();mv();mv();mv();mv();mv();mv();mv();mv();mv();
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/gYC-x5v27O2TXg">
    <link>https://let.hatelabo.jp/lieutar/let/gYC-x5v27O2TXg</link>
    <dc:date>2010-12-13T12:55:49Z</dc:date>
    <description>http://h.hatena.ne.jp/keyword/id%E3%82%92%E9%9C%87%E6%92%BC%E3%81%95%E3%81%9B%E3%81%A6%E3%81%BF%E3%82%8B</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] idを震撼させてみる</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FgYC-x5v27O2TXg.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;idを震撼させてみる&lt;/a&gt;&lt;pre&gt;/*
 * @title idを震撼させてみる
 * @description http://h.hatena.ne.jp/keyword/id%E3%82%92%E9%9C%87%E6%92%BC%E3%81%95%E3%81%9B%E3%81%A6%E3%81%BF%E3%82%8B
 * @include http://h.hatena.ne.jp/*
 * @license MIT License
 * @require 
 */

(function(){
  var Ids = [];
  var spans = document.getElementsByTagName('span');

  for(var i=0;i&amp;lt;spans.length;i++){
    if(spans[i].className != 'username') continue;
    Ids.push(spans[i]);
    spans[i].style.position = 'relative';
  }

  var up = true;
  (function(){
    for(var i=0, l=Ids.length;i&amp;lt;l;i++){
       Ids[i].style.top = up ? '-2px' : '2px';
    }
    up = !up;
    setTimeout(arguments.callee, 250);
  })();
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/gYC-y5HznpPGYQ">
    <link>https://let.hatelabo.jp/lieutar/let/gYC-y5HznpPGYQ</link>
    <dc:date>2010-11-27T21:18:43Z</dc:date>
    <description>はてなハイクの投稿欄の空行、空白をエスケープする</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] escape-spaces-for-haiku</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FgYC-y5HznpPGYQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;escape-spaces-for-haiku&lt;/a&gt;&lt;pre&gt;/*
 * @title escape-spaces-for-haiku
 * @description はてなハイクの投稿欄の空行、空白をエスケープする
 * @include http://h.hatena.ne.jp
 * @license MIT License
 * @require 
 */
(function(){
  var forEach = function(obj, cb){
     Array.prototype.forEach.apply(obj, [cb]);
  };
  forEach(
    document.forms, function(form){
      var b = form.elements.body;
      if(!b) return;
      b.value = b.value.replace(/ /g,&amp;quot;&amp;amp;nbsp;&amp;quot;).replace(/\n\n/g,&amp;quot;\n&amp;amp;nbsp;\n&amp;quot;);
    }
  );
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/gYC-x4S4-tOCPw">
    <link>https://let.hatelabo.jp/lieutar/let/gYC-x4S4-tOCPw</link>
    <dc:date>2010-11-08T01:41:07Z</dc:date>
    <description>Tumblr のブックマークレットのウインドウを作らない版</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] share-on-tumblr</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FgYC-x4S4-tOCPw.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;share-on-tumblr&lt;/a&gt;&lt;pre&gt;/*
 * @title share-on-tumblr
 * @description Tumblr のブックマークレットのウインドウを作らない版
 * @include http://*
 * @license ないよ
 * @require 
 */
(function(){

var d=document,
  w=window,
  e=w.getSelection,
  k=d.getSelection,
  x=d.selection,
  s=(e?e():(k)?k():(x?x.createRange().text:0)),
  f='http://www.tumblr.com/share',
  l=d.location,
  e=encodeURIComponent,
  p='?v=3&amp;amp;u='+e(l.href)+'&amp;amp;t='+e(d.title)+'&amp;amp;s='+e(s),
  u=f+p;

var WID = ' *share-on-tumblr* ';
var D=document.getElementById(WID) || document.createElement('div');
D.id = WID;
D.innerHTML = '';
var F=document.createElement('iframe');
var R=function(){D.parentNode.removeChild(D);};
var A=document.createElement('a');

var img=&amp;quot;data:image/gif;base64,R0lGODlhZABkAPQAAAAAAP%2F%2F%2F3BwcJaWlsjIyMLCwqKiouLi4uzs7NLS0qqqqrKysoCAgHh4eNra2v%2F%2F%2F4iIiLq6uvT09AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJBwAAACwAAAAAZABkAAAF%2FyAgjmRpnmiqrmzrvnAsz3Rt33iu73zfMgoDw0csAgSEh%2FJBEBifucRymYBaaYzpdHjtuhba5cJLXoHDj3HZBykkIpDWAP0YrHsDiV5faB3CB3c8EHuFdisNDlMHTi4NEI2CJwWFewQuAwtBMAIKQZGSJAmVelVGEAaeXKEkEaQSpkUNngYNrCWEpIdGj6C3IpSFfb%2BCAwkOCbvEy8zNzs%2FQ0dLT1NUrAgOf1kUMBwjfB8rbOQLe3%2BC24wxCNwPn7wrjEAv0qzMK7%2BeX2wb0mzXu8iGIty1TPRvlBKazJgBVnBsN8okbRy6VgoUUM2rcyLGjx48gQ4ocSbKkyZMoJf8JMFCAwAJfKU0gOUDzgAOYHiE8XDGAJoKaalAoObHERFESU0oMFbF06YikKQQsiKCJBYGaNR2ocPr0AQCuQ8F6Fdt1rNeuLSBQjRDB3qSfPm1uPYvUbN2jTO2izQs171e6J9SuxXjCAFaaQYkC9ku2MWCnYR2rkDqV4IoEWG%2FO5fp3ceS7nuk2Db0YBQS3UVm6xBmztevXsGPLnk27tu3buHOvQU3bgIPflscJ4C3D92%2FgFNUWgHPj2G%2BbmhkWWL78xvPjDog%2FazCdOmsXzrF%2FdyYgAvUI7Y7bDF5N%2BQLCM4whM7BxvO77%2BPPr38%2B%2F%2Fw4GbhSw0xMQDKCdJAwkcIx2ggMSsQABENLHzALILDhMERAQ0BKE8IUSwYILPjEAhCQ2yMoCClaYmA8NQLhhh5I0oOCCB5rAQI0mGEDiRLfMQhWOI3CXgIYwotBAA%2FaN09KQCVw4m4wEMElAkTEhIWUCSaL0IJPsySZVlC%2F5J%2BaYZJZppgghAAAh%2BQQJBwAAACwAAAAAZABkAAAF%2FyAgjmRpnmiqrmzrvnAsz3Rt33iu73zfMhAIw0csAgQDhESCGAiM0NzgsawOolgaQ1ldIobZsAvS7ULE6BW5vDynfUiFsyVgL58rwQLxOCzeKwwHCIQHYCsLbH95Dg%2BOjgeAKAKDhIUNLA2JVQt4KhGPoYuSJEmWlgYuSBCYLRKhjwikJQqnlgpFsKGzJAa2hLhEuo6yvCKUv549BcOjxgOVhFdFdbAOysYNCgQK2HDMVAXexuTl5ufo6err7O3kAgKs4%2B48AhEH%2BATz9Dj2%2BP8EWvET0YDBPlX%2FEh7i18CAgm42ICT8l2ogAAYPFSyU0WAiPjcDtSkwIHCGAAITE%2F%2BUpCeg4EqTKPGptEikpQEGL2nq3Mmzp8%2BfQIMKHUq0qNGjSJO6E8DA4RyleQw4mOqgk1F4LRo4OEDVwTQUjk48MjGWxC6zD0aEBbBWbdlJBhYsAJlC6lSuDiKoaOuWbdq%2BfMMG%2Fus37eCsCuRaVWG3q94UfEUIJlz48GHJsND6VaFJ8UEAWrdS%2FSqWMubNgClP1nz67ebIJQTEnduicdWDZ92aXq17N%2BG1kV2nwEqnqYGnUJMrX868ufPn0KNLn069Or%2BN0hksSFCArkWmORgkcJCgvHeWCiIYOB9jAfnx3D%2BfE5A%2BwoKKNSLAh4%2BdXYMI9gEonwoKlPeeON8ZAOCgfTc0UB5%2FOiERwQA5xaCJff3xM6B1HHbo4YcghigiNXFBhEVLGc5yEgEJEKBPFBBEUEAE7M0yAIs44leTjDNGUKEkBrQopDM%2BNFDAjEf%2BCMiNQhJAWpE8zqjkG%2F8JGcGGIjCQIgoMyOhjOkwNMMCWJTTkInJZNYAlPQYU4KKT0xnpopsFTKmUPW8ScOV0N7oJ53TxJAbBmiMWauihiIIYAgAh%2BQQJBwAAACwAAAAAZABkAAAF%2FyAgjmRpnmiqrmzrvnAsz3Rt33iu73zv%2F8AZo4BAFBjBpI5xKBYPSKWURnA6CdNszGrVeltc5zcoYDReiXDCBSkQCpDxShA52AuCFoQribMKEoGBA3IpdQh2B1h6TQgOfisDgpOQhSMNiYkIZy4CnC0Ek4IFliVMmnYGQAmigWull5mJUT6srRGwJESZrz%2BSrZWwAgSJDp8%2FgJOkuaYKwUADCQ4JhMzW19jZ2tvc3d7f4NoCCwgPCAs4AwQODqrhIgIOD%2FPzBzYDDgfsDgrvAAX0AqKjIW0fuzzhJASk56CGwXwOaH1bGLBGQX0H31Gch6CGgYf93gGkOJCGgYIh3%2F8JUBjQHg6J%2FgSMlBABob%2BbOHPq3Mmzp8%2BfQIMKHUq0qNEUAiBAOHZ0RYN10p41PZGg6jQHNk%2FM07q1BD2vX0l0BdB1rIiKKhgoMMD0BANpVqmpMHv2AVm7I7aa1Yu3bl6%2BYvuuUEDYXdq40qqhoHu38d%2Bwfvf2pRjYcYq1a0FNg5vVBGPAfy03lhwa8mjBJxqs7Yzi6WapgemaPh0b9diythnjSAqB9dTfwIMLH068uPHjyJMrX84cnIABCwz4Hj4uAYEEeHIOMAAbhjrr1lO%2Bg65gQXcX0a5fL%2FnOwIL3imlAUG%2Fd8DsI7xfAlEFH%2FSKcEAywHw3b9dbcgQgmqOByggw26KAIDAxwnnAGEGAhe0AIoEAE0mXzlBsWTojDhhFwmE0bFroR3w8RLNAiLtg8ZaGFbfVgwIv2WaOOGzn%2BIIABCqx4TRk1pkXYgMQNUUAERyhnwJIFFNAjcTdGaWJydCxZ03INBFjkg2CGKeaYCYYAACH5BAkHAAAALAAAAABkAGQAAAX%2FICCOZGmeaKqubOu%2BcCzPdG3feK7vfO%2F%2FwBnDUCAMBMGkTkA4OA8EpHJKMzyfBqo2VkBcEYWtuNW8HsJjoIDReC2e3kPEJRgojulVPeFIGKQrEGYOgCoMBwiJBwx5KQMOkJBZLQILkAuFKQ2IiYqZjQANfA4HkAltdKgtBp2tA6AlDJGzjD8KrZ0KsCSipJCltT63uAiTuyIGsw66asQHn6ACCpEKqj8DrQevxyVr0D4NCgTV3OXm5%2Bjp6uvs7e7v6gIQEQkFEDgNCxELwfACBRICBtxGQ1QCPgn6uRsgsOE9GgoQ8inwLV2ChgLRzKCHsI9Cdg4wBkxQw9LBPhTh%2FwG4KHIODQYnDz6Ex1DkTCEL6t189w%2BjRhsf%2FQ04WACPyqNIkypdyrSp06dQo0qdSrWqVUcL%2BNER0MAa1AYOHoh9kKCiiEoE6nl1emDsWAIrcqYlkDKF2BNjTeQl4bbEXRF%2F%2F47oe8KABLdjg4qAOTcBAcWAH%2BiVLBjA3cqXJQ%2FWbDkzX84oFCAey%2BwEg8Zp136e3Pnz3sitN28mDLsyiQWjxRo7EaFxXRS2W2OmDNqz7NrDY5swkPsB5FC91a6gHRm08OKvYWu3nd1EW8Rw9XA1q1TAd7Flr76wo1W9%2B%2Ffw48ufT7%2B%2B%2Ffv48%2Bs%2FwXUABPLwCWAAAQRiolQD%2F%2BFDIKRdBOz0TjgKkGNDAwsSSJBKEESowHOUEFjEY0lJEyGAegyw4G5HNcAAiS0g2ACL%2B8Uo44w01mjjjTi%2BwMCKMs5TQAQO%2BiCPAQme00AEP%2F4IIw0DZLVAkLA0kGQBBajGQ5MLKIDiMUcmGYGVO0CQZXvnCIAkkFOsYQCH0XQVAwP%2BsRlgVvssadU8%2B6Cp3zz66JmfNBFE8EeMKrqZ46GIJqrooi6EAAAh%2BQQJBwAAACwAAAAAZABkAAAF%2FyAgjmRpnmiqrmzrvnAsz3Rt33iu73zv%2F0Baw2BoBI88g2N5MCCfNgZz6WBArzEl1dHEeluGw9Sh%2BJpTg%2B1y8GpABGdWQxFZWF0L7nLhEhAOgBFwcScNCYcOCXctAwsRbC5%2FgIGEJwuIh3xADJOdg5UjEQmJowlBYZ2AEKAkeZgFQZypB0asIgyYCatBCakEtiQMBQkFu0GGkwSfwGYQBovM0dLT1NXW19jZ2ts%2BAgYKA8s0As6Q3AADBwjrB9AzogkEytwN6uvs4jAQ8fxO2wr3ApqTMYAfgQSatBEIeK8MjQEHIzrUBpAhgoEyIkSct62BxQP5YAhoZCDktQEB2%2F%2Bd66ZAQZGVMGPKnEmzps2bOHPq3Mmzp88v5Iz9ZLFAgtGLjCIU8IezqFGjDzCagCBPntQSDx6cyKoVa1avX0mEBRB2rAiuXU00eMoWwQoF8grIW2H2rFazX%2FHeTUs2Lde%2BYvmegMCWrVATC%2BRWpSsYsN6%2FI%2FLyHYtWL%2BATAwo%2FPVyCatWrgU1IDm3Zst2%2Bk%2FeiEKBZgtsVA5SGY1wXcmTVt2v77aq7cSvNoIeOcOo6uPARAhhwPs68ufPn0KNLn069uvXrfQpklSAoRwOT1lhXdgC%2BBQSlEZZb0175QcJ3Sgt039Y%2B6%2BsZDQrI119LW%2F26MUQQ33zaSFDfATY0kFh2euewV9l748AkwAGVITidAAA9gACE2HXo4YcghijiiN0YEIEC5e3QAAP9RWOiIxMd0xKK0zhSRwRPMNCSAepVYoCNTMnoUopxNDLbEysSuVIDLVLXyALGMSfAAgsosICSP01J5ZXWQUBlj89hSeKYZJZpJoghAAAh%2BQQJBwAAACwAAAAAZABkAAAF%2FyAgjmRpnmiqrmzrvnAsz3Rt33iu73zv%2F0Bag8FoBI%2B8RmKZMCKfNQbTkSAIoNgYZElNOBjZcGtLLUPE6JSg601cXQ3IO60SQAzyF9l7bgkMbQNzdCUCC1UJEWAuAgOCLwYOkpIDhCdbBIiVQFIOB5IHVpYlBpmmC0EMk6t9oyIDplUGqZ%2Bek06uAAwEpqJBCqsOs7kjDAYLCoM%2FDQa1ycSEEBCL0NXW19jZ2tvc3d7fPwJDAsoz4hC44AIFB%2B0R5TGwvAbw2Q0E7fnvNQIEBbwEqHVj0A5BvgPpYtzj9W%2BTNwUHDR4QqBAgr1bdIBzMlzCGgX8EFtTD1sBTPgQFRv%2F6YTAgDzgAJfP5eslDAAMFDTrS3Mmzp8%2BfQIMKHUq0qNGjSJMisYNR6YotCBAE9GPAgE6fEKJqnbiiQYQCYCmaePDgBNmyJc6mVUuC7Ai3AOC%2BZWuipAStUQusGFDgawQFK%2BTOjYtWhFvBhwsTnlsWseITDfDibVoCAtivgFUINtxY8VnHiwdz%2Fty2MwoBkrVSJtEAbNjAjxeDnu25cOLaoU2sSa236wCrKglvpss5t%2FDHcuEO31z57laxTisniErganQSNldf3869u%2Ffv4MOLH0%2B%2BvHk%2FA5YQeISjQfBr6yTIl5%2FSxp2%2F76sNmM9fuwsDESyAHzgJ8DdfbzN4JWCkBBFYd40DBsqXgA0DMIhMfsQUGGEENjRQIR4v7Rehfy9gWE18%2FDkEnh0RJELieTDGKOOMNAa1DlkS1Bceap894ICJUNjhCJAyFNAjWahAA8ECTKrow5FkIVDNMcgMAwSUzFnCAJMLvHiDBFBKWQ1LLgERAZRJBpVTiQ70eMBQDSigAHSnLYCAj2kCJYCcBjwz3h98EnkUM1adJ2iNiCaq6KKLhgAAIfkECQcAAAAsAAAAAGQAZAAABf8gII5kaZ5oqq5s675wLM90bd94ru987%2F%2FAoHAYEywShIWAyKwtCMjEokmFCaJQwrLKVTWy0UZ3jCqAC%2BSfoCF%2BNQrIQrvFWEQU87RpQOgbYg0MMAwJDoUEeXoiX2Z9iT0LhgmTU4okEH0EZgNCk4WFEZYkX5kEEEJwhoaVoiIGmklDEJOSgq0jDAOnRBBwBba3wcLDxMXGx8jJysvMzUJbzgAGn7s2DQsFEdXLCg4HDt6cNhHZ2dDJAuDqhtbkBe%2BPxgze4N8ON%2BTu58jp6%2BA3DPJtU9aNnoM%2FOBrs4wYuAcJoPYBBnEixosWLGDNq3Mixo8ePIEOKxGHEjIGFKBj%2FDLyY7oDLA1pYKIgQQcmKBw9O4MxZYmdPnyRwjhAKgOhQoCcWvDyA4IC4FAHtaLvJM2hOo0WvVs3K9ehRrVZZeFsKc0UDmnZW%2FjQhFOtOt2C9ingLt%2BuJsU1dolmhwI5NFVjnxhVsl2tdwkgNby0RgSyCpyogqGWbOOvitlvfriVc2LKKli9jjkRhRNPJ0ahTq17NurXr17Bjy55NG0UDBQpOvx6AoHdTiTQgGICsrIFv3wdQvoCwoC9xZAqO%2B34Ow0DfBQ%2BVEZDeW4GNOgsWTC4WnTv1QQaAJ2vA9Hhy1wPaN42XWoD1Acpr69%2FPv79%2FZgN8ch5qBUhgoIF7BSMAfAT07TDAgRCON8ZtuDWYQwIQHpigKAzgpoCEOGCYoQQJKGidARaaYB12LhAwogShKMhAiqMc8JYDNELwIojJ2EjXAS0UCOGAywxA105EjgBBBAlMZdECR%2BLESmpQRjklagxE%2BYB6oyVwZImtCUDAW6K51mF6%2F6Wp5po2hAAAIfkECQcAAAAsAAAAAGQAZAAABf8gII5kaZ5oqq5s675wLM90bd94ru987%2F%2FAoHAYE0AWC4iAyKwNCFDCoEmFCSJRQmRZ7aoaBWi40PCaUc%2Fo9OwTNMqvhiE84LYYg4GSnWpEChEQMQ0MVlgJWnZ8I36AgHBAT4iIa4uMjo9CC5MECZWWAI2Oij4GnaefoEcFBYVCAlCIBK6gIwwNpEACCgsGubXAwcLDxMXGx8jJysvMZ7%2FKDAsRC5A1DQO9z8YMCQ4J39UzBhHTCtrDAgXf3gkKNg3S0hHhx9zs3hE3BvLmzOnd6xbcYDCuXzMI677RenfOGAR1CxY26yFxosWLGDNq3Mixo8ePIEOKHEmyZDEBAwz%2FGGDQcISAlhMFLHBwwIEDXyyOZFvx4MGJnj5LABU6lETPEUcBJEVa9MQAm1Ad0CshE4mCqUaDZlWqlatXpl9FLB26NGyKCFBr3lyxCwk1nl3F%2BiwLlO7crmPr4r17NqpNAzkXKMCpoqxcs0ftItaaWLFhEk9p2jyAlSrMukTjNs5qOO9hzipkRiVsMgXKwSxLq17NurXr17Bjy55Nu7ZtIoRWwizZIMGB3wR2f4FQuVjv38gLCD8hR8HVg78RIEdQnAUD5woqHjMgPfpv7S92Oa8ujAHy8%2BTZ3prYgED331tkp0Mef7YbJctv69%2FPv7%2F%2FHOlI0JNyQ%2BxCwHPACOCAmV4S5AfDAAhEKF0qfCyg14BANCChhAc4CAQCFz6mgwIbSggYKCGKmAOJJSLgDiggXiiBC9cQ5wJ3LVJ4hoUX5rMCPBIEKcFbPx5QYofAHKAXkissIKSQArGgIYfgsaGAki62JMCTT8J0Wh0cQcClkIK8JuaYEpTpGgMIjIlAlSYNMKaOq6HUpgQIgDkbAxBAAOd%2FgAYqKA0hAAAh%2BQQJBwAAACwAAAAAZABkAAAF%2FyAgjmRpnmiqrmzrvnAsz3Rt33iu73zv%2F8CgcChrQAYNotImiBQKi%2BRyCjM4nwOqtmV4Og3bcIpRuDLEaBNDoTjDGg1BWmVQGORDA2GfnZusCxFgQg17BAUEUn4jEYGNQwOHhhCLJFYREQpDEIZ7ipUCVgqfQAt7BYOVYkduqq6vsLGys7S1tre4ubq7UwIDBn04DAOUuwJ7CQQReDUMC8%2FFuXrJydE0Bs92uwvUBAnBNM7P4LcK3ufkMxDAvMfnBbw9oQsDzPH3%2BPn6%2B%2Fz9%2Fv8AAwocSLCgwYO9IECwh9AEBAcJHCRq0aAOqRMPHmDMaCKjRhIeP47gKIIkyZEeU%2F8IgMiSABc2mlacRAlgJkebGnGizCmyZk8UAxIIHdoqRR02LGaW5AkyZFOfT5c6pamURFCWES%2BaCGWgKIqqN3uGfapzqU%2BxTFEIiChUYo%2BpO0uM3fnzpMm6VUs8jDixoVoIDBj6HUy4sOHDiBMrXsy4sWMSTSRkLCD4ltcZK0M%2BQFB5lgIHEFPNWKB5cq7PDg6AFh0DQem8sVaCBn0gQY3XsGExSD0bdI0DryXgks0bYg3SpeHhQj07HQzgIR10lmWAr%2FMYC1wjWDD9sffv4MOLR3j1m5J1l%2F0UkMCevXIgDRIcQHCAQHctENrrv55D%2FoH%2FB7ynnn7t2fYDAwD%2BR59zVmEkQCB7BvqgQIIAphdGBA9K4JILcbzQAID0%2FcfgFvk9aE0KDyFA34kp%2BAdgBK4MQKCAKEqg4o0sniBAAQBS9goEESQQQY4nJHDjjRGy0EBg%2FRx55GFO3ngYAVFuWBiCRx4w4kENFKBiAVuOJ%2BaYZIoZAgAh%2BQQJBwAAACwAAAAAZABkAAAF%2FyAgjmRpnmiqrmzrvnAsz3Rt33iu73zv%2F8CgcChrMBoNotImUCwiiuRyCoNErhEIdduCPJ9arhgleEYWgrHaxIBAGDFkep1iGBhzobUQkdJLDAtOYUENEXx8fn8iBguOBkMNiImLJF6CA0MCBYh9lSMCEAYQikAMnBFwn2MCRquvsLGys7S1tre4ubq7vDqtpL5HvAIGBMYDeTTECgrJtwwEBcYEzjIMzKO7A9PGpUUGzN61EMbSBOIxoei0ZdOQvTuhAw3V8Pb3%2BPn6%2B%2Fz9%2Fv8AAwocSBCQo0wFUwhI8KDhgwPrerUSUK8EAYcOD%2FCTRCABGhUMMGJ8d6JhSZMlHP%2BmVEkCJQCULkVgVFggQUcCC1QoEOlQQYqYMh%2B8FDrCZEyjRIMWRdoyaZ2bNhOoOmGAZ8OcKIAO3bqUpdKjSXk25XqiQdSb60JaJWlCK9OlZLeChetVrtMSm85iTXFRpMafdYfefRsUqEuYg7WWkGTTk4qFGB1EHEavIpuDCTNr3sy5s%2BfPoEOLHk063YCaCZD1mlpjk4TXrwtYjgWh5gLWMiDA3o3wFoQECRwExw2jwG7YCXDlFS58r4wEx187wMUgOHDgEWpEiC4h%2Ba281h34pKE7em9b1YUDn7xiwHHZugKdYc%2FCSoIss0vr38%2B%2Fv%2F%2FRTRAQhRIC4AHLAAcgoCCkAuf50IACDkTYzCcCJLiggvTRAKEDB0TIFh0GXLjgeD4wwGGEESaQIREKiKggiT2YiOKJxI0xgIsIfKgCPS%2BYFWGHwq2oiYULHpCfCFZE%2BFELBszoQIN0NEDkATWaIACHB2TpwJEAEGOdaqsIMIACYLKwQJZoHuDcCkZweUsBaCKQJQGfEZBmlgV8ZkCCceqYWXVpUgOamNEYIOR%2FiCaq6KIAhAAAIfkECQcAAAAsAAAAAGQAZAAABf8gII5kaZ5oqq5s675wLM90bd94ru987%2F%2FAoHBIExCPOMhiAUE6ZYLl0vissqJSqnWLGiwUA64Y1WiMfwKGmSgwgM%2BotsKwFhoWkYgBbmIo%2FgxEeXgLfCUNfwp1QQp4eoaHakdRelqQl5iZmpucnZ6foKGioz8LCA8IC5akOAcPr68Oq6CzMguwuAWjEBEFC4syDriwEqICvcg2w7iiDQXPBRHAMKfLD8bR0RE2t8u6ogzPEU01AsK4ErWdAtMzxxKvBeqs9PX29%2Fj5%2Bvv8%2Ff7%2FAAMKNAEBwryBJAYgkMCwEMIUAxhKlOBQn4AB0cKsWDiRYTsRr07AMjGSBDOT10D%2FpgyJkmUXAjAJkEMBoaPEmSRTogTgkue1niGB6hwptAXMAgR8qahpU4JGkTpHBI06bGdRlSdV%2BlQRE6aCjU3n9dRatCzVoT%2FNqjCAFCbOExE7VoQ6tqTUtC2jbtW6967eE2wjPFWhUOLchzQNIl7MuLHjx5AjS55MubJlGQ3cKDj4kMEBBKARDKZ1ZwDnFQI%2Bhwb9UZMAAglgb6uhcDXor6EUwN49GoYC26AJiFoQu3jvF7Vt4wZloDjstzBS2z7QWtPuBKpseA594LinAQYU37g45%2FTl8%2BjTq19fmUF4yq8PfE5QPQeEAgkKBLpUQL7%2FBEJAkMCADiSwHx8NyIeAfH8IHOgDfgUm4MBhY0Dg34V7ACEhgQnMxocACyoon4M9EBfhhJdEcOEBwrkwQAQLeHcCAwNKSEB9VRzjHwHmAbCAA0Ci6AIDeCjiGgQ4jjBAkAcAKSNCCgQZ5HKOGQBkk0Bm%2BBgDUjZJYmMGYOmAlpFlRgd7aKap5poyhAAAIfkECQcAAAAsAAAAAGQAZAAABf8gII5kaZ5oqq5s675wLM90bd94ru987%2F%2FAoHBIExCPOIHB0EA6ZUqFwmB8WlkCqbR69S0cD8SCy2JMGd3f4cFmO8irRjPdW7TvEaEAYkDTTwh3bRJCEAoLC35%2FJIJ3QgaICwaLJYGND0IDkRCUJHaNBXoDAxBwlGt3EqadRwIFEmwFq6y0tba3uLm6u7y9viYQEQkFpb8%2FAxLJybLGI7MwEMrSA81KEQNzNK%2FSyQnGWQsREZM1CdzJDsYN4RHh2TIR5xLev1nt4zbR59TqCuOcNVxxY1btXcABBBIkGPCsmcOHECNKnEixosWLGDNq3MjxCIRiHV0wIIAAQQKAIVX%2FMDhQsqQElBUFNFCAjUWBli0dGGSEyUQbn2xKOOI5IigAo0V%2FpmBQIEIBgigg4MS5MynQoz1FBEWKtatVrVuzel2h4GlTflGntnzGFexYrErdckXaiGjbEv6aEltxc%2BqbFHfD2hUr%2BGvXuIfFmmD6NEJVEg1Y4oQJtC3ixDwtZzWqWfGJBksajmhA0iTllCk%2BikbNurXr17Bjy55Nu7bt20HkKGCwOiWDBAeC63S4B1vvFAIIBF%2Be4DEuAQsISCdHI%2FLy5ad1QZBeQLrzMssRLFdgDKF0AgUUybB%2B%2FYB6XiO7Sz9%2BQkAE8cEREPh%2By8B5hjbYtxxU6kDQAH3I7XEgnG4MNujggxBGCAVvt2XhwIUK8JfEIX3YYsCFB2CoRwEJJEQAgkM0ANyFLL7HgwElxphdGhCwCKIDLu4QXYwEUEeJAAnc6EACOeowAI8n1TKAjQ74uIIAo9Bnn4kRoDgElEEmQIULNWY54wkMjAKSLQq%2BIMCQQwZp5UVdZpnkbBC4OeSXqCXnJpG1qahQc7c1wAADGkoo6KCEFrpCCAA7AAAAAAAAAAAA&amp;quot;;
try{
  if( !/^(.*\.)?tumblr[^.]*$/.test(l.host) ) throw(0);
  tstbklt();
}catch(z){
  a=function(){
    document.body.appendChild(D);
    D.style.cssText='background:#666 url(&amp;quot;'+img+'&amp;quot;) no-repeat 50% 50%;opacity:0.8;position:fixed;bottom:10px;right:10px;z-index:65536;-moz-border-radius:5px;padding:2px;';
    F.style.cssText='width:500px;height:500px;';
    A.innerHTML = 'X';
    A.addEventListener('click',R,false);
    A.style.cssText='display:block;padding:2px;line-height:11px;font-size:8px;width:1em;height:1em;margin-left:auto;background:#C33;color:#FFF;text-decoration:none;cursor:pointer;';
    D.appendChild(A);
    D.appendChild(F);
    F.src=u;
  };
  if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else a();
}
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/lieutar/let/gYC-x4T176C2Kg">
    <link>https://let.hatelabo.jp/lieutar/let/gYC-x4T176C2Kg</link>
    <dc:date>2010-11-07T17:24:47Z</dc:date>
    <description>google reader に RSS 登録するやつ。一応twitterとか、フィードへの link 要素のない tumblr にも対応。</description>
    <dc:creator>lieutar</dc:creator>
    <title>[Let] subscribe-by-google-reader</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Flieutar%2Flet%2FgYC-x4T176C2Kg.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;subscribe-by-google-reader&lt;/a&gt;&lt;pre&gt;/*
 * @title subscribe-by-google-reader
 * @description google reader に RSS 登録するやつ。一応twitterとか、フィードへの link 要素のない tumblr にも対応。
 * @include http://*
 * @license MIT License
 * @require 
 */

(function(){
   var BASE=&amp;quot;http://www.google.com/reader/preview/*/feed/&amp;quot;;
   var FEED_FINDER = [
     [
         /^(https?:\/\/(?!www\.)[^\.]+\.tumblr\.com)/,
       function(all,head){
         return head + '/' + rss;
       }
     ],
     [
       /^https?:\/\/twitter\.com\/#!\/([^/]+)/,
       function(all,user){
         var uid = null;
         var as = document.getElementsByTagName('a');
         for(var i=0,l=as.length;i&amp;lt;l;i++){
           var a = as[i];
           if(!a.className) continue;
           if(!a.className.match(/tweet-screen-name/)) continue;
           uid = a.getAttribute('data-user-id');
           break;
         }
         return uid ? &amp;quot;http://twitter.com/statuses/user_timeline/&amp;quot; + uid +
           &amp;quot;.rss&amp;quot; : null;
       }
     ]
   ];
   var find = null;
   FEED_FINDER.forEach(
     function(finder){
       if(find) return;
       var match = String(location.href).match(finder[0]); 
       if(!match) return;
       find = function(){ return finder[1].apply(null,match); };
     }
   );
   var url = (find || function(){
                var links=document.getElementsByTagName(&amp;quot;link&amp;quot;);
                var re=/application\/atom\|rss\+xml/ig;
                for(var i=0;i&amp;lt;links.length;++i){
                  if((links[i].getAttribute(&amp;quot;rel&amp;quot;)==&amp;quot;alternate&amp;quot;)&amp;amp;&amp;amp;
                    (re.test(links[i].getAttribute(&amp;quot;type&amp;quot;)))){
                    return links[i].getAttribute(&amp;quot;href&amp;quot;);
                  }
                  return null;
                  if(!(url &amp;amp;&amp;amp; url.length&amp;gt;0)){
                    slert(&amp;quot;Could not find rss feed.&amp;quot;);
                  }else{
                    window.location.href=(BASE+url);
                  }
                }
              })();
   location.href=(BASE + url);
 })();
&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
