백업한 사진을 보기가 불편하다

image

(퍼온 이미지임. 내 폰 상태는 이렇게 심플하지 않다.)

아이를 가진 아빠가 되고 나서 휴대폰 카메라를 사용하는 일도 전보다 더 많아졌다.

휴대폰의 메모리 용량은 그리 넉넉하지 못한 편이기 때문에 가끔씩 데스크탑으로 백업한 후 비워주어야 한다. 헌데 미디어 파일들을 복사하면 정말 복사만 될 뿐이지, 파일이 전혀 정리되어 있지 않아서, 나중에 찾아보기가 힘들다는 단점이 있다. OS X와 함께 PhotoStream을 사용한다면 더 근사한 방법이 있는지는 잘 모르겠는데, 윈도우 에서는 달리 대안이 없는 듯.

image

데스크탑으로 복사하면 왼쪽 스샷처럼 정체 모를 이름의 폴더에 파일이 생성된다. 폴더 이름은 iOS 내부에서 사용하는 hash 값? 일 듯 하지만 윈도우로 복사해온 이상 크게 의미가 없다. picasa같은 프로그램을 사용하면 폴더가 어떻게 되어있건 상관없이 날짜 분류를 할 수 있겠으나, 다른 프로그램을 쓰지 않고 윈도우 탐색기 만으로도 어느 정도 파일 분류가 가능하면 좋겠다는 생각이 들었다. 백업을 하더라도 파일을 찾아보기가 힘드니까 사진을 찾아보는 것도 꺼려지게 된다.

처음엔 수작업으로 사진 파일을 분류해 봤다

그래서, 이 미디어 파일들을 찍은 날짜 별로 정리해보자고 마음먹었다. 뭐 어차피 나중에 다시 보려고 찍은 사진이니 감상도 할 겸 하나하나 정리해 보자. 사진을 하나 열어보고, 폴더를 만들고, 옮기고, 다시 다른 것 열어보고, 만들고, 옮기고, … 열어보고…, 만들고…, 옮기고…

image

처음 한두 번 정도는 할 만 했다. 그래 이 날은 참 즐거웠어.. 이 때는 정말 고생했지.. 사진으로 찍어두길 잘했어 하하.. 이러면서 한참을 작업하고 보면 정리한 파일은 겨우 전체 분량의 1~2% 정도 될까 한 수준. 게다가 내 폰 사진 정리가 끝나면 와이프 폰도 하려고 했는데… 아 참 아이패드로도 사진 찍은 게 좀 있지…이 생각을 하니 앞이  깜깜해졌다.

그래서 차라리 파일 정리를 자동화 해주는 툴을 짜기로 결심한다.

사진을 분류해주는 툴을 만들어서 돌려보자

언어는 윈도우 프로그래밍에 가장 무난한 C#을 사용했다. 예전에 비슷한 동작을 하는 툴을 한 번 짠 적이 있었는데, 그 땐 간단하게 만든다고 그냥 싱글스레드로 돌렸더니 CPU는 많이 노는데 실행 시간이 너무 오래 걸렸던 적이 있었다. 그래서 이번에는 멀티 스레딩으로 처리하기 위해 TPL(Task Parallel Library)의 Parallel.ForEach를 이용했다.

카메라로 촬영한 사진에는 Exif 메타 데이터를 읽으면 촬영 날짜를 확인할 수 있는 걸 알고 있었지만 동영상 파일에도 이런 메타 데이터가 있다는 걸 이번에 알았다. 파일 수정날짜로 우선 분류해보고 잘 안되면 mediainfo라는 라이브러리를 써보려고 했는데,  다행히 수정날짜 만으로 적당히 나쁘지 않게 동작해서 그냥 패스. 사진의 exif를 읽는 건 검색해서  적당한 방법을 긁어와 사용했다.

이렇게 사진, 동영상을 날짜 기준으로 한 달치씩 모아 한 폴더에 넣고, 다시 1년치의 폴더를 따로 묶어 보았더니 제법 마음에 들게 정리 되었다.

image

이렇게 쉽게 끝날 것을.

약간의 메모 - TPL

C#에서 멀티스레딩 처리를 해본 것이 처음이었는데, TPL은 정말 심플하고 사용하기 쉬워서 인상적이었다. C++에서 스레딩 처리를 위해 작성해야 하는 코드들과 비교해 보자면 정말 깔끔하다.

처음엔 스레드간 job passing을 위한 큐로 IOCP를 사용하려고 했는데, 아주 당연하게 있을 거라고 생각했던 IOCP API가 C#에 없었다. 대신 ThreadPool이 이 역할을 대신 해주고 있어서 써봤는데 잡다한 것 신경 쓸 필요 없이 job만 던져 넣으면 알아서 실행해주니 무척 편리하다. 요청한 모든 job이 끝났는지 확인해서 다음으로 진행하는 thread join 처리만 조금 신경 써주면 되었다.

그러다가 Parallel.ForEach도 괜찮아 보여 분산처리를 이것으로 다시 변경했다. 정말 감동이었다. 이건 join조차 신경 써줄 필요가 없다. 그냥 For루프 만들듯이 코딩 할 뿐인데 잡다한 분산처리 노가다가 알아서 다 되니 거의 손 안대고 코 푸는 느낌이다.

물론 VC++에도 ThreadPool도 있고 parallel for loop도 있다. ThreadPool은 비스타 부터 win32 api 자체에 지원되기 시작했고, PPL을 사용하면 parallel for도 쓸 수 있다. 헌데 C++로 만드는 프로그램이라면 왠지 정석대로 win32 Thread를 직접 생성/관리 해주어야 할 것 같은 느낌적인 느낌이 있어서 좀 꺼려진다. 개발 언어가 C#이라면 그런 부담감이 좀 덜함.

성능에 크게 민감하지 않으면서 병렬처리가 필요한 코드를 짜야 한다면 C#의 TPL을 쓰는 게 좋겠다. 나중에 기회가 되면 좀 더 제대로 써먹어 봐야지.

 

활용

파일을 정리한 것과 다소 개연성은 좀 떨어지지만(…), 이제 이렇게 정리된 사진 파일을 Synology Nas에 넣는다. 그러면 백업 후 파일을 모두 날려버린 휴대폰에서도 문제없이 사진을 볼 수 있고

Screenshot_2014-05-09-13-12-00

웹에서도

image

TV에서도 똑같이 사진을 볼 수 있게 되었다.

20140509_071622

20140509_071655

사진을 찍을 때마다 백업하고 정리하는 것이 부담이었는데 이제는 툴을 만들어뒀으니 부담 없이 애기 사진 열심히 찍어야지.

IMG_2500

2014년 4월. 신구대 식물원. 1년 전 꼬맹이와 함께.

'잡담' 카테고리의 다른 글

아이폰에서 백업한 사진, 동영상을 정리해보자  (0) 2014.05.07
WikidPad  (0) 2014.04.11
화살표 주석 달기  (0) 2013.12.24
자료 정리  (0) 2013.11.18
최근의 장난감  (0) 2013.06.12
chocolatey  (0) 2013.03.20
Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요