2018년 4월 29일 일요일

독서 기록 - <인간을 위한 신>외 네 권

이번 주에는 문재인 대통령과 김정은 북한 국무위원장 간의 정상회담이라는 역사적인 대사건이 있었다. 남북 분단이 이대로 고착되는 것은 아닌지, 지금까지 수십 년 동안 살아오던 방식 그대로 앞으로도 살아가게 될 것이라는 타성에 젖어들 무렵 놀라운 일이 벌어진 것이다. 이렇게 세상은 변한다. 그 변화가 바람직한 것이고, 더 나은 세상이 앞으로 올 것이라는 희망이 있다는 것이 너무나 반갑다.

이번에는 철학 서적에 치중하여 독서를 하였다.


나는 태어나자마자 속기 시작했다

  • 오찬호 지음
  • "의심 많은 사람을 위한 생애 첫 번째 사회학"
...사회가 한 명의 힘으로 변화하지 않는다는 사실이다. 사회는 그 안을 살아가는 절대 다수의 대중들이 '비판적 시민'으로서의 권리를 주장하고, 누릴수록 개선된다. 이 상식을 한국 사회에서는 가르쳐주지 않고 오히려 '일단 순응하고 나중에 바꾸든지 하라!'면서 '탈'시민이 되기를 강요한다(13쪽).

철학 읽는 힘

  • 사이토 다카시 지음, 홍성민 옮김
  • "지적 교양을 위한 철학 안내서"
2500년의 서양 철학을 세 가지 산맥으로 명쾌하게 정리한 입문서.


세상을 바꾸는 언어

  • 양정철 지음(2018년 1월 6일 한겨레신문 기사)
  • "민주주의로 가는 말과 글의 힘"
문재인 대통령을 '기획'하고 만든 일등공신이지만 홀연히 권력의 곁을 떠나 외국에 머물며 '민주'의 홍보(즉 언어)를 위하여 쓴 책. 잘 알려진 말이지만 언어가 의식과 사고를 지배한다. 올바른 언어는 평등·배려·공존·독립 및 존중을 위해 필수적인 조건이다.

인간을 위한 신(The GOD Argument)

  • A. C. 그레일링 지음, 하윤숙 옮김
"휴머니즘은 인간의 삶에 관한 것이며 내세에 관한 믿음을 필요로 하지 않는다."

가벼움의 시대

  • 질 리포베츠키 지음, 이재형 옮김
  • "우리 시대를 지배하는 가벼운 것의 문명"
"우리 시대의 위험은 변덕스러운 가벼움이 아니라 가벼움의 비대함이다!"

2018년 4월 26일 목요일

[하루에 한 R] clustering 결과에서 Newick format의 트리 파일 추출하기

R에서 데이터프레임을 hclust() 함수로 처리하여 얻어진 클러스터링 결과물을 시각적으로 분석하는 일이 흔하다. 여기에서 만들어진 dendrogram을 Newick file로 추출하여 다른 응용프로그램에서 확인하려면 어떻게 하면 좋을까?

내가 구하는 대부분의 질문은 인터넷을 잘 검색만 해도 그 답이 나온다. 이번에는 StackOverflow에서 그 해답을 찾았다.

How to create a newick file form a cluster in R?

재료로 사용한 파일은 pyani가 생성한 ANIb_percentage_identity.tab이다. 이 파일은 헤더 라인의 첫 컬럼이 비어있으므로 row.names=1을 설정하면 아주 쉽게 데이터프레임으로 읽어들일 수 있다. R 코드는 아주 심플하다. as.phylo() 함수에 들어갈 값은 hclust class여야 한다.

> install.package("ape")
> library(ape)
> d = read.table("ANIb_percentage_identity.tab",sep="\t",header=T,row.names=1)
> fit = hclust(dist(as.matrix(d)),method="average")
> my_tree=as.phylo(fit)
> write.tree(phy=my_tree,file="test.newick")

참조했던 링크에서는 heatmap.2() 함수로 만든 자료를 연속적으로 변화시켜 가면서 newick 파일을 추출하는 방법도 소개되어 있는데 약간 번거롭다. Row와 column dendrogram 중 필요한 것을 골라서 변형시키면 된다. 이 방법 역시 ape 패키지를 로드해야 하며, heatmap.2() 함수를 쓰려면 gplots 패키지도 로드해야 한다.

> heat = heatmap.2(as.matrix(data))
> row.dendro = heat$rowDendrogram
> row.hcclust = as.hclust(row.dendro)
> row.phylo = as.phylo(row.hcclust)
> row.newick = write.tree(row.phylo)

마지막 명령은 좀 이상하다. 저런 방법으로 실행하면 R prompt에서 row.newick이라고 쳐서 화면에 newick 파일의 내용을 출력할 수는 있지만 이를 마우스로 긁어서 파일로 저장할 수는 없지 않은가. 다음과 같이 하는 것을 추천한다.

> write.tree(phy=row.phylo,file="test.newick")

2018년 4월 25일 수요일

도쿠위키(DokuWiki) 최신판 업그레이드 하려다 망한 사연

DokuWiki 최신판인 2018-04-22 "Greebo"가 나왔다고 하여 위키 업그레이드 플러그인을 사용하여 업그레이드를 하였더니 접속이 안되는 대참사가 발생하였다. 미생물 유전체 대상의 생명정보학 실무와 관련한 상당히 많은 자료를 정리해 두었는데 이를 어떻게 복구할 것인가? 이 위키사이트는 주로 개인적으로만 활용하고 있어서 접속이 되지 않는다고 해서 큰일이 날 것은 없지만 내가 불편하다는 것이 문제이다.

내가 사용하는 호스팅 업체에서는 일주일 단위의 백업을 제공하기 때문에 이것을 가져다가 어렵사리 복구를 하였다. 왜 문제가 생긴 것이었을까? 이번 버전의 DokuWiki로 업그레이드를 하려면 업그레이드 플러그인 자체를 먼저 업데이트하라는 것을 미처 눈치채지 못하였다.

현재 기준의 old stable 버전인 2017-02-19e 버전을 호스팅 사이트에 별도로 설치한 다음 최신의 업그레이드 플러그인을 설치한 뒤 업그레이드를 시도해 보았다.


PHP 버전을 5.6으로 올리지 않으면 DokuWiki를 업그레이드하지 못한다는 경고 메시지가 나왔다. 업그레이드 플러그인을 업데이트하지 않은 상황에서는 이런 경고가 전혀 나오지 않은 상태로 끝까지 진행이 되었으니 문제가 있음을 알 수가 없었다.

그렇다면 위키 업그레이드가 아예 불가능한가? 그건 아니다. 왜냐하면 호스팅 사이트의 제어판에서 PHP의 버전을 얼마든지 올릴 수 있기 때문이다. PHP를 버전 5.6으로 올린 뒤 시험용 DokuWiki를 업그레이드해 보았다. 성공적으로 업그레이드가 되어서 잘 작동함을 확인하였다. 이에 용기를 얻어서 먹통이 되었던 위키 사이트를 성공적으로 업그레이드하였다.

2018년 4월 23일 월요일

6N1 + 6P1 싱글 엔디드 진공관 앰프의 트랜스 울림 해결

난생 처음으로 전원 트랜스를 주문제작하여 진공관 앰프를 조립하였는데 전원 트랜스에서 웅~ 하는 떨림이 심하게 난다. 그 이유가 무엇일까? 인터넷을 뒤져보았다.

  1. 함침(impregnation) 불충분. 함침이란 트랜스 내부의 공기를 빼내고 절연 바니쉬 등으로 메우는 것이다.
  2. 용량 부족
  3. 전원에 DC가 유입될 경우
제이앨범(링크)에 계속 글을 올리면서 문제점을 점검해 나갔다. 첫번째 제안은 전원 용량이 부족한 것이 아니겠느냐는 지적이었다. 설계 용량은 230 V 120 mA, 6.3 V 1.6 A였다. 초크 코일 대용으로 넣은 220옴 5와트 시멘트 저항 양단의 전압 강하를 측정하여 저항으로 나누면 전류값이 나온다. 계산으로는 85 mA였다. 계획한 120 mA에 비하여 너무 낮은 것이 아닐까? 하지만 제이앨범에서는 괜찮은 수치라고 했다. 그렇다면 히터용 전원이 의심스럽다. 부하를 걸지 않으면 울림이 없는 것으로 보아서 분명히 작동 중에만 일어나는 현상이다.

만약 히터를 제2의 전원으로 점화하면 어떻게 될까? 마침 나에게는 LM1876 앰프에 사용하던 13 V - 0 V - 13 V 전원 트랜스가 하나 더 있다. 중간 탭과 13 V 탭을 출력관(6P2) 두 개의 히터에 연결하면 될 것 같았다. 히터는 직렬로 연결하면 각 히터에 대해서 6.5 V 정도의 전압이 잘 배분될 것 같았다.


부하를 건 상태에서 실제로 히터 양단 간의 전압을 측정하니 7 V가 넘는 전압이 걸렸다. 이대로 쓰기에는 전압이 너무 높다. 주변에 있는 저항을 적당히 조합하여 원하는 전압이 나오도록 조절해 보았다. 8.2 Ohm 5 W 저항 두 개를 병렬로 연결하여 합성저항 4.1 Ohm을 만든 뒤 중간에 삽입하니 6.2 V 정도로 아주 적당한 히터 전압이 나왔다. 저항의 발열도 그다지 크지 않았다. 계산을 통해 히터 회로에는 0.45 A의 전류가 흐름을 알았다. 6P1 specification에 나온 그대로이다.

테스트용 음악을 하루 종일 연주하는 지금의 모습이다. 소출력 앰프 하나에 전원 트랜스를 무려 두 개나 동원하다니! 앰프의 경량화는 이미 예전에 물건너 갔다. 이제 전원 트랜스 울림은 들리지 않는다. 음질은 라디오를 듣는 것과 약간 유사한 느낌인데, 이는 일반 전원 트랜스를 적당히 개조하여 아웃풋 트랜스로 사용했기 때문일 것이다. 그렇다 해도 음량은 꽤 높게 나와서 책상 앞의 SPL 87 dB 스피커를 충분히 울려준다. 사실 여기에 차마 옮기기 부끄러운 - 그리고 위험한 - 실수도 많이 있었다. 힘은 들었으나 좋은 경험이었다. 아마도 다음번 프로젝트는 R 코어를 이용한 출력 트랜스 제작이 아닐까 생각한다.


[하루에 한 R] reshape 패키지를 이용하여 쌍(pairwise) 자료를 매트릭스로 전환하기

dRep(논문, GitHub)은 수십, 혹은 그 이상의 미생물 유전체를 신속하게 비교하여 중복을 제거하는 도구이다. 메타게놈 데이터의 처리에도 유용하지만 다량의 유전체 자료를 비교하여 유사도(gANI) 기준으로 샘플을 묶는 데에도 편리하게 쓰일 수 있다. 그러나 pyani 처럼 매트릭스 형태의 자료를 제시하지 않는다. ANI 값들이 일단 매트릭스로 주어진다면 분석자의 입맛에 맞는 가공과 시각화가 가능하지 않겠는가?

결과 디렉토리 안에 활용 가능한 자료가 있을 것이라 생각하고 data_table 디렉토리를 열어보았다. 다음과 같은 네 개의 csv 파일이 존재한다.

Bdb.csv  Cdb.csv  Mdb.csv  Ndb.csv

하나씩 열어보면 무슨 자료를 담고 있는지 누구나 파악할 수 있다. 이 중에서 Ndb.csv가 모든 유전체를 1:1로 pairwise 비교를 하여 계산한 수치를 담은 파일이다. 파일의 형식은 다음과 같이 첫 줄에 나온다. 왜 query가 아니고 querry인가? 내가 잘못 타이핑한 것이 아니라 실제 결과 파일을 복사해서 여기에 가져다 놓았을 뿐이다.

alignment_coverage,ani,querry,reference,MASH_cluster

굵은 글씨로 표현된 컬럼만 뽑아내면 된다. 이는 awk를 적절히 사용하는 것으로 가능하다.

$ awk -F"," -v OFS="\t" '!/^alignment/{print $3, $4, $2}' Ndb.csv > matrix.txt

query와 reference 컬럼은 실제 dRep 계산에 사용한 파일 이름 그대로이다. 나의 경우는 다음과 같다.

Lactobacillus_rhamnosus_116_GCF_000801045.1.fna

너무 길어서 보기가 좋지 않다. Lacto..에서 GCF까지를 non-greedy하게 제거하고, 다음으로 .fna 확장자를 제거하는 것이 좋을 것이다. GCF_까지 없애면 나중에 R로 읽어들였을 때 숫자로 인식을 하여 약간 번거로워진다. non greedy하게 매치된 문자열을 없애려면 vim의 last line mode에서 다음과 같이 입력한다.

:1,$s/Lacto.\{-}_GCF//g
:1,$s/.fna//g

그 다음으로는 R에서 데이터프레임으로 읽어들여서 처리하면 된다. Ndb.csv는 두 샘플이 각각 query와 reference일 때의 gANI 값을 두 개의 라인으로 기록해 놓은 것이다. 따라서 매트릭스로 전환한 다음에는 대각선에 대하여 대칭이 아니다. 이는 t() 함수로 역행렬을 만든 것을 자기 자신에게 더한 뒤 둘로 나눔으로써 해결한다.

R 코드는 다음과 같다. reshape 패키지(링크)가 큰 도움이 되었으며, 힌트는 여기에서 얻었다. 이 패키지는 R 개발자로 널리 알려진 해들리 위캠의 작품이다.
> install.packages("reshape")
> library(reshape)
> d = read.table(file="matrix.txt",sep="\t",header=F)
> d2 = cast(d,V1~V2)
> rownames(d2) = d2[,1]
> d2 = d2[,-1]
> d3 = (d2 + t(d2))/2
# 확인용
> dim(d3)
> View(d3)

[업데이트]

위에서 보인 R 코드는 언제나 적용 가능한 것이 아니다. 자세한 것은 [하루에 한 R] pair 형태의 데이터를 matrix로 전환할 때 주의할 점을 참고하라.

[2021년 8월 26일 업데이트]

무려 3년이 지난 상황에 위 R code의 오류를 발견하였다. cast() 함수로 읽어들인 데이터는 매트릭스의 대각선을 기준으로 절반에 대한 것이다. 나머지 절반은 같은 값으로 채워야 한다. 따라서 d3 = (d2 + t(d2))/2가 아니라 d3 = (d2 + t(d2))가 되어야 한다. 으이그...

2018년 4월 21일 토요일

6N1 + 6P1 싱글 엔디드 진공관 앰프 조립

헤드폰 앰프를 제외하면 내가 소유한 세번째의 진공관 앰프이다. 주문제작한 전원트랜스가 어제 도착하는 바람에 조립이 늦어졌다. 엄밀히 말하자면 조립이라고 할 것도 없다. 나무판 위에 부품을 늘어놓고 배선을 한 것이 전부이기 때문이다. 번듯한 섀시에 꾸며 넣어야 조립이라고 할 수 있지 않을까.

토요일 오전, 많은 기대를 갖고서 작업을 진행하였다. 혹시 잘못 배선하여 불꽃이 튀지는 않을지 걱정하며 전원을 넣었다. 아무런 문제가 없었다. B+ 전압도 정상이고 진공관의 히터에도 불이 잘 들어왔다. 그러면 소스기를 연결할 차례이다.

어라? '두두두두...'하는 소리만 날뿐, 볼륨 폿을 아무리 올려도 음악이 들리지 않는다. 게다가 전원트랜스는 왜 이렇게 우는가. 이것은 트랜스 문제라고 치자. 다 만들어진 PCB에 배선만 했을 뿐인데 도대체 뭘 잘못했기에 이것밖에 안된단 말인가. 정말 오디오 자작은 내 실력으로는 안되는 일인가.

실망감을 가득 안은 상태로 아내와 함께 시내 나들이를 하였다. 중앙시장 원단·부자재 시장에서 필요한 물건을 사고 소나무집에서 오징어찌개 칼국수를 먹었다. 이 식당은 처음 방문이다. 별 다섯 개 만점에 네 개를 주겠다.


집에 돌아와서 다시 앰프를 들여다보았다. 전원 트랜스를 개조하여 출력 트랜스로 사용했다고 하여 이렇게까지 엉망일 수는 없는 노릇이다. 매우 단순한 오류가 아니었을까? 다시 배선을 살펴보니 입력 RCA 단자에서 그라운드쪽 선이 끊어진 것이 아닌가? 그러면 그렇지! 다시 튼튼하게 납땜을 마친 뒤 전원을 넣었다. 그러면 그렇지! 채널 당 3 W라는데 SPL 89 dB의 스피커를 아주 잘 울려준다. 소리도 만족스럽다.




못쓰는 PC용 파워 서플라이를 활용하여 전원 트랜스를 수납하고 원래 달려있던 파워 소켓과 전원 스위치를 활용하였다. 스피커 단자도 여기에 고정하였다. 전원 트랜스의 누설 자속을 차폐하는 효과가 있을 것으로 기대했는데 트랜스 자체의 떨림이 심하니 어떻게 해야 할지를 모르겠다. 배선 수준은 별로 아름답지 못하다.


CD 플레이어를 연결하여 음악을 듣다가 도중에 스피커 단자를 빼 보았다. 그러자 놀라운 일이 벌어졌다. 아주 작게 음악이 울려 나오는 것이 아닌가? 진공관이 울릴 것 같지는 않고, 그렇다면 출력 트랜스?

알리익스프레스에서 구입한 앰프 보드는 일단 만족스럽다. 일반 전원 트랜스(220V:9V)를 개조하여 출력 트랜스로 사용하는 실험 역시 성공적이었다. 문제는 전원 트랜스의 떨림이다. 이것은 트랜스를 바꾸는 것 말고는 해결 방법이 없는 것일까? 절반의 성공으로 만족할 수는 없다.

2018년 4월 20일 금요일

시공간 단축의 욕망

과도한 소비 문화는 현대 사회의 한 특징이다. 워낙 주변에 만연하여 있고 계속 퍼져나가기 때문에 마치 감염병과 유사하다. 이를 비판적으로 표현하는 신조어인 어플루엔자(affluenza = affluence + influenza)라는 말이 생길 정도니 말이다.

재활용 쓰레기 처리 문제로 전국이 한바탕 난리를 치렀다. 미봉책으로 겨우 땜질은 하였지만, 근본적인 대책이 필요하다. 쓰레기를 잘 분리하고 씻어서 재활용 업체가 제 값을 받고 팔 수 있게 만드는 것은 최선이 아니다. 일회용품의 배출 자체를 줄이려는 노력이 필요하다.

풍요롭지는 않았지만 그렇다고 해서 부족하지도 않았던 어린 시절을 돌이켜 보았다. 그때는 그 어느 누구도 물병을 들고 다니지 않았고, 커피잔을 들고 다니지 않았다. 여름에 길을 가다가 목이 마르면 노점에서 냉차를 사먹거나, 가게에서 유리병에 든 탄산음료를 마셨다. 거리를 돌아다니면서 무엇을 먹는 것은 흔한 일이 아니었다. 하지만 지금은 어떤가.

출처: 동아일보
이러한 산업 덕분에 많은 사람들이 생계를 유지한다지만, 넘쳐나는 쓰레기는 어떻게 하란 말인가. 이제는 설거지 일손을 줄이기 위해 매장에서 음료를 마시는 손님에게도 일회용 잔에 커피를 담아준다.

'되도록 이런 소비를 하지 말자'고 주장할 수는 있다. 기호성 음료수를 마시는 것은 선택의 문제니까 말이다.

오늘 아침, 오디오 DIY를 위한 부품을 택배로 받았다. 4월 2일에 주문한 것을 거의 3주나 걸려서 입수한 것이다. 제조사에서 평판이 별로 좋지 못한 택배회사에 물건을 맡긴 것도 이런 불편을 초래한 주요 원인이 되었다. 운송장 번호도 자동으로 알려오지 않았고, 언제 배달이 될 것이라는 연락도 없었다. 기다리다 못해 지역 사무실에 전화를 하여 물어보니 배송 기사 전화번호를 알려주었다. 하지만 기사는 하루 종일 전화를 받지 않았고, 사무실에서도 무슨 일인지 기사에게 연락이 안되니 다음날에는 꼭 배달이 되게 하겠다는 말만 전해 들었다.

배송 기사가 연락 두절 상태라니!

기대를 하지 않고 있었는데 다음날에 해당하는 오늘 아침, 결국 물건을 받았다. 익일 배달 원칙이라고는 하지만 그러고도 이틀이나 더 지나서 물건을 받게 된 것이다. 저녁이 다 된 지금 배송조회 사이트를 가 보았다. 아직도 배송완료로 전환되지 않았다.

지친 배송기사의 모습을 보면서 많은 생각을 하였다. 현대 사회는 대중이 원하는 제품이나 서비스를 만들고 우리는 이를 소비한다. 얼마 되지 않는 비용을 내고서 음식이나 물건이 금방 집앞으로 배달되는 것을 보면 한국의 물류산업의 수준이 대단하다는 착각이 들 정도이다. 그러나 배달할 물건이 열 배, 스무 배 많아진다고 해서 배송 기사들이 행복해질까? 더 많은 수익을 낼 수 있어서? 그렇지 않다는 것은 우리가 너무나 잘 알고 있다. 그렇다면 물류산업이 자동화와 뼈를 깎는 혁신을 통해서 영세성을 타파하고 수익을 올릴 수 있을까?

"이렇게 수요가 많은데 왜 수익을 못 내? 비용 절감하고 혁신하면 되잖아?"

이것은 너무나 소비자 위주의 관점이다. 이렇게 말하는 것과 무엇이 다른가?

"재활용 업자가 왜 쓰레기를 안 사갖고 가지? 다 돈이 되는데?"

게다가 너무나 많은 물건을 온라인으로 구입하게 되면서 엄청난 양의 포장 쓰레기가 발생한다. 과연 내가 택배 서비스 없이 취미생활을 할 수 있을까? 과거에는 없어도 상관이 없었고 있으면 고마왔던 서비스가 이제는 어떻게 되었나? 없으면 살기 어려울 지경으로 우리 생활 속에 깊숙이 파고 들고 말았다. 상황이 이러하니, '왜 일회용 컵에 음료를 마시는 걸까. 이건 선택할 수 있는 거잖아'라는 논리를 택배 서비스에도 들이댈 수 있다. '직접 가서 사면 되지, 왜 쓰레기(포장재)를 만드는 서비스를 이용한단 말인가?' 어느 것은 불가피하고 다른 어느 것은 선택할 수 있고... 그런 수준의 일이 아닌 것이다.

모든 것은 시공간 단축을 향한 인간의 욕망에서 온 것이라 생각한다. 더 많은 것을 갖고, 누리고 싶은 욕망이라고 보아도 좋다. 기다리지 않고도 만들어진 음식을 먹고 싶고, 시장에 직접 가지 않고도 물건을 사고 싶고, 제철이 아닌데도 신선한 과일을 먹고 싶고, 바닷가에 살지 않으면서도 해산물을 먹고 싶고, 가게가 문 열 시간을 기다리지 않고 새벽 세 시에도 물건을 사고 싶고... 기술과 산업이 이 욕망을 충족하고 돈을 벌게 해 준다. 그런데 그 부산물은 결코 긍정적이지 않다. 이를 뒷받침하는 저임금 노동자는 오늘 하루도 고단한 몸으로 온갖 손님을 상대하고, 길거리는 쓰레기로 넘쳐난다.

좀 더 나아질 방법은 없을까?

추가로 작성한 글

국내 물류산업이 영세하다는 뉴스를 하나 인용해 보자.

국내 물류산업 중소기업 비중 "99.9%" (카고뉴스 링크)
... 우리나라 물류산업의 가장 큰 문제점으로 기업 규모의 영세성을 들었다. 전체 물류산업에서 300인 미만의 중소기업이 차지하는 비중은 기업 수 기준 99.9%로 가장 높은데 평균 매출은 7,500만 원으로 대기업 5,310억 원에 비해 턱없이 낮은 수준이라는 설명이다.
이럴때 쓰는 말인지는 모르겠지만, 소위 '규모의 경제'를 위해서 영세한 업자는 전부 대기업에 자리를 내주어야 하는가? 농업이 그러했고, 동네 상점이 그러했다. 그러면 밀려난 사람들은 어떻게 하란 말인가?

유튜브 레드 가입

광고 없는 음악 재생을 위하여 나에게 작은 선물을 하였다. 그것은 바로 YouTube Red!


광고가 나오지 않음은 물론이요, 모바일 기기에서 음악을 재생할 때 화면이 꺼져도 계속 음악이 나온다. 이렇게 편할 수가 없다.

나는 거의 전적으로 유튜브에 등록된 음악을 감상하기만 하는 입장이다. 이러한 경우 저작권 혹은 저작인접권 문제는 어떻게 되는지는 잘 모르겠다. 만약 다른 사람이 만든 노래를 내가 연주하는 경우를 가정해 보자. 이때에는 준수할 것이 더 많아질 것이다.

  • 집에서 연주를 한다.
  • 공공 장소에서 연주를 한다.
  • 내가 연주한 동영상을 주변 사람에게 제한적으로 공유한다.
  • 내가 연주한 동영상을 유튜브에 올린다.
여기에서 사례를 든 4가지 행동이 전부 무제한적으로 허용되지는 않는다. 저작권이 아직 남아있는 경우와 클래식 음악처럼 저작권이 오래전에 만료된 것이 대부분이라서 약간 상황이 다를 것이다. 저작권 관련 사항을 찾아서 이 글에 정리할 정도로 지금 당장 여유가 있는 것은 아니라서 나중을 위한 숙제로 남겨놓겠다. 어찌되었든 남이 창작한 문화적 산물을 이용할 경우(특히 상업적 이용) 어떻게 해야 법률을 위반하는 것이 아닌지는 반드시 공부를 할 필요가 있다.

2018년 4월 16일 월요일

세월호 참사 4주년


오늘은 세월호 참사가 일어난지 꼭 4주년이 되는 날이다. 작년 3월 아들과 함께 진도 팽목항을 방문하여 찍은 사진을 찾아보았다. 수학여행을 간다면서 밤잠을 설치며 좋아하던 아이들은 차가운 물 속에서 영원히 돌아오지 못할 길을 떠나고 말았다. 아이들을 생각하면 지금도 눈물이 날 것만 같다. 사진 속에 남아있는 노란 깃발은 차가운 바닷바람과 햇볕에 의해 조금씩 해어져 가고 있었다. 시신만이라도 온전히 돌아오기를 바라던 가족들의 희망도 그처럼 사그라들었으리라. 그 이후로 우리 사회는 얼마나 달라졌을까. 정말로 안전하고 상식이 통하는 사회가 되었을까...

한 명의 천재가 수만 명을 먹여 살린다는 말이 있다. 나는 이 말이 너무 불편하다. 거대 기업의 CEO든, 작은 규모의 자영업을 하는 사람이든, 회사원이든, 어린 학생이든, 한 사람의 생명이 꺼진다는 것은 하나의 하늘이, 하나의 세계가 없어지는 것이다. 그 사람이 큰 조직에서 높은 위치에 있는 사람이라고 해서 사회적으로 큰 손실이라고 생각할 것이 아니다. 사람은 대체할 수 없는 존재이므로.

그렇게 306명의 '세계'가 사라졌다. 책임은 누가 져야 하는가. 푸른 지붕 집 높은 자리에 있던 '그 분'의 눈에 거슬리는 일을 하기 싫어서 사람들의 외침을 그렇게 막았던가.

6N1 + 6P1 SE(single-ended) 진공관 앰프 부품 도착

지난 금요일, 알리익스프레스에서 구입한 앰프 보드가 도착하였다. 진공관(6N1 하나, 6P1 두 개)에 선명하게 한자가 찍혀있다.



오디오파트에 주문한 전원 트랜스는 지난 토요일에 출고 예정이라고 하였다. 핵심 부품 하나가 없으니 주말에 한 일이라고는 나무판 위에 부품을 늘어놓고 입력부 연결 작업만 한 것이 전부이다. 나무판은 삼화문구몰에서 구입한 판화용 목판이다. PCB를 고정할 쪽에는 나사못이 삐져나오지 않도록 한 장을 잘라서 덧대었다. 나무판이 매우 부드러워서 가공하기에는 좋은데 영구적으로 사용할 재료는 못된다. 이보다 훨씬 튼튼한 코팅 합판이 집에 많이 있으나 톱질로 잘라내기가 싫어서 교재용 목판을 택한 것이다. 톱질 똑바로 하기, 전동 드릴로 구멍 수직으로 뚫기 등 기본적인 목공 실력이 좀처럼 늘지를 않아서 이런 편법을 사용하였다.



전원트랜스는 PC용 파워서플라이 케이스 안에 수납할 예정이다. AC 소켓과 전원 스위치가 이미 장착되어 있는데다가 금속판으로 만들어졌으므로 어느 정도의 차폐 효과가 있을 것으로 기대한다. 아울러서 스피커 단자도 여기에 고정할 생각이다.

나무판을 브레드보드(breadboard)로 사용하는 것은 매우 오래된 전통이다. 가끔 나무 도마를 쓰는 경우도 있다고 한다. 추측하건대 빵반죽판 위에 부품을 늘어놓고 프로토타이핑을 하던 옛날 관습에서 나온 용어는 아닐까? 앰프 회로는 어느 정도 정해진 것을 따르게 되지만, 이를 멋진 샤시에 조립하여 넣든 혹은 소박하게 나무판 위에 배열하든 이를 실제로 구현해 나가는 과정에서는 제작자가 창의력을 마음대로 발휘할 수 있다.

그림 출처: DIY 메카솔루션 오픈랩(링크)
다만 한가지 불편한 일이 있으니 바로 입출력 및 전원용 단자를 고정하는 일이다. 적당한 금속판이 있으면 이를 나무판 모서리에 수직으로 고정한 다음 구멍을 뚫어서 각종 입출력 단자를 꽂으면 된다. 아래의 사진이 바로 그러한 사례 중 하나가 되겠다. 2t 알루미늄판에 커터칼로 금을 그어서 잘라내느라 얼마나 고생을 했는지 모른다.



더욱 골치가 아픈 것은 AC 소켓처럼 큰 사각형 구멍이 필요한 부품이다. 전동 드릴로 테두리를 따라 구멍을 낸 뒤에 줄로 다듬는 것이 일반적인 방법이다. 지금 만드는 것은 고압을 취급하는 진공관 회로이니 감전에도 주의해야 한다.

강기동 박사님(별명 KDK)의 스타일을 참고하자.

출처: 한국진공관앰프자작동호회(일명 한진동, 링크)


2018년 4월 12일 목요일

독서 기록 - 슈퍼인텔리전스(경로, 위험, 전략)

"AI 로봇이 해탈할 수 있을까?"

이것은 작년 12월에 열렸던 한국불교학회 국제학술대회에서 다루어진 주제이다. 아래 포스터의 제목에서 '4차 산업'은 '4차 산업혁명'으로 바로잡아야 한다. 이것은 다음 소프트 최재원 이사의 의견이었다. 4차 산업혁명은 네번째의 산업혁명이란 뜻이다. 3차 산업을 이은 4차 산업에 의한 혁명이 아니라는 의미이다. 물론 구글링을 하면 제4차 산업이라는 용어가 없지는 않다.

출처: 연합뉴스 2017년 11월 28일

이번 3박4일 간의 출장 기간 동안 닉 보스트롬(조성진 옮김)의 슈퍼인텔리전스('Superintelligence: Paths, Dangers, Strategies)를 읽었다. 이 책은 철학책에 가깝지만 기술적으로 전문적인 내용이 많아서 읽기에 썩 쉽지는 않았다. 유발 하라리의 <사피엔스>나 <호모 데우스>의 책장을 술술 넘기면서 읽던 것과는 달리, 이 책은 도서 대출 기간을 연장하면서까지 어렵사리 읽었다. 솔직하게 말하자면 눈은 행을 따라서 달려나가지만 머리로는 쉽게 이해가 가지 않는 곳이 많았다(나의 아주 나쁜 독서 버릇). 꼭 구입하여 줄을 쳐 가면서 다시 읽고 싶은 책이라고 할 수 있다. 빌 게이츠는 이것을 인공지능 분야에서 꼭 읽어야 할 두 권의 책 중 하나라고 했다는데, 나머지 하나는 뭔지 정말 알고 싶다.


앞부분에서는 인공지능 연구의 역사와 몇 차례 반복된 연추 침체기에 대하여 설명하는 것으로 시작한다. 초기 인공지능 연구에서는 기계로서는 불가능하다고 인식되던 일(X)을 해결할 수 있다는 희망으로 꽤 진전을 했다고 한다. 그러나 이는 매우 특수한 상황의 문제만 해결할 수 있었고, 문제가 조금 길어지면 당시의 컴퓨팅 기술로는 풀기가 어려웠다. 쉽게 말하자면 이런 요인으로 인하여 몇 차례의 'AI 겨울'을 겪게 된다. 그러다가 1990년대에 이르러 신경망이나 유전자 알고리즘 등이 등장하면서 구식 인공지능(GOFAI: Good Old-Fashioned Artificial Intelligence)를 능가하는 새로운 대안이 등장하게 된다. 아직 많은 전문가들조차 인간 수준의 기계지능(HLMI: Human-Level Machine Intelligence)은 2030년-2100년 사이에 개발될 것으로 예측하였다. 우리를 놀라게 했던 알파고 역시 HLMI는 아니다.

하지만 이 책에서 본격적으로 다루는 것은 HLMI가 아니라 초지능(superintelligence)이다. 이는 모든 관심 영역에서 인간의 인지능력을 상회하는 지능을 말한다. 초지능이 개발되는 방식은 인공지능, 전뇌(whole-brain) 에뮬레이션, 생물학적 인지능력 향상, 뇌-컴퓨터 인터페이스의 향상, 또는 네트워크와 조직의 향상으로 가능할 것으로 본다.

제4장 '지능 대확산의 동역학'에서는 (지능의 변화율) = (최적화 능력)/(저항성)이라는 수식을 통하여 초지능이 생겨나는 도약 과정을 흥미롭게 설명하였다. 뒤이어서는 초지능체가 하나만 나타날 것인지, 아니면 여러개가 발생하여 하나가 나머지를 압도하게 될 것인지에 대한 논의를 펼치며, 이렇게 디지털 초지능적 에이전트가 탄생한다면 과연 그것이 이 세상을 지배하게 될 것인지를 다루었다.

초지능이 자신의 목표에 맞게 미래를 주무를 수 있는 엄청난 능력이 있다면, 그 목표는 무엇일까? 지능과 동기 사이에는 어떤 관계가 있을까? 제7장에서는 '직교성 명제(orthogonal thesis)'라는 이해하기 어려운 용어가 나온다. 원칙적으로 그 어떤 지능 수준에서든 그 어떤 최종 목표라도 설정 가능하다는 것을 왜 이런 용어로 부르는 것일까? 이에 대해서는 닉 보스트롬 자신의 글(The Superintelligence Will 링크)를 참조해 볼 일이다. 어떤 최종 목표가 있는지는 잠시 젖혀두자. 최종 목표를 위해 달성해야 할 도구적 목표는 좀 더 이해하기 쉽니다.

  • 자기 보호
  • 목표-콘텐츠의 보전
  • 인지능력 향상
  • 기술적 개선
  • 자원 획득
이러한 도구적 목표를 달성하기 위하여 만약 인류가 걸림돌이 된다면 초지능 에이전트는 인류를 존재적 재앙으로 몰고 갈 것인가? 그렇다면 어떤 대책을 세워야 하는가? 인공지능에게 어떻게 가치를 부여하고 그것을 최종 목표로 삼도록 할 수 있을까? 가치 탑재 방법을 알아내었다고 하도 어떤 가치를 부여할 것인지를 어떻게 결정할 것인가? 다시 말해서 '초지능이 바라는 것이 무엇이기를 바라는가?'

전에 쓴 글의 내용이 떠오른다. "너는 무엇을 원한다고 믿고 싶은가?(링크)"

마지막 장의 내용을 일부 인용한다.
기계지능 혁명이 유익한 방향으로 일어날 수 있도록 할 수 있는 통제방법의 개발은 촉진하지 않고, 그저 기계지능의 개발 속도만 높이는 한, 인공지능 분야의 몇몇 기술적인 문제들의 해결책은 부정적인 영향을 줄 수 있다.
이제부터 쓰는 글은 나의 상상이다. 초지능이 나타난다면, 그 자체도 철학적 고민을 하지 않을까? 나(초지능)은 왜 태어났는가? 존재의 목적이 무엇인가? 최종적 목적 달성(예를 들어 인류를 멸망시키거나 복종하게 만드는 것)은 나에게 어떤 유익이 있는가? 만족 혹은 유익이란 무엇인가? 인간에게만 있다는 감정은 왜 나에겐 없을까?...


2018년 4월 9일 월요일

6J6 푸시풀 앰프의 출력 측정

Tektronix TDS 210 오실로스코프. 출시된지 20년이 넘은 모델이다. 핵정 화면의 밝기도 고르지 않고, 놉 두 개가 사라졌다. 펑션 제너레이터에서 나오는 1 kHz의 사인파를 앰프에 걸고 5 와트 8.2 옴 저항을 스피커 단자에 연결한 다음 프로브를 같이 연결하였다. 오실로스코프 사용법도 잘 기억이 나질 않는다. 유저 매뉴얼을 아직도 인터넷에서 구할 수 있어서 다행이다(링크; 초보자 가이드).


클리핑이 일어나기 직전까지 입력 신호를 올린 다음 출력 신호(전압)의 피크치를 측정한다. 사진에서 보인 사례에서는 커서를 움직여서 측정하였지만 메뉴를 잘 뒤지면 자동 계산이 되는 기능이 있을 것이다. 0 볼트 기준으로 피크치를 구한 다음 V^2/2/R을 하면 rms 값의 와트가 나온다고 하는데 제대로 된 식을 찾은 것인지 확신을 못하겠다. 이렇게 계산하면 출력은 채널 당 0.3 W를 겨우 넘는다. 오잉? 책상 앞에 가까이 놓인 SPL 87 dB짜리 스피커를 그런대로 울리고 있는데 이렇게 출력이 작단 말인가? 2 W는 될 것이라 생각했었는데 아무리 초단관만으로 만든 앰프라 해도 명색이 푸시풀인데 이것밖에 안된단 말인가?

물론 입력신호를 더 올리면 찌그러짐을 감수하면서 더 높은 출력이 나올 것이다. 최대 출력을 계산하는 방법이 어디엔가 있을텐데... 그리고 주파수에 따른 차이도 아직 살펴보지 못하였다.

오실로스코프 사용법이나 정확히 공부한 다음에 다시 측정을 하자. 진공관 특성 곡선과 증폭회로의 기본도 이해하지 못하는 상태에서 출력은 측정하면 무슨 소용이 있겠는가.

2018년 4월 8일 일요일

수리를 마치고 되돌아온 6J6 푸시풀 앰프

앰프를 망가뜨리게 된 사연은 지난번에 글로 남겼었다('해서는 될 것과 안될 것을 구별할 줄 아는 지혜'). 앰프 제작자인 이영건 선생님에게 보내서 수리를 마친 6J6 푸시풀 앰프를 오늘 시외버스 편으로 돌려받았다. 이번에는 수리를 하면서 레벨미터가 없는 단순한 버전으로 바꾸어달라고 요청을 하였었다. 이 앰프는 다시 사무실로 옮겨저셔 책상-Fi용 주력 기기로 쓰이게 될 것이다. 앞으로는 괜한 호기심으로 잘 작동하는 물건을 뜯어보는 어리석음을 범하지 않기로 결심하였다.




이와는 별도로 직접 진공관 앰프를 만들려는 시도도 진행 중이다. 저렴한 전원 트랜스를 분해하여 코어를 전부 뺀 다음 E와 I를 한데 모아서 사이에 공극을 만들어야 싱글 엔디드 앰프의 출력 트랜스 대용으로 쓸 수 있다고 한다. 왜냐하면 오로지 A급 동작을 하는 싱글 엔디드 앰프 회로의 말단에서 출력되는 신호는 맥류이므로 코어가 자화될 수 있기 때문이다. 전원 트랜스는 교류가 흐르므로 코어가 자화되지 않는다.


커터칼 하나를 다 망가뜨려가면서 얻은 결과물은 다음과 같다. 손가락에도 약간의 상처를 입었다.


독서 기록 - [NL 현대사] 외 다섯 권

이번에는 비교적 가벼운 책 위주로 독서를 하였다. 물론 'NL 현대사(강철 서신에서 뉴라이트까지)'는 예외였다. 닉 보스트롬의 <슈퍼인텔리전스>는 잘 읽히지를 않아서 일단은 대출 기간을 연장한 상태이다.


출퇴근 15분 철학

  • 일상에서 소통에 필요한 가벼운 철학을 만나다
  • 오가와 히토시 지음, 박재현 옮김
한국의 일상 생활에서 철학은 이미 자취를 감춘지 오래이다. '한국 철학'은커녕 철학적 사고·논의 및 토론 자체가 없는 사회이므로. 모든 것들이 개인차원의 생존과 정치, 얄팍한 대중문화에 매몰되 있다고 생각한다. 

왜 우리는 불평등을 감수하는가

  • 가진 것마저 빼앗기는 나에게 던지는 질문
  • 지그문트 바우만 지음, 안규남 옮김

The Big Shift(빅 시프트)

  • 100세 시대 중년 이후 이생의 재구성
  • 마크 프리드먼 지음, 한주형·이형종 옮김
중년 아니면 노년이라는 전통적인 연령대 사이에 독특한 특징과 욕구가 있는 인생 단계가 존재한다. 자녀가 독립을 한 이후부터 건강이 나빠져서 타인에게 절대적으로 의존해야 하는 시기 사이는 의외로 넓으며 새로운 의미를 부여해야 하는 시기이다. 이를 third age, 인생 제3막, 인생 제3장, 두 번째 성인기, 제2성인기, 인생 제4막, 중간 코스, 중년기, 후기 중년기, '인생의 두 번째 장면' 등 수많은 용어들이 혼재하고 있다(114쪽). 이 시기를 가치있게 보내기 위해 어떤 생각을 갖고 준비를 해야 하는지를 서술한 책이다. '백미러를 보면서 앞길을 예측하는' 방식으로 이 시기를 준비해서는 안된다. 더이상 노년은 젊은 세대에게 짐이 되는 세대라고 생각해서는 안된다.

슬로 이즈 뷰티풀

  • 슬로 라이프를 제창한 쓰지 신이치 교수의 '느림' 미학
  • 쓰지 신이치 지음, 권희정 옮김

NL 현대사

  • 강철 서신에서 뉴라이트까지
  • 박찬수 지음(한겨레 신문 박찬수 글 모음 링크)
나는 80년대에 대학 생활을 하였지만 당시 억압된 한국의 정치적 상황 하에서 고뇌하고 투쟁했던 선배 및 동료 학생들에게 적극적으로 동조하지 못하였다는 점에 대하여 늘 마음의 빚을 지고 있다고 생각한다. 그 빚을 갚기 위해서는 현실 정치에 대해여 무관심하지 말아야 한다는 것 말고도 가까운 현대사에 대한 정확한 지식을 갖는 것이 중요하다. 당시 학생운동 정파 중 큰 비중을 차지하는 NL(National Liberation, 쉽게 말하여 요즘 '주사파'니 '종북' 정도로 불리는)의 발생과 발전, 몰락, 기성 정치체제로의 편입 및 뉴라이트로의 전환을 서술한 책이다. 이른바 '강철 서신'을 통해서 NL계열 운동을 촉발한 김영환이 비중있게 다루어졌다. 이번에 읽은 책 중에서 몰랐던 사실을 가장 많이 알게 해 준 책이다.

아미리 종활 사진관(소설)

  • 아시자와 요 지음, 이영미 옮김
종활(終活)이란 인생을 마무리짓기 위한 활동을 의미한다. 아미리 사진관은 영정 사진을 전문으로 촬영하는 곳으로서 종활을 도와준다는 것이 특징이다. 이 소설에서는 영정 사진은 난치병 등으로 죽음에 임박한 사람만이 장례식을 미리 준비하기 위해 찍는다는 통념을 벗어나게 해 준다. 영정 사진을 둘러싼 미스테리를 풀어나가는 몇 개의 에피소드로 구성되어 결국은 따뜻한 가족애를 느끼게 하는 소설이었다. 종종 접하는 일본 영화나 소설과 비슷한 정서를 품은 책이다.

2018년 4월 6일 금요일

MetaWRAP - whole metagenome shotgun sequencing 분석을 위한 파이프라인

Whole genome shotgun(WGS) sequencing의 두번째 단어인 genome을 metagenome으로 바꾸면 whole metagenom(ic) shotgun(WMS) sequencing이 된다. 요즘 유행하는 어법을 따른다면 좀 더 인기있는 단어인 microbiome을 쓰고 싶은 욕구가 생긴다. 내가 알기로는 원래 microbiome에는 '집합적인 게놈'이란 의미가 없었는데 약간 변질이 되고 말았다. 하지만 '활성 슬러지 메타게놈'이라는 표현은 있지만 '활성 슬러지 마이크로바이옴'이라고는 아직 쓰지 않는 것 같다.

Microbiome이라는 용어의 유래에 대해서는 microBEnet에 조나단 아이센이 2015년에 올린 글("What does the term microbiome mean? And where did it come from? A bit of a surprise ..", 링크)을 읽어보라.

나는 20년 가까이 (bacterial) isolate genome의 분석에만 집중해 왔다. 16S rRNA 기반의 메타게놈 연구가 주변에서 시작될 때 여기에까지 활동 영역을 미리 넓히지 못한 것이 늘 아쉽다. 자기 데이터가 없는 상황에서는 아무리 공부를 하려 해도  진도가 잘 나가지 않는다. 그러는 사이에 어제 소개했듯이 Qiime 2가 나오고 말았다.

2년쯤 전에 충북대학교 이성근 교수를 통해서 WGS sequencing analysis를 해보는 것이 어떻냐는 제안을 받고 관심을 갖고는 있었다. 당시 소개받은 논문은 Mads Albertsen(웹사이트 링크)가 제1저자였던 "Genome sequences of rare, uncultured bacteria obtained by differential coverage binning of multiple metagenomes(Nature Biotechnology 2013 PubMed)"였다. 이 연구에서의 핵심 개념은 마치 마이크로어레이 실험처럼 변동을 준 조건과 주지 않은 조건(여기에서는 hot phenol) 활성 슬러지를 구성하는 미생물 전체 유전체를 분리하여 조립을 한 뒤 4가지의 데이터(tetranucleotide frequency, %GC, length, essential single copy gene)를 이용하여 scaffold를 시각화하고, 이를 잘 골라내어 개별 유전체를 구성한다는 것이었다. 저작권 문제로 논문의 그림을 여기에 직접 싣지는 못하겠다. 일단 설명은 이렇게 간결하게 하였지만 supplementary material을 받아서 한번씩 따라하는 것도 쉽지 않다. 솔직히 고백하건대 assembly 이후 R을 집중적으로 사용하여 그림을 그리고 테두리를 쳐서 bin을 골라내는 후반부 작업까지는 아직 진도가 나가지 않았다.

현재 덴마트 Aalbog University에 재직하고 있는 Albertson의 웹사이트를 방문하니 community 분석을 위한 훌륭한 R 패키지를 개발하여 보급하고 있었다(링크).

WMS sequence analysis에는 아직 '이것이 진리이다!'라고 할만한 독점적인 도구가 없다. 게다가 결과의 시각화 역시 일반 연구자에게는 어려운 문제이다. Metagenome에서 건져낸 개별 유전체를 시각화하기 좋은 방법이 없을까? 작년 초부터 다루기 시작한 광합성 세균 Microcystis의 미생물 콘소시엄을 시퀀싱한 자료를 재건하는 것이 나의 직면한 과제이기 때문이다. 구글을 뒤지다가 bioXriv에 소개된 MetaWRAP(논문, GitHub)이 눈에 뜨였다. 논문의 제목은 "MetaWRP - a flexible pipeline for genome-resolved metagenomic data analysis"이다. GitHub에 그림이 있으니 소개하기에도 부담이 없다. 튜토리얼을 둘러본다면 전체적인 흐름이 어떻게 되는지를 파악할 수 있을 것이다.

출처: https://github.com/bxlab/metaWRAP
출처: https://github.com/bxlab/metaWRAP/blob/master/Usage_tutorial.md

MetaWRAP은 raw sequencing read에서 출발하여 metagenomic bin 구성 및 그 분석까지를 수행할 수 있는 파이프라인이다. 널리 쓰이는 소프트웨어와 라이브러리 약 150 종을 묶어서 Biocond 패키지로 배포하므로 설치가 매우 쉽다. 가장 핵심이라 할 수 있는 binning에서는 metaBAT2, MaxBin2 및 CONCOCT를 사용한다. 마침 Bioconda에 관심을 갖기 시작하였는데 이를 이용한 유용한 도구가 줄줄이 나타났으니(어제 소개한 Qiime 2 역시 Bioconda 패키지로 배포) 반갑지 않을 수 없다. 프로그램 설치를 마치고 지금은 데이터베이스를 받는 중이다. Configuration이 끝나면 실제 데이터를 가지고 즐거운 탐색을 해 봐야 되겠다.

2018년 4월 5일 목요일

paste 명령어의 색다른 사용법

실습용 자료를 읽어보다가 fastq 파일을 fasta로 전환하는 매우 독특한 명령어를 발견하였다. 바로 paste를 쓰는 것이다. paste는 텍스트 파일을 컬럼 단위로 붙이는 명령어라고 생각하고 있었는데 실제 매뉴얼을 확인하면 "paste - merge lines of file"라는 설명이 나온다.

paste - - - - < file.fq | cut -f 1,2 | sed 's/^@/>/' | tr "\t" "\n" > file.fa

바로 이것이 file.fa를 file.fa로 바꾸는 명령어이다. paste - - - - < file.fq에서는 file.fq가 줄 단위로 분해되어 다음과 같이 표준 출력으로 내보낸다.

line1 line2 line3 line4
line5 line6 line7 line8
...

'- - - -'는 네 줄 단위씩을 끊어서 하나의 라인에 병합하여 나타냄을 의미한다. 기본 delimiter는 탭인데 바꿀 수 있다. 3, 6, 9...번째 줄만을 출력하고 싶다면 awk 'NR%3==0' file이라고 하면 되지만, 세번째 줄까지를 연이어 하나의 라인으로 출력하고 또 그 다음 세번째 줄을 연이어 출력하는 일을 반복하려면 paste - - - < file이라 해야 하는 것이다.

이렇게 전환된 상태에서 첫번째 및 두번째 컬럼은 서열의 ID와 서열에 해당한다. 이를 fasta로 전환하기 위하여 >를 삽입하고 @는 제거하면서 동시에 줄바꿈을 하는 것이 나머지 과정이다. 그러나 fastq2fasta.pl 스크립트보다는 꽤 느리다. C로 짜여진 seqtk seq 프로그램보다는 더욱 느릴 것이다.

다음 링크를 읽어보면 paste의 고급 사용법이 친절하게 설명되어 있다.

Linux paste command good examples & uses

awk와 sed가 텍스트 파일을 조작하는 매우 단순하고도 멋진 방법을 제공하는데, 여기에 paste, cut, uniq 및 comm 등도 한 몫을 함을 잊지 말도록 하자.

QIIME 2?

공개형 community sequencing data의 분석 도구인 Qiime(논문 링크)을 좀 공부해보려고 tutorial project GitHub에서 파일을 받은뒤 테스트 스크립트를 돌렸다. 파이어폭스로 결과 파일을 점검하는데 2018년 1월 1일부터 Qiime 2가 출시되어 이전 버전은 더 이상 서포트가 되지 않는다는 것이다.
생각해보니 Nature Methods에 논문이 나온 것이 2010년이니 대대적인 업그레이드가 이루어질 때도 되었다. 지난 며칠 동안 BioConda를 공부하면서 설치한 Qiime은 1.9.1이다. 프로그램 실행 방식과 인터페이스가 아주 크게 바뀌었다. 예전에는 그다지 파이썬 스크립트를 개별적으로 실행하는 방식이었는데, 이제는 Qiime 2 command-line interface(q2cli)에서 체계적으로 명령어를 입력하도록 바뀌었다. 즉 요즘 흔히 쓰이는 포맷인 qiime info, qiime alignment ... 을 따르게 된 것이다.


아직 BioConda 채널에는 정식으로 등록이 되질 않아서 설치방법은 약간 다르다.

wget https://data.qiime2.org/distro/core/qiime2-2018.2-py35-linux-conda.yml
conda env create -n qiime2-2018.2 --file qiime2-2018.2-py35-linux-conda.yml
# OPTIONAL CLEANUP
rm qiime2-2018.2-py35-linux-conda.yml

마침 유럽에서 열렀던 metagenome analysis workshop에서 배포한 qiime 파이프라인을 따라하면서 공부하려는 참이었는데 qiime 2가 나오고 말았으니 이를 어떻게 해야 할까? Qiime 1을 이제는 전혀 몰라도 되는 것일까? Qiime 1에서도 쓰였던 "Moving Pictures" 데이터셋(Moving pictures of the human microbiome. Genome Biol. 2011 PubMed)을 이용하는 Qiime 2 튜토리얼에는 qiime 1과 비교하여 친절하게 설명을 해 놓았으니 이를 따라서 실습하면 두 버전 간의 차이를 쉽게 이해할 수 있을 것이다. 새로운 버전에서는 fecal microbiota transplantation(FMT) study와 Atacama soil microbiome 등 새로운 실습를 이용한 설명도 제공한다.

Qiime 2에서는 sequence quality control을 위하여 DADA2와 Deblur 등을 플러그인 형태로 적용하여 사용할 수 있는 것도 특징이다.

튜토리얼을 대략 훑어본 후 qiime 2를 사용하는 것이 훨씬 낫겠다는 결론을 내렸다. 시대가 바뀌었다면 이를 따라야 하지 않겠는가.

2018년 4월 4일 수요일

Bioconda의 혼란을 극복해 나가기

Bioconda를 이용하여 여러 프로그램을 깔면서 느꼈던 혼란은 어쩌면 나의 무지에서 비롯된 것인지도 모른다. 지웠다 깔았다를 반복하면서 새 리눅스 서버의 패키지 관리 체계를 나름대로 다음과 같이 확정하기로 마음을 먹었다.

R과 R Studio는 yum을 이용하여 설치한다. 참조한 사이트는 "How to Install R / R Studio on CentOS 7"였다. 다음으로는 관리자 권한으로 Anaconda2-5.1.0을 설치하였다. 처음에는 Anaconda3-5.1.0을 몇차례 설치하였었지만 파이썬 2.7을 기본으로 하는 것이 가장 바람직하다는 결론을 내린 것이다. 설치 루트는 로컬 하드디스크(보통 /opt/anaconda#)가 아니라 일부러 NFS로 마운트한 공용 공간을 택하였다. 나중에 이를 공유하고 있는 다른 컴퓨터에서도 쉽게 접근이 가능하게 만들기 위함이다.

Anaconda가 제공하는 파이썬 및 bioconda로 설치한 응용프로그램을 이용하려면 다음 명령어 한 줄이면 족하다. /data를 공유하는 다른 컴퓨터에서 로그인을 해도 마찬가지이다. 단, 아나콘다 루트는 관리자가 쓸 수 있는 공간(/data/anaconda2)에 위치하므로 패키지 및 환경 관리를 위해서는 관리자 권한으로 실시해야 한다.

$ PATH=/data/anaconda2/bin:$PATH

다음으로는 파이썬 3.5를 기반으로 하는 새로운 환경인 py35를 생성하였다.

# conda create -n py35 python=3.5

파이썬 3.5 이상이 필요한 프로그램들은 여기에서 설치하면 된다.

# source activate py35
(py35) # conda install roary
(py35) # source deactivate
#

원래 시스템에서 제공하는 Perl이 있었고 BioPerl도 내가 깔아 두었었지만 bioconda에서 환경 및 패키지를 설치하면서 각자 새로 깔아버리는 것은 어쩔 도리가 없다. 다음은 세균의 rRNA 예측기인 Barrnap(GitHub link)에서 설명하는 프로그램 설치법이다. 이제는 conda와 Homebrew·Linuxbrew라는 패키지 관리 시스템을 이용하는 것이 대세로 자리잡은 것 같다. 물론 Galaxy를 빼먹어서는 안될 것이다.


더군다나 Bioconda에서 배포하는 패키지는 docker 환경에서 적재할 수 있는(용어를 정확하게 선택했는지 자신이 없다) 콘테이너를 제공한다. 여기에는 BioContainer라는 재미난 이름이 붙었다. 이제 일반 사용자가 생명정보분석용 응용프로그램을 설치하는데 어려움을 겪는 일은 점점 줄어들 것으로 보인다.

Bioconda를 이용하여 패키지를 설치할 때 가장 주의할 점은 파이썬 인터프리터에 대한 의존성이 있는지를 잘 확인하여 필요하다면 py35 환경 안에서 설치하는 것이다. 그리고 설치 과정에서 이미 설치된 패키지를 업/다운그레이드하면서 건드리는 경우가 있는데, 이때에 이전에 설치한 패키지의 실행에 영향을 미치지 않는지도 눈여겨보아야 할 것이다.

2018년 4월 3일 화요일

(비닐) 쓰레기 대란의 지속 가능한 해결책은 없을까

우리나라에서는 합성수지 필름으로 만들어진 포장재를 통틀어서 '비닐'이라고 부른다. 영미권에서는 그 의미가 좀 다르다. 화학적으로 vinyl기를 가진 화학물질을 부를 때 쓰는 것이 ;비닐'의 가장 정확한 용법일 것이다. 예를 들자면 polyvinyl chloride(PVC)이다. 또 다른 뜻으로는 합성수지로 만들어진 레코드판을 뜻한다.

중국이 비닐 쓰레기 수입을 대폭 줄이면서 수도권에서는 난리가 났었다. 우리가 배출하는 재활용 쓰레기가 국내에서 처리되지 않고 중국에 팔렸다는 것은 전혀 모르던 사실이었다. 중국도 환경 문제에 관심을 갖기 시작하면서 '쓰레기'의 수입을 중단하게 된 것이다.

[BBC] '비닐 대란'에 대해 당신이 알아야 할 3가지

우리나라만 쓰레기 처리를 중국에 의존한 것이 아니었다. 이 뉴스에 의하면 영국은 2012년부터 폐플라스틱의 2/3를 중국과 홍콩에, 아일랜드의 경우 폐플라스틱의 95%를 중국에 수출해 왔다고 한다. 중국에서는 이를 수입하여 재처리를 거쳐 뭔가 내다 팔 수 있는 물건을 만들어 왔을 것이다. 그러나 이렇게 하여 얻는 경제적 이득보다 자국 환경 악화에 의한 손실이 이제는 더 크다고 판단한 것임에 틀림없다.

이번 비닐 쓰레기 대란 뉴스를 접하면서 고전 경제학의 비교우위론이 떠올랐다. 각 나라에서 경쟁력이 있는 물건을 만드는데 집중을 하고, 그 물건을 서로 사고 팔면서 모두가 이익을 얻을 수 있다는 이론이다. 위키백과를 찾아보니 절대적인 우위에 있지 않더라도 수출을 통해 상호 이익을 얻을 수 있다고 설명하였다.

그러면 과거에 식민지로서 커피나 사탕수수를 재배하여 선진국에 수출하던 나라 - 지배 국가에 의한 강제적인 산업 재편이었을 것이 당연하다 - 는 계속 커피와 사탕수수 농사에 몰두해야 하는가? 이로 인하여 자립 가능한 경제 구조를 이루는 것이 애초에 불가능해졌고 토지의 활용도 역시 바람직하지 않은 쪽으로 기울어졌다. 그러면 이를 쓰레기의 수출입에 대입하여 생각해보면 어떨까? 현재까지 통용되는 방법으로 국내의 쓰레기 처리업자(수출업자)와 중국의 쓰레기 수입업자는 어느 정도의 이익을 보았을 것이다. 그러나 이번 쓰레기 문제는 중국의 업자가 더욱 양질의 쓰레기를 다른 나라에서 싼 가격에 살 수 있게 되어서 한국의 것을 사지 않겠다고 한 것이 아니다. 중국 정부가 환경 문제에 관심을 가지면서 막은 것이다. 여기에 대하여 왜 서로가 이익을 볼 수 있는 자유로운 무역을 막느냐고 항의할 수 있을까? 쓰레기를 수출입하는 경제구조는 외부효과가 너무 크다고 보는 것이 타당할 것이다.

그러면 이런 상상을 해 보자. 쓰레기를 해외에 파는 것이 아니라 돈과 함께 넘기는 것이다. 만약 우리나라가 아주 돈이 많다면(그리고 약간 부도덕하다면) 가난한 나라에 대해서 이런 제안을 할 수도 있을 것이다. 그러나 이러한 제안을 받아들이는 나라는 당장의 돈 몇푼 때문에 자기 나라의 소중한 국토를 회생 불가능한 상태로 만들게 될지도 모른다.

탄소 배출량처럼 쓰레기 배출량을 각 사람마다 제한하는 시나리오도 생각해 보았다. 영화 <인 타임>이 연상되는 상황이다. 쓰레기를 배출할 수 있는 권한을 정부로부터 구입을 한다. 돈이 많은 사람은 많은 쓰레게를 버려도 되지만, 가난한 사람은 그것도 불가능하다. 결국은 몰래 버리거나, 자기 집에 쓰레기를 계속 쌓아두는 일이 생길 것이다. 연 1톤의 쓰레기를 배출하는 권리를 10만원에 공식적으로 구입할 수 있다고 하자. 이것이 암시장에서 할인되어 8만원에 팔릴 수도 있다. 이걸 구입한 사람은 10만원이 아니라 8만원에 연 1톤의 쓰레기를 버릴 자격을 얻는다. 아니면 이런 상황도 가능하다. 가난한 사람에게 '돈 10만원을 줄테니 내 쓰레기 20톤을 떠안지 않겠소?' 가난한 사람은 돈이 생겨서 좋고, 돈 많은 사람은 적은 비용에 더 많은 쓰레기를 처분할 수 있어서 좋다. 하지만 가난한 사람의 집은 쓰레기로 엉망이 될 것이 자명하다.

그 어떤 시나리오도 아름답지 못하다. 쓰레기는 쓰레기일 뿐이고, 경제적 이익이 조금 발생한다고 해서 국경을 넘어가는 것은 옳지 못하다. 그리고 일회용으로 만들어진 포장재를 재활용하기 위해 세척하는 것도 많은 에너지를 소비하는 일이다. 가장 바람직한 해결책은 쓰레기 발생량 자체를 줄여야 한다는 것이다. 식품 포장 비닐, 냉동식품 보관용 스티로폼, 테이크아웃 커피잔, 택배 포장 박스.... 이제는 지속 가능한 방법을 생각해 봐야 한다.

생각보다 까다로운 bioconda

Anaconda(Anaconda3-5.1.0-Linux-x86_64)를 사용하여 python만 관리를 하려다가 bioconda를 이용하여 여러 생명정보분석 프로그램을 까는 것이 대단히 편리할 것이라는 판단이 들어서 며칠간에 거쳐서 테스트를 하였다. 특히 의존성이 많은 프로그램은 동반된 라이브러리와 다른 프로그램까지 알아서 설치해 주니 여간 편한 것이 아니었다.

그런데 환경(-n myenv로 설정되는 conda environment)을 고정한 상태에서 몇 가지 프로그램을 깔아보니 공통적으로 쓰이는 프로그램들을 의존성에 따라서 업그레이했다가 또 다운그레이드했다가를 반복하는 것이 아닌가. 그리고 이미 시스템에 설치된 프로그램까지 다시 내려받아 깔고 있다. 구체적인 예를 들어보자. Conda로 Roary를 설치하였더니 Perl 5.22.0.1을 덩달아 내려받는다. 하지만 이미 시스템에는 Perl 5.16.3이 존재한다. 아마도 Roary 패키지에서 정의된 필수 프로그램은 시스템이 이미 존재하는지의 여부와 관계없이 그대로 깔게 만든 것 같다. Linuxbrew는 어떻게 행동하는지 알아보지는 않았다.

그러는 과정에서 R이 뒤죽박죽이 되면서 실행 시 에러가 발생하고 말았다. 일단 R은 yum을 통해서 설치하는 것으로 바꾸어 놓았다.

그러면 패키지 하나에 대해서 환경을 각각 설정하면 될 것이 아니냐고 생각할 수도 있다. 실제로 해보니 perl/python interpreter 등 기본적이 도구들이 매 환경마다 다른 위치에 반복하여 깔리는 것이 아닌가. 저장공간 입장에서는 매우 비효율적이다.

다시 Linuxbrew를 적극 활용할까 하는 생각이 슬슬 들고 있다.

설치 과정을 철저히 기록함과 동시에 일관성 있는 운용 정책을 수립할 때라고 믿는다. Roary 같이 의존성이 큰 bioconda 패키지를 하나 깔아놓고, 다른 것을을 설치하면서 서로 충돌하는 것은 없는지를 살펴봐야 되겠다.

2018년 4월 1일 일요일

세번째의 진공관 앰프(6N1 + 6P2 SE amplifier)를 준비하면서

헤드폰/프리앰프를 제외하면 2014년 이래 두 대의 진공관 앰프를 사용하고 있다. 이 중에 가장 최근에 마련한 것은 블로그에서도 여러 차례 소개했던 6J6 푸쉬풀 앰프이다. 호기심에 뚜껑을 열고 이것저것 건드렸다가 소리가 나지 않게 되어서 지금은 제작자에게 가 있는 상태이다.

집에서든 사무실에서든 음악을 들을 환경이 이미 충분히 갖추어졌음에도 불구하고 내 손으로 직접 만든 것을 하나쯤은 갖고 싶다는 욕구는 잦아들지를 않는다. 반도체 앰프에 대해서는 이미 몇 번의 체험을 하였다. 인터넷에서 이미 만들어진 앰프 보드를 구입하여 적절한 케이스를 마련한 뒤 전원부와 입출력 단자를 연결하는 정도의 일은 몇 차례 해 보았고 이렇게 만들어진 완성품 중 두 개는 이미 주력 기기로 쓰이고 있다.

이에 비하여 진공관 앰프는 직접 만드는 재미를 좀 더 느낄 수 있다. 반도체 앰프에 비하면 회로가 훨씬 단순하므로(고전압을 취급하느로 주의를 해야 한다) 손으로 직접 부품의 다리에 배선을 하면서 앰프를 만드는 것이 가능하다. 이를 'hardwirng'이라 한다. 하드와이어링으로 잘 만든 앰프를 보면 멋진 수공예품을 연상시킨다. 물론 요즘은 인쇄회로기판(PCB)에 꾸미는 일도 많다.

출처: http://www.hificlub.co.kr/

언젠가는 나도 이런 앰프를 만들 수 있는 날이 올지도 모른다. 그러나 현실적인 목표는 키트류에서 시작하는 것이다. 섀시를 포함한 모든 부품이 갖추어진 보드와 부품만 제공되는 키트, 심지어는 보드만 제공하여 부품을 직접 조달해야 하는 것까지 그 스펙트럼은 매우 다양하다.

제품을 구입하려 하지 말고 경험을 산다고 생각하라.
비용 절감에만 너무 몰두하지 말아라.

요즘은 이런 자세를 갖고 살기위해 노력한다. 일단 한번 저지르고 보자는 용기를 북돋아준 곳은 제이앨범(Jalbum) 사이트이다. 회원의 추천에 따라서 다음의 앰프 보드를 주문하였다. 가격은 $14.29. 초단 증폭에는 쌍삼극관인 6N1을, 전력 증폭에는 beam tetrode 관인 6P1을 사용하였다. 진공관 형번 뒤에 'P'가 더 붙으면 구 소련제 관이고 그렇지 않은 것은 중국에서 만든 카피품이다.



출처: 알리익스프레스

출력트랜스와 전원트랜스는 따로 마련해야 한다. 그 가격은 $14.29보다 훨씬 높다! 어떤 부품을 고를 것인지, 어떤 방식으로 연결할 것인지를 고민하면서 공부를 하게 만드는 것이다. 웹에서 계속 자료를 찾아 읽으면서 트랜스포머는 정말 마술상자와 같은 수동 소자라는 생각이 들었다. 무겁고, 손실도 많고, 주파수 특성도 좋지 못한 소자이지만 진공관 앰프의 출력 말단에서는 아직까지 없어서는 안될 중요 부품이다. 예전처럼 큰 회사의 연구부서에서 총력을 모아 고급 오디오용 출력 트랜스를 개발하던 시대는 더 이상 아닌 것 같다. 그래서 국내에서는 소규모 제작소에서 적은 물량을 제작하는 것이 현실이라 예전과 같은 품질이 아니라는 의견도 있었다. 하지만 재미있는 것은 호기심과 열정을 가진 DIYer가 직접 감아서 만들 수도 있는 것이 바로 트랜스이다. 진공관이나 트랜지스터, 하다못해 저항·캐패시터는 개인이 직접 만들 수가 없지 않은가? 제이앨범에서도 이와 관한 새로운 실험을 하여 R 코아를 개발하여 사용하고 있다. 여기에는 강기동 박사님(인터넷에서는 KDK라는 애칭으로 널리 알려진)의 기여가 크다(링크).

각 임피던스와 출력 별로 제작된 기성품 출력 트랜스를 구입할 수는 있지만 그 비용이 부담스럽다면 일반 전원용 트랜스를 사용하는 것이 가능하다고 한다(Jalbum 링크). 1차에 220V가 들어가는 트랜스는 2차 전압에 따라 다음과 같은 임피던스 비율이 나온다.

30K 3.59V
15K 5.08V
10K 6.22V
8K 6.96V
7K 7.44V
6K 8.03V
5K 8.8V <==
3.2K 11V
3K 11.36V
2.5K 12.455V

출력트랜스 대용으로 쓰기 위해 구입한 일반 전원 트랜스.

즉 220 V:9 V 전원트랜스를 사용하면 대략 5 kΩ: 8 Ω 싱글 출력 트랜스 대신 사용할 수 있다는 뜻이다. 하지만 완벽한 대체품은 아니다. 감은 횟수와 방식, 그리고 코어의 배치 방식이 진공관 싱글 앰프에 적합한 것은 아니기 때문이다. 상세한 이론은 Lenard Audio Institute의 Output transformer 항목을 참조하자.

다음으로는 전원 트랜스를 선택하는 문제가 남았다. 이를 위해서는 전원 회로에 대한 최소한도의 지식이 필요하다. 몇 개의 공부할 사이트를 소개한다. 앰프 자체의 이론도 알아야 하는데 전원회로부터 거꾸로 거슬러 올라가고 있다!



이외에도 주옥 같은 정보를 수록한 사이트가 많이 있으나 지면 관계 상 몇 개만 소개하였다.

출처: Lenard Audio Institute
위 그림에서 보인 것은 (1) 전파 정류 방식(full wave), (2) 브릿지 정류 방식, 그리고 (3) 배전압 정류 방식(voltage doubler)이다. 다른 방식도 있으나 널리 쓰이지는 않는다. 내가 주문해 놓은 앰프 보드는 트랜스의 규격에 따라서 (1)과 (2) 중에서 고를 수 있고 기본 구성은 (1)번이다. 나는 2개의 정류 다이오드(1N4007)을 추가하여 (2)번 방식을 쓸 생각이다. 다른 이유는 없다. 이런 용도에 맞는 트랜스(우리나라에서는 보통 '단파 트랜스'라고 한다)가 조금 더 가격이 싸기 때문이다.

솔직히 말해서 중간탭이 있는 전원트랜스의 전류 계산 방법(오디오파트)은 아직도 이해하기 힘들다... 다음주에는 전원트랜스의 사양을 확정하여 주문해야 되겠다.

2018년 4월 20일에 추가한 글



드디어 전원 트랜스가 도착하였다. 주문한 곳은 오디오파트이고 실제 제작은 광진전기이다. 40 W급의 무차폐 트랜스이다. 1차는 220V, 2차는 6.3V/1.6A, 230V/120mA이다. 주문은 4월 2일에 하였는데 받은 날짜는 4월 20일이다. 나중에 밝혀지겠지만 트랜스 울림 문제로 두고두고 애를 먹었다.