그냥 막 하면 잘 안되더군요. 구글링을 해보니 여러 블로그에서 이런 시도를 한 흔적들이 있었습니다-_- App Engine이 자바를 지원한다고 할 때부터 외국에서는 다양한 시도를 하나봅니다-_- 이번 Spring BlazeDS Integration도 누가 먼저 시도를 한 흔적이 있었네요.

이번 Spring BlazeDS Integration 1.0.1릴리즈 기념과 Spring교육 끝난 기념으로 간만에 삽질해봤습니다.
하지만, messaging 등의 심화적인 것은 못해보구요. 우선 서비스를 가져오는지만 해봤습니다.

삽질환경

- IDE
Eclipse3.5와 구글앱앤진 플러그인 - http://code.google.com/intl/ko-KR/eclipse/docs/download.html
Flex Builder 3.0.2
JDK 1.6.0 U14
- 라이브러리
Spring Framework 2.5.6
BlazeDS 3.2.0.3978
Spring BlazeDS Integration 1.0.1
Jackson 1.2.0
Cglib 2.1.3

1. App Engine 프로젝트 생성
프로젝트 생성하고 나서 라이브러리들을 다 복사합니다. 저는 아래와 같이 라이브러리를 복사했습니다.
기존App Engine lib, spring.jar, spring-webmvc.jar, blazeds.war에 있는 lib, jackson-core-lgpl-1.2.0.jar, jackson-mapper-lgpl-1.2.0.jar, cglib-nodep-2.1_3.jar, org.springframework.flex-1.0.1.RELEASE.jar
그리고, appengine-web.xml파일에 한줄 추가합니다.
[code]<sessions-enabled>true</sessions-enabled>[/code]
이거 필요한건지는 잘 모르겠군요-_-
WEB-INF폴더아래 blazeds.war파일에 들어있는 flex폴더를 복사합니다(*-config.xml의 파일이 있는 것)

2. 서비스 클래스 생성
이제 서비스를 만들어봅시다. 초간단 헬로우서비스를-_-
src폴더에 만들어봅시다. 전 com.mudchobo.springblazedsserver.service패키지에 HelloService클래스를 생성했음!
HelloService.java
[code]package com.mudchobo.springblazedsserver.service;

public class HelloService {

    public String sayHello(String name) {
        return "Hello, " + name;
    }
}[/code]

3. 설정파일 생성 및 설정
스프링관련 설정을 해야해요. web.xml에서 디폴트로 설정된 servlet설정을 지우고 아래를 추가
web.xml
[code]<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/config/*-context.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
   
    <!--  SpringDispatcherServlet -->
    <servlet>
        <servlet-name>flex</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>flex</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>[/code]
flex라는 이름의 서블릿을 만들었으니 스프링 설정파일이름인 flex-servlet.xml을 생성합니다.
flex-servlet.xml
[code]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:flex="http://www.springframework.org/schema/flex"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/flex
        http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
   
    <flex:message-broker />
   
    <flex:remoting-destination ref="helloService"/>
</beans>[/code]
flex라는 네임스페이스를 제공하는데요. <flex:message-broker />이 한줄로 모든 설정이 되어버립니다. M1 삽질했을 때에는 네임스페이스 없어서 bean써주고, 다 설정했던 기억이 나네요. 네임스페이스로 한줄로-_-

remoting-destination태그는 destination을 설정하는 건데, 해당 bean을 ref하면 해당 bean이름으로 destination으로 flex에서 가져올 수 있어요.
그럼 서비스를 설정할 설정파일을 생성해봅시다. configlocation을 /config/*-context.xml을 잡았는데, /config/services-context.xml파일을 만들어봅시다^^
services-context.xml
[code]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="helloService" class="com.mudchobo.springblazedsserver.service.HelloService" />
   
</beans>[/code]
방금 만든 HelloService를 bean으로 설정.

마지막으로 flex/services-config.xml에서 default-channels를 추가합시다.
[code]<services>
        <service-include file-path="remoting-config.xml" />
        <service-include file-path="proxy-config.xml" />
        <service-include file-path="messaging-config.xml" />
        <default-channels>
            <channel ref="my-amf"/>
        </default-channels>       
    </services>[/code]
그리고 이것도 추가해야해요.
[code]<system>
        <manageable>false</manageable>
            ....
       </system>[/code]
이거 추가안하면 앱엔진에서 이런 에러로그를 뿜음-_-
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_messageBrokerDefaultHandlerMapping': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_messageBroker': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanInitializationException: MessageBroker initialization failed; nested exception is java.lang.NoClassDefFoundError: java.lang.management.ManagementFactory is a restricted class. Please see the Google App Engine developer's guide for more details.

관리자 기능이라고 하는 것 같은데, 정확히 뭔지는 잘 모르겠지만, 끄면 잘 됩니다-_-

4. 클라이언트 프로젝트 생성
flex project를 생성할 때 이렇게 생성해주면 편합니다.
Flex Project선택 -> Project name쓰고, Application server type은 J2EE, Create combined Java~~는 체크해제, Use remote object access service는 체크하고, Next.
그 다음 Serverlocation 셋팅을 Root folder는 AppEngine의 war폴더를 지정해주면 되구요.
Root URL은 앱엔진 기본 실행 경로인 http://localhost:8080하면 되구요. Context root는 /로 지정하면 됩니다.
그러면 디버그나 Run시에 localhost:8080/프로젝트명/프로젝트명.html로 실행이 돼요.
코드는
SpringBlazeDSClient.mxml
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">

    <mx:RemoteObject id="srv" destination="helloService" />
    <mx:TextInput id="inputName" />
    <mx:Button label="전송" id="btnConfirm" click="srv.sayHello(inputName.text)" />
    <mx:Label id="labelResult" text="{srv.sayHello.lastResult}" />
   
</mx:Application>[/code]
이 코드 너무 활용하는 것 같아-_- 암튼 destination은 helloService로 설정했기 때문에 이걸로 지정하면 됩니다.

5. 이제 배포 및 실행
이제 swf파일도 appengine프로젝트에 생성하고, AppEngine을 배포하고 실행하면 또다른 에러를 보실 수 있습니다-_-
[RPC Fault faultString="Detected duplicate HTTP-based FlexSessions, generally due to the remote host disabling session cookies. Session cookies must be enabled to manage the client connection correctly." faultCode="Server.Processing.DuplicateSessionDetected" faultDetail="null"]
와....미쳐버립니다. 이건 뭔가....검색해보니 앱엔진이 여러 서블릿배포할 때 1개의 클라이언트 정보를 동일하게 배포를 해서 어쩌구 라고 번역기를 돌리니 써있네요-_- 이걸 픽스한 jar파일이 돌아다닙니다-_-
기존 flex-messaging-core.jar파일을 위 파일로 교체해주면 되더군요.

이제 실행하면 잘 될겁니다.
실행주소입니다.
http://mudchobo1.appspot.com/SpringBlazeDSClient/SpringBlazeDSClient.html


사용자 삽입 이미지

스크린샷.....

messaging이나 security적용한 것도 한번 해봐야겠네요.

참고사이트
http://www.adobe.com/jp/devnet/flex/articles/google_app_eng_w_beazeds_p2.html
http://martinzoldano.blogspot.com/2009/04/appengine-adobe-blazeds-fix.html
 
Posted by 머드초보
,
 
음... air.swf를 이용하면 설치된 애플리케이션을 실행할 수 있으며, Adobe AIR가 설치가 되어있지 않으면 설치도 할 수 있는 기능이 있는 SWF입니다.
http://airdownload.adobe.com/air/browserapi/air.swf

음....문제점이 한쪽에서 air.swf를 로딩하고 나서 getApplicationVersion(애플리케이션이 설치되었는지 확인하는 함수)을 하고 있습니다. 그런데 다른 한쪽에서 air.swf를 로딩해서 getStatus(air가 설치되어있는지 상태값 받기)를 하면 air가 설치 되어있음에도 불구하고 available(AIR설치는 안되어있으나 설치가 가능함)을 받는 경우가 발생합니다.

그래서 더 찾아보니 우야꼬님의 글을 보다가 알았는데요. air.swf 없이도 AIR애플리케이션을 설치하고 실행할 수 있다고 한다는 글을 보았습니다. 그래서 이 현상이 버그인지 확인해보려고 직접 구현하려고 했지만........-_-
생각보다 조낸 어렵네요-_- 우야꼬님께서 ProductManager클래스를 이용해야 한다는 힌트만 주셔서 ㅠ
ProductManger는 뭐하는 놈인지 검색해도 잘 안나와요-_- 어디서 뜯어봐야하는지ㅠ 근데 이놈을 이용해서 AIR애플리케이션을 리스타트하는 프로그램을 만들 수도 있더라구요.
http://www.hufkens.net/2009/03/how-to-restart-an-air-application-from-code/
productmanager가 air프로그램 실행하고 그러는 것 같긴 한데, launch라는 함수가 있는데 이것에 대한 커맨드라인 명령어 같은 게 설명이 잘 안나왔네요 ㅠ

암튼, air.swf를 로딩해서 getApplicationVersion을 무한 반복하는 애플리케이션을 만들고, 그걸 2개를 띄워볼께요-_-
AirService.as
[code]package
{
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
   
    public class AirService extends EventDispatcher
    {
        private var _loader:Loader;
        public var _service:Object;
       
        public function AirService()
        {
            _loader = new Loader();
            var context:LoaderContext = new LoaderContext();
            context.applicationDomain = ApplicationDomain.currentDomain;
            _loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
            var swf:String = "http://airdownload.adobe.com/air/browserapi/air.swf";
            var request:URLRequest = new URLRequest(swf);
            _loader.load(request, context);
        }
       
        private function initHandler(event:Event):void
        {
            _service = _loader.content;
            dispatchEvent(new Event(Event.COMPLETE));
        }
       
        public function getStatus():String {
            return _service.getStatus();
        }
       
        public function getApplicationVersion(applicationId:String, publisherId:String, callback:Function):void
        {
            _service.getApplicationVersion(applicationId, publisherId, callback);
        }
       
        public function installApplication(url:String, runtimeVersion:String, parameters:Array = null):void
         {
            _service.installApplication(url, runtimeVersion, parameters);        
         }
        
         public function launchApplication(applicationId:String, publisherId:String, parameters:Array = null):void
         {
             _service.launchApplication(applicationId, publisherId, parameters);
         }
    }
}[/code]
Main.mxml
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="vertical" verticalAlign="middle"
    applicationComplete="applicationCompleteHandler()" width="100%" height="100%">
   
    <mx:Script>
        <![CDATA[
            import adobe.utils.ProductManager;
           
            private var airService:AirService;
           
            private function applicationCompleteHandler():void
            {
                airService = new AirService();
                airService.addEventListener(Event.COMPLETE, completeHandler);
            }
           
            private function completeHandler(event:Event):void
            {
                trace(airService.getStatus());
                ta.text += airService.getStatus() + "\n";
                if (airService.getStatus() == "installed")
                {
                    airService.getApplicationVersion("AirApplication",
                        "2D0F512A27635B8D26E3FE2622F4AAEDDA9D3CFC.1",
                        applicationVersion);
                }
            }
           
            private function applicationVersion(version:String):void
            {
                trace("version=" + version + ", status = " + airService.getStatus());
                ta.text += "version=" + version + ", status = " + airService.getStatus() + "\n";
                ta.verticalScrollPosition = ta.maxVerticalScrollPosition;
                airService.getApplicationVersion("AirApplication",
                    "2D0F512A27635B8D26E3FE2622F4AAEDDA9D3CFC.1",
                    applicationVersion);
            }
           
        ]]>
    </mx:Script>
    <mx:TextArea id="ta" height="100%" width="50%"/>
</mx:Application>[/code]
두개를 띄워보면
사용자 삽입 이미지
한놈은 available을 받습니다-_- 왜그러지-_-
대체 getApplicationVersion에서 어떤 일을 하는지 궁금해지기 시작했습니다.

그래서 대처 방법으로는....-_- getApplicationVersion을 동시에 하지 않으면 돼요-_- 사용자가 클릭할 때 하면 되는데, 이렇게 되면 launchApplication을 할 때에 또 클릭해줘야 해요. launchApplication은 사용자 액션에 의해서만 되더라구요.

PS. 혹시......이 글을 보게 되시는 분들중에서.....AIR애플리케이션을 launch하는 사이트를 목격 하시면 댓글 달아주세요ㅠ

 
Posted by 머드초보
,
 
입을 옷이 없었는데 잘 됐습니다. 하지만.......반팔이군요-_-; 날씨가 추워졌는데-_-;

뭐 어쨌든, 갔다왔습니다. 평일인데도 많은 분들이 오셨더라구요. 저는 버스가 얼마나 걸리는지 몰라서 빨리나왔는데 버스가 의외로 빨리 도착하는 바람에 12시20분쯤 도착했습니다. 더욱 신기했던 것은.......교보타워 엘리베이터......완전 빠르네요-_-; 예전에 포스코 엘리베이터도 완전 빠르던데....엘리베이터가 빠른 게 부러운 이유는 우리회사 있는 엘리베이터는......거북이처럼 느리기 때문이죠. 점심시간에 재수없으면 10분걸려서 올라가야하는 일이 생기기도 하죠 ㅠ 얘기가 갑자기 삼천포로 빠졌습니다만-_-;

23층에 올라갔습니다. 와우 핸드폰줄입니다. 하나 더 달라고 하고 싶었지만, 소심해서-_-;

사용자 삽입 이미지

제가 1등인줄알고 혼잣말로 "1등인가......" 라고 하니 도우미분께서 "안에 몇 분 와계세요." 그러시더라구요. 아....6등입니다-_-; 설문지를 작성하면 티셔츠를 준다고 하더군요. 사실 강의평도 안하고 그냥 작성해서 내고 싶었습니다만, 끝까지 기다렸습니다.
사용자 삽입 이미지

6등으로 온 증거-_-; 오른쪽에 한 분 더 계셨습니다-_-;



사람들이 막 모이더니 어느새 자리가 꽉 찼더군요. 우와....자리가 없어서 뒤에 서서 보신 분들도 계시더라구요.

우선 영상을 보여줬는데요. Adobe AIR 주제를 가지고, 투어를 하며 사람들에게 홍보를 하는 영상을 보여줬는데 편집이 예술이고 영상미가 꽤 있어보였습니다. 역시 외국은 다르군요. 매우 멋졌습니다.

시작은 어도비사의 어떤 전무님이 말씀으로 시작하셨습니다. 이 분께서 하신 말씀은 최근에 나온 CS4를 자랑 하는 제품 자랑으로 시작했습니다. RIA기술로 구현한 프로젝트가 성공했다는 얘기를 한 듯 합니다 ^^

이제 마이크 챔버스랑 라이언스트어트의 강연이 시작되었습니다.
꽤나 준비를 많이 하신 것 같습니다. 강의 진행방식은 마이크와 라이언이 말을 하면, 통역하시는 분이 통역으로 얘기를 해줍니다. 예전에 JCO에서는 외국인 강연은......그냥 외국인 혼자서 얘기하는 강연을 들은 적이 있었습니다만, 이렇게 Adobe에서는 동시 통역을 준비해줬군요. 대단합니다 ^^

우선 이분들은 새로 나올 신기술에 대해서 소개를 해줬는데요. 저는 곧 나오는 것들인 줄 알았습니다만-_-; 2009월 하반기가 예정이라는 군요? 1년넘게 남았다는 얘기죠 ^^

암튼, 나중에 나올 기술등에 대해서 소개를 해줬는데요. Flash Player 10, AIR 1.5, Flex4를 얘기해줬습니다. 외국분들은 PPT를 잘 만드는 것 같아요. 딱 핵심 포인트만 포인트에 적어 놓는데, 파워포인트의 정석이죠. 외국 ppt를 보면 정말 잘 지키는 것 같아요. 국내에 글씨만 무성히 많은 PPT가 참 많은데, 그건 발표하는 동안, 발표자의 말을 들으라는 건지, 저걸 다 읽으라는 건지 그런 경우가 참 많았거든요. 또 자꾸 얘기가 샙니다만-_-;

암튼, 3D를 사용한 어플리케이션을 많이 보여주셨는데, 여기저기서 환호성이 터져나왔네요. 저도 신기했구요^^ z축을 이용해서 구현이 가능한 것 같아요. Flex Store라는 예제를 보여주셨는데, 핸드폰이 막 쓰리디로 정렬되면서 멋진 장면이 연출 되더군요. 저는 언제쯤 그런 걸 구현할까요-_-;

근데, 일본에서 발표하고 왔는지, 일본어로 된 데이터로 Flash Player10 Text 기능을 보여주더라구요. 일본에 역시 먼저 갔다왔군요. 일본에 대해서 참 부러운 건 JDK를 일본어를 공식 지원한다는것-_-; 그 외에도 Flex Builder를 보면 일본어를 공식 지원해요-_-; 우리나라도 공식 지원해줘요! MS는 한국어판 다 내는데 ^^ Adobe도 내주세욤!

AIR1.5부터는 리눅스를 공식 지원한다고 하는군요. 예전에 리눅스에서 AIR를 한 번 돌려봤는데 잘 돌아갔었습니다. 이제 대표적인 OS는 다 지원하는군요. 멋집니다. 이제 크로스플랫폼이라고 제대로 불리울 수 있겠군요^^

좀 있다 마이클 챔버스가 나왔습니다.
이 분이 얘기하신 것 중에...Vectors라는 자료형이 나왔습니다. 이거 왠지 java의 Vector인가...라는 생각이 들었습니다. Array랑 비슷한 것 같은데요. Vectors도 보니까 Array처럼 쓰지만, 이 놈은 하나의 자료형으로 사용할 수 있는 것 같습니다. 자바에서 제너릭(Generic)문법처럼 쓰더라구요.
[code]var v:Vectors.<Number>
[/code]
얼핏 보고 왔는데.....저런식으로 쓰는 것 같았어요. 우선 Array처럼 v[i] 형태로 사용하구요. 성능차이를 보여줬는데, Vectors가 훨씬 빨랐어요. 효율문제로 저걸 만들었나봐요. 저도 잘 모르겠네요^^

그리고, Flash Player10에서의 개발자들에게 편해진 점들을 소개해주셨는데요. 성능문제로 Drawing APIs에서 여러번 함수를 콜해야하는 것을 단 한번콜하게 하는 것, Local File Access로 전 버전보다 손쉽게 파일 읽고 쓸 수 있구요, 이번에 Pixel Bender라는 것을 지원하게 되었는데요. 아직 감은 안잡힙니다만, 포토샵의 필터같습니다.
이미지나, 동영상 등에 스캔라인 필터를 줄 수 있습니다. 사운드도 된다고 하네요. 코드를 보니, output, input 같은 게 존재하고, 언어는 왠지 as3랑 달라보였습니다만-_-; 나중에 김춘경님이 Pixel Bender에 대해서 발표준비를 하셨더라구요. 우와 이걸 어떻게 알고 준비하셨는지 대단합니다 ^^

아....그 다음 제가 관심을 가지고 있는 것이 Flex4인데, 이거에 대해서도 간략히 설명했는데요. FXG라는 것을 지원한다고 합니다. FXG는 xml기반의 그래픽 인터체인지 포맷인데요. 그래픽을 xml형태로 나타낼 수 있더라구요. MS의 XAML과 비슷한 듯 합니다-_-; 누가따라한거지-_-; 이것으로 디자이너와 개발자를 분리하겠다는 것 같습니다. MS세미나에서도 같은 얘기를 했었는데.....
Flex4에서 스킨입히는 게 더 손쉬워졌다고 하네요. 그리고, state가 향상되었다고 하는데, 예전에 state코드를 보면 매우 지저분하게 생성되는 경우가 많은데, 마이크가 직접 3와 4의 차이점을 보여줬는데, 매우 간결하게 state코드를 쓸 수 있는 것 같습니다.

http://www.tostring.org/에 대해서도 언급했는데요. 열이아빠님이 열심히 번역하신 게 보니까 이거더라구요^^ 열이아빠님 대단합니다 ^^

이제 라이언이 Thermo(써모)를 맛보기로 보여주시기 위해 나왔습니다. 이건 디자이너를 위한 툴이라고 설명을 하는군요. 정말 멋진 툴입니다. 디자이너들이 디자인 후 버튼으로 변경하면 버튼이 되버립니다. 아직 초기단계라서 언제 나올지는 미지수군요 ^^ 보여주면서도 에러가 발생했는지 잘 안되는 부분도 있는 듯 했습니다만-_-;

암튼, 이 외국에서 오신 이 두분의 멋진 발표 재미있었습니다. 신기술은 언제나 즐겁죠. 새로운 정보를 많이 알게 된 것 같아서 즐거웠습니다 ^^

커피랑 도넛타임이였습니다. 배가 고팠는데 참 잘 되었습니다-_-; 도넛을 한 개 먹으니.....배가 고파서 하나 더 먹으려고 했는데, 다 가져가버렸다는....ㅠㅠ

이제 발표자들이 발표할 시간입니다. 아까 마이크와 라이언 발표끝나고 간 사람들이 많더군요. 그 두분을 보려고 오신 분들이 꽤 된 것 같았습니다. 저는 끝까지 자리를.....(티셔츠를......-_-)

오창훈님이 AIR로 만드는 메쉬업 애플리케이션 이야기라는 주제로 발표하셨는데, 조금 뭔가 부족했습니다. 그냥 몇가지 메쉬업을 소개하고 끝난 것 같습니다.

그 다음 이희덕님이 AIR로 만든 모두의 브라우저라는 주제로 발표하셨습니다. 재미있게 발표하시는 것 같습니다. AIR로 크롬형태로 구현하려고 한 것 같습니다(크롬의 스피드는 AIR로 구현하기 힘들겠죠^^). 굉장히 인상깊었던 것은 RIA는 ???????다 라는 것의 빈칸을 핸드폰 문자로 보내면 그걸가지고 추첨을 하는 프로그램을 만들었더라구요^^ 대단합니다 ^^ 직접 준비해놓은 상품을 줬습니다 ^^ 준비를 많이 하신 것 같아요^^

마지막으로 김춘경님이 Pixel Bender소개와 사용이라는 주제로 발표하셨는데, 너무 내용이 어려웠습니다-_-; 뭔소리인지 하나도 몰르겠습니다. 암튼 FlashPlayer10의 새로 추가된 기능인 것 같구요. 마이크챔버스도 잠깐 언급했는데, Photoshop이나 Premiere에서 사용하는 필터기능 같습니다. 암튼 신기했습니다 ^^

오늘 보고 나서 느낀 점은 어서 내공을 쌓아야겠다는 생각이 드는군요. 저도 좋은 주제가 생기면 발표하고 싶습니다만-_-; 능력이 될런지-_-; 내년에 나올 신기술을 미리 볼 수 있어서 좋았구요. 다음에 3rd행사도 어서 빨리 했으면 좋겠네요 ^^

아래는 티셔츠입니다. 뒤에는 air주소가 적혀있네요 ^^.
사용자 삽입 이미지
사용자 삽입 이미지

 
Posted by 머드초보
,
 
우선 6장까지 따라해봤습니다.
내용은......매우 그레이트합니다!!!
놀랍습니다 ^^

이 실전 트레이닝 북을 6장까지 따라한 결과 이 책에 나온 내용 대로 그대로 코딩을 하면서 플렉스의 기능들을 익히는 방식으로 진행합니다. 그래서 어떤 식료품 구매 사이트를 만드는 것 같은데, 아직 좀 더 해봐야할 듯 합니다.
오직 6장까지 따라했을 뿐인데, 제가 모르는 내용이 수두룩 했습니다 ㅠ
사용자 삽입 이미지

이런 기능이 있었구나 하는 부분이 매우 많았고, 디자인모드에서 state가 편집이 가능한지도 몰랐습니다 ㅠ
이런 손쉬운 방법으로 state를 편집하는 기능을 알게 되어서 매우 기쁩니다 ㅠ

XML 컨트롤 하는 부분이 세세한 부분까지 잘 나와있으며, 많은 사람들이 헷깔려하는 ArrayCollection에 대해서도 많은 예제와 설명으로 이해를 쉽게 도왔습니다.

그리고 이 책의 번역이 이상하다고 하는 사람들이 많은데, 물론 번역이 잘 되어야 책의 원문의 내용을 살리겠지만, 이 책의 내용은 번역이 좀 어색하긴 하지만 의미전달의 미스가 있는 부분은 많지 않았습니다. 물론, 아직 책을 끝까지 읽지는 않았습니다만, 6장까지 읽으면서 이해는 잘 되었습니다. 하지만, 영어 독해능력이 뛰어나신 분들은 원서를 권해드립니다.
사용자 삽입 이미지

문제의 그부분? 스티커로 처리해놨네요^^


번역은 외국 정서에 맞게 사용한 언어를 한국 정서에 맞게 의역을 해야하는 작업입니다. 그래서 그 의역이 참 힘들기 때문에 번역을 하면서 어색한 부분이 많고 그런 것 같습니다. 대부분의 원서가 그런 책이 좀 많았습니다. 예전에 켄트백의 구현패턴이라는 책도 매우 훌륭한 책이라고 하는데, 번역이 좀 이상한 관계로 매우 읽기 힘들었던 책이였습니다. 이런 이론위주의 책이라면 정확한 번역이 필요로 했겠지만, 지금 이 플렉스3 실전 트레이닝북은 거의 대부분이 실습인 책입니다. 책 내용도 그냥 여기다가 이렇게 코딩하라 이런 말이 거의 대부분이고, 중간중간 설명이 좀 있기는 하지만 이해할 수 있는 수준이었습니다 ^^

그래서 구입을 좀 꺼려하시는 분은 안심하고 구매하셔도 좋습니다 ^^ 그 위키북스에서도 잘못된 내용을 검토하여 재판을 내놓을 생각이 있는 듯합니다. 지금 구매하시는 게 좀 그러시면 그 때 구입하셔도 될 듯 합니다.

PS. 전 절대....위키북스 알바가 아닙니다-_-; 책을 선물로 받았을 뿐?-_-;
사용자 삽입 이미지

감사합니다 ^^

사용자 삽입 이미지

채....책이....OTL...벌써 이렇게 찢어졌어요 ㅠ 너무 열심히 공부해서(설마-_-;)



 
Posted by 머드초보
,
 
어서 알송보다 더 좋은 AIR기반의 Desktop용 mp3플레이어가 나왔으면 좋겠어요!
AIR로 제작한다면 꽤나 멋진 플레이어가 나올 듯 한데 ^^

ADOBE사의 제품은 예전부터 참 좋아했었어요-_-;
Photoshop의 합성은 정말 충격적이었어요!
예전에 고등학교 친구녀석이 고등학교 때 소풍단체사진을 스캔을 떠서 친구 얼굴을 오려서 주유소습격사건 포스터에 합성했던 기억이 나요! 그 녀석 합성의 달인이였는데-_-;

그리고 Adobe Reader는 뷰어가 이렇게 이쁘게 보여질 수 있다는 것을 보여준 좋은 예였죠^^

게다가 인터넷 서핑하다가 안 볼 수가 없는 Flash!!! (사실 이건 Macromedia사꺼였지만^^)

그리고 깔끔한 제품의 로고들이 참 좋아요. 전혀 복잡해보이지 않는 로고! ^^


사용자 삽입 이미지

Fx만으로도 깔끔하면서도 멋진 로고를 연출해낸-_-; 나만 멋지게 보이는건가-_-;
어쨌든 좋아요 ^^

그런데 다른 것들은 대부분 Beta1, Beta2, Beta3, Release Candidate1, Release Candidate 2, 정식~ 이런순으로 가는데 이건뭐 Beta3에서 바로 출시해버리네요-_-;

이번에는 Desktop Application을 쉽게 제작할 수 있는 AIR도 포함되어 있어서 더욱 멋지네요.
웹 기술로 Desktop Application을 제작한다면 정말 손쉽게 웹에 관련된 것을 연동할 수 있고, 여러가지 장점들이 있겠죠 ^^ 하지만, 그에 비해서 단점도 좀 있는 듯 합니다. C/C++, JAVA보다 약간 제한적이겠죠. Action Script가 아무리 강력하다지만, 아직은 쟤네덜 보단 약한 것 같습니다. 그래서 ADOBE에서 Action Script 4를 낸다고 한 것을 열이아빠님 블로그에서 본 듯 하네요.

그리고 RIA시장에서는 MS가 가세를 했죠. SilverLights라는 놈을 내놨는데 이 놈은 정말 막강한 놈이라고 하네요. .NET 라이브러리를 서버단이 아닌 클라이언트단에서도 사용할 수 있게 하는.... ADOBE에게 빼앗긴 웹시장을 차지하려고 하는 움직임인 듯하네요.

예전에 MS에서 주최하는 실버라이트세미나를 갔었는데 아직 Flash보다는 약하지만, 점점 버전업을 하고 있는 듯 합니다. 샘플을 봤을 때에 참 놀라웠습니다. 게다가 WPF라고 하는 놈은 웹에서 사용할 수도 있는데 XBAP이라고 하더군요. 이놈은 3D가속까지 지원하는 미친놈이였습니다.

MS가 이번에 야후도 먹을라고 하고 웹시장을 예측하는 걸까요?-_-; 완전 다 먹으려고하네-_-;
어쨌든 이야기가 좀 샜습니다만, AIR로 개발된 유틸리티들이 많이 나왔으면 하네요 ^^
 
Posted by 머드초보
,