Objective-C 공부중

본격적으로 iPhone 어플리케이션을 개발해 보려고, 기초가 되는 Objective-C 언어를 공부중입니다. 컴파일러팀에서 일하다보면 다양한 언어를 접하게 되는데 이녀석도 만만찮게 독특한 개성을 지니고 있는 듯 합니다. 특히나 Smalltalk에서 가져온 복수의 파라메터를 가지는 메서드의 정의 및 호출 방식은 굉장히 독특하네요.


Objective-C를 공부하면서 본격적으로 Xcode를 사용하고 있습니다. vi 에디터 기능을 쓸 수 없다는 것을 빼고는 훌륭합니다! 화면에 노란 줄이 Warning 메세지 입니다. 소스코드에 바로 Error, Warning을 표시해 주네요. 블로그에 공부한 지식을 정리할 수 있는 수준히 되도록 틈틈히 부지런히 공부해야겠습니다.

Caps Lock키를 Ctrl키로 활용하기

저는 주로 해피해킹프로2 키보드를 사용합니다. 이 키보드는 일반 키보드와 키 배열이 조금 다른데, Caps Lock키 자리에 Control키가 위치하고 있습니다. 일반 키보드에 왼손을 가만히 가져다 놓으면 아래에 위치한 Ctrl키보다 가운데 위치한 큼직한 Caps Lock키를 새끼 손가락으로 누르는 것이 훨씬 편하다는 것을 알 수 있습니다. 해피해킹 키보드를 사용하면서 습관이 되서 그런지 저는 일반 키보드에서도 Caps Lock키를 Ctrl키로 바꿔서 사용하곤 합니다. 실제로 훨씬 편하기도 하구요. 각 운영체제 별로 그 요령을 알아보도록 하겠습니다.

System Preferences > Keyboard & Mouse에 가셔서 Keyboard 탭의 아래쪽을 보시면 Modifier Keys… 버튼이 있습니다. 이걸 누르시면 Caps Lock, Control, Option, Command Key에 대한 키매핑을 수정할 수 있습니다.  Caps Lock을 Control로 매핑해 주시면 설정이 완료됩니다!

리눅스

일회성 방법
쉘에 다음 내용을 입력하세요.

xmodmap -e ‘keycode 66 = Control_L’
xmodmap -e ‘clear Lock’
xmodmap -e ‘add Control = Control_L’

xmodmap -e ‘keycode 117 = Caps_Lock’
xmodmap -e ‘add Lock = Caps_Lock

영구적인 방법
~/.Xmodmap에 다음 내용을 추가하세요.

keycode 66 = Control_L
clear Lock
add Control = Control_L
keycode 117 = Caps_Lock
add Lock = Caps_Lock

참고: http://efod.se/writings/linuxbook/html/caps-lock-to-ctrl.html

윈도우

첨부파일을 열어보시면 2개의 레지스트리 파일이 있습니다. 하나는 Caps Lock키를 Control키로 매핑하고 다른 하나는 원래 상태로 돌려 놓습니다. 실행시키고 재부팅 하시면 설정이 완료됩니다.

494f28e2de5e2CJ.zip

viPlugin for Eclipse

Eclipse 에디터에서 vi의 기능을 사용할 수 있는 플러그인을 소개합니다.

http://www.satokar.com/viplugin/

이 플러그인은 15유로를 주고 구입해야 합니다. 저는 그나마 환율이 상식적이였던 시기에 구입했습니다. 꾸준히 업데이트 되고 있어 믿을만 하고, Help > Software Updates에서 손쉽게 설치 및 업데이트를 할 수 있습니다.

Mac OSX 환경에서 Eclipse에 이 플러그인을 설치해보니 CommandMode 창에 글씨가 보이지 않아서, 홈페이지에 어줍잖은 영어 실력으로 문제를 호소했더니, 몇일 후에 패치가 올라왔습니다! 사용자를 위한 세심한 배려에 감동했죠.

오랜기간 사용해 본 소감을 말씀드리면 부족함을 느끼지 못할 정도로 vi가 제공하는 대부분의 기능을 사용할 수 있습니다. 최근에는 Eclipse + CDT + viPlugin을 사용하여 파싱 기반의 정확한 assist를 받으면서 vi의 기능을 활용하여 작업을 수행하고 있습니다.

알루미늄 아이맥(iMac) 24인치

맥미니, 맥북, 아이맥 사이에서 방황하다 결국 미친척 하고 아이맥 24인치를 구입해 버렸습니다! 회사에 들어온 이후로 제 자신에게 가장 큰 선물이 되겠네요. ^^; 다소 성급한 구매였지만 몇일 사용해본 결과 매우 만족스럽습니다. 


작년에 맥북을 사용했던 전력이 있기 때문에 mac osx에 금방 익숙해 질 수 있었습니다. mac osx의 사용자 인터페이스가 워낙 훌륭하기 때문이기도 하겠죠. 넓고 선명한 화면도 훌륭하지만, 가장 만족스러운 부분은 소음이 거의 없다는 것입니다. 얼마전에 처분한 조립PC는 정말 시끄러웠거든요! 컴퓨터로 음악을 듣는게 바보스럽게 느껴질 정도로…

Objective-C 공부 후에, mac 어플리케이션 혹은 iPhone/iPod Touch 어플리케이션을 개발해보려고 합니다. 어느정도 진행이 되면 블로그에 관련 글을 쓸 수 있겠죠. ^^

Call stack을 깨는 버그의 해결

decNumber Library(http://speleotrove.com/decimal/)를 사용하는 코드에서 Call stack을 깨먹는 버그가 발생하여 지난 일주일동안 마음이 편치 않았는데, 결국 해결했습니다! 워낙 사소한 실수에서 비롯된 일이라 부끄럽기 그지 없지만, 유사한 버그로 머리를 쥐어뜯고 있을 누군가에게 도움이 될지도 모른다는 바램을 가지고 용기를 내어 보겠습니다!

Call stack을 깨는 코드는 다음과 같습니다.

이 함수가 호출되면 sementation fault가 발생하면서 프로그램이 죽는 현상이 발생했습니다. gdb에서 bt를 실행해보니 call stack이 깨졌다는 사실을 알 수 있었습니다. 곰곰히 생각해보니 로컬변수에 값을 쓰다가 activation record의 return address 영역을 엎어 쓰는 것 같더라구요. 이를 확인하기 위해 left 변수 앞에 임의로 char buf[100]; 변수 선언을 넣었더니 call stack이 깨지는 현상은 사라졌습니다.

decNumber 라이브러리를 사용하여 실제 계산을 수행하는 코드는 다음과 같습니다.

여기서 눈여겨 보아야 할 것은 DECNUMDIGITS라는 상수(constant)입니다. 항상 decNumber를 사용해 계산을 수행하기 위해서는 decContext를 설정해서 전달해 주어야 하는데 이때 DECNUMDIGITS을 참조하게 되죠. 이 값을 별도로 설정하지 않으면 decNumber.h에서 1로 설정하기 때문에 정상적인 연산을 수행할 수 없습니다.

따라서 decNumber로 표현 및 계산하고자하는 최대 자리수를 #define으로 미리 지정해 주어야 합니다.  문제는 여기에 있었습니다. decNumber를 사용하여 계산하는 함수를 따로 분리하는 과정에서 decNumber.h를 include 하는 문장 뒤에 #define DECNUMDIGITS를 포함하는 헤더파일의 include 문장이 존재하게 되었던거죠! 결과적으로 decNumber.h가 확장될때는 DECNUMDIGITS가 기본값인 1로 결정되고, 제가 작성한 코드에서는 프로젝트 전역 헤더파일에서 정의한 값(30)이 참조되었습니다. 변수와 정의와 변수의 참조 사이에 괴리(?)가 발생했던 겁니다. 

decNumber.h를 살펴보면 문제는 좀 더 명확해 집니다.

decNumber.h를 include하는 문장 앞에 DECNUMDIGITS을 정의한 프로젝트 전역 헤더파일을 include하도록 수정함으로써 문제는 간단히 해결되었습니다. 대부분의 버그가 비슷하겠지만, 문제를 찾아서 해결하고 나니 참으로 허무한 기분이 들었습니다. 한동안 제 자신이 미워지더군요. ^^;

이번 경험을 통해 얻은 교훈은 다음과 같습니다.

1. macro 사용에 유의하자.
2. 헤더파일의 include 순서에 유의하자.
3. call stack을 깨는 경우는 문자열을 비롯한 array의 잘못된 사용 및 참조로 발생하는 경우가 많다.