<?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/rss">
    <link>https://let.hatelabo.jp/rss</link>
    <description></description>
    <title>Recent Bookmarklets</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/dirtyyasay/let/lOGKnbX0gsAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/tanasan_o38/let/lNmkzJLogaAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/onk/let/g5G0uOeEqfcA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mame-tanuki/let/lMHE593ygMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mame-tanuki/let/lMKUw_PKgeAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mame-tanuki/let/lMHOlszggMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mame-tanuki/let/lMHD2_O4gMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mino90/let/iv2Fg7TEguAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mino90/let/kL7dzrjmgoAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mino90/let/hLHWgP2DkYwo"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/furyu-tei/let/itqCwruYgMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mino90/let/lJyO36LWgYAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hadsn/let/lJvPrKmYgMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hadsn/let/lJDuyraCgKAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Lhankor_Mhy/let/jun3wcKygeAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Lhankor_Mhy/let/jrLIsPyegeAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mame-tanuki/let/lIPJ8uPYgoAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hadsn/let/k_6a05vogMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/mizdra/let/k_WsxIeCgKAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/xtetsuji/let/k8244LTIgKAA"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/dirtyyasay/let/lOGKnbX0gsAA">
    <link>https://let.hatelabo.jp/dirtyyasay/let/lOGKnbX0gsAA</link>
    <dc:date>2026-04-20T15:07:10Z</dc:date>
    <description></description>
    <dc:creator>dirtyyasay</dc:creator>
    <title>[Let] </title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fdirtyyasay%2Flet%2FlOGKnbX0gsAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;bookmarklet&lt;/a&gt;&lt;pre&gt;
WindowsからSFTPサーバーに接続した時のこと（最初は一体どうすればいいのか全く分からなかった）
正直なところ、初めてSFTPサーバーへのアクセス権を与えられた時、何から手をつければいいのか全く見当がつかなかった。「ログインIDとパスワード、サーバーはこちらだ。接続して」といった感じだった。それきり、何も説明がなかった。説明書も説明も何もありませんでした。
普通のフォルダやGoogle Driveのようなものかと思っていましたが、実際はもう少し複雑でした。
最初の試み — エクスプローラー経由（そして失敗）
最初は、Windowsエクスプローラーでサーバーを探してみました。理にかなっていますよね？ でも、もちろんうまくいきませんでした。
どうやら、SFTPは普通のネットワークドライブとは異なり、Windowsの標準機能では正常に動作しないことがわかりました。
その後、専用のプログラムの存在を知りました
何度か試行錯誤した末、SFTPに対応したプログラムを見つけました。
実際に役立った最も簡単な方法は、WinSCPを使うことでした。
ダウンロードして開いてみると、操作はかなりシンプルでした：
サーバーのアドレスを入力
ログイン名
パスワード
SFTPを選択
「Login」をクリック
すると、突然、Windowsエクスプローラーのようなインターフェースが表示されます。左側が自分のパソコン、右側がサーバーです。
FileZillaも試してみました
その後、FileZillaも試してみました。
これも動作しますが、インターフェースは少し「技術的」です。とはいえ、仕組みは同じです：
ホストを指定
ポート22
ログインとパスワード
接続
最も意外な方法は、コマンドプロンプト経由です
後で知ったのですが、Windowsにはすでに組み込みのSSHクライアントがあります。
PowerShellを開いて、次のように入力するだけです：
sftp username@hostname
最初は難しそうに見えましたが、実際は簡単です：
コマンドを入力
パスワードを入力
コマンドを使ってファイルを操作
最終的に私が理解したこと
最大の過ちは、「フォルダを使うような普通の方法」を探していたことでした。SFTPは、そもそも全く別のレベルのアクセス方法なのです。
今では、3つの一般的な選択肢があることが分かります：
WinSCP — 最もシンプル
FileZilla — 汎用性が高い
ターミナル — コマンドに慣れている人向け
まとめ
もし誰かが最初からこれを説明してくれていたら、私は多くの時間を節約できたでしょう。
WindowsでのSFTPは難しくありません。ただ、適切なツールを知っておく必要があるだけです。

https://cloudmounter.net/ja/connect-sftp-windows/&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/tanasan_o38/let/lNmkzJLogaAA">
    <link>https://let.hatelabo.jp/tanasan_o38/let/lNmkzJLogaAA</link>
    <dc:date>2026-04-08T12:32:14Z</dc:date>
    <description>my bookmarklet</description>
    <dc:creator>tanasan_o38</dc:creator>
    <title>[Let] bookmarklet</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Ftanasan_o38%2Flet%2FlNmkzJLogaAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;bookmarklet&lt;/a&gt;&lt;pre&gt;/*
 * @title bookmarklet
 * @description my bookmarklet
 * @include http://*
 * @license MIT License
 * @require 
 */


alert(&amp;quot;test!!&amp;quot;)&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/onk/let/g5G0uOeEqfcA">
    <link>https://let.hatelabo.jp/onk/let/g5G0uOeEqfcA</link>
    <dc:date>2026-03-22T21:46:00Z</dc:date>
    <description>[タイトル URL]という形式でページのタイトルとURLをクリップボードにコピーします</description>
    <dc:creator>onk</dc:creator>
    <title>[Let] Scrapboxのリンク形式でタイトルとURLをコピー</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7B%27use%20strict%27%3Blet%20canonical%3D%28document.querySelector%28%27head%20link%5Brel%3D%22canonical%22%5D%5Bhref%5D%27%29%7C%7C%7B%7D%29.href%3Bif%28canonical%26%26location.hash%29%7Bcanonical%3Dcanonical%2Blocation.hash%7Dconst%20replacedTitle%3Ddocument.title.replaceAll%28%27%5B%27%2C%27%EF%BC%BB%27%29.replaceAll%28%27%5D%27%2C%27%EF%BC%BD%27%29.replaceAll%28%27%60%27%2C%27%EF%BD%80%27%29%3Bconst%20content%3D%22%5B%22%2BreplacedTitle%2B%22%20%22%2B%28canonical%7C%7Clocation.href%29%2B%22%5D%22%3Bnavigator.clipboard.writeText%28content%29%7D%29%28%29%3B"&gt;Scrapboxのリンク形式でタイトルとURLをコピー&lt;/a&gt;&lt;pre&gt;/*
 * @title Scrapboxのリンク形式でタイトルとURLをコピー
 * @description [タイトル URL]という形式でページのタイトルとURLをクリップボードにコピーします
 * @include *
 * @license MIT License
 * @javascript_url
 */
(() =&amp;gt; {
  'use strict';
  let canonical = (document.querySelector('head link[rel=&amp;quot;canonical&amp;quot;][href]') || {}).href
  if (canonical &amp;amp;&amp;amp; location.hash) {
    canonical = canonical + location.hash;
  }
  const replacedTitle = document.title
    .replaceAll('[', '［')
    .replaceAll(']', '］')
    .replaceAll('`', '｀');
  const content = &amp;quot;[&amp;quot; + replacedTitle + &amp;quot; &amp;quot; + (canonical || location.href) + &amp;quot;]&amp;quot;;
  navigator.clipboard.writeText(content);
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mame-tanuki/let/lMHE593ygMAA">
    <link>https://let.hatelabo.jp/mame-tanuki/let/lMHE593ygMAA</link>
    <dc:date>2026-03-03T15:19:03Z</dc:date>
    <description>「userId」で指定したユーザーあるいは、はてなドメインならURLから取得したユーザーIDのブックマーク一覧ページを画面左上に表示されるカレンダーから選択した日付別に表示するブックマークレット。</description>
    <dc:creator>mame-tanuki</dc:creator>
    <title>[Let] 昨日改</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fmame-tanuki%2Flet%2FlMHE593ygMAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;昨日改&lt;/a&gt;&lt;pre&gt;/*
 * @title 昨日改
 * @description 「userId」で指定したユーザーあるいは、はてなドメインならURLから取得したユーザーIDのブックマーク一覧ページを画面左上に表示されるカレンダーから選択した日付別に表示するブックマークレット。
 * @include http://*
 * @license MIT License
 * @require 
 */


javascript:(function(){
    // 1. ユーザーIDの取得
    let userId = 'mame-tanuki';
    if (location.host === 'b.hatena.ne.jp') {
        const match = location.pathname.match(/^\/([^\/]+)\//);
        if (match) userId = match[1];
    }

    // 2. 入力フォーム（date型）の作成
    const input = document.createElement('input');
    input.type = 'date';
    
    // スタイル調整：スマホでも見やすく中央に配置
    Object.assign(input.style, {
        position: 'fixed',
        top: '20%', // スマホのキーボードやパネルを考慮して少し上に
        left: '50%',
        transform: 'translateX(-50%)',
        zIndex: '2147483647', // 最大の重なり順
        padding: '12px',
        fontSize: '18px', // モバイルでズームされないサイズ
        border: '2px solid #00A4DE',
        borderRadius: '8px',
        backgroundColor: '#fff',
        boxShadow: '0 4px 20px rgba(0,0,0,0.4)'
    });

    // 初期値を「昨日」に設定
    const d = new Date();
    d.setDate(d.getDate() - 1);
    input.value = d.toISOString().split('T')[0];

    // 3. 日付が選択された時の処理
    input.onchange = function() {
        const val = input.value.replace(/-/g, ''); 
        if (val) {
            location.href = `https://b.hatena.ne.jp/${userId}/${val}`;
        }
        // 遷移するので削除は不要だが一応
        if(input.parentNode) document.body.removeChild(input);
    };

    // 【改善点】スマホで消える対策：onblurをあえて設定しない、
    // もしくはクリック以外の意図しない動作で消えないように調整
    // キャンセルしたい場合は、日付以外の場所をタップしても消えるように別途実装も可能

    // 4. 画面に追加して実行
    document.body.appendChild(input);
    
    // showPicker() は最新ブラウザでカレンダーを自動展開するメソッド
    if (input.showPicker) {
        input.showPicker();
    } else {
        input.focus();
    }
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mame-tanuki/let/lMKUw_PKgeAA">
    <link>https://let.hatelabo.jp/mame-tanuki/let/lMKUw_PKgeAA</link>
    <dc:date>2026-03-03T14:21:21Z</dc:date>
    <description>my bookmarklet現在のページの「タイトル」と「URL」を取得してクリップボードにコピーする(navigator.clipboard)</description>
    <dc:creator>mame-tanuki</dc:creator>
    <title>[Let] CopyURLTitle2CB</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fmame-tanuki%2Flet%2FlMKUw_PKgeAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;CopyURLTitle2CB&lt;/a&gt;&lt;pre&gt;/*
 * @title CopyURLTitle2CB
 * @description my bookmarklet現在のページの「タイトル」と「URL」を取得してクリップボードにコピーする(navigator.clipboard)
 * @include http://*
 * @license MIT License
 * @require 
 */


javascript:(async () =&amp;gt; {
  const text = `${document.title}\n${document.URL}`;
  try {
    await navigator.clipboard.writeText(text);
    alert('コピー完了！');
  } catch (err) {
    console.error('コピーに失敗しました', err);
  }
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mame-tanuki/let/lMHOlszggMAA">
    <link>https://let.hatelabo.jp/mame-tanuki/let/lMHOlszggMAA</link>
    <dc:date>2026-03-02T18:00:49Z</dc:date>
    <description></description>
    <dc:creator>mame-tanuki</dc:creator>
    <title>[Let] PublishBUKOME</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fmame-tanuki%2Flet%2FlMHOlszggMAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;PublishBUKOME&lt;/a&gt;&lt;pre&gt;/*
 * @title PublishBUKOME
 * @コメント一覧ページで「パーマリンク」アイコンを押して開いたブックマークコメントページで実行すると「埋め込みコード」を一部簡略（タグのリンクURL削除など）してクリップボードにコピーする
 * @include http://*
 * @license MIT License
 * @require 
 */

javascript:(function(){
    /* 1. データの抽出 */
    const getMeta = (attr) =&amp;gt; document.documentElement.getAttribute(attr);
    const entryUrl = getMeta('data-entry-url');
    const entryTitle = document.querySelector('.comment-entry-title a')?.innerText || '';
    const userId = getMeta('data-stable-request-url')?.split('/').pop() || '';
    const userIcon = document.querySelector('.comment-body-username img')?.src || '';
    const commentText = document.querySelector('.comment-body-text')?.innerText || '';
    const timestampText = document.querySelector('.comment-body-date a')?.innerText || '';
    const permalink = document.querySelector('.comment-body-date a')?.href || '';

    /* タグの取得と成形 */
    const tags = Array.from(document.querySelectorAll('.comment-body-tags li a'))
        .map(a =&amp;gt; `&amp;lt;li style=&amp;quot;float: left&amp;quot;&amp;gt;[${a.innerText}]&amp;lt;/li&amp;gt;`).join('\n');

    /* 2. テキストの組み立て */
    const output = `&amp;lt;blockquote class=&amp;quot;hatena-bookmark-comment&amp;quot;&amp;gt;
&amp;lt;a class=&amp;quot;comment-info&amp;quot; href=&amp;quot;${entryUrl}&amp;quot; data-user-id=&amp;quot;${userId}&amp;quot; data-entry-url=&amp;quot;${entryUrl}&amp;quot; data-original-href=&amp;quot;${entryUrl}&amp;quot; data-entry-favicon=&amp;quot;https://cdn-ak2.favicon.st-hatena.com/64?url=${encodeURIComponent(entryUrl)}&amp;quot; data-user-icon=&amp;quot;/users/${userId}/profile.png&amp;quot;&amp;gt;${entryTitle}&amp;lt;/a&amp;gt;
&amp;lt;a href=&amp;quot;http://b.hatena.ne.jp/entry/${entryUrl}&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;lt;img border=&amp;quot;0&amp;quot; src=&amp;quot;http://b.hatena.ne.jp/entry/image/${entryUrl}&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;

&amp;lt;br&amp;gt;
&amp;lt;ul class=&amp;quot;comment-tag&amp;quot; style=&amp;quot;list-style: none; margin: 0px;&amp;quot;&amp;gt;
&amp;lt;li style=&amp;quot;float: left&amp;quot;&amp;gt;🏷️&amp;lt;/li&amp;gt;
${tags}
&amp;lt;/ul&amp;gt;
&amp;lt;br&amp;gt;

&amp;lt;p style=&amp;quot;clear: left&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;comment-body-username&amp;quot;&amp;gt;
                &amp;lt;a href=&amp;quot;/${userId}/bookmark&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;${userIcon}&amp;quot; alt=&amp;quot;${userId}&amp;quot;&amp;gt;${userId}&amp;lt;/a&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;br&amp;gt;
${commentText}
&amp;lt;/p&amp;gt;
&amp;lt;a class=&amp;quot;datetime&amp;quot; href=&amp;quot;${permalink}&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;datetime-body&amp;quot;&amp;gt;${timestampText}&amp;lt;/span&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;/blockquote&amp;gt;`;

    /* 3. クリップボードへのコピーと通知 */
    console.log(output);
    navigator.clipboard.writeText(output).then(() =&amp;gt; {
        alert('テキストをコピーしました。');
    }).catch(err =&amp;gt; {
        alert('コピーに失敗しました。コンソールを確認してください。');
    });
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mame-tanuki/let/lMHD2_O4gMAA">
    <link>https://let.hatelabo.jp/mame-tanuki/let/lMHD2_O4gMAA</link>
    <dc:date>2026-03-02T14:49:03Z</dc:date>
    <description>リンク作成＋はてなブックマーク数表示→クリップボード</description>
    <dc:creator>mame-tanuki</dc:creator>
    <title>[Let] MakeLink4hateda2CB</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fmame-tanuki%2Flet%2FlMHD2_O4gMAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;MakeLink4hateda2CB&lt;/a&gt;&lt;pre&gt;/*
 * @title MakeLink4hateda2CB
 * @description リンク作成＋はてなブックマーク数表示→クリップボード
 * @include http://*
 * @license MIT License
 * @require 
 */

javascript:(function(){
  var t=document.title;
  var u=location.href;
  /* HTML文字列の生成 */
  var val='- &amp;lt;a href=&amp;quot;'+u+'&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;'+t+'&amp;lt;/a&amp;gt;&amp;lt;a href=&amp;quot;http://b.hatena.ne.jp/entry/'+u+'&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;lt;img border=&amp;quot;0&amp;quot; src=&amp;quot;http://b.hatena.ne.jp/entry/image/'+u+'&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;';

  /* コピー用のtextareaを作成（画面外に配置） */
  var ele=document.createElement('textarea');
  ele.value=val;
  ele.style.position='fixed';
  ele.style.left='-9999px';
  document.body.appendChild(ele);

  /* 選択とコピーの実行 */
  ele.select();
  var result=document.execCommand('copy');

  /* 後片付け */
  document.body.removeChild(ele);

  if(result){
    alert('コピー完了:\n' + val);
  } else {
    alert('コピーに失敗しました。');
  }
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mino90/let/iv2Fg7TEguAA">
    <link>https://let.hatelabo.jp/mino90/let/iv2Fg7TEguAA</link>
    <dc:date>2026-02-21T07:40:04Z</dc:date>
    <description>ＭＳゴシック系を無効にする。</description>
    <dc:creator>mino90</dc:creator>
    <title>[Let] Disable MS Gothic</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fmino90%2Flet%2Fiv2Fg7TEguAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Disable MS Gothic&lt;/a&gt;&lt;pre&gt;/*
 * @title Disable MS Gothic
 * @description ＭＳゴシック系を無効にする。
 * @include http://*
 * @license MIT License
 */

//MS UI Gothic は崩れないように別のUIフォントにする。

(function() {
const s = document.createElement('style');
s.setAttribute('type', 'text/css');
s.innerHTML='@font-face{font-family:&amp;quot;MS UI Gothic&amp;quot;;src: local(&amp;quot;Meiryo UI&amp;quot;);font-weight: normal;}'
+'@font-face{font-family:&amp;quot;MS UI Gothic&amp;quot;;src: local(&amp;quot;Meiryo UI Bold&amp;quot;);font-weight: bold;}'
+'@font-face{font-family:&amp;quot;MS UI Gothic&amp;quot;;src: local(&amp;quot;Arial&amp;quot;);font-weight: normal;unicode-range:U+00-7F;}'
+'@font-face{font-family:&amp;quot;MS UI Gothic&amp;quot;;src: local(&amp;quot;Arial Bold&amp;quot;);font-weight: bold;unicode-range:U+00-7F;}'
+'@font-face{font-family:&amp;quot;MS UI Gothic&amp;quot;;src:local(&amp;quot;Noto Sans JP&amp;quot;),local(&amp;quot;Yu Gothic Medium&amp;quot;);font-weight: normal;font-feature-settings: &amp;quot;palt&amp;quot;;unicode-range:U+FF08-FF09,U+FF1A-FF1B,U+FF3B,U+FF3D,U+FF5B,U+FF5D,U+FF5F-FF60;}'
+'@font-face{font-family:&amp;quot;MS UI Gothic&amp;quot;;src:local(&amp;quot;Noto Sans JP&amp;quot;),local(&amp;quot;Yu Gothic Bold&amp;quot;);font-weight: bold;font-feature-settings: &amp;quot;palt&amp;quot;;unicode-range:U+FF08-FF09,U+FF1A-FF1B,U+FF3B,U+FF3D,U+FF5B,U+FF5D,U+FF5F-FF60;}'
+'@font-face{font-family:&amp;quot;MS PGothic&amp;quot;;src: local(null);}'
+'@font-face{font-family:&amp;quot;ＭＳ Ｐゴシック&amp;quot;;src: local(null);}'
+'@font-face{font-family:&amp;quot;MS Gothic&amp;quot;;src: local(null);}'
+'@font-face{font-family:&amp;quot;ＭＳ ゴシック&amp;quot;;src: local(null);}';
document.head.appendChild(s);
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mino90/let/kL7dzrjmgoAA">
    <link>https://let.hatelabo.jp/mino90/let/kL7dzrjmgoAA</link>
    <dc:date>2026-01-30T09:26:45Z</dc:date>
    <description>ついているはてなスターを見たり、はてなスターをつけられるあのパネルを開く</description>
    <dc:creator>mino90</dc:creator>
    <title>[Let] はてなスターパネルを開く</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bvoid%20window.open%28%27https%3A%2F%2Fs.hatena.ne.jp%2Fjs%2Fwidget%2Fentry.html%3Furl%3D%27%2BencodeURIComponent%28location.href%29%2B%27%26title%3D%27%2BencodeURIComponent%28document.title%29%2C%27_blank%27%2C%27width%3D380%2Cheight%3D480%2Cpopup%2Cnoopener%2Cnoreferrer%27%29%7D%29%28%29%3B"&gt;はてなスターパネルを開く&lt;/a&gt;&lt;pre&gt;/*
 * @title はてなスターパネルを開く
 * @description ついているはてなスターを見たり、はてなスターをつけられるあのパネルを開く
 * @include http://*
 * @license MIT License
 * @javascript_url
 */

(function(){
void(window.open('https://s.hatena.ne.jp/js/widget/entry.html?url='+encodeURIComponent(location.href)+'&amp;amp;title='+encodeURIComponent(document.title),'_blank','width=380,height=480,popup,noopener,noreferrer'));
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mino90/let/hLHWgP2DkYwo">
    <link>https://let.hatelabo.jp/mino90/let/hLHWgP2DkYwo</link>
    <dc:date>2026-01-30T09:23:14Z</dc:date>
    <description>表示中のページを小窓で表示</description>
    <dc:creator>mino90</dc:creator>
    <title>[Let] 小窓で表示</title>
    <content:encoded>&lt;a href="javascript:%28function%28%29%7Bvoid%20window.open%28location.href%2C%27_blank%27%2C%27width%3D320%2C%20height%3D480%2C%20popup%2C%20noopener%2C%20noreferrer%27%29%7D%29%28%29%3B"&gt;小窓で表示&lt;/a&gt;&lt;pre&gt;/*
 * @title 小窓で表示
 * @description 表示中のページを小窓で表示
 * @include http://*
 * @license MIT License
 * @javascript_url
 */

(function() {
void(window.open(location.href,'_blank','width=320, height=480, popup, noopener, noreferrer'));
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/furyu-tei/let/itqCwruYgMAA">
    <link>https://let.hatelabo.jp/furyu-tei/let/itqCwruYgMAA</link>
    <dc:date>2026-01-29T11:10:49Z</dc:date>
    <description>Twitterユーザーのscreen_nameからユーザーIDを取得する</description>
    <dc:creator>furyu-tei</dc:creator>
    <title>[Let] TwitterユーザーID取得</title>
    <content:encoded>&lt;a href="javascript:%28async%28%29%3D%3E%7B%27use%20strict%27%3Bconst%20error_alert%3Derror_message%3D%3E%7Bconsole.error%28error_message%29%3Balert%28error_message%29%7D%3Blet%20screen_name%3Dwindow.getSelection%28%29.toString%28%29%7C%7Cprompt%28%27Input%20screen-name%20of%20user%27%2C%27%27%29%3Bif%28screen_name%3D%3D%3Dnull%29return%3Bscreen_name%3Dscreen_name.trim%28%29.replace%28%2F%5E%40%2F%2C%27%27%29%3Bif%28%21screen_name%29%7Berror_alert%28%27screen-name%20is%20empty%27%29%3Breturn%7Dconst%20api_info%3Dawait%28async%28%29%3D%3E%7Btry%7Bconst%20main_js_url%3Ddocument.querySelector%28%27link%5Bas%3D%22script%22%5D%5Bhref%2A%3D%22main%22%5D%27%29%3F.href%3F%3Fdocument.querySelector%28%27script%5Bsrc%2A%3D%22main%22%5D%5Bsrc%24%3D%22.js%22%5D%27%29%3F.src%3Bif%28%21main_js_url%29%7Bthrow%20new%20Error%28%60URL%20of%20main%2A.js%20is%20not%20found%60%29%7Dconst%20response%3Dawait%20fetch%28main_js_url%29%3Bif%28%21response.ok%29%7Bthrow%20new%20Error%28%60HTTP%20response%20status%20code%3D%24%7Bresponse.status%7D%60%29%7Dconst%20main_js_text%3Dawait%20response.text%28%29%3Bconst%20api_info_json%3Dmain_js_text.match%28%2F%5C%7Be%5C.exports%3D%28%5C%7B%5B%5E%7D%5D%2A%3FoperationName%3A%22UserByScreenName%22%5B%5Cs%5CS%5D%2A%3F%5C%7D%29%5C%7D%2C%5Cd%2B%3Ae%3D%3E%5C%7Be.exports%2F%29%5B1%5D.replace%28%2F%28%5Cw%2B%29%28%3F%3D%3A%29%2Fg%2C%27%22%241%22%27%29%3Bconst%20api_info%3DJSON.parse%28api_info_json%29%3Breturn%20api_info%7Dcatch%28error%29%7Berror_alert%28%60Fetch%20API-Information%20failure%3A%20%24%7Berror%7D%60%29%3Breturn%20null%7D%7D%29%28%29%3Bif%28%21api_info%29return%3Bconst%20user_id%3Dawait%28async%28%29%3D%3E%7Bconst%20base_url%3D%60https%3A%2F%2Fx.com%2Fi%2Fapi%2Fgraphql%2F%24%7Bapi_info.queryId%7D%2FUserByScreenName%60%3Bconst%20api2_auth_bearer%3D%27AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%253D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA%27%3Bconst%20csrf_token%3Ddocument.cookie.match%28%2Fct0%3D%28.%2A%3F%29%28%3F%3A%3B%7C%24%29%2F%29%5B1%5D%3Bconst%20search_params%3D%7Bvariables%3A%7Bscreen_name%3Ascreen_name%2CwithGrokTranslatedBio%3Afalse%7D%2Cfeatures%3A%7Bhidden_profile_subscriptions_enabled%3Atrue%2Cprofile_label_improvements_pcf_label_in_post_enabled%3Atrue%2Cresponsive_web_profile_redirect_enabled%3Afalse%2Crweb_tipjar_consumption_enabled%3Afalse%2Cverified_phone_label_enabled%3Afalse%2Csubscriptions_verification_info_is_identity_verified_enabled%3Atrue%2Csubscriptions_verification_info_verified_since_enabled%3Atrue%2Chighlights_tweets_tab_ui_enabled%3Atrue%2Cresponsive_web_twitter_article_notes_tab_enabled%3Atrue%2Csubscriptions_feature_can_gift_premium%3Atrue%2Ccreator_subscriptions_tweet_preview_api_enabled%3Atrue%2Cresponsive_web_graphql_skip_user_profile_image_extensions_enabled%3Afalse%2Cresponsive_web_graphql_timeline_navigation_enabled%3Atrue%7D%2CfieldToggles%3A%7BwithPayments%3Afalse%2CwithAuxiliaryUserLabels%3Atrue%7D%7D%3Bconst%20url_object%3Dnew%20URL%28base_url%29%3BObject.entries%28search_params%29.forEach%28%28%28%5Bkey%2Cvalue%5D%29%3D%3E%7Burl_object.searchParams.append%28key%2CJSON.stringify%28value%29%29%7D%29%29%3Btry%7Bconst%20response%3Dawait%20fetch%28url_object.href%2C%7Bmethod%3A%27GET%27%2Cheaders%3A%7Bauthorization%3A%60Bearer%20%24%7Bapi2_auth_bearer%7D%60%2C%27x-csrf-token%27%3Acsrf_token%2C%27x-twitter-active-user%27%3A%27yes%27%2C%27x-twitter-auth-type%27%3A%27OAuth2Session%27%2C%27x-twitter-client-language%27%3A%27en%27%7D%2Cmode%3A%27cors%27%2Ccredentials%3A%27include%27%7D%29%3Bif%28%21response.ok%29%7Bthrow%20new%20Error%28%60HTTP%20response%20status%20code%3D%24%7Bresponse.status%7D%60%29%7Dconst%20user_info%3Dawait%20response.json%28%29%3Bconst%20user_id%3Duser_info%3F.data%3F.user%3F.result%3F.rest_id%3Bif%28%21user_id%29%7Bthrow%20new%20Error%28%27Response%20does%20not%20include%20the%20ID%20of%20the%20user%27%29%7Dreturn%20user_id%7Dcatch%28error%29%7Berror_alert%28%60%22%24%7Bscreen_name%7D%22%20is%20not%20found%3A%20%24%7Berror%7D%60%29%3Breturn%20null%7D%7D%29%28%29%3Bif%28%21user_id%29return%3Btry%7Bawait%20navigator.clipboard.writeText%28user_id%29%7Dcatch%28error%29%7Bconsole.error%28%60Copy%20result%20to%20clipboard%20failure%3A%20%24%7Berror%7D%60%29%7Dfinally%7Blet%20prompt_required%3Dtrue%3Btry%7Bconst%20target%3Dwindow.getSelection%28%29.anchorNode.children%5B0%5D%3Bif%28target.tagName%3D%3D%27INPUT%27%29%7Bconst%20event%3Dnew%20Event%28%27input%27%2C%7Bbubbles%3Atrue%7D%29%3Bconst%20tracker%3Dtarget._valueTracker%3Bconst%20last_value%3Dtarget.value%3Bconst%20new_value%3Dlast_value.substring%280%2Ctarget.selectionStart%29%2Buser_id%2Blast_value.substring%28target.selectionEnd%29%3Btarget.value%3Dnew_value%3Bevent.simulated%3Dtrue%3Bif%28tracker%29tracker.setValue%28last_value%29%3Btarget.dispatchEvent%28event%29%3Bprompt_required%3Dfalse%7D%7Dcatch%28error%29%7Bconsole.error%28%60Failed%20to%20rewrite%20screen%20name%20to%20user%20ID%3A%20%24%7Berror%7D%60%29%7Dif%28prompt_required%29%7Bprompt%28%60User%20ID%20of%20%24%7Bscreen_name%7D%60%2Cuser_id%29%7D%7D%7D%29%28%29%3B"&gt;TwitterユーザーID取得&lt;/a&gt;&lt;pre&gt;/*
 * @title TwitterユーザーID取得
 * @description Twitterユーザーのscreen_nameからユーザーIDを取得する
 * @include https://twitter.com/*
 * @license MIT License
 * @require 
 * @javascript_url
 */

(async () =&amp;gt; {
'use strict';

const error_alert = (error_message) =&amp;gt; {
    console.error(error_message);
    alert(error_message);
};

let screen_name = window.getSelection().toString() || prompt('Input screen-name of user', '');
if (screen_name === null) return;
screen_name = screen_name.trim().replace(/^@/, '');
if (! screen_name) {
    error_alert('screen-name is empty');
    return;
}

const api_info = await (async () =&amp;gt; {
    try {
        const main_js_url = document.querySelector('link[as=&amp;quot;script&amp;quot;][href*=&amp;quot;main&amp;quot;]')?.href ?? document.querySelector('script[src*=&amp;quot;main&amp;quot;][src$=&amp;quot;.js&amp;quot;]')?.src;
        if (! main_js_url) {
            throw new Error(`URL of main*.js is not found`);
        }
        const response = await fetch(main_js_url);
        if (! response.ok) {
            throw new Error(`HTTP response status code=${response.status}`);
        }
        const main_js_text = await response.text();
        const api_info_json = main_js_text.match(/\{e\.exports=(\{[^}]*?operationName:&amp;quot;UserByScreenName&amp;quot;[\s\S]*?\})\},\d+:e=&amp;gt;\{e.exports/)[1].replace(/(\w+)(?=:)/g, '&amp;quot;$1&amp;quot;');
        const api_info = JSON.parse(api_info_json);
        return api_info;
    }
    catch (error) {
        error_alert(`Fetch API-Information failure: ${error}`);
        return null;
    }
})();
if (! api_info) return;

const user_id = await (async () =&amp;gt; {
    const base_url = `https://x.com/i/api/graphql/${api_info.queryId}/UserByScreenName`;
    const api2_auth_bearer = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';
    const csrf_token = document.cookie.match(/ct0=(.*?)(?:;|$)/)[1];
    const search_params = {
        variables: {
            &amp;quot;screen_name&amp;quot;: screen_name,
            &amp;quot;withGrokTranslatedBio&amp;quot;: false
        },
        features: {
            &amp;quot;hidden_profile_subscriptions_enabled&amp;quot;: true,
            &amp;quot;profile_label_improvements_pcf_label_in_post_enabled&amp;quot;: true,
            &amp;quot;responsive_web_profile_redirect_enabled&amp;quot;: false,
            &amp;quot;rweb_tipjar_consumption_enabled&amp;quot;: false,
            &amp;quot;verified_phone_label_enabled&amp;quot;: false,
            &amp;quot;subscriptions_verification_info_is_identity_verified_enabled&amp;quot;: true,
            &amp;quot;subscriptions_verification_info_verified_since_enabled&amp;quot;: true,
            &amp;quot;highlights_tweets_tab_ui_enabled&amp;quot;: true,
            &amp;quot;responsive_web_twitter_article_notes_tab_enabled&amp;quot;: true,
            &amp;quot;subscriptions_feature_can_gift_premium&amp;quot;: true,
            &amp;quot;creator_subscriptions_tweet_preview_api_enabled&amp;quot;: true,
            &amp;quot;responsive_web_graphql_skip_user_profile_image_extensions_enabled&amp;quot;: false,
            &amp;quot;responsive_web_graphql_timeline_navigation_enabled&amp;quot;: true
        },
        fieldToggles: {
            &amp;quot;withPayments&amp;quot;: false,
            &amp;quot;withAuxiliaryUserLabels&amp;quot;: true
        },
    };
    const url_object = new URL(base_url);
    Object.entries(search_params).forEach(([key, value]) =&amp;gt; {
        url_object.searchParams.append(key, JSON.stringify(value));
    });
    
    try {
        const response = await fetch(url_object.href, {
            method: 'GET',
            headers: {
                'authorization': `Bearer ${api2_auth_bearer}`,
                'x-csrf-token': csrf_token,
                'x-twitter-active-user': 'yes',
                'x-twitter-auth-type': 'OAuth2Session',
                'x-twitter-client-language': 'en',
            },
            mode: 'cors',
            credentials: 'include',
        });
        if (! response.ok) {
            throw new Error(`HTTP response status code=${response.status}`);
        }
        const user_info = await response.json();
        const user_id = user_info?.data?.user?.result?.rest_id;
        
        if (! user_id) {
            throw new Error('Response does not include the ID of the user');
        }
        return user_id;
    }
    catch (error) {
        error_alert(`&amp;quot;${screen_name}&amp;quot; is not found: ${error}`);
        return null;
    }
    
})();
if (! user_id) return;

try {
    await navigator.clipboard.writeText(user_id);
}
catch (error) {
    console.error(`Copy result to clipboard failure: ${error}`);
}
finally {
    let prompt_required = true;
    try {
        const target = window.getSelection().anchorNode.children[0];
        if (target.tagName == 'INPUT') {
            const event = new Event('input', {bubbles: true});
            const tracker = target._valueTracker;
            const last_value = target.value;
            const new_value = last_value.substring(0, target.selectionStart) + user_id + last_value.substring(target.selectionEnd);
            
            target.value = new_value;
            event.simulated = true;
            if (tracker) tracker.setValue(last_value);
            target.dispatchEvent(event);
            prompt_required = false;
        }
    }
    catch (error) {
        console.error(`Failed to rewrite screen name to user ID: ${error}`);
    }
    if ( prompt_required ) {
        prompt(`User ID of ${screen_name}`, user_id);
    }
}
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mino90/let/lJyO36LWgYAA">
    <link>https://let.hatelabo.jp/mino90/let/lJyO36LWgYAA</link>
    <dc:date>2026-01-03T19:26:14Z</dc:date>
    <description>はてなフォトライフの動画ページにダウンロードリンクを表示する</description>
    <dc:creator>mino90</dc:creator>
    <title>[Let] fotolife 動画のダウンロードリンクを表示</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fmino90%2Flet%2FlJyO36LWgYAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;fotolife 動画のダウンロードリンクを表示&lt;/a&gt;&lt;pre&gt;/*
 * @title fotolife 動画のダウンロードリンクを表示
 * @description はてなフォトライフの動画ページにダウンロードリンクを表示する
 * @include https://f.hatena.ne.jp/*
 * @license MIT License
 */

// https://hatena-announce.hatenastaff.com/entries/2019/06/18
// ↑これもう忘れてそう

(function() {
if(/^https:\/\/f\.hatena\.ne\.jp\//.test(location.href) &amp;amp;&amp;amp; /movie$/.test(document.getElementById('breadcrumbs').getElementsByTagName(&amp;quot;input&amp;quot;)[0].value)){

const f = document.getElementById('foto-body');
const u = document.getElementById('foto-for-html-tag').getElementsByTagName('img')[0].src;
const flv = u.replace('.jpg','.flv');
const tgp = u.replace('.jpg','.3gp');
const tg2 = u.replace('.jpg','.3g2');

const d = document.createElement('div');
d.innerHTML='&amp;lt;a href=&amp;quot;'+flv+'&amp;quot;&amp;gt;ダウンロード(PC向け高画質/flv)&amp;lt;/a&amp;gt;'+
'&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;'+tgp+'&amp;quot;&amp;gt;ダウンロード(ガラケー向け低画質/3gp)&amp;lt;/a&amp;gt;'+
'&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;'+tg2+'&amp;quot;&amp;gt;ダウンロード(ガラケー向け低画質/3g2)&amp;lt;/a&amp;gt;';

f.getElementsByTagName('img')[0].style='';
f.appendChild(d);
}
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hadsn/let/lJvPrKmYgMAA">
    <link>https://let.hatelabo.jp/hadsn/let/lJvPrKmYgMAA</link>
    <dc:date>2026-01-02T17:46:53Z</dc:date>
    <description>フルサービス店の松屋に行きたくありませんか? 店舗リスト (https://pkg.navitime.co.jp/matsuyafoods/spot/list?category=0101) からセルフ店を除外してみましょう!</description>
    <dc:creator>hadsn</dc:creator>
    <title>[Let] 松屋フーズの店舗検索からセルフサービス店を非表示にするやつ</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhadsn%2Flet%2FlJvPrKmYgMAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;松屋フーズの店舗検索からセルフサービス店を非表示にするやつ&lt;/a&gt;&lt;pre&gt;/*
 * @title 松屋フーズの店舗検索からセルフサービス店を非表示にするやつ
 * @description フルサービス店の松屋に行きたくありませんか? 店舗リスト (https://pkg.navitime.co.jp/matsuyafoods/spot/list?category=0101) からセルフ店を除外してみましょう!
 * @include http://*
 * @license MIT License
 * @require 
 */


javascript:(() =&amp;gt;
{
	/＊店舗リストにw_7_searchresult_1_1_spot-info-list-rowというclass名がついているので列挙*/
	let shopElements = Array.from(document.getElementsByClassName(&amp;quot;w_7_searchresult_1_1_spot-info-list-row&amp;quot;));
	/*舐めてセルフサービスがついている場合捨てる*/
	shopElements.forEach((shopElement) =&amp;gt; 
	{
		let shopDetailTextCells = Array.from(shopElement.getElementsByClassName(&amp;quot;w_7_searchresult_1_1-detail-text-td&amp;quot;));
		if(shopDetailTextCells[1].innerHTML.indexOf(&amp;quot;セルフサービス&amp;quot;) != -1)
		{
			shopElement.remove();
		}
	});
}
)()&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hadsn/let/lJDuyraCgKAA">
    <link>https://let.hatelabo.jp/hadsn/let/lJDuyraCgKAA</link>
    <dc:date>2025-12-17T00:27:00Z</dc:date>
    <description>動画広告を見ろと迫ってくるサイトでお断りするためのブックマークレット</description>
    <dc:creator>hadsn</dc:creator>
    <title>[Let] 広告をご覧いただかなくても引き続きご利用いただけます</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhadsn%2Flet%2FlJDuyraCgKAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;広告をご覧いただかなくても引き続きご利用いただけます&lt;/a&gt;&lt;pre&gt;/*
 * @title 広告をご覧いただかなくても引き続きご利用いただけます
 * @description 動画広告を見ろと迫ってくるサイトでお断りするためのブックマークレット
 * @include http://*
 * @license MIT License
 * @require 
 */


javascript:(() =&amp;gt; {
	document.body.removeAttribute(&amp;quot;class&amp;quot;);
	document.body.removeAttribute(&amp;quot;style&amp;quot;);
	let element = Array.from(document.getElementsByClassName(&amp;quot;fc-monetization-dialog-container&amp;quot;));
	if (element.length &amp;gt; 1){
		window.alert(&amp;quot;削除対象のclassが1つではありません&amp;quot;);
		return 1;
	}
	else{
		if(element.length != 0){
			element[0].remove();
		}
		else{
			element = document.getElementById(&amp;quot;gn-ow-container&amp;quot;);
			if(element == null){
				window.alert(&amp;quot;削除対象のidを持つ要素がありません&amp;quot;);
			}
			else{
				element.remove();
			}
		}
	}
})()&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Lhankor_Mhy/let/jun3wcKygeAA">
    <link>https://let.hatelabo.jp/Lhankor_Mhy/let/jun3wcKygeAA</link>
    <dc:date>2025-12-01T05:19:34Z</dc:date>
    <description>メールを開いてブックマークレットを使ってからページをクリックすると、メールのパーマリンクをクリップボードにコピーします。</description>
    <dc:creator>Lhankor_Mhy</dc:creator>
    <title>[Let] Gmailのパーマリンク取得</title>
    <content:encoded>&lt;a href="javascript:%28async%28%29%3D%3E%7Bconst%20targetDataAttributeName%3D%22data-message-id%22%3Bconst%20waitForEvent%3D%28eventTarget%2CeventType%29%3D%3Enew%20Promise%28%28%28resolve%2Creject%29%3D%3EeventTarget.addEventListener%28eventType%2Cresolve%2C%7Bonce%3Atrue%2Csignal%3AAbortSignal.timeout%281e4%29%7D%29%29%29%3Blet%20targetElement%3Ddocument.querySelector%28%60%5B%24%7BtargetDataAttributeName%7D%5D%60%29%3Bif%28%21targetElement%29%7Balert%28%22%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6%E3%81%8B%E3%82%89%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%22%29%3Breturn%7Dconst%20e%3Dawait%20waitForEvent%28document%2C%27mousedown%27%29%3BtargetElement%3De.target.closest%28%60%5B%24%7BtargetDataAttributeName%7D%5D%60%29%3F%3FtargetElement%3Bconst%20threadId%3DBigInt%28targetElement%3F.getAttribute%28targetDataAttributeName%29.split%28%27%3A%27%29%5B1%5D%29.toString%2816%29%3Bnavigator.clipboard.writeText%28%60https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F%23all%2F%24%7BencodeURIComponent%28threadId%29%7D%60%29.then%28%28%28%29%3D%3Ealert%28%22%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%22%29%29%29.catch%28%28err%3D%3E%7Bconsole.error%28%22%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%22%2Cerr%29%3Balert%28%22%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%22%29%7D%29%29%7D%29%28%29%3B"&gt;Gmailのパーマリンク取得&lt;/a&gt;&lt;pre&gt;/*
 * @title Gmailのパーマリンク取得
 * @description メールを開いてブックマークレットを使ってからページをクリックすると、メールのパーマリンクをクリップボードにコピーします。
 * @include https://mail.google.com/
 * @license CC0
 * @javascript_url
 */

// HTML構造変わるの早い……

(async () =&amp;gt; {
    const targetDataAttributeName = &amp;quot;data-message-id&amp;quot;
    const waitForEvent = (eventTarget, eventType) =&amp;gt; new Promise((resolve, reject) =&amp;gt;
        eventTarget.addEventListener(eventType, resolve, { once: true, signal: AbortSignal.timeout(10000) })
    )

    let targetElement = document.querySelector(`[${targetDataAttributeName}]`);
    if (!targetElement) {
        alert(&amp;quot;メールを開いてからブックマークレットを使ってください&amp;quot;)
        return
    }

    const e = await waitForEvent(document, 'mousedown')
    targetElement = e.target.closest(`[${targetDataAttributeName}]`) ?? targetElement;
    const threadId = BigInt(targetElement?.getAttribute(targetDataAttributeName).split(':')[1]).toString(16)
    navigator.clipboard.writeText(`https://mail.google.com/mail/u/0/#all/${encodeURIComponent(threadId)}`)
        .then(() =&amp;gt; alert(&amp;quot;メールのパーマリンクをクリップボードにコピーしました&amp;quot;))
        .catch(err =&amp;gt; {
            console.error(&amp;quot;クリップボードへのコピーに失敗しました&amp;quot;, err)
            alert(&amp;quot;クリップボードへのコピーに失敗しました&amp;quot;)
        });

})()

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Lhankor_Mhy/let/jrLIsPyegeAA">
    <link>https://let.hatelabo.jp/Lhankor_Mhy/let/jrLIsPyegeAA</link>
    <dc:date>2025-11-28T09:31:53Z</dc:date>
    <description>はてなブックマークにログインしていれば、n年前のブクマページに移動します。IEでは動作せず。</description>
    <dc:creator>Lhankor_Mhy</dc:creator>
    <title>[Let] n年前のブクマを見る</title>
    <content:encoded>&lt;a href="javascript:const%20n%3D1%3Bconst%20nYearBefore%3Dnew%20Date%3BnYearBefore.setFullYear%28%28new%20Date%29.getFullYear%28%29-n%29%3Blocation.href%3D%60https%3A%2F%2Fb.hatena.ne.jp%2Fmy%2F%24%7BnYearBefore.toLocaleDateString%28%27ja-JP%27%2C%7Byear%3A%27numeric%27%2Cmonth%3A%272-digit%27%2Cday%3A%272-digit%27%7D%29.split%28%27%2F%27%29.join%28%27%27%29%7D%60%3B"&gt;n年前のブクマを見る&lt;/a&gt;&lt;pre&gt;/*
 * @title n年前のブクマを見る
 * @description はてなブックマークにログインしていれば、n年前のブクマページに移動します。IEでは動作せず。
 * @include http://*
 * @license CC0
 * @javascript_url
 */

const n=1 // n=1は1年前

const nYearBefore = new Date()
nYearBefore.setFullYear(new Date().getFullYear()-n)

location.href = 
    `https://b.hatena.ne.jp/my/${nYearBefore.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
    }).split('/').join('')}`
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mame-tanuki/let/lIPJ8uPYgoAA">
    <link>https://let.hatelabo.jp/mame-tanuki/let/lIPJ8uPYgoAA</link>
    <dc:date>2025-11-26T09:20:46Z</dc:date>
    <description>「userId」で指定したユーザーの昨日のブックマーク一覧ページを表示する</description>
    <dc:creator>mame-tanuki</dc:creator>
    <title>[Let] 昨日</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fmame-tanuki%2Flet%2FlIPJ8uPYgoAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;昨日&lt;/a&gt;&lt;pre&gt;/*
 * @title 昨日
 * @description 「userId」で指定したユーザーの昨日のブックマーク一覧ページを表示する
 * @include http://*
 * @license MIT License
 * @require 
 */


javascript:(function(){


    var userId = 'mame-tanuki';

// 1. 現在の日時を取得する
    var d = new Date();

    // 2. 日付を「昨日」に変更する
    // setDate()内で現在の日にちから1を引くことで、月跨ぎや年跨ぎも自動計算されます
    // 例: 3月1日 - 1日 = 2月28日 (または29日)
    d.setDate(d.getDate() - 1);

    // 3. URLに必要な「年」「月」「日」のパーツを作成する
    var year = d.getFullYear();

    // getMonth()は0始まり(0=1月)なので+1する
    // 頭に'0'を付けて後ろから2文字切り出す(.slice(-2))ことで、1桁の月を0埋めする(例: '9' -&amp;gt; '09')
    var month = ('0' + (d.getMonth() + 1)).slice(-2);
    
    // 日にちも同様に0埋め処理を行う
    var day = ('0' + d.getDate()).slice(-2);

    // 4. ターゲットとなるURLを組み立てる
    
    var targetUrl = 'https://b.hatena.ne.jp/' + userId + '/' + year + month + day;

    // 5. ページを移動する
    window.location.href = targetUrl;

})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hadsn/let/k_6a05vogMAA">
    <link>https://let.hatelabo.jp/hadsn/let/k_6a05vogMAA</link>
    <dc:date>2025-11-20T06:42:01Z</dc:date>
    <description>表示中のページのタイトルとURLをコピーするやつ。httpスキームではnavigator.clipboardが使えないから、その対策もあるよ</description>
    <dc:creator>hadsn</dc:creator>
    <title>[Let] CopyTitle &amp; URL</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhadsn%2Flet%2Fk_6a05vogMAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;CopyTitle &amp;amp; URL&lt;/a&gt;&lt;pre&gt;/*
 * @title CopyTitle &amp;amp; URL
 * @description 表示中のページのタイトルとURLをコピーするやつ。httpスキームではnavigator.clipboardが使えないから、その対策もあるよ
 * @include http://*
 * @license MIT License
 * @require 
 */

javascript:(() =&amp;gt; {
let myURL = document.URL;
if(!myURL.includes('?'))
{
	myURL = myURL + '?';
}
else{
	myURL = myURL + &amp;quot; .&amp;quot;;
	
}
if(!navigator.clipboard){
	prompt(&amp;quot;クリップボードを上書き出来なかった回 (セルフコピー)&amp;quot;,document.title + ' ' + myURL);
}
else{
	navigator.clipboard.writeText(document.title + ' ' + myURL);
}
})()
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/mizdra/let/k_WsxIeCgKAA">
    <link>https://let.hatelabo.jp/mizdra/let/k_WsxIeCgKAA</link>
    <dc:date>2025-11-04T06:34:43Z</dc:date>
    <description>YouTube Music で再生中の曲を X に Post する君</description>
    <dc:creator>mizdra</dc:creator>
    <title>[Let] NowPlaying for YouTube Music</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fmizdra%2Flet%2Fk_WsxIeCgKAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;NowPlaying for YouTube Music&lt;/a&gt;&lt;pre&gt;/*
 * @title NowPlaying for YouTube Music
 * @description YouTube Music で再生中の曲を X に Post する君
 * @include https://music.youtube.com/*
 * @license MIT License
 * @require 
 */
window.open(
  &amp;quot;https://x.com/intent/tweet?text=&amp;quot;
  + encodeURIComponent(
    document.querySelector(&amp;quot;.title.ytmusic-player-bar&amp;quot;).textContent
    + &amp;quot; / &amp;quot;
    + document.querySelector('.byline.ytmusic-player-bar').title.split(' • ')[0]
    + &amp;quot; #NowPlaying&amp;quot;
  )
);&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/xtetsuji/let/k8244LTIgKAA">
    <link>https://let.hatelabo.jp/xtetsuji/let/k8244LTIgKAA</link>
    <dc:date>2025-09-03T06:49:49Z</dc:date>
    <description>現在閲覧しているサイトのスクリーンショットをクリップボードに入れます</description>
    <dc:creator>xtetsuji</dc:creator>
    <title>[Let] スクリーンショットをクリップボードに入れる</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fxtetsuji%2Flet%2Fk8244LTIgKAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;スクリーンショットをクリップボードに入れる&lt;/a&gt;&lt;pre&gt;/*
 * @title スクリーンショットをクリップボードに入れる
 * @description 現在閲覧しているサイトのスクリーンショットをクリップボードに入れます
 * @include http://*
 * @license MIT License
 * @require 
 */

javascript:(async()=&amp;gt;{
  // html2canvas を読み込む（無ければCDNから）
  if(!window.html2canvas){
    await new Promise((res,rej)=&amp;gt;{
      const s=document.createElement('script');
      s.src='https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js';
      s.onload=res; s.onerror=rej; document.head.appendChild(s);
    }).catch(e=&amp;gt;{alert('html2canvas の読み込みに失敗しました'); throw e;});
  }
  try{
    const el = document.documentElement;
    const canvas = await html2canvas(el, {
      useCORS: true,
      windowWidth: el.scrollWidth,
      windowHeight: el.scrollHeight,
      scale: Math.min(2, window.devicePixelRatio || 1)
    });
    const blob = await new Promise(res=&amp;gt;canvas.toBlob(res,'image/png'));
    if(navigator.clipboard &amp;amp;&amp;amp; window.ClipboardItem){
      await navigator.clipboard.write([new ClipboardItem({'image/png': blob})]);
      alert('スクリーンショットをクリップボードにコピーしました');
    } else {
      // クリップボード非対応なら新しいタブで開く
      const url = URL.createObjectURL(blob);
      window.open(url,'_blank');
      alert('クリップボード未対応のため、画像を新しいタブで開きました');
    }
  }catch(err){
    alert('スクリーンショット取得に失敗しました: ' + (err &amp;amp;&amp;amp; err.message || err));
    console.error(err);
  }
})()

&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
