Altruistic Programmer's Blog (KR)

이타주의 프로그래머의 블로그

Archive for November, 2008

Rails on Vim

without comments

[옛날 블로그 글입니다.2008.11.27]

Vim으로 Ruby on Rails 개발을 하는 방법을 정리해봅니다. 사용법까지는 아니고 필요한 설정들과 공부할 것 정도가 되겠네요. 오늘로 벌써 3번째 똑같은 설정을 하고 있는데도 매번 헤매고 있어서 큰 맘 먹고 정리해봅니다. ^^

Vim 설치

다양한 OS 용이 있으니 골라서 설치하시고, 혹시나 Mac OS X 사용중이시라면 MacVim(다운로드)을 강하게 추천드립니다~

Rails 플러그인 설치

필수 설치입니다! 문법 강조, 소스 파일 간 이동, Rails 스크립트와 Rake 명령 등을 지원하는 Vim 플러그인입니다.

  • http://www.vim.org/scripts/script.php?script_id=1567에서 최신 버전 받기
  • ~/.vim 디렉토리에 압축풀어 넣기

.vim 디렉토리가 없으면 만드세요. 아래처럼 보이면 됩니다.

색상 설정 파일 받기

필수 설치는 아닙니다. Vim에는 colorscheme이라고 문법 강조를 위해 색상 프로파일을 지정 할 수 있는데, Rails 커뮤니티에서 가장 많이 사용하는 녀석은 아래 두 가지인 것 같네요. 스크린샷 보시고 맘에 드는 것으로 고르세요. (거의 비슷해서 자세히 비교하셔야… ^^;;)

  • 위의 링크에서 최신 버전을 다운받는다.
  • ~/.vim/colors 디렉토리에 복사한다.

colors 디렉토리가 없으면 만드세요. 아래처럼 보이면 됩니다. (2가지 모두 복사한 경우)

Vim 설정을 바꾸자

Rails 플러그인을 위한 약간의 설정과 색상 설정을 추가하면 끝입니다. ~/.vimrc나 ~/.gvimrc 파일에 추가하시면 되요. (.gvimrc 파일은 터미널이 아닌 GUI 모드일때만 로딩됩니다.)

” 필수 설정
set nocompatible
syntax on
filetype plugin indent on ” 이게 없으면 인덴트가 잘 안되요
helptags ~/.vim/doc ” Rails 플러그인의 도움말 로딩
colorscheme vibrantink ” 둘 중 하나를 고르세요
“colorscheme vividchalk
” 필수 아닙니다. 개발에 필요한 일반적인 설정이니 참조하세요
set nobackup
set history=50
set ruler
set showcmd
set incsearch
set hlsearch
set ts=4 ” 이렇게해도 Ruby 파일의 탭은 스페이스 2개가 됩니다
set sw=4
set smarttab
set number

Rails 플러그인 공부하기

Vim에서 아래처럼 써넣으면 Rails 플러그인 도움말이 나옵니다. (안나오면 위에서 필수 설정의 helptags가 잘 안된거에요.)

:help rails

설치에 대한 도움말은 건너뛰고 사용법을 대충 읽으시면 10분 정도 걸리는데 결코 아깝지 않은 시간입니다! 읽으시면서 자주 쓰겠다 싶은 것은 따로 메모해두시면 익히는데 도움이 됩니다. 뭐, 이 정도네요. 적고보니 왜 헤맸나싶기도 하네요. -_-;; Vim과 Rails로 즐거운 개발하세요~
p.s.
Exuberant Ctags를 설치하는 방법을 확인해보세요. 쉽고 빠르게 원하는 소스 코드로 점프 할 수 있습니다.^^

Written by muscly

November 27th, 2008 at 6:30 am

Posted in 프로그래밍

Tagged with , , , ,

오리 타입과 C# 4.0

with 3 comments

[옛날 블로그 글입니다. 2008.11.20]

지난 달에 C# 4.0 CTP 버전이 공개되었는데요, dynamic 타입이라는 재미있는 것이 생겼습니다. 동적인 언어와의 연동을 쉽게 해주는 녀석인데요, C# 4.0의 주요 테마 중에 하나입니다.

오리 타입

오리 타입Duck Type은 이런 뜻입니다.

오리처럼 걷고 오리처럼 말한다면 오리일 것이다

C/C#/Java등에서는 객체의 클래스가 객체의 타입을 말해주는데 반해서 Ruby/Objective-C등에서는 오리 타입을 사용합니다. 어떤 오브젝트가 quark()과 feathers() 메소드를 구현하고 있다면 Duck 타입이라고 생각하는  식이죠.

예를 들어 Ruby에서는 메소드를 정의할 때 파라메터의 타입을 적어주지 않습니다. 그래서 어떤 타입의 오브젝트라도 사용할 수가 있습니다. 아래 보시면 html이 파라메터인데요, gsub() 메소드를 가지고 있다면 어떤 타입이라도 사용할 수 있습니다.  

def remove_font_tag(html)
  html.gsub(/(<font[^<]*>)|(<\/font>)/i, '')
end

“gsub() 메소드를 가지고 있다면 스트링 타입일 것이다” 라고 생각할 수도 있고, “무슨 타입이건 gsub() 메소드만 가지고 있다면 상관없다” 라고 생각할 수도 있겠죠.

대부분의 스크립트 언어에서는 오리 타입의 프로그래밍 스타일을 지원하고 있는데요. 써보신 분은 아시겠지만 상당히 유연해서 코드의 양이나 작업 시간을 엄청나게 줄여줍니다. 큰 프로젝트에서 사용하기에는 좀 불안하지 않을까라는 생각을 하실텐데요. 역시나 써보시면 그렇지 않다는 것을 경험하실 수 있습니다.

여러가지 이유가 있지만, 정적인 타입 시스템 역시 실행 시간에 타입과 관련한 문제가 생긴다는 점만 보더라도 어느 정도는 수긍할 수 있지요. 이 논쟁은 너무 민감하고 오래된 것이라서 아래 링크 정도로 대체하는게 좋겠네요. :)

Dynamic Language Runtime

Common Language Runtime을 사용해서 C#과 같은 .NET 환경의 프로그래밍 언어를 만들 수 있는 것처럼, Dynamic Language Runtime(DLR)을 사용해서 Ruby와 Python같은 동적인 언어들을 .NET 용으로 포팅할 수 있습니다. DLR은 물론 CLR 위에서 돌아가는 레이어인데요, 동적인 타입 시스템이나 메소드 디스패치, 코드 생성처럼 대부분의 동적 언어에 필요한 서비스를 해준다네요.

Python을 Java와 .NET용으로 포팅했다던 Jimm Hugunin(블로그)이라는 분이 MS에서 이 부분을 맡고 계신 듯 한데요. 철수님의 블로그에 보니 최근에 C# 디자인 회의에 참석하기 시작하셨다네요. C# 4.0에 dynamic이라는 키워드가 포함되는 데 큰 영향을 주지 않았을까 싶네요. 

dynamic 타입

dynamic obj = GetDynamicObject();
obj.Quark();

이 코드는 Quark() 메소드가 있건 없건 잘 컴파일 됩니다. Quark() 메소드를 가지고 있는지는 실행 시간에 체크되고, 있다면 잘 호출되고, 없으면 예외가 나는 식입니다.

dynamic 키워드는 타입이기 때문에 파라메터나 반환값의 타입에도 사용될 수 있답니다.

class Video
{
  public dynamic id;
  public dynamic ID { get; set; }
  public dynamic Convert(dynamic converter)
  {
    return converter.Convert();
  }
  public delegate dynamic ConvertedDelegate(dynamic id);
}

dynamic 키워드 덕택에 Ruby, Python 같은 동적인 언어와 C#을 연동하는 일이 상당히 수월해 질 것 같네요. 또 IDispatch를 구현하는 COM 오브젝트의 사용도 무척 편리해진다고 합니다. 

실제로 어떻게 구현되었는지와 같은 자세한 내용은 아래 링크에서 개발자분에게 들어보세요. ^^

C++ 개발자는 어디로 가야 하나요

Objective-C와 Ruby를 보면서 가장 부러웠던 부분이 실행 시간에 메소드를 바인딩하는 기능이었습니다. 심지어 Ruby on Rails에서는 실행 시간에 필요한 메소드를 생성해내는 기능도 아주 활발하게 사용하고 있습니다. 저도 그런 부분에 많이 매료되어서 동적인 언어의 매력에 푹 빠져 있는 상태이고요. :)

개인적인 생각으로는 정적인 타입 시스템으로는 풀리지 않는 다양한 디자인 문제를 오리 타입 스타일로 해결할 수 있지 않을까 기대하고 있습니다만, C++ 개발자인 저로서는 실무에 적용해 보기가 어렵네요. 그나마 C#은 내부용 유틸리티나 웹사이트를 만드는데 사용할 수 있으니 조금 위안이지만, 아쉬운 마음은 어쩔 수 없습니다.

C++ 개발자는 어디로 가야 할까요. C#? 내년에 새로 나올 C++? 아니면 집으로 -_-;;

Written by muscly

November 20th, 2008 at 6:34 pm

Posted in 프로그래밍

추억의 Regular Expression

with 7 comments

[옛날 블로그 글입니다. 2008.11.18]

Regular Expression을 쓰려면 여기저기 레퍼런스를 찾아봐야 해서 귀찮으니까, 좀 정리해 보려고요. 최근에 씨름해서 만든 예제를 통해서 여러분의 뇌안에 숨은 정규표현식에 대한 기억을 되살려보시죠~

<pre>와</pre> 사이의 내용 찾아내기

아래 같은 HTML 문자열이 있을때…

<div>
<p>My Header</p>
<pre class=”myclass”>
#include <iostream>
#include <string>
</pre>
<p>My Impl</p>
<pre class=”myclass”>
void main();
</pre>
</div>

이런 결과를 뽑고 싶다면..

#include <iostream>
#include <string>

이런 정규표현식을 쓰면 됩니다. 

// javascript
var regexPre = /<pre([^>]*)>([^]*?)<\/pre>/i;
var result = regexPre.exec( html );
if ( !result )
 break; // No more match
var stringWeWant = result[2];

JavaScript 예제인데요, 요점만 보면… (너무 기본적인 건 빼고요..)

  • 둥근 괄호 : 그 안쪽의 식과 매칭되는 내용을 보관. 아래서 result를 통해 꺼내 쓸 수 있지요.
  • [^0] : 모든 문자를 의미하려고 쓴 거. 보통 Dot(.)는 \n을 제외한 모든 문자가 되어버려서, \n도 포함한 모든 문자를 표현하고 싶었는데 더 좋은 방법을 모르겠네요 -_-;;
  • *? : ?를 붙여주지 않은 *은 욕심쟁이(Greedy)라서 첫번째 <pre>와</pre> 두 쌍을 모두 매칭시켜 버려요. *?로 해주면 게으른(Lazy) 매칭이 되어서 제일 앞쪽 <pre>와</pre> 쌍만 잡히지요.
  • i : 제일 뒤에 나오는 i는 Case Insensitive, 대소문자 가리지 말라는 얘기.
  • result[2] : 2번째 둥근 괄호에 매칭되는 내용을 의미합니다. 우리가 바라는 바로 그 결과!

기억이 슬슬 되살아나시는지.. 요건  <pre> 엘리먼트 안쪽의 꺽쇠 괄호를 escape(?) 하려고 삽질하던 코드에서 발췌해봤습니다. :)

올바른 E-Mail 검사하기

사용자가 입력한 E-Mail 문자열이 올바른지 검사하려면..

# Ruby
validates_format_of :email, 
 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,

네, 요건 Ruby 코드인데요 :email 속성이 주어진 정규표현식에 맞는지 비교하라고 시키는 코드입니다. E-Mail 형식은 잘 알고계실테니 참고해서 보시면 되겠네요. 모르겠는 문법은 아래 링크 참조해주세요~~

참고 링크

넹.. 이제 기억이 다 돌아오셨을까 모르겠네요. ^^ 손발 고생은 이제 그만, 정규표현식으로 즐거운 코딩 생활하세요~

p.s. 더 좋은 링크 알려주세요~
p.s. 위에 나온 표현식 개선해주세요~ -_-;;

Written by muscly

November 18th, 2008 at 4:11 pm

Posted in 프로그래밍

PNG 감마 보정의 슬픈 이야기

with 8 comments

[예전 블로그 글입니다 2008.11.07]

제목은 제가 지어낸 게 아니고요, 아래 원문의 제목입니다.

영어가 되시면 원문을 읽으시면 좋구요, 저는 가볍게 요약해보려구요.

PNG 파일에는 감마가 보관된다

PNG 파일에는 PNG 파일을 작성한 컴퓨터의 감마값이 보관된답니다. 여기서 감마는 픽셀의 RGB값을 모니터의 물리적인 신호로 바꿀때 영향을 미치는 값인데, PC와 Mac은 이 값이 다릅니다. 그래서, 같은 RGB값이더라도 Mac에서 더 밝게 보인답니다. 아래 사이트에서 비교 사진을 보실 수 있어요

Mac과 PC에서 똑같이 보이게 하기

그래서 Mac과 PC에서 똑같이 보이게 하려고 PNG를 생성한 컴퓨터의 감마값을 넣는답니다. 요즘의 브라우저들은 PNG 파일을 보여줄 때 이 감마값으로 RGB 값을 보정해서, Mac과 PC에서 똑같이 보이게 합니다. 그런데, 여기서 문제가 생깁니다!

보정된 RGB, 보정되지 않은 RGB

PNG 파일은 감마값에 의해 보정이 되지만, CSS에 넣어준 RGB 색상은 보정이 되지 않아요. 그래서 맥에서 웹을 디자인하고 PC에서 보면 어이없는 경우가 생깁니다. 저도 이런 일을 당하고 정보를 찾아보게 되었지요 T_T  JPG나 GIF라면 일어나지 않는 일입니다.

감마 정보 삭제하기

원문에서는 2가지 해결책을 제시하는데, 잘 기억은 안나고요 -_-;; 제가 선택한 건 첫번째 방법! PNG 파일에서 감마 정보를 삭제하는 방법입니다. 일부 옛날 브라우저에서는 안먹힌다지만 저에겐 별로 안소중하니까요. ㅎㅎ
pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB infile.png outfile.png
pngcrush를 쓰면 됩니다. 리눅스 환경이라면 손쉽게 구하실 수 있고, Cygwin이나 MacPort로도 쉽게 설치할 수 있습니다. 기본적으로 PNG 파일의 용량을 줄여주기도 하니까 일석이조입니다. 꿩먹고 알먹기.
이 블로그도 투명한 PNG를 엄청 써서 IE 6에서는 참 조잡하게 보이네요. 그래도 이 글 참조하셔서 알찬 PNG 생활하세요~~

Written by muscly

November 17th, 2008 at 3:36 pm

Posted in 기타

Tagged with , , , ,