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

오늘 한 일

  • BuildingHub
    • 관리자 화면을 손봄 — 승인 대기 예약을 목록에서 바로 승인·반려하도록 만듦
    • 브라우저 기본 팝업을 전부 걷어내고 화면 안 대화상자로 바꿈. 반려 사유를 여러 줄로 쓸 수 있게 됨
    • 예약 검색과 상태 필터를 화면에 붙임. 기능은 있었는데 쓸 길이 없었음
    • 항목 많은 콘텐츠(입주사 14곳·매장 16곳) 편집 화면을 접을 수 있게 함
    • 좁은 화면에서 관리자 표의 열 제목이 세로로 쪼개지던 것 수정
    • 시드 이미지 21장의 출처를 저장소에 기록하고, 출처 없는 이미지가 있으면 시드가 멈추게 함
    • 사진 출처 목록을 자동 생성해 배포에도 함께 올라가게 함
  • 궁 미로 PalaceMaze
    • 궁 미로 게임을 새 프로젝트로 시작했다. 블루프린트 전용으로 만들어 C++ 소스가 없다
    • git 저장소를 만들어 필수 폴더(Content, Config, uproject)만 추적하도록 하고 push했다
    • 궁 격자를 생성했다. 마당 5×5, 한 칸 1600, 담장 높이 240에 두께 40, 문 폭 400
    • 스패닝 트리로 모든 마당을 잇고 일부 벽을 더 열어 우회로를 만들었다
    • 담장을 넘을 수 있는지 수치로 확인했다. 점프 상승이 128이라 맨땅에서는 못 넘고, 112 이상 오브제를 딛으면 넘는다
    • 상자를 만들어 마당마다 하나씩 25개 놓았다
    • 레벨매니저를 만들어 보상 배분과 적용을 전담시켰다. 상자는 로직이 없다
    • E 키로 열도록 하고, 열린 상자는 파괴하지 않고 눌러서 표시하게 했다
    • CLAUDE.md에 프로젝트 규칙과 실측값, 도구 제약을 기록했다
  • ScorePlayer
    • 진짜 악보를 그려 4K에서 몇 ms 걸리는지 재고, 한글 가사가 제대로 나오는지 확인
    • 네이티브 스택을 Rust로 확정하고 프로젝트 뼈대를 세움
    • MusicXML을 넣으면 악보가 흐르고 투명 영상까지 나오는 상태(MVP)를 만듦
    • 압축 악보 파일(.mxl)을 압축 풀지 않고 바로 열게 함
    • 음자리표·마디선·임시표·조표·쉼표·이음줄·붙임점, 8분음표 이하의 꼬리와 빔을 그림
  • UnrealLab
    • 배치 실험을 끝내고 게임 만들기로 넘어갔다. ThirdPerson 캐릭터 위에 수집 게임을 얹기로 정했다
    • 블루프린트 그래프를 텍스트로 쓰는 DSL이 있는 것을 확인하고 문법을 받아왔다
    • BP_Pickup을 만들었다. 구체 메시와 스피어 콜라이더를 붙이고 메시 쪽 콜리전은 껐다
    • 오버랩하면 로그를 찍고 자기를 파괴하는 그래프를 DSL 한 덩어리로 써 넣고 컴파일했다
    • 레벨을 비우고 픽업 8개를 배치했다
    • 플레이 세션을 띄워 오버랩이 실제로 발동하는 것을 확인했다. 로그 1건, 픽업 8 → 7
    • 캐릭터 스폰 지점 둘레 반경 700으로 픽업을 다시 깔아 걸어가서 먹는 배치로 정리하고 저장했다
    • UnrealLab CLAUDE.md에 블루프린트·플레이 세션 실측 절을 추가했다
  • 메트로놈 Simple Metronome
    • 재생 중 다른 앱에서 소리가 나면 자동으로 멈추고, 전화가 끝나면 다시 이어서 울리게 함 (오디오 포커스)
    • 이어폰 자동정지와 함께 v1.19 출시
    • 재생 시작 때 첫 박 소리가 작게 들리던 오래된 문제를 잡음 — 소리 나기 전에 안 들리는 예열음으로 오디오 경로를 미리 깨우는 방식
    • 매우 느린 BPM(1)에서 앱이 꺼지던 것도 고침
    • 첫 박 수정과 함께 v1.20 출시
  • 오픈데이 Openday
    • 쉬는 날에 CLOSED 팻말을 띄우지 않기로 정했다. 팻말은 아무것도 막지 못하고 한 번 더 누르게 할 뿐이다
    • 그 결정으로 공휴일 처리도 같이 닫혔다. 팻말이 없으니 「오늘이 공휴일인가」를 물을 곳이 사라졌다
    • 쓴다고 적어 두고 안 싣고 있던 폰트를 같이 배포하게 했다. 지금까지 사람마다 다른 화면을 보고 있었다
    • 파비콘을 만들었다. 실제 탭 크기로 후보 넷을 그려 놓고 골랐다
    • 링크 공유 카드를 만들었다. 주소를 보내면 아무것도 안 뜨던 걸 고쳤다
    • 셔터에 받은 강아지 그림을 붙였다. 흰 선으로 바꿔서 스프레이로 그린 낙서처럼 보이게 했다
    • 오늘 만든 것을 배포했다
    • 블로그 요약 카드용 썸네일을 만들었다. 화면 캡처 대신 셔터를 상징으로 썼다 — 오픈데이를 다른 할 일 앱과 가르는 건 셔터라서 작은 카드에서 그것만 읽히면 된다
  • LOGSTONE Shop
    • 메트로놈 1.19·1.20을 업데이트 내역에 실음. 이제 여덟 건이라 최신 셋만 보이고 나머지는 접힌다
  • 온실 GreenHouse
    • 모래게임 Sandrop 광고를 추가해 광고가 11건이 됨. 블로그에서 완료로 표시한 앱이 전부 광고에 실림
    • 배너를 테라코타 색으로 만들어 이미 있던 배너들과 구분되게 함

어려웠던 점

  • BuildingHub
    • 이미지를 어디서 가져왔냐는 질문에 저장소만 봐서는 답할 수가 없었다. 저작권 문제를 피하려고 시작한 일인데 정작 증명할 방법을 안 남겨 뒀다
    • 임시 폴더에 우연히 남아 있던 원본이 없었으면 추적이 불가능했다
    • 데모 화면에 테스트가 만든 문의 열세 건이 그대로 쌓여 있었다. 담당자에게 보여줬으면 바로 들켰을 것이다
    • 화면이 멀쩡해 보이는데 실제로는 눌리지 않거나 크기가 어긋난 곳이 있었다. 눈으로는 넘어가고 재야 잡힌다
  • 궁 미로 PalaceMaze
    • 템플릿 폴더 안에 바닥이 들어 있어서, 폴더째 지우면 바닥까지 사라졌다
    • 블루프린트 간 변수 접근이 안 돼서 설계를 뒤집어야 했다. 네 가지 경로를 시험해 전부 막혔다
    • 액터 배열 변수를 만들 수 없어 처음에는 위치 배열로 우회했고, 그 탓에 순회가 하나 더 붙었다
    • 그래프 DSL이 키 입력 이벤트를 쓰지 못해 노드 API로 수작업 연결이 필요했다
    • 그래프를 DSL로 다시 쓰면 손으로 정리해 둔 노드 배치가 초기화된다
    • 리터럴 노드의 실제 제목이 짐작과 달라서, 그 이름으로 찾으면 없는 것처럼 나왔다
  • ScorePlayer
    • 실제 악보를 열어 보니 음표만 있고 자리표도 마디선도 없어서 악보로 읽히지 않았다
    • 처음 쓴 테스트 악보는 손으로 만든 것이라, 실제 프로그램이 내보낸 파일과 다른 부분이 뒤늦게 드러났다
  • UnrealLab
    • DSL 문서 예시를 그대로 썼는데 노드를 못 찾았다. 노드 이름이 에디터 언어를 따라가고 있었다
    • DSL이 이벤트를 만들 때 접두사를 영어로 하드코딩해서, 한글 에디터에서는 상속 이벤트를 만들 방법이 없었다
    • 오버랩이 안 걸렸는데 콜리전과 이벤트 등록은 전부 정상이었다
    • 실제 원인은 픽업이 공중에 있고 캐릭터는 바닥에 서 있어서 218 떨어져 있던 것이었다
    • 콜리전 프로파일을 직접 지정하면 실패해서 중첩 구조로 넣어야 했다
  • 메트로놈 Simple Metronome
    • 소리를 뺏겼을 때 어떻게 굴지 정해야 했다 — 다른 앱이 음악을 켜면 멈추고, 전화처럼 잠깐이면 통화 뒤 이어지고, 짧은 알림음엔 안 멈추고 계속 울리게(박을 놓치면 안 되니까) 갈랐다
    • 첫 박이 작게 들리는 원인은 앱 밖에 있었다. 무음에서 소리가 시작될 때 스피커가 서서히 켜지며 첫 소리를 눌러버리는 것이었다. 앱 밖 하드웨어 특성이라, 소리 전에 안 들리는 예열음으로 경로를 미리 깨우는 우회로 풀었다
  • 오픈데이 Openday
    • 「남이 봐도 괜찮은 퀄리티」가 범위가 너무 넓어서, 무엇부터 손댈지 정하는 게 먼저였다. 화면을 직접 보고 판단해야 하는 것과 코드만 봐도 확실한 것을 갈랐다
    • 폰트를 안 싣고 있던 건 만드는 컴퓨터에 그 폰트가 깔려 있어서 화면으로는 절대 못 찾는 문제였다
    • 셔터 그림을 다시 그렸다가 되돌렸다. 다시 그린 게 선이 깔끔하고 크기도 자유로운데, 나란히 놓고 보니 손그림의 떨림이 사라져서 다른 그림이 되어 있었다
    • 파비콘을 앱 색 그대로 만들었는데 작게 줄이니 안 읽혔다. 같은 색을 쓴다고 아무 조합이나 되는 게 아니었다
  • LOGSTONE Shop
    • 한 건이 아직 업로드 중이라 실어도 되는지 걸렸다. 페이지에는 있는데 스토어에 없으면 보고 찾아간 사람이 그 버전을 못 받는다. 배포가 끝난 걸 확인하고 실었다
  • 온실 GreenHouse
    • 배너를 찍어내는 틀을 임시 폴더에 뒀더니 그 사이 정리돼 사라져 있었다. 틀부터 다시 만들어야 배너를 뽑을 수 있었다
    • 배너 뽑는 스크립트가 경로를 바꾸는 데서 오류를 냈다. 경로 구분자를 찾아 바꾸는데 그 문자가 찾기 규칙에서 특별한 뜻으로 먹혔다

배운 점

  • BuildingHub TIL 2로 정리
    • 표기 의무가 없어도 출처는 남긴다 — 없으면 “어디서 났냐”에 답할 수 없다
    • 초기화가 테이블 하나를 빠뜨리면 테스트 흔적이 데모에 그대로 쌓인다
    • 브라우저 기본 팝업은 제품이 아니라 스크립트처럼 보인다
    • 이름이 흔한 클래스는 전역 스타일과 부딪힌다
    • 빈 목록에서 “모두 만족”은 참이라, 결과가 없으면 검사가 조용히 통과한다
    • 픽셀 값으로 단정한 검사는 여백만 바꿔도 깨진다. 의도한 성질을 재야 한다
    • 돌리는 요일에 따라 결과가 달라지는 검사는 신뢰할 수 없다
  • 궁 미로 PalaceMaze TIL 1로 정리
    • 궁 구조는 마당이 문으로 이어지는 격자라 미로 생성 알고리즘이 그대로 맞는다
    • 점프 높이와 오브제 높이로 담 넘기 가능 여부가 정해진다. 위험 구간이 좁게 존재한다
    • 블루프린트 간 변수 접근이 막히면 상태를 한 곳에 모으고 나머지는 멍청하게 두는 설계가 답이다
    • 네이티브 함수는 대상 핀을 받지만 네이티브 변수와 블루프린트 변수는 자기 것만 된다
    • 값을 미리 채워야 하면 실행 시 루프가 아니라 변수 기본값에 넣는다
    • DSL 재작성은 노드 배치를 초기화하므로 바꾸는 이벤트만 써야 한다
  • ScorePlayer TIL 3으로 정리
    • 악보 파일의 시간은 마디 안에서 앞뒤로 움직인다 — 피아노 두 단이 그 방식으로 겹쳐 적힌다
    • 투명 배경에서는 무언가를 가리려고 덮어 그릴 수 없다. 지우고 다시 그려야 한다
    • 빠른데 결과가 틀린 길이 있다. 속도만 보고 고르면 못 쓰는 결과를 얻는다
  • UnrealLab — Unreal Engine MCP TIL 2로 정리
    • 노드 타입 ID가 에디터 언어에 따라 달라진다. 도구 이름뿐 아니라 노드 이름도 조회해서 써야 한다
    • 그래프를 텍스트로 쓰고 되읽으면, 되읽은 결과가 곧 정확한 문법 예시가 된다
    • 게임 로직은 좌표처럼 되읽기로 검증할 수 없다. 플레이 세션을 띄우고 로그를 보는 루프가 필요하다
    • 플레이 세션이 도는 동안에는 액터 검색이 플레이 월드를 본다. 파괴 여부를 개수로 확인할 수 있다
    • PlayerStart 좌표와 플레이어가 실제로 서는 좌표는 다르다
    • 안 될 때는 설정을 뒤지기 전에 로직이 살아 있는지부터 가르고, 범위를 키워 기하 문제를 배제하고, 실제 좌표를 재는 순서가 빠르다
  • 메트로놈 Simple Metronome TIL 10으로 정리
    • 중단에는 종류가 있다. 완전히 넘긴 것과 잠깐 뺏긴 것을 구분해야 복귀 정책이 갈린다
    • 같은 멈춤이라도 사용자가 끝낸 것인지 바깥 사정으로 끊긴 것인지에 따라 뒷정리가 달라진다
    • 플랫폼이 권하는 동작도 그것이 상정한 앱과 우리 앱이 같은지 따져 본다. 들리는 것 자체가 기능인 앱에는 볼륨을 낮추라는 권고가 안 맞았다
    • 스위치를 만들 때 어려운 쪽은 켜는 자리가 아니라 끄는 자리다. 끝나는 길은 대개 여러 개다
  • 메트로놈 Simple Metronome TIL 11로 정리
    • 데이터가 같은데 결과가 다르면 원인은 데이터 밖에 있다
    • 우리가 못 고치는 특성이 원인이면 없애는 대신 손해가 안 되는 시점에 미리 겪게 한다
    • 앞에 무언가를 끼워 넣을 때는 그 자리를 기준으로 세던 것을 먼저 찾는다. 기준점을 옮기면 매달린 것도 같이 옮겨야 한다
    • 사용자가 고를 수 있는 값의 양 끝은 실제로 눌러 본다
  • 오픈데이 Openday TIL 6으로 정리
    • 만드는 환경이 사용자 환경보다 좋으면 그 차이만큼 문제가 안 보인다 — 폰트를 안 싣고 있었는데 내 화면은 멀쩡했다
    • 작은 자리에서 형태를 가르는 건 색상이 아니라 밝기다
    • 기술적으로 나은 것이 그 그림은 아니다 — 받은 그림을 벡터로 다시 그렸다가 되돌렸다
    • 범위가 넓은 요청은 먼저 가른다
  • LOGSTONE Shop
    • 스토어에 아직 안 올라간 버전을 제품 페이지가 먼저 말하지 않는다. 보고 찾아간 사람이 그 버전을 못 받는다
  • 온실 GreenHouse
    • 다시 만들 수 있어야 하는 자산은 임시 폴더가 아니라 저장소에 둔다. 만드는 법을 만들어 두는 것만으로는 부족하고 그게 남아 있어야 한다

해야 할 일

  • BuildingHub
    • 회의실 좌석 배치도
    • 업로드 이미지 자동 리사이즈
    • 사업자등록증 첨부
    • 관리자 조작 이력
    • 예약 승인·반려 안내 메일 발송
  • 궁 미로 PalaceMaze
    • 마패조각 퍼즐 만들기 (UMG)
    • 출구 트리거 붙이기
    • 타이머와 HUD 만들기
    • 열린 상자 비주얼 교체하기
    • 마당별 오브제 배치하기
    • 담장 위 이동이 문제가 되면 기와 마감 올리기
  • ScorePlayer
    • 재생 소리 붙이기
    • 가사 직접 입력과 보정 화면
    • 구간만 뽑는 기능
  • UnrealLab
    • 점수를 세고 UMG로 화면에 띄우기
    • 전부 모으면 클리어 처리하기
    • UE 5.6에 MCP 플러그인이 있는지 확인하고 toolset 구성 비교하기
    • 격자를 키울 때 기존 것을 두고 새 줄만 추가하는 증분 확장 시켜보기
    • 실험 기록을 안 읽은 새 세션에서 피벗 문제 재시험하기
    • MCPLab 폴더를 git으로 추적할지 정하기
  • 메트로놈 Simple Metronome
    • 워밍업이 다른 기기에서도 첫 박을 살리는지 확인
  • 오픈데이 Openday
    • 모바일 화면 재설계
    • 이월 사슬을 날짜가 바뀐 뒤에 실제로 확인하기
    • 사람들에게 열기 전 구글 확인 절차 — 소유한 도메인이 필요하다
  • LOGSTONE Shop
    • KeyBloom 0.1.7 나오면 업데이트 내역에 이어붙이기
    • 중복 파일 찾기 앱 손질 후 등록 재검토

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 오늘 해낸 것 120 오늘 해낸 것 121 오늘 해낸 것 122 오늘 해낸 것 123 오늘 해낸 것 124 오늘 해낸 것 125 오늘 해낸 것 126 오늘 해낸 것 127 오늘 해낸 것 128 오늘 해낸 것 129 오늘 해낸 것 130 오늘 해낸 것 131 오늘 해낸 것 132 오늘 해낸 것 133 오늘 해낸 것 134 오늘 해낸 것 135 오늘 해낸 것 136 오늘 해낸 것 137 오늘 해낸 것 138 오늘 해낸 것 139 오늘 해낸 것 140 오늘 해낸 것 141 오늘 해낸 것 142 오늘 해낸 것 143 오늘 해낸 것 144 오늘 해낸 것 145 오늘 해낸 것 146 오늘 해낸 것 147 오늘 해낸 것 읽는 중 148 오늘 해낸 것 149 오늘 해낸 것 150 오늘 해낸 것 151 오늘 해낸 것 152 오늘 해낸 것 153 오늘 해낸 것 154 오늘 해낸 것 155 오늘 해낸 것