잃어버린 잡지

Posted 2007. 2. 18. 21:25
저는 작년 12월부터 IEEE에서 <IEEE Software Magazine><IEEE Transactions on Software Engineering>를 구독했습니다.

사실 학교 도서관을 통해서 원하는 글은 얼마든지 구해서 읽을 수 있지만, 정기적으로 인쇄되어 나오는 잡지를 구독하지 않으면 잘 안 보게 되더라고요. 비록 43달러의 거금이 들기는 하지만 꾸준히 잘 읽으면 소프트웨어공학의 최신 경향도 파악할 수 있고 여러모로 좋겠다는 판단을 내렸습니다. 현재 회사에서 <CACM>을 구독하려고 생각 중이기도 하고요.

사용자 삽입 이미지

그런데 IEEE 분들이 친절하게 공짜로 껴주는 잡지인 <IEEE Spectrum>은 꼬박꼬박 챙겨서 보내줬는데, 정작 돈 내고 구독한 잡지를 안 보내주네요. 오늘 고객 서비스에 연락해서 다시 보내달라고 요청하기는 했는데, 뭔가 쉽게 풀리는 일이 없군요. 이 외에도 소프트웨어 개발 관련해서 구독하면 좋을 괜찮은 잡지로는 또 뭐가 있을까요?

Ruby 변수 생성

Posted 2007. 2. 18. 01:02
루비에서 변수 생성에 대한 규칙을 잘못 알고 있었다.

[skyul@dev ~]$ irb
irb(main):001:0> a
NameError: undefined local variable or method `a' for main:Object
        from (irb):1
irb(main):002:0> a = 1 if false
=> nil
irb(main):003:0> a
=> nil
irb(main):004:0>

처음 irb를 동작시키면 a라는 변수(혹은 메쏘드)가 정의되어 있지 않으므로 undefiend local variable or method 'a'라는 에러 메시지를 출력한다. 다음으로 실행한 구문은 a = 1 if false이다. if false는 무조건 거짓이므로 a = 1은 절대로 실행되지 않는다. 문제는 다음 행이다. 직관적으로 판단하기에 a = 1이라는 대입(assignment)가 일어나지 않았으므로 a는 여전히 undefiend 일 것이라 생각했지만, 예상과는 달리 a = nil이다.  즉 루비는 a = 1이 대입이 일어나야만 a 변수를 생성해 주는 것이 아닌 것이다. 프로그램을 차례대로 읽으면서 조건에 상관없이 a가 변수로 사용되었음을 알았기 때문에 그 후로는 a를 정의해 준 것이다.

로컬 변수와 메쏘드를 구분하는 것도 마찬가지이다. 다음은 "Programming Ruby: The Ruby Language, Variable/Method Ambiguity"에서 따온 예제이다.

def a
  print "Function 'a' called\n"
  99
end

for i in 1..2
  if i == 2
    print "a=", a, "\n"
  else
    a = 1
    print "a=", a, "\n"
  end
end

결과

a=1
Function 'a' called
a=99


위 예제는 a가 함수로도 사용될 수 있고, 변수로도 사용될 수 있음을 보여준다. a = 1 구문을 지나고 나면 a가 변수임을 알고, 변수로 호출한다. i == 2인 경우 이미 a에 1라는 변수가 할당되어 있지만 앞쪽에 나와있기 때문에 a = 1이라는 대입이 있었음을 알지 못한다. 따라서 이 경우 a를 메쏘드로 가정하는 휴리스틱을 사용한다.

다음과 같이 i == 1 조건이 먼저 나오면 어떨까?

for i in 1..2
  if i == 1
    a = 1
    print "a=", a, "\n"
  else
    print "a=", a, "\n"
  end
end

이 경우 a = 1 대입은 i == 1인 조건에만 있지만, 이 조건이 else 구문보다 앞서 있기 때문에 둘 다 a를 변수로 인식하고 1을 출력할 것이다.

a=1
a=1

RubyGems 사용기.

Posted 2007. 2. 17. 23:40
오늘 루비로 회사 소스 저장소를 백업하는데 쓸 간단한 스크립트를 만들었습니다. 루비 파일 한 개로 된 간단한 프로그램이라 패키징 할 필요도 없지만 루비용 패키징 도구인 RubyGems를 사용해 볼 생각에 gem 파일로 만들어보았습니다. 리눅스 프로그램 패키징에 사용되는 RPM이나 DEB의 스펙 파일과 유사할 것이라 생각했는데, RubyGems은 스펙 파일도 실행 가능한 루비 스크립트더군요. 스펙 자체를 실행할 수 있는 모델이라는 게 재미있었습니다. 다음은 제가 작성한 sysadmin의 스펙 파일입니다.


require 'rubygems'

spec = Gem::Specification.new do |s|

  s.name = 'sysadmin'
  s.version = '0.0.1'
  s.platform = Gem::Platform::RUBY
  s.summary = "sysadmin is a collection of Linux server administration tools."
  s.files = Dir.glob("bin/**/*").delete_if {|item| item.include?(".svn")}
  s.bindir = 'bin'
  s.executables = 'reposbackup'
  s.require_path = '.'

  s.add_dependency 'net-sftp', '>= 1.1.0'
  s.add_dependency 'progressbar', '>= 0.0.3'
  s.has_rdoc=false

  s.author = "Kwang Yul Seo"
  s.email = "kwangyul.seo@gmail.com"
  s.homepage = "http://skyul.tistory.com"

end

if $0==__FILE__
    Gem::manage_gems
    Gem::Builder.new(spec).build
end

패키지에 포함될 파일을 files 속성에 정의해주는데, Dir.glob 메쏘드를 사용해 bin 이후 모든 파일을 집어 넣습니다. 또한 bindir 속성과 executables 속성을 지정해주면, 여기에 지정된 파일은 설치 시에 자동으로 /usr/bin 디렉토리에 복사해줘서 실행 가능하게 만들어 주더군요. add_dependency를 이용해서 간단하게 필요한 패키지의 의존성을 표시해줄 수 있고요. 위 스크립트를 실행시키면 Gem::Builder.new(spec).build 부분에서 gem 파일을 생성해 줍니다.

사용자 삽입 이미지


« PREV : 1 : ··· : 43 : 44 : 45 : 46 : 47 : 48 : 49 : ··· : 82 : NEXT »