Files
plparkandClaude Opus 5 9cb8915173 Fix clue leak, stop the 404 fallback, bust the proxy asset cache
세 가지를 함께 고쳤다.

러시아 편에서 고리키와 어머니의 단서가 서로의 정답을 그대로 담고 있어 두 칸이
한꺼번에 풀렸다. 양쪽 단서에서 상대 이름을 뺐다.

nginx 의 try_files 폴백을 =404 로 바꿨다. 페이지가 여럿이 된 뒤로는 없는 경로도
200 으로 셸을 내려주어, 배포가 안 됐는데도 정상으로 보이는 일이 있었다.

프록시(NPM)가 js/css 에 제 캐시 헤더를 덧붙여 원본의 no-cache 를 덮어쓴다.
이미지 빌드 때 자산 내용의 sha256 앞 열 자리를 뽑아 각 페이지의 링크를
assets/crossword.js?v=<해시> 로 바꾸는 단계를 Dockerfile 에 넣었다. 저장소의
HTML 은 해시 없는 상태로 두고, 자산이 바뀌면 URL 이 저절로 바뀐다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 17:56:43 +09:00

75 lines
5.6 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>가로세로 낱말풀이 · 러시아 문학</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Black+Han+Sans&family=Gothic+A1:wght@300;500;700;900&family=Nanum+Myeongjo:wght@400;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="assets/crossword.css">
</head>
<body>
<div class="wrap">
<header class="head">
<div class="eyebrow">Русская литература · 9 × 9</div>
<h1>러시아 문학<em>가로세로 낱말풀이</em></h1>
<div class="meta">
<div><b id="timer">00:00</b><span>경과 시간</span></div>
<div><b id="progress">0/40</b><span>채운 칸</span></div>
</div>
</header>
<main class="stage">
<section>
<div class="cluebar">
<span class="cb-num" id="cbNum">–</span>
<span class="cb-dir" id="cbDir">가로</span>
<span class="cb-text" id="cbText">칸을 눌러 시작하세요.</span>
</div>
<div class="board-frame">
<div class="board" id="board" role="grid" aria-label="가로세로 낱말풀이 격자"></div>
<input id="ime" type="text" lang="ko" inputmode="text"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
aria-label="글자 입력">
</div>
<div class="tools">
<button type="button" data-act="flip">가로 ↔ 세로</button>
<button type="button" data-act="check">검사</button>
<button type="button" data-act="hint">이 칸 힌트</button>
<button type="button" data-act="reveal">정답 보기</button>
<button type="button" data-act="clear">전부 지우기</button>
</div>
<p class="tip">
같은 칸을 한 번 더 누르면 가로 ↔ 세로가 바뀌고, 오른쪽 단서도 그에 맞춰 바뀝니다.<br>
<kbd>화살표</kbd> 이동 · <kbd>Space</kbd> 방향 전환 · <kbd>Tab</kbd> 다음 단어 · <kbd>Backspace</kbd> 지우고 뒤로
</p>
</section>
<aside>
<section class="cluegroup">
<h2>가로 열쇠</h2>
<ol id="listA"></ol>
</section>
<section class="cluegroup">
<h2>세로 열쇠</h2>
<ol id="listD"></ol>
</section>
</aside>
</main>
</div>
<div class="done" id="done" hidden>
<span id="doneMsg">전부 맞혔습니다.</span>
</div>
<script>
const PUZZLE = {"size": 9, "grid": [["아", "버", "지", "와", "아", "들", null, null, "고"], [null, null, null, null, "흐", null, null, null, "리"], ["브", null, "롤", null, "마", "야", "콥", "스", "키"], ["로", null, "리", null, "토", null, null, "페", null], ["츠", "베", "타", "예", "바", null, null, "이", null], ["키", null, null, "세", null, null, null, "드", null], [null, null, "부", "닌", null, "어", "둠", "의", "힘"], [null, null, "활", null, null, "머", null, "여", null], [null, null, null, null, null, "니", null, "왕", null]], "nums": [[1, 0, 0, 0, 2, 0, 0, 0, 3], [0, 0, 0, 0, 0, 0, 0, 0, 0], [4, 0, 5, 0, 6, 0, 0, 7, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [8, 0, 0, 9, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 10, 0, 0, 11, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]], "entries": [{"num": 1, "dir": "A", "r": 0, "c": 0, "answer": "아버지와아들", "clue": "허무주의자 바자로프가 등장하는 투르게네프 장편", "kind": "작품"}, {"num": 2, "dir": "D", "r": 0, "c": 4, "answer": "아흐마토바", "clue": "《레퀴엠》을 남긴 20세기 러시아의 여성 시인", "kind": "작가"}, {"num": 3, "dir": "D", "r": 0, "c": 8, "answer": "고리키", "clue": "《밑바닥에서》와 자전 삼부작을 남긴 사회주의 리얼리즘 작가", "kind": "작가"}, {"num": 4, "dir": "D", "r": 2, "c": 0, "answer": "브로츠키", "clue": "미국으로 망명해 노벨문학상을 받은 러시아 시인", "kind": "작가"}, {"num": 5, "dir": "D", "r": 2, "c": 2, "answer": "롤리타", "clue": "나보코프를 세계적 논쟁의 중심에 세운 장편", "kind": "작품"}, {"num": 6, "dir": "A", "r": 2, "c": 4, "answer": "마야콥스키", "clue": "러시아 미래파를 대표하는 혁명기의 시인", "kind": "작가"}, {"num": 7, "dir": "D", "r": 2, "c": 7, "answer": "스페이드의여왕", "clue": "카드의 비밀에 집착한 게르만의 파멸", "kind": "작품"}, {"num": 8, "dir": "A", "r": 4, "c": 0, "answer": "츠베타예바", "clue": "망명과 귀국의 비극을 겪은 20세기 여성 시인", "kind": "작가"}, {"num": 9, "dir": "D", "r": 4, "c": 3, "answer": "예세닌", "clue": "농촌의 서정을 노래한 시인, 무용가 이사도라 덩컨의 남편", "kind": "작가"}, {"num": 10, "dir": "A", "r": 6, "c": 2, "answer": "부닌", "clue": "《미탸의 사랑》을 쓴, 러시아 최초의 노벨문학상 수상 작가", "kind": "작가"}, {"num": 10, "dir": "D", "r": 6, "c": 2, "answer": "부활", "clue": "네흘류도프와 카츄샤가 등장하는 톨스토이 후기 장편", "kind": "작품"}, {"num": 11, "dir": "A", "r": 6, "c": 5, "answer": "어둠의힘", "clue": "농촌의 죄와 참회를 다룬 톨스토이의 희곡", "kind": "작품"}, {"num": 11, "dir": "D", "r": 6, "c": 5, "answer": "어머니", "clue": "아들이 잡혀간 뒤 혁명에 눈뜨는 펠라게야 닐로브나의 장편", "kind": "작품"}]};
</script>
<script src="assets/crossword.js"></script>
</body>
</html>