<?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/noromanba/rss">
    <link>https://let.hatelabo.jp/noromanba/rss</link>
    <description></description>
    <title>Bookmarklets from noromanba</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hJmc_cKWip10"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/i-f4kMzsgqAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHX646VrMBt"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/g5G3l8aJuP1N"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHU7oetyNxA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHWz_aloPlP"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHWvJPtt9Vq"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHWvJWA_edO"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hJmevJPo3aEL"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHX5-ST-aMn"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHVrZ3Vzbsd"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHVpJDbvfN8"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHVndnBiMBw"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHVnvrnxfEx"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hJmdmMS2rstJ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHVmL_RgoIK"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHVmL_ErMVx"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHVltCFk5dw"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/noromanba/let/hLHVls_T_OYQ"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hJmc_cKWip10">
    <link>https://let.hatelabo.jp/noromanba/let/hJmc_cKWip10</link>
    <dc:date>2022-01-02T15:53:12Z</dc:date>
    <description>Hatena::Let template strings crash PoC</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] [FIXED] `` bomb PoC</title>
    <content:encoded>&lt;a href="javascript:try%7B%60%2F%2F%60%7Dcatch%28e%29%7Bwindow.alert%28e%29%7D"&gt;[FIXED] `` bomb PoC&lt;/a&gt;&lt;pre&gt;/*
 * @title [FIXED] `` bomb PoC
 * @description Hatena::Let template strings crash PoC
 * @include https://let.hatelabo.jp/*
 * @license CC0 Univ PD https://creativecommons.org/publicdomain/zero/1.0/
 * @javascript_url
 */

// FIXED below
// FIXME packer can not handle &amp;quot;//&amp;quot; within ``
try { `//`; } catch (e) { window.alert(e); }
// console -&amp;gt; pass, bookmarklet -&amp;gt; error
// actual code
//
//      try {`
//
// so uncatchable

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/i-f4kMzsgqAA">
    <link>https://let.hatelabo.jp/noromanba/let/i-f4kMzsgqAA</link>
    <dc:date>2021-06-06T22:42:58Z</dc:date>
    <description>open chatting window/tab</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] ytchat</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20url%3Dnew%20URL%28location.href%29%3Bconst%20id%3Durl.searchParams.get%28%27v%27%29%7C%7Curl.pathname.split%28%27%2F%27%29.filter%28%28s%3D%3E%21%21s%29%29.pop%28%29%3Bif%28%21id%29return%3Bconst%20chat%3D%60https%3A%2F%2Fwww.youtube.com%2Flive_chat%3Fis_popout%3D1%26v%3D%24%7Bid%7D%60%3Bwindow.open%28chat%29%7D%29%28%29%3B"&gt;ytchat&lt;/a&gt;&lt;pre&gt;/*
 * @title ytchat
 * @description open chatting window/tab 
 * @include https://www.youtube.com/*
 * @include https://m.youtube.com/*
 * @include https://www.youtube-nocookie.com/*
 * @license MIT License https://opensource.org/licenses/MIT
 * @author  noromanba   https://noromanba.github.io
 * @javascript_url
 */

// e.g.
// https://m.youtube.com/playlist?list=PLU12uITxBEPH-v3cHoNvURjai8QqZqcxh
// https://m.youtube.com/playlist?list=PLU12uITxBEPHOJO1FU8qll6gQmKcXp5S7

(() =&amp;gt; {
  'use strict';

  const url = new URL(location.href);

  // TBD optional chaning
  const id = url.searchParams.get('v') || 
    // /embed/VIDEO_ID/
    url.pathname.split('/').filter(s =&amp;gt; !!s).pop();
  if (!id) return;

  const chat = `https://www.youtube.com/live_chat?is_popout=1&amp;amp;v=${id}`;
  window.open(chat);
})();

/* from *dumb* phone */

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHX646VrMBt">
    <link>https://let.hatelabo.jp/noromanba/let/hLHX646VrMBt</link>
    <dc:date>2019-12-30T22:17:27Z</dc:date>
    <description>links to downloadable; e.g. txt/html</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] +DL</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3B%5B...document.querySelectorAll%28%5B%27a%5Bhref%5D%3Anot%28%5Bdownload%5D%29%27%5D%29%5D.forEach%28%28link%3D%3E%7Blink.download%3Dlink.href.split%28%27%2F%27%29.pop%28%29%7C%7Clink.alt%7C%7Clink.name%7C%7Clink.textContent%7D%29%29%7D%29%28%29%3B"&gt;+DL&lt;/a&gt;&lt;pre&gt;/*
 * @title +DL
 * @description links to downloadable; e.g. txt/html
 * @include http://*
 * @include https://*
 * @license MIT License https://opensource.org/licenses/MIT
 * @author  noromanba   https://noromanba.github.com
 * @javascript_url
 */

// e.g.
// https://hatena.g.hatena.ne.jp/hatenagroup/20191115/1573811864
//  http://g.hatena.ne.jp/help#exportdiary
//  https://&amp;lt;GROUP_NAME&amp;gt;.g.hatena.ne.jp/&amp;lt;HATENA_ID&amp;gt;/configdetail
//   https://&amp;lt;GROUP_NAME&amp;gt;.g.hatena.ne.jp/&amp;lt;HATENA_ID&amp;gt;/export

(() =&amp;gt; {
  'use strict';

  [...document.querySelectorAll([
    'a[href]:not([download])',
  ])].forEach(link =&amp;gt; {
    link.download = 
      link.href.split('/').pop() ||
      link.alt ||
      link.name ||
      link.textContent;
  });
})();

/* from *dumb* phone */

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/g5G3l8aJuP1N">
    <link>https://let.hatelabo.jp/noromanba/let/g5G3l8aJuP1N</link>
    <dc:date>2019-08-23T02:49:41Z</dc:date>
    <description>flip mirror-reversed images; e.g. selfie</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] mirror</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bdocument.body.appendChild%28Object.assign%28document.createElement%28%27style%27%29%2C%7BtextContent%3A%60%5Cn%20%20%20%20%20%20img%20%7B%5Cn%20%20%20%20%20%20%20%20transform%3A%20scaleX%28-1%29%3B%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%60%7D%29%29%7D%29%28%29%3B"&gt;mirror&lt;/a&gt;&lt;pre&gt;/*
 * @title mirror
 * @description flip mirror-reversed images; e.g. selfie
 * @include http://*
 * @include https://*
 * @license MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

(() =&amp;gt; {
  'use strict';

  document.body.appendChild(Object.assign(document.createElement('style'), {
    // TBD toggle
    textContent: `
      img {
        transform: scaleX(-1);
      }
    `,
  }));
})();

/* from *dumb* phone */

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHU7oetyNxA">
    <link>https://let.hatelabo.jp/noromanba/let/hLHU7oetyNxA</link>
    <dc:date>2019-05-28T23:11:58Z</dc:date>
    <description>hidden user comments on instagram.com</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] IG denoiser</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bif%28%21location.hostname.endsWith%28%27.instagram.com%27%29%29%7Breturn%7Dconst%20wall%3Ddocument.head%7C%7Cdocument.body%7C%7Cdocument.documentElement%3Bwall.append%28Object.assign%28document.createElement%28%27style%27%29%2C%7Bcharset%3A%27utf-8%27%2CtextContent%3A%60%5Cn%20%20%20%20%20%20%20%20%20%20%20%20article%20ul%20ul%3Anot%28%3Afirst-child%29%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%2F%2A%20mobile%20%2A%2F%5Cn%20%20%20%20%20%20%20%20%20%20%20%20article%20ul%20li%5Brole%3D%22menuitem%22%5D%3Anot%28%3Afirst-child%29%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20none%3B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%60%7D%29%29%7D%29%28%29%3B"&gt;IG denoiser&lt;/a&gt;&lt;pre&gt;/*
 * @title IG denoiser
 * @description hidden user comments on instagram.com
 * @include https://www.instagram.com/*
 * @contributor noromanba    https://gist.github.com/noromanba/1f369b316c1b43bdf0e337c6c5af1c80
 * @license     MIT License  https://opensource.org/licenses/MIT
 * @javascript_url
 */

// UserScript
// https://gist.github.com/noromanba/1f369b316c1b43bdf0e337c6c5af1c80

/* filter; uBO et al.
www.instagram.com##article ul ul:not(:first-child)
! mobile
www.instagram.com##article ul li[role=&amp;quot;menuitem&amp;quot;]:not(:first-child)
*/

/* selector
article ul ul:not(:first-child)
article ul li[role=&amp;quot;menuitem&amp;quot;]:not(:first-child)
*/


// e.g.
// https://www.instagram.com/instagram/
//  https://www.instagram.com/p/Bi0bUMBDaZZ/?taken-by=instagram
// https://www.instagram.com/tofubeats/
//  https://www.instagram.com/p/BiTlSowHP2x/?taken-by=tofubeats
(() =&amp;gt; {
    'use strict';

    if (!location.hostname.endsWith('.instagram.com')) {
        return;
    }

    const wall = document.head || document.body || document.documentElement;

    wall.append(Object.assign(document.createElement('style'), {
        charset: 'utf-8',
        textContent: `
            article ul ul:not(:first-child),
            /* mobile */
            article ul li[role=&amp;quot;menuitem&amp;quot;]:not(:first-child)
                {
                    display: none;
                }
        `,
    }));
})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHWz_aloPlP">
    <link>https://let.hatelabo.jp/noromanba/let/hLHWz_aloPlP</link>
    <dc:date>2019-05-03T22:43:39Z</dc:date>
    <description>toggle the video Picture-in-Picture mode</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] PinP</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bif%28document.pictureInPictureElement%29%7Bdocument.exitPictureInPicture%28%29%3Breturn%7D%5B...document.body.querySelectorAll%28%5B%27video%27%5D%29%5D.some%28%28v%3D%3E%7Bif%28v.src%7C%7C%5B...v.querySelectorAll%28%5B%27source%27%5D%29%5D.some%28%28s%3D%3E%21%21s%26%26s.src%29%29%29%7Bv.requestPictureInPicture%28%29%7D%7D%29%29%7D%29%28%29%3B"&gt;PinP&lt;/a&gt;&lt;pre&gt;/*
 * @title PinP
 * @description toggle the video Picture-in-Picture mode
 * @include http://*
 * @include https://*
 * @contributor hogashi http://let.hatelabo.jp/hogashi/let/hJmexZGA67IB
 * @license MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

// e.g.
// https://vimeo.com/44039048
// http://www.htmq.com/html5/sample/004_1.html
//
// TBD shadow-root e.g.
// https://interactive-examples.mdn.mozilla.net/pages/tabbed/video.html
//  https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source
(() =&amp;gt; {
    'use strict';
    // c.f.
    // https://wicg.github.io/picture-in-picture/
    // https://github.com/WICG/picture-in-picture
    if (document.pictureInPictureElement) {
        document.exitPictureInPicture();
        return;
    }

    [...document.body.querySelectorAll([
        /*/
        'video[src]'
        // NIY :has() Selectors Level 4
        'video:has(&amp;gt; source)',
        /*/
        'video',
        //*/
    ])].some(v =&amp;gt; {
        if (v.src || [...v.querySelectorAll([
            'source',
        ])].some(s =&amp;gt; !!s &amp;amp;&amp;amp; s.src)) {
            v.requestPictureInPicture();
        }
    });
})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz">
    <link>https://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz</link>
    <dc:date>2019-04-09T17:34:30Z</dc:date>
    <description>restoring completed about 4-byte UTF-8 (e.g. Emoji) problems from 2019-03-01 16:42 until 2019-04-09 05:07 JST; https://labo.hatenastaff.com/entry/2019/04/09/151655</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] [DONE] do use Emoji within js</title>
    <content:encoded>&lt;a href="javascript:%27Status%20Updates%27%3B%60%5CnHatena%3A%5Cnrestoring%20completed%5Cnhttps%3A%2F%2Flabo.hatenastaff.com%2Fentry%2F2019%2F04%2F09%2F151655%5CnNote%3A%20%22utf8mb4%22%20handling%20on%20MySQL%5Cnhttps%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F8.0%2Fen%2Fcharset-unicode-sets.html%5Cn%20http%3A%2F%2Flet.hatelabo.jp%2Fonk%2Flet%2FhJmev9y2ouko%2Frev%2FhLHWv9y_xJoJ%5Cn----%5CnI%20replied%20CS%3A%5CnI%20suspect%20supported%20Unicode%20regression%2C%20both%20of%20Emoji%201.0%20but...%5CnNG%3A%20Unicode%206.0%20in%202010%5Cnhttps%3A%2F%2Femojipedia.org%2Fclapping-hands-sign%2F%20%28guess%29%5Cn%20http%3A%2F%2Flet.hatelabo.jp%2Fpacochi%2Flet%2FhJmevdzy3IIx%5Cnhttps%3A%2F%2Femojipedia.org%2Fjapanese-ogre%2F%5Cn%20http%3A%2F%2Flet.hatelabo.jp%2Fnoromanba%2Flet%2FhJmc9ZLviM12%5CnOK%3A%20Unicode%201.1%20in%201993%5Cnhttps%3A%2F%2Femojipedia.org%2Fblack-left-pointing-triangle%2F%5Cn%20http%3A%2F%2Flet.hatelabo.jp%2Fpacochi%2Flet%2FhLHWgtOs55Ec%5Cn----%5CnHatena%20CS%3A%20We%20are%20started%20to%20restoring%20immedeately%2C%20but%20no%20gurantee%20so%20its%20Hatelabo.%5Cn%20%20%20%20%20%20%20%20We%20are%20going%20to%20announcement%20incidents%20details%20after%20reserch%20completed.%5Cn----%5CnI%20had%20sent%20claim%3A%5Cnhttps%3A%2F%2Fwww.hatena.ne.jp%2Ffaq%2Fq%2Flet%5Cn%20https%3A%2F%2Fgist.github.com%2Fnoromanba%2F94b639fd92c31353ad66f4c6f56ef83e%5Cn%60%3Bvoid%200%3B"&gt;[DONE] do use Emoji within js&lt;/a&gt;&lt;pre&gt;/*
 * @title [DONE] do use Emoji within js
 * @description restoring completed about 4-byte UTF-8 (e.g. Emoji) problems from 2019-03-01 16:42 until 2019-04-09 05:07 JST; https://labo.hatenastaff.com/entry/2019/04/09/151655
 * @include http://*
 * @include https://*
 * @license CC0
 * @javascript_url
 */

'Status Updates';
`
Hatena:
restoring completed
https://labo.hatenastaff.com/entry/2019/04/09/151655
Note: &amp;quot;utf8mb4&amp;quot; handling on MySQL
https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
 http://let.hatelabo.jp/onk/let/hJmev9y2ouko/rev/hLHWv9y_xJoJ
----
I replied CS:
I suspect supported Unicode regression, both of Emoji 1.0 but...
NG: Unicode 6.0 in 2010
https://emojipedia.org/clapping-hands-sign/ (guess)
 http://let.hatelabo.jp/pacochi/let/hJmevdzy3IIx
https://emojipedia.org/japanese-ogre/
 http://let.hatelabo.jp/noromanba/let/hJmc9ZLviM12
OK: Unicode 1.1 in 1993
https://emojipedia.org/black-left-pointing-triangle/
 http://let.hatelabo.jp/pacochi/let/hLHWgtOs55Ec
----
Hatena CS: We are started to restoring immedeately, but no gurantee so its Hatelabo.
        We are going to announcement incidents details after reserch completed.
----
I had sent claim:
https://www.hatena.ne.jp/faq/q/let
 https://gist.github.com/noromanba/94b639fd92c31353ad66f4c6f56ef83e
`;
void 0;


// before restoring below:
//
// within &amp;lt;at&amp;gt;title e.g.
// http://let.hatelabo.jp/noromanba/let/hJmc9ZLviM12
//   &amp;lt;at&amp;gt;title over engineering sanitized(?)
//   // XXX workaround; codepoint Ogre/Oni Emoji
//  &amp;quot;U+1F479 dpz&amp;quot; -&amp;gt; &amp;quot;no title [bookmarklet]&amp;quot;
//  https://web.archive.org/web/20180607083503/http://let.hatelabo.jp/noromanba/let/hJmc9ZLviM12
// and Forked script can not trace Fork from, so nameless
//  http://let.hatelabo.jp/noromanba/let/hLHU9eKAqvUD
//
// break the Let, its insane

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHWvJPtt9Vq">
    <link>https://let.hatelabo.jp/noromanba/let/hLHWvJPtt9Vq</link>
    <dc:date>2019-04-09T15:26:23Z</dc:date>
    <description>Surrogates test via http://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] Reverse-Claymore, Tsuchiyoshi, Sikaru and Hokke Kanji</title>
    <content:encoded>&lt;a href="javascript:alert%60%3F%60%3Balert%60%3F%60%3Balert%60%3F%60%3Balert%60%3F%60%3B"&gt;Reverse-Claymore, Tsuchiyoshi, Sikaru and Hokke Kanji&lt;/a&gt;&lt;pre&gt;/*
 * @title Reverse-Claymore, Tsuchiyoshi, Sikaru and Hokke Kanji
 * @description Surrogates test via http://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz
 * @include http://*
 * @license CC0
 * @javascript_url
 */

// https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=20BA6
alert`?`
// https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=20BB7
alert`?`
// https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=20B9F
alert`?`
// https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=29E3D
alert`?`
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHWvJWA_edO">
    <link>https://let.hatelabo.jp/noromanba/let/hLHWvJWA_edO</link>
    <dc:date>2019-04-03T03:48:38Z</dc:date>
    <description>blank title let; assert "no title [bookmarklet]" via http://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] </title>
    <content:encoded>&lt;a href="javascript:"&gt;bookmarklet&lt;/a&gt;&lt;pre&gt;/*
 * @title 
 * @description blank title let; assert &amp;quot;no title [bookmarklet]&amp;quot; via http://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz
 * @include http://*
 * @license CC0
 * @javascript_url
 */


&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hJmevJPo3aEL">
    <link>https://let.hatelabo.jp/noromanba/let/hJmevJPo3aEL</link>
    <dc:date>2019-04-03T03:28:14Z</dc:date>
    <description>Surrogates test via http://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] Hokke</title>
    <content:encoded>&lt;a href="javascript:alert%60Hokke%60%3B"&gt;Hokke&lt;/a&gt;&lt;pre&gt;/*
 * @title Hokke
 * @description Surrogates test via http://let.hatelabo.jp/noromanba/let/hLHWu_uv_Ilz
 * @include http://*
 * @license CC0
 * @javascript_url
 */

alert`Hokke`&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHX5-ST-aMn">
    <link>https://let.hatelabo.jp/noromanba/let/hLHX5-ST-aMn</link>
    <dc:date>2018-12-07T00:22:19Z</dc:date>
    <description>prompt download-link of Chrome Extension aka crx on Chrome Web Store</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] crx DL link</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20extid%3Dlocation.pathname.split%28%27%2F%27%29.filter%28%28s%3D%3E%21%21s%29%29.pop%28%29%3Bconst%20link%3Dnew%20URL%28%27https%3A%2F%2Fclients2.google.com%2Fservice%2Fupdate2%2Fcrx%27%29%3Blink.searchParams.set%28%27response%27%2C%27redirect%27%29%3Blink.searchParams.set%28%27x%27%2C%27id%3D%27%2Bextid%2B%27%26uc%27%29%3Blink.searchParams.set%28%27prodversion%27%2C-1%3E%3E%3E1%29%3Blink.searchParams.set%28%27acceptformat%27%2C%5B...Array%2810%29.keys%28%29%5D.map%28%28v%3D%3E%27crx%27%2Bv%29%29.join%28%27%2C%27%29%29%3Bwindow.prompt%28%27.crx%20raw%20link%27%2Clink%29%7D%29%28%29%3B"&gt;crx DL link&lt;/a&gt;&lt;pre&gt;/*
 * @title crx DL link
 * @description prompt download-link of Chrome Extension aka crx on Chrome Web Store
 * @include https://chrome.google.com/webstore/detail/*
 * @contributor taizooo http://let.hatelabo.jp/taizooo/let/gYC-x-e5r_G0bw (Fork of)
 * @license MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

// alternative
// https://robwu.nl/crxviewer/
//  https://github.com/Rob--W/crxviewer

// DEPRECATED: TODO fix
// dev-doc c.f.
// https://gist.github.com/noromanba/5776183

// e.g.
// https://chrome.google.com/webstore/detail/privacy-badger/pkehgijcmpdhfbdbbnkijodmdjhbjlgp
(() =&amp;gt; {
  'use strict';

  // url syntax of Extension Page;
  // https://chrome.google.com/webstore/detail/[&amp;lt;EXTENSION_NAME&amp;gt;]/&amp;lt;EXTENSION_ID&amp;gt;[/]
  const extid = location.pathname.split('/').filter(s =&amp;gt; !!s).pop();

  // You can use http, but final url redirect to https
  const link = new URL('https://clients2.google.com/service/update2/crx');
  // URLSearchParams c.f.
  // https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
  link.searchParams.set('response', 'redirect');
  link.searchParams.set('x', 'id=' + extid + '&amp;amp;uc');
  // Chrome/ium ver
  // 32 or higher; e.g. 33, 64, 99, 999 to 2147483647 = 32-bit INT32 MAX c.f.
  //  http://let.hatelabo.jp/noromanba/let/hJmdmMS2rstJ
  // you can use manifest.json style; 70.0.0.0, 9999.9999.9999.9999 c.f.
  //  https://developer.chrome.com/apps/manifest/version
  link.searchParams.set('prodversion', -1 &amp;gt;&amp;gt;&amp;gt; 1);
  // crx2, crx3, ...
  link.searchParams.set('acceptformat', [
    ...Array(10).keys()
  ].map(v =&amp;gt; 'crx' + v).join(','));

  window.prompt('.crx raw link', link);
})();

// DEV
// https://clients2.google.com/service/update2/crx
// ?response=redirect
// &amp;amp;prodversion=999
// &amp;amp;acceptformat=crx2,crx3,crx4
// &amp;amp;x=id%3Dpkehgijcmpdhfbdbbnkijodmdjhbjlgp%26uc
//
// OBSOLETE e.g. `prod=chrome`
// https://stackoverflow.com/questions/7184793/how-to-download-a-crx-file-from-the-chrome-web-store-for-a-given-id

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHVrZ3Vzbsd">
    <link>https://let.hatelabo.jp/noromanba/let/hLHVrZ3Vzbsd</link>
    <dc:date>2018-08-24T02:54:25Z</dc:date>
    <description>mobile optimization</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] lighter</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20url%3Dlocation.href%3Bconst%20proxy%3D%27https%3A%2F%2Fgoogleweblight.com%2F%3Flite_url%3D%27%3Blocation.href%3Dproxy%2Burl%7D%29%28%29%3B"&gt;lighter&lt;/a&gt;&lt;pre&gt;/*
 * @title lighter
 * @description mobile optimization
 * @include http://*
 * @include https://*
 * @license MIT License
 * @javascript_url
 */

// XXX violate your privacy possibility
(() =&amp;gt; {
  'use strict';

  // TBD canonical, escape
  const url = location.href;
  const proxy =  'https://googleweblight.com/?lite_url=';

  location.href = proxy + url;
})();

// from dumb phone
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHVpJDbvfN8">
    <link>https://let.hatelabo.jp/noromanba/let/hLHVpJDbvfN8</link>
    <dc:date>2018-08-10T23:29:04Z</dc:date>
    <description>list global props of content-scripts</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] props?</title>
    <content:encoded>&lt;a href="javascript:%7Bconst%20sandbox%3Ddocument.body.appendChild%28document.createElement%28%27iframe%27%29%29.contentWindow%3Bconsole.table%28Object.entries%28Object.getOwnPropertyDescriptors%28window%29%29.filter%28%28%28%5Bname%2Cdescr%5D%29%3D%3E%21%28name%20in%20sandbox%29%26%26%21String%28window%5Bname%5D%29.includes%28%27%5BCommand%20Line%20API%5D%27%29%26%26Boolean%28window%5Bname%5D%29%29%29%29%7D"&gt;props?&lt;/a&gt;&lt;pre&gt;/*
 * @title props?
 * @description list global props of content-scripts
 * @include http://*
 * @include https://*
 * @license MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

// TODO well set-difference
{
  const sandbox = document.body.appendChild(document.createElement('iframe')).contentWindow
  console.table(
    Object.entries(Object.getOwnPropertyDescriptors(window)).filter(([name, descr]) =&amp;gt; {
      return !(name in sandbox) &amp;amp;&amp;amp;
      // TODO devtools `$*` family smart filtering in Console
      !String(window[name]).includes('[Command Line API]') &amp;amp;&amp;amp;
      Boolean(window[name])
    })
  )
}

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHVndnBiMBw">
    <link>https://let.hatelabo.jp/noromanba/let/hLHVndnBiMBw</link>
    <dc:date>2018-08-01T22:48:33Z</dc:date>
    <description>enforce English page w/o login/sign-in</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] ENforce</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20url%3Dnew%20URL%28location.href%29%3Bconst%20langQuery%3Dnew%20Set%28%5B%27hl%27%2C%27lang%27%5D%29%3B%5B...langQuery%5D.some%28%28key%3D%3E%7Bif%28url.searchParams.has%28key%29%29%7Burl.searchParams.set%28key%2C%27en%27%29%3Breturn%20true%7Durl.searchParams.append%28key%2C%27en%27%29%7D%29%29%3Blocation.search%3Durl.search%7D%29%28%29%3B"&gt;ENforce&lt;/a&gt;&lt;pre&gt;/*
 * @title ENforce
 * @description enforce English page w/o login/sign-in
 * @include http://*
 * @include https://*
 * @contributor noromanba   http://let.hatelabo.jp/noromanba/let/hLHVndmmiaF5
 * @contributor noromanba   http://let.hatelabo.jp/noromanba/let/hLHVnvrnxfEx
 * @license     MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

// e.g.
// https://instagram.com/instagram
// https://twitter.com/twitter
// https://www.google.com
// https://webcache.googleusercontent.com/search?q=cache:https://example.com/

// TBD
// - en-* en_*
// - pathname
(() =&amp;gt; {
    'use strict';

    const url = new URL(location.href);
    // intersection w/ loop implements c.f.
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#Implementing_basic_set_operations
    // TBD Map w/ hostname
    const langQuery = new Set([
        'hl',
        'lang',
    ]);

    // hard to intersection w/o loop
    [...langQuery].some(key =&amp;gt; {
        if (url.searchParams.has(key)) { // TBD .get() instead
            url.searchParams.set(key, 'en');
            return true;
        }
        // XXX redundant; order sensitive
        url.searchParams.append(key, 'en');
    });

    location.search = url.search;
})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHVnvrnxfEx">
    <link>https://let.hatelabo.jp/noromanba/let/hLHVnvrnxfEx</link>
    <dc:date>2018-08-01T22:47:43Z</dc:date>
    <description>choice English page w/o login/sign-in</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] chosEN</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20url%3Dnew%20URL%28location.href%29%3Bconst%20langQuery%3Dnew%20Set%28%5B%27hl%27%2C%27lang%27%5D%29%3B%5B...url.searchParams.keys%28%29%5D.some%28%28key%3D%3E%7Bif%28langQuery.has%28key%29%29%7Burl.searchParams.set%28key%2C%27en%27%29%3Breturn%20true%7D%7D%29%29%3Blocation.search%3Durl.search%7D%29%28%29%3B"&gt;chosEN&lt;/a&gt;&lt;pre&gt;/*
 * @title chosEN
 * @description choice English page w/o login/sign-in
 * @include http://*
 * @include https://*
 * @contributor noromanba   http://let.hatelabo.jp/noromanba/let/hLHVndmmiaF5
 * @license MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

// e.g.
// https://instagram.com/instagram?hl=ja
// https://twitter.com/twitter?lang=ja
// https://www.google.com?hl=ja
// https://webcache.googleusercontent.com/search?q=cache:https://example.com/&amp;amp;hl=ja

// TBD
// - en-* en_*
// - pathname
(() =&amp;gt; {
    'use strict';

    const url = new URL(location.href);
    const langQuery = new Set([
        'hl',
        'lang',
    ]);

    [...url.searchParams.keys()].some(key =&amp;gt; {
        if (langQuery.has(key)) { // TBD .get() instead
            url.searchParams.set(key, 'en');
            return true;
        }
    });

    location.search = url.search;
})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hJmdmMS2rstJ">
    <link>https://let.hatelabo.jp/noromanba/let/hJmdmMS2rstJ</link>
    <dc:date>2018-08-01T22:37:12Z</dc:date>
    <description>get Signed INT32 max value 2147483647 w/ DOM API</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] rounDOM INT32 MAX</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20wall%3Ddocument.head%7C%7Cdocument.body%7C%7Cdocument.documentElement%3Bconst%20sandbox%3Dwall.appendChild%28document.createElement%28%27iframe%27%29%29%3Blet%20rounder%3Dsandbox.contentWindow.document.body%3Brounder.style.zIndex%3DNumber.MAX_SAFE_INTEGER%3Bconst%20MAX_SAFE_SIGNED_INT32%3DNumber%28rounder.style.zIndex%29%3Bconst%20EXPECTED%3D2147483647%3Bif%28%21console%7C%7C%21console.log%7C%7C%21console.assert%29%7Bwindow.prompt%28%60Signed%20%2BINT32%3A%20%24%7BEXPECTED%7D%3F%60%2CMAX_SAFE_SIGNED_INT32%29%3Breturn%7Dconsole.assert%28%5B2147483647%2C-1%3E%3E%3E1%2C~%281%3C%3C32-1%29%2C2%2A%2A%2832-1%29-1%2CMAX_SAFE_SIGNED_INT32%5D.every%28%28v%3D%3Ev%3D%3D%3DEXPECTED%29%29%2C%7BExpected%3AEXPECTED%2C%27But%20acutual%27%3AMAX_SAFE_SIGNED_INT32%7D%29%3Bconsole.log%28MAX_SAFE_SIGNED_INT32%29%7D%29%28%29%3B"&gt;rounDOM INT32 MAX&lt;/a&gt;&lt;pre&gt;/*
 * @title rounDOM INT32 MAX
 * @description get Signed INT32 max value 2147483647 w/ DOM API
 * @include http://*
 * @include https://*
 * @contributor noromanba   http://let.hatelabo.jp/noromanba/let/hLHUs7CEkec6
 * @contributor noromanba   http://let.hatelabo.jp/noromanba/let/hLHVmL_ErMVx
 * @contributor noromanba   http://let.hatelabo.jp/noromanba/let/hLHVmL_RgoIK
 * @license     MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

(() =&amp;gt; {
    'use strict';

    const wall = document.head || document.body || document.documentElement;
    const sandbox = wall.appendChild(document.createElement('iframe'));

    // [^1] DOM w/ IEEE_754 details c.f.
    //       http://let.hatelabo.jp/noromanba/let/hLHUs7CEkec6
    //      ignoring &amp;gt;Signed INT32 at some values/scene
    //      if you can not works `Number.MAX_SAFE_INTEGER`, use below instead
    let rounder = sandbox.contentWindow.document.body;
    // [^2] needs get after set
    rounder.style.zIndex = Number.MAX_SAFE_INTEGER;
    const MAX_SAFE_SIGNED_INT32 = Number(rounder.style.zIndex);

    // TBD always prompt
    const EXPECTED = 2147483647;
    if (!console || !console.log || !console.assert) {
        window.prompt(`Signed +INT32: ${EXPECTED}?`, MAX_SAFE_SIGNED_INT32);
        return;
    }
    console.assert([
        0x7FFFFFFF,
        -1 &amp;gt;&amp;gt;&amp;gt; 1,
        ~(1 &amp;lt;&amp;lt; (32 - 1)),
        2 ** (32 - 1) - 1,
        MAX_SAFE_SIGNED_INT32,
    ].every(v =&amp;gt; v === EXPECTED), {
        'Expected': EXPECTED,
        'But acutual': MAX_SAFE_SIGNED_INT32,
    });
    console.log(MAX_SAFE_SIGNED_INT32);
})();

// DEV
//
// [1]:
// Signed INT32
//  https://en.wikipedia.org/wiki/IEEE_754
//  https://en.wikipedia.org/wiki/Single-precision_floating-point_format
//   https://en.wikipedia.org/wiki/IEEE_754_revision
// specs
//  https://developer.mozilla.org/en-US/docs/Web/CSS/z-index
//   https://developer.mozilla.org/en-US/docs/Web/CSS/integer#Interpolation
//    https://en.wikipedia.org/wiki/Floor_and_ceiling_functions
//  TODO CSS3 spec; https://www.w3.org/Style/CSS/
//  https://www.w3.org/TR/CSS2/visuren.html#propdef-z-index
// same as `window.scroll*()` X-Browsers reports, Firefox Desktop most strict handling
//  http://let.hatelabo.jp/noromanba/let/hLHVmL_RgoIK
//   https://www.w3.org/TR/cssom-view/#webidl-values
//
// [2]:
// how to remember 2147483647
//  https://stackoverflow.com/questions/94591/what-is-the-maximum-value-for-an-int32#45116768
//   https://i.stack.imgur.com/rCL8f.png
//  https://stackoverflow.com/questions/94591/what-is-the-maximum-value-for-an-int32#94608
//
// easings
//  https://easings.net

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHVmL_RgoIK">
    <link>https://let.hatelabo.jp/noromanba/let/hLHVmL_RgoIK</link>
    <dc:date>2018-07-24T20:45:13Z</dc:date>
    <description>extremely smooth scrolling by Vanilla JS/CSS</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] Creepy Scrolling Sickness</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20y%3DMath.max%28...%5Bwindow.pageYOffset%2Cwindow.scrollY%2Cdocument.documentElement.scrollTop%5D%29%3Bconst%20MAX_SAFE_SIGNED_INT32%3D-1%3E%3E%3E1%3Bconst%20top%3Dy%3F0%3AMAX_SAFE_SIGNED_INT32%3Bdocument.documentElement.style.scrollBehavior%3D%27smooth%27%3Bwindow.scrollTo%28%7Btop%3Atop%7D%29%7D%29%28%29%3B"&gt;Creepy Scrolling Sickness&lt;/a&gt;&lt;pre&gt;/*
 * @title Creepy Scrolling Sickness
 * @description extremely smooth scrolling by Vanilla JS/CSS
 * @include http://*
 * @include https://*
 * @contributor noromanba   http://let.hatelabo.jp/noromanba/let/hLHVmL_ErMVx
 * @license     MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

(() =&amp;gt; {
    'use strict';

    const y = Math.max(...[
        window.pageYOffset,
        window.scrollY,
        document.documentElement.scrollTop,
    ]);

    // [^1] loose/strict scrolling to bottom details c.f.
    // http://let.hatelabo.jp/noromanba/let/hLHUs7CEkec6
    // you don't use `Number.MAX_SAFE_INTEGER`
    // Firefox Desktop ignoring &amp;gt;Signed INT32, use INT32 max value
    //      [0x7FFFFFFF, -1 &amp;gt;&amp;gt;&amp;gt; 1, ~(1 &amp;lt;&amp;lt; (32 - 1)), 2 ** (32 - 1) - 1,]
    //          .every(v =&amp;gt; v === 2147483647) === true
    const MAX_SAFE_SIGNED_INT32 = -1 &amp;gt;&amp;gt;&amp;gt; 1;
    const top = y ? 0 : MAX_SAFE_SIGNED_INT32;

    // [^2] behaviors c.f.
    // https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior
    // https://caniuse.com/#feat=css-scroll-behavior
    //*/ switch-line; &amp;quot;//&amp;quot; or &amp;quot;/&amp;quot; to toggle
    document.documentElement.style.scrollBehavior = 'smooth';
    /*/
    {
        const wall = document.head || document.body || document.documentElement;

        wall.appendChild(Object.assign(document.createElement('style'), {
            charset: 'utf-8',
            textContent: 'html { scroll-behavior: smooth; }'
        }));
    }
    //*/
    // document.documentElement. and/or scroll*() too
    window.scrollTo({ top, });
})();

// DEV
//
// [1]: Signed INT32
// specs
//  https://en.wikipedia.org/wiki/IEEE_754
//  https://en.wikipedia.org/wiki/Single-precision_floating-point_format
//   https://en.wikipedia.org/wiki/IEEE_754_revision
// how to remember 2147483647
//  https://stackoverflow.com/questions/94591/what-is-the-maximum-value-for-an-int32#45116768
//   https://i.stack.imgur.com/rCL8f.png
//  https://stackoverflow.com/questions/94591/what-is-the-maximum-value-for-an-int32#94608
//
// [2]: scroll-behavior
// specs
//  https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior
//  https://wicg.github.io/overscroll-behavior/
// overscroll-behavior
//  https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior
//  https://caniuse.com/#feat=css-overscroll-behavior
// overscroll-behavior-x|y
//  https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior-x
//  https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior-y
//
// easings
//  https://easings.net

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHVmL_ErMVx">
    <link>https://let.hatelabo.jp/noromanba/let/hLHVmL_ErMVx</link>
    <dc:date>2018-07-24T20:43:30Z</dc:date>
    <description>smooth scrolling by Vanilla; for jQuery.animate() lover</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] grosscroll</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20y%3DMath.max%28...%5Bwindow.pageYOffset%2Cwindow.scrollY%2Cdocument.documentElement.scrollTop%5D%29%3Bconst%20MAX_SAFE_SIGNED_INT32%3D-1%3E%3E%3E1%3Bconst%20top%3Dy%3F0%3AMAX_SAFE_SIGNED_INT32%3Bwindow.scrollTo%28%7Btop%3Atop%2Cleft%3A0%2Cbehavior%3A%27smooth%27%7D%29%7D%29%28%29%3B"&gt;grosscroll&lt;/a&gt;&lt;pre&gt;/*
 * @title grosscroll
 * @description smooth scrolling by Vanilla; for jQuery.animate() lover
 * @include http://*
 * @include https://*
 * @license MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

// https://easings.net
(() =&amp;gt; {
    'use strict';

    const y = Math.max(...[
        window.pageYOffset,
        window.scrollY,
        document.documentElement.scrollTop,
    ]);

    // [^1] loose/strict scrolling to bottom details c.f.
    // http://let.hatelabo.jp/noromanba/let/hLHUs7CEkec6
    // you don't use `Number.MAX_SAFE_INTEGER`
    // Firefox Desktop ignoring &amp;gt;Signed INT32, use INT32 max value
    //      [0x7FFFFFFF, -1 &amp;gt;&amp;gt;&amp;gt; 1, ~(1 &amp;lt;&amp;lt; (32 - 1)), 2 ** (32 - 1) - 1,]
    //          .every(v =&amp;gt; v === 2147483647) === true
    const MAX_SAFE_SIGNED_INT32 = -1 &amp;gt;&amp;gt;&amp;gt; 1;
    const top = y ? 0 : MAX_SAFE_SIGNED_INT32;

    // [^2] scroll*() options c.f.
    // https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo
    window.scrollTo({ top, left: 0, behavior: 'smooth', });
    //
})();

// DEV
//
// [1]: Signed INT32
// specs
//  https://en.wikipedia.org/wiki/IEEE_754
//  https://en.wikipedia.org/wiki/Single-precision_floating-point_format
//   https://en.wikipedia.org/wiki/IEEE_754_revision
// how to remember 2147483647
//  https://stackoverflow.com/questions/94591/what-is-the-maximum-value-for-an-int32#45116768
//   https://i.stack.imgur.com/rCL8f.png
//  https://stackoverflow.com/questions/94591/what-is-the-maximum-value-for-an-int32#94608
//
// classical scrolling to bottom
/*
const Math.max(...[
    document.documentElement.scrollHeight,
    document.documentElement.clientHeight,
    document.body.scrollHeight,
    document.body.clientHeight,
]);
*/
//
// [2]: scroll* family
// window.scroll()
//  https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll
// window.scrollBy()
// https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy
//
// new scrolling features
// window.scrollByLines()
//  https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollByLines
// window.scrollByPages()
//  https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollByPages
//
// easings
//  https://easings.net

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHVltCFk5dw">
    <link>https://let.hatelabo.jp/noromanba/let/hLHVltCFk5dw</link>
    <dc:date>2018-07-24T00:15:35Z</dc:date>
    <description>get Hatena Haiku spam keywords abstract</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] H::H spam keywords</title>
    <content:encoded>&lt;a href="javascript:%28async%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20KEYWORD_FILTER%3D%27https%3A%2F%2Fhaikuantispam.lightni.ng%2Fapi%2Frecent_keywords.json%27%3B%7Bconst%20res%3Dawait%20fetch%28KEYWORD_FILTER%2C%7Bcache%3A%27no-cache%27%2Ccredentials%3A%27omit%27%2Cmode%3A%27cors%27%2Creferrer%3A%27%27%2CreferrerPolicy%3A%27no-referrer%27%7D%29%3Bconst%20json%3Dawait%20res.json%28%29%3Bconst%20ordereds%3DObject.entries%28json%29.sort%28%28%28%5B%2Cscore%5D%2C%5B%2Czcore%5D%29%3D%3Escore-zcore%29%29%3Bconsole.dir%28ordereds%29%7D%7Bconst%20res%3Dawait%20fetch%28KEYWORD_FILTER%2C%7Bcache%3A%27no-cache%27%2Ccredentials%3A%27omit%27%2Cmode%3A%27cors%27%2Creferrer%3A%27%27%2CreferrerPolicy%3A%27no-referrer%27%7D%29%3Bconst%20json%3Dawait%20res.json%28%29%3Bconst%20SPAM_THRESHOLD%3D5%3Bconst%20positives%3DObject.entries%28json%29.filter%28%28%28%5B%2Cscore%5D%29%3D%3Escore%3E%3DSPAM_THRESHOLD%29%29%3Bconsole.table%28positives%29%3Bconst%20spamword%3Dnew%20Map%28positives%29%3Bdocument.body.querySelectorAll%28%5B%27.box-body%20a.keyword%5Bhref%5D%5Btitle%5D%27%5D%29.forEach%28%28wordlink%3D%3E%7Bconst%20keyword%3Dwordlink.title%3Bif%28%21keyword%29return%3Bif%28spamword.has%28keyword%29%29%7Bconst%20container%3Dwordlink.parentElement%3Bconsole.table%28%5B%27spamword%27%2Ckeyword%2Cwordlink%2Ccontainer%5D%29%3Bcontainer.style.opacity%3D%270.5%27%7D%7D%29%29%7D%7D%29%28%29%3B"&gt;H::H spam keywords&lt;/a&gt;&lt;pre&gt;/*
 * @title H::H spam keywords
 * @description get Hatena Haiku spam keywords abstract
 * @include *://h.hatena.ne.jp/*
 * @license MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

// spam posts filter
// http://let.hatelabo.jp/noromanba/let/hJmc6brdnsgL

// via
// http://h.hatena.ne.jp/austinburk/81808835637056449
// http://h.hatena.ne.jp/austinburk/4623530768743273059

// for &amp;quot;Hot Keyword&amp;quot; or &amp;quot;Related Keywords&amp;quot; by topics at right side
// TBC where in page to id:sudofox
(async () =&amp;gt; {
    'use strict';

    // Access-Control-Allow-Origin: http://h.hatena.ne.jp
    const KEYWORD_FILTER = 'https://haikuantispam.lightni.ng/api/recent_keywords.json';
    // { &amp;lt;KEYWORD&amp;gt; : &amp;lt;SCORE&amp;gt; ...  }

    {
        // https://html.spec.whatwg.org/#cors-settings-attributes
        const res = await fetch(KEYWORD_FILTER, {
            // https://fetch.spec.whatwg.org/#request-headers
            // https://html.spec.whatwg.org/#initialise-the-document-object
            cache: 'no-cache',
            credentials: 'omit',
            mode: 'cors',
            // Referrer-Policy fallback
            referrer: '',
            // [^1] Referrer-Policy
            referrerPolicy: 'no-referrer',
        });
        const json = await res.json();
        const ordereds = Object.entries(json)
            .sort(([, score], [, zcore]) =&amp;gt; score - zcore);
        console.dir(ordereds);
    }

    {
        const res = await fetch(KEYWORD_FILTER, {
            cache: 'no-cache',
            credentials: 'omit',
            mode: 'cors',
            referrer: '',
            // [^1] Referrer-Policy
            referrerPolicy: 'no-referrer',
        });
        const json = await res.json();
        const SPAM_THRESHOLD = 5;
        const positives = Object.entries(json).filter(([, score]) =&amp;gt; score &amp;gt;= SPAM_THRESHOLD);
        console.table(positives);

        const spamword = new Map(positives);
        document.body.querySelectorAll([
            '.box-body a.keyword[href][title]',
        ]).forEach(wordlink =&amp;gt; {

            // keyword link syntax;
            // &amp;lt;a href=&amp;quot;http://h.hatena.ne.jp/{ESCAPED_KEYWORD}&amp;quot; class=&amp;quot;keyword&amp;quot; title=&amp;quot;{KEYWORD}&amp;quot;&amp;gt;{KEYWORD}&amp;lt;/a&amp;gt;
            const keyword = wordlink.title;
            if (!keyword) return;

            if (spamword.has(keyword)) {
                const container = wordlink.parentElement;
                //keyword.remove();
                console.table([
                    'spamword',
                    keyword,
                    wordlink,
                    container,
                ]);
                container.style.opacity = '0.5';
            }
        });
    }

})();

// DEV
//
// [1]: Referrer-Policy
// api
//  https://developer.mozilla.org/en-US/docs/Web/API/Request/referrerPolicy
//  https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
// specs
//  https://w3c.github.io/webappsec-referrer-policy/#referrer-policies
//  https://fetch.spec.whatwg.org/#concept-request-referrer-policy
//
// test servers
//  https://api.github.com
//  https://httpstat.us
//   https://httpstat.us/404
//   https://httpstat.us/200?sleep=60000

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/noromanba/let/hLHVls_T_OYQ">
    <link>https://let.hatelabo.jp/noromanba/let/hLHVls_T_OYQ</link>
    <dc:date>2018-07-20T00:00:33Z</dc:date>
    <description>what is the origin of GigaViewer</description>
    <dc:creator>noromanba</dc:creator>
    <title>[Let] why GV?</title>
    <content:encoded>&lt;a href="javascript:new%20WeakSet%28...%5B...document.body.querySelectorAll%28%27img.page-image%27%29%5D.map%28%28img%3D%3E%5B...img.attributes%5D.filter%28%28attr%3D%3E%2Fdata%5C-%2F.test%28attr.name%29%29%29%29%29%29%3B"&gt;why GV?&lt;/a&gt;&lt;pre&gt;/*
 * @title why GV?
 * @description what is the origin of GigaViewer
 * @include https://*
 * @license MIT License https://opensource.org/licenses/MIT
 * @javascript_url
 */

// e.g.
// https://shonenjumpplus.com/episode/10833519556325021841
new WeakSet(...
  [...document.body.querySelectorAll('img.page-image')].map(img =&amp;gt; [...img.attributes].filter(attr =&amp;gt; /data\-/.test(attr.name)))
)
// WeakSet {data-page-height, data-is-gif, data-src, data-cho-ju-giga, data-page-width}
//
// &amp;gt; data-cho-ju-giga
// choju-jinbutsu-giga !!!
// https://en.wikipedia.org/wiki/Ch%C5%8Dj%C5%AB-jinbutsu-giga

&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
