빌드 시간 얻어오기
팀에서 작성하는 실행 파일 (.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
junction point, hardlink, shortcut는 기존에 있던 방법이고 2008부터 softlink(symbolic)가 생겼더라고요. 2008부터 유닉스 개발자를 적극적으로 포용하기 위함인지 많은 부분에서 차용해가는 것 같습니다.(condition variable이나 rw lock같은 것들도 그렇고).
… hardlink 걸린 파일이 자주 수정되면 데이터를 백업할 때 어떤 재앙이 일어날지 모르기 때문에 각별한 주의가 필요하다고 생각됩니다.(hardlink group을 알아내는 게.. 윈도우는 손쉽게 가능하긴 하지만요)
예전부터 Service for Unix 같은게 있긴 했지만, 일반적인 *nix 프로그래머 관점에서야 최근 추가된 것들이 꽤나 구미에 맞죠(…)
이번에 hardlink 사용한 건 백업하지 않을 데이터, 그러니까 잘 관리되는 소스에서 복사만 해올 데이터에 대해서 하는 거라 수정에 관한건 크게 신경 안써도 되는거라 하드링크가 제일 편하겠더군요.
새로 복사해올 때마다 revision이 올라가되 이전 revision 몇 개만 남아있으면 되는 식이라…
빌드한 시각 말인데요. 파일의 속성 중 “수정한 날짜”를 보면 되지 않나요? 어차피 바이너리 파일을 나중에 편집기로 수정할 일도 없을 테니 이 정보면 충분하지 않나 싶습니다만, 뭔가 이유가 있으니 이런 일을 하시는 것 같고, 이유가 궁금하네요.
네크워크를 통해 Windows 자체 복사가 아닌 방식으로 복사하면 mtime, ctime다 새로 생성되서 그 방법은 안되더라고요;
항상 Windows를 통해 복사하는게 아닌 상황이라, 중간에 .zip 처럼 mtime 보존하는 방법을 쓴다는 보장이라도 없으면 결국 so에 나온 저 방법밖에 없는 거 같더군요;;
파일의 빌드 시각을 C++에서도 어렵지 않게 얻어올 수 있습니다.
GetTimestampForLoadedLibrary(…) 이용하면 됩니다. 예전에는 이걸로 실행파일 버전을 만들어 냈었습니다.
C 쪽에서는 훨씬 간단하게 되네요. 링크해주신 글 잘 쓰겠습니다 :D
http://devnote.tistory.com/150 – 실행파일 생성시각 얻기.
robocopy 로 파일타임스탬프를 변경하지 않으면 윈도우에선 문제가 없는데, FTP는 문제가 있겠군요.
robocopy나 .zip 같은 걸 매개하지 않는 이상에야 어쩔 수 없지요;;
차라리 파일 속성에 제품 버전과 파일 버전이 따로 있으니, 파일 버전은 버전 번호를 넣고, 제품 버전에는 빌드 시각을 넣는 게 낫지 않을까요? 그 편이 추가로 개발할 것도 적고 버전 확인하기도 쉬울 것 같은데요 .MSDN에도 제품 버전은 아무 문자나 넣어도ㄷ ㅚㄴ다고 하는데 말이죠. http://msdn.microsoft.com/en-us/library/system.reflection.assemblyinformationalversionattribute.aspx
이미 버전 정보 넣는 룰은 몇 달전부터 결정해서 사용 중인 거고, 나중에 콘솔에서 쉽게 확인하려는 목적인거라 간단?하지는 않지만 일단 이 방법으로 진행 중입니다