shiping
An interview assistant and an exam assistant that uses AI to provide solution ideas in real time during 「面试」 or 「在线考试」.
AI translation
Minimal vocabulary app built with Flutter & Drift (SQLite). Local-first, expanding to a self-hosted learning hub.
EducationTypeScript · PythonGitHub @novvvvOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗日本語 · 한국어
ウェブと iOS で同じ単語帳がつながる、ミニマルな単語帳アプリ。
外国語の勉強が好きで、単語アプリをいくつも使ってきました。机ではウェブ、外ではスマホで使うのですが、 同じ単語帳がウェブとアプリの間でつながらないことがずっと不満でした。 そこで、ウェブと iOS で同じ単語帳をリアルタイムに同期し、街で見かけた単語を OCR でその場で保存できる、 自分専用の単語帳を作ることにしました。
地下鉄のように通信が不安定な場所でも学習が途切れないよう、モバイルはオフラインファーストで設計し、 接続が戻ったら差分だけを送ります。単語の登録から復習まで、自分が毎日使うことを前提に作っている進行中のプロジェクトです。
復習セッション。採点は「わからない / 覚えた」の二択だけ。単語帳の編集・全体統計・単語パックのダウンロードもウェブから。
(id, user_id) 複合主キーによるユーザー分離と、Firebase Auth 連携のトークン検証アプリはローカル DB に書いてから差分を push / pull し、ウェブはサーバーを原本として直接 CRUD する。 Firebase は認証だけを担い、データはすべて自前の Hub に置く。
通信量を抑える増分同期の設計:
毎回すべてを送受信する代わりに、ローカルの変更を SyncOutbox に貯めて 100 件単位で push し、
最後の cursor 以降の差分だけを pull する同期パイプラインを構築しました。
データの性質に応じた競合解決: オフライン端末どうしの同期で、通貨やクエストのような累積値が「更新時刻 (updated_at) が新しい方が勝つ」規則によって 消えてしまう問題を特定しました。通貨の計算とクエストの完了判定はサーバーだけが冪等 (idempotent) に行い、 アプリは結果を受け取るだけ、と役割を分けて解決しました。
マルチプラットフォームでのアルゴリズム (SM-2) の一致:
アプリ (Dart) とサーバー (Python) の両方で復習アルゴリズムを計算する際、言語標準の round() の丸め方の違いで
次回復習日がずれる問題を発見しました。丸め規則を統一し、同一のテストベクタを両者で共有することで差異をなくしました。
可用性を優先した意図的なトレードオフ: 同期トランザクション中に FK 違反が起きると cursor までロールバックされ、同じバッチを永久に再試行する膠着状態に陥ります。 これを避けるため FK を無効にし、アプリ側で整合性を保証する方針とその根拠を文書に残しました。
nyaki/
├── app/ Flutter アプリ
├── web/ Next.js ウェブ
├── api/ Sync Hub (FastAPI + Postgres)
└── docs/ アーキテクチャ · タスク · 企画
# サーバー — 環境変数の詳細は api/README.md
cd api && docker compose up --build # http://localhost:8000/docs
# ウェブ
cd web && npm install && npm run dev # http://localhost:3000
# アプリ
cd app && flutter pub get && flutter run
cd api && pytest # 同期 · SRS · ゲーミフィケーション · コンテンツ
cd app && flutter test # SM-2 の計算 · 進捗リポジトリ
| ドキュメント | 内容 |
|---|---|
| docs/API.md | API 仕様 · 書き込みルール · 同期 · 上限 (韓国語) |
| docs/archive/ | 保管文書 — アーキテクチャ · タスク · テスト · 過去の企画 (韓国語) |
| api/README.md | ローカル実行 · 環境変数 · デプロイ手順 |