Ruby on Rails on Bash on Windows 10

Windows 10 의 Anniversary Update 를 통해서 Ubuntu subsystem 설치가 가능해 졌다. bash 가 설치되어, bash 에 진입하여 Ubuntu 처럼 사용이 가능해 졌다. 물론 여러가지 제약사항이 아직은 많이 있다고 전해 졌는데, 일단은 궁금해 진 것이 Ruby 설치가 가능할까? 그리고 Ruby on Rails 가 실행될까 였다.
Windows 10 에서 Unbutu 활성화는 어렵지 않게 가능하였다.
rbenv를 통해서 무리없이 ruby 설치가 가능하였다. rbenv 와 ruby-install 을 설치하기 위해서, git 및 gcc 관련 모든 패키지가 정상적으로 설치 되었다.
그리고, 마지막으로 rails 설치. 단 한가지 문제가 있긴 했다. file system watch 하는 부분에 호환성 문제로 관련 에러가 있었는데, 이것은 config/environments/development.rb 파일에 아래 부분을 주석 처리해서 해결 가능하였다.

#config.file_watcher = ActiveSupport::EventedFileUpdateChecker

그외에는 문제 없이 실행이 되었다.

이제 윈도우 계열의 노트북으로 RoR 개발이 수월해 진 것인가?

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천개 파일을 자동으로 올렸다는데 일단 만족한다.

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 를 관리하고 있기 때문이란다.

iso -> folder 는 의외로 간단했다

루비스트립트 작성

hdiutil mount isoname.iso

위 명령을 통해서 쉽게 마운트를 하고, 위 명령의 결과가 어느 폴더에 마운트 한지 보여주기 때문에, 내용을 복사해 오기가 쉬웠다. 그래서 쭉 돌렸는데…

hdiutil: attach failed - 마운트 가능한 파일 시스템 없음

이 상태로 죽어버렸다. 마운트 안되는 놈도 있었다.