2012년 10월 31일 수요일

[R-project] rep() 함수 활용

KOBIC이 주최하는 제12차 차세대 생명정보학 교육에 참석 중이다. 김상철 박사가 강의하는 R 강좌를 올해 들어 두번째 듣고 있다. 자기의 데이터를 가지고 실제 코딩을 해 봐야 실력이 늘 텐데, 게으름에 차일피일 미루다 보니 좀처럼 잘 되지 않는다.

아직도 R의 기본적인 문법을 가지고 헤매는 상태이다. Perl과 달리 R은 기본적으로 벡터 형태의 데이터를 다루고 있어서 Perl처럼 반복문을 많이 쓰지 않아도 된다. 그러려면 rep() 함수를 잘 이해해야 하는데, 이것이 생초보자에게 첫번째 좌절을 안겨주는 관문이 된다. 이건 지극히 개인적인 경험이므로 다른 사람은 어떤지 모르겠다.

이 포스팅은 내 기억을 정리하기 위한 것이지 일반적인 R의 강좌를 쓰고자 함이 아니니 혹시 그런 이유로 이 블로그에 들르신 분은 과감히 [뒤로가기] 버튼을 눌러 주시길...

 아주 간단한 rep()의 예제를 보자.


> rep("A", 4)
[1] "A" "A" "A" "A"

앞의 인수로 주어진 데이터를 뒤의 인수에서 지정한 회수만큼 단순히 반복하는 것이다. 만약 반복하고자 하는 인수가 벡터라면 어떻게 될까?

> x=("A", "B", "C")
> rep(x, 3)
[1] "A" "B" "C" "A" "B" "C" "A" "B" "C"


전체 엘리먼트에 대해서 두번째 인수만큼 반복하는 것이다.

그럼 이번에는 좀 더 복잡한 사례를 들어 보겠다. 1 1 1 1 2 2 2 2 3 3 3 3을 출력하고 싶다면?


> rep(c(1, 2, 3), c(4, 4, 4))
[1] 1 1 1 2 2 2 3 3 3

또는 다음과 같이 두번째 인수를 간략하게 표현할 수도 있다.


> rep(1:3, rep(4,3))
 [1] 1 1 1 1 2 2 2 2 3 3 3 3



이상은 두번째 인수도 벡터로 주어지는 경우이다. 두 인수는 각각 벡터이고, length가 같아야 한다. 첫번째 인수 벡터의 각 원소에 대하여 반복하는 회수를 두번째 벡터에서 결정하는 것이다. 조금 더 복잡한 사례를 들어 보자. 1 2  2 3 3 3 4 4 4 5 5 5 5 5은 다음과 같이 표현 가능하다.

> rep(1:5, 1:5)
 [1] 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

이제야 조금 알겠다...


2012년 10월 28일 일요일

[Perl programming] map() 함수

map-sort-map 함수를 사용한 배열 처리 기법(Schwartzian transformation)을 가끔 사용하면서도, map의 정확한 사용법을 잘 모르고 있었다. map 함수는 인수로 주어진 배열의 모든 원소에 대하여 작업을 수행한 뒤, 그 결과로 이루어진 새로운 배열을 출력하는 기능을 한다. 다음과 같이 strain 명칭을 원소로 갖고 있는 배열이 있다고 하자.

@org = qw(K-12 BL21 str.168);

각 organism들이 갖고 있는 유전자의 수는 %num이라는 해쉬에 들어있다고 가정하자. 즉 다음과 같이 각 organism의 유전자 수를 반환할 수 있다.

$num{'K-12'} = 4600;

이제 유전자의 수를 한 줄에 프린트하려고 한다. 각 값은 tab으로 구분을 하되, @org 배열에 들어 있는 순서를 따르고 싶다. foreach를 사용한 고전적인 방법을 따른다면,

foreach (@org) {
    print $num{$_}, "\t";
}
print "\n";

이렇게 하면 마지막 값 뒤에 tab이 남는 부작용이 생긴다. 다음과 같이 임시 배열을 사용하면 조금 나아지긴 하지만, 코드가 너무 길어진다.

foreach (@org) {
    push @temp, $num{$_};
}
print join "\t", @temp;
print "\n";


 map function을 쓰면 다음과 같이 간결해진다.

print join ( "\t", map $num{$_}, @orgs) . "\n";

2012년 10월 20일 토요일

대전시민천문대에 대한 쓴소리

초등생 딸아이가 오랜만에 천문대에 가 보고 싶다고 하여 아내와 함께 셋이서 대전시민천문대를 찾았다. 일년에 몇 번씩은 들르는 곳이었지만 이번 방문은 상당히 오랜만이라서 나름대로의 기대를 갖고 갔다. 그러나 그동안의 방문 중에서 가장 성의 없고 불친절한 태도에 많은 실망을 하고 말았다.

시민천문대의 설립 목적은 무엇일까? 비록 도심에 위치하여 광공해때문에 많은 별을 보기 어려운 입지에 있지만, 일반 시민들이 천문학에 대해 쉽고 편하게 다가가도록 시설과 서비스를 제공하는 것이 아닐까? 입장료를 직접 받지는 않지만 아마 적은 예산이나마 시에서 지원을 하는 것일게다. 그러나 어제 관람객을 맞는 운영자의 태도는 빨리 문 닫고 집에 가고 싶은 주인의식 없는 점원의 그것과 다를 것이 없었다. 이들에게는 손님이 많이 찾아와 봐야 귀찮고 번거롭기만 할 뿐이다.

먼저 관측실 이야기부터 하자. 아마 이곳에서 생전 처음 본격적인 망원경을 접하는 사람도 많을 것이다. 망원경의 원리를 기초부터 설명하기는 곤란하겠지만, 최소한 오늘 관측 대상은 무어라고 설명이라도 해 주어야 하지 않을까. 안내인이 하는 설명이라는 것은 고작 "날씨가 좋지 않아 밝은 별 위주로 맞추어 놓았습니다. 둘러보시고 궁금한거 있으시면 질문하세요"가 전부였다. 초점이 흐트러져있다고 하자 누가 또 건드렸냐는듯 짜증스러운 태도와 함께.

더욱 가관인 것은 천체투영관에서였다. 동영상을 먼저 상영한 다음 별자리를 보여준다고 했다. 그러나 영상은 나오지 않고, 오디오도 처음부터가 아니라 볼륨 조절을 어떻게 했는지 모르겠지만 중간부터 들리기 시작했다. 그나마 영상은 한참동안 나오지 않은 채로 오디오만 재생하다가 안내인은 그냥 별자리 설명으로 넘어가겠다고 하였다.

플라네타리움 시설이 있는 천체투영관을 방문하는 사람은 대부분 어린이나 초보자이다. 최소한 동서남북 방위가 어떻게 되고, 낮에도 밤과 똑같이 많은 별이 있으나 밝은 태양때문에 보이질 않고, 천체는 하루에 한번 일주 운동을 한다는 설명 정도는 하고 가을 별자리로 넘어가야 하는 것 아닌가. 레이저 포인터는 너무 어두워서 어디를 가리키는지 알 수가 없고, 심한 사투리(이건 어쩔 수 없다고 치자), 성의 없는 설명 등... 대중 앞에서 효과적인 말하기를 하는 것은 분명 중요한 일이다. 그러나 중요한 것은 말하기 기술보다 자신의 지식을 전달하려는 정성과 태도이다. 이번 안내인은 모든 것이 부족해 보였다.

대전시민천문대의 재정 상태가 어떤지는 모르겠지만, 아마 모든 시정이 그러하듯 넉넉하지는 않을 것이다. 시설물을 간신히 유지 보수하는 것만으로도 부족하고, 근무하는 사람들이 보람을 갖고 관람객을 정성스럽게 안내하려는 마음이 도저히 나지 않는 수준의 보수를 받고 열악하게 근무하는지도 모르겠다. 또 사람을 직접 대하는 일이 얼마나 스트레스가 쌓이는 일인지도 잘 안다. 장애인 차량만 올라올 수 있게 만든 진입로를 통제하고, 비싼 망원경을 잘못 건드리지 않도록 아이들을 잘 지도하는 등 나름대로의 애로가 있을 것이다. 그러나 이 일을 통해 시민들과 그 자녀들이 하늘과 천체에 대한 관심을 갖고 아마추어 천문학자로 입문하는 저변이 늘어난다면 그것이 곧 보람 아니겠는가?

"운영 예산은 부족하고 관람객은 너무 많아서 힘들어 죽겠어요" 혹시 이런 태도를 갖고 있는 것은 아닌지?

몇년 전, 아름다운 배경음악을 나지막하게 깔고 성시경씨 비슷한 그윽한 목소리로 낭만적인 별자리 설명을 하던 안내원이 기억난다. 차라리 몇몇 동호인을 모아서 자원본사 형식으로 다만 몇회라도 별자리 설명을 하게 만든다면 비록 기계 조작 등 전문성에서는 조금 떨어지겠지만 충분한 열정으로 관람객을 즐겁게 해 줄 수 있을 것이다. 물론 이런 시도를 이미 해 보았을지도 모르는 일이다.

시민천문대 근무자들은 "내가 왜 여기에서 근무하고 있는가? 나의 미션은 무엇인가?"하는 생각을 해 보고 다시 초심으로 돌아갔으면 한다. 우리는 사설 천문대를 공짜로 쓰고 있는 것은 아닐 것이다. 분명 우리의 세금이 들어가고 있을 것이다.

2012년 10월 19일 금요일

삼성 피처폰 - 노리폰


딸아이가 쓰다가 버린(?) 피처폰. 10-20대 여성을 겨냥하여 출시되었던 작고 아기자기한 휴대폰이다. 과연 내가 스마트폰을 가지고 얼마나 스마트하게 살고 있나? 전화기는 영리하게(smart) 진화했지만 이를 쓰는 나는 더 dumb해진 것이 아닐까? 

중간고사 준비를 하다가도 친구와 쉴 새 없이 카카오톡을 날리는 딸아이를 보면서, 어쩌면 저 세대들에게 스마트폰이 더 필요한지도 모르겠다는 생각이 들었다. 사실 아이패드가 생기면서 스마트폰의 활용 빈도는 많이 줄어들었다.

새로운 실험으로서, 서랍 속에서 잠자고 있던 노리폰에 유심칩을 꽂았다. 아직 한가지 문제가 있는데, Wi-Fi가 잡히기는 하는데 정작 인터넷 연결은 되지를 않는다는 것이다. 이미 초기화를 한번 하고 펌웨어 업그레이드를 하였기에 설정 상의 문제라고는 생각되지 않는다. 하드웨어 불량일지도 모르겠다.

그러나 단순하게 살기 위해 일부러 피처폰을 사용하기로 한 이상(100% 결심을 한 것은 아니지만), 무선인터넷에 미련을 가질 필요가 무엇이 있는가? 생각해 보면 휴대폰으로 이메일을 처리해야 한다는 것은 지나친 강박증일지도 모른다. 이메일이란 batch 처리를 위한 것이라고 나는 믿는다. 이메일을 보내 놓고 두어 시간 만에 응답을 하기를 바란다는 것은 지나치다. 외근 중에도 항시 이메일을 확인하고 답장을 할 수 있으리라 기대한다는 것도 마찬가지다.

결국 모두가(아니, 대부분의 사람이) 스마트폰을 이미 사용하고 있고, 또 이를 통해 즉시 이메일 응답을 할 수 있을 것으로 기대하고 있는 것이 현실이기에, 일반 휴대전화를 쓰는 사람은 경쟁에 뒤쳐지는 것일까? 그렇지는 않다고 생각한다.

휴대폰 없이는 동네 수퍼마켓에 우유 한 팩을 사러 나가지도 못할 정도라면 문제가 있다. 왜 상시적으로 인터넷을 접속할 수 있는 환경이 되어야 한다고 생각하는가? 내비게이션이 없으면 운전을 목적지를 찾아가지 못하라는 법이 있는가? 

자신의 판단력을 믿고, 상황을 믿고, 인간적인 소통을 즐기도록 하자. 스마트 기기는 생활을 편리하게 보조해 주는 수단이라는 점을 잊지 말아야 한다. 동료들과 같이 간 커피숍에서 다들 스마트폰을 꺼내 화면을 바라보고 또 문지르고 있다. 바로 앞에 있는 사람이 더 중요하지 않을까?

노리폰은 의외로 쓸만하다. 화면 해상도가 다소 낮고 밝기가 자동 조정되지 않는다는 점만 제외하면. 서비스 센터에 가서 4,500원을 주고 좀더 남성스런(?) 배터리 커버로 바꾸어 볼 생각도 하고 있다. 현재는 분홍색이다 :)

화성으로 DNA sequencer를 보내자!

GenomeWeb에서 보내는 The Daily Scan을 보다가 재미있는 뉴스를 발견했다. 유명한 크레이그 벤터와 Ion Torrent의 설립자인 조나단 로스버그가 화성에 DNA 염기서열 해독장치를 보내고 싶어한다는 것이다. 우주인을 훈련시켜서 화성까지 보내려면 아직 기술적으로 해결할 일도 많고 비용도 엄청나게 든다. 몇 년이 걸릴 우주 비행에 자원할 사람도 흔치 않을 것이다. 차라리 DNA sequencer를 비롯한 소규모 '실험실'을 보내서 화성에 존재할지도 모르는 미생물을 탐사한 뒤 그 결과물을 지구로 전송한다는 아이디어이다. 현재 Ion Torrent 사는 자사의 PGM을 보내고 싶어하는 것으로 보인다. 이 프로젝트는 NASA가 지원하고 있으며, 명칭은 SETG(Search for Extra-terrestrial Genomes)이다.

안타깝게도 이러한 아이디어를 오래전부터 갖고 있었던 Gary Ruvkun은 이 프로젝트에서 언급되고 있지 않다고 하였다.

화성은 생명체 존재의 가능성으로 인류의 호기심을 계속 자극해 왔었다. 비록 환경은 지구에 비해서 훨씬 열악하지만, 미생물이 생존하고 있을 가능성은 매우 크다. 이들이 지구상의 생명체와 마찬가지로 4개의 염기와 20종의 아미노산을 공통적인 building block으로 쓰고 있을지는 아무도 모른다. 대책 없이 이들 생명체를 지구로 가져오게 되면 어떤 일이 벌어질지 누구도 예측하기 어렵다. 차라리 현지로 실험장치를 보내서 DNA 염기서열을 읽는 것이 안전할 것이다. 단, 지구의 PCR 방법으로 그들의 핵산이 증폭 가능하다는 가정 하에서 말이다.

화성에 세균이 산다면! 참으로 낭만적인 생각이다. 단, 이를 증명하기 위해 천문학적인 연구비가 든다는 것이 문제일 것이다.


기사 원문: The Alien Genome

2012년 10월 16일 화요일

MicrobeDB

미생물 유전체를 늘 다루면서 GenBank file이나 tab-delimited file에서 필요한 정보를 추출하기 위해 매번 Perl 스크립트를 짜는 것을 번거롭게 생각하고 있었다. BioPerl을 같이 사용하기에 많은 수고를 덜 수는 있지만, 반복적인 일을 매번 새롭게 하는 것도 능률이 오르지 않는 노릇이다.

Bioinformatics 저널에 MicrobeDB라는 local database에 대한 논문이 실렸다. NCBI 또는 GenBank format의 사용자 데이터를 자동 다운로드하여 MySQL DB로 유지하고 이를 편하게 사용할 수 있는 API까지 포함되어 있다.

MicrobeDB: a locally maintainable database of microbial genomic sequences. Bioinformatics 2012 28:1947. 

논문에 나온 구절을 인용해 보자.

We propose a minimalistic system that is easy to set up, requires minimal administration for automatic update, focusing on a lab based setting where unpublished genomes can be easily added, and allowing individual users to work with an unchanging snapshot of genomes from a given download date.

다운로드는 다음 사이트에서.

https://github.com/mlangill/microbedb/

원래는 GBrowse의 데이터베이스를 조작해서 필요한 일을 해 볼까 하는 생각을 갖고 있었지만 막상 실행에 옮기지는 못하고 있었다. 내 용도에 딱 맞는 도구가 나와 준 것이 다행스럽다.

2012년 10월 12일 금요일

컴퓨터와 씨름하며 보낸 일주일

두 대의 컴퓨터, 그리고 리눅스 배포판이 담긴 CD/DVD-ROM 6장. 창고로 들어가 버릴 수도 있었던 컴퓨터를 잘 살려냈다. 온갖 배포판을 전전한 끝에 Fedora 17과 Xubuntu 12.04로 잘 마무리가 되었다. 역시 리눅스를 제대로 쓰려면, 데스크탑 환경에서 주무르는 것이 가장 확실하고 또 실력도 확실하게 느는 것 같다. 업무용 프로그램을 쓰기 위해 ssh로 접속해서 CLI 모드로만 작업을 하다 보면 한글 설정이나 멀티미디어 등 사용자의 편의를 위해 간과할 수 없는 기능들을 등한시하게 된다.

많은 사람들의 노력으로 예전보다는 훨씬 편하게 리눅스를 쓰게 되었다. 정말 고마운 일이다. 사무실은 마스커레이딩과 공유기를 이용한 좀 복잡한 네트웍 구성을 갖고 있는데, 이것 역시 공부하는데 큰 도움이 되고 있다. 시험용으로 잠시 조립해 놓은 컴퓨터를 인터넷에 연결하기 위해 전산실에 요청해서 IP 주소를 받지 않을 필요도 없고...

구입한지 4-5년이 된 Core2 Duo E6750(2.66 GHz), E7200(2.53GHz) CPU를 장착한 컴퓨터가 리눅스 덕분에 다시 활용될 수 있다니 이 어찌 기쁘지 않겠는가? 더군다나 그중 하나는 만 10년이 된 케이스 안에 재조립한 것이다. 이 케이스는 투알라틴 셀러론 1GB로 꾸며졌던 컴퓨터였다. 이 보드와 CPU는 아직 작동이 잘 되는 상태이다. 이제 이것을 가지고 할 수 있는 일은 별로 없지만. 두 장의 PCI 랜카드, 100 GB가 안되는 IDE 하드 디스크 몇 개... 심심할 때 가끔 전원이나 연결해서 돌려 볼 일이다.