이밤의 끝을 잡고… 지난 1주일 정리

오늘 랩 전체회식이 있었다. 특별한게 없다. 그냥 고기먹고 나왔다.
오늘 아침 차안 데시보드에는 영하 15도를 가리키더라.
오늘 밤 집에 오는길 차안 데시보드는 영하 8도를 가리키더라.
날씨가 많이 춥다라는 얘기..

그나저나 오늘 퇴근하면서 오랜만에 라디오를 틀었는데..
“이밤의 끝을 잡고.. 있는 나의 사랑이… 드이상 초라하지 않게…”
오랜만에 들으니까 너무 좋터라..
확실히 요즘 노래보다 옛날 노래가 더 좋은 것 같다.

—-
텍스트큐브 개발은 더이상 안하는건지..--;; 너무 더디다..
그리고 왜이렇게 느린지 모르겠다. 슬로우 쿼리도 몇개 검색되던데..
예전엔 안그랬는데.. 요즘 왜케 느리지? 쓴글이 많아서 그런가?
이 블로그를 아예 아카이빙 처리하고 블로그 새로 시작할까? –
-;;
맘 같아서는 굴뚝이다.

—-
올해를 마무리하면서 팀에서도 마니또…
그리고 다른 모임에서도 마니또를 했는데..
아니 글쎄.. 줄창 남자만 뽑네..-_-;;; 올핸 여복이 없는듯…
그래도 올해 크리스마스 이브와 크리스마스는 즐겁게 보냈다.
영화도 한편보고, 오리고기도 먹고, 와인도 한잔 곁들이고..
수다를 엄청 떨다 온느낌.. 금새 친해진거같다.. 😀

—-
반면 크리스마스 패치모임은 오픈 일정에 밀려서 파토나고,..
난 종일 게임을 하면서 릴뤡스…
난 게임에 빠지면 아주 뽕을 뽑는거 같다. 12시간 내내 했네.. ㅋㅋㅋ

—-
겨울이 싫다. 이 믿도 끝도 없는 허전함의 정체가 뭔지 몰랐는데… 방금 깨달았다.
아!,… 그렇쿠나.. 그러고보니 2011년 1월 추웠던 그 겨울때문인거 같다.  
이맘때가 되면 꼭 크리스마스 악몽처럼.. 허전하네.. ㅎㅎ  
잊을만하면 꼭 다시 춥다. 그날도 오늘처럼 엄청 추웠지 아마..
언젠가는 잊혀지겠지만,.. 어서 빨리 따듯한 겨울이여 오라!
겨울이 따듯하면 봄인가? ㅋ 여튼…

이밤의 끝은 여기까지만 잡자!

타이타늄 SDK3.0과 Alloy(beta)를 쓰면서 겪었던 문제들

타이타늄 3.0이 정식 릴리즈를 했고, 그동안 베타버전을 쓰면서 나타났던 문제들을 정리해본다.

1. 이유없이 에뮬레이터가 죽는 경우

Alloy를 사용하다보면 빌드하자마자 “Application has exited from Simulator” 라는 메시지를 던지면서 죽는 경우를 꼭 한번씩은 겪게 된다. 대표적인 경우가 console.log를 이용해 Alloy 모델이나 콜랙션을 그대로 출력할때 발생한다. 또 다른 예로 Fugitives 소스코드에서 29번째 라인 부근을 보면 다음과 같은 코드가 있다.

var model = atLargeCollection[i];
var row = Alloy.createController('FugitiveRow', model.toJSON()).getView();
row.model = model;
rows.push(row);

위 코드에서 문제가 되는 코드는 바로 3번 라인에 있는  row.model = model 코드다. 즉, Alloy 모델을 테이블 뷰에 할당할때 발생한다.

이 문제의 정확한 원인은 사실 나도 모른다. 현상만 따지자면 Alloy 모델이나 콜렉션을 자바스크립트 객체에 할당할때 문제가 발생한다는 사실이다. 이런 현상을 미루어 보아  강력하게 추정되는 몇가지가 있다. 타이타늄모듈 컨셉을 보면, 자바스크립트 객체는 네이티브 프록시 객체와 연결되어 있다. 예를 들어 아래 코드를 보자.

var win = Ti.UI.createWindow();
win.title = "이것은 윈도우 타이틀";
win.userData = "이것은 그냥 자바스크립트 변수";

위 코드에서 타이타늄 모듈로 생성한 win 객체는 자바스크립트 객체이지만 네이티브 프록시 객체이기도 하다. 즉, 위에서 title 속성은 네이티브 프록시 객체와 연결되어 윈도우의 타이틀을 변경하지만, userData 속성은 네이티브 프록시 객체와 연결되어 있지않기 때문에 그냥 자바스크립트 변수에 값을 할당한 것에 지나지 않는다.

이렇게 타이타늄에서 사용되는 자바스크립트 객체는 순수 자바스크립트 객체와 네이티브 프록시 객체가 혼합되어 있는데, 프록시 객체에 Alloy 객체의 인스턴스를 직접 할당하면 뭔가 충돌이 발생하는 것 같다.  따라서 Alloy 객체에서 데이터만 뽑아서 할당하도록 한다.

— updated  2012-12-18 종은님 제보로 수정 —

프록시 객체에 값을 할당할때 프리미티브(Primitive) 값이 아닌 참조 값을 넣으면 문제가 발생한다. 문제라기 보다 정확히 그 값을 보장받지 못함. 따라서 프록시 객체에 값을 할당할때는 가급적 문자열이나 숫자등의 값만 할당하고, 객체나 배열 할당은 주의해야함.

—-

여튼 해결책은 Alloy 모델을 toJSON() 메소드를 이용해 순수 자바스크립트 객체로 추출해서 할당하면 문제가 발생하지 않는다. 콘솔에 출력하고 싶은 경우에는 JSON.stringify() 메소드를 이용해 문자열로 변환해서 출력하면 문제가 발생하지 않는다.

2. SDK 3.0 개발자 인증서 인식못하는 버그

이것은 확실히 버그인 것 같다. 타이타늄 정식 버전이 나오자마자 디바이스 디버깅을 해보려고 폰에 포팅을 시도했는데.. 잘 인식되던 인증서가 인식이 안되는 상황이 발생했다.

왜 안되지? 이러면서 기존에 미리 깔았던 beta 버전도 싹다 지우고 타이타늄 정식버전을 다시 깔아봤는데도 마찬가지다. 그래서 SDK 2.x버전으로 바꿔서 디바이스로 포팅을 해봤는데. 2.x버전은 문제없이 인식도 잘되고 포팅도 잘된다. 이미 타이타늄 커뮤니티엔 같은 문제를 겪는 사람도 많다. 따라서 이 문제는 SDK 버그로 결론 지었다. 조만간 패치가 나오길 기대해본다.

3. 발견된 자잘한 버그들

UI와 관련한 자잘한 버그들도 많았다. 내가 발견한 버그들이 이미 신고되어 버그로 등록되어 있는지는 찾아보진 않았지만, 일단 발견한 것만 써보면.

다중 커스텀 픽커 초기화 문제

Alloy를 이용해 뷰.xml에 다중 커스텀 픽커(Picker)를 정의하고 각 픽커의 컬럼을 아래와 같이 자바스크립트로 설정하려고 할 때, 컬럼이 하나만 설정되는 버그가 있다.

$.picker.setSelectedRow(2, 0);
$.picker.setSelectedRow(1, 2, true);
$.picker.setSelectedRow(0, 3);

아마도 알로이에서 뷰를 만들 때, 뷰가 생성되는 시점이 다른것 같다. 그래서 간단히 setTimeout을 이용해 타이밍을 조절했더니 3개의 컬럼이 모두 잘 설정된다.

Alloy 뷰(.xml)파일에 UI를 미리 정의해 숨겨놓고 싶은 경우

Alloy를 쓰다보면 아무래도 Ti.UI.createXXX 형태로 UI를 만드는 것보다 xml과 tss를 이용해 마크업 방식으로 작성하는게 훨씬더 직관적이고, 쉽다는 것을 금방 알게 된다. 그래서 왠만한 UI들은 xml로 정의하고 싶은데… 동적으로 생성되어야하거나 조건에 따라 보일지 말지를 정의해야하는 경우가 종종 있다. 이런 경우 원래 Ti.UI 컴포넌트들이 가지고 있는 visible 속성을 바꿔서 처리하면 간단할텐데.. 그래서 이것을 xml로 정의하니까 visible속성이 제대로 먹질 않는다. 버그로 판단되고, 현재는 이 문제를 해결하려면 아래와 같은 꼼수를 써야한다.

<Window id="window">
   <TableView id="table"></TableView>
   <TableViewRow id="repeatRow">
      <Switch id="repeatSwitch" />
   </TableViewRow>
   <Button id="saveBtn" visible="false" title="완료"/>
   <Button id="cancelBtn" visible="false" title="취소"/>
</Window>

 

위 코드의 경우 윈도우에 테이블이 전체를 덥기 때문에 TibleViewRow는 윈도우 안에 정의해도 보이지 않는다. 그리고 Button도 마찬가진데, 이 버튼은 Window의 좌우 네비게이션 버튼으로 삽입하기 위해 미리 만들어 둔것이다.

윈도우 좌우 네비게이션의 경우 현재는 지원하지 않고 있는데, 공식적으로 Alloy뷰가 지원할 계획이라고 한다.

— updated 2012-12-21 —

윈도우 타이틀 바에 좌우 네비게이션 버튼을 추가하고 싶은 경우

앞에서와 같이 View.xml 에 미리 정의해둔 녀석을 Controller.js 에 다음과 같은 코드로 추가할 수있다.

if ( Ti.Platform.onsname === 'iphone' ){
   $.window.leftNavButton = $.cancelBtn;
}

 

그런데, 여기서 주의해야 할 점이 하나 있다. 위와 같이 코드를 작성하고 윈도우 타이틀 바에 버튼을 붙이게 되면, 실제로는 윈도우에 2개의 버튼이 붙게된다. 하나는 View.xml에 정의한대로 visible=false인 숨겨진 버튼이 윈도우 중앙에 배치되고, 또다른 하나는 윈도우 타이틀 바 왼쪽 네비게이션  버튼으로 추가된다. 즉, View.xml에 정의하게 되면 사실상 윈도우에 자동으로 추가되는 코드가 되므로 불필요하게 붙은 버튼은 제거해주는게 좋다.

따라서 위 코드는 아래와 같이 작성한다.

if ( Ti.Platform.onsname === 'iphone' ){
   $.window.remove($.cancelBtn);
   $.window.leftNavButton = $.cancelBtn;
}

 

—-

타이타늄 3.0 새버전 릴리즈 노트 뜯어보기

오늘 새벽 타이타늄 3.0이 정식 릴리즈 됐다. 예전에 릴리즈 노트에 그다지 관심이 없었는데… 베타버전을 쓰기 시작하면서 자연히 릴리즈 노트를 챙겨보게 되는것 같다. 500개 이상의 버그가 수정됐다고 한다. 요건 나중에 찬찬히 살펴보기로 하고… 새로 추가된 기능을 훑어보자!

1. On-Device Debugging

오예~ 가장 반가운 소식이다. 이제 시뮬레이터가 아닌 디바이스에서 직접 디버깅이 가능하다!! 관련 문서는 여기를 참고하고, 번역된 문서는 여기를 참고.

2. Alloy Framework

이녀석때문에 베타버전을 이리 깔아서 개발중이었는데… 생각보다 정식판이 빨리 나와주었다!! 이번 릴리즈에 포함된 Alloy의 공식 버전은 0.3.3 이다.

3. Titanium Command-Line Interface

아무래도 Alloy가 node를 이용해 컴파일 하는 과정이 생겨서 그런지 CLI 에도 변화가 있나보다.

4. UI Event Bubbling Changes

드디어 이벤트 버블링을 스탑 (cancelBubble) 시킬수가 있게 됐다. 사실 이전 버전에서는 버블링은 되지만 스탑이 안되서 엄청 불만이 많았는데.. 이젠 된다고 하네~ +_+_+_+ 아마도 모바일 웹버전도 지원해야하기 때문에 웹API와 비슷한 인터페이스는 모두 제공해줄듯 싶다.

5. Android Action Bar Support

안드로이드 액션 바를 지원한다는데… 안드로이드 유저가 아니다보니 정확히 뭘 얘기하는지는 모르겠다. 기회가 되면 알아보는걸로 하고 패스~

6. Accessibility Features

접근성을 높이기 위한 보이스 오버 기능 지원이 추가됐다.