반응형
1. 프로젝트를 만든다.
    프로젝트명 : WindowBasedSample
    프로젝트 생성시 처음 만들어지는 파일은 일종의 엔트리 포인트로 생각한다.
    WindowBasedSampleAppDelegate.h
    WindowBasedSampleAppDelegate.m

2. nib 파일(화면)을 만든다.
    Interface Builder 를 실행하여 View 타입으로 생성하여 WindowBasedSample 프로젝트 디렉토리에 저장한다.
    파일명 : HelloWorldView.xib
    Library 창에서 원하는 view object 를 선택하여 View 창에 드래그&드랍으로 화면을 만든다.

3. HelloWorldView.xib 화면을 연결할 UIViewController 파일을 만든다.
   Xcode 에서 File -> New File 을 선택하고 타입을 UIViewController subclass 로 선택한다.
   파일명 : HelloWorldViewController

4. HelloWorldView.xib 화면과 HelloWorldViewController 를 연결한다.
    HelloWorldView.xib 의 Document 창에서 File's Owner 를 선택하고 Identity Inspector 창을 띄운다.
    class identity 의 클래스에서 HelloWorldViewController 를 선택한다.
    Connections Inspector 창에서 Outlets 의 view 속성을 드래그해서 Document 창의 View와 연결한다.
    
5. WindowBasedSampleAppDelegate.m 에서 HellowWolrdView.xib 를 로딩한다.
    -(void) applicationDidFinishLaunching 메소드에서 자신의 view를 window view 에 세팅한다.

로딩 순서 및 연결고리를 보면.....

1. main.m
2. MainWindow.xib
3. WindowBasedSampleAppDelegate.m
4. HelloWorldView.xib
5. HelloWorldViewController.m



  
반응형
Posted by seungkyua@gmail.com
,
반응형
Class                : 설명이 필요없겠죠.. 우리가 알고 있는 클래스 그 자체입니다.
Class Object      : 클래스에 단 하나밖에 없는 객체로 인스턴스를 만들 때 필요한 정보를 가지고 있는 객체입니다.
                          내부적으로 존재하는 객체로 보시면 되고 Factory Object 라고도 합니다.
                          클래스에서 접근하는 메소드는 사실 클랙스 객체의 메소드로 접근한다고 생각하면 됩니다.
                          클래스 객체는 타입으로는 클래스와 같습니다.
Class Method    : 클래스 객체에서 접근가능한 메소드입니다. 인스턴스가 없어도 클래스 객체로 직접 접근 가능
                          합니다.
Instance            : 클래스 객체로 부터 생성되어 메모리에 할당된 객체입니다.


@interface Artist : NSObject
{
    NSString *name;      // instance variable
    static int age;        // class varialbe
}
- (NSString *) name;   //  instance method
@end


#import "Artist.h"

@implementation Artist

- (NSString *) name    //  instance method
{
    return name;
}
- (void) init             //  instacne variable 초기화
{
   name = @"ASK";
}
+ (void) initialize   // class variable 초기화
{
     static BOOL initialized = NO;
    if ( ! initialized )
    {
 
         age = 20;
         initialized = YES;
     }
}
@end

반응형
Posted by seungkyua@gmail.com
,

Flex Troubleshooting

Flex 2010. 9. 9. 14:24
반응형
Flex 로 웹 프로그래밍을 할 때... 특히 게시판과 같은 시스템을 만들 때 고려할 점~~

1. Flex 위에 게시물 상세정보(HTML) 이 보여줘야 한다.
   (1층 : Flex, 2층 : HTML 상세정보)
2. 상세정보를 스크롤 할 때 상세정보 내용이 스크롤 되면서 상단위 플렉스 영역을 침범하면 안된다. 
3. 게시물을 작성할 때 javascript 에디터나 ActiveX 컨트롤을 사용한 에디터를 사용한다.
4. 게시물 저장 버튼을 클릭할 때 확인 메세지가 레이어로 떠야 한다.
    (1층 : Flex, 2층 : ActiveX, 3층 : Flex 레이어 팝업)
5. Flex 의 로딩시점과 ActiveX의 로딩시점이 꼬이지 않게 정확한 로딩 순서를 보장해야 한다.
6. 포커스 처리
    (처음 창이 뜰 때와 탭등으로 포커스 이동 등)
7. Drag & Drop 기능을 사용할 때 잔상이 안남게 하는 방법
8. swf 로딩을 이용한 모듈과의 LocalConnection 사용 시 자주 끊길 수 있는 문제

적어도 이 정도를 고려하지 않으면 Flex 로 HTML 내용을 저장하는 게시판 만들 생각하지 마세요..

근데.. 저희는 해결했습니다.. ^^
반응형
Posted by seungkyua@gmail.com
,

Telnet, Proftp 설치

Linux/Ubuntu 2010. 8. 14. 23:57
반응형
텔넷은 설치가 쉬었는데.. Proftp 는 정말 삽질 많이 했습니다..^^

//----------------------------------------
//--  Telnet 설치
//----------------------------------------
# sudo apt-get install xinetd
# sudo apt-get install telnetd

//------- telnet을 xinetd에 추가
# vi /etc/xinetd.conf
defaults
{
}

service telnet
{
   disable = no
   flags = REUSE
   socket_type = stream
   wait = no
   user = root
   server = /usr/sbin/in.telnetd
   log_on_failure += USERID
}

//------- xinetd 재시작
# service xinetd restart

문제가 발생하면 다음의 로그를 보면 됩니다.
# tail -f /var/log/syslog

//----------------------------------------
//--  Proftpd 설치
//----------------------------------------
# sudo apt-get install proftpd

화면에 standalone 과 xinetd 선택이 나오면 xinetd 를 선택합니다.

//------- proftpd을 xinetd에 추가
# vi /etc/xinetd.conf

service ftp
{
   disable = no
   flags = REUSE
   socket_type = stream
   wait = no
   user = root
   server = /usr/sbin/proftpd
   log_on_success += DURATION USERID
   log_on_failure += USERID
   nice = 10
}

//------- xinetd 재시작
# service xinetd restart

//------- 방화벽 열기
# sudo ufw allow 21/tcp


반응형
Posted by seungkyua@gmail.com
,
반응형

정말 공감가는 말이다..

아키텍트 우습게 봤는데 꼭 그런것 만은 아니군..


최종 사용자의 기능별로 나뉜 컴포넌트 기반의 아키텍처는 다른 기능에 영향을 미치는 물리적 요소와 관련된 변경일 경우만 제외하면 기능의 변경용이성 측면에서는 매우 좋을 것이다..

...

이와 같은 기능 기반의 아키텍처는 컴포넌트 재사용이나 데이터 공유가 쉽지 않고, 구현 측면에서도 그리 효율적이지 않다.

- 렌 베스

딱 우리 시스템 보고 한 말이네.. 그러니 컴포넌트별 제품으로 팔기 어렵지...
반응형
Posted by seungkyua@gmail.com
,
반응형

event 의 속성에 보면 target 과 currentTarget 이 있는데 이것이 의미하는 바는 다음과 같다.

currentTarget  = listener 를 등록하여 event를 받을려고 하는 Object
target = event 를 dispatch 시키는 Object

예를 들어 list 컴포넌트에 각 row를 나타내는 render를 addChild 했을 경우 row 를 클릭했을 때
render 가 먼저 click 을 받아서 dispatch 시키므로 target 은 render 가 된다.
이 때 list 에 addEventListener를 등록했다면 currentTarget 은 list 가 된다.
반응형
Posted by seungkyua@gmail.com
,
반응형
아주 우연한 기회에 플렉스 프로젝트를 시작하면서 간만에 실력있는 사람들을 만난것 같다.
ActionScript 를 이용하여 가벼운 Framework 를 만들었는데 이를 이용하면 Flex 를 대체하여 시스템을 개발할 수 있다.
향후 이 Framewokr를 오픈소스를 오픈할 생각이라고 하니 지금 프로젝트를 하면서 하나 하나 알게된 내용을 조금씩 적을까 한다..

물론 업체의 저작권을 생각해서 세부적인 내용을 제외하고 내가 나중에 찾기 편하게 참고가 될만한 내용만 적을 것이다.

[최초 생성 될 때]

createChildren() -> onStageOnce() -> invalidateProperties() -> commitProperties() ->
addLifeCycleHandler() -> lifeCycleHandler() -> updateDisplayList() -> creationCompleted()

[라이프사이클 등록]

invalidateProperties() 나 commitProperties() 를 통해서 등록


[라이프사이클]

commitProperties() -> measure() -> updateDisplayList()


[메소드 호출]

1. set width(), height() -> updateDisplayList()
2. get width(), height() -> lifeCycleHandler() -> commitProperties() -> measure()
3. invalidateSize(), invalidateWidth(), invalidateHeight() -> measure()
 
measure() -> measuredWidth() -> measuredHeight() -> setSize()
setSize() -> updateDisplayList()

반응형
Posted by seungkyua@gmail.com
,
반응형

네트워크 이론을 아세요?
1950년대 그 이전에도 네트워크 이론은 존재했습니다. 그러나 그 에 대한 개념이나 증명이 완벽한 것은 아니었죠..
1967년 하버드대 교수인 스탠리 밀그램(Stanley Milgram)은 어떤 집단에서도 6단계만 거치면 모두 연결된다는 이론을 발표했습니다.(Six Degrees of Separation)
이에 1994년 올브라이트 칼리지의 세 학생 (Craig Fass, Brian Turtle, Mike Ginelli) 는 케빈 베이컨의 6단계 게임 (Six Degrees of Kevin Bacon) 이라는 게임을 만들어 인터넷에 올립니다. 어떤 헐리우드 배우도 6단계만 거치면 역시 헐리우드 배우인 케빈 베이컨과 연결된다는 게임입니다. 물론 모두 영화, 드라마, 광고등 함께 작업을 한 배우만 연결을 시킨거죠.

1998년 미국 코넬 대학 수학자인 스티븐 스트로가츠와 컬럼비아 대학 수학자인 던컨 와츠는 케빈 베이컨의 6단계 게임 자료를 바탕으로 어느 집단이든 (예를 들어 전력 송전망, 생물의 신경망등) 특별한 연결고리만 있으며 (여기서는 일종의 지름길) 몇단계 안에 모두 연결되는 좁은 세상을 만들어 낸다는 사실을 확인했습니다.

1999년 미국 노트르담 대학의 물리학자 알버트 라즐로 바라바시(Albert-Laszlo Barabasi) 교수는 인터넷 월드 와이드 웹을 연구 하였습니다. 처음 그는 표준편차가 있는 분포도 그래프를 생각했다고 합니다. 즉 평균적 수의 웹페이지가 평균적인 링크를 가지고 연결된다고 생각한 것이죠.. 그러나 그는 대다수 웹페이지가 소수의 링크만을 갖고 있는 반면 몇몇 페이지는 엄청나게 많은 수의 웹페이지들과 연결돼 있다는 걸 발견했습니다. 즉, 유난히 많은 링크가 몰려있는 허브를 발견하고 모든 네트워크에서의 연결은 허브를 중심으로 연결된다는 것을 네이처지에 발표했습니다. 또한 바라바시 교수는 스티븐 스트로가츠와 던컨 와츠에게 케빈 베이컨의 6단계 게임 데이터를 받아 이를 다시 한 번 검증하였습니다.
바라바시 교수는 자신의 논문에 의해 앞으로 구글, 아마존과 같은 허브 사이트가 나올 것을 예견하기도 했습니다.
사실 스티븐 스트로가츠와 던컨 와츠는 분포도만 조사해 봤어도 먼저 발표할 수 있는 논문이었습니다.

이제 네트워크는 허브를 중심으로 6단계 안에 연결되는 구조라는 것을 모두가 알게 되었습니다.

그럼 이제 이론을 우리 주위에 접목해 볼까요?

혹시 여러 분들은 자신은 이름만 들었지만 인터넷 상에서는 유명한 IT 전문가를 알고 계십니까?
Flex, Java, 닷넷, 방법론, 웹표준 등 소위 에반젤리스트라 불리는 사람들을 잘 알고 있을 것입니다..
이들은 자신의 블로그나 동호회 사이트로 허브의 역할을 하며 많이 알려졌죠..
이제 6단계만 거치면 모두 이들을 알고 있을 것입니다.
하지만.. 그 유명한 전문가가 만약 프로그래머이거나 아키텍트라면 소문만 믿고 따르지는 마세요..
대부분은 평범한 실력에 허브사이트를 통해 유명할 뿐인 경우가 많습니다.
반드시 실력을 통해 확인하십시오.. 더욱이 프로젝트를 같이할 경우라면 인성까지도 확인하세요..
낭패보기 쉽습니다..^^

반응형
Posted by seungkyua@gmail.com
,
반응형
Flex 단위테스트는 FlexUnit 을 사용한다.
FlexUnit은 버전 4 가 현재 진행중이며 아래의 사이트에서 다운 받을 수 있다.

FlexUnit4 beta 2.0 다운받기 <- 요기를 클릭

FlexUnit4 사용법을 위해서 Adobe Flex Development Tool 인 Flex Builder 3 를 설치하여 Flex Sample 프로젝트를 만든다. (프로젝트명 : FlexUnitSample)

FlexUnit4 의 압축을 풀어 lib 디렉토리에 있는 FlexUnit1Lib.swc, FlexUnit4.swc, FlexUnit4UIRunner.swc 파일을 복사하여 Sample 프로젝트의 lib 디렉토리에 복사한다.

Unit Test 는 아래 절차에 따라 진행한다.

  1. Test Case 클래스를 만든다.
  2. 비즈니스 클래스를 만든다.
  3. Test Suite 를 만들어 Test Case를 등록한다.
  4. mxml 파일에 Test Suite 를 생성하여 실행한다.
  5. 이후 진행은 일반 TDD 방법과 동일하다.


1. Test Case 클래스 만들기..

package simple {
    import flexunit.framework.TestCase;
   
    public class BankAccountTest extends TestCase {
             
       public function testDeposit():void {
          var bankAccount:BankAccount = new BankAccount();
          bankAccount.deposit(100);
          assertTrue("100원을 입금하면 100원이 저축된다", bankAccount.getBalance() == 100);
          bankAccount.deposit(25);
          assertEquals("25원을 추가로 입금하면 125원 이다", 125, bankAccount.getBalance());
       }
     
       public function testWithdraw():void {
          var bankAccount:BankAccount = new BankAccount();
          bankAccount.deposit(100);
          bankAccount.withdraw(25);
          assertTrue("백원을 저축하고 25원을 찾으면 남은 돈은 75원 이다",
                           bankAccount.getBalance() == 75);
       }
    }
}

2. 비즈니스 클래스 만들기.

package simple {
 
  public class BankAccount {
    private var balance:Number = 0;
   
    public function deposit(amount:Number):void {
      balance = balance + amount;
    }
   
    public function withdraw(amount:Number):void {
      balance = balance - amount;
    }
   
    public function getBalance():Number{
      return balance;
    } 
  }
}

3. Test Suite 만들기

Test Suite 은 두가지 방식으로 만들 수 있다.
첫번째 방식은 초기 버전 방식 그대로 suite() 메소드를 static 으로 만들어 제공하는 것이다.

package simple {
    import flexunit.framework.TestSuite;
  
    public class AllFrameworkTests {
    
        public static function suite() : TestSuite {
            var testSuite:TestSuite = new TestSuite(); 
           
            testSuite.addTestSuite( BankAccountTest );
           
            return testSuite;
        }
    }
}

또 다른 방법은 클래스의 변수로 선언하는 것이다.

package simple {
    import simple.BankAccountTest;
    
    [Suite]
    [RunWith("org.flexunit.runners.Suite")] 
    public class FlexUnit4Suite {
        public var testDeposit:BankAccountTest;
        public var testWithdraw:BankAccountTest;
    }
}

4. mxml 파일 만들기

Flex 프로젝트를 만들면 디폴트로 FlexUnitSample.mxml 파일이 생성되어 있을 것이다.
이를 아래와 같이 수정한다.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="runMe()" xmlns:flexUnitUIRunner="http://www.adobe.com/2009/flexUnitUIRunner"
    styleName="flexUnitApplication" >
 
    <mx:Script>
        <![CDATA[
            import simple.BankAccountTest;
            import simple.FlexUnit4Suite;
            import simple.AllFrameworkTests;
            import mx.logging.LogEventLevel;
            import org.flexunit.internals.TextListener;
            import org.flexunit.listeners.UIListener;
            import org.flexunit.runner.Request;
            import org.flexunit.runner.FlexUnitCore;
           
            private var core:FlexUnitCore;
        
            public function runMe():void {

                core = new FlexUnitCore();
                core.addListener( new UIListener( uiListener ));
                core.run( FlexUnit4Suite );

            }
        ]]>
    </mx:Script>
    <mx:Style>
        Application {
            backgroundColor: #3872b2;
            backgroundGradientColors: #3872b2, #0c1a3d;
            backgroundGradientAlphas: 1, 1;
            themeColor: #ffffff;
            color: #444444;
            fontFamily: "Myriad Pro Semibold";
            fontSize: 12;
        }
    </mx:Style>
   
    <flexUnitUIRunner:TestRunnerBase id="uiListener" width="100%" height="100%" />
 
</mx:Application>

runMe() 메소드를 보면 FlexUnitCore 클래스를 생성해서 UI 리스너를 등록한 후 Suite 를 돌리는 것을 알 수 있다.
리스너는 UI 리스너와 Text 리스너가 있어 둘중에 하나 편하게 사용하면 된다.

Text 리스너를 사용하고 싶다면 아래와 같이 등록하면 된다.

core.addListener( TextListener.getDefaultTextListener( LogEventLevel.DEBUG ) );

Suite 는 3번에서 만든 두가지를 다 등록할 수 있다.
앞에서는 변수 방식의 Suite 를 표현했으니 이번에는 suite() 메소드로 만든 Suite 를 등록해 보자.

core.run( AllFrameworkTests );

Suite 대신 Test Case 클래스를 직접 등록하여 사용할 수 도 있다.

core.run( BankAccountTest );

혹은, Test Case 클래스의 특정 메소드만 사용할 수 도 있다.

core.run( Request.method( BankAccountTest, "testDeposit" ) );

이제 디버그 모드로 실행하면 아래와 같은 성공적인 화면을 볼 수 있다... 짜~잔~~

반응형
Posted by seungkyua@gmail.com
,
반응형

유튜브에 올라온 인터넷버전...^^

반응형
Posted by seungkyua@gmail.com
,