suckless의 st 터미널을 사용하고 있는데 간혹 한글 입력에서 띄어쓰기 순서가 뒤죽박죽되는 문제가 있었다. 가령 "맑은 물"을 입력하면 "맑 은물"로 입력되는 식이다.

입력하는 속도에 상관없이 이 증상이 가끔 나타나서 불편했었다. 다른 터미널에서는 별 문제 없이 동작하는 점에서 볼 때 st의 문제라고 생각했었는데 urxvt 코드랑 비교해봐도 크게 차이나는 부분은 없었다. 그래서 im 떄문인가 싶어서 fcitx 대신 ibus랑 scim도 설치해서 확인해봤는데 문제가 더 두드러지게 나타났다.

st의 run 함수에서 실제로 전달받는 XEvent를 확인해보면 실제로 띄어쓰기가 가끔 먼저 전달되는 경우를 확인할 수 있었다. XEvent 자체가 비동기라서 순서가 반대로 온다면 fcitx의 문제이거나 컴퓨터 성능탓에 처리 지연이 있다거나 다른 터미널에 비해 가벼워서 사이클 속도가 훨씬 빨라 지연이 눈에 띄게 보인다거나... 그런 가정만 늘어갔다. 10번 입력하면 한 두 번 발생하기 때문에 무엇이 문제인지 판단하기도 어려웠다.

그래서 st 코드를 하나씩 살펴보며 변경할 수 있는 구조는 다 변경해봤다. 그러던 중에 XCreateIC 호출 부분을 수정했는데 일단 순서가 뒤바뀌는 문제는 고쳐졌다! XIMPreeditNothing에서 XIMPreeditNone으로 변경했다. 커서 위치에 표시되는 입력창이 화면 좌측 하단에 고정되어 표시된다.

변경 diff는 다음과 같다. x.c 파일을 수정한다.

diff --git a/x.c b/x.c
index 48a6676..13d6249 100644
--- a/x.c
+++ b/x.c
@@ -1045,7 +1045,7 @@ ximopen(Display *dpy)
 
 	if (xw.ime.xic == NULL) {
 		xw.ime.xic = XCreateIC(xw.ime.xim, XNInputStyle,
-		                       XIMPreeditNothing | XIMStatusNothing,
+		                       XIMPreeditNone | XIMStatusNothing,
 		                       XNClientWindow, xw.win,
 		                       XNDestroyCallback, &icdestroy,
 		                       NULL);

얼마 전 구입한 크롬북에 무엇을 어떻게 설치해서 써야 낮은 사양에서도 편하게 쓸 수 있나 둘러보다가 suckless에서 만든 dwm에 대해 알게 되었다. 레딧에서 자주 보였던 윈도우 관리자라서 이름 정도는 알고 있었지만 그렇게까지 미니멀한게 필요하지 않다는 생각에 찾아보지도 않았었다. 조그마한 메모리 사용까지도 영향을 받는 기기를 쓰다보니 무거운 데스크탑 환경을 벗어나야만 했다.

suckless.org는 공개된 소프트웨어도 흥미롭지만 게시된 웹페이지 내용도 재미있다.

Our project focuses on advanced and experienced computer users. ("Philosophy")

코드 품질에 대한 이야기도 흥미롭다. 직관적으로 문제를 해결하는 코드가 코드 복잡도를 낮춘다는 이야기도 재미있다. 모든 내용이 유익하다고는 할 수 없고 공감이 안되는 부분도 있긴 하지만 소프트웨어가 어떤 맥락에서 만들어졌는지 이해하는데는 큰 도움이 된다.

As the number of lines of code in your software shrinks, the more skilled you have become and the less your software sucks. ("Philosophy")

처음엔 왜 이런 기능도 없어보이는 도구가 필요한가 의아했는데 설치하고 한동안 사용해보니 그 매력에 완전 빠졌다. dwm을 사용하면 tmux의 확장판인 기분이 든다. 프로그램의 모든 창을 타일로 관리할 수 있기 때문이다. tmux는 터미널만 정렬하고 쓸 수 있지만 dwm은 실행할 수 있는 모든 것을 타일로 관리할 수 있다. 물론 타일 외에도 다른 레이아웃도 사용할 수 있고 태그라는 기능으로 다중 윈도우처럼 사용하는 것도 가능하다. 게다가 매우 가벼워서 존재하지 않는 것처럼 느껴질 정도다.

특별히 독특하다고 느낀 부분은 코드 패치인데 프로그램이 모든 기능을 지원하고 설정을 제공하는 것이 아니라는 점이다. 필요한 기능은 별도의 diff 파일로 제공하고 있어서 기능이 필요하지 않으면 아예 바이너리에도 포함되지 않는다. 이런 실용주의적 접근이 아마 도구 자체가 가벼운 이유인 듯 하다. 익숙하지 않다면 분명 복잡한 과정이겠지만.

대략 이런 모습

설치

설치는 직접 받아서 빌드해야 한다. 설정을 위한 파일이 따로 존재하지 않고 config.h에 정의해서 빌드해야 하기 때문이다. c로 작성된 소프트웨어라 컴파일러가 없다면 설치해야 한다.

suckless.org의 dwm 페이지에서 압축 파일로 받거나 git 리포지터리에서 복제할 수 있다.

$ git clone https://git.suckless.org/dwm

먼저 기본 config 파일을 생성해야 한다.

$ make config.h

config.h에서 변경하고 싶은 내용은 변경하면 된다. 그리고 빌드해서 설치한다.

$ make && make install

설치 후에는 로그인 화면에서 dwm을 설치할 수 있도록 /usr/share/xsessionsdwm.desktop을 추가한다.

[Desktop Entry]
Encoding=UTF-8
Name=Dwm
Comment=Dynamic window manager
Exec=dwm
Icon=dwm
Type=XSession

dwm을 효과적으로 사용하려면 동적 메뉴인 dmenu도 설치해야 한다. dwm처럼 suckless의 dmenu 페이지에서 받거나 git 리포지터리를 이용한다.

$ git clone https://git.suckless.org/dmenu/ && cd dmenu
$ make config.h
$ make && make install

이제 로그아웃해서 dwm 세션을 선택해 로그인하면 된다.

단축키

dwm을 시작해보면 아무 것도 없는 휑한 화면만 나온다. 대부분의 기능은 단축키로 사용할 수 있다. 기본 단축키를 기준으로 설명하지만 이 단축키는 모두 config.h에서 추가/수정/삭제가 가능하다.

Shift + Alt + Q      dwm 종료하기
Shift + Alt + Enter  터미널 실행하기
Alt + P              dmenu 열기
Shift + Alt + C      현재 창 닫기

Alt + j, k           창 커서 이동하기
Alt + h, l           마스터 창 크기 조절하기
Alt + d, i           창 마스터/스택으로 이동하기
Alt + Enter          마스터 창과 스택 바꾸기
Alt + 1...9          해당 숫자 태그로 이동하기
Shift + Alt + 1...9  현재 창 해당 태그로 보내기

# 레이아웃
Alt + t               타일 모드
Alt + f               플로팅 모드
Alt + m               모노클 모드

## 플로팅 모드
Alt + 우클릭          창 크기 조절하기
Alt + 좌클릭          창 위치 이동하기
Shift + Alt + Space   플로팅 전환하기

타일로도 충분히 편리하게 사용하고 있어서 플로팅은 거의 사용하지 않고 있다.

우측 상단에 dwm-{버전} 표시는 status라고 하는 영역인데 이 영역 문자열은 다음 명령어로 변경할 수 있다.

$ xsetroot -name "Hello World"

이 상태 영역을 주기적으로 업데이트하는 별도의 도구를 설치하면 편리하다. dwmstatus 페이지에서 상태 모니터 도구를 찾을 수 있다. 나도 하나 간단하게 작성했는데 dwm-simple-status에서 확인할 수 있다.


suckless에서 개발한 다양한 도구를 보고 있으면 나도 이런 가벼운 도구를 만들고싶다는 생각이 자연스레 따라온다. 많은 dwm 포크와 클론을 보면 비슷한 생각을 하는 사람이 많나보다. dwm, dmenu, surf, st 모두 웹사이트에 게시한 철학을 잘 따라서 만들어진 도구라 더 매력적으로 느껴지는 것 같다.

그동안 AT&T의 DirectTV를 인터넷과 함께 번들로 사용하고 있었다. 한국 채널도 나오고 집에서도 한국 방송을 꽤 보고 있기 때문에 이 케이블 TV를 계속 유지했었는데 번들 할인도 끝나더니 최근에 기본 요금도 올랐다. 작년에 크롬캐스트를 사용하면서 대부분 방송은 온디맨드코리아(사랑해요)랑 넷플릭스, 유튜브로 보고 있고 케이블 TV는 정말 가끔 야구나 보는 정도였다.

남 캘리포니아 지역에는 한국 방송을 송출하는 공중파 방송국도 있고 공중파는 처음에 설치하는 장비 값만 들면 계속 무료로 시청할 수 있어서 DirectTV를 해지하고 공중파(OTA; Over-the-air)로 전환하기로 했다.

수신 가능 채널 확인

먼저 집에서 DTV 신호를 받을 수 있는지 확인해야 한다. 아래 웹사이트에서 채널을 얼마나 수신할 수 있는지 확인할 수 있다.

  • DTV Reception Maps 미연방통신위원회에서 제공하는 페이지, 수신 채널 수 확인 가능
  • DTV Gov Maps 수신 감도, 방향, 채널 수 확인 가능

이 지도에서 몇 마일이나 떨어진 거리인가 확인하는 것이 가장 중요하다. 거리가 멀수록 좋은 안테나가 필요하고 가격도 올라간다. 내 경우는 35마일에서 40마일 내외에 모든 채널이 있었다.

안테나 선택

안테나는 수신 거리와 송출 방향에 따라 어떤 종류를 사야하는지 달라진다.

안테나는 크게 설치 위치에 따라 실내용과 실외용으로 나뉜다. 실외는 수신이 잘 되긴 하지만 전문 장비가 없으면 설치하기가 어렵고 새가 집을 만든다거나 날씨의 영향을 받는다거나 여러 문제가 생길 가능성이 있다. 실내는 그런 문제가 덜한 대신 수신은 잘 안될 가능성도 있다는데 신호가 약할 만큼 먼 거리가 아니라서 실내로 설치하기로 했다.

그리고 안테나는 수신 방향에 따라 지향성과 무지향성으로 구분된다. 지향성은 특정 각도에만 수신이 가능한 대신 약한 신호도 더 잘 잡고, 무지향성은 넓은 각도에서 수신할 수 있는 대신 신호가 약하면 잘 수신하지 못한다고 한다. 우리집은 위 지도에서 봤을 때 거의 대부분 송출국이 몰려 있어서 지향성 안테나로 골랐다.

만약 모든 송출국과 거리가 멀고 신호가 약하다면 지향성 안테나를 여러 방향으로 설치해서 신호를 합치는 방법도 있다. 이럴 때는 여러 안테나와 함께 컴바이너(Combiner)를 구입하면 된다. 이 장비는 분배기(Divider)랑 똑같이 생겼고 통합, 분배 둘 다 역할을 할 수 있는 경우도 있다.

구입 장비

집에는 이미 케이블 TV가 설치되어 있었고 이 케이블 TV의 셋톱박스도 안테나 케이블(Coaxial cable)이고 모든 선이 단자함에 연결되어 있었다. 총 3개 방에 연결되어 있었는데 손님 방에도 케이블 연결을 추가하기로 해서 안테나 선을 방 4개로 분배해야 했다. 손님 방 케이블은 아예 케이블 끝에 연결부도 작업되어 있지 않았다.

전에 IP 카메라를 설치하면서 다락에서 단자함으로 내린 Cat5e 케이블이 있었다. 그래서 안테나를 다락 내에 설치한 후에 안테나 케이블을 Cat5e 케이블을 따라서 단자함으로 끌어오기로 했다.

그래서 구입한 장비는 이렇다.

설치

모든 장비에 설명서가 있어서 막히면 찾아보고 따라하면 된다.

  1. 기존에 연결되어 있지 않았던 단자함 내 안테나 케이블에서 손님 방과 연결된 선을 찾아 컨넥터를 부착했다.
  2. 안테나는 미리 조립해 다락에 올려 설치했다.
  3. 안테나 케이블을 연결한 후에 단자함으로 내렸고 새로 구입한 분배기에 연결했다.
  4. 케이블TV 분배기에 연결되어 있던 케이블을 모두 빼서 새 분배기에 연결했다.
  5. 새로 만든 손님방 케이블도 분배기에 연결했다.
  6. 각 티비에 연결된 DirectTV 중계기에서 안테나 케이블을 빼서 티비에 직접 연결했다.
  7. 각 티비마다 안테나 신호를 사용하도록 채널 검색을 수행했다.
  8. 티비에서 가장 자주 보는 채널과 가장 안나오는 채널을 틀어놓고 안테나의 방향을 조금씩 조절해서 가장 잘 나오는 방향으로 맞췄다.

다락에 설치한 안테나

다락에 설치한 안테나. 지주에 못질하고 싶지 않아서 나무판에 고정했다.

문제 해결

단자함 내에 연결되지 않은 안테나 케이블이 많았다. 어느 케이블이 손님 방과 연결되어 있는지 확인해야 했었는데 별 장비도 없고 그래서 일단 손님 방에 티비를 벽에 있는 케이블 단자와 연결했다. 안테나도 미리 조립했기 때문에 안테나에 케이블을 연결한 후, 케이블 끝을 단자함에 있는 모든 케이블에 하나씩 가져다 대보고 티비 화면에 간섭이 나타나는지 확인했다. 티비는 신호를 잡지 못하고 있기 때문에 지직거리는 화면이 출력되고 있었다. 다행히 10개 케이블 중 하나에서 깜빡이는 간섭을 확인할 수 있었다. 최종적으로 연결해서 확인해보니 손님 방에 연결된 케이블이 맞았다.


이전에 IP 카메라를 설치하면서 익숙해졌던 것도 있어서 그런지 생각보다 손쉽게 설치할 수 있었다. 지출이 줄어든 만큼 다른 구독 서비스도 덜한 죄책감으로 사용할 수 있을 것 같다.

Windows에 Hyper-V로 Ubuntu를 설치한 후에 제공하는 도구로 접속해보면 마우스도 느리게 움직이고 키보드 입력도 답답하다.

이 문제를 해소하기 위해 고급 세션 모드(enhanced session mode)가 추가되었다. 내부적으로 RDP를 이용해서 해당 가상 컴퓨터(VM)에 접속하는 방식이다. Windows 10 버전 1709 이후로 제공되는 Hyper-V 빨리 만들기 (Quick Create) 프로그램에서는 이 고급 세션 모드를 기본적으로 사용할 수 있도록 설정된 Ubuntu VM을 제공하고 있다.

하지만 직접 리눅스 이미지를 사용해서 VM을 생성했다면 별도의 설정이 필요하다. 해당 설정을 위한 스크립트는 microsoft/linux-vm-tools에서 제공하고 있다. 해당 스크립트에는 linux-virtual 관련 툴 설치, xrdp 설치 및 설정이 포함되어 있고 각 항목마다 주석으로 설명이 있어서 어떤 도구가 설치되는지 궁금하다면 확인해보자.

설치한 Ubuntu는 19.10이며 위 스크립트는 18.04인데 설치에 큰 차이가 없었다. 16대 버전은 다른 설치파일이 존재하므로 위 링크를 참조해야 한다.

  1. Ubuntu 새 이미지를 받아서 빨리 만들기 프로그램을 사용해 VM에 설치한다.

  2. Ubuntu VM을 구동해서 root 권한으로 설치 스크립트를 실행한다.

    $ wget https://raw.githubusercontent.com/microsoft/linux-vm-tools/master/ubuntu/18.04/install.sh
    $ bash install.sh
    
  3. 필요에 따라 VM을 재시작한 후 다시 스크립트를 실행한다.

  4. 설치가 완료되면 VM을 종료한다.

  5. Windows PowerShell을 관리자 권한으로 실행한 후에 다음 명령으로 해당 VM의 고급 세션 모드를 활성화한다. <VM_NAME>은 VM 이름으로 바꿔야 한다.

    Set-VM -VMName "<VM_NAME>" -EnhancedSessionTransportType HvSocket
    
  6. Hyper-V 관리자에서 VM을 실행하면 VM이 구동된 후 해상도 선택 화면이 나온다. 선택 후 접속한다.

  7. xrdp 로그인 화면이 나온다. 로그인하면 세션이 시작된다.

여전히 느린 부분도 있긴 하지만 마우스 커서가 버벅이거나 키보드 입력이 느린 현상은 확실히 개선되었다.


비행기가 터뷸런스에 요동친다. 2년 반 만에 가는 한국행인데 도무지 잠을 잘 수 없어서 자신 없는 회고를 쓴다. 예전에는 자신 있게 이런 이런 삶을 살았다고 회고도 힘차게 적어갈 수 있었는데 올해는 좀 자신이 없다. 잘한 일도 있고 못 한 일도 있었다. 좋았던 일과 잘한 일에 감사하고 아쉬운 점을 반성하고 내년에는 개선하는 계기가 되었으면 좋겠다.

좋았던 일

올해 학교에 등록해서 첫 학기를 보냈다. 영어로 듣는 수업은 처음이라 걱정이 컸다. 학기 내내 잘 할 수 있을까, 잘하고 있는가 고민을 계속 할 수밖에 없었다. 영어 작문 수업에서 누구보다도 유창한 언변으로 의견 내는 학생이라든지, 캘큘러스에서 교수님께 진도 나가지 않은 내용을 질문한다든지, 기초 스페인어에서 교수님과 스페인어로 대화하는 학생이라든지, 나 자신과 비교하게 되는 대상이 너무 많아서 불안함이 더 컸던 것 같다. 다행히 경제 수업엔 그런 학생은 없었고 고등학교에서 들었던 수업도 있고 내용도 재미있어서 의외로 힘이 되는 수업이었다. 캘큘러스는 수리용어를 영어로 잘 몰라서 다른 애들이 하는 질문을 몰래 적어두고는 집에 와서 찾아보기도 했다. 영어 에세이 쓰는 데 정말 오래도록 고민하고도 간신히 낼 때도 있었지만 재미있었다. 난 늘 영어 작문을 못 한다고 생각했는데 매번 써서 낼 때마다 돌아오는 피드백에 자신감이 붙었다. 그런 고민과 자잘한 노력이 통했는지 다행히 괜찮은 성적으로 첫 학기를 마무리했다. 좋은 성적을 받았다고 해서 잘 안다는 의미는 아닌 것이 분명하다. 여전히 티끌만큼 아는 기분이다.

첫 학기를 끝내고 나서 학교에 다녀야겠다는 결정은 정말 잘 내렸다 싶었다. 물론 혼자서도 공부할 수 있긴 하겠지만 수업에 명확한 목표가 제시되고, 학습 내용을 물어볼 교수님이 있고, 스스로 공부할 수 있도록 많은 과제와 자료를 제공해주는 환경이 너무 행복하다. 학교 가지 않아도 충분히 혼자 할 수 있다는 말을 전공자/비전공자 얘기 나올 때마다 들었는데 그런 얘기에 혼자 해보려다 제대로 끝내지 못했던 경험도, 그래서 스트레스받았던 일도 생각났다. 혼자서 모든 것을 준비하고 배우는 일이 쉽지 않다는 점을 알아서 그런지 이런 교육을 받을 수 있다는 것에 감사하다. 오히려 제공되는 부분을 100% 활용하지 못하는 기분이 들 정도인데 다음 학기엔 더 체계적으로 시간을 관리할 필요를 느낀다. 아직 컴퓨터 관련 수업은 듣지 않았지만 벌써 기대가 된다.

타이머 앱을 출시했다. 만드는 과정에서 주변의 도움도 많이 받았고 출시 이후에도 좋은 사용자도 만날 수 있었다. “앱을 만든다”는 말에 정말 많은 프로세스가 녹아 있었고 이 작은 앱을 만들고 알리는 과정에서도 많은 부분을 배웠다. 앱 이야기는 다른 글에서 더 할 수 있을 것 같다. 만들며 생각했던 목표는 애플 개발자 프로그램 비용만큼 수익 만들기, 다운로드 1만 건이었다. 이번 2019년 12월 30일이 프로그램 만료였고 앱으로 만든 수익으로 연장할 수 있었다. 이 앱에 쓴 시간만큼 외주했으면 훨씬 나은 사정이 되었겠지만... 내년에도 계속 다듬고 업데이트를 진행하게 될 텐데 더 효율적으로 시간을 사용할 수 있도록 계획을 세워야겠다.

아내와 함께 많은 시간을 보냈다. 서로 각자 바쁜 삶을 살다가도 저녁이면 함께 마주하고 음식도 만들고 시간도 보낸다는 그 삶 자체가 내게 많은 위로와 힘이 되었다. 지금도 조급함과 불안감이 불쑥 나와서 나를 괴롭게 할 때가 간혹 있지만, 예전보다 많은 안정을 찾았다. 곁에서 보며, 함께 지내며 배우는 것이 많다. 누구보다도 나에게 든든한 지원자가 되어주는 아내에게 너무나도 고맙다.

아쉬운 점

운동을 완전 않았다. 매달 운동한다고 돈을 내지만 근처에도 가지 않았다. 결국 연말에 해지했다.

기록을 별로 남기지 않았다. 트위터에도 그렇고 블로그도 그렇고 많이 뜸해졌다. 그래서 회고하려고 보니 은근 얼렁뚱땅 보낸 해처럼 느껴졌다. 더 많이 기록해서 반성과 개선의 주기를 만들자.

앱 만든다는 핑계로 오픈소스 활동이나 커뮤니티 활동이 거의 없었다. 시간을 좀 더 관리했더라면 이런저런 일을 더 할 수 있을 텐데 결과적으로 아무 일도 하지 않았다. 예전보다 큰 시차 탓인지 대화도 어려운 것 같고 감정을 오해하는 일도 잦은 것 같다. 도움이 되지 못하는데 내가 자리를 차지하고 있는 것은 분명 문제다. 쇄신이 필요하다!

내년엔,

  • 독서하기
  • 운동량 늘리기
  • 회고 주기적으로 하기
  • 시간 관리하기

매년 책을 더 읽고 싶다고 하지만 제대로 소화하는 책이 거의 없다시피 한다. 책은 계속 사면서도 몇 장 읽지 않고 침대 옆 책장에 차곡차곡 쌓이고 있다. 올해는 어떻게든 일간 독서 할당량을 만들어서 읽어야겠다.

운동 부족을 몸으로 느끼고 있는데 식습관도 개선할 필요가 있고 살도 빼야 한다. 너무 뻔한 신년 계획인데 늘 여행을 하고 싶어 하면서도 막상 가면 체력 부족으로 아무것도 제대로 즐기지 못하는 내 모습이 너무 싫다. 등산도 자주 가고 더 많이 걸어야겠다.

예전엔 그래도 어떻게 지내는지도 글로 쓰고 개선하려고 노력을 많이 했는데 과제와 시험 홍수에 빠져서 살다 보니 정말 앞에 놓인 일에만 급급하게 되는 것 같다. 회고라고 하니 거창한 것 같지만 짧게라도 주마다, 월마다 정리하고 어떻게 개선할 수 있을지 고민해보고 싶다. 이 노력에는 기록도 포함된다. 좀 부지런히 글로 남기고 읽고 복기하고 개선해야겠다.

시간을 좀 더 효율적으로 사용할 수 있도록 노력해야겠다. 좀 더 시간을 밀도 있게 쓰면 더 많은 일을 할 수 있을 것 같은데 되돌아보면 제대로 계획을 세우지 않아서 낭비한 시간도 적잖은 것 같다. 잦은 회고로 계획을 자주 리뷰하고 개선할 수 있어야겠다.

나에게

누구보다도 내 편이어야 하는 내가 나를 공격하게 두지 말자. 나는 나를 너무 잘 알아서 가장 아픈 부분만 골라서 찌른다. 나에게 친절하게 대하자. 바쁘다는 이유로 주변에 감정적으로 대하지 않도록 조심하자. 모두 각자의 자리에서 치열한 전투를 하고 있음을 알고 서로에게 위로하고 힘이 되어주자. 선한 영향을 주는 사람이 되자.


다음 학기는 랩도 있고 시간도 늦게 끝나는 수업이 있어서 저번 학기보다 더 체력 관리가 절실하다. 연계 과목이라 더 중요한 수업도 많은데 좀 더 차분하게 시간을 잘 관리해서 학기를 마무리했으면 좋겠다. 가을 학기와 봄 학기 사이는 너무 짧다. 짧은 한국 방문이더라도 좋은 에너지로 무장하고 다시 달려야겠다.

웹사이트 설정

웹페이지 색상을 선택하세요

Darkreader 플러그인으로 선택한 색상이 제대로 표시되지 않을 수 있습니다.