음...아직 JavaFX는 삽질할 것이 못되는군요. 얼마전 세미나에서 실버라이트1.0때 열악함을 말해줬는데 그것이 생각나는군요. JavaFX가 지금 현재 열악함 상태입니다.

우선 이 예제는 ManiaDB의 OpenAPI를 이용한 나름(?) 매쉬업 애플리케이션입니다 ㅠ 해당 가수명을 입력하면 매니아디비에서 앨범목록을 가져와서 앨범이미지를 DisplayShelf형태로 뿌려주는 애플리케이션입니다.

여러가지 문제점이 있었는데요ㅠ

1. JavaFX HttpRequest, PullParser 문제점

이 놈을 알아야지 API데이터를 가져올 수 있습니다. 이걸 사용하면서 뭔가 문제점이 있다면...XML파싱할 때 복잡합니다. Flex의 HTTPService는 축복입니다-_- 그리고, XML의 값이 없는 경우(ex:<description><![CDATA[]]></description>)에는 nullpointException을 내뿜으며 파싱에러를 냅니다-_- 매니아디비는 description이 없는 앨범이 있어서 저런 에러를 내뿜더군요.
그래서 꼼수(?)를 사용했습니다. JSON으로 변환해서 쓰면 됩니다-_- JSON은 에러를 안뿜어요. JSON으로 바꾸려면 역시 야후파이프가 짱-_-
야후파이프주소 : http://pipes.yahoo.com/pipes/
앨범검색파이프 : http://pipes.yahoo.com/pipes/pipe.info?_id=5e24977627eb6c03b1d7e9aeb820aca7
앨범검색파이트에서 Get as JSON으로 받으시면 JSON으로 받을 수 있습니다. 이걸가지고 HttpRequest클래스를 이용해서 파싱하면 됩니다.

파싱할 때 XML같은 경우에는 ELEMENT명과 LEVEL로 구분을 해서 값을 가져올 수 있습니다. PullParser라는 클래스를 이용해서 파싱하는데, XML엘리먼트마다 onEvent함수가 발생합니다. 거기서 해당 엘리먼트명과 level(얼마나 깊이 들어갔는지-_-)를 if문으로 구분해서 맞으면 값을 가져오는 그런 식으로 파싱합니다-_-
JSON도 비슷합니다. 예를 들어 값이 끝날 때 "로 끝나면 END_VALUE인지 확인 후 원하는 이름인지 확인 후 가져오면 됩니다. 생각해보니...뭐 그리 복잡하지도 않군요.


2. 과도한 {}로 불편한 문법-_-

조금 하다보니 이제 익숙해지려고 하는 듯하면서도 헷깔리는 과도한 {}-_- 이건 JSON도 아니고, Javascript도 아니고, Java도 아닌데, 3가지 문법이 짬뽕이 되었습니다. 재미있는 건 Java클래스를 그대로 쓸 수 있는 듯합니다. 어느정도인지는 안해봤는데, URI를 encode해야해서 어떻게 해야하나 생각하던중에 Java클래스에 있는 URIEncoder를 사용하니 그냥 되더군요-_- 예전에 선테크데이에서도 Java를 임포트할 수 있다고 들은 것 같아서^^
이 문법도 계속 보니....적응이 되는군요.

그 외에 문제가 굉장히 많았는데, 기억이 안나네요-_-

사용자 삽입 이미지

이건 스크린샷이에요-_- 낚이지 마세요-_-

실행예제 http://mudchobosample.appspot.com/AlbumSearch/AlbumSearch.html
실행 시 신뢰할꺼냐고 물어보는데, 신뢰한다고 해야 실행됩니다 ㅠ 외부파일을 끌어쓰기에..-_- 그리고 자기 인증서기때문에 6개월 뒤에 만기된다고 합니다 ㅠㅠ 인증서를 사야지 JavaFX를 제대로 쓸 수 있는 듯 합니다.

소스코드입니다.
http://my-svn.assembla.com/svn/mudchobosample/trunk/AlbumSearch/


참고자료
http://www.javafx.com/samples/InterestingPhotos/index.html
http://www.javafx.com/samples/DisplayShelf/index.html

PS. 활성화가 로컬에서 할 때에는 잘 되는데, 올리니까 안되네요. 그래서 TextInput부분을 강제로 활성화를 시켜버렸습니다ㅠ Swing컴포넌트를 써서 그런가....
 
Posted by 머드초보
,
 
이거 물건이네요^^
옛날에는 머리쓰는 게임을 좋아했는데, 나이가 들수록 쉽고 재미있는 게임을 더 찾게 되더라구요^^
어렸을 때 삼국지 같은 걸 하고 있었다니-_- 스타도 나이먹어서 못하겠어요 복잡해요!

마리오카트는 아주 어렸을 적에 슈퍼패미콤으로 했었던 기억이 나네요.
Wii버전은 한층 더 업그레이드가 되어서 전세계 친구들이랑도 할 수 있고, 새로운 모드도 생기고 완전히 바뀌었네요^^

사용자 삽입 이미지
시작하게 되면 아래와 같은 메뉴가 있습니다.
사용자 삽입 이미지
싱글플레이는 저같은 사람이 혼자하는거고(아..슬프네-_-), 멀티플레이는 집에서 리모콘 남는 걸로 같이 하는거고, Wi-Fi는 전세계에 있는 사람이랑 하는겁니다^^ 2명까지 있는 거보니 한대의 Wii에서 동시에 같이 2명이서 접속이 되나봅니다^^ 채널은 랭킹이나 친구가 접속해있는지 확인하는 것 같습니다^^

1. 싱글모드
그랑프리, 타임어택, VS, 배틀 4가지메뉴가 있네요.
사용자 삽입 이미지

왼쪽하단의 Wii Fit이 보이는군요-_-

그랑프리는 1등해서 컵을 따는거고, 타임어택은 혼자서 얼마나 빨리도는냐 하는거고, VS는 그냥 맵에서 겨루는거고, 배틀은 말그대로 팀끼리 배틀하는 겁니다-_-
사용자 삽입 이미지

풍선배틀~ 코인~ Wi-Fi에서 많이 하는 듯...

말그대로 쉽습니다. 풍선배틀은 처음에 시작할 때 풍선 3개 가지고 나오는데, 상대방꺼 많이 터뜨리면 이기는겁니다-_- 코인은 코인 많이 모으면 이기는겁니다-_- 저도 한판씩밖에 안해봐서 잘....-_- Wi-Fi가서 이게 뭐지 하면서 캐관광당했던....

사용자 삽입 이미지
카트는 더 멋있어졌네요^^ 돈 모아서 사고 그런건 없나봐요-_-
사용자 삽입 이미지
Wi-Fi들어가서 첫게임을 했는데, 1등해버렸어요 ㅠㅠ 히힛~ Wii의 단점은 게임하고 있는 사람들끼리 커뮤니케이션을 할 수 없어요-_- XBOX는 마이크로 대화를 할 수 있다지만, 이건뭐..-_- 묵묵히 게임만 해야하는 상황-_-

게임하는 장면은 사진으로 못찍었네요-_- 게임하면서 카메라를 들이댈 수 없어서-_-

마리오카트는 확실히 혼자하는 것보단 친구들이랑 하는 게 재미있을 것 같아요. 몬스터헌터도 나온다던데 국내에도 1년뒤에 나오는거 아닌가 모르겠네요 ^^
 
Posted by 머드초보
,
 
SpringFramework가 되는지 삽질하던 중 데모에 있는 샘플을 하나잡아서 convert를 시켰습니다-_-
놀랍게도 잘 되네요. 하는 도중 약간의 혈압이 상승했지만요-_-

우선 샘플주소입니다.
http://springguestbook.appspot.com

소스코드 주소입니다. trunk/SpringGuestBook입니다^^
http://my-svn.assembla.com/svn/mudchobosample

마치...그냥 앱엔진에서 제공하는 샘플이랑 같아보여서 사기를 치는 것 같지만, Model2방식의 예제입니다ㅠ

우선 하면서 가장 처음에 겪는 문제점입니다.
Your Web Application Project must be configured to use a JDK in order to use JSPs.

JSP를 쓰려면 jdk를 설정해야한다는 뜻인데요. 보통 JDK를 깔고, 이클립스를 실행하면 디폴트로 JRE가 잡혀있어요. 이걸 JDK로 추가해서 바꿔주시면 돼요.

이클립스에서 Window -> Preferences -> Java -> Installed JREs선택.
Add -> Standard VM -> JRE home에서 Directory선택해서 JDK주소를 찾으세요.
디폴트로 설치하셨다면 C:\Program Files\Java\jdk1.6.0_12 여기에 있을겁니다.
폴더만 선택하고, Finsh를 누르면 추가가 되었습니다. 체크박스를 jdk로 옮겨주세요. 그러면 저 위에 에러 안날꺼에요.

그다음으로 겪는 문제점은....-_- 앱엔진에서 지원안하는 클래스를 쓰는 곳이 있는 것 같아요.
spring mvc를 사용하려면 spring.jar하고 spring-webmvc.jar 두개만 있으면 되는데요. 이거 두개 lib폴더에 넣어놓고 서버에 디플로이 시키면
exception is java.lang.NoClassDefFoundError: javax/naming/NamingException
App engine로그를 볼 수 있는데, 거기서 로그를 보면 클래스를 찾을 수 없다고 나와요. spring-orm.jar에서 쓰는 것 같더라구요. 어차피 구글앱엔진은 jdo만 지원해서 jdo only라이브러리가 있습니다-_- 그걸로 바꿔주시면 돼요.
전 라이브러리복사할 때
spring-beans.jar, spring-context-support.jar, spring-context.jar, spring-core.jar, spring-jdbc.jar, spring-orm-jdo-only-2.5.6.jar, spring-test.jar, spring-tx.jar, spring-web.jar, spring-webmvc.jar를 복사했네요.
여기서 spring-orm-jdo-only-2.5.6.jar는 저도 어디서 받은거라.....-_-
그러고 디플로이하면 잘 됩니다.

또 한가지 문제점은 eclipse에서 제공하는 dynamic web project에서는 WEB-INF/lib에 library파일을 복사하면 자동으로 클래스를 코드힌트로 쓸 수 있는데, 이놈은 코드힌트를 할 수 없어요-_- 그래서 수동으로 추가를 해줘야해요.
프로젝트 이름에 Properties를 선택하고, Java Build Path에서 Add JARs에서 추가한 spring파일 등을 선택해서 추가해줘야 에러가 안나네요^^(이건 뭐 다른 방법이 있을 지도.....-_-저에게 최선의 방법이였다는 ㅠ)

또 JDO라는 걸 전혀 몰라서 조금 고생했는데, Hibernate같은 orm이더군요. 사실 아직도 잘 모르겠습니다. 좀 더 알아봐야할 것 같네요. orm하면 Hibernate랑 JPA밖에 없는 줄 알았는데, 뭐 디게 많네요ㅠ

또.....-_- localhost에서 Datastore테스트를 하면 war/WEB-INF/appengine-generated라는 폴더가 생겨요. 디비가 저장되는 것 같은데, 저게 있는 상태에서 디플로이하면 안돼요. 지우고 하면 됩니다.

또 이런저런 문제가 있었는데, 기억이 안나네요. 그래도 정말 대단한 것 같습니다. 대세는 클라우드-_-

참고자료
http://peterbacklund.blogspot.com/2009/04/running-spring-on-google-app-engine.html
http://groups.google.com/group/google-appengine-java/browse_thread/thread/f1a541fe52e172dd

 
Posted by 머드초보
,
 
구글 앱 엔진이 자바를 지원하기 시작했습니다.
전 세계적으로 가장 인기있는(?) 언어인 자바를 지원하다니 대단합니다-_-(사실...파이썬 보다 자바나 PHP를 먼저 지원했어야 했을 것 같은데-_- 그때 얘기를 들어보니 앱엔진 담당하는 사람이 파이썬 전문가라는 얘기를 들은 것 같군요-_-)

거기에 더 대단한 것은 파이썬 같은 경우에는 툴 같은 것이 없었는데, 이번엔 이클립스를 이용한 툴까지 제공해줍니다. 구글플러그인인데요. App Engine JAVA SDK랑 덤으로 Web Toolkit SDK까지 깔아주는군요. 게다가 구글 앱엔진에 쉽게 배포까지 할 수 있습니다.

이클립스 설치주소 : http://dl.google.com/eclipse/plugin/3.4 (3.3버전은 뒤에 3.3-_-)
참조문서 : http://code.google.com/intl/ko-KR/appengine/docs/java/tools/eclipse.html

설치를 하게 되면 File -> New -> Other에 보시면 Google이라는 폴더에 Web Application Project라는 프로젝트가 있습니다. 이걸 선택하게 되면 아래와 같은 화면이 나옵니다.
사용자 삽입 이미지
Web Toolkit은 체크를 안해도 됩니다.

프로젝트가 완성이 되면 익숙한(?) 폴더구조를 볼 수 있습니다. src는 java소스부분이 들어가는 곳이고, war부분은 WebContent부분이군요. 안에 더욱 익숙한 WEB-INF도 있어요-_- 라이브러리 마구 처박아도 되나-_- web.xml도 있군요.

자 그럼, 손쉬운 배포를 해봅시다. 갓난애기도 할 수 있는 앱엔진 배포!(과연..-_-)
war -> WEB-INF폴더에 appengine-web.xml파일을 엽니다.
[code]<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>mudchobo</application>
    <version>1</version>
   
    <!-- Configure java.util.logging -->
    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
   
</appengine-web-app>[/code]
<application>부분에 자신이 애플리케이션 생성 시 입력한 Application Identifier를 입력합니다.

그리고, 프로젝트에 대고, 마우스오른쪽 버튼을 누르면 Google이라는 메뉴가 있습니다.
Deploy to App Enigne이라는 메뉴를 선택합니다.
사용자 삽입 이미지
자신의 App Engine계정을 입력하면 바로 배포할 수 있습니다.

http://mudchobo.appspot.com/ 여기에 배포가 되었습니다.

Spring 등의 라이브러리도 다 되는거겠죠?-_- 이번 연휴에 삽질을 해봐야겠습니다.

PS. 혹시나 파일의 용량제한이 있나테스트해봤더니 10메가 이상파일은 안올라가네요.
Unable to upload app: Found a file too large to upload: "C:\Users\mudchobo\AppData\Local\Temp\appcfg3803788145857696233.tmp\Aptana Studio.zip".  Must be under 10000000 bytes.
 
Posted by 머드초보
,
 
보통 DataGrid에서 ScrollBar는 아이템개수가 화면에 표시하는 개수보다 많으면 생기는데요. 개수가 많을 수록 Thumb부분이 더 작아지죠. 이 Thumb크기를 고정시키려면 찾아본 결과 Scrollbar속성에 scrollThumb부분이 있는데, 그걸 없애고, 새로 고정된 Thumb으로 교체를 시키는 방법이 있더라구요.

http://npacemo.com/wordpress/2008/05/20/flex-3-designer-scrollbar-fixed-size-scrollthumb/
소스는 자세히 보시면 그리어렵지 않지만, 이분께서 유틸을 너무 잘 만드셔서-_- 그냥 가져다 쓰시면 됩니다-_-

저 글에서는 Canvas의 스크롤바를 했지만, DataGrid라고 뭐 다를 거 없습니다.
음....데이터그리드는 커스텀 컴포넌트를 만드셔서 updateDisplayList를 오버라이딩해주시면 됩니다..

[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            import com.soribada.utils.fixedthumb.ScrollBarUtil;
           
            use namespace mx_internal;
           
            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
            {
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                ScrollBarUtil.replaceScrollThumb(verticalScrollBar);
            }
        ]]>
    </mx:Script>
</mx:DataGrid>
[/code]
DataGrid는 verticalScrollBar라는 객체가 있는데, 이것을 고정된 ScrollBar로 바꿔주면 됩니다^^

PS. 그냥 뭐 전 찾는데 오래걸려서 혹시나 필요한 사람이 있을까봐 올립니다ㅠ
 
Posted by 머드초보
,