매우 유용한 자료를 발견했다.

GoF의 디자인 패턴을 포스트 형태로 만들어놓은 것이다.

아래와 같은 형태로 보여주고 있다.

Page 1.

Page 2.

아래 링크로 PDF파일을 다운로드 받을 수 있다.

designpatternscard.pdf

자료출처 : http://www.mcdonaldland.info/2007/11/28/40/

글쓴이 : 지돌스타(http://blog.jidolstar.com)

예전부터 Flex4 프로젝트의 일환인 Gumbo를 다운로드를 받았지만 쓸 기회가 없어서 안쓰다가 Flash Player 10에서 3D 회전 예제가 있어서 한번 해봤다.

Flex Builder 3에서 작업을 하기 위해 수행해야할 일은 다음과 같다.

1. Gumbo 최신버전을 다운받는다. [다운로드 받으러가기]

2. 다운로드 받는 Flex 4 SDK를 Flex Builder 설치폴더안에 sdks 폴더에 압축하여 풀어준다.

3. Flex Builder 3를 실행해서 메뉴에 Windows->Preperences...에 들어가면 창이 뜬다. 창 왼쪽에 Flex->Installed Flex SDKs를 선택한 다음 아까 압축을 푼 SDK폴더를 등록한다.

4. File->New->ActionScript Project를 선택하면 창이 뜬다. 창 아래부분에 Use a specific SDK를 선택한다음 Flex 4를 선택하고 프로젝트 명을 CubeRotationExample로 프로젝트를 만든다.

5. 아래 소스를 복사해서 메인 소스에 덮어쓴다.

 

package{
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
 
	public class CubeRotationExample extends Sprite {
		
		private static const EDGE	:Number = 40;		//edge length
		private var mtxWorld		:Matrix3D;			//world transform matrix
		private var vCube			:Vector.<Number>;	//cube points
		private var vFlatCube		:Vector.<Number>;	//projected cube points
		private var vUVT			:Vector.<Number>;	//uvt data
		private var vIndicies		:Vector.<int>;		//triangle indicies
		private var sprCube			:Sprite;			//canvas object
		
		public function CubeRotationExample(){
			// setup and initialize
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.quality = StageQuality.BEST;			
			
			mtxWorld = new Matrix3D();
			vCube = Vector.<Number>([	EDGE,EDGE,-EDGE,
				 						EDGE,-EDGE,-EDGE, 
										-EDGE,-EDGE,-EDGE,
										-EDGE,EDGE,-EDGE, 
										EDGE,EDGE,EDGE,
										EDGE,-EDGE,EDGE,
										-EDGE,-EDGE,EDGE,
										-EDGE,EDGE,EDGE
										]);
			vFlatCube = new Vector.<Number>(16);
			vUVT = new Vector.<Number>(24);
			vIndicies = Vector.<int>([0,1,2, 2,3,0, 4,7,6, 6,5,4, 0,4,5, 5,1,0, 1,5,6, 6,2,1, 2,6,7, 7,3,2, 4,0,3, 3,7,4]);
			
			sprCube = new Sprite();
			addChild(sprCube);

			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function onEnterFrame(eo:Event):void {
			// center the cube
			sprCube.x = stage.stageWidth/2;
			sprCube.y = stage.stageHeight/2;
			
			// rotate the transform matrix
			mtxWorld.appendRotation(2, new Vector3D(0,1,0));
			mtxWorld.appendRotation(2, new Vector3D(0,0,1));
			mtxWorld.appendRotation(2, new Vector3D(1,0,0));
			
			// project 3D data to 2D plane
			Utils3D.projectVectors(mtxWorld, vCube, vFlatCube, vUVT);
			
			// draw the cube using cube data
			sprCube.graphics.clear();
			sprCube.graphics.beginFill(0xFF00FF);
			sprCube.graphics.lineStyle(1,0xFF0000,1);
			sprCube.graphics.drawTriangles(vFlatCube, vIndicies, null, TriangleCulling.POSITIVE);
			sprCube.graphics.endFill();
		}
	} 
}

 

6. 저장하면 에러가 날거다. Flash Player 10에서 작동하므로 그에 따른 설정을 해주어야 한다. 메뉴에서 Project->Properties 로 들어가면 창이 뜬다. 왼쪽메뉴에 ActionScript Compiler를 선택하고 오른쪽 아래 Require Flash Player version을 10.0.0으로 맞춰준다.

7. 실행한다.(단 Flash Player 10이 설치되어 있어야 한다.)


[실행화면]


다시한번 언급하지만 Flash Player 10 환경에서만 된다.

위의 소스를 보면 예전 ActionScript 3.0에서 볼 수 없었던 것들이 보인다.
Vector, Matrix3D, Util3D등이다. Papervision3D와 같은 것을 쓰지않아도 쉽게 네이티브 코드로 3D를 구현할 수 있게 한 Flash Player 10. 아직 다양한 표현을 위한 많은 API를 가지고 있지 않지만 더욱 발전될 가능성이 크다고 생각한다. 기대해보겠다.

[소스출처]
http://dispatchevent.org/calebjohnston/flash-player-10-3d-example/

글쓴이 : 지돌스타(http://blog.jidolstar.com/421)

제가 직접 참여해서 만든 사이트 홍보입니다. ^^

Flex/Flash로 개발을 담당했고요~~

스타플에서 홍보이벤트 중입니다.

1등 문화상품권(10만원)+스타플 카드지갑 입니다.

여러분도 도전해보심이 어떨까요?


Starpl. 밤하늘의 별을 당신에게 드립니다.

밤하늘의 별을 주는 재미있는 서비스가 있어 소개합니다.

스타플은 실제 별 관측 데이터를 이용해서, 정말 존재하는 별 중에 하나를 나에게 준답니다.
나의 별에다가 나의 이야기를 담고, 우주를 여행하며 사람들도 만나는 흥미로운 서비스에요.

별찾기 성향테스트

나만의 별을 찾아라!

회원가입을 누르면, 성향 테스트를 거쳐 나만의 별을 받게 됩니다.
그림으로 푸는 성향테스트가 독특하고 재미있어요.

예시 별 1. 예시 별1의 타임라인

나를 담는 별

별을 방문한 모습입니다. 별 위에 보이는 바가 타임라인이라고 하는 건데,
타임라인에 추억과 일상, 생각 들을 기록할 수 있습니다. 글을 쓸 때 시간을 설정하거나, 첨부사진의
촬영시간을 적용하면 그 때 그 시간의 타임라인에 글이 쓰여져 내 인생의 히스토리를 만들 수 있어요.
블로그를 가지고 있다면, 블로그를 타임라인에 등록하여 새 글이 자동으로 타임라인에 담기게 할 수도 있어요.

예시 별 2. 예시 별3.

나의 취향대로 꾸미는 나만의 별

여러 별들의 모습입니다. 스타플에는 나만의 별을 꾸밀 수 있도록 다양하고 예쁜 아이템과 위젯들이 많습니다.
아이템은 별가루로 구입할 수 있는데, 별가루는 처음에 가입하면 왕창 주는데,
다 써 버려도 스타플 사용하다보면 저절로 계속 쌓이더라구요. ^^

스타플 별지도

다른 별들을 만날 수 있는 공간, 별지도

별지도에 가보면 많은 별들이 있습니다. 저 별들에도 다 사람들이 살고 있다고 생각하니 신기하네요.
별지도 위의 상단메뉴를 클릭하면
다른 별들이 남긴 기록들을 볼 수가 있는데요, 말풍선을 클릭하니 그 별로 방문이 되는군요.

똑똑한 소식 배달부 알림이

별지도 왼쪽에 알림이를 통해 나의 별친구들의 새 기록과 댓글, 생일 등의 소식들을
바로 바로 알려줘서 알림이에서 손을 땔 수가 없더라구요.
또, 관심 가는 별이 있으면 관심별로 등록해 알림이로 쉽게 받아 볼 수 도 있답니다.

너무 너무 이쁘고 개성 넘치는 스타플!
나만의 별을 받고 싶으신 분들, 나의 이야기를 담을 특별한 공간을 찾으신 분들께
꼭 추천해드리고 싶은 서비스입니다.

별증서

나의 별임을 인증하는 별증서 이벤트도 진행 중이니, 한번 방문해 보세요.

스타플 방문하기

Adobe Flex를 접할때 어려워하는 부분중에 하나가 Event입니다.
깊숙히 이해하려고 할때 잘 이해가 안되는 부분이 많은게 이벤트죠.

기본에 충실해야한다!
프로젝트(http://starpl.com)를 하면서 많이 느꼈습니다.
처음 Flex 접했을때 가장 어려움을 겪었던 것은 기본이 탄탄하지 못한 것으로부터 였습니다.
그래서 Flex와 함께 ActionScript 3.0의 기본 문법 및 대략적 내용을 이해해야한다고 생각합니다.
단순한 문법뿐 아니라 분석/설계에도 관심을 가지고 공부해서 명확하고 깨끗한 프로그램을 만들 수 있도록 노력해야겠구요.

아래는 Event에 대한 질문을 걸어놓고 스스로 답변까지 해두었습니다.
이것으로 Event 전부를 설명할 수 없지만 몇가지 궁금한 사항을 이해하는데는 도움이 될겁니다.
그냥 읽고 지식만 얻어가지 마시고 없는 질문이 있다면 스스로 질문/답변을 댓글로 달아주시면 더욱 고맙겠습니다. 잘못된 내용이나 추가해야한다는 것도 포함합니다.


1. ActionScript 3.0 이벤트(Event)

1.1 ActionScript 2.0과 3.0에서 이벤트가 바뀐점은?

  • ActionScript 2.0에서는 이벤트 리스너를 추가하는 경우 상황에 따라 addListener() 또는 addEventListener()를 사용하지만 ActionScript 3.0에서는 항상 addEventListener()를 사용합니다.
  • ActionScript 2.0에는 이벤트 흐름이 없으므로 이벤트를 브로드캐스팅하는 객체에서만 addListener() 메서드를 호출할 수 있지만 ActionScript 3.0에서는 이벤트 흐름에 포함된 모든 객체에서 addEventListener() 메서드를 호출할 수 있습니다.
  • ActionScript 2.0에서는 함수, 메서드 또는 객체를 이벤트 리스너로 사용할 수 있지만 ActionScript 3.0에서는 함수 또는 메서드만 이벤트 리스너로 사용할 수 있습니다.
  • on(event) 구문은 이제 ActionScript 3.0에서 지원되지 않으므로 ActionScript 이벤트 코드를 무비 클립에 첨부할 수 없습니다. 이벤트 리스너를 추가할 때는 addEventListener()만 사용할 수 있습니다.


1.2 Event를 사용해야하는 이유? 2가지 이상

  • 객체간 강한 결합 해결 : 애플리케이션 설계시 Callback함수를 사용하는 등의 강한결합을 이용하는 경우 유지보수 및 확장이 어려워지는 경우가 크다. 이벤트는 객체간 느슨한 결합을 해주는데 큰 힘을 발휘할 수 있다.
  • 작업에 대한 일관성 없는 응답 : 동기적 방식과 비동기적 방식에 대한 응답에 대한 처리를 이벤트를 사용하지 않는 경우 서로 다른 방법을 선택해서 사용해야한다. 이벤트는 1가지 방법으로 응답처리를 가능하게 해준다.


2. Event의 구성요소 3가지는 무엇이고 의미를 설명하라.

  • 이벤트 객체(Event Object)
    flash.net.Event의 객체나 이를 확장한 이벤트 객체를 의미한다. 이벤트 객체에는 이벤트에 대한 정보가 들어가있다. 이벤트의 종류(Type)과 이벤트를 발생한 객체(target)에 대한 정보가 포함된다.
  • 이벤트 발생자(Event Dispatcher)
    이벤트를 발생(broadcast)하는 객체이다. 이벤트 객체에 target으로 이벤트 발생자 정보가 담긴다. flash.net.EventDispatcher를 확장한 모든 객체는 이벤트 발생자가 될 수 있다. EventDispatcher의 dispatchEvent() 메소드에 이벤트 객체를 담아 실행하면 이벤트가 발생하게 된다.
  • 이벤트 청취자(Event Listener)
    일종의 메소드 또는 함수이다. 발생한 이벤트를 듣는 역할을 한다. EventDispatcher클래스를 확장한 클래스의 객체에서 addEventListener()을 이용해 이벤트 청취자를 등록할 수 있다. addEventListener()을 이용하면 청취할 이벤트의 종류(type)을 결정할 수 있으며 청취할 이벤트 흐름(capture,target,bubbling) 및 우선순위등을 선택할 수 있다.


3. Event Listener를 등록/삭제하는 방법을 기술하라.

  • 등록
    EventDispatcher의 addEventListener() 메소드를 이용한다.
    예)
    var button:Button = new Button();
    button.addEventListener( MouseEvent.CLICK, onClick, false );
    public function onClick( event:MouseEvent )
    {
      trace( event.type, event.target  );
    }
  • 삭제
    EventDispathcer의 removeEventListener() 메소드를 이용한다.
    예)
    button.removeEventListener( MouseEvent.CLICK, onClick, false );
    3개의 인자가 addEventListener()를 사용할때와 같아야 정상적으로 이벤트 청취자 등록이 삭제된다.
    참고로 맨 마지막 인자는 useCapture이다.


4. Event 전파단계의 종류 3가지가 무엇이며 각각에 대한 설명

  • 이벤트 전파단계의 종류 : 캡쳐(capture) 단계, 타겟(target) 단계, 버블(bubble)단계
  • 이벤트 전파 순서 : 캡쳐->타겟->버블
  • 캡쳐 단계
    루트(root) 디스플레이 객체서부터 이벤트를 발생한 객체(target)까지 디스플레이 객체 리스트(display Object List)를 따라 검색해나가는 단계이다. 즉, 부모->자식으로 이벤트를 전파한다. 이 캡쳐 단계에 이벤트를 청취하기 위해서는 addEventListener()의 3번째 인자인 useCapture가 반드시 true로 되어야 한다. false로 되어 있다면 캡쳐단계가 아닌 타겟과 버블 단계에서 이벤트 청취를 한다.
    캡쳐단계 청취하는 목적은 다양할 수 있다. 가령 중간에 이벤트 전파를 중지시킬때 필요할 수 있다. 이해가 안될 수 있지만 실제 프로젝트를 하면 이런 경우가 다분하다.
    사용 예 )
    button.addEventListener( MouseEvent.CLICK, onClick, true );
  • 타겟 단계
    갭쳐 단계 이후 타겟단계에 도달한다. 타겟 단계는 이벤트를 발생시킨 객체까지 도달했을때 이뤄진다.
  • 버블 단계
    타겟 단계 이후 다시 루트(root) 디스플레이 객체로 이벤트가 전파되는 단계이다. 버블버블 물망울이 수면위로 다시 올라가는 것을 연상하면 되겠다. 캡쳐와 반대로 자식->부모로 이벤트가 전파되는 단계이다.
    이벤트가 버블 단계로 전파되기 위한 조건은 이벤트 송출시 Event의 생성자 인자값중 bubble값을 true로 설정되어 있어야 한다. MouseEvent같은 경우 이 bubble값이 true로 설정되어 있다.
    타겟단계와 버블단계에 이벤트 청취자를 등록하기 위해 addEventListener()의 3번째 인자 useCapture가 false로 되어야 한다. useCapture를 설정하지 않으면 기본값이 false이다.
  • 이벤트 객체가 전파되는 기능이 굳이 필요한 이유
    부모-자식1-자식2....-자식100 의 형태로 디스플레이 객체 리스트가 형성되어있다고 가정하자 자식50에서 자식 100을 마우스 클릭했을때 이벤트를 받고 싶다고 하자. 자식50은 자식100의 존재유무를 모른다(알 수 있지만 알게되면 강한결합이 일어난다.) 이런 경우 이벤트 객체가 전파되는 기능은 매우 유용하게 쓰일 수 있다. 캡쳐나 버블 단계에서 자식50은 자식100에서 발생된 이벤트를 받을 수 있다.
  • flash.display.DisplayObject 클래스는 EventDispatcher를 확장해서 만들어졌다는 것에 주목하자.


5. 4번의 Event 전파는 어떤 환경에서 가능한가?

  • 반드시 디스플레이 객체 리스트(Display Object List) 상에 존재하는 디스플레이 객체(Display Object)여야 이벤트 전파가 가능하다. 그 외의 이벤트 전파는 타겟 단계밖에 없다. 가령, HTTPService나 URLLoader에서 이벤트가 발생하는 경우 이들은 디스플레이 객체가 아니다.
  • 이벤트 전파의 조건
    1. 디스플레이 객체여야 한다.(flash.display.DisplayObject를 확장한 클래스의 객체)
    2. 디스플레이 객체는 디스플레이 객체 리스트에 존재해야 한다. 즉, stage로 부터 addChild되어 있어야 한다.

6. 이벤트 전파시 target과 currentTarget의 차이점은 무엇인가? 예를 들어 설명하라.

  • target은 이벤트를 발생한 객체이고 currentTarget은 이벤트를 청취하는 객체이다.
  • 예시)
    var p:Sprite = new Sprite(); //parent
    var c:Sprite = new Sprite(); //child
    addChild( p );
    p.addChild( c ); //c가 p의 자식인 것에 주목
    p.addEventListener( MouseEvent.CLICK, onClick ); //이벤트 청취를 p가 하는 것에 주목!
    public function onClick( event:MouseEvent )
    {
    trace( event.target, event.currentTarget ); //c를 클릭했을 경우 c, p가 나오고 p를 클릭했을 경우 p,p가 나온다.
    }


7. Event 우선순위에 대해서 간단한 예제를 들어 설명하라.

  • 이벤트 우선순위는 구체적으로 이벤트 청취 우선순위라고 할 수 있다.
  • 이벤트 청취 우선순위는 addEventListener()의 4번째 인자인 priority를 이용한다. 이 값이 클 수록 청취 우선순위가 높아지며 addEventListener()의 등록 순서에 상관없이 우선순위에 따라 이벤트 리스너가 호출된다.
  • 이벤트 청취 우선순위가 유효한 조건
    1. 같은 객체에서 청취한다.
    2. 같은 이벤트 종류(type)을 청취한다.
    3. 같은 useCapure 값을 가진다.
  • ex)
    a.addEventListener(MouseEvent.CLICK, aHandler, false, 3);
    a.addEventListener(MouseEvent.CLICK, bHandler, false, 1);
    a.addEventListener(MouseEvent.CLICK, cHandler, false, 100);

    a객체에 MouseEvent.CLICK 이벤트가 발생시 등록순서에 상관없이 priority값이 가장큰 cHandler가 먼저 호출되고 다음으로 aHandler, bHandler가 호출된다.

8. Event 전파를 중단하는 메소드 2개가 무엇이며 간단한 예제를 들어 각각의 차이점을 설명하라.

  • Event 클래스의 stopPropogation()와 stopImmediatePropogation() 메소드이다.
  • 차이점
    - stopPropogation()
      이벤트 전파를 중단하되 같은 노드의 이벤트를 청취까지는 허락한다.
    - stopImmediatePropogation()
      이벤트 전파를 즉시 중단한다.
  • 예제
    back이 배경 canvas이고 button1이 back에 포함된 button일때
    back.addEventListener(MouseEvent.CLICK, event1Handler);
    back.button.addEventListener(MouseEvent.CLICK, event2Handler);
    back.button.addEventListener(MouseEvent.CLICK, event3Handler);
    back.button.addEventListener(MouseEvent.MOUSE_OUT, outHandler);

    private function event1Handler(e:MouseEvent):void
    {
           trace('back');
    }
    private function event2Handler(e:MouseEvent):void
    {
           trace('button');
           e.stopPropagation();
           e.stopImmediatePropagation();
    }
    private function event3Handler(e:MouseEvent):void
    {
           trace('button2');
    }
    private function event1Handler(e:MouseEvent):void
    {
           trace('out');
    }

    e.stopPropagation(); e.stopImmediatePropagation(); 두가지 다 없을경우
            button
            button2
            back
            out
    e.stopPropagation(); 만 실행
            button
            button2
            out
    e.stopImmediatePropagation(); 만 실행
            button
            out
     


9. addEventListener의  useCapture 인자는 무엇을 의미하는가? 간단한 예제를 들어 설명하라.

  • 이벤트 전파를 청취할때 캡처단계를 청취할지 타겟 및 버블 단계를 청취할지 결정하는 인자이다.
  • 모든 전파 단계에서 청취하기 위해서는 useCapture가 다른 2개의 addEventListener()를 사용해야한다.
  • 예제 생략


10. Sprite, Shape와 같은 클래스에서 어떻게 하면 이벤트를 송출할 수 있는가?

  • dispatchEvent() 메소드를 호출하면 된다.


11. Sprite, Shape와 같이 이벤트 송출할 수 있는 클래스는 근본적으로 어떤 클래스를 상속받았기 때문에 가능한가?

  • Sprite와 Shape는 궁극적으로 DisplayObject를 확장해서 만들어졌으며 DisplayObject는 EventDispatcher를 확장했다. 그러므로 Sprite와 Shape와 같은 클래스는 EventDispatcher의 메소드를 전부 사용할 수있다. 이중에 dispatchEvent()도 사용할 수 있다.


12. IEventDispatcher는 무엇이며 어떤 경우에 이것을 사용해야할까?

  • EventDispatcher의 인터페이스이다.
  • IEventDispatcher를 활용하는 것은 다중상속이 불가능한 AS3에서 유용하다.
    가령, 어떤 클래스가 ProxyObject를 확장해서 만들어져야한다. 그런데 이 클래스는 이벤트도 발생시켜야 하므로 EventDispatcher클래스도 확장해야한다. ActionScript 3.0은 다중상속을 지원하지 않는다.(다중상속은 이점도 있지만 단점도 있다.) 그러므로 이러한 경우에는 주가 되는 클래스인 ProxyObject를 is-a 확장을 하고 EventDispatcher를 has-a 확장을 감행한다음 만들어진 클래스가 EventDispatcher의 기능을 수행한다는 것을 명시적으로 외부에 알려주고 내부적으로 구현시켜주기 위해 IEventDispatcher 인터페이스를 implements 해준다. 이렇게 하면 원하는 기능인 ProxyObject와 EventDispatcher의 기능을 전부 수행하면서도 다중상속의 문제를 극복할 수 있다.
  • ex)
    public class MyProxyObject extends ProxyObject implements IEventDispatcher
    {
      var evnetDispatcher:EventDispatcher = new EventDispatcher();
     
      //내부적으로 IEventDispatcher에 선언한 메소드를 구현한다.  가령...
      public function dispatchEvent( event:Event ):Boolean
      {
         return  eventDispatcher.dispatchEvent( event );
      }
    }


13. preventDefault()와 stopPropagation(), stopImmediatePropagation()의 근본적 차이점은 무엇인가?

  • preventDefault()는 기본 동작(dafault behaviors)를 취소하는데 쓰이는 메소드인 반면 stopPropagation(), stopImmediatePropagation()는 이벤트 전파에만 영향을 준다.
  • preventDefault()가 사용 가능한지는 isDefaultPrevented() 메소드로 알 수 있다.

14. preventDefault()를 호출해서 실행을 가능하게 하기 위한 조건은 무엇인가?

  • 이벤트 객체를 생성시 cancelable속성이 true로 설정되어 있어야 한다.


15. 커스텀 이벤트를 만들어야하는 어떤 경우이며 어떻게 만드는가?

  • 커스텀 이벤트는 기본 이벤트 클래스(flash.events.Event) 또는 그 상위 이벤트 클래스를 확장하는 경우를 의미한다.
  • 이벤트를 확장해야하는 경우는 이벤트 송출시에 필요한 정보를 담아내기 위함이다.
  • 만드는 방법
    class MyEvent extends Event
    {
      public static const MY_EVENT:String = "myevent";
      public var value:String;
      public function MyEvent( type:String, value:String ):void
      {
         super( type, false, false );
         this.value = value;
      }
      overide public function clone():Event
      {
        return new MyEvent( type, value );
      }
    }



16. 커스텀 이벤트가 bubbling이 가능하기 위해 어떤 조건이 필요한가?

  • Event의 생성자의 2번째 인자인 bubble값을 true로 설정한다.

17. 커스텀 컴포넌트 만들때 clone()함수를 override해야하는 이유는 무엇인가?

  • clone()메소드는 기존과 신규 properties들을 clone 내로 설정해 이벤트 객체의 복사본을 돌려준다.
    clone() 메소드를 Event 클래스 확장시 오버라이드 해야하는 이유는 이벤트를 다시 재전달해야하는 경우 묵시적으로 복사해서 재전달할 필요가 있을때 필요하기 때문이다.
  • 참고로 toString()도 확장해서 사용하는 것이 좋다. 이벤트에 대한 명세서가 될 수 있기 때문이다.

18. 약참조에 대해서 GC(가비지 콜렉션)과 관련되어 설명하라.

  • addEventListener()함수로 이벤트 청취자를 등록할때 5번째 인자로 useWeakReference 인자가 있다. 이것을 true로 설정하면 이벤트 청취자가 이벤트 청취를 약참조를 하겠다는 의미이다. 반대로 false(기본)이면 강참조이다.
  • 약참조, 강참조를 설명하기 전에 가비지 콜렉션(GC, Garbage Collection)에 대해서 먼저 알아야한다.
    만들어졌던 객체가 더이상 쓸모가 없어졌을때 GC라고 한다. 쓸모가 없어졌다는 것은 참조의 고리가 끊어졌다는 것을 의미한다. 메모리에 상주해 있지만 조만간 메모리에서 없애야할 대상인 것이다. Flash Player는 GC로 선정된 객체들을 메모리에서 삭제하는 시점을 내부적으로 구현해놓고 있다.(많은 분들이 Flash Player GC처리를 못한다고 하지만 실제로는 문제없이 잘하고 있다. 단지 효율적으로 GC처리를 하는지는 의문이지만...)
    Flash Player GC 대상을 찾아내기 위한 방법은 2가지가 있다. 그것은 레퍼런스 카운팅(reference counting)과 마크 앤 스윕(Mark and Sweep)이다. 레퍼런스 카운팅은 생성된 객체가 참조할때마다 참조 카운트를 1씩 더해준다. 또 참조에서 끊어지는 경우 1씩 감소시켜준다. 만약 레퍼런스 카운팅 값이 0이되는 경우 바로 GC 대상이 되는 것이다. 마크 앤 스윕은 레퍼런스 카운팅 만으로 찾을 수 없는 GC대상을 찾아준다. 가령, 두개 이상의 객체가 서로 다른 객체를 참조하고 있다고 가정한다.(순환참조) 그럼 이들 레퍼런스 카운팅 값은 1 이상이다. 그러므로 레퍼런스 카운팅 방법으로는 GC대상을 만들 수 없다. 마크 앤 스윕은  이들 객체가 최상위 부모와 연결되어 있는지 검사하는 방법이다. 부모로 부터 꼬리에 꼬리를 물고 객체가 참조되어 있는 것인지 조사해나가는 방법으로 GC대상을 검색한다.
    레퍼런스 카운팅과 마크앤 스윕 방법으로 찾아낸 GC대상은 메모리에 상주되지만 Flash Player의 GC 삭제방법 로직에 의해 어느 순간 삭제된다.(이 시점은 프로그래머가 어찌할 수 없다. AIR 또는 Flash Player Debug버전의 경우에만 System.gc()를 이용해 강제적으로 GC를 메모리에서 삭제할 수 있긴 하다.)
  • addEventListener()의 useWeakReference를 true로 설정하면 약참조가 되어 레퍼런스 카운팅을 증가시키지 않는다. 강참조의 경우 이벤트 대상(target)의 참조를 지웠다고 해도 addEventListener로 등록한 청취자 메소드가 GC대상이 아니라면 이벤트 대상의 레퍼런스 카운팅 값은 0이 될 수 없다. 결국 프로그래머의 뜻과 다르게 메모리를 낭비하는 일을 초래할 수 있다. 물론 이벤트 대상이 사라지는 시점에 removeEventListener() 사용하면 되겠지만 때로는 그 시점을 모르는 경우도 발생한다. 이러한 경우 useWeakReference를 true로 설정해서 메모리 낭비를 없앨 수 있겠다.
  • Flex에서 List 계열의 컴포넌트를 살펴보면 dataProvider()에 ArrayCollection 객체를 받을때 ArrayCollection의 변화를 살펴보기 위해 addEventListener()를 사용한다. 그런데 ArrayCollection 객체는 언제 어떻게 될지 List 계열 컴포넌트는 알 수 없을 것이다. 이때 유용하게 사용하는 것이 바로 useWeakReference=true로 설정해서 필요없어진 ArrayCollection이 메모리 남는 것을 방지할 수 있다. 참고 : http://blog.jidolstar.com/375



19. 이벤트가 전파되는 중간에 전파를 멈추게 하기 위해 stopPropagation()을 사용하지 않고removeEventListener() 를 사용하면 안되는 이유를 설명하라. (힌트, ActionScript 3.0의 Native 메커니즘에 입각한다. http://bixworld.egloos.com/2149717)

  • 이벤트 송출을 시작하면 flash player는 이벤트가 송출될 디스플레이 객체 리스트를 전부 조사해 미리 이벤트 객체를 복사해두기 때문이다. 이미 전파할 대상이 모두 정해져있고 전파가 시행중인 경우에는 중간에 removeEventLisener를 사용하더라도 일단 송출된 이벤트는 끝까지 전파된다. 다음 시점 이벤트 송출시에는 removeEventLisener()가 적용되어 있는 상태가 된다.


20. willTrigger()와 hasEventListener()의 의미를 설명하고와 두 메소드의 차이점을 보여줄 수 있는 대한 예를 들어보자.

  • 공통점
    hasEventListener()이나 willTrigger() 모두 이벤트 청취자가 있는지 검사한다.
  • 차이점
    hasEventListener() : 지정한 객체에(만) 이벤트 청취자가 있는지 조사한다. 이벤트 흐름과는 무관하다.
    willTrigger() : 지정한 객체를 포함하는 디스플레이 객체 리스트에 해당 이벤트가 청취자가 있는지 조사한다. 그러므로 이벤트 흐름과 관련 있다.
  • 예제
    var button:Sprite = new Sprite();
    addChild( button );
    this.addEventListener( MouseEvent.CLICK, onClick );
    trace( button.willTrigger( MouseEvent.CLICK ) ); //true
    trace( button.hasEventListener( MouseEvent.CLICK ) ); //false ->왜 false가 되는가 아는게 중요!
    trace( this.willTrigger( MouseEvent.CLICK ) ); //true
    trace( this.hasEventListener( MouseEvent.CLICK ) ); //true
  • 이 두개의 함수를 잘 활용하면 쓸데없이 이벤트를 송출하는 경우를 방지할 수 있다.

21. ActionScript 3.0 이벤트에 대해 참고할 만한 문헌 및 자료를 조사하자.
Introduction to event handling in ActionScript 3.0
Jasu님의 ActionScript 3.0 이벤트 오브젝트
Event 한글 문서
EventDispatcher 한글 문서


글쓴이 : 지돌스타(http://blog.jidolstar.com/415)

재사용/유지보수를 극대화를 위해 다형성, 추상화 개념이 들어간 객체지향프로그래밍을 이용한다.


객체지향프로그래밍(OOP) 5대 원칙도 마찬가지입니다. 결국 재사용/유지보수를 위해서 필요한 원칙입니다. 이런 원칙을 잘 지키는 것은 초보 개발자에게 무척 어려운 일이기도 합니다. 왜냐하면 이해와 설계과정이 함께 들어가는 것이기 때문입니다. 하지만 지속적으로 적용하고 몸에 베면 그리 어려운것만은 아닙니다.


[공부]

http://muticd.com/lec/director/viewBody.php?t_Name=Lec_drbook2

11, 12 동영상을 학습한다.



[과제]


1. 인터페이스(Interface), 추상 클래스(Abstract Class), 구상 클래스(Concrete Class)

1.1 인터페이스란 무엇인가?  

1.2 추상클래스란 무엇인가? 추상클래스의 역할을 정확히 언급하라. 인터페이스와의 차이점을 언급하라.

1.3 구상클래스란 무엇인가?

1.4 AS3에는 추상 클래스의 키워드로 abstract가 없다. 그러나 실제 설계시에는 추상클래스 역할을 하는 클래스가 필요한 경우가 많다. 이런 경우에 대한 적절한 예제를 들고 Class Diagram을 작성하라. (단,추상클래스는 직접 사용할 수 없도록 해야한다.)

1.5 1.4에서 만든 추상클래스를 가지고 구상클래스를 3가지 이상 예제를 들고 Class Diagram을 작성하라.

1.6 1.4, 1.5에서 만든 추상클래스와 구상클래스를 가지고 문제없이 사용할 수 있다. 하지만 다중상송의 경우 문제가 발생할 수 있다. 이런경우 예를 들고 왜 인터페이스-추상클래스-구상클래스를 셋트로 설계하는게 좋은지 설명하라.



2. Open-Close 원칙 (OCP, 개방-폐쇄의 원칙)

2.1 OCP원칙에 의하면 확장 상속(is-a)에 관해서 어떻게 하나?

2.2 OCP원칙에 의하면 합성 상속(has-a)에 관해서 어떻게 하나?

2.3 OCP원칙에 따르기 위해 Class를 어떻게 설계해야하는가?

2.4 OCP 원칙에 맞지 않는 예를 Class Diagram으로 표현하라.

2.5. OCP 원칙에 대한 적절한 예를 Class Diagram으로 표현하라.



3. The Liskov Substitution 원칙(LSP, 리스코프 치환 원칙)

3.1 LSP 원칙에 대해 설명하라

3.2 LSP 원칙에 맞지 않는 적절한 예를 Class Diagram으로 설명하라.

3.3 LSP 원칙에 맞는 적절한 예를 Class Diagram으로 설명하라.



4. The Dependency Inversion 원칙(DIP, 의존 관계 역전 원칙)

4.1 DIP 원칙에 대해서 간단하게 설명하라.

4.2 DIP 원칙에 맞지 않는 예제를 Class Diagram으로 설명하라.

4.3 DIP 원칙에 맞는 예즈를 Class Diagram으로 설명하라.



5. The Interface Segregation 원칙(ISP, 인터페이스 격리 원칙)

5.1 ISP에 대해서 간단히 설명하라.

5.2 ISP에 맞지 않는 예제를 Class Diagram으로 설명하라

5.3 ISP에 맞는 예제를 Class Diagram으로 설명하라.



6. The Single Responsibility 원칙(SRP, 단일 책임의 원칙)

6.1 SRP에 대해서 간단히 설명하라.

6.2 SRP에 맞지 않는 예제를 Class Diagram으로 설명하라.

6.3. SRP에 맞는 예제를 Class Diagram으로 설명하라.



[참고서적]

Flex/AIR Bible (대림, 윤훈남저)

액션스크립트 3.0 디자인 패턴(에이콘, 조이로트.대니 패터슨 저)



이들에 대해서 학습을 완료하면 재사용/유지보수를 위해 아래와 같은 작업을 해야할 것을 느낄겁니다.


1. 인터페이스 또는 추상클래스로 설계한다.

2. 참조시 인터페이스 및 추상클래스를 참조해야한다.(의존성을 줄임)

3. 인터페이스나 추상클래스는 확실한 자기 역할을 부여해라.(유지보수,확장성 향상)


OOP 5대 원리 및 다양성, 추상화 과정에 대해서 이해하고 계속 적용할려고 노력하는 것은 개발의 삽질을 줄여주는데 반드시 필요한 부분입니다. 처음에는 머리 아플지 모르지만 예전보다 이쁘게 만들어진 자신의 프로그램을 보며 웃을날이 분명 올것입니다. ^^


객체기반프로그래밍(OBP, object based programming)이 아닌 객체지향프로그래밍(OOP, object oriented programming)을 하시기 바랍니다.


댓글이 곧 달리겠죠? ^^

글쓴이: 지돌스타(http://blog.jidolstar.com/419)

많은 프로그래머들이 클래스 관계 및 설계에 대해서 명확히 이해하지 않고 손가는데로 프로그램을 만들다가 나중에 유지보수에 어려움을 겪는다.(본인도 예외가 아님) 이러한 문제를 극복하는 취지에서 이번 학습이 필요하다고 생각한다. 물론 Flex의 경우 Flex자체의 내부구조를 이해하고 효율적인 사용이 필요하다. 이 부분은 따로 학습해야할 것이다.


[공부할 것]

클래스들 간에 관계설정

출처:http://cafe.naver.com/javasolution/26


윤훈남의 Flex강의중 10.객체지향프로그래밍-클래스 다이어그램 : http://muticd.com/lec/director/viewBody.php?t_Name=Lec_drbook2


[숙제]

1. 클래스의 관계에서 is a, use a, has a 에 대해서 예시와 함께 설명하라.(예시는 3가지 이상)


2. UML에서 클래스 관계

2.1 "의존관계"의 영문, 의미, UML 표기법 설명, AS3 예시

2.2 "연관관계"의 영문, 의미와 2가지 종류에 대한 설명과 UML 표기법 설명, AS3 예시

2.3 "일반화관계"의 영문, 의미와 UML 표기법 설명, AS3 예시

2.3 "실체화관계"의 영문, 의미와 UML 표기법 설명, AS3 예시

2.4 위 관계에 대해 UML을 작성해보자

  (http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasUML 에서 다운받에 Flex Builder에 설치하고 다 만든 결과물을 스크린샷해서 붙인다)


3. 합성과 상속

3.1 의미를 설명하고 AS3로 예시를 들어라.

3.2 각각의 장단점을 설명하고 예시를 들어라.


4. 인터페이스

4.1 인터페이스의 의미와 AS3에서 일반적으로 통용되는 인터페이스 명명규칙

4.2 AS3는 다중상속을 할 수 없다. 하지만 인터페이스를 이용하면 다중상속의 문제점을 해소시키면서 클래스를 만들 수 있다. 예를 들어 설명하라.

4.3 인터페이스는 클래스간에 결합도를 줄여준다. 예를들어 설명하라.

4.4 ActionScript 3.0에서 부모SWF에서 자식SWF를 로드하여 자식 SWF안에 있는 클래스를 사용할 수 있다. 인터페이스를 이용하면 부모와 자식간에 클래스 공유의 결합도를 줄여줄 수 있는데 그 예를 들어보자.



5. 추상화 클래스(AS3는 이런 개념이 없지만 충분히 활용할 수 있다.)

5.1 추상화 클래스의 의미.

5.2 추상화 클래스를 사용해야하는 이유

5.3 인터페이스를 이용해서 추상화 클래스를 만들고 이 추상화 클래스를 이용한 구체화된 클래스에 대한 예제를 만들라(AS3, UML)


6. 캡슐화(은닉화)

6.1 캡슐화의 의미

6.2 캡슐화가 적절하게 된 클래스와 아닌 클래스에 대한 예시를 들어라.(Array 활용)


7. 다형성

7.1 다형성의 의미

7.2 다형성의 의미를 대변할 수 있는 예시(코드/UML)를 들어라.


8. 절차지향 방식과 객체지향 방식의 차이점(장,단점 포함)을 설명하라.


답은 언제 달릴까요? ^^

글쓴이: 지돌스타(http://blog.jidolstar.com)


국제천문연맹(IAU, International Astronomical Union)은 2009년을 '세계 천문의 해(IYA2009, International Year of Astronomy 2009)'로 정했습니다. 2009년은 갈릴레오 갈릴레이가 처음으로 망원경을 통해 천체를 관측한지 400년이 되는 해입니다.

잠깐 "2009 세계 천문의 해" 동영상을 감상해볼까요?


스타플(http://starpl.com)도 나름대로 천문을 바탕으로 만들어졌습니다.
일반인들이 쉽게 다가갈 수 있게 별을 소재로 만들어진 스타플....
우연치 않게 2009년은 세계 천문의 해라고 하니...
이렇게 생각도 드네요.

2008년은 스타플 결실의 해라고 한다면
2009년은 스타플 도약의 해라고 생각되네요.

앞으로 스타플은 어떤 모습이 될까요?
별은 이제 과학자들만의 대상이 아닌
우리 일반인들에게도 소중한 대상이 될 것 입니다.
꿈과 희망을 주는 멋진 스타플이 되길 희망합니다.


2009 세계 천문의 해 공식홈페이지

영문 : http://www.astronomy2009.org/
한국 : http://www.astronomy2009.kr/main.aspx

글쓴이 : 지돌스타(http://blog.jidolstar.com/417)

제 나름대로 따져본 스타플(http://starpl.com)에서 이쁜 별 모음입니다.


"지돌스타"의 별. 역쉬 이쁘군요. ^^


"ckdan"님의 별. 스타플 별 스킨과 아이템등을 그리는 분이시죠?


"별이"님의 별. 독특한 배경, 기울어진 별... 다들 떨어질 것 같네요. ㅎㅎ



"위콘"별. 스타플을 만든 회사의 별이죠? 만든 사람들의 친구링크위젯이 있네요.


"아리아스"님의 별. 이번에 새로 나온 크리스마스 테마를 이용했네요. 담달에 결혼한다죠? ^^


"아이"별. 산소가 모락모락 나올 것 같은 별이예요. 저기 안에서는 왠지 공기가 쾌적할 것 같다는...


"싸늘한레몬향"별. 요리를 좋아하는 분인만큼 별이 레스토랑이예요~~

일전에 위콘에 쿠키도 보내줬죠? 넘 맛있게 먹었어요


"addLayer"의 별. 보통 별들보다 작네요~~

별을 뚫고 깜찍한 조카사진이 일품이군요. ^^


"allriv"의 별. 이쁜집을 꿈꾸는 듯한 별이네요~~  


"mkyoon"님의 별.

뭔가 이국적 느낌이 나는 별이네요.


"joykim"의 별.

제가 생각하는 가장 이쁜 별입니다.

배치도 참 이쁘고, 사진도 이쁘고... 어쨌든 이쁩니다.

기준은 제 마음입니다.



당신만의 이쁜 별을 꾸며봐요.

http://starpl.com


Flex나 Flash로 개발 결과물안에 폰트를 포함시켜야하는 경우를 많이 경험해봤으리라 생각한다.

폰트를 포함(Embed)한다는 것은 시스템 폰트를 사용하지 않고 프로그램안에 폰트를 내장해서 좀더 세밀하게 폰트를 제어할 수 있게 하기 위함이다. 가령, 폰트의 안티알리어싱, 회전, 투명도 조정 등을 위해서는 반드시 프로그램안에 해당 폰트를 내장해야한다.

폰트를 포함할때 가장 큰 문제점은 프로그램 용량이 너무 커진다는 것이다.
이럴때 보통 동적으로 로딩하는 방법을 통해 프로그램 자체 크기 용량을 줄일 수 있다.

그럼, 쓰여질 폰트가 제한적일때는 어떻게 할까?
가령, 폰트안에 숫자만 사용할 것이라면 그것만 뽑아내서 사용할 수 있을 것이다.
사용할 폰트가 제한적이라면 프로그램 크기를 줄이기 위해서라도 반드시 수행해야할 것이다.

Flash에서는 이것을 아주 쉽게 할 수 있다.
하지만 Flex에서 이런 작업을 하기에 여간 불편한것이 아니다.
왜 그런지 살펴보자.

Flex에서 폰트를 포함하기 위해서 CSS의 @font-face 또는 ActionScript3에서 Embed 메타데이타 태그를 이용하면 된다.

즉,

@font-face
{
src:systemFont("돋움");
fontFamily: myFontFamily;
advancedAntiAliasing: true;
unicodeRange : U+c0ac,U+c790,U+cc98; /*변환후 사용하면 됩니다.*/
}

또는


[Embed(source="../assets/돋움.ttf",fontName='MyFont',
mimeType='application/x-font', unicodeRange='U+c0ac,U+c790,U+cc98')]
private var font1:Class;

이다.

상단은 시스템 폰트를 포함 방법, 아래는 지정된 폰트를 포함하는 방법을 사용하고 있지만 어쨌든 둘다 어렵지 않게 사용할 수 있다.

둘다 unicodeRange 속성을 가지고 있다. 여기에 입력된 값은  특정문자에 대한 유니코드(unicode)값이다.
숫자면 숫자, 문자면 문자에 대한 유니코드값을 이곳에 넣어주어야 지정된 폰트만 프로그램안에 포함할 수 있는 것이다.

저 유니코드 값을 넣어주어야하는데 당신은 저걸 다 외우고 있는가?
"안녕하세요" 만 쓴다고 하자.
그럼 이것에 대한 유니코드값은 "U+c548,U+b155,U+d558,U+c138,U+c694,U+2e"이다.
이 값을 모른다면 Flex에서 유니코드 넣기란 여간 어려운 것이 아닐 것이다.

본인도 이것때문에 어떻게 할까 고민하다가 폰트 유니코드 변환기를 만들어서 사용하면 되겠다 싶어서 하나 만들었다.

사용자 삽입 이미지



이 프로그램의 핵심 함수는 다음과 같다. 의외로 간단하다. ^^;;;

private function encodeUnicode( fonts:String ):String

{

       var fontUnicodes:String = "";

       var length:int = fonts.length;

       for( var i:int = 0; i < length; i++ )

       {

             var char:String = fonts.substr( i, 1 );

             fontUnicodes += "U+"+char.charCodeAt(0).toString(16)+",";

       }           

       return fontUnicodes;      

}     

우측 스타플 "내별위젯"도 그렇게 만들었다.
회사에 Flasher가 없어서... 전부 ActionScript3로 만들었는데... 사용할 폰트가 제한적이라 이 프로그램을 유용하게 사용했다.

왜 Flex로 하지? 어렵게 ActionScript 3로 했는가? 라고 반문하실 수 있겠다. 사실 Flex는 쓰기 편하지만 덩치가 크다. 위젯과 같은 작은 프로그램을 만들기 위해 덩치큰 Flex를 사용하는 것은 별로 바람직하지 못할때가 많다. 왜냐하면 결과물의 용량이 커지기 때문이다. 위젯의 경우 Flash를 할 수 있다면 Flash로 제작하자. Enterprise급 프로그램이라면 Flex로 만들면 되겠다.

 



Flex 하시는 분들도 이제 폰트 Embed 범위지정 쉽게 해요.

관련내용

Setting character ranges
[Flex, AIR] 프로그램 크기를 줄여보자 2 - 폰트(font) 동적로드 또는 문자범위지정
[Flex, Flash] 폰트(font) Embed의 이점과 제한점
[Flex] 폰트를 런타임(run time)시 동적으로 불러와 적용하는 방법


밤하늘에 당신의 유일한 별을 찾아가세요. 스타플 http://starpl.com


글쓴이 : 지돌스타(http://blog.jidolstar.com/414)

2008년 11월 30일 오후 1시 13분 KST
새로운 스타플(http://starpl.com)을 드디어 오픈했다.

사용자 삽입 이미지

새로 오픈한 스타플(starpl.com)의 메인화면



몇달간 밤샘작업하면서 만든 결과물을 이제 오픈했다고 하니 감회가 새로웠다.
아래 동영상은 스타플을 사용하는 모습을 일부 담았다.




새롭게 리뉴얼된 스타플은 SNS를 더욱 잘 표현하기 위해 업그레이드 했다. 또한 개인 컨텐츠 생산 활성화를 위해 몇가지 기능을 더욱 추가했으며, 더욱 미려한 디자인 도입으로 사용자로 하여금 하고 내 별을 가지고 싶다는 느낌을 주려고 많이 노력을 했다. 기존 초대제로만 운영했던 방식에서 누구나 가입할 수 있도록 했다.

이제 스타플에서 추가되고 발전된 기능에 대해서 소개하겠다.
본인은 스타플의 개발자중 한명이기 때문에 본인이 관여한 부분이 중심이 되어 스타플을 소개할 것이다.



별지도 (star map) - 메타센터로서의 별지도  

스타플에서 사용된 가장 큰 메타포(metaphor,상징)는 바로 별(star, 恒星)이다.

스타플은 가상의 별이 아닌 실제 관측을 통해 만들어진 천체목록에 등록되어 있는 별을 사용하고 있으며 이 별을 사람들에게 나눠준다는데서 출발한다. 거기에 감성을 더하여 자신이 이 별을 소유했고 별을 꾸밀 수 있다는 개념을 도입했으며 별에 자신의 인생을 담는다는 의미를 주기 위해 타임라인을 도입했다. 또한 별과 별을 친구로 맺게 해주고 관심별에 찾아갈 수 있게 하는 SNS(Social Network Service) 개념을 도입시켰다.

별은 우주 공간에 있다. 그렇기 때문에 Text위주의 사이트로는 별을 표현하기에 역부족이다. 그래서 도입한 것이 바로 별지도(star map, 星圖)이다. 스타플의 별지도는 2차원 공간에 별을 그려주고 일반 지도와 비슷하게 이동 및 확대/축소가 가능하게 만들어졌다. 별지도의 이러한 표현이 가능하게 하기 위해 Adobe Flash/Flex 기술을 도입했다. Adobe 기술을 도입된데는 단순히 UI 표현만을 위한 것을 뜻하지 않는다. 수억개의 별을 별지도에 표현하기 위해 데이타 베이스 작업이 필요하며 그 데이터를 별지도에 전송하고 별지도는 그 데이터를 가지고 렌더링(그림을 그려줌)해준다. 서버-클라이언트 간에 통신의 최적화를 위해 Adobe Flash/Flex 기술은 크게 도움이 되었다고 생각한다.

별지도는 외관상 전과 달라진 점은 많이 없다. 하지만 내부적 재설계를 통해 확대/축소등을 할때 예전 보다 더욱 사실감 있게 보여질 수 있도록 했으며 별자리 그림을 추가하여 좀 더 감성적으로 보여지도록 했다.

사용자 삽입 이미지

새롭게 리뉴얼된 별지도 http://starpl.com/meta


별지도에는 가입한 사람들의 별을 볼 수 있다. 사용자별(가입을 통해 받은 별)은 활동량, 분야에 따라서 별 주변의 후광의 크기와 색, 그리고 노출빈도에 영향을 준다. 새롭게 도입된 것은 바로 개인 글의 분야에 따라서 후광색이 달라진다는 점이다. 스타플은 이번 리뉴얼을 통해 RSS 발행 및 스타플 메타 센터에 글을 발행하여 공개할 수 있는 시스템을 도입했다. 그래서 전체검색등을 통해 자신의 별에 방문 유입이 가능하도록 제작되었다.


사용자 삽입 이미지

글쓰기후 분야별로 발행할 수 있다.



사용자 삽입 이미지

활동량, 분야에 따른 사용자 별지도에서 별의 후광 표현방법



사용자 삽입 이미지

발행한 글은 검색에 노출되며 별지도 상에 말풍선의 형태로 표현된다



발행된 개인 글은 스타플의 별지도의 메타센터에 노출된다. 인기글 및 추천글 등이 메인에도 노출되지만 위 화면처럼 별지도상에 보여질 수 있다. 기존 와글댓글도 별지도에 나타낼 수 있게 한 것이 이번 스타플 별지도에 변화된 점이다.

앞으로 별지도의 메타센터는 좀 더 쉽게 사용성을 높이기 위한 UI작업을 수행할 것이다. 또한 연관된 기록을 찾아갈 수 있는 기능도 추가될 예정이다.



타임라인(Time Line) - 더욱 쉬워진 인터페이스


스타플은 국내 최초로 SNS서비스에 타임라인을 도입했다. 하지만 사용하기에 불필요한 기능이 있었고 단추형태로 되어 있는 UI로 사용자의 컨텐츠가 직접 노출이 안된다는 단점이 존재했다. 이러한 단점을 극복하고 사용자에게 더욱 친숙한 타임라인을 다시 제작하게 되었다.

사용자 삽입 이미지

스타플의 새로운 타임라인



위 화면처럼 타임라인은 개인 컨텐츠가 바로 노출될 수 있도록 UI를 개편했다. 또한 카테고리 별로 자신의 컨텐츠를 볼 수 있도록 만들어 편의성을 더욱 강화시켰다.

사용자 삽입 이미지

스타플 타임라인은 스킨을 변경할 수 있다.


스타플 타임라인에서 크게 달라진 또 한가지는 바로 타임라인에 스킨를 적용할 수 있도록 한 것이다. 타임라인의 상단에 보면 원하는 색으로 입혀진 타임라인으로 자신의 별과 어울리게 스킨을 정할 수 있도록 만들었다.

타임라인도 별지도와 함께 Adobe Flex를 이용해 개발했다. 스킨기능 및 각종 데이터 통신의 편의성을 위해 Flex 기술의 도입은 디자인 적용 및 개발에 도움이 되었다.


별꾸미기 - 나만의 별을 꾸며봐요.


별꾸미기의 겉모습은 기존과 달라진 점이 많이 없다. 하지만 더욱 빨라지고 사용성을 증대시켰다.
기존에는 꾸미기 상단 패널은 Javascript, 꾸미기 영역은 Flex로 개발했지만 이번에는 전체 Adobe Flex로 개발하여 더욱 세밀해지고 확장가능한 꾸미기가 가능해지도록 제작되었다.

사용자 삽입 이미지

꾸며진 내 별의 모습



사용자 삽입 이미지

스타플에서 내 별 꾸미기하는 장면


이번 리뉴얼을 통해 또 한가지 크게 달라진 점은 별을 아이템화 했다는 것이다. 즉, 기존에는 별의 크기와 회전, 레이어 변경등을 할 수 없었지만 이번에는 위치 조정을 빼놓고 모두 가능해지도록 만들었다. 결국 더욱 다양한 방식으로 별을 꾸밀 수 있게 되었다.



별마트 - 더욱 다양해지고 이뻐진 아이템들


웹사이트는 아무리 기술이 좋고 전문적이다 하더라도 세련되고 이쁜 디자인이 없다면 사용자들에게 외면당하기 쉽다. 이번에 새롭게 추가 것중에 하나가 바로 테마별이다.

사용자 삽입 이미지

스타플에서 제공하는 다양한 테마별



별마트(http://starpl.com/mart/main) 에 방문해 "테마" 메뉴에 보면 위와 같이 다양한 테마별을 볼 수 있다. 테마별은 별스킨과 함께 아이템을 일부만 구입하거나 한꺼번에 구입할 수 있다. 스타플에서는 테마별을 별가루라는 가상의 화폐 시스템을 이용해 구입할 수 있다. 참고로 별가루는 스타플 활동량으로 벌어들일 수 있다.


사용자 삽입 이미지

테마별 중 하나




알림이 - 친구들과 관심별의 소식을 알려줘요


기존 스타플부터 유지해온 알림이 서비스이다. 알림이 서비스는 자신의 친구별 및 관심별의 소식을 보는데 유용하게 쓰여질 수 있다.

사용자 삽입 이미지

스타플 알림이 서비스

이번 리뉴얼을 통해 동작이 더욱 부드러워졌으며 데이타 베이스 개편으로 로딩속도를 향상시켰다. 이번 알림이 서비스에서 가장 주요하게 추가된 점은 관심별 이다. 관심별은 관심법으로 다루는 별인가? ㅎㅎ 그런것은 아니고 별친구는 아니지만 개인적으로 유용한 자료가 많거나 관심 분야를 가진 별이 있을때 지속적으로 방문하고 싶은 별을 관심별이라고 한다. 블로그 RSS 구독을 하는 것처럼 관심별을 등록하여 그 별의 소식을 알림이를 통해 볼 수 있다.

알림이 서비스는 친구들의 소식 뿐아니라 자신의 포스트에 쓰여진 댓글, 방명록 글등을 거의 실시간으로 알려준다.
앞으로 알림이 서비스는 데스크탑 영역으로 확장되어질 수 있으며 메신저 서비스와도 연동되어 질 수 있다고 생각한다.


내별위젯(My Star Widget) - 자신의 블로그에 내별위젯을 달아봐요.




위 위젯이 바로 내별위젯이다. object, embed 태그로 구성되어 있기 때문에 HTML 형태로 붙일 수 있는 게시판이나 자신의 블로그에 얼마든지 붙힐 수 있다. 본인 블로그 우측에도 내별위젯을 붙였다.

내별위젯은 실제 별지도 위에 내별의 위치, 별을 받은 날을 보여주고 자신의 별에 바로 갈 수 있도록 만들어졌다. 첫번째 버전이기 때문에 별 기능은 없지만 개인적으로 디자인이 이뻐서 마음에 든다.

내별위젯은 스타플에 가입한 사람에게만 유효하며 http://starpl.com/main/banner/down 에서 직접 복사해서 사용할 수 있다.

사용자 삽입 이미지

Starpl 배너 페이지. 여기서 스타플 위젯과 Link 배너를 다운로드 받을 수 있다.



외부 블로그 등록 기능 - 자신의 블로그를 스타플 타임라인에 담아봐요.

스타플 리뉴얼에서 추가된 유용한 기능중 하나가 바로 기존에 사용하고 있는 자신의 블로그의 RSS를 타임라인에 담을 수 있는 것이다. 컨텐츠를 스타플에 직접 유입한다기보다 타임라인을 통해 자신의 블로그에 방문을 유도할 수 있도록 하며, 스타플 메타센터에 노출될 수 있게 하는데 유용하게 쓰일 수 있는 기능이다.


사용자 삽입 이미지

메인화면의 블로그 등록하기 버튼


스타플 메인화면(http://starpl.com/)에서 좌측부분을 보면 블로그 등록하기 버튼이 있다. 로그인후 이 버튼을 눌러보면 아래와 같은 화면이 나온다.

사용자 삽입 이미지

타임라인에 내 블로그 등록하기


본인은 타임라인에 지돌스타 블로그라는 카테고리를 등록하여 여기에 RSS를 등록했다.

사용자 삽입 이미지

등록된 블로그가 타임라인에 들어간 모습

[Blog]단추에 붙은 제목을 클릭하면 아래와 같은 화면이 뜬다.

사용자 삽입 이미지

타임라인을 통해 자신의 블로그로 이동한 모습. 아래에 추천 버튼이 있다.



스타플 메타센터에 추천이 들어가기 때문에 추천이 많이 된 블로그 포스트는 방문유입을 유도할 수 있다.



정리하며...

스타플은 이제 시작하는 것과 같다. 개인적으로 스타플에서 보여줄 수 있는 것중 10%도 안보여줬다고 생각한다. 스타플은 앞으로 국외서비스를 위해서 한발짝 다가갈 것이다. 우주를 배경으로 시작했다는 것, 별은 국내뿐 아니라 국외에도 통용될 수 있다는 점은 스타플의 가장 큰 경쟁력이다. 한국 SNS 서비스의 파워를 스타플을 통해 보여주고 싶다.

사용자 삽입 이미지




관련 사이트 및 글

스타플(http://starpl.com)
실제 별을 이용한 위치기반 감성 SNS, 스타플
스타플(starpl.com)에 사용된 Adobe Flex 기술
지돌스타의 별


글쓴이 : 지돌스타(http://blog.jidolstar.com/413)
사용자 삽입 이미지

오늘 드디어 새로운 스타플(http://starpl.com)을 선보입니다.
기존 초대제 방식에서 누구나 가입해서 별을 받을 수 있는 시스템으로 전환했습니다.

스타플은 실제 별을 가입하는 사람에게 주고 그 별을 꾸미고 별친구를 사귈 수 있도록 한 SNS(Social Network Service)입니다. 밤하늘을 연상케 하는 별지도와 자신의 인생을 담은 타임라인, 친구와 관심분야에 쉽게 다가갈 수 있도록 한 알림이, 그리고 나의 별을 꾸밀 수 있는 기능들이 마련되어 있습니다.

별지도 
 - 메타센터(검색기능)가 도입되어 스타플내 다양한 별들의 기록을 별지도상에서 볼 수 있습니다.(계속 기능이 추가될 예정입니다.)
 - 더욱 빨라지고 미려해진 에니메이션을 보여줍니다.

타임라인
 - 기존과는 UI가 완전히 달라졌습니다. 자신의 기록을 타임라인에 담을 수 있습니다.
 - 스킨을 설정할 수 있도록 수정되었습니다.

내 블로그 담기
 - 기존 블로그에서 발행한 RSS를 자신의 타임라인에 담을 수 있습니다.
 - 타임라인에 담근 블로그 글은 별지도의 메타센터 및 검색에 노출되어 더욱 많은 사람이 자신의 별 및 블로그에 올 수 있도록 할 수 있습니다.

나의 별 꾸미기
 - 기존 평면적인 별을 꾸몄다면 공간느낌이 더해진 나만의 별을 꾸밀 수 있도록 만들어졌습니다.
 - 기존 꾸미기보다 더욱 빨라지고 편하게 꾸밀 수 있습니다.

별마트
 - 더욱 풍성해진 이쁜 아이템을 구입할 수 있습니다. 별마트에서 판매되는 아이템은 현재까지는 자신의 활동량에 따라 쌓여지는 별가루로 구입할 수 있습니다. 열심히 쓰시는 만큼 더욱 예쁜 별을 꾸밀 수 있답니다. 한번 도전해보세요. ^^

나의 별 위젯
 - 외부 블로그 및 개인홈페이지에 나의 별을 보여주는 예쁜 위젯을 달 수 있습니다. 앞으로 스타플은 서비스내에서 제공하는 모든 컨텐츠에 대해 위젯화 하여 더욱 풍성한 서비스를 제공하도록 노력할 것입니다.

알림이
 - 스타플의 또하나의 특징은 나의 친구별와 관심별의 새로운 기록, 이벤트등을 알림이를 통해 한번에 볼 수 있다는 것입니다. 더욱 빨라지고 쓰기 편해진 알림이로 친구들과 더욱 친해지고 관심분야 사람들을 많이 만나보세요. ^^

스타플에 놀러오세요~~~
http://starpl.com


글쓴이 : 지돌스타(http://blog.jidolstar.com/412)

POST방식으로 MultiPart 컨텐츠 타입으로 지정하여 데이타를 서버에 올리는 경우가 종종 있다.
가령, 이미지를 BitmapData로 캡쳐해서 ByteArray형태로 만든다음 서버에 전송하기 위해서는 URLLoader를 이용해 URLRequest의 contentType을 "multipart/form-data;"으로 지정해서 전송할 수 있다. 이와 관련되서는 예전에
"[Flex/AIR]BitmapData를 PNG나 JPG로 변환하여 ByteArray로 서버에 전송하는 방법" 제목으로 글을 올린적 있으니 참고바란다.

하지만 Flash Player 10부터 이러한 과정에서 보안이슈에 걸린다. 아래는 Flash Player 10 기준 ActionScript 3.0 메뉴얼에서 URLLoader의 load()에 설명되어 있는 글이다.  

Flash Player 10 이상에서는 multipart Content-Type(예: "multipart/form-data")을 사용하고 POST 본문 내 "content-disposition" 헤더에 "filename" 매개 변수를 지정하여 업로드를 처리하는 경우 POST 작업이 업로드에 적용되는 보안 규칙의 영향을 받을 수 있습니다.

  • POST 작업은 마우스 클릭이나 키 누르기 같은 사용자 동작에 대한 응답으로 수행됩니다.
  • POST 작업이 크로스 도메인인 경우, 즉 POST 대상이 POST 요청을 보내는 SWF 파일과 같은 서버에 없는 경우 대상 서버는 크로스 도메인 액세스를 허용하는 URL 정책 파일을 제공해야 합니다.

또한 multipart Content-Type의 경우 구문이 RFC2046 표준에 따라 유효해야 합니다. 구문이 유효하지 않은 경우 POST 작업은 업로드에 적용되는 보안 규칙의 영향을 받을 수 있습니다.


마우스 클릭이나 키 누르기 같은 사용자 동작에 대한 응답이 있은 직후에 하지 않고 이 기능을 사용하게 되면 "SecurityError: Error #2176 Certain actions, such as those that display a pop-up window, may only be invoked upon user interaction, for example by a mouse click or button press." 에러가 발생한다. 이 메시지는 자바스크립트(Flash가 아닌 외부)에서 Flash 컨텐츠의 FileReference browse() 메소드를 같은 이유의 보안 문제로 호출할 수 없을때와 동일하다. 이와 관련되어서는 다음 글을 참고한다.

[Flash Player 10]FileReference의 변경된 보안정책과 새롭게 추가된 기능에 대한 나의 생각

아무튼, Flash Player 10 으로 업그레이드 되면서 보안문제때문에 걸리는게 한두개가 아니다. 이와 관련되서 명확히 이해할 수 있으면 좋겠다.

글쓴이 : 지돌스타(http://blog.jidolstar.com/)

Flash Player 10에 맞게 제작된 ActionScript 3.0 한글문서 입니다.
참조하세요. ^^

http://help.adobe.com/ko_KR/AS3LCR/Flash_10.0/
http://help.adobe.com/ko_KR/ActionScript/3.0_ProgrammingAS3/


글쓴이 : 지돌스타(http://blog.jidolstar.com/410)



Adobe Flex 공식사이트
에 소개된 "스타플"(http://starpl.com) 입니다.

"스타플"의 별지도, 별꾸미기, 타임라인, 위젯, 이미지 에디터는 Flex라는 프로그램 기술을 이용했습니다. 그래서 Flex 공식 사이트에 소개된겁니다. ^^

조금 아쉬운 것은 요즘 사이트 리뉴얼 작업을 하고 있는데 리뉴얼 끝나고 소개를 했으면 더욱 좋았다 싶네요. 몇일내로 더욱 빨라진 별지도와 함께 새로운 스타플을 볼 수 있을겁니다. ^^

글쓴이 : 지돌스타(http://blog.jidolstar.com/409)

+ Recent posts