RSS

월간 보관물: 3월 2011

GAE에서 db키를 못 찾을 때 처리 방법

Google AppEngine으로 뭘 하나 만들고 있다.
db.get(aKeyString) 이런 식으로 가져와서 키를 가지고 해당 row를 가져올 수 있는데, 문제는 invalid 키가 왔을 때 어떻게 처리해줘야할지 헤매고 있다가 검색으로 답을 찾았다. http://www.paulcarvill.com/2010/06/how-to-handle-a-python-badkeyerror-exception-in-google-appengine/ 에서 알려준 방법은 다음과 같다.

articles = Article.all()

try:
	issue = db.get(self.request.get("issue_id"))
	if (issue):
		articles.filter("issue =", issue)
	
except db.BadKeyError:
	result = {}
	result["func"] = "getArticle"
	result["result"] = False
	result["errorMsg"] = "invalid issue id"
	self.response.out.write(json.dumps(result))
	return
 
댓글 남기기

게시자: 켬 2011년 3월 29일 in AppEngine

 

아이폰 앱스을 웹을 통하여 배포하는 방법

1. 개요

iOS 4.0부터 웹에 올려져 있는 ipa(iPhone Archive) 파일을 모바일 사파리에서 접근하여 다운로드 및 설치가 가능해졌다. 본 문서는 Build and Archive한 배포본을 share하는 방법을 설명하기 위하여 제작되었다.

2. 프로세스

  • Build and Archive : 빌드해서 아카이브로 저장하기
  • Share: ipa에 signing해서 배포하기
  • Copy ipa and plist to web repository: 만든 ipa와 manifest파일을 웹에 올리기
  • Generate anchor tag: 링크 만들기

2-1. Build and Archive

Xcode에서 타겟을 Device로 놓고 in house 빌드를 위한 인증서를 연결한 다음 Build > Build and Archive를 선택한다. 이 메뉴가 활성화 되려면 Simulator가 아닌 Device로 세팅되어 있어야 한다.

빌드가 끝나도 아무런 변화가 없을 것이다. Window > Organizer 메뉴에 들어가 보면 다음과 같은 변화가 생긴 것을 확인 할 수 있다.

만들어진 빌드에 이름과 코멘트를 작성해서 훗날 다시 봤을 때 어떤 배포본이었는지 확인하기 쉽게 한다.

자 이제 Share… 버튼을 눌러서, 이 배포본을 공유해보자.

2-2. Share

Share… 버튼을 누르면 다음과 같은 팝업 윈도우가 뜬다. 여기서 Identity는 기존에 선택된 것을 그대로 두거나 상황에 맞게 선택한다.

우리는 전사에 웹을 통해 공유할 계획이므로 Distribute for Enterprise… 버튼을 누른다.

URL은 ipa파일이 최종적으로 위치하게 될 URL를 말한다. Title은 다운받을 때에 표시되는 이름을 정하기 위한 필드이다. 나머지는 선택사항이므로 빈공간으로 남겨둬도 무방하다.

OK를 누르고 생성될 파일명을 설정한 다음 Save한다.

그러면 *.ipa과 *.plist 두 개의 파일이 생성되는 것을 볼 수 있다.

다음은 이 파일을 웹의 저장 공간으로 복사하는 작업이 기다리고 있다.

2-3. Copy ipa and plist to web repository

파일을 웹이 접근가능한 곳으로 옮기는 방법은 수백만가지가 되겠지만 어떤 방법을 쓰던 상관없이 특정 폴더로 이동시키면 된다.

현재 CI서버는 Hudson을 사용하고 있으며, 빌드 결과에 대해서 userContent라는 폴더를 통해서 웹 접근을 허용해준다.  따라서, ci서버의 ~/.hudson/userContent/ 아래에 필요에 따라서 폴더를 추가하여 작업하면 되겠다.

예) ~/.hudson/userContent/BLAHBLAH/ 아래에 BLAHBLAH.ipa과BLAHBLAH.plist를 복사한다.

2-4. Generate Anchor tag

index.html 같은 링크를 담을 파일을 만들어서 아래와 같이 링크를 만든다.

<a href=”itms-services://?action=download-manifest&url=http://BLAHBLAH.COM:8080/userContent/BLAHBLAH/BLAHBLAH.plist”>BLAHBLAH</a>

3. 결론

이제 해당 URL를 공유하여 회사내에서 공유할 수 있게 되었다. CI서버에 빌드와 통합하면, 매번 빌드가 수행될 때마다 적절한 경로에서 최신의 배포본을 공유할 수 있다는 점에서 Best Practice가 될 수 있을 것이다.

 
 

태그: , ,

아이폰 앱스, 어떻게 테스트 할까?

아이폰 앱스 개발에서도 퀄리티 관리는 당연히 중요하지요.

유저들이 느끼는 기능적 혹은 비기능적인 요구사항을 충실히 반영하며 개발하는 것이 개발에서 가장 중요한 목적일 거에요. 당연한 이야기겠지만, 일반적인 테스팅 원칙이 아이폰 앱스를 만들때도 동일하게 적용 가능합니다. 여러 종류의 테스트가 존재하겠지만, 개발자의 관점에서 높은 품질을 위해서, 눈여겨 볼 만한 테스트는 다음을 꼽아볼 수 있겠네요.

  • 정적분석 – XCode에 포함되어 있는 Build and Analyze 기능을 이용하여 코드내의 잠재된 결함을 찾아낼 수 있습니다. 이 결과를 좀 더 멋지게 뽑아내고 싶다면, CLang기반의 정적분석툴인 Checker를 사용해보길 권하고 싶어요.
  • 유닛테스트 – 기능명세에서 테스트케이스를 뽑아내고 이것을 바탕으로 각 클래스가 기능명세와 같이 동작하는지 알아낼 수 있도록 테스트 코드를 작성하지요. 그리고 유닛테스트를 수행하는 시점에 각 테스트 코드을 실행한 뒤에 테스트를 통과하지 못한 코드에 대해서 수정하고 다시 테스트하는 행위를 반복하면서 결함을 줄일 수 있게됩니다. 구글의 google-toolbox-for-mac 프로젝트 결과물을 이용하면 유닛테스트를 수행할 뿐만 아니라 그 커버리지(전체 테스트 케이스 중에 얼마나 테스트케이스를 작성하였는가?)를 파악할 수도 있습니다.
  • UI테스트 – UI를 실제로 사람이 사용하듯이 시나리오를 기반으로 테스트해볼 수 있다는 점에서 가장 인간중심적인 테스트 영역이지요.  Xcode 자체의 UI Testing automation기능을 사용할 수도 있지만 일일이 javascript코딩을 해줘야하는 불편함이 존재합니다. 유저가 실재로 사용하면서 녹화해서 그것을 재생하는 방식(record & play) 형태를 기대한다면 Gorilla Logic사의 FoneMonkey for iPhone를 사용해보길 권합니다.

테스팅의 영역은 참으로 그 깊이가 깊고 오묘합니다. ‘테스트를 어떻게 해야할까?’에 답하기 위해서는 수많은 문제들을 경험하는 수 밖에 없습니다. 프로그래머는 자신의 코드를 더 견고하게 만들기 위해서라도 테스팅의 가치를 인정하고 자주, 일찍 테스트하는 게 좋은 프로그래머가 되는 지름길이라 생각합니다.

 
댓글 남기기

게시자: 켬 2011년 3월 5일 in iOS개발, 테스팅

 

태그: , , , , , , , , ,

UITableView에서 동적으로 Row나 Section추가하기

iOS 개발을 하면서 가장 많이 접하게 되는 UI를 꼽으라면 테이블뷰를 언급하는 개발자들을 많이 접했습니다. 테이블 뷰의 ‘유연함’과 ‘성능’에서 탁월하기 때문일테죠. 오늘도 테이블 뷰와 2시간 넘게 씨름해서 얻게 된 중요한 교훈을 나눠볼까 합니다.

오늘 고민했던 부분은 테이블 뷰의 섹션이 동적으로 추가되거나 삭제되어야 하는 케이스 때문인데요. 네트워크로 내려받은 데이터의 조건에 따라 0번째 섹션이 추가되거나 제거되어 하는 경우죠.

이 경우 고려해야 할 것이 몇 가지가 됩니다. 첫째, 테이블 뷰의 섹션의 개수가 내가 추가 또는 삭제한 이후의 섹션 개수와 일치해야 합니다. 둘째, 각 셀을 그려줄 때에도 추가된 섹션의 행(rows)에 어떤 cell이 그려줘야 하는 지 정의되어 있어야 합니다. 셋째, 셀/섹션을 추가하거나 삭제하는 멤버함수 위아래로 beginUpdates와 endUpdates를 걸어줘야 합니다.

- (IBAction) addCell {
	if (self.tableView.numberOfSections > 0) {
		NSMutableArray* innerList = [cellDataList objectAtIndex:0];
		[innerList insertObject:@"a new cell" atIndex:0];

		[self.tableView beginUpdates];
		[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]
							  withRowAnimation:UITableViewRowAnimationBottom];
		[self.tableView endUpdates];
	}
}

- (IBAction) addSection {
	if (self.tableView.numberOfSections > 0) {
		NSMutableArray* innerList = [NSMutableArray arrayWithCapacity:5];
		for (int i = 0; i < 5; i++) {
			[innerList addObject:@"a new section's cell"];
		}
		[cellDataList insertObject:innerList atIndex:0];
		[self.tableView beginUpdates];
		[self.tableView insertSections:[NSIndexSet indexSetWithIndex:0]
					  withRowAnimation:UITableViewRowAnimationBottom];
		[self.tableView endUpdates];
	}
}

예제 파일을 만들어 봤습니다. sample 다운로드

좌측 버튼을 누르면 첫째 섹션의 첫째 행에  row가 하나 추가 됩니다.  우측버튼은 첫째 섹션 앞에 섹션을 추가합니다.

에필로그 – 써놓고 보니 이걸 왜 2시간이나 삽질을 했나 싶군요. 별 내용이 없지만 혹자에겐 도움이 될까해서 남겨두기로 결정합니다. 😉

 
댓글 11개

게시자: 켬 2011년 3월 4일 in iOS개발

 

태그: , ,

iOS open source TouchCode 퀵리뷰

우리 회사에서 독특한 학습 및 공유 문화중에 ‘퀵리뷰’라는 게 있어요. 이것에 대해서는 다음에 더 이야기 하기로 하고, 팀내에 TouchCode라는 iOS용 라이브러리를 리뷰할 사람이 있냐고 해서 제가 손들어 퀵리뷰해봤습니다.

“iOS 용 오픈소스 툴셋 TouchCode JSON/XML/Notification/Metrics/RSS/UI/HTTPD/Logging/SQL 등 총 10개의 즉시 사용가능한 프로젝트 코드들”

위와같은 설명과 함께 왔길래 뭔가 대단한 것인가 해서 찾아봤더니 결론은 “별거 아니다”에 도달했어요.

엄밀히 말하자면 7개 기능에 대한 코드 꾸러미인데, 재사용하기는 쉽지 않을 정도로 수준이 낮았습니다.  three20의 설계가 들어 있는 것도 아니고 JSON Framework 처럼 사용하기 쉬운 것도 아닌 어설픈 상태였던 것이죠.

TouchCode의 현상태는 몇개의 프로젝트를 수행하면서 얻게된 코드들을 가공하지 않고 묶어놓은 상태라고 진단할 수 있겠습니다. 문서화는 거의 안되어 있고, 샘플코드도 없을 때가 많습니다. 이 프로젝트를 얼마나 가져가서 사용하는 지 의심스러울 정도입니다.

빛깔만 좋은 개살구에 지나지 않는 TouchCode지만, 계속해서 변화하는 코드이기에 Jonathan Wight가 어떻게 키워갈지는 지켜보고 싶습니다.

 

 

 

 
댓글 남기기

게시자: 켬 2011년 3월 2일 in iOS개발

 

태그: , , ,

소셜 플랫폼은 수렴될까? 발산할까?

소셜(social)이 亂離네요.

언제나 사회속의 인간이었죠. 그런데 최근 인터넷을 달구는 소셜 열풍의 震原地는 다름아닌 페이스북입니다. 하버드 대학 동창생들의 사교클럽의 온라인 버전이라고 볼 수 있는 페이스북은 전 세계 유명 대학들을 평정했을 뿐만 아니라 일반인들사이에서도 삶의 소소한 것까지 나누는 기반(플랫폼)이 되었네요. 비슷한 시기에 트위터 역시 새로운 미디어로 주목받으며 이전에는 경험해보지 못했던 새로운 형태의 커뮤니케이션을 만들어주는 플랫폼으로 자리잡고 있습니다.

한국에도 비슷한 게 있을까요? 물론 있습니다. 소셜의 원조격인 싸이월드, 초기 페이스북과 유사한 학교 중심의 네트워크 아이러브스쿨이 있었고 트위터랑 비슷한 형태의 미투데이가 있네요.

바야흐로 소셜 플랫폼의 춘추전국시대가 왔다고 해도 과언이 아닌게, 위치기반의 소셜서비스인 포스퀘어, 고왈라 등이 유세를 떨치기 시작했고, 발맞춰 한국에도 아임IN, 싸이월드 플래그같은 서비스들이 1등 자리를 놓고 각축을 벌이고 있어요.

자, 그러다면 이 춘추전국시기가 끝나면 통일왕국의 시대가 올까요? 아니면 각각의 영역을 구축하고 소비자들은 기호에 맞게 선택하는 형태로 가게 될까요? 여러분은 궁금하지 않습니까? 저는 무지 궁금해요.

저 개인적인 예측은 발산한다 쪽입니다. 소비자들은 어리석지 않다는 것이죠. 독과점을 그냥 보고 있지 않을 것이란 겁니다. 필요를 채워줄 수 있는 새로운 서비스가 나온다면 그것으로 쉽게 이동할 수 있다는 것을 우리는 싸이월드를 통해서 배웠지 않습니까? 페이스북 안에서 만나고, 결혼하고, 애낳고, 죽는 인생이 담길 것 같지만, 과연 그럴까요?

개발자 입장에서는 여러 플랫폼을 이해해야 살아남을 수 있다는 점에서 피곤한 노릇이긴 합니다만, 한 회사의 독점이 깨어지지 않는 철옹성이라면 그게 훨씬 더 피곤한 이야길 것입니다.

여러분의 생각은 어떤지요?

 
댓글 남기기

게시자: 켬 2011년 3월 1일 in 소셜네트워크

 

태그: ,