분명 numpy를 설치했는데 파이썬에서 numpy를 사용하려 하면 다음과 같이 AttributeError: module 'numpy' has no attribute ... 하는 에러가 뜰 때가 있습니다.

import numpy as np

print(np.__version__)
# AttributeError: module 'numpy' has no attribute '__version__'

 

이는 numpy가 설치는 되었지만 시스템에서 파이썬 라이브러리로 제대로 연결이 안 되어서 그렇습니다. 이럴 경우 맥에서 homebrew를 사용할 때를 기준으로

brew link --overwrite numpy

 

를 실행해주면 문제가 해결됩니다.

 

참조한 곳: https://github.com/Homebrew/homebrew-core/issues/15698#issuecomment-315730732

일주일, 월화수목금 중에서 그 주의 최저가에 주식을 사고 싶다고 합시다. 특정 요일의 가격이 그 주의 최저가일 확률은 당연히 1/5이니 20%입니다. 그렇다면 우리는 그냥 20%의 확률로 찍으면서 기도매매법을 실천해야 하는 것일까요?

간단한 전략을 통해 이 확률을 두 배 넘게 올려 보도록 하겠습니다. 우리의 전략은 "첫 k일 동안은 시장을 살펴보고, 그 다음날부터는 그때까지 중에 가장 싼 가격이면 사자"입니다. 미지수는 x로 써도 되지만 요즘 이름 앞에 k를 붙이는 게 유행이라 k라고 했습니다. 어쨌든 예를 들어보면 다음과 같습니다.

k = 0 이라면? 첫 0일 동안은 시장을 살펴보고 그 다음날, 즉 월요일부터는 그때까지 중에 가장 싸면 삽니다. 말이 꼬여 있는데 당연히 월요일에는 비교할 가격이 없으니 그냥 그날 바로 사겠다는 말이 됩니다. 이건 찍는 것과 다를 게 없습니다. 따라서 k= 0일 때의 성공률은 월요일이 최저가일 확률인 20%입니다.

k = 1 이라면? 이제 좀 재미있어질 겁니다. 첫 1일 동안은 시장을 살펴봅니다. 즉 월요일에는 네이버 주식 창 새로고침만 합니다. 살 게 아니니 15분 늦게 가격이 떠도 상관없습니다. 그리고 다음날인 화요일부터 그때까지 중에 가격이 가장 싼 날이면 주식을 삽니다. 만약 화요일 가격이 월요일보다 싸면 화요일에 삽니다. 물론 수요일에 더 떨어질 수도 있지만 하여튼 우리 전략이 그렇습니다.

만약 화요일 가격이 월요일보다 높다면? 그러면 수요일로 넘어갑니다. 그리고 수요일 가격이 월화수 중 가장 낮다면 삽니다. 그런데 수요일도 월요일보다 비싸다면? 그러면 목요일로 넘어갑니다. 목요일 가격이 월화수목 중 가장 싸다면 삽니다. 목요일도 월요일보다 비싸다면? 금요일로 넘어갑니다. 만약 금요일도 월요일보다 비싸다면? 월요일이 최저가였네요. 그러면 못 사게 됩니다.

정리해 보면 k = 1 일 때,
* 알고 보니 월요일이 최저가 -> 실패 (0)
* 알고 보니 화요일이 최저가 -> 성공 (1)
* 알고 보니 수요일이 최저가 -> 월요일이 화요일보다 싸야만 성공 (1/2)
* 알고 보니 목요일이 최저가 -> 월요일이 화, 수보다 싸야만 성공 (1/3)
* 알고 보니 금요일이 최저가 -> 월요일이 화, 수, 목보다 싸야만 성공 (1/4)

각 요일이 최저가일 확률은 똑같이 20% 씩이니 그 값을 균등하게 곱해주면 k = 1 일 때 우리 전략의 성공 확률은

20% x (0 + 1 + 1/2 + 1/3 + 1/4)
= 20% x 25/12
= 41.67%

가 됩니다. 벌써 성공 확률이 두 배 넘게 올랐습니다!

k = 2일 때도 한 번 계산해 보도록 하겠습니다. 이 때는 월, 화까지는 기다려보고 수요일부터 살지 말지를 결정합니다. k = 2 라면,
* 알고 보니 월요일이 최저가 -> 실패 (0)
* 알고 보니 화요일이 최저가 -> 실패 (0)
* 알고 보니 수요일이 최저가 -> 성공 (1)
* 알고 보니 목요일이 최저가 -> 월, 화 중에 수요일보다 싼 날이 있어야 성공 (2/3)
* 알고 보니 금요일이 최저가 -> 월, 화 중에 수, 목보다 싼 날이 있어야 성공 (2/4)

그러면 k = 2일 때 우리의 성공 확률은

20% x (0 + 0 + 1 + 2/3 + 2/4)
= 20% x 26/12
= 43.33%

아까보다도 더 높아진 43.33%가 되었습니다!

같은 방식으로 계산하면 k = 3 일 때의 성공 확률은 20% x (0 + 0 + 0 + 1 + 3/4) = 20% x 7/4 = 35%, k = 4일 때는 20% x (0 + 0 + 0 + 0 + 1) = 20% 가 됩니다. k = 4라는 것은 금요일 하루에만 살 수 있다는 것이니 찍는 것과 성공 확률이 똑같겠지요.

정리해봅시다!
* 월요일부터 그때까지의 최저가면 산다: 성공확률 20%
* 화요일부터 그때까지의 최저가면 산다: 성공확률 41.67%
* 수요일부터 그때까지의 최저가면 산다: 성공확률 43.33%
* 목요일부터 그때까지의 최저가면 산다: 성공확률 35%
* 금요일부터 그때까지의 최저가면 산다: 성공확률 20%

즉 월, 화에는 시장을 지켜만 보다가 수요일부터 그 주의 그때까지의 최저가일 때 산다면 찍는 것에 비해 성공 확률이 배 이상 높은 43.33%가 됩니다! 단 이 경우 아예 못 살 확률이 40%이니 (월, 화 중에 최저가가 있는 경우), 주식을 좀 공격적으로 사 모으고 싶다면 화요일부터 이 전략을 적용하는 것도 좋겠습니다. 성공 확률은 41.67%로 비슷하고 주식을 아예 못 살 확률은 20% (월요일이 최저가인 경우)로 낮으니까요!

덧붙여 만약 주식을 팔고 싶은 경우라면 마찬가지 전략을 반대로, 즉 어느 날 이후에는 그때까지 중 가장 비싸다면 판다고 적용하면 되겠습니다.

자 그럼 성투하시기를 바라며 정성글은 춫천

- 끝 -

캘리포니아 2022 - 10. 세상이 굴러가게 하는 비용 5.5 달러


LA 시내를 돌아다니다가 블루보틀 매장에 들어갔다. 이게 그 유명하다는 푸른 병 카페란 말이지. 깔끔하고 한적한 매장에 들어가 5.5 달러 짜리 아이스 볼드 12온스 커피를 시켰다. 유명세 치고는 손님이 굉장히 적어서 대형 테이블을 나 혼자 쓰는 호사를 누렸다.

커피를 마시는데 매장 유리 밖으로 노숙자가 보였다. 지나가는 사람들과 신호에 걸린 차에게 계속해서 시비를 걸고 있었다. 한참을 그러고 있는 모습을 보며 거 참 난폭하네, 하고 생각을 하고 있는데 그 노숙자가 갑자기 카페 쪽으로 걸어왔다. 어?

순식간에 매장 안으로 들어온 노숙자는 손님들에게 시비를 걸지는 않았지만 대신 매장에 전시되어 있는 물건들을 괜히 건드리고 다녔고, 잠시 후 카운터로 가서 뭐라고 뭐라고 말을 하더니 커피 두 잔을 공짜로 받아서 양손에 들고 유유히 카페를 나섰다. 그러더니 지나가는 차에 커피를 뿌려대고 남은 커피는 땅에 쏟아버리고는 다른 곳으로 갔다.

그 광경을 본 후 고개를 숙여 내 커피를 보았다. 순간 나는 돈을 내고 커피를 사 마시는데 가게에 들어와서 난리친 사람은 커피 두 잔을 공짜로 받아갔다는 생각이 들어 피식 웃음이 나왔다. 카페 관리자 입장에서야 언제 올 지 모르는 경찰에게 신고하고, 기다리고, 그 동안 그 노숙자가 손님들에게 난동을 부리지 않을까 전전긍긍하느니 커피 두 잔 쥐어 보내는 것이 이득이었겠지. 그런데 그러면 나 같은 얌전한 손님들은 뭔가 억울하지 않나?

그런 생각을 잠시 하다가 그러거나 말거나 하고 한번 풋 웃어버리고는 남은 커피를 마저 마셨다. 창 밖에서는 또 다른 노숙자가 어디선가 나타나 길 건너편에 있는 멕시코 치킨집에 들어가서 소란을 피우는가 싶더니 잠시 후 치킨을 손에 들고 나오고 있었다.

반 년도 더 지난 지금 갑자기 그런 생각이 든다. 그 때 내가 냈던 5.5 달러는 그 곳에서 내가 남에게 폐를 끼치지 않으면서 커피를 마시기 위한 비용이었다고. 남에게 폐를 끼치지 않는 것은 좋은 일이지만 희한하게도 그 좋은 일을 하면 내가 상을 받는 것이 아니라 내가 돈을, 혹은 시간을, 혹은 정성을 써야 한다. 커피를 예로 들자면 남에게 폐를 끼치면 커피를 공짜로 받지만 얌전히 있으면 커피를 마시기 위해 돈을 내야 하는 것이지. 계산기를 두드려보면 행패를 부리는 게 이득이다. 하지만 세상은 이런 계산은 치워버리고 그러거나 말거나 규칙을 지키며 살아가는 사람들 덕에 굴러간다. 그렇게 나는 그 날 세상이 굴러가게 하는 비용 5.5 달러를 냈다.

파이썬에서 상속을 통해 클래스를 만들 경우 생성자 안에서 상위 클래스의 생성자를 호출해야 할 때가 있습니다. 그럴 때 아래 두 종류의 코드가 사용되곤 하는데요, 간단한 코드는 파이썬 3에서부터 지원되는 문법이고 복잡한 코드는 파이썬 2와 3에서 모두 지원됩니다. 기능은 동일합니다.

 

1. 간단한 코드

# 파이썬 3에서부터 지원됩니다.
super().__init__()

 

2. 복잡한 코드

# 파이썬 2와 3에서 모두 지원됩니다.
super(__class__, self).__init__()

 

참조: https://stackoverflow.com/a/61288819/1125721

Julia를 apt-get 으로 설치하면 옛날 버전이 설치됩니다. 최신 버전을 설치하려면 직접 홈페이지에서 다운받아야 합니다.

 

1. 줄리아 다운로드 페이지로 갑니다.

https://julialang.org/downloads/

 

2. 컴퓨터 사양에 맞는 버전을 다운로드합니다. 제 경우는 Generic Linux on x86 64-bit (glibc) 용 1.8.0 버전으로 진행하였습니다.

wget https://julialang-s3.julialang.org/bin/linux/x64/1.8/julia-1.8.0-linux-x86_64.tar.gz

 

3. tar로 압축을 풉니다.

tar -xvzf julia-1.8.0-linux-x86_64.tar.gz

 

4. /opt/로 복사함으로써 설치를 합니다. /opt/는 apt-get이 아닌 다른 방법으로 설치된 프로그램들이 있는 곳입니다. 관리자 권한이 필요합니다.

sudo mv ./julia-1.8.0 /opt/

 

5. /usr/local/에  symbolic link를 만들어서 어디서나 편하게 사용하도록 합니다.

sudo ln -s /opt/julia-1.8.0/bin/julia /usr/local/bin/julia

 

6. 이제 터미널 환경에서 julia만 입력하면 julia를 실행할 수 있습니다.

$ julia

 

참조한 곳: https://medium.com/coffee-in-a-klein-bottle/install-julia-1-5-on-ubuntu-bb8be4b2571d

십여 년 전, 스크립트 언어를 배워야 할 일이 생겼을 때 비주류 좋아하는 성격 탓에 당시 한창 뜨던 중인 파이썬을 안 하고 슬슬 지기 시작하던 펄을 공부했었다. C로 - 그러고보니 C++도 아니고 - 문자열 처리 코드 짜고 있던 나에게 펄은 신세계였다. 요즘은 당연하게 여겨지는 것이지만 배열 마지막 원소를 arr[-1] 같이 -1이라는 인덱스로 접근할 수 있는 것도 C에서는 상상도 못 했던 일이었다.

펄은 참 재미있는 언어였다. 한국어로 치자면 "거시기"에 해당되는 변수가 자동으로 존재한다. $_ 라는 변수인데, 그 덕에 코드를 듬성듬성 짤 수 있었다. 다른 언어에서는 명확하게 변수와 값을 지정해주었어야 할 상황에서 펄은 "거시기" 변수만 불러와 보면 얼추 필요한 값이 들어있었기 때문에 변수를 생략하는 것이 가능했다. 그리고 if문과 함께 unless 문도 있었다. Unless 문의 작동방식은 if문의 정반대. 즉 if (true)는 unless (false)와 같고... 이런 조건문을 겹쳐서 if ( unless ( if ( true ) ) ) 같은 식으로 볼썽사나운 코드를 짜는 것도 가능했다.

물론 이런 코딩이 가능하다 보니 남이 짠 펄 코드를 이해하는 건 정말 어렵고 어쩔때는 내가 예전에 짠 펄 코드도 이해가 안 가기도 했다. 그래서 펄 사용자가 많이 떨어져 나가기도 했고. 이런 펄의 특성은 "어떤 일을 하는 데에는 하나 이상의 길이 있다 (There's more than one way to do it, TMTOWTDI)" 라는 펄의 슬로건에 잘 나타나 있다. 펄 코드에는 개발자의 개성이 원없이 묻어난다. 어쨌든 나는 펄이 참 좋았고, 펄은 내 석사 연구의 꽤 많은 부분과 함께 했다.

펄과 완전 반대편에 있는 언어가 바로 파이썬이다. 파이썬에서 import this를 치면 파이썬의 철학이 죽 나오는데 그 중에 이런 말이 있다. "어떤 작업을 하기 위한 하나의, 되도록이면 단 하나의 자명한 방법이 존재한다. (There should be one-- and preferably only one --obvious way to do it.)" 그래서 파이썬은 띄어쓰기를 몇 칸으로 할 것인지까지도 한번 정하면 끝까지 지켜야 한다. 펄은? 펄 사용자들끼리 신나서 자주 하는 게 어떻게 하면 한 줄 안에 코드를 잘 구겨넣을까 하는 일이다.

이런 면에서 여러모로 펄은 한국어(와 일본어)를, 파이썬은 영어를 닮았다. 한국어에서는 온갖 생략이 가능하다. "사랑해" 라고 하면 내가 너를 사랑한다는 말인 줄 다 안다. 영어에서는 "Love" 라고 하면 못 알아듣기 때문에 단 둘이 있어도 굳이 "I love you" 라고, I가 you를 love한다고 다 꼬치꼬치 말해줘야 한다. 우리는 사과를 먹었으면 됐는데 영어에서는 굳이 사과를 한 개 (an apple) 먹었는지 두 개 이상 (apples) 먹었는지를 말해줘야 한다. 영화 황산벌에 나오는 계백 장군의 대사인 "그러니께 이번 여그 황산벌 전투에서 우리의 전략 전술적인 거시기는, 한 마디로 뭐시기 할 때꺼정 갑옷을 거시기한다, 바로 요거여. 알겄제?" 는 영어로는 말이 안 되고, 번역해 봐야 억지스럽다.

이런 다양성, 다의성은 인간의 언어에서는 언어를 풍요롭게 하고 문학의 비옥한 토양이 되는 존재이지만 프로그래밍 언어에서는 그다지 환영받지 못한다. 프로그래밍에서는 간단함과 명료함이 미덕이다. 그래서 날이 갈수록 파이썬 사용자는 많아지고 펄 사용자는 줄어만 간다.

예전, 대략 버전 관리 시스템으로 git이 아니라 cvs나 svn을 쓰던 때, 수많은 개발자들의 땀과 눈물이 서려있을 Visual C++ 6.0이 현역이었을 때, 간혹 3.5인치 디스켓 드라이브를 볼 수 있었을 때, 안드로이드는 나왔는데 안드로이드 스튜디오는 없어서 이클립스로 앱 만들던 때, 도스에서 터보C를 쓰던 때의 코딩은 참 자유로웠다. 참조할 수 있는 자료가 제한되어 있으니 다 개발자가 어떻게든 직접 해야 했고, 그러다보면 좀 삐그덕대더라도 분명 내 손에서 나왔다고 자부할 수 있는 프로그램이 생기곤 했다. 홈페이지도 메모장에 직접 html 코드를 쳐 가면서 만들곤 했지.

요즘은 컴퓨터 프로그램이 거대해지면서 많은 부분이 규격화되었다. 이미 남이 만들어놓은 코드를 "라이브러리"라는 이름으로 잘 가져다가 쓰는 게 중요한 시대가 되었다. 예전처럼 내가 다 하려다가는 "왜 바퀴를 재발명하고 있냐?" 라는 핀잔을 듣기 일쑤다. 깃허브에서 여러 코드를 받아오고 스택 오버플로우에서 이것저것 찾아서 어떻게 하다 보면 금세 프로그램 하나를 뚝딱 만들 수 있다. 요즘 간단한 스마트폰 앱은 파워포인트 만들듯이 마우스로도 만들 수 있고. 그런데 그렇게 해서 나온 결과물을 보고 있노라면 마음 속 한 구석이 왠지 허전하다. '이 프로그램에서 내가 만든 부분이 도대체 뭐지?' 하는 생각과 함께.

펄을 마지막으로 써 본 지도 거의 10년이 다 되어 간다. 옛 생각이 나서 인터넷에서 펄을 검색해 보니 5년 안에 사용자가 사라질 언어 중 하나로 펄이 꼽혀 있었다. 바퀴를 재발명하던 때가 그립다. 스택 오버플로우 없이 프로그램을 짜던 때가 그립다. 괜히 커맨드 창에서 perl을 실행시키고 이것저것 눌러보다가 창을 닫았다. 기분이 참 $_ 한 오늘이다.

'글쓰기 > 수필' 카테고리의 다른 글

부르던 노래가 남아서  (1) 2024.11.13
머지되지 못한 커밋  (0) 2024.09.13
이어령 선생님의 부고를 듣고  (2) 2022.02.27
리을 이야기  (2) 2022.01.10
번데기의 천국 - 모교의 폐교 가능성 소식에 부쳐  (0) 2021.06.04

캘리포니아 2022 - 9. 아무렇지도 않고 예쁠 것도 없는

 

https://youtu.be/PVvgPrHEqCA

 

대학생 때 한 달 넘게 일본 배낭여행을 간 적이 있었다. 하루에 한국 돈 약 4만원 정도로 숙박비와 식비를 포함한 여행비를 충당하던 빠듯한 여행이었다. 여행 중 오키나와에서 우민추(海人, 바닷사람이라는 뜻의 오키나와어)라고 적혀있는 티셔츠를 보았었는데 맘에 쏙 들었지만 한국 돈으로 약 2만원 정도 되던 금액이 당시에는 부담이 되어 몇 날 며칠을 고민하다 오키나와를 떠날 때까지 결국 사지 못했다. 웃기게도 그렇게 돈을 아껴서 그랬는지 여행 후반에는 돈이 남았었다. 그 티셔츠를 몇 장은 충분히 살 수 있을 정도로.

비록 티셔츠는 못 샀지만 그 경험 덕에 깨달은 것이 있다. 살까 말까 고민되면 일상에서는 사지 말아야 하지만 여행중에는 사야 하고, 할까 말까 고민되면 일상에서는 하지 말아야 하지만 여행중에는 해야 한다. 일상에서는 다음, 다다음 기회가 있지만 여행중에는 기회가 한 번씩 밖에 없기 때문이다. 설령 나중에 후회하더라도 여행 중에는 하고 나서 후회하는 것이 하지 않고 아쉬워하는 것 보다 낫다.

캘리포니아 1번 주도(州道)에서의 운전이 7시간을 넘어 8시간 째로 접어들던 때였다. 해는 뉘엿뉘엿 져 가고 도로에는 산그림자가 깔리기 시작했다. 이제는 밤이 되기 전에 빨리 산타 바바라에 도착해서 숙소에 짐을 풀어야 했다. 1번 주도를 달리며 태평양을 보겠다는 목표는 이미 충분히 달성한 후였다. 1번 주도가 아직 남아있기는 했지만 남은 부분은 바닷가가 아니라 내륙의 외진 마을들을 거쳐가는 길이었다. 내비게이션은 빙빙 돌아가는 1번 주도 대신 가까운 길을 알려주고 있었다.

하지만 나는 1번 주도를 더 달려보고 싶었다. 특별히 그래야 할 이유는 없었다. 반대로 그러지 말아야 할 이유는 많았다. 11년만에 운전대를 잡은 것이어서 아직 밤 운전은 위험했고, 남아있는 1번 주도는 딱히 특별할 것이 없는 평범한 도로일 것 같아 보였으며, 내일의 일정을 생각하면 조금이라도 빨리 숙소에 도착해서 쉬는 것이 좋을 것 같았다. 하지만 결국 고민 끝에 잠시 차를 멈추고 일부러 강제로 1번 주도를 달리도록 네비게이션을 재설정했다. 이유는 단 하나였다. 그러고 싶어서. 숙소에 좀 늦게 도착하면 어떻고 다음날 좀 피곤하면 어때. 여행중에 할까 말까 고민될 때에는 모름지기 해야 한다.

캘리포니아 1번 주도는 태평양 해안 도로 (Pacific Coast Highway, PCH), 카브릴로 도로 (Cabrillo Highway), 쇼어라인 도로 (Shoreline Highway), 해안 도로 (Coast Highway) 등의 구간으로 나뉘는데 보통 여행 책자에서 소개하는 캘리포니아 1번 주도는 태평양 해안 도로 구간이다. 강한 바람, 깎아지른 절벽, 태평양이 만들어내는 육중한 파도와 굉음이 계속해서 이어지는 길로, 내가 그 날 오전부터 줄기차게 달려왔던 바로 그 길이었다. 이제 태평양 해안 도로는 끝이 났고, 내가 네비게이션의 충고를 무시하고 더 가기로 한 캘리포니아 1번 주도는 카브릴로 도로 (Cabrillo Highway) 구간이었다.

별 기대 없이 들어선 카브릴로 도로는 조용한 시골길, 정지용 시인의 시 '향수'의 표현을 빌자면 아무렇지도 않고 예쁠 것도 없는 그런 곳이었다. 하지만 그래서 좋았다. 특별히 멋지거나 화려한 경치는 없었지만 그렇기 때문에 마음이 편안해졌다. 사람도 차도 거의 없는 시골길을 운전하며 카브릴로 도로의 한적함을 충분히 누리고 또 누렸다. 낮 내내 태평양 해안 도로를 달리며 바람과 절벽과 파도와 바다 때문에 흥분되었던 마음이 시골길을 천천히 달리는 동안 기분 좋게 차분해졌다.

소설은 발단, 전개, 위기, 절정을 거쳐 결말이 나야 하고 한시(漢詩)는 기, 승, 전을 지나 결까지 가야 한다. 독자를 흥분시키고 긴장하게 하는 것도 중요하지만 마지막에 가서 독자의 긴장을 풀어주고 마음을 편안하게 해 주는 것 역시 중요한 일이기 때문이다. 그런 면에서 카브릴로 도로는 캘리포니아 1번 주도를 달리는 사람이라면 꼭 가 보아야 하는 곳이다. 태평양 해안 도로가 1번 주도의 절정이라면 카브릴로 도로는 잔잔한 마무리다. '향수'의 아무렇지도 않고 예쁠 것도 없다는 표현이 참 잘 어울리는 곳, 그래서 그 곳이 차마 꿈엔들 잊히겠냐는 그 다음 표현 역시 참 잘 어울리는 곳이 바로 카브릴로 도로다.

카브릴로 도로는 롬폭(Lompoc)이라는 마을을 지나면서 끝이 났고 그 즈음부터 산타 바바라까지는 미국 101번 국도가 캘리포니아 1번 주도를 대체하면서 1번 주도가 잠시 끊어져 있었다. 해는 진작에 다 져서 깜깜한 밤이었고 아침에 운전을 시작한 지 10시간이 지나서야 산타 바바라의 숙소에 들어설 수 있었다. 체크인을 하면서 직원과 이야기를 하다가 오늘 아침에 몬터레이에서 출발해서 온 거라고 했더니 직원이 말했다. "와우, 롱 트립."

101번 국도 때문에 끊어진 캘리포니아 1번 주도는 산타 바바라 이후에 다시 나타나서 LA로 향하게 된다. 원하면 다음 날 1번 주도를 더 탈 수도 있었다. 하지만 카브릴로 도로가 내 캘리포니아 1번 주도 여행을 잘 마무리해 주었기에 더 이상 미련은 없었다. 내일 LA로 갈 때에는 고속도로를 타야지. 노곤한 몸으로 기분좋게 잠에 들었다.

[리눅스] Bash Shell에서 파일 존재 여부 검사 시 -e와 -f 옵션의 차이

 

Bash Shell에서 파일 존재 여부 검사 시 -e와 -f 옵션을 사용할 수 있는데, -e는 단순히 파일이 존재하는지만 검사하고 -f는 해당 경로에 있는 것이 디렉토리나 마운트 된 기기 등이 아니라 정말로 파일인지까지 검사해줍니다. 보통 if문 안에서 다음과 같이 사용하게 되지요.

 

# 해당 운영체제가 우분투인지를 검사하는 코드입니다.
if [[ -f /etc/lsb-release ]];

 

참조한 곳: https://linuxize.com/post/bash-check-if-file-exists/


캘리포니아 2022 - 8. 인생은 운전

나는 하나를 완벽히 끝내지 않으면 다음 단계로 잘 넘어가지 못하는 성격이다. 어릴 때 비디오 게임을 할 때면 화면에 나타나는 동전을 하나도 빼놓지 않고 다 먹어야 했고 이야기 진행이 중요한 컴퓨터 게임을 할 때면 맵에 있는 장소를 다 방문하고 모든 등장인물을 다 만나봐야 직성이 풀렸다. 대학원생 때는 기말고사까지 다 끝난 다음에도 수업 때 이해가 가지 않았던 내용을 들고 교수님을 찾아갔었고, 대학교 때 배웠던 함수형 프로그래밍 언어가 깊이 이해가 가지 않아 사회인이 된 지금까지도 시간이 날 때마다 틈틈이 함수형 프로그래밍 언어 공부를 시도해 왔다.

이런 나에게 있어 볼거리가 넘쳐나는 캘리포니아 1번 주도(州道)에서의 운전은 어떤 의미에서 고역이었다. 황홀한 풍경이 쉬지 않고 계속해서 나타났지만 나는 계속 앞만 보고 차만 몰아야 했다. 낮에는 그래도 마음에 여유가 있어서 도로 옆 간이 쉼터 공간이 나타나면 차를 대고 경치를 보곤 했지만 해가 조금씩 붉은빛을 띠며 서쪽 수평선에 가까워지기 시작한 후로는 마음이 급해져서 비어있는 도로를 끝없이 달리고 또 달렸다.

그렇게 달리다 보니 끝없이 이어질 것만 같던 깎아지른 해안 절벽과 삐죽삐죽한 젊은 산들이 어느새 시나브로 사라지고 그 자리를 둔탁하게 닳은 오래된 얕은 언덕과 초원이 메우고 있었다. 하얗게 쨍했던 한낮의 햇빛이 북쪽의 날카로운 절벽과 참 잘 어울렸다면 붉은 기가 도는 초저녁의 햇빛은 얕은 언덕과 초원에 잘 어울렸다. 어느새 이렇게 경치가 바뀌었지 하고 놀라던 찰나 멀리 무언가 검은 것이 보였다. 자세히 보니 소였다. 여러 마리의 소가 넓은 풀밭을 돌아다니며 자유롭게 풀을 뜯고 있었다.

아, 이게 말로만 듣던 방목형 목장이구나. 소들이 주인도 없이 여기저기 돌아다니는 게 신기해서 자세히 보고 싶었지만 목장이 도로 옆에 있었기에 소를 오랫동안 볼 수가 없었다. 운전자에게는 전방 주시의 의무가 있지 않나. 못내 아쉬워 운전하면서 고개를 잠깐씩 돌려 소들을 보려 했지만 그러자 운전도 잘 안 되고 소도 잘 안 보였다. 그렇게 한참을 시도하다가 결국에는 소를 제대로 보는 것을 포기하기로 했다. 아쉬웠지만 어쩔 수 없었다. 소를 보자고 도로 한복판에서 멈출 수도, 아니면 차를 돌려 오던 길을 되돌아갈 수도 없는 노릇 아닌가. 이 소들은 - 적어도 이번 여행에서는 - 내가 자세히 관찰할 정물화의 대상이 아니라 휙휙 지나가는 크로키의 대상이라는 것을 인정하기로 했다. 그러자 마음이 편해졌다.

인생은 유턴 없는 운전과 참 비슷하다. 유턴 없는 길에서는 한번 지나온 곳에 다시 갈 수 없고, 인생에서는 한번 지나온 시간을 다시 살 수 없다. 운전을 하다가 창 밖에 있는 소를 제대로 보지 못 했더라도 다시 볼 수 있는 방법은 없고, 살면서 제대로 하지 못해 후회되는 일이 있더라도 그 시간으로 되돌아가 그 일을 고칠 수는 없다. 갈림길 직전에 방향을 잘못 잡고 있는 것을 깨달았다면 우물쭈물할 시간 없이 바로 그 순간 잽싸게 길을 바꿔야 한다. 그렇게 계속해서 수많은 아쉬움을 남기며 앞으로 앞으로 가야 하는 것이 운전이고 우리의 삶이다. 그리고 지금 놓친 풍경에 아쉬워하기보다는 앞에 있는 모퉁이를 돌았을 때 갑자기 눈앞에 펼쳐질 장관을 기대하는 것이 여행자의 바른 운전 태도이고 바른 삶의 태도이다. 덧붙이자면 그렇게 멋진 경치가 많이 나타날 길을 선택하는 것이 삶의 지혜이고.

이런 생각을 하자 마음이 편해졌고 해는 점점 지면서 붉다 못해 주황색이 된 게으른 빛을 느릿느릿 뿌리고 있었다. 그 빛을 받으며 나는 남으로 남으로 향했다. 그리고 한참 뒤 이야기이지만, 캘리포니아 여행을 다 마치고 집에 돌아간 나는 책장에 있던 함수형 프로그래밍 언어 책을 버릴 수 있었다.


캘리포니아 2022 - 7. 내 소리는 다음 사람에게 닿을 것

박지원의 열하일기에는 호곡장론(好哭場論)이라 불리는 유명한 글이 있다. 평생을 산이 가득한 조선에서 살던 박지원은 요동을 지나다가 처음으로 끝없는 벌판과 지평선을 보았고, 그 자리에서 감탄해서 "호곡장! 가이곡의. (好哭場! 可以哭矣.)" 라고 외쳤다. 한문으로 쓰다 보니까 말이 그렇다는 거지 실제로 했던 말은 "이야, 여기 진짜 울기에 좋은 곳이네! 정말 울어볼 만 하네!" 정도였을 것이다. 이 멋진 풍경을 보고 왜 하필이면 우냐는 일행의 말에 박지원은 아기도 태어나면 울지 않냐며, 갓 태어난 아기는 슬퍼서 우는 게 아니라 좁은 태중에 있다가 갑자기 무한히 넓은 세상을 만나게 되자 속이 시원해서 크게 한바탕 우는 것이라고 대답한다. 그처럼 자기도 지금 무한을 보게 되자 속이 시원해서 갓난아기처럼 울고 싶은 것이라고.

주차할 수 있도록 갓길이 확장된 곳에 차를 대고 문을 열자 바람 소리가 귀를 울렸다. 차에서 내리니 육중한 파도가 절벽과 암초를 만나면서 만들어내는 무섭게 하얀 물보라가 생겼다가 없어지기를 반복하고 있었다. 최남선의 해(海)에게서 소년에게에 나오는 파도는 자기의 큰 힘을 아느냐 모르느냐고 호통을 쳤다지만 지금 이 파도는 그런 말조차 귀찮다는 듯, 아무 말도 없이 그저 자기의 거대함과 육중함, 무겁고 검푸른 물과 두텁고 하얀 물보라 그 자체로 자신을 드러내고 있었다. 주위에 아무도 없이, 나 홀로 갓길에서 그 광경을 보고 있었다.

얼마나 그렇게 있었을까, 갑자기 소리를 지르고 싶어졌다. 박지원이 요동 벌판을 보고 정말이지 울기에 좋은 곳이라고 감탄했다던 이야기도 순간 생각이 났다. 열하일기를 제대로 읽지도 않았으면서 그 순간 그 내용이 떠올랐던 것은 아마도 내가 살면서 읽었던 여러 문장 중 목놓아 울기에 좋은 곳이라는 바로 그 표현이 당시의 내 감정과 가장 비슷했기 때문이지 않았을까. 선 채로 잠시 고민을 하다가 크게 소리를 질렀다. 주위에 아무도 없기 때문이기도 했고 바람과 파도 소리가 워낙에 커서 내가 소리를 질러봤자 잘 안 들릴 것이기 때문이기도 했지만 무엇보다도 소리를 지르지 않고는 가슴이 터질 것 같아 견딜 수 없어서였다. 한참 길게 소리를 질렀지만 그것으로는 부족해서 또 다시 크게 소리를 질렀다. 그제야 속이 뻥 뚫렸다. 시대도 장소도 달랐지만 박지원도 요동 벌판을 보며 이런 기분이었을 것임을 감히 알 수 있었다.

호곡장론의 맨 끝에서 박지원은 울 만한 곳이 또 있다며 금강산과 황해도 몽금포 이야기를 꺼낸다. 금강산 비로봉에 올라 동쪽 바다를 바라보면서, 황해도 몽금포의 모래사장을 걸으면서도 크게 울 만하다고. 박지원이 금강산 여행을 갔던 것은 29살이던 영조 41년, 1765년이었다. 박지원은 몰랐겠지만 그 때 금강산 비로봉 꼭대기에서 동해를 향해 목놓아 울었던 박지원의 울음소리는 바닷물에 녹아들어 태평양 전역으로 퍼져나갔고, 그렇게 바다에서 257년을 떠돌다가 육중한 파도 소리가 되어 태평양 반대편에 서 있던 내 귀에 들어왔다. 그리고 나는 큰 소리를 질러 그 소리에 화답했다. 내 소리 역시 대양을 돌고 돌다가 누군가의 귀에 들어갈 것이다. 그리고 그 사람은 자기의 소리로 내 소리에 화답할 것이다. 지금 이를 이렇게 글로 남기는 것은 내 소리에 화답할 그 사람이 내 소리를 들었을 때에 그것이 내 소리인 줄 알 수 있게 하기 위해서이다.

+ Recent posts