rein's world

C++ 프로그래머의 일상: 2008년 3월 6일

역시나 디버깅 일기.

Berryz WebShare – RAR 플러그인 디버깅

Berryz WebShare 에서 동작하는 RAR 플러그인의 디버깅을 했다. 사실 문제가 좀 마이너하고 간단한거였는데, RAR로 묶어서1 전송하는 플러그인이 있는데, 묶인걸 풀고보면 파일 시간이 이상하게 표시되는 것.

예를 들자면 2008-03-01 PM 04:42 에 수정된 파일이, 수정 시간 2010-10-28 AM 07:03 으로 나오는 것. RAR 포맷에 대한 정보를 확인해보니 답은 바로 나오더라.

  • RAR은 파일의 시간을 4bytes로 표시한다.
  • 표시 형식은 DosDataTime 이라는 MS에서 정의한 형태다
  • 이 포맷은 두 개의 16bit 값으로 이루어져 있다 (각각 날짜/시간).

…뭔가 감이 오지 않는가? 실제로 저 값들을 MSDN을 통해 확인한 형식으로 16진수로 바꿔놓고 보니, 순서가 틀렸다는게 한 눈에 들어오더라. 코드 두 줄 고치고 수정 끝.2

교훈: 정식으로 문서화 안된 포맷은 한 빗 한 빗 검사하면서 짜자. 근데 과연 이 코드가 언제 들어간 것일까? 코드 처음 작성했을 때 부터다. 즉 만들어진 이래로 들어가있던 버그 Orz

ToDo 로그인 문제 수정

http://rein.upnl.org/todo/ 의 로그인 문제를 해결.

trac이 기본적으로 자기 URI에 /login 을 붙여서 로그인 페이지를 만드는 걸 보고,

  • /todo
  • /todo/login

이렇게 디렉토리를 만들고, 각각에 .htaccess 를 만들었는데, login 쪽에는 인증(authentication)을 요구하는 구문을 넣었다. 그리곤 해결.

실패해야하는 테스트가 성공하는 문제

회사에서 만들고 있는 프로그램의 유닛 테스트 중에 반드시 실패해야하는데 성공하는 괴악한 녀석이 있었다. 원인은 무지 간단했다. Loop–invariant3를 그거랑 동등한 다른 표현이랑 비교하고 있었다(얼핏 보기엔 그 검사로 제대로 도나 검사가 되는 것처럼 보였다 Orz). Loop–invariant 자체가 깨지는지를 보려고 했던 건데, 그거랑 오동작해도 수학적으로 동등한 다른 구문을 비교해놨으니 실패할리가 있나 — 깨져도 같이 깨지고, 깨진 값 자체도 같을테니. 오늘 퇴근 30분 전쯤에 발견하고, 테스트 실패하는 것 확인하고, 제대로 돌게 수정.

뭔가 삽질과 과거의 삽질을 파내는 삽질(…)을 수행한 하루였다. 흑흑


  1. 말그대로 묶기만 한다. RAR의 동작을 흉내내서 RAR 포맷으로 묶어주긴하지만 압축 이런건 전혀 없다. 단지 다국어 되어있는 파일 이름을 Unicode로 인코딩해서 보낼 수 있는 RAR을 최대한 써먹어보자라는 것 뿐. ↩︎

  2. date, time 순으로 쓰던걸 time, date순으로 수정. ↩︎

  3. 반복문–불변식 정도? 반복문에서 변하지 않는 ‘식’에 해당하는 녀석이다. Loop(반복문)에 들어가기 전, 실행되는 도중, 실행된 후에도 모두 참이어야 한다. 예를 들어 팩토리얼을 구하는 코드(from Discrete Mathematics and Its Applications 4th ed. by Kenneth Rosen)를 보자.

    int factorial( int n )
    {
        int i = 1;
        int fact = 1;
        while( i < n )
        {
            i += 1;
            fact = fact * i;
        }
        return fact;
    }
    

    여기서 fact = i! && i <= n 이란 식을 정의하면 이 식은 loop 시작 전/중/후에 모두 참이고 while 문에서의 loop–invariant가 된다. 이걸 써서 loop 의 정확성 증명할 때 활용한다. ↩︎