rein's world

프로그래머의 일상: 빌드 시간 얻기, 하드 링크, ...

빌드한 시간 얻어오기

팀에서 작성하는 실행 파일 (.exe, .dll) 에는 버전 정보를 넣는데, 여기엔 논리적인 버전 정보 + 소스 저장소 revision만 들어간다. 그래서 파일 실행할 때 이 버전 정보만 보고 언제 빌드한 건지 알기가 힘들더라.

파일을 실제로 빌드한 시간을 알 수 있으면 좋지 않을까 하고 구글에 검색해보니 이런 게 뜨더라: stackoverflow: C# – displaying the build date

원리는 간단(?)하다. Windows PE 포맷에 따르면, 파일 헤더에 linker timestamp가 찍혀있는데, 이 값을 읽어오는 것. 이건 단순히 unix time이라 이걸 가지고 적당히 변환해서 시간을 얻어오면 끝. 써보니 괜찮더라. 나중에 가능하면(?) C++ 쪽 프로젝트에서도 써봐야 겠다.

링크한 글 뒷부분에는 좀 더 쉽게(?) 하는 방법도 적혀 있다. 버전 정보를 ?.?.* 로 주면 VS가 알아서 이 값을 치환하는데, 그 중 마지막 부분이 unix time / 2 라서 이걸 역산하는 방법이다.

하드 링크

*nix 쪽에 익숙한 사용자라면 흔히 알고 있을 ln 명령어가 있다. inode가 같으면 같은 파일이라는 점을 이용해서, 파일을 실제로 복사하지 않고도, 서로 다른 이름이지만 실제로는 동일한 파일이게 하는 방법이 있다.

Windows에는 junction point라고 디렉터리의 심볼릭 링크 비슷한 것만 있다고 생각했다. 근데 의외로(?) 하드 링크도 있고, 꽤나 역사가 길더라고;; 다만 .net framework에는 노출된 인터페이스가 없어서 p/invoke로 CreateHardLink( )라는 Windows API를 직접 호출해야 했다.

하지만 이걸 쓴 덕분에 파일 복사 비슷한 일을 하는 도구를 짜고 있는데, 로컬 디스크에서 파일 복사(?)하는 일이 두 배 빨라지면서, 하드 디스크에서 차지하는 용량도 줄게 됐다.

Web browser당 연결 수 제한

Web Browser는 하나의 호스트 네임에 동시에 접근할 수 있는 연결 수가 2로 제한되어 있다. 나는 Cherrypy에 내장된 웹 서버가 (WSGI 서버지만) 동시에 여러 개의 연결을 처리 못한다고 생각했다 – 일단 돌려본 결과가 그랬으니까.

근데 이건 첫 번째 탭에서 페이지를 하나 띄워두면 (이게 첫 번째 연결) – 긴 연결을 하려고 큰 파일 업로드 – 두 번째 페이지를 띄우기 전에(…) favicon.ico를 요청하고 (이게 두 번째 연결), 실제로 페이지는 다운받을 연결이 없어서 안 뜨는 거였음 Orz