Posted by 미스란디르
Mon, 18 Feb 2008 16:38:00 GMT
가 메일링에 떴네요. 원문은 [ruby-dev:33825]에서 보실 수 있습니다.
이탤릭체는 제 글입니다.
Ruby M17N 회의가 2008년 2월 15일에 열렸는데, 그 기록을 올립니다.
==cgi.rb 후속의 공모에 대해서
조건은 다음과 같다
- 이름이 cgi.rb가 아닐 것
- MVC를 분리할 것
얼마전에 cgi.rb가 너무 노후화되서 그 후속작을 공모하는 메일이 올라왔었다. 그것에 대한 논의가 이루어진듯
== String#gsub(regexp, hash)
String#gsub(regexp, {"ä"=>"\u00C4", ..}) 와 같은 표기를 쓰고 싶음
→채용
== replica의 출전에 대한 정보를
→쓴다
replica는 encoding의 복제품 같은걸 얘기하는데 예를들면 cp949가 euc-kr의 replica가 되는거죠(사실 루비구현에선 그렇지 않지만). 아마도 소스안에서 이게 무슨 replica인지 따위를 주석으로 쓴다는 것 같네요
== CP949와GBK는 서로 다름
→CP949를 분리
CP949와 GBK가 valid한 영역이 거의 같아서인지 같은걸로 취급했다가 다시 분리됐어요.
== 널문자와 UTF-16를 합칠 경우에 대해
널문자는 ASCII와 호환되지 않는 문자와도 결합가능하도록 하면 어떨까
→채용
== String#length나String#at등이 느리다
search_nonascii를 사용해서 고속화
VALID한UTF-8이라면 더더욱 빨라진다.
== String#getbyte, String#setbyte
→채용
== Indexer
→보류
== inspect 에 대해서
다음과 같이 검토
- obj.inspect_acumulate(enc)를 신설
== strftime 의 앞으로의 방향
strftime은 locale에 의존하지 않고、로케일에 의존하는건 필요하다면 별도로 추가
== require_relative 의 도입에 대해서
require_relative 을 부른 파일의 상대경로에 대해서 require 한다.
→채용
== IO.copy_stream
IO.copystream(filename, filename) 이나 IO.copystream(stream, stream) 등으로
파일이나 스트림을 카피한다.
또한 파일명을 준 경우에는 시스템콜을 호출하기 때문에 루비는 다른 것을 할 수 있다.
→이름은 검토 필요
== Hash#compare_by_identity가 미묘한점
Hash#comparedby(:equal?, :objid)으로 변경하고 싶음
→채용
→Hash#identifed_by의 경우가 좋을지도[ruby-dev:33817]
== Unicode Normalization
API는 다음과 같다
- String#encode("utf-8 nfc")
- String#normalize("nfc")
- Encoding::UTF_8.nfc(str)
open(fn, "r:utf-8", ...) 정도에서 정규화하면서 읽는등의 처리를 하고 싶기 때문에
그것에 대한 기법을 검토
다른 내용들에 아시는 내용 있으면 커멘트 달아주세요~;
써 놓고 보니 m17n회의라면서 결국은 루비1.9 개발논의 회의인거군요. 루비 1.9.1은 언제나오려나.
Posted in 루비 | no comments | no trackbacks
Posted by 미스란디르
Sat, 09 Jun 2007 08:42:00 GMT
프로그램에 있는 것이 본인. 감상부터 말하자면 상당히 부족했다. 준비도 그렇고, 내용도 그렇고. 전체적인 분위기랄가 기본적으로 자신이 만든 무언가에 대한 자랑이랄까 그런 분위기인 것에 비해서 튜로리얼 느낌의 발표를 했다는 것이 상당히 걸렸다. 진행에 있어서도 IRB를 사용하는 데모에서 네트워크가 불안하기도 했고, 오타를 내기도 하는등 여러가지 실수를 했다.
게다가 너무 많은 사람에 겁을 먹고 청중을 바라보는 것을 잊어먹은 느낌이 든다..랄까 뭐했는지 기억도 잘 안난다 ;_;
역시 칭찬 잘하는 일본사람들도 칭찬을 별로 안하는 걸 보면 꽤나 형편없는 발표였던가 보다.
그나마 마지막에 웃음을 노린 내용이 제대로 먹혀서 청중이 폭소한 것 정도가 위안이랄까.
이런 자리에서 발표하고 싶다면 우선은 무언가 실적을 낼 일이다. 이래서야 학회에서 남의 논문으로 발표하는 것과 다를게 없지 않은가.
결론적으로 말하자면 좋은 경험이었다. 실패는 실패고, 어째서 실패했는지 뼈져리게 느끼게 되었으니 그것은 다행이다. 이번엔 충격이 강했기 때문에 그래도 어느정도는 기억하게 되지 않을까.
PS.
(로그)[http://jp.rubyist.net/RubyKaigi2007/Log0609-S4-01.html]도 있다. 일본어 버벅였는데도 잘 알아듣고 써주었다. 번역기는 알아서. =3
Posted in 루비 | 5 comments | no trackbacks
Posted by 미스란디르
Sun, 18 Mar 2007 10:06:00 GMT

노경윤·김석준·신승환·강기수·노우경·유광열씨가 번역한 레일스와 함께하는 애자일 웹 개발책이 드디어 발간되었다. 저자만큼이나 번역자 수가 많은 책이다. 데이브 토머스, DHH외에 다수의 저자가 쓴 책이나. 누가누가 참여했나 궁금하시면 한권 사 보시라. =3
첫 인상은 '왜이리 두꺼워!' 원서가 800페이지 정도 된다. 이걸 번역하면 자연히 쪽수가 늘어나게 되고, 1100쪽의 거대한 바이블이 탄생해버렸다. 가지고 다니면서 보기에는 확실히 부담스럽다. 대충 펫졸드 책을 상상하시면 되겠다.
하지만 책 자체는 RoR의 바이블이라 할 만 하다. 레일스를 잘 해보시고 싶은 분은 이책이 꼭 필요할 것이다. 레일스 설치하는 법 부터, 모델간의 관계등을 예제를 통해서 소개한다. 뿐만 아니라 레일스 프레임웍 자체에 대한 설명도 있으며 실제로 서비스를 하기위한 배치방법도 자세히 다루고 있다.
하지만 레일스를 생전 처음 해보고 입문용 서적이 필요한 사람이라면 두께도 두께고 읽기도 생각보다 쉽지는 않으리라. 이런 사람에게는 황대산씨가 쓴 웹 개발 2.0 루비 온 레일스 : Easy Start!도 괜찮을 것이다. (이거 사실 안읽어봤지만, 황대산씨니까 ...)
루비와 루비온레일스가 많이 퍼지는 한해가 되길 바란다. :)
Posted in 루비 | Tags 레일스, 루비, 번역서, 서적, rails, rubyonrails | 1 comment | no trackbacks
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 루비, typo | 3 comments | no trackbacks
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 루비, 버그, bug, ruby | no comments | no trackbacks