コピペするだけ!簡単「就寝時間ナビ」
暑さに低気圧に、何かと体力が奪われる季節ですね。
水分や塩分の補給はもちろんのこと、できる限り快適な睡眠環境も確保したいところです。
睡眠のサイクルを考えて~と思わないでもないのですが、現実問題なかなか理想通りには行きません。
でも、何時に起きるには?からの目安くらいぱっとわかるようにはしておきたいのです。
それでは、作っていきます!
読ませて頂いた記事をマガジンに追加させて頂いております。
伺った際にはマガジンへの登録をさせて頂いていきますが、それはやめてほしいなどありましたら、DM / コメントで一言頂けましたら幸いです😊
ブックマークに置いとくだけ!
コピペするだけの簡単小道具!
Geminiで簡単!ツール作成!
一発作成プロンプトも紹介!
睡眠時間のサイクルを考慮して寝るなんてできてないんだけど、ちゃんと考慮したらスッキリ起きられるものなのかしら?
現実問題、理想的な時間に寝て起きるなんて難しいけど、ちょっと作ってみてほしい。
Geminiさん、さっそく作る。
入眠時間と!
起床時間から!
何時に寝たら丁度良いのかを逆算!
今すぐ寝た場合のお勧め起床時間目安も計算!
💡 睡眠のサイクルってどうなってるの?
一般的に睡眠は、深い眠りの「ノンレム睡眠」と、浅い眠り(夢を見やすい時間)の「レム睡眠」を繰り返しています。
1回のサイクルは約90分前後といわれることが多く、この周期の終わりに近いタイミングで目覚めると、比較的すっきり起きやすいとされています。
そのため、睡眠時間の目安としては
😴 理想:7時間30分(約90分×5サイクル)
💤 短め:6時間(約90分×4サイクル)
⚠ 最低限:4時間30分(約90分×3サイクル)
などがよく参考にされています。
ただし、布団に入ってから眠りにつくまでの「入眠時間(平均15〜20分程度)」や、睡眠サイクルの長さには個人差があります。
また、その日の体調や疲れ具合によっても変化するため、あくまで目安として活用するのがおすすめです。
ちなみに私自身は15~20分で眠りにつくなんて無理です😂
🛠️ 使い方(スマホ版)
1. 適当なページをブックマークする
まずは、今見ているこのページなど、何でもいいので一度ブックマークに登録します。
2. 「編集」を開く
ブックマークバーにある今作ったブックマークを長押しして、「編集」を選択します。
3. 内容を書き換える
表示された設定画面で、以下の2箇所を変更して保存します。
名前: (自分が分かりやすい名前)
URL: もともと入っているURLをすべて消して、コードを貼り付ける。
ブックマークを押すだけ簡単!
📋これを貼ります!
javascript:void((function(){ function formatTime(date) { var h = date.getHours(); var m = date.getMinutes(); var hStr = h < 10 ? "0" + h : "" + h; var mStr = m < 10 ? "0" + m : "" + m; return hStr + ":" + mStr; } function addMinutes(date, mins) { return new Date(date.getTime() + mins * 60000); } function formatDiff(diffMins) { if (diffMins < 0) { return "間に合いません"; } var h = Math.floor(diffMins / 60); var m = diffMins % 60; if (h === 0) { return "あと " + m + "分"; } return "あと " + h + "時間" + m + "分"; } function parseWakeInput(input) { if (!input) { return null; } var str = input.replace(/\s+/g, ""); if (str === "") { return null; } var h = 0; var m = 0; if (str.indexOf(":") !== -1) { var parts = str.split(":"); h = parseInt(parts[0], 10); m = parseInt(parts[1], 10); } else if (str.length === 3) { h = parseInt(str.substring(0, 1), 10); m = parseInt(str.substring(1, 3), 10); } else if (str.length === 4) { h = parseInt(str.substring(0, 2), 10); m = parseInt(str.substring(2, 4), 10); } else { h = parseInt(str, 10); m = 0; } if (isNaN(h) || isNaN(m) || h < 0 || h > 23 || m < 0 || m > 59) { return null; } return { h: h, m: m }; } var now = new Date(); var latencyInput = prompt("入眠時間(分)\n(布団に入ってから眠るまで)", "15"); var latency = parseInt(latencyInput, 10); if (isNaN(latency) || latency < 0) { latency = 15; } var wakeInput = prompt("目標の起床時間\n(例: 7, 07:00, 7:30, 730 / 空欄で『今すぐ就寝』)", "07:00"); var parsedWake = parseWakeInput(wakeInput); if (!parsedWake) { var sleepTime = addMinutes(now, latency); var wake45 = addMinutes(sleepTime, 270); var wake60 = addMinutes(sleepTime, 360); var wake75 = addMinutes(sleepTime, 450); var wake90 = addMinutes(sleepTime, 540); var msgNow = "😴 今すぐ就寝モード 😴\n\n"; msgNow += "今(" + formatTime(now) + ")布団に入った場合の起床時刻:\n"; msgNow += " △ " + formatTime(wake45) + " (4.5h) / ○ " + formatTime(wake60) + " (6.0h)\n"; msgNow += " ◎ " + formatTime(wake75) + " (7.5h) / ○ " + formatTime(wake90) + " (9.0h)\n\n"; msgNow += "※" + latency + "分後の入眠を前提としています\n"; msgNow += "※90分周期は目安です(個人差あり)"; alert(msgNow); return; } var targetWake = new Date(now.getFullYear(), now.getMonth(), now.getDate(), parsedWake.h, parsedWake.m, 0); if (targetWake.getTime() <= now.getTime()) { targetWake = addMinutes(targetWake, 1440); } var bed75 = addMinutes(targetWake, -(450 + latency)); var bed90 = addMinutes(targetWake, -(540 + latency)); var bed60 = addMinutes(targetWake, -(360 + latency)); var bed45 = addMinutes(targetWake, -(270 + latency)); var diff75 = Math.floor((bed75.getTime() - now.getTime()) / 60000); var diff90 = Math.floor((bed90.getTime() - now.getTime()) / 60000); var diff60 = Math.floor((bed60.getTime() - now.getTime()) / 60000); var diff45 = Math.floor((bed45.getTime() - now.getTime()) / 60000); var mainBed = bed75; var mainDiff = diff75; var statusText = "🟢 理想コース"; var sleepLengthText = "7時間30分"; var extraNote = ""; if (diff75 < 0) { if (diff60 >= 0) { mainBed = bed60; mainDiff = diff60; statusText = "🟡 6h確保コース"; sleepLengthText = "6時間00分"; } else { mainBed = bed45; mainDiff = diff45; statusText = "🚨 睡眠不足コース"; sleepLengthText = "4時間30分"; extraNote = "(明日昼寝推奨)"; } } var msg1 = "😴 今夜やること 😴\n\n"; msg1 += "👉 " + formatTime(mainBed) + " までに布団へ!" + extraNote + "\n"; msg1 += " (" + formatDiff(mainDiff) + ")\n\n"; msg1 += "判定: " + statusText + "\n"; msg1 += "(目標 " + formatTime(targetWake) + " 起床 / 睡眠 " + sleepLengthText + ")"; alert(msg1); if (confirm("📊 全比較・今すぐ寝た場合の起床時刻も見ますか?")) { var sleepNow = addMinutes(now, latency); var nowWake45 = addMinutes(sleepNow, 270); var nowWake60 = addMinutes(sleepNow, 360); var nowWake75 = addMinutes(sleepNow, 450); var nowWake90 = addMinutes(sleepNow, 540); var msg2 = "📊 就寝時刻の全候補\n"; msg2 += " ◎ 理想 : " + formatTime(bed75) + " (" + formatDiff(diff75) + ")\n"; msg2 += " ○ 9.0h : " + formatTime(bed90) + " (" + formatDiff(diff90) + ")\n"; msg2 += " ○ 6.0h : " + formatTime(bed60) + " (" + formatDiff(diff60) + ")\n"; msg2 += " △ 4.5h : " + formatTime(bed45) + " (" + formatDiff(diff45) + ")\n\n"; msg2 += "⏰ 今(" + formatTime(now) + ")寝た場合の起床時刻\n"; msg2 += " △ " + formatTime(nowWake45) + " (4.5h) / ○ " + formatTime(nowWake60) + " (6.0h)\n"; msg2 += " ◎ " + formatTime(nowWake75) + " (7.5h) / ○ " + formatTime(nowWake90) + " (9.0h)\n\n"; msg2 += "※90分周期は目安です(個人差あり)"; alert(msg2); }})());一発作成プロンプト!
明日の目標起床時間(または現在時刻)から、今夜ユーザーが取るべき『具体的な行動(何時までに布団に入るか)』を最優先で提示する、思考レス・行動直結型の「就寝ナビ」ブックマークレットを作成してください。
一時保存や外部通信、DOM操作は禁止とし、完全なES5構文(var, functionのみ)で構成してください。
【コード構文ルール(最厳守)】
- 文字列のリテラルにはダブルクォーテーション( " )を使用してください。
- インデントには特殊空白(\u00A0等)を含めず、標準の半角スペース(\u0020)のみを使用してください。
- 関数(formatTime, addMinutes, formatDiff等)はすべて即時関数内のトップレベルで定義し、スコープエラーを防止してください。
【動作仕様および入力フロー】
1. **入眠時間(分)の指定**:
- prompt("入眠時間(分)\n(布団に入ってから眠るまで)", "15") を実行。
- キャンセル・不正入力時は自動で 15分 を代入して処理続行。
2. **目標起床時間の入力&解析**:
- prompt("目標の起床時間\n(例: 7, 07:00, 7:30, 730 / 空欄で『今すぐ就寝』)", "07:00") を実行。
- 返り値が null や空欄の場合でも、エラーを出さず自動で「今すぐ就寝モード」として処理を続行。
3. **行動ファーストのテキスト・評価判定**:
- 7.5時間以上: 🟢 理想 「◯:◯までに布団へ」
- 6時間のみ: 🟡 6h確保 「◯:◯までに布団へ」
- 4.5時間以下: 🚨 睡眠不足 「◯:◯までに布団へ(明日昼寝推奨)」
4. **2段階ダイアログ表示(1画面目: 行動命令 / 2画面目: 全比較)**:
- **【第1画面: alert()】**: 最上部に「一番伝えたい行動(◯:◯までに布団へ!)」と「あと◯分」を表示。
- **【詳細確認: confirm()】**: confirm("📊 全比較・今すぐ寝た場合の起床時刻も見ますか?") を実行。
- **【第2画面: alert()】**: 全就寝候補の一覧 & 今すぐ寝た場合の起床時刻一覧を表示。
【出力レイアウトイメージ】
--- 第1画面(要約alert) ---
😴 今夜やること 😴
👉 23:15 までに布団へ!
(あと 37分)
判定: 🟢 理想コース
(目標 07:00 起床 / 睡眠 7時間30分)
--- 第2画面(詳細alert) ---
📊 就寝時刻の全候補
◎ 理想 : 23:15 (あと 37分)
○ 9.0h : 21:45 (間に合いません)
○ 6.0h : 00:45 (あと 2時間7分)
△ 4.5h : 02:15 (あと 3時間37分)
⏰ 今(22:38)寝た場合の起床時刻
△ 03:23 (4.5h) / ○ 04:53 (6.0h)
◎ 06:23 (7.5h) / ○ 07:53 (9.0h)
※90分周期は目安です(個人差あり)
【出力形式(絶対厳守)】
- 解説テキストや前置き文は一切出力しないでください。
- 全体を `javascript:void((function(){ ... })());` のラッパー構造で記述し、単一コードブロックのみを出力してください。この記事について!
今更ながら、Gemini 3分クッキング記事について注意点など|へろん
PR記事を書かせて頂いています!
何でもどうぞ!答えられるものは全て答えます!
設置はお済みですか?図らずも人の庭でnote質問箱を試す!|へろん
メンバーシップ始めました!
まだ手探りですが、ご要望/無茶振り/質問、可能な限りお受けします!
参加させて頂いています!是非チェックしてみてください😆
有料ツールに挑戦中!
OBS Studio用リモコン | OBS画面を前面に出さずに操作できます!
小道具すべて、こちらに置きました!
☕ お時間あればこちらも是非!
気に入ったらスキ、フォローよろしくお願いします!
note外から見にきてくださったかたも、もしよければハートマーク押して頂けたら励みになります😊
いいなと思ったら応援しよう!
いつも応援ありがとうございます!
快適な制作を進めるためのおやつ活動費に使わせて頂きます!