┌─────────────────────────────────────────────────────────────────┐ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ システム仕様書 │ │ │ │ SYSTEM SPECIFICATION DOCUMENT │ │ │ │ │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ ろひ // レガシーITエンジニア │ │ │ │ │ │ ROHI // LEGACY IT ENGINEER │ │ │ │ │ │ PORTFOLIO WEBSITE SYSTEM │ │ │ │ │ │ │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘
改訂履歴
| 版数 | 改訂日 | 改訂内容 | 改訂者 |
|---|---|---|---|
| 1.0 | 1998-04-01 | 初版作成。COBOL/JCL基本仕様、バッチ処理運用定義 | ろひ |
| 2.0 | 2002-04-01 | PL/I資産管理、DB2接続仕様、SQL最適化ガイドライン策定 | ろひ |
| 3.0 | 2006-04-01 | 金融系トランザクション処理仕様、障害対応・復旧手順標準化 | ろひ |
| 4.0 | 2010-04-01 | セキュリティ強化、パフォーマンスチューニング指針改訂、Java移行評価基準策定 | ろひ |
| 5.0 | 2014-04-01 | クラウド移行検討、Oracle連携仕様、API設計ガイドライン策定 | ろひ |
| 6.0 | 2018-04-01 | 20周年記念改訂。アーキテクチャ全面見直し、CI/CD・コンテナ化対応 | ろひ |
| 7.0 | 2022-04-01 | DX推進、リモート運用仕様、AI/ML活用検討、ゼロトラストセキュリティ対応 | ろひ |
| 8.0 | 2026-04-01 | Three.js可視化、サイバーパンクUI/UX策定、ポートフォリオサイト公開・仕様書web公開 | ろひ |
Section 01
第1章 システム概要
SYSTEM OVERVIEW
1.1 システム名称
| 項目 | 内容 |
|---|---|
| システム名称(日本語) | ろひ // レガシーITエンジニア |
| システム名称(英語) | ROHI // LEGACY IT ENGINEER PORTFOLIO |
| ドメイン名 | yoroshiku.net |
| 文書番号 | ROHI-SPEC-001 |
1.2 システム目的
本システムは、レガシーITエンジニア「ろひ」の技術的知見と経歴を、サイバーパンク美学とメインフレーム視覚言語を用いて表現する自己紹介サイトである。
主な目的:
- COBOL、PL/I、JCL、DB2 等のメインフレーム技術の専門性を提示
- レガシーシステムの開発・保守・移行における28年の経験を可視化
- 新技術とレガシー技術の架け橋としての立ち位置を表現
- 単一ファイルアーキテクチャによる技術的実証
1.3 システム構成図
┌─────────────────────────────────────────────────────────────┐ │ クライアントブラウザ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌───────────────────────────────────────────────────────┐ │ │ │ index.html(単一ファイル) │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ HTML構造 │ │ CSS定義 │ │ JS処理 │ │ │ │ │ │ (415行) │ │ (360行) │ │ (472行) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ └───────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌───────────────────────────────────────────────────────┐ │ │ │ 外部リソース │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ Three.js │ │ Google Fonts│ │ CDN │ │ │ │ │ │ v0.160.0 │ │ IBM Plex │ │ jsdelivr │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ └───────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘
1.4 動作環境定義
1.4.1 必須環境
| 項目 | 要件 |
|---|---|
| ブラウザ | モダンブラウザ(Chrome 117+, Firefox 115+, Safari 16.4+, Edge 115+) |
| JavaScript | ES Module 対応必須 |
| WebGL | Three.js 描画のため必須 |
| ネットワーク | 外部リソース(CDN)読み込みのため必要 |
1.4.2 推奨環境
| 項目 | 要件 |
|---|---|
| 画面解像度 | 1920×1080 以上 |
| メモリ | 4GB 以上 |
| GPU | WebGL 2.0 対応 |
1.4.3 対応デバイス
| デバイス | 対応状況 | 備考 |
|---|---|---|
| デスクトップ | ◎ 完全対応 | カスタムカーソル有効 |
| タブレット | ○ 対応 | タッチ操作対応 |
| スマートフォン | ○ 対応 | レスポンシブレイアウト適用 |
1.5 外部依存モジュール一覧
| モジュール名 | バージョン | 用途 | CDN |
|---|---|---|---|
| Three.js | 0.160.0 | 3D背景描画 | cdn.jsdelivr.net |
| EffectComposer | (Three.js Addon) | ポストプロセス処理 | cdn.jsdelivr.net |
| RenderPass | (Three.js Addon) | レンダーパス | cdn.jsdelivr.net |
| UnrealBloomPass | (Three.js Addon) | ブルームエフェクト | cdn.jsdelivr.net |
| GlitchPass | (Three.js Addon) | グリッチエフェクト | cdn.jsdelivr.net |
| IBM Plex Mono | 400/600/700 | 等幅フォント | Google Fonts |
| IBM Plex Sans JP | 400/700 | 日本語フォント | Google Fonts |
Section 02
第2章 デザイン仕様
DESIGN SPECIFICATION
2.1 デザインコンセプト
本システムのデザインは、以下のコンセプトに基づく。
「メインフレームの回廊」
- 1980年代のメインフレームコンピュータ室を視覚的に再現
- サーバーラックが無限に続く回廊を3D描画
- LEDの点滅によるシステム稼働の表現
- サイバーパンク美学(ネオンカラー、グリッチ、スキャンライン)の融合
2.2 カラーパレット定義書
2.2.1 プライマリカラー
| カラー名 | 変数名 | 値 | 用途 |
|---|---|---|---|
| マトリックスグリーン | --matrix-green | #00ff41 | メインアクセント、LED、ボーダー |
| ネオンシアン | --neon-cyan | #00f0ff | サブアクセント、グロー、ホバー |
| ネオンマゼンタ | --neon-magenta | #ff00aa | 強調、エラー、特別状態 |
2.2.2 ベースカラー
| カラー名 | 変数名 | 値 | 用途 |
|---|---|---|---|
| ディープブラック | --bg-deep | #050510 | 背景色 |
| パネルブラック | --bg-panel | rgba(10,14,30,0.7) | パネル背景 |
| テキストプライマリ | --text-primary | #e0e8ff | 主要テキスト |
| テキストディム | --text-dim | #6a7a9a | 補助テキスト |
2.2.3 エフェクトカラー
| カラー名 | 変数名 | 値 | 用途 |
|---|---|---|---|
| グリッチレッド | --glitch-red | #ff0040 | グリッチエフェクト赤 |
| グリッチブルー | --glitch-blue | #00ffff | グリッチエフェクト青 |
2.2.4 透過カラー派生
color-mix() 関数を用いて、プライマリカラーから透過バリエーションを生成する。
| 変数名 | 元カラー | 透過率 |
|---|---|---|
--green-3 | matrix-green | 3% |
--green-5 | matrix-green | 5% |
--green-10 | matrix-green | 10% |
--green-15 | matrix-green | 15% |
--green-20 | matrix-green | 20% |
--green-30 | matrix-green | 30% |
--green-40 | matrix-green | 40% |
--cyan-5 | neon-cyan | 5% |
--cyan-10 | neon-cyan | 10% |
--cyan-20 | neon-cyan | 20% |
--cyan-30 | neon-cyan | 30% |
--cyan-60 | neon-cyan | 60% |
--magenta-20 | neon-magenta | 20% |
2.3 タイポグラフィ定義書
2.3.1 フォントファミリー
| 用途 | 変数名 | フォントスタック |
|---|---|---|
| 等幅(英字・記号) | --font-mono | 'IBM Plex Mono', 'Courier New', monospace |
| 日本語本文 | --font-sans | 'IBM Plex Sans JP', 'IBM Plex Mono', -apple-system, BlinkMacSystemFont, sans-serif |
2.3.2 フォントウェイト
| ウェイト | 値 | 用途 |
|---|---|---|
| Regular | 400 | 本文、ラベル |
| SemiBold | 600 | 強調テキスト |
| Bold | 700 | 見出し、数値 |
2.3.3 フォントサイズ定義
| 要素 | サイズ定義 | 備考 |
|---|---|---|
| h1(タイトル) | clamp(4rem, 18vw, 12rem) | 流動的スケーリング |
| h2(セクション) | clamp(2rem, 6vw, 3.5rem) | 流動的スケーリング |
| h3(カード見出し) | 1.3rem | 固定 |
| 本文 | 1.1rem | 固定 |
| 小テキスト | 0.85rem | 固定 |
| ラベル | 0.75rem | 固定 |
| ヒーローサブタイトル | clamp(1rem, 4vw, 2rem) | 流動的スケーリング |
2.4 レイアウト仕様
2.4.1 グリッドシステム
| セクション | グリッド定義 |
|---|---|
| About | grid-template-columns: 1fr 2fr |
| Skills | grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)) |
| Stats | grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)) |
2.4.2 スペーシング
| 用途 | 値 |
|---|---|
| セクション間パディング | 6rem |
| セクション間マージン | 3rem |
| カード間ギャップ | 1.5rem |
| コンテナ最大幅 | 1100px |
| コンテナパディング | 2rem |
2.5 レスポンシブ対応仕様
2.5.1 ブレークポイント
| ブレークポイント | 適用内容 |
|---|---|
| 768px 以下 | コンテナパディング縮小、セクションパディング縮小 |
| 600px 以下(コンテナクエリ) | About グリッドを1カラムに変更 |
2.5.2 モバイル対応
clamp()関数による流動的フォントサイズ- タッチデバイス検出(
pointer: coarse)によるカスタムカーソル無効化 - レスポンシブグリッド(
auto-fill,auto-fit)
Section 03
第3章 画面構成仕様
SCREEN LAYOUT SPECIFICATION
3.1 画面一覧
本システムは単一ページアプリケーションであり、以下のセクションで構成される。
| セクションID | セクション名 | 番号 | 概要 |
|---|---|---|---|
#hero | ヒーロー | - | メインタイトル、スクロールインジケーター |
#about | アバウト | 01 | 自己紹介、アバター、タイプライター |
#stats | スタッツ | 02 | 統計情報(4項目) |
#skills | スキルズ | 03 | スキルカード(8枚) |
#contact | コンタクト | 04 | 連絡先リンク |
| - | フッター | - | コピーライト |
3.2 Hero セクション
3.2.1 構成要素
| 要素 | クラス | 内容 |
|---|---|---|
| タグライン | .hero-tag | SYSTEM ONLINE // ID:ROHI |
| メインタイトル | h1.glitch | ろひ(グリッチエフェクト適用) |
| サブタイトル | .hero-subtitle | レガシーITエンジニア |
| スクロールインジケーター | .scroll-indicator | ▼ SCROLL |
3.2.2 グリッチエフェクト仕様
data-text属性に元テキストを格納::before疑似要素: 赤色(--glitch-red)、3秒周期::after疑似要素: 青色(--glitch-blue)、2.5秒周期clip-pathによるランダム切り抜き
3.3 About セクション
3.3.1 構成要素
| 要素 | クラス | 内容 |
|---|---|---|
| アバターボックス | .avatar-box | シンボル <ROHI>、ID情報 |
| 自己紹介テキスト | .about-text | 4段落 + タイプライター |
3.3.2 アバターボックス仕様
┌─────────────────┐ │ │ │ <ROHI> │ ← シンボル(5rem、matrix-green) │ │ ├─────────────────┤ │ ID: 0xR0H1 │ ← ラベル(0.75rem、text-dim) │ STATUS: ACTIVE │ └─────────────────┘
- シャンアニメーション: 4秒周期で光が左から右に通過
- ホバー時: border-color 変化、グロー強化、Y軸-3px移動
3.3.3 タイプライター仕様
- テキスト:
> echo "レガシーは死なず。ただ、進化する。" - 速度: 80ms/文字
- トリガー: IntersectionObserver(threshold: 0.5)
- 実行回数: 1回のみ(observer.disconnect())
3.4 Stats セクション
3.4.1 統計項目一覧
| 項目 | data属性 | 表示値 | ラベル |
|---|---|---|---|
| 経験年数 | data-target="28" | 28 | YEARS / 経験年数 |
| プログラム数 | data-display="999+" | 999+ | PROGRAMS / 開発・保守プログラム |
| 稼働率 | data-target="99" data-suffix="%" | 99% | UPTIME / 稼働率 |
| 移行案件 | data-display="NOW()" | NOW() | MIGRATIONS / 移行案件 |
3.4.2 カウントアップ仕様
- 数値型(
data-target): 2000ms、cubic ease-out、スクランブル文字表示 - 表示型(
data-display): 1200ms、文字数分段階的表示、スクランブル文字表示 - スクランブル文字セット:
アイウエオカキクケコ0123456789ABCDEF#%+/<>*
3.5 Skills セクション
3.5.1 スキルカード一覧
| # | アイコン | スキル名 | レベル | % | 説明 |
|---|---|---|---|---|---|
| 1 | [COB] | COBOL | EXPERT | 95% | メインフレーム系業務アプリの設計・開発・保守 |
| 2 | [PL1] | PL/I | EXPERT | 95% | 金融系バックエンドのPL/I資産設計・開発・保守 |
| 3 | [JCL] | JCL | EXPERT | 90% | バッチジョブ制御言語 |
| 4 | [DB2] | DB2 | EXPERT | 92% | メインフレームのDB設計、SQL最適化 |
| 5 | [C] | C | ADVANCED | 85% | C言語ミドルウェアの設計・保守 |
| 6 | [JAVA] | Java | ADVANCED | 80% | レガシー移行先のJavaアプリ設計 |
| 7 | [ORCL] | Oracle | ADVANCED | 80% | レガシー移行先のDB設計 |
| 8 | [MIG] | Migration | ADVANCED | 87% | メインフレームからオープン系移行 |
3.5.2 スキルカード構造
┌─────────────────────────────────────┐ │ [COB] │ ← アイコン │ COBOL │ ← スキル名 │ EXPERT // 95% │ ← レベル │ ████████████████████░ │ ← スキルバー │ メインフレーム系業務アプリの... │ ← 説明 └─────────────────────────────────────┘
3.5.3 ホバーエフェクト
--glow-spreadアニメーション: 0px → 40px- Y軸-5px移動、スケール1.02倍
- 上部スキャンライン: 左から右に通過
- 他カードのぼかし:
:has()セレクタで非ホバーカードをopacity: 0.4; filter: blur(2px)
3.6 Contact セクション
3.6.1 構成要素
| 要素 | 内容 |
|---|---|
| 見出し | // 通信チャネル確立 |
| 説明文 | レガシーの知恵が必要ですか?下記チャネルからどうぞ。 |
| リンク1 | MIXI2 (https://mixi.social/@Exception) |
| リンク2 | X / TWITTER (https://x.com/rohigpt) |
3.6.2 リンク仕様
rel="noopener"設定(セキュリティ)- ホバー時: 背景色変化、グロー、テキストシャドウ
- プレフィックス:
>
3.7 フッター
3.7.1 構成
// END OF TRANSMISSION // ろひ © 2026 // ALL SYSTEMS NOMINAL
.footer-glitchクラスでマゼンタ色- 上部ボーダー:
--green-10
Section 04
第4章 機能仕様
FUNCTIONAL SPECIFICATION
4.1 Three.js 背景描画処理
4.1.1 処理概要
メインフレームのサーバールームを3D描画し、無限に続く回廊を表現する。
4.1.2 入力
- マウスポインタ位置(
state.normX,state.normY) - フレームカウント(
frame)
4.1.3 出力
#bg-canvasへの3Dレンダリング
4.1.4 シーン構成
| 要素 | 仕様 |
|---|---|
| カメラ | PerspectiveCamera(70, aspect, 0.1, 200) |
| フォグ | FogExp2(0x050510, 0.022) |
| 床グリッド | LineSegments、200m奥行き、2m間隔 |
| 天井グリッド | LineSegments、200m奥行き、2m間隔 |
| サーバーラック | BoxGeometry(2, 6, 1.5)、4m間隔 |
| LED | PlaneGeometry(0.18, 0.1)、1ラック5個 |
4.1.5 チャンクシステム
CHUNK_LENGTH = 40
CHUNK_COUNT = 5
総延長 = 200m
[Chunk 0][Chunk 1][Chunk 2][Chunk 3][Chunk 4]
↑
カメラ位置(Z軸マイナス方向に移動)
カメラがチャンクを通過すると、前方に再配置
4.1.6 LED点滅パターン
| タイプ | 条件 | 動作 |
|---|---|---|
| steady | blinkType === 'steady' | 基本輝度 ± sin波(0.1) |
| blink | blinkType === 'blink' | sin波 > 0.3 で点灯、それ以外で消灯 |
4.1.7 ポストプロセス
RenderPass → UnrealBloomPass → GlitchPass → 出力
↓ ↓
strength: 0.9 4〜7秒間隔
radius: 0.5 0.3〜0.5秒バースト
threshold: 0.25
4.1.8 例外処理
prefers-reduced-motion: reduce時: 処理全体をスキップ- WebGL非対応: 自動的に描画なし
4.2 パーティクル描画処理
4.2.1 処理概要
マウスの動きに追従するネオンパーティクルを描画する。
4.2.2 入力
- マウス位置(
state.x,state.y) - マウス移動状態(
state.isMoving)
4.2.3 出力
#particle-canvasへの2Dレンダリング
4.2.4 パーティクル仕様
| 項目 | 値 |
|---|---|
| 最大数 | 50 |
| スポーン間隔 | 30ms |
| 初期速度 | ±1.5 px/frame |
| 減衰率 | 0.98 |
| 寿命 | 1.0 → 0.0(-0.02/frame) |
| サイズ | 1〜4px |
| 合成モード | lighter(加算合成) |
4.2.5 カラーパレット
const NEON_COLORS = [ '#00ff41', // matrix-green '#39ff14', // matrix-green 黄緑 '#aaffaa', // matrix-green パステル '#00f0ff', // neon-cyan '#ff00aa', // neon-magenta ]
4.3 カスタムカーソル処理
4.3.1 処理概要
カスタムデザインのカーソルを描画し、ホバー状態やクリックに反応する。
4.3.2 入力
- マウス位置(
state.x,state.y) - ホバー状態(
state.isHovering) - クリックイベント
4.3.3 出力
#cursor-canvasへの2Dレンダリング
4.3.4 カーソル構成
┌─────────────┐
│ 外円 │ ← 22px(通常)/ 35px(ホバー)
│ ┌───────┐ │ matrix-green / magenta
│ │ 内円 │ │ ← 4px、cyan
│ └───────┘ │
└─────────────┘
トレイル: 12フレーム分
4.3.5 追従アルゴリズム
cursor.x += (target.x - cursor.x) * 0.25 cursor.y += (target.y - cursor.y) * 0.25
4.3.6 クリック爆発
| 項目 | 値 |
|---|---|
| パーティクル数 | 24 |
| 初期速度 | 2〜6 px/frame |
| 減衰率 | 0.95 |
| 寿命 | 1.0 → 0.0(-0.03/frame) |
4.3.7 例外処理
prefers-reduced-motion: reduce時: 処理全体をスキップ- タッチデバイス(
pointer: coarse): 処理全体をスキップ
4.4 タイプライター処理
4.4.1 処理概要
テキストを1文字ずつ表示するタイプライターエフェクトを実装する。
4.4.2 入力
- IntersectionObserver(threshold: 0.5)
4.4.3 出力
#typewriter要素のテキストコンテンツ更新
4.4.4 処理フロー
1. 要素がビューポートに入る 2. observer.disconnect() で監視終了 3. ループ開始: a. text.slice(0, index + 1) を表示 b. index++ c. 80ms 待機 d. index < text.length なら 3-a に戻る 4. 完了
4.4.5 対象テキスト
> echo "レガシーは死なず。ただ、進化する。"
4.5 スクロールリビール処理
4.5.1 処理概要
要素がビューポートに入った際に、フェードインとスライドアップのアニメーションを適用する。
4.5.2 入力
- IntersectionObserver(threshold: 0.15)
4.5.3 出力
.reveal要素に.visibleクラスを追加.skill-fill要素のwidthをdata-fill値に設定
4.5.4 アニメーション仕様
| 項目 | 値 |
|---|---|
| 初期状態 | opacity: 0; transform: translateY(40px) |
| 終了状態 | opacity: 1; transform: translateY(0) |
| 遷移時間 | 0.8s |
4.6 カウントアップ処理
4.6.1 処理概要
数値を0から目標値までカウントアップする。スクランブル文字を表示しながら最終値に収束する。
4.6.2 入力
- IntersectionObserver(threshold: 0.5)
data-target(数値型)またはdata-display(表示型)
4.6.3 出力
.stat-number要素のテキストコンテンツ更新
4.6.4 処理フロー(数値型)
1. 要素がビューポートに入る 2. start = performance.now() 3. updaters に登録 4. フレーム毎: a. elapsed = now - start b. progress = min(elapsed / 2000, 1) c. eased = 1 - pow(1 - progress, 3) // cubic ease-out d. 表示値 = floor(eased * target) + suffix e. progress >= 1 なら完了、updaters から削除
4.6.5 処理フロー(表示型)
1. 要素がビューポートに入る 2. start = performance.now() 3. updaters に登録 4. フレーム毎: a. elapsed = now - start b. progress = min(elapsed / 1200, 1) c. revealCount = floor(progress * display.length) d. 表示済み文字 + スクランブル文字で構成 e. progress >= 1 なら完了、updaters から削除
4.7 グリッチエフェクト処理
4.7.1 処理概要
Three.js の GlitchPass を用いて、ランダムなタイミングで画面全体にグリッチエフェクトを適用する。
4.7.2 入力
- タイマー(4〜7秒間隔)
4.7.3 出力
glitchPass.enabledの切り替え
4.7.4 処理フロー
scheduleGlitchBurst(): 1. nextDelay = 4000 + random() * 3000 // 4〜7秒 2. burstDuration = 300 + random() * 200 // 0.3〜0.5秒 3. nextDelay 後: a. glitchPass.enabled = true b. burstDuration 後: - glitchPass.enabled = false - scheduleGlitchBurst() を再帰呼び出し
4.7.5 例外処理
visibilitychangeイベントでタブ非表示時にタイマー停止- タブ再表示時に
scheduleGlitchBurst()を再開
4.8 スムーススクロール処理
4.8.1 処理概要
ページ内リンクのクリック時に、スムーススクロールと View Transitions API を適用する。
4.8.2 入力
a[href^="#"]のクリックイベント
4.8.3 出力
- 対象要素へのスクロール
4.8.4 処理フロー
1. クリックイベントを捕捉 2. href === '#' なら早期リターン 3. e.preventDefault() 4. target = document.querySelector(href) 5. if (document.startViewTransition): startViewTransition(() => target.scrollIntoView({ behavior: 'smooth' })) else: target.scrollIntoView({ behavior: 'smooth' })
Section 05
第5章 データ定義
DATA DEFINITIONS
5.1 CSS カスタムプロパティ一覧
5.1.1 デザイントークン
| 変数名 | 型 | 値 | 用途 |
|---|---|---|---|
--neon-cyan | color | #00f0ff | ネオンシアン |
--neon-magenta | color | #ff00aa | ネオンマゼンタ |
--matrix-green | color | #00ff41 | マトリックスグリーン |
--bg-deep | color | #050510 | 背景色 |
--bg-panel | color | rgba(10,14,30,0.7) | パネル背景 |
--text-primary | color | #e0e8ff | テキストプライマリ |
--text-dim | color | #6a7a9a | テキストディム |
--glitch-red | color | #ff0040 | グリッチレッド |
--glitch-blue | color | #00ffff | グリッチブルー |
--ease-out-expo | timing | cubic-bezier(0.23,1,0.32,1) | イージング関数 |
--font-mono | font | 'IBM Plex Mono', ... | 等幅フォント |
--font-sans | font | 'IBM Plex Sans JP', ... | 日本語フォント |
5.1.2 @property 定義
| プロパティ名 | 構文 | 初期値 | 継承 | 用途 |
|---|---|---|---|---|
--glow-spread | <length> | 0px | false | スキルカードグロー拡散 |
5.2 HTML データ属性一覧
5.2.1 グリッチエフェクト
| 属性 | 要素 | 値 | 用途 |
|---|---|---|---|
data-text | .glitch | ろひ | グリッチ元テキスト |
5.2.2 カウントアップ
| 属性 | 要素 | 値の例 | 用途 |
|---|---|---|---|
data-target | .stat-number | 28 | 目標数値 |
data-display | .stat-number | 999+ | 表示文字列 |
data-suffix | .stat-number | % | 数値後の接尾辞 |
5.2.3 スキルバー
| 属性 | 要素 | 値の例 | 用途 |
|---|---|---|---|
data-fill | .skill-fill | 95 | パーセンテージ |
5.3 JavaScript 定数・状態定義
5.3.1 共有状態(state)
| プロパティ | 型 | 初期値 | 用途 |
|---|---|---|---|
x | number | window.innerWidth / 2 | マウス X 座標 |
y | number | window.innerHeight / 2 | マウス Y 座標 |
normX | number | 0 | 正規化 X(-1 〜 1) |
normY | number | 0 | 正規化 Y(-1 〜 1) |
isMoving | boolean | false | マウス移動中フラグ |
isHovering | boolean | false | ホバー中フラグ |
moveTimeout | Timeout | null | 移動停止検出タイマー |
5.3.2 Three.js 定数
| 定数名 | 値 | 用途 |
|---|---|---|
HALL_WIDTH | 12 | ホール幅 |
HALL_HEIGHT | 8 | ホール高さ |
RACK_W | 2 | ラック幅 |
RACK_H | 6 | ラック高さ |
RACK_D | 1.5 | ラック奥行き |
RACK_SPACING | 4 | ラック間隔 |
CHUNK_LENGTH | 40 | チャンク長さ |
CHUNK_COUNT | 5 | チャンク数 |
SPEED | 0.15 | カメラ移動速度 |
LEDS_PER_RACK | 5 | 1ラックあたりのLED数 |
5.3.3 パーティクル定数
| 定数名 | 値 | 用途 |
|---|---|---|
maxParticles | 50 | 最大パーティクル数 |
NEON_COLORS | (frozen array) | カラーパレット |
5.3.4 カーソル定数
| 定数名 | 値 | 用途 |
|---|---|---|
TRAIL_LENGTH | 12 | トレイル長さ |
CURSOR_COLORS | (frozen array) | 爆発カラーパレット |
Section 06
第6章 非機能要件
NON-FUNCTIONAL REQUIREMENTS
6.1 パフォーマンス仕様
6.1.1 レンダリング最適化
| 項目 | 対策 |
|---|---|
| requestAnimationFrame | 単一ループ(mainLoop)に統合 |
| Canvas shadowBlur | 外円カーソルのみに限定 |
| LED更新 | 可視チャンクのみ処理 |
| devicePixelRatio | Math.min(dpr, 2) で上限キャップ |
| resize イベント | 150ms デバウンス |
6.1.2 リソース最適化
| 項目 | 対策 |
|---|---|
| フォント読み込み | font-display: swap |
| CDN接続 | preconnect で事前接続 |
| CDN選択 | cdn.jsdelivr.net(高速 CDN) |
6.2 アクセシビリティ仕様
6.2.1 prefers-reduced-motion 対応
| 要素 | 対応内容 |
|---|---|
| CSS アニメーション | animation-duration: 0.01ms に強制 |
| CSS トランジション | transition-duration: 0.01ms に強制 |
| グリッチエフェクト | ::before, ::after を非表示 |
| スキャンライン | 非表示 |
| Three.js 背景 | 非表示 |
| カスタムカーソル | 非表示、cursor: auto に復帰 |
6.2.2 ARIA 属性
| 要素 | 属性 | 値 |
|---|---|---|
.scanlines | aria-hidden | true |
.vignette | aria-hidden | true |
#bg-canvas | aria-hidden | true |
#particle-canvas | aria-hidden | true |
#cursor-canvas | aria-hidden | true |
#scroll-progress | aria-hidden | true |
#hero | aria-label | ヒーローセクション |
#about | aria-label | 自己紹介 |
#stats | aria-label | 統計情報 |
#skills | aria-label | スキルセット |
#contact | aria-label | コンタクト |
.contact-links | aria-label | 連絡先リンク |
6.2.3 タッチデバイス対応
pointer: coarse検出時、カスタムカーソルを無効化cursor: noneを@media (hover: hover) and (pointer: fine)に限定
6.3 SEO / OGP 仕様
6.3.1 メタタグ
| 項目 | 内容 |
|---|---|
| title | ろひ // レガシーITエンジニア |
| description | ろひ - レガシーITエンジニア 自己紹介サイト。COBOL、PL/I、JCL、DB2などのメインフレーム技術に精通し、レガシーシステムの開発・保守・移行を専門とするエンジニア。 |
| canonical | https://yoroshiku.net/ |
6.3.2 OGP タグ
| プロパティ | 内容 |
|---|---|
og:title | ろひ // レガシーITエンジニア |
og:description | (description と同一) |
og:type | website |
og:url | https://yoroshiku.net/ |
og:site_name | ろひ // レガシーITエンジニア |
og:locale | ja_JP |
og:image | https://yoroshiku.net/ogp.png |
6.3.3 Twitter Card
| プロパティ | 内容 |
|---|---|
twitter:card | summary_large_image |
twitter:title | ろひ // レガシーITエンジニア |
twitter:description | (description と同一) |
twitter:image | https://yoroshiku.net/ogp.png |
twitter:site | @rohigpt |
twitter:creator | @rohigpt |
6.3.4 ファビコン
- インライン SVG data URI
- デザイン:
[R]マーク(matrix-green on deep-black) - フォント: monospace、700 weight
6.4 セキュリティ考慮事項
6.4.1 外部リンク
- 全外部リンクに
rel="noopener"を設定 target="_blank"は未使用(同一タブで遷移)
6.4.2 CSP(Content Security Policy)
本システムはインラインスクリプト・インラインスタイルを含むため、CSP 導入時は以下の対応が必要:
script-src:nonceまたはunsafe-inlineを許可style-src:nonceまたはunsafe-inlineを許可img-src:data:を許可(ファビコン用)
Section 07
第7章 既知の制約事項
KNOWN CONSTRAINTS
7.1 ブラウザ互換性
| 機能 | 対応ブラウザ | 非対応時の挙動 |
|---|---|---|
| Scroll-driven Animations | Chrome 115+ | 静的表示(@supports で除外) |
@property | Chrome 85+, Safari 15.4+ | トランジション無効 |
:has() セレクタ | Chrome 105+, Safari 15.4+ | 他カードぼかし無効 |
| View Transitions API | Chrome 111+ | フォールバック(通常スクロール) |
text-wrap: pretty | Chrome 117+ | 通常改行 |
| CSS ネスティング | Chrome 120+, Safari 16.5+ | 非対応(必須機能) |
7.2 既知の制限
| # | 項目 | 詳細 |
|---|---|---|
| 1 | Three.js バージョン | v0.160.0(2023年12月)。最新版は v0.175+ |
| 2 | タイプライター再発動 | 1回限り。ページ再訪時は再発動しない |
| 3 | OGP 画像 | ogp.png の手動生成が必要 |
| 4 | CSP 非対応 | インラインスクリプト/スタイルのため、CSP 導入時は設定が必要 |
Appendix A
付録A セクション番号とIDマッピング
SECTION NUMBER & ID MAPPING
| セクション番号 | セクション名 | ID | aria-label |
|---|---|---|---|
| - | ヒーロー | #hero | ヒーローセクション |
| 01 | アバウト | #about | 自己紹介 |
| 02 | スタッツ | #stats | 統計情報 |
| 03 | スキルズ | #skills | スキルセット |
| 04 | コンタクト | #contact | コンタクト |
Appendix B
付録B アニメーション定義一覧
ANIMATION DEFINITIONS
B.1 CSS アニメーション
| アニメーション名 | 対象 | 周期 | 用途 |
|---|---|---|---|
scan-flicker | .scanlines | 8s | スキャンライン明滅 |
glitch-anim-1 | .glitch::before | 3s | グリッチ赤 |
glitch-anim-2 | .glitch::after | 2.5s | グリッチ青 |
fade-in | .hero-tag, .hero-subtitle | 1.5s | フェードイン |
border-pulse | .hero-subtitle | 3s | ボーダーパルス |
bounce | .scroll-indicator | 2s | バウンス |
shine | .avatar-box::before | 4s | シャイン |
blink-cursor | .typewriter | 0.8s | カーソル点滅 |
scroll-progress | #scroll-progress | - | スクロール進行 |
h2-glow-slide | section h2 | - | 見出しグロー |
line-stretch | .section-line | - | ラインストレッチ |
B.2 JavaScript アニメーション
| 処理 | 周期 | 用途 |
|---|---|---|
| Three.js カメラ移動 | フレーム毎 | 無限回廊 |
| LED 点滅 | フレーム毎 | サーバー稼働表現 |
| パーティクル | フレーム毎 | マウス追従 |
| カーソル追従 | フレーム毎 | カスタムカーソル |
| グリッチバースト | 4〜7秒間隔 | 画面グリッチ |
Appendix C
付録C 用語集
GLOSSARY
| 用語 | 説明 |
|---|---|
| チャンク | Three.js のシーンを分割した単位。メモリ効率のため再利用する |
| lerp | Linear Interpolation。線形補間。カーソルの滑らかな追従に使用 |
| Bloom | 明るい部分が滲むポストプロセスエフェクト |
| Glitch | 画面が乱れるエフェクト。デジタルノイズを表現 |
| スキャンライン | CRT モニターの走査線を再現するオーバーレイ |
| ビネット | 画面周辺を暗くするエフェクト |
| グリッチ | 意図的な映像の乱れ。サイバーパンク美学の要素 |
| メインフレーム | 大型コンピューター。COBOL、JCL 等を使用 |
| COBOL | 事務処理用プログラミング言語。1959年登場 |
| PL/I | IBM の汎用プログラミング言語。1964年登場 |
| JCL | Job Control Language。メインフレームのジョブ制御言語 |
| DB2 | IBM のリレーショナルデータベース管理システム |