<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>JobFinder - 求人掲示板</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; background: #f4f4f4; margin: 0; }
header { background: #007bff; color: white; padding: 1rem; text-align: center; }
main { padding: 2rem; max-width: 900px; margin: auto; }
.search-bar, .post-form { background: white; padding: 1rem; border-radius: 8px; margin-bottom: 2rem; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
.job-card {
background: white; padding: 1rem; margin-bottom: 1rem;
border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
.job-card h2 { margin-top: 0; }
.job-card button {
background: #007bff; color: white;
border: none; padding: 0.5rem 1rem;
border-radius: 4px; cursor: pointer;
}
.job-card button:hover { background: #0056b3; }
.modal {
display: none; position: fixed; z-index: 999;
left: 0; top: 0; width: 100%; height: 100%;
background: rgba(0,0,0,0.5);
justify-content: center; align-items: center;
}
.modal-content {
background: white; padding: 2rem;
border-radius: 8px; max-width: 500px;
}
label, input, textarea, select {
display: block; width: 100%; margin-bottom: 10px;
}
button[type="submit"] {
background: #28a745;
color: white;
padding: 0.5rem 1rem;
border: none;
border-radius: 4px;
}
</style>
</head>
<body>
<header>
<h1>JobFinder - 求人掲示板</h1>
</header>
<main>
<!-- 🔍 検索バー -->
<div class="search-bar">
<h3>🔍 求人検索</h3>
<input type="text" id="searchLocation" placeholder="勤務地で検索(例: 東京)">
<button onclick="filterJobs()">検索</button>
</div>
<!-- 📋 求人一覧 -->
<div id="jobList"></div>
<!-- 📝 求人投稿フォーム -->
<div class="post-form">
<h3>📝 新しい求人を投稿</h3>
<input type="text" id="jobTitle" placeholder="職種(例: Webエンジニア)">
<input type="text" id="jobCompany" placeholder="会社名">
<input type="text" id="jobLocation" placeholder="勤務地(例: 東京)">
<textarea id="jobDescription" rows="3" placeholder="仕事内容を入力..."></textarea>
<button onclick="addJob()">求人を投稿</button>
</div>
</main>
<!-- 📄 モーダル -->
<div class="modal" id="jobModal">
<div class="modal-content" id="modalContent"></div>
</div>
<script>
let jobs = [
{
title: "Webエンジニア",
company: "株式会社テック",
location: "東京",
description: "ReactやVueを用いた開発。経験者優遇。"
},
{
title: "営業職",
company: "セールス株式会社",
location: "大阪",
description: "法人営業経験者歓迎。"
}
];
function displayJobs(filteredJobs = jobs) {
const jobList = document.getElementById("jobList");
jobList.innerHTML = "";
filteredJobs.forEach((job, index) => {
const card = document.createElement("div");
card.className = "job-card";
card.innerHTML = `
<h2>${job.title}</h2>
<p><strong>会社:</strong> ${job.company}</p>
<p><strong>勤務地:</strong> ${job.location}</p>
<button onclick="showDetails(${index})">詳細を見る</button>
`;
jobList.appendChild(card);
});
}
function showDetails(index) {
const job = jobs[index];
const modal = document.getElementById("jobModal");
const modalContent = document.getElementById("modalContent");
modalContent.innerHTML = `
<h2>${job.title}</h2>
<p><strong>会社:</strong> ${job.company}</p>
<p><strong>勤務地:</strong> ${job.location}</p>
<p>${job.description}</p>
<button onclick="alert('応募完了しました!')">応募する</button>
<button onclick="document.getElementById('jobModal').style.display='none'">閉じる</button>
`;
modal.style.display = "flex";
}
function addJob() {
const title = document.getElementById("jobTitle").value;
const company = document.getElementById("jobCompany").value;
const location = document.getElementById("jobLocation").value;
const description = document.getElementById("jobDescription").value;
if (title && company && location && description) {
jobs.push({ title, company, location, description });
displayJobs();
document.getElementById("jobTitle").value = "";
document.getElementById("jobCompany").value = "";
document.getElementById("jobLocation").value = "";
document.getElementById("jobDescription").value = "";
} else {
alert("すべての項目を入力してください");
}
}
function filterJobs() {
const keyword = document.getElementById("searchLocation").value.trim();
const filtered = jobs.filter(job => job.location.includes(keyword));
displayJobs(filtered);
}
// 初期表示
displayJobs();
window.onclick = function(event) {
const modal = document.getElementById("jobModal");
if (event.target === modal) {
modal.style.display = "none";
}
}
</script>
</body>
</html>
エヴァンゲリオンと宗教
🌟 主な宗教的要素と意味
1. キリスト教的象徴
- 十字架の光(爆発時の十字)
→ 神聖、犠牲、浄化を暗示する視覚的モチーフ。 - ロンギヌスの槍
→ キリストの脇腹を刺したとされる聖槍。エヴァでは“神を封じる”道具として登場。 - アダムとリリス
→ 旧約聖書に出てくる人類の起源的存在。エヴァでは人類や使徒の祖先として描かれる。 - 使徒(Angel)
→ 原義では「神の使い」。作中では人類と敵対する存在。
これらのモチーフは、特定の信仰を推奨するためではなく、“神話的なスケール感”や“終末論的世界観”を演出するための装飾的・象徴的役割を果たしています。
2. ユダヤ神秘主義(カバラ)
- セフィロトの樹(生命の樹)
→ 生命と宇宙の構造を象徴する図。人類補完計画でこれが用いられ、“人の存在の完成”を意味する。 - ゲヒナ/補完/魂の統一
→ カバラや神秘思想における“魂の還元”や“存在の統合”に類似。
3. 仏教・神道的要素
- 明確な用語は少ないものの、「個の喪失」「補完による一体化」などは、仏教の輪廻・無我観や神道における万物の霊的つながりに通じる哲学的テーマを持つ。
🎥 なぜ宗教モチーフを使ったのか?
監督の庵野秀明は以下のように語っています:
- 「カッコいいから使った」
→ 庵野自身が認めているように、宗教的な記号は雰囲気づくり、世界観の格調を上げるために用いられた。 - 「物語に深みを与えるため」
→ 日常的な学園生活や人間ドラマに対して、宇宙的スケールの背景を持たせるため。
🧠 深読みされる理由
視聴者がエヴァに宗教的・哲学的な意味を読み取るのは、以下のような構造のため:
- 明確な答えを提示しない演出
- 象徴の多用と難解な設定
- キャラクターの内面と「神」や「存在」への問い
ゲーム企画書ChronoBlade
ゲーム企画書
タイトル:「ChronoBlade(クロノブレイド)」
ジャンル:アクションRPG(時間操作×剣術バトル)
プラットフォーム:PC / コンシューマ(PS5 / Xbox) / Steam Deck
プレイ人数:1人(後に協力プレイモードを実装予定)
対象年齢:12歳以上
1. コンセプト
「時間を操る剣士」として、時を越えた世界を旅し、運命を断ち切る壮大な物語を描く。本作は、アクション性と戦略性を融合させた“時間干渉型アクションRPG”であり、時間を遅らせたり、停止したり、巻き戻す力を駆使して戦うのが最大の特徴である。
2. 世界観
――時空を壊された世界で、人々は「未来」を失った。
舞台は、時間軸が乱れた崩壊寸前の多元世界「テンペルクロノス」。各時代(中世・近未来・古代・終末世界など)を旅しながら、異なる歴史の分岐を巡り、「正しい未来」を見出していく。
3. 主人公・キャラクター
- カイ=アルデン(CV案あり)
失われた王国の騎士。時を断ち切る剣「クロノブレイド」を手に入れ、失った妹を取り戻すために旅に出る。 - ティナ=リュミエール
時の研究者。時間魔法を操ることができ、サポートキャラ兼ヒロイン。
4. ゲームシステム
● バトル
- 通常のアクションバトルに加え、「時間停止」「時間巻き戻し」「未来視(予知)」といったシステムを組み合わせる。
- コンボ攻撃とタイムスキルの組み合わせで“時空コンボ”が発動。
● フィールド探索
- 各時代の世界を自由に探索。時間の干渉によって地形や人間関係が変化。
- 例:古代で橋を作れば、未来で村が発展している、などの「因果リンク」要素。
● 成長・スキル
- 剣術・時術の2つのスキルツリー。
- 「記憶のかけら」を集めることで過去の真実や新たな能力を開放。
5. グラフィック・演出
- セミリアルな3Dアニメ調。
- UE5を使用、ナイアガラでの時間エフェクト演出を多用。
- スロー演出や巻き戻しエフェクトなど、視覚的にも時間の影響を感じられる作り。
6. 音楽・効果音
- テーマ曲は時を感じさせる幻想的な旋律。
- バトル時には緊張感あるストリングスやピアノ、スロー時にはディレイ・リバース音使用。
- サウンドディレクター案:古代祐三風を想定。
7. マネタイズ・展開案
- 本編は買い切り型。
- 追加DLC(過去の歴史エピソード)配信
- 時代スキン、ボイスパック販売
- アニメ化・小説・コミカライズメディア展開も視野に入れる
8. 想定スケジュール
| フェーズ | 内容 | 期間 |
| 企画・仕様設計 | ゲームコンセプト固め、仕様書作成 | 1〜2ヶ月 |
| プロトタイプ制作 | プレイヤー・バトルコアの試作 | 2〜3ヶ月 |
| 本開発 | ストーリー・マップ制作・演出追加 | 6ヶ月〜12ヶ月 |
| テスト・調整 | QA・デバッグ・バランス調整 | 2ヶ月 |
| リリース | 国内外展開 | 1ヶ月〜 |
9. 開発体制(案)
- ディレクター:1名
- プログラマー:2〜3名(UE5ブループリント& C++)
- デザイナー:2D/3D各1名
- サウンド:外注
- シナリオ:1名(外注可)
- デバッグ:クラウドQA導入想定
必要に応じて、企画書のPDF化・プレゼン用スライド化・イラスト付き提案資料化なども可能です。
この内容でよければ続編やDLCの企画案も作成できます。
修正点や、ジャンル・世界観・主人公の変更などご希望があればお知らせください!
4o
note風WEBサービス
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>MiniNote - Note風ブログ with フィルタ・いいね・検索機能</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body { font-family: sans-serif; background: #f9f9f9; margin: 0; }
header { background: #2c3e50; color: white; padding: 1em; text-align: center; }
nav { background: #34495e; text-align: center; padding: 0.5em; }
nav button { margin: 0 8px; padding: 8px 20px; cursor: pointer; background: #ecf0f1; border: none; border-radius: 5px; }
#main { max-width: 900px; margin: 2em auto; padding: 1em; background: white; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
article { padding: 1em; border-bottom: 1px solid #ddd; }
h2 { margin: 0.5em 0; }
.meta { font-size: 0.9em; color: #999; margin-bottom: 0.5em; }
textarea, input[type="text"] { width: 100%; padding: 10px; margin: 10px 0; border-radius: 5px; border: 1px solid #ccc; }
button.submit {
background: #3498db; color: white; border: none;
padding: 10px 20px; border-radius: 6px;
cursor: pointer; font-weight: bold;
}
.hidden { display: none; }
.tag { color: #3498db; margin-right: 5px; font-size: 0.9em; cursor: pointer; }
.actions button { margin-right: 10px; }
.like { color: #e74c3c; cursor: pointer; margin-left: 10px; }
</style>
</head>
<body>
<header><h1>📘 MiniNote - あなたのNote風ブログ</h1></header>
<nav>
<button onclick="showView('home')">🏠 ホーム</button>
<button onclick="showView('new')">✍ 新規投稿</button>
<input type="text" id="searchInput" placeholder="検索" oninput="renderPosts()" style="padding:5px; width: 200px;">
</nav>
<div id="main">
<div id="homeView">
<div id="postList"></div>
</div>
<div id="newView" class="hidden">
<h2>新しい投稿を作成</h2>
<input type="text" id="titleInput" placeholder="タイトル">
<textarea id="contentInput" rows="8" placeholder="本文"></textarea>
<input type="text" id="tagInput" placeholder="タグ(カンマ区切り)">
<button class="submit" onclick="addPost()">投稿する</button>
</div>
<div id="detailView" class="hidden">
<article>
<h2 id="detailTitle"></h2>
<div class="meta" id="detailDate"></div>
<p id="detailContent"></p>
<div id="detailTags"></div>
<div class="like" id="likeDisplay" onclick="likePost(currentIndex)">❤️ <span id="likeCount">0</span></div>
</article>
<div class="actions">
<button onclick="editPost(currentIndex)">✏ 編集</button>
<button onclick="deletePost(currentIndex)">🗑 削除</button>
<button onclick="showView('home')">← 戻る</button>
</div>
</div>
</div>
<script>
let posts = JSON.parse(localStorage.getItem("posts") || "[]");
let currentIndex = null;
let filterTag = null;
function showView(view) {
document.querySelectorAll('#main > div').forEach(div => div.classList.add('hidden'));
document.getElementById(view + "View").classList.remove("hidden");
if (view === "home") renderPosts();
}
function addPost() {
const title = document.getElementById("titleInput").value;
const content = document.getElementById("contentInput").value;
const tags = document.getElementById("tagInput").value.split(',').map(tag => tag.trim()).filter(Boolean);
if (!title || !content) return alert("タイトルと本文を入力してください");
const date = new Date().toLocaleString();
posts.unshift({ title, content, date, tags, likes: 0 });
localStorage.setItem("posts", JSON.stringify(posts));
clearForm();
showView("home");
}
function renderPosts() {
const list = document.getElementById("postList");
const search = document.getElementById("searchInput").value.toLowerCase();
list.innerHTML = "";
posts.filter(post => {
const inSearch = post.title.toLowerCase().includes(search) || post.content.toLowerCase().includes(search);
const inTag = !filterTag || post.tags.includes(filterTag);
return inSearch && inTag;
}).forEach((post, index) => {
const el = document.createElement("article");
el.innerHTML = `
<h2>${post.title}</h2>
<div class="meta">${post.date}</div>
<p>${post.content.substring(0, 80)}...</p>
<div>${post.tags.map(tag => `<span class='tag' onclick='filterByTag("${tag}")'>#${tag}</span>`).join(' ')}</div>
<div class="like">❤️ ${post.likes}</div>
<button onclick="showDetail(${index})">📖 詳細</button>
`;
list.appendChild(el);
});
}
function filterByTag(tag) {
filterTag = tag;
renderPosts();
}
function showDetail(index) {
const post = posts[index];
currentIndex = index;
document.getElementById("detailTitle").innerText = post.title;
document.getElementById("detailDate").innerText = post.date;
document.getElementById("detailContent").innerText = post.content;
document.getElementById("detailTags").innerHTML = post.tags.map(tag => `<span class='tag'>#${tag}</span>`).join(' ');
document.getElementById("likeCount").innerText = post.likes;
showView("detail");
}
function likePost(index) {
posts[index].likes++;
localStorage.setItem("posts", JSON.stringify(posts));
document.getElementById("likeCount").innerText = posts[index].likes;
renderPosts();
}
function editPost(index) {
const post = posts[index];
document.getElementById("titleInput").value = post.title;
document.getElementById("contentInput").value = post.content;
document.getElementById("tagInput").value = post.tags.join(', ');
posts.splice(index, 1);
localStorage.setItem("posts", JSON.stringify(posts));
showView("new");
}
function deletePost(index) {
if (!confirm("本当に削除しますか?")) return;
posts.splice(index, 1);
localStorage.setItem("posts", JSON.stringify(posts));
showView("home");
}
function clearForm() {
document.getElementById("titleInput").value = "";
document.getElementById("contentInput").value = "";
document.getElementById("tagInput").value = "";
}
showView("home");
</script>
</body>
</html>
TRPGシナリオ自動生成&共有
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>TRPGシナリオ自動生成&共有</title>
<style>
body {
font-family: 'Segoe UI', sans-serif;
background: #f4f4f4;
padding: 20px;
max-width: 800px;
margin: auto;
}
h1, h2 {
text-align: center;
}
select, button, textarea {
width: 100%;
padding: 10px;
margin-top: 10px;
font-size: 1rem;
}
.box {
background: #fff;
padding: 15px;
border-radius: 8px;
margin-top: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.scenario {
background: #f9f9f9;
border-left: 5px solid #4CAF50;
margin-bottom: 10px;
padding: 10px;
border-radius: 5px;
position: relative;
}
.btns {
margin-top: 10px;
display: flex;
gap: 10px;
}
.copy, .save, .delete {
cursor: pointer;
border: none;
padding: 8px 12px;
border-radius: 4px;
}
.copy { background: #2196F3; color: white; }
.save { background: #4CAF50; color: white; }
.delete { background: #f44336; color: white; }
</style>
</head>
<body>
<h1>🎲 TRPGシナリオ自動生成サイト</h1>
<div class="box">
<label>ジャンル選択:</label>
<select id="genre">
<option value="fantasy">ファンタジー</option>
<option value="horror">ホラー</option>
<option value="scifi">SF</option>
</select>
<button onclick="generateScenario()">📜 シナリオを生成する</button>
</div>
<div id="scenarioBox" class="box"></div>
<h2>🗃 保存済みシナリオ</h2>
<div id="savedScenarios" class="box"></div>
<script>
const data = {
fantasy: {
title: ["封印の迷宮", "聖騎士の試練", "魔王復活の予兆", "失われた王国"],
world: ["中世の王国", "古代の神殿", "天空都市", "エルフの森"],
incident: ["魔法の暴走", "伝説の剣の発見", "精霊の異変", "竜の襲撃"],
npc: ["若き魔導士", "忠義の騎士", "隠者の賢者", "裏切り者の巫女"],
goal: ["真実を解明せよ", "封印を強化せよ", "儀式を阻止せよ", "遺跡の謎を解け"]
},
horror: {
title: ["呪われた村", "深夜の廃病院", "封印されたビデオ", "血塗られた儀式"],
world: ["雨の山奥", "閉鎖された病院", "地下の儀式場", "忘れ去られた洋館"],
incident: ["突然の失踪事件", "見えない何かの影", "不気味な手紙", "鏡の中の誰か"],
npc: ["精神を病んだ神父", "警察官の幽霊", "語らぬ老婆", "首のない少女"],
goal: ["脱出せよ", "謎を暴け", "呪いを解け", "儀式を止めろ"]
},
scifi: {
title: ["星間戦争の火種", "機械反乱の夜", "消えた宇宙船", "記憶を失った地球"],
world: ["宇宙コロニー", "月面都市", "異星の遺跡", "サイバーパンク都市"],
incident: ["AIの暴走", "重力異常", "通信断絶", "テレポート事故"],
npc: ["サイボーグ兵士", "記憶を失った博士", "企業スパイ", "異星の子供"],
goal: ["原因を究明せよ", "AIを停止せよ", "人類を救え", "真実を暴け"]
}
};
function generateScenario() {
const genre = document.getElementById("genre").value;
const g = data[genre];
const title = rand(g.title);
const world = rand(g.world);
const incident = rand(g.incident);
const npc = rand(g.npc);
const goal = rand(g.goal);
const scenarioText = `【タイトル】${title}\n【舞台】${world}\n【事件】${incident}\n【NPC】${npc}\n【目的】${goal}`;
const html = `
<div class="scenario">
<pre>${scenarioText}</pre>
<div class="btns">
<button class="copy" onclick="copyText(\`${scenarioText.replace(/`/g, '\\`')}\`)">📋 コピー</button>
<button class="save" onclick="saveScenario(\`${scenarioText.replace(/`/g, '\\`')}\`)">💾 保存</button>
</div>
</div>
`;
document.getElementById("scenarioBox").innerHTML = html;
}
function rand(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
function copyText(text) {
navigator.clipboard.writeText(text).then(() => {
alert("コピーしました!");
});
}
function saveScenario(text) {
let saved = JSON.parse(localStorage.getItem("trpgScenarios") || "[]");
saved.push(text);
localStorage.setItem("trpgScenarios", JSON.stringify(saved));
alert("保存しました!");
showSaved();
}
function deleteScenario(index) {
let saved = JSON.parse(localStorage.getItem("trpgScenarios") || "[]");
saved.splice(index, 1);
localStorage.setItem("trpgScenarios", JSON.stringify(saved));
showSaved();
}
function showSaved() {
const box = document.getElementById("savedScenarios");
const saved = JSON.parse(localStorage.getItem("trpgScenarios") || "[]");
if (saved.length === 0) {
box.innerHTML = "<p>保存されているシナリオはありません。</p>";
return;
}
box.innerHTML = saved.map((s, i) => `
<div class="scenario">
<pre>${s}</pre>
<div class="btns">
<button class="copy" onclick="copyText(\`${s.replace(/`/g, '\\`')}\`)">📋 コピー</button>
<button class="delete" onclick="deleteScenario(${i})">🗑 削除</button>
</div>
</div>
`).join("");
}
// 初回ロード
showSaved();
</script>
</body>
</html>
MyCSSGrid
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My CSS Grid</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<ul>
<li>item 1</li>
<li>item 2 item 2 item 2 item 2 item 2</li>
<li>item 3</li>
<li>item 4</li>
</ul>
<ul>
<li>item 1</li>
<li>item 2</li>
<li>item 3 item 3 item 3 item 3</li>
<li>item 4</li>
</ul>
</div>
</body>
</html>
style.css
@charset "utf-8";
.container {
display: grid;
grid-template-columns: 200px 200px;
grid-template-rows: repeat(4, auto);
}
ul {
grid-row: span 4;
display: grid;
grid-template-rows: subgrid;
}
ドメイン検索&購入(フロントエンド)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>ドメイン検索&購入</title>
<style>
body {
font-family: sans-serif;
background: #f9f9f9;
padding: 2rem;
margin: 0;
display: flex;
justify-content: center;
}
.container {
max-width: 600px;
width: 100%;
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 4px 10px rgba(0,0,0,0.1);
}
h1 {
color: #e60033;
text-align: center;
margin-bottom: 1.5rem;
}
.form {
display: flex;
gap: 0.5rem;
margin-bottom: 1rem;
}
input {
flex: 1;
padding: 0.8rem;
border: 1px solid #ccc;
border-radius: 8px;
font-size: 1rem;
}
button {
padding: 0.8rem 1rem;
background-color: #e60033;
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
}
.result {
margin-top: 1rem;
}
.item {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #eee;
padding: 0.5rem 0;
}
.available {
color: green;
font-weight: bold;
}
.unavailable {
color: red;
font-weight: bold;
}
.buy-btn {
background-color: #0070f3;
color: white;
padding: 0.3rem 0.7rem;
border-radius: 6px;
text-decoration: none;
font-size: 0.9rem;
}
</style>
</head>
<body>
<div class="container">
<h1>ドメイン検索</h1>
<div class="form">
<input type="text" id="domainInput" placeholder="例: mydomain" />
<button onclick="search()">検索</button>
</div>
<div class="result" id="resultArea"></div>
</div>
<script>
const takenDomains = ["example.com", "mydomain.net", "taken.jp"];
const tlds = [".com", ".net", ".jp"];
function search() {
const name = document.getElementById("domainInput").value.trim().toLowerCase();
const area = document.getElementById("resultArea");
area.innerHTML = "";
if (!name) {
area.innerHTML = "<p>⚠ ドメイン名を入力してください。</p>";
return;
}
tlds.forEach(tld => {
const domain = name + tld;
const available = !takenDomains.includes(domain);
const item = document.createElement("div");
item.className = "item";
item.innerHTML = `
<span>${domain}</span>
${available
? `<span class="available">取得可能</span>
<a href="https://buy.stripe.com/test_checkout_link" class="buy-btn" target="_blank">購入する</a>`
: `<span class="unavailable">登録済み</span>`}
`;
area.appendChild(item);
});
}
</script>
</body>
</html>
ゲームBGM自動生成サービス.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>🎮 ゲームBGM自動生成サービス</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root {
--bg: #121212;
--card: #1e1e2e;
--text: #ffffff;
--accent: #ffd700;
--shadow: rgba(0, 0, 0, 0.3);
--button: #ffd700;
}
[data-theme='light'] {
--bg: #f5f5f5;
--card: #ffffff;
--text: #111;
--accent: #ff9800;
--shadow: rgba(0, 0, 0, 0.1);
--button: #ff9800;
}
body {
margin: 0;
font-family: 'Segoe UI', sans-serif;
background: var(--bg);
color: var(--text);
transition: 0.3s;
padding: 1rem;
}
header {
text-align: center;
margin-bottom: 1rem;
}
h1 {
color: var(--accent);
font-size: 2rem;
}
.container {
max-width: 600px;
margin: auto;
background: var(--card);
border-radius: 12px;
box-shadow: 0 0 10px var(--shadow);
padding: 1.5rem;
}
label {
font-weight: bold;
display: block;
margin-top: 1rem;
}
select, button {
width: 100%;
padding: 0.6rem;
margin-top: 0.5rem;
border-radius: 8px;
border: none;
font-size: 1rem;
}
button {
background: var(--button);
color: #000;
font-weight: bold;
cursor: pointer;
transition: 0.3s;
}
button:disabled {
background: #999;
cursor: not-allowed;
}
button:hover:enabled {
opacity: 0.85;
}
.desc, .msg {
margin-top: 1rem;
font-size: 0.9rem;
color: #ccc;
}
.result, .history {
margin-top: 2rem;
}
audio {
width: 100%;
margin-top: 0.5rem;
}
.visualizer {
width: 100%;
height: 4px;
background: linear-gradient(90deg, #ffd700, #ff9800);
animation: pulse 2s infinite linear;
opacity: 0;
}
.playing .visualizer {
opacity: 1;
}
@keyframes pulse {
0% { transform: scaleX(1); }
50% { transform: scaleX(1.05); }
100% { transform: scaleX(1); }
}
.toggle-theme {
text-align: right;
margin-bottom: 0.5rem;
}
.accordion {
background: transparent;
color: var(--accent);
border: none;
font-weight: bold;
cursor: pointer;
margin-top: 1rem;
width: 100%;
text-align: left;
font-size: 1rem;
}
.accordion-content {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
}
.accordion.open + .accordion-content {
max-height: 600px;
}
</style>
</head>
<body>
<header>
<h1>🎮 ゲームBGM自動生成</h1>
</header>
<div class="toggle-theme">
<button onclick="toggleTheme()">🌓 テーマ切替</button>
</div>
<div class="container">
<label for="genre">🎼 ジャンル</label>
<select id="genre" onchange="updateDescription()">
<option value="fantasy">ファンタジー</option>
<option value="cyberpunk">サイバーパンク</option>
<option value="horror">ホラー</option>
<option value="symphonic">シンフォニック</option>
</select>
<label for="mood">🎭 雰囲気</label>
<select id="mood" onchange="updateDescription()">
<option value="mysterious">神秘的</option>
<option value="sad">悲しい</option>
<option value="heroic">勇ましい</option>
<option value="fun">楽しい</option>
</select>
<div class="desc" id="descText">選択内容に応じてBGMを生成します。</div>
<button id="generateBtn" onclick="generateBGM()">🎶 BGMを生成する</button>
<div class="msg" id="msg"></div>
<div class="result" id="result" style="display:none;">
<h3>🎧 再生中のBGM</h3>
<audio controls id="player" onplay="startVisualizer()" onpause="stopVisualizer()"></audio>
<div class="visualizer" id="visualizer"></div>
</div>
<button class="accordion" onclick="toggleAccordion(this)">📜 再生履歴</button>
<div class="accordion-content" id="historyList"></div>
</div>
<script>
const descMap = {
fantasy: "魔法の世界、冒険と伝説の音楽",
cyberpunk: "近未来都市とテクノ感の融合",
horror: "不安と恐怖を煽るBGM",
symphonic: "壮大で感動的なオーケストラ風",
mysterious: "謎解き、探検にぴったり",
sad: "涙や喪失感を表現する旋律",
heroic: "勇ましさ、戦い、勝利の象徴",
fun: "軽快で明るいリズム"
};
const history = [];
const maxHistory = 5;
function updateDescription() {
const g = document.getElementById('genre').value;
const m = document.getElementById('mood').value;
document.getElementById('descText').textContent = `🧠 ${descMap[g]} × ${descMap[m]}`;
}
function generateBGM() {
const genre = document.getElementById('genre').value;
const mood = document.getElementById('mood').value;
const btn = document.getElementById('generateBtn');
const player = document.getElementById('player');
const msg = document.getElementById('msg');
const result = document.getElementById('result');
btn.disabled = true;
msg.textContent = "⏳ BGMを生成中...";
const url = `https://example.com/bgm/${genre}_${mood}_${Math.floor(Math.random()*3)+1}.mp3`;
setTimeout(() => {
msg.textContent = "✅ BGM生成完了!再生できます。";
player.src = url;
result.style.display = 'block';
// 保存履歴
history.unshift({ genre, mood, url });
if (history.length > maxHistory) history.pop();
renderHistory();
btn.disabled = false;
}, 1500);
}
function renderHistory() {
const list = document.getElementById('historyList');
list.innerHTML = "";
history.forEach(item => {
const div = document.createElement('div');
div.innerHTML = `<strong>${item.genre} × ${item.mood}</strong><br><audio controls src="${item.url}"></audio><hr>`;
list.appendChild(div);
});
}
function toggleTheme() {
const theme = document.documentElement.getAttribute("data-theme");
document.documentElement.setAttribute("data-theme", theme === "light" ? "dark" : "light");
}
function toggleAccordion(el) {
el.classList.toggle('open');
}
function startVisualizer() {
document.getElementById('visualizer').style.opacity = '1';
}
function stopVisualizer() {
document.getElementById('visualizer').style.opacity = '0';
}
// 初期設定
document.documentElement.setAttribute("data-theme", "dark");
updateDescription();
</script>
</body>
</html>
MyAOS.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Site</title>
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
<link rel="stylesheet" href="style.css">
</head>
<body>
<section>
<h1>記事一覧</h1>
<article>
<img src="forest.png" width="240" height="160" data-aos="my-animation">
<div class="text">
<h2>タイトル</h2>
<p>こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。</p>
</div>
</article>
<article>
<img src="forest.png" width="240" height="160">
<div class="text">
<h2>タイトル</h2>
<p>こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。</p>
</div>
</article>
<article>
<img src="forest.png" width="240" height="160">
<div class="text">
<h2>タイトル</h2>
<p>こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。</p>
</div>
</article>
</section>
<section>
<h1>お客様の声</h1>
<div class="voices">
<section data-aos="fade-up">
<h2>すばらしい</h2>
<p>素晴らしいです。素晴らしいです。</p>
</section>
<section data-aos="fade-up" data-aos-delay="300">
<h2>すばらしい</h2>
<p>素晴らしいです。素晴らしいです。</p>
</section>
<section data-aos="fade-up" data-aos-delay="600">
<h2>すばらしい</h2>
<p>素晴らしいです。素晴らしいです。</p>
</section>
</div>
</section>
<footer id="footer">
(c) dotinstall.com
</footer>
<a href="#" class="to-top" data-aos="fade-up" data-aos-anchor="#footer" data-aos-offset="0">先頭へ</a>
<script src="https://unpkg.com/aos@next/dist/aos.js"></script>
<script>
AOS.init();
</script>
</body>
</html>
style.css
@charset "utf-8";
body {
margin: 0;
}
body>section {
margin: 0 32px;
}
h1 {
text-align: center;
padding: 160px 0;
}
article {
display: flex;
gap: 16px;
align-items: center;
}
article .text {
flex: 1;
}
article h2 {
margin: 0;
font-size: 22px;
}
article+article {
margin-top: 32px;
}
article:nth-child(even) {
flex-direction: row-reverse;
}
.voices {
display: flex;
gap: 16px;
}
.voices>section {
border-radius: 8px;
border: 1px solid #ccc;
padding: 16px 32px;
text-align: center;
}
footer {
margin-top: 160px;
text-align: center;
padding: 80px 0;
background: #eee;
}
.to-top {
position: fixed;
bottom: 16px;
right: 16px;
}
日本の少子化問題について
🔴 現状
- 出生数の急減:2023年の出生数は75万人を下回り、過去最少を更新。
- 合計特殊出生率(TFR):2023年は1.2前後と推定され、人口を維持するための2.07を大きく下回る。
- 人口減少社会:日本の総人口は2008年をピークに減少傾向が続いており、高齢者比率が上昇中。
🟡 主な原因
- 晩婚化・非婚化:
- 結婚年齢が上昇し、そもそも結婚しない人が増加。
- 結婚しない → 子どもを持たない傾向が強い。
- 経済的不安:
- 低賃金・非正規雇用の増加。
- 子育て・教育費が高く、将来に対する不安が子どもを持つことへの障壁に。
- 育児と仕事の両立の困難さ:
- 長時間労働・保育施設不足・女性のキャリア中断リスク。
- 都市部での生活環境の厳しさ:
- 住宅コストの高さ、保育所の待機児童問題。
🔵 影響
- 労働力の減少 → 経済縮小。
- 社会保障制度の負担増 → 現役世代の負担が過重に。
- 地域の衰退 → 過疎化、空き家増加、地方消滅の危機。
🟢 対策(実施・検討中)
- 経済支援:
- 児童手当の拡充、出産育児一時金の増額。
- 育児環境の改善:
- 保育所の整備、育休制度の拡充(男性育休取得の促進)。
- 働き方改革:
- 長時間労働の是正、テレワークの推進。
- 婚活・出会い支援:
- 自治体によるマッチング支援など。
