2021년 8월 31일 화요일

'sort -g'의 힘

보통의 숫자와 지수형으로 표현된 숫자가 혼재하는 파일을 정렬하고자 한다. sort -n으로는 잘 되지 않는다. 이러한 경우에 sort -g 명령을 쓰면 된다. 다음의 사례를 보자.

$ cat numbers
0.002
1E-4
0.003
1
3
10
2E-4
3E+2
$ sort -n numbers
0.002
0.003
1
1E-4
2E-4
3
3E+2
10
$ sort -g numbers
1E-4
2E-4
0.002
0.003
1
3
10
3E+2

만약 역순으로 나타나게 하려면 'sort -gr'이라고 명령을 내리면 될 것이다. 매뉴얼에 의하면 '-g'는 일반적인 숫자 값에 따라 비교를 하며, '-b' 옵션을 내포한다고 하였다. '-b' 옵션은 앞부분의 공백을 무시하는 기능을 한다.

bash 환경에서 awk와 같은 '고급' 언어를 쓰지 않아도 sort나 join 등으로 꽤 많은 일을 할 수 있다. cut과 paste도 그러하다. 위에서 다룬 numbers 파일의 숫자를 콤마로 이어붙이는 문자열을 만들어 보자.

$ VAR=$(paste -sd, numbers)
$ echo $VAR
0.002.1E-4.0.003.1.3.10.2E-4.3E+2
$ VAR=$(paste -sd, <(sort -g numbers))
$ echo $VAR
1E-4,2E-4,0.002,0.003,1,3,10,3E+2

여기에서 보였듯이 process substitution을 사용하여 정렬한 숫자를 paste 명령으로 보낼 수 있다. 저수준 유틸리티를 잘 알고 있으면 간단한 자료 파일을 다루기에 아주 편리하다.


2021년 8월 30일 월요일

바쁜 일상 - 셀 스크립팅

100줄 조금 넘는 shell script를 짜느라 이틀을 꼬박 투자하고 있다. 일요일이었던 어제는 노트북 컴퓨터에서 쭈그리고 앉아서 작업을 했더니 목덜미가 뻐근하다. 스크립트 중간에 here document를 써서 R code를 삽입하고, 이를 데이터에 맞추어 실행 순간에 R script로 출력하게 만든 다음 실행하는, 나로서는 꽤 '고급' 테크닉을 구사해 보았다.

80:20의 법칙은 거의 모든 일상 생활에서 적용할 수 있다. 80%의 기능을 구현하도록 스크립트를 만드는데 20%의 시간이 든다면, 나머지 20%를 완성하는 데에는 80%의 시간이 든다. 미처 몰랐던 오류를 고친다거나, 항상 일어나는 예외 상황을 처리하기 위한 것 들이 여기에 해당한다. 

Pandas를 잘 쓴다면 R을 들락거리는 불편함이 없이 원하는 기능을 구현할 수도 있을 것이다. 나의 행동 반경을 제약하는 것은 바로 파이썬을 잘 모른다는 것. 웬만한 것은 Perl, awk, sed, R 등으로 처리하는 수준이다.

파이썬 환경을 그렇게 많이 설치하고, 이것으로 만들어진 유틸리티를 그렇게 자주 쓰면서 정작 파이썬 자체를 이해하고 직접 스크립트를 짜 보려는 노력을 하지 않는 자세는 분명히 개선의 여지가 있는데... 이렇게 게으름을 피다가 결국 '치매 예방을 위한 파이썬 강좌' 같은 것을 듣는 날이 오지 않을까?

Bash의 인수 파싱 방법을 친절하게 설명한 글이 있어서 인용하고자 한다. 앞부분에서는 getopt(s)를 사용하는 비교적 단순한 방법을, 뒷부분에서는 별도의 라이브러리를 쓰지 않고 모든 것을 구현하는 방법, 즉  단순한 flag과 인수를 동반하는 flag을 구별하고 예외 상황은 물론 , 게다가 positional argument를 동시에 처리할 수 있다.

Bash: Argument Parsing

2021년 8월 24일 화요일

Perl 스크립트 작성의 나쁜 습관을 버려야 하는데..

아직도 use strict/use warnings를 전혀 쓰지 않는 나쁜 버릇이 있다. 20년 전에 대충 독학으로 익힌 펄 실력이니 오죽하겠는가.

[Perl Maven] 언제나 use strict!

strict는 펄에서 사용하는 'pragma'이다. 이것은 컴퍼일러(펄에서는 인터프리터라고 하는 것이 더욱 정확할 것이다)에게 어떤 일을 하라고 지시하는 전처리명령이라고 한다. strict pragma는 비정상적인 동작을 유발하거나 디버그하기 어려운 상황을 에러로 전환해 준다. 다음의 코드를 보자.

$ cat test.pl
#!/usr/bin/perl
#
use strict;

$var = 1;
my $VAR = 2;
$ perl test.pl
Global symbol "$var" requires explicit package name (did you forget to declare "my $var"?) at test.pl line 5.
Execution of test.pl aborted due to compilation errors.

만약 use strict를 선언하지 않았다면 이 코드를 실행할 때 아무런 에러가 발생하지 않았을 것이다. Package name을 명시적으로 선언하지 않았다는 에러 메시지가 나온다. 패키지라고 하면 코드나 라이브러리의 '묶음' 또는 '배포 단위'를 떠올리기 쉬운데, 여기에서는 그것을 의미하는 것이 아니다.

변수의 활동 영역은 네임스페이스이고, 이들 사이의 전환을 가능하게 하는 키워드가 패키지라고 이해하면 될까? 패키지 키워드를 사용하지 않았다면, 기본 네임스페이스는 main이다. 

$ cat test.pl
#!/usr/bin/perl
use strict;

$main::x = 42;
my $x = 13;
print "$x\n";
print "$main::x\n";
$ perl test.pl
13
42

위의 사례에서 $main::x(package variable)과 $x(lexical variable)은 완전히 다르다.

쓰기 위해서 안전하게 파일을 여는 방법에도 익숙해져야 한다.

[Modern Perl Programming] Thre-arg open() (Migrating to Modern Perl)

펄 5.010 이후부터 등장한 say() 함수도 종종 써야 되겠고... Modern Perl 문서를 프린트해 놓은 것이 있는데 어디에 있는지를 모르겠다. 인터넷에서 PDF 파일을 찾아서 다운로드해 두었다. O'Reilly에서 발간한 펄 관련 서적의 PDF가 종종 인터넷에 그대로 공개된 사연은 무엇일까? 이 회사의 Open Books Project 웹사이트를 가 보아도 펄 관련 서적은 보이지 않는다. 아무튼 고마운 일이다. 공개 라이선스의 여러 형태에 대하여 공부할 필요성을 느낀다. 

좋은 펄 코딩 습관을 들이기로 마음을 먹은 후 처음 작성한 짧은 코드는 POCP(percentage of conserved sequences)를 계산하는 쉘 스크립트의 wrapper였다. 그런데 shell의 올바른 국문 표기는 '쉘'인가, 혹은 '셀'인가? 검색 결과는 후자가 맞다고 한다.

POCP는 미생물 균주가 동일 속(genus)에 속하는지를 판별하는 지표로 제안된 것이다. 이에 대해서는 2019년에 블로그에 글을 쓴 일이 있다(링크). 원본 스크립트인 POCP.sh는 오직 한 쌍의 유전체(정확하게는 아미노산 서열 집합)만을 받아들인다. 따라서 10개 정도의 데이터를 처리하려면 두 유전체의 가능한 모든 조합을 만들어서 POCP.sh에 제공해야 된다.

하나의 디렉토리에 모든 유전체 파일을 복사해 넣은 다음,  펄 모듈 Math::Combinatorics을 사용하여 모든 조합을 구성한 다음 POCP.sh에게 인수로 제공하는 간단한 펄 스크립트를 만들어 보았다. 현대적인 펄 코드 작성 스타일을 따르기 위해 노력을 한 것은 물론이다.

좀 있어 보이는 펄 코드를 짜려면 명령행 인수를 잘 처리해야 하고, 도움말 메시지를 보여주는 친절도 베풀어야 한다. 이에 대해서는 다음 웹사이트를 참고하도록 하자. 대단히 간결하면서도 유용하다.

[Perl.com] Professional scripts are a snag with Getopt::Long

2021년 8월 21일 토요일

[독서 기록] 가이 스탠딩 - 불로소득 자본주의

휴가와 밀린 업무 처리 등으로 거의 열흘만에 글을 쓴다. 도서관에서 대여한 책을 시간적인 여유를 갖고 모두 읽기 위해 기간 연장까지 했지만 1.5권을 읽는 것에 그쳤다. 이번에 읽는 내내 큰 울림과 충격을 준 책은 가이 스탠딩(Guy Standing)의 『불로소득 자본주의』였다. 부제는 '부패한 자본은 어떻게 민주주의를 파괴하는가'이고 원제는 'The Corruption of Capitalism'이다.


여담: 도서관에서 소장한 책에서는 디자인의 요소를 일부 상실한 상태로 만날 수밖에 없다. 겉표지(보통은 '자켓'으로 부른다고 한다)와 띠지를 전부 제거한 뒤에 서가에 꽂히기 때문이다. 그나마 책날개에 인쇄된 저자 및 옮긴이 소개 문구는 그대로 오려서 표지 안쪽에 붙여 놓는다. 책 디자인과 관련된 용어는 책을 알아보아요: 1. 책의 외부명칭에서 참조하면 된다.

가이 스탠딩은 프레카리아트라는 새로운 계급의 개념을 체계화한 사람이다. 

프레카리아트는 ‘불안정한(precarious)’과 ‘프롤레 타리아트(proletariat)’를 합성한 말이다. 출처: 노동자 연대

57쪽을 보면 세계화, 신자유주의 정책, 제도 변화와 기술혁명이 서로 결합하여 새로운 글로벌 계급구조를 창출하게 되었다.

  • 극소수의 부호 계급
  • 엘리트 계급
  • 샐러리아드(salariat):  상대적으로 안정된 봉급 생활자 계급
  • 프로피시언(profician): 프리랜서 전문가 그룹
  • 프롤레타리아: 핵심 노동 계급. 여기부터 아래 계급은 불로 소득이 전혀 없다.
  • 프레카리아트
  • 룸펜-프레카리아트

마침 모 연구소에서 심포지엄 발표자로 초청을 받아서 미생물과 관련된 발명을 인정받기 위한 특허에 관한 내용을 아주 조금 다루려던 참이었다. 청구항을 포괄적으로 작성하여 출원인이 더 많은 이익을 확보하게 된 '바람직한(?)' 사례가 슬라이드 한 장에 담겼다. 그런데 이 책에서 저자는, 특허권으로 창출한 시장 지배력을 불로소득의 가장 중요한 원천으로 보았다(84쪽). 

인간의 모든 행동의 근원을 경제적 동기에서 기인한 것으로 보고, 이를 극대화할 수 있는 사람을 추앙하고, 돈이 돈을 벌게 하는 이른바 '불로소득 자본주의'가 피할 수 없는 사회의 발전 방향이라고들 생각한다. 그러나 가이 스탠딩은 이것을 자본주의의 부패로 보았다.

우리에게는 지금 케인스가 말한 '불로소득자의 안락사'가 필요하다.(490쪽)

그가 내세우는 바람직한 사회는 기본소득을 바탕으로 하는 다단계 사회보호제도를 구축하는 것이다. 대통령 선거에 후보로 나오겠다고 선언한 어느 인사가 '국민의 삶을 왜 정부가 책임집니까?'라고 발언을 하여 큰 물의를 빚었던 것을 우리는 다 알고 있다. 아무리 일을 해도 생활이 나아지지 않는 하층 계급의 삶은, 그들이 노력을 덜 하고 자격을 갖추지 못해서 자초한 당연한 귀결이라고 말할 수 있는가? 1980년대 이후 생산성이 증가하였음에도 불구하고 실질 임금이나 세수는 증가하지 않았다고 한다. 저임금 일자리만 늘어난 때문이다. 휴대폰 하나만 갖추고 플랫폼에 종속되어 고된 노동 끝에 세상을 달리하는 노동자를 얼마나 많이 보았는가?

 두 번째 책인 임철의 지음 『누가 말끝마다 권력을 입에 담는가』(표지에 새겨진 글: 말 함부로 하지 마라. 말은 문자로 남는 글이 그렇듯 바람에 뜻을 새겨 영속한다)는 처음에 잠시 몰입하여 읽었다가 뒷심 부족으로 다 읽지 못하였다. 저자는 가짜 타동사인 '한자어+시키다'를 사례로 들어 잘못된 언어 생활을 통해 정신까지도 병들게 되는 현실을 고발하였다. 상당히 수긍이 가는 내용이었다. 나도 불편한 국어현실에 대하여 나름대로 생각해 둔 바 있어서 언젠가는 별도의 글로 쓰고자 한다. 나는 특히 최근 겪고 있는 급격한 억양 또는 발음의 변화를 더욱 심각하게 생각한다.



2021년 8월 11일 수요일

[R] ANI dataframe을 뒤집으면 매트릭스가 되지만...

흥미로운 산수 하나.

> class(ani)
[1] "data.frame"
> class(t(ani))
[1] "matrix"
> class((ani + t(ani))/2)
[1] "data.frame"

숫자로만 구성된 데이터프레임을 t() 함수로 뒤집으면 매트릭스가 된다. 그러나 이것을 원본과 더하여 평균을 내면 데이터프레임이 된다. 

이런 해괴한 연산이 왜 필요한가? ANI matrix를 다룰 때, 그 값이 대각선에 대하여 대칭이 되도록 만들기 위해서이다. 대각선이 전부 '1'이면 컬럼과 로(row; '로우'라고 쓰고 싶은 유혹이...)의 라벨은 동일한 순서임을 직관적으로 알 수 있다. 그러나 실제 값은 대각선에 대하여 대칭이 아닐 수도 있다. query와 subject를 어떻게 두느냐에 따라서 blast 혹은 nucmer의 값이 약간 다르게 나올 수 있으니 말이다. 따라서 평균치를 구하는 것이 안전하다. 이렇게 만든 데이터프레임의 실제 값은 대각선에 대하여 대칭을 이룬다.

데이터 m이 매트릭스임에도 불구하고 특정 row를 반환하기 위해 m["A"]를 입력하는 실수를 저지른다. 중고생 시절에는 영문법이 싫었는데 나이가 들어서는 R문법 익히기가 여간 어려운 것이 아니다. 마치 율법학자가 된 느낌이랄까...

2021년 8월 10일 화요일

12DT8 쌍삼극관의 용도 찾기

엊그제 개조를 마친 PCL86 싱글 앰프는 파워가 예전보다 더 크고, 험도 적어진 것 같다. 그러면 다 잘 된 것이 아니냐고 생각할 수도 있다. 소리는 큰데, 듣기에 약간 거북하고 부담스러움도 느껴진다. 한 마디로 표현하자면 소리가는 크지만 거칠다고나 할까? '까실까실한 소리'라고도 표현할 수 있다. 그동안 사용해 온 진공관 앰프가 대부분 싱글이었지만 부귀환 또는 UL 접속을 해서 왜곡을 억눌렀기에 그렇게 거칠게 느껴지지 않았던 것 같다. 이번에 만든 PCL86 싱글 앰프에는 부귀환을 걸지 않은 아주 단순한 타입이다.

실용오디오의 오디오Q&A 게시판에 진공관앰프는 싱글이 PP보다 음질이 우수하다는 것과 삼극관이 5극관보다 좋다는 것이 사실인지요?라는 질문이 있다. 이에 대한 황보석 님의 댓글은 고개를 끄덕거리게 한다.

싱글앰프가 우수하다는 주장에는 거의 언제나 "현의 까슬까슬한 소리"라는 말이 들어가는데, 그 소리는 사실상 저역과 고역이 심하게 찌그러지는 소리입니다.

그건 그렇다 치고, 과거 내 PCL86 앰프에서 쓰이던 12DT8 쌍삼극관이 일자리를 잃었다. 이것 어디에 활용한다. 혹시 43 싱글 앰프의 드라이브단에 쓰이는 6N2P와 바꾸어 보면 어떻까? 

'NEC'라는 마킹이 선명하다. PCL86 앰프에서는 소켓 고정 방향이 달라서 이런 글씨가 있다는 것을 그다지 인식하지 못하고 있었다.

이 앰프에서는 24V 직류 어댑터가 43 오극관의 히터에 전원을 가하는 동시에 DC-DC 스텝다운 컨버터를 통해서 6.3V로 바뀌어 6N2P로 연결된다. 드라이버 하나만 있으면 컨버터의 출력 전압을 간단히 올릴 수 있다. 

12.6이라는 숫자가 선명하다.
드라이브단에 쓰인 진공관 교체의 효과는 매우 확실하였다. 전에는 울트라리니어 접속 상태로는 소리가 너무 작아서 불만이었는데 - 오극관 접속으로 해도 책상 위에서 가까이 들을 때에나 적당할 수준이었지만 - 6N2P를 12DT8로 바꾸니 한결 음량이 커졌다. 그렇다고 하여 음색이 거칠어 지지도 않았다. 큰 스피커에 연결하고 몇 미터 떨어진 곳에서 침대에 길게 누워 듣기에도 충분한 크기의 소리가 나온다.

데이터 시트에 나온 수치나 특성 곡선을 통해서 객관적으로 확인한 것은 아니지만, 내 귀가 더 낫다고 느낀다면 그 느낌을 따라서 행동하면 될 것이다. 다소 성급하게 앰프를 해체하고 다시 만드는 만행(?)을 저질렀으나 그 결과로 얻은 것이 더 많았다. 앞으로 오디오 기기 '자작 놀이'를 해 나가는 방식과 마음가짐에 대해서도 뭔가 확실한 기준을 만들었다는 자평을 해 본다.

약간의 혼란한 시기를 거쳐서 43 및 PCL86(=14GW8) 싱글 앰프는 전부 쓸 만한 상태가 되었다.


2021년 8월 8일 일요일

부순 앰프 다시 만들기 - PCL86 싱글 앰프

인터넷에서 구한 ECL86/PCL86 싱글 앰프용 회로도(diyAudio 링크; tubman813의 포스팅 - 로그인을 해야 첨부한 회로도 이미지 파일을 볼 수 있음)를 참조하여 며칠에 걸쳐 실체 배선도를 그렸다. 상판에 이미 진공관 소켓 고정용 구멍이 뚫려 있어서 고정 방향을 바꿀 수가 없었다. 이 앰프를 STC(super triode connection) 싱글 앰프로 만들어 주었던 제작자는 소켓 주변에 러그 단자를 전혀 쓰지 않고도 아주 간결하고 아름다운 부품 배치를 하였었다. 나는 진공관 하나에 대하여 5핀 러그 단자를 하나씩 세우는 배선 계획을 세웠는데, 소켓을 고정하는 각도가 정해진 상황에서는 최적의 실체 배선도를 그리기가 참으로 어려웠다. 그렸다가 고치기를 몇 번이나 반복했는지 모르겠다. 

PCL86 싱글 앰프의 배선도
여기에 보인 그림과 같이 계획한대로 일이 흘러가지는 않았다. 신호 입력 경로에 위치한 0.22uF 커플링 캐패시터는 부품 구입을 빼먹은 터라 과감하게 생략하였고, 캐소드 저항은 기존에 장착되어 있는 것을 그대로 쓰느라 180R에서 220R로 바뀌었다. B전압도 제작 완료 후 실제 측정해 보면 260V에 가깝게 나온다.

저항을 전부 2와트급으로 마련했더니 리드가 두꺼워서 단자 구멍을 통과한 다음 한 두 차례 둘러 감는 일을 제대로 하지 못했다. 게다가 다른 부품을 다 납땜한 상태에서 7번 단자(5극관 캐소드 + 서프레서 그리드)에 부품을 연결하려고 보니 인두 팁이 들어갈 공간이 잘 나오지 않는다. 아, 이걸 히터 배선과 더불어 가장 먼저 연결하는 건데... 원본 회로도에는 저항의 와트 수는 나오지 않는다. 비슷한 앰프인 'Piccolo'(원본 글은 사라지고 인터넷에는 회로도가 유물처럼 돌아다님)에서 전부 2W 저항을 사용했기에 이걸 그대로 따라서 했는데 다소 과하다는 생각이 든다.

이전 제작자가 상당히 큰 전력을 감당할 수 있는 캐소드 저항과 바이패스 캐패시터를 별도의 위치에 설치해 두었기에 이를 그대로 사용하되 전선을 통해서 7번 단자에 연결하도록 만든 것이 그나마 다행이었다. 만약 부품을 소켓에 직접 고정할 생각이었다면 자리가 나지 않아서 정말 난감했을 것이다. 앞으로 같은 앰프를 한번 더 만든다면 그때는 오늘의 시행착오를 발판으로 삼아 매우 수월하고도 아름다운 배선을 하게 될 것이다. 언제가 될지는 모르지만.

Point-to-point wiring이 이렇게 힘들구나! 만약 푸시풀 앰프를 이런 방식으로 만들려고 한다면 아마도 며칠이고 씨름을 하다가 지쳐 쓰러졌을지도 모른다. 여담이지만 나는 앰프 자작의 한 방법으로 일컬어지는 하드 와이어링(hard wiring)이란 표현을 별로 좋아하지 않는다. 하드 와이어링은 물리적인 배선을 실제로 했다는 뜻이고, 이것의 반대 개념이라면 무선을 통한 접속 또는 프로그래밍으로 구현된 소프트 와이어링, 또는 커넥터를 이용한 접속 등을 떠올릴 수 있다. 우리가 앰프를 만드는 재래식 방법으로 여기는 '하드 와이어링'은 전선 피복을 벗겨서 부품 다리를 감은 뒤 납땜으로 연결하는 방법을 뜻하는데, 내가 조사한 것에 따르면 영미권에서는 이를 point-to-point 와이어링이라고 부르는 것 같다. 

배선을 마무리하고 소스 기기와 전원을 넣었다. 히터는 빨갛게 달아 오르는데 소리가 전혀 나지 않았다. 멀티미터로 그라운드와 플레이트 사이에 걸리는 전압을 측정해 보았다. 전혀 전압이 잡히지 않는다. 이게 무슨 일? 이건 필시 내가 만들지 않은 구역에서 문제가 있다는 뜻이다. 그 원인은 전혀 상상하지 못한 곳에 있었다. 앰프의 중간을 가로지르는 굵은 그라운드 동선과 전원회로의 그라운드가 전기적으로 도통된 상태가 아니었다. 당연히 전선을 통해 연결되어 있을 것으로 생각하고 대수롭게 생각하지 않았는데, 아무리 살펴 보아도 연결된 곳이 없었다.

어째서 이럴 수가 있나? 정류부의 그라운드는 러그 단자의 고정용 핀에서 끝나 있었다. 아니, 그러면 상판 전체를 그라운드로 쓰고 있었단 말인가? 이전 제작자가 만든 회로를 걷어낼 때, 진공관 소켓 하나의 본체에 전선이 납땜이 되어 있던 것을 기억한다. 생각해보니 소켓과 상판이 닿는 곳에 납땜을 한 것으로 생각된다. 그리고 여기서 인출된 선이 그라운드용 동선으로 연결되었던 것 같다.

그렇다면 상판 전체를 그라운드로 썼었다는 이야기가 된다. 이건 별로 바람직하지 않은 구성이다. 전도성 상판을 접지에 연결하는 것은 안전이나 잡음 방지를 위해 중요하지만, 이를 회로 전체의 그라운드로 삼아서 모든 전류가 되돌아가는 길로 쓰는 것은 썩 좋지는 않은 설계라고 생각된다.

한 걸음 더 나아가자면, 이 앰프는 무접지 전원 케이블을 사용하고 있다. 접지가 부착된 전원 케이블을 사용하고, 섀시는 전원 소켓의 접지에 연결하는 것이 올바른 방법이라 생각된다.

회로의 그라운드를 제대로 연결한 다음 다시 작동 테스트를 실시하였다. 비로소 소리를 들을 수 있었다. 

상판 앞쪽에는 구멍을 뚫으려다 실패한 상처만 남았다. 상판의 재질은 아마도 페인트를 입한 스테인레스 스틸이 아니었을까?

중간을 가로지르는 그라운드 동선에 아래쪽으로 납땜된 부품부터가 이번에 새로 만들어 넣은 영역이다. 라이터가 없어서 수축튜브를 제대로 마무리하지도 못했다. 바깥쪽 소켓은 이전에 쓰던 것을 그냥 끼워 넣은 상태이다.
이전에 만들어진 상태에 대한 나의 관찰과 해석이 잘못되었을 수도 있다. 그러나 중요한 것은 이제부터는 내가 이해하고 통제할 수 있는 상태로 앰프를 다시 만들어 놓았다는 점이다. 개작 전의 잡음 원인은 앞으로 영영 알 수 없게 되었다. 좌우 채널의 진공관을 바꾸어 끼워도 여전히 잡으미 한쪽에서 났다는 것은, 오늘 발견한 다소 납득이 되지 않는 접지 방식, 즉 어느 하나의 초단관(12DT8) 소켓 본체와 상판 결합 부위에 납땜을 하여 그라운드를 인출한 곳에서 접촉 불량 등의 상황이 발생한 것에 원인이 있는지도 모른다.

유리관 하나에 3극관과 5극관이 함께 들어 있으니 단 두 알이면 스테레오 앰프를 만들 수 있다는 것이 복합관의 장점이다. 내가 만든 싱글 앰프의 소리는 어떠한가? 전원을 넣는 순간 들리기 시작하는 험은 예전보다는 나은 것 같다. 이번에는 NFB도 걸지 않았으니 싱글 특유의 까실까실함이 더 크게 느껴지는 것 같다. 어차피 이전 앰프와 이번 개작 앰프의 소리를 객관적으로 비교할 수는 없다.

아직도 PCL86 관은 몇 개가 남아 있다. 이번에 개작을 하면서 새 관을 쓰지 않았기 때문이다. 진공관 앰프를 처음 장만하면서 언젠가는 필요할 것으로 생각하여 교체용 관을 마련하고 싶은 생각이 드는 것은 당연한 심리이지만, 7년이 지난 지금 생각해 보니 그럴 필요가 전혀 없었다고 생각한다. 가격은 약간 올랐어도 PCL86은 여전히 구할 수 있기 때문이다. 괜히 여분의 관을 써서 뭔가 만들어야 한다는 강박 관념에 시달리기만 한다. 예비용으로 이베이에서 한꺼번에 10개나 샀다가 처분했던 부끄러운 과거가 생각난다. 그리고 이번 개작을 하는 과정에서 여분의 관이 있다는 사실은 전혀 동기가 되지 못했다.


앞으로의 계획은 단순하다. 6LQ8(SE & PP)과 PCL86(SE)이나 유지 보수하는 수준에서 만족하련다. 어차피 거실의 주력 앰프는 인터M R150PLUS가 자리를 잡았으니... 43 SE 앰프는? 글쎄, 잘 모르겠다. 6P1 SE 앰프는? 이미 이 세상 물건이 아니다.

갖고 있는 여분의 부품을 이용해서 뭔가 해야 된다는 강박을 벗어나는 것이 무엇보다 중요하다.



2021년 8월 6일 금요일

반가운 COG 2020

COG(Clusters of Orthologous Groups)는 미생물 유전체를 다루는 사람들에게는 매우 잘 알려진 데이터베이스이자 분석 도구이다. 오리지널 페이퍼가 1997년에 나왔으니(링크) 이제는 고전이 된 '지식'이라고 보아도 무방할 것이다. 2014년에 마지막 업데이트가 된 이후로 거의 신경을 쓰지 않고 있었다. 왜냐하면 매우 편리한 유전체 주석화 도구(RAST server, Prokka or PGAP)이 있어서 특별히 진화적 관점에서 각 유전자를 살펴볼 것이 아니라면 COG 체계를 다시 열어볼 필요가 없었기 때문이다. Protein set이 준비되어 있을 때 각각에 대하여 COG를 할당하는 소프트웨어가 그렇게 친절하지 않다는 것도 한 원인이 되었다. 웹사이트에다 단백질 세트를 밀어 넣으면 알아서 계산을 해주는 방식이 아니기 때문이다.

COG 개발자들은 방대한 박테리아의 유전체 자료를 다루면서 각 단백질 패밀리의 구조와 기능, 진화적 관련성, 이들 단백질이 관여하는 대사 기능 등에 대해서 얼마나 많은 지식을 알고 있을까? 항상 시급한 과제에 매달려서 각 종에 대한 단편적인 지식만을 쌓고 있는 나는 이런 연구자들이 정말 부럽다. 얼마 되지 않는 목초지(과제, 예산, 탑-다운 방식으로 떨어지는 키워드...)가 황폐해져서 맨땅을 드러내면 양떼를 몰고 다른 땅을 찾아 떠도는 유목민과 같은 신세가 바로 한국 과학자들의 처지가 아닐까? 유목민이 부러운 것은 무엇이 있을까? 자유? 

식품의약품안전평가원에서 발간한 『건강기능식품 기능성 원료 프로바이오틱 안전성 평가 가이드(민원인 안내서)』(2021년 6월) PDF를 보면 3쪽에 'General Report for Genome Sequence Analysis'가 나온다. 여기에서는 각 유전자의 기능을 COG 체계에 맞추어 집계한 표 사례를 볼 수 있다. 와우, 언제적 COG란 말인가? 아마도 시퀀싱 raw data 생산에서 조립, polishing, genome annotation까지 결과를 만들어 주는 서비스 업체의 보고서를 그냥 갖다 붙인 것은 아닐까하는 생각이 든다.

혹시 COG 할당 소프트웨어(COGcognitor, COGlse, COCmakehash, COGreadblast & COGtriangles)가 좀 더 편리한 것으로 바뀌었는지 궁금하여 웹을 검색해 보니 2021년 Nucleic Acids Research Database issue에 후속 논문이 나온 것을 알게 되었다. 최근 소식을 전해 듣는데 비교적 느린 나로서는 이만하면 정말 빨리 소식을 접한 셈이다. COG 업데이트가 계속 나오는 것을 보니 1956년생인 Eugene V. Koonin이 아직 건재한 모양이다.

COG database update: focus on microbial diversity, model organism, and widespread pathogens. Nucleic Acids Research, Volume 49, Issue D1, 8 January 2021, Pages D274–D281, https://doi.org/10.1093/nar/gkaa1018

이제는 퇴출된 유전자 ID 등 이전 2014년 버전에는 손질할 부분이 매우 많았다. 요즘의 필요성에 맞게 적절히 업데이트가 된 것 같다. 논문의 초록에는 어떠한 사항이 새로워졌는지를 다음과 같이 소개하였다.

  • gi(gene index) 번호를 RefSeq 또는 GenBank.ENA/DDBJ CDS accession number로 바꾸었다.
  • 200개 이상의 새로운 단백질 패밀리를에 관한 COG 주석을 업데이트하였고, PDB 링크가 있는 경우 이를 연결하였다.
  • Pathway로 그룹을 지은 COG 체계를 만들었다.
  • CRISPR-Cas immunity, sporulation(Firmicutes) 및 광합성(남세균)에 관여하는 266개의 새로운 COG를 추가하였다.
  • 이로써 2020년 최신 버전의 COG는 4877개가 되었다.

FTP 사이트 https://ftp.ncbi.nih.gov/pub/COG/COG2020/data/에서 제공하는 새로운 파일이 아직 기존 상태로 머물러 있는 COG software와 호환이 되는지는 테스트를 해 봐야 한다. DB를 구성하는 단백질 세트는 1,785,722개('prot2003-2014.fa')에서 3,213,025개('cog-20.fa')로 약 1.8배 증가하였다.

분명히 몇 년 전에 COG software를 사용하여 COG를 할당하는 방법을 문서로 만들어 둔 것 같은데 기억이 나질 않는다. 내 스크립트 모음 디렉토리를 가서 COG라는 이름으로 검색을 하니  process_COG_query.sh라는 이름의 스크립트가 눈에 뜨였다. 이게 어디서 난 것일까? 번거로운 psiblast 및 COG software 실행 방법을 스크립트 한 방으로 끝낼 수 있게 잘 만들었구만... 누가 만든 거지? 스크립트 이름을 사용하여 구글을 검색해 보았다. 웹 상에 분명히 존재하는 것이었다. 어디 클릭을 해 보자...

NCBI COG software를 이용한 query protein의 COG assignment 방법

뭐야, 이건! 내 위키 사이트 아닌가? 내가 필요에 의해서 스크립트를 만든 다음 이를 사용하는 방법을 웹에 공개한 문서를 만들어 놓고 까맣게 잊고 있었다. 정말로 내 머릿속의 신경 회로 패턴이 많이 낡은 모양이다. 당장 이 스크립트의 맨 위에 'written by Haeyoung Jeong'이라는 코멘트 한 줄을 삽입해 넣었다. 앞으로는 아무리 간단한 스크립트를 만들어도 내 이름을 적어 놓아야 되겠다. 그렇지 않으면 내가 만든건지 다른 곳에서 입수한 것인지 알기가 어려워진다. 하긴 다른 곳에서 입수한 대부분의 스크립트에는 작성자가 이름이나 이메일 주소를 써 놓기도 하니까...

위키 문서에서는 process_COG_query.sh의 앞부분, 즉 query sequence의 ID를 바꾸는 것만 소개가 되어 있다. 현재 내 컴퓨터에 존재하는 스크립트는 psiblast 및 COG software를 실행하는 것까지 포함된 완성 상태이다. 그래 봐야 몇 줄 되지 않지만... 

COG2020 자료를 기존의 COG software로 돌리는 방법을 정리해는 것이 숙제로 남았다. 자칫하면 주말을 앞두고 게을러질 수 있는 뜨거운 여름날의 금요일 오후에 새로운 원석을 발견한 기분이다.

2021년 8월 5일 목요일

앰프를 부수다

보다 나은 가치를 위한 창조적 파괴? 공간 확보를 위한 부득이한 조치? 화풀이? 앰프의 제작자에게는 미안한 마음이 든다. 7년 반 정도 사용한 진공관 앰프가 아무런 문제가 없을 수는 없다. 한쪽 채널에서 묘한 잡음이 발생하기 시작했는데, 진공관을 좌우 채널을 바꾸어 끼워도 잡음이 따라 다니지를 않는다. 심지어 새 관을 꽂아도 잡음은 그대로이다! 앰프를 엎어놓고 뚜껑을 열어 봐야 저항과 캐패시터만으로 이루어진 회로일 뿐이고, 어차피 내가 이해하지 못하는 약간의 변형 초삼결(super triode connection) 회로라서 달리 손을 쓸 수가 없었다. 터지거나 망가진 전해 캐패시터가 있는 것도 아니요, 납땜이 떨어진 곳이 있는 것도 아니다. 내가 알고 있는 초삼결 회로에는 트랜지스터를 쓰는 것으로 아는데, 이 앰프의 한쪽 채널 구성은 반도체 소자 없이 12DT8 + PCL86이다.

원 제작자에게 보수를 요청하기에는 구입 후 너무 많은 시간이 지났고, 이 무거운 것을 보내고 받는 번거로움이 있다. 차라리 내가 이해할 수 있는 단순한 싱글 앰프로 바꾸기로 하고 전원부를 제외한 회로를 전부 걷어냈다. ECL/PCL86 싱글 앰프의 회로도는 인터넷에 널려 있다. 며칠에 걸쳐서 배선 밑그림을 그려 본 다음, IC114에 필요한 부품을 주문하였다.

바깥쪽 구멍 두 개는 비워두지 말고 빈 소켓을 꽂도록 하자.
6N1+6P1 싱글 앰프도 쓰레기통으로 들어갔다. 부끄럽지만 화풀이를 좀 심하게 했다. 사실 이 앰프는 결정적인 하자가 있는 것은 아니었다. 소켓 어댑터를 사서 남들은 한번씩 다 거쳐 간다는 6V6 싱글 앰프로 전환해 보겠다고 여러 차례에 걸쳐 궁리를 하였으나 그것도 그만 두기로 했던 참에 약간의 극단적 선택을 하고 말았다.

43 앰프는 소리를 조금 더 키워 보고 싶지만 오실로스코프의 상태가 매우 좋지 않아서 실험을 하기가 어렵다. 

올해로 8년째, 진공관 앰프를 가지고서 소소한 즐거움을 누린 것은 사실이다. 그러나 50W+50W 반도체 파워 앰프가 뿜어내는 당당한 출력 앞에서 더 이상 음악적 쾌감을 느끼기가 어려웠다는 것이 솔직한 결론이다. 앞으로는 6LQ8 싱글 및 푸시풀 앰프, 그리고 오늘 쓰는 글의 주제인 PCL86 싱글 앰프를 마지막 진공관 앰프 경험으로 삼고자 한다. 헌 전선과 뜯어낸 부품으로 가득한 정크 박스도 그 크기를 줄여 나가련다. 앞으로는 음악 자체에 몰두하고 싶다.

그동안 즐거웠다!



NCBI의 assembly 정보 파일로 접근하는 URL이 살짝 바뀐 듯하다

예전에는 다음 URL을 통해서 RefSeq에 등록된 유전체 정보의 요약본 파일(assembly_summary.txt)을 다운로드했었다.

ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/assembly_summary_refseq.txt

이 파일은 리눅스 명령행에서 curl이나 wget을 통해서 여전히 잘 다운로드할 수 있다. 그런데 이 주소를 웹브라우저에 넣으니 파일이 열리거나 다운로드로 이어지지 않는다. 웹 브라우저를 통한 FTP 접근을 막은 것일까? NCBI의 Genome Download (FTP) FAQ로 접속하여 16번째 항목인 'How can I download RefSeq data for all complete bacterial genomes'를 확인해 보았다. assembly_summary.txt 파일의 접근 경로는 ftp://가 아니라 https://로 시작한다.

https://ftp.ncbi.nlm.nih.gov/genomes/refseq/bacteria/assembly_summary.txt

물론 이 텍스트 파일의 20번째 컬럼인 ftp_path의 값은 당연히 ftp://로 시작한다. 그러면 이번에는 NCBI 웹사이트에서 특정 미생물 균주의 assembly를 다운로드하기 위해 클릭하여 접속하는 URL은 무엇으로 시작하는가? 아래 그림에서 빨간색으로 표시된 곳을 클릭하면 여전히 웹 브라우저에서 파일 목록을 볼 수 있다.


이때 주소창에 나타나는 URL이 당연히 ftp://로 시작할 것으로 생각했었는데 오늘 확인해 본 결과 https://였다. 음? 원래 이랬었던가? 아니면 최근에 바뀐 것인가? 보안이나 네트워크 대역폭 등 여러 사항을 감안하여 주소 체계를 바꾸는 것으로 이해할 수 있다. 

공공 데이터를 ftp가 아니라 https를 통해서 전송한다면 암호화-복호화 등의 인증 작업을 거쳐야 하므로 시간이 더 걸릴 것이다. ftp://로 시작하는 주소를 누군가 해킹하여 악성 코드를 심은 엉뚱한 파일을 다운로드하게 만들 수도 있지 않을까? 충분히 가능한 이야기라고 생각한다. 내가 접속한 ftp 서버가 악의적으로 만들어진 가짜일 수도 있다! 인간 유전체 GRCh38이라고 되어 있는 ftp 주소를 클릭하였더니 악성 코드가 담긴 엉뚱한 파일이 내 컴퓨터로 다운로드될 수도 있는 것이다. 'ncbi'라 생각하고 클릭을 했더니 'nc6i'였고, 'kobic'이라 생각했더니 'ko6ic'으로 연결되는 일도 있을 수 있다.

무엇을 상상하든 그 이상의 일이 벌어지는 세상이니... 조심하자.