<?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/pacochi/rss">
    <link>https://let.hatelabo.jp/pacochi/rss</link>
    <description></description>
    <title>Bookmarklets from pacochi</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/j5TygOrgguAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/i9uwjJnogMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/ipfOgsHcgqAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/i6XFrNPigMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/iu6t2bOUgKAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/iqWWsOKWgsAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/ipfNhb7UgqAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/ifmlwY6egOAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hJmeosL9k5tu"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hLHUreDj79FO"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hLHWgtOs55Ec"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hJmd5fvw-PA4"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hJmd06zY5b5M"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hJmf7p7Q4agq"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hJmc-bbGmZpw"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hLHU-OKalakZ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hJmc3OPAv48G"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hJme_JyaqvZC"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hLHUxPGtjesR"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/pacochi/let/hLHUsK-TwYJ_"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/j5TygOrgguAA">
    <link>https://let.hatelabo.jp/pacochi/let/j5TygOrgguAA</link>
    <dc:date>2023-04-04T01:38:56Z</dc:date>
    <description>ツイートボタンをコピーボタンにします。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] Tangolf の結果コピー</title>
    <content:encoded>&lt;a href="javascript:%28%28D%3Ddocument%2CB%3D%28t%3D%3E%60%5Bclass%5E%3D%22_%24%7Bt%7DButton_%22%5D%60%29%2CT%3D%28%28n%3DD%29%3D%3En%3F.querySelector%3F.%28B%28%27share%27%29%29%29%2CO%3D%28e%3D%3Enew%20MutationObserver%28%28%28l%2Co%29%3D%3El.reduce%28%28%28n%2Cm%29%3D%3En.concat%28%5B...m.addedNodes%5D%29%29%2C%5B%5D%29.find%28%28n%3D%3ET%28n%29%29%29%26%26o.disconnect%28R%28%29%29%29%29.observe%28D.body%2C%7BchildList%3A1%2Csubtree%3A1%7D%29%29%2CR%3D%28%28c%3D%27%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%27%29%3D%3EObject.assign%28T%28%29%2C%7B_%3AD.querySelector%28B%28%27reset%27%29%29.addEventListener%28%27click%27%2CO%2C%7Bonce%3A1%7D%29%2CinnerText%3Ac%2B%27%EF%BC%81%27%2Conclick%3A%28e%2Ct%3De.target%29%3D%3Ee.preventDefault%28t.innerText%3Dc%2B%27%F0%9F%86%97%27%2Cnavigator.clipboard.writeText%28%5B...new%20URL%28t.href%29.searchParams.values%28%29%5D.join%28%27%5Cn%23%27%29%29%29%7D%29%29%29%3D%3E%7BT%28%29%3FR%28%29%3AO%28%29%7D%29%28%29%3B"&gt;Tangolf の結果コピー&lt;/a&gt;&lt;pre&gt;/*
 * @title Tangolf の結果コピー
 * @description ツイートボタンをコピーボタンにします。
 * @include https://tangolf.hatelabo.jp/
 * @license MIT License
 * @javascript_url
 */

// https://gist.github.com/pacochi/0568e742d53902f99f533aa1b4ed51e2 のおすそわけ

((
 D = document,
 B = t =&amp;gt; `[class^=&amp;quot;_${t}Button_&amp;quot;]`,
 T = (n = D) =&amp;gt; n?.querySelector?.(B('share')),
 O = e =&amp;gt; new MutationObserver((l, o) =&amp;gt;
  (l.reduce((n, m) =&amp;gt; n.concat([...m.addedNodes]), []).find(n =&amp;gt; T(n)) &amp;amp;&amp;amp; o.disconnect(R()))
 ).observe(D.body, { childList: 1, subtree: 1 }),
 R = (c = 'スコアをコピー') =&amp;gt; Object.assign(T(), {
  _: D.querySelector(B('reset')).addEventListener('click', O, { once: 1 }),
  innerText: c + '！',
  onclick: (e, t = e.target) =&amp;gt; e.preventDefault(
   t.innerText = c + '🆗',
   navigator.clipboard.writeText([...(new URL(t.href)).searchParams.values()].join('\n#'))
  )
 })
) =&amp;gt; { T() ? R() : O(); })();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/i9uwjJnogMAA">
    <link>https://let.hatelabo.jp/pacochi/let/i9uwjJnogMAA</link>
    <dc:date>2021-05-18T04:46:45Z</dc:date>
    <description>閲覧しているパーマリンクを起点にしたトゥートの一覧を表示します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [?]ここより古いトゥート</title>
    <content:encoded>&lt;a href="javascript:location.href%3Dlocation.href.replace%28%2F%28%5Cd%2B%29%24%2F%2C%28s%3D%3E%27with_replies%3Fmax_id%3D%27%2B%28BigInt%28s%29%2B1n%29%29%29%3B"&gt;[?]ここより古いトゥート&lt;/a&gt;&lt;pre&gt;/*
 * @title [?]ここより古いトゥート
 * @description 閲覧しているパーマリンクを起点にしたトゥートの一覧を表示します。
 * @include *
 * @license MIT License
 * @javascript_url
 */

location.href = location.href.replace(/(\d+)$/, s =&amp;gt; 'with_replies?max_id=' + (BigInt(s) + 1n));
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/ipfOgsHcgqAA">
    <link>https://let.hatelabo.jp/pacochi/let/ipfOgsHcgqAA</link>
    <dc:date>2021-02-23T14:57:29Z</dc:date>
    <description>http://let.hatelabo.jp/pacochi/let/ipfNhb7UgqAA がブックマークできなかった</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] BigInt を ～n で書くと Packed が空になる（修正済）</title>
    <content:encoded>&lt;a href="javascript:void%2016n%3B"&gt;BigInt を ～n で書くと Packed が空になる（修正済）&lt;/a&gt;&lt;pre&gt;/*
 * @title BigInt を ～n で書くと Packed が空になる（修正済）
 * @description http://let.hatelabo.jp/pacochi/let/ipfNhb7UgqAA がブックマークできなかった
 * @include http://*
 * @license MIT License
 * @javascript_url 
 */

// 2020.11.30 空にならず正しく扱われるのを確認、書いといてよかった
// 六月頃から表示されなくなった個別ページの説明文およびスターの復活も何卒よろしくお願いします
// 2021.02.23 ↑って書いといたらほんとに修正されててありがとうございます！ブクマを見るに超速だったっぽい

void (16n);
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/i6XFrNPigMAA">
    <link>https://let.hatelabo.jp/pacochi/let/i6XFrNPigMAA</link>
    <dc:date>2021-02-23T13:42:14Z</dc:date>
    <description>管理画面から複数の絵文字を登録できるようにします。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [?]カスタム絵文字まとめて登録</title>
    <content:encoded>&lt;a href="javascript:%28async%28%29%3D%3E%7Bconst%20delay%3D2e3%3Bconst%20authenticityToken%3Ddocument.querySelector%28%27meta%5Bname%3D%22csrf-token%22%5D%27%29.content%3Bconst%20up%3Dasync%20file%3D%3E%7Bconst%20shortcode%3Dfile.name.match%28%2F%5E%28%3F%3Cs%3E%5Cw%2B%29%5C.png%24%2F%29%3F.groups%3F.s%3F%3F%27%27%3Bif%28shortcode.length%3C2%29return%60%3Cspan%20class%3D%22error%22%3E%E3%81%93%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AF%20shortcode%20%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%28%24%7Bfile.name%7D%29%3C%2Fspan%3E%60%3Bconst%20body%3Dnew%20FormData%3Bbody.append%28%27utf8%27%2C%27%E2%9C%93%27%29%3Bbody.append%28%27authenticity_token%27%2CauthenticityToken%29%3Bbody.append%28%27custom_emoji%5Bshortcode%5D%27%2Cshortcode%29%3Bbody.append%28%27custom_emoji%5Bimage%5D%27%2Cfile%2Cfile.name%29%3Bconst%20message%3Dawait%20fetch%28%27%2Fadmin%2Fcustom_emojis%27%2C%7Bmethod%3A%27POST%27%2Ccredentials%3A%27include%27%2Cbody%3Abody%7D%29.then%28%28response%3D%3Eresponse.text%28%29%29%29%3Breturn%20message.match%28%2F%3Cdiv%20class%3D%5B%22%27%5D%3Fflash-message%20.%2B%3F%3C%5C%2Fdiv%3E%7C%3Cspan%20class%3D%5B%27%22%5D%3Ferror.%2B%3F%3C%5C%2Fspan%3E%2Fgs%29%3F.join%28%27%27%29%7C%7Cmessage%7D%3Bconst%20box%3DObject.assign%28document.createElement%28%27div%27%29%2C%7Bstyle%3A%27height%3A300px%3Boverflow%3Aauto%3Bborder%3A4px%20solid%20%23888%3B%27%7D%29%3Bbox.append%28%27%E3%81%93%E3%81%93%E3%81%AB%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%27%29%3Bbox.addEventListener%28%27dragover%27%2C%28e%3D%3E%7Be.preventDefault%28%29%7D%29%29%3Bbox.addEventListener%28%27drop%27%2C%28async%20e%3D%3E%7Be.preventDefault%28%29%3Bbox.textContent%3D%27%27%3Bfor%28const%20file%20of%20e.dataTransfer.files%29%7Bbox.append%28file.name%2B%27%20%3A%20%27%29%3Bbox.insertAdjacentHTML%28%27beforeend%27%2Cawait%20up%28file%29%2B%27%3Cbr%3E%27%29%3Bawait%20new%20Promise%28%28resolve%3D%3EsetTimeout%28resolve%2Cdelay%29%29%29%7Dbox.append%28%27%3F%27%29%7D%29%29%3Bdocument.querySelector%28%27.content%27%29.prepend%28box%29%7D%29%28%29%3B"&gt;[?]カスタム絵文字まとめて登録&lt;/a&gt;&lt;pre&gt;// @title [?]カスタム絵文字まとめて登録
// @description 管理画面から複数の絵文字を登録できるようにします。
// @include https://*/admin/custom_emojis/new
// @license MIT License
// @javascript_url

// https://qiita.com/neustrashimy/items/870769d7db4d95cde238#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E7%B5%B5%E6%96%87%E5%AD%97%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8Bimportv261
// tootctl 使える場合はこっちがいいと思う

// https://docs.joinmastodon.org/methods/admin/
// API ないってことだよね？
(async () =&amp;gt; {

	const delay = 2000;
	const authenticityToken = document.querySelector('meta[name=&amp;quot;csrf-token&amp;quot;]').content;

	const up = async file =&amp;gt; {

		const shortcode = file.name.match(/^(?&amp;lt;s&amp;gt;\w+)\.png$/)?.groups?.s ?? '';
		if (shortcode.length &amp;lt; 2) return `&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;このファイル名は shortcode にできません(${file.name})&amp;lt;/span&amp;gt;`;

		const body = new FormData();
		body.append('utf8', '✓');
		body.append('authenticity_token', authenticityToken);
		body.append('custom_emoji[shortcode]', shortcode);
		body.append('custom_emoji[image]', file, file.name);
		const message = await fetch('/admin/custom_emojis', {
		 method: 'POST',
		 credentials: 'include',
		// なんかあると駄目だった
		// headers: { 'Content-Type': 'multipart/form-data' },
		 body
		}).then(response =&amp;gt; response.text());

		return message.match(/&amp;lt;div class=[&amp;quot;']?flash-message .+?&amp;lt;\/div&amp;gt;|&amp;lt;span class=['&amp;quot;]?error.+?&amp;lt;\/span&amp;gt;/gs)?.join('') || message;

	};

	const box = Object.assign(document.createElement('div'), {
	 style: 'height:300px;overflow:auto;border:4px solid #888;'
	});
	box.append('ここにドロップ');
	box.addEventListener('dragover', e =&amp;gt; { e.preventDefault(); });
	box.addEventListener('drop', async e =&amp;gt; {

		e.preventDefault();
		box.textContent = '';

		for (const file of e.dataTransfer.files) {

			box.append(file.name + ' : ');
			box.insertAdjacentHTML('beforeend', (await up(file)) + '&amp;lt;br&amp;gt;');
			await new Promise(resolve =&amp;gt; setTimeout(resolve, delay));
		}

		box.append('?');

	});
	document.querySelector('.content').prepend(box);

})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/iu6t2bOUgKAA">
    <link>https://let.hatelabo.jp/pacochi/let/iu6t2bOUgKAA</link>
    <dc:date>2020-11-29T20:22:19Z</dc:date>
    <description>http://let.hatelabo.jp/pacochi/let/ipfOgsHcgqAA が直っていたので</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] テンプレートリテラル認識テスト</title>
    <content:encoded>&lt;a href="javascript:alert%28%60%5Cnhttp%3A%2F%2Flet.hatelabo.jp%2F%5Cn%2F%2A%20CSS%20%E6%9B%B8%E3%81%84%E3%81%9F%E6%99%82%E3%81%AB%E5%8B%9D%E6%89%8B%E3%81%AB%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E7%9C%81%E7%95%A5%E3%81%95%E3%82%8C%E3%81%A6%E9%81%95%E3%81%86%E6%84%8F%E5%91%B3%E5%90%88%E3%81%84%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%9F%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%82%E3%81%A3%E3%81%9F%E6%B0%97%E3%81%8C%E3%81%97%E3%81%9F%E3%81%91%E3%81%A9%5Cn%20%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AB%E3%81%A9%E3%82%93%E3%81%AA%E8%A8%98%E8%BF%B0%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%8B%E3%81%AF%E5%BF%98%E3%82%8C%E3%81%9F%20%2A%2F%5Cn%5Cn%60%29%3B"&gt;テンプレートリテラル認識テスト&lt;/a&gt;&lt;pre&gt;/*
 * @title テンプレートリテラル認識テスト
 * @description http://let.hatelabo.jp/pacochi/let/ipfOgsHcgqAA が直っていたので
 * @include http://*
 * @license MIT License
 * @javascript_url 
 */

// 以前は認識してもらえなくて URL 書く度コメント扱いされてたのだけど
// 2020.11.30 現在正しく扱ってもらえるようになっているのを確認
// 個別ページで p.description が空になっている不具合はまだそのまま

alert(`
http://let.hatelabo.jp/
/* CSS 書いた時に勝手にスペースが省略されて違う意味合いになってたケースあった気がしたけど
 具体的にどんな記述だったかは忘れた */

`);
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/iqWWsOKWgsAA">
    <link>https://let.hatelabo.jp/pacochi/let/iqWWsOKWgsAA</link>
    <dc:date>2020-08-08T03:51:11Z</dc:date>
    <description>新しいタブで開くと迷子になるので。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] Google 翻訳から原文のページへ</title>
    <content:encoded>&lt;a href="javascript:location.href%3Dnew%20URL%28location.href%29.searchParams.get%28%27u%27%29%3B"&gt;Google 翻訳から原文のページへ&lt;/a&gt;&lt;pre&gt;/*
 * @title Google 翻訳から原文のページへ
 * @description 新しいタブで開くと迷子になるので。
 * @include https://translate.googleusercontent.com/*
 * @license MIT License
 * @javascript_url 
 */

location.href = new URL(location.href).searchParams.get('u');

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/ipfNhb7UgqAA">
    <link>https://let.hatelabo.jp/pacochi/let/ipfNhb7UgqAA</link>
    <dc:date>2020-07-19T01:11:03Z</dc:date>
    <description>忘れるのでメモ。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] 読める時刻 ⇔ 雪ふりかけ雑変換</title>
    <content:encoded>&lt;a href="javascript:void%28s%3D%3Eprompt%28%27%27%2C%2F%5CD%2F.test%28s%29%3FString%28BigInt%28new%20Date%28s.replace%28%2F%5B%E5%B9%B4%E6%9C%88%5D%2Fg%2C%27%2F%27%29.replace%28%2F%5B%E6%99%82%E5%88%86%5D%2Fg%2C%27%3A%27%29.replace%28%2F%5B%5E%5C%2F%3A%5Cd%5Cs%5D%2Fg%2C%27%27%29%29.getTime%28%29%29%3C%3CBigInt%2816%29%29%3Anew%20Date%28Number%28BigInt%28s%29%3E%3EBigInt%2816%29%29%29.toLocaleString%28%29%29%29%28prompt%28%27time%20or%20snowflake%27%2C%27%27%29%29%3B"&gt;読める時刻 ⇔ 雪ふりかけ雑変換&lt;/a&gt;&lt;pre&gt;/*
 * @title 読める時刻 ⇔ 雪ふりかけ雑変換
 * @description 忘れるのでメモ。
 * @include http://*
 * @license MIT License
 * @javascript_url 
 */

void (s =&amp;gt; prompt('', /\D/.test(s) ? String(BigInt(new Date(s.replace(/[年月]/g, '/').replace(/[時分]/g, ':').replace(/[^\/:\d\s]/g, '')).getTime()) &amp;lt;&amp;lt; BigInt(16)) : new Date(Number(BigInt(s) &amp;gt;&amp;gt; BigInt(16))).toLocaleString()))(
 prompt('time or snowflake', '')
);

/*
https://github.com/tootsuite/mastodon/blob/a24605961a1572f7e1800cc177b5b7defe45969c/lib/mastodon/snowflake.rb#L141-L146
ミリ秒をランダムで付加した後、さらに 16進数で下 4桁分（2進数で 16桁分）空けて
0x0000～0xffff のランダムな値を埋め込んでいる
ので最大 65536000 ほど素の値にプラスされている可能性がある
さらに秒数なしの時刻を入れた場合、最大 3932160000（60000n &amp;lt;&amp;lt; 16n）ほどの開きがある
*/

/*
16n って書いたら Hatena::Let が混乱して Packed 全部消えたので、長いけど BigInt(16) にしとく
*/&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/ifmlwY6egOAA">
    <link>https://let.hatelabo.jp/pacochi/let/ifmlwY6egOAA</link>
    <dc:date>2020-05-31T23:48:18Z</dc:date>
    <description>できるといいなくらいで。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] 読める時刻 ⇔ UNIX タイムスタンプ雑変換</title>
    <content:encoded>&lt;a href="javascript:void%28s%3D%3Eprompt%28%27%27%2C%2F%5CD%2F.test%28s%29%3FMath.trunc%28new%20Date%28s%29.getTime%28%29%2F1e3%29%3Anew%20Date%28s%2A1e3%29.toLocaleString%28%29%29%29%28prompt%28%27time%27%2C%27%27%29%29%3B"&gt;読める時刻 ⇔ UNIX タイムスタンプ雑変換&lt;/a&gt;&lt;pre&gt;/*
 * @title 読める時刻 ⇔ UNIX タイムスタンプ雑変換
 * @description できるといいなくらいで。
 * @include http://*
 * @license MIT License
 * @javascript_url 
 */

void (s =&amp;gt; prompt('', /\D/.test(s) ? Math.trunc(new Date(s).getTime() / 1000) : new Date(s * 1000).toLocaleString()))(
 prompt('time', '')
);&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hJmeosL9k5tu">
    <link>https://let.hatelabo.jp/pacochi/let/hJmeosL9k5tu</link>
    <dc:date>2019-02-22T07:52:29Z</dc:date>
    <description>うっかりかな入力をしてしまった語を復元します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] 宇宙語変換</title>
    <content:encoded>&lt;a href="javascript:%28%28m%3D%7B3%3A%27%E3%81%82%27%2Ce%3A%27%E3%81%84%27%2C4%3A%27%E3%81%86%27%2C5%3A%27%E3%81%88%27%2C6%3A%27%E3%81%8A%27%2Ct%3A%27%E3%81%8B%27%2Cg%3A%27%E3%81%8D%27%2Ch%3A%27%E3%81%8F%27%2C%27%3A%27%3A%27%E3%81%91%27%2Cb%3A%27%E3%81%93%27%2Cx%3A%27%E3%81%95%27%2Cd%3A%27%E3%81%97%27%2Cr%3A%27%E3%81%99%27%2Cp%3A%27%E3%81%9B%27%2Cc%3A%27%E3%81%9D%27%2Cq%3A%27%E3%81%9F%27%2Ca%3A%27%E3%81%A1%27%2Cz%3A%27%E3%81%A4%27%2Cw%3A%27%E3%81%A6%27%2Cs%3A%27%E3%81%A8%27%2Cu%3A%27%E3%81%AA%27%2Ci%3A%27%E3%81%AB%27%2C1%3A%27%E3%81%AC%27%2C%27%2C%27%3A%27%E3%81%AD%27%2Ck%3A%27%E3%81%AE%27%2Cf%3A%27%E3%81%AF%27%2Cv%3A%27%E3%81%B2%27%2C2%3A%27%E3%81%B5%27%2C%27%5E%27%3A%27%E3%81%B8%27%2C%27-%27%3A%27%E3%81%BB%27%2Cj%3A%27%E3%81%BE%27%2Cn%3A%27%E3%81%BF%27%2C%27%5D%27%3A%27%E3%82%80%27%2C%27%2F%27%3A%27%E3%82%81%27%2Cm%3A%27%E3%82%82%27%2C7%3A%27%E3%82%84%27%2C8%3A%27%E3%82%86%27%2C9%3A%27%E3%82%88%27%2C0%3A%27%E3%82%8F%27%2Cy%3A%27%E3%82%93%27%2Co%3A%27%E3%82%89%27%2Cl%3A%27%E3%82%8A%27%2C%27.%27%3A%27%E3%82%8B%27%2C%27%3B%27%3A%27%E3%82%8C%27%2C%27%5C%5C%27%3A%27%28%E3%82%8D%7C%E3%83%BC%29%27%2C%27%40%27%3A%27%E3%82%99%27%2C%27%5B%27%3A%27%E3%82%9A%27%2C%27%23%27%3A%27%E3%81%81%27%2CE%3A%27%E3%81%83%27%2C%24%3A%27%E3%81%85%27%2C%27%25%27%3A%27%E3%81%87%27%2C%27%26%27%3A%27%E3%81%89%27%2CT%3A%27%E3%82%95%27%2CG%3A%27%E3%81%8D%27%2CH%3A%27%E3%81%8F%27%2C%27%2A%27%3A%27%E3%82%96%27%2CB%3A%27%E3%81%93%27%2CX%3A%27%E3%81%95%27%2CD%3A%27%E3%81%97%27%2CR%3A%27%E3%81%99%27%2CP%3A%27%E3%81%9B%27%2CC%3A%27%E3%81%9D%27%2CQ%3A%27%E3%81%9F%27%2CA%3A%27%E3%81%A1%27%2CZ%3A%27%E3%81%A3%27%2CW%3A%27%E3%81%A6%27%2CS%3A%27%E3%81%A8%27%2CU%3A%27%E3%81%AA%27%2CI%3A%27%E3%81%AB%27%2C%27%21%27%3A%27%E3%81%AC%27%2C%27%3C%27%3A%27%E3%80%81%27%2CK%3A%27%E3%81%AE%27%2CF%3A%27%E3%82%8E%27%2CV%3A%27%E3%82%90%27%2C%27%E2%80%9D%27%3A%27%E3%81%B5%27%2C%27~%27%3A%27%E3%82%91%27%2C%27%3D%27%3A%27%E3%81%BB%27%2CJ%3A%27%E3%81%BE%27%2CN%3A%27%E3%81%BF%27%2C%27%7D%27%3A%27%E3%80%8D%27%2C%27%3F%27%3A%27%E3%83%BB%27%2CM%3A%27%E3%82%82%27%2C%27%E2%80%99%27%3A%27%E3%82%83%27%2C%27%28%27%3A%27%E3%82%85%27%2C%27%29%27%3A%27%E3%82%87%27%2CY%3A%27%E3%82%93%27%2CO%3A%27%E3%82%89%27%2CL%3A%27%E3%82%8A%27%2C%27%3E%27%3A%27%E3%80%82%27%2C%27%2B%27%3A%27%E3%82%8C%27%2C_%3A%27%E3%82%8D%27%2C%27%7C%27%3A%27%E3%83%BC%27%2C%27%E2%80%98%27%3A%27%E3%82%99%27%2C%27%7B%27%3A%27%E3%80%8C%27%7D%2Cs%3D%5B...%28%27%27%2BgetSelection%28%29%29.trim%28%29.normalize%28%27NFKC%27%29%5D%29%3D%3Ealert%28s.map%28%28c%3D%3Em%5Bc%5D%3Fm%5Bc%5D%3Ac%29%29.join%60%60%29%29%28%29%3B"&gt;宇宙語変換&lt;/a&gt;&lt;pre&gt;/*
 * @title 宇宙語変換
 * @description うっかりかな入力をしてしまった語を復元します。
 * @include *
 * @license MIT License
 * @javascript_url
 */

((
 m = {
  '3': 'あ', 'e': 'い', '4': 'う', '5': 'え', '6': 'お',
  't': 'か', 'g': 'き', 'h': 'く', ':': 'け', 'b': 'こ',
  'x': 'さ', 'd': 'し', 'r': 'す', 'p': 'せ', 'c': 'そ',
  'q': 'た', 'a': 'ち', 'z': 'つ', 'w': 'て', 's': 'と',
  'u': 'な', 'i': 'に', '1': 'ぬ', ',': 'ね', 'k': 'の', 
  'f': 'は', 'v': 'ひ', '2': 'ふ', '^': 'へ', '-': 'ほ',
  'j': 'ま', 'n': 'み', ']': 'む', '/': 'め', 'm': 'も',
  '7': 'や', '8': 'ゆ', '9': 'よ', '0': 'わ', 'y': 'ん',
  'o': 'ら', 'l': 'り', '.': 'る', ';': 'れ', '\\': '(ろ|ー)',
  '@': '゙', '[': '゚',
  '#': 'ぁ', 'E': 'ぃ', '$': 'ぅ', '%': 'ぇ', '&amp;amp;': 'ぉ',
  'T': 'ゕ', 'G': 'き', 'H': 'く', '*': 'ゖ', 'B': 'こ',
  'X': 'さ', 'D': 'し', 'R': 'す', 'P': 'せ', 'C': 'そ',
  'Q': 'た', 'A': 'ち', 'Z': 'っ', 'W': 'て', 'S': 'と',
  'U': 'な', 'I': 'に', '!': 'ぬ', '&amp;lt;': '、', 'K': 'の',
  'F': 'ゎ', 'V': 'ゐ', '”': 'ふ', '~': 'ゑ', '=': 'ほ',
  'J': 'ま', 'N': 'み', '}': '」', '?': '・', 'M': 'も',
  '’': 'ゃ', '(': 'ゅ', ')': 'ょ', 'Y': 'ん',
  'O': 'ら', 'L': 'り', '&amp;gt;': '。', '+': 'れ', '_': 'ろ',
  '|': 'ー', '‘': '゙', '{': '「'
 },
 s = [...('' + getSelection()).trim().normalize('NFKC')]
) =&amp;gt; alert(s.map(c =&amp;gt; m[c] ? m[c] : c).join``))();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hLHUreDj79FO">
    <link>https://let.hatelabo.jp/pacochi/let/hLHUreDj79FO</link>
    <dc:date>2019-02-11T00:28:19Z</dc:date>
    <description>特定のワードに引っかかる人をまとめてリストに追加します。追加したいリストを開いて実行してください。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [?]ががっとリストに追加</title>
    <content:encoded>&lt;a href="javascript:void%28async%28s%3D%28_%3D%3Enew%20Promise%28%28r%3D%3EsetTimeout%28r%2C2e3%29%29%29%29%2Cm%3DJSON.parse%28document.querySelector%28%27%23initial-state%27%29.textContent%29.meta%2Cv%3D%27https%3A%2F%2F%27%2Blocation.host%2B%27%2Fapi%2Fv1%2F%27%2Cn%3D%28m%3Fv%2B%27accounts%2F%27%2Bm.me%2B%27%2Ffollowing%3Flimit%3D80%27%3A0%29%2Ca%3D%28m%3F%7Bheaders%3A%7BAuthorization%3A%27Bearer%20%27%2Bm.access_token%2CAccept%3A%27application%2Fjson%27%2C%27Content-Type%27%3A%27application%2Fjson%27%7D%7D%3A%7B%7D%29%2Ch%3Dlocation.href.match%28%2Fweb%5C%2Ftimelines%5C%2Flist%5C%2F%28%5Cd%2B%29%2F%29%2Ct%3D%28h%3Fv%2B%27lists%2F%27%2Bh%5B1%5D%2B%27%2Faccounts%27%3A0%29%2Cl%3D%5B%5D%2Cd%2Cp%3Dprompt%28%27%E6%A4%9C%E7%B4%A2%E8%AA%9E%27%2C%27%40mstdn.maud.io%27%29%29%3D%3E%7Bif%28%21t%29%7Balert%28%27%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%27%29%3Breturn%7Dd%3Dawait%20fetch%28t%2Ca%29.then%28%28r%3D%3Er.json%28%29%29%29%3Bwhile%28n%29%7Bawait%20fetch%28n%2Ca%29.then%28%28r%3D%3E%28n%3Dr.headers.has%28%27Link%27%29%26%26%28h%3Dr.headers.get%28%27Link%27%29.match%28%2F%3C%28.%2B%3F%29%3E%3B%20rel%3D%22next%22%2F%29%29%3Fh%5B1%5D%3A0%2Cr.json%28%29%29%29%29.then%28%28j%3D%3El%3Dl.concat%28j.filter%3Fj.filter%28%28i%3D%3EJSON.stringify%28i%29.includes%28p%29%26%26%21d.find%28%28k%3D%3Ek.id%3D%3Di.id%29%29%29%29%3A%5B%5D%29%29%29%3Bconsole.log%28l.length%2Cn%29%3Bawait%20s%28%29%7Dconsole.log%28l.map%28%28i%3D%3Ei.id%29%29%29%3Bawait%20fetch%28t%2CObject.assign%28a%2C%7Bmethod%3A%27POST%27%2Cbody%3AJSON.stringify%28%7Baccount_ids%3Al.map%28%28i%3D%3Ei.id%29%29%7D%29%7D%29%29.then%28%28r%3D%3Er.json%28%29%29%29.then%28console.log%29.catch%28console.error%29%7D%29%28%29%3B"&gt;[?]ががっとリストに追加&lt;/a&gt;&lt;pre&gt;/*
 * @title [?]ががっとリストに追加
 * @description 特定のワードに引っかかる人をまとめてリストに追加します。追加したいリストを開いて実行してください。
 * @include *
 * @license MIT License
 * @javascript_url
 */

// @include https://*/web/timelines/list/* くらい

void (async (
 s = _ =&amp;gt; new Promise(r =&amp;gt; setTimeout(r, 2000)),
 m = JSON.parse(document.querySelector('#initial-state').textContent).meta,
 v = 'https://' + location.host + '/api/v1/',
 n = m ? v + 'accounts/' + m.me + '/following?limit=80' : 0,
 a = m ? { headers: {
  Authorization: 'Bearer ' + m.access_token,
  Accept: 'application/json',
  'Content-Type': 'application/json'
 } } : {},
 h = location.href.match(/web\/timelines\/list\/(\d+)/),
 t = h ? v + 'lists/' + h[1] + '/accounts' : 0,
 l = [],
 d,
 p = prompt('検索語', '@mstdn.maud.io')
) =&amp;gt; {

	if (!t) {

		alert('リストを開いてください');
		return;

	}

	d = await fetch(t, a).then(r =&amp;gt; r.json());

	while (n) {

		await fetch(n, a).then(r =&amp;gt; ((
			n = (r.headers.has('Link') &amp;amp;&amp;amp; (h = r.headers.get('Link').match(/&amp;lt;(.+?)&amp;gt;; rel=&amp;quot;next&amp;quot;/))) ? h[1] : 0
		), r.json())).then(j =&amp;gt; (
			l = l.concat(j.filter ? j.filter(i =&amp;gt; (JSON.stringify(i).includes(p) &amp;amp;&amp;amp; !d.find(k =&amp;gt; k.id == i.id))) : [])
		));
		console.log(l.length, n);
		await s();

	}

	console.log(l.map(i =&amp;gt; i.id));

	await fetch(t, Object.assign(a, {
	 method: 'POST',
	 body: JSON.stringify({ account_ids: l.map(i =&amp;gt; i.id) })
	})).then(r =&amp;gt; r.json()).then(console.log).catch(console.error);

})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hLHWgtOs55Ec">
    <link>https://let.hatelabo.jp/pacochi/let/hLHWgtOs55Ec</link>
    <dc:date>2019-01-03T19:34:28Z</dc:date>
    <description>WebArchive⇔閲覧ページ間を行き来する。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] ◀️▶️WebArchive</title>
    <content:encoded>&lt;a href="javascript:%28p%3D%3Elocation%3Dp.includes%60.archive.org%2Fweb%2F%60%3Fp.split%60%2F%60.slice%285%29.join%60%2F%60%3A%27https%3A%2F%2Fwayback.archive.org%2Fweb%2F19960101000000%2F%27%2Bp%29%28location.href%29%3B"&gt;◀️▶️WebArchive&lt;/a&gt;&lt;pre&gt;/*
 * @title ◀️▶️WebArchive
 * @description WebArchive⇔閲覧ページ間を行き来する。
 * @include http://*
 * @include https://*
 * @contributor Nos       http://d.hatena.ne.jp/Nos/20091028/1256679357
 * @contributor noromanba http://let.hatelabo.jp/noromanba/let/gYC-yJTC5uCvSg
 * @contributor taizooo   http://let.hatelabo.jp/taizooo/let/hJmdhMKzsYUB
 * @license MIT License
 * @javascript_url
 */

// &amp;quot;19960101000000&amp;quot; is dummy date
(p =&amp;gt; 
location = p.includes`.archive.org/web/`
 ? p.split`/`.slice(5).join`/`
 : 'https://wayback.archive.org/web/19960101000000/' + p
)(location.href)
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hJmd5fvw-PA4">
    <link>https://let.hatelabo.jp/pacochi/let/hJmd5fvw-PA4</link>
    <dc:date>2018-11-20T06:15:29Z</dc:date>
    <description>他の人に伝える用のアカウント表記を出します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [?]自分のアカウント</title>
    <content:encoded>&lt;a href="javascript:void%28j%3D%3Eprompt%28%27your%20account%27%2Cj.accounts%5Bj.meta.me%5D.url.split%28%27%2F%27%29.reverse%28%29.slice%280%2C2%29.join%28%27%40%27%29%29%29%28JSON.parse%28document.querySelector%28%27%23initial-state%27%29.textContent%29%29%3B"&gt;[?]自分のアカウント&lt;/a&gt;&lt;pre&gt;// @title [?]自分のアカウント
// @description 他の人に伝える用のアカウント表記を出します。
// @include https://*/web/*
// @license MIT License
// @javascript_url

void (j =&amp;gt; prompt('your account', j.accounts[j.meta.me].url.split('/').reverse().slice(0, 2).join('@')))(JSON.parse(document.querySelector('#initial-state').textContent));
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hJmd06zY5b5M">
    <link>https://let.hatelabo.jp/pacochi/let/hJmd06zY5b5M</link>
    <dc:date>2018-10-22T08:15:24Z</dc:date>
    <description>自分がインスタンスに登録した日時を表示します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [?]自分の登録日時</title>
    <content:encoded>&lt;a href="javascript:%28j%3D%3Ealert%28new%20Date%28j.accounts%5Bj.meta.me%5D.created_at%29.toLocaleString%28%29%29%29%28JSON.parse%28document.querySelector%28%27%23initial-state%27%29.textContent%29%29%3B"&gt;[?]自分の登録日時&lt;/a&gt;&lt;pre&gt;// @title [?]自分の登録日時
// @description 自分がインスタンスに登録した日時を表示します。
// @include https://*/web/*
// @license MIT License
// @javascript_url

(j =&amp;gt; alert(new Date(j.accounts[j.meta.me].created_at).toLocaleString()))(JSON.parse(document.querySelector('#initial-state').textContent));&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hJmf7p7Q4agq">
    <link>https://let.hatelabo.jp/pacochi/let/hJmf7p7Q4agq</link>
    <dc:date>2018-09-18T14:25:06Z</dc:date>
    <description>カスタム絵文字の後ろについているスペースをゼロ幅スペースに変換します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [?]絵文字の隙間詰め</title>
    <content:encoded>&lt;a href="javascript:%28%28t%3Ddocument.querySelector%28%27.compose-form%20textarea%27%29%2Cb%3D%28s%3D%3Es.replace%28%2F%5B%5E%5Cr%5Cn%5D%2Fg%2C%27%27%29%29%29%3D%3E%7Bif%28t%29%7BObject.getOwnPropertyDescriptor%28Object.getPrototypeOf%28t%29%2C%27value%27%29.set.call%28t%2Ct.value.replace%28%2F%28%5Cs%2A%29%28%3A%5B-%5Cw%5D%2B%3A%29%28%5Cs%2A%29%2Fg%2C%28%28_%2Cp%2Cc%2Cs%29%3D%3E%60%24%7Bb%28p%29%7D%E2%80%8B%24%7Bc%7D%E2%80%8B%24%7Bb%28s%29%7D%60%29%29.replace%28%2F%5Cu200b%2B%2Fg%2C%27%E2%80%8B%27%29%29%3Bt.dispatchEvent%28new%20Event%28%27input%27%2C%7Bbubbles%3Atrue%7D%29%29%7D%7D%29%28%29%3B"&gt;[?]絵文字の隙間詰め&lt;/a&gt;&lt;pre&gt;// @title [?]絵文字の隙間詰め
// @description カスタム絵文字の後ろについているスペースをゼロ幅スペースに変換します。
// @include https://*/web/*
// @license MIT License
// @javascript_url

((
 t = document.querySelector('.compose-form textarea'),
 b = s =&amp;gt; s.replace(/[^\r\n]/g, '')
) =&amp;gt; { if (t) {

	// https://github.com/vitalyq/react-trigger-change/blob/v1.0.2/lib/change.js#L135-L140
	// が動かなくなったから
	// https://github.com/facebook/react/issues/11095
	// にした
	Object.getOwnPropertyDescriptor(Object.getPrototypeOf(t), 'value').set
	 .call(t, t.value
	  .replace(/(\s*)(:[-\w]+:)(\s*)/g, (_, p, c, s) =&amp;gt; `${b(p)}\u200b${c}\u200b${b(s)}`)
	  .replace(/\u200b+/g, '\u200b'));
	t.dispatchEvent(new Event('input', { bubbles: true }));

}})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hJmc-bbGmZpw">
    <link>https://let.hatelabo.jp/pacochi/let/hJmc-bbGmZpw</link>
    <dc:date>2018-06-07T01:53:57Z</dc:date>
    <description>カードの祖先一覧を表示します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [Crypko]祖先辿り</title>
    <content:encoded>&lt;a href="javascript:void%28async%28w%3D512%2Cm%3Dw%3E%3E3%2Cs%3D%27https%3A%2F%2Fapi.crypko.ai%2Fcrypkos%2F%27%2CD%3Ddocument%2C%24%3D%28q%3D%3ED.querySelector%28q%29%29%2CE%3D%28%28n%2Ca%3D%7B%7D%2Cc%3D%5B%5D%2Co%3DObject.assign%28D.createElement%28n%29%2Ca%29%29%3D%3E%28c.forEach%28%28e%3D%3Eo.appendChild%28e%29%29%29%2Co%29%29%2CI%3D%28async%28n%2Ca%29%3D%3Eawait%20crypto.subtle.digest%28%7Bname%3A%27SHA-1%27%7D%2C%28new%20TextEncoder%29.encode%28%60%24%7Bn%7Dasdasd3edwasd%24%7Ba%7D%60%29%29.then%28%28h%3D%3EArray.from%28new%20Uint8Array%28h%29%2C%28c%3D%3Ec.toString%2816%29.padStart%282%2C0%29%29%29.join%28%27%27%29%29%29%29%2Cu%3D%28location.hash.match%28%2Fcard%5C%2F%28%5Cd%2B%29%28%5C%2Ffuse%7C%24%29%2F%29%7C%7C%5B%5D%29.slice%281%29%2Cq%3D%7B%7D%29%3D%3Eu.forEach%28%28async%28d%2Cf%2Ca%2Ct%2Cg%2Ci%2Cl%2Cp%2Cn%29%3D%3E%7Bif%28f%29%7Bl%3Dawait%20fetch%28%60%24%7Bs%7D%24%7Bu%5B0%5D%7D%2FfusableCrypkos%3Fcategory%3Dall%26%24%7B%28%2F%5C%3F%28.%2B%29%24%2F.exec%28location.hash%29%7C%7C%5B%5D%29%5B1%5D%7C%7C%27sort%3D-id%27%7D%26ownerAddr%3D%60%2B%24%28%27a%5Bhref%5E%3D%22%23%2Fmarket%22%5D%27%29.href.split%28%27%253A%27%29.pop%28%29%29.then%28%28r%3D%3Er.json%28%29%29%29.catch%28console.error%29.then%28%28j%3D%3Ej.crypkos.map%28%28async%20c%3D%3EObject.assign%28c%2C%7Bimg%3Aawait%20I%28c.noise%2Cc.attrs%29%7D%29%29%29%29%29%3Bl%3DArray.isArray%28l%29%3Fawait%20Promise.all%28l%29%3A%5B%5D%3Bi%3D%28%2F%5C%2F%28%5Cw%2B%29_lg%2F.exec%28%28%24%28%27div.panel%3Anth-child%282%29%20img.progressive-image-main%27%29%7C%7C%7Bsrc%3A%27%27%7D%29.src%29%7C%7C%5B%5D%29%5B1%5D%3Bd%3Di%3F%28l.find%28%28c%3D%3Ei%3D%3Dc.img%29%29%7C%7C%7B%7D%29.id%3A0%7Dif%28%21d%29return%3Bt%3D%5B%5Bd%5D%5D%3B%24%28%27%23ancestors-css%27%29%7C%7CD.head.appendChild%28E%28%27style%27%2C%7Bid%3A%27ancestors-css%27%2CtextContent%3A%60%5Cn.ancestors%20%7B%20width%3A%20%24%7Bw%7Dpx%3B%20margin%3A%200%20auto%3B%20%7D%5Cn.ancestors%3Ediv%20%7B%20width%3A%20100%25%20%7D%5Cn.ancestors%3Ediv%3Ediv%20%7B%20position%3A%20relative%3B%20display%3A%20inline-block%3B%20%7D%5Cn.ancestors%3Ediv%3Ediv%3Eimg%20%7B%20position%3A%20absolute%3B%20transition-duration%3A%200.5s%3B%20%7D%5Cn.ancestors%3Ediv%3Ediv%3Eimg%3Ahover%20%7B%20z-index%3A%2099%3B%20width%3A%20256px%3B%20%7D%5Cn.ancestors%3Ediv%3Alast-child%3Ediv%3Eimg%3Ahover%20%7B%20width%3A%20512px%3B%20%7D%5Cn.ancestors-m%20%7B%20left%3A%200px%3B%20%7D%5Cn.ancestors-s%20%7B%20right%3A%200px%3B%20%7D%5Cndiv%23main%3Ediv.info-card%20%7B%20max-width%3A%201024px%3B%20%7D%5Cndiv%23main%3Ediv%3Ediv.panel%20%7B%20overflow-x%3A%20hidden%3B%20%7D%5Cn%60%7D%29%29%3B%28a%5B1%5D%3F%24%28%60.panel%3Anth-child%28%24%7Bf%2B1%7D%29%3Ediv%60%29%3A%24%28%27.info-card%27%29%29.before%28E%28%27div%27%2C%7BclassName%3A%27ancestors%27%7D%2C%5Bn%3DE%28%27div%27%29%5D%29%29%3Bfor%28i%3D1%3Bi%3Cm%3Bi%2B%2B%29%7Bg%3Di.toString%282%29.length%3Bl%3Di-%281%3C%3Cg-1%29%3Bd%3Dt%5Bg-1%5D%5Bl%5D%3Bp%3D%5B0%2C0%5D%3Bif%28d%26%26%21q%5Bd%5D%29q%5Bd%5D%3Dawait%20fetch%28%60%24%7Bs%7D%24%7Bd%7D%2Fdetail%60%29.then%28%28r%3D%3Er.json%28%29%29%29.catch%28console.error%29.then%28%28async%20j%3D%3E%28n.textContent%3D%60%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E4%B8%AD%E2%80%A6%20%23%24%7Bj.id%7D%60%2Cj.img%3Dawait%20I%28j.noise%2Cj.attrs%29%2Cj%29%29%29%3Bif%28q%5Bd%5D%29p%3D%5Bq%5Bd%5D.matronId%2Cq%5Bd%5D.sireId%5D%3Bif%28%21t%5Bg%5D%29t%5Bg%5D%3D%5B%5D%3B%5Bt%5Bg%5D%5Bl%2A2%5D%2Ct%5Bg%5D%5Bl%2A2%2B1%5D%5D%3Dp%7Dt.filter%28%28b%3D%3Eb.some%28%28d%3D%3Ed%29%29%29%29.forEach%28%28b%3D%3En.before%28n%3DE%28%27div%27%2C%7B%7D%2Cb.map%28%28%28d%2Ci%2Ca%2Cl%3Da.length%2Cv%3Dw%2Fl%29%3D%3EE%28%27div%27%2C%7Bstyle%3A%60width%3A%20%24%7Bv%7Dpx%3B%20height%3A%20%24%7Bv%7Dpx%3B%60%7D%2Cq%5Bd%5D%3F%5BE%28%27img%27%2C%7Bsrc%3A%60https%3A%2F%2Fimg.crypko.ai%2Fdaisy%2F%24%7Bq%5Bd%5D.img%7D_lg.jpg%60%2Cwidth%3Av%2CclassName%3Ai%3Cl%2F2%3F%27ancestors-m%27%3A%27ancestors-s%27%2Ctitle%3A%60Iter%20%24%7Bq%5Bd%5D.iteration%7D%20%C2%B7%20%24%7Bq%5Bd%5D.name%3Fq%5Bd%5D.name%3A%27%27%7D%23%24%7Bq%5Bd%5D.id%7D%60%2Conclick%3Ae%3D%3Ewindow.open%28%27%2F%23%2Fcard%2F%27%2Be.target.title.split%28%27%23%27%29.pop%28%29%2C%27_blank%27%29%7D%29%5D%3A%5B%5D%29%29%29%29%29%29%29%3Bn.parentNode.lastChild.remove%28%29%7D%29%29%29%28%29%3B"&gt;[Crypko]祖先辿り&lt;/a&gt;&lt;pre&gt;/*
 * @title [Crypko]祖先辿り
 * @description カードの祖先一覧を表示します。
 * @include https://crypko.ai/#/card/*
 * @license MIT License
 * @javascript_url
 */

void (async (
 w = 512,
 m = w &amp;gt;&amp;gt; 3, // w だけにするとめいっぱい（9世代前まで）読み込む
 s = 'https://api.crypko.ai/crypkos/',
 D = document,
 $ = q =&amp;gt; D.querySelector(q),
 E = (n, a = {}, c = [], o = Object.assign(D.createElement(n), a)) =&amp;gt; (
   c.forEach(e =&amp;gt; o.appendChild(e)), o
  ),
 // 参考: https://github.com/yuntan/crypkograph/blob/514e71daa5839a4a8f7e2f0c53750843c5d9225a/crypkograph.py#L70
 I = async (n, a) =&amp;gt; await crypto.subtle.digest({ name: 'SHA-1' }, 
   //Uint8Array.from([...`${n}asdasd3edwasd${a}`], c =&amp;gt; c.charCodeAt())
   (new TextEncoder).encode(`${n}asdasd3edwasd${a}`)
  ).then(
   h =&amp;gt; Array.from(new Uint8Array(h), c =&amp;gt; c.toString(16).padStart(2, 0)).join('')
  ),
 u = (location.hash.match(/card\/(\d+)(\/fuse|$)/) || []).slice(1),
 q = {}
) =&amp;gt; u.forEach(async (d, f, a, t, g, i, l, p, n) =&amp;gt; {

	if (f) {

		l = await fetch(
		 `${s}${u[0]}/fusableCrypkos?category=all&amp;amp;${(/\?(.+)$/.exec(location.hash) || [])[1] || 'sort=-id'}&amp;amp;ownerAddr=`
		 + $('a[href^=&amp;quot;#/market&amp;quot;]').href.split('%3A').pop()
		).then(r =&amp;gt; r.json()).catch(console.error).then(j =&amp;gt; j.crypkos.map(async c =&amp;gt; Object.assign(c, { img: await I(c.noise, c.attrs) })));
		l = Array.isArray(l) ? await Promise.all(l) : [];
		i = (/\/(\w+)_lg/.exec(($('div.panel:nth-child(2) img.progressive-image-main') || { src: '' }).src) || [])[1];
		d = i ? (l.find(c =&amp;gt; i == c.img) || {}).id : 0;

	}

	if (!d) return;

	t = [[d]];
	$('#ancestors-css') || D.head.appendChild(E('style', { id: 'ancestors-css', textContent: `
.ancestors { width: ${w}px; margin: 0 auto; }
.ancestors&amp;gt;div { width: 100% }
.ancestors&amp;gt;div&amp;gt;div { position: relative; display: inline-block; }
.ancestors&amp;gt;div&amp;gt;div&amp;gt;img { position: absolute; transition-duration: 0.5s; }
.ancestors&amp;gt;div&amp;gt;div&amp;gt;img:hover { z-index: 99; width: 256px; }
.ancestors&amp;gt;div:last-child&amp;gt;div&amp;gt;img:hover { width: 512px; }
.ancestors-m { left: 0px; }
.ancestors-s { right: 0px; }
div#main&amp;gt;div.info-card { max-width: 1024px; }
div#main&amp;gt;div&amp;gt;div.panel { overflow-x: hidden; }
` }));

	(a[1] ? $(`.panel:nth-child(${f + 1})&amp;gt;div`) : $('.info-card'))
	 .before(E('div', { className: 'ancestors' }, [n = E('div')]));

	for (i = 1; i &amp;lt; m ; i++) {

		g = i.toString(2).length;
		l = i - (1 &amp;lt;&amp;lt; g - 1);
		d = t[g - 1][l];
		p = [0, 0];

		if (d &amp;amp;&amp;amp; !q[d])
		 q[d] = await fetch(`${s}${d}/detail`)
		  .then(r =&amp;gt; r.json()).catch(console.error)
		  .then(async j =&amp;gt; (
		   n.textContent = `読み込み中… #${j.id}`,
		   j.img = await I(j.noise, j.attrs),
		   j
		  ));

		if (q[d]) p = [q[d].matronId, q[d].sireId];

		if (!t[g]) t[g] = [];
		[t[g][l * 2], t[g][l * 2 + 1]] = p;

	}

	t.filter(b =&amp;gt; b.some(d =&amp;gt; d)).forEach(b =&amp;gt; n.before(n = 
	 E('div', {},
	  b.map((d, i, a, l = a.length, v = w / l) =&amp;gt; E('div', { style: `width: ${v}px; height: ${v}px;` },
	   (q[d] ? [E('img', {
	    src: `https:\u002F\u002Fimg.crypko.ai/daisy/${q[d].img}_lg.jpg`,
	    width: v,
	    className: (i &amp;lt; l / 2) ? 'ancestors-m' : 'ancestors-s',
	    title: `Iter ${q[d].iteration} · ${q[d].name ? q[d].name : ''}#${q[d].id}`,
	    onclick: e =&amp;gt; window.open('/#/card/' + e.target.title.split('#').pop(), '_blank')
	   })] : [])
	  ))
	 )
	));

	n.parentNode.lastChild.remove();

}))();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hLHU-OKalakZ">
    <link>https://let.hatelabo.jp/pacochi/let/hLHU-OKalakZ</link>
    <dc:date>2018-06-05T11:56:47Z</dc:date>
    <description>取引の画面でカードの URL を抽出して、名前のあるカードへのリンクを生成します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] Crypko の放った子メモ用</title>
    <content:encoded>&lt;a href="javascript:void%20Promise.all%28%5B...document.querySelectorAll%28%27a%5Bhref%2A%3D%22card%22%5D%27%29%5D.filter%28%28n%3D%3E%2F%E6%89%8B%E3%81%AB%E5%85%A5%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%7C%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%2F.test%28n.nextSibling.nodeValue%29%29%29.map%28%28n%3D%3Efetch%28n.href.replace%28%2F%5E.%2A%5C%2F%28%5Cd%2B%29%24%2F%2C%27https%3A%2F%2Fapi.crypko.ai%2Fcrypkos%2F%241%2Fdetail%27%29%29.then%28%28r%3D%3Er.json%28%29%29%29%29%29%29.then%28%28j%3D%3Econsole.log%28j.reverse%28%29.filter%28%28j%3D%3Ej.name%29%29.map%28%28j%3D%3E%60https%3A%2F%2Fs.crypko.ai%2Fc%2F%24%7Bj.id%7D%23_%24%7Bj.name%7D__%24%7Bj.bio%7D%60.replace%28%2F%5Cs%2Fg%2C%27_%27%29%29%29.join%28%27%5Cn%27%29%29%29%29%3B"&gt;Crypko の放った子メモ用&lt;/a&gt;&lt;pre&gt;/*
 * @title Crypko の放った子メモ用
 * @description 取引の画面でカードの URL を抽出して、名前のあるカードへのリンクを生成します。
 * @include https://crypko.ai/#/transaction
 * @license MIT License
 * @javascript_url
 */

void Promise.all(
 [...document.querySelectorAll('a[href*=&amp;quot;card&amp;quot;]')]
  .filter(n =&amp;gt; /手に入れました|受け取りました/.test(n.nextSibling.nodeValue))
  .map(n =&amp;gt; fetch(n.href.replace(/^.*\/(\d+)$/, 'https://api.crypko.ai/crypkos/$1/detail'))
   .then(r =&amp;gt; r.json()))
).then(j =&amp;gt; console.log(
 j.reverse().filter(j =&amp;gt; j.name)
  .map(j =&amp;gt; `https:\u002F\u002Fs.crypko.ai/c/${j.id}#_${j.name}__${j.bio}`.replace(/\s/g, '_'))
  .join('\n')
));&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hJmc3OPAv48G">
    <link>https://let.hatelabo.jp/pacochi/let/hJmc3OPAv48G</link>
    <dc:date>2018-04-21T03:20:56Z</dc:date>
    <description>Quantum になってから表示されなくなった Hatena::Let の favicon を復活させます。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] よみがえれ favicon</title>
    <content:encoded>&lt;a href="javascript:%28%28o%3Ddocument.querySelector%28%27link%5Brel%3D%22shortcut%20icon%22%5D%27%29%2Cn%3Do.cloneNode%28%29%29%3D%3E%7Bn.type%3D%27image%2Fpng%27%3Bo.remove%28%29%3Bdocument.head.appendChild%28n%29%7D%29%28%29%3B"&gt;よみがえれ favicon&lt;/a&gt;&lt;pre&gt;/*
 * @title よみがえれ favicon
 * @description Quantum になってから表示されなくなった Hatena::Let の favicon を復活させます。
 * @include http://let.hatelabo.jp/*
 * @license MIT License
 * @javascript_url
 */

// 参考 : http://q.hatena.ne.jp/1511434522
((
 o = document.querySelector('link[rel=&amp;quot;shortcut icon&amp;quot;]'),
 n = o.cloneNode()
) =&amp;gt; {

	n.type = 'image/png';
	o.remove();
	document.head.appendChild(n);

})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hJme_JyaqvZC">
    <link>https://let.hatelabo.jp/pacochi/let/hJme_JyaqvZC</link>
    <dc:date>2018-03-30T15:02:16Z</dc:date>
    <description>トゥートの個別ページでいいね・ブーストした人のアイコンを表示します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [mastodon]いいねブーストした人を可視化</title>
    <content:encoded>&lt;a href="javascript:%28%28d%3Ddocument%2Cl%2Cu%2Cf%29%3D%3E%7Bl%3D%5B...d.querySelectorAll%28%27a.detailed-status__datetime%2C%20.detailed-status__meta%3Espan%27%29%5D%3Bif%28l.length%21%3D3%29return%3Bu%3Dl.shift%28%29.href.match%28%2F%5E%28.%2B%3F%5C%2F%29%40.%2B%3F%28%5C%2F%5Cd%2B%29%2F%29%3Bif%28%21u%29return%3Bf%3D%28n%2Ct%2Cc%2Cs%3Du%5B1%5D%2B%27api%2Fv1%2Fstatuses%27%2Bu%5B2%5D%2Bt%2B%28c%3E40%3F%27%3Flimit%3D80%27%3A%27%27%29%29%3D%3Ec%3E0%26%26fetch%28s%29.then%28%28%28r%2Ch%29%3D%3E%28r.headers.has%28%27Link%27%29%26%26%28h%3Dr.headers.get%28%27Link%27%29.match%28%2F%3C%28.%2B%3F%29%3E%3B%20rel%3D%22next%22%2F%29%29%26%26f%28n%2Ct%2Cc%2Ch%5B1%5D%29%2Cr.json%28%29%29%29%29.then%28%28j%3D%3E%28j.forEach%3Fj%3A%5B%5D%29.forEach%28%28a%3D%3En.appendChild%28Object.assign%28d.createElement%28%27a%27%29%2C%7Bhref%3Aa.url%2Ctitle%3Aa.display_name%7D%29%29.appendChild%28Object.assign%28d.createElement%28%27img%27%29%2C%7Bsrc%3Aa.avatar%2Cstyle%3A%27width%3A%2020px%3B%20height%3A%2020px%3B%20margin%3A%200%202px%3B%27%7D%29%29%29%29%29%29%3Bl.forEach%28%28%28n%2Ci%29%3D%3Ef%28n%2C%5B%27%2Freblogged_by%27%2C%27%2Ffavourited_by%27%5D%5Bi%5D%2Cn.textContent%29%29%29%7D%29%28%29%3B"&gt;[mastodon]いいねブーストした人を可視化&lt;/a&gt;&lt;pre&gt;// @title [mastodon]いいねブーストした人を可視化
// @description トゥートの個別ページでいいね・ブーストした人のアイコンを表示します。
// @include https://*/users/*/updates/*
// @include https://*/users/*/statuses/*
// @include https://*/@*/*
// @license MIT License
// @javascript_url

// https://gist.github.com/pacochi/d466d481fa9aa982c2f206815765fd53 に移したよ、そっちは Pawoo Music にも対応してるよ

((d = document, l, u, f) =&amp;gt; {

	l = [...d.querySelectorAll('a.detailed-status__datetime, .detailed-status__meta&amp;gt;span')];
	if (l.length != 3) return;
	u = l.shift().href.match(/^(.+?\/)@.+?(\/\d+)/);
	if (!u) return;
	/*
	https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#statuses
	&amp;lt;https://pawoo.net/api/v1/statuses/1271694/favourited_by?max_id=910177&amp;gt;; rel=&amp;quot;next&amp;quot;, &amp;lt;https://pawoo.net/api/v1/statuses/1271694/favourited_by?since_id=1646996&amp;gt;; rel=&amp;quot;prev&amp;quot;
	知らない形式の文字列が HTTP Header の Link についてた
	*/
	f = (n, t, c, s = u[1] + 'api/v1/statuses' + u[2] + t + (c &amp;gt; 40 ? '?limit=80' : '')) =&amp;gt; (
		c &amp;gt; 0 &amp;amp;&amp;amp; fetch(s).then((r, h) =&amp;gt; ((
			r.headers.has('Link')
			 &amp;amp;&amp;amp; (h = r.headers.get('Link').match(/&amp;lt;(.+?)&amp;gt;; rel=&amp;quot;next&amp;quot;/))
			 &amp;amp;&amp;amp; f(n, t, c, h[1])
		), r.json())).then(j =&amp;gt; (j.forEach ? j : []).forEach(a =&amp;gt; 
			n.appendChild(Object.assign(d.createElement('a'), {
			 href: a.url, title: a.display_name
			}))
			.appendChild(Object.assign(d.createElement('img'), {
			 src: a.avatar, style: 'width: 20px; height: 20px; margin: 0 2px;'
			}))
		))
	);

	l.forEach((n, i) =&amp;gt; f(n, ['/reblogged_by', '/favourited_by'][i], n.textContent));

})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hLHUxPGtjesR">
    <link>https://let.hatelabo.jp/pacochi/let/hLHUxPGtjesR</link>
    <dc:date>2018-03-15T00:47:56Z</dc:date>
    <description>インスタンスのカスタム絵文字を雑に表示します。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [?]カスタム絵文字見せてください</title>
    <content:encoded>&lt;a href="javascript:void%20fetch%28%27%2Fapi%2Fv1%2Fcustom_emojis%27%29.then%28%28r%3D%3Er.json%28%29%29%29.then%28%28%28j%2Cd%3Ddocument%2Ct%3D%28%28n%2Ca%29%3D%3EObject.assign%28d.createElement%28n%29%2Ca%29%29%2Cp%3Dd.body.appendChild%28t%28%27div%27%2C%7Bstyle%3A%27all%3A%20initial%3B%20background%3A%20white%3B%20color%3A%20black%3B%20padding%3A%201em%3B%20position%3A%20fixed%3B%20top%3A%200%3B%20left%3A%200%3B%20z-index%3A%202147483646%3B%27%7D%29%29%29%3D%3E%28p.addEventListener%28%27dblclick%27%2C%28e%3D%3E%28d.body.removeChild%28e.target%29%2Ce.stopPropagation%28%29%29%29%2Cfalse%29%2Cj.forEach%28%28s%3D%3Ep.appendChild%28t%28%27img%27%2C%7Bsrc%3As.url%2Ctitle%3A%60%3A%24%7Bs.shortcode%7D%3A%60%2Cwidth%3A20%2Cheight%3A20%7D%29%29%29%29%29%29%29%3B"&gt;[?]カスタム絵文字見せてください&lt;/a&gt;&lt;pre&gt;/*
 * @title [?]カスタム絵文字見せてください
 * @description インスタンスのカスタム絵文字を雑に表示します。
 * @include *
 * @license MIT License
 * @javascript_url
 */

void fetch('/api/v1/custom_emojis').then(r =&amp;gt; r.json()).then((
 j,
 d = document,
 t = (n, a) =&amp;gt; Object.assign(d.createElement(n), a),
 p = d.body.appendChild(t('div', { style: 'all: initial; background: white; color: black; padding: 1em; position: fixed; top: 0; left: 0; z-index: 2147483646;' }))
) =&amp;gt; (
 p.addEventListener('dblclick', e =&amp;gt; (d.body.removeChild(e.target), e.stopPropagation()), false),
 j.forEach(s =&amp;gt; p.appendChild(t('img', { src: s.url, title: `:${s.shortcode}:`, width: 20, height: 20 })))
));&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/pacochi/let/hLHUsK-TwYJ_">
    <link>https://let.hatelabo.jp/pacochi/let/hLHUsK-TwYJ_</link>
    <dc:date>2018-02-11T03:43:08Z</dc:date>
    <description>マストドンの自分のログを 2000件ずつ JSON で保存します。/web/* で実行してください。</description>
    <dc:creator>pacochi</dc:creator>
    <title>[Let] [?]ログ全部保存</title>
    <content:encoded>&lt;a href="javascript:void%28async%28d%3Ddocument%2Cs%3D%28_%3D%3Enew%20Promise%28%28r%3D%3EsetTimeout%28r%2C2e3%29%29%29%29%2Cm%3DJSON.parse%28d.querySelector%28%27%23initial-state%27%29.textContent%29.meta%2Cn%3D%28m%3F%27https%3A%2F%2F%27%2Blocation.host%2B%27%2Fapi%2Fv1%2Faccounts%2F%27%2Bm.me%2B%27%2Fstatuses%3Flimit%3D40%27%3A0%29%2Ca%3D%28m%3F%7Bheaders%3A%7BAuthorization%3A%27Bearer%20%27%2Bm.access_token%7D%7D%3A%7B%7D%29%2Cl%3D%5B%5D%2Cq%3D0%2Cp%3Ddocument.body.appendChild%28Object.assign%28document.createElement%28%27p%27%29%2C%7Bstyle%3A%27position%3Aabsolute%3Bz-index%3A99999%3Btop%3A0px%3Bright%3A0px%3Bbackground%3Ablack%3B%27%7D%29%29%2Ch%29%3D%3E%7Bwhile%28n%29%7Bawait%20fetch%28n%2Ca%29.then%28%28r%3D%3E%28n%3Dr.headers.has%28%27Link%27%29%26%26%28h%3Dr.headers.get%28%27Link%27%29.match%28%2F%3C%28.%2B%3F%29%3E%3B%20rel%3D%22next%22%2F%29%29%3Fh%5B1%5D%3A0%2Cr.json%28%29%29%29%29.then%28%28j%3D%3El%3Dl.concat%28j.map%3Fj.map%28%28i%3D%3E%28delete%20i.account%2Ci%29%29%29%3A%5B%5D%29%29%29%3Bconsole.log%28q%2Bl.length%2Cn%29%3Bif%28l.length%3E%3D2e3%7C%7C%21n%29%7Bq%2B%3Dl.length%3Bp.appendChild%28Object.assign%28document.createElement%28%27a%27%29%2C%7Bhref%3AURL.createObjectURL%28new%20Blob%28%5BJSON.stringify%28l%29%5D%2C%7Btype%3A%27application%2Foctet-stream%27%7D%29%29%2Cdownload%3Aq%2B%27.json%27%2CinnerText%3A%27%5B%27%2Bq%2B%27%5D%27%2Cstyle%3A%27display%3Ablock%3B%27%7D%29%29%3Bl%3D%5B%5D%7Dawait%20s%28%29%7D%7D%29%28%29%3B"&gt;[?]ログ全部保存&lt;/a&gt;&lt;pre&gt;/*
 * @title [?]ログ全部保存
 * @description マストドンの自分のログを 2000件ずつ JSON で保存します。/web/* で実行してください。
 * @include *
 * @license MIT License
 * @javascript_url
 */
 
// @include https://*/web/* だけどユーザスクリプトとして実行するようなやつでもないのでそのまま

void (async (
 d = document,
 // 40件ごとに二秒挟んでる
 s = _ =&amp;gt; new Promise(r =&amp;gt; setTimeout(r, 2000)),
 m = JSON.parse(d.querySelector('#initial-state').textContent).meta,
 n = m ? 'https://' + location.host + '/api/v1/accounts/' + m.me + '/statuses?limit=40' : 0,
 // アクセストークン要らなかったかも、為念で
 a = m ? { headers: { Authorization: 'Bearer ' + m.access_token } } : {},
/*
 u = location.href.match(/^(.+\/)web(\/accounts\/\d+)/),
 n = u ? (u[1] + 'api/v1' + u[2] + '/statuses?limit=40') : 0,
 t = JSON.parse(d.querySelector('#initial-state').textContent).meta.access_token,
 a = t ? { headers: { Authorization: 'Bearer ' + t } } : {},
*/
 l = [],
 q = 0,
 p = document.body.appendChild(Object.assign(document.createElement('p'), { style: 'position:absolute;z-index:99999;top:0px;right:0px;background:black;' })),
 h
) =&amp;gt; {

	while (n) {

		await fetch(n, a).then(r =&amp;gt; ((
			n = (r.headers.has('Link') &amp;amp;&amp;amp; (h = r.headers.get('Link').match(/&amp;lt;(.+?)&amp;gt;; rel=&amp;quot;next&amp;quot;/))) ? h[1] : 0
		), r.json())).then(j =&amp;gt; (
			// 自分のアカウントデータ削ってる
			l = l.concat(j.map ? j.map(i =&amp;gt; (delete i.account, i)) : [])
		));
		console.log(q + l.length, n);
		
		if (l.length &amp;gt;= 2000 || !n) {
		
			q += l.length;
			p.appendChild(Object.assign(document.createElement('a'), {
			href: URL.createObjectURL(new Blob([JSON.stringify(l)], { type: 'application/octet-stream' })),
			download: q + '.json',
			innerText: '[' + q + ']',
			style: 'display:block;'
			}));
			l = [];
		
		}
		
		await s();

	}

})();&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
