이번 장에서는 명령어 몇개를 사용하여 첫 스크래치 프로젝트를 만들어 보겠습니다. 완료 후에 프로젝트를 실행 하면 캐릭터가 말풍선을 출력하고 보였다 사라졌다를 반복하는 간단한 프로젝트 입니다.

1) 명령어 배치하기
스크래치는 명령어들을 해당 스프라이트의 스크립트 영역에 배치하고 이 명령어들이 조건에 맞게 순차적으로 실행됩니다.

사용자 삽입 이미지
각각의 명령어들은 좌측과 같이 8개의 항목으로 분류되어 있습니다. 명령어 블럭들의 색을 보면 어느 분류에 속해 있는지 알 수 있습니다. 

현재 선택된 분류는 Control과 같이 전체 색상으로 구분되며 하단에는 Control과 관여된 블럭이 오게 됩니다. 이제 이 Control 블럭에서 깃발모양의 [when clicked] 블럭을 마우스로 드래그 해서 스크립트 영역으로 가져다 놓습니다.

사용자 삽입 이미지

[when clicked] 블록은 사용자가 깃발 버튼을 클릭하면 실행되는 블럭입니다. 이제 이 프로젝트가 시작할 때 해야할 작업을 위해서 다른 블록들을 연결합니다.

사용자 삽입 이미지
Looks 항목에서 [say[Hello!]] 블럭을 가지고 옵니다. 각각의 블럭들은 블록한 부분과 오목한 부분에 맞으면 연결할 수 있습니다.

[say[Hello!]]을 드래그해서 [when clicked]하단의 홈에 위치시키면 좌측과 같이 연결이 가능하다는 표시로 하얀 줄이 생깁니다. 이 줄이 생길 때 마우스 버튼을 놓으면 블럭들이 결합됩니다.

사용자 삽입 이미지
결합된 블럭들은 순서에 따라서 위에서 아래로 실행됩니다. 테스트를 위해 깃발을 클릭하면 스프라이트 위로 'Hello!'라는 말풍선이 출력됩니다.


이제 스프라이트를 반복적으로 보여 주었다 사라졌다 하도록 만들기 위해 다른 명령어 블럭들을 추가해 보겠습니다.

사용자 삽입 이미지
반복적으로 실행되게 하기 위해서 Control에서 forever 블럭을 가져와 배치 합니다. forever는 보이는 모습과 같이 명령어들을 내부에 포함할 수 있으며, 이 포함된 블럭들은 반복적으로 실행됩니다. 

show는 해당 스프라이트를 출력하고 반대로 hide는 보이지 않게 만듭니다. 그리고 [wait (1) secs]는 1초동안 아무 동작을 하지않고 기다리게 만드는 명령어 입니다. 너무 빠르게 깜빡이지 않게 하기 위해서 show와 hide 명령어 사이에 각각 배치합니다. 최종적으로 완성된 블럭은 아래와 같습니다.

사용자 삽입 이미지

2) 테스트
사용자 삽입 이미지
이제 다시 깃발 버튼을 클릭하여 실행하면 좌측과 같이 캐릭터과 보였다 사라졌다를 반복하는 모습을 확인할 수 있습니다.

실행을 멈추기 위해서는 깃발 옆의 스톱 버튼을 클릭합니다.





3) 프로젝트 저장
이제 다음에도 이 프로젝트를 실행하거나 수정할 수 있도록 상단의 [save] 버튼을 클릭하여 저장합니다.

사용자 삽입 이미지

디렉토리를 선택하여 New Filenames항목에 프로젝트 이름을 입력합니다. 여기서는 'firstScratch'라고 입력하였습니다. Projec author에는 제작자의 이름을 입력하고 About this project에서 이 프로젝트에 관한 설명을 입력하고 하단의 [OK]를 클릭합니다.

한가지 유의하실 점은 아쉽게도 스크래치는 아직 한글을 지원하지 않으므로 영문으로 입력하셔야 합니다.
AND

사실 이 포스팅을 하는 이유는 책소개 보다 먼저 제 실수를 사과드릴려고 하는 것입니다. 이전 제 포스트에서 Beutiful Code란 책을 소개하면서 번역에 대한 문제점에 대해서 이야기 하였습니다.

문제가 된 부분은 inite automata를 "유한자동차"로 번역되었다고 한 부분입니다. 이는 제가 착각한 것으로 실제 책에는 "유한자동자"로 되어 있습니다. 제가 읽은 부분까지 두세번 나온 것 같은데 왜 모두 자동차로 읽었는지 모르겠습니다. (난독증 아니면 노안이 왔나 봅니다.) 제 무지와 실수로 잘못된 정보를 접한 그 포스트를 읽어 보신 분들과 역자분께 깊이 사과 드립니다.

역자분이 제 개인 일상을 올리는 블로그에 오셔서 남긴 댓글을 보고 뒤늦게 확인하게 되었습니다. 아래는 역자분이 남기 신 댓글입니다.

사용자 삽입 이미지

링크된 역자분의 홈페이지를 방문해 보니 다수의 관련서적 번역 경험을 가지고 계시고, 올바른 번역을 위하여 많은 노력을 하고 계신 것 같은데 제가 누를 끼친 것 같습니다. 다시 한번 모든 분들께 죄송하다는 말씀 드립니다.

이제 본론으로 들어 가겠습니다.

사용자 삽입 이미지
레이몬드 첸의 윈도우 개발 282 스토리

저자: Raymond Chen
역자: 손광수
출판사: ITC
정가: 24,000원


(이미지 출처: YES24)

작년 연말에 가볍게 읽어 볼 생각으로 Beautiful Code와 윈도우 개발 282 스토리란 책을 온라인으로 주문하였습니다. 사실 화장실이나 나들이 시에 가볍게 읽을 책인줄 알고 구입하였습니다. 그러나 과장하여 이야기 하면 하나는 알고리즘, 또 하나는 윈도우 시스템 프로그래밍에 관련된 책이 었습니다.

물론 가볍게 볼 수 있는 부분도 있지만 깊은 이해를 위해서는 두 책 모두 "뇌"를 많이 써야 했습니다. 두 책을 같이 보기엔 제 "뇌"의 스펙이 많이 딸리기 때문에 제 기준으로 보다 쉽고, 재미있는 윈도우 개발 282 스토리를 먼저 읽고 있습니다. 지금은 2/3정도 읽었습니다.

제목과 같이 "스토리"도 있지만 샘플코드들도 적지 않게 있습니다. Win api에 대한 지식이 조금은 있어야 보기가 편할 것 같습니다. 내용은 win16 부터 Vista까지 윈도우즈 개발에 관한 재밌는 에피소드와 이를 설명하고 증명하는 샘플소스로 되어 있습니다.

저자도 이야기 하지만 오래전(지금도 있는지는 잘 모르겠습니다.) 실제로 존재는 하지만 공식적으로는 존재하지 않는 Win API에 대한 책이 있었습니다.  저도 당시 그 책을 구입하여 "MS 개발자 지들끼리만 편리하게 쓸려고 만든 API 함수"들을 찾아 보았고, "편리"를 위해서 사용하기도 했습니다.

책을 읽으면서 이런 문서화 되지 않은 비공식 API를 사용하는 어플리케이션들 때문에 MS 개발자들이 노력(그 노력이 윈도우 OS 자체에 끼친 영향이 옳고 그름은 정확히 판단되지 않습니다.)을 많이 했다는 생각이 들었습니다. 이뿐만 아니라 대충 짐작은 하고 있었지만 하위 호환, 잘못된 하드웨어/소프트웨어를 수용하기 위한 많은 노력에 관한 에피소드들을 그 중심에 있었던 개발자에게 직접 들으니 매우 현실감 있고 재미있었습니다.

그 외에 "윈도우는 왜 그랬었어야만 했나"에 대한 많은 재미있는 이야기 들이 있습니다. 윈도우 개발자가 아니더라도 한 번은 읽어볼 만한 책이라고 생각합니다. 윈도우 개발자라면 반드시 읽어보라고 추천하고 싶습니다.

'책 이야기 > IT 일반' 카테고리의 다른 글

미래를 만든 Geeks  (1) 2010.06.24
번역서의 표지 디자인  (8) 2009.08.31
소프트웨어 크리에이티비티 2.0  (0) 2009.07.21
드리밍 인 코드  (2) 2009.05.20
스티브 워즈니악  (4) 2007.12.31
AND

MS윈도우에서 사용하는 PE와 유닉스의 ELF 포맷은 유명하지만 맥에서 사용하는 Mach-O 포맷은 상대적으로 덜 알려져 있는 것 같습니다. 그래서 OS X의 실행파일 포맷 중 헤더 부분에 대해서만 간단히 알아 보도록 하겠습니다.

실행 파일 헤더 구조라는 다소 무거운 제목과는 달리 간단히 구조만 알아 보고 몇가지 편리한 툴들을 살펴 볼려고 합니다. 상세한 자료가 필요하신 분들은 ADC에서 아래의 문서를 참조하시면 될 것 같습니다.

1. Mach-O & fat-binary

사용자 삽입 이미지
Mach 커널을 사용하는 OS X는 Mach-O란 실행파일 포맷을 사용합니다. Mach-O 파일 포맷은 좌측과 같이 되어 있습니다. (이미지는 ADC에서 가지고 왔습니다.)

Mach-O 파일은 헤더와 load commands, 세그먼트들로 구성된 데이터로 이루어져 있습니다.

load commands는 OS가 어플리케이션 실행시에 라이브러리를 올리는 등의 실행에 필요한 명령어들의 집합입니다.

헤더에 대한 상세한 내용은 툴 사용법과 함께 알아 보겠습니다.


fat-binary (멀티아키텍쳐 바이너리)
위의 구조는 한 아키텍쳐를 위한 단일 구조이며, OS X에서는 여러 아키텍쳐를 지원하는 유니버셜 바이너리를 위하여 fat이란 구조를 사용하고 있습니다.

사용자 삽입 이미지
fat은 하나의 실행파일이 여러 아키텍쳐에 적용될 수 있게 하기 위한 포맷입니다. 이는 OS X에서 PPC(PowerPC)와 x86 코드를 사용할 수 있게 하여줍니다. 우리가 흔히 유니버셜 바이너리(UB)라고 부르는 실행파일 포맷입니다.

좌측을 보면 위의 구조(thin)와는 달리 fat에 관련된 헤더들이 추가되었습니다. 각각의 Fat Architecture는 각각의 실행 코드를 가르키고 있으며, OS에서 로드시에 해당 아키텍쳐에 맞는 코드 블록(Mach-O 포멧)이 로딩됩니다.     




2. lipo
lipo는 OS X에서 유니버셜 바이너리를 관리하기 위한 툴입니다. lipo를 이용해서 유니버셜 실행 파일로 부터 한 아키텍쳐를 지원하는 실행파일을 추출을 할 수 있습니다.

사용자 삽입 이미지
웹브라우져인 오페라 실행파일로 테스트를 해보겠습니다. 실행파일은 해당 어플리케이션 디렉토리 (Opera.app)에서 Contents/MacOS/ 내에 있습니다.

터미널에서
> lipo -detailed_info ./Opera
를 실행하시면 좌측과 같은 fat과 지원하는 각 아키텍쳐들의 세부 정보를 확인할 수 있습니다.


오페라는 유니버셜 바이너리(fat)로 되어 있으며 위와 같이 nfat_arch(fat_arch 구조체 갯수)가 2이이므로 두개의 네이티브 코드를 가지고 있습니다. 그 아래의 메지시로 PPC와 i386(x86)을 지원한다는 것을 알 수 있습니다. 각각의 내용은 fat_arch 구조체의 내용입니다. fat_arch 구조체는 아래에서 확인해 보겠습니다.

이제 lipo의 "-thin" 옵션을 이용해서 PPC만 지원하는 실행파일을 추출하여 보겠습니다. 터미널에서 아래와 같이 lipo 명령을 실행합니다.

사용자 삽입 이미지

실행이 완료되면 위와 같이 Opera2란 파일로 ppc 네이티브 실행파일이 만들어져 있습니다. 파일 크기를 확인하시면 fat 헤더와 x86 코드가 빠져있기 때문에 거의 반으로 줄어 있습니다. 새로 생성한 PPC 파일을 Opera로 이름을 변경하고 GUI에서 확인해 보겠습니다.

사용자 삽입 이미지

좌측이 유니버셜 버젼이 적용된 원래 모습이며, 우측이 lipo를 이용하여 새로 만든 PPC로 적용시킨 후 확인해 본 모습니다. Universal에서 PowerPC로 변경되어 있습니다.

3. otool
otool은 실행파일(or obj, lib 등)의 정보를 보여주는 OS X에 내장된 툴입니다. OS X는 기존의 유닉스 계열과는 달리 "ldd"라는 공유라이브러리의 의존성을 검사하는 툴이 없습니다. otool은 ldd의 기능도 포함하고 있으니 OS X에서는 이를 사용하면 됩니다.

터미널에서 "otool"만 입력하시면 아래와 같이 간단한 사용방법을 보실 수 있습니다.

사용자 삽입 이미지

> otool -L ./Opera 로 오페라에서 사용하는 공유라이브러리 정보를 출력합니다. 위와 같이 오페라는 "카본 프레임워크"를 사용하고 있음을 알 수 있습니다.  또한 위의 lipo 보다 더 실행 파일의 다양한 헤더들과, load command등의 정보를 확인할 수 있습니다. (lipo는 유니버셜 바이너리 파일만 적용할 수 있습니다.)

4. OxED
사용자 삽입 이미지
0xED는 맥에서 바이너리 파일을 볼 수 있는 핵사 에디터입니다. 일반 텍스트 에디터에서 얻을 수 없는 바이너리 파일들의 정보를 얻을 수 있습니다.



아래는 0xED를 이용하여 오페라의 실행파일(유니버셜)을 열어 본 모습입니다.

사용자 삽입 이미지

헤더의 시작은 fat_heaer와 fat_arch로 이루어져 있습니다. 우선 /usr/include/mach-o/fat.h에서 이 구조체들을 확인해 보겠습니다.

#define FAT_MAGIC   0xcafebabe
#define FAT_CIGAM   0xbebafeca  /* NXSwapLong(FAT_MAGIC) */

struct fat_header {
    uint32_t    magic;      /* FAT_MAGIC */
    uint32_t    nfat_arch;  /* number of structs that follow */
};

struct fat_arch {
    cpu_type_t  cputype;    /* cpu specifier (int) */
    cpu_subtype_t   cpusubtype; /* machine specifier (int) */
    uint32_t    offset;     /* file offset to this object file */
    uint32_t    size;       /* size of this object file */
    uint32_t    align;      /* alignment as a power of 2 */
};

fat_header
첫번째 4바이트의 "CA FE BA BE"를 보시면 fat_headerd의 magic 값이며 소스에서 FAT_MAGIC 정의된 값입니다. 이는 실행파일이 fat 구조이며 유너버셜 바이너리라는 것을 알려 줍니다.

두번째 nfat_arch는 이 실행파일이 지원하는 아키텍쳐의 갯수이며 그 아래에 위치할 fat_arch 구조체의 갯수와도 동일합니다. 4바이트 int형으로 [00 00 00 02]로 2개의 아키텍쳐를 지원합니다.

fat_arch
지원하는 아키텍쳐의 정보를 담고 있는 구조체 입니다. 첫번째는 cpu의 종류를 나타내는 cputype입니다. 16진수 [00 00 00 12]로 10진수 18의 값을 가지고 있습니다. 두번째 fat_arch는 이 값이 [00 00 00 07]로  7의 값을 가지고 있습니다.

#define CPU_TYPE_POWERPC        ((cpu_type_t) 18)

#define CPU_TYPE_X86        ((cpu_type_t) 7)
#define CPU_TYPE_I386       CPU_TYPE_X86        /* compatibility */

이 값들은 /usr/include/mach/machine.h 파일에 아래와 같이 정의 되어 있습니다. 각각 PPC(18)와 x86(7) 아키텍쳐를 지원하고 있음을 알 수 있습니다.

다음은 lipo로 만든 PPC 실행파일을 열어 본 모습니다.
사용자 삽입 이미지

fat_ 과 관련된 구조체 없이 바로 mach_header가 위치합니다. 아래는 mach_header가 정의된 /usr/include/mach-o/loader.h 헤더파일의 일부입니다.

/*
 * The 32-bit mach header appears at the very beginning of the object file for
 * 32-bit architectures.
 */
struct mach_header {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
};

/* Constant for the magic field of the mach_header (32-bit architectures) */
#define MH_MAGIC    0xfeedface  /* the mach magic number */
#define MH_CIGAM    0xcefaedfe  /* NXSwapInt(MH_MAGIC) */

각각의 값들은 아래와 같습니다.

magic [FE ED FA CE]
Mach-O 포맷의 파일을 알려 주는 필드입니다. 이는 빅 엔디언을 사용하는 PPC 파일의 값이고 리틀 엔디언을 사용하는 x86을 지원하는 코드에서는 "CE FA ED FE"를 가지고 있습니다.

cputype [00 00 00 12]
12로 위와 동일하게 PPC를 지워합니다.

cpusubtype [00 00 00 00]
PPC subtype의 0은 CPU_SUBTYPE_POWERPC_ALL로 정의되어 있습니다.

filetype [00 00 00 02]
파일타입 2는 MH_EXECUTE로 정의 되어 있으며 실행파일을 의미합니다.

ncmsds [00 00 00 0B]
11개의 load command를 가지고 있음을 의미합니다.

sizeofcmds [00 00 08 CC]
load command의 크기로 2252byte입니다.

flags [00 00 00 85]
bit로 정의된 상세 정보입니다. 아래와 같은 세가지 bit가 세팅되어 있습니다.

#define MH_NOUNDEFS 0x1     /* the object file has no undefined
                       references */
#define MH_DYLDLINK 0x4     /* the object file is input for the
                       dynamic linker and can't be staticly
                       link edited again */
#define MH_TWOLEVEL 0x80        /* the image is using two-level name
                      space bindings */

cputype과 cpusubtype의 값에 대해서는 /usr/include/mach/machine.h 헤더파일을 그 외 정보들은  /usr/include/mach-o/loader.h에서 자세한 정보를 확인하실 수 있습니다.

딱 저의 궁금증 까지만 알아 보았습니다. 더 자료가 필요하신 분들은 위에 링크된 ADC 레퍼런스와 또 다른 문서인 Universal Binary Programming Guidelines가 도움이 되실 것입니다.

'기타' 카테고리의 다른 글

맥미니 분해 및 업그레이드  (4) 2008.03.14
가족과 함께 하기에 좋은 게임 Wormux  (2) 2008.02.29
프로그래밍 언어 인기 순위  (21) 2008.01.09
OS X APM 설치툴 - MAMP  (6) 2007.12.27
블로그 RSS 읽어오는 C++ class  (7) 2007.12.14
AND

튜토리얼을 진행하기에 앞서 스크래치 툴에 관해서 간단히 알아 보겠습니다. 스크래치의 UI는 간단하고 직관적이기 때문에 몇 번만 사용해 보면 쉽게 적응하고 사용할 수 있습니다. 들어 가기전에 스크래치에서 자주 쓰이는 스프라이트와 스크래치에 대해서 알아 보겠습니다.

스프라이트

스프라이트는 스크래치에서 움직일 수 있는 특정한 대상을 가르키는 단어입니다. 스테이지가 무대라면 스프라이트는 배우라고 할 수 있습니다.
 
스프라이트는 각각의 스크립트에 의해 지정된 동작대로 움직이고, 소리를 내고 변화에 반응하는 등의 동작을 합니다. 스프라이트는 기존 이미지에서 불러 오거나 내장된 페인트 에디터로 만들 수 있습니다. 또한 현재 상태와 동작에 맞는 여러 이미지(Custums)로 변경할 수 있습니다.

 스크립트
각각의 명령어 블록들로 조합되어진 스크립트를 움직이는 명령어 집합입니다. 스프라이트가 움직이고 소리내고 보여지는 모든 행동들은 스크립트에 의해 정해진 대로 스테이지내에서 표현됩니다. 한마디로 스크립트는 스프라이트에 생명을 줍니다.   

1. 스크래치 둘러 보기
사용자 삽입 이미지

1) 메인 메뉴
사용자 삽입 이미지
메인 메뉴는 위와 같이 스크래치 상단에 위치한 버튼들로 프로젝트 생성/저장/공유 및 스크래치 설정에 관한 기능을 가지고 있는 버튼들입니다. 각각의 버튼들은 아래와 같은 기능을 합니다.

[New] 새로운 프로젝트를 실행합니다.

[Open] 기존에 저장해 놓은 프로젝트(*.sb)를 다시 불러 옵니다.

[Save] 현재 프로젝트를 저장합니다.

[Save As] 현재 프로젝트를 다른 이름으로 저장합니다.

[Share!] 현재 프로젝트를 다른 회원들과 공유하기 위해  스크래치 사이트로 업로드 합니다. 이 기능을 사용하기 위해서는 스크래치 사이트에서 회원가입을 하셔야 합니다.

[Undo] 바로 직전에 실행된 내용을 취소합니다.

[Language] 스크래치에서 사용할 언어를 설정합니다. 다양한 언어가 있지만 한글은 지원하지 않습니다.

[Extras] 아래와 같은 기타 메뉴들이 있습니다.
> About
 스크래치에 대한 간단한 소개와 현재 버전에 관한 정보가 있습니다.

> Import Project
 다른 프로젝트로부터 스프라이트와 배경 이미지를 가지고 옵니다.

> Start Single Stepping
 스크립트를 한 단계씩 실행합니다. 현재 실행되는 블럭은 스크립트 영역에서 밝게 표시됩니다. 오류를 찾거나 다른 사람이 만든 프로젝트를 분석할 때 유용합니다.

> Compress Sounds
 프로젝트에 포함된 사운드 파일을 압축합니다.

> Compress Images
 프로젝트에 포함된 이미지 파일을 압축합니다.
   
[Whant Help?]
웹브라우저에서 도움말 페이지를 오픈합니다. PDF 도움말 파일이나 스크래치 사이트의 페이지로 이동할 수 있습니다.

2) 툴바
스테이지 내의 스프라이트의 이동/복사/삭제/확대/축소를 할 수 있는 버튼들의 모음입니다. 동작을 선택하고 적용될 스프라이트를 클릭하면 실행됩니다.

사용자 삽입 이미지
이동
스프라이트를 드래그 하여 스테이지에서 원하는 위치로 이동합니다.

사용자 삽입 이미지
복사
스프라이트, 사운드, 블록 등을 복사합니다.

사용자 삽입 이미지
삭제
스프라이트, 사운드, 블록 등을 삭제합니다.

사용자 삽입 이미지
확대
스프라이트를 확대합니다.

사용자 삽입 이미지
축소
스프라이트를 축소합니다.


3) 스테이지
스테이지는 스프라이트를 배치하며 작업을 하는 공간이며, 스크래치가 실행시 보여지는 화면입니다. 크기는 가로 480픽셀, 세로 360픽셀로 되어 있습니다. 유의하실 점은 좌표가 아래와 같이 중앙에서 0, 0으로 시작하며 위로 또는 좌측으로는 마이너스(-)로 표현됩니다.
사용자 삽입 이미지

4) 명령어 블록
사용자 삽입 이미지
명령어 블록 상단에는 스크래치 좌측 상단에 위치한 명령어 블록들을 용도별로 분류해 놓은 8개의 버튼들이 있습니다.

각각의 버튼을 클릭하면 포함된 명령어 블록들을 바로 하단에서 보실 수 있습니다.

Motion
스프라이트의 이동, 회전, 범위 검사 등 움직임에 관한 제어 블럭들이 있습니다.

Looks
스프라이트 이미지/크기/색상 변경, 그래픽 효과 설정, 보여주기/감추기, 레이어 위치 설정, 대화/생각하는 구름 표시 등 보여주는 모습을 설정할 수 있는 블럭들이 있습니다.

Sound
음악을 플레이/중지 하고 볼륨과 템포 조절, 각종 악기음 설정/연주 등의 사운드에 관련된 블럭들이 있습니다.

Pen
선을 그리고 색상, 크기 등을 설정하는 블럭들이 있습니다. Pen은 스프라이트와 결합하여 스프라이트의 이동경로 등을 그릴 때 사용됩니다.

Control
변수나 스프라이트의 상태를 검사하고 행동을 반복하고, 키보드 입력, 이벤트 수신/발송 등 스프라이트를 조종할 수 있는 블럭들이 있습니다.

Sensing
마우스 상태 검사, 스프라이트 충돌, 위치 검사 등 스프라이트의 위치나 상태를 검사를 할 수 있는 블럭들이 있습니다.

Variable
상태 저장을 위한 변수를 생성하고 값을 변경할 수 있는 블럭들이 있습니다.


5) 스크립트 영역
사용자 삽입 이미지
상단 중앙에 Scripts, Costumes, Sounds 세 개의 탭이 있습니다. 현재 선택된 오브젝트가 스크립트냐 배경화면이냐에 따라서 두 번째 메뉴가 Custumes 또는 Background로 변경됩니다.

Scripts 탭은 좌측과 같이 실행될 스크립트 블럭들이 위치하는 곳입니다. 해당 스프라이트를 클릭하고 명령어 분류 목록에서 해당 블록을 드래그해서 이곳으로 가져다 놓으면 실행됩니다.




사용자 삽입 이미지
Costumes를 선택하면 해당 스프라이트의 동작(모습)을 추가할 수 있습니다.

[Paint] 페인트 에디터를 오픈하여 스프라이트를 그린 후, 새로운 스프라이트를 추가합니다.

[Import] 파일(*.png, *.jpg)에서 새로운 스프라이트를 불러온 다음 추가 합니다.

[Edit]  현재 스프라이트를 페인트 에디터에서 편집합니다.

[Copy]
  현재 스프라이트를 복사해서 추가합니다.

[X] 현재 스프라이트를 삭제합니다.

사용자 삽입 이미지
마지막 사운드 탭은 해당 스크립트 또는 배경화면에 효과음과  배경음악을 등록할 수 있습니다.

PC에 마이크가 설치되어 있으면 [Record] 버튼으로 녹음도 가능합니다.


6) 스프라이트 목록
사용자 삽입 이미지

위와 같이 프로젝트에서 사용되는 모든 스프라이트들의 목록을 볼 수 있는 창입니다. 스프라이트 이미지 하단에는 스프라이트의 이름과 스크립트에 포함된 모양(Custumes) 갯수와 스크립트 갯수를 표시합니다. 여기서 선택된 스프라이트가 8) 스프라이트 창에 나타납니다.

7) 스프라이트 생성 버튼

사용자 삽입 이미지
새로운 스프라이트를 만들기 위해 페인트 에디터를 오픈합니다.


사용자 삽입 이미지
기존에 저장된 이미지(*.png), 스프라이트(*.sprite)를 불러와 새로운 스프라이트를 생성합니다.

사용자 삽입 이미지
렌덤하게 스크래치가 가지고 있는 이미지들을 불러 옵니다. 이 이미지들은 스크래치 디렉토리 밑의  Media/Cotumes에 위치 합니다.

스프라이트 생성버튼의 좌우측으로 아래와 같은 버튼과 상태 창이 있습니다.

사용자 삽입 이미지
스크래치가 프리젠테이션 모드(전체화면)로 실행됩니다.

사용자 삽입 이미지
스테이지 중앙을 기준으로 마우스의 현재 x, y 위치를 보여 줍니다.


8) 스프라이트 창
사용자 삽입 이미지




상단에 있는 스프라이트 창에서는 스프라이트 이름을 변경하고 스테이지에서 현재 위치와 방향을 보여 줍니다. 그 외 스프라이트를 저장하거나 회전/락 설정을 할 수 있습니다.

사용자 삽입 이미지
좌측의 세 개의 버튼은 사용자가 스프라이트 회전에 관한 옵션을 선택합니다. 첫번째 상태에서는 스프라이트 방향을 회전할 수 있으며, 두번째 상태는 좌우로 변경만 가능, 세번째 상태는 회전할 수 없습니다.

사용자 삽입 이미지
좌측과 같이 자물쇠가 잠겨 있는 아이콘이 설정되어 있는 스프라이트는 프리젠테이션이나 웹상에서 실행시에 마우스 드래그로 이동이 되지 않습니다.

[Export] 현재 스프라이트를 저장합니다. *.sprite 확장자로 저장됩니다. 저장된 스프라이트는 다른 스크래치 프로젝트에서 불러와 사용하실 수 있습니다.

9) 시작/종료 버튼
사용자 삽입 이미지
실행/중지 - 깃발모양은 스크립트를 실행합니다.
붉은 색 버튼은 현재 실행되는 스크립트를 종료합니다.



사용자 삽입 이미지
상단 우측을 보면 좌측과 같이 노트 모양의 아이콘이 있습니다. 이 아이콘을 클릭하면 간단하게 프로젝트에 관한 메모를 할 수 있습니다. 하지만 역시 한글은 입력되지 않습니다.


2. 페인트 에디터 둘러 보기

스프라이트를 생성/편집할 수 있는 이미지 툴입니다. 이 역시 메뉴가 간단하니 다른 그래픽 툴을 사용해 보신 분들은 쉽게 사용하실 수 있을 것입니다.

사용자 삽입 이미지

상단에는 스프라이트의 모양을 조절할 수 있는 아래와 같은 버튼들이 있습니다.

사용자 삽입 이미지
스프라이트의 크기를 확대합니다.

사용자 삽입 이미지
스프라이트의 크기를 축소합니다.

사용자 삽입 이미지
스프라이트를 오른쪽으로 회전합니다.

사용자 삽입 이미지
스프라이트를 왼쪽으로 회전합니다.

사용자 삽입 이미지
스프라이트를 좌우로 뒤집습니다.

사용자 삽입 이미지
스프라이트를 아래위로 뒤집습니다.


[Import] 기존의 이미지 파일을 불러 옵니다. png 파일을 지원합니다.

[Undo] 직전에 동작을 취소합니다.

[Redo] 취소한 동작을 다시 실행합니다.

[Clear] 캔버스의 모든 내용을 삭제합니다.


사용자 삽입 이미지
좌측 중간에는 캔버스에 그릴 수 있는 툴들을 모아 놓은 좌측과 같은 버튼들이 있습니다. 버튼 하단에는 현재 선택된 작업의 옵션을 설정할 수 있습니다.




사용자 삽입 이미지
마우스의 움직임대로 자유롭게 선을 그릴수 있는 툴입니다.
옵션 : 선의 굵기를 설정할 수 있습니다.

사용자 삽입 이미지
마우스의 움직임대로 지울 수 있는 툴입니다.
옵션 : 지울 수 있는 크기를 설정할 수 있습니다.

사용자 삽입 이미지
지정된 영역에 색을 칠하는 툴입니다.
옵션 : 그라데이션 효과를 설정할 수 있습니다.

사용자 삽입 이미지
사각형을 그리는 툴입니다.
옵션 : 꽉찬 사각형 또는 선만 선택할 수 있습니다.

사용자 삽입 이미지
원을 그리는 툴입니다.
옵션 : 꽉찬 원 또는 선만 선택할 수 있습니다.

사용자 삽입 이미지
직선을 그립니다.
옵션 : 선의 굵기를 설정할 수 있습니다.

사용자 삽입 이미지
문자를 출력합니다. 역시 한글은 사용할 수 없습니다.
옵션 : 문자의 폰트와 크기를 설정할 수 있습니다.

사용자 삽입 이미지
영역을 설정합니다.
설정된 영역은 삭제, 변경, 이동시 영향을 받습니다.

사용자 삽입 이미지
도장
영역을 설정하면 설정된 영역만큼 복사를 할 수 있습니다.

사용자 삽입 이미지
캔버스 내에서 색상을 추출하여 현재 색상으로 적용합니다.



사용자 삽입 이미지
좌측 하단에는 현재 색상을 설정할 수 있는 툴들이 있습니다. 상단의 두 색상을 클릭하면 상, 하 색상이 교체됩니다.

선과 도형을 그리거나 색을 채우는 작업을 할 때, 현재 이 곳에서 선택된 색상을 사용합니다.



사용자 삽입 이미지
스프라이트가 회전할 때 중심이 되는 위치를 설정합니다.


사용자 삽입 이미지
캔버스를 확대하거나  축소 합니다.


이번 장에선 스크래치와 스크래치에서 스프라이트를 그릴 때 사용되는 페인트 에디터에서 대해서 살펴 보았습니다. 다음 장부터는 스크래치를 이용하여 간단한 예제들을 작성해 보겠습니다.
AND

년초 포스팅에서 계획 했었던 어린이를 위한 쉬운 프로그래밍 강좌를 해보려고 합니다. 이런 생각을 한 이유는 제가 어린이 교육에 관심이 깊다거나 하는 거창한 이유가 아닌, 일차적으로 제 어린 아들을 위해서 입니다.

제 아이는 프로그래밍에 관심을 많이 가지고 있습니다. 프로그래밍이라기 보다는 자신이 그린 캐릭터들이 움직이는 것에 관심이 많습니다. 목표는 본인 스스로 게임을 만들어 보는 것입니다. 그동안 플래쉬와 스퀵, 스크래치 등의 툴들을 사용했지만 너무 어렵고 영어라는 제약을 뛰어 넘지 못하고  늘 어느선에 머물렀습니다.

사용자 삽입 이미지
좌측은 제 아들이 스크래치로 최근에 만든 것입니다. 스테이지, 레벨업, 무기 변경, 난이도 변경 등을 하고 싶어 하지만 구현하지 못하고 있습니다.  실제로 동작하는 모습은 스크래치 프로젝트 페이지에서 보실 수 있습니다.
 
초등학교 3학년 아이가 혼자서 만들기엔 어렵고 한글로 된 참조할 자료가 없기 때문에 더 이상 진행을 못하고 있는 것 같습니다.


그래서 일차적으로 제 아들을 위하여 그 다음은 저와 비슷한 관심을 가지고 있는 부모님들과 어린이들을 위해 강좌를 해보려고 합니다. 초등학교 4학년 이상이면 따라해 볼 수 있도록 가능하면 쉽게 해보려고 합니다.

0. 어린이와 프로그래밍


사용자 삽입 이미지
아이들은 일반 언어도 그렇고 어른들과 다르게 흥미있는 지식은 물 묻은 스폰지처럼 빠르게 흡수합니다. 그래서 오래전부터 제 아이에게 어렸을 때에 프로그래밍을 가르쳐 보려고 생각하고 있었습니다.

가르치려는 이유는 아이가 성인이 되어서 프로그래머가 되기를 바래서가 아니라 아래와 같은 효과가 있을 것 같기 때문입니다.

(사진출처: 스퀵랜드)

1) 창의력과 논리력이 향상됩니다.
프로그래밍은 무에서 유를 만들어 가는 과정입니다. 레고와 같은 유형의 교육용 장난감들도 이런 역할을 수행 합니다. 하지만 컴퓨터는 양이나 범위, 방법에 관해 어떠한 제한도 없이 생각하는 모든 것을 구현할 수 있습니다. 게다가 무료입니다.

사용자 삽입 이미지
아이들은 프로그래밍이라는 딱딱하고 어려운 작업이 아니라 레고를 가지고 놀듯이 명령어들을 조합하여 원하는 결과물을 다양하게 만들어 낼 수 있습니다. 실제 레고사에서는 스크래치에서 사용할 수 있는 좌측과 같은 이미지의 레고 이미지 팩을 기증(?)하였습니다.

학생 본인 또는 부모님이나 선생님들의 작은 노력만 있다면, 생각한 대로 가지고 놀 수 있는 가장 값어치 있는 장난감을 손에 넣을 수 있습니다.

2) 깊은 성취감을 느낄 수 있습니다.
개발자들이 가장 기쁨을 느끼는 순간이 코드가 컴파일되고 생각한대로 실행되는 모습을 확인할 때 입니다. 이는 아이들도 마찬가지로 여러 명령어 조합을 맞춰 보고 제대로 실행되었을 때 컴퓨터로 본인 스스로 무엇인가를 만들었다는데 대해서 깊은 성취감과 자신감을 가질 수 있습니다.

3) 컴퓨터의 생산적인 사용방법을 습득할 수 있습니다.
대부분 아이들이 컴퓨터를 게임기로 사용합니다. 오락적인 요소도 중요하지만 컴퓨터로 원하는 일을 할 수가 있고 이를 위한 도구로서 이용할 수 있게 만듭니다.

게임을 하거나 재미있는 글과 사진, 동영상을 보기 위한 소비적인 이용뿐만 아니라 스케치로 원하는 결과물을 만들어 내는 생산적인 이용을 가능하게 합니다.

4) 자발적으로 영어와 친숙해 질 수 있습니다.
홈페이지와 스크래치의 모든 명령은 영어로 되어 있습니다. 사용되는 영어와 명령어 수가 많지 않기 때문에 쉽게 외우고 사용할 수 있습니다.

뒤에서 자세히 설명하겠지만 스크래치 홈페이지에서 프로젝트를 올리고 평가하고 공유하며, 또한 놀면서 외국의 아이들과 의견을 교환할 수 있습니다. 의사소통을 위해 자발적으로 기분좋게(?) 영어를 배운다면 아이에게도 즐거운 일일 것 같습니다.

5) 프로그래밍 기본개념 습득
스크래치는 아이들의 놀이/학습뿐만 아니라, 프로그래밍을 처음 접하는 성인들도 프로그래밍에 대한 기초와 개념을 쉽게 가지게 해줄 수 있는 툴입니다. 프로그래밍에 대한 기본 지식을 습득하면 나중에 직접 타이핑을 해야 하는 프로그래밍 언어와 툴들도 쉽게 적응할 수가 있습니다.

1. 스크래치란?

사용자 삽입 이미지
스크래치는 스퀵을 기반으로 MIT Media Lab에서 개발한 8세 이상의 어린이들의 개발을 위한 툴입니다. 8세라는 것은 스크래치 사이트에 나와있는 내용이며 영어권 국가의 기준입니다.

"우리나라와 같이 비영어권 국가에서는 초등학교 저학년의 경우에는 부모님의 도움이 필요할 것 입니다. 스크래치에서 사용하는 영어는 간단하고 얼마 되지 않으니 5/6학년 정도의 고학년 어린이들은 이 블로그의 내용만 보고 따라할 수 있을 것으로 생각됩니다."

스크래치는 위 로고의 아래  내용처럼 생각한 내용을 애니메이션, 게임, 음악 등으로 쉽게 표현할 수 있고 웹을 통해서 다른 사람들과 공유할 수 있게 해줍니다. 스크래치 프로젝트는 스크래치에서 바로 홈페이지로 업로드할 수 있으며, 개인의 홈페이지나 블로그에서도 올릴 수 있습니다.

스크래치의 결과물은 자바 애플릿을 이용하여 웹상에서 바로 실행될 수 있습니다. 윈도우즈일 경우에는 JRE가 설치되어 있어야 합니다. JRE가 없으면 이곳에서 설치할 수 있습니다.

2006년 3월을 시작된 스크래치 홈페이지는 현재 회원수가 6만명이 넘을 정도로 빠르게 사용자가 늘어 가고 있습니다. 제가 본 무료로 배포되는 교육용 프로그램 중에서는 가장 사용하기가 쉽고 완성도 높은 것으로 생각됩니다.

사용자 삽입 이미지
스크래치는 스퀵으로 작성되었습니다. 스퀵으로 만든 결과물 중에 가장 훌륭한 것이 아닐까 생각됩니다. 스크래치의 소스는 홈페이지에 공개되어 있으며 이곳에서 다운로드 받으실 수 있습니다.
스퀵은 스몰토크-80으로 작성되었으며, 스퀵 그 자체에 스몰토크-80과 기본 라이브러리를 가지고 있는 개발툴입니다.


2. 회원가입 및 설치

1) 회원 가입
스크래치를 다운로드 받기 위해서는 스크래치 홈페이지를 방문해야 합니다. (사이트는 영어, 독일어, 프랑스어를 지원합니다.) 스크래치를 다운로드 받기에 앞서 회원가입을 먼저 합니다.

사용자 삽입 이미지
회원가입은 좌측과 같이 이메일을 제외하고는 중요한 개인정보를 요구하지 않습니다.

스크래치를 적극적으로 활용하고, 다양한 활동을 위해서는 가입을 하시는 것이 좋습니다.



사용자 삽입 이미지
회원가입을 하시면 포럼에 참여할 수 있으며 스크래치로 만든 프로젝트를 해당 사이트에 등록할 수 있습니다.

만든 프로젝트를 등록하면 좌측과 같이 다른 이용자들과 공유하며 다양한 평가와 의견을 받을 수 있습니다.

마찬가지로 다른 사람이 올린 프로젝트들에 대하여 평가하고 즐겨찾기로 등록할 수 있습니다. 프로젝트를 다운로드 받으면 다른 사람들이 구현한 노하우를 쉽게 참조할 수 있습니다.





2) 다운로드 및 설치
현재 버전은 1.2.1입니다. Mac OS X와 Windows용이 있습니다. (Linux 버전은 현재 작업중이라고 합니다.) 사용하는 OS 버전별로 다운로드를 받으시면 됩니다. 최소 설치 사양은 아래와 같습니다.
  • 해상도 :  1024 x 768이상, 16비트 컬러 이상
  • OS : MS 윈도우 98 이상, 맥 OS X 10.3 이상
  • 하드디스크 : 120MB 이상

맥에서는 압축만 풀고 바로 사용할 수 있습니다. 윈도우에서는 인스톨 버젼(exe)를 실행하시면 됩니다.

현재 스크래치에서 지원하는 언어는 아래와 같습니다. 생소한 언어들도 있는데 한국 뿐만 아니라 중국, 일본도 없습니다. 로컬화는 매우 쉽습니다. 하지만 이전에 한글화를 시도해 본적이 있었는데 깨져서 나왔습니다. 아쉽지만 1byte 코드를 사용할 수 없는 언어들은 표시할 수가 없는 것 같습니다. 그래서 한글과 같은 아시아권 언어가 없는 것 같습니다.

Català, Cesky, Dansk, Deutsch, English, Español, Français, Galego, Italiano, Magyar, Nederlands, Norsk, Polski, Português, Româna, Slovencina, Suomi, Svenska

이제 스크래치 아이콘을 클릭하여 실행하여 봅니다. 아래와 같이 실행되면 스크래치를 사용하여 작업을 할 준비가 완료된 것입니다.

사용자 삽입 이미지


3. 기타 유용한 정보

1) Board
사용자 삽입 이미지
PC와 연결해서 입력을 받아 스크래치로 전달하는 보드입니다. 슬라이드와 버튼이 있어 스크래치로 만든 게임등의 프로젝트에서 입력 받을 수 있습니다.



이외에도 라이트와 사운드 센서가 있고, 전기저항을 감지할 수 있는 악어클립으로 사용자가 입력을 커스터마이징 할 수 있습니다.  

PC와의 연결은 USB를 이용하며, 맥 OS X와 윈도우 드라이버를 제공합니다. 가격은 25달러(US)이며, 운송비로 미국내에서는 5달러, 그 외의 나라들은 20달러가 추가 됩니다. 우리나라에서 주문을 하려면 45달러가 듭니다. 

2) Card
사용자 삽입 이미지
PDF로 되어 있는 스크래치의 중요 동작들에 대한 카드입니다. 앞면에는 동작의 예가 있으며 뒷면에는 구현방법에 대한 설명이 있습니다.

아래와 같이 칼라 프린트로 출력한 후에 오려서 코팅을 해주면 아이들이 오래도록 잘 사용할 수 있을 것 같습니다.

사용자 삽입 이미지

3) 참조할 내용
사용자 삽입 이미지
홈페이지의 support메뉴를 클릭하시면 스크래치를 사용하는데 도움이 되는 다양한 자료들을 보실 수 있습니다.

이곳에서 레퍼런스 가이드를 다운로드 받거나 동영상 강좌를 보실 수 있습니다. 이외에도 다양한 자료들이 있으니 방문하셔서 확인해 보시기 바랍니다.





마지막으로 제가 이전에 작성한 관련 포스팅들을 링크하고 마치겠습니다. 다음 장부터 본격적인 스크래치의 사용법에 대해서 알아보겠습니다.
AND

올블로그에서 익호님 블로그의 글을 읽다가 프로그래밍 언어의 사용 순위를 매겨놓은 웹사이트가 있다는 것을 알게 되었습니다. 사이트를 가보니 구글, MSN, 야후, 유튜브 등의 검색엔진의 랭킹을 참조해서 순위를 매겨 놓았다고 설명되어 있습니다.

아래가 1위 부터 20위까지의 언어입니다.
사용자 삽입 이미지

요즘 자바가 많이 사용되는 지는 대충 들어서 알고 있었지만, 저 정도까지 높다는 사실이 놀랍습니다. 자바에 이어 노장 C 형님의 2위 수성은 반가운(?) 소식 이네요.

20위 까지를 보면 서버 사이드에서 사용하는 언어들이 많이 있네요. 네이티브 어플리케이션은 점점 줄어 드는 방면에 웹을 이용한 플랫폼과 서비스들이 기하급수적으로 증가하는데 원인이 있는 것 같습니다.
 
가장 많은 상승폭을 보인 언어는 Lua인것으로 보입니다. 게임 제작 시 스크립트용으로 많이 사용된다는 이야기를 들었는데 궁금해집니다.

반면에 C++ 사용자가 8.7%밖에 안됩니다. 그 중에 MFC를 사용하는 윈도우즈 프로그래머는 한 5% 정도 될려나 모르겠습니다. 어쨋든 VC의 MFC가 현업에 있을 때 가장 많이 사용했던 환경이라 같은 MS의 .NET과 Java에 밀려 가는 모습이 안스럽니다. 하지만 MS의 윈도우에서 개발시에는 구글링 등의 웹검색 보다 MSDN을 더 많이 참조하니 MS 툴들의 실제 수치는 더 높지 않을까 생각됩니다.

그외에 Delphi의 선전과 D언어가 14위에 있다는 사실도 눈에 뜁니다. 아마 D 언어는 실제 사용보다 호기심에서 많이 찾아 본 것 같은데, 실제로도 설마 저만큼 쓰이는지 궁금하네요.
 
그 다음은 제 블로그에서 주로 다루는 Objective-C 입니다. 47위 보다 0.071%가 눈에 확 들어 옵니다. "안습"이란 인터넷 언어가 이렇게 마음속에 쏙 들어 온적은 처음입니다.
사용자 삽입 이미지

0.071%이면 그 중에서 반수는 애플사의 개발진이 아닐까 하는 생각도 듭니다. 역시 Objective-C는 관심 받지 않고 혼자 놀기에 딱 적당한 언어인 것 같습니다. ^^;
AND

다이알로그는 MS 윈도우의 MessageBox와 같이 간단한 메시지 출력이나 사용자로 부터 선택사항을 입력 받는 윈도우입니다. cocoa에서 다이알로그를 구현하는 방법에 대해서 간단하게 알아 보겠습니다.


1. NSAlert

사용자 삽입 이미지

AppKit의 NSAlert은 위와 같이 간단한 경고창을 출력하게 해주는 기본 클래스 입니다. 아래는 NSAlert을 사용하여 위와 같은 알림창을 뛰우는 간단한 예입니다.

int returnValue;
NSAlert *alert = [[NSAlert alloc] init];
   
[alert addButtonWithTitle:@"button1"];
[alert addButtonWithTitle:@"button2"];
[alert addButtonWithTitle:@"button3"];
[alert setMessageText:
        [NSString stringWithUTF8String:"알림입니다."]];
[alert setInformativeText:
        [NSString stringWithUTF8String:"이알림은 테스트용 입니다."]];
[alert setAlertStyle:NSWarningAlertStyle];
  
returnValue = [alert runModal];
   
[alert release];

1) addButtonWithTitle:
버튼을 추가합니다.

2) setMessageText:
출력될 메시지를 설정합니다.

3) setInfomativeText:
메시지에 대한 상세 설명을 설정합니다.

4) setAlertStyle:
경고창의 아이콘을 결정합니다. 아이콘의 종류는 아래와 같습니다.

> NSWarningAlertStyle
일반적인 경고창입니다.

> NSInformationalAlertStyle
NSWarningAlertStyle과 동일합니다. 하위 호환성을 위해서 존재하는 것 같습니다

> NSWarningAlertStyle
사용자 삽입 이미지
좌측과 같이 어플리케이션 아이콘 뒤로 경고 아이콘을 출력합니다.




5) runModal
경고창을 오픈합니다. 종료시에는 사용자가 클릭한 버튼 값을 반환합니다. 첫번째 버튼부터 아래와 같이 정의되어 있습니다. 버튼이 세개 이상일 경우에는 1003부터 순차적으로 증가된 값을 반환합니다.

enum =  {
    NSAlertFirstButtonReturn  = 1000,
    NSAlertSecondButtonReturn  = 1001,
    NSAlertThirdButtonReturn  = 1002
};

6) Help
사용자 삽입 이미지

위와 같이 경고창 좌측에 Help(?) 버튼을 두고 사용자가 클릭시 원하는 행동을 지정할 수 있습니다. NSAlert에서 아래와 같이 속성을 설정합니다.

[alert setShowsHelp:YES]

   경고창에 Help 버튼을 출력합니다.

[alert setDelegate:self];
   Help 버튼 클릭시 alertShowHelp 메시지를 받을 오브젝트를 설정합니다.

아래는 버튼 클릭 시 웹페이지 또는 html 파일을 오픈하는 예입니다.

- (BOOL)alertShowHelp:(NSAlert *)alert
{   
    NSURL *url = [NSURL URLWithString:@"http://www.cocoadev.co.kr"];
    return [[NSWorkspace sharedWorkspace] openURL:url];

/* 번들 리소스의 help.html에서 불러 옵니다. 

    NSString *path = [[NSBundle mainBundle]
            pathForResource:@"help" ofType:@"html"];
    return [[NSWorkspace sharedWorkspace] openFile:path];
*/   
}

NSAlert *alert = [[NSAlert alloc] init];
   
[alert addButtonWithTitle:@"button1"];
[alert addButtonWithTitle:@"button2"];
[alert addButtonWithTitle:@"button3"];
   
[alert setMessageText:
        [NSString stringWithUTF8String:"알림입니다."]];
[alert setInformativeText:
        [NSString stringWithUTF8String:"이알림은 테스트용 입니다."]];
[alert setAlertStyle:NSCriticalAlertStyle];

[alert setShowsHelp:YES];
[alert setDelegate:self];
   
returnValue = [alert runModal];
   
[alert release];


2. Sheet
사용자 삽입 이미지

Sheet은 위와 같이 윈도우의 타이틀바 밑으로 내려오는 판넬을 의미합니다. NSAlert의 beginSheetModalForWindow으로 구현할 수 있으며 사용예는 아래와 같습니다.

- (void)alertDidEnd:(NSAlert *)alert
           returnCode:(int)returnCode
          contextInfo:(void *)contextInfo
{
    NSLog(@"returnCode %d", returnCode);
}

NSAlert *alert = [[NSAlert alloc] init];
   
[alert addButtonWithTitle:@"button1"];
[alert addButtonWithTitle:@"button2"];
[alert addButtonWithTitle:@"button3"];
[alert setMessageText:
        [NSString stringWithUTF8String:"알림입니다."]];
[alert setInformativeText:
        [NSString stringWithUTF8String:"이알림은 테스트용 입니다."]];
[alert setAlertStyle:NSWarningAlertStyle];
   
[alert beginSheetModalForWindow:[NSApp mainWindow]
                      modalDelegate:self
                     didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
                        contextInfo:NULL];  

1) Window
Sheet의 부모 윈도우를 설정합니다. 이 윈도우의 타이틀 바에서 Sheet가 오픈됩니다.

2) modalDelegate
Sheet의 메시지 처리를 위임 받을 오브젝트를 설정합니다. 이 오브젝트가 didEndSelector에서 설정된 메소드로 종료 메시지를 받습니다.

3) didEndSelector
Sheet가 종료될 때 불려지는 메소드입니다. 사용자의 선택에 따라 처리할 내용이 있을 경우, 여기서 처리합니다. 사용하지 않을 경우에는 nil로 설정합니다.

4) contextInfo
종료시 호출되는 메소드(didEndSelector)에 전달되는 사용자 정의 인자입니다.  종료 메소드에서 필요한 정보가 있을 경우에 설정합니다.


3. NSRunAlertPanel
NSRunAlertPanel 함수를 이용하면 NSAlert 클래스를 이용하는 것보다 편리하게 경고창을 구현할 수 있습니다. NSRunAlertPanel은 아래과 같이 선언되어 있습니다.

NSInteger NSRunAlertPanel (
  NSString *title,
  NSString *message,
  NSString *defaultButton,
  NSString *alternateButton,
  NSString *otherButton,
  ...
);

title, message,  세개의 버튼 타이틀을 인자로 가지고 있습니다. 사용하지 않는 버튼은 nil로 선언하면 출력되지 않습니다. 유의 하실 점은 마지막에 "..."로 가변인수를 가지고 있어 편리하게 사용할 수 있다는 점입니다.

이 가변인수는 message필드에 적용되며 실제 사용 예는 아래와 같습니다.
 
NSRunAlertPanel([NSString stringWithUTF8String:"알림입니다."],
      [NSString stringWithUTF8String:"이알림은 %d, %s 입니다."],
      @"default", @"alternate", @"other", 10, "test");

이를 실행하면 아래와 같습니다.
사용자 삽입 이미지

반환값은 아래와 같습니다. 오류(NSAlertErrorReturn)가 있을 경우를 제외하고는 각각 클릭된 버튼값을 반환합니다.

enum {
   NSAlertDefaultReturn = 1,
   NSAlertAlternateReturn = 0,
   NSAlertOtherReturn = -1,
   NSAlertErrorReturn = -2
};

NSAlert의 NSWarningAlertStyle과 같은 아이콘을 출력하실려면, NSRunCriticalAlertPanel을 사용하시면 됩니다.


4. NSBeginAlertSheet


사용자 삽입 이미지

 NSRunAlertPanel과 같은 사용법으로 NSAlert 클래스를 이용하는 것보다 편리하게 Sheet를 구현할 수 있습니다. NSBeginAlertSheet은 아래과 같이 선언되어 있습니다.

void NSBeginAlertSheet (
   NSString *title,
   NSString *defaultButton,
   NSString *alternateButton,
   NSString *otherButton,
   NSWindow *docWindow,
   id modalDelegate,
   SEL didEndSelector,
   SEL didDismissSelector,
   void *contextInfo,
   NSString *msg,
   ...
);

사용법은 이전의 예와 유사하며, 새로 추가된 인자만 설명하겠습니다.

1) didDismissSelector
Sheet가 사라될 때 불려지는 메소드이며, 사용하지 않을 경우에는 nil로 설정합니다.
didEndSelector보다 나중에 호출됩니다.

2) contextInfo
종료시 호출되는 메소드(didEndSelector, didDismissSelector)에 전달되는 사용자 정의 인자입니다.  종료 메소드에서 필요한 정보가 있을 경우에 설정합니다.

Sheet 사용 예는 아래와 같습니다.

- (void)sheetDidEndShouldDelete: (NSWindow *)sheet
                     returnCode: (int)returnCode
                    contextInfo: (void *)contextInfo
{
    NSLog(@"result %d", returnCode);
}

NSBeginAlertSheet([NSString stringWithUTF8String:"알림입니다."],
                      @"default",
                      @"alternate",
                      @"other",
                      [NSApp mainWindow],
                      self,
                      @selector(sheetDidEndShouldDelete:returnCode:contextInfo:),
                      NULL,
                      NULL,
                      [NSString stringWithUTF8String:"이알림은 %d, %s 입니다."],
                      10, "test");

NSAlertParnel과 동일하게 NSBeginCriticalAlertSheet을 사용하면 경고 아이콘을 출력할 수 있습니다.
AND

> 01.08 08:54 항목 더블 클릭시 항상 마지막에 저장한 블로그의 링크로 가는 오류를 수정했습니다. 이전에 받으신 분들은 새로 다운로드 받아 주세요. 불편을 드려 죄송합니다.

티돌이가 1.0B로 업그레이드 되었습니다. 저도 2개의 블로그로 몇시간 사용 안해보고 업로드 하는 것이라 오류가 있을 수 있을 수 있습니다. 제가 사용하면서 오류가 발견하거나 알려 주시는 분들이 계시면 수정해서 다시 올리겠습니다.

- 변경 내역
  • 아이콘 변경 - 이쁜 아이콘으로 변경하였습니다.
  • 다중 블로그 등록 - 30개 이하로 여러 tistory 블로그를 등록하실 수 있습니다.

1. 실행

사용자 삽입 이미지
이전과 같이 다운로드 받으신 후에 압축을 풀면 바로 사용가능 합니다.

처음 티돌이를 실행하면 좌측과 같이 빈화면이 실행됩니다. 이전에 등록해 놓으신 블로그 정보를 가지고 오지 않습니다. 그래서 사용하실 블로들을 새로 등록하셔야 합니다.

티돌이 메뉴에서 환경설정을 클릭하시고 아래의 내용을 참조하여 환경을 설정하고 사용하시는 티스토리 블로그들을 등록합니다.


2. 설정
 
1) 일반 설정
사용자 삽입 이미지
일반 설정에 있는 항목들은 모든 블로그들에 영향을 줍니다.

내용은 이전과 동일합니다.







2) 블로그 목록
사용자 삽입 이미지
블로그 목록에서는 tistory 블로그들을 등록/변경/삭제하실 수 있습니다.

변경시에는 해당 블로그를 더블클릭하시면 됩니다. 변경된 내용은 다시 실행할 필요 없이 바로 적용이 됩니다.





3) 블로그 등록/수정
사용자 삽입 이미지
> 블로그명: 해당 블로그의 이름을 입력합니다.
> 블로그 주소: "cocoadev.tistory.com"과 같이 블로그의 도메인 주소를 입력합니다. "/"이나 "html"등을 입력하시면 안됩니다.

> 아이디/패스워드: 관리자 로그인 아이디/패스워드를 입력합니다.


4) 테스트
사용자 삽입 이미지
티돌이 상단에서 등록된 블로그들을 선택하시면, 해당 블로그의 내용들이 출력됩니다.

현재 선택된 블로그의 오늘 방문자 수가 티돌이 아이콘에 표시됩니다. 선택되지 않은 블로그라도 아이콘에 방문자수가 표시되지는 않지만 댓글등록 등의 변경이 생기면 알려 줍니다.






3. 감사드립니다.

사실 사용하는데 별 지장이 없어 항상 업그레이드를 미루었는데, 아래의 두분께서 아이콘을 보내 주셔서 어쩔수없이(?) 업그레이드를 하게되었습니다.

사용자 삽입 이미지
kharus 님이 보내 주신 아이콘입니다.

보내 주신지 몇개월 되었는데 이제서야 사용하게 되었네요. 감사합니다.


사용자 삽입 이미지
oinon님이 보내 주신 아이코입니다.

버그도 알려 주시고 멋진 아이콘 만들어 주셔서 감사합니다.


둘다 이쁘고 어느 한분의 아이콘을 선택할 수가 없어 아이콘만 틀린 두가지 버젼으로 배포합니다. 아이콘이외에는 차이가 없으니 마음에 드는 아이콘 버젼을 다운로드 받으시면 됩니다.

사용자 삽입 이미지



사용자 삽입 이미지



이 후 부터는 배포상의 편의를 위해서 한 아이콘만 사용할려고 합니다. 마음에 드시는 아이콘을 댓글로 알려 주시면 많은 분들이 선택하신 아이콘으로 사용할려고 합니다.

추후 업그레이드는 테터툴즈와 워드프레스, 두개의 설치형 블로그를 지원할려고 생각하고 있습니다. 티스토리와 다르게 MySQL에 직접 접속해서 데이터를 가져오는 방식으로 만들려고 합니다. 설치형 블로그를 사용하시는 분들 중 대부분이 호스팅 업체를 이용하실 것 같은데, MySQL 계정이 외부접속도 허용하도록 설정되어 있는지 모르겠네요. 알아봐야 할 것 같습니다.
AND

사용자 삽입 이미지
스티브 워즈니악에 관한 책이 나왔습니다. 개인적으로 존경하는 분이라 무척 관심이 갑니다. 애플을 나와 아이들 교육을 위해 초등학교 교사-교수도 아니고 초등학교 교사라니 재능을 낭비하는 게 아닌가 하는 생각도 드네요-로 들어가 자비로 맥을 구입하여 아이들을 가르쳤다고 합니다. 지금은 다시 애플로 갔다는 얘기를 들은 것 같습니다.

애플과 맥에 많은 관심이 있지만 스티브잡스의 아이콘이 나왔을 때는 별 관심이 없었는데, 이 책은 구입해서 읽어 보고 싶다는 생각이 듭니다. 인상이 다소 날카로워 보이는 잡스와는 달리 이웃집 아저씨처럼 푸근하고 친근해 보이지 않나요?

(이미지 출처:yes24)

그러고 보니 빌게이츠의 "미래로 가는길"과 "생각의 속도"는 목차도 안보고 책꽂이에 몇년째 그대로 있습니다. 두권 모두 이전에 친구 와이프에게 선물로 받은 것들입니다. 아마 제가 IT 관련 일을 하고 있으니 가장 유명한 빌게이츠의 책을 선물로 준 것 같습니다.

읽지 않은 이유는 빌게이츠나 MS를 싫어해서가 아니라 프로그래밍에 직접적인 관련이 없어서였습니다. 웬지 회장님들의 책은 별로 관심이 가지 않았습니다. 이젠 나이에 맞게(?) 보통 사람들이 보는 베스트셀러나 교양서적도 읽어 봐야 겠다는 생각이 듭니다. 너무 한쪽으로 치우친 교양 없는 삶을 산 것 같습니다.

사용자 삽입 이미지
이왕 책 광고 하는김에 하나 더 해보겠습니다. 요즘 쉬엄쉬엄 읽기 시작한 Beautiful Code란 책입니다. 내용은 38명의 유명한 프로그래머들이 추천하는 코드와 그와 관련된 설명입니다.

앞페이지를 보면 저자가 찰스 페졸드외 37인으로 되어 있는데, 나머지 분들도 "외 37인"으로 뭉퉁거려질 분들은 아닙니다. 첫장이 브라이언 커니핸 옹이니까요.

아직 첫장도 다 안읽었지만 추천할 수 있는 책이라는 생각이 듭니다.

(이미지 출처:yes24)

다만 몇 페이지 안 읽었지만 번역이 조금 걱정되는데요. 1장을 보면 제목의 일부인 pattern matching이 패턴 부합(附合)으로 번역되어 있습니다. 매칭이라고 그냥 써주는 것이 이해가 더 빠를 것 같고, 한자로 쓴다면 符合이 맞는 것 같은데 확실하지 않습니다.

2008.01.18 추가
저자분이 저의 다른 블로그에 댓글을 주져서 확인해 보았습니다. 다시 보니 유한자동자로 번역되어 있는 것을 제가 착각해서 "유한자동차"로 잘 못 이해했습니다. 저의 불찰로 잘못된 정보를 드려 죄송합니다.

아울러 역자분의 홈페이지를 찾아 가보니 번역에 관해서 많은 노력을 하고 계신 실력있는 분이셨습니다. 저의 무지와 과오로 역자분께 심려를 끼쳐 드려 죄송하다는 말씀 드립니다.

그리고 다음 페이지에 finite automata를 "유한자동차"로 번역을 해 놓은 부분도 잘 이해가 가지 않습니다. 아래와 같은 문장이 있습니다.

"사실 정규식이 나타내고자 하는 바는 유한자동차가 나타내고자 하는 바와 동등하다."
 
"유한자동차"는 중국의 자동차 회사 이름 같다는 느낌이 듭니다.

역자의 약력을 보니 오래전 부터 관련서적의 번역일을 해왔고, 많은 훌륭한 책들을 번역하신 실력있는 분같습니다. 역자가 의도적으로 이렇게 표현한 것 같은데, 본래 오토마타를 이런 표현으로 사용되는 건지 잘 모르겠네요. 아직 더 읽어봐야 겠지만 내용 자체는 추천합니다.

2007년 마지막 포스트는 책광고로 마감합니다. ^^

'책 이야기 > IT 일반' 카테고리의 다른 글

미래를 만든 Geeks  (1) 2010.06.24
번역서의 표지 디자인  (8) 2009.08.31
소프트웨어 크리에이티비티 2.0  (0) 2009.07.21
드리밍 인 코드  (2) 2009.05.20
레이몬드 첸의 윈도우 개발 282 스토리  (0) 2008.01.18
AND

1. 2007년을 보내고...

개인적으론 이 블로그로 인해 의미있는 한 해였습니다. 무엇보다 제 자신에게 강한 동기부여가 된 것이 가장 큰 의미로 보고 있습니다. 블로그를 하지 않았으면 간단한 프로그램 몇 개만 만들어보고 OS X에서의 개발에 대한 관심을 접었을지도 모른다는 생각도 듭니다.

이전에도 오픈하고 5개월정도에 블로그를 돌아보는 포스팅을 올린적이 있는데, 다시 해가 바뀐다는 이유로 그 동안의 결산 및 내년 블로그 운영 계획을 간단히 세워 볼려고 합니다.

1) 접속 통계
우선 구글 애널리틱스를 통한 통계는 아래와 같습니다.
  • 통계 기간: 2007년 5월 12일 ~ 2007년 12월 29일
  • 총 방문자 수: 17,321명
  • 하루 평균 방문자 수: 75명

사용자 삽입 이미지

방문통계를 보면 간혹 프로그램 공개나 "개발자에게 드리는 맥 전향자의 수기(手記)"와 같은 다소 민감한 주제를 올렸을 때를 제외하고는 잔잔한 낮은 파도와 같은 모습입니다.

로봇 제외 플러그인을 사용한 티스토리에서 본 총방문자수는 31,593명입니다. 티돌이로 보았을 때 갑자기 카운트가 급등하는 모습을 간혹 본적이 있습니다. 아마 로봇 또는 서버에 의한 자동접속을 제대로 걸러내지 못하고 있는 것 같습니다.


2) 분류별 접속 통계
a. OS
> 윈도우(68.16%), 맥(30.48%), 리눅스(1.18%)

블로그 성격 상 맥 사용자 비율이 일반 블로그 보다 많은 것 같습니다. 리눅스만 30%가 늘어 실제 OS 사용자 비율이 30%/30%/30% (10% 기타)정도면 이상적일 것 같다는 생각을 해봅니다.

흥미로운 것은 iPod, iPhone 사용자들이 서서히 통계에 잡히며 늘어 나고 있습니다. 개인적으론 부럽습니다.

b. 브라우저
> 익스플로어(59.82%), 파이어폭스(20.33%), 사파리 (18.31%), 오페라(0.97%)

이 역시 OS와 마찬가지입니다.

c. 국가
> 한국, 미국, 일본, 독일, 캐나다, 캐냐, 중국, 영국, 호주, 프랑스

특이한 것은 유럽(독일, 프랑스, 영국)에서 들어 온 유입자의 반송률이 가장 낮다는 것입니다. 한국어로 되어 있는데도 한국의 반송률이 72.89%인데 유럽권은 40~50% 입니다. 혹시 해당 국가의 한국분들이 보시는 것인지 모르겠습니다. 보자마자 나가시는 분들의 순위는 캐나다, 한국 순입니다.

3) RSS 구독자
사용자 삽입 이미지

위는 feedburner의 구독자 통계입니다. 접속통계와는 다르게 시간이 흐를 수록 상향곡선을 보이고 있습니다. 사실 지치지 않고 편하게 포스트를 작성할려고 하는데, 누군가가 구독하고 있다는 사실은 의무와 책임을 느끼게 합니다.


2. 2008년을 맞으며...

1) 기본방향
"별다른 생각과 고민 없이 지금처럼 하자" 입니다. 사실 개인 블로그라는 위안을 가지며 이기적인 운영을 하고 있습니다. 이런 생각을 하는 이유는 두가지 입니다.

a. 계획 없고 성의 없는 포스팅 입니다.
개인적인 관심으로 슈팅게임 강좌를 시작했지만, 중간에 덕수리를 만듬으로써 관심과 의욕이 많이 사라진 상태가 되었습니다. 약간의 노력과 시간만 들이면 마무리를 할 수 있는데 아직까지 미루고 있는 상태입니다.

b. 완성도 없는 제작물에 대한 공개입니다.
개인적인 필요에 의하여 몇가지 자잘한 툴들을 만들어 공개하였습니다. 직접 제 자신이 사용자로서 몇몇 오류가 있음을 알고 있지만, 치명적이지 않다는 이유로 손을 놓고 있습니다. 아무리 공개고 무료지만 기능 추가나 개선은 커녕 버그 수정도 안하고 있다는 사실이 사용할 때마다 마음에 걸립니다.

그럼에도 불구하고 별다른 변경없이 지금처럼 운영할려는 것은 "이 블로그는 근본적으로 저를 위한 블로그"이기 때문입니다. 블로그를 운영하면서 "주기적으로 포스팅을 해야 한다" 또는 "많은 사람이 관심있는 내용이어야 한다"와 같은 책임감이나 방문객 수와 같은 성취목표를 가지지 않을려고 합니다.

지금과 같이 늘 제게 기분 좋은 공간이어야 하며, 책임과 목표로 인한 스트레스를 받지 않는 곳으로 유지할려고합니다. 이를 위해서는 바라는 것도 없어야 하고, 무엇을 주어야 한다는 부담감도 없어야 된다고 생각합니다.

어느날 feedburner의 구독자가 모두 사라지거나 방문자가 10명이하로 줄더라도 초연하게 제가 좋아하는 분야에 대해서 공부하고 기록하고 매개체가 될 수 있는 곳으로 만들려고 합니다.


2) 목표 및 바램


a. cocoa 강좌
현재 튜토리얼이라는 명목으로 구성과 내용이 너무 자유분방한 것 같습니다. 이는 제 자신이 체계적으로 공부를 하지 않았기 때문입니다. 그때 그때 관심이 생기는 분야만 포스팅을 하였습니다. 이제 다시 기본 부터 시작하고 정리해 나가면서 포스팅을 해볼려고 합니다.

b. 어린이 프로그래밍 강좌
미술교육은 아이들의 창의력과 감성에 많은 도움을 줍니다. 폴그레이엄이 해커와 화가라는 책에서도 비유했듯이 프로그래밍도 이와 유사한 면이 있습니다. 그림과 같이 아무것도 없는 하얀 도화지로 시작에서 머리속의 생각만으로 무엇인가 의미있는 것을 만들어 갑니다.

프로그래밍이 아이들의 창의력과 논리/추리력에 많은 도움을 줄 수 있다고 생각하고 있습니다. 그래서 제 아이에게 적용해 보기위해 여러 툴들과 책을 사주었지만, 현재까지 결과는 제가 생각하기에 실패입니다.

관련 웹페이지가 영어로 되어 있고, 어린이를 위한 서적이 없기 때문이기도 합니다만... 결정적으로 부모의 계속적인 관심과 지도, 칭찬이 필요하다는 사실을 알았습니다. 전 아이가 바라는데도 불구하고 책과 웹사이트, 툴에만 전적으로 역활을 맡겼기 때문인 것 같습니다.

1차적으로 제 아이를 위해 따로 분류를 만들어 가능하면 쉽고 재미있게 프로그래밍에 대한 강좌를 해볼려고 합니다. Java 아니면 Scratch를 이용해볼려고 하는데 아직 정확한 계획은 없습니다.

c. 공개 어플리케이션 개발
꾸준히 업그레이드 할 수 있는 개인 프로젝트를 하나 진행해 볼려고 합니다. 한메타자와 같은 맥용 타자 프로그램이나 FTP 클라이언트, 티돌이 확장 등을 생각하고 있는데 정확히 무엇을 만들지는 역시나 정하지 못했습니다.

이상으로 이 블로그의 올 한해를 간단히 정리하고 내년을 계획해 보았습니다. 내년 3월쯤에 하나도 지킨게 없어 이 프스팅에 대한 후회와 반성이 없었으면 좋겠습니다. ^^
AND

기타 2007. 12. 27. 16:32
윈도우의 APM_Setup처럼 OS X에서 APM(Apache+PHP+MySQL)을 간편하고 빠르게 설치해주는 툴입니다. MAMP 사이트에서는 다운로드가 되지 않아 소스포지에서 다운로드 받았습니다.

사용자 삽입 이미지
다운로드 받은 후에 dmg  파일을 클릭하면 좌측과 같이 원하는 제품을 어플리케이션 폴더로 드래그하는 것만으로 모든 설치가 완료됩니다.

MAMP Pro는 상용버전(61달러)으로 사용제한이 없고 기능이 추가된 제품입니다. 저는 무료인 MAMP를 설치하였습니다.

삭제도 매우 간단하여 어플리케이션에서 해당 폴더만 삭제하면 됩니다.

아파치와 MySQL포트가 다른 포트로 지정되어 있어, 저는 일반적으로 사용하는 80과 3306으로 변경하였습니다.

사용자 삽입 이미지

제가 다운로드 받은 MAMP 1.6 버젼에서는 아파치 2.0.59, PHP 5.21, MySQL 5.0.37이 설치되며 PHP는 PHP4로도 선택할 수 있습니다. 또한 아래와 같이 phpMyAdminSQLiteManager가 기본으로 설치되어 있습니다.

사용자 삽입 이미지

OS X는 리눅스(또는 유닉스)기반의 웹개발용 OS로는 매우 편리한 환경 같습니다.
AND

Greenfoot은 영국의 Kent 대학에서 쉽게 에니메이션이나 게임을 만들 수 있도록 해주는 Java를 기반으로 한 통합개발툴(IDE)입니다. Java로 만들어졌으므로 윈도우, 맥, 리눅스등 대부분의 환경에서 사용이 가능합니다.

1. 설치

설치는 매우 간단하며 우선 JDK가 설치되어 있어야 합니다. OS가 윈도우일 경우에는 JDK가 설치되어 있지 않으면 다운로드 받고 설치합니다. (맥은 설치되어 있습니다.)

 JDK 설치를 확인하고  greenfoot 사이트 다운로드 페이지에서 사용하는 OS별로 설치파일을 다운로드 받습니다. 맥에서는 압축파일만 풀면됩니다. (윈도우는 설치 파일을 실행합니다.)


2. 실행

greenfoot를 실행합니다. 메뉴에서 Scenario/New를 선택합니다. 상단의 File 입력창에 시나리오명을 입력하고 하단의 [Creat]버튼을 클릭 합니다. 저는 Test로 하였습니다. 아래와 같이 Greenfoot가 실행된 모습을 보실 수 있습니다.

사용자 삽입 이미지

1) 기본 클래스
기본으로 World와 Actor 클래스가 생성되어 있습니다. 두 클래스 모두 추상(abstract) 클래스이므로 바로 사용하실 수는 없습니다. greenfoot는 4개의 클래스로 이루어져 있습니다.

> Greenfoot
전반적인 시스템을 관리하는 클래스입니다. 사용자 입력, 속도, 효과음 출력, 시작, 중지 등에 관련된 메소드를 가지고 있습니다.

> GreenfootImage
화면출력을 담당하는 클래스입니다. 이미지/벡터 및 문자열 출력과 속성에 관한 메소드를 가지고 있습니다.

> World
스테이지(배경)를 관리하는 클래스입니다. 오브젝트 추가/삭제, 배경 및 타일 출력에 관한 메소드를 가지고 있습니다.

> Actor
World 에서 출력되는 오브젝트 클래스입니다. 오브젝트의 움직임과 속성에 관한 메소드를 가지고 있습니다.


2) Object 생성
사용자 삽입 이미지
먼저 World를 생성합니다. 좌측과 같이 World를 우클릭하여 나오는 메뉴에서 New subclass...를 클릭합니다.

클래스 이름을 MyWorld로 입력하고 [Ok] 버튼을 클릭합니다.



생성된 MyWorld를 다시 우클릭 하여 Set image... 를 클릭하여 backgrounds에서 적당한 이미지를 선택합니다.

그 밑의 Actor를 우클릭 하여 다시 New subclass...를 선택합니다. 저는 아래와 같이 클래스 이름을 Tux로 입력하고 리눅스의 마스코트인 tux.png이미지를 선택하였습니다. 각자 취향에 맞는 클래스명과 이미지를 선택한 후 [Ok] 버튼을 클릭합니다.

사용자 삽입 이미지

아래와 같이 MyWorld와 Tux가 생성된 것을 확인합니다.

사용자 삽입 이미지


3. 소스코드 편집

1) Tux class
Tux를 더블클릭하여 소스 에디터를 오픈하여 아래의 내용을 추가로 입력합니다.

import greenfoot.*;  // (World, Actor, GreenfootImage, and Greenfoot)

/**
 * Write a description of class Tux here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class Tux extends Actor
{
    private int speed = 2;
    /**
     * Act - do whatever the Tux wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */

    public void act()
    {
        // Add your action code here.
        int xpos = getX();
        int ypos = getY();
       
        if(Greenfoot.isKeyDown("up")) {
            setRotation(0);
            ypos -= speed;
        }       
        if(Greenfoot.isKeyDown("down")) {
            setRotation(180);
            ypos += speed;
        }
        if(Greenfoot.isKeyDown("left")) {
            setRotation(270);
            xpos -= speed;
        }
        if(Greenfoot.isKeyDown("right")) {
            setRotation(90);
            xpos += speed;
        }
        setLocation(xpos, ypos);
    }   
}

짐작하시는 바와 같이 키를 누르면 이미지를 방향에 맞게 회전시켜 전진하게 합니다. greenfoot에서는 범위를 넘어가면 자동으로 좌표가 조절되기 때문에 범위 체크를 하지 않았습니다.

2) MyWorld class
이제 MyWorld를 더블클릭하여 에디터를 오픈하여 아래와 같이 변경합니다.

import greenfoot.*;  // (World, Actor, GreenfootImage, and Greenfoot)

/**
 * Write a description of class MyWorld here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class MyWorld extends World
{

    /**
     * Constructor for objects of class MyWorld.
     *
     */
    public MyWorld()
    {   
        // Create a new world with 20x20 cells with a cell size of 10x10 pixels.
        super(40, 40, 10); // 스테이지 크기 변경
       
        addObject(new Tux(), 20, 20); // 오브젝트 등록
       
        // Put in your own background image by replacing "greenfoot.png" with the
        // image that should be used as background and uncommenting the line below.
       
        //setBackground("greenfoot.png");
    }
}

Tux를 우클릭하여 new Tux()를 선택하여 스테이지로 가져올 수 있지만, 실행 시에 항상 나타나게 하기위해 addObject 메소드로 World에 추가합니다. 이제 하단의 [Complie all]을 클릭하여 컴파일 후 [> run] 버튼을 클릭하여 테스트를 해봅니다.

3) 확인
아래와 같이 방향키에 따라 Tux가 움직이는 모습을 보실 수 있습니다. (greenfoot에 관해 자세한 사항은 Greenfoot 홈페이지에서 메뉴얼과 다양한 시나리오를 다운 받으실 수 있습니다.)

사용자 삽입 이미지
홈페이지에서 소개를 보면 고등학교 이하의 학생들의 교육을 위한 툴이라고 되어 있습니다. 프로그래밍 또는 Java를 처음 시작하는 학생들을 위해 딱딱하지 않고, 쉽게 흥미를 갖고 배울 수 있게 해 줄 것 같습니다.

Kent대학에서 만들어진 또다른 유사품으로 BlueJ가 있습니다. 이는 Java를 이용해 OOP를  가르치기 위한 툴도 있으니 흥미있는 분들은 홈페이지에서 확인해 보세요.

'개발 툴' 카테고리의 다른 글

적당히 참견하는 Xcode  (4) 2008.02.25
OS X의 파이썬  (0) 2008.02.20
Xcode에서 Flex - Hello World 작성  (0) 2007.12.12
Adobe Flex Builder를 딱 한번 써보고...  (8) 2007.12.03
구글 Android 개발환경 둘러 보기  (8) 2007.11.14
AND

[Flash] http://www.cocoadev.co.kr/attachment/gk27.swf



아들 녀석이 만들어준 성탄카드를 빌려 크리스마스와 새해 인사를 드립니다. 별 생각없이 만들어 놓은 블로그로 많은 기쁨이 된 것 같습니다. 방문해 주신 모든 분들께 감사드립니다.

2008년 한해에는 저도 그렇고 보시는 분들도 그렇고 좋은 일들만 가득했으면 합니다. 개인적으론 40대로 진입하는 첫해라 우울(?)하네요. ^^;
AND

Xcode에서 디버깅을 하는 방법에 대해서 알아 보겠습니다.

기본적인 내용만 간단히 알아 보는 것이므로, 보다 상세한 내용은 Xcode 메뉴얼이나 gdb 메뉴얼을 참고해 주세요.


1. 소스코드 편집

Xcode를 실행하고 New Project에서 Command Line Utility/Foundation Tool로 새로운 프로젝트를 생성합니다. 전 testDebug로 하였습니다. 소스파일 (testDebug.m)을 열고 아래와 같이 편집합니다.

#import <Foundation/Foundation.h>

int plusNum(int a, int b)
{
    int c;
    
    c = a + b;
    
    return c;
}

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    int i;
    char buff[10];
    
    for(i = 0; i < argc; i++)
    {
        NSLog(@"ARG: %d - %s", i+1, argv[i]);
    }
    
    NSLog(@"MY PATH: %s", getenv("MY_PATH"));
    
    for(i = 0; i < 10; i++)
    {
        buff[i] = '1' + i;
    }
    
    int a, b, c;
    a = 3;
    b= 5;
    
    c = plusNum(a, b);
       
    [pool release];
    return 0;
}


2. 실행인자, 환경변수 설정

빌드 후 실행하면 아래와 같이 ARG 값과 현경변수 MY_PATH의 값을 보실 수 있습니다. 실행 파일의 기본인자는 일반적으로 그 실행파일의 전체경로가 첫번째로 전달됩니다. (사용하시는 OS에 따라 간혹 다를 수 있습니다.) 임의의 MY_PATH 환경변수값은 설정되어 있지 않으므로 null로 출력되었습니다.

사용자 삽입 이미지

이제 디버깅 작업전에 프로그램 실행 시에 줄 수 있는 옵션들에 대해 간단히 알아 보겠습니다. Xcode 좌측의 Groups & Files에서 Executables항목에서 실행파일명을 더블클릭하여 정보창을 엽니다.

사용자 삽입 이미지
좌측과 같이 Arguments 항목 하단 좌측의 [+] 버튼을 눌러 Argument에는 "--all"을 입력합니다.

동일하게 아래의 환경변수창에서도 하단의  [+] 버튼을 눌러 Name에 MY_PATH를 Vale에 임의의 디렉토리를 입력합니다.

(참고로 세번째 Debugging 탭을 클릭하시면 사용하는 디버거, 기본 입출력, 원격 디버깅 등 상세한 디버거 정보를 설정할 수 있습니다. 일반적으로는 기본설정된 상태로 사용하시면 됩니다.)

이제 프로그램을 다시 실행시켜서 결과를 확인 합니다.





아래와 같이 추가된 인자  "--help"와  환경변수 MY_PATH가 "/usr/local/src"로 설정되어  출력되는 것을 확인하실 수 있습니다.

사용자 삽입 이미지


3. 디버거

Xcode에서 [shift+command+y] 또는 메뉴의 Debug/Debugger를 클릭하여 디버거를 실행합니다. 디버거를 실행하면 상단에서 아래와 같은 메뉴를 확인하실 수 있습니다.

사용자 삽입 이미지

> Build and Debug
빌드를 하고 성공하면 디버그를 실행합니다.

> Terminate
디버깅시 나타나며 클릭하면 실행과 디버깅을 종료합니다.

> Fix
디버깅 실행중에 소스 수정이 필요할 경우에는 소스를 수정하고 Fix를 실행하면, 종료/재시작 없이 계속 디버깅을 진행할 수 있습니다.

> Restart
Terminage와 Debug 명령을 동시에 실행하여, 종료 후 바로 디버깅을 재시작합니다.

> Pause
실행을 잠시 멈춥니다.

> Continue
실행이 중지되어 있을 때, 다음 브레이크포인트를 만나기 전이나 오류발생, 종료 전까지 계속 실행합니다.

> Step Over
함수를 만나도 함수내부로 디버깅을 하지 않고, 다음 라인을 실행합니다.

> Ste Into
함수를 만날 경우 함수내부로 진입하여 디버깅을 진행합니다.

> Step Out
현재 함수를 완료하고 호출된 지점으로 돌아 갑니다.

> Breakpoints
현재 라인에 브레이크포인트를 추가 또는 제거 합니다. 브레이크포인트는 디버깅 진행시 사용자가 확인을 위하여 어플리케이션 실행이 잠시 중지되는 위치 입니다.

> Console
gdb를 직접 사용할 수 있게 해줍니다.


4. 디버깅

1) 브레이크포인트 설정
디버깅 시 가장 중용한 것 중 하나가 브레이크포인트 입니다. 실행 중간 중간 변수 값 확인을 위해서 의심가는 위치에 실행을 정지하기 위해 브레이크포인트를 설정합니다.

브레이크 포인트는 소스코드 에디터상에서 [command+\]나 에디터 좌측의 판넬(gutter)를 더블클릭함으로서 설정/해제할 수 있습니다. 이제 위의 소스에서 b=5; 라고 되어 있는 라인에 브레이크포인터를 설정하고 디버그를 실행합니다.

사용자 삽입 이미지

위와 같이 브레이크포인트가 설정된 라인에서 프로그램 실행이 멈추었습니다. 우측 상단의 현재 변수값들을 확인해 보면 a는 3으로 지정되었으며 b는 아직 5로 설정되기 전이라 스택의 초기화되지 않은 값이 들어 있습니다.


2) 진행
이제 상단의 [Step Over]를 클릭 또는 [command+shift+o]로 한라인을 실행합니다.

사용자 삽입 이미지
좌측과 같이 b=5;의 한라인 실행되고 다음 라인으로 진행되었습니다.

우측 상단을 보시면 방금 변경된 변수 b가 붉은 색으로 5로 설정되어 있음을 알수 있습니다.




사용자 삽입 이미지
여기서 우측 상단의 변수 c를 우클릭하여 Whatch Variable로 설정합니다. Watch Variable은 변수값이 변경되었을 때 사용자에게 알려 줍니다. 설정되면 변수의 좌측에 돋보기 모양의 아이콘이 나타납니다.



사용자 삽입 이미지
이제 [Step Into] 버튼 [command+shift+i]로 plusNum함수 내부로 들어 가보겠습니다. 실행하면 좌측과 같이 plusNum 함수로 들어와 다음 실행을 위해 대기하고 있습니다.

여기서 잠시 중지하고 변수값을 변경해 보겠습니다.


사용자 삽입 이미지
디버거는 실행 중에 변수값을 변경해 가면서 테스트를 할 수가 있습니다. a=3, b=5로 소스코드에서 설정되어 있습니다. 이제 b의 값을 변경해 보겠습니다. 우측 상단 창에서좌측과 같이  b의 값을 10으로 변경합니다.

이제 다시 Step Over로 한 라인을 진행합니다.

사용자 삽입 이미지
진행하면 c는 13으로 되어 있슴을 확인할 수 있습니다. 또한 c는 Watch Variable로 설정되어 있기 때문에 값이 변했을 때 좌측과 같은 메시지 창이 나타납니다.



중요한 변수를 Watch Variable로 설정해 놓으면, 따로 브레이크포인트를 설정하거나 단계별로 진행하지 않더라도 변경시에만 편하게 알려 줍니다.


5. 기타

1) gdb
Xcode는 디버깅에 gdb를 이용합니다.  우측 상단의 [Console] 버튼을 클릭하면 gdb의 상태를 확인하거나 명령어를 직접 수행할 수 있습니다. 아래는 gdb에서 실행된 모습입니다. next 명령어로 한라인을 진행하고 배열 buff의 값을 파일로 덤프해 보았습니다.

사용자 삽입 이미지

사용자 삽입 이미지

 


위와 같이 터미널에서 buff에 들어 있는 메모리 값을 확인할 수 있습니다. gdb의 사용법을 익혀 놓으시면 빠르고 다양한 방법으로 디버깅을 할 수 있습니다.


2) 브레이크포인트 추가 옵션 설정
[option+command+b]로 브레이크포인트 창을 오픈하여 다양한 옵션을 설정할 수 있습니다. 아래는 해당 브레이크포인트 위치로 왔을 때 Log로 알려 주는 옵션입니다. 우측 하단에  Speak로 설정되어 있으므로, 해당 내용을 음성으로 출력합니다. Log로 설정하면 콘솔창으로 출력해 줍니다. 이외에도 다양한 명령어 및 로그를 설정할 수 있습니다.

사용자 삽입 이미지

Xcode에서 디버깅을 하는 방법에 대해서 간단히 알아 보았습니다. 프로그램은 구현하는 시간외에도 오류를 찾고 수정하는데도 많은 시간이 걸립니다. 디버거를 이용하면 쉽고 빠르게 오류를 찾아 낼 수 있습니다. 또한 디버깅 작업은 메모리리나 컴파일러가 수행하는 작업을 이해하는데 많은 도움을 줍니다.

gdb의 간단한 사용법만 숙지하시면 쉽게 Xcode의 디버깅 작업을 이해하고 수행할 수 있습니다.
AND

> OS: Unix 계열 (확인:Linux, OS X)
> Lang: C++
> 마지막 변경: 2007-12-14

블로그에서 RSS를 가져오는 간단한 클래스입니다. 공개되어 있는 가벼운 xml 라이브러리를 사용할려고 했는데, 데이터가 크면 오류가 나서 간단하게 만들어 보았습니다. 소스파일을 하나로 만들려다 보니 다른 라이브러리를 쓰지 않았습니다. 사용 가능한 socket, string, list 클래스들을 활용하시면 간단해 질 것입니다.

티스토리, 다음, 네이버에서 몇 개의 블로그들을 테스트를 해 보았습니다. 우선 아래의 파일을 다운로드 받으신 후에 압축을 풀면 소스 파일(brss.cpp, brss.h), makefile, 테스트 용 test_brss.cpp 네개의 파일이 있습니다.


make를 하시면 테스트 파일이 컴파일 되며, test_brss.cpp는 아래와 같습니다.

#include <stdio.h>
#include "brss.h"

int main(int argc, char* argv[])
{
    if(argc != 3)
    {  
        printf("\nUSAGE: test_brss [url] [domain]\n");
        return 0;
    }  

    char aszBuff[128];
    CBlogRss* pRSS = new CBlogRss;

    if(pRSS->GetData(argv[1], argv[2]) == false)
    {  
        printf("Fail to get data[%d]\n", pRSS->GetErrorLine());
    }  
    else
    {  
        T_BlogInfo* pBlog = pRSS->GetBlogInfo();

        printf("Blog %s, %s, %s, %d [E:%d]\n",
            pBlog->aszTitle, pBlog->aszLink, pBlog->aszDesc,
            pRSS->GetPostCount(), pRSS->GetErrorLine());
    }  

    for(int i = 0; i < pRSS->GetPostCount(); i++)
    {  
        T_BlogPost* pPost = pRSS->GetBlogPost(i);

        sprintf(aszBuff, "%d-%02d-%02d %02d:%02d",
            pPost->tTime.nYear, pPost->tTime.nMonth, pPost->tTime.nDay,
            pPost->tTime.nHour, pPost->tTime.nMin);

        printf(" > post %d: %s (%s) @ %s\n", i+1, pPost->aszTitle,
            pPost->aszLink, aszBuff);
        //printf(" > %s\n", pPost->pszDescription);
    }  

    delete pRSS;

    return 0;
}

테스트를 실행 하실려면 사용법은 아래와 같습니다.
> ./test_brss [blog_url] [path]

[blog_url] 에서 접속할 블로그 도메인을 'http://'나 주소 맨뒤에 '/'를 생략하고 입력합니다. [path]는 도메인을 제외한 주소입니다. 아래의 예를 보시면 쉽게 이해할 수 있을 것입니다.
사용자 삽입 이미지


소스를 보시면 아시겠지만 제가 만드는 것들이 다 그렇듯이 아주 아껴서 주석을 넣고, 필요한 만큼 대충 파싱을 하고, 대충 오류를 확인합니다. 아직  몇 개의 블로그 밖에 테스트를 하지 못했습니다. 버그나 사용시 오류가 있으면 댓글로 알려 주시면 감사하겠습니다.

가끔 뭘 올리기는 하는데 도움을 드릴려고 올리는 것인지, 테스트를 부탁 드리는 것인지 저도 혼동이 오네요. 당연한 이야기겠지만 사용하는데는 어떠한 제한도 없습니다.

'기타' 카테고리의 다른 글

프로그래밍 언어 인기 순위  (21) 2008.01.09
OS X APM 설치툴 - MAMP  (6) 2007.12.27
OS X용 정규 표현식 테스트 어플리케이션 - Reggy  (1) 2007.12.12
cocoa 이름의 유래  (6) 2007.11.30
맥용게임 Doukutsu  (3) 2007.11.21
AND

저에게 영향을 주었다기 보다는 그냥 제가 많이 들어 보고 막연히 좋아하는 프로그래머들과 평소 생각해 오던 저의 두서없는 생각을 이야기 해보려고 합니다. 사실 제가 프로그래머로서 가장 존경하는 분은 앨런 케이지만 저의 포스트에서 몇 번 언급을 했기 때문에 제외했습니다.

많은 훌륭한 프로그래머들이 있지만 세 분에 대해서만 이야기 해보겠습니다. 각 프로그래머에 대한 내용 보다는 그들하면 떠오르는 저의 잡다한 경험과 생각이 내용의 주가 될 것 입니다. 인물들에 대한 자세한 내용은 영문이름을 클릭하시면 위키피디아에서 자세한 내용을 보실 수 있습니다.

존 카맥

사용자 삽입 이미지
이름: John Carmack
생년월일: 1970년 8월 20일
학력: 미져리 대학 1년 중퇴
소속: ID soft
개발: Wolfenstein 3D, Doom, Quake



"존 카맥은 실력에 비해 명성이 과대평가 되었다. 소스가 형편없다. 그보다 뛰어난 3D 엔진을 만드는 프로그래머는 많다"라는 이야기를 간혹 듣습니다. 근래에는 그가 공개한 소스를 분석해본적도 없고, 3D 엔진의 우수성을 비교, 평가 할 만큼 알지 못하기 때문에 이에 대해서는 잘 모르겠습니다. 그리고 어느 한 부분만 보면 그 어떤 분야에서도 그는 최고는 아닐 수도 있습니다.

제가 그를 제가 좋아하고 최고로 여기는 이유는 그의 프로그래머로서 Geek한 면모가 강하기 때문입니다. 이는 저한테는 프로그래머의 모습으로 긍적적으로 보였기 때문입니다.

이전 둠 소스를 보면 정확히 기억은 나지 않지만 몇몇 소스들에서 존 로메로 와 다른 개발자의 이름을 볼 수 있었던 것 같습니다. 하지만 거의 대부분을 존카맥이 주도로 작업한 것으로 생각됩니다. C++을 사용하지 않고 전형적인 C 스타일과 적절한 주석에 군더더기 없는 코딩은 -이론 보다는 원하는 것을 만들어 낼수 있는- 굉장히 실용적인 프로그래머로 보였습니다. 또한 소스를 보니 그의 명성이 과연 명불허전이구나 하는 생각이 들었습니다.

ID 소프트 이전에 성공한 상용게임의 소스가 공개된 적이 있는지는 확실히 모르겠습니다. 이런 프로젝트의 소스를 공개했다는 자체만으로도 제 개인적으로 긍정적인 평가를 내릴 수 있었습니다.

그가 만든 많은 게임들이 리눅스를 지원하고, 오픈소스 프로젝트의 소스 파일에서도 간혹 그의 이름을 발견할 수 있습니다. 그리고 오래전 어느 잡지에서 "넥스트 스텝은 최고의 개발툴이다"라는 이야기를 한 것으로 기억됩니다. 이와 같이 상용게임 개발자로 바쁜 와중에도 경제적으로는 별 도움 되지 않는 멀티 플랫폼에 관심을 가지고, 소스를 공개하는 모습에서 저보다 나이는 한살 어리지만 존경합니다. ^^;

또한 카맥은 성실한 개발자로도 유명한데 낮에는 ID 소프트웨어에서 작업을 하고, 밤에는 그가 세운 아르마딜로 에어로 스페이스에서 우주선을 개발하고 있다고 합니다. 거의 일벌레 수준인 것 같아 가정생활은 우려 되기는 합니다. 하지만 많은 돈을 벌고도 끊임없이 다양한 분야에서 연구/개발하는 모습은 역시나 존경스러운 모습니다.


찰스 시모니

사용자 삽입 이미지
이름: Charles Simonyi
생년월일: 1948년 9월 10일
학력: 스텐포드 대학
소속: 마이크로 소프트
개발: MS Worlds, Excel





찰스 시모니는 엑셀과 워드를 개발한 MS의 프로그래머라는 것 이외에는 잘 알지 못합니다.  위키피디아를 보면 버클리, 스텐포드, 제록스 파크 등 당시 일반적으로 엘리트 개발자들이  거치는 코스를 거쳐 왔던 것 같습니다.

개인적으로 찰스 시모니에 대한 관심을 가지게 된 계기는 도스에서 윈도우즈 프로그램으로 넘어 오면서, 각 소스에서 기계적이고 인상적인 명명 규칙을 보고 나서였습니다. 나중에 이런 명명법을 헝가리안 표기법이라고 한다고 들었습니다.  어느 책에서-아마 코드 컴플릿 같습니다-찰스 시모니가 헝가리 사람이라 이런 이름이 붙여졌다고 본 것 같습니다.

이 표기법을 처음 보았을 당시에는 굉장히 효율적이다라고 생각하고, 제가 아는 범위내에선 언어/환경에 상관없이 절대적으로 따르고 사용했습니다. 유닉스에서도 저 명명법을 사용했다가 같이 근무하던 선배 유닉스 개발자들에게 아래와 같은 욕(?)을 많이 먹었던 것으로 기억되네요.

"세상이 아무리 C++로 변해도 유닉스는 C다. C++을 사용하지 말고, 외계어 같은 명명법을 고쳐라."

당시 저보다 연배가 높은 유닉스 프로그래머들은 심하게 얘기하면, Dos에서 프로그래밍은 애들 장난, 윈도우즈에서 프로그래밍은 마우스질로 보는 분들이 계셨습니다. - 물론 저는 이 생각에 동의하지 않습니다.- 지금과는 달리 툭하면 블루 스크린을 토해내는 윈95와 당시 고가의 하드웨어에서 돌아 가던 유닉스와 유래 깊은 C프로그래밍 환경으로 유닉스 프로그래머에 대한 상당한 자부심을 가지고 계셨던 것 같습니다.

아무튼 찰스 시모니는 명명법이외에도 워드/엑셀 개발자로도 유명합니다. 엑셀이 맥에서 먼저  나왔으니, 초기 맥 어플리케이션 개발자일 수도 있겠습니다. ^^; 사실 이분은 잊고 있었는데, 얼마 전 232억을 들여 우주여행을 다녀 왔다는 기사를 읽고 요즘 다시 생각하게 되었습니다.

위의 존 카맥도 그렇고 개발의 정점에 오르면 우주가 생각 나나 봅니다. 다른 점은 둘 모두 막대한 금액을 들였지만 혼자만 잘 놀다온(?) 찰스 시모니에 비해, 많은 사람들을 우주로 나르기 위해-혹은 더욱 돈을 벌기위해- 삽질을 하는 존 카맥에 더 호감이 갑니다. 


리차드 스톨만

사용자 삽입 이미지
이름: Richard Stallman
생년월일: 1953년 3월 16일
학력: 하버드, MIT
소속:  자유 소프트웨어 재단
홈페이지: www.stallman.org
개발: Emacs, gcc, gdb


해커라는 명칭이 가장 잘 어울리는 프로그래머라 불리우며, 저에게 "공짜가 최고다"라는 신념을 심어 주신 분입니다.

오래전 통신과 잡지에서 이분의 이야기와 업적을 보고 들으면서 리눅스를 사용해 보기로 결심했습니다. 몇 번의 삽질 끝에 집의 PC에 리눅스를 설치하고 사용해 보았습니다. 그리고 리차드 스톨만이 만든 어플리케이션 하면 가장 먼저 떠오르는 Emacs를 배우기 시작했습니다.

처음에는 제가 도스나 윈도우에서 사용하던 에디터와 많이 틀려 적응이 되지 않았습니다. 관련 서적을 구입하고 조금씩 사용해 보니, Emacs는 에디터를 넘어 강력한 개발환경/툴이었습니다. 하지만 GUI가 없는 서버에서 사용은 난감하였습니다. 겉만 Emacs 사용자라 X-Window가 아닌 터미널 환경에선 사용을 못하겠더군요. 그냥 vi를 쓰면서 잊혀진 툴이 되었습니다.

Emacs뿐만 아니라 gcc, gdb를 만든 프로그래머서도 훌륭한 분이지만 그의 소프트웨어에 대한 철학으로 더 많이 평가되는 인물 같습니다. 1985년 제가 동네 오락실을 제패하고 있을 무렵에  GNU 선언문을 발표했습니다.

GNU는 GNU's Not UNIX의 약자로 참 재치있는 이름입니다. 이름에서 알수 있듯이 Unix의 독점에 대항하기 위해 만들어졌습니다. 후에 이분이 만든 라이센스인 GPL을 따르는 Linux가 저와 나이가 같다는 유일한 공통점이 있는 리누스 토발즈에 의해 만들어 지면서 OS로서의 완전한 모습을 갖추게 되었습니다.

개인적으로는 이분 덕분에 도스에서 자연스럽게 윈도우즈로 이어지는 개발에만 관심만 가지고 있던 제가 다른 OS와 개발환경에 관심을 가지게 된 계기가 된 것 같습니다.
 
웹/인터넷의 사용량이 증가하면서 이를 지원해 줄 서버가 많이 필요하게 되었습니다.  GNU의 프로젝트들과 GPL을 따르는 많은 소프트웨어들로 인해 저렴하게 서버를 구축할 수 있는 토대가 된 것 같습니다. 만약 리눅스와 이런 소프트웨어들이 없었다면 유닉스에 비해 상대적으로 저렴한(?) 윈도우즈 서버의 점유율이 지금보다도 훨씬 높았을 것 같습니다.
 
컴퓨터가 점점 더 우리 실생활에 더 많이 더 깊이 들어 오고 있습니다. 사람들에게 도움이 되는 좋은 소프트웨어를 제공하는 것이 개발자들의 가장 큰 미덕이라고 생각합니다. 그것이 많은 사람들이 이용할 수 있도록 무료이고, 다른 개발자들이 참고 할 수 있도록 소스까지 공개된다면 더 없이 이상적일 것입니다.

하지만 현실에서는 무료, 공개란 단어는 실현하기 힘든 경우가 많습니다. 일단 개발할 능력이 있느냐는 문제를 제외 하더라도 회사에 소속된 개발자들은 위의 사항에 대해서는 회사의 정책을 따라야 합니다. 또한 프리렌서/개인 사업자들도 본인이 가진 기술로 어떻게 해서든지 이윤을 얻어야 합니다. 저도  100% 공감하고 극복하지 못했습니다.

하지만 당연한 듯이 확고하게 "내가 돈 안되는 짓을 왜하냐? 그런 짓을 하는 개발자들은 현실에 대해 이해를 못하는 철부지들이다."라고 말하거나 Open, Free, GNU 진영에 혐오감을 가지고 있는 개발자들의 말은 가슴을 콱 막히게 합니다. 갈수록 힘들어 지는 우리나라의 소프트웨어 개발의 현실이 자유로움으로 대변되는 프로그래머들의 사고와 문화도 점점 더 각박해지는 것 같아 안타깝습니다.
 
저는 개발자들에게 여건과 상황이 되는 한에서는 돈 안되는 짓(?)들을 많이 권하는 편입니다. - 비교적 시간의 활용이 자유로운 학생 신분이 가장 적합하겠네요.- 이유는 아래와 같습니다.

업무외에 개발하는 어플리케이션은 대부분 본인이 원해서 또는 필요에 의해서 자발적으로 만드는 것이 대부분입니다. 이런 류의 작업은 많은 열정과 애착을 갖게 해줍니다. 이 열정은 돈에 의해 스케줄에 따라 만들어져야 하는 결과물에 비해 깊은 넓은 지식을 줍니다.

회사에서 직원으로 사용할 수밖에 없는 특정 플랫폼 또는 언어가 아닌 다른 플랫폼과 개발환경에 대한 경험은 사고의 유연성을 키워줍니다. 이는 장기적인 안목으로 본인의 업무에서 사용되는 환경의 개발에서도 반드시 많은 도움을 줍니다.

또한 그것이 결과 또한 좋다면 당장의 눈앞에 이익보다 입지와 선택의 폭을 넓힐 수 있는 명성을 가져다 줍니다.

소프트웨어 업계는 앞에서 주도적인 역활을 하면서 스포트라이트를 받는 선구자들과 함께, 뒤에서 묵묵히 돈은 안되지만 시간을 들여 개발자 커뮤니티 등에서 질문에 답해 주고, 소스를 공개하고, 유용한 어플리케이션을 배포하는 고마운 프로그래머들에 의해 발전하고 있습니다.

같은 개발자들은 그분들의 노고에 관한 고마움을 알고 있어야 할 것 같습니다. 그리고 그 가치에 대해서 최소한 폄하는 하면 안될 것 입니다.

그리고 다른 사람들의 오픈 소스, 소스 공개, 무료 소프트웨어로 인해 회사나 본인의 입지가 어려워진다는 생각이 든다면 지금이라도 다른 업종 또는 수입구조를 찾아 보아야 할 것 입니다.

> 어제 늦은 밤에 쓴 글이라 다소 감성적이고 두서도 없고, 제 주제를 넘어 선 말들이 자주 보이지만 제 블로그란 위안을 가지고 그냥 올려 봅니다.
AND

사용자 삽입 이미지
Reggy는 정규표현식을 간단히 테스트 해 볼 수 있는 작고 가벼운 어플리케이션입니다.

좌측과 같이 상단에 정규표현식을 입력하면 아래의 텍스트 창에서 결과를 확인하실 수 있습니다.

설정에서 POSIX Basic, Ruby, Perl, Java, GNU, Grep, Emacs등의 적용될 정규표현식 문법을 선택할 수 있습니다.


애플의 다운로드 페이지와  홈페이지에서 다운로드 받으실 수 있습니다.

'기타' 카테고리의 다른 글

OS X APM 설치툴 - MAMP  (6) 2007.12.27
블로그 RSS 읽어오는 C++ class  (7) 2007.12.14
cocoa 이름의 유래  (6) 2007.11.30
맥용게임 Doukutsu  (3) 2007.11.21
미국의 맥개발자 구인 내용  (8) 2007.10.20
AND

1. 프로젝트 및 관련 파일 생성

Xcode를 실행하고 New Project를 클릭합니다. 이전 포스트에서 추가한 Flash >  FlexApplication을 선택하고 "Hello"란 이름으로 프로젝트를 생성합니다.

사용자 삽입 이미지
Hello 프로젝트를 우클릭하고 Add/NewFile 메뉴에서 액션스크립트를 위한 소스 파일인 Hello.as와 테스트를 위한 Test.html을 생성합니다.

좌측과 같이 생성되어 있음을 확인합니다.



2. Hello.mxml 편집

하나의 버튼을 추가하고 과 Hello.as 파일을 인클루드 하기위해 아래의 내용을 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" layout="absolute">
    <mx:Script source="Hello.as"/>
   
    <mx:Box backgroundColor="#efefef" width="200" height="100" horizontalAlign="center" verticalAlign="middle">
    <mx:Button label="Click" click="buttonClicked()"/>
    </mx:Box>   
</mx:Application>


3. Test.html 편집

생성된 Hello.swf를 테스트 하기 위한 html 파일을 편집합니다.

<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flex Hello</title>
</head>
<body>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
            id="flexTest" width="200" height="100"
            codebase= "http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
<param name="movie" value="bin/Hello.swf" />
<param name="quality" value="high" />
<embed src="bin/Hello.swf" quality="high" bgcolor="#efefef"
                width="200" height="100" name="flex" align="middle"
                play="true"
                loop="false"
                quality="high"
                type="application/x-shockwave-flash"
                pluginspage="http://www.adobe.com/go/getflashplayer">
            </embed>
    </object>
</body>
</html>


3. Hello.as 편집

버튼이 클릭되었을 경우 호출되는 "buttonClicked" 메소드를 작성합니다. 간단히 Hello World 창을 오픈합니다.

function buttonClicked()
{
    mx.controls.Alert.show('Hello World!', 'Flex');
}     


4. 확인

사용자 삽입 이미지
파일들을 저작하고 빌드를 실행합니다. 빌드가 오류없이 완료되면, Test.html 파일을 우클릭하여 Open With Finder를 클릭합니다.

Test.html이 브라우져에서 실행됩니다.


아래와 같이 사파리에서 Test.html이 오픈됩니다.. "Click" 버튼을 누르면 우측과 같이 Hello 메시지 창이 뜨는 것을 확인할 수 있습니다.
사용자 삽입 이미지 사용자 삽입 이미지

'개발 툴' 카테고리의 다른 글

OS X의 파이썬  (0) 2008.02.20
Java 교육용 프로그램 Greenfoot  (0) 2007.12.23
Adobe Flex Builder를 딱 한번 써보고...  (8) 2007.12.03
구글 Android 개발환경 둘러 보기  (8) 2007.11.14
리얼베이직 간단한 사용기  (0) 2007.08.30
AND

요새 저희 가족 홈페이지를 만들고 있습니다. 한가한 토요일 오후라 블로그 RSS를 가져 오는 루틴을 만들고 있었는데, 실컨 하다가 php 홈페이지에서 문서를 보니 SimpleXMLElement라는 방법이 있었습니다. PHP5부터 지원한다고 하네요.

<?
$rss = file_get_contents("http://www.cocoadev.co.kr/rss");
$xml = new SimpleXMLElement($rss);

print "Blog: <a href='".$xml->channel[0]->link."'>";
print $xml->channel[0]->title."</a><br>";

print "<ul>";
foreach($xml->channel[0]->item as $item)
{
    print "<li><a href='".$item->guid."'>".$item->title."</a> ";
print "(".$item->pubDate.")</li>";
}
print "</ul>";
?>

사용자 삽입 이미지

편한 방법을 찾은 건 다행인데, 왠지 허무하기도 하고 만들 의욕이 그냥 팍 다운되네요. 컴퓨터는 그만 끄고 아들녀석이랑 놀아 줘야 겠습니다.
AND

몇일전 즉흥적으로 Flex에 대한 포스트를 올렸다가, 댓글을 주신 Jason님의 블로그에서 흥미있는 내용을 발견하였습니다. Xcode에서 Flex를 개발하는 방법에 관한 링크였습니다. 이번 내용들은 그 링크가 된 사이트인 joshbuhler.com에 서 보고 따라 해 본 것입니다.


방법 1

1. Flex SDK 설치

아도비 사이트에서 free Flex SDK를 다운로드 받습니다. 다운로드 받은 폴더를 flex로 변경하고 /Developer/SDKs/ 아래로 옮겨 놓습니다.(원작자 분이 거기다 놓는게 좋답니다. 나중에 보니 이해가 가더군요.) 쓰기 권한이 없기 때문에 복사를 할 수가 없어, 터미널에서 root 계정으로 옮겨 놓았습니다. 파인더에서 아래와 같이 flex가 복사 되어 있음을 확인합니다.
(저는 flex2로 했는데 이는 나중에 두번째 방법에서 번거로움이 있으니 flex로 하시기 바랍니다.)

사용자 삽입 이미지


2. Xcode 설정

1) Project 생성

사용자 삽입 이미지
이제 Xcode를 실행하고 New Project에서 새로운 프로젝트를 생성합니다. Empty Project를 선택합니다.

New Project를 처음 본 것은 아닌데 맨 위의 Empty Project는 처음 보는 항목이었습니다.





2)  사용자빌드 환경 설정

Xcode 좌측의 Groups & Files 바로 아래에서 프로젝트명을 더블클릭하여 Info창을 열고 Genral 항목을 선택합니다. 하단에서 Cross-Devleop Using Target SDK 항목을 Other로 변경합니다. 변경 후에 확인하는 경고창이 뜨는데 Change를 클릭합니다. 그리고 아래의 Choose 버튼을 클릭하여 이전 단계에서 flex를 설치한 디렉토리를 선택합니다.

사용자 삽입 이미지


사용자 삽입 이미지
좌측과 같이 타겟을 우클릭(or control+클릭)하여 Add/New Target을 선택합니다. 선택창에서 Special Targets > External Target을 선택하고 Next를 클릭합니다.

Taget Name을 mxmlc로 하고 종료 합니다.


Targets 밑에 mxmlc가 생성된 것을 확인하시고 mxmlc를 더블클릭하여 아래와 같은 정보 창을 오픈합니다.
사용자 삽입 이미지

위와 같이 Build Tool에 /usr/bin/java 를 입력하시고, Arguments에는 -jar $(SDKROOT)/lib/mxmlc.jar -flexlib $(SDKROOT)/frameworks -verbose=true -file-specs $(PROJECT_NAME).as 와 같이 입력합니다.


3) 소스 파일 생성

눈여겨 보실점은 $(PROJECT_NAME).as로 되어 있으니, 후에 생성할 소스파일명이 프로젝트와 동일해야 합니다. 저는  testFlex로 하였으니 testFlex.as로 생성하였습니다. 소스 파일명을 변경하실려면 이 부분을 변경하셔야 할 것 같습니다.

사용자 삽입 이미지
이제 좌측과 같이 New File...을 클릭합니다. 첫번째 항목인 Empty File in Project를 선택하고 프로젝트명과 동일하게 파일명을 testFlex.as로 하고 종료 합니다.



아래와 같이 소스 파일과 타겟이 생성된 것을 확인합니다.
사용자 삽입 이미지

열심히 해 보았지만 위의 -flexlib 옵션 때문에 컴파일 시 오류가 납니다. 다시 잘 살펴 보니 글 쓴 시점이 2005년 10월 21일이고 아래와 같은 내용을 보았습니다.
사용자 삽입 이미지

빌드 오류는 그 사이 Flex SDK가 업그레이드 되면서 변경사항이 있었는 것 같습니다. 터미널 쉘상에서 해봐도 마찬가지였습니다. 일단 Xcode의 새로운 사용법을 알았다는데 만족하고 새로운 링크로 다시 갑니다.


방법 2

방법1에서와 같이 flex SDK를 다운 받고 /Developer/SDKs/flex에 flexSDK에 있어야 합니다.

1. Flex 프로젝트 템플릿 설치

원 저작자가 만드신 것 같은데 프로젝트 템플릿 파일을 다운 받습니다. 압축을 풀고 생성된 FlexApplication 디렉토리를 /Library/Application Support/Apple/Developer Tools/Project Templates /Flash로 복사합니다. 마지막에 /Flash 디렉토리는 만드셔야 합니다.

위의 폴더를 보시면  Xcode에서 프로젝트 생성 시 나오는 템플릿들과 같은 내용을 보실 수 있습니다.


2. 프로젝트 생성

사용자 삽입 이미지
이제 Xcode를 다시 실행하고 새로운 프로젝트를 만드시면 좌측과 같이 Flash 밑에 FlexApplication이라는 새로운 항목이 생긴 것을 보실 수 있습니다.

이 항목을 선택하고 새로운 프로젝트를 생성합니다. 위에서 수동으로 작업하였던 내용이 자동으로 설정되어 있으며, [프로젝트명].mxml이 생성되어 있음을 확인하실 수 있습니다.




Custom Build Command를 확인하시면 방법1의 java를 이용한 것과는 달리 다른 명령어와 인자로 되어 있습니다. java에 의존하던 것을 네이티브한 실행파일로 변경한 것인지는 잘 모르겠습니다.

사용자 삽입 이미지

위 1의 방법에서 아래의 내용으로 변경하고 mxml파일을 프로젝트에 추가해주면 컴파일이 가능할 것 같습니다. Build Tool에 보면 경로이 Flex로 자동으로 설정되어 있는데, 저는 괜히 처음에 flex2로 만들어 놓아 flex2로 변경하였습니다. 빈 프로젝트지만 컴파일은 이상이 없었습니다. 간단한 Flex 사용기는 다음으로 미룰려고 합니다.

쉽게 Xcode에서 Flex를 사용할 수 있는 방법을 알려주신 Jason님에게  감사드립니다. 사실 Josh님께도 감사를 드려야 하는데 "hi, thanks ^^"만 쓰고 튈수도 없고 해서 그냥 마음으로만 드립니다.

이전 어쩔 수없이 짧은 지식으로 플래쉬 작업을 한 적이 있습니다. 타임라인이니 레이어 같은 알수 없는 환경에 좌절하고 오로지 액션스크립트로만 작업을 하고 넘겼는데, 플래쉬를 하시는 분이 소스를 보셨으면 무슨 생각이 드셨을지 모르겠네요. 아마 회사에 엄청 불만있는 사람으로 생각했을 것 같습니다.
 
아직도 모르겠지만 플래쉬에 비해 개발자 친화적인 환경과 공짜라는 점에 무척 관심이 갑니다. 코코아는 물만 끓여 놓고  자꾸 딴데만 두리번 거리고 있네요.
AND