2020년 10월 20일 화요일

Perl script와 같은 위치에 있는 모듈을 쓰고 싶다면

세균 유전체 염기서열에 삽입된 박테리오파지의 유전체, 즉 prophage의 서열을 찾고자 할 때 종종 PHASTER 서버를 사용하였다. 매우 잘 만들어진 웹서버이지만 너무 자주 유지보수를 위해 서비스를 중단하는 일이 많다. 왜 이렇게 자주 휴업 중이란 말인가...


다른 분석용 웹 서버, 또는 단독으로 실행되는 프로그램이 없을지 검색을 해 보았다. 2009년에 PLoS One에 실린 ProphET라는 프로그램이 눈에 뜨였다(GitHub 링크). 단독 설치하여 실행이 가능하고 phage genome database를 스스로 업데이트할 수 있다는 점이 마음에 들었다. BioConda 채널에서 제공하는 conda package로 설치하는 것이 아니라 몇 개의 외부 프로그램과 Perl module을 설치한 뒤 소스를 git로 클로닝하여 INSTALL.pl로 설치하는 매우 고전적인 방법을 사용하고 있었다. Perl module 설치를 위해 conda를 사용할지, 'perl -MCPAN -e shell'을 사용할지, 혹은 더 간단하게 cpan을 사용할지 잠시 고민을 하였다. 아, 그러고보니 요즘은 cpanm도 있구나.

여담이지만 요즘 conda로 뭔가를 설치하려면 시간이 점점 많이 걸린다. 심지어 conda 프로그램 자체는 몇달째 업데이트가 안된다. 'conda update -n base conda'를 실행하면 하루 종일 다음과 같은 상태에서 뱅글뱅들 돌기만 한다.

$ conda update -n base conda
Collecting package metadata (repodata.json): done
Solving environment: -

설치를 마치고 프로그램에 포함된 샘플 파일을 이용하여 분석을 해 보았다. 입력물은 염기서열(FASTA)과 GFF 파일이 필요하다. 샘플 파일은 결과가 잘 나왔는데, 내가 준비한 파일은 되는 것도 있고 에러가 발생하는 것도 있었다. GenBank 파일을 받아서 seqret로는 FASTA를, bp_genbank2gff3.pl로는 GFF3 파일을 만들었는데 왜 성패가 갈리는지를 모르겠다. 에서 메시지를 보면 GFF 파일의 양식에서 문제를 일으키는 것 같다. ProphET 사용 설명에 의하면 GFFLib 패키지('Perl library to manipulate GFF files')의 gff_rewrite.pl을 써서 전환하여 사용하면 된다고 한다. GFFLib은 ProphET 셋업 과정에서 설치된다고 하는데 그것은 사실이 아니다.

Git clone 명령을 사용하여 GFFlib을 클로닝하였다. Perl script가 있는 위치에 8개의 Perl module이 있다. Perl script를 열어보면 module의 위치를 지정하는 라인이 보이지 않았다. 이런 상태에서 제대로 실행을 하려면, 스크립트가 있는 위치에서 실행을 해야 된다. 이는 상당히 번거로운 일이다. @INC에는 늘 현 디렉토리('.')가 포함되지만, 다른 위치에서 Perl 스크립트를 실행한다면 모듈을 찾지 못하는 것이 당연하다.

$ /data/apps/GFFLib/gff_rewrite.pl 
Can't locate GFFFile.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /data/apps/GFFLib/gff_rewrite.pl line 13.

Perl script와 module이 전부 /data/apps/GFFLib/에 있다고 가정하자. 다른 위치에서 이를 실행하는 방법을 알아보자.

가장 간단하게는 perl -I/data/apps/GFFLib program.pl이라고 실행하여 Perl 인터프리터를 실행할 때 모듈이 있는 위치를 지정하면 된다. '소문자 엘'이 아니고 '대문자 아이'이니 조심하자.

또는 'export PERL5LIB=/data/apps/GFFLib'를 먼저 실행한 다음에 Perl 스크립트를 실행하면 된다. 이 값은 @INC 배열의 가장 앞에 추가된다. export 명령 없이 'PERL5LIB=/data/apps/GFFLib'라고만 하면 안된다.

마지막으로는 Perl 스크립트의 시작 부분에 다음과 같은 use 명령을 넣는 것이다. 

use FindBin;
use lib "$FindBin::Bin";

'usr lib "/data/apps/GFFLib";'을 삽입해도 당장은 작동하겠지만, 프로그램 설치 디렉토리를 바꾸는 경우 에러를 유발할 것이다.

Perl module의 설치 위치에 대한 지식은 매우 기본적인 것인데 무지한 상태에서는 이와 관련된 에러 메시지에 직면했을 때 신속하게 대처를 하지 못한다. 약간의 공부를 통해서 불필요한 두려움을 제거하는 것이 현명한 일이 아닐까?

[우분투의 사운드와 MIDI] PulseAudio와 친해지기

 우분투가 설치된 노트북 컴퓨터에 두 개의 USB 오디오 장치(Behringer UCA200, Roland SC-D70)을 연결해 놓고 PulseAudion의 기능을 이해하기 위해 노력을 하고 있다. 내장 사운드 카드 하나만을 사용하는 일반적인 상황에서는 PulseAudio의 존재를 잊고 살아도 충분하다. 

PulseAudio의 설정 조절은 pavucontrol(PulseAudio Volumne Control)이라는 GUI tool이 담당한다. 어제 비로소 깨달은 중요한 원칙이 있다. 바로 PulseAudio는 응용 프로그램 수준에서 어떤 입출력 장치를 쓸 것인지를 조절할 수 있고, 바로 직전에 실행했던 구성을 기억하고 있다는 것이다. 이걸 이해한다면, HDMI 케이블로 TV를 연결하여 영화를 본 뒤[넷플릭스], 다시 컴퓨터를 켜고 유튜브를 실행했을 때 왜 여전히 소리가 HDMI 단자로 나가는지 의아하게 생각할 필요가 없다. 물론 HDMI 케이블을 연결했을 때에만 소리가 그쪽으로 나가게 하는 스크립트를 이용할 수도 있다. 

Default sound card를 설정하는 것이 의미가 있을까? 좀 더 정확하게는 입력과 출력을 구분해서 말이다. 수시로 USB 형태의 장비를 착탈하는 상황에서는 별 의미가 없다. 꼭 필요하다면, 'pactl list-source' 또는 'pactl list-sink' 명령에서 출력되는 카드의 이름을 /etc/pulse/default.pa 파일에 기록하면 된다. 편집이 필요한 행은 set-default-source(또는 sink)로 시작하는 줄이다.

Sink(output device)와 source(input device) 역시 PulseAudio에서 사용하는 대단히 중요한 개념이다. 반드시 물리적인 하드웨어와 대응하는 것은 아니다. 

특정 사운드 카드에 대한 구성 모음(configuration set)을 card profile이라 부른다. 이것 역시 중요하다. 

PulseAudio 관련 문서

PulseAudio under the hood 문서는 다분히 기술적인 내용을 많이 담고 있지만 개념을 잡는데 많은 도움을 준다. 이 글은 PulseAudio의 메인테이너인 Tanu Kaskinen의 감수를 받은 것이므로 신뢰할 만하다. 이것과 더불어 PulseAudio의 공식 문서와 Arch Wiki의 PulseAudio 문서라면 고급 사용법까지 익히는데 부족함이 없을 것이다.

2020년 10월 18일 일요일

[우분투의 사운드와 MIDI] 리눅스에서 UCA200 오디오 인터페이스로 유튜브에서 나는 소리를 녹음하려면

요즘은 주로 롤랜드 SC-D70을 외장 사운드카드 대신으로 쓰고 있어서 Behringer U-Control UCA200 오디오 인터페이스를 쓸 일이 거의 없다. 특히 이것을 녹음용 장비로는 진지하게 생각해 본 일이 없다. 이렇게 써 놓으니 내가 마치 '진지하게 음악 작업'을 하는 사람처럼 비춰질지도 모르나 그것은 전혀 사실이 아니다. 그저 리눅스에서 음악 관련 소프트웨어와 장비를 어떻게 다루는 지는 지극히 일반적인 사용자 입장에서 익히려고 하는 것이 전부이다.

UCA200은 입력 신호를 모니터하는 헤드폰 단자를 별도로 제공하지 않는다. 설정을 잘 매만지면 녹음이 되는 소리를 들을 수 있을지도 모른다. PulseAudioJackSink가 답을 줄 수도 있다.

오늘의 테스트는 Jack을 쓰지 않는 상태에서 유튜브에서 재생되는 소리를 Audacity에서 녹음하는 것이다. 두 개(L & R)의 아날로그 입력과 출력 단자가 전부이니 이들을 서로 케이블로 연결하는 우스꽝스러운 모습을 연출해야 한다. 녹음 중에는 무슨 소리가 나는지 알 수가 없다. 그저 Audacity에서 녹음 레벨을 보는 것 말고는.

SC-D70를 이용하여 녹음할 때에는 이럴 필요는 없었다. Jack을 경유하면 좀 더 편리하게 녹음이 가능하고, Jack을 쓰지 않아도 유튜브에서 나는 소리를 녹음할 수 있었다. 아래의 사진은 유튜브 동영상을 audacity에서 녹음하면서 왼쪽와 오른쪽 입력을 출력 단자에 케이블로 차례로 연결하는 상황을 찍은 것이다.


USB 장비는 기본적으로 plug-and-play가 가능하지만, 사운드와 관련한 일을 하려면 깔끔하게 재부팅을 하는 것이 더 나은 것 같이 여겨진다. 오늘은 Jack을 쓰지 않고 ML-20 반주기의 음원보드(SAM9703)을 이용하여 녹음을 해 보았다(MIDI file: fluorish.mid). UCA200을 쓰느라 녹음을 하면서 모니터링을 하지는 못했다. 음량이 다소 작게 녹음이 되어서 Audacity에서 증폭하였다.


Rosegarden에서 정작 녹음을 할 때에는 듣지 못하고, 녹음을 한 트랙을 같은 프로그램 안에서 재생할 때는 들을 수 있다는 것이 넌센스가 아닐까? Audacity에서는 녹음 설정을 건드려서 UCA200으로 녹음을 하면서도 동시에 모니터링이 가능했었다. 

PulseAudio의 사운드 카드 우선 순위는 여전히 알다가도 모르겠다. play 명령으로 mp3 파일을 재생하면서 두 번째의 USB 사운드 카드를 꽂으면 여기에서 소리가 난다. 그렇다면 default sound card가 즉시 바뀌었다는(즉 나중에 꽂은 카드를 우선하도록) 뜻인지? 리눅스에서 여러 사운드 관련 장비를 다루는 일은 여전히 어렵다. 특히 PulseAudio가 돌아가는 환경에서는 더욱 그러하다. ArchWiki 웹사이트의 PulseAudio/Examples 문서를 주문 암송하듯 읽어보고 실습을 해야 할까?

2020년 10월 15일 목요일

아두이노용 입문 키트 KT0001이 드디어 내 손에! 출퇴근 코딩, 생활 코딩, 노인 코딩, 노안 코딩(老眼 coding)의 길로...

바로 이것이 아두이노 우노 R3(호환보드)로구나! 사용된 칩은 'ATmega328P U'라는 것이다(데이터시트). 풀어서 쓰자면 8-bit AVR Microcontroller with 32K Bytes In-System Programmable Flash가 되겠다.




구성품 목록이 들어있지 않아서 쇼핑몰의 링크를 클릭해 보았다. 아마 중국의 제조사에서 제공한 packing list를 그대로 게시한 것 같은데 중국어➡영어 자동 번역기를 돌렸는지 무슨 말인지 알기 어려운 구성품도 있다. 예를 들어 투명한 뚜껑이 달린 녹색 플라스틱 상자는 무슨 용도인가? 이것이 'component box(1)'인가?

도저히 이해가 가지 않는 것에는 '??'를 표시하였다. 철자가 틀린 것도 있고 띄어쓰기나 줄바꿈이 되지 않은 곳도 보이지만 기록을 위해 원문 그대로 복사하였다.
  • UNO R3 1
  • Plug-in feisty one??
  • One large bread plate
  • Component box 1
  • Red three LED lamp pakage (transparent)
  • Three leds(transparent) yellow
  • Leds (transparent) three blue5 resistance package 1 k resistor 10 k resistor 5220 r resistance of 8
  • Yellow button bag
  • for square small keys
  • Yellow hat four
  • Active/passive buzzer components 1 2A digital tube (1)
  • one of four digital tube8* 8 dot matrix 1
  • receiving head package 174 hc595 are needed for aA remote control1602 screen 11 *40 single rows pin 15 v stepper motor 1
  • UL2003 driven plate one9 grams of steering gear (1)9 v battery box 1
  • Article 30/1 the bread line
  • USB line 1
  • Adjustable one??
  • Male, the female of bond line 20 cm article 10/1

지금까지 한 일은 우분투 노트북에 통합 개발 환경 소프트웨어를 설치한 것이 전부이다. 인터넷에는 정보가 너무 많아서 오히려 혼란스럽다. 적당한 책을 딱 한 권만 구입하여 그것을 주로 참조하면서 인터넷의 정보는 보조적인 용도로 쓰는 것이 나을 것이다. 물론 아두이노 공식 웹사이트를 가장 자주 방문하게 될 것이다. 출퇴근 길에 지하철에서 별 영양가 없는 사이트나 들락거리느니 아두이노 관련 정보를 찾아보는 것이 훨씬 유익할 것이다.

저항 등 수동 부품은 앰프를 만드느라 비교적 풍족하게 갖춘 상태지만, 싼 키트를 샀더니 벌써 몇 가지 아쉬운 점이 눈에 뜨인다. Wi-Fi 통신을 하려면 별도의 모듈이 있어야 하고, 1602 LCD도 I2C 제어가 되지 않는다. 그런 문제는 차차 해결하기로 하고, 디지털 출력을 이용한 LED 점등과 같은 간한 실습을 하면서 기능을 익혀 나가도록 하자.

퇴근 후 아두이노 공식 웹사이트의  Getting Started with Arduino UNO를 참조하여 샘플 코드(01.Basics - Blink)의 업로드를 시도하였다. 포트(/dev/ttyACM0)에 쓸 권한이 없다는 에러 메시지가 나온다. 리눅스라서 관리자 권한이 필요한 것 같다. 'sudo arduino' 명령어를 입력하여 아두이노 1.8.12 IDE를 다시 실행한 다음 처음부터 다시 시도하였다. 이것이 컴파일된 기계어 코드가 마이크로프로세서의 메모리로 업로드되는 과정이로구나! 아주 작은 TX 및 RX LED가 요란하게 반짝거리더니 업로드가 완료되었다고 하면서 LED_BUILTIN으로 지정된 LED(디지털 출력 핀 13번)가 반짝거린다.

Blink 실행 중인 아두이노

잠깐, 이 LED는 USB 케이블로 아두이노 우노를 처음 연결했을 때부터 반짝거리고 있었다. 아마도 Blink 프로그램이 테스트 용도로 먼저 업로드된 상태였나 보다. 입출력 핀에 아무런 부품을 연결하지 않아도 내장된 샘플 코드를 실행할 수 있음을 알았다. 내장된 샘플 코드는 웹사이트에서도  설명과 함께 볼 수 있다.

다른 간단한 예제는 무엇이 있을까? 시리얼 플로터를 켜 놓고 AnalogReadSerial을 실행해 보았다. 오! 놀랍군. 특별히 교재를 사지 않고도 자습을 할 수 있는 자료가 이렇게 널려 있었다.

2020년 10월 13일 화요일

GenoGlobe.kr이 어디로 갔지?

거의 매일 접속하여 과거에 기록한 정보를 참조하는 genoglobe.kr 위키 사이트가 갑자기 열리지 않는다. 웹 호스팅 서버에는 별다른 문제가 없다. 왜 IP 주소를 찾지 못한다는 메시지가 나오는 것일까? 후이즈 인터넷 주소자원 검색 서비스에 내 도메인을 넣어 보았다.


genoglobe.kr 도메인의 사용 종료일(2020년 10월 11일)이 바로 이틀 전에 경과한 것이었다. 아마도 비용 청구를 위한 메일이 원 근무지의 주소로 보내지는 바람에 이를 모르고 지나간 것 같다. 등록 대행자는 원래 호스팅케이알이었는데 메가존(주)라는 생소한 곳으로 바뀌었다. 그러나 클릭을 하면 접속이 되는 주소는 여전히 https://hosting.kr/ 이었다. 로그인 메뉴로 가면 '메가존 계정'이란 것으로 전환하라고 한다. 휴면 처리된 계정을 살린 뒤 로그인하여 메가존 계정으로 바꾼 다음, 예치금을 사용하여 도메인 사용 기간을 1년 연장하였다.

처리 결과는 즉시 반영되어 지금은 genoglobe.kr 주소로 접속이 잘 되고 있다. 소유자 및 관리자의 정보를 변경하려고 했으나 휴대폰 정보란이 비어 있어서 진행이 잘 안된다. 나중에 시간을 갖고서 찬찬히 들여다보기로 하였다.

구글, 유튜브, 도메인, 웹 호스팅 서비스... 이런 곳으로 소소하게 들어가는 비용도 전부 합친다면 그렇게 적지는 않을 것이다. 정작 휴대폰은 가장 싼 요금제를 쓰고 있는데!

2020년 10월 12일 월요일

미디 라이프 2.0 반주기 ML-20의 음원보드로부터 드디어 소리를 내다

아두이노 입문용 키트는 아직 배송도 되기 전인데, 갖고 있는 부속을 이용하여 브레드보드 위에 MIDI in 회로와 active low reset 회로를 만들어서 음원보드에 연결하니 소리가 나오기 시작하였다. 좀 더 고생을 할 줄 알았는데 이렇게 소리가 나오게 되니 약간은 허탈한 기분도 든다.



어제 저녁의 작업 상황을 사진으로 남겼다. 주기판의 MIDI in 신호를 처리하던 옵토커플러가 망가진 것이 거의 확실하다.



아두이노 키트의 주문을 취소할까 싶어서 잠시 고민을 하던 중에 롯데택배로 상품이 발송되었다는 문자 메시지가 왔다. 어차피 흥미를 가졌던 물건이니 다른 목적에라도 활용해 보도록 하자.

이번에 시행착오를 겪으면서 마이크로프로세서의 reset 과정에 대하여 정말 많은 것을 알게 되었다. Reset은 잘 작동하던 프로세서를 처음부터 시작하도록 되돌리는 과정이 아니라, power-on cycle에서 당연히 거쳐야 하는 것이다. 구글에서 active low RC reset circuit이라는 검색어를 넣으면 무척 많은 자료가 나오는데, 다음의 것이 비교적 설명이 잘 되어 있어서 링크를 걸어본다.

https://www.maximintegrated.com/cn/design/technical-documents/tutorials/7/720.html 

잘 알려진 MIDI 파일 두 개(cakewalk.mid & passport.mid)를 이 보드로 재생하면서 audacity에서 녹음을 해 보았다. 오디오 인터페이스는 롤랜드 SC-D70을 사용하였다. 소리는 나쁘지 않은 편이다. 리눅스에서 음악 작업을 좀 더 자주해야 익숙해질 텐데, 어쩌다 한 번찍 쓰니까 '어? 어떻게 하는 거였더라?'하면서 고개를 갸웃거리게 된다. Software synth를 쓰는 것이 아니므로 JACK은 쓰지 않았다.



만능기판에 부품을 납땜하여 제대로 회로를 완성해야 하는데, 400홀 브레드보드 상태 그대로 넣고 뚜껑을 닫았다. 오디오 출력과 MIDI 입력은 원래 있던 단자에 배선하여 마무리하였다. 전면 패널에 위치한 LED 중 하나를 MIDI 신호 입력에 연동하여 점멸하게 만들고 싶은데 그러려면 또 공부가 필요하다. 옵토커플러 전과 후, 어디에 어떻게 연결해야 될까? 지금은 전에 연결했는데 너무 어둡게 점멸한다. 

나도 이제 MIDI 장비 탑을 쌓는가?



2020년 10월 8일 목요일

아두이노 입문 키트를 주문해 버리다

미디라이프 2.0 ML-20 반주기의 음원보드 재활용 과제는 아직 성과가 별로 없다. 10핀 커넥터로 어떻게 작동 신호를 넣어 주어야 하는지를 파악하지 못했기 때문이다. 네이버 카페 도스박물관(일명 '도박동')의 한 친절한 회원으로부터 조언을 받아 가면서 열심히 탐구를 하는 중인데, 아마 10월 내내 매달려야 될 것 같다. 마이크로콘트롤러의 리셋(reset)에 대한 공부를 하게 된 것이 매우 중요한 경험이었다.

이 반주기가 한번도 작동이 되는 모습을 본 일이 없기 때문에, 이미 중요 소자가 망가진 것을 가지고 씨름을 하는지도 모른다고 부정적인 생각을 했었다. 그러나 분명히 외부에서 넣어 준 MIDI 시퀀스에 따라 순간이나마 음악이 재생되는 것을 몇 차례 들었었다. 재현이 안 되어서 그렇지...

어제는 SAM9703 칩의 MIDI in 핀에 직접 케이블을 대 보기도 했었는데, 이런 무식한(?) 짓이 혹시 칩을 망가뜨린 것은 아닌지 걱정이 된다. 

다음주에는 주문한 부품으로 MIDI in 회로를 직접 만들어서 테스트를 해 봐야 되겠다. 그리고 제어용 신호를 제대로 입력하고 작동 상태 핀으로 흘러나오는 신호도 점검하는데 쓰기 위하여 드디어 아두이노 우노 R3 입문 키트를 오늘 주문하였다(KEYES KT0001 링크). 아두이노 정품은 아니고 호환 보드라서 가격은 저렴하다. 패키지에 포함된 주변 부품이 많아서 앞으로도 쓸모가 많을 것이다.

라스베리 파이나 아두이노에 관심을 갖고 있었는데 특별히 이를 활용할 프로젝트를 수립하지 못한 상태였었다. 그런데 MIDI 입출력과 관련한 실험을 해야 하니 아두이노를 구입할 그럴싸한 핑계가 생겼다.

2주 정도 더 음원보드를 주물러 본 다음, 희망이 없으면 더 이상 시간 낭비를 할 것이 아니라 건반이나 두드려야 되겠다. 어차피 다른 음원 모듈이 더 있지 않은가.