제갈장비
dojeun.egloos.com
이글루스 | 로그인

라면 한그릇 드세요.. ㅋㅋ
by 제갈장비
카테고리
전체
제갈장비-Linux
제갈장비-TOMCAT
제갈장비-JAVA
--------------------
문서-Linux
문서-Powerbuilder
문서-JAVA
문서-ASP
문서-하드웨어
문서-EDPS
문서-MSSQL
--------------------
TIP-JAVA
TIP-Perl
TIP-ASP
TIP-Powerbuilder 01
TIP-Javascript
TIP-Excel
TIP-XML
TIP-MSAccess
TIP-PostgreSql
TIP-Windows
TIP-Linux
TIP-HTML
TIP-TOMCAT
--------------------
ETC
Secret
Util-Japan
미분류
최근 등록된 덧글
잘읽어 보았습니다. 그런..
by 이윤철 at 11/07
1000 666
by qhrlfeh77 at 05/21
123
by qhrlfeh77 at 05/21

by qhrlfeh77 at 05/21
감사합니다!! HashSet..
by 세레네이 at 04/06
찾고 있었던 자료인데 ..
by 나그네 at 01/09
감사합니다. 잘 보았습..
by 졸면죽는다 at 10/28
좋은 정보 정말 감사합니..
by 강성훈 at 10/22
좋은글 퍼가겠습니다.
by 정의진 at 09/29
이제야 봤습니다. iText..
by 제갈장비 at 08/09
이글루 파인더
Powered by egloos
rss

skin by 이글루스
2008년 08월 08일
일본어 운영체제에서 Opera와 Firefox를 사용할 때 한글입력에서...
지금 일본어 버전 Windows2000 에서
Firefox 3.0.1로 이 글을 작성하고 있는데
Opera 9.51에선 한글입력에 문제가 있다.
Opera에선 한글입력 후 띄어쓰기를 하려고 스페이스바를 누르면
직전에 입력했던 한글이 다시 나타나는 문제가 있다.

한글버전에선 문제가 없는지....
# by 제갈장비 | 2008/08/08 00:07 | TIP-Windows | 트랙백 | 덧글(0)
2006년 11월 10일
ASP참고 페이지 모으기
ASP, VBScript에서 자신만의 클래스(Class) 만드는 방법
http://korea.internet.com/channel/content.asp?nid=14820&cid=185#start

ASP,ASP.NET & Script
http://www.egocube.pe.kr/asp_main.asp

ASP 공부하지 않으련
http://ven.kangnam.ac.kr/software/asp/

http://www.superuser.co.kr/asp/index.htm
# by 제갈장비 | 2006/11/10 10:37 | TIP-ASP | 트랙백 | 덧글(0)
2006년 10월 27일
Log4J

http://kwon37xi.egloos.com/2176487

http://www.50001.com/language/javaside/eyjin/2-2/8-1.html

http://www.php.pe.kr/java_main/tnt/etc/log4j_config.html

여러파일에 로그를 남기는 방법에 대하여

log4j 에서 struts 관련 로그 끄기

http://blog.naver.com/loverobin/60026805373

# by 제갈장비 | 2006/10/27 11:01 | TIP-JAVA | 트랙백 | 덧글(0)
2006년 10월 23일
[펌]톰캣에서 log4j 실행시 에러 바로 잡기
출처 : http://cafe.naver.com/devmaster.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=30


일반적으로 웹 문서를 찾아보면 log4j-1.2.13.jar를 클래스 패스에 추가 시킨 후

/WEB-INF/classes아래 log4j.properties파일을 넣으면 간단하게 실행이 된다고 써 있다.

 

그러나 톰캣을 실행 시킬 경우 아래와 같은 문구가 뜨면서 로깅이 안되는 경우가 자주 발생한다.

 

log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester).
log4j:WARN Please initialize the log4j system properly.

 

 

이것은 log4j.properties를 찾지 못해서 초기화가 안되어 나는 메시지이다.

물론 아래와 같이 콘솔에만 출력하는 경우에는 별로 문제 될 것이 없다.

 

----------------------------------------------------------------------------------------------------

import org.apache.log4j.Logger; 
import org.apache.log4j.BasicConfigurator; 
public class SimpleLog { 
// Logger 클래스의 인스턴스를 받아온다. 
 static Logger logger = Logger.getLogger(SimpleLog.class); 
 public SimpleLog() {} 
 public static void main(String[] args) { 
 /* 콘솔로 로그 출력 위한 간단한 설정, 이 설정이 없다면 경고 메세지가 출력되면서 실행이 중단된다.*/ 
 BasicConfigurator.configure(); 
 logger.debug("Hello log4j."); 
 logger.info("Hello log4j."); 
 logger.warn("Hello log4j."); 
 logger.error("Hello log4j."); 
 logger.fatal("Hello log4j."); 
 //loger.log( Level.DEBUG , "debug") 와 동일하다. 
 } 
} 

 

----------------------------------------------------------------------------------------------------------------

그러나 파일에 출력하면 서 콘솔에 출력하려면 문제가 발생한다.

간단하게 해결하는 방법은 properties파일을 톰캣이 실행되는 /bin 아래 두는 것이다.

 

그러나 좀더 우아하게 해결하려면 초기화 서블릿을 만들면 된다.

 

=================================================================================================================

 

package com.foo;

 

import org.apache.log4j.PropertyConfigurator;


import javax.servlet.http.HttpServlet;


import javax.servlet.http.HttpServletRequest;


import javax.servlet.http.HttpServletResponse;


import java.io.PrintWriter;


import java.io.IOException;

 

 

public class Log4jInit extends HttpServlet {

 

  public  void init() {


     String prefix =  getServletContext().getRealPath("/");


     String file = getInitParameter("log4j-init-file");


     // if the log4j-init-file is not set, then no point in trying


      if(file != null) {


       PropertyConfigurator.configure(prefix+file);


      }


  }

 

  public  void doGet(HttpServletRequest req, HttpServletResponse res) {


  }


}

===========================================================================================================

그리고 아래 내용을 web.xml에 추가 시킨다.

=============================================================================================================

 

 <servlet>
     <servlet-name>log4j-init</servlet-name>
     <servlet-class>com.foo.Log4jInit</servlet-class>

     <init-param>
       <param-name>log4j-init-file</param-name>
       <param-value>WEB-INF/classes/log4j.properties</param-value>
     </init-param>

     <load-on-startup>1</load-on-startup>
 </servlet>


===============================================================================================================

 

 

 

 

그리고 다음과 같이 간단하 해 주면 파일과 콘솔에 떨어지는 로그를 볼 수 있다.

=======================================================================================================

 

import org.apache.log4j.Logger;

public class CBselectordertot {

 

    private static Logger logger = Logger.getLogger(ip001Impl.class);

 

    public ipcdOut[] getSelectIpcd(String kind,String wherecond){

        ......

        ......

        logger.info("getSelect_ipcd  query = "+query);

        ........

 

        ...........

    }

}

 

==================================================================================================   

 

 

 

또 하나의 경우...

코바 서버 같은 것을 구동 시킬경우 로깅을 하기 위해서는 다음과 같이 JVM args를 넣어줘야 한다.(톰캣과는 별개로)

 

**vizibroker에서 코바 서버구동 예제

vbj -Dlog4j.configuration=file:d:\ipams\WEB-INF\classes\log4j.properties ip002Server

 

 

properties예제는 파일에 첨부 했다.

첨부파일 : log4j.properties

원하는 디렉토리에 떨어뜨리는 것인데 이대로 사용해도 훌륭하다.

# by 제갈장비 | 2006/10/23 18:30 | TIP-TOMCAT | 덧글(0)
2006년 10월 19일
무료 DBMS SQL Server Express

출처 : http://www.zdnet.co.kr/builder/dev/dotnet/0,39031607,39142067,00.htm

무료 DBMS SQL Server Express

노규남(IT 테크라이터)   2005/12/05

지난 회에 이어 VS Express의 구성요소들에 대해서 알아보는 시간을 한주 더 갖도록 하자. 이번 주에 살펴볼 구성요소는 SQL Server Express이다. 이미 잘 알려져 있지만 모르는 사람들을 위해서 부연하자면 이 패키지는 MSDE(Microsoft Desktop Engine)이라고 하는, MS가 이전에 배포한 무료 DBMS의 후신에 해당하는 것이다.

실제 필드에서 프로젝트를 하다보면 Database를 사용하지 않는 경우가 오히려 드물 정도로 DBMS는 개발의 필수요소라 할 수 있는데 최근 DBMS의 기능이 많이 발전한 것은 사실이지만 그 가격이나 덩치 면에서 적잖게 부담되는 면도 없지 않다. 리눅스를 대표로 하는 오픈소스 진영에는 MySQL, PostgreSQL등의 무료 DBMS가 여럿 있었지만 윈도에서만 개발하던 프로그래머라면 이런 DBMS에 접근하기도 쉽지 않았다.

그래서 MSDE가 무료로 배포되기 전에는 비싼 DBMS 대신 Access의 MDB파일을 파일 데이터베이스로 사용했던 적도 있었다. 그러나 MDB는 쓰고 지우기를 반복하다보면 용량이 엄청나게 늘어나는 문제점이 있었고, 파일이 굉장히 잘 깨진다는 단점이 있었기 때문에 관리에 대해 충분한 지식을 갖지 않은 사용자들에게는 어려웠다.

이런 상황을 타개하기 위해 등장한 MSDE는 SQL Server 7과 동일한 엔진을 사용하되 GUI로 구동되는 관리용 애플리케이션과 분석도구들을 빼고 용량에 제한을 둔 버전이었는데 소규모의 사이트나 SI 프로젝트를 중심으로 대단한 인기를 얻었다. 또한 SQL Server와 같은 엔진을 사용한다는 호환성면에서의 잇점과 무료라는 매력 때문에 아직도 많은 사이트에서 널리 사용되고 있는 중이다. 그러나 VS2005와 같이 발표된 SQL Server Express는 이 MSDE보다도 한 수 위라는 것이 필자의 평가이다. 그러면서도 똑같이 무료이다.

설치하기
여타 VS Express의 컴포넌트와 마찬가지로 MS의 VS Express사이트에서 다운로드 후 설치한다. 다른 점이 있다면 VS Express는 향후 1년간 다운로드 받는 사용자에 한해 무료이지만 SQL Server Express는 영구히 무료로 배포하게 되어 있다는 것이다. 그간 무료 DBMS의 대명사처럼 여겨졌던 MySQL도 최근 좀 헛갈리는 라이선스 프로그램을 내놓고 대대적으로 상용화할 속내를 비치고 있는 상황을 고려할 때 이런 MS의 정책은 크게 반길만하다.

본문에서 설명하겠지만 소규모~중규모의 사이트라면 SQL Server Express는 충분히 상용화 가능한 패키지일 뿐만 아니라 설치의 편의성, 가벼움, 무료라는 장점을 생각하면 오라클이나 SQL Server 2005의 정품보다 오히려 나은 선택일 수 있다. 이 패키지가 무료이며 기능제한이 있는 Express 에디션임에도 불구하고 상용패키지와 비교하는 것은 그만큼 강력하고 사용자의 요구를 커버할 수 있는 범위가 넓기 때문이다. 재배포도 가능한데 이때는 MS에서 제안하는 Go-Live 라이센스에 동의해야 한다. Go-Live 라이센스에 대해서는 다음 링크를 참조하자.

http://www.microsoft.com/korea/msdn/vs2005/golive/

SQL Server Express의 패키지 용량은 약 55MB정도 되는데 Windows 2000이상을 요구하며, 닷넷 프레임워크 2.0 과 Windows Installer 3.0이상을 필요로 한다. 물론 이전 버전의 VS 2005 및 VS 2005 Express버전을 모두 깨끗이 삭제한 후 설치해야 한다. VS2005 beta를 지워주는 CleanUp 도구에 대해서는 여러번 소개했으니 다시 언급하지는 않겠다.

설치과정은 몇 번 마우스클릭을 해주면 끝날 정도로 간단하다. 이 작업이 종료되면 SQL Server Express가 정상적으로 작동중인지를 확인하기 위해 코맨드 라인을 하나 띄워서 다음과 같이 입력해보자.


sqlcmd -S localhost\SQLExpress

1>과 같이 숫자가 계속해서 증가하는 프롬프트가 나타나면 성공이다. sqlcmd는 SQL Server Express에 접속하는 코맨드 라인 유틸리티로 -S는 서버를 지정하는 옵션을 준 것이다. 여기서는 localhost의 SQLExpress라는 Instance를 지정했다. SQL Server Express의 Default Instance이름은 항상 'SQLExpress'가 되니 참고하기 바란다. 여기서 여러 가지 명령으로 서버를 조작할 수 있으며, MSDE에도 있던 전통적인 osql을 사용할 수도 있다. osql로 유사한 방식으로 접속한 후 TSQL 명령을 입력해서 원하는 작업을 하면 된다.

그러나 GUI가 대중화된지 10년이 넘은 지금 코맨드 라인 도구를 이용해 조작하는 것은 역시 불편하다. 이것은 대부분의 무료 DBMS가 겪고 있는 문제점으로, 서버의 성능은 만족하나 편의하게 사용할 수 있는 클라이언트단 도구가 항상 부족하다는 것이다. SQL Server Express는 이에 대한 해결책으로 SQL Server Management Studio Express라는 멋진 도구를 같이 제공한다. 이 도구에 대해서는 뒤에 다시 다루도록 하자.

SQL Server Express는 SQL Server 2005이다
SQL Server Express와 MSDE를 구분 짓는 가장 큰 특징은 SQL Server Express는 SQL Server 2005의 한 에디션이라는 것이다. MSDE가 SQL Server 7의 엔진을 사용하기는 했지만 어디까지나 MSDE는 SQL Server와는 달랐고 그렇기 때문에 MSDE를 쓰고자 하는 사용자는 새로운 도구들을 익히지 않으면 안 되었다. 하지만 SQL Server Express는 엄연히 SQL Server 2005의 한가지 버전이므로 기본적인 컨셉, 도구, 관리방법 등을 모두 공유한다. 물론 SQL Server Express는 기능이나 용량등에서 제한을 받기는 하지만 MSDE처럼 SQL Server와 별개로 다루어지는 제품이 아니라는 뜻이다. 그렇기 때문에 SQL Server 2005에 관련된 문서나 책자를 가지고 있다면 기본적인 부분은 SQL Server Express에도 똑같이 적용된다.

또한 이런 이유로 인해, 사이트가 확장되어서 더 많은 용량과 기능이 필요해지면 SQL Server Express를 Workgroup -> Standard -> Enterprise버전으로 업그레이드하는데도 큰 비용이나 시간이 들지 않는다. 관리도구나 그 동안 사용했던 애플리케이션도 똑같이 쓰면 된다. 이 부분은 MS의 노림수이기도 할 것으로 보이는데, SQL Server Express는 무료로 배포해서 저변을 늘리고 사이트가 확장될때 정식버전을 판매해서 수익을 올리는 방식이 어느 정도 설득력이 있다. 어쨌거나 사용자 입장에서는 다소의 제한이 걸린 SQL Server 2005를 무료로 쓰게 된 셈이니 나쁠 건 없다.

SQL Server Management Studio Express
MySQL이나 MSDE와 같은 무료 DBMS를 사용하는 사람들의 가장 큰 불만은 데이터베이스를 관리하는 클라이언트단 유틸리티가 빈약하다는 것이다. 그러나 SQL Server Express에서는 SQL Server Management Studio Express(이하 SSMSE)라는 멋진 툴을 사용할 수 있다. 이 도구는 현재 정식버전이 아닌 CTP이지만 SQL Server Express와 함께 매우 안정적으로 잘 작동하며 강력하다. 설치파일은 약 30MB정도인데 닷넷 Framework 2.0과 MSXML Parser 6.0가 미리 설치되어 있어야 하므로 참고하자. 파일은 다음 페이지에서 받을 수 있다.

http://www.microsoft.com/downloads/details.aspx?

설치 후 실행해보면 어떤 식으로 사용하는지 금방 익힐 수 있는 친숙한 인터페이스가 나타나며, 사용자는 이 도구를 이용해 계정, 데이터베이스, 테이블등 DBMS 관련된 모든 객체를 관리하고 조회할 수 있다. SQL Server나 오라클을 써본 사람이라면 배울 필요도 없이 금방 쓸 수 있는 매우 일반적인 인터페이스를 채용하고 있다. 사실 SSMSE를 사용하면 다른 도구가 거의 필요 없을 정도인데 무료로 사용할 수 있는 DBMS에 이 정도의 툴을 지급한다는 것은 다른 무료 DBMS와 확실히 차별화되는 SQL Server Express만의 장점일 것이다.

기능 제한과 주요 기능
SQL Server Express는 여러 가지 기능적인 제한을 갖는다고 앞서 언급했다. 그 주요제한은 다음과 같다.


  • 리포팅 서비스는 지원되지 않는다.

  • OLAP/Data mining 서비스는 지원되지 않는다.
  • Analsys 서비스는 지원하지 않는다.
  • DTS를 지원하지 않는다.
  • Database Mirroring은 지원하지 않는다.
  • Database의 크기는 4GB로 제한된다.
  • 지원하는 RAM의 크기는 1GB까지이다.
  • SMP시스템이라도 CPU는 1개만 지원한다.

    그러나 SQL Server Express는 SQL Server 2005의 한 에디션이다. 그러므로 다음과 같은 주요기능들을 지원한다.

  • SQL Server Express는 stored procedure를 지원한다.
  • SQL Server Express는 view를 지원한다.
  • SQL Server는 Trigger를 지원한다.
  • SQL Server는 Replication Subscriber가 될 수 있다.
  • SQL Server는 XML을 지원한다.

    여기서 설명되지 않은 제한이나 기능도 있지만 전체적인 모양은 작은 사이트에서 사용할 때 최고의 성능을 발휘하도록 최적화된 그런 형태이다. SQL Server의 정품이 갖는 고급기능도 많이 포함하고 있으므로 개발자 입장에서는 훨씬 편하게 작업할 수 있을 것이다. 다만 데이터베이스의 크기가 4GB로 제한되어 있으므로 대용량 데이터가 지속적으로 발생하는 사이트에서는 쓰기 어렵고, 또 램 1GB와 CPU 1개의 제한이 있기 때문에 고성능을 요하는 사이트에도 역시 맞지 않다. 이런 점을 생각해서 자신이나 자신의 조직에 어떤 에디션이 필요한지 잘 판단해보기 바란다. 하지만 SQL Server Express는 많은 경우 최선의 선택이 될 것이다.

    마치며
    지금까지 설명한 내용들을 보면 알 수 있듯이 SQL Server Express가 SQL Server 정품에 비교해 갖는 제한이라는 것은 사이트가 작으면 거의 문제가 되지 않는 것임에 비해 지원하는 기능들은 너무나 강력하다. 또한 거듭 얘기되지만 SQL Server Express는 SQL Server 2005의 한 에디션이므로 향후 업그레이드가 용이하다는 것도 큰 장점이다.

    SQL Server Express는 이런 장점들을 바탕으로 그간 MySQL 등 오픈소스 쪽의 무료 DBMS들이 차지했던 시장의 상당부분을 차지할 가능성이 있다. MS의 독점이 심화되는 것은 분명 경계할만한 일이지만 이젠 기존의 것보다는 좀더 강력하며 편리한 인터페이스를 갖는 무료 DBMS 하나쯤 나와도 좋지 않을까 한다. 항상 경쟁은 발전을 유도하는 법이므로 MS의 무료배포에 자극받은 오픈소스 측의 DBMS들이 지금보다 더 발전하게 된다면 그것도 역시 좋은 일이다. 시장의 방향이 어느 쪽으로 흘러가든 사용자는 즐겁게 기다릴 뿐이다.
  • # by 제갈장비 | 2006/10/19 16:31 | 문서-MSSQL | 트랙백 | 덧글(0)
    2006년 10월 19일
    vi Editor 명령어 요약

     

    vi Editor's Command Collection

     command line 명령어

    내 용

    vi file

    vi를 시작하여 지정한 파일 편집

    vi -r file

    읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집

    view file

    읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집

    vi -r

    되살릴 수 있는 모든 파일 이름 보여주기

    vi -r file

    vi를 시작하여 지정한 파일 되살리기

    편 집 명 령

    내 용

    i

    입력 모드로 전환, 커서 위치 앞에서 삽입

    a

    입력 모드로 전환, 커서 위치 뒤에서 삽입

    I

    입력 모드로 전환, 현재 줄의 앞에 삽입

    A

    입력 모드로 전환, 현재 줄의 끝에 삽입

    o

    입력 모드로 전환, 현재 줄의 아래에 전개

    O

    입력 모드로 전환, 현재 줄의 위에 전개

    :e file

    지정한 파일의 편집

    :e! file

    지정한 파일의 편집, 자동 점검의 생략

    r

    단지 한 글자만 변경(입력 모드로 바뀌지 않음)

    R

    입력하는 대로 겹쳐 써서 변경

    s

    삽입에 의해 한 단어의 변경

    C

    커서의 위치로부터 줄 끝까지 삽입에 의한 변경

    cc

    전체 줄을 삽입에 의한 변경

    S

    전체 줄을 삽입에 의한 변경

    cmove

    커서부터 move까지 삽입에 의해 변경

    ~

    대,소문자 바꾸기

    u

    편집 버퍼를 수정했던 마지막 명령을 취소

    U

    현재 줄을 저장

    .

    편집 버퍼를 수정했던 마지막 명령 반복

    x

    커서가 있는 문자 삭제

    X

    커서의 왼쪽 문자 삭제

    D

    커서부터 줄의 끝까지 삭제

    dd

    현재 줄의 전체 삭제

    dmove

    커서부터 move까지 삭제

    dG

    커서부터 편집 버퍼의 끝까지 삭제

    d1G

    커서부터 편집 버퍼의 맨 앞까지 삭제

    :<line>d

    지정한 줄의 삭제

    :<line>,<line>d

    지정한 범위의 삭제

    :<line>co<target>

    지정한 줄을 복사하여 target 줄 밑에 삽입

    :<line>, <line>co<target>

    지정한 범위를 복사하여 target 줄 밑에 삽입

    :<line>m<target?

    지정한 줄로 이동하여 target 줄 밑에 삽입

    :<line>, <line>m<target>

    지정한 범위로 이동하여target 줄 밑에 삽입

    <n>!!command

    n번 줄에서 command의 실행

    !move command

    커서부터 move까지 command 실행

    !move fmt

    커서부터 move까지 줄들을 형식 맞추기

    :w

    원래의 파일로 데이터를 저장

    :w file

    지정한 파일로 데이터를 저장

    :w>> file

    지정한 파일에 데이터를 추가

    :wq

    데이터를 저장하고 종료

    :q!

    데이터를 저장하지 않고 종료

    :set number

    내부 줄 번호 디스플레이

    :set nonumber

    내부 줄 번호 디스플레이 않기

    p

    마지막으로 지워진 것을 커서의 뒤/아래에 삽입

    P

    마지막으로 지워진 것을 커서의 앞/위에 삽입

    xp

    두 문자를 바꿈

    deep

    두 단어를 바꿈

    ddp

    두 줄을 바꿈

    /rexp

    지정된 정규 표현식에 대해 앞으로 이동

    /

    이전의 패턴에 대해 앞으로 검색을 반복

    ?rexp

    지정된 정규 표현식에 대해 뒤로 이동

    ?

    이전의 패턴에 대해 뒤로 검색을 반복

    n

    /나 ?명령에 대해 같은 방향으로 반복

    N

    /나 ?명령에 대해 반대 방향으로 반복

    :ab short long

    short를 long에 대한 약어로 변경

    :ab

    현재 약어 목록을 표시

    :una short

    약어 short를 표시

    r<Return>

    문자를 뉴라인으로 변경

    J

    아래 line을 현재 line과 합치기

    :set wm=n

    오른쪽으로 n문자 위치에서 자동적으로 줄 나눔

    h or <Left key>

    커서를 한 칸 왼쪽으로 이동

    j or <Down key>

    커서를 한 줄 아래로 이동

    k or <Up key>

    커서를 한 줄 위로 이동

    l or <Right key>

    커서를 한 칸 오른쪽으로 이동

    <Backspace>

    커서를 한 칸 왼쪽으로 이동

    <Space>

    커서를 한 칸 오른쪽으로 이동

    -

    커서를 이전 줄의 처음으로 이동

    +

    커서를 다음 줄의 처음으로 이동

    <Return>

    커서를 다음 줄의 처음으로 이동

    0

    커서를 현재 줄의 맨 앞으로 이동

    $

    커서를 현재 줄의 맨 끝으로 이동

    ^

    커서를 현재 줄의 첫글자(공백이나 탭이 아닌)로 이동

    w

    커서를 다음 단어의 첫 글자로 이동

    e

    커서를 다음 단어의 끝 글자로 이동

    b

    커서를 이전 단어의 첫 글자로 이동

    W

    w와 같음(문장 부호 무시)

    E

    e와 같음(문장 부호 무시)

    B

    b와 같음(문장 부호 무시)

    (

    다음 문장의 처음으로 이동

    )

    이전 문장의 처음으로 이동

    {

    다음 문단의 처음으로 이동

    }

    이전 문단의 처음으로 이동

    H

    커서를 화면 맨 위로 이동

    M

    커서를 중간으로 이동

    L

    커서를 맨 아래로 이동

    ^f

    한 화면 아래로 이동

    ^b

    화면 위로 이동

    ^d

    반 화면 아래로 이동

    ^u

    반 화면 위로 이동

    n^d

    n줄만큼 아래로 이동

    n^u

    n줄만큼 위로 이동

    :!command

    vi를 중단하고 지정한 셸 명령을 실행

    :!!

    vi를 중단하고 이전의 셸 명령을 실행

    :sh

    vi를 중단하고 셸을 실행

    :!csh

    vi를 중단하고 새로운 C-셸을 실행

    :s/<pattern>/<replace>/

    현재 줄의 치환

    :<line>s/<pattern>/<replace>/

    지정한 줄의 치환

    :<line>,<line>s/<pattern>/<replace>/ 

    정한 범위의 치환

    :%s/<pattern>/<replace>/

    모든 줄의 치환

    :<line>r file

    file의 내용을 지정한 줄 다음에 삽입

    :r file

    file의 내용을 현재의 줄 다음에 삽입

    :<line>r !command

    command의 결과를 지정한 줄 다음에 삽입

    :r !command

    command의 결과를 현재의 줄 다음에 삽입

    :r !look pattern

    지정한 pattern으로 시작된 단어 삽입

    .

    뉴라인을 제외한 모든 단일 문자와 대응

    *

    영 또는 그 이상의 선행 문자와 대응

    ^

    줄의 시작과 대응

    $

    줄의 끝과 대응

    \<

    단어의 시작과 대응

    \>

    단어의 끝과 대응

    [ ]

    묶여진 문자중의 하나와 대응

    [^ ]

    묶여진 문자를 제외한 아무것하고나 대응

    \

    이어지는 기호를 문자 그대로 해석

    <n>G

    줄번호 n으로 건너뛰기

    1G

    편집 버퍼의 첫 줄로 건너뛰기

    G

    편집 버퍼의 마지막 줄로 건너뛰기

    :map g lG

    g가 lG와 같도록 매크로 정의


    # by 제갈장비 | 2006/10/19 11:26 | TIP-Linux | 트랙백 | 핑백(1) | 덧글(0)
    2006년 10월 18일
    자바 문자열 엔코딩 테스트 모음


    정리일자 : 2006.10.18(수)
    정리자 : 제갈장비



    자바 문자열 엔코딩 테스트 모음

      String strTITLE01="";
      String strTITLE02="";
      String strTITLE03="";
      String strTITLE04="";
      String strTITLE05="";
      String strTITLE06="";
      String strTITLE07="";
      String strTITLE08="";
      String strTITLE09="";
      String strTITLE10="";
      String strTITLE11="";
      String strTITLE12="";
      String strTITLE13="";

      try {
       strTITLE01 = new String(title.getBytes("Shift_JIS"),"ISO-8859-1");
       strTITLE02 = new String(title.getBytes("Shift_JIS"),"EUC-JP");
       strTITLE03 = new String(title.getBytes("Shift_JIS"),"EUCJIS");
       strTITLE04 = new String(title.getBytes("Shift_JIS"),"UTF-8");
       strTITLE05 = new String(title.getBytes("ISO-8859-1"),"Shift_JIS");
       strTITLE06 = new String(title.getBytes("ISO-8859-1"),"EUC-JP");
       strTITLE07 = new String(title.getBytes("ISO-8859-1"),"EUCJIS");
       strTITLE08 = new String(title.getBytes("ISO-8859-1"),"UTF-8");
       strTITLE09 = new String(title.getBytes("ISO-8859-1"),"ISO-8859-1");
       strTITLE10= new String(title.getBytes("UTF-8"),"Shift_JIS");
       strTITLE11= new String(title.getBytes("UTF-8"),"EUC-JP");
       strTITLE12= new String(title.getBytes("UTF-8"),"MS932");
       strTITLE13= new String(title.getBytes("UTF-8"),"UTF-8");

       System.out.println(strTITLE01);
       System.out.println(strTITLE02);
       System.out.println(strTITLE03);
       System.out.println(strTITLE04);
       System.out.println(strTITLE05);
       System.out.println(strTITLE06);
       System.out.println(strTITLE07);
       System.out.println(strTITLE08);
       System.out.println(strTITLE09);
       System.out.println(strTITLE10);
       System.out.println(strTITLE11);
       System.out.println(strTITLE12);
       System.out.println(strTITLE13);
      } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
      }

    - 끝 -

    # by 제갈장비 | 2006/10/18 15:00 | 제갈장비-JAVA | 트랙백 | 덧글(0)
    2006년 10월 11일
    PostgreSql - Data Type Formatting Functions

    9.8. Data Type Formatting Functions



    The PostgreSQL formatting functions provide a powerful set of tools for converting various data types (date/time, integer, floating point, numeric) to formatted strings and for converting from formatted strings to specific data types. Table 9.20, “Formatting Functions” lists them. These functions all follow a common calling convention: the first argument is the value to be formatted and the second argument is a template that defines the output or input format.

    The to_timestamp function can also take a single double precision argument to convert from Unix epoch to timestamp with time zone. (Integer Unix epochs are implicitly cast to double precision.)

    Table 9.20. Formatting Functions

    FunctionReturn TypeDescriptionExample
    to_char(timestamp, text)textconvert time stamp to stringto_char(current_timestamp, 'HH12:MI:SS')
    to_char(interval, text)textconvert interval to stringto_char(interval '15h 2m 12s', 'HH24:MI:SS')
    to_char(int, text)textconvert integer to stringto_char(125, '999')
    to_char(double precision, text)textconvert real/double precision to stringto_char(125.8::real, '999D9')
    to_char(numeric, text)textconvert numeric to stringto_char(-125.8, '999D99S')
    to_date(text, text)dateconvert string to dateto_date('05 Dec 2000', 'DD Mon YYYY')
    to_timestamp(text, text)timestamp with time zoneconvert string to time stampto_timestamp('05 Dec 2000', 'DD Mon YYYY')
    to_timestamp(double precision)timestamp with time zoneconvert UNIX epoch to time stampto_timestamp(200120400)
    to_number(text, text)numericconvert string to numericto_number('12,454.8-', '99G999D9S')

    In an output template string (for to_char), there are certain patterns that are recognized and replaced with appropriately-formatted data from the value to be formatted. Any text that is not a template pattern is simply copied verbatim. Similarly, in an input template string (for anything but to_char), template patterns identify the parts of the input data string to be looked at and the values to be found there.

    Table 9.21, “Template Patterns for Date/Time Formatting” shows the template patterns available for formatting date and time values.

    Table 9.21. Template Patterns for Date/Time Formatting

    PatternDescription
    HHhour of day (01-12)
    HH12hour of day (01-12)
    HH24hour of day (00-23)
    MIminute (00-59)
    SSsecond (00-59)
    MSmillisecond (000-999)
    USmicrosecond (000000-999999)
    SSSSseconds past midnight (0-86399)
    AM or A.M. or PM or P.M. meridian indicator (uppercase)
    am or a.m. or pm or p.m. meridian indicator (lowercase)
    Y,YYYyear (4 and more digits) with comma
    YYYYyear (4 and more digits)
    YYYlast 3 digits of year
    YYlast 2 digits of year
    Ylast digit of year
    IYYYISO year (4 and more digits)
    IYYlast 3 digits of ISO year
    IYlast 2 digits of ISO year
    Ilast digits of ISO year
    BC or B.C. or AD or A.D. era indicator (uppercase)
    bc or b.c. or ad or a.d. era indicator (lowercase)
    MONTHfull uppercase month name (blank-padded to 9 chars)
    Monthfull mixed-case month name (blank-padded to 9 chars)
    monthfull lowercase month name (blank-padded to 9 chars)
    MONabbreviated uppercase month name (3 chars)
    Monabbreviated mixed-case month name (3 chars)
    monabbreviated lowercase month name (3 chars)
    MMmonth number (01-12)
    DAYfull uppercase day name (blank-padded to 9 chars)
    Dayfull mixed-case day name (blank-padded to 9 chars)
    dayfull lowercase day name (blank-padded to 9 chars)
    DYabbreviated uppercase day name (3 chars)
    Dyabbreviated mixed-case day name (3 chars)
    dyabbreviated lowercase day name (3 chars)
    DDDday of year (001-366)
    DDday of month (01-31)
    Dday of week (1-7; Sunday is 1)
    Wweek of month (1-5) (The first week starts on the first day of the month.)
    WWweek number of year (1-53) (The first week starts on the first day of the year.)
    IWISO week number of year (The first Thursday of the new year is in week 1.)
    CCcentury (2 digits)
    JJulian Day (days since January 1, 4712 BC)
    Qquarter
    RMmonth in Roman numerals (I-XII; I=January) (uppercase)
    rmmonth in Roman numerals (i-xii; i=January) (lowercase)
    TZtime-zone name (uppercase)
    tztime-zone name (lowercase)

    Certain modifiers may be applied to any template pattern to alter its behavior. For example, FMMonth is the Month pattern with the FM modifier. Table 9.22, “Template Pattern Modifiers for Date/Time Formatting” shows the modifier patterns for date/time formatting.

    Table 9.22. Template Pattern Modifiers for Date/Time Formatting

    ModifierDescriptionExample
    FM prefixfill mode (suppress padding blanks and zeroes)FMMonth
    TH suffixuppercase ordinal number suffixDDTH
    th suffixlowercase ordinal number suffixDDth
    FX prefixfixed format global option (see usage notes)FX Month DD Day
    SP suffixspell mode (not yet implemented)DDSP

    Usage notes for date/time formatting:

    • FM suppresses leading zeroes and trailing blanks that would otherwise be added to make the output of a pattern be fixed-width.

    • to_timestamp and to_date skip multiple blank spaces in the input string if the FX option is not used. FX must be specified as the first item in the template. For example to_timestamp('2000    JUN', 'YYYY MON') is correct, but to_timestamp('2000    JUN', 'FXYYYY MON') returns an error, because to_timestamp expects one space only.

    • Ordinary text is allowed in to_char templates and will be output literally. You can put a substring in double quotes to force it to be interpreted as literal text even if it contains pattern key words. For example, in '"Hello Year "YYYY', the YYYY will be replaced by the year data, but the single Y in Year will not be.

    • If you want to have a double quote in the output you must precede it with a backslash, for example '\\"YYYY Month\\"'. (Two backslashes are necessary because the backslash already has a special meaning in a string constant.)

    • The YYYY conversion from string to timestamp or date has a restriction if you use a year with more than 4 digits. You must use some non-digit character or template after YYYY, otherwise the year is always interpreted as 4 digits. For example (with the year 20000): to_date('200001131', 'YYYYMMDD') will be interpreted as a 4-digit year; instead use a non-digit separator after the year, like to_date('20000-1131', 'YYYY-MMDD') or to_date('20000Nov31', 'YYYYMonDD').

    • In conversions from string to timestamp or date, the CC field is ignored if there is a YYY, YYYY or Y,YYY field. If CC is used with YY or Y then the year is computed as (CC-1)*100+YY.

    • Millisecond (MS) and microsecond (US) values in a conversion from string to timestamp are used as part of the seconds after the decimal point. For example to_timestamp('12:3', 'SS:MS') is not 3 milliseconds, but 300, because the conversion counts it as 12 + 0.3 seconds. This means for the format SS:MS, the input values 12:3, 12:30, and 12:300 specify the same number of milliseconds. To get three milliseconds, one must use 12:003, which the conversion counts as 12 + 0.003 = 12.003 seconds.

      Here is a more complex example: to_timestamp('15:12:02.020.001230', 'HH:MI:SS.MS.US') is 15 hours, 12 minutes, and 2 seconds + 20 milliseconds + 1230 microseconds = 2.021230 seconds.

    • to_char's day of the week numbering (see the 'D' formatting pattern) is different from that of the extract function.

    • to_char(interval) formats HH and HH12 as hours in a single day, while HH24 can output hours exceeding a single day, e.g. >24.

    Table 9.23, “Template Patterns for Numeric Formatting” shows the template patterns available for formatting numeric values.

    Table 9.23. Template Patterns for Numeric Formatting

    PatternDescription
    9value with the specified number of digits
    0value with leading zeros
    . (period)decimal point
    , (comma)group (thousand) separator
    PRnegative value in angle brackets
    Ssign anchored to number (uses locale)
    Lcurrency symbol (uses locale)
    Ddecimal point (uses locale)
    Ggroup separator (uses locale)
    MIminus sign in specified position (if number < 0)
    PLplus sign in specified position (if number > 0)
    SGplus/minus sign in specified position
    RNroman numeral (input between 1 and 3999)
    TH or th ordinal number suffix
    Vshift specified number of digits (see notes)
    EEEEscientific notation (not implemented yet)

    Usage notes for numeric formatting:

    • A sign formatted using SG, PL, or MI is not anchored to the number; for example, to_char(-12, 'S9999') produces '  -12', but to_char(-12, 'MI9999') produces '-  12'. The Oracle implementation does not allow the use of MI ahead of 9, but rather requires that 9 precede MI.

    • 9 results in a value with the same number of digits as there are 9s. If a digit is not available it outputs a space.

    • TH does not convert values less than zero and does not convert fractional numbers.

    • PL, SG, and TH are PostgreSQL extensions.

    • V effectively multiplies the input values by 10^n, where n is the number of digits following V. to_char does not support the use of V combined with a decimal point. (E.g., 99.9V99 is not allowed.)

    Table 9.24, “to_char Examples” shows some examples of the use of the to_char function.

    Table 9.24. to_char Examples

    ExpressionResult
    to_char(current_timestamp, 'Day, DD  HH12:MI:SS')'Tuesday  , 06  05:39:18'
    to_char(current_timestamp, 'FMDay, FMDD  HH12:MI:SS')'Tuesday, 6  05:39:18'
    to_char(-0.1, '99.99')'  -.10'
    to_char(-0.1, 'FM9.99')'-.1'
    to_char(0.1, '0.9')' 0.1'
    to_char(12, '9990999.9')'    0012.0'
    to_char(12, 'FM9990999.9')'0012.'
    to_char(485, '999')' 485'
    to_char(-485, '999')'-485'
    to_char(485, '9 9 9')' 4 8 5'
    to_char(1485, '9,999')' 1,485'
    to_char(1485, '9G999')' 1 485'
    to_char(148.5, '999.999')' 148.500'
    to_char(148.5, 'FM999.999')'148.5'
    to_char(148.5, 'FM999.990')'148.500'
    to_char(148.5, '999D999')' 148,500'
    to_char(3148.5, '9G999D999')' 3 148,500'
    to_char(-485, '999S')'485-'
    to_char(-485, '999MI')'485-'
    to_char(485, '999MI')'485 '
    to_char(485, 'FM999MI')'485'
    to_char(485, 'PL999')'+485'
    to_char(485, 'SG999')'+485'
    to_char(-485, 'SG999')'-485'
    to_char(-485, '9SG99')'4-85'
    to_char(-485, '999PR')'<485>'
    to_char(485, 'L999')'DM 485
    to_char(485, 'RN')'        CDLXXXV'
    to_char(485, 'FMRN')'CDLXXXV'
    to_char(5.2, 'FMRN')'V'
    to_char(482, '999th')' 482nd'
    to_char(485, '"Good number:"999')'Good number: 485'
    to_char(485.8, '"Pre:"999" Post:" .999')'Pre: 485 Post: .800'
    to_char(12, '99V999')' 12000'
    to_char(12.4, '99V999')' 12400'
    to_char(12.45, '99V9')' 125'
    # by 제갈장비 | 2006/10/11 15:16 | TIP-PostgreSql | 트랙백 | 덧글(0)
    2006년 10월 11일
    PostgreSql - 수학 계산 관련
    평균구하고, 소숫점 자리수 지정하기
        Select round(avg(숫자형 필드),2)

    # by 제갈장비 | 2006/10/11 14:38 | TIP-PostgreSql | 트랙백 | 덧글(0)
    2006년 10월 11일
    postgreSQL - 일자관련팁
    문자열을 일자형을 바꾸기
        Select to_timestamp('20060902','yyyymmdd')

    문자열을 일자형을 바꾼다음 10초 더하기
        Select to_timestamp('20060902','yyyymmdd') + '10'
        혹은
        Select to_timestamp('20060902','yyyymmdd') + '10 sec'

    문자열을 일자형을 바꾼다음 10분 더하기
        Select to_timestamp('20060902','yyyymmdd') + '10 minute'

    문자열을 일자형을 바꾼다음 10시간 더하기
        Select to_timestamp('20060902','yyyymmdd') + '10 hour'

    문자열을 일자형을 바꾼다음 10일 더하기
        Select to_timestamp('20060902','yyyymmdd') + '10 day'

    문자열을 일자형을 바꾼다음 10개월 더하기
        Select to_timestamp('20060902','yyyymmdd') + '10 month'

    문자열을 일자형을 바꾼다음 10년 더하기
        Select to_timestamp('20060902','yyyymmdd') + '10 year'



    더 많은 예 참조

    ------------------------------------------------------

    일자형 필드를 문자열로 바꾸기(24시간형식으로 표시)
        Select to_char(일자형 필드명,'yyyymmddhh24')

    일자형의 각 요소 표시하기
              Select current_timestamp
                        ,to_char(current_timestamp, 'HH')
                        ,to_char(current_timestamp, 'HH12')
                        ,to_char(current_timestamp, 'HH24')
                        ,to_char(current_timestamp, 'MI')
                        ,to_char(current_timestamp, 'SS')
                        ,to_char(current_timestamp, 'MS')
                        ,to_char(current_timestamp, 'US')
                        ,to_char(current_timestamp, 'SSSS')

     




    - 끝 -
    # by 제갈장비 | 2006/10/11 14:28 | TIP-PostgreSql | 트랙백(3) | 덧글(0)
    2006년 09월 29일
    Highlighting Selected Text in PowerBuilder DataWindow
    Highlighting Selected Text in PowerBuilder DataWindow


    사용자가 찾고자 하는 문자열을 검색할 수 있는 윈도우가 있고,
    그 윈도우 안에는 사용자가 찾고자 하는 문자와 일치하는 텍스트가 있다고 가정하자.
    검색되어진 문자의 위치는 밝게 처리가 되어야 사용자가 쉽게 확인할 수 있을 것이다.
    예를 들면 이것은 아래 그림1처럼 보여야 할 것이다.



    <그림 1>
    파워빌더는 데이터검색과 정보를 보여주는 강력한 기능을 가지고 있는데 이것이 바로 DataWindow이다.
    그렇다면 Datawindow 컬럼 내에서 이것들을 어떻게 처리해야 할 것인가?
    안타깝게도 DataWindow 오브젝트에는 위와 같은 일을 할 수 있는 방법이 없다.
    이 기사에서는 이것을 확인할 수 있는 기술에 대해 설명하고 있다.
     
     
    A Sample DataWindow
     
    테스트를 위해 Tabular 형태로 Datawindow를 하나 만들고
    String 타입으로 text라는 이름을 가진 컬럼을 생성한다.
    여기서는 데이터를 필터링하는 것이 아니라, 단지 텍스트의 패턴 매칭으로 찾는 방식을 알아볼 것이다.
    예제 데이터윈도우는 External Data Source를 이용하여 만든다.
    그림 2에서 보는 것처럼 간단하게 DataWindow를 생성할 수 있다.
    <그림 2>

    데이터윈도우 페이터에 있는 Data 부분에서 간단하게 데이터를 추가할 수 있다.
    아니면, 스트립트 안에서 External Source로부터 데이터를 읽어들일 수도 있다.
     
    Selecting Part of the Text
     
    이제 데이터윈도우에는 우리가 문자열 패턴 매치로 찾고자 하는 텍스트를 포함 하고 있다.
    그 다음 데이터윈도우에서 우리가 원하는 패턴과 일치하는 문자열이 있으면 글자 색을 빨간색으로 처리할 것이다.
    해당 데이터윈도우에 아래의 세 문장이 있다고 가정하고,
     
         PowerBuilder rules the world.
         It is a rule with us.
         This is the rule of the game.
     
    이들 중 찾고자 하는 단어가 ‘rule’이라고 하더라도, 찾아진 결과는 변함이 없을 것이다.
    데이터윈도우 컬럼의 일부만을 강조할 수 없기 때문이다.
     
    이를 표현하기 위해 다음의 세 부분으로 (선택되기 전, 선택, 선택되어진 후)컬럼을 나누어 생각해 볼 수 있다.
    생성한 데이터윈도우의 Result Set에 컬럼 “search” 를 추가하자.
    기존의 text 컬럼 대신에 세 개의 Computed Filed를 추가한다.
    첫번째 Computed Filed의 Expression에 아래의 표현을 적는다.
        if( isNull(search), text, if( pos(text, search, 1) = 0, text, left(text, pos(text, search, 1) - 1) ))
     
    생성한 Computed Filed를 “prefix”라 부르자. 두 번째 Computed Filed에는 아래의 표현식을 적는다.
     
        if(pos(text, search, 1) = 0, '', search)
     
    두번째로 생성한 Computed Filed는 “Matched”라 명하자. 세 번째 Computed Filed에는 아래의 표현식을 적는다. 
     
        if( isNull(search), '',
        if( pos(text, search, 1) = 0, '', mid(text,
        pos(text, search, 1) + len(search) ) )
        )
     
    세 번째로 생성한 것을 “suffix”라 명하자.
    이 세가지 Computed Filed들을 기존의 text 컬럼의 길이에 맞게 위치시킨다.
    “matched” Computed Filed의 폰트 색은 빨간색으로 설정 후 text 컬럼을 지운다.
    결과적으로 그림 3에서 보이는 것과 같은 결과를 얻을 것이다.
    우리가 원하는 부분이 빨간색으로 바뀌었다.
    하지만 데이터윈도우가 하나의 컬럼처럼 보이지 않고
    Computed Field들 사이에 불필요한 공간이 들어가 있는 것을 볼 수 있다.
    적당한 크기로 조절하기 위해  “matched”와 “suffix” Computed Filed의 Position 프로퍼티 중
    Slide Left를 체크해준다.

    <그림 3>



    이렇게 하여 데이터윈도우 Result Set에 원본 컬럼 대신에
    세 개의 Computed Filed들을 별도로 추가함으로써 데이터윈도우에
    있는 텍스트의 일부를 선택할 수 있다는 것을 보았다(그림 4).


     

    <그림 4>

    Selecting Several Parts

     
    만약 사용자가 하나의 단어를 찾으려 하는 것이 아니라 여러 단어를 찾으려 한다면 어떻게 해야 할까?
    이를 만족시키기 위해선 원본 컬럼을 나누기 위해 더 많은 Computed filed들을 만들어야 할 것이다.
    캐릭터들을 더 작은 단위의 컬럼을 나누어 보자.
    즉 모든 Computed Filed는 해당 컬럼 텍스트에 하나의 케릭터만을 포함하게 만든다.
    첫 번째 Computed Filed는 첫 번째 캐릭터를, 두 번째 Computed Filed는 두 번째 캐릭터를…
    이런 방식으로 하나의 캐릭터를 갖도록 한다.
    각 Computed Filed의 Expression에는 아래의 스크립트로 작성한다.
     
       mid( text, , 1)
     
    그 다음 Computed Filed들에 원하는 문자 색을 설정해줌으로써 각각의 문자들을 선택할 수 있게 된다.
    Computed filed에 폰트 색상을 설정해주는 프로퍼티를 설정하는 방식은 Buck Woolley가 작성한
    “Not Your Father’s DataWindow” (PBDJ volumn 8 issue7)내용을 이용하였다.
    이 기술문서의 기본내용은 String 타입의 컬럼들이 포함되어 있는
    많은 데이터윈도우 오브젝트들의 파라미터를 가져오는 것이다.
    예제 데이터윈도우의 텍스트 컬럼 길이는 50이기 때문에 50개의 Computed Filed를 생성해야 할 것이다.
    DataWindow의 Result Set에서 “select” 이름으로 String 컬럼을 하나 추가하고 이 컬럼 역시 길이를 50으로 정한다.
    다양한 색상의 텍스트를 표현해보기 위해, “select” 컬럼은 아래 값을 입력한다.
     
      "0101010101010010100101001010000000<...>"
     
    50개의 케릭터이기 때문에 Computed Filed들을 50개 생성해야 한다면,
    아니면 그 이상의 Computed Fileld를 손수 생성해야 한다면
    그것은 무척 골치 아픈 일이 될 것이다. 이 방법을 해결하기 위해 코딩을 이용하자.
     
    Selection Service Object
     
    사용자가 직접 작업해야 하는 지루한 일들을 대신 해주는 오브젝트를 만들도록 하자.
    먼저 많은 원본 컬럼의 길이와 같은 Computed Filed들이 생성되어 질 데이터윈도우를 생성해 놓아야 한다.
    그리고 원본 컬럼의 이름을 데이터윈도우가 정확하게 알고 있어야 한다.
    아래 List 1은 of_init() 함수 코드이다.
    생성된 Computed field들을 위해 보이는 모든 파라미터들은 원본 컬럼으로부터 가져오게 된다.
    Instance 변수 함수의 마지막은 스트링값 0 을 가지고 초기화 되어진다.
     
    LISTING 1

    n_select variables protected: datawindow idw_dw string is_notselected
    public function boolean of_init (datawindow adw_dw, string as_col);
    string ls_prop[] int li, li_cnt int li_x int li_w =
    55 string ls_color string ls_name string ls_rest_syn string ls_coltype string ls_syn
    idw_dw = adw_dw
    ls_rest_syn = 'create compute(band=detail alignment="0" border="0" format="[general]" ' &
    + 'width="' + string(li_w) + '" slideleft=yes 'ls_prop = { 'y', 'height', 'font.face',
    'font.height', 'font.family', &
    'font.pitch', 'font.charset',
    'background.mode', 'background.color' }
    for li = 1 to upperBound( ls_prop)

    ls_rest_syn += ls_prop[li] + '="' + idw_dw.describe(as_col + '.' + ls_prop[li]) + '" ' next
    ls_color = idw_dw.describe( as_col + '.color')
    li_x = Integer( idw_dw.describe( as_col + '.x'))
    ls_coltype = idw_dw.describe( as_col +
    '.coltype') // expected char(xx)
    li_cnt = Integer( Mid( ls_coltype, 6,
    pos(ls_coltype, ')', 1) - 6 ) )
    for li = 1 to li_cnt ls_syn = ls_rest_syn & + ' x="' + String(li_x + li_w*(li - 1)) +
    '" ' & + ' expression="mid( ' + as_col + ', ' + String(li) + ', 1)" ' &
    + ' color="' + ls_color + '~tif(mid(select,' + string(li) + ',1)=~'1~',rgb(255,0,0),' + ls_color +')" ' &
    + 'name = c$' + string(li) ')'
    idw_dw.modify(ls_syn) next
    idw_dw.modify('destroy ' + as_col)
    is_notSelected = Fill('0', li_cnt)
    return true
     
    그 다음으로, 선택된 텍스트의 위치를 알려주는 함수가 필요하다.
    이 함수에서 사용되는 아귀먼트는 선택된 문자, 선택된 문자의 길이 그리고 데이터윈도우에 있는 줄의 개수다.
    이 함수를 of_select()라 부르고, 이 함수를 구성하고 있는 스크립트는 아래 List 2나와있다.
    LISTING 2
    public subroutine of_select (integer ai_start,
    integer ai_len, long al_row);
    string ls_data
    ls_data = idw_dw.getItemString(al_row, 'se
    _lect')
    if isNull(ls_data) then ls_data =
    is_notSelected
    idw_dw.setItem(al_row, 'select',
    Replace(ls_data, ai_start, ai_len, Fill('1',
    ai_len) ) )
    마지막으로 우리는 각 줄에서 선택된 내용을 지우는 함수가 필요하다.
    이 함수를 of_clear()라 부르고 이 함수를 구성하는
    스크립트는 아래 List 3에 나와있다.
    LISTING 3
    public subroutine of_clear (long al_row); idw_dw.setItem( al_row, 'select', is_notSelected )
     
    Conclusion
     
    파워빌더에서는 데이터윈도우 컬럼에 있는 text를 직접적으로 찾아낼 수 있는 방법이 없다.
    하지만, 위에서 살펴본 기술을 이용하면
    데이터윈도우 컬럼 안에 있는 텍스트의 일부분을 찾아 매칭을 시킬 수 있었다.
    우리는 글자 색을 변경하거나, 뒷 배경색을 변경하거나,
    글씨를 굵게 아니면 기울리는 등의 우리가 원하는 모든 종류의 텍스트 형태를 이용할 수 있다.
     
    원본자료 : http://pbdj.sys-con.com/read/258397.htm

    첨부문서 : Highlighting Selected Text in PowerBuilder DataWindow.mht

    # by 제갈장비 | 2006/09/29 09:55 | 문서-Powerbuilder | 트랙백 | 덧글(0)
    2006년 09월 29일
    Little Known, But Incredibly Useful, PowerBuilder Tips and Tricks

    Little Known, But Incredibly Useful, PowerBuilder Tips and Tricks

    이 문서는 TechWave 2006에서 발표한 자료 중 Tip & Trick 일부를 정리한 것으로 파워빌더를 사용해본 경험자나

    처음 시작하는 사람들에게 조금이나마 도움이 되었으면 한다.

     

    이하는 첨부문서참조

     

    첨부문서 : Little Know-But Incredibly UseFul-PowerBuilder Tip and Tricks.mht

    # by 제갈장비 | 2006/09/29 09:46 | 문서-Powerbuilder | 트랙백 | 덧글(0)
    2006년 09월 21일
    JFreeChart - 애플릿 봉그래프 그리기, 그리고 예쁘게 다듬기
    JFreeChart - 애플릿 봉그래프 그리기, 그리고 예쁘게 다듬기
     
     
    작성자 : 제갈장비
    작성일 : 2006년 9월 21일(목)
     
    개요 : JFreeChart를 이용하여 웹어플리키에션에서
             애플릿을 이용하여 봉그래프를 나타내고
             좀 더 예쁘장하게 다듬어 보기
     
    참고 : 이 문서는 http://www.thinkit.co.jp/free/tech/4/6/1.html 를 참조하여
              작성한 것입니다.
     
    [ 일러두기 ]
    - . 이 문서에서는 JFreeChart 설치방법은 설명하지 않습니다.
    - . 이 문서에서는 JFreeChart의 문법에 대한 설명은 하지 않습니다.
    - . 그림파일은 마우스로 클릭하면 글자가 잘 보입니다.
     
     
    [ 실행환경 ]
    이 문서를 작성했을 때의 환경입니다.
     
    운영체제 : MS Windows XP Professional
    웹서버    : TOMCAT v5.0.28
    JAVA      : 1.4.2_12
    JfreeChart : 1.0.2
     
     
    [ 봉그래프의 구조 ]

     
    A. 기본적인 봉그래프 나타내기
     
    아래의 소스를 컴파일했을 때 보이는 그래프입니다.
     
    [소스]
    import java.awt.Dimension;
    import javax.swing.JApplet;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.data.category.DefaultCategoryDataset;
    public class BarChartDemo_t01 extends JApplet{
     public BarChartDemo_t01(){
      // row keys...
            final String series1 = "First";
            final String series2 = "Second";
            final String series3 = "Third";
            // column keys...
            final String category1 = "Category 1";
            final String category2 = "Category 2";
            final String category3 = "Category 3";
            final String category4 = "Category 4";
            final String category5 = "Category 5";
            // create the dataset...
            final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            dataset.addValue(1.0, series1, category1);
            dataset.addValue(4.0, series1, category2);
            dataset.addValue(3.0, series1, category3);
            dataset.addValue(5.0, series1, category4);
            dataset.addValue(5.0, series1, category5);
            dataset.addValue(5.0, series2, category1);
            dataset.addValue(7.0, series2, category2);
            dataset.addValue(6.0, series2, category3);
            dataset.addValue(8.0, series2, category4);
            dataset.addValue(4.0, series2, category5);
            dataset.addValue(-4.0, series3, category1);
            dataset.addValue(-3.0, series3, category2);
            dataset.addValue(-2.0, series3, category3);
            dataset.addValue(-3.0, series3, category4);
            dataset.addValue(-6.0, series3, category5);
           
           
            // create the chart...
            final JFreeChart chart = ChartFactory.createBarChart(
                "Bar Chart Demo test01",  // chart title
                "Category",               // domain axis label
                "Value",                  // range axis label
                dataset,                  // data
                PlotOrientation.VERTICAL, // orientation
                true,                     // include legend
                true,                     // tooltips?
                false                     // URLs?
            );
           
            final ChartPanel chartPanel = new ChartPanel(chart);
     
            // 여기서부터 다듬기 시작

            setContentPane(chartPanel);
     }
    }
     
     
    B. 챠트의 배경색을 흰색으로 바꾸기
     
        A 소스의 // 여기서부터 다듬기 시작 다음에 아래 코드를 추가하고 실행합니다.
     
        // 클래스 추가
        import java.awt.Color;
     
        // 1. 1. 챠트 배경색 바꾸기
        chart.setBackgroundPaint(Color.WHITE);
     

     
    C. 그래프 전체의 경계선 설정하기
     
        위의 B 까지의 소스 다음에 아래 코드를 추가하여 실행합니다.
     
            // 클래스 추가
            import java.awt.BasicStroke;
     
            // 2. 그래프 전체의 경계선 설정
            chart.setBorderVisible(true);                           // 차트전체의 경계선이 나타난다.
            chart.setBorderPaint(Color.BLUE);                  // 차트전체의 경계선의 색을 파란색으로 정한다.
            chart.setBorderStroke(new BasicStroke(5));   // 차트전체의 경계선의 두께를 정한다.
     
      챠트의 테두리가 파랗고 좀 두껍게 나왔죠?
     
    D. Plot 영역 조정하기
     
        위의 C 소스 다음에 아래의 코드를 넣고 실행합니다.
     
        // 클래스 추가       
        import org.jfree.chart.plot.CategoryPlot;
     
        // 3. Plot 영역 조정하기
        CategoryPlot plot = chart.getCategoryPlot();  // 챠트의 Plot 객체를 구한다.
        plot.setBackgroundPaint(Color.lightGray);     // 챠트의 Plot 배경색을 lightGray로 바꾼다.
        plot.setRangeGridlinePaint(Color.BLUE);       // 수평 그리드라인의 색을 BLUE로 바꾼다.
        plot.setDomainGridlinesVisible(false);           // 수직 그리드라인을 안보이게 한다.

     

    어디가 변했는지 느껴지죠?
     
     
    E. 횡축 설정하기
     
       위의 D 소스 다음에 아래의 코드를 넣고 실행합니다.
     
        // 클래스 추가
        import org.jfree.chart.axis.CategoryAxis;
        import org.jfree.chart.axis.CategoryLabelPositions;

        // 4. 횡축 설정하기
        CategoryAxis axis = plot.getDomainAxis();     // 횡축 객체 구하기
        axis.setLowerMargin(0.03);  // 횡축의 가장 왼쪽과 가장 왼쪽 봉과의 여백
        axis.setUpperMargin(0.03);  // 횡축의 가장 오른쪽과 가장 오른쪽 봉과의 여백
        axis.setCategoryLabelPositions
        (CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0));
                                                   // 카테고리명을 위로 향하게 비스듬히 나타나도록 한다.
     
    잘 보시면 어디가 바뀌었는지 보입니다.(^^)
     
     
    F. 종축 설정하기
     
       위의 E 소스 다음에 아래의 코드를 넣고 실행합니다.
     
        // 클래스 추가
        import org.jfree.chart.axis.NumberAxis;
     
        // 5. 종축 설정하기
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

     
        "getRangeAxis()"로 종축 설정을 구합니다.
        "setStandardTickUnits()"로 정수값만을 표시하도록 설정합니다.
        (여기선 종축이 수치이기 때문에 NumberAxis로 캐스트했지만
        종축이 일자인 경우에는 DateAxis,
        시각인 경우에는 PeriodAxis로 캐스트합니다.
        이 문서는 위에서 데이타 중에 마이너스 값이 있기 때문에 종축의 표시가 이미 정수로
        나타나지만 음수값을 양수로 고친 후 보면 0.5,1.0,1.5.... 식으로 나타납니다.
        이것을 1, 2, 3 ... 으로 보여줄 때 위의 코드를 사용합니다.
     
        그래서 모양이 E 와 똑같기 때문에 이 섹션은 그림 파일이 없습니다.
       



    G. 봉을 커스터마이즈 하기
     
        CategoryPlot의 오브젝트로 부터 그래프의 표시방법을 결정하는
        Renderer 오브젝트를 구하여 봉의 모양을 조정합니다.
     
        // 클래스 추가
        import org.jfree.chart.renderer.category.BarRenderer;

     
        // 6. 봉을 커스터마이즈하기
        BarRenderer renderer = (BarRenderer) plot.getRenderer();  // BarRenderer를 구한다.
        renderer.setItemMargin(0.05);                // 봉과 봉사이의 여백을 정한다.
        renderer.setDrawBarOutline(false);        // 봉의 경계선 표시를 설정
     

    봉과 봉사이가 좁아졌죠?
     
    H. 봉에 그라데이션 효과를 주고 색깔도 바꾸기
     
        // 클래스 추가
        import java.awt.GradientPaint;
     
        // 7.봉색깔 바꾸기
        GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue,   0.0f, 0.0f, new Color(0, 0, 64));
        GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f, 0.0f, new Color(0, 64, 0));
        GradientPaint gp2 = new GradientPaint(0.0f, 0.0f, Color.red,     0.0f, 0.0f, new Color(64, 0, 0));
        renderer.setSeriesPaint(0, gp0);
        renderer.setSeriesPaint(1, gp1);
        renderer.setSeriesPaint(2, gp2);
     
     

    전단계의 그래프와 비교해 보면 색깔의 순서가 바뀌었습니다.
    그리고 그라데이션 효과도 나타나구요.
     
    I. 전체 완성 소스
     
    import java.awt.Dimension;
    import javax.swing.JApplet;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.data.category.DefaultCategoryDataset;
    import java.awt.Color;
    import java.awt.BasicStroke;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.CategoryLabelPositions;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.renderer.category.BarRenderer;
    import java.awt.GradientPaint;

    public class BarChartDemo_t01_2 extends JApplet{
     public BarChartDemo_t01_2(){
      // row keys...
            final String series1 = "First";
            final String series2 = "Second";
            final String series3 = "Third";
            // column keys...
            final String category1 = "Category 1";
            final String category2 = "Category 2";
            final String category3 = "Category 3";
            final String category4 = "Category 4";
            final String category5 = "Category 5";
            // create the dataset...
            final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            dataset.addValue(1.0, series1, category1);
            dataset.addValue(4.0, series1, category2);
            dataset.addValue(3.0, series1, category3);
            dataset.addValue(5.0, series1, category4);
            dataset.addValue(5.0, series1, category5);
            dataset.addValue(5.0, series2, category1);
            dataset.addValue(7.0, series2, category2);
            dataset.addValue(6.0, series2, category3);
            dataset.addValue(8.0, series2, category4);
            dataset.addValue(4.0, series2, category5);
            dataset.addValue(-4.0, series3, category1);
            dataset.addValue(-3.0, series3, category2);
            dataset.addValue(-2.0, series3, category3);
            dataset.addValue(-3.0, series3, category4);
            dataset.addValue(-6.0, series3, category5);
           
           
            // create the chart...
            final JFreeChart chart = ChartFactory.createBarChart(
                "Bar Chart Demo test01",  // chart title
                "Category",               // domain axis label
                "Value",                  // range axis label
                dataset,                  // data
                PlotOrientation.VERTICAL, // orientation
                true,                     // include legend
                true,                     // tooltips?
                false                     // URLs?
            );
           
            final ChartPanel chartPanel = new ChartPanel(chart);
            
            // 여기서부터 다듬기 시작
         
            // 1. 챠트 배경색 바꾸기
            chart.setBackgroundPaint(Color.WHITE);
           
            // 2. 그래프 전체의 경계선 설정하기
            chart.setBorderVisible(true);                 // 챠트전체의 경계선이 나타난다.
            chart.setBorderPaint(Color.BLUE);             // 챠트전체의 경계선의 색을 파란색으로 정한다.
            chart.setBorderStroke(new BasicStroke(5));    // 챠트전체의 경계선의 두께를 정한다.
            // 3. Plot 영역 조정하기
            CategoryPlot plot = chart.getCategoryPlot();  // 챠트의 Plot 객체를 구한다.
            plot.setBackgroundPaint(Color.lightGray);     // 챠트의 Plot 배경색을 lightGray로 바꾼다.
            plot.setRangeGridlinePaint(Color.BLUE);       // 수평 그리드라인의 색을 BLUE로 바꾼다.
            plot.setDomainGridlinesVisible(false);        // 수직 그리드라인을 안보이게 한다.
            // 4. 횡축 설정하기
            CategoryAxis axis = plot.getDomainAxis();     // 횡축 객체 구하기
            axis.setLowerMargin(0.03);  // 횡축의 가장 왼쪽과 가장 왼쪽 봉과의 여백
            axis.setUpperMargin(0.03);  // 횡축의 가장 오른쪽과 가장 오른쪽 봉과의 여백
            axis.setCategoryLabelPositions
            (CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0));
                                        // 카테고리명을 위로 향하게 비스듬히 나타나도록 한다.
            // 5. 종축 설정하기
            NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
            rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            // "getRangeAxis()"로 종축 설정을 구한다.
            // "setStandardTickUnits()"로 정수값만을 표시하도록 설정한다.
            // (여기선 종축이 수치이기 때문에 NumberAxis로 캐스트했지만
            // 종축이 일자인 경우에는 DateAxis,
            // 시각인 경우에는 PeriodAxis로 캐스트한다.
            // 6. 봉을 커스터마이즈하기
            BarRenderer renderer = (BarRenderer) plot.getRenderer();  // BarRenderer를 구한다.
            renderer.setItemMargin(0.05);                 // 봉과 봉사이의 여백을 정한다.
            renderer.setDrawBarOutline(false);            // 봉의 경계선 표시를 설정
           
            // 7.봉색깔 바꾸기
            GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue,  0.0f, 0.0f, new Color(0, 0, 64));
            GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f, 0.0f, new Color(0, 64, 0));
            GradientPaint gp2 = new GradientPaint(0.0f, 0.0f, Color.red,   0.0f, 0.0f, new Color(64, 0, 0));
            renderer.setSeriesPaint(0, gp0);
            renderer.setSeriesPaint(1, gp1);
            renderer.setSeriesPaint(2, gp2);
     
            // 다듬기 끝
     
     
            setContentPane(chartPanel);
     }
    }
     
     
     
    Z. 맺음말
     
    이로서 간단히 봉그래프를 다듬는 것에 대해 적어 봤습니다.
     
    그런데 쓸만한 매뉴얼이 너무 적군요.
     
     
    - 끝 -
    # by 제갈장비 | 2006/09/21 15:22 | 제갈장비-JAVA | 트랙백(1) | 덧글(3)
    2006년 09월 20일
    한국 대표 블로깅툴 태터툴즈

    한국 대표 블로깅툴, 테터툴즈1.0 개발자 JH

    테터툴즈1.0으로 엿보는 블로그의 미래

    1월 7일(토), ‘대한민국 블로거들의 축제 라이브블로그2’ 행사장에는 젊은 블로거들로 문전성시를 이뤘습니다. 분위기는 여느 대학 동아리에서 개최하는 축제 행사처럼 활기찬 분위기로 이루어지고 있었습니다.

    이 현장에서 테터툴즈의 초기 개발자인 JH님을 만나서 블로그에 관한 그의 생각들과 곧 정식버전이 출시될 예정인 태터툴즈 1.0에 대한 이야기를 들어 봤습니다. 블로그에 대한 그의 생각, 그리고 곧 출시될 테터툴즈1.0을 통해 블로그의 미래를 어떻게 진화할 것인지 확인 할 수 있을 것 같습니다.


    활기찬 블로거들의 문화 축제, 라이브블로그2

    그날 열린 세미나에는 중고등학생에서부터 커뮤니티 사이트 혹은 블로그 서비스를 운영하는 업계 관계자까지 다양한 각계 각층의 블로거들이 참석하여 문전 성시를 이루는 모습이었습니다.

    이번 행사는 ‘2006 대한민국 블로그 어워드’시상식과 더불어 블로거들의 글과 사진을 전시하는 ‘블로그월’, 블로그 전문가들의 ‘블로그 강연회’까지 전문적인 내용과 아기자기한 행사들이 동시에 진행되어 다채로운 구성으로 진행되었습니다. 이 행사 모두 블로거들이 자발적으로 십시일반 참여하여 만든 문화 행사로 이루어 졌습니다.


    한국 블로그의 자존심, 테터툴즈

    ‘2006년 대한민국 블로그 어워드’의 시상자 중에는 2005년 한해동안 블로거들로부터 가장 사랑을 받았던 블로그를 뽑는 ‘올해의 블로그툴’로 테터툴즈 (http://tattertools.com)가 선정되었습니다. 아마도, 이번에 참석하는 블로거들은 블로그를 사용하는 사용자중에서도 자신이 직접 블로그를 설치하여 사용하고 있는 고급 사용자층이 꽤 높은 비율을 차지했을 것으로 생각됩니다. 그중에서도 테터툴즈 사용자도 많았을 것입니다.

    테터툴즈는 사용자가 직접 웹 서버(또는 웹호스팅 서버)에 설치하여 운영하는 형태로 사용되어지는 국내에서 대표적인 설치형 블로그툴입니다. 국내에서도 초기에는 ‘Movable Type (http://www.movabletype.org)’이나 ‘워드프레스(www.wordpress.org)’같은 외국 블로그툴이 많이 사용되는 추세였으나, 현재는 설치와 사용이 편리한 순수 국산 블로그툴 ‘테터툴즈’도 꾸준히 인기를 끌어 많은 사용자를 확보하고 있습니다. 단연, 한국 블로그계의 자존심이라고 해도 과언이 아닐 것 같습니다.

    ‘테터툴즈’는 깔끔한 인터페이스와 손쉬운 사용법으로 단연 한국 블로거들에게 사랑받는 툴로 자리잡아 왔습니다. ‘테터툴즈’와 같은 설치형 블로그는 사용자들이 자신만의 독특한 스킨을 만들거나, 제작한 스킨을 무료로 공개함으로써 포털에서 제공하는 블로그보다 더욱 사용자의 다양한 입맛에 맞는 인터페이스 디자인의 블로그를 가질 수 있습니다.


    드디어, 태터툴즈 개발자 JH님을 만나다.

    이날 행사에 참석한 블로거들중에서 블로그 전문가로 불리워지는 몇몇 블로거들이 블로그와 관련한 강연을 진행하였습니다. 이 중에 태터 툴즈 개발자인 JH님을 비롯하여 테터앤컴퍼니(Tatter&Company)의 대표인 노정석 대표가 참석하여 곧 출시될 ‘태터툴즈 1.0’을 소개하고 ‘이올린(EOLIN.com) 플랫폼’의 기획 방향에 대한 발표가 있었습니다.

    정재훈이라는 본명보다 JH로 블로그계에서는 꽤 유명한 아이디로 통합니다. 또한, 테터툴즈 개발자인 JH님은 언론의 인터뷰에 잘 얼굴을 드러내지 않는 신비주의 전략(?)을 구사하는 것으로 유명합니다.인터뷰에 쉽게 응해 주지 않는다고 해서 꽤 고집스러운 개발자라는 소문만 무성했었는데, JH님을 (온라인상에서)아는 블로거들은 강연회가 끝나고 “생각보다 잘 생기고 말도 참 잘하네”하는 반응이었습니다.

    JH님은 처음 테터툴즈를 개발할 당시를 떠올리며 “인터넷 초기에는 홈페이지나 게시판 사용자들의 인터렉션이 너무 약했다. 테터툴즈를 만들 때 처음부터 블로그라고 생각하고 만들지는 않았고, 이렇게 만들면 편하게 사용할 수 있겠다 싶어 제작했다.”고 개발 동기를 밝히면서 강연을 열었습니다.

    블로그와 홈페이지가 다른 점은?
    “블로그가 홈페이지와 다른점이 무엇이냐고 많이 물어 보는데, 블로그는 홈페이지를 사람들이 더 많이 읽고 쓰기 위해 만든 것으로 생각한다. 이런 블로그에 RSS가 추가되면서 구독이 상당히 편리해졌고, 사람들은 즐겨찾기를 통해서 사이트를 들어가서 확인해야 했던 불편함을 RSS구독을 통해 해결할 수 있었다. 그러면서 차츰 현재의 블로그와 같은 형태가 된 것일뿐”이라고 블로그와 홈페이지의 차이를 사용자 구독의 편이성에 따라 자연스럽게 진화한 것이라고 설명했습니다.


    테터툴즈라는 이름은 어떻게 붙여진 것일까?
    “태터는 ‘실로 엮는/짜는 사람’이라는 뜻으로 블로그가 실로 짜는 것과 비슷한 것 같아 내가 평소 좋아하는 단어였다. 블로그를 제작하면서 자연스럽게 테터라고 이름을 붙인 것이다. 많은 사람들이 테터툴즈라고 하면 발음이 힘들다고들 한다. 발음할 때 침이 튄다나?(웃음)”

    테터센터(사용자 블로그의 글을 수집하는 메타 사이트)를 만든 동기는?
    “트랙백 체제에 대한 불만이 동기였다. 당시 트랙백은 인코딩 규약이 취약하여 훈련되지 않은 사용자들에게 큰 장벽이 되곤 했다. 키워드를 입력해서 연결하면 편리하겠다고 생각했고, 로컬키워드(Local keyword)와 태그 클라우드(Tag Cloud)를 적용했다. 한 사람이 블로그를 쓰는 것을 하나의 그림을 그린다고 생각한다면, 여러 사람이 그림을 그리면 더 큰 그림을 그릴 수 있다고 생각해서 만든 것이 바로 태터센터다.”

    현재 근황은?
    현재 JH님은 한국 모 커뮤니티 서비스의 일본지사에서 개발을 맡고 있습니다. 직장을 다니면서 틈틈이 테터앤컴퍼니의 개발 기획을 함께 진행하고 있다고 합니다. 자신으로서는 태터툴즈 개발 경험이 규모가 큰 커뮤니티 서비스 개발과 태터앤컴퍼니 양쪽에 모두 도움이 되고 있다고 설명합니다. “예를 들어, 미니홈피에서는 ‘일촌 파도’의 인적 네트워크(Social Network)가 형성되는데, 미니홈피도 최근 블로그에서 주로 ‘태그 파도(Tag Cloud)’의 관심있는 주제를 중심으로 하는 네트워크 형성까지 확장되는 추세에 있다.”고 말합니다. 또한, “이 사례와는 반대로, 미니홈피에서의 장점을 블로그에 적용하기도 한다”고 합니다.


    태터앤컴퍼니의 테터툴즈 1.0과 EOLIN은 무엇?

    이어, 바통을 이어받은 태터앤컴퍼니의 노정석 대표는 태터툴즈1.0 정식버전을 1월 31일 공개할 계획이라고 밝히면서 테터툴즈1.0 소개와 새로운 블로그 메타 사이트인 EOLIN(www.eolin.com)에 관한 프리뷰를 진행했습니다. 가장 필자의 눈길을 끈 것은 AJAX로 구현한 기능들로 어떠한 OS에서도 편리한 인터페이스를 제공하고, 멀티미디어 기능을 강화한 점이었습니다.

    노정석 대표는 “태터툴즈 1.0의 개발은 고객만족이란 무엇인가 하는 고민으로부터 출발하고 있다. 현재 1.0B3 버전이 공개되었다. 태터툴즈1.0은 현재 거의 완성단계에 있는 상황이라고 보면 된다.”라고 사용자의 사용 편이성에 초점을 맞추고 개발해왔다고 태터툴즈에 대한 자신감에 찬 어조로 말을 이어갔습니다.

    태터툴즈 1.0의 주요 특징은?
    노대표는 태터툴즈1.0의 주요특징으로 태그 클라우드(Tag Cloud), 위지윅 에디터(Wisywig editor), AJAX, 지역 로그, 스킨 등을 들었습니다. “관리자 등에서 비동기식 AJAX를 대폭 강화했다. 태그 클라우드는 편리하게 공개와 비공개를 선택할 수 있는 콘트롤 패널을 강화하였으며, 위지윅 에디터는 사진과 멀티미디어 기능을 대폭 반영하였다. 태그 서제스트는 가장 많이 사용한 순서대로 최적화된 태그를 추천한다. 그리고, 지역 로그 역시 추천 기능을 적용했다. 스킨은 메타 정보를 부여하여 위지윅에디터에서 글을 작성할 때 각각의 커스터마이징된 스킨에 최적화된 형태로 만들어지도록 했다. 전반적으로 되도록 웹표준을 준수하도록 제작되었으나 xHTML 혹은 HTML 4.0 으로도 스킨 구현이 가능하도록 하여 기존의 스킨도 약간만 수정하면 사용이 가능하도록 했다.”고 주요 특징을 설명했습니다.

    새로운 블로그 메타 사이트 EOLIN은 무엇?
    태터툴즈 1.0 정식버전을 위한 새로운 블로그 메타 사이트 EOLIN에 대해서는 “EOLIN 싱크(SINK) 기능은 글을 작성한 후에 싱크를 적용하면 EOLIN으로부터 오픈API 기반의 첫눈, 구글 등의 검색 사이트, 애플의 iTMS에까지 싱크가 가능하다. 향후 다음 블로그 등 다른 블로그 서비스 등에도 싱크가 가능하게 될 것으로 예상된다.”고 싱크 기능의 강화를 가장 큰 장점으로 꼽았으며, 또한 “길드 신디케이드(Guild Syndicate)를 통하여 나의 콘텐츠나 히스토리, 명성과 브랜드를 검색하고, 포토, 옥션(Auction), 클럽(Club), 구인/구직(Job) 등의 길드로 분류하여 보여줄 계획이”라며, “결론적으로 사용자들이 자신의 브랜드를 강화하도록 돕는 역할을 하게 될 것”이라고 합니다.


    테터툴즈1.0 멀티미디어를 품다.

    개인적으로는 테터툴즈의 기능 중 가장 주목할만한 것이 멀티미디어 기능이라고 생각합니다. 일단, 이메이징(iMazing) 플러그인으로 자바스크립트(Javascript)기반의 사진 슬라이드의 다양한 기능을 한정된 공간안에서도 더욱 다양한 효과로 사진 슬라이드를 즐길 수 있습니다. 

    또한, 요즘 세계적인 화제의 키워드로 떠오르고 있는 포드캐스팅 기능을 접목하여 mp3파일을 플래시 플레이어를 통해 듣거나, iTMS 등의 포드캐스팅 리더를 통해 쉽게 구독 가능하도록 구현했습니다. MP3파일뿐아니라 동영상 파일도 쉽게 업로드해 보여줄 수 있도록 지원하고 지속적으로 강화할 것이라고 밝혔습니다.

    테터툴즈 1.0은 포드캐스팅, 동영상 구독이 가능한 ‘멀티미디어 블로그’로 진화한 것입니다.

    앞으로 수일후면 테터툴즈 1.0 정식버전이 출시될 예정입니다. 블로그 기획자라면 테터툴즈를 벤치마킹하지 않으면 안될 것 같습니다. 아직 블로그를 사용하지 않으시는 분들이 있다면, 여러분도 진짜 블로거의 세계에 함께 빠져보시지 않으시렵니까? <끝>

    펌 : http://www.umediaclub.com/main/php/search_view.php?idx=203

    var viewer_image_url = "http://blogimgs.naver.com/blog20/blog/layout_photo/viewer/"; var photo = new PhotoLayer(parent.parent.parent); photo.Initialized(); window.onunload = function() { photo.oPhotoFrame.doFrameMainClose(); }.bind(this);
    # by 제갈장비 | 2006/09/20 12:37 | ETC | 트랙백 | 덧글(0)
    2006년 09월 20일
    [안철수 컬럼] 경쟁력 있는 프로그래머의 조건

    http://www.zdnet.co.kr/hotissue/devcolumn/article.jsp?id=65385&forum=1

    필자가 프로그래밍을 처음 시작한 지도 벌써 20년이 지났다. 우연인지 모 르겠지만 필자가 막 컴퓨터 공부를 시작할 때 창간된 잡지가 마소였으니 필자의 컴퓨터 경력과 마소의 나 이가 같은 셈이다.

    처음 개발을 시작할 당시에는 지금처럼 많은 사람들이 컴퓨터를 쓰게 될 것이라고는 상상조차 못했었다. 8비트 컴퓨터인 애플 컴퓨터를 사용하던 시절이었으니 가정에서 취미로 가지고 노는 정도였지, 업무용으 로 사용한다는 생각은 하지 못할 상황이었다. 그러나 20년이 지난 지금은 인터넷이 보편화되면서 가정마 다 없어서는 안될 필수품으로 자리잡게 되었다.

    그에 따라 개발 문화도 많이 달라졌다. 당시 PC 개발자는 먹고 살 수 있는 직업이 아니었다. 초기에는 개 발 자체에 재미를 느끼는 마니아들이 주축을 이루었지만 생계를 위해서 다른 직업을 가지고 있는 경우가 많았다. 지금은 개발자도 어엿한 직업으로 자리잡았지만 열정이라는 측면에서 보면 당시의 개발자들에게 지금의 개발자들이 배워야 할 점이 많지 않을까 생각된다.

    초창기 국내 개발자들은 많은 어려움을 겪어야 했다. 필자의 경우에도 자료를 구하는 데 무척이나 애를 먹었다. 인터넷도 없었고 주위에 물어볼 사람이 있는 것도 아니었다. 혼자서 모든 것을 분석하고 풀리지 않는 모든 문제들을 스스로 해결해야 하는 상황이었다. 당시 국내에는 IT 서적들도 별로 없었고 원서를 구하기도 만만치 않았기 때문이다.

    80년대 후반부터는 컴퓨터 통신을 활용하여 미국 통신망에 접속할 수가 있었다. 아무리 연구를 해도 도저 히 풀리지 않는 경우에만 국제 전화를 걸어서 미국 사람들에게 물어보고 자료도 받곤 했다. 당시 요금이 1분에 1000원이었으니까 1시간에 6만원 정도였는데, 당시에 필자 월급이 30만원 정도였던 것과 비교해보 면 엄청나게 비싼 요금이었다. 그밖에는 모두 직접 분석해서 알아냈고 롬바이오스나 운영체제도 어셈블리 어 수준에서 분석했다.

    바이러스 분석도 마찬가지로 참고자료 없이 직접 분석해서 동작 원리를 알아냈다. 그러다 보니 그동안 공 부한 것과 경험을 토대로 바이러스 관련 책을 쓸 때는 참고서적 한 권도 없이 필자의 자료와 기억만을 가 지고 완성할 수 있을 정도였다. 이에 비해 요즘은 오히려 자료의 홍수 시대라고 할 만하다. 이제는 자료 를 구하지 못해서 개발을 하지 못하는 경우는 거의 없는 것 같다. 그런 점에서 예전에 비하면 개발 환경 은 엄청나게 좋아진 것임에는 틀림없다.

    코더와 아키텍트
    예전보다는 나아졌지만 개발자에게 불리한 환경은 여전히 남아 있다. 국내 개발 환경의 특성과 한계 때문 이다. 최근 이공계열 기피가 심각한 문제가 되면서 개발자라는 위치 역시 다소 위축된 것처럼 보인다. 또 한 우리나라에서는 전문가라고 할지라도 나이가 들면 관리직이 되어야 성공했다는 사회적 통념 때문에 개 발자가 선택할 수 있는 미래가 제한적이며, 개발자의 생명도 짧은 편이다.

    많은 개발자들은 영원한 개발자로 남고 싶어하며 관리자로서의 변신에 대한 두려움들이 상대적으로 크 다. 반면에 하루가 다르게 변하는 기술적 진보로 인해 후배와 동등한 위치에서 새로운 개념의 기술에 적 응해야 하는 부담도 많이 느낀다.

    개발자가 선택할 수 있는 미래라는 면에서 SI 업체와 패키지 소프트웨어 업체는 상황이 조금 다르다. SI 업체와는 달리 패키지 소프트웨어 업체에서는 개발자가 선택할 수 있는 길이 조금 더 다양하다. 특히 패 키지 소프트웨어 업체에서는 개발자의 연장선상에서 하나의 전문직으로서의 아키텍트가 앞으로 절실히 필 요한 상황이 도래할 것이다.

    개발자들은 일반적으로 프로그래밍, 더 정확하게는 코딩 자체에 많은 재미와 보람을 느낀다. 풀리지 않 는 수학 문제를 오랜 고생 끝에 풀었을 때 희열감에 사로잡히고 자신이 만든 프로그램이 잘 동작하는 것 을 보면서 자신의 분신처럼 애정을 느낀다.

    그러나 이러한 것은 개발자의 보람 가운데 아주 작은 부분일 뿐이다. 미국에서는 이런 수준의 사람들을 코더라고 부른다. 많은 프로그래밍 경험을 통해서 좀더 수준이 올라가다 보면 세부적인 코딩 자체보다는 전체적인 아키텍처, 흐름, 프로토콜 등 설계에 해당하는 일들을 맡게 된다.

    그러나 우리나라에서는 (소프트웨어 산업의 역사가 짧아서이겠지만) 코딩하는 재미에 묻혀 있거나 그것 이 개발자가 하는 유일한 일로 생각하는 사람들이 많다. 물론 훌륭한 프로그래머 또는 아키텍트가 되기 위해서는 코더 시절에 탄탄한 기초를 다지는 것은 필수적이지만 어느 정도 실력이 쌓인 후에는 코더 단계 를 뛰어 넘으려는 노력이 필요하다.

    개발자들이 코더 단계에서만 머문 채 그 한계를 벗어나지 못하는 또 다른 이유 중 하나는 국내 패키지 소 프트웨어 회사 수가 너무 적고 그 규모도 영세하기 때문이다. 일정 규모 이상의 회사가 많다면 각 회사마 다 다양한 노하우가 쌓이고 회사간의 제휴나 인력 이동을 통해서 자연스럽게 함께 성장해 나갈 수 있겠지 만, 숫자가 얼마 안 되고 영세하다 보니 같이 커 나갈 수 있는 여건이 형성되지 못한 것이다.

    단적인 예로 현재 국내에서 100명이 넘는 개발자가 일하고 있는 패키지 소프트웨어 회사는 필자의 회사밖 에 없다. 사정이 이렇다 보니 개발자가 나아갈 길을 적절하게 조언해 줄 수 있는 전문가들이 많지 않은 것이다. 이는 우리나라 개발자들의 불행이자, 우리나라 소프트웨어 산업의 불행이기도 하다.

    국내 개발자들에게 부족한 점
    IT 산업 발전에 따라 개발자의 역할에도 변화가 생기고 주위에서 변화를 요구하기도 한다. 특히 전문성 에 대한 요구 수준은 갈수록 높아지고 있다. 전문 개발자로 남아서 계속 발전하기 위해서는 주위 여건도 여건이지만 개발자 자신의 부단한 노력이 필요하다. 그런 점에서 우리나라 개발자들에게는 아직도 부족 한 부분들이 많다고 생각한다.

    가장 떨어지는 능력 중 하나는 바로 커뮤니케이션 스킬이다. 그 이유는 필자를 포함하여 우리나라에서 교 육을 받은 사람들은 개인 경쟁력 강화 위주의 공부, 즉 대부분 혼자서 책을 보고 공부를 하고, 혼자서 시 험 문제를 푸는 교육을 받아왔기 때문이라고 할 수 있다.

    지금처럼 복잡한 현대 사회에서는 혼자서 어떤 일도 할 수 없다. 개발을 할 때도 여러 개발자들간의 공 동 작업이 요구된다. 또한 개발자만 작업해서 되는 것이 아니라 마케팅, 영업, 고객 지원, 기술 지원을 비롯하여 고객과도 직접 의사소통을 하면서 일을 해나가야 되는 세상이다.

    이처럼 현대 사회에서는 커뮤니케이션 스킬이 필수적이지만 대학교를 졸업하고 바로 회사에 들어오는 사 람들 가운데는 본인이 생각하는 바를 정확히 말로 표현하지 못하고 다른 사람이 말하는 것들을 정확하게 알아듣지 못하는 경우도 생각보다 많다.

    둘째는 여러 사람들과 같이 팀으로 일해 본 경험이 부족하다 보니 팀 작업을 할 때 어떤 일을 어떻게 분 담해서 하는지, 개발 이외의 다른 분야 사람들과 어떻게 일을 나누어 해야 하는지에 대한 훈련이 되어 있 지 않아서 프로젝트 진행에 난항을 겪는다. 개발자들이 일정 수준의 단계를 뛰어 넘어 성장하기 위해서 는, 즉 코더를 벗어나기 위해서는 공동으로 진행하는 큰 프로젝트의 경험이 필수적이다.

    여기서 이야기하는 공동의 프로젝트, 큰 프로젝트라는 것은 SI 프로젝트보다는 패키지 소프트웨어 개발 경험이다. 그러나 불행하게도 우리나라에서는 SI 업체는 많지만 패키지 소프트웨어 개발 업체가 많지 않 다 보니 경험을 쌓고 한 단계 도약할 수 있는 여건이 조성되어 있지 않은 것이다.

    셋째로 전문 지식 자체도 떨어지는 편이다. 특히 전산학과를 갓 졸업한 사람들 중에는 바로 소프트웨어 개발 회사에 투입되어 개발을 할 수 있는 사람은 많지 않은 편이다. 업무에 필요한 지식보다는 학문에 필 요한 기초 지식만 가지고 있다 보니 이들 간의 간격이 상당히 크다.

    대기업이라면 많은 사람들에게 한꺼번에 자체적인 교육을 시킬 수 있겠지만 현재 패키지 소프트웨어 업체 들은 벤처기업들이기 때문에 교육을 시킬 수 있는 여건이 부족하다. 따라서 결국은 학교를 다니면서 스스 로의 열정이나 재미에 의해서 개발을 했거나 프로젝트를 했던 사람들을 주로 채용할 수밖에 없다.

    미래형 개발자의 요건
    시간이 흐를수록 모든 분야가 점점 더 어려워질 것으로 보인다. 미래에는 두각을 나타내려면 최소한 두 분야 이상의 깊이 있는 전문 지식을 가지고, 그것들을 바탕으로 다른 사람이 만들어내지 못하는 새로운 것을 만들어 내는 사람, 다른 사람 또는 다른 부서와 열린 마음으로 잘 협조할 수 있는 사람, 큰 시야와 창조적인 마인드를 가진 사람만이 성공할 수 있을 것이다.

    개발자는 미래에도 역시 사회의 가장 중요한 인프라를 담당하는 일꾼이 될 것이다. 전산분야는 모든 분야 에서 사용할 수 있는 하나의 툴이자 인프라이다. 따라서 자기 전공과 상관없이 지식 경영적인 측면에서 접근하고 전산을 잘 활용하는 사람이 결국은 두각을 나타낼 것이다.

    그것은 하나의 전공만 잘한다고 되는 것은 아니다. 따라서 전산 전공자들도 결국은 다른 분야에서 전산 을 활용하는 사람들에게 부가가치를 제공해 줄 수 있는 사람이 되지 않는다면 오히려 생존하기가 힘들어 질 것이다.

    이러한 생각은 자기의 발전을 가로막는 가장 큰 걸림돌이 된다. 다른 분야에 대한 기초 서적을 틈틈이 읽 으면서 사고의 폭을 넓히고 업무를 하면서 다른 분야 사람들의 이야기를 많이 듣고 그들을 이해하려고 노 력한다면 진정한 전문가로 클 수 있는 좋은 뒷받침이 될 것이다.

    이와 함께 개발자에게는 '창조적 마인드'가 필수적이다. 인터넷이 확산되면서 기존 것을 그대로 가져다 사용하거나 베끼는 것을 갈수록 많이 본다. 예전 같으면 상상도 할 수 없었던 일이다. 옛날에는 소스를 구하기도 어려웠지만 구할 수 있더라도 처음부터 끝까지 자신이 직접 만들어 보아야 직성이 풀리는 사람 도 많았다.

    물론 그러한 방법은 실제 프로젝트에 들어가면 시간이 많이 걸릴 수 있겠지만, 이를 통해 자신의 실력을 쌓고 발전시키다 보면 나중에는 아무도 못 푸는 문제를 자기가 풀 수가 있는 것이다. 따라서 이 두 가지 방법을 적절하게 활용하는 자세가 필요하다.

    마지막으로 필자는 우리나라 개발자들이 한마디로 '혼이 있는 개발자'이었으면 한다. 누구나 개발자는 될 수 있다. 그러나 누구나 할 수 있는 것이 아니라 오직 나만이 할 수 있다는 자신감과 함께 주어진 일 이고 직업이기에 하는 것보다 능동적이고 적극적으로 임하는 '장이' 기질이 있어야 한다. 도자기는 누구 나 만들 수 있지만 백자나 청자는 아무나 만드는 것이 아니기 때문이다.

    전문가 육성을 위한 근본적인 접근이 필요하다
    우리나라가 글로벌 시장에서 경쟁력을 갖추려면 지식정보 분야를 집중 육성해야 한다는 목소리가 높다. 지식정보 분야의 핵심은 소프트웨어인데 국내 환경은 전문가를 키우기가 어려운 구조이다.

    그렇기 때문에 정부에서는 단기간의 처방보다는 장기적이고 근본적으로 이 사회가 요구하는 진정한 전문 가를 키우고 국가 경쟁력을 강화하기 위한 제도적인 접근을 해야 한다. 또 학계에서도 업계와 협조하고 피드백을 받아서 현대 사회에 맞는 인재를 양성하기 위해 많은 노력을 해야 한다.

    전문가형 개발자 육성을 위해서 교육 제도의 개선 노력도 반드시 필요하다. 특히 대학에서 가르치는 것 과 현장에서 요구되는 것의 간격을 메우기 위한 노력이 일차적으로 필요하다. 교육 과정에 대해서는 인도 가 좋은 벤치마크 모델이 될 수 있다고 생각한다. 인도 역시 10여 년 전만 하더라도 지금처럼 많은 우수 한 개발자들을 배출하는 소프트웨어 강국이 될 것이라고는 아무도 생각하지 못했다.

    현재 마이크로소프트 본사에서 인도 사람들이 나가버리면 회사가 쓰러질 지경이라고 이야기할 정도로 이 들의 비중은 높다고 한다. 이는 제도적인 측면에서, 특히 교육 제도적인 측면에서 올바르게 접근했기 때 문에 가능한 결과라고 생각한다. 우리나라도 인도를 벤치마킹해서 우리 실정에 맞는 제도를 운영한다면 경쟁력 있는 개발자들을 많이 배출할 수 있지 않을까 한다.

    또한 개발자뿐만 아니라 풍부한 경험을 갖춘 프로젝트 매니저를 육성하기 위한 고민도 필요하다. 프로젝 트 관리를 잘해서 함께 경험을 쌓고 시행착오를 줄이기 위해서는 프로젝트 매니저의 역할이 필수적인데, 우리나라의 패키지 소프트웨어 회사들은 이러한 프로젝트 매니지먼트가 외국에 비해서 상대적으로 취약 한 편이다. 국내 소프트웨어 산업이 국가 경쟁력의 근간으로 자리매김하기 위해서는 개발자 자신들의 끊 임없는 노력은 물론 전문 인력 양성을 위한 개발 환경의 성숙이 필수적이다. @

    * 이 기사는 ZDNet Korea의 자매지인 마이크로소프 트웨어에 게재된 내용입니다.

    var viewer_image_url = "http://blogimgs.naver.com/blog20/blog/layout_photo/viewer/"; var photo = new PhotoLayer(parent.parent.parent); photo.Initialized(); window.onunload = function() { photo.oPhotoFrame.doFrameMainClose(); }.bind(this);
    # by 제갈장비 | 2006/09/20 12:35 | ETC | 트랙백 | 덧글(0)
    2006년 09월 20일
    세계최고 해커, 범죄실력도 '수준급'
    세계최고 해커, 범죄실력도 '수준급'
     
    [노컷뉴스] 2006년 09월 20일(수) 오전 06:00
    국제 해킹대회에서 두각을 나타낸 전문 해커가 개인정보 수십만건을 불법으로 수집해 팔아오다 경찰에 덜미를 붙잡혔다.

    경찰청 사이버테러대응센터는 20일 유명 포털사이트의 로그인 화면을 모방한 미끼 사이트인 이른바 '피싱(phishing)사이트'를 이용해 네티즌들의 ID와 비밀번호 36만 여개를 불법 수집해 유통한 혐의로 유모(24)씨를 불구속 입건했다.

    모 보안업체 이사인 유씨는 이들 개인정보를 인터넷에 광고해 이를 필요로하는 네티즌들에게 판매한 혐의를 받고있다.

    경찰은 "유씨가 개인정보를 판매해 얼마의 이득을 취했는지는 아직 나타나지 않았다"며 "그러나 수집된 개인정보로 네티즌들의 이메일 내용까지 훔쳐볼 수 있었던 만큼 사실상 '사이버 흥신소'를 운영한 것으로 보인다"고 설명했다.

    경찰조사결과 유씨는 지난 2001년 실시된 '킹 오브 파이터(king of fighter)' 세계 해킹 대회에서 네덜란드 팀에 이어 2위에 입상한 세계 최고 수준의 해킹 실력을 보유하고 있는 것으로 드러났다.

    특히 유씨는 당시 해킹대회에 함께 참여한 해커들과 이후 인터넷 보안 컨설팅, 정보보호 솔류션 등을 제공하는 보안업체 I사를 설립해 현재 이 회사의 이사로 재직중인 것으로 파악됐다.

    CBS사회부 권민철 기자 twinpine@cbs.co.kr
    (대한민국 중심언론 CBS 뉴스FM98.1 / 음악FM93.9 / TV CH 412)
    # by 제갈장비 | 2006/09/20 12:19 | ETC | 트랙백 | 덧글(0)
    2006년 09월 15일
    JasperReports의 jrxml 파일 Compile 해서 PDF 파일 생성하기(응용)
    JasperReports의 jrxml 파일 Compile 해서 PDF 파일 생성하기(응용)

    작성일 : 2006년 9월 15일
    작성자 : 제갈장비

    개요 : 웹어플리케이션에서 보고서, 장표, 전표 등 일정 형식을 갖는 양식을 출력할 때
             JasperReports의 기능을 사용하면 편합니다.

             그 중에 데이타베이스에 접근하여 원하는 데이타를 갖고와서 양식에 맞도록 넣어준 것을
             PDF로 출력하는 기본적인 방법을 설명합니다.


    [ 미리 알아두세요 ]

    *  이 문서에서는 iReport로 JasperReports의 template 파일인 jrxml 파일을 만드는 방법은

        설명하지 않습니다.

        하지만 이 문서를 이해하기 위해선 반드시 알아야 합니다.

        무엇을?

        jrxml 파일 만드는 방법을.....

        iReport 사용법을 모르시면 jrxml을 직접 만드셔야 하는데 그건 저도 모르므로
        iReport를 이요한 작성방법은 제 블로그를 참조해 보세요.

       참조 문서 :  웹보고서 기능 만들기(iReport->JasperReports)


    * 이 문서는 이전에 올린
        JasperReports의 jrxml 파일 Compile 해서 PDF 파일 생성하기(기본)
      에 이어지는 내용입니다.
     
      폴더구조와 컴파일하는 부분을 같이 보시기 바랍니다.


    * 이 문서는 웹어플리케이션에서의 작성방법이 아니고 컴맨드라인에서 행하는 방법을 작성한 것입니다.

    * 저도 아직 JasperReports에 대해서 초보자라서 자세한 설명은 할 수 없습니다.

    [ 환경 ]
    이 문서는 아래와 같은 환경에서 테스트된 것입니다.

        JAVA 1.4.2_12
        iReport 1.2.5
        PostgreSql 8.1
        JasperReports 1.2.5


    [ 시작 ]
    우선, iReport를 사용해서 JasperReports의 template 파일인 jrxml 파일을 만듭니다.

    ( 처음에 강조해 두었는데도 여기서부터 막히는 사람 꼬~~옥 있다.^^)

    이 문서에서 사용한 데이타베이스 관련 사항은 위의 참조문서
    웹보고서 기능 만들기(iReport->JasperReports)의 데이타베이스와 같습니다.
    처음하시는 분은 저와 똑같이 하시기 바랍니다.

    다음은 jrxml 파일을 컴파일하여 PDF 파일을 생성하는 소스입니다.

    파일명 : JRtest01.java

    import java.sql.*;
    import java.util.*;
    import net.sf.jasperreports.engine.*;
    /**
    * JasperReport Sample
    *
    * 컴파일 -> 데이타 바인드 -> 출력의 전체 단계
    * 참조 :
    http://www.thinkit.co.jp/free/tech/4/4/
    */
    public class JRtest01 {
     public static void main(String[] args) {
     // 템플레이트 XML 파일 경로
     String templatePath = "template/JRtest01.jrxml";
     // 출력할 PDF 파일 경로
     String destPath = "output/JRtest01.pdf";
     Connection con = null;
     try {
      // (1)템플레이트 XML 컴파일
      JasperReport jasperReport = JasperCompileManager.compileReport(templatePath);
      // (2)파라메타 생성
      
    String VAR_QUERY = "SELECT b.rel_name, a.fname, a.telno1 " +
           " FROM tbl01 a LEFT JOIN rel b ON a.rel_id = b.rel_id " +
           
    " ORDER BY b.rel_name";
      Map paramMap = new HashMap();
      paramMap.put("VAR_QUERY",VAR_QUERY);
      // (3)데이타소스 생성
      Class.forName("org.postgresql.Driver");
      con = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/DB명", "아이디","패스워드");
      // (4)데이타의 동적 바인드
      JasperPrint print = JasperFillManager.fillReport(jasperReport, paramMap, con);
      // (5) PDF로 출력
      JasperExportManager.exportReportToPdfFile(print, destPath);
     } catch (Exception ex) {
          ex.printStackTrace();
     }
     finally{
      try {
       if(con.isClosed() == false){
                    con.close();
                }
      } catch (SQLException e) {
       e.printStackTrace();
      }
     }
     }
    }

    위의 소스에서 빨간색으로 된 부분이 jrxml에 넘겨줄 SQL 부분입니다.
    이렇게하면 프로그램에서 데이타를 통째로 바꿀 수 있습니다.
    하지만 불러오는 항목명은 jrxml에 이미 정의되어 있기 때문에 바꾸기 힘듭니다.
    VAR_QUERY가 다음에 설명하는 jrxml 파일의 어디에서 사용되었는지 살펴보기 바랍니다.

    다음은 jrxml 파일입니다.
    이 파일의 소스는 전부 적지 않겠습니다.
    별다른 파라메터 없이 SQL을 지정해서 만든 jrxml 파일이라면
    파일 내의 <queryString> 태그내에 SQL이 설정되어 있을 겁니다.

    예를들어 이 문서의 경우는

    <queryString><![CDATA[SELECT b.rel_name, a.fname, a.telno1
       FROM tbl01 a LEFT JOIN rel b ON a.rel_id = b.rel_id
       ORDER BY b.rel_name]]></queryString>
    와 같이 되어 있습니다.

    이 부분을 이제부터 프로그램에서 SQL을 바꾸어서 넘겨주는 파라메터로서 정의하겠습니다.

    방법은 간단합니다.

    우선 바꾼 후의 소스를 보죠.

     <parameter name="VAR_QUERY" isForPrompting="true" class="java.lang.String">
         <defaultValueExpression ><![CDATA["NO INPUT"]]></defaultValueExpression>
     </parameter>

     <queryString><![CDATA[$P!{VAR_QUERY}]]></queryString>

    이렇게 바꿨습니다.
    자바 프로그램에서 넘어오는 파라메터를 받을 VAR_QUERY를 정의했고
    그 파라메터를 <queryString>에서 사용하는 것입니다.

    좀 전의 자바 프로그램 소스의 빨간색 부분과 같이 보시면 이해가 금방 되실 겁니다.

    이제 다 됐습니다.

    벌써?

    사실, 알고나면 별거 아닙니다. 몰라서 그렇지....

    iReports로 디자인하는 것이 시간이 제일 많이 걸리겠군요.

    이제 컴파일하고 실행해 보시면 결과물이 나올겁니다.



    - 끝 -
    # by 제갈장비 | 2006/09/15 16:01 | 제갈장비-JAVA | 트랙백 | 덧글(0)
    2006년 09월 15일
    JasperReports의 jrxml 파일 Compile 해서 PDF 파일 생성하기(기본)
    JasperReports의 jrxml 파일 Compile 해서 PDF 파일 생성하기(기본)

    작성일 : 2006년 9월 15일
    작성자 : 제갈장비

    개요 : 웹어플리케이션에서 보고서, 장표, 전표 등 일정 형식을 갖는 양식을 출력할 때
             JasperReports의 기능을 사용하면 편합니다.


    다음은 컴맨드 라인에서 JasperReports의 template 파일인 jrxml 파일을 Compile해서
    PDF파일을 생성하는 간단한 예제입니다.

    하지만 이거 알아내느라 하루반을 인터넷 검색에 매달렸습니다.

    아직 jrxml 파일을 편집기로 직접 코딩해서 만들진 못하지만
    이전에 iReport 사용법을 어느정도 익혔기 때문에 문제될 건 없다고 생각합니다.

    iReport 사용법은 제 블로그를 참조하세요.

    여기 -> http://dojeun.egloos.com/315019

    그리고 이제 공부하기 시작했기 때문에 아래 소스에 대한 자세한 설명은 기대하지 마시길...

    하지만 똑같이 따라하면 결과를 보실 수 있을겁니다.

    [ 테스트한 환경 ]
        JAVA Version : 1.4.2_12
        JasperReports : 1.2.5

    [ Folder구조 ]
        c:javacjasperreport                  : Java Source 폴더
        c:javacjasperreportoutput       : PDF 폴더
        c:javacjasperreport emplate   : jrxml 폴더

    [ Classpath 설정 ]
    JasperReports를 다운받아 압축을 풀면
    그 밑에 jasperreports-1.2.5/lib의 경로에 여러 jar 파일이 있는데
    그 중에 아래의 파일들을 Java Source폴더에 복사해 놓습니다.

    commons-beanutils-1.5.jar
    commons-collections-2.1.jar
    commons-digester-1.7.jar
    commons-javaflow-20060411.jar
    commons-logging-1.0.2.jar
    itext-1.3.1.jar
    jasperreports-1.2.5.jar


    혹시 JFreeChart가 들어있다면 JFreeChart의 라이브러리도 클래스에 포함해 줍니다.


    명령행에서 다음 명령을 실행해서 클래스패스를 정해 줍니다.

    ( 노파심 : 현재 jar파일은 위의 Java Source 폴더에 있고
                   이 명령도 Java Source 폴더에서 실행해야 합니다.)

    >set classpath=.;commons-beanutils-1.5.jar;commons-collections-2.1.jar;commons-digester-1.7.jar;commons-javaflow-20060411.jar;commons-logging-1.0.2.jar;itext-1.3.1.jar;jasperreports-1.2.5-applet.jar;jasperreports-1.2.5.jar

    [ jrxml 파일 생성 ]
    위의 jrxml 폴더에 아래의 파일을 생성해 둡니다.

    파일명 : jasperreports_test01.jrxml



    <?xml version="1.0"?>
    <!DOCTYPE jasperReport
      PUBLIC "-//JasperReports//DTD Report Design//EN"
      "
    http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
    <jasperReport name="Simple_Report">
     <detail>
        <band height="20">
          <staticText>
            <reportElement x="180" y="0" width="200" height="20"/>
            <text><![CDATA[Hello World!]]></text>
          </staticText>
        </band>
      </detail>
    </jasperReport>

    [ Java 파일생성 ]
    위의 Java Source 폴더에 아래의 파일을 생성합니다.

    파일명 : Jasperreports_test01.java

    import java.util.*;
    import net.sf.jasperreports.engine.*;
    public class Jasperreports_test01
    {
      public static void main(String[] args)
      {
        JasperReport jasperReport;
        JasperPrint jasperPrint;
        try
        {
          jasperReport = JasperCompileManager.compileReport("template/jasperreports_test01.jrxml");
          jasperPrint  = JasperFillManager.fillReport(jasperReport, new HashMap(), new JREmptyDataSource());
          JasperExportManager.exportReportToPdfFile(jasperPrint, "output/jasperreports_test01.pdf");
        }
        catch (JRException e)
        {
          e.printStackTrace();
        }
      }
    }

    [ Compile ]
    Java Source 폴더에서 다음 명령을 실행합니다.
    >javac Jasperreports_test01.java [enter]

    [ RUN ]
    Java Source 폴더에서 다음 명령을 실행합니다.
    >java Jasperreports_test01 [enter]

    [ 확인 ]
    위의 PDF 폴더 안을 보면 jasperreports_test01.pdf 가 생성되어 있을 겁니다.


    PDF Viewer로 확인.


    - 끝 -
    # by 제갈장비 | 2006/09/15 10:48 | 제갈장비-JAVA | 트랙백 | 덧글(0)
    2006년 09월 15일
    웹보고서 기능 만들기(iReport->JasperReports)
    웹보고서 기능 만들기
     
    작성일 : 2006년 8월 20일
    수정일 : 2008년 8월 9일
                - iTextAsian.jar 다운로드URL변경
                  http://itext.sourceforge.net/downloads/iTextAsian.jar
                  -> http://prdownloads.sourceforge.net/itextpdf/iTextAsian.jar

    작성자 : 제갈장비
     
    들어가기에 앞 서

    이 문서는
    나는나 님의 블로그에 올려져 있는
    iReport 개발자 매뉴얼.pdf
    JasperReports_개발자_매뉴얼-rokmc7980304.pdf
    를 보고 아주 많은 도움을 받았습니다.
    아직도 위의 매뉴얼을 반도 해 보진 못했지만 간단한
    웹보고서를 만들 수 있었습니다.
    필요하신 분은 나는나님의 블로그에 방문하셔서
    위의 PDF 파일을 다운받아서 공부하시면
    보다 심도깊은 보고서를 만드실 수 있다고 생각합니다.

    좋은 자료를 공개하신 나는나님에게 다시 한 번 감사의 말씀을 전합니다.

    -----------------------------------------------------------------------------

    사용된 것들

    MS Windows 2000 Advanced
    JDK5.0 Update 8
    TOMCAT 5.5
    PostgreSql 8.1.4
    Struts 1.2.9
    iReport 1.2.5
    JasperReports 1.2.5

    Adobe Reader 7.0
    AcroEdit 0.9.5.30


    이 글을 무리없이 보고 이해할 수 있는 레벨

    이글은 제가 생각하기에

    웹보고서를 만드는  가장 쉬운 방법을 적은 글입니다.

    하지만, 쉽다고는 하지만 아래에 밝힌 실력만큼은 갖추고 있는 분에게만

    쉽다는 얘기입니다.

    본문에서는 각 분야의 기초적인 설명은 하지 않습니다.

    기초설명하다가 본래의 목적을 벗어날까 해서 입니다.

    - 우선 톰캣에 웹어플리케이션을 만들 줄 알고 간단하게나마 운용할 줄 알아야 합니다.

    - 자바에 대한 공부가 어느정도 되어 있어야 합니다.

       명령행에서 컴파일을 할 줄 알아야하고

       간단한 소스는 눈으로 보고 어떻게 돌아가는 건지 파악할 줄 알아야 합니다.

    - Struts에 대한 지식이 약간(?) 필요합니다.

    - 데이타베이스를 다룰줄 알아야 합니다.

       이 문서에서는 PostgreSql을 사용하는데 다른 RDBM도 상관없지만

       데이타베이스를 만들고 테이블도 만들어서 프라이머리키를 지정할 수 있고

       기본적인 SQL문을 작성해서 실행할 줄 알아야 합니다.

    -----------------------------------------------------------------

    자~~~  그럼, 본론으로 들어갑니다.

    이번엔, 최근에 조사하고 테스트한 웹보고서를 만드는 법에 대해 내용입니다.

    거의 3주간 자료찾아보고 테스트하느라 제 PC를 몇 번씩 뒤집었다는...

    의외로 자료가 부족해서 시간이 많이 걸렸습니다.

    이 자료를 보고 저처럼 쓸데없이 시간을 버리는 것을

    조금이나마 줄일 수 있었으면 합니다.

    일반 C/S 프로그램에서는 각종 개발툴의 안에 보고서를 만들어 주는 기능이

    들어 있거나 관련 라이브러리가 있어서 제작하기가 쉽지만

    웹상에서 정형화된 보고서를 유저에게 제공하는 기능을 보기란 그리 흔치 않습니다.

    이번에 알아본 것은 iReport라는 프로그램과

    JasperAssistant라는 Eclipse 플러그인이었습니다.

    이중에 JasperAssistant는 유료이고 Eclipse에서 사용하는 것이기도 하고

    실제로 사용해 보니 iReport로도 웬만한 보고서는 만들어 낼 수 있었고

    화면 운영방식이 Eclipse 안에서 움직이는 것이 틀릴 뿐이고 기본적인 것은

    거의 같기 때문에 JasperAssistant에 대한 설명은 하지 않습니다.

    이 문서를 충분히 이해하신 분은 무리없이 JasperAssistant도 다룰 수 있을 겁니다.

    하지만 고급기능들까지 해 보질 않아서

    둘사이의 장단점을 확실히 꼬집어 내진 못하겠습니다.

    이 문서를 이해하면 할 수 있는 것

    Java + Tomcat(Struts) + PostgreSql의 환경하에서
    간단한 웹보고서를 자신의 웹어플리케이션에서 제공할 수 있게됩니다.

    이 문서의 소프트웨어 환경

       다음은 이 문서를 작성하면서 설치한 환경입니다.

       실력이 있으신 분은 상관없지만

       되도록 똑같은 환경에서 하셔야 에러를 최소한으로 줄이실 수

       있을 것입니다.

       자신의 환경을 감안하면서 적용해 보시기 바랍니다.
      
       운영체제 : MS Windows 2000 Advanced

       JDK5.0                   (설치하기)
       Tomcat 5.5            (설치하기)
       PostgreSql 8.1.4    (설치하기)

       Test용 Tomcat 웹어플리케이션 MyWeb02 (설치하기)

       Adobe Reader 설치<-- 알아서 설치하시길...
                                           꼭! 사전에 설치해 둬야 합니다.
                                           되도록 한국어 버전으로....

       위의 소프트웨어들은 제 블로그를 보시면

       다운로드 -> 설치 하는 법을 아실 수 있습니다.

       (뭐,,  당연히 각자 하셔도 됩니다. 설치시 특별히 어려운 점은 없으니까요)

       Struts 다운로드 및 설치

       다운로드 URL : http://struts.apache.org/downloads.html
       다운로드 파일명 : struts-1.2.9-bin.zip(13.8MB)

       설치 : 우선 적당한 곳에 압축을 풀어놓습니다.
                 압축을 푼 폴더의 밑에 webapps 라는 폴더가 있는데
                 그 안의 struts-blank.war를 톰캣밑의 webapps에 복사해
                 넣습니다.
                 그러면 struts-blank 라는 웹어플리케이션이 자동으로 생깁니다.
                 스트러츠 사용할 줄 아시는 분은 다 아시는 내용이라고 생각하기 때문에
                 자세한 설명은 하지 않겠습니다.

                 * 나중에 이 안의 lib 안의 파일들을 웹어플리케이션에 그대로
                   복사해 넣을 것입니다.

       JasperReports의 다운로드와 설치

       JasperReports H.P URL : http://jasperforge.org/sf/projects/jasperreports
       JasperReports 다운로드 : 
    http://sourceforge.net/project/showfiles.php?group_id=36382&package_id=28579

       다운로드 파일명 : jasperreports-1.2.5.jar(1.33MB)
                                  jasperreports-1.2.5-applet.jar(196KB)
                                  jasperreports-1.2.5-project.tar.gz(24.1MB)
                                  ; (이 파일은 이 문서에서는 사용하지 않음)
                                  jasperreports-1.2.5-project.zip(28.3MB)


       JasperReports 설치 : 특별히 설치할 작업은 없습니다.
                                  단지, 미리 jasperreports-1.2.5-project.zip 의 압축을
                                           풀어놓으면 편할지도 모릅니다.(애매하군...)
              * 이것도 나중에 이 안의 lib 폴더 안의 파일들을 웹어플리케이션에
                 전부 복사해 넣을 것입니다.

       iReport의 다운로드

       다운로드 URL : http://sourceforge.net/project/showfiles.php?group_id=64348
       다운로드 파일명 : iReport-1.2.5-windows-installer.exe(30.3MB)

       iReport의 설치

       다운로드 받은 iReport-1.2.5-windows-installer.exe 을 더블클릭

       설치시 어려운점은 없습니다. 그냥 Next 버튼을 몇 번 눌러주면 설치 끝.

       설치 위치는 설치시 특별히 바꾸지 않는한

       C:/Program Files/JasperSoft/iReport-1.2.5 에 설치 됩니다.


    iReport로 템플레이트 파일 만들기

    - 우선 설치한 iReport를 실행합니다.
        설치시 경로를 바꾸지 않았다면
              C:/Program Files/JasperSoft/iReport-1.2.5
        에 설치되었을텐데
        저의 경우에는 iReport.exe 를 실행하지 않고
        iReport.bat 를 실행합니다.
        왠지 이 배치파일로 실행해야 제대로 환경을 끌여들여서 실행하는 것 같습니다.

    - iReport 화면이 떳으면 제일 처음에 JDBC 파일을 연결시켜 줍니다.
       여기서는 PostgreSql 8.1.4를 설치했으므로
       PostgreSql 8.1.4의 설치폴더 밑에 JDBC 폴더 안에
       JDBC 드라이버가 설치되어 있는 것을 사용합니다.

       메뉴에서 Options->Classpath 를 선택하면 윈도우가 하나 뜨는데
       그 윈도우의 오른쪽에 있는 Add JAR 버튼을 누릅니다.
              C:Program FilesPostgreSQL8.1jdbc 안의 postgresql-8.1-405.jdbc3.jar
       를 선택합니다.
       Save classp... 라는 버튼을 눌러 저장하고 나옵니다.

    - 다음은 사용할 데이타소스를 정의해 줍니다.
       메뉴에서 Data->Connections / Datasources 를 선택합니다.
       화면 오른쪽의 New 버튼을 선택합니다.
       아래 그림처럼 입력합니다.(각자의 환경에 맞추면 됩니다.)


       이 문서에서는
       Username 에는 postgres
       Password에는 postgres를 넣었습니다.
       그 옆에 Save password는 체크해 주는 것이 나중을 위해 편합니다.
       ( 안 그러면 새로 실행할 때마다 패스워드 넣으라고 시끄럽게 떠듭니다. )
     
       Test 버튼을 눌러 제대로 연결이 되는지 확인합니다.
       연결이 안되면 물론 안됩니다.
       당연한 얘기겠지만 데이타베이스명, 드라이버명,유저명,패스워드등을 잘 체크합니다.
       연결이 잘 되면 Save버튼으로 저장하고 나옵니다.
     
    - 여기서 데이타베이스의 데이타를 정리하고 갑시다.
      현재 이 문서에서 사용하고 있는 데이타베이스는 PostgreSql이므로 그것을 위주로
      설명을 하겠지만 다른 데이타베이스도 별 문제없이 사용될 것입니다.
      데이타베이스에 대한 설명은 위에서도 밝혔듯이 하지 않습니다.
      어느 정도 데이타베이스를 다룰줄 알아야 이 밑의 데이타 준비를 할 수 있을 것입니다.
     
    데이타베이스 생성
        CREATE DATABASE "MyDB01"
          WITH OWNER = postgres
               ENCODING = 'EUC_KR'
               TABLESPACE = pg_default;
     
      테이블생성
      : rel 이라는 테이블을 생성합니다.
        이것은 인맥구분에 사용할 테이블입니다.
        다음은 생성 SQL입니다.
     
        CREATE TABLE rel
        (
          rel_id int2 NOT NULL,
          rel_name text,
          CONSTRAINT "rel_PK" PRIMARY KEY (rel_id)
        )
     
      : tbl01 이라는 테이블을 생성합니다.
        이것은 인맥정보로서 사용할 테이블입니다.
        다음은 생성 SQL입니다.
     
        CREATE TABLE tbl01
        (
          uid int4 NOT NULL,
          fname text,
          telno1 text,
          rel_id int2,
          CONSTRAINT "tbl01_PK" PRIMARY KEY (uid)
        )
     
       다음은 위의 테이블에 넣을 데이타를 SQL문으로 만든 것입니다.
        insert into rel(rel_id, rel_name) values(1,'가족');
        insert into rel(rel_id, rel_name) values(2,'친척');
        insert into rel(rel_id, rel_name) values(3,'친구');
        insert into rel(rel_id, rel_name) values(4,'선배');
        insert into rel(rel_id, rel_name) values(5,'후배');
     
        insert into tbl01(uid,fname,telno1,rel_id) values(1,'아버지','011-111-1111',1);
        insert into tbl01(uid,fname,telno1,rel_id) values(2,'어머니','022-222-2222',1);
        insert into tbl01(uid,fname,telno1,rel_id) values(3,'큰형','033-333-3333',1);
        insert into tbl01(uid,fname,telno1,rel_id) values(4,'막내','044-444-4444',1);
     
        insert into tbl01(uid,fname,telno1,rel_id) values(5,'삼촌','055-555-5555',2);
        insert into tbl01(uid,fname,telno1,rel_id) values(6,'매형','066-666-6666',2);
     
        insert into tbl01(uid,fname,telno1,rel_id) values(7,'덕팔이','077-777-7777',3);
        insert into tbl01(uid,fname,telno1,rel_id) values(8,'용팔이','088-888-8888',3);
        insert into tbl01(uid,fname,telno1,rel_id) values(9,'삼순이','099-999-9999',3);
     
        insert into tbl01(uid,fname,telno1,rel_id) values(10,'최선배','100-100-1000',4);
        insert into tbl01(uid,fname,telno1,rel_id) values(11,'김선배','200-200-2000',4);
        insert into tbl01(uid,fname,telno1,rel_id) values(12,'이선배','300-300-3000',4);
     
        insert into tbl01(uid,fname,telno1,rel_id) values(13,'송혜교','123-123-1234',5);
        insert into tbl01(uid,fname,telno1,rel_id) values(14,'오연수','234-234-2345',5);
        insert into tbl01(uid,fname,telno1,rel_id) values(15,'김희선','345-345-3456',5);
     
        이 SQL을 실행시켜 기본 데이타를 준비하십시오.
        (각자, 준비해도 됩니다.)
     
    - 데이타까지 준비가 됐으니 보고서를 만들 SQL을 만듭니다.
      
       이 문서에서는 이렇게 만들었습니다.
      
       SELECT b.rel_name, a.fname, a.telno1
       FROM tbl01 a LEFT JOIN rel b ON a.rel_id = b.rel_id
       ORDER BY b.rel_name
     
    - 이제 보고서를 만들 준비가 끝났습니다.
     
       보고서를 만듭시다.(자신의 화면과 이 문서를 맞추어서 보시길...)
     
       우선 iReport의 기능중에 Report Wizard 라는 편리한 기능이 있는데
       이것을 이용하면 간단한 보고서 양식은 금방 만들 수 있습니다.
     
    - 메뉴에서 File->Report Wizard 선택
     
    - Step 1 : insert the query to retrieve report fields
     
       Connection / Datasource 에 위에서 만든 데이타소스명을 선택합니다.
       여기서는 MyDB01
     
       밑에 SQL Query에 위에서 준비한 SQL 문장을 넣습니다.
      
       SELECT b.rel_name, a.fname, a.telno1
       FROM tbl01 a LEFT JOIN rel b ON a.rel_id = b.rel_id
       ORDER BY b.rel_name


     
    - Next 버튼을 누르면 "SmartCard PIN"이라는 윈도우가 나와서 Password를
      넣으라고 나오는 사람은 데이타베이스 접속 패스워드를 넣어주면 됩니다.
      위에서 데이타소스 정의시 Save password에 체크를 해 둔 사람은 이 윈도우는
      나타나지 않습니다.
     
    - Step 2 : select fields 화면에서 모든 컬럼명을 오른쪽으로 선택해서 넣습니다.
      모든 컬럼을 선택하는 것은 단순히 ">>" 버튼을 누르면 됩니다.
      Next 버튼 클릭
     
    - Step 3 : Group by 윈도우는 그냥 두고 Next 버튼 클릭
     
    - Step 4 : choose layout
       Tabular layout을 선택
       classicT.xml 선택
       Next 버튼 선택
     
    - Step 5 : finish
       Finish 버튼 클릭
     
    여기까지 왔으면 보고서 하나가 거의 완성이 되었습니다.
     
    우선 저장을 합니다.
        (알기쉬운 곳에 저장하는게 좋겠죠?
          괜히 아주 잘 보관하겠다고 했다가
          나중에 어디다 저장했는지 까먹는 황당한 수가 생깁니다.)
      이 문서의 경우에는 D:/TEST/report01.jrxml라는 이름으로 저장했습니다.
     
    다음은, 컴파일
      메뉴->Build->Compile 를 선택하면 컴파일 됩니다.
      메뉴바에 이쁘장한 아이콘들도 준비되어 있는데 컴파일 아이콘을 찾아서 해도 됩니다.
      오른쪽 끄트머리쯤에 있습니다.
      ( 이 컴파일에서 나오는 에러메세지 같은 것들은 각자 알아서 해결하시길...
        이 부분은 저도 설명할만한 수준이 아니라서리..)
     
    다음은 출력될 보고서를 미리 봅니다.
      메뉴->Build->JRViewer preview 선택
      메뉴->Build->Execut(with active connection)을 선택
      잘 보이나요?
      잘 보여야 합니다.
      안 보이면? 당연히 앞으로 돌아가서 다시 체크해 봐야겠죠?
     
    다음은 PDF 형식으로 보죠.
      메뉴->Build->PDF preview 선택
      메뉴->Build->Execut(with active connection)을 선택
      잘 보이나요?
      잘 안보일겁니다.
      미리 설명하려다가 위에서 잊어먹었습니다.
      PDF로 보려면 iReport에 PDF는 뭘로 보겠다고 정해줘야 합니다.
      이 문서에서는 Adobe Reader로 PDF를 볼 것입니다.
      그래서 문두의 테스트 환경에 Adobe Reader 설치라고 친절히(?) 적어 놓았던 거죠.
     
      메뉴->Options->Settings 선택
      External programs 탭 선택
      PDF Viewer에 Adobe Viewer 프로그램 선택
      (이 문서에서는 C:/Program Files/AdobeAcrobat 7.0/Reader/AcroRd32.exe )
      Save 버튼을 선택해서 저장하고 나옵니다.
     
    다시 위의 PDF 로 보는 걸 해보죠.
      잘 보이나요?
      이번엔 보입니다.
      보이긴 보이는데 뭔가 이상하죠?
      한글 항목이 나타나질 않습니다.
      그럼 제대로 보이는겁니다.
      장난하냐?
      아직까진 제대로 된 거란 얘기입니다.
     
    이제부터 한글이 제대로 보이도록 하는 작업을 합니다.
        http://prdownloads.sourceforge.net/itextpdf/iTextAsian.jar 에 접속하면
        파일을 다운받는데 iTextAsian.jar 라는 파일을 받습니다.
        자세히는 모르겠는데 iText.jar와 연계해서 2바이트 코드를 PDF생성시
        가능하게 해 주는 것 같습니다.
     
        다운받은 iTextAsian.jar 를 iReport의 lib 폴더에 넣어줍니다.
        이 문서에서는 C:/Program Files/JasperSoft/iReport-1.2.5/lib 에 복사했습니다.
     
        iReport를 다시 실행시킵니다.
        (노파심; 현재 iReport가 화면에 떠 있으면 닫고 다시 iReport를 실행해야 합니다.)
     
       좀 전에 만든 D:/TEST/report01.jrxml을 불러들입니다.
       그리고 한글이 보일 항목을 지정하고 옆에 Element Properties 창에서
       PDF Font에 HYGoThic-Medium 를
       PDF Encoding에 UniKS-UCS2-H (Korean)를 지정하고
       다시 PDF Preview를 해봅니다.
     
       한글이 잘 보이는가요?
       잘 보여야 합니다.
       더 이상은 나도 잘 모르기 때문에....
     
       잘 보이면 보고서를 좀 더 다듬죠.
       영어로된 항목명을 적당히 한글로 고쳐주고 이 때도 폰트를 맞춰줘야 합니다.
       (위에 설명한 폰트말고 몇 개가 더 되는게 있는데 그건 각자 찾아 보십시오.)
     
       이 문서에서는 이렇게 다듬었습니다.

     
       참고로 위의 폰트 설정은 나중에 웹보고서 출력시 PDF로 출력할 때
       한글을 보여주려고 하기 때문입니다.
       위와 같이 설정하고 실행하는 웹어플리케이션에서 PDF로 볼 때 iTextAsian.jar를
       찾지 못하면 에러가 납니다.
       하지만 애플릿뷰어로 보여줄 때는 맞춰 줄 필요 없습니다.
     
    이제 iReport로 작업하는 것은 이것으로 끝냅니다.
    iReport의 디자인 방법이나 다른 기능들은 이 문서에서 설명하지 않습니다.
    이 문서의 목적은 웹보고서를 어떻게 구현하는가에 초점을 맞추고 있기 때문입니다.

     
    지금까지 한 것은 자동완성기능인 Report Wizard 를 이용한 것입니다.
     
    수동으로 만드는 것도 각자 연습해 보시기 바랍니다.
     
    아마 다른 비쥬얼툴을 사용해 보신 분이라면 어려움 없이 하실 수 있을 겁니다.
     
     
     
    첨부파일을 이용하기
     
    다음은 이 보고서를 웹을 통해 보여주어야 하기 때문에
     
    웹어플리케이션을 하나 만듭니다.
     
    아래의 첨부파일을 풀어서 톰캣이 웹어플리케이션으로서
     
    인식하도록 합니다.


    첨부파일 : MyWeb02.zip
     
     
    웹어플리케이션을 만드는 부분은 설명하지 않습니다.
     
    제 블로그를 보시거나 다른 사이트를 참조하시기 바랍니다.
     
    이제부터 첨부파일의 구조대로 설명합니다.
     
    이 문서에서는 톰캣을 이용하여 MyWeb02라는 웹어플리케이션을 생성했고
     
    그 구조는 다음과 같습니다.



    이 예제 웹어플리케이션을 실행하기 위해서는 준비과정이 필요합니다.

    예제 소스에는 모든 라이브러리 파일은 담지 않았습니다.

    파일크기도 커지고 각자 해 보는 것이 좋기 때문입니다.

    예제에 필요한 파일 복사해 넣기

     /MyWeb02/WEB-INF/lib 에는 첨부파일에도 아무것도 들어있지 않는데

    이 폴더에 아래의 파일들을 복사해 넣으십시오.

       - JasperReports를 압축해제한 폴더의 밑의 lib 안의 모든 JAR 파일
       - jasperreports-1.2.5.jar
       - jasperreports-1.2.5-applet.jar
       - iTextAsian.jar
    # by 제갈장비 | 2006/09/15 10:45 | 제갈장비-JAVA | 트랙백 | 덧글(4)
    2006년 09월 14일
    JFreeChart 1.0.2 필수 라이브러리
    빼낸 라이브러리를 가끔 지운 경우
    다운받은 파일을 압축풀어서 빼내기도 귀찮아서
    여기에 그냥 등록해 둡니다.

    - jcommon-1.0.5.jar
    - jfreechart-1.0.2.jar
    # by 제갈장비 | 2006/09/14 15:09 | TIP-JAVA | 트랙백 | 덧글(0)
    2006년 09월 14일
    JFreeChart 1.0.0 DEMO Source

    JFreeChart 1.0.0 DEMO Source

     

    작성일 : 2006.09.14

    수정일 : 2006.09.20

    작성자 : 제갈장비

    ========================================================

    [ 다운로드 파일 ]

    1. 데모소스파일 : jfreechart-1.0.0-demo_src.zip

    2. 애플릿으로 변경한 어플리케이션 : JFreeChartTest01.zip

    ========================================================

    1. 데모소스파일

    데모소스파일은 jfreechart-1.0.0의 데모 소스입니다.

    이 다음 버전 부터는 돈내고 사게 되어 있네요.

    이 소스를 JFreeChart 1.0.2를 이용해 컴파일해 보면 여기저기 에러가 나는데

    API 도큐멘트 보면서 고치기도 힘드네요.

    그래도 컴파일되는게 많이 있으니까 공부는 됩니다.

    소스를 풀었을 때 JFreeChart의 데모소스가 있는 곳은

    jfreechart-1.0.0-rc1/src/org/jfree/chart/demo 안에 있습니다.

    2. 애플릿으로 변경한 어플리케이션

    애플릿으로 변경한 어플리케이션은 제가 공부하기위해 애플릿으로 변경한 소스입니다.

    아래에 적은 방법처럼 간단히 변경이 되는 것만 수정했습니다.

    변경 방법은 예를들어 BarChart3DDemo1.java의 경우

    1. package org.jfree.chart.demo; -> 이 부분을 없애고 대신에 import javax.swing.JApplet; 를 넣어준다.

    2. public class BarChart3DDemo1 extends ApplicationFrame -> ApplicationFrame 를 JApplet로 바꾼다.

    3. public BarChart3DDemo1(final String title) -> 를 public BarChart3DDemo1()로 변경한다.

    4. super(title); -> 지운다.

    5. public static void main(final String[] args) { ... } 를 주석처리하거나 지운다.

    6. 컴파일

    이렇게 변경했습니다.

    [실행환경]

    TOMCAT : 5.0.28

    JDK : 1.4.2_12

    JChartFree : 1.0.2


    [어플리케이션 실행방법]

    압축을 푼 후 톰캣에 웹어플리케이션으로서 등록합니다.

    그리고 브라우저의 주소란에 http://localhost:8080/JFreeChartTest01/jsp/ChartList.html 를 넣고

    열어보면 애플릿 리스트가 나타나는데 하나하나 클릭해 보시기 바랍니다.





    [컴파일 방법]

    위에 첨부한 JFreeChartTest01.zip안에 컴파일한 클래스파일도 포함되어 있습니다.

    컴파일은 명령행에서 해당 애플릿파일이 들어 있는 디렉토리까지 들어간 다음
    우선 클래스패스를 설정해야 합니다.

        > set CLASSPATH=.;C:Tomcat5028commonlibservlet-api.jar;jcommon-1.0.5.jar;jfreechart-1.0.2.jar
        * 자신의 환경에 적절히 맞춰서 설정하시기 바랍니다.

    위에 설명한것 처럼 애플릿으로 소스를 바꾼다음
    컴파일합니다.

    - 끝 -
    # by 제갈장비 | 2006/09/14 15:06 | 제갈장비-JAVA | 트랙백 | 덧글(0)
    2006년 09월 14일
    The Jfreechart Class Library-Developer Guide-v1.0.0-pre1.pdf

    다운받아 보세요

    The Jfreechart Class Library-Developer Guide-v1.0.0-pre1.pdf
    # by 제갈장비 | 2006/09/14 15:02 | 문서-JAVA | 트랙백 | 덧글(0)
    2006년 09월 14일
    JFreeChart - Y축(Range) Label 글자를 가로로 써보자

    출처 : http://blog.naver.com/stove/110007738092

    글자가 옆으로 나와서 보기가 쫌 거슬린다고 뭐라하면 어쩌나  글자를 돌려야지 ㅠ_ㅠ

    글자 돌리는 방법.

    다른 차트에서는 테스트 안해봤고 라인차트, TimeSeries 차트에서 해 봤는데 뭐 똑같이 되긋지 -ㅅ-??

    ----------------------------------------------------------------------------------------

    XYPlot plot = chart.getXYPlot();               // chart는 생성한 Chart 객체임

                                                               // Plot 은 차트가 그려지는 영역을 뜻하는것 같다.

                                                               // 언제한번 대대적으로 개념정리를 해야 할듯..

    ValueAxis range = plot.getRangeAxis();   // range는 y 축을 뜻함

                                                              // x축을 가지고 장난칠려면 plot.getDomainAxis()

    range.setLabelAngle( 90 * (Math.PI / 180.0) );  // 90은 돌릴려는 각도

    ----------------------------------------------------------------------------------------

    setLabelAngle() 함수가 인자를 radian으로 받기 때문에 dgree를 radian으로 바꿔줘야 한다.

    Chart 가 Plot을 포함하고 Plot 은 Axis를 포함한다??

    기타 Axis(축) 관련 메소드들 -ㅅ-;

    setLabel(String label) - 축아래 "온도", "시간" 등의 글자를 설정

    setLabelFont(Font font) - Label 폰트 지정

                                        ex) domain.setLabelFont(new Font("굴림", Font.PLAIN, 10));

    setTickLabelFont(Font font) - 축의 눈금 아래 출력되는 값의 폰트지정

    setRange(float start, float end); - 값의 범위 지정

     

     

    # by 제갈장비 | 2006/09/14 14:42 | TIP-JAVA | 트랙백 | 덧글(0)
    2006년 09월 12일
    jfreechart 사용예제

    출처 : http://blog.naver.com/zijone?Redirect=Log&logNo=20026496858

    <testChart.jsp>

    <%@ page contentType="text/html;charset=euc-kr"%>
    <%@ page import="org.jfree.data.general.DefaultPieDataset"%>
    <%@ page import="org.jfree.chart.JFreeChart"%>
    <%@ page import="org.jfree.chart.plot.PiePlot"%>
    <%@ page import="org.jfree.chart.ChartRenderingInfo"%>
    <%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
    <%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%>
    <%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>
    <%@ page import="org.jfree.chart.ChartFactory"%>
    <%@ page import="org.jfree.chart.ChartUtilities"%>
    <%@ page import="org.jfree.data.general.PieDataset"%>
    <%@ page import="org.jfree.data.category.DefaultCategoryDataset"%>
    <%@ page import="org.jfree.chart.plot.PlotOrientation"%>
    <%@ page import="java.io.*"%>
    <%
     DefaultCategoryDataset dataset = new DefaultCategoryDataset();

     dataset.addValue(5.0, "2005", "1월");
     dataset.addValue(16.0, "2005", "2월");
     dataset.addValue(15.0, "2005", "3월");
     dataset.addValue(14.0, "2005", "4월");
     dataset.addValue(30.0, "2005", "5월");
     dataset.addValue(15.0, "2005", "6월");
     dataset.addValue(18.0, "2005", "7월");   

     dataset.addValue(7.0, "2006", "1월");
     dataset.addValue(19.0, "2006", "2월");
     dataset.addValue(9.0, "2006", "3월");
     dataset.addValue(5.0, "2006", "4월");
     dataset.addValue(15.0, "2006", "5월");
     dataset.addValue(22.0, "2006", "6월");
     dataset.addValue(19.0, "2006", "7월"); 

     JFreeChart chart = ChartFactory.createBarChart("Bar Chart","월", "대여량", dataset, PlotOrientation.VERTICAL, true, true, false);

     chart.setBackgroundPaint(java.awt.Color.white);
     chart.setTitle("월별 DVD 대여량");

     ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
     String fileName = "C:/" + "K0001.jpeg";
     ChartUtilities.saveChartAsJPEG(new File(fileName),chart,600,300,info);
    %>
    <img src="<%=fileName%>"/>
    <br><br>
    <%
    try {
     DefaultPieDataset dataset2 = new DefaultPieDataset();

     dataset2.setValue("1월", 5);
     dataset2.setValue("2월", 16);
     dataset2.setValue("3월", 15);
     dataset2.setValue("4월", 14);
     dataset2.setValue("5월", 30);
     dataset2.setValue("6월", 15);  

     JFreeChart chart2 = ChartFactory.createPieChart("Pie Chart", dataset2, true, true, false);

     chart2.setBackgroundPaint(java.awt.Color.white);
     chart2.setTitle("월별 DVD 대여량");

     ChartRenderingInfo info2 = new ChartRenderingInfo(new StandardEntityCollection());
     String fileName2 = "C:/" + "K0002.jpeg";
     ChartUtilities.saveChartAsJPEG(new File(fileName2),chart2,600,300,info2);
    } catch (Exception e) {

     System.out.println("error!!");
    }
    %>
    <img src="C:/K0002.jpeg"/>

    <실행화면>

    # by 제갈장비 | 2006/09/12 13:35 | TIP-JAVA | 트랙백 | 덧글(0)
    2006년 09월 12일
    JFreeChart를 활용해서 서블릿에서 그래프를 그려봅시다.
    출처 : http://wwww.okjsp.pe.kr/bbs?act=VIEW&bbs=bbs4&seq=51528

    [자바팁 연재-3]JFreeChart를 활용해서 서블릿에서 그래프를 그려봅시다.

     JFeeChart는 챠트 그림을 만드는데 특화한 고기능 라이브러리입니다. 물론, J2SE에는 Java2D라는 그림
    생성용의 API가 준비되어 있으므로, JFeeChart같은 라이브러리를 쓰지않고 써도 최소한 그림을 그리는 정도는
    가능합니다만, 기둥그래프같은 비교적 간단한 챠트를 만들기에도, 우선 좌표의 계산등의 세밀한 계산이나
    번잡한 코딩를 해야만 합니다.

     그러나, JFreeChart를 사용하는 것으로, 그래프의 기본이 되는 데이터 세트를 넘겨주는 것만으로,
    기둥그래프나 원 그래프, 버블 챠트, 레이다 챠트, 주식차트 같은 여러가지 챠트를, 간단히 작성할 수
    있습니다. 기본적인 그림그리기는 전부 JFeeChart가 대신해 주니까, 프로그래머는 좌표계산 같은 저 레벨의
    부분에 신경 쓰지 않아도 됩니다. 또, 예를 들어, 한번 작성한 챠트를 기둥챠트로 부터 둥근챠트에 변환하고
    싶다고 생각한 경우에도 , 클래스나 메소드를 바꿔 넣기 만 하면 되기 때문에, 비교적 간단히 바꿀 수 있습니다.
    여러분도 이번 기회에 비주얼 챠트를 사용해서 효과적인 페이지를 작성해 보세요.

    ■해설
    (1)JFreeChart라이브러리를 인스톨 합니다.
     JFreeChart를 이용하기에 앞서, 우선 라이브러리를 인스톨해야만 합니다. JFreeChart라이브러리는,
    아래의 사이트에서 받습니다.

    http://www.jfree.org/jfreechart/

     다운로드파일 jfreechart-X.X.X.zip(X는 버전)을 풀면, 여러가자 파일이 나옵니다.
    그중에서 jfreechart-X.X.X.jar, jcommon-X.X.X.jar를 어플리케이션 밑의 /WEB-INF/lib 폴더에 복사해 주세요.

    (2)서블릿 클래스를 정의합니다.
     이번에는,  우선 클래스 내부에 지정한 배열값으로, 원 그래프를 작성해 보는 것으로 합니다.
    당연히, 배열값을 얻어오는 장소는, 일반적으로 DB등으로 부터 값을 얻어 옵니다.

    ChartServlet.java

    import java.io.IOException;

    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.data.general.DefaultPieDataset;

    public class ChartServlet extends HttpServlet {
      public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        // 그래프 생성용 데이터를 준비합니다.
        String[][] aryDat =
            {
                {"A", "3000" },
                {"B", "10000"},
                {"C", "15000"},
                {"D", "3500" },
                {"E", "4500" }
            };
        // 원 그래프를 기본으로 하는 데이터 셋트를 준비합니다.
       DefaultPieDataset objDpd=new DefaultPieDataset();
        // 데이타 셋트에 항목명과 값을 순서대로 넣습니다.
        for(int i=0;i<aryDat.length;i++){
          objDpd.setValue(aryDat[i][0],Integer.parseInt(aryDat[i][1]));
        }
        // 3차원 원 그래프를 생성( 첫번째 인수로 부터 그래프 타이틀,
        // 데이터 셋트, 판례를 지정 할까, 도구 타이프를 표시할까,
        // URL을 동적으로 생성할까를 지정합니다.)
        JFreeChart objCht=ChartFactory.createPieChart3D(
          "ABCDE....",objDpd,true,false,false);   

        // 바이너리 출력 스트림에 JPEG형식으로 그래프를 출력 (600×400픽셀)
        response.setContentType("image/jpeg");
        ServletOutputStream objSos=response.getOutputStream();
        ChartUtilities.writeChartAsJPEG(objSos,objCht,600,400);
      }
    }

    (3)디플로이 디스크립터에 서블릿 클래스 등록합시다.
     여기서 만든 서블릿 클래스를 실행하기에 앞서, 미리 디플로이 디스크립터에 대해, 서블릿의 등록을 할
    필요가 있습니다. <url-pattern>요소에 /chart.jpg 같이 지정하는 것으로, 서블릿 클래스를 마치 동적인
    JPEG파일 인것 처럼 보여주는 것도 할 수 있습니다.

    web.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
      version="2.4">
      …중략…
      <servlet>
        <servlet-name>ChartServlet</servlet-name>
        <servlet-class>ChartServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>ChartServlet</servlet-name>
        <url-pattern>/chart.jpg</url-pattern>
      </servlet-mapping>
      …중략…
    </web-app>

     이 코드의 실행 결과는,  아래 그림처럼 됩니다.


     로직의 상세한 흐름에 대해서는, 코드 내의 주석을 참조로, 여기서는 JFreeChart를 이용해서 코딩의 간략한 흐름을
    파악해 주세요.

    1. 데이타 세트의 생성(빨간 부분)
    2. 챠트의 생성(보라색 부분)
    3. JPEG그림으로 클라이언트에 출력(녹색 부분)

      이것은, 원 그래프이외의 차트를 만드는 경우에도 공통적인 흐름입니다. 이 흐름을 이해하고 있으면,
    나중에 이용하는 클래스를 바꿔 넣는 것만으로, 여러가지 챠트를 만들수 있습니다. JFreeChart라이브러리에
    속하는 여러가지 클래스의 대해서는 아래를 참조 해주세요..

    http://www.jfree.org/jfreechart/javadoc/

    출처:http://www.atmarkit.co.jp/fjava/javatips/092jspservlet036.html

    # by 제갈장비 | 2006/09/12 11:49 | 문서-JAVA | 트랙백 | 덧글(1)
    2006년 09월 11일
    앙증맞게 예쁜 PC를 만들어보자. VIA EPIA Series
    출처 : http://blog.naver.com/leikang?Redirect=Log&logNo=60027645340


    1.VIA가 만든 블루오션, EPIA

     어느 시장이든 차별화된 기술, 또는 제품을 기반으로 시장에 대응하지 않는 한 치열한 경쟁을 피할 수 없는 것이 현실이다. 그런 점에서 보자면 CPU 제조사인 Cyrix와 그래픽 분야에 명성을 가지고 있던 S3를 품으로 맞은 VIA는 그들만의 특별한 제품을 만들어 내기에 유리한 조건을 갖추고 있다고 할 수 있다. CPU에서부터 메인보드용 칩셋, 각종 기능의 구현을 위한 칩셋들과 그래픽 기술까지를 아우르는 모든 기반을 갖추고 있기 때문에 그 하나하나가 비록 최고 수준은 아닐지라 해도 그런 다양한 기술들을 잘만 활용하면 그 어떤 경쟁사도 대응하기 힘든 독창적인 제품을 만들어낼 수도 있다.

    실제 VIA는 기술적으로 경쟁의 한계를 뛰어넘기 어려운 메인스트림 외에 자신들만이 할 수 있는 독창적인 Embedded Platform 시장을 새로이 개척하기에 이르렀는데, 그 결과 탄생한 것이 VIA의 EPIA이다.


    이 메인보드 시리즈의 첫 번째 특징은 '작다'는 것이겠지만, 면면을 살펴보면 이것이 다양한 관련 기술들을 모두 가지고 있는 VIA가 아니면 시도하기 힘든 새로운 제품의 영역이라는 점을 알 수 있다. VIA는 EPIA 시리즈에서 자사의 관련 칩셋, CPU, VGA 기술들을 통합해 하나의 제품으로 엮어내는 시도를 하고 있다. 아울러 NIC, Audio, HDTV Out에 관련된 자사의 제품들을 적극 활용해 여타 메인보드와 달리 'VIA 칩셋의 총아'라 불릴만한 초슬림 메인보드를 탄생시켰다.

    EPIA를 이용하면 작고 예쁜 시스템을 만들 수 있다. 물론 여기에서 말하는 '작다'는 개념은 시스템 구축에 일가견이 있는 유저들이 상상할 수 있는 '작은 PC'의 개념을 뛰어넘는 극단적으로 작은 PC를 말한다. 그럼 VIA의 EPIA를 살펴보기로 하자.

     

    2.데스크탑 하드웨어를 이용하는 Mini-ITX

      EPIA 메인보드는 경이로운 수준의 소형화를 이루어냈다. Mini-ITX 시리즈는 데스크탑에 이용하는 하드웨어를 그대로 이용하게 되므로 이를 위한 추가적인 공간이 필요하게 되지만, 그럼에도 불구하고 현존하는 가장 작은 시스템을 만들어 낼 수 있다.

     
      Model  EPIA-CN13000
      Processor  1.3GHz VIA C7 nanoBGA2 Processor
      Memory  DDR2 400/533 DIMM socket
      VGA  VIA UniChrome™ Pro
      Expansion Slots  1 x PCI
      Onboard IDE  2 x UltraDMA 133/100/66
      Onboard SAT  2 x SATA
      Onboard LAN  VIA VT6103 LAN Controller
      Onboard Audio  VIA VT1618 8-channel AC'97 Codec
      TV-OUT  VIA VT1625M HDTV Encoder
      Form Factor  Mini-ITX (4-layer)

    충분한 확장 공간이 부족한 만큼 시스템에 필요한 모든 기능을 메인보드에 담고 있다. 메인보드 외에 HDD/RAM만 갖추어지면 바로 시스템으로서의 기능을 할 수 있도록 구성되어 있기 때문에 작고 저렴하며, 공간활용을 극대화할 수 있는 시스템을 원하는 사용자에겐 좋은 선택이 될 것으로 보인다.

    ▲ Mini-ITX

    4층 기판의 PCB가 사용되는 Mini-ITX의 크기는 가로, 세로 공히 17cm. Micro-ATX 보다도 확연히 작은 사이즈를 자랑한다. 덕분에 상당 부분에서 확장성이 줄어들긴 했지만 이만큼의 작은 메인보드를 위해서는 어쩔 수 없는 선택이었을 것으로 보인다.

    ▲ IDE / DIMM

    시작부터 최소화된 시스템을 지향하기 때문에 충분한 확장성을 기대하기 어렵지만 DIMM 슬롯이 하나 뿐인 것은 다소 아쉬운 점이다. 메모리는 DDR400/533을 모두 지원하며 1GB까지 장착이 가능하므로 가급적 처음부터 충분한 용량의 메모리를 구입할 필요가 있다.

    ▲ SATA

    EPIA Mini-ITX 시리즈는 SATA 역시 지원하고 있기 때문에 상황에 따라 필요한 포트를 이용할 수 있다. 작은 메인보드 치고는 충분한 4개의 IDE와 2개의 SATA 기기를 장착할 수 있기 때문에 보조기억장치를 선택함에 있어 사용상의 제약은 전혀 없다고 할 수 있다.

    ▲ PCI / FDD Connector

    이런 초소형의 메인보드엔 그 필요성이 반감되긴 하지만, 어쨌든 기능 확장을 위한 PCI 슬롯 역시 하나를 갖추고 있다. 사용에 필요한 대다수의 기능이 메인보드에 집약되어 있지만 그 외 사용자에게 꼭 필요한 기능의 추가를 위해 확장 카드를 설치할 수 있다.

    FDD 커넥터는 PCI 슬롯의 위에 위치하고 있다. 워낙 작은 메인보드이기 때문에 레이아웃 이라는 것이 그다지 큰 의미를 가지긴 어려워 보인다. 어느 위치에 해당 커넥터를 배치하더라도 조립시엔 상당한 노력과 인내를 각오해야 할만큼 촘촘하게 하드웨어들이 배치되기 때문에 ATX의 경우처럼 레이아웃을 평가하기엔 어려움이 따르는 것이 사실이다.

    ▲ Ethernet Controller

    VIA의 저력은 바로 이런데 있는 것이 아닐까 생각된다. 메인보드를 위한 칩셋, CPU, Graphic, 그리고 각종 컨트롤러와 PHY 등, 기능의 구현을 위한 거의 모든 종류의 컨트롤러를 만들어내기 때문에 자사의 제품들만을 가지고도 최적화된 시스템을 구현할 수 있다. 이런 메인보드를 구현해낼 수 있는 것 조차도 VIA가 아니면 어려워 보이는 것도 이 때문이다.

    Mini-ITX 시리즈에 제공할 LAN 기능을 위해 VT6103 Ethernet PHY가 장착되어 있다. 10/100Mbps 속도를 지원하므로 국내의 가장 빠른 인터넷 환경에도 충분히 대응할 수 있다.

    ▲ HDTV Encodeor

    TV-Out을 위해 HDTV Encoder인 VT1625M이 장착되어 있다. TV-Out 기능 역시 빼놓지 않고 지원하고 있는 것은 긍정적인 부분으로 시스템의 활용 가치를 높여주는 방법이라 할 수 있다. 이런 Embedded Platform들의 대다수가 전문적인 작업 보다는 다양한 활용에 초점이 맞추어져 있기 때문에 거실의 한 자리를 차지하기 위해서는 반드시 필요한 기능 중 하나이다.

    ▲ Super I/O

    EPIA Mini-ITX는 Super I/O 역시 VIA의 칩을 사용하고 있다. 토탈 시스템 솔루션 업체답게 자사의 각종 칩셋들 만으로도 PC의 거의 모든 기능을 구현할 수 있는 장점이 있다. 물론 Winbond 83697UF역시 호환되기 때문에 이를 이용할 수 도 있다.

    ▲ AC97' Codec

    VT1618 AC97' 코덱을 장착해 8채널 사운드를 지원한다. 개인적 의견으로는 더이상의 멀티채널 보다는 음질 부분을 강화하는 게 어떨까 하는 조언을 다수의 컨트롤러/코덱 제조사에게 건의하고 싶지만 어쨌든 대세는 다채널화 되어가고 있으므로 이에 준하는 성능을 갖춘 것으로 생각된다.

    ▲ South Bridge

    사우스 브릿지로는 VIA의 VT8237R Plus가 장착되어 있다. 충분하다 못해 넘칠 만큼의 기능들을 지원하므로 이를 토대로 작지만 충실한 기능의 지원을 이루어내고 있다. 

    ▲ VIA CN700 IGP Chipset

    VIA C7 프로세서를 위한 CN700 IGP 칩셋을 장착하고 있다. 기능상으론 훌륭하지만 VIA의 프로세서 자체를 시장에서 만나기 힘들기 때문에 이 칩셋이 사용된 메인보드 역시 시장에서 쉽게 찾아보기 힘든 것이 사실이다.

    하지만 CN700 칩셋은 DDR/DDR2를 모두 지원하며 S3 UniChrome Pro 그래픽이 내장된 매력적인 칩셋이다. 최근 많이 사용되는 고화질 동영상의 경우 C7 프로세서의 능력으로 인해 다소 버겁지 않을까 하는 걱정이 들기도 하지만 UniChrome Pro는 하드웨어 MPEG-2 Decoding Acceleration을 지원하고 있어 DVD에도 충분히 대응할 수 있는 능력을 갖추고 있다.

    ▲ VIA C7 Processor

    VIA EPIA 시리즈는 그 특성에 맞게 CPU 역시 보드에 장착되어 있다. Mini-ITX는 CN13000G/CN10000EG 두 모델이 출시되어 있는데, CN13000G는 1.3GHz, 10000EG는 1.0GHz의 C7 프로세서가 탑재된다.

    클럭도 높진 않지만 90 나노의 미세공정으로 제조되는 C7 프로세서이기 때문에 그 발열량은 히트싱크 만으로도 감당할만한 수준이다. 다만 작은 케이스의 사용이 함께 고려되어야 하기 때문에 Mini-ITX는 40mm 팬과, 노스브릿지를 아우르는 큼직한 히트싱크가 채용되어 있다.

    ▲ 전원부

    VIA의 프로세서들은 전력 소모와 발열에 있어서는 대단한 장점을 가지고 있다. 비록 최신의 프로세서들과 비교할 때 성능상의 열세가 두드러진다고는 하지만, 게임이나 빠른 3D 등의 처리를 위한 고사양 시스템이 아닌 이상 일반적인 웹서핑이나 어플리케이션에 있어서는 빠른 프로세서의 덕을 보기 어려운 것이 사실이기 때문에 이런 시스템 솔루션엔 오히려 최적의 선택이 될 수도 있다.

    더구나 극도로 작은 시스템의 구현을 위해서는 발열의 제어가 불가피하기 때문에 이런 저전력 CPU는 확실한 이점이 될 수 있다. 메인보드의 전원부 역시 상당히 간소하지만 CPU와 칩셋 등이 사용하는 전력을 공급하는덴 부족함이 없다.

    ▲ 백패널

    백패널은 일반 ATX 메인보드의 그것에 비해 큰 차이가 없을 만큼 많은 입출력 포트들이 자리하고 있다. TV-Out을 위한 S-Video 단자와 S/PDIF 출력을 위한 RCA 단자, 이더넷을 위한 RJ45포트와 4개의 USB 2.0 포트도 마련되어 있다.

    현재엔 사용의 빈도가 극히 낮지만 하나의 시리얼 포트와 내장 그래픽의 출력을 위한 D-SUB 포트가 함께 장착돼 있는 것도 볼 수 있다.

    3.상상보다 더 작은 PC, Nano-ITX

     앞서 살펴본 Mini-ITX는 고작 17cm의 정사각형 크기로 온보드된 CPU와 VGA를 이용해 극단적으로 작은 PC를 만들 수 있다.

    하지만 이제 둘러볼 Nano-ITX를 이용하면 상상하기 힘든 크기의 PC를 만들어 낼 수도 있다. 얼마나 작은 PC가 만들어 질 수 있는지 확인해보자.

     
      Model  VIA EPIA A-N10000E
      Processor  VIA Luke CoreFusion Processor
      Chipset  VIA VT8237R South Bridge
      VGA  VIA UniChrome Integrated Graphic
      Expansion Slots  1 x Mini-PCI
      Onboard Serial ATA  2 x UltraDMA 66/100/133
      Onboard LAN  1 x SATA
      Onboard Audio  VT1617A 6Ch. Audio
      Onboard TV Out  VT1625M HDTV Encoder
      Form Factor  Nano-ITX



    Nano-ITX는 세가지 모델로 출시되어 있다. 눈에 띄는 스펙은 앞서 살펴본 Mini-ITX와 대동소이하지만 두 시리즈엔 결정적인 차이가 존재한다. Mini-ITX 시리즈가 데스크탑 하드웨어들을 활용해 초소형의 시스템을 구현한다면 Nano-ITX는 그보다 더 작은 PC를 지향하며 상황에 따라서는 이를 위해 데스크탑용 하드웨어를 과감히 포기해야 한다. 한마디로 극단적인 사이즈의 초소형 PC를 만들어낼 수 있는 제품이라 할 수 있다.

    ▲ Nano-ITX

    Nano-ITX는 경이로울 만큼 작은 크기의 메인보드이다. 성인 남자의 손바닥 위에 올려놓아도 그 크기가 비슷해 보일 정도로 작은 메인보드지만 이 역시 필요한 대부분의 기능을 갖추고 있는 재주꾼이다.

    ▲ Nano-ITX

    Nano-ITX 메인보드의 크기는 불과 12cm. 고작 CD 한 장 크기 정도이다. 작은 CD 케이스와 비교해 보면 그 크기가 어느 정도인지 확인이 된다.

    ▲ Nano-ITX / 후면

    가로, 세로 12cm의 작은 면적에 해당 기능을 모두 집약시키기 위해선 내부는 그만큼 복잡해질 수 밖에 없다. 이를 위해 Nano-ITX는 8층의 PCB를 사용하고 있는데 각종 기능을 담당하는 칩셋 들은 전, 후면을 가릴 것 없이 빼곡히 자리하고 있다.

    ▲ Luke Processor

    Nano-ITX에 사용되는 CPU는 VIA Luke CoreFusion Processor이다. 이 CPU 는 VIA Eden-N 시리즈의 최신 버젼이라 할 수 있는데, 노스 브릿지인 CN400과 그래픽 코어인 UniChrome Pro를 함께 집적한 제품이다.

    1GHz로 동작하지만 불과 1V의 전압으로 동작이 가능한 저전력 프로세서로 이처럼 작은 PC를 구현하는데 더할 나위 없는 선택이라 할 수 있다.

    ▲ South Bridge

    Luke 프로세서는 VT8235M, VT8237, VT8251등의 사우스 브릿지와 호환이 가능하다. 리뷰를 위해 제공 받은 N10000E에는 VT8237R이 사우스 브릿지로 사용되고 있다.

    ▲ Super I/O

    Super I/O로는 Winbond의 83697HG가 채용되어 있다.

    ▲ HDTV Encoder

    Mini-ITX와 마찬가지로 Nano-ITX 역시 TV-Out을 위한 HDTV 인코더가 장착돼 있다. 제품의 특성상 빠른 시스템을 요하는 작업 보다는 간단한 웹 작업, 또는 멀티미디어를 위한 시스템으로 활용될 가능성이 많기 때문에 TV-Out 기능은 반드시 갖추어야 할 필수와 같은 항목이다.

    ▲ AC97' Codec

    6채널 사운드를 지원하는 VT1617A AC97' Codec을 장착하고 있다. 작은 메인보드 치고는 충분한 수준의 사운드 옵션을 갖추고 있어 거실 한편에 설치하고 동영상을 위한 시스템으로 활용한다 해도 손색이 없다.

    ▲ SO-DIMM / IDE / S-ATA

    초소형의 시스템을 지향하다 보니 하드웨어 역시 이에 준하는 제품의 사용을 우선시 하고 있다. 메모리는 일반적인 DDR 메모리가 아닌 노트북에 사용되는 SO-DIMM 방식의 메모리를 사용해야 한다. DDR266/333/400 메모리를 지원하며 1GB까지 장착이 가능하다.
    다만 Mini-ITX와 마찬가지로 지원되는 슬롯은 오직 하나뿐이기 때문에 메모리를 추가하는 방식의 업그레이드가 불가능 하다는 점을 염두에 두어야 한다.

    IDE 커넥터는 두 개를 지원하지만 첫 번째는 일반적인 40핀의 헤더를, 두 번째는 44핀의 2.0mm 헤더를 지원한다. 여건이 되는 경우 일반적인 3.5" HDD보다 노트북용 HDD를 이용하면 아주 작은 시스템을 만들어낼 수 있다. 이밖에 하나의 S-ATA 도 지원하고 있어 상황에 맞는 인터페이스를 이용할 수 있다.

    ▲ Mini-PCI

    기능 확장을 위한 PCI역시 Mini-PCI 방식의 슬롯이 제공되므로 이에 맞는 하드웨어를 사용해야 한다. 하지만 작은 체구 답지 않게 이미 필요한 기능들을 충실히 갖추고 있으므로 기능 확장에 대한 가능성은 그리 크지 않은 것이 사실이고, 또 작은 사이즈 역시 확장에 대한 가능성을 떨어트리는 것 또한 사실이라 할 수 있다.

    ▲ 백패널

    TV-OUT을 위한 S-Video 커넥터와 S/PDIF 지원을 위한 RCA 포트, 두 개의 USB 2.0 포트왜 랜 지원을 위한 RJ45 포트가 갖추어져 있다. 내장 그래픽의 출력을 위한 D-SUB 포트가 설치돼 있는 것도 확인할 수 있다. 아쉽게 Nano-ITX 역시도 DVI 출력을 지원하진 않는다.

    ▲ 어댑터와 전원보드

    Nano-ITX는 아주 작은 메인보드답게 별도의 전원 공급용 커넥터를 사용하게 되기 때문에 이에 맞는 어댑터와 전원 공급용 보드가 존재한다. 전용 케이스에는 이의 수납을 위한 공간이 마련되어 있기 때문에 설치 시 함께 장착할 수 있다.

    물론 해당 제품은 메인보드에 함께 포함되어있는 품목은 아니기 때문에 별도로 구매해야 할 것으로 생각 되지만 일반적인 파워 서플라이 역시 사용이 가능하기 때문에 상황에 따라 전용 액세서리를 구입할 것인지, 크기를 희생하더라도 일반 하드웨어를 선택할지는 사용자의 몫이라 할 수 있다.

    ▲ 액세서리

    하나의 IDE 케이블과 메인보드로의 전원 공급을 위한 젠더, USB Port, 그리고 CPU에 이용할 쿨러가 함께 제공된다. 이밖에 쿨러의 장착에 사용할 수 있는 써멀 컴파운드와 키보드/마우스의 연결을 위한 PS/2 연결 포트도 함께 제공된다.

    4.Nano-ITX를 이용한 앙증맞은 PC

     앞서 살펴본 Nano-ITX와 이 메인보드를 위한 전용케이스를 가지고 시스템을 만들어 보자. 상상 이상의 깜찍하고 예쁜 PC를 만들 수 있다.

    ▲ Nano-ITX 전용 케이스

    전용 케이스에 Nano-ITX 메인보드와 전원 공급용 보드를 장착한다. 워낙 협소한 공간이기 때문에 그림과 같이 장착 전에 필요한 각종 헤더와 외부와 연결되는 포트들을 미리 연결해 두어야 한다.

    ▲ HDD의 장착

    상판의 하부에는 노트북용 2.5" HDD 장착을 위한 베이가 마련되어 있다. 바로 옆에는 시스템의 더워진 공기를 외부로 배출할 블로워팬이 함께 하고 있으니 팬의 전원 연결에도 주의를 기울일 필요가 있다.

    ▲ ODD의 장착

    상판의 윗부분은 ODD를 위한 공간이다. ODD의 아래 부분에 HDD가 위치하게 되는 구조인 셈이다. 전용 케이스는 ODD 역시 노트북용 제품을 사용해야 한다.

    ▲ 후면

    후면의 플레이트에 PS/2 포트를 연결하고 닫아주면 조립이 완료된다. 우측 상단의 에어홀은 블로워 팬이 내부의 공기를 배출하는 곳이므로 팬이 정확한 자리에 위치하고 있는지 확인해 주자.

    우측 핸드스크류 하단은 어댑터의 전력을 공급받는 전원용 보드가 위치하게 되므로 이 역시 잭의 연결에 이상이 없는지 확인해야 한다. 그 밖의 포트들은 전용 케이스와 보드의 백패널에 미리 맞추어져 있으므로 자연스럽게 조립이 가능하다.
    다만 내부의 배선은 조금만 길어도 불필요하게 공간을 차지하게 되므로 이런 배선이 CPU나 블로워 팬을 가리거나, 발열 지점에 위치하고 있어 열의 해소에 지장을 주게 되진 않는지 꼼꼼히 살펴주어야 한다.

    ▲ 완성된 시스템

    전면 베젤은 푸른색을 띄는 아크릴이 덧대어져 있기 때문에 시원하고 고급스런 이미지를 만들어 준다. ODD외에 USB를 위한 두 개의 전면 포트도 마련되어 있는 것을 볼 수 있다.

    ▲ 크기

    완성된 시스템은 가로, 세로 16cm 정도로 얼핏 보아선 컴퓨터라 인식하기 힘든 크기이다. 일반적인 ATX 파워 서플라이보다 더 작은 정도이고 보면 이를 PC로 인식하기 쉽지 않은 것은 당연해 보인다. 무광의 블랙 케이스와 밝은 파랑색을 띄는 전면 베젤이 어우러져 작지만 아주 예쁜 이미지를 완성하고 있다.

    ▲ 전면 디자인

    성인 남성이라면 손바닥 위에 올려놓아도 별다른 거부감을 느끼기 힘들만큼 작고 가벼운 시스템이 완성 됐다. 설치에 공간이 거의 필요치 않고 어디에 놓아도 잘 어울릴 만큼 작고 예쁘다.

    ▲ Sandra2007 CPU Benchmark

    Sandra2007을 이용한 CPU 벤치마크의 결과는 다소 실망스럽다. 불과 1GHz로 동작하는 CPU 이기에 더 많은 것을 바라긴 어렵겠지만 산술적인 수치로 계산돼 나오는 결과 값은 멀티미디어 PC로 활용하기에 다소 부족한 것이 아닐까 하는 생각이 들게 한다.

    물론 빠른 메모리, 또는 빠른 HDD를 장착해 준다면 부족한 부분은 어느 정도 상쇄될 수 있겠지만, 이 역시 가격과 직접적으로 연결되는 부분이기에 가능하면 조금 더 빠른 CPU의 능력은 다소 아쉬운 것이 사실이다.
    하지만 이는 단순한 계산일 뿐 실제 웹서핑이나 문서작업, 오피스 등의 어플리케이션의 구동 시는 최신의 시스템과 별 차이를 느끼지 못할 만큼 쾌적한 작업이 가능하다. 고사양이 반드시 필요한 분야라면 분명 부족하지만 일반적인 작업에는 충분한 성능을 보여준다.

    ▲ 동영상 테스트

    그렇다면 동영상은 어떨까? CPU 벤치마크의 결과는 안정적으로 DVD를 구동하거나, 고화질, 고압축으로 대변되는 MPEG4 계열 동영상의 압축을 실시간으로 풀어내기에 다소 부족해 보이는 것이 사실이다.

    하지만 이 부분은 VIA 역시도 염두에 두었던지 근사한 방식으로 이를 해결해 놓고 있었다. Nano-ITX에 내장된 UniChrome Pro IGP는 하드웨어 방식의 MPEG-2 디코더와 MPEG-4 가속기를 내장하고 있어 CPU의 힘을 빌지 않고도 동영상의 처리가 가능하다.

    테스트를 위해 소지하고 있는 Athlon FX60 기반의 시스템과 비교해 보아도 아무런 차이가 없는 수준의 부드러운 재생, 탐색이 가능해 동영상의 재생 중에는 불과 1GHz 기반의 시스템이란 것이 믿기지 않을 정도였다. 여기에 지금은 잊혀진 이름이지만 S3의 그래픽이 보여주던 동영상을 다시금 강상할 수 있다는 것도 묘한 감흥을 불러온다.

    5.방안에 두기엔 너무 예쁜 시스템

     어떤 제품이든 품질이 일정 수준에 이르고 제품이 평준화되면 그 뒤를 잇는 새로운 트렌드는 바로 '소형화' 였다는 점은 주지할 만 하다. 이런 점에서 볼 때 한 발 앞서 다른 경쟁사들이 구현하지 못했던 소형 플랫폼을 선보인 VIA의 저력은 인정해 줄만 하다.

    제품을 구입함에 있어 대개는 어디에 쓸 제품인지를 결정하고 그에 맞는 제품을 구매하는 것이 일반적이지만, 때로는 어떤 매력에 이끌려 일단 구입한 후 차후에 활용 방안을 고심하는 경우가 있다. 이런 제품들의 공통점은 바로 시장에서 쉽게 찾아보기 힘든 아주 독특하고 개성 넘치는 제품이란 점일 것이다.
    VIA의 EPIA시리즈, 특히 Nano-ITX 시리즈가 바로 그런 제품이 될 가능성이 엿보인다. 성능상으론 다소 부족하지만 이 역시 고성능을 원하는 유저들에게나 해당되는 사항이고, 일반적인 작업에는 부족함이 없는 성능에 너무 예쁜 외형, 그리고 믿을 수 없는 크기라는 큰 장점이 있다.

    물론 이런 극단적인 소형화가 가져오는 부작용 역시 무시할 순 없다. 먼저 일반적인 ATX, 또는 Micro-ATX에 비해서도 기능 확장이 자유롭지 못하다는 치명적인 결점은 수시로 하드웨어를 교체하고, 새로운 제품이 출시되면 반드시 써보아야 직성이 풀리는 하드웨어 마니아 들에게는 관심의 밖일 수 밖에 없다.

    또한 부족한 성능 역시 발목을 잡을 수 밖에 없다. 그저 오피스 작업이나 웹서핑 용도로 시스템을 사용하는 유저들까지 각종 벤치마크의 점수놀음에 발목이 묶여 있는 것이 현실이고, 이런 수치화된 성능지표에 유난히 민감한 국내 소비자들에겐 작은 것 외에, 예쁘다는 것 외에 이 제품이 가진 시스템으로서의 성능이 어떻게 평가될지는 너무도 명확하다.

    하지만 어떤 유저들에겐 작다는 것이, 또 이렇게 예쁘다는 것이 큰 장점이자 매력이 될 수도 있다. 충분한 용량의 메모리와 적당한 수준의 HDD만 함께 구비된다면 일반적인 용도로 사용하기에 하등의 부족함이 없는 수준의 성능은 낼 수 있고, 하드웨어 방식의 DVD/MPEG4 처리는 거실에 두고 온 가족이 함께 사용할 플레이어로서의 역할 부여에도 긍정적이다.

    빠른 시스템을 원하거나 게임을 즐기길 원하는 유저들에겐 애초에 무리인 시스템일 수 밖에 없지만, 반대로 작고 예쁘며 다양한 활용을 염두에 두고 있는 유저들이라면 주목해 볼 만 하다.

    # by 제갈장비 | 2006/09/11 16:25 | 문서-EDPS | 트랙백 | 덧글(0)
    2006년 09월 11일
    USB의 기초 - 일반사항
    출처 : 네이버 지식인

    1. USB란 무엇?

    USB란 Universal Serial Bus의 약어이다.

    CTI (Computer Telephony Integration)산업의 성장을 위하여 상호접속 (Interconnection)을 위한 간단한 방식을 제공하기 위하여 개발된 보편적 버스 규격이라고 할 수 있다.



    2. 누가 만들었는가?

    인텔, 마이크로소프트, 컴팩, IBM, NEC, DEC, Nortel 등

    정보통신의 선두 7개 업체가 협의하여 개발하였으며, 진정한 플러그 앤 플레이 (PnP)를 위한 PC 주변장치의 Bus 규격으로서, 새로운 주변기기가 접속되었을 때 재부팅이나 셋업 과정 없이 자동인식으로 최대 127개의 장치를 연결할 수 있을 뿐더러 데이터 전송속도도 빠르게 향상된 것이다.



    3. USB의 Plug와 USB Port의 모양은?

    *) 셀러론이나 펜티어II 이상의 PC는 100% 가지고 있다고 보시면 됩니다.

    *) 최근 제조되는 PC는 주로 앞쪽에도 USB포트를 배치하고 있다.



    4. 한번에 연결할 수 있는 주변기기 수는?

    기술적으론 127개의 독립된 주변기기를 붙일 수 있다.

    하지만, 일부 주변기기는 USB 대역을 확보해야 하므로 실질적 연결은 이보다 적다.



    USB 인터페이스의 역사

    USB는 CTI(컴퓨터와 전화의 통합)라고 알려진, 컴퓨터와 전화기를 통합하기 위한 간단한 방식을 제공하기 위하여 컴팩, DEC, IBM, 인텔, 마이크로소프트,NEC, Nortel의 7개 회사에 의해 개발된 보편적 버스 규격이라고 할 수 있다. 이 규약이 발전하여, PC에서 최대 127개의 주변 장치들을 쉽게 통합시키기 위한 개념으로 확장되어 USB1.0 규격으로 발표된 것이다. 이 규격에서 USB 기술에 대한 다음과 같은 주요한 목표를 갖게 된다. (USB의 홈페이지. www.usb.org )

    우선 PC주변장치 확장의 쉬운 사용과 12Mbps의 전송을 지원하는 저가격의 해결책을 제시하고자 했으며, 음성과 압축된 비디오에 대한 실시간 데이터에 대한 완벽한 지원. 혼합된 모드의 동기 데이터전송과 비동기 메시지에 대한 규약상의 유연성과 유용한 장치기술에서의 통합성 그리고 다양한 PC구성과 형태요소의 이해, 제품으로의 빠른 확산을 가능케 하는 표준환경을 제공하고 PC성능을 증가시키는 새로운 장치의 개발 등이었다.



    이러한 목표로 인하여 결국 USB는 master/slave 개념과 호스트와 각 주변장치간의 직접적인 연결이나 허브를 통한 연결 하에서 작용하게 되었으며, 이는 기본적으로 시리얼버스 즉, 직렬버스 형태로 구성된다. 하지만 이는 우리가 PC에서 사용하는, 기본적인 RS-232 시리얼 환경과 혼동되는 것이 아니며, PCI 버스를 대체하는 것도 아니라는 점에 유의해야 한다.

    첫 목표였던 PC주변장치 확장의 쉬운 사용은, USB의 중요한 특색중의 하나로 컴퓨터의

    케이스를 여는 수고를 덜어주는 진정한 플러그앤플레이 개념을 사용하는 호스트 PC에

    주변장치를 쉽게 연결하거나 구성할 수 있게 된 것이다.



    이로 인하여. 모든 연결되는 주변장치들은 호스트상의 직접적인 USB포트나 USB허브장치를 통해서 외부적으로 연결될 수 있으며, 이러한 주변장치들을 사용할 수 있도록 12Mbps의 Full speed와 1.5Mbps의 low speed를 가지게 되었다.



    이러한 USB 규격과 관련하여, 1994년 7개의 USB Core 회사들이 뭉쳐, 1995년 WinHEC

    (Windows Hardware Engineering Conference)와 USB-IF(USB implementers Forum)를 결성하였다.

    그 첫 성과로 1996년 1월15일 USB 1.0 규약이 발표되었으며, USB 첫 제품들이 컴덱스에 소개 되기에 이르렀다. 그러던 것이 1.0 규약의 문제점들을 해결하고 실제 사용할 수 있는 주변 장치들을 위해 1998년 9월 23일 USB 1.1 규약이 다시 발표되었다.



    이러한 USB 1.1 규약의 발표로 인하여 비로소 USB포트를 지원하는 칩셋들이 인텔이나 VIA, SiS, ALi 등과 같은 회사에서 출시되었고, 마더보드에 기본적으로 장착되기 시작했다. 하지만, 이러한 하드웨어상의 진전을 MS사의 윈도우가 지원하지 못하여 여러 가지 문제점을 낳았고, 윈도우95의 OSR 2.1에서 비로소 제대로 지원이 되기 시작했다. 그러나 좀 더 현실적으로 보면 윈도우98에서 부터 지원되었다고 보아야 하며, 윈도우98도 SE 버전에서 USB 주변장치들의 드라이버를 포함하는 주요한 버전업이 이루어져, 현재에 이르고 있다.





    USB의 장점

    USB가 널리 사용되고 있는 실질적인 장점은 사용이 편리하고 속도가 빠르다는 것이다.

    또한 USB 주변기기는 부피와 무게가 작기 때문에 휴대가 간편하다는 이유로 USB 주변기기의 인기를 뒷받침하고 있다. 그런 이유로 노트북용 주변기기 중 상당수가 USB 인터페이스로 개발되고 있다. USB의 실질적인 장점을 살펴본다.



    1.핫 플러그 지원

    USB 주변기기는 핫플러그와 PnP 기능을 지원한다. 핫플러그 지원으로 컴퓨터에 전원이 켜져 있는 상태에서도 바로 연결할 수 있다. 기존의 주변기기는 주로 컴퓨터에 전원이 꺼져 있을 때 연결해야 했다. USB는 컴퓨터에 전원이 켜져 있는 상태에서 연결하면 바로 PnP 기능이 동작하여 자동으로 인식을 한다. 다른 장치의 경우에는 컴퓨터 전원을 껐다가 다시 켜야만 인식되지만 USB 주변기기는 연결 즉시 바로 인식된다. 그만큼 설치하기도 편리하고 사용하기도 편리하다.



    2.포트의 크기가 작고 127개의 주변기기 지원

    USB 주변기기를 연결할 수 있는 포트는 메인보드에서 제공된다. 초기에는 2개의 포트가 제공되는 것이 일반적이었으나, USB를 이용한 주변기기가 많아지면서 최근에는 4개의 포트를 지원하는 것이 일반적이다. 또 USB 허브라는 장치를 이용하면 포트를 여러 개로 확장 할 수 있어 편리하다. 최대 127개까지의 주변장치를 연결할 수 있다고는 하지만, 실제로 127개가 모두 한번에 연결되는 것은 아니고, 한허브등을 이용해야 하므로 실제는 이보다 적은수가 연결된다.



    3. 속도가 빠르며 커넥터가 작다.

    USB 주변기기는 속도가 빠르다. USB Version 1.1의 경우는 최대 12Mbps의 속도를, USB Version 2.0의 경우는 최대 480Mbps의 속도를 지원하므로 ZIP 드라이브와 같은 저장 매체에 사용되기 적합하다.

    V1.1의 경우는 실제로는 12Mbps의 속도가 지원되지는 않으므로 하드디스크나 CD-R 등을 연결하기에는 적합하지 않다. 그럼에도 불구하고 패러렐, 시리얼 포트보다는 속도가 빠르고 크기가 작다. 포트의 크기가 작기 때문에 USB 장치의 크기도 더불어 작아 휴대하기 편리하다는 장점을 가진다. V2.0의 경우는 빨라진 속도의 경우로 인하여 휴대형 저장장치 및 디지털카메라등 미디어 기기에도 널리 확장되어 사용된다.



    4. 세계적인 표준규격

    USB는 이와 같은 다양한 장점으로 인하여 세계적인 표준 규격으로 정해진지 오래이다.

    최근에 생산되는 메인보드나 주변기기는 USB 인터페이스를 지원하는 경우가 많다.

    신규로 생산되는 PC의 100%가 USB포트를 가지고 있다고 봐도 무리가 없다.



    5. 확장성 좋은 케이블

    SCSI 인터페이스가 여러 가지 장점을 갖고 있지만 실제로 SCSI 인터페이스에 여러 가지 주변장치들을 사용할 때에는 유의해야 할 점이 있다. 바로 케이블 문제이다. 최근 사용되는 울트라 와이드(Ultra Wide) SCSI의 경우 외장형으로 사용할 때 제한되는 케이블의 길이는 1.5m이다. 더욱이 케이블의 두께도 만만치 않다. USB의 케이블은 키보드나 마우스 케이블 굵기 정도밖에 되지 않으며, USB는 기본적으로 전원을 공급 할 수 있도록 되어 있다.



    6. 전원공급 기능 활용

    각 Port당 500mA의 전원을 공급할 수 있다. 저전력을 사용하는 장치들은 별도의 전원을 공급받을 필요가 없다.





    USB를 지원하는 주변기기 1

    USB의 장점과 세계적인 표준으로 인하여 최근에는 다양한 종류의 USB 주변기기가 생산되고 있다.



    < USB 통신장치 >



    USB 방식의 통신장치로는 모뎀이 대표적이다. 본래 모뎀은 ISA, PCI 방식을 사용한다. 단 이러한 모뎀은 내장형으로서, 외장형 방식의 모뎀으로는 시리얼 방식과 PCMCIA 방식이 있다. 최근에는 여기에 덧붙여 USB 방식이 있다. USB 모뎀은 휴대가 간편하고 별도의 전원 어댑터가 필요 없다는 장점이 있다. 물론 연결방법도 쉽다. 그 외의 통신장치로는 USB 허브와 USB 케이블이 있다.

    허브는 USB 포트를 여러 개로 확장시켜주는 것이며 케이블은 두 대의 PC를 연결해주는 장치이다.

    USB 케이블을 이용하면 별도의 랜카드 없이도 두 PC를 서로 연결하여 네트워킹을 할 수 있다.

    또 최근에는 USB 랜카드도 선을 보이고 있다.



    < USB 입력장치 >



    키보드, 마우스, 조이스틱 등의 장치는 USB를 사용하는 장치로서 가장 이상적이다. 이들 장치는 별 도로 드라이버를 설치하지 않아도 바로 연결만 하면 사용이 가능하다. 또한 키보드, 마우스의 경우에는 PS/2 포트 에 연결된 키보드, 마우스와 함께 사용이 가능하다. 또 조이스틱의 경우에는 여러 개의 조이스틱을 연결해서도 사용 할 수 있다. 본래 조이스틱은 사운드 카드에서 제공되는 조이스틱 포트에 연결하며 물론 포트가 한 개이기 때문에 한 대의 조이스틱만 연결할 수 있다.

    그러나 USB 조이스틱을 사용하면 여러 개를 동시에 연결해 사용할 수 있다.



    < USB 저장장치 >



    빠른 USB의 전송 속도로 인하여 USB 방식의 저장장치도 늘어가고 있다. CD-R, 하드디스크, ZIP 드라이브, 슈퍼디스크, 스마트 미디어 등이 USB 방식으로 제공되고 있다. 단 하드디스크의 경우에는 USB 전용 하 드디스크가 출시되는 것이 아니라 EIDE 하드디스크를 외장형 하드디스크 케이스에 장착하여 USB로 변환시켜주는 장치가 사용되고 있다. CD-R은 USB의 전송속도 한계로 인하여 4배속이 최대 한계이나, 상당히 안정적이라 평가받 고 있다. CD-R을 휴대하며 여러 컴퓨터에 장착하면서 사용해야 한다면 적당하다. ZIP 등의 저장매체는 USB로서는 훌륭한 선택이지만 가격이 다른 인터페이스에 비해 비싸다는 단점을 가진다.



    < USB 멀티미디어기기 >



    USB를 지원하는 멀티미디어 기기로는 TV 수신장치, 스피커, 동영상 캡쳐 카드 등이 있다.

    사운드 카드도 USB 인터페이스로 출시되고 있다. 이러한 장치들의 장점은 음질이나 화질의 손실이 없다는 점이다. PCI 사운드카드의 경우에는 PC 내부의 여러 장치들로 인하여 노이즈가 생겨 음질이 떨어진다. 반면 USB 사운드카 드는 외부에서 케이블로 연결되므로 노이즈와 음질 저하가 없다. USB 방식의 라디오나 TV 수신카드도 역시 화질이 나 음질 저하가 없다. 이러한 장치들은 주로 노트북용으로 적합하며 휴대해면서 사용하기에도 적당하다





    USB 기초 - 속도 정의 및 USB 허브

    1. USB 전송속도 정의



    USB 2.0이 등장하면서 최대 전송속도는 480Mbps로 향상이 됐지만 버스 속도와 실제 디바이스가 데이터를 전송하는 속도는 달라지게 된다. USB 호스트는 각기 다른 디바이스들이 사용하는 파이프의 대역폭을 관리하는데 4가지(isochronous, interrupt, bulk, control )의 데이터 전송모드가 있다.

    전송속도는 크게 데이터를 전송하게 되는 버스가 얼마나 바쁜지(Busy, Idle)와 4가지 전송 모드 중 어떤 모드가 사용되고 있느냐에 따라 달라진다. 가장 최상의 상태는 bulk 고속 전송 모드로 약 99%의 대역폭을 사용해 초당 53MB의 속도로 데이터를 전송할 수 있다.



    저속모드(Low-Speed) : 1.5Mbps

    키보드, 마우스, 조이스틱등의 대화형 디바이스에 사용되며 초당 10∼100Kbit/sec의 전송 속도를 가진다. 평균적으로 저속모드는 1.5Mbps의 전송 속도를 가진다.



    풀모드(Full-Speed) : 12Mbps

    전화, 오디오, 비디오 압축 분야에 사용되며, 초당 500Kbit∼10Mbit의 전송속도를 가진다. 평균적으로 풀모드는 12Mbps로 주로 하드디스크, CD-ROM/ CD-RW, ZIP drive, 스캐너, 프린터등에 사용한다.



    고속모드(High-Speed) : 480Mbps

    높은 대역폭이 필요한 비디오, 네트워크 및 저장 장치 분야에서 주로 사용되며 25∼480Mbps의 전송 속도를 갖는다. 기존 Full-Speed로 사용하던 CD-ROM/ CD-RW, ZIP drive, 스캐너, 프린터등의 분야에도 널리 사용될것으로 본다.





    2. USB 포트/허브 참고사항 / 이용시 주의사항

    허브라는 장치는 하나의 포트를 여러개로 확장 시켜주는 역할을 한다.

    USB 포트의 특징 중 하나가 별도의 전원 연결 없이 USB 포트에서 전원을 공급 받는다는 것이다.

    한개의 USB Port에서 5V/500mA의 전원을 주변장치로 공급해 줄 수 있다. 컴퓨터 주변기기 중 많은 장치가 500mA 이하의 적은 전력으로도 동작이 가능하다. 따라서 한개의 USB포트에 USB허브를 연결해서 확장하여 다수의 주변기기를 사용할 수 있다.

    하지만 여러개의 주변장치를 HUB에 연결해서 사용할 경우 사용전류가 500mA이상으로 커지게 될경우 주변기기가 정상적으로 동작하지 않을 수도 있다.



    일반적인 데스크탑 PC의 경우는 최대 약 600~700mA의 전류까지도 공급할 수 있도록 500mA보다 충분히 크게 설계되어 있습니다. 하지만 USB규격에 맞추어 500mA만 보장을 합니다. 그러므로 설계치보다 큰전류를 장시간 사용하게 되면 PC의 USB 포트가 손상을 입을 수 있습니다.



    실제 사용시 이점을 유의하시어 사용하시기 바랍니다.

    다량의 전류를 소모하는 주변기를 USB허브에 장착해서 사용하게될 경우는 전원 아답터가 별도로 부착된 모델을 사용하면 이 문제를 해결할 수 있습니다.





    USB(Universal Serial Bus) 2.0 이란?



    직렬버스로 최대 480Mbps까지 데이터를 전송할 수 있는 규격이다.

    기존에 사용하던 USB 1.1 비해 상당한 성능향상이 있고, USB 1.1 장치들과 forward, backward 호환성을 유지하며 USB 1.1에 있던 Plug & Play 기능, 드라이버 자동 설치, 전원 관리 기능 등은 그대로 유지하고 있다. 즉 기존에 사용하던 USB 1.1 장치들을 수정 없이 그대로 USB 2.0환경에서 사용할 수 있다.



    1. USB2.0의 장점

    USB1.1은 low speed 모드로 1.5Mbps, full speed 모드로 12Mbps를 지원한다., USB2.0은 low speed 모드와 full speed 모드를 지원하면서, 40배 빠른 최대 480Mbps를 지원하는 high speed 모드가 제공된다. 주요한 응용으로는 이러한 큰 밴드 폭을 필요로 하는 외장 저장장치, 고속 통신 망, 칼라 프린터, 스캐너 등에 사용된다. 또한 USB2.0은 USB1.1에 비해 성능이 향상 되었을 뿐 아니라 USB1.1 장치들과 forward 호환성과 backward 호환성을 제공하는 장점이 있다. 따라서 기존의 USB1.1 환경에서도 USB2.0 디바이스가 그대로 동작이 된다.



    2. USB2.0의 실제 전송 속도

    버스 스피드와 실제 디바이스(장치)가 데이터를 전송하는 속도는 다르다. 전송속도(Data transfer rate)는 버스가 얼마나 바쁘냐(busy), 4가지 전송 모드 중 어떤 모드가 사용되고 있느냐에 달려있다. 최상의 상태는 high speed bulk transfer 모드로 약 90%의 버스 폭(Bandwidth)를 사용하여 53Mbyte/sec의 속도로 데이터를 전송할 수 있다.



    3. USB 1.1과 USB 2.0의 전송 속도

    기존의 USB 1.1은 low speed (1.5Mbps)와 full speed(12Mbps) 2가지 모드가 있으나 USB 2.0에서는 앞의 2가지 모드 외에 high speed(480Mbps)가 추가 되었다.



    4. USB1.1 장치들을 USB2.0 장치들과 공용 가능한지?

    USB2.0은 USB 1.1과 backward 호환성이 된다. 따라서 모든 USB1.1 장치들은 USB2.0장치들과 같이 사용할 수 있으나 USB 1.1 장치로서 동작된다.



    5. USB2.0 장치를 USB1.1 host controller에 사용 가능한지?

    USB2.0은 USB1.1과 forward 호환성이 된다. 따라서 USB1.1 host controller에 USB2.0장치를 연결하여 사용할 수 있으나, USB2.0의 장점인 최대 480Mbps의 속도는 낼 수 없다.



    6. USB2.0 Ready라고 표시된 제품은?

    디바이스는 USB2.0을 지원하나 OS가 아직 USB2.0 드라이버를 지원하지 않는 경우에 USB2.0 Ready라고 제품에 표시하고 있다.



    7. USB2.0 High Speed 모드로 동작하려면 무엇이 필요한가?

    호스트 콘트롤러가 USB2.0을 지원해야 한다(EHCI즉 Enhanced Host Controller Interface 지원). PC본체에 내장 되었거나 별도로 PCI card 또는 Card bus(노트북 경우)로 설치하여야 함.

    호스트 콘트롤러에 사용하는 OS의 USB2.0용 드라이버가 있어야 함.

    USB2.0허브를 사용할 경우는 USB2.0용 허브 드라이버가 있거나 OS에서 지원 되어야 함.

    USB2.0 High Speed를 지원하는 장치가 연결되어야 함.

    이상의 어느 하나가 만족 되지 않아도 USB2.0 high speed 모드에서 사용할 수 없다. 허브를 사용하지 않을 경우는 참고로 지원하고 있는 OS 환경으로는 Windows 98SE, Windows ME, Windows 2000, Windows XP이나 제품을 공급하는 제조사 마다 지원하는 OS가 다르다. 제품을 구입시 지원 OS를 필히 확인할 필요가 있으며 대부분 Windows 95, Windows NT는 지원하지 않는다. Mac의 경우는 Mac OS X에서는 USB2.0을 지원하나 Mac OS 8.6과 9.x의 환경에서는 USB2.0 디바이스가 USB1.1로만 동작된다.



    8. USB1.1 케이블을 USB2.0 환경에서 사용할 수 있는지?

    규격상으로는 동일하나 기존에 발매된 많은 케이블들은 USB1.1규격을 제대로 만족하는 케이블이 아니므로 기존의 USB1.1용 케이블을 USB2.0의 High speed에서 사용할 경우에는 조심 하여야 한다.



    9. USB1.1 장치들이 USB2.0환경에서 성능이 향상 되는지?

    USB1.1장치들은 USB2.0환경에서 480Mbps로 동작하지는 않고 USB 1.1장치로서 동작된다. USB1.1장치와 USB2.0 장치들은 서로 혼재 되어 사용할 수 있으나 USB2.0 host controller나 USB2.0 hub에 USB2.0 장치를 연결할 경우만 USB2.0의 성능을 얻을 수 있다.



    10. USB2.0과 IEEE1394와 비교

    IEEE1394(Firewire. iLink)는 최대 400Mbps의 속도이고, IEEE1394b는 3.2Gbps의 이다. 어떤 주변기기는 양쪽의 어느 인터페이스를 사용할 수 있으나 두개의 버스는 서로 다른 목적으로 만들어 졌다. USB에서는 호스트가 모든 전송을 시작하고, 모든 전송은 하나의 목적지를 갖는다.

    IEEE1394는 주변기기들이 각각 서로 직접 통신을 할 수 있고 여러 개의 목적지를 가질 수 있다.



    11. USB2.0장치에 필요한 요소들

    모든 USB 주변기기들은 버스의 통신을 관리하기 위하여 콘트롤러 칩과 Firmware가 필요하다. 또한 각 주변기기들은 low level드라이버와 application간에 통신을 관리하기 위한 device driver를 갖고 있어야 한다. USB2.0을 지원하는 호스트 컴퓨터는 호스트 컨트롤러 하드웨어와 OS와 함께 제공되는 소프트웨어 드라이버를 갖고 있어야 하나, 내장된(built-in) 드라이버로 동작되지 않는 장치는 자체 드라이버를 제공하여야 한다.





    USB 케이블 길이에 대해서

    USB 케이블의 길이에 대하여



    USB 표준에서 정의하는 Host 인 PC와 주변장치간의 최대 길이는 5M 입니다.

    5M이상인 경우 주변장치의 종류나 제조사에 따라서 동작하지 않는 경우도 많습니다. 표준에서 보장하는길이가 5M이므로 5M 이상에서 동작하지 않았다고 해서 케이블이나 주변장치가 불량이라고 볼수는 없습니다. 동작을 해도 속도가 저하되거나 중간에 이상동작을 하는 경우가 발생할 수 도 있습니다.

    갖고 있는 주변장치가 5M 이상에서 정상적으로 동작하는지 안하는지는 대부분 직접 자신의 PC에 연결해서 시험해 보는 수밖에 없습니다. 제가 시험할때 보면 PC에 따라서도 될수도 있고 않되는 경우도 있었습니다.



    이 길이를 확장해주는 제품으로 "USB 리피터"라는 것이 있습니다. 5M마다 신호나 전원을 다시 중계해서 증폭해주는 역할을 한다고 보시면 됩니다. 하지만 이또한 가격이 2만원 정도이기 때문에 권할만 것이 못됩니다. 부득이 5M 이상에서도 사용하기 위해서는 적용할 수도 있겠지만, 제가 볼때는, 그렇게 먼거리에 있는 주변장치를 사용할 목적이라면 USB 방식이 아닌 다른 버스방식을 고려하는 것이 오히려 더 바람직한 방법이라고 보여집니다.



    특별히 긴 거리에 있는 장치를 사용하기 위하여 광케이블을 이용해서 대략 40m 까지 가능한 제품도 나왔있다고는 합니다.

    국내업체가 직접 개발한 것은 아니고, 외국업체인 것으로 압니다.

    www.usb.org에 가셔서 검색해 보시면 나와 있습니다.

    하지만 제 생각으로는 권할 만 한 것이 못됩니다.

    위 에서도 설명했다시피 차라리 랜케이블을 이용한 다른 방법등을 고려하시는게

    오히려 안정적이라고 보여집니다.

    물론 어쩔수 없이 USB를 써야할 경우에는 할 수 없지만요...

    직접 USB 케이블을 구입해서 직접 거리별로 테스트를 해보시는 방법밖에 없습니다.



    매월 수천, 수만개이상 대량으로 필요한 경우라면 직접 케이블 안의 구조를 바꿔가면서

    시험해가면서 직접 케이블 사양을 개발해서 사용해야 겠지요.

    (쉴드나, 케이블 심선 굵기, Pair로 된 데이터선의 단위길이당 꼬는 횟수등등...)





    USB 2.0 과 1.1 구별 방법

    아래 사진은 USB 2.0카드를 장착한 후의 장치관리자 내용을 나타낸것입니다.

    (제품은 VIA Chip을 사용한 것입니다.)



    제어판 시스템에서 보면 유니버설 직렬 버스 (USB) 컨트롤러 세부 항목중에 맨아래

    "USB 2.0 Enhanced Host Controller" 라고 된 항목이 있으면 이 PC는 USB 2.0을 지원하는 것입니다.

    그냥 일반인들이 보는 포트 모양은 동일합니다.

    USB 케이블의 경우에는 특별히 케이블에 USB Version 2.0 이라고 인쇄되어 있는 제품들이 있습니다.

    # by 제갈장비 | 2006/09/11 12:17 | 문서-EDPS | 트랙백 | 덧글(0)
    2006년 09월 11일
    BUS 구조의 모든것

    출처 : http://www.zuno.co.kr/post-bus.htm

    <BUS 구조의 모든것>

    배경

       어떻게 보면 IBM PC의 시스템 버스가 오늘날과 같은 PC의 전성기가 있기까지

    가장 중요한 역할을 했다고 말해도 과언이 아니다.

     

    제아무리 CPU 칩이 발전을 거듭하고 높은 용량의 메모리가 나타난다고 해도

    표준화된 규격이 있지 않으면 컴퓨터는 일정한 범주를 벗어나지 못한다.

    또한 어떤 규격이 있다고 해도 그것이 기술적으로 완전히 개방되어 있지 않거나,

    혹은 기술적으로 문제가 많거나, 또는 가능한 많은 업체들이 지원을 하지 않는다면

    충분한 발전을 하지 못하는 것은 당연한 일이다. 

     

    PC는 이러한 조건들을 모두 만족시킴으로써 PC의 대중화를 이룩할 수 있었다.

    우선 IBM이라는 강력한 배경을 가지고 있었기 때문에 기본적으로 많은 수의 시스템이 생산되어

    도처에 설치될 수 있었고 다른 기업들도 어차피 그에 따라갈 수 밖에 없었다.

    그리고 적어도 그 당시로서는 PC의 시스템 버스는 아주 훌륭한 최신 기술을 이용하여 개발된 것이었기 때문에

    당연히 고성능을 추구하는 사용자들은 자연히 PC를 선호하게되었다.

     

    한편으로는 IBM은 PC의 모든 하드웨어를(심지어는 ROM BIOS 까지도) 상세하게 분석한 매뉴얼까지도

    완전 공개하여 어느 하드웨어 업체든지 PC에서 사용되는 확장 보드를 맘대로 만들 수 있었다.

     

    그리고 그들 업체들은 특허료를 지불할 필요도 없었다. 

    한편으로는 PC의 확장 보드라는 것은 마치 마법상자와도 같은 것이어서

    일단 마더보드에 CPU와 시스템 제어 기능, 그리고 기본 메모리만 갖추고 있는 상태에서

    사용자는 얼마든지 시스템을 확장하고 자신이 원하는 주변기기를 설치할 수 있게 되었는데

    이 점은 상당한 장점이 되었다.

       비록 애플 컴퓨터도 확장 슬롯을 가지고 있기는 했지만 그것은 비교적 제한적인 특징을 가지고 있었기 때문에

    별로 비교할만한 정도가 되지  않았다.

    또한 매킨토시의 버스는 오히려 그보다도 더 제한된 특징을 가지고 있다.

     

    아뭏든 이런 점들로 인해서 PC가 오늘날같은 정도로 발전하게 된 것이다. 

    만약 비디오 카드를 확장 보드에 설치하지 않고 처음부터 메인보드 상에 내장되어 있게된다면

    초기에 CGA를 사용하던 사람이 나중에 EGA를 사용하고자 한다면 새로 컴퓨터를 사야하는 것이 된다.

    물론 이런 점 때문에 아예 그래픽 카드를 만드는 회사들이 나타나지도 않았을 것이다.

    이러한 확장성 때문에 수많은 보드 업체들이 생겨나고 그러면서 PC는 폭 넓은 기반을 가질 수 있었던 것이다.

     

     

    ISA 버스

     

       1981년에 PC가 첫선을 보인 이후로 1984년에 80286 마이크로프로세서를 사용한 AT가 개발되었을 때에는

    한번의 대수술이 있기는 했었다.

     

    즉, 그때까지는 단지 8 비트의 데이타만 전송가능하고 1 메가 바이트의 메모리만 사용가능하던

    62 핀짜리 확장 슬롯에 다시 36 핀짜리 커넥터를 추가해서 16 비트의 데이타 전송과 16 메가 바이트 영역의

    어드레스를 사용 가능하게 만들었다.

     

    그리고  그때까지의 XT의 시스템 버스 클럭은 8088 마이크로프로세서와 똑같이 4.77MHz의 속도이었는데

    AT가 80286을 사용하게 되면서 그 클럭 속도인 6MHz 혹은 8MHz의 속도가 되도록 변경되었다.

     

    오늘날 우리가 흔히 AT-BUS, 혹은 ISA(Industry Standard Architecutre)라고 부르는 것이

    바로 이 버스를 말하는 것이다.

     

    그러나 그것은 근본적인 변화는 아니었다.

    시스템 버스의 체계를 변화시킨 것이 아니라

    단지 확장 버스의 클럭을 약간 증가시키고

    어드레스 및 데이타 버스의 폭을 늘린 것

    이외에는 별다른 내용이 없었다.

     

    그 이후로 모든 PC는 계속 변화하는데도 시스템 버스는 거의 변화없이 그대로 유지되어왔다.

    버스 클럭도 8MHz가 거의 표준화되다시피 한 상태로였다.

    80286 마이크로프로세서의 클럭 속도는 점점 늘어나서 최고 25MHz 버전까지 나타났고,

    그 뒤로 80386과 80486 칩이 나타났어도 아직까지 이 버스는 이제까지 계속 그래왔듯이

    변화를 보이지 않은 채로 버젓이 사용되고 있는 것이다. 

     

    한편으로는 각종 마더 보드용 칩셋 회사들은 자사의 칩셋에 확장 슬롯의 클럭 속도를 제어할 수 있는 기능을

    내장하기 시작했다.

    386 급 이상의 PC에서 시스템 셋업(System  Setup)을 해 본 사람이면 봤을지도 모르겠지만,

    CPU의 클럭을 그대로, 또는 1/2로 나눈 값이나 혹은 1/3, 1/4로 나눈 값을

    확장 슬롯의 클럭 주파수로 설정할 수 있는 기능이 그것이다.

    가령 자신이 사용하는 PC가 40MHz 클럭의 386이 내장된 것이라면

    시스템 클럭의 1/2인 20MHz의 주파수를 확장 슬롯의 주파수로도 쓸 수 있는 것이다.

    하지만 어떻게 자신의 컴퓨터에 있는 모든 확장 보드들이 그 클럭 주파수에 다 정상동작을 하리라고 자신하겠는가.

    일반 사용자라면 이런것으로 인해 문제가 생길지도 모르기 때문에 표준형으로 가는 것은 당연하다.

    결국 이 글을 쓰고 있는 이 시점에 이르기까지 10MHz 이상의 시스템 버스 클럭을 사용하는 경우는

    거의 없게 된 것이다. 

    25MHz를 넘어서 33MHz, 50MHz, 66MHz, 그리고 그 이상의 마이크로프로세서도 나타난 이 시점에

    10MHz 이하 속도의 확장버스라는 것은 도대체가 말이 안된다.

    더구나 AT 버스는 16비트라는 한계에 묶여있으니 32비트 CPU들과는 제대로 궁합이 맞지 않는 것이 당연하다.

    계산해보면 2(바이트)  x 8 (MHz) = 16MB/s, 즉 초당 16 메가 바이트의 데이타밖에는 전송하지 못하는 것이다. 33MHz짜리 386이라면 최대로 성능을 발휘할 때를 생각할 때 4  x 33 = 132,

    즉 초당 132 메가 바이트의 전송을 할 수 있는데도 말이다. 

     

    이처럼 문제는 특히 이제까지 쌓여온 수많은 확장 보드들 때문인 것이다.

    만약 이와 다른 버스 규격이 나타난다고 하면 누가 그 버스를 가진 PC를 구입하겠으며

    또 누가 그 버스를 위한 확장 보드를 개발하려 하겠는가.

    아직까지 별다른 큰 문제없이 잘 사용되고 있는 ISA 체계를 함부로 건드릴 존재는 없었던 것이다.

    단지 IBM이라는 거인 이외에는...

     

     

    MCA 와 EISA

     

    PC의 창조자인 IBM은 당연히 이 시스템 버스에  대한 문제를 미리부터 인식하고 있었다.

    그렇지 않아도 자신이 만들어낸 PC 시장에서 내부 구조를 완전히 공개하여

    초기에는 성공적으로 시장을 점유할 수 있었으나 그 후로 수많은 호환기종 업체들에 의해서

    많은 부분을 잠식당해 왔던  IBM은 1987년 들어 PS/2를 발표하면서 기존의 AT 타입의 PC는

    아예 생산을 중지해 버렸다.

     

    PS/2는 기존의 AT-BUS와는 전혀 다른 커넥터와 신호와 구조를 가지고 있었다.

    그것은 MCA(Micro - Channel Architecture)였다.

    이것이 무엇을 말하는가 하면 이제까지 AT 버스 용으로 만들어진 확장보드는

    새로운 PC에서 전혀 사용할 수 없게 되었음을 말하는 것이었다. 

    사람들은 다들 그때까지는 IBM의 힘을 믿고 있었다.

    그래서 당연히 IBM이 힘으로 밀어붙힌다면 당연히 MCA가 곧 시장을 제압할 수 있을 것으로 생각했다.

    예전에 PC를 처음 개발하여 애플을 제압했던 것처럼 생각한 것이다.

    수많은 호환기종 업체들은 어떻게 해야 살아남을 수 있을지 미리부터 걱정하기 시작했고

    IBM은 PS/2에 있어서는 예전의 PC의 경우와는 달리 하드웨어를 공개하지 않았으며

    또 MCA 버스를 사용함에 있어서는 특허 사용료까지 받기 시작했다.

    그만큼 자신이 있던 것이었다. 

     

    하지만 상황은 여의치 않았다.

    PC 시장은 IBM이 생각하던 것보다는 너무도 커져있었고 IBM의 힘만으로는 이를 제압할 수가 없을 정도였다.

    그리고 한편으로는 다른 호환기종 업체들의 힘이  너무 커져있었다.

    특히 컴팩(Compaq) 등과 같은 몇몇 업체는 다른 호환기종 업체와는 비교할 수 없을 만큼의 기술력을 자랑하며

    IBM 수준의 고급기종으로 대항하면서 상당한 시장을 점유할 정도였다.

    이러한 업체들은 이제 IBM에 대항해서 연합전선을 펴기 시작했다.

    그래서 만들어진 것이 바로 EISA(Extended ISA) 버스였다. 

    EISA 버스는 기존의 AT 버스를 확장한 것으로서 겉으로 보기에는 똑같은 커넥터를 사용하는 것처럼 보이지만

    내부에는 기존 AT 버스의 커넥터의 핀들을 1/2로 작게하여 새로운 핀들을 추가하는 식으로 확장을 했다.

    그래서 메인보드 상에서 공간을 더 차지하지 않아도 되고

    이미 사용되고  있던 각종 AT 버스용의 확장 보드들을 그대로 사용할 수도 있었다.

    그러면서도 데이타 및 어드레스 버스의 폭은 32 비트까지로 올렸고

    데이타 전송 클럭도 33MHz까지도 사용할 수 있도록 만들어졌다. 

    물론 EISA 규격은 IBM을 제외한 다른 업체들의 호응을 받았다.

    이것은 더이상 IBM의 굴레에  붙잡혀 있지 않아도 되고

    또한 앞으로도 더이상 IBM의 길을 뒤쫓아 갈 필요가 없게되는 시발점을 의미하게 되었기 때문이었다.

    아뭏든 MCA와 EISA가 비슷한 시기에 서로 경쟁을 하기 시작하던 그 시점에

    언뜻 보면 금새 PC 시장은 두가지 버스 중의 하나가,

    혹은 두가지 모두가 금새 표준형으로 자리잡게 될 것처럼 보이기만 했던 것이 사실이었다. 

    그러나 실제는 어떠한가?

    두 버스 시스템이 모습을 나타내어 경합한지 5년 정도가 지났는데도 불구하고

    아직 일반 사람들이 볼 때에는 EISA나 MCA의 어떤 것도 일반화되지 못한 상태로 남아있다.

    IBM은 MCA 버스를 가진 PC가 원래 의도했던 만큼 제대로 성공을 거두지 못하자

    다시 원래의 AT-BUS 구조로 원대복귀한 상태이고,

    EISA 버스도 아직까지 처음의 기대에 부응하지 못한 채로 단지 비싼 컴퓨터에서나

    가끔씩 사용되는 확장 버스라는 인식이 전혀 달라지지 않은 상태이다. 

    왜 이같은 결과가 빚어졌을까?

    원인을 생각해 보면 우선 MCA는 IBM의 것이라는 생각이 가장 큰 장애가 되고 있고

    또한 MCA 확장 버스를 가진 컴퓨터와 확장보드를 만들기 위해서는

    IBM에 내야하는 특허료 이외에도 기본적으로 필요한 하드웨어때문에

    무시하지 못할 만큼의 비용이 드는 것이 문제가 된다.

    분명 MCA는 뛰어난 버스 구조이지만 이러한 문제점때문에 일반화되지 못하는 것이다.

    EISA 버스도 MCA에 비하면 적지만 분명히 AT 버스 구조에 비해서 추가로 비용이 소요되는 문제가 있는데다가

    새로운 버스 체계가 아닌 기존의 AT 버스의 사촌 정도에 불과하다는 점이 장애가 되고 있다.

     

     

    로칼 버스

     

    최초의 로컬 버스라고 하자면 그것은 메모리 확장을  위한 보드로부터 시작된다.

    아직 SIMM 메모리, 즉 우리가 흔히 모듈 램이라고 부르는 그런 메모리가 일반화되지 않았을 때에는

    메모리 칩은 DIP 타입만을 사용할 수 있었고, 일반적인 마더 보드상에는

    이 DIP 타입의 메모리를 기껏해야 4 메가 혹은 8 메가 정도 밖에는 장착할 수 없었다.

    이것은 우선 보드상에 공간적인 여유가 없었고

    또한 일반적인 사용자로서는 그 정도까지 메모리를 사용할 일이 많지 않았기 때문이었다.

    아뭏든 그 이상의 메모리를 사용하자면 확장 슬롯에 메모리 확장 보드를 이용하는 수 밖에는 없었다. 

    그런데 가령 386 PC의 경우를 생각해 보면 CPU 자체는 32 비트이고

    마더보드 상에서도 메모리  구조는 32 비트 체계로 연결되어 있는데

    외부에 메모리를 확장할 때에는 AT 버스가 16 비트구조이므로 16비트로 연결할 수 밖에 없다.

    또한 CPU의 시스템 클럭은 16MHz, 혹은 25MHz까지 높다고 해도

    외부 메모리를 사용할 때에는 AT 버스의 속도인 8MHz 정도로 사용할 수 밖에 없다.

    혹시  자신의 시스템에 메모리를 확장하는데 있어서 메모리 보드를 사용한 독자라면 시험해 보라.

    최초에 컴퓨터를 부팅할 때 메모리 테스트를 하면 화면에 메모리의 값이 증가되어나가는데

    확장 보드를 사용한 부분에 있어서는 메모리 증가 속도가 훨씬 떨어진다는 점을 확인할 수 있을 것이다. 

     

    1990년대에 들어서면서 이같은 문제를 해결하기 위해서 여러 PC 보드 업체들은

    그들의 마더보드에 기존의 AT 버스 이외에 커넥터를 따로 달아서

    이것을 통해서 32 비트 폭으로 CPU의 클럭  속도에 맞게 동작시키는 방법을 강구하게 되었다.

    물론 오늘에 와서는 SIMM 메모리의 일반화에  따라 이처럼 메모리를 확장하는 경우는 많지 않게 되었지만

    여기서부터 로컬 버스의 개념이 시작된 것이다. 

    그 다음으로 로컬 버스의 개념이 사용된 것은 그래픽 카드를 위해서였다.

    그리고 이것은 당연히 마이크로소프트의 윈도우 3.0과 3.1이 발표되기 시작하면서

    보다 빠른 속도의 그래픽 카드를 지향하는 대중적인 바람이 불게되면서 더욱 가속화 되었다.

    일반적인 개념으로는 VGA 카드 등의 그래픽 동작 속도를 증가시키기 위해서는

    TMS34010/20과 같은 그래픽 코프로세서 칩을 장착한 보드를 사용하거나,

    아니면 그래픽 액셀러레이터 칩을 사용한 비디오 보드를 사용해야 되는 것이  통념이었다.

    하지만 문제는 가격이었다. 일반 VGA 보드에 비해서 이들 칩을 사용한 보드들은 더욱 가격이 비쌌기 때문이다. 

    몇몇개의 업체들은 아예 VGA 보드를 마더보드에 내장하기 시작했다.

    어차피 VGA 보드는 하루아침에 바뀔 것이 아니기 때문에

    이렇게 해도 일반 사용자라면 나중에 다른 그래픽 보드로 바꾸고 싶어하지는 않을 것이라고 생각한 때문이었다.

    그대신 이 VGA 보드를 확장 슬롯에 연결하지 않고 그대로 CPU에 연결함으로써

    확장 슬롯의 문제점인 낮은 클럭 주파수와 16 비트 데이타 폭의 제한을 해결할 수 있는 것이었다.

    이렇게 함으로써 VGA의 동작 속도는 확장 슬롯을 통해서 보드로서 연결되었을 때보다

    현저한 속도의 향상을 가져올 수 있었다. 

    하지만 이것은 일시적인 해결방편일 수 밖에는 없었다.

    시스템 상의 그래픽 카드에 선택의 여지가 없다면 마케팅적인 측면에서 불리한 점이 될 수도 있을 뿐더러

    PC의 특징인 개방형 구조의 의미가 크게 줄어드는 결과를 낳기 때문이다.

    더구나 고속 동작을 필요로 하는 SCSI(Small Computer System Interface) 등의 인터페이스를 통한

    하드 디스크 등이 늘어가게 되면서는 그 모든 고속 인터페이스들을 마더 보드 내에 내장할 수도 없는 일이었다.

    즉 어쨌든간에 확장 슬롯은 필요한 것이었고 그것은 단지 그래픽 보드만을 위해서가 아니라

    다른 보드들을 위해서도 마찬가지였다. 

    아뭏든 이런 이유로 해서 많은 업체들은 자신들 나름대로 로컬 버스를 고안해서

    마더 보드 상에 따로 소켓을 마련하여 거기에 맞는 확장 보드들을 만들어내기 시작했다.

    그리고 당연히 금새 문제에 봉착하게 되었다.

    그 문제란 것은 바로 표준 규격이 없다는 것이었다.

    각 보드 업체들마다 커넥터와 핀 수와 신호 연결이 다르다보니 서로 호환이 될 수 없었고

    이 때문에 좀 더 활발한 시장이 형성되지 못하는 것이었다.

    이런 상황에서 표준 로컬 버스 규격을 만드는 움직임이 생긴 것은 자연스런 일이라 할 수 있는 것이다.

     

     

    VESA 버스

     

    VESA(Video Electronics Standards Association)는 원래 IBM이 만들어 놓은 VGA 카드의 표준을 넘는

    800x600이나 1024x768, 1280x1024 등의 고해상도의 규격을 만들기 위해서 여러 업체들이 연합해서 만든 단체이다.

    여기서 제안하여 규격화시킨 로컬 버스의 규격이

    바로 VESA Local 버스, 줄여서 보통 VL 버스라고 부르는 것이다.  

     

    1992년에 모습을 보인 VL 버스는 사실 별로 새로울 것은 없는 규격이다.

    우리가 로컬버스라고 하는 것은 그저 386 과 386 처럼 32 비트 체계의 CPU 칩들에서 나오는 신호들을

    직접 커넥터에 연결하는 것을 말하는데,

    VL 버스는 단지 커넥터의 종류와 각 핀들의 신호를 정의하고

    그밖에  몇가지 타이밍과 전기적인 세부사항을 분명히 해 놓은 것 뿐이다. 

    그 기본 개념에 있어서는 오히려 10년전의 XT로 다시 복귀한 셈이라고 할 수 있다.

    XT의 버스 클락 속도는 4.77MHz였는데 이것은 CPU인 8088 칩의 클락 속도와 동일한 것이었다.

    CPU와 확장 버스의 클락 속도를 동일하게 만들고 또한 서로 동기를 맞춘 것은

    CPU가 주변기기를 사용하는데 있어서 최대의 효율을 가지게 하려는 것이 원래의 XT의 설계 개념이었다.

    그 이후에 CPU의 클락  속도가 나날이 증가했고

    확장버스는 이미 시장에 나와있는 많은 확장보드와의 호환성 때문에 클락이 8MHz에서 멈췄을 뿐이었다. 

    VL 버스는 PC의 구조를 바꾸는 규격은 아니다.

    단지 AT 버스 등의 기존 확장 슬롯을 통해서 CPU와 확장 보드가 연결되던 것을

    이제는 직접 연결한다는 점만이 다를 뿐이다.

    따라서 소프트웨어는 전혀 이같은 변화와는 관련이 없고 기존의 소프트웨어는 100% 그대로 사용할 수 있다. 

    기존의 하드웨어 업체들도 새로이 다른 칩을 사용해야 하는 등의 일은 필요없다.

    커넥터마저도 VL 버스는 기존에 IBM이 PS/2에서 MCA 용으로 사용하고 있는 것을

    그대로 쓰도록 정의해 놓았기 때문에 새로운 개발이 필요없다.

    바이오스 롬을 꼭 바꿔야하는 것도 아니고 칩셋을 바꿔야 하는 것도 아니다.

    따라서 추가되는 비용은 단지 VL 버스를 위한 커넥터의 재료비 정도 밖에는 안 들어가는 셈이다.

    이것은 VL 버스 용의 확장보드를 만들 때에도 마찬가지이다. 

    VL 버스 규격은 기본적으로 486을 염두에 두고 설정했지만 32 비트 CPU를 사용하는 컴퓨터라면 

    어디에도 사용할 수 있다.

    따라서 386SX, 386DX, 486SX, 486DX 등의 32 비트 마이크로프로세서를 사용한

    모든 PC에 사용할 수 있는 것은 물론,

    앞으로 출현할 인텔의 펜티엄(Pentium)에도 문제없이 사용가능하다.

    그리고 IBM의 MCA 버스에 사용할 수 있기까지 하다. 

    현재 VL 버스가 전성기를 누리고 있지만 한가지 분명한 사실은 VL 버스는 전혀 새로운 버스 체계가 아니라는 점이다.

    또한 완전한 호환을 위한 버스 체계라기 보다는 CPU에 너무도 의존하는 것이기 때문에

    그 한계가 명백하다는 문제도 있다.

    하지만 그럼에도 불구하고 현재 전반적인 지지를 받고 있는 유일한 32비트 로컬버스 규격이 VL 버스이고

    이제껏 중구난방식으로 업체마다 다른 모습을 보였던 로컬 버스들은 사라지고 다들 이 VL 버스를 지원하는 쪽으로

    선회하게 된 것은 고무적인 현상이라고 하겠다.

     

     

    VESA 버스의 특징

     

    표준 AT 버스에서는 확장 버스의 슬롯 갯수를 늘리는 것이 그리 큰 문제가 안 된다.

    표준적으로는 8 개가 마련되어 있는 것이 보통이고 특수한 시스템의 경우에는 그보다 많은 것도 있다.

    하드 디스크 인터페이스나 시리얼 및 패럴렐 인터페이스를 마더보드에 내장한 경우에는

    확장 슬롯의 숫자가 8 개 이하일 경우도 많다.

    하지만 VL 버스에서는 버스 슬롯이 아무리 많아도 3개까지 밖에는 지원되지 않는다.

    이것은 VL 버스가 CPU와 직접 연결되므로 연결되는 주변기기가 많을 경우 

    CPU가 제대로 동작하지 못하기 때문이다.

    CPU는 기존의 마더보드도 구동해야하는 한편 VL까지도 구동해야 하므로

    전기적으로 과부하가 걸릴 수도 있는 것이다.

    이 때문에 VL 버스 규정 자체에서도 최대 3개 이상의 확장 슬롯은 사용하지 못하게 되어있는 것이다. 

    한편 시스템 클럭이 50MHz가 되면서는 아예 확장 슬롯을 사용하지 않도록 권장이 되고 있다. 

    즉 슬롯 커넥터를 사용하지 못하고 마더 보드 내부에 VL 버스와 연결된 주변기기가 내장시켜야 한다는 말이 된다.

    물론 CPU와 확장 보드 사이에 버퍼를 마련하는 것이 한 방편이 되어 약간의 개선을 할 수 있을지는 몰라도

    근본적인 해결은 되지 못한다.

    빠른 속도의 CPU에서는 제대로 사용할 수 없다는 점은 또하나의 커다란 약점일 수 밖에 없는 것이다.

    예를 들어 40MHz 클럭의 CPU를 사용할 때에는,

    CPU와 VL 버스 사이에 버퍼를 사용할 때에는

    확장 보드용의 슬롯 커넥터를 1개만 설치할 수 있되 VL 버스를 이용하는 주변기기의 총 갯수는 2 개까지만 허용된다.

    그리고 버퍼를 사용하는 것은 권장되지 않는다. 

    이 문제를 생각해 보면 실제의 경우 CPU의 클럭은 사실상 단지 40MHz까지로 제한된다는 말이  된다.

    그렇다면 그 이상의 속도를 가지는 CPU에 대해서는 어떻게 해야하겠는가.

    VL 버스를 사용하기 위해서는 확장 버스 슬롯이 중요한 것인데 확장 슬롯을 제대로 사용할 수 없다면

    표준화의 의미가 크게 떨어지기 때문이다. 

    VL 버스에서 동작할 수 있는 최고 클럭 속도는 66MHz까지로 되어있다.

    그렇다면 왜 확장 슬롯을 통한 확장 보드의 연결에서는 40MHz까지로 한계가 지어졌는가.

    그것은 커넥터의 특성때문이다.

    VL 버스의 커넥터에서 그 이상의 클럭 주파수는 제대로 동작하는 것을 보장하지 않기 때문이다.

    한편 클럭 속도가 40MHz에서 66MHz 사이가 되면 데이타를 읽고 쓸 때

    각 사이클마다 한번씩의 대기 신호(Wait signal)이 삽입될 수도 있다. 

    VL 버스를 위해서 사용되는 커넥터의 규격은 IBM에서 PS/2에 사용한

    표준 16-비트 MCA 규격의 112 핀짜리 커넥터(실제로는 116핀이지만 그 가운데 4핀은 사용하지 않음)를

    이용하도록 되어있다.

    그리고 이 커넥터는 기존의 AT 버스와 정확히 일렬로 배열되도록 정해져있다.

    이것이 의미하는 바는 VL 버스 용의 확장 보드가 기존의 AT 버스와 VL 버스를 모두 이용할 수 있음이다.

    사실 AT 버스에서 제공되는 INT 신호나 DMA 신호, REFRESH 신호, 그리고 I/O 어드레스 등이

    VL 버스에는 없기 때문에 시스템을 제대로 사용하기 위해서는

    VL 버스와 더불어 기존의 AT 버스도 적절히 활용해야 한다. 

    VL 버스 상에서는 3개까지의 매스터가 존재할 수 있다.

    매스터라는 것은 시스템의 데이타 버스, 어드레스 버스, 컨트롤 버스 등을 사용하는

    주체가 될 수 있음을 말하는 것인데

    만약 주변기기 중의 하나가 매스터 기능을 가진다면 이것은 CPU에게 버스의 사용권들을 요구하여

    자신이 필요한 기능을 위해서 사용할 수 있다. 

    원래 VL 버스는 32 비트 데이타 버스를 가지고 기본적으로 32 비트 단위로 데이타를 읽고 쓰도록 고안되었지만

    386SX와 같이 내부적으로는 32 비트 구조를 가지지만

    외부와의 연결은 16 비트로 되어있는 CPU도 사용할 수 있도록 16 비트 단위의 데이타 전송도 가능하다.

    VL 버스 용의 확장 보드는 16 비트 및 32 비트 데이타 전송의 모두에 대비하여

    그때그때 대처할 수 있도록 만들어져야 한다.

    한편 VL 버스는 나중에 64 비트 단위의 동작을 위해 확장될 수도 있게 고안되어 있기도 하다.

     

     

    VESA 버스의 이용

     

    VL 버스의 성능을 가장 분명하게 확인할 수 있는 것은 그래픽 카드에서이다.

    물론 일단 도스 프로그램을 사용하는 데서야 눈으로 확인할 수 있는 만큼의 차이가 없겠지만

    윈도우즈처럼 화면을 온통 그래픽 데이타로 처리해야 함에 있어서는

    로컬버스의 성을 이용하면 화면의 그려지는 속도가 상당히 차이가 날 것은 분명한 일이다. 

    어떤 외국잡지사에서 여러회사들의 VL 버스 마더보드에 동일한 VL 버스용 그래픽 카드를 장착하고

    마이크로소프트를 수행시키는 테스트를 기사를 보았다.

    그 결과는 VL 버스 쪽이 일반 ISA 보드용 VGA 카드보다도 최고 자그마치 6배나 차이가 나는 것이었다.

    이런 차이는 보다 높은 해상도와, 보다 많은 컬러를 구현할 때 더욱 두드러진 결과를 낳는다.

    따라서 1024x768 해상도에 65536 컬러를 다뤄야 하는 경우라면

    단연코 VL 버스를 선택하는 것이 유리할 것이다. 

    VL 버스의 성능 향상은 비디오 카드에만 국한되는 것은 아니다.

    기타 가장 VL 버스의 성능을 이용할 수 있는 유력한 후보로는

    고속 하드 디스크를 위한 인터페이스(가령 SCSI-2), 고속 광  케이블 통신을 위한 인터페이스 카드용으로도

    이용할 수 있다. 

    현재 32 비트 구조로 되어있는 VL 버스가 64 비트 구조로 완전히 확장되는 때가 오면

    최대 데이타 전송속도는 더욱 높아질 것이다.

    즉 2 배로 높아지므로 초당 264 메가 바이트의 전송이 가능한 것이다.

     

     

    PCI 버스

     

    PCI 버스구조는 다음과 같은 목표들을 가지고 개발이 진행되었다고 한다.

    우선 마이크로프로세서의 종류에 관계없이

    고속 주변기기와의 연결이 될 수 있는

    고성능 버스 구조이어야 할 것이라는 점이다.

    다음으로는 여러종류의 주변기기들과 동시에 맞물려서도 문제가 발생하지 않고

    주변기기들의 성능을 최대로 발휘하게 해주는 견실한 호환성을 가진 규격이어야 함이다.

    그리고 마이크로프로세서 기술의 발전에 따라서 더 높은 성능을 가진 CPU가 사용된 컴퓨터에서도

    현재의 PCI 확장 보드들이 문제없이 동작할 수 있는 독립성을 가져야 한다는 점 등이다. 

    PCI는 단지 어떤 한두가지 기능만을 특히 고려해서 만든 것이 아니고

    컴퓨터 시스템 전체에 걸쳐서 균등하게 향상된 성능을 부여하도록 되어있다.

    그래픽 카드, 네트웍, 디스크 드라이브, 라이브 비디오 등의 특성이 모두 고려되어 있다.

    PCI 버스의 최고 속도는 33 MHz이며 32 비트 버스 구조이므로

    초당 132 메가 바이트의 데이타를 전송할 수 있다는 계산이 된다.

    또한 추후에 확장될 예정인 64 비트 구조에서라면

    초당 264 메가 바이트의 전송속도가 된다.

    물론 32 비트 PCI와 64 비트 PCI 버스는 그대로 호환이 될 것이다. 

    PCI의 또다른 새로운 점은 5 볼트를 근간으로 하는 현재의 디지탈 회로뿐만 아니라

    최근에 노트북 컴퓨터에서 사용되고 있는 전력 절약형의 3.3 볼트 디지탈 회로도 지원한다는 사실이다.

    이 점은 PCI 버스가 현재의 노트북 시장 및 미래에 있게될 3.3 볼트 방식의 데스크탑 컴퓨터 시대에

    대응하고 있음을 보여준다. 

    PCI 구조의 확장 보드에서는 더 이상 셋업을 위한 딥 스윗치나 점퍼가 필요없다.

    이것은 개인용 컴퓨터 사용자들이 보다 쉽고 빠르게 확장 보드를 설치할 수 있게 하기 위해서일뿐만 아니라

    많은 종류의 확장 보드들이 서로 충돌함이 없이 한 컴퓨터 내에서 공존할 수 있도록 배려되었음이다.  

     

    예컨데, 우리가 기존의 컴퓨터에서 사운드 보드를 설치할 때를 생각해보자.

    인터럽트 번호(IRQ)를 가지고 골머리를 앓으면서 이 번호, 저 번호를 바꿔가면서 고생한 적은 혹시 없었던가. 

    PCI 방식의 컴퓨터에서는 이러한 일은 벌어지지 않을 것이다.

    이는 PCI 확장 보드 내부에 그 종류를 판별할 수 있도록 하는 식별 코드가 들어있도록 했기 때문이다.

    따라서 컴퓨터의 전원을 올리거나 리셋을 하면

    바이오스 롬에 들어있는 프로그램은 각각의 보드를 식별해서

    시스템을 구성을 하게 된다.

    그래서 컴퓨터의 주변기기가 사용하고 있는 인터럽트들을 관리하게 되고

    만약  확장 슬롯에 새로운 주변기기가 설치되면 현재 쓰이지 않는 인터럽트 번호를

    그 보드에 부여해서 사용하게 할 것이기 때문이다. 

    PCI 슬롯의 크기는 예상외로 작다.

    PC/XT 버스는 확장슬롯은 62 핀짜리 커넥터를 사용하고,

    이를 확장한 AT의 ISA 버스는 거기에다 36핀을 더해서 자그마치 98개의 신호가 사용되고 있다.

    EISA나 VL-Bus의 경우는 이 98핀짜리 ISA 버스를 더 확장한 것이기 때문에

    눈이 돌아갈 정도로  신호의 갯수가 많고 커넥터도 커져버렸다.

    그러다보니 마더보드에서 커넥터가 차지하는 영역이 자연히 많아질 수 밖에 없는 일이다.  

    PCI가 이처럼 신호의 수를 줄일 수 있었던 가장 큰 이유는

    각각 32 비트의 폭을 가진 데이타와 어드레스 신호를 같은 핀에서 사용했기 때문이다.

    즉, 시간차를 가지고 우선 어드레스 신호를 내 보낸 다음

    그 다음에는 데이타를 내보내는 식의 방법(멀티플렉싱)을 사용한 것이다.

    그밖에도 80x86 프로세서에 의존하지 않는 버스방식이기 때문에

    그 CPU 특유의 신호들을 사용하지 않아도 되는 점도 신호 수를 줄이는데 주요한 요인이 된다.

     

     

    SCSI 인터페이스

     

    SCSI(Small Computer System Interface)의 가장 큰 특징이라면

    이것이 시스템 기준(System level)의 인터페이스라는 점과

    모든 데이타 및 명령들이 8 비트(표준 SCSI의 경우) 병렬 데이타로 전달된다는 점을 들 수 있다.

    컨트롤러가 명령어를 드라이브에 보낸다는 점에서는 

    ESDI 방식이나 IDE 방식의 인터페이스와 비슷하다고 하겠지만,

    ESDI는 디바이스 수준(Device level), 즉 하드 디스크를 위해서만 사용되는 인터페이스이다.

    그리고 IDE 방식은 80x86 CPU를 사용하는 IBM 호환 PC에서만 사용되는 인터페이스이다.

    이에 반해서 SCSI는 시스템 수준의 인터페이스이다. 

    SCSI 인터페이스를 통해서는 하드디스크, 광디스크, 이미지  스케너, 바코드리더, 프린터 등의

    여러가지 주변기기를 부착하여 사용할 수 있고 컴퓨터와 컴퓨터끼리도 연결할 수도 있다.

    이런 점에서는 마치 RS-232C 인터페이스를 생각하게 만들기도 하는데

    RS-232C도 시스템 수준의 인터페이스라고 할 수 있지만

    RS-232C는 직렬신호를 사용하는 가장 기초적인 저급의 방식이다. 

    SCSI방식은 ESDI 방식에서 직렬 데이타를 병렬 데이타로 바꾸는 회로를

    드라이브에 추가한 형식이라고  이해하면 쉽다.

    ESDI 방식에서는 이러한 일을 컨트롤러 어댑터가 하지만

    SCSI 방식에서는 하드디스크 드라이브 내부에서 해결하게 된다.

    그래서 나온 데이타를 병렬 데이타 버스를  통해서 보내는 것이다.

    이같은 점은 IDE 방식도 마찬가지이다. 

    SCSI의 기원은 1980년 경에 슈가트(Shugart)라는 디스크 드라이브 회사에서 고안한

    SASI 인터페이스에서 시작되었는데,

    그 후 1986년에는 미국 표준 규격에 정식으로 등록되기도 했다(ANSI X3.131-1986).

    SCSI는 1개의 50핀짜리 케이블만 사용하고 있다.

    한편 신호 방식에 따라서 단일신호방식(Single-Ended)과 차동신호방식(Differential)이 있는데

    PC에서는 대부분 단일 신호 방식을 사용한다.

    단일 신호 방식에서의 최대 연결거리는 6 미터인 반면 차동신호 방식에서는 25미터에 이른다.  

     

    SCSI 인터페이스의 최고 전송속도는 초당 5 MBytes인데,

    요즘에는 많이 사용하기 시작하고 있는 SCSI-2 방식은 초당 10 MBytes 정도의 속도까지 가능하다.

    초당 5 Mbytes 이상의 전송속도를 가지는 SCSI-2 방식을 보통 Fast SCSI-2라고 부른다.

    PC에서는 아직 거의 사용되고 있지 않지만

    68 핀짜리 케이블을 사용하는 Wide Fast SCSI-2 방식이라는 것도 있는데

    이것은 SCSI-2의 두 배 속도인 초당 20 Mbytes 까지도 낼 수 있고,

    그 변종에는 40 Mbytes까지 가능한 버전도 있지만 아직 우리와는 거리가 멀다. 

    원칙적으로 한 컴퓨터에는 하나의 하드디스크 컨트롤러만 장착할 수 있고,

    하나의 컨트롤러에는 2대의 하드디스크 드라이브를 연결할 수 있다.

    컨트롤러에 따라서 4개까지 연결할 수 있는 것도 간혹 있지만

    3개 이상을 연결할 경우 롬바이오스에서 지원해 주지 않으므로 실질적으로 2개 밖에는 사용할 수없다. 

    SCSI상에 연결될 수 있는 디바이스의 개수는 모두 8개이다.

    즉, 컴퓨터에 들어 있는 SCSI 어댑터 카드 및 주변기기에 들어있는 SCSI 어댑터 회로가 모두 8개만큼

    인터페이스 케이블 상에 있을 우 있다는 뜻이다.

    실제로는 PC와 하드디스크 드라이브를 연결하는 시스켐의 측면에서는

    그 8개 가운데 하나는 PC가 되어야 하므로 나머지 7개의 하드디스를 붙일 수 있다.

    # by 제갈장비 | 2006/09/11 10:05 | 문서-EDPS | 트랙백 | 덧글(0)
    2006년 09월 10일
    POST(Power On Self Test)

    출처 : http://www.zuno.co.kr/post-bus.htm

    < POST >

    컴퓨터의 전원 스위치를 올리고 난 다음에 부팅이 되어서 사용할 수 있게 될 때까지

    그 내부에서는 과연 어떤 일이 이루어지고 있는지 보통의 사용자들은 거의 생각하지 않는다.

     

    그저 메모리  용량이 0 바이트에서부터 640 킬로바이트까지(혹은 1024 킬로바이트나 그 이상까지)

    증가하는 숫자가 화면위에 보이므로 그냥 메모리 테스트를 하는가보다라는 정도밖에는 알지 못하는 것이다.

     

    그러나 실제로는 컴퓨터가 켜지고 부팅이 될 때까지의 그 수십초동안 컴퓨터의 거의 모든 부분은

    바이오스 롬에 들어있는 POST(Power On  Self Test)라고 하는 프로그램에 의해서 테스트되어진다.

     

    CPU, 메모리, 주변장치, 메인보드의 각 칩들, 키보드, 비디오 어댑터, 플로피와 하드 디스크 드라이브 등에 대한

    종합적인 테스트가 수행되는 것이다.

     

    이 글에서는 이 컴퓨터가 켜지고 나서 우리가 사용할 수 있게 되기까지 컴퓨터 내부에서 벌어지는 일을 설명함으로써

    POST에  대한 이해와 더불어 PC 하드웨어 구성의 기본적인 내용을 이해해 보기로 한다.

     

    여기서 설명되는 과정들은 컴퓨터와 롬 바이오스의 종류에 따라서 조금씩 달라지지만

    근본적인 원리는 같으므로 문제는 없을 것이다.

     

     

    Reset 직후

     

    우리가 컴퓨터에 전원코드를 연결하고 스위치를 올리면

    이때부터 컴퓨터에는 전력이 공급되어 전자회로가 작동을 시작하게 된다.

     

    컴퓨터에서 필요로 하는 전원은 +5V, -5V, +12V, -12V 인데 

    이 전압만 공급된다고 해서 컴퓨터가 동작을 시작하는 것은 아니다.

    이 전압들 이외에도 한가지 신호가 더 전원공급장치(Power Supply)에서 나오는데

    그것이 바로 'Power Good' 신호다.

    이 신호는 전원공급장치가 정상적으로 동작하고 있으며 또 한 그로부터 나오는 출력전압이

    컴퓨터가 제대로 동작할 수 있는 상태에 있음을 알려주는 역할을 한다.

     

    최초에 전원전압이 인가된 순간의  'Power Good' 신호는 0V의 전압이지만

    약 100ms 내지 500ms 정도 후에는 5V의 전압으로 올라가서 

    그 시점에서부터 메인보드는 정상적인 동작을 시작하게 한다.

     

    전원이 인가되고 Power Good 신호가 뜨면 이 신호는

    시스템클럭과 시스템 리셋신호를 관리하는 8284칩(AT에서는  82284칩)에 전달된다.

    이 칩은 CPU를 비롯한 전체 회로를 리셋시키고 시스템 클럭을 인가해주며

    이 순간 CPU는 최초수행번지로 정해져 있는 FFFF:0000H번지로 점프해서

    그곳에서부터 시작되는 명령어를 수행하기 시작한다.

    이때부터의 기계어 프로그램을 POST(Power-On Self Test)라고 한다.

    우리가 간단히 이 POST 프로그램을 수행시키는 것을 실험해 보려면

    다음과 같이 DEBUG.COM을 이용해서 해 볼 수 있다.
              C:>DEBUG
              -g=FFFF:0
      위와 같이 하면 컴퓨터는 껐다 켜는 것과 동일한 결과가 된다. 

     

    POST는 우선 CPU 칩내부의 자체적인 검사부터 시작한다.

    최초의 검사는 플래그 레지스터(flag register)의 테스트이다.

    모든 플레그 레지스터의 내용을 한꺼번에 1로 만드는 명령인 SAHF 명령을 수행한 다음에

    레지스터들이 모두 1상태로 되어 있는지 차례차례 검사한다.

     

    8253 칩은 어떤 일정한 주기의 펄스를 발생해 내는 기능을 하며

    그 주기는 외부에서 프로그램을 하여 제어할 수 있게 만들어져 있다.

    여기에는 채널 0 에서 2까지 3개의 타이머기능이 있는데 이를 이용해서

    PC에서는 주기적으로 1초에 약 18번 가량 CPU에 인터럽트를 거는 기능을 만들고

    메인메모리로서 사용되는 DRAM의 리프레시를 하기도 하며

    스피커를 통해 각종 음향효과를 내는데 이 칩을 사용하기도 한다.

    여기서 DRAM 리프레시의 기능은 8253칩만으로 하는 것은 아니고

    DMA 컨트롤러인 8237이 결부되어서 이루어지기 때문에 8253칩 다음에는 이 8237의 초기화를 한다. 

     

    8237 칩은 XT에는 1개, AT에는 2개가 장착되어 있으며

    주로 플로피 디스크 드라이브나 하드  디스크 드라이브에서 데이타를 읽어오는 기능을 위해 사용된다.

    8237 칩의 초기화를 한 직후부터  비로소 메인메모리는 리프레시가 되는 정상동작을 하게 되고

    이때 POST 프로그램은 DIP 스윗치  또는 CMOS 셋업으로부터 이 시스템의 메모리 사이즈를 읽어들인다.

    그리고 리프레시가 정상적으로 이루어지고 있는지 확인한다.

    리프레시가 되지 않는 것이 발견되면 시스템은 정지한다. 

     

    이제 키보드 인터페이스의 기능을 하는 8비트 CPU인 8742칩의 리셋과 테스트를 하고 난 뒤,

    메인 보드상의 베이스 메모리 검사를 시작한다.

    AT라면 프로텍티드 모드용 레지스터 테스트를 중간에 잠시 한 다음에 이 과정으로 넘어온다.

    베이스 메모리는 0 번지서부터 시작하는 64KByte의 영역인데

    여기에 대해 AAH, 55H, FFH, 01H, 00H 등의 값을 각각 메모리에 썼다가는 다시 읽어보는 테스트를

    전체적으로 시행한다.

    여기서 문제가 발생하지 않으면 이제는 스택을 설정하고 인터럽트 제어 칩인 8259A를 초기화하며

    인터럽트 벡터를 메모리의 0번지서부터 설정한다. 

    8259 칩은 컴퓨터 하드웨어에서 사용되는 여러가지 인터럽트의 순위를 정해주고

    이 순위에 따라서 CPU에게 인터럽트 신호를 보내는 역할을 한다.

    AT 의 경우에는 8259A가 두개이므로 하나씩 차례로 초기화한다.

    그리고 AT에서는 CMOS 셋업을  기억하고 있는 146818 칩을 검사하여

    이 칩에 전원이 끊어진 적이 없음과 체크섬이 맞는지가 확인되면

    그 내용을 가지고 시스템의 초기화에 사용한다.

    여기서 전체메모리의 검사를 하는데

    특히 80286의 경우에는 프로텍티드 모드상태로 전환한 다음에 테스트를 하여

    1MByte 미만뿐 아니라 1MByte 이상 16MByte까지의 검사를 다 하게 된다. 

    146818 칩은 리얼타임클럭의 기능과 셋업상태를 기억하는 CMOS SRAM의 기능을 하나의 칩에 모아놓은 것으로서

    AT 및 386PC에만 있다.

    XT에서는 시스템 메모리, 디스크 드라이브 등에 관한 정보를 딥 스윗치를 사용하여 설정하지만

    AT에서는 이 칩내부의 SRAM에 그 정보를 써 넣음으로써 설정한다.

    이 정보는 전원이 꺼진 상태에서는 그 전원을 백업 배터리로부터 공급받기 때문에 반영구적으로 보존되며

    전원이 켜질 때마다 POST 프로그램은 여기서 시스템의 셋업상태를 읽어서 초기화시키게 된다.

     

     

    비디오 카드 검사

     

    메모리 테스트가 끝이 났으면 POST 프로그램은 비디오 어댑터의 초기화를 시작한다.

    우리가 현재 사용하고 있는 허큘리스, CGA, EGA, VGA  등의 모든 비디오 어댑터 회로는 모두

    6845 CRTC(C-athode Ray Tube Controller)칩에 기준하고 있는데

    이 가운데서 실제로 6845 칩을 회로에 사용하는 것은 허큘리스와 CGA 뿐이고

    EGA와 VGA 어댑터에는 커스텀 IC를 사용한다.

    그러나 칩의 내부구조는 6845의 구조를 그대로 반영하였으므로 똑같은 방식의 프로그램으로 초기화해도

    똑같이 실행된다.

    그러므로 물론 EGA나 VGA 어댑터가 없던 시절에 만들어진 컴퓨터의 롬바이오스도

    EGA와  VGA를 그대로 사용할 수 있는 것이다.

    사용하고 있는 어댑터의 종류는 딥 스윗치나 CMOS 셋업으로부터 읽어들여져서

    BIOS의 데이타영역에 쓰여지고 인터럽트 10H 번을 호출하여 6845 칩의 초기화를 시행한다.

    이와 더불어 BIOS 데이타영역의 파라메타들을 셋업하고

    비디어 버퍼를 초기화하며 비디오 메모리의 검사를 하는 일련의 과정들이 이루어진다.

    이 때부터 화면의 왼쪽 윗 부분에는 커서가 나타나기 시작한다.

    이렇게 비디오 어댑터의 초기화를 한 다음에는 실제로 비디오 회로가 동작하는지 확인을 하는데

    이것은 6845 칩 내부의 레지스터 가운데에서 수직리트레이스 비트와 수평리트레이스 비트가

    계속 극성이 바뀌는지 테스트를 함으로서 알수가 있다.

    여기서 문제가 발견되지 않으면 화면을 지운다. 

    허큘리스와 CGA 어댑터는 자체적인 롬바이오스가 비디어 카드상에  있지 않으므로

    메인보드의 롬바이오스 루틴을 가지고 제어를 하지만

    EGA와 VGA 어댑터는 비디어 카드상에 있는 비디오제어 전용의 확장 바이오스 롬을 가지고 있다.

    이것은 EGA나 VGA같이 고해상도의 컬러 디스플레이 시스템이 제어하기가 매우 복잡해지기 때문에

    메인 보드의 롬 바이오스만 가지고는 제대로 그 기능을 실현시키기 어려운 이유에서이다.

    따라서 이제  POST 프로그램은 이러한 확장 바이오스 롬이 존재하는지를 검사한다.

    검사방법은 세그먼트 번지 0C000H 에서부터 0C800번지사이의 내용을 읽음으로서 이루지는데

    읽는 도중에 그 세그먼트 번지의 옵셋이 0H 번지인 곳에서 55H, 01H 번지인 곳에서 0AAH 값이 발견되면

    바로 확장용의 바이오스 롬이 있다는 것을 의미한다.

    이때 CPU는 제어를 그 세그먼트번지의 옵셋번지 3H로 넘긴다.

    EGA나 VGA 보드를 사용하고 있는 경우에는 디버거를 사용하여 그 존재의 확인을 할 수 있다. 

    비디오 롬 바이오스에서는  그 비디어 어댑터에 맞는 또 다른 방식의 초기화 작업을 수행하는데

    이때 그 보드의 롬바이오스 메세지가 나타나게 된다.

    그리고 비디오 메모리의 테스토도 수행한다.

    이 과정에서 비디오 카드에 따라서는 화면에 순간적으로 이상한 문자들이 나타났다가 사라지는 경우도 있는데

    이것은 초기화 과정중의 일시적인 현상이다.

     

     

    주변 기기 검사

     

    다음은 키보드를 초기화할 차례이다.

    이 과정 전까지 키보드는 아무런 구실도 하지 못하고 Num  Lock 이나 Scroll Lock, Caps Lock 등의 키를 눌러도

    LED 램프가 켜지지 않았었다.

    키보드를 제어하는 칩은 메인 보드의 키보드 근처에 있는 40핀짜리 IC인 8742라고 하는 8비트 CPU로서

    내부에 프로그램이 저장된 ROM과 RAM을 자체적으로 가지고 있다.

    8742가 키보드를 제어하는 것은 키보드 내부에 있는 8748이라고 하는 또 하나의 8비트 CPU와의

    통신을 통해서 이루어진다.

    POST 프로그램은 키보드를 제어하는 모든 명령을 직접 키보드에게 주지 않고 8742 칩을 통해서 보내게 된다.

    POST는 우선 키보드를 리셋한 다음, 키보드로부터 스캔코드를 받는다.

    이 스캔코드 값은 0AAH이어야 정상적인 상태이며 이때 키보드의 LED는 한번 점멸하면서

    정상적으로 동작하기 시작한다.

    만약 이 과정 중에서 키 가운데 하나 또는 여러개가 눌려 있다면 화면에 에러메세지가 나타난다.

    그러나 이 에러때문에 시스템이 정지하지는 않고 단지 <F1> 키만 눌러 주면 테스트가 계속된다. 

    키보드가 초기화된 다음에는 메모리 상에 하드웨어 인터럽트 벡터가 셋업되고,

    이어서 디스크 드라이브의 테스트가 시작된다.

    디스크 드라이브를 제어하는 것은 765 칩이다.

    이 칩을 리셋한 다음 초기화를 시켜 준 뒤 0.988초 동안 모터를 회전시키면서 디스크 드라이브의 검사를 한다. 

    이때는 특정한 어느 섹터를 찾아보는 검색을 해보게 된다.

    여기서 이상이 없으면 키보드 버퍼와 시리얼 포트, 패럴렐 포트 등을 셋업하고나서

    두번째 디스크드라이브가 있는지 검사하여 있으면 첫번째 드라이브와 같은 방법으로 테스트한다. 

    이 과정이 끝나면 AT에서는 146818 칩의 CMOS 데이타에서 시스템에 하드디스크 드라이브가 장착되어 있는지

    체크하여 그 초기화를 진행한다.

    그 다음에는 확장된 바이오스가 존재하는지 검사하기 위해서

    세그먼트 0C800H 에서부터 0E000H 번지까지를 앞에서 비디오카드의 바이오스를 체크할 때와 같은 방법으로

    검사한다.

    대개 0C800H 세그먼트 번지에는 하드디스크용의 바이오스 롬이 존재하게 되는데

    만약 있다면 그 바이오스로 제어를 넘겨서 하드 디스크의 초기화를 하게 만든다.

    XT의 경우에는 메인 바이오스 상에서 FDD 체크가 끝난 뒤 직접 확장 바이오스 롬의 존재유무검사로 들어간다.

    AT와는 달리 XT의 시스템 바이오스는 하드디스크를 제어하는 프로그램이 내장되어 있지 않으므로

    XT용 HDD 컨트롤러는 자체적인 바이오스 롬이 달려있고

    따라서 0C800H 번지에서 확장  바이오스가 발견되어 실행된다.

    XT용 HDD 컨트롤러 보드를 AT에서는 사용할 수 있는  것은

    AT에서도 이 확장 롬 바이오스가 있는지 여부를 체크하기 때문이다. 

    POST 프로그램은 이제 마지막으로 통해 NMI(Non-Maskable Interrupt)가 걸릴 수 있게 하여

    패리티 체크와 I/O 채널 체크가 수행되게 한다.

    NMI는 원래 CPU의 자체적으로는 어떤 경우에라도  무조건 걸리는 것이기 때문에

    그런 이름이 붙은 인터럽트 신호지만 칩의 외부적으로는 래치를 사용하여 제어할 수 있게 시스템 설계가 되어 있다.

    흔히 주위에서 보면 사용중인 컴퓨터에 패리티 에러가 나타났을 때 NMI가 안 걸리도록 설정줌으로써

    그 에러를 무시하고 사용할 수 있게 하는 프로그램을 사용하기도 하는데

    그것은 이 래치를 이용하여 NMI가 CPU에게로 연결되지 않게끔 만들어진  것이다.

     

     

    도스 부팅

     

    이제 디스크의 첫번째 섹터부터 로더 프로그램을 읽어 와서 실행시키는 인터럽트인 INT 19H를  실행하면서

    POST 과정을 끝낸다.

    INT 19H 인터럽트는 디스크로부터 부트스트랩(Bootstrap)을 하는 루틴이다.

    흔히 우리가 부르기는 부팅이라고 하는데 디스크로부터 도스를 읽어 와서 메모리에 깔아 놓는 과정을 말한다.

    여기서는 다시 바이오스 인터럽트인 INT 13H를 사용하여 디스크의 가장 처음에 있는 섹터에 있는 내용을 읽어와서

    메모리에 카피하고 제어를 그 프로그램에 넘긴다.

    이때 만약  A: 드라이브가 없거나, 있어도 읽을수 있는 상태가 아니라면 C: 드라이브로부터 읽어 온다.

    만약 OS가 MS-DOS라면 부트스트랩 프로그램은 디스크의 가장 첫 섹터로부터

    시스템 파일인 IO.SYS와 MSDOS.SYS를 읽어서 메모리에 올려 놓는다

    (PC-DOS의 경우에는 그 대신에 IBMBIO.COM과 IBMDOS.COM이라는 파일이 올라가지만 기능은 똑 같다).

    제어는 부트스트랩 루틴에서 IO.SYS로 넘어간다.

    IO.SYS 프로그램은 주변장치를 체크하고 각 드라이브 루틴을 초기화하며 시스템 메모리의 셋업을 하게 된다.

    이러한 일들이 끝나고 제어는 다시 MSDOS.SYS의 초기화 루틴으로 넘어가서

    주변기기의 작업영역 및 파일의 버퍼 영역을 확보하며 시스템 콜의 초기화까지 마쳐서

    DOS의 모든 기능이 정상 상태로 확립된다.

    다음에는 사용자가 작성한 CONFIG.SYS 파일을 찾아 봐서

    만약 있으면 그 내용을 읽어서 내부 파라메타를 셋팅하고

    선택된 디바이스 드라이버 루틴을 디스크로부터 읽어 들여서 DOS에 연결함으로서 완전한 시스템이 완성된다.

    이제 COMMAND.COM을 로드해서 제어를 넘겨주면 화면상에는 PROMPT와 커서가 나타나면서

    사용자가 명령을 쳐 넣기를 기다리게 되고

    이렇게 하여 짧은 동안에 수많은 일들을 하는 초기화 프로그램의 과정이 끝나는 것이다.


     

    # by 제갈장비 | 2006/09/10 20:28 | 문서-EDPS | 트랙백 | 덧글(0)
    2006년 09월 08일
    컴퓨터 구조
    논리회로
    컴퓨터 시스템의 구성
    중앙처리장치
    기억장치
    입출력장치
    병렬컴퓨터 구조

    PDF파일 : computer_science_ch02.pdf
    # by 제갈장비 | 2006/09/08 13:37 | 문서-EDPS | 트랙백(7) | 덧글(0)
    ◀ 이전 페이지 다음 페이지 ▶

    이글루링크 추가하기
    ()을(를)
    이글루링크로 추가하시겠습니까? 추가하시려면 그룹선택을 하세요.
    (그룹선택 하지 않는 경우, 최상단 목록에 추가됩니다.)
    그룹선택 :
    이글루링크 취소