이 글은 Daily Log 시리즈의 113번째 기록입니다. (총 119개)

오늘 한 일

  • 모래게임 Sandrop
    • 도안 풀을 크게 늘림 — 미보유 이모지를 받아 재양자화해 풀을 넉넉히 하고, 실루엣이 안 읽히는 기호류(별자리·화살표·미디어 컨트롤·사람 픽토그램 등)는 뷰어로 골라 제외
    • 상점 정리 — 우상단에 하트도 코인처럼 함께 표시, 탭 순서를 상점·홈·설정으로, 인앱결제(스타터 번들·광고 제거)는 출시 후로 미뤄 숨김
    • 튜토리얼을 하나의 표준 형태로 통일 — 화면을 어둡게 덮고 배울 대상만 밝히고 안내를 캔버스 위에 띄우게. 로프·물음표·얼음·열쇠·아이템 튜토리얼이 전부 같은 모양
    • 기믹 데뷔 간격을 100으로 균일하게 (로프 51·물음표 151·얼음 251·열쇠 351)
    • 잘못 들어가 아무것도 안 하고 나가면 입장 하트를 돌려주게
    • 디버그에서 튜토리얼을 이미 깬 레벨에서도 다시 재생하게
    • frozen에 실제 얼음 이미지(ice.png)를 붙임 — 계획했던 불투명 얼음 asset 완성
    • 난이도가 왜 어긋나는지 파고들어, 도안을 슬롯에 넣기 전에 실제 난이도를 재서 맞는 자리에 배정하도록 바꿈(측정 후 배치). 색은 안 뭉개고 벽·기믹으로 조절, 슬롯보다 어려운 판은 정직하게 라벨
  • 콘티온 Conti On
    • 자막 템플릿 편집기 다듬기 — 글꼴 등록을 설치된 글꼴에서 골라 넣게(불러오면 이름 칸을 강조), 태블릿에서 설정이 미리보기에 가리던 걸 좌(미리보기+수정 기록)·우(설정) 2분할로, 그라데이션 막대 폭을 열 폭에 맞게, 좁은 열에서 폼 행이 한 줄로 읽히게
    • 예배 순서지로 확장 착수 — 자막 담당자가 곡뿐 아니라 예배 순서 전체 자막을 만들 수 있게. 곡 콘티(찬양팀)와 예배 순서지(방송실)를 별개 컨테이너로 나누고, 순서지가 곡 콘티를 통째로 가져가게(배치는 복사, 가사는 계속 공유)
    • 카테고리를 2단계(찬양/순서)로 — 콘티 화면엔 찬양 하위만, 순서지엔 순서 하위만. 승인도 대분류로 갈라 곡은 곡 관리자, 순서는 자막 담당자에게. 항목이 0개인 카테고리는 고르는 목록에서 자동으로 숨김
    • 순서지 화면 용어를 자막에 맞게 — ‘곡→자막’, ‘가사→내용’, 항목을 [구분] 제목으로, 안 쓰는 찬송가 번호 칸은 숨김, ‘기타’ 구분 추가
  • 소리꽃 KeyBloom
    • 파티클·건반의 광택(표면 반짝임)과 발광(위로 뻗는 빛)을 분리하고, 발광을 켜기·크기·(건반)밝기로 세분
    • 파티클을 발광 영역 상자 안에 가두는 옵션 추가 — 폭·높이 둘 다
    • 나선형과 나선 기둥을 “나선” 하나로 합치고 회전 반경·퍼짐·코일 간격 슬라이더로 — 토네이도·기둥은 이 값들의 프리셋
    • 코일 간격이 상승 속도와 얽히던 걸 공간 회전으로 풀어 독립 조절 가능하게, 중복이던 회전 속도 슬라이더는 제거
    • 웹 광고를 정적 스니펫으로 정리, 네이티브용 자체 광고(하우스 광고) 시스템을 설계 문서화
  • 온실 GreenHouse (신규)
    • 앱들이 서로와 블로그를 홍보하는 자체 광고 시스템을 독립 프로젝트로 시작 — 내부 코드명 HouseAd, 브랜드는 온실 GreenHouse
    • 블로그에 얹을지 고민하다 분리로 확정 — 광고 데이터는 블로그 글이 아니라 여러 앱이 공유하는 인프라라, 배포가 가볍고 실시간 반영으로 키우기도 좋은 쪽으로
    • 광고 데이터 규약(ads.json)과 250×250 배너 편집기, CORS 설정까지 레벨 1 구현 완료. 첫 광고는 블로그 홈 텍스트 카드 1건
    • GitHub repo 생성·연결, 폴더·표기를 GreenHouse로 통일

어려웠던 점

  • 튜토리얼이 제각각이었다 — 보드 튜토리얼은 게임판만 어두워지고 아이템 튜토리얼은 아이템 바 전체가 밝아지는 식으로 형태가 달랐다. 하나의 표준 컴포넌트로 묶어서, “무엇을 강조할지와 문구”만 주면 화면 dim·강조·안내가 공통으로 나오게 정리했다. 나중에 새 튜토리얼도 분기 하나만 추가하면 된다
  • 기믹 데뷔 간격이 50/100/50이라 들쭉날쭉했다. 100으로 균일하게 맞추니 기믹이 후반까지 고르게 나와 신선함이 오래 간다. 대신 crazy 관문과 밀도 곡선도 같이 밀어야 했다
  • 도안을 솎아내니 500레벨에 모자랐다. 로컬 이모지가 이미 다 등록돼 있어 더 못 늘리는 줄 알았는데, 단일 코드포인트 이모지 중 미보유분을 받아 채웠다
  • 한복이 “매우 어려움”인데 손쉽게 깨졌다. 왜 이 도안이 그 난이도로 갔는지 파고드니, 도안 겉모습(색이 층층이 얼마나 엇갈리나)으로 난이도를 추측하던 게 실제와 자주 어긋났다. 도안마다 봇을 실제로 돌려 난이도를 재고 그 값에 맞는 자리에 넣게 바꿨다. 너무 어려운 도안은 색을 줄이면 쉬워지지만 그림이 뭉개져서, 색은 그대로 두고 벽·기믹으로 조절하고 슬롯보다 어려운 판은 정직하게 라벨을 올렸다
  • (콘티온 Conti On) 자막 담당자가 “곡 말고 일반 자막도 만들고 싶다”고 해서, 재사용 라이브러리로 공유할지 콘티에서 고친 게 바로 반영되게 할지 정해야 했다. 둘 다 필요해서 “배치(어떤 자막을 어떤 순서로)는 복사, 내용(문구)은 공유”로 갈랐다. 순서지가 곡 콘티를 가져가도 가사 수정은 그대로 따라오되, 방송실이 순서를 바꿔도 찬양팀과 안 엉킨다. 처음엔 참조로 생각했는데 자막 담당자가 순서지를 소유하는 상위 역할이라 복사가 맞았다
  • (콘티온 Conti On) 로컬 로그인이 막혀 순서지 실동작 확인은 다음으로 미뤘다. 자막 담당자 쪽 준비가 안 돼 오늘은 여기까지
  • (소리꽃 KeyBloom) 나선의 “코일 간격”을 넓히려는데 계속 엉뚱하게 나왔다. 코일 간격·회전 속도·상승 속도가 하나의 식으로 묶여 있어서 셋을 동시에 마음대로 못 한다는 걸 여러 번 부딪히며 이해했다. 회전을 “오른 높이” 기준으로 바꾸니 코일 간격이 상승과 분리됐고, 알고 보니 회전 속도 슬라이더는 상승 속도와 겹쳐서 뺐다. 슬라이더를 늘리는 게 답인 줄 알았는데 오히려 중복을 덜어내는 게 정리였다
  • (소리꽃 KeyBloom) 웹 광고가 자동으로 안 바뀌길래 우리 문제인 줄 알았는데, 티스토리 등 다른 곳도 같아서 AdFit 자체가 자동 갱신을 안 하는 거였다. 대신 네이티브 앱엔 내 블로그·앱을 홍보하는 하우스 광고를 넣기로 방향을 잡았다
  • (온실 GreenHouse) 하우스 광고를 블로그에 얹을지 따로 세울지 판단이 안 섰다. 담당 Claude들에게 같은 질문을 물어 비교해보니, 블로그에 얹는 쪽 장점은 초기 설정 몇 분 절약뿐이고 분리 쪽 장점(가벼운 배포·관심사 분리·확장 경로)은 운영 내내 지속돼 분리로 확정했다
  • (온실 GreenHouse) 폴더 이름을 Greenhouse에서 GreenHouse로 바꾸는 게 도구로는 계속 거부됐다. Windows가 대소문자만 다른 이름을 같은 걸로 취급하는 데다 다른 프로그램이 폴더를 잡고 있으면 이름 변경이 안 된다는 걸 알게 됐고, 결국 탐색기에서 직접 바꿨다

배운 점

  • (모래게임 Sandrop TIL 15로 정리) 흩어진 UI를 하나의 컴포넌트로 표준화 / 위젯 좌표를 화면 좌표로 변환(RenderBox·GlobalKey) / dim 오버레이를 터치 통과시켜 대상은 그대로 조작 / 규칙 상수를 바꾸면 테스트 fixture도 같이 옮겨야 함
  • (모래게임 Sandrop TIL 16으로 정리) 겉모습 추정 대신 봇으로 난이도 실측·지문(crc32) 캐시로 변경분만 재측정 / 헤드룸으로 기믹 많은 후반엔 더 쉬운 도안 / 못 내리는 축(색)은 안 건드리고 벽 양방향·라벨로 / 해금 티어 상한으로 초반 오매핑 차단 / 밀도가 레벨마다라 완벽 예측 불가는 정직하게 인정
  • (콘티온 Conti On TIL 5로 정리) 대분류 한 컬럼으로 노출·승인 라우팅 가르기 / NOT NULL DEFAULT로 기존 행 메우기·INSERT OR IGNORE 시드 / 형태 같은 데이터는 테이블 일반화로 재활용 / 컨테이너를 종류(kind)로 나눠 소유 다르게
  • (콘티온 Conti On TIL 5로 정리) 배치는 복사(스냅샷)·내용은 공유(song_id) / “끼우기”를 기존 항목으로 펼쳐 넣기 / COALESCE(MAX,-1)로 이어붙이기·COALESCE 서브쿼리로 옛 데이터 fallback
  • (콘티온 Conti On TIL 5으로 정리) 자동 정리는 고르는 목록만·입력 폼은 남기기 / 번호 없으면 구분으로 떨어지는 라벨 / 한국어 조사는 문자열 통째로 분기
  • (콘티온 Conti On TIL 5로 정리) queryLocalFonts로 설치 글꼴 목록 받기(폭 재기와 다른 방향) / family 중복 접기·정렬 / 강한 권한 API는 좁고 거부될 수 있어 손입력 길 남기기
  • (소리꽃 KeyBloom TIL 23으로 정리) 나선형·나선 기둥을 상수 차이(퍼짐)의 프리셋으로 병합 / 코일 간격 = 상승속도÷회전수라 셋이 묶여 독립 불가 / 회전을 시간→공간(오른 높이) 기준으로 바꿔 코일 간격을 상승과 분리 / 중복 파라미터는 늘리지 말고 덜어내기
  • (소리꽃 KeyBloom TIL 24로 정리) 가둠 경계를 spawn 시 파티클별 고정·±Infinity 센티넬 / 진동 입력에 하드 클램프는 벽에 붙어 멈칫 / 사인은 끝에서 느려짐·tanh는 포화로 정체 / 진폭 분산이면 벽 도달 시점 흩어져 매끈
  • (소리꽃 KeyBloom TIL 25로 정리) 한 파라미터가 두 렌더 효과를 겸하면 효과별로 배선해 분리 / 발광은 세기보다 on/off+크기+밝기 / 굽는 값은 아틀라스 시그니처·그릴 때 값은 재굽기 없이 / normalizeParams로 구버전 유추 하위호환
  • (소리꽃 KeyBloom TIL 26으로 정리) 조건부 슬라이더는 onChange+syncers 양쪽 등록 / span 라벨은 .ctl-row label 미적용이라 컨테이너에서 규격화 / AdFit 자동 갱신은 클라이언트에서 안 됨(다른 매체 비교로 진단) / 원격 ads.json fetch면 앱 재빌드 없이 내용 반영
  • (온실 GreenHouse TIL 1로 정리) JSON은 언어가 아니라 데이터 형식 / 교차 출처 fetch는 CORS 허락 필요·Cloudflare Pages는 _headers 한 파일 / Blob+URL.createObjectURL로 서버 없이 다운로드·클립보드는 실패 경로 필수 / 사용자 입력은 innerHTML 대신 textContent(XSS) / localStorage 초안 유지 / Windows 대소문자 폴더 rename은 2단계+핸들 잠금 주의

해야 할 일

  • 모래게임 Sandrop — 배포 전 디버그 모드 제거, IAP는 출시 후 Play Console 세팅과 함께, 출시 직전 레벨 스냅샷 동결 + 생성기 동결 모드(업데이트가 이미 진행한 레벨을 안 바꾸게 이후 레벨만 추가)
  • 콘티온 Conti On — 원격 D1 마이그레이션(0021~0023) 적용 후 배포, 로컬/구글 로그인으로 순서지 실동작 확인, 자막 담당자와 승인 라우팅·자동 정리 점검, 넣은 곡 콘티가 원본 변경 시 재불러오기 안내(옵션)
  • 소리꽃 KeyBloom — 자체 광고(하우스 광고) 네이티브 연동(fetch·배너 렌더·시스템 브라우저 열기 — 데이터·편집기는 온실 GreenHouse로 분리됨), 인터페이스 버퍼 낮춰 지연 줄이기, 유료화(결제·라이선스)
  • 온실 GreenHouse — 편집기 브라우저 확인, Cloudflare Pages 프로젝트 생성·URL 확정, KeyBloom 핸드오프, 광고에 넣을 앱 목록 정하기

Series: Daily Log

1 오늘 해낸 것 2 오늘 해낸 것 3 오늘 해낸 것 4 오늘 해낸 것 5 오늘 해낸 것 6 오늘 해낸 것 7 오늘 해낸 것 8 오늘 해낸 것 9 오늘 해낸 것 10 오늘 해낸 것 11 오늘 해낸 것 12 오늘 해낸 것 13 오늘 해낸 것 14 오늘 해낸 것 15 오늘 해낸 것 16 오늘 해낸 것 17 오늘 해낸 것 18 오늘 해낸 것 19 오늘 해낸 것 20 오늘 해낸 것 21 오늘 해낸 것 22 오늘 해낸 것 23 오늘 해낸 것 24 오늘 해낸 것 25 오늘 해낸 것 26 오늘 해낸 것 27 오늘 해낸 것 28 오늘 해낸 것 29 오늘 해낸 것 30 오늘 해낸 것 31 오늘 해낸 것 32 오늘 해낸 것 33 오늘 해낸 것 34 오늘 해낸 것 35 오늘 해낸 것 36 오늘 해낸 것 37 오늘 해낸 것 38 오늘 해낸 것 39 오늘 해낸 것 40 오늘 해낸 것 41 오늘 해낸 것 42 오늘 해낸 것 43 오늘 해낸 것 44 오늘 해낸 것 45 오늘 해낸 것 46 오늘 해낸 것 47 오늘 해낸 것 48 오늘 해낸 것 49 오늘 해낸 것 50 오늘 해낸 것 51 오늘 해낸 것 52 오늘 해낸 것 53 오늘 해낸 것 54 오늘 해낸 것 55 오늘 해낸 것 56 오늘 해낸 것 57 오늘 해낸 것 58 오늘 해낸 것 59 오늘 해낸 것 60 오늘 해낸 것 61 오늘 해낸 것 62 오늘 해낸 것 63 오늘 해낸 것 64 오늘 해낸 것 65 오늘 해낸 것 66 오늘 해낸 것 67 오늘 해낸 것 68 오늘 해낸 것 69 오늘 해낸 것 70 오늘 해낸 것 71 오늘 해낸 것 72 오늘 해낸 것 73 오늘 해낸 것 74 오늘 해낸 것 75 오늘 해낸 것 76 오늘 해낸 것 77 오늘 해낸 것 78 오늘 해낸 것 79 오늘 해낸 것 80 오늘 해낸 것 81 오늘 해낸 것 82 오늘 해낸 것 83 오늘 해낸 것 84 오늘 해낸 것 85 오늘 해낸 것 86 오늘 해낸 것 87 오늘 해낸 것 88 오늘 해낸 것 89 오늘 해낸 것 90 오늘 해낸 것 91 오늘 해낸 것 92 오늘 해낸 것 93 오늘 해낸 것 94 오늘 해낸 것 95 오늘 해낸 것 96 오늘 해낸 것 97 오늘 해낸 것 98 오늘 해낸 것 99 오늘 해낸 것 100 오늘 해낸 것 101 오늘 해낸 것 102 오늘 해낸 것 103 오늘 해낸 것 104 오늘 해낸 것 105 오늘 해낸 것 106 오늘 해낸 것 107 오늘 해낸 것 108 오늘 해낸 것 109 오늘 해낸 것 110 오늘 해낸 것 111 오늘 해낸 것 112 오늘 해낸 것 113 오늘 해낸 것 읽는 중 114 오늘 해낸 것 115 오늘 해낸 것 116 오늘 해낸 것 117 오늘 해낸 것 118 오늘 해낸 것 119 오늘 해낸 것