
世界では今この瞬間も、人が生まれ、亡くなり、エネルギーが使われ、CO₂が排出され、森林が失われています。
「今この瞬間の世界」は、そんな世界の動きをiPhoneのホーム画面から眺められるScriptableウィジェットです。
ウィジェットの表示内容
コード内の基準値と平均的な増減率から、時間の経過に応じた値を推計します。
サイズごとの表示
- 小:世界人口と出生・死亡などを表示します。
- 中:CO₂・エネルギー・森林などの推計も確認できます。
- 大:日本の年間値や東京ドームなどとの比較を加えて表示します。
設定手順
上から順に進めてください。コードの保存と設定のコピーに必要な操作欄は、それぞれの手順の中にあります。
- Scriptableを用意する
App StoreでScriptableを開き、iPhoneにインストールします。すでに入っている場合は次へ進んでください。
- コードをコピーして保存する
下のコード欄の「コピー」を押します。Scriptableへ移動し、「+」から新しいスクリプトを作ってコード全文を貼り付け、今この瞬間の世界などの名前で保存してください。
保存したらこのページに戻り、次の手順へ進みます。
// Variables used by Scriptable. // These must be at the very top of the file. Do not edit. // icon-color: yellow; icon-glyph: globe; // Version: 1.0.0 // ===================================================== // ⚡ 今この瞬間の世界 - Scriptable Widget // ===================================================== // // 世界で「今日」起きていることを // 年間統計から現在時刻までの推計値として表示。 // // 小:世界人口 + 今日の出生・死亡 // 中:世界人口 + 今日の5項目 // 大:世界人口 + 今日の5項目 + 身近な比較 // // ===================================================== // ===================================================== // 世界データ // ===================================================== const DATA = { // 世界人口 populationBase: 8300000000, populationGrowthYear: 70000000, // 出生・死亡 birthsYear: 132000000, deathsYear: 62000000, // CO₂ // Global Carbon Budget 2025 co2YearTonnes: 38.1e9, // エネルギー // 約623 EJ / 年 energyYearEJ: 623, // 森林減少 // FAO FRA 2025 forestLossYearHa: 10.9e6 }; // ===================================================== // 比較用データ // ===================================================== const COMPARE = { // 日本の年間CO₂排出量 japanCO2YearTonnes: 1.0e9, // 日本の年間電力消費量 japanElectricityYearTWh: 900, // 東京ドーム建築面積 // 46,755㎡ = 4.6755ha tokyoDomeHa: 4.6755 }; // ===================================================== // 時間 // ===================================================== const now = new Date(); const startOfToday = new Date( now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0 ); const secondsToday = Math.max( 0, (now.getTime() - startOfToday.getTime()) / 1000 ); const secondsYear = 365.2425 * 24 * 60 * 60; // ===================================================== // 今日の推計 // ===================================================== function estimateToday(yearValue) { return yearValue / secondsYear * secondsToday; } const birthsToday = estimateToday(DATA.birthsYear); const deathsToday = estimateToday(DATA.deathsYear); const co2Today = estimateToday(DATA.co2YearTonnes); const forestToday = estimateToday(DATA.forestLossYearHa); // ===================================================== // エネルギー // EJ → TWh // ===================================================== const energyYearTWh = DATA.energyYearEJ * 277.7777778; const energyToday = estimateToday(energyYearTWh); // ===================================================== // 世界人口 // 2026年1月1日を基準に年間純増分を加算 // ===================================================== const populationBaseDate = new Date(2026, 0, 1); const secondsFromBase = Math.max( 0, (now.getTime() - populationBaseDate.getTime()) / 1000 ); const population = DATA.populationBase + DATA.populationGrowthYear / secondsYear * secondsFromBase; // ===================================================== // 比較値 // ===================================================== // CO₂:日本の年間CO₂排出量の日平均と比較 const japanCO2PerDay = COMPARE.japanCO2YearTonnes / 365.2425; const co2JapanDays = co2Today / japanCO2PerDay; // エネルギー:日本の年間電力消費量の日平均と比較 const japanElectricityPerDay = COMPARE.japanElectricityYearTWh / 365.2425; const energyJapanDays = energyToday / japanElectricityPerDay; // 森林:東京ドーム換算 const forestTokyoDomes = forestToday / COMPARE.tokyoDomeHa; // ===================================================== // 数値フォーマット // ===================================================== function number(value) { return Math.round(value) .toLocaleString("ja-JP"); } function decimal(value, digits = 1) { return value.toLocaleString( "ja-JP", { minimumFractionDigits: digits, maximumFractionDigits: digits } ); } // ===================================================== // Widget // ===================================================== const widget = new ListWidget(); widget.backgroundColor = new Color("#0B0D12"); const family = config.widgetFamily || "medium"; // ===================================================== // Color // ===================================================== const COLOR = { white: new Color("#FFFFFF"), main: new Color("#F4F4F5"), sub: new Color("#9A9CA3"), compare: new Color("#777A82"), line: new Color("#292C33"), yellow: new Color("#FFD84D"), blue: new Color("#70B7FF"), red: new Color("#FF7474"), green: new Color("#70D69A") }; // ===================================================== // Text // ===================================================== function addText( stack, text, size, color = COLOR.white, weight = "regular" ) { const t = stack.addText(String(text)); t.font = weight === "bold" ? Font.boldSystemFont(size) : weight === "medium" ? Font.mediumSystemFont(size) : Font.systemFont(size); t.textColor = color; t.lineLimit = 1; t.minimumScaleFactor = 0.65; return t; } // ===================================================== // Header // ===================================================== function addHeader(parent, size = 12) { const row = parent.addStack(); row.layoutHorizontally(); addText( row, "⚡", size ); row.addSpacer(4); addText( row, "今この瞬間の世界", size, COLOR.white, "bold" ); } // ===================================================== // 世界人口 // 「人」は数字の下側に揃える // ===================================================== function addPopulation( parent, numberSize, labelSize = 10 ) { const label = parent.addStack(); label.layoutHorizontally(); addText( label, "🌍", labelSize ); label.addSpacer(4); addText( label, "世界人口", labelSize, COLOR.sub, "medium" ); parent.addSpacer(2); const value = parent.addStack(); value.layoutHorizontally(); // 数字と単位を下揃え value.bottomAlignContent(); addText( value, number(population), numberSize, COLOR.white, "bold" ); value.addSpacer(3); addText( value, "人", Math.max(9, numberSize * 0.4), COLOR.sub, "medium" ); } // ===================================================== // 通常データ行 // ===================================================== function addDataRow( parent, icon, label, value, unit, color, options = {} ) { const { labelSize = 10, valueSize = 13 } = options; const row = parent.addStack(); row.layoutHorizontally(); row.centerAlignContent(); // 左 const left = row.addStack(); left.layoutHorizontally(); left.centerAlignContent(); addText( left, icon, labelSize ); left.addSpacer(5); addText( left, label, labelSize, COLOR.sub, "medium" ); row.addSpacer(); // 右 const right = row.addStack(); right.layoutHorizontally(); right.centerAlignContent(); addText( right, value, valueSize, color, "bold" ); right.addSpacer(3); addText( right, unit, Math.max(8, labelSize - 1), COLOR.sub ); } // ===================================================== // 大サイズ:比較付きデータ行 // // ☁️ 今日排出されたCO₂ 70,000,000 t // 日本の年間CO₂排出 約26日分 // // ===================================================== function addCompareRow( parent, icon, label, value, unit, compareText, color ) { const block = parent.addStack(); block.layoutVertically(); // 1段目 const row = block.addStack(); row.layoutHorizontally(); row.centerAlignContent(); addText( row, icon, 11 ); row.addSpacer(6); addText( row, label, 11, COLOR.sub, "medium" ); row.addSpacer(); addText( row, value, 17, color, "bold" ); row.addSpacer(3); addText( row, unit, 10, COLOR.sub ); // 2段目 block.addSpacer(2); const compare = block.addStack(); compare.layoutHorizontally(); // アイコン分インデント compare.addSpacer(22); addText( compare, compareText, 9, COLOR.compare, "medium" ); } // ===================================================== // Divider // ===================================================== function addDivider(parent) { parent.addSpacer(6); const line = parent.addStack(); line.size = new Size(0, 1); line.backgroundColor = COLOR.line; parent.addSpacer(6); } // ===================================================== // 更新時刻 // ===================================================== function addUpdateTime(parent) { const HH = String(now.getHours()) .padStart(2, "0"); const MM = String(now.getMinutes()) .padStart(2, "0"); const row = parent.addStack(); row.layoutHorizontally(); row.addSpacer(); addText( row, `推計値・更新 ${HH}:${MM}`, 8, COLOR.sub ); } // ===================================================== // SMALL // ===================================================== function buildSmall() { widget.setPadding( 14, 14, 12, 14 ); addHeader( widget, 11 ); widget.addSpacer(10); addPopulation( widget, 19, 9 ); widget.addSpacer(); addDataRow( widget, "👶🏻", "今日生まれた人", number(birthsToday), "人", COLOR.blue, { labelSize: 8, valueSize: 11 } ); widget.addSpacer(5); addDataRow( widget, "💀", "今日亡くなった人", number(deathsToday), "人", COLOR.red, { labelSize: 8, valueSize: 11 } ); widget.addSpacer(); addUpdateTime(widget); } // ===================================================== // MEDIUM // ===================================================== function buildMedium() { widget.setPadding( 14, 16, 12, 16 ); addHeader( widget, 12 ); widget.addSpacer(8); addPopulation( widget, 23, 9 ); addDivider(widget); addDataRow( widget, "👶🏻", "今日生まれた人", number(birthsToday), "人", COLOR.blue, { labelSize: 9, valueSize: 12 } ); widget.addSpacer(4); addDataRow( widget, "💀", "今日亡くなった人", number(deathsToday), "人", COLOR.red, { labelSize: 9, valueSize: 12 } ); widget.addSpacer(4); addDataRow( widget, "☁️", "今日のCO₂", number(co2Today), "t", COLOR.main, { labelSize: 9, valueSize: 12 } ); widget.addSpacer(4); addDataRow( widget, "⚡", "今日のエネルギー", decimal(energyToday, 1), "TWh", COLOR.yellow, { labelSize: 9, valueSize: 12 } ); widget.addSpacer(4); addDataRow( widget, "🌳", "今日失われた森林", number(forestToday), "ha", COLOR.green, { labelSize: 9, valueSize: 12 } ); widget.addSpacer(); addUpdateTime(widget); } // ===================================================== // LARGE // ===================================================== function buildLarge() { widget.setPadding( 18, 18, 14, 18 ); addHeader( widget, 15 ); widget.addSpacer(14); addPopulation( widget, 32, 11 ); widget.addSpacer(4); addText( widget, "世界はいまも増え続けています", 9, COLOR.sub ); addDivider(widget); // TODAY addText( widget, "TODAY", 9, COLOR.sub, "bold" ); widget.addSpacer(9); // 出生 addDataRow( widget, "👶🏻", "今日生まれた人", number(birthsToday), "人", COLOR.blue, { labelSize: 11, valueSize: 17 } ); widget.addSpacer(8); // 死亡 addDataRow( widget, "💀", "今日亡くなった人", number(deathsToday), "人", COLOR.red, { labelSize: 11, valueSize: 17 } ); widget.addSpacer(10); // CO₂ addCompareRow( widget, "☁️", "今日排出されたCO₂", number(co2Today), "t", `日本の年間CO₂排出 約${decimal(co2JapanDays, 1)}日分`, COLOR.main ); widget.addSpacer(9); // エネルギー addCompareRow( widget, "⚡", "今日使われたエネルギー", decimal(energyToday, 1), "TWh", `日本の年間電力消費 約${decimal(energyJapanDays, 0)}日分`, COLOR.yellow ); widget.addSpacer(9); // 森林 addCompareRow( widget, "🌳", "今日失われた森林", number(forestToday), "ha", `東京ドーム 約${number(forestTokyoDomes)}個分`, COLOR.green ); widget.addSpacer(); addUpdateTime(widget); } // ===================================================== // Build // ===================================================== if (family === "small") { buildSmall(); } else if (family === "large") { buildLarge(); } else { buildMedium(); } // ===================================================== // 更新 // ===================================================== // // 5分後以降の更新をiOSへ要求。 // 実際の更新タイミングはiOS側が決定します。 // // ===================================================== widget.refreshAfterDate = new Date( Date.now() + 5 * 60 * 1000 ); // ===================================================== // Finish // ===================================================== if (config.runsInWidget) { Script.setWidget(widget); } else { if (family === "small") { await widget.presentSmall(); } else if (family === "large") { await widget.presentLarge(); } else { await widget.presentMedium(); } } Script.complete(); - ホーム画面に追加して設定する
iPhoneのホーム画面を長押しし、ウィジェット追加画面からScriptableを選びます。この記事の対応サイズの説明に合わせてサイズを選んで追加してください。
追加したウィジェットを長押しして「ウィジェットを編集」を開き、「Script」に保存したスクリプトを選びます。
「Parameter」は空欄で構いません。
編集画面を閉じて表示を確認します。ホーム画面への反映には少し時間がかかる場合があります。
大サイズでは「どれくらい?」も表示
CO₂やエネルギー、森林の数字は、桁が大きすぎてピンとこないもの。
そこで大サイズでは、身近な数字に置き換えた比較も表示します。
☁️ 今日排出されたCO₂
日本の年間CO₂排出量の約○日分
⚡ 今日使われたエネルギー
日本の年間電力消費量の約○日分
🌳 今日失われた森林
東京ドーム約○個分
数字だけでは分かりにくい世界規模の動きを、少しイメージしやすくしています。
このウィジェットについて
表示される数値は、リアルタイムに世界中の出来事を計測しているものではありません。
国連、Global Carbon Budget、IEA、FAOなどが公表している統計を基準に、1秒あたりの値へ換算し、その日の経過時間から算出した推計値です。
そのため実際の出生・死亡、CO₂排出量、エネルギー消費量、森林減少量とは異なる場合があります。
「正確なリアルタイム計測」というより、世界規模の出来事を身近に感じるためのカウンターとして楽しんでください。
更新について
ウィジェットは更新されるたびに、その時刻までの推計値を再計算します。
Scriptableから更新をリクエストしていますが、iOSウィジェットの実際の更新タイミングはiOS側によって決定されるため、一定間隔で必ず更新されるものではありません。
ウィジェット右下の「推計値・更新 ○○:○○」で、最後に計算された時刻を確認できます。
動作確認・使用結果
| 確認した端末 | iPhone 17 ProMAX |
|---|---|
| iOS | iOS27 |
| Scriptable | 1.7.19 |
| 確認したサイズ | 小・中・大 |
| バージョン | 1.0.0 |
| 動作確認日 | 2026-09-30 |
表示・使用時のポイント
コード内の基準値と平均的な増減率から、時間の経過に応じた値を推計します。表示が動いても、世界中の実測値をその瞬間に取得しているわけではありません。
更新履歴
1.0.0
- 初回リリース
よくあるエラーと対処
- 確認すること
- 表示されない場合は、ウィジェット編集画面の「Script」に保存したスクリプトが選ばれているかも確認してください。コードを貼り直すときは全文を置き換えます。
- 別の統計サイトと数値が違う
- 基準年や推計式、集計範囲が異なるためです。
- 値が同じままになる
- 更新時点までの推計を表示します。ホーム画面で常時動き続ける表示ではありません。
注意事項・制限
- 世界全体の活動をイメージするための概算です。
- 基準値はコードに保存されているため、統計の更新を反映するにはコードの更新が必要です。
- ホーム画面の更新タイミングはiOSが管理するため、操作やデータの変更がすぐに反映されない場合があります。
データ提供・参考資料
計算方式:コードに登録した人口・排出量・エネルギー・森林などの基準値と平均変化率を使用しています。本文で挙げている国連・Global Carbon Budget・IEA・FAOなどの統計を背景とする推計で、各機関からリアルタイムに取得する方式ではありません。
SHARE

