コピペするだけ!簡単「飲み頃放置時間」
私自身は猫舌ではないので大概問題ないのですが、猫舌で熱い飲み物を避けるかた結構いらっしゃいますよね。
猫舌でなくても気にせず一気に口に入れて、うっかりのやけどには気をつけたいものです。

読ませて頂いた記事をマガジンに追加させて頂いております。
伺った際にはマガジンへの登録をさせて頂いていきますが、それはやめてほしいなどありましたら、DM / コメントで一言頂けましたら幸いです😊
ブックマークに置いとくだけ!
コピペするだけの簡単小道具!
Geminiで簡単!ツール作成!
一発作成プロンプトも紹介!
熱々のものを飲み食いしたいと思う反面、たまにやらかして怖いのが舌のやけど。
ちょっとだけ置いておけば問題ないけど、どのくらいの時間が経てば安全なのか、目安が欲しい。
Geminiさんにちょっとご相談。
ニュートンなのか法則なのか!
細かい理屈はともかくとして!
何分待てばいいのさ!
目安時間を計算してみる!

🛠️ 使い方(スマホ版)
1. 適当なページをブックマークする
まずは、今見ているこのページなど、何でもいいので一度ブックマークに登録します。
2. 「編集」を開く
ブックマークバーにある今作ったブックマークを長押しして、「編集」を選択します。
3. 内容を書き換える
表示された設定画面で、以下の2箇所を変更して保存します。
名前: (自分が分かりやすい名前)
URL: もともと入っているURLをすべて消して、コードを貼り付ける。
ブックマークを押すだけ簡単!
📋これを貼ります!
javascript:(function(){ try { var w = window.open(); if (!w) { alert("ポップアップがブロックされました。アクセスを許可してください。"); return; } var d = w.document; d.title = "☕ 飲み頃放置時間電卓"; var head = d.head || d.getElementsByTagName('head')[0] || d.documentElement; if (!head) { head = d.createElement('head'); if (d.documentElement) { d.documentElement.appendChild(head); } } var meta = d.createElement('meta'); meta.name = 'viewport'; meta.content = 'width=device-width, initial-scale=1.0'; head.appendChild(meta); var style = d.createElement('style'); style.textContent = '*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; font-family: system-ui, -apple-system, sans-serif; }\n' + 'body { background-color: #0f172a; color: #f8fafc; display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 20px; }\n' + '.card { background-color: #1e293b; border: 1px solid #334155; border-radius: 16px; width: 100%; max-width: 680px; padding: 28px; box-shadow: 0 20px 25px -5px rgba(0,0,0,0.5); }\n' + '.title { color: #38bdf8; font-size: 22px; font-weight: bold; margin-bottom: 4px; text-align: center; }\n' + '.subtitle { color: #94a3b8; font-size: 14px; text-align: center; margin-bottom: 24px; }\n' + '.input-group { margin-bottom: 20px; }\n' + '.label-row { display: flex; justify-content: space-between; margin-bottom: 8px; font-size: 14px; color: #cbd5e1; font-weight: 500; }\n' + '.val-badge { color: #38bdf8; font-weight: bold; background: #0f172a; padding: 2px 8px; border-radius: 6px; border: 1px solid #334155; }\n' + 'input[type=range] { width: 100%; height: 8px; border-radius: 4px; background: #334155; outline: none; -webkit-appearance: none; cursor: pointer; }\n' + 'input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; border-radius: 50%; background: #38bdf8; cursor: pointer; border: 2px solid #0f172a; box-shadow: 0 0 10px rgba(56,189,248,0.5); }\n' + '.vessel-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-bottom: 24px; }\n' + '.btn-vessel { background: #0f172a; border: 1px solid #334155; color: #94a3b8; padding: 12px 8px; border-radius: 10px; cursor: pointer; font-size: 13px; font-weight: bold; transition: all 0.2s; text-align: center; }\n' + '.btn-vessel:hover { border-color: #38bdf8; color: #f8fafc; }\n' + '.btn-vessel.active { background: #0284c7; border-color: #38bdf8; color: #ffffff; box-shadow: 0 0 12px rgba(56,189,248,0.4); }\n' + '.result-card { background: #0f172a; border: 1px solid #38bdf8; border-radius: 12px; padding: 20px; text-align: center; margin-bottom: 24px; }\n' + '.result-label { font-size: 13px; color: #94a3b8; margin-bottom: 6px; }\n' + '.result-val { font-size: 36px; font-weight: bold; color: #38bdf8; text-shadow: 0 0 10px rgba(56,189,248,0.3); word-break: break-all; }\n' + '.timeline-title { font-size: 14px; font-weight: bold; color: #cbd5e1; margin-bottom: 12px; }\n' + '.timeline { display: flex; flex-direction: column; gap: 10px; }\n' + '.time-step { display: flex; align-items: center; gap: 12px; font-size: 12px; }\n' + '.time-label { width: 65px; color: #94a3b8; text-align: right; flex-shrink: 0; font-weight: 500; }\n' + '.bar-bg { flex-grow: 1; height: 12px; background: #0f172a; border-radius: 6px; overflow: hidden; border: 1px solid #334155; position: relative; }\n' + '.bar-fill { height: 100%; background: linear-gradient(90deg, #38bdf8, #f43f5e); border-radius: 6px; transition: width 0.3s ease; }\n' + '.temp-label { width: 55px; color: #f8fafc; font-weight: bold; flex-shrink: 0; text-align: left; }\n' + '.disclaimer { margin-top: 16px; font-size: 11px; color: #64748b; text-align: center; line-height: 1.4; }'; head.appendChild(style); var target = d.body || d.documentElement || head; var container = d.createElement('div'); container.className = 'card'; target.appendChild(container); var title = d.createElement('div'); title.className = 'title'; title.textContent = '☕ 飲み頃放置時間電卓(ニュートンの冷却法則)'; container.appendChild(title); var subtitle = d.createElement('div'); subtitle.className = 'subtitle'; subtitle.textContent = '「熱湯が指定温度まで冷める時間を物理法則から目安計算」'; container.appendChild(subtitle); var state = { t0: 95.0, target: 60.0, env: 25.0, k: 0.055 }; var audioCtx = null; function playBeep() { try { if (!audioCtx) { var AudioCtx = w.AudioContext || w.webkitAudioContext; if (AudioCtx) audioCtx = new AudioCtx(); } if (audioCtx && audioCtx.state === 'suspended') { audioCtx.resume(); } if (!audioCtx) return; var now = audioCtx.currentTime; var osc1 = audioCtx.createOscillator(); var osc2 = audioCtx.createOscillator(); var gain = audioCtx.createGain(); osc1.type = 'sine'; osc2.type = 'sine'; osc1.frequency.setValueAtTime(1200, now); osc2.frequency.setValueAtTime(1600, now + 0.04); gain.gain.setValueAtTime(0.05, now); gain.gain.exponentialRampToValueAtTime(0.001, now + 0.08); osc1.connect(gain); osc2.connect(gain); gain.connect(audioCtx.destination); osc1.start(now); osc1.stop(now + 0.04); osc2.start(now + 0.04); osc2.stop(now + 0.08); } catch (e) {} } function createSlider(label, min, max, step, val, unit, onChange) { var group = d.createElement('div'); group.className = 'input-group'; var row = d.createElement('div'); row.className = 'label-row'; var nameSpan = d.createElement('span'); nameSpan.textContent = label; row.appendChild(nameSpan); var badge = d.createElement('span'); badge.className = 'val-badge'; badge.textContent = val.toFixed(1) + ' ' + unit; row.appendChild(badge); group.appendChild(row); var input = d.createElement('input'); input.type = 'range'; input.min = min; input.max = max; input.step = step; input.value = val; input.addEventListener('input', function() { var v = parseFloat(input.value); badge.textContent = v.toFixed(1) + ' ' + unit; playBeep(); onChange(v); }); group.appendChild(input); return group; } container.appendChild(createSlider('初期温度 (T₀)', 80, 100, 0.5, state.t0, '℃', function(v){ state.t0 = v; update(); })); container.appendChild(createSlider('目標温度 (T_target)', 40, 75, 0.5, state.target, '℃', function(v){ state.target = v; update(); })); container.appendChild(createSlider('室温 (T_env)', 10, 35, 0.5, state.env, '℃', function(v){ state.env = v; update(); })); var vesselLabelRow = d.createElement('div'); vesselLabelRow.className = 'label-row'; var vesselTitle = d.createElement('span'); vesselTitle.textContent = '容器タイプ'; vesselLabelRow.appendChild(vesselTitle); container.appendChild(vesselLabelRow); var grid = d.createElement('div'); grid.className = 'vessel-grid'; var vessels = [ { name: '☕ 陶器マグ', k: 0.055 }, { name: '🥤 紙コップ', k: 0.065 }, { name: '🧊 保温ボトル', k: 0.020 } ]; var vesselBtns = []; vessels.forEach(function(v, index) { var btn = d.createElement('button'); btn.className = 'btn-vessel' + (index === 0 ? ' active' : ''); btn.textContent = v.name; btn.addEventListener('click', function() { vesselBtns.forEach(function(b){ b.className = 'btn-vessel'; }); btn.className = 'btn-vessel active'; state.k = v.k; playBeep(); update(); }); vesselBtns.push(btn); grid.appendChild(btn); }); container.appendChild(grid); var resCard = d.createElement('div'); resCard.className = 'result-card'; var resLabel = d.createElement('div'); resLabel.className = 'result-label'; resLabel.id = 'res-label-text'; resLabel.textContent = '飲み頃(60.0℃)まで:'; resCard.appendChild(resLabel); var resVal = d.createElement('div'); resVal.className = 'result-val'; resVal.textContent = '-'; resCard.appendChild(resVal); container.appendChild(resCard); var tmTitle = d.createElement('div'); tmTitle.className = 'timeline-title'; tmTitle.textContent = '時間経過に伴う温度変化プログレス'; container.appendChild(tmTitle); var timeline = d.createElement('div'); timeline.className = 'timeline'; container.appendChild(timeline); var stepElems = []; for (var i = 0; i < 5; i++) { var stepRow = d.createElement('div'); stepRow.className = 'time-step'; var tLab = d.createElement('div'); tLab.className = 'time-label'; var bg = d.createElement('div'); bg.className = 'bar-bg'; var fill = d.createElement('div'); fill.className = 'bar-fill'; bg.appendChild(fill); var tempLab = d.createElement('div'); tempLab.className = 'temp-label'; stepRow.appendChild(tLab); stepRow.appendChild(bg); stepRow.appendChild(tempLab); timeline.appendChild(stepRow); stepElems.push({ label: tLab, fill: fill, temp: tempLab }); } var disclaimer = d.createElement('div'); disclaimer.className = 'disclaimer'; disclaimer.textContent = '※計算結果は物理法則(ニュートンの冷却法則)に基づく目安です。実際の冷却時間は飲み物の量や容器の形状、蓋の有無等により変化します。'; container.appendChild(disclaimer); function update() { resLabel.textContent = '飲み頃(' + state.target.toFixed(1) + '℃)まで:'; if (state.target <= state.env || state.t0 <= state.target) { resVal.textContent = '計算不可(設定確認)'; resVal.style.color = '#f43f5e'; for (var i = 0; i < 5; i++) { stepElems[i].label.textContent = '-'; stepElems[i].fill.style.width = '0%'; stepElems[i].temp.textContent = '-'; } return; } resVal.style.color = '#38bdf8'; var tMinutes = - (1 / state.k) * Math.log((state.target - state.env) / (state.t0 - state.env)); var totalSeconds = Math.round(tMinutes * 60); var mins = Math.floor(totalSeconds / 60); var secs = totalSeconds % 60; resVal.textContent = '約 ' + mins + '分' + (secs < 10 ? '0' : '') + secs + '秒'; for (var j = 0; j < 5; j++) { var frac = j / 4; var currentTime = tMinutes * frac; var currentTemp = state.env + (state.t0 - state.env) * Math.exp(-state.k * currentTime); var cSecs = Math.round(currentTime * 60); var cM = Math.floor(cSecs / 60); var cS = cSecs % 60; stepElems[j].label.textContent = cM + '分' + (cS < 10 ? '0' : '') + cS + '秒'; var pct = Math.max(0, Math.min(100, ((currentTemp - state.env) / (state.t0 - state.env)) * 100)); stepElems[j].fill.style.width = pct.toFixed(1) + '%'; stepElems[j].temp.textContent = currentTemp.toFixed(1) + '℃'; } } update(); } catch (e) { alert("エラーが発生しました: " + e.message); }})();void(0);一発作成プロンプト!
淹れたての熱湯(100℃や95℃等)が、室温の中で「猫舌でも飲みやすい温度(60℃等)」まで冷めるのに必要な時間(分・秒)を「ニュートンの冷却法則」を用いて目安計算し、冷却カーブとともに可視化するツール「☕ 飲み頃放置時間電卓(ニュートンの冷却法則)」を、新規タブ(別タブ)で起動するブックマークレットを作成してください。
一時保存や外部通信、実行元ページへのDOM追加は完全に禁止とし、完全なES5/ES6互換構文で構成してください。
【新規タブ生成・エラー回避の絶対最厳守ルール(最重要)】
1. `document.write()`、`innerHTML`、`outerHTML`、`insertAdjacentHTML` 等の文字列によるHTML構築は、Trusted Typesセキュリティ等でスクリプトが即死するため【完全禁止】とします。
2. 開いた新タブの `w.document` に対して、DOM要素(`document.createElement`)のみを用いて全UIを構築してください。
3. `const w = window.open();` 直後、`w.document.head` や `w.document.body` が null の場合でも絶対にエラー停止を起こさないよう、以下のフォールバック構造を徹底してください:
- `const d = w.document;`
- `const target = d.body || d.documentElement || d.head;`
- 要素追加時は安全なターゲットに対して `appendChild` を行うこと。
【熱移動・物理計算ロジック(ニュートンの冷却法則)】
- 冷却方程式: T(t) = T_env + (T_0 - T_env) * exp(-k * t)
- 入力値:
・ 初期温度 T_0 (℃) [初期値: 95.0]
・ 目標温度 T_target (℃) [初期値: 60.0]
・ 室温 T_env (℃) [初期値: 25.0]
・ 容器タイプ(☕ 陶器マグ k=0.055 / 🥤 紙コップ k=0.065 / 🧊 保温ボトル k=0.020)
- kは一般的な飲み物の冷却を想定した目安値とし、実際の冷却時間は飲み物の量、容器の形状、蓋の有無、室温などによって変化することを前提とする。
- 所要時間 t (分) の計算:
t = - (1 / k) * ln( (T_target - T_env) / (T_0 - T_env) )
- 計算結果を「約 〇 分 〇 秒」として算出。
- 結果は「精密計測」ではなく、飲み物が指定温度まで冷める時間の「目安」として扱う。
- 設定値が異常(例: 目標温度 ≦ 室温、または 初期温度 ≦ 目標温度)の場合は「計算不可(設定確認)」と表示し、`NaN` や `Infinity` による描画停止を絶対防ぐこと。
【新タブ内のUIレイアウトおよび機能】
・ 全体背景: #0f172a(ダークモード)
・ 画面中央カード: #1e293b (角丸16px, 枠線 #334155, 幅最大680px)
・ タイトル: ☕ 飲み頃放置時間電卓(ニュートンの冷却法則) (#38bdf8 / 22px / bold)
・ サブタイトル: 「熱湯が指定温度まで冷める時間を物理法則から目安計算」(#94a3b8 / 14px)
・ 入力コントロール(スライダー&数値入力):
・ 初期温度(80℃〜100℃)
・ 目標温度(40℃〜75℃)
・ 室温(10℃〜35℃)
・ 容器素材ボタン[☕ 陶器マグ][🥤 紙コップ][🧊 保温ボトル]
・ メイン出力カード:
・ 「飲み頃(〇〇℃)まで:約 〇〇分〇〇秒」を巨大表示(36px/bold/#38bdf8)
・ 視覚化エレメント:
・ 時間経過に伴う温度変化(5段階のプログレスバー&温度表示)を算出・描画。
・ 効果音機能: ボタンタップや値変更時に Web Audio API でピピッ(1200Hz/1600Hz)と高音ビープ音を鳴らす。
【出力形式(絶対厳守)】
- 解説テキストや前置き文は一切出力しないでください。
- 全体を `javascript:(function(){ ... })();void(0);` のラッパー構造で記述し、単一コードブロックのみを出力してください。この記事について!
今更ながら、Gemini 3分クッキング記事について注意点など|へろん
PR記事を書かせて頂いています!
何でもどうぞ!答えられるものは全て答えます!
設置はお済みですか?図らずも人の庭でnote質問箱を試す!|へろん
メンバーシップ始めました!
まだ手探りですが、ご要望/無茶振り/質問、可能な限りお受けします!
参加させて頂いています!是非チェックしてみてください😆
有料ツールに挑戦中!
OBS Studio用リモコン | OBS画面を前面に出さずに操作できます!
小道具すべて、こちらに置きました!
☕ お時間あればこちらも是非!

いいなと思ったら応援しよう!
いつも応援ありがとうございます!
快適な制作を進めるためのおやつ活動費に使わせて頂きます!