January 22, 2008
Flickr Pro Account
결국 사고 말았다...^^;;
__stdcall & __cdecl
CALLBACK = WINAPI = PASCAL = __stdcall위에서 알 수 있듯이, MS Windows의 calling convetion은 __stdcall과 __cdecl로 나뉜다.
WINAPIV = __cdecl
이렇게 calling convetion을 둘로 나눈 이유는 함수 호출 후, stack pointer (sp)를 누가 원래데로 돌려놓을지 (정리할지)를 분간하기 위함이다. 결론 부터 애기하자면, __stdcall을 이요하면, callee측에서 sp를 정리하고, __cdecl을 이용하면, caller측에서 sp를 정리한다.
예를 들어보자.
SimpleFunction(TYPE arg1, TYPE arg2, TYPE arg3) { … }__cdecl의 경우, assembly code는 대략 다음과 같이 구성된다.
SimpleFunction(…);
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 명령어 중,
다음으로, 가변 arguments의 지원 여부이다. __cdecl을 이용하면, caller측에서 sp를 정리하기 때문에, 가변 arguments를 지원할 수 있다.
사실, 몇가지 차이점이 더 있는 듯 하지만, 지금까지 파악된 부분은 이 두가지이다.
void *
Glyph
다음은 네이버 백과사전에 나온 Glyph (글리프)의 정의이다.
정보 기술에서 문자의 모양이나 형태를 나타내는 그래픽 기호. 부호화한 문자를 그림으로 나타낸 영문자나 숫자의 폰트 또는 기타 기호를 말한다. 문자는 뜻이나 소리가 있으나 글리프는 본래의 뜻이 없고 형태로 식별한다. 글리프를 사용하여 문자를 표시할 수 있다.
Constructor & Destructor
반면, 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 primitiveslazy 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이 우리가 일반적으로 사용하는 방식이라고 보면 될 듯 하다. 예를 들어보자.
위의 예에서 nResult에 들어가 값이 eager evaluation에서는 직접 변수에 저장되지만, lazy evaluation에서는 수식이 저장되는 듯 하다. 그래서 실제로 해당 값을 출력할 때와 같이 해당 수식이 계 산 되어야 할 때, 계산이 수행되는 식인 것 같다. 그리고, lazy evaluation은 대부분 functional programming language와 같은 언어에서 주로 사용되는 것 같다. 아직 직접 사용해 보지 않아서 잘은 모르지만, 몇몇 경우 (초기 구동속도를 빠르게 해야 하는 경우)에는 유용하게 사용될 듯 하다.int nResult = 10 + 9 - 12 * (3 / 4 + 5)
print nResult
print nReault * 9
하카다 분코
오늘 우연히 알게된 일본식 라면 집이다. 아직 가보지는 않았지만, 잠시 검색해본 결과 좀 독특하고 맛이 있을 것 같다. 솔직히 약간 매니악 스러워 보이기도 했다. 좀 더 자세한 것은 후에 직접 방문해 보고 적겠다.
하카다 분코 - 홍대에 위치한 돈코츠 라면집
위치: 상수역 2번 출구(극동방송 방면)으로 나와서 홍대 정문 쪽으로 5분 정도 내려온다. 감나무집이라는 분식집과 맞은 편에 꿀벌 상회라는 집이 보이고 정면에 극동방송국이라는 간판이 보이면, 붉음 벽돌담을 끼고 우측으로 돌아서 일방 통행길로 약 50~60미터 정도 들어가면 된다.
평안도집 (장충동 족발)
일단 중요한 족발 맛 부터 얘기하자면, 맛있다. 동네에서 시켜먹던 족발보다 훨씬 껍질이 쫄깃 쫄깃 하다. 한방 족발처럼 여러가지 재료가 들어간 맛이라기 보다는 족발 본연의 맛이 잘 살아있는 것 같다. 반찬으로 나온 부추 무침, 부침개, 무, 등도 맛이 좋았다 (특히, 부추무침이 맛있었다). 장소는 여느 오래되고 맛있는 집이 그렇듯이 깔끔보다는 정결이라는 말이 더 잘 어울리는 곳이었다.
무엇보다 인상 깊었던 것은 주인 아주머님이었다. 자세한 얘기를 하기는 그렇지만, 정말로 친절하셨다. 족발을 하나 싸갔는데, 맛있게 먹어줘서 고맙다며 좋아하는 부위를 더 싸주시기도 했다. 아마, 앞으로도 종종 찾아가게 될것 같다.
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
소스 파일에서 원하는 부분 검색
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파일을 수정한다.
- -
- iTunes를 실행한다.
- 수정한 iTunes Music Library.xml 파일을 import한다.
- iTunes Library가 잘못 되어서 수정했다는 메시지가 보인다.
- 기존의 모든 음악과 rating등이 모두 복구 된 것이 보일 것이다.
간단한 gdb 명령어
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 덕분에 사용법이라는 걸 별로 설명할 필요가 없다. 기본적인 마인드 맵이 무엇인지를 안다면, 너무나도 편안하게 생각을 정리할 수 있다.