월별 글 목록: 2021년 9월월

벽시계 고치기(무브먼트 교체)

몇 년 전에 무소음 야광 벽시계를 29,900원에 사서 사용 중이었는데, 얼마전에 시계 바늘을 돌리다가 시계 부품인 무브먼트가 망가졌는지 시계가 제자리걸음을 하더라.

그런데 거의 3만 원이나 들여 이 벽시계를 구입한 이유는 시계 바늘이 야광이라 밤중에 일어났을 때 시간을 체크할 수 있고, 무소음이라 시계 돌아가는 소리가 들리지 않아서 조용하기 때문이다. 아무튼 그동안 아주 마음이 흡족하도록 잘 쓰고 있었는데, 이 시계와 비슷한 기능과 디자인을 갖춘 제품을 찾아봐도 마음에 드는 게 없더라. 결국 고민 끝에 무브먼트를 직접 교체하기로 하고 같은 제품으로 보이는 무브먼트를 아래 링크를 통해 $5.75에 구입했고, 그저께 도착해서 잠깐 시간을 내서 교체해 보니 별다른 문제 없이 동작하고 있다.

다행히도 같은 제품인 듯하고, 사이즈도 같아서 그대로 시계 바늘을 빼고 무브먼트와 시계를 부착하는 나사를 뺀 후 무브먼트를 교체하고 역으로 조립하기만 하면 끝이다. 혹시 벽시계가 고장났다고 바로 버리기보다는 대부분 무브먼트나 시계 바늘 문제이니 한번 고쳐보는 것도 좋겠다. 별다른 공구도 필요없고 조립이나 구조도 단순해서 누구나 할 수 있을 법한 일이다.

파이썬3 가상 환경 만들기

파이썬에서 프로젝트를 진행할 때는 다양한 프로그래밍 환경에서 외부 라이브러리를 이용해 진행하게 되는데 이럴 때 의존성 관리가 필요하다. 프로그램이 의존하는 환경과 라이브러리가 바뀌면 프로그램에 문제가 발생할 가능성이 있으므로 개발 당시의 환경을 격리할 필요가 있다. 특히 한 컴퓨터에서 여러 프로젝트를 진행할 때 의존하는 라이브러리의 버전이 프로젝트마다 다르거나 한다면...? 이럴 때 가상 환경을 만들어서 프로젝트를 격리시켜 진행하면 좀 더 안정적인 프로젝트 진행이 가능하다.

가상 환경의 개념은 간단하다. 파이썬 3에서 기본적으로 제공하는 venv를 이용해 단일 프로젝트를 위한 공간을 만들고, 이곳에서 필요한 라이브러리를 설치하면 다른 프로젝트와 인터프리터나 라이브러리를 공유하지 않는다. 물론 프로젝트 공간(가상 환경)은 프로젝트마다 별개이기에 프로젝트마다 필요한 라이브러리는 별도로 설치해야 하고 필요에 따라 서로 별개로 업그레이드할 수 있다.

먼저 아래 명령어로 venv를 이용해 myproject라는 프로젝트 디렉터리를 만든다.

ubuntu@mylab01:~$ python -m venv myproject

그럼 myproject라는 디렉터리가 만들어지고, 안으로 들어가 보면 가상 환경을 구성하는 다양한 디렉터리가 보인다.

ubuntu@mylab01:~$ ls
myproject
ubuntu@mylab01:~$ cd myproject/
ubuntu@mylab01:~/myproject$ ls
bin  include  lib  lib64  pyvenv.cfg  share

다음 명령어로 가상 환경을 활성화하면 프롬프트가 바뀌면서 현재 (myproject)라는 가상환경이 활성화된 것을 보여준다.

ubuntu@mylab01:~/myproject$ source bin/activate
(myproject) ubuntu@mylab01:~/myproject$

이제 이 가상환경에다 예를 들어 requests 라이브러리를 설치해 보자.

(myproject) ubuntu@mylab01:~/myproject$ pip install requests
Collecting requests
  Using cached requests-2.26.0-py2.py3-none-any.whl (62 kB)
Collecting idna<4,>=2.5; python_version >= "3"
  Using cached idna-3.2-py3-none-any.whl (59 kB)
Collecting charset-normalizer~=2.0.0; python_version >= "3"
  Downloading charset_normalizer-2.0.6-py3-none-any.whl (37 kB)
Collecting certifi>=2017.4.17
  Using cached certifi-2021.5.30-py2.py3-none-any.whl (145 kB)
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.7-py2.py3-none-any.whl (138 kB)
     |████████████████████████████████| 138 kB 36.0 MB/s 
Installing collected packages: idna, charset-normalizer, certifi, urllib3, requests
Successfully installed certifi-2021.5.30 charset-normalizer-2.0.6 idna-3.2 requests-2.26.0 urllib3-1.26.7

pip list로 설치된 라이브러리를 조회해 보면 기존에 많은 라이브러리를 설치해서 사용 중임에도 여기서는 requests 및 의존 라이브러리만 추가된 것으로 표시된다. 즉, 다른 전역 환경과 완전히 별개로 운영되는 것이다.

(myproject) ubuntu@mylab01:~/myproject$ pip list
Package            Version  
------------------ ---------
certifi            2021.5.30
charset-normalizer 2.0.6    
idna               3.2      
pip                20.0.2   
pkg-resources      0.0.0    
requests           2.26.0   
setuptools         44.0.0   
urllib3            1.26.7   

만약 다른 곳에 이 프로젝트를 배포하고 싶다면 의존 라이브러리 목록을 requirements.txt라는 파일로 뽑고, 다른 곳에서 pip install -r requirements.txt를 실행하면 현재 설치된 라이브러리의 버전에 맞춰 라이브러리들이 설치된다.

(myproject) ubuntu@mylab01:~/myproject$ pip freeze > requirements.txt
(myproject) ubuntu@mylab01:~/myproject$ cat requirements.txt 
certifi==2021.5.30
charset-normalizer==2.0.6
idna==3.2
requests==2.26.0
urllib3==1.26.7
(myproject) ubuntu@mylab01:~/myproject$ pip install -r requirements.txt 
Requirement already satisfied: certifi==2021.5.30 in ./lib/python3.8/site-packages (from -r requirements.txt (line 1)) (2021.5.30)
Requirement already satisfied: charset-normalizer==2.0.6 in ./lib/python3.8/site-packages (from -r requirements.txt (line 2)) (2.0.6)
Requirement already satisfied: idna==3.2 in ./lib/python3.8/site-packages (from -r requirements.txt (line 3)) (3.2)
Requirement already satisfied: requests==2.26.0 in ./lib/python3.8/site-packages (from -r requirements.txt (line 4)) (2.26.0)
Requirement already satisfied: urllib3==1.26.7 in ./lib/python3.8/site-packages (from -r requirements.txt (line 5)) (1.26.7)

작업을 끝내고 가상환경을 종료하려면 deactivate라고만 입력하면 된다.

(myproject) ubuntu@mylab01:~/myproject$ deactivate 
ubuntu@mylab01:~/myproject$

참고로 인터프리터 또한 가상환경에서 별도로 설치된 것을 쓰기에 다음과 같은 결과를 볼 수 있다.

ubuntu@mylab01:~/myproject$ which python
/usr/bin/python
ubuntu@mylab01:~/myproject$ source bin/activate
(myproject) ubuntu@mylab01:~/myproject$ which python
/home/ubuntu/myproject/bin/python

참고: https://docs.python.org/ko/3/tutorial/venv.html

라이프 오브 파이 3D

이안 감독의 영화 라이프 오브 파이(Life of Pi)를 3D 블루레이로 감상했다. 사실 영화 자체는 개봉한 지 몇 년 후에 보긴 했는데 대충 태평양에서 조난 당한 친구가 호랑이와 함께 살아남는 이야기로만 기억하고 있었다. 그러다가 3D 효과가 좋다고 해서 얼마전에 3D 블루레이를 구해서 근 10여 년 만에 다시 감상했는데 기본적으로 이야기가 주는 재미도 재미지만 3D 효과도 탁월하고 중간중간 아름다운 장면들이 3D로 구현돼 있다 보니 시각적인 감흥이 훨씬 더 컸다. 누군가 3D 영화를 추천해 달라고 하면 '라이브 오브 파이'도 다섯 손가락 안에 들 것 같다.

'라이프 오브 파이'는 원래 원작인 '파이 이야기'를 소재로 한 영화로서 열린 결말로도 유명하다. 두 가지 버전의 이야기를 담고 있는데 영화에서는 어떤 게 진실인지 명확하게 알려주지 않는다. 그나저나 이번에 다시 한번 검색해 보니 아래와 같은 영상이 나오던데, 초반부에 성당에서 주인공인 파이가 목이 말라 물을 마시고 신부님이 그 모습을 보고 'You must be thirsty'라고 말하는 장면을 보니 대단한 복선인 것 같다.