목록work/fundamental (26)
no swim no life
-로서: 지위나 신분, 자격을 나타내는 조사. 그는 책임자'로서' 맡은일에 최선을 다했다. -로써: 어떤 물건이나 재료, 원료, 수단이나 도구를 나타내는 조사. 글로써든, 말로써든 우리는 굳은 신념과 용기로써
분해(Decomposition) - 문제를 Task들로 분해 한다. 시작은 어디에 병렬성이 있는지 찾아보는 것이다. 모든 것은 경우에 따라 다르다. 조정(Scaling) - Task 관리에 대한 부담을 최소화하고, 프로세서들이 모두 가동되도록 한다. 스레드(Threads) - 스레드와 프로세스 사이의 가장 중요한 차이점은 프로세스 안에 있는 스레드들은 그 프로세스에 대한 모든 데이터를 공유한다는 것이다. - C++ 라이브러리에 있는 C 상속 함수 중에 asctime, ctime, gmtime, localtime, rand, strtok와 같음 함수들은 호출 사이에 내부 상태를 보유한다. 이들을 사용할 땐 스레드 안정성이 있는 버전을 확인하길 바란다. STL의 컨테이너 클래스는 일반적으로 스레드 안정성이 ..
다음 링크를 통해 TBB 설치를 위한 메뉴얼 팩과 Stable release를 얻을 수 있다. ref: http://www.threadingbuildingblocks.org/ 책은 다음과 같이 TBB를 소개하고 있다. TBB는 조정성(확장&축소)이 있는 데이터 병렬 프로그래밍을 지향한다. 원초적 쓰레드(Posix thread)와 MPI(Message Passing Interface)는 가장 낮은 수준에서 병렬처리를 구현한다. 따라서 높은 유연성을 주지만, 프로그래머의 노려그 디버깅 시간 및 유지보수 면에서 많은 비용이 필요하다. TBB를 이용하여 논리적 쓰레드 대신 태스크를 사용할 경우의 또 다른 이점은 태스크가 훨씬 가볍다는 점이다. 태스크를 시작하고 종료시키는 시간은 쓰레드의 그것보다 리눅스 시스템에..
코딩 중 macro 만으로 처리 하기에 아쉬운 부분이 있다. 이 때 inline의 이용을 생각해 볼 수 있는데, inline을 그대로 사용하려 하면서 아차~ 싶은 부분이 선언한 inline 함수의 scope이다. 그래서 확인해 본 결과... static 선언과 상관없이 해당 파일 내에서 inline 함수의 기능은 동일하지만, static에 의한 scope 제한이 없다면 다른 파일에서 호출 가능한 일반 함수가 추가(추가인지, inline 선언이 배제된 것인지 확인이 필요)로 생성된다. 아마도 이런 상황을 노리고 inline 선언을 하지는 않을 것이라 예상하기 때문에, 이것은 대부분 기대하지 않은 코드일 것이다. 그리고, 정의한 inline 함수와 동일한 일반 함수가 생성된 경우, (또는 inline 기능이..
1970년 1월 1일 자정 UTC 이후 경과된 시간을 나타내는 POSIX 시간 표기법은 당연히 unsigned 라고 생각하고 있던 어느 날... 코드를 보니 signed네? signed가 된 이유는 단순이 표준화 시의 실수 란다... 답이없다. ㅋㅋ 관련 문제로 2038년 표기 문제를 확인 할 수 있다. ref : http://ko.wikipedia.org/wiki/2038%EB%85%84_%EB%AC%B8%EC%A0%9C 현재 time_t는 64bit로 이전 중이란다. VS2005 이상은 64bit type이 기본으로 잡히는군...
HMAC-MD5 key_len = 16 data_len = 20 digest_len = 16 HMAC-SHA-1 key_len = 20 data_len = 20 digest_len = 20
가독성이 높은 고정폭 글꼴 한글 + 영문 글꼴 1. 나눔고딕코딩 : http://dev.naver.com/projects/nanumfont - 글자폭이 좁아서 잘 사용 않함 2. BitstreamVeraSansMono + 맑은고딕 영문 글꼴 3. Consolas : http://www.microsoft.com/downloads/details.aspx?FamilyID=22e69ae4-7e40-4807-8a86-b3d36fab68d3&DisplayLang=en - 11 size로 사용함 4. dejavusansmono-limdp99 5. DroidSansMono Visual Studio 에서는 2번, Source Insight 에서는 5번을 사용
하위 디렉토리 내 모든 문자열 바꾸기 find . -exec perl -pi -e 's///g' {} \; 2>/dev/null 특정 문자 찾기 find . -exec grep -i -l "" {} \; 2>/dev/null 하위 디렉토리 내 모든 파일 찾기 find . | xargs grep "" 시간 동기화 rdate -s time.bora.net 프로세스 상태 ps -u 원하는 라인(배수) 출력 line_prt.awk { for ( i = 0 ; ; i++ ) { if ( (i % 4) == 0 ) print $0 if ( getline == 0) break; } } # awk -f line_prt.awk USB 마운트 # dmesg (장치이름 확인 sda1 등...) # mount /dev/sda..
논리적인 명령문 테이블에 입력된 데이터는 논리적인 명령문(코드로 작성된 데이터)보다 유지 보수하기 쉽다. 직접 접근 방식 데이터 자체를 참조 키로 사용 간단하고 빠름 참조 키 조작 데이터를 키 값으로 사용할 수 있도록 수정 월별일수, 보험료 테이블 등 인덱스 접근 방식 어떤 값을 테이블의 키 값으로 직접 쓰기 어려운 경우 메인 테이블을 유지하고, 이를 참조하는 인덱스 테이블을 구성 검색 속도의 이점 메인 테이블에 있는 각 엔트리들의 크기가 크다면, 인덱스 테이블을 이용하여 공간을 줄일 수 있음 인덱스 사용으로 공간적인 이익을 얻을 수 없더라도, 메인 테이블에 있는 엔트리보다 인덱스에 있는 엔트리를 다루는 것이 더 간단 단계적 접근 방식 인덱스 방식처럼 간접적 접근 불규칙적인 값으로 테이블 인덱스를 만들기..
여러 곳에서 리턴하는 루틴 return, exit 문은 프로그램이 원하는 순간에 루틴으로 부터 빠져나갈 수 있는 제어 구조 보다 읽기 쉬운 코드를 만들기 위해서 return을 사용 어떤 루틴에서 답을 알고 있을 때 정리작업 후 곧바로 호출 루틴으로 리턴 복잡한 오류 처리를 단순화하기 위해서 보호절을 사용 정상적인 작업을 수행하기 전에 많은 오류 조건들을 검사해야 하는 코드 재귀적 용법 재귀적 용법에서는 한 루틴이 문제의 작은 부분을 해결하고 그 문제를 더 작은 부분으로 나눈 다음, 더 작은 부분의 각각을 해결하기 위해서 자신을 호출 작은 문제의 그룹인 경우에는 간단하고 훌륭한 해결책이 될 수 있다 재귀적 용법의 예 미로 해결 재귀 호출 사용 팁 재귀 호출이 중단되는지 확인 무한 재귀 호출을 막기 위해서 ..
루프 제어 루프에 영향을 미치는 요소의 수를 최소화 될 수 있는 한 제어 부분을 루프의 밖에 입력하고, 루프 내에서 실행되어야 하는 조건들을 분명히 한다. 루프 진입 한 위치에서만 진입한다. 루프가 시작되기 바로 전에 초기화 코드를 입력한다. 무한 루프는 while ( true )를 사용한다. 루프 처리 루프에 있는 명력문들을 둘러싸기 위해서 { 과 }을 사용한다. 빈 루프를 피한다. 루프에서 보조 관리 작업들(housekeeping)은 루프의 시작이나 끝에 놓는다. 루프가 하나의 기능만 수행하도록 한다. 루프 종료 종료되는지 확인한다. 종료 조건을 명확하게 한다. 루프를 종료하기 위해서 for 루프의 인덱스를 조작하지 않는다. 루프 인덱스의 마지막 값에 의존하는 코드를 피한다. while 루프에서 bo..
14: 직선형 코드 구성하기 의존성이 분명한 코드 구성 의존성을 분명히 하기 위해서 루틴 매개변수를 사용 의존성이 분명하지 않은 부분은 주석으로 문서화 15: 조건문 사용 정상적인 경우를 else가 아니라 if 문 다음에 입력 4개 이상의 조건에 대해 CASE 사용
read, write와 기본적으로 동일하나, 다수의 버퍼의 데이터를 한번에 출력/기록 할 수 있다. Prototype int writev( int fd, struct iovec iov[], int iovcount ); int readv( int fd, struct iovec iov[], int iovcount ); struct iovec { caddr_t iov_base; // 버퍼의 시작 포인터 int lov_len; // 버퍼의 바이트 사이즈 } struct iovec iov[3]; iov[0].iov_base = buf1; iov[0].iov_len = strlen(buf1); iov[1].iov_base = buf2; iov[1].iov_len = strlen(buf2); iov[2].iov_ba..
ref. Advence Linux System Network Programming fork 부모(parent)와 자식(child) 프로세스로 분기. fork로 프로세스가 복제될 때 자식 프로세스가 상속받는 것들은 메모리 영역과 파일 기술자, 시그널 마스크 등과 같은 정적인 자원들이다. wait/waitpid로 자식 프로세스의 리턴값을 확인 할 수 있다. fork의 리턴값 0 : 자식 프로세스에게 리턴 0 > : 부모 프로세스에게 리턴되며, 자식 프로세스의 PID 부모 프로세스 ..
매개변수(parameter) Prototype에 표시된 변수 리스트 int open( int A, char B ); 인수(argument) 함수 호출 시 사용하는 실제 입력 값 ret = open( 12, 'a' );
__STRICT_ANSI__ : ANSI C 규격으로 작동 (-ansi) _ISOC99_SOURCE : C99 표준을 지원 (-std=c99) _POSIX_SOURCE : POSIX 표준을 의미, == 1 : _POSIX_SOURCE >= 2 : _POSIX_SOURCE + IEEE std 1003.2 >= 199309L : IEEE std 1003.1a-1993 >= 199506L : IEEE std 1003.1b-1995 >= 200112L : IEEE std 1003.1-2001 _XOPEN_SOURCE : POSIX와 XPG 4.2(SUSv1) 표준 지원 < 500 == 500 : SUSv2(UNIX98) == 600 : SUSv3(SUS2002) _XOPEN_SOURCE_EXTENDED : X/..
구조체 데이터 관계를 이해하기 쉽게 하기 위해서 구조체를 사용 포인터 메모리 상의 위치 (32bit) 메모리의 내용을 해석하는 방법 (type) 포인터 오류의 빠른 발견이 중요 포인터를 선언과 동시에 정의 포인터를 할당된 곳과 같은 영역 내에서 삭제 dog-tag 필드의 사용 start-bit와 end-bit를 사용할 수 있으며 dog-tag는 포인터 영역의 상태를 표시 여분의 포인터 변수를 사용 포인터 연산을 단순화시킴으로써 발생하는 성능 향상 연결 리스트나 서로 다른 깊이의 포인터들을 올바른 순서로 삭제 경우에 따라 임시 메모리를 유지하여 메모리 부족시에 이용 중요한 데이터는 메모리를 해제하기 전에 쓰레기 데이터(0xcc)로 덮는다. wapping function 사용 메모리를 삭제하거나 해제한 다음..
명명된 상수 매직 넘버(magic number)를 피한다. 매직 넘버는 100이나 47524와 같이 아무런 설명도 없이 프로그램 한가운데 나타나는 리터널 숫자이다. (문자열도 마찬가지) named constant를 이용하며, 필요하다면 1, 0은 그냥 사용한다. 정수 곱셈으로 인한 정수 오버플로우에 주의한다. 아래는 정수의 표현범위 이다. 정수형 범위 부호 있는 8비트 -128 ~ 127 부호 없는 8비트 0 ~ 255 부호 있는 16비트 -32,768 ~ 32,767 부호 없는 16비트 0 ~ 65,535 부호 있는 32비트 -2,147,483,648 ~ 2,147,483,647 부호 없는 32비트 0 ~ 4,294,967,295 부호 있는 64비트 -9,223,372,036,854,775,808 ~ ..
문제 지향성(Problem Orientation) 기억하기 쉬운 이름은 일반적으로 해결책보다 문제에 대해서 말한다. 좋은 이름은 "어떻게" 보다 "무엇"을 표현하는 경향이 있다. 일반적으로 이름이 문제보다 해결 과정의 어떤 측면을 가리키고 있다면, 이는 "무엇" 보다는 "어떻게"에 대한 것이다. 문제 자체를 가리키는 이름을 사용하도록 한다. 변수 이름의 일반적인 반의어들 begin/end first/last locked/unlocked min/max next/previous old/new opened/closed visible/invisible source/target source/destination up/down 전형적인 불린 변수의 이름 done 무언가 수행되었다는 것을 가리키기 위해서 done을 ..
원문: http://msdn.microsoft.com/ko-kr/library/9s7c9wdw(VS.80).aspx 컴파일러 옵션 범주별 목록 다음은 범주별로 나열한 포괄적인 컴파일러 옵션 목록입니다. 최적화 옵션 용도 /O1 작은 코드를 만듭니다. /O2 빠른 코드를 만듭니다. /Ob 인라인 확장을 제어합니다. /Od 최적화를 사용하지 않습니다. /Og 전역 최적화를 사용합니다. /Oi 내장 함수를 생성합니다. /Os 코드 크기를 우선으로 합니다. /Ot 코드 속도를 우선으로 합니다. /Ox 최대 최적화(/Ob1gity /Gs)를 사용합니다. /Oy 프레임 포인터를 생략합니다. x86 전용입니다. 코드 생성 옵션 용도 /arch 코드 생성 시 SSE 또는 SSE2 명령을 사용합니다. x86 전용입니다...
데이터 사용 능력 테스트 친숙한 용어 옆에 1점을, 알지만 확신할 수 없다면 0.5점을 입력한다. ___ 추상 데이터 형 ___ 배열 ___ 비트맵 ___ 불린 변수 ___ B-트리 ___ 문자 변수 ___ 컨테이너 클래스 ___ 배 정도 ___ 연장 스트림 ___ 열거 형 ___ 부동소수점 ___ 힙 ___ 인덱스 ___ 정수 ___ 연결 리스트 ___ 명명된 상수(named constant) ___ 리터럴(literal) ___ 지역 변수 ___ 참조 테이블 ___ 멤버 테이터 ___ 포인터 ___ private ___ 소급 시냅스(retroactive synapse) ___ 참조 무결성 ___ 스택 ___ 문자열 ___ 구조적 변수 ___ 트리 ___ typedef ___ union ___ 값 체인..
게으름 재미없는 작업을 다시 수행할 필요가 없도록 툴을 작성하는 것 지적인 정직함 전문가가 아님에도 전문가인 것처럼 행동하지 않는 것 실수를 기꺼이 인정하는 것 오류 메시지를 막기보다는 컴파일러 경고를 이해하기 위해서 노력하는 것 작동하는지 확인해 보기 위해서 컴파일을 하기보다는 프로그램을 명백하게 이해하는 것 현실적인 일정표를 제공하고 관리자가 일정을 조절할 수 있는지 물었을 때 자신의 입장을 지키는 것 어떤 바보라도 자신의 실수에 대해서 정당성을 주장할 수 있으며 대부분의 바보들이 그렇게 한다.
저는 주석이 책의 표제나 목차와 같기를 바랍니다. 주석은 올바른 섹션을 찾는 데 도움을 주며, 그 다음부터 코드를 읽기 시작합니다. 프로그래밍 언어로 작성된 20줄의 코드를 읽는 것보다는 영어로 작성된 한 문장을 읽는 것이 훨씬 빠릅니다. .... 마치 당신들은 한 번도 다른 사람이 작성한 코드를 수정해야 했던 적이 없었던 것처럼 들리는군요. 저는 제가 바꿔야 하는 두 줄짜리 코드를 찾기 위해서 엄청나게 집중해서 수 백 줄의 코드를 읽을 필요는 없다고 생각합니다.
한 줄에 지나치게 많은 연산을 수행 strcpy( char * t, char * s ) { while ( *++t = *++s ); } strcpy( char * t, char * s ) { do { ++t; ++s; *t = *s; } while ( *t != '\0' ); } t 와 s 는 *s 가 *t 에 복사되기 전에 증가, 첫 번째 문자가 빠진다. 5,000,000 문자열을 복사할 때 첫 번째 버전은 4.81초, 두 번째 버전은 4.35초가 걸렸다. 이 경우에서는 "머리를 굴린" 버전이 11% 정도 속도가 느렸으며, 결국 쓸데없이 머리를 굴린 꼴이 되었다.
변수의 종류 전역변수 정적변수(static) 자동변수(지역변수, 매개변수) 외부변수(extern) 저장공간의 종류 코드영역 데이터영역: 전역변수, 정적변수, 초기화된 배열과 구초제 힙영역: malloc(), new 동적메모리할당, 포인터 스택영역: 자동변수, 복귀번지, 배열, 포인터변수 extern 전역변수는 프로젝트 내의 동일한 메모리 공간을 사용한다. extern으로 declaration 해야 되는곳에 값을 넣게 되면 definition이 되어 링크 에러가 발생할 수 있다. file_a.c int test = 3; file_b.c extern int test; // declaration extern int test = 3; // definition 전역변수는 각각의 오브젝트 파일마다 메모리 공간을할당..