<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>Pragmatic Programmer - Developer 2.0</title>
	<link>http://redrails.egloos.com</link>
	<description>Pragmatic Programmer - Developer 2.0</description>
	<language>ko</language>
	<pubDate>Wed, 20 May 2009 09:05:00 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>Pragmatic Programmer - Developer 2.0</title>
		<url>http://pds6.egloos.com/logo/200711/06/70/e0076370.jpg</url>
		<link>http://redrails.egloos.com</link>
		<width>80</width>
		<height>107</height>
		<description>Pragmatic Programmer - Developer 2.0</description>
	</image>
  	<item>
		<title><![CDATA[ dd ]]> </title>
		<link>http://redrails.egloos.com/1078382</link>
		<guid>http://redrails.egloos.com/1078382</guid>
		<description>
			<![CDATA[ 
  if [ -f ~/.bash_login ]; then<br />
&nbsp; . ~/.bash_login<br />
fi<br />
<br />
if [ -f ~/.profile ]; then<br />
&nbsp; . ~/.profile<br />
fi<br />
<br />
export LANG="ko_KR.UTF-8"<br />
<br />
alias "ls=ls -vFG"<br />
<br />
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"<br />
<br />
PS1='\W&gt; '<br />
<br />
alias "l=ls -l"<br />
<br />
alias "irb=irb --simple-prompt"<br />
<br />
PATH="/Library/Frameworks/Python.framework/Versions/Current/bin:${PATH}"<br />
<br />
export PATH<br />
<br />
export EDITOR="$HOME/bin/mate -w" <br />
<br />
<br />
<br />
<br />
<br />
<br />
set nocp<br />
set all&amp;<br />
set hi=100<br />
set bs=indent,eol,start<br />
set fenc=utf-8<br />
set fencs=utf-8,cp949,cp932,euc-jp,shift-jis,big5,latin1,ucs-2le<br />
filetype on<br />
set ru<br />
set sc<br />
set nu<br />
set ts=4<br />
set sw=4<br />
set noet<br />
set sts=0<br />
"set nowrap<br />
set hls<br />
set nows<br />
set ic<br />
set scs<br />
if has("gui_running")<br />
&nbsp;&nbsp;&nbsp; set lines=50<br />
&nbsp;&nbsp;&nbsp; set co=125<br />
endif<br />
set report=0<br />
set ls=2<br />
set background=dark<br />
set cindent<br />
colorscheme elflord<br />
filet plugin indent on<br />
syntax on<br />
set ai<br />
set si<br />
iab xdate &lt;C-R&gt;=strftime("%Y-%m-%d %H:%M:%S")&lt;CR&gt;<br />
iab xtime &lt;C-R&gt;=strftime("%H:%M:%S")&lt;CR&gt;<br />
iab xname Ohyung<br />
iab xcoding /*&lt;CR&gt;Project Name : &lt;CR&gt;&lt;CR&gt;Version : 1.0&lt;CR&gt;Copyright (c) 2007 : Ohyung ( ohyung@ohyung.com )&lt;CR&gt;Last modified at : &lt;C-R&gt;=strftime("%Y.%m.%d")&lt;CR&gt;&lt;CR&gt;*/&lt;CR&gt;<br />
set wmnu<br />
let g:explVertical=1<br />
let g:explSplitRight=1<br />
let g:explStartRight=1<br />
let g:explWinSize=20<br />
map &lt;F2&gt; V<br />
map &lt;F3&gt; y<br />
map &lt;F4&gt; p<br />
map &lt;F5&gt; :w!&lt;CR&gt;:!gcc % -o %&lt;.out&lt;CR&gt;<br />
map &lt;F6&gt; :!./%&lt;.out&lt;CR&gt;<br />
map &lt;F8&gt; K<br />
set lz<br />
set lpl<br />
set ffs=unix,dos,mac<br />
map #4 :w&lt;CR&gt;:!javac "%"&lt;CR&gt;<br />
map #5 :!java "%:r"&lt;CR&gt; <br />
<br />
			 ]]> 
		</description>
		<category>Mac</category>

		<comments>http://redrails.egloos.com/1078382#comments</comments>
		<pubDate>Sun, 02 Dec 2007 21:04:05 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ ERP , CRM , SCM ]]> </title>
		<link>http://redrails.egloos.com/1029927</link>
		<guid>http://redrails.egloos.com/1029927</guid>
		<description>
			<![CDATA[ 
  <p>ERP (Enterprise Resource Planning) 란를 간단히 나마 정의 한다면 기업의 생산, 물류, 회계, 인사등의 전체적인 기업활동을 지원해 주는 Integrated Package라고 말할 수 있을 것이다. 하지만 이것은 어디까지나 협소한 정의에 불과하다. 이러한 ERP라는 정의를 한글로 번역하자면 전사적 자원관리 시스템라고 말할 수 있을 것이다. 이 용어는 처음 Gartner Group이 처음 사용하면서 그 유래를 찾아 볼 수 있을 것이다. ERP를 간단히 나마 정의 한다면 기업의 생산, 물류, 회계, 인사등의 전체적인 기업활동을 지원해 주는Integrated Package라고 말할 수 있을 것이다. 하지만 이것은 어디까지나 협소한 정의에 불과하다. 이러한 ERP라는 정의를 한글로 번역하자면 전사적 자원관리 시스템라고 말한다.<br></p><p>CRM (Customer Relationship Management)<br>(고객관계관리)<br>기업의 현재 고객과 잠재고객을 이해하고 예상하는 것을 목표로 하는 사업전략이다. 기술적인 측면에서 CRM은 ＊기업 전반에 산재돼 있는 고객데이터의 추출 ＊기업 내부와 외부의 모든 고객관련 데이터를 중앙 데이터베이스로 흡수 ＊수집된 데이터를 분석하고 분석결과를 다양한 고객접점으로 배분 ＊이동판매, 콜센터, 웹사이트, 판매시점, 직접 마케팅 등의 고객 접점을 통한 정보 활용을 포함한다<br></p><p>SCM(Supply Chain Management) (공급망 관리)<br>제품 생산을 위한 프로세스를 전산화해 부품조달에서 생산계획, 납품, 재고관리 등을 효율적으로 처리할 수 있는 공급망 관리 솔루션을 뜻한다. SCM솔루션은 제품을 생산하는 기업이 부품의 구매, 생산, 판매까지의 모든 일정을 수립하고 고객의 수요계획 및 물류현황을 체계적으로 정리, 제품의 흐름을 원활하고 효율적으로 수행할 수 있도록 도와주는 역할을 한다. 비용과 시간을 절감을 통해 생산성 향상을 꾀할 수 있어 기간업무 시스템의 의사결정을 신속하게 할수 있다는 장점 때문에 최근 기업들의 도입이 활발하게 이뤄지고 있다.<br></p>			 ]]> 
		</description>

		<comments>http://redrails.egloos.com/1029927#comments</comments>
		<pubDate>Thu, 22 Nov 2007 01:47:43 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Tortoise SVN 으로 svn 접근하기 ]]> </title>
		<link>http://redrails.egloos.com/1025556</link>
		<guid>http://redrails.egloos.com/1025556</guid>
		<description>
			<![CDATA[ 
  <div class="level3"><ul><li class="level1"><div class="li"> Google:TortoiseSVN 으로 구글링하여 <em>Tortoise</em> SVN 을 다운받습니다. 프리웨어입니다.</div></li><li class="level1"><div class="li"> 설치 후 시스템을 재시작합니다. 윈도우즈에 딱 붙어 동작하는 방식의 프로그램이라 어쩔 수 없습니다.</div></li><li class="level1"><div class="li"> 다음의 예제를 적절히 변형하여 사용하세요</div></li></ul><ul><li class="level1"><div class="li"> 프로젝트 디렉토리 이름은 luu 입니다.</div></li><li class="level1"><div class="li"> repository 는 서버의 /home/svn/luu<p> 입니다. 따라서 repository <acronym title="Uniform Resource Locator">URL</acronym> 은 <strong>svn+ssh://stania@upnl.org/home/svn/luu</strong> 입니다.</p></div></li><li class="level1"><div class="li"> 새 폴더를 하나 만들고, 이름을 지정합니다.</div></li><li class="level1"><div class="li"> 마우스 오른쪽 버튼을 누르면, SVN Checkout 이 보입니다. 클릭합니다.</div></li><li class="level1"><div class="li"> <acronym title="Uniform Resource Locator">URL</acronym> of repository 항목에 위의 <acronym title="Uniform Resource Locator">URL</acronym> 을 써넣습니다.</div></li><li class="level1"><div class="li"> 나머지 값은 적절하게 써넣습니다. ok 를 누릅니다. 패스워드를 수차례 입력할 수도 있으니 정확하게 계속 응해줍시다. (이 답답함에 대한 해결은 다음절에서…)</div></li><li class="level1"><div class="li"> 그럼 수 차례 시도 후에 파일들을 받아옵니다. 성공! (실패할 경우 이 아래에 질문을 달아보세요)</div></li></ul></div><h3><a target="_blank" name="원격지_서버에서_ssh_를_사용할_때_패스워드_입력_과정을_생략하기" id="원격지_서버에서_ssh_를_사용할_때_패스워드_입력_과정을_생략하기">원격지 서버에서 ssh 를 사용할 때 패스워드 입력 과정을 생략하기</a></h3><div class="level3"><ul><li class="level1"><div class="li"> 위의 과정을 따라했다면, 패스워드를 여러 번 연속 입력하는 삽질을 하게 되거나</div></li><li class="level1"><div class="li"> 커밋이나 로그보기 등등의 작업에 계속 패스워드를 입력하는 짓을 해야 합니다. </div></li><li class="level1"><div class="li"> 이를 해결해봅시다!</div></li></ul></div><h2><a target="_blank" name="puttygen_을_사용하는_방법" id="puttygen_을_사용하는_방법">PuTTYgen 을 사용하는 방법</a></h2><div class="level2"><ul><li class="level1"><div class="li"> [<a target="_blank" href="http://stania.pe.kr/wiki?Linux/ssh&amp;action=show&amp;dummy=1#s-2" class="urlextern" title="http://stania.pe.kr/wiki?Linux/ssh&amp;action=show&amp;dummy=1#s-2" rel="nofollow">http://stania.pe.kr/wiki?Linux/ssh&amp;action=show&amp;dummy=1#s-2</a> 이곳을 참조합니다]</div></li></ul></div><h2><a target="_blank" name="원격지_서버에서_ssh-keygen_을_사용하는_방법" id="원격지_서버에서_ssh-keygen_을_사용하는_방법">원격지 서버에서 SSH-keygen 을 사용하는 방법</a></h2><div class="level2"><ul><li class="level1"><div class="li"> 아래의 방법은 private key 가 네턱 위로 떠다닌다는 문제점이 존재합니다. 가능하면 사용하지 마세</div></li><li class="level1"><div class="li"> MYKEY가 한번만 전송되기 때문에 충분히 안전할 것 같은데요? -Rica</div></li></ul><ul><li class="level1"><div class="li"> 서버에 로그인합니다.</div></li><li class="level1"><div class="li"> 다음을 수행합니다 <br />
</div></li><li class="level1"><div class="li">ssh-keygen -b 1024 -t dsa -f MYKEY<br />
<br />
</div></li></ul><p> 자신의 key 를 보호할 passphrase 를 물어볼테지만, 앞으로의 귀차니즘을 덜기 위해서는 빈 문자열로 놔둡니다. 하지만 이 private key 는 확실히 보호되어야 합니다. 누군가가 복사해 가지 않게 주의하세요 :)</p><ul><li class="level1"><div class="li"> ls -l MYKEY*<p> 을 해보면, 두 개의 파일이 생성된 것을 알 수 있습니다. 다음을 수행해줍니다. </p>cp MYKEY.pub ~/.ssh/authorized_key<br />
<br />
</div></li></ul><p> 그리고, MYKEY 파일을 자신의 컴퓨터로 다운로드합니다.</p><ul><li class="level1"><div class="li"> PuTTy 패밀리중의 하나인 <a target="_blank" href="http://the.earth.li/%7Esgtatham/putty/latest/x86/puttygen.exe%20PuttyGen" class="urlextern" title="http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe PuttyGen" rel="nofollow">http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe PuttyGen</a> 을 실행시킵니다.</div></li><li class="level1"><div class="li"> Conversion - Import Key 를 선택하여 다운로드한 MYKEY 를 선택합니다.</div></li><li class="level1"><div class="li"> 키가 읽힐겁니다. 그럼 그 키를 저장합니다. Save Private Key 를 선택. MYKEY.ppk 파일로 저장.</div></li><li class="level1"><div class="li"> PuTTy 를 켭니다. 세션을 하나 만들어야 합니다.&nbsp; MyConnection<p> 이라고 합시다. 다음과 같이 설정합니다. (한글버전인 경우 알아서 잘 바꿉시다)</p></div></li><li class="level1"><div class="li"> Session→HostName: Hostname or IP Adress of your server</div></li><li class="level1"><div class="li"> Session→Protocol: <acronym title="Secure Shell">SSH</acronym></div></li><li class="level1"><div class="li"> Session→Saved Sessions: MyConnection</div></li><li class="level1"><div class="li"> <acronym title="Secure Shell">SSH</acronym>→Prefered <acronym title="Secure Shell">SSH</acronym> Protocol version: 2</div></li><li class="level1"><div class="li"> <acronym title="Secure Shell">SSH</acronym>→Auth→Private Key file for auth: $PATH$\MYKEY.PKK (replace $PATH$ with real path to the mykey.PKK file)</div></li><li class="level1"><div class="li"> Session 탭으로 되돌아가서, 'save' 를 눌러 세션 저장</div></li><li class="level1"><div class="li"> 이제 Tortoise SVN 에서 체크아웃등을 해줄 때 다음과 같이 <acronym title="Uniform Resource Locator">URL</acronym> 을 적어줍니다. &lt;pre class="code"&gt;svn+ssh://MyConnection/home/svn/luu<br />
<br />
</div></li><li class="level1"><div class="li"> 패스워드 없이 접속이 될겁니다 :)</div></li></ul></div>																																																																				<input name="clubid" value="11649963" type="hidden"><input name="articleid" value="4159" type="hidden">&nbsp;								<br />
			 ]]> 
		</description>

		<comments>http://redrails.egloos.com/1025556#comments</comments>
		<pubDate>Wed, 21 Nov 2007 02:16:08 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 소스 버전 관리툴인 SVN을 사용하는 방법 ]]> </title>
		<link>http://redrails.egloos.com/1025546</link>
		<guid>http://redrails.egloos.com/1025546</guid>
		<description>
			<![CDATA[ 
  <h1><a target="_blank" name="subversion" id="subversion">Subversion</a></h1><div class="level1"><p> <a target="_blank" href="http://subversion.tigris.org/" class="urlextern" title="http://subversion.tigris.org/" rel="nofollow">Subversion</a>은 소스 버전 관리 도구이다. 각종 편집기의 플러그인을 이용하시거나 윈도 환경에서 <a target="_blank" href="http://tortoisesvn.tigris.org/" class="urlextern" title="http://tortoisesvn.tigris.org/" rel="nofollow">TortoiseSVN</a> 등을 이용하면 쉽게 이용하실 수 있다. TortoiseSVN 등을 이용한다면 용어 설명을 이해하고, 다른 작업들은 제공되는 메뉴와 인터페이스를 보고 적절히 적용하면 된다.</p></div><div class="secedit"><div class="no"><a target="_blank" name="용어_설명" id="용어_설명"><br />
용어 설명</a></div><br />
</div><div class="level2"><ul><li class="level1"><div class="li">체크아웃 - 최초에 저장소에서 로컬로 파일을 가져오는 것을의미함. 이 때 파일만 가져오는 것이 아니라 저장소의 위치 정보나 이런것들도 다 함께 가져온다. 그렇기 때문에 체크아웃을 한이후에 업데이트나 커밋을 할 때에는 저장소의 위치를 계속해서 다시 써 줄필요가 없다. 그러나 당연히 체크아웃을 할 때에는저장소의 위치를 써 주어야 한다.</div></li><li class="level1"><div class="li"> 업데이트 - 현재 로컬에 있는 파일들보다 더 최신의 파일이저장소에 있다면 가져와서 적용시켜주는 것. svn up 이라고 치면 현재 디렉토리 아래에 있는 것을 모두 업데이트 한다. <br />
</div></li><li class="level1"><div class="li"> 커밋 - 바꾼 부분이 있다면 커밋을 하면 된다. 현재 디렉토리와 그 아래에 있는 파일들을 저장소에 적용시킨다. 가능하면 -m 옵션을 이용하여 짤막한 커밋 메시지를 남겨준다.</div></li><li class="level1"><div class="li"> <code>PROJECTNAME</code>은 각각의 프로젝트 이름을 의미한다.</div></li></ul></div><h2><a target="_blank" name="체크_아웃_방법" id="체크_아웃_방법">체크 아웃 방법</a></h2><div class="level2"><p> 현재 권장 체크아웃 방식은 svn+ssh 방식이다. https를 올린 다음 아파치 인증 체크 아웃을 쓰는 것이 더 편리한 방법이니 조만간에 이것으로 바꾸는 것이 좋을 것이다.</p></div><div class="secedit"><br />
</div><h3><a target="_blank" name="로컬_체크_아웃" id="로컬_체크_아웃">로컬 체크 아웃</a></h3><div style="background-color: rgb(228, 255, 117); color: rgb(0, 0, 0);" class="level3">svn checkout file:///var/svn/PROJECTNAME</div><div class="secedit"><br />
</div><h3><a target="_blank" name="svn_ssh_체크_아웃" id="svn_ssh_체크_아웃">svn+ssh 체크 아웃</a></h3><div class="level3"><p> svn을 ssh로 터널링하는 방법이다. 패스워드는 시스템 계정을 써야 한다. 현재 사용하는 계정의 이름과 개발 서버 계정의 이름이 다르다면 다음과 같은 형태로 접근하여야 한다. </p><span style="background-color: rgb(228, 255, 117); color: rgb(0, 0, 0);">svn co svn+ssh://username@xx.co.kr/var/svn/PROJECTNAME</span><p> 패스워드는 3번 정도 물어보는데 틀린 것이 아니니 계속 같은 패스워드를 입력해 준다.</p></div><div class="secedit"><br />
</div><h2><a target="_blank" name="파일을_추가하거나_커밋하는_방법" id="파일을_추가하거나_커밋하는_방법">파일을 추가하거나 커밋하는 방법</a></h2><div class="level2"><p> 체크아웃을 한번 하고 나면 저장소의 주소가 설정으로 저장되므로, 다시 쓰지 않아도 된다. 현재 저장소의 상태를 보려면 </p><span style="background-color: rgb(228, 255, 117); color: rgb(0, 0, 0);">svn status</span><p> 를 하면 추가될 파일, 저장소에 없는 파일, 수정된 파일, 충돌이 일어난 파일 등이 표시된다. 저장소에 파일을 추가할 때에는 </p><span style="background-color: rgb(228, 255, 117); color: rgb(0, 0, 0);">svn add files</span><p> 를 쓰면 되고, 커밋을 할 때에는 </p><span style="background-color: rgb(228, 255, 117); color: rgb(0, 0, 0);">svn ci -m '메시지'</span><p> 를 쓰면 된다. 메시지에는 커밋할 때 변경한 것을 간략하게 요약해서 써 준다. 아울러 커밋하기 전에 제대로 동작하는 소스인지를 반드시 확인하여야 한다.</p></div><h2><a target="_blank" name="새로운_브랜치를_만드는_방법" id="새로운_브랜치를_만드는_방법">새로운 브랜치를 만드는 방법</a></h2><div class="level2"><span style="background-color: rgb(228, 255, 117); color: rgb(0, 0, 0);">svn copy SRC DST</span><p> 를 사용하면 된다. <code>svn copy</code> 는 local 내용 외에도 <acronym title="Uniform Resource Locator">URL</acronym> 에 있는 내용으로부터 복사를 할 수도 있다. <code>svn copy</code>의 주 용도는 새로운 branch 또는 tag를 만들기 위함이다. 이것은 OS에 있는 복사의 기능과 같은 역할을 하지만 저장소에 물려 있는 파일들을 복사할 때 단순히 디렉토리를 복사하면 안 된다. <code>.svn</code> 디렉토리는 특별하게 취급되는 것이니 복사하면 안 되며, svn copy로 복사하면 로그가 복사한 것으로 남지만 OS에서 복사한 뒤 add하면 새로운 파일을 추가한 것으로 로그가 남기 때문에 분명히 차이가 있다.</p></div><div class="secedit"><br />
</div><h2><a target="_blank" name="저장소_디렉토리_구조" id="저장소_디렉토리_구조">저장소 디렉토리 구조</a></h2><div class="level2"><p> svn에서 커밋을 하면 다음과 같은 디렉토리가 있다. 각각의 디렉토리에 대하여 간단히 설명한다. 꼭 이대로 할 필요는 없지만 이렇게 하는 것이 가장 좋을 것 같아서 가이드를 정한다. </p><ul><li class="level1"><div class="li"> trunk - 프로젝트의 줄기 부분이다. 여기에 메인 프로젝트 파일들이 들어간다. 밑에 여러 디렉토리가 들어갈 수 있다.</div></li><li class="level1"><div class="li">branch - 프로젝트의 가지 부분이다. 주류와 다르게 특별한기능을 넣고 싶거나 한 경우가 생기면 trunk에서 이곳으로옮겨서 작업하거나 이곳에 새로 작성하여도 된다. branch가성공적이면 나중에 trunk에 합쳐 넣기도 한다.</div></li><li class="level1"><div class="li"> tags - trunk는 계속적으로 작업이 지속되는 공간이다. 특정 시점에서 보관을 하고 싶다면 trunk에서 이곳으로 옮겨놓을 수 있다. tags 밑에 릴리즈 버전을 붙여서 넣어두거나 하면 된다.</div></li></ul></div><div class="secedit"><br />
</div><h2><a target="_blank" name="svn_에디터_설정" id="svn_에디터_설정">svn 에디터 설정</a></h2><div class="level2"><p> 기본으로 아마 nano 에디터가 되어 있을 텐데 vim으로 변경하려면 환경 변수를 바꿔주면 된다. </p><span style="background-color: rgb(228, 255, 117); color: rgb(0, 0, 0);">export SVN_EDITOR=/usr/bin/vim</span><p> 환경 설정 파일등에서 SVN_EDITOR 변수를 설정하면 된다.</p></div><div class="secedit"><br />
</div>			 ]]> 
		</description>

		<comments>http://redrails.egloos.com/1025546#comments</comments>
		<pubDate>Wed, 21 Nov 2007 02:13:49 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Ruby on Rails의 테스팅 전략 ]]> </title>
		<link>http://redrails.egloos.com/1025452</link>
		<guid>http://redrails.egloos.com/1025452</guid>
		<description>
			<![CDATA[ 
  <p>난이도 : 중급</p><p><a target="_blank" href="http://www.ibm.com/developerworks/kr/library/wa-rails4/#author"><font color="#996699">Bruce Tate</font></a>, CTO, RapidRed<br />
</p><p>2007 년 10 월 23 일</p><blockquote>테스팅은 Ruby on Rails 커뮤니티에서 입지를 굳건히 하고 있습니다. Rails 스택부터 커버리지용 RCov, 테스트케이스를 강화시킬 수 있는 Mocha와 FlexMock에 이르기까지 많은 툴들이 있습니다. 하지만, 툴들마다 다양한 전략이있습니다. 여러 가지 기본적인 테스팅 전략의 장단점을 배워봅시다. </blockquote><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--><p>Rails플랫폼의 가장 뚜렷한 특징 중 하나는 Ruby 언어 그 자체이다. 동적으로 유형화 된 언어로서, Ruby는 상당히 유연하고,편리하며, 강력하다. 하지만, 단점도 있다. 동적으로 유형화 된 언어들은 비교적 일반적인 유형 에러와 오자를 포함하여 특정종류의 에러를 잡을 수 있는 컴파일러가 없다. 동적으로 유형화 된 객체 지향 언어 사용자들은 테스트에 대한 필요성을 일찌감치배웠다. </p><p>&nbsp;</p><p>&nbsp;</p><table align="right" border="0" cellpadding="0" cellspacing="0" width="150"><tbody><tr><td width="10"><br />
</td><td><br />
</td></tr></tbody></table><p>Ruby on Rails 커뮤니티는 미국이 아메리칸 아이돌(American Idol)을 포용하듯 </p><p>테스팅을 수용하고&nbsp;있다. 매우 규칙적으로, 테스트 케이스 결과표를 검사한다. Ruby 개발자는 테스팅에 대해 많은 이야기 한다.그들의 블로그도 테스트에 대한 이야기이다. 심지어 전화 투표가 아닌 오픈 소스 프레임웍에 기여함으로써 후방에서도 참여하고 있다.</p><p>테스팅이 없다면, Ruby 애플리케이션은 코드 라인 당 에러 발생 빈도가 훨씬 높아진다. 테스팅을 한다면, 동적으로 유형화된언어에 어느 정도의 효과가 있다. 이 글에서는, 테스트를 해야 하는지 여부, 테스팅이 중요한 이유를 매니저에게 설득하는 방법같은 기본적인 주제로 여러분을 따분하게 만들지 않을 것이다. 여러분은 이미 테스트를 하고 있을지도 모른다. 대신, 모든 Ruby프로젝트 리더가 해야 하는, 보다 미묘한 테스팅 결정들을 상세히 살펴 보도록 하겠다. 테스팅 범위를 측정하는 방법, 테스팅 분량등을 설명하겠다. 기본적인 테스팅 기술과 새로운 mock 프레임웍을 비교할 것이다. 지루한 튜토리얼을 제공하는 대신,ChangingThePresent.org(<a target="_blank" href="http://www.ibm.com/developerworks/kr/library/wa-rails4/#resources"><font color="#996699">참고자료</font></a>)를 구현하는데 사용했던 기술을 예제를 통해 설명하겠다. 다양한 기술들의 장점과 단점을 알 수 있을 것이다. </p><p><a target="_blank" name="N10151"><span class="atitle">기존 Rails 테스팅</span></a></p><p>Rails프레임웍은 자체적으로 매우 강력한 테스팅을 갖고 있다. 적은 노력으로 반복적인 데이터베이스 설치를 지정할 수 있고, 시뮬레이트된 HTTP 메시지를 웹 애플리케이션에 보낼 수 있으며, 세 가지 종류의 테스트, 단위 테스트(unit test), 기능테스트(functional test), 통합 테스트(integration test)를 수행한다. </p><p><a target="_blank" name="N1015A"><span class="smalltitle"><strong><font size="3">단위 테스트</font></strong></span></a></p><p>단위 테스트는 Rails 모델 코드와 가끔씩 헬퍼를 실행한다. 단위 테스트는 모델이 구현한 대로 작동하는지, 모델에 있는 제휴들이여러분이 생각한 대로 작동하는지를 검사한다. 기억해 보면, Rails 모델은 하나의 데이터베이스 테이블을 래핑하는 객체들이다.대부분의 경우, 각 데이터베이스 컬럼은 모델에 있는 애트리뷰트이다. Rails 헬퍼는 모델, 뷰, 컨트롤러 코드를 단순화 하는함수들이다. 각 모델이나 헬퍼가 테스트를 갖고 있는지를 확인해야 한다. ChangingThePresent에서, 가장 기본적인모델에 대한 단위 테스트는 매우 얇다. </p><br />
<a target="_blank" name="listing1"><b>Listing 1: 기본적인 모델 테스트</b></a><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline">&nbsp;require File.dirname(__FILE__) +'/../test_helper'class BannerStyleTest &lt; Test::Unit::TestCasefixtures :banner_styles def test_associationsassert_working_associations end deftest_validation_with_incorrect_specs_should_fail bs =BannerStyle.new(:height =&gt; 10, :width =&gt; 10, :format =&gt;'vertical_rectangle', :model_name =&gt; 'Nonprofit') assert !bs.save,bs.errors.inspect bs2 = BannerStyle.new(:height =&gt; 400, :width =&gt;240, :format =&gt; 'vertical_rectangle', :model_name =&gt; 'Nonprofit')assert bs2.save, bs2.errors.inspect end ...end <br />
</td></tr></tbody></table><br />
<p>Listing1에서, 두 개의 테스트를 가진 응축된 테스트 케이스를 볼 수 있다. 배너 스타일은 간단한 광고 배너를 만든다. 각각의 크기와모양은 느슨한 표준 세트에 기반하고 있다. 이 애플리케이션은 표준 테이블을 사용하여 각각의 새로운 배너가 표준에 순응하는지를확인한다. 첫 번째 테스트는 헬퍼를 사용하여 리플렉션을 통해서 <code>BannerStyle</code>에 대한 모든 제휴들을 실행한다. (Listing 2) 두 번째 테스트는 틀린 높이와 넓이를 가진 배너가 저장될 수 없다는 것을 확인하고, 모델이 유효 스팩을 가진 배너를 정확히 저장한다는 것을 확인한다. </p><br />
<a target="_blank" name="listing1"><b>Listing 2. 제휴를 테스트 하는 헬퍼 </b></a><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline">def assert_working_associations(m=nil) m ||=self.class.to_s.sub(/Test$/, '').constantize @m = m.newm.reflect_on_all_associations.each do |assoc|assert_nothing_raised("#{assoc.name} caused an error") do@m.send(assoc.name, true) end end trueend <br />
</td></tr></tbody></table><br />
<p>Listing 2는 클래스에 대한 모든 제휴들을 실행하는 헬퍼를 보여준다. <code>assert_working_associations</code> 메소드는 클래스에 대한 모든 제휴들을 검사하고 모델에 제휴의 이름을 보낸다. 이러한 catch-all은 모델 당 한 줄의 코드로 모든 모델 테스트에 대한 모든 관계를 호출할 수 있다는 것을 확인한다. </p><p><a target="_blank" name="N10185"><span class="smalltitle"><strong><font size="3">기능 테스트와 통합 테스트 </font></strong></span></a></p><p>기능 테스트는 고립된 HTTP 요청을 통해 사용자 인터페이스를 시험한다. Rails 프레임웍은 HTTP GET과 POST 명령어를쉽게 호출할 수 있게 해주며, 테스트의 중추를 형성한다. 통합 테스트도 이와 같지만, 많은 HTTP 요청들을 계속하여 호출할 수있다. 이 테스트의 원리와 구조는 같다. Listing 3은 기본적인 기능 테스트 모습이다. </p><br />
<a target="_blank" name="listing1"><b>Listing 3. 간단한 기능 테스트 </b></a><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline">require File.dirname(__FILE__) +'/../test_helper'require 'causes_controller'class CausesController; defrescue_action(e) raise e end; endclass CausesControllerTest &lt;Test::Unit::TestCase fixtures :causes, :members, :quotes,:cause_images, :blogs, :blog_memberships def setup @controller =CausesController.new @request = ActionController::TestRequest.new@response = ActionController::TestResponse.new end def test_index get:index assert_response :success assert_template 'index' assert_not_nilassigns(:causes) assert_equal Cause.find_all_ordered.size,assigns(:causes).size end def test_should_create_blog assertCause.find(2).blog.nil? get :create_blog, :id =&gt; 2 assertCause.find(2).blog.nil? login_as :bruce get :create_blog, :id =&gt; 2assert !Cause.find(2).blog.nil? assert_equal Cause.find(2).name,Cause.find(2).blog.title end</td></tr></tbody></table><br />
<p>Listing 3에서, 테스트와 시스템 간 인터랙션이 모두HTTP GET과 POST를 통해 이루어 진다는 것을 알 수 있다. 테스트의 기본 흐름은 다음과 같다. </p><ol><li>간단한 HTTP 연산을 실행한다. </li><li>HTTP 연산이 시스템에 미치는 영향을 테스트 한다. </li></ol><p>게다가, Listing 3의 설정 메소드는 테스팅 스카폴드를 설정하여 HTTP 호출을 시뮬레이트 한다. 테스트 스카폴드는 네트워킹과 인프라스트럭처용 요구 사항을 제거하면서, 테스트 케이스를 애플리케이션 자체로 고립시킨다.</p><p><a target="_blank" name="N101A7"><span class="smalltitle"><strong><font size="3">스텁</font></strong></span></a></p><p>ChangingThePresent.org의 경우, 로그인 같은 일을 쉽게 수행할 수 있도록 하는 테스트 헬퍼 메소드를 추가했다. Listing 3의 <code>test_should_create_blog</code> 메소드의 다섯 번째 라인에서 <code>login_as :bruce</code> 메소드를 볼 수 있다. 이것은 Listing 4의 헬퍼를 호출하는데, 이는 사이트 로그인 기능을 제거하면서, 멤버의 아이디를 세션에 직접 복사한다. Rails <code>acts_as_authenticated</code>를 사용했다면, 로그인 한 사용자가 세션 내에서 <code>:user</code> 키와 제휴된 값을 설정할 것이라는 것을 알 것이다.</p><br />
<a target="_blank" name="listing1"><b>Listing 4. 로그인 제거하기 </b></a><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline">def login_as(member) @request.session[:user] = member ? members(member).id : nilend <br />
</td></tr></tbody></table><br />
<p>많은 개발자들은 스텁과 mock의 개념을 혼동하고 있다. 스텁은 실제 구현을 더 단순한 구현으로 대체하는 것이다. Listing 4에서, 스텁은 전체 로그인 시스템을 간단한 것으로 대체했다. 스텁의 역할은 <i>실제를 시뮬레이트</i> 하는 것이다. Mock은 스텁이 아니다. Mock 객체는 애플리케이션이 인터페이스를 사용하는 방식을 측정하는 게이지와 같은 것이다. 스텁에 대해 예제를 사용하여 보다 자세히 설명하겠다.</p><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" id="userImg285098" style="width: 100px; height: 1px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(285098)="" ,200)="" onclick="popview(this)"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" id="userImg1711451" style="width: 16px; height: 4px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(1711451)="" ,200)="" onclick="popview(this)"><br />
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="center"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" id="userImg1523383" style="width: 16px; height: 16px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(1523383)="" ,200)="" onclick="popview(this)"><br />
</td><td align="right" valign="top"><a target="_blank" class="fbox" href="http://www.ibm.com/developerworks/kr/library/wa-rails4/#main"><b><font color="#996699">위로</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br />
<br />
<p><a target="_blank" name="N101D0"><span class="atitle">기본 개념</span></a></p><p>Rails의 기존 테스팅의 핵심을 배웠다. 더 진행하기 전에, 두 가지의 핵심적인 결정들이 필요하다. 얼마나 많이, 얼마나 빠르게 테스트할 것인가? 전체적인 테스팅 개념을 수립하게 되면, 커버리지와 속도와 관련한 장단점을 주의해야 한다. </p><p><a target="_blank" name="N101D9"><span class="smalltitle"><strong><font size="3">커버리지</font></strong></span></a></p><p>가장 중요한 결정 중 하나는 얼마나 많이 테스트를 할 것인가 이다. 충분히 테스트를 하지 않으면, 코드 품질을 타협하게 되고,심지어는 딜리버리 시간도 늦어지게 된다. 또한, 너무 많이 테스트 할 수도 있다. 너무 많이 테스트 하게 되면, 비즈니스에중요한 데드라인을 놓치게 된다. 테스트 분량에 대한 현명한 결정을 내리려면, 이미 어느 정도의 테스트를 수행하고 있는지를 정확히측정해야 한다. 테스팅에 있어서 가장 중요한 것 중 하나가 코드 커버리지이다.</p><p>ChangingThePresent의 경우, RCov를 사용하여 테스트 커버리지를 결정한다. 전통적인 <code>rake</code> 명령어를 실행하고 결과(DOT TRAIL)를 얻는다. 또한, <code>rake test:coverage</code>를 실행하여 Listing 5에서 보이는 것 같은 보다 완전한 리포트를 얻는다. </p><br />
<a target="_blank" name="listing1"><b>Listing 5. RCov를 사용하여 rake test:coverage 실행하기 </b></a><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline">807 tests, 2989 assertions, 0 failures, 0errors+----------------------------------------------------+-------+-------+--------+|File | Lines | LOC | COV|+----------------------------------------------------+-------+-------+--------+|app/controllers/address_book_controller.rb| 142 | 123 | 84.6% ||app/controllers/admin_controller.rb | 77 | 65 |93.8% ||app/controllers/advisor_admin_controller.rb | 86 | 63 | 88.9%||app/controllers/advisors_controller.rb | 52 | 42 | 100.0%|...|app/models/stupid_gift.rb | 56 | 45 | 100.0%||app/models/stupid_gift_image.rb | 10 | 10 | 100.0%||app/models/titled_comment.rb | 2 | 2 | 100.0% ||app/models/upgrade.rb| 13 | 10 | 100.0% ||app/models/upgrade_item.rb | 3 | 3 | 100.0%||app/models/validation_model.rb | 7 | 7 | 100.0%||app/models/volunteer_opportunity.rb | 137 | 129 | 93.0%||app/models/work_period.rb | 5 | 4 | 100.0%|+----------------------------------------------------+-------+-------+--------+|Total| 12044 | 10044 | 81.8%|+----------------------------------------------------+-------+-------+--------+81.8%167 file(s) 12044 Lines 10044 LOC <br />
</td></tr></tbody></table><br />
<p>RCov는 실행하는데 훨씬 더 많은 시간이 걸리기 때문에(우리 테스트의 두 배), 모든 것에 그 명령어를 실행하지 않지만, 실행할경우에는 주어진 파일에 대한 테스트 커버리지가 어느 정도인지 정확히 알려줄 수 있다. 여전히, 브라우저에서 커버리지 파일을열어, 나의 테스트 케이스가 커버 할 코드 라인이 어떤 것인지를 정확히 본다. 그림 1은 전형적인 커버리지 리포트 예제이다. </p><br />
<a target="_blank" name="fig1"><b>그림 1. RCov 리포트 </b></a><br />
<img src="http://www.ibm.com/developerworks/kr/library/wa-rails4/Figure-1.jpg" id="userImg4971418" style="width: 572px; height: 432px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(4971418)="" ,200)="" onclick="popview(this)"> <br />
<p>숫자가 있을 경우, 정확히 얼마만큼 테스트 할 것인지에 대한 대략적인 계산을 시작할 수 있다. ChangingThePresent의경우, 수시로 변하는 테스트 커버리지 통계가 나왔지만, 80%에서 85% 사이의 숫자로 정착했다. 새로운 주요 기능들은 개발중이기 때문에, 커버리지는 임시적으로 감소할 것이다. 이러한 새로운 기능을 온라인으로 가져오면, 커버리지가 늘어날 것이다.현재, 커버리지는 81.7%이다. </p><p>우리가 내놓은 대답이 여러분의 의견과 같지 않을 수 있다는 것을 명심하라.테스트 커버리지는 팀의 개발자의 경험, 애플리케이션의 복잡성, 애플리케이션의 에러에 대한 내구성, 비즈니스의 지연에 대한내구성에 따라 달라진다. 비행기 엔지니어링 애플리케이션을 구현하고 있다면, 더 많은 테스트가 필요하다. Facebook용 Web2.0 애플리케이션을 구현한다면, 테스트를 적게 해도 된다. 필자가 알고 있는 최고의 Ruby 프로그래머들은 80% 이상의 실행코드 커버리지를 제안하고, 일부는 100% 커버리지를 목표로 하고 있다. </p><p>100% 커버리지를 달성한다고 해도, 테스트가 잘 된 것이라고 보장할 수 없다. 테스트의 유형을 고려하여 최상의 커버리지를 갖도록 해야 한다. </p><p>테스트 커버리지를 이해할 수 있는 툴이 생겼으니, 테스팅 속도에 대해 논해보자. Rails에서, 데이터베이스는 테스트의 속도를결정한다. 데이터베이스 지원 테스트 툴의 전통적인 방식은 문제가 많다. 두 개의 가장 큰 문제는 반복과 속도이다. 반복의관점에서 보면, 데이터베이스를 바꾸지 않고는 좋은 테스트 수트를 구현하기 힘들지만, 데이터베이스를 바꾸면 테스트 데이터를 바꿔야하고, 이는 테스트의 작동을 변화시킨다. 두 번째 문제는 속도이다. 데이터베이스를 바꾸는 것은 비용이 많이 든다. </p><p><a target="_blank" name="N10215"><span class="smalltitle"><strong><font size="3">속도</font></strong></span></a></p><p>여러분도 알다시피, Rails 환경은 반복 문제를 해결했다. 각각의 개발자들은 테스트 데이터로 픽스쳐를 설정한다. 각 테스트케이스 전에, Rails 테스팅 프레임웍은 모델의 데이터를 지우고, 테스트 케이스에 지정한 픽스쳐(fixture)를 로딩한다.각각의 테스트 케이스는 깨끗한 상태에서 시작될 수 있다. 하지만, 테스트 케이스가 여러 개의 테스트를 갖고 있다면, 각자 서로완전히 무관해야 한다. 각각의 테스트용 픽스쳐 전체 세트를 로딩하면 너무 느려질 수 있다. </p><p>Rails는 어느 정도의 타협점을 통해서 속도 문제를 해결한다. 각각의 테스트 케이스를 실행한 후에, Rails는 <i>모든 데이터베이스 변경 사항들을 롤백(roll back)</i>한다. 롤백은 모든 픽스쳐 데이터를 처음부터 로딩하는 것 보다 훨씬 빠르다. 데이터베이스 액세스 비용을 무시할 수는 없다. 롤백을사용할지라도, 데이터베이스 기반 테스팅은 느리다. 테스트가 너무 느리면, 개발자들은 테스트를 실행할 수 없게 된다. 테스트를실행하지 못하면 쓸모가 없다. Rails가 반복 문제를 해결했지만, 속도 문제는 완전히 해결할 수 없다. </p><p>한 가지 대안은 테스트에 인 메모리(in-memory) 데이터베이스를 사용하는 것이다. 일반적으로, SQLite은 MySQL보다 훨씬 빠르다. 단점은 실행 시스템과 같은 플랫폼에서 테스트를 할 수 없다는 점이다. </p><p>데이터베이스 기반 테스팅에 ActiveRecord를 사용한다면, 데이터베이스 지원 테스팅으로 모든 단위 테스트를 수행할 수 있을것이다. 하지만 느린 속도를 감수해야 한다. 데이터베이스 지원 모델을 사용하여 기능 테스트를 해야만 하는 법칙은 없다. 많은Rails 개발자들은 스텁이나 Mock을 사용하여 데이터베이스를 활용하면서, 빠른 기능 테스트를 수행하고 있다. </p><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" id="userImg2745910" style="width: 100px; height: 1px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(2745910)="" ,200)="" onclick="popview(this)"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" id="userImg3845121" style="width: 16px; height: 4px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(3845121)="" ,200)="" onclick="popview(this)"><br />
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="center"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" id="userImg5713037" style="width: 16px; height: 16px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(5713037)="" ,200)="" onclick="popview(this)"><br />
</td><td align="right" valign="top"><a target="_blank" class="fbox" href="http://www.ibm.com/developerworks/kr/library/wa-rails4/#main"><b><font color="#996699">위로</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br />
<br />
<p><a target="_blank" name="N1022A"><span class="atitle">Mocha와 FlexMock에서 Mock과 스텁 실행하기</span></a></p><p>스텁은 실제 구현을 더 간단한 구현으로 대체하는 기술이라고 설명했다. 테스트 케이스는 스텁을 사용하여 구현을 더욱 단순하고,빠르고, 예견 가능한 것으로 만든다. 예를 들어, 시스템 시계를 사용하여 같은 시간을 늘 리턴하여, 테스트가 여러분이 확인할 수있는 반복적인 결과를 낼 수 있도록 해야 한다. </p><p>Mocha 프레임웍에서는 스텁을 쉽게 수행할 수 있다. 여러분이 기대한 결과를 정의하기만 하면 된다. 다음 코드는 시스템 클래스 <code>Date</code>를 생성하여, 같은 날짜, 이를 테면 Ground Hog Day를 리턴한다. (Listing 6) </p><br />
<a target="_blank" name="listing1"><b>Listing 6. 스텁 만들기 </b></a><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline">ground_hog_day = Date.new(2007, 2,2)Date.stubs(:today).returns(ground_hog_day)assert_equal 2,Date.today.day <br />
</td></tr></tbody></table><br />
<p>스텁이 실제의 것을단순하게 시뮬레이트 하는 것이라면, Mock은 그 이상이다. 가끔, 실제의 것을 모방하는 것으로는 충분하지 않을 때가 있다.테스트 할 때, 여러분의 코드가 API를 정확히 사용하는지를 확인해야 한다. 예를 들어, 네이티브 데이터베이스 애플리케이션이연결을 개방했는지, 쿼리를 실행하는지, 연결을 닫았는지를 확인해야 한다. 컨트롤러가 실제로 모델 객체에 <code>save</code>를 호출하는지를 확인해야 한다. 따라서, Mock 객체는 작동은 물론 기대하는 바도 확립해야 한다. </p><p>Rails는 적어도 세 개의 Mock 라이브러리를 갖고 있다. Mocha, FlexMock, RSpec이 바로 그것이다. 필자는Mocha에 초점을 맞추겠지만, 나머지도 고유의 장점을 갖고 있다. Mocha를 사용하면, 예상 API 호출을 명시한 다음에결과 Mocha가 리턴된다. (Listing 7) </p><br />
<a target="_blank" name="listing1"><b>Listing 7. Mocha Mock 라이브러리</b></a><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline">mock_member =mock("member_67")mock_member.expects(:valid?).returns(true)mock_member.expects(:save).returns(true)mock_member.expects(:valid_captcha=).with(true)mock_member.expects(:plaintext_password).returns('password')mock_member.expects(:id).returns(67)Member.expects(:find_by_login).with(nil).returns(mock_member)post:create, :member =&gt; {}, :nonprofit =&gt; {:id =&gt;67}...assert_response :redirectassert_redirected_to :controller =&gt;'nonprofits', :action =&gt; 'show', :id =&gt; mock_nonprofit_id</td></tr></tbody></table><br />
<p>Listing 7은 새로운 멤버를 만드는 테스트케이스 예제를 보여주고 있다. 컨트롤러와 Mock 사용자 간 인터랙션에 대한 기대치를 만든다. Mock 멤버를 만들고 각각의인터랙션을 개별적으로 정의한다. 그런 다음, Member 클래스를 모방하고, <code>mock_member</code>를 리턴하는 파인더를 모방한다. </p><p>모델 레이어와의 인터랙션이 깊게 개입되어 있지만, Mock 객체는 멤버 작동을 기능 테스트 케이스에서 완벽히 분리한다. 이렇게하면 두 가지의 효과를 볼 수 있다. 신용 카드 체크아웃과 자멸(self-destruct) 스위치 같은 특정 API를 사용하는것은 현실적이지 않다. 시간 또는 메모리 기반 서비스 같은 기타 API들은 충분하지 않다. Mock 객체 프레임웍을 사용하여이들을 시뮬레이트 해야 할 것이다. </p><p>데이터베이스 지원 모델을 시뮬레이트 해야 할지 여부를 결정하는 것도 흥미롭다.한 가지 장점은 속도이다. 이 테스트 케이스는 데이터베이스를 전혀 히트하지 않는다. 또 다른 장점은 독립성이다. 테스트를 받고있는 코드를 컨트롤러 레이어와 완전히 분리한다. 하지만, 몇 가지 단점도 있다. 테스트 케이스가 상당히 복잡해진다. 또한, 모델객체와 이와 관련한 테스트 케이스를 수정해야 하기 때문에, 모델의 작동을 수정 할 때마다 변화의 폭이 심하다. 테스트 케이스가중요한 것을 놓치기도 한다. 하나의 밸리데이션을 추가하여 중요한 시나리오가 중단될 수도 있지만, 전혀 알려지지 않는다. 이와같은 이유로, ChangingThePresent의 경우 모델 객체 클래스들을 모사하지 않는다. Mock을 서드 파티에 대한 웹서비스나 네트워크 서비스 같은 외부 인터페이스로 제한한다. </p><p>Ruby 커뮤니티는 Mock의 전략적 방향에 상당히 의존적이다. 필자는 데이터베이스 지원 테스팅을 고수하기로 결정했다. 우리는 두 가지 모두를 시도했다. 코드 베이스에 더욱 잘 맞기 때문에 이러한 기술들을 사용하기로 한 것이다. </p><br />
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" id="userImg2347950" style="width: 100px; height: 1px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(2347950)="" ,200)="" onclick="popview(this)"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" id="userImg4206312" style="width: 16px; height: 4px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(4206312)="" ,200)="" onclick="popview(this)"><br />
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="center"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" id="userImg8735511" style="width: 16px; height: 16px;" name="cafeuserimg" onload="'setTimeout(" resizeimage(8735511)="" ,200)="" onclick="popview(this)"><br />
</td><td align="right" valign="top"><a target="_blank" class="fbox" href="http://www.ibm.com/developerworks/kr/library/wa-rails4/#main"><b><font color="#996699">위로</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br />
<br />
<p><a target="_blank" name="N10268"><span class="atitle">Continuous integration</span></a></p><p>가장 중요한 향상은 continuous integration (CI)이다. 우리는 Ruby 버전의 Cruise Control을실행한다. CI 서버는 깨끗한 구현을 검사하고 새로운 변화가 생길 때마다 처음부터 테스트 케이스를 실행한다. 서버는 변경사항으로 구현이 중지될 때마다 개발자에게 공지한다. 이 서버로는 체크인 하기 전에 몇 가지 대표적인 테스트를 실행할 수 있다.Member에서 몇 줄을 수정한 다음, <code>unit/member_test.rb</code>와 <code>functional/members_controller_test.rb</code>를 실행한다. 15초가 지난 다음, 체크인 할 수 있고, Cruise Control이 잘못된 부분을 알려준다. </p><p><a target="_blank" name="N1027A"><span class="atitle">결론</span></a></p><p>몇 년 전에는, 자동화된 테스팅이 과연 좋은 것인지에 대한 논의가 있었다. 이제, 이러한 논의는 더 재미있어졌다. </p><ul><li>모든 테스트가 데이터베이스 기반이어야 하는가, 아니면 Mock과 스텁을 사용하여 기능 테스트를 고립시켜야 하는가? </li><li>100% 커버리지가 현실적으로 가능한가? </li><li>인-메모리 테스트의 속도가 부가적인 위험 요소들을 상쇄하는가? </li></ul><p>여러분에게 해줄 수 있는 말은 여러분의 작업 특성과 고객에 맞게 기술을 선택하라는 것이다. 일부 전문가의 말을 무조건 맹신하지말라. 향후 몇 년 안에 이 모든 것에 대한 대답을 얻지 못할 수도 있다. 새로운 기술이 탄생하고, 기존 기술이 밀려난다.문서상으로 기록된 것이 실제의 Rails를 정확히 반영하는 것은 아니다. </p><br />
<br />
<p><a target="_blank" name="resources"><span class="atitle">참고자료</span></a></p><b>교육</b><br />
<ul><li><a href="http://changingthepresent.org/" target="_blank"><font color="#5c81a7">ChangingThePresent.org</font></a>: 비영리 인터넷 장터 <br />
<br />
</li><li><a href="http://cruisecontrolrb.thoughtworks.com/" target="_blank"><font color="#5c81a7">CruiseControl.rb를 이용한 continuous integration (CI)</font></a> <br />
<br />
</li><li><a href="http://mocha.rubyforge.org/" target="_blank"><font color="#5c81a7">Mock은 스텁이 아니다</font></a>: Martin Fowler<br />
<br />
</li><li><a href="http://onestepback.org/software/flexmock/" target="_blank"><font color="#5c81a7">FlexMock</font></a> : Ruby mock 프레임웍.<br />
<br />
</li><li><a href="http://mocha.rubyforge.org/" target="_blank"><font color="#5c81a7">Mocha</font></a> : ChangingThePresent에 사용한 Mock 프레임웍.<br />
<br />
</li><li><a href="http://eigenclass.org/hiki.rb?rcov" target="_blank"><font color="#5c81a7">RCov</font></a> : Ruby용 테스트 커버리지 툴.<br />
<br />
</li><li><a target="_blank" href="http://www.ibm.com/developerworks/kr/views/web/articles.jsp"><font color="#5c81a7">웹 개발 존 기술자료</font></a>의 다양한 기술자료를 참고해보라.<br />
<br />
</li><li>developerWorks 웹 개발 뉴스레터(영문)에 <a href="https://www.ibm.com/developerworks/newsletter/" target="_blank"><font color="#5c81a7">등록하기</font></a> </li></ul><br />
<b>제품 및 기술 얻기</b><br />
<ul><li><a target="_blank" href="http://www.ibm.com/developerworks/kr/downloads/"><font color="#5c81a7">IBM 제품 평가판</font></a> 다운로드. <br />
<br />
</li></ul><br />
<b>토론</b><br />
<ul><li><a target="_blank" href="http://www.ibm.com/developerworks/kr/forums/dw_krwaforums.jsp"><font color="#5c81a7">포럼에 참여하기</font></a>.<br />
<br />
</li><li><a target="_blank" href="http://www.ibm.com/developerworks/kr/community"><font color="#5c81a7">developerWorks 커뮤니티</font></a>: <a href="http://www.ibm.com/developerworks/blogs/" target="_blank"><font color="#5c81a7">블로그</font></a>, <a target="_blank" href="http://www.ibm.com/developerworks/kr/forum"><font color="#5c81a7">포럼</font></a> 외 다양한 곳에 참여할 수 있다.</li></ul>			 ]]> 
		</description>
		<category>Ruby on Rails</category>

		<comments>http://redrails.egloos.com/1025452#comments</comments>
		<pubDate>Wed, 21 Nov 2007 01:40:00 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Silverlight 설치환경 ]]> </title>
		<link>http://redrails.egloos.com/1022275</link>
		<guid>http://redrails.egloos.com/1022275</guid>
		<description>
			<![CDATA[ 
  <table _base_target="_self" border="0" cellpadding="0" cellspacing="0" width="100%"><tbody _base_target="_self"><tr _base_target="_self"><td style="height: 35px;" _base_target="_self"><br />
</td></tr></tbody></table><input name="title" value="Silverlight 설치환경" _base_target="_self" type="hidden"><table style="top: 69px; left: 284px; width: 424px; height: 1px;" _base_target="_self" border="0" cellpadding="0" cellspacing="0"><tbody _base_target="_self"><tr _base_target="_self" height="29">		<td id="PostTitle" class="pt_tlt" style="z-index: 2; position: absolute;" _base_target="_self"><a href="http://blog.empas.com/p14406/read.html?a=22393965" class="pt_tlt" name="hl" target="_self" _base_target="_self"><b><br />
</b></a>  </td><td _base_target="_self" align="right"><table _base_target="_self" border="0" cellpadding="0" cellspacing="0">	<tbody _base_target="_self"><tr _base_target="_self">	<td _base_target="_self" width="5"><br />
</td>	<td class="pt_info" _base_target="_self" nowrap="nowrap"><b><a href="http://blog.empas.com/p14406/read.html?a=22393965" class="pt_tlt" name="hl" target="_self" _base_target="_self"><b>Silverlight 설치환경</b></a></b>)</td>	</tr></tbody></table></td></tr></tbody></table><table _base_target="_self" border="0" cellpadding="0" cellspacing="0" width="100%">	<tbody _base_target="_self"><tr _base_target="_self" height="26">	<td class="pt_etc" _base_target="_self" nowrap="nowrap">    <br />
</td>	<td _base_target="_self" align="right">	<table _base_target="_self" border="0" cellpadding="0" cellspacing="0">			<tbody _base_target="_self"><tr _base_target="_self">			<td _base_target="_self" width="5"><br />
</td>												</tr><tr><td style="vertical-align: top;"><br />
</td></tr>	</tbody></table>	</td>	</tr>	<tr _base_target="_self"><td _base_target="_self" height="36"><br />
</td></tr>	</tbody></table>			<table _base_target="_son" border="0" cellpadding="0" cellspacing="0" width="100%"><tbody _base_target="_son"><tr _base_target="_son">		<td class="pt_text" name="hl" _base_target="_son"><div><a style="font-size: 20px;" href="http://www.netfighter.pe.kr/Archives/TaediBlogView.aspx?category=3&amp;postid=20070719122313" target="_blank" _base_target="_son"><font color="#0000ff" size="1"><strong>[Silverlight] 설치환경</strong></font></a> </div><div>1. Runtime<br />
<br />
Microsoft Silverlight 1.0 Beta <a href="http://msdn.microsoft.com/vstudio/eula.aspx?id=fbc0ab04-4ad9-664d-07f4-d4592dd8e157" target="_blank" _base_target="_son"><font color="#0000ff">Download</font></a><br />
<strong>Microsoft Silverlight 1.1 Alpha</strong> <a href="http://msdn.microsoft.com/vstudio/eula.aspx?id=e2c1a44f-0b5c-face-28c8-08a26f2e0b3c" target="_blank" _base_target="_son"><font color="#800080">Download</font></a><br />
<br />
<br />
2. Developer Tools&nbsp;<br />
<br />
<strong>Microsoft Visual Studio codename "Orcas" Beta 1</strong> <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5d9c6b2d-439c-4ec2-8e24-b7d9ff6a2ab2&amp;DisplayLang=en" target="_blank" _base_target="_son"><font color="#0000ff">Download</font></a><br />
<strong>Microsoft Silverlight Tools Alpha for Visual Studio codename "Orcas" Beta 1</strong> <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=6C2B309B-8F2D-44A5-B04F-836F0D4EC1C4&amp;displaylang=en" target="_blank" _base_target="_son"><font color="#0000ff">Download</font></a><br />
(Visual Studio 2008 에 Add in 프로그램)<br />
<br />
3. Designer Tools<br />
<br />
<strong>Expression Blend 2 May Preview</strong> <a href="http://www.microsoft.com/Expression/products/download.aspx?key=blend2maypreview" target="_blank" _base_target="_son"><font color="#0000ff">Download</font></a><br />
Expression Media Encoder May Preview <a href="http://www.microsoft.com/Expression/products/download.aspx?key=encoder" target="_blank" _base_target="_son"><font color="#0000ff">Download</font></a><br />
Expression Design <a href="http://www.microsoft.com/Expression/products/download.aspx?key=design" target="_blank" _base_target="_son"><font color="#0000ff">Download</font></a><br />
<br />
<br />
4. Software Development Kit<br />
<br />
Microsoft Silverlight 1.0 Beta Software Development Kit (SDK)&nbsp; <a href="http://msdn.microsoft.com/vstudio/eula.aspx?id=a40f3ffc-2657-02ec-7d67-7a79b4eac832" target="_blank" _base_target="_son"><font color="#0000ff">Download</font></a><br />
Microsoft Silverlight 1.1 Alpha Software Development Kit (SDK) <a href="http://msdn.microsoft.com/vstudio/eula.aspx?id=c8bf88e7-841c-43fd-c63d-379943617f36" target="_blank" _base_target="_son"><font color="#0000ff">Download</font></a><br />
<br />
※ <strong>굵은</strong>표시는 .net 환경에서 개발테스트에 필요한 최소한의 개발툴입니다. <strong>Expression Blend 2 May Preview</strong>는 복잡한 xaml 코딩 및 디자인을 효률적으로 하기 위해 개발자도 알아야 할 디자인&nbsp;툴입니다.&nbsp;<br />
<br />
※ Microsoft에서 제작된 설치동영상을 참고하실분은 <a href="http://download.microsoft.com/download/5/9/8/5985f834-b3ea-459b-98ba-0aede5bc653a/ScuttGu_Silverlight_Demo.wmv" target="_blank" _base_target="_son"><font color="#0000ff">동영상</font></a>을 참조하시기 바랍니다.<br />
<br />
※ 모든 설치가 완료가 되었다면 <strong>Microsoft Visual Studio codename "Orcas" Beta 1</strong>을실행하여 메뉴에서 [File]-[New]-[Project] 순서로 클릭하면 [New Project] 선택 대화상자가출력됩니다.&nbsp;[그림 1]에서 보시는 것처럼 [Project Types] 목록에 [Silverlight]항목을 확인하실 수있습니다. 만약 설치되지 않았다면 Silverlight Add-in Tool인 <strong>Microsoft Silverlight Tools Alpha for Visual Studio codename "Orcas" Beta 1</strong> 를 설치하면 됩니다.<br />
</div><div align="center"><img alt="" src="http://www.netfighter.pe.kr/Data/learn/silverlight/DeveloperTools/silverlight.png" _base_target="_son"></div><div><br />
※ 참고로 2007년 06월 <strong>Microsoft Visual Studio codename "Orcas" Beta 1</strong>은 <strong><font color="#ff0000">Microsoft Visual Studio 2008</font></strong>로 코드명이 정식변경 되었습니다.<br />
<br />
<a href="http://msdn2.microsoft.com/ko-kr/vstudio/default.aspx" target="_blank" _base_target="_son"><font color="#0000ff">http://msdn2.microsoft.com/ko-kr/vstudio/default.aspx</font></a></div></td>		</tr>		<tr _base_target="_son"><td _base_target="_son" height="55"><br />
</td></tr></tbody></table>			 ]]> 
		</description>
		<category>Ruby on Rails</category>

		<comments>http://redrails.egloos.com/1022275#comments</comments>
		<pubDate>Tue, 20 Nov 2007 07:41:25 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Rails On Ubunt ]]> </title>
		<link>http://redrails.egloos.com/967953</link>
		<guid>http://redrails.egloos.com/967953</guid>
		<description>
			<![CDATA[ 
  오늘 Ubuntu 7.10 을 깔았습니다.<br />
<br />
간만에 만져봐서 인지, 버벅거리다가 설치를 끝냈고,<br />
<br />
Rails & Python & Java & apm 세팅을 준비 중입니다.<br />
<br />
주로 맥에서만 개발해서인지, Ubuntu에서 Rails 세팅하기가 약간 귀찮더군요 :D<br />
<br />
농담입니다 ^^;<br />
<br />
mongrel 과 Ferret , Rspec, zentest 설치에 관한 문서가 없어서, 열심히 구글링을 하고<br />
<br />
대략 10번의 삽질 끝에 mongrel_cluster + capistrano 가 올라가는 것을 보고 흐뭇해 하고 있습니다. ^^;<br />
<br />
그럼 Ubuntu에 Rails 세팅하는 법을 적어보겠습니다.<br />
<br />
맥 보단 상당히 쉽더군요 :D<br />
<br />
일단 루비부터 깔아야겠죠 ?<br />
<br />
$ sudo apt-get install ruby irb rdoc ibmysql-ruby<br />
<br />
그 다음은 패키지 관리자인 rubygem 입니다.<br />
<br />
$ sudo wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz<br />
$ tar -xvzf rubygems-0.9.0.tgz<br />
$ cd rubygems-0.9.0<br />
$ sudo ruby setup.rb<br />
<br />
자 마지막으로<br />
<br />
$ sudo gem install rails --include-dependencies<br />
<br />
해주시면 끝입니다. ^^<br />
<br />
현재 각 버전은 ruby - 1.8.6 rails - 1.2.5 입니다.<br />
<br />
자 이제는 각종 패키지들을 깔아야 할 시간입니다.<br />
<br />
제가 좀 막힌 부분이기도 한데요<br />
<br />
http://soakedandsoaped.com/articles/2006/09/13/install-mongrel-on-ubuntu-6-06-dapper<br />
http://www.urbanpuddle.com/articles/2007/05/09/install-ruby-on-rails-on-ubuntu-feisty-fawn<br />
<br />
등에서 보고 설치했습니다<br />
<br />
일단은 mongrel을 설치해야되는데,<br />
<br />
Install required dependency fastthread? [Yn]<br />
<br />
여기서 자꾸 에러를 뱉어냈습니다.<br />
<br />
extconf.rb:1:in `require’: no such file to load—mkmf (LoadError)<br />
<br />
from extconf.rb:1<br />
<br />
<br />
Because Mongrel is partly written in C/C++ for more performance, you have to install the build-essential package. It will install all needed packages so that you can compile C/C++ applications.<br />
<br />
이런 이유이더군요<br />
<br />
<br />
ferret도 마찬가지였습니다. 그래서 구글링을 해서<br />
<br />
$ sudo apt-get install build-essential<br />
<br />
와<br />
<br />
$ sudo apt-get install ruby1.8-dev<br />
<br />
을 해주고 설치를 하니 잘되더군요 :)<br />
<br />
<br />
이제 부가적으로 몽그렐 클러스터와 카피스트라노 외 기타 유용한 패키지를 설치해야됩니다.<br />
<br />
$ sudo gem install railsmachine<br />
<br />
을 입력하시면 됩니다.<br />
<br />
마지막으로 BDD 툴인 rspec과 zentest, redgreen 등을 설치 합니다.<br />
<br />
$ sudo gem install rspec<br />
<br />
$ sudo gem install zentest<br />
<br />
$ sudo gem install redgreen<br />
<br />
<br />
이상 우분투에서 rails 세팅하는 방법이였습니다.<br />
<br />
내일은 java, python 세팅을 시작할 계획입니다.<br />
<br />
완료되는데로 글 올리겠습니다. 			 ]]> 
		</description>
		<category>Linux</category>

		<comments>http://redrails.egloos.com/967953#comments</comments>
		<pubDate>Wed, 07 Nov 2007 10:42:29 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 우분투 7.10 설치 전 작업 및 설치 후 기본적인 프로그램 설치법/오류사항 대처 방법 ]]> </title>
		<link>http://redrails.egloos.com/967628</link>
		<guid>http://redrails.egloos.com/967628</guid>
		<description>
			<![CDATA[ 
  <br />
1. 설치 전 파티션 설정<br />
<br />
먼저 파티션 설정에 자신 없으신 분들은 자동 설치를 권장합니다.<br />
저는 컴퓨터에 OS로 우분투 하나만 설치를 했기 때문에 데이터 백업을 위한 파티션이 필요했습니다.<br />
그래서 수동으로 파티션을 설정하여 우분투를 설치했습니다.<br />
제 컴퓨터는 80G와 15G, 두 개의 HDD를 가지고 있으며 아래와 같이 파티션했습니다.<br />
이는 웹사이트를 검색하면서 여러 번 시행착오 끝에 제 컴퓨터에 만족되는 구성을 만든 것이며 각자 본인의 취향에 따라 다를 수 있습니다.<br />
<br />
hda1    /            19G     -> 필수<br />
hda2    swap     1024M  -> 필수, 제 메모리 크기와 같게 설정, 메모리가 작다면 본인 메모리의 2배로 설정<br />
hda3    /home/자신의계정/documents    60G  -> 선택, 데이터 백업용 파티션<br />
<br />
hdb1    /home/자신의계정/vm              15G  -> 선택, 가상머신(virtualbox)을 위한 파티션<br />
<br />
설치 후 터미널에서<br />
<br />
sudo nautilus<br />
<br />
백업용 파티션과 가상머신 파티션 폴더를 마우스 오른쪽 클릭 > 속성 > 권한 탭에서 소유주, 그룹을 자신의 계정으로 설정<br />
<br />
<br />
2. 설치 완료 후 소스리스트 변경과 프로그램 업그레이드<br />
<br />
기본 소스리스트보다 다음 미러가 업그레이드 속도가 빠르다고 느껴져서 글을 남깁니다.<br />
터미널에서 아래와 같이 실행<br />
<br />
sudo gedit /etc/apt/sources.list<br />
<br />
http://kr.archive.ubuntu.com/ubuntu/<br />
을<br />
ftp://ftp.daum.net/ubuntu/<br />
로 모두 변경 후 저장<br />
<br />
sudo apt-get update<br />
sudo apt-get upgrade<br />
<br />
<br />
3. '맑은 고딕'체 적용시키기<br />
<br />
기본 글꼴보다 '맑은 고딕'체가 가독성이 좋은 것 같아서 올립니다.<br />
<br />
먼저 구글이나 기타 검색엔진을 통해서 '맑은 고딕'체를 다운로드합니다.<br />
rar파일로 되어 있으므로 압축을 풀기 위해 터미널에서 아래와 같이 실행한 후 압축 해제<br />
<br />
sudo apt-get install unrar<br />
<br />
압축 해제된 malgun.ttf 파일을 아래 폴더로 이동 또는 복사합니다.<br />
<br />
/usr/share/fonts/truetype<br />
또는<br />
/home/.fonts<br />
<br />
그리고 아래 명령 실행<br />
<br />
fc-cache -f -v<br />
<br />
시스템 > 기본 설정 > 모양새 > 글꼴 탭으로 들어가서 글꼴을 적용, "자세히"로 들어가서 각자 취향에 맞게 설정<br />
글꼴이 깨져보이면<br />
<br />
sudo gedit /etc/fonts/language-selector.conf<br />
<br />
<!-- Turn off antialias and autohint for Korean fonts depending on pixelsize --><br />
<match target="font"><br />
<test name="lang" compare="contains"><br />
<string>ko</string><br />
</test><br />
<test name="pixelsize" compare="more"><br />
<int>10</int><br />
</test><br />
        <test name="pixelsize" compare="less"><br />
<int>22</int><br />
</test><br />
        <edit name="antialias" mode="assign"><br />
<bool>false</bool><br />
</edit><br />
        <edit name="autohint" mode="assign"><br />
<bool>false</bool><br />
</edit><br />
        <edit name="hintstyle" mode="assign"><br />
<const>hintmedium</const><br />
</edit><br />
</match><br />
<br />
antialias, autohint 부분의 false를 true로 변경, 저장 후 재부팅<br />
<br />
<br />
4. virtualbox 설치 및 발생하는 오류들 대처법<br />
<br />
(1) 설치<br />
<br />
http://virtualbox.org/wiki/Downloads로 들어가서 각자 OS환경에 맞는 패키지를 다운 받습니다.<br />
패키지를 설치하고 기본적인 설정들은 아래 싸이트를 참조하세요~<br />
<br />
http://kldp.org/node/82148<br />
<br />
(2) 아래와 같은 오류 시<br />
<br />
출처 : 팁/기술정보 게시판에서 "떠돌이"님께서 올려주신 글입니다.<br />
<br />
Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might be not installed on the host computer.<br />
ResultCode: 0x80004005Component: HostInterface: IHost{81729c26-1aec-46f5-b7c0-cc7364738fdb}Callee: IMachine{31f7169f-14da-4c55-8cb6-a3665186e35e}<br />
<br />
sudo gedit /etc/init.d/mountdevsubfs.sh<br />
<br />
#<br />
# Magic to make /proc/bus/usb work<br />
#<br />
#mkdir -p /dev/bus/usb/.usbfs<br />
#domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644<br />
#ln -s .usbfs/devices /dev/bus/usb/devices<br />
#mount --rbind /dev/bus/usb /proc/bus/usb<br />
<br />
에 해당하는 부분을 찾아,<br />
<br />
#<br />
# Magic to make /proc/bus/usb work<br />
#<br />
mkdir -p /dev/bus/usb/.usbfs<br />
domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644<br />
ln -s .usbfs/devices /dev/bus/usb/devices<br />
mount --rbind /dev/bus/usb /proc/bus/usb<br />
<br />
로 아래 네 줄의 #을 삭제하여 주석을 벗겨주고 저장 후 재부팅<br />
<br />
(3) Windows XP Professional 설치 시 32분 쯤 남았을 때 멈추는 현상<br />
<br />
설정으로 들어가서 네트워크를 비활성화시킨 후 설치<br />
설치 완료 후 네트워크를 활성화시킨 후 부팅하면 이상없이 사용 가능<br />
<br />
<br />
5. Avant Window Navigator 설치<br />
<br />
출처 : 팁/기술정보 게시판에서 "범이"님께서 올려주신 글입니다.<br />
<br />
터미널에서 아래와 같이 실행 후<br />
<br />
sudo gedit /etc/apt/sources.list<br />
<br />
아래 세 줄 소스리스트에 추가 후 저장<br />
<br />
## Avant Window Navigator<br />
deb http://download.tuxfamily.org/syzygy42/ gutsy avant-window-navigator<br />
deb-src http://download.tuxfamily.org/syzygy42/ gutsy avant-window-navigator<br />
<br />
터미널에서 아래와 같이 실행<br />
<br />
wget http://download.tuxfamily.org/syzygy42/reacocard.asc -O- | sudo apt-key add -<br />
sudo apt-get update<br />
sudo apt-get upgrade<br />
sudo apt-get install avant-window-navigator-bzr<br />
sudo apt-get install awn-core-applets-bzr<br />
<br />
<br />
6. mplayer 설치 및 한글 자막 설정<br />
<br />
프로그램 > 추가/제거... 에서 mplayer로 검색해서 MPlayer Movie Player 설치<br />
실행 후 화면에서 마우스 오른쪽 키 > Preferences > Subtitles & OSD 탭에서<br />
<br />
Encoding을 Korean charset (CP949)로 변경<br />
<br />
Font 탭에서 Browse<br />
<br />
/usr/share/fonts 아래에 있는 맘에 드는 폰트 적용<br />
<br />
<br />
7. 네이트온(knateon) 설치<br />
<br />
아래 싸이트를 참조하세요~^^ 7.04(Feisty)용인데 7.10(Gutsy)에도 이상없이 돌아가더군요<br />
<br />
http://barosl.com/blog/entry/nateon-for-linux-open-beta<br />
<br />
<br />
<br />
출처 : http://cafe.naver.com/ArticleRead.nhn?clubid=10098758&menuid=&searchtype=1&query=ubuntu&searchdate=all&page=1&articleid=19052			 ]]> 
		</description>
		<category>Linux</category>

		<comments>http://redrails.egloos.com/967628#comments</comments>
		<pubDate>Wed, 07 Nov 2007 09:17:19 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Data Model Relationships ]]> </title>
		<link>http://redrails.egloos.com/963309</link>
		<guid>http://redrails.egloos.com/963309</guid>
		<description>
			<![CDATA[ 
  <br />
<br />
한국루비사용자포럼에서 가져왔습니다. <br />
<br />
출처 : http://forum.rubykr.org/viewtopic.php?t=5132<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds7.egloos.com/pds/200711/06/70/e0076370_4730309466948.png" width="500" height="579.38718663" onclick="Control.Modal.openDialog(this, event, 'http://pds7.egloos.com/pds/200711/06/70/e0076370_4730309466948.png');" /></div>			 ]]> 
		</description>
		<category>Ruby on Rails</category>

		<comments>http://redrails.egloos.com/963309#comments</comments>
		<pubDate>Tue, 06 Nov 2007 09:08:47 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
	<item>
		<title><![CDATA[ RadRails Tips ]]> </title>
		<link>http://redrails.egloos.com/962858</link>
		<guid>http://redrails.egloos.com/962858</guid>
		<description>
			<![CDATA[ 
  <br />
<br />
가장 먼저 RadRails 홈에서 제공하는[스크린캐스트](http://download.radrails.org.nyud.net:8090/video/RadRailsScreencast.mov)를 보면서 eclipse 워크벤치의 기능에 대해서 습득하기 바란다.<br />
<br />
### 빈 프로젝트만 만들어질 때<br />
<br />
윈도우 환경에서 [RadRails](http://www.radrails.org) 는[InstantRails](http://instantrails.rubyforge.org) 배포판을 필요로 한다. 따라서 처음설치시 ruby 와 rails 의 PATH 를 설정해 줄 필요가 있다. window-&gt;preferences 에서 Ruby와 Rails 의 옵션을 아래와 같이 수정할 것.<br />
<br />
| 옵션 | 설정 |<br />
|-|-|<br />
| ruby &gt; installed interpreters | name=ruby, path=c:\instantrails\ruby\bin\ruby.exe |<br />
| ruby &gt; RI/RDoc | ri=c:\instantrails\ruby\bin\ri, rdoc=c:\instantrails\ruby\bin\rdoc |<br />
| rails &gt; rails installs | name=rails, path=c:\instantrails\ruby |<br />
<br />
맥OSX 에서 이와 같은 문제를 만났다면 [이 문서에 따라서 루비와 GEM을 재설치](http://hivelogic.com/articles/2005/12/01/ruby_rails_lighttpd_mysql_tiger)한후, 아래와 같이 설정해보기 바란다.<br />
<br />
| 옵션 | 설정 |<br />
|-|-|<br />
| ruby &gt; installed interpreters | name=ruby, path=/usr/local/bin/ruby |<br />
| ruby &gt; RI/RDoc | ri=/usr/local/bin/ri, rdoc=/usr/local/bin/rdoc |<br />
| rails &gt; rails installs | name=rails, path=/usr/local/ |<br />
<br />
## Before updating scaffolding from new DB schema, try creating a table for your model (XXX)<br />
<br />
scaffold를 생성할 때 위와 같은 에러 메시지가 뜰 때가 있다. InstantRails에 함께 따라온 mysql의 인코딩과 테이블인코딩의 차이 때문에 생기는 문제인 듯. 데이터베이스 전역 charset과 테이블의 charset을 일치시키면 해결된다.UTF8을 추천한다.<br />
<br />
## WEBrick Server 추가하기<br />
<br />
Server View 에서 기존에존재하는 서버를 삭제할 경우 Rails Navigator 에서 오른쪽 클릭을 한 후 New - WEBrick Server 를이용해서 새로 추가할 수 있다. (이걸 몰라서 계속 재설치하고 삽질했던 나 자신이 부끄럽다. 알고보니 기본적으로 배포되는RadRails 문서에 잘 나와 있었다.)<br />
<br />
see also:<br />
<br />
* [Eclipse 팁](http://reiot.com/archives/312)<br />
<br />
<br />
출처 : http://reiot.com/2006/07/22/radrails-tips/#comment-262<br/><br/>tag : <a href="/tag/radrails" rel="tag">radrails</a>,&nbsp;<a href="/tag/radrailstip" rel="tag">radrailstip</a>,&nbsp;<a href="/tag/레드레일스" rel="tag">레드레일스</a>,&nbsp;<a href="/tag/레드레일즈" rel="tag">레드레일즈</a>			 ]]> 
		</description>
		<category>radrails</category>
		<category>radrailstip</category>
		<category>레드레일스</category>
		<category>레드레일즈</category>

		<comments>http://redrails.egloos.com/962858#comments</comments>
		<pubDate>Tue, 06 Nov 2007 06:56:29 GMT</pubDate>
		<dc:creator>redrails</dc:creator>
	</item>
</channel>
</rss>
