2009년 12월 31일 목요일

PHP XML Writer 속도

XMLWriter

0.000063


XMLDocument

0.000068


String

0.000084

 

XMLWriter가 가장 빨라보이기는 했는데 XMLDocument가 String으로 XML을 만든 것보다 빠른 것은 예상 밖이었다. 위의 값은 평균 값은 아니고 어떤 특정시점의 스냅샷이다. 그렇지만 여러번 실행시켜도 결과는 마찬가지다.

할 일

스트링으로 XML을 생성하면 XMLWriter보다 느리다. 그러나 일부 호스팅 서비스에서 XMLWriter를 지원하지 않는 경우가 있다. 주로 사용하는 호스트에서는 XMLWriter를 지원하고 있기는 하지만 이를 기반으로 제작하면 다른 서비스에서 사용할 수 없다. 우선순위를 어떻게 두느냐로 고민하다가 각 사용자 환경별로 최고의 속도를 내게하자는 규칙을 만들었다. 즉 모두 지원하고 경우에 따라 알고리즘을 바꾸기 쉽게 만든다. 나중에.

HTTP XML output

flash, php 통신에서 XML을 사용했다. XML 구조에 flash가 호출하고 싶은 php의 영역과 기능에 대한 정의가 포함되어 있고 결과에도 역시 같은 내용이 담겨있었다. 결과를 flash에서 파싱할 때 어떤 호출에 대한 응답인지를 확인하겠다는 의도였다. 그러나 잘못된 생각이었다. request에 대한 response는 정해져 있기 때문에 응답에 대한 핸들러가 작동하는 시점에는 호출한 내용이 무엇인지 이미 알고있기 때문이다.

 

따라서 xml output에 기입되는 내용, 실제 데이타를 표현하기 위해 시스템 전반적으로 XML 객체를 넘기는 것을 빼는 게 좋겠다. xml이 사용되는 해당 시점에서 output을 관리하는 게 좋아 보인다. 다른 경우에 이 코드를 사용한다면 output이 xml이 아닐 수도 있고 객체 생성시 xml 오브젝트를 계속 넘겨주는 암담한 인터페이스를 피할 수 있기 때문이다.

PHP 속도체크

$s = microtime();
$this->doSomething();
echo sprintf("%f", microtime_float() - $s);

 

위처럼 하니 속도파악이 가능하다.

PHP에서 XML 다루기

XMLWriter 라는 스트링으로 XML을 생성하는 클래스를 구해다가 사용하고 있었다. 그런데 계층 구조의 객체 관계를 모델링하고 이를 XML로 바꾸는 과정에서 스트링은 문제가 생겼다. 스트링은 여태까지 만들어 놓은 XML 텍스트를 수정하는 것이 불편하다.

 

따라서 PHP에서 XML을 다루는 방법을 찾아본 결과 역시나 정리되어 있는 문서를 찾아볼 수 있었다. XML을 다루는 방법은 크게 네 분류로 나뉘는데 tree based, streaming, event based, transformation 이다.

 

tree based

- ext/dom

PHP 4에서는 ext/domxml을 쓰고 PHP 5에서는 ext/dom을 사용한다. 사용법은 매우 비슷하다.

- ext/simplexml

 

 

streaming (빠르고 간단함)

- ext/xmlreader

- ext/xmlwriter

 

event based

- ext/xml

 

transformation

- XSL

 

 

2009년 12월 28일 월요일

PHP 의 POST 자동 addslashes

SQL injection을 피해보잡시고 POST값에 대해서 addslashes를 하려고 했다. 그런데 뭔가 조금 이상해서 봤더니 POST된 값에 이미 슬래쉬가 붙어있다. flash가 그렇게 보내진 않을거 같고 조금 찾아봤더니 아래와 같은 설명이 PHP 메뉴얼에 나온다.

 

The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you'll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.

 

magic_quotes_gpc가 on이면 GET, POST, COOKIE에 대해서 addslashes()를 수행한다. 그래서 addslashes()를 추가했다가 다시 빼버렸다. 다른 환경을 위해 get_magic_quotes_gpc()로 검사하고 직접 해주던지 놔두던지 하게 바꾸야 한다.

작심 리팩토링

+ 프리젠테이션 레벨이 디비와 묶여서 response xml 출력 코드가 많이 겹친다. 달력을 구성하는 객체를 만드는 편이 좋아보인다.

+ 서비스가 시작되면 위 작업을 하다간 갑자기 짤릴지도 모르니 테스터부터 만드는 게 좋겠다. 그래도 주의해야 겠지만.

2009년 11월 30일 월요일

필요한 것

+ 리스트와 맵으로 자식 객체에 접근이 가능한 상위 클래스.

+ 한 컴포넌트 내에서 발생하는 마우스 이벤트를 조합하여 드래그앤드롭의 수락, 처리를 담당하는 클래스와 구현하면 이 클래스가 발생하는 정보를 넘겨 쉽게 사용할 수 있게 하는 인터페이스.

2009년 11월 29일 일요일

메소드 추상화, 대칭성

같이 호출되는 메소드들의 대칭성을 유지하기 위해 메소드의 추상화가 요구된다. 메소드에 설명을 주기위해 다른 메소드를 그대로 한 번 더 호출 해줄뿐인 메소드를 만들 필요도 있다. 여기에 성능상의 비용은 크지 않다.

선택 메시지

조건문을 지우고 다형적 메시지를 호출하게 하는 방법. 다형성 설명에서 자주 등장하는 방법이다. 켄트 벡은 "선택 메시지를 사용하게 되면, 코드 독자가 연산의 세부 구현을 이해하기 위해 여러 개의 클래스를 살펴봐야 할 수도 있다"고 했고 "과도한 선택 메시지 사용은 좋지 않다." 라고도 했다.

 

선택 메시지를 무시하자는 목적으로 갈무리를 해두는 것은 아니다. 선택 메시지가 갖는 단점을 기억하기 위해서 적어둔다. "과도한"의 정의가 중요하다. 켄트 벡은 "당장 연산의 변형이 필요하지 않은 경우라면 미래 확장을 위해 굳이" 그럴필요 없다고 말한다.

 

추가. 단점을 기억하기 위해 쓰다보니 무조건 안좋은 것처럼 보인다. 전혀 아니다. ㅎ

양육

본성이냐 양육이냐의 문제는 사회 생물학의 중요한 내용 중 하나였고 나는 그 것을 통해 무서움을 느꼈으며 즐겨보던 매트리들리를 통해 읽은 "본성과 양육"은 본성을 통한 양육이라는 결론을 내려 안심을 하게 했다. 최근에 양육과 관련된 책 몇 권이 이래저래 보여져서 링크를 모아둔다.

 

양육쇼크

http://www.hani.co.kr/arti/culture/book/390196.html

 

죽어라 말 안 듣는 아이, 이유를 알고 싶다

http://www.yes24.com/24/goods/3092514

 

교사를 당황하게 하는 아이를 만났을 때

http://www.yes24.com/24/goods/2954125

2009년 11월 25일 수요일

stackoverflow, yakov fain

http://stackoverflow.com/ 이 알고보니 Joel Spolsky랑 Jeff Atwood가 만든 거였다.

 

다른 서비스로 http://stackexchange.com/ 이 있다. 같은 엔진인데 각자 운영을 할 수 있나 보다. 유료다.

 

yakov fain이 돈을 내고 stackexchange.com 을 시작한다고 한다. 여기를 보면 관련 포스트를 볼 수 있다.

 

아래는 그 주소

http://built4flash.stackexchange.com/

여유

작정하고 남의 사무실에서 밤새기로 결심했는데 내 코드를 과거 버전으로 덮어 씌워버린 후배는 퇴근을 하셨고 나는 코드 살릴 시간에 생각을 좀 해볼 시간을 내고 있으니 어느덧 조바심이 아니라 한가함을 느끼고 있었다. 이는 "비로소 해탈했네" 식의 유머가 아니라 진심이다. 개인들의 각성을 강조하기 보다 조직의 시스템을 의심하는 게 옳다고 믿고있다. 어디부터 다시 시작해야 할까?

2009년 11월 23일 월요일

모든 svn 하위 디렉토리 지우기

모든 하위 svn 정보(.svn) 지우는 배치파일.

 

for /f "tokens=* delims=" %%i in ('dir /s /b /a:d *svn') do (
rd /s /q "%%i"
)

pause

 

엉뚱한 위치에서 실행하면 안됨.

아이폰 사지 않는다.

5분정도 생각을 해봤는데 아이폰을 사지 않기로 했다. 너무 비싸다.

2009년 11월 21일 토요일

선택권

" 저희는 사용자들의 선택권이야 말로 구글을 비롯한 모든 기업과 사람들에게 혜택을 주는 혁신을 이끌 것으로 믿고 있습니다."

-- 구글 크롬OS와 안드로이드가 OS라는 측면에서 일정부분 겹치는 것에 대한 구글의 생각

출처 : http://googlekoreablog.blogspot.com/2009/07/os.html

2009년 11월 14일 토요일

몰입의 즐거움

미하이 칙센트미하이의 몰입의 즐거움을 읽었다. 플로라는 개념은 IT 조직론 관련 서적 피플웨어를 통해서 처음 접했었다. 그러다가 갖고있는 몇 개의 책에서 미하이 칙센트미하이가 여러차례 인용이 되는 것을 보면서 관심을 갖게 됐고 사보게 됐다. 저자 이름부터 몰입감이 있어보인다. 책을 살때 즐겁게 일하는 것이 몰입을 유도하고 몰입하여 일하는 것이 결과도 좋다는 것을 말하지 않을까 싶었다. 그러나 즐거움 자체가 항상 생산적일 수는 없다는 내용을 다루면서 몰입 자체에 대하여 다시 생각을 하게 됐고 여가를 어떻게 보낼지에 대해 생각을 하게 됐다. 사소한 것에서 즐거움을 얻는 방법도 배운듯 싶다. 책은 인간 관계, 여가를 다루는 방법, 삶의 태도, 가치 있는 삶 등을 다룬다. 통계에 기반하여 쓰여졌지만 학술서적은 아니다. 그래서 그런지 가르침을 주려는 문장들이 종종 보인다.

2009년 11월 12일 목요일

XML과 데이타

생성되는 오브젝트와 엘리먼트를 1:1로 매칭 시키는 것이 좋은 상황이 있다. 파싱한 정보를 기반으로 다시 필요한 데이터 형태로 변환하는 과정이 생략되고 Object 관계를 다시 xml로 변환 할 때도 쉽다.

 

이 경우 다른 의미의 Element 가 다른 Depth에서 나타나는 것은 좋지 않다. 엘리먼트 이름을 클래스 명으로 사용하면 같은 소스 내에서 같은 클래스 명을 사용하는 게 짜증나기 시작한다.

소음

I want to be a fashion model.

 

음성 테스트 때문에 수십 번을 들었음. 철야.

도메인 구입

zaksim.com 10년치 구입. 10년동안 사이트 망할 일은 없다.

2009년 11월 11일 수요일

몰입감, 소음, 페어

5~7월 사이 심각하게 느꼈던 몰입의 어려움을 다시 느끼고 있다. 핵심은 전화기였다. 당시에는 전화받을 옆의 사람과 내 전화가 동시에 울리면 내가 전화를 받아서 옆사람에게 바꿔주는 굉장히 신비한 짓을 하고 있었다. 나에게 오는 전화는 5~7월 사이 한 건 정도 있었나 없었나 그렇게 기억한다. 일이 싫었는지 내 집중력이 부족했던 건지 아무튼 낮은 어렵게 보내고 칼퇴근을 한뒤 새벽에 나타나 일과 공부를 했다(사무실과 집이 가깝다 ㅎ). 당시 사장면담에서 나는 유일한 개선 요구사항으로 서버의 소음이 너무 크다고 말했다.

 

그 이후에는 업무 형태가 조금 바꼈다. 세 명이 돌아가며 두 명씩(페어) 일을 했다. 며칠 전 10월 말까지 그렇게 계속 일을 했는데 원래 앉던 자리와 비슷한 자리였음에도 별로 시끄럽다는 생각이 들지 않았다. 우선 말을 하게 되므로 아무래도 의미없는 서버 소리나 전화기 소리보다는 상대의 말이 더 집중됐다. 이 시기에는 야근, 철야도 많이 했기 때문에 확실히 페어워킹의 효과인지 알 수는 없다. 야근을 하면 회사는 조용하기 마련이다. 이쪽 파트가 페어를 하는 동안 근처 파트(원래 있던 파트)의 업무 능률에 대한 판단도 없다. 같은 내용이 아니니(이쪽은 Flex, 저쪽은 PHP) 대화소리 때문에 아마 떨어지지 않았을까.

 

최근에 자리배치가 바뀌게 돼서 딱 중앙에 있는 자리에 앉아있다. 사람이 많이 늘어서 다른 파트들은 절대적인 미팅의 수가 많아졌다. 자리를 옮기기 전에는 가까이 앉아보지 못했던 다른 개발팀은 업무지시를 파티션 너머로 말하는 문화다. 누구씨 뭐하면 뭐 줘요, 이메일 뭐에요, 커밋했어?, 미안 나때문에, 메신저가 안되는데요, 누구씨 개인적으로 밖에서 잠시 얘기좀 하죠. 까지가 정확히 오늘 있던 일 중에 기억에 남는 대화다. 옆 동료들도 묻진 않았지만 아마 기억할 것으로 예상된다. 내가 잘난 것은 아니니 개인적 집중력의 부족이면 직종을 바꿀 생각은 하고있다. 진지함.

2009년 11월 8일 일요일

책임

자기도 이제 다 컸으니까 엘레베이터는 직접 누르겠다는 아이에게 사람들은 주책이라고 말하지 않는다. 어른을 자처하는 것은 실제 어른스러움과는 거리가 먼 것이라 대단한 것을 기대하지 않게 되고, 스스로 해보겠다고 하는 것도 고작 사람들을 원하는 층수에 올려다 놓는 간단한 문제이기 때문이다. 어느날 아이가 곧 잘 누르던 엘리베이터 버튼은 안누르고 "엄마 장남감 사업을 해볼까 하는데 사천만 땡겨줘", 라고 말한다면 그건 조금 다른 문제인 것처럼 말이다.

인센티브

2009년 11월 3일 화요일

2009년 11월 2일 월요일

BrowserManager로 URL 변경 알아내기

bm.addEventListener(BrowserChangeEvent.BROWSER_URL_CHANGE, onURLChange);

 

bm.setFragment("key=" + value);

를 하면 URL이 바뀌고 히스토리에 추가된다.

 

onURLChagne 에서 o.value를 얻어서 사용할 수 있다.

BrowserManager를 사용한 URL 파싱

BrowserManager

var bm:IBrowserManager = BrowserManager.getInstance();
bm.init();

bm.url : full url

bm.base : # 앞

bm.fragment : # 뒤

 

URLUtil

URLUtil.getPort(bm.url);    // 8080

URLUtil.getProtocol(bm.url);    // http

URLUtil.getServerName(bm.url);    // localhost

URLUtil.getServerNameWithPort(bm.url);    // localhost:8080

 

// 세미콜론으로 나뉘어진 url 단편들을 액션스크립트 객체로 파싱

var o:Object = URLUtil.stringToObject(bm.fragment);

 

ObjectUtil

// ★ Object를 찍어보기

ObjectUtil.toString(o);

 

// #id=goojoono;name=KooJunHo 대소문자 구분 함.

o.id == "goojoono"

o.name == "KooJunHo"

초간단 배포 batch 파일

xcopy "C:\flexprojects\BM\output\*" "C:\APM_Setup\htdocs\bm" /E /Y

 

/E : 비어있는 디렉토리를 포함한 하위 디렉토리를 복사

/Y : 덮어써야 하는 상황에 질문하지 말고 덮어쓰기

 

테스트 할때 사용

2009년 11월 1일 일요일

XML 다루기

http://koojunho.textcube.com/22

http://koojunho.textcube.com/38

http://koojunho.textcube.com/55

 

몇 번의 고민을 통해 XML을 직접 데이터로 사용하기 보다는 XML의 엘리먼트들을 잘 표현하는 Object로 바꿔주고 컬렉션을 통해 사용하는 것이 좋을 것 같다는 결론을 내렸다. (물론 여전히 상황따라 다를 수 있다는 전제를 깐다. ㅎ)

 

XML만을 사용하는 경우 XML을 데이터로 주고받는 상황에서 문제가 많이 생긴다. 어떤 XML 엘리먼트건 XML로 받을 수 있기 때문에 해당 값이 내가 받고자 하는 엘리먼트인지 아닌지를 판단하는 문제는 런타임으로 넘어가게 된다. XML이 수정되는 경우라도 컴파일 타임에는 아무런 문제를 일으키지 않기 때문에 모든 문제를 런타임으로 넘기게 된다. 문제가 런타임으로 넘어가면 프로그램의 해당 부분을 실행하기 전까지 문제가 있는지 아닌지 알 수 없게된다.

 

Object라고 해서 데이터가 수정될 때 아무런 작업이 필요 없는 것은 아니다. XML을 파싱해서 객체로 만들어 주는 과정과 자료구조를 만들어 주는 과정이 필요하다. 게다가 검색기능은 E4X, XPath 등에 비해 훨씬 귀찮다. 그러나 데이터가 바뀌고 클래스를 바꾸면 해당 값을 사용하는 모든 클래스들이 반응하게 된다. XML에서 특정 엘리먼트의 데이터를 다루는 방법이 바뀔경우 캡슐화된 클래스 내에서 처리방법만 바꿔주면 그 클래스를 사용하는 모든 클라이언트 코드가 자동으로 바뀌는 셈이다.

 

그렇지만 XML을 클래스로 만드는 것도 일은 일이다. 그래서 유닛테스트 프레임워크를 사용해서 완성된 XML을 기반으로 클래스를 만들면서 테스트를 하면 구현이 필요한 클래스의 나머지 일부가 어떤 것인지를 에러로 보여주는 클래스를 구현했다. 만약 내가 어떤 엘리먼트의 자식 엘리먼트로 <title />을 추가하고 실행을 했다면, 알 수 없는 title이라는 존재를 인식한 객체가 예외를 발생시키는 구조다. AS3.0에서 this[elementName] 으로 접근하여 값을 집어넣게 하는 방식으로 처리했다. this객체가 dynamic 클래스의 인스턴스는 아니기 때문에 동적으로 값을 넣을 수 없으면 예외를 던지는 것이다.

 

직접 XML을 클래스로 바꾸는 작업도 같이 진행했는데 처음에는 더뎌 보였지만 기반 클래스가 갖춰지자 테스트에 의존해서 클래스를 만들어 내는 쪽이 더 빨리 끝났다. 별로 머리 쓸 일이 없게 해준다.

 

엘리먼트마다 클래스가 생겨서 해당 엘리먼트 또는 자식 엘리먼트들을 처리하기 위한 기능들을 추가할 수 있게 됐다. 예를 들어 날짜를 갖고있는 XML이 있다면 XML로 접근했을 때 텍스트일 뿐이고 나중에 클라이언트 코드에서 해당 XML을 Date 클래스 등으로 변환해 주어야 한다. 클래스로 구현이 되어 있는 경우는 미리 그 작업을 베이스 코드에서 해주기 때문에 편해 보인다.

 

물론 XML을 OOP 구조로 치환 했을때 데이터를 제대로 표현했다고 하기에는 무리가 있다. 객체를 사용하는 게 더 좋다고 결론을 내렸다지만 XML을 객체로 치환하는 게 중요한 게 아니라 XML로 표현 된 데이터를 객체로 제대로 표현하는 게 더 중요하다. 사람의 고민이 필요한 부분에선 이 클래스들도 영 쓸모가 없다. 그래서 중요한 것은 만드려는 게 무엇인가를 먼저 봐야 하는 거고, 그 보다 더 좋은건 XML 정의하는 과정에도 참여하는 게 더 좋았을 텐데, 아직 설명은 못들었고 주말엔 쉬어야 한다는 생각이 갑자기 들었기 때문에. 오케이 여기까지. ㅎ

지속적 훈련 강요 툴 - 최종

1.

토요일동안 간단한 프로그램을 만들었다. 일종의 일정관리 툴이라고 볼 수 있는데 할 일을 기록하는 게 아니라 한 일을 기록하는 게 특징이다. 서비스에 로그인을 하면 해당 사용자가 하고자 하는 일들이 나온다. 예를 들어 일이란 영어단어 외우기, 운동하기, 청소하기 등이 될 수 있다. 각각의 일은 달력 한 개로 표현되는데 그날 하려고 한 일을 했다면 해당 날짜를 녹색으로 체크할 수 있다.

 

화면에 나온 달력들을 녹색 체크로 채우는 재미를 느끼게 하는 것이 이 프로그램의 목적이다. 더 정리가 된다면 사용자가 한 십 년치 녹색 체크를 가질 수 있게 유도하는 컨셉을 잡아보고 싶다. 무엇이든 꾸준히 오랜 시간을 한다면 성취할 수 있다는 내 믿음(증거는 없다. ㅎ)을 만든 것이다. 예전에 웹호스팅 받던 개인 서버에서 게시판에 후배 한두 명과 공부한 내용을 기록하던 경험을 살려봤다.

 

2.

어느정도 기능 구현은 완료됐다. 안정성, 편리성 따지지 않으면 당장엔 너그러운 사용자들과 함께 쓸 수 있는 수준이다. 몇 가지 익힌 것이 있고 더 필요한 것들을 알게됐다. 까먹지 않도록 해당 내용을 정리한다.

 

PHP 통신

Flash 기술로 서버사이드와 통신을 하는 RPC 라이브러리를 만들어 본 것은 이번이 두 번째다.

 

한 개는 졸작때 만든 건데 그때는 사용 툴이 Flex가 아니라 Flash였다. 주요 내용은 이렇다.

 

    + Flash에서 서버와의 통신을 담당하는 객체를 dynamic으로 만든다.

    + PHP 서버에 공개 할 메소드(웹메소드)를 XML로 표현한다.

    + Flash에서 웹메소드 XML을 파싱하여 동적으로 메소드를 삽입한다.

    + Flash에서 직접 구현하지 않은 웹메소드를 사용한다.

    + 자바의 리플랙션을 사용하여 소켓 서버용으로도 똑같이 만든다. (Apache MINA 사용)

 

위 라이브러리를 사용하여 Flash에서 PHP를 사용한 영단어 퀴즈 프로그램과 자바 소켓 서버를 사용한 멀티유저 블랙잭 게임을 만들었다.

 

결론적으로 웹(PHP 라이브러리)은 Request가 있으면 Response가 있으니까 라이브러리가 꽤 편리했다. 나는 호출할 수 있는 서버 메소드 목록을 찍어볼 수 있었고 Flash에서 직접 구현하지 않은 메소드 이지만 서버가 넘겨준 스팩대로 호출하면 결과가 나왔다. 그러나 Flash-자바소켓서버 통신에서는 라이브러리의 장점이 나타나질 못했다. 소켓서버는 클라이언트가 뭔가를 요구하지 않아도 서버가 메세지를 보내기도 한다. 물론 이는 소켓 프로그래밍 자체가 가지고 있는 일정 수준의 복잡성 때문이기는 하지만 내 라이브러리가 별로 필요 없어 보이긴 했다.

 

이번에 새로 짠 Flash-PHP RPC 라이브러리는 개념이 다르다. 졸작때 만든 라이브러리는 서버의 구현 내용을 몰라도 인터페이스가 가능하게 하는 라이브러리였다. WebService처럼 서비스 내용과 프로토콜을 알려주는 라이브러리였다. 제작 목적이 졸작이므로 "서버의 PHP에서 메소드를 만들면 클라이언트의 Flash에서 호출할 수 있습니다." 와 같은 마법같은 문장이 필요하긴 했지만 서버/클라이언트 모두 제작하는 상황에서는 타이핑 몇 줄 줄여주는 것 말고는 쓸데없다. 또 원격 객체를 동적으로 만들면 IDE가 제공하는 자동완성을 쓰지 못한다. 졸작때는 Flash를 사용했기 때문에 자동완성 기능이 약해서 그냥 그냥 넘어갔는데 Flex에서 그러고 싶지는 않았다.

 

새로만든 라이브러리는 아래와 같은 구조로 작동한다.

 

    + Request를 처리하는 클래스를 상속받아 새로운 클래스를 만든다.

    + Flex에도 위에서 만든 클래스에 대응하는 클래스를 만든다.

    + 원격 메소드를 호출하면서 class와 method를 post로 넘긴다.

    + php에서 class 이름으로 클래스를 생성하고 method를 실행시킨다.

    + 결과를 XML로 받는다.

 

대충 앞의 라이브러리와 비슷하지만 서버가 기능 목록을 전송하는 과정이 없고 호출하는 클라이언트도 호출 클래스를 직접 구현해줘야 하는 차이가 있다.

 

WebORB, BlazeDS 등으로 AMF 쓰는 것을 생각할 수도 있겠지만 남의 것 쓰면 조금 위험할 수 있다는 생각과 실제로 내 웹 호스팅에서는 이 프레임워크들이 잘 작동을 안하기 때문에 또, WebORB는 PHP 버전을 사용해 봤으니 그리 편하다는 생각은 들지 않아서 만들어 봤다.

 

통신을 하다 생기는 오류는 서로 다른 시스템이기 때문에 문제의 원인을 쉽게 노출시키기 어렵다. Flash가 PHP로부터 xml을 받으려고 했는데 PHP 코드에 에러가 생길 수 있다. Flash에서 xml로 형 변환을 하려다가 PHP 에러 구문이 xml이 아니니까 예외가 뜨게 되는데 이때 심각하게 고쳐야 할 것은 PHP 코드이지 Flash는 아니다(물론 예외 처리가 필요하다). 이때 아무 메세지 없이 Flash 코드를 노려보고 있다면 갑갑해지기 쉽상이다. 이를 수월하게 하기 위한 출력이 필요하다.

 

UX

DB에 기록하고 결과를 받아서 화면에 표현하기까지 지연이 생긴다. 만약 On/Off 버튼을 구현한다고 하면(GMail의 별표 기능 처럼) 서버 지연 때문에 엇박으로 클릭을 하다가 이제 된건가 하고 가만히 서버의 응답을 기다려야 하는 상황이 생길 수 있다. 이게 생각 이상으로 답답하다. 사용자가 클릭하면 일단은 처리된 것으로 보여주고 서버에서 데이터를 받아서 성공하면 놔두고 실패하면 실패를 알리고 화면을 갱신하는 식으로 처리하는 것이 좋을 것 같다.

 

당연한 효과들

화면에 보여지는 여러개의 달력 중 변경된 한 개의 달력 내용을 표현하기 위해 전체 달력 레이아웃과 체크 데이터를 새로 갱신할 필요가 없다. RIA의 장점이다. 이게 데이터 전송량에서만 이점이 생긴다고 생각했는데 서버 자원을 절약해 주기도 한다. 물론 AJAX로 할 수도 있겠지만 내 학습상태로는 Flex가 편하다. 물론 이러한 프로그램이면 Flex로 만드는 것 보다 AJAX로 만드는 게 더 좋을 것 같다는 생각이 있다.

 

더 필요한 것

+ 세션처리 - 세션을 담당하는 게 Flash를 담고있는 브라우저인지, Flash가 서버와 통신하는 객체인지 아직 파악을 못했다.

+ DB 생성 스크립트 - 지금이야 상관 없는데 배포가 되고나서 DB가 바뀌면 골치 아프다. DB도 버전에 따라 자동으로 스키마를 변경 해주는 유틸리티가 필요하다. 이미 있거나 만들기 어렵다는 결론이라도 어디 있을 것 같긴 한데...

+ 서버 자동 배포 - 배치파일과 FTP를 사용하여 업로드를 하던 코드는 만들었었는데 이러면 릴리즈 과정과 같이 묶이지는 못한다. Ant나 Maven을 쓸 수 있도록 변경한다.

+ 그러므로 유닛 테스팅.

+ Debug mode지원 - 앞에서도 썼지만 개발 중에 생기는 오류를 파악할 수 있는 장치가 절대적으로 필요하다.

+ 다른 사람 화면 볼 수 있게 하기.

+ 한 일 등록 정책.

 

3.

전반적으로 Flex로 그닥 뛰어난 성능은 아니지만 대중적인 서버와 통신하는 효율 적인 방법에 대해 학습을 했다. 앞으로는 통신부분을 더 집중하는 것이 좋을 것 같다. 아무래도 계속 사용할 수 있는 코드이고 한 번 해결해 놓으면 반복적인 테스트에서 의미없이 소비되는 접근 시간을 줄일 수 있기 때문이다.

놈의 프로그램

어짜피 광고로 돈 벌 생각이면 오픈소스여도 상관없지 않냐는 게 내 생각이다. 아니 오히려 더 경쟁력이 있지 않겠는가?

String2Date

var date:Date = DateField.stringToDate(dateXML.toString(), "YYYY-MM-DD");

 

String을 Date로 바꿀때.

2009년 10월 31일 토요일

지속적 훈련 툴 중간보고

동생님이 중간보고 하라고 하셔서 중간보고를 드렸다. 그리고 15분을 쉬고 있는데 3시까지 무리라는 판단이 들었다. 훗. 역시 저질러 놔야 뭐가 필요한지 안다니깐.

지속적 훈련 툴 개발 시작

지속적 훈련 툴 개발 시작. 아는 동생에게 나 몇 시까지 만들면 되냐고 물었더니 3시까지 하라고 해서, 3시까지 하기로 함.

2009년 10월 22일 목요일

예수전

"우리는 가장 중요한 사회적 비판이 반드시 '그 사회에서 가장 악한 세력'을 대상으로 하는 건 아니라는 점을 기억해야 한다. 오히려 가장 악한 세력은 그 악함이 이미 일반화되어 있어, 뒤집어 말하면 그들에 대한 인민들의 적대감이나 반감 또한 일반화되어 있어서, 그들을 비판하는 일은 그런 일반화한 적대감이나 반감을 한 번 더 되새기는 일에 머물기 쉽다. 너무나 지당한 일은 하나 마나 한 일이기도 한 것이다. 사회적 비판은 그 사회에서 가장 악한 세력이 아니라 '그 사회의 변화를 가로막는 가장 주요한 세력'에 집중되어야 한다. 그 세력은 두 가지 요건을 갖는다. 가장 악한 세력과 갈등하거나 짐짓 적대적인 모습을 보임으로써 인민들에게 존경심과 설득력을 가질 것, 그러나 그 갈등과 적대의 수준은 지배체제 자체를 뒤흔들 만큼 심각하지 않을 것. 그 두 가지 요건의 절묘한 조화가 바로 사회 변화를 가로막는 것이다." -- 예수전 117 페이지.

2009년 10월 20일 화요일

관리

관리자들은 팀이 두려운 거다. 쥐고 흔들고 결국에는 팀을 부숴야 관리가 되는 것이라 생각한다. 전전긍긍하는 꼴이란. 원.

2009년 10월 11일 일요일

Flex Continuous Integration

회사에 Flex 지속적 통합 환경을 구축했다. 빌드 자동화에는 maven, flex-mojos를 사용했고 지속적 통합에는 hudson으로 시도를 해보다가 테스트가 안되는 바람에 groovy 코드를 짰다.

 

그루비 코드는 아래의 과정을 처리한다

1. 실행 디렉토리의 하위 디렉토리 전체를 돌면서 pom.xml 이 있는지 검사한다.

2. 있으면 svn clean, svn update, mvn install을 실행한다.

3. maven의 결과를 파싱해서 성공/실패 여부를 판단한다.

4. 실패하지 않았던 프로젝트가 실패하면 xml을 읽어서 팀 멤버들에게 로그를 메일로 보낸다.

5. 실패했던 프로젝트가 다시 성공을 하는 경우에도 로그를 메일을 보낸다.

6. 이미 실패한 프로젝트가 다시 실패한 경우에는 메일을 보내지 않는다. (한 번만 보내면 충분하다.)

7. 10분간 대기한다.

pear 사용

테스트 때문에 pear를 사용해야 하는데 호스팅 서버에서 pear를 사용할 수 없다. 따라서 테스트 환경만 로컬에서 pear를 사용한다. 서버에서는 테스트를 따로 하지 않는다. 물론 실제 서비스되는 코드에서 pear 패키지들을 사용할 수 없다.

2009년 10월 7일 수요일

뜬금없이

뜬금없이 일본 친구에게 전화를 걸어 인사를 했다. 별로 놀라는 눈치도 아닌데 얘기를 하다보니 자기 오늘 생일이라고 말하는 바람에 내가 놀라 버렸다. 아 타이밍.

2009년 9월 29일 화요일

flex-mojos

Maven 쓸 생각이다. 이유는 다 귀찮아서, 이고. 이미 콘솔에서 테스트도 성공했고 hudson에도 붙였다. 문제는 테스트는 hudson에서 아직 안되고 있다는 점. adobe도 flex-mojos 쓴데잖아.

 

http://www.sonatype.com/people/2009/09/flexpmd-adobe-using-flexmojos/

2009년 9월 8일 화요일

버튼에 프로그래밍 스킨 적용

ProgrammaticSkin을 상속받아 스킨 클래스를 만들고 버튼에 적용할 수 있다. 아래 둘 중 한 가지 방법으로 적용 가능하다.

 

클래스 : <mx:Button upSkin="{SkinClass} ....

문자열 : <mx:Button upSkin="com.domain.skin.SkinClass" ....

 

 

2009년 8월 26일 수요일

HDividedBox

liveDragging="true"

 

이렇게 주면 HDividedBox의 사이즈가 변화는 즉시 화면에 반영된다.

2009년 8월 25일 화요일

2009년 8월 16일 일요일

ObjectHandles 선택기능 구현 살펴보기

디자인 툴을 만들기 위해 http://www.rogue-development.com/objectHandles.html를 사용한다. 여러 개의 컴포넌트 중 한 개가 선택되면 기존에 선택되어 있던 것은 해제되고 새로운 것만 선택된다. 이 구조를 어떻게 구현했는지 찾아보니 다음과 같다.

 

1. ObjectHandles의 onMouseDown 발생

2. SelectionManager.instance.setSelected(this); 실행

3. 2번의 setSelected 메소드에서 기존에 선택된 것이 있으면 deselect() 시키고 새로운 것을 select() 한다.

 

화면을 lock 시키면 select되지 않게 만들어야 했다. SelectionManager을 살펴보니 addSelectable, removeSelectable 메소드가 있다. addSelectable에서 _items 라는 곳에 select 가능한 object들이 추가 되는데 SelectionManager는 위에서 쓰는 것처럼 싱글톤이다. 그래서 application 전체의 Object들이 이 곳에 담기게 된다. application 내부 에서 두 개의 design 화면을 띄우고 이쪽은 lock 저쪽은 unlock 시키려고 이 _items를 사용하면 안된다.

Flex의 List에서 아이템을 더블클릭 시 수정할 수 있게 바꾸기

Flex의 List에서 아이템을 더블클릭 하면 수정되게 하고싶을 때가 있다. 아래 링크한 문서에서 Comments에 JabbyPandaUA 라는 사람이 남겨놓은 답이 좋아 보인다.

 

참고 : http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=2&postId=8983

 

addEventListener(ListEvent.ITEM_DOUBLE_CLICK, onItemDoubleClick, false, EventPriority.DEFAULT_HANDLER);


protected function onItemDoubleClick(event : ListEvent) : void {
  
   var isEventPrevented : Boolean = event.isDefaultPrevented();
   if (event.isDefaultPrevented()) {
    return;
   }
                   
   editable = true;
         editedItemPosition = {columnIndex : 0, rowIndex : event.rowIndex};                      
  }

위와 같이 한다. 단순히 editable = true 속성을 지정해 두면 더블 클릭이 아닌 원 클릭에도 수정모드로 들어간다. 위의 코드도 한 번 editable이 되면 계속 editable이 되므로 change 이벤트 등에서 무조건 editable = false; 로 지정해 주니 잘 된다.

event 나중에 처리하기

flexmdi라는 flex에 데스크탑을 구현한 오픈소스가 있다. 여기를 클릭하면 볼 수 있다. 여기 샘플 코드에 괜찮은 설명이 있어서 옮겨 적는다.

 

 

   // the flex framework dispatches all kinds of events
   // in order to avoid catching one of those and throwing a coercion error
   // have your listener accept Event and check the type inside the function
   // this is good practice for all Flex development, not specific to flexmdi
   private function confirmWindowClose(event:Event):void
   {
    if(event is MDIManagerEvent && confirmCloseCb.selected)
    {
     // store a copy of the event in case we want to resume later (user confirms their intention)
     queuedEvent = event.clone() as MDIManagerEvent;
     
     // this is the line that prevents the default behavior from executing as usual
     // because the default handler checks event.isDefaultPrevented()
     event.preventDefault();
     
     Alert.show("Seriously? Close it?", null, 3, null, handleAlertResponse);
    }
   }
   
   // called when the Alert window is closed
   // if the user said yes, we execute the default behavior of playing an effect
   // and then removing the window by sending the stored event to
   // the appropriately named executeDefaultBehavior() method
   private function handleAlertResponse(event:CloseEvent):void
   {
    if(event.detail == mx.controls.Alert.YES)
    {
     mdiCanvas.windowManager.executeDefaultBehavior(queuedEvent);
    }
   }

 

 

윈도우를 닫을 때 발생한 이벤트에서 이벤트를 clone하여 queuedEvent라는 곳에 임시 저장하고 event는 preventDefault() 한다. 만약 사용자가 윈도우를 닫기 원하면 queuedEvent를 처리한다.

 

이벤트를 받을 때 타입체크를 하라는 설명도 보인다.

Flex에서 스크롤바 가장 밑으로 내리기

아래처럼 하면 object에 붙어있는 스크롤바를 가장 하단으로 내릴 수 있다.

 

      object.verticalScrollPosition = object.maxVerticalScrollPosition;
      object.validateNow();

 

적어놨다고 생각했는데 없네.

2009년 8월 14일 금요일

기술세미나 2009 Flex4 활용 및 UX 구현 테크닉

어제 2009년 8월 13일 Flex4 활용 및 UX 구현 테크닉을 주제로 세미나가 있었다. OkGosu.Net의 옥상훈님, 한국키스코의 배준균님 그리고 위콘 커뮤니케이션의 지용호님이 세미나를 진행 하셨다. 주제는 각각 UX 구현 테크닉, BlazeDS 활용, Flex 4의 새로운 기능에 대한 것이었다.

 

 

2009년 8월 13일 목요일

backgroundImage 늘리기

Flex에서 canvas에 backgroundImage를 지정할 수 있다. 그리고 canvas를 늘렸을때 backgroundImage가 canvas 크기에 맞춰서 자동으로 늘어나게 하려면 backgroundSize를 100%로 주면 된다.

2009년 8월 12일 수요일

PureMVC 사용에 대한 고민 4

Yakov Fain 중심으로 찾아가면 뭐가 많다. farata에서 공개한 Clear Toolkit을 대충 봤다. Enterprise Development with Flex: Best Practices for RIA Developers 사봐야겠다.

 

참고 :

+ Anti Flex Frameworks, Shall We? - http://www.flex888.com/768/anti-flex-frameworks-shall-we.html

+ Clear Toolkit - http://sourceforge.net/projects/cleartoolkit/

 

 

모르겠다. List의 Label 변경 시점에 변경된 Label 얻기

Flex에서 List에 editable="true"으로 주면 label을 편집할 수 있다. 그리고 itemEditEnd의 이벤트 핸들러를 지정하면 item이 변경되고 나서 event를 받을 수 있다.

 

그런데 이 이벤트에서 변경된 아이템의 label을 얻기위해 list.selectedItem으로 title을 얻어봤으나 얻어지지 않았다. 그래서 저장한 XML 일부가 반영되지 않았다.

 

급해서 저장시점에 list를 돌며 저장하는 방법으로 바꿨음.

Flex로 Design tool 만드려면

Flex로 Design tool 만들때 컴포넌트들을 리사이징하고 위치를 조정하기 위한 핸들러의 구현이 필요할 수 있다. MFC에서는 CRectTracker라는 것을 지원 했는데 Flex에서는 그런 것을 직접 지원하지는 않는다.

 

아래 주소의 라이브러리를 사용하면 이를 쉽게 구현할 수 있다.

 

http://code.google.com/p/flex-object-handles/wiki/ObjectHandlesUsage

2009년 8월 11일 화요일

dataProvider를 갖고있는 컴포넌트들

dataProvider를 갖고있는 컴포넌트들

 

ButtonBar
ColorPicker
ComboBox
DataGrid
DateField
HorizontalList
LinkBar
List
Menu
MenuBar
PopUpMenuButton
Repeater
TabBar
TileList
ToggleButtonBar
Tree

 

출처 : http://livedocs.adobe.com/flex/3/html/help.html?content=about_dataproviders_2.html

2009년 8월 4일 화요일

AIR에서 WebORB for PHP 사용

weborb\Weborb\WEB-INF\flex 위치에 remoting-config.xml, services-config.xml를 잘 변경해줘야 쓸 수 있다. services-config.xml에 my-air-amf 라는 게 있어서 봤더니 주소가 틀려서 접속이 안되더라.

 

remoting-config.xml 에 보면 아래와 같은 xml이 있다.

 

    <destination id="GenericAIRDestination">
        <channels>
          <channel ref="my-air-amf"/>
        </channels>   
        <properties>
            <source>*</source>
        </properties>
     </destination>

 

이 remoting-config.xml과 services-config.xml이 뭐 어떻게 꿍짝꿍짝 하나본데 급하게 하느라 WebORB에서 문서를 몇 번 찾아보다가 안보여서 그냥 "되는데 뭐~" 하면서 관뒀다.

 

destination의 id값은 RemoteObject의 destination 프로퍼티 값 혹은 RemoteObject 생성할 때 생성자의 첫 번째 인자로 지정해주는 값이다. source가 만약 com.example.app.FileSystemBrowser로 지정되어 있으면 weborb\Services\com\example\app에 있는 FileSystemBrowser.php 클래스를 사용하게 된다. 기타 다른 클래스가 또 있다면 아래와 같이 지정해주면 된다.

 

flash.net.registerClassAlias("com.example.app.FolderItem", FolderNode);
flash.net.registerClassAlias("com.example.app.FileItem", FileNode);
flash.net.registerClassAlias("com.example.app.FileSystemItem", FileSystemNode);

 

이렇게 해두면 flex에서 원격(WebORB for PHP로 구성된 웹서버)에 있는 SomeMethod(fileNode); 메소드를 호출하면 FileNode 타입을 서버에서 받아 그대로 사용할 수 있다. 어쨌든 비동기라 짜기 귀찮긴 하지만 XML 파싱하고 전송하고 받고 그런거 안하는 게 어디야.

label 텍스트에 그림자 넣어 효과주기

<mx:DropShadowFilter id="filter" distance="2" angle="45" alpha="1" color="#000000" />

<mx:Label text="Hello Blogger!" filters="{[filter]}" color="#FFFFFF" />

 

label 텍스트에 그림자를 주고 싶으면 위처럼 한다.

2009년 8월 2일 일요일

ProgressBar label 지정

ProgressBar의 label을 label="{sStatus} %1 of %2 bytes, %3%%" 이런식으로 지정하는 코드를 WebORB FileUpload 예제에서 봤다.

공포의 프로퍼티

컴포넌트에 프로퍼티를 만들고 프로퍼티를 mxml로 접근 해보고 싶었다. 런타임 에러가 났는데 이상하게 에러가 나면 리부팅 하기 전까진 해당 프로젝트는 빌드 후 실행이 안되는 거다. 결국 setter는 있는데 getter가 없던 것, 접근 지정자가 protected로 설정되어 있던 것, 데이터 타입이 String인데 Object로 받던 것을 고쳤더니 해결됐다. 프로퍼티를 protected로 하고 mxml에서 접근하려할 때 컴파일 에러가 났으면 좋았을텐데. 아무튼 나의 내공부족.

 

테스트

1. mxml에서 접근 할 프로퍼티를 public에서 protected로 고쳤더니 문제가 생긴다.

2. getter가 없어서 생긴 문제는 아니다.

2009년 7월 30일 목요일

Flash Media Interactive Server Feature Explorer

아래의 주소로 가면 AIR로 만든 Flash Media Interactive Server Feature Explorer를 다운 받을 수 있다.

 

http://www.adobe.com/devnet/flashmediaserver/articles/fmis_feature_explorer.html

Timer 생성

      _timerDown = new Timer(10);
      _timerDown.addEventListener(TimerEvent.TIMER, onDownTimer);
      _timerDown.start();

 

위와 같이 타이머를 실행하면 된다.

2009년 7월 29일 수요일

Adobe AIR 웹 도움말

Adobe® AIR® 1.5 Help on the web

http://help.adobe.com/en_US/AIR/1.5/devappsflex/

 

아래는 한국어로 번역된 것

 

Adobe® AIR™ 1.5 웹 도움말

http://help.adobe.com/ko_KR/AIR/1.5/devappsflash/

 

이걸 왜 지금 찾아갖고...

2009년 7월 27일 월요일

Air에서 Win32 Application execute 하기

Air에서 기본적으로 Win32 Application을 실행할 수 없다(Air 프로그램은 가능하다). 그래서 MFC로 소켓서버를 만들고 로컬서버에 Air로 그 로컬서버에 접속하는 클라이언트를 만든 뒤 소켓 데이타가 전송되면 MFC 쪽에서 프로그램이 실행되도록 만들었다.

Scrollbar postion이 지정되지 않을때

grid.verticalScrollPosition = 0;

grid.verticalScrollBar.scrollPosition = 0;

 

위는 되고 아래는 안된다.

 

참고 : http://forums.adobe.com/thread/424032

태도

가치, 유행, 효율 이런 것들로 이야기를 나누는 자리가 불편하다. 나는 그런 것들을 잘 알지 못한다. 모르는 것을 말하고 그 말에 책임감을 느껴야 하는 것이 불편하다는 것이다. 뭔가를 말해야 한다면 누구는 어떤 글에서 이렇게 말하더라 정도로 끝낸다. 적극적으로 보이면서도 책임을 피할 수 있다. 스스로 야비하다는 생각이 들때도 있다.

 

나는 소프트웨어 개발자다. 이것이 나의 배경이다. 내가 먹고 자고 입을 수 있게 하는 중심에는 내가 소프트웨어 개발자로 일하고 있다는 사실이 있다. 나는 회사가 요구하는 프로그램을 만들고 그것을 팔아 번 돈을 타며 생활한다. 이러한 방식으로 살아가는 사람들이 또 있고 그 사람들 사이에는 이 터전을 가꾸는 방법에 대한 고민이 있다. 이런 것에 대한 생각을 까보이는 것이 어렵다고 했지만 결국 나 또한 무언가가 옳다거나 더 괜찮을 것이라는 믿음을 갖고 산다. 내가 믿는 것들을 어떤식으로 증명하고 실현하느냐가 요즘 나의 가장 큰 고민거리다.

2009년 7월 23일 목요일

Air에서 애플리케이션의 타이틀바 지우는 방법

프로젝트를 생성하면 src 디렉토리에 만들어지는 xml 파일이 있다. 여기에 systemChrome 라는 엘리먼트가 있는데 주석을 해제하고 systemChrome의 텍스트 값을 none으로 지정해준다. 여기까지 하고 실행을 하면 타이틀바가 윈도우 타이틀 바에서 flex에서 지원하는 듯한 스타일의 타이틀 바로 바뀐다. 이 마저도 사라지게 하려면 mx:WindowedApplication 의 showFlexChrome 프로퍼티를 false로 바꿔주면 된다.

 

+ 했더니 메인의 배경으로 지정한 이미지가 사라진다.

Flex에 YouTube 붙이기

YouTube API에 공개된 Flash용 API는 AS2 기반으로 되어있다. Ben Longoria라는 사람이 이걸 AS3 프로젝트와 Flex에서 사용할 수 있게 래핑한 tubeloc클래스를 공개해놨다. 여기를 가면 나온다. 단점은 이 클래스를 사용하면 스테이지 위에 YouTube player를 한 개밖에 넣지 못한다는 것. 다른 방법으로 가능한지는 아직 모르겠다.

2009년 7월 22일 수요일

개기일식 사진

 

잘 안찍힌다. ㅎ

wmode 문제

wmode 라는 게 있는데 flash를 포함하는 호스트 애플리케이션 쪽에서 이 값을 transparent, opaque 등으로 지정할 수 있다. 이를 transparent로 지정하면 flash에서 Sprite가 없는 영역에 호스트 애플리케이션의 화면을 보여주게 된다.

 

회사 flex 프로젝트 중 한 개에서 문제가 발생했었다. 컨트롤 한 개가 스크롤링 되어 스크롤바가 생겼는데 스크롤을 하면 안쪽의 컨텐츠가 깨지는 현상이 발생했다. 문제는 wmode가 transparent 였기 때문인데 이 설정을 지워주니 해결됐다.

doubleClick 이벤트 받기

doubleClick 이라는 속성이 보이길래 이벤트 핸들러를 걸었겄만 이벤트가 발생하지 않았다. doubleClickEnabled 도 보이길래 true로 줬더니 그제사 이벤트가 발생핬다.

flash 호스트 애플리케이션 메소드 콜

import flash.external.ExternalInterface;

 

ExternalInterface.call("methodName", "인자", ... );

 

위와 같은 방법으로 자바스크립트의 methodName 메소드를 실행시킬 수 있다.

2009년 7월 20일 월요일

PureMVC 사용에 대한 고민 2

이번에 PureMVC를 안 쓴 프로젝트를 페어 하면서 배운 것.

 

+ 계층 구조가 복잡한 컨트롤 집합에서 한 쪽의 이벤트에 의해 다른 쪽이 바뀌는 경우 PureMVC는 notification을 쏘면 관련된 컨트롤이 알아서 반응 하지만 Flex만 사용하는 경우 여기서 쏘고 저기서 받아다 다시 쏴주고 이런식으로 해야 하는 것 같다. Flex 자체에서 지원되는 다른 방법은 없는 것 같다(확실하지 않음). 이를 직접 구현 가능하다 할지라도 PureMVC가 제공하는 무언가를 만드는 것이므로 이는 PureMVC의 장점이다.

 

+ 자료구조를 직접 구현하느냐 XML에서 e4x 등으로 사용하느냐 문제는 이전의 고민 에서 생각을 조금 바꿔야겠다. XML처럼 런타임에 데이터를 확인할 수 있는 구조는 테스트가 완벽하지 않으면 버그가 생겼는지 아닌지 알기 어렵다. 타입을 강조하면 컴파일 타임에 에러로 알 수 있는 장점이 있다. 가장 적당한 수준은 자료구조 직접 구현에 검색은 구조를 XML로 바꿔서 e4x로 검색하기 정도가 아닐까 싶다. 물론 아직 추측.

 

+ PureMVC에서 모델로 XML을 사용하고 notification으로 그 xml의 참조를 보내서 dataProvider로 연결하는 코드를 봤다. 뷰 컴포넌트의 dataProvider에 맞춰서 모델을 사용하면 모델 재사용성의 증가는 언제 말할 수 있을까?

 

배운 것이라고 시작하고선 또 질문만 잔뜩 만들었구나.

flex mouse wheel 이벤트

ui.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);

 

위와 같은 식으로 휠 이벤트를 받는다.

 

public function onMouseWheel(event:MouseEvent):void

 

위에서 event.delta 값이 음수, 양수 형태로 넘어오는데 그 값을 처리하면 된다.

flex 트리에서 여러줄로 보여주기

wordWrap="true"

variableRowHeight="true"

 

트리에 위 두 속성을 지정하면 된다. 글자 보여지는 공간이 좁아서 한 건데 tree 스타일에 indentation: 0; 을 주면 자식을 들여넣는 정도를 0으로 지정해서 공간이 넓어진다. 2 depth 밖에 없고 아이콘이 달라서 indent를 0으로 지정해도 볼만하다.

스크롤바 가장 밑으로 이동하기

1. callLater - 큐에 넣어 나중에 호출 됨

컨테이너에 생긴 스크롤을 아이템이 추가될 때마다 가장 밑으로 내리고 싶을때 영역 계산이 잘못돼서 스크롤바가 제대로 표현되지 않는 경우가 있었다. 해당 컨테이너의 updateComplete이벤트에 callLater를 걸어서 잠시 지연시켜 주면 정확히 이동된다.

 

2. outerDocument

outerDocument 는 itemRenderer에 넣은 것이 mxml에 있는 함수를 호출할 수 있는 유일한 방법. <mx:Component>로 싸면 독자적인 스코프를 갖게 되는데 그걸 포함하는 mxml을 얻을 때 outerDocument 를 쓴다고 한다.

 

페어하다 못한거 다른 분이 주말동안 해결한 내용인데 듣기만 한 거고 코드는 보지 못했음 ㅎ.

 

출처 : 이수석.

2009년 7월 15일 수요일

자뻑 성향과 말 섞지 않는다.

PureMVC 사용에 대한 고민

Flex에서 PureMVC를 사용하여 얻는 이득이 뭘까? iPhone 개발때 UIKit이라는 프레임워크를 사용한 경험이 있다. UIKit은 기본적으로 MVC를 지원하는 구조다. 그런데 PureMVC는 Objective-C용 포팅도 존재한다. MVC위에서 MVC 프레임워크를 사용한다는 게 무슨 의미일까? 기존 MVC는 MVC인거고 PureMVC만의 장점을 추가적으로 얻겠다는 것일까? 나와 비슷한 의문을 갖고 있던 사람의 글이 있다.

 

참고 : http://www.bit-101.com/blog/?p=1954 (Cliff는 다음 문장이 포함된 코멘트를 달았음 "Do I need a MVC framework such as PureMVC for developing an iPhone app? You don’t! Because Objective-C based already on a MVC paradigma.". Brian Knorr도 코멘트를 달았는데 어떻게 좋아졌다는 것인지는 잘 모르겠다.)

 

예전 iPhone 개발 경험에 비추어 생각한 거지만 나의 질문은 처음에 말한 것 처럼 Flex에서 모델과 뷰를 분리하는데 PureMVC가 주는 이득이다. 물론 PureMVC의 다른 장점도 있지만 이번 프로젝트를 PureMVC로 진행하면서 View를 표현하기 위한 컬렉션과 모델의 컬렉션 두 개를 유지하면서 문제가 있었다. 뷰 자체가 child 뷰들을 갖고 있는 리스트와 내가 모델에서 사용한 리스트의 행동이 달라서 생긴 것인데 차라리 뷰에 지정한 dataProvider를 모델로 사용하면 두 리스트의 내용을 동일하게 맞추기 위해서 고생을 할 필요가 없을 것 같다.

 

아직 잘 모르겠어서 글은 의문일 뿐이다. 머리로만 생각해서는 답을 잘 못내리겠다. 내가 이상하게 짜놓은 것과 비교를 한 것일 수도 있다. 코드좀 더 짜봐야지.

데이타 그리드 아이템 만큼 height 늘리기

rowCount="{dg.dataProvider.length}"

 

위처럼 mxml에서 지정하면 아이템이 데이타 그리드의 아이템 표현 영역보다 커져도 스크롤바가 생기는 게 아니라 그리드 크기가 커진다.

2009년 7월 14일 화요일

2009년 7월 13일 월요일

스타일 지정 속도개선

StyleManager.loadStyleDeclarations("assets/blue.swf");

 

위의 코드를 creationComplete에서 initialize로 옮기니까 깜빡임이 사라졌다.

Tree 컨트롤 텍스트 업데이트 하기

labelFunction을 사용하여 트리의 출력 문자를 지정하고 있다. 값이 바뀌면 update를 해줘야 하는데 tree의 dataProvider를 다시 지정해주면 된다. 이때 열려져 있던 tree들이 다 접혀버리는 문제가 있다. 이를 해결하기 위해서 tree의 openItems를 잠시 저장했다가 dataProvider를 지정하고 저장해둔 openItems를 복원하면 잘 된다.

TabNavigator, ViewStack 예외

TabNavigator 컨트롤을 사용하는데 보여지는 view가 아닌 곳을 참조하면 예외가 떴다. 남들은 어떻게 해결하나 찾아보니 creationPolicy라는 게 있다. 이 것을 all로 지정 해주면 자식 view들을 미리 생성하기 예외가 발생하지 않는다.

flex에서 xml embed 하기

참고 : http://blogs.ilog.com/elixir/2008/07/16/embedding-xml-in-your-flex-application/

Scrollbar가 생겼는지 확인하는 방법

크롬 자식에 박스를 그리는데 스크롤바 영역 위에까지 그려지는 버그가 생겼다. 스크롤바가 생겼을 경우에는 그 영역 위에서 박스가 그려지는 것을 막기위해 아래의 것들을 찾았다.

 

스크롤바가 생겼는지 확인하는 방법:

trace(control.verticalScrollBar != null ? "생겼음" : "안생겼음");

 

스크롤바 width 구하는 방법:

control.verticalScrollBar.width

 

어쩌면 크롬영역에 넣을게 아니라 UIComponent 를 어떻게 잘 해서 넣으면 될 것 같기도 하다. 아직 잘 모름.

flex Alert 기본 label 바꾸기

flex에서 alert의 버튼 label을 바꾸려면 아래처럼 코딩한다.

   Alert.okLabel = "확인";
   Alert.yesLabel = "예";
   Alert.noLabel = "아니오";
   Alert.cancelLabel = "취소";

2009년 7월 10일 금요일

WebORB for PHP

WebORB for PHP

 

http://www.themidnightcoders.com/products/weborb-for-php/overview.html

만들어 볼 것

생각

- 어떤 그룹들에 속해있는 아이템들의 추가, 삭제, 검색, 값 변경, 순서 변경을 하는 일이 많다.

- 어떤 행동이 시작될 아이템들은 선택되면 자신이 선택됐음을 mediator에 알리곤 한다.

 

필요

- 구현하면 위에서 말한 기능이 지원되는 컨테이너 interface 정의.

- 아이템이 자신의 소속을 쉽게 알릴 수 있는 추상적인 이벤트.

- model과 통신 자동화. XML 지원. 검색 지원.

2009년 7월 9일 목요일

Flex Panel 헤더에 UI 컨트롤 삽입

1.

디자인 요구사항에 패널 헤더에 버튼을 넣는 요구가 왔다. Flex Panel은 컨테이너이긴 한데 헤더에 뭔가를 넣을 수는 없어 보인다. 그래서 크롬 자식으로 버튼을 넣고 absolute position을 지정하니 원하는 위치로 이동했다. 버튼이 여러개 들어가기 때문에 HBox로 묶여진 버튼 묶음을 넣는 식으로 해결했다. 크롬 자식에 뭔가를 넣고 position을 지정하는 것은 ActionScript로 해야한다. 그렇다고 HBox에 쌓여있는 버튼을 ActionScript로 만들자니 귀찮아서 mxml에 컨트롤 묶음을 구현하고 크롬 자식 리스트에 addChild 할 때 그 묶음의 id를 지정하니 잘 이동됐다. 이미 존재하는 컨트롤을 다른 곳에 addChild 하면 복사가 아니라 존재하던 것이 이동을 한다.

 

2.

크롬 자식을 계속 얘기하다 보면 불쾌하지만 화를 낼 수도 없는 난처한 상황의 크롬이 떠오른다.

2009년 7월 7일 화요일

요구

일 오래 한다고 인정받는 것 아니니 남들 일하는 시간에 하는 게 좋을거라는 말과 이거 일정 내로 끝낼 수 있겠냐는 소리를 동시에 듣는다. 그 중에 내 업무진행과 학습과정을 파악하는 사람은 없다. 정작 나는 내가 하는 일의 근본적인 내용까지 파악하고 있는 사람에게 그만하겠다 소릴 하고 있으니 이상해 보이겠다는 생각이 들때도 있다. ㅎ

2009년 7월 5일 일요일

Flex Quiz 2

책을 이제 다 읽어서 퀴즈 낼 시간이 모자라다. 밤 샐 컨디션이 될까?

2009년 7월 3일 금요일

Flex Quiz

회사 상사와 주말동안 Programming Flex 3을 330페이지까지 읽고 서로 퀴즈를 내기로 했다. 1000문제를 내겠다.

Flex 배경 반복

Flex Style Explorer에서 반복되는 배경은 swf로 만들어져 있었다. 이미지를 반복시키는 방법을 찾다가 degrafa라는 오픈소스 라이브러리를 발견했다. 여기서 다운받은 swc를 라이브러리 디렉토리에 넣어주고 css에서 Application을 아래처럼 만들어주니 배경 이미지가 반복된다.

 

   background-image:Embed("assets/doc.png");
   background-repeat:repeat;
   borderSkin:ClassReference("com.degrafa.skins.CSSSkin");

 

참고 : http://www.degrafa.org/

2009년 7월 2일 목요일

senocular.com ActionScript Library

flash에서 아직 지원되지 않는 기능을 찾다가 발견한 사이트

 

참고 : http://www.senocular.com/flash/actionscript.php

플렉스 스타일 익스플로러

플렉스 스타일 익스플로러(Flex Style Explorer)를 사용하면 UI 컴포넌트들의 스타일을 변경하며 결과를 바로 확인하고 CSS 코드를 얻을 수 있다.

 

참고 : http://examples.adobe.com/flex3/consulting/styleexplorer/Flex3StyleExplorer.html

2009년 6월 29일 월요일

mxml이 interface를 구현하려면?

root tag의 implements 속성에 interface명을 넣어주면 된다.

 

implements="Interface1,Interface2"

2009년 6월 25일 목요일

flex 컴포넌트에 sprite 넣기

flex 컴포넌트에 sprite를 넣으려면 다음처럼 하면 된다.

 

component.rawChildren.addChild(sprite);

AS3.0 화면객체 밖에서 Mouse UP 된 것을 알아내기

1. Down 됐을때 stage에 addEventListener로 MOUSE_UP 이벤트 리스너를 추가한다.

2. 1.에서 만든 이벤트 리스너에서 removeEventListener 해준다.

 

참고 : http://anilmathewm.blogspot.com/2008/01/event-handling-in-actionscript-30.html

2009년 6월 22일 월요일

PureMVC에서 Popup은 어떻게 다룰까?

PopManager 라는 게 있다. PureMVC 내부에 있는 건 아니고 따로 구현해야 한다. PopUp을 생성하면서 Mediator와 연결시켜 준다.

 

참고 : http://forums.puremvc.org/index.php?topic=105.0

ApplicationControlBar에서 정렬

flex에서 ApplicationControlBar의 왼쪽과 오른쪽에 컨트롤을 두고 싶을때가 있다. 이때 가운데 공간을 넣는 쉬운 방법이 있다. <mx:Spacer width="100%">를 중간에 삽입하면 된다.

2009년 6월 21일 일요일

Flex에서 이미지를 부드럽게

읽어들인 Image를 리사이징 하고 부드럽게 바꾸려면 Image컨트롤에 대해서 complete 이벤트에 아래 이벤트 핸들러를 실행시키면 된다.

 

protected function onImgLoadComplete(event:Event):void

{

    var bitmap:Bitmap = ( event.target as Image ).content as Bitmap;

   
    if ( bitmap != null )

        bitmap.smoothing = true;

}

XML이냐 Array냐

Array로 구성한 트리를 마구 돌아다니다가 "XML 노드들을 기본 클래스로 바꾸고 Array 같은 기본 컬렉션에 담는 것"이 과연 좋은 일인지 생각하게 됐다.

 

처음에는 바꾸는 게 좋다고 생각 했다. XML 구조가 바뀌어도 오브젝트의 프로퍼티들을 바꿔주면 컴파일 타임에 문제가 생기는 위치를 알 수 있었다. 컴파일 에러가 나는 위치로 가서 코드를 고쳐주면 간단했다.

 

타입을 명확히 하여 생긴 이득이다. 소트웍스 앤솔러지에서도 보면 원시값은 아무 의미 없는 스칼라 값이며 의미를 분명히 하는 데 노력하라고 써있다. 날짜를 받기위한 매개변수 when을 int 타입으로 설정하면 누군가는 날짜 대신에 시간을 넣을지도 모를 일이다.

 

그러나 기본 컬렉션의 단점도 있다. 자료구조를 검색, 수정 하려니 만만치 않다. Flash에서는 DB를 지원하지 않아서 불편하다. MFC 할 때도 웬만한 자료구조는 기본 컬렉션을 쓰지 않고 SQLite로 처리했다. 검색, 수정, 추가등이 편리하기 때문이다.

 

Flash에서 XML, 특히 E4X로 XML을 다루면 자료구조를 어느정도 쉽게 다룰 수 있을거라고 생각된다. XML만 사용하고 타입이 모호해지는 문제(런타임에서야 문제를 확인할 수 있는 단점)는 테스트를 강하게 하는 쪽으로 해결하는 게 더 효율적일 것 같다.

 

아직 추측이니 XML 쓰면서 익혀봐야겠다. 당장에 객체에 해당하는 XML 노드에 행위(메소드)를 부여하려고 하면 XML은 불편해 보인다.

 

참고 :

(1) http://www.actionscript.org/forums/showthread.php3?t=156040

(2) http://norman.walsh.name/2003/06/01/xmlnotoo

(3) http://stackoverflow.com/questions/719674/hierarchy-data-structure-in-java-or-xml-to-object-conversion-best-practices

2009년 6월 19일 금요일

마지막 시험

11시에 마지막 시험을 본다. 컴퓨터 구조. 시험 끝나면 flash로 커뮤니티 사이트 하나 만들 생각이다.

2009년 6월 10일 수요일

블로거 시국 선언문.

6월항쟁 22주년을 맞는 오늘 우리 블로거들은 다시 민주주의와 사회적·경제적 정의를 고민한다.

 

이명박 정부 출범 이후 표현의 자유와 언론의 독립성이 크게 훼손되고, 인터넷에 대한 통제가 심각한 수준에 이르고 있다. 이명박 정부는 헌법에 보장된 집회와 시위의 자유를 사전적·포괄적으로 봉쇄하여 국민의 알 권리와 말할 권리를 모두 틀어막으려 하고 있다. 경제적 양극화가 날로 심화되고 있고 노동자와 서민, 사회적 약자들은 벼랑 끝으로 내몰리고 있다.

 

우리 블로거들은 다음을 요구한다.

1. 정부는 언론 장악 시도를 중단하고 국민들의 표현의 자유를 폭넓게 보장해야 한다.
2. 정부는 민주주의를 지탱하고 대의절차의 왜곡을 보완하는 기본권인 집회·결사의 자유를 폭넓게 보장해야 한다.
3. 정부는 독단적인 국정 운영을 중단하고 사회적 약자 및 소수자의 목소리에 진지하게 귀기울여야 한다.

 

대한민국 블로거 구준호.

 

참고 : http://www.leejeonghwan.com/media/archives/001516.html

2009년 6월 9일 화요일

PureMVC MultiCore에서 AppSkeleton 문제 해결

PureMVC AS3 Standard에 보면 App Skeleton 예제가 있다. 이 예제는 MultiCore로 바꾸면 문제가 된다. 원인은 이렇다.

 

총 3개의 Proxy들이 등록되는데 두 개의 Proxy는 나머지 한 개의 Proxy를 retrieveProxy로 얻으려고 한다. 이때 생성자에서 facade를 사용하는데 Standard는 ApplicationFacade가 Singleton이기 때문에 문제가 없다. 하지만 MultiCore에서는 Proxy나 Mediator가 register되기 전에 facade를 호출하면 key를 알 길이 없어서 죽어버린다.

 

좌절은 금지다. 잘 찾아보니 onRegister() 라는 메소드를 오버라이드 할 수 있다. 이 메소드를 오버라이드 하면 Proxy나 Mediator가 등록될 때 onRegister()가 호출된다. 여기에 facade를 사용하는 코드를 넣으면 된다. 문서에선 이게 무슨 의미인지 아직 정확히 안써놔서 몰랐었는데 결국 알게됐다. 이런건 꼭 퇴근시간 지나면 자연히 알게 되더라. 철야.

PureMVC의 proxy를 flexunit으로 테스트 하기

죽음의 테스트를 완벽하게 통과한 튼튼한 모델이라 할지라도 PureMVC 상에서 메세지를 잃게되면 프로그램은 먹통으로 보이게 된다. 맘편하게 Notification처리 구조를 바꾸고 싶다면 어떻게 해야 할까? Notification에 대한 테스트를 만들어야 한다. flexunit은 순수한 ActionScript3 이벤트는 테스트 할 수 있어도 PureMVC의 Notification을 이해하지 못한다. 해서 나온 것이 이것이다. http://code.google.com/p/puremvc-flexunit-testing/

 

사용법

1. 라이브러리를 추가하고 PureMVCTestCase를 상속받는 TestCase를 만든다.

2. TestCase 내부에 테스트를 하고자 하는 proxy와 view를 얻는 getter를 만든다.

 

  public function get proxy():MyProxy
  {
   return ApplicationFacade.getInstance(ApplicationFacade.NAME).

      retrieveProxy(MyProxy.NAME) as MyProxy;
  }
 
  public function get view():IView
  {
   return View.getInstance(MyMediator.NAME);
  }

3. registerObserver(view, proxy, MyProxy.INIT, OnInit, 1000); 이런 식으로 테스트 안에서 실행 시킨다.

4. public function OnInit(event:PureMVCNotificationEvent):void 이렇게 받는다.

 

컴파일 된 라이브러리를 받아다가 프로젝트에 적용하니 multicore쪽 패키지를 찾으려고 했다. 코드 볼 시간이 없어서 그냥 PureMVC를 Standard에서 Multicore로 바꾸고 프로젝트 구조를 example 따라서 바꿨더니 쉽게 됐다.

 

참고 : http://marburger.cc/posts/flexunit-testing-puremvc-code

2009년 6월 8일 월요일

flexunit으로 event 테스트하기

1. 테스터를 만들때 TestCase 대신 EventfulTestCase를 상속받는다.

2. listenForEvent(이벤트Dispatcher, 이벤트타입, 발생할 것으로 예상하면 true 아니면 false);

3. dispatchEvent()

4. assertEvents(); 하면 2번에서 기대한 이벤트가 3번을 통해 발생됐는지 확인된다. 만약 2번에서 3번째 인자를 false로 했는데 이벤트가 감지되면 테스트가 실패한다.

 

연습삼아 해봤다. 별로 쓸모 없지만 custom event 자체를 테스트 해보려고 EventfulTestCase에서 IEventDispatcher를 구현하고 필요한 메소드들을 오버라이드 했다. 이벤트 발생시 이벤트를 통해 넘어온 값들을 바꾸고 테스트 쪽에서 해당 값이 잘 들어왔는지 assertEquals 테스트도 해봤다.

프로젝트 진행 상황

헤헤.

2009년 6월 7일 일요일

dispatchEvent로 Event 전송시 추가적인 오브젝트 보내기

1. Event를 상속받은 custom event를 만든다.

2. 생성자로 추가로 전송하기 원하는 오브젝트들을 받는다.

3. 생성자에서 이벤트의 멤버로 받은 오브젝트들을 저장한다.

4. clone()을 override하고 new CustomEvent를 return한다.

5. dispatchEvent에서 custom event를 사용한다.

6. 이벤트 핸들러에서 custom event로 받고 event 멤버의 값을 사용한다.

ActionScript Event Bubbling

여러 아이템을 갖고있는 Sprite가 있다. 아이템에 뭔가가 drop되면 이벤트를 발생시켜서 Sprite를 사용하는 시스템이 drop 된 사실을 알 수 있어야 한다. drop 이벤트 처리는 아이템 객체들이 각자 처리하기 때문에 이벤트를 부모의 부모가 받아야 하는 상황이다. Sprite가 중간에 뭔가 해야하잖아? 설계가 후져서 생긴 일이라고 좌절하려던 찰나 dispatchEvent에서 bubble을 true로 했더니 부모의 부모가 알아서 받더라. 땡큐 어도비.

ActionScript 달에 몇 일이 있는지 얻는 방법

 

new Date(year, month, 0).getDate() as int;
위의 코드처럼 하면 된다. month는 0~11을 입력하게 되는데 3월을 알고 싶을때 month에 2를 넣으면 3월로 취급한다. date는 1~31까지인데 0을 넣었으므로 하루 전 날. 즉 month월의 마지막 날이 된다. 마지막 날은 그 달에 있는 일 수와 같다.

TDD는 Unit Test가 아니다

내가 테스트를 만들고 있기는 한데 TDD는 아니라는 생각이 들어 그 차이가 무엇인지 짚어본 사람이 있을까 있어 찾아봤다. http://stephenwalther.com/blog/archive/2009/04/11/tdd-tests-are-not-unit-tests.aspx

2009년 6월 6일 토요일

Flexunit UI testing

링크 : http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=2&postId=7222

 

화면 객체를 flexunit으로 테스트 하려다 보니 오류가 났다. 방법을 찾아봤더니 위의 링크가 나왔다. 다 읽지는 않고 소스만 잠시 봤는데 Application.application을 얻는 방법이 나오는 것 같아서 setUp()에서 application에 테스트 하려는 화면 객체를 addChild하고 tearDown()에서 화면 객체를 removeChild 했더니 잘 된다.

mxml에서 script를 별도 파일로 빼내기

mxml에 ActionScript 코드를 바로 삽입 할 수도 있지만 아래처럼 할 수도 있다.

<mx:Script source="SomeFile.as" />

주의 사항이 있다. Haha.mxml파일은 Haha 클래스를 의미하기 때문에 Haha.as파일을 만들면 동일한 클래스가 두 개 존재하는 것으로 보고 오류를 낸다.

 

코드를 분리하니 스크롤 영역이 줄어들어서 파일을 한 번에 파악하기 좋고 ASDoc 태그를 사용할 수 있어서 좋다. mxml용 ASDoc 태그는 나중에 지원되는 것으로 보인다.

2009년 6월 5일 금요일

Flex tree 아이템 drag

온라인 상의 예제를 보고 Tree 드래그 드롭을 구현했다. dragDrop의 핸들러로 dragDropHandler을 지정하고 dragDropHandler에서 아래와 같이 코딩했는데 자꾸 죽더라.

 

var items:Array = dragSource.dataForFormat("items") as Array;

 

dragSource의 멤버들을 보니 formats라는 배열이 있길래 봤더니 말그대로 format 종류들을 리턴해줬다. treeItems라는 것으로 들어 있길래 위의 items를 treeItems로 바꿨더니 잘 된다.

 

items의 값 안에 뭐가 들어있는 지도 문제였다. 한 개의 값을 꺼내서 toLocaleString()으로 찍어보니 XML이었다. XML로 형 변환 하고 tree에서 dataProvider로 지정한 XML에 맞춰 attributes를 꺼내서 찍어보니 잘 들어온다.

 

이런 종류의 삽질은 경험으로 다 해결해야 하는 건가? 스트링에 뭐가 들어갔을줄 알고. 요즘 디버거가 작동이 안되는데 디버거로 보면 좀 자세히 나오려나. 책 한 권 살까? 휴=3

 

참고 : http://www.adobe.com/devnet/flex/quickstart/adding_drag_and_drop/

Flash에서 비동기로 얻어오는 XML파일 순서대로 여는 방법

Flash에서 몇 개의 XML을 읽을 때 1번 파일에서 얻은 값을 2번을 읽는데 사용하는 경우가 생길 수 있다. 문제는 XML을 비동기로 호출하니 1번은 다 얻어오기 전에 2번을 읽으려고 한다는 것.

 

PureMVC의 App Skeleton에서는 리소스 목록을 관리하는 StartupMonitorProxy에 XML파일 하나를 대표하는 Proxy들을 추가하여 Proxy가 생성되는 순서대로 XML을 얻어오게 하는 코드가 있다.

 

물론 내가 뛰어난 실력으로 그런 것들을 한 눈에 파악한 것은 아니고. 아무 생각없이 지웠다가 안되길래 다시 보며 파악한 것. ㅎ 집에 가고싶다.

2009년 6월 4일 목요일

Flex UI Testing

flexmonkey라는 툴이 있는데 사용자가 flex상에서 한 행동들을 레코딩 해서 다시 플레이 하는 형태의 테스트를 제공한다.

ActionScript E4X에서 attribute 값으로 찾기

아래처럼 찾으면 전체 course 중에서 id attribute가 4인 값을 찾는다.

var course:XMLList = treeData..course.(@id == 4);

 

이때 해당 course가 없으면 오류가 나므로 위의 줄을 사용하기 전에 개수를 확인해 주면 좋다.

var length:int = treeData..course.(@id == courseId).length();

 

위의 값이 0이면 사용하지 않는다.

2009년 6월 3일 수요일

Ant에서 ASDoc 실행

build.xml에서 exec 형태로 ASDoc을 실행시키는 것 같다. 명령창에서는 잘 되는데 어찌된 일인지 Ant로는 잘 안됐다. 그래서 명령창에서 실행시킨 명령어를 batch 파일로 만들고 그걸 Ant에서 exec로 실행시키니 된다.

ASDoc 실행

"C:\Program Files\Adobe\Flex Builder 3\sdks\3.2.0\bin\asdoc"

 

-source-path "원하는 Flex 프로젝트의 src 디렉토리"

 

-external-library-path "원하는 Flex 프로젝트의 libs 디렉토리"

 

-doc-classes "package를 포함한 클래스명"

(최상위 디렉토리의 MXML Application 이름(이게 클래스 명이니까)으로 해도 된다.)

 

-main-title "main title"

 

-window-title "window title"

 

-output flex-framework-asdoc

 

pause

위처럼 하니 된다. -doc-classes 에 com.domain... 이런 식으로(여러 개라면 띄어쓰기로 구분)해서 클래스를 지정하면 된다. 지정된 클래스와 관련된 클래스는 다 문서화 되나 보다. 최상위에 존재하는 MXML Application 파일의 이름을 지정하면 프로젝트 전체에 대한 도큐먼트가 생성된다.

 

외부 라이브러리를 사용하면 -external-library-path를 지정한다. 나의 경우에는 PureMVC를 libs에 넣고 사용하기 때문에 그 위치를 넣어줬다.

 

프로젝트에서 mx:AdvancedDataGrid를 사용하는데 그 부분에서 에러가 났다. 구글에서 찾아보니 flex sdk에 포함되어 있는 asdoc을 사용해서 그렇다. flex sdk에는 mx:AdvancedDataGrid가 포함되어 있지 않다. 그래서 Flex Builder 안에 있는 asdoc을 실행시켰더니 잘 된다.

PureMVC에서 Proxy 클래스 만들기

PureMVC에서 Proxy 클래스를 어떻게 구성해야 할지 생각해봤다. 다수의 아이템들을 포함하는 배열과 같은 구조를 만든다고 하면 배열 클래스와 아이템 클래스들 모두 Proxy여야 할까 배열 클래스만 Proxy고 아이템 클래스는 일반적인 클래스로 해야 할까?

 

처음에는 한 개의 아이템이 바뀌면 Notification이 전송되고 그 아이템에 해당하는 UI상의 한 요소가 자동으로 바뀌는 모양을 생각했다. 즉 아이템도 Proxy로 만드는 구조를 생각했다. 그런데 예제들 중 동적으로 생성된 Proxy에 이름을 부여하는 예제는 못본 것같다. PureMVC는 모델을 얻어오건 Notification 종류를 분류하건 동적으로 생성된 인스턴스의 이름을 알아야 얻을 수 있는데 정적으로 되어 있는 경우만 봤다. 동적으로 생성된 모델의 이름을 뷰 등에서 알 수 있게 하는 방법도 편해 보이지는 않는다.

 

아직 깊이 생각을 못해봤지만 Proxy는 시스템 상에서 한 개로 존재하는 값들을 저장하는 공간이 되어야 할 것같다.

2009년 6월 1일 월요일

Adobe Flex Builder 3 + Ant

+ Ant로 컴파일

가능. 이클립스 플러그인으로 설치. 쉽게 사용가능. CI를 위해서는 Stand-Alone으로 설치해야 하나?

 

+ Ant로 테스팅

Ant로는 FlexUnit 아직 실행 시키지 못했음. 그냥 FlexUnit은 쉽게 됨.

 

+ Ant로 ASDoc 생성

ASDoc 만드는 커맨드 명령어를 Ant에서 exec로 등록해서 쓰면 됨.

 

+ 결론

CI용 컴퓨터 구입하기 전까지는 FlexUnit이랑 ASDoc 정도만 사용한다.

2009년 5월 8일 금요일

텍스트큐브 블로그 개설

구글 우수 블로거 지원 프로그램
안그래도 텍스트큐브로 블로그를 만들어야겠다고 생각했는데 이벤트를 하는 게 아닌가.