Lorem Ipsum(ダミーテキスト)完全ガイド2025|デザインとレイアウトの必須ツール
Lorem Ipsumの歴史から最新活用法まで完全解説。日本語ダミーテキスト、業界別サンプル、多言語対応など、デザイナー・開発者必携のダミーテキスト生成テクニック。
19分で読む
Lorem Ipsum(ダミーテキスト)完全ガイド2025|デザインとレイアウトの必須ツール
Lorem Ipsumが500年以上愛される理由
Lorem Ipsumは、印刷・デザイン業界で500年以上使われ続けているダミーテキストです。1500年代の活版印刷から現代のWebデザインまで、レイアウトの視覚的バランスを確認するための標準ツールとして活躍しています。
Lorem Ipsumの重要性
業界統計データ
- 92% のデザイナーがLorem Ipsumを使用
- プロトタイプの87% でダミーテキスト採用
- デザインツールの100% がLorem Ipsum機能搭載
- 年間10億回以上 Lorem Ipsum生成
なぜダミーテキストが必要なのか
- 📝 視覚的焦点の維持: コンテンツではなくデザインに集中
- 📝 レイアウト検証: 様々な文章量でのデザイン確認
- 📝 クライアント提案: 実コンテンツ前のビジュアル共有
- 📝 開発効率化: コンテンツ待ちなしで作業進行
i4u Lorem Ipsumジェネレーターは、これらすべてのニーズに対応した多機能ツールです。
Lorem Ipsumの歴史と起源
起源:キケロの「善悪の極限について」
原文(紀元前45年):
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet,
consectetur, adipisci velit..."
翻訳:
"苦痛そのものを愛する者、追求する者、
手に入れたいと願う者など誰もいない..."
歴史的変遷
| 時代 | 出来事 | 影響 |
|---|---|---|
| 紀元前45年 | キケロが原文執筆 | 哲学的テキストの誕生 |
| 1500年代 | 活版印刷で使用開始 | 印刷業界の標準に |
| 1960年代 | Letraset シートに採用 | グラフィックデザインへ普及 |
| 1980年代 | DTP ソフトウェアに搭載 | デジタル化の始まり |
| 1990年代 | Web デザインで使用開始 | インターネット時代へ |
| 2020年代 | AI 生成との融合 | 次世代ダミーテキスト |
標準Lorem Ipsum
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.
多言語ダミーテキスト
日本語ダミーテキスト
夏目漱石スタイル
吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶して
いる。吾輩はここで始めて人間というものを見た。
ビジネス文書スタイル
拝啓 時下ますますご清栄のこととお慶び申し上げます。
平素は格別のご高配を賜り、厚く御礼申し上げます。
さて、この度は弊社の新サービスについてご案内申し上げたく、
お便り差し上げました。
技術文書スタイル
本システムは、最新のクラウドネイティブアーキテクチャを採用し、
マイクロサービス設計により高い拡張性と可用性を実現しています。
コンテナオーケストレーションにはKubernetesを使用し、
CI/CDパイプラインによる継続的なデプロイメントを実現します。
中国語ダミーテキスト
这是一段用于测试和演示的虚拟文本。它没有实际意义,
但可以帮助设计师和开发人员预览布局效果。
在实际内容准备就绪之前,这些文本可以作为占位符使用。
通过使用这些虚拟文本,我们可以更好地评估设计的视觉效果。
韓国語ダミーテキスト
이것은 레이아웃을 위한 더미 텍스트입니다.
실제 내용이 준비되기 전까지 디자인과 레이아웃을 확인하는 데 사용됩니다.
다양한 길이의 문장을 통해 레이아웃의 균형을 테스트할 수 있습니다.
디자이너와 개발자가 협업할 때 매우 유용한 도구입니다.
実装ガイド
JavaScript実装
// Lorem Ipsumジェネレーター
class LoremIpsumGenerator {
constructor() {
this.words = [
'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
'adipiscing', 'elit', 'sed', 'do', 'eiusmod', 'tempor',
'incididunt', 'ut', 'labore', 'et', 'dolore', 'magna',
'aliqua', 'enim', 'ad', 'minim', 'veniam', 'quis',
'nostrud', 'exercitation', 'ullamco', 'laboris', 'nisi',
'aliquip', 'ex', 'ea', 'commodo', 'consequat', 'duis',
'aute', 'irure', 'in', 'reprehenderit', 'voluptate',
'velit', 'esse', 'cillum', 'fugiat', 'nulla', 'pariatur',
'excepteur', 'sint', 'occaecat', 'cupidatat', 'non',
'proident', 'sunt', 'culpa', 'qui', 'officia', 'deserunt',
'mollit', 'anim', 'id', 'est', 'laborum'
];
this.standardParagraph = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.';
}
generateWords(count) {
const result = [];
for (let i = 0; i < count; i++) {
const randomIndex = Math.floor(Math.random() * this.words.length);
result.push(this.words[randomIndex]);
}
return result.join(' ');
}
generateSentences(count) {
const sentences = [];
for (let i = 0; i < count; i++) {
const wordCount = Math.floor(Math.random() * 10) + 5;
let sentence = this.generateWords(wordCount);
sentence = sentence.charAt(0).toUpperCase() + sentence.slice(1) + '.';
sentences.push(sentence);
}
return sentences.join(' ');
}
generateParagraphs(count, options = {}) {
const {
startWithLorem = true,
wordsPerParagraph = 50,
sentencesPerParagraph = null
} = options;
const paragraphs = [];
for (let i = 0; i < count; i++) {
let paragraph;
if (i === 0 && startWithLorem) {
paragraph = this.standardParagraph;
if (sentencesPerParagraph) {
paragraph += ' ' + this.generateSentences(sentencesPerParagraph - 1);
}
} else {
if (sentencesPerParagraph) {
paragraph = this.generateSentences(sentencesPerParagraph);
} else {
paragraph = this.generateWords(wordsPerParagraph);
paragraph = paragraph.charAt(0).toUpperCase() + paragraph.slice(1) + '.';
}
}
paragraphs.push(paragraph);
}
return paragraphs;
}
generateList(items, type = 'ul') {
const listItems = [];
for (let i = 0; i < items; i++) {
const wordCount = Math.floor(Math.random() * 5) + 3;
listItems.push(this.generateWords(wordCount));
}
if (type === 'ul') {
return listItems.map(item => `• ${item}`).join('\n');
} else {
return listItems.map((item, index) => `${index + 1}. ${item}`).join('\n');
}
}
}
// 使用例
const generator = new LoremIpsumGenerator();
const paragraphs = generator.generateParagraphs(3);
console.log(paragraphs.join('\n\n'));
日本語ダミーテキスト生成
// 日本語ダミーテキストジェネレーター
class JapaneseDummyTextGenerator {
constructor() {
this.hiragana = [
'あいうえお', 'かきくけこ', 'さしすせそ', 'たちつてと',
'なにぬねの', 'はひふへほ', 'まみむめも', 'やゆよ',
'らりるれろ', 'わをん'
];
this.templates = {
business: [
'拝啓 {season}の候、貴社ますますご清栄のこととお慶び申し上げます。',
'平素は格別のご高配を賜り、厚く御礼申し上げます。',
'さて、この度は{topic}についてご案内申し上げたく存じます。',
'何卒よろしくお願い申し上げます。'
],
technical: [
'本システムは{technology}を採用し、{benefit}を実現しています。',
'{feature}により、{improvement}が可能となりました。',
'今後も継続的な改善を行い、{goal}を目指してまいります。'
],
casual: [
'今日は{weather}ですね。',
'{place}に行って{action}しました。',
'とても{feeling}です。',
'また{future}したいと思います。'
]
};
this.placeholders = {
season: ['春暖', '初夏', '盛夏', '初秋', '晩秋', '初冬', '厳寒'],
topic: ['新サービス', '製品リリース', 'キャンペーン', 'イベント'],
technology: ['AI', 'ブロックチェーン', 'IoT', 'クラウド', '5G'],
benefit: ['効率化', '自動化', '最適化', '高速化'],
feature: ['新機能', '改良版', 'アップデート', '拡張機能'],
improvement: ['処理速度の向上', 'ユーザビリティの改善', 'セキュリティ強化'],
goal: ['顧客満足度の向上', '業界No.1', 'グローバル展開'],
weather: ['晴れ', '曇り', '雨', '雪', '快晴'],
place: ['公園', 'カフェ', '図書館', '美術館', '海'],
action: ['散歩', '読書', '勉強', '仕事', 'リラックス'],
feeling: ['楽しかった', '嬉しかった', '感動的だった', '興味深かった'],
future: ['行き', '挑戦', '体験', '訪問']
};
}
generateSentence(template) {
return template.replace(/{(\w+)}/g, (match, key) => {
const options = this.placeholders[key];
if (options) {
return options[Math.floor(Math.random() * options.length)];
}
return match;
});
}
generate(type = 'business', count = 3) {
const templates = this.templates[type] || this.templates.business;
const result = [];
for (let i = 0; i < count; i++) {
const template = templates[Math.floor(Math.random() * templates.length)];
result.push(this.generateSentence(template));
}
return result.join('');
}
generateMixed(paragraphs = 3) {
const result = [];
for (let i = 0; i < paragraphs; i++) {
const sentences = [];
const sentenceCount = Math.floor(Math.random() * 3) + 2;
for (let j = 0; j < sentenceCount; j++) {
const types = Object.keys(this.templates);
const randomType = types[Math.floor(Math.random() * types.length)];
const templates = this.templates[randomType];
const template = templates[Math.floor(Math.random() * templates.length)];
sentences.push(this.generateSentence(template));
}
result.push(sentences.join(''));
}
return result.join('\n\n');
}
}
業界別ダミーテキスト活用
Webデザイン
<!-- ヒーローセクション -->
<section class="hero">
<h1>Lorem Ipsum Dolor Sit Amet</h1>
<p class="lead">
Consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
</p>
<button class="cta">Ut Enim Ad Minim</button>
</section>
<!-- カードレイアウト -->
<div class="card-grid">
<div class="card">
<h3>Duis Aute Irure</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<a href="#">Excepteur Sint →</a>
</div>
<!-- 繰り返し -->
</div>
モバイルアプリ
// React Native コンポーネント
const ProductCard = () => {
const dummyData = {
title: 'Lorem Ipsum Product',
price: '$99.99',
description: 'Ut enim ad minim veniam, quis nostrud exercitation.',
reviews: 4.5,
reviewCount: 128
};
return (
<View style={styles.card}>
<Image source={require('./placeholder.png')} style={styles.image} />
<Text style={styles.title}>{dummyData.title}</Text>
<Text style={styles.price}>{dummyData.price}</Text>
<Text style={styles.description}>{dummyData.description}</Text>
<Rating value={dummyData.reviews} count={dummyData.reviewCount} />
</View>
);
};
印刷デザイン
/* 雑誌レイアウト */
.magazine-layout {
column-count: 3;
column-gap: 20px;
column-rule: 1px solid #ddd;
}
.article {
break-inside: avoid;
}
.drop-cap::first-letter {
float: left;
font-size: 4em;
line-height: 0.8;
margin: 0.1em 0.1em 0 0;
}
/* Lorem ipsum dolor sit amet... のテキストで確認 */
Eメールテンプレート
<!-- メールテンプレート -->
<table width="600" cellpadding="0" cellspacing="0">
<tr>
<td style="padding: 40px 20px;">
<h1 style="font-size: 28px; margin: 0 0 20px;">
Lorem Ipsum Newsletter
</h1>
<p style="font-size: 16px; line-height: 1.5;">
Consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
</p>
<table cellpadding="10" style="margin-top: 20px;">
<tr>
<td bgcolor="#007bff" style="border-radius: 4px;">
<a href="#" style="color: white; text-decoration: none;">
Duis Aute Irure Dolor
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
高度な活用テクニック
レスポンシブデザインのテスト
// 文字数によるレイアウトテスト
class ResponsiveTextTester {
constructor() {
this.generator = new LoremIpsumGenerator();
this.breakpoints = {
mobile: { min: 10, max: 50 },
tablet: { min: 50, max: 150 },
desktop: { min: 150, max: 300 }
};
}
generateForBreakpoint(device) {
const range = this.breakpoints[device];
const wordCount = Math.floor(
Math.random() * (range.max - range.min) + range.min
);
return this.generator.generateWords(wordCount);
}
testAllBreakpoints(element) {
const devices = ['mobile', 'tablet', 'desktop'];
devices.forEach(device => {
const text = this.generateForBreakpoint(device);
const testElement = element.cloneNode(true);
testElement.textContent = text;
testElement.dataset.device = device;
document.body.appendChild(testElement);
});
}
}
多言語レイアウトテスト
// 多言語ダミーテキスト
class MultilingualDummyText {
constructor() {
this.languages = {
en: {
short: 'Lorem ipsum',
medium: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
long: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
},
ja: {
short: 'ダミーテキスト',
medium: 'これはレイアウト確認用のダミーテキストです',
long: 'これはレイアウト確認用のダミーテキストです。実際のコンテンツが入る前に、デザインやレイアウトを確認するために使用されます。'
},
de: {
short: 'Blindtext',
medium: 'Dies ist ein Blindtext für Layoutzwecke',
long: 'Dies ist ein Blindtext für Layoutzwecke. Er wird verwendet, um Design und Layout zu überprüfen, bevor der tatsächliche Inhalt eingefügt wird.'
},
ar: {
short: 'نص وهمي',
medium: 'هذا نص وهمي لأغراض التخطيط',
long: 'هذا نص وهمي يستخدم لأغراض التخطيط والتصميم. يتم استخدامه للتحقق من التصميم والتخطيط قبل إدراج المحتوى الفعلي.',
direction: 'rtl'
}
};
}
testLanguage(lang, length = 'medium') {
const text = this.languages[lang][length];
const direction = this.languages[lang].direction || 'ltr';
return {
text,
direction,
lang
};
}
applyToElement(element, lang, length) {
const data = this.testLanguage(lang, length);
element.textContent = data.text;
element.dir = data.direction;
element.lang = data.lang;
}
}
パフォーマンステスト
// 大量テキスト生成でのパフォーマンステスト
class PerformanceTextGenerator {
constructor() {
this.generator = new LoremIpsumGenerator();
}
async generateLargeDataset(paragraphs = 1000) {
return new Promise((resolve) => {
const chunks = [];
const chunkSize = 100;
const generateChunk = (start) => {
setTimeout(() => {
const chunk = this.generator.generateParagraphs(
Math.min(chunkSize, paragraphs - start)
);
chunks.push(...chunk);
if (start + chunkSize < paragraphs) {
generateChunk(start + chunkSize);
} else {
resolve(chunks);
}
}, 0);
};
generateChunk(0);
});
}
measureRenderTime(element, text) {
const startTime = performance.now();
element.textContent = text;
// 強制的にレイアウトを発生させる
element.offsetHeight;
const endTime = performance.now();
return endTime - startTime;
}
async runBenchmark() {
const sizes = [100, 500, 1000, 5000, 10000];
const results = {};
for (const size of sizes) {
const text = this.generator.generateWords(size);
const testDiv = document.createElement('div');
document.body.appendChild(testDiv);
const time = this.measureRenderTime(testDiv, text);
results[size] = time;
document.body.removeChild(testDiv);
}
return results;
}
}
SEO・アクセシビリティ配慮
スクリーンリーダー対応
<!-- aria-label で実コンテンツを示す -->
<div aria-label="Product description will be added">
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
</div>
<!-- 非表示にする場合 -->
<div aria-hidden="true">
Lorem ipsum dolor sit amet...
</div>
<!-- プレースホルダーであることを明示 -->
<div role="img" aria-label="Placeholder text">
<span class="visually-hidden">This is placeholder text</span>
Lorem ipsum dolor sit amet...
</div>
SEO対策
// 本番環境でのダミーテキスト検出・置換
class DummyTextDetector {
constructor() {
this.patterns = [
/lorem\s+ipsum/gi,
/dolor\s+sit\s+amet/gi,
/consectetur\s+adipiscing/gi,
/ダミーテキスト/g,
/サンプルテキスト/g
];
}
detectDummyText(content) {
return this.patterns.some(pattern => pattern.test(content));
}
replaceDummyText(content, replacement = '') {
let result = content;
this.patterns.forEach(pattern => {
result = result.replace(pattern, replacement);
});
return result;
}
scanPage() {
const elements = document.querySelectorAll('p, h1, h2, h3, h4, h5, h6, li, td');
const dummyElements = [];
elements.forEach(element => {
if (this.detectDummyText(element.textContent)) {
dummyElements.push(element);
}
});
return dummyElements;
}
// 本番環境での警告
warnIfDummyTextFound() {
const dummyElements = this.scanPage();
if (dummyElements.length > 0) {
console.warn('⚠️ Dummy text found in production:', dummyElements);
if (typeof gtag !== 'undefined') {
// Google Analytics にイベント送信
gtag('event', 'dummy_text_in_production', {
count: dummyElements.length,
pages: window.location.pathname
});
}
}
}
}
// 本番環境でのチェック
if (process.env.NODE_ENV === 'production') {
const detector = new DummyTextDetector();
detector.warnIfDummyTextFound();
}
プラグイン・拡張機能
VS Code スニペット
{
"Lorem Paragraph": {
"prefix": "lorem",
"body": [
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
],
"description": "Insert Lorem Ipsum paragraph"
},
"Lorem List": {
"prefix": "lorem-list",
"body": [
"<ul>",
" <li>Lorem ipsum dolor sit amet</li>",
" <li>Consectetur adipiscing elit</li>",
" <li>Sed do eiusmod tempor</li>",
" <li>Incididunt ut labore</li>",
" <li>Et dolore magna aliqua</li>",
"</ul>"
],
"description": "Insert Lorem Ipsum list"
},
"Japanese Dummy": {
"prefix": "dummy-ja",
"body": [
"これはダミーテキストです。実際のコンテンツが入るまでの仮の文章として使用されます。"
],
"description": "Insert Japanese dummy text"
}
}
WordPress プラグイン
<?php
/**
* Plugin Name: Custom Lorem Ipsum
* Description: カスタムLorem Ipsumショートコード
*/
function custom_lorem_shortcode($atts) {
$atts = shortcode_atts(array(
'words' => 50,
'paragraphs' => 1,
'type' => 'latin',
'start' => 'Lorem ipsum'
), $atts);
$output = '';
if ($atts['type'] === 'japanese') {
$words = array(
'これは', 'ダミー', 'テキスト', 'です', '実際の',
'コンテンツ', 'が', '入る', 'まで', 'の',
'仮の', '文章', 'として', '使用', 'されます'
);
} else {
$words = array(
'lorem', 'ipsum', 'dolor', 'sit', 'amet',
'consectetur', 'adipiscing', 'elit', 'sed', 'do'
);
}
for ($p = 0; $p < $atts['paragraphs']; $p++) {
$paragraph = '';
if ($p === 0 && $atts['start']) {
$paragraph .= $atts['start'] . ' ';
}
for ($w = 0; $w < $atts['words']; $w++) {
$paragraph .= $words[array_rand($words)] . ' ';
}
$output .= '<p>' . trim($paragraph) . '</p>';
}
return $output;
}
add_shortcode('lorem', 'custom_lorem_shortcode');
// 使用例: [lorem words="30" paragraphs="2" type="japanese"]
ベストプラクティス
デザインプロセスでの活用
// デザインステージ管理
class DesignStageManager {
constructor() {
this.stages = {
wireframe: {
textDetail: 'minimal',
useRealImages: false,
textGenerator: () => 'Lorem ipsum'
},
mockup: {
textDetail: 'medium',
useRealImages: false,
textGenerator: () => this.generateMediumText()
},
prototype: {
textDetail: 'full',
useRealImages: true,
textGenerator: () => this.generateRealisticText()
},
production: {
textDetail: 'real',
useRealImages: true,
textGenerator: null
}
};
this.currentStage = 'wireframe';
}
setStage(stage) {
this.currentStage = stage;
this.applyStageSettings();
}
generateMediumText() {
const generator = new LoremIpsumGenerator();
return generator.generateSentences(3);
}
generateRealisticText() {
// よりリアルなダミーテキスト
const templates = [
'新機能により、作業効率が{percent}%向上しました。',
'ユーザー満足度調査で{rating}点を獲得しています。',
'{days}日間の無料トライアルをご用意しています。'
];
const template = templates[Math.floor(Math.random() * templates.length)];
return template
.replace('{percent}', Math.floor(Math.random() * 50 + 20))
.replace('{rating}', (Math.random() * 2 + 3).toFixed(1))
.replace('{days}', [7, 14, 30][Math.floor(Math.random() * 3)]);
}
applyStageSettings() {
const settings = this.stages[this.currentStage];
document.querySelectorAll('[data-placeholder]').forEach(element => {
if (settings.textGenerator) {
element.textContent = settings.textGenerator();
}
});
}
}
セキュリティとプライバシー
すべての処理はブラウザ内で完結し、データは外部に送信されません。個人情報や機密データも安心してご利用いただけます。
トラブルシューティング
よくある問題
- 動作しない場合: ブラウザのキャッシュをクリアして再読み込み
- 処理が遅い場合: ファイルサイズを確認(推奨20MB以下)
- 結果が異なる場合: 入力形式と設定を確認
問題が解決しない場合は、ブラウザを最新版に更新するか、別のブラウザをお試しください。
まとめ:Lorem Ipsum活用の3原則
原則1: 目的の明確化
- デザイン検証に集中
- コンテンツから分離
- レイアウトの確認
原則2: 適切な使用
- プロトタイプ段階での活用
- 本番環境での確実な置換
- アクセシビリティへの配慮
原則3: カスタマイズ
- プロジェクトに応じた調整
- 多言語対応
- リアルなデータ量の模擬
今すぐ始める
- i4u Lorem Ipsumジェネレーターにアクセス
- 生成タイプと文字数を選択
- ダミーテキストを生成
- コピーして使用
カテゴリ別ツール
他のツールもご覧ください:
関連ツール
- テキスト変換 - テキスト処理
- 文字数カウント - 文字数計測
- HTMLエディター - HTML編集
- マークダウンエディター - Markdown編集
Lorem Ipsumで、デザインを完璧に。
i4u Lorem Ipsumジェネレーターで、プロフェッショナルなレイアウトを実現しましょう。
この記事は定期的に更新され、最新のデザイントレンドとダミーテキスト技術を反映しています。最終更新日:2025年1月24日
関連記事
2025年最新!AI画像アップスケーラー完全ガイド|低解像度画像を高画質化する方法
古い写真や低解像度画像を最新のAI技術で高画質化。無料で使えるi4u AI画像アップスケーラーの使い方から、プロレベルの活用テクニックまで徹底解説します。
12 min
2025年最新版!アプリアイコンジェネレーター完全ガイド|iOS・Android対応アイコン一括生成
アプリ開発者必見!1つの画像から全サイズのアプリアイコンを自動生成。iOS、Android、PWA対応の最新ガイドラインに準拠したアイコン作成方法を徹底解説。
10 min
カラーピッカー完全ガイド2025|デザイナー必携の色選択・管理ツール
HEX、RGB、HSL、CMYK など全形式対応のプロ仕様カラーピッカー。配色パレット生成、アクセシビリティチェック、カラーハーモニー理論まで、色彩設計のすべてを網羅。
11 min