회사의 주인은 주주이지만 소속감을 느끼는 것은 직원이듯, 회사에서 작성한 코드의 주인은 회사이지만 그 코드에 애착을 느끼는 것은 개발자이다. 특히나 그 코드가 30대의 내 인생의 2년 3개월을 오롯이 바쳐서 만든 코드라면 더더욱.

개발자로 일을 하다 보면 코드 전달이라는 걸 하게 될 때가 있다. 일종의 인수인계인데, 최신 코드를 설명문과 함께 전달하고 필요에 따라 코드 설명회를 여는 과정이다. 코드를 전달받는 대상은 회사 내부의 다른 직원일 수도 있고 아니면 협력사가 될 수도 있다. 내가 얼마나 오랫동안 정성을 쏟아서 만든 코드이든 나에게는 가타부타할 권리가 없다. 회사에서 작성한 모든 코드는 회사의 것이고, 그걸 다 알고 계약서에 서명을 하고 입사했으니. 모든 절차를 마치고 태연한 척 '싱숭생숭해 할 필요 없어. 우리는 다 프로잖아?' 하는 허세 가득한 마음을 속으로 먹어 주면 모든 과정은 끝이 나게 된다.

그렇지만, 조선 시대에 유씨 부인이 바늘이 부러지자 슬픔을 금할 길이 없어 조침문(弔針文)을 지었다면, 나도 이제 내 손을 떠나가게 된 코드를 위해 글 한 토막은 쓸 수 있지 않을까. 유씨 부인은 17년 간 사용했던 바늘이 부러지는 순간 정신이 아득하고 마음을 빻아 내는 듯 해서 기색 혼절하였다고 하는데, 나야 그 정도는 아니지만 어쨌든 무언가 마음 속이 허한 것은 막을 길이 없다.

하지만 보내줄 땐 보내주어야 한다. 언제가 붙잡아야 할 때이고 언제가 보내주어야 할 때인지 사람은 본능적으로 안다. 보내주어야 할 때는 아쉬움이나 미련이 없게 충분히 슬퍼하고 애타한 뒤 깔끔하게 보내주어야 한다. 유씨 부인도 부러진 바늘을 대장간에 가져가면 왜 못 고치겠냐마는 '동네 장인에게 때이련들 어찌 능히 때일손가' 라며 마음을 정리하고 바늘을 고이 보내주었듯, 나도 이젠 코드를 보내줄 때가 되었다. 기실 바늘이나 코드는 자기가 어떻게 되었는지도 모른다. 괜히 바늘 주인이, 코드 개발자가 슬퍼하는 것이지. 아직 못다한 리팩토링이, 마음에 들지 않아서 바꾸고 싶었던 변수명이, 별도 브랜치에 작성까지 했으나 결국 메인에 머지되지 못한 커밋이 머릿속에, 그리고 마음 속에 자꾸 맴돈다. 이럴 줄 알았으면 수많은 코드 사이 어딘가에 이스터 에그 하나쯤 남겨놓을걸, 하는 큰 허전함을 뒤로 하고 마지막으로 아쉬우니 괜히 git pull 한 번 하고 너를 보낼게. 가서도 잘 컴파일되고 지내야 한다. 라이브러리 의존성 안 맞는다고 심술내면서 에러 내뱉지 말고. 건강히 착하게 잘 지내렴. 나는 이제 exit 할게. 안녕.

 

ImportError: cannot import name 'Self' from 'typing_extensions'

 

위와 같은 에러가 발생할 경우 다음 명령어를 사용하시면 해결됩니다.

 

pip install typing-extensions --upgrade

 

( 참조한 곳: https://github.com/python-openxml/python-docx/issues/1337 )

[EXIF Tag] 구글 포토에서 인식 가능하도록 날짜 정보 갱신하기

 

사진 및 동영상 파일의 EXIF 태그에는 여러 항목이 있는데, 구글 포토는 이 중 DateTimeOriginal 태그를 인식하여 사진이 찍힌 날짜를 추정합니다. 그래서 해당 태그가 아닌 다른 태그에 날짜가 저장된 파일의 경우 구글 포토에서 엉뚱한 날짜를 인식하는 경우가 종종 있습니다. 이를 방지하기 위해서는 exiftool 이라는 프로그램을 사용하여 다음과 같이 처리하면 됩니다. Exiftool은 https://exiftool.org/ 에서 다운받으실 수 있습니다.

 

아래 명령어를 순서대로 입력하면 됩니다. 명령어의 의미는 다음과 같습니다. 명령어 뒤의 /path/to/photos/ 는 사진이 있는 디렉토리의 경로입니다.

(1) DateTimeOriginal 태그가 없으면 FileModifyDate의 값을 DateTimeOriginal에 저장합니다.
(2) (1)의 내용을 K3G 파일에도 적용합니다.
(3) PNG 파일의 경우, DateTimeOriginal 태그가 있으면 그 값을 FileModifyDate에 저장합니다. 이 때 PNG 파일은 조금 특별해서, EXIF:DateTimeOriginal의 값을 가져와야 합니다.

(4)(5)(6) GIF, MP4, MOV 파일에 대해서, DateTimeOriginal 태그가 있으면 그 값을 FileModifyDate에 저장합니다.

 

exiftool -if 'not $DateTimeOriginal' -overwrite_original_in_place '-DateTimeOriginal<FileModifyDate' -r /path/to/photos/

exiftool -if 'not $DateTimeOriginal' -overwrite_original_in_place '-DateTimeOriginal<FileModifyDate' -r -ext k3g /path/to/photos/ 

exiftool -if '$DateTimeOriginal' -overwrite_original_in_place '-FileModifyDate<EXIF:DateTimeOriginal' -r -ext png /path/to/photos/ 

exiftool -if '$DateTimeOriginal' -overwrite_original_in_place '-FileModifyDate<DateTimeOriginal' -r -ext gif /path/to/photos/ 

exiftool -if '$DateTimeOriginal' -overwrite_original_in_place '-FileModifyDate<DateTimeOriginal' -r -ext mp4 /path/to/photos/ 

exiftool -if '$DateTimeOriginal' -overwrite_original_in_place '-FileModifyDate<DateTimeOriginal' -r -ext mov /path/to/photos/ 

 

 

한편 예전 핸드폰인 Cyon과 Optimus, 그리고 VK의 경우 추가로 해 주어야 하는 작업들이 있습니다. 먼저 Cyon과 Optimus의 경우 동영상 파일을 Cyon은 MP4, Optimus는 3GP로 저장하는데, 이 경우 MediaCreateDate 태그가 존재하기 때문에 그 값을 DateTimeOriginal과 FileModifyDate 으로 복사해오면 됩니다.

 

exiftool -if '$MediaCreateDate' -overwrite_original_in_place '-DateTimeOriginal<MediaCreateDate' -r -ext mp4 /path/to/photos/ 

exiftool -if '$MediaCreateDate' -overwrite_original_in_place '-FileModifyDate<MediaCreateDate' -r -ext mp4 /path/to/photos/ 

exiftool -if '$MediaCreateDate' -overwrite_original_in_place '-DateTimeOriginal<MediaCreateDate' -r -ext 3gp /path/to/photos/ 

exiftool -if '$MediaCreateDate' -overwrite_original_in_place '-FileModifyDate<MediaCreateDate' -r -ext 3gp /path/to/photos/ 



그리고 VK 핸드폰의 경우 FileModifyDate 태그조차 사진을 찍은 날짜가 아니라 파일을 컴퓨터에 저장한 날짜로 되어있기 때문에 다음과 같이 파일명에서 날짜를 추출해야 합니다.

 

rename s/P-/20/g ./*.*

exiftool -if 'not $DateTimeOriginal' -overwrite_original_in_place '-DateTimeOriginal<Filename' -r /path/to/photos/

exiftool -if '$DateTimeOriginal' -overwrite_original_in_place '-FileModifyDate<DateTimeOriginal' -r /path/to/photos/ 

 

 

+ Recent posts