'Cairngorm'에 해당되는 글 6건

  1. 2008/08/27 iamyhs Enterprise IDE Plugin
  2. 2008/06/19 iamyhs Mate Framework
  3. 2007/08/30 iamyhs Flex Module Debugging
  4. 2007/08/03 iamyhs Flex(Cairngorm) + Spring + iBATIS 연동
  5. 2007/05/13 iamyhs Cairngorm 2.2 발표
  6. 2006/11/20 iamyhs MAX 2006 세미나 후기 (1)

Enterprise IDE Plugin

취미 2008/08/27 09:55 iamyhs
초창기 FDT  제품군에 아쉬운점이라면 mxml 소스에 대한 서포트가 없었다.
그 이후 Enterprise 제품군에는 포함시킬거란 향후 "계획"을 발표했었지만, 지금까지 여전히 해당 기능은 없다.괜찮은 솔루션임에도 불구하고 최근에는 잘 쓰지 않은 플러그인중에 하나가 되었다.

반면에 이번에 베타로 나온 Enterprise IDE Plugin 은 주목할만 하다.

Code Navigation Code Generation General Tools Code Documentation

네개의 카테고리로 분류한 기능들을 살펴보면, 눈에 띄이는 기능들이 UML 과 Cairngorm 관련된 부분이다.AS3 코드 제너레이션은 기본이고, ASDoc 까지 전체적으로 기존 솔루션을 매시업 했다는 기분이 들 정도로 잘 활용한 프로그램이라는 인상이다.


2008/08/27 09:55 2008/08/27 09:55

Mate Framework

취미 2008/06/19 19:09 iamyhs
또 다른 플렉스 프레임웍이다.

태그 기반이고, 캔곰으로 프로젝트를 다뤄본적이 있다면 상대적으로 덜 복잡함을 느낄거다.

간단히,현재 SAP 쪽 데이타를 끌어오는 부분을 포팅해봤는데, 한시간 정도면 익힐수 있을 정도로 가볍다.

아래 사항들에 대해서는 깊이있게 들어가진 않았지만, 쓸만하다 싶다.

    캔곰처럼 ChainEvent 써야할 상황이라면 어떤식으로 처리할까
    모듈로 개발했을때는 문제가 없을까

그리고 제일 마음에 드는건,다큐먼트와 예제이다.기억할만한 프레임웍 MATE

2008/06/19 19:09 2008/06/19 19:09

Flex Module Debugging

취미 2007/08/30 21:17 iamyhs
1)Cairngorm을 써서 모듈로 개발시 디버깅 코드, 예를 들어 TargetCommand 클래스 라면

public class TargetCommand implements ICommand, IResponder{

    private var csModel:CSModelLocator = CSModelLocator.getInstance();

    ..   
    public function result(data:Object):void
        {
            ..
            if (Application(Application.application ).url.indexOf( "debug" ) >= 0 ){
                //trace("디버그 버전 모듈 로딩");
                csModel.moduleURL = "./offton/view/TargetModule-debug.swf";
            }else{
                csModel.moduleURL = "./offton/view/TargetModule.swf";   
            }
          ...
       }
    ..

}


2)모듈 컴파일시 FlexAnt 속성중에 아래처럼 추가하고,필요할때 해당 모듈만 컴파일해서 디버깅 한다.
디버깅에 필요한 파일은 이름-debug.swf 이므로 아래처럼 debug="true" 하고,${modulename}-debug.swf 해주면 간편하게 쓸수 있다.

예를들어,TargetModule.mxml 이 모듈 컴포넌트이고 이 모듈을 디버깅 파일을 함께 컴파일하고 싶다면,

..
<property name="modulename" value="TargetModule" />
..

<target name="Current Module Compile" depends="NormalModule,DebugModule">      
</target>
   
    <target name="NormalModule">
        <echo>NormalModule 이름은 : ${modulename}.mxml </echo>
        <mxmlc file="${view.main}/${modulename}.mxml" output="bin/${view.main}/${modulename}.swf" actionscript-file-encoding="UTF-8" incremental="true" load-externs="${view.main}/report.xml">
            <compiler.library-path dir="${flexlibtask.project.home}" append="true">
                <include name="swc/Cairngorm2.2.1.swc"/>
            </compiler.library-path>           
            <compiler.source-path path-element="./"/>
        </mxmlc>       
    </target>
   
    <target name="DebugModule">
        <echo>DebugModule 이름은 : ${modulename}.mxml </echo>
        <mxmlc file="${view.main}/${modulename}.mxml" debug="true" output="bin/${view.main}/${modulename}-debug.swf" actionscript-file-encoding="UTF-8" incremental="true" load-externs="${view.main}/report.xml">
            <compiler.library-path dir="${flexlibtask.project.home}" append="true">
                <include name="swc/Cairngorm2.2.1.swc"/>
            </compiler.library-path>           
            <compiler.source-path path-element="./"/>
        </mxmlc>       
    </target>
..


2007/08/30 21:17 2007/08/30 21:17
Flex(Cairngorm) + Spring + iBATIS 연동

1)전체 아키텍처

    3-Tier 구조 : Presentation(혹은 UI) Layer,Business Layer,Persistence Layer 로 구성

    1.1 Presentation Layer : Flex
    1.2 Business Layer : Spring(부분)
    1.3 Persistence Layer : iBATIS

    Flex : adobe 사의 enterprise용 presentation tier 솔루션
    Cairngorm : Flex framework
    Spring : layered Java/J2EE application framework
    iBATIS : data mapper framework


2)환경 설정

    2.1 J2EE 설정 파일 : web.xml
    2.2 Flex 설정 파일 : remoting-config.xml, services-config.xml
    2.3 Spring 설정 파일 : applicationContext.xml
    2.4 iBATIS 설정 파일 : SqlMapConfig.xml 과 sqlmap.xml 파일들


    2.1 J2EE 설정 파일 web.xml 수정 사항
    //아래처럼 context-param, listener 태그를 추가한다.
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    2.2.1 Flex 설정 파일 remoting-config.xml 수정 사항
    //아래처럼 <factory>spring</factory> 태그를 추가하고, <source>contactService</source> 처럼 패키지 이름이 아니라,
    서비스 이름을 적어준다(applicationContext.xml 파일에 해당 서비스에 맞는 자바빈즈 설정을 해준다)

    <destination id="contactService">
        <properties>
            <factory>spring</factory>
            <source>contactService</source>
        </properties>
    </destination>
    //서비스 추가시 위 형식과 동일하게 계속 추가해준다.

    2.2.2 Flex 설정 파일 services-config.xml 수정 사항
    //아래처럼 factories 태그를 추가한다.
    //더불어, 관련 class 파일 두개를 패키지 경로에 맞게(flex.samples.factories) 넣어준다.
    // SpringFactory.class, SpringFactory$SpringFactoryInstance.class 이다.
    <factories>
        <factory id="spring" class="flex.samples.factories.SpringFactory"/>
    </factories>
        

    2.3 Spring 설정 파일 applicationContext.xml 수정 사항
    applicationContext.xml 파일을 참고한다,그 안의 내용을 요약하면,


    2.3.1 Application 설정
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location"><value>classpath:../application.properties</value></property>
    </bean>

    application.properties 는 jdbc 실제 정보를 입력한다.
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost/ibatis?user=root&password=mysql
    jdbc.username=root
    jdbc.password=mysql

    
    2.3.2 DB Connection 설정    
    dataSource와 transactionManager 설정을 한다.
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
            <property name="url"><value>${jdbc.url}</value></property>
            <property name="username"><value>${jdbc.username}</value></property>
        <property name="password"><value>${jdbc.password}</value></property>
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource"><ref local="dataSource"/></property>
    </bean>
        

    2.3.3 iBATIS 설정
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">       
        <property name="configLocation" value="classpath:../SqlMapConfig.xml" />
    </bean>


    2.3.4 DAO 설정
    Dao 인터페이스의 구현클래스 지정한다.
    <bean id="contactDao" class="com.appfoundation.flexibatis.dao.ibatis.ContactDaoImpl">
        <property name="dataSource"><ref local="dataSource"/></property>
        <property name="sqlMapClient"><ref local="sqlMapClient"/></property>
    </bean>

    <bean id="mycontactDao" class="com.appfoundation.flexibatis.dao.ibatis.MyContactDaoImpl">
        <property name="dataSource"><ref local="dataSource"/></property>
        <property name="sqlMapClient"><ref local="sqlMapClient"/></property>
    </bean>
    
    클래스가 추가되면 위와 같은 형식으로 추가한다.


    2.3.5 Flex 서비스 설정
    Service 인터페이스의 구현클래스 지정한다.
    <bean id="contactService" class="com.appfoundation.flexibatis.services.ContactServiceImpl">
        <property name="contactDao"><ref bean="contactDao"/></property>        
    </bean>

    <bean id="myContactService" class="com.appfoundation.flexibatis.services.MyContactServiceImpl">
        <property name="mycontactDao"><ref bean="mycontactDao"/></property>        
    </bean>    


    2.3.6 sqlmapconfig.xml    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
        "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

    <sqlMapConfig>
      <settings useStatementNamespaces="true"/>
      <sqlMap resource="../sqlmaps/Contact.xml" />
      <sqlMap resource="../sqlmaps/MyContact.xml"/>
    </sqlMapConfig>


    2.3.7 Contact.xml
    
       <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE sqlMap
        PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
        "http://ibatis.apache.org/dtd/sql-map-2.dtd">

    <sqlMap namespace="Contact">
        <typeAlias alias="contact" type="com.appfoundation.flexibatis.domain.Contact"/>

        <resultMap id="contactResult" class="contact">
        <result property="objectIdentifier"    column="objectidentifier"/>
        <result property="name"                column="name" />
        <result property="businessPhone"      column="business_phone"/>
        <result property="mobilePhone"      column="mobile_phone" />
        <result property="homePhone"          column="home_phone"/>
        <result property="addressLine1"     column="address_line1" />
        <result property="addressLine2"     column="address_line2"/>
        <result property="addressLine3"     column="address_line3"/>
        <result property="city"              column="city"/>
        <result property="state"              column="state"/>     
        <result property="zip"              column="zip"/>
        <result property="email"          column="email"/>
        <result property="company"          column="company"/>
        <result property="title"          column="title"/>
        <result property="responsibility"    column="responsibility"/>
        <result property="image"      column="image"/>
        <result property="department"              column="department"/>
        <result property="phoneExtension"          column="phone_extension"/>
        <result property="fax"     column="fax"/>
        <result property="status"              column="status"/>
        <result property="refferedBy"              column="reffered_by"/>
        <result property="country"          column="country"/>
        <result property="webSite"          column="website"/>
        </resultMap>

        <sql id="contacts_table" >
        contacts
        </sql>

        <select id="getContacts" resultMap="contactResult">
        select *
          from <include refid="contacts_table" />
        order by name
        </select>

        <select id="getContact" resultMap="contactResult">
        select *
          from <include refid="contacts_table" />
         where objectidentifier = #value#
        </select>

        <insert id="insertContact" parameterClass="contact" >
        <selectKey resultClass="int" keyProperty="objectIdentifier">
            SELECT max(objectidentifier) from contacts
        </selectKey>
        insert into <include refid="contacts_table"/>(objectidentifier, name, business_phone,mobile_phone, home_phone, address_line1, address_line2, address_line3,city, state, zip, email, company, title, responsibility, image,department, phone_extension, fax, status, reffered_by, country, website)
                  values(#objectIdentifier#+1,
                     #name#,
                     #businessPhone#,
                     #mobilePhone#,
                     #homePhone#,
                     #addressLine1#,
                     #addressLine2#,
                     #addressLine2#,
                     #city#,
                     #state#,
                     #zip#,
                     #email#,
                     #company#,
                     #title#,
                     #responsibility#,
                     #image#,
                     #department#,
                     #phoneExtension#,
                     #fax#,
                     #status#,
                     #refferedBy#,
                     #country#,
                     #webSite#)
        </insert>

        <update id="updateContact" parameterClass="contact">
        update <include refid="contacts_table"/>
           set name             = #name#,
               business_phone     = #businessPhone#,
                   mobile_phone     = #mobilePhone#,
                   home_phone         = #homePhone#,
                   address_line1     = #addressLine1#,
                   address_line2    = #addressLine2#,
                   address_line3     = #addressLine3#,
                   city             = #city#,
                   state             = #state#,
                   zip                 = #zip#,
                   email             = #email#,
                   company             = #company#,
                   title             = #title#,
                   responsibility     = #responsibility#,
                   image             = #image#,
                   department         = #department#,
                   phone_extension     = #phoneExtension#,
                   fax                 = #fax#,
                   status             = #status#,
                   reffered_by         = #refferedBy#,
                   country             = #country#,
                   website             = #webSite#
        where objectidentifier     = #objectIdentifier#
        </update>

        <delete id="deleteContact" parameterClass="int">
        delete from <include refid="contacts_table"/> where objectidentifier = #value#
        </delete>
    </sqlMap>


    2.3.8 실제 자바 구현 클래스
    
    총 세 부분으로 나뉜다
    domain - flex에서의 vo 클래스라고 생각하면 된다.
    dao - dao 인터페이스와, 구현 클래스
    service - service 인터페이스와,구현 클래스
    


    Contact 클래스.
    --------------------------------------------------
    package com.appfoundation.flexibatis.domain;

    import java.io.Serializable;

    public class Contact implements Serializable {
        int objectIdentifier;
        String name;
        String businessPhone;
        String mobilePhone;
        String homePhone;
        String addressLine1;
        String addressLine2;
        String addressLine3;
        String city;
        String state;
        String zip;
        String email;
        String company;
        String title;
        String responsibility;
        String image;
        String department;
        String phoneExtension;
        String fax;
        String status;
        String refferedBy;
        String country;
        String webSite;

        ....
        셋터,겟터
//이 글 아래 참고 사이트에 가면 해당 클래스 다운받을수 있다.
    --------------------------------------------------    



    ContactDao 클래스.
    --------------------------------------------------
    package com.appfoundation.flexibatis.dao;

    import com.appfoundation.flexibatis.domain.Contact;
    import java.util.List;

    public interface ContactDao {
        
        public List getContacts();
        
        public int updateContact(Contact contact);

        public int deleteContact(int contactKey);

        public int insertContact(Contact contact);
    }
    --------------------------------------------------



    ContactDaoImpl 클래스.
    --------------------------------------------------
    package com.appfoundation.flexibatis.dao.ibatis;

    import java.util.List;

    import org.springframework.orm.ibatis.SqlMapClientTemplate;
    import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
    import org.springframework.dao.DataAccessException;

    import com.appfoundation.flexibatis.domain.Contact;
    import com.appfoundation.flexibatis.dao.ContactDao;

    public class ContactDaoImpl extends SqlMapClientDaoSupport implements ContactDao {

    //이 글 아래 주의 사항 꼭 참고!
    

        public List getContacts() throws DataAccessException {
        return getSqlMapClientTemplate().queryForList("Contact.getContacts");            
        }

        public int insertContact(Contact contact) throws DataAccessException {      
        return ((Integer)getSqlMapClientTemplate().insert("Contact.insertContact", contact)).intValue();
        }
            
        public int updateContact(Contact contact) throws DataAccessException {
        return ((Integer)getSqlMapClientTemplate().update("Contact.updateContact", contact)).intValue();
        }
            
        public int deleteContact(int contactKey) throws DataAccessException {
        return ((Integer)getSqlMapClientTemplate().delete("Contact.deleteContact", contactKey)).intValue();
        }

    }
    --------------------------------------------------



    ContactService 클래스.
    --------------------------------------------------
    package com.appfoundation.flexibatis.services;

    import com.appfoundation.flexibatis.domain.Contact;
    import java.util.List;

    public interface ContactService {
        
        public abstract List getContacts() throws Exception;
        
        public abstract int insertContact(Contact contact) throws Exception;

        public abstract int updateContact(Contact contact) throws Exception;
        
        public abstract int deleteContact(int contactKey) throws Exception;
    }
    --------------------------------------------------


    ContactServiceImpl 클래스.
    --------------------------------------------------
    package com.appfoundation.flexibatis.services;

    import com.appfoundation.flexibatis.domain.*;
    import com.appfoundation.flexibatis.dao.ContactDao;
    import java.util.List;
    import java.io.Serializable;

    public class ContactServiceImpl implements Serializable, ContactService {
        
        // injected by Spring
        ContactDao contactDao;
        
        public ContactDao getContactDao() {
            return contactDao;
        }
        
        public void setContactDao(ContactDao contactDao) {
            this.contactDao = contactDao;
        }
        
        public List getContacts() throws Exception {
            return contactDao.getContacts();        
        }
        
        public int insertContact(Contact contact) throws Exception{    
            return ((Integer)contactDao.insertContact(contact));
        }
    
        public int deleteContact(int contactKey) throws Exception {
           return ((Integer)contactDao.deleteContact(contactKey));
        }
    
        public int updateContact(Contact contact) throws Exception {
           return ((Integer)contactDao.updateContact(contact));
        }
        
    }
    --------------------------------------------------


    2.3.9 MySQL 테이블 구조
    # Host: localhost    Database: ibatis
    # ------------------------------------------------------
    # Server version 5.0.27-community-nt

    #
    # Table structure for table contacts
    #

    DROP TABLE IF EXISTS `contacts`;
    CREATE TABLE `contacts` (
      `objectidentifier` int(11) NOT NULL,
      `name` varchar(120) default NULL,
      `business_phone` varchar(16) default NULL,
      `mobile_phone` varchar(16) default NULL,
      `home_phone` varchar(16) default NULL,
      `address_line1` varchar(120) default NULL,
      `address_line2` varchar(120) default NULL,
      `city` varchar(45) default NULL,
      `state` varchar(25) default NULL,
      `zip` varchar(10) default NULL,
      `email` varchar(120) default NULL,
      `company` varchar(120) default NULL,
      `title` varchar(45) default NULL,
      `responsibility` varchar(45) default NULL,
      `image` varchar(45) default NULL,
      `department` varchar(45) default NULL,
      `phone_extension` varchar(16) default NULL,
      `fax` varchar(16) default NULL,
      `status` varchar(45) default NULL,
      `reffered_by` varchar(45) default NULL,
      `address_line3` varchar(120) default NULL,
      `country` varchar(60) default NULL,
      `website` varchar(120) default NULL,
      PRIMARY KEY  (`objectidentifier`)
    ) ENGINE=InnoDB DEFAULT CHARSET=euckr;

    #
    # Dumping data for table contacts
    #

    INSERT INTO `contacts` VALUES (0,'기본값',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'def@default.com',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    INSERT INTO `contacts` VALUES (1,'양현석',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'iamyh@hitel.net',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    INSERT INTO `contacts` VALUES (2,'jjong jj',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'jjong@offton.co.kr',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    INSERT INTO `contacts` VALUES (3,'기본값',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'def@default.com',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    INSERT INTO `contacts` VALUES (4,'test',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'test@hitel.net',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

    



        

3)테스트 환경

    Tomcat 5.0
    Flex 3.0b,Cairngorm 2.2
    Spring 2.0.6
    iBATIS 2.3.0.677
    MySQL 5.0


4)참고 사이트    
    Flex+Spring
    http://coenraets.org/flex-spring

    Flex+Cairngorm+Spring+iBATIS
    http://www.appfoundation.com/blogs/giametta/2007/05/09/flex-spring-ibatis-caringorm-bringing-it-all-together/
    

    바로 위 Chris Giametta가 구현한 자바 클래스 코딩을 좀 달리했다,난 SqlMapClientDaoSupport extend 해서 구현한거다.
    
    주의)    
    ContactDaoImpl 클래스를 코딩할때 아래처럼 Contact.getContacts,해줘야한다
    이분 블로그 처럼 getContacts 하고,다른 map 파일에서 똑같은 이름의 메소드가 있다면,아래 에러가 난다.
    이 에러때문에 한참 헤맸었다.
    //com.ibatis.sqlmap.client.SqlMapException: There is already a statement named getContacts in this SqlMap.

    위와 관련해서 sqlmapconfig.xml 에 아래의 태그를 추가해준다.

    <settings useStatementNamespaces="true"/>
    

    public List getContacts() throws DataAccessException {
        return getSqlMapClientTemplate().queryForList("Contact.getContacts");            
    }
    

    
3tier 각 부분별로 framework 을 적용해봤다.

그런데, 정말 중요한 질문은 이거다.

왜 Spring 을 쓰나?
왜 iBATIS 를 쓰나?
왜 Cairngorm 을 쓰나?
왜 Flex 를 쓰나?

명쾌한 자신만을 답을 가지고 있다면 이 조합이 꽤 쓸만할꺼다.

ps
지금까지 포스팅한글중에 가장 길고 정성들인것 같다.


2007/08/03 15:50 2007/08/03 15:50

Cairngorm 2.2 발표

취미 2007/05/13 07:06 iamyhs
Flex를 오픈소스로 정책 전환한다는 그 즈음에 Cairngorm 2.2가 발표되었다.

가장 눈에 띄이는건 FDS의 의존성을 제거한 버전과 FDS를 포함하는 엔터프라이즈 버전으로 나뉜점이다.

자체 리모팅 컴포넌트를 사용하는 개발사에게는 대 환영할만한 일이다.

2007/05/13 07:06 2007/05/13 07:06

MAX 2006 세미나 후기

취미 2006/11/20 11:49 iamyhs
11월 14일,15일 양일간 열렸다.

이틀동안 Application 세션만 들었는데,전체적으로 기대에 못 미친다.

제임스 워드(James Ward) 가 전체적으로 설명한게 다른 스피커들 강좌와 많이 겹쳐서 중복되는 느낌이 많았다.

로빈 힐라드(Robin Hilliard) 의 Cairngorm 적용 프로젝트는 꽤 재밌었다.약 2100개의 클래스가 쓰였고, 그만한 프로젝트에는 프레임웍을 써야 할 필요성을 적절히 설명한것 같다. 세션이 끝나고 따로 질문을 했었는데, 1.5 버전에서 이정도 프로젝트를 진행할때 메모리 문제가 발생했고 해결책으로 중복된 뷰에 대한 rebound에대한 설명이었다.Cairngorm 에 대한 깊은 이해가 없어서 백프로 이해하진 못했지만 기억할만한 부분이었다.

키스코 직원의 국내 Flex 사례에 대한 세션을 들을때는 동감하면서 빙그레 웃게됐다.
예상대로 Flex에 대한 개발인력이 부족한탓에 화면설계자는 여전히 html 방식이고, 고객은 Flex의 리치한 사용법을 알수가 없고, 개발자는 자바베이스 인력과 플래시 액션 베이스 개발자 양쪽다 필요하다는 어려움을 말했었다. 십분 이해한다.언제나 새로운 기술이 도입되는 시점에 항상 겪게되는 문제이다.

ps.
세션이 끝나고 스피커의 질문에 대답하면 경품을 줬었다, 두개를 탓는데 나중에 보니 옷은 설문지 쓰면 주는거고 무선 인터넷 감지기는 쓸모가 없다,미나토에게 생색내고 줘버렷다.결정적으로 작년과 똑같이 점심이 부실했다.
2006/11/20 11:49 2006/11/20 11:49