많은 분들(?)이 제 블로그에 오셔서 질문을 해주셔서 간단한 예제를 통한 설명을....-_- 나중에 저도 참고하려고 기록용-_-

일단, Flash에서 CrossDomain에 걸리는 데이터를 요청할 때 Plicy File인 crossdomain.xml 파일을 root에 정의해둬서 해당 도메인이면 데이터를 허용하게 할 수 있습니다.

소켓도 마찬가지입니다. 해당 도메인에서 해당 포트로 들어온 요청은 받겠다는 정책파일을 작성할 수 있습니다.
최초 소켓이 정책파일을 요청하게 되는 포트는 843포트입니다. 만약 이포트가 열러있지 않다면 현재 연결하려고 하는 포트로 <policy-file-request/>를 날려서 정책파일을 요청하게 됩니다.
그러면 843이든, 해당포트든 간에 정책파일만 날려주면 됩니다.

[code]<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*" to-ports="10000-10001" />
</cross-domain-policy>[/code]
소켓에 대한 정책파일을 정의한 것인데, domain에는 허용할 도메인을 쓰고, to-ports에는 허용할 포트를 쓰면 됩니다.
이걸 날려주면 이제 연결할 포트로부터 데이터를 주고 받을 수 있습니다.

초간단 에코예제!
일단 서버는 자바로...(그나마 자신있는 언어라서ㅠㅠ)

일단 PlicyFileServer를 하나 돌릴 쓰레드를 만듭니다.
PlicyFileServer.java
[code]import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class PolicyFileServer extends Thread{
   
    private ServerSocket serverSocket;
    private String policyFile = "<?xml version='1.0'?>" +
                                "<!DOCTYPE cross-domain-policy SYSTEM '/xml/dtds/cross-domain-policy.dtd'>" +
                                "<cross-domain-policy>" +
                                "<allow-access-from domain='*' to-ports='10000' />" +
                                "</cross-domain-policy>";
   
    @Override
    public void run() {
        try {
            serverSocket = new ServerSocket(843);
            while (true) {
                final Socket socket = serverSocket.accept();
                new Runnable() {
                    @Override
                    public void run() {
                        try {
                            socket.setSoTimeout(10000);
                            InputStream in = socket.getInputStream();
                            byte[] buffer = new byte[23];
                            if ( in.read(buffer) != -1 && (new String(buffer)).startsWith("<policy-file-request/>") ) {
                                OutputStream out = socket.getOutputStream();
                                out.write(policyFile.getBytes());
                                out.write(0x00);
                                out.flush();
                                out.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try { socket.close();} catch(Exception ex){}
                        }
                    }
                }.run();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
[/code]
내용을 보면 그냥 서버소켓하나 만들어서 요청이 들어오면 그 소켓으로 policy file을 전송하는 형태입니다. 파일은 만들기 귀찮아서-_- 그냥 String으로 선언-_- 보면 모든도메인에 한해서 10000포트를 열어주는 겁니다.

이제 메인서버!
SocketTest.java
[code]import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class SocketTest {

    private ServerSocket server;
   
    public SocketTest() {
        try{
            server = new ServerSocket(10000);
            System.out.println("접속을 기다립니다.");
           
            while (true){
                final Socket socket = server.accept();
                Thread t = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
                            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
                            String line = null;
                            while ((line = br.readLine()) != null) {
                                System.out.println("수신데이터 : " + line);
                                pw.println("Hello! " + line);
                                pw.flush();
                            }
                        } catch (Exception e) {
                            try { if(socket != null) socket.close(); } catch (Exception ex) {}
                        }
                    }
                });
                t.start();
               
            }
        } catch(Exception e){
            System.out.println("Error!");
        }
    }
   
    public static void main(String[] args) {
        new PolicyFileServer().start();
        new SocketTest();
    }
}[/code]
데이터를 받으면 다시 Hello!를 붙여서 다시 전송해주는 echo서버를 하나 만듭니다.
그리고 main함수에서는 PolicyFileServer쓰레드를 하나 시작하고, EchoServer를 돌립니다.

이제 Flex!
[code]<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               applicationComplete="application1_applicationCompleteHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
           
            import spark.components.mediaClasses.VolumeBar;
           
            private var socket:Socket;
           
            protected function application1_applicationCompleteHandler(event:FlexEvent):void
            {
                socket = new Socket("127.0.0.1", 10000);
                socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
                socket.addEventListener(Event.CONNECT, connectHandler);
            }

            protected function btnSend_clickHandler(event:MouseEvent):void
            {
                // TODO Auto-generated method stub
                socket.writeUTFBytes(inputMessage.text + "\n");
                socket.flush();
            }
           
            private function connectHandler(event:Event):void
            {
                trace("접속완료!");   
                hbox.visible = true;
            }
           
            private function socketDataHandler(event:ProgressEvent):void
            {
                var message:String = socket.readUTFBytes(socket.bytesAvailable);
                trace("수신메세지 : " + message);
                textResult.text = message;
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
   
    <s:layout>
        <s:VerticalLayout />
    </s:layout>
   
    <mx:HBox id="hbox" visible="false" width="100%" horizontalAlign="center">
        <s:TextInput id="inputMessage" />
        <s:Button id="btnSend" label="송신하기" click="btnSend_clickHandler(event)"/>
    </mx:HBox>
   
    <mx:Text id="textResult" width="100%" textAlign="center"/>
</s:Application>
[/code]
Socket만들어서 10000포트로 연결합니다. 그러면 도메인이 다르게 되면 swf가 843포트로 "<policy-file-request/>"를 날려서 정책파일을 달라고하는데, 서버에서 만들어놓은 PolicyFileServer가 정책파일을 내려주면 받게되면 10000포트로 다시 연결해 연결을 시작하게 됩니다.

몬가 별거 없는데 장황하게 설명해놨네.

그리고, 이런식으로 PolicyFileServer를 서버어플에 통합하면 안되겠죠? 나중에 서버어플이 늘어난다면 계속 새로 추가해야하니, PolicyfileServer를 따로 만들어서 띄워놓으면 되겠죠?^^
일단, 여러 폴리시서버 예제는 구글링하면 많이 나와요~
여기 아래주소는 Java, PHP, C#, VB.NET, Python 등등 예제가 있어요.
http://code.google.com/p/assql/wiki/SecurityInformation
이건 c로 만든거!
http://panzergruppe.hp.infoseek.co.jp/fspfd.html
 
Posted by 머드초보

댓글을 달아 주세요

 
와....

안드로이드에서 Adobe AIR어플이 돌아가네요. 일단 포딩할만한 어플이 없어서(저는 대부분 Flex로 작업을 해서-_-) 공씨님이 전에 플래시액션스크립트 카페에서 발표했던 자료를 가지고 포팅해봤어요-_-
http://flashist.tistory.com/68

일단 하드웨어 가속 기능이 현재 pre-release버전에는 지원되지 않아서 그래픽 관련된 것에 퍼포먼스는 상당히 떨어진다고 얘기를 하는 듯 하네요. 그래서 공씨님이 만든 이 아트웍플래시 같은 건 느리게 돌아갈 수 밖에 없는 듯. 물론 최적화하는 방법이 있을 것 같긴 한데, 제가 몰라서..-_- 저 소개한 블로그에서 나온 게임들은 대체 어디서 받아서 해볼 수 있는건지... 동영상을 보면 굉장히 부드럽게 구현되어있는데, 코드를 보고 싶네요 ㅠㅠ

환경은 Android 2.1이상에서만 되는 듯.

방식은 이렇습니다. Adobe AIR 런타임을 안드로이드폰에 설치해야합니다. 그리고 Flash 등을 이용해 apk파일로 만든 파일을 설치하면 런타임이 설치가 되어있으면 실행이 됩니다. 이런방식인 듯.

소개한 블로그입니다.
http://blogs.adobe.com/air/2010/05/air_android_prerelease.html

그 어도비랩사이트 가면 실제 런타임과 Adobe AIR2.5 SDK를 받아서 개발할 수 있습니다.
http://labs.adobe.com/technologies/air2/android/

아...그리고 개발방식은 역시나 Flash CS5를 이용하는 방법과 Flash Builder를 이용하는 방법이 있는데요. 아직 flex프레임워크로는 안되는 듯 합니다. 디폴트로 WindowedApplication이 있어야하는데, 이 안드로이드는 윈도우 방식이 아니다보니...-_- 순수 ActionScript로 짤 수 있습니다.

하지만 Flash builder를 이용하게 되면 디버깅이나 테스트를 해볼 수 없습니다-_- 실제 에뮬레이터나 폰에 배포하기 전까지 모양을 볼 수 없어요. 정신 건강상 Flash CS5를 이용하시는 게 ^^ 일단 Flash CS5기준으로 설명을....


1. 런타임 설치

랩사이트가서 가입하고 로그인하면 파일들을 받을 수 있습니다.
근데, 런타임이 Device용이랑 Emulator용이 따로 있음. 어쨌든, 런타임을 받으면 6메가 정도인데, 설치하면 20메가 입니다(내 모토로이 용량도 없는데....ㅠㅠ).

2. Flash CS5 확장기능 설치

랩사이트에서 Flash CS5에서 AIR for Android Extension for Flash CS5를 받은다음에, Adobe Extension Manager CS5를 이용해서 설치를 합니다. 그런다음에 Flash CS5를 실행하면 새로운 템플릿이 하나 생깁니다.
AIR for Android에서 480x800Android 모냥이 하나 생깁니다.

3. 이제 셋팅 끝 개발-_-

이제 그냥 개발하면 되는 듯-_-

4. 배포 및 실행

오른쪽에 속성에 보면 AIRAndroid 설정이 있는데, 그거 편집누르면 다양한 publish옵션이 있습니다. 인증서 선택하고, 비밀번호 치고, 그다음에 Android SDK의 adb.exe파일 경로까지 잡아주면 배포후에 바로 실행도 할 수 있습니다.
사용자 삽입 이미지


5. 구동화면

사용자 삽입 이미지

물론 실제 Adobe AIR용 API는 사용해보진 않았는데, ActionScript로만 Android어플을 만들 수가 있는 것이네요. 근데 꼭 Adobe AIR런타임을 거쳐야하는지가 의문이 드네요. 그냥 apk파일로 만들어지는 거라면...... 아....안되겠구나..... 쓰다보니 사실 java에서 쓰이는거랑 Adobe AIR에서 쓰이는거랑 완벽하게 포팅을 할 순 없겠죠. 뭔 소린지....-_-

어쨌든, 그냥 신기...하지만 프리릴리즈기때문에, 뭐 아직 멀은 듯.

PS. Flash Player for Android도 나오긴 나왔는데, Android 2.2버전에서만 되어서 모토로이에서 테스트해볼 수 없네요. 넥서스원이 2.2업할 수 있다고 하는데, 한번 구동하는 걸 보고 싶네요^^

 
Posted by 머드초보

댓글을 달아 주세요

  1. 김정욱 2010.11.21 21:25 신고  댓글주소  수정/삭제  댓글쓰기

    아진짜 p12파일 부럽네요 저는 지금 한달째해매다가 거의 포기했어요...... 아이팟 개발하려는데
    어떻게해야 받을수있죠??
    happykju1218@naver.com

    • 머드초보 2010.12.05 20:22 신고  댓글주소  수정/삭제

      인증서 eclipse로 adt설치하시고 안드로이드 배포할 때 인증서 자기인증으로 생성할 수 있습니다. 그걸로 해도 됩니다^^

  2. 정혜림 2011.04.20 13:56 신고  댓글주소  수정/삭제  댓글쓰기

    Adobe AIR2.5 SDK (flashpro_extensionforair_p1_102510.zxp 파일)
    이거를 현재는 구할수가 없네요. 어도비에서 다음버젼에 추가하례정이라 배포하지않는데 혹시 가지고 계신것을 보내주실수 있으실까요???


    bangmadam@naver.com

 
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 머드초보

댓글을 달아 주세요

  1. 달빛화가 2010.11.10 15:27 신고  댓글주소  수정/삭제  댓글쓰기

    제가 머드초보의 블로그 내용을 가지고 ApplicationUpdater를
    그대로 이용해보았는데요.

    이상하게도 전 16803 에러가 발생하네요.
    아무리 뒤져봐도 16803에 대한 내용이 없어서 질문을 드립니다.
    혹시 왜 16803 에러가 발생하는지 알고 계시나요.?

    • 머드초보 2010.12.05 20:20 신고  댓글주소  수정/삭제

      음..... 파일이 없거나 그러진 않는지?ㅠㅠ
      저도 그 에러에 대해선 잘 모르겠네요

  2. BlogIcon 박경석 2012.07.20 13:25 신고  댓글주소  수정/삭제  댓글쓰기

    "6803 잘못된 Adobe AIR 파일입니다(형식)"
    레퍼런스에 이렇게 나와 있는걸로 봐서 파일을 배포하실때 혹시 exe로 배포하신게 아닌지 생각됩니다. 업데이트 하려면 확장자를 air로 해서 배포해야 ApplicationUpdater를 사용할수 있다고 합니다.

 
최근 스티브잡스횽이 까고 있는 플래시-_-

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 머드초보

댓글을 달아 주세요

  1. BlogIcon 길땡 2010.05.18 00:03 신고  댓글주소  수정/삭제  댓글쓰기

    플렉스 그래프가 이쁜것 같아서. . .

    DB의 값을 받아와서 그래프로 만들어주려고 했는데. . .

    아직 그렇다할 자료가 ㅋㅋㅋㅋㅋ ㅠㅠㅠㅠㅠ

    그래도 여기와서 많은 정보 얻고 갑니다. . .ㅎㅎ

    • 머드초보 2010.05.21 10:44 신고  댓글주소  수정/삭제

      아...일단 직접 다 구현하기 힘드시면 flex에서 제공하는 많은 차트가 있거든요. 그걸 사용하시는게^^
      이쁘고 좋습니다^^

  2. BlogIcon 성주 2010.06.16 12:43 신고  댓글주소  수정/삭제  댓글쓰기

    저는 왜 FlashBuilder에서 Ctrl+Enter하면 줄바꿈이 될까요...

  3. 2012.10.30 00:40  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

 
와~ 컨퍼런스다~ 전 이런곳을 참 좋아하는....-_-(카페활동도 안하고 눈팅만 하는 놈이.....-_-)
게다가 우리회사 근처에서 하네요. 매우 익숙한 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 머드초보

댓글을 달아 주세요