UIImagePickerController 를 사용해서, Image를 가져와야 하는 일이 생겼습니다.

iPhone내의 Photo Library 혹은 Camera를 통해서 Image를 가져와야 하는데, 문제는 iPod Touch등에선 Camera가 없다는 점입니다.

시뮬레이터-No Camera-에서 UIImagePickerController의 SourceType을 UIImagePickerControllerSourceCamera로 세팅하게 되면, App이 멈추는것을 미루어봤을때, 실제 Device에서도 마찬가지 일것입니다.

최초에 든 생각은 UIDevice Class내의 model property를 이용해서, Camera가 있는 Device와 없는 Device를 구분하는것이었습니다.

이 경우에는 또다른 종류의 Device ( iMat ?? :) ) 가 Apple사로 부터 발매 된다면 추가적인 작업을 해줘야 한다는게 걸립니다.

그래서 좀 찾아 보았는데, 역시나 있더군요 ㅎ

UIImavePickerController의 Class Methoad중 isSourceTypeAvailable이라는 Method가 있습니다.




위와 같이 코딩을 하면, App이 동작하는 Platform에서 Camera가 Support되는지 쉽게 알수가 있습니다.
간단한 일 하는 녀석치고, 코드길이가 길어져서 보기 불편한 단점이 있긴 하지만요. ㅎ

1. Target 생성

Application Test는 Logic Test와는 달리 실제로 실행을 하기때문에, Executable Target을 필요로 합니다.
아래와 같이 기존의 Executable Target을 Duplicate하여 원래 프로그램의 설정그대로 실행할수 있는 Target을 생성합니다.


이때, Target의 이름에 규칙이 있습니다. 그것은 '<application_name>' Testing 입니다.
prefix는 기호에 따라서 아무렇게 써도 상관이 없지만, suffix는 Testing이 되어야합니다.

2. iPhone Unit-test Bundle 생성

Logic Test와 마찬가지로, Unit-Test Bundle을 생성해주어야합니다.
단, Executable Target과 연동하는 부분이 Logic Test를 위한 bundle을 생성하는것과는 차이가 있습니다.

지난 포스팅을 참조하여, Unit-Test Bundle을 생성한후, 아래와 같이  <blah>Testing Target에 dependancy를 설정합니다.


그리고, MyAppTests를 build하면 나오는 MyAppTest.ocutest Binary를 <blah>Testing Executable Target의 Copy Bundle Resource로 등록해줍니다.

자 이제 Target & Bundle 생성 및 Dependay 설정이 완료 되었습니다.

3. TestCase 작성

LogicTest와 마찬가지로, Objective-C TestCase Class 파일을 생성합니다.
이때 Target Owrnership은 Executable Target이 아닌 Test Bundle이어야 합니다.


4. 실행

Application Test는 Device에서만 동작합니다.
Build Target을 Device 3.0 or Later로 설정을 한후 실행을 하면 Debugger Console 창에서 결과를 확인할수 있습니다.

기본적으로 AppDelegate 를 가져와서, AppDelegate Object가 nil 인지 아닌지 체크를 하는 테스트가 들어 있습니다.

실행 결과는 다음과 같습니다.


만약 Console창에 위와 같은 메세지가 나오지 않는다면, Target Dependancy 부분을 다시 한번 확인해보시기 바랍니다.


요새 개발하고 있는 Application이 SQLite를 사용하고 있습니다.
SQLite Interface Module을 OCUnit Test를 이용하여, TDD로 개발하였고, 1차 완료 하였습니다.
아직 익숙하지 않은 탓에 오히려 시간이 많이 걸리는것 같다는 느낌을 받고 있지만, 확실히
TestCase가 미리 작성된 탓에, API사용자 입장을 고려하여, Module을 Design 할 수 있어,
개발 초기 부터 단단한 프로그래밍이 가능해졌습니다.

다음에 Writing TestCase라는 주제를 끝으로 OCUnit 을 통한 Unit Test에 대한 글을 마치려고 합니다.




NSDate를 SQLite DB에 저장을 해야 할일이 생겼습니다.

어떻게 할까 고민을 좀 해봤습니다.

NSDateFormatter를 이용해서, String으로 변환시킨후 저장을 하고, 다시 Formatter를 이용해서 NSDate로 Parsing하는 방법이 있는데,
Raw Data가 아닌 변환된값을쓴다는점과, Parsing에 들아가는 Cost등을 고려할때 좋은 방법이 아닐듯 싶습니다.

그래서 생각을 해보았는데, NSTimeInterval을 이용하기로 하였습니다.

NSDate에는 NSTimerInterval을 구해주는 여러 메소드가 있습니다.



timeIntervalSince1970을 이용하면, 1970년 1월 1일 부터의 duration을 second 단위로 얻을수 있습니다.

이걸 SQLite에 저장해두고, 다시 불러다가 쓰면 깔끔하게 구현이 될것 같습니다.

NSTimeInterval은 실제론 double 을 typedef 해서 정의된 자료형이기때문에, SQLITE의 column type을 'REAL'로 정의해서 저장하도록합니다.

DB Schema는 정의되어 있다고 가정하고, 아래는 NSTimeInterval을 DB에 삽입하는 코드 입니다.



그럼 DB에서 가져오는 코드를 보도록 하겠습니다.



첨에는 좀 까다롭지 않을까 싶었는데, 뭐 딱히 어려운게 없습니다 ㅎ
그냥 스윽~하면 스윽~되는거죠 ㅎㅎ

필요하시면 아래 예제 소스를 참조 하시고, 좋은 어플들 많이 개발하세요 ^^


이글은 iPhone Development Guide from Apple 을 보고 작성되었습니다.
OCUnit에 대한 글은 3부작(Logic Test, Application Test, Test Cases)로 나누어 진행됩니다.
이글에 나오는 Screen shot은 XCode 3.2.2 에서 Capture되었습니다.

저는 프로젝트를 진행할때, Unit 테스트용 코드를 따로 작성하는 편인데,

이제까지는, Build Configuration을 추가하는 형식으로 모듈 테스트 코드를 작성하곤 합니다.


이런식으로 테스트할 Module을 나누어서 했는데, 꽤나 원시적인 방식이라, 소스코드가 지저분해지기도 하고,
뭔가 깔끔하지 못하다는 생각이 많이 들어서,
Target을 나누어, 필요한 Class만 넣어서 Unit Test를 진행하는게 깔끔할것이라는 생각이 문득 들었습니다,

그러다 문득, 아이폰 OS 3.0 이 나왔을때 OCUnit이라는 녀석이 공식적으로 추가 되었다는것을 상기했습니다..

새로 진행하게 된 Project도 있고 하니, 어디 한번 시도 해보는거 나쁘지 않겠죠? ^^

Xcode는 2가지 Type의 Unit Test를 지원합니다.

Logic Test. App상이 아니라 Build Phase에서 Test진행, 말그래도 소프트웨어 Logic ( or algorithm )을 테스트하기 위한 Unit Test

Application Test. App상에 설치되어 Test가 진행됨. iPhone에 있는 Reousrce들을 이용한 모듈에 대한 Test가 가능함.


프로젝트에 OCUnit을 추가하려면, 'SenTestingKit' Framework을 추가 해주어야 합니다.
이 Framework은 /Developer/Library/Framework에 있다. ( Xcode가 Default Path로 설치된 경우 )

곧 알겠지만, Test별로 unit-test-bundle target을 추가 하게 되는데, SenTestingKit Framework의 owrnership을 이들 target으로 변경해주어야 합니다.


그럼  Logic Test를 수행하기 위한 절차를 살펴 보면,

1. 타겟 생성 ( iPhone OS unit-test-bundle type )
2. 생성된 타겟을 active Target으로,
3. TestCase Class 추가.
5. TestCase 작성
6. Build ( = Test ) 

의 순서로 진행 됩니다.

1. 타겟 생성


Target Group에서 우클릭(or cmd + click)한 후 Add->New Target을 선택합니다.


그리고 Cocoa Touch(iPhone OS) -> Unit Test Bundle을 선택한후, 적당한 이름으로 지정하여 생성합니다.

2. 새로 생성한 Target을 Active Target으로 설정합니다.


3. TestCase Class를 추가합니다.



iPhone OS -> Cocoa Touch Class -> Object-C test case class 를 선택하여, File을 생성합니다.



여기서 주의 할점이, Target Owrnership이 Execute Targe이 아니라, 새로 추가한, Test-bundle target이어야 한다는 점입니다

4. TestCase 작성

자동으로 생성되는 코드를 살펴보면, App. Test,Logic Test에 관한 코드가 둘다 담겨져 있는데,
기본적으로 App Test용으로 Compile되게 되어 있으니, Logic Test용으로 바꿔주어야 합니다.

.h 파일에서
#define USE_APPLICATION_UNIT_TEST 1

으로 되어 있는 부분을 찾아서 1 -> 0 으로 바꿔 주면 Logic Test용 코드가 동작하게 됩니다.

.m 파일에서 testMath()라는 Method가 자동적으로 생성되어 있는데, 1+1 == 2 ? 라는 테스트가 되게 되어 있습니다.

일단 실패 하는 결과를 보는게 우선임으로, 1+1 == 2 를 1+1 == 3 으로 바꿔 봅시다.

5. Build (Test)

Active Target/ Target Owrner ship 등이 제대로 설정되어 있다면, Build(= Test)를 수행하면 아래와 같이 Error가 나타날것입니다.



혹시 Build Success 가 된다면, Active SDK 가 iPhone Simulator 3.0 or later 인지 확인하자. Logic Test는 Simulator일때만 동작합니다.


보신바와 같이, 그리 어렵지 않게 Logic Test를 추가 할수 있고, App 을 실행하지 않아도 되니, 빠르게 결과를 확인할 수 있습니다.

분명 Unit Test를 통한 Test자동화는 개발 프로세스에 효율을 가는데, 가끔 이런 도구에 너무 집착하여 개발 효율을 오히려 저해하는 경우도 꽤나 많습니다.

언제나 그렇듯 도구는 수단이 되어야지 목표가 되어서는 안된다고 생각합니다. ^^



회사를 다니지 않다 보니, 삽질을 한게 얼마만인가 싶네요 ㅎ

얼마전에 아이폰 알바를 했는데, 게임을 하고, 서버에 점수를 등록해서, 1,2,3등에게 경품을 주는 광고용 어플을 개발했습니다.

여기서 문제가 마이크로 사이트를 작업한 곳에서, 한글 Encoding이 잘안된다고 얘길했었는데,

그런곳도 못해 하면서, 우리가 보겠다고 했다.
 
근데 이게 왠걸, iPhone쪽 소스에 문제가 있었나보다.

AppStore의 바이너리를 갈아치우는게 가장 좋은 방법이겠지만, 그럴만한 시간이 없었다.

완전 대박 사고! -_ㅜ .

문제는 Cocoa FrameWork의 NSString Class String 'UTF8String'이라는 녀석을 사용해서 Encoding 했는데, 그게 제대로 안되는 모양이다.

사실 다른 Encoding Method를 사용하려 했는데, TestCode가 그대로 남아 있었던 모양이다 ( 테스트시에도 제대로 안됐음 ㅜ_ㅜ )

그래서 제대로된 UTF8이 나오지 않았기에, Javascript로 UTF8Decode를 아무리 해도 제대로 안나온다 -_ㅜ.

그래서 든 첫번쨰 생각은,

UTF8String Method를 분석해서, Javasciprt로 구현하는것이다.

다행히 GNUStep에 Core Foundation, Foundation Framework 소스가 있기에, 보았는데 완전 대박.
이거 옮기는 시간이 Binary를 새로 올리는것 보다 더 오래 걸릴 기세였다.

이것도, 옵션이 안되고, 그래서 Proxy를 둬서 새로 Encoding을 해서 넘겨 주는것으로 하였다.

OSX에 Web Server를 올리고 ( 정말 감사하게도, apache2가 기본 설치 되어 있다 -_ㅜ )

bash shell 을 cgi 로 사용해서, objc 프로그램을 실행시켜, Core Foundation을 통해서 잘못된 Decode를 풀고,
새로 Encode 하게 하는 script를 짜고,

ASP 상의 XMLHTTPRequest를 통해서, syncronous method로 변환하게 했다.

일단 동작은 하는데 겁나 찜찜하다 ㅜ_ㅜ.

우선 Review Path하면 Patch 해서 App Store에 다시 등록해야 할듯 -_ㅜ

아.. 오래간만에 shell script도 짜고, 간만의 삽질 ㅎㅎ

1. Access Policy File 설정하기.

httpd(혹은 apache2 , ..... ) 설정중에 svn설정이 들어 있는 .conf 파일을 열어서,

Access Policy File 부분을 추가 한다. ( 본인의 경우 apache2/mods-enabled/dav_svn.conf 였다. )


Policy File 경로를 설정해주고,  해당파일을 열어서 편집하도록 한다.

user 별, group 별로도 가능한데, 본인의 경우에는 그룹별로 지정하였다.

dav_svn.policy 파일의 내용은 아래와 같다.



svn path 별로 다른 설정을 주기위해서, 위와 같이 나누어 두었으나,

전체적으로 한번에 적용 하려면 [blah:/] -> [/] 으로 수정해주면 된다.


주소창과, 즐겨찾기에 로고를 표기하는 법 !



구글에 들어 가면 좌측에 나오는거 처럼 구글 로고가 뜨는데, 갑자기 궁금해져서 한번 찾아 봤습니다 ㅎ

우선, 표기될 icon 은 16x16 pixels이어야하면, Windows ico format으로 저장되어야 합니다.
2가지 방법을 통해서, icon을 표기 할수 있습니다.

방법 1.

http://${your_url}/favicon.ico에 저장하는 방법입니다.
http://www.google.com/favicon.ico 에 로고 이미지가 들어 가 있는걸 보아하니,
구글은 이 방법을 채택하고 있네요 ㅎㅎ

방법 2.

webpage에 아래 태그를 추가하는것입니다..
<LINK REL="SHORTCUT ICON" HREF="{icon_url}">

추가로, 방법2를 이용하면 페이지별 다른 아이콘을 링크하여,
페이지별로 다른 아이콘을 보여줄수도 있는데, 가능은하지만, 별로 보기 좋아 보일것 같진 않네요 ㅎㅎ

흐음.. 내 홈피에도 추가 하고 싶긴한데, 아이콘이 없군요 ㅋㅋㅋㅋㅋ


Diane Arbus가 사진에 발을 드려 놓게 되는 과정을 그린 영화.

'Fur'는 Diane Arbus에 관한 영화다. 내가 '디앤'에게 관심을 가지게 된건, 두번째로 읽고 있는 수잔손택의 책 덕분이다.

수잔 손택은 '아우구스트 잔더'와 '디앤 아버스'를 한데 묶어서, 그들의 사진에 대해서 이야기 하는데,
수잔 손택이 바라보는 그들의 사진은 최근 내가 지향하고 있는 사진과 꽤나 흡사하다.

디앤 아버스에 대한 나의 이미지는 수잔 손택이 거대한 지성으로 그들의 이미지에서 크게 벗어 나지 않는다.
디앤 아버스 라는 작가에 대해서 이야기 하고 있는 이 영화는 다른 사진가에 대한 어떤 다큐멘터리들 보다도 섬세하게 표현하고 있다.

사실 디앤에 대해 얘기하는것은 곧 이 영화에 대해서 이야기 하는것이지만, 조심스레 이야기 해보자면,
디앤은 결코 유명한 사람 혹은 유명한 것들을 자신의 피사체로 삼지 않았다.
디앤은 세상의 비주류들을 자신의 피사체로 삼았는데, 요새 사람들과 달리 관음적 정서에 의존하지도 않았다.
디앤의 피사체가 된 사람들은 모두 자신이 자신을 찍히고 있음을 인지하고 있으며, 우리가 흔히 볼수 있는 사진들과 달리 그들은 그속에서 당당했다.



스틸컷에서 보는거와 같이 '디앤'은 이렇게 항상 스트로보를 그리고 정면으로 붙혀서 사용하였다.
이 사실을 인지하고 디앤의 사진을 본다면, 한 걸음더 디앤의 사진에 대해서 다가 갈수 있을것이다.

니콜키드만의 연기력, 요새 한창 주가를 올리는 아이언맨의 진중한 연기, 이것들 또한 이 영화의 볼거리가 아닐까 ?
사진을 좋아하는 사람에게 꼭 추천하고 싶은 영화다.


iPad라는 녀석 떄문에, 세상이 꽤나 떠들썩합니다.

미국에서는 이미 Wifi모델이 출시되었고, 곧 3G모델이 출시합니다.

한국에서는 iPad가 아직 정식출시되지 않아서 구매대행이 성행하게 되었는데,

정부에서 구매대행은 불법 엄벌하겠다고 한것 까지 모자라, 무선기기를 인증없이 쓰는 사람들을 단속하겠다는 말까지 나돌고 있으니,

iPad라는 녀석이 세간의 관심을 확 끌어 당기고 있는 녀석임에는 분명한가 봅니다.


iPad라는 녀석의 첫 인상은 말보다 제가 좋아하는 유머로 대체 해볼까 합니다.


ㅎㅎ 그냥 커진 아이폰이잖아 ! 라는게 제 첫 인상이었습니다.

왠지 iPad 출시 발표가 있기전 아마도 아이폰 3GS가 발매가 확정된 이후로 기억합니다만,

애플 커뮤니티등에서 엄청나게 많은 iPad에 대한 루머가 발생했습니다.

저는 사실 iPad가 iPhone 처럼 철저한 기획을 통해 출시한 제품이라기보다 워낙에 루머도 많고, 스티브잡스가 테블렛 PC에 대한 꿈도 있고 해서 만들어진 제품이 아닐까 조심스레 추측합니다.


그럼 여전히 제 첫인상을 이어가고 있을까요? 만약 그렇다면 이런 글을 쓰는데 시간을 낭비하는 일따윈 없었을것입니다 ㅎ

크기가 큰 아이폰 혹은 아이팟 터치라는 생각에는 변함이 없습니다만, 크기가 커졌다는 것에 맹정이 있다고 생각합니다.



요새 이슈가 되고 있는 'Alice for iPad' 동영상을 한번 보시죠 ^^



이 녀석이 아이폰에 있다고 생각하면, 제대로 읽을수도 사용할수도 없었겠지만,

단순히 '크기가커진' 아이패드에 있기 떄문에 'Interactive' eBook이라는게 성립됩니다.

제가 아이패드의 강점으로 생각하는것중 하나가 바로 이 '인터랙티브' 입니다.

이런 'Interactive'를 통한 교육용 어플 시장이 진지하게 펼쳐 지지 않을까 생각합니다.


사실, 제가 iPad에 큰 관심을 갖게 된 계기는 전문성을 가진 어플들에 있습니다.

Photoshop for iPhone 을 생각해보도록 하죠

아이폰에서 하는 포토샵은 솔직히 말해 장난감입니다. 아무도 아이폰에 있는 포토샵으로 자신의 사진을 진지하게 리터칭하지 않습니다.

하지만 아이패드에 있다고 생각해볼까요 ?

사진을 불러드리는게 좀 짜증나게 되어 있어서 사용성은 떨어지겠지만, 사진 편집용도만 생각해본다면 꽤 쓸만할꺼라 생각됩니다.

드로잉 프로그램은 어떨까요? 아이폰용 드로잉 프로그램이 화가들의 아이디어 스케치 용도로 국한되었다면,

아이패드용 드로잉프로그램을 통해서 충분한 작품활동도 할수 있을것 같습니다.

특히나 만화작가들에게 유용할꺼라 생각합니다.


특화된 어플들이 아이폰에 있을때는 장난감같이 보였다면, 아이패드 속에 들어 감으로써 꽤 쓸만해졌다는거죠.

시장이라는것은 흘러가봐야 하는것이라 두고 봐야겠지만,

아이폰 앱스토어의 키워드가 '게임' 과 'SNS' 였다면, 아이패드에선 '특화된 어플'이라는 단어를 추가 하고 싶습니다.


내가 가본 한국의 대학교중 가장 멋진곳.

+ Recent posts