SimuLook · 카메라에서 온 기록
하이라이트와 섀도우는 반 단계로 움직이는데, 저희는 그것을 반올림해 없애고 있었습니다
최근 후지필름 카메라에서 하이라이트를 설정하면 다이얼은 −1, 0, +1로 가지 않습니다. −1, −0.5, 0, +0.5, +1로 갑니다. 섀도우도 같습니다. 톤 설정 가운데 이 둘만 반 단계로 움직입니다.
앱은 그 값을 정수로 저장했습니다. 그 아래의 모든 경로도 마찬가지였습니다.
그 대가
보정 기준으로 쓰는 카메라의 일곱 슬롯 중 셋이 −0.5로 설정돼 있습니다. 그런 슬롯을 앱으로 읽으면 값은 들어오는 길에 반올림됐습니다. 저장되기 전에, 게시되기 전에, 다시 쓰이기 전에 말입니다.
결과는 처음 들리는 것보다 나쁘게 쌓입니다.
- 카메라에서 읽어 온 레시피는 카메라에 들어 있던 그 레시피가 아니었습니다. 반 스톱 이내였을 뿐입니다.
- 그것을 게시하면 저장한 사람 모두가 반올림된 버전을 받았습니다.
- 슬롯에 다시 쓰면 카메라는 한 번도 들어 본 적 없는 값을 들게 됐습니다.
- 함께 찍은 사진과 대조하면 앱은 정확히 일치한다고 보고했습니다. 양쪽 모두 반올림되어 같은 값에서 만나 버렸기 때문입니다.
마지막이 가장 나쁩니다. 사진을 자기 라이브러리와 대조하는 목적은 차이의 이름을 대는 것입니다. 반올림은 실재하는 차이를 거짓 확인으로 바꿔 놓습니다.
주석은 이미 거기 있었습니다
이 반올림은 아무도 눈치채지 못한 실수가 아니었습니다. 바로 위에 주석이 하나 붙어 있었고, 모델이 톤을 정수로 저장한다는 것, 최근 바디는 반 단계를 제공한다는 것, 그리고 이것이 카메라가 아니라 앱의 한계라는 것이 적혀 있었습니다.
누군가 그것을 정확하게 적어 두고 지나갔습니다. 그 문장은 몇 달 동안 참이었습니다.
이것을 언급하는 이유는 교훈이 “타입을 확인하라”가 아니기 때문입니다. 주석에 적힌 알려진 한계가 곧 고쳐진 한계는 아니며, 코드베이스는 내버려 두는 한 자기 버그에 대한 정확한 설명을 기꺼이 계속 안고 간다는 것입니다.
수정을 까다롭게 만든 부분
뻔한 수리는 필드를 소수로 바꾸고 서버에 −0.5를 쓰는 것입니다. 그렇게 했다면 업데이트하지 않은 모든 사용자의 앱이 깨졌을 것입니다.
이미 배포된 버전은 그 필드를 정수로 디코딩합니다. 소수를 받으면 성능이 떨어지는 정도가 아니라 예외를 던집니다. 그리고 커뮤니티 피드는 한 페이지가 하나의 리스트로 디코딩되므로, 반 단계 레시피 하나가 구버전을 쓰는 모든 사용자의 탐색 화면을 비워 버렸을 것입니다. 레시피 하나에, 모두의 피드가.
그래서 값은 두 번 실려 갑니다. 기존 필드는 그 클라이언트들이 이미 읽던 반올림된 숫자를 그대로 나릅니다. 두 번째 필드가 카메라 자신의 단위로 정확한 값을 나릅니다. 바디는 톤을 십분의 일 단위로 저장하므로 −0.5는 −5이고, 이것은 정수여서 소수가 왕복을 견디느냐는 문제를 아예 비켜 갑니다.
이 약속은 주석이 아니라 두 개의 테스트가 지킵니다. 하나는 현재 앱이 쓰는 것을 옛 계약 모양의 구조로 디코딩해서 여전히 정수로 읽히는지 확인합니다. 다른 하나는 모든 필드를 왕복시켜서, 손으로 쓴 인코더에서 빠진 속성이 있으면 사용자의 설정을 조용히 흘리는 대신 테스트가 실패하게 만듭니다.
아래쪽 전부가 따라와야 했습니다
값은 경로 어디에서도 다시 반올림되지 않아야만 보존됩니다.
두 편집기 모두 이제 반 단계로 움직입니다. 정수 단계 편집기였다면 주인이 여는 순간 레시피를 다시 반올림했을 것입니다. 같은 손실이 한 경계 뒤에서 일어나는 셈입니다. 카메라 쓰기 경로는 정확한 십분의 일 값을 보내므로, 같은 바디에서 읽은 슬롯에 다시 쓰면 실제로 있던 값이 복원됩니다. 되읽기 검사는 부동소수점 오차에 대한 허용은 유지하되 진짜 반 단계 차이는 봐주지 않습니다. 그리고 사진 매칭은 −0.5와 0을 차이로 보고하고, 그 이름을 댑니다.
왜 이것을 적어 두는가
앱이 내세우는 것이 당신의 설정에 대해 사실을 말해 준다는 점인데, 몇 달 동안 반 스톱 어긋난 것을 조용히 말하고 있었기 때문입니다.
수정은 반영됐습니다. 게시했던 여섯 개의 레시피는 정확한 값으로 바로잡았습니다. 하지만 정밀하다고 주장하는 앱은 정밀하지 않았던 때를 말할 수 있어야 합니다. 그러지 못하면 그 주장은 마케팅일 뿐입니다.
후지필름 필름 시뮬레이션 레시피를 읽고 쓰는 앱 SimuLook을 만들면서 쓴 글입니다. 지원 카메라 보기 · 다른 기록 읽기