Lifefix 20071220

최근 들어 삶이 그다지 유쾌하지 않음을 느껴, 문제점들을 나열해보았다.

  • 피곤해서, 작업 관리에 소홀해지고, 업무 집중도가 현저하게 떨어졌다.
  • 야근이 너무 잦고 쓸데없이 길다.
  • 책을 읽는 양이 한 달에 한 권 이하로 줄어들었다.
  • 공부를 하는 시간이 없다.
  • 체중이 늘어나기 시작했다.

이러한 문제들에 대해 다음과 같은 fix를 적용하기로 했다.

  • 스트레스 컨트롤을 할 것.
  • 출근 후 작업 체크를 정확히 하고, 작업 로그를 좀 더 엄격히 남길 것.
  • 가능한 한 야근을 하지 않도록 하고, 야근 시간의 threshold를 정할 것.
  • 의식적으로 책읽는 시간을 배정하고, 책읽기 로그를 다시 적을 것.
  • 공부할 주제나 책을 정해 집중적으로 하고, 스터디나 블로깅을 활용할 것.
  • 저녁 식사는 회사에서 하지 말고 가능한 한 간단하게 할 것.

Proactive Attitude to Solve Problems

얼마전 회사 워크샵, 아니 플레이샵을 마치고 집으로 또는 회사로 돌아갈 때의 일이었다.

난 회사에 들를 일이 있어서, 회사로 향하는 차에 타기로 했다. 그 때, 팀장님이 내게 프로젝터를 건내며 말했다.

"회사 들를거지? 이거 책임지고 회사에 갖다 놔."

나는 엑스박스도 들고 온터라 이래 저래 짐이 많았다.

"전 짐이 많아서…"

잠시 정적이 흘렀다.

워크샵 운영을 책임진 분이 분주하게 돌아다니다 프로젝터를 받아들어 차에 실으며 말했다.

"회사에 가시는 분들이 이 프로젝터 좀 회사에 가져다 놔 주세요."

아차 싶었다.

내가 짐이 많은 것은 사실이지만, 프로젝터를 두고 가거나 집으로 가져갈 수는 없으니, 어차피 회사로 가져다 둘 짐은 회사로 향하는 차에 실어야 하는 것이고, 또 회사로 향하는 차에 탄 사람이 책임을 져야하는 것이었다.

일을 하다보면 위와 같은 실수를 하는 사람이 비단 나만 있는 것은 아니다.

자신의 역할에 해당하는 문제가 아니라고, 또는 자신이 해결하기에 곤란하다고, 그 문제의 해결을 방관하거나 거절하는 경우가 있다. 하지만, 그 문제는 누군가는 해결해야하는 문제인 경우가 있다. 문제가 주어졌을 때, 그 문제가 자신만의 책임이 아니거나, 자신만의 힘으로 문제 해결이 어려운 상황에 부닥치더라도, 그 문제의 해결 방법을 모색해보는 태도가 프로페셔널에게는 필요하다. 물론, 이 말은 자신이 해결할 수 없는데도 해결할 수 있다고 거짓말을 하라는 얘기가 아니다. 이러한 태도가 있느냐 없느냐가 좀 더 성숙된 프로페셔널이냐 아니냐를 구분하는 잣대 중 하나라고 생각된다. (또한 그러한 태도가 없는 사람들이 답답하기도 하다.)

아마도 그 때 난 다음과 같이 말했더라면 좋았을 것이다.

"아, 제가 짐이 많긴 한데, 같이 가시는 분들이랑 함께 갖다놓도록 하죠."

Use Boss-Worker model to accept connections with java.net.ServerSocket

일반적인 소켓 API를 이용하여 멀티쓰레디드 서버 프로그램을 만들 때, 쓰레딩 방식을 결정함에 있어서, Boss-Worker 모델Peer 모델을 고려하게 됩니다.

서버 프로그램에 있어서 Boss-Worker 모델이라고 하면, (하나의) Boss thread에서 accept를 수행하고 Boss thread가 Worker thread에게 accept된 커넥션(connection)을 전달하여, Worker thread가 커넥션에 따른 서버 로직을 수행하는 것입니다. 한편, Peer 모델은 각 thread가 각자 커넥션을 accept하려고 시도하고, accept된 커넥션에 대해서 서버 로직을 각자의 thread에서 수행하는 것을 얘기합니다.

두 모델간에 어느 것이 낫냐는 질문을 종종 받곤 하는데, accept할 기회만 충분히 주어진다면, 큰 차이가 없다고 볼 수 있습니다. 굳이 말하자면, Peer 모델의 경우 (어떤 이유로든) thread 수가 부족하다면 accept될 기회가 없어서 자원이 남는데도 불구하고 불필요하게 처리량(throughput)이 떨어지는 서버가 만들어질 수도 있습니다. 클라이언트의 접속에 대해서 별 걱정없다는 면에서 Boss-Worker 모델이 좀 더 속편하다고 볼 수도 있습니다. 처리량의 문제는 클라이언트의 리퀘스트 양이라는 문제와 서버가 이를 처리할 수 있는 능력(capacity)이라는 문제와 연결되어있는데, 당연히 서버는 자신이 처리할 수 있는 양 이상을 처리하려고 시도하지 않아야겠죠. 이 때, 커넥션을 가지고 있는 상태에서 서비스할지 말지 결정하는 것이 커넥션이라는 하위 메커니즘에 대해서 이것저것 고민하는 것보다는 훨씬 편리합니다. (제 경험상, 다른 일을 할 수 없을 정도로 커넥션(클라이언트의 리퀘스트)이 들어오는 것은 상식적으로 클라이언트가 잘못된 상태거나 클라이언트-서버의 설계가 부적절하게 설계된 것입니다.)

원래 얘기로 돌아와서, Boss-Worker 모델과 Peer 모델은 적어도 POSIX 소켓 API를 이용하는 멀티쓰레디드 서버 프로그램에서는 일반적이지만, Java의 java.net.ServerSocket을 이용하여 accept하는 경우에는 Peer 모델을 사용하는 것은 부적절해 보입니다. 그 이유는 단순하게도 ServerSocket.accept() 메서드가 synchronized 메서드이기 때문입니다.

이 사실 자체가 정상적으로 ServerSocket을 accept하는 상황에서 문제가 되지는 않습니다. 하지만, Peer thread들을 정상적으로 종료시키려면 문제가 되기 시작합니다. ServerSocket.accept()는 non-blocking I/O이고 (당연하게도) interrupt도 불가능합니다. 따라서 Peer thread를 종료시키려면, ServerSocket.accept()에서 빠져나오게 하기 위한 방법이 필요합니다. ServerSocket.accept()를 빠져나오게 하기 위해서는 가짜 접속을 하거나, ServerSocket.setSoTimeout() 메서드를 통해서 소켓 타임아웃을 설정하는 방법밖에는 없습니다. 가짜 접속을 하는 방법이 복잡해 보이므로, 소켓 타임아웃에 의존해봅시다. 하지만, ServerSocket.accpet() 메서드는 synchronized 메서드이기 때문에, 모든 Peer thread에 대해서 소켓 타임아웃이 적용되어 모두 종료되려면, (number of peer threads) * (socket timeout) 만큼의 시간이 걸립니다. 그러면 가짜 접속을 하는 방법을 고려해볼까요? 이쯤에서 짜증이 나기 시작합니다.

해결책은 그냥 처음부터 Boss-Worker 모델을 사용하는 것입니다. 위에서 언급했듯이 숙제로 짜는 프로그램이 아니라면, Boss-Worker 모델이 Peer 모델에 비해서 별로 복잡하지도 않습니다. (제대로 짠 프로그램이라면, 어차피 통신 방법과 서버 로직은 잘 분리되어있어야 하겠죠) Boss-Worker 모델에서는 당연히 한 시점에 하나의 thread가 ServerSocket.accept()를 호출하므로 (socket timeout) 만큼의 시간이 걸릴 뿐입니다.

Peer 모델을 그대로 사용하면서, NIO의 java.nio.channels.Selector를 사용하는 방법도 있습니다만, 애초에 서버 프로그램을 NIO를 이용하여 짜지 않았기 때문에, 필요 이상의 복잡함이 추가됩니다.

사실 이런 종류의 문제들은 서버 프로그램에서 항상 반복되는 문제들이고 MINA와 같은 프레임워크들이 잘 해결하고 있습니다. 처음부터 이런 프레임워크를 고려하는 것도 한가지 방법입니다.

Great Scott!

Heroes 에피소드 10에서 웨이트리스를 구하기 위해 시간이동을 하다가 6개월전으로 가버린 히로가 안도에게 도움을 구하기 위해 전화를 하지만, 과거의 히로가 전화를 받죠. 그 때 – 서로 다른 시간에 존재하는 자신을 조우했을 때, 어떤 현상이 일어나는지 모르니까 – 히로가 놀라서 하는 말이 “Great Scott!”입니다.

위키피디아 내용대로라면 Great Scott은  놀람을 표현하는 감탄어구라고 볼 수 있는데, Superman 같은 수퍼히어로물이나 나르니아 연대기 등에서도 사용되었다고 하는군요. 그 기원은 남북전쟁 시대의 유명한 장군의 이름이라고 하는데, 그것이 왜 감탄어구로 자리잡게 되었는지는 알 수가 없군요.

어쨌든 히로 너무 귀엽습니다아.

새로 구입한 책상

처로군 집에 가서 보고 마음에 들어서 가로폭 1.6m 짜리 탑책상 샀는데, 막 설치완료했습니다. 컴퓨터에 관련된 배선을 모두 새로 하느라 좀 고생했습니다. 책상은 조립형인데, 상판이 튼튼하고 묵직한데다가, 크기도 크다보니 무게가 좀 됩니다. 그래서 책상을 들지않고 밀거나 하면 고정쇠 부분이 빠지거나 하네요. 하지만 가격대 성능비는 만족입니다.

엑스박스 360을 놓다보니 기존에 억지로 올려놓던 서버용 모니터를 놓을 자리가 없네요. 기존 책상을 방 어딘가에 배치해야할 것 같네요.

황색 저널리즘이 만연한 신문 사이트들 Yellow Journalism Widespread in the Korean Newspaper Sites

황색 저널리즘(Yellow Journalism)이라는 잘 알려진 개념이 있다. 황색 저널리즘이 생산하는 선정적인 기사들은 사람들의 주목(attention)을 불필요하게 점유함으로써 좀 더 생산적인 언론의 기능들 예를 들면, 의제 설정 기능(agenda-setting function)과 같은 기능을 방해할 수 있다. 황색 저널리즘 자체가 가질 수 있는 장점들이 있을 수 있겠지만, 그러한 장점은 선정성을 통한 이익 추구에 의해서 가려지게 마련이다. (이 글에서 선정적인 기사란 무엇인가 또는 선정적인 기사가 가지는 가치 등에 관해서 논하지는 않겠다. 우리는 우리에게 좀 더 이득이 되는 기사를 접할 수 있는 기회를 박탈하는 선정적인 기사에 대한 어느 정도의 공감대를 가지고 있다고 가정한다.)

인터넷 매체가 주요한 매체가 되기전부터 황색 저널리즘의 경계는 언론사, 매체, 기사들 사이에 뚜렷한 경계가 있었다. 주요 신문들의 헤드라인과 소위 ‘스포츠 신문’들의 헤드라인은 누가봐도 구분할 수 있다. 인터넷 매체가 점점 발전하면서 최근 1-2년 사이에 소위 ‘주류’ 신문이라고 부를 수 있는 신문사의 사이트- 인터넷 신문들이 변화하고 있다. 사이트의 첫 화면에 내거는 기사들의 반 정도는 선정적인 기사들에 속한다. 물론 종이 신문에서는 아직도 전통적인 의미의 헤드라인을 고수하고 있고, 웹 사이트에서도 그 기사들을 헤드라인이라는 분류를 통해서 접근할 수 있다. (수년간 조선일보의 첫 페이지를 현재의 것과 비교해보라.)

아마 이러한 변화의 경향은 주요한 포털 사이트의 뉴스 서비스와의 경쟁에서 비롯되었으리라고 생각한다. 뉴스 서비스의 소비가 인터넷으로 옮겨가기 시작하면서 전통적인 신문사들은 포털 사이트와의 경쟁에서 압박을 느끼기 시작했을테고, 결국은 이들을 베끼는 전략을 사용하기 시작한 것으로 보인다. 오히려 현재는 포털 사이트의 뉴스 서비스의 첫 페이지보다 주요 신문사의 인터넷 뉴스 서비스에서 선정적인 기사를 찾아보기 쉽다.

종이 신문이 인터넷 신문을 대체할 것인가 하는 문제는 또다른 흥미로운 문제지만, 그 문제를 논외로 하고서라도, 인터넷 신문이 우리 생활에 막강한 영향을 미치고 있다는 것은 사실이다. 언론을 접하는 대중들의 태도는 대체로 수동적인 것이 현실이기 때문에, 대중들이 ‘무엇을 선택하느냐’ 이전에, ‘무엇이 주어지는가’하는 문제는 중요한 문제라고 생각한다.

이런 문제는 법이나 규제로 해결되지는 않는다. 언론사들의 책임 의식과 지식인과 시민 단체들의 언론사들에 대한 감시와 비판을 통해서 해결할 수 있을 것이다. 물론 대중들의 교육은 언제나 빼놓을 수 없는 해결방법이다.

무엇보다도 인터넷 매체를 기반으로 하는 언론들은 – 주요 포털 사이트들을 포함한 인터넷 뉴스 서비스들은, 설령 기사의 생산을 담당하지 않는다고 하더라도, 이미 기사의 선별 과정을 통해 언론의 기능을 수행하고 있는 만큼 언론으로서의 책임 의식을 자각할 필요가 있다.

한편, 포털 사이트의 뉴스 서비스들이 수익을 창출하기 위해서 어느 정도 선정성을 활용할 수 밖에 없다고 한다면, 그것을 원하지 않는 사람들을 위한 다른 성격의 서비스의 가능성은 없는가 하는 의문이 든다.

Tool for Writing a Blog Post

MovableType에 내장된 에디터는 WordPress 처럼 WYSWYG 에디터가 아닙니다. WordPress 에디터를 싫어하는 사람도 있지만, MT 사용자의 입장에서 WP의 에디터는 부러운 점입니다. 특별한 markup을 사용하는 formatter도 사용해보고, mshtml을 사용한 툴, Google DocsWindows Live Writer, Performancing도 사용해보았지만, 모두 마음에 들지 않는군요.

마음에 안 드는 점들을 들자면 다음과 같습니다.

  • 사용자 인터페이스
  • 문서의 구조화
  • XHTML 표준과의 호환
  • 맞춤법 검사

사용자 인터페이스

일단 WYSWYG이 아니면 모두 탈락. 물론, 직접 HTML 코드를 수정할 수 있어야하는데, WYSWYG과 제대로 연동이 되지 않는 경우가 많습니다. 자주 사용하는 에디팅 기능들이 없거나 불편하게 되어있는 경우도 많습니다.

문서의 구조화

그나마 최근에 나온 툴들은 HTML 문서 내에 presentation 정보를 넣지 않는 경향이 강합니다. mshtml의 경우에는 최악이었죠. presentation이 빠졌다고 해도, 문서 내용을 구조화하는 것은 여전히 불편합니다. Microsoft Word 인터페이스처럼 현재 커서 위치의 ‘문단 스타일’을 설정하는 방식으로는 부족합니다.

XHTML 표준과의 호환

소위 제 블로그는 XHTML 표준 호환을 표방하고 있는데, 최근에 Windows Live Writer를 사용하면서 호환되지 않게 되었습니다. HTML을 생산하는 에디터들이 호환성 있는 HTML을 생산하지 않으면 표준 호환성으로의 길은 요원할 것입니다.

맞춤법 검사

사소한 맞춤법이 잘못 되어서 글을 다시 수정해야하는 경우가 자주 일어납니다. 영문 맞춤법 검사는 찾아볼 수가 있긴 하지만, 한글 맞춤법 검사는 웹상의 에디터에서는 거의 전무합니다.

앞으로의 대책

제가 만들어서 쓰고 있던 MovableTypeWriter를 다시 사용하면서 좀 더 개선해 볼 계획입니다.. 기본적으로 위의 문제점들을 해결하고, 다른 툴들의 장점들도 도입해볼 생각입니다.

Problems of Political Philosophy, Chapter 1, Section 1

제게는 이상한 습관이 한가지 있습니다. Computer Science나 Programming에 관련된 책을 읽으면 거의 빠지지 않고 서평을 쓰지만, 문학이나 인문-사회-자연과학 도서들을 읽고나서는 글을 쓰지 않는 것이 그것입니다. 하지만, 쓰지 않으면 아무리 세심하게 책을 읽고, 그 책을 읽을 당시에는 이해했다고 하더라도, 그 책이 가지고 있는 가치를 잊어버리게 마련입니다. 그래서, 앞으로는 모든 책에 대해서 서평 또는 요약에 가까운 정리를 해 볼 생각입니다.

일단 그 첫번째로 D. D. Raphael의 Problems of Political Philosophy를 번역한 ‘정치 철학의 문제들’을 읽으면서 장절 단위로 정리해볼 생각입니다. 한국어로 된 좋은 정치 철학 입문서는 거의 없는 듯 합니다. 번역된 정치 철학 입문서라고 해야 2-3권에 불과하구요. 이 책을 추천한 분이 계셔서 일단은 일독하면서 정리해볼 생각입니다. 잘못된 것이 있으면 얼마든지 지적해주세요.

다음은 제1장 ‘정치철학이란 무엇인가?’의 제1절 ‘과학적 이론과 철학적 이론’의 요약입니다. 너무 짧아서 맛보기에 불과하군요. 일단 1장은 오늘 안으로 모두 올리도록 하죠.

정치학-사회학과 정치철학-사회철학의 차이

정치학-사회학의 이론은 하나의 과학적 이론이며, 개별적인 사실을 기록하고 설명하며, 일반적인 설명의 법칙을 제공하려고 시도한다. 그러한 법칙들은 실례를 통해 증명되거나 반증될 수 있다. 반면, 정치철학-사회철학의 이론은 ‘그 경우는 어떻게 되어야 하는가’ 또는 ‘우리가 무엇을 해야하는가’를 말해주는 교설, 이데올로기, 규범 또는 이상적인 표준이다.

이러한 의미에서 정치학-사회학은 실증적(positive)이고, 정치철학-사회철학은 규범적(normative)라고 얘기할 수 있다.

정치철학의 정의

한편, 정치철학은 국가(the state)에 대한 관념에 철학적 사유를 적용하는 철학의 한 분야라고 정의할 수 있다. 그렇다면 철학이란 무엇인가?

철학의 목적

철학의 목적은, 특히 전통적인 철학의 목적은 다음의 두가지로 요약될 수 있다.

  • 신념에 대한 비판적 평가(critical evaluation of belief)
  • 개념의 명료화(clarification of concept)

dp.SyntaxHighlighter

블로깅 하다보면, 코드를 적어야 하는 경우가 자주 발생하고, 하이라이팅을 하기 위한 편리한 방법이 필요합니다.

하이라이팅을 위해 HTML로 변환하는 툴이야 많지만, 중요한 requirement들은 다음과 같습니다.

  1. Presentation의 분리: 코드 텍스트를 (가능한 한) 원래의 형태로 저장할 것.
  2. XHTML 표준의 사용:  예를 들어, <font /> element 보다는 <span /> element, class attribute, CSS를 활용할 것.

Presentation 분리는 대체로 Textile과 같은 formatter를 따로 사용해서 얻을 수 있는데, 블로깅 툴들이 기본적으로 제공하는 경우는 없고, 글 전체에 특정 format을 사용해야하기 때문에 맘에 안듭니다. 조그만 악을 해치우기 위해 더 큰 악을 불러들여오는 꼴이랄까요. 그리고 아쉽게도 기존의 툴들은 대부분 <font /> element를 사용하는 경우가 많습니다.

겐도사마를 통해 알게 된 dp.SyntaxHighlighter를 사용해보았습니다. dp.SyntaxHighlighter의 장점은 코드 텍스트를 그대로 유지하면서, javascript와 CSS를 통해 하이라이팅을 하기 때문에 위의 requirement들을 모두 만족한다고 볼 수 있습니다.

Deposit-Refund System for Disposable Espresso Cups

어릴 적엔 부족한 군것질 용돈을 충당하기 위해서 빈병 모아다가 구멍가게에 가져다주곤 했다. 이것이 바로 공병 보증금제도 인데, 소비자가 제품의 비용에 추가적인 비용을 예치(deposit)하고, 나중에 돌려받는다고(refund)해서 Deposit-Refund System이라고 부른다. 현재 대부분의 에스프레소 커피전문점들은 일회용 컵에 대해 이와 같은 ‘환경 보증금’이라는 이름의 제도를 실시하고 있다.

환경 보증금은 물론 좋은 취지의 제도이고, 환경 문제를 항상 환기 시켜주는 등의 긍정적인 역할을 하지만, 환경 보증금 자체가 경제적인 인센티브가 되기는 힘들다.

예를 들어, 평생동안 하루에 한 잔씩 일회용 컵을 사용해 라떼를 마시고, 컵은 사무실에 가져와서 버린다고 해보자. 이 때 포기하는 기회비용은 얼마일까?

50원 x 365일 x 100년 = 182만 5천원

182만 5천원은 꽤 큰 돈이지만 적어도 한 잔에 3000원 이상인 에스프레소 커피를 소비하는 사람의 평생 수입에 비하면, 별 것 아닌 비용이다. 2006년 상장사의 대졸 초임이 약 2906만원이라고 한다. 환경 보증금의 기회비용은 이 사람 수입의 0.06%에 해당한다. 상식적으로, 연봉 3천만원 받는 사람이 지하철 요금에 인색할까? 지하철 요금이 900원임을 감안할 때 과연 50원의 비용에 꿈쩍이나 할까?

물론 이 기회비용의 가치는 상대적이다. 현재의 최저 임금 시간급 3100원을 받는다고 하면 182만 5천원은 주당 40시간 기준 14주를 일해야 벌 수 있는 돈이고, 평생 벌 수 있는 돈의 0.3%나 된다. 역시 상식적으로 시간급 3100원을 받는 사람이 과연 에스프레소 커피를 마음 놓고 매일 마실 수 있을까?

대부분의 사람들이 커피전문점에서 컵을 되돌려주고 보증금을 되돌려 받지 않는 이유는 단순히 충분한 경제적 인센티브가 되지 못하기 때문이다. 50원의 귀중함도 모르냐는 식의 접근은 좀 곤란하다. 차라리 보증금을 인상해보는 것은 어떨까? 여기서 질문. 사람들은 컵을 돌려주는데 얼마 정도의 인센티브가 필요할까? 나라면? 글쎄, 200원-500원 정도? 물론, 이 정도의 인센티브도 어떤 사람들에게는 전혀 인센티브가 되지 못한다.

환경론자들은 환경을 보호하는 행위는 단기적으로도 당신에게 도움이 되는 행동이라고 얘기하는데 열을 올리지만, 몇몇 경우를 제외하고는 환경을 보호하는 행위는 추가적인 비용과 불편함을 동반하는 것이 일반적이라고 생각한다. 물론, 법적인 기반과 경제적인 제도를 사용해 사람들의 행동을 유도하는 것도 단기적으로는 좋지만, 역시 궁극적으로는 환경을 보호하는 것이 중요한 일이라는 합의를 이끌어내고 그것이 매우 자랑스러운 일이라는 의식을 가질 수 있도록 교육하는 일이 가장 중요하다.