루비는 매우 우아한 언어이다.
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가 얼마나 일을 편하게 만들어주는지를 알 수 있을 것이다. 더 많은 예제와 사용법을 원하신다면 홈페이지를 방문해 보시길. 단순한 것이 아름답다는 것을 느끼게 될 것이다.