카테고리 보관물: Tools & Tips

Emacs: Buffer is read-only

원격 서버에 접속해서 개발을 마치고 커밋을 정리하려고 git rebase -i <base_commit>를 하는데 “Buffer is ready-only”가 뜨면서 rebase를 수행할 수 없는 문제가 생겼다.

로컬에서 사용하는 Emacs에서는 이런 문제를 겪은 적이 없었는데 원격 서버에서는 git-rebase-todo 버퍼를 읽기 전용으로 읽어 버리는 문제가 생기는 것이다. 이 문제를 해결하는 방법은 두가지 정도가 있다.

방법1: Read-only 강제 전환

특별한 문제가 있어서라기 보다는 모종의 이유로 special mode가 활성화 되어서 read-only가 걸린 상태가 되는 것일 뿐이므로 C-x C-q로 쓰기모드로 강제 전환해서 수정을 해도 별 문제가 없다. 다만, 이후로도 git rebase -i 명령어를 수행할 때 마다 강제 전환을 해줘야 한다는 사소한 문제가 있을 뿐.

방법2: git-rebase-mode-hook 설정

매번 버퍼를 강제 변환하는 과정을 귀찮으니 아예 git rebase mode일 때 read-only를 강제로 푸는 방법도 있다. init file의 뒷쪽에 다음을 추가해 준다.

...

;; git rebase를 수행할 때 read-only 걸리는 문제 수정
(add-hook 'git-rebase-mode-hook
  (lambda ()
    (read-only-mode -1)))

Rust와 Python unit test의 공존

예전 글에서 vscode의 test explorer에 Rust의 unittest가 보이도록 설정하는 방법을 다룬 적이 있었는데, 여기에 Python test case (여기서는 pytest)도 함께 표시되도록 하려면 .vscode/settings.json을 편집해 주어야 한다.

해당 프로젝트의 경우 가상환경을 source root에 두지 않고 서브 디렉토리인 service/.venv 안에 넣어 두었기 때문에 python.defaultInterpreterPath 값을 이곳으로 직접 설정해 주고 pytest 사용을 위한 설정도 해 두었다.

{
    // Rust unit test
    "rust-analyzer.testExplorer": true,

    // Python virtual environment용 인터프리터 설정
    "python.defaultInterpreterPath": "${workspaceFolder}/service/.venv/bin/python", 
    
    // pytest 사용
    "python.testing.pytestEnabled": true,
    "python.testing.unittestEnabled": false,

    // Python unit test가 있는 디렉토리 경로
    "python.testing.pytestArgs": [
        "service/test"
    ],
    "python-envs.defaultEnvManager": "ms-python.python:venv"
}

그리고 나서 vscode GUI에서도 다시 한번 venv를 설정해 준다. 그냥 프로그램을 재 실행 했으면 이 부분은 건너 뛰어도 되었을 것 같긴 한데, 오류가 계속 뜨길래 수동으로 설정해 주었다.

이렇게 하고 나면 test explorer에 두 언어의 test case들이 모두 표시되는 평화로운 공존상태가 된다.

[Tip] 포트 포워딩 설정 상태에서 VNC SSH Tunneling

VNC SSH Tunneling에 대해 다룬 적이 있었는데, macOS에서 기본 제공되는 Screen Sharing 같은 app으로 접속하려면 SSH 터널링을 설정하는 GUI가 없으므로 해당 포스팅의 “SSH Tunneling 설정이 없는 경우” 항목의 안내에 따라 다음과 같은 명령어를 터미널에 입력하고 localhost의 5999번 포트로 연결을 시도하면 된다고 했었다.

# SSH 터널링.
# 22번 SSH 포트를 통해 리모트의 5901번 VNC 포트를 로컬의 5999번 포트에 연결
ssh -L 5999:localhost:5901 <user_id>@<vnc_server_ip>

그럼 만약 22번이 아닌 포트 포워딩을 사용하고 있는 경우라면 어떻게 해야 할까?

사내에 있는 워크스테이션들에 각각 65530 부터 65531까지 포트로 access할 때 포워딩이 이루어 지도록 설정해 둔 상태라고 하면, 22번 포트가 아닌 특정한 포트로 포워딩을 수행하고 있으므로 이 값을 -p 옵션과 함께 작성해 주어야 한다. 예를 들어 포워딩하고 있는 포트의 번호가 65530이고 이를 통해 5901에서 돌고 있는 VNC를 내 localhost의 5999번 포트에 연결하고자 한다면 명령어는 다음과 같다.

# SSH 터널링.
# 65530번 SSH 포트를 통해 리모트의 5901번 VNC 포트를 로컬의 5999번 포트에 연결
ssh -L 5999:localhost:5901 -p 65530 <user_id>@<vnc_server_ip>

그리고 나서 macOS의 Screen Sharing에서는 다음과 같이 설정하고 VNC로 접속한다.

명령어가 너무 길다면

~/.ssh/config 환경 설정파일에 LocalForward를 다음과 같이 추가해 주면 매번 긴 명령어를 타이핑하지 않아도 된다.

# ~/.ssh/config
Host <host_name>
  HostName <vnc_server_ip>
  Port 65530
  User <user_id>
  LocalForward 5999 localhost:5901

이후 부터는 터미널에서 간단히 ssh <host_name> 명령어만 수행해도 Screen Sharing을 통해 VNC로 접속할 수 있다.