2020년 5월 27일 수요일

Text::ParseWords - parse text into an array of tokens or array of arrays

CSV(comma-separated values) 파일을 파싱할 때 간혹 매우 성가신 상황이 벌어지기도 한다. 모든 필드를 따옴표로 둘러싸서 CSV를 만든 것은 좋은데, 그 내부에 또 콤마가 들어있는 경우가 있기 때문이다. Roary가 만든 gene_presence_absence.csv 파일을 Perl로 파싱하다가 결과가 좀 이상해서 원본 파일을 들여다보니 세번째 컬럼(functional annotation)에 콤마가 삽입된 것을 만나면서 이상 작동을 한 것이었다. 효소 명칭 중에는 이런 것이 매우 흔하다.

에휴... 이걸 어떻게 손을 댄다? 파이썬에는 아주 현명한 해결 방법이 있는지는 모르겠으나 구글을 뒤지니 Text::ParseWords라는 모듈이 이 일에 딱 맞는 것 같다. quotewords() 함수가 핵심이다.

@words = quotewords($delim, $keep, @lines);
$keep 인수는 무슨 용도일까? 매뉴얼을 살펴보았다(perdoc Text::ParseWords). 이것은 boolean flag이고, 내가 참조한 코드에서는 0, 즉 false를 공급하였었다. 이것이 true이면 모든 토큰은 $delim에 의하여 분리되지만 quote, backslash 등의 문자는 토큰 내에 그대로 남는다. $keep이 false라면 역슬래쉬로 escape하거나 작은 따옴표 안에 들어있지 않은 모든 따옴표와 역슬래쉬는 제거된다... 흠, 무슨 말인지 알 것도 같고 아닌 것도 같고.

6LQ8 싱글 앰프는 돔베고기 플레이팅 스타일로!

돔베는 도마를 뜻하는 제주도 사투리다. 돔베고기는 도마 위에 썰어놓은 돼지고기 수육을 의미한다. 푸드 플레이팅(food plating)이라면 멋진 그릇 - 주로 접시 - 위에 음식을 보기좋게 늘어보는 기법으로 주로 서양 요리에서나 쓰는 개념으로 알려진 것 같다. 예쁜 그릇이 아니라 투박하게 도마째로 음식을 내어놓다니 '더함'을 문명의 척도로 생각하는 사회에서는 있을 수 없는 일이겠지만, '뺌'의 미학을 아는 사회에서는 그것 자체가 하나의 문화가 된다.

구글 검색에서 라이센스가 없는 '돔베고기' 이미지는 이것이 전부이다.
앰프 제작도 마찬가지다. 멋진 금속 케이스로 둘러싸는 것도 좋지만, 프로토타입을 만들듯이 나무판 위에 부품을 올려서 연결한 상태 그대로 완성해 버리는 것도 가능하다. 가장 최근에 만든 6LQ8 SE 앰프의 모습은 언뜻 돔베고기를 연상시킨다.


이 콘셉트를 그대로 유지하고자 한다. 12T 미송합판을 사서 바닥판으로 삼고, 4.8T 미송합판으로는 PCB를 둘러싸되 구멍을 뚫어서 진공관을 노출시킨다. 전원 케이블을 고정할 몇 가지 부품도 어제 구입하였다. 압착단자와 케이블 그랜드(cable gland; PG-07이라는 부품명)가 그것이다. '바닷가재표' FK-3 압착 플라이어가 비로소 제 역할을 하기 시작하였다. 파워 케이블의 직경이 거의 8mm나 되어 PG-07의 구멍을 갈아내고 내부의 고무 패킹을 하나 제거해서 겨우 관통시켰다.


흐흐흐... 압착단자를 끼운 상태에서는 케이블 글랜드를 통과하지 못한다. 요건 몰랐지? 며칠 후 잘라내고 다시 단자를 압착해야만 했다.


한 편의 동양화와 같은 담백한 싱글 앰프가 만들어질 것으로 기대한다. 아예 도색도 하지 말까?

2020년 5월 22일 금요일

출근길 걷기 코스 2.2 km, 하나마나한 운동일까?

아래 이미지는 오늘 지하철을 내려서 근무지까지 내역을 휴대폰 앱으로 기록한 것이다. 이 경로는 부족한 운동량을 채우기 위하여 작년에 개발(?)한 코스이다. 전체의 절반 정도는 하천변에 마련된 산책로라서 한적하고 시원한 분위기에서 걸을 수 있다. 이렇게 아침에 25분 정도를 투자하여 걸으면 점심 무렵에 조금 것는 것만으로 삼성헬스 앱에서 권장하는 하루 운동량인 6천 걸음을 쉽게 달성하게 된다.


널리 알려진 '하루에 만보 걷기'는 칼로리는 소비하지만 운동 효과는 제로라는 의견도 있다(2018년 기사 링크). 실제로 만보를 걸으려면 꽤 많은 시간을 들여야 한다. 그러나 근력 운동은 20분만 해도 운동 효과는 더 크다는 것이다. 심박수가 일정 수준까지 오르지 않으면 열량 소비를 제외한 운동 효과가 없다는 것이다.

걷기만 해서는 약간의 체중 감량 효과는 있겠지만 체지방과 근육량 등의 중요한 지표는 거의 변하지 않는다. 그러나 같은 기간 매일 10분에서 20분 가량 근력 운동을 한 결과는 효과가 컸다는 것이 오늘 소개한 기사에서 기자가 체험한 것이다. 체지방 4 kg 감소, 근육량 2 kg 증가. 내가 매년 건강검진을 받으러 갈 때 듣는 목표량과 거의 같다.

건강이 증진된다는 것은 심폐 기능, 폐활량, 근육량 등이 증가한다는 것이라고 한다. 이는 단순한 '파워 워킹'으로는 절대 되지 않는다. 숨이 차고 심장이 벌떡거며 땀이 나는 격렬한 수준의 운동이 아니라면 소용이 없다는 뜻이다.

걷기라도 시작한 것은 그나마 다행이다. 지년 3년 동안 나는 몸을 위해서 한 것이 아무것도 없으니 말이다. 대전에 있을 때는 가끔 피트니스 클럽을 들락거리기도 했었지만.

안전하면서도 효과가 있는 운동을 하려면 나의 신체 수준에 맞는 운동 강도를 정해야 한다. 나이에 맞는 최대 심박수의 64-76% 범위에 드는 강도로 운동을 하는 것이 적당하다고 한다. 삼성서울병원 스포츠의학팀에서 제공하는 운동 강도 정하기를 참조하면 내 나이의 분당 최대 심박수는 대략 173(어떤 사이트에서는 220에서 나이를 빼면 된다고 함), 적절한 심박수는 111-132 사이가 된다.

퇴근을 하면서 작년에 조금 하다가 말았던 오피스텔 16층까지 계단 오르기를 해 보았다. 5층을 넘어가면 맥이 빨라지는 것을 느끼고, 9층을 넘어가면 숨이 가빠져서 달리기할 때의 호흡 요령, 즉 두번 들이쉬고 두번 내쉬는 방법을 써야 하고, 12층에서는 슬슬 무아지경(?)에 이르다가 목적층에 서서히 다다르면 안도감과 함께 숨가쁨이 약간 줄어든 느낌이 든다. 16층에서 휴대폰 앱으로 분당 심박수를 측정하였더니 무려 162가 나왔다. 이는 최대 심박수의 93.6%에 해당한다. 어쩌면 위험할 수도 있는 수치인지도 모른다. 지나는 사람이라고는 하나도 없는 비상계단에서 갑자기 가슴을 부여잡고 쓰러지면 어쩌란 말인가.

계단 오르는 속도를 조금 줄이거나, 두 번 정도 쉬면서 오른다면 안전한 범위로 심박수를 유지할 수 있을 것이다. 일부러 운동을 하기 위한 시간을 낼 필요가 전혀 없으면서 가장 짧은 시간 내에서 심박수를 올릴 수 있는 운동이 바로 계단 오르기 아닐까. 단, 무릎 관절에 아직 이상이 없다는 전제 조건 하에서 말이다.

팔굽혀펴기로 심박수를 얼마나 올릴 수 있을까? 20회 후 측정한 분당 심박수는 93이다. 두번째 세트! 이번에는 20회를 채우지 못하는 허약한 근육이니 아무리 애를 써도 심박수는 95 이상 오르지 않는다. 계단 오르기의 위대함을 이제야 알겠다.

2020년 5월 20일 수요일

낡은 노트북 컴퓨터(컴팩 CQ61)의 메모리 증설

이틀 전에 주문한 중고 DDR2 2GB 메모리(PC2-6400S)가 오늘 배송되었다. 삼성 제품보다는 조금 싼 외산 메모리였다. 혹시 인식이 되지 않으면 어떻게 할까 걱정을 했는데 기우에 불과하였다. 정확하게 4096 MB로 잘 표시되었다.


컴퓨터 바닥의 고무발 하나가 없어져서 뒤뚱거리는 것이 마음에 들지 않아서 핫멜트를 이용, 수평을 맞추었더니 내장 광학 드라이브의 이젝트 버튼이 작동한다! 드라이브가 뒤틀려서 작동을 하지 못했던 것 같다. 그게 전부가 아니다. 화면의 맨 아래쪽이 몇 초 간격으로 비정상적으로 밝아졌다가 다시 원래로 돌아오기를 반복하는 상태였었다. 그런데 베젤을 잘 문지르니 이러한 현상도 없어졌다. 그러나 화면 상단쪽에서 깜빡거리는듯한 문제는 남은 상태다. 크게 불편함은 없으니 당분간 그냥 쓰도록 하자.

내장 웹캠을 작동시켜 보자. 무슨 명령어를 써야 하나? 검색을 해 보니 cheese라는 명령어가 있다. 오! 사진이 찍힌다. 활용 방안을 찾지 못해 몇 달 동안이나 입을 다물고(?) 있었던 낡은 노트북 컴퓨터가 기지개를 켜기 시작했다.

2020년 5월 19일 화요일

우연이 가져다주는 즐거움

크롬 브라우저의 Blogger 편집창 모습이 바뀌었다. 모바일 환경에서 쓰기에 적합하게 만들어졌다는 느낌이 든다. 화면 오른쪽에 있었던 라벨 추가 및 편집창도 예전과는 다르다. 구글 블로거의 라벨이라는 것이 글에 일종의 카테고리를 부여하는 것인가, 혹은 나중에 검색을 잘 할 수 있도록 일종의 키워드를 설정하는 것인가? 전자라면 새로 부여할 때 신중을 기해야 하고, 후자라면 많이 달아줄수록 좋을 것이다. SNS에서 흔히 쓰이는 해시태그(#)는 두가지의 기능을 다 담고 있는듯하다.

우연히 선택한 것이 의외의 만족감을 주는 일을 많이 경험하였다. 낡은 노트북 컴퓨터를 CD 재생용으로 쓰기 위해 테스트용 중고 음반을 두 장 구입하였다. 내가 중고 CD를 고르는 기준은 아주 명확하다. 가격이 쌀 것, 그리고 되도록이면 잘 모르는 음악가일 것.

Kodály Zoltán의 'Music for Cello'(왼쪽), 그리고 European Jazz Trio의 'Saudade'.

장중하고도 서정적인 코다이의 첼로 음악, 그리고 EJT의 푸근한 재즈가 너무나 듣기에 좋다. 헝가리에서는 우리나라와 마찬가지로 성이 앞에 나온다고 한다. 그래서 코다이 졸탄, 바르토크 벨러라는 작곡가의 이름에서 코다이와 바르토크가 성에 해당한다. 단, 바르토크는 미국으로 망명하였으므로 벨러 바르토크라고 불린다. EJT는 클래식곡을 포함하여 잘 알려진 곡을 재즈로 편곡하여 연주하는 것으로 잘 알려져 있다는데, 이 정도라면 가히 창작이라고 해도 좋을 것이다. 곽윤찬의 앨범 Noomas를 개봉하여 들었을 때의 느낌과 아주 흡사했다. 참고로 Noomas는 중고 매장이 아니라 대전문화예술의전당 음반점에서 구입한 신품이다. EJT의 오리지널 곡이 있다면 찾아서 들어보고 싶다.

지난 주말, 우연히 경기도 파주에 있는 헤이리 예술마을을 가게 되었다. 한반도 서북쪽 끝으로는 강화도와 인천공항 말고는 처가가 있는 고양시를 벗어난 일이 없었다. 원로 방송인 황인용 씨가 운영하는 것으로 잘 알려진 카메라타 음악감상실에서 1930년대 만들어진 그대로의 모습을 하고 있는 빈티지 스피커가 울려주는 음악을 들으며 몇 시간을 보냈다. 이곳에 대한 방문기나 사진 자료는 인터넷에 워낙 많아서 내가 새로운 정보를 올릴만한 것은 없으니 사진 몇 장으로 추억을 남기고자 한다. 웨스턴 일렉트릭, 클랑필름, 빅터... 사진으로만 보면 스피커에서 아직도 이렇게 찰진 음악이 흘러나오다니... 필드 스피커라고 하던가? 영구자석이 아니라 전자석을 쓴 스피커라서 아직도 그 힘을 유지하고 있는 것 같다. 










아주 초보적인 수준의 진공관 싱글 앰프만 몇 대 만들어 본 나에게 이번 카메라타 방문은 새롭고도 깊은 영감을 주었다. 그렇다고 해서 돈을 모아 빈티지 오디오를 구하러 돌아다니게 되지는 않겠지만. 다음번 방문을 기약하며 동행한 아내의 사진을 몇 장 더 올려본다.












2020년 5월 17일 일요일

컴팩 프리자리오(Compaq Presario) CQ61-304TU를 오디오 CD 재생기로 재활용하기

이것은 작년에 쓰레기를 버리는 곳에서 입수한 낡은 노트북 컴퓨터이다. 다나와 자료를 찾아보니 2010년에 출시된 아주 오래된 노트북 컴퓨터이다. CPU는 펜티엄 듀얼코어 T4400(2.2GHz)이고 DDR2 2GB 메모리가 하나 꽂힌 상태이다. 처음 입수했을 때에는 파워 어댑터가 없어서 작동이 되는지 불분명한 상태였다. 근처 HP 서비스센터에 가서 전원을 연결해 보니 부팅은 되는 것 같아서 전원 어댑터를 새로 구입하고, 내장된 복구 기능을 사용하여 운영체제(윈도우즈 7)을 초기 상태로 되돌려 놓았었다. 배터리는 수명이 다 된 상태이고, ODD는 이젝트 버튼이 작동하지 않는 상태였다. 실행속도가 너무 느려서 활용 방안을 찾지 못한 채로 방치한지 벌써 1년이 가까이 되었다.

출장 근무지 숙소에서 직접 만든 진공관 앰프를 무려 세 대나 번갈아 가며 듣는 호사를 누리고 있지만 CD를 들을 방법이 없다는 것이 문제였다. 여기에서 듣자고 자리를 많이 차지하는 거치형 CD 플레이어를 따로 사는 것은 부담스러웠다. 요즘 팔리는 휴대용 CD 플레이어는 전부 군인을 고객층으로 하는 저가품이라서 매력을 느끼기가 힘들었다. 벽걸이 CD 플레이어를 구입하거나, 아니면 라즈베리파이를 구입해서 USB 단자에 ODD를 연결하여 듣는 것 말고는 마땅한 방법이 떠오르지 않았다. 이번 기회에 라즈베리파이에 입문을 해 볼까? 종류는 왜 이렇게 많지? DAC 보드를 꼭 달아야 하나?  Volumio 하나만 설치하면 다 해결이 될까?

그러다가 몇 달 동안 먼지만 뒤집어쓰고 있던 컴팩 노트북 컴퓨터를 떠올리게 되었다. 우분투를 설치하면 윈도우보다는 좀 더 원활하게 쓸 수 있을 것이라 생각을 하고 우분투 18.04 LTS를 설치하였다. 올해가 2020년이라서 새로운 LTS 버전인 20.04(Focal Fossa)가 최근에 나왔다고 하는데, 발표 다음 달에 설치하는 것은 너무 이르다는 생각이 들어서 18.04를 쓰기로 하였다. USB 매체에 부팅용 이미지를  설치하는 프로그램으로는 Rufus라는 것을 사용해 보았다.

내장 ODD의 작동 여부를 알기가 어려워서 근처 알라딘 중고책 매장에 가서 CD를 두 장 구입하였다. 즐겨 듣는 CD는 모두 대전 집에 있으니 별 도리가 없었다. 오늘 구입한 음반은 European Jazz Trio의 Saudade와 Kodály의 Music for Cello(Three Chorale Preludes/Cello Sonatas Opps 4 & 8). eject라는 명령어를 커맨드라인에서 입력하니  트레이가 툭 빠져나온다. CD를 삽입하고 기본 오디오 플레이어인 리듬박스를 실행하였다. 오디오 출력은 USB로 받아서 Behringer UCA200를 거쳐 6LQ8 싱글 앰프에 연결하였다. 음악이 잘 흘러나온다! 유뷰브에서 김봄소리의 바이올린 연주도 들어 보았다.



2020년 5월 18일 메모리를 증설하고자 2GB DDR2 중고 부품을 주문하였다.


KBS Kong도 이 노트북 컴퓨터에서 실행할 수만 있다면 완벽한 음악 재생기가 되겠지만 아쉽게도 그건 바랄 수 없다. 웹주소를 리듬박스에 넣어서 KBS Classic FM을 듣는 방법이 있다지만 아직 성공하지 못했다.

컴퓨터는 팬 소음이 있어서 음악감상용 장치로 쓰기에는 약간의 불리함이 있다. 전기적 노이즈까지는 구별할 귀가 아니라서 USB 오디오 인터페이스를 쓰는 것으로 만족한다. 디지털 음원의 효율적인 재생에 대해서 공부를 할 시대가 되었으나 진공관 앰프나 오디오 CD 등 '손에 만져지는' 전통적인 기술을 아직 더 좋아하는 편이라서 진도가 늦다. 갖고 있는 CD는 얼마 되지도 않는데다가 리핑과 정리라는 수고를 아직은 하기가 싫다. 왜 MS 미디어플레이어가 아니라 foobar2000을 써야 하는지, 업샘플링이란 무엇인지, 지터 노이즈는 무슨 의미인지.. 이제라도 음악감상용으로 라즈베리파이에 입문한다면 분명 많은 것을 새로 익히게 될 것이다.

낡은 컴퓨터는 리눅스를 깔아서 이렇게 새로운 용도를 찾는다. 지금 쓰는 글도 오늘 되살린 컴팩 노트북 컴퓨터로 쓰는 중이다.

2020년 5월 14일 목요일

대장균 K-12 MG1655의 유전체 서열 히스토리

대장균(Escherichia coli)은 사람의 대장에 사는 미생물 중 그 수가 가장 많은 것도 아니고, 인체와 상호작용을 하는 것 중에서 가장 중요한 것도 아니며, commensal과 pathogen의 양면성을 모두 갖춘 모호한 생명체이다. 인공적인 배양 조건에서 잘 자란다는 특성 때문에 어쩌다보니 과학자의 띄어서 일찌감치 실험실 식구가 된 것이다.

NCBI에 공개된 Escherichia coli K-12 MG1655의 유전체 정보는 GenBank accession으로 U00096.3이다. 점 뒤에 이어지는 숫자는 염기서열 업데이트에 따르는 버전 번호이다. 따라서 1997년 Science 논문의 발표와 때를 같이하여 처음 서열이 공개된 후 모두 두 번 개정이 이루어졌다는 뜻이다. 유전체 서열의 변화를 동반하지 않는 주석화 정보의 변화는 이보다 더욱 빈번하게 이루어졌을 것이다. 즉, 연구를 통하여 유전자의 번역 개시 위치를 개정하거나, product 이름이 바뀌거나, pseudo로 처리하거나 등등의 변화는 유전체 염기서열이 고정된 상태에서도 일어날 수 있다.

염기서열 버전에 따른 세 개의 레코드(GenBank flat file)를 받아서 첫 줄을 출력해 보았다. 여기에 표시된 날짜는 각 레코드의 최종 개정일이다. 이것만으로는 예를 들어 U00096.2가 언제 공개되었는지 알기가 어렵다.

$ head -n 1 *gbk
==> U00096.1.gbk <==
LOCUS       U00096               4639221 bp    DNA     circular CON 22-NOV-2002

==> U00096.2.gbk <==
LOCUS       U00096               4639675 bp    DNA     circular BCT 26-FEB-2013

==> U00096.3.gbk <==
LOCUS       U00096               4641652 bp    DNA     circular BCT 24-SEP-2018

유럽 ENA의 U00096.3Show Version History라는 것이 있어서 클릭을 해 보았다. 흠, 이것도 도움이 되지 않는다.

{
  "accession" : "U00096",
  "versions" : [ {
    "accession" : "U00096",
    "sequenceVersion" : 3,
    "firstPublic" : "23-FEB-2006",
    "lastUpdated" : "25-SEP-2018",
    "text" : "https://www.ebi.ac.uk/ena/browser/api/embl/U00096.3",
    "fasta" : "https://www.ebi.ac.uk/ena/browser/api/fasta/U00096.3",
    "status" : "public"
  }, {
    "accession" : "U00096",
    "sequenceVersion" : 2,
    "firstPublic" : "23-FEB-2006",
    "lastUpdated" : "04-SEP-2011",
    "text" : "https://www.ebi.ac.uk/ena/browser/api/embl/U00096.2",
    "fasta" : "https://www.ebi.ac.uk/ena/browser/api/fasta/U00096.2",
    "status" : "suppressed"
  }, {
    "accession" : "U00096",
    "sequenceVersion" : 1,
    "firstPublic" : "18-JUL-2002",
    "lastUpdated" : "24-JUL-2003",
    "text" : "https://www.ebi.ac.uk/ena/browser/api/embl/U00096.1",
    "status" : "suppressed"
  } ]
}

도대체 어디에 가야 release history가 보일까? 아! 등잔밑이 어두웠다. U00096.1 flat file의 COMMENT 항목에 이런 글이 있다. v2가 나왔다는 것을 v1에 기록해 두다니 이렇게 친절할 수가!
[WARNING] On Jun 21, 2004 this sequence was replaced by U00096.2.
그러면 U00096.2의 COMMENT에도 이와 동등한 언급이 있을 것으로 기대하고 파일을 열어보았다. 맞다. 여기에 아주 잘 기록되어 있었다.
[WARNING] On Sep 26, 2013 this sequence was replaced by U00096.3.
U00096.2에서 U00096.3으로 유전체 염기서열이 변하게 된 것에 대해서는 2017년에 출간된 논문 The EcoCyc database: reflecting new knowledge about Escherichia coli K-12(Nucleic Acids Research 45: D543-550)에서 친절하게 설명하였다. 해당 부분을 번역해 보았다.
GenBank 레코드가 U00096.2에서 U00096.3으로 바뀐 것은  이전 버전(.2)이 MG1655 균주의 특정 isolate에 정확하게 대응하지 않았기 떄문이다. 시퀀싱된 것으로 알려진 MG1655의 기탁균주(ATCC 700926와 CGSC7740)와도 서열이 달랐고, stock center에 각각 보관된 균주의 차이에 대한 보고도 있었다. 가장 중요한 것은 가장 최근에 시퀀싱된 균주는 전사조절인자를 암호화하는 crlglpR, 그리고 갈락티톨 수송단백질을 암호화화는 gatC에 돌연변이가 존재한다는 것이다. 그 원인은 IS 삽입과 기타 indel에 의한다.
U00096.3 레코드를 확인해 보자. crl(b0240)은 IS1I의 삽입에 의해 무력화되어 pseudo 처리되었고, glpR(b3423)와 gatC(b2092)도 pseudo qualifier를 달고 있다. EcoWiki에 이에 대한 설명이 나온다. 이거야 원, 보통 헷갈리는 것이 아니다.

오늘 다운로드한 U00096.3.gbk 파일의 앞부분에 붙어있는 reference를 정리하여 보았다. 총 18개의 항목 중에서 실제 출판된 논문에 해당하는 것은 3개이다. 다들 역사적으로 중요한 논문임은 말할 나위도 없다. 저자들 중에는 EcoGene database의 창시자 Monica Riley(1926-2013)처럼 이미 세상을 떠난 분도 계시다. 바로 위에서 언급한 2017년도 EcoCyc database 논문과 2001년에 Monica Riley 등이 발표한 A functional update of the Escherichia coli K-12 genome(Genome Biol. 2(9): research0035.1–research0035.7 PMID: 11574054) 도 중요하기는 마찬가지이다.

  1. Blattner FR, Plunkett G 3rd, Bloch CA, Perna NT, Burland V, Riley M, Collado-Vides J, Glasner JD, Rode CK, Mayhew GF, Gregor J, Davis NW, Kirkpatrick HA, Goeden MA, Rose DJ, Mau B, Shao Y. The complete genome sequence of Escherichia coli K-12. Science. 1997 Sep 5;277(5331):1453-62. PubMed PMID: 9278503.
  2. Hayashi K, Morooka N, Yamamoto Y, Fujita K, Isono K, Choi S, Ohtsubo E, Baba T, Wanner BL, Mori H, Horiuchi T. Highly accurate genome sequences of Escherichia coli K-12 strains MG1655 and W3110. Mol Syst Biol. 2006;2:2006.0007. Epub 2006 Feb 21. PubMed PMID: 16738553; PubMed Central PMCID: PMC1681481.
  3. Riley M, Abe T, Arnaud MB, Berlyn MK, Blattner FR, Chaudhuri RR, Glasner JD, Horiuchi T, Keseler IM, Kosuge T, Mori H, Perna NT, Plunkett G 3rd, Rudd KE, Serres MH, Thomas GH, Thomson NR, Wishart D, Wanner BL. Escherichia coli K-12: a cooperatively developed annotation snapshot--2005. Nucleic Acids Res. 2006 Jan 5;34(1):1-9. Print 2006. PubMed PMID: 16397293; PubMed Central PMCID: PMC1325200.

대장균 K-12 substrain MG1655가 사람의 장을 떠난 것이 언제일까? 인공적으로 제공된 '편안한' 실험실 배양환경에 맞추어 domestication이 되어서 야생의 성질을 많이 잃었을 것이다. 이에 관련한 논문도 적지 않을 것이다. 예를 들자면 'Natural Escherichia coli isolates rapidly acquire genetic changes upon laboratory domestication (Microbiology 2017)'와 같은 논문 말이다. 대장균은 어쩌면 어둡고 따뜻하며 냄새나던 사람의 큰창자 속을 그리워할지도 모른다. 큰창자, 작은창자... 갑자기 정겹게 느껴지는 토박이말이다. 골, 염통, 콩팥, 살갗... 이런 표현을 왜 점차 덜 쓰게 되는지 모르겠다.

2020년 5월 11일 월요일

요즘 대학 신입생의 코딩 교육

딸아이가 올해 모 대학의 조형대학에 입학하였다. 코로나-19 사태로 개강도 늦어지고 그나마 대면수업도 아닌 온라인으로 수업을 듣는다. 그 학교는 예술대학 소속의 미술학부가 있고, 별도로 조형대학(영어로 "College of Design"으로 지칭함)이 존재한다. 순수 미대와는 달리 공학적 감각을 배양함이 필요할 것이다.

그래서인지 1학년 1학이에 코딩 수업을 필수로 받는 것 같다. 노트북 컴퓨터를 펼쳐놓고 강의를 들으면서 Jupyuter가 어쩌고, NumPy가 어쩌고 종알대면 또각또각 키보드를 두드린다.

"파이썬? 그러면 anaconda도 알겠네?"
"응"

맨날 그림만 그리던 아이가 코딩 공부를 하는 것을 보니 신기하고 기특하기도 하다. 요즘은 초등학교에서도 코딩 교육 열풍이라지만, 우리 아이들은 그런 것을 따로 배우지 않고 철저히 타고난 문과생으로 자라났다.

내가 대학교 1학년 때에는 전산언어가 필수 교과목이었다. 자연과학부에 속했던 내가 택했던 것은 포트란(Fortran)이었고, 다른 공학계역 친구들은 대부분 C를 택했다. 지금이야 대학생에게는 필수품이 되어버린 노트북 컴퓨터에서 프로그래밍 공부를 할 수 있지만, 당시에는 학교 전산실을 이용해야 했다. '찌지지직~' 라인 프린터는 요란하게 소리를 내며 좌우 가장자리에 구멍이 뚫린 롤 인쇄용지에 글자를 찍어냈다. 너무 시끄러워서 별도의 방음용 케이스에 프린터가 들어있던 기억이 난다.

전산 실습을 위해 접속하여 사용하던 SSM-16이라는 컴퓨터는 아직도 기억이 난다. 내 블로그에도 이와 관하여 두어번 글을 쓴 적이 있다. 그것 말고도 추억을 불러 일으키는 몇 종류의 컴퓨터가 있다. 사촌 처남이 쓰던 PC는 안타깝게도 일찍 세상을 떠나면서 나의 첫번째 컴퓨터가 되었다. 2000년대 초반 벤처기업에 있을 때, 삼성이 라이센스 제조한 Alpha 프로세서가 장착된 서버 보드를 쓴 일도 있다. 초보적인 수준의 클러스터를 만들어 사용했었는데, 하드웨어적으로 뭔가 최적화가 덜 되어서 사용하는데 무척 애를 먹었었다.

파이썬과 R은 요즘 지식인의 필수 도구가 되었나보다. 혹시 딸아이가 한 학기 후에 머신 러닝을 공부한다고 하는 것은 아닐까?

2020년 5월 10일 일요일

6LQ8 싱글 앰프의 출력 트랜스에 케이스 씌우기

1T 스테인리스 스틸 판으로 출력 트랜스 케이스를 만든 것이 아까와서 씌워 보았다. R-코어 트랜스포머는 고정하기가 매우 나쁘다. 아주 예전에 쓰던 셔틀 XPC 베어본 컴퓨터에서 떼어낸 CPU 쿨러용 부속을 고정용 부품으로 재활용하였다. 정확히 말하자면 트랜스를 고정한 것은 아니고 단지 쓰러지지 않게 세웠을 뿐이다. 케이스 역시 고정한 것이 아니라 단지 위에서 씌운 것이다.



전원부 케이스의 중간에 보강 목적으로 자작나무 각목을 잘라 넣었다. 현재의 상태에서 나름대로 계속 진화를 거듭하는 중이다. 근본적인 변혁은 어렵고 단지 local optimum에 불과하다. 

2020년 5월 8일 금요일

awk 한 줄로 eggNOG annotation 파일에서 KO 정보를 빼내어 정리하기(pathway reconstruction 용도)

KEGG 데이터베이스를 FTP에서 다운로드하려면 유료 구독을 해야 하는 것으로 꽤 오래 전에 바뀌었다. 웹사이트 정보에 의하면 개인 사용은 1년에 2천 달러, 기관 사용(다중 사용자)은 5천 달러이다. 부담이 되지 않을 수 없다. 그나마 다행스러운 것은, 웹사이트를 이용한 KEGG 활용은 계속 무료라는 점이다.

NCBI 웹사이트 이용도 언젠가는 유료로 전환될까? 허, 생각만 해도 끔찍하다.

KEGG 웹사이트에 제공하는 여러 서비스 중에서 KEGG Mapper는 직관적인 시각화 정보를 제공하기에 매우 유용하다. 유전체 주석화가 끝난 뒤, 각 유전자에 부가된 KO 정보를 KEGG Mapper - Reconstruction Pathway에 입력하면 된다. 입력할 정보(gene list)의 샘플은 여기를 클릭하면 나온다. 유전자 ID와 KO 번호의 두 컬럼으로 이루어진 모습이다. 만약 하나의 유전자가 여러 KO 번호를 갖는다면 여러 줄로 나누어서 입력하면 되는 것으로 알고 있다.

이런 목적으로 사용할 KO annotation 정보를 어디에서 얻을까? 최소한도의 데이터베이스를 사용하는 Prokka에서는 불가능하고, 최소한 Blast2GO를 쓰거나 eggNOG mapper를 써야 한다. Blast2GO는 자체적인 KEGG Pathway Map 생성 기능이 있다. InterPro 검색을 통해서 EC 번호를 먼저 구하고, 이를 기반으로 KEGG Pathway에 매핑을 하는 것이다. 그러나 무료 버전인 Blast2GO Basic에서는 검색 작업에 너무 시간이 많이 걸린다. 따라서 eggNOG mapper를 사용하는 것이 가장 현실적이다. 로컬 서버에서 상식적인 시간에 작업이 끝나기 때문이다.

eggNOG mapper(v2) 검색을 통해 만들어지는 .annotations 파일에서 아홉번째 컬럼이 KEGG KO 정보에 해당한다. 실제 사례는 다음과 같다. 한 라인이 하나의 유전자에 해당한다.

ko:K02796,ko:K19509
ko:K02795,ko:K02796
ko:K00001,ko:K00005,ko:K08317
ko:K00096

하나의 유전자가 복수의 KO 번호를 갖는 경우, 이를 분리하여 유전자 ID와 함께 다음 줄에 인쇄되도록 하고 싶다면 어떻게 하면 좋을까? 예전에는 무조건 vim을 열고 Perl 코드를 짜는 것으로 문제를 해결했었는데, 요즘은 awk나 기타 유틸리티를 bash에서 직접 짜는 것으로 점점 게을러지고 있다. 자, 그러면 꼼수의 나래를 펼쳐보자. 정답(이라고 믿는 것)은 다음의 한 줄이다. 실수는 없었을 것으로 기대한다.


$ awk -F"\t" -vOFS="\t" '$9~/^ko:/{id = "\n"$1"\t"; sub("ko:","",$9); gsub(",ko:",id,$9); print $1, $9}' eggNOG.emapper.annotations

줄괄호 안에서 세미콜론으로 구분되는 awk 명령어 네 도막이 전부이다. $9~/^ko:/는 설명할 필요가 없으니 중괄호 안으로 들어가서 설명을 하겠다.

  1.  id = "\n"$1"\t" - id라는 변수를 하나 만들어서 줄바꿈 + 유전자 ID + 탭으로 내용을 채운다.
  2. sub("ko:","",$9) - 첫번째 나타나는 KO 번호에서 ko:를 제거한다. 
  3. gsub(",ko:",id,$9) - gsub() 함수는 모든 매치에 대해서 치환을 실시한다. 첫번째 ko:는 이미 윗단계에서 처리되었고 나머지 것들(콤마를 포함 ",ko:") 전체는 id 변수에 들어간 값으로 치환된다. 
  4. print $1, $9 - 결과를 프린트한다. $9가 어떻게 변했는지 생각해 보자. 첫번째 KO는 그 모습을 유지하고 있지만, 나머지는 줄바꿈과 유전자 ID를 앞에 붙인 형태가 되어 새 줄에 인쇄된다.
출력물을 만들어서 원본과 대조를 해 보니 실수는 없는 것으로 판단된다. 실제 유산균 유전체 하나의 eggNOG mapper 결과를 이 awk 코드로 처리하여 2641개 유전자에 대한 KO 번호를 얻은 다음 KEGG mapper에 업로드해 보았다. Global map에서 central carbohydrate metabolite만 하이라이트하였다.


나이를 먹으면 신체 기능의 퇴화를 막기 위해서 자꾸 뭔가를 놀려야, 즉 작동시켜야 한다. 손가락을 놀리기 위하여 납땜질을 하고, 뇌를 굴리기 위해 간단한 one-liner를 계속 만들어 블로그에 소개하는 것이 나의 실천 방안이 되겠다.

2020년 5월 7일 목요일

6LQ8 앰프의 전원 커넥터 교체 작업

예상보다 하루 빠르게 원형 방수 4핀 커넥터가 배송되었다. 체결력, 신뢰성 모두 이전의 것에 비할 바가 아니다. 두 대의 앰프와 한 대의 전원장치.. 만약 케이블이 붙어있지 않은 것을 구매했더라면 여간 번거로운 일이 아니었을 것이다.

전원을 넣은 채로 부품을 건드리다가 뜨거워진 6LQ8(싱글)가 엄지손가락 바깥쪽에 살짝 닿았는데 가벼운 화상을 입었다. 진공관 앰프를 만들면서 감전부터 찰과상에 이르는 가벼운 상처를 많이 입었는데 진공관에 데어보기는 처음이다...




두 대의 6LQ8 앰프. 위는 싱글, 아래는 푸시풀.

같은 진공관으로 만들어진 푸시풀과 싱글 앰프를 비교 청취한 결과 내 취향에는 푸시풀이 압도적으로 나은 것 같다. SPL이 같은 스피커를 사용했으니 공정한 비교는 아니겠지만, 여러모로 푸시풀이 더 낫다고 느껴진다. 완벽하게 동일한 음량으로 비교를 한다면 다른 결론이 날지도 모르는 일이다.

구하기 쉬운 50VA급의 절연트랜스(220V:220V)와 MOSFET 기반 리플 제거 회로를 사용하여 모듈화·경량화된 전원부를 구성하고, 이를 사용하여 SE 및 PP 두 종류의 6LQ8 앰프를 구동하게 만든 것이 최근 제작의 의미라 하겠다.

싱글 앰프의 케이스 마련 작업은 나중에 생각하자! 차분하게 음악이나 들으면서 좀 쉴 때가 되었다. 몇 장의 사진을 더 찍어 보았다. 언젠가 케이스를 새로 만들게 되면 사라질 모습이니까.








6LQ8 싱글 앰프 마무리하기(전압 조정, NFB 연결 등)

몇 개의 5W 시멘트 저항을 직렬로 연결하여 B전압을 204V 정도로 맞추었다. 회로 개발자가 권장한 전압은 207V이다. 470R, 220R, 220R이 쓰였다. 전압 강하용 저항 양단의 전압을 측정하여 이를 총 저항값으로 나누면 회로에 흐르는 총 전류의 값을 계산할 수 있다. 양 채널이 동시에 작동함에도 불구하고 흐르는 전류는 51mA 정도이다. 이만하면 50VA급 전원트랜스(아세아전원, 220V:220V 링크)에 전혀 무리가 갈 수준은 아니다. 같은 전원회로를 6LQ8 푸시풀 앰프에 연결할 때에는 전압강하용 저항을 전원회로 끝부분에 쓰지 않아도 200V를 맞추지 못했었다.




NFB도 연결하고, 가변저항 본체에도 접지선을 연결하여 잡음을 대폭 줄였다. 남은 것은 부실한 전원부 커넥터를 교체하는 것이다. 손으로 건드리기만 해도 접촉이 끊어질 정도이고, 커넥터를 손으로 만져보면 따뜻함이 느껴지는 것으로 보아서 접촉 저항도 높은 것 같다. 새로 구입한 원형 커넥터는 내일 도착할 것이다.

NFB 연결 전에는 소리가 크고 매우 거친 느낌이었다. 연결을 하고나니 소리는 작아지지만 훨씬 깨끗한 소리가 난다. 이래서 피드백을 거는구나!

케이스에는 아직 별다른 생각이 없다. 1분기에 CAD를 공부하여 상판을 설계하는데 너무 정력을 소모해서 그런지 이 싱글 앰프는 나무판 위에 그냥 노출된 상태로 쓸 생각도 갖고 있다. 필요하다면 진공관쪽만 구멍을 뚫은 아크릴판으로 가려도 된다.

6LQ8 진공관은 8개가 남았다. PP 및 SE 앰프를 하나씩 쓰면서 앞으로의 교체 수요를 생각하면 이것으로 충분하다. 하반기 자작 계획은? 어휴, 지금까지 너무 진도를 많이 나가서 간간이 튜닝이나 하면서 보내련다.

2020년 5월 5일 화요일

6LQ8 싱글 앰프 소리내기

43 싱글, 6LQ8 푸시풀에 이어 이번에는 6LQ8 싱글 앰프에 도전하였다. 부품 하나를 늦게 구하는 바람에 PCB 납땜을 완전히 마치는데 시간이 좀 걸렸다. 황금 연휴를 맞아서 대전 집에서 소리를 내 보려고 노력했으나 실패로 끝났다. 스피커에서는 아무런 소리도 나지 않고, 저항 두 개가 불꽃과 함께 완전히 타 버리는 일도 겪었다. 얼마나 낙담을 했는지 모른다.

연휴를 마치고 분당 숙소로 돌아와서 다시 소리내기에 도전하였다. 입력단에 아무것도 연결을 하지 않고 전원을 넣은 것이 문제였을까? PCB의 입력부 커넥터도 연결을 하지 않아서 초단 그리드는 완전히 플로팅 상태였다. 소스를 연결하지 않은 것과는 차원이 다른 문제이다. 가변저항도 연결을 하지 않았기 때문이다.

그리드 리크 저항을 너무 높게 하면 진공관의 열폭주가 일어난다고 하였다(링크). 그러면 완전 개방 상태, 즉 무한대라면? 나도 잘 모르겠다.

입력부의 배선 작업을 완벽하게 한 뒤 전원을 넣고 소스를 연결하였다. 오오... 소리가 난다! 소리는 생각보다 꽤 크다. 약간 섬세하지 못한 느낌이 있는데, 아마도 NFB를 아직 걸지 않은 상태라서 그런지도 모른다. 출력 트랜스포머는 R코어를 이용하여 직접 만든 것이다. Hiram Bullock의 연주 동영상을 재생하면서 휴대폰으로 녹음을 해 보았다(유튜브 링크).




나무상자 뚜껑에 임시로 고정을 하였다.




권장 전압은 207V인데 한 시간 정도 음악을 들은 뒤 측정하니 219~220V가 나온다. 6LQ8 PP 앰프에 쓰던 전원장치를 그대로 연결한 것이라서 전압이 높을 것으로 생각하고 300옴 저항을 연결한 상태에서 이런 값이 나오니 저항값을 좀 더 높여야 되겠다. 전해 캐패시터의 내압이 250V라서 B전원을 이대로 두는 것은 바람직하지 않다.

300옴 저항 양단의 전압 강하는 16.1V이다. 단순 계산으로 전류는 53.7mA이다. 전력 소모는 그렇게 높지 않다.

외장형 전원장치를 연결하는 커넥터의 품질이 너무 좋지 않아서 조만간 교체를 해야 한다. IDE 4핀 전원 커넥터 케이블을 즐겨 사용했었는데 너부 뻑뻑하여 탈착이 어렵다. 다음 사진과 같은 커넥터를 쓰는 것을 심각하게 고려하는 중이다. 200V(0.1A 미만)를 견디는 데에는 문제가 없다. 디바이스마트에서는 좀 더 좋은 품질의 커넥터붙이 케이블을 판매하지만 가격이 비싸다(SCK1204PSCN1204R)

4핀 방수 커넥터. 출처: 옥션(링크)

진공관 앰프 DIY에 관해서는 상반기에 너무 진도를 많이 나갔다. 하반기에는 MOSFET을 이용한 리플 제거 회로를 직접 만들어 보는 것이 목표이다. 이는 정확히 말하자면 트랜지스터를 이용한 capacitance multiplier이다. 우리말로는 무엇이라고 할까? 정전용량 체배기? 놀랍게도 capacitance multiplier를 진지하게 설명한 국문 자료는 보이지 않는다. 단지 리플 제거 회로로만 소개할 뿐이다.