자.. 지난 3일간 삽질의 결과를 메뉴얼로 남긴다. 언제 또 이런 삽질을 할지 모르고 어디서 제목과 같이 저런 조합이 좋다고 들어서 한번 해봐야지 하는 이들에게 나름이나봐 도움이 되고자 남긴다. (도움이 된다면 코멘트라도 남겨 주시길...)
자...각설하고.. 우선 난 SVN+TRAC+SAMBA로 개발 환경을 구축하여 사용하였다. 물론 최고의 에디터인 editplus를 고수(?)의 경지에 이르렸기 때문에 굳이 무겁고 eClipse를 사용할 필요성이 있겠냐라는 생각을 했었다. 그러던 어느날 window7 x64를 설치를 하고 64비트 환경에 JDK x64와 eClipse x64의 조합이 어떨까하고 설치를 해봤는데 이거이 날라다니는 것이었다. 지난 2년전만 해도 엄청 무겁거 버그가 많았는데 3.5 버전 칼리레오는 아주 괜찮아 보였다.
그러던 중 이클립스 플러그인을 설치를 하다가 myLyn + Trac 을 이용해서 티켓을 이클립에서 관리를 하며 SVN과 연동하여 관련 개발을 하는데 있어서 아주 최적화가 되어 있지 않는가.. 그래서 연동해서 잘 썼다. 하지만 문제는 Trac Xml_RPC 플러그인을 설치를 해서 연결을 해야 하고 게다가 영어로 된 Trac(한글화 했는데도 Debian에서는 잘먹히지 않음)이 불편하다고 해서 고민중에 있는데 Best.K군이
"형님.. 요즘 RedMine이 대세입니다..."
라는 말에 솔깃해서 개발서버에 또 Ruby며 각종 패키지를 설치를 했다.
자.. Redmine 0.8 버전 설치시 관련 메뉴얼은 파일로 링크를 걸어 둔다. 물론 영어이며 워드 파일이니깐 참고를 해서 설치를 하시길 바란다. 레드마인 설치 문서들이야 구글링 하면 다 나오니깐...
이 문서는 데비안에서 apt-get 으로 설치하는 내용이므로 레뎃계열분들은 알아서 설치 하시길..(데변 만쉥이~)
자.. 일단 웹서버단은 SVN과 redMine이 설치가 되면 앞으로 해야 할 일이 몇가지가 있다.
레드마인드 서버 셋팅하기.
레드마인드 역시 Trac에 못지 않게 많은 플러그인 있었다. Trac과 MyLyn 연결은 XML-RPC와 WEB SERVER 연결 두가지로 이뤄지는데 가급적 XML-RPC를 추천한다. 하지만 레드마인은 WEB으로 연결하기 떄문에 이클립스와 연동을 위한 Connector 플러그인을 설치를 해줘야 한다.
사실 myLyn + RedMine Conntor는 존재해서 그걸로 이클립스에 설치를 해보았으나 절대 되질 않았음. XML-RPC관련 에러만 뜨고 온갖 삽질을 다해봐도 관련 문서나 내용은 찾질 못했다. 그래서 레드마인 위키를 잘 뒤져보다가 드디어 해결방안을 찾았다.
MyLyn 플러그인을 설치를 할때 보면 Web Template Connector가 있다. 이 녀석을 설치해서 이용하면 쉽게 Redmine과 연동이 가능하다.
자 연동하는 방법은 레드마인 위키에서 쉽게 찾아 볼 수 있다. 경험을 토대로 한 설정 방법을 소개 하겠다.
먼저 이클립스에서 Mylyn의 Task Repository 창에서 오른쪽 버튼 클릭을 하면 Add Task Repository가 나온다.
클릭을 하면 아래의 Connector들이 나오는데 Trac을 사용하는 유저들은 저걸 사용하면 되고 나처럼 트랙에서 벗어 나고 싶다면 Redmine Connector 저걸 사용해라.(저걸 사용하면 3일은 고생할듯..ㅋㅋㅋ~) 농담입니다.
사용해야 할 Connector는 Web Template입니다. 이 컨텍터는 Mylyn 플러그인 설치시 기본적으로 설치가 됩니다 따라서 크게 걱정하실 필요는 없습니다...
Web Template를 사용을 한다고 하면 아래의 창이 뜰것입니다. 사진은 레드마인드 홈피의 위키에서 퍼왔습니다.
위의 내용을 보면 서버 정보와 Label과 레드마인 유저정보를 입력은 쉽게 하실수 있겠죠..??
하지만 중요한건 그밑의 설정 내용들입니다..
각 설정에는 아래와 같이 입력을 해주시면 됩니다. [POST] 라고 써논것은 셀렉트박스를 선택을 하라고 한것입니다. 절대 저 내용까지 함께 넣지 마시길.. ㅜㅜ
이제 해야 할일은 Task List에 Query를 추가를 해서 레드마인에 올려져 있는 Ticket을 가져오는 일입니다.
우선 Taks List에서 오른쪽 버튼을 클릭하면 아래와 같이 창이 뜹니다. 그리고 Query를 선택해서 아까 설정한 형상관리 저장소를 선택을 합니다.
선택을 하고 나면 기본적인 설정때 추가한 내용이 자동으로 입력이 되어 있을 것입니다. 그럼 Finished를 눌러서 Task List에서 불러 오기 합니다.
그러면 제가 쓰는 개발 환경을 보시도록 하겠습니다.
클릭을 하시면 아마 크게 보실수 있을 겁니다. 좌측에 티켓발행된것들이 나오고 화면에 관련 내용이 나오죠? 개발중에 기획자가 버그 관련해서 일감을 등록하면 자동 Sync가 되어 각 개발자에게 전달이 되도록 되어 있습니다. 솔직히 개발자 입장에서는 편하죠. 관련 문서와 연동을 하면 바로 SVN의 관련 파일을 찾아서 수정이 되도록 설정을 하시면 아주 편하시겠죠..??
좀더 상세하게 설명을 할 수 있겠지만 제가 워낙 게을려서...^^; 시간도 늦었고 아무쪼록 삽질을 하시는 분들께 많은 도움이 되었으면 좋겠습니다. 앞에선 말을 짧게 하더니 지금은 왜 경어를 쓰는건지.. ㅜㅜ 삼식이..
아무튼 Best.K군에게 감사의 말씀을 전하며(그냥 트랙을 쓸까했는데 좋긴 좋더라..ㅋㅋ) 앞으로 사용을 하면서 플러그인 리뷰와 이클립스 기능에 대해 자주 올리도록 하겠습니다.
#======================= Global Settings =======================
[global]
## Browsing/Identification ###
# Change this to the workgroup/NT-domain name your Samba server will part of workgroup = dev_box
# server string is the equivalent of the NT Description field server string = %h BestPlay Development Server
# Windows Internet Name Serving Support Section:
# WINS Support - Tells the NMBD component of Samba to enable its WINS Server
# wins support = no
# WINS Server - Tells the NMBD components of Samba to be a WINS Client
# Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
; wins server = w.x.y.z
# This will prevent nmbd to search for NetBIOS names through DNS.
dns proxy = no
# What naming service and in what order should we use to resolve host names
# to IP addresses
; name resolve order = lmhosts host wins bcast
## For SVN Ver1.5.xx by namGoos!! create mask = 0644 force create mode = 0600 security mask = 0555 force security mode = 0600
#### Networking ####
# The specific set of interfaces / networks to bind to
# This can be either the interface name or an IP address/netmask;
# interface names are normally preferred
; interfaces = 127.0.0.0/8 eth0
# Only bind to the named interfaces and/or networks; you must use the
# 'interfaces' option above to use this.
# It is recommended that you enable this feature if your Samba machine is
# not protected by a firewall or is a firewall itself. However, this
# option cannot handle dynamic or non-broadcast interfaces correctly.
; bind interfaces only = yes
## access ip by namGoos hosts allow = 58.181.20.
## charset setting for windog by namGoos unix charset=utf-8 dos charset=utf-8
[Trunk]
comment = Trunk Box
path=/var/www/trunk
public = yes
writable = yes
create mode = 0664
directory mode = 0775 force user = totoro force group = www-data
[Branches]
comment = Branches Box
path=/var/www/branches
public = yes
writable = yes
create mode = 0664
directory mode = 0775 force user = totoro force group = www-data
[Tags]
comment = Tags Box
path=/var/www/tags
public = yes
writable = yes
create mode = 0664
directory mode = 0775 force user = totoro force group = www-data
[DataBox] comment = Data Boxes
path=/var/samba
public = yes
writable = yes
create mode = 0664
directory mode = 0775 force user = nobody force group = nogroup
Permission problems with working copies on a SAMBA share.
After upgrading to TortoiseSVN 1.5.x, you get a lot of "Access denied" errors for most of the Subversion commands if your working copy is stored on a SAMBA share.
Some users reported that the problem went away after they upgraded SAMBA to the latest version. If that does not help or you can't upgrade, allow readonly files to be deleted in the SAMBA config file:
저의 목적은 어디 까지나 가볍고 빠르고 영문 메뉴얼의 디테일한 설명을 기준으로 말씀을 드린다면.. zend / symfony / cakePhp 등이 있겠으나..
http://codeigniter.com 의 CI가 최고 인듯합니다. 지금 현재 이녀석으로 개발중이지만 FancyURL과 mod_rewrite의 부분이 처음에 좀 문제였지만 역시나 활용도나 확장성은 나물랄때가 없었습니다..
또한 Php4와 php5를 모두 지원하고 Db와 템플릿 등 확장성에는 제 입맛에 가장 좋았습니다. 그리고 뭐니 해도 영문 메뉴얼... PDF로 Reference 한장에 쫘악 보기 쉽게 나열 한거 부터며 상세한 메뉴얼등이 좋았구요.. 포럼과 wiki를 통해 공개 라이브러리가 쓸만한게 많더군요..
동영상으로 블로그 제작 기법등 소개 하는 메인 메뉴얼을 보시면 어떻게 구현이 되는지 충분히 이해가 되실겁니다.
프레임워크에 관심이 있으신분은 한번 보시구요.,.
가장 뭐니 뭐니해도 자신(=회사)에게 가장 필요한 부분을 제공하는 프레임워크가 최고의 프레임워크가 아닐까 합니다.
prototype URL : http://www.prototypejs.org/ 자바스크립트 프레임워크라 불리는 prototype니다. UI 쪽은 라이브러리는 전혀 없으나 프로토타입 언어 특성을 최대한 활용하여 자바스크립트 자체 기능을 확장하고 간편하게 사용할 수 있도록 되어 있습니다. prototype 자체만을 사용하기도 하지만 다른 라이브러리의 기본 토대가 되는 경우도 많습니다. 추천도 : ☆☆☆☆☆
mootools URL : http://mootools.net/ demo : http://demos.mootools.net/ UI 외에도 이벤트 처리에 강점을 보이는 라이브러리입니다. 단순한 UI 구성보다는 이벤트에 따른 다이내믹한 GUI를 구축하는 데 좋을 듯합니다. 실제 구현된 것을 보면 가볍고 빠른데다 깔끔합니다. 추천도 : ☆☆☆☆
extjs URL : http://extjs.com/ demo : http://extjs.com/deploy/ext/docs/index.html yui-ext의 확장판으로 보입니다.(거의 확실) 테마 기능이 지원되며 기반 라이브러리가 YUI 하나만 있는 게 아니라 jQuery와 prototype + scriptaculous 등 총 세가지 중 선택할 수 있습니다. 비교한 UI 라이브러리 중 가장 많은 컨트롤을 가지고 있으며 속도도 보통 정도를 유지합니다. 추천도 : ☆☆☆☆
요즘 정신없이 개발을 하다가 문득 개발자의 코딩 스타일에 많은 관심을 가지게 되면서 DBA 직종의 분들의 소스를 가끔 훔쳐 봅니다. 긴 SQL의 내용은 가로 80라인을 넘어서 New Line 보단 아래로 풀어서 쓰는게 소스 가독성면에서는 뛰어 나다는 것을 깨우치고 작년 부터 SQL 구문은 아래와 같이 사용합니다.
요즘 소리바다 웹하드 서비스인 파일바다 개발에 한참 열을 올리고 있습니다. 스토리지 이전 때문에 정신없이 시간 가는줄 모르는데 벌서 4월 중반이 되어 버렸습니다. ^^;
요즘 제가 DEBIAN LINUX에서 CGI 개발 한다고 5년만에 다시 GCC를 이용해 C 프로그램밍을 하는데 참 이거이 .. --; PHP가 참 개발 하기 편하구나라고 새삼 또 느끼게 되었습니다. 이놈의 Pointer와 메모리 선언.. 변수형등.. 그리고 함수라고는 몇개 안되고.. SI업체의 라이브러리를 사용해야 하기 때문에 문자열 함수등은 모두 자체개발을 통해 이용해야 하는데 Path경로 자르기 하나 만드는데 머리 터지는 줄 알았습니다.
기존에 PERL로 만든 FILE SYSTEM CGI만들 때도 궁시렁 궁시렁 했지만 PERL 또한 참으로 발전한 언어라고 생각이 들 정도 C의 보수적인 개발 환경.. LINUX 콘솔에서 MAN PAGE와 VI를 통한 개발은 WINDOG XP 와 EDITPLUS의 단축키에 익숙한 저로선 너무나 힘든 개발이었습니다.
하지만 여기서 중요한 것은 까탈스럽고 건조한 GCC의 환경과 C의 메모리 관리체계야 말로 시스템 개발에 가장 안정적인 환경과 메모리 누수를 막기 위한 가장 엄격하다고 할 수 있을거 같습니다. 사실 PHP로 개발을 하다 보면 에러와 Warring만 안뜨면 그냥 넘어 가지만 사실상 효율적인 코딩 스타일이 아니면 향후 Debuging 할때 많은 시간이 소요 되기 마련입니다. 사실 설계와 코딩 시간은 얼마 되지 않지만 디버깅 할때 아무리 부라우져에 찍어봐도 원인 모를 오류 때문에 시간을 많이 빼긴적이 한두번이 아니거든요...
서론이 너무 길었네요.. 본격적인 남구스의 Coding Style #1
그래서 오늘은 저의 코딩 습관에 대해 말씀 드리고 싶습니다. 제가 표준은 아니지만 나름대로의 철학(?)과 해외 유명한 코더들의 습관을 배울려고 많은 노력해서 오늘 여전히 이런 습관을 가지고 개발을 하고 있습니다. 그 중에 몇가지만 소개 하겠습니다.
IF문 비교
가장 많이 사용하시는 제어문은 IF문이 아닐까 합니다. 하지만 좀더 신경을 쓰면 디버깅 오류의 확율을 줄일 수 있습니다.
ex1) if ( TRUE === empty($val) ) { echo '$val의 값이 비어 있습니다'; }
제가 문자열 함수를 자주 사용하는 이유는 리턴값이 TRUE와 FALSE로 표현되는 것이 많은지라 IF문을 사용할 때 자주 이용합니다. 위의 보시면 PHP에서의 비교연산자 '===' 가 나오는데 생소하시는 분들도 계시고 기존의 '=='와 차이가 없을꺼라고 하실지 모르지만 분명한 차이가 있습니다.
'===' 형과 값이 같을 경우 TRUE/FALSE '==' 값이 같을 경우 TRUE/FALSE
ex2) $intValue = 1;
if ( '1' === $intValue ) { echo '$intValue = str 1'; } if ( 1 === $intValue ) { echo '$intValue = int 1'; } if ( 1 == $intValue ) { echo '$intValue = int 1'; } if ( '1' == $intValue ) { echo '$intValue = str 1'; } //print out $intValue === int 1 $intValue == int 1 $intValue == str 1
무슨 차이가 있으신지 아시겠죠..? if ( '1' === $intValue ) 부분은 '1'이 int형이 아닌 str형이라서 FALSE라 결국 거짓으로 다음 IF행을 실행하겠죠..? 형선언이 없고 자동 형변환이 PHP의 장점이긴 하나 이런 부분을 이해 없이 개발을 하다보면 어디서 버그가 생겼는지 찾기가 힘듭니다.
그러면 여기서 하나 더 보시죠.. 제가 즐겨 쓰는 변수 비교 형태입니다. 위에 보시다 시피 비교문에서 보통
if ( $intValue == '1' )
이렇게 쓰는게 보편적인것인데..
if ( '1' == $intValue )
라고 쓴 이유는 초보 분들이 간혹 이런 실수를 하시는데 '==' 비교 연산자를 '=' 대입연산자(변수 복사 연산)로 오타를 낼 경우에 값이 바뀌게 되어 버리는 경향이 있습니다.
if ( $intValue = '1' )
그래서 왜 값이 변했는지 찾기가 힘들 경우가 종종 있는데요.. 이럴때 변수 대입을 방지 하기 위해서 상수를 왼쪽에 두개 되면 상수에 변수를 대입을 할 경우 즉,
Parse error: parse error, unexpected '=' in /var/www/Process/namgoos.php on line 66
이라는 에러와 함께 종료 되기 때문에 66째 라인에가서 '=' 로 되어 있는 녀석을 '==' 로 수정 하면 금방 버그를 찾을 수 있겠죠..?
해외 phpFrameWork소스를 분석 중에 클래스와 함께 이런 형태로 많이 구현을 하고 있는 것을 보았습니다. PHP에 적절히 장점과 단점을 함께 활용한 사례라 생각되어 오늘까지 줄기차게 쓰고 있는데 혹시라도 개발자 여러분들 중에서 필요하시다면 이런 습관을 지금부터라도 바꾸신다면 디버깅하는 시간이 다소 줄어들 것이라 생각됩니다.