'자랑/삽질'에 해당되는 글 3건

  1. vim quickfix 새 탭에서 열기 2010/05/13
  2. 루비에 심취해 있습니다. (4) 2007/03/27
  3. 아이고하느님 - 데스크탑 3호기에 바치는 부고 (4) 2004/04/18

오늘의 야크 털 깎기는 vim quickfix 갖고놀기였습니다.

vim quickfix는 edit-compile-edit (python/ruby의 경우 edit-autotest-edit) 의 사이클을 빠르게 할 수 있게 도와 주는 기능입니다. vim에서 :make를 쳤을 때 컴파일 에러가 뜨면 자동으로 에러가 발생한 해당 줄로 날아가고 별도의 창에 에러 메시지를 띄워서 보여주는 모듈 이름이 quickfix입니다.

이 기능은 make 말고 다른 프로그램에도 얼마든지 적용할 수 있기 때문에 ruby나 python에도 적용하고 있는데요, (물론 출력파일 형식은 C 에러 메시지 형식이어야 합니다) 결과물이 항상 현재 에디트하고 있던 코드를 덮어버리는 것이 짜증나서, 결과물을 항상 새 탭에 열도록 하는 함수를 만들어 보았습니다. 탭 기능은 vim 7.0 이후로 추가되었으므로 아래 스크립트는 vim 7.0 이상에서만 작동합니다.

~/.vimrc에 다음 코드를 추가합니다


function! QuickFixAndFindTab(command)
    let curn = bufnr("%")
    cexpr system(a:command)
    let newn = bufnr("%")
    exe "b " . curn
    let tabnr = 0
    if newn != curn
        for i in range(tabpagenr('$'))
            for bufn in tabpagebuflist(i + 1)
                if bufn == newn
                    let tabnr = i + 1
                    break
                endif
            endfor
        endfor
        if tabnr == 0
            tabe
            exe "b " . newn
        else
            exe "tabn " . tabnr
        endif
    endif
    cw
endfunction

이제 make, rake 혹은 기타 다른 test runner를 단축키에 등록하면 됩니다. 저는 ",r"과 ",m"을 사용했습니다.


noremap ,r :call QuickFixAndFindTab("rake")
noremap ,m :call QuickFixAndFindTab("make")

'자랑 > 삽질' 카테고리의 다른 글

vim quickfix 새 탭에서 열기  (0) 2010/05/13
루비에 심취해 있습니다.  (4) 2007/03/27
아이고하느님 - 데스크탑 3호기에 바치는 부고  (4) 2004/04/18
루비는 일본의 '마츠'라는 사람이 개발한 스크립트 언어입니다. 루비를 이용해 만든 웹 개발 프레임워크인 루비 온 레일스는 엄청나게 빠른 웹 개발 프로세스로 국내에서도 명성이 높죠. 이 사이트에 가보면 어떤 사람이 루비 온 레일스를 이용해 코멘트 기능과 관리자 기능이 포함된 그럴싸한 블로그를 15분만에 뚝딱 만들어내는 충격적인 동영상을 보실 수 있습니다.

루비의 첫인상은 뭐랄까... 굉장히 장난스럽습니다. 언어에 포함된 기본적인 기능과 함수들을 가지고 여러가지 장난을 쳐볼 수 있죠. 예를 들면

5.times { print "A" }
#=> AAAAA

[1, 2, 3, 4].each { |i| print i * 2 }
#=> 2468

이런 코드라던지

string = "hello, world!"
string['hello'] = 'goodbye'
print string
#=> goodbye, world!

이런 코드를 보면 "재밌다!" 는 생각이 한편 들면서도, 한편으로는 "재미있지만 좀 쓸데가 없어보인다" 싶기도 합니다. 그렇지만 루비는 이 정도가 전부가 아닙니다. 조금만 파보면 이 언어의 심상치 않음을 차차 깨닫게 됩니다.

먼저, 루비는 철저한 객체지향 언어입니다. 파이썬과 비슷한 특징이죠. 때문에 위에서처럼 5.times { print "A" }같은 함수가 가능해집니다. 5라는 "상수"가 마치 객체인 것처럼 멤버 함수 times 를 불러서 { print "A" } 라는 "코드 조각"을 마치 객체처럼 함수 인자로 넘겨줄 수 있는 거죠. 파이썬과 비슷한 특징이지만, 파이썬보다 훨씬 쉽고 강력하게 해치웁니다.

함수를 객체처럼 사용할 수 있는 특징은 함수형 프로그래밍의 여러가지 장점을 명령형 언어에서 간편하게 표현하도록 도와줍니다.

[1, 2, 3, 4, 5].map { |x| x * 2 }
#=> [2, 4, 6, 8, 10]

[1, 2, 5, 6, 7, 8, 11].select { |x| x % 2 == 0 }
#=> [2, 6, 8]

이런 코드를 짤 수 있는 거죠. 물론 코드 조각을 받아서 실행하는 프로그램을 직접 만들 수도 있습니다. yield 명령어로 인자로 들어온 코드 블록을 실행하면 됩니다.

# sum_for_10 함수는 코드를 받아 코드에 1..10까지의 숫자를 던져넣은 결과를 합해줍니다.
def sum_for_10

  sum = 0
  for num in 1..10
    sum += yield num
  end
end

sum_for_10 { |x| x }
#=> 55
sum_for_10 { |x| x*x }
#=> 385

이렇게요.

루비의 또 한가지 재미있는 점은, 모든 클래스 정의가 오픈되어 있다는 점입니다. 이미 정의된 클래스를 나중에 오버로딩하고 덧붙이는 것이 가능합니다. 그런데 아까도 말했듯 루비의 모든 것(변수, 상수, 코드, 함수 등등등)은 객체, 즉 클래스입니다. 그러므로 언어 자체의 동작을 코드 내에서 쉽게 바꿀 수 있다는 뜻이 됩니다. 예를 들어, 리스트(루비에서는 Array)에서 합을 구해주는 함수 sum을 추가해 볼까요

# Array를 열어 새 함수를 추가합니다.
class Array
  def sum
    result = 0
    each { |x| result += x }
    result
  end
end

[1, 2, 3, 4, 5].sum
#=>15

간단하군요. +ㅅ+

덕분에 심지어는 이런 코드도 가능해집니다.

# Numeric은 정수와 실수를 포함한 루비의 모든 수를 나타내는 클래스입니다.
class Numeric
  def minutes
    # 자기 자신에 60을 곱해 분으로 표현합니다.
    self * 60
  end
  def hours
    self * 60.minutes
  end
  def days
    self * 24.hours
  end
  def years
    self * 365.days
  end
end

3.years + 13.days < (3.1).years
#=> true

다른 언어에서라면 Date 클래스를 따로 만들고 연산자를 오버로딩하고 어쩌구 저쩌구 했어도 이렇게 짧고 우아하게 해결하지는 못했을 겁니다.

그러면 지금까지 나온 두가지, 함수형 프로그래밍과 열린 클래스 구조를 이용해서 어떤 일이 가능해지는지 볼까요

# HTML이라는 클래스를 정의합시다.
class HTML
  # method_missing은 메소드가 호출되었지만 그런 이름을 가진 메소드가 없을 때 불려집니다.
  def method_missing (method_id)
    # 메소드 이름을 받아 문자열로 변환해줍니다.
    tag_name = method_id.to_s
    # 코드 블록이 함께 주어졌다면 안쪽의 내용을 태그로 감싸서 출력합니다.
    # 아니면 그냥 태그 한줄만 출력합니다.
    if block_given? then
      puts "<" + tag_name + ">"
      yield
      puts "</" + tag_name + ">"
    else
      puts "<" + tag_name + "/>"
    end   
  end
end

tag = HTML.new

tag.html {
  tag.head {
    tag.title { puts "이름" }
  }
  tag.body {
    tag.h1 { puts "제목" }
    tag.p { puts "문단" }
  }
}

결과는 간단한 html 코드가 됩니다.

<html>
<head>
<title>
이름
</title>
</head>
<body>
<h1>
제목
</h1>
<p>
문단
</p>
</body>
</html>

루비는 이런 식으로 지금까지 제가 "프로그래밍"에 대해 갖고 있던 생각을 완전히 뒤집어 놓았습니다. 지금까지 제가 알고 있던 프로그래밍이 어떤 과제를 수행하는데 적합한 언어를 고르고, 그 언어의 문법으로 그 과제를 기술하는 일이었다면, 루비로 코딩하는 것은 과제를 언어의 문법에 맞추는 동시에 언어의 문법을 과제에 맞춰나가는, 양방향 과정입니다. 요즘 루비 커뮤니티에서 유행하는 말로 하면, domain-specific language를 만드는 거죠.

한줄요약 : 루비는 정말 재미있습니다.

'자랑 > 삽질' 카테고리의 다른 글

vim quickfix 새 탭에서 열기  (0) 2010/05/13
루비에 심취해 있습니다.  (4) 2007/03/27
아이고하느님 - 데스크탑 3호기에 바치는 부고  (4) 2004/04/18
tag 루비
아이고하느님이란 사용하던 컴퓨터가 원인모를 문제를 일으켜 문제를 알아내는데, 혹은 복구하는 데 심각한 고생을 겪었을 경우 그 기록을 남겨 다른 사람의 타산지석으로 삼는 것을 말합니다. 특정 종교의 신앙과는 전혀 무관한 발언임을 미리 밝힙니다. -_-;;;

1. 원래 펜티엄 2 시절부터 내가 쓰다가 지난해 업그레이드하여 이제는 어머니가 쓰시는 데스크탑 3호기. 원래부터 보드가 잘 말을 듣지 않아 시스템 종료를 눌러도 전원이 꺼지지 않는 경우가 빈발하고 Windows ME가 종종 블루스크린을 띄워주는 등 골골거리는 일이 잦았으나 어머니가 논문 작성과 웹 서핑의 용도 외에는 거의 사용하지 않으시는지라 큰 문제가 아니라고 판단하고 근 6개월간 방치하였다. 그러나 내부에서는 잦은 콜드 부팅으로 인해 하드디스크가 점점 맛이 가고 있었던 것이다...

2. 지난달부터 블루스크린 발생횟수가 급격하게 증가, 급기야 며칠전부터는 도무지 서핑을 할 수 없는 지경에 이르렀다. 쌓여있는 시험과 레포트를 핑계로 치료를 미루고 있었지만 놔두었다간 골로 가는 수가 있겠다 싶어 수술에 착수.

3. 블루스크린이 뜨기 전마다 나타나는 다이얼로그가 page fault로 인한 kernel 오류였음에도 불구하고 단순히 ME의 소프트웨어 문제일 거라고 안일하게 판단하여, NTFS로 포맷한 후 2000을 설치하였다. 설치까지는 깔끔했으나, 처음 부팅하자마자 블루스크린. 데스크탑에서 2000을 사용한 이후 두번째로 맞이하는 블루스크린이었다.

4. 2000을 한번 더 설치해보았으나 똑같은 블루스크린 발생. page fault 메시지에 근거해 볼때 일단 의심가는 지점을 메모리와 하드디스크로 특정하였다. 포맷 도중에 하드디스크의 특정위치에서 이상한 소리가 들리는 것을 감지, 배드 섹터가 있는 것으로 판단하고 인스톨 위치를 바꿔 재설치해보았으나 여전히 똑같은 블루스크린 발생.

5. 디스크가 아니면 메모리라고 판단하여 갖고 있던 다른 SDRAM으로 교체해 보았으나 해결되지 않았다. 여기에 설상가상으로 본체에 전원케이블을 꽂자마자 스위치도 들어오지 않았는데 CPU 팬이 돌아가는 현상 발견. 메인보드 내부에 쇼트가 발생한 것으로 판단.

6. 데스크탑 4호기에서 XP를 돌리고 있던 하드디스크를 물려본 결과 일단 부팅은 되는 듯. 이로써 3년간 써오던 삼성 하드디스크는 창고행 결정. 그러나 하드디스크를 교체해도 보드가 이 상태면 언젠가 또한번 작살날것이 분명해보인다.

7. 따라서, Celeron 2.0GHz와 SDRAM을 지원하는 중고 메인보드를 어찌어찌 구해 교체하였다. 정상 부팅 확인. 아싸 신난다를 외쳤으나 안타깝게도 하루를 넘기지 못했다.

8. 다음날이 되자 데스크탑 3호기가 기나긴 beep음을 내며 부팅을 거부. 메모리 모듈을 위치를 바꿔가며 다시 끼워보고 그래픽 카드를 열댓번쯤 먼지 털어가며 다시 끼워보고 CMOS까지 리셋해보았으나 지금 이시각 데스크탑 3호기는 코마 상태에서 깨어날 생각을 하지 않는다.

9. 데스크탑 3호기는 아직 깨어나지 않았으므로 아이고하느님은 현재진행형이다.

to be continued... -_-

'자랑 > 삽질' 카테고리의 다른 글

vim quickfix 새 탭에서 열기  (0) 2010/05/13
루비에 심취해 있습니다.  (4) 2007/03/27
아이고하느님 - 데스크탑 3호기에 바치는 부고  (4) 2004/04/18