해결방법 같은 건 아니구요-_- 그냥 이렇게 하니까 짤리지는 않더라 정도 입니다-_-

혹시....맥에서 Flex Builder 쓰시는 분도 그런가요?-_- 맥에선 컴파일을 안해봐서 잘 모르겠네요.
암튼, Windows용 Flex Builder로 컴파일한 swf는 맥에서는 한글이 짤려서 보이네요.
버그리포팅을 하고 싶지만.....영어도 딸리고...말주변도 없고....에이레네님께 부탁을 ㄷㄷㄷ

사용자 삽입 이미지
사용자 삽입 이미지
우선 style에서 fontFamily를 "돋움"으로 주니 맥에서 저렇게 보이더군요.
그래서 fontFamily에다가 Arial을 추가해줍니다-_-(석경씨가 발견! 짱!)
[code]font-family: "돋움", Arial;[/code]
그럼 윈도우폰트도 적용할 수 있고, 맥에서는 글씨도 안짤릴 수 있고...하지만, 맥에서는 폰트를 바꿀 수 없습니다-_- 그냥 나오는대로 보셔야합니다ㅠ

PS. 다른 방법 알고 계신 분 알려주세요ㅠㅠ
PS2. 보너스로~ 내 윈도우에서 돌아가는 Mac OS X Leopard.....인터넷 밖에 안된다는...ㅠㅠ
사용자 삽입 이미지


 
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 머드초보
,
 
음 일주일전에 갔었는데, 이제야 후기를 남기네요-_-
아....펜을 안가져가서 메모를 못하고 왔어요-_- 일주일이 지난 지금 내용을 거의 다 까먹었어요ㅠ 더듬더듬 작성해볼랍니다-_-

1. Flash Platform 게임개발 노하우 - 이정웅님
예전에 구글코리아에 갔을 때 FaceBook이나 오픈소셜 애플리케이션이 돈이 된다는(?) 얘기를 듣긴 했습니다만, 플래시게임을 개발하시는 이정웅님 말씀을 들으니 실감이 좀 나네요. 구글코리아에서 다양한 성공사례를 얘기했었는데, 플래시로 만든 게임도 있었죠. SNS에 특성이 맞는 게임을 개발하고 계시는 이정웅님 참 대단한 것 같습니다. 개발하고 계신 데모를 보여주셨는데, SNS요소와 RPG의 만남은 참 기발하더군요. 좀만 더 생각하면 더 멋진 아이디어가 나올 것 같아요^^
 저도 오픈소셜이나 Facebook을 이용하여 뭔가 해보고 싶은데, 좋은 아이디어가 없군요ㅠ Facebook은 AS3용 라이브러리도 나온판에 어서 삽질을 해봐야할텐데ㅠ

2. FlarToolkit으로 구현하는 증강 현실 - 옥상훈님
이건 회사에서 어떤 분이 보여주셔서 알게 되었던 건데, 여기서 다시 보니 새롭네요. 웹캠을 이용해서 어떤 패턴을 인식하여 보여주는 기술인데, 말로 설명하니 뭔 개소리 같네요-_- 직접 보시는 게 가장 빠르죠^^

ActionScript 3.0과 웹캠으로 이런 짓을??? – FLARToolKit, Away3D, WOW-Engine - 지돌스타님 블로그

아직 뭔가 응용할 수 있는 게 나오진 않았지만, 조금만 더 연구하면 멋진 기술이 나올 것 같기도 합니다^^

3. Flash Platform 한글문제 - 이희덕님
음 한글문제가 심각함은 예전부터 좀 느꼈지만, 생각보다 많네요. AIR에서 한글 지울 때 좀 남는거-_-밖에 몰라서-_- 암튼, 공동대응팀에서 이렇게 신경을 써주시니 감사할 따름이네요. 어도비에서 잘 고쳐줬으면 좋겠네요^^ Flex4에서도 발생하는 문제점도 찾으시다니 대단하십니다. Flex4에서는 완벽하게 고쳐졌으면 좋겠네요^^

4. 잡부 Flex 개발자를 위한 Flex 스킨 - 김학영님
음 잡부 Flex개발자.....슬프군요ㅠ

5. Creating visual Experiences with Flex - 이준하님
아....여기서부터 뭔말인지 몰라서 집중력을 잃었습니다. 메모도 안해가지고 오고, 일주일이 지나고 나니, 뭔가 생각이 안나네요-_-

오늘 흥미가 간 주제는 Flash Game이였습니다. 사실, 전 게임개발자를 꿈꿔왔다가 다른 길로 빠져셔-_- 게임에 아직도 미련을 못버리고 있었거든요. 근데, Flash로 MMORPG도 만들고, 정말 멋지군요.
이런 모임을 직접 다 준비하셨다니 정말 대단하군요. 앞으로 이런 모임이 자주 있었으면 좋겠네요^^ 참 즐거운 시간이였습니다^^

PS. 아......마음의 소리 책 갖고 싶었는데.....-_- 제가 39번인가 그랬는데, 38번이 나왔었어요 ㅠㅠ


 
Posted by 머드초보
,
 
젠장... Flash Player 10에서 생기는 버그를 발견했습니다.
TextInput에서 enter이벤트에 자신의 TextInput의 초기화하는 코드가 있으면 초기화가 안됩니다 ㅠ 9버전으로 컴파일하면 되는데, 10으로 컴파일하니 안되네요 ㅠ 몇시간 잡아먹었어요 ㅠ 하소연은 여기까지....-_-

우선 Stratus라는 기술은 Flash간에 통신을 가능하게 해주는 기술인 듯합니다.
자세한 내용은 아래에......-_-(영어는 잘 못하니....)
http://labs.adobe.com/technologies/stratus/

Adobe RIA공식사이트에서 오창훈님께서 올리신 기술문서 "플래시 플랫폼으로 만들어 보는 P2P 채팅 애플리케이션"를 보고 휠받아서 한번 만들어봤습니다. 채팅이 가능하다면, 오목게임도 가능할꺼라는 생각에.....-_- 참 쓸데없는거 잘만든다-_-

http://mudchobo.tomeii.com/flexomok/
위 사이트에 접속하면 서버랑 클라이언트를 고를 수 있어요.
닉네임을 입력하세요 한명은 서버를 한명은 클라이언트를 해야해요.

서버측
서버를 클릭하고, 생성되는 ID를 클라이언트에게 알려주세요.
클라이언트측
클라이언트를 클릭하고, 서버측의 ID를 입력해서 접속하세요~

오목판이 나오면 접속 성공~ 같이 오목을 즐기면 돼요-_-
사용자 삽입 이미지
소스는 여기에 있어요.
http://my-svn.assembla.com/svn/omok/
Mate Flex Framework를 사용했고(이걸 사용해야 스피드한 개발이.....-_-), 소스도 개판이라 보시는데에는 매우 힘드실겁니다. 저도 참 만든게 신기하군요-_-

참고자료

플래시 플랫폼으로 만들어 보는 P2P 채팅 애플리케이션(로그인 후 볼 수 있습니다)
http://www.adoberia.co.kr/iwt/board/board.php?tn=pds_tech&id=244&mode=view

플래시 P2P RTMFP에 대해(예제 파일 첨부)
http://lovedev.tistory.com/entry/%ED%94%8C%EB%9E%98%EC%8B%9C-P2P-RTMFP%EC%97%90-%EB%8C%80%ED%95%B4


PS1. 버그가 조낸 많습니다. 한명이 나가도 뭔가 반응이 없습니다-_- 채팅에서 글을 쓰고 엔터를 쳐도 TextInput에서 지워지지 않습니다. 하지만, 그냥 한게임 즐기기에는 충분합니다 -_-b
PS2. 구글에서 Stratus를 치시면.....이미지검색에 여자 프로레슬러 트리쉬 스트레터스가 나옵니다-_-; 그냥 그렇다구요-_-
 
Posted by 머드초보
,
 
PHP는 HTTPService말고 방법이 없을까 하고 찾아보니, Zend에서 AMF를 이용하여 개발한게 있군요. Adobe의 공식 지원으로 만들어진거라 빠르리라고 생각합니다^^ (적어도 HTTPService보단 빠르겠죠!)

암튼, BlazeDS를 하셨다면 그리 어렵지 않군요.
이번에도 간단하게 소녀시대예제를 통해...접근해봅시다-_-;

간단히 데이터를 불러오고, 저장도 해보는 그런 애플리케이션을 만들어봅시다.

우선 Eclipse에서 php가 가능하도록 해야하는데요. 뭐 그냥 editplus에서 해도 상관없습니다. Zend홈페이지에 가면 자기네들 IDE깔라고 합니다-_-; Zend Studio라는 게 있네요. 뭐 php단은 netbeans를 이용해서 개발하셔도 되고, 이클립스에 있는 PDT를 추가하셔서 해도 상관없어요~ ^^ 전 NetBeans를 선호합니다. 좋아요!

DB입니다.
[code]DROP TABLE IF EXISTS `sosi`.`sosi`;
CREATE TABLE  `sosi`.`sosi` (
  `idx` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `sosiname` varchar(45) NOT NULL,
  `height` int(10) unsigned NOT NULL,
  `blood` varchar(45) NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

INSERT INTO `sosi` (`idx`,`sosiname`,`height`,`blood`) VALUES
 (1,'윤아',166,'B'),
 (2,'수영',170,'O'),
 (3,'효연',160,'AB'),
 (4,'유리',167,'AB'),
 (5,'태연',162,'O'),
 (6,'제시카',163,'B'),
 (7,'티파니',162,'O'),
 (8,'써니',158,'B'),
 (9,'서현',168,'A');[/code]
우선 Flex Project를 만듭니다.
여기서 Application server type을 php로 하세요~ php로 하게 되면 설정된 폴더로 swf를 바로 위치시킬 수 있어요!
Project name은 ZendAmfTest -> Web root는 아파치가 돌아가는 폴더를 지정하면 됩니다.
저는 C:\Program Files\Apache Software Foundation\Apache2.2\htdocs여기군요.
Root URL은 http://localhost/ Finish때려주면 ZendAmfTest-debug폴더에 swf가 생기죠.

요 아래 주소에서 ZendAMF를 받을 수 있습니다.
http://framework.zend.com/download/amf
받은 다음에 압축을 풀면 library폴더 안에 Zend라는 폴더가 있는데 통채로 복사해서 src폴더 아래에 놓습니다.

그리고 php파일을 하나 만드세요. ValueObject입니다. Java에서 bean같은..-_-;
SosiVo.php
[code]<?php
class SosiVo {
    public $idx;
    public $sosiname;
    public $height;
    public $blood;
}
?>[/code]
이제 서비스를 하나 만들어봅시다. SosiService입니다.
SosiService.php
[code]<?php
require_once 'SosiVo.php';

//conection info
define("DATABASE_SERVER", "localhost");
define("DATABASE_USERNAME", "root");
define("DATABASE_PASSWORD", "mudchobo");
define("DATABASE_NAME", "sosi");

class SosiService {
    public function getData() {
        $mysql = mysql_connect(DATABASE_SERVER, DATABASE_USERNAME,
            DATABASE_PASSWORD);
        mysql_select_db(DATABASE_NAME);
        $query = "SELECT idx, sosiname, height, blood FROM sosi";
        $result = mysql_query($query);

        $ret = array();
        while ($row = mysql_fetch_object($result)) {
            $tmp = new SosiVo();
            $tmp->idx = $row->idx;
            $tmp->sosiname = $row->sosiname;
            $tmp->height = $row->height;
            $tmp->blood = $row->blood;
            $ret[] = $tmp;
        }
        mysql_free_result($result);
        return $ret;
    }
}
?>[/code]
php의 array는 ActionScript3의 array와 호환됩니다.
서비스를 만들었으니 EndPoint페이지를 만들어줘야합니다.
amf.php
[code]<?php
require_once 'Zend/Amf/Server.php';
require_once 'SosiService.php';

$server = new Zend_Amf_Server();
$server->setClass("SosiService");
$server->setClassMap("SosiVo", "SosiVo");
echo($server -> handle());
?>[/code]
이제 이것을 연결시켜줄 service-config.xml파일을 만들어야합니다.
[code]<?xml version="1.0" encoding="UTF-8"?>
<services-config>
    <services>
        <service id="amfphp-flashremoting-service"
            class="flex.messaging.services.RemotingService"
            messageTypes="flex.messaging.messages.RemotingMessage">
            <default-channels>
                   <channel ref="my-zend"/>
            </default-channels>
            <destination id="zend">
                <properties>
                    <source>*</source>
                   </properties>
               </destination>
        </service>
    </services>
    <channels>
        <channel-definition id="my-zend"
            class="mx.messaging.channels.AMFChannel">
            <endpoint uri="http://localhost/ZendAmfTest-debug/amf.php"
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>
</services-config>[/code]
우선 default로 my-zend라는 채널을 잡았는데, my-zend는 endpoint uri가 ~~/amf.php입니다. 우리가 좀전에 작성했던 endpoint죠. 새로운 서비스가 추가되어 새로운 endpoint를 작성하게 될 때 endpoint파일을 amf1.php라고 했을 때 이곳에 추가해서 channel에 기입할 수도 있고, <mx:RemoteObject>에서 endpoint를 해당 uri로 바꿔주는 방법 2가지가 있습니다.

그럼 이제 Flex쪽으로 넘어가봅시다.
ZendAmfTest.mxml
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="vertical"
    creationComplete="creationCompleteHandler()">
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.rpc.events.ResultEvent;
            import mx.rpc.events.FaultEvent;
           
            private function creationCompleteHandler():void
            {
                roSosi.getData();   
            }
           
            private function faultHandler(event:FaultEvent):void
            {
                Alert.show(event.message.toString());
            }
           
            private function resultGetDataHandler(event:ResultEvent):void
            {
                dgSosi.dataProvider = event.result as Array;
            }
        ]]>
    </mx:Script>
   
    <mx:RemoteObject id="roSosi" fault="faultHandler(event)" destination="zend" source="SosiService">
        <mx:method name="getData" result="resultGetDataHandler(event)" />
    </mx:RemoteObject>
  
    <mx:DataGrid id="dgSosi" width="100%" height="100%">
        <mx:columns>
            <mx:DataGridColumn headerText="아이디" dataField="idx"/>
            <mx:DataGridColumn headerText="소녀시대이름" dataField="sosiname"/>
            <mx:DataGridColumn headerText="신장" dataField="height" />
            <mx:DataGridColumn headerText="혈액형" dataField="blood" />
        </mx:columns>
    </mx:DataGrid>
   
</mx:Application>[/code]
만약 다른 서비스를 추가하게 된다면, <mx:RemoteObject>에서 endpoint를 다른 url로 잡아주면 됩니다.
[code]<mx:RemoteObject id="roAnother" fault="faultHandler(event)"
        destination="zend" source="AnothorService"
        endpoint="http://localhost/ZendAmfTest-debug/another_amf.php">[/code]
아님 service-config.xml에서 channel을 다르게 해서 destination을 다르게 설정해도 되구요.
사용자 삽입 이미지

ps1. 다른 예제에서는 2개의 service를 이용한 예제가 없더라구요. 그래서 사실 저렇게 하는 게 맞는지 잘 모르겠습니다. 다른 방법이 있을 수도 있구요^^ 암튼, 제가 삽질한 바로는 서비스당 1개의 php파일을 만들어야 하더라구요.

ps2. PHP를 시작한지 얼마 안되었는데, DB연동 시 한글이 깨지더라구요. 인코딩을 my.ini과 php.ini에 utf-8로 맞췄는데, ???로 인식해서 나오는 경우가 있더라구요. php파일에서 db정보를 출력하니 이상하게 그냥 로컬에서 쳤을 때에는 utf-8로 나오는데, php파일이 출력한 db정보는 latin으로 나올 때가 있더라구요. 이 경우 my.ini파일에 이 부분을 추가해주면 됩니다.
[mysqld] 아래에
character-set-client-handshake = FALSE
client 인코딩으로 강제 셋팅하는거라고 하더라구요. 저는 처음에 ??? 뜨길래 이걸로 해결봤습니다-_-;
아 또 다른 방법으로 쿼리날리기 전에 set names 'utf8'이라고 먼저 날려줘도 됩니다.
[code]mysql_query("SET NAMES 'utf8'");[/code]
ps3. 이런...생각해보니 client에서 VO를 안만들어줬군요-_-;

참고자료
http://corlan.org/2008/11/13/flex-and-php-remoting-with-zend-amf/

덧. 채널 못찾는 에러는 아래 주너니님의 댓글을 참조하세요~ 컴파일옵션을 추가해야합니다^^
주너니님 감사합니다 ^^
 
Posted by 머드초보
,