'분류 전체보기'에 해당되는 글 2491건

  1. 2009.04.02 웹 접근성 전문교육 [국내 자료]
  2. 2009.04.02 이클립스 주석 템플릿 파일
  3. 2009.04.01 MSTSC 원격데스크탑 접속이 안될 경우
  4. 2009.04.01 MS 2003 Server-원격데스크탑 연결
  5. 2009.04.01 윈도우즈 RDP 포트 변경하기 1
  6. 2009.04.01 naver LNB 적용 가이드
  7. 2009.04.01 Create superior Vista-style web buttons and html menus in a few clicks!
  8. 2009.04.01 Naming Guidelines
  9. 2009.03.31 XML 실전 프로그래밍
  10. 2009.03.31 개발자가 디자인할때... 참고하면 좋은싸이트
  11. 2009.03.31 지겨운 ActiveX 어떻게 지울까?
  12. 2009.03.24 JSP 코드 작성 표준 양식 - 한글판
  13. 2009.03.24 웹 개발자 가이드-실전 웹 표준 가이드 (2005)
  14. 2009.03.23 Velocity의 Developer's Guide를 따라하면서 정리해본것 입니다.
  15. 2009.03.23 웹언어별 문자열 치환방법
  16. 2009.03.23 java
  17. 2009.03.23 여러글자로 된 문자열 변환
  18. 2009.03.23 문자열 내의 특정한 문자열을 모두 지정한 다른 문자열로 변경 1
  19. 2009.03.23 Gateway timeout메세지 뜨는것
  20. 2009.03.23 HTTP 에러 코드 표 1
  21. 2009.03.20 휴대폰을 이용한 노트북 인터넷 연결하기..
  22. 2009.03.19 google 를 이용해서 SVN 저장소 만들기
  23. 2009.03.18 jsp, 자바스크립트, 다음부터 이 창을 띄우지 않음
  24. 2009.03.18 웹개발 문서 모음
  25. 2009.03.18 Download CubicExplorer [향상된 익스플러 정도...꽁짜]
  26. 2009.03.18 '웹서비스, 프로그램리뷰'
  27. 2009.03.16 <input type="image" 검색시 에러
  28. 2009.03.10 원격 데스크탑, 서버 통합 관리 프로그램 mRemote 사용기
  29. 2009.03.10 SQL에 parameter를 삽입하여 실행하는 기능
  30. 2009.03.10 서브버전(Subversion) 윈도우 서버 설치
98..Etc/Etc...2009. 4. 2. 12:01
반응형

국내 자료

웹 접근성 전문교육

2007년 정보통신공무원교육원에서 전산담당 공무원을 대상으로 진행된 웹 접근성 전문교육 중 2일차 과정입니다.

웹 접근성 준수 실무 세미나 발표자료

한국정보문화진흥원 주최로 2006년 11월 29일에 진행된 웹 접근성 준수 실무 세미나의 발표 자료

장애인 관련 통계 자료

해외 자료

민간 기업의 웹 접근성 관련 정보

웹 접근성 관련 기사/글

최종수정일 : 2007.05.27 00:03 | 최종작성자 : 백남중 (220.76.101.199)

Posted by 1010
반응형

이클립스 -> 윈도우 -> 환경설정 -> 자바 -> Code Style -> Code Templates 에 가보면

주석을 템플릿화해서 사용할수 있습니다.

제가 사용하는 설정파일을 올리니 사용하실분들은 가져다가 import 해서 사용하시기 바랍니다.


사용법은 메소드 혹은 생성자 윗부분에 /** 후 엔터를 치시면 정해진 주석이 짠~ 하고 나타나게 됩니다.
Posted by 1010
98..Etc/Etc...2009. 4. 1. 18:17
반응형
안녕하세요 향기입니다.

Windows XP에서 원격데스크탑 접속시에 아무런 오류창이나 문구없이 종료되는 현상 발생시에

아래 방법을 확인해 보시기 바랍니다.


1. Client 머신의 개인 방화벽 설정이 있다면 개인방화벽을 해제 후 테스트 해본다.
2. Geforce계열의 그래픽 카드를 사용할 경우 버젼 확인을 해본다.


1의 경우 오류메세지가 출력되겠지만, 제가 경험한 것은 2의 경우입니다.

아무런 메세지없이 종료되어서 DNS DHCP등등 레지스트리의 MSTSC의 원격 포트까지 변경을 하고 접속을
시도해 보았지만 연결이 되지 않았습니다.

이때 그래픽 카드의 버젼이 Nvidia(Geforce)계열의 경우 175.xx경우 다른 버젼으로 드라이버를 변경했더니
접속이 가능하였습니다.

제가 테스트한 Ver. 174.74 였습니다.

아무래도 Linux나 Unix 계열의 Text기반의 원격 접속이면 상관 없겠지만

Windows계열이다보니 GUI환경으로 Display를 해줘야 하는 상황이라 그래픽카드의 문제도 위와 같은
상황으로 연결되지 않나 싶습니다.

설마 했는데 정말 이것으로 해결이 되더군요..

Posted by 1010
98..Etc/Etc...2009. 4. 1. 17:58
반응형
오늘은 원격 데스트탑 연결에 대해서 알아보고자 한다.
클라이언트 컴퓨터는 데스크톱 연결을 통해 웹으로 원격지의 서버로 연결이 가능하다.
물론 터미널 서비스를 이용해서도 가능하다.

먼저 [제어판]-[프로그램  추가/제거]에서 Windows 구성요소 추가/제거를 눌러서 필요한
프로그램을 설치해야 한다.

Windows 구성요소 추가/제거를 눌러서 아래와 같이 응용프로그램 서버를 체크하고 자세히를
누른다.

여기서 자세히를 누르면 아래와 같은 화면이 나오는데 여기서 World Wide Web 서비스에 체크하고
자세히를 누른다.


위에서 자세히를 클릭하면 아래와 같은 화면이 나오고 여기서 원격 데스크탑 웹연결 선택하고
확인하고 설치한다.

이렇게 설치를 마치고 난 후 관리도구에 인터넷 정보서비스(IIS) 관리를 클릭하면 아래와 같이 생성된 것을 볼 수 있다.

여기서 tsweb을 선택하면 아래와 같이 default.htm이라는 파일이 보이는데 이것을 등록해줘야한다.

클라이언트는  원격지의 서버에 있는 터미널 서버에 웹을 이용해서 default.htm이라는 파일을 실행하는 것이다.


웹브라우저에 위에서와 같이 원격지 서버의 주소/tsweb/default.htm을 입력하면


위와 같이 로그인 화면이 나오고 여기에 로그인 정보를 입력하고 확인을 누르면 로컬에 로그온한 것 같이 익스플로어를 이용해서 원격지 서버에 접근이 가능하다.


위와 같이 원격지 서버에 접속한 화면을 볼 수 있다.

퍼옴: http://infomercial.tistory.com/143 

Posted by 1010
01.JAVA/Java2009. 4. 1. 17:36
반응형

윈도우즈 RDP 포트 변경하기

Source : http://blog.khaddar.net/814

 

지금까지 여러가지 원격 솔루션을 사용해 봤는데, 윈도우용으로는 LogMeIn이 제일 나은 듯 했으나, 역시 속도면에서는 "원격 데스크톱 연결"을 따라갈 수가 없다. Terminal Service 혹은 RDP라 불리는 이 서비스는 윈도우 XP Professional이상에는 기본으로 제공되며, 간혹 매우 유용하게 사용되는 경우가 많다.
그런데 이 RDP 서비스는 기본적으로 3389번 포트를 사용하는데, 이 포트가 막혀있는 경우가 많이 있다. 이럴 때 위에서 설명한 LogMeIn등을 사용해도 되지만, 터미널서비스의 포트 자체를 변경하는 것도 좋은 방법이 되는 경우가 많다.
포트를 변경하기 위해서는 regedit등의 레지스트리 에디터를 사용하여 다음 키들을 변경하면 된다.

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp\PortNumber
기본값: 0×00000d3d   변경값: 원하는 포트번호
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber
기본값: 0×00000d3d   변경값: 원하는 포트번호

주1) 각 키값을 변경할 때 표시형식을 10진수로 변경하여 edit하면 보다 편리하게 값을 바꿀 수 있다.
주2) 키값을 변경한 후에는 재부팅을 하거나 서비스에서 Terminal Service를 재시작시켜주면 된다.

Posted in Win32.

Leave a Reply

Posted by 1010
99.유용한정보/잡식2009. 4. 1. 00:34
반응형

LNB 적용 가이드

  • 어떤 환경의 유저도 사용하는데 불편함이 없도록 합니다.
  • 모든 서비스의 html 구조를 통일화 합니다.

적용 가이드

  • LNB영역의 NAVER 로고는 네이버 메인(http://www.naver.com)으로 링크 걸어야 합니다. (target 사용안함)
  • 네이버 서비스의 LNB는 아래와 같은 형식을 지닙니다.
  • 표현 양식은 아래 형식에서 벗어나지 않도록 하고, 내용 자체는 각각의 서비스에 맞게 수정하여 사용하도록 합니다.
  • 아래 예시는 쿽스모드로 제작 되었으며 표준모드의 경우 padding 수치에 따라 width, height 값을 변경해야 합니다.

접근성

  • 본문 바로가기 영역을 두어 스크린리더를 사용하는 유저들이 본문컨텐츠 영역으로 이동할 수 있게 해주는 스킵 네비게이션이 포함되어 있어야 합니다.
  • 스크린리더를 사용하는 유저들이 주메뉴와 서브메뉴를 명확히 인지할 수 있도록 마크업해야 합니다.
  • 검색 input box에 accesskey=s로 삽입하여 alt+s 를 이용하면 바로 검색할 수 있도록 합니다.

주의사항

  • header 영역에서 사용하고 있는 header, gnb_area, gnb_box, menu, search, skip 의 ID는 다른 부분(container, footer 등)에서 사용할 수 없습니다.
  • header 영역에서 사용하고 있는 service, banner, menu, etc, keyword, useful, bar 의 클래스명을 다른곳에서 사용할 시 서로 영향받지 않도록 합니다.
    예) #header .service { } / #content .service { } - 같은 service 라는 클래스를 사용하고 있지만 서로 영향을 주지 않습니다.

이미지

  • 이미지는 Static 서버에 업로드 하는것을 원칙으로 합니다. (http://static.naver.com/header/)
    http://static.naver.com/header/h1/ - 네이버 로고와 각 서비스명에 해당하는 이미지(h1, ul.service)
    http://static.naver.com/header/common/ - 모든 서비스에서 공통적으로 쓰일 수 있는 검색 버튼 및 아이콘 (예: 인기, NEW, UP 등)
  • 그외 이미지는 각 서비스의 호스트명과 같은 이름의 폴더에 업로드 합니다.
    (예:http://dic.naver.com/ 에서 쓰이는 이미지는 /dic/ 폴더를 생성)

목록

레이아웃

▲Top
<div id="header">
<div id="gnb_area"></div>
<h1></h1>
<div id="menu"></div>
<div id="search"></div>
</div>

구조1

▲Top
구조1
검색 영역

구조2

▲Top
구조2
GNB 영역h1 영역관련서비스 영역배너광고 영역메뉴 영역검색 영역useful 영역

GNB 영역

▲Top
<div id="gnb_area">
<iframe title="Global Navigation Bar" id="gnb_box" name="gnb_new" src="http://gn.naver.com/?tmpl=07" width="100%" height="22" frameborder="0" scrolling="no" marginheight="0" marginwidth="0">
</iframe></div>

h1 영역

▲Top
h1 영역
<h1>
<a href="http://www.naver.com"><img src="http://static.naver.com/header/h1/naver.gif" alt="NAVER" width="85" height="25"></a>
<a href="#" class="service"><img src="http://static.naver.com/header/h1/local.gif" alt="지역정보" width="83" height="25"></a>
</h1>

#header h1 {position:relative; display:inline; float:left; height:39px; margin:-4px 0 0 14px; font-size:12px;}
#header h1 img {vertical-align:top;}
#header h1 a.service {margin-left:-4px;}

관련서비스 영역

▲Top
관련 서비스
<ul class="service">
<li><a href="#"><img src="http://static.naver.com/header/h1/worldtown_s.gif" alt="월드타운" width="51" height="15"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/h1/enjoyjapan_s.gif" alt="인조이재팬" width="63" height="15"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/h1/travel_s.gif" alt="여행" width="26" height="15"></a></li>
</ul>

#header ul.service {display:inline; float:left; margin:2px 0 0 8px; overflow:hidden;}
#header ul.service li {display:inline; float:left; margin:0 10px 0 -1px; padding:0 0 0 9px; font:0/0 돋움; border-left:1px solid #dcdcdc;}

배너광고 영역

▲Top
관련 서비스
<p class="banner"><a href="#"><img src="http://imgfinance.naver.com/upload/banners/global/1194834692AIG_1030_27026.gif" width="270" height="26" alt="광고"></a></p>

#header .banner {float:right; margin:7px 1px 0 0;}

메뉴영역 1

▲Top
메뉴
<div id="menu">
<ul class="menu">
<li><a href="#"><strong><img src="http://static.naver.com/header/local/menu1_on.gif" alt="지역정보홈" width="78" height="24"></strong></a></li>
<li><a href="#"><img src="http://static.naver.com/header/local/menu2.gif" alt="교통" width="42" height="24"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/local/menu3.gif" alt="날씨" width="41" height="24"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/local/menu4.gif" alt="포토스트리트" width="86" height="24"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/local/menu5.gif" alt="테마톡톡" width="63" height="24"></a></li>
<li class="bar"><a href="#"><img src="http://static.naver.com/header/local/menu6.gif" alt="지도" width="41" height="24"></a></li>
</ul>
</div>

#header #menu {position:relative; clear:both; height:36px; _height:38px; padding:1px 0; background:#2693bc url(http://static.naver.com/header/endic/bg_lnb.gif) no-repeat left top;}
#header #menu ul.menu {display:inline; float:left; margin:6px 20px 0;}
#header #menu ul.menu li {position:relative; display:inline; float:left; margin:0 5px 0 0; vertical-align:top; font:0/0 돋움;}
#header #menu ul.menu li.bar {padding:0 7px 0 7px; background:url(http://static.naver.com/header/endic/bg_menu_bar.gif) 0 6px no-repeat;}

메뉴영역 2 - 하위메뉴가 있는 경우

▲Top
메뉴
<div id="menu">
<ul class="menu">
<li><a href="#"><img src="http://static.naver.com/header/land/menu1.gif" width="67" height="24" alt="부동산 홈"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/land/menu2.gif" width="41" height="24" alt="매물"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/land/menu3.gif" width="41" height="24" alt="시세"></a></li>
<li class="on"><a href="#"><strong><img src="http://static.naver.com/header/land/menu4_on.gif" width="42" height="24" alt="분양"></strong></a>
<span>분양 하위메뉴 시작</span>
<ul class="sub4">
<li><a href="#">파워분양정보</a></li>
<li><a href="#">분양뉴스·리포트</a></li>
<li><a href="#">미분양</a></li>
<li><a href="#">현장탐방</a></li>
<li><a href="#">호재분석</a></li>
<li><a href="#">경쟁률·당첨확인</a></li>
<li><a href="#">청약가이드</a></li>
</ul>
<span>분양 하위메뉴 끝</span>
</li>
<li><a href="#"><img src="http://static.naver.com/header/land/menu5.gif" width="92" height="24" alt="뉴스·투자정보"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/land/menu6.gif" width="62" height="24" alt="커뮤니티"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/land/menu7.gif" width="69" height="24" alt="경매·공매"></a></li>
<li><a href="#"><img src="http://static.naver.com/header/land/menu8.gif" width="41" height="24" alt="등기"></a></li>
</ul>
</div>

#header #menu {position:relative; clear:both; height:72px; _height:74px; padding:1px 0; background:#22738e url(http://static.naver.com/header/land/bg_lnb.gif) no-repeat left top;}
#header #menu ul.menu {display:inline; float:left; margin:6px 20px 0; background:none;}
#header #menu ul.menu li {position:relative; display:inline; float:left; margin:0 5px 0 0;}
#header #menu ul.menu li img {vertical-align:top;}
#header #menu ul.menu li.bar {padding:0 7px 0 7px; background:url(http://static.naver.com/header/land/bg_menu_bar.gif) 0 6px no-repeat;}
#header #menu ul.menu li span {display:none;}
#header #menu ul.menu li ul {display:none; position:absolute; left:9px; top:44px; width:700px; overflow:hidden;}
#header #menu ul.menu li ul li {margin:0 10px 0 -1px; padding:0 0 0 10px; background:url(http://static.naver.com/header/land/bg_menu_bar2.gif) no-repeat left top;}
#header #menu ul.menu li ul li a {color:#5b5b5b;}
#header #menu ul.menu li.on ul {display:block;}
#header #menu ul.menu li.on ul.sub4 {left:-125px;}

검색영역

▲Top
검색영역
<div id="search">
<p>...</p>
<fieldset>
<legend>검색</legend>
<input type="text" class="keyword" title="검색어" accesskey="s">
<input type="image" src="http://static.naver.com/header/common/btn_search.gif" width="45" height="23" alt="검색" class="btn_search">
</fieldset>
<dl class="keyword">...</dl>
</div>

#header #search {position:relative; height:36px; background:#f8f8f8 url(http://static.naver.com/header/endic/bg_lnb.gif) no-repeat left bottom;}
#header #search fieldset {padding:7px 0 0 294px; color:#c4c4c4; text-align:left;}
#header #search fieldset .keyword {width:230px; height:21px; margin-left:1px; padding:3px 3px 0; border:1px solid #bababa;}

광고문구 영역

▲Top
검색영역
<div id="search">
<p><a href="#">우리가게 무료홍보! <strong>지역업체 등록하기</strong> <img src="http://static.naver.com/header/local/btn_go.gif" width="17" height="12" alt="GO"></a></p>
<fieldset> ... </fieldset>
<dl class="keyword"> ... </dl>
</div>

#header #search p {position:absolute; left:29px; top:13px; _top:14px; font:11px 돋움;}
#header #search p strong {display:inline; color:#ff5300; font-weight:normal;}
#header #search p a {color:#666;}
#header #search p a:hover {color:#ff5300;}

인기검색어 영역

▲Top
인기검색어
<div id="search">
<p> ... </p>
<fieldset> ... </fieldset>
<dl class="keyword">
<dt><img src="http://static.naver.com/header/common/icon_popular2.gif" width="29" height="16" alt="인기"></dt>
<dd>
<a href="#">용인 맛집</a>,
<a href="#">설악산 펜션</a>,
<a href="#">수원 부동산</a>
</dd>
</dl>
</div>

#header #search dl.keyword {position:absolute; right:0; top:10px; width:340px; padding-top:1px; font-size:11px; line-height:14px; text-align:center;}
#header #search dl.keyword dt {display:inline;}
#header #search dl.keyword dt img {margin:-1px 2px 1px 0; _margin:-2px 2px 2px 0; vertical-align:middle;}
#header #search dl.keyword dd {display:inline; color:#5b5b5b;}
#header #search dl.keyword dd a {color:#5b5b5b;}

useful 영역

▲Top
useful
<div id="search">
<p> ... </p>
<fieldset> ... </fieldset>
<ul class="useful">
<li><a href="#"><em>경제 유니버시아드</em></a></li>
<li><a href="#">기업정보</a></li>
<li><a href="#">금융감독위원회</a></li>
</ul>
</div>

#header #search ul.useful {position:absolute; right:19px; top:13px; white-space:nowrap;}
#header #search ul.useful li {display:inline; margin:0 -1px 0 1px; padding:0 10px 0 9px; font-weight:bold; background:url(http://static.naver.com/header/finance/bg_useful_bar.gif) no-repeat right top;}
#header #search ul.useful li a {color:#5b5b5b;}
#header #search ul.useful li a em {color:#00860a; font-style:normal;}
#header #search ul.useful li a:hover em {text-decoration:underline;}

접근성 - 스크린리더 데모 & 소스

▲Top
스킵 네비게이션

  <!-- Header -->
  <div id="skip"><a href="#start">메뉴건너뛰고 본문 바로가기</a></div>
  <div id="header">

  ...

  <!-- //Header -->
  <div id="start" class="skip"><a name="start">본문시작</a></div>


검색 바로가기

  <input type="text" class="keyword" name='keyword' title="검색어" accesskey="s">

주메뉴와 하위메뉴 구분

  <ul class="menu">
  <li class="on"><a href="#"><strong><img src="img/menu1_on.gif" width="61" height="22" alt="영어사전"></strong></a>
  <span>영어사전 하위메뉴 시작</span>
  <ul>
  <li><a href="#"><strong>영어사전1</strong></a></li>
  <li><a href="#">영어사전2</a></li>
  <li><a href="#">영어사전3</a></li>
  <li><a href="#">영어사전4</a></li>
  <li><a href="#">영어사전5</a></li>
  </ul>
  <span>영어사전 하위메뉴 끝</span>
  </li>
Posted by 1010
반응형

Create superior Vista-style web buttons and html menus in a few clicks!

Vista Buttons helps you create Vista/XP/Win98/Mac rollover html buttons and html drop down menus with ease.

New!  Vista Buttons V3.05

Vista Web HTML Buttons Examples

Vista HTML Buttons
for Windows (Ver: 3.05, 4MB)  
Vista Web Buttons   Easy to Use

With Vista Web Buttons clear and comprehensible interface, you need just 4 simple steps to get your web buttons or html menu ready and if you use a pre-designed sample as a base you'll end up even faster!


HTML Buttons Screeshot 1 HTML Button Screeshot 2

Vista HTML Buttons   Great Looking Web Navigation with Minimum Effort

Vista Buttons provides 500+ web buttons, 100 submenu designs, 6600+ icons, 50 ready-made samples, so you'll create really nice looking website html menus and html buttons with little or no design skills at all! Vista, XP, Win98, Mac, Aqua buttons, round, glossy, metallic, 3d styles, tab menus, drop down menus will be a breeze!


Vista Buttons   High Quality and Professional Results

You don뭪 have to know HTML, JavaScript, CSS or any other coding languages to make multi-state rollover web buttons, professional cross-browser, search engine friendly DHTML menus. All you have to do is make some clicks and adjust buttons as you wish for them to appear. Vista Web Buttons will generate all necessary images, html, javascripts, css styles automatically!


Vista Buttons   Fully Customizable

Every button or menu parameter can be easily customized in Vista Buttons to fit your web site design and your needs. Create your very own html menus, as simple or as complex as you want!


Vista Buttons   Cost Effective

Stop paying month-to-month subscription to web image and icon collections! Don't waste your money on licenses for every new domain where you want to place the menu! Pay once, use for life, anywhere!

Posted by 1010
98..Etc/Etc...2009. 4. 1. 00:31
반응형
스킨 수정에 참고하기 위헤 스크랩합니다.
원문주소; http://html.nhndesign.com/guidelines/naming/


Naming Guidelines

  1. CSS 파일 네이밍
  2. id/class 선택자 선언 규약
  3. id/class 선택자 네이밍 가이드
  4. Image 네이밍 규약
  5. Image 네이밍 가이드
  6. Update History
  • (X) 허용 안함
  • (△) 예외 허용
  • (O) 적극 권장

1. CSS 파일 네이밍

CSS 파일을 여러개로 나누는 경우 HTTP 요청이 늘어나서 웹페이지 전송속도에 좋지 않은 영향을 주게 되므로 파일의 수는 최소한으로 유지합니다. 사이트 루트 디렉토리에 /css/ 폴더를 생성하고 전역에 쓰이는 파일의 이름은 default.css 으로 지정합니다.

/css/default.css
모든 스타일을 포함하는 파일

/css/popup.css
팝업등 새로운 페이지 유형이 존재하는 경우 별도로 분리

2. id/class 선택자 선언 규약

▲Top

아래와 같이 정형화 된 요소들에 대한 네이밍은 'id/class 선언규약'에 따릅니다. 단, 아래 예는 되도록 복잡한 상황을 재현한 것으로서 특히 #wrap, .colgroup과 같은 그룹핑은 필수적이지 않다면 제외하는 것이 바람직 합니다. 동일한 의미를 지닌 id/class 가 복수로 존재해야 하는 경우 선택자 뒤에 숫자를 붙여서 확장합니다. 예제보기.

#wrap : 감싸기
#header : 헤더
.gnb : Global Navigation Bar
.lnb : Local Navigation Bar
.search : Search Form
#container : 콘테이너
.spot : 강조하는 상위 콘텐츠
.snb : Side Navigation Bar
.account : 계정
.ad : 광고
.colgroup : 컬럼 그룹핑
#content : 본문 표시
.path : 문서 경로 표시
.article or .section
: 기사 또는 섹션 그룹핑
.article or .section
: 기사 또는 섹션 그룹핑
.aside : 곁가지
.ad : 광고

#footer : 풋터
  • #wrap :
    페이지(#header, #container, #footer) 전체를 지정 합니다.
  • #header :
    로고를 포함한 상단 영역(보통 .lnb 포함)을 지정 합니다.
  • #container :
    #header 와 #footer 를 제외한 본문 전체를 지정 합니다.
  • <address> 를 포함한 하단의 보조 네비게이션 영역을 지정 합니다.
  • .gnb :
    최상위 공통 네비게이션(Global Navigation Bar)을 지정합니다. 보통 수평(bar)형태로 표현되며 #header 에 종속된다. 수직으로 표현되는 경우는 거의 드물지만 그러한 경우 #header 에 종속되지 않을 수도 있습니다.
  • .lnb :
    현재 서비스의 지역(Local Navigation Bar) 네비게이션을 지정 합니다. 보통 수평(bar)형태로 표현되며 #header 에 종속된다. 수직으로 표현되는 경우는 거의 드물지만 그러한 경우 #header 에 종속되지 않을 수도 있습니다.
  • .search :
    현재 페이지의 주요 검색영역을 지정합니다.
  • .snb :
    .gnb, .lnb 를 제외한 측면(Side Navigation Bar) 네비게이션 영역을 지정합니다. 보통 #container 에 종속되고 수직으로 표현되지만 수평으로 표현되는 경우도 있으므로 #header 에 종속되는 등 예외의 경우도 있을 수 있습니다.
  • .account :
    로그인 폼 및 로그인 후 개인 계정을 표시하는 영역을 지정합니다.
  • .colgroup :
    컬럼 형태의 내용블럭을 그룹핑 합니다.
  • #content :
    반드시 #container 내부에 종속되며 보통의 경우 .snb 영역과 .aside 영역을 제외한 핵심 콘텐츠 영역을 지정합니다.
  • .aside :
    문서의 주요 부분을 표시하고 남은 콘텐츠 영역(곁가지 메뉴 따위)을 지정합니다.
  • .spot :
    강조하는 상위 콘텐츠이며 항상 #container 에 종속될 필요는 없습니다.
  • .path :
    현재 페이지의 경로를 지정합니다. 보통 #container 또는 #content 에 종속됩니다.
  • 네비게이션 요소를 지정합니다. .gnb, .lnb, .snb 등 어떤 영역 내부에 하나 또는 복수의 네비게이션 요소가 존재할 때 .*nav* 클래스를 지정합니다. '*' 표시는 다른 단어 또는 숫자와 조합할 수 있다는 의미 입니다.
  • .*section* :
    콘텐츠를 분할하거나 그룹핑 하는 블럭 입니다. 보통 #content 내부에 배치한 다음 heading 태그(h1~h6)와 함께 사용하는 것을 권장합니다. '*' 표시는 다른 단어 또는 숫자와 조합할 수 있다는 의미 입니다.
  • .article :
    기사 또는 포스트와 같이 기술된 내용의 콘텐츠를 지정합니다.
  • .ad :
    광고 또는 배너를 지정합니다.
  • etc :
    여기서 기술하지 않은 id/class 네이밍은 이하 'id/class 생성 및 네이밍 가이드'에 따릅니다.

3. id/class 선택자 네이밍 가이드

▲Top
  • id는 화면을 분할 하거나 동적 UI를 구현해야 하는 경우에만 생성합니다. id사용이 필수적으로 요구되지 않는 요소는 class를 생성합니다.
  • 영문 소문자만 사용 가능하며 숫자언더바(_) 사용이 가능합니다. 영문 대문자 및 기타 언어와 특수문자는 사용하지 않습니다.
  • 가능하다면 의미에 적합하고 직관적인 하나의 단어를 사용하고, 화면 배치 또는 시각적 효과를 의미하는 단어의 선택은 지양합니다.
  • 2개 이상의 단어를 조합하는 경우 언더바(_)로 연결합니다. 단어와 숫자를 조합하는 경우 언더바(_)를 생략합니다.
  • 숫자로 시작할 수 없으며 숫자의 증가는 "1" 부터 시작됩니다. 숫자가 없는 단어는 통상 "1" 이라는 숫자가 생략된 것으로 간주합니다.
    .nav01 (X) 클래스 이름을 이용한 스크립트 작성시 1~9까지 예외적으로 "0"을 추가해야 하므로 구현 이슈 발생
    .nav1 (O)
  • 두문자어 또는 약어를 사용하더라도 직관적으로 이해할 수 있는 경우 단어를 축약할 수 있습니다.
  • 보편적인 이름을 지닌 class는 항상 충돌 가능성이 존재하므로 가급적 부모 선택자에 종속 시킵니다.
    (△) .more 라는 클래스 이름을 더 이상 사용할 수 없음
    .more {...}

    (O) .more 라는 클래스 이름을 여러번 재 사용할 수 있음
    .section .more {...}
    .aside .more {...}
  • 모든 영역에 동일한 표현으로 재 사용되는 전역 스타일인 경우 다른 선택자에 종속시키지 않습니다.
    .gnb fieldset{border:none;} (△) 전역 스타일을 특정 영역에 종속시켜 재 사용성이 떨어짐
    fieldset{border:none;} (O) 보통의 경우 fieldset을 이용하여 border를 표현하지 않으므로 어떤 선택자에도 종속시키지 않음

4. Image 네이밍 규약

▲Top

아래 제시된 종류의 이미지 이름들은 각각의 목적에 맞는 형태로 사용될 수 있도록 예약되어 있습니다. 아래 표현들은 다른 목적으로 사용하거나 독창적인 형태로 변형하여 사용하지 않습니다. "*" 표시는 해당 이미지의 의미나 상태를 가장 잘 표현할 수 있는 단어로 치환하거나 또는 생략할 수 있습니다. 네이밍의 순서는 '대분류-중분류-소분류' 또는 '형태-의미-상태' 순입니다. 동일한 용도의 이미지가 여러개인 경우 마지막 단어에 숫자를 붙여서 다르게 네이밍 합니다.

분류 예약어 설명 권장표현
형태 형태+의미+상태
제목 h*_* h_* 불특정 레벨의 제목 제목 태그로 마크업되는 이미지 요소. 전경
h1_* 제목 1
h2_* 제목 2
h3_* 제목 3
h4_* 제목 4
h5_* 제목 5
h6_* 제목 6
문장 p_* p_* 문장 통상 p 요소로 마크업되는 이미지 형태의 텍스트. 전경
네비게이션 gnb_* gnb_* 글로벌 네비게이션 목적의 버튼 또는 탭. 전경
lnb_* lnb_* 로컬
snb_* snb_* 사이드
tab_* tab_* gnb, lnb, snb에 포함되지 않으며 탭으로 분류되는 버튼 또는 버튼의 배경. 전경/배경
버튼 btn_* btn_list_* 목록 모든 종류의 버튼. 전경
btn_read_* 읽기
btn_write_* 쓰기
btn_modify_* 수정
btn_delete_* 삭제
btn_reply_* 답변
btn_cancel_* 취소
btn_search_* 검색
btn_find_* 찾기
btn_registeration_* 등록
btn_confirm_* 확인
btn_submit_* 전송
btn_upload_* 업로드
btn_download_* 다운로드
btn_install_* 설치
btn_file_* 파일
btn_stop_* 정지
btn_play_* 실행
btn_prev_* 이전
btn_next_* 다음
btn_up_* 위로
btn_down_* 아래로
btn_zip_* 우편코드찾기
btn_go_* 페이지 이동
btn_refresh_* 새로고침
btn_open_* 열기
btn_close_* 닫기
btn_zoom_* 확대
btn_reduction_* 축소
btn_spread_* 펼치기
btn_unfold_* 접기
btn_lock_* 잠금
btn_unlock_* 해제
박스 bx_* bx_*_top 상단 상자의 선과 모서리 표현. 배경
bx_*_mid 중앙
bx_*_btm 하단
bx_*_lt 좌상단
bx_*_rt 우상단
bx_*_lb 좌하단
bx_*_rb 우하단
블릿 bu_* bu_square 사각 의미를 포함하지 않는 장식적 bullet/icon 표현. 배경
bu_circle 원형
bu_arrow 화살
bu_star
아이콘 ico_* ico_num* 숫자 의미를 포함하는 장식적 icon 표현. 전경
ico_english_* 영문
ico_korean_* 한글
ico_japanese_* 일어
ico_chinese_* 중어
ico_attention 주의
ico_up 상향
ico_down 하향
ico_point_star 별점
ico_star
ico_new 신규
ico_update 업데이트
ico_reply 댓글
ico_target_blank 새창
line_* line_h 수평 보통 콘텐트를 구분하기 위한 목적의 실선 또는 점선. 배경
line_v 수직
line_s 슬래시
line_bs 역슬래시
line_h_dot 수평 점선
line_v_dot 수직 점선
배경 bg_* bg_body 전체 블릿, 버튼, 선 종류 이외의 배경처리 이미지. 보통 일러스트. 배경
bg_head 상단
bg_container 콘테이너
bg_spot 스팟
bg_footer 풋터
bg_lnb 로컬 네비게이션
상태변화 *_off
*_over
*_on
tab_*_off 비활성 비활성/오버/활성 상태에 대한 표현. 전경/배경
tab_*_over 오버, 포커스
tab_*_on 활성
광고 ad_* ad_* 광고 모든 종류의 배너 광고. 전경
임시 @* @thumb 썸네일 통상 DB에서 불러오게되는 임시 이미지 요소. 전경
@photo 사진
@ad 광고

5. Image 네이밍 가이드

▲Top
  • 명명 순서 :
    큰 범주의 분류에서 작은 범주의 분류 순으로 명명합니다. 분류는 가급적 3단계를 초과하지 않도록 합니다. '대분류_중분류_소분류' 또는 '형태-의미-상태' 순으로 명명합니다.
    추천베스트
    on_recommend_tab1.gif (X)
    tab1_recommend_on.gif (O) 탐색기에서 탭메뉴끼리 정렬되므로 빠르게 찾을 수 있습니다
  • 단어 선택 :
    최대한 직관적이어야 하고 짧을수록 좋습니다. 가능하다면 이미지의 대체텍스트 역할을 수행할 수 있는 네이밍을 우선적으로 고려합니다.
    검색
    btn.gif (X) 어떤 의미의 버튼인지 직관성이 떨어집니다
    btn_search_naver_mail.gif (X) 직관적이지만 지나치게 깁니다
    bnms.gif (X) 너무 짧아서 의미를 유추하기 어렵습니다
    btn_search_mail.gif (O) 적당히 짧으면서도 직관적입니다
  • 허용 문자 :
    영문 소문자(abc)와 숫자(123) 및 언더바(_) 사용이 가능합니다. 영문 대문자 및 기타 언어와 특수문자는 사용하지 않습니다.
    Btn_Search.gif (X) 대문자가 사용되었습니다
    btn-search.gif (X) 언더바 이외의 특수문자가 사용되었습니다
    btn_search.gif (O)
  • 조합 규칙 :
    '단어+단어', 또는 '숫자+숫자'는 언더바(_)로 조합합니다. 단어와 숫자를 조합하는 경우 언더바(_)는 생략합니다.
    tab1recommendon.gif (X) 단어 사이를 언더바로 조합하지 않아서 판독성이 떨어집니다
    tab_1_recommend_on.gif (X) 단어와 숫자 사이의 언더바가 생략되지 않았습니다
    tab1_recommend_on.gif (O) 단어 사이는 언더바로 조합하고 단어와 숫자 사이의 언더바는 생략 하였습니다
  • 숫자 규칙 :
    숫자로는 시작할 수 없으며 숫자의 증가는 "1" 부터 시작됩니다. 숫자가 없는 단어는 통상 "1" 이라는 숫자가 생략된 것으로 간주합니다. 단, "01" 형식으로 시작되는 예외상황도 있을 수 있습니다.
    1btn_search.gif (X) 숫자로 시작되어 이미지의 용도와는 관계없이 탐색기에 정렬됨
    num01.gif (△) 클래스 이름을 이용한 스크립트 작성시 1~9까지 예외적으로 "0"을 추가해야 하므로 구현 이슈 발생하나 예외상황 허용
    btn_search1.gif (O) 동일한 의미를 지닌 이미지가 여러개인 경우 숫자를 붙여서 구분 합니다
    btn_search.gif (O) 동일한 의미를 지닌 이미지가 없다면 숫자는 생략 합니다

 

Posted by 1010
반응형

XML Article

XML Beans : XMLBeans는 스키마 기반으로 XML 인포셋 전체에 커서 기반으로 접근할 수 있도록 하는 XML-Java binding tool이다. BEA Systems에 의해 개발 되었으며 2003년에 아파치 프로젝트에 기증 되었다. 기존의 SAX와 Dom등의 방식으로 XML 코딩을 하다 보니 코드 자체가 길어져 개발 및 유지보수하는데 어려움이 많았다. 이 같은 단점은 보완하기 위한 새로운 방법을 제시하고 있다.

XML 라이브러리

  • Xstream : 눈여겨 볼만한 놈.

XML 실전 프로그래밍

Posted by 1010
반응형

개발자는 보통 공돌이 or 공순이 로 이루어진 집단으로

미적 감각과는 거리가 먼 사람들이다..

하지만 가끔 들어오는 홈페이지 제작 알바에서...

디자이너 없이 개발자 혼자 뚝딱하는 경우가 있다.

색조합은 보통 좀 있어 보이는 싸이트를 스샷해서 설정하고.

폰트도 비슷하게 만들어 놓고.. 결국 배낀다는 소리;;

배껴도 좋게 배껴야지 않을까?

오늘 백탄왕이 좋은 싸이트를 알려줬다.


http://html.nhndesign.com/

http://ui.daum.net/guideline

http://guide.nhndesign.com/naver/2005/naver_header01.html


자 이제 잘 배껴보자.



출처 : http://hengki.net/5

Posted by 1010
반응형
국가사이버안전센터에서 지겨운? 엑티브엑스를 제거하는 프로그램이 3.6일자로 배포가 됐습니다. 사용하지 않는 엑티브엑스를 선택해 지울수 있어 유용할 것 같습니다. 컴퓨터와 인터넷 속도 향상을 느껴보세요
사용방법은 아래와 같습니다.


■ 개 요

o 각종 인터넷 사이트에서 보안통신, 동영상재생 등을 위해 배포하는 ActiveX Control 프로그램들이 PC에 한번 설치되면 자동으로 지워지지 않아 해킹에 악용될 우려가 있음에 따라

o 일정기간(15, 30, 60일) 이상 사용되지 않고 있는 ActiveX Control을 삭제하는 보안프로그램 'CleanAX'를 배포하오니 월 단위 실행 등으로 인터넷 PC의 청소에 활용하시기 바랍니다.



■ 'CleanAX' 프로그램 설치 및 사용 방법
o 프로그램 설치 방법
  - 본 권고문의 상단에 있는 '첨부파일'을 클릭, PC의 임의 폴더에 설치파일을 저장
  - 설치파일 'Setup_CleanAX.exe'를 실행하면 나타나는 화면에서 "확인" 버튼 클릭
    * 설치 환경 : 윈도우 XP, Vista

o 프로그램 사용 방법
  - 바탕화면에 있는 'CleanAX' 아이콘을 클릭하여 프로그램 실행

 

  - 기본적으로 "30일 이상 사용되지 않은 ActiveX Control"이 조회되며 화면 하단의 "삭제" 버튼을 클릭하면 조회된 모든 ActiveX Control이 삭제됨
  * 60일 또는 15일로 기간 변경은 화면 상단의 해당 메뉴 클릭으로 가능

 
o 프로그램 제거 방법
  - 시작->모든 프로그램->CleanAX의 "Uninstall" 실행
  - 삭제 안내 창에서 "'확인" 버튼 클릭



Posted by 1010
90.개발관련문서2009. 3. 24. 11:11
90.개발관련문서2009. 3. 24. 10:59
반응형

웹 개발자 가이드

실전 웹 표준 가이드 (2005)

본 가이드는 XHTML, CSS, DOM, ECMAScript 등 모든 웹 표준에 대한 이슈를 새롭게 정리하고, 웹 개발 프로젝트에서 표준을 준수하는 방법을 제공하는 가이드 입니다.

목 차

다운로드 PDF 파일 (223p), PDF 파일(부록 포함, 305pp)
  • 웹 표준이란 무엇인가?
  • 실전 XHTML 가이드
    • XTHML 소개
    • XHTML 일반 문법 준수
    • 구조적 XHTML 사용 방법
  • 실전 CSS 레이아웃
    • CSS 개념 및 소개
    • CSS 레이아웃(LAYOUT) 기초
    • 실전 예제를 통한 CSS 레이아웃
    • 고급 CSS 레이 아웃
  • 실전 DOM/Script 가이드
    • W3C DOM vs. MS DOM
    • 표준 JAVASCRIPT 사용 방법
    • 올바른 플러그인(PLUGIN) 사용
  • 실전 표준 웹 프로그래밍
    • 표준 MIME 타입 설정
    • 표준 문자 인코딩 지정
  • 실전 웹 표준 개발 프로세스
    • 현재 프로세스 소개(Waterfall 방식)
    • 개선된 모델(퍼블리셔 중심)
    • 새로운 개발 프로세스
  • 맺음말
  • 부록 : 웹 표준 사양-브라우저 호환차트
- URL: http://www.mozilla.or.kr/docs/web-developer/web-standard-guide-2005.pdf

웹 표준 기반 홈페이지 구축 가이드 (2004)

본 가이드는 브라우저 호환성 유지 방법은 물론 XHTML/CSS 레이아웃을 통한 홈페이지 개발 방법을 소개한 가이드 입니다.

목 차

  • 1부 브라우저 호환성 유지 방안
    • 현대 웹사이트 제작의 방향
    • W3C 표준안
    • 정확한 문서 형식 사용
    • 올바른 HTML 및 CSS 사용 방법
    • 올바른 객체 모델 및 자바스크립트 사용 방법
    • 웹페이지 디버깅 도구 사용
  • 2부 웹표준 기반 페이지 제작 방법
    • 구조와 표현의 분리
    • XHTML를 사용해야 하는 이유
    • XHTML의 주요 특징
    • CSS 사용 방법
    • CSS 레이아웃 vs.Table 레이아웃
- 인쇄 버전 : PDF 파일

Cross Browsing 가이드(2003)

본 가이드는 각 웹 브라우저의 비 표준 기능과 이를 극복할 수 있는 방법을 위주로 작성된 것입니다.

목 차

- 인쇄 버전 : PDF 파일
Posted by 1010
98..Etc/velocity2009. 3. 23. 15:10
반응형

Velocity의 Developer's Guide를 따라하면서 정리해본것 입니다.


Download(다운로드)

우선 Velocity 배포본을 다운로드 받는다.

그리고 Ant 를 다운받는다.


Dependencies(의존성)

개발을 위해서는 Java 2 Standard Edition SDK (Software Development Kit)이 필요하고,

Velocity를 실행시키기 위해서는 Java 2 Standard Edition RTE (Run Time Environment)이 필요하다.(물론 RTE 대신에 SDK를 사용하는것도 가능하다.)


Velocity는 다음 세가지의 패키지에 의존성을 가지고 있다.

Jakarta Commons Collections - 반드시 필요함.

Jakarta Avalon Logkit - 선택적이지만 Velocity에서 파일기반의 logging을 위해서는 필요하다.

Jakarta ORO - 선택적이지만 org.apache.velocity.convert.WebMacro 템플릿 변환 툴을 사용하기 위해서는 필요하다.

이 패키지들은 build/lib 폴더안에 넣거나 classpath에 추가하면 된다.


How Velocity Works(Velocity는 어떻게 움직이는가)

Velocity를 사용하여 어플리케이션이나 서블릿을 개발할 때는 보통 다음과 같은 과정을 거친다.


1. Velocity의 초기화

2. Context 객체의 생성

3. Context에 사용자의 데이터 객체(data objects)를 추가한다.

4. 템플릿을 선택한다.

5. 산출물(output)을 만들기 위해 템플릿과 사용자의 데이터를 병합(Merge)한다.


code로 이 과정을 표현하면 다음과 같다.

이 파일은 org.apache.velocity.app.Velocity.java 인데, 실제 자신이 어플리케이션을 개발할 때에도 이러한 패턴으로 작성하면 된다.

import java.io.StringWriter; 
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.MethodInvocationException;
Velocity.init(); // 1.Velocity의 초기화  
VelocityContext context = new VelocityContext(); 
// 2.Context의 생성
context.put( "name", new String("Velocity") ); 
// 3. Context에 사용자의 데이터 객체(data objects)를 추가한다.


Template template = null;
try { 
template = Velocity.getTemplate("mytemplate.vm");
// 4. 템플릿을 선택한다.
} catch( ResourceNotFoundException rnfe ) {
// couldn't find the template
} catch( ParseErrorException pee ) {
// syntax error : problem parsing the template
} catch( MethodInvocationException mie ) {
// something invoked in the template
// threw an exception
} catch( Exception e ) {}
StringWriter sw = new StringWriter(); 
template.merge( context, sw ); 
// 5. 산출물(output)을 만들기 위해 템플릿과 사용자의 데이터를 병합(Merge)한다.
figure 1. velocity의 작동 과정의 예
 

The Context(컨텍스트)

Velocity에서 Context 라는것은 가장 핵심의 요소면서, 시스템의 부분들사이에서 데이터를

손쉽게 이동시킬 수 있는 일종의 컨테이너(Container)다.

즉, 이말은 Context가 실제 Java Layer와 Template Layer간의 데이터를 주고 받을 때, 그 운반체의 역할을 한다는 말과 같다.

Context는 Java의 Map과 같은 형태를 취한다. key-value의 쌍으로 구성되기 때문에,

Java에서 일반적으로 사용되는 Map을 다룰때와 같이 다루면 된다.


Velocity Template Language(밸로시티 템플릿 언어)

VTL은 Template에서 사용되는 Velocity 고유의 언어를 의미한다.

실제 Template파일을 열어서 코드를 보면 따로 설명을 하지 않아도 충분히 이해할 수 있을만큼 간단한 형태를 보여준다.

example중에서 app_example1의 example.vm을 열어보면 다음과 같은 코드를 볼 수 있다.


## This is an example velocity template

#set( $this = "Velocity")

$this is great! but it's so hard.

#foreach( $name in $list )
    $name is great!
#end

#set( $condition = true)

#if ($condition)
    The condition is true!
#else
    The condition is false!
#end   


figure 2. template의 예

 

 

References(참조형)

variables(변수) - Velocity에서 변수는 다음과 같이 $를 먼저 쓰고 그 뒤에 식별자를 적어주는 방식으로 사용한다.

$foo


property(특성) - 프로퍼티도 다음과 같이 $다음에 식별자를 쓰고, 마침표(.)후에 다시 식별자의 형태로 사용한다.

$foo.name


method(메소드) - 메소드도 역시 $다음에 식별자를 쓰고, 마침표(.)후에 호출할 메소드의 이름을 적는다.

$foo.getName()


Directives(지시형)

#set - reference의 값을 설정한다.

#if/elseif/else - 조건문 제어

#foreach - 반복문 제어

#include - velocity로 파싱(parsing) 되지 않은 파일의 출력

#parse - velocity로 파싱(parsing) 된 파일 출력

#stop - template 엔진의 정지

#macro - 반복적으로 사용할 vm 정의


Comment(주석)

## - 한줄짜리 주석

#* ... *# - 여러줄짜리 주석


The Examples(예제)
Velocity 배포본의 디렉토리 구조는 다음과 같다.

figure 3. velocity 배포본의 디렉토리 구조


일단 실제 Velocity의 소스를 볼 수는 없고 Velocity가 무엇인지 맛부터 보는것이 좋을것이다.

그래서 필요한것이 바로 examples를 이용하는 것이라고 볼 수 있겠다.

우선 앞서 다운받은 Ant가 설치가 되어있어야 한다. Ant의 설치는 별다른게 아니라

압축을 풀고, 자신이 원하는 위치에 이 Ant디렉토리를 위치시킨 다음에

classpath에 ANT_HOME의 이름으로 Ant디렉토리를 등록시켜주면 된다.

(물론 path에 %ANT_HOME%\bin도 추가해줘야한다.)


콘솔창을 이용하여, build 디렉토리로 이동해서

ant examples 명령어를 주면 무언가 작업이 일어난다.

(win98은 실행창에서 command를, nt,2000,xp는 cmd를 입력하면 콘솔창이 뜬다.)

이 명령어가 하는 일은 examples 폴더에 있는 모든 파일을 컴파일 해주는 역할을 한다.

우선 가장 손쉬운 예제부터 보도록 하자.

앞서 얘기가 나온 app_example1부터 살펴보자.



figure 4. 예제 app_example1의 디렉토리 구조


이 예제를 실행시켜보면 다음과 같은 화면이 출력된다.

 
figure 5. 예제 app_example1의 실행 결과
 
-- 이후 작성중 --
네이버

최초작성일 : 2005-02-22

최종수정일 : 2005-02-23

 

이번에는 웹어플리케이션 예제를 한번 분석해보려고 합니다.

다음번에는 이 예제를 조금 더 발전시켜보는 방향으로 해보죠

 

일단 velocity에서 제공해주는 예제중에서 forumdemo라는 예제를 분석해보도록 하겠습니다.

기능은 간단한 forum의 기능을 제공해주는 작은 어플리케이션입니다.

물론 DB는 사용하지 않습니다.

이 어플리케이션은 다음과 같은 폴더 구조를 가지고 있습니다.

 

 

우리가 중요하게 봐야할 곳은 template폴더의 vm들과 WEB-INF/web.xml, WEB-INF/conf/velocity.properties 그리고 소스파일들이지요.

 

template은 명칭 그대로 템플릿을 모아둔 폴더 입니다.

list.vm은 message들의 목록을 출력할 때 쓰이는 템플릿이고,

reply.vm은 해당 message에 reply할 때 사용되는 템플릿이며,

view.vm은 해당 message와 그 하위의 reply들을 화면에 출력할 때 사용되는 템플릿입니다.

 

일단 예제를 한번 돌려보면서 해보는게 좋겠지요?

이전에 ant examples를 했다면 아마도 forumdemo도 모두 컴파일이 되어 있을겁니다.

(안하셨다면 이전 게시물을 참고하시기 바랍니다.)

이 forumdemo폴더 자체를 tomcat이설치된폴더/webapp 밑으로 복사를 합니다.

(물론 ant를 이용하여 자동으로 deploy해도 되겠지만 지금은 일단 복사하는 방법을 선택합니다.)

 

tomcat을 기동하고, 브라우저창에 http://localhost:8080/forumdemo 를 입력하시면 다음과 같은 화면이 나옵니다. 아무거나 클릭을 해볼까요?

 

당황스럽게도 404에러, 즉 페이지를 찾을 수 없다는 에러가 나는데, 이것은 web.xml에서 servlet을 mapping시켜주지 않아서 생기는 현상입니다.

 

 

WEB-INF/web.xml 파일에 다음을 추가시켜 줍니다.

<servlet-mapping>
        <servlet-name>forum</servlet-name>
        <url-pattern>/servlet/forum</url-pattern>
</servlet-mapping>

 

자 tomcat을 재시작 시킨후에 다시 한번 아무 메뉴나 클릭해봅시다.

 

 

이번에는 500에러가 나타납니다. 왜그럴까요? 에러로그를 잘 살펴보시면 template을 가져오지 못했기 때문에 에러를  발생시킨것을 알 수 있습니다.

이것도 역시 WEB-INF/web.xml파일이 잘못되어 있어서 발생하는 현상입니다.

<init-param>
        <param-name>properties</param-name>
        <param-value>/WEB-INF/conf/velocity.properties</param-value>
</init-param>

를 다음과 같이 바꿔줍니다.

 

<init-param>
        <param-name>org.apache.velocity.properties</param-name>
        <param-value>/WEB-INF/conf/velocity.properties</param-value>
</init-param>

 

다시 tomcat을 재시작한 후에 클릭해보면 제대로 나오는것을 확인 할 수 있습니다.

일단 예제가 돌아가기 시작하고 있으니 이제 실제적으로 이 어플리케이션을 분석해보도록 하겠습니다.

 

이 어플리케이션은 모든 서블릿요청은 org.apache.velocity.demo.ControllerServlet 이 담당합니다.

get방식으로 parameter를 받아서 그에 해당하는 action을 org.apache.velocity.demo.action 하위의 클래스들로 실행시켜주는 것이지요.

 

ControllServlet.java

(import는 생략했습니다.)

 

public class ControllerServlet extends VelocityServlet

{
    private static String ERR_MSG_TAG = "forumdemo_current_error_msg";

   
    /**
     *  template path에 대한 정보를 가져오기 위한 메소드 입니다.
     */

    protected Properties loadConfiguration(ServletConfig config )
        throws IOException, FileNotFoundException
    {
        String propsFile = config.getInitParameter(INIT_PROPS_KEY);
       
        /*
         *  webapp root에 대한 절대경로를 통해서 template파일의 위치를 찾습니다.

         *  tomcat과 같은 servlet 2.2 이상의 지원하는 container에서 가능하다고 하네요.
         */

        if ( propsFile != null )
        {
            String realPath = getServletContext().getRealPath(propsFile);
       
            if ( realPath != null )
            {
                propsFile = realPath;
            }
        }
       

       // 설정파일을 load합니다. 500에러가 발생했던 이유가 여기에 있는거지요.

       // 내부적으로는 org.apache.velocity.properties로 정의되어 있었는데,

       // web.xml에서는 properties로 정의되어 있었기때문에 찾지못해서 에러가 발생했던 것이죠.
       Properties p = new Properties();
       p.load( new FileInputStream(propsFile) );
     

       /**
        *  template의 경로와 log의 경로를 설정합니다.

        */

       // 설정파일에 정의되어있는 resource loader(차후에 다시 얘기나옵니다.)의 경로(path)를 찾아서 실제 경로로 바꾸어 다시 정의합니다. [file.resource.loader.path = /template]

       String path = p.getProperty("file.resource.loader.path");

       if (path != null)
       {
           path = getServletContext().getRealPath( path );
           p.setProperty( "file.resource.loader.path", path );
       }
       

       // 역시 설정파일에 정의되어있는 runtime.log의 경로를 실제 경로로 바꾸어 다시 설정합니다. [runtime.log = /forumdemo_velocity.log]
       path = p.getProperty("runtime.log");

       if (path != null)
       {
           path = getServletContext().getRealPath( path );
           p.setProperty("runtime.log", path );
       }

       return p;
    }


    /**
     * 서블릿을 제어하기 위해서 VelocityServlet의 handleRequest메소드를 확장하여 사용합니다.

     * @param VelocityServlet에서 생성된 Context

     * @return template
     */

    public Template handleRequest( Context ctx )
    {
        HttpServletRequest req = (HttpServletRequest)ctx.get(VelocityServlet.REQUEST);
        HttpServletResponse resp = (HttpServletResponse)ctx.get(VelocityServlet.RESPONSE);
        Template template = null;
        String templateName = null;
       
        HttpSession sess = req.getSession();
        sess.setAttribute(ERR_MSG_TAG, "all ok" );

        try
        {
            // processRequest를 통해서 파라미터의 command(list, reply 등등)에 해당하는

            // template의 이름을 받아옵니다.
            templateName = processRequest( req, resp, ctx );
            // template이름을 이용하여 template을 가져옵니다.
            template  = getTemplate( templateName );
        }
        catch( ResourceNotFoundException rnfe )
        {
            String err = "ForumDemo -> ControllerServlet.handleRequest() : Cannot find template " + templateName ;
            sess.setAttribute( ERR_MSG_TAG, err );
            System.out.println(err );
        }
        catch( ParseErrorException pee )
        {
            String err = "ForumDemo -> ControllerServlet.handleRequest() : Syntax error in template " + templateName + ":" + pee ;
            sess.setAttribute( ERR_MSG_TAG, err );
            System.out.println(err );
        }
        catch( Exception e )
        {
            String err = "Error handling the request: " + e ;
            sess.setAttribute( ERR_MSG_TAG, err );
            System.out.println(err );
        }

        return template;
    }
   
    /**
     * command패턴을 이용하여 request에서 넘어온 command에
 해당하는 template의 이름을 반환합니다.

     * 각 command는 org.apache.velocity.demo.action의 하위의 클래스들에 구현되어 있습니다.

     * exec메소드에 각 command가 담당한 부분에 대한 처리가 들어있습니다.

     * 메세지들을 context에 담는다던지하는 것들 말이지요...
     * @param the request
     * @param the response
     * @param the context
     * @return 사용할 템플릿의 이름
     */
    private String processRequest( HttpServletRequest req, HttpServletResponse resp, Context context )
     throws Exception
    {
        Command c = null;
        String template = null;
        String name = req.getParameter("action");
       
        if ( name == null || name.length() == 0 )
        {
            throw new Exception("Unrecognized action request!");
        }
               
        if ( name.equalsIgnoreCase("list") )
        {
            c = new ListCommand( req, resp);
            template = c.exec( context );
        }
        else if ( name.equalsIgnoreCase("post") )
        {
            c = new PostCommand( req, resp );
            template = c.exec( context );
        }
        else if (  name.equalsIgnoreCase("reply") )
        {
            c = new ReplyCommand( req, resp );
            template = c.exec( context );
        }
        else if (  name.equalsIgnoreCase("postreply") )
        {
            c = new PostReplyCommand( req, resp );
            template = c.exec( context );
        }
        else if ( name.equalsIgnoreCase("view") )
        {
            c = new ViewCommand( req, resp );
            template = c.exec( context );
        }
        return template;
    }


    /**
     *  에러가 발생했을때 브라우저 상에 출력하기 위한 메소드입니다.

     *  VelocityServlet의 error메소드를 override하여 사용합니다.

     */
    protected  void error( HttpServletRequest request, HttpServletResponse response, Exception cause )
        throws ServletException, IOException
    {
        HttpSession sess = request.getSession();
        String err = (String) sess.getAttribute( ERR_MSG_TAG );

        StringBuffer html = new StringBuffer();
        html.append("<html>");
        html.append("<body bgcolor=\"#ffffff\">");
        html.append("<h2>ForumDemo : Error processing the request</h2>");
        html.append("<br><br>There was a problem in the request." );
        html.append("<br><br>The relevant error is :<br>");
        html.append( err );
        html.append("<br><br><br>");
        html.append("The error occurred at :<br><br>");

        StringWriter sw = new StringWriter();
        cause.printStackTrace( new PrintWriter( sw ) );

        html.append( sw.toString()  );
        html.append("</body>");
        html.append("</html>");
        response.getOutputStream().print( html.toString() );
    }
}

 

네이버

최초작성일 : 2005-02-23

최종수정일 : 2005-02-25


이번엔 command 클래스들과 om패키지를 조금 살펴볼까 합니다.

이전에 말했듯이 command의 구현체들은 org.apache.velocity.demo.action 패키지안에 있습니다.



command.java의 경우에는 하위 command들을 위한 abstract class(추상클래스)입니다.

우선 ListCommand를 살펴보겠습니다. 생각보단 짧죠?


public class ListCommand extends Command
{
    /** template의 이름을 정의해 둡니다. */
    public static final String LIST = "list.vm";

    // 나중엔 이 변수에 담길 template의 이름을 DB에서 가져오거나 parameter로 받으면 되겠죠?
   

    // 생성자겠지요?
    public ListCommand( HttpServletRequest req, HttpServletResponse resp )
    {
        super( req, resp );
    }
   
    /**
     * 메세지들을 가져와서 context에 담습니다. 이때 메세지들은 Vector의 형태로 묶여 있게 됩니다.
     */
    public String exec( Context ctx )
    {
        Object[] list = ForumDatabase.listAll(); // 메세지를 가져오는 부분입니다.
       
        if ( list == null || list.length == 0 )
        {
            ctx.put("hasMessages", Boolean.FALSE );   
        }
        else
        {
            ctx.put("hasMessages", Boolean.TRUE );
            ctx.put("listall", list ); // 메세지가 존재하면 해당 메세지 list를 context에 담습니다(put)
        }
       
        return LIST; // 그리고 해당하는 템플릿의 이름을 반환해 줍니다.
    }
}


간단하지 않습니까?

사실상 이녀석이 하는 일은 context에 db클래스에서 뽑아낸 정보들을 담는역할밖에 없으니까요.

이 역할자체는 나머지 command 클래스들에서도 공통적으로 나타납니다.

(당연한거겠지요-_-;;)

PostCommand.java를 한번 살펴보겠습니다.

다른곳이라곤 exec메소드 뿐입니다.(이 역시 당연한거겠죠?)


public String exec( Context ctx )
    {

        // 변수에 넘겨받은 값들을 정의합니다.
        String name = request.getParameter("name");
        String subject = request.getParameter("subject");
        String email = request.getParameter("email");
        String content = request.getParameter("content");
       

        // 메세지 객체를 만들고 앞에서 설정한 변수를 이 객체에 담습니다.
        Message message = new Message();
        message.setName( name );
        message.setSubject( subject );
        message.setEmail( email );
        message.setContents( content );
       

        // Database 클래스에 메세지객체를 저장합니다.
        ForumDatabase.postMessage( message );
       

        // 메세지를 저장한 후에 보여줄 화면을 List로 정의하고 있기 때문에

        // list를 생성하여 context에 담습니다.

        Object[] list = ForumDatabase.listAll();
       
        ctx.put("listall", list );
        ctx.put("hasMessages", Boolean.TRUE );
        // 그리고 ListCommand의 List 즉 list.vm을 반환해줌으로써 보여줄 화면을 list.vm으로 설정하게 됩니다.
        return ListCommand.LIST;
    }


ListCommand에서는 말씀드렸던것처럼 db클래스에서 데이터를 가져오는 역할을 했습니다.

PostCommand의 경우에는 메세지를 작성할 때 사용하는 클래스인데, 기본적으로

parameter로 받은 정보들을 message객체에 set하고 그것을 db클래스에 저장하는 역할을 하고 있습니다.


나머지 클래스들도 같은 방법으로 동작하고 있기 때문에 추가적인 설명은 하지 않겠습니다.

Command클래스의 이름으로 대충 파악하실수 있을꺼라 생각합니다.


org.apache.velocity.demo.om 패키지에 있는 두 클래스가 실제적으로 persistence layer를 맡고 있습니다.

Message 클래스는 설명이 필요 없는 Bean 클래스입니다.(실제 소스를 보시면 아시겠지만 set/get만을 하고 있는 클래스입니다)

한가지 특이할만한 점이라고 하면, 한 메세지에 달리는 덧글들은 해당하는 메세지가 가지고 있다는 것입니다.

이는 소스에서 살펴보실수 있듯이 Reply을 Vector형태로 가지고 있기 때문에 가능하게 되는 것입니다.

바로 이 부분이죠. private Vector replies = null;


ForumDatabase는 HashTable에 사용자가 작성한 메세지를 key/value 방식으로 담고 있습니다.

따라서 클래스가 하는 작업은 HashTable에 메세지를 넣고, 빼고, 리스트 정도가 있습니다.


ForumDatabase.java

public class ForumDatabase
{
    private static Hashtable messages = new Hashtable(); // 메세지를 저장할 HashTable
    private static int nextId = 0; // key값입니다. 0부터 시작합니다.
    private static ForumDatabase me = null;
   
    /** 생성자 */
    private ForumDatabase()
    {}
   
    /**
     * 신규 메세지 작성

     */
    public static synchronized void postMessage( Message message )
    {
        Integer nextNumber = new Integer( nextId++ ); // 기존의 key 값에 +1을 해줍니다.

        message.setId( nextNumber ); //  메세지의 key값으로 설정합니다.
        messages.put( nextNumber,  message ); // HashTable에 key와 message를 담습니다.
    }
   
    /**
     * 저장되어 있는 모든 메세지들의 리스트를 반환합니다.

     */
    public static Object[] listAll()
    {
        return messages.values().toArray();
    }
   
    /**
     * 특정한 한 메세지를 가져옵니다.

     */
    public static synchronized Message getMessage( String index )
    {

        // HashTable에서 넘겨받은 key으로 해당하는 메세지를 찾아서 반환합니다.
        return (Message)messages.get( new Integer( index ) );
    }
   
    /**
     * 메세지에 덧글을 추가합니다.
     */
    public static synchronized void postReply( Message reply, String parent )
    {
        Message thread = getMessage( parent );
        thread.addReply( reply );
    }

Posted by 1010
98..Etc/Etc...2009. 3. 23. 13:28
반응형
치환함수에 대해서 알아봅니다.

JavaScript

먼저 자바스크립트에서 문자열 치환방법입니다.
<script language="JavaScript">
str = "대니를 바꿔버립시다."
re = "대니"
newstr = str.replace(re, "전성대");
document.write(newstr)
</script>
출력결과 : 전성대를 바꿔버립시다.

ASP

이번엔 ASP에서 치환을 해봅시다.
<%
str = "대니를 바꿔버립시다."
re = "대니"
newstr = replace(str,re,"전성대")
response.write newstr
%>
출력결과 : 전성대를 바꿔버립시다.

PHP

이번엔 php에서의 문자열 치환입니다.
<?
$str = "대니를 바꿔버립시다.";
$re = "대니";
$newstr = str_replace("대니","전성대",$str)
echo ($newstr);
?>
출력결과 : 전성대를 바꿔버립시다.

JSP

이번엔 jsp에서의 문자열 치환입니다.
<%
String usf_replace(String src, String oldstr, String newstr) {
          if (src == null) return null;

          StringBuffer dest = new StringBuffer("");
          
          try {
                      int  len = oldstr.length();
                      int  srclen = src.length();
                      int  pos = 0;
         
            int  oldpos = 0;

                      while ((pos = src.indexOf(oldstr, oldpos)) >= 0) {
                                  dest.append(src.substring(oldpos, pos));
                                  dest.append(newstr);
                                  oldpos = pos + len;
                      }

                      if (oldpos < srclen)
                                  dest.append(src.substring(oldpos, srclen));
                      
          } catch ( Exception e ) {
                      e.printStackTrace();
          }
          return dest.toString();
}

결과 =  usf_replace( "대니를 바꿔버립시다.", "대니", "전성대");
%>
출력결과 : 전성대를 바꿔버립시다.
Posted by 1010
01.JAVA/Java2009. 3. 23. 12:10
반응형
getJava 사이트 방문하기 http://my.dreamwiz.com/conbox/
     아래 문서의 소유권은 getJava에 있으며, 리포스팅에 대한 문의는 getJava로 하시기 바랍니다.

For Beginner :::::


Basic Lecture :::::

  1. 데이터 형과 연산자
  2. 제어문과 배열
  3. 클래스의 기본
  4. 클래스의 고급
  5. 주요 키워드와 클래스 종류
  6. 중요 클래스
  7. AWT와 배치
  8. 이벤트 처리
  9. 애플릿
  10. 쓰레드
  11. 예외처리
  12. 입출력(java.io)
  13. 네트워크
  14. JDBC
  15. 객체직렬화

Deep Lecture :::::

  1. Swing
  2. 분산 네트워킹(java.rmi)
  3. New I/O(java.nio)

Posted by 1010
01.JAVA/Java2009. 3. 23. 11:37
반응형

package jspData.util;

import java.io.UnsupportedEncodingException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MyUtil {
 // 문자열의 내용중 원하는 문자열을 다른 문자열로 변환
 // String str = replaceAll(str, "\r\n", "<br>"); // 엔터를 <br>로 변환
 public String replaceAll(String str, String oldStr, String newStr) throws Exception {
  if(str == null)
   return "";

        Pattern p = Pattern.compile(oldStr);

        // 입력 문자열과 함께 매쳐 클래스 생성
        Matcher m = p.matcher(str);

        StringBuffer sb = new StringBuffer();
        boolean result = m.find();

        // 패턴과 일치하는 문자열을 newStr 로 교체해가며 새로운 문자열을 만든다.
        while(result) {
            m.appendReplacement(sb, newStr);
            result = m.find();
        }

        // 나머지 부분을 새로운 문자열 끝에 덫 붙인다.
        m.appendTail(sb);

  return sb.toString();
 }

 

//////////////////////////////////////////////////////////////////////////////

 

실제 jsp 적용로직(엑셀 다운로드시 /가 파일이름으로 적합하지 않아 오류가 남)

이때 /을 -로 바꿔주며 저장되게 함. class이용이 아니라 jsp자체에서 바로 적용

 

 //made in LCS  /로 된 문자열 -로 변환   /-> 이문자가 파일이름으로 적합하지 않음.
 String prjNms = reqInfo.getString("prjNm");
 int prjnum = prjNms.indexOf("/");
 if( prjnum >= 0){
  try{
    Pattern p = Pattern.compile("/");
         // 입력 문자열과 함께 매쳐 클래스 생성
         Matcher m = p.matcher(prjNms);

         StringBuffer sb = new StringBuffer();
         boolean result = m.find();

         // 패턴과 일치하는 문자열을 newStr 로 교체해가며 새로운 문자열을 만든다.
         while(result) {
             m.appendReplacement(sb, "-");
             result = m.find();
         }

         // 나머지 부분을 새로운 문자열 끝에 덫 붙인다.
         m.appendTail(sb);
   prjNms = sb.toString();
   //out.print("prjNmsprjNmsprjNmsprjNmsprjNmsprjNmsprjNmsprjNms"+prjNms);
 
  response.setHeader("Content-Disposition", "attachment; filename="+new String(prjNms.getBytes(),"8859_1")+"("+new java.text.SimpleDateFormat("yyyyMMdd").format(new java.util.Date())+").xls");
  }catch(Exception e){}
 }else{
  prjNms = reqInfo.getString("prjNm");
  //out.print("*************************************"+prjNms);
  //out.print("********************"+prjNms.indexOf("/"));
  response.setHeader("Content-Disposition", "attachment; filename="+new String(prjNms.getBytes(),"8859_1")+"("+new java.text.SimpleDateFormat("yyyyMMdd").format(new java.util.Date())+").xls");
 }

Posted by 1010
01.JAVA/Java2009. 3. 23. 11:15
반응형
<!--StartFragment-->/**
    * 문자열 내의 특정한 문자열을 모두 지정한 다른 문자열로 바꾼다.
    * 원본 String 이 null 일 경우에는 null 을 반환한다.
    * StringBuffer 를 이용하였으므로 이전의 String 을 이용한 것 보다
    * 월등히 속도가 빠르다. (약 50 ~ 60 배)
    *
    * 사용 예: <BR>
    *
    *   1. 게시판에서 HTML 태그가 안 먹히게 할려면
    *
    *      String str = "<TD>HTML Tag Free Test</TD>";
    *      str = replace(str, "&", "&amp;");
    *      str = replace(str, "<", "&lt;");
    *
    *   2. ' 가 포한된 글을 DB 에 넣을려면
    *
    *      String str2 = "I don't know.";
    *      str2 = replace(str2, "'", "''");
    *
    * @param   String src       원본 String
    * @param   String oldstr    원본 String 내의 바꾸기 전 문자열
    * @param   String newstr    바꾼 후 문자열
    * @return  String           치환이 끝난 문자열
    *
    * @date    2000/06/30
    * @author  김필호 (Kim, Pilho) [phkim@cluecom.co.kr]
    */
   public static String replace(String src, String oldstr, String newstr)
   {
       if (src == null)
           return null;

       StringBuffer dest = new StringBuffer("");
       int  len = oldstr.length();
       int  srclen = src.length();
       int  pos = 0;
       int  oldpos = 0;

       while ((pos = src.indexOf(oldstr, oldpos)) >= 0) {
           dest.append(src.substring(oldpos, pos));
           dest.append(newstr);
           oldpos = pos + len;
       }

       if (oldpos < srclen)
           dest.append(src.substring(oldpos, srclen));

       return dest.toString();
   }
Posted by 1010
90.개발관련문서2009. 3. 23. 11:05
반응형
많은 분들이 접해보았을 오류다..말그대로 게이트웨이 까지 가는데 정해진 시간내에 접속시도 했으나 상대측에서 응답이 없을 경우 발생한다. 흔히 504 error이라고 한다.

인터넷에 떠도는 응답과 관련자료를 다 올려볼려고 한다. 카카카...

용어들은 네트워크를 공부할 수 있는 자료를 참고하는것이 좋을 듯 싶다.

다음은 참고할 수 있는 에러 코드들이다. 이 문제를 해결하는데 일조하는 코드이니 참고바람.


[13] HTTP 1.1 status codes

100 : Continue
101 : Switching protocols
200 : OK, 에러없이 전송 성공
201 : Created, POST 명령 실행 및 성공
202 : Accepted, 서버가 클라이언트 명령을 받음
203 : Non-authoritative information, 서버가 클라이언트 요구 중 일부 만 전송
204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음
205 : Reset content
206 : Partial content
300 : Multiple choices, 최근에 옮겨진 데이터를 요청
301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음
302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시
303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음
304 : Not modified
305 : Use proxy
400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음
401 : Unauthorized, 클라이언트의 인증 실패
402 : Payment required, 예약됨
403 : Forbidden, 접근이 거부된 문서를 요청함
404 : Not found, 문서를 찾을 수 없음
405 : Method not allowed, 리소스를 허용안함
406 : Not acceptable, 허용할 수 없음
407 : Proxy authentication required, 프록시 인증 필요
408 : Request timeout, 요청시간이 지남
409 : Conflict
410 : Gone, 영구적으로 사용할 수 없음
411 : Length required
412 : Precondition failed, 전체조건 실패
413 : Request entity too large,
414 : Request-URI too long, URL이 너무 김
415 : Unsupported media type
500 : Internal server error, 내부서버 오류(잘못된 스크립트 실행시)
501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구함
502 : Bad gateway, 서버의 과부하 상태
503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태
504 : Gateway timeout
505 : HTTP version not supported


가능성은 2가지 ...상대측 컴퓨터 (서버가 되겠지용? 내가 접속을 시도 하는 클라이언트 개념이니까)에서 포트를 막아놓아서 접속불능이거나..아님 없어져부렀거나..

C프로그램을 만질 줄 알면 이 메시지가 뜰때 다른 정확한 원인을 표시하도록 하는 프로그램을 짤 수 있다. 예전에 어디서 우연히 찾았는데 기억이 나지 않는다. 상대방에게는 이런 메시지로 보이지만 진짜 메세지는 뒤에 숨겨져 있다고 들었는데....


접해보면 알겠지만..특정 사이트에서 이런오류가 발생하면 하루나 며칠동안 나 혼자만 그 사이트 접속이 안될때가 있다.

나같은 경우 네이버 지식검색 결과 창으로의 진입이 안되서 --정확히 말하면 창을 클릭하면 완료라고 메세지가 뜨는데 화면에는 아무것도 안 나온 적이 있었다. 다른 친구들은 다 접속이 되는데 나만 안되는경우 -- 결국 3일 동안 고치려고 발버둥 치다가 포기하고 깔끔하게 밀어버린적이 있다.


이럴경우 네트워크의 문제를 제시하는 분들이 있는데 네트워크의 문제해결을 위해서는 먼저 Ping테스트를 해보길 권한다. 자체 네트워크 카드의 Ping테스트 결과 . 그리고 외부로의 Ping테스트를 통해.....근데 이경우 네트워크의 문제 가능성은 거의 드물다.


일반적으로 상대방 서버측문제라고 본다. 응답이 없거나...서버를 일시적으로 막아 놓았거나.

어디서 찾은지도 모르겠다..넘 많이 뒤지고 돌아다녀서...

아파치(잘 알고 계시져? ^^;) 제공문서(설정파일 포함)에 의하면, 위에서처럼 Timeout에 관한 설명이 나오는데 ..
Timeout 300

-The number of seconds before receives and sends time out.
-The TimeOut directive currently defines the amount of time Apache will wait for three things:
   1.The total amount of time it takes to receive a GET request.
   2.The amount of time between receipt of TCP packets on a POST or PUT request.
   3.The amount of time between ACKs on transmissions of TCP packets in responses.

- time out을 받고 보내기 전의 초(짧은 시간)의수

- Timeout 지시는 현재 아파치가 밑의 3가지를 기다리게 될 상당한 시간으로 정의한다.

  1. (아파치가 클라이언트로 부터) GET 요청(GET 방식의 URL요청)을 받는데 걸리는 시간. - (요청)
  2. (아파치가 클라이언트로 부터) POST나 PUT 방식의 요청에 대한 TCP 패킷을 받는데 걸리는 시간. - (요청)
  3. (아파치가 클라이언트에게) TCP 패킷을 전송할때 ACKs 세그먼트를 보내는데 걸리는 시간 - (응답)

위의 내용을 쉽게 이해할것 같지만,
TCP/IP 네트워크에서 "TCP 3 way handshaking"라는 TCP의 제어기능을 이해해야만
Timeout의 개념을 알 수 있습니다.

질문의 내용은 3번의 응답에 관한 내용인데, 파일을 다운로드할때는 3번의 응답 과정이 모두 끝나고 실제로 Data 패킷을 전송하는 단계이므로 Timeout과 관계가 없습니다.
그렇게 때문에 아주 덩치 큰 파일(100M 이상)을 HTTP 프로토콜을 이용해서 다운로드할때
5분 이상이 걸려도 Time out이 되지 않는 이유가 여기에 있습니다.

질문에 대한 결론은
Timeout 지시자는 실제로 파일을 다운로드하는 Data 패킷 전송과 관계가 없으며,
앞에서 설명한 1,2번의 요청에 걸리는 시간과 3번의 응답에 걸리는 시간과 관계가 있습니다.

1, 2번의 요청에 관한 내용은 따로 설명하지 않아도 이해할 수 있는 부분이므로 생략하고,
좀더 개념적으로 확실히(?) 알기 위해서 "TCP 3 way handshaking"이라는 녀석에 대해서
조금 알아보죠..

예를들어,
TCP/IP 네트워크에서는 A호스트에서 B호스트로 접속하여 Data 패킷을 전송할때
단 한번의 접속으로 Data 패킷을 보내는 것이 아니라 모두 3번에 걸쳐서 이루어집니다.

1단계 : A ----- 접속시도(SYN, SYNchronize sequene number 보냄) -----> B
2단계 : A <---- 확인단계(SYN, ACK(ACKnowledgment 보냄) ----------- B
3단계 : A ----- 전송시작(ACK, Data 전송시작) --------------------> B

이와 같이 TCP 네트워크는 패킷을 순서대로 맞게 전달하기 위해서
이런 제어기능을 하게됩니다.

3번에 걸쳐서 마치 악수하듯이 이루어진다해서 "3 way handshaking"이라는 말이
나온것 같군요.

헷갈리지 않아야할 점은 앞에서 Data 전송이라고해서 요청에 대한 응답에 만 해당되는것이
요청도 이와 같이 3단계를 걸쳐서 이루어 집니다.

좀더 정확하고 많은 정보를 원한다면 TCP/IP 네트워크에 대한 전문서적을 읽어보시길
바랍니다(필자는 이정도 수준이라서...^.9).

질문의 내용과 연결해서,
1, 2번의 요청, 즉 "xxx 받는데 걸리는 시간"은 위의 3단계 모두에 해당되는 시간이고,
3번의 응답, 즉 "xxx ACKs 세그먼트를 보내는데 걸리는 시간"은 2단계에 해당되는
시간을 의미합니다.

따라서
이미 질문에 대한 답이 나와 있듯이 "파일을 다운로드하는 경우"는 이미 2단계가 모두
끝나고 3단계를 의미하므로 아파치의 Timeout 과 관련이 없습니다.

Timeout 300

의 의미는

- URL GET 요청이나 POST, PUT 요청을 할때 네트워크 환경이 지나치게 너무
  느린 환경(아주 멀리 떨어져 있는 아주 느린 환경)에서 접속을 할때 걸리는 시간이
  300초가 넘어가면 Timeout이 됩니다.
- 또한 다운로드가 아닌 ACKs 세그먼트 메시지를 보낼때도 마찬가지로 너무 느린 환경이나
  네트워크 장애로 인해서 시간이 300초를 초과할 경우에 Timeout이 됩니다.

간혹 멀리 떨어진 외국의 싸이트를 접속하다보면 갑작스런 네트워크 장애로
Timeout 이라는 Error 메시지를 본 경험이 있는데 이와 같은 이유로 Timeout이
되기도 합니다.

이와 관련된 HTTP 1.1 status codes(RFC 2068)

"408"   ; Request Time-out
"413"   ; Request Entity Too Large
"414"   ; Request-URI Too Large
"502"   ; Bad Gateway
"504"   ; Gateway Time-out

408 Request Timeout

   The client did not produce a request within the time that the server
   was prepared to wait. The client MAY repeat the request without
   modifications at any later time.

413 Request Entity Too Large

   The server is refusing to process a request because the request
   entity is larger than the server is willing or able to process. The
   server may close the connection to prevent the client from continuing
   the request.

   If the condition is temporary, the server SHOULD include a Retry-
   After header field to indicate that it is temporary and after what
   time the client may try again.

414 Request-URI Too Long

   The server is refusing to service the request because the Request-URI
   is longer than the server is willing to interpret. This rare
   condition is only likely to occur when a client has improperly
   converted a POST request to a GET request with long query
   information, when the client has descended into a URL "black hole" of
   redirection (e.g., a redirected URL prefix that points to a suffix of
   itself), or when the server is under attack by a client attempting to
   exploit security holes present in some servers using fixed-length
   buffers for reading or manipulating the Request-URI.

502 Bad Gateway

   The server, while acting as a gateway or proxy, received an invalid
   response from the upstream server it accessed in attempting to
   fulfill the request.

504 Gateway Timeout

   The server, while acting as a gateway or proxy, did not receive a
   timely response from the upstream server it accessed in attempting to
   complete the request.

많은 도움이 되었기를.....

더 많은 문서나 자료는 RFC문서를 참조하였음 ...좋겠는데......

Posted by 1010
90.개발관련문서2009. 3. 23. 11:01
반응형

 HTTP 에러 코드 표


 HTTP 에러코드          에러 메시지


200                          OK, 에러 없이 전송이 성공함

202                          Accepted, 서버가 클라이언트의 명령을 받음

203                          Non-authoritative information, 서버가 클라이언트 요구 중 일부만 전송함

204                          Non Content, 클라이언트 요구를 처리했으나 전송할 데이터가 없음


300                          Mutiple Choices, 최근에 옮겨진 데이터를 요청함

301                          Moved Permanently, 요구한 데이터를 변경된 임시 URL에서 찾음

302                          Moved Permanently, 요구한 데이터가 변경된 URL에 있음을 명시함.

303                          See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음


400                          Bad Request, 요청실패 - 문법상 오류가 있어서 서버가 요청 사항을 이해하지 못함

401.1                       Unauthorized, 권한없음 - 접속실패, 서버에 로그온 하려는 요청 사항이 서버에 들어있는 권한과 비교했을 시 맞지

                                                                  않을 경우 발생.

401.2                       Unauthorized, 권한없음 - 서버 설정으로 인한 접속 실패, 일반저긍로 적절한 www-authenticate head field를 전송

                                                                  하지 않아서 발생함

402.3                       Unauthorized, 권한없음 - 자원에 대한 ACL에 기인한 권한 없음. 이 에러는 클라이언트가 특정 자원에 접근할 수 없을

                                                                   때 발생.

401.4                       Unauthorized, 권한없음 - 필터에 의한 권한 부여 실패. 웹 서버가 서버에 접속하는 사용자들을 확인하기 위해 설치된

                                                                  필터 프로그램이 있음을 의미함.

403.1                       Forbidden, 금지 - 수행 접근 금지. 수행시키지 못하도록 되어 있는 디렉토리 내의 실행 파일을 수행시켜려고 했을 때

                                                        발생

403.2                       Forbidden, 금지 -  읽기 접근 금지. 브라우저가 접근한 디렉터리에 가용한 디폴트 페이지가 없을 경우 발생

403.3                       Forbidden, 금지 - SSL필요. 접근하려는 페이지가 SSL로 보안 유지되고 있는 것일 때 발생

403.6                       Forbidden, 금지 - IP주소 거부됨. 서버가 사이트에 접근이 허용되지 않은 IP주소로 사용자가 접근하려 했을 때 발생

403.7                       Forbidden, 금지 - 클라이언트 확인 필요. 자원을 이용할 수 있는 사용자임을 입증하는데 사용(SSL)

403.8                       Forbidden, 금지 - 사이트 접근 거부. 웹 서버가 요청사항을 수행하고 있지 않거나, 해당 사이트에 접근하는 것을 허락

                                                        하지 않았을 경우 발생

403.9                       Forbidden, 금지 - 연결된 사용자수 과다

403.10                      Forbidden, 금지 - 설정이 확실하지 않음. 웹 서버의 성정 부분에 문제가 있을 경우 발생

403.11                      Forbidden, 금지 - 패스워드 변경. 사용자 인증 단계에서 잘못된 패스워드를 입력했을 경우 발생

404                         Not found, 문서를 찾을 수 없음 - 클라이언트가 요청한 문서를 찾지 못한 경우 발생. URL주소를 확인

405                         Method not allowed, 메소드 허용 안 됨 - 해당 Method의 이용이 허용되지 않았을 경우 발생

406                         Not Acceptable, 받아들일 수 없음

407                         Proxy Authentication Required, Proxy  인증이 필요함

408                         Request timeout, 요청 시간이 지남

414                         Request-URL too long, 요청한 URL가 너무 김


500                         Internal Server Error, 서버 내부 오류 - 웹 서버가 요청사항을 수행할 수 없을 경우에 발생

501                         Not Implemented, 적용 안 됨 - 웹 서버가 요청사항을 수행하는데 필요한 기능을 지우너하지 않는 경우에 발생

502                         Bad Gateway, 게이트웨이 상태 나쁨 - 게이트웨이 상태가 나쁘거나 서버의 과부하 상태일 때 발생

503                         Service Unavailable, 서비스 불가능 - 서비스가 현재 멈춘 상태 또는 현재 일시적인 과부하 또는 관리상황일 때

Posted by 1010
90.개발관련문서2009. 3. 20. 11:03
반응형
Posted by 1010
98..Etc/SVN2009. 3. 19. 14:55
반응형
Posted by 1010
반응형

다음부터 이 창을 띄우지 않음

2001. 4. 9.

개 요

어느 정도 규모가 있는 사이트에서는(심지어는 개인 홈페이지에서도) 중요한 공지사항이 있을 때에는 별도의 작은 창을 띄워서 해당 내용을 표시하는 경우가 많다. 이러한 별도의 창은 처음 접속하는 사용자인 경우에는 필요한 경우가 많지만, 같은 내용을 여러 번 보는 것을 방지하기 위하여 자체적으로 "다음부터 이 창을 띄우지 않음"과 같은 선택 옵션을 제공하는 경우가 많다. 이러한 기능을 구현하기 위하여 CGI와 DB를 사용하는 경우도 있지만, 쿠키와 자바스크립트만을 이용해서도 같은 효과를 거둘 수 있다.

쿠키 다루기

쿠키를 제어하는 함수를 제작하기 전에, 쿠키의 구조부터 살펴보도록 하겠다. 쿠키는 일반적으로 다음과 같은 형태를 가지는 일련의 문자열로 구성되어 있다.

쿠키변수=쿠키값; path=유효한디렉토리; expires=만료일

쿠키를 참조하는 객체는 자바스크립트에서 document.cookie 객체이며, 이를 이용하여 쿠키를 설정하고 값을 참조하는 함수를 다음과 같이 범용적인 용도로 작성할 수 있다.

function setCookie (name, value, expires) {
  document.cookie = name + "=" + escape (value) +
    "; path=/; expires=" + expires.toGMTString();
}

function getCookie(Name) {
  var search = Name + "="
  if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면
    offset = document.cookie.indexOf(search)
    if (offset != -1) { // 쿠키가 존재하면
      offset += search.length
      // set index of beginning of value
      end = document.cookie.indexOf(";", offset)
      // 쿠키 값의 마지막 위치 인덱스 번호 설정
      if (end == -1)
        end = document.cookie.length
      return unescape(document.cookie.substring(offset, end))
    }
  }
}

쿠키로 제어하는 공지창 호출

이제, 특정 쿠키의 값에 따라서 새 창을 열 것인지의 여부를 결정하여 수행하는 함수를 작성해보자. 쿠키변수의 이름은 notice로 하고, 이 notice의 값이 deny이면 공지 창을 띄우지 않는 기능을 가진 openNotice() 함수를 만든다.

function openNotice() {
  if (getCookie("notice") != "deny") {
    window.open("notice.htm","notice",
      "width=320,height=240,resizable=yes");
  }
}

위의 함수는 첫 페이지에서 onLoad 이벤트 핸들러에 연결하여 사용할 수 있다. 이제 열리는 대상 창에서 사용자가 앞으로 이 창을 띄우지 않는 것을 선택하는 폼을 구성한다.

<form name="notice">
<input type="checkbox" name="neveropen">
다음부터 이 창을 열지 않음
<input type="submit" value="확 인" onClick="Setting(document.notice)">
</form>

Setting() 함수의 용도는 쿠키변수인 notice에 deny라는 값을 대입시켜서 쿠키를 설정하는 기능이며, 쿠키가 설정된 다음에는 해당 창을 닫는다.

function Setting(form) {
  var expdate = new Date();
  expdate.setTime(expdate.getTime() + 1000 * 3600 * 24 * 365); // 365일
  if (form.neveropen.checked) {
    setCookie('notice', "deny", expdate);
  }
  window.close();
}

만료일의 경우에는 현재 시각을 기준으로 하여 1년 이후까지를 유효일로 설정하였다. 이 수치를 조정하여 공지사항을 띄우지 않을 기간을 마음대로 조정할 수 있다. 또한, 새로운 공지사항인 경우에는 deny가 아닌 새로운 값이나 새로운 쿠키 변수명을 사용하여 활용할 수도 있으므로, 실제로 이 코드를 참조하여 적용할 때에는 쿠키변수명과 쿠키의 값을 용도에 맞게 변경해서 사용해야 할 것이다.

최종 소스파일

지금까지 설명한 메인화면 코드와 공지창 코드 전체를 정리하면 다음과 같다.

메인 화면

<html>
<head>
<title>쿠키를 이용한 새창 제어</title>
<script language="javascript">
function getCookie(Name) {
  var search = Name + "="
  if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면
    offset = document.cookie.indexOf(search)
    if (offset != -1) { // 쿠키가 존재하면
      offset += search.length
      // set index of beginning of value
      end = document.cookie.indexOf(";", offset)
      // 쿠키 값의 마지막 위치 인덱스 번호 설정
      if (end == -1)
        end = document.cookie.length
      return unescape(document.cookie.substring(offset, end))
    }
  }
}

function openNotice() {
  if (getCookie("notice") != "deny") {
    window.open("notice.htm","notice",
      "width=320,height=240,resizable=yes");
  }
}
</script>
</head>
<body onLoad="openNotice()">
<h1>쿠키를 이용한 새창 제어</h1>

</body>
</html>

공지사항 화면

<html>
<head>
<title>공지사항</title>
<script language="JavaScript">
function setCookie (name, value, expires) {
  document.cookie = name + "=" + escape (value) +
    "; path=/; expires=" + expires.toGMTString();
}

function Setting(form) {
  var expdate = new Date();
  expdate.setTime(expdate.getTime() + 1000 * 3600 * 24 * 365); // 365일
  if (form.neveropen.checked) {
    setCookie('notice', "deny", expdate);
  }
  window.close();
}
</script>
</head>
<body>
<h1>공지사항</h1>
<form name="notice">
<input type="checkbox" name="neveropen">
다음부터 이 창을 열지 않음
<input type="submit" value="확 인" onClick="Setting(document.notice)">
</form>
</body>
</html>
Posted by 1010
98..Etc/Etc...2009. 3. 18. 14:17
반응형
웹개발 문서 모음

웹사이트 개발시에 필요한 문서 목록입니다.
해당 문서목록의 의견,문제점,궁금하신 점은 Q&A게시판에 올려주십시요.
공유를 원하는 유용한 웹개발문서를 받고 있습니다. 많이 많이 여기로 보내주세요.(다양한 업종의 스토리보드와 제안서 강추)

Q : 파일 다운로드시 한글파일의 경우 다운로드 되지 않거나 글자가 깨집니다.
A : 익스플로러 "도구 > 인터넷 옵션 > 고급 "에서 고급 UTF8옵션 해제하시면 됩니다.

웹로그분석 WSOS

* 버전 : v2.0
* 최종수정일자 : 2008.09.24 10:05:44

Posted by 1010
반응형

Download CubicExplorer

CubicExplorer 0.80 installer
Version 0.80.0.890
License Freeware
Date added 27.7.2007
Size 1.9MB
CubicExplorer 0.80 final
Installer 1.9MB
Zip archive 1.8MB
CubicExplorer 0.90 RC3
Installer 2.1MB
Zip archive 2.0MB

Installation instructions

  • Download CubicExplorer installer program.
  • Run the installer and follow instructions.

Upgrading

  • Download CubicExplorer installer program.
  • Run the installer.
  • Select the old CubicExplorer folder as Destination Folder.

Uninstall

  • If you installed CubicExplorer using the installer, then run the Uninstall program to remove CubicExplorer.
  • If you didn’t use installer, then just delete the CubicExplorer folder.

What gets installed on my computer?

CubicExplorer is registry free application. It does not write to registry, all settings are stored in files at installation folder. Also CE does not access internet. That might change in the future however when features like online update are implemented.

Posted by 1010
반응형

'웹서비스, 프로그램리뷰'에 해당되는 글 59건

  1. 블로그 배너, 타이틀 제작을 손쉽게 :: bannerfans.com (19) 2009/03/16
  2. 영웅(Hero) 캐릭터 만들기 :: cpbintegrated.com/theherofactory (24) 2009/03/16
  3. 사진을 픽셀이미지나 텍스트로 만들어주는 :: typorganism.com/asciiomatic (26) 2009/03/12
  4. 웹사이트 실시간 접속자수 위젯 :: radarurl.com (45) 2009/03/11
  5. 5,300년전 미라의 생생한 피부조직, 고해상도 사진 :: icemanphotoscan.eu (32) 2009/03/10
  6. 컴작업능률향상, 모니터 화면분할 프로그램 :: Maxto (59) 2009/03/07
  7. 원클릭 시스템 최적화 무료프로그램 :: Glary Utilities (22) 2009/03/04
  8. 구글 서비스 장애 확인은 이곳에서 :: google.com/appsstatus (12) 2009/02/27
  9. 심플하고 신선한 웹 알람시계, 달걀타이머 :: e.ggtimer.com (31) 2009/02/27
  10. 쉽고 안전한 시스템 최적화 프로그램 :: CCleaner (레지스트리, 임시화일정리) (24) 2009/02/26
  11. 인생역전! 로또 번호 추측 서비스 :: lottoroll.co.nz (12) 2009/02/24
  12. G메일의 새로운 [나만의 색상선택] 기능추가 소식 (24) 2009/02/20
  13. [강추] 무료 사진 콜라주 프로그램 :: shape collage by Vincent Cheung (48) 2009/02/19
  14. 여성 100명에게 내 헤어스타일을 물어본다? :: axehaircrisisrelief.org/100girls/ (34) 2009/02/18
  15. UCC 애니메이션의 최고를 겨룬다. :: aniboom.com (4) 2009/02/16
  16. 똑딱이카메라 하나로 지도서비스를?! :: playstreet.net (플레이 스트리트) (32) 2009/02/11
  17. 2009 발렌타인데이 카드 보내기 :: by smilebrush (와루님) (20) 2009/02/11
  18. 스포츠 클럽팀의 엠블럼 (emblem,상징) 따라하기 :: scionspeak.com (25) 2009/02/10
  19. 중독성 있는 웹사이트 제한걸기 :: keepmeout! (40) 2009/02/09
  20. 앗! 내 블로그에 맛있는 삼겹살이?! :: bacolicio.us (합성사이트, 사진 합성) (40) 2009/02/07
  21. 깔끔한 버스 광고판 합성사이트 :: ruletheweb.co.uk/b3ta/bus (34) 2009/02/03
  22. 형체를 알아볼 수 없는 구글의 기념일 로고 : 2009년 1월 28일 (34) 2009/01/28
  23. 블로그에서 구현하는 3D 포토월 :: coolflick.com (23) 2009/01/23
  24. 나만 다운된 것인가요? 웹사이트의 작동여부 알아내기 :: downforeveryoneorjustme.com (19) 2009/01/15
  25. 스크린을 동영상으로 굽자 :: ScreenToaster.com (정식서비스시작) (25) 2009/01/14
  26. 복잡한 구글 검색 주소를 짧게 줄이기 :: gog.is (11) 2009/01/11
  27. 2009년 무료 토정비결, 이거 정신 바짝 차리고 살아야겠네요. -_-;; (44) 2009/01/01
  28. 열어놓은 브라우저 탭 모음을 공유하기 :: ShareTabs.com (14) 2008/12/27
  29. 당신의 애드센스 수입을 '뻥'튀기해 드립니다~ :: googleadsensegenerator.com (61) 2008/12/18
  30. 나만의 플래쉬 크리스마스 카드 제작하기 :: elfyourself.jibjab.com (80) 2008/12/02
Posted by 1010
05.JSP2009. 3. 16. 19:49
반응형

input 태그에서 type="image"는 form.submit 속성을 가지고 있어서 값을 무조건 넘겨준다.

 

'검색' 같은 이미지를 만들고 나서 type을 image로 하면 텍스트 박스를 검사 할 수 없음.

 

 

input 태그를 img 태그로 바꿔야 한다.

 

 

- 한시간 여 동안 날 화나게 한 원인이 이거구나.

Posted by 1010
반응형

집과 사무실에서 각각 데스크탑을 사용하고 있고 노트북도 같이 사용하고 있습니다. 그래서 백업관련 정보와 프로그램을 찾고 있다가 mRemote 원격 관리 프로그램을 발견하고 설치해서 사용해 봤습니다. 제 노트북에 설치했으며 환경은 윈도우 비스타를 사용하고 있습니다. 일단 비스타에도 별 문제가 없이 설치 및 실행이 되니 이건 패스~~~~

사용자 삽입 이미지

mRemote를 설치하고 실행한 화면입니다.
기본적으로 그 동안 제가 작업하는 환경에서는 SSH 접속을 위해 PuTTY를 사용했었는데 mRemote에서도 SSH 등의 보안된 텔넷 접속이 필요한 경우 PuTTY 설치가 필수이더군요. 위의 이미지에 보시면 PuTTY가 설치된 것을 체크하는 부분이 보입니다.

그 외에 필요한 조건들 :
- .NET Framework 2.0 이상 버전의 풀 패키지 또는 Runtime 모듈 설치 필요
- Citrix Presentation Server 접속을 위한 ICA Client 설치 필요
- RDP 접속이 필요한 경우, Remote Desktop Connection Client 6.0 이상 버전 설치 필요

mRemote는 세 가지 프레임으로 구성됩니다. 좌측 상단에 Connections, 좌측 하단에 Config, 우측에 Tab 화면으로 구성됩니다.
Connections 부분은 등록되어 있는 데스크탑 또는 서버의 목록을 보여줍니다. ftp 프로그램에서 보여지는 등록된 서버 목록이라 보시면 됩니다.
Config 부분은 위의 서버 목록에서 특정 서버 또는 데스크탑을 선택했을 경우 해당 선택된 서버 또는 데스크탑에 원격 접속할 수 있는 정보를 등록하는 부분입니다. 위의 이미지에서 보이듯 Hostname/IP, Username, Password, Domain 등의 접속 정보를 등록할 수 있습니다.

등록된 서버 목록에서 특정 서버를 연결하게 되면 우측의 Tab 화면에 새로운 Tab이 생성되면서 원격 서버가 보여지게 됩니다. Tab 형식으로 되어 있어서 여러개의 서버에 동시 접속해서 관리할 수 있는 부분이 매우 편리합니다. 저 역시 여러 홈페이지와 웹솔루션들을 관리하고 있기 때문에 Tab기능이 매우 편리하게 느껴지더군요.

일단 먼저 두 가지를 사용해봤습니다.
첫 번째는 원격 데스크탑 관리입니다. mRemote가 설치된 노트북에서 다른 데스크탑 PC에 원격 접속을 하니 Tab 부분에 데스크탑 PC의 바탕화면이 뜹니다. 그냥 눈으로 보기에는 네이트온의 원격관리와 비슷하네요.

사용자 삽입 이미지

위의 이미지는 데스크탑에 원격 접속한 모습입니다. 아래에 데스크탑 PC의 시작버튼이 보이네요.
여기서 알아야 될 부분은 원격으로 데스크탑에 접속하게 되면 해당 데스크탑은 로그오프로 자동 전환됩니다.

두 번째로 SSH를 이용한 텔넷접속을 해봤습니다. 리눅스 웹서버에 텔넷 접속했을 때의 화면입니다.

사용자 삽입 이미지

제가 잠깐 동안 사용해 보면서 느꼈던 가장 좋은 점은 하나의 프로그램창에서 Tab기능을 사용해서 여러개의 서버를 동시에 관리할 수 있다는 점입니다. 웹 솔루션 ASP 서비스를 하고 있는 입장이라 여러개의 서버를 동시 접속해서 관리해야 하는 일이 늘 있는터라 저한테는 참 편하게 느껴지더군요.
앞으로 계속 사용해보면서 장단점들을 찾아봐야 할 것 같습니다.

mRemote 프로그램은 무료로 사용할 수 있으며(오픈소스) http://www.mremote.org/ 홈페이지에서 최신버전을 다운로드 받으실 수 있습니다. 2008년 8월 30일 현재 최신버전은 Version 1.48이며 아래 첨부파일을 다운로드 받으셔도 됩니다. 프로그램은 영문으로 되어 있습니다.

Posted by 1010
05.JSP2009. 3. 10. 12:49
반응형

SQL에 parameter를 삽입하여 실행하는 기능

SQL에 parameter를 삽입하여 실행하는 방법이 있습니다.

String sSql = "select * from mytable where name = ? and address = ?";
Connection conn = get database connection;
PreparedStatement prestmt = null;
Statement stmt = null;
prestmt = conn.prepareStatement(sSql);
prestmt.setString(1,"Mike");
prestmt.setString(2,"LA");
rs = prestmt.executeQuery();
while (rs.next())
{
 xxx = rs.getString(1);
 yyy = rs.getString(2);
}

위와 같은 parameter name,address를 삽입하여 SQL을 실행할 수 있습니다.
실행되는 SQL은 다음과 같습니다.

select * from mytable where name = 'Mike' and address = 'LA'

위와 같은 방식으로 많은 개발자들이 web application을 개발합니다.
위와 같은 방식은 개발 생산성 측면에서 몇가지 문제가 있었습니다.
가장 큰 문제가 실제 실행되는 SQL을 개발자가 알 수 없습니다.
물론 parameter를 일일이 대입해서 볼수는 있지만 실제 값이 대입된 SQL을 개발자가 볼 수
없다는 것입니다.
문제가 되는 경우를 보겠습니다.

update mytalbe set name=? where id=?
prestmt.setString(1,"123456789012345678901234567890");
prestmt.setString(2,"2334");

그런데 mytable.name field는 varchar(16) 으로 선언이 되어 있다고 하겠습니다.
즉 입력한 값이 16 byte만 설정이 될 수 있습니다.
이와 같은 경우 개발자는 parameter가 설정된 실행되는 SQL을 trace log에서 볼 수 없기때문에
오류를 쉽게 파악하기 힘들 수 있습니다.

그래서 필자는 자체적으로 parameter가 설정된 SQL을 build하는 program을 개발해 보았습니다.
WCStmt.makeQuery method가 이것입니다.
parameter는 WCProperties로 전달하도록 하였습니다.

String sSql = "insert into table_name (name,address) values ('$name','$address')";
WCProperties pParam = new WCProperties();
pParam.setValue("name","jane");
pParam.setValue("address","L'A");
WCStmt oStmt = new WCStmt();
sSql = oStmt.makeQuery(sSql,pParam);

sSql 값 "insert into table_name (name,address) values ('jane','L''A')" 이와 같이 됩니다.
개발자는 sSql의 값을 확인하여 정확한 SQL이 생성되었는지를 점검할 수 있습니다.
그러나 개발을 하고 보니 이 방법도 몇가지 문제가 있었습니다.
parameter value값이 SQL에 삽입될때 몇가지 변환이 되어야 하는데 이 변환이
database의 type에 따라 약간씩 다르다는 것입니다.
L'\A 이와 같은 값이 있다고 하겠습니다.

- oracle,mssql : L''\A
update table_name set field_name = 'L''\A' where id = 37

- mysql : L''\\A
update table_name set field_name = 'L''\\A' where id = 37

이와 같이 변환이 되어야 합니다. 그래서 위의 makeQuery 함수를 다음과 같이 변경해야 했습니다.

String sDsn = "WDLDatabasePool";
sSql = oStmt.makeQuery(sSql,pParam,sDsn);

위에서 처럼 makeQuery에 database connection pool 이름을 전달하여 database type을 얻어와서
해당 database type에 대한 변환을 하도록 하였습니다.

-- JSP sample code 시작
<%@ page language="java" import="wdl.*,java.util.*,java.sql.*,java.lang.*,
java.io.*,java.io.File " contentType="text/html; charset=EUC-KR"%><%
 insertRecord();
%>
<%!
public void insertRecord()
{
 WCProperties rSqlParam = new WCProperties();
 rSqlParam.setValue("parentid",100);
 rSqlParam.setValue("text","hello");
 rSqlParam.setValue("url","-");
 rSqlParam.setValue("guid","g");
 rSqlParam.setValue("idx",0);
 rSqlParam.setValue("depth",0);
 rSqlParam.setValue("child",0);

 String sSql = "insert into mytable (\n";
 sSql += "parentid\n";
 sSql += ",text\n";
 sSql += ",url\n";
 sSql += ",guid\n";
 sSql += ",idx\n";
 sSql += ",depth\n";
 sSql += ",child\n";
 sSql += ")\n";
 sSql += "values(\n";
 sSql += "'$parentid' -- parentid\n";
 sSql += ",'$text' -- text\n";
 sSql += ",'$url' -- url\n";
 sSql += ",'$guid' -- guid\n";
 sSql += ",'$idx' -- idx\n";
 sSql += ",'$depth' -- depth\n";
 sSql += ",'$child' -- child\n";
 sSql += ")";
 WCStmt oStmt = new WCStmt();
 String sSql2 = oStmt.makeQuery(sSql,rSqlParam,"WDLDatabasePool");
 oStmt.executeUpdate(sSql2, null,"WDLDatabasePool");
}
%>
-- JSP sample code 끝

아래의 소스코드는 WCStmt.java의 일부분 코드입니다. makeQuery와 toSqlValue 입니다.

-- WCStmt.java에서 makeQuery 부분 추출 시작
public String makeQuery(String sSql,WCProperties rParam,String sDsn)
{
 if (WCString.isEmpty(sSql) || WCString.isEmpty(sDsn))
  return null;

 String sTail = "";
 String sHead = "";
 String sMid = "";

 String sRet = new String();
 String sSrc = sSql;
 do
 {
  int nIndex = sSrc.indexOf("$");
  int nSqlLen = sSrc.length();
  if (nIndex < 0)
   break;
  sMid = sSrc.substring(nIndex+1,nSqlLen);
  String sTok = getTok(sMid); // getToken
  int nTok = sTok.length();
  sTail = sSrc.substring(nIndex + nTok+1,nSqlLen);
  sHead = sSrc.substring(0,nIndex);
  // sSrc = sHead;
  String sVal = rParam.GetStrValue(sTok);
  if (sVal == null)
  {
   sVal = "";
   if (nIndex > 0)
   {
    char c = sSrc.charAt(nIndex-1);
    if (c == '\'' || c == '\"')
     sVal = "";
   }
  }
  else
  {
   if (sVal.length() <= 0)
   {
    sVal = "";
    if (nIndex > 0)
    {
     char c = sSrc.charAt(nIndex-1);
     if (c == '\'' || c == '\"')
      sVal = "";
    }
   }
  }
  sVal = WCString.nullCheck(WCStmt.toSqlValue(sVal,sDsn));
  sRet += sHead;
  sRet += sVal;
 
  sSrc = sTail;
 } while (true);
 if (WCString.isEmpty(sRet))
 {
  sRet = sSql;
 }
 else
 {
  sRet += sTail;
 }
 return sRet;
}


public static String toSqlValue(String sSrc,String sDsn)
{
 if (WCString.isEmpty(sSrc) || WCString.isEmpty(sDsn))
 {
  return null;
 }
 String sRet = new String();
 int nLen = sSrc.length();
 String sDatabaseType = WCDBConnectionManager.getDatabaseType(sDsn);
 if (WCString.compareNoCase(sDatabaseType,"mysql") == 0)
 {
  for (int i=0;i<nLen;i++)
  {
   char cChar = sSrc.charAt(i);
   if (cChar == '\'')
   {
    sRet += "'";
   }
   else if (cChar == '\\')
   {
    sRet += "\\";
   }
   sRet += cChar;
  }
 }
 else if (WCString.compareNoCase(sDatabaseType,"mssql") == 0
  || WCString.compareNoCase(sDatabaseType,"oracle") == 0)
 {
  for (int i=0;i<nLen;i++)
  {
   char cChar = sSrc.charAt(i);
   if (cChar == '\'')
    sRet += "'";
   sRet += cChar;
  }
 }
 return sRet;
}
-- WCStmt.java에서 makeQuery 부분 추출 끝

아래의 소스가 완벽히 실행하기 위해서는 WCProperties,WCVector,WCLog,WCSystem 등의 source코드가 필요합니다.
이러한 java source는 Web Development Library(www.webdevlib.net)에서 download 받아 사용하실 수 있습니다.
물론 www.webdevlib.net에서 소스코드를 받지 않고, 아래의 소스 코드를 수정하여 사용하실 수도 있습니다.
의도적으로 소스코드의 일부만 글로 쓰는 것은 아닙니다. 모든 소스에 대한 설명은 차차 하겠습니다.

첨부파일 : sql_makeQuery.zip
sql_makeQuery.jsp
WCDBConnection.java
WCDBConnectionPool.java
WCDBConnectionManager.java
WCStmt.java
WCProperties.java

출처 : 고급 웹 UI 개발 라이브러리 Web Development Library 소스공개 : http://www.webdevlib.net

Posted by 1010
98..Etc/SVN2009. 3. 10. 12:41
반응형

09 서브버전(Subversion) 윈도우 서버 설치

원문 : http://kkamagui.springnote.com/pages/585605


들어가기 전에...


0.시작하면서...

 개발자라면 한번쯤 소스 관리에 대해서 고민해 봤을 것이다. 특히나 수정이 잦은 프로그램이라면 더욱 더 버전 관리가 중요한데, 이걸 일일이 폴더나 날짜별로 관리하다가는 낭패를 보기 십상이다. 그래서 버전관리 프로그램을 사용하는데, 대표적인 것으로 소스세이프(Source Safe), CVS, Subversion 있다.

 윈도우 프로그래머라면 소스세이프가 굉장히 유용한데(Visual Studio를 설치하면 자동으로 깔리므로... ㅡ_ㅡa..), 사용해보니 속도가 무지 느리고 VC 또한 한참 뒤에 뜨게하는 무시무시한 단점이 있어서 다른 것을 찾다가 서브버전을 선택하게 되었다.

 서브버전의 장점은 인터넷에 잘 나오므로 굳이 이야기하지 않겠고, 실제 윈도우 버전 설치 및 설정에 대해서 알아보자.


1.Tortoise 서브버전(Subversion) 클라이언트 설치

1.1 Tortoise 서브버전(Subversion) 클라이언트 다운로드

 서브버전 서버를 설치한다면서 왜 클라이언트를 설치하는 것일까? 그것은 서버 설치후 나머지 작업을 편리하게 할 수 있기 때문이다.

 서브버전 클라이언트는 http://tortoisesvn.net/downloads 에서 다운 받을 수 있다.

Subversion9.PNG

<Tortoise 서브버전 클라이언트>


1.2 Tortoise 서브버전(Subversion) 클라이언트 설치

 클라이언트 설치는 간단하다. 무조건 "Next" 버튼을 눌러서 완료를 하면 알아서 다 해준다.

Subversion10.PNG 

<Tortoise 서브버전(Subversion) 클라이언트 설치>


 설치 후 탐색기에서 오른쪽 버튼을 클릭했을 때 아래와 같은 메뉴가 뜨면 정상적으로 설치된 것이다.

 Subversion11.PNG

<설치 완료>


2.서브버전(Subversion) 서버 설치

2.1 서브버전(Subversion) 서버 다운로드

 서브버전의 윈도우용 설치 파일은 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 에서 찾을 수 있다. 위 사이트로 이동하면 아래와 같은 화면을 볼 수 있는데, 최신버전의 설치 파일을 다운받아서 설치하도록 하자.

Subversion1.PNG 

<서브버전 서버 파일 다운로드>


2.2 서브버전(Subversion) 설치

 설치 과정은 아주 간단하다. 윈도우 인스톨 파일을 더블클릭해서 기본 옵션으로 설치하면 된다. "Next" 를 계속해서 클릭하여 완료하자.

Subversion2.PNG 

<인스톨 화면>


--------------------------참고----------------------------------------
 참고..서버 설치후 서버가 시작되었는지 윈도우 서비스에서 확인한다.
윈도우 재시작을 하지 않고 그냥 진행했을 경우...서브버전 서비스가 실행이 안되어서 삽질했음

--------------------------참고  끝------------------------------------

2.3 서브버전(Subversion) 설정

2.3.1 서브버전(Subversion) 데이터 폴더 생성(Repository)

 서버 설치가 끝났으니 데이터를 저장할 폴더를 생성해야한다. 저장소는 하드디스크의 특정 폴더로 하면 되고, 임의의 이름으로 선택 가능하다. 일단 D:\Repository로 해서 생성하자.

Subversion3.PNG

<저장소 생성>


2.3.2 서비스(Service) 등록

 서브버전 서버를 서비스로 등록하여 윈도우 부팅시에 자동으로 실행되도록 하자. 윈도우 서비스 등록은 sc.exe 프로세스로 등록가능하다. cmd.exe를 실행해서 아래와 같이 입력하도록 하자.

 Subversion4.PNG

<서비스 등록>

 아래는 서브버전 서비스를 등록하고 서비스를 해제하는 명령이다.

  • 서비스 등록 : sc create svn binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service -r D:\repository" displayname= "Subversion Server" depend= Tcpip start= auto

  • 서비스 해제 : sc delete svn displayname= "Subversion Server"

 별다른 문제가 없다면 성공적으로 등록했다는 메시지가 출력될 것이다.


2.3.3 방화벽(Firewall) 해제

 서브버전은 TCP 3690 포트와 UDP 3690 포트를 사용한다. 윈도우 방화벽 및 Anti-Virus의 방화벽을 해제하도록 하자.

 아래는 윈도우 방화벽에서 포트를 추가하는 방법이다. TCP와 UDP 각각 등록해서 모두 가능하도록 하자.
Subversion5.PNG

<방화벽 해제>


2.4 저장소(Repository) 생성

 이제 서버 설정이 끝났으니 실제로 소스 또는 데이터를 관리할 저장소(Repository)를 생성해야 한다. 서브버전 관련 데이터는 D:\Repository 에 저장하기로 했으므로 하위 폴더에 저장소를 생성하자.


2.4.1 커맨드 라인(Command Line) 방식

 cmd.exe 를 실행한 뒤 D:\Repository 폴더로 이동하여 아래와 같이 입력한다.

"C:\Program Files\Subversion\bin\svnadmin" create --fs-type fsfs test

 위의 파란색으로 표시된 test를 유의해서 보자. test 대신에 생성을 원하는 폴더명으로 바꿔서 입력하면 된다.

 아래는 위의 명령을 실행한 후 결과 화면이다.

Subversion6.PNG 

<저장소 생성>

2.4.2 Tortois Subversion 클라이언트를 사용한 방식

 Tortois Subversion 클라이언트를 설치했다면 좀더 편한 방법으로 생성할 수 있다. 아래는 Tortoise Subversion 클라이언트를 통해 생성하는 방법이다.

 Subversion7.PNG

<저장소 생성>

 D:\Repository 폴더에 생성할 저장소 이름(Test)의 폴더를 미리 생성한 후 Tortoise Subversion 클라이언트에서 "Create repository here"를 클릭하면 된다.

 파일 시스템을 선택하는 다이얼로그가 뜨면 "Native filesystem(fsfs)"를 선택한 후 OK를 눌러서 생성하면 된다.


2.5 저장소 접근 설정

 저장소를 생성하고 나면 아래와 같은 폴더와 파일들이 생긴다.

Subversion8.PNG

<저장소 폴더 상태>

 이 중에서 접근 권한을 제어하기위해서는 2개의 파일을 손봐야 하는데 다음 항목을 보자


2.5.1 svnserve.conf

  1. ### This file controls the configuration of the svnserve daemon, if you
    ### use it to allow access to this repository.  (If you only allow
    ### access through http: and/or file: URLs, then this file is
    ### irrelevant.)
  2. ### Visit http://subversion.tigris.org/ for more information.
  3. [general]
    ### These options control access to the repository for unauthenticated
    ### and authenticated users.  Valid values are "write", "read",
    ### and "none".  The sample settings below are the defaults.
    anon-access = none     <== 로그인 하지 않은 사용자는 아무것도 못하도록 한다.
    auth-access = write
  4. ### The password-db option controls the location of the password
    ### database file.  Unless you specify a path starting with a /,
    ### the file's location is relative to the conf directory.
    ### Uncomment the line below to use the default password file.
    password-db = passwd   <== ID와 Password를 저장하는 파일 이름
  5. ### The authz-db option controls the location of the authorization
    ### rules for path-based access control.  Unless you specify a path
    ### starting with a /, the file's location is relative to the conf
    ### directory.  If you don't specify an authz-db, no path-based access
    ### control is done.
    ### Uncomment the line below to use the default authorization file.
    #authz-db = authz
  6. ### This option specifies the authentication realm of the repository.
    ### If two repositories have the same authentication realm, they should
    ### have the same password database, and vice versa.  The default realm
    ### is repository's uuid.
    realm = KKAMAGUI Repository   <== 접근했을 때 클라이언트에게 보여줄 저장소 메시지

 위와 같이 파일을 수정한 다음 저장한다.


2.5.2 passwd

  1. ### This file is an example password file for svnserve.
    ### Its format is similar to that of svnserve.conf. As shown in the
    ### example below it contains one section labelled [users].
    ### The name and password for each user follow, one account per line.
  2. [users]
    # harry = harryssecret
    # sally = sallyssecret
    kkamagui = kkamagui

 위와 같이 ID = Password의 형태로 입력한 뒤 저장하면 된다.



3.간단한 서브버전(Subversion) 서버 테스트

 테스트 방법은 간단하다. 탐색기에서 오른쪽 버튼을 눌러서 표시되는 메뉴에서 "Repo-Browser" 를 클릭하여 아래와 같은 창이 뜨면 서브버전 서버가 설치된 주소와 저장소 이름을 같이 입력해주면 된다.

Subversion7.PNG

<Repo-browser 메뉴>


 이제 주소와 저장소의 이름을 입력하자. 주소를 kkamagui.egloos.com, 그리고 저장소를 test라고 가정하고 입력하면 아래와 같이 될 것이다.

Subversion12.PNG 

<서브버전 주소 입력>


"OK" 버튼을 누르면 실제 서버에 접속해서 저장소 정보를 얻어오는데, 아래와 같은 화면이 표시될 것이다. 실제로 정상적으로 접속이 된다면 "test" 항목 아래에 아무것도 표시되지 않을 것이지만 문제가 발생한다면 아래와 같이 에러메시지가 표시될 것이다.

Subversion13.PNG

<Repo-Browser 실행-에러발생>


 위와 같은 에러 메시지가 표시되면 처음 단계부터 설정을 다시 한번 확인하자. 아무런 에러 메시지가 없다면 정상적으로 설치된 경우이므로 열심히 Check-out, commit, update를 반복하면 된다.


4.서브버전(Subversion) 서버를 설치하지 않고 로컬(Local)에서 소스 관리하기

 서브버전 서버가 설치되어있어야 꼭 소스 버전 관리가 가능한 것일까? "답은 그렇지 않다" 이다.

 Tortoise Subversion 클라이언트를 설치했다면 로컬에 저장소를 만들고 file:/// 키워드로 접근하여 소스 버전을 관리하는 것이 가능하다.


4.1 저장소 생성

 위의 "2.4 저장소(Repository) 생성" 부분을 참고해서 로컬에 Tortoise를 이용하여 저장소를 생성하자. 그리고 파일들을 수정해서 특정 유저만 접근가능하도록 수정하자.


4.2 저장소 접근 테스트

 위의 "3.간단한 서브버전(Subversion) 서버 테스트" 부분을 참고하여 "Repo-browser"를 실행하고 주소에 아래와 같이 입력한 후 OK를 누르자.

file:///d:\repository\test

 정상적으로 실행되면 아래와 같은 화면이 표시될 것이다.

 Subversion14.PNG

<Repo-browser 실행>

 아무런 에러가 없으므로 정상적으로 실행되었음을 알 수 있다. 이렇게 함으로써 서버를 설치하지 않고도 로컬에서 소스 버전관리를 할 수 있다.


5.기타 팁

5.1 버전 관리시 무시할 파일 확장자 설정

 소스를 컴파일해서 나오는 object 파일이나 기타 필요없는 부산물들은 버전관리를 할 필요가 없다. 그런 파일들을 일일이 수작업으로 제외하기는 상당히 귀찮은 작업인데, 다행이 Tortoise에서 이것을 편리하게 할 수 있는 옵션이 있다.

 "Settings" 메뉴에 가면 아래와 같은 화면이 표시된다. 여기에 "Global Ignore Pattern" 항목에 무시할 파일의 확장자나 파일명을 입력하면 된다.

*.scc *.sbr *.pch *.pcb *.ilk *.idb *.res *.o *.obj *.ncb *.opt *.plg

Subversion15.png 

<확장자 및 파일명 입력>


6.마치면서...

 이로서 그 지긋지긋하게 느린 소스세이프(SourceSafe)에서 벗어날 수 있게 되었다(이렇게 좋을 수가... ㅜ_ㅜ). 소스 버전 관리를 통해 프로젝트를 보다 효율적으로 관리하고 협업의 능률을 최대한 활용하자. @0@)/~~!!


7.참고 사이트

Posted by 1010