기타 흥미로운 주제들

Table of Contents

키보드 매핑

프로그래머가 사용하는 주 입력 장치는 키보드입니다. 컴퓨터에 있는 대부분의 장치처럼 키보드도 자유롭게 설정이 가능합니다(또한 그럴 가치가 있습니다).

가장 기본적인 설정은 키를 다시 매핑하는 것입니다. 여기에는 일반적으로 이벤트를 감지하는 소프트웨어가 있어 특정 키를 누를 때마다 해당 이벤트를 가로채서 다른 키에 해당하는 다른 이벤트로 대체합니다. 예를 들면,

임의의 명령에 키를 매핑할 수도 있습니다. 특히 자주 사용하는 작업에 유용합니다. 여기서 일부 소프트웨어는 특정 키 조합을 인식하고 이벤트가 감지될 때마다 스크립트를 실행합니다.

다음 예시처럼 더 복잡한 구성도 가능합니다.

키보드 매핑을 시작하는 데 도움이 될 참고 자료:

데몬

단어 자체는 생소하게 들리겠지만 여러분은 이미 데몬의 개념에 익숙할 것입니다. 대부분의 컴퓨터에는 사용자가 시작하고 상호작용할 때까지 기다리지 않고 항상 백그라운드에서 실행되는 일련의 프로세스가 있습니다. 이러한 프로세스를 데몬이라고 하며 데몬으로 실행되는 프로그램은 종종 이를 나타내기 위해 d로 끝납니다. 예를 들면 SSH 데몬인 sshd는 SSH 요청을 수신하고 원격 사용자가 로그인하는데 필요한 자격을 가졌는지 확인하는 프로그램입니다.

리눅스에서 systemd(시스템 데몬)는 데몬 프로세스를 실행하고 설정하기 위한 가장 일반적인 솔루션입니다. systemctl status를 실행해 현재 실행 중인 데몬 리스트를 나열할 수 있습니다. 대부분 생소하게 들릴 수도 있지만, 네트워크 관리, DNS 쿼리 해결, 시스템 그래픽 인터페이스 표시 같은 시스템에서 핵심적인 역할을 담당합니다. Systemd는 systemctl명령어와 상호작용해 서비스를 활성화, 비활성화, 시작, 종료, 재시작 하거나 서비스의 상태를 확인할 수 있습니다(이는 systemctl 명령입니다).

더 흥미로운 점은 systemd에는 새로운 데몬이나 서비스를 구성하고 활성화하기 위해 접근하기 쉬운 인터페이스가 있습니다. 다음은 간단한 파이썬 앱을 실행하기 위한 데몬의 사례입니다. 자세한 설명은 생략합니다.

# /etc/systemd/system/myapp.service
[Unit]
Description=My Custom App
After=network.target

[Service]
User=foo
Group=foo
WorkingDirectory=/home/foo/projects/mydaemon
ExecStart=/usr/bin/local/python3.7 app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

일정한 빈도로 프로그램을 실행하고 싶다면 굳이 데몬을 만들 필요는 없습니다. 시스템이 이미 실행 중인 데몬인 cron을 사용하여 예약된 작업을 수행할 수 있습니다.

FUSE

현대 소프트웨어 시스템은 일반적으로 작은 빌딩 블록으로 구성됩니다. 파일 시스템이 지원하는 작업에 대한 공통 언어가 있기 때문에 운영 체제는 다른 파일 시스템 백엔드 사용을 지원합니다. 예를 들면 touch로 파일을 만들 때, touch는 커널에 파일을 생성하라고 시스템 콜을 하고 커널은 적절한 파일 시스템 호출을 실행해 파일을 생성합니다. 주의할 점은 UNIX 파일 시스템은 전통적으로 커널 모듈로 구현되며 커널만 파일 시스템 호출을 수행할 수 있다는 것입니다.

FUSE (Filesystem in User Space)를 사용하면 사용자 프로그램에서 파일 시스템을 구현할 수 있습니다. FUSE를 사용하면 사용자가 파일 시스템 호출을 위한 사용자 공간 코드를 실행한 다음 필요한 호출을 커널 인터페이스에 연결합니다. 실제로 이것은 사용자가 파일 시스템 호출에 대해 임의의 기능을 구현할 수 있음을 의미합니다.

예를 들어 FUSE를 사용하면 가상 파일 시스템에서 작업을 수행할 때마다 해당 작업이 SSH를 통해 원격 시스템으로 전달되어 원격 시스템에서 수행되고 출력이 다시 사용자에게 반환됩니다. 이런 식으로 로컬 프로그램은 파일이 실제로는 원격 서버에 있지만 사용자의 컴퓨터에 있는 것처럼 볼 수 있습니다. 이것이 sshfs가 하는 일입니다.

FUSE 파일 시스템의 몇 가지 예를 첨부합니다.

백업

백업하지 않은 데이터는 언제든지 영원히 사라질 수 있는 데이터입니다. 데이터를 복사하는 것은 간단하지만 안정적으로 백업하기는 어렵습니다. 다음은 백업의 기본 사항과 일부 접근 방식의 함정입니다.

일단 동일한 디스크에 데이터 사본을 두는 것은 백업이 아닙니다. 디스크는 모든 데이터에 대한 단일 실패 지점(SPOF)이기 때문입니다. 마찬가지로 집에 외장 드라이브를 두는 것 또한 화재, 절도 등의 위험이 있으므로 취약한 백업 솔루션입니다. 대신 오프사이트 백업을 추천합니다.

동기화는 백업이 아닙니다. 예를 들면 Dropbox나 GDrive는 편리하지만 데이터가 유실되거나 손상되면 변경 내용이 그대로 반영됩니다. 같은 이유로 RAID와 같은 미러링 디스크 솔루션 또한 백업이 아닙니다. 랜섬웨어에 의해 데이터가 삭제되거나 손상, 암호화되면 도움이 안 됩니다.

좋은 백업 솔루션의 핵심은 버전 관리, 중복 제거 및 보안입니다. 백업 버전 관리를 통해 파일의 변경 내역을 확인하고 효율적으로 복구할 수 있습니다. 효율적인 백업 솔루션은 변경 사항만 저장해서 저장 오버헤드를 줄이는 데이터 중복 제거 방식을 사용합니다. 보안과 관련해 누군가가 당신의 데이터를 읽거나 더 나아가서 당신의 모든 데이터와 관련 백업 파일을 삭제하는데 필요한 정보가 무엇인지 자문해야 합니다. 마지막으로, 맹목적으로 백업을 신뢰하는 것은 그다지 좋은 생각이 아닙니다. 정기적으로 백업을 사용해 데이터를 복구할 수 있는지 확인해야 합니다.

백업 대상은 컴퓨터의 로컬 파일, 그 이상입니다. 웹 애플리케이션의 엄청난 성장으로, 데이터 상당 부분이 클라우드에만 저장됩니다. 예를 들어 해당 계정에 접속할 수 없으면 웹메일, SNS에 업로드한 사진, 스트리밍 서비스의 플레이리스트, 온라인 문서는 사라집니다. 정보의 오프라인 사본을 갖는 것이 가장 좋은 방법이며 사람들이 데이터를 가져와 저장하기 위해 구축한 온라인 도구를 찾을 수 있습니다.

자세한 설명은 2019년 백업 강의 노트를 참고하세요.

API

이 수업에서는 컴퓨터를 보다 효율적으로 사용해 로컬 업무를 수행하는 방법에 대해 많은 이야기를 나눴지만, 수업 중 많은 주제가 인터넷의 더 넓은 범위로 확장될 수 있다는 것을 알게 될 것입니다. 많은 온라인 서비스에는 사용자가 데이터를 이용할 수 있도록 도와주는 “API”가 있습니다. 예를 들어, 미국 정부는 여러분이 일기 예보를 편리하게 알 수 있도록 하는 API를 제공하고 있습니다.

이러한 API는 대개 유사한 형식을 가지고 있습니다. API는 경로 및 쿼리 매개변수를 통해 읽고 싶은 데이터나 수행하려는 작업을 나타내는 구조화된 URL로, 종종 api.service.com에 뿌리를 두고 있습니다. 예를 들어 미국 날씨 데이터의 경우, 특정 지역의 날씨 정보를 얻고자 한다면 https://api.weather.gov/points/42.3604,-71.094 에 (curl을 이용해) GET 요청을 발행합니다. 응답은 사용자가 해당 지역의 구체적인 일기 정보를 확인할 수 있도록 다른 여러 URL을 포함하고 있습니다. 대개 이런 응답은 JSON 형식인데 jq 같은 도구를 통해 다른 형식으로 변환할 수 있습니다.

일부 API에는 인증이 필요하며, 요청에 일종의 비밀 토큰 을 포함해야 합니다. 그리고 특정 서비스를 사용하기 위해서는 API 문서를 참조하십시오. 또한 “OAuth“는 자주 사용되는 프로토콜입니다. OAuth는 서비스에서 “당신인 것처럼 행동”할 수 있고 미리 설정해둔 특정 목적을 위해서 사용할 수 있는 토큰을 발행하는 방법입니다. 토큰에 접근할 수 있는 사람이라면 누구나 토큰이 계정에서 허용한 모든 작업을 수행할 수 있기 때문에 토큰은 비밀 이라는 점을 명심해야 합니다.

IFTTT는 API를 기반으로 한 웹사이트이자 서비스로 여러 서비스를 통합해 임의로 특정 이벤트를 연동시킬 수 있습니다. 한 번 도전해보세요!

일반적인 명령줄 플래그/패턴

명령줄(Command-line) 도구는 매우 다양하므로 사용하기 전에 man페이지를 확인하고 싶을 때가 많습니다. 도구들은 몇 가지 공통점을 가지고 있기 때문에 알아두면 좋습니다.

창 관리자(Window managers)

대부분의 사용자는 윈도우, 맥 OS, 우분투에서 기본적으로 제공되는 “드래그 앤 드롭” 창 관리자에 익숙할 것입니다. 화면에 일종의 고정된 창이 있으며, 드래그하여 크기를 조절하고, 서로 겹치게 할 수 있습니다. 이는 “플로팅” 창 관리자라고 하는 창 관리자의 한 유형 일 뿐입니다. 특히 리눅스에는 다양한 기능이 있습니다. 타일링 창 관리자는 창을 겹치지 않게 타일처럼 가지런히 배치합니다(tmux처럼). 타일링 창 관리자를 사용하면 화면이 레이아웃 에 따라 정렬된 오픈된 창으로 채워집니다. 단 하나의 창만 켜 두었다면 화면 전체를 차지합니다. 그 상태에서 창을 하나 더 켜면 원래 창은 축소되어 공간을 확보합니다(2/3나 1/3 정도). 세 번째 창을 열면 다시 기존 창들의 크기를 줄여 새 창을 위한 공간을 만들기를 반복합니다. tmux와 마찬가지로 마우스 터치 없이 키보드만으로 타일링 된 창을 이동하고 크기를 조절하고 탐색할 수 있습니다. 한번 시도해보세요!

VPN

VPN이 유행이긴 하지만 그것이 정당한 이유 때문인지는 확실치 않습니다. VPN이 수행하는 작업과 VPN이 사용자에게 제공하지 않는 작업은 무엇인지 알고 사용해야 합니다. VPN은 그저 인터넷 서비스 제공업체를 바꾸는 한 방법일 뿐입니다. 여러분이 생성한 트래픽은 “실제” 위치가 아닌 VPN 제공업체에서 오는 것처럼 보이며 연결된 네트워크에는 암호화된 트래픽만 표시됩니다.

이런 점이 매력적으로 보일 수도 있지만, 여러분이 VPN을 사용할 때 실제로 하는 일은 ISP에서 VPN 호스팅 회사로 신뢰를 이동하는 행위라는 것을 명심하십시오. 여러분의 ISP가 볼 수 있는 것들은 이제 VPN 제공 업체가 대신 볼 수 있습니다. ISP보다 VPN 제공 업체를 더 신뢰한다면 상관없겠지만, 그게 아니라면 VPN을 사용함으로써 잃는 것보다 얻은 것이 더 많다고 장담할 수는 없습니다. 공항에서 암호화되지 않은 공용 와이파이를 사용할 때 꺼림칙하다고 생각할 수도 있겠지만, 그렇다고 집에서 사용하는 것이 더 신뢰할만하다고 보기도 어렵습니다.

또한 요즘에는 민감한 정보를 담고 있는 트래픽 대부분이 이미 HTTPS나 TLS로 암호화되어 있습니다. 이 경우 사용자가 “나쁜” 네트워크를 사용하고 있는지는 중요하지 않습니다. 네트워크 운영자는 사용자가 통신하는 서버는 알지만 어떤 데이터를 주고받는지는 전혀 알 수 없기 때문입니다.

위에서 “VPN은 그저 인터넷 서비스 제공업체를 바꾸는 한 방법일 뿐”이라고 했는데요. VPN 제공업체가 실수로 소프트웨어를 잘못 구성해 암호화가 약하거나 완전히 비활성화된 경우는 전례가 없습니다. 일부 VPN 제공업체는 악의적 이어서 (최소한 기회주의적 이어서) 당신의 트래픽을 모조리 기록해 제3자에게 넘길 수 있습니다. 처음부터 사용하지 않는 것이 잘못된 VPN을 선택하는 것보다 낫습니다.

만일의 경우를 대비해 MIT는 학생들을 위해 VPN을 운영하고 있습니다. 직접 실행하고 싶다면 와이어 가드를 살펴보십시오.

마크다운

앞으로 경력을 쌓으면서 글을 쓸 기회가 있을지도 모릅니다. 그렇다면 최대한 간단한 방식으로 텍스트를 표시하고 싶을 것입니다. 예를 들면 텍스트를 굵게 또는 기울임 꼴로 바꾸거나 헤더, 링크 및 코드 조각을 추가할 수도 있습니다. 이런 경우에 Word나 LaTex 같은 무거운 도구를 사용하는 대신 경량화된 마크업 언어인 마크다운을 사용하기를 권합니다.

이전에 마크다운이나 마크다운에서 변형된 무언가를 본 적이 있을 것입니다. 마크다운이라는 이름으로 사용되지 않더라도 거의 모든 곳에서 부분적으로 마크다운을 사용하고 있습니다. 마크다운은 일반 텍스트 문서를 작성할 때 텍스트를 표시하는 방법을 체계적으로 정리한 것입니다. 강조 (기울임 꼴)는 문자열 양쪽에 *을 붙이면 됩니다. 강한 강조 (굵게)는 문자열에 **을 추가하면 됩니다. #로 시작하는 행은 헤더를 의미합니다. (그리고 #의 개수가 부제목의 레벨을 조절합니다.) -로 시작하는 행은 글머리 기호 목록의 항목이고 숫자 + .으로 시작하는 행은 번호 목록의 항목입니다. 백 틱은 코드 글꼴로 단어를 표시하는 데 사용되고, 코드 블록은 4개의 공백으로 행을 들여 쓰거나 백 틱 3개로 둘러싸서 입력할 수 있습니다:

```
코드 입력 공간
```

링크를 추가하려면 대괄호로 링크를 설명하는 텍스트 를 묶고 바로 뒤에 괄호로 묶은 URL을 배치합니다: [텍스트](URL). 마크다운은 배우기 쉽고 거의 모든 곳에서 사용할 수 있습니다. 이 강의 노트 또한 모두 마크다운으로 작성됐으며 실제 마크다운 코드는 여기에서 볼 수 있습니다.

해머스푼 (macOS 데스크탑 자동화 프로그램)

해머스푼은 macOS 데스크탑 전용 자동화 프레임워크입니다. 운영체제 기능과 연결되는 Lua 스크립트로 키보드/마우스, 윈도우, 디스플레이, 파일 시스템 등과 상호작용할 수 있습니다.

해머스푼을 이용한 몇 가지 예:

해머스푼을 사용하면 메뉴 버튼, 키보드 입력, 이벤트와 연결된 Lua 코드를 실행할 수 있으며 시스템과 상호작용할 수 있는 광범위한 라이브러리를 제공하기 때문에 기본적으로 할 수 있는 작업에 제한이 없습니다. 많은 사람이 해머스푼 설정을 공개하고 있어 필요하다면 대개 검색으로 찾을 수 있지만, 직접 처음부터 작성하는 것도 좋습니다.

참고 자료

부팅 + 라이브USB

컴퓨터를 부팅하면 운영체제가 로딩되기 전에 BIOS/UEFI가 시스템을 초기화합니다. 이 과정에서 특정 키를 눌러 이 소프트웨어 계층을 구성할 수 있습니다. 예를 들어 부팅 과정에서 컴퓨터는 “BIOS를 설정하려면 F9를 누르시오. 부팅 메뉴에 접속하려면 F12를 누르시오.”라고 할 수도 있습니다. BIOS 메뉴에서 하드웨어와 관련된 모든 설정을 변경할 수 있습니다. 또한 부팅 메뉴에서 하드 드라이브 대신 대체 장치에서 부팅하도록 할 수도 있습니다.

라이브 USB는 운영 체제가 포함된 USB 플래시 드라이브입니다. 운영 체제 (예: 리눅스 배포판)를 다운로드하고 플래시 드라이브에서 구워서 만들 수 있습니다. 이 과정은 .iso 파일을 단순히 디스크에 복제하는 것보다는 복잡하지만 유넷부트인 같은 툴로 라이브 USB를 만드는 데 도움을 받을 수 있습니다.

라이브 USB는 다양한 용도로 유용하게 사용되는데, 무엇보다도 기존 운영 체제에 문제가 생겨 부팅이 안 되는 경우, 라이브 USB로 데이터를 복구하거나 운영 체제를 고칠 수 있습니다.

도커, 베이그런트, 가상 환경, 클라우드, 오픈스택

가상 머신 및 컨테이너와 같은 유사한 도구를 사용해 운영체제를 포함한 전체 컴퓨터 시스템을 에뮬레이트 할 수 있습니다. 테스트, 개발 또는 탐색(예: 잠재적인 악성 코드 실행)을 위한 격리된 환경을 구성하는 데 유용합니다.

베이그런트는 컴퓨터 구성(운영체제, 서비스, 패키지 등)을 코드로 설명한 다음 간단한 vagrant up으로 가상 환경을 인스턴스화할 수 있는 도구입니다. Docker는 개념적으로 유사하지만, 컨테이너를 사용한다는 차이가 있습니다.

클라우드에서 가상 머신을 대여할 수 있으며 다음과 같은 기능이 있습니다:

아마존 AWS, 구글 클라우드 그리고 디지털 오션 같은 서비스가 유명합니다.

MIT CSAIL의 멤버라면 CSAIL 오픈스택 인스턴스로 연구 목적을 위한 무료 가상 환경을 이용할 수 있습니다.

노트북 프로그래밍

노트북 프로그래밍 환경은 대화형이나 탐색적 개발에 유용합니다. 오늘날 가장 인기 있는 노트북 프로그래밍 환경은 파이썬(및 기타 다른 언어)을 위한 주피터 입니다. 그리고 울프램 매스매티카는 수학에 특화된 프로그래밍을 하는데 뛰어난 환경을 제공합니다.

GitHub

GitHub 는 오픈 소스 소프트웨어 개발을 위한 가장 인기 있는 플랫폼 중 하나입니다. vim에서 해머스푼까지 이 수업에서 언급한 많은 도구는 깃허브에서 만들어졌습니다. 오픈 소스에 기여해 일상적으로 사용하는 툴을 개선하는 것은 간단합니다.

깃허브에서 프로젝트에 기여하는 두 가지 방법을 소개합니다.


이 페이지를 수정.

CC BY-NC-SA에 따라 라이센스를 부여합니다.