2020년 2월 27일 목요일

(주)벨톤연구소의 진공관 소켓

국내 전자부품 제조업체인 (주)벨톤연구소에서 9핀 진공관 소켓을 몇 개 구입해 보았다. 진공관을 끼울 때 상당히 뻑뻑하게 맞는다는 말은 들었지만 설마 끼우다가 진공관 유리가 깨지기야 하겠는가? 품질은 좋고, 가격은 싸다.

왼쪽은 바텀 마운트, 왼쪽은 탑 마운트.


이것은 기판용 제품이다. 갖고 있는 6LQ8 싱글 앰프 보드에 꽂아 보았다.

43 오극관 싱글 앰프를 리모델링하기 위한 부품이 거의 다 모였다. 주말에는 LibreCAD로 설계한 상판을 종이에 인쇄하여 대전 집에 가지고 가서 트랜스포머의 고정용 구멍이 잘 맞는지 확인한 다음 다음주 중에 가공을 의뢰할 예정이다. 그리고 가능하다면 나무로 된 틀을 주말에 조립하고 오일 스테인까지 발라서 마무리를 하고 싶다. 오일 스테인은 오늘 주문했으니 내일 받을 수 있을 것이다.

알루미늄 상판의 가공을 전문가에게 맡기게 되니 직접 구멍을 뚫을 일이 없다. 나무틀에 스피커 연결용 바인딩 포스트를 고정할 구멍을 뚫는 것 정도가 전부이다.

필요한 모든 물품을 인터넷으로 편리하게 주문하면서도 물건을 전달하는 사람의 수고와 포장재 처리에 약간의 죄책감을 느꼈다. 이번주에만 총 다섯 차례였고 꽤 많은 쓰레기가 나왔다. 본격적인 납땜 작업에 들어가면 아마도 필요한 저항이나 캐패시터가 더 나올지도 모른다. 그러면 엘레파츠/디바이스마트/IC114에서 몰아서 구입하면 된다. 기왕이면 6LQ8 싱글 앰프 PCB에 올라갈 부품도 포함해서 구입하자.

앗차, 고무발도 사야 되는데...

2020년 2월 25일 화요일

[2020년도 43 5극관 싱글앰프 리모델링] 4. 부품이 들어오기 시작하다

2020년 2월 24일(어제)부터 온라인으로 부품 구입을 시작하였다. 구입한 물건이 입수되는 순서대로 기록을 남긴다.

전원 스위치(2월 25일)


250V 6A(AC) 정격의 스위치. 국산품이라서 가격은 조금 비싸다.

  • 구입처: 인트레이드(링크)
  • 품목명: 2P2단 원형 스위치(5020번), 3P2단 원형램프 스위치(5021번, 5021-1번)

평철 등(2월 26일)



  • 구입처: 아이베란다(링크)

나무 상자(2월 26일)




  • 구입처: 미가데코(링크)
  • 크기: 300 x 200 x 60 mm (나무 두께는 12 mm)

가조립 상태. 목재라서 최소한의 마감 처리가 필요한데 이에 대해서 별로 아는 바가 없다. 사포로 가볍게 문지른 다음 다이소에서 소량으로 판매한다는 수성 바니쉬나 두어번 발라 주면 될 것이다. 보강용 각재는 제품 구성에는 들어있지 않다. 일부러 따로 주문한 것이다(위에서 두번째 사진 참조).


진공관 소켓(2월 27일)


몇개 되지도 않는 부품을 주문하였는데 지나칠 정도로 꼼꼼하게 포장이 되었다. 내가 다 미안할 지경이다. 패널 탑마운트용과 바텀마운트용 각 2개, 그리고 PCB용을 2개 구입하였다.

벨톤 소켓의 품질은 매우 우수해 보인다.

이것은 퓨즈를 내부에 넣을 수 있는 AC 파워 소켓이다. 패널에 뚫어야 하는 구멍은 작지만 퓨즈가 내부에 들어가므로 길다!

  • 구입처: 벨톤연구소(링크)
  • 크기: 300 x 200 x 60 mm (나무 두께는 12 mm)

오일 스테인

Fastq 파일로부터 read의 번호를 이용하여 일부분을 취하는 방법 - 또 Pierre Lindenbaum에게 빚을 지다

Fastq 파일로부터 2번, 4번, 100번째 read를 추려낸 subset을 만들고 싶다. 어떻게 하면 될까? 추출할 read의 이름이 목록으로 존재한다면 BBMap package의 filterbyname.sh을 쓰면 된다. SEQanswers의 소개 페이지에서 Filterbyname.sh에 대한 설명을 찾아보라. JGI의 프로그램 소개에서는 오히려 이 기능을 찾기가 어렵다.

잠깐, BBMap인가 혹은 BBTools인가? 나도 헷갈린다.

추출해야 할 read가 1로부터 시작하는 번호의 목록으로 주어진다면 다른 방법을 써야 한다. PhyloSift에서는 시퀀싱 리드로부터 marker gene profile에 붙는 일부분만을 떼어내서 quality가 제거된 fasta 파일만을 제공한다. 나는 원본 파일로부터 fastq read의 부분집합을 떼어내고 싶었다. PhyloSift 결과물에서는 원래의 read ID가 사라지고 일련번호가 붙는다.

스크립트를 새로 짜려고 생각했다가 '바퀴를 다시 발명하지 말라'는 금언을 떠올렸다. 누군가 멋진 방법을 이미 구현해 놓았을 것이 뻔하기 때문이다. 약간의 검색 끝에 또다시 Biostars에서 Pierre Lindenbaum의 아주 짧은 스크립트를 발견하였다. 리눅스의 기본 유틸리티를 기가 막히게 조합한 것이다. 약 세 달밖에 되지 않은 신선한(?) 질문과 대답이었다.

Question: Subset Fastq file from list of read numbers

스크립트는 매우 간단하다. 사실상 one-liner이다.

$ join -t $'\t' -1 1 -2 1 \
   <(gunzip -c input.fq.gz | paste - - - - | awk '{printf("%d\t%s\n",NR,$0);}' | sort -T . -t $'\t' -k1,1 ) \
   <(sort -T . numbers.txt) | \
sort -t $'\t' -k1,1n |\
cut -f 2- |\
tr "\t" "\n" > subset.fastq

이것을 그대로 복사한 다음 input.fq와 numbers.txt 및 subset.fastq를 사용자가 원하는대로 고쳐서 명령행에 붙여넣고 엔터를 치면 그대로 실행이 된다. 단, 스크립트 파일에 내용을 복사해 넣은 뒤 실행하면 안된다. 아마도 process substitution의 복잡한 사정 때문에 그러한 것으로 보인다. join의 두 인수에 해당하는 process substitution을 임시 파일로 대체하도록 스크립트를 만들어서 파일로 저장한 다음, 이를 실행하면 잘 돌아감을 확인하였고 실무에도 아주 유용하게 사용하였다. Thanks, Pierre!

paste와 awk의 신비한 결합에 대해서는 아무리 공부해도 부족하지가 않다. join 명령어도 마찬가지이다. 샘플 파일을 만든 뒤 파이프 기호('|')를 제거한 다음 어떤 출력물이 나오는지를 살펴본다면, 이 명령행이 어떻게 돌아가는지를 알게 될 것이다. Fastq 파일을 분해하여 한 read에 해당하는 네 줄을 한 줄로 표현하고(탭으로 구분), 여기에 다시 숫자를 붙이고, 숫자를 기준으로 정렬하고, 그리고 번호를 참조하여 서로 매칭이 되는 것을 join 명령어로 뽑아내고, 다시 new line 문자를 넣어서 fastq 파일 형태로 환원하고... 정말로 배울 것이 그득한 명령행이다. 오늘도 이렇게 Pierre Lindenbaum에게 한 수를 배웠다. 어쩌면 그는 내 블로그에서 가장 많이 언급하는 인물이 될지도 모르겠다.

awk를 이용한 join, 그리고 join 명령어(join lines of two files on a common field) 자체의 활용은 정말 요긴하게 쓸 수 있는 것이라서 사용법을 잘 익혀두면 파이썬이나 펄로 직접 코딩을 하는 수고를 덜 수 있다.

특별히 이 활용례에서 눈여겨보아야 할 것은 탭문자를 명령어의 인수로 제대로 제시하기 위해 $'\t'라고 표시하는 트릭이다. 이에 대해서는 예전에 블로그에 기록한 일이 있다(Bash에서 탭을 표현하기 어려운 경우의 해결 방법).

2020년 2월 23일 일요일

LibreCAD로 앰프 상판 디자인하기

인터넷에서 문서 및 동영상으로 된 설명서를 보면서 더듬더듬 익힌 솜씨로 주말에 대전 집에 머무는 동안 43 오극관 앰프의 상판 디자인을 시작하였다. 보조선을 그어서 어느 정도는 원하는 치수의 원이나 선분을 그을 수는 있었는데 이들의 거리를 맞추는 요령은 아직 제대로 익히지를 못하였다. 'Snap'의 오묘함은 이루 말할 수가 없다(설명 페이지). 내가 이해하는 snapping이란 새로운 개체를 만들거나 이동할 때 drawing area의 어느 위치를 기준으로 할 것인지를 결정하는 행위이다. 기준점은 그리드일 수도 있고, 이미 그려져 있는 다른 개체일 수도 있다.

다음은 주말에 그렸던 초기 작업본의 화면이다. 너무나 불완전하여 일요일 밤에 전부 다시 그리기는 했지만.


트랜스포머는 도면이 없어서 직접 치수를 재서 얼추 도면을 그렸는데, 분당 숙소에 돌아와서 확인을 하니 치수를 적어놓은 수첩을 가져오지 않은데다가 도면상에서 측정한 치수와 내가 기억하는 숫자가 다르다! 이런, 낭패다. 아들에게 전화를 걸어서 침대 위에 펼처놓고 온 수첩을 사진으로 찍어서 보내라고 부탁을 하였다. 사진을 토대로 다시 도면을 그렸다. 이번에는 작업 속도도 현저히 빨라졌고 위치와 크기 결정도 제대로 되었다.

주말 작업이 완전히 무위로 돌아간 것은 아니다. 상판에 구멍을 뚫고 고정할 AC 소켓과 전원 스위치를 선정하고 가공을 위한 수치를 확인해 두었기 때문이다. 월요일부터는 필요한 나머지 부품을 주문하는 일만 남았다.

2020년 2월 21일 금요일

중학교의 제도(製圖) 교육

네이버 국어사전에서 '제도'라는 낱말의 뜻을 찾아보았다.

  1. 제도(制度): 관습이나 도덕, 법률 따위의 규범이나 사회 구조
  2. 제도(製圖): 기계, 건축물, 공작물 따위의 도면이나 도안을 그림
오늘 글감으로 삼은 것은 두번째의 제도이다. LibreCAD를 익히면서, 중학교 기술 시간에 제도를 배웠던 것이 생각이 났다. 남학생은 모두가 제도기를 구입하여 도면을 그리는 실습을 했었다. 중학생 수준에 맞는 제도기라는 것이 결코 고급 제품은 아니었지만 80년대 초반에 중학교를 다닌 나에게는 가장 비싸게 구입해야 했던 '문구'가 아니었을까 한다. 컴퍼스, 디바이더, 먹줄펜 등으로 구성된 도구 일습이 파랑색 완충재가 채워진 납작한 케이스 안에 단정하게 갖추어진... 로트링이라는 브랜드를 알게 된 것도 이때였다. 지금 구글에서 '제도기'를 검색하면 과거에 제도판이라 불리던 것에 다리와 각도 조절 장치가 달린 물건의 이미지가 나온다. 

제도기. 구글에서 이미지 찾기 어려웠다. 출처는 경남교수학습지원센터(링크).
'제1각법', '제2각법'이라는 용어도 어렴풋하게 기억이 난다. 컴퓨터로 모든 것을 디자인하고 심지어 3D 프린터로 물건을 찍어내는 시대가 되어서 더 이상 손으로 뭔가를 설계하는 일은 거의 하지 않게 되었고 중등 교육에서도 다루지 않게 되었을 것이다. 그래도 도면을 그리는 일의 기본에 대해서는 기억을 되새겨야 할 것 같다. 예를 들어서 선의 모양과 굵기는 어떻게 선택하는지 등등.

LibreCAD의 실습 자료를 보면 모든 용어가 영문으로 되어 있다. 각각에 해당하는 국문 용어도 있을 것 같은데 일부러 찾기가 어렵다. 예를 들어 construction line은 뭐라고 할 것인가?

어제는 트리밍의 신비한 기능을 공부하였다. 교차하는 곳을 기준으로 어떤 선을 자르는 것뿐만이 아니라 그리다 만 선을 연장하는 기능까지 있다는 것이 놀라웠다. 또한 적절한 'snap' 방법을 빨리 찾아서 적용하는 것이 초보자에게 가장 중요한 일이라고 생각한다.

나의 취미생활이 엉뚱한 길로 계속 흘러들어서 CAD까지 익히게 되었는지 알 수는 없지만 좀 더 빨리 이 세계에 입문하지 못한 것이 너무나 안타깝다. 

2020년 2월 20일 목요일

특정 문자를 구분자로 하는 문자열의 효과적인 조작 방법

일루미나 시퀀싱 장비에서 생산된 raw fastq file은 밑줄 문자('_', underscore)를 구분자로 하여 몇 개의 필드가 연결된 이름이 붙는다. 여기에서 꼭 필요한 필드만을 취하여 보다 간결하고 읽기 쉬운 파일명으로 고치려면 어떻게 하면 좋을까? 다음의 간단한 사례를 보자.

$ VAR=1_2_3_4_5
$ echo $VAR
1_2_3_4_5
$ echo $(cut -d_ -f1,3,5 <<<$VAR)  #1번 방식
1_3_5
$ echo $(cut -d_ -f1,3,5 <(echo $VAR)) #2번 방식
1_3_5

1번이나 2번 방식 전부 결과는 같다. 2번 방식(process substitution)은 비교적 최근에 알게 되었다(링크). 이를 활용하면 반복문을 통해서 현재 디렉토리에 있는 fastq 파일의 이름을 일괄적으로 바꿀 수 있다. 다음은 실제 사례이다. 밑줄 문자를 경계로 하여 첫번째 필드와 네번째 필드(R1 or R2)만이 최종 파일 이름에 남는다.

$ ls *fastq.gz | while read f
> do
> mv $f $(cut -d_ -f1,4 <<<$f | sed 's/_R/_/').fastq.gz
> done

그러면 이를 조금 더 응용해 보자. 여러 미생물의 시퀀싱 샘플에 대하여 SPAdes 조립을 실시하여 현 위치에 각 샘플에 대한 spades 결과 디렉토리를 여러 개 갖고 있다고 가정하자. 각각의 하위에는 scaffolds.fasta라는 동일한 이름의 결과 파일이 존재한다. 후속 분석을 위하여 이를 꺼내어 한데 모으되, 파일 명에 샘플 이름이 반영되게 바꾸고 싶다면 어떻게 하면 좋을까? 어쩌면 예전에 블로그에 이미 그 해결 방안을 작성해 주었을지도 모른다. 중복이 될지도 모르겠지만 지금 작성하는 해결법이 더 '성숙한 방법'이라고 믿고 싶다.

원본 파일의 일반 명칭이 spades_sample1/scaffolds.fasta라고 가정하자. 이를 현 디렉토리에 spades_sample1_scaffolds.fasta라고 이름을 바꾸어 복사하려면 다음 스크립트를 활용하라. SPAdes 결과 디렉토리에는 k-mer의 크기를 달리하여 조립한 서브 디렉토리가 하위에 공존하므로, find를 통한 검색의 깊이(-mindepth 및 -maxdepth 옵션으로 설정)를 잘 조정해야 한다.

$ find spades_* -maxdepth 1 -name scaffolds.fasta | while read f
> do
> cp $f $(sed 's/\//_/' <<<$f)
> done

실용에 문제가 없는 스크립트이다. 좀더 복잡한 규칙으로 파일 명칭을 바꾸려면 do 블록 내 cp 명령어의 두번째 인수에 해당하는 명령어를 적절히 고치면 된다. tr, sed 등 알고 있는 명령어를 조합하고 몇 개의 pipe 처리를 해도 된다.

2020년 2월 18일 화요일

LibreCAD 최초 작품

LibreCAD 튜토리얼을 보면서 A4 용지 템플레이트를 만들어 보았다. 오늘의 실습에서는 활용하지 않았지만 보조선을 그은 다음 snap 기능을 이용하여 텍스트를 중앙에 위치시키는 기법에 감동하였다! 사각형을 그리기 위하여 머릿속으로 2차원 좌표를 빨리 생각해 내는 일을 반복하다 보면 치매 예방에 좋을 것 같다.

A4 용지의 실제 크기(297 x 210 mm)보다 10 mm 작게 그릴 영역을 선정한 뒤 왼쪽 아래 꼭지점을 원점(0,0) 위치에 놓았다. 그리고 왼쪽과 아래의 기준선 바깥방향으로 2 mm 여백을 두고 선을 더 그었다. PDF로 내보내기를 하여 Adobe Acrobat Reader로 확인해 보았다. 그림 영역이 종이의 정중앙에 놓일 것을 기대하였는데 LibreCAD의 원점은 문자 그대로 종이의 물리적 한계에 딱 맞는다. 원래 이렇게들 하는 것인지, 혹은 LibreCAD 안에서 다시 조정을 해야 하는지 잘 모르겠다.


조금만 더 연습을 한다면 진공관 앰프 상판 가공을 맡기기 위한 도면은 충분히 그릴 수 있을 것 같다. Command box를 적극 활용하고 snap 기능을 잘 이해하는 것이 중요하다. 이틀 전까지는 도무지 감이 잡히지 않았던 것을 생각하면 큰 발전을 이루었다!

2020년 2월 25일 업데이트


지금까지 혼자 익힌 LibreCAD의 기능을 총동원하여 전원 스위치를 고정할 구멍의 세부를 그려 보았다. 스위치의 바깥쪽에 튀어나온 돌기가 상판에 잘 들어가도록 구멍의 한 귀퉁이에 턱(?)을 만든 것이 오늘 수정한 도면의 핵심이다.

마젠타색 기준선은 construction layer에서 그리는 것이 더욱 바람직할 것이다. Construction layer에서 그린 선은 기본적으로 길이가 제한되지 않고, 프린트 화면에서는 보이지 않는다고 한다.