이 글은 Today I Learn 시리즈의 116번째 기록입니다. (총 213개)

도안이 모자란 줄 알았다

소스가 바닥났다고 보고 다른 이모지 세트를 찾기로 했다

노토 이모지 1440장을 전부 시도했는데 쓸 수 있는 건 589종이었다. 소스가 바닥났다고 판단하고 다른 이모지 세트를 찾아보기로 했다. 그런데 다른 세트는 같은 사과, 같은 물고기를 다르게 그린 것뿐이라 새 소재가 늘지 않았다. 전날 Kenney를 재 본 것도 이 판단에서 나왔다.

  • 같은 것을 다르게 그린 소스는 소재를 늘려 주지 않는다. 늘어나는 건 그림체지 그림 수가 아니다

사실은 절반이 사각지대에 갇혀 있었다

버려지는 이유를 뜯어보니 원인은 소스가 아니었다. 색을 다루는 기준이 둘 있는데 서로 어긋나 있었다.

  • 비슷한 색을 하나로 합치는 기준은 거리 38 미만
  • 통과시키는 기준은 색끼리 45 이상 떨어져야 함

거리가 38~45인 색 짝은 합쳐지지도, 통과하지도 못한다. 여기에 걸린 도안이 268종이었다. 떨어진 도안을 살리려고 다시 시도하는 단계도 있었지만, “색이 모자라서” 떨어진 경우만 구제하는 방향이라 “색이 너무 비슷해서” 떨어진 도안은 오히려 나빠졌다.

통과 기준보다 세게 합치는 단계를 하나 붙이자 268종이 살아났다. 합친 뒤에는 색이 더 벌어지니 구분 기준은 오히려 엄격해졌다.

앞선 TIL 15에서 “더 없다”는 느낌은 세어 보기 전까지는 확인된 게 아니라고 했다. 이번에는 세어 봤는데도 틀렸다. 센 것은 통과한 수였지 쓸 수 있는 수가 아니었다.

  • 거르는 기준과 고치는 기준이 따로 있으면 둘 사이에 아무도 통과 못 하는 구간이 생기지 않는지 본다
  • 실패에 방향이 둘이면 구제 수단도 둘이어야 한다
  • 소스를 더 찾기 전에 가진 소스를 왜 버리고 있는지 먼저 본다

64로 올리니 버렸던 것이 돌아왔다

게임 캔버스는 원래 64칸인데 도안은 32칸으로 만들어 두 배로 확대해 넣고 있었다. 도안 원본을 64로 뽑게 하니 모래량과 플레이타임은 그대로고 그림 디테일만 네 배가 됐다.

예전에 뭉개져서 못 쓴다고 통째로 건너뛴 노토 조합 이모지(👨‍🚀 우주비행사처럼 여러 이모지를 합친 것)를 다시 보니 64에서는 대부분 읽혔다. 246종이 들어왔다. 예전에 뺐던 도안 중 12종도 64에서 쓸 만해져 되살렸다.

Claude가 32에서 64로 바꾸며 남은 도안, 되살아난 도안, 떨어진 도안을 나눠 보고했고 그 목록을 내가 검토했다. 잃은 것도 있었다. 32에서 통과하던 도안 167종이 64에서 떨어졌다. 32로 줄일 때는 미묘한 음영이 뭉개져 뚜렷한 한 색이 됐는데, 64에서는 그 음영이 살아남아 비슷한 두 색으로 갈라졌다.

도안을 그린 사람은 태극 도안의 검은 테두리가 갑자기 두꺼워졌다고 했다. 테두리 두께를 전체 크기에 대한 비율로 정해 뒀더니 32에서 1.6칸이던 선이 64에서 3.2칸이 된 것이다.

  • 조건이 바뀌면 예전의 “못 쓴다” 판정도 다시 본다. 그 판정은 그때 조건에서 내린 것이다
  • 해상도를 올리면 디테일과 함께 줄일 때 걸러지던 잡음도 살아난다
  • 비율로 정한 값은 해상도를 따라 절대 크기가 변한다. 선 두께처럼 “몇 칸”이 중요한 값은 따로 챙긴다

Kenney 자연 킷이 한 장도 통과하지 못했다

Kenney에서 음식·물고기·가구 킷으로 178종을 얻었다. 그런데 자연 킷은 241장이 전부 “너무 희박함”으로 떨어졌다.

그림이 나빠서가 아니었다. 타일 격자에 맞춘 큰 캔버스 안에 물체가 작게 들어 있어, 줄이고 나면 물체가 캔버스의 3%만 채웠다. 검사는 캔버스 대비 비율을 보니 여백이 곧 탈락 사유가 된 것이다. 받을 때 투명 여백을 잘라내고 정사각형으로 맞추니 0장이 153종이 됐다.

마지막으로 내가 도안 뷰어로 전부 다시 보며 250종을 뺐다. 최종 1108종이 됐다.

  • 소재가 통째로 떨어지면 소재의 품질인지 포장(여백·크기)인지부터 본다
  • 기계 검사로 늘린 뒤에는 눈으로 한 번 거른다. 검사는 “읽히는가”를 모른다

봇의 숫자와 사람의 체감

아홉 판을 해 보고 봇과 대조했다

난이도는 봇이 잰 클리어율로 배정하고 있었지만, 그 숫자가 실제 체감과 맞는지는 확인한 적이 없었다. 실기기에서 아홉 판을 직접 해 보고 체감을 적어 봇의 값과 나란히 놓았다. 순서가 정확히 일치했다.

봇 클리어율체감
0.71딱히 생각 안 해도 됨
0.64~0.57생각은 해야 하나 쉬움
0.36쉽고 적당함
0.31재밌다
0.25멈칫하게 됨
  • 자동 측정값을 계속 쓰려면 사람 판단과 한 번은 맞춰 본다. 맞는 걸 확인하고 나서야 그 값에 더 기댈 수 있다

어려운 쪽과 쉬운 쪽은 같은 오차가 아니었다

대조하다 보니 방향에 따라 의미가 달랐다. 목표보다 어렵게 나온 판은 “적당히 신경 쓰이는” 좋은 판이었고, 목표보다 쉽게 나온 판은 그대로 싱거웠다. 봇은 일부러 실수를 섞어 두기 때문에 사람보다 비관적으로 잰다. 그래서 봇이 어렵다고 한 판은 사람에게 조금 덜 어렵다.

그런데 목표를 벗어나도 봐주는 폭을 양쪽 다 0.15로 같게 두고 있었다. 벗어난 201판 중 194판이 그냥 통과하고 있었다. 어려운 쪽은 넉넉히(0.15), 쉬운 쪽은 좁게(0.05) 나눴다.

  • 오차 허용은 방향마다 비용이 다르면 따로 정한다. 같은 0.15라도 한쪽은 좋은 판이고 다른 쪽은 싱거운 판이다

해 본 사람이 너무 잘하는 편이었다

그 아홉 판을 해 본 나는 가장 어려운 등급(crazy) 판을 아이템 없이 네 번 만에 깨는 수준이었다. 그러면 내 체감이라도 믿을 수 있는 것과 없는 것이 갈린다.

  • “싱겁다”는 믿을 수 있다. 잘하는 사람에게도 싱거우면 누구에게나 싱겁다
  • “안 어렵다”는 못 쓴다. 일반 플레이어에게는 충분히 어려울 수 있다

그래서 “싱겁다”는 신호만 근거로 삼았다. “안 어렵다”까지 받아들였으면 난이도 곡선 전체를 올려 일반 플레이어 앞에 벽을 세울 뻔했다.

  • 체감을 근거로 쓸 때는 내용보다 먼저 그 사람이 어느 쪽에 서 있는지 본다. 내 체감도 예외가 아니다. 한쪽 방향의 신호만 믿을 수 있는 경우가 있다

소리가 안 꺼졌다

설정에서 꺼도, 앱을 나가도 붓는 소리가 계속 났다

모래를 안 붓는데 붓기 소리가 계속 났다. 설정에서 효과음을 꺼도, 앱을 나가도 안 멈추고 강제종료해야만 꺼졌다. 붓는 도중에 일시정지를 열면 바로 재현됐다.

앞선 TIL 17에서 붓기 소리를 바구니마다 따로 켜고 끄게 했다. 그 소리들을 목록으로 관리하는데, 붓기가 끝나 서서히 줄어드는 중이던 소리가 한꺼번에 정리할 때 목록에서 빠져 버렸다. 목록에 없으니 다시 끌 방법이 없었다.

목록을 믿지 않고 소리 채널 전체를 끄게 했다. 효과음을 끄면 지금 나고 있는 붓기 소리도 즉시 끊기게 하고, 붓기가 끝난 순간을 놓치지 않게 매 순간 상태를 맞추게 했다.

  • 끄는 일은 기록이 아니라 실물 전체를 기준으로 한다. 기록은 새고, 새는 순간 끌 길이 없어진다
  • 끄는 스위치가 “다음 소리를 막는 것”뿐이면 이미 나는 소리는 남는다. 끄기를 확인할 때는 지금 나는 것도 끊기는지 본다

광고를 붙이면서

개인정보처리방침의 한 문장이 거짓이 됐다

블로그에 있던 개인정보처리방침에 “앱은 제3자 분석·광고·추적을 쓰지 않는다”고 적혀 있었다. 게임에 광고를 붙이면 이 문장이 거짓이 된다. 광고 SDK(광고를 띄우는 외부 부품)는 광고 ID를 수집한다.

문장을 지우지 않고 범위를 좁혔다. “광고가 없는 앱은”으로 바꿔서 다른 앱에 한 약속은 그대로 지키고 게임만 예외가 되게 했다. 스토어의 데이터 보안 양식에도 같은 내용을 신고해야 한다. 방침과 양식이 어긋나면 그 자체가 위반이다.

  • 기능을 더하면 그 기능이 기존 문서의 어떤 문장을 거짓으로 만드는지 본다
  • 여러 제품이 한 방침을 나눠 쓰면 문장을 지우지 말고 범위를 좁힌다

살 수 없는 유료 카드를 뺐다

상점에 “₩5,500” 가격과 할인 표시까지 붙은 카드가 “준비 중”인 채 코드에 남아 있었다. 화면에는 안 나오는 상태였지만 실수로 노출되기 쉬웠다.

결제는 붙이지 않고 광고만으로 수익화하기로 정했다. 가격이 붙은 채 살 수 없는 상품은 오해를 부르는 표시가 되니 카드를 지우고, 나중에 결제를 붙일 때 이어 쓸 값만 남겼다.

  • 수익 모델을 정하면 그 모델에 없는 것은 화면에서 지운다. 숨겨 둔 것은 언젠가 샌다

Series: Today I Learn

1 C++ 자료형(Data Type) 2 MD5 vs pHash 3 C++에서 함수의 선언과 정의 4 Tkinter padx, pady 5 메모리와 포인터 변수 6 Call by Value, Call by Reference, Call by Pointer 비교 7 const 8 Gemfile — Jekyll 프로젝트의 의존성 파일 9 kramdown-parser-gfm — Jekyll의 GFM 파서 10 파서(Parser) 11 AHU vs OHU 12 I might try it vs I'll try it 뉘앙스 차이 13 SESSION_EXPIRE_AT_BROWSER_CLOSE=True 14 configuration key 15 Git stash vs discard 16 subprocess.Popen으로 Windows 탐색기에 명령어를 전달 17 Post 잔디 분석하기 18 Google Sheets Sync 최적화 19 DSL (Domain Specific Language)과 GPL (General Purpose Language) 20 마크다운 표 그리는 방법 21 쿼리 파라미터(Query Parameter). 기존 QR코드 재활용 22 Django 보안 취약점 점검 및 수정 23 OOP Object-Oriented Programming 객체 지향 프로그래밍 24 Fernet 대칭 암호화 25 Jekyll 코드블록 안의 Liquid 태그 26 습관만들기 Pawbit TIL 1 27 insertOnConflictUpdate vs DoUpdate(target) 28 세션 필터 29 아코디언(Accordiaon) UI를 펼친상태로 만들기 30 input의 step 31 습관만들기 Pawbit TIL 2 32 습관만들기 Pawbit TIL 3 33 Word Cloud 34 Google Sheets를 데이터 버스로(with AppSheet) 35 Django 모델 텍스트 필드 자동 수집 패턴 36 localStorage로 섹션 토글 상태 유지 37 순차 ID 생성(`select_for_update()` + `max()` 조합) 38 역참조 검색과 distinct() 39 xlsx 다운로드와 로딩 오버레이 충돌 40 Android 파일 공유 MIME 타입 41 AssetManifest — Flutter 빌드 타임 asset 목록 런타임 조회 42 크레센도 Phaser + TypeScript TIL 1 43 크레센도 Phaser + TypeScript TIL 2 44 크레센도 Phaser + TypeScript TIL 3 45 크레센도 Phaser + TypeScript TIL 4 46 크레센도 Phaser + TypeScript TIL 5 47 여둘까 Office Layout TIL 1 48 습관만들기 Pawbit TIL 4 49 여둘까 Office Layout TIL 2 50 여둘까 Office Layout TIL 3 51 크레센도 Phaser + TypeScript TIL 6 52 UTF-8 BOM과 PowerShell 파일 쓰기 53 소리꽃 KeyBloom TIL 1 54 습관만들기 Pawbit TIL 5 55 여둘까 Office Layout TIL 4 56 소리꽃 KeyBloom TIL 2 57 소리꽃 KeyBloom TIL 3 58 메트로놈 Simple Metronome TIL 1 59 소리꽃 KeyBloom TIL 4 60 메트로놈 Simple Metronome TIL 2 61 소리꽃 KeyBloom TIL 5 62 습관만들기 Pawbit TIL 6 63 크레센도 Phaser + TypeScript TIL 7 64 메트로놈 Simple Metronome TIL 3 65 소설 타임라인 관리 도구 Lumior TIL 1 66 습관만들기 Pawbit TIL 7 67 정적 블로그 SEO 정비와 Pagefind 검색 도입 68 크레센도 Phaser + TypeScript TIL 8 69 메트로놈 Simple Metronome TIL 4 70 습관만들기 Pawbit TIL 8 71 안드로이드 AudioTrack 연속 재생, 실측 피커 정렬, 카메라 토치 플래시 72 메트로놈 Simple Metronome TIL 5 73 모래게임 Sandrop TIL 1 74 습관만들기 Pawbit TIL 9 75 메트로놈 Simple Metronome TIL 6 76 모래게임 Sandrop TIL 2 77 모래게임 Sandrop TIL 3 78 습관만들기 Pawbit TIL 10 79 습관만들기 Pawbit TIL 11 80 메트로놈 Simple Metronome TIL 7 81 모래게임 Sandrop TIL 5 82 모래게임 Sandrop TIL 4 83 습관만들기 Pawbit TIL 12 84 모래게임 Sandrop TIL 6 85 소리꽃 KeyBloom TIL 6 86 모래게임 Sandrop TIL 7 87 모래게임 Sandrop TIL 8 88 소리꽃 KeyBloom TIL 7 89 모래게임 Sandrop TIL 9 90 소리꽃 KeyBloom TIL 8 91 모래게임 Sandrop TIL 10 92 소리꽃 KeyBloom TIL 9 93 콘티온 ContiOn TIL 1 94 소리꽃 KeyBloom TIL 10 95 콘티온 ContiOn TIL 2 96 습관만들기 Pawbit TIL 13 97 콘티온 ContiOn TIL 3 98 모래게임 Sandrop TIL 11 99 소리꽃 KeyBloom TIL 11 100 여둘까 Office Layout TIL 5 101 모래게임 Sandrop TIL 12 102 모래게임 Sandrop TIL 13 103 콘티온 ContiOn TIL 4 104 모래게임 Sandrop TIL 14 105 소리꽃 KeyBloom TIL 12 106 습관만들기 Pawbit TIL 14 107 모래게임 Sandrop TIL 15 108 모래게임 Sandrop TIL 16 109 소리꽃 KeyBloom TIL 13 110 온실 GreenHouse TIL 1 111 콘티온 ContiOn TIL 5 112 모래게임 Sandrop TIL 17 113 소리꽃 KeyBloom TIL 14 114 온실 GreenHouse TIL 2 115 콘티온 ContiOn TIL 6 116 모래게임 Sandrop TIL 18 읽는 중 117 콘티온 ContiOn TIL 7 118 모래게임 Sandrop TIL 19 119 소리꽃 KeyBloom TIL 15 120 모래게임 Sandrop TIL 20 121 모래게임 Sandrop TIL 21 122 소리꽃 KeyBloom TIL 16 123 소리꽃 KeyBloom TIL 17 124 소리꽃 KeyBloom TIL 18 125 여둘까 Office Layout TIL 6 126 소리꽃 KeyBloom TIL 19 127 소리꽃 KeyBloom TIL 20 128 콘티온 ContiOn TIL 8 129 콘티온 ContiOn TIL 9 130 로그스톤 상표 셀프 출원 TIL 1 131 소리꽃 KeyBloom TIL 21 132 로그스톤 샵 LogStone Shop TIL 1 133 소리꽃 KeyBloom TIL 22 134 로그스톤 샵 LogStone Shop TIL 2 135 소리꽃 KeyBloom TIL 23 136 모래게임 Sandrop TIL 22 137 모래게임 Sandrop TIL 23 138 소리꽃 KeyBloom TIL 24 139 로그스톤 샵 LogStone Shop TIL 3 140 모래게임 Sandrop TIL 24 141 소리꽃 KeyBloom TIL 25 142 모래게임 Sandrop TIL 25 143 MiniMacro TIL 1 144 모래게임 Sandrop TIL 26 145 콘티온 ContiOn TIL 10 146 Astro가 무엇인지, 왜 옮기는지 147 모래게임 Sandrop TIL 27 148 소리꽃 KeyBloom TIL 26 149 MiniMacro TIL 2 150 로그스톤 샵 LogStone Shop TIL 4 151 메트로놈 Simple Metronome TIL 8 152 모래게임 Sandrop TIL 28 153 여둘까 Office Layout TIL 7 154 메트로놈 Simple Metronome TIL 9 155 블로그 Astro 이관 TIL 156 여둘까 Office Layout TIL 8 157 로그스톤 샵 LogStone Shop TIL 5 158 모래게임 Sandrop TIL 29 159 오픈데이 Openday TIL 1 160 로그스톤 샵 LogStone Shop TIL 6 161 모래게임 Sandrop TIL 30 162 오픈데이 Openday TIL 2 163 모래게임 Sandrop TIL 31 164 Unreal Engine MCP TIL 1 165 모래게임 Sandrop TIL 32 166 소리꽃 KeyBloom TIL 27 167 콘티온 ContiOn TIL 11 168 오픈데이 Openday TIL 3 169 로그스톤 샵 LogStone Shop TIL 7 170 모래게임 Sandrop TIL 33 171 소리꽃 KeyBloom TIL 28 172 오픈데이 Openday TIL 4 173 여둘까 Office Layout TIL 9 174 오픈데이 Openday TIL 5 175 ScorePlayer TIL 1 176 모래게임 Sandrop TIL 34 177 BuildingHub TIL 1 178 ScorePlayer TIL 2 179 여둘까 Office Layout TIL 10 180 BuildingHub TIL 2 181 ScorePlayer TIL 3 182 Unreal Engine MCP TIL 2 183 궁 미로 PalaceMaze TIL 1 184 메트로놈 Simple Metronome TIL 10 185 메트로놈 Simple Metronome TIL 11 186 오픈데이 Openday TIL 6 187 BuildingHub TIL 3 188 Obsidian vault에서 코드만 빼기 — directory junction 189 ScorePlayer TIL 4 190 여둘까 Office Layout TIL 11 191 오픈데이 Openday TIL 7 192 URL은 바뀔 수 있는 것에 묶지 않는다 193 도구는 기능이 아니라 내 일에 맞는지로 고른다 194 돌이키기 힘든 변경은 작게 먼저 확인한다 195 궁 미로 PalaceMaze TIL 2 196 궁 미로 PalaceMaze TIL 3 197 소리꽃 KeyBloom TIL 29 198 오픈데이 Openday TIL 8 199 BuildingHub TIL 4 200 ScorePlayer TIL 5 201 로그스톤 샵 LogStone Shop TIL 8 202 여둘까 Office Layout TIL 12 203 오픈데이 Openday TIL 9 204 BuildingHub TIL 5 205 MiniMacro TIL 3 206 소리꽃 KeyBloom TIL 30 207 오픈데이 Openday TIL 10 208 여둘까 Office Layout TIL 13 209 소리꽃 KeyBloom TIL 31 210 궁 미로 PalaceMaze TIL 4 211 로그스톤 샵 LogStone Shop TIL 9 212 로그스톤 샵 LogStone Shop TIL 10 213 소리꽃 KeyBloom TIL 32