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 덕분에 사용법이라는 걸 별로 설명할 필요가 없다. 기본적인 마인드 맵이 무엇인지를 안다면, 너무나도 편안하게 생각을 정리할 수 있다.