<?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/sheile/rss">
    <link>https://let.hatelabo.jp/sheile/rss</link>
    <description></description>
    <title>Bookmarklets from sheile</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/sheile/let/gYC-y7Xdg9v6dQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/sheile/let/gYC-x5qM8766IA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/sheile/let/gYC-ys-wrsDSeQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/sheile/let/gYC-yqiXkP_LAg"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/sheile/let/gYC-y7Xdg9v6dQ">
    <link>https://let.hatelabo.jp/sheile/let/gYC-y7Xdg9v6dQ</link>
    <dc:date>2011-01-22T13:01:16Z</dc:date>
    <description>FaceBookの通知機能を上から出すジョークBookmarklet</description>
    <dc:creator>sheile</dc:creator>
    <title>[Let] 上から来るぞ気をつけろ！</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fsheile%2Flet%2FgYC-y7Xdg9v6dQ.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 FaceBookの通知機能を上から出すジョークBookmarklet
 * @include http://*
 * @license MIT License
 * @require 
 */
var head=document.getElementsByTagName(&amp;quot;head&amp;quot;)[0];
var style=document.createElement(&amp;quot;style&amp;quot;);
style.innerHTML=&amp;quot;.UIBeeper { position: relative !important; }&amp;quot;;
head.appendChild(style);

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/sheile/let/gYC-x5qM8766IA">
    <link>https://let.hatelabo.jp/sheile/let/gYC-x5qM8766IA</link>
    <dc:date>2010-12-10T16:47:45Z</dc:date>
    <description>東京国際アニメフェアの開催告知チラシから参加拒否企業の作品をグレースケール化します。 http://www.tokyoanime.jp/ja/info/leaflet/ で実行してください。</description>
    <dc:creator>sheile</dc:creator>
    <title>[Let] 東京国際アニメフェアの開催告知チラシから参加拒否企業の作品をグレースケール化します</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fsheile%2Flet%2FgYC-x5qM8766IA.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://www.tokyoanime.jp/ja/info/leaflet/ で実行してください。
 * @include http://www.tokyoanime.jp/ja/info/leaflet/
 * @license MIT License
 * @require 
 */
(function() {
var XMAX = 9;
var YMAX = 8;

var isRetire = new Array(XMAX );
for(var x = 0; x &amp;lt; XMAX ; x++) {
	isRetire[x] = new Array(YMAX);
	for(var y = 0; y &amp;lt; YMAX; y++) {
		isRetire[x][y] = false;
	}
}

//	出展を取りやめた作品 via http://twitpic.com/3elscd
isRetire[0][3] = true;
isRetire[1][2] = true;	//	MAJOR(小学館)
isRetire[1][4] = true;	//	ワンピース(集英社)
isRetire[2][3] = true;
isRetire[2][4] = true;	//	ドラゴンボール(集英社)
isRetire[2][6] = true;	//	ドラえもん(小学館)
isRetire[3][1] = true;
isRetire[3][2] = true;
isRetire[3][4] = true;	//	名探偵コナン(小学館)
isRetire[3][7] = true;	//	FairyTale(講談社)
isRetire[4][1] = true;
isRetire[4][2] = true;
isRetire[4][5] = true;
isRetire[4][6] = true;
isRetire[6][3] = true;
isRetire[6][4] = true;
isRetire[6][7] = true;
isRetire[7][3] = true;
isRetire[8][2] = true;
isRetire[8][3] = true;
isRetire[8][4] = true;
isRetire[8][5] = true;
isRetire[8][6] = true;

var image = document.querySelector(&amp;quot;div#detail img&amp;quot;);
var container = document.querySelector(&amp;quot;div#detail &amp;gt; p&amp;quot;);

var canvas = document.createElement(&amp;quot;canvas&amp;quot;);
canvas.width = image.width;
canvas.height = image.height;
canvas.background = &amp;quot;none repeat scroll 0 0 #FFFFFF&amp;quot;;
canvas.style.border = &amp;quot;1px solid #CCCCCC&amp;quot;;
canvas.style.marginBottom = &amp;quot;10px&amp;quot;;
canvas.style.padding = &amp;quot;3px&amp;quot;;

if(!canvas.getContext) return;

var context = canvas.getContext('2d');
context.drawImage(image, 0, 0);

var imageData = context.getImageData(0, 0, image.width, image.height);
var data = imageData.data;

for(var yIndex = 0; yIndex &amp;lt; YMAX; yIndex++) {
	for(var xIndex = 0; xIndex &amp;lt; XMAX; xIndex++) {
		if(isRetire[xIndex][yIndex]) {
			var adjustY = (xIndex % 2 == 1) ? (41.1428571428571 / 2) : 0;
			var cx = Math.floor(59 + xIndex * 35.625);
			var cy = Math.floor(145 + yIndex * 41.1428571428571 - adjustY);
			var top = Math.floor(Math.sin(Math.PI / 3) * 22);
			var left = Math.floor(Math.sin(Math.PI / 6) * 22);

			for(var py = -top; py &amp;lt;= top; py++) {
				var sx = Math.floor(-22 + (Math.abs(py) / 19.0) * (22 - left));
				for(var px = sx; px &amp;lt; -sx; px++) {
					var x = cx + px;
					var y = cy + py;

					var base = (y * image.width + x) * 4;
					var glay = (data[base + 0] + data[base + 1] + data[base + 2]) / 3 * 0.7;
					data[base + 0] = glay;
					data[base + 1] = glay;
					data[base + 2] = glay;
				}
			}
		}
	}
}

context.putImageData(imageData, 0, 0);

container.insertBefore(canvas, image);
container.removeChild(image);

})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/sheile/let/gYC-ys-wrsDSeQ">
    <link>https://let.hatelabo.jp/sheile/let/gYC-ys-wrsDSeQ</link>
    <dc:date>2010-09-01T07:56:30Z</dc:date>
    <description>オープンソースの社内SNS「SKIP」に前回閲覧時からの差分を表示する機能を追加します。FirefoxのGreasemonkeyでのみ動作する為、Bookmarkletとしては使用できません。画面下部のUserScriptからインストールして使用してください。</description>
    <dc:creator>sheile</dc:creator>
    <title>[Let] EntryDiff</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fsheile%2Flet%2FgYC-ys-wrsDSeQ.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;EntryDiff&lt;/a&gt;&lt;pre&gt;/*
 * @title EntryDiff
 * @description オープンソースの社内SNS「SKIP」に前回閲覧時からの差分を表示する機能を追加します。FirefoxのGreasemonkeyでのみ動作する為、Bookmarkletとしては使用できません。画面下部のUserScriptからインストールして使用してください。
 * @include http://*?entry_id=*
 * @license MIT License
 * @require 
 */
(function() {
var entryId = location.href.match(/entry_id=([0-9]+)/)[1];
var prevVisit = parseInt(GM_getValue(entryId)) || new Date().getTime() - 365 * 24 * 3600 * 1000;

var targets = new Array();

var list = document.getElementsByClassName(&amp;quot;date&amp;quot;)
for(var i = 0; i &amp;lt; list.length; i++) {
	var dateString = list[i].textContent.replace(&amp;quot;年&amp;quot;, &amp;quot;/&amp;quot;).replace(&amp;quot;月&amp;quot;, &amp;quot;/&amp;quot;).replace(&amp;quot;日&amp;quot;, &amp;quot;&amp;quot;)
	var date = new Date(dateString.match(/[0-9]{4}\/[0-9]{2}\/[0-9]{2} [0-9]{2}:[0-9]{2}/) + &amp;quot;:00&amp;quot;).getTime()
	if(isNaN(date)) {
		var date = new Date(dateString.split('\n')[2].match(/(.*) by /)[1] + &amp;quot;:00&amp;quot;).getTime()
	}
	
	if(date &amp;gt; prevVisit) {
		var target = {element: list[i], isComment: null};
		target.isComment = (target.element.tagName == &amp;quot;SPAN&amp;quot;);
		targets.push(target);
	}
}
GM_setValue(entryId, new Date().getTime().toString());

var boxElement = document.createElement(&amp;quot;DIV&amp;quot;);
boxElement.innerHTML = getBoxHTML();
boxElement.id = &amp;quot;historyBox&amp;quot;;

for(var i = 0; i &amp;lt; targets.length; i++) {
	var linkText = &amp;quot;&amp;quot;;
	//	着色, タイトル取得
	if(targets[i].isComment) {
		targets[i].element.parentNode.parentNode.parentNode.style.backgroundColor = &amp;quot;#FFBBBB&amp;quot;;
		linkText = targets[i].element.parentNode.textContent.match(/ *(.*?)\s*\[/)[1];
	} else {
		targets[i].element.parentNode.style.backgroundColor = &amp;quot;#FFBBBB&amp;quot;;
		targets[i].element.parentNode.parentNode.style.backgroundColor = &amp;quot;#FFBBBB&amp;quot;;
		linkText = targets[i].element.textContent.match(/ by (.*?)\s*\[/)[1];
	}

	//	ラベルの作成
	var labelNode = document.createElement(&amp;quot;A&amp;quot;);
	labelNode.name = &amp;quot;history&amp;quot; + i;
	targets[i].element.parentNode.insertBefore(labelNode, targets[i].element);
	
	//	一覧リストの作成
	var liNode = document.createElement(&amp;quot;LI&amp;quot;);
	var aNode = document.createElement(&amp;quot;A&amp;quot;);
	aNode.textContent = linkText;
	aNode.href = &amp;quot;#history&amp;quot; + i;
	liNode.appendChild(aNode);
	boxElement.getElementsByTagName(&amp;quot;ul&amp;quot;)[0].appendChild(liNode);
}

document.getElementById(&amp;quot;contents_left&amp;quot;).getElementsByTagName(&amp;quot;form&amp;quot;)[0].insertBefore(boxElement, document.getElementsByClassName(&amp;quot;box_space&amp;quot;)[0]);

function getBoxHTML() {
	var html = &amp;quot;&amp;quot;;
	html += '&amp;lt;div class=&amp;quot;box_space&amp;quot;&amp;gt;\n';
	html += '  &amp;lt;div class=&amp;quot;box_space_title&amp;quot;&amp;gt;変更点の一覧&amp;lt;/div&amp;gt;\n';
	html += '  &amp;lt;div style=&amp;quot;font-size: 10px;&amp;quot; class=&amp;quot;box_space_body&amp;quot;&amp;gt;\n';
	html += '    &amp;lt;ul style=&amp;quot;list-style-position: inside; list-style-type: disc;&amp;quot;&amp;gt;\n';
	html += '    &amp;lt;/ul&amp;gt;\n';
	html += '    &amp;lt;br style=&amp;quot;display: none; clear: left;&amp;quot;/&amp;gt;\n';
	html += '  &amp;lt;/div&amp;gt;\n';
	html += '&amp;lt;/div&amp;gt;\n';
	return html;
}
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/sheile/let/gYC-yqiXkP_LAg">
    <link>https://let.hatelabo.jp/sheile/let/gYC-yqiXkP_LAg</link>
    <dc:date>2010-06-16T15:50:29Z</dc:date>
    <description>ニコニコミュニティの生放送履歴ページからユニークユーザ数を求めて表示します。複数ページに渡る場合にはAutoPagerize等で先に全データを表示して下さい。</description>
    <dc:creator>sheile</dc:creator>
    <title>[Let] 生放送を行ったユニークユーザ数を求める</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fsheile%2Flet%2FgYC-yqiXkP_LAg.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 ニコニコミュニティの生放送履歴ページからユニークユーザ数を求めて表示します。複数ページに渡る場合にはAutoPagerize等で先に全データを表示して下さい。
 * @include http://com.nicovideo.jp/live_archives/co*
 * @license MIT License
 * @require 
 */
var uniq = new Array();
var users = document.querySelectorAll(&amp;quot;td.user&amp;quot;);
for(var i = 0; i &amp;lt; users.length; i++) {
    var isFind = false;
    for(var j = 0; j &amp;lt; uniq.length; j++) {
        if(users[i].textContent == uniq[j]) isFind = true;
    }
    if(!isFind) uniq.push(users[i].textContent);
}
alert(&amp;quot;過去の放送人数：&amp;quot; + uniq.length);
alert(uniq);

&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
