← 一覧に戻る

english-study

GitHub ↗ Swift 最終push: 2026/9/3 22:55

WIP(現在進行中)

Work In Progress

このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。

現在の状況

今どこまで進んだか:

  • 何を作るかが確定した。ELLLO の One Minute English を教材にしたリスニング学習 iOS アプリ「George」(個人利用専用)
  • 教材データ基盤が完成。 tools/scrape/ で 762 件を取得済み(data/lessons.json、1.2MB)。動画ID・スクリプト・クイズ・レベル・話者つき。生 HTML は tools/.cache/ に残るので再実行は数秒
  • アプリのコアループが通しで動作。 聞く → 自己申告 → 答え合わせ(単語タップ) → 音と文字をつなぐ → 仕分け → 確認 → 保存 まで、シミュレータで確認済み
  • 隣接語のフレーズ統合、レッスンの間隔反復、語句カードの SRS、端末の Foundation Models による意味生成、いずれも実装・動作確認済み
  • README.md / CLAUDE.md を記入済み。設計判断の理由は .devnotes/DECISIONS.md に 7 件記録

次に何をするか:

  • claude -p のエラー内容を確認して、「よく使う表現」の事前抽出バッチ(tools/annotate/extract-phrases.mjs、未実行)を回す
  • 762 件のフラットな一覧に絞り込みの導線を足すか検討(現状はレベルと検索のみ。B1 が 718 件なのでレベル絞り込みはほぼ効かない)
  • 統計画面(視聴本数・語句数の推移)は未着手

詰まっていること・未決事項:

  • claude -p の実行でエラー。内容は未確認で、後日対応することにした。これが解決しないと事前抽出の表現データ(data/phrases.json)が作れない
  • シャドーイング+録音は v1 スコープ外として持ち越し中(「後々入れたい」)
  • レベルの分布が極端に偏っている(A2:30 / B1:718 / B2:14 / C1:5)ので、難易度の指標としては語数くらいしか使えない

過去のWIPアーカイブ

(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)

2026-09-03 22:52 時点のスナップショット

今どこまで進んだか:

  • 器だけできた状態。~/cdev/english-study を作成し、GitHub private リポジトリ ichirokisanuki/english-study と連携済み(main に push 済み、dev-tracked topic 付与済み)
  • README.md / CLAUDE.md / .gitignore / .devnotes/ 4ファイルは雛形のまま

次に何をするか:

  • 作るものを決める(テーマ: 単語帳 / リスニング / 学習ログ など、形態: CLI / Web / iOS など)
  • 決まり次第 README.md と CLAUDE.md の「(記入予定)」を埋め、技術スタックを選定する

詰まっていること・未決事項:

  • プロジェクトの中身が完全に未定。ここが決まらないと実装に入れない

2026-09-03 21:17 時点のスナップショット

(new-project-setup で作成した雛形のまま。記載内容なし)

ROADMAP(計画)

ロードマップ

今週

  • 何を作るかを決める(テーマ: 単語帳 / リスニング / 学習ログ など)
  • 形態を決める(CLI / Web / iOS など)と技術スタック選定
  • README.md と CLAUDE.md の「(記入予定)」を埋める
  • ELLLO から教材データを取得してアプリにバンドルする
  • コアループを実装して通しで動作確認する
  • claude -p のエラーを調べて「よく使う表現」の事前抽出バッチを回す

今月

  • レッスン一覧の絞り込み導線を足す(B1 が 718/762 でレベル絞り込みがほぼ効かない)
  • 統計画面(視聴本数・語句数・スキル別の推移)
  • 自分で何本か実際にやってみて、コアループの摩擦を洗い出す
  • シャドーイング+自分の声の録音(段階4のあとに置く)

今四半期

  • ウィジェット(ホーム画面から今日の 1 本へ)
  • App Intents(Siri から「英語やる」で起動)
  • タイマーの Live Activity
  • 語句カードの読み上げ(AVSpeechSynthesizer。Vimeo からは文単位の音声を切り出せないため)

いつか

  • ELLLO の Mixer 系(同じ質問に複数人が答える回)も教材に取り込む
  • 部分ディクテーション(聞き取れなかった 1 文だけ書き取る)
  • 教材ソースを差し替え可能な作りにする(ELLLO 以外も使えるように)
  • iCloud 同期(端末をまたいで使いたくなったら)

DECISIONS(意思決定)

意思決定記録

このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。


2026-09-03: 教材ソースを ELLLO の One Minute English に決める(個人利用専用)

背景: 英語学習アプリを作ることは決めたが、教材をどう調達するかが未決だった。自前で作るのは非現実的。

決定: ELLLO の One Minute English(1 分前後の動画+スクリプト+クイズ、762 件)を教材とし、個人利用専用とする。配布・ストア公開はしない。

理由: 1 分素材は繰り返し聞くコストがほぼゼロで、間隔反復に向く。構造も機械的に取れる形で揃っていた。ただしコンテンツは elllo productions の著作物で再利用ライセンスの明示がないため、公開する場合は権利者への許諾が必要になる。個人利用に限れば問題にならないので、そこで線を引いた。

2026-09-03: 語句は単体で保存せず、必ず出てきた一文とセットにする

背景: 「知らない単語・使える表現を貯めたい」というのが当初からの要望だった。

決定: 記録の最小単位を「語句+出てきた一文+出典レッスン」とし、文脈なしの保存経路を作らない。復習カードの表側も、語句単体ではなく対象語を伏せた文にする。

理由: 単語帳が使えるようにならない最大の理由は、単語を切り出した時点で文脈が消えることだと判断した。訳の暗記ではなく文の中で思い出させるほうが、実際に使える形で残る。

2026-09-03: 答え合わせ中は印を付けるだけにして、意味付けは別の段階に分ける

背景: 答え合わせ画面で語句をタップしたその場で意味を入力させる案があった。

決定: 答え合わせ(段階3)ではマーキングのみ。種別と意味の入力は仕分け(段階5)にまとめる。

理由: 一語ずつ調べながら進めると流れが切れて、5 分で終わるはずのものが 20 分になり、習慣として続かなくなる。聞く体験を止めないことを優先した。

2026-09-03: 理解度の自己申告はスクリプトを開く前に取り、ELLLO のクイズは主軸にしない

背景: 理解度の測定に ELLLO 付属のクイズを使う案があった。

決定: スクリプトを開く瞬間に 3 段階の自己申告を 1 タップ挟み、これを復習間隔の初期値にする。クイズは仕分け後のおまけに置く。

理由: ELLLO のクイズは 2 択 3 問で易しく、測定器としては弱い。また答え合わせの後にクイズをやっても素の理解度は測れない。答え合わせ前の感触はこの瞬間しか取れない値なので、そこで確実に取る。

2026-09-03: 復習を「レッスンの聞き直し」と「語句カード」の 2 レイヤーに分ける

背景: 間隔反復の対象を語句カードだけにするか、レッスンそのものも含めるかが未決だった。

決定: レッスン再視聴(1/3/7/21/60 日)を主、語句カードの SRS(1/3/7/16/35/90 日)を補助とする 2 レイヤー構成にする。聞き直しは字幕なしで 1 回聞いて「聞き取れた / まだ怪しい」を答えるだけ。

理由: リスニングを伸ばすのは、新しい素材を追い続けるより同じ素材を完全に聞き取れる状態にすることだと判断した。1 分素材なら繰り返しのコストが低いのでこれが成立する。聞き取れなかった回は段をゼロに戻さず 1 段だけ下げ、積み上げを壊さないようにした。

2026-09-03: 意味の生成は端末の Foundation Models に任せ、Claude API は使わない

背景: 語句の意味を自動生成したいが、当初は Claude API、次に claude -p(サブスク枠)が候補に挙がった。しかし iOS アプリから Mac の CLI は呼べず、中継サーバーを立てるのは個人利用アプリには重すぎる。

決定: 実行時の意味生成は iOS 26 の FoundationModels(オンデバイス LLM)で行う。claude -p はビルド時の「よく使う表現」事前抽出だけに使う。

理由: 役割が性質で分かれる。「どの表現が覚える価値があるか」は人によらず決まるので事前に全部処理できて、キュレーションが得意な Claude に向く。「自分が何を知らないか」は予測不能でその場で答える必要があり、オンデバイスで十分こなせる。この分担なら通信も API キーもサーバーも要らない。

2026-09-03: Xcode プロジェクトは xcodegen で生成し、.xcodeproj は git 管理外にする

背景: GUI を使わずにプロジェクトを作る必要があり、.xcodeproj を追跡するかどうかも決める必要があった。

決定: George/project.yml を正として xcodegen で生成する。.xcodeproj は .gitignore に入れ、クローン後に xcodegen generate を走らせる運用にする。

理由: .xcodeproj は Swift ファイルを 1 つ足すたびに差分が出る生成物で、追跡すると履歴がノイズで埋まる。project.yml なら設定変更が差分として読める。代わりにクローン後の 1 コマンドが必要になるが、README と CLAUDE.md に明記して許容範囲と判断した。

DEVLOG(作業ログ)

開発日誌

このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。


2026-09-03

22:52 - 教材データ基盤の構築とアプリ George の初期実装

やったこと:

  • プロジェクトの中身を決定。ELLLO の One Minute English を教材にしたリスニング学習 iOS アプリ「George」(名前の由来は英語学習のきっかけになったイギリス人「じょーじ」)
  • ELLLO のサイト構造を調査。動画は Vimeo 埋め込み(embed_permission: public・ドメイン制限なし)で、アプリ内の WKWebView から再生可能なことを確認
  • スクレイパーを実装(tools/scrape/)。762 件を取得して data/lessons.json(1.2MB)に。1 件ごとに 動画ID・スクリプト・クイズ・レベル・話者を保持
  • Xcode プロジェクトを xcodegen で生成する構成にして、アプリ本体を実装
    • コアループ 6 段階(聞く → 自己申告 → 答え合わせ → 音と文字をつなぐ → 仕分け → 確認)
    • スクリプトの単語タップ。隣接語を続けて叩くとフレーズに統合される(teacher + overseas → teacher overseas)
    • レッスンの間隔反復(1/3/7/21/60 日)と語句カードの SRS(1/3/7/16/35/90 日)
    • 端末の Foundation Models による文脈込みの意味生成
  • シミュレータ(iPhone 17 Pro / iOS 26.5)で全段階を通して動作確認。オンデバイス LLM も動作を確認(teacher overseas → 「外国で英語を教えること」)
  • README.md と CLAUDE.md の「(記入予定)」を埋めた

詰まったこと / 気づき:

  • ELLLO 側のデータに想定外のばらつきが多く、素直なパースでは壊れた。実測して直したもの:
    • マークアップが 2 系統(<br> 区切りと <div> 入れ子)
    • レベル表記も 2 体系混在(INT 4 の数字式と INT B1 の CEFR 式)。数字 1〜7 が A1〜C2 に対応することがレベル解説ページから判明
    • カードの表示番号に誤植(Video 762 と書いて 752 にリンク)。番号は URL から取るのが正しい
    • 2 人の対話回が 90 本あった。 単一話者前提の実装が誤りで、話者を配列に変更
    • サムネイルのファイル名から国名を推測する実装は誤りが多く(Sarah・1000 を国名として拾う)廃止した
  • セッション中にタブバーが生きていると、テスト中に誤爆して記録が全部消えた。実機でも起きるので .toolbar(.hidden, for: .tabBar) で塞いだ
  • claude -p によるバッチ抽出はスクリプトを書いたが未実行(実行時にエラーが出たため後日対応)

次回やること:

  • claude -p のエラー内容を確認して、762 件からの「よく使う表現」事前抽出バッチを実行する
  • レッスン一覧の表示が 762 件フラットなので、絞り込みの導線を足すか検討する

2026-09-03

21:16 - プロジェクト初期セットアップ

やったこと:

  • new-project-setup Skill で ~/cdev/english-study を新規作成
  • git init -b main → 初回コミット → GitHub private リポジトリ ichirokisanuki/english-study を作成して push
  • dev-tracked topic を付与(dev-tracker の一覧に載るようにするため)
  • 雛形配置: README.md(english-study(英語学習))、CLAUDE.md、.gitignore(generic)、.devnotes/ 4ファイル

気づき:

  • 中身(何を作るか)はまだ未定。README / CLAUDE.md の「概要」はいずれも (記入予定) のまま

次回やること:

  • 何を作るか(単語帳 / リスニング / 学習ログ など)と形態(CLI / Web / iOS)を決める
  • 決まったら README.md と CLAUDE.md の「(記入予定)」を埋める

最近のコミット

README

english-study

英語学習アプリ George の開発リポジトリ。

ELLLO の One Minute English(1分前後の英語スピーチ動画+スクリプト)を教材に、 リスニングを鍛えながら、出てきた表現や知らない単語を文脈ごと貯めていく iOS アプリ。

名前は、英語学習を始めるきっかけになったイギリス人「じょーじ」から。

コアループ

1本あたり5分弱。

# 段階 やること
1 聞く 字幕なしで再生。回数は自由。スクリプトは畳まれている
2 自己申告 スクリプトを開く瞬間に理解度を3段階でタップ
3 答え合わせ スクリプト表示。聞き取れなかった語をタップして印だけ付ける
4 音と文字をつなぐ スクリプトを見ながらもう一度再生
5 仕分け 印を付けた語句を種別・意味付きでカード化
6 確認 ELLLO のクイズ

設計の要点は .devnotes/DECISIONS.md を参照。

構成

George/          iOS アプリ(SwiftUI / SwiftData / iOS 26)
  project.yml    Xcode プロジェクトの定義。これが正で .xcodeproj は生成物
  Sources/
data/            教材データ(tools/scrape が生成、アプリにバンドルされる)
  catalog.json   全レッスンのメタ情報
  lessons.json   スクリプト・動画ID・クイズ入り 762 件
tools/
  scrape/        ELLLO から教材を取ってくる
  annotate/      claude -p で「よく使う表現」を抽出する(未実行)

セットアップ

brew install xcodegen        # 未導入なら
cd George && xcodegen generate
open George/George.xcodeproj

.xcodeproj は git 管理外なので、クローン後は xcodegen generate が必要。

教材データの再生成

生 HTML は tools/.cache/ に残るので、2 回目以降は数秒で終わる。

node tools/scrape/fetch-catalog.mjs   # 一覧 → data/catalog.json
node tools/scrape/fetch-lessons.mjs   # 本文 → data/lessons.json

教材について

ELLLO のコンテンツは elllo productions の著作物で、再利用ライセンスは明示されていない。 このアプリは個人利用のみを前提とする。 配布・公開する場合は権利者への許諾が必要。