見出し画像

コピペするだけ!簡単「クーリングナビ」

水分塩分をこまめに取りましょう!

暑さや日差しに気をつけましょう!

とは言うものの、それでも体がだるくなってしまうことってありますよね。


他の誰でもない、私がまさにそれです!


発熱しているわけではないのですが、なんか熱っぽさやだるさが抜けず、イマイチ頭が働かない。

そんな時には、ちょっとからだを冷やしてみるのがいいのかもしれません。


読ませて頂いた記事をマガジンに追加させて頂いております。

伺った際にはマガジンへの登録をさせて頂いていきますが、それはやめてほしいなどありましたら、DM / コメントで一言頂けましたら幸いです😊


ブックマークに置いとくだけ!

コピペするだけの簡単小道具!

Geminiで簡単!ツール作成!

一発作成プロンプトも紹介!


だるいしんどい熱っぽい喉がおかしい。
Geminiさんに相談すると「病院へ行ってください」と言われました。

もちろんそれは正しい反応なのですが、今回欲しかったのは「少し体を冷やす補助になる小道具」だったので、話を軌道修正して作ってもらいました。

※このツールは応急的なセルフケアを補助するためのものです。症状が強い場合や改善しない場合は、医療機関を受診してください


冷たいペットボトルか保冷剤を用意!

ブックマークをぽちっとなすると!

5分間タイマーが起動!

1か所を長時間冷やし続けないように注意!


🛠️ 使い方(スマホ版)

1. 適当なページをブックマークする

まずは、今見ているこのページなど、何でもいいので一度ブックマークに登録します。

2. 「編集」を開く

ブックマークバーにある今作ったブックマークを長押しして、「編集」を選択します。

3. 内容を書き換える

表示された設定画面で、以下の2箇所を変更して保存します。

  • 名前: (自分が分かりやすい名前)

  • URL: もともと入っているURLをすべて消して、コードを貼り付ける

ブックマークを押すだけ簡単!


📋これを貼ります!

javascript:(function(){  try {    var w = window.open();    if (!w) return;    var d = w.document;    /* 1. Trusted Types Policy creation fallback */    var policy = null;    if (w.trustedTypes && typeof w.trustedTypes.createPolicy === 'function') {      try {        policy = w.trustedTypes.createPolicy('default', {          createHTML: function(s) { return s; },          createScript: function(s) { return s; },          createScriptURL: function(s) { return s; }        });      } catch (e) {        try {          policy = w.trustedTypes.createPolicy('bclPolicy', {            createHTML: function(s) { return s; },            createScript: function(s) { return s; },            createScriptURL: function(s) { return s; }          });        } catch (e2) {}      }    }    /* Fallback references */    var headTarget = d.head || d.getElementsByTagName('head')[0] || d.documentElement;    var bodyTarget = d.body || d.documentElement;    /* Basic document title */    d.title = "脳爆速クーリングナビ";    /* Global Body Style */    bodyTarget.style.backgroundColor = '#0f172a';    bodyTarget.style.color = '#ffffff';    bodyTarget.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif';    bodyTarget.style.display = 'flex';    bodyTarget.style.justifyContent = 'center';    bodyTarget.style.alignItems = 'center';    bodyTarget.style.minHeight = '100vh';    bodyTarget.style.margin = '0';    bodyTarget.style.padding = '16px';    bodyTarget.style.boxSizing = 'border-box';    /* Card Container */    var card = d.createElement('div');    card.style.backgroundColor = '#1e293b';    card.style.border = '1px solid #334155';    card.style.borderRadius = '16px';    card.style.maxWidth = '480px';    card.style.width = '100%';    card.style.padding = '24px';    card.style.boxShadow = '0 10px 25px -5px rgba(0, 0, 0, 0.3)';    card.style.boxSizing = 'border-box';    bodyTarget.appendChild(card);    /* Title */    var title = d.createElement('h1');    title.style.color = '#38bdf8';    title.style.fontSize = '22px';    title.style.fontWeight = 'bold';    title.style.marginTop = '0';    title.style.marginBottom = '16px';    title.style.textAlign = 'center';    title.appendChild(d.createTextNode("🧊 脳爆速クーリングナビ"));    card.appendChild(title);    /* Instruction Area */    var instructBox = d.createElement('div');    instructBox.style.marginBottom = '20px';    instructBox.style.fontSize = '15px';    instructBox.style.lineHeight = '1.6';    var subTitle = d.createElement('div');    subTitle.style.color = '#fbbf24';    subTitle.style.fontWeight = 'bold';    subTitle.style.marginBottom = '8px';    subTitle.appendChild(d.createTextNode("👉 15℃の冷たいペットボトルか保冷剤を用意!"));    instructBox.appendChild(subTitle);    var targetTitle = d.createElement('div');    targetTitle.style.fontWeight = 'bold';    targetTitle.style.marginBottom = '4px';    targetTitle.appendChild(d.createTextNode("📍 冷やす場所:"));    instructBox.appendChild(targetTitle);    var list = d.createElement('ul');    list.style.margin = '0';    list.style.paddingLeft = '24px';    list.style.color = '#e2e8f0';    var item1 = d.createElement('li');    item1.appendChild(d.createTextNode("首の両脇"));    list.appendChild(item1);    var item2 = d.createElement('li');    item2.appendChild(d.createTextNode("脇の下"));    list.appendChild(item2);    var item3 = d.createElement('li');    item3.appendChild(d.createTextNode("両手のひら(AVA血管)"));    list.appendChild(item3);    instructBox.appendChild(list);    card.appendChild(instructBox);    /* Timer Display */    var timerDisplay = d.createElement('div');    timerDisplay.style.fontFamily = 'monospace';    timerDisplay.style.fontSize = '48px';    timerDisplay.style.fontWeight = 'bold';    timerDisplay.style.color = '#ffffff';    timerDisplay.style.textAlign = 'center';    timerDisplay.style.margin = '24px 0';    timerDisplay.style.letterSpacing = '2px';    var timerText = d.createTextNode("残り 05 : 00");    timerDisplay.appendChild(timerText);    card.appendChild(timerDisplay);    /* Button Area */    var btnGroup = d.createElement('div');    btnGroup.style.display = 'flex';    btnGroup.style.gap = '12px';    var toggleBtn = d.createElement('button');    toggleBtn.style.flex = '1';    toggleBtn.style.padding = '12px 16px';    toggleBtn.style.border = 'none';    toggleBtn.style.borderRadius = '8px';    toggleBtn.style.backgroundColor = '#ef4444';    toggleBtn.style.color = '#ffffff';    toggleBtn.style.fontSize = '16px';    toggleBtn.style.fontWeight = 'bold';    toggleBtn.style.cursor = 'pointer';    var toggleBtnText = d.createTextNode("ストップ");    toggleBtn.appendChild(toggleBtnText);    var extendBtn = d.createElement('button');    extendBtn.style.flex = '1';    extendBtn.style.padding = '12px 16px';    extendBtn.style.border = 'none';    extendBtn.style.borderRadius = '8px';    extendBtn.style.backgroundColor = '#334155';    extendBtn.style.color = '#ffffff';    extendBtn.style.fontSize = '16px';    extendBtn.style.fontWeight = 'bold';    extendBtn.style.cursor = 'pointer';    extendBtn.appendChild(d.createTextNode("+5分延長"));    btnGroup.appendChild(toggleBtn);    btnGroup.appendChild(extendBtn);    card.appendChild(btnGroup);    /* Screen Wake Lock */    var wakeLock = null;    if (w.navigator && w.navigator.wakeLock) {      try {        w.navigator.wakeLock.request('screen').then(function(lock) {          wakeLock = lock;        }).catch(function() {});      } catch (e) {}    }    /* Timer Logic */    var DURATION = 300000; /* 5 minutes in ms */    var remainingTime = DURATION;    var endTime = Date.now() + remainingTime;    var isRunning = true;    var timerId = null;    function updateDisplay(ms) {      var totalSec = Math.ceil(ms / 1000);      var min = Math.floor(totalSec / 60);      var sec = totalSec % 60;      var minStr = min < 10 ? '0' + min : '' + min;      var secStr = sec < 10 ? '0' + sec : '' + sec;      timerText.nodeValue = "残り " + minStr + " : " + secStr;    }    function playAlarm() {      try {        var AudioCtx = w.AudioContext || w.webkitAudioContext;        if (!AudioCtx) return;        var ctx = new AudioCtx();        var now = ctx.currentTime;                for (var i = 0; i < 4; i++) {          var osc = ctx.createOscillator();          var gain = ctx.createGain();          osc.type = 'sine';          osc.frequency.value = 880; /* A5 note */                    var startTime = now + (i * 0.15);          var stopTime = startTime + 0.08;                    gain.gain.setValueAtTime(0.3, startTime);          gain.gain.exponentialRampToValueAtTime(0.0001, stopTime);                    osc.connect(gain);          gain.connect(ctx.destination);                    osc.start(startTime);          osc.stop(stopTime);        }      } catch (e) {}    }    function tick() {      if (!isRunning) return;      var now = Date.now();      var remaining = Math.max(0, endTime - now);      updateDisplay(remaining);      if (remaining <= 0) {        isRunning = false;        clearInterval(timerId);        toggleBtn.style.backgroundColor = '#0284c7';        toggleBtnText.nodeValue = "再スタート";        playAlarm();        setTimeout(function() {          w.alert("5分間のクーリングが終了しました!状態を確認してください。");        }, 10);      }    }    function startTimer() {      endTime = Date.now() + remainingTime;      isRunning = true;      toggleBtn.style.backgroundColor = '#ef4444';      toggleBtnText.nodeValue = "ストップ";      tick();      clearInterval(timerId);      timerId = setInterval(tick, 200);    }    function stopTimer() {      isRunning = false;      clearInterval(timerId);      remainingTime = Math.max(0, endTime - Date.now());      toggleBtn.style.backgroundColor = '#0284c7';      toggleBtnText.nodeValue = "再スタート";    }    toggleBtn.onclick = function() {      if (isRunning) {        stopTimer();      } else {        if (remainingTime <= 0) remainingTime = DURATION;        startTimer();      }    };    extendBtn.onclick = function() {      if (isRunning) {        endTime += DURATION;        tick();      } else {        remainingTime += DURATION;        updateDisplay(remainingTime);      }    };    /* Auto Start */    startTimer();  } catch(e) {}})();void(0);

一発作成プロンプト!

熱っぽい時や熱中症疑い時に、脳のオーバーヒートを防ぐため「首の両脇・脇の下・手のひら(AVA血管)」を冷やす指示と自動カウントダウン(5分間)を行う「脳爆速クーリングナビ」ブックマークレットを作成してください。

一時保存や外部通信、実行元ページへのDOM追加は完全に禁止とし、完全なES5/ES6互換構文で構成してください。

【Trusted Types (TrustedHTML / TrustedScript) 100%完全回避ルール(最厳守)】
Strict Trusted Types が有効な厳格なサイト(YouTube, Gmail, Google等)から実行しても絶対にブロックされないよう、以下のバイパス実装を徹底してください。

1. 【Trusted Types ポリシーの自動作成】
   コード冒頭で `w.trustedTypes` の存在を確認し、存在する場合は `w.trustedTypes.createPolicy`('default' または 'bclPolicy')を生成して、文字列を安全にパススルー処理できるように初期化してください(try-catchで囲む)。
2. 【TextNode による完全な非文字列挿入】
   要素へのテキスト設定時、`textContent`, `innerText`, `innerHTML` への直接代入は一切禁止とします。必ず `d.createTextNode("文字列")` でノードを生成し、`element.appendChild()` で追加してください。
3. 【CSSのTrustedScript回避】
   `<style>` タグの `textContent` への代入は禁止です。`style` 要素を head に append したのち、`style.sheet.insertRule()` を使用するか、各要素の `element.style.cssProperty` (例: `card.style.background = '#1e293b'`) へ直接JavaScriptプロパティとして設定してください。
4. 【document.write / document.open 完全禁止】

【動作・堅牢性ルール】
- `const w = window.open();` で別タブを開いた後、`const headTarget = d.head || d.getElementsByTagName('head')[0] || d.documentElement;` および `const bodyTarget = d.body || d.documentElement;` の安全なフォールバック参照を徹底してください。
- 全体を `try { ... } catch(e) {}` で囲み、`prompt()` などの同期ダイアログ呼び出しは一切行わず、タブ開いた直後に全自動で5分タイマーを開始させてください。

【バックグラウンド乖離防止&スリープ防止】
- 1秒ずつの単純減算ではなく、`const remaining = Math.max(0, endTime - Date.now());` の【絶対時刻差分計算】で残り時間をリアルタイム算出し、スマホがバックグラウンドに行っても時間がズレないようにしてください。
- 新タブ側で `w.navigator.wakeLock.request('screen')` を実行して画面消灯を物理的に防止してください(try-catch で安全にフォールバック)。
- 5分間のタイマー終了時、Web Audio API(AudioContext)でピピピピッと電子音アラームを再生し、`w.alert()` を表示してください。

【新タブ内のUIレイアウトおよびデザイン仕様】
・ 全体背景: #0f172a
・ カード背景: #1e293b (枠線 #334155, 角丸16px, マックス幅480px, 中央寄せ)
・ タイトル: 🧊 脳爆速クーリングナビ (#38bdf8 / 22px / bold)
・ クーリング指示 (すべて createTextNode で挿入):
    👉 15℃の冷たいペットボトルか保冷剤を用意! (#fbbf24)
    📍 冷やす場所:
       ・首の両脇
       ・脇の下
       ・両手のひら(AVA血管)
・ メイン表示: 残り 05 : 00 (monospace / 48px / #ffffff)
・ 操作ボタン: [ストップ / 再スタート] (#ef4444 または #0284c7) [+5分延長] (#334155)

【出力形式(絶対厳守)】
- 前置きや解説テキストは一切出力しないでください。
- 全体を `javascript:(function(){ ... })();void(0);` のラッパー構造で記述し、可読性を保った改行ありの単一コードブロックのみを出力してください。

この記事について!

今更ながら、Gemini 3分クッキング記事について注意点など|へろん


PR記事を書かせて頂いています!


何でもどうぞ!答えられるものは全て答えます!

設置はお済みですか?図らずも人の庭でnote質問箱を試す!|へろん


メンバーシップ始めました!

まだ手探りですが、ご要望/無茶振り/質問、可能な限りお受けします!


参加させて頂いています!是非チェックしてみてください😆


有料ツールに挑戦中!

OBS Studio用リモコン | OBS画面を前面に出さずに操作できます!


小道具すべて、こちらに置きました!


☕ お時間あればこちらも是非!

いいなと思ったら応援しよう!