리눅스에서는 명령행에서 Home 키를 누르면 현재 명령의 맨 앞 글자로, End 키를 누르면 맨 뒤 글자로 커서를 옮길 수 있는데 맥에서는 그게 안 됩니다. 맥에서는 다음 단축키를 사용하면 됩니다. Ctrl은 컨트롤 키입니다 (커맨드 키가 아닙니다).

 

명령행 맨 앞 글자로 가기: Ctrl + A

명령행 맨 뒤 글자로 가기: Ctrl + E

f3을 사용하여 SD카드 및 USB 불량 여부 확인하기

 

집에서 사용하던 SD 카드가 있었는데 어느 순간부터 읽기가 잘 안 되었습니다. 수명이 다 하면 쓰기가 안 되는 경우는 예전에 본 적이 있는데 이번 SD 카드는 쓰기는 되고 읽기가 안 되었습니다. 어떻게 하면 불량 여부를 검사할 수 있을지 알아보다가 f3이라는 프로그램을 알게 되었습니다. f3은 Fight Flash Fraud의 약자로 "가짜 플래시 메모리와 싸우자" 정도의 뜻입니다. 공식 웹사이트는 https://fight-flash-fraud.readthedocs.io/ 이고 깃허브 주소는 https://github.com/AltraMayor/f3 입니다. 설치 방법은 웹사이트를 참조하시면 되는데, 리눅스나 맥 환경에서 설치 가능하고 윈도에서는 도커를 사용하면 됩니다.

 

설치가 끝나면 f3write를 통해 SD 카드 혹은 USB에 테스트용 데이터를 쓰고, 그 후 f3read를 통해 데이터를 잘 읽을 수 있는지 검사하면 됩니다. 먼저 f3write를 통해 다음과 같이 제 SD 카드를 검사하였습니다. /Volumes/my_sd_card 에는 SD 카드가 마운트 된 위치를 써 주시면 됩니다. 제 SD 카드는 32 GB 짜리이고 쓰기 속도는 평균 16.52 MB/s 라고 합니다. 일단 쓰기는 잘 되었습니다.

 

주의!! SD 카드에 테스트용 데이터를 쓰게 되므로 기존에 있던 데이터가 삭제될 수 있으니 기존 데이터를 일단 백업해놓은 뒤에 테스트하세요.

$ f3write /Volumes/my_sd_card
F3 write 8.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

Free space: 31.23 GB
Creating file 1.h2w ... OK!
Creating file 2.h2w ... OK!
Creating file 3.h2w ... OK!
Creating file 4.h2w ... OK!
Creating file 5.h2w ... OK!
Creating file 6.h2w ... OK!
Creating file 7.h2w ... OK!
Creating file 8.h2w ... OK!
Creating file 9.h2w ... OK!
Creating file 10.h2w ... OK!
Creating file 11.h2w ... OK!
Creating file 12.h2w ... OK!
Creating file 13.h2w ... OK!
Creating file 14.h2w ... OK!
Creating file 15.h2w ... OK!
Creating file 16.h2w ... OK!
Creating file 17.h2w ... OK!
Creating file 18.h2w ... OK!
Creating file 19.h2w ... OK!
Creating file 20.h2w ... OK!
Creating file 21.h2w ... OK!
Creating file 22.h2w ... OK!
Creating file 23.h2w ... OK!
Creating file 24.h2w ... OK!
Creating file 25.h2w ... OK!
Creating file 26.h2w ... OK!
Creating file 27.h2w ... OK!
Creating file 28.h2w ... OK!
Creating file 29.h2w ... OK!
Creating file 30.h2w ... OK!
Creating file 31.h2w ... OK!
Creating file 32.h2w ... OK!
Free space: 576.00 KB
Average writing speed: 16.52 MB/s
$

 

이제 읽기를 테스트할 차례입니다. 다음과 같이 f3read를 사용합니다. 왼쪽에서 오른쪽으로 ok / corrupted / changed / overwritten 이라고 되어 있는데, 정상 SD 카드라면 ok를 뺀 나머지 칸은 다 0이어야 합니다. 제 SD 카드의 경우는 7번째 구간까지는 정상적이나 8번째 구간부터 데이터가 망가져 있는 것을 볼 수 있습니다. 테스트가 끝나면 요약을 해 주는데 이 SD 카드는 전체 32 GB 중 7.48 GB 만 정상이고 나머지는 고장난 카드입니다. 버려야겠습니다.

$ f3read /Volumes/my_sd_card
F3 read 8.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

                  SECTORS      ok/corrupted/changed/overwritten
Validating file 1.h2w ... 2097152/        0/      0/      0
Validating file 2.h2w ... 2097152/        0/      0/      0
Validating file 3.h2w ... 2097152/        0/      0/      0
Validating file 4.h2w ... 2097152/        0/      0/      0
Validating file 5.h2w ... 2097152/        0/      0/      0
Validating file 6.h2w ... 2097152/        0/      0/      0
Validating file 7.h2w ... 2097152/        0/      0/      0
Validating file 8.h2w ... 1009269/  1087883/      0/      0
Validating file 9.h2w ...       0/  2097152/      0/      0
Validating file 10.h2w ...       0/  2097152/      0/      0
Validating file 11.h2w ...       0/  2097152/      0/      0
Validating file 12.h2w ...       0/  2097152/      0/      0
Validating file 13.h2w ...       0/  2097152/      0/      0
Validating file 14.h2w ...       0/  2097152/      0/      0
Validating file 15.h2w ...       0/  2097152/      0/      0
Validating file 16.h2w ...    2880/  2094272/      0/      0
Validating file 17.h2w ...       0/  2097152/      0/      0
Validating file 18.h2w ...       0/  2097152/      0/      0
Validating file 19.h2w ...       0/  2097152/      0/      0
Validating file 20.h2w ...       0/  2097152/      0/      0
Validating file 21.h2w ...       0/  2097152/      0/      0
Validating file 22.h2w ...       0/  2097152/      0/      0
Validating file 23.h2w ...       0/  2097152/      0/      0
Validating file 24.h2w ...       0/  2097152/      0/      0
Validating file 25.h2w ...       0/  2097152/      0/      0
Validating file 26.h2w ...       0/  2097152/      0/      0
Validating file 27.h2w ...       0/  2097152/      0/      0
Validating file 28.h2w ...       0/  2097152/      0/      0
Validating file 29.h2w ...       0/  2097152/      0/      0
Validating file 30.h2w ...       0/  2097152/      0/      0
Validating file 31.h2w ...       0/  2097152/      0/      0
Validating file 32.h2w ...     640/   488961/      0/      0

  Data OK: 7.48 GB (15692853 sectors)
Data LOST: 23.75 GB (49808460 sectors)
	       Corrupted: 23.75 GB (49808460 sectors)
	Slightly changed: 0.00 Byte (0 sectors)
	     Overwritten: 0.00 Byte (0 sectors)
Average reading speed: 0.00 Byte/s
$

 

유용한 내용이었으면 하트모양 공감을 눌러주세요!

[리눅스] The following packages have been kept back 원인과 해결 방법

 

우분투에서 sudo apt-get upgrade 실행 시 다음과 같은 메시지가 나오면서 업그레이드가 안 되는 경우가 종종 있습니다.

$ sudo apt-get upgrade

The following packages have been kept back:
  dkms ubuntu-advantage-tools
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

$

 

이는 기존에 설치되어 있던 프로그램 중에서 의존성이 변경된 경우가 있어서 업그레이드를 위해서는 기존에 컴퓨터에 설치되어 있지 않던 프로그램을 새로 설치해야 할 경우에 나타나는 경고 메시지입니다. 위 예제의 경우 dkmsubuntu-advantage-tools를 업그레이드 하기 위해서는 기존에 없던 프로그램들을 새로 설치해야 하기 때문에 경고만 해 주고 업그레이드를 실행하지 않은 것입니다.

 

이런 경우 새롭게 필요한 프로그램들을 추가로 설치하면서 apt-get upgrade를 실행하려면 다음과 같이 --with-new-pkgs 옵션을 주면 됩니다. 말 그대로 '새로운 패키지와 함께 (with new packages)' 업그레이드를 진행하라는 옵션입니다. 해당 옵션을 주었더니 새롭게 dctrl-toolsubuntu-pro-client-l10n 두 종류의 프로그램을 설치하면서 dkmsubuntu-advantage-tools를 업그레이드하는 것을 볼 수 있습니다.

$ sudo apt-get --with-new-pkgs upgrade

Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  dctrl-tools ubuntu-pro-client-l10n
The following packages will be upgraded:
  dkms ubuntu-advantage-tools
2 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 349 kB of archives.
After this operation, 590 kB of additional disk space will be used.
Do you want to continue? [Y/n]

$

 

한편 이렇게까지 해도 안 되는 경우가 있다면 다음과 같이 aptitude를 설치하신 후에 aptitude를 통해 업그레이드를 진행하는 방법도 있습니다. 하지만 대부분 여기까지 오지 않아도 위의 방법으로 해결이 될 것입니다.

$ sudo apt-get install aptitude -y
$ sudo aptitude safe-upgrade

[이클립스] C/C++ Build Settings에 Tool Settings가 없을 경우 해결법

 

1. Properties -> C/C++ Build -> Settings에 가면 Tool Settings가 없는 경우가 있습니다.

2. 그럴 경우 Properties -> C/C++ Build로 가서 Makefile generation에 있는 Generate Makefiles automatically와 Expand Env. Variable Refs in Makefiles를 체크해주고 Apply and Close를 누릅니다.

3. 다시 Properties -> C/C++ Build -> Settings에 가면 Tool Settings가 나타나 있습니다.

 

 

 

 

분명 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을 실행시키고 이것저것 눌러보다가 창을 닫았다. 기분이 참 $_ 한 오늘이다.

+ Recent posts