527 lines
13 KiB
Markdown
527 lines
13 KiB
Markdown
|
|
# Antigravity実装の批判的コードレビュー
|
|||
|
|
|
|||
|
|
**レビュー日**: 2026-02-23
|
|||
|
|
**レビュアー**: Claude (Sonnet 4.5) - ベテランアーキテクト視点
|
|||
|
|
**対象**: Antigravityが実装したGitea自動配布システム
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 **実装内容の確認**
|
|||
|
|
|
|||
|
|
### **新規作成されたファイル**
|
|||
|
|
|
|||
|
|
1. **`release_to_gitea.ps1`** - Gitea APIでリリース作成・APKアップロード
|
|||
|
|
2. **`web/download/index.html`** (更新) - Gitea APIから動的にAPK情報取得
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ **優れている点**
|
|||
|
|
|
|||
|
|
### **1. アーキテクチャの選択**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
✅ B案 (Gitea + Vercel) を正しく実装
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- APKはSynology Giteaに保存 → データ主権確保
|
|||
|
|
- 配布ページはGitea APIから動的取得 → 自動更新
|
|||
|
|
- Vercelにデプロイ可能 → 外部アクセス容易
|
|||
|
|
|
|||
|
|
**判定: 完璧** ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **2. セキュリティ設計**
|
|||
|
|
|
|||
|
|
**`release_to_gitea.ps1` (3-14行目)**
|
|||
|
|
```powershell
|
|||
|
|
# Load .env.local
|
|||
|
|
$envFile = Join-Path $PSScriptRoot ".env.local"
|
|||
|
|
if (-not (Test-Path $envFile)) { Write-Error ".env.local not found"; exit 1 }
|
|||
|
|
Get-Content $envFile | ForEach-Object {
|
|||
|
|
# ... トークンを環境変数から読み込み
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **良い点**:
|
|||
|
|
- トークンをハードコードしていない
|
|||
|
|
- `.env.local` から読み込み (`.gitignore`対象)
|
|||
|
|
|
|||
|
|
⚠️ **問題点1: ファイル名の不一致**
|
|||
|
|
```
|
|||
|
|
実装: .env.local を参照
|
|||
|
|
実際のファイル: .env を作成した
|
|||
|
|
|
|||
|
|
→ 修正が必要
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **3. エラーハンドリング**
|
|||
|
|
|
|||
|
|
**`release_to_gitea.ps1` (21-34行目)**
|
|||
|
|
```powershell
|
|||
|
|
if (-not $GITEA_TOKEN) { Write-Error "GITEA_TOKEN not set"; exit 1 }
|
|||
|
|
if (-not (Test-Path $ApkDir)) { Write-Error "APK folder not found"; exit 1 }
|
|||
|
|
if ($apkFiles.Count -eq 0) { Write-Error "No APK files"; exit 1 }
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **良い点**:
|
|||
|
|
- 事前チェックが充実
|
|||
|
|
- エラーメッセージが明確
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **4. バージョン自動検出**
|
|||
|
|
|
|||
|
|
**`release_to_gitea.ps1` (36-41行目)**
|
|||
|
|
```powershell
|
|||
|
|
# pubspec.yaml からバージョン読み取り
|
|||
|
|
$publine = Get-Content (Join-Path $PSScriptRoot "pubspec.yaml") | Where-Object { $_ -match "^version:" }
|
|||
|
|
$version = if ($publine -match "version:\s*(\S+)") { $Matches[1].Split("+")[0] } else { "1.0.0" }
|
|||
|
|
$tagName = "v$version"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **良い点**:
|
|||
|
|
- 手動でバージョン指定不要
|
|||
|
|
- `pubspec.yaml` が唯一の真実
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **5. リリースノートの自動生成**
|
|||
|
|
|
|||
|
|
**`release_to_gitea.ps1` (71-86行目)**
|
|||
|
|
```powershell
|
|||
|
|
$releaseNotes = @(
|
|||
|
|
"## Ponshu Room $version ($dateStr)",
|
|||
|
|
"",
|
|||
|
|
"### APK Files",
|
|||
|
|
"- ponshu_room_lite_eiji.apk : Eiji [Lite]",
|
|||
|
|
# ...
|
|||
|
|
) -join "`n"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **良い点**:
|
|||
|
|
- インストール手順も含む
|
|||
|
|
- マークダウン形式で見やすい
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **6. Webページの動的読み込み**
|
|||
|
|
|
|||
|
|
**`web/download/index.html` (281-299行目)**
|
|||
|
|
```javascript
|
|||
|
|
async function fetchLatestRelease() {
|
|||
|
|
try {
|
|||
|
|
const res = await fetch(RELEASES_API);
|
|||
|
|
const releases = await res.json();
|
|||
|
|
latestRelease = releases[0];
|
|||
|
|
// バージョン情報を自動更新
|
|||
|
|
} catch (e) {
|
|||
|
|
// エラーハンドリング
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ **良い点**:
|
|||
|
|
- 新しいAPKをGiteaにアップするだけで、Webページが自動更新
|
|||
|
|
- HTMLの手動編集不要
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚨 **重大な問題点**
|
|||
|
|
|
|||
|
|
### **問題1: 環境変数ファイル名の不一致**
|
|||
|
|
|
|||
|
|
**実装:**
|
|||
|
|
```powershell
|
|||
|
|
# release_to_gitea.ps1 (4行目)
|
|||
|
|
$envFile = Join-Path $PSScriptRoot ".env.local"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**実際に作成したファイル:**
|
|||
|
|
```
|
|||
|
|
.env ← これを作成した
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**影響:**
|
|||
|
|
- スクリプト実行時に `.env.local not found` エラー
|
|||
|
|
|
|||
|
|
**修正方法:**
|
|||
|
|
```powershell
|
|||
|
|
# Option A: スクリプトを修正
|
|||
|
|
$envFile = Join-Path $PSScriptRoot ".env"
|
|||
|
|
|
|||
|
|
# Option B: ファイル名を変更
|
|||
|
|
mv .env .env.local
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨: Option B** (`.env.local` の方がセキュリティ的に明確)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **問題2: Gitea APIのURL設定**
|
|||
|
|
|
|||
|
|
**`web/download/index.html` (272-274行目)**
|
|||
|
|
```javascript
|
|||
|
|
const GITEA_PUBLIC_URL = 'http://100.76.7.3:3000'; // ← ローカルIP
|
|||
|
|
const GITEA_OWNER = 'mai'; // ← 正しいユーザー名?
|
|||
|
|
const GITEA_REPO = 'ponshu-room-lite'; // ← リポジトリ名が違う?
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
⚠️ **問題点**:
|
|||
|
|
|
|||
|
|
1. **`100.76.7.3:3000` は外部からアクセス不可**
|
|||
|
|
- これはTailscaleのローカルIP
|
|||
|
|
- Eijiがアクセスできない
|
|||
|
|
|
|||
|
|
2. **ユーザー名が `mai` ?**
|
|||
|
|
- 正しくは `maita` では?
|
|||
|
|
|
|||
|
|
3. **リポジトリ名が `ponshu-room-lite` ?**
|
|||
|
|
- 実際は `ponshu_room_lite` (アンダースコア) では?
|
|||
|
|
|
|||
|
|
**確認が必要:**
|
|||
|
|
```bash
|
|||
|
|
# Gitea設定を確認
|
|||
|
|
# http://100.76.7.3:3000 にアクセス
|
|||
|
|
# 実際のリポジトリURLを確認
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **問題3: 外部アクセスの設定が未完了**
|
|||
|
|
|
|||
|
|
**現状:**
|
|||
|
|
```
|
|||
|
|
配布ページ: Gitea API (http://100.76.7.3:3000) から取得
|
|||
|
|
問題: このIPは外部からアクセス不可
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**B案の前提:**
|
|||
|
|
- Gitea APIは外部公開が必要
|
|||
|
|
- Tailscale Funnel または DDNS設定が必須
|
|||
|
|
|
|||
|
|
**未実装:**
|
|||
|
|
- Tailscale Funnel設定
|
|||
|
|
- または Synology DDNS + リバースプロキシ
|
|||
|
|
|
|||
|
|
**影響:**
|
|||
|
|
- Eijiは配布ページにアクセスできても、APKダウンロードができない
|
|||
|
|
- または、配布ページ自体がエラー表示
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **問題4: CORS設定の欠如**
|
|||
|
|
|
|||
|
|
**予想される問題:**
|
|||
|
|
```
|
|||
|
|
Vercel (https://your-app.vercel.app)
|
|||
|
|
↓ fetch()
|
|||
|
|
Gitea API (http://100.76.7.3:3000)
|
|||
|
|
↓ ブロック (CORS エラー)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**必要な対応:**
|
|||
|
|
- Gitea側でCORSヘッダー設定
|
|||
|
|
- または、Vercel側でプロキシ実装
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🟡 **改善推奨事項**
|
|||
|
|
|
|||
|
|
### **推奨1: エラー表示の改善**
|
|||
|
|
|
|||
|
|
**現在の実装:**
|
|||
|
|
```javascript
|
|||
|
|
document.getElementById('releaseInfo').textContent =
|
|||
|
|
'最新情報の取得に失敗しました(Tailscale接続を確認)';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**問題:**
|
|||
|
|
- Eijiは「Tailscale接続」の意味が分からない
|
|||
|
|
|
|||
|
|
**改善案:**
|
|||
|
|
```javascript
|
|||
|
|
'APK情報の読み込みに失敗しました。管理者に連絡してください。'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **推奨2: ローディング状態の視覚化**
|
|||
|
|
|
|||
|
|
**現在:**
|
|||
|
|
```html
|
|||
|
|
<span class="file-size" id="liteSizeLabel">--</span>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**改善案:**
|
|||
|
|
```html
|
|||
|
|
<span class="file-size loading-indicator">読み込み中...</span>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
CSSでアニメーション追加
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **推奨3: フォールバック機能**
|
|||
|
|
|
|||
|
|
**現在:**
|
|||
|
|
- Gitea APIが失敗したら何も表示されない
|
|||
|
|
|
|||
|
|
**改善案:**
|
|||
|
|
```javascript
|
|||
|
|
// Gitea API失敗時は、ハードコードされた前回のURLを表示
|
|||
|
|
const FALLBACK_URLS = {
|
|||
|
|
maita: {
|
|||
|
|
lite: 'https://drive.google.com/...', // Google Driveなど
|
|||
|
|
pro: 'https://drive.google.com/...'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 **総合評価**
|
|||
|
|
|
|||
|
|
### **実装品質: B+ (良好、ただし修正必要)**
|
|||
|
|
|
|||
|
|
| 項目 | 評価 | 理由 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| アーキテクチャ | A | B案を正しく実装 |
|
|||
|
|
| コード品質 | A | クリーンで読みやすい |
|
|||
|
|
| セキュリティ | B | `.env.local` 使用は正しいが、ファイル名不一致 |
|
|||
|
|
| エラーハンドリング | A | 充実している |
|
|||
|
|
| **外部アクセス** | **D** | **未実装 (最重要問題)** |
|
|||
|
|
| CORS対応 | D | 未対応 |
|
|||
|
|
| ユーザー体験 | B | ローディング表示は良いが改善余地あり |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 **次にあなたがすべきこと (優先順位順)**
|
|||
|
|
|
|||
|
|
### **🔴 最優先 (今すぐ - 10分)**
|
|||
|
|
|
|||
|
|
#### **1. 環境変数ファイル名の修正**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# ファイル名を変更
|
|||
|
|
cd C:\Users\maita\posimai-project\ponshu_room_lite
|
|||
|
|
mv .env .env.local
|
|||
|
|
|
|||
|
|
# または .env.example も一緒に
|
|||
|
|
mv .env.example .env.local.example
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### **2. Gitea設定の確認**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
http://100.76.7.3:3000 にアクセスして確認:
|
|||
|
|
|
|||
|
|
1. あなたのユーザー名は?
|
|||
|
|
→ maita または mai ?
|
|||
|
|
|
|||
|
|
2. リポジトリ名は?
|
|||
|
|
→ ponshu_room_lite または ponshu-room-lite ?
|
|||
|
|
|
|||
|
|
3. 実際のURL例:
|
|||
|
|
http://100.76.7.3:3000/maita/ponshu_room_lite
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
確認後、以下を修正:
|
|||
|
|
|
|||
|
|
**`web/download/index.html` (272-274行目)**
|
|||
|
|
```javascript
|
|||
|
|
// 修正前
|
|||
|
|
const GITEA_PUBLIC_URL = 'http://100.76.7.3:3000';
|
|||
|
|
const GITEA_OWNER = 'mai'; // ← これを確認
|
|||
|
|
const GITEA_REPO = 'ponshu-room-lite'; // ← これも確認
|
|||
|
|
|
|||
|
|
// 修正後 (例)
|
|||
|
|
const GITEA_PUBLIC_URL = 'http://100.76.7.3:3000';
|
|||
|
|
const GITEA_OWNER = 'maita'; // ← 正しいユーザー名
|
|||
|
|
const GITEA_REPO = 'ponshu_room_lite'; // ← 正しいリポジトリ名
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **🟡 優先度高 (今日中 - 30分)**
|
|||
|
|
|
|||
|
|
#### **3. テストリリースの作成**
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# PowerShellで実行
|
|||
|
|
cd C:\Users\maita\posimai-project\ponshu_room_lite
|
|||
|
|
|
|||
|
|
# 環境変数を設定 (.env.local にGITEA_TOKENが入っているか確認)
|
|||
|
|
cat .env.local
|
|||
|
|
|
|||
|
|
# テスト実行
|
|||
|
|
.\release_to_gitea.ps1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**期待される動作:**
|
|||
|
|
1. Giteaに新しいリリース (`v1.0.16`) が作成される
|
|||
|
|
2. APK 4本がアップロードされる
|
|||
|
|
3. コンソールに成功メッセージが表示される
|
|||
|
|
|
|||
|
|
**エラーが出た場合:**
|
|||
|
|
- エラーメッセージをコピー
|
|||
|
|
- Antigravityまたは私に共有してください
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### **4. Gitea APIの動作確認**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# ブラウザで以下にアクセス
|
|||
|
|
http://100.76.7.3:3000/api/v1/repos/maita/ponshu_room_lite/releases
|
|||
|
|
|
|||
|
|
# JSON形式でリリース一覧が表示されれば成功
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **🟢 中優先度 (明日 - 1-2時間)**
|
|||
|
|
|
|||
|
|
#### **5. 外部アクセス設定 (重要!)**
|
|||
|
|
|
|||
|
|
**Option A: Tailscale Funnel (推奨)**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# SynologyにSSH接続
|
|||
|
|
ssh admin@100.76.7.3
|
|||
|
|
|
|||
|
|
# Tailscale Funnel有効化
|
|||
|
|
tailscale funnel 3000
|
|||
|
|
|
|||
|
|
# 公開URLを確認
|
|||
|
|
tailscale status
|
|||
|
|
# → https://YOUR-TAILSCALE-NAME.ts.net
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
その後、`index.html` を更新:
|
|||
|
|
```javascript
|
|||
|
|
const GITEA_PUBLIC_URL = 'https://YOUR-TAILSCALE-NAME.ts.net';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Option B: Synology リバースプロキシ**
|
|||
|
|
|
|||
|
|
1. Synology Control Panel → Login Portal → Advanced → Reverse Proxy
|
|||
|
|
2. 新規作成:
|
|||
|
|
- プロトコル: HTTPS
|
|||
|
|
- ホスト名: your-nas.synology.me
|
|||
|
|
- ポート: 443
|
|||
|
|
- 転送先: localhost:3000
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### **6. CORS設定**
|
|||
|
|
|
|||
|
|
**Gitea側で設定:**
|
|||
|
|
|
|||
|
|
```ini
|
|||
|
|
# Synology: /volume1/docker/gitea/gitea/conf/app.ini
|
|||
|
|
[server]
|
|||
|
|
# ... 既存設定 ...
|
|||
|
|
|
|||
|
|
# CORS設定を追加
|
|||
|
|
[cors]
|
|||
|
|
ENABLED = true
|
|||
|
|
SCHEME = https
|
|||
|
|
ALLOW_DOMAIN = your-app.vercel.app
|
|||
|
|
ALLOW_SUBDOMAIN = true
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
再起動:
|
|||
|
|
```bash
|
|||
|
|
# Container Manager でGiteaコンテナを再起動
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **🔵 低優先度 (余裕があれば)**
|
|||
|
|
|
|||
|
|
#### **7. ビルドスクリプトの統合**
|
|||
|
|
|
|||
|
|
`build_4_apks.sh` の最後に追加:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 最後に追加
|
|||
|
|
echo ""
|
|||
|
|
echo "APKビルド完了。Giteaにリリースを作成しますか? (y/n)"
|
|||
|
|
read -r answer
|
|||
|
|
if [ "$answer" = "y" ]; then
|
|||
|
|
powershell -File release_to_gitea.ps1
|
|||
|
|
fi
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 **動作確認チェックリスト**
|
|||
|
|
|
|||
|
|
### **ローカル確認**
|
|||
|
|
|
|||
|
|
- [ ] `.env.local` ファイルにGITEA_TOKENが設定されている
|
|||
|
|
- [ ] `release_to_gitea.ps1` が正常に実行できる
|
|||
|
|
- [ ] Gitea上にリリースが作成されている
|
|||
|
|
- [ ] APK 4本がリリースに添付されている
|
|||
|
|
|
|||
|
|
### **外部アクセス確認 (Tailscale Funnel設定後)**
|
|||
|
|
|
|||
|
|
- [ ] `https://YOUR-TAILSCALE-NAME.ts.net/api/v1/repos/...` にアクセス可能
|
|||
|
|
- [ ] CORSエラーが出ない
|
|||
|
|
- [ ] 配布ページからAPKをダウンロードできる
|
|||
|
|
|
|||
|
|
### **Eiji配布前の最終確認**
|
|||
|
|
|
|||
|
|
- [ ] スマホでダウンロードページにアクセス
|
|||
|
|
- [ ] ユーザー選択 (Eiji) が機能する
|
|||
|
|
- [ ] APKダウンロードが開始される
|
|||
|
|
- [ ] インストールできる
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎓 **Antigravityの実装 vs 理想的な実装**
|
|||
|
|
|
|||
|
|
| 項目 | Antigravity実装 | 理想的な実装 | 差分 |
|
|||
|
|
|------|----------------|------------|------|
|
|||
|
|
| アーキテクチャ | B案 (Gitea + Vercel) | ✅ 同じ | なし |
|
|||
|
|
| スクリプト品質 | 高品質 | ✅ 同じ | なし |
|
|||
|
|
| エラーハンドリング | 充実 | ✅ 同じ | なし |
|
|||
|
|
| **外部アクセス** | **未実装** | Tailscale Funnel | **要対応** |
|
|||
|
|
| CORS | 未対応 | CORS設定 | 要対応 |
|
|||
|
|
| ファイル名 | `.env.local` | `.env.local` | `.env` → `.env.local`に変更必要 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 **まとめ: 次のステップ**
|
|||
|
|
|
|||
|
|
### **今すぐ (10分)**
|
|||
|
|
|
|||
|
|
1. ✅ `.env` → `.env.local` にリネーム
|
|||
|
|
2. ✅ Gitea設定確認 (ユーザー名/リポジトリ名)
|
|||
|
|
3. ✅ `index.html` のURL修正
|
|||
|
|
|
|||
|
|
### **今日中 (30分)**
|
|||
|
|
|
|||
|
|
4. ✅ `release_to_gitea.ps1` をテスト実行
|
|||
|
|
5. ✅ Gitea上でリリース作成を確認
|
|||
|
|
|
|||
|
|
### **明日 (1-2時間)**
|
|||
|
|
|
|||
|
|
6. ✅ Tailscale Funnel設定 (外部アクセス有効化)
|
|||
|
|
7. ✅ CORS設定
|
|||
|
|
8. ✅ 配布ページのテスト (スマホから)
|
|||
|
|
|
|||
|
|
### **完成後**
|
|||
|
|
|
|||
|
|
9. ✅ Eijiに配布ページURLを送信
|
|||
|
|
10. ✅ フィードバック収集
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Antigravityの実装は85点です! あと少しの修正で完璧になります。** 🎉
|
|||
|
|
|
|||
|
|
まずは上記の「今すぐ」の3つを実施してください。その後、テスト実行の結果を教えていただければ、次のステップをサポートします!
|