ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
멀티진진가 — 진짜 진짜 가짜 실시간 교실 게임 · made by 문수네집
Translation pending
EducationHTML · JavaScriptGitHub @moonsuguguOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
🎭 멀티진진가 (진짜 진짜 가짜) · made by 문수네집 학생들이 진짜 사실 5가지를 적으면 그중 하나를 그럴듯한 가짜로 바꿔, 반 전체가 "어느 것이 가짜일까?"를 맞히는 실시간 교실 게임입니다. QR로 입장하고 api.moonsunezip.com의 PostgreSQL REST API와 방 단위 WebSocket으로 동기화합니다. 화면은 index.html, 데이터 연결은 postgres-adapter.v1.js입니다. 방·학생·문제·투표는 임시 데이터입니다. made by 문수네집 — 🏠 문수네집 · 📷 인스타그램 · ✨ moonsune.zip ✅ 배포 완료 — 바로 사용 가능 • 데이터 원본: 홈서버 PostgreSQL (api.moonsunezip.com) • 배포: GitHub main 푸시 후 홈서버 자동 배포. Firebase 데이터 저장은 사용하지 않습니다.Read the full README ↗
학생들이 진짜 사실 5가지를 적으면 그중 하나를 그럴듯한 가짜로 바꿔, 반 전체가 "어느 것이 가짜일까?"를 맞히는 실시간 교실 게임입니다.
QR로 입장하고 api.moonsunezip.com의 PostgreSQL REST API와 방 단위 WebSocket으로 동기화합니다. 화면은 index.html, 데이터 연결은 postgres-adapter.v1.js입니다. 방·학생·문제·투표는 임시 데이터입니다.
made by 문수네집 — 🏠 문수네집 · 📷 인스타그램 · ✨ moonsune.zip
✅ 배포 완료 — 바로 사용 가능
👉 https://jinjinga.moonsunezip.com
- 데이터 원본: 홈서버 PostgreSQL (
api.moonsunezip.com)- 배포: GitHub
main푸시 후 홈서버 자동 배포. Firebase 데이터 저장은 사용하지 않습니다.
api.moonsunezip.com/v1/jinjinga/rooms/...의 학생·문제·투표별 행을 사용하며 별도 API·DB·서버·소켓을 만들지 않습니다. 100ms 이상 간격으로 생성하고 한 번에 1표씩 전송합니다. 기존 requestId 및 제한된 재시도를 유지합니다.검증: node --test demo-bots.test.mjs postgres-adapter.test.mjs. 50명 생성, 25명 투표, 50명 정답률 변화, 중복 클릭, 새로고침·방 이동, 학생별 제출 플래그 저장을 확인합니다. 브라우저 검증은 운영 API와 분리한 로컬 API 모형을 사용했습니다.
문제 방 만들기 → 주제 입력 + 가짜 방식 선택(AI / 직접 작성) → 방 생성○/○ 완료)발표 시작하기 → 학생 한 명씩 문제 슬라이드 표시정답 공개 → 가짜 강조 + 진짜값 + 정답률 → 다음 → 반복학생이 진짜 5개 중 하나를 골라 직접 비슷한 가짜로 바꿉니다. 작성 화면에 예시·팁이 자동으로 표시돼요:
AI·외부 API를 전혀 쓰지 않습니다. API 키·요금·네트워크 호출이 필요 없어 100% 무료로 동작합니다.
rooms/JJG_<코드>
├─ topic, state(writing|presenting|done)
├─ players/<pid> : name, submitted
├─ problems/<pid> : items[5], fakeIndex, realValue, submittedAt
├─ present : order[], idx, revealed
└─ votes/<주인pid>/<투표자pid> : 선택한 보기 index
기존 qr-bingo 보안 규칙(rooms/$room 읽기·쓰기 허용)을 그대로 사용하므로 규칙 수정이 필요 없습니다.
index.html — 앱 전체 (HTML/CSS/JS + Firebase + QR, 빌드 불필요)firebase.json, .firebaserc — 배포 설정 (hosting target: jinjinga → 사이트 jinjinga-class)다른 세션·다른 AI 에서 이 앱을 고치기 전에 이 섹션을 먼저 읽으세요. 서버 관리자가 관리하는 섹션입니다(마지막 갱신 2026-09-27). 앱 설명은 위쪽 본문을 보세요.
| 항목 | 값 |
|---|---|
| 주소 | https://jinjinga.moonsunezip.com |
| 서버 포트 | 3001 (PM2 이름 jinjinga) |
| 배포 브랜치 | main |
| 배포 방식 | 빌드 없음 — 저장소 루트의 index.html 등을 그대로 정적 서버가 제공 |
| 서버 위치 | C:\homeserver\apps\multijinjinga |
postgres-adapter.v1.js → https://api.moonsunezip.com/v1/jinjinga/…, 실시간은 wss://api.moonsunezip.com/v1/realtime?room=방코드 입니다(쿼리 이름은 room, code 아님). 실시간은 서버→화면 단방향이고, 보내는 것은 HTTP 로 합니다.jjg_* 테이블)는 임시 데이터입니다. PostgreSQL UNLOGGED 테이블이라 빠르지만, 24시간이 지나면 자동 삭제되고 서버가 비정상 종료되면 비워집니다. 선생님이 오래 남길 기능(문제 저장 등)은 /v1/documents 같은 영구 저장소를 쓰세요.firebase.json, pb-adapter.js 는 예전 흔적입니다. 새 코드에서 쓰지 마세요.127.0.0.1 에만 열리고, 외부 접속은 Cloudflare Tunnel 이 전담합니다(집 IP·포트 비노출, HTTPS 자동).git reset --hard origin/<브랜치> 로 코드를 통째로 덮어쓰고 → npm ci → npm run build → PM2 재시작 순서로 배포합니다.따라서:
package-lock.json 을 반드시 커밋하세요(npm ci 는 lock 파일이 없으면 실패합니다)..md 문서만 바꾼 push는 재시작 없음).| 규칙 | 이유 |
|---|---|
서버는 HOST, PORT 환경변수를 읽고 기본값을 127.0.0.1 로 | 주소를 0.0.0.0 으로 코드에 고정하면 서버 설정으로 바꿀 수 없음 |
| IP 당 제한을 걸지 마세요 | 학교는 전교생이 공인 IP 하나로 나갑니다. 윷놀이의 "IP당 방 6개" 제한이 학교 전체를 막았습니다 |
| 방 상태 전송 시각·타이머는 방마다 따로 | 전역 변수 하나로 두면 한 반의 활동이 다른 반 갱신을 밀어냅니다(줄다리기에서 최장 4초 멈춤) |
큰 상태를 자주 보내면 WebSocket 압축(perMessageDeflate) | 줄다리기 20개 반 기준 161Mbps → 3Mbps |
| 끊긴 학생이 60초 안에 같은 자리로 재접속할 수 있게 | 교실 와이파이는 자주 끊깁니다. 빈 방도 60초는 유지하세요 |
| 요청 처리 중 동기 파일 I/O·느린 OS 호출 금지 | Windows 에서 os.networkInterfaces() 1회 25ms → 30명 방에서 서버가 멈췄습니다 |
| 요청마다 목록 전체를 훑는 코드 금지 | 사용자가 늘수록 느려집니다(backend 처리량이 4분의 1이던 원인) |
| 비밀값(키·비밀번호)은 저장소에 넣지 않기 | 서버의 비밀값은 C:\homeserver\secrets 에 따로 있습니다 |
부하 목표: 한 학교 20개 반 동시 사용(약 600명). 전국 배포라 한글날처럼 특정 날에 몰립니다.
| 용도 | 주소 |
|---|---|
| 데이터 API (PostgreSQL) | https://api.moonsunezip.com — /v1/documents/doc·/query·/commit, /health |
| 데이터 실시간 알림 (서버→화면 단방향) | wss://api.moonsunezip.com/v1/realtime?room=방코드 · /v1/documents/realtime?scope=범위 |
| 공용 게임 서버 (메모리, 양방향) | wss://game.moonsunezip.com/v1/game?room=방코드&game=게임이름&name=이름 |
새 주소(서브도메인)나 새 포트가 필요하면 서버 쪽에서 Cloudflare 설정과 PM2 등록을 해야 합니다. 코드만 올려서는 열리지 않습니다.
이 저장소를 고치기 전에 moonsugugu/coderule 을 먼저 읽으세요. 사람과 AI 모두 지킵니다.
핵심 여섯 가지
메시지 크기(바이트) × 초당 횟수 × 받는 사람 수 × 8 ÷ 1,000,000 으로 완료 전에 잰다.
2026-10-02 고조선이 30명 방 하나에 22Mbps를 써서, 20개 반이 몰리자 집 업로드(약 170Mbps)가 막혀 모든 앱이 끊겼다.perMessageDeflate)을 켜고, 위치처럼 계속 바뀌는 값은 초당 5HOST·PORT 환경변수(기본 127.0.0.1), 요청 경로에 동기 I/O 금지..md 문서만 바꾼 push는 재시작 없이 반영된다)api.moonsunezip.com)가 맡는다. backend 가 쓰기를 적응형 대기열로 나눠 처리하고, 바쁜 동안 실시간 연결을 끊지 않는다. 화면은 쓰기 503 을 받으면 1~5초 간격으로 늘려 가며 다시 시도하고, 같은 요청을 곧바로 반복하지 않는다.이 저장소 점검(2026-10-02): 이미 규칙을 지키고 있습니다(api.moonsunezip.com 방 단위 실시간, 바뀐 행만 전달, 재접속 백오프 최대 15초).