그......sound객체를 이용해서 하는 것이라니라 직접 바이트로 읽어서-_-; 하는 법이 있더라구요.
우선 ID3v1태그는 음악내용 맨 뒤에 있습니다. 그래서 추출하기는 쉽습니다.

http://cafe.naver.com/flexcomponent.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=10087
flexcomponent에서 혀니님께서 작성하신 글입니다.

그 다음 ID3v2태그는 맨 앞에 있습니다. 또한 이것을 추출하는 방법이 만만치 않습니다-_-;
왜냐하면 이건 뭐 길이도 가변적이고, 태그가 복잡합니다-_-;
그래서 태그를 공부하는 것보다 누가 만들어 놓은 것을 찾는 게 더 빠를 듯하여.....-_-;
구글신님께 부탁드리니 잘 찾아주셨습니다 ^^

http://blog.benstucki.net/?id=3

이것을 그대로 사용하시면 한글이 깨집니다.
사용자 삽입 이미지

저 위에 소스를 다운 받아서 첫번째 ID3v1에서 사용한 방법을 사용합니다.
ID3Reader.as파일에 readTextFrame이라는 함수가 있는데요.
이게 텍스트를 읽어올 때 사용하는 함수인 것 같습니다.
[code]
//obj.text = bytes.readUTFBytes(size-1);
obj.text = bytes.readMultiByte(size-1, "EUC-KR");
[/code]
요렇게 바꿔줍니다-_-;
그런 다음에 실행하면 한글이 잘 나옵니다.
사용자 삽입 이미지
하지만........-_-;
기존에 Actionscript에서 제공하는 Sound클래스에서 추출하는 ID3에서 잘나오는 한글(즉 UTF-8로 인코딩 된 것)은 여기서 읽으면 잘 안나옵니다-_-; 이거 추출하는 프로그램 만드신 분이 잘못 만든건지 잘 모르겠는데요. 확인해봐야할 것 같네요 ㅠ

사용자 삽입 이미지
헉...-_-; 인코딩을 unicode로 바꾸니까 잘 나오네요. 기존에 Actionscript에서 잘 나오는 것은 unicode로 되어있어서 그런거였나요? ㅠ 더 확인해봐야겠습니다 ㅠ
이거 말고, 요아래 것으로 하면 잘 되네요.

ID3v2추출하는 다른 방법입니다.
http://mudchobo.tomeii.com/tt/357
 
Posted by 머드초보
,
 
필터링 해야할 일이 생겨서 해봤습니다.

File클래스에는 list()메소드가 2개가 있습니다.
하나는 해당 디렉토리에서 모든 파일 리스트를 리턴하는 메소드입니다.
다른 하나는 필터링을 할 수 있게 FilenameFilter를 파라메터로 받는 list메소드가 있습니다.

두번째 것을 이용해서 원하는 파일을 필터링 할 수 있습니다.

FilenameFilter는 Interface입니다. 그래서 accept메소드를 구현하면 됩니다. 이 메소드에서 true값을 가지게 하는 값만이 String[]으로 반환이 됩니다.

[code]
import java.io.File;
import java.io.FilenameFilter;

public class FileFilterTest {

    public static void main(String[] args)
    {
        File file = new File("D:/");
        String[] list = file.list(new FilenameFilter()
        {
            @Override
            public boolean accept(File dir, String name)
            {
                return name.endsWith(".mp3");
            }
        });
       
        for (int i = 0; i < list.length; i++)
        {
            System.out.println(list[i]);
        }
    }
}
[/code]
[code]
01. War.mp3
01_Be.mp3
01 ) 나를 보낸다.mp3
더 크로스 3집 ['07 The Cross]- 01 Love Song.mp3
[/code]
음.....잘되는군요. 저 accept함수를 잘만 구현하면 원하는 형태로 구현할 수 있는 것 같습니다.

 
Posted by 머드초보
,
 
업체에서 윈도우를 만들고, 트레이아이콘형태로 애플리케이션을 띄워달라고해서 SWT까지 손을 대는군요-_-;

디자인할 수 있는 툴로는 유료로 Window Builder라는 것이 있는 것 같은데요. SWT Designer, SWING Designer 등의 툴이 있는 것 같아요. 안써봐서 모르겠네요^^
그리고, 무료로 좋은 것이 하나 있는데, 그것이 넷빈즈(NetBeans)입니다. 넷빈즈는 무료임에도 불구하고 엄청난 디자인툴을 제공합니다. 넷빈즈가 저는 훨씬 좋은데, 프로젝트가 다 이클립스로 되어있어서 이클립스로 하는 법을 찾다가 Visual Editor를 알게 되었네요. (사실....Visual Editor가 없는 게 더 나은 것 같습니다-_-; 이걸로 만들면 코드가 개판이 됩니다-_-)

이클립스 3.4를 실행합니다.
Visual Editor가 원래는 이클립스 공식 플러그인이였는데, 이제 지원을 안하는 것 같아요.
Help -> Software Updates에서 Available Softeware탭에서 Add Site한다음에
http://update.soyatec.org/Ganymede/ve/1.4/ 를 추가합니다.
열어보면 Visual Editor 1.4가 있습니다. 체크하고 Install합니다.

이클립스 리스타트하고, New Java Project를 생성합니다.
Project Name은 SWTTest로.....
src에 대고, New -> Other -> Wizard에 Shell이라고 치면, Java -> SWT -> Shell Visual Class가 나옵니다.
선택하고, SWTTest라고 해줍니다. 그리고, public static void main에 체크를 합니다.

그러면 위에 디자인이 보이고, 아래에 코드가 보입니다. 오른쪽에는 Pallette가 있어서 원하는 Control이나 Container를 가져다 쓸 수 있습니다.
사용자 삽입 이미지
실행하면 그냥 창이 뜰겁니다.
이거 배포할 때도 디게 쉽습니다.
Export 선택 후, Java -> Runnable JAR file이라고 있는데, 이걸 선택하면 자동으로 실행가능한 jar파일로 생성해줍니다. 윈도우에서 jar파일 더블클릭만하면 실행됩니다.

아무런 코딩을 안했는데, 2메가네-_-;
 
Posted by 머드초보
,
 
Microsoft Outlook 2007에서 최소화버튼을 누르면, 창이 사라지면서 작업표시줄에서도 같이 사라지고, 트레이아이콘으로만 남게 됩니다.
그것을 AIR에서도 구현할 수 있습니다.

AIR에서는 윈도우의 DisplayState를 캐치할 수 있는데요. 즉, 최소화, 최대화 이런 이벤트가 발생하는 것을 잡을 수 있습니다. 그래서 만약 위와 같은 기능을 구현하고자 한다면 이렇게 하면 됩니다.

최소화이벤트를 잡은 뒤, 창의 visible을 false로 바꾸고, trayicon의 icon이미지를 넣어주면 됩니다.
또, 창을 다시 원래 대로 돌리려면, trayicon에 이벤트를 걸어서 클릭 시, 창의 visible을 true로 바꿔주고, trayicon의 icon이미지를 삭제하면 됩니다.

http://help.adobe.com/en_US/AIR/1.1/devappsflex/WS5b3ccc516d4fbf351e63e3d118666ade46-7dcb.html

음....저는 찾는데 하루를 소비했습니다만-_-;(머리가 딸려서-_-) 찾은 문서는 Adobe AIR에 있는 "Developing Adobe AIR 1.1 Applications with Flex"문서군요 ㅠ

아래는 제가 구현해봤습니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="creationCompleteHandler()">
    <mx:Script>
        <![CDATA[

            private var icons:Loader = new Loader();
                   
            private function creationCompleteHandler():void
            {
                makeTrayIcon();
                icons.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete);
               
                nativeWindow.addEventListener(
                        NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, onChange);
            }
           
            private function onChange(event:NativeWindowDisplayStateEvent):void
            {
                if (event.afterDisplayState == NativeWindowDisplayState.MINIMIZED)
                {
                    event.preventDefault();
                    nativeWindow.visible = false;
                   
                    icons.load(new URLRequest("icons/icon_16.png"));
                }
            }
           
            private function makeTrayIcon():void
            {
                var iconMenu:NativeMenu = new NativeMenu();
                var visibleCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Visible"));
                visibleCommand.addEventListener(Event.SELECT, function(event:Event):void {
                    nativeWindow.visible = true;
                    NativeApplication.nativeApplication.icon.bitmaps = [];
                });
               
                var exitCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Exit"));
                exitCommand.addEventListener(Event.SELECT, function(event:Event):void {
                    NativeApplication.nativeApplication.icon.bitmaps = [];
                    NativeApplication.nativeApplication.exit();
                });
               
                var systray:SystemTrayIcon =
                NativeApplication.nativeApplication.icon as SystemTrayIcon;
                systray.menu = iconMenu;
            }
        
            private function iconLoadComplete(event:Event):void
            {
                NativeApplication.nativeApplication.icon.bitmaps =
                    [event.target.content.bitmapData];
            }

        ]]>
    </mx:Script>
</mx:WindowedApplication>
[/code]
핵심은
[code]
nativeWindow.addEventListener(
                        NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, onChange);

private function onChange(event:NativeWindowDisplayStateEvent):void{
    if(event.afterDisplayState == NativeWindowDisplayState.MINIMIZED){
        event.preventDefault();
        event.target.visible = false;
    }
}
[/code]
우선 윈도우에 NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING 이벤트를 겁니다. 이것은 윈도우의 상태가 변경되었을 때 발생합니다.
최소화버튼을 누르거나 작업표시줄에서 버튼을 클릭하여 최소화 할 때 이벤트가 발생합니다.
event.preventDefault()를 호출하게 되면 디폴트동작을 취소하게 됩니다. 그리고 창만 숨기는거죠. 창을 숨기면 작업표시줄에도 사라집니다. 그리고, trayicon을 만들면 됩니다.

후.....달이차오르니 가야겠습니다.

 
Posted by 머드초보
,
 
올블로그를 보다가
http://www.choboweb.com/entry/%EB%82%B4-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%82%AC%EC%9A%A9-%ED%86%B5%EA%B3%84%EB%A5%BC-%EC%B6%94%EC%A0%81%ED%95%98%EB%8A%94-Wakoopa
'내 소프트웨어 사용 통계를 추적하는 Wakoopa' 라는 글을 읽고, 저도 설치해봤습니다^^
와우~ 아직 하루밖에 통계를 내지 않았지만......

사이트입니다.
http://wakoopa.com/

사용자 삽입 이미지
1등이 원격데스크탑 연결인데, 저건 잠시 외부서버에서 작업을 해야해서 좀 썼더니, 1등이 되버렸네요-_-;
2등은 FireFox인데, 회사에서 일안하고 인터넷만 한다는 것을 보여주는군요.
3등은 이클립스군요. 그래도 일을 하고 있는 것을 보여주는....-_-;
4등은 네이트온. 친구들과 채팅을 한 시간만 치는 것 같아요.
등등~

암튼 신기한 프로그램입니다.

이거 사장님이 직원 컴퓨터에 깔아놓고 확인해도 참 좋을 듯 싶습니다.

여러가지 부가기능들이 있는데요. 위젯을 달 수가 있어요-_-; 자기가 제일 많이 쓰는 애플리케이션으로 한 위젯! 멋지네요 ^^ 게다가 open api를 지원하는 듯하네요. api를 이용해서 전체적으로 가장 많이 사용하는 애플리케이션을 받아올 수 있는 듯 합니다.

이 사이트를 아는 사람들은 IE보다 FF를 많이 쓰네요^^

PS. 사람들은 통계를 좋아하는 것 같아요 ^^
 
Posted by 머드초보
,