osad-sakana
← Works

Narapy — Python Learning Environment

narapy

学習用Python環境

サーバー不要で、ブラウザだけでPythonを書いて実行できる学習用環境。タートルグラフィックスやmatplotlibの描画、コード補完まで、すべてブラウザの中で完結します。

GitHub ↗アプリ ↗Web
Narapy — Python Learning Environmentのスクリーンショット
Narapy

Narapy

ブラウザ完結型 Python 学習環境

Vite TypeScript Tailwind CSS Pyodide


✨ Narapy とは

Narapy は、ブラウザだけで Python を書いて実行できる学習用 Web アプリです。 コードの実行結果やタートルグラフィックスの描画をその場で確認しながら、 「書いて理解する」体験を提供します。

サーバーは不要。すべてブラウザの中で完結します。Python の実行も、 タートルグラフィックスの描画も、すべてあなたの手元のブラウザで動きます。

💡 標準ライブラリの turtle 互換モジュールを内蔵。import turtle で図形描画の授業がそのまま動きます。


🎯 主な機能

機能 説明
🐍 ブラウザ内 Python 実行 Pyodide を Web Worker で動かし、メインスレッドを止めずに実行
⌨️ コード補完 Pyodide を使った Web Worker 上での Python コード補完(Monaco エディタ)
🐢 タートルグラフィックス Tkinter 不要の Canvas 独自実装。アニメーション付きで図形を描画
📊 matplotlib 画像表示 plt.show() の出力をモーダルで表示
📂 プロジェクト保存・復元 複数ファイル・ディレクトリを .narapy 形式で書き出し/読み込み、フォルダごとアップロードも可能
🔗 共有リンク Python コードやプロジェクトをURLのハッシュに埋め込んで共有(サーバー送信なし)。/make-url で生成可能
🎨 パネル UI エディタ・実行ログを自由に表示/非表示、サイズ調整も自在
🔤 読みやすさ重視 UI に BIZ UDPGothic、コードに 0xProto を採用。フォントサイズも調整可能

🚀 クイックスタート

前提: Node.js 22+ / pnpm 10+ パッケージ管理は pnpm のみ(npm / yarn は使用しないでください)

# 依存関係をインストール
pnpm install

# 開発サーバー起動
pnpm dev

ブラウザで表示された URL(通常 http://localhost:5173)を開けば、すぐに使い始められます。


🛠️ 開発コマンド

コマンド 内容
pnpm dev 開発サーバー起動
pnpm build プロダクションビルド
pnpm preview プロダクションビルドのプレビュー
pnpm typecheck TypeScript 型チェック(tsc --noEmit)
pnpm test Vitest でテスト実行
pnpm test:watch Vitest をウォッチモードで実行

🏗️ アーキテクチャ

Narapy は フロントエンド完結型。バックエンドサーバーを持たず、 重い処理(Python 実行)は Web Worker(WebAssembly 上の Pyodide)に逃がしています。

┌─────────────────────────────────────────────────────────────┐
│                     ブラウザ (UI スレッド)                     │
│                                                               │
│        🐍 Monaco エディタ ⇄ 🐢 Turtle/📊 matplotlib             │
│                   │                                           │
│                   ▼                                           │
│        ┌──────────────────┐                                   │
│        │  Pyodide Worker  │                                   │
│        │  Python 実行      │                                   │
│        └──────────────────┘                                   │
└─────────────────────────────────────────────────────────────┘

技術スタック

レイヤー 採用技術
ビルド Vite 6 + TypeScript(Vanilla TS、フレームワークなし)
スタイル Tailwind CSS v4(@tailwindcss/vite、設定ファイル不要)
コードエディタ Monaco Editor
Python 実行 Pyodide 0.27(Web Worker 経由)

ディレクトリ構成

narapy/
├── src/
│   ├── main.ts            # エントリポイント(初期化・各モジュール連携)
│   ├── editor/            # Monaco エディタ・コード補完・フォントサイズ
│   ├── completion.worker.ts # Pyodide を使ったコード補完 Web Worker
│   ├── runner/            # 実行・Turtle/matplotlib 描画・エラー翻訳
│   ├── pyodide/           # Pyodide 連携(Turtle互換モジュール)
│   ├── lib/               # Pyodide ローダーなど共通ユーティリティ
│   ├── explorer/          # ファイルエクスプローラー・アップロード
│   ├── fileio/            # .narapy プロジェクト入出力
│   ├── urlload/           # URLの #code= / #project= / ?project=<URL> 読み込み
│   ├── makeUrl/           # /make-url(共有リンク生成ページ)のロジック
│   ├── layout/            # パネルレイアウト(split.js、状態をlocalStorageに永続化)
│   ├── about/             # ライセンス表示
│   ├── theme/             # カラーパレット・テーマ切り替え
│   └── pyodide.worker.ts  # Pyodide 初期化 Web Worker
├── docs/
│   ├── turtle-reference.md # 教材作成者向け Turtle リファレンス
│   └── url-loading.md      # 外部サイト連携・共有リンクの仕組み
├── index.html             # メイン画面(エディタ / ログ)
└── make-url.html          # 共有リンク生成ページ(/make-url)

🐢 タートルグラフィックス

標準 Python の turtle は Tkinter 依存でブラウザでは動きませんが、 Narapy は Canvas 上に描く独自実装を内蔵しています。 import turtle でそのまま書け、実行すると描画モーダルがアニメーション表示されます。

import turtle

for _ in range(4):
    turtle.forward(100)
    turtle.right(90)

対応 API の一覧や教材作成時の注意点は docs/turtle-reference.md を参照してください。


🔗 共有リンク

Python コードやプロジェクトを、サーバーを介さずURLだけで共有できます。値はURLのハッシュ(#以降)に zlib圧縮 + base64url化して埋め込むため、アクセスログにも残りません。

方式 用途
#code=<...> 単一ファイル(main.py)を開く
#project=<...> 複数ファイル構成のプロジェクトを開く(外部サイト連携の推奨方式)
?project=<URL> 外部サーバーが動的生成する .narapy をCORS経由で読み込む(画像等を含む大きめの教材向け)

リンクは /make-url(make-url.html)にブラウザでアクセスすると、コードやファイルを貼り付けるだけで生成できます (教材作成者向けのツールで、アプリ本体からの導線はあえて設けていません)。

詳しい仕組み・外部サイト連携時の実装例は docs/url-loading.md を参照してください。


📝 実装メモ

ブラウザの制約まわりで知っておくと役立つポイントです。

詳細は CLAUDE.md にまとまっています。


🚢 デプロイ

main ブランチへの push で GitHub Actions が自動デプロイします (.github/workflows/deploy.yml)。 S3 / CloudFront などへ手動デプロイする場合は、上記の COOP/COEP 相当のヘッダー付与を忘れずに。


Made with 🐍 — 書いて、動かして、理解する。