Author Archives: peremen

이해가 가지 않았던 버그

아주 잠깐동안 블로그를 워드프레스로 이전했다 다시 텍스트큐브로 돌아오는 엄청난 삽질을 하였다. 그 과정도 참 복잡했던 것이 워드프레스 2.3으로 개발되었던 tc2wp라는 툴을 사용해서 텍스트큐브 백업 파일을 불러온 다음 워드프레스 2.7로 다시 올리는 식으로 설치하는 등 엄청난 삽질을 했다. 물론 이 과정에서 텍스트큐브 백업 파일을 날리지 않았기 때문에 다시 텍스트큐브로 돌아올 때 워드프레스 파일을 가지고 장난치는 과정을 할 필요가 없어서 다행이었다.

아무튼 워드프레스가 나쁘지는 않았지만 Akismet에 자꾸 외국발 스팸이 걸리는 문제도 있었고, 애시당초 워드프레스를 설치했던 이유가 이상한 작동을 했던 텍스트큐브를 대체하기 위해서였기 때문에 다시 텍스트큐브로 돌아오기로 했다. 당시 아무도 내가 겪었던 버그를 겪지 않은 것 같았는데다가 디버그 모드를 켜고 봐도 오류가 나는 듯한 구석이 하나도 없어서 일단 억지로 깔았던 것이었기 때문이다. 글을 쓰려고 해도 저장할 수 없다고 하고, 환경 설정을 변경하려고 해도 안 된다고만 하고, 하여간 그런 오류였다.

사용자 삽입 이미지진짜 MySQL 서버도 제대로 살아 있고 권한 오류도 없는데 이런 오류를 보면 황당하다. -_-결국 텍스트큐브를 밀고 워드프레스로 갈아탔다가 한 두 달이었던가 후에 다시 텍스트큐브를 깔아 보니 이 때는 정말 멀쩡한 것이 아니었던가!

사용자 삽입 이미지정말 그 때 일을 다시 생각해 보면 황당하기만 하다. 그 사이에 했을 법직한 것은 재부팅 정도였는데 그것 하나만 가지고도 해결될 수 있는 것도 황당하다. 서버에 걸려 있는 오버클러킹도 영향을 주는 것 아닌가 해서 오버를 풀어도 보려고 했는데 그냥 재부팅 한 번으로 해결될 수 있는 문제였다는 것도 참 충격적이었다. 워드프레스가 그 동안 돌았던 것도 더더욱 이해하기 힘들고. 이래저래 참 오묘한 세계다.

동대구역 잡사

해운대역까지 무려 경부선을 경유해 주시는 새마을호 #1207을 타기 위해서 동대구역에서 죽치고 있었다. 먼저 타고 온 KTX #117에서 내려서 플랫폼을 바라보니 #1207과 #1203이 줄줄이 지연되는 바람에 시간을 좀 벌어볼 수 있었다. 일단 닥치고 플랫폼으로 나가 보니 이딴 것들이 보였다.

싸... 싸궁화다!

싸... 싸궁화다!

최근 CDC가 집단으로 개조된 일명 싸궁화 아니었던가! CDC는 과거 비둘기 및 통일호 객차와 동차의 퇴역에 대비하여 통일호의 말년(1996년부터)에 도입되어서 통일호 등급이 사라지기 전까지만 해도 수요에 비해서 공급이 모자랐던 차량이지만, 통일호가 통근열차로 대체되고 운행 구간이 점점점 줄어들고 나서부터는 수요에 비해서 공급이 넘치는 차량이 되었다. 게다가 차량 성능 자체는 기존 무궁화호 디젤 동차에 비해서 딸릴 것이 없으면서도 통일호 급으로 굴렸으니 낭비 아닌가.

싸궁화에 달려 있는 미니카페.

싸궁화에 달려 있는 미니카페.

이에 코레일에서는 CDC를 무궁화호로 개조하여 운행하기 시작하였고 기존의 무궁화호 디젤 동차를 대체시켜 나가고 있다. 2008년 초에 한 편성이 시범적으로 무궁화호로 개조되어서 투입된 다음 품평회를 가지고 양산하기 시작하였다. 새마을과 무궁화에 요즘 많이 보이는 열차카페처럼 한 칸에 미니카페를 구축한 것이 특징이다. 언젠가 기회가 되면 한 번 타보고는 싶은데 운햏 구간을 아직까지는 알 수가 없다.

하여튼 저 사진을 찍고 돌아오니 손이 얼어붙어서 환승 대기실에서 좀 손부터 녹였다. KTX에서 내릴 때만 해도 열차가 지연되었다는 말만 하던 것이 이제 지연 상황이 파악된 듯 하였다. 역내에는 동력차 고장으로 무궁화가 퍼졌다는 말이 나오고, 전광판에는 무궁화 26분 지연에 새마을 12분 지연이 표시되었다. 승무 교대를 하기 위해서인지 환승 대기실에서 대기하고 있었던 기관사님들이 몇몇 보였다. 하여간 저 지연 안내를 보면서 내가 왜 KTX 타고 부산역까지 안 갔을까 후회도 들었지만, KTX 입석 승객으로 통로까지 붐비는 지금 상황에서는 새마을호가 텅 비어 주어서 고맙기만 하였다.

지연크리

지연크리. KTX가 저렇게 지연 먹었다면 보상받았을 수 있었을텐데.

동대구역을 이제 떠나려는 채비를 할 때쯤 반짝거리는 전기 기관차가 하나 들어왔다. 8262호. 8262라면 제조된 지 얼마 안 되었을 텐데 왜 퍼졌을까 의아해하면서 일단 사진부터 찍으러 나갔다. 특히 몇 달 전에 이 루트를 탔을 때에도 똑같은 전기 기관차가 들어와서 발차 동영상을 찍으려고 했는데 기적 소리에 놀라서 제대로 된 영상이 안 나와서, 이번에는 제대로 된 8200호대 발차 동영상을 찍어 보자는 결심까지 하였다. 하여간 사진도 잘 나와서 만족스럽다.

8262호 전기 기관차.

8262호 전기 기관차. 금속으로 된 차호가 눈에 띈다.

8200호대도 처음 들어온 것은 차호가 그냥 스티커 형태였는데 요즘 들어온 것들은 아주 금속을 박아 둔 느낌이다. 훼손되지 않는다는 점도 좋고, 미관상 좋기도 하다. 결국 발차 동영상도 찍는 데 성공하여 모처에 올릴 수도 있었다.

20초 부근에서 시-미-라-레- 소리를 들었는가? 유로스프린터 계열 차량들에서 공통적으로(라고 하지만 8200호대는 좀 다름) 들을 수 있는 구동음이다. 이외에도 지멘스제 인버터를 탑재한 철도 차량에서 이런 식으로 올라가는 소리를 들을 수 있다. 여튼 이 동영상을 찍고 나니까 내가 타고 갈 새마을 열차가 들어왔다. 평소 이렇게 환승을 하면 약 20분간 동대구역에서 대기해야 해서 짜증났는데, 안 그래도 지연까지 겹쳐서 더 열받긴 하였다. 그래도 나름 괜찮은 장면을 건질 수 있어서 편하게 타고 왔다.

리버스 엔지니어링: 짜릿함 뒤의 찝찝함

내가 리버스 엔지니어링에 관심을 가지게 된 건 리눅스를 쓰기 시작하면서부터인 것 같다. 이 시궁창 같은 나라의 현실에서는 윈도에서만 되는 것이 너무 많았기 때문에, 리눅스에서도 그에 해당하는 무언가를 이루어 내기 위해서 프로그램의 핵심 부분만 어떻게 알아낸 다음 똑같거나 비슷하게 구현하여 쓰는 것이다.

리버스 엔지니어링을 하기 위해서 프로그램을 따거나, 장치와 통신하는 프로그램의 경우에는 장치와의 통신 신호를 잡아내기도 한다. 프로그램의 내부 구조를 들여다보려면 어셈블리어를 할 수 있어야 하며, 디버거 같은 것을 사용할 줄 아는 것이 좋다. 장치와의 통신을 캡처하려면 USB 버스의 신호를 캡처하는 프로그램이 필요하다. 내 개인적으로는 IDASnoopyPro 같은 툴을 사용한다.

IDA Pro

IDA Pro


SnoopyPro. 오래되긴 했어도 아직도 쓸만하다.

SnoopyPro. 오래되긴 했어도 아직도 쓸만하다.

프로그램이나 버스 신호를 따 낸다고 해서 끝나는 것은 아니다. 어셈블리만 있다고 해서 완성된 프로그램이 나오는 것은 아니기 때문이다. 똑같은 로직을 이를 들여다보고 다시 구현하는 방법이 있지만 저작권 문제 때문에 이를 사용하는 일은 거의 없다. 클린 룸 엔지니어링이라는 방법은, 누군가가 소스 코드를 들여다보고 스펙을 작성한 다음, 그 스펙을 기반으로 제 3자가 코드를 짜는 방법이다. 저작권 문제를 피할 수 있기 때문에 이 방법을 많이 사용한다.

블랙박스 DLL이 있고 이를 호출해서 원하는 결과를 얻어야 한다면 이 DLL을 호출하는 프로그램을 다시 짜야 하고, 프로그램의 로직 그 자체가 필요하면 그것을 다시 짜야 한다. 내가 관심이 많은 윈도 DLL을 리눅스에서 호출하는 것은 WINE 라이브러리로 좀 까다롭게 할 수 있다. WINE 라이브러리를 기존 리눅스 코드에 섞는 것은 어렵지 않지만, 실제 프로그램을 짜서 테스트를 하는 동안 문제가 발생한다면 WINE 라이브러리를 쓰는 래퍼 프로그램 하나와 그 프로그램과 통신하는 다른 프로그램으로 쪼갤 필요가 있다.

이러한 과정을 통해서 프로그램을 다른 OS 상에서 똑같이 작동시키는 순간 짜릿함을 느낄 수 있다. 대부분의 사람은 변환이 귀찮다고 하지 않는 휴대폰에 MP3 집어넣기를 리눅스 상에서 통신사의 크고 더럽고 무겁고 엿같은 프로그램을 쓰지 않고 성공시키는 것만큼 짜릿한 느낌을 받기는 힘들 겄이다. 이것이 리버스 엔지니어링을 하게 되는 원동력 같다.

WINE 라이브러리로 윈도 DLL 호출하기

WINE 라이브러리로 윈도 DLL 호출하기

막상 이렇게 리버스 엔지니어링을 다 해 두었다고 해도 이를 마음대로 공개했다가는 변호사들의 밥이 되기 쉽다. 한국의 컴퓨터프로그램보호법 제12조의2의 1은 리버스 엔지니어링을 할 수 있는 부분을 명확하게 정의해 두었다. 그러나 그 결과를 제 3자에게 제공하는 등의 행위는 법 위반이기 때문에 결과를 다른 사람과 공유하려면 어둠의 방법밖에 없다. 그러나 이 조항이 개선되기는 힘든 것이 프로그램 원 제작자의 저작권 보호와 상충되는 측면이 있기 때문이다. 그래도 미국의 DMCA 같은 싸이코스런 조항보다는 낫지만. (아래 그림의 출처로 가기)

DMCA의 부작용. 한미 FTA 하면서 이런 거 수입해 오면 청와대 까러 간다.

DMCA의 부작용.

이 세상의 모든 프로그램이 자유 소프트웨어가 되지 않는 한 리버스 엔지니어링을 하려는 사람과 이를 막는 사람은 계속 대결 구도를 이룰 것이다.

독재 국가와 철도: 루마니아와 알바니아

우선 들어가기 전에 이 글은 절대로 어떤 나라의 어떤 대통령을 겨냥하고 쓰는 글이 아님을 밝혀 둔다. 단지 인터넷을 돌아다니다 보면서 찾은 재미있는 사례를들 정리해 둔 것 뿐임을 밝힌다.

동유럽 국가들과는 그 동안 교류가 제한되어 왔기 때문에 그들에 대한 정보는 사소한 것이라도 우리 나라 사람들에게는 재미있는 정보가 될 수 있다. 대개의 동유럽 국가들은 한 때 소련의 일부였거나 소련의 영향을 받은 나라들이고, 공산주의가 붕괴되기 전까지 적어도 한 명 이상의 독재자 또는 독재 성향이 강한 정권이 있었던 나라들이다. 대개 이러한 정권의 특징으로는 개발을 중요시했다는 것이며, 일부 나라들은 철도를 개발의 상징으로 삼기도 하였다.

루마니아에는 19세기부터 철도가 깔리기 시작하였다. 제 1차 세계 대전을 주변으로 하여 많은 철도들이 생기고, 또한 기존 철도들도 복선화되기 시작했다. 2차 세계 대전 이후 1947년부터 공산 정권에서는 철도를 산업화의 상징으로 삼았고, 도로 등 다른 교통 수단의 희생을 감수하면서 철도를 깔기 시작하였다. 1960년대부터는 루마니아 수도 부쿠레슈티 주변의 철도들이 차례차례 전철화되기 시작하였고, 전철화와 복선화는 점점 확대되어 1969년 당시 전 노선이 전철화되기도 하였다.

니콜라이 차우세스쿠. 과거 루마니아의 독재자. 출처: http://commons.wikimedia.org/wiki/File:Nicolae_Ceausescu.png

니콜라이 차우세스쿠. 과거 루마니아의 독재자.

이러한 발달된 철도 교통망은 공산 정권이 붕괴되기 전까지만 해도 엄청 탄탄하였으나, 1989년 혁명과 차우셰스쿠 처형 이후로 철도 교통망은 급속히 마비되기 시작하였다. 1960년대의 최첨단 철도는 시간이 갈수록 제대로 관리되지 못하기 시작했고, 공산 정권 당시에 엄청나게 깔아제낀 철도 탓에 이후 세대에서의 관리도 힘들어졌다. 엎친 데 덮친 격으로 경제 위기까지 찾아오면서 철도 차량의 상태도 점점 나빠지기 시작했다.

결국 루마니아 국유 철도는 여러 회사로 분사되고, 일부 자회사는 사유화 단계를 밟고 있기도 하다. 사용 빈도가 적은 각종의 지선 철도를 정리하고, 철도 차량을 현대화하는 각종의 노력 끝에야 철도 교통이 정상화될 수 있었다.

루마니아 철도를 현대화하기 위하여 도입된 지멘스 데지로 디젤 동차. 출처: http://commons.wikimedia.org/wiki/File:Sageata_albastra_in_pitesti_station.jpg

루마니아 철도를 현대화하기 위하여 도입된 지멘스 데지로 디젤 동차.

동유럽의 또 다른 재미있는 나라로 알바니아가 있다. 대부분의 유럽 국가들은 철도를 통해서 잘 이어져 있지만 알바니아만은 예외라고 할 수 있다. 알바니아도 꽤 오랫동안 공산 독재를 경험했던 나라 중 하나이다. 현재의 북한처럼 개인 소유의 자동차가 금지되어 있었기 때문에 알바니아 역시 철도 교통망이 잘 갖춰져 있었다.

알바니아에는 1900년대 중반에 철도가 개통되었다. 2차 세계 대전 당시에 임시로 부설하였던 협궤 철도를 개량하여 간선 철도가 되었다. 알바니아의 독재자 엔베르 호자가 집권하였던 1985년까지만 해도 철도는 깔리고 깔려서, 심지어는 1986년에 국제 철도가 개통되기도 했지만 당시의 (현재도 마찬가지지만) 불안정한 정치와 선로 상황 때문에 여객 영업을 할 엄두는 내지도 못하였다.

엔베르 호자. 과거 알바니아의 독재자. 출처: http://en.wikipedia.org/wiki/File:Hoxhachairart.jpg

엔베르 호자. 과거 알바니아의 독재자.

그러나 호자 사망 이후 더 이상의 철도는 깔리지도 않았고, 설상가상으로 경제 상황으로 인한 차량 도둑과 차량 정비 상태도 심각하다. 그래서 1960~80년대에 중고로 도입한 차량들이 그대로 굴러다니는 일이 비일비재하고 유럽 어지간한 나라에 다 되어 있는 전철화도 전혀 안 되어 있다. 지금은 체코에서 사 온 T669 기관차를 굴리고는 있지만 어지간히 돈이 안 들어가는 이상 이 알바니아 철도를 고칠 엄두를 낼 수도 없다.

알바니아 철도의 객차. 이탈리아에서 사용되었다는 흔적이 그대로 남아 있다. 출처: http://www.angelfire.com/ak/hekurudha/hshpix05.html

알바니아 철도의 객차. 이탈리아에서 사용되었다는 흔적이 그대로 남아 있다.

정리하자면, 이 두 독재자들은 국가 발전을 위해서 철도에 많은 돈을 들였고 독재자 사망 이후 국가의 철도 사업에 중대한 위기가 찾아왔으며, 이를 정상화하기 위해서 많은 노력을 했다는 것이다.

요즘 2MB는 SOC 사업에 집중적으로 투자하고 있다. 대운하가 안 되니 이런 식으로라도 전국토를 공사판으로 벌이는 것이 어쩌면 그로서는 최선의 선택일지도 모른다. 그러나 마구잡이식 SOC 신규 개발과 저 독재자들의 이미지가 겹치는 것은 무엇일까. 한 사람의 철도 동호인으로서는 신규로 철도 노선을 팍팍 깔아 주는 것이 좋긴 하지만, 왠지 저 독재자들의 노선과 겹치는 점이 있어서 씁쓸하다.

Amarok 2와 mpd에서 블루투스 헤드셋 사용하기

Amarok 1.x까지만 하더라도 프로그램 내부적으로 엔진을 선택할 수 있었고, 엔진의 세세한 설정도 프로그램 안에서 할 수 있었다. 그러나 Amarok 2로 올라오면서 KDE 4의 오디오 시스템 Phonon을 사용하게 되었다. 따라서 오디오 출력도 이 놈한테 다 맡겨 버려서 현재의 Amarok 2에서는 오디오 출력을 직접 설정할 수 있는 방법이 없다. 따라서 직접 ALSA 설정을 건드려 줘서 Phonon이 블루투스 헤드셋을 인식할 수 있도록 해야 한다.

ALSA 설정을 편집하려면 ~/.asoundrc, /etc/asound.conf 파일을 건드리면 된다. 여태까지는 전자로 잘 써 왔으나 혹시나 mpd에 관심이 있다면 후자의 파일을 건드리는 것을 추천한다. 여태까지 리눅스에서는 블루투스 헤드셋을 사용하려면 온갖 잡다한 모듈을 설치해야 했으나 이제는 BlueZ에서 바로 오디오 출력을 지원하기 때문에 설정을 잠깐만 해 주면 된다.

하여튼 저 페이지에 있는 것을 참고해서 헤드셋 설정을 대강 적어 주면 된다. 나의 경우 이렇게 설정하였다.

pcm.bluetooth_hw {
type bluetooth
device 맥:주:소:알:아:서
profile "auto"
}
ctl.bluetooth {
type bluetooth
device 어:디:다:써:먹:니
}
pcm.bluetooth {
type plug
slave.pcm "bluetooth_hw"
hint {
show on
description "Bluetooth"
}
}

여기서 주목해야 할 것은 pcm.bluetooth의 hint 부분이다. 아직까지 Phonon은 장치 이름을 100% 완벽하게 인식하지는 않는다. PulseAudio Trac에도 나와 있듯이 이름을 알아낼 수 있는 장치는 알아서 이름을 표시해 주고, 이름을 알아낼 수 없는 장치는 hint를 사용해서 설명을 적어 줘야 한다. 이를 응용하여 블루투스 헤드셋 장치에도 이름을 적어 주었다. 어쨌든 지금까지 과정을 잘 따라왔다면 헤드셋을 어떻게 페어링시킨 다음 시스템 설정 -> 소리로 가 본다.

시스템 설정의 소리 부분

시스템 설정의 소리 부분

맨 아래에 Bluetooth라는 장치가 보이면 성공한 것이다. 이제 이것을 맨 위로 올린 다음 Amarok에서 소리를 재생하면 블루투스 헤드셋으로 소리가 분명히 난다. Amarok을 실행시키기 전 페어링 모드로 바꿔 두는 것이 몸에 좋다.

mpd에서 블루투스 헤드셋을 사용하려면 위 단계를 그대로 따라한 다음, /etc/mpd.conf에 오디오 출력을 하나 추가해 주면 된다.

audio_output {
type "alsa"
name "Bluetooth"
device "bluetooth"
}

mpd 클라이언트가 출력을 바꿀 수 있을 정도로 똑똑하다면 저기 저 블루투스 출력으로 바꿔 주면 헤드셋에서 소리가 난다. 나의 경우 qmpdclient를 사용했고 이 클라이언트는 출력을 바꾸는 것을 다행히도 지원한다.

qmpdclient 설정 화면

qmpdclient 설정 화면

만약 블루투스 헤드셋이 이전/다음 트랙 등의 기능을 지원한다면 uinput 모듈을 올리면 이 기능을 사용할 수 있다.