2018년 4월 1일 일요일

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

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

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

이에 비하여 진공관 앰프는 직접 만드는 재미를 좀 더 느낄 수 있다. 반도체 앰프에 비하면 회로가 훨씬 단순하므로(고전압을 취급하느로 주의를 해야 한다) 손으로 직접 부품의 다리에 배선을 하면서 앰프를 만드는 것이 가능하다. 이를 흔히 'hardwirng'이라 하는데, 보다 정확하게는 point-to-point wiring이라고 하는 것이 맞다. 하드와이어링으로 잘 만든 앰프를 보면 멋진 수공예품을 연상시킨다. 물론 요즘은 인쇄회로기판(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일이다. 나중에 밝혀지겠지만 트랜스 울림 문제로 두고두고 애를 먹었다.

2018년 3월 29일 목요일

블로그에 애드센스 광고 게재 시작

지난 주말에 전주에 다녀온 것이 약간 무리였었던 것 같다. 감기몸살 증세가 나타나기 시작하여 서 나는 그저께 오후부터 맥을 못추고 있고, 아내도 슬슬 몸이 안좋다고 한다.

전주에 가면 외지에서 온 관광객들이 붐비는 한옥마을만 거니는 것이 아니라 종종 젊음이 넘쳐나는 객사길로 향한다. 대전으로 치자면 으능정이 문화의 거리에 해당한다고 보면 된다. 객사('풍패지관')와 영화의 거리 사이의 골목은 한옥마을과 다른 느낌이 있다.

한옥마을에서 팔달로를 따라 북쪽으로 걸어가는 길에 전라북도예술회관(전주시 완산구 팔달로 161)이 자리잡고 있다. 가끔 이곳을 들러 전시뢰를 구경하고는 한다. 지난 주말에는 수채화가 정유진님의 일곱번째 개인전 '여운을 남기다(링크)'가 진행 중이었다. 수채화이지만 유화 못지않은 강렬함을 주는 그림들이었다. 관람을 마치고 나서려는데 작가께서 차를 따라 내면서 전주 시장님이 오신 줄 알았다고 한다.

구글을 찾아보니 김승수 전주시장은 나와 비슷한 느낌의 외모인 것을 인정하지 않을 수 없다. 나이도 비슷하고... 유쾌한 오해를 받았다 생각하고 자리를 떴다. 기사를 찾아보니 이제 마무리되는 임기 동안 토건업자나 대기업들이 싫어할 일만 골라서 했다고 한다(링크). 6월 지방 선거를 앞두고 재선이 유력하다고도 한다. 고층건물·쇼핑센터·자동차 도로 중심의 개발에 익숙한 사람들에게는 신선한 도전이 아닐 수 없다.

글 제목은 '애드센스 광고 게재 시작'인데 엉뚱하게도 일상 이야기만 하고 말았다. 블로그를 접속하면 오른쪽 사이드바의 글목록(블로그 보관함) 아래에 광고가 보이기 시작한다. 신청은 꽤 오래전에 해 두었는데 셋업하는 방법을 잘 몰라서 방치한 상태였다. 이것이 나에게 대단한 수익을 주거나, 그렇다고 해서 내 블로그를 방문하는 사람들에게 큰 불편함을 줄 것으로는 생각하지 않는다.

2018년 3월 27일 화요일

Barrnap 결과물(GFF3)에서 16S rRNA 서열만 뽑아내기

Barrnap(BAsic Rapid Ribosomal RNA Predictor, 링크)를 사용하여 박테리아의 유전체 서열로부터 ribosomal RNA를 예측하였다. 결과물은 GFF3 파일이다. 여기에서 16S rRNA sequence를 뽑아내려면 어떻게 하면 좋을까? 막상 Perl을 이용하여 GFF와 FASTA file을 파싱하려니 여간 성가신 일이 아니다. 혹시 인터넷을 뒤지면 방법이 나오지 않을까?

역시... 친절한 shell script가 하나 나타났다. bedtools와 samtools를 기반으로 돌아가는 스크립트인 16S_extraction_Barrnap.sh라는 것이 존재하는 것이다.

https://github.com/raymondkiu/16S_extraction_Barrnap

핵심은 다음과 같이 달랑 네 줄이 전부이다. 중요한 명령어는 굵은 글씨로 강조하였다.
grep '16S' $gfffile > 16S-gff.gff;
bedtools getfasta -fi $fastafile -bed 16S-gff.gff -fo 16S-fasta.fna;
grep -m 1 ">" 16S-fasta.fna|sed 's/>//g' > 16S-id.txt;
xargs samtools faidx 16S-fasta.fna < 16S-id.txt > $fastafile-16S.fna
첫단계에서는 Barrnap 결과물인 GFF 파일에서 16S ribosomal RNA feature만 추출한다. 유전체에는 여러개의 16S rRNA가 존재하므로 두번째 줄에서 bedtools getfasta를 이용하여 서열을 추출하면 multiple fasta file(16S-fasta.fna)이 생긴다. 세번째 줄에서는 가장 먼저 출현하는 16S rRNA의 ID 줄(예: >CP013254.1:1163436-1164962)을 뽑아내어 '>'를 제거한 뒤 16S-id.txt에 저장한다. 마지막 명령어(samtools faidx)에서는 16S-id.txt에 저장된 서열 ID에 해당하는 것을 16S-fasta.fna에서 뽑아내는 것이다.

16S-id.txt 파일에는 서열 ID가 하나만 들어있으므로 사실은 마지막 행에서 xargs를 쓸 필요는 없었다.

bedtools와 samtools를 이런 용도로 사용해 본 적은 없었다. 기껏해야 feature와 관련된 수치를 뽑거나, read mapping을 하는 파이프라인 실습 자료가 지시하는 대로 기계적으로 활용했을 뿐이었다. 특히 samtools faidx는 FASTA sequence file의 인덱스 생성에만 쓰는 것으로 생각하였었다. 매뉴얼을 찾아보니 samtools faidx는 'index/extract FASTA'라고 설명이 되어있다.

Multiple fasta file로부터 특정 ID의 서열을 추출하는 용도로는 BioPerl을 사용하여 적당히 코딩한 것을 사용해 왔었는데, 이렇게 samtools를 쓸 수도 있다는 것을 오늘 처음 알았다. 단, 뽑아낼 서열이 별도의 텍스트 파일에 존재하는데 그 수가 여럿이라면(id1, id2, id3...idN) 다음과 같이 쓰거나,
samtools faidx 16S-fasta.fna id1 id2 id3 ... idN
혹은 위에서 보인 것처럼  xargs를 써야 한다. 내가 만든 스크립트는 서열 ID를 수록한 파일이 여러 라인으로 되어 있을 것을 감안한 것이었다.

2018년 3월 26일 월요일

Conda, Anaconda, Bioconda 기초

서버의 운영체제를 CenOS 6.9에서 7.4로 업그레이드하면서 여러 응용프로램을 효율적으로 관리할 방안을 고민하게 되었고, 이에 따라서 자연스럽게 conda를 공부하게 되었다. 앞으로는 Linuxbrew에서 조금씩 멀어지게 될 것만 같다. 전혀 관리자 역할을 할 수 없는 서버를 접속하여 사용한다면 Linuxbrew도 좋은 대안이다.

Conda: Package, dependency and environment management for any language—Python, R, Ruby, Lua, Scala, Java, JavaScript, C/ C++, FORTRAN

Anaconda: open source distribution of the Python and R programming languages

Bioconda: a channel for the conda package manager specializing in bioinformatics software

Conda는 나머지 두 개의 기반이 되는 관리 시스템이기도 하다. 일단 관리자 권한으로 /opt/anaconda3에 설치를 하였다. 일반 사용자 모드에서 설치 스크립트(Anaconda3-5.1.0-Linux-x86_64.sh)를 실행한다면 ~/anaconda3가 기본 설치 위치가 된다.

Conda에서 환경(environment; Managing environments)의 개념을 잡는 것이 조금 어렵다. Python의 virtualenv와 유사한 것이라고 생각하면 된다. 즉 사용자가 지정한 python version과 패키지가 적용되는 환경을 생성하여 activate 명령으로 이에 진입하여 사용하면 되는 것이다. 현재 설치된 환경은 무엇이 있는가?
$ conda info --envs
# conda environments:
#
root                  *  /opt/anaconda3
'root' 하나만 존재한다. 설치 매뉴얼에 있는 그대로 따라서 Bioconda 설치까지 마쳤더니 python package는 176개, /opt/anaconda3/bin에는 무려 873개의 바이너리가 깔렸다. 설치된 모든 패키지의 목록을 보고 싶으면 conda list --explicit라고 하면 된다. Bioconda를 통해서 깔린 패키지도 전부 보임은 당연하다.

아직까지는 나만의 conda environment를 따로 생성할 필요를 느끼지 못한다. root의 것을 그대로 쓰면 된다. Python 2.7.5가 필요하다면 /opt/anaconda3/bin이 $PATH에 속하지 않게만 만들면 되는 것이다. 만약 conda 환경 안에서 python 2.7을 사용하려면 다음과 같이 실행하여 py27이라는 이름의 새로운 환경을 하나 만든 뒤 activate를 하면 된다(Managing python)
$ conda create -n py27 python=2.7 anaconda
설치된 환경을 점검해 보자. 친절하게도 홈 디렉토리 아래에 python 2.7과 관련한 것들을 설치할 공간을 마련하였다. 개별 패키지를 설치하려면 나의 설정 상태에서는 관리자 권한일 필요하지만, 'environment'를 새로 만들 때에는 홈 디렉토리를 이용하므로 일반 사용자 권한으로도 가능하다.
$ conda info --envs
# conda environments:
#
py27                     /home/hyjeong/.conda/envs/py27
root                  *  /opt/anaconda3
채널이란 무엇인가? Conda가 패키지를 찾기 위해 살펴보는 path라고 한다. 이 글의 시작 부분에서 소개했듯이 Bioconda는 일종의 채널이다. Bioconda를 통해서 생명정보용 응용프로그램을 설치할 때를 제외하면 채널을 매만질 일이 없으니 당장은 더 알아볼 필요는 없다. 

이렇게 능률적으로 프로그램 관리를 할 새로운 방안을 익히게 되어 다행스럽게 생각한다.

2018년 3월 25일 일요일

TDA7265 앰플리파이어 속판 작업

트랜스는 자리를 잘 잡았는데 앰프 기판은 똑바로 놓이질 못하였다. 왜 구멍도 제대로 뚫지 못하는가! 

오늘 작업한 것은 사진으로는 그다지 눈에 뜨이지 않는다. 케이스 속판(알루미늄)을 구입하여 전원트랜스포머와 기판을 그 위에 고정하였다. 이전에는 플라스틱 케이스에 구멍을 뚫고 직접 고정하였더니 무거운 부품 때문에 케이스 바닥이 아래로 처지는 느낌이 있었다.

케이스와 속판은 전부 케이스포유 제품이다. 이 케이스(ACE2520L)은 품절되었지만 전후면 속판은 현재 생산되는 것과 호환이 된다.

이번에는 좀 제대로 가공을 해 보고자 노력했으나 역시 많은 아쉬움이 남는다. 바닥판에 가공한 이전 구멍의 위치를 기준으로 뚫었더니 아뿔싸, 패널에 대해서 평행을 유지하지 못하는 것이 아닌가. 게다가 볼트를 너무 조여서 구멍 하나가 뭉개지고 말았다.

스트레스를 받으면서까지 취미활동을 할 필요는 없다. 여유를 갖자. 여유!

독서 기록 - [이 세계의 식탁을 차리는 이는 누구인가] 외 2권


총 네 권의 사진을 찍었지만 '부자의 시간(최윤식 지음)'은 끝까지 읽는데 실패하였다. 다음에 꼭 다시 도전할 생각이다. 저자가 밝히기로는 이 책을 쓴 목적은 부의 흐름을 통찰할 수 있는 지식과 방법을 소개하는 것이라고 했다. 그러려면 경제 인텔리전스를 갖는 것이 중요하다. 기대수명이 길어진 현실에서 육체적으로 노동을 하여 돈을 벌 수 있는 상대적인 시간은 더욱 짧아졌다. 인생의 나머지 기간은 어떻게 하여 살아나갈 것인가? 이를 위해서는 '돈을 갖고서 돈을 버는' 것이 필요하다. 책의 앞부분에서 서양 자본주의의 형성 과정 - 그것이 항상 좋은 의도에서 비롯된 것은 아니지만 - 을 설명한 것은 매우 유익하였다.

얼마전 <성장 없는 번영>이라는 책을 읽었었다(링크). 경제적 세계화의 문제점, 그리고 기본 소득의 개념(뤼트허르 브레흐만의 저작) 등을 조금 접하게 된 나는 팽창을 기본 전제로 하는 금융상품 투자에 대해서 어떤 가치관을 가져야 하는지 아직 고민을 하는 중이다.

나머지 책은 제목과 저자를 소개하는 것으로 이번 독서기록을 마치려 한다. 앉아서 쓰기 시작하면... 힘도 들거니와 자꾸 길어질 것만 같다. 그냥 게으름 탓이라고 해 두자.

이 세계의 식탁을 차리는 이는 누구인가

  • 부제: 인간과 자연을 살리는 푸드 민주주의의 비전
  • 반다나 시바 지음, 우석영 옮김

늙어감의 기술

  • 부제: 과학이 알려주는 나이 드는 것의 비밀
  • 마크 E. 윌리엄스 지음|김성훈 옮김

권력은 왜 역사를 지배하려 하는가

  • 부제: 정치의 도구가 된 세계사, 그 비틀린 기록
  • 윤상욱 지음

2018년 3월 23일 금요일

[CentOS 7] root가 설치한 perl module은 어디로 갔는가?

사용하던 서버 중 하나를 CenOS 7.4.1708로 업그레이드한 다음 필요한 프로그램을 설치하면서 CentOS 6과는 얼마나 달라졌는지를 체험해 나가고 있다. Python, R, 생명정보분석용 프로그램의 관리에는 Conda를 시험삼아 쓰기 시작하였다. 아직은 Anaconda와 Conda 중 어떻게 부르는 것이 정확한지도 잘 알지 못한다. /opt/anaconda3에 패키지가 하나씩 설치되는 중인데 그 분량이 상당히 많다.

관리자 권한으로 Perl module을 몇 개 설치한 다음 BioPerl을 깔았다. 일반 사용자로 되돌아와서 BioPerl을 사용하는 간단한 스크립트를 하나 시험삼아 구동하였더니 모듈이 없다면서 에러가 난다. 오잉? 도대체 어디다 설치를 한거지? 다시 root로 들어가서 @INC를 확인해 보았다. 왜 이렇게 요소가 많은가! 빨강색으로 표시한 경로는 CentOS 6의 관리자 모드에서는 보이지 않던 것이다. 모듈을 몽땅 여기에 깔아버렸으니 일반 사용자가 접근이 불가능했던 것이다.

#  perl -e "print join \"\n\", @INC"
/root/perl5/lib/perl5/5.16.3/x86_64-linux-thread-multi
/root/perl5/lib/perl5/5.16.3
/root/perl5/lib/perl5/x86_64-linux-thread-multi
/root/perl5/lib/perl5

/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
.
CentOS 6.x에서는 특별히 손을 대기 전까지는 PERL5LIB 변수가 정의되어있지 않은 상태였다. 그런데 CentOS 7.4에서는 그렇질 않다.
# echo $PERL5LIB
/root/perl5/lib/perl5:
흠.. startup script에서 미리 손을 써 둔 것이 분명하다. 범인은 .bashrc였다. 다음과 같은 라인이 떡하니 들어있는 것이 아닌가. 이런 요망한 것들이 있나...


전부 주석처리를 한 뒤 다시 로그인을 하여 Perl module을 재설치하였다. 비로소 일반 사용자 모드에서 모듈을 사용하는 것이 가능해졌다. 펄을 꽤 오랫동안 사용해 왔는데도 아직도 이렇게 사람을 혼동스럽게 만드는 일이 생긴다.