GameCenter Matchmaking 을 위한 Checklist

@required

1. 현재 user 인증
2. MatchMaking User Interface
3. Handle invitation from other user

@optional
1. Programmatcially Match find 코드 삽입
2. Advanced Match Making 코드 삽입 

 
UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point);
UIKIT_EXTERN NSString *NSStringFromCGSize(CGSize size);
UIKIT_EXTERN NSString *NSStringFromCGRect(CGRect rect);
UIKIT_EXTERN NSString *NSStringFromCGAffineTransform(CGAffineTransform transform);
UIKIT_EXTERN NSString *NSStringFromUIEdgeInsets(UIEdgeInsets insets);
UIKIT_EXTERN NSString *NSStringFromUIOffset(UIOffset offset);

NSStringFromCGRect를 아십니까? 

NSLog로 CGPoint, CGRect를 찍어봐야 할일이 은근 많은데 보통 보면 아래와 같은 코드를 사용합니다.


 
    NSLog(@"%f,%f,%f,%f,",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);

하지만 NSStringFromCGRect를 활용하면 %@ 한방에 찍을 수가 있습니다.
나온 결과는 아래와 같습니다.

2011-11-24 15:29:40.397 App[9981:f803] -[AppView layoutSubviews],33th - currenctRect = {{14, 20}, {768, 1024}}




XML을 파싱할 일이 생겨서,  이래저래 만져보다가 작업한 내용을 정리 합니다 :)

1. XML Parsing

Android 에서 제공하는 XmlResourceParser 를 사용하기로 했습니다.

XMLResourceParser는 다른 Java XML Parser들에 비해 성능이 좋은게 특징입니다.
이유인 즉은, 다른 Android XML 파일들 처럼, pre compiled 해서 birnary에 들어 가서 처리 하기 때문입니다.
아래는 간단하게 XML 을 읽어 들이는 코드 입니다. 
public Problem parseXML(XmlResourceParser xmlParser)
			throws Exception {

		Problem problem = new Problem();
		String name = null;

		while (xmlParser.getEventType() != XmlPullParser.END_DOCUMENT) {

			if (xmlParser.getEventType() == XmlPullParser.START_TAG) {
				name = xmlParser.getName();
			} else if (xmlParser.getEventType() == XmlPullParser.TEXT) {
				if (name == null) {
					Log.d("ProblemDAO-parseXML", "name is null ? error ??");

				}
			} else if (xmlParser.getEventType() == XmlPullParser.END_TAG) {
				name = null;
			}
			xmlParser.next();
		}

		return problem;
	}

2. XML to Pojo



a. 첫 번째 시도 - if 지옥

자 읽어 들인 XML을 Java Plaiin Object 로 매핑할 차리 인데요.

제일 처음 작업한게 아래와 같은 코드 입니다.
if(name.equalsIgnoreCase("title") == true) {
}
위와 같은 코드의 문제점은 if/elseif/elseif 지옥이 나타난다는것이죠. :(
그리고,  xml 형식등의 변경이 있을때, pojo/xml 이외에 추가로 관리할 곳이 늘어 난다는 점입니다.

b. 두 번째 시도 - Reflection

그래서 생각해낸것이 Java의 Reflection 입니다.

xml element 이름을 pojo 의 setter와 연결시키도록 아래와 같이 코드를 작성하였습니다..

               char[] stringArray = name.toCharArray();
		stringArray[0] = Character.toUpperCase(stringArray[0]);
		String methodName = "set"+ new String(stringArray);	
                try {
			Method m = Problem.class.getMethod(methodName, String.class);
			m.invoke(problem, text);
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
				Method m = Problem.class.getMethod(methodName,Integer.class);
				m.invoke(problem,Integer.valueOf(text));
		}

조금 신경 쓴부분이 바로 Setter의 자료형 부분입니다.
m.invoke 가 없는 메소드 인 경우에, NoSouchMethodException을 발생시키기 때문에 이를 캐치하여,
다른 형으로 시도 해보도록 코드를 작성하였습니다.

3. 더 해볼것

추후에, JacksonMapper 등에서 어떻게 json 을 pojo화 시키는지 좀 스터디해보고 좀 더  좋은 방법이 있나 생각해봐야겠습니다 :)

facebook sdk 의 github 소개페이지


최근에 github 에 프로젝트를 하나 올렸는데,
제 프로젝트는 소개페이지가 허접한 TXT 파일인데, facebook 의 이렇게 wiki 처럼 포맷팅이된 것임을 확인했습니다 ;ㅂ;

이게 뭐야 하고 찾아보니, markdown 이라는 문법을 github에서 지원하는것이더군요.

마크다운 문법 페이지 링크

 그런데, 이건 로컬에서 작성하고, 서버에 올려서 계속 확인하자니, 여간 귀찮은게 아니더군요 ;ㅂ;

그래서 로컬에서 사용할 수 있는 Reader를 찾아보니, 역시나 있습니다 ^
Readown , MarkdownLive 라는 프로젝트가 있었고, 결론적으로 MarkdownLive를 계속 사용하기로 하여,
MarkdownLive를 소개합니다.

프로젝트 페이지 바로 가기 (https://github.com/rentzsch/markdownlive) 

 
위와 같이, 우측에 Preview, 좌측에 원본 파일이 나타나서, 에디팅하기 쉽게 되어 있습니다 ^^

github 를 사용하는 개발자라면, must have item 이 아닌가 생각합니다 :) 




제가 최근에 진행한 프로젝트에 작성한 소스코드중 재사용할 만한것들을 골라서, github에 올려보려고 합니다.

이걸 해보는 이유

1. git에 대한 사용법 공부
2. 제대로된 Open Source Project 운영에 대한 첫걸음

SimpleImagePickerhttps://github.com/Geekboard/SimpleImagePicker )

오늘 공개할 Project는 Simple ImagePicker 입니다.

UIImagePickerController를 사용할때, 카메라가 없는 장비(iPad1, and old iPod Touches) 를 서포트 하기 위해서,
SourceType을 체크해주어야합니다.

SourceType을 사용하는곳마다 해야하니, 여간 귀찮은게 아니더군요 ;ㅂ;
그래서 만들게 되었고 이렇게 공유합니다 ^^
 


Simulator에서도 스크린샷을 저장할 수 있는지 아셨나요? ;ㅂ;

단축키로도 쉽게 저장하 실수 있습니다.



iOS5 에서, UIPickerView가 UITableViewDateSource Protocol을 Adopting 한다는것외에 
따로 문서화로 달라진것은 없습니다.  

그런데, frame.size.width값을 이제 받아 들이게 되었습니다.
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 160, 100)];
    [pickerView setDataSource:self];
    [pickerView setDelegate:self];
    
    [self.view addSubview:pickerView];
    [pickerView release];

위의 코드는 pickerView의 width를 160으로 설정한 예입니다.
iOS4를 비롯한 모든 예전 버전에는 width 값은 무시되고 항상 320으로 설정되었습니다.

iOS 4.3 Simulator

 
그런데, 같은 코드를 iOS5 에서 실행 시키면.

iOS5 Simlurator

 
 위와 같이 width 속성이 먹는것을 알 수 있습니다.

어차피 적용안되는거,, height 값만 신경쓰고, width는 대강 작성했던 코드가 문제를 일으켰습니다. ;ㅂ;
여튼 width가 적용이 안되서 좀 답답한것도 있었는데, 이제 되는군요 :)

내년쯤.. iOS4를 더이상 Follow-up 하지 않을 정도 되면 사용해볼수 있겠군요 :)

 

해당 Tutorial 은 OSX Lion  기준으로 작성되었습니다.
OSX Snow Leopard 나 Linux도 별반 다르진 않을것 같습니다 :) 



1. Python SDK for Google App Engine 다운로드

http://code.google.com/p/googleappengine/downloads/detail?name=google_appengine_1.5.5.zip&can=2&q=

* 타 OS 를 사용하는 경우 Python 설치가 필요합니다. ( 생략 )

2. Django Sample for google app engine Download

 
http://code.google.com/p/google-app-engine-samples/downloads/detail?name=django_example_20080409.tar.gz


* 환경 변수 설정.
sdk 에 있는 것들을 사용하여, app upload 등을 하기 때문에, 환경 변수를 세팅하여 편리하게 사용합니다.

 12 PATH=$PATH:/Users/taehoonkoo/workspaces/work_django/env/google_appengine                                                                                                                                                       

 
3. Development 모드로 실행하기. - Local 환경에서의 실행


dev_appserver.py 가 Python 2.7을 지원하지 않아,
OSX Lion ( Default 2.7 ) 에서는 실행 할수가 없습니다 ;ㅂ;
 

4. Sample 을 Server에 Update 하기.

a. app.yaml 파일 수정

  1 application: geekbaordtest

  2 version: 1

  3 runtime: python

  4 api_version: 1

 
application : 에 등록한 ${appid}를 등록해줍니다.

b. App Update 하기.

$> appckfg.py update ./


최초 실행시, 인증 정보를 요구 합니다.  

 
인증이 완료 되면, 서버로 전송하게 됩니다.


서버로의 전송이 완료 되면 ${applicatoin-id}.appspot.com 으로 접속 할수 있습니다.

5. 서버로의 접속 & Not AllowedError


Sample을 실행하게 되면 위와 같은 에러가 발생합니다 ;ㅂ;

위의 문제는, webapp과 domain 연결이 되어 있지 않아서 발생하는 문제 입니다.

관련 mail thread http://groups.google.com/group/areciboapp/browse_thread/thread/7d5859a06ae2e0ce?pli=1

 
Google Apps 도메인 연결은 좀 귀찮기도 해서, 우선 해당 에러를 발생하는 녀석만 제거하고, 
실행시켜보도록 하겠습니다.


 
views.py의 64,65 라인이 해당 로그인 관련 url 생성 코드이면, Error를 발생시키는 파트임으로,
주석 처리 합니다.

그리고 다시 update 후에 실행하면!

 
위와 같이 정상적으로 페이지가 나옴을 볼수 있습니다.

 


1. @RequestMapping 에 java.util.Date 받기.

http://linkedjava.blogspot.com/2011/06/spring-controller-with-date-object.html

2. JacksonMappper 에서 java.util.Date Serialize 하기

http://linkedjava.blogspot.com/2011/06/spring-controller-with-date-object.html
 
		
Query query = getManager().newQuery(Notice.class);
query.setOrdering("key desc");

javax.jdo.Query object 에서 setOrdering method 를 통해서 가능하다.
		
query.setOrdering("key desc, name desc");

위와 같이 하면, ordering rule 을 복수로 설정할 수 있다. 

+ Recent posts