첨에는 내가 홈브류를 하나 만들어 볼까 하면서 시작한건데 나이가 들면서 점점 더 게을러 지기만 하니 이도 힘들것 같고 그냥 각 기능별로 간단하게 공부해보는 셈 치고 구현해 보기로 했었다.
첨에 만든건 SDL을 이용해서 PSP에 그림파일을 뿌려보는 것이었다. 생각보다는 간단하게 구현 되었다. 그다음에 한것이 한글 관련된 것이었는데 게임 관련 사이트에 PSP용 한글 라이브러리가 공개 된게 있어서 살펴보다가 TTF 폰트를 사용하는 간단한 프로그램을 만들어 보았었다.
세번째가 이번인데 zip으로 압축된 파일에서 파일을 추출해 내는 프로그램이다. 관련된 라이브러리와 소스는 웹서핑을 하다보니 많이 풀려 있는 상태여서 이것 역시 쉽게 구현 되었다. unzip 관련 소스파일을 몇개 복사해와서 함수만 콜 하니 해결 되었다.
test.zip 라는 파일에는 111.txt 222.txt 333.txt 444.txt 4개의 파일이 묶여 있고 각각의 파일들을 추출해 내는 프로그램이다. unix 환경에서 실행 되며 PSP에서도 실행 된다. 단 PSP 에서 실행하려면 printf 같은 unix c 함수는 수정해주어야 한다.
PSP 프로그래밍에서 한글 출력의 문제에 대해서 관련 소스 코드가 공개 된 것이 있어 살펴 보았다. 각 글자에 대해서 모두 비트맵을 정의하여 해당 글자의 비트맵에 따라 비디오 메모리에 직접 접근해서 픽셀별로 글자색 배경색을 지정는 형식으로 만들어져 있었다. 글자별 비트맵을 만드는 것이 보통 노가다도 아니고 폰트 변경도 어렵고 글자 크기 조절도 안되는 불편함이 있어서 SDL_ttf라이브러리를 이용해서 트루타입 폰트를 사용하여 글자를 출력할 수 있는 간단한 프로그램을 작성하여 보았다. 그런데 속도가 많이 떨어진다. 텍스트 뷰어가 아닌 이미지뷰어 정도라면 사용해도 될 듯 하다.
새 시스템에서 계정을 만들때마다 쉘과 VIM의 설정이 항상 귀찮기만하다.
어디선가 잘 되어있는 vimrc 의 내용을 긁어왔다.
"========================================================
"기본적인 설정들
"========================================================
set nocompatible " Vim 디폴트 기능들을 사용함
set backspace=2 " 삽입 모드에서 백스페이스를 계속 허용
set autoindent " 자동 들여쓰기 set paste " 자동 들여쓰기에서 붙여넣기 할때 계단 현상 방지
set cindent " C 언어 자동 들여쓰기 set t_ti= t_te= "vi를 종료 할때 편집 하던 화면이 남도록 함
set smartindent " 역시 자동 들여쓰기
"set textwidth=76 " 76번째 칸을 넘어가면 자동으로 줄 바꿈
"set nowrapscan " 찾기에서 파일의 맨 끝에 이르면 계속하여 찾지 않음
set nowrap " 터미널 넓이보다 긴 라인이 경우 줄 바꿈을 하지 않음
set nobackup " 백업파일을 만들지 않음
set novisualbell " 비주얼벨 기능을 사용하지 않음
set nojoinspaces " J 명령어로 줄을 붙일 때 마침표 뒤에 한칸만 띔
set ruler " 상태표시줄에 커서 위치를 보여줌
set tabstop=4 " <Tab> 간격
set shiftwidth=4 " 자동 들여쓰기 간격
"set keywordprg=edic " K를 눌렀을 때 실행할 명령어
set showcmd " (부분적인) 명령어를 상태라인에 보여줌
set showmatch " 매치되는 괄호의 반대쪽을 보여줌
set ignorecase " 찾기에서 대/소문자를 구별하지 않음
set incsearch " 점진적으로 찾기
set autowrite " :next 나 :make 같은 명령를 입력하면 자동으로 저장
set title " 타이틀바에 현재 편집중인 파일을 표시
set nohlsearch " 찾는 단어를 하이라이팅
"========================================================
"파일 인코딩을 한국어로 설정
"========================================================
if $LANG == "ko_KR.EUC-KR" || $LANG == "ko_KR.euckr" || $LANG == "ko_KR.eucKR"
set encoding=euc-kr
set fileencoding=korea
else
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,euc-kr,latin1
endif
"========================================================
"터미널에 따른 설정 : Xterm이면 16컬러 사용
"========================================================
"if &term =~ "xterm-debian" || &term =~ "xterm-xfree86"
" set t_Co=16
" set t_Sf=^[[3%dm
" set t_Sb=^[[4%dm
" set t_kb=^?
" fixdel
"endif
"========================================================
"문법 강조기능 사용
"========================================================
if has("syntax")
set bg=dark
syntax on
endif
"========================================================
"GUI 모드로 실행할 경우
"========================================================
if has("gui_running")
set visualbell " 비주얼벨 기능 사용
set hlsearch " 찾는 단어를 하이라이팅
set guifontset=-*-fixed-medium-r-normal--14-*-75-75-*-70-iso8859-1,-*-gulim-medium-r-normal--14-140-75-75-*-140-ksc5601.1987-0
endif
" ---- language-env end DON'T MODIFY THIS LINE!
"
autocmd BufRead /tmp/mutt* normal :g/^> -- $/,/^$/-1d^M/^$^M^L
" apache
au BufNewFile,BufRead /etc/apache2/*.*.conf* setf apache
au BufNewFile,BufRead /etc/apache2/*/* setf apache
" BIND zone
au BufNewFile,BufRead named.conf.local setf named
au BufNewFile,BufRead named.conf.* setf named
au BufNewFile,BufRead *.ejb setf java
" BASH
au BufNewFile,BufRead bash_* setf is_sh
au BufNewFile,BufRead bash_* call SetFileTypeSH("bash")
회사에서 할 것 도 없고 심심해서 pspcomic 라는 프로그램을 분석해 보았다. SDL을 이용하여 작성된 프로그램인데 그림 파일을 PSP에 출력하는 것이 생각보다 간단하여 한번 만들어 보았다. test.jpg 파일을 3초간 출력 후 종료된다. psp해상도 보다 작은 jpg 파일을 아무거나 준비하여 실행한다.
1. CygWin을 다운 받아서 설치. - 유의사항은 패키시 선택 사항에서 autoconf, automake, bison, flex, gcc, make, ncurses, patch, subversion, texinfo, wget 이것들은 반드시 설치해야 한다. 그 외 CygWin에는 기본적으로 설치하지 않는 binutils, libtool, diff 도 반드시 설치한다. 그 외 vim과 함께 ctags도 선택하면 좋다. 레파지토리는 http://ftp.daum.net 을 선택하면 빠르다.
3. vi ~/.bash_profile 을 열어서 아래 환경변수를 추가한다. export PSPDEV=/usr/local/pspdev export PATH=$PATH:$PSPDEV/bin
4. source ~/.bash_profile 하여 환경 변수를 읽어들인다.
5. toolchain 을 풀어놓은 디렉토리로 가서 ./toolchain.sh 를 실행한다.
6. 느긋하게 기다린다. T7250 듀얼 CPU를 가진 노트북에서 대략 한시간 가량 걸렸다. 아마 이 과정에서 에러가 발생한다면 1번 과정에서 필요한 패키지를 설치하지 않은 것이다.
7. PSPSDK 외에 필요한 라이브러리들을 추가로 다운 받는다. svn export svn://svn.pspdev.org/psp/trunk/zlib svn export svn://svn.pspdev.org/psp/trunk/libpng svn export svn://svn.pspdev.org/psp/trunk/jpeg svn export svn://svn.pspdev.org/psp/trunk/libmad svn export svn://svn.pspdev.org/psp/trunk/freetype svn export svn://svn.pspdev.org/psp/trunk/SDL svn export svn://svn.pspdev.org/psp/trunk/SDL_image svn export svn://svn.pspdev.org/psp/trunk/SDL_mixer svn export svn://svn.pspdev.org/psp/trunk/SDL_ttf
8. 다운 받은 패키지를 컴파일하고 설치한다. cd zlib && make && make install && cd ../ cd libpng && make && make install && cd ../ cd jpeg && make && make install && cd ../ cd libmad && make && make install && cd ../ cd freetype && sh autogen.sh && LDFLAGS="-L$(psp-config --pspsdk-path)/lib -lc -lpspuser" ./configure --host psp --prefix=$(psp-config --psp-prefix) && make && make install && cd ../ cd SDL && sh autogen.sh && LDFLAGS="-L$(psp-config --pspsdk-path)/lib -lc -lpspuser" ./configure --host psp --prefix=$(psp-config --psp-prefix) && make && make install && cd ../ cd SDL_image && sh autogen.sh && LDFLAGS="-L$(psp-config --pspsdk-path)/lib -lc -lpspuser" ./configure --host psp --prefix=$(psp-config --psp-prefix) && make && make install && cd ../ cd SDL_mixer && sh autogen.sh && LDFLAGS="-L$(psp-config --pspsdk-path)/lib -lc -lpspuser" ./configure --host psp --prefix=$(psp-config --psp-prefix) && make && make install && cd ../ cd SDL_ttf && sh autogen.sh && LDFLAGS="-L$(psp-config --pspsdk-path)/lib -lc -lpspuser" ./configure --host psp --prefix=$(psp-config --psp-prefix) --without-x --with-sdl-prefix=$(psp-config --psp-prefix) --with-freetype-prefix=$(psp-config --psp-prefix) --prefix=$(psp-config --psp-prefix) && make && make install && cd ../
9. 이 작업 역시 상당한 시간이 걸린다. 느긋하게 기다려준다. 설치가 완료되면 toolchain 과 다운받은 라이브러리들은 지워도 된다.
10. psp-gcc -v 해서 아래와 같은 메세지가 나온다면 toolchain 은 성공적으로 설치된 것이다. Using built-in specs. Target: psp Configured with: ../configure --prefix=/usr/local/pspdev --target=psp --enable-languages=c,c++ --with-newlib --enable-cxx-flags=-G0 Thread model: single gcc version 4.1.0 (PSPDEV 20060507)
11. $PSPDEV/psp/lib 디렉토리 안에 위에서 설치한 라이브러리들이 있는가 확인해본다.
5. 장비 A와 B의 my.cnf 파일에 아래 사항을 추가한다. --------------------------------------------------------------------- ... [mysqld] ... ndbcluster ndb-connectstring="nodeA:1186"
8. 설정은 끝났다. 하나씩 실행해보자. 기본적으로 설정 파일에 지정된 경로들은 모두 존재해야 한다. MySQL을 실행하기 전에 최소한 DB는 설치 되어야 한다. Binary로 설치한 경우 ~/mysql/configure 실행 Complie 한 경우 mysql_install_db 실행
9. Management Server Daemon을 제일 먼저 실행한다. ~/mysql/ 밑에서 실행할 경우 config.ini가 같은 디렉토리에 존재하므로 다른 파라메타가 필요없다.
<장비A> $ ndb_mgmd Cluster configuration warning: arbitrator with id 1 and db node with id 2 on same host nodeA Running arbitrator on the same host as a database node may cause complete cluster shutdown in case of host failure.
같은 노드에 Management Server Daemon와 Data node가 실행된다는 경고문이다. 구성 환경이 열악(?) 하므로 무시한다.
$ ndb_mgm -e show Connected to Management Server at: nodeA:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from nodeA) id=3 (not connected, accepting connect from nodeB)
[mysqld(API)] 2 node(s) id=4 (not connected, accepting connect from nodeA) id=5 (not connected, accepting connect from nodeB)
장비 A에 Management Server 가 실행된 모습.
10. 장비 A와 B에서 ndbd를 실행한다. 이때 MySQL 매뉴얼에는 my.cnf 파일에 NDBD 설정이 있으니 그냥 실행하면 된다고 하지만 실제로 읽어들이지 못했다. 그래서 Management Server의 정보와 Data Node의 정보를 파라메타로 넘겨주어야 한다.
<장비A> $ ndbd --initial --ndb-connectstring="nodeid=2,nodeA:1186" Data Node의 ID가 2번으로 설정된다. Management Server의 기본 포트가 1186번이다.
$ ndb_mgm -e show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @nodeA (Version: 5.0.19, starting, Nodegroup: 0, Master) id=3 (not connected, accepting connect from nodeB)
[mysqld(API)] 2 node(s) id=4 (not connected, accepting connect from nodeA) id=5 (not connected, accepting connect from nodeB)
장비 B에서 Data Node가 실행된 모습.
11. 장비 A와 B에서 MySQL 서버를 실행한다. mysql.server 파일로 실행할 경우 제대로 실행되지 않았다. 이 경우는 이유를 알 수 없었다. mysqld_safe로 실행할 경우 ~/mysql 밑에서만 제대로 실행되었다. 이 경우 본인의 서버에 MySQL이 여러 경로에 많이 설치되어 있어서 그런 듯 했다. 따로 원인은 파악하지 않았다.