아래 영상을 보고 대충 정리 

https://www.youtube.com/watch?v=v4XxHOsWtv0&list=PL09ePec21pnXcp_Cl0Y3YT1JBt-m_td2w&index=3

XGK-CPUUN이다. UN타입은 이더넷 포트가 있는 것을 의미한다. 

정상적으로 운영중이면 RUN/STOP이 녹색이 점등됨.

RUN/STOP이 적색이면 다음과 같은 상황이다. 

 

리모트가 ON이면 XG5000등에서 원격으로 RUN/STOP/쓰기 등이 가능! 

ERR이 점등되면 PLC가 멈춤(출력이 차단됨). XG5000에서 어떤 에러인지 확인이 가능함 

P.S.는 사용자 지정 플래그가 On인 경우. 

BAT는 배터리 전압이 교체가 필요하다. 

CHK는 Waring이다. 

CHK가 점멸하면 연산에러시 에러가 발생. 가령 100/0 처럼 불가능한 연산 에러.

REMOTE 스위치는 외부에서 접속해서 컨트롤하는 것을 허용 여부 결정 

M.X CHG는 운전중 모듈교체 실시한 경우 On 

RUN STOP은 XG5000에서 STOP할 수 있도록 하려면  STOP으로 되어 있어야 한다. 

 

RST/D.CLR는 리셋하기 위해 사용함. 

아래 영상을 보고 간단하게 정리한 것임. PLC 메모리에 대해 이해하는데 참 좋은 영상. 

https://youtu.be/6sGWWJoihWI?si=LRFnUaMMD7pZxC6c 

XGK-CPUUN 기준 메모리 종류

비트 단위는 마지막 값이 비트 번호임. 즉 P00000인 경우 앞의 0000는 워드 번호이고 마지막 0은 비트 번호임.
반면 워드 단위는 모두 워드 번호임. 비트를 표현하고 싶으면 뒤에 점(.)을 써야 함 

 

P: 입출력 접점 

입출력 접점P에서 워드번호는 10진수로 표현되고 비트번호는 16진수로 표현됨!

 

 

입출력 접점은 고정식과 가변식이 있음.

고정식은 슬롯에 꽂히는 모듈의 입출력 점수(point count)에 상관없이 슬롯별로 4 WORD가 할당됨 증분함. 장점은 다른 점수를 가진 슬롯을 바꿔도 앞뒤로 입출력 번호가 바뀌지 않음. 그래서 프로그램을 수정할 필요가 없음. 대신 입력16의 경우는 P00000~00000F까지만 쓸 수 있으므로 나머지 P00010~P0003F까지는 안쓰는 것으로 그냥 메모리처럼 쓸 수 있게 됨. 

반면, 가변식인 실제 모듈의 점수만큼 증분이됨. 만약 다른 점수를 가진 슬롯을 중간에 바꾸면 프로그램 수정을 해야함. 디바이스 바꾸기를 통해 할 수 있음. 

M : 내부 접점 

비트 단위 메모리임. 워드 단위 메모리는 D임. 

 

레더 코드로 M00000 비트와 M00003 비트가 모두 ON이면 M0002에 있는 Word값을 M0003으로 이동(MOV)하는 명령을 아래처럼 쓸 수 있음. MOV가 WORD 단위로 이동하는 것을 기억해야 함! 

 

K : 정전유지

K는 비트 메모리이면서 래치임. 워드 메모리인 것은 R(파일 레지스터)가 있음. 즉, 전원을 껐다 켜도... 이전 값을 계속 유지함! 

주의할 점은 K1000~K2047은 PID기능을 위해 할당된 것이기 때문에 직접 쓰지 않도록 하자! 

F : 특수 접점 

시스템 플래그이다. 이미 설정되 플래그로, 필요할 때 사용할 수 있음. 가령 RUN 상태인지 확인하려면 F00000을 보면 됨. 20ms 주기로 뭔가 동작시켜야할 필요가 있다면 F00090을 보면 되는 것임. 

D: 데이터 레지스터

M과 함께 내부 메모리 중 하나임. M과 다른 건 워 단위임. 워드는 비트와 다르게 워드번호 자체를 다 쓰게 되고. 비트 번호를 쓰려면 점(.)과 비트번호를 붙여야 함.

U: 특수 레지스터 

아날로그 고속카운터, 온도,  위치결정 등 이런 특수 모듈들은 모두 U라는 디바이스를 가지게 됨. 
Base와 Slot이 있는데 이것은 해당 모듈이 가지고 있는것이 아니라 I/O파라미터에 특수 모듈을 등록하고 모듈 변수 불러오기를 하면 그 꽂힌 위치에 따라서 할당이 됨.

아래처럼 XG5000 에서 모듈 변수 자동 등록을 하면 각 모듈이 꽂힌 위치에 따라서 자동으로 할당된다. 

T : 타이머 현재값 

타이머는 특정 시간이 되었을 때 ON하도록 함. 

XG5000에 기본파라미터 설정-디바이스 영역 설정에 가면 타이머 경계치가 나옴. 

T0000~T3999까지는 100ms임. TON T200 100은 T200이므로 100ms이다. 그런데 뒤에 숫자가 100이므로 총 10초가 되는거임. 

그래서 아래처럼 레더 다이어그램을 만들면 M00000에 비트가 ON도면 타이머가 동작해 10초가 되면 T0023 값이 ON이 되어 결국 P00020이 ON이 됨. 

C: 카운터 현재값

카운터는 신호가 정해진 수만큼 되었을 때 ON됨. 

Z: 인덱스 레지스터

인덱스는 Z에 있는 값만큼 더한 주소를 바꾸는 식으로 사용할 수 있음. 많이 사용하는 기능임

D000020[Z001]이고 Z001 = 5이면  5만큼 더한 D000025가 되는 식임. 

주의할 사항은 비트인 경우는 비트 단위로 더해야 하고 워드인 경우는 워드 단위로 더해야 한다! 

워드 디바이스에 비트 단위에서는 못쓰고 D000009[Z001].1 식으로는 사용가능! 

 

 

'자동화설비' 카테고리의 다른 글

LS Electric | PLC CPU  (0) 2024.02.29
CimonD Scada 홍보용 데모 프로젝트 간단하게 살펴보기  (0) 2024.02.28
CimonX Scada 실행화면  (0) 2024.02.28

CimonD는 사이몬 Scada 프로그램을 만드는 통합도구임. 

CimonD 데모 홍보용 프로젝트를 열면 다음과 같이 볼 수 있음 

프로젝트는 prj 확장자를 가진 파일임. 

참고로 프로젝트는 암호를 걸어둘 수 있음.

 

여기서 감시제어화면-적용분야를 하면 아래처럼 대시보드를 볼 수 있음. 

 

우측 도구 상자를 통해 디자인 아이템을 추가할 수 있음

버튼 하나를 두번 클릭하니 관련 설정창이 나옴. 대충 보면 터치했을때 동작을 "페이지열기"를 했고 열 페이지는 수문제어로 지정했음. 

수문제어 페이지는 아래처럼 다른 걸로도 바꿀 수 있음. PGX 확장자가 일종의 하나의 페이지 파일이라는 것을 알 수 있음. 

 

특정 동작을 명령할 수도 있음. 아래처럼 Exit에 Exit() 명령을 수행할 수 있음. 

수문제어 페이지를 열어보고 거기에 UI와 데이터가 어떻게 연결되어 있는지 확인할 수 잇음. 

SCADA 데이타베이스는 공통 단위로 변환된 태그들 목록을 효율적으로 관리해주는 모듈임. 통신하고자하는 PLC의 어드레스 영역을 모두 미리 등록해 놓고 사용하게 되는데, 미리 등록해 놓고 저장하는 공간을 데이타베이스라고 함. 이름을 붙인 어드레스를 태그라고 함. 태그 기반하에 SCADA 프로그램을 만듬. 이렇게 태그 기반으로 사용함으로써 얻는 이점은 PLC나 다른 어떤 장비를 쓰는지 SCADAD를 쓰는 입장에서는 관심없고 오로지 태그만 관심가지게 됨. 일종의 추상화가 된 셈임. 

이런 이미지는 수문제어.DIG4 태그가 ON할때 보이도록 한 거임. 

아래 같은 버튼 같은 것도 마찬가지. 실제로 버튼이 아니라 On이면 출몰된다는 의미임.

아래 열림 버튼은 터치시 수문제어.DIG1에 Set을 명령함. 

반대로 닫기 버튼은 터치시 수문제어.DIG1에 Reset을 명령함. 

데이타베이스에서 해당 태그 리스트를 볼 수 있고, 수정/편집이 가능함! 확장자는 dbx임. 

스크립트를 만들 수 있음. 확장자는 scx임. 수문제어에서 아날로그값이 어떻게 변화나 봤더니... 다 이 코드에서 하는 것이였음. GetTagVal로 값을 읽을 수있고 SetTagVal로 값을 쓸 수도 있음. 

 

'자동화설비' 카테고리의 다른 글

LS Electric | PLC CPU  (0) 2024.02.29
LS Electric | PLC 메모리 - XGK  (4) 2024.02.28
CimonX Scada 실행화면  (0) 2024.02.28

CimonX는 CimonD에서 개발된 Scada 프로젝트를 실행해주는 프로그램임. 

CimonX를 제대로 실행하려면 키가 필요함. 당연하게도 그렇겠지만... USB 라이선스 key가 있어야 하는데, 75개의 tag는 75만원 정도, 무제한이면 730만원 정도함. 

CimonX에서 제공하면 데모 버전을 실행해 보면 아래와 같은 대시보드 같은게 나옴. 

이 중에 수문제어를 클릭하면 다음과 같은 화면이 나옴. 

데이타베이스를 보면 몇몇 UI 요소와 매핑되어 있다는 것을 확인할 수 있음. 

시료공급시스템을 봐도 마찬가지임... 

이게 어떻게 동작하는지 확인하고 싶다면 CimonD로 이 프로젝트를 열어봐야 함

CimonD 살펴보기 : https://jidolstar.tistory.com/925 

 

이 글은 인트로스펙션이 무엇인가 아는데만 도움이 되는 수준이다. iOS Model구축을 위해서는 이 내용뿐 아니라 Key-Value Observing, Key-Value Coding도 아는게 좋다. http://blog.jidolstar.com/854


우리가 일상 c나 c++ 스타일로 개발하다보면 구조체나 클래스를 선언하고 그 선언된 구조체나 클래스를 malloc이나 new를 통해 직접 참조하고 사용한다. 이는 정적인 개발법으로 컨텍스트 통제를 철저히 하고 역할이 분명한 상태에서는 좋은 방법이다. 이 방법은 컴파일 타임에 에러를 추측할 수 있어 컴파일 기반 언어 장점을 가진다. 반대로 컴파일 타임이 아닌 런타임에 클래스를 생성하거나 메서드를 임의로 추가/삭제/교체 하던가 하는 동적인 개발법도 있다. 이 방법이 좋은 것은 매우 유연하고 통제에서 자유로워서 런타임에 컨텍스트를 내 마음대로 주무를 수 있다. 하지만 에러를 통제하기 힘들고 잘못사용하면 보안상 위험한데다가 메모리 관리도 신경쓰지 않으면 성능저하도 일으킬 수 있다는 단점이 있다.


요즘 개발법은 딱히 동적이냐 정적이냐에 치우치지 않으며 많은 언어가 이 두 방법을 섞어쓴다. 동적언어냐 정적언어냐라는 것은 사실 얼마나 한쪽에 치우쳐있는가로 갈리는 것뿐이다. 


리플렉션(Reflection)은 정의된 것을 찾는 행위로서 동적언어의 특징이다. 즉, 클래스나 메서드는 컴파일 입장에서 메모리에 올라가서 프로그램 입장에서는 그것을 호출하거나 사용할 수만 있는데, 리플랙션을 지원하는 언어는 그것 뿐 아니라 아에 정의자체를 찾아와서 조작할 수 있는 기능까지 지원한다. 



리플렉션(reflection)은 영어로 반사라는 뜻이 있다. 하지만 개발언어에서는 다른 뜻이며 한글로 반사라고 해석하면 안된다. 리플렉션은 결국 개발계의 고유명사이다. ^^



하지만 리플렉션은 컴파일 검사를 무시하게 되고 권한이나 보안을 깨뜨리기 된다. 그러므로 범용적으로 리플렉션을 쓰는 것은 그리 권장할 만한 것은 아니다. 대신 리플렉션이 정말 유용하게 쓰이는 것은 바로 펙토리 패턴(factory pattern)을 이용해 객체를 생성할 때이다. 정의된 클래스로부터 객체를 생성할 때 switch나 if문으로 분기처리하는 방법대신 클래스 이름만 알고 있으면 아름다운 방법으로 객체를 생성할 수 있다. Java의 경우 다음처럼 할 수 있다.


String[] clasNames = { "myClass1", "myClass2", "myClass3", "myClass4", "myClass5"};
try{
    @SuppressWarnings( "rawtypes" ) 
   Class[] t1 = {};
   for( int i = 0, j = clasNames.length ; i < j ; i++ ){ 
      _types.put( "test." + t0[i].substring( 2 ).toLowerCase(), 
       Class.forName( "com.cookilab.test." + t0[i] ).getConstructor( t1 ));
   }
}

위처럼 클래스의 Contructor를 저장해 두면 아래와 같은 형태로 클래스의 정의 참조가 필요없게 되어 조건문을 없애버리고 객체를 생성할 수 있다.

SuperClass r = (SuperClass) _types.get( "test.myClass2" ).newInstance(); 

iOS에서는 리플랙션(reflection)을 인트로스펙션 (Introspection)이라고 한다. 거의 마찬가지로 객체의 메타데이터(객체의 클래스, 구현 메소드, 프로퍼티, 프로토콜 등의 객체 정보)를 조사하는 과정을 의미한다.  아래 코드를 보자.

Class class = NSClassFromString(@"NSString");
id idOfClass = [[class alloc] initWithString:@"Reflection"];
SEL selector = NSSelectorFromString(@"length"];
NSLog(@"%d", (int)[idOfClass performSElector:selector];
[str release];

클래스를 직접적으로 접근하지 않고 NSString 클래스 명만 가지고 문자열 객체를 만들었고 또한 문자열 객체의 메시지도 직접 접근하지 않고 selector를 만들어 접근한다. 물론 selector가 있는지 없는지도 respondsToSelector:를 통해 알 수 있다. 아무튼 어느것 하나 진짜 정의를 직접 접근하지 않는다. 결국 이런 형태는 컴파일 타임에 체크할 수 없게되고 런타임이 되어야 에러인지 판명이 난다. 


이쯤되면 리플렉션이나 인트로스펙션이 재미있어질지 모르겠다. iOS의 경우 다음 글을 보면 이해가 될지 모른다.


Objective-C instrospection : http://soulpark.wordpress.com/2012/09/03/objective_c_introspection/

Objective-C Runtime Programming Guide : https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html


인트로스펙션을 사용하면 아래처럼 재미있는 유틸을 만들 수 있다. 이 유틸의 정적 메서드들은 동적으로 클래스나 객체의 프로퍼티를 직접 접근하지 않고 프로퍼티 이름만 가지고 정의 유무를 체크할 수 있고 값을 설정하거나 가져올 수 있다. 또한 클래스나 객체에 정의된 프로퍼티 이름 리스트까지 반환할 수 있다. 또한 프로퍼티의 클래스 정의도 가져올 수 있다. (ARC환경이라고 가정하자)

//클래스로부터 클래스 이름을 가져온다.
+(NSString*)stringFromClass:(Class)clazz {
    return NSStringFromClass( clazz );
}
//클래스 이름으로부터 클래스를 가져온다.
+(Class)classFromString:(NSString*)className {
    return NSClassFromString( className );
}
//객체로부터 클래스를 가져온다.
+(Class)classFromObject:(id)object {
    return [object class];
}
//객체로부터 클래스 이름을 가져온다.  
+(NSString*)classNameFromObject:(id)object {
    return NSStringFromClass( [object class] );
}
//객체에서 주어진 이름을 가진 프로퍼티의 값을 셋팅한다.
+(void)setPropValueOfObject:(id)object name:(NSString*)name value:(id)value {
    Ivar ivar = class_getInstanceVariable([object class], [[NSString stringWithFormat:@"_%@", name] UTF8String]);
    object_setIvar( object, ivar, value );;
}
//객체에서 주어진 이름을 가진 프로퍼티의 값을 가져온다. 
+(id)getPropValueOfObject:(id)object name:(NSString*)name {
    Ivar ivar = class_getInstanceVariable([object class], [[NSString stringWithFormat:@"_%@", name] UTF8String]);
    return object_getIvar( object, ivar );
}
//객체에서 주어진 이름의 프로퍼티를 가지고 있는가?
+(BOOL)hasPropAtObject:(id)object name:(NSString*)name {
    return [self hasPropAtClass:[object class] name:name ];
}
//클래스에서 주어진 이름의 프로퍼티를 가지고 있는가?
+(BOOL)hasPropAtClass:(Class)clazz name:(NSString*)name {
    objc_property_t p0 = class_getProperty(clazz, [name UTF8String]);
    return p0 ? YES : NO;
}
//주어지는 이름을 가진 객체의 프로퍼티를 찾아 그것의 클래스를 가져온다. 
+(Class)getPropClassOfObject:(id)object name:(NSString*)name {
    return [self getPropClassOfClass:[object class] name:name];
}
//주어지는 이름을 가진 클래스의 프로퍼티를 찾아 그것의 클래스를 가져온다. 
+(Class)getPropClassOfClass:(Class)clazz name:(NSString*)name {
    const char *nm = [name UTF8String];
    objc_property_t p0 = class_getProperty( clazz, nm );
    if( p0 == NULL ) {
        return NULL;
    }
    NSString *attr = [NSString stringWithFormat:@"%s", property_getAttributes( p0 )]; 
    NSArray *attrSplit = [attr componentsSeparatedByString:@"\""]; //"T@"NSString",R,V_test"에서 NSString만 추출해야 한다.
    NSString *className = nil;
    if ([attrSplit count] >= 2) {
        className = [attrSplit objectAtIndex:1];
    }
    if( className == nil ) return NULL;
    return NSClassFromString( className );
}
//클래스의 프로퍼티 이름을 배열로 가져온다. superInquiry는 해당클래스의 부모클래스 프로퍼티도 탐색할 것인지 결정하는 플래그다. 
+(NSArray*)getPropNamesOfClass:(Class)clazz superInquiry:(BOOL)superInquiry{
    if( clazz == NULL || clazz == [NSObject class] ) {
        return nil;
    }
    NSMutableArray *r = [[NSMutableArray alloc] init];
    unsigned int count, i;
    objc_property_t *ps = class_copyPropertyList( clazz, &count );
    for( i = 0; i < count; i++ ) {
        objc_property_t p = ps[i];
        const char *pn = property_getName( p );
        if( pn ) {
            [r addObject:[NSString stringWithUTF8String:pn]];
        }
    }
    free( ps );
    if( superInquiry ) {
        NSArray *sr = [self getPropNamesOfClass:[clazz superclass] superInquiry:YES];
        if( sr != nil ) [r addObjectsFromArray:sr];
    }
    return [NSArray arrayWithArray:r];
}

사실 위 코드만 가지고는 별로 유용하다고 볼 수 없다. 일단 유용성을 떠나서 동적으로 프로퍼티 정의가 있는지 체크하는 로직은 뭔가 캐쉬처리를 통해 속도개선해야 한다. 또한 인터페이스를 더욱 세밀하게 만들어 다양한 곳에 활용할 수 있게 만들 수 있다. 가령 값을 셋팅한다고 할때... (구축한게 아니라 이런걸 지원하는 걸 만들겠다는 것이다.)

MyModel *model = [[MyModel alloc]init];
[PropUtil setPropValueOfObject:model key:@"node1.node2[]" value:@"myValue"];

이렇게 만들면 model에 정의된 node1이름의 프로퍼티에 node2 프로퍼티가 정의되어 있고 node2는 배열이다. 여기에 문자열 "myValue"를 추가할 수 있다. 이쯤 되야 비로서 유용해질 수 있을 듯하다. 만약, 매크로(define)이나 c함수등의 인터페이스를 더 만들면 아래처럼도 가능해진다.

model( @"node1.node2[]", @"myValue"); 
NSString *v = model( @"node1.node2[#last]" ); //myValue 
즉, node1.node2배열에 "myValue"를 추가하고 방금 추가한 값을 돌려받는다. get, set은 인자의 숫자로 생각하면 된다. 즉, 짝수이면 set 홀수이면 get이다. 이걸 더 확장해서 생각해보면 아래처럼도 된다.

NSString *v = model( @"node1.node2[]", @"myValue", @"node1.node2[#last]" ); //myValue 

결국 set하고 마지막에 홀수 인자를 가지므로 그 값을 반환한다. 이쯤되면 아래와 같은 인터페이스도 가능하겠다.

NSString *v = model( @"node1.node2[]", [@"v1", @"v2", @"v3"], @"node1.node2[#last]", @"v4", @"node1.node2[#last]", __DEL__ , @"node1.node2[#last]" ); //v3

정적방식이였으면 아래처럼 해야한다.

MyModel *model = [[MyModel alloc]init];
MyNode1 *node1 = model.node1;
NSMutableArray *node2 = nodel1.node2;
[node2 addObject:@"v1"];
[node2 addObject:@"v2"];
[node2 addObject:@"v3"];
[node2 addObject:@"v4"];
[node2 removeLastObject];
NSString *v = [node2 lastObject];

길이가 확 늘어났다. 이뿐이겠는가? 위 코드는 컨테이너인 배열(NSMutableArray)의 참조를 받아 addObject, removeObject하고 있다. Model입장에서는 이런식으로 처리되는 것을 원치 않을 것이다. 뭔가 Model 내에 값이 바뀔 때, Model의 변화를 한번에 통지해야하는 방식으로 취해야 하거나 값의 유효성을 검증시켜야 한다는 상황이 발생하면 분명 해결하기 어려운 방법이다. 하지만 그에 앞선 코드인 1줄 코드를 보면 코드만 짧아진게 아니라 model()내부적으로 값의 변화를 감지해서 통제할 수 있게 된다. Model에 들어오는 자신의 데이터를 통제하고 변화를 외부에 통지할 수 있을때 진정한 Model이 아니었던가? 리플렉션(인트로스펙션)을 사용하면 바로 이러한 점을 장점으로 승화시킬 수 있게 된다.


참고 

SEL Method IMP 자료형에 대해서 : http://10apps.tistory.com/131

Java Reflection API의 사용 http://micropilot.tistory.com/entry/Java-Reflection-API-introduction

Java 리플렉션에 대한 재고(reflection)(1) http://www.hanb.co.kr/network/view.html?bi_id=1369 

Java 리플렉션에 대한 재고(reflection)(2) http://www.hanb.co.kr/network/view.html?bi_id=1370 


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




HTML5의 Canvas이미지를 가져다가 안드로이드에서 Bitmap으로 사용할 수 있다. (어떤 경우에 있겠지?) 아래 코드는 그걸 실험해 보려고 만든 테스트 코드이다. 일단 HTML5의 Canvas를 사용해 그림을 그린후 canvas.toDataURL().toString()을 사용해 Base64 문자열을 뽑아낸다. 


<!DOCTYPE HTML>
<html>
  <head>
    <style>
      body {
        margin: 0px;
        padding: 0px;
      }
      #myCanvas {
        border: 1px solid #9C9898;
      }
    </style>
    <script>
      window.onload = function() {
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");

        // begin custom shape
        context.beginPath();
        context.moveTo(170, 80);
        context.bezierCurveTo(130, 100, 130, 150, 230, 150);
        context.bezierCurveTo(250, 180, 320, 180, 340, 150);
        context.bezierCurveTo(420, 150, 420, 120, 390, 100);
        context.bezierCurveTo(430, 40, 370, 30, 340, 50);
        context.bezierCurveTo(320, 5, 250, 20, 250, 50);
        context.bezierCurveTo(200, 5, 150, 20, 170, 80);

        // complete custom shape
        context.closePath();
        context.lineWidth = 5;
        context.strokeStyle = "blue";
        context.stroke();
		
	document.getElementById("canvasData").innerHTML = canvas.toDataURL().toString();
		
      };

    </script>
  </head>
  <body>
    <canvas id="myCanvas" width="578" height="200"></canvas>
    <div id="canvasData"></div>
  </body>
</html>


결과화면은 다음과 같다. 



base64 문자열을 복사해서 다음 안드로이드 코드에서 사용해본다.
package com.cookilab.base64bitmap;

import java.io.ByteArrayOutputStream;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;

public class TestActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( new TestView(this) );
    }
    protected class TestView extends View {
        public TestView(Context context) {
            super(context);
        }
        public String encodeTobase64(Bitmap image) {
            Bitmap immagex=image;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();  
            immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            byte[] b = baos.toByteArray();
            String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);
            return imageEncoded;
        }
        public Bitmap decodeBase64(String input) {
            byte[] decodedByte = Base64.decode(input, 0);
            return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); 
        }    
        public void onDraw(Canvas canvas){
            String base64 = "iVBORw0KGg............==";
            Bitmap bitmap = decodeBase64(base64);
            canvas.drawBitmap(bitmap, null, new Rect(0, 0, 300, 100), null);
        }
    }   
}




그래서 뭘 하고 싶은거냐?

자바스크립트와 안드로이드간 통신이 가능하므로 이미지도 전송할 수 있다는 것을 보여준 셈이다. 


끝 ^^


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



Adobe Flash Builder 4.5.1 이 정식 배포되었습니다. (한국 2011년 6월 21일) 
Adobe Flash Builder 4.5에서 Flex를 이용해 iOS, BlackBerry 어플을 배포할 수 없었는데, 이 점이 개선되었습니다. 이제 Adobe Flash Builder 4.5.1 을 이용해 iOS(iPhone, iPad), BlackBerry, Android 어플을 Flex나 ActionScript 3.0으로 개발할 수 있게 되었습니다. 

아래 화면은 Flash builder 4.5.1에서 Flex 모바일 프로젝트로 Apple iOS, BlackBerry Tablet OS, Google Android 어플을 개발할 수 있음을 보여줍니다. 


아래 링크를 통해 Flash builder 4.5.1 의 개선된 내용을 확인할 수 있습니다. 
Flash Builder 4.5.1 Release Notes
Flash Builder 4.5.1 with Improved iOS Support  
 
Flash Builder 4.5.1로 업데이트 하기 위해서는 2가지 방법이 있습니다.  기존 Flash Builder 4.5가 설치했다면 다음 방법을 택일할 수 있습니다.(먼저 Download a free trial of Flash Builder 4.5 Premium Edition 에서 Flash Builder 4.5를 다운받아 설치하세요.)

1. Flash Builder 4.5 자동업데이트 기능을 이용 
이 방법은 빌더를 실행하고 Help > Search for Flash Builder Updates...로 들어가시면 됩니다. 열이아빠님의 말에 의하면 많이 느리답니다. 참고: 열이아빠님의 플래시 빌더 4.5.1 

2. 업데이트 파일을 다운받아 업데이트 실시
Adobe Flex Support Center 에서 직접 다운받으실 수 있습니다. 이 방법이 첫번째 방법보다는 빠릅니다. ^^

Flash Builder 4.5.1에는 AIR 2.6이 탑재되어 있습니다. 그러므로 최근에 배포된 AIR 2.7을 다운받아 설치하시면 AIR 2.6, AIR 2.7 환경에서 개발이 가능합니다. AIR 2.7은 iOS 어플의 속도를 적어도 4배이상 향상시켰기 때문에 AIR 2.7을 설치할 것을 권고하는 바입니다.

Flash Builder 4.5.1을 이용해 Flex 4.5.1 기반에서 개발하면 생산성이 극대화 됩니다. 하나의 프로젝트로 iOS, Android, BlackBerry 어플개발을 할 수 있습니다. 아래 링크에 있는 영상을 보시면 약 8분여만에 트위터와 연동하는 어플을 만들어 각각의 디바이스에 실행해보는 모습을 보여주고 있습니다. 

FLASH BUILDER 4.5.1 ROCKS  


여러분은 Flash Builder 4.5.1에서 iOS 어플 개발하는 방법은 다음 동영상과 문서를 통해 배울 수 있습니다. 중요한 것은 Mac뿐 아니라 Window환경에서도 iOS 어플을 개발할 수 있습니다.

Build iOS applications with Flex and Flash Builder 4.5.1
 
Using Flash Builder 4.5 to package applications for Apple iOS device 
Flex/AIR for iOS Development Process Explained! 

Android와 BlackBerry 어플을 어떻게 만드는지도 알 수 있습니다. 다음 문서들을 보세요.
Using Flash Builder 4.5 to package applications for Google Android device 
Using Flash Builder 4.5 to package applications for BlackBerry Tablet OS devices 


기존 Flash 개발자나 Flex, ActionScript, AIR 개발자는 모두 별 어려움없이 iOS, Android, BlackBerry 어플을 개발할 수 있다는 점이 이번 Flash Builder 4.5.1 배포의 가장 큰 매력이 아닌가 생각합니다. 

하지만 한가지 아셔야 하는 것은 각각 OS별로 특정 기능은 지원할 수 없다는 점입니다. 가령 안드로이드 기반의 위젯같은 것은 현재로선 개발이 불가능하지요. 그러므로 이런 경우에는 원래 개발 방식대로 개발해야할 것입니다. 

AIR 2.7이 Linux 환경에서 더이상 지원하지 않는다는 뉴스는 개발자로서 아쉬움이 남지만, Flash Builder 4.5.1의 런칭으로 극복되길 바라는 바입니다.


참고글 

열이아빠님의 플래시 빌더 4.5.1
Download a free trial of Flash Builder 4.5 Premium Edition
Adobe Flex Support Center - 여기서 Flash Builder 업데이트 버전을 직접 받을 수 있습니다.
Flash Builder 4.5.1 Release Notes
FLASH BUILDER 4.5.1 ROCKS  
Flash Builder 4.5.1 with Improved iOS Support
Build iOS applications with Flex and Flash Builder 4.5.1
Flex SDK and Flash Builder updates available - adds iOS and BlackBerry PlayBook support
(동영상)Mobile Application Development with Flex and Flash Builder
Flash Builder Developer Center 
Adobe Flash Builder 4.5.1, AIR 2.7 and iOS
Hands On with Flash Builder 4.5.1 for Apple iOS 
Flex/AIR for iOS Development Process Explained!
Build iOS applications with Flex and Flash Builder 4.5.1  
Build Mobile Apps for Android Devices, BlackBerry PlayBook, iPhone and iPad Today! 
(우야꼬)Flash Builder 4.5로 iPhone 4용 듀얼 브라우져 앱 만들기 
(지돌스타)Adobe AIR 2.7 SDK 및 Runtime 정식 런칭. iOS환경에서 4배 빨라졌다! 
Episode : Mr.MixIt And Pyramix Games For Android and iOS 
What’s your favorite Flash Builder 4.5 feature?
Flash Builder 4.5 에서 plug-in 버전 설치 하기
AIR 2.7 now available for desktop, Android, iOS and Blackberry Tablet OS.

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

아이폰용도 나왔습니다. ^^ 

http://itunes.apple.com/app/id446340438
  



스타플(http://starpl.com)에서 친구들과 함께 하는 SNS형 다마고치 '스타펫' 어플을 출시했습니다. 

지금 바로! 안드로이드 마켓에서 다운로드 받을 수 있어요.(아이폰용도 조만간 오픈할 것입니다.)

스타펫받기 : https://market.android.com/details?id=com.starpl.android.starpet


 


귀여운 스타펫과 함께 보내신다면 여러분의 하루가 더 즐겁지 않을까요? ^^












*** [스타펫]으로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다. 
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.


*** 다양한 스타플 연동 어플리스트

(안드로이드)바른생활
(안드로이드)책을읽자!
- (안드로이드)아이돌배틀
- (안드로이드)자랑질

(아이폰)책을읽자!
(아이폰)바른생활
(아이폰)신조어능력시험
(아이폰)어플지름신
(아이폰)타임라인 
(아이폰)오픈배경화면

- (아이폰)자랑질 

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



Adobe AIR 2.7 버전이 정식 배포되었습니다. 개발자를 위한 SDK와 Runtime이 함께 배포되었습니다. Adobe AIR 2.7은 데스크탑 또는 모바일 환경 모두 동작하며 모바일의 경우 안드로이드 2.2 이상, BlackBerry Tablet OS, iOS 4.0 이상에서 동작합니다. 

현재 Flash Builder 4.5는 아직 Flex기반 iOS 어플 개발이 불가능하지만 Flash builder 4.5가 이번 달에 새로 배포되면 AIR 2.7이 같이 탑재되면서 Flex로 iOS 어플 개발이 가능하게 됩니다. 현재 Flash Builder 4.5에 AIR 2.7이 없어서 Flex로 iOS 개발을 막아놓았던 것 같네요.

iOS를 위한 AIR 어플은 CPU모드에서 4배이상 빠른 렌더링을 지원합니다. 기존에 Flex로 iOS기반 어플을 만들게 되면 퍼포먼스 문제가 있었는데 이 부분이 말끔하게 해결된 듯합니다. 다음 동영상을 보세요. 

Adobe AIR 2.7 : Faster app performance on iOS  http://goo.gl/VJxnR 

 iOS에서 디버깅 및 테스팅 환경이 많이 개선되었다고 합니다. 또한 Android기반에서 SD카드에 AIR 런타임을 설치할 수 있게 되었습니다. 

데스크탑환경에서 Media Measurement를 위한 통합기반이 지원됩니다. Adobe Flash Player 10.3에서 부터 지원되었으면 AIR 2.7에서도 이것을 지원합니다. 관련된 내용은 아래 링크를 참고하세요.

Measuring video consumption in Flash : http://goo.gl/wPcf0 

또한 Acoustic Echo Cancellation를 지원합니다. Flash Player 10.3에서도 지원하고 있습니다. 여기에 관련된 API가 도입됨에 따라 헤드셋없이도 애코조절이 훨씬 원할해집니다.

그리고 HTMLLoader에서 HTML 컨텐츠에 대한 로케이션 제어 권한이 훨씬 향상되었습니다. 과거에 이 부분때문에 고생한 적이 생각난다는..... 

다음 사이트들을 둘러보시면 AIR 2.7을 이해하는데 더욱 도움이 될 것입니다. 

Adobe AIR 2.7 Now Available : iOS apps 4x Faster! : http://goo.gl/5IEIz 
Adobe AIR 2.7 Developer Release Notes : http://kb2.adobe.com/cps/906/cpsid_90612.html 
Adobe AIR 공식페이지 : http://www.adobe.com/products/air/
Download Adobe AIR SDK : http://www.adobe.com/products/air/ 
Adobe Flash Builder : http://www.adobe.com/products/flash-builder.html

글쓴이 : 지돌스타(http://blog.jidolstar.com
2011년 5월 28일에 진행한  ACC 기술세미나에 스피커로 참여했습니다. 주말 좋은 날씨임에도 불구하고 귀중한 시간 내어주신 분들께 감사드립니다. 어려운 주제임에도 끝까지 경청해주셔서 더욱 고맙고요. 

구준호님이 촬영해 주신 인증샷 ^^


출처 : Flash Platform facebook 사이트 http://facebook.com/flashplatformkr



아마도 많은 분들이 발표자료를 보고 싶어하실 것 같아 블로그를 통해 공유해드립니다. 


발표 PPT 


Molehill3D 예제소스 다운로드
http://goo.gl/pFHEv 

위 예제소스는 Flash Builder 4.5 기반에서 만들어진 것들입니다. 이것 자체가 Workspace이므로, 다운로드 받은 파일을 압축을 푼뒤 Flash Builder 4.5 메뉴에서 File > Switch Workspace를 통해 위 소스를 경로로 잡으면 되겠습니다. (되도록이면 압축푼 장소를 영문경로로 잡아주세요. 한글경로로 잡으면 안될 수도 있습니다.)

발표 중간에 몇가지 유용한 정보를 말씀드렸습니다.
- Flash Player 11 Incubator ActionScript 3.0 API 문서 (임시): http://jidolstar.net/asdocs/incubator/   
- Molehill 3D API (Stage3D API) 관련 유용한 링크들 : http://goo.gl/pcIzG
- Adbobe Flash Builder 4.5에서 Molehill 3D 개발환경 및 Away3D 4.0 예제 실행방법 :  http://goo.gl/uXuH2
- Adobe Flash Platform 한국 SNS : http://facebook.com/flashplatformkr 

이번에 발표내용은 저 자신도 너무 어렵고 힘든 주제였습니다. 그럼에도 불구하고 세미나 주제로 이것을 정한 이유는 이 분야에 대한 관심을 가지는 개발자들이 많아져서 많은 정보를 공유할 수 있는 분위기가 되었으면 하는 작은 바램이 있기 때문입니다. 저 자신도 열심히 공부해서 뭔가 의미있는 결과를 만들어내길 강하게 바라고 있습니다. 함께 좋은 정보 공유하길 바랍니다. 

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

이 글은 어도비 공식블로그에도 발행되었습니다.
큰변화 1 : http://blog.naver.com/adobe_korea/100129033987
큰변화 2 : http://blog.naver.com/adobe_korea/100129042984 
큰변화 3 : http://blog.naver.com/adobe_korea/100129043356


Adobe Flash Builder 4.5 는 Flex와 ActionScript 언어를 사용하여 모바일, 웹, 데스크탑 어플리케이션을 신속히 제작할 수 있는 통합개발도구(IDE)이다.

이번에 출시된 Flash Builder 4.5에는 Apple의 iOS, Google의 Android, Blackberry Tablet OS 모바일 어플리케이션 개발 및 테스트, 배포를 위한 기능이 추가되었다. 또한 Flash Builder 4.5는 개발 및 테스트 할 수 있는 시간을 크게 단축시키기 위한 도구 지원하고 더욱 향상된 성능으로 완성도 높은 어플리케이션을 개발할 수 있도록 도와준다. 또한 Flash Builder와 Adobe Flash Catalyst를 이용해 개발자, 디자이너간에 쌍방향 워크플로우를 가능하게 함으로써 프로젝트 디자인 및 개발을 동시에 수행할 수 있도록 했다. Flash Builder 4.5는 기존 Flex 3, Flex 4, Flex 4.5 버전에 상관없이 모든 Flex 버전에 대응할 수 있도록 했다.
 
이 문서는 Flash Builder 4.5에 어떠한 큰 변화가 있는지 구체적인 설명을 통해 이해시키는데 도움을 주는 것을 목적으로 한다.

큰변화 1. 모바일 및 멀티스크린 어플리케이션 개발
Flash Builder 4.5는 Flex 및 ActionScript를 이용해 모바일 AIR 어플리케이션을 개발, 테스트, 배포를 지원한다. 기존 Flash Builder를 이용했던 개발자들의 경험을 그대로 반영하여 웹, 데스크톱, 모바일 어플리케이션을 만들 수 있다. Flash Builder 4.5부터는 Google Android, Apple iOS, Blackberry Tablet OS 어플리케이션도 개발할 수 있게 되었다.

현재시점(2011년 5월)에 공식배포되어 있는 Flash Builder 4.5는 ActionScript Mobile Project상에서 Android, iOS 어플리케이션만 개발이 가능하며, Flex Mobile Project의 경우에는 Android 어플리케이션만 개발이 가능하다. 하지만 2011년 6월에 Flash Builder 4.5는 한번더 업데이트가 될 예정이며 앞서 언급한 모든 OS의 어플리케이션 개발이 가능하겠다.

Adobe Flex 4.5 SDK는 아래화면처럼 모바일 환경에 알맞은 일반적인 템플릿를 제공한다. Flash Builder 4.5는 이 Flex 4.5 SDK를 이용한 프로젝트를 개발할 수 있도록 지원해준다.

Adobe Flash Builder 4.5의 Mobile Project Wizard

Flash Builder 4.5에서 모든 모바일 프로젝트는 데스크탑 시뮬레이터 또는 디바이스를 선택적으로 연결하여 테스트 및 디버깅을 할 수 있다. 중요한 것은 같은 프로젝트내에 같은 소스를 가지고 다양한 디바이스 환경에 적용할 수 있다는 점이다. 이것은 Flash Builder 4.5가 멀티스크린 어플리케이션 개발환경을 제공한다는 것을 의미한다. 또한 Flash Builder 4.5는 개발 완료시 배포를 위해 간소화된 방법을 제공하고 있다.

다음 링크를 통해 Adobe Flex 4.5 SDK와 Flash Builder 4.5를 이용한 개발에 대해서 대략적으로 학습해 볼 수 있다.

- Hello World: Build a mobile app in five minutes
- (동영상)Guided Tour of mobile application development with Flash Builder 4.5
- Mobile development using Adobe Flex 4.5 SDK and Flash Builder 4.5
- [따라하기]Flash Builder 4.5로 iPhone 4용 듀얼 브라우저 앱 만들기


큰변화 2. Flex 와 ActionScript 프로젝트 코딩 및 테스트 시간 단축
Flash Builder 4.5는 최적화된 코딩 환경을 제공하기 위한 기능이 추가되었다. 이것은 좀더 코딩을 더욱 빠르고 생산적인 코딩이 될 수 있도록 한다.

코드 템플릿(Code template), 퀵어시스트(Quick Assists), 코드힌트(Code hits), 메타데이터 코드(Metadata code) 자동 완성 등 Flash Builder 4.5는 코딩 시간을 단축시키기 위한 갖가지 기능들을 제공한다.

여기서는 코드 템플릿과 퀵어시스트만 살펴보겠다.

2.1 코드 템플릿(Code Template)
Flash Builder 4.5부터 코드 템플릿(또는 snippets: 쓸모있는 코드 조각) 지원이 추가되었다. 이것은 자주 사용하는 MXML, ActionScript, CSS 코드를 미리 추가해 개발자가 일일히 타이핑하지 않고  개발할 수 있도록 도와준다. Flash Builder 4.5에는 package, class, for 루프, while 루프, switch 블록등과 같은 100개가 넘는 코드 템플릿이 제공된다. 개발자는 자신의 커스텀 템플릿도 정의할 수 있으며 템플릿을 import/export할 수 있어 다른 개발자와 공유할 수도 있다.
 
아래 화면은 메뉴에서 Window > Preferences를 선택한뒤 Flash Builder > Editors > Code Templates를 선택했을때 모습이다. ActionScript, CSS, Flash Builder, MXML의 코드 템플릿이 적용되어 있다. 화면에서 MXML의 Button 클래스 코드 템플릿을 Preview창에서 확인할 수 있다.

실제 코딩시에는 아래 화면처럼 Button을 입력한 뒤 Ctrl+Space키를 누르면 아래와 같이 코드힌트를 볼 수 있다. 여기까지는 이전 Flash Builder에서도 제공하는 것이다. (참고 : MacOS에서는 Spotlight의 단축키가 Ctrl+Space로 되어 있으므로 설정>Spotlight에서 단축키 사용을 해제하면 된다.)


다시 한번 Ctrl+Space를 누르면 아래 화면처럼 Button에 대한 코드 템플릿만 보이게 된다. 해당 템플릿을 선택후 더블클릭 또는 Enter를 입력하면 코드가 추가된다.


아래 화면은 Button의 코드템플릿을 사용해 코드를 추가한 결과화면이다.


2.2 퀵어시스트(Quick Assists)
퀵어시스트는 코드 템플릿만큼이나 굉장히 유용하다. 이벤트 핸들러 함수를 자동으로 생성, 변수나 메서드의 이름을 리펙토링, Getter/Setter 생성, 로컬변수 및 인스턴스 변수 자동 생성, import 생성, 로컬변수를 인스턴스 변수로 변경, 생성되지 않은 클래스 및 메서드 생성 등등 거의 못하는게 없다. 퀵어시스트를 받을 부분에 커서를 올려놓고 Ctrl+1(MacOS에서는 Cmd+1)을 시도해보면 되겠다.

퀵어시스트를 조금 맛보도록 하자. 아래 코드처럼 UserVO 클래스를 만들고 생성자에 result.createCursor()을 만들었다. 앞으로 result는 ArrayCollection 클래스의 변수가 될 것이다. result위에 커서를 올려놓고 ctrl+1를 눌러보자. 아래화면처럼 2가지 선택이 나온다. 하나는 result 로컬변수 또하나는 인스턴스 변수이다. 로컬변수를 선택하자.


우리는 자동으로 아래 코드처럼 var result:Object 로컬변수가 생성되었음을 알 수 있다. 생성된 로컬변수 result위에 커서를 올려놓고 ctrl+1키를 눌러보자. 이번에는 새로운 퀵어시스트가 나온다. 첫번째는 로컬변수를 필드로 변환한다는 것, 두번째는 UserVO안에서 result 이름을 바꾼다는 것, 세번째는 Workspace내에 모든 result의 이름을 바꾼다는 것이다. 우리는 첫번째를 선택할 것이다.


아래처럼 result는 로컬변수에서 인스턴스 변수로 변경되었음을 알 수 있다.


result의 변수 타입을 Object에서 ArrayCollection으로 변경하고 ArrayCollection에서 퀵어시스트를 받아보자. 우리는 의도한바 이미 정의된 ArrayCollection을 import하는 것을 선택하면 되겠다.


아래처럼 ArrayCollection클래스가 자동으로 import 되었다.

퀵어시스트는 mxml 코드 상에서도 위력을 발휘한다.

아래 코드에 click 마우스 이벤트의 핸들러 함수인 onClick 위에 커서를 올려놓고 ctrl+1 키를 눌러보자. 그럼 아래 화면처럼 event 핸들러를 생성할 것임을 퀵어시스트가 알려주고 있다. 이것을 선택하자.


퀵어시스트의 도움으로 이벤트 핸들러 함수를 MXML 코드내에 자동으로 삽입하게 되었다.

퀵어시스트 기능은 이외에도 다양한 기능이 있으므로 필요하다면 Ctr+1(MacOS에서는 Cmd+1)을 활용하길 바란다.

코드 템플릿 및 퀵어시스트외에 코드힌트(Code hits), 메타데이터 코드(Metadata code) 자동 완성등 빠른 개발을 위한 기능에 대해 조금더 알아보고 싶다면 다음 글을 참고하길 바란다.

- Coding productivity enhancements in Flash Builder 4.5 



큰변화 3. 디자이너/개발자 워크플로우(workflow) 개선
이전 버전인 Flash Builder 4와 Flash Catalyst CS5는 개발자와 디자이너 간에 Flex 프로젝트를 진행하기 위한 협력도구 관계이다. 그 점은 지금도 변함없지만 이전 버전의 문제는 추가적인 개선을 위해 디자이너와 개발자간에 양방향 워크플로우를 지원하지 못했다는 점이다. 결국 개발이 끝난 Flex코드는 더이상 디자이너가 고칠 수 있는 여지를 마련되지 못했는 것이다. 하지만 Flash Builder 4.5와 Flash Catalyst CS5.5 부터는 양방향 협력이 가능하다. 다음 그림은 개선된 양방향 워크플로우를 보여주고 있다.

개선된 양방향 워크플로우



다음 링크를 통해 Flash Catalyst CS5.5 정보를 더욱 자세히 볼 수 있겠다.

- Flash Catalyst CS5.5 공식페이지
- Understanding new Flash Catalyst CS5.5 and Flash Builder 4.5 workflows
- What's New in Adobe Flash Catalyst CS 5.5
- (동영상)ADC Presents - Introduction to Flash Catalyst CS5.5 


큰변화 4.  최신 플랫폼 지원 및 성능 향상 
Flash Builder 4.5는 Eclipse의 마지막 버전(3.6.1 "Helios")을 지원한다. 또한 MacOS에서 Eclipse의 Cocoa 버전을 지원한다. 이전 Flash Builder는 Eclipse plug-in 버전을 따로 배포했다. 하지만 Flash Builder 4.5부터는 설치 디렉토리 > utilities 내에 Adobe Flash Builder 4.5 Plug-in Utility가 추가적으로 제공한다.

Flash Builder 4.5 설치시 함께 설치되는 Flex 4.5는 웹/데스크탑 어플리케이션을 위한 새로운 Spark DataGrid, Form, Image 컨트롤이 포함되었다. 또한 Flex 4.5는 모바일 어플리케이션 개발에 적합한 컨트롤을 제공한다. 
Flex 4.5에 대한 소개는 다음 링크를 참고한다.

- Introducing Adobe Flex 4.5 SDK 

Flash Builder 4.5는 종속되는 라이브러리가 많은 대용량 어플리케이션의 리팩토링 작업에 필요한 시간을 65% 단축했다. 또한 복잡한 어플리케이션을 프로파일링하는데 필요한 메모리를 60% 줄이고 그 응답속도도 향상시켜 Flex 어플리케이션 개발속도를 단축할 수 있게 되었다.


큰변화 5. PHP 개발 지원
Flash Builder 4.5는 PHP 개발자들을 겨냥한 새로운 버전의 Flash Builder가 소개되었다. Flash Builder 4.5 for PHP는 Flash Builder 4.5와 Zend Studio 8이 통합되었다. Flash Builder 4.5 for PHP를 이용하면 Flex와 PHP를 유연하게 개발이 가능해진다. 하나의 통합환경내에서 프로젝트 생성, PHP서비스 연결, 디버깅 워크플로우등이 모두 지원된다. PHP와 함께 개발을 원하는 개발자는 Flash Builder 4.5 for PHP 버전을 다운로드 받길 바란다.

다음 링크를 통해 Flash Builder 4.5 for PHP에 대해서 학습할 수 있겠다.

- Introducing Flash Builder 4.5 for PHP
- Streamlining Flex and PHP development with Flash Builder for PHP


더욱 많은 Flash Builder 4.5 정보
지금까지 Flash Builder 4.5의 큰변화라는 주제로 살펴보았다. Flash Builder 4.5 및 관련 기술들에 대한 문서 및 동영상을 아래 링크를 통해 공유하겠다.  

- Flash Builder 4.5 공식페이지
- Using Adobe Flash Builder 4.5 (PDF p.250) 
- Flex 4.5 SDK, Flash Builder 4.5 and Flash Catalyst CS 5.5 Now Available!
- Sharing projects between Flash Professional and Flash Builder
- Flex Test Drive for Mobile - Build a mobile application in an hour 
- Flash Builder Developer Center 
- Tour de Flex
- (동영상)Building Apps with Flash Builder 4.5
- (동영상)Mobile Flex 4.5 Demonstration
- (동영상)Tour de Mobile Flex on iOS
- (동영상)Preview of Flex on iOS devices
- (동영상)Flex on the iPad
- (동영상)Comb Over Charlie - an AIR 2.6 multiscreen game
- (동영상)Flex Charts on the iOS, Android and the PlayBook


스타플(http://starpl.com) 에서 자랑질 어플을 출시했습니다. 

자랑하고 싶어서 입이 근질근질한 사람들을 위한 어플입니다. 간단한 회원가입 절차후 주어진 커뮤니티 내에서 자랑해 보세요. 같은 경험, 취미, 능력들을 가진사람들과 한공간에서 이야기 하는 재미가 솔솔합니다.

- 길거리에서 원빈을 봤다.
- 거리에서 만원 주었다.
- 여자친구 생겼다.
- 남자친구 생겼다.
- 선물을 받았다.
- 시험 100점 받았다.
- 여자친구가 미인이다.
- 로또에 당첨되었다.
- 첫키스해봤다.
- 등등.....

자랑거리 있다면 자랑질 어플을 통해 자랑해보세요.

안드로이드의 마켓, 아이폰의 앱스토어 에서 지금 다운로드를 할 수 있습니다.

아이폰 : http://itunes.apple.com/app/id437781691?mt=8
안드로이드 : https://market.android.com/details?id=com.starpl.android.jarang 

 







*** [자랑질]으로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다. 
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.


*** 다양한 스타플 연동 어플리스트

(안드로이드)바른생활
(안드로이드)책을읽자!
- (안드로이드)아이돌배틀
- (안드로이드)자랑질

(아이폰)책을읽자!
(아이폰)바른생활
(아이폰)신조어능력시험
(아이폰)어플지름신
(아이폰)타임라인 
(아이폰)오픈배경화면

- (아이폰)자랑질 

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


Adobe CS 5.5가 출시 되었습니다. 동시에 Flash Builder 4.5와 Flash Catalyst CS 5.5도 함께 출시되었습니다. 개인적으로는 Flash Builder 4.5를 많이 기다렸습니다. 

Flash Builder 4.5의 공식 홈페이지는 다음과 같습니다.

Adobe Flash Builder 4.5 : http://www.adobe.com/products/flash-builder.html 

개인적으로 보는 Flash Builder 4.5의 가장 큰 변화는 모바일, Flex 4.5, PHP 개발지원등이 아닌가 싶습니다. 
특별히 기존 beta버전으로 공개되었던 Burrito에서는 안드로이드 기기 컴파일만 지원했는데 이번에는 iOS 어플 개발도 지원해줍니다. Flash IDE를 잘 사용할 줄 모르는 저로서는 가장 기다렸던 기능중에 하나입니다. 

다운로드는 다음 링크에서 Try버전으로 다운받을 수 있습니다. 

Adobe Flash Builder 4.5 다운로드 : http://goo.gl/hDi55

아래 화면은 Flash Builder 4.5를 설치하는 중간 화면입니다. AIR For Apple iOS Support가 눈에 띕니다. 


Flash Builder 설치후 실행한다음 ActionScript Mobile AIR Project를 만들면 다음과 같은 Setting 화면을 볼 수 있습니다. 기존에는 Android 어플만 개발이 가능했으나 이제 1개의 프로젝트로 아이폰, 안드로이드 개발이 모두 가능해졌습니다. (참고 : Flex Mobile AIR Project 에서는 여전히 Android 기반으로밖에 지원하지 않는 것 같았습니다.)



처음 실행해보면 아래와 같은 설정화면이 나옵니다. 이 부분은 Flash Builder Burrito를 이용해 Android 개발을 해본 사람은 친숙한 화면입니다. Apple iOS가 Target platform으로 등록되어 있음을 주목하세요. (참고 - Flex로 쉽게 모바일 어플을 만들자. - Adobe AIR Launchpad)


이제.... Flash Builder 에서도 iOS, Android 어플 개발이 모두 가능해졌군요. 더불어 테스트 해볼 것이 많아졌습니다.

참고로 Adobe CS 5.5는 현재 Try버전으로 다운받아 설치해 볼 수 있습니다. 다음 링크를 참고하세요.

Download a free trial of Creative Suite 5.5 Master Collection 

위 링크에서 다운로드 받아 설치하고 있는 화면입니다. Adobe AIR를 이용해 설치하네요. 



Adobe Flash CS 5.5, Flash Builder 4.5, Flash Catalyst CS 5.5 에 대해서 더욱 자세히 알고 싶다면 다음 링크를 참고하면 좋겠습니다.

Adobe Flash Builder 4.5 : http://help.adobe.com/en_US/flashbuilder/using/index.html
Adobe Flash Professional CS 5.5 : http://help.adobe.com/ko_KR/flash/cs/using/index.html 
Adobe Flash Catalyst CS 5.5 : http://help.adobe.com/ko_KR/flashcatalyst/cs/using/index.html 


좀더 학습을 원하시면 다음 링크도 유용합니다.

Adobe Flex 4.5 문서 : http://help.adobe.com/en_US/flex/using/index.html
Adobe Flash Platform용 ActionScript 3.0 참조 설명서 : http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/3/index.html
Adobe AIR : http://help.adobe.com/ko_KR/air/build/index.html 
Adobe 개발자 센터 :  http://www.adobe.com/devnet.html 
Tour de Flex : http://www.adobe.com/devnet/flex/tourdeflex.html 
 
글쓴이 : 지돌스타(http://blog.jidolstar.com/765)  
지난 2011년 2월말에 Flash Player 11 Incubator 버전이 배포됨에 따라서 3D GPU 가속 렌더링을 위한 Molehill을 미리 경험할 수 있게 되었다. 하지만 Molehill의 등장은 반드시 3D GPU 가속 및 3D 표현 향상만을 의미하지 않는다. 이 관점은 3D 렌더링 엔진을 이용해 2D 렌더링 형태로 활용해도 된다는 관점에서 이해될 수 있다. 기존(현재) Flash Player 10 이하에서 렌더링은 2D를 표현하기 위해 CPU를 이용한 계산으로 렌더링을 하지만 Molehill을 이용하면 이것 조차 GPU를 적용할 수 있으니 기존 2D 게임을 Molehill버전으로 바꿔주면 더욱 쾌적하고 빠른 게임이 될 수 있다.

이 글의 목적은 Molehill을 이용한 2D 그래픽 GPU 가속에 대한 내용을 소개하는데 있다. 그럼 먼저 Molehill에 대해서 간단하게 소개하고 2D 렌더링 속도에 어떤 장점이 있는지 살펴보도록 하겠다.

참고로 아래 글을 통해 Molehill관련 데모와 개발환경 구축방법을 볼 수 있겠다.

Adobe Flash Player 11 Incubator의 "Molehill" 3D를 활용하기 위한 개발환경 만들기http://blog.jidolstar.com/759 



1. Molehill을 이해하기
Flash Player 10.1 이후로 3D API가 공개되었다. 이것은 flash.display.Stage위에 flash.display.DisplayObject기반에서 3D를 다룰 수 있는 API를 추가적으로 제공해준 형태이다. 하지만 완벽한 GPU렌더링을 하지 않으며 z-sort, clipping등과 같은 3D 렌더링을 위한 주요 기능은 전부 배제되었기 때문에 몇몇사람들은 2.5D라고 불렀다.

Molehill에서 3D는 flash.display.Stage위에서 렌더링되는 것이 아니다. 전혀 다른 영역에서 그려지며 flash.display.Stage와는 철저하게 물리적으로 분리되어 있다. 즉 DisplayObject기반으로 돌아가는 것이 아니며 그것과 전혀 연관없는 다른 stage위에서 동작한다. 이와 비슷한 개념은 본인의 블로그의 StageVideo 개념에 대해서 설명하면서 이야기 한바 있다.(StageVideo는 이미 현재 공식배포중인 Flash Player 10.2 기반에서 동작되어지는 부분이다.) StageVideo처럼 별도의 영역에서 렌더링 되어진다는 것이 Molehill에서 지원하는 GPU가속의 비밀(?)인 것이다. 아래 링크를 통해 StageVideo에 대해서 이해할 수 있다.

Flash Player 10.2의 StageVideo에 대해http://blog.jidolstar.com/743

Molehill의 렌더링 영역과 기존 Stage 렌더링 영역이 물리적으로 분리되어 있다는 것은 결국 Molehill만의 별도의 API가 있다는 것을 의미한다. 구체적으로 flash.display.Stage 대신 flash.display.Stage3D 가 존재한다.


위 그림은 Stage3D의 Stage의 관계를 묘사하고 있다. Flash 2D graphics는 Stage 영역을 말하며 Stage3D[0], Stage3D[1]은 Stage3D 영역이다. Stage3D는 Stage위에 올라올 수 없으며 항상 아래에 있다. Stage가 투명인 경우에 Stage3D를 보여줄 수 있다는 점을 말하고 있다. Stage3D는 Stage속성의 stage3Ds.<Vector>를 참고하여 stage.stage3Ds[0] 형태로 접근이 가능하다. 이와는 별도로 StageVideo는 Stage3D 아래에 위치한다. Stage위에 존재할 수 있는 DisplayObject는 Stage3D위에 올라올 수 없다는 점도 기억해둘 필요 있다.

아래 그림은 Stage3D API문서의 일부분을 캡쳐한 것이다.



Stage3D는 flash.display3d.Context3D의 렌더링 영역이며 Stage3D로부터 Context3D를 참조할 수 있다.  Context3D는 일종의 메모리 공간으로 3D 객체를 다루는 데이터 영역이다. (Stage3D와 Context3D의 관계를 이해하기 위해 Bitmap과 BitmapData와의 관계처럼 해석해도 무방할 듯 싶다.) Context3D에서는 z-buffer, back buffer, Color, blend mode, pixel 및 vertex shader 프로그램, vertex stream, vertext indeices, texture 등과 같은 다양한 3D 기능이 담겨있다. 즉 진정한 3D 기능이 모두 주어진 셈이다. 참고로 아래그림은 flash.display3D 패키지에 포함되어있는 Context3D 관련 클래스들이다. 



Molehill API에 익숙해지기 위해 한글문서만큼 좋은 것은 없을 것이다. 아직 초반 기술이라 Adobe에서 제공하는 별도의 한글문서가 없지만 검색해보면 응용형태로 API를 이해해 볼 수 있도록 정리한 고마운 글도 있으니 참고바란다.

Molehill Getting Started :  http://blog.naver.com/q3korea/120126463667


위 문서에 있는 코드를 보면서 느끼겠지만 Molehill API는 매우 저수준의 언어로 구성되어 있다. 결국 학습하기가 어려울 뿐아니라 코딩하는 양도 만만치 않다. 이 때문에 Molehill API를 고수준의 언어로 랩핑(wapping)해준 새로운 3D 라이브러리를 찾기 마련이다. 이미 Away3D, Alternative3D와 같은 유명한 Flash 3D 라이브러리는 기존 Flash Player 9, 10 기반에서 제공하는 API의 인터페이스를 크게 변경하지 않고 Molehill을 경험할 수 있도록 제공하고 있다.


2. 기존 방식과 Molehill과의 2D 렌더링 속도 비교

제목에서 기존방식이라 함은 flash.display.Stage 기반의 렌더링 방식을 의미한다. 기존방식의 렌더링을 위해서는 GPU 도움을 받기 어렵다. 결국 이 기반에서 수많은 렌더링 대상 객체의 수는 제한적일 수 밖에 없었다. 물론 그 안에서도 적절한 최적화를 통해 훌륭한 게임이 많이 나올 수 있었지만 제약은 분명히 있었다.

Molehill을 2D로 표현한다는 것은 실제로는 3D지만 2D처럼 이용한다는 말과 동일하다. 


위 그림은 3D 상에서 사각형을 표현하기 위한 방법을 묘사하고 있다. 기본적으로 3D 객체는 Vertext 3개로 구성된 삼각형 모양의 조각들의 조합으로 이뤄진다. 위처럼 사각형을 하나 만든다면 삼각형 두 조각이 필요한 샘이다. 두개의 삼각형이 한개의 사각형을 이룬다는 점은 하나의 2D 객체 한개를 표현하기 위한 방법으로 사각형 하나면 되고 화면의 시선방향에 대해 사각형의 면이 직각을 이루면 그것이 2D인 것이다. 표현하는 방법은 약간 복잡하더라도 GPU 가속의 큰 도움을 받을 수 있기 때문에 그 정도는 감수할 수 있다.

2.1 기존방식 예제
작년에 필자는 Flash 어플의 속도 개선을 위한 다양한 실험을 했었다. 

Flash 속도 개선을 위한 실험 - 10만개 입자 유체 시뮬레이션 연장전!http://blog.jidolstar.com/671

어떤 언어든 당연한 이야기 이겠지만 ActionScript 3.0으로 만들어지는 코드 한줄 한줄이 Flash 어플 속도에 얼마나 영향을 미칠 수 있는가 알 수 있다. 이외에도 계산이든 렌더링이든지 속도를 향상시킬 수 있는 방법은 여전히 많다. 가령 Pixel Bender, Shader 등을 이용해서 더 빠른 속도를 만들어 낼 수 있다. 하지만 그것도 기존에 나와 있는 다양한 3D 게임들을 따라올법만한 속도는 아닐것이다. 

아래에 위 실험을 통해 사용된 코드를 볼 수 있다.

이 코드를 컴파일 하기 위해 아래 라이브러리 및 클래스가 미리 준비되어야 한다.

com.adobe.utils.AGALMiniAssembler : http://goo.gl/ITcrn 
net.hires.debug.Stats : http://goo.gl/EgZ1s


//출처 : http://wonderfl.net/c/c0Gi/read , http://clockmaker.jp
package 
{
	/**
	 * 수많은 화살표 데모
	 * 고속화를 위한 테스트 
	 * 화살표 1000개 
	 * @author Yasu
	 */
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	import flash.utils.*;
	
	import net.hires.debug.Stats;
	
	[SWF(width="465", height="465", backgroundColor="0xFFFFFF")]
	public class NoMolehillTest extends Sprite {
		private const NUM_PARTICLE:uint = 1000;
		private const ROT_STEPS:int = 120;
		
		private var forceMap:BitmapData = new BitmapData( 233, 233, false, 0x000000 );
		private var randomSeed:uint = Math.floor( Math.random() * 0xFFFF );
		private var particleList:Vector.<Arrow> = new Vector.<Arrow>(NUM_PARTICLE, true);
		private var rect:Rectangle = new Rectangle( 0, 0, 465, 465 );
		private var seed:Number = Math.floor( Math.random() * 0xFFFF );
		private var offset:Array = [new Point(), new Point()];
		private var timer:Timer;
		private var world:Sprite = new Sprite();
		private var rotArr:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
		
		public function NoMolehillTest() {
			
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.quality = StageQuality.BEST;
			stage.frameRate = 110;
			
			addChild(world);
			
			// 포스 맵의 초기화를 행합니다
			resetFunc();
			
			// 루프 처리
			addEventListener( Event.ENTER_FRAME, loop );
			
			//시간차이로 포스(force)맵과 색변화의 상태를 변경할 것임
			var timer:Timer = new Timer(1000)
			timer.addEventListener(TimerEvent.TIMER, resetFunc);
			timer.start();
			
			//화살표를 생성
			var dummy:Sprite = new Sprite();
			dummy.graphics.beginFill(0xFFFFFF, 1);
			dummy.graphics.lineStyle(1, 0x0, 1);
			dummy.graphics.moveTo(2, 4);
			dummy.graphics.lineTo(8, 4);
			dummy.graphics.lineTo(8, 0);
			dummy.graphics.lineTo(20, 7);
			dummy.graphics.lineTo(8, 14);
			dummy.graphics.lineTo(8, 10);
			dummy.graphics.lineTo(2, 10);
			dummy.graphics.lineTo(2, 4);
			
			var matrix:Matrix;
			var i:int = ROT_STEPS;
			while (i--)
			{
				matrix = new Matrix();
				matrix.translate( -11, -11);
				matrix.rotate( ( 360 / ROT_STEPS * i )* Math.PI / 180);
				matrix.translate( 11, 11);
				rotArr[i] = new BitmapData(22, 22, true, 0x0);
				rotArr[i].draw(dummy, matrix);
			}
			
			// 파티클을 생성
			for (i = 0; i < NUM_PARTICLE; i++) {
				var px:Number = Math.random() * 465;
				var py:Number = Math.random() * 465;
				particleList[i] = new Arrow(px, py);
				world.addChild(particleList[i]);
			}
			
			// 상태표시 
			addChild(new Stats);
		}
		
		private function loop( e:Event ):void {
			
			var len:uint = particleList.length;
			var col:Number;
			
			for (var i:uint = 0; i < len; i++) {
				
				var arrow:Arrow = particleList[i];
				
				var oldX:Number = arrow.x;
				var oldY:Number = arrow.y;
				
				col = forceMap.getPixel( arrow.x >> 1, arrow.y >> 1);
				arrow.ax += ( (col      & 0xff) - 0x80 ) * .0005;
				arrow.ay += ( (col >> 8 & 0xff) - 0x80 ) * .0005;
				arrow.vx += arrow.ax;
				arrow.vy += arrow.ay;
				arrow.x += arrow.vx;
				arrow.y += arrow.vy;
				
				var _posX:Number = arrow.x;
				var _posY:Number = arrow.y;
				
				var rot:Number = - Math.atan2((_posX - oldX), (_posY - oldY)) * 180 / Math.PI + 90;
				var angle:int = rot / 360 * ROT_STEPS | 0;
				// Math.abs보다 더 빠른 계산을 위해 
				angle = (angle ^ (angle >> 31)) - (angle >> 31);
				arrow.rot += (angle - arrow.rot) * 0.2;
				arrow.bitmapData = rotArr[arrow.rot];
				
				arrow.ax *= .96;
				arrow.ay *= .96;
				arrow.vx *= .92;
				arrow.vy *= .92;
				
				// 좌표 배치 좌표를 정수화해 둡니다
				arrow.x = arrow.x | 0;
				arrow.y = arrow.y | 0;
				
				( _posX > 465 ) ? arrow.x = 0 :
					( _posX < 0 ) ? arrow.x = 465 : 0;
				( _posY > 465 ) ? arrow.y = 0 :
					( _posY < 0 ) ? arrow.y = 465 : 0;
			}
		}
		
		private function resetFunc(e:Event = null):void{
			forceMap.perlinNoise(117, 117, 3, seed, false, true, 6, false, offset);
			
			offset[0].x += 1.5;
			offset[1].y += 1;
			seed = Math.floor( Math.random() * 0xFFFFFF );
		}
	}
}

import flash.display.*;

class Arrow extends Bitmap
{
	public var rot:int = 0;
	public var vx:Number = 0;
	public var vy:Number = 0;
	public var ax:Number = 0;
	public var ay:Number = 0;
	
	function Arrow( x:Number, y:Number) {
		this.x = x;
		this.y = y;
	}
}

위 코드는 아래 링크에서 실행해 볼 수 있다. 
http://wonderfl.net/c/c0Gi/read


아래 화면은 위 코드를 실행시에 CPU 사용율과 함께 스크린 캡쳐를 한 것이다.



1000개의 화살표를 렌더링하는데 40~50 FPS 정도의 속도를 유지하면서 CPU 사용율이 70~80 정도 되었다.(필자 PC 스펙이 너무 구형이라 그럴 수도... ㅡㅡ) 분명 속도 자체는 문제 없겠지만 CPU 사용율이 너무 커서 다른 업무에 방해가 될 수 있다. 결국 CPU 사용율을 줄이기 위해 stage.frameRate를 20~30으로 줄일 수 밖에 없다. 또는 성능에 따른 렌더링 주기 조정(http://diebuster.com/flash/170)을 통해 CPU 점유율을 줄일 수 있다. 



2.2 Molehill을 이용한 2D 렌더링 예제

기존방식으로 렌더링하는 것은 속도 개선 및 CPU 사용율 줄이기에 대한 노하우가 크게 필요하다는 사실을 알았다. 물론 Molehill을 쓴다고 이런 노하우는 필요하다. 그래서 같은 방법으로 노하우를 적용하되 Molehill을 함께 사용한다면 사용자의 경험을 더욱 극대화 시킬 수 있을 것이다.

좋다. 그럼 위 예제를 Molehill 버전으로 변경한 코드를 보자. html에 embed시에 wmode는 반드시 direct로 지정되어야 한다. Flash Builder에서 테스트 하시려면 http://blog.jidolstar.com/759 에서 그 방법을 알 수 있다.

이 코드는 아래 코드가 미리 있어야 하겠다.

com.adobe.utils.AGALMiniAssembler : http://goo.gl/ITcrn 
net.hires.debug.Stats : http://goo.gl/EgZ1s
minimalcomps : https://github.com/minimalcomps


//출처 : http://wonderfl.net/c/4VE6
package 
{
	/**
	 * FP11로의 테스트.5000 파티클.빠르지는 되지만 범용성 없음
	 */
	
	import flash.display.*;
	import flash.display3D.Context3D;
	import flash.display3D.Context3DBlendFactor;
	import flash.display3D.Context3DCompareMode;
	import flash.display3D.Context3DProgramType;
	import flash.display3D.Context3DRenderMode;
	import flash.display3D.Context3DTextureFormat;
	import flash.display3D.Context3DVertexBufferFormat;
	import flash.display3D.IndexBuffer3D;
	import flash.display3D.textures.Texture;
	import flash.display3D.VertexBuffer3D;
	import flash.geom.*;
	import flash.events.*;
	import flash.text.TextField;
	import flash.utils.*;
	import flash.geom.*;
	import net.hires.debug.Stats;
	import com.bit101.components.ComboBox;
	
	[SWF(width="465", height="465", backgroundColor="0xFFFFFF")]
	public class MolehillTest extends Sprite {
		private const TEXTURE_WIDTH:int = 2048;
		private const NUM_PARTICLE:uint = 16380; // 파티클 최고수 
		private var ROT_STEPS:int = 0;
		
		private var num_limit:uint = 5000; // 렌더링 하는 수
		
		private var forceMap:BitmapData = new BitmapData( 233, 233, false, 0x000000 );
		private var randomSeed:uint = Math.floor( Math.random() * 0xFFFF );
		private var particleList:Vector.<Arrow> = new Vector.<Arrow>(NUM_PARTICLE, true);
		private var rect:Rectangle = new Rectangle( 0, 0, 465, 465 );
		private var seed:Number = Math.floor( Math.random() * 0xFFFF );
		private var offset:Array = [new Point(), new Point()];
		private var timer:Timer;
		private var world:Sprite = new Sprite();
		private var rotBmp: BitmapData;
		private var text : TextField;
		
		private var combobox : ComboBox;
		
		
		private var context : Context3D;
		private var program : ShaderProgram;
		private var iBuffer : IndexBuffer3D;
		private var vBuffer : VertexBuffer3D;
		private var uvBuffer : VertexBuffer3D;
		private var texture : Texture;
		private var ortho : Matrix3D = new Matrix3D();
		private var r_rot_steps : Vector.<Number> = Vector.<Number>([0,0,0,0]);
		
		private var vb : Vector.<Number> = new Vector.<Number>();
		private var uvb : Vector.<Number> = new Vector.<Number>();
		private var ib : Vector.<uint> = new Vector.<uint>();
		private const vunit : int = 4;
		private const uvunit : int = 2;
		
		private var uirect : Sprite = new Sprite;
		
		public function MolehillTest() {
			
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.quality = StageQuality.BEST;
			stage.frameRate = 110;
			
			addChild(world);
			
			// 포스 맵의 초기화를 행합니다
			resetFunc();
			
			// 루프 처리
			//addEventListener( Event.ENTER_FRAME, loop );
			
			//시간차이로 포스(force)맵과 색변화의 상태를 변경할 것임
			var timer:Timer = new Timer(1000)
			timer.addEventListener(TimerEvent.TIMER, resetFunc);
			timer.start();
			
			//화살표를 생성
			var dummy:Sprite = new Sprite();
			dummy.graphics.beginFill(0xFFFFFF, 1);
			dummy.graphics.lineStyle(1, 0x0, 1);
			
			dummy.graphics.moveTo(2, 4);
			dummy.graphics.lineTo(8, 4);
			dummy.graphics.lineTo(8, 0);
			dummy.graphics.lineTo(20, 7);
			dummy.graphics.lineTo(8, 14);
			dummy.graphics.lineTo(8, 10);
			dummy.graphics.lineTo(2, 10);
			dummy.graphics.lineTo(2, 4);
			
			var bmpw : int = TEXTURE_WIDTH;
			ROT_STEPS = bmpw / 16; 
			var matrix:Matrix;
			rotBmp = new BitmapData(bmpw, 16, true, 0x0);
			var i:int = ROT_STEPS;
			while (i--)
			{
				matrix = new Matrix();
				matrix.translate( -11, -7);
				matrix.rotate( ( 360 / ROT_STEPS * i )* Math.PI / 180);
				matrix.scale(0.75, 0.75); // 크기를 줄였어요.
				matrix.translate( 8+i*16, 8);
				rotBmp.draw(dummy, matrix);
			}
			
			// 파티클을 생성합니다
			for (i = 0; i < NUM_PARTICLE; i++) {
				var px:Number = Math.random() * 465;
				var py:Number = Math.random() * 465;
				particleList[i] = new Arrow(px, py);
				//world.addChild(particleList[i]);
			}
			
			// ui
			uirect.graphics.clear();
			uirect.graphics.beginFill(0x000000, 0.8);
			uirect.graphics.drawRoundRect(0, 0, 200, 100, 16, 16);
			uirect.graphics.endFill();
			
			combobox = new ComboBox(uirect, 80, 8, "5000", new Array(500, 1000, 5000, 10000, 16380));
			combobox.selectedIndex = 2;
			num_limit = 5000;
			
			addChild(uirect);
			
			// 디버그용의 스탓트를 표시하고 있습니다
			addChild(new Stats);
			
			//
			stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, createContext3D);
			stage.stage3Ds[0].requestContext3D();
			stage.stage3Ds[0].viewPort = new Rectangle(0, 0, rect.width, rect.height);
			
		}
		
		private function createContext3D(e:Event):void 
		{
			context = (e.target as Stage3D).context3D;
			context.configureBackBuffer(465, 465, 0, false);
			context.setRenderToBackBuffer();
			context.setBlendFactors(Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA);
			context.enableErrorChecking = true;
			
			text = new TextField();
			text.textColor = 0xffffff;
			text.text = context.driverInfo;
			text.width = 465;
			text.y = 450;
			addChild(text);
			
			program = new ShaderProgram(context, new VertexShader(), new FragmentShader());
			ortho = MatrixUtil.ortho(rect.width, rect.height, false);        
			r_rot_steps[0] = 1/ROT_STEPS;
			
			for (var i : int = 0; i < NUM_PARTICLE; i++) {
				// 시험 삼아 정적인 다각형 정보와 매프레임 갱신하는 위치 정보를 다른 vertexBuffer로 해 보았지만, 속도적으로는 변화 없음
				vb.push( -8, -8,  0, 0);
				vb.push(  8, -8,  0 ,0);
				vb.push(  8,  8,  0 ,0);
				vb.push( -8,  8,  0, 0);
				
				uvb.push( 0,          0);
				uvb.push( 1/ROT_STEPS,0);
				uvb.push( 1/ROT_STEPS,1);
				uvb.push( 0,          1);
				
				
				ib.push( i*4+0, i*4+1, i*4+2, i*4+0, i*4+2, i*4+3 );
			}
			vBuffer = context.createVertexBuffer(vb.length / vunit, vunit);
			vBuffer.uploadFromVector(vb, 0, vb.length / vunit);
			
			uvBuffer = context.createVertexBuffer(uvb.length / uvunit, uvunit);
			uvBuffer.uploadFromVector(uvb, 0, uvb.length / uvunit);
			
			iBuffer = context.createIndexBuffer(ib.length);
			iBuffer.uploadFromVector(ib,0,ib.length);
			
			try {
				texture = context.createTexture(TEXTURE_WIDTH, 16, Context3DTextureFormat.BGRA, false);
				texture.uploadFromBitmapData(rotBmp);
				context.setTextureAt( 1, texture );
			} catch (e:Error) {
				text.text = e.message;
			}
			
			addEventListener(Event.ENTER_FRAME, loop);
		}
		
		private function loop( e:Event ):void {
			
			context.clear(0.4, 0.4, 0.5, 1); //이 정도치에 clear가 없으면 texture가 사라진다
			
			num_limit = parseInt(combobox.items[combobox.selectedIndex]);
			
			var len:uint = num_limit < particleList.length ? num_limit : particleList.length ;
			var col:Number;
			var index : int = 0;
			for (var i:uint = 0; i < len; i++) {
				var arrow:Arrow = particleList[i];
				
				var oldX:Number = arrow.x;
				var oldY:Number = arrow.y;
				
				col = forceMap.getPixel( arrow.x >> 1, arrow.y >> 1);
				arrow.ax += ( (col      & 0xff) - 0x80 ) * .0005;
				arrow.ay += ( (col >> 8 & 0xff) - 0x80 ) * .0005;
				arrow.vx += arrow.ax;
				arrow.vy += arrow.ay;
				arrow.x += arrow.vx;
				arrow.y += arrow.vy;
				
				var _posX:Number = arrow.x;
				var _posY:Number = arrow.y;
				var rot:Number = - Math.atan2((_posX - oldX), (_posY - oldY)) * 180 / Math.PI + 90;
				var angle:int = rot / 360 * ROT_STEPS | 0;
				// Math.abs의 고속화군요
				angle = (angle ^ (angle >> 31)) - (angle >> 31);
				//arrow.rot += (angle - arrow.rot) * 0.2;
				//arrow.bitmapData = rotBmp;
				
				arrow.ax *= .96;
				arrow.ay *= .96;
				arrow.vx *= .92;
				arrow.vy *= .92;
				
				// 배치 좌표를 정수화해 둡니다
				//arrow.x = arrow.x | 0;
				//arrow.y = arrow.y | 0;
				
				( _posX > 465 ) ? arrow.x = 0 :
					( _posX < 0 ) ? arrow.x = 465 : 0;
				( _posY > 465 ) ? arrow.y = 0 :
					( _posY < 0 ) ? arrow.y = 465 : 0;
				
				vb[index++] = (_posX - 465.0/2)-8;
				vb[index++] = (_posY - 465.0/2)-8;
				vb[index++] = angle >> 0;
				index++;
				
				vb[index++] = (_posX - 465.0/2)+8;
				vb[index++] = (_posY - 465.0/2)-8;
				vb[index++] = angle >> 0;
				index++;
				
				vb[index++] = (_posX - 465.0/2)+8;
				vb[index++] = (_posY - 465.0/2)+8;
				vb[index++] = angle >> 0;
				index++;
				
				vb[index++] = (_posX - 465.0/2)-8;
				vb[index++] = (_posY - 465.0/2)+8;
				vb[index++] = angle >> 0;
				index++;
			}
			vBuffer.uploadFromVector(vb, 0, num_limit*4); 
			
			context.setProgram(program.program);
			
			context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, ortho, true);
			context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 4, r_rot_steps);
			
			context.setVertexBufferAt(0, vBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
			context.setVertexBufferAt(1, vBuffer, 2, Context3DVertexBufferFormat.FLOAT_2);
			context.setVertexBufferAt(2, uvBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
			
			context.drawTriangles(iBuffer, 0, 2*num_limit);
			context.present();
		}
		
		private function resetFunc(e:Event = null):void{
			forceMap.perlinNoise(117, 117, 3, seed, false, true, 6, false, offset);
			
			offset[0].x += 1.5;
			offset[1].y += 1;
			seed = Math.floor( Math.random() * 0xFFFFFF );
		}
	}
}

import com.adobe.utils.AGALMiniAssembler;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Program3D;
import flash.geom.Matrix3D;

import flash.display.*;

class Arrow// extends Bitmap
{
	public var rot:int = 0;
	public var vx:Number = 0;
	public var vy:Number = 0;
	public var ax:Number = 0;
	public var ay:Number = 0;
	public var x:Number = 0;
	public var y:Number = 0;
	
	function Arrow( x:Number, y:Number) {
		this.x = x;
		this.y = y;
	}
}

class ShaderProgram
{
	public var program : Program3D = null;
	
	public function ShaderProgram(context : Context3D, vsh : AGALMiniAssembler, fsh : AGALMiniAssembler)
	{
		program = context.createProgram();
		program.upload(vsh.agalcode, fsh.agalcode);
	}
}

class VertexShader  extends AGALMiniAssembler
{
	//
	// 
	//  vBuffer0(x,y)     --> attribute(0) : va0.xy
	//  vBuffer1(rot,rsv) --> attribute(1) : va1.x, va1.y
	//  uvBuffer2(u,v)    --> attribute(2) : va2.xy
	//
	// 
	//  projmatrix(transposed)   --> | vc0.x  vc1.x  vc2.x  vc3.x |
	//                               | vc0.y  vc1.y  vc2.y  vc3.y |
	//                               | vc0.z  vc1.z  vc2.z  vc3.z |
	//                               | vc0.w  vc1.w  vc2.w  vc3.w |
	//
	//  texture coord step       --> vc4.x   (1/rotation steps)
	//
	// 
	//  position                 --> op.xyzw
	//
	// 
	//  texture coord            --> v0.uv
	//
	//  m44 op, va0, vc0             position = (x,y) * projmatrix
	//  mov v0, va2                  uv = (u,v)
	//  mul vt0.x, va1.x, vc4.x      
	//  add v0.x, va2.x, vt0.x       u = u + (rot*texture_coord_step)
	//
	private var src : String =
		"m44 op, va0, vc0 \n" + // m33라도 좋을지도
		"mov v0, va2 \n" +
		"mul vt0.x, va1.x, vc4.x \n" +
		"add v0.x, va2.x, vt0.x \n" +
		"";    
	
	public function VertexShader()
	{
		assemble(Context3DProgramType.VERTEX, src);
	}
}

class FragmentShader  extends AGALMiniAssembler
{
	private var src : String =
		"mov ft0, v0\n" +
		"tex ft1, ft0.xy, fs1 <2d,repeat,nearest>\n" + 
		"mov oc, ft1\n";
	
	public function FragmentShader()
	{
		assemble(Context3DProgramType.FRAGMENT, src);
	}
}
class MatrixUtil
{
	public static function ortho(w : int, h : int, rev : Boolean) : Matrix3D
	{
		return new Matrix3D(Vector.<Number>([2/w, 0, 0, 0,  0, rev?-2/h:2/h, 0, 0,  0, 0, 1, 0,  0, 0, 0, 1]));
	}
	
}


위 코드는 아래 링크를 통해 실행해 볼 수 있다.
http://escargot.la.coocan.jp/molehill_fast/index.html


아래 화면은 화살표를 5000개로 맞춰놓고 렌더링한 캡쳐화면이다. 기존방식보다 4000개 이상 처리함에도 불구하고CPU 점유율과는 비교가 안될 정도로 떨어졌고 FPS도 50~60사이이다. 


아래 화면은 16380개로 올린 결과 화면이다. CPU 점유율은 24%로 전보다 다소 올라갔으나 FPS는 변함이 거의 없다. CPU 점유율이 올라간것은 as3 코드 loop 부분이 더 복잡해서일 뿐이다. 


두가지 결과만 보더라도 Molehill을 통한 GPU 가속은 꽤나 유용함을 금방 알 수 있다. 
 
아래 링크의 예제를 통해 같은 방법으로 비교해보는 것도 괜찮을 것 같다.

기존방법 Clear Water: http://wonderfl.net/c/9R8a
Molehill이용 Clear Water  : http://wonderfl.net/c/enj6
관련 기술 설명 : http://goo.gl/eySSG


3. Molehill 기반 2D framework 소개 

Molehill을 이용해 2D를 렌더링하는 것이 얼마나 이득이 될 수 있는가 알아보았다. 이러한 이득은 곧바로 필요성으로 이어져 관련 framework 개발로 이어질 수 있다. 찾아보니 실제로 그런 프로젝트가 있었다.

소개하고자 하는 M2D라는 오픈소스 프로젝트는 Molehill을 이용해 2D을 표현하도록 하도록 하는데 목적이 있다. Molehill의 저수준의 언어 접근성을 고수준으로 만들어주어 개발이 용이하게 만든것이 특징이다. 이는 iOS기반 GPU가속 2D라이브러리인 Cocos2D와 같은 필요성에서 탄생된 프로젝트이다.



아직 진행중인 프로젝트이기 때문에 관련된 문서도 없고 기능도 제약이 있다. 

ND2D라는 라이브러리도 있다. 


ND3D를 만든 개발자가 Molehill 버전의 2D 엔진인 ND2D를 만든것이다.
위 사진은 아래 링크에서 실행해 볼 수 있다.
http://www.nulldesign.de/2011/03/10/nd2d-molehill-2d-engine/ 

소스는 아래 링크에서 다운받을 수 있겠다.
https://github.com/nulldesign/nd2d

M2D보다는 ND2D가 더 좋아보인다. ^^


4. 정리하며 

지금까지 내용을 통해 Flash Player 차세대 렌더링 엔진 Molehill을 이용해 2D 표현시 어떤 장점이 있을까 객관적인 자료를 찾아보고 분석해보았다. Molehill을 이용해 GPU 가속을 할 수 있다는 것 자체는 큰 장점이긴 하나 그만큼 연구해야할 내용은 더 많아진 것은 사실이다. 앞으로 Flash Player가 모바일에서 활약하는 날이 올때 그 빛은 엄청 발할 것이라 판단한다. 그러므로 우리 개발자들은 미리 준비할 필요가 있겠다.

Flash Player 11 Incubator를 통해 차세대 3D 엔진인 Molehill을 미리 경험할 수 있다는 것은 큰 혜택이다. 새롭게 연구해야하는 과정은 참 어렵다. 필자도 이런 어려운 과정을 겪고 있으며 혼자 이런 연구를 하는게 무척이나 힘들다. 뭔가 이러한 일을 함께 하는 사람들이 많았으면 하는 바램이다.


5. 관련글


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

스타플(http://starpl.com) 에서 제작된 아이폰/아이팟터치용 무료 어플입니다. 

★★★★★ 아이돌배틀 ★★★★★
팬심으로 대동단결! 매일매일 우리아이돌에게 ♥를 조공하세요~


■ 아이돌랭킹 ■

팬들이 조공한 ♥로 실시간/일간/주간 아이돌 랭킹을 제공합니다.
무조건 팬수가 많다고 랭킹이 높아지지 않아요!
꾸준한 팬심으로 매일매일 ♥를 조공해주세요~


■ ♥캘린더 ■ 

내가 ♥를 조공한 날을 캘린더로 보여드립니다.
♥캘린더로 아이돌을 향한 나의마음을 체크해보세요!


■ 아이돌 커뮤니티 ■

다양한 아이돌의 커뮤니티를 제공합니다.
아이돌 커뮤니티에서 팬들의 정보와 대화를 나눠보세요!


■ 친구에게 알리기 ■

다양한 SNS 서비스와 카카오톡으로 "아이돌배틀"에 초대할 수 있습니다.
우리 아이돌 랭킹 유지할 수 있도록 친구들에게 소문내 주세요!


■ 다운로드 ■ 

 
http://goo.gl/aEw8r




■ 스크린샷 ■ 




 

 ■ 참고사항 ■ 


*** [아이돌배틀]으로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다. 
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.


*** 다양한 스타플 연동 어플리스트

(안드로이드)바른생활
(안드로이드)책을읽자!

(아이폰)책을읽자!
(아이폰)바른생활
(아이폰)신조어능력시험
(아이폰)어플지름신
(아이폰)타임라인 
(아이폰)오픈배경화면

 

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



올해들어 Adobe Flash/AIR에 관련된 기술이 모바일의 흐름에 따라 급변하고 있습니다. 바쁘게 일하고 있는 사람으로써 이런 신기술을 흡수하기가 너무 어려울 정도입니다.

최근 새로운 CS 5.5버전이 발표되었고 Flash Builder 4.5가 함께 소개되었습니다. Flash Builder 4.5부터는 안드로이드 뿐만 아니라 블랙베리, iOS기반 어플도 개발할 수 있게 되었습니다. 현재 브라질에서 열리고 있는 Flash Camp에서 Flash Runtime의 미래라는 주제로 멀티스레드지원, 빠른 GC, 새로운 숫자형, Stage3D, StageVideo, Threaded video pipeline등의 차세대 Flash에 추가될 내용들이 소개되어지고 있고요. Adobe가 Flash의 GPU가속에 대한 지원을 아끼지 않으면서 3D렌더링에 대한 다양한 API가 만들어져 이미 Flash Player 11 Incubator 버전이 개발자들 사이에서 실험되고 있습니다. 모두 모바일에 초점이 맞추어 제한된 화면, 제한된 밧데리, 전혀 다른 사용자 경험에 따라 변해가고 있다는 생각입니다. 굉장히 전략적이고 빠른 대응을 하고 있습니다. 결국 시장의 급격한 변화에 Flash 기술이 따라가고 있으며 어찌보면 Cross Device, Cross Platform분야에서 만큼은 매우 선도적입니다.

Flash 기술이 급변함에 따라 예전처럼 쉽게 접근할 수 있던 Flash가 이제 더 이상 아닌 것처럼 느껴집니다. 더욱 전문성이 더해지기 시작했고 Flash의 원래 장점이였던 개발의 저변화를 통한 다양한 컨텐츠 생산이 약간 없어지는 상황이 발생하지 않을까라는 조심스런 추측도 합니다. 하지만 한편으로는 Flash IDE는 여전히 디자이너 접근을 용이하게 해주기 때문에 별 영향이 없을 것 같다는 생각도 합니다. 그러나 분명한 것은 모바일 디바이스의 대중화에 따른 사용자 경험이 바뀌고 이에 따라 기존 웹중심의 컨텐츠는 모바일 중심으로 변화하고 있다는 것에 대해 발빠르게 대응해야한다는 점은 인정해야할 사실이고 또한 준비해야합니다.

새로운 트랜드 대응에 도움을 주기 위해 관련된 정보를 링크해둡니다. 참고하시고 이를 통해 국내에서도 관련된 다양한 정보가 쏟아져 나오길 기대해 봅니다.


아래는 관련 동영상입니다.

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

개발에 참여한 아이폰/아이팟터치용 무료 어플인 '오픈배경화면'을 소개합니다.


이 어플은 스스로 작가가 되어 배경화면을 공유할 수 있습니다.  재미를 위해 짤방 공간도 곁들였습니다. 유용한 어플이었으면 해요. ^^

★★★★ 오픈배경화면 ★★★

함께 만들고 공유하는~ 오픈배경화면! 당신도 배경화면 인기작가가 되어보세요! 


■ 배경화면 갤러리 ■ 

내가 직접 만든 배경화면을 작품으로 등록해보세요. 
아이폰 배경화면의 인기작가로 이름을 떨칠 수 있는 기회를 잡으세요! 


■ 짤방 갤러리 ■ 

배경화면만 작품이냐? 짤방도 작품이다! 
채팅 또는 글쓰기에 적합한 짤방도 공유해보세요. 


■ 작가찜하기 ■ 

이 작가 정말 내 스타일이야! 이럴땐 "작가찜하기"를 터치! 
찜한 작가가 새 작품을 올리면 푸시로 알려드립니다! 
새 작품 놓치지 말고 다운받으세요~ 


■ 나의 갤러리 ■ 

내가 올린 배경화면/짤방을 관리 할 수 있습니다. 
사람들이 얼마나 다운 받았는지 매일매일 확인해보세요~^^ 


■ 다운로드 ■ 

http://goo.gl/J7q5I




■ 스크린샷 ■ 









■ 참고사항 ■  

*** [오픈배경화면]으로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다. 
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.


*** 다양한 스타플 연동 어플리스트

(안드로이드)바른생활
(안드로이드)책을읽자!

(아이폰)책을읽자!
(아이폰)바른생활
(아이폰)신조어능력시험
(아이폰)어플지름신
(아이폰)타임라인 
(아이폰)오픈배경화면




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


회사에서 제작한 안드로이드용 무료 어플인 "책을읽자!"를 소개합니다. (아이폰용도 있습니다.)


★★★★★ 책을읽자! ★★★★★ 

책 읽는 습관을 길러주는 최고의 어플! 책을읽자!
 

■ 책 등록하기 ■

내가 지금 읽고 있는 책을 쉽고 간편하게 등록할 수 있습니다. 
네이버/구글/다음 등 다양한 도서DB를 검색하여 쉽게 나의 서재를 만들어보세요!


 나의 서재 ■

지금 내가 가진 책을 한눈에 볼 수 있으며, 얼마나 읽었는지 상태를 알려줍니다. 
게다가 같은 책을 읽고있는 다른 사람의 서재에서 쉽게 책을 등록 할 수도 있어요!


■ 북스토리 ■

같은 책을 보고 있는 사람들과 커뮤니티를 제공합니다. 
내가 보고 있는 책을 주제로 사람들과 이야기를 나눠보세요!


■ 북카페 ■

북스토리에서 오가는 책추천, 후기, 서평들을 모아모아 북카페가 만들어집니다. 
북카페에서 수많은 최신 도서 정보를 만나보세요!


■ 푸시알림 ■

읽다가 중단한 책, 아직 읽지 않은 책이 있으면 푸시 알림을 보내드립니다. 
책 읽는 습관을 길러주는 나의 독서 동반자, 책을읽자!
 

■ 다운로드 ■

http://goo.gl/GWaZI



아래주소는 아이폰용입니다.
http://goo.gl/9sxw0



■ 참고사항 ■

*** [책을읽자!]로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다. 
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.


*** 다양한 스타플 연동 어플리스트

(안드로이드)바른생활
- (안드로이드)책을읽자!

(아이폰)책을읽자!
(아이폰)바른생활
(아이폰)신조어능력시험
(아이폰)어플지름신
(아이폰)타임라인 
- (아이폰)오픈배경화면


■ 스크린샷 ■











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


 

어도비는 2011년 2월 말에 Flash Player Incubator를 배포했다. 이것은 Flash Player 11이 정식 배포되기 전 개발자들이 테스트할 수 있도록 Adobe에서 실험용 버전으로 배포한 것이다. 다음 링크는 Flash Player Incubator 공식 페이지이다.

Adobe AIR and Adobe Flash Player Incubator : http://goo.gl/aFqZH

이 글은 Flash Player Incubator에 대한 간략한 소개와 함께 Flash Builder 개발환경을 만들어 테스트하는 방법을 다룬다.(처음 해보는 사람을 위해서 자세하게 쓰려고 노력했다.)

1. Flash Player Incubator 에 대해

이번에 개발용으로 배포된 Flash Player Incubator는 다음 두 가지 feature가 추가되었다.

1.1 "Molehill" 3D API
GPU가속을 위한 low-level 3D API를 지원한다.  기존 Flash Player 10.2에서 지원하지 못했던 z-buffering, stencil color buffer, fragmentvertex shader, 큐브 텍스처 등을 기본으로 지원한다. 이 API를 사용하면 윈도우에서는 DirectX 9, 리눅스와 MacOS에서는 OpenGL 1.3, 그리고 모바일에서는 OpenGL ES 2.0 기반에서 렌더링이 될 수 있도록 한다. 만약 여기에 상관되어 있지 않다면 기존처럼 CPU 렌더링한다. 기존 Flash Player 10.1 에서는 3D API가 있긴 하지만 z-buffering을 지원하지 않으면서도 수백 개의 폴리곤을 CPU 렌더링하는데 30fps가 나왔던 반면, Molehill에서는 z-buffering이 적용된 수십만 개의 폴리곤을 HD급으로 렌더링하는데 60fps가 나온다. 단, 웹브라우져에서 이를 실행하는 경우, GPU가속을 하기 위해서는 wmode가 direct로 설정되어야 한다. 다음 페이지는 Flash Incubator의 Molehill 3D API에 대한 Adobe 공식 페이지이다.

3D APIs for Adobe Flash Player and Adobe AIR : http://goo.gl/yLdvx

3D APIs는 매우 low-level API이기 때문에 직접 다루면 개발 생산성과 효율성에 문제가 있을 수 있으므로 Alternative3D, Away3d, CopperCube, Flare3D, Minko, Sophie3D, Yogurt3D와 같은 ActionScript 3D 프레임워크들로 좀더 쉽게 개발할 수 있는 환경이 조성될 것이다. 이들 중에 조사한바 다음 프레임워크는 Molehill 3D APIs를 지원하고 있다.

1.2 Cubic Bezier Curves
flash.display.Graphic에 cubicCurveTo 메서드가 추가되었다. 이 메서드는 커스텀 ActionScript 코드를 사용하지 않고 쉽게 Cubic Bezier Curve를 그릴 수 있게 해준다. 어떤 것인지 궁금하면 다음 동영상으로 보자.

http://www.vimeo.com/10187896
http://goo.gl/yooER

이 글은 위 두 가지 feature중 Flash Player Incubator 환경에서 "Molehill" 3D APIs를 테스트할 수 있는 개발환경을 구성하는 방법을 소개한다. 특별히 Flash Builder Burrito를 기반으로 설명할 것이다. 아쉽지만 Flash CS5 IDE 사용방법을 몰라서 이에 대한 설명은 하지 않겠다. 대신 Flash CS5에서 테스트 환경 구성은 다음 글을 통해 공부할 수 있다.

http://blog.naver.com/q3korea/120125249427


2. Flash Player Incubator 버전 설치하기 

Flash Player Incubator는 현재 MS Windows, MacOSX, Linux용으로 배포하고 있다. 
http://labs.adobe.com/downloads/flashplatformruntimes_incubator.html

설치를 할 때 문서 아래에 Uninstaller를 먼저 실행하고 설치하기 바란다. 이 버전은 다 개발용이기 때문에 Debugging 기능이 내장되어 있다. 설치를 하지 않으면 아래 예제들을 실행할 수 없다.

참고로 Google Chrome을 사용하면 구동되는 Flash Player를 선택할 수 있다. 기존 Flash Player를 지우지 않고 전환해서 테스트 해볼 수 있기 때문에 유용하다. 다음 글을 참고한다.

Google Chrome 에서 Flash Player 10과 11(Molehill)을 전환하여 사용하는 방법 : http://ufx.kr/blog/142 


3. Molehill 3D 경험하기

Molehill 3D API의 결과물을 한번에 볼 수 있는 동영상을 경험해보길 바란다. 
http://blog.theflashblog.com/?p=2638

다음 링크를 통해 Molehill 3D APIs 를 이용한 다양한 Flash 어플들을 실행해 볼 수 있다. 단, Flash Player Incubator 버전이 여러분의 브라우저에 설치 되어야만 제대로 볼 수 있다.
 

http://molehill.zombietycoon.com/


http://alternativaplatform.com/en/demos/maxracer/


http://alternativaplatform.com/ru/demos/metro2033online/


http://www.lidev.com.ar/demos/fractals/tree/broomstick/



http://www.mcfunkypants.com/2011/molehill-terrain-demo/



http://infiniteturtles.co.uk/projects/away3d/broomstick/ShallowWaterDemo.html


http://www.swfgeek.net/2011/02/28/cubewall-using-away3d-4-0broomstick-jiglibflash-on-molehill/



http://not-so-stupid.com/clients/not-so-stupid/away4/duck/




http://aerys.in/minko-quake-3



http://infiniteturtles.co.uk/projects/away3d/broomstick/LoaderOBJTest.html




http://infiniteturtles.co.uk/projects/away3d/broomstick/EnvMapTest.html




http://infiniteturtles.co.uk/projects/away3d/broomstick/AnimBlendTest.html




http://infiniteturtles.co.uk/projects/away3d/broomstick/EnvMapDiffuseTest.html



http://acemobe.com/dungeon/demo.php



http://www.ambiera.com/coppercube/demo.php?demo=backyard



http://iflash3d.com/performance/how-fast-is-molehill/



http://ryanspeets.com/uncategorized/adobe-releases-molehill/



http://www.nulldesign.de/wp-content/uploads/2011/nd2d_spritesheets/Main.html



http://www.ringo.nl/projects/jiglibflash/Away3DGridSystem.html
http://www.ringo.nl/projects/jiglibflash/Away3DTriangleMesh.html
http://www.ringo.nl/projects/jiglibflash/Away3DStackingTest.html
http://www.ringo.nl/projects/jiglibflash/Away3DTerrainTest.html
http://www.ringo.nl/projects/jiglibflash/Away3DCarDrive.html

더 많은 데모 : http://blog.theflashblog.com/?p=2607


4. Flash Player Incubator용 API 문서 보기

Flash Player Incubator에 적용된 API를 학습하기 위한 문서이다. 다운로드 받아 보면 좋겠다.
Download the documentation for Flash Player 11,0,0,58 

API 문서를 보기 전에 아래 글을 선행적으로 본다면 이해하는데 도움이 될 것이다.
Digging more into the Molehill APIs
MoleHill Getting Started


5. Flash Builder Burrito에 Flash Player Incubator 개발환경 만들기

Flash Builder Burrito는 beta 버전으로 Flex Hero 및 모바일 개발을 할 수 있는 환경을 제공한다. Flash Builder Burrito에 함께 포함되어 있는 Flex SDK는 Flash Player 10.1 기반으로만 개발할 수 있기 때문에 Flash Player Incubator 환경에서 개발할 수 있는 환경을 따로 구축할 필요가 있다. 다음 과정을 통해 개발 환경을 구축 할 수 있다.

5.1. 다운로드
개발 환경을 구성하기 전에 다음 링크를 통해 해당 자료를 다운로드 받는다.

- Flash Player 11,0,0,58 Incubator : http://goo.gl/yXySu
- Flash Builder Burrito(로그인 필요) : http://goo.gl/iM7g
- playerglobal.swc : http://goo.gl/NnEyx
- Flex SDK 4.5.0.19786 : http://goo.gl/2lAIb

5.2. 설치

설치하는 과정은 아래 순서대로 따라 하면 되겠다. 복잡하지 않으니 천천히 하도록 하자.

첫 번째로 Flash Player 11,0,0,58 Incubator를 설치한다. 이 글대로 진행했다면 이미 설치가 되었을 것이다. 설치가 정상적으로 이루어졌다면 해당 브라우저에서 Flash Player가 구동이 될 때 화면 아래 Flash Player 11,0,0,58 문구가 고정되어 새겨져 있을 것이다.

두 번째로 Flash Builder Burrito를 설치한다. Flash Builder Burrito는 일종의 Flash관련 어플을 개발하는 Adobe공식 통합개발도구(IDE)이다. Flash Develop, FDT등 다양한 툴이 있긴 하지만 여기서는 Flash Builder Burrito만 다룬다. 개인적으로는 Eclipse plug-in 버전을 다운받아 설치할 것을 권장 하지만 Flash Builder 에 제작 환경에 경험이 없다면 그냥 All-in-one 버전으로 설치한다.

세 번째로 Flex SDK 4.5.0.19786를 압축을 풀어 {Flash Builder Burrito 설치 경로}/sdks/에 복사해 넣는다. 윈도우라면 /Program Files/Adobe/Adobe Flash Builder Burrito/sdks/flex_sdk_4.5.0.19786 이 될 것이다. 이 SDK는 Flash Player 10.2에 대응하도록 되어 있다. 

네 번째로 다운받은 flashplayer_inc_playerglobal_022711.swc를 {Flash Builder Burrito 설치 경로}/sdks/frameworks/libs/player에 11.0 폴더를 만들고 복사한다. 이름을 playerglobal.swc로 수정한다. playerglobal.swc 는 Flash Player 11.0 이상의 API를 이용해 개발하고 컴파일할 수 있도록 하기 위해 필요하다. 

다섯 번째로 Flash Builder Burrito를 실행한다. 중간에 워크스페이스 경로를 설정하는 부분이 있는데 원하는 경로로 설정하면 되겠다. 이 경로상에 여러분의 Flash, AIR 프로젝트 들이 생성될 것이다.


5.3. 설정

Flash Builder를 이용해 몇 가지 설정을 통해 개발환경을 만들어보자.

첫 번째로 메뉴에서 Window > Preference로 들어간다. 창이 뜨면 왼쪽에 Flash Builder를 펼치고 그 안에 Installed Flex SDKs를 선택한다. 아래 화면과 같이 나올 것이다. 
 


여기에서 아까 설치했던 Flex SDKs를 추가한다. 좌측에 Add 버튼을 누르고 {Adobe Flash Builder Burrito 설치경로}/sdks/flex_sdk_4.5.0.19786 를 선택한다. 이때 Name은 Flex 4.5(FP11)로 정하자. 그리고 추가된 SDK를 위 그림처럼 Default SDK로 체크한 뒤 OK를 누른다.

두 번째로 ActionScript 3.0 프로젝트를 생성하고 몇 가지 설정을 하겠다. 메뉴에서 File > New > ActionScript Project 를 선택한다. 그럼 아래와 같은 창이 뜬다. Project name에 아무 이름이나 넣는다. 우리는 FP11Test로 했다. 참고로 Flex SDK version이 이전에 선택한 SDK가 나옴을 확인할 수 있다. 필요하다면 여기서 설치된 SDK를 선택할 수 있음을 의미한다. 우리는 기본 SDK를 사용할 것이므로 그대로 두고 Finish 버튼을 누른다. 



세 번째로 Flash builder의 Package Explorer 창에 FP11Test 프로젝트가 만들어졌을 것이다. 

프로젝트는 src와 html-template, bin-debug 폴더가 있다. src는 여러분이 만들 actionscript 3.0 기반 코드이며 여기서 기본적으로 만들어진 FP11Test.as는 FP11Test 클래스이며 flash.display.Sprite 기반으로 만들어졌다. 일종의 Main 클래스이다. html-template는 배포를 위해 사용하는 것으로 컴파일된 swf를 웹브라우져상에 배포하는데 있어서 필요한 html, javascript 코드가 담겨 있다. 개발자는 필요하다면 이 코드를 수정하면 컴파일 시 반영된다. bin-debug는 html-template를 기반으로 컴파일 된 swf와 함께 컴파일 된 결과물이다. 이는 실제배포 소스는 아니며 디버깅용도로 사용된다. flash builder상에서 이 어플을 실행하면 FP11Test.html이 웹브라우저상에 실행되며 그 안에 FP11Test.swf가 포함되어 실행된다. 

Flex 4.5(FP11) SDK를 사용하고 있음을 보여주고 있다. 이전에 Flex 4.5(FP11) SDK에 playerglobal.swc를 복사해뒀던 것을 기억할 것이다. 하지만 여기서 보여지고 있는 playerglobal.swc는 Flash Player 10.2 버전의 API를 담은 SWC이다. 우리는 아까 복사해둔 11.0 버전을 지원하는 playerglobal.swc가 선택이 되도록 해야 한다. 


위 그림상에서 보는 데로 프로젝트(FP11Test)를 선택한 상태에서 메뉴의 Project > Properties를 선택하자. 아래 그림과 같은 창이 나올 것이다. 오른쪽 메뉴에서 ActionScript Compiler를 선택한 뒤 Adobe Flash Player options에 Use a specific version을 11.0.0으로 바꾼다. 또한 Compiler Options에 -swf-version=13를 넣는다. HTML wrapper는 그대로 둬도 되지만 Check target player version과 Enable integration with browser navigation은 의미가 없으므로 체크를 하지 않도록 한다. 그리고 OK 버튼을 누르면 되겠다. 



마지막으로 Flash Player 11환경에서 GPU 가속을 시키려면 wmode가 direct로 설정되어 있어야만 한다. 프로젝트상에 html-template내 index.template.html을 연다. 참고로 이때 더블 클릭하면 웹브라우저가 실행되어 버린다. 더블 클릭하지 말고 마우스 오른쪽 버튼을 눌러 Open With > Text Editor로 열면 html 소스코드를 볼 수 있다. (더블클릭때마다 웹브라우저를 열지 않는 방법이 있다. 메뉴 > Window > Preference > General > Editors > File Associations를 참고하자.) index.template.html 내에 스크립트 상에 var params = {}; 부분이 있다. 그 아래 params.wmode = "direct";를 추가하자. 
 

5.3. 실행 
이제 실행해볼 수 있게 되었다. Ctrl+F11(Run) 또는 F11(Debug)를 눌러 실행해보자. 아래 화면처럼 브라우저 창에 Adobe Flash Player 11 (11,0,0,58d) (Incubator build)가 뜨면서 실행되었으면 성공이다. 만약 실행이 안되거나 컴파일 에러가 난다면 위 과정을 다시 살펴보길 바란다.



5.4. 간단한 코드 짜보기 

이제 Molehill 3D API를 직접 적용해보자. 여기서는 소스 코드를 분석해서 설명하기 보다 그저 실행해보는데 목적이 있음을 알아두자.

아래 링크로 가면 Molehill 3D API에 대한 소개와 간단한 테스트 코드가 있다. 

MoleHill Getting Started : http://labs.jam3.ca/2011/03/molehill-getting-started/ 

이 소스는 AGAL 어셈블러인 AGALMiniAssembler 소스가 필요하다. 
AGALMiniAssembler.as : http://goo.gl/ITcrn


아래 링크로부터 이 두 개 소스를 받자.


이것을 압축을 풀어 프로젝트 src에 복사하자. 그리고 Ctrl+F11이나 F11로 실행하면 다음과 같은 화면을 볼 수 있다. 



다른 소스도 테스트 해보자.
먼저 프로젝트 내에 src/(Defaul package)를 선택한 다음 오른쪽 마우스 버튼을 눌러 New > ActionScript Class를 선택한다.

두 번째로 창이 뜨면 Name에 Cube를 넣고 Finish를 한다.

세 번째로 아래 링크에서 샘플 소스를 복사한 뒤 아까 만든 Cube.as를 선택해 이전 코드를 삭제하고 붙여넣자.
http://goo.gl/ITcrn

네 번째로 아래 그림처럼 Cube.as를 선택하고 마우스 오른쪽 버튼을 눌러 Set as Default Application을 선택한다. 이렇게 하면 이 프로젝트의 기본 Main 실행 클래스가 Cube.as가 된다. 이 상태에서 Ctrl+F11이나 F11를 눌러 실행해보자. 


실행 시 Bad input size라는 Error가 발생한다면 IE내에서 실행하는 Flash Player의 버그이다(참고 : http://blog.jidolstar.com/656). 이 때는 아래 코드로 대체해보자.


성공적으로 실행하면 다음과 같은 화면을 볼 수 있을 것이다. 


이 소스에 대한 설명은 http://ltslashgt.com/2011/02/28/molehill-spinning-cube/ 를 참고한다.


6. 정리하며
지금까지 Flash Player Incubator 환경에서 Molehill 3D를 테스트 해볼 수 있는 개발환경을 구축하고 테스트하는 방법을 알아보았다. 하지만 이 글은 Molehill 3D API에 대한 자세한 설명을 배제했다. 이 글 다음에는 Molehill 3D API에 대한 내용을 정리할 계획을 가지고 있다. 

Molehill 3D API를 이용한 마지막 2개의 테스트 소스를 보면 알겠지만 굉장히 접근하기 형태의 Native API이기 때문에 코딩으로 직접 3D를 표현하는 것은 질 좋은 3D Flash 어플을 만드는데 한계가 있다. 그렇기 때문에 Away3D나 Alternativa3D와 같은 프레임워크를 도입해야 하는 이유가 여기에 있는 것이다. 이 부분에 대해서도 이후에 글을 적어보려고 한다. 

앞선 테스트 어플들에 3D가 아닌 2D화면도 봤을 것이다. Molehill이 무조건 3D에서만 GPU를 이용하는 것은 아니다는 것을 보여준다. 기존에 많은 2D Flash 컨텐츠도 Molehill을 적극 활용하면 생각지도 못했던 양질의 퍼포먼스를 기대할 수 있다는 것을 보여주는 셈이다. 일종에 아이폰의 OpenGL ES기반으로 2D를 표현하기 위한 Cocos2d가 있듯이 Flash에서도 이러한 형태로 표현할 수 있음을 알 수 있다. 아래 링크의 동영상을 보면 그 이유를 알 수 있을 것이다.
http://clockmaker.jp/blog/2011/03/molehill_video/ 

Flash Player에 3D 기능을 추가됨에 따라 Unity3D에 Flash Player에서도 동작할 수 있도록 해주는 기능도 포함되었다. 이것은 Unity3D 개발자나 Flash 개발자 양쪽에 꽤 흥미로운 사실이다. 

 
아직 Flash Player 11이 정식오픈 되려면 시간이 필요할 것이다. 버그 수정을 거치면서 안정화를 시켜야 하기 때문이다. 

Flash 3D가 표현된다는 것은 무조건 좋은 일만은 아니다. Flash는 웹브라우저 및 크로스 플랫폼에서 운용되기 때문에 접속할 때마다 새로 자원을 로드 해야 한다. 이는 자원을 로컬에 저장해두는데 제약이 있기 때문인데 결과적으로 접속할때마다 필요한 자원을 로드함에 있어서 2D자원보다 3D자원이 훨씬 크고 관리하기 어렵다. 이는 위에 이미 소개한 Flash 3D 예제를 보면서 느꼈을 것이다. 멋진 3D 화면을 보기 위해 자원을 로드하는데 꽤 오랫동안 기다려야 한다. 물론 AIR로 개발한다면 상관없겠지만 웹기반에서 소셜게임을 만든다면 이야기가 다르다. 이 말은 자원관리가 그만큼 어려워지고 전문적으로 해야함을 의미한다.

그럼에도 불구하고 Flash가 3D를 표현하는데 GPU를 지원한다는 사실만으로도 많은 장점이 있기에 3D를 준비해야 차기 Flash 시장의 미래를 선도할 수 있을 것이다. 미리 준비할 필요가 있다.
 

7. 관련사이트 
Adobe AIR and Adobe Flash Player Incubator : http://goo.gl/pvwzd
Flash Player 11,0,0,58 Incubator Release Notes : http://goo.gl/FlH7C
Flash Player 11,0,0,58 Incubator 다운로드 : http://goo.gl/yXySu
Digging more into the Molehill APIs : http://goo.gl/d2WYu
Away3d 4.0 Alpha : http://goo.gl/bZBav
Alternativa 3D  : http://goo.gl/jqfE
Flare3D 2.0 Pre-release : http://goo.gl/1vgCA 
Flash CS5 환경에서 테스트 : http://blog.naver.com/q3korea/120125249427
Molehill Getting Start : http://blog.naver.com/q3korea/120126463667 
Molehill spinning cube : http://ltslashgt.com/2011/02/28/molehill-spinning-cube/
Unity, Flash & 3D on the web : http://goo.gl/OAY1q
 
글쓴이 : 지돌스타(http://blog.jidolstar.com/759
이 글은 iOS에서 Local Notification에 대한 전반적인 이해를 돕기위한 글이다. 그래서 유사형태인 APNS와 비교해보기도 했다. 검색해보면 Local Notification에 대한 문의는 있어도 이에 대해서 설명된 한글문서가 없는 것 같아 정리해보았다.

Local Notification에 대해
iOS 4.0 이상부터 Local Notification(지역알림, 내부통지, http://goo.gl/jFFsT)을 지원한다.  그러므로  iOS 4.0 미만 버전을 지원하는 어플의 경우 호환성을 유지할 수 있도록 개발해야할 것이다.

Local Notification은 어플이 실행중이 아니거나 Background, Foreground 상태에 관계없이 지정된 날짜와 시간에 필요한 최소한의 데이터를 전송하여 어플에게 전달해 실행하거나 다른 행동을 취할 수 있도록 구현할 수 있다. 심지어 Local Notification을 예약하고 iOS를 재부팅해도 정상적으로 동작한다.  이러한 형태가 가능한 것은 Local Notification 관리는 iOS 자체에서 하기 때문이다. 

Local Notification과 APNS(Apple Push Notification Service, http://goo.gl/fWknl)의 큰 차이점은 Notification을 위한 서버가 필요한가 아닌가의 차이에 있다. APNS는 서버가 준비가 되어 있어야 하고 Push를 위한 인증서도 발급해야한다. 처음 테스트 환경을 만들고 운용하는게 복잡한 편이다. 반면 Local Notification은 이런 절차가 전혀 필요없이 간단하게 코드상에서 처리할 수 있다. 이처럼 Local Notification을 사용하는 방법은 꽤 간단한 편이다. 하지만 APNS에 비해서 테스트하기가 좀 까다로운 면이 있다. 왜냐하면 Local Notification은 시간기반으로 하는 통지가 되는 형태이기 때문에 통지에 대한 제어권이 iOS에 있으며 개발자에게 있다고 볼 수 없기 때문이다. 반면에 APNS는 서버측에서 어떤 시간에 상관없이 개발자가 원하는데로 바로 통지를 할 수 있다. 

Local Notification와 APNS가 이처럼 차이점이 있지만 넘겨주는 데이터나 동작하는 방식은 거의 유사한 편이다.  그래서 어플내에서 동작하는 형태를 하나의 인터페이스로 만들어 운영할 수 있다. 이것이 가능한 이유는 둘다 PayLoad(http://goo.gl/mulVQ)가 유사한 형태를 가지며 통지되었을때 같은 동작을 하기 때문이다. (PayLoad는 일종의 메시지 데이터를 보유하는 패킷이나 프레임의 부분을 말한다.) PayLoad에는 Notification Type과 Custom Data를 담는다. Notification Type은 메시지 ,버튼 제목, 아이콘뱃지숫자, 사운드등으로 구성되어 있고 Custom Data에는 이외에 데이터가 필요한 경우  Dictionary형태로 구성된다. 하지만 APNS와 Location Notification간에 PayLoad데이터 관리의 차이는 있다. APNS는 Dictionary로 관리되며, Location Notification은 UILocalNotification 클래스(http://goo.gl/3TyTg)로 관리 된다. 

Local Notification은 APNS와 다르게 시간기반으로 운용된다. 이것은 iOS에서 스케쥴링을 해준다는 말과 같다. 그래서 통지가 일어나야하는 날짜와 시간을 정해줘야한다. 

Local Notification 사용법 
지금까지  Local Notification을 설명하면서 APNS와의 차이점도 알아보았다. 이러한 내용을 미리 언급하는 것은 처음 이를 접근할 때 Local Notification에 대한 전반적인 이해가 필요하기 때문이다. 여러가지로 복잡하고 잘 이해가 안되겠지만 실제로 해보면 이보다 쉬울 순 없다. 

Local Notification을 학습하기 위해서  Apple문서를 먼저 참고하는 것이 좋겠다.
 - About Local Notifications and Push Notifications : http://goo.gl/jFFsT

그럼 간단하게 Local Notification을 사용하는 방법을 알아보자. 크게 등록과 처리하는 방법을 구분해서 정리했다.

1. Local Notification 등록하기

Xcode상에서 Window Based 어플 프로젝트를 생성한뒤 AppDeleage 소스코드내에 application:didFinishLaunchingwithOptions: 메시지에 다음 코드를 넣는다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    

    // Override point for customization after application launch.

    

    [self.window makeKeyAndVisible];


    //통지시간 정하기 

NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

NSDateComponents *dateComps = [[NSDateComponents alloc] init];

[dateComps setYear:2011];

[dateComps setMonth:3];

[dateComps setDay:22];

[dateComps setHour:15];

[dateComps setMinute:30];

[dateComps setSecond:0];

NSDate *date = [calendar dateFromComponents:dateComps];

[dateComps release];

UILocalNotification *localNotif = [[UILocalNotification alloc]init];

if (localNotif != nil

{

//통지시간 

localNotif.fireDate = date;

localNotif.timeZone = [NSTimeZone defaultTimeZone];

//Payload

localNotif.alertBody = [NSString stringWithFormat:@"내부통지 %@",date];

localNotif.alertAction = @"상세보기";

localNotif.soundName = UILocalNotificationDefaultSoundName;

localNotif.applicationIconBadgeNumber = 1;

//Custom Data

NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"mypage" forKey:@"page"];

localNotif.userInfo = infoDict;

//Local Notification 등록

[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

}

[localNotif release];

    return YES;

}


이게 끝이다. Local Notification을 등록하는 시점은 어디라도 상관없다. 필요할 때 등록하면 된다. UILocalNotification 객체를 생성하고 통지시간, Payload, Custom Data를 설정한뒤 등록하면 지정된 시간에 통지가 발생할 것이다. APNS럼 APNS 서버에 DeviceToken을 받는 과정이 모두 생략되기 때문에 등록절차는 매우 쉬운 것을 알 수 있다. 

이 코드에서 Local Notification 등록을 scheduleLocalNotification을 사용했다. 필요한 경우에 스케쥴링 필요없이 즉각적으로 Local Notification을 줄 필요가 있는 경우에는 다음 메시지를 사용하면 되겠다. 

[[UIApplication sharedApplication] presentLocalNotificationNow:localNotif];


만약 fireDate를 현재시간보다 이전시간으로 등록하면 iOS는 바로 통지해버린다. 이 말이 그냥 쉽게 넘어갈 수 있는 문제인데 경험상 현재시간보다 이전시간으로 가는 경우는 없기 때문에 왠만하면 이전시간으로 등록하는 경우가 없도록 코딩을 해야 버그를 유발시키지 않을 것이다.

만약 이전에 등록된 Local Notification을 삭제하고 싶은 경우가 발생할 수 있다. 그런 경우에는 다음 메시지 중에 하나를 사용하면 되겠다.

[[UIApplication sharedApplication] cancelAllLocalNotifications];

[[UIApplication sharedApplication] cancelLocalNotification:localNotif];




2. Local Notification 처리하기 
앞서 Local Notification을 등록하는 방법을 알았다. 등록된 통지는 iOS에서 스케쥴링해준다.  어플의 실행여부, 및 iOS재부팅에 전혀 상관없이 동작하기 때문에 개발자는 이런부분에 대해 별다른 노력없이 통지 처리에 대한 로직만 만들면 된다.

내부 통지는 다음 3가지 형태로 처리가 가능하다. 이는 APNS와 유사하다.

[경우 1] 어플이 실행중이지 않은 경우 
이 경우에 iOS에 등록된 통지를 정해진 시간에 발생하면 자동으로 Alert창을 띄워준다. 거기에는 UILocalNotification에 Payload로 등록한 alertBody, alertAction이 반영되어 있으며 주어진 사운드를 들려준다. 어플의 아이콘에도 정해진 badge숫자가 표시된다. 


위의 경우 특별히 AppDelegate에서 application:didFinishLaunchingWithOptions: 메세지 내에서 통지된 UILocalNotification객체를 참고할 수 있다. Local Notification을 통해 어플이 실행되는 경우 별다른 작업이 필요하다면 이를 이용하면 유용할 것이다. 접근방법은 간단한다. 아래처럼 접근해서 사용하면 되겠다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    

    // Override point for customization after application launch.

    

    [self.window makeKeyAndVisible];

UILocalNotification *notif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

if (notif != nil

{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"알림" 

message:[NSString stringWithFormat:@"didFinishLaunchingWithOptions %@",notif.alertBody

  delegate:nil 

  cancelButtonTitle:nil 

  otherButtonTitles:@"확인",nil];

[alert show];

[alert release];

}

    return YES;

}


이 경우 다음과 같은 화면을 볼 수 있을 것이다. 



또한 AppDelegate 상에 application:didReceiveLocalNotification: 메시지를 구현하면 Local Notification을 처리할 수 있다. 이 메시지는 다음에 나오는 [경우2], [경우3]에도 동일하게 동작한다. 아래처럼 구현해보자.

-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

{

application.applicationIconBadgeNumber = 0;

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"알림" 

message:[NSString stringWithFormat:@"didReceiveLocalNotification %@",notification.alertBody

  delegate:nil 

  cancelButtonTitle:nil 

  otherButtonTitles:@"확인",nil];

[alert show];

[alert release];

}


다음은 위코드가 실행될 때 화면이다.



[경우2]어플이 실행중이나 background에 위치해 있는 경우 
[경우1]과의 유일한 차이점은 application:didFinishLaunchingWithOptions: 를 통해 UILocalNotification 객체정보를 얻을 수 없다는 것이다. 이 경우에는 이미 어플이 실행중이기 때문에 어플이 처음 실행할때 최초 한번만 호출되는 AppDeleage의 application:didReceiveLocalNotification:가 실행될 수 없기 때문이다. 이 의미는 application:didFinishLaunchingWithOptions: 와 application:didReceiveLocalNotification: 에서 얻어지는 UILocalNotification 객체정보가 같더라도 서로 다른 일을 할 수 있도록 한다는 점을 시사한다.  

application:didReceiveLocalNotification: 메시지는 여전히 호출되므로 이때 UILocalNotification 객체를 처리하면 되겠다.


[경우3]어플이 실행중이며 foreground에 위치해 있는 경우
마지막으로 어플이 화면위에 실행중인 경우이다. 이때도 [경우1], [경우2]와 차이점은 iOS에서 직접적으로 Alert창을 띄워주지 않는다는 점이다. application:didFinishLaunchingWithOptions: 는 당연히 호출되지 않으며 application:didReceiveLocalNotification:  만 호출된다. 


Local Notification 처리에 대한 경우 1, 2, 3을 표로 정리하면 다음과 같을 것이다. 
   경고창   didFinishLaunchingWithOptions를 통한 UILocalNotification참고  didReciveLocalNotification메시지를 통해 UILocalNotification 참고
 경우 1 (어플 실행X)  O
 경우 2 (어플 background)  O
 경우 3 (어플 foreground)


지금까지 설명한 내용 대해서 더 자세히 알고 싶다면 다음 문서를 참고한다.
Scheduling, Registering, and Handling Notifications : http://goo.gl/qHVPi


팁(Tip)
Local Notification을 사용하면서 이런 점은 알아둘 필요가 있다. 

1. 등록시 현재 시간보다 빠른 시간을 등록하면 바로 통지가 된다. 이 점은 어플 버그를 유발할 수 있으므로 각별히 주의하길 바란다. 개발 경험상에서 말씀드린다. (여기서 버그는 실제 버그가 아니라 의도하지 않는 동작을 유발시킨다는 말이다.)

2. 테스트를 위해서는 아이폰 자체 시간설정 기능을 적극 활용하면 되겠다. Local Notification의 통지는 iOS가 스케쥴링을 해주기 때문에 개발자가 통제할 수 없다. 그러므로 아이폰 자체 시간설정 기능을 활용해 테스트할 수 있겠다.

3. PayLoad대신 Custom Data를 사용하는 방법은 별도로 설명을 안했지만 UILocalNotification상에 userInfo속성을 활용하면 된다는 점을 설명하지 않아도 여러분은 잘 사용할 수 있을 것이라 생각한다. ^^


정리하며
Local Notification에 대해서 전반적인 내용을 다뤄보았다. 생각보다 개념자체는 간단하지만 어느 경우에 어떻게 사용하고 동작하는지에 대한 명확한 지식이 없으면 오용할 여지는 많다. 또한 잘못 사용하면 뜻하지 않는 동작을 유발할 수 있기 때문에 등록시 시간을 잘 설정해야하는 것은 꼭 염두해야 한다. 또한 클라이언트 베이스로 등록/처리를 해야하는 부분은 이에 대한 적절한 설계를 바탕으로 하지 않으면 로직이 복잡해져 관리가 어려워질 수 있다는 점도 개인적인 경험이다. 

아무튼 회사에서 이를 이용한 관련 어플을 만들면서 처음 사용해 봤는데 자세히 알지 않고 사용하면 문제가 될 것 같아 정리를 해보았다.


관련글
About Local Notifications and Push Notifications : http://goo.gl/jFFsT
The Notification Payload : http://goo.gl/mulVQ
UILocalNotification 클래스 : http://goo.gl/3TyTg
Scheduling, Registering, and Handling Notifications : http://goo.gl/qHVPi
내가 만든 어플에 Push Notification 적용하기 : http://goo.gl/kH7BQ 
APNS 개발버전과 배포버전의 차이점. : http://blog.jidolstar.com/726
APNS Device Token을 못받아올때 : http://blog.jidolstar.com/725
 
글쓴이 : 지돌스타(http://blog.jidolstar.com/758)  


작년에 Powerfl 이라는 조직(?)을 만들고 별 성과없이 흐지부지 되었는데...(저의 불찰) 다행히 이 멋진 이름을 올해부터 다시 사용할 수 있게 되었습니다. 바야흐로 Powerfl 팀블로그를 운영하기 시작했습니다. 

 
올해 초부터 저를 비롯한 8명의 Flash 개발자들이 최소 1주일에 2편씩 돌아가면서 글을 올리고 있습니다. 이 블로그에 저자로 참여하는 분들 모두 자신이 관심을 두고 있는 분야에 대해 심혈을 기울여서 저작활동을 하고 있습니다. Flash 시장이 침체(?)되어 있는 가운데도 이 블로그를 통해 Flash의 리얼함과 Flash만의 저력을 볼 수 있는 것 같습니다. 

여기에 올린 글은 각자의 블로그에 퍼갈 수 없습니다. (당연히 방문자도 퍼가시는 것은 금지입니다. 링크는 가능) 그것은 팀블로그에 참여한 저자들의 약속이고 Powerfl의 고유의 특성을 살리기 위한 취지이기도 합니다. 한국에서 팀블로그가 가능하구라는 것을 이 블로그를 통해 깨닫고 있습니다. 그래서 열심히 하고 싶은 마음이 생깁니다.

저는 "Away3D로 만들어보는 태양계"라는 주제로 글을 쓰기 시작했습니다. 당초 Away3D만을 다루려고 했지만 웬지 식상할 것 같고... 제가 개인적으로 열심히 안할 것 같아서 좀 더 임팩트를 줄 수 있는 주제를 선정했습니다. Flash로 이런것도 할 수 있어? 라는 생각이 들정도로 강력한 임팩트를 주고 싶네요. ㅋㅋㅋ 

현재 팀블로그의 겉모양은 아직 완성된 것은 아니며 좀더 독자들이 편하게 볼 수 있도록 수정중입니다.

Flash Player Molehill버전도 prerelease되었고 여러가지로 실험해볼 것이 산더미 같네요. 작년에 실패한 것을 이번에 만회.. 아니 그보다 더 멋진 활동을 해보고 싶네요. 그럼 즐~~~ Flash 하세요.

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

회사에서 개발에 참여한 아이폰/아이팟터치 어플인 "책을읽자!"를 소개합니다.

(오픈하고 난다음에 발견한 약간의 버그가 있긴합니다. 3월 21일~25일 쯤에 새로운 버전이 나오면 수정됩니다.)

★★★★★ 책을읽자! ★★★★★

책 읽는 습관을 길러주는 최고의 어플! 책을읽자!
 

■ 책 등록하기 ■

내가 지금 읽고 있는 책을 쉽고 간편하게 등록할 수 있습니다.
네이버/구글/다음 등 다양한 도서DB를 검색하여 쉽게 나의 서재를 만들어보세요!


나의 서재 ■

지금 내가 가진 책을 한눈에 볼 수 있으며, 얼마나 읽었는지 상태를 알려줍니다.
게다가 같은 책을 읽고있는 다른 사람의 서재에서 쉽게 책을 등록 할 수도 있어요!


■ 북스토리 ■

같은 책을 보고 있는 사람들과 커뮤니티를 제공합니다.
내가 보고 있는 책을 주제로 사람들과 이야기를 나눠보세요!


■ 북카페 ■

북스토리에서 오가는 책추천, 후기, 서평들을 모아모아 북카페가 만들어집니다.
북카페에서 수많은 최신 도서 정보를 만나보세요!


■ 푸시알림 ■

읽다가 중단한 책, 아직 읽지 않은 책이 있으면 푸시 알림을 보내드립니다.
책 읽는 습관을 길러주는 나의 독서 동반자, 책을읽자!
 

■ 다운로드 ■
http://goo.gl/9sxw0



■ 참고사항 ■

*** [책을읽자!]로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다.
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.


*** 다양한 스타플 연동 어플리스트

- (안드로이드)바른생활

- (아이폰)책을읽자!
- (아이폰)바른생활
- (아이폰)신조어능력시험
- (아이폰)어플지름신
- (아이폰)타임라인 



■ 스크린샷 ■

 








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


최근에 스타플(starpl.com)에서 출시된 아이폰/아이팟터치용 무료 어플 "신조어능력시험"을 소개합니다. 


꿀벅지, 깜놀, 간지, 레알, 잉여, 차도남, 차도녀, 갠춘 이런 단어들을 듣고 뭐지라는 생각이 문득 들었다면 여러분은 이 어플을 받으실 수 있는 자격이 주어집니다. ^^


이 어플에서 딴 신조어능력자격증 ^^;


네이버 메인과 헤럴드 경제에도 소개되었다는.. ㅋㅋ


http://biz.heraldm.com/common/Detail.jsp?newsMLId=20110309000697


★★★★★ 신조어능력시험 ★★★★★

도대체 뭔말이여!!! 신조어능력시험으로 말이 통하는 사회를 만들어 보자구요!

■ 시험보기 ■

나의 신조어 활용능력은 얼마나 될까?
지금 바로 테스트해보세요!


■ 자격증따기 ■

90점 이상 득점시,"신조어활용자격증"을 드립니다!
취득한 자격증은 트위터/페이스북에 자랑할 수 있습니다.
친구들에게 자격증을 자랑해보세요~


■ 시험공부하기 ■

2011년 판, 최신 신조어사전 탑재! 게다가 신조어가 사용된 기사 검색까지~
내가 직접 신조어를 등록 할 수 있는 신조어발굴도 이용해보세요!


■ 과외받기 ■

도대체 뭔 소린지 모르겠다! 요런 신조어는 과외 선생님께 물어보세요!
자격증을 취득하신 선생님들이 바로바로 알려드립니다~


■ 실전활용 ■

이렇게 공부한 신조어! 잘 써먹어야 겠죠?
실전활용 커뮤니티에서 직적 사람들과 대화를 나눠보세요!



■ 다운로드 ■

다운로드 : http://goo.gl/5kZgq




■ 참고사항 ■

*** [신조어능력시험]으로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다.
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.


*** 다양한 스타플 연동 어플리스트

- (아이폰)바른생활
- (안드로이드)바른생활
- (아이폰)어플지름신
- (아이폰)타임라인 

■ 스크린샷 ■






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



바른생활(http://blog.jidolstar.com/746)은 아이폰/아이팟터치(안드로이드용도 마켓에서 직접 다운로드 받을 수 있습니다.)용으로 개발되어 다이어트, 운동, 공부등과 같은 일상적으로 세우는 계획을 실천할 수 있게 도와주는 기능을 가집니다.  간단히 일자별로 자신의 계획을 체크하고 일지도 작성해가며 같은 관심사를 가진 사람들과 커뮤니케이션을 할 수 있는 구조로 되어 있죠. 하루에 한번씩 계획체크 푸쉬도 날려주고요. 더 많은 기능을 넣는 것도 고려했지만 사용자 필요성을 좀더 파악한 다음에 하기로 결정한 상태라서 일단 보류했습니다.

얼마전 아이폰용 바른생활 어플이 무료순위에 상위에 올라왔습니다.  신기한 것은 이 어플은 무려 1개월 전에 앱스토어에 등록되었던 것인데 무료상위권에 들어간것이 너무 신기했었죠. 알고 봤더니 앱스토어 메인화면에 최신 및 추천목록에 올라왔더군요. 어떠한 경로로 여기에 올라가게 된 것일까요? 최신은 분명 아니므로 이 화면에 대한 수동적 관리가 있었던 것으로 판단이 됩니다.  또는 앱스토어 자체에 추천시스템이 어느정도 작용도 했겠죠?

아무튼 어플을 홍보할 수 있는 마케팅 채널을 여러군데 있지만 거의 모두 돈을 들여야 합니다. 그나마 무료이면서 강력한 마케팅 영역은 앱스토어일겁니다. 초반에 상위에 못올라가면 다시 순위에 올라가기 힘든데, 이렇게 올라간 것을 보면 새학기가 시작되면서 이런 어플에 대한 필요성이 있다고 판단이 되었나봅니다. 아주 간단한 어플이지만 최소한의 기능으로 최대한의 효과를 내게끔 만들었던 것이 추천이 될 수 있었던 결정적인 요인이 아니였나 생각합니다. 결국 사용자는 복잡한 어플 싫어합니다. 그렇다고 너무 단순한 것도 싫어하죠. 어느정도 목적에 부합하는 어플이라면 사용자들은 이용해줍니다. 

이번 경험이 다음 어플을 만들때 결정적인 고려사항을 준것이라고 볼 수 없지만 그래도 많은 생각을 하게 만들어 준 것 같습니다.  바른생활 어플을 사용하시는 분들께 부족함에도 잘 사용해주셔서 감사의 말을 여기에 대신하고 싶습니다. ^^

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

Flash Burnning Day는 매일 반복되는 업무와 야근으로 지쳐 개발에 대한 열정을 잃어가는 당신을 위해 준비한 자리입니다.

평소 Flash로 만들어 보고 싶었던 애플리케이션게임 등을 개발하고 공유하는 행사로, ACC가 직접 Flash Burnning Day에 참여하여 참여자들과 함께 개발을 진행하게 됩니다
만들어진 작품은 adoberia.co.kr 사이트를 통해 공유될 예정이고

<공유의 장시간에는 프로젝트도 공유하고 시상식도 함께 진행됩니다.

<행사 안내>

일시

3 12(토요일) 09:30~18:30 (9 시간)

장소

디자인 티모(서울대 입구역 4번 출구)

참가대상

* Flash에 관심이 있는 모든 분

참가비

(유료) 5,000(개인 당)

팀장이 팀원 비용을 함께 입금해주세요.

입금계좌

이문국 / 국민은행 36702-04-108394

참가방법

1.      댓글 신청(순번/이름/ID입력)

2.      계획서 작성 후 adobe@reseedcorp.com 발송

3.      참석가능 여부 이메일 회신

4.      참가비입금

5.      참가등록완료

 


<AGENDA>

09:30 ~ 09:50

오프닝조별 멘토 ACC 소개

09:50~12:00

팀별 프로젝트 진행 

12:00~12:30

Lunch Time

12:30~17:00

팀별 프로젝트 진행

17:00 ~ 18:00

공유의 장시상



<성공적인 Flash Burnning Day를 함께 만들기 위하여 >

 

1.      가능한 행사시간 내에 완성할 수 있는 프로젝트 범위로 기획서 부탁 드립니다.

거창한 기획서보다는 완성된 프로젝트로 말하는 Flash Burnning Day로 준비하고자 합니다.

정해진 시간 내에 진행된 프로젝트의 완성도와 창의성을 토대로 평가가 진행됩니다.

2.      행사 운영을 원활히 하고퀄리티 높은 행사 진행을 위해 선착순 40팀까지만 신청이 가능합니다.

3.      팀 인원은 1~3인까지 가능합니다. (개인 혼자서도 가능)

4.      본 행사는 점심을 제공하지 않습니다.

5.      무선인터넷 사용이 가능하나 동시 접속시 느려질 수 있으니 인터넷이 꼭 필요하신 팀은 무선인터넷 준비를 부탁 드립니다.



 



======================================================================================================

추가 설명을 드리자면..
우선 말 그대로 버닝데이입니다.
아침부터 저녁까지 정해진 시간 동안 버닝합니다.
ACC분들과 카페 스탭 분들이 행사를 함께 진행하지만..
직접 코딩을 해주지는 않습니다.
단, 문제에 대한 풀이 방향을 함께 고민하고 응원할 예정입니다.

액션스크립트에 익숙하지 않아도 누구나 참가할 수 있으며,
주제도 자유주제입니다.
혼자 참가해도 되고, 최대 3명까지 함께 참가해도 됩니다.

기획서는 자세히 쓸 필요없으며,
정해진 시간내에 도전할 수 있는 범위내에서 간단하게 제출하시면됩니다.

점심을 제공하지 않기 때문에 팀별로 준비를 하셔야하며..
시간을 절약하기 위한 음식 또는 점심 패스(환영)도 추천드립니다. 
(아침을 많이 먹고 오세여 ^^)

구체적인 평가 방식은 당일 알려드리겠지만..
창의성 < 완성도가 더 높게 평가될 예정입니다.

마지막으로 좋은 평가를 받은 팀에게는 훈훈한 시상품들이 준비되어 있으며..
본 행사는 지속적으로 진행(업그레이드) 예정이고,
년 말 가장 높은 점수를 받은 팀에게는 더욱 훈훈한 시상품이 준비될 예정입니다.
물론 예정이지만.. 여러분의 호흥도에 따라 시상품의 규모도 커질 수 있다는 점 ^^;

시간이 얼마 안 남았습니다.

함께 버닝에 참여할 많은 분들의 도전 기다리겠습니다.


*** 행사에 관한 의견 및 궁금한 사항은 덧글로 남겨주세요. ***


저는 참석할 수 있을지 모르겠어요 ^^;;;

얼마전 아이폰 어플의 개발 요구사항중에 아이폰내 AppStore로 이동시키는 기능구현이 있었다. 이 글은 그것을 이해하는데 필요한 전반적인 기본 지식을 간단히 정리했다.

Apple iOS Applications의 URL 스키마
인터넷에서 링크는 URL 스키마(scheme)인 http, mailto, ftp, feed등을 이용해 종류가 구분된다. 이는 범용적인 예이다.  반면  iOS 링크는 이보다 더 특별한 기능을 가진다. 가령 "sms:전화번호"로 하면 문자메시지 보낼 수 있는 링크가 되며 "tel:전화번호"는 자동으로 전화를 걸 수 있다. 이런 특별한 스키마를 사용하지 않더라도 http를 그대로써서 필요하다면 관련 어플로 이동시키는 것도 가능하다. 가령, 구글맵의 경우 "http://maps.google.com/maps?q=검색위치" 형태로 접근하면 구글맵 어플이 열린다. 이이튠즈도 "http://itunes.apple.com"으로 시작하면 아이튠즈 어플이 실행된다. 유투브도 비슷하다. 

활용하는 방법은 어플상에서 iOS SDK에서 제공하는 [[UIApplication sharedApplication] openURL: ]을 이용하거나 사파리 주소창이나 링크에 위 사항을 적용하면 되겠다.

지금까지 설명한 URL 스키마들은 모두 iOS에서 기본으로 제공하는 것이다. 

다음 링크에는 iOS URL 스키마의 종류와 사용예를 잘 정리하고 있다.


Third Party Applications의 커스텀 URL 스키마
개발자는 커스텀 URL스키마를 만들 수 있다. 이는 어플만의 URL 스키마를 사용하면 가능해진다. 즉, URL스키마를 이용하면 자신이 만든 어플도 사파리에서 띄울 수 있게끔 유도할 수 있다는 것을 뜻한다.  

다음 글에는 커스텀 URL 스키마를 어떻게 어플에 적용하는가 보여주고 있다.


다음 소개하는 어플은 [[UIApplication sharedApplication] openURL:]을 활용한 어플로 URL 스키마를 테스트 해볼 수 있는 어플이다. (찾아봤더니 진짜 있네? ^^) 

Open URL : http://goo.gl/8n9mV



아이폰 어플에서 AppStore 검색페이지로 이동하기

이 글의 목적은 바로 아이폰 어플에서 아래 화면처럼 AppStore 어플의 검색페이지 이동하여 특정키워드로 검색하는 방법을 설명하는 것이다.  지금까지 URL 스키마를 설명했으니 이것도 URL을 통해 실행이 가능하다.


iOS 개발자 분들이라면 아래와 같은 URL을 이용하면 AppStore의 해당 어플 페이지로 이동한다는 것은 알고 있을 것이다.

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=406292683
http://itunes.apple.com/kr/app/id406292683

이것은 1개의 어플을 찾을때는 유용하다. 그럼 검색은? 특별히 우리 회사에서 만든 어플을 찾아내야 한다면?

http://itunes.com/회사명
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewArtist?id=회사아이디
http://itunes.apple.com/us/artist/회사명/id회사아이디 
item-apps://itunes.apple.com/us/developer/회사명/id회사아이디

등등..... 검색해서 다 해봤지만 전부 아이튠즈 어플로만 이동한다. 앱스토어에 이동해야하는데 말이다. 물론 맥에서는 잘 찾아간다. 단지 아이폰/아이팟터치에서는 아이튠즈와 앱스토어 어플이 분리되어 있는게 문제인 것이다.

하루 걸러서 검색으로 찾은 결과 방법을 알아냈다.
이것도 결국 URL을 이용하면 된다. (맥 사파리나, 아이폰 사파리, [[UIApplication sharedApplication] openURL: ] 을 이용해 접근하면 확인할 수 있겠다.)


마지막 term 파라미터에 회사명만 적어주면 된다. 

아~ 이것을 알아내느라 몇시간을 소비했다. 
좋은 팁이였길 바란다.

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








아이폰/아이팟터치용에 이어 안드로이드용 '바른생활' 어플을 출시했습니다. ^^
광고 나갑니다. ㅋ


매번 계획만 하는 당신, 실천하게 만들어드립니다!

■ 체크캘린더 ■

매일매일 새해 계획의 성공/실패를 캘린더에 체크하세요!

체크캘린더를 보면서 하루하루 성취감을 느껴보세요.


■ 계획일지 ■

하루하루 계획에 대한 일지를 작성할 수 있습니다!

일지를 쓰면서 나의 계획에 대한 다짐을 곱씹어보세요.


■ 푸시알림 ■

매일 푸시알림으로 나의 계획을 상기시켜드립니다!

바른생활은 꾸준히 계획을 실천할 수 있도록 돕는 최고의 도우미랍니다.


■ 커뮤니티 ■

모든 일은 혼자하면 힘들고 포기하게됩니다. 하지만 우리에겐 동지가 있습니다!

계획 별로 커뮤니티를 지원하여 같은 계획을 가진 사용자와 만나세요.

서로 격려하고, 정보를 교류하면 모두가 승리할 수 있습니다!

[바른생활]어플로 실천하는 사람으로 다시 태어나세요!


■ 다운로드 ■

아래 주소에 접속하시면 '바른생활' 어플을 무료로 다운로드 받으실 수 있습니다.

다운로드 : http://goo.gl/Tx22D


■ 참고 ■ 

[바른생활]로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다.
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.

스타플 계정으로 연동되는 어플
- (아이폰)바른생활
- (아이폰)어플지름신
- (아이폰)타임라인 


■ 스크린샷 ■ 











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


지난해 2010년 11월 30일 Flash Player 10.2 Beta가 처음 배포되면서 가장 눈에 띈 것은 바로 StageVideo가 아닌가 싶다. 이전 버전 Flash Player 10.1은 H.264 코덱 영상의 하드웨어 가속 기능을 강화하여 동영상 재생시 CPU 점유율을 감소시켰다는데 의미가 있었다. 10.2에서는 비디오 랜더링 파이프라인을 더욱 확장하고 색상 보정 기능과 이미지 스케일링등의 각종 기능을 추가했다. 즉, GPU가속 기능을 더욱 확대했다는 것을 의미하며 이로써 1080P 해상도의 HD 동영상을 보여주는데 CPU 점유율 0%에 가까운 수준이 되었다고 한다. 이것은 새로운 비디오 렌더링 방식인 StageVideo를 도입한데서 비롯된다. 이 문서는 StageVideo 에 대해서 이해하는 것을 목적으로 한다. (현재 시점에서 Flash Player 10.2이 공식 배포중이다.)


StageVideo 구조에 대해 
Flash Player 10.2 부터 지원하는 StageVideo는 어떻게 동작하는 것일까? 어떻게 해서 CPU 점유율을 줄이고 GPU 가속을 받을 수 있을까? 이런 부분에 대한 궁금증이 생길것이다. 

아래 화면은 전통적으로 사용된 기존 Flash Player에서 Video 시각객체(DisplayObject) 렌더링하는 방식을 묘사하고 있다. 


기존에 Flash Player에서 Video를 보여주는 위해 시각객체의 부모격인 flash.display.Stage위에 추가해야만 했다. 이 방식의 문제점은 동영상 렌더링을 위한 Video객체가 다른 시각객체와 연결되어 있어 CPU 점유율이 높아질 수 밖에 없는 구조라는 점이다. GPU를 적극활용하기에는 물리적으로 불리한 방식이다. 

반면에 다음 그림은 비디오를 렌더링하기 위해 Flash Player 10.2부터 지원하는 StageVideo를 사용했을때를 묘사한다.


전통적인 방식과 달리 Flash Player 10.2부터는 비디오를 렌더링하기 위해 flash.display.Stage의 도움을 받지 않는다. flash.display.Stage 뒤에 StageVideo가 물리적으로 분리가 되어 있어 다른 시각객체들과 연관성 없이 동작이 가능해졌다. 이렇게 됨으로써 flash.display.Stage위에 시각객체들이 그래픽 가속을 받지 않더라도 StageVideo만은 GPU가속이 가능하게 된 것이다. 


StageVideo 사용여부에 따른 CPU 점유율 

운영체제 및 그래픽카드별로 StageVideo를 사용여부에 따른 CPU 점유율에 대한 비교 표가 다음 링크에 공유되어 있다. 

Stage Video with the Brightcove Player : http://goo.gl/ZALsa


CPU 점유율이 분명 개선이 되었다는 것을 확인할 수 있다. 

다음 동영상은 지난 2010 Adobe MAX 행사에서 StageVideo 사용여부에 따른 퍼포먼스를 보여주고 있다.



결국 StageVideo를 이용하면 다른 시각객체들과 무관하게 되어 GPU를 이용해 렌더링함으로써 CPU점유율과 메모리 사용량이 많이 줄어든다는 것을 알 수 있다.


Flash Player 10.2 환경에서 StageVideo를 느껴보자.

Adobe에서 제공하는 Big Buck Bunny라는 제목의 HD 동영상을 통해 여러분은 직접 StageVideo 환경을 경험해볼 수 있다. 아래 링크로 방문해보길 바란다.




StageVideo Running : true가 되어 있는지 확인하고 플레이 해보길 바란다. false라면 Flash Player 10.2가 설치가 되었는지 확인해보고 10.1 이하라면 다음 링크에서 10.2 버전을 다운로드 받아 설치하면 되겠다. 

Adobe Flash Player 10.2 다운로드 : http://get.adobe.com/kr/flashplayer


StageVideo의 제약사항 
StageVideo는 다른 시각객체(DisplayObject)와 별도의 구조를 가진다. 이렇게 됨으로써 비디오 객체가 기존 시각객체가 가지는 특징 및 속성을 활용하는데 제약이 따른다. 가령 다음과 같은 제약사항이 있다.

- StageVideo는 회전할 수 없다. 단지 90 회전만 가능하다.
- StageVideo는 ColorTransform 또는 3D transform을 적용할 수 없다.
- StageVideo 객체는 alpha채널, blendmode, filter, mask, scale9Grid등을 적용할 수 없다.
- StageVideo에 렌더링 되는 영상은 BitmapData 객체로 복사할 수 없다.
- StageVideo에 렌더링 되는 영상은 bitmap 캐쉬 할 수 없다.
- 영상은 SWF 파일에 Embed 될 수 없다. 반드시 NetStream 객체를 이용해서 운영되어야만 한다.
- wmode가 transparent나 opaque인 경우는 GPU 가속에 제한된다. wmode를 direct로 지정해야한다. 
- 기본 하드웨어에 따라 몇몇 색상이 지원되지 않을 수 있다. 이러한 경우 Flash Player의 임의의 color space을 사용한다.

위와 같은 제약사항은 사실 거의 제약이라고 보지 않아도 된다. 왜냐하면 Youtube 영상을 보면서 회전하거나 filtering 하는 경우는 드물기 때문이다. 제약사항은 있으나 GPU 가속이 된다는 것만으로도 큰 효과를 기대할 수 있겠다. 



StageVideo API 사용하기
이 문서를 보는 사람중에 개발자도 분명히 있을 것이다. 개발자는 Flash Builder Burrito와 Flex SDK  4.5.0.18623 이상의 환경만 갖춰진다면 StageVidoe를 테스트해볼 수 있다. 

Flash Builder Burrito 다운받기 : http://labs.adobe.com/technologies/flashbuilder_burrito/

완벽한 개발환경을 갖추기 위해서는 여러분의 브라우져에 Flash Player 10.2 디버그 버전을 설치하는 것이 좋겠다. 다음 링크에서 윈도우, Mac, 리눅스 환경에서 각 브라우져별 Flash Player 10.2 디버그 버전을 받아 설치할 수 있겠다. 

다음 문서를 통해 여러 시나리오로 StageVideo API를 테스트 해볼 수 있다.

조금 더 구체적으로 개발환경을 구성하는 방법과 함께 StageVideo API를 이용한 개발방법을 경험하시려면 다음 동영상을 보기 바란다.

StageVideo 사용법 : http://gotoandlearn.com/play.php?id=134

추가사항 
오창훈 님께서 저보다 먼저 글을 써주셨네요. ^^ 소스코드도 있으니 참고하세요.


정리하며 

지금까지 Flash Player 10.2에서 지원하는 StageVideo에 대해서 다뤄봤다. 

이미 Flash Player를 이용한 동영상 서비스는 보편화 된 상태이다. 이제 HD급 영상에 대한 렌더링도 GPU가속이 됨으로써 많은 관련 업체들이 적극적으로 StageVideo를 도입 할 것으로 판단한다. 

Flash Player 10.2 부터는 StageVideo 개념외에 IE9에서 GPU 가속지원, 네이티브 커스텀 마우스 커서 지원, 멀티모니터 풀스크린 지원, Sub-pixel 텍스트 렌더링 지원을 하게 되었다. 이런 부분도 함께 보면 업무 추진에 도움이 되지 않을까 생각한다. 자세한 내용은 다음 링크를 통해 확인해 볼 수 있겠다. 

Flash Player 개발자 센터 : http://www.adobe.com/devnet/flashplayer.html
Flash Player 10.2 feature : http://www.adobe.com/products/flashplayer/


StageVideo와 관련된 내용들

Adobe Flash Player 10.2 다운로드 : http://get.adobe.com/kr/flashplayer
(영문)Adobe 개발자 센터에서 소개하는 Stage Video : http://goo.gl/5bmBV
(영문)Flash Player 10.2 Beta: Stage Video : http://labs.adobe.com/technologies/flashplayer10/stagevideo.html
(영문)Getting started with stage video : http://www.adobe.com/devnet/flashplayer/articles/stage_video.html
(동영상)MAX Sneaks : Flash Player Video Performance Improvements : http://www.youtube.com/watch?v=geK7geL3I40
(동영상)StageVideo 사용법 : http://gotoandlearn.com/play.php?id=134
(영문)Introducing SimpleStageVideo : http://www.bytearray.org/?p=2571
(한글)StageVideo에 대해 : http://hazbola.tistory.com/222 
(영문)Delivering video and content for the Flash Platform on TV : http://www.adobe.com/devnet/devices/articles/video_content_tv.html
(한글)어도비, 동영상 가속 기능 강화된 플래시 플레이어 10.2 베타 발표 http://www.kbench.com/hardware/?no=93384&sc=1
Flash Player 개발자 센터 : http://www.adobe.com/devnet/flashplayer.html
Flash Player 10.2 feature : http://www.adobe.com/products/flashplayer/
[StageVideo 샘플 소스 공유]플래시 플레이어 10.2 정식 Release : http://lovedev.tistory.com/619


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

★★★★★ 바른생활 ★★★★★
매번 계획만 하는 당신, 실천하게 만들어드립니다!

■ 체크캘린더 ■

매일매일 새해 계획의 성공/실패를 캘린더에 체크하세요!

체크캘린더를 보면서 하루하루 성취감을 느껴보세요.


■ 계획일지 ■

하루하루 계획에 대한 일지를 작성할 수 있습니다!

일지를 쓰면서 나의 계획에 대한 다짐을 곱씹어보세요.


■ 푸시알림 ■

매일 푸시알림으로 나의 계획을 상기시켜드립니다!

바른생활은 꾸준히 계획을 실천할 수 있도록 돕는 최고의 도우미랍니다.


■ 커뮤니티 ■

모든 일은 혼자하면 힘들고 포기하게됩니다. 하지만 우리에겐 동지가 있습니다!

계획 별로 커뮤니티를 지원하여 같은 계획을 가진 사용자와 만나세요.

서로 격려하고, 정보를 교류하면 모두가 승리할 수 있습니다!

[바른생활]어플로 실천하는 사람으로 다시 태어나세요!


■ (구)작심삼일 업그레이드 기능 ■

1. 내 마음대로 계획 추가하기
2. 계획 시작일 설정기능
3. 편리해진 홈화면 인터페이스
4. 계획 일지쓰기 추가

(작심삼일 아이디로 로그인 할 수 있습니다)


■ 다운로드 ■ 
아래 주소에 접속하시면 '바른생활' 어플을 무료로 다운로드 받으실 수 있습니다.

아래 QR 코드로 접근하셔도 다운로드 받을 수 있습니다.




*** [바른생활]로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다.
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.

*** 스타플 계정으로 연동되는 어플









스타플 타임라인 모바일 업로더 출시했습니다.

감성 SNS 스타플(starpl.com)에서 제공하는 타임라인(timeline.starpl.com)을 모바일로 즐기세요!
아이폰으로 촬영한 사진과 글을 언제 어디서든 업로드할 수 있습니다.


* PC에서 이용하시면 놀라운 타임라인의 모습을 볼 수 있습니다.(http://timeline.starpl.com)
* 스타플 계정으로 로그인 할 수 있습니다.
* 추후 지속적인 업데이트로 다양한 기능을 제공할 예정입니다.


*** [타임라인]으로 작성한 글/댓글은 스타플(starpl.com) 웹서비스에도 자동 업로드됩니다.
PC에서 www.Starpl.com으로 접속하시면 더욱 다양한 기능의 스타플 서비스를 이용하실 수 있습니다.


다운로드 받기
아래 주소로 접속하시면 다운로드 받으실 수 있습니다.


QR코드로 다운로드 받기
아래 QR코드로 접속하시면 앱스토어에서 다운로드 받으실 수 있습니다.



스크린샷








스타플에서는 이외에도 여러가지 어플을 출시해 운영하고 있습니다.


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


+ Recent posts