"마트가서 우유 하나 사고 아보카도 있으면 6개 사와" 요즘 숏폼으로도 많이 돌아다니길래 재미삼아서. 가장 먼저 코드를 작성하기 전에 요구사항을 잘 읽는다.

  • 마트가서: 가야 할 장소
  • 우유 하나 사고: 품목과 수량, 수행해야 할 작업
    • 사고: AND
  • 아보카도: 품목
    • 있으면: 조건 (있으면 사고 없으면 안사도 되는)
    • 6개 사와: 수량과 수행해야 할 작업

정리하면

  • 구입할 물건과 수량: 우유 1개, 아보카도 6개
  • 구입해야 하는 장소: 마트
  • 조건: 아보카도는 있으면 구입

명시되지 않은 상황과 조건은 다시 확인이 필요하다.

  • 우유는 없고 아보카도만 있으면 아보카도만이라도 사올지
  • 마트 간 곳에 우유가 없으면 다른 마트라도 가서 우유 사와야 하는지
// 마트가서 우유 하나 사고 아보카도 있으면 6개 사와

function okJob1(person, place) {
    person.purchase("milk", 1, place)
    if (place.has("avocado")) {
        person.purchase("avocado", 6, place)
    }
}

function okJob2(person, place) {
    person.purchase("milk", 1, place)
    place.has("avocado") && person.purchase("avocado", 6, place)
}

function buggyJob(person, place) {
    // 아보카도가 있으면 우유 6개 사온다는 설정은
    // 코드로 봐도 좀 이상한 결정인 것 같은데
    // 세상은 넓고 요구사항은 다양하니까...
    person.purchase("milk", place.has("avocado") ? 6 : 1, place)
}

대략 이런 구현을 사용해서 일을 잘 정리했는지 테스트해본다.

class Location {
    constructor(name, inventory) { this.name = name; this.inventory = inventory; }
    has(item) { return this.inventory.includes(item); }
}

class Person {
    constructor(name) { this.name = name; }
    purchase(item, count, location) {
        console.log(`${this.name} purchased ${count} ${item} from ${location.name}.`)
    }
}

const memberOfHousehold = new Person("Spouse");
const marketWithAvocado = new Location("market", ["milk", "avocado"]);
const marketWithoutAvocado = new Location("market", ["milk"]);
okJob1(memberOfHousehold, marketWithAvocado);
// Spouse purchased 1 milk from market.
// Spouse purchased 6 avocado from market.

okJob1(memberOfHousehold, marketWithoutAvocado);
// Spouse purchased 1 milk from market.

okJob2(memberOfHousehold, marketWithAvocado);
// Spouse purchased 1 milk from market.
// Spouse purchased 6 avocado from market.

okJob2(memberOfHousehold, marketWithoutAvocado);
// Spouse purchased 1 milk from market.

buggyJob(memberOfHousehold, marketWithAvocado);
// Spouse purchased 6 milk from market.

buggyJob(memberOfHousehold, marketWithoutAvocado);
// Spouse purchased 1 milk from market.

간 김에 이것저것 장을 많이 봐서 올 것 같은데. 내일 아침은 아보카도 토스트 해야겠다.

Google Chrome을 주로 사용하고 있는데 언제부터인지 브라우저 내 PDF 뷰어가 엄청 느려졌다. Mozilla의 pdf.js가 Chromium 확장을 제공하고 있어서 설치해봤는데 만족스럽다. Manifest V2로 작성된 확장이라서 크롬 웹 스토어에 있는 버전은 더이상 관리되지 않는 것 같다. 그래도 직접 빌드를 한 경우엔 아직까지도 문제 없이 설치할 수 있다.

$ git clone https://github.com/mozilla/pdf.js.git && cd pdf.js
$ npm install --global glup-cli
$ npm install
$ glup chromium

Google Chrome에서 chrome://extensions를 연 후 좌측 상단에 Load unpacked 버튼을 클릭, 그리고 pdf.js 폴더 내에 build/chromium을 선택하면 확장을 설치할 수 있다. Firefox에 내장되어 있는 pdf 뷰어와 동일하게 동작한다.

2018년 중순에 구입한 싱크패드를 계속 사용하고 있었다. 구입할 당시에 가장 고민했던 부분이 바로 디스플레이였는데 Costco에서 판매하는 모델은 밝기가 상당히 낮은 디스플레이를 탑재하고 있었다. 들고 다니는 용도라서 FHD면 베터리도 더 오래가고 매트 코팅이라서 눈도 피로하지 않겠다 생각하고 구입을 결정했었다. 사용에 큰 불편함은 없었지만 창을 여럿 열고 개발을 하거나 여러 자료를 동시에 봐야 할 때는 낮은 해상도와 어두운 화면이 계속 거슬렸다.

교체를 할 수 있나 찾아보다가 생각보다 시도한 사람도 많고 방법도 잘 정리되어 있었다. 탑재된 FHD는 250 nit에 1920x1080 인데 HDR WQHD는 500 nit에 2560x1440 까지 지원한다. 학기 사이 방학동안 교체할 마음으로 부품을 주문했다.

전체적인 순서와 제품은 레딧에 올라온 글을 참고했다.

시간 여유가 있었으면 필요한 부품을 알리익스프레스에서 구입했을 텐데 다음 학기가 코앞이라 eBay에서 미국 내 배송하는 곳을 찾아 주문했다. 위 글에서는 상판 커버도 교체했는데 FHD 커버(01YR430)와 WQHD 커버(01YU642) 사진을 찾아보니 차이가 없는 것 같아 일단 교체해보고 문제가 생기면 그때 커버를 구입하기로 결정했다.

그리고 전면 베젤이 스티커라는 걸 처음 알았는데 조심히 뜯어서 다시 붙이기로 했다.

  • 00NY679 14인치 WQHD 디스플레이 ($139.99)
  • 01YR429 WQHD용 40-pin eDP 케이블 ($23.14)

디스플레이 판매하는 곳이 실제로 어떤 디스플레이인지 메시지 보내서 물어봐야 한단다. 그렇지 않으면 호환 규격은 맞지만 다른 제품으로 보내주는 경우가 많다고. 나는 00NY679 불렀는데 00NY680이 왔다. 호환은 되지만 찜찜.

Part # Brand Brightness Color space
00NY679 AUO B140QAN02.0 WQHD HDR 500nit 100% sRGB, 89% adobeRGB
00NY680 Japan Display JDI LPM140M420 WQHD HDR 500nit no reviews found
00NY664 LG Display LP140QH2(SP)(B1) QWHD non-HDR 300nit 98% sRGB, 68% adobeRGB
00NY681 AUO B140QAN02.3 WQHD non-HDR 300nit 96% sRGB, 61% adobeRGB
01YN103 BOE NV140FHM-N46 FHD non-HDR non-touch 250nit 59% sRGB & 38% adobeRGB

내 랩탑은 20KG 모델이고 교체 방법은 레노보 웹사이트에 잘 정리되어 있었다. 영상 따라서 분해하고 조립했는데 전혀 어려움이 없었다.

교체 직후에 여름 학기가 시작되어서 또 바빠졌다. 아무래도 무광에서 유광 디스플레이로 바뀌고 나니 자꾸 내 얼굴이 보이는 문제가 있었다. 아마존에서 저렴한 14인치 반사 제거 필름을 붙여서 해결했다.

아이폰 디스플레이와 비교했을 때 엄청 어두웠는데 교체 후 최대 밝기는 아이폰보다 밝다. 실제로 사용해보니 70% 정도만 설정해도 편하게 쓸 수 있었다. 다만 베터리 소모가 조금 많아졌는데 크게 와닿을 정도로 사용 시간이 줄어들진 않았다.

그동안 다른 랩탑 디스플레이도 여러 차례 교체해봤는데 가장 편하게 교체한 모델이다. 아무래도 기업에서 많이 사용해서 그런지 교체 방법도 공개적으로 정리되어 있고 파트 정보도 쉽게 찾을 수 있는 게 흥미로웠다.

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 모두 웹사이트에 게시한 철학을 잘 따라서 만들어진 도구라 더 매력적으로 느껴지는 것 같다.

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 로그인 화면이 나온다. 로그인하면 세션이 시작된다.

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


얼마 전에 중고 Dell Latitude E7240을 100달러 주고 구입했었다. cpu는 i3지만 램도 넉넉하고 ssd도 달려 있어서 그런지 개발 장비로도 큰 무리 없을 것 같아 장만했다. 리눅스 머신을 갖고 싶었는데 너무 적절한 노트북이였다.

디스플레이가 TN패널인 게 단점이었다. 검색해보니 시중에 IPS 모델도 있기도 했고 그러면 IPS 패널만 사다가 교체하면 되는 것 아닐까 싶었다. 찾아보니 실제로 구입해서 교체한 글도 찾을 수 있었다.

문제는 그 검색했던 스레드에 페이지네이션이 너무나도 작았고 그 뒤에 더 많은 이야기가 있다는 점이었다. 그 사실을 알리익스프레스에서 구입하고 패널을 받고 교체하기 위해 노트북을 다 뜯고나서, 패널이 맞지 않는다는 사실을 알고 나서야 알게 되었다. 세상에. 그래서 다른 패널을 또 다시 주문했고 오늘 드디어 도착해서 교체했다.

새로 구입한 패널은 LP125WH2-SPM1 이다. 이 패널도 완전하게 100% 맞지는 않는다. 원래 패널보다 몇 mm 정도 넓어서 상판 지지대 같이 생긴 부분에 닿는다. 프레임 커버가 엄청 헐렁한 플라스틱 소재고 조립해도 크게 문제가 생기지 않을 것 같아서 그대로 두고 조립했다.

일단 IPS라서 시야각이 전혀 없다시피 하고 밝기도 훨씬 개선되었다. 이제는 유튜브 틀어도 전혀 거슬리지 않는다. 기존 TN 패널보다 한 2mm 정도 padding이 있어서 프레임에 딱 맞지 않는다. 워낙 화면이 좋으니까 별로 문제 없다.

뜯는 방법은 유튜브 영상을 보고 했다. 후면만 뜯으면 패널을 쉽게 교체할 수 있다.

구입은 알리익스프레스에서 했고 패널 정보는 panelook.com에서 확인했다. 구입 전에 패널 이름, 디스플레이 실측 크기와 edp의 lane을 잘 확인하자. 패널 이름이 일반적으로 규격 자체를 의미하는 경우가 많은 것 같다. 그리고 edp의 lane이 다른 경우에는 edp 케이블도 구입해야 하고 뜯어야 하는 범위도 커지니 주의하자. 그리고 가장 큰 복병이 패널 하단에 있는 PCB다. 사진 보면 검정 테이프로 처리되어 있는데 이 폭이 달라서 장비에 안맞을 수 있으니 구입 전에 잘 본다. 그리고 나사 구멍 수가 다르거나 위치가 다를 수 있으니 잘 확인하자.

패널을 두 차례 구입했어도 총 지출은 노트북 포함 270달러 정도다. 예전에 사용하던 인스피론 모델 최하위 사양이 300달러였던걸 생각하면 뿌듯하다. 이제 열심히 쓰는 일만 남았다!

그동안 트위터 공웹을 사용했었는데 트윗덱으로 바꿨다.

  • 공앱이랑 디자인이 거의 비슷하다. 그냥 공앱인데 다른 버전 쓰는 느낌 정도다.
  • 공앱 같은데 광고가 (아직) 없다. 최고.
  • Home을 숨기고 리스트만 보이게 만들었다. 그동안 단축키로 리스트를 왔다갔다 했는데(G-i) 리스트 오가는 귀찮음이 줄었다.
  • 키워드 뮤트도 가능하고, 각 리스트마다 별도의 exclude를 지정할 수 있어서 추가적으로 더 걸러낼 수 있다.
  • 순서라든지 크기라든지 리스트, 노티, 검색결과 등 개인화 할 수 있는 부분이 많아 좋다.
  • 다른 계정 같이 사용하는 경우에 편하다.
  • Ready to Tweet? 체크박스를 활성화해서 쓰는데 쓰기 전에 맞춤법도 다시 보고 트윗 계정이 맞는지도 보기 쉽고 좋다.
  • 의외로 리트윗 숫자랑 마음 숫자가 바로 보이는 것이 정보를 읽는데 있어서 편향을 만드는 것 같다. 별거 아닌데도 숫자가 크면 왠지 읽어야만 할 것 같은 기분도 들고 그러는데 트윗덱은 그런 표시가 목록서는 보이지 않는다.
  • 예약 트윗이 가능하다. 아직 쓰진 않았지만 이거 하려고 buffer 썼던거 생각하면 편리하다.

계정 표시 방법도 3개나 제공하고.

얼마 전에 트위터가 처음으로 흑자 냈다는 얘기가 있었는데 계속 잘 되었음 좋겠다.

맥북 프로 키보드에 불만족스러워서 그런지 회사에서도 미팅 때마다 사람들이 들고 들어온 노트북을 계속 눈여겨 보게 되었다. 3년 전까지는 델 납품을 받았는데 그 이후로는 레노보를 사용하고 있어서 Dell Latitude랑 XPS, Lenovo Thinkpad 13, Thinkpad T740, 요가 시리즈 정도를 대부분 들고 다녔다. Acer 쓰는 사람도 좀 있었고. 그 중에 sysadmin 하는 분들이 노트북에 리눅스 설치하고 다니는거 보고는 나도 하나 그런 노트북 있으면 좋겠군 싶어서 검트리에서 적당한 가격에 이것저것 설치하고 놀 수 있는 노트북을 찾고 있었다.

그러다가 Dell Latitude E7240를 $100에 구입했다. 원래 $150에 구입하기로 했고 판매자가 보기로 한 장소에 나갔는데 판매자가 약속을 잊었다고 미안하다고 할인해주고 다음 날 집 앞으로 가져다줬다. 40도 넘는 더위를 뚫고 갔다가 돌아오는게 좀 짜증나긴 했지만 역시나 막상 받고나니 다 기분이 풀렸다.

구입한 모델은 i3긴 했지만 8GB 램에 128GB SSD였다. 좀 지난 모델이긴 하지만 울트라북이고 가벼워서 만족스러웠다. $300에 구입했던 인스피론보다 훨씬 안정적이고 빨라서 너무 만족스럽다. TN 패널인게 아쉽지만 찾아보니 IPS로도 모델이 있길래 교체에 문제가 없을 것 같아 IPS 패널도 하나 주문했다.

그런 후에 무슨 배포판을 설치할까 고민했다. 뭘 설치할 일이 있으면 늘 고민 없이 우분투를 설치했었다. Archlinux 좋다는 얘기를 계속 듣기도 했고 arch를 사용하지 않아도 그 위키에서 도움을 받은 적이 많아서 이번엔 arch를 설치하기로 했다. lxde나 그놈을 사용했는데 KDE로 설치해보기로 했다.

Archlinux는 위키에 모든 단계가 잘 정리되어 있어서 따라하기만 하면 된다! 는 생각보다 좀 환상이었다. 설치하기 위해서는 이거 이거 보면 된다 그러고 링크를 누르면 또 엄청난 분량의 설명이 나온다. 그래서 설치하면서 했던 단계를 간단하게 정리했다. 기본적으로는 설치 가이드와 동일하다.

설치 전

archlinux iso를 받아서 usb에 설치한다. Etcher를 사용하면 손쉽게 이미지를 usb에 넣을 수 있다. 이 usb를 노트북에 꽂고 부팅한다. bios에서 부팅 순서를 확인하고 usb를 가장 먼저 읽도록 설정한다.

부팅이 다 되면 root 계정에 로그인 된다. 먼저 인터넷을 연결한다. wiki 설치 안내에서는 안나오는데 wifi 접속할 수 있는 dialog 스크립트를 제공한다.

# wifi-menu

만약 wifi 드라이버를 인식하지 못하면 스크립트가 동작하지 않는데 그럼 위키에서 설명하는 방식 따라서 직접 연결해야 한다.

파티션 설정은 cfdisk 또는 fdisk를 사용한다.

# cfdisk

내 경우에는 sda1 (bootable), sda2 (50GB, home), sda3 (4GB, swap)으로 설정했다.

# mkfs.ext4 /dev/sda1
# mkfs.ext4 /dev/sda2
# mkswap /dev/sda3
# swapon /dev/sda3

드라이버를 마운트한다.

# mount /dev/sda1 /mnt
# mkdir /mnt/home
# mount /dev/sda2 /mnt/home

설치

본격적인 설치 전에 가까운 미러 서버를 선택한다. /etc/pacman.d/mirrorlist 열어서 가까운 서버를 최상단으로 옮긴다. 내 경우는 swin.edu.au를 가장 위로 올렸다.

이제 호스트 드라이브에 리눅스를 설치한다.

# pacstrap /mnt base base-devel

설정한 디스크 설정을 호스트 드라이브에 저장한다.

# genfstab -U /mnt >> /mnt/etc/fstab

chroot로 호스트에 접속한다.

# arch-chroot /mnt

일단 사용에 필수적인 패키지를 설치한다. vim은 필수고, wifi_menu는 dialog에 의존성이 있고 WPA를 사용하면 wpa_supplicant도 설치해야 한다.

# pacman -S vim wpa_supplicant dialog

이제 타임존 설정이 필요하다. /usr/share/zoneinfo/ 안에 적합한 타임존을 찾아서 링크를 추가한다.

# ln -sf /usr/share/zoneinfo/Australia/Melbourne /etc/localtime

하드웨어 시간을 맞춘다.

# hwclock --systohc --utc

로케일을 설정한다.

# locale-gen
# echo LANG=en_AU.UTF-8 > /etc/locale.conf
# export LANG=en_AU.UTF-8

hostname 설정과 host를 설정한다.

# echo "ed-dell" > /etc/hostname
# echo "127.0.0.1 ed-dell" >> /etc/hosts

Grub 설치한다. bootable로 지정한 첫 파티션에 grub을 설치하면 된다.

# pacman -S grub
# grub-install /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg

root 비밀번호를 설정한다.

# passwd

설치된 패키지를 최신 버전으로 갱신한다. 미러에서 바로 설치했기 때문에 실제로는 별다른 내용 없이 지나가지만 그래도 한다.

# pacman -Syu

이제 종료하고 USB를 제거하고 켜면 설치된 arch를 사용할 수 있다.

# exit
# reboot

KDE 설치

KDE 페이지를 보고 설치하면 된다. 임시로 wifi-menu를 사용해서 인터넷을 연결한다. 그리고 아래 패키지를 설치한다.

xf86-video-intel은 그래픽카드 드라이버인데 본인에게 맞는걸 설치해야 한다. 목록은 Xorg를 참조한다.

# pacman -S xorg
# pacman -S xf86-video-intel
# pacman -S sddm
# pacman -S plasma-desktop
# pacman -S kde-applications
# pacman -S kdeplasma-addons # 네트워크 매니저가 포함됨

root 대신 사용할 계정을 생성한다.

# useradd -d /home/edward edward
# passwd edward
# echo "edward   ALL=(ALL) ALL" >> /etc/sudoers

sddm을 설정한다.

# sddm --example-config > /etc/sddm.conf

/etc/sddm.conf을 열어서 autologin을 설정한다.

[Autologin]
User=edward
Session=plasma.desktop

KDE를 사용하면 wifi-menu가 더이상 필요 없다. 그 전에 네트워크 매니저 서비스를 켠다.

# systemctl enable NetworkManager.service

bluetooth를 사용한다면 몇가지 패키지를 더 설치한다.

# pacman -S bluez bluez-utils
# systemctl enable bluetooth.service
# systemctl start bluetooth.service

한국어 설정

fcitx로 설치하고 싶은데 제대로 동작을 안해서 일단 ibus를 설치했다.

# pacman -S ibus ibus-hangul

/etc/locale.gen에 ko_KR을 추가한다.

ko_KR.UTF-8 UTF-8

/etc/locale.conf도 변경한다.

LANG=ko_KR.UTF-8
LC_COLLATE=ko_KR.UTF-8

/etc/xprofile를 열어서 다음 내용을 추가한다.

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon -d -x

물론 우분투보다 복잡하게 느껴지긴 하지만 (그게 우분투의 셀링포인트이기도 하고) 직접 설치하지 않으면 전혀 설치가 안되고 설정도 안되는 그런 환경이 OS에 대한 애착을 만드는 기분이다. 만자로를 사용하면 좀 더 쉽게 설치할 수 있다고 한다.

시에라 이후로 Karabiner를 쓸 수 없게 되었는데 그나마 Karabiner-elements가 존재해서 그나마 다행이다. 맥에서는 언어 전환을 조합키로 사용하는 설정이 기본이다. 익숙해지면 그래도 괜찮긴 하지만 오늘따라 불편하게 더 느껴져서 어떻게 할 방법이 없나 찾아봤다.

키보드에 존재하지 않는 키를 언어 전환 키로 설정하면 우측 command 키를 해당 키로 설정하는 것으로 가능했다.

내 경우는 F16을 언어 전환키로 설정했다. 먼저 설정에서 Keyboard > Shortcuts > Input Sources > Select the previous input source 를 찾는다. 여기서 ^space 같이 키가 이미 지정되어 있을 것이다.

그리고 터미널을 열고 다음 명령을 실행한다.

sleep 5 ; osascript -e 'tell application "System Events"' \
          -e 'key code 106' \
          -e 'end tell'

키 코드 106 즉, F16 키를 입력하라는 내용의 애플 스크립트를 실행한다. 명령을 입력하면 바로 키를 누르기 때문에 5초 지연을 위해 sleep을 추가했다. 입력 후 5초 이내로 아까 열었던 키보드 설정에서 ^space를 더블 클릭하고 기다린다. 지연되었던 스크립트가 실행되면서 키보드에 존재하지 않는 F16이 입력이 된다.

이제 Karabiner-Elements를 실행한다. Simple Modifications에서 right_command를 f16으로 설정하면 끝난다.

처음엔 키보드에 나오는 F12로 설정해보려고 했는데 볼륨 조절 키로 연결이 되어서 생각처럼 되질 않았다.

색상을 바꿔요

눈에 편한 색상을 골라보세요 :)

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