script embedding
기능을 수행하는데 필요한 function 들을 모듈로 제공하고, 스크립트를 통해 상황에 맞게 제어한다면 프로그램의 확장성은 어마어마하게 증가되지 않을까...
하나, 인터프리터와의 접목
컴파일러보다 부각되는 장점은 빌드를 하여 바이너리를 만드는 과정을 거치지 않아도 된다는 것이고,
이러한 특성으로 인한 단점은 파싱을 거쳐 실행코드를 처리하기 때문에 느리다는 것이겠죠.
임베딩은 인터프리터의 장점을 취하는 동시에, 반사적으로 발생하는 단점을 극복하기 위해 사용됩니다.
이런 그림을 그려보면 될 것 같네요.
- 인터프리터는 c, c++ 등의 언어가 인터프리터 엔진을 제어할 수 있도록 제공한다.
- c, c++ 등으로 라이브러리를 개발하고, 비지니스 로직을 스크립트로 제어한다면,
빌드를 하지 않더라도 스크립트를 수정해가면서 프로그램을 바꿀 수 있다.
둘, 인터프리터 선택의 조건
이 질문에 대해서 먼저 떠오르는 것들은 안정성, 성능, 라이센스 문제, ... 들이겠죠.
너무나 당연한 것이니 넘어가고 실제 업무에 적용할 때 중요한 항목을 나열해 봅니다.
embedding 이 가능하여야 한다.
- c, c++ 과 같이 사용할 수 없다면, 미안하지만 리눅스셸이라면 모를까 쓸 일은 다시 없겠네요.
- 객체 지향을 지원하는 인터프리터는 지원하지 않는 인터프리터보다 느립니다.
당연하게도 객체지향이란 것이 객체,상속,다형성등을 지원하는 것이므로 이에 대한 비용을 지불해야 합니다.
- 멀티스레드를 제대로 지원할 수 있어야 합니다.
(하나의 프로세서에서 하나의 인터프리터만 지원하는 경우도 있는데 python 이 예가 되겠군요.)
garbage collection 을 지원한다.
- 메모리 관리를 신경쓰지 않게 해준다면... 무한 감사할 따름...
문법이 쉬워야 한다.
- 문법 배우고 익히는데 오래 걸리면 곤란합니다.
셋, 인터프리터
나름 비교표를 만들어 보기도 했지만 빼버렸고, 참고할 수 있는 사이트만 올려보도록 하겠습니다.
좋다 나쁘다를 잘라 말하고 싶지 않았고, 개인적으로 자기 입맛에 가장 맞는 것을 선택하는 것이 좋겠죠...
perl http://perl.org/
python http://python.org/
lua http://lua.org/
ruby http://ruby-lang.org/
angelscript http://www.angelcode.com/angelscript/
gamemonkey http://www.somedude.net/gamemonkey/
squirrel http://squirrel-lang.org/
넷, 실제 사용
간단한 샘플을 위해 lua 를 예로 들텐데,
- 루아를 배우자는 취지가 아니므로 간단히 파악만 해볼 수 있을 정도만 예를 들어보죠..
- 내용은 간단하게 프로세스를 실행하는 것으로 하겠습니다.
대충 눈으로 훑어보고 이런 부분을 활용해보고 싶다고 한다면,
인터프리터중 하나를 선택해 매뉴얼이나 레퍼런스를 따라 배워보는 것이...
우선, 스크립트에서 불러다 쓸 수 있도록 라이브러리를 만듭니다. (execute.dll)
int embed_GetOSVersion(lua_State* pLS)
{
lua_pushinteger(L, ovi.dwMajorVersion);
return 1;
}
int embed_Execute(lua_State* pLS) { /* CreateProcess */ }
int embed_ExecuteWithUAC(lua_State* pLS) { /* CreateProcessAsUser */ }
다음으로 스크립트를 실행할 수 있도록 코드를 추가합니다. (main.exe)
스크립트에서 c function 을 호출할 수 있도록 바인드합니다.
lua_State* L = lua_open();
luaL_openlibs(L);
lua_register(L, "GetOSVersoin", embed_GetOSVersoin);
lua_register(L, "Execute", embed_Execute);
lua_register(L, "ExecuteWithUAC", embed_ExecuteWithUAC);
luaL_dofile(L, "execute.lua");
lua_close(L);
스크립트를 작성합니다. (execute.lua )
Execute(file, param)
이것으로 간단히 파악해볼 수 있는 예제는 끝났지만, 운영체제의 특성상 문제가 발생할 수 있습니다.
(9x, nt, 200, 2003, xp 등에서는 잘 작동하겠지만 vista 에서는 조금 달리해 봅시다.)
스크립트를 수정해서 vista 를 지원하도록 수정합니다.
os = GetOSVersoin()
-- vista
if os == 6 then
ExecuteWithUAC(file, param)
-- pre vista
else
Execute(file, param)
end
다섯, 언제 이렇게 만들어 봤으면...
이런 그림으로 ...
- 소프트웨어는 걷는다, 뛴다, 공을찬다, 가로챈다, 공을 던진다, 공을 받는다, 배트를 휘두른다 등을 알고 있다.
(라이브러리 모듈)
- 스크립트는 축구의 룰에 따라 축구를 하도록 한다.
(스크립트)
- 축구장에서는 축구의 룰을 적용하도록 하고, 야구장에서는 야구의 룰을 적용하도록 한다.
(제어 로직)
subversion 소스 형상 관리
2007.12.8 - 집에서 짬내서 개인 프로젝트을 할 때 형상 관리에 참고할 내용들을 적어봅니다.
2008.5.1 - 그림이 없고 밋밋해서 스크린샷을 조금 추가합니다.
< 과정 >
서버 설정 단계
Subversion 서버를 우선 설치합니다.
소스의 revision 별로 변경 사항과 커밋 메세지를 보관할 repository 를 만듭니다.
사용자, 그룹을 만들고 repository 에 대한 접근 권한을 설정합니다.
작성한 프로그램 소스 경로를 import 합니다.
클라이언트
repo-browser 기능을 사용해 SVN 의 내용을 확인합니다.
checkout 으로 프로그램 소스를 폴더에 복사합니다.
소스를 변경 사항 기록과 함께 서버에 commit 합니다.
버전 관리
commit 하면 파일에 revision 이 부여됩니다.
show log 로 revision 의 메세지 확인 기능
diff 로 revision 별 소스 수정 확인
지정한 revision 으로 소스 checkout
revert 기능으로 선택한 이전 revision 으로 소스 코드 변경 가능
< 서버 프로그램의 선택 >
티그리스 svn 서버
명령행 버전으로 설치후 사용자가 직접 repository 생성, 사용자 접근 권한 설정, 서비스 등록를 등록하고 사용합니다.
VisutalSVN Server
Apache 에 dav, dav_svn, ssl 모듈을 탑재하여 https:// 를 지원합니다.
repository 생성, user, group 관리를 메뉴에서 할 수 있으므로 초급자에게도 어려움이 없습니다.
개인적으로 선호합니다.
VisualSVN Server Manager 를 실행해 보시면 user, group, repository 설정하는 메뉴가 있습니다.
https 로 접근한 모습입니다.
TortoiseSVN repo-browse 로 운영중인 서버에 접근합니다.
소스를 repository 에 넣기 위한 두 가지 방법이 있습니다.
add 한후 모두 commit 합니다.
import 를 사용
* 스크린샷 : 다운받은 프로그램 소스의 압축을 풀고 svn 의 원하는 위치 아래에 넣어보겠습니다.
< VisualSVN >
아쉽게도 Visual Studio 6.0 은 지원하지 않습니다. 회사에서는 안습입니다만...
설치하면 Visual Studio 에 탑재되어 solution explorer 에서 소스 파일의 변경 상태, show changes, update, commit 을 할 수 있습니다.
작업을 하다보면 종종 추가된 파일을 커밋하지 않아서 빌드 머신에서 에러나는 상황이 있는데 (생각만 해도 쨘한 ...),
solution explorer 이랑 연동되어 추가하지 않은 파일을 쉽게 찾아 낼 수 있습니다.
30일 라이센스 제한이 아쉽습니다.
* 소스를 수정하면 녹색 아이콘이 노란색으로 바뀝니다. 폴더의 아이콘 색상도 달라지므로 쉽게 찾을 수 있어요.
-> show changes 로 수정된 부분이 무엇인지 파악할 수 있어요.
* svn 에 추가하지 않은 파일은 아이콘이 없고, Add to Subversion 눌러줍니다.
< subversion 에 대해서 아는 것과 모르는 것 >
오픈소스 무료 버전 관리 시스템
명령어를 따서 svn 이라 줄여 부름
제한적인 cvs 를 대체하기 위해 만들어졌다...고 합니다.
cvs 를 잠시 써보았다고는 하지만, 전문가는 아니니 wikipedia 의 내용을 옮겨보죠.
다른 사용자와 동시에 쓰기 작업을 시도하더라도 문제가 없다. (atomicity)
파일 이름을 바꾸거나, 삭제해도 기록을 유지한다.
binary 파일의 효율적 저장
디렉토리의 버전 관리가 가능해 옮기거나 복사할 수 있고, 기록도 유지한다.
빠르게 branching, tagging 할 수 있다.
repository 에서 필요없는 네트웍 트래픽을 줄인다.
라고 합니다.
< 티그리스 토터스 svn 서버 설정 >
VisualSVN Server 와 달리 설치 이후 모든 설정을 사용자가 직접해야 합니다.
우선 원하는 폴더로 이동하고 repository 생성 작업을 합니다.
# svnadmin create --fs-type fsfs Repository
-> berkeley db 를 사용하려면 --fs-type bdb 를 지정합니다.
사용자 접근 제어를 위해 설정 작업을 합니다.
conf/svnserve.conf
anon-access=none
-> 인증을 거치지 않는 사용자에 대한 접근 권한 없애기
auth-access=write
-> 인증을 거친 사용자에게 쓰기 권한
password-db=passwd
-> 패스워드는 passwd 에
realm=princeb612
-> 서버
conf/passwd
[users]
id=password
-> 접근 권한을 가지는 사용자 ID 와 패스워드를 설정합니다.
서비스 등록
sc 명령으로 서비스를 직접 등록합니다.
sc screate 서비스이름 binpath= "경로에 맞게 설정" displayname= "subversion" depend= Tcpip start= auto 와 같이 실행합니다. = 다음에는 공백 문자를 추가해야 합니다.
net start 서비스이름으로 서비스를 시작합ㄴ다.
sc create SubVersion binpath= "C:\svn\bin\svnserve.exe --service -r C:\WorkSpaces\Repository" displayname= "Subversion" depend= Tcpip start= auto
< official website >
프로그램들은 여기서 다운로드하세요.
서버
http://subversion.tigris.org/
http://www.visualsvn.com/server/
클라이언트
http://tortoisesvn.tigris.org/
유틸리티
http://www.visualsvn.com/



