air어플을 만들어야할 것 같아서(근데 이제 취소된 듯-_-), ApplicationUpdater를 삽질해봤습니다.

일단 air 어플리케이션은 수정사항이 있으면 자동적으로 업데이트를 체크해서 어플을 업데이트하는 기능이 꼭 들어가야합니다. 그래서 ApplicationUpdater클래스를 이용해 삽질을 해봤습니다.

보면 ApplicationUpdaterUI라는 클래스도 있는데, 이건 ui적으로 기능이 이미 구현이 되어있는 것입니다. 사용자가 이런 ui를 새롭게 꾸미려면 ApplicationUpdater클래스를 이용해서 내부적으로 처리를 하고, 나머지 ui는 직접 꾸밀 수가 있습니다. 그래서 사용자가 직접 새로운 업데이트air파일을 받는 모습과 업데이트체크를 해서 현재 업데이트가 있는지 등을 구현할 수 있습니다.

사실 과정은 applicationUpdater.checkNow()한번 때려버리면 업데이트가 있으면, 논스톱으로 강제 업데이트를 시켜버리긴합니다만-_- 강제업데이트말고, 사용자에게 업데이트 과정을 알려주기 위해서 과정을 삽질해봤습니다.

강제 업데이트를 중지하려면 각각 프로세스별로 event 중지를 시켜야합니다.

[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical" 
    title="Sample Version Checker Application"
    applicationComplete="applicationCompleteHandler()">
    <mx:Script>
        <![CDATA[
            import air.update.events.DownloadErrorEvent;
            import air.update.events.StatusUpdateErrorEvent;
            import air.update.events.StatusUpdateEvent;
            import air.update.events.UpdateEvent;
            import air.update.ApplicationUpdater;
             
            private var applicationUpdater:ApplicationUpdater;
            
            private function applicationCompleteHandler():void
            {
                // 현재버전 찍기
                   var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
                var ns:Namespace = appXml.namespace();
                var appVersion:String = appXml.ns::version[0];
                log.text += "현재 어플리케이션버전 : " + appVersion + "\n";
               
                // ApplicationUpdater초기화
                applicationUpdater = new ApplicationUpdater();
                applicationUpdater.configurationFile = new File("app:/update.xml");
               
                // initialize할 때
                applicationUpdater.addEventListener(UpdateEvent.INITIALIZED, initializedUpdateEventHandler);
                applicationUpdater.addEventListener(ErrorEvent.ERROR, errorErrorEventHandler);
               
                // checkNow할 때
                applicationUpdater.addEventListener(StatusUpdateEvent.UPDATE_STATUS, updateStatusStatusUpdateEventHandler);
                applicationUpdater.addEventListener(UpdateEvent.CHECK_FOR_UPDATE, checkForUpdateUpdateEventHandler);
                applicationUpdater.addEventListener(StatusUpdateErrorEvent.UPDATE_ERROR, updateErrorStatusUpdateEventHandler);
               
                // downloadUpdate할 때               
                applicationUpdater.addEventListener(UpdateEvent.DOWNLOAD_START, downloadStartUpdateEventHandler);
                applicationUpdater.addEventListener(ProgressEvent.PROGRESS, progressProgressEventHandler);
                applicationUpdater.addEventListener(UpdateEvent.DOWNLOAD_COMPLETE, downloadCompleteUpdateEventHandler);
                applicationUpdater.addEventListener(DownloadErrorEvent.DOWNLOAD_ERROR, downloadErrorDownloadErrorEventHandler);
               
                // installUpdate할 때
                applicationUpdater.addEventListener(UpdateEvent.BEFORE_INSTALL, beforeInstallUpdateEventHandler);
               
                // 초기화
                applicationUpdater.initialize();
            }
           
            private function initializedUpdateEventHandler(event:UpdateEvent):void
            {
                log.text += "initialized : " + applicationUpdater.currentState +"\n";
                applicationUpdater.checkNow();
            }
           
            private function errorErrorEventHandler(event:ErrorEvent):void
            {
                log.text += "error : " + applicationUpdater.currentState + "\n";
            }
           
            private function updateStatusStatusUpdateEventHandler(event:StatusUpdateEvent):void
            {
                event.preventDefault();
                log.text += "update_status : " + applicationUpdater.currentState +"\n";
                log.text += "version : " + event.version + "\n";
                log.text += "available : " + event.available + "\n";
               
                if (event.available)
                {
                    applicationUpdater.downloadUpdate();
                }
            }
           
            private function updateErrorStatusUpdateEventHandler(event:StatusUpdateEvent):void
            {
                log.text += "update_error : " + applicationUpdater.currentState + "\n";
            }
           
            private function checkForUpdateUpdateEventHandler(event:UpdateEvent):void
            {
                log.text += "check_for_update : " + applicationUpdater.currentState + "\n";
            }
           
            private function downloadStartUpdateEventHandler(event:UpdateEvent):void
            {
                log.text += "download_start : " + applicationUpdater.currentState + "\n";
            }
           
            private function progressProgressEventHandler(event:ProgressEvent):void
            {
                log.text += "progress : " + event.bytesLoaded + "/" + event.bytesTotal + "\n";
            }
           
            private function downloadCompleteUpdateEventHandler(event:UpdateEvent):void
            {
                event.preventDefault();
                log.text += "download_complete : " + applicationUpdater.currentState + "\n";
                btnInstall.visible = true;   
            }
           
            private function downloadErrorDownloadErrorEventHandler(event:DownloadErrorEvent):void
            {
                log.text += "download_error : " + applicationUpdater.currentState + "\n";   
            }
           
            private function beforeInstallUpdateEventHandler(event:UpdateEvent):void
            {
                log.text += "before_install : " + applicationUpdater.currentState + "\n";
            }
           
            private function clickInstallHandler(event:MouseEvent):void
            {
                applicationUpdater.installUpdate();
            }
        ]]>
    </mx:Script>
    <mx:TextArea id="log" width="100%" height="100%" />
    <mx:Button id="btnInstall" click="clickInstallHandler(event)" visible="false" label="설치"/>
</mx:WindowedApplication>
[/code]

air안에 있는 update.xml파일
[code]<?xml version="1.0" encoding="utf-8"?>
 <configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0" >
   <url>웹에있는update.xml파일 주소</url>
   <delay>1</delay>
</configuration>[/code]

web에 올려진 update.xml파일
[code]<?xml version="1.0" encoding="utf-8"?>
<update xmlns="http://ns.adobe.com/air/framework/update/description/1.0">
  <version>1.5</version>
  <url>업데이트할 air파일 주소</url>
  <description>
      <![CDATA[update! 1.5!]]>
  </description>
</update>
[/code]

과정은 initialize()한다음에 checkNow()를 호출하면....
현재 업데이트가 있는지 update_status가 발생하면, 그 event변수에 version과 available값이 오는데, 거기에 available이 true면 업데이트가 있는 겁니다.
downloadUpdate()를 호출하면 파일을 막 다운로드하는데, 파일 받는 과정을 progressevent로 받을 수 있습니다.
완료가 되면 downloadComplete이벤트가 발생해서 installUpdate()를 때려주면 어플이 종료되고 업데이트를 시작합니다.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

PS. 오늘따라....시간이 엄청 안가네-_-
 
Posted by 머드초보
,
 
최근 스티브잡스횽이 까고 있는 플래시-_-

CS5 한글판이 나와서 한번 깔아봤는데, 역시 전 한글이 편하네요-_- 어설픈 한글로 되어있어도 그냥 영어로 된 것 보단 낫다고 생각하는 1人...

일단 Flash랑 Flash Builder를 둘 다 깔아야해요~
안깔면 안깔려있다고 뭐라그래요~

일단 Flash에서 액션스크립트 편집기가 좋아졌다고 하는데(전 잘 안써봐서-_-), 여전히 안좋은 것 같은 느낌이 드는....
액션스크립트 클래스 편집은 그냥 Flash Builder에서 하면 맘 편하네요~
둘이서 연동이 되어서 빌더에서 에러 수정 및 편집이 매우 용이해요~

일단 플래시화면!
사용자 삽입 이미지
일단 Flash Builder도 같이 띄워놓아야 합니다. 안그러면 선택하라는 거 안나오는 것 같음.
여기서 ActionScript3프로젝트로 새로 만든다음에, ActionScript 3.0 클래스를 새로 만들면
"어떤 응용 프로그램에서 ActionScript3.0 클래스를 만들어야 합니까?"라는 말로 물어보고, Flash Professional인지 Flash Builder인지 선택할 수 있어요.
그러면 Flash Builder에서 해당 Flash프로젝트 파일인 fla파일을 선택하면 되는데요. 그러면 자동으로 프로젝트도 만들고, ActionScript Class만드는 창도 떠서 만들어지게 됩니다.
[code]package
{
    import flash.display.Sprite;

    public class DrawRect extends Sprite
    {
        public function DrawRect()
        {
            this.graphics.beginFill(0x000000);
            this.graphics.drawRect(0, 0, 100, 100);
            this.graphics.endFill();
        }
    }
}[/code]
사각형을 그리고~ flash에서 불러올 때 자동으로 DrawRect라는 클래스가 코드힌트로 나옴!
사용자 삽입 이미지

[code]var drawRect:DrawRect = new DrawRect();
this.addChild(drawRect);[/code]

사용자 삽입 이미지
잼있는 건 Flash Builder에서도 Control + Enter눌러도 된다는......
일단....여전이 Flash에서 ActionScript편집은 불편합니다. 그래서 얘네들이 Flash Builder 연동을 해서 하는 것 같은데, 정말 괜찮은 기능인 듯 합니다.
 
Posted by 머드초보
,
 
와~ 컨퍼런스다~ 전 이런곳을 참 좋아하는....-_-(카페활동도 안하고 눈팅만 하는 놈이.....-_-)
게다가 우리회사 근처에서 하네요. 매우 익숙한 AT센터의 숨막히는 뒷태.

암튼, 주말인데도 불구하고, 저의 출근버스 9500번을 타고, 마치 출근하는 기분으로 갔습니다ㅠㅠ
좀 늦게 갔는데, 이미 문군님이 발표를 하고 계시네요.


1. 디자이너를 위한 플래시 - 문군님

음... 늦게 가서 제대로 못들었습니다 ㅠㅠㅠㅠ


2. 쉽게 접하는 플래시 아트웍 - 공씨님

와~ KSUG(한국 스프링 유저 모임)에서나 볼 수 있던 라이브코딩이네요!
예전에 플래시캠프서울 행사에서 보던 플래시 아트를 주제로 했는데요. 그때에도 매우 멋있다고 생각했었는데, 이런 짓(?)을 하시는 분이 국내에도 계셨군요!
하지만, 확실히 국내에서의 돈이 되는 플래시는 아니기때문에-_- 취미로 하고 계시다고 하네요.

일단 아무것도 없는 상태에서 라이브코딩으로 모든 것을 진행했습니다. Flash에다가 아무것도 draw하지 않고, 오직 ActionScript로만 코드를 작성했습니다.
그랬는데, 매우 아름다운 영상이 나왔네요. 중간에 라이브코딩을 해서 오류도 나고 실수도 좀 했지만(신기한 건 진짜 아무것도 준비를 해오지 않고 온 듯한 느낌을 좀 받았음 ㄷㄷ), 결국에는 멋진 아트웍을 한시간안에 만들어버렸네요~ 와 이거 참 재미있네요~ 저도 나중에 시간나면 해봐야겠어요!

공씨님은 발표도 참 잘하시고, 코딩도 참 잘하시네요! 부럽 ㅠㅠ
그 만든 코드를 좀 보고 싶은데....카페에 올라오려나.....


3. Flash CS5 for iPhone - 우야꼬님

애플의 변경된 정책과 어도비에서 포기로 인해 발표안할 줄 알았는데, 그냥 했네요~^^
확실히 Flash로 아이폰앱을 개발하게 된다면 그래픽그리고, 모션을 하는 부분에 대해서는 매우 쉽게 개발할 수 있겠지요^^ 하지만, 제 생각은 조금 틀렸던 것이.... 실제로 애플에서 제공하는 것은 Objective-C를 통한 개발인데, 그걸 Flash로 개발해서 억지로 iPhone에 맞게 변형해서 끼워맞춘다는 것 자체가 깔끔하지도 못하고 한번의 변환과정을 거치는 것이라 퍼포먼스, 호환성 등에 뭔가 문제가 생길 것이라는 생각이 조쿰 들었습니다.
그래서 좀 원하지 않았는데, 그래도 어도비에서 포기했다니 다행이네요-_- 이런건 시작하지 말았어야....-_-

어쨌든, 저번에 Flash Camp Seoul행사에서도 cs5를 이용한 아이폰개발을 보여주었는데요. 참 신기하긴 합니다. 뭐 안드로이드로 퍼블리싱이 가능하게 한다고 합니다. 확실히 플래시로 개발하게 되는 장점은 그것이네요. 그래픽에서 매우 자유롭죠. 웹에서도 항상 html + css + js환경에선 그리는 것에 대해서 한계가 있었고, 그걸 플래시가 보완해주는 형태였는데, 안드로이드에서도 그래픽을 그리기위해선 매우 큰 고통이 필요합니다-_- 그걸 쉽게 해주는 것은 확실히 플래시가 좋긴 합니다.
하지만, 어플형태로 제작하게 된다면..플래시로 개발하면 안되겠죠-_-
안드로이드도 나름 컴포넌트가 잘 되어있어서 개발을 빠르게 할 수 있죠.

어쨌든, 우야꼬님이 마지막에 좋은 얘기를 해주셨는데요. 원하는 걸 만들고 싶으면 그냥 계속 삽질하라는....(제 귀에는 그냥 이렇게 들리네요-_-)



4. 플래시 플랫폼으로 표현하는 SNS - 러브데브님

오창훈님이신데, 예전에 Daum DevDay때보고 1년만에 뵙는군요^^
암튼, 네이버에서도 하고 있는 OpenSocial을 얘기하러 나오신 것 같습니다. 확실히 Facebook에서 하고 있는 소셜게임이 외국에서는 굉장히 인기가 있는 것이 사실입니다. 하지만, 아직 국내에서는 Facebook만큼의 인맥이 구축된 인터넷서비스는 싸이월드 뿐인데, 싸이월드에서 그나마 소셜게임이 조금 선전을 하고 있죠~ 하지만, 아직 도토리 현질(?)수준이 아직은 많이 미약한 듯.
러브데브님 말대로 시장은 계속 커질 것이라는 기대가 조금 있긴하네요. 일단 싸이월드는 컴퓨터를 잘 모르는 사람들도 많이 하니깐요. 지금 싸이월드 소셜앱설치수가 많은 건 80만명까지 되는 걸보니.....-_-

일단 하고 싶은 얘기는 소셜앱을 만드는데에는 최적의 플랫폼이 플래시라는 것입니다. 저도 물론 그렇게 생각하구요. 아직까지 국내나 외국에서 ie점유율이 이렇게 높은데, html + js + css조합으로는 표현의 한계가 있게 되죠. 그래서 대부분의 소셜게임은 플래시로 제작이 되어있구요.
제가 생각하는 것과 많이 비슷하네요. 저도 플래시는 깔끔하게 swf파일 하나로 내려지기때문에-_-(의외로 깔끔한 걸 좋아한다는ㅜㅜ), 그리고 크로스플랫폼에 대한 개발이 편하기 때문에 등등~

그리고 마지막에 me2day를 이용한 오픈소셜을 소개시켜주셨네요. 예전에 네이버도 오픈소셜에 참여한다고 들었는데, 미투데이로 하는 것이네요. 미투데이는 아직 싸이월드만큼 인맥구축은 없지만, 이제 계속 성장하고 있는 서비스라서 소셜앱을 제작하면 많이 할 것 같습니다. 국내에서도 킬러앱수준의 소셜게임이 얼른 나왔으면 하네요^^

5. ??? - ???

아젠다에는 자수님으로 되어있는데... sk컴즈에서 일하시는 분 같은데, 검색위젯, 싸이월드 뮤직스킨에 대해서 발표를 하셨네요.
아....이때 친구가 와서 옆에서 기아와 롯데전을 시청하느라... 제대로 발표를 못들었어요.....ㅠㅠㅠㅠㅠ


오늘 발표는 참 재미있었네요~ 제가 좋아하는 플래시얘기만 잔뜩 들을 수 있는 기회였으니까요^^
최근 개발자들 사이에선 플래시가 참 많이 언급이 되었지요. 스티브잡스가 매우 까서....-_- 그래도 플래시는 참 좋은 기술인 것 같습니다.

PS. 스티브잡스는 언제까지 플래시를 깔것인가.....하긴 Adobe가 게으른건 사실이야-_-
 
Posted by 머드초보
,
 
htmlText에서 <a>태그를 사용할 수 있는데요. 이것에 마우스오버 시 다른 css로 바꾸는 a:link, a:hover, a:active 스타일을 적용할 수 있습니다.
근데, 그냥 css에 때려박으니까 안되더라구요. 검색하니까 바로 나오네요^^

우선 StyleLabel.as
[code]
package
{
    import flash.text.StyleSheet;
   
    import mx.controls.Label;
   
    public class StyleLabel extends Label
    {
        public function StyleLabel()
        {
            super();
        }
       
        override protected function createChildren():void
        {
            super.createChildren();
           
            var styleSheet:StyleSheet = new StyleSheet();
            styleSheet.setStyle("a:link", {color:"#004F99", textDecoration:"none"});
            styleSheet.setStyle("a:hover", {color:"#004F99", textDecoration:"underline"});
            styleSheet.setStyle("a:active", {textDecoration:"none"});
            textField.styleSheet = styleSheet;   
        }
    }
}
[/code]
textField에 styleSheet라는 것이 있는데, StyleSheet를 생성해서 a:link, a:hover, a:active를 스타일설정해서 textField에 있는 styleSheet에 넣어주면 끝!

[code]<local:StyleLabel id="styleLabel">
        <local:htmlText>
            <![CDATA[<a href="http://www.naver.com">네이년</a>]]>
        </local:htmlText>
    </local:StyleLabel>[/code]
htmlText를 사용하는 컴포넌트 Label이나 Text, TextArea에서 됩니다.
 
Posted by 머드초보
,
 
Windows API정복 이후 간만에 1000페이지가 넘는 책을 구입했습니다. 지금 확인해보니 Windows API정복은 1500페이지 짜리군요. 사실 이런 책 하나쯤은 회사책상 위에 올려놔줘야 간지가 나죠......아 농담이구요-_-

ActionScript에 대해서 너무 모르고 flash계열에 입문을 해버려서-_- 저한테 좋은 책이 나왔네요. AIR IN ACTION의 역자이신 유윤선님과 ActionScript 3.0 CookBook역자이신 송호철님께서 번역을 해주셨네요^^ 둘 다 매우 유용하게 쓰고 좋아하는 책들인데^^ 두분이서 1000페이지를.....-_- 대....대단하십니다-_-

물론 2년전 책이 국내에는 지금 나오긴 했지만, ActionScript만을 심오하게 다룬 책은 국내에 많이 없었던 것이 사실이죠. 대부분 나와있는 Flash계열의 책은 Flex Framework의 사용법이나, Flash책에서 간간히 보이는 ActionScript가 다 인데, 이 책에는 Actionscript의 문법과 특징들을 쉽게 설명해 놓은 것 같습니다.

번역하시느라 너무 수고 많이 하셨어요~
사용자 삽입 이미지

사진을 잘 찍어서 얇게 보인다-_- 사실 엄청두꺼움-_-


 
Posted by 머드초보
,