libconfig

홈페이지1: http://www.hyperrealm.com/libconfig/
홈페이지2: https://github.com/evoskuil/libconfig

libconfig – C/C++ Configuration File Library

INI 포맷보다 진보된 계층 구조의 형태의 포맷을 가지는 Configuration 파일 Reader/Writer 라이브러리

Libconfig is a simple library for processing structured configuration files, like this one: test.cfg. This file format is more compact and more readable than XML. And unlike XML, it is type-aware, so it is not necessary to do string parsing in application code.

Libconfig is very compact — a fraction of the size of the expat XML parser library. This makes it well-suited for memory-constrained systems like handheld devices.

The library includes bindings for both the C and C++ languages. It works on POSIX-compliant UNIX systems (GNU/Linux, Mac OS X, Solaris, FreeBSD) and Windows (2000, XP and later).

#----------------------------
# Example Configuration File
#---------------------------
#

application:
{

 /* This section defines some settings for our
  * main application window, such as size and
  * position.
  */

  window:
  {
    title = "My Application";
    size = { /* width */ w = 640; /* height */ h = 480; };
    pos = { x = 350; y = 250; };
  };

  a = 5;
  b = 6;
  ff = 1E6;
  test-comment = "/* hello\n \"there\"*/";

  test-long-string = "A very long string that spans multiple lines. "
  /* but wait, there's more... */ "Adjacent strings are automatically"
  " concatenated.";

  test-escaped-string = "\"This is\n a test.\"";

  group1:
  {
    x = 5;  y = 10;
    my_array = [ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 ];
    flag = TRUE;

    group2: { zzz = "this is a test"; };

    states = [	"CT", // Connecticut
		"CA", // California
		"TX", // Texas
		"NV", // Nevada
		"FL"  // Florida
    ];
  };

  /* this would cause an error */
  // a = "hi!";
};

binary = [ 0xAA, 0xBB, 0xCC ];

list = ( ( "abc", 123, true ), 1.234, ( /* an empty list */ ) ,[ 1, 2, 3 ],
	   { a = (1, 2, true); } );

books = ( "inventory",
          { title  = "Treasure Island";
            author = "Robert Louis Stevenson";
            price  = 29.99;
            qty    = 5; },
          { title  = "Snow Crash";
            author = "Neal Stephenson";
            price  = 9.99;
            qty    = 8; },
          { } );

# miscellaneous stuff

misc:
{
  port = 5000;
  pi = 3.14159265;
  enabled = FALSE;
  mask = 0xAABBCCDD;
  unicode = "STARGΛ̊TE SG-1"; // UTF-8 string
  bigint = 9223372036854775807L;
  bighex = 0x1122334455667788L;
};


### eof

다운로드: libconfig-1.4.9.tar.gz
Static 빌드 수정된 버전 다운로드: libconfig-1.4.9.zip

GNU GPL과 LGPL의 차이점

아래의 글은 어디선가 copy 해놓은것인데.. 기억이 나질 않는다.. ㅠ

GNU는 GPL과 LGPL로 구분됩니다.
GNU는 그 내용 자체가 상당히 복잡하고 방대하기에 별도로 문서를 읽어보실 것을 권해드립니다.
큰 차이점만 말씀드리자면
 
<GPL>
- 라이브러리/프로그램 모두 적용
- GPL을 가진 프로그램(라이브러리)을 포함해서 제작된 프로그램 역시 GPL을 준수해야 함
- GPL의 원시 코드를 사용한다는 것은 GPL에 동의한 것으로 간주됨
- 프로그램의 원시코드+목적코드가 반드시 함께 공개되어야 함,
  목적코드만 배포할 경우 원시코드를 반드시 인터넷으로 배포하고 다운받을 수 있도록 해야함.
- 반드시 무료로 배포되어야 하며, 배포를 위해 소요되는 금액을 청구하는 것은 가능.
 
<LPGL>
- 라이브러리에만 적용
- 독점 프로그램에 사용 가능하지만, 반드시 GPL의 준수항목을 지켜야 함.
- 개작한 프로그램 역시 LPGL을 무조건 따라야 함
- 프로그램이 라이브러리와 함께 배포시 정적/공유든 상관없이 최초 라이브러리로부터 파생된 2차 저작물로 간주됨
 
<공통>
- 원시 코드의 무료 배포 및 공개를 원칙으로 함
- 배포시 피양도자에게 모든 코드에 대한 권한이 양도됨
- 라이센스를 반드시 명시하며 허가서를 반드시 포함해야 함
- 원시 코드를 개작하는 경우에도 라이센스는 유효
 
 
복잡하지요?
정리하자면 상용 프로그램에서는 절대 GPL의 소스를 가져다 쓰실 수 없습니다.
상용 어플에서 GPL소스를 가져다 쓰시려면 모든 소스를 공개하셔야 하며 무료로 배포하셔야 합니다.
상용 프로그램에서 LGPL을 따르는 라이브러리는 가져다 쓰실 수 있으나 이 역시 어디어디 소스를 가져다 썼다~~라고
반드시 명시하셔야 하며 엔드유저가 다운받을 수 있도록 링크를 명시하셔야 합니다.
LGPL의 경우 라이브러리를 수정했다한들 이거 내가 더 좋게 수정했어 라이센스는 따르지 않아도 된다~~가 아니라
개작할 경우에도 반드시 LGPL입니다. LGPL은 라이브러리에만 국한됩니다.
즉 LGPL을 따르는 라이브러리 사용시 프로그램은 LGPL이 되지 않으며 전체 소스에 대한 공개 의무 역시 없습니다.

Msys2

난 자칭 MinGW 골수팬이다. ㅎ
MinGW와 함께 최고의 조합으로 여겨지는 msys가 msys2 로 업그레이드 되었다.
이제 더욱 쾌적하게 개발을 할수 있게 되었다.
msys2는 cygwin의 기능들이 대부분 이식이 되었고..
Arch 리눅스의 패키지관리 시스템(pacman)이 (우분투의 apt-get과 같은..) 이식 되었다.

msys2 설치

msys2 다운로드 받기: http://sourceforge.net/projects/msys2/files/Base/

현재 20140910 버전이 최신이다. 셋업 파일을 받아도 되나.. 난 tar.xz 파일을 받은후
c:\msys64 에 압축을 풀었다.
아무래도 셋업 파일보단 포터블 버전을 선호한다.
압축 해제후에 msys2_shell.bat 를 실행하면 msys2 환경이 초기 설정이 되고..

1

완료된후 다시 msys2_shell.bat 를 실행시켜주면 깔끔한 msys2 화면을 볼수 있다.

터미널 에뮬레이터 셋팅

msys2는 기본적으로 putty를 포팅한 msys에 최적화된 mintty를 터미널 에뮬레이터로 사용하고 있다.
다음 적절히 mintty를 셋팅 한다. 사용해보니 msys2의 mintty는 한글도 지원이 충실하다.

난 폰트를 나눔고딕코딩이나 Fixedsys 폰트를 좋아하는데
나눔고딕코딩 폰트는 아래에서 다운로드한 후 mintty 에서 셋팅한다.

나눔고딕코딩: http://dev.naver.com/projects/nanumfont/

2

커서 모양도 셋팅하고.. 투명 스타일도 지정하고.. Locale (C), Character set (eucKR) 도 지정한다.
아래는 셋팅후 화면이다. 아주 그럴싸하다.. 리눅스 환경이 부럽지 않다. ㅎㅎ

3

이제 터미널 셋팅이 그럭저럭 된것 같다.

패키지 데이타 베이스 동기화 및 msys2 업그레이드

msys2는 Arch 리눅스의 pacman을 도입하였다.

우선 패키지 데이타 베이스를 동기화 및 msys2를 업그레이드를 한다.

% pacman -Syu

6

만약 msys2 업그레이드시에.. 아래의 에러를 본다면.. 이럴땐 다시 msys2를 실행해주면 된다.
7

다음 지원되는 패키지 목록을 본다.

% pacman -Sl

5

다음 개발시 필요한 패키지를 설치한다. 이정도면 되지 않을까..

% pacman -S wget vim swig mc pkg-config subversion python2 git curl tar binutils autoconf make libtool automake mingw-w64-i686-gcc mingw-w64-x86_64-gcc

의존성도 검사해서 자동 설치해준다.. 이 얼마나 감격스러운가..
8

참고로 gcc는 각 arch 별로 아래에 설치가 된다.
mingw32: mingw-w64-i686-gcc
mingw64: mingw-w64-x86_64-gcc

9

참고로 mingw32_shell.bat를 실행하면 mingw32 폴더의 mingw-w64-i686-gcc를 사용하며,
12
mingw64_shell.bat를 실행하면 mingw64 폴더의 mingw-w64-x86_64-gcc를 사용한다.
13

또한 mingw32_shell.bat와 mingw64_shell.bat를 동시에 실행할수도 있다.
(기존 msys 에서는 동시에 사용이 안됐었다..)

필요 없는 패키지 삭제는 다음과 같이한다.

% pacman -R <package_name>

기타 편의 셋팅

1. .bashrc 셋팅

% vim ~/.bashrc

case "$MSYSTEM" in
        MINGW32)
                export TERMINFO=/mingw32/share/terminfo
                ;;
        MINGW64)
                export TERMINFO=/mingw64/share/terminfo
                ;;
esac

alias ls='ls -hF --color=tty'
alias dir='ls --color=auto --format=vertical'
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
export PS1="\[\e]0;$(gcc -dumpmachine) $(gcc -dumpversion) : \w\a\]\n\[$(tput bold)\]\[$(tput setaf 1)\][\[$(tput setaf 3)\]\u\[$(tput setaf 2)\]@\[$(tput setaf 4)\]\h \[$(tput setaf 5)\]\W\[$(tput setaf 1)\]]\[$(tput setaf 7)\]\\$ \[$(tput sgr0)\]"

아래와 같이 취향대로 셋팅.
15

2. fstab 설정

% vim /etc/fstab

아래와 같이 자주 사용되는 윈도우즈 폴더를 링크한다.
11
저장후 msys2를 다시 실행하면 C:\Works 폴더를 /works 폴더로 접근할 수 있다.

또한 fstab 기능과 상관 없는 기능인데..
기본적으로 msys2 (msys도 마찬가지..) 에서는 윈도우즈 드라이브를 아래와 같이 접근가능하다.

# C:\Windows
$ ls /c/Windows

# D:\Works
$ ls /d/Works

3. .vimrc 설정

vim 기본 설정은 아무것도 안되어 있으므로..
syntax highlight 켜주고.. 백업 파일 안생기게 해주고..

$ vim ~/.vimrc

syntax on
set nobackup

비디오 메모리에 직접 접근…

예전 도스 시절에는 직접메모리 억세스가 가능했던 이유는 당시에는 멀티태스킹이란 개념이 없었고 다른 프로세스란 존재하지 않았기 때문에 현재의 프로그램이 모든 자원을 사용했기 때문에 가능했다.

도스가 아닌 Windows XP 같은 마이크로 커널 기반 운영체제에서는 물리적인 주소는 실제 OS차원에서 관리를 하는데,

여러 프로세스를 동시에 수행해야 하기 때문에 일어 날수 밖에 없는 메모리의 충돌을 방지코자 OS에서는 가상 메모리 개념을 도입해서 메모리 관리를 해주고 있고, 물리 주소는 직접적으로 유저로부터의 접근을 막고 있음. (다른 하드웨어 장치는 가능할수도 있으나, 비디오 메모리같은 공통의 자원 같은경우는 특히나 더더욱 접근 금지.)

특히 속도문제로 비디오 메모리를 직접 접근한다는 SDL이나 Direct Draw에서도 surface 주소를 얻어와 그 곳에 데이타를 쓰는 동작을 한후 한번에 비디오 메모리를 전송함.

어쨌든 유저가 비디오 메모리에 직접 접근해서 점을 찍는다거나 하는 일은 현재의 OS에서는 있을수 없음.

Git 사용법 정리

Git-logo.svg

SVN은 간편하고 개념이 상당히 쉬웠는데..
git로 오니.. 복잡시럽다.. 이런 복잡스러움을 거북이git가 해소해줄줄 알았는데..
차라리 콘솔 모드로 하는게 더 자연스럽고.. 파워풀하다..

git를 사용하기위한 방법을 조금씩.. 실제 테스트 해보면서 정리해본다..

git 클라이언트
msysgit: http://msysgit.github.io/
git-windows-mintty: https://github.com/rpavlik/git-windows-mintty

SSH key 등록
Git Bash를 실행후에.. 아래를 실행해서 키를 생성.

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/ihmin/.ssh/id_rsa):

이제 /c/Users/ihmin/.ssh 폴더에 id_rsa, id_rsa.pub 파일이 생성됨.
생성된 id_rsa.pub 파일을 편집기로 열어서 문자열을 전체 복사한후..
github나 gitlab에 등록하면 끝.

addsshkey

프로젝트 clone

$ git clone git://xxx.git
$ ls
xxx

Git 설정

# New 라인 문자 그대로 유지
$ git config core.autocrlf false 
# 컬러 표시
$ git config color.ui true
# Writing objects: 100% 이후 hang 되는 문제 수정
$ git config sendpack.sideband false
# 이름 설정
git config user.name "Rupert Monkey"
# 이메일 설정
git config user.email rupert@example.com

Ignore 파일 지정하기

$ cat .gitignore
*.[oa]
*~

.gitignore Example

# a comment - 이 줄은 무시한다.
# 확장자가 .a인 파일 무시
*.a
# 윗 줄에서 확장자가 .a인 파일은 무시하게 했지만 lib.a는 무시하지 않는다.
!lib.a
# 루트 디렉토리에 있는 TODO파일은 무시하고 subdir/TODO처럼 하위디렉토리에 있는 파일은 무시하지 않는다.
/TODO
# build/ 디렉토리에 있는 모든 파일은 무시한다.
build/
# doc/notes.txt 같은 파일은 무시하고 doc/server/arch.txt같은 파일은 무시하지 않는다.
doc/*.txt
# doc 디렉토리 아래의 모든 .txt 파일을 무시한다.
doc/**/*.txt

Index에 파일 추가하기

# 파일 하나 추가하기
$ git add test.txt

# 전체 파일 및 하위 폴더들 추가하기
$ git add .

# 특정 파일 추가 취소
$ git reset test.txt

# 전체 파일 추가 취소
$ git reset

HEAD에 수정된 코드 반영하기

# commit 하기
$ git commit -am "some bug fix."
[master 9f0132f] ddddddddddd
 1 file changed, 9 insertions(+)

HEAD 상태로 되돌리기 ??

# test.txt를 HEAD(이전 commit) 상태로 되돌리기
$ git checkout -- test.txt

저장소로 반영하기

# push 하기
$ git push origin master
# 아래와 같이 push 하면 다음부터는 git push 만으로 original master에 push해줌.
$ git push -u origin master
# 진행 상태 표시
$ git push --progress origin master

저장소로부터 최신 코드로 업데이트

$ git pull origin master

특정 폴더만 checkout 받기

$ mkdir xxx
$ cd xxx
$ git init
$ git remote add -f origin http://git.xxx.git
$ git config core.sparsecheckout true
$ echo processwizard/release/ >> .git/info/sparse-checkout
$ git pull origin master

태그(Tag)

# tag 붙이기
$ git tag -a v2.0-rev1 -m "Ver 2.0 Rev.1"

# tag 목록
$ git tag
v2.0-rev1

# 마지막 tag 이름 보기
$ git describe --tags
v2.0-rev2

# 특정 tag 가리키는 commit id 보기
$ git rev-parse v2.0-rev1 
51b366c13f565453c9462bea86490d6770347430

# tag push
$ git push --tags

# tag 지우기
$ git tag -d v2.0-rev1

# 원격지 tag 지우기
$ git push origin :tags/v2.0-rev1

# 특정 tag checkout
$ git clone --branch v2.0-rev1 http://git.xxx.git

삭제된 파일 복구

# 테스트로 파일 삭제함..
$ rm -f processwizard/build.bat
$ rm -f processwizard/clean.bat

# 삭제된 파일 목록 확인
$ git ls-files -d
processwizard/build.bat
processwizard/clean.bat

# 삭제된 파일중 하나만 복구
$ git checkout processwizard/build.bat

# 삭제된 파일 전체 복구
$ git ls-files -d | xargs git checkout --

CGAL Build on MinGW

MinGW상에서 CGAL 빌드 방법.

1) download boost sources and compile it (I use boost 1.47.0):

a) generate b2.exe (jam) by typing in a console "bootstrap.bat mingw" 
  b) type in a console: b2.exe --prefix=<absolute_path_to_boost64> 
toolset=gcc address-model=64 variant=debug,release link=static,shared 
threading=multi install 
Before, I tried an external version of boost-jam like described here: 
http://sourceforge.net/apps/trac/mingw-w64/wiki/Building%20Boost
but bjam.exe failed to build boost.

2) build CGAL libraries (I use cgal 3.9):

  a) Use cmake-gui 
  b) before configuring, setup the BOOST_ROOT path variable to you BOOST 
directory. 
  c) optional (this doesn't work for me): setup the Boost_LIBRARYDIR to 
your boost\lib dir 
  d) configure 
  e) optional: check demos and examples and configure again 
  f) generate 
  g) type in a console mingw32-make 
  h) if you have troubles with emmintrin.h and intrin.h, you must add a 
"#include <windows.h>" at the top of the file "all_files.cpp" in the 
src/ImageIO directory generated by cmake 

혹시.. double.h 파일에서 에러가 나면 다음을 추가.

#if defined ( _MSC_VER )
#define CGAL_ALIGN_16  __declspec(align(16))
#elif defined( __GNU__ ) || defined( __MINGW32__ )
#define  CGAL_ALIGN_16 __attribute__((aligned(16))) 
#endif


#ifdef CGAL_USE_SSE2_FABS   
inline double sse2fabs(double a)
{
  static CGAL_ALIGN_16 const union{

3) build demos and examples (if checked in cmake):

 - type mingw32-make demos 
for me, it doesn't link with boost (even with the 2)c) option), so demos 
generation failed. I didn't try examples, but I manualy compile an 
example: circulator 
I used those commands: 
g++ -c circulator_prog1.cpp -frounding-math -I../../include 
-I../../build/include 
-I../../../../boost_1_47_0/mingw64/include/boost-1_47 -o circulator_prog1.o 
g++ circulator_prog1.o -L../../build/lib -lCGAL 
-L../../../../boost_1_47_0/mingw64/lib -lboost_thread-mgw44-mt-1_47 -o 
circulator_prog1.exe 
where /build is the build folder "where to build binaries" for cmake. 

TinyOAL

홈페이지: http://code.google.com/p/tinyoal/

A minimalist OpenAL Soft audio engine for C/C++ and .net

다중 채널도 지원되는 OpenAL의 Minimalist 셋 오디오 엔진.
MinGW 에서 되겠지?..

Features
volume, pitch, and panning
loop points
resource management
maximum instance counts
WAV, OGG, MP3, and FLAC decoder support
file-based streaming or in-memory streaming
conversion to WAV
filetype detection
.net wrapper for managed languages

C에서 iconv를 이용한 인코딩 변환

아래는 Euc-Kr을 Utf-8로 변환하는 예제.

#ifndef _UTF8TOEUCKR
#define _UTF8TOEUCKR

#include 
static int UTF8toEUCKR( char *outBuf, int outLength, char *inBuf, int inLength )
{
iconv_t cd = iconv_open( "EUC-KR", "UTF-8" );

int ires = (int)iconv( cd, &inBuf, (size_t*)&inLength, &outBuf, (size_t*)&outLength );

iconv_close(cd);

return ires;
}

#endif

Mini-XML

홈페이지: http://www.msweet.org/projects.php?Z3

다른 라이브러리에 의존적이지 않은 읽기/쓰기가 가능한 작은 XML 파서 라이브러리.
일단 API도 왠만한건 다 지원하는것 같음. MinGW에서 테스트 해보니 굿.

Mini-XML is a small XML library that you can use to read and write XML and XML-like data files in your application without requiring large non-standard libraries. Mini-XML only requires an ANSI C compatible compiler (GCC works, as do most vendors’ ANSI C compilers) and a ‘make’ program.

Mini-XML supports reading of UTF-8 and UTF-16 and writing of UTF-8 encoded XML files and strings. Data is stored in a linked-list tree structure, preserving the XML data hierarchy, and arbitrary element names, attributes, and attribute values are supported with no preset limits, just available memory.

다운로드: mxml-2.8.tar.gz