find the number of cores on a machine

numCPU = sysconf( _SC_NPROCESSORS_ONLN );

via c++ – Programmatically find the number of cores on a machine – Stack Overflow.

내가 정말 싫어하는 코딩 스타일

  • macro 남발
  • macro 내에서 해당 macro를 호출한 함수에서 정의한 변수 혹은 전역를 마구 접근. 그리고 인자로 받지 않은 레이블로 마구 점프

Sphinx – create documentation

//bitbucket.org/birkenfeld/sphinx/

via Overview — Sphinx 1.1.2 documentation.

Installation

tar xvzf Jinja2-2.6.tar.gz
cd Jinja2-2.6
python setup.py build
python setup.py install --prefix=/user/cychong/local

tar xvzf Pygments-1.4.tar.gz
cd Pygments-1.4
python setup.py build
python setup.py install --prefix=/user/cychong/local

tar xvzf Sphinx-1.1.2.tar.gz
cd Sphinx-1.1.2
python setup.py build
python setup.py install --prefix=/user/cychong/local

Tutorial
http://matplotlib.sourceforge.net/sampledoc/

http://www.ibm.com/developerworks/library/os-sphinx-documentation/

Syntax

http://sphinx.pocoo.org/rest.html
http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html

한글 인코딩

source/conf.py 파일에서 encoding과 language 지정

source_encoding = 'utf-8-sig'
language = 'ko'

Doxygen 연계해서 사용하기
* http://michaeljones.github.com/breathe/ 설치
* Doxyfile에 XML 생성 옵션 켜기

GENERATE_XML = YES

* conf.py에 정보 추가 – extension

extensions = ['sphinx.ext.pngmath', 'sphinx.ext.todo', 'breathe']

* conf.py에 doxygen의 정보 추가

breathe_projects = {
    "nutshell":"../examples/specific/nutshell/xml/",
    }

* Doxygen의 결과물을 이용하려면 다음 keyword를 사용할 것.

.. doxygenindex::
.. doxygenfunction::
.. doxygenstruct::
.. doxygenenum::
.. doxygentypedef::
.. doxygenclass::

function_A의 정의를 이용하려면 다음과 같이 rst 파일에 기술(참고)

.. doxygenfunction::function_A


하나 이상의 Doxygen 결과 이용하기

만일 하나 이상의 doxygen project를 이용해서 문서를 생성하는 경우 source/conf.py의 breathe_projects에 다음과 같이 설정한다.

breathe_projects = { 
    "Project A":  "/user/cychong/source_dir_1/xml", 
    "Project B":  "/user/cychong/source_dir_2/xml" 
}

그리고 rst 파일에서 default project가 아닌 다른 project의 심볼을 참조하는 경우 다음과 같이 project 정보를 명시한다.

.. doxygenfunction:: function_from_project_A
   :project: Project A
.. doxygendefine:: macro_from_project_B
   :project: Project B</code>

Best practices for programming in C

http://www.ibm.com/developerworks/aix/library/au-hook_duttaC.html

1. 함수 이름 checkSize()보다는 validSize()가 낫다. 전자는 return type이 모호하다.
2. if 문에서 상수를 왼쪽에 두면 할당 연산자를 비교 연산자 대신 사용하는 경우를 사전에 막을 수 있다.(컴파일 에러). -> 근데 요즘 컴파일러는 이 정도는 알아서 경고를 낸다.
3. 함수의 결과를 직접 if에 사용할 때는 반드시 비교문을 사용하라. if (f() != FAIL)이 if (f()) 보다 훨씬 명시적이다.

리눅스 커널 코딩 스타일

http://namhyung.springnote.com/pages/858738

적지 않은 시간을 개발 업무에 투자했지만 아직도 일관성을 못 가지고 있는 듯하다 -_-;;;

그 일관성에 조금 도움이 될 만한 내용들만 발췌하면

1. 괄호로 둘러싸인 식 (내부) 에서는 공백 문자를 사용하지 않는다.
2. 가능하면 typedef를 사용하지 말 것.
3. 하나의 함수는 가능한 하나 혹은 두 페이지 내에서 한 가지 일 만 잘 해내야 한다.
4. goto는 다음과 같은 장점이 있다.
– 무조건 점프 명령은 이해하고 따라가기 쉽다
– 중첩된 작업이 감소된다
– 함수 변경 시 개별적인 종료 지점에 대한 갱신을 하지 않아 생길 수 있는 에러를 방지한다
– 중복된 코드를 최적화 해야 하는 컴파일러의 작업을 줄여준다
5. Macro 내에서는 return이나 goto를 사용하지 않는다. 흐름을 이해하는데 독이 된다.
6. 4줄 이상의 코드를 포함하는 함수에는 inline 키워드를 사용하지 않는다.
7. 명령형 함수(add_work) 의 경우 성공 여부는 0(실패) 그 외(성공)으로 사용하고, 서술형 함수(is_valid_work)의 경우은 0(성공) 그 외는 -Exxx로 리턴 값을 정의한다.