ICU生の時間割・履修計画アプリの決定版
- 公式授業一覧から取得されたすべてのコースを検索
- Long 4, 5, 6, 7など、ICUならではのコマ割りも表示
- ログインしてすべてのデバイスで最新の時間割を共有
| Page | Screenshots |
|---|---|
| Home | ![]() |
| Explore | ![]() |
| Timetable | ![]() |
- 100人のTermly Active UserをICU内で獲得する
- Google / DuckDuckGoで「ICU 履修登録」「ICU 時間割」「ICU academic planning」「ICU registration」で1番目
- 私が卒業しても自動で更新される状態にする
- 授業データを公開情報のみで構築する
- 教室情報は各自に打ち込んでもらえるように
- regnoはsyllabus公開後にリンクから取得
- GitLab CI/CD?
- とにかく時間割作成に使いやすいものである
- long時間割対応 (しょうもないことだがアイデンティティ)
- 軽量 (めざせ 全ページPageSpeedInsights 100): 全ページ97点以上達成,充分だろう
- ICUらしくある
- いろいろなものがひしめくリベラルアーツの感じを楽しく表現する
- プロジェクトとして持続可能なものである
- 後輩に引き継ぐ前提で作る,その価値があるものにする
- 後進育成
- Web/アプリ開発入門
- ハッカソン
- オープンソース
- ICUのいろいろな団体とコラボする
- できればCTLなどでも使ってもらいたい
- 木越が責任を持って取り組む
- Transparency
- Share Issues, Feature Requests
- 透明性のある予算と,ちゃんと収支均衡を取る
- PR
- 対面で宣伝
- Instagram等でICU関連の団体/個人に宣伝してもらう
- 受験生にリーチ
- 「こんなサイトを学生が作る大学なんだ!」+入学後に使ってもらう
- コンポーネントテスト
- ちゃんとWebアナリティクスを取って開発の励みにする
- ICUrriculum
- Timetable4ICU: 2026のスケジュールは更新されていない
- すごい時間割
- Penmark
- Hupass
- 現在の時間割
- Twinte
- Webサービス公開前のチェックリスト
- 過去のTimetable for icu
- 1代目「ICUTTABLE」
- 不明
- 2代目「ICUTTABLE#2」: ICU生向け時間割アプリ「ICUTTABLE#2」開発者インタビュー
- 新井友朗さん(ID17-18か?)
- 3代目「Timetable For ICU」: 私の芽―ICU時間割アプリを作る
- 4代目 : Timetable4ICU - 国際基督教大学の時間割アプリ
- 1代目「ICUTTABLE」
- Astro
- BetterAuth (Google OAuth)
- Drizzle ORM
- TypeScript
技術構成はこちらの記事でも解説されています: 国際基督教大学の非公式時間割/履修計画アプリ「ICUのじかんわり」をAstro+Cloudflare Workers+D1でつくりました | Zenn
/
├── migrations/
│ └── migration.sql
├── public/
│ └── favicon.svg
├── scripts/
│ ├── data/
│ │ ├── ehandbook/ // 一般公開されているシラバスページ(HTML)はここに入れる
│ │ └── icumap/ // 学生向けのシラバスページ(HTML)はここに入れる
│ └── parser.py
├── src/
│ ├── assets/
│ │ └── astro.svg
│ ├── components/
│ │ └── Component.astro
│ ├── constants/
│ │ └── config.ts // Constants used globally
│ ├── db/
│ │ ├── data/
│ │ └── schema/
│ ├── lib/
│ │ └── server.ts // schema definitions, auth-related files
│ ├── pages/
│ │ ├── api/
│ │ │ └── api.ts
│ │ ├── index.astro
│ │ └── en/
│ │ └── index.astro
│ ├── styles/
│ │ └── global.css
│ ├── env.d.ts // Type for Astro
│ └── middleware.ts
└── package.json
All commands are run from the root of the project, from a terminal:
| Command | Action |
|---|---|
bun install |
Installs dependencies |
bun dev |
Starts local dev server at localhost:4321 |
bun run build |
Build your production site to ./dist/ |
bun preview |
Preview your build locally, before deploying |
bun astro ... |
Run CLI commands like astro add, astro check |
bun astro -- --help |
Get help using the Astro CLI |
Run Test
bunx playwright testFormat Code
bun formatCreate types from wrangler.jsonc
bunx wrangler typesCreate schema for BetterAuth
bun x auth@latest generate --config=./src/lib/auth/cli.ts --output=./src/db/schema/auth.tsCreate migration file by Drizzle Kit
--custom Create Empty Migration File
--name=clear_user_name_image Set Custom Name on Migration File
bunx drizzle-kit generate一度生成したmigrationファイルをなかったことにする
bunx drizzle-kit dropMigration to D1 Remoteは1度目は通らないことがあるが2回目やればいけるときがある
bun db:migrate:localbun db:migrate:remoteもし外部キー制約が通らない場合
bun wrangler d1 execute timetable_icu --remote --file=./migrations/0012_smart_mojo.sqlなどとしてmigration出来るが,これではD1のmigration履歴が残らないため,上記execute後に上記 sqlファイルの中身を一旦空にしてapplyする方法がある.私は一度これをやってPasskey Tableを消してしまったので推奨しない. -->しかし,wrangler applyではPRAGMA foreign_keys = OFF;が勝手に無効化されることがあるので,bun wrangler d1 executeでやらなければいけない場面もありそう.
Debug with Cloudflare Environment
bun run build && bun x wrangler devD1でのSQL文実行例
bun wrangler d1 execute timetable_icu --file=scripts/out/sync_courses.sqlCreate JSON from HTML
bun db:scrape:icumap # 学生専用サイトからダウンロードしたHTMLがある前提
bun db:scrape:ehandbook # 公開情報からダウンロードしたHTMLがある前提Local DBにJSONからcourses/categoriesを入れる
bun db:push:localHTML->JSON->Local DBを一括で実行
bun db:sync:localRemote DBにJSONからcourses/categoriesを入れる
bun db:push:remoteHTML->JSON->Remote DBを一括で実行
bun db:sync:remoteライセンス出力
bun x generate-license-file --input package.json --output CREDITSリモートのログ出力
bun wrangler tail

