December 17, 2008

December 02, 2008

How to sync Google address book with Mac address book

Mac OS X 10.5.3에서부터 google address book과 sync하는 기능이 추가되었습니다.
하지만, 안타깝게도 itunes로 iphone이나 ipod touch를 이용하는 사용자에 한해서만 해당 기능이 활성화 된다고 합니다.
그래도! 언제, 뜻이 있는 곳에는 길이 있다는 말처럼 해당 ipod 기기가 없는 사용자도, 약간의 plist파일 수정을 통하여서 google address book과의 sync 기능을 사용할 수 있습니다.

수정하여야 할 plist file은 ~/Library/Preferences/com.apple.iPod.plist입니다.

plist editor로 해당 file을 open한 후에, 아래와 같이 Family ID를 찾은 후,

Root
|- Devices
|- {some numbers}
|- Family ID

Family ID 값을 10001로 수정하고 plist file을 저장합니다.

이제 Address Book을 실행한 후, Preferences의 Generic에 보시면 Google과 sync하는 기능이 활성화 된 것을 보실 수 있으실 겁니다.

October 24, 2008

October 23, 2008

Natural Ordering

사람들이 일상적으로 정렬하는 형식과 가능한 비슷하게 만들어 놓은 sorting이다.
단순 sorting보다는 조금 복잡하지만, 파일을 보여줄때 prefix로 0을 넣어야 하는 것들을 피할 수 있다. 공개된 소스도 많으니, 한번쯤 어떻게 동작하는지 확인해 볼 필요가 있을듯.

검증 위주의 개발론

정확한 이름은 잘 모르겠지만, 오늘 생각해 볼 만한 개발론에 대한 얘기를 들었다.

개인적으로 검증을 통해 개발을 완성한다는 것이 그리 달갑지는 않다. 하지만, software가 복잡해 질 수록 모든 경우의 수를 사람의 머리로 100% 다 확신할 수 없기 때문에, 검증이 상당히 중요하다고 생각한다. 자신이 개발하고 있는 software에서 발생할 수 있는 case를 정확하게 한정지을 수 있다면, 개발의 신뢰도가 상당히 향상될 것이라고 생각한다. 이렇게 case를 정확하게 한정지을 수 있는 방법론이 존재한다고 한다. 관심있게 한번 공부해 볼 필요가 있을 것 같다.

October 04, 2008

Software 관련 책들

분류가 조금 애매한 책들은 일단 책에서 주로 사용한 언어로 분류한다.

C programming
- C Programming: A Modern Approach

C++ programming
- Design Pattern
- Modern C++ Design
- More Effective C++

Java programming
- Refactoring

Others
- Write Great Code, Volume 1: Understanding the Machine
- Write Great Code, Volume 2: Thinking Low-Level, Writing High-Level

September 27, 2008

C Pre-Processors

일단, 잘 알려진 아래의 Pre-Processors를 나열해 보면 아래와 같다.

#include, #define, #undef

#ifdef, #ifndef, #if, #else, #elif, #endif

아래의 두 Pre-Processors는 설명이 좀 필요하다.

1. #
Stringization으로 불린다. 먼, 사용하는 예를 보면 아래와 같다.

source
#define PRINT_DEFINITION(a, b) printf(#a " is " #b ".\n");

PRINT_DEFINITION(Love, Everything);
result
Love is Everything.
이처럼, #은 Pre-Processor에 인자로 들어온 값을 constant string으로 만들어주는 역할을 한다.

2. ##
이 Pre-Processor는 {Token Pasting | Token Concatenation | Token Merge | Merge} Operator등 다양하게 불리우는 것 같다. 어떤 이름이 정식 이름인지는 잘 모르겠다. 일단 사용 예부터 보자.

source
#define FUNC_SIZE(a) sizeof(func##a)

struct func1 {
int a;
int b;
char *c;
};

struct func2 {
char *a;
int b;
};

printf("func1 size: %d, func2 size: %d\n", FUNC_SIZE(1), FUNC_SIZE(2));

result
func1 size: 12, func2 size: 8

짧고 좋은 예가 생각이 안나서 예제가 조금 유치하다. 예에서 볼 수 있듯이, token merge operator는 Pre-Processor에서 두 글자를 하나의 인자로 이어주는 역할을 한다.

September 26, 2008

Java와 C간의 socket 통신시 주의할 사항

Java는 platform과 상관없이 무조건 big-endian으로 데이터를 처리하는 반면에 C는 platform에 따라서 big-endian과 little-endian이 달라진다.따라서 java에서 ByteBuffer의 order()함수를 이용하여 endian을 맞추든, C에서 맞추든 endian을 통일시켜야, socket 통신을 원하는 결과를 얻을 수 있다.

September 12, 2008

Firefox Shortcut Keys


CTRL+N새로운 창 열기
CTRL+R현재 page 다시 불러오기
ALT+←이전 page로 돌아가기
ALT+→다음 page로 돌아가기
ALT+HOMEHome page로 돌아가기
CTRL+k검색어 입력창으로 이동
ALT+dURL 입력창으로 이동
CTRL+ENTER입력한 URL 앞에 "http://www.", 뒤에 ".com"을 붙여준다.
CTRL+T새로운 Tab 열기
CTRL+W현재 Tab 닫기
CTRL+SHIFT+T닫은 Tab 되돌리기
CTRL+TAB다음 Tab으로 이동
CTRL+SHIFT+TAB이전 Tab으로 이동
CTRL+[0-9]1번째 Tab부터 10번째 Tab까지 바로 이동
/입력하는 글자에 해당하는 글자로 이동
'입력하는 글자에 해당하는 link로 이동
CTRL+G다음 글자 or link로 이동
CTRL+SHIFT+G이전 글자 or link로 이동

August 29, 2008

DRM Free 음악 서비스 비교 (계속 작성 중.)

DRM Free 음악 서비스를 상당히 기다려왔다. 원하는 음악을 정당한 대가를 지불하고, "내가 원하는 방식"으로 즐길 수 있기 때문에 나로써는 정말 고대하던 서비스가 아닐 수 없다. Bugs를 시작으로 해서 일단 한 달 씩 각 서비스를 이용해 보고 있다. 뭐, 처음부터 그럴 생각은 없었지만 이용하다보니 장기적으로 이용할 서비스 업체를 찾아보는게 좋겠다는 생각이 들어서 본의 아니게 비교기 까지 작성하게 됐다.

1. Bugs (2008. 07)
- Player: Active-X를 이용한 web 기반 player. 안정적.
- 음원: 가요는 대부분 DRM Free로 이용 가능. 나머지는 잘 모르겠음.
- 다운로드: 대부분의 모든 곡에 대해서 128kbps부터 320kbps까지 원하는데로 다운 가능.
- Tag: Tag정리가 제대로 되어 있지 않아서, 노래 별로 재각각임. Album Cover는 대부분 없음.

2. Dosirak (2008. 08)
- Player: Dosirak Player 프로그램. 상당히 불안함 (특히 휴대폰 연결시).
- 음원: 몇몇 원하는 음악을 찾지 못했음. 몇몇 원하던 노래가 DRM이 걸려 있음.
- 다운로드: 128kbps부터 320kbps까지 선택은 가능하나, 상당히 많은 곡들이 192kbps까지 밖에 지원하지 않음.
- Tag: Tag정리는 상당히 잘 되어 있지만, 이름을 "성 이름" 처럼 조금 이상한 기준으로 되어 있어서 나의 기준에 맞도록 약간의 정리가 필요함. Album Cover도 대부분 다 있음.

3. 멜론 (2008. 09 ~)
- Player: Melon Player 프로그램. 상당히 안정적이며, 사용이 편리함. 방화벽이 있는 곳에서 사용시 streaming이 제대로 안되는 경우 발생.
- 음원: 멜론의 가장 큰 장점으로 음원이 지금까지 알고 있기로는 가장 풍부하다. 몇몇 노래들이 DRM이 걸려 있기는 하다.
- 다운로드: Melon Player를 통해서 편하게 다운로드 받을 수 있다. 128kbps부터 320kbps까지 선택하여 다운 받을 수 있지만, 192kbps까지 밖에 지원하지 않는 곡들도 상당히 많음.
- Tag: Tag정리는 일반적인 기준에 따라서 상당히 잘 되어 있어서 따로 정리할 필요가 거의 없다. Album Cover는 거의 다 있음. 

4. 쥬크온 (미정)

July 28, 2008

July 17, 2008

double pointer

void **

이렇게 사용되는 pointer variabel을 double polinter라고 부른다. 사용하는 이유는 보통 single pointer variable에 메모리를 할당하기 위함이 일반 적이다. 예를 들어보자.

boolean func(char **ptr, int nSize)
{
if(*ptr != NULL) {
free(*ptr);
}

*ptr = (char *)malloc(sizeof(char) * nSize);

return (*ptr == NULL) ? FALSE : TRUE;
}

위와 같은 형식이 아마도 가장 일반적인 double pointer의 예일 것이다. 종종 위와 같은 기능을 single pointer를 이용하여도 상관없지 않냐는 궁금증을 갖게 되는 경우가 있다. 예를 들어보자.

boolean func(char *ptr, int nSize)
{
if(ptr != NULL) {
free(ptr);
}

ptr = (char *)malloc(sizeof(char) * nSize);

return (ptr == NULL) ? FALSE : TRUE;
}

결과는 전혀 다르다. Pointer variable은 주소를 담는 공간이다. 인자로 전달 받은 char *ptr은 callee가 전달한 주소를 담는 공간이며, local variable 임을 명심하자. 즉, ptr에 malloc을 통해 새로운 pointer를 할당하는 것은 local variable에 malloc을 통해서 새로운 주소를 할당하는 것과 동일한 것이다.

조금 다른 얘기지만, 종종 아래와 같은 오류가 있는 code를 볼 수 있다.

char doubleArray[2][3];
char **ppArray = doubleArray;

기본적인 문법 오류이지만, 실수하기 쉬운 부분이다. 첫번째의 multi-dimensional array의 경우 6개의 char variable이 연속으로 붙어 있는 형태를 가지며, 아래의 double pointer로 표현하고자 하는 multi-dimensional array의 경우, 2개의 char * variable이 연속으로 붙어 있고, 각 variable은 3개의 char variable이 연속으로 붙어 있는 영역을 가리키고 있다. 즉, 두 변 수 모두 multi-dimensional array를 표현하기 위한 의도를 가지고 정의 했지만, 실제로는 아래와 같이 다른 의미를 가지게 된다.

char doubleArray[2][3];
char **ppArray;
ppArray = (char **)malloc(sizeof(char *) * 2);
for(int i = 0; i < 2; i++) {
ppArray[i] = (char *)malloc(sizeof(char) * 3);
}

July 09, 2008

Google의 작명 센스

잘 알려진 메모리 문제인 copy constructor와 assign constructor를 Google의 open source에서는 다음과 같은 이름으로 해결하고 있다. 작명 센스가 너무 마음에 든다^^

#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)

Header file and static variable in C

보통 header file에 #ifdef를 이용해서, header file이 여러번 include되는 것을 막는다. 여기서 조금 햇깔릴 수 있는 것이. 유의할 점은 이러한 과정이 전체 project 별이 아니라, 각 source file 별로 일어난 다는 것이다. 그렇기 때문에, header file에 static global variable을 정의 하게 되면 각 source file 별로 static variable이 생기게 되기 때문에 의도했던 global variable로의 역활을 할 수 없게 된다. C에서 전체 project에서 공유하기 위한 목적으로 global variable을 만들고자 할 때는, source file에서 global variable을 정의하고, 사용하는 곳에서 extern으로 해당 variable을 참조하도록 하는 것이 올바른 방법이다.

July 02, 2008

오늘 본 가슴에 와닿는 말

누군가를 좋아한다는건 그런거에요.
잘못한게 없더라도 미안한마음.
좀 더 잘해주지 못해 아쉬워하는 마음.

June 20, 2008

가 볼만한 레스토랑 들

Paris Grill
- Hyatt Hotel

The Restaurant

Tasty BLVD
- 압구정

Ola! (1/2/3)

The Bar: dopo

The Ninth Gate
- The Westin Chosun Hotel

Table34

Paris de Gaumont

L'Espoir (레스뿌아)

Villa Sortino (빌라소르티노)
- Italian

Buon Viaggio (본 비아지오)

Serein (써레인)
- Halloween party

L'Italia Mia (리탈리아 미아)
- Italian
- ICIF 이탈리아 요리 학교

O Kitchen

LE PETIT CRU (르쁘띠크뤼)

Blooming Garden

Pierre Gagnaire a Seoul (삐에르 가니에르 서울)
- French

Grand Ciel (그랑씨엘)

a Table (아따블르)

Le Pied (르삐에)
- French

Arte
- Italian
- 서래마을

Boutique Blooming (부티크 블루밍)

Gramercy Kitchen (그래머시 키친)
- 압구정

The story in the real London
- 논현동

mi piace (미피아체)
- 청담동

June 16, 2008

원하는 위치에서 Command 창 띄우기

1. windows explorer을 연다.
2. "도구"의 "폴더 옵션"을 실행한다.
3. "파일 형식" 탭을 선택한다.
4. "폴더" 파일 형식을 선택한 후, "고급" 버튼을 누른다.
5. "새로 만들기"를 누른 후, "명령"에는 context menu에 나타날 이름을 입력하고, "명령을 실행할 응용프로그램"에는 "c:\windows\system32\cmd.exe"을 입력한다.

위와 같은 과정을 거친 후, windows explorer에서 폴더의 context menu를 펼친 후 추가한 메뉴를 선택하면, 선택한 폴더의 "부모" 폴더를 시작점으로 한 command 창이 열리게 된다.

April 08, 2008

running scratchbox under Ubuntu 8.04

Scratchbox를 Ubuntu 8.04에 설치해 보았다. 설치는 잘 진행이 되었지만, 실행시 다음과 같은 error가 발생하였다.

Inconsistency detected by ld.so: rtld.c: 1192: dl_main: Assertion ‘(void *) ph->p_vaddr == _rtld_local._dl_sysinfo_dso’

이를 해결하기 위해서는 vdso를 disable 시켜줘야 하는데, 가장 확실한 방법은 kernel recompile이다. 하지만, 귀차니즘 때문에 좀 더 간단한 방법을 찾아보았다.

echo 0 | sudo tee /proc/sys/vm/vdso_enabled

임시로, vdso를 disable시켜주는 방법이다. 부팅할 때마다 다시 해줘야 하지만, 간단하게 해결할 수 있는 방법이다.

April 07, 2008

compile vmware-tools on Ubuntu 8.04

Ubuntu 8.04가 아직 정식 release되지는 않았지만, beta버젼을 사용할 수 있어서, vmware에 설치해 보았다. 하지만, vmware-tools가 compile되지 않는 문제가 발생하여서, 몇가지 시도를 통해서 compile하는 방법을 찾아보았다.

일단 open vmware tools에서 소스를 받아서, 컴파일이 되도록 dependencies가 걸린 라이브러리를 모두 설치한다. 여기서 주의할 점은 dnet이라는 라이브러리를 찾는데, 실제로 ubuntu에서는 dumbnet이라는 이름으로 쓰이므로, dumbnet-dev 패키지를 설치하여야 한다. 또한, configuration을 통과 하더라도, dnet.h 파일을 찾을 수 없다는 error 메시지가 나오며, compile이 안되는데, 컴파일이 안되는 해당 파일을 열어서 dnet.h를 include하는 것을 dumbnet.h를 include하도록 변경해 주면, compile이 잘 진행될 것이다 (make 뿐만 아니라, make modules도 실행하여서, module의 compile에도 문제가 없는지 확인하여야 한다).

이렇게, open vmware tools의 compile의 compoile이 모두 잘 되면 open vmware tools를 대신 사용할 수 있지 않겠냐는 생각이 들겠지만, 이상하게도 open vmware tools에서는 installation script를 제공하지 않는다. mailing list를 확인해본 결과, vmware의 product에 포함되어 있는 vmware tools에 open vmware tools를 compile해서 나온 module를 붙여서 설치를 하여야 한다 (이런 삽질을 왜 시키는지 모르겠다... 이 것 때문에 전혀 이해 안되는 이후의 과정을 진행하여야 한다ㅡㅡ;)

vmware 메뉴에서 install vmware tools를 선택하여, vmware tools 파일을 복사한 후, .../vmware-tools/distrib/lib/modules/source 디렉토리를 확인한다. 해당 디렉토리 내에, module들이 tar로 묶여 있는 것을 볼 수 있을 것이다. 해당 tar파일을 풀어보면, {module}-only라는 디렉토리가 생기는데, 실제로 풀어볼 필요는 없다. open vmware tools의 .../open-vm-tools-.../modules/linux/ 디렉토리를 열어보면, 각 module의 이름으로 된 디렉토리를 확인 할 수 있을 것이다. 이 각 {module} 디렉토리를 {module}-only로 바꾸어서 tar로 묶어준다. 그리고, 이렇게 묶은 파일을 vmware tools의 module source 디렉토리에 복사하여 기존의 파일에 덮어씌워준다.

이제, 원래 하던데로, vmware tools의 설치를 진행하고, module의 compile을 진행하면 정상적으로 vmware tools의 설치가 종료될 것이다.

March 24, 2008

Human Energy

SBS에서 재미있는 다큐맨터리 하나를 방영했다. 사람의 운동 에너지를 전기 에너지로 바꿀 수 있다면, 단순히 전기료를 아끼는 것 뿐만 아니라, 사람들의 건강이 나아지고, 환경이 좋아질것이라는 내용이다. 나 역시 이런 생각을 해본적이 있지만, 이러한 생각을 본격적으로 실천에 옮기고 있는 사람들이 그렇게 많으며, 이러한 실천이 상당한 결과를 내고 있다는 것이 정말로 놀라웠다. 아버지께서 말씀하신 것 처럼 "상활과학"이 앞으로 상당히 재미있는 분야가 될 듯하다^^

February 18, 2008

C++ method to C function

Bjarne Stroustrup이 처음 C++를 개발하고, 만든 컴파일러는 C++ 코드를 C로 변환한 후, 이를 다시 C컴파일를 이용하여 기계어로 번역하는 방식이었다. 그리고 이러한 방식은 현재의 컴파일러에서도 변하지 않고 사용되고 있다.
C++의 method는 C의 function으로 다음과 같이 변환된다.

CClass::Method(TYPE parma1, TYPE parma2); // C++ method
Method(CClass *thisptr, TYPE param1, TYPE param2); // converted C function

Bjarne Stroustrup

Bjarne Stroustrup은 덴마크 사람으로 C++를 만든 사람이다.
발음은 찾아본 바로는 대략 "뷔야(른)ㅡㄴ 스트루스트럽 (r 발음은 빠른 발음 때문에 거의 묵음화)" 정도 인듯 하다 (발음 듣기).
가장 많이 사용하는 C++를 누가 만들었는지 정도는 알아두자.

Name Mangling

function, structure, class, variable의 이름이 같은 경우 생길 수 있는 문제점을 방지하기 위해서 이름과 추가적인 정보를 encoding하여 내부적으로 사용되는 이름을 생성하는 방법이다. Name Decoration이라고도 불리며, C에서는 이를 사용하지 않지만, C++에서는 이를 사용한다. 예를 들어, C++에서 polymorphism이 적용된 함수의 경우, 이름은 같지만 파라미터가 다르낟. C에서는 이러한 함수의 식별이 불가능하지만, C++에서는 Name Mangling을 이용하여, 서로다른 함수로 십결이 가능하다.

Name Mangling에는 표준이 없고, 컴파일러 나름대의 방법을 사용한다. 그러므로, 컴파일러가 동일하다면, Name Mangling을 통해서 encoding된 이름이 동일하지만, 그렇지 않을경우 이름이 동일하다는 보장을 할 수 없다 (DLL에서 extern "C"를 사용하는 이유).

January 22, 2008

Flickr Pro Account

사진을 많이 찍으면 찍을 수록 걱정되는 것이 바로, 사진의 보관이다. 하드 디스크에 보관하고, 외장 하드디스크에 백업도 하지만, 불안한건 사실이다. 그래서, 웹상에 보관하는 방법을 찾던 차에 Flick Pro를 발견하였다. 물론, 100%안전한 방법은 아니지만, Yahoo!에서 하는 서비스인 만큼 상당히 믿을만 하다는게 나의 생각. 거기다가 $24.95에 무제한 이용이 가능하다 (한달 upload는 2G로 제한). 이 정도면 앞으로 꾸준히 이용할 만한 서비스 일 것으로 생각된다.

결국 사고 말았다...^^;;

지보면

경상북도 예천군 지보면.

질 좋은 한우를 저렴하게 판다고 한다. 조금 멀기는 하지만, 언젠가 가봐야 할곳!!

다시 - 박노해

희망찬 사람은
그 자신이 희망이다

길 찾는 사람은
그 자신이 새 길이다

참 좋은 사람은
그 자신이 이미 좋은 세상이다

사람 속에 들어있다
사람에서 시작된다

다시
사람만이 희망이다

__stdcall & __cdecl

WINDEF.H
CALLBACK = WINAPI = PASCAL = __stdcall
WINAPIV = __cdecl
위에서 알 수 있듯이, MS Windows의 calling convetion은 __stdcall과 __cdecl로 나뉜다.

이렇게 calling convetion을 둘로 나눈 이유는 함수 호출 후, stack pointer (sp)를 누가 원래데로 돌려놓을지 (정리할지)를 분간하기 위함이다. 결론 부터 애기하자면, __stdcall을 이요하면, callee측에서 sp를 정리하고, __cdecl을 이용하면, caller측에서 sp를 정리한다.

예를 들어보자.
SimpleFunction(TYPE arg1, TYPE arg2, TYPE arg3) { … }

SimpleFunction(…);
__cdecl의 경우, assembly code는 대략 다음과 같이 구성된다.
push arg3
push arg2
push arg1
call SimpleFunction
Add sp, 12

반면 __stdcall의 경우는 대락 다음과 같이 구성된다.
push arg3
push arg2
push arg1
call SimpleFunction

Assembly code를 보면 알 수 있듯이, __cdecl은 함수가 return된 이후에, caller가 직접 sp를 정리하고, __stdcall은 callee측에서 정리를 해주기 때문에, caller 쪽에서는 함수가 return된 이후에 sp 정리 작업을 하지 않는다.

sp의 정리를 어느 쪽에서 하든, 차이가 없어보이지만 두가지 정도 차이가 생길 수 있다.
먼저, 속도와 관련된 문제이다. 8086 계열의 assembly 명령어 중, 이라는 명령어가 있다. 이 명령어는 함수가 종료된 후, sp를 얼마만큼 add할지를 하나의 명령어로 만든것이다. __stdcall에서는 바로 이 명령어를 이용하여, 의 operation time만큼을 절약할 수 있으며, 그만큼 프로그램 사이즈도 줄일 수 있다 (물론, 한 단위로 보면 그 효과가 미비하지만, 그 수가 많아질 경우 어느정도 차이가 생길 수 있다).
다음으로, 가변 arguments의 지원 여부이다. __cdecl을 이용하면, caller측에서 sp를 정리하기 때문에, 가변 arguments를 지원할 수 있다.

사실, 몇가지 차이점이 더 있는 듯 하지만, 지금까지 파악된 부분은 이 두가지이다.

void *

c language의 powerful함을 잘 보여준다. void *는 모든 개체를 가리킬 수 있기 때문에 상속 관계에서 이 후에 어떤 데이터를 다룰지 예상할 수 없는 경우 유용하다. 상속받은 class에서는 void *에 할당된 개체가 무었인지를 알기 때문에 그에 맞게 적절히 casting하여 사용하면 된다.

소매물도

소매물도는 우리나라에서 가장 아름다운 섬 중의 하나라고 한다.
기회가 되면 꼭 가보고 싶다.

Glyph

Text Editor와 관련된 코딩 중에 Glyph라는 term을 보았다. 대충 무슨 뜻인지 유추가 가능하였지만, 좀 더 자세한 뜻을 알기 위해서 검색을 해 보았다.

다음은 네이버 백과사전에 나온 Glyph (글리프)의 정의이다.

정보 기술에서 문자의 모양이나 형태를 나타내는 그래픽 기호. 부호화한 문자를 그림으로 나타낸 영문자나 숫자의 폰트 또는 기타 기호를 말한다. 문자는 뜻이나 소리가 있으나 글리프는 본래의 뜻이 없고 형태로 식별한다. 글리프를 사용하여 문자를 표시할 수 있다.

Constructor & Destructor

c++에서 하나의 class를 상속 받은 class의 constructor는 묵시적으로 상위 class의 constructor를 호출하지 않는다. 그러므로, 상위 class의 constructor에서 구현된 부분을 사용하고 싶을 경우에는, 명시적으로 상위 class의 constructor를 호출하여야 한다.
반면, destructor는 묵시적으로 호출이 된다. 상속 받은 destructor를 정의 하지 않았다고 하더라도, 상위 class의 destructor를 차례로 호출하기 때문에, 명시적으로 상위 class의 destructor를 호출할 필요가 없다.
이유는...

Lazy Evaluation

프로그램의 초기 구동속도를 높이기 위한 기법으로 lazy evaluation이 언급되어서, 한번 찾아보았다.

lazy evaluation (delayed evaluation) 기능의 수행을 해당 기능이 정말로 필요할 때 까지 미뤄두는 프로그래밍 기법이다. lazy evaluation을 통해 얻을 수 있는 이점은 다음과 같다:

1. 지금 당장 필요 없는 기능의 수행을 하지않음으로 얻어지는 성능 향상
2. 복잡한 expressions의 평가를 피할 수 있음
3. the ability to construct infinite data structures
4. the ability to define control structures as regular functions rather than built-in primitives

lazy evaluation을 사용하는 언어는 evaluation strategy에 따라 call-by-name과 call-by-need로 나뉘어진다. Haskell과 같이 가장 현실적인 lazy languages는 성능 상의 이유로 call-by-need 를 사용하지만, 간편함을 위해 lazy evalution의 이론적인 표현이 call-by-name을 이용하기도 한다.

lazy evaluation의 반대 기법은 eager evaluation (strict evaluation)이다.

Reference: http://en.wikipedia.org/wiki/Lazy_evaluation

몇가지 관련된 자료를 찾아본 바로는, eager evaluation 우리가 일반적으로 사용하는 방식이라고 보면 하다. 예를 들어보자.

int nResult = 10 + 9 - 12 * (3 / 4 + 5)
print nResult
print nReault * 9

위의 예에서 nResult 들어가 값이 eager evaluation에서는 직접 변수에 저장되지만, lazy evaluation에서는 수식이 저장되는 하다. 그래서 실제로 해당 값을 출력할 때와 같이 해당 수식이 계 산 되어야 할 때, 계산이 수행되는 식인 것 같다. 그리고, lazy evaluation은 대부분 functional programming language와 같은 언어에서 주로 사용되는 것 같다. 아직 직접 사용해 보지 않아서 잘은 모르지만, 몇몇 경우 (초기 구동속도를 빠르게 해야 하는 경우)에는 유용하게 사용될 듯 하다.

하카다 분코

오늘 우연히 알게된 일본식 라면 집이다. 아직 가보지는 않았지만, 잠시 검색해본 결과 좀 독특하고 맛이 있을 것 같다. 솔직히 약간 매니악 스러워 보이기도 했다. 좀 더 자세한 것은 후에 직접 방문해 보고 적겠다.

하카다 분코 - 홍대에 위치한 돈코츠 라면집

위치: 상수역 2번 출구(극동방송 방면)으로 나와서 홍대 정문 쪽으로 5분 정도 내려온다. 감나무집이라는 분식집과 맞은 편에 꿀벌 상회라는 집이 보이고 정면에 극동방송국이라는 간판이 보이면, 붉음 벽돌담을 끼고 우측으로 돌아서 일방 통행길로 약 50~60미터 정도 들어가면 된다.

평안도집 (장충동 족발)

장충동 족발이 유명하다는 얘기는 많이 들어왔다. 사실, 집에서도 그리 먼 것도 아니고, 지나다니면서 본 적도 있다. 하지만, 얼마 전에서야 처음 가보게 되었다. 검색을 해본 결과, 평안도집이라는 곳이 상당히 유명한 듯 하여서, 그 곳으로 향했다. 지하철 3호선 동대입구역 3번 출구로 나와서, 약 50미터 직진 후, 오른쪽 골목에 있는 가게 이다. 약간 구석진 곳에 있어서 유심히 봐야 한다.
일단 중요한 족발 맛 부터 얘기하자면, 맛있다. 동네에서 시켜먹던 족발보다 훨씬 껍질이 쫄깃 쫄깃 하다. 한방 족발처럼 여러가지 재료가 들어간 맛이라기 보다는 족발 본연의 맛이 잘 살아있는 것 같다. 반찬으로 나온 부추 무침, 부침개, 무, 등도 맛이 좋았다 (특히, 부추무침이 맛있었다). 장소는 여느 오래되고 맛있는 집이 그렇듯이 깔끔보다는 정결이라는 말이 더 잘 어울리는 곳이었다.
무엇보다 인상 깊었던 것은 주인 아주머님이었다. 자세한 얘기를 하기는 그렇지만, 정말로 친절하셨다. 족발을 하나 싸갔는데, 맛있게 먹어줘서 고맙다며 좋아하는 부위를 더 싸주시기도 했다. 아마, 앞으로도 종종 찾아가게 될것 같다.

Programming Tips

  • state 항상 유지하자.
  • unsigned int는 절대로 0이하의 값이 대응되지 않는다는 확신이 있을 때 만 사용하자.
  • single thread 이용하는 경우, watch dog timer 이용하는 경우가 많다. 상황에서는 operation time watch dog timer scheduled time 넘지 않도록 유의해야 한다. 그렇지 않을 경우, 시스템이 없는 이유로 freeze되는 경우가 생기게 된다.
  • continuing…

SELinux에서 ftpd사용

오랜만에 RedHat 계열의 리눅스를 설치해볼 기회가 생겼다. ftp 서버가 원하는 데로 동작하지 않아서 찾아본 결과, SELinux때문이었다.

SELinux 사용하는 경우, ftp daemon에서 아래와 같은 error 출력하는 경우가 있다.

500 OOOPS: cannot change directory …

경우, 아래와 같이 SELinux policy 변경하면 해결이 된다.

> su -
> getsebool -a | grep ftp
> setsebool -P ftp_home_dir on
> getsebool -a | grep ftp

소스 파일에서 원하는 부분 검색

grep -i {string to find} --include {files to include} -R {target directories}

e.g. grep -i “my comment” --include “*.[chCH]” -R “./”

iTunes Library 복구

만약 iTunes Library 그대로 체로 iTunes 삭제 했다면, 조금은 특별한 방법으로 iTunes Library 복구 하여야 한다.

- 기존의 iTunes 라이브러리 폴더의 이름을 바꾸거나 다른 장소에 옮겨 놓는다.

- 새로운 iTunes를 설치한다.

- iTunes Library.itl파일의 내용을 모두 지워서 0Bytes로 만든다.

- 기존의 iTunes 라이브러리 폴더 내의 iTunes Music Library.xml파일을 수정한다.

- - Location부분에서 …에 해당하는 파일구조를 자신이 원하는 폴더로 수정한다.

- iTunes를 실행한다.

- 수정한 iTunes Music Library.xml 파일을 import한다.

- iTunes Library가 잘못 되어서 수정했다는 메시지가 보인다.

- 기존의 모든 음악과 rating등이 모두 복구 된 것이 보일 것이다.

간단한 gdb 명령어

run {arguments} 실행

break {소스 파일:n} 소스 파일의 n번째 라인에 breakpoint 설정한다

info break breakpoint 대한 정보 열람

delete {N} N번째 breakpoint 제거

help {command} command 대한 도움말을 열람

step 현재 라인을 실행하고, 다음 실행 가능한 라인으로 이동

next 현재 라인을 실행 (현재 라인에 함수가 포함되어 있을 경우 해당 함수를 실행하고 다음 라인으로 이동)

finish 현재의 함수가 끝날때 까지 next 계속

continue 다음 breakpoint까지 실행

file {파일 이름} 파일을 reload

where backtrace 열람

print {변수} 변수의 값을 출력

quit 종료

MindManger

마인드 맵 은 여러 곳을 통해서 추천을 받았다. 대부분이 그렇듯, 정말로 사용하기 전에는 마인드 맵의 이점에 대해서 잘 인식하지 못하고 있었다. 맥을 사용하면서 OmniOutliner를 통해 outliner의 이점을 체감하면서, 마인드 맵에 관심을 갖고 있던 차에 좋은 맥용 마인드 맵 소프트웨어를 발견했다.
가격은 $129로 저렴하지 않아서, 일단 평가 판을 사용중이다. 결론부터 얘기하자면, 아마도 조만간 구매할 것 같다. 정말로 깔끔한 디자인과, 좋은 사용자 편의성 등 잠깐씩 사용하다 말게 되었던 여러 마인드 맵 소프트웨어들에 비해서 정말로 outstanding!!이라고 외칠만 하다.
여타 맥용 소프트웨어가 그렇듯, 직관적으로 만들어진 UI 덕분에 사용법이라는 걸 별로 설명할 필요가 없다. 기본적인 마인드 맵이 무엇인지를 안다면, 너무나도 편안하게 생각을 정리할 수 있다.