Rio - 단순한 아름다움

화학정보학 | 2009/01/12 19:59 | lordmiss

루비는 매우 우아한 언어이다.

 3.times {print "Hello Ruby"}

위의 코드는 “Hello Ruby”라는 문자열을 세 번 출력해 준다. 이 정도 되면 루비는 사람의 마음을 잘 이해하고 있다고 해야 할 것이다. 그래서 나는 루비를 배웠고, 그걸 잘 써먹고 있다.

Zinc에서 화합물 데이터베이스 파일을 전부 다운로드받아야 하는 일이 생겼다. 단순하게 0부터 순서대로 160여개의 파일이 있는데, 개당 약 30메가 정도의 크기이고 그걸 다 다운받으면 되는 일이다. 어플리케이션으로 한다면 다운로드 매니저를 쓰면 되고, 유닉스 스타일로 한다면 curl이나 wget으로 간단하게 해결되는 일이지만, 루비로 이 일을 해 보기로 했다. 기본적으로는 웹에서 파일을 다운받는 것이니만큼 net/http 기능을 사용해서 하는 것으로 생각을 했다. 그런데 이게 생각보다 코드가 예쁘지 않고 직관적이지도 않은게 좀 마음에 들지 않는 것이다. 누군가는 분명 이런 문제에 대해 답을 가지고 있을 것이라는 생각으로 검색을 좀 해 봤고, 결국 Rio라는 프로그램을 찾을 수 있었다.

위에서 이야기한 Zinc에서 다운받기는 아래와 같은 12줄짜리 스크립트로 해결할 수 있었다.

require 'rubygems'
require 'rio'

def get_sdfgz(url, res)
    rio(url) > rio(res) #url의 파일을 res 파일로 저장
end

for number in 0..165
    name = "http://zinc.docking.org/subset1/6/6_p0" + number.to_s + ".sdf.gz"
    res = number.to_s + ".sdf.gz"
    get_sdfgz(name, res)
end

특히 다섯번째 줄의 rio(url) > rio(res) 같은 경우에는 정말 아름답지 않은가! 이런 코드로 일을 할 수 있다는건 참 행복이 아닐 수 없다.

알고보니 Rio의 기능은 이 정도에서 끝나는 것이 아니었다. 다음과 같은 예도 가능하다.

rio('dir').files(*.jpg) { |jpg| ... } # dir 디렉토리에 있는 모든 jpg 파일에 대해 작업
rio('dir').files['*.txt'] # dir 디렉토리에 있는 모든 txt 파일의 array
rio('a.txt') > string # a.txt 파일의 내용을 string 변수에 복사
rio('file').lines[0..3,/re/] # file의 처음 세 줄에 대해 정규표현식을 적용
rio('ftp://host/file.gz').gzip.lines[0,3..5] # file.gz의 압축을 푼 후, 0, 3-5 라인을 array에 넣음
ans = rio(?-).print("Input: ").chomp.gets # 사용자 입력을 받아 ans에 돌려줌

위의 예제 정도면 rio가 얼마나 일을 편하게 만들어주는지를 알 수 있을 것이다. 더 많은 예제와 사용법을 원하신다면 홈페이지를 방문해 보시길. 단순한 것이 아름답다는 것을 느끼게 될 것이다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2009/01/12 19:59 2009/01/12 19:59

트랙백을 보내세요

트랙백 주소 :: http://agile2robust.com/tc/trackback/56

댓글을 달아 주세요

[로그인][오픈아이디란?]
비밀글 (Serect)
댓글 달기 (Submit)