ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A web-based learning platform for ear training (Gehörbildung), built with Django. The platform supports two roles (teacher / student) and covers the full teaching workflow — from module management and homework submissions to grading. I teach ear training myself and always struggled to consistently manage course materials and keep up with student submissions. That frustration is what drove me to build this. If I were teaching again, this is the tool I'd want to use.README 전문 보기 ↗
A web-based learning platform for ear training (Gehörbildung), built with Django. The platform supports two roles (teacher / student) and covers the full teaching workflow — from module management and homework submissions to grading.
I teach ear training myself and always struggled to consistently manage course materials and keep up with student submissions. That frustration is what drove me to build this. If I were teaching again, this is the tool I'd want to use.
Live Demo: aural-learning-platform.onrender.com
Role Login Password Teacher Demo_LehrkraftDemo1234!Student Demo_Schüler_inDemo1234!
| Teacher Dashboard | Module Detail |
|---|---|
| Homework Management | Invitation System |
|---|---|
| Student Dashboard | Glossary |
|---|---|
| Area | Technology |
|---|---|
| Framework | Django 5.2 |
| Database | PostgreSQL (production), SQLite (development) |
| File Storage | Cloudflare R2 (3 buckets) / local (development) |
| Static Files | WhiteNoise + CompressedManifestStaticFilesStorage |
| Deployment | Gunicorn, HTTPS, HSTS |
| Dependencies | django-storages, boto3, adminsortable2 |
| Frontend | Vanilla CSS (Glass Design System), Vanilla JS |
aural-learning-platform/
├── accounts/ # User model, roles, login, invitation system
├── modules/ # Core logic: modules, glossary, submissions, dashboards
├── config/ # Django configuration, URLs, middleware
├── templates/ # Global templates (login, about, imprint …)
└── imports/ # Scripts for initial module data import
The role system uses a custom role field on the user model — not Django's built-in permissions or groups:
class User(AbstractUser):
TEACHER = "TEACHER"
STUDENT = "STUDENT"
role = models.CharField(choices=ROLE_CHOICES, default=STUDENT)
@property
def is_teacher(self): return self.role == self.TEACHER
@property
def is_student(self): return self.role == self.STUDENT
Views are protected with TeacherRequiredMixin and StudentRequiredMixin.
Three separate buckets — based on file sensitivity:
| Storage | Contents | Visibility |
|---|---|---|
StudentMaterialsR2Storage | Script, homework PDF, audio | Logged-in users |
TeacherMaterialsR2Storage | Solutions (PDF 2 & 4) | Teachers only |
SubmissionsR2Storage | Student submissions | Teachers + submitting student |
In development mode (DEBUG=True), files are stored locally.
User (accounts)
├── role: TEACHER | STUDENT
└── created_invites → InviteToken
InviteToken (accounts)
├── token: UUID (single-use, valid for 7 days)
├── role: TEACHER | STUDENT
├── first_name, last_name, email
└── used: bool
Module
├── title, slug, order
├── inclass (lesson content), homework
├── pdf_1 … pdf_4 (script, solutions, homework)
├── audio_1 … audio_4 + titles
├── tasktype → TaskType (M2M)
└── glossary_terms → GlossaryEntry (M2M)
Unit (created automatically when a homework PDF is added)
├── module → Module (1:1)
├── date, number, kind (REGULAR | HOLIDAY | EXAM | OTHER)
└── submissions_enabled: bool
Submission
├── unit → Unit
├── student → User
├── status: SUBMITTED | CORRECTED
└── files → SubmissionFile (1:N)
ModuleCompletion
├── user → User
└── module → Module
GlossaryEntry
├── title, slug, definition
├── exam_relevant: bool
└── modules → Module (M2M)
TaskType
└── name, slug
Teachers generate invitation links directly in the frontend — no admin access required.
Flow:
/teacher/invite/ → enter first name, last name, email, role → generate linksubmissions_enabled = True → student can upload filesSUBMITTED → CORRECTED (manually by teacher or via bulk action)Prerequisites: Python 3.11+, PostgreSQL (or SQLite)
git clone <repo>
cd aural-learning-platform
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Create a .env file:
SECRET_KEY=your-secret-key
DEBUG=True
DATABASE_URL=postgres://user:password@localhost:5432/dbname
# Contact form
[email protected]
# Cloudflare R2 (production only)
R2_ACCESS_KEY_ID=...
R2_SECRET_ACCESS_KEY=...
R2_ENDPOINT_URL=https://<account>.r2.cloudflarestorage.com
R2_BUCKET_STUDENT=...
R2_BUCKET_TEACHER=...
R2_BUCKET_SUBMISSIONS=...
Migrate and run:
python3 manage.py migrate
python3 manage.py runserver
Load demo data (optional):
python3 manage.py create_demo_data
Creates two demo accounts ([email protected] / [email protected], password Demo1234!) along with sample modules, task types, and glossary entries.
To make a superuser a teacher — set role = TEACHER in the admin, or via the shell:
python3 manage.py shell -c "
from accounts.models import User
u = User.objects.get(username='<username>')
u.role = 'TEACHER'
u.save()
"
DJANGO_ENV=production
DEBUG=False
DATABASE_URL=<postgres-url>
python3 manage.py collectstatic
gunicorn config.wsgi:application
Automatically enables: HTTPS redirect, HSTS (7 days), secure cookies, SSL headers.
| Topic | Details |
|---|---|
Remove django-taggit | Taggit is no longer active in the code (replaced by TaskType), but remains in INSTALLED_APPS due to migration history. Fix: squash migrations, then remove the package from settings and requirements.txt. |
aural-learning-platform/
├── accounts/
│ ├── models.py # User, InviteToken
│ ├── views.py # RoleBasedLoginView
│ ├── forms.py # RoleLoginForm, AcceptInviteForm
│ ├── mixins.py # TeacherRequiredMixin, StudentRequiredMixin
│ ├── admin.py
│ └── migrations/
├── modules/
│ ├── models.py # Module, Unit, Submission, GlossaryEntry, …
│ ├── views.py # ~30 views
│ ├── urls.py
│ ├── forms.py # ModuleForm, ContactForm
│ ├── admin.py # Extended admin views
│ ├── storages.py # R2 storage classes
│ ├── context_processors.py
│ ├── widgets.py
│ ├── migrations/
│ ├── static/modules/
│ │ ├── css/style.css # Main stylesheet (Glass Design System)
│ │ ├── css/auth.css
│ │ ├── js/script.js
│ │ └── icons/
│ └── templates/
│ ├── base.html
│ ├── includes/sidebar.html
│ └── modules/ # All app templates
├── config/
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── middleware.py # RememberMeMiddleware
├── templates/ # Global templates (login, imprint, …)
├── imports/ # Data import scripts
├── media/ # Local uploads (development only)
├── staticfiles/ # collectstatic output
├── requirements.txt
└── manage.py