어서 알송보다 더 좋은 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 머드초보
,
 
몰랐는데 AIR에서도 되네요-_-;

우선 http://mudchobo.tomeii.com/tt/211 이거랑
http://mudchobo.tomeii.com/tt/214 이거를 참조하셔서 새로운 blazeds.war를 만들어서 톰캣에 띄워야합니다.

New Project로 만들고, ProjectName을 AirBlazedsTest라고 합시다.
Desktop application을 선택하고 J2EE를 선택하고, 넥스트를 누릅니다 ^^

Server location은 위에 따라했다면 그대로 되어 있을꺼에요^^
Finish를 클릭해줍시다.

AIR에서는 좀 다르게 몇줄을 더 추가해야하는데요.

[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
   layout="absolute">
 <mx:Script> 
  <![CDATA[
   import mx.messaging.ChannelSet;
   import mx.messaging.channels.AMFChannel;  
   import mx.rpc.events.ResultEvent;  
   import mx.rpc.events.FaultEvent;  
   import mx.rpc.remoting.RemoteObject;  
   import mx.controls.Alert;     
   private var startTime:Number;      
   private function resultHandler(event:ResultEvent):void{       
    dg.dataProvider = event.result;  
   }     
   
   private function faultHandler(event:FaultEvent):void{       
    mx.controls.Alert.show("실패 메세지 : " + event.fault.message);  
   }     
   
   private function retrieve():void  {  
    var amfChannel:AMFChannel = new AMFChannel(
     "my-amf", "http://localhost:8080/blazeds/messagebroker/amf");
    var channelSet:ChannelSet = new ChannelSet();
    channelSet.addChannel(amfChannel);
   
    var srv:mx.rpc.remoting.RemoteObject = new RemoteObject();  
    srv.channelSet = channelSet;
    srv.destination = "member";      
    startTime = new Date().time;  
    srv.getElements();       
    srv.addEventListener("result",resultHandler);  
    srv.addEventListener("fault",faultHandler);  
   }    
   
   private function logResult():void  {  
    if (startTime > 0)   {   
     log.text = "" + (new Date().time - startTime) + " milliseconds"; 
    } 
   }   
  ]]>
 </mx:Script>  
 
 <mx:Panel title="AS를 이용한 RemoteObject예" width="100%" height="100%"> 
  <mx:DataGrid id="dg" width="100%" height="100%"                 
   updateComplete="logResult()"/>  
  <mx:ControlBar>   
   <mx:Button label="데이터 가져오기" click="retrieve()"/>  
   <mx:Label id="log"/>  
  </mx:ControlBar>
 </mx:Panel>
</mx:WindowedApplication>
[/code]

사용자 삽입 이미지


AIR에서도 돼요-_-; 레몬펜그은부분만 추가를 해주시면 돼요 ^^
 
Posted by 머드초보
,
 
오늘도 삽집을 하고 있는데요.

AIR에서는 File이라는 클래스를 사용할 수 있더군요.
File클래스를 자세히 보면 FileReference클래스를 상속받고 있어요.
기존에 Flash나 Flex Application에서는 보안상 문제로 파일을 Browse()를 통해서 선택이 되어도 전체경로는 나오지 않습니다. FileReference속성에는 name이라는 속성이 있는데 읽기 전용이며 Browse()통해 파일이 선택이 되면 name속성에는 파일 이름만 들어갑니다.
(어느 플래시카페를 보니까 자바스크립트로 가져오는 법을 올려놨더라구요^^)

하지만, File이라는 클래스는 nativePath라는 속성을 제공하는데 이건 전체경로까지 다나옵니다.
단, AIR에서만 됩니다-_-;

저도 전체 경로가 필요해서 찾고 있었는데 이렇더라구요 ^^
AIR에서는 FileReference를 사용하지 말고, File을 사용하세요.
그대로 상속받고 있기 때문에 다 사용할 수 있구요.
기능도 더 추가된 것 같은데-_-; 아...로컬에 있는 파일을 컨트롤 할 수 있을 껍니다 ^^

뭐 결론은 AIR에서는 File을 쓰고, Flex나 Flash에서는 FileReference(뭐 File클래스를 여기서 사용할 수 없습니다^^)를 사용해요 ^^

혹시 AIR로 뭔가 하려는 분중에 FileReference에서 전체경로를 찾고 계신 분이 있을 것 같아서 올려요^^
 
Posted by 머드초보
,
 

이제 소스를 보도록 합시다.

아....근데 다른 언어를 이용해서 업로더를 구현해보신 분 계신가요? 플렉스에서는 이상하게 제목을 한글로 입력해서 업로드를 해버리면 업로드가 안되더군요.
MD5함수를 수정하면 가능합니다. ^^
이 부분은 좀 더 삽질을 해봐야할 부분인 것 같군요.
우선 영어는 뭐 잘 되니까-_-;

[code]
<mx:Script>
  <![CDATA[
   import com.adobe.webapis.flickr.methodgroups.Upload;
   import mx.controls.Alert;
   import flash.net.navigateToURL;
   import com.adobe.webapis.flickr.AuthPerm;
   import com.adobe.webapis.flickr.events.FlickrResultEvent;
   import com.adobe.webapis.flickr.methodgroups.Auth;
   import com.adobe.webapis.flickr.FlickrService;
 
   public var apikey:String = "해당API키";
   public var secretkey:String = "해당비밀키";
   public var flickrService:FlickrService;
   public var frobResult:FlickrResultEvent;
   public var frob:String = new String();
   public var token:String = new String();
   public var fileRef:FileReference;
   
   public function Authentication():void {
    flickrService = new FlickrService(apikey);
    flickrService.secret = secretkey;
    flickrService.addEventListener(
        FlickrResultEvent.AUTH_GET_FROB, getFrobResponse);
    flickrService.auth.getFrob();
   }
   
   public function getFrobResponse(event:FlickrResultEvent):void {
    if (event.success) {
     frob = String(event.data.frob);
     var auth_url:String = flickrService.getLoginURL(frob, AuthPerm.WRITE);
     navigateToURL(new URLRequest(auth_url), "_blank");
     Alert.show( "인증하기위한 브라우저가 뜰꺼에요."
        + "로그인한다음에 OK버튼을 누르세요^^",
        "인증",
        Alert.OK | Alert.CANCEL,
        null,
        onCloseAuthWindow );
    }
   }
   
   private function onCloseAuthWindow( event:* ):void {
    if ( event.detail == Alert.OK ) {
     flickrService.addEventListener(
        FlickrResultEvent.AUTH_GET_TOKEN, getTokenResponse );
     flickrService.auth.getToken( frob );
    }
   }

   private function getTokenResponse( event:FlickrResultEvent ):void {
    if ( event.success ) {
     token = event.data.auth.token;
     flickrService.token = token;
    } else {
     Alert.show("인증에 실패했습니다.");
    }
   }
   
   public function findFile():void {
    if (token == "") {
     Alert.show("인증부터 하세요!");
     return;
    }
    fileRef = new FileReference();
   
    try {
        fileRef.addEventListener(Event.SELECT, selectHandler);
        fileRef.addEventListener(Event.COMPLETE, completeHandler);
        fileRef.addEventListener(
           DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData);
        var success:Boolean = fileRef.browse();
       } catch (error:Error) {
           trace("Unable to browse for files.");
       }
   }
   
   public function selectHandler(event:Event):void {
    var uploader:Upload = new Upload(flickrService);
    uploader.upload(fileRef);
   }
   
   public function checkTokenResponse(event:FlickrResultEvent):void {
    Alert.show(event.data.auth.token);
   }
   
   public function completeHandler(event:Event):void {
    trace("업로드 완료");
   }
   
   public function  onUploadCompleteData(event:DataEvent):void {
    Alert.show(event.data);
   }
  ]]>
 </mx:Script>
 
 <mx:Button label="인증" click="Authentication();"/>
 <mx:Button label="파일업로드" click="findFile();" />
[/code]

오.....간단합니다.
아... apikey secretkey 에는 각각 발급받은 키를 넣어주세요 ^^
인증이라는 버튼이 있는데 누르게 되면 Authentication이라는 메소드를 호출합니다.
FlickrService라는 클래스가 있는데 apikey를 인자로 받아서 생성합니다.
그러면 이놈으로 인증이 필요없는 API를 다 호출할 수 있습니다 ^^
flickrService.auth.getFrob(); 이런식으로 Frob을 얻어오고!
navigateToURL로 브라우저를 띄워서 인증url로 이동을 시킨 후 로그인을 하게 되면
flickrService.auth.getToken( frob ); 으로 인해 토큰을 가져오게 됩니다.
토큰만 가져오면 다 끝납니다-_-; 이걸로 권한에 관한 건 다할 수 있어요 ^^

이거뭐 플렉스로 해도 될 것 같아요. 안해봤는데 될 것 같아요-_-;

파일업로드 버튼을 클릭하면 파일선택창이 뜨는데 이미지사진 아무거나 선택해서 업로드하면 돼요 ^^
(참고로 이미지파일도 한글이면 안돼요. 영어로 바꿔서 선택하세요 ^^)
FileReference 요놈도 설명해야하는 나중에-_-;
되는 거 증명동영샷~-_-; (실은....좀 심심해서-_-)


 
Posted by 머드초보
,
 

오....삽질 끝에 해냈습니다--;
라이브러리 다 제공하는데 삽질했습니다-_-;
제목, 내용, 태그, 등등 입력하는 것 따윈 없습니다--;
오로지 이미만 선택해서 업로드해줍니다 ^^
테스트환경은 Flex Builder 3 Beta 3에서 했습니다.

우선 Flickr Open API를 사용하기 위해서는 KEY를 발급받아야 돼요 ^^
http://www.flickr.com/services/api/keys/apply/
여기를 들어가서 로그인 하시고 키를 신청하면 됩니다.
키 하고 비밀 2개를 발급받게 됩니다. 잘 기억해두세요 ^^


http://code.google.com/p/as3flickrlib/
여기가면 as3용 플리커라이브러리가 있습니다.
근데 이거 쓰면 업로드메소드가 주석처리 되어있더군요.
저 라이브러리가 릴리즈되었을 때에는 FlashPlayer가 8.5였던 것 같은데 그때는 업로드가 안되었던 것 같습니다.
9.0되면서 업로드가 되는 것 같습니다.
업로드부분을 조금 수정했습니다.

invalid-file

한글파일명도 돼요 ^^



이거하고 어도비에서 만든거 하나 더 필요합니다.
http://code.google.com/p/as3corelib/
저기가면 여러가지 유용한 함수를 모아둔 lib인 것 같아요. 저게 필요해요!

그럼 프로젝트를 만들어봅시다.
File -> New -> Flex Project 선택 후 Desktop application에 체크하시고,
ProjectName을 FlickrUploader라고 합시다. Finish를 클릭하면 프로젝트가 만들어 집니다.
라이브러리를 추가해야하는데요. lib폴더가 있습니다.
거기다가 2개의 SWC파일을 복사해주세요. flickr.swc, corelib.swc

프로그램에서 인증을 받는 코드가 들어가는데요.
인증권한은 read, write, delete 3가지 권한이 있는 것 같아요.
미친 플리커가 API문서를 번역기 돌렸는지 이상하게 번역해놨어요-_-;
http://www.flickr.com/services/api/auth.howto.desktop.html
AIR는 데스크탑 애플리케이션이니까 데스크탑용 인증방법을 보도록합시다 ^^

인증절차를 아주 간략하게 설명하자면 이렇습니다.
Frob요청 -> Frob과요청권한을 이용해 로그인페이지로 이동 -> 사용자는 로그인 후 애플리케이션으로 돌아옴.
-> 해당애플리케이션은 로그인으로 인해 token을 얻음. -> 이토큰으로 인증이 필요한 OPEN API를 호출할 수 있음 ^^ 끝!

간단합니다. 소스는 다음 시간에!-_-;


 
Posted by 머드초보
,