태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

 

 

 

 
분류 전체.. (1308)
마이크로소.. (132)
민수네 가족 (17)
호랭이 사.. (141)
열이아빠의.. (7)
PlayPhone (98)
NetworkON (1)
ratharn의.. (10)
큐브 해법 (10)
사람들 (6)
개발 이야기 (94)
아이티 이.. (539)
영어 이야기 (2)
좋은책 이.. (8)
대기중인.. (1)
발명 이야기 (2)
건강하게.. (15)
아이폰  개발자  삼성전자  구글  호랭이  LG전자  마이크로소프트  마이크로소프트웨어  마소  블로그 
 free offers
└>free offers
 online pharma..
└>online pharma..
 Go here
└>Go here
 visit my webp..
└>visit my webp..
 Go Source
└>Go Source
«   2021/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
+ ITViewpoint
+ 도이모이
+ with okgosu
+ 학주니닷컴
+ 열이아빠의 R⋯
+ Gsong.s Blog
+ 비주얼스튜디⋯
+ 광파리의 글⋯
+ LovedWeb
+ 블루오션의⋯
+ 울지 않는 벌새
+ PC 지존
+ 디지털통
+ 아크비스타
+ 고독한 프로⋯
+ Total : 2,100,733
+ Today : 2
+ Yesterday : 11
  

 

 

 

이창신 _해당되는 글 7건
2010.02.01   아이폰 블록격파 게임 만들기 
2009.12.18   실전 아이폰 게임 개발 준비하기 
2009.02.03   2009년에 주목할 IT 테크놀로지-2 [모바일 애플리케이션] 
2008.11.27   마감임박!!! 개발자 창의력 강화 프로젝트!!! 
2007.12.04   대한민국 오픈소스 대축제 ‘Winter of Code 2007’ 오픈 (6)
2007.11.06   자신의 공도 남의 것으로 돌리는 겸손함의 달인 '이창신' (8)
2007.08.31   핑계 대지 마라. 열정 vs 현실. (1)

 

아이폰 블록격파 게임 만들기
+   [PlayPhone]   |  2010. 2. 1. 07:44  


속속 아이폰 앱스토어의 개발자 성공 스토리가 소개되는 가운데 회사 일과는 별도로 아이폰 앱이나 게임 개발을 준비하는 소프트웨어 개발자들을 자주 보게 됩니다. 그 덕분인지 요즘 아이폰이나 안드로이드 개발자 좀 구해달라는 요청도 많이 받게 되는데요. 물론 아이폰 앱을 만든다고 모두가 억만장자가 될 수 있는 것은 아닐테지만 개발자와 침체되어 있던 중소 개발사들에 활력소가 되어주고 있는 것만은 확실한 듯합니다. 이처럼 아이폰 앱이나 게임 개발을 준비하는 분들을 위해 월간 마소에서는 매달 아이폰과 안드로이드 개발 방법을 연재하고 있는데요. 이중에 재미있는 글을 하나 옮겨봅니다. 아이폰 개발을 준비하고 계시는 분들께 도움이 되면 좋겠습니다.

출처| 아이마소 |

지난 시간에는 cocos2d를 이용하여 벽돌 깨기의 기초가 되는 공과 막대를 그리고 움직여 보았다. 이번 호에서는 그 뒤를 이어서 벽돌을 그리고 공과 벽돌의 충돌과 격파를 실현해보려 한다. 그럼 본론에 들어가기에 앞서 cocos2d 관련 이야기들을 풀어본다.

이창신 iasandcb@gmail.com, http://ias.myid. net|현재 모바일 애플리케이션 개발에 몰두하고 있다.

cocos2d의 새 버전이 역시나 지난 달 필자가 원고를 마감한 후 출시되었다. 주요 변경사항은 다음과 같다.

- 사운드 엔진이 OGG Vorbis 형식의 파일을 지원하게 되었다.
- AtlasSprite와 TextureAtlas의 많은 향상이 이루어졌다.
- 액션과 스케줄러의 성능과 안정성 또한 향상되었다.
- 물론 그밖에도 많은 버그 수정과 개선이 있었다.

cocos2d 0.7.2

특히 아틀라스 쪽과 액션·스케줄러 쪽은 cocos2d를 사용하는 많은 개발자들의 열성적인 피드백과 참여가 있었다.

이런 점에서 cocos2d 프로젝트는 매우 성공적으로 진행되고 있다고 볼 수 있는데, 지난 4월 말에 미국 앱스토어 유료 애플리케이션 1위를 차지한 StickWars라는 애플리케이션이 cocos2d를 쓴 것으로 알려지며 개발자들이 이를 무척이나 반기는 분위기다.

아이폰 OS 3.0과의 호환성

이미 아이폰 개발 프로그램에 가입한 개발자들에게는 공지가 나갔는데, 앞으로 출시할 애플리케이션뿐만 아니라 기존 애플리케이션들도 모두 아이폰 OS 3.0과의 호환성을 테스트해야 한다.

애플의 이렇듯(?) 과감한 업그레이드 정책은 예전부터 유명한데(몇 년 전에는 매킨토시의 CPU를 PowerPC에서 인텔로 바꾸면서 유니버설 바이너리 제공을 사실상 의무화했었다), 앞으로 나올 아이폰에 기본 탑재될 OS 버전인 만큼 개발자 스스로도 신경 써야 할 부분이기도 하다.

cocos2d를 기반으로 만든 애플리케이션의 경우, cocos2d 자체의 아이폰 OS 3.0과의 궁합이 무척 궁금할 것이다.

마침 http:// code.google.com/p/cocos2d-iphone/wiki/SDKCom patibility3_0에 정리되고 있는데, 요약하자면 이에 심각한 문제는 없다. cocos2d와의 호환성이 이제 애플도 신경써야 할 만큼 중요한 사안이어서 아이폰 OS 3.0 정식판 출시 전까지 말끔히 해결될 것으로 보인다.

더불어 아마도 이달 말쯤 나올 cocos2d 0.8부터 이런 호환성 문제를 대체로 해결한 상태이니 cocos2d를 사용하여 아이폰 OS 3.0 애플리케이션을 개발하는 경우에는 0.8(또는 SVN 리비전으로는 909 이후)을 사용하기를 권한다.

프로젝트 템플릿

지난 달에 소개했던 cocos2d 프로젝트 템플릿은 0.7.1 기준이라 이번에 나온 0.7.2를 쓸 수 없다.

결국 템플릿을 따로 만들어야 하는데, 마침 http://groups.google.com/group/cocos2d-iphone-discuss/browse_thread/thread/a9ce5d5733 af2d54/4bd99d0ef9f3c380에 cocos2d 프로젝트 템플릿을 만드는 좋은 방법이 나와 이번 글에 소개하려 한다.

먼저 http://cocos2d-iphone-discuss.googlegroups.com/ web/cocos2d-template_0_7_2.zip을 받아 적당한 곳에 압축을 풀면 cocos2d라는 디렉토리가 생기고 그 밑으로 내용물이 생겨난다.

이후 터미널에서 다음과 같이 디렉토리를 생성한다(혹시 아이폰 SDK를 기본 디렉토리에 설치하지 않았다면 해당 디렉토리로 잡아주길 바란다).

mkdir -p “/Developer/Platforms/iPhoneOS.platform/Developer/ Library/Xcode/Project Templates/Game”

이어서 조금 전 압축을 푼 cocos2d 디렉토리 이하를 위에서 생성한 디렉토리(/Developer/Platforms/iPhoneOS.platform /Developer/Library/Xcode/Project Templates/Game)로 복사한다. 그런 후에 Xcode를 실행하고 Preferences -> Source Trees(상단 탭에 있음)를 선택한 다음에, 하단의 + 버튼을 눌러 Setting Name은 COCOS2D_ROOT, Display Name은 cocos2d, Path는 자신의 cocos2d가 있는 디렉토리를 각각 입력한 후 적용한다.

이제 확인을 위해 File -> New Project를 선택하면 Game 카테고리에 cocos2d가 나온다.


 

그럼 서론을 마치고 본격적인 과정에 돌입해보자.

회고

 

바로 이 달의 이야기를 시작하려는 찰라, 이번 호부터 연재를 보는 독자에게는 정말이지 생뚱맞아 보일 수도 있고 또 지난달부터 따라온 독자라도 복습 차원에서 지난 시간의 내용을 되돌아볼 필요가 있겠단 생각이 든다.

따라서 지난 이야기를 잠시 해본다. 먼저 cocos2d 템플릿으로 BrickBreak라는 프로젝트를 생성한 다음, <리스트 1>의 코드로부터 시작하자(모두 프로젝트의 Classes 밑으로 들어간다).

<리스트 1> BrickBreakAppDelegate.h

    #import <UIKit/UIKit.h>
    #import "cocos2d.h"
    @interface BrickBreakAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;

    }

    @property (nonatomic, retain) UIWindow *window;
    @end

<리스트 2> BrickBreakAppDelegate.m

    #import "BrickBreakAppDelegate.h"
    #import "GameScene.h"
    @implementation BrickBreakAppDelegate

    @synthesize window;
    - (void)applicationDidFinishLaunching:(UIApplication *)application {
    // NEW: Init the window
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [window setUserInteractionEnabled:YES];
    //[window setMultipleTouchEnabled:YES];
    //[[Director sharedDirector] setLandscape: YES];
    [[Director sharedDirector] setDisplayFPS:YES];
    [[Director sharedDirector] attachInWindow:window];
    [window makeKeyAndVisible];
    [window release];
    [[Director sharedDirector] runWithScene:[GameScene node]];
    }

    - (void)dealloc {
    [window release];
    [super dealloc];
    }

    - (void)applicationWillResignActive:(UIApplication *)application {
    [[Director sharedDirector] pause];
    }

    - (void)applicationDidBecomeActive:(UIApplication *)application {
    [[Director sharedDirector] resume];
    }

    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    [[TextureMgr sharedTextureMgr] removeAllTextures];
    }

    @end

<리스트 3> GameScene.h

    #import <Foundation/Foundation.h>
    #import "cocos2d.h"

    @interface GameScene : Scene {
    }

    @end

    @interface GameLayer : Layer {
    int ballX;
    int ballY;
    int deltaX;
    int deltaY;
    int barX;
    int barY;
    BOOL isBallMoving;
    Sprite *ball;
    Sprite *bar;
    }

    @property (nonatomic, retain) Sprite *ball;
    @property (nonatomic, retain) Sprite *bar;

    - (void)move:(ccTime)delta;
    @end

<리스트 4> GameScene.m

    #import "GameScene.h"
    #import <QuartzCore/QuartzCore.h>

    CGImageRef CreateRectangleImage(int pixelsWide, int pixelsHigh, float red, float green, float blue, float alpha, BOOL wantCircle) {

    CGImageRef theCGImage = NULL;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef theBitmapContext = CGBitmapContextCreate (NULL, pixelsWide, pixelsHigh,
      8, 0, colorSpace, kCGImageAlphaNoneSkipFirst);
    if (theBitmapContext != NULL) {
    CGContextSetRGBFillColor(theBitmapContext, red, green, blue, alpha);

    if (wantCircle) {
    CGContextFillEllipseInRect(theBitmapContext, CGRectMake(0, 0, pixelsWide, pixelsHigh));
    } else {

    CGContextFillRect(theBitmapContext, CGRectMake(0, 0, pixelsWide, pixelsHigh));
    }
    theCGImage=CGBitmapContextCreateImage(theBitmapContext);
    CGContextRelease(theBitmapContext);
    }

    CGColorSpaceRelease(colorSpace);
        return theCGImage;
    }

    @implementation GameScene
    - (id)init {
    if (self = [super init]) {
    [self addChild:[GameLayer node] z:1];
    }
    return self;
    }

    @end
    @implementation GameLayer
    @synthesize ball, bar;

    - (void)move:(ccTime)dt {
    if (ballX < 0 || ballX > 320) {
    deltaX = -deltaX;
    }

    if (ballY > 480 || (ballY < 30 && ballX > barX - 30 && ballX < barX + 30)) {
    deltaY = -deltaY;
    }

    ballX += deltaX;
    ballY += deltaY;
    [ball runAction:[MoveTo actionWithDuration:dt position:cpv(ballX, ballY)]];
    }

    - (id)init {
    if (self = [super init]) {
    CGImageRef ballImage=CreateRectangleImage(20, 20, 1.0, 1.0, 1.0, 1.0, YES);
    self.ball = [[Sprite alloc] initWithCGImage:ballImage];
    ballX = 160;
    ballY = 30;
    deltaX = 1;
    deltaY = 1;
    ball.position = cpv(ballX, ballY);
    [self addChild:ball];
    CGImageRelease(ballImage);
    [self schedule:@selector(move:)];

    CGImageRef barImage=CreateRectangleImage(60, 10, 1.0, 1.0, 1.0, 1.0, NO);
    self.bar = [[Sprite alloc] initWithCGImage:barImage];
    barX = 160;
    barY = 10;
    bar.position = cpv(barX, barY);

    [self addChild:bar];
    CGImageRelease(barImage);
    isTouchEnabled = YES;
    }
    return self;
    }

    - (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView: [touch view]];
    int x = location.x;
    barX = x;
    [bar runAction:[MoveTo actionWithDuration:0.1 position:cpv(barX, barY)]];
    return kEventHandled;
    }

    @end

이 글에 소개된 프로젝트 템플릿을 쓰는 경우에 MenuScene 클래스 코드도 자동으로 생성되는데, 여기에서는 쓰이지 않는다(하지만 지우지는 말 것).

BrickBreakAppDelegate는 일종의 부트스트랩(bootstrap)으로, GameScene이라는 본격적인 게임 화면 처리 클래스를 불러오기 위한 사전 준비 작업을 맡는다. GameScene에서 각각의 쓰임새는 다음과 같다.

- CreateRectangleImage : 주어진 크기와 색의 원과 직사각형을 그린다.
- move : 공을 움직이고 막대와의 충돌을 감지한다.
- ccTouchesEnded : 터치 입력을 받아 막대를 움직인다.

그리고 지난 달 코드와 달라진 부분이 조금 있으므로 앞의 코드로 갱신하기를 바란다. 이쯤해서 회고를 마치고 다음 이야기를 시작한다. 이어서 추가할 것은 바로 벽돌이다.

벽돌

벽돌이 공이나 막대와 다른 점은 다음과 같다.

- 벽돌은 움직이지 않는다.
- 공과 충돌하면 파괴된다.
- 여러 개가 동시에 화면에 나온다.

벽돌은 흰색 정사각형으로, 38×38의 크기를 갖고 화면 중상단에 8개씩 8줄을 깔려 한다. 벽돌 크기를 38×38로 한 것은 한 픽셀씩 여백을 두어 벽돌끼리 붙어 보이지 않게 하기 위해서다.

이를 위해 우선 GameScene.h에 bricks라는 배열을 인스턴스 변수로 추가한다.

<리스트 5> bricks 인스턴스 변수가 추가된 GameScene.h

    #import <Foundation/Foundation.h>
    #import "cocos2d.h"

    @interface GameScene : Scene {
    }

    @end
    @interface GameLayer : Layer {

    int ballX;
    int ballY;
    int deltaX;
    int deltaY;
    int barX;
    int barY;

    BOOL isBallMoving;
    Sprite *ball;
    Sprite *bar;
    NSMutableArray *bricks;
    }

    @property (nonatomic, retain) Sprite *ball;
    @property (nonatomic, retain) Sprite *bar;
    @property (nonatomic, retain) NSMutableArray *bricks;

    - (void)move:(ccTime)delta;
    @end

bricks는 벽돌들을 저장할 곳인데, 동적으로 변경될 것이라 NSMutableArray 타입을 썼다.

참고로 Objective-C(더 정확히는 Foundation 프레임워크)는 대부분의 데이터 컨테이너 타입(심지어 문자열까지)에 불가변형(immutable)과 가변형(mutable)의 구분이 있다.

배열의 경우도 NSArray가 불가변형이며 초기 생성 이후에는 내용물에 변경을 가할 수 없다.

반면 가변형 배열인 NSMutableArray는 생성 후 얼마든지 원소를 추가 및 삭제할 수 있다.


<리스트 6> GameScene.m에서 벽돌 초기화 부분

    @implementation GameLayer
    @synthesize ball, bar, bricks;

    (중략)

    - (id)init {
    if (self = [super init]) {
    CGImageRef ballImage=CreateRectangleImage(20, 20, 1.0, 1.0, 1.0, 1.0, YES);
    self.ball = [[Sprite alloc] initWithCGImage:ballImage];
    ballX = 160;
    ballY = 30;
    deltaX = 0;
    deltaY = 0;
    ball.position = cpv(ballX, ballY);
    [self addChild:ball];
    CGImageRelease(ballImage);
    [ball release];
    [self schedule:@selector(move:)];

    CGImageRef barImage=CreateRectangleImage(60, 10, 1.0, 1.0, 1.0, 1.0, NO);
    self.bar = [[Sprite alloc] initWithCGImage:barImage];
    barX = 160;
    barY = 10;
    bar.position = cpv(barX, barY);

    [self addChild:bar];
    CGImageRelease(barImage);
    [bar release];
    self.bricks = [[NSMutableArray alloc] initWithCapacity:8];

    for (int i = 0; i < 8; i++) {
    NSMutableArray *brickRow = [[NSMutableArray alloc] initWithCapacity:8];
    [bricks addObject:brickRow];

    for (int j = 0; j < 8; j++) {
    CGImageRef brickImage = CreateRectangleImage(38, 38, 1.0, 1.0, 1.0, 1.0, NO);
    Sprite *brick = [[Sprite alloc] initWithCGImage:brickImage];
    brick.position = cpv(j * 40 + 1 + 19, i * 40 + 1 + 19 + 80);

    [self addChild:brick];
    [brickRow addObject:brick];
    CGImageRelease(brickImage);
    [brick release];
    }

    [brickRow release];
    }

    isTouchEnabled = YES;
    }

    return self;
    }

    (후략)

먼저 bricks 프로퍼티의 게터, 세터 생성을 위해 @synthesize에 bricks를 추가했다.

GameLayer의 init 메소드에서 8×8의 이중 루프를 통해 벽돌의 스프라이트를 생성하고 화면에 추가하고 있다.

첫 번째 루프에서는 한 줄에 해당하는 brickRow라는 배열을 생성하여 bricks에 추가하고, 두 번째 배열에서 brickRow에 벽돌 스프라이트를 추가한다.

이때 화면 레이어에도 바로 추가하여 벽돌 데이터뿐만 아니라 화면 초기화도 함께 한다.


격파

지금까지 한 것을 실행해보면 좀 황당한 실행 화면이 나타난다.

공이 벽돌을 그대로 통과하는 것이다! 공을 막대로 쳐내는 것처럼, 공이 벽돌과 부딪히면 벽돌이 파괴되는 처리가 필요하다.

우선 공과 벽돌의 충돌 판정이 필요한데, 앞서 공과 막대의 경우와 같이 move 메소드에서 처리한다.

공과 막대 사이의 충돌과 달리 공과 벽돌은 충돌할 수 있는 방향이 4면이므로 충돌에 따른 반사도 Y 방향 반사와 더불어 X 방향의 반사도 발생할 수 있다.

파괴의 시각적인 효과는 간단히 Sprite 클래스(실은 조상 클래스인 CocosNode)의 visible 프로퍼티를 NO로 설정하는 것으로 구현했다.

따라서 충돌 판정시 이미 visible 프로퍼티가 NO인 벽돌은 바로 다음으로 넘어가야 한다.

<리스트 7> 벽돌 판정이 추가된 GameLayer의 move 메소드

    - (void)move:(ccTime)dt {
    if (ballX < 0 || ballX > 320) {
    deltaX = -deltaX;
    }

    if (ballY > 480 || (ballY < 30 && ballX > barX - 30 && ballX < barX + 30)) {
    deltaY = -deltaY;
    }

    for (NSMutableArray *brickRow in bricks) {
    for (Sprite *brick in brickRow) {
    if (!brick.visible) {
    continue;
    }

    int brickBallDeltaX = brick.position.x - ballX;
    int brickBallDeltaY = brick.position.y - ballY;

    if (brickBallDeltaX < 29 && brickBallDeltaX > -29) {
    if (brickBallDeltaY < 19 && brickBallDeltaY > - 19) {
    brick.visible = NO;
    deltaX = -deltaX;
    }
    }

    if (brickBallDeltaY < 29 && brickBallDeltaY > -29) {
    if (brickBallDeltaX < 19 && brickBallDeltaX > - 19) {
    brick.visible = NO;
    deltaY = -deltaY;
    }
    }
    }
    }

    ballX += deltaX;
    ballY += deltaY;

    [ball runAction:[MoveTo actionWithDuration:dt position:cpv(ballX, ballY)]];
    }

벽돌 초기화처럼 이중 루프가 도는데 문법적으로 foreach에 해당하는 for (Type iterator in arrays) 방식을 써서 간결함을 확보해보았다.

이제 실행해보면 공이 벽돌과 충돌하지 않고 보통의 벽돌 깨기처럼 진행된다.

단, 벽돌이 막대와 가깝게 있으므로 조심할 것(이렇게 한 데에는 다음 달 연재를 위한 복선이 깔려 있다)!

과제

이번에도 독자에게 예제를 보완하는 작업을 과제로 내보려 한다.

첫 번째는 MenuScene이다. 보통 게임은 바로 본 게임 화면을 시작하는 대신, 오프닝 화면으로 한숨 돌리게 한 다음에 게임 시작을 사용자가 명시적으로 할 수 있도록 한다.

MenuScene의 구현은 또한 Scene간의 전환을 공부할 수 있게 해주는 좋은 소재이기도 하다.

두 번째는 게임 오버 처리이다. 공이 막대 밑으로 빠지는 경우에 게임 오버 메시지를 보여주고 처음부터 다시 할지 아니면 메뉴 화면으로 돌아갈지 물어봐주는 센스가 필요할 것이다.

이때 MenuScene에서 주로 쓰이는 MenuItem 등을 활용할 수 있으니 MenuScene 구현은 확실히 쓸모가 많다.

역시나 다음 시간에 필자의 구현과 비교할 수 있는 기회를 제공할 것이다.

6월에는 애플 관련 개발자들의 최대 행사인 WWDC가 열린다.

이 컨퍼런스에서 아이폰 OS 3.0에 대한 공개적인 논의가 또 한번 봇물을 이룰 것으로 보이며, 어쩌면 NDA(비공개 조약)도 풀려 아이폰 OS 3.0에 대해 자유롭게 이야기 나눌 수 있게 될지도 모르겠다.

그 가능성이 현실이 되면 아이폰 OS 3.0의 게임 기능 관련 강화 쪽, 즉 Game Kit에 대해 알아보는 기회를 가져볼 생각이다.





     cocos2d, iPhone, SDK, 개발자, 게임개발, 마소, 마이크로소프트웨어, 블로그, 블록격파, 아이폰, 이창신, 호랭이
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

실전 아이폰 게임 개발 준비하기
+   [마이크로소프트웨어]   |  2009. 12. 18. 10:32  


드디어 한국에도 불기 시작한 아이폰 광풍은 개발자들의 관심을 끌기에도 충분합니다. 이에따라 주변 개발자들 중 전혀 다른 분야에 근무하던 분들까지 아이폰 개발에 관심을 가지거나 직접 아이폰 애플리케이션 개발을 시작하게 되는 경우들을 많이 접하게 되는데요. 그중에는 여러가지 시행 착오를 겪는 분들도 많습니다. 이번 글은 월간 마소에 실린 글 중 이창신 님이 쓰신 글이며, 아이폰 게임 개발을 하기 위해 알아두어야 할 내용들이 잘 정리되어 있습니다. 아이폰 게임 개발을 준비하는 분들께 도움이 되면 좋겠네요. 참고로 이창신 님은 월간 마소 연재를 통해 아이폰 게발과 관련된 노하우들을 독자들에게 제공할 예정입니다.

아이마소 : http://www.imaso.co.kr

최근 한 한국 개발팀이 만든 아이폰 게임이 앱스토어 상위에 올라 화제가 된 적이 있고 아이폰 애플리케이션의 여러 종류 중 가장 인기 있는 것은 단연 게임이기도 하다. 그동안 잘 된다는 말은 많이 들었지만, 막상 가까운 같은 나라에서 히트작이, 그것도 본업(회사원)이 있으면서 개발자와 디자이너 2명의 힘으로 일궈낸 성과라 많은 사람들에게 희망과 자극이 되지 않았나 싶다.

이창신 iasandcb@gmail.com, http://ias.myid.net|현재 아이폰 애플리케이션 개발에 몰두하고 있다.

그래서 막상 아이폰 게임 제작에 뛰어 들어보면 꽤나 난관이 많음을 알게 된다. 일단 개발과 관련된 것만 추려 보면 다음과 같다.

● 아이폰 애플리케이션 개발 기반 마련: 크게 두 가지 문제가 있다.
   - 하드웨어: 일단 맥 컴퓨터가 있어야 한다. 게다가 국내에 아이폰이 들어오지 않아 아이팟 터치를 대신 써야 하는데, 고환율 덕분에 맥과 아이팟 터치 둘 다 매우 비싸다.
   - 소프트웨어: 개발 환경이 매우 낯설다. 개발 언어도 무척 생소한 Objective-C이고, IDE도 Xcode를 쓴다. 이전부터 맥 애플리케이션 개발에 관심이 없었던 경우는 그야말로 ‘듣보잡’ 수준일 수도 있다.
● 아이폰 애플리케이션 개발 기본 습득: 전에는 우리말로 된 책조차도 없어 학습에 애로가 많았지만, 최근 입문 번역서가 나와 한숨 돌릴 수 있게 되었다.
● 아이폰 게임 개발에 필요한 기술 습득: 입문서에서는 자세히 다루지 않은 그래픽스와 사운드 처리 쪽을 더 파야 한다.

그리고 다음과 같은 배경을 가졌다면 앱스토어에 있는 높은 수준의 게임을 보며 갈 길이 먼 것을 깨달을 것이다.

● 전에 게임을 개발해 본 적이 (별로) 없다.
● (자바나 스크립트 언어 같은 환경에 비해) C 언어에 익숙하지 않다.

그러던 차, 게임에도 프레임워크가 있을 터, 우연히 발견하게 된 것이 바로 이 글을 통해 소개할 cocos2d iPhone(이하 cocos2d, 참고로 cocos2d는 파이썬으로 되어 있는 게임 엔진이고, 기본 개념을 따와 Objective-C로 응용해 아이폰에서도 쓸 수 있게 한 것이 cocos2d iPhone이다)이다. 이름에서 알 수 있듯이 이 게임 엔진은 2차원을 대상으로 하고 있다. 혹 3차원 게임 개발에 관심이 있는 독자는 SIO2(http://sio2interactive.com/HO ME/HOME.html)가 3D 엔진으로 cocos2d 격이므로 참고해 보길 바란다.

Hello cocos2d

cocos2d는 2D 게임을 위한 엔진이지만, 흥미롭게도 기반은 OpenGL, 즉 3D 기술이다. 이는 근본적으로 아이폰(아이팟 터치도 동일)에 PowerVR이라는 3D 가속 칩이 들어 있어 3D 처리가 무척 강력하기 때문에, 2D조차도 3D로(즉 3차원에서 한 차원 줄이면 되므로) 처리하는 방식인데, 3D 기능이 강력한 PC나 가정용 게임기에서도 쓰인다. 하지만 그렇게 cocos2d를 쓰기 위해 OpenGL을 알아야 필요는 없다. 되레 게임 개발을 쉽고 편하게 하기 위해 OpenGL과 같은 하부 기술은 상당히 감춰 놓았다. cocos2d의 또 하나의 장점은 코코아 스타일의 API이다. 객체 지향 프로그래밍에 익숙하다면 Objective-C의 기본 감각으로도 충분히 이해할 수 있는 구조여서 자바나 C#과 같은 플랫폼에서 작성하는 기분을 느낄 수 있다. cocos2d는 오픈소스 프로젝트로 http://code.google.com/p/ cocos2d-iphone/에서 진행되고 있으며, 2009년 3월 현재 0.7 버전이 릴리즈되어 있고 곧 0.8과 1.0을 출시할 계획이다.

흥미로운 것은 이 cocos2d 엔진을 만든 사람 자신도 이 엔진을 써서 Sapus Tongue이라는 게임을 만들었다는 사실이다. 엔진이 오픈소스에 무료라서 수익 모델이 없어 보이는데, 아직 관련 자료가 많지 않아 실제 게임 개발에 참고할 만한 예제가 충분치 않다.

cocos2d 준비

cocos2d를 배워보려고 하는 데 있어서 가장 큰 장애라면 역시 문서의 부족이다. 특히 공식 문서라 할 수 있는 프로젝트 문서가 거의 없다(이점은 Ricardo도 인정하고 있다). 그나마 있는 문서들은 많이 흩어져 있는데, cocos2d의 공식 블로그(http:// blog.sapusmedia.com/)에서 문서에 대한 안내 포스트(http:// blog.sapusmedia.com/2009/03/documentation-in-cocos2d. html)에도 가장 먼저 소개된 문서인 cocos2d whitepaper (http://monoclestudios.com/cocos2d_whitepaper.html, 이 문서는 cocos2d를 이용해 게임을 만드는 회사에서 작성한 것)를 참고로 cocos2d 준비를 설명해 보려 한다.
cocos2d는 일종의 라이브러리이므로 쉽게 가져다 쓸 수 있을 것 같지만, 실은 소스를 자신의 프로젝트에 넣어야 한다. 그래서 아예 cocos2d를 이용한 애플리케이션을 만들 때에는 다음과 같은 과정으로 프로젝트를 생성하고 설정해야 한다.

먼저 Xcode를 실행하여 File -> New Project를 선택한 다음, 오른쪽에서 Window-Based Application을 선택하고 Choose 버튼을 누른다. 프로젝트 이름은 HelloCocos2d라고 해보자.

cocos2d 통합

먼저 cocos2d를 받아 적당한 곳에 압축을 푼다. 그리고 앞으로 파일을 추가할 때는 Copy items into destination group’s folder (if needed)는 선택해도 좋지만 압축을 푼 파일의 사본이 프로젝트에 추가되는 것이므로 만약 cocos2d 코드를 한 곳에서 관리하고 싶다면 선택하지 않는 것도 방법이다.

첫 번째, HelloCocos2d 프로젝트로 돌아가 Project -> Add to Project...를 선택하여 cocos2d를 푼 디렉토리로 가서 그 밑의 external 디렉토리를 선택한다. 그러면 팝업 메뉴가 하나 뜨는데 Add 버튼을 누른다. 그러면 프로젝트 뷰의 왼쪽에 external이라는 그룹(폴더 모양)이 생긴 것을 볼 수 있는데, 이 그룹을 펼쳐서 Chipmunk 디렉토리 밑으로 Demo라는 디렉토리가 보이는데 이것을 지운다(지울 때, 위의 Copy items into destionation... 옵션을 선택했다면 Also Move to Trash, 아니면 Delete References를 선택한다).

두 번째, 또 다시 Project -> Add to Project를 선택하여 cocos2d를 푼 디렉토리 밑의 cocos2d 디렉토리를 선택한다(혼동하지 말도록. cocos2d를 푼 디렉토리를 선택하는 것이 아니라 그 밑의 cocos2d 디렉토리를 선택하는 것이다).

세 번째, 이번에는 프로젝트 뷰의 왼쪽 Groups & Files에서 Resources 그룹을 선택하여 컨텍스트 메뉴로 Add -> Existing Files...를 선택한 다음, cocos2d를 푼 디렉토리 밑의 Resources 아래의 Images 디렉토리에 있는 fps_images.png을 선택하여 추가한다.

마지막으로 네 번째, Groups & Files에 Frameworks라는 그룹이 있는데 이것을 선택하여 컨텍스트 메뉴로 Add -> Existing Frameworks...를 선택한 다음 OpenGLES.framework와 QuartzCore.framework을 선택하여 추가한다.

이로써 cocos2d를 사용하는 애플리케이션을 만들 준비가 다 되었다. 그럼 어떤 새로운 기술을 배우더라도 꼭 처음에 등장하는 예제인 ‘Hello World’를 바로 만들어 보자.

Hello cocos2d

<리스트 1>은 지금까지 작업한 결과로 생성되는 HelloCocos2 dAppDelegate.m 파일이다.


<리스트 1>  HelloCocos2dAppDelegate.m의 내용

    //
    //  HelloCocos2dAppDelegate.m
    //  HelloCocos2d
    //
    //  Created by Changshin Lee on 09. 03. 19.
    //  Copyright __MyCompanyName__ 2009. All rights reserved.
    //
    #import "HelloCocos2dAppDelegate.h"
    @implementation HelloCocos2dAppDelegate
    @synthesize window;

    - (void)applicationDidFinishLaunching:(UIApplication *)application {    
        // Override point for customization after application launch
        [window makeKeyAndVisible];
    }

    - (void)dealloc {
        [window release];
        [super dealloc];
    }
    @end


이 파일에 추가해야 할 것은 크게 세 가지다.

첫째, cocos2d를 쓰기 위해 #import “cocos2d.h”를 맨 위에 넣는다.
둘째, cocos2d 엔진의 초기화 코드를 // Override point for ... 부분에 넣는다.
셋째, Hello cocos2d를 출력하는 로직을 구현한다.

<리스트 2>의 코드는 앞서 언급한 세 가지 작업을 마친 것이다. 엔진 초기화는 간단히 주화면인 window를 Director 싱글턴([Director sharedDirector]의 반환값)에 붙이면(attachIn Window) 된다. 이후 코드는 아직 배우지 않은 것들이 많이 나와 생경하지만, 간단히 <그림 1>과 같은 흐름이라 할 수 있다.

 

사용자 삽입 이미지


<리스트 2> 세 가지 작업을 마친 결과

    //
    //  HelloCocos2dAppDelegate.m
    //  HelloCocos2d
    //
    //  Created by Changshin Lee on 09. 03. 19.
    //  Copyright __MyCompanyName__ 2009. All rights reserved.
    //

    #import "HelloCocos2dAppDelegate.h"
    #import "cocos2d.h"
    @implementation HelloCocos2dAppDelegate
    @synthesize window;

    - (void)applicationDidFinishLaunching:(UIApplication *)application {    
    [[Director sharedDirector] attachInWindow:window];   
    Scene *helloScene = [Scene node];
    Label *helloLabel = [Label labelWithString:@"Hello cocos2d" fontName:@"TrebuchetMS" fontSize:40.0f];
    helloLabel.position = cpv(150, 100);
    [helloScene add:helloLabel];
    [[Director sharedDirector] runWithScene:helloScene];
    [window makeKeyAndVisible];
    }

    - (void)dealloc {
        [window release];
        [super dealloc];
    }
    @end


cocos2d의 특징

가장 먼저 눈에 띄는 것은 아이폰 애플리케이션의 기본 구조인 Model-View-Controller의 표준 클래스인 UIView와 UIView Controller를 쓰지 않는 cocos2d 고유의 모델이다. 물론 기존 UIView·UIViewController와 같이 써도 되지만, 쓰지 않고도 완결된 애플리케이션 작성이 가능하다는 점이 독특하다. 그래서 아마 처음 이 모델을 보면 꽤나 적응이 안 될 수도 있는데, 자주 쓰게 되면 자연스럽게 차츰 적응이 된다(필자의 경험상).

또 하나는 좌표계다. UIView의 기본 좌표계는 왼쪽 위 모서리가 (0, 0)이고 오른쪽으로 갈수록 x 좌표가, 아래로 갈수록 y 좌표가 증가한다. cocos2d는 OpenGL 기반의 좌표계를 채용하여 왼쪽 아래 모서리가 (0, 0)이고 위로 갈수록 y 좌표가 증가한다.

좌표계와 더불어 독특한 것이 뷰의 위치 지정인데, 앞의 코드에서 나온 position은 UIView의 frame.origin이 아닌 center, 즉 뷰의 중심을 뜻한다. 뷰의 위치를 좌표로 지정하다 보면 왼쪽 위 모서리에 해당하는 origin이 편할 경우가 있는데, 항상 중심을 지정해야 하므로 계산이 필요할 수 있다.

cocos2d API의 기본 구조

cocos2d 아이폰 버전의 API는 cocos2d 원조(파이썬 버전) API로부터 기본 개념을 가져왔다. 따라서 cocos2d의 개념 파악을 위해서라면 파이썬 버전 기반의 프로그래밍 가이드인 http://www.cocos2d.org/doc/programming_guide/도 충분히 도움이 된다. 이 글에서는 cocos2d API의 핵심 클래스들을 나열하며 소개해 보려 한다.

CocosNode

엔진의 이름과 겹치는 만큼, CocosNode 클래스는 핵심 중의 핵심이다. 이후 나오는 Scene, Layer, Sprite 등 cocos2d 엔진을 바탕으로 돌아가는 그래픽 오브젝트의 뿌리가 되는 클래스이다. 이 클래스에는 position이나 visible과 같은 공통 프로퍼티와 그래픽 오브젝트의 계층 구조를 구성하게 해주는 add, remove와 같은 메소드, 그리고 액션과 스케줄링을 위한 기능까지 들어 있다.

특히 그래픽 오브젝트의 계층 구조는 UIView의 그것과 마찬가지라고 이해하면 쉽다. 따라서 화면을 구성함에 있어 이 계층 구조를 잘 활용하는 것이 관건이기도 하다. 액션에 대해서는 Action 클래스에서 언급하기로 하고 스케줄링에 대해 말하자면, NSTimer와 같이 중앙 집중적인 스케줄링 기능을 이용하는 것이 아니라, 오브젝트마다 분산된 자신만의 스케줄링이 가능하다는 점에서 매력적이다.

Scene과 Director

하지만 앞의 예제에서는 CocosNode 클래스는 나오지 않는다. 대신 Scene과 Director가 나오는데, 클래스 이름이 영화에서 온 것 같아 이해가 쉽다. 먼저 Director는 말 그대로 cocos2d 엔진에 있어 감독 같은 존재이다. 영화에 감독은 보통 한 명이듯이, Director 오브젝트도 하나, 즉 싱글턴(singleton)으로 되어 있어서 항상 [Director sharedDirector] 클래스 메소드 호출로 싱글턴을 얻어 낸다.

감독이 영화 제작에 있어 단위로 삼는 것은 씬(Scene), 즉 장면이다. cocos2d에서도 Scene은 가장 큰 화면 구성 단위이며 Director는 이 Scene 오브젝트 단위로 화면을 표시한다.

Layer

Scene이 게임에 있어 전체 화면을 가리킨다면, Layer는 그 화면을 구성하는 요소요소를 나타낸다. Scene이 영화에서 배경화면이라면, Layer는 배우나 소품에 해당하는 셈이다.

 

사용자 삽입 이미지

Scene과 Layer의 기능상의 가장 큰 차이점은 사용자 입력을 받을 수 있는가이다. 따라서 사용자 입력이 필요 없는 정적인 요소는 Scene에 바로 추가하는 방식을 취하며, Layer는 주로 사용자 입력이 필요한 동적인 요소를 구성하는 바탕이 된다. Layer가 터치 이벤트나 액셀로미터 이벤트를 받으려면 TouchEvents Delegate 프로토콜을 구현해야 한다.

 

사용자 삽입 이미지

Sprite

스프라이트는 게임 개발에 있어 화면상에 움직임이 있는 물체의 단위이며, Sprite 클래스도 바로 그런 의미이다. 스프라이트를 생성하는 방법에는 몇 가지가 있는데, 가장 쉽게 이미지 파일(아이폰에서는 PNG를 주로 쓴다)로부터 생성하며 애니메이션을 위해 하나의 스프라이트에 복수 개의 이미지를 넣을 수 있다. 부가적으로, 앞서 소개했던 PowerVR 3D 가속칩에 최적화된 PVRTC 이미지 파일도 사용할 수 있다.

 

사용자 삽입 이미지

Action

Action은 기본적으로 CocosNode에 액션을 취하게 하는 클래스이긴 하지만, 보통은 게임에서 주로 움직이는 대상인 Sprite에 많이 적용하게 된다. Action에는 크게 InstantAction, IntervalAction, 그리고 RepeatForever가 있는데

- InstantAction은 즉시 실행되고 바로 끝나는 단발성의 액션
- IntervalAction은 일정 시간동안 지속되는 액션
- RepeatForever은 특정 IntervalAction을 무한 반복하는 액션

각 종류별로 무척 다양한 액션들이 제공되어 있어 스프라이트의 움직임을 프로그램으로 작성할 때 무척 편리하다.

cocos2d 기반 게임의 기본 구성

앞서 cocos2d의 핵심 API를 배웠다고 해도, 게임 자체의 개발과 직결되는 것은 아니다. Director - Scene - Layer - Sprite - Action을 개별적으로 사용하여 아주 간단한 게임을 구성할 수 있겠지만(또는 게임의 핵심 부분을 빠르게 구현하는 프로토타이핑도 가능할 것이다), 제품 수준의 게임이라면 <그림 2>와 같은 구도를 갖게 마련이다.

 

사용자 삽입 이미지

<그림 2>를 이루는 요소 하나하나가 Scene이 되는데, 그럼 차례대로 살펴보자.

TitleScene과 MenuScene

게임을 시작하면 보통 화려한 오프닝이 시선을 집중시킨다. 타이틀 화면은 동영상으로 간단하게 처리할 수도 있지만, 여기서부터 인터렉션과 애니메이션이 필요할 경우는 TitleScene의 별도 작성도 요구된다.

타이틀 화면을 마치면 게임의 준비 화면인 메뉴가 나오게 된다. MenuScene은 모든 게임에 필수이므로, 따라서 cocos2d는 Menu와 MenuItem이라는 클래스를 제공하여 메뉴 구성의 편의성을 높이고 있다. Menu는 Layer를 상속하고 있어 당연히 사용자 입력을 받을 수 있는데, MenuItem을 이미지나 텍스트로 추가만 하면 알아서 터치 이벤트를 해당 MenuItem과 연결된 셀렉터(selector)로 이어준다. <그림 2>에서와 같이 메뉴 아이템에는 본 게임, 도움말, 스코어, 설정 등이 있으며 해당 아이템을 터치하면 Director의 replaceScene으로 화면 전환을 해주는 식으로 작성한다. 타이틀과 메뉴를 제외하고 모든 화면은 언제고 메뉴 화면으로 돌아올 수 있어야 하는 점도 간과해서는 안 된다.

GameScene

GameScene은 게임 본편에 해당한다. 여기에 게임 로직이 들어가게 되는데, 게임 오버가 되면 보통 ScoreScene으로 이어진다.

ScoreScene

ScoreScene은 그동안의 점수와 하이 스코어일 경우 이름을 받는 등의 작업이 일어난다.

HelpScene과 OptionScene

HelpScene은 게임을 처음 하는 사람을 위한 안내를 하며, 간단히 그림이나 동영상으로 설명할 수도 있다. OptionScene은 게임의 콘트롤이나 난이도, 사운드 등을 설정하게 해주는 화면이다.

아직 cocos2d에 대한 문서가 많지 않아 배우기가 만만치 않지만, 그래도 뜻이 있는 곳에 길이 있는 법이다. 가장 좋은 학습방법은 실제 cocos2d로 만든 게임 코드를 보는 것이다. 마침 오픈소스로 되어 있는 cocos2d 기반 게임인 Gorillas(http:// gorillas.lyndir.com/trac/wiki/TheSource)가 있어(게임 자체도 꽤 재밌다) cocos2d로 게임을 만들어 보려는 이들에게 최고의 도우미 역할을 해주리라 본다.

더불어 이번 특집에서의 cocos2d 소개에 이어 다음 달부터는 마소의 연재 코너를 통해 cocos2d와 함께 아이폰 게임을 만드는 과정을 좀 더 깊게 살펴보려 하니 아무쪼록 cocos2d의 기초를 잘 닦는 시간으로 4월을 보내고 5월호에서 다시 만나기를 소망한다.


cocos2d의 새 버전 0.7.1

원고를 마소 편집부로 넘기고 난 다음 날 아침, cocos2d의 새 버전인 0.7.1이 나온 것을 알고 받아보니 중요한 변경 사항이 있어 서둘러 추가했다. 본문에도 소개된 CocosNode의 멤버 메소드들 중 코드 표기법에 맞지 않는 메소드들을 대거 교체했다.

[self add:node];        // OLD
[self addChild:node];   // NEW

[self add:node z:0];          // OLD
[self addChild:node z:0];     // NEW

[self add:node z:0 tag:t];          // OLD
[self addChild:node z:0 tag:t];     // NEW

[self add:node z:0 tag:t parallaxRatio];        // OLD
[self addChild:node z:0 tag:t parallaxRatio];   // NEW

[self getByTag:tag];        // OLD
[self getChildByTag:tag];   // NEW

[self remove:node];                    // OLD
[self removeChild:node cleanup:NO];    // NEW

[self removeAndStop:node];                  // OLD
[self removeChild:node cleanup:YES];        // NEW

[self removeByTag:tag];                    // OLD
[self removeChildByTag:tag cleanup:NO];    // NEW

[self removeAndStopByTag:tag];              // OLD
[self removeChildByTag:tag cleanup:YES];    // NEW

[self removeAll];                           // OLD
[self removeAllChildrenWithCleanup: NO];    // NEW

[self removeAndStopAll];                    // OLD
[self removeAllChildrenWithCleanup: YES];    // NEW

[self do: action];          // OLD
[self runAction: action];   // NEW

[self absolutePosition];                   // OLD
[self convertToWorldSpace:CGPointZero];    // NEW

0.7.1에서도 // OLD에 해당하는 옛 메소드를 사용할 수 있지만 비추천(deprecated) 상태이며 0.8부터는 아예 사라진다고 하니 지금부터 0.7.1을 쓰더라도 // NEW에 해당하는 메소드를 쓰기 시작하자. 따라서 본문의 HelloCocos2d 예제 코드에서 [helloScene add:helloLabel];도 [helloScene addChild:helloLabel];와 같이 바꾸는 것이 좋다.






     cocos2d, 개발, 개발자, 게임, 블로그, 소프트웨어, 아이팟, 아이폰, 애플리케이션, 앱스토어, 이창신
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

2009년에 주목할 IT 테크놀로지-2 [모바일 애플리케이션]
+   [마이크로소프트웨어]   |  2009. 2. 3. 10:06  





‘공개’와 ‘공유’를 표방했던 개발 패러다임은 기술의 질적 향상과 확산에는 크게 기여했지만 개발의 가치와 수익 보호라는 측면에서는 문제점을 나타냈다.

이런 한계는 부분적으로 개발자의 동기 약화로도 이어져 이런 상황을 극복할 새로운 대안을 요구하는 목소리가 끊이질 않았다.


이런 상황에서 폐쇄적인 개발 인프라와 소프트웨어 배포 환경을 표방하는 애플 아이폰은 적어도 개발자의 수익 보호라는 측면에서는 매력적인 환경을 갖추고 있다.

아이폰 애플리케이션을 등록 및 판매할 수 있는 루트는 오로지 앱스토어(AppStore)뿐이고, 제한된 인터페이스 외에는 애플리케이션을 얹을 운영체제의 정보도 전혀 알 수 없을 만큼 아이폰은 폐쇄적인 플랫폼이다.

그럼에도 아이폰 애플리케이션 개발에 많은 개발자들이 흥미를 느끼고 있다. 왜 그럴까? 최근 아이폰 애플리케이션 개발에 몰두하고 있는 개발자 이창신 씨는 그 매력을 다음과 같이 설명한다.


“아이폰은 창의적인 아이디어를 직접 실현해 볼 좋은 플랫폼입니다.

좋은 아이디어로 실질적인 수익을 기대할 수 있어 개발자 입장에서는 무척 안전한 시장이라는 의미죠.

사실 PC로 상징되는 지금까지의 컴퓨팅 환경에서는 노력의 대가가 충분히 보호되지 않아 극한의 창의력이 발휘되기 어려웠습니다.

이미 애플리케이션 이용자들이 소프트웨어의 가치에 무감각해진 탓이죠. 하지만 아이폰은 달랐습니다.

소프트웨어를 만드는 이와 사용하는 이들이  더 실질적인 관계를 만들어 훨씬 가치 있는 애플리케이션이 제공될 바탕을 마련하는 데 성공한 것입니다.”



그러나 이창신 씨는 아이폰 애플리케이션의 이런 특성이 국내에서도 유효할지에 대해서는 의문부호를 남겨뒀다.

아이폰이 국내에 출시되더라도 그다지 큰 시장을 형성하지 못할 가능성이 높은데다, 국내 이용자들의 소프트웨어 가치에 대한 인식이 유독 더 낮기 때문.

그가 현재 글로벌 시장을 지향하는 애플리케이션 개발에 주력하고 있는 것도 이런 이유로 풀이된다. 



아이폰은 하드웨어, 소프트웨어, 애플리케이션, 배포 방식 등 거의 모든 면에서 현존하는 가장 우수한 플랫폼 가운데 하나로 꼽힌다.

특히 글로벌 시장에 직접 배포할 수 있다는 점에서 좁은 무대를 아쉬워했던 국내 개발자들에게 더 매력적인 환경이다.

비슷한 시기에 등장한 구글 안드로이드가 아직은 디바이스 시장 볼륨이 크지 않아 국내 애플리케이션 개발자들에게 좋은 기회가 될지 미지수라는 점에서도 아이폰 애플리케이션의 인기는 당분간 이어질 전망이다.

즉 현 시점에서는 모바일 애플리케이션 전체의 강세라기보다는 아이폰 애플리케이션에 국한된 개발만이 화두가 되고 있다고 보는 게 정확할 것이다.




“플랫폼 소스나 애플리케이션 배포 정책에서 비롯되는 여러 가지 폐쇄성에 대해 일반적인 아이폰 이용자들은 관심조차 없고 굳이 알 필요도 없습니다.

오히려 아이폰 하드웨어에 대한 이용자들의 높은 기대감과 만족도가 소프트웨어의 만족도를 덩달아 높여주는 일종의 ‘후광 효과’를 기대할 수 있는데, 이것이 아이폰 개발자에겐 든든한 밑천이 되고 있죠.”



각 지역(국가)의 모바일 플랫폼 시장에서 아이폰의 성패는 해당 지역의 ‘킬러 앱’을 얼마나 확보하는지에 달려 있다는 게 이창신 씨의 설명.

아이폰의 경쟁 상대는 단지 다른 스마트폰이 아니라 PC를 비롯한 모든 디바이스이기 때문이다.

이용자들이 PC에서 즐기던 게임이나 손에 익은 애플리케이션이 인터페이스 방식이나 비용 등을 이유로 아이폰에 흡수되지 않는다면 아이폰은 단지 일부 마니아들을 위한 ‘고급 폰’에 머무를 수도 있다.



애플은 현재 아이폰 애플리케이션의 개발 인프라를 키우는 데 그다지 적극적인 모습을 보이진 않고 있다.

과거 썬이 자바 개발자의 볼륨을 늘리기 위해 다양한 교류를 시도했던 것과 비교하면 전혀 다른 양상이다.

그래서일까?

아이폰 애플리케이션 개발은 여전히 진입 장벽이 높고 그로 인해 빠른 시간 내에 기술 격차가 커질 가능성이 많다.

분명 폐쇄적이다.

그러나 이를 뒤집어 생각하면 먼저 진입해 개발 노하우를 쌓은 이들에게는 매우 좋은 기회가 될 것이다.

‘창의적인 생각을 실현할 플랫폼’이라는 평가를 충분히 되새겨 봐야 할 지금이다.

월간 마이크로소프트웨어에 실린 글을 발췌한 글입니다.
원분은 아이마소홈페이지에서 볼 수 있습니다.




     MSW, 개발자, 마소, 마이크로소프트웨어, 모바일애플리케이션, 아이팟, 아이폰, 아이폰 애플리케이션, 애플, 앱스토어, 월간마소, 이창신
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

마감임박!!! 개발자 창의력 강화 프로젝트!!!
+   [아이티 이야기]   |  2008. 11. 27. 16:53  


기묘에서 재미있는 세미나를 준비하고 있어서 옮겨봅니다.

개발자에게 가장 중요한 요건은 뭘까요?

어쩌면 오래 전에는 개발자들에게 언어를 자유자재로 다루고 활용하는 능력이 더 중요했을지도 모르겠습니다.

하지만 개발자의 창의력은 점점 더 그 중요성이 커져가고 있는데요.

급변하는 고객의 요구사항과 PM과 경영진의 압뷁, 야근과 철야에 파묻혀

꽉 막혀버린 뇌줄기를 '뻥' 뚫어 주기 위해

16년 간 창의력만 연구해 온 창의력의 달인들이 한자리에 모인다고 합니다.

박재호, 이창신, 이재성

이름만 들어도 막 창의력이 넘쳐날 것 같은 세미나 마감일이 며칠 안 남았네요.

어서어서 서두르삼...

 

안녕하십니까? IT 세미나 전문업체 기묘입니다.
기묘의 열번째 세미나에서는 개발자에게 꼭 필요하지만, 누구도 말하지 않았던 소프트웨어 창의력에 대해 이야기하고자 합니다.



누구나 생각의 힘을 통한 창의력을 발휘할 수 있지만, 어떻게, 어떤 상황에서 빛을 발하는지 알지 못하고 있습니다. 그리고 자신은 창의력과 거리가 멀다고 말합니다. 점점 복잡해지는 개발 환경과 프로세스 속에서 개발 진행시의 문제 해결 능력부터 새로운 서비스 개발에 이르기까지 창의력의 필요성과 힘은 강조되고 있습니다.


이번 기묘세미나에서는 현재의 상황에서 최선의 답을 찾기 위해 골몰하는 여러분에게 창의력을 강화할 수 있는 방법을 제시합니다.

 


 

· 일시 : 2008 12 2() 13:00 - 18:00

· 장소 : 도곡동 군인공제회관 23층 온디맨드홀

· 주최 : 기묘

· 후원

    기업후원 :
   
언론후원
:
   
출판사후원 :

· 비용 : 55,000(V. A. T 포함)

 

시간

내용

발표자

13:00 - 13:30

등록

13:30 - 14:50

소프트웨어 개발에 창의력이 필요할까?

박재호

14:50 - 15:00

휴식

15:00 - 16:20

실험정신으로 창의력을 펼치다 - 인디 소프트

이창신

16:20 - 16:40

휴식

16:40 - 17:30

그룹 창의력으로 개발한 서비스

이재성

17:30 - 18:00

Q&A

 

 

앞으로 기묘에서 발송하는 이메일을 수신하고 싶지 않으시다면,

를 클릭해 주십시오.

 

If you don't want this type of information or e-mail, please click the refusal

 





     개발자, 박재호, 이재성, 이창신, 창의력, 창의력 강화 프로젝트, 창의력의 달인
     1   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

대한민국 오픈소스 대축제 ‘Winter of Code 2007’ 오픈
+   [개발 이야기]   |  2007. 12. 4. 13:00  


사용자 삽입 이미지

대한민국 스타개발자들의 드림팀 ‘오픈마루스튜디오가’ WoC 2007(Winter of Code 2007)의 참가접수를 시작했습니다.

오픈소스 프로젝트의 불모지로 불리는 한국에 오픈소스 저변확대와 오픈소스 개발자 육성을 목표로 열리는 WoC 2007의 참가 접수는 12월 3일부터 26일까지 진행되며, 내년 3월까지 각 기업및 단체들과의 멘토링을 통해 WoC프로젝트를 진행할 예정입니다.

재미난 점은 작년에 비해 올 해에는 WOC에 참여하는 기업과 단체가 상당히 늘어났다는 사실입니다.

이번 WoC 2007은 한국소프트웨어진흥원/열린사이버대학교/JCO/인크루트 등이 함께 진행하며, 한국마이크로소프트/IBM/네이버 등에서 후원하고 있는데요. 오픈소스의 선구자임을 자청하는 썬마이크로시스템즈는 없군요. 요즘 썬의 행보에 대해서는 할말이 많지만 여기에서는 주제를 벗어나니 패쑤~

WoC 참가는 고등학생과 대학생이나 대학원생, 휴학생이면 누구나 관계없이 신청할 수 있고요. 겨울 방학을 보람있게 보내며 자신의 가치도 마음껏 놏여 볼 수 있는 기회이니 꼭 도전해 보시길 바랍니다.

WoC 2007은 “Code your Passion”을 슬로건으로 다음과 같은 내용으로 진행될 예정입니다.

▶ 수행 학생에 대한 1:1 멘토링
현업 종사자, 커뮤니티 내에서 유명한 개발자들이 멘토가 되어 학생과 1:1 프로젝트를 진행함으로써 학생들은 우수한 멘토와 프로젝트를 함께 진행하면서 오픈소스 및 프로그래밍에 필요한 지식뿐만 아니라 유용한 노하우들을 배울 수 있으며 선배 개발자와의 인맥을 쌓을 수 있습니다.

▶ 인적 네트워크를 형성할 수 있는 온/오프라인 프로그램
WoC 2007 행사 중 네 번의 오프라인 행사와 온라인 행사를 통해 오픈소스와 관련된 지식과 정보를 얻고, 다른 프로젝트에 참여하는 참가자들과 결과물을 공유하고 관련 정보를 교환함으로써 친분을 쌓을 수 있습니다.

▶ 재정 지원 및 우수 프로젝트 시상
프로젝트 진행에 필요한 재정 지원을 받으면서 학교 수업시간과는 다소 다른 실무형 프로젝트를 수행, 개발자로서 필요한 소양과 지식을 쌓을 수 있으며, 우수 프로젝트는 별도의 상금과 상품을 받을 수 있습니다(여기에서 호랭이는 학교 수업과는 다소 다른 실무형 푸로젝트라는 대목이 학생들에게 참 큰 의미가 될 거라고 생각합니다. 학교에서 전공한 학생들이라도 실무와는 너무나 먼 공부에만 열을 올리고 있는 탓이지요. 가끔 개발트렌드는 안드로메다의 일 쯤으로 여기는 학생들도 있던데... ㄷㄷㄷ).

이 포스트는 호랭이가 출근길 지하철에서 블랙젝으로 작성하는 것이므로 자세한 설명과 오타에 대한 사과는 생략한다.

사용자 삽입 이미지
자세한 내용은 WoC홈페이지(woc.openmaru.com)를 참고하세요.
홍보팀 이메일 : pr@ncsoft.net




     Winter of Code, WoC, WoC 2007, 강규영, 강문식, 엔씨소프트, 오픈마루, 오픈마루스튜디오, 윈터오브코드, 이창신
     0   
BlogIcon 오랜친구 2007.12.04 22:43
저도 멘토링 받고 싶지 말입니다...
BlogIcon 호랭이 2007.12.05 00:27 
오랜친구님은 받기보다 주는 쪽이...
나이로보나 연차로보나 어울리실 듯! ㅎ.ㅎ
BlogIcon そら 2007.12.04 22:59 신고
고등학생과 대학생이나 대학원생, 휴학생이면 누구나 관계없이 신청....

에궁...호랭이님 블로그오면.....하고 싶은데 능력 부족인게 너무 많아요...

그만큼 좋은정보가 많은거겠죠~~ㅋㅋ
BlogIcon 호랭이 2007.12.05 00:28 
ㅎ.ㅎ 뭐 내년에도 할 거니까요. ㅎ.ㅎ
늘 좋은 시선으로 바라봐 주셔서 감사합니다.
요즘 개인적으로 여러 일들이 겹친 탓에 블로그 관리를 잘 못하고 있습니다. 양해 부탁드립니다.
감사합니다.
BlogIcon jef 2007.12.05 02:43
안녕하세요? WoC Staff jef 입니다.
이렇게 직접 저희 WoC 행사를 블로그에서 소개해 주시니 성은이 망극(?)할 따름입니다. :D

말씀처럼 내년에도, 내 후년에도, 그리고 그 뒤에도 계속 이어질 수 있는 행사를 위해 최선을 다하겠습니다.
괜찮으시다면 주위 분들에게 추천도 좀.. ^ ^;;

(덧말: WoC 관련 이야기는 woc@openmaru.com 이 더 빠르답니다!)
BlogIcon 마소호랭이 2007.12.05 03:02 신고 
ㅎ.ㅎ jef 님이 여기까지 행차해 주시다니 ㄷㄷㄷ
아무쪼록 성황리에 잘 진행되고, 좋은 뜻으로 하는 행사이니만큼 좋은 결과 거두시길 바라겠습니다. 감사합니다.

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

자신의 공도 남의 것으로 돌리는 겸손함의 달인 '이창신'
+   [사람들]   |  2007. 11. 6. 16:25  


사용자 삽입 이미지
대한민국 자바 개발자 치고 ‘이창신’이라는 이름 한번 안 들어본 사람이 있을까요?

아파치 커미터, 오픈마루의 플랫폼 오프너, 자바 서블릭 프로그래밍의 역자 등 그의 이름 앞에 붙는 수식어는 참으로 다양합니다.

한 마디로 그는 자바 고수 중 가장 먼저 떠오르는 사람 중 한 사람이지요.
 
하지만 세상에 이렇게 겸손한 사람이 또 있을까요? 원고를 맡기면 글발로 강연을 맡기면 놀라운 흡인력으로, 개발을 할 때는 그 누구보다 뜨거운 열정을 발휘하는 그는 ‘고수’라는 말에는 언제나 손사래를 칩니다.

이제와 고백하는 내용이지만, 작년 초에 이창신 님을 처음 만난 호랭이는 그가 그냥 별볼일 없는 개발자인 줄만 알았을 정도입니다.

왜 사람들은 어느 정도 이름이 알려지게 되면 나름의 자신감이나 자부심 같은 게 생기게 마련이잖아요. 그리고 그런 것들은 다시 행동이나 말투, 눈빛 등으로 흘러나오는 것이 자연스런 일입니다. 하지만, 처음 만난 이창신 씨에게서는 그런 것들이 전혀 느껴지지 않았던 탓이지요.

‘고맙습니다’

이 말은 그가 메일을 보낼 때 빼먹지 않고 말미에 붙이는 말입니다.

고마울 게 하나도 없는 상황에도 그의 이메일 마지막에는 반드시 ‘고맙습니다’라는 말이 붙어있지요(심지어 문자에도).

도대체 뭐가 그리도 고마운 걸까요? 그 속에는 부처라도 들어있는 걸까요? 누군가 자신의 글에 악성 댓글을 달거나 자신을 헐뜯는 메일을 보내더라도 그는 그 답장의 말미에 ‘고맙습니다’라고 쓸지도 모를 일입니다.

전에도 이야기 했지만 11월호 마소 특집 주제는 '수퍼 개발자로 가는 길'이었고요. 이 특집의 원고를 맏기기 위해 만난 이창신 님은 자꾸만 빠져나갈 곳을 찾고 있었습니다.

도무지 ‘고수’라는 말을 이름 앞에 달고 뭔가를 하고 싶지 않다는 얘기였습니다.

하지만 호랭이가 누굽니까? 한 번 물면 원고 써 줄때 까지 놔 주지 않는다고 하여 호랭이 아닙니까.

결국 기사를 억지로 떠넘겼지요. 그런데 원고를 보는 순간...

호랭이의 완패를 인정하지 않을 수 없었습니다.

분명 그에게는 개발자의 능력을 키워줄 수 있는 좋은 노하우들이 잔뜩 있을텐데 그런 이야기는 단 한줄도 써 있지 않았습니다.

하지만 자신이 잘났단 이야기는 단 한줄도 쓰지않으면서 개발자들이 놀랄만큼 성장할 수 있도록 해 주는 비결을 자신의 사례를 통해 잘 써 주었으니...

그 비결은 무엇일까요?

자세한 내용은 마소 11월호 특집을 참고해 주시고요. 요약하자면 수퍼개발자가 되고 싶다면 수퍼개발자를 많이 만나라는 것입니다.

이 이야기는 분명한 사실이라고 생각합니다.

만약 지금 이 글을 읽고 있는 당신이 수퍼개발자가 되고 싶다면 당장 그들을 만나러 가세요.

1년 뒤에 엄청나게 변화되어 있는 자신을 만나게 될 겁니다.

아는 사람이 하나도 없다고요? 그럼 세미나에라도 가서 만나면 되고 블로그에서 악플 쫙쫙 뿌리면서 의견을 나누고 침튀기면서 싸우면 되는 겁니다. 그것도 귀찮다면 마소를 보시면 됩니다. ㅎ.ㅎ

핑곗거리만 찾지말고 할 수 있는 방법을 찾아보면 생각보다 우리 주변에 엄청난 고수들의 노하우를 거저 먹을 수 있는 방법들은 잔뜩 있을 것입니다.

그리고 그 방법들을 실행해 나가다보면 정말 놀라운 역사가 벌어질 것입니다.

여러분~ 파이팅!





     개발 고수, 개발고수, 개발자, 수퍼 개발자, 이창신, 자바 개발자, 자바개발자
     1   
BlogIcon そら 2007.11.06 23:19 신고
자바...들어보긴했지만...ㅠㅠ

학교에서 하는 간단한 프로그래밍도 못하는 전..

너무 먼나라 같네요~~

하지만 분야의 고수를 만나러 다니시는 호랭이님이 너무 부럽네요...ㅋ

고수는 고수만 만난다잖아요~~ㅋ
BlogIcon 큐브호랭이 2007.11.07 00:18
^-^; 그럴리가요. 고수들은 저같은 어리숙한 자들에게 자신들의 지식을 전파하는 걸 즐겨하곤 합니다.
BlogIcon 정주Go 2007.11.07 02:11
차분한 발표와 인상이 무척이나 인상깊었습니다. 같이 있을 기회는 있었는데 인사드릴 기회는 없었네요. 다음에 뵈면 인사드릴려 합니다.
BlogIcon 마소호랭이 2007.11.07 02:14 신고
ㅎ.ㅎ 떡뽁이는 맛나셨습니까? 이 늦은 시간까지 바쁘군요.
토요일에는 뵐 수 있는 건가요? 이매진컵?
BlogIcon 정주Go 2007.11.07 02:31
예 토요일날 학생들을 데리구 가려구요. 이번대회는 더욱 치열할것 같아요~
BlogIcon 큐브호랭이 2007.11.07 07:30
그러면 그럴수록 국제적인 경쟁력 또한 높아지는 것이겠지요.
글머 그날 꼭 뵈요. 파이팅!!!
BlogIcon 산티아고 2007.11.07 08:59
아니 이런. 안사볼수 없게 만드시는..ㅎㅎ;
BlogIcon 호랭이 2007.11.07 09:11
으캬캬캬캬캬 산티아고님 아직도 정기구독 안 하시는 거? =_=+ ㅋㅋㅋ
산티아고님께는 자동으로 가는 줄 알았는데요. 아닌 모양이군요.

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

핑계 대지 마라. 열정 vs 현실.
+   [카테고리 없음]   |  2007. 8. 31. 15:10  


월간지 기자라는 이유로 마감때만 되면 터무니없이 포스팅을 하지 않는 호랭이.

마감중에 사정 봐줄 것 없이 바쁜 건 사실입니다.

게다가 처자식 먹여 살리려다보니 그 와중에 아르바이트까지 겹쳐버리면 한달 중 열흘에서 보름 정도는 평균 수면 시간을 2-3시간 정도로 유지하며 견뎌야 하기도 합니다.

하지만, 그런 것이 무슨 이유가 될까요?

블로그를 오픈하며 했던 생각들이나 목표들, 그리고 누군가를 바라보며 닮고 싶었던 목표들을

현실 앞에 무릎꿇는 다짐에 '열정'이란 이름을 붙일 수 있을까요?

그처럼 대단한 사람들을 만나 자극을 받고, 엄청난 기업들을 성공으로 이끄는 비결들을 보면서도

변화하지 못하는 호랭이는 얼마나 무디고 게으른가요. OTL

3년 전 월간 마소에 이창신 님이 쓴 글을 보게 되었습니다.

전에도 보았겠지만 이번에는 와 닿는 정도가 다르네요.

자신의 꿈을 위해 터무니없이 높은 벽에 도전하고

작은 금하나 갈 것 같지 않던 그 벽을 허물어버린 이창신님의 글을 발췌해 보았습니다.

당시 이창신님 또한 밤낮없이 일하는 개발자였지만 그는 자신이 목표했던 것을 이루었고

그걸 발판으로 그 다음 그리고 또 그 다음 단계를 향해 큰 걸음을 걷고 있습니다.

몇 차례 시도해 보고 주저앉으며 현실을 탓했다면 어림없었을 이야기겠지요.

-----------------------------------------------------------------------------------------------
나에게는(‘나’라는 인칭 대명사는 원래 본지에서는 쓰지 않지만 이번 글에서는 도입해 보려 한다) 꿈이 있었다. ‘뭐 별 것도 아니구만’하고 생각할 수도 있겠지만 아파치의 커미터가 되는 것이었다. 매일 아파치의 CVS를 pserver 읽기 전용으로 접근하는 수동성을 떠나 extssh로 코드를 바로 고치는, 그래서 세상의 많은 사람들이 내가 짠 프로그램을 통해 도움을 받는 그런 꿈이 있었다. 하지만 커미터의 벽은 참 높았다. 자바를 주로 하는 나에게 아파치의 자카르타는 무척 견고한 개발 조직임을 확인해 주었다. 이제 자바 웹 개발을 한다면 누구나 익히 알 톰캣이나 스트럿츠의 커미터가 된다는 것은 그야말로 ‘장난이 아닌’ 기여를 통해 가능한 일이다. 하지만 나의 현실은 어땠던가. 일상에는 늘 해야 할 작업이 있었고, 그 작업에는 늘 기한이 있었으며, 정말이지 빠듯한 애플리케이션 개발이 이어졌다. 톰캣의 문제를 발견해도 해결할 만한 연구의 시간은 솔직히 말해 허용되지 않았다. 톰캣의 커미터가 되고 싶다는 꿈은 그렇게 점점 멀어져가고 있었다.
회사는 이윤을 추구한다. 나는 회사를 다니고 따라서 회사의 이윤추구에 헌신해야 한다. 너무도 당연한가? 쉽게 말해 회사가 시키는 일을 해야 하고, 그것이 ‘커미터되지 말기’는 아니더라도 ‘커미터되기’와는 아무런 관계도 없다. 자카르타의 높은 수준과 탄탄한 개발층에 이미 좌절한 나로서는 더 이상 미련을 가질 필요가 없었다.
지금 생각해보면 나는 너무 한꺼번에 모든 것을 얻으려고 했던 것 같다. 나름대로는 꽤 한다고 생각했으니 이 정도면 커미터를 시켜줘야 하는 것이 아니냐는…. 하지만 기여라고는 몇 번 질의응답과 간단한 패치 정도였으니 착각치고는 무척 순진하기까지 하다.

신천지

작년 여름부터 나는 XML 관련 작업을 많이 하게 되었다. 그러다 보니 자연스럽게 자바에서 XML을 편하게 다루는 방법에 대해 매달리게 되었고, 자바의 XML 데이터 바인딩 기술을 찾던 중 JaxMe라는 소스포지 내의 오픈소스 프로젝트를 발견했다. 소스 생성, 스키마 분석, DB와의 연동을 각 프레임워크로 세분화하고, 해당 분야의 자바 표준인 JAXB(Java Architecture for XML Binding)도 지원한다는 사실에 흥분한 나는 바로 다운받아 돌려보았다. 그리고 몇 가지 간단한 문제점과 해결안을 프로젝트 리더인 Jochen Wiedmann에게 이메일로 보냈는데 그것이 아파치의 커미터로 이어질 줄은 꿈에도 몰랐었다.
나중에 차차 알게 되었지만 JaxMe는 새로운 구조로 이전하며 아파치 웹 서비스 프로젝트로 옮겨지는 과정 중에 있었다. JaxMe의 매력에 흠뻑 빠진 나는 틈나는 대로 JaxMe의 소스코드를 들여다보았다. 이미 방대해진 서버인 톰캣과는 달리 JaxMe는 상대적으로 무척 단촐했다. 버그와 만났을 때 더 이상 망연자실 한탄만 할 필요가 없었다. 이클립스의 디버깅 기능과 함께 스스로 고칠 수 있었고(그리고 상호상승 작용으로 이클립스의 디버깅을 더욱 효과적으로 사용할 수 있게 되었고), Jochen과 이메일을 통해 해당 사안을 논의하면서 커뮤니케이션에도 서서히 경험과 자신이 쌓였다.
그렇게 두세 달은 보냈던 것 같다. 그 사이에 JaxMe는 아파치 웹 서비스 프로젝트의 인큐베이터에 들어갔고, 나에게는 Jochen으로부터 미션이라는 것이 떨어졌다. 이제 버그를 고치는 일이 아니라 없는 기능을 채워 넣어야하는 것이었다. 한 가지 주제에 대해 몇 차례씩 메일을 주고받으며 무엇을 구현해야 하는 지를 파악해 갔고, 아직 CVS에 커밋할 수 있는 권한이 없던 터라 패치 파일을 만들어 올렸다. 그렇게 또 몇 달이 지나고 2003년 10월 23일, 정말이지 믿기지 않는 일이 벌어졌다. 내가 드디어 아파치 커미터가 되는 관문인 선거에 오른 것이다.
투표인단은 기존 커미터인 Jochen, Robert Burrell Donkin, 그리고 아파치 웹 서비스 프로젝트 관리위원회 의장인 Davanum Srinivas(줄여서 dims라고 부른다)였다. 개표 결과는 만장일치의 승인이었고 선거 다음날인 24일에 꿈에도 그리던 아파치 커미터 임명의 공식 절차가 시작되었다. 톰캣의 커미터가 되고 싶다는 마음을 먹은 지 3년도 더 지났지만, 그 때의 감격이 아직도 느껴지는 듯하다.
지금 생각하면 웃음이 나오지만 첫 커밋에 한 3시간은 걸렸던 것 같다. ias@apache.org라는 ID로 처음 하는 커밋, 그것도 많은 사람들이 실시간으로 컴파일해 보고 실행해 볼 코드를 바꾼다는 것은 그야말로 부담의 극치였다(아무렇지도 않게 막 커밋하는 선배 커미터들이 존경스럽게 보일 정도였으니까. 사실 막 하는 것은 아니다). CVS 커밋 명령을 누르고, 도대체 코멘트를 뭐라고 달아야 할 지 수십 번도 더 고친 후 완료 버튼을 누르는 순간 정말 내가 ‘커밋’을 하는 거구나 하는 아득한 기분에 빠졌었다. 첫 키스의 망설임처럼 오랜 시간이 걸렸지만 그것이 바로 아파치하면 자카르타만 떠올리는 나에게 커미터의 기회를 열어 준 신천지, JaxMe와 함께 할 인연의 시작이었다.
------------------------------------------------------------------------------------------------




     아파치, 열정, 이창신, 커미터
     1   
BlogIcon 김민호 2007.09.01 01:31
그러네… 열정이라는걸 다시 생각하게 되네. 요즘 마냥 게을러져서 참 걱정이야

아이디 
비밀번호 
홈페이지 
비밀글   

 

<<이전 | 1 | 다음>>

열이아빠's Blog is powered by Daum