iPhotoFlickrSync

2년 전부터 나는 iPhoto 에 있는 사진을 Flickr 와 연동하길 원했고, 새로 나온 iPhoto 09 에도 기대를 걸어 봤지만, 내가 원하는 것이 될 수 없었다.
내가 가장 원하는 것은

  • 나는 사진을 iPhoto 에만 넣는다.
  • 그럼 iPhoto와 Flickr 는 자동으로 Sync 된다

였다.
하지만 내가 원하는 것을 찾을 수는 없었다. 그 추정되는 이유로는

  • 일반 사용자들이 필요로 하기엔 고급 기능에 가깝고,
  • 자동 싱크라는 것이 일반적으로 구현하기엔 너무 복잡한 일에 가깝고,
  • 방대한 iPhoto 사진을 백업 목적으로 Flickr 를 사용하는 예는 드물기, (대부분 공유의 목적으로 사용하지 않을까)

때문이 아닐까 싶다.
그래서 2년간의 숙고 끝에 자작 솔루션 제작에 들어갔다. 사실 수작업으로 Flickr 연동을 해 오다, 올해 1월부터는 안하기 시작했다. 가끔 Flickr 에서 사진을 찾아봤으면 했다가도, 이내 2010년이 들어서는 연동한 적이 없다는 것을 알고 실망한 적이 있었다.
언어는 Ruby 를 선택했다. Rails 공부하는 중이기도 하고 해서…

  • 첫번째 목표는 iPhoto 에 있는 정보를 Sqlite DB 로 옮기기.
  • 두번째 목표는 Flickr 에 있는 정보를 Sqlite DB 로 옮기기.
  • 마지막 세번째 목표는 iPhoto 에는 있지만, Flickr 에는 없는 사진들을 Upload 하기. 이 때, KEY 값은 사진이 찍힌 날짜( PHOTO_TAKEN ) 으로 잡았다.

SequelFlickraw 두개의 gem 의 도움으로 간단히 작성이 가능했다.
현재, 약 4천개 정도 업로드 할 사진이 있음을 파악하고 업로드 중에 있다. 한시간에 대략 170개씩 올라가고 있다.
현재 버젼의 가장 큰 문제점으로는

  • PHOTO_TAKEN 정보가 없거나 틀린 것이 꽤 있다. 대표적인 것이 동영상 AVI 파일이다. 이것들은 옮겨진 시간등이 기준으로 삼아진다. 그래서 이것들을 배제하거나, 아니면 다른 방식으로 관리가 필요하다.
  • 10시간 정도를 돌려도 1700개 밖에 못올리니깐 DB Record 를 뽑아놓고, 10시간째 돌리고 있으니, TIMEOUT 에러가 나서 중간에 멈춰선 경우가 있다. 다른 방식이 필요하겠다.

사실 하도보니 욕심이 난다.

  • 최초에 기대를 했던, Tag, Title, Description 에 대한 Sync 기능. iPhoto 에서 특정 사진에 대해서 정보를 편집하면 그것이 Flickr 에도 반영하기. PHOTO_TAKEN을 KEY로 해서 싱크 구현은 가능 할 듯 한데, 생각보다 복잡할지도…
  • iPhoto 내에는 인물 인식에 대한 정보도 있다. 이거 대충 보니, 좌표까지 있어서, Flickr 에 반영도 가능 할 것 같다.
  • 역으로, Flickr 에는 있지만, iPhoto 에는 없는 것을 가져오는 기능 구현.

언제 다시 맘먹고 업그레이드 할 지 모르겠지만, 그래도 올해 사진 4천개 파일을 자동으로 올렸다는데 일단 만족한다.

iPad 를 완성하다

먼저 그냥 받침대.
이건 침대 옆 탁자에 놓으려고 샀다. 충전할 때, 널부러져 있는 게 안타까워서 세워줄려고, 그리고, 내심 기대했던 건, 디지털 액자로 쓸까 하는 생각이었다. 하지만, 현실은 자다가 일어나 보면, 역시 널부러져 있다. (이전보다 상처가 더 크다)

밑면에 고무 재질이 맘에 든다. 이거 없었으면 돈값 못한다고 생각했을 텐데…

아이폰, 아이패드용 키보드.
의외로 이거 쓸데가 없다. 들고 다닐 수 없는 모양과 사이즈. 집에서만 쓰란 말인데, 집에서 굳이 아이맥, 맥북 놔두고 아이패드로 글 쓰기를 해야 하는 이유가 뭘까? 역시 결국은 사용용도가 또 다른 충전용 받침대로 귀결된다.

그나마 가장 쓸모가 있을 경우는, 아이폰을 꼽아 놓고, 문자가 왔을 때, 답하는 것이다. 사무실에서 문자가 자주 온다면, 옆에 두고, 문자 답하기에 쓰면 제격일 듯 하지만 overkill 느낌.

키보드가 이동 편리하게 분리가 된다면, 까페에 가져가서 글쓰기 하기엔 딱이겠지만, 생겨먹은건 이동성 고려는 제로.

Camera Kit 에 포함된 USB 연결 어댑터.
아이폰4에 꼽으면 지원되지 않는 기기라고 경고가 뜬다. 하지만, USB 키보드를 붙이면 동작한다. 나름 긴급한 키보드 연결용으로 사용 가능할까?

CameraKit 에 포함된 SD Card Reader.
SD 카드를 삽입하면, iPad 에서 Import 화면이 뜬다. 야외 촬영 나가서, 아이패드랑 이것만 있으면 즉시 즉시 넓은 화면에서 찍은 사진 감상 가능하겠다. 아직은 활동 못해 봄.

나름 기대작. Compass Stand for iPad.
이동용 케이스가 나름 고급 스럽다. 양말처럼 꽉 끼게 들어간다.

빼서 세우면 스탠드가 생긴다. 재질이 티타늄느낌이라 가벼우면서 강한 느낌이 들고, 필요한 부분은 고무 처리 되어 있다. 하지만, 역시 중국산이다 보니 고무 부분이 딱딱 맞아떨어지지는 않는다. (예전 일제 갈은 정교함은 기대 못함)

나름 이동성과 견고함을 갖췄다는 생각이 든다.

뉘여서 쓸 수도 있다. 테이블 위에서 이 각도로 해서 타이핑도 가능하다. 어짜피 iPad 타이핑이 그렇지만, 이 자세에서도 그리 편리하지는 않다.

대망의 가방.
솔직히 아이패드 가방을 동대문 같은데 주문 제작을 의뢰할까 생각할 정도였다. 아이패드가 딱 들어가는 여행용 세면도구 가방을 사용했었는데, 크기는 너무 맘에 들었지만, 문제는 외부에 포켓이 없어서 전화기를 넣어두기에 너무 불편하다는 점이 있었다. 그래서 이 문제만 개선된다면 좋겠는데 생각하고 있었는데, 딱 원하던 제품을 찾아버렸다. 그것도 험하게 쓰기로 유명한 내가 1년이나 써도 끄떡없이 버텼던 booq 에서 나온 제품.
앞쪽에는 지퍼백이 있어서, 지갑 같은 것을 넣어 둘 수 있다.

뒷쪽에는 전화기 2대를 꼽을 수 있고, 볼펜 2개를 꼽을 수 있다. 그리고 그 앞쪽으로 다른 것들을 수납할 공간이 있다. 나는 Egg 를 넣어놓는다.

안쪽에는 한쪽면은 아이패드 다른 한쪽면에는 두군데로 갈라져 있는데, 보통은 케이블이나 보조배터리를 넣어 둔다. 그리고 가운데 공간에 수첩을 넣어둔다.

첨에는 원하는 모든 것을 갖춘 가방이라 너무 기뻤는데, 쓰다보니 느끼는 점이 패딩이 너무 두껍다는 점이다. 아이패드 하나 보호하려고 이렇게까지 할 필요가 있을 정도로 두껍다. 만만치 않은 두께의 가방이지만, 아이패드 하나만 넣으면 빵빵해 진다. 수첩도 하나 넣기가 힘들 정도다. 나같이 아이패드 수첩 지갑 이렇게 3개만 넣으면 둥그런 모양이 될 정도다. 가운데 패딩은 빼고 모서리부분만 적당히 했으면 공간도 확보하고 안전성도 확보하지 않을까 하는 아쉬움이 든다.

아마 곧 해결한 제품이 나오지 않을까 기대한다.
이로써, 아이패드 주변기기 지름을 마친다.

Ruby 에서 plist 를 이용한 plist 파일 변환

Ruby 에서 plist gem 을 이용해서, iPhoto 에서 쓰이는 plist 파일을 가져와서 뿌려봤다.
대략, 6M 정도 크기의 plist 읽어서 뿌리는데, 53초 걸린다. 거의 50초동안 읽어서 내부구조로 바뀌는 데 쓰이고, 출력하는데 3초 정도 걸린다. 배치에서 쓸 경우, 그래도 대략 참을 수 있는 정도?

require 'rubygems'
require 'plist'
require 'yaml'
result = Plist::parse_xml('AlbumData.xml')
puts result.to_yaml

아래 코드를 이용해서 iPhoto 에 바로 연결을 해서, 뿌려보니, 1분35초가 걸린다. 하지만, 위 코드와 다른 점은 바로 시작한다는 점.

require 'rubygems'
require 'time'
require 'osx/cocoa'
include OSX
OSX.require_framework 'ScriptingBridge'
iPhoto = SBApplication.applicationWithBundleIdentifier_("com.apple.iPhoto")
puts iPhoto.photos.count
iPhoto.photos.each do |photo|
puts photo.name
puts photo.date.timeIntervalSince1970.to_i
end

ruby gems

gem install package

로 인스톨 한 다음, rb 파일 내에서 require 로 불러도 찾을 수 없다고 나온다. 이 때에는 반드시,

require 'rubygems'
require 'package'

식으로 해 줘야 한다. Gem 도 별도로 path 를 관리하고 있기 때문이란다.