루비 & 루비 온 레일스 번역자 모임

Posted by 미스란디르 Sun, 18 Mar 2007 10:29:00 GMT

어제 영등포구청역 부근 태풍수산에서 인사이트 출판사 주최로 번역자 모임이 있었다. 굳이 횟집 이름을 밝히는 이유는 회가 맛있어서다. 하하하 (...)

인사이트 한기성 사장님을 포함한 편집자분들과 번역자들이 모이는 자리였는데, 김석준씨 강문식씨는 바빠서 못오셨다. 그놈의 사발면이 뭔지 =3

노경윤씨는 신수가 훤해지셨고, 한사장님도 한달에 15일씩 노느라 힘드시단다. 인사이트의 아름다우신 두 편집자 분들은 여전히 아름다우시다. 다른 번역자 분들의 근황 얘기도 하고 루비얘기도 하고, IT 출판업계 얘기도 하면서 웃고 떠들다보니 몇시간이 훌쩍가더라. 여러분들을 만날 수 있어서 무척이나 즐거운 자리였다.

그동안 책 번역하시느라 수고하신 번역자 분들과 인사이트 출판사 여러분 모두 수고하셨습니다~

PS. 생각해보니 책 표지를 디자인 해주신 그 유명한 디자이너분을 못뵜다. 아쉽.

Posted in  | Tags , , ,  | 2 comments | no trackbacks

레일스와 함께하는 애자일 웹 개발

Posted by 미스란디르 Sun, 18 Mar 2007 10:06:00 GMT

agile rails

노경윤·김석준·신승환·강기수·노우경·유광열씨가 번역한 레일스와 함께하는 애자일 웹 개발책이 드디어 발간되었다. 저자만큼이나 번역자 수가 많은 책이다. 데이브 토머스, DHH외에 다수의 저자가 쓴 책이나. 누가누가 참여했나 궁금하시면 한권 사 보시라. =3

첫 인상은 '왜이리 두꺼워!' 원서가 800페이지 정도 된다. 이걸 번역하면 자연히 쪽수가 늘어나게 되고, 1100쪽의 거대한 바이블이 탄생해버렸다. 가지고 다니면서 보기에는 확실히 부담스럽다. 대충 펫졸드 책을 상상하시면 되겠다.

하지만 책 자체는 RoR의 바이블이라 할 만 하다. 레일스를 잘 해보시고 싶은 분은 이책이 꼭 필요할 것이다. 레일스 설치하는 법 부터, 모델간의 관계등을 예제를 통해서 소개한다. 뿐만 아니라 레일스 프레임웍 자체에 대한 설명도 있으며 실제로 서비스를 하기위한 배치방법도 자세히 다루고 있다.

하지만 레일스를 생전 처음 해보고 입문용 서적이 필요한 사람이라면 두께도 두께고 읽기도 생각보다 쉽지는 않으리라. 이런 사람에게는 황대산씨가 쓴 웹 개발 2.0 루비 온 레일스 : Easy Start!도 괜찮을 것이다. (이거 사실 안읽어봤지만, 황대산씨니까 ...)

루비와 루비온레일스가 많이 퍼지는 한해가 되길 바란다. :)

Posted in  | Tags , , , , ,  | 1 comment | no trackbacks

typo-4.1 불만

Posted by 미스란디르 Sun, 18 Mar 2007 02:56:00 GMT

typo-4.1 혹은 typo-trunk를 설치하면 에러를 보게 된다.

superclass mismatch for class MacroPost

잠시 추적해보았다. (사실은 하다가 안되서 이틀이나 신경질을 부렸다)

lib/text_filter_plugin.rb 에서는 TextFilterPlugin 클래스와 Typo::Textfilter::MacroPost / MacroPre 클래스를 정의한다.

이름에서 보면 대충 텍스트필터를 위한 클래스 같다. 정체야 어쨌든, MacroPost 는 TextFilterPlugin을 상속받는데, 요 TextFilterPlugin이 전에 썼던거랑 다른거랜다. 상황을 보니 서버를 띄우고 첫번째 페이지로딩에선 괜찮고 두번째부터 그런다.

  • 첫번째 의심. 혹시 TextFilterPlugin을 다른데서 정의하고 있나? - 전혀 없다.
  • 두번째 의심. 혹시 루비버그? TextFilterPlugin이 수정되고 다시 상속되면 에러가 뜨나?. 해서 두번 load하는 테스트 파일을 만들어서 시도. - 역시 아니다.
  • 세번째 의심. 혹시 Typo::Textfilter가 아니라 Typo::TextFilter아냐? ... 아니다 -_-;; TextFilter라는 이름은 model/text_filter.rb에서 이미 사용하고 있고 이건 그거랑 관련은 있지만 다른 놈이라 이름을 다르게 한건가보다.
  • 네번째 의심. TextFilterPlugin이 이미 있는데 왜 또 로딩하나? 해서 TextFilterPlugin.object_id와 Typo::Textfilter::MacroPost.suplerclass.object_id 를 확인. 엇? 두번째 로딩부터 값이 달라진다. 그렇다면 역시 이름공간에서 TextFilterPlugin이 사라지고, 다시 로딩하는 과정에서 골때리는 문제가 생긴거다.

const_missing과 load를 다루는 rails 파트는 activesupport의 dependencies.rb 이다. 여기서 특정 상수가 없으면 파일을 찾아서 로딩하는데, 여길 보니 clear 라는 메서드가 있고, 이녀석이 동적으로 불러온 상수들을 이름공간에서 지워버린다.

그렇다면 해결책은? ...이랄까, 그냥 typo를 production 환경으로 돌리면 된다. 저건 development환경일때 매번 다시 로딩하기 위한 수단이었던거다. 뭐, 허무하기 짝이 없다.;

Posted in  | Tags ,  | 3 comments | no trackbacks

ruby-dev 소식: 클래스 로컬 인스턴스 변수표기법

Posted by 미스란디르 Thu, 15 Feb 2007 16:23:00 GMT

얼마전에 사사다 코이치씨가 1.9(trunk) 에서 singleton.rb를 사용할 경우 에러가 난다는 포스팅을 했었다. ruby-dev:30263

요녀석은 make test-all을 하면 볼 수 있고, 저 포스팅의 예제코드를 돌려봐도 마찬가지로 볼 수 있다. (현재시각의 trunk에는 workaround처리가 되어 있음)

이 에러는 r11630 에서 발생한다. 무엇인고 하면, @가 인스턴스 변수, @@가 클래스 변수인데, @_이 클래스 로컬 인스턴스 변수를 뜻하는 prefix가 되면서 부터다.

어떻게 동작하는 것일까? ruby-talk:86984 를 에서 소개한 코드를 보자.

class A
  def m
    @var  = "hi"      # regular instance variable
    @_var = "hello"  # class-local instance variable
  end
end

class B < A
  def n
    puts @var.inspect             # same as @var, above
    puts @_var.inspect            # not same as @_var above
  end
end

o = B.new
o.m
o.n

이 코드의 예상 결과는? 주석을 참조한다면 어떻게 될지 짐작이 간다. 결과는 다음과 같다

"hi" 
nil

내부적으로 어떻게 동작할까? 당신이라면? 나는 코드를 미리 봐버려서 짐작할 기회가 없었다. 답은 심볼 이름뒤에다 클래스를 붙여버린 것이다. 예를들자면 위의 예에서는 @_var라면 :_var/A가 된다. 이러면 B의 객체의 scope에서는 @_var를 접근할 때 :_var/B 를 찾게 되지만, 이녀석은 당연히 없으니 @_var는 값이 들어간적이 없는 인스턴스 변수, 즉 nil이 된다.

다시 처음의 문제제기로 돌아와서. ivar2(클래스 로컬 인스턴스 변수)를 구현하는데 사용한것이 @다음의 ’_’ 다. 그리고 Singleton의 경우, 인스턴스 변수로 @__mutex__를 사용해서 싱클튼을 구현하고 있다. (동시 접근을 막기 위해). 일단 싱글튼 코드를 먼저 살펴보자.

  class << Singleton
    def __init__(klass)
      klass.instance_eval {
        @__instance__ = nil
        @__mutex__ = Mutex.new
      }   
      def klass.instance
        return @__instance__ if @__instance__
        @__mutex__.synchronize {
          return @__instance__ if @__instance__
          @__instance__ = new()
        }
        @__instance__
      end 
      klass
    end
    def inclued(klass)
      Singleton.__init__(klass)
    end
  end

사실은 included에 코드가 몇줄 더 있지만 귀찮으니까 뺐다. included는 모듈이 클래스에 믹스인 될때 호출되는 메서드(말하자면 콜백)이다. 그리고 형식인수로 그 포함한 클래스를 받는다. 그리고 그것을 Singleton.init으로 넘기고, instance_eval을 사용해서 그 클래스의 scope에서 @mutex 를 초기화한다. 그리고 겸사겸사 klass.instance 메서드(이건 말하자면 클래스 메서드) 도 정의하는데, 이때 지금 초기화한 @mutex 를 사용한다.

뭐 보기만 해서는 전혀 문제가 없어보인다.

여기서 잠깐 다른 코드를 보고 넘어가자.


class Merong
  def m
    @__y__ = "Yes!" 
  end
  attr_accessor :__x__
end

m = Merong.new
m.m
m.instance_eval { @__x__ = "Yes!" }
puts m.instance_variables.inspect

위에서 말한대로라면, @x__/Merong @y__/Merong 이 보여야 한다. 그러나!
[:@__x__/#<Class:#<Merong:0xb7ec4390>>, :@__y__/Merong]

문제는 요것. instance_eval을 사용할 경우 좀 애매하게 다른 결과가 나온다.

따라서 Singleton의 경우도 그럴거라고 예상할 수 있다. 귀찮아서 실제로 보는건 생략.

현재는 이것과 관련해서 _ 를 계속 쓸 것인지, 아니면 (v) 라던가 기타 다른 형식을 쓸 것인지를 고민하고 있다. (마츠씨와 사사다씨가) ================ 사실 이 포스팅을 쓰면서, @__mutex__ 에 대입하는 부분과 사용하는 부분이 scope가 다르기 때문일꺼라고 막연하게 짐작했는데, 예상치 못한 결과가 나왔다. 아마도 ivar2관련 버그이리라.

Posted in  | Tags , , ,  | no comments | no trackbacks

루비를 먼저배운 사람을 위한 펄

Posted by 미스란디르 Wed, 14 Feb 2007 18:17:00 GMT

요새 구글 통계를 달아놓고 방문자 수 보는 재미에 빠져있어서 심심하면 포스팅을 하고 싶어진다.

codegolf를 잠깐 참가해보고 perl유져들의 활약을 보면서 펄을 배워봐야겠단 생각이 다시 들어서 펄 튜터리얼을 따라해보면서 느낀점을 정리한 것이다. 하다가 졸려서 중단한거라, 나머지가 더 생길지도 모르겠다.

  • 펄의 @는 루비의 *와 매우 비슷하다. (array expantion)

  • perl is not object oriented. 객체에 어떤 행동을 시킨다는 것은 잊어버려라. 함수 인자처럼 넣은 녀석이 전혀 생각하지 못한 행동을 보일때도 있다.

  • perl은 shell과 상당히 유사한 행태를 보인다. open(INFO, ">>$file"); 은 쉘에서 >> filename 하는것과 같은 의미를 가진다. File.open(filename, 'a') 하는 것과 같다.

  • 파일이름에서 '-' 가 뜻하는 바가 같다. 표준입출력이다. '>-' 가 표준출력, '-'가 표준입력.

  • Enumerable#each 는 foreach로 대신한다. 파이썬이라면 for x in list 가 되겠다.

  • 펄은 문자열과 숫자의 구분이 모호하다. 숫자랑 문자를 그냥 비교해서 숫자처럼 비교할 수도 있고 문자처럼 비교할 수도 있다. 아주 제멋대로.

  • 거짓이 되는 조건은 0과 빈 문자열. "0"도 마찬가지. 거짓이 nil과 false뿐인 루비와는 좀 다르다.

  • elsif는 루비와 마찬가지.

  • $&, $_ 따위의 특별변수. 거~의다 똑같다.

  • 정규표현식 match는 완전 동일. 그러나 gsub는 좀 다르다. var.gsub(/regex/, 'substitution') 은, $var =~ s/regex/substitution/; 이 된다.

  • 루비처럼 정규표현식 리터럴 // 안에서도 변수로 문자열을 치환할 수 있다.

  • 문자열 치환을 늘여서 쓰면 ${var} 이 된다. 이거 어디서 많이 본 것 같지 않은가!

Posted in ,  | Tags ,  | no comments | no trackbacks

Older posts: 1 2