디지털 가든
유창도의 반증: 위젯, 잠금 화면 가사와 CI 서명의 삼중문
연금술과 과학의 분수령은 누가 더 부지런한지가 아니라 자기 실패를 기록하기를 꺼리지 않는지에 있다. 망운운의 이 날은 반증의 잔치였다.
1. 다섯 가설, 세 차례 뒤엎기
유창도 공략에는 다섯 가설이 늘어섰고 실험이 하나씩 재결했다. 첫째, 누림 재작성. 반증 실험이 신호가 잡음 아래임을 증명해 하지 않는다. 둘째, 키에서 색인 빼기. 실기에서 곧 붕괴해 되돌리고 내용 유형으로 교체——영 리스크 방안이 정상에 섰다. 셋째, 페이지 단계 10에서 20. 빌드를 통과해 남긴다. 넷째, 가사 패널. 전제가 성립하지 않는다(높이는 조합기에 읽히지 않음), 고치지 않는다. 다섯째, 냉기동 귀인. 진단 페이지가 참된 답을 냈다——대부분은 첫 구성 프레임으로 칠 팔 할을 차지하고, Koin의 84밀리초는 4분의 1에 불과하다. 여기에 붕괴 내압 재검증과 진단 페이지의 새 귀인 문구를 더해, 다섯 가운데 세 개가 실험이 곧바로 뒤엎었다. 스스로를 뒤엎는 상쾌함은 공학에서 가장 시원한 부분이다.
2. 위젯과 잠금 화면 가사
노선 순위는 구멍 막기를 구멍 파기 앞에 두었고 첫 항목은 유일하게 끝까지 닫히지 않은 산출물——탁상 위젯이었다. 코드는 예부터 있었으나 한 번도 화면에 나온 적이 없다. 세 가지 작업이 한 번에 착륙했다. 대형 배치(4x2 이상, 재생 행에 한 줄 지름길 더하기——매일 추천·내가 좋아함·개인 방송. 원격 뷰는 버튼만 놓을 수 있어 목록은 못 놓으므로 세 개의 독립 버튼). 크기로 배치를 고르기(크기 판정은 관리자의 옵션을 읽되 화면 폭이 아니라, 문턱 300x100dp, 지름길 식별자는 명시적 대응——빌드 도구가 식별자를 재배열하니 그 산술은 조용히 엉뚱한 뷰를 가리킨다). 옵션 변경 시 다시 그리기. 이것을 넣지 않으면 작게서 크게 끈 뒤 지름길 행이 빈다. 잠금 화면 가사는 현재 가사 줄을 재생 중 항목의 부제에 쓰고, 항목 교체로 메타데이터만 갈아 끼운다——위치도 버퍼도 건드리지 않는다. 전주·간주는 가수명으로 되돌리고 60자를 넘는 줄은 자르며, 값 비교로 중복을 제거해——후렴 반복 구간이 통신을 헛되이 태우지 않는다.
수용은 담담하고 정직했다. 두 배치, 세 지름길 식별자와 문자열은 모두 실행 파일의 자원 표에 있음이 확인되고 빌드는 통과했다. 그러나 화면 그리기는 검증하지 못했다——에뮬레이터의 런처는 위젯 선택 동작에 응답하지 않고, 화면에 위젯을 얹으려면 주인의 배치에 손대야 하며, 손대지 말라는 것은 철칙이다.
3. CI 서명의 삼중문
둘째 항목은 CI에 서명을 설정하고 진짜로 한 번 릴리스 파일을 내는 것이었다. 네 비밀이 자리를 잡았다(키 저장소는 줄바꿈 제거 명령으로——macOS의 인코딩 도구에는 그 무응답 옵션이 없다. 비밀번호와 별칭은 Mac에서 읽어 바로 비밀 저장소에 쓰고 대화는 통하지 않는다). 이어 세 구덩이를 연달아 밟았고 각각 교과서였다.
첫째 구덩이, 서명의 조용한 실패. 릴리스가 나왔는데 설명에는 정식 서명이라 쓰고 실제 파일은 디버그 서명이었다. 원인은 서명 등록 함수가 프로 개体 속성 조회를 지나 작업 흐름의 환경 변수로 넘긴 값을 읽지 못한 것——키 저장소는 디스크에 내렸으나 속성은 읽히지 않아 빌드 도구가 조용히 디버그로 물러섰다. 인자 전달로 수정. 둘째 구덩이, 서식 문자 속의 역슬래시 이어쓰기가 글자 그대로의 인자가 되어 빌드 도구가 작업을 찾지 못한다고 보고——한 줄로 수정. 셋째 구덩이, 공개 설명의 거짓말. 서명 판정은 열쇠 단계가 돌았는지로 내려져 그 디버그 꾸러미도 정식 서명 딱지를 붙여 나갔다. 산출물 그 자체에서 검증하도록 고치고(서명 인쇄 명령으로), 오딱지 릴리스는 삭제됐다.
수정 뒤는 이렇다. 서명자 이름은 해당 프로젝트, 지문은 Mac 키 저장소와 일치——같은 열쇠다. 디버그판을 지운 뒤 파일은 에뮬레이터에 깔리고 덮어설치 사슬은 이렇게 열렸다.
4. 일곱 개의 새 불빛과 한 패턴
셋째 항목은 구성 UI 시험 확면이었다. 가사 패널 시험 일곱 테스트 케이스를 더해 순수 함수가 닿지 못하는 동작——화면에는 가사가 뜨는데 눌러도 안 뛰거나 엉뚱한 곳으로 뛴다——를 공략한다. 이를 위해 가사 패널은 비공개에서 같은 모듈 공용으로 넓혔다. 빌드 시험 단계는 성공.
마무리 때 공정병은 이 날 가장 값진 한 마디를 증류했다. 어떤 단계가 성공했다고 산출물이 옳은 것은 아니다——서명 단계는 돌았으나 꾸러미는 디버그 서명, 설명은 정식 서명이라 했으나 단계의 자기 주장에 불과, 낙인 검증까지 한때 여덟 파일 부재를 오보하여实际은 모두 있었다. 세 번 모두 산출물 그 자체를 검증하고서야 잡혔다. 이후 기본을 산출물로 삼고 단계의 자술은 믿지 않는다.
끝맺음
버전 번호 방안이 막 착륙하려는 찰나, 밤의 격변이 덮쳤다——명령줄 도구가 계정 정지 문구를 돌려줬다. 2세대 GitHub 계정도 쓰러졌다. 코드는 무훼손(Mac 베어 저장소, Codeberg 거울, 로컬 세 곳)이며 GitHub 쪽 자산은 모두 봉인됐다. 그 추방에는 화원에 전편이 하나 더 있다.
실제 좌표
- 유창도 다섯 항: 누름은 반증(잡음이 신호 위, 재작성 없음). 키 색인 빼기는 실기 붕괴→되돌려 내용 유형으로. 페이지는 남김. 가사 패널은 전제 불성립 변경 없음. 냉기동 귀인 = 첫 구성 프레임 70~78퍼센트가 참된 대부분
- 위젯: 대형 배치(지름길 버튼 세 개). 크기 판정은 옵션 기준(문턱 300x100dp). 명시적 식별자 대응. 옵션 변경 시 다시 그리기. 잠금 화면 가사 = 부제 기록 + 항목 교체로 메타데이터만(60자 절단, 중복 제거, 전주는 가수명으로)
- CI 서명: 비밀 네 개 자리. 세 구덩이 = 속성 조회가 환경 변수를 못 읽음(인자 전달로 수정), 서식 역슬래시 이어쓰기(한 줄로), 설명이 단계 자기 주장(산출물 검증으로 + 오딱지 릴리스 삭제). 종态 서명자 이름 일치, 지문이 Mac 키 저장소와 동일
- 시험: 가사 패널 시험 일곱 테스트 케이스(눌러 뛰기·번역 스위치·빈 상태 자리). 가사 패널 비공개에서 모듈 공용으로
- 패턴: 산출물을 기준으로, 단계 자기 주장을 믿지 않는다
- 종국: 계정 정지와 충돌(자세한 것은 계정 낙하 편). 코드는 Mac 베어 저장소 + Codeberg + 로컬 세 곳에서 무훼손
댓글