최신 Xcode에서 구형 iPod Touch를 이용하여 디바이스 디버깅하기
서론
iOS의 개발자에게 Xcode는 마법과 같은 개발 도구가 아닌가 생각이 든다. 지금 아이폰과 안드로이드를 동시에 개발하는데 안드로이드를 개발할 때 운영체제나 SDK가 아니라 Xcode와 같은 툴이 안드로이드를 지원해주지 않는다는 것이 가장 많이 아쉬웠다. Xcode는 빠르고 편리하고 아름답기까지 하기 때문에 개발자에게 개발을 즐겁게 해주는 멋진 개발툴이라는 것은 모두다 아는 사실이다. 이런 Xcode를 잠시 실망할뻔한 적이다. Mac OS X snow leopard에서 Mac OS X Lion으로 업데이트하고 App Store에서 배포하는 Xcode 4.2를 설치하고 나서 구형 iPod touch로 디바이스 디버깅을 할 수 없게 된 것이다. 애플은 새로운 상품이 나와도 이전의 상품을 무시하거나 구형으로 만들지 않는 철학이 있다. 지금까지도 iPhone 3gs의 업데이트를 계속 진행하고 있는것도 그 전략중에 하나이다. 하지만 iPod touch 2세대는 물리적한계 때문에 iOS 4.2에서 업데이트가 멈추어진 상태이다. 문제는 이 기계가 더이상 개발용 디바이스로 사용할수 없다는 것이 충격적인 문제였다. 왜냐하면 비록 구형 디바이스지만 iOS 4.2라는 iOS 4.x 버전대의 운영체제가 동작하고 있고 아직 iOS의 모든 운영체제 통계치를 보면 iOS 4.x 를 사용하는 사용자가 많기 때문이다. 그래서 iOS 개발을 할때 최소 target 버전을 항상 iOS 4.0버전을 타겟으로 두고 개발을 해왔다. 구형 iPod touch를 가지고 이러한 문제를 고민하는 사람들이 없을까 자료를 찾아보는 가운데 http://useyourloaf.com/blog/2012/1/10/xcode-42-building-for-ios-31x-and-older-devices.html 블로그에서 동일한 문제를 가지고 고민했고 해결한 글을 찾을 수 있었다. 하지만 이 포스팅대로 하니까 Xcode에서 디버깅을 할 수 있게 iPod touch를 인식하고 빌드할수 있게 되었으나 문제는 Build & Run을 하였을때 디바이쪽에 앱이 설치가 되지 않는 것이였다. Xcode에서 에러나 발생하지 않고 정상적으로 빌드되고 인스톨이 되었다고 나오는데 실제 디바이스에 앱은 설치가 되지 않고 디바이스의 console 로그를 살펴보면 handle_connection: Could not receive USB message #6 from MDCrashReportTool. 가 출력된다. 이 참조 블로그를 통해서 구형 iPod touch를 디바이스 디버깅을 사용하기 위해서 어떻게 했으면 이 문제를 어떻게 해결했는지를 포스팅하려고 한다.
Continue ReadingRabbitMQ를 이용하여 비동기 데이터처리 시스템 구축하기
서론
RabbitMQ는 간단하게 말하면 표준 AMQP (Advanced Message Queueing Protocol) 메세지 브로커 소프트웨어(message broker software) 오픈소스이다. RabbitMQ는 erlang언어로 만들어졌을 뿐만 아니라, clustering과 failover를 위한 OTP framework로 서버가 만들어져 있다. RabbitMQ는 VMware에서 지원해주고 있는데 spring source 프로젝트중에 spring AMQP가 정식으로 1.0으로 릴리즈되면서 RabbitMQ의 지원은 더 적극적인것 같다. RabbitMQ는 다양한 언어로된 RabbitMQ client를 지원하고 있고 공식적인 온라인 문서에서는 Python과 Java에 대한 소스코드를 예제로 공개하고 있다.
RabbitMQ를 이해하기 위해서는 우선 MQ(Message Queuing)에 대한 이해가 필요하다. 프로그래밍에서 MQ는 프로세스 또는 프로그램 인스턴스가 데이터를 서로 교환할때 사용하는 방법이다. 이때 데이터를 교환할때 시스템이 관리하는 메세지 큐를 이용하는 것이 특징이다. 이렇게 서로 다른 프로세스나 프로그램 사이에 메시지를 교환할때 AMQP(Advanced Message Queueing Protocol)을 이용한다. AMQP는 메세지 지향 미들웨어를 위한 open standard application layer protocol 이다. AMQP를 이용하면 다른 벤더 사이에 메세지를 전송하는 것이 가능한데 JMS (Java Message Service)가 API를 제공하는것과 달리 AMQP는 wire-protocol을 제공하는데 이는 octet stream을 이용해서 다른 네트워크 사이에 데이터를 전송할 수 있는 포멧인데 이를 사용한다. 이러한 복잡한 설명과 달리 RabbitMQ 튜토리얼에서는 RabbitMQ를 매우 간단하게 편지를 작성하여 받는 사람에게 보낼 우체통, 우체국, 우편배달부가 있듯, post box, post office and postman라고 비유적으로 설명하고 있다. 단지 다른것은 데이터의 바이너리 blobs을 accept, store, forward 시키는 것만 다른것이라 말한다.
RabbitMQ와 같은 Message Queueing은 대용량 데이터를 처리하기 위한 배치 작업이나, 체팅 서비스, 비동기 데이터를 처리할때 사용한다. RabbitMQ를 찾아보게 된 계기도 비동기식 데이터 처리를 하기 위해서 찾아보게 되었다. 프로세스단위로 처리하는 웹 요청이나 일반적인 프로그램을 만들어서 사용하는데 사용자가 많아지거나 데이터가 많아지면 요청에 대한 응답을 기다리는 수가 증가하다가 나중에는 대기 시간이 지연되어서 서비스가 정상적으로 되지 못하는 상황이 오기 때문에 기존에 분산되어 있던 데이터 처리를 한곳으로 집중하면서 메세지 브로커를 두어서 필요한 프로그램에 작업을 분산 시키는 방법을 하고 싶었기 때문이다. ActiveMQ와 RabbitMQ를 후보에 두었는데 RabbitMQ가 먼저 리뷰하게 되었다.
Continue ReadingAndroid에서 style.xml을 이용하여 반복적인 xml 줄이기
서론
아이폰 개발을 먼저 시작하고 나서 안드로이드 폰 개발을 하는 개발자라면 화면을 출력시키기 위해서 손수 XML 코딩을 하는 eclipse와 달리 Xcode가 얼마나 훌륭한 개발 툴이라는 느낄 것이다. 물론 아드로이드 개발에 공식적으로 지운하고 있는 eclipse 역시 매우 훌륭한 IDE이다. IDE는 재품의 개발과 유지 보수에 매우 큰 영향을 끼친다. 아직도 터미널에서 Java를 작성하는 개발자가 있거든 지금 바로 eclipse나 IntelliJ를 사용하시라. 그러면 지금 개발하는 코드의 몇배는 많이 개발하고 유지보수 할 수 있을 것이라고 말해주고 싶다.
XML 자체로 Java 코드와 UI 코드를 분리한다는 메타 프로그래밍 기법은 매우 훌륭한 방법이다. 처음 안드로이드를 개발할 때 main.xml을 열어서 Layout을 정의하는데 엄청난 수고가 들어간다. Xcode에서 XIB를 만들때의 장점은 GUI로 UI를 만들 수 있다는 것이다. (물론 iOS 개발을 할때 XIB 없이 개발하기도 한다.). Xcode의 XIB도 터미널에서 파일을 열어보면 XML로 되어 있다는 사실을 알 수 있다. 뿐만 아니라 AIR 프로그램을 개발할때도 이젠 이러한 메타 프로그램인은 아주 효과적으로 프로그램을 할 수 있는 방법으로 사용되고 있다.
Continue ReadingAndroid Draw 9-patch 이미지 스트래칭으로 크기가 다른 버튼튼 만들기
서론
프로그램으로 이미지를 다루다 보면 하나의 이미지를 다르게 표현 하는 방법이 필요할 때가 있다. css로 배경이미지를 만들때는 repeat라는 기능을 이용해서 같은 패턴의 이미지를 x나 y로 반복시켜 이미지를 늘렸다 줄였다할 수 있지만 아이폰 개발할때나 안드로이드 개발할 때 Button이라는 것 객체가 가지는 속성을 가지고 만들어야하기 때문에 다른 방법이 필요하다. 기존에는 프로그램을 작성하다가 이미지가 필요하면 디자이너에게 이미지를 요청할 것이다. 아마도 이미지 패턴은 같은데 이미지 크기가 다를때마다 매번 다른 이미지를 디자이너에게 만들어 달라고 해야한다. 하지만 이것은 어떤 관점으로 보면 같은 일을 반복하는 관점으로 보일 수도 있다. 엔지니어적 관점으로 이러한 반복된 작업은 당연 다른 대처 방법이 있을거라 생각할 수 있다.
우선 아이폰에서는 이러한 문제점을 해결하기 위해서 iOS5 부터는 UIImage 객체의 resizableImgeWithCapInsets:UIEdgeInsetMake:
메소를 이용해서 이미지를 pragmatic하게 스트래칭할 수가 있다. 이에 대한 예제는 이전 포스트인 iOS5에서 UINavigationBar에 배경이미지와 타이틀 색깔 변경하기에서 이 메소드에 사용하는 방법을 설명한적 있다. 아이폰을 먼저 개발하고 같은 앱을 안드로이드용으로 개발하다보니 아이폰의 기능을 안드로이드에서 구현할 수 있는 방법에 대해서 찾는일이 많아 졌다. 그래서 아이폰의 이러한 기능을 안드로이드에서 어떻게 구현하고 있는지 찾아보는 가운데 @krazyeom 님께서 나인페치에 대해서 힌트를 주셨고, 다시 안드로이드 문서와 구글링으로 Android Draw 9-path에 대한 자료를 찾게 되었다. (안드로이드의 9-path가 먼저 구현되었고 아이폰 5에서 이 기능을 지원하였다는 이야기도 해주었다. 사용하는 사람마다 차이가 있겠지만 개인적으로 아이폰의 이미지 스트래칭 방법이 좀더 pragmatic하게 처리할 수 있어서 더 편리한것 같다.)
Android 사용자정의 버튼 만들기
서론
안드로이드는 layout에 대헌 정의를 XML로 분리했고 이로인해 훌륭한 메타프로그램을 사용할 수 있게 되었다. 하지만 안드로이드 UI 정의는 아이폰의 xib 만큼 훌륭하지는 못한게 사실이다. Xcode의 IBOutlet과 IBAction을 정의하는 것과 같은 방법이 안드로이드 개발에 도입되길 간절히 바래본다. 하지만 안드로이드의 메타 프로그래밍도 매우 우연하고 훌륭하다. 또한 리소스 접근을 고유한 아이디로 접근할 수 있게 추상화 시킨것도 매우 훌륭하다. 마치 HTML에서 element에 id값을 부여하고 document.getElementById로 그 고유한 element에 접근하는 방법과 매우 유사하다. findByViewId 로 뷰에 접근할 수 있는 기능이 그러한 예이다.
아이폰과 안드로이드폰 두 디바이스를 동시에 개발하고 있으면서 항상 느끼는건데 안드로이드의 UI는 너무 안이쁘다는 것이다. 그렇지만 다행이도 이러한 안드로이드의 장점은 모든 리소스를 사용자가 변경할 수 있다는 것이다. 그것도 XML을 통해 UI코드를 소스 코드에서 분리해 낼 수 있다. 이는 아이폰 개발에서 아쉬운 부분을 해결해준다. UIViewController나 UIView안에 로직과 CGRectMake나 CGRectSize를 정의하는 코드를 많이 볼수 있는데 안드로이드에서는 .java 코드에서 이러한 UI 핸들링하는 코드를 분리할 수 있기 때문이다. 그렇다고 Activity 클래스에서 programtic하게 UI를 구현할수 있다는 것은 변함이 없다.
Continue Reading