어제 (토요일), 양재 AT센터에서 개발자를 대상으로 한 NHN의 공개 컨퍼런스, NHN DeView 2008이 있었습니다.
nFORGE
여러 주제에 대한 발표들이 있었지만, 가장 중요한 것은 아무래도 nFORGE를 중심으로 한 사내에서 만들어 진 소프트웨어들의 오픈 소스화가 아닌가 싶네요.
제가 일하는 팀의 동료 분들이 만든 소프트웨어인 sysmon과 dist도 이번 오픈 소스 프로젝트 공개 대상이어서 부스에서 수고하시는 동료 분들을 응원하기 위해서 오후에 잠시 들렀습니다. 여러 분들이 관심을 가지고 진지하게 질문하는 모습을 보면서 기분이 참 좋았습니다.
대규모 장비 운영에 좀 경험이 있는 분이면, SNMP와 RRD 기반의 Cacti와 같은 도구들은 한번 쯤 보셨겠죠. 요즘은 Nagios, Munin, Ganglia 등이 많이 얘기가 되고 있죠. 이런 도구들을 사용해 보고, 정말로 사용하기 편리한가, 필요한 정보를 좋은 방법으로 보여 주고 있는가, 대규모의 장비를 모니터링 할 수 있는가라는 질문을 해보면, 분명 부족한 점들이 있습니다. 팀에서 사용하는 장비만도 수백 대~수천 대에 이르기 때문에 이러한 소프트웨어에 대한 필요성이 더욱 절실했었죠. 그러한 배경에서 팀 내 개발자 분들의 노력으로 외부에 내놓아도 좋을 만한 결과물인 sysmon과 dist와 같은 소프트웨어들이 나왔고, 현재는 사내의 여러 팀에서도 사용하기 시작했습니다.
많은 장비를 운영하시는 분들이 한번 쯤 관심을 기울여야 할 소프트웨어라고 생각합니다.
‘웹 환경과 한글’ 발표 그리고 개발자용 한글 폰트 제작
Deview 컨퍼런스에 들른 김에 발표도 하나 듣고 왔는데, 김승언 실장님의 ‘웹 환경과 한글’이라는 발표였습니다.
보통 사람들이 잘 알기 힘든, 굴림체의 기원, 폰트의 분류 (비트맵/벡터 폰트, 포스트 스크립트/트루 타입/오픈 타입 폰트), 폰트의 안티알리아싱, 클리어타입, 매뉴얼 힌팅과 같은 얘기를 들을 수 있었습니다.
얼마 전 NHN에서 공개했던 나눔 글꼴에 관한 얘기도 있었는데, 나눔 글꼴 작업에서 뭉침 현상을 해결하기 위해서 문자 하나하나 마다 힌팅 정보를 추가하는 매뉴얼 힌팅 작업에 비용이 많이 들었다는 사실이 흥미로웠습니다.
앞으로 제목 서체 (2009), 스크립트용 서체 (2010), 중제목용 서체 (2011)도 제작 및 공개할 예정이라고 하네요.
가장 즐거웠던 소식은 바로 개발자용 폰트 개발이었습니다.
개발자용 폰트는 특성상 고정 폭 (모노 스페이스) 폰트여야 하는데요. Windows에서 제공하는 예쁘지도 않은 고정폭 한글 폰트 이외에 개발자들이 사용할 수 있는 고정 폭 폰트는 거의 없다시피 합니다. 개발자용 폰트기 때문에 문자의 구분이 확실히 눈에 띄도록 하는 데에도 신경을 많이 쓰고, 한글 뿐만 아니라 영어, 중국어, 일본어를 지원할 거라고 합니다.
집에서는 Windows Vista를 사용하기 때문에, 터미널 작업을 할 때는 보통 PuTTY를 사용한다.
Lucida Console이나 Consolas 폰트 (Consolas Font Pack)를 좋아하기 때문에, PuTTY에서도 보통 Lucida Console이나 Consolas로 설정해서 사용하는데, 문제는 한글이 나오지 않는 것이었다. 그래서, 간혹 한글을 봐야 할 때는 그 때 그 때 다른 폰트로 변경하면서 사용해 왔다.
문제는 일반적으로 영문 폰트에는 한글 문자 영역에 대한 폰트가 들어 있지 않다는 것이다. 일문 영역도 얘기는 마찬가지다. 물론, 폰트마다 문자 영역의 커버리지는 다르다. 굴림체 등에는 한글 뿐만 아니라 히라가나, 가타가나 등이 들어 있기도 하다. (일문에서 사용하는 한자 영역이 들어가 있지는 않다.)
Font Fallback과 Font Linking
Windows에서는 이러한 문제를 해결하기 위해서, Font Fallback과 Font Linking이라는 개념을 사용한다. 이러한 기능은 Uniscribe라고 불리는, Unicode 영역의 문자들을 표시하는 방법을 제공하기 위한 목적으로, Windows 2000 이후로 지원하기 시작한 Windows의 기능 중 하나다.
Font Fallback은 어떤 폰트를 사용할 때, 폰트가 커버하는 영역에 해당하지 않는 문자가 있을 때, 언어별로 지정된 fallback font (일반적으로 Miscrosoft Sans Serif)에 해당하는 폰트를 이용해서 표시하는 기능이다.
Font Linking은 언어별로 지정된 하나의 fallback font가 아니라 여러 fallback 폰트를 폰트 별로 지정할 수 있는 기능이다. 폰트 별로 지정할 수 있으므로 그 폰트에 가장 어울리는 fallback 폰트를 지정할 수 있고, 여러 fallback 폰트를 지정할 수 있으므로, 여러 언어로 폰트의 커버리지를 확장할 수 있다. 이를테면 영문 폰트에 한글 폰트와 일문 폰트를 지정해서, 영문, 한글, 일문을 모두 표시할 수 있는 식이다.
Font Linking을 설정하기 위해서는 직접 레지스트리를 수정해야 한다. HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionFontLinkSystemLink에 폰트 이름에 해당하는 다중 문자열 (Multi-String) 키를 추가하고, <링크할 폰트 파일 이름>, <링크할 폰트 이름>의 형식으로 적는 방식이다.
Font Linking Bug in PuTTY 0.58
문제는 PuTTY는 Font Linking을 지원하지 않는 것 같다는 것이었다. 위와 같이 Font Linking을 설정해도 PuTTY에서는 제대로 표시해 주지 않았다.
이 문제를 조사할 당시, PuTTY의 한글 표시 문제가 Font Linking으로 해결되지 않는다면, Consolas에서 한글을 보기 위해서는, FontCreator 등의 상용 도구를 이용해서 영문 폰트와 한글 폰트를 조합해서 물리적으로 하나의 폰트로 만드는 방법 밖에는 없다는 것이 나의 결론이었다. 그러고 나서 한동안 포기하고 있었는데, 우연히 PuTTY의 Change Log를 보다가 다음과 같은 항목을 보게 되었다.
Bug fix: font linking (the automatic use of other fonts on the system to provide Unicode characters not present in the selected one) should now work again on Windows, after being broken in 0.58. (However, it unfortunately still won’t work for Arabic and other right-to-left text.)
예전에 강유원 씨가 번역한 달인이라는 책을 읽은 적이 있다. 이 책을 보면 ‘달인이 되는 다섯 가지 열쇠’ 중 하나로 ‘기꺼이 복종하라’라는 말이 있다. 사실 이 부분을 읽을 때에는 가르침을 비판 없이 무조건적으로 받아들이는 것이 대체 무슨 의미인가라고 생각하며 읽었고, 그저 ‘연습하고 또 연습하라’라는 지침의 확장 정도에 불과하다고 생각했다.
최근에, 가난뱅이님의 “독서는 어릴 때 하는 거다”란 글을 읽고 ‘기꺼이 복종하라’라는 말이 정말로 어떤 의미인지 깨달았다.
반면 토니는 러셀과는 다른 방식으로 합기도에 접근했다. 처음부터 그는 자신이 다른 무술을 배웠다는 것을 드러낼 만한 어떤 움직임, 심지어는 동작조차 취하지 않았다. 과시도 없었고 오히려 다른 학생들보다 더 많이 선생을 존중했다. 그는 조용하고 진지한 태도를 견지하면서 주변에서 일어나는 일들에 세심하게 신경 썼다. 사실 이 같은 태도는 무술을 수련한 사람이라면 누구나 알아차릴 만한 강력한 존재감을 보여 준다. 그는 앉고 서고 걷는 방식만으로도 자신이 달인의 길을 가고 있는 동행자임을 보여 주고 있었다.
— 달인, 조지 레오나르드 지음, 강유원 옮김, 여름언덕
책에서는 모호한 방식으로 예를 들고 있지만, 이 일례에서 보여 주고자 하는 얘기는, 가난뱅이 님의 말씀대로, 자신을 낮추고 스승을 존경하지 않는다면 배워도 제대로 배울 수가 없다는 것이다.
이것은 단순히 다른 사람에게 자신의 뛰어남을 뽐내지 않는, 예절의 문제가 아니다. 진심으로 자신을 낮출 수 있어야 한다는 얘기다.
그 동안의 나의 배움을 생각해 보아도 그렇다.
예전에 어떤 팀에 있을 때, 팀장이 바뀌는 일이 있었다. 새로운 팀장님은 내가 전혀 모르는 분이었다. 처음에는 그 분을 존경하지 않았다. 호시탐탐 그 분의 오류를 발견하고자 노렸다. 시간이 지나고, 자연스럽게 그 분의 기술적인 지식과 사람을 다루는 능력이 드러나게 되었고, 나는 그 분을 존경하게 됨과 동시에, 내가 그 동안 가지고 있지 않던 많은 것들을 배울 수 있었다. 심지어는 그 분을 만나고 있지 않는 현재에도 배우고 있다.
비슷한 예는 또 있다. 하나 같이 행동이 마음에 들지 않는 사람이 하나 있었는데, 시간이 지나면서 그 사람의 장점을 차차 알게 되고, 내게 없는 그 사람의 장점을 배우기 위해 노력하게 되었다. 그 사람이 장점으로 가진 그 분야에서, 그 사람은 나의 스승이 된 것이다.
책을 읽을 때에도 마찬가지다. 어떤 형편없는 책을 읽어도, 그 책에서 뭔가 하나라도 건져 내려는 태도로 읽게 되면, 배우는 것이 있지만, 처음부터 건질 게 없다고 생각하면, 그 책을 읽은 시간은 고스란히 낭비가 되어 버리는 것이다.
이러한 점을 깨닫고 받아들인다면, 다음과 같은 행동을 실천할 수 있다.
1. 특정 분야에서 자신이 존경할 수 있는 스승을 찾아서 배움을 청한다.
이 얘기는 ‘달인’에서도 언급된 첫 번째 규칙이다. 배움의 시작이자 끝이다.
2. 설령 자신이 존경하지 않는 사람이라고 하더라도 그 사람에게서 배울 점을 찾는다.
어떤 분야에서 설령 스승이 없다고 해도 주위에 스승이 될 만한 책이나 그에 준하는 사람은 있을 수 있다. 자신이 뛰어나다고 스스로나 주변 사람에게 얘기하는 사람은 아직 부족한 점이 많은 사람인 것 같다. 그러한 사람은 십중팔구 수년 후에는 현재와 똑같은 수준에 머무르고 있을 것이다.
3. 남을 가르치기 위해서는 모든 면에서 존경 받을 수 있도록 하라.
어떤 분야에서 뛰어난 것과 훌륭한 스승이 되는 것은 완전히 별개의 문제다. 그 사람이 존경 받을 수 없는 행동을 한다면, 이미 스승으로서의 능력을 포기한 것이나 다름 없다.
지난 주말에 Fallout 3를 Steam을 통해 구입해 플레이하고 있다. 주중에는 거의 플레이 할 시간이 없지만, 현재 25시간 정도 플레이 한 상태다.
Fallout 3는 핵 전쟁 이후의 세계를 배경으로 한 유명한 롤플레잉 게임 시리즈인 Fallout 시리즈의 후속편이다. 여러 가지 사정으로 1, 2편의 개발사인 블랙 아일 스튜디오가 아니라, 엘더스크롤 시리즈로 유명한 베데스다 스튜디오가 맡게 되었다. 때문에 시리즈로서의 연속성에 의문을 갖는 사람이 많은 편이다.
주인공은 Vault라는 핵전쟁을 대비한 지하 주거 공간에서 태어나 자란 젊은이다. 어느 날 갑자기 의사로서 존경 받던 아버지가 어디론가 사라지고 동시에 Vault의 리더가 자신을 살해하려는 사실을 알고, Vault로부터 탈출하게 된다. 의지할 데 없는 황량한 바깥 세상에서 아버지를 찾기 위한 모험을 시작하는 것까지가 이 게임의 도입부에 해당한다.
답답한 Vault로부터 막 탈출해 바깥 세상을 처음으로 바라봤을 때, 어디로 가야 할 지를 알 수 없는 황량한 폐허에서 거주지 (메가톤)을 처음으로 찾았을 때의 감격은 이루 말할 수 없다. 전통적인 롤플레잉 게임처럼 퀘스트를 해결해 나가면서 성장하는 재미도 있지만, 건물의 폐허나 망가진 자동차들, 사람들, 변형된 동물들을 직접 발걸음을 옮기면서 하나하나 경험하는 재미도 있다. 이러한 재미는 기술의 발전으로 인해 접할 수 있게 된, 전작들에서는 얻기 힘든 것이 아니었을까 싶다.
설정 상 핵전쟁은 21세기에 발생했지만, 전쟁 전의 세계의 물건들을 보면 1950년대 정도의 것으로 보이고, 간간히 보이는 블랙 유머들은 바이오쇼크의 것과 매우 비슷한 느낌이 든다. 어쩌면 바이오쇼크가 Fallout의 전작들에서 그러한 분위기를 따온 것인지도 모르겠다.
게임의 플레이 방식 자체는 오블리비언을 많이 떠올리게 한다. 엔진 자체가 같으므로 그럴 수 밖에 없다고 생각하는데, 엘더스크롤 시리즈를 통해 잘 다듬어 진 게임 플레이 방식을 가져오는 것 자체는 나쁜 것이 아니라고 생각한다. 다만, 엘더스크롤에서 보던 단점들도 그대로 가지고 있다는 것이 문제지만…
선이냐 악이냐 선택해야 하는 갈림길이 이 게임에서도 발생하는데, 이 황량한 세계의 생존자들은 너무나 힘없고 가난해서, 이들을 돕지 않을 수가 없었다. 우락부락한 뮤턴트나 노예 상인들한테 습격 당하고 납치당하는 마을 사람들을 위해 사격술을 가르치고, 결국은 뮤턴트의 공격을 막아 내는 장면을 보면서 감격스러웠다. 이번에는 선 성향의 여성 캐릭터로 플레이하고, 다음 번에는 악 성향의 남성 캐릭터로 플레이 해보고 싶다.
최근에 유행하는 Rails나 Django와 같이, 프로젝트를 생성하는 도구를 제공하지 않는다는 사실이나, 디렉터리 구조의 Convention이 존재하지 않고, 여러 안들을 제안한다는 사실로부터 이를 알 수 있다. 게다가, Zend에서도 기본적으로 디렉토리 구조는 사용자의 요구에 따라 유연하게 할 수 있는 것을 중요하게 생각하는 듯하다.
한편, Zend Framework를 처음으로 사용해 본 것은 작년 이 맘 때였는데, 현재 Zend Framework 안정 릴리즈의 버전이 1.6.2인데, 당시의 버전이 1.0.2 였다. 그 동안 많은 변화가 있었겠지만, 라이브러리만 업그레이드해도 당시에 개발한 내용이 아직 동작한다는 것이 신기할 정도.
QuickStart 문서의 내용도 당시와는 많이 달라졌는데, 부트스트랩 방식이나 디렉토리 구조 등이 많이 달라졌다. 기능도 추가할 겸 둘러보다가 디렉토리 구조를 현재의 방식에 맞게 다듬게 되었다.
부트스트랩 방식과 디렉토리 구조에서 크게 달라진 점을 정리해 보면 다음과 같다.
controllers, models, views 디렉토리가 application 디렉토리 밑으로 들어갔다. 이를 통해 Moduler 디렉토리 구조와 호환되고 필요할 때 전환도 쉬워 진 것 같다.
library 디렉토리에 Zend Framework 라이브러리를 포함하도록 한다. 프로젝트가 좀 더 독립적으로 배포될 수 있다. 또한, 외부의 Zend Framework 라이브러리를 참조하기 위해서 PHP include path가 수정되어야 하고, 결과적으로 부트스트랩에 영향을 미치는데, 이를 통해 부트스트랩을 수정해야 하는 일이 줄어들어, 설정이 단순화되었다.
html 디렉토리가 public 디렉토리로 변경되었다. 단순히 이름의 변경이지만, 좀 더 성숙되어 가는 느낌이랄까.
결과적으로는 다음과 같은 디렉토리 구조가 된다.
QuickStart 문서의 디렉토리 구조를 기본으로 하는 프로젝트 생성 도구를 예전에 만들었었는데, 새로운 디렉토리 구조에 따라서 다시 만들어 봐야 할 것 같다. 예전보다는 많이 깔끔해 져서, 사실 Quick Start 문서에서 제공되는 프로젝트를 그대로 풀어서 해도 상관은 없지만 말이다.
잡지의 형식의 특성 중 하나는 필자의 경험에 따른, 시간이나 상황, 독자에 맞는 정보들을 보여 주려고 시도한다는 것이다. 권위가 있는 서적에서는 특성상 시간이나 경험에 따라 변할 수 있는 정보를 보여 주려고 하지는 않는다. 그럼에도 불구하고 현실에 살고 있는 우리들은 시간에 따라 변할 수 있는 정보를 필요로 한다. 예를 들어, 최소한 필자 또는 삼성 SDS에서 자주 쓰는 프로파일링 도구는 무엇인가와 같은 정보가 그러한 정보에 해당하는 것이다. (어떤 성능 튜닝 책에서는 프로파일링 도구를 모두 정리해 놓을 수 있지만, 이 책은 그런 것을 시도한 것 같지는 않다.)
이 책의 다른 미덕 하나는 ‘이야기’와 ‘실제 사례’를 들려주려고 시도했다는 점이다. 필요한 정보만 정리되어 담겨 져 있는 책이나 문서가 아니라, 나 같은 경우에도 ‘이야기’가 담겨 있는 책은 훨씬 접하기가 편안하다. 말하자면, 주말에 편한 의자에 앉아서 시간 때우기 용으로 읽거나 심지어는 화장실에서 읽을 수도 있다는 것이다.
최소한 이 책은 초보자를 위한 자바의 기본적인 코딩 습관, 성능 튜닝에 관한 지식 등으로의 참고 자료 또는 잡지가 되는 것에는 성공했다고 생각한다. 다만, 숙련자가 읽기에는 정보의 깊이라든가 정확성 등은 약간 부족한 면이 있다.