웜즈나 포트리스와 비슷한 방식의 턴제로 돌아가며 공격을 하는 게임입니다. 네트워크를 통한 멀티플레이어 게임이 가능하고 Linux, Windows, Mac, FreeBSD의 다양한 OS를 지원하며 소스도 공개되어 있습니다. 물론 공짜입니다.

2명에서 4명까지 플레이할 수 있습니다. 팀이름이 Tux, Gnu, FireFox, Thunderbird, PHP등으로 리눅스 사용자들이 아주 좋아할 만한 이름들이 입니다.

아래와 같이 Teams 메뉴에서 플레이어의 수와 팀, 이름, 케릭터 숫자를 설정할 수 있습니다. Map에서 다양한 맵들을 선택할 수 있습니다.
사용자 삽입 이미지

게임방법은 간단합니다. 플레이어들이 돌아가며 정해진 시간내에 자신의 케릭터들중 하나를 선택하여 상대방을 공격합니다.
사용자 삽입 이미지

간단한 조작 방법은 아래와 같습니다.

  • 좌우 방향키 - 이동
  • 상하 방향키 - 조준 (상세 조준:+shift)
  • space - 발사
  • 마우스 우클릭 - 무기, 아이템 선택
  • Return - 점프
  • b - 뒤로 점프
  • delete (Backspace) - 높이 점프
  • c - 현재 선택된 캐릭터를 화면중앙에 위치

캐릭터들이 귀엽게 생겨 아이들이나 여성분들도 좋아 하는 것 같습니다. 가족이나 친구들끼리 모여서 오손도손 시간 보내기에 좋은 아기자기한 게임 입니다. 현재 0.8b4 버젼(OS X는 0.8b3)까지 나와 있으며 Wormux 홈페이지에서 다운로드 받으실 수 있습니다.
AND

중요도나 용도에 상관없이 제가 자주 사용하는 MySQL의 툴과 명령어를 정리해 보았습니다. 개인적인 참조로 쓰기 위한 것이므로 자세한 설명은 생략하였습니다. 자세한 내용은 한국 MySQL의 메뉴얼 페이지를 참조하세요. OS X에서 mysql 설치는 제 이전 포스트를 확인하시면 됩니다

* 데몬 시작
> mysqld_safe --user=[아이디] &

* 종료
> mysqladmin -u [아이디] -p[패스워드] shutdown

* 재실행
> mysqladmin -u [아이디] -p[패스워드] reload

* 계정 추가
localhost가 %일 경우 모든 IP에서의 접근을 허용합니다.
mysql> grant all privileges on [database].* to [아이디]@"localhost" identified by "[패스워드]"

* 패스워드 변경
mysql> SET PASSWORD FOR [아이디]@localhost=PASSWORD('[패스워드]')  

* 테이블 필드 변경
명령어별 옵션은 아래와 같습니다.
  • add : add [기존필드] [타입] after [필드]
  • change : change [변경될 필드]  [새로운 필드명] [타입]
  • drop : drop [삭제될 필드]

mysql> ALTER TABLE [테이블 명] (add | change | drop) ...

* 데이터 백업
데이터 백업 시 아래와 같이 사용합니다. 테이블 명을 생략하면 database의 전체 테이블을 백업합니다. 자주 쓰이는 옵션은 아래와 같습니다.
  • -d:  테이블 생성 정보만 백업
  • -f: 데이터만 백업

> mysqldump -u [아이디] -p[패스워드] [database] [테이블 명] > [파일명]

* 테이블 검사
mysql>CHECK TABLE [테이블 명]

* 테이블 복구
mysql>REPAIR TABLE [테이블 명]

repair로 고쳐지지 않는 다면 쉘에서 아래와 같이 시도합니다.
> myisamchk -safe-recover [mysql data path]/[테이블 명]

* 바이너리 로그
MySQL은 select와 같은 데이터에 변동이 없는 내역을 제외하고 data 디렉토리에 바이너리 로그로 저장합니다. 아래와 같이 mysqlbinlog로 텍스트화 된 내용을 확인할 수 있으며, 변경된 내역을 가지고 있기 때문에 데이터 복구시에도 사용할 수 있습니다.
> mysqlbinlog [로그파일 명]

* 파일로 저장
mysql>SELECT * INTO OUTFILE "[filename]" FROM [테이블 명];

엑셀에서 사용하기 위해 CSV(Comma Separated Value) 포맷으로 저장할 경우에는 아래와 같이 사용합니다.
mysql>SELECT * INTO OUTFILE "[filename]" FIELDS TERMINATED BY ',' FROM [테이블 명];

* CSV 파일 로드
LOAD DATA LOCAL INFILE "[CSV 파일패스]" INTO TABLE [테이블명] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
"로 필드가 구분되었을 경우에는 ENCLOSED BY '\"'를 추가합니다.

* 테이블 최적화
mysql>OPTIMIZE TABLE [테이블 명]

* mysqladmin
서버의 상태를 감시하고 동작을 제어 합니다. 명령어들은 아래와 같습니다.
  • ping : 서버가 실행중인지 확인합니다.
  • status: 현재 서버의 상태를 출력합니다.
  • processlist: 실행중인 쓰레드의 정보를 출력합니다.
  • kill [Id]: 특정 쓰레드를 종료합니다.
  • variables: mysql 환경변수 값을 출력합니다.

> mysqladmin -u [아이디] -p[패스워드] 명령

* 쉘에서 UTF8
character_set_client가 latin1로 되어 있으면 mysql 쉘에서 한글이 깨어져 나오는 경우가 있습니다. 아래와 같이 현재 문자셋을 알아 봅니다.
mysql> show variables like '%char%';

character_set_client이 utf8로 되어 있지 않을 경우에는 my.cnf 파일에서 아래와 같이 설정합니다.
[mysql]
default-character-set = utf8

'기타 > 자잘한 Tip' 카테고리의 다른 글

Xcode에서의 Ruby on Rails  (8) 2008.08.20
Dashcode로 올블로그 RSS 위젯 만들기  (2) 2008.05.22
flex2 - xml을 이용한 동적 메뉴 예제  (0) 2008.02.01
PHP에서 RSS 가져오기  (0) 2007.12.08
OS X에 MySQL 설치  (4) 2007.10.12
AND

flex2로 만든 Tree로 메뉴를 보여주는 샘플 입니다. xml에서 데이터를 읽어 오기 때문에 메뉴 이름이나 URL이 변경되더라도 다시 컴파일할 필요가 없습니다. 그리고 제목을 클릭해도 오픈/클로즈가 가능하고 링크가 있을 시에는 해당 링크가 오픈됩니다.


lmenu.mxml (flex2 소스 파일)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="initData()" width="180" height="200" fontSize="11">
    <mx:Script>
        <![CDATA[
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import flash.net.navigateToURL;

            /* murl 파라미터에서 설정된 url로 부터 xml 데이터를 가져 온다. */
            private function initData():void {
                xmlService.url = Application.application.parameters.murl;
                xmlService.send();
            }
           
            /* xml 가져오기 오류 시 메시지 출력 */
            private function faultHandler(event:FaultEvent):void {
                mx.controls.Alert.show(event.fault.message);
            }
           
            /* Tree 마우스 클릭 이벤트 처리 */
            private function onItemClicked(event:Event):void {
                if(event.currentTarget.selectedItem.@data) {
                   
                    /* 현재 선택된 아이템의 데이터 값을 가져 온다. */
                    var dataString:String = "";
                    dataString = event.currentTarget.selectedItem.@data;
                   
                    /* data(link)가 있을 시에는 url을 연다 */
                    if(dataString.length > 0)
                    {
                        var url:URLRequest = new URLRequest(dataString);
                        navigateToURL(url);
                    }   

                    /* 아이템이 열려 있으면 닫고, 닫혀있으면 연다 */
                    var openFlag = !(menuTree.isItemOpen(event.currentTarget.selectedItem) == true);
                    menuTree.expandItem(event.currentTarget.selectedItem, openFlag);   
                }
            }
        ]]>
    </mx:Script>

    <mx:HTTPService id="xmlService" resultFormat="e4x" fault="faultHandler(event)" useProxy="false" />
    <mx:XMLListCollection id="xc" source="{xmlService.lastResult.item}" />

    <mx:Tree id="menuTree" labelField="@label" showRoot="true"
        x="0" y="0" width="180" height="200"
        dataProvider="{xc}" click="onItemClicked(event);" />
</mx:Application>
현재 창에서 링크가 열리기를 원하시면 navigateToURL(url)을 navigateToURL(url, "_self")로 변경합니다.

test.html (html 샘플 파일)
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flex Menu Test</title>
<script type="text/javascript">
function goURL(url)
{
    document.location.href = url;
}
</script>
</head>
<body>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
            id="flexMenu" width="500" height="400"
            codebase= "http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
<param name="movie" value="[swf url]?murl=[xml url]" />
<param name="quality" value="high" />
<embed src="[swf url]?murl=[xml url]" quality="high" bgcolor="#efefef"
                width="500" height="400" 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>
murl로 xml 파일의 url을 전달합니다.

[swf url] 컴파일된 swf 파일의 url입니다.
[xml url] 메뉴 구조가 정의된 xml의 url입니다. 구조는 아래와 같습니다.

src와 movie에서의 내용을http://www.domain1.com/lmenu.swf?murl=http://www.domain2.com/menu.xml 과 같이 입력하시면 됩니다.

menu.xml (메뉴 구조 샘플 파일)
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item label="포탈 사이트">
        <item label="네이버" data="http://www.naver.com"/>
        <item label="다음" data="http://www.daum.net"/>
        <item label="야후" data="http://www.yahoo.co.kr"/>
        <item label="엠파스" data="http://www.empas.com"/>
    </item>
    <item label="블로그">
        <item label="내 블로그" data="http://www.cocoadev.co.kr"/>
        <item label="올블로그" data="http://www.allblog.net"/>
        <item label="티스토리" data="http://www.tisotry.com"/>
    </item>
</root>
서브 메뉴를 포함하고 있을 때는 "<item>[.. sub item]</item>"과 같이 포함하지 않으면 "<item />"과 같이 사용하시면 됩니다. 링크가 필요한 경우에는 item의 data 필드를 이용합니다.

crossdomain.xml
<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*"/>
</cross-domain-policy>

swf가 있는 도메인과 xml이 있는 도메인이 다를 경우에는 xml이 있는 곳에 위와 같은 crossdomain.xml 파일이 존재하여야 합니다.
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

올블로그에서 익호님 블로그의 글을 읽다가 프로그래밍 언어의 사용 순위를 매겨놓은 웹사이트가 있다는 것을 알게 되었습니다. 사이트를 가보니 구글, 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

기타 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

> 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

사용자 삽입 이미지
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

요새 저희 가족 홈페이지를 만들고 있습니다. 한가한 토요일 오후라 블로그 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

기타 2007. 11. 30. 14:31
Xcode란 이름을 처음 들었을 때는 별다른 느낌이 없었습니다. 한 단어로 자주 사용되는 X가 주는 여러 의미도 있고, OS X의 X도 있고 code와 합쳐져 그냥 Xcode인가 보다 하고 생각했습니다.

하지만 cocoa는 약간 흥미가 가는 이름이었습니다. 처음에는 코코아란 차를 생각하고 Java와 뭔가 비슷한 이유로 이름을 지은 것이 아닐까 생각했습니다. cocoa 개발자들이 개발중에 코코아 차를 자주 마셔서 지은 이름이 아닐까? 별로 중요한 내용은 아니지만 cocoa를 시작도 하기전에 이 죽일 놈의 호기심이 또 발동해서 구글 등에서 이름의 내역을 대충 알게되었습니다.

이제 다시 당시에 알아낸 내용과 위키피디아를 통해서 cocoa 이름의 유래에 관해서 정리해 볼려고 합니다.


사용자 삽입 이미지
우선 코코아가 정확히 뭔지 알아 보겠습니다. 저는 카카오, 코코아, 코코넛 세개의 정확한 의미를 몰라 혼돈이 있었습니다. 코코넛은 코코스 야자 나무의 열매이고, 카카오는 카카오 나무의 열매입니다. 이 카카오를 가공하여 분말로 만든 것을 코코아라고 부릅니다.(저만 헤깔리는 것이 겠죠.)


일단 코코아가 무엇인지는 알았고, Xcode의 cocoa에 이름이 붙여진 이유에 대해서 알아 보겠습니다. 1991년도 경 애플에서는 KidSim이란 프로젝트가 진행되고 있었습니다. 이 프로젝트는  ATG(Advanced Technology Group)에서 이루어졌습니다. KidSim은 Kid+Simulation의 조합과 같은 이름에서 암시하듯이 프로그래밍 언어를 배우지 않고도 어린이들에게 쉽게 애니메이션, 시뮬레이션, 게임등을 만들게 해주는 툴입니다.


보시는 바와 같이 어디선가 본듯한 모습인데 앨런케이옹의 스퀵이 떠 오릅니다. 아래는 스퀵과 관련한 제 이전 포스트 입니다.

아무튼 이 당시 앨런케이옹도 애플의 ATG에서 비슷한 연구를 한 것으로 보입니다.

잠시 ATG에 대해서 살펴 보면 ATG는 1986에 만들어져 1997까지 유지된 애플의 새로운 기술을 개발하는 연구소입니다. 구성원은 컴퓨터 발전과 객체지향에 지대한 영향을 끼친 앨런케이, 제록스에서 레이저 프린팅 시스템을 처음 개발한 게리 스타크웨더, 초기 애플 GUI 소프트웨어 개발의 주축이었던 레리 테슬러(ATG 를 만들었습니다.)등 초호화 맴버입니다.

드림팀 답게 이들은 이곳에서 애플 기술의 초석이 되는 많은 결과물들을 만들어 내었습니다. 위키피디아에서 가져온 이들이 개발한 주요 내용들 입니다.

QuickDraw, QuickTime, QuickTime VR, QuickDraw 3D, 3DMF the 3D metafile graphics format, ColorSync, HyperCard, Apple events, AppleScript, Apple's PlainTalk speech recognition software, Apple Data Detectors, the V-Twin software for indexing, storing, and searching text documents, Macintalk Pro Speech Synthesis, the Newton handwriting recognizer, the component software technology leading to OpenDoc, MCF and HotSauce, Squeak Smalltalk, Cocoa

대충봐도 눈에 익은 것들이 많습니다. 하지만 1996년 앨런케이도 애플을 떠나고, 1997년 스티브잡스가 애플로 복귀하면서 비생산적인 부서를 정리하는 구조조정(?)을 감행하면서 ATG도 역사속으로 사라지게 됩니다.

다시 KidSim으로 돌아와 1994년 이 프로젝트는 Cocoa로 이름을 변경합니다. 이후 1996년 이 프로젝트는 공식적으로 세간에 발표됩니다. 하지만 ATG가 없어 지면서 위의 래리 테슬러와 기존 cocoa의 개발자들은 Stagecast 소프트라는 회사를 만들어 떠납니다.

이때 스티브 잡스는 NeXTSTEP을 이용해 새로운 애플의 OS를 개발하게 됩니다. 애플은 Xcode의 시조인  NeXTSTEP의 개발환경을 새로운 OS로 가져 오게 됩니다. 그런데 새로 트레이드마크를 등록하는데 드는 시간을 줄이기 위해, Stagecast의 동의하에 이미 등록되어 있는 Cocoa란 이름을 사용합니다.

알고보니 허무합니다. 사실인지 아닌지 확인할 길은 없지만, 시간이 없어서 그냥 가지고 왔답니다. 끝.

아무튼 ATG에 당대의 개발자들이 모여 시간과 돈에 얽매이지 않고 자유롭게 연구한 UI, 그래픽/네트워크 기술, 교육용 소프트웨어 등 많은 결과물이 오늘날 애플 제품들의 초석이 되지 않았나 생각됩니다.


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

블로그 RSS 읽어오는 C++ class  (7) 2007.12.14
OS X용 정규 표현식 테스트 어플리케이션 - Reggy  (1) 2007.12.12
맥용게임 Doukutsu  (3) 2007.11.21
미국의 맥개발자 구인 내용  (8) 2007.10.20
맥용 게임 Thumblebugs  (0) 2007.10.19
AND

기타 2007. 11. 21. 12:59
맥에서는 게임을 자주 하지는 않고 5~6개의 게임만 가끔 하고 있습니다. 이전과는 달리 화려하고 복잡한 3D 게임 또는 네트워크 게임이 아니라 쉽게 즐길 수 있는 아기자기한 아케이드, 퍼즐류 게임쪽으로만 손이 가게 되네요.

사용자 삽입 이미지
이번에 소개하는 Doukutsu는 90년 초반 도스시절 320X200 해상도에서 즐기던 게임들의 향수를 불러 일으키는 캐릭터와 배경이 아기자기하게 이쁜 재밌는 게임입니다.

액션 아케이드 게임으로 스토리가 있어서 등장 캐릭터와 대화를 해가며 문제를 풀어 가야합니다.




사용자 삽입 이미지
일본인이 만든 게임이라 대화가 일본어로 나오는데 영문 패치를 하면 영문으로 즐길 수 있습니다. 패치를 실행 시키고 원본 실행파일을 지정해 주면 패치가 됩니다.

물에 들어 가면 산소가 점점 주는데, 오래전 오락실이나 도스에서 즐기던 타잔 게임이 생각 납니다.



기본적인 키입력은 아래와 같습니다.
  • 방향키 - 이동
  • 아래 방향키 -  검색, 대화
  • Q - 아이템/무기 보기
  • Z - 점프/선택
  • S/A - 무기 변경
  • X - 공격
  • W -  지도 보기

간단한 게임방법은 처음 시작시에 사용할 무기를 구해야 합니다. 시작화면에서 위에 있는 문으로 나가 가시와 새들을 피해 아래쪽으로 내려 가면 끝 부분에서 무기를 구할 수 있습니다. 이 무기를 가지고 다시 올라오면 됩니다.

생각보다 스토리가 길어 저도 아직 엔딩을 못 보았습니다. 각 스테이지를 클리어 하기위해서는 대화를 주의깊게 들어야 합니다. 아래의 관련 사이트들을 참조 하시면 클리어 하는데 많은 도움이 됩니다.
일본의 한 젊은이가 공개로 만든 것 같은데, 화려한 그래픽이나 효과는 없지만 대단히 잘 기획된 게임 같습니다. 블로그 소개에서도 이야기한 바와 같이 맥용으로 이와 같은 아기자기한  2D 아케이드 게임을 만들어 보고 싶은데 언제쯤 가능할련지 모르겠네요.

AND

코코아빌더에 올라온 어느 회사의 맥개발자 구인글입니다. 영어와는 거리가 멀어 대충 번역해 보았습니다. 오역이 있을 수도 있습니다.

텍사스의 오스틴에서 코코아 개발자 구함

>> 요구하는 기술
- 맥 OS X에서 Cocoa, Objective-C, C++ 개발 경험 (최소 1년 이상 전문적인 경험).
- 강력한 객체지향 C++ 프로그래밍 스킬이 있는 우수한 개발자.
- 새로운 아이디어를 생각해 내고 독립적으로 일할 수 있는 능력과 함께 강력한 분석, 진단과 문제를 해결할 수 있는 스킬.
- 새로운 기술을 빠르고 쉽게 습득하고 OS팀의 내부 전문가들과 함께 최신 맥 어플리케이션을 개발할 수 있는 강한 열정.
- TCP/IP, HTTP와 HTTPS 갘은 인터넷 프로토콜에 대한 이해.
- 가상메모리, 권한 레벨, 어셈블리를 포함하여 x86과 PowerPC 아키텍쳐에 능숙해야 함.
- gdb를 이용하여 데드락과 예외같은 복잡한 소프트웨어 문제를 다룰 수 있는 능력.
- 크로스플랫폼 개발 경험.
- OS X 구조와 디바이스 드라이버 개발에 관한 지식.
- 전자공학, 컴퓨터 공학 학위.

보통 우리나라 IT업계의 구직란에 있는 "성실한", "미래를 함께할",  "가족과 같은", "비젼 있는" 등의 추상적인 문구와 나이제한 등은 보이지 않고 요구하는 내용이 실제적이지만 원문에도 자주 사용되었듯이 strong하네요. 이제 이정도의 스킬을  요구하면서 어느정도의 연봉을 제공하는 지 보겠습니다.

>> 연봉 및 복리후생
연봉 11만~12만 달러.
전시간 영구직.
2주 유급 휴가, 2주 년차, 11일 유급 휴일, 건강/생활 보험, 스탁옵션.
이직비용 지급.

 미국이라고는 괌(?)밖에 못 가봐서 어느정도 수준인지, 이 회사의 구직 내용이 미국에서 평범한 것인지는 잘 모르겠습니다. 아무튼 우리나라 기준으로는 요구사항이나 연봉이나 화끈한 것 같습니다.

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

cocoa 이름의 유래  (6) 2007.11.30
맥용게임 Doukutsu  (3) 2007.11.21
맥용 게임 Thumblebugs  (0) 2007.10.19
OS X용 MySQL 클라이언트 - CocoaMySQL  (8) 2007.10.19
Xcode, Cocoa, 맥 프로그래밍 관련 국내외 사이트  (2) 2007.05.21
AND

기타 2007. 10. 19. 17:33
아시는 분들이 많을 것 같은데 맥에서 제가 즐겨하는 게임 하나를 소개합니다. 게임 제목은 Thumblebugs로 이곳에서 다운로드 받으실 수 있습니다. 윈도우용도 있습니다.

이전에는 스타크래프트 같은 게임을 좋아했는데, 요새는 복잡한 게임 보다는 간단하고 짧게 즐길 수 있는 이런 퍼즐류의 게임이 좋아지고 있습니다.

게임 방법은 아래와 같이 구멍을 향해 다가가는 구슬들을 없에는 아주 간단한 게임입니다. 같은 색의 구슬이 세개 이상 쌓이게 되면 구슬이 없어집니다. 물론 게임을 도와주는 다양한 아이템들이 있습니다.

저는  FINISH를 앞두고 있는 12스테이지에서 더이상 진도가 나가지 않네요. 은근히 중독성도 있고 작업하다 간단히 머리 식히기에 좋습니다.

사용자 삽입 이미지

사용자 삽입 이미지

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

맥용게임 Doukutsu  (3) 2007.11.21
미국의 맥개발자 구인 내용  (8) 2007.10.20
OS X용 MySQL 클라이언트 - CocoaMySQL  (8) 2007.10.19
Xcode, Cocoa, 맥 프로그래밍 관련 국내외 사이트  (2) 2007.05.21
NeXTSTEP에 관하여...  (4) 2007.05.14
AND

사용자 삽입 이미지
OS X에서 사용할 수 있는 MySQL 클라이언트 입니다. 프리(도네이션)웨어이지만 기본기능은 충실하게 가지고 있습니다. 다만 아쉬운 것은 오래전부터 0.7베타에서 더이상 버젼이 올라가지 않고 있습니다.

프로그램은 홈페이지에서 다운로드 받으실 수 있습니다.

1. 환경설정
사용자 삽입 이미지
다운로드 받으신 후 실행한 다음 메뉴의  Prefrences를 실행하면 프로그램의 환경을 설정할 수 있습니다. 우측의 Favorites 하단에 있는 추가버튼을 클릭하여 아래와 같이 접속할 MySQL 계정을 설정합니다.

이름, 접속할 서버, 사용자 계정을 입력합니다. 저는 이전 MySQL 설치 포스트에 있는 계정 그대로 "local_test"란 이름으로 설정하였습니다.

여기서 저장해 놓은 접속계정으로 이후 간편하게 접속할 수 있습니다.

이전에 원격서버의 MySQL 4.2 버젼대인가에서도 사용해 보았으니, 원격서버도 아이피 또는 도메인만 입력하시면 무난히 사용하실 수 있을 것 입니다.


2. 기본 UI

위에 설정한 계정으로 접속하면 아래와 같은 화면을 보실 수 있습니다. 저는 먼저 name과 phone 필드를 가진 test란 테이블을 생성하였습니다.
사용자 삽입 이미지

1) 상단 메뉴

상단의 툴바에는 로그창을 보여주는 [Show Console], 로그 내용을 삭제하는 [Clear Console] 버튼이 있습니다.  [Show Variables]는  현재 기동되어 있는 MySQL 서버의 각종 변수들을 확인할 수 있습니다.

[Flush Privileges]는 사용해 보지는 못했지만 사용자 정보 변경 시 적용시켜 주는 flush privileges;를 실행해 주는 것 같습니다.

[Table Operations]는 테이블 검사, 옵티마이즈, 리페어등의 기능을 제공합니다.

[Create Table Syntax]는 현재 선택된 테이블의 create하는 SQL문을 생성해 줍니다.

2) 좌측 메뉴
좌측 상단에는 데이터베이스를 선택하거나 추가, 삭제할 수 있는 버튼들이 있습니다. 이는  MySQL Root 권한이 있어야 가능합니다. 그 아래는 현재 데이터베이스의 테이블 목록과 테이블을 복사/삭제/등록할 수 있는 버튼들이 있습니다.

하단에는 문자 엔코딩을 선택할 수 있습니다.

3. 기능 둘러 보기
1) Structure
사용자 삽입 이미지
첫번째로 보이는 윈도우로 테이블 필드를 추가/삭제/변경할 수 있습니다. SQL 테이블 생성문을 따로 작성할 필요가 없을 정도로 상당히 많은 기능을 제공합니다. NOT NULL, default 값, auto increment등 다양한 필드 옵션을 지정할 수 있습니다.

하단은 Indexes에서는 프라이머리 키와 인덱스를 설정할 수 있습니다. 테이블 관리하는데 무척이나 편리하게 되어 있는 것 같습니다.

2) Content
사용자 삽입 이미지
현재 테이블에 있는  데이터(Row)를 관리할 수 있습니다. 상단에는 검색 툴이 있습니다. 선택된 필드의 타입에 따라 =, like , > , <등의 조건으로 검색할 수 있습니다. 검색 row수를 제한하는 limit은 현재 row가 2개밖에 없어 비활성화 되어 있는지 아직 구현되지 않은 것인지는 확인하지 못하였습니다.

3) Custom Query
사용자가 작성한 쿼리를 실행하고, 그 결과 값을 확인할 수 있습니다.
사용자 삽입 이미지

4) Status
테이블의 크기, Row수, 변경시간등의 정보를 확인할 수 있습니다.
사용자 삽입 이미지

이상 CocoaMySQL을 간단히 보았습니다. 한가지 아쉬운 점은 계속 버젼업이 진행되었더라면  기능들이 추가되어 더 좋은 MySQL 클라이언트가 되었을 텐데, 개발이 중단된 것 같아 매우 아쉽습니다. 어쨋든 프리웨어로 공개하신 개발자분께 감사드리며 잘 쓰겠습니다.

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

미국의 맥개발자 구인 내용  (8) 2007.10.20
맥용 게임 Thumblebugs  (0) 2007.10.19
Xcode, Cocoa, 맥 프로그래밍 관련 국내외 사이트  (2) 2007.05.21
NeXTSTEP에 관하여...  (4) 2007.05.14
GNUstep 개발 데모 동영상  (0) 2007.05.10
AND

1. 다운로드
MySQL 다운로드 사이트에서 현재 사용하시는 맥의 CPU와 OS X 버젼에 맞는 패키지를 선택하고 다운 받습니다. 여기서는 package format을 다운 받고 이를 예로 들겠습니다.

해당 파일에서 Pick a Mirror를 클릭하면 회원가입 또는 로그인 화면이 나옵니다. 로그인이나 회원가입을 안하실 분은 하단의 "» No thanks, just take me to the downloads!"를 클릭하면 다운로드 받을 수 있는 미러사이트들이 나옵니다. 이 중 선택하셔서 다운로드 받으시면 됩니다.

2. 설치
사용자 삽입 이미지
다운로드 받은 dmg 파일을 클릭하면 아래와 같은 파일들이 나옵니다.
 
mysql-5***.pkg  : mysql 설치 파일
MySQL_S**.pkg  : 부팅 시 자동 시작 설정 파일
MySQL_pre*.pkg : 시스템 환경설정 등록 파일
ReadMe.txt          : 설치 안내 파일

설치는 매우 쉽습니다. 아래와 같이 각각의 파일들을 클릭하여 설치 합니다.

1) 먼저 mysql-5.0.**.pkg 파일을 클릭하여 MySQL을 설치 합니다.
2) MySQL_Startup**.pkg 파일을 클릭하여 설치합니다.
3) MySQL_prefPane을 클릭하여 환경설정에 MySQL을 추가 합니다.

이제 모든 설치가 완료되었습니다. 시스템 환경설정/기타에서 MySQL 아이콘을 확인하고 클릭합니다.
사용자 삽입 이미지

 위의 화면에서 [Start MySQL Server] 버튼을 클릭하여 MySQL을 시작하고, 위의 화면과 같이 상태가 running임을 확인 합니다.  아래의 체크 옵션은 시스템 시작 시에 MySQL을 자동으로 시작할지를 선택합니다. 필요에 따라서 체크를 하시면 됩니다.
 
3. 설정
이제 MySQL이 실행되고 있는지 확인해 보겠습니다. iTerm등의 터미널을 실행 합니다.
(지금 부터의 내용이 어려우신 분들은 제 이전 포스트를 참고 하세요.)

MySQL은 /usr/local/mysql-[버젼명] 디렉토리에 설치되어 있으며, 해당 디렉토리에서 mysql로 심볼릭 링크되어 있습니다.

사용 상의 편의를 위해 MySQL 실행(bin) 디렉토리를 패스에 추가 합니다. 사용자 root 디렉토리에서 > vi .bash_profile로 열어 아래와 같이 한줄을 추가 합니다.

PATH=${PATH}:/usr/local/mysql/bin
위의 내용을 입력하고 :wq로 저장하고 vi를 나옵니다.
 
다시 터미널로 로그인 하여 > sudo mysql 타이핑 하면, 아래와 같은 MySQL이 실행 된 화면을 보실 수 있습니다. (패스워드 입력창이 나오면 root권한 사용 시 입력하는 패스워드를 입력하시면 됩니다.)
사용자 삽입 이미지

4. Database, 사용자 추가
1. 데이터 베이스 생성
위의 프롬프트 상에서 mysql> create database cocoadev[enter]를 입력하여 cocoadev란 데이터베이스를 생성합니다.

2. 사용자 등록
mysql> grant all privileges on cocoadev.* to test@"localhost" identified by '1111';
와 같이 입력하여 localhost(현재 컴퓨터)의 test 사용자를 패스워드 1111로 생성하여  cocoadev 데이터베이스에 접근할 수 있도록 합니다.

아래와 같이 진행됨을 확인합니다.
사용자 삽입 이미지

quit 명령어로 mysql을 나옵니다.

3. 사용자 로그인
이제 위에서 등록한 test 사용자로 mysql에 로그인 해 보겠습니다.

> msyql -u [userid] -p[password] [database]과 같이 로그인 하며 위의 이미지를 참고 하시면 됩니다. 아래와 같이 정상적으로 mysql에 로그인 되는지 확인 하시면 됩니다.

사용자 삽입 이미지

자세한 사항은 패키지의 ReadMe.txt를 읽어 보시고, 그외 자세한 설명은 mysql 사이트의 메뉴얼을 참고 하세요.

여기서는 나중에 Cocoa Tutorial에서 MySQL과 연동하는 어플리케이션을 제작할 때 다루어 보겠습니다.

AND

이전에 급조해서 만들어 놓았던 리눅스용 서버 프로세스 감시 어플리케이션 소스 입니다. 실행되면 특정 프로세스가 실행 되는지 검사하다 프로세스가 없으면 정해진 파일을 다시 실행합니다.

proc 파일 시스템을 이용하기 때문에 이 소스로는 proc 파일 시스템을 사용하지 않는 맥 OS X에서는 동작하지 않습니다. 현 소스는 Linux에서 사용했고 freeBSD에서도 디렉토리와 몇 가지만 바꾸면 사용하는데 이상이 없을 겁니다. 원래 freeBSD에서 사용했던 것을 Linux로 옮겨 왔습니다.

일단 소스입니다. 보시면 알겠지만 제가 있던 환경만을 생각해서 만들었고, 여러 상황이나 오류에 대한 고려가 없으니 만약 사용 시에는 아래의 사항을 반드시 확인해 보세요.
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
    
/* 검사 주기(초) */
#define CHECK_SECOND        30  

/* 실행 서버 패스 및 이름 */
#define APP_PATH            "/root/ztsvr/ztsvr"
#define APP_NAME            "ztsvr"

int check_process();
void get_timef(time_t, char *);

int main()
{
    int rt;
    time_t  the_time;
    char buffer[255];
    char app[255];

    sprintf(app, "nohup %s &", APP_PATH);

    printf("START\n");
    fflush(stdout);
    while(1)
    {
        time(&the_time);
        get_timef(the_time, buffer);

        rt = check_process();

        if(rt == 0)
        {
            printf("DIE: %s\n", buffer);

            /** 새로 뛰움 **/
            system(app);
            printf("RELOAD: %s\n", buffer);
        }
        else
        {
            printf("OK: %s\n", buffer);
        }

        fflush(stdout);
       
       /* 검사 후, process sleep */
        sleep(CHECK_SECOND);   
    }
    return 0;
}

/** 프로세스 검사 */
int check_process()
{   
    DIR* pdir;
    struct dirent *pinfo;
    int is_live = 0;

    pdir = opendir("/proc");
    if(pdir == NULL)
    {
        printf("err: NO_DIR\n");
        return 0;
    }

    /** /proc 디렉토리의 프로세스 검색 */
    while(1)
    {
        pinfo = readdir(pdir);
        if(pinfo == NULL)
            break;

        /** 파일이거나 ".", "..", 프로세스 디렉토리는 숫자로 시작하기 때문에 아스키코드 57(9)가 넘을 경우 건너뜀 */
        if(pinfo->d_type != 4 || pinfo->d_name[0] == '.' || pinfo->d_name[0] > 57)
            continue;

        FILE* fp;
        char buff[128];
        char path[128];

        sprintf(path, "/proc/%s/status", pinfo->d_name);
        fp = fopen(path, "rt");
        if(fp)
        {
            fgets(buff, 128, fp);
            fclose(fp);

            /** 프로세스명과 status 파일 내용과 비교 */ 
            if(strstr(buff, APP_NAME))
            {
                is_live = 1;
                break;
            }
        }
        else
        {
            printf("Can't read file [%s]\n", path);
        }
    }

    closedir(pdir);

    return is_live;
}

/** 현재 시간을 설정 */
void get_timef(time_t org_time, char *time_str)
{
    struct tm *tm_ptr;
    tm_ptr = localtime(&org_time);

    sprintf(time_str, "%d/%d/%d %d:%d:%d",
                    tm_ptr->tm_year+1900,
                    tm_ptr->tm_mon+1,
                    tm_ptr->tm_mday,
                    tm_ptr->tm_hour,
                    tm_ptr->tm_min,
                    tm_ptr->tm_sec);
}

0. 용도
서버 자체가 든든 해서 어떠한 상황에서도 죽는 일이 없어야 겠지만, 중요한 서비스라면 일단 자동으로 살려 놓고 원인을 찾아야 할 경우를 위해 만들어 놓았습니다.

1. 설정
#define CHECK_SECOND        30  
검사 주기를 초단위로 설정합니다. 이 설정으로는 검사를 한 후 30초 sleep상태로 잠들어 있다 30초 마다 다시 검사합니다.

#define APP_PATH            "/root/ztsvr/ztsvr"
실행해야 될 서버 실행파일의 전체경로와 파일명입니다.

#define APP_NAME            "ztsvr"
실행 프로세스명(파일명) 입니다.

sprintf(app, "nohup %s &", APP_PATH);
system 합수로 실행해야될 명령어를 설정합니다. 참고로 nohup [실행파일 패스] &로 실행을 하면 실행파일은 백그라운드에서 실행되며 터미널의 연결이 종료되어도 계속 실행됩니다.

콘솔 출력 내용은 생성되는 nohup.out 파일 에서 확인할 수 있습니다. 위에서 printf로 출력되는 내용은 모두 nohup.out에 저장됩니다.

2. 주의 사항
if(strstr(buff, APP_NAME))
위와 같이 strstr로 간단한 검사만 합니다. "abc"란 프로세서가 죽었더라도 "abcdef"란 프로세스가 있으면 살아 있는 것으로 간주됩니다.  서버 이름이 절대 중복되지 않으면 상관 없지만, 안전을 위하여, 해당 시스템의 stat 파일의 포멧을 보고 파싱해서 정확하게 검사해야 할 것 입니다.

nohup.out 파일의 크기
검사 주기가 작고 출력되는 내용이 많을 경우에는 nohup.out 파일의 크기가 지나치게 커질 수 있습니다. 콘솔로 출력되는 양을 줄이거나 주기적으로 파일의 크기를 체크해야 합니다.

2000년 초 제작 하여 몇 번을 사용 해 보고 이상이 없었으나, 백그라운드에서 while로 항시 돌아 가며 시스템에 접근하는 프로그램이기 때문에 사용 시 많은 테스트와 올바르게 동작 하는지 확인을 하셔야 합니다.

이 소스를 이용해서 일어나는 피해에 관해서는 일절 책임을 지지 않으니, 주의해서 사용하시기 바랍니다.

AND

얼마전 애플에서 공개된 위젯 개발툴인 Dashcode를 다운 받고, 이제서야 실행을 해 보았습니다.

하지만 OS X를 10.4.10으로 버젼업 때문인지, 아니면 Dashcode의 영향인지 PPC  iMac에선 매우 불안정한 모습을 보이고 있습니다. Dashcode가 이유없이 다운된다던지, 응용프로그램 사용 중에 바람개비가 자주 나타납니다.

그 외에 Dashcode에서 타이틀 등에 한글을 사용하면 오동작을 하였습니다. 이 것도 지금 사용중인 제 맥만 그런 것인지 Dashcode 오류인지는 확인하지 못했습니다.

1. Dashcode 둘러보기

1) 다운로드 및 설치

Dashcode는 현재 베타 버젼으로 애플 ADC 홈페이지에서 다운로드 받을 수 있습니다. Xcode와 마찬가지로  ADC 회원만 다운로드 받을 수 있습니다.

사용자 삽입 이미지
설치를 완료하면 실행파일은  /Developer/Applications/ 에 위치 합니다. 좌측과 같이  Xcode와 유사한 Dashcode의 아이콘을 발견할 수 있습니다.



2) 실행

Dashcode를 실행하면, 아래와 같이 제공하는 템플릿들과 시작할 수 있는 윈도우가 나옵니다. 일반적인 위젯을 만들기 위해 Custom을 선택 합니다.
사용자 삽입 이미지


3) 둘러보기

사용자 삽입 이미지

Attribute
현재 선택된 오브젝트들의 속성과 이벤트를 설정할 수 있는 윈도우 입니다.
 
Library
사용가능한 UI,  텍스트, 이미지, 동영상등을 가지고 있는 팔레트 입니다. 이 곳에서 원하는 오브젝트를 드래그 해서, 위젯에 배치 합니다.

Main 윈도우
좌측에는 위젯에 사용된 오브젝트들의 목록이 있습니다. front는 일반적으로 보는 위젯의 앞면이며, back은 옵션을 설정을 하는 위젯의 뒷면입니다.

그 밑에는 위젯의 속성, 기본 이미지, 아이콘을 설정할 수 있는 버튼들이 있습니다.

사용자 삽입 이미지
하단에는 Workflow Steps 가 위치해 있으며, 위젯을 제작하는 작업이 순서대로 나와 있습니다.

좌측과 같은 순서로 위젯을 만들어 나가면 됩니다. 항목을 클릭하면 각각의 세부 작업을 확인할 수 있습니다.



 
2. 바이오리듬 위젯 제작

이제 간단하게 바이오리듬을 대충 만들어 보겠습니다. 이 예제는 Dashcode의 개략적인 사용법을 위한 예제입니다. 바이오리듬 계산 방법은 이 전에 다른 언어로 작성되어 있었던 소스를 자바스크립트로 변경하였습니다. 변경 후 정확한 값이 출력되는지는 확인하지 않았습니다.

우선 메뉴의 File/Save에서 ZBiorhythm으로 프로젝트를 저장하고 시작합니다. 프로젝트명은 개인의 취향대로 변경하시면 됩니다.


1) Front 화면 설정

기본으로 생성되어 있는 Hello World! 텍스트를 삭제합니다. 라이브러리 윈도우의 Parts 항목에서 canvas를 끌어다 아래와 같이 배치 합니다.
사용자 삽입 이미지

사용자 삽입 이미지
canvas 속성에서 크기를 180 X 120으로 설정합니다. 속성창은 오브젝트가 선택된 상태에서 상단의 [inspector] 버튼을 클릭하거나, 키보드에서 [option + command + i]를 같이 누르시면 됩니다.



사용자 삽입 이미지
이제 라이브러리 윈도우에서 텍스트를 위젯의 상단에 배치 합니다. 텍스트를 더블클릭하여 위젯의 이름을 입력합니다. 저는 위와 같이 ZBiorhythm이라고 이름 지었습니다.

사용자 삽입 이미지
그 다음 속성창에서 텍스트의 속성을 설정합니다. Style을 Bold로, Size는 12pt로 설정하였습니다. 타이틀, 스타일, 색상, 크기 등은 취향대로 선택하시면 됩니다.





사용자 삽입 이미지
Library Parts에서 텍스트를 세개 더 드래그해서 아래와 같이 배치 합니다. 위와 같이 해당 텍스트를 더블클릭하면 텍스트를 변경할 수 있습니다.

각각 Physical, Sensibility, Intellectual이라고 입력하고, 속성창에서 색상을 blue, red, green으로 지정해 줍니다. (처음에 말씀드린 것과 같이 한글을 입력하면 오류가 나서, 영문으로 하였습니다.)


Library Parts에서 Text Field를 세개 가지고 와서 좌측과 같이 배치하고, 크기를 조절합니다.  아래와 같이 속성창에서 ID를 위에서 부터 각각 bio0, bio1, bio2로 설정합니다.
사용자 삽입 이미지


2) Back 화면 설정

이제 좌측 오브젝트 목록에서 back을 클릭하여, 옵션을 설정할 수 있는 위젯의 뒷면을 만들어 보겠습니다. 라이브러리에서 텍스트 필드를 드래그로 back 화면으로 가지고 옵니다. Birthday로 타이틀을 변경하고, 잘 보일 수 있도록 속성창에서 색상을 white로 변경합니다.

그 하단에 세개의 텍스트 필드(Text Field)를 배치하여, 바이오리듬 계산을 위해 사용자의 생년월일을 입력 받도록 합니다. 첫번째 텍스트 필드부터 속성창의 ID를 각각 b_year, b_month, b_day로 설정합니다.
사용자 삽입 이미지

이제 Workflow Steps의 Lay out interface에 해당하는 작업을 완료하였습니다. 그 하단의 Add handlers & code 작업을 해보겠습니다.

3) 소스코드 작성

좌측 Workflow Steps 항목에서 Add handlers & code를 클릭하면 나타나는 Source code editor 왼쪽의 삼각형 아이콘을 클릭합니다. 아래와 같이 우측 하단에 소스창이 나옵니다.
사용자 삽입 이미지

현재 소스가 ZBiorhythm.js 임을 확인하시고, 아래의 내용을 상단에 입력합니다. 제목 그대로 Dashcode 맛보기 이므로, 자세한 설명 없이 간단한 주석으로 대체하겠습니다.
/***
* MyCode
**/
var MAX_TYPE = 3;  // 신체, 감성, 지성의 분류 갯수 설정
var PI = 3.14159;  // 바이오리듬 계산을 위한 원주율
var TDV = (60*60*24*1000); // 밀리세컨드(1/1000초)를 일로 환산하기 위한 값

var curDate = new Date(); // 오늘 날짜
var startDate = new Date(curDate.getYear(), curDate.getMonth(), 1); // 출력 시작일
var birthDate = new Date(); // 사용자 생년월일

/** bio_info - 바이오리듬 계산과 출력을 위한 정보
    23, 28, 33 -> 각각의 바이오리듬을 계산할 값
    ble, red, green -> 출력 색상
*/
var bio_info = new Array(MAX_TYPE);

bio_info[0] = new Array(23, "blue");
bio_info[1] = new Array(28, "red");
bio_info[2] = new Array(33, "green");

/*
바이오리듬 타입에 맞추어, 한달 치 배열값(해당 바이오리듬 값)을 반환한다.
idx -> 바이오리듬 타입 0-신체, 1- 감성, 2-지성
*/
function getBioData(idx)
{
    var data = new Array(31);

    var c_days = startDate.getTime()/TDV;
    var b_days = birthDate.getTime()/TDV;
    
    var cc = bio_info[idx][0];
    for(i = 0; i <= 30; i++)
    {
        var gab = c_days - b_days;
       
        var p = parseInt(Math.sin((gab/cc) * 2 * PI) * 100);
        data[i] = p;
       
        c_days++;
    }
    
    return data;
}

/** 바이오 리듬 출력 */
function showGraph()
{
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    
    context.lineWidth = 1.0;
    context.shadowBlur = 1;

    // 가로 기준선 출력    
    context.strokeStyle = "7f7f7f";
    context.moveTo(0, 60);
    context.lineTo(180, 60);
    context.stroke();

    // 세로 기준선 출력
    context.strokeStyle = "#efefef";
    for(i = 0; i <= 30; i++)
    {
        context.moveTo(i*6, 0);
        context.lineTo(i*6, 120);
       
        // 오늘 날짜일 경우에는 짙은 색으로 출력
        if(i == curDate.getDate() - 1)
            context.strokeStyle = "7f7f7f";

        context.stroke();
        if(i == curDate.getDate() - 1)
            context.strokeStyle = "#efefef";
    }
    
    // 바이오 리듬 출력
    context.lineWidth = 1.0;
    context.shadowBlur = 3;
    for(k = 0; k < MAX_TYPE; k++)
    {
        var data = getBioData(k);
        context.strokeStyle = bio_info[k][1];
        for(i = 0; i <= 30; i++)
        {
            context.moveTo(i * 6, (100 - data[i])/2 + 10);
            context.lineTo((i + 1) * 6, (100 - data[i+1])/2 + 10);
       
            context.stroke();
           
            // 오늘 날짜일 경우에는 입력창에 각각의 바이오리듬 값을 출력
            if(i == curDate.getDate() - 1)
            {
                document.getElementById("bio" + k).value = data[i];
            }
        }    
    }    
}

/* 사용자 생년월일을 세팅하고, 저장된 생년월일이 없으면 false를 반환한다. */
function setBirthDay()
{
    if(window.widget)
    {
        if(widget.preferenceForKey("b_day"))
        {
            birthDate.setYear(widget.preferenceForKey("b_year"));
            birthDate.setMonth(widget.preferenceForKey("b_month"));
            birthDate.setDate(widget.preferenceForKey("b_day"));
       
            return true;
        }
    }
    return false;
}

Dashcode가 생성해 준 소스에서 아래의 내용을 추가합니다.
function load()
{
    setupParts();
   
    // 사용자가 설정을 하지 않았을 경우, 설정창(back)으로 간다.
    if(setBirthDay() == false)
    {
        showBack(null);   
    }
}

function show()
{
    // your widget has just been shown.  restart any timers
    // and adjust your interface as needed
    showGraph();
}

function showBack(event)
{
    // your widget needs to show the back

    var front = document.getElementById("front");
    var back = document.getElementById("back");

    if (window.widget)
        widget.prepareForTransition("ToBack");

    front.style.display="none";
    back.style.display="block";
   
    if (window.widget)
    {
        setTimeout('widget.performTransition();', 0);
       
        /** 저장된 값이 있으면, 옵션의 입력필드에 설정 한다. */
        document.getElementById("b_year").value = widget.preferenceForKey("b_year");
        document.getElementById("b_month").value = widget.preferenceForKey("b_month");
        document.getElementById("b_day").value = widget.preferenceForKey("b_day");
    }
}

function showFront(event)
{
    // your widget needs to show the front

    var front = document.getElementById("front");
    var back = document.getElementById("back");

    if (window.widget)
        widget.prepareForTransition("ToFront");

    front.style.display="block";
    back.style.display="none";
   
    if (window.widget)
    {
        setTimeout('widget.performTransition();', 0);
   
        /** 사용자의 입력을 저장한다. */
        var b_year = document.getElementById("b_year").value;
        var b_month = document.getElementById("b_month").value;
        var b_day = document.getElementById("b_day").value;
       
        widget.setPreferenceForKey(b_year, "b_year");
        widget.setPreferenceForKey(b_month, "b_month");
        widget.setPreferenceForKey(b_day, "b_day");
    }
    /** 그래프를 출력한다. */
    showGraph();
}

사용자 삽입 이미지
이제 Add handlers & code까지 작업을 완료하였습니다. 작업이 완료 되면 좌측의 Workflow Steps에서 해당 항목의 [Make as Done]을 클릭하면 완료된 작업으로 표시됩니다.

현재 어디까지 작업이 되어 있는지 확인할 수 있습니다. 취소는 [Make as Not Done]을 클릭하시면 됩니다.


4)  위젯 설치 및 실행

다음은 Set attributes 작업입니다.  여기선 변경없이 기본설정 사항을 사용하겠습니다. Attributes 버튼을 클릭하시면, 설정사항을 확인할 수 있습니다.

다음은 Preview default image 입니다. default image는 위젯이 처음 로딩될  때나, 설치 확인 시 나오는 이미지 입니다. 다음은 아이콘 설정인데 이역시 모두 생략하겠습니다.

사용자 삽입 이미지
이제 위젯을 사용해 보도록 하겠습니다. 메뉴에서 File을 클릭하면 좌측과 같이 Deploy Widget... 메뉴가 있습니다. 이 메뉴는 작성한 위젯을 위젯 포맷에 맞추어 저장하여 줍니다. 저장된 위젯(디렉토리)을 압축하여 배포하시면 됩니다.

다음의 Deploy Widget to Dashboard... 는  위젯을 지금 사용중인 컴퓨터에 설치하여 줍니다.




Deploy Widget to Dashboard... 로 제 컴퓨터에서 실행해 본 모습니다. 역시 급조한 만큼 눈에 거슬리는 부분이 많이 있습니다.
사용자 삽입 이미지 사용자 삽입 이미지

사용자 삽입 이미지
대쉬보드 설정화면에서 하단을 보면, 좌측과 같이 ZBiorhythm의 아이콘이 보입니다. 아이콘을 설정을 하지 않았기 때문에 빈 아이콘으로 보입니다.

 


3. ToDo...
제가 Dashcode를 테스트 삼아 처음 사용해 보면서, 작업한 내역을 그대로 올렸기 때문에 실제 사용 시에는 문제가 작성될 수 있습니다. 아래의 몇 가지 사항들만 추가하면 실제로 사용할 수 있을 것 입니다.

1. 버그 확인 및 수정
버그 테스트 없이 한번 실행해 보고 올리는 것이라, 오류가 있을 수 있습니다.

2. 바이오리듬 데이터 확인
이전에 언급한대로 다른 언어로 되어 있는 내용을 옮겼기 때문에, 옮기는 중간에 오류가 있을 수도 있습니다.

3. 사용자 입력 확인
사용자 생일을 입력시, 숫자인지, 유효한 날짜인지, 모두 입력하였는지 확인하는 소스를 추가 합니다. Dashcode에서 Run할 때 랑 실제 위젯에서 입력창의 크기가 틀렸습니다. 역시 수정하지 않았습니다.

4. 그래프 디자인 변경
그래프 배경이나 바이오리듬 곡선등의 색상이나 바탕색, width 및 기타 설정 등을 조절합니다.

5. 날짜 변경
front에서 년월을  선택할 수 있도록 합니다.

이상 간단하게 둘러보기를 마치겠습니다. 저도 더 많이 사용해 보고, 어느 정도 알게되면 맛보기란 제목이 아닌 사용하기란 제목으로 다시 한번 제대로 된 위젯을 작성해 보겠습니다.
 
AND

맥은 unix를 기반으로 하고 있지만, 일반적인 사용자들은 맥을 터미널 환경에서 유닉스로 사용할 일이 거의 없습니다. 하지만 터미널을 이용하면 맥을 유닉스 답게 사용할 수 있고, UI 상에서는 접근할 수 없는 파일이나 디렉토리에 접근 할 수 있어 OS X의 구조를 이해하는데 도움이 됩니다.

C를 공부하시는 분들은 /usr/include 밑의 C 헤더파일 들에서 많은 정보를 얻으실 수 있습니다. C 강좌에서 include하는 stdio.h 파일도 여기에 있습니다.

이제 맥 터미널에서 한글 입출력을 가능하게 하고, 편리하게 사용할 수 있는 몇 가지 작업을 해 보겠습니다.

1. iTerm 다운로드 및 설정
맥에서는 기본적으로 터미널 어플리케이션을 제공합니다. 하지만 빈약한 기능과 한글 사용의 문제로 iTerm을 사용하시는 것이 좋습니다.

iTerm은 터미널에 비해 많은 기능을 가진 코코아로 작성된 맥용 공개 터미널 프로그램입니다. http://iterm.sourceforge.net/에서 iTerm의 최신 버전을 다운 받고 실행합니다.

Bookmarks 메뉴에서 Manage Profiles...를 실행합니다.  Terminal Profiles/Default에서 Type와 Encoding을 아래와 같이 설정합니다.
사용자 삽입 이미지

사용자 삽입 이미지
Bookmarks/Manage Bookmarks...를 실행하고, 하단의 연필 아이콘 버튼을 클릭하여 Display 속성과 필요한 속성들을 변경합니다.

저는 classic iTerm Large이 가장 보기 좋은 것 같아 이것으로 선택하였습니다.







2. vi
1) vi의 기본 사용법

유닉스 계열에서는 에디터로 vi와 emacs를 주로 사용합니다. emacs는 막강한 기능을 가졌지만, 사용법이 vi 보다 복잡하고 어렵기 때문에 여기서는 vi를 예로 들겠습니다.

터미널로 로그인을 하고, 프롬프트 상태에서 vi를 실행(vi [return]) 합니다. 처음 시작되면 아래와 같은 메세지 화면이 나올 것입니다.
사용자 삽입 이미지

vi는 기본적으로 키보드만 가지고 사용되기 때문에, 입력 모드와 명령 모드로 나누어져 동작합니다. 일단 vi를 종료해 보겠습니다. 명령행 모드는 [esc] 키를 누르면 실행됩니다.

사용자 삽입 이미지
처음 시작시 명령 모드 이기 때문에, ":"를 입력하면 vi 좌측 하단에 ": "가 출력됩니다.  이 때 vi를 종료하는 q를 입력하고 [return]을 치면 vi가 종료됩니다.



이번엔 파일을 하나 만들어 보겠습니다. > vi text.txt 로 vi를 실행합니다. 여기서 i를 입력하면 입력모드가 실행됩니다. 아직 한글은 제대로 입력되지 않기 때문에 영문과 숫자를 입력해 봅니다.

입력이 완료되면 [esc]를 눌러 명령 모드로 변경하고, 위와 같이 ":wq"를 입력하고 [return]을 입력합니다. wq는 파일을 저장하고 종료하라는 명령어입니다.

설정을 위한 아주 기본적인 명령어만 알아 보았습니다. vi는 이외에도 사용을 편리하게 해주는 많은 명령어들이 있습니다. 하지만 기본적으로 15개 정도만 알아도 사용하는데 지장은 없습니다.


2) .vimrc 설정

이제 vi에서 한글입력이 가능하고, 사용하기에 편리하도록 만들어 보겠습니다. 계정의 루트 디렉토리(터미널 실행시 기본 디렉토리 이며, 프롬프트 상에서 cd[return]을 치면 됩니다)로 가서 vi .vimrc를 입력하고 실행합니다.

vi가 실행되면 아래의 내용을 복사하고 i로 입력모드로 만든 후 붙여 넣습니다. 그 후에 위와 같이 esc -> :wq[return]으로 저장하고 나옵니다.

set enc=UTF-8
set fileencodings=UTF-8

set nocompatible
set backspace=indent,eol,start

set tabstop=4
set shiftwidth=4
set cindent
set autoindent
set smartindent
set history=15
set ruler
set showcmd

set background=dark
set paste
set nu
set ai
syntax on
언어를 UT-8로 설정하고 코딩을 위한 들여쓰기, 탭크기, 문법 구분 등을 설정합니다. 이외에 자료를 찾아 보시고 개인별로 용도에 맞게 수정해서 사용하시면 됩니다.


3. 쉘 환경 설정

1) .bash_profile

다시 계정의 루트 디렉토리에서 vi .bash_profile을 입력합니다. .bash_profile은 사용자 별로 터미널 쉘 환경 설정을 저장하는 파일로 보시면 됩니다. 파일 앞의 "."을 꼭 입력하셔야 합니다. 아래의 내용을 복사하여 붙여 넣습니다.

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

alias ls='ls -vGF'

PS1="[\u@\h \W]\\$ "

처음 세 명령어는 삭제, 복사/이동시 같은 파일이 있을 경우 사용자에게 확인을 받도록 합니다.

alias ls='ls -vGF'
파일 목록을 보여주는 ls 명령어 실행시, 디렉토리를 한글명으로 표시하고 색상을 보여주도록 합니다.

PS1="[\u@\h \W]\\$ "
프롬프트 출력을 변경합니다. u는 사용자, h는 호스트명, W는 현재 디렉토리를 의미합니다.

이제 이전과 같은 방법으로 .bash_profile를 저장하고 나옵니다.


2) .inputrc

위와 같이 vi .inputrc를 열고 아래의 내용을 복사하고 저장합니다.
set convert-meta off
set meta-flag on
set output-meta on

위의 명령들로 프롬프트 상태에서 한글이 올바르게 입력되도록 합니다.

위의 변경된 사항들이 적용되게 하기 위해, 터미널을 닫고 다시 실행하여 로그인 합니다. 이제 터미널에서 제대로 한글이 보이고, 터미널 및 vi에서 한글을 입력하고 출력되는 것을 확인 할 수 있습니다.


3)  로그인 메시지 및 호스트 명 변경

이제 터미널로 로그인 시 출력되는 메시지를 변경해 보겠습니다.

sudo vi /etc/motd [return]
sudo는 루트권한을 사용할 수 있게 하는 명령어로 위와 같이 입력하면 패스워드를 확인합니다. 여기서는 프로그램 인스톨 시나 업그레이드시 입력하는 본인의 패스워드를 입력하면 됩니다.

저는 아래와 같이 입력하고, 저장하였습니다.
사용자 삽입 이미지

sudo scutil --set HostName iMac [return]
프롬프트에 나오는 호스트 명을 변경하고 싶을 때는 위와 같이 변경합니다. 위의 iMac 부분을 원하시는 호스트 명으로 변경하시면 됩니다.

이제 다시 로그인을 하면 아래와 같이 환영 메시지와 함께, 호스트 이름이 iMac으로 변경되어 있는 것을 확인할 수 있습니다.
사용자 삽입 이미지


4. 루트계정 활성화
root 권한으로 해야 할 작업이 많을 경우에는 sudo만으로는 불편함이 있습니다. 맥에서는 기본으로 root 계정을 사용할 수 없기 때문에, root 계정을 사용할 수 있도록 변경합니다. root는 중요한 파일을 실수로 삭제하면 시스템에 치명적일 수 있기 때문에, 이 부분은 필요성을 느끼는 분들만 변경하시면 됩니다.

사용자 삽입 이미지
어플리케이션/유틸리티에서 NetInfo 관리자를 실행합니다. 상단 메뉴의 보안에서 인증을 한 후, 보안 메뉴 하단의 루트계정 활성화을 클릭한 후 사용할 패스워드를 입력하고 활성화 합니다.



이제 위에서 입력한 패스워드로 루트 계정을 사용할 수 있습니다. 루트 계정 사용은 프롬프트 모드에서 su를 입력하고 위에서 설정한 패스워드를 입력하시면 됩니다.
AND

사용자 삽입 이미지
Apple Develope Connection
url: http://www.apple.co.kr/developer/
애플에서 운영하는 맥개발 지원 공식사이트 입니다.  맥개발과 관련하여 필수적인 사이트이며, 레퍼런스, 메뉴얼, 샘플소스, 관련사이트 등 개발에 관련된 전반적인 지원을 받으실 수 있습니다.


사용자 삽입 이미지
Mac OS X 개발자 포럼
url: http://www.osxdev.org
맥 OSX에서 개발에 관한 대표적인 한국 포럼입니다. 위키에서 많은 자료와 번역 자료를 찾을 수 있습니다.



사용자 삽입 이미지
KMUG (한국 매킨토시 사용자 그룹)

url: http://www.kmug.co.kr
맥사용자 사이트이며 개발에 관한 내용은 커뮤니티/공부하자 밑에 코코아/카본 개발실에서 코코아 개발과 관련된 글, 질문/답변을 보실 수 있습니다.


사용자 삽입 이미지
OS X Page
url: http://osx.hyperjeff.net
OS X 개발에 관한 심도 있는 자료들을 볼 수 있습니다. 특히 각종 어플리케이션과 소스를 다운로드 받으실 수 있습니다. 적극 추천하는 사이트 입니다.


사용자 삽입 이미지
iDevGames
url: http://www.idevgames.com
맥 게임개발 커뮤니티 입니다. 맥에서 게임제작과 관련하여 다양한 분류의 자료와 포스트들이 있습니다.



사용자 삽입 이미지
CS193E

url: http://www.stanford.edu/class/cs193e/
코코아 개발 강좌 사이트 입니다. 메뉴얼, 튜토리알, 강좌, 샘플등을 다운로드 할 수 있습니다.



사용자 삽입 이미지
Cocoabuilder

url: http://www.cocoabuilder.com
코코아 개발과 관련된 질문과 답변을 할 수 있는 포럼 사이트 입니다.




사용자 삽입 이미지
CocoaDev
url: http://www.cocoadev.com
코코아 개발과 관련된 Wiki 사이트이며,  커뮤니티와 링크 등 다양한 자료가 있습니다.



사용자 삽입 이미지
CocoaLab
url: http://www.cocoalab.com
Become an Xcoder란 문서로 유명한 코코아와 관련된 위키, 소스, 샘플 등의 자료가 있습니다. 코코아를 처음 시작하시는 분은  Become an Xcoder란 문서를 적극 추천 합니다.


사용자 삽입 이미지
Cocoa dev Central
url: http://www.cocoadevcentral.com
쉽게 따라할 수 있는 코코아 개발 튜토리알 사이트 입니다. 기타 OSX 개발과 관련된 유명 블로그들의 포스트와 링크가 있습니다.

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

미국의 맥개발자 구인 내용  (8) 2007.10.20
맥용 게임 Thumblebugs  (0) 2007.10.19
OS X용 MySQL 클라이언트 - CocoaMySQL  (8) 2007.10.19
NeXTSTEP에 관하여...  (4) 2007.05.14
GNUstep 개발 데모 동영상  (0) 2007.05.10
AND

기타 2007. 5. 14. 13:25
Mac OS X나 개발환경에 관련된 내용에서 꼭 나오는 단어 중에 NeXTSTEP이 있습니다.  NeXTSTEP이란 NeXT사에서 나온 OS입니다. 저는 사용은 커녕 직접 본 적도 없지만 제 마음속엔 동경의 대상인 전설의 OS이고, NeXTSTEP의 개발환경과 철학은 Xcode와도 많은 관련이 있기 때문에 귀동냥으로 들은 NeXTSTEP에 관해 간단히 알아 보겠습니다.

사용자 삽입 이미지
1985년에 존스컬리에 의해 자신이 세운 애플사에서 나오게된 스티브잡스는 NeXT computer란 회사를 만들고 하드웨어와 OS 개발에 들어가게 됩니다.

한국에서 올림픽이 열리던 1988년 마침내 NeXTSTEP은 세상에 모습을 드러내게 됩니다. OS 자체로도 파격적이지만, NeXTSTEP의 개발환경은 당시 다른 OS의 개발환경과 비교해 보면 놀라울 만큼 혁신적이었습니다. 웹의 아버지라고 불리우는 Tim Verners Lee도 최초의 웹브라우져와 웹서버를 NeXTSTEP 환경에서 개발하였습니다.


지금도 스크린샷이나 동영상을 보면 MS Dos를 주로 쓰던 당시의 컴퓨터 환경과 비교 해보면  얼마나 진보적인 OS였는가 감탄이 나올뿐입니다. 다만 승용차 가격과 비슷하던  가격이...

꿈의 컴퓨터라고 불리웠던 NeXTSTEP이었지만, 지나치게 높은 가격으로 시장에서는 실패하였습니다. 1993년 NeXT computer는 문을 닫고, 소프트웨어에 주력하면서 NeXT Software Inc.로 회사이름을 변경합니다.  이 때 NeXT는 NeXTSTEP이란 이름으로 OS와 개발툴을 판매하면서, i386, 선스팍등 다양한 하드웨어를 지원하게 됩니다.

이 후 1996년. 애플은 새로운 OS를 NeXTSTEP을 기반으로 제작하기로 결정 하고, Next사를 인수하고 스티브잡스가 애플로 복귀합니다. 그리고 Objective-C와 NeXTSTEP/OPENSTEP의 개발툴 들을 기반으로 한 개발환경을 가진 랩소디라고 불리우는 초기 OS X를 만들면서 OS X의 역사가 시작됩니다.

80/90년대. 당시 컴퓨터 관련 잡지와 통신 동호회 등에서 이어지는 칭송을 들으며, 프로그래밍을 하는 사람이면 대부분이 NeXT의 컴퓨터와 개발환경을 한번쯤은 경험해보고 싶은 생각이 들었을 것입니다.

개인적으로 맥을 구입하고 cocoa를 공부하는데 가장 큰 동기가 되어 준 것이 NeXTSTEP이었기 때문에, 웹검색과 이전 기억을 떠올리며 간단히 NeXTSTEP의 역사에 대해서 정리 해 보았습니다.
AND