맥을 Docker remote host로 사용하기

배경

작업 PC로 인텔 아이맥 27인치를 사용한다. 디스플레이가 괜찮은데다 램을 128기가로 넉넉하게 구성해서 유용하다. 그런데 CPU 발열이 심한 편이라서 CPU 과부하가 심할 땐 과열로 시스템이 뻗곤 한다. 그래서 작업 PC로 사용할 맥 스튜디오를 샀다. 가격이 부담스러워서 램 용량이 적은 32기가 메모리 모델을 샀는데, 램을 주로 점유하는 것들을 아이맥에서 띄워 서버용으로 사용할 계획이기 때문이다.

램을 많이 사용하는 것 중 하나는 Docker이다. 그래서 아이맥을 Docker remote host용으로, 간단히 말해서 Docker 서버용으로 사용하도록 설정하기로 했다. 그런데 Docker를 서버로 구동할 dockerd는 Linux에서 동작하며, Mac OS는 지원하지 않기 때문에 virtualbox를 이용해 Linux를 가상화하여 Guest OS로 구동하여 Docker를 사용한다. 따라서 아이맥에 virtualbox로 Linux를 설치하고, 그 가상화로 구동하는 Linux에 구성한 dockerd를 사용해야 한다. Host OS인 Mac OS와 Guest OS인 Linux 간 네트워크도 연결해주고.

귀찮기도 하고 웬지 무겁고 비효율적일 것 같은데, 이 글에서 사용할 Docker desktop 대체재인 OrbStack을 사용하여 쉽게 설정하고 가볍게 동작하는 환경을 구성할 수 있다.

  • 아이맥 : Ventura 13.4
  • Docker client : OrbStack

Docker 설치

  • Docker remote host인 아이맥에 OrbStack 설치.
  • 원격으로 접근할 client인 맥스튜디오에도 설치.

Docker engine을 daemon으로 구동할 Ubuntu 서버 구성

$ orb create --arch amd64 ubuntu my-ubuntu

아이맥이 인텔맥이라서 아키텍쳐를 amd64로 지정했다.

Linux machine을 만들고 나면 ssh로 접근 가능하다.

$ orb -m my-ubuntu -u default

기본으로 생성되는 계정 이름이 default이다. 기본으로 존재하는 root로 접근해도 된다.

Linux machine을 생성하면 OrbStack이 이 ubuntu에 ssh로 접근할 수 있게 ssh host configuration을 자동으로 만들어줘서 더 적게 타이핑하여 접근할 수 있다.

$ ssh orb

orb가 OrbStack이 만든 ssh host configuration이다.

# ~/.orbstack/ssh/config
# 이 파일은 ~/.ssh/config 에서 Include 하도록 OrbStack이 설정한다.

Host orb
  Hostname 127.0.0.1
  Port 32222
  # SSH user syntax:
  #   <container>@orb to connect to <container> as the default user (matching your macOS user)
  #   <user>@<container>@orb to connect to <container> as <user>
  # Examples:
  #   ubuntu@orb: container "ubuntu", user matching your macOS user
  #   root@fedora@orb: container "fedora", user "root"
  User default

  # replace or symlink ~/.orbstack/ssh/id_ed25519 file to change the key
  IdentityFile ~/.orbstack/ssh/id_ed25519

  # only use this key
  IdentitiesOnly yes
  ProxyCommand '/Applications/OrbStack.app/Contents/Frameworks/OrbStack Helper (VM).app/Contents/MacOS/OrbStack Helper (VM)' ssh-proxy-fdpass /Users/hannal
  ProxyUseFdpass yes

Docker engine 설치

충돌날만한 불필요한 패키지 제거

$ for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

Docker repository 설정

HTTPS로 repository에서 패키지를 가져와 설치해야 하므로 관련 패키지를 설치한다.

$ sudo apt update
$ sudo apt install ca-certificates curl gnupg

Docker의 공식 GPG 키를 추가한다.

$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg

Docker repository를 등록한다.

$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# repository를 새로 등록했으니 update 해준다.
$ sudo apt update

Docker 공식 repository에서 패키지를 가져와 설치한다.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Docker를 system 서비스로 등록한다

$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service

Remote access되도록 docker 설정

/etc/docker/daemon.json에 설정하거나 systemd에서 docker 서비스 실행에서 인자로 지정하거나. 여기에선 후자 방법으로 했다. daemon 설정이 더 늘어나면 그때 분리하려 한다.

후자 방법은 /etc/systemd/system/docker.service.d/override.conf 파일을 편집하는 것이다. 이런 단위 구조는 edit 명령을 사용하면 구성된다.

$ sudo systemctl edit docker.service

이제 /etc/systemd/system/docker.service.d 디렉터리가 생기고 그 안에 override.conf 파일이 만들어지는데, 그곳에 dockerd 실행 유닛을 작성한다.

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375

-H 옵션은 Docker daemon 소켓이 연결할(사용할) 호스트를 지정한다. -H fd://는 Unix file descriptor로 호스트 연결을 하는 것이고, -H tcp://127.0.0.1:2375127.0.0.1:2375 TCP IP로 연결하는 것이다. -H fd://는 기본(default) 옵션이고, TCP로 원격 접근하도록 -H tcp://... 옵션을 추가한 것이다.

systemd service 스크립트를 수정하지 않고 override.conf를 수정하는 이유는 자동으로 override.conf가 포함되기 때문이다. sudo systemctl status docker.service 명령을 실행해 확인해보자.

$ sudo systemctl status docker.service

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/docker.service.d
             └─http-proxy.conf, override.conf
     Active: active (running) since Sun 2023-08-13 17:54:09 KST; 1h 24min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 12127 (dockerd)
      Tasks: 20
     Memory: 24.6M
        CPU: 973ms
     CGroup: /system.slice/docker.service
             └─12127 /usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375

Drop-In에 보면 include한 conf 파일 중 하나인 override.conf가 명시되어 있다.

systemd service script를 변경했으니 systemd가 해당 script를 다시 적재하도록 하고, docker를 재실행한다.

$ sudo systemctl reload docker.service

$ sudo systemctl restart docker.service

Mac OS에 TCP forwarding 설정

Docker remote host에 Linux machine을 만들어 docker daemon을 띄웠으니 외부에서 이 host에 접근해 docker host에 접근하도록 TCP 포워딩을 한다. Linux machine에 하는 것이 아니라 Linux machine를 guest OS로 구동한 Host OS인 Mac OS에 설정하는 것이다. 내 경우는 아이맥에 하는 것이다.

원격 로그인 설정

[System Settings] - [General] - [Sharing]에 들어간다(한국어로 뭐라고 나오는지는 모르겠다). Remote Login(원격 로그인?)을 활성화한다. ssh daemon을 사용할지를 설정하는 것이다. 느낌표 아이콘을 클릭하면 ssh로 접근을 허용할 계정을 지정하는 화면이 나온다. 난 Administrators는 빼고 내 개인 계정을 추가했다.

다른 Host에서 ssh로 접근 가능한지 테스트 해본다. 난 맥 스튜디오에서 아이맥으로 접근하는 것이다.

$ ssh -i ~/.ssh/id_rsa hannal@ip-address

잘 된다. 타이핑하기 귀찮으니 ssh host 설정을 해준다.

# ~/.ssh/config 파일

Host imac
  HostName ip주소
  User hannal
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
  PasswordAuthentication no

이제 호스트명인 imac으로 간편하게 접근된다.

$ ssh imac

이 ssh host인 imac은 ssh 호스트가 필요한 곳엔 어디에서든지 사용할 수 있으므로 설정해두면 편리하다.

SSH daemon에 TCP forwarding 허용 설정

/etc/ssh/sshd_config 파일을 열어 AllowTcpForwardingGatewayPorts 설정을 추가하거나 주석을 해제한다.

AllowTcpForwarding yes
GatewayPorts yes

이런 설정을 하는 이유는 OrbStack은 보안을 이유로 OrbStack이 관리하는 Linux machine에 원격으로 접근하지 못하기 때문이다. OrbStack이 구동한 localhost에서만 접근 가능하다.

ssh daemon 설정을 변경하면 ssh daemon에 반영되도록 재실행해야 한다. 앞서 [Sharing]에 있던 [Remote Login]을 비활성화했다가 다시 활성화하면 된다.

Client 설정

Client, 즉, 램이 32기가 뿐인 맥 스튜디오에 있는 docker가 아이맥에 있는 docker를 서버로 사용하도록 지정하는 건 대개 두 가지 방법 중 하나로 한다.

DOCKER_HOST 환경 변수 사용

환경변수인 DOCKER_HOST에 docker가 사용할 host를 지정하는 방법이다.

$ export DOCKER_HOST=imac
$ docker-compose up

# 또는

$ DOCKER_HOST=imac docker-compose up

하지만 환경변수는 실수하기 십상이니 다른 방법을 사용한다.

docker context 사용

docker에서 제공하는 context 기능을 이용하는 것이다. 먼저 Docker remote host인 imac에 대한 context를 만든다.

$ docker context create --docker host=ssh://imac imac-docker

imac-docker는 context 이름이다. 잘 만들어졌는지 확인해본다.

$ docker context list

NAME            DESCRIPTION   DOCKER ENDPOINT       ...
default *       Current ...   unix:///var/run/docker.sock
imac-docker                   ssh://imac
orbstack        OrbStack      unix:///Users/hannal/.orbstack/ ...

default가 기본으로 존재하고, OrbStack을 설치하면 orbstack도 생긴다. 이들을 포함하여 방금 만든 imac-docker context가 목록에 나온다.

docker context는 use 보조 명령어로 사용한다.

$ docker context use imac-docker

Current context is now "imac-docker"

이제 docker는 imac-docker context에 지정된 Host에 연결한다. 확인해보자. imac-docker context를 지정한 상태에서 docker container를 구동한다.

$ docker-compose up

[+] Running 4/0
 ✔ Container redis      Created                     0.0s
Attaching to redis

아이맥에 있는 docker에 컨테이너가 구동된 것이라면 맥 스튜디오에 있는 docker에는 구동된 컨테이너가 없을테니 그걸 확인한다.

$ docker context use default

$ docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

아무 컨테이너도 없다. 아이맥에 있는 docker를 확인해본다.

$ ssh imac

$ docker ps

CONTAINER ID   IMAGE                ...
2b806a9e441e   redis:7              ...

잘 떠있다. 이렇게 5K 해상도 디스플레이가 달린 Docker 서버를 마련했다.

뜻밖의 공지

그나저나 오랜만에 블로그에 글 올리려고 jekyll을 실행하니 설치에서 시간 낭비했고, 동작도 느리다. hugo로 이전해보려 했는데, 깔끔하게 이전되지도 않는다.

요즘엔 글을 안 쓰기도 하고, 관리하는 것도 은근히 신경 쓰이니 이 참에 개인 블로그를 닫아야겠다.

2003년부터 운영해온 개인 블로그는 2023년 8월 13일자로 닫습니다. 그동안 한날의 개인 블로그에 와주신 분들께 감사 인사 드립니다.


2021년을 마치며

어째 이 블로그에 회고만 올리는 것 같다. 1쪽에 2년치 회고가 나란히 나열되는 게 민망하니 2022년엔 분발해야겠다.

몸 건강

작년부터 올해 상반기까진 몸을 치료하고 재활했다. 연초에 필라테스를 시작해서 일주일에 한두 번씩 다니고 있는데, 운동 수행 능력은 거의 안 는 것으로 보인다. 직업병은 다소 나아졌다.

올해엔 백신을 여섯 방 맞았다. 코비드19 세 번, 독감 한 번, A형 간염 두 번. 이 정도면 우리 동네 백신대장 정도는 되겠지? 코비드19 1차 접종은 좀 힘들었지만 그래도 2~3일 감기몸살 앓는 정도로 지나갔고, 2차 접종은 감기 기운 도는 정도로 지나갔고, 3차 접종은 내 왼쪽 어깨에도 근육이 있다는 걸 인지하는 정도로 지나갔다. 생각해보면 어느 백신이든 난 부작용을 안 겪거나 거의 안 겪는 것 같다.

정신 건강

연초부터 개인사가 겹치며 제대로 정신이 털렸다. 그 시기엔 혼란스럽긴 해도 정서나 정신 체계에 영향을 받지 않고 있다고 여겼는데, 내게 문제가 일어나고 있다는 걸 2분기에 깨달았다. 두드러진 증상은 집중력 저하와 의욕 감소, 상황 과소 평가와 나 자신에 대한 과대 평가, 그리고 수면 장애였다.

한 달 정도 쉬니 기분이 다소 나아졌지만, 집중력 저하와 수면 장애는 별 차이가 없었다. “아무리 봐도 ADHD인데…”라고 ADHD인 지인이 내게 한 말도 있고 해서 정신과에서 검사를 받았다. ADHD 의심 진단을 받고 약을(콘서타) 먹기 시작했는데, ADHD 사람들이 말하는 극적인 변화는 아쉽게도 경험하지 못했다. 차이가 있긴 있다.

수면 장애는 좀 더 차이나게 약 효과를 봤다. 효과를 빠르게 봐서 수면제인 줄 알았는데 우울증 약이라고 한다. 평소 우울감을 모르며 지낸다. 정확히는 기복 없이 낮고 평평한 감정과 정서를 유지하며 산다. 하지만 우울감이 도드라지지 않은 것일 뿐 뇌에선 우울증이 일어나는 호르몬 변화가 있었나 보다. ADHD약은 조금씩 증량해서인지 소문과(?) 달리 천천히 변화를 체감하고, 우울증약은 빠르게 효과를 봤다. 과거형인 이유는 식욕 부진이 심해져 약을 바꿨는데, 식욕 부진은 해소됐지만 수면 질이 안좋아졌기 때문이다.

취미

정신과에 가기 전에 정신 건강 회복을 위해 새로운 취미 활동을 시작했다. 실용음악학원에서 보컬과 드럼을 배우는데, 드럼은 좋아하는 악기여서 선택했다. 보컬 수업은 목 안 쉬고, 편안하게 말하면서도 전달력 있는 목소리로 대화하고 싶어서 등록했다. 스피치 학원을 가는 게 맞지만, 온라인에서 스피치 관련 강의 몇 개를 들어보니 나와 안 맞아서 출석을 제대로 안 할 것 같았다.

드럼 수업은 재밌는데, 안 그래도 사지가 동기화 되어 움직여서 답답한데 악보 읽느라 박자 따라가기도 벅차다. 생소한 문법이나 패러다임인 프로그래밍 언어로 작성된 코드를 읽는 느낌이다. 음표를 봐야 하는데 음표 간격으로 박자를 세는, 눈이 본질이 아닌 것에 현혹되는 함정에 자꾸 빠진다. 그런 내 모습이 답답하고 재밌다.

보컬 수업은 의지력을 꽤 발휘하며 출석하고 있다. 난 내 목소리가 탁성에 톤이 낮다고 생각했는데, 탁한 음색은 아니며 탁한 소리가 나는 건 발성이 좋지 않아서 그럴 거라고, 그리고 음역대가 남성 평균보다 조금 높다는, 생전 처음 듣는 피드백을 받았다. 내가 공감하지 못하는 걸 느꼈는지 바리톤 치고는 조금 더 높다는 것이지 고음 또는 초고음역대는 아니라고 부연해주었다.

집중의 질

ADHD약을 복용하면서 집중하는 질이 좋아졌다. 여전히 극적인 변화를 체험해보진 못했다. 과열된 CPU의 클럭을 낮춰 다소 느리게라도 동작하는 것처럼 내 두뇌는 더 느려진 것 같다. 초반엔 시간이 빨리가는 건 체감해서 집중력이 좋아져 몰입하니 시간이 빨리간 것인가 싶었는데, 좀 더 관찰해보니 아니었다. 엄청난 중력이 미치는 공간에 내가 들어서서 내 시간선이 느려진 느낌에 더 가깝다. 다른 시간선은 다를 바 없는 속도인데 내 시간이 느려져서 상대적으로 시간이 빨리 가는 것 같다. 내 사유체는 여전히 불쑥 끼어드는 다른 생각이나 사건(event)에 쉽게 붙잡혀 끌려간다. 그래서 초반엔 무능감이 커졌다.

그럼에도 약효가 있다고 여기는 이유가 있다. 사유체가 어딘가로 끌려가는 상황을 예로 들면, 예전엔 순순히 투항한 것처럼 그대로 동행했다. 약 복용하면서부터는 즐겁게 따라가다 뿌리치고 다시 원래 맥락으로 돌아오는 데 성공하는 사건이 포착된다. 약 용량을 늘려가자 실은 동행이 아닌 납치라는 걸 또렷하게 인식하게 됐고, 납치되었다 되돌아오는 데 성공하는 빈도가 늘고 있다.

여러 생각이 비슷한 영향력(가치, 우선순위)으로 머릿 속에서 날뛰고 시시각각 생기는데, 이 부분에도 변화가 있다. 양자요동 치듯 머릿 속에서 날뛰는 생각들이 다소 줄었다. 개체(생각) 수와 날뛰는 강도가 줄었으며, 무엇보다도 각 생각이 뿜어대는 영향력 차이를 가늠하는 게 점점 더 수월해진다. 온갖 생각이 시시각각 생기고 움직이는 현상(증상?)이 없어지진 않지만, 가장 영향력을 내는 생각을 찾아내고 그 놈을 놓치지 않은 채 따라가는 게 수월해져서 덜 혼란스럽다. 아니, 이전엔 누구나 다 그렇다고 마땅하게 여겨서 그런 상태를 혼란스럽다고 느낀 적이 없었다. 사람에 따라서는 그 상태를 혼란이나 혼돈이라고 느낀다면, 나 역시 그 느낌을 이젠 좀 알게 된 것 같다.

ADHD가 아닌 사람은 평소에 머릿 속에 떠있는 생각 개수가 적거나, 많더라도 순번이나 영향력 같은 것이 있어서 정렬을 하며 사는 건가?

42Seoul

42Seoul에 비상근 멘토로 참여해 여러 교육생분들을 멘토링했다. 탐나는 분을 여럿 만났다. 현업에서 뛰는 비상근 멘토가 멘토링하는 과정에서 교육생들 데려가도록 만드는 것이 비상근 멘토 제도의 목적 중 하나로 있는 게 분명하다.

멘토링하다보니 단골처럼 몇 가지 주제가 반복되는 걸 알게 됐다. 2022년엔 블로그에 이 주제에 관해 글쓸 예정이다. 멘토링하며 나눈 이야기를 다루는 게 아니라 멘토링 단골주제 자체를 소재로 삼는 것이다.

좋은 경험을 주는 멘토링은 뭔가 가르쳐주거나 도와야겠다는 의지가 충만한 채 멘토링하는 경우 보다는 멘티가 얘기 나누고 싶은 게 많아서 그가 이야기를 이끌어가며 이야기를 주고 받을 때, 그리고 멘토링 한 번으로 끝나지 않고 멘티와 피드백을 주고 받으며 멘토와 멘티 간 맥락이 유지되고 올라간 상태에서 진행한 멘토링이 좋은 경우가 많다. 예를 들어, 한 멘티는 이력서에 대해 두 번 멘토링을 했는데, 멘토링 과정에서 변화하는 각 버전 별 차이가 잘 구분이 되었다. 그 차이가 간접적인 피드백인 셈이다. 그래서 멘토링이나 코칭에 대한 여러 고민 주제 중 자연스럽게 피드백 루프를 형성하여 멘토링하는 내 만족도를 높이는 부분도 고민하고 있다.

3분기에 한 달 정도 쉬면서 방향성 없이 손에 잡히는대로 책을 읽었다. 상당히 효율 떨어지게 읽었다. 이해하고 배우며 읽는 게 아니라 다 읽는 데 목표를 두었다. 읽은 책을 다시 읽기도 했는데, 읽었다는 사실과 내용을 까먹어서 처음 보는 것 마냥 읽다가 예전에 책에 남긴 메모를 발견하는 식이다. 올해에 40권 정도 읽었는데, 3분기에 32권을 읽었다. 32권 중 20권은 400쪽이 넘는데, 대체로 기술서다. 책을 느리게 읽는 편인데도 이럴지니, 어쩌면 비지도학습으로 자연어 학습을 훈련하는 기계보다도 더 언어 활동을 안 했을지도 모른다.

그렇게 대충 읽었지만, 그래도 몇 권 꼽아본다.

  • 좋았던 책 : High output management
  • 리더십, 코칭 : 유능한 관리자, 개발 7년차 매니저 1일차, 두려움 없는 조직, 코칭 리더십(존 휘트모어)
  • 현실 도피를 도와준 책 : 죽음의 수용소에서, 블랙홀과 시간여행, 수학이 필요한 순간, 물리의 정석
  • 재밌게 본 책 : 엘리너 올리펀트는 완전 괜찮아
  • 기대 안 했는데 좋았던 책 : 제텔카스텐 - 글 쓰는 인간을 위한 두 번째 뇌
  • 먹고 사는 데 도움을 준 책 : JavaScript로 함수형 프로그래밍 학습하는 책들, 전문가를 위한 파이썬, 프로덕트 리더십, 테스트 주도 개발로 배우는 객체 지향 설계와 실천, 돈의 심리학

아참, 3분기에 책을 읽으며 두 번 산 책 몇 권을 발견하는 성과도 있다.

제텔카스텐

얼마 전부터 메모하는 방법과 체계를 제텔카스텐(zettelkasten)에 맞춰가고 있다.

제텔카스텐을 단순하게 소개하자면, 임시 메모를 기록하고, 그 메모를 자신의 언어로 즉 자신의 생각으로써 문헌 노트나 영구 노트로 정리한다. 문헌 노트나 영구 노트로 정리하고 나면 임시 노트는 제거한다. 문헌 노트와 영구 노트는 서로 연결하여 상향식으로 아이디어 군집(cluster)을 형성하는데, 연결하는 과정도 문헌 노트와 영구 노트를 작성하는 것처럼 자신의 생각(아이디어)이 기준이다. 제텔카스텐에 대한 메모이더라도 ADHD에 관한 내 생각이 메모와 노트를 작성한 이유라면, 그 메모엔 ADHD 관련 키워드를 달고 그 키워드와 관련된 기존 메모와 연결한다.

지인 소개로 제텔카스텐을 처음 접할 땐 별 감흥이 일진 않았는데, ADHD를 치료하는 최근에 비로소 관심이 생겨서 시도하고 있다. 한 달 정도 됐는데, 아직 성과는 없다. 이쯤되면 대개는 내게 안 맞다고 여기고 포기하는데, 내 취향에 맞을지도 모른다는 생각을 한 일이 있었다.

난 임시 메모를 남발하고 있으므로 제텔카스텐을 제대로 실천하는 건 아니다. 생각보다 까다롭고 시간이 많이 들다보니 자꾸 미루고 있는데, 며칠 전부터 임시 메모 몇 개를 문헌 노트로 정리하기 시작했다. 책 구절은 기억 안 나는데다 문헌 노트로 정리한 임시 노트는 삭제하다보니 책을 읽으며 남긴 메모인데도 책에 대한 내용은 안 남고 책에 대한 내 생각이 남았다.

글을 읽다보면 글을 쓴 글쓴이가 어떤 생각을 했는지, 어떤 사람인지 머릿 속에서 모델링이 이뤄진다. 아무 글이나 그렇진 않고 내 취향이나 성향에 맞으며 글쓴이의 생각이 드러나고 잘 쓴 글이어야 한다. 난 몇 달에 한 번씩 내 옛날 글 몇 개를 다시 읽는데, 내 글을 읽으면서 글쓴이, 그러니까 나에게서 독립/분리된 인격체로서 저 글을 쓴 글쓴이에 대한 모델링이 가끔 이뤄진다. 못쓴 글이지만 내가 쓴 글이니 가끔 그런 경험을 하는데, 바로 이 지점이다. 과거에 쓴 내 글로 인물을 모델링하는데, 그 인물이 나 혹은 나와 매우 비슷한 부류라고 느껴지는 인물이기에 사진이나 동영상 보다도 더 입체감 있게 과거 속 나를 보는 내 취향을 제텔카스텐 방법으로 남기고 꺼내보는 것이다.

이 회고는 초고를 작성하는 데 40분, 퇴고하는 데 90분 걸렸다. 이 정도 시간을 들여서 쓴 글이 이 수준이라 마음이 아프다. 적어도 이 부분만큼은 제텔카스텐으로 개선할 수 있을 것 같다.

2022년 계획

집필하고 있다. 2022년이면 8년차가 된다. 계약 당시 1.6 버전이던 Django는 2022년 중에 4.0 버전대로 접어든다. 음… 계약한 출판사에서는 왜 기다려주는 거지. ㅜㅜ 2022년엔 반드시 초고를 완료하겠다.

몇 가지 주제로 블로그 글 혹은 적절한 매체나 방법으로 컨텐츠를 만들려 한다. 색다른 것도 있고, 아닌 것도 있다.

팀을 만들고 있고, 내년엔 더 적극 집중과 관심을 투자할 계획이다.

퇴고하며 거의 분량 반 정도를 쳐냈는데도 여전히 참 말 많다. 내가 말 많다는 걸, 심지어 갈수록 많아지는 걸 느낀다. 말 줄이는 노력도 계획에 넣어본다.