02.Oracle/DataBase2008. 9. 25. 14:26
반응형

 
사용자 삽입 이미지

MS-SQL 에는 Management Studio 라는 GUI 툴킷이 있습니다.
오라클도 SQL Developer 라는게 있더군요.
기본적으로 설치되지않고 오라클 사이트에서 옵션으로 제공하고 있습니다.

사용자 삽입 이미지

http://www.oracle.com/technology/software/products/sql/index.html

그냥 다운받으면 zip 파일 형태로 제공되는데, 압축을 풀고 sqldeveloper.exe 파일을 실행하면 됩니다.
설치과정이 없더군요.

실행후에 연결 Connection 을 만들어야 합니다.
아래와 같이 하시면 될듯 하네요.
저는 로컬 연결과 학교 데이터베이스 수업에서 쓸 연결, 이렇게 2 개를 만들었습니다.

사용자 삽입 이미지

사용자 삽입 이미지

참고로, 위 스샷은 MS-SQL Management Studio 입니다.
저는 MS-SQL 이 더 편한듯 ;;
Posted by 1010
02.Oracle/DataBase2008. 9. 25. 14:22
반응형
Posted by 1010
01.JAVA/J2me2008. 9. 24. 15:23
반응형
이클립스에서 J2ME를 사용하려면 플러그인을 설치해야 한다.

일단 이클립스를 실행하고, 업데이트를 하자

메뉴>도움말>소프트웨어 갱신>찾기 및 설치 (한글 플러그인 설치 기준)
사용자 삽입 이미지

설치할 새 기능에 대한 검색
사용자 삽입 이미지

기본으로는 이클릅스ME를 지원 안하닌 새 원격 사이트를 눌러 업데이트 사이트를 등록한다.

이름은 아무렇게나 입력해도 된다.
자기만 알아볼 수 있으면~
주소는 http://www.eclipseme.org/updates/
 
사용자 삽입 이미지

이렇게 입력하고 방금 등록한 사이트를 체크하고 완료를 누르면 새 창이 뜬다.

사용자 삽입 이미지

elipseME를 선택하고 다음

사용자 삽입 이미지

승인하고 다음

사용자 삽입 이미지

모두설치하고이클립스를 다시 시작하면 된다.

사용자 삽입 이미지
새 프로젝트 추가에 J2ME가 생겼다.

하지만 바로 실행이 불가능하다.
디바이스를 추가해야 한다.

환경설정으로 가서 디바이스를 추가하자.

메뉴>창>환경설정

J2ME>Device Management

사용자 삽입 이미지

import 버튼 클릭

사용자 삽입 이미지

새로나온창에서 브라우즈 버튼을 클릭해
wtk(wireless tool kit)가 깔린 폴더를 선택하자.

그리고는 refresh 버튼을 누르면 알아서 에뮬레이터들이 검색된다.(다른 에뮬을 깔았으면 알아서 그쪽을 선택하시길~)

완료하고 확인하면 이제부터 eclipseME를 사용할 수 있다.
Posted by 1010
01.JAVA/J2me2008. 9. 24. 15:21
반응형
htt;://sava.sun.com

다운로드 > Java ME

제일위의 최신버전 다운로드

최종 url
https://sdlc2a.sun.com/ECom/EComActionServlet/DownloadPage:~:com.sun.sunit.sdlc.content.DownloadPageInfo;jsessionid=F03563D44F79D5B2037536A1FE7569A1;jsessionid=F03563D44F79D5B2037536A1FE7569A1

사용자 삽입 이미지
Posted by 1010
01.JAVA/J2me2008. 9. 24. 14:29
반응형
1. CLDC 소개
1.1 CLDC 개요
  CLDC(connected limited device configuration)는 앞서 본 바대로 성능이 제한된 CPU나 메모리가 한정적인 시스템을 대상으로 하는 spec이다. CLDC 관련 library는 시스템에 독립적인 고수준의 API 그리고 네트웍관련 API로 되어 있다. 크게 두 가지로 나눌 수 있는데 J2SE에 포함되어 있는 부분과 CLDC에만 있는 부분이다.
J2SE에 포함된 부분
  java.lang
java.util
java.io
CLDC에만 관련된 부분
  javax.microedition.io.*

다음은 CLDC에서 주목해야할 몇 가지 특징들이다.
 부동 소수점을 지원하지 않는다. 
 마무리(finalization)을 지원하지 않는다. 
 에러 처리가 제한적이다. 
 JNI(Java Native Interface)를 지원하지 않는다. 
 리플렉션을 지원하지 않는다. 
 쓰레드 그룹과 데몬 쓰레드를 지원하지 않는다. 
 사용자 정의 클래스 로더를 생성할 수 없다. 
 약한 참조(weak reference)를 지원하지 않는다. 
 클래스 검증과정이 오프디바이스와 온디바이스로 2단계로 나뉘어 졌다. 
 클래스 파일 포맷이 다르고, 클래스 룩업, 클래스 로딩과 링킹 방법이 다르다. 
 모래상자 보안 모델을 사용한다. 
 전혀 다른 네트워킹 및 입출력 모델을 가지고 있다. 
 새로운 애플리케이션 모델을 가정하고 있다.

이러한 특징들은 프로그램밍과 시스템의 설계에 있어서 중요한 항목일 경우가 많다. 따라서 하나하나가 의미하는 바를 잘 알아두어야 한다.

1.2 CDC와 CLDC
  CDC, CLDC가 J2ME에서 configuration이라는 것은 이미 배웠다. 두가지 Configuration의 차이를 아래의 표에서 정리하였다.
구 분
CDC
(Connected Device Configuration)
CLDC 
(Connected, Limited Device Configuration)
Processor
32bit 또는 64bit 16bit 또는 32bit
네트웍
신뢰성 있는 고속 통신망을 사용하고 대개 TCP/IP를 사용한다. 때로는 끊어지기도 하는 저속 통신망을 사용하고 종종 TCP/IP를 사용하지 않는다.
메모리
1MB - 10MB 32KB - 512KB
가상머신
Java Virtual Machine 
또는 Classic Virtual Machine
K Virtual Machine
목표시장
같이 사용하고 고정되어 있으며 상호 연결된 정보 기기들이다. 개인적이고 이동중에 사용하며 상호 연결된 정보 기기들이다.
적용 예
PDA, 스크린폰, 셋탑박스 휴대폰, 무선호출기, 스마트폰, POS 단말기
[ 표 1 - CLDC와 CDC비교 ]

아래의 그림은 이러한 차이를 좀더 그래픽하게 표현하였고 Profile종류도 나타나 있다.
[ 그림 1 - CDC와 CLDC 하드웨어 스펙 ]
1.3 CLDC의 제약
1) 부동소수점을 지원하지 않는다.
  CLDC는 부동소수점을 지원하지 않는다. 이것은 J2SE full spec과 가장 현격한 차이점이기도 하다. 이유는 CLDC 타겟 디바이스가 하드웨어적으로 부동소수점을 지원하지 않기 때문인데, 소프트웨어적으로 부동소수점을 지원하는 것은 너무 큰 부하가 있다. 그래서 언어적인 측면과 가상머신에서 부동소수점은 지원하지 않는다고 명세서에 명시되어 있다. 그러므로, float, double 형과, 부동소수점 리터럴,부동소수점 연산은 사용할 수 없다. 
만일 반드시 부동소수점 연산을 해야 한다면 하드웨어 업체가 제공한 OEM spec에서 기능을 찾아보아야 한다. 만일 거기에도 없다면 소프트웨어적으로 처리해야 한다. 다행스럽게도 이러한 Package가 나와 있는데 정수형 타입으로 부동 소수점형 연산을 시뮬레이션 해주는 것이다. MathFP라고 부르는 이 Package는 다음 URL에서 구할 수 있다. SKVM에서는 이 부분을 아예 OEM Spec에 포함하여 출시하고 있다. 
http://home.rochester.rr.com/ohommes/MathFP 

2) Finalization과 가비지 컬렉션
  CLDC 라이브러리의 Object 클래스에는 finalize() 메소드가 없다. 그러므로, CLDC 가상머신은 클래스 인스턴스를 가비지 컬렉트할 때 finalization을 수행하지 않는다. KVM은 크기가 작고 메모리를 효율적으로 사용하는 가비지 컬렉터를 위해서, 마크-청소(mark-sweep) 알고리즘을 사용하고, 비복사(non-copying), 비압축(non-compacting) 가비지 컬렉터를 사용한다.

3) 에러 처리
  Java에서는 Error 와 Exception 두가지의 예외상황을 처리하는데 Error는 복구할 수 없는 것이고 Exception은 복구가능한 것이다. CLDC는 예외 처리는 지원하지만 에러 처리는 제한적으로 지원한다. 아래와 같이 두가지 Error처리만을 수행하는데 이렇게 대부분의 에러처리가 빠져 버린 이유는 
하나는 에러처리가 대부분 하드웨어에서 처리되기 때문이다. 에러 처리가 일관성이 없는 임베디드 환경에서 대부분의 디바이스들은 에러가 발생했을 때, 그냥 리셋을 해 버린다. 다른 하나는 복구할 수 없는 에러를 처리하기 위해서는 매우 힘이 들기 때문이다. 너무 심한 오버헤드를 초래할 가능성이 높다. 

 java.lang.Error 
 java.lang.VirtualMachineError 
 java.lang.OutOfMemoryError

4) JNI(Java Native Interface)
  CLDC는 JNI를 지원하지 않는다. 네이티브 함수를 호출하는 방법은 CLDC의 구현에 의존적이다. 즉, CLDC를 구현하는 사람에게 달려있다는 것이다. JNI는 덩치가 크기도 하지만, CLDC의 제한적인 보안 모델로 인해, 네이티브 함수의 호출 자체가 위험할 수 있기 때문에 지원하지 않는다.

5) 리플렉션
  리플렉션은 런타임시에 자바 프로그램이 가상머신 내부의 클래스, 인터페이스, 객체 인스턴스들을 조사할 수 있게 하는 자바가상 머신의 특징이다. CLDC에서는 이러한 리플렉션 기능을 지원하지 않는다. 따라서 리플렉션 기능에 의존적인 여러가지 기능들을 지원할 수 없다. RMI, 객체 직렬화, 디버깅 인터페이스(JVMDI), 프로파일러 인터페이스(JVMPI) 등이 그것이다. 한가지 아쉬운 것은 RMI가 지원되지 않으므로, CLDC/MIDP 플랫폼에 지니를 올릴 수 없다는 것이다. 지니가 핸드폰에 탑재되기를 기대하시던 분들에게는 실망스러운 소식일 것이다. 무선 지니 디바이스에 관심이 있는 분이라면, RMI 프로파일이 포함된 CDC/퍼스널 프로파일 플랫폼을 탑재한 단말기를 기대하셔야 할 것 같다.
1.4 주요 특징들
1) 보안 모델
  CLDC 타겟 디바이스에는 J2SE 플랫폼의 정책기반(policy-based) 보안 모델을 적용하기 어렵다. 왜냐하면, CLDC 구현보다 보안 모듈이 훨씬 더 큰, ‘배 보다 배꼽이 더 큰’ 형국이 될 것이기 때문이다. CLDC에서 정의된 보안 관련사항은 다음과 같은 두 가지 수준의 보안에 대한 지원이다.
 동적인 애플리케이션의 다운로드가 가능하다.
    어떤 방법으로든 가상머신 내부에서 동작하는 애플리케이션은 디바이스에 위해한 행위를 할 수 없다.
  클래스 파일 검증기에 의해 검증되어야 한다.
 애플리케이션 레벨 보안
    모래상자 보안 모델의 적용

보안에 관한 한 CLDC는 원시적인 자바의 모습으로 퇴화했는데, CLDC 모래상자 보안 모델은 다음과 같은 요구사항을 만족해야 한다. 
 자바 클래스 파일은 유효한 자바 애플리케이션임이 검증되고 보장되어야 한다.
 애플리케이션 프로그래머는 사전에 미리 정의된 자바 API만을 사용해야 한다.
 자바 애플리케이션의 다운로드와 관리는 네이티브 코드수준에서만 가능하다. 클래스 로딩 메커니즘과 가  상머신의 시스템 클래스를 오버라이딩할 수 없다.
 네이티브 함수를 호출하는 새로운 라이브러리를 사용해서 애플리케이션을 작성할 수 없다.

2) 클래스 검증 과정
  J2SE의 virtual Machine과 같이, KVM에서도 class file의 수행전에 verify하는 과정을 거쳐야 할 필요가 있다. 하지만 JVM의 class file 검증은 과도한 static / dynamic foot print를 사용하기 때문에 좀 더 단순하고, 효율적인 검증과정이 필요로 하게 되었다. 그 solution으로 제시된 것이 OFF-Line 사전검증 과 ON-Line 검증으로 나누어 검증하는 것이다. 

J2SE의 Java Virtual Machine에서 일반적으로 검증기(verifier)는 runtime시 50KB의 binary code space와 30~100 KB의 동적 RAM을 필요로 한다. 게다가 CPU역시 실행 시 반복이 많은 data flow 알고리즘을 가지므로 많은 over head를 가지게 된다. 검증(verify)은 프로그램코드의 이동성을 보장하는 Java VM의 제어장치라고 할 수 있을 것이다. 검증기는 프로그램이 검증을 거쳐서 특정한 규칙을 따르고 있으며, 이 어플리케이션이 실행됨으로써 다른 어플리케이션 및 device의 안전을 보장하는 것이다. 반드시 필요한 반면 위에서 설명하다시피 embedded device에서는 과도한 performance를 요구하게 된다.. 그래서 나눈 것이 사전검증(pre-verify)과 실행 시 검증(verify)이다. 즉 OFF-Line 사전검증 과 ON-Line 검증인 것이다. 

<그림 2>를 보도록 하자. MyApp.java라는 애플리케이션을 작성한 후에 컴파일을 수행하면, MyApp.class라는 클래스 파일을 얻을 수 있다. 이 클래스 파일은 자바 가상머신 명세서에 정의된 클래스 파일 포맷을 따른다. 이 클래스 파일을 사전검증기(preverifier)를 통해 사전검증을 하게 되면, 변경된 MyApp.class 파일을 얻게 된다. 이 때, 이 클래스 파일은 CLDC 명세서에 정의된 클래스 파일 포맷을 따르게 된다. 이렇게 사전검증된 클래스 파일을 디바이스에서 다운로드하여 로딩한 후에는 온-디바이스 검증을 수행한다.

[ 그림 2 - 클래스 파일 검증 과정 ]

검증 과정은 프로그램 코드의 네트웍 이동성을 보장하는 자바 가상머신의 안전장치이다. 
즉, 검증 과정을 통해서 자바 가상머신은 애플리케이션이 특정한 규칙을 따르고 있음을 확인하고, 이 애플리케이션의 수행이 안전함을 보장할 수 있다. 이것은 애플리케이션이 허락되지 않은 위험한 작업을 수행하지 못하도록 함으로써, 시스템의 안정성을 확보하고, 바이러스 등의 위해한 애플리케이션의 등장을 방지할 수 있게 해 준다. 그러나, 검증 알고리즘을 구현하는 것은 약 50K 정도의 코드 공간이 필요하고, 기존의 검증 과정은 실행시 오버헤드도 크다. 그래서, 사전검증과 실행시 검증이라는 새로운 방법을 CLDC에서 도입한 것이다. 
이러한 검증방법을 안전하고 유효하게 만들기 위해서는 몇가지 복잡한 고려를 해야 한다. 그 중에서도 가장 중요한 것은 클래스 파일포맷의 변화이다. 온-디바이스 검증기가 정상적으로 검증을 수행하기 위해서는 사전검증기가 이에 필요한 추가정보를 클래스 파일에 포함시켜야 하고, ‘스택 맵 애트리뷰트’라고 불리는 이러한 추가적인 애트리뷰트를 통해 온-디바이스 검증기는 효율적인 검증을 수행할 수 있다. 추가적인 애트리뷰트로 인해 클래스 파일의 크기는 약 5% 정도 늘어나게 되지만, 온-디바이스 검증기의 크기를 효과적으로 줄일 수 있고, 검증시에 재귀적인 검증을 하지 않고, 1패스 검증을 할 수 있다는 측면에서는 상당한 향상이 있었다고 평가할 수 있다. 

다음은 위에서 설명한 사전검증과 실행시 검증으로 분리된 검증방법의 특징들이다.
 오프-디바이스에서 공간절약적인 처리(스택 맵 생성, 복잡한 바이트코드 제거)
 온-디바이스에서 정확성 체크 : 스푸핑이 불가능
 코드 사이닝이 필요없음(원시적인 모래상자 보안모델 사용)
 온-디바이스 풋프린트 약 10K 요구, 런타임시 상수 공간 100바이트 이하 필요, 선형 처리(재귀적이지 
  않은 1패스 처리)를 통한 검증시간 절약

3) 클래스의 로딩과 링킹
  CLDC 명세는 JAR(Java ARchive) 파일 포맷을 지원을 강제하고, MIDP 명세는 클래스 파일의 배포를 반드시 JAR(Java ARchive) 파일을 통해서만 이루어 지도록 하고 있다. 이것은 JAR 파일의 사용이 약 30~40% 정도의 대역폭 절감 효과가 있기 때문이다. 물론, 이 때 배포되는 JAR 파일에 포함된 클래스 파일들은 사전검증기에 의해 사전검증이 된 클래스 파일이어야 함은 당연하다. 

로딩이란 애플리케이션에서 사용하고자 하는 클래스 파일들을 자바 가상머신으로 전달하는 과정을 말한다. CLDC에서는 JAR 파일의 형태로 네트웍을 통해 전송된 클래스 파일들이 시스템 클래스 로더에 의해 로딩된다. 링킹은 로딩된 클래스 파일, 즉, 바이너리 코드가 자바 가상머신에 의해서 수행될 수 있는 상태로 만드는 과정이다. 이 과정은 로딩된 클래스가 올바른 클래스 포맷을 가지고 있는 지 실행시 검증을 하는 검증(verification) 과정과, 메모리 영역의 할당 등의 예비 과정(preparation), 심볼릭 참조 주소를 직접 참조 주소로 변환하는 결정 과정(resolution) 등으로 세분화할 수 있다. 이 때, 보안상의 이유와 애플리케이션 관리 소프트웨어의 존재로 인해 클래스 파일의 룩업순서가 조금 다르며, 사용자 정의 클래스 로더를 만들 수 없다는 것도 CLDC의 특징이다. 

여기서 한가지 강조하고 싶은 문제는 CLDC 디바이스는 대부분 파일시스템이 없다는 것이다. 그러므로, CLDC 명세도 파일시스템에 대한 고려를 하지 않고 있다. 즉, 플래시 메모리를 주 저장장치로 사용하는 CLDC 디바이스의 경우에, 저장공간은 ROM이 아니면 RAM이라는 것이다. 일반적으로 파일 시스템이 보조 기억장치로서 존재하는 PC 시스템의 경우, 자바 가상머신이 수행될 때, 먼저 자바 가상머신이 파일 시스템으로부터 메모리로 올려 진다. 그리고, 클래스 로더가 필요한 시스템 클래스 파일들을 파일시스템으로부터 메모리로 로딩한다. 그리고 나서, 필요한 사용자 정의 클래스 파일들을 파일시스템으로부터 메모리로 로딩한다. 그런데, CLDC 디바이스에서는 가상머신과 시스템 클래스 파일들이 이미 메모리에 존재한다. 그런데, 굳이 로딩과 링킹, 초기화라는 불필요한 절차를 거칠 필요가 있을까? 로마이징(ROMizing)은 이처럼 특정 클래스들을 사전에 미리 로딩하고 링킹해 놓음으로써 애플리케이션의 속도 향상을 가져올 수 있는 기법을 의미한다. CLDC 명세에서는 사전로딩/사전링킹을 통한 로마이징을 구현에 의존적인 기능으로 정의하고 있다. 

4) CLDC 라이브러리
  자바와 관련한 신기술이 발표될 때 마다, 함께 쏟아져 나오는 API들은 늘 신선함과 함께 부담감으로 작용한다. 필자는 개인적으로 선이 이룩한 가장 기념비적인 업적 중의 하나가 javadoc이라는 문서화 툴의 확산이라고 생각한다. 만일, 그토록 많은 API들의 홍수 속에 살면서, javadoc에 의한 편리하고, 보편적인 문서화가 이루어지지 않았다면, 많은 사람들이 자바를 외면했을 것이라는 생각을 해 본다. 그럼에도 불구하고, 매번 새로운 API를 접하는 것은 상당히 부담스러운 일이다. 그러므로, CLDC에서도 가능하면 모든 API들이 기존의 J2SE API의 서브셋이기를 바라는 것이 자바 개발자들의 공통된 요구일 것이다. 하지만, MIDP를 통해서 더욱 확실히 느끼게 되겠지만, 기존 API와의 호환성은 잊어버리는 게 좋을 정도로 많은 API들이 재정의되었다. 재사용 가능한 API들이라고는 다음 세 가지의 패키지들 중에서도 일부일 뿐이다. 각각의 패키지에 포함된 클래스들은 [표 2]에 정리하였다. 

java.lang 패키지
java.util 패키지
java.util 패키지
시스템 클래스 
java.lang.Object 
java.lang.Class 
java.lang.Runtime 
java.lang.System 
java.lang.Thread 
java.lang.Runnable 
java.lang.String 
java.lang.StringBuffer 
java.lang.Throwable 

데이터 타입 클래스
 
java.lang.Boolean 
java.lang.Byte 
java.lang.Short 
java.lang.Integer 
java.lang.Long 
java.lang.Character 

수학 클래스 
java.lang.Math
컬렉션 클래스 
java.util.Vector 
java.util.Stack 
java.util.Hashtable 
java.util.Enumeration 

날짜관련 클래스 
java.util.Calendar 
java.util.Date 
java.util.TimeZone 

유틸리티 클래스 
java.util.Random 

입출력 클래스 
java.io.InputStream 
java.io.OutputStream 
java.io.ByteArrayInputStream 
java.io.ByteArrayOutputStream 
java.io.DataInput 
java.io.DataOutput 
java.io.DataInputStream 
java.io.DataOutputStream 
java.io.Reader 
java.io.Writer 
java.io.InputStreamReader 
java.io.OutputStreamWriter 
java.io.PrintStream
[ 표 2 - CLDC 라이브러리 ]

5) 프로퍼티
  [표 2]에서 java.util.Properties를 찾아 보면 찾을 수 없을 것이다. 즉, CLDC에서는 프로퍼티 기능을 지원하지 않는다는 것이다. 다만, System.getProperty(String key) 메소드를 통해서 시스템 프로퍼티에 접근할 수는 있다. 하지만, setProperty() 메소드는 지원되지 않는다는 것을 확인하기 바란다. 그러므로, 애플리케이션 개발자는 시스템 프로퍼티를 변경하거나 새로운 프로퍼티를 생성할 수는 없다. [표 3]은 CLDC에서 정의하는 시스템 프로퍼티들이다. MIDP에서는 지역화를 고려하여 locale 프로퍼티를 추가하였다. 

명세서
프로퍼티 키
설 명
CLDC
microedition.platform 호스트 플랫폼 혹은 디바이스의 이름 BI-Generic
CLDC
microedition.encoding 디폴트 캐릭터 인코딩 EUC-KR
CLDC
microedition.configuration 지원 컨피큐레이션 이름-버전 CLDC-1.0
CLDC
microedition.profiles 지원 프로파일 이름-버전 MIDP-1.0
MIDP
microedition.locale 디바이스의 현재 로캘 ko-KR
[ 표 3 - 시스템 프로퍼티 ]

6) 국제화/지역화
  국제화/지역화의 지원은 아직 CLDC/MIDP에서는 제대로 지원을 보장하지 못하고 있다. CLDC에서 유니코드 문자를 바이트로 변환해 주는 변환기를 제한적으로 지원할 뿐이다. 이러한 국제화 지원은 Reader와 Writer를 통해서 이루어지고, 각각에 대해서는 다음과 같은 생성자에서 두 번째 인자로 인코딩 방법을 지정함으로써 코드 변환을 할 수 있다. 

    new InputStreamReader(InputStream is, String name) 
    new OutputStreamWriter(OutputStream os, Striing name) 

ISO8859_1 이외의 인코딩 방법에 대해서는 기본적으로 CLDC/MIDP 구현자에게 의존적이며, 날짜, 시간, 통화 등의 포맷에 관련한 지역화에 대해서도 MIDP 구현에 의존적이다. 국제화/지역화 문제는 <표 3>에서와 같이 시스템 프로퍼티에 한글 인코딩과 한국의 로캘을 지정하고, 코드 변환기와 포맷 변화기가 완전히 구현되어야 한다. 선 마이크로시스템즈의 CLDC 1.0 베타와 MIDP Early Access 1에서는 한글 및 지역화 지원이 완벽하지 않다고 한다. 그러나 조만간에 이 문제는 해결이 될 것이라 생각된다. 

7) 애플리케이션 관리 메커니즘
  이 글의 서두에서 모바일 솔루션으로서의 자바의 특장점 중의 하나가 애플리케이션의 동적인 다운로드 기능이라고 했다. 자바 애플릿을 떠올린 분들이 많으실텐데, 이것은 커다란 오해다. CLDC/MIDP 플랫폼에서는 완전히 새로운 애플리케이션 모델을 제시하고 있다. ‘애플리케이션 관리 소프트웨어’라고 불리는 새로운 소프트웨어의 등장은 애플릿과 애플리케이션의 혼합, 혹은 자바 플러그-인의 확장이라고 할 수 있는, 새롭지만, 그리 낯설지 않은 애플리케이션의 배포와 관리 메커니즘을 제공하고 있다. CLDC는 단지 이러한 애플리케이션 관리 소프트웨어의 존재에 대해서만 가정하고 있으며, 실질적인 애플리케이션 모델에 대한 정의는 MIDP에서 이루어 지고 있으므로, 나중에 이 부분을 자세히 살펴보도록 하자.

8) Generic Connection Framework
  CLDC에서는 확장 패키지에 포함될 클래스를 정의하는 부분이 있다. javax.microedition.io 패키지가 그것인데, 여기에는 Generic Connection Framework(이하, 커넥션 프레임웍)이라고 이름이 붙은 네트워킹과 입출력에 대한 상위 수준의 프레임웍에 대한 인터페이스 정의가 포함되어 있다. 

왜 전혀 새로운 네트워킹과 입출력 프레임웍을 정의해야만 했는가? 이에 대한 해답은 다시 메모리의 제약으로 돌아간다. 기존의 java.net 패키지와 java.io 패키지는 덩치가 너무 크다. 100개 이상의 클래스와 200K 이상의 크기를 가진 이 패키지들은 CLDC 디바이스들에는 적합하지 않다. 게다가, TCP/IP, WAP, iMode, IrDA, Bluetooth라는 새로운 통신방법에 대한 지원과, 파일 시스템이 존재하지 않는 입출력 메커니즘을 하나로 통합할 필요성이 존재했다. 그리고, 그 방법으로 새로운 프레임웍의 정의를 선택한 것이다. 다음은 커넥션 프레임웍의 설계목표이다. 
 서로 다른 형태의 입출력 형태를 일관성있게 지원한다.
 서로 다른 형태의 프로토콜을 일관성있게 지원한다.
 애플리케이션의 포터빌리티를 향상시킨다.
 표준 자바 클래스 라이브러리와의 상위 호환성을 가진다.
 더 작은 메모리 풋프린트를 가진다.

CLDC의 커넥션 프레임웍은 네트웍과 입출력을 포함한 모든 연결의 생성에 대해서 다음과 같은 형태의 일관성을 제공한다. 

Connector.open(“<protocol>:<address>”); 

이 일관성의 핵심은 Connector 클래스만으로 모든 연결을 생성할 수 있으며, open() 메소드의 인자를 변경함으로써 연결의 형태를 바꿀 수 있다는 데에 있다. 연결이 성공적이었다면, open() 메소드는 커넥션 프레임웍의 인터페이스들을 구현한 클래스의 인스턴스를 리턴한다. <그림 3>은 커넥션 프레임웍의 계층도에 대해 보여주고 있다. 그리고, <표 5>는 Connector 클래스를 이용해서 여러 프로토콜의 연결을 생성하는 예를 보여주고 있다.
통신 방법
연결 예제
HTTP 레코드 Connector.open(“http://www.javaline.co.kr”)
FTP 레코드 Connector.open(“ftp://www.javaline.co.kr”);
소켓 Connector.open(“socket://10.1.7.1:9192”)
커뮤니케이션 포트 Connector.open(“comm:9600:18N”)
데이터그램 Connector.open(“datagram://10.1.7.1”)
파일 Connector.open(“file:/maso.doc”)
네트웍 파일 시스템 Connector.open(“nfs:/10.1.7.1/maso.doc”)
적외선 통신
Connector.open(“irda://”)
[ 표 4 - 프로토콜별 연결생성 예 ]

한 가지 분명히 해 두어야 할 것은 CLDC는 Connector 클래스를 포함해서, 어떠한 실제 구현에 대한 명세도 포함하지 않는다는 점이다. 커넥션 프레임웍은 단지 프레임웍만을 제공할 뿐, 실질적으로 지원할 프로토콜에 대한 정의와 구현은 프로파일의 몫이며, MIDP에서는 HTTP 프로토콜의 지원에 대해서 정의하고 있다. MIDP의 HTTP 지원은 나중에 다시 살펴보도록 하자.
IONETKOREA E&D 연구소 제공 
Posted by 1010
01.JAVA/J2me2008. 9. 24. 14:27
반응형

Java의 모든 원천 기술은 Sun Microsystems에서 갖고 있으며 다음과 같이 총 3가지 스펙으로 나누어 집니다.   

   ① J2EE (Java 2 Platform, Enterprise Edition)
   ② J2SE (java 2  Platform, Standard Edition)
   ③ J2ME (Java 2 Platform, Micro Edition) 

입니다.

그 중에 J2ME는 엔터프라이즈급을 위한 J2EE와, 일반 PC를 위한 J2SE에 바탕을 두고 
정의되었으며, 휴대폰이나 PDA 셋톱박스처럼 휴대용의 작은 기기에 적합한, 동적인 네트웍크 
기반의 어플리케이션을 개발 할 수 있도록 설계되었습니다.

그러면 이제 J2ME를 세분화 해 보도록 하겠습니다.
J2ME를 세분화 하면 다음과 같이 총 3 가지로 세분화 할 수 있습니다.

   ① CVM
   ② KVM
 
  ③ Card VM

위와 같이 3가지로 세분화 시켜놓은 것은 VM(Virtual Machine) 에 따라서 구분을 해 놓은 것입니다.

다시 위의 3가지를 자세하게 설명하면 다음과 같습니다.

   ▣ CVM (Classic Virtual Machine)
CVM은 디지털 셋탑박스, TV등을 위한 컨피규레이션인 CDC(Connected Device Configuration)와 Personal Profile, Foundation Profile, Personal Basis Profile 로 구성됩니다.CVM은 32비트 이상의 프로세서를 가진 디바이스에서 사용됩니다.

즉 CVM 은 밑에서 설명할 KVM을 사용하는 디바이스 보다 덜 제한적인, 즉 조금 더 큰 용량의 디바이스에서 이용될 수 있습니다.

   ▣ KVM (Kilobyte Virtual Machine)   
소형 컴퓨팅 장비들을 위한 J2ME 의 가상 머신입니다. 이 KVM은 휴대폰 이나 PDA , 페이져 등을 위한 컨피규레이션인 CLDC(Connected, Limited Device Configuration)와  MIDP(Mobile Information Device Profile)로 이루어져 있습니다.

   ▣ Card VM
자바 카드를 위한 VM 입니다.

자 ~ ! 위와 같이 정리를 해 놓고 보니 이제 J2ME 라는 녀석이 한눈에 들어오는 느낌이 드실겁니다. 그러면 이제는 우리가 앞으로 집중적으로 공부를 해야할 KVM에 대해서 조금만 더 알아봅시다.

KVM은 휴대폰을 위한 스펙으로 J2ME를 대표하는 솔루션으로 세계 무선 인터넷 플랫폼 시장에서 그 위치가 확고하다고 볼 수 있습니다. 우리나라에서도 SK 텔레콤과 LG텔레콤을 통해 제공되고 있으며, 또한 우리나라에서 독자적으로 개발한 "대한민국 무선 인터넷 플렛폼 "WIPI" 와도 100 % 호환됩니다.

즉 한번 작성한 J2ME 어플리케이션은 자바를 지원하는 전 세계의 대부분의 폰에서 그대로 작동되는 이점을지니고 있다는 겁니다.

CLDC와 MIDP 에 대한 간단한 설명은 다음과 같습니다

CLDC 는 Connected Limited Device Configuration 의 약자 입니다.

여기서 맨 마지막 단어인 Configuration 은 비슷한 특성을 가지는 디바이스들이 
가져야될 최소한의 요구사항에 대한 정의 라고 할 수 있습니다.

즉 J2ME자체가 모바일과 같은 제한된 환경의 디바이스들을 위한 표준 스펙이라고 한다면, 다시 그 J2ME 내부에서도 핸드폰과 같은 아주 극한된 환경을 가지고 있는 디바이스들이 가져야 될 최소한의 요구사항을 정의하는 Configuration을 CDDC라고 하고, 핸드폰보다는 좀 더 여유로운 환경을 가지고 있는 셋톱박스와 같은 디바이스 내에서  가져야 할 최소한의 요구사항을 정의하는 Configuration을 CDC 라고 합니다.

이제 CLDC를 좀 더 살펴보도록 하겠습니다.

CLDC가 대상으로 하는 디바이스에는 핸드폰 이나 PDA, 양방향페이져 등이 있습니다.
이들은 모두 네트워크에 연결될 수 있고, 극히 제한적인 리소스를 가진 디바이스라는
공통점이 있습니다. 하지만 이러한 공통점 만으로 이들을 하나의 범주로 묶을 수는 없습니다.
예를 들면 핸드폰과 양방향 페이져 등은 디스플레이 창의 크기도 다르며, 사용자의 입력을
처리하는 방법도 천차만별입니다.

즉 공통적인 특성을 가진 디바이스라 할지라도 특정 부분에 대해서는 다른 특성을 가진다는
사실은 어쩔 수 없는 것입니다. 즉 이러한 차이점을 Profile 인 MIDP가 맡게 되는 겁니다.

다시한번 말씀드린다면 Configuration은 최소한의 정의만 하고, 실제 구현이나 확장은
Profiles 에서 담당한다고 할 수 있는 겁니다.

Posted by 1010
반응형

Digester를 이용한 Naver Open API Java Client 모듈

 

네이버 Open API Cafe에서 검색 API의 Java Client 모듈을 보게 되었습니다.

http://cafe.naver.com/ArticleRead.nhn?clubid=11906219&amp;amp;page=1&amp;amp;menuid=3&amp;amp;boardtype=L&amp;amp;articleid=1372

http://insford.tistory.com/116

위의 모듈을 참고해서 같은 역할을 하는 모듈을 다르게 구현해봤습니다.

 

특징은 아래와 같습니다.

  •  RSS를 파싱하는 부분을 XML parsing API로 널리 알려진 Digester(http://commons.apache.org/digester/)를 사용했습니다. Digester의 예제 코드로 제공되는 RSS파싱모듈을 그대로 써서 짧은 코드로 파싱이 가능했습니다. 사용한 모듈의 API문서는 다음의 링크에서 볼 수 있습니다.

      (RSSDigester , Channel , Item)

  • 요청 파라미터를 담는 클래스를 따로 뺐습니다.  (RequestParameter.java) 이중 Target 값은 (blog, news 등 검색할 컨텐츠 유형을 선택하는 파라미터입니다.) enum으로 해서 정해진 값이 아닐 경우 compile이 안 되게 했습니다.
  • open API key값은 필수값이므로 OpenApiClient클래스의 생성자의 파라미터로 받았습니다. 대신 키 값이 없이 이 객체가 생성될 수 없도록 default 생성자는 private으로 돌려놨습니다.

 

첨부한 파일은 이클립스에서 Dynamic Web Project로 생성한 폴더를 압축한 것입니다. 테스트 실행 서버는 Tomcat 5.5를 사용했습니다. Eclipse WTP가 설치되어 있는 환경이면 실행이 가능합니다. 그리고 enum을 썼기에 Java5이상이어야 합니다.

 

Open API에 대한 자세한 사용법은 http://openapi.naver.com/index.nhn 를 참조하시면 됩니다.

 

소스코드

전체 소스와 라이브러리 다운받기 : openApiTest.zip 

 

package openapiclient;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

import org.apache.commons.digester.rss.Channel;
import org.apache.commons.digester.rss.RSSDigester;

public class NaverSearchClient {
 
 private static final String OPEN_API_URL = "http://openapi.naver.com/search";
 private String key;
 
 @SuppressWarnings("unused")
 private NaverSearchClient(){};
 
 public NaverSearchClient(String key){
  this.key = key;
 }
 public Channel search(RequestParameter param) throws Exception{
  RSSDigester digester = new RSSDigester();
  URL requestUrl = getRequestUrl(param);
  InputStream is = requestUrl.openConnection().getInputStream();
  return (Channel) digester.parse(is);
 }

 private URL getRequestUrl(RequestParameter param) throws UnsupportedEncodingException, MalformedURLException {
  StringBuffer serverUrl = new StringBuffer(OPEN_API_URL);
  serverUrl.append("?target=" + param.getTarget());
  serverUrl.append("&key=" + key);
  serverUrl.append("&start=" + param.getStart());
  serverUrl.append("&display=" + param.getDisplay());
  serverUrl.append("&query=" + URLEncoder.encode(param.getQuery(), "UTF-8"));
  if(param.getSort()!=null) serverUrl.append("&sort=" + param.getSort());
  return new URL(serverUrl.toString());
 }
}

 

 

 package openapiclient;

public class RequestParameter {
 
 public enum Category{
  KIN,BLOG,CAFE,DOC,WEBKR,BOOK, SHOP, ENCYC,
  KRDIC, JPDIC, ENDIC, NEWS, LOCAL, VIDEO,IMAGE;  
  public String toString(){
   return super.toString().toLowerCase();
  }
 }

 private Category target;
 private String sort;
 private int start;
 private int display;
 private String query;

 // getter and setters 생략
 }

 

JSP에서 사용한 예제

JSTL을 함께 사용해서 찍어본 예제입니다. http://openapi.naver.com/index.nhn 에 가셔서 API key를 발급 받으시고 소스 중간에 밑줄로 표시된 부분에 그 값을 넣으시고 돌려주시면 됩니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"   pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="openapiclient.RequestParameter" %>
<%@ page import="openapiclient.NaverSearchClient" %>
<%@ page import="org.apache.commons.digester.rss.Channel" %>
<%
 String KEY = "????"; // Open API key값을 넣으세요
 NaverSearchClient client = new NaverSearchClient(KEY);
 RequestParameter param = new RequestParameter();
 param.setDisplay(10);
 param.setStart(1);
 param.setQuery("미역국");
 param.setTarget(RequestParameter.Category.NEWS);
 Channel result = client.search(param);
 result.render(System.out); // 콘솔에 받아온 내용을 확인삼아 찍어봄
 request.setAttribute("result", result);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Naver Open API를 이용한 검색</title>
</head>
<body>
<c:forEach var='item' items='${result.items}'>
  <p>
  <a href="${item.link}"> ${item.title} </a> <br/>
  ${item.description}
  </p>
</c:forEach>
</body>
</html>

 

실행결과화면

  openApiClient.JPG

 

Posted by 1010
98..Etc/Etc...2008. 9. 17. 17:15
반응형
 

이지 웹에디터(DHTML wysiwyg 웹에디터)

소개

개요

  • 게시판, 사용자 입력폼등에 삽입하여 손쉬운 웹문서편집을 도움
  • 타 위지윅 에디터에 비해 가볍고, 간단함 (easy)

특징

  • 원하는 명령만 손쉽게 삽입 가능
  • 버튼이미지 변경, 변수 컬러값 변경등 으로 손쉬운 스킨 변경
  • 동일한 하나의 문서에 여러개의 웹에디터 삽입 가능
  • 자바스크립트로만 개발되어 가볍고 커스트마이징 용이
  • 사용자추가기능 손쉬운 개발 가능 (플러그인 형태)
  • 테스트 브라우저 : IE6, IE7, FF1.5.X
  • 모든 서버사이드스크립트(PHP,ASP,JSP)에 적용 가능

라이센스 관련

  • 누구나,어디서나 무료로 사용 가능
  • 배포,수정 재배포,판매 가능
  • 단, '물음표아이콘(about.gif)' 기능 수정,삭제 불가능

설치 방법

준비작업

기본 파일설명

  • [img] - 이미지파일 디렉토리
  • ex.html - '이지웹에디터' 삽입방법 테스트 파일 (동작과 상관없음)
  • easyEditor.js - 자바스크립트 모듈 파일 (환경변수 참고)
  • table.html - 테이블삽입 폼 HTML 파일

예제 소스

  • 예제 실행
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <html> <head> <script type="text/javascript">if (!window.T) { window.T = {} } window.T.config = {"TOP_SSL_URL":"https://www.tistory.com","PREVIEW":false,"ROLE":"guest","PREV_PAGE":"","NEXT_PAGE":"","BLOG":{"id":218144,"name":"webprogrammer","title":"개발자(開發者) a developer","isDormancy":false,"nickName":"1010","status":"open","profileStatus":"normal"},"NEED_COMMENT_LOGIN":false,"COMMENT_LOGIN_CONFIRM_MESSAGE":"","LOGIN_URL":"https://www.tistory.com/auth/login/?redirectUrl=http://webprogrammer.tistory.com/category","DEFAULT_URL":"https://webprogrammer.tistory.com","USER":{"name":null,"homepage":null,"id":0,"profileImage":null},"SUBSCRIPTION":{"status":"none","isConnected":false,"isPending":false,"isWait":false,"isProcessing":false,"isNone":true},"IS_LOGIN":false,"HAS_BLOG":false,"IS_SUPPORT":false,"IS_SCRAPABLE":false,"TOP_URL":"http://www.tistory.com","JOIN_URL":"https://www.tistory.com/member/join","PHASE":"prod","ROLE_GROUP":"visitor"}; window.T.entryInfo = null; window.appInfo = {"domain":"tistory.com","topUrl":"https://www.tistory.com","loginUrl":"https://www.tistory.com/auth/login","logoutUrl":"https://www.tistory.com/auth/logout"}; window.initData = {}; window.TistoryBlog = { basePath: "", url: "https://webprogrammer.tistory.com", tistoryUrl: "https://webprogrammer.tistory.com", manageUrl: "https://webprogrammer.tistory.com/manage", token: "JIGek6cVEb11n1iNSJlxZfI2oBTe+3509fmbhBajdkyXahJ4iJ+8MDPvGourKURv" }; var servicePath = ""; var blogURL = "";</script> <script> function chkForm(f) { var content = ed.getHtml(); //대체한 textarea에 작성한HTML값 전달 if(content=="") { alert("내용을 적어주세요!"); ed.focus(); return false; } alert(content); //값확인(디버깅) return true; } </script> <link rel="stylesheet" type="text/css" href="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-39ee03342e373848ba7c0bb12e153b29db04aa6b/static/style/revenue.css"/> <link rel="canonical" href="https://webprogrammer.tistory.com"/> <!-- BEGIN STRUCTURED_DATA --> <script type="application/ld+json"> {"@context":"http://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":0,"item":{"@id":"https://webprogrammer.tistory.com/396","name":"[Oracle] SQL Developer"}},{"@type":"ListItem","position":1,"item":{"@id":"https://webprogrammer.tistory.com/395","name":"테이블조인"}},{"@type":"ListItem","position":2,"item":{"@id":"https://webprogrammer.tistory.com/394","name":"이클립스에서 J2ME 환경구축"}},{"@type":"ListItem","position":3,"item":{"@id":"https://webprogrammer.tistory.com/393","name":"다운로드 &gt; Java ME"}},{"@type":"ListItem","position":4,"item":{"@id":"https://webprogrammer.tistory.com/392","name":"1. CLDC 소개"}},{"@type":"ListItem","position":5,"item":{"@id":"https://webprogrammer.tistory.com/391","name":"J2ME, CLDC와 MIDP에 대한 간단한 차이점 비교"}},{"@type":"ListItem","position":6,"item":{"@id":"https://webprogrammer.tistory.com/390","name":"Digester를 이용한 Naver Open API Java Client 모듈"}},{"@type":"ListItem","position":7,"item":{"@id":"https://webprogrammer.tistory.com/389","name":"이지 웹에디터"}},{"@type":"ListItem","position":8,"item":{"@id":"https://webprogrammer.tistory.com/388","name":"그누보드4 설치방법"}},{"@type":"ListItem","position":9,"item":{"@id":"https://webprogrammer.tistory.com/387","name":"java 환경설정"}},{"@type":"ListItem","position":10,"item":{"@id":"https://webprogrammer.tistory.com/386","name":"CVS 사용에 대한 FAQ 모음"}},{"@type":"ListItem","position":11,"item":{"@id":"https://webprogrammer.tistory.com/385","name":"linux cvs 설치 및 프로젝트 적용"}},{"@type":"ListItem","position":12,"item":{"@id":"https://webprogrammer.tistory.com/384","name":"CVSNT 서버 설치 매뉴얼"}},{"@type":"ListItem","position":13,"item":{"@id":"https://webprogrammer.tistory.com/383","name":"셀렉트박스 모든것..."}},{"@type":"ListItem","position":14,"item":{"@id":"https://webprogrammer.tistory.com/382","name":"html 다중 셀렉트 박스"}},{"@type":"ListItem","position":15,"item":{"@id":"https://webprogrammer.tistory.com/381","name":"다섯 개의 추천할 만한 Ajax 위젯"}},{"@type":"ListItem","position":16,"item":{"@id":"https://webprogrammer.tistory.com/380","name":"oracle JDBC Driver Downloads"}},{"@type":"ListItem","position":17,"item":{"@id":"https://webprogrammer.tistory.com/379","name":"인터넷빠르게하는 팁.."}},{"@type":"ListItem","position":18,"item":{"@id":"https://webprogrammer.tistory.com/376","name":"무버블타입에 FCKeditor 장착 플러그인"}},{"@type":"ListItem","position":19,"item":{"@id":"https://webprogrammer.tistory.com/375","name":"java.lang.UnsupportedClassVersionError"}},{"@type":"ListItem","position":20,"item":{"@id":"https://webprogrammer.tistory.com/374","name":"Using FCKeditor in JSP web pages"}},{"@type":"ListItem","position":21,"item":{"@id":"https://webprogrammer.tistory.com/373","name":"FCKeditor Django Connector"}},{"@type":"ListItem","position":22,"item":{"@id":"https://webprogrammer.tistory.com/371","name":"jsp에서 RSS 읽어들이는 방법을"}},{"@type":"ListItem","position":23,"item":{"@id":"https://webprogrammer.tistory.com/370","name":"이지웍에디터 FCKEditor 설치 및 사용"}},{"@type":"ListItem","position":24,"item":{"@id":"https://webprogrammer.tistory.com/368","name":"JVM terminated. Exit code=1073807364"}},{"@type":"ListItem","position":25,"item":{"@id":"https://webprogrammer.tistory.com/367","name":"eclipse mem 문제..."}},{"@type":"ListItem","position":26,"item":{"@id":"https://webprogrammer.tistory.com/366","name":"JSP 웹서버 셋팅 정리 문서"}},{"@type":"ListItem","position":27,"item":{"@id":"https://webprogrammer.tistory.com/365","name":"fckeditor 2.6 파일 업로드 버그"}},{"@type":"ListItem","position":28,"item":{"@id":"https://webprogrammer.tistory.com/364","name":"웹개발시 종종 필요로 하는 웹기반 HTML에디터.."}},{"@type":"ListItem","position":29,"item":{"@id":"https://webprogrammer.tistory.com/363","name":"FCKeditor 이미지 업로드"}}]} </script> <!-- END STRUCTURED_DATA --> <link rel="stylesheet" type="text/css" href="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-39ee03342e373848ba7c0bb12e153b29db04aa6b/static/style/dialog.css"/> <link rel="stylesheet" type="text/css" href="//t1.daumcdn.net/tistory_admin/www/style/top/font.css"/> <link rel="stylesheet" type="text/css" href="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-39ee03342e373848ba7c0bb12e153b29db04aa6b/static/style/postBtn.css"/> <link rel="stylesheet" type="text/css" href="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-39ee03342e373848ba7c0bb12e153b29db04aa6b/static/style/tistory.css"/> <script type="text/javascript" src="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-39ee03342e373848ba7c0bb12e153b29db04aa6b/static/script/common.js"></script> </head> <body> <form onsubmit="return chkForm(this)"> 제목 : <input type="text" name="title"> <br /> 내용 : <input type="submit" value="전송"> <script> var ed = new easyEditor("content"); //초기화 id속성값 ed.init(); //웹에디터 삽입 </script> </form> <div style="margin:0; padding:0; border:none; background:none; float:none; clear:none; z-index:0"></div> <script type="text/javascript" src="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-39ee03342e373848ba7c0bb12e153b29db04aa6b/static/script/common.js"></script> <script type="text/javascript">window.roosevelt_params_queue = window.roosevelt_params_queue || [{channel_id: 'dk', channel_label: '{tistory}'}]</script> <script type="text/javascript" src="//t1.daumcdn.net/midas/rt/dk_bt/roosevelt_dk_bt.js" async="async"></script> <script>window.tiara = {"svcDomain":"user.tistory.com","section":"기타","trackPage":"글뷰_보기","page":"글뷰","key":"218144","customProps":{"userId":"0","blogId":"218144","entryId":"null","role":"guest","trackPage":"글뷰_보기","filterTarget":false},"entry":null,"kakaoAppKey":"3e6ddd834b023f24221217e370daed18","appUserId":"null"}</script> <script type="module" src="https://t1.daumcdn.net/tistory_admin/frontend/tiara/v1.0.5/index.js"></script> <script src="https://t1.daumcdn.net/tistory_admin/frontend/tiara/v1.0.5/polyfills-legacy.js" nomodule="true" defer="true"></script> <script src="https://t1.daumcdn.net/tistory_admin/frontend/tiara/v1.0.5/index-legacy.js" nomodule="true" defer="true"></script> </body> </html>

소스 설명

  • 3 줄: 삽입할 HTML문서내에 자바스크립트 모듈 호출
  • 21 줄: 대체할 textarea 태그에 id 속성 부여 (값은 유니크해야 함, name속성값과 동일 권장)
  • 23~26 줄: id속성값을 인자로 하여 인스턴스 생성후 '이지웹에디터' 삽입스크립트 호출 ( ed 라는 인스턴스명 유니크 해야함)
  • 7 줄: ed.getHtml() 호출하여 대체한 textarea에 편집한 HTML값 전달

사용 예제

게시판 사용예제

변수 사용예제

  • 예제 실행 <script> var ed = new easyEditor("content"); ed.cfg.width = "300px"; //가로 설정 (디폴트 100%) ed.cfg.height = "300px"; //세로 설정 (디폴트 200px) ed.cfg.border = "4px solid green"; //웹에디터 보더 설정 (css) ed.cfg.Btn = easyConfig.BtnTemplate["simple"]; //명령버튼셋 simple로 설정 (디폴트 all) ed.init(); </script>
  • 예제 실행 <script> var ed = new easyEditor("content"); ed.cfg.width = "500px"; //가로 설정 (디폴트 100%) ed.cfg.height = "400px"; //세로 설정 (디폴트 200px) ed.cfg.border = "1px dashed red"; //웹에디터 보더 설정 (css) ed.cfg.Btn = ["bold","underline","strike"]; //명령버튼셋 세팅 ed.init(); </script>
  • 예제 실행 <script> var ed = new easyEditor("content"); ed.cfg.imgpath = "./img/flat"; ed.cfg.over_bordercolor = "#facf98"; //버튼마우스 오버시 border컬러 ed.cfg.over_bgcolor = "#ffffea"; // 버튼 마우스 오버스 bg컬러 ed.cfg.divbtn_bgcolor = "#e7e7e7"; // 버튼 영역 div bg컬러 ed.init(); </script>

명령버튼 추가하기

특징

  • 원하는 기능의 명령버튼 추가 가능 (사용자 생성함수 호출)
  • 사용 가능예) 이모티콘삽입, 특수문자 삽입, 이미지업로드 첨부 등
  • 추가 개발 배포 예정
  • easyEditor.js 파일 하단에 명령추가행 참고

예제소스

  • easyConfig.BtnList.{명령어} = ["{명령어설명}","{버튼이미지명}", {실행함수선언}];
    easyConfig.BtnList.table = ["테이블 삽입","table.gif", function (self){ window.open(easyConfig.filepath+"/table.html","table","width=400,height=220,status=1"); } ];

이미지 업로드 명령 예제





Posted by 1010
98..Etc/Etc...2008. 9. 17. 17:05
반응형

그누보드4 설치방법

그누보드4를 설치하는 방법에는 ftp로 조금 불편하게 설치하는 방법Telnet(또는 SSH)으로 조금 편하게 설치하는 방법이 있습니다.

이 두가지 모두에 대해 설치하는 방법을 알려드립니다. 단, Telnet(또는 SSH)은 서버에 따라 지원되지 않는 경우도 있습니다.

1. ftp로 조금 불편하게 설치하는 방법

ftp 프로그램이 설치되어 있지 않다고 가정하고 ftp 프로그램부터 설치하도록 하겠습니다.

http://sir.co.kr/data/util/FileZilla_2_2_32_setup.exe 에서 파일질라 프로그램을 다운로드 한 후 설치합니다.

다운로드 해 놓은 그누보드4의 압축을 해제합니다.
압축 프로그램은 알집을 사용하였습니다. (http://www.altools.co.kr)

"현재폴더에 압축풀기"하면 gnuboard4 폴더로 압축이 해제됩니다.

ftp 프로그램도 설치가 되었고, 업로드 할 프로그램도 준비가 되었습니다.
이제 프로그램을 설치할 웹서버(웹호스팅)로 업로드 하도록 하겠습니다.
파일질라를 실행합니다.

위와 같이 ftp 주소와 사용자 ID(계정아이디), 비밀번호를 입력한 후 빠른 접속을 클릭합니다.

접속을 한 후 실제 브라우저에서 실행할 폴더로 이동합니다.
보통 www 또는 public_html 폴더라는 이름으로 되어 있습니다.

gnuboard4 폴더를 원격 사이트로 드래그 합니다.

업로드 하는 시간은 그리 길지 않습니다. 인터넷 회선 속도에 따라 차이가 있으며 100M 광랜의 경우 1분정도 걸립니다.

업로드가 다 되었다면 상위 폴더(..)로 이동하여 gnuboard4 폴더가 보이도록 합니다.
오른쪽 마우스 버튼을 누르면 파일 속성이라는 메뉴가 보일 것입니다. 이 메뉴를 클릭합니다.

gnuboard4 폴더(디렉토리)의 속성(퍼미션)을 777 로 설정합니다. 그리고 확인을 클릭합니다.

자 이제 그누보드4를 설치할 준비는 모두 마쳤습니다.
이제 브라우저를 열어 설치를 하도록 하겠습니다.


2. Telnet(또는 SSH)으로 조금 편하게 설치하는 방법

Telnet 과 SSH를 모두 지원하는 Putty(http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe) 라는 프로그램으로 설명 드리겠습니다.
설치형 프로그램이 아니므로 이 파일만 다운로드 하신 후 실행하시면 바로 사용이 가능합니다.

Putty 실행한 후 Host Name 에 도메인 또는 IP 주소를 입력합니다. 그리고 Open 버튼을 누릅니다.

SSH 의 경우 경고창이 나올 수 있습니다. 그냥 "예" 하시면 됩니다.

사용자 아이디와 비밀번호를 입력한 후 로그인 합니다. 웹경로로 이동하기 위해 cd www 명령어를 사용하였습니다.

gnuboard4.tgz 파일을 wget 프로그램을 사용하여 http://sir.co.kr/data/gnuboard4.tgz 으로부터 전송하였습니다.
ls 명령으로 gnuboard4.tgz 파일이 들어있는 것을 확인하실 수 있습니다.

tgz 파일은 보통 tar 와 gunzip 으로 압축을 해제하지만 여기서는 편하게 tar 로 압축을 해제하였습니다.
그리고 gnuboard4 폴더의 퍼미션(속성)을 777 로 변경하였습니다.



자 이제 그누보드4를 설치할 준비는 모두 마쳤습니다.
이제 브라우저를 열어 설치를 하도록 하겠습니다.

브라우저를 열어 그누보드4가 설치된 웹경로를 입력합니다.

위와 같은 메시지를 출력 한 후 확인을 누르면 설치합니다.

라이센스의 내용에는 반드시 동의하셔야 설치가 가능합니다.

MySQL 정보는 모르시는 경우 서버관리자(웹호스팅을 하시는 경우 웹호스팅 회사)에게 문의합니다.
최고관리자의 회원아이디와 패스워드, 이름, 이메일을 입력한 후 "다음" 버튼을 누릅니다.

설치바가 움직이며 설치를 시작합니다. 설치가 끝나면 메인화면을 클릭합니다.

그누보드4의 기본 설치화면입니다. 수고하셨습니다.


[팁] 웹경로에 http://g4.dasir.co.kr/gnuboard4 라는 폴더로 접근이 되고 있습니다. 이것을 http://g4.dasir.co.kr 로 바로 접근하도록 해보겠습니다.

파일질라로 접속 한 후 모두 선택(Ctrl+A)하여 상위 폴더(..)로 드래그 이동합니다.

그리고 gnuboard4 는 빈폴더가 되었으므로 삭제합니다.

[끝]

Posted by 1010
01.JAVA/Java2008. 9. 17. 15:24
반응형
자바의 CLASSPATH 설정하는 방법
JDK를 설치하면 java파일을 컴파일 할 수 있겠죠. 다만 JDK설치 폴더내 bin폴더 안에 있는 javac.exe라는 자바 컴파일용 파일이 있는 위치에서만 됩니다. 이것을 어느곳에서든지 컴파일이 가능하도록 설정해보도록 합니다.

먼저 내컴퓨터 등록정보 - 고급 - 환경변수를 클릭합니다. 그럼 다음과 같은 창이 하나 뜹니다.
여기서 시스템 변수를 변경합니다.

먼저 JAVA_HOME을 설정합니다. 새로만들기를 클릭해서 변수이름에 JAVA_HOME이라고 입력하고 변수 값에는 JDK가 설치된 경로를 입력합니다.
주의할 점은 C:\jdk1.5.0_06까지만 입력하고 뒤에 \;이나 ;을 붙이지 않도록 합니다.

그다음 Path를 설정합니다. 변경을 눌러서 추가를 합니다.
앞에 이미 지정되어 있는 Path뒤에 연결하여 입력합니다. 구분은 ;(세미콜론)으로 합니다.
;%JAVA_HOME%\bin;을 입력합니다.

CLASSPATH를 설정합니다. 시스템 변수에 CLASSPATH가 이미 있으면 추가를 하고 없다면 새로 만드시면 됩니다.
변수값에는 .;를 입력합니다.

확인 버튼을 눌러서 설정을 완료합니다.


시스템 변수가 제대로 지정이 되었는지 확인합니다.
윈도우시작 - 실행 - cmd를 입력하여 커맨드창을 엽니다.
확인은 echo %변수이름% 으로 합니다.

입력한대로 변수값이 제대로 나오는지 확인합니다.
Path부분의 밑줄은 환경변수에서 %JAVA_HOME%\bin;이라고 입력한 부분입니다.
만약 JAVA_HOME에서 JDK의 경로를 C:\jdk1.5.0_06를 C:\jdk1.5.0_06\; 이나 C:\jdk1.5.0_06; 이라고 입력했으면 저 밑줄친 부분은 C:\jdk1.5.0_06\;bin; 이나 C:\jdk1.5.0_06;bin; 이라고 나타날껍니다.
컴파일도 당연히 안되겠지요.
다음에 JDK를 다른곳에 재설치하게 되면 JAVA_HOME의 JDK의 설치경로만 바꿔주시면 간단해집니다.

제대로 실행이 되는지 확인해봅니다. javac를 입력합니다.
위와 같은 화면이 나오면 설정 완료~

- 확인 할때 java를 입력하지 않고 왜 javac를 입력하는이유?
JDK가 설치될때 java.exe는 경로등이 자동으로 등록이 됩니다. 설치직 후에 커맨드창을 열어서 java라고 입력하면 잘 실행됩니다. 그게 잘 되잖아~ 가 아닙니다. -_-;;
javac는 자동으로 등록되지 않기 때문에 환경변수를 설정하고 javac로 확인합니다.
Posted by 1010
98..Etc/Etc...2008. 9. 5. 12:59
반응형
CVS 사용에 대한 FAQ 모음

한글로 된 CVS 문서들이 여럿 나와 있지만 꼭 필요한 정보들이 여기저기 흩어져 있고 체계적이지 않은 경우가 있어, 처음 CVS를 접하는 분들이 비슷한 질문을 반복적으로 하게 되는 듯 합니다. 오픈소스 프로젝트 개발에 참여하고자 하는 분들에게 필요한 정보를 모아봤으면 합니다. CVS 사용하면서 이 간단한 걸 몰라서 참 고생했었지 싶은게 있으면 언제든지 추가해 주세요.

마침 KLDPconf 주제 응모에도 비슷한 얘기가 나와서 생각난 김에 일단 시작해 봅니다.

질문만 적어주셔도 물론 좋습니다.

Contents

[-]
1 질문과 답
1.1 CVS를 빨리 배워서 써야하는데 어떡하죠?
1.2 CVS가 뭐예요? / 어디에 쓰는 물건인가요?
1.3 CVS를 실제로 개발 과정에 사용하는 프로젝트가 있나요?
1.4 CVS를 쓰면 그래서 뭐가 좋은가요?
1.5 RCS는 또 뭐죠? / RCS 하고는 뭐가 다른가요?
1.6 SourceSafe와는 뭐가 어떻게 다른가요?
1.7 CVS에서 .......한 점이 마음에 들지 않습니다. 다른 프로그램은 없나요?
1.8 Windows에서 쓸 수 있는 CVS 클라이언트가 있나요?
1.9 Windows에서 쓸 수 있는 CVS 서버가 있나요?
1.10 CVSROOT 환경 설정을 어떻게 해야하나요?
1.11 Anonymous checkout 이 뭔가요? 어떻게 하죠?
1.12 로그인을 하라는데 어떻게 하나요?
1.13 저장소(Repository)의 디렉토리 구조를 알고 싶습니다.
1.14 새 Repository는 어떻게 만드나요?
1.15 새 프로젝트는 어떻게 만드나요?
1.16 checkout은 어떻게 하나요?
1.17 checkout한 이후에 Repository에서 바뀐 내용을 확인하고 싶습니다.
1.18 내가 작업한 내용은 어떻게 알 수 있나요?
1.19 지금까지 작업한 내용을 checkin하고 싶습니다.
1.20 Conflict가 생겼습니다! 어떻게 해야하나요?
1.21 소스에서 이 부분을 누가 만든 건지 좀 알아야겠습니다.
1.22 파일을 추가하고 싶습니다.
1.23 파일을 삭제하고 싶습니다.
1.24 파일 이름을 바꾸고 싶습니다.
1.25 디렉토리를 지우고 싶습니다
1.26 실수로 잘못된 소스를 checkin해 버렸습니다. 어떻게 고쳐야하나요?
1.27 checkout 받은 소스를 이제 그만 지워버리고 싶어요.
1.28 현재까지 작업 내역을 보고 싶습니다.
1.29 revision이 뭔가요?
1.30 tag가 뭔가요?
1.30.1 tag는 어떻게 붙이나요?
1.31 branch는 또 뭔가요?
1.31.1 branch는 어떻게 만들죠?
1.31.2 merge는 어떻게 하는 겁니까?
1.32 과거 특정 시점에 소스가 어땠는지 보고 싶습니다.
1.33 CVS 서버에 어떤 module이 있는지 어떻게 알 수 있나요?
1.34 CVSROOT/modules에 모듈 등록은 어떻게 하나요?
1.35 CVSROOT/passwd에 사용자를 어떻게 추가하나요?
1.36 익명 사용자는 어떻게 등록하나요?
1.37 CVS가 /root 아래 파일을 찾으려 듭니다! 이게 뭔가요?
1.38 Repository를 다른 기계로 옮기고 싶습니다.
1.39 CVS 서버에 있는 repository를 미러링할 수 없나요?
1.40 module들을 공유할 수 있는 방법이 있나요?
1.40.1 간단한 방법
1.41 Source file에 강제로 revision을 지정할 수 있나요 ?
1.42 CVS도 VSS처럼 배타적 락(Exclusive Lock)을 걸어 놓고 사용할 수 있나요?
1.43 Repository에 Attic 이란게 있던데 이건 뭔가요?
1.44 Unicode file을 지원하지 못하는가요?
1.45 이미 Text로 업로드 된 파일을 Binary로 바꿀 수 있는가요?
1.46 이미 Binary로 업로드 된 파일을 Text로 바꿀 수 있는가요?
1.47 로그를 잘못 적었는데 고칠 수 없을까요?
1.48 Tag에 comment를 붙이는것은 가능한가요
1.49 Unknown command 라는 에러가 납니다.
1.50 항상 최신버전의 소스를 유지하고 싶어요
1.51 이전버전으로 되돌리고 싶어요(Rollback)
1.52 CVS를 쓸까요 Subversion을 쓸까요?
2 help 사용법
3 용어
4 문서를 만들면서
5 관련 자료


1 질문과 답

1.1 CVS를 빨리 배워서 써야하는데 어떡하죠?

  1. 우선 DocbookSgml/CVS-KLDP 를 보고 한번 그대로 따라해 보세요.
  2. 아래 정리해둔 다른 한글로 된 문서들을 틈틈히 읽어 봅니다.
  3. CVS를 꾸준히 써야 하거나 여러가지 정석적인 사용 방법을 익히고 싶다면 [http]CVS-BestPractices 문서를 정독하시기를 권합니다.
  4. 큰 오픈소스 프로젝트에서 많은 개발자들이 같이 작업할 때 소스 버전 컨트롤이 어떤 방식으로 운영되는지에 관심 있는 분들은 [http]The CVS Book을 한번 보시기 바랍니다.

1.2 CVS가 뭐예요? / 어디에 쓰는 물건인가요?

CVS(Concurrent Versions System)는 프로그램 소스나 문서 파일 버전 관리를 쉽게 할 수 있도록 도와주는 프로그램입니다. 특히 여러 사람들이 동시에 작업을 진행해야하는 규모가 큰 개발 프로젝트에서 큰 효과를 기대할 수 있습니다. 이밖에도 꾸준히 업데이트되는 문서 관리라든가 웹사이트 관리 등에 유용하게 쓸 수 있고, 심지어 /etc 아래에 들어가는 설정 파일을 (원격) 백업하는 용도로도 사용 가능합니다. :-)

동시에 여러 유닉스 장비에서 작업하는 경우 등에 써볼만한 "홈디렉토리 몽땅 CVS에 넣어버리기"에 대한 LinuxJournal 기사([http]CVS homedir)도 한번 읽어 보세요.

1.3 CVS를 실제로 개발 과정에 사용하는 프로젝트가 있나요?

잘 알려진 유명한 오픈소스 프로젝트들은 대개 CVS나 이와 유사한 소스 관리 시스템을 갖추고 있습니다.

  1. OpenBSD : OS 및 시스템 전체 소스를 CVS로 관리하고 있습니다.
  2. OpenOffice : 총 3만 파일에 대략 9백만 라인 이상되는 C++ 코드를 CVS로 관리합니다.
  3. Mozilla : 전체 프로젝트 및 파생 프로젝트 소스 코드 및 릴리스/브랜치 관리를 CVS로 하고 있습니다.
  4. XFree86 : CVS 를 사용하는 유명 프로젝트중 하나입니다.
  5. Apache : 위와 동일합니다.

1.4 CVS를 쓰면 그래서 뭐가 좋은가요?

관리자는 :
  1. 프로젝트 참여자 개개인의 작업을 방해하지 않으면서 전체적인 진행 상황을 조절할 수 있다.
  2. 릴리스된 버전과 개발중인 버전을 뒤섞지 않고 분리해서 관리할 수 있다.
  3. 일정 기간에 진행된 작업 내용에 대한 리포트를 쉽게 만들어 낼 수 있다.
  4. 일정 기간에 진행된 변경 내역을 효과적으로 추적할 수 있다.
  5. 누가 일을 하고 누가 놀고 있는지 쉽게 감시할 수 있다. :-)

개발자는 :
  1. 소스 백업에 신경 쓸 필요가 없다.
  2. 새로운 코드를 작성할 때 기존 작업을 망칠 위험 없이 쉽게 시도할 수 있다.
  3. 문제가 생겼을 때 어느 지점에서 문제가 생겼는지 쉽게 추적해서 찾아낼 수 있다.
  4. 소스나 문서 특정 부분 작업을 누가 언제 했는지 쉽게 알아낼 수 있다.
  5. 별도 리포트 작성 및 문서를 써야하는 건수나 양이 많이 줄어든다.
  6. 맘먹으면 별로 한 일이 없어도 꾸준히 일하고 있는 것처럼 속일 수도 있다. :-)

1.5 RCS는 또 뭐죠? / RCS 하고는 뭐가 다른가요?

CVS는 RCS를 기반으로 작성된 버전 관리 시스템입니다. 쉽게 얘기하자면 RCS는 파일 하나하나에 대해 버전 관리를 해주는 것이고, CVS는 RCS 기능을 이용해 소스나 문서를 프로젝트/모듈 단위로 관리할 수 있도록 확장한 프로그램입니다. 이미 RCS를 쓰고 있고 익숙한 분이 아니라면 굳이 CVS를 새로 배울 필요는 없습니다. RCS로 할 수 있는 모든 것은 CVS로 할 수 있지만 그 역은 성립하지 않기 때문입니다.

CVS에서도 일부 기능(이미 써 놓은 로그 수정 등)은 RCS 명령을 사용해야 합니다. 궁금하다면
 $ cvs -H admin
해서 RCS 관련 명령어를 한번 살펴 보세요.

1.6 SourceSafe와는 뭐가 어떻게 다른가요?

1.7 CVS에서 .......한 점이 마음에 들지 않습니다. 다른 프로그램은 없나요?


대체할 만한 것들... Non-Free

1.8 Windows에서 쓸 수 있는 CVS 클라이언트가 있나요?


CVS를 처음 사용하는 분에게는 TortoiseCVS 를 권합니다. Java를 주로 사용하거나 좋은 IDE 환경을 원하시는 분은 Eclipse를 한번 써보세요.

DeleteMe 윈도우즈 환경에서 CVS를 사용하는 방법에 대해 아직 쉽게 참고할 만한 문서가 없는 것으로 압니다. 누군가 위에 제가 링크해 드린 두 개의 내용을 바탕으로 해서 윈도우즈 환경에서 CVS를 사용하는 방법을 다룬 별도의 문서를 만들어 주시면 참 좋겠네요. -- 권순선
WinCVS 페이지에서 새롭게 문서를 작성해 나갈까 합니다. 많은 관심과 도움 부탁드립니다. -- 쫑아

1.9 Windows에서 쓸 수 있는 CVS 서버가 있나요?

1.10 CVSROOT 환경 설정을 어떻게 해야하나요?

Local Repository
export CVSROOT=/usr/local/cvsroot

Remote Repository
export CVSROOT=:pserver:username@host.domain.com.:/var/cvsroot

Remote Repository w/ SecureShell
export CVS_RSH=ssh
export CVSROOT=:ext:username@host.domain.com.:/var/cvsroot

1.11 Anonymous checkout 이 뭔가요? 어떻게 하죠?

익명 사용자에게 읽기 권한을 제공함으로써 소스나 문서 최신 버전을 손쉽게 업데이트할 수 있도록 해줍니다. 특히 컴파일이 필요없는 스크립트 기반 프로젝트에 유용합니다. [http]MoniWiki를 예로 들자면
$ cvs -d:pserver:anonymous@cvs.kldp.net:/cvsroot/moniwiki login
$ cvs -z3 -d:pserver:anonymous@cvs.kldp.net:/cvsroot/moniwiki co moniwiki
와 같이 하면 됩니다. 이후에 새 버전이 나오거나 패치가 업데이트 되면
$ cvs update -dP
해서 간단히 최신버전으로 업데이트할 수 있습니다.

1.12 로그인을 하라는데 어떻게 하나요?

$ cvs login
(Logging in to user@host.domain.com)
CVS password:

$ cat ~/.cvspass
:pserver:user@host.domain.com:/var/cvsroot XYZ123

$ cvs logout
(Logging out of user@host.domain.com)

1.13 저장소(Repository)의 디렉토리 구조를 알고 싶습니다.

  /home/cvs/ .... (1)
  /home/cvs/CVSROOT/ .... (2)
  /home/cvs/CVSROOT/passwd .... (3)
  /home/cvs/CVSROOT/readers .... (4)
  /home/cvs/module_A/ .... (5)
  /home/cvs/module_B/ .... (6)

(1) $CVSROOT 로 지정되는 CVS의 최상위 디렉토리

(2) CVS 저장소의 설정 파일들이 있는 디렉토리

(3) CVS 사용자 ID와 비밀번호

(4) CVS 읽기만 가능한 사용자

(5), (6) 프로젝트 디렉토리, 프로젝트에 따라 CVS 명령으로 생성됩니다.

1.14 새 Repository는 어떻게 만드나요?

$ export CVSROOT=/home/user/cvsroot
$ cvs init
$ ls /home/user/cvsroot
CVSROOT/
$ ls /home/user/cvsroot/CVSROOT/
Emptydir/       config         editinfo,v  modules,v  taginfo
checkoutlist    config,v       history     notify     taginfo,v
checkoutlist,v  cvswrappers    loginfo     notify,v   val-tags
commitinfo      cvswrappers,v  loginfo,v   rcsinfo    verifymsg
commitinfo,v    editinfo       modules     rcsinfo,v  verifymsg,v

1.15 새 프로젝트는 어떻게 만드나요?

$ ls proj/
README  a.c  a.h
$ cd proj/
$ cvs import -m "this is the project" proj VENDOR INIT
$ ls /var/cvsroot/
CVSROOT/  proj/
$ ls /var/cvsroot/proj/
README,v  a.c,v  a.h,v

1.16 checkout은 어떻게 하나요?

$ cd ~/work
$ cvs co proj
U proj/README
U proj/a.c
U proj/a.h

특정 태그를 지정해서 받고 싶다면 다음과 같이 합니다.
$ cvs co -r RELEASE_1_0_5 moniwiki

1.17 checkout한 이후에 Repository에서 바뀐 내용을 확인하고 싶습니다.

우선 내용 확인 (로컬에 아무 변화도 만들지 않음).
$ cvs -n update

그리고 이상이 없으면 변경된 사항을 받아온다.
$ cvs update -dP

1.18 내가 작업한 내용은 어떻게 알 수 있나요?

$ cvs diff
$ cvs diff -r BASE
$ cvs diff -r BASE -r HEAD
$ cvs diff -c -r1.6 prog.c
$ cvs diff -c -r1.6 -r1.7 prog.c

1.19 지금까지 작업한 내용을 checkin하고 싶습니다.

$ cvs ci -m "fixed bug #12345"
$ cvs com[mit] prog.c
$ cvs ci -m "another bug fix in sheet.c" sheet.c

1.20 Conflict가 생겼습니다! 어떻게 해야하나요?

당황하지 마세요. 소스나 문서에서
<<<<
....
----
....
>>>>
이렇게 생긴 부분을 찾아서 고친 다음 다시 cvs update; cvs ci 하면 됩니다.

1.21 소스에서 이 부분을 누가 만든 건지 좀 알아야겠습니다.

$ cvs annotate a.c

1.22 파일을 추가하고 싶습니다.

$ cvs add newfile
$ cvs add newdir

1.23 파일을 삭제하고 싶습니다.

$ cvs rm oldfile
$ cvs rm -f badfile
$ cvs rm -f olddir/badfiles
$ cvs rm olddir

1.24 파일 이름을 바꾸고 싶습니다.

단순히 파일이름만 바꾸는 방법과 history 까지 보존하는 방법이 있습니다 (매뉴얼에서 발취)

일반적인 방법
$ mv old new
$ cvs remove old
$ cvs add new
$ cvs commit -m "Rename old to new" old new
일반적인 만큼 방법도 쉽습니다. 기존 파일의 이름을 다른 이름으로 바꾼후 기존 파일을 cvs remove 로 제거하고

새로 바뀐 이름의 파일을 cvs add 로 추가합니다. 그 다음엔 remove와 add 만으로 파일이 지워지거나 추가된것이 적용되지 않으므로

이 두파일을 commit 해줘야 합니다

히스토리 까지 보존하는 방법

먼저 이 방법은 CVS repository 를 직접 접근하므로 조금은 위험하다고 메뉴얼에서 밝히고 있네요
$ cd $CVSROOT/module
$ mv old,v new,v
CVS repository 의 수정할 module 디렉토리에서 이름을 변경할 파일의 이름을 직접 바꾸어 주는 방법입니다

이것은 아래와 같은 장단점을 가지고 있습니다 장점
  • change log가 그대로 보존됩니다
  • revision 역시 그대로 유지됩니다
단점
  • module 의 예전 release 나 tag 를 불러오기가 쉽지가 않다.
  • 이름이 변경되었다는 정보가 log 에 남지 않는다
  • 위의 작업($CVSROOT 에 들어가 파일을 직접 rename 하는..)을 하는 동안 누군가 cvs 작업을 한다면 난처한 일이 생긴다.

1.25 디렉토리를 지우고 싶습니다

CVS에서는 디렉토리 단위로 저장을 하기 때문에 히스토리를 유지하기 위해서는 그 디렉토리가 필요합니다. 따라서 진짜로 디렉토리를 지울 수는 없습니다. 대신 update 시에 받지 않는 방법이 있습니다. 먼저 파일을 지우기를 이용해서 해당 디렉토리의 파일을 모두 지웁니다. 그리고 나서 상위 디렉토리로 가서 해당 디렉토리를 지우고 나면 다음부터는 cvs update -P 로 업데이트 하면 해당 디렉토리가 보이지 않게 됩니다.
cd unneeddir
rm *             # 이때 CVS 디렉토리는 남겨져 있어야 합니다.
cvs remove
cvs commit  # 여기서 unneeddir의 모든 파일이 지워집니다
cd ..
cvs remove unneeddir
cvs update -P

또는 CVSROOT에 가서 직접 디렉토리를 지워 버리는 방법이 있습니다. 대신이 방법은 CVSROOT 디렉토리 관리 권한을 가지고 있어야 하고, 히스토리까지 사라진다는 단점이 있습니다.

1.26 실수로 잘못된 소스를 checkin해 버렸습니다. 어떻게 고쳐야하나요?


1.27 checkout 받은 소스를 이제 그만 지워버리고 싶어요.

$ cvs release -d proj

1.28 현재까지 작업 내역을 보고 싶습니다.

$ cvs st[atus] [-v] [prog.c]
$ cvs log [prog.c]
$ cvs ann[otate] [main.c]

1.29 revision이 뭔가요?

파일 하나하나에 붙어 있는 버전 번호를 말합니다.
$ cvs st README
......
   Working revision:    1.1
......

1.30 tag가 뭔가요?

여러 파일이나 모듈에 버전을 표시하기 위해 한꺼번에 붙여둔 표시입니다.
$ cd moniwiki/
$ cvs st -v README
......
   Existing Tags:
        moniwiki-1_1                    (branch: 1.1.2)
        RELEASE_1_0_5                   (revision: 1.1)
......

1.30.1 tag는 어떻게 붙이나요?

$ cvs tag TAGNAME

1.31 branch는 또 뭔가요?

  • Development Branch
  • Release Branch
  • Maintenance Branch

  • Vender Branch

  • (Main) Trunk
  • HEAD

매뉴얼에서 빌려온 그림
                                                     +-------------+
                          Branch 1.2.2.3.2 ->        ! 1.2.2.3.2.1 !
                                                   / +-------------+
                                                  /
                                                 /
                 +---------+    +---------+    +---------+    +---------+
Branch 1.2.2 -> _! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !----! 1.2.2.4 !
               / +---------+    +---------+    +---------+    +---------+
              /
             /
+-----+    +-----+    +-----+    +-----+    +-----+
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !      <- The main trunk
+-----+    +-----+    +-----+    +-----+    +-----+
                !
                !
                !   +---------+    +---------+    +---------+
Branch 1.2.4 -> +---! 1.2.4.1 !----! 1.2.4.2 !----! 1.2.4.3 !
                    +---------+    +---------+    +---------+

1.31.1 branch는 어떻게 만들죠?

$ cvs checkout project; cd project
$ cvs update foo.c
$ cvs tag release-1 .
$ cd ..; cvs release -d project

$ cvs checkout -r release-1 project
$ cvs release -d project

$ cvs rtag -b -r release-1 release-1-patches project
$ cvs checkout -r release-1-patches project
$ cvs commit -m "Fixed printf bug" foo.c
$ cd ..;  cvs release -d project

cvs를 사용할 때 Branch를 해서 버젼을 만들고 메인 버젼이 올라가면 다시 메인버젼과 머지를 하고.. 등의 작업을 수행할 때, 먼저 브랜치를 할 파일들에 태그를 달아주고 태그를 기준으로 브랜치를 만드는 것이 편한 것 같습니다.

명령어는 다음과 같습니다.

cvs rtag -r arab -b arab_xxx ggg

이렇게 하면 ggg라는 프로젝트에서 arab 태그가 붙은 것을 arab_xxx 브랜치로 작성하겠다. 라는 의미가 됩니다. 태그는 먼저 달아주어야 하겠지요.

그리고 태그와 브랜치는 다르다는 점을 미리 아시면 좋겠고.. 만일 wincvs를 사용하신다면 graph를 보시게 되면 tag는 검정색 얇은 선 브랜치는 파란색 굵은 선으로 나뉘는 것을 알 수 있습니다. --최성우 / eatingstars.com

브랜치를 쉽게 만드는 방법입니다.
$ cvs tag -b BRANCHNAME
이 명령을 실행한 작업소는 앞으로 이 브랜치로 작업을 하게 됩니다.

1.31.2 merge는 어떻게 하는 겁니까?

$ cvs checkout -j release-1-patches project
$ cvs commit -m "Merged patch"

1.32 과거 특정 시점에 소스가 어땠는지 보고 싶습니다.

태그를 붙여 두지 않았다면, 날자와 시간을 써서 다음과 같이 작업하는 것도 가능합니다.
$ cvs rtag -b -D "2000-01-01  00:00" first-millenium-release project
$ cvs get -D "3 month ago" myproj
$ cvs get -D "1999-11-23  09:00" oldproj

CVS가 지원하는 날자/시간 지정 형식 몇 가지는 다음과 같습니다.
"1971-04-30  04:35" (ISO format)
"30  Apr  1971  04:35" (Internet format)
"Tue Jan 25 08:45:45 UTC 2000"
"3/31/92 10:00:07 PST"
"January 23, 1987 10:05pm"
"22:00 GMT"
"1 month ago"
"2 hours ago"
"400000 seconds ago"
"last year"
"last Monday"
"yesterday"
"a fortnight ago"

1.33 CVS 서버에 어떤 module이 있는지 어떻게 알 수 있나요?

CVS에서 제공하는 명령어를 통해 정상적으로 알아낼 수 있는 방법은 없습니다. :-( 그렇지만 꼭 필요한 경우에 흔히 사용되는 방법이 몇 가지 있습니다.

  1. 프로젝트 관리자에게 물어보세요 :-)
  2. 프로젝트 관리자가 수동으로 CVSROOT/modules 에 등록해 놓으면 다음 명령으로 module의 목록을 볼 수 있습니다.
      $ cvs co -c
      
  3. 잘 관리되는 프로젝트라면 일반적으로 cvsweb 이나 viewcvs 같은 웹 인터페이스를 제공할 것입니다. 그걸 이용하세요. 만약 없다면 서버 관리자에게 그런 프로그램을 설치해 달라고 요청하세요.
  4. 위 방법이 모두 안된다면, 다음 스크립트를 써서 간접적으로 알아낼 수도 있습니다.
      $ cvsls.sh HEAD .
      
    #!/bin/sh
    
    # lists files and directories in the module(s) on the server without
    # checking them out
    
    # cvsls BranchName modules...
    # for main trunk use 'cvsls HEAD modules...'
    
    branch=$1; shift
    
    cvs rdiff -s -D '01/01/1971' -r $branch "$@"  2>&1 \
        | sed -e 's/File.//' \
                      -e 's/is new; current revision./      (/' \
                      -e 's/(\([0-9][\.0-9]*\)/(\1)/' \
                      -e 's/cvs server: Diffing/cvs server: Listing/'
    
    


1.34 CVSROOT/modules에 모듈 등록은 어떻게 하나요?

cvs co CVSROOT 하여서 modules 파일을 수정하신 후에 commit 하셔야 합니다. 이때 위와 같은 목적으로 활용하실 계획이라면 간단하게 다음과 같이 적으시면 됩니다.
module_A  module_A
module_B  module_B
위의 내용은 module_A라는 것이 repository root에 존재하는 경우 입니다.

1.35 CVSROOT/passwd에 사용자를 어떻게 추가하나요?

몇 가지 방법이 있지만, 가장 간단한 방법 가운데 하나는 apache 패키지에 들어 있는 htpasswd 명령을 이용하는 것입니다.

  $ htpasswd -b passwd username password

1.36 익명 사용자는 어떻게 등록하나요?

$ cat $CVSROOT/CVSROOT/readers
cvs
cvsguest

1.37 CVS가 /root 아래 파일을 찾으려 듭니다! 이게 뭔가요?

pserver 설정을 해줄 때 아래와 같은 에러가 나는 경우가 있습니다.

cvs server: cannot open /root/.cvsignore: Permission denied

이럴 땐 inetd 나 xinetd 설정을 해줄 때 cvs에 넘겨줄 인수에 '-f' 옵션을 추가해주면 해결됩니다. xinetd 라면 /etc/xinetd.d/cvspserver 내용을 아래와 같이 해 주면 됩니다.

# default: on
# description: cvs pserver
service cvspserver
{
        disable         = no
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/cvs
        server_args     = -f --allow-root=/home/cvs pserver
        log_on_failure  += USERID
}

1.38 Repository를 다른 기계로 옮기고 싶습니다.

Q : 만일 A 서버에 있던 repository 를 B 서버로 옮기고 싶다면 그냥 디렉토리를 통채로 복사하면 되려나요? 그게 안 된다면 죄다 update 후 새로 import 를 하라는 얘기인데... -_-;;

A : 네 그냥 옮기면 됩니다. 완벽한(?) 이전을 위해서라면 조금 신경써야할 것들이 더 있긴 하지만, 디렉토리를 통째 tar로 묶어서 새 기계게 풀어준 다음 permission 조절만 해줘도 웬만큼 됩니다.

1.39 CVS 서버에 있는 repository를 미러링할 수 없나요?

단순한 백업 이상을 의미하는 것이라면, CVS는 기본적으로 단일 repository를 바탕으로 설계되었기 때문에 자체적으로는 불가능합니다. 대규모 프로젝트 같은 경우에 전세계 곳곳에 미러를 하기 위해 CVSup 같은 보조도구를 이용하거나, 단순히 rsync 같은 미러링 툴을 이용하기도 합니다. 그러나 이 경우 하위 repository에 commit 한 내용을 다시 상위(upstream)로 merge 하는데 기술적인 어려움이 따릅니다. 그렇지만 경우에 따라 효과적인 개발 브랜치나 로컬 개발자 그룹 지원을 위해서는 꼭 필요한 기능이기 때문에, CVS가 가지는 근본적인 제약을 극복하고자 새로 개발되는 프로그램이 있습니다. 만약 꼭 계층적 repository를 구축해야 하는 상황이라면, 다음 프로그램을 사용하는 것을 고려해 보세요.

최근에 XFree86 프로젝트를 arch를 이용해 fork한 사례가 있습니다. : http://www.xouvert.org/

1.40 module들을 공유할 수 있는 방법이 있나요?

Q : 예를 들어서 libx라는 모듈이 있고, proj_a와 proj_b가 이를 모두 사용합니다. 이때 이 두 프로젝트가 유사하여서 libx를 한쪽에서 수정하면 다른 한쪽에서도 영향을 받아야 하는 경우라면 어떻게 해야 할까요? 서버에서 symbolic link를 걸어주거나, 클라이언트측에서 proj_a, proj_b에 모두 libx를 checkout해주면 되겠지만 다소 불편함이 없지 않아 있을것 같아서 여쭤 봅니다.

A : 가능합니다.

CVS에서는 프로젝트 관리를 위해 어떤 모듈을 checkout할 때 하위 모듈을 선별적으로 checkout하거나 가상 모듈을 만들어 실제 모듈을 여러개 동시에 checkout하는 것 등을 지원합니다. 기본적으로는 CVSROOT/modules 파일을 적절히 구성해서 프로젝트에 참여하는 개발자들이 필요한 부분을 잘 골라 받아갈 수 있도록 관리해줘야 합니다. 한가지 짚어두고 싶은 것은, CVS는 소스 버전 관리 프로그램이지 어떤 특정 프로젝트 구조를 정해둔게 아니기 때문에 실제 해결 방식은 진행하는 프로젝트 구성 및 정책에 따라 달라집니다.

간단하게 두가지 경우를 예로 들어보지요.

1. proj_a 와 proj_b, 그리고 libx를 더 큰 proj 으로 묶을 수 있는 경우

CVSROOT/modules 내용은
proj    proj  proj_a proj_b libx
proj_a  proj  proj_a libx
proj_b  proj  proj_b libx
libx    proj  libx
와 같이 되고, checkout을 하게 되면 proj 디렉토리가 먼저 생기고, 그 아래에 각 모듈이 생깁니다.

2. proj_a 와 proj_b 는 별개 프로젝트이고 libx 도 별개로 관리하는 경우

CVSROOT/modules 내용은
proj_a  -a  proj_a libx
proj_b  -a  proj_b libx
libx    libx
이렇게 되고, 예를 들어 cvs checkout proj_a 를 하게 되면 proj_a와 libx라는 모듈이 각각 생성됩니다. 이 경우 libx에 autotools(libtool)을 채용하든가 proj_a와 proj_b 빌드하는데 연결되도록 적절히 구성해줘야 하겠죠.

두가지가 무슨 차이냐? 라고 혹시 생각하는 분이 있을지 모르겠는데, 전자에서는 최상위 디렉토리에 라이브러리를 포함한 빌드 시스템을 구축 관리할 수 있기 때문에 성격이 많이 달라집니다.

또, 경우에 따라
proj    proj
proj_b  proj  proj_a
proj_a  proj  proj_b
libx    libx
이런 식으로 구성하는 경우도 생기겠지요.

심볼릭 링크를 걸어주는 것도 편법으로 가능은 하지만, 모듈이나 라이브러리 관리라는 측면에서 본다면 그다지 바람직하지는 않습니다. 물론 불가피한 상황이 있을 수도 있으나 대개는 '라이브러리'라는 것 자체가 해당 코드를 별개로 독립시켜야할 만큼 여러 곳에서 쓰는 경우에 한해 만드는 것이므로 위에서 예를 든 두 가지 경우를 적절히 섞어서 구성하고, autotools 등을 잘 이용하면 해결할 수 있습니다. (DeleteMe 이 주제는 CVS/FAQ라는 범위를 벗어나는 것 같아 이정도만 적습니다.)

1.40.1 간단한 방법

단순히 어떤 모듈을 가져올 때 특정 하부 모듈을 같이 가져오도록 하려면 다음과 같이 하면 됩니다.
proj_a proj_a &libx
proj_b proj_b &libx
libx libx
이렇게 하면 proj_a를 체크아웃할 때 proj_a 디렉토리 아래에 추가로 libx 디렉토리가 생깁니다.

1.41 Source file에 강제로 revision을 지정할 수 있나요 ?

Q : 예를 들어서 어떤 소스의 revision #가 1.12라고 할 때 어떤 계기로 인해서 이 번호의 제일 앞자리 숫자를 바꾸려고 하면 어떻게 하면 되나요 ?

A : 가능합니다.
cvs ci -m "revision set to 2.0" -r2.0 ohmysrc.c
해당 프로젝트/모듈 전체를 한번에 바꾸려면, checkout 받은 모듈 최상위 디렉토리에서
cvs ci -m "revision set to 3.1" -r3.1
와 같이 하면 됩니다.

그러나

가능하다고 해서 반드시 이렇게 하는게 좋다는 것은 아닙니다.

그러므로

Tag나 Branch를 써야하는 경우가 아닌지 다시 한번 생각해보세요.

1.42 CVS도 VSS처럼 배타적 락(Exclusive Lock)을 걸어 놓고 사용할 수 있나요?

cvs admin -l filename
을 이용하시면 됩니다. 이 경우 해당하는 사람이 lock을 제거하기 전까지는 commit이 불가능하게 됩니다. 하지만 이렇게 하는 것은 대부분 문서에서 그다지 권장하지 않더군요. cvs watch 이용하기를 권장하고 있습니다.

보통은 cvs edit를 써서 원하는 효과를 얻을 수 있습니다. cvs edit는 동시에 edit하는 것을 방지하지 않지만, cvs edit -c filename 을 모든 사람이 이용하게 된다면 그 순간에는 한 사람만이 작업을 할 수가 있게 됩니다. -c 옵션을 준 것을 reserved edit라고 하며, 이 경우에도 누구나 commit은 가능합니다.

1.43 Repository에 Attic 이란게 있던데 이건 뭔가요?

사용자가 지운(cvs rm) 파일을 보관해두는 곳입니다. Attic이 우리말로 하면 "다락"인데, 자주 쓰지는 않지만 버리긴 아깝고 혹시 필요하게 될지 모르는 물건을 저장한다는 점에서 보면 상당히 잘 지은 이름 같습니다.

사용자가 cvs rm을 해서 파일을 지우게 되면, 해당 파일들이 완전히 삭제되는게 아니라 Attic 아래에 옮겨집니다. 그리고 과거 버전을 checkout 하거나 할때 끄집어내서 쓰는 거지요.

1.44 Unicode file을 지원하지 못하는가요?

Q : 이러한 메시지를 만났습니다.
cvs import: Remote server does not support Unicode files.  Checkin may be invalid.
여러개의 파일을 한꺼번에 import할때 나왔으며, 이를 다시 수정하여 ci할때에도 나타났습니다. 음.. 첫번째 파일에서 이러한 문구가 나타났는데, 평범한 C++ code라서 다른 파일이 아닌가 합니다. 아울러 -ku라고 나타나는 메시지도 무엇인지 모르겠네요.
cvs commit: Remote server does not support Unicode files.  Checkin may be invalid.
Checking in ***.cpp;
cvs server: internal error: unsupported substitution string -ku
/***.cpp,v  <--  ***m.cpp
new revision: 1.2; previous revision: 1.1
done
해당 파일 안에 유니코드로 된 텍스트가 들어있나요? 혹시 RCS keyword substitution 으로 쓰이는 내용이 들어있나요?

1.45 이미 Text로 업로드 된 파일을 Binary로 바꿀 수 있는가요?

바이너리로 업로드하려면 -kb옵션을 사용합니다. 예를들어,
$ echo '$Id: CVS_2fFAQ,v 1.99 2005/08/19 01:21:43 kss Exp kss $' > kotest
$ cvs add -kb -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest
입니다.

만약 실수로 -kb옵션을 빠뜨리고 (텍스트로)업로드 했을경우, 바이너리로 복구하려면 cvs admin 옵션으로 아래의 예처럼 바꾸면 됩니다.
$ echo '$Id: CVS_2fFAQ,v 1.99 2005/08/19 01:21:43 kss Exp kss $' > kotest
$ cvs add -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest
$ cvs admin -kb kotest
$ cvs update -A kotest
# For non-unix systems:
# Copy in a good copy of the file from outside CVS
$ cvs commit -m "make it binary" kotest

1.46 이미 Binary로 업로드 된 파일을 Text로 바꿀 수 있는가요?

한글이 들어있는 파일을 WinCVS를 통해서 add/import를 하게 되면 binary를 권장합니다. 이때, 실수로 Binary로 add/import하게 되면 merge기능을 지원하지 않아 불편하게 되지요. 이럴 때, 위의 Text->Binary와는 반대의 작업이 필요하게 되는데, 위의 내용과 같고, 옵션만 -kb가 아닌 -kkv로 해 주면 됩니다.
$ cvs admin -kkv kotest

-- DeleteMe 이것으로 한참 고민하고 이것 저것 해 본 결과 알아 냈습니다만, 여기서 말하는 keyword라는 게 정확하게 의미하는 바를 모르겠습니다. 아시는 분은 설명 부탁드립니다. (-kkv의 help에는 Generate keywords using the default form.라고 되어 있습니다.) barmi

1.47 로그를 잘못 적었는데 고칠 수 없을까요?

$ cvs admin -m1.2:"new log" myprog.c

태그가 붙어 있는 경우라면
$ cvs admin -mV_1_0:"massive new log"
이렇게 한번에 바꾸는 것도 가능합니다.

1.48 Tag에 comment를 붙이는것은 가능한가요

AnswerMe 질문이 조금 애매한것 같습니다. 제목만 보고는 어떤 상황인지 정확히 알 수 없어 답변이 두루뭉실합니다. 조금더 상황을 설명해 주시지요?

tag를 붙이면서 거기에 대한 로그를 어딘가에 기록해둘 수 없냐는 얘긴가요? 그런거라면 대답은 불가능하다 입니다. CVS는 파일 별로 로그를 붙이게 돼 있는 RCS를 계승하기 때문에 각 checkin 별로 기록을 할 수 없다는 단점이 있습니다. 그래서 Subversion 같은 경우 아예 파일별 revision이 아니라 per-checkin revision을 모듈 단위로 붙여주는 방식을 채택했습니다.

만약 tag 자체에 대해 어딘가에 기록을 남기고 싶은 거라면 ChangeLog 나 README 등에 내용을 적어두는 것으로 대체할 수도 있습니다.

질문자입니다. 말씀해 주신 내용이 정확합니다. 제가 보기에도 file 단위로 log message를 남기는 것 같아서 여쭤 보았던 것입니다. 아직 익숙하지 못해서인지 좀 불편한 점으로 생각되어서 질문을 했던 것입니다. :)

http://www.cvstrac.org/ CVS mod인것 같은데 check-in 단위로 기록을 남길수 있습니다. http://www.sqlite.org 에서 사용 하는걸 보면 괜찮아 보입니다.

1.49 Unknown command 라는 에러가 납니다.

Q: 접속시에
cvs [login aborted]: unrecognized auth response from 127.0.0.1: Unknown command: `/home/cvs'
라고 나오네요.. 강좌대로 했다고 생각했는데.. passwd file 문제인가요? redhat 9.0을 쓰고 있읍니다.

A: -d 옵션 (CVSROOT) 줄 때 사용자@서버명:과 /디렉토리/경로 사이에 빈 칸이 들어가 있는 것 같습니다.
$ cvs -d :pserver:anonymous@anonymous.com:/cvsroot
이렇게 전부 붙여줘야 합니다.

1.50 항상 최신버전의 소스를 유지하고 싶어요

항상 최신의 버전을 유지하지 않고 작업을 하니 Commit시 자주 Conflict가 발생합니다. WinCVSTortoiseCVS를 써 보았는데 최신 버전으로 유지해 주는 기능을 안 보이던데요. 덧붙여 update시 발생하는 conflict를 줄이고 싶습니다. update시 merge를 선택적으로 할 수는 없나요? 예를 들어서 '이 파일은 더 최근의 것이 존재합니다. merge할까요? (Y/n)' 이런식으로요.

* WinCVS에서 우선 update합니다. 그럼 merge나 conflict 되어 있을겁니다. 다시 update하면서 update settings중 Get the clean copy를 체크하시면 됩니다.
Clean copy를 받고 싶은게 아니라 local modify 파일은 update를 받고 싶지 않은 경우를 말씀 드렸답니다. ^^ 그리고 update 명령을 자동으로 수행할 수 있는 방법이 있으면 좋겠다는거였습니다. 2가지가 상충된 질문을 드려서 헷갈리셨나 봅니다. _ 감사합니다.
그런 경우 Update query 해서 저장소에 변경된 파일을 확인한 후 그 파일들만 선택해서 업데이트 하시면 됩니다. 스크립트 하나 만들어 보시는 것도 좋을듯 합니다. :)

1.51 이전버전으로 되돌리고 싶어요(Rollback)

http://bbs.kldp.org/viewtopic.php?t=28936

1.52 CVS를 쓸까요 Subversion을 쓸까요?

Q : 이제서야 CVS라는 것에 대해 알게 되어 배워볼까 했더니 CVS의 불편한 점을 개선한 Subversion이 나왔다고 하네요. 처음 배우는 사람은 바로 Subversion을 익혀야 하나요? 아니면 CVS 를 먼저 익혀야 하나요?

A : 대부분의 오픈소스가 CVS로 진행 되니 CVS를 먼저 익히는것이 좋겠죠. Subversion이 안정적이라고 하긴 하나 공식적인 stable 버전은 언제쯤 나올지는... 요즘 한달에 두번씩 버전이 올라가는데 업데이트 해주기 좀 귀찮더군요. CVS에 불만이 생기면 그때 슬슬 바꾸시면 됩니다.

A : SubVersionCVS의 불편한 점을 개선했다기 보다는 완전히 다른 프로그램으로 보는게 맞습니다. 상호 호환성도 없고, 단지 SubVersion에서 기존에 CVS로 운영되던 프로젝트를 import할 수 있게 해놨을 따름입니다. revision/version 관리 모델 자체도 전혀 다릅니다. 시기상 나중에 만들어졌기 때문에 CVS가 가지는 단점들을 상당 부분 개선한 것은 사실입니다만, 개발 모델 자체에 대한 접근 방식이랄까 철학이랄까 그런게 다른 부분이 있어 보여서 제 경우엔 조금 관망하는 중입니다. 버전 컨트롤 프로그램을 전혀 써보지 않은 사람 입장에서 어느 쪽이 더 익히기 쉽다든가 하는 건 잘 모르겠군요. SubVersionCVS를 쓰던 사람은 쉽게 옮겨갈 수 있다고 얘기합니다만 그거랑은 별개라서 말이죠. --verotas

2 help 사용법

버전 확인
$ cvs --version
Concurrent Versions System (CVS) 1.11.2 (client/server)

그냥 cvs만 치면 help 사용법이 자세히 나온다.
$ cvs
Usage: cvs [cvs-options] command [command-options-and-arguments]
  where cvs-options are -q, -n, etc.
    (specify --help-options for a list of options)
  where command is add, admin, etc.
    (specify --help-commands for a list of commands
     or --help-synonyms for a list of command synonyms)
  where command-options-and-arguments depend on the specific command
    (specify -H followed by a command name for command-specific help)
  Specify --help to receive this message

The Concurrent Versions System (CVS) is a tool for version control.
For CVS updates and additional information, see
    the CVS home page at http://www.cvshome.org/ or
    Pascal Molli's CVS site at http://www.loria.fr/~molli/cvs-index.html

특정 명령어 옵션을 자세히 보려면
$ cvs -H update
Usage: cvs update [-APCdflRp] [-k kopt] [-r rev] [-D date] [-j rev]
    [-I ign] [-W spec] [files...]
......

사용할 수 있는 명령어 생략형은 다음과 같다.
$ cvs --help-synonyms
CVS command synonyms are:
        add          ad new
        admin        adm rcs
        annotate     ann 
        checkout     co get
        commit       ci com
        diff         di dif
        export       exp ex
        history      hi his
        import       im imp
        log          lo 
        login        logon lgn
        rannotate    rann ra
        rdiff        patch pa
        release      re rel
        remove       rm delete
        rlog         rl 
        rtag         rt rfreeze
        status       st stat
        tag          ta freeze
        update       up upd
        version      ve ver
(Specify the --help option for a list of other help options)

3 용어

repository working file working directory (or area) checkout commit (checkin) RCS file modules revision tag branch "the trunk" HEAD / BASE merge conflict

4 문서를 만들면서

개인적으로, 몇 년 전 CVS를 처음 배우면서 제일 어려웠던게 간단한 소개 문서는 한글로 된게 있었지만 조금만 더 상세한 걸 찾아보려면 제대로 된 (영어든 한글이든) HOWTO 같은게 있지도 않았고, (지금도 있는지는 모르겠지만) Faq-O-Matic 으로 된 영어 FAQ 사이트가 레퍼런스로 쓸만한 유일한 곳이었습니다. 그래서 그때부터도 처음 오픈소스 세상을 접하는 개발자에게 CVS라는 장벽을 뛰어 넘는데 보탬이 되는 문서 같은게 꼭 필요하다고 느끼고 있었습니다.

그동안 CVS를 다룬 책도 출간되었고 CVS 다음 세대가 될만한 다른 프로그램들도 나왔고 해서 하려고만 든다면 상대적으로 자료 찾기나 배우기가 더 쉬워진 면도 분명 있습니다. 그렇지만 본래 좋은 HOWTO 들이 그러하듯이 처음 시작하는 사람이 딱 그 문서 하나만 찍어서 옆에 두고 손으로 짚어가며 따라하면 일단 ''시작'은 어떻게든 해볼 수 있는 글이 아쉬웠고, 글 서두에 밝혔듯이 현재 존재하는 한글로 된 CVS 관련 문서들은 담고 있는 정보가 가지는 유용성에 비해 집약도(?)가 떨어지고, 사용자에게 필요한 내용과 관리자에게 필요한 내용이 잘 구분이 되어 있지 않아 결과적으로 처음 접하는 사람에게 문턱을 낮추는 역할에 충실하지 못한 부분이 있다고 생각합니다.

장기적으로는 이런 것들을 해결할 수 있는 좋은 글이 나와야 하겠지만, 아쉬운 대로 "KLDP에 있는 문서를 보고 따라하다 보니 이런 문제에서 걸리는데 어떻게 하면 되는 거냐" 하는 질문에 대한 답 정도라도 생각나는 대로 정리해 보자 라고 생각해서 시작하게 됐습니다. 앞으로도 생각나는 대로 항목들 추가해 나가면서 정리해 나갈 생각입니다. --verotas

Thanks to 권순선, 쫑아, voxel, IrIz, Advanced

5 관련 자료

Posted by 1010
98..Etc/Etc...2008. 9. 5. 12:53
반응형
Posted by 1010
98..Etc/Etc...2008. 9. 5. 09:13
반응형
Posted by 1010
반응형
 스크립트 목적
  - 기존의 셀렉트박스를 스타일의 적용이 가능한 레이어 형태(실제로는 테이블과 Popup Object)로 자동 변환

* 주요 기능 및 특징
  - 기존 셀렉트박스 태그의 수정 없이 스타일 시트에 정의하는 것만으로 모든 셀렉트박스 변환 가능
  - 셀렉트박스를 기준으로 아래위의 여백을 비교하여 옵션 항목 창의 출력 방향 결정
  - 기존 셀렉트박스처럼 변환된 셀렉트박스도 포커스를 가질 수 있음
    <script>document.getElementById('SelectBox_Name').focus();</script>
  - 변환된 셀렉트박스가 포커스를 가지고 있을 경우 휠을 움직이거나 키보드의 Home, End, Page Up, Page Down,
    Up Arrow, Down Arrow 등을 누름에 따라 값의 변경이 가능
    또한 열려진 옵션 항목 창에서도 가능함
  - 위의 이벤트 시에 문서의 스크롤을 제어하여 문서의 움직임이 없음
  - 아이프레임 및 프레임에 삽입된 상황에서도 프레임에 영향을 받지 않고 정상적으로 출력
    (Layer가 아닌 Popup Object를 이용)
  - 셀렉트박스의 항목이 동적으로 변경할 경우를 위한 메소드 제공
    <script>document.getElementById("SelectBox_Name").reInitializeSelectBox();</script>
  - 옵션 항목 창에 출력될 항목의 갯수를 지정(setDisplayCount() 메소드 이용)할 수 있으며 항목이 출력될
    갯수보다 많을 경우 자동으로 스크롤바 생성 (기본값은 10)
  - 셀렉트박스 및 옵션 항목에 대해 툴팁 메세지 설정 가능
  - 특정 셀렉트박스의 색상 및 화살표 이미지 변경 가능
  - 변환된 레이어를 텍스트처럼 취급 (연속적인 출력이 가능, 하단 여백 없음)
  - HTC 가 지원되는 브라우져에서만 변환 (HTC는 5.0 이상에서 가능하나 createPopup() 메소드가 5.5부터
    지원되어 IE 5.5 이상에서만 변환)
  - 옵션 항목 창 출력시 일시적으로 문서가 길어져 스크롤바가 출력되는 일이 없음

* 사용 방법
  - 스타일시트에 미리 정의하는 방법
  <style>select{ behavior: url('./selectBox.htc');}<style>
  - 특정 SelectBox 폼필드에만 적용하는 방법
  <select style="behavior: url('./selectBox.htc');"></select>


* 셀렉트박스 포커스 처리
  - 일반적인 SelectBox와 동일하게 처리 -> <script> document.getElementById('selectbox').focus();</script>
  - 셀렉트박스가 포커스를 가진 상황에서 휠을 움직이거나 Home, End, Page Up, Page Down,
    Up Arrow, Down Arrow 등의 키를 누르면 포커스를 가진 셀렉트박스의 값을 변경 함
  - 동적 처리 ->

<body onLoad="document.getElementById('selectbox_focus').focus();">
1번 항목

* 셀렉트박스 동적 변경 처리
  - 셀렉트박스의 항목을 동적으로 변경할 경우 reInitializeSelectBox() 메소드를 이용하여 재변환 가능
  - 셀렉트박스의 항목을 동적으로 추가 및 삭제할 경우 변환된 셀렉트박스를 제거 후 다시 변환함
    <script>document.getElementById("SelectBox_Name").reInitializeSelectBox();</script>

<script>
function addItem(selected_index){
  var objSB = document.getElementById("selectbox_dc_1");
  for(i=0; i<10; i++){
    objNewOption = new Option();
    objNewOption.text = "추가된 "+i+"번째 항목";
    objSB.add(objNewOption,objSB.length);
  }
  if(selected_index) objSB.selectedIndex = selected_index;
  objSB.reInitializeSelectBox();
}
</script>

2번 항목

<script>
function changeItem(selected_index){
  var objSB = document.getElementById("selectbox_dc_2");
  for(i=0; i<10; i++){
    objSB.add = new Option("변경된 "+i+"번째 항목",i);
  }
  if(selected_index) objSB.selectedIndex = selected_index;
  objSB.reInitializeSelectBox();
}
</script>
2번 항목

* 색상 및 화살표 이미지 설정
  setColor="일반폰트색상,일반배경색상,롤오버폰트색상,롤오버배경색상,일반보더색상,롤오버보더색상"
  setImage="./arrow_image.gif" (14*16 이하 사이즈)
<select> (기본형)
1번 항목
<select setColor="#000000,#FFFFFF,#000000,#E6E4E4,#C0C0C0,#000000">
1번 항목
<select setColor="white,red,black,white,blue,yellow">
1번 항목
<select setImage="./arrow_image2.gif">
4번 항목
setColor와 setImage 동시 적용
3번 항목

* 툴팁 메세지 설정
  - 셀렉트박스 및 옵션 항목에 툴팁 메세지를 설정하는 것이 가능 함
  - 셀렉트박스 태그 및 옵션 항목 태그에 tooltip="툴팁 메세지" 와 같이 프로퍼티 추가

    <select name='selectbox_tooltip' tooltip='필수 항목이니 꼭 선택하세요'>
     <option value='1' tooltip='첫번째 항목'>1번 항목</option>
     <option value='2' tooltip='두번째 항목'>2번 항목</option>
     <option value='3' tooltip='세번째 항목'>3번 항목</option>
     <option value='4' tooltip='네번째 항목'>4번 항목</option>
     <option value='5' tooltip='다섯번째 항목'>5번 항목</option>
    </select>
3번 항목

* 최대 출력 갯수 설정
  - 옵션 항목 창에 출력될 항목의 갯수를 설정 가능
  - setDisplayCount="출력될 갯수" 를 이용하여 설정

<select name="selectbox_count_1" setDisplayCount="5">
1번 항목
<select name="selectbox_count_2" setDisplayCount="10">
10번 항목
<select name="selectbox_count_3" setDisplayCount="15">
1번 항목

* SelectBox의 넓이 설정
  - style="width:200px" 와 같이 설정 가능
  - 별도의 넓이 설정이 없을 경우에는 변환 전의 셀렉트박스의 넓이 값(this.style.offsetWidth)으로 설정 함
    (offsetWidth 값을 못 읽을 경우 이전 버전에서 사용하던 문자열의 넓이를 픽셀로 구하는 함수 이용)

<select style="width:200px" >
스타일을 200px로 설정함
자동 설정 ( 옵션 내용이 한글만 )
옵션 텍스트가 한글만 있을 경우
자동 설정 ( 옵션 내용이 영문만 )
This option text is english...
자동 설정 ( 옵션 내용이 한글 + 영문 + 숫자 )
한글 + English + 1234567890

* 테이블 안에서의 정렬
  - 테이블 안에서 셀의 정렬에 따라 자동 적용

왼쪽 정렬
왼쪽 정렬
중앙 정렬
중앙 정렬
오른쪽 정렬
오른쪽 정렬

* onChange 이벤트 처리
  - 일반적인 SelectBox와 동일하게 처리

<select onChange="alert('선택값 : '+this.options[this.selectedIndex].value)">
1번 항목
<select onChange="location.href=this.options[this.selectedIndex].value;">
:: 검색 사이트로 이동 ::

* 스크롤바 및 레이어 위치 테스트
  - 셀렉트박스의 문서에서의 위치에 따라 옵션 항목 창을 위로 보여주거나 아래로 보여줌.
  - 또한 한쪽으로 모두 못 보여줄 경우에는 자동으로 스크롤바가 생성됨.
  - 기본적으로는 셀렉트박스를 기준으로 아래위의 공간을 비교하여 더 넓은 공간쪽으로 옵션 항목 창이 출력되나
    공간이 10개 항목이 나올 정도의 높이(204px)가 되면 아래로 나옴
  - 단, 하단 여백이 204px보다 적을 경우에도 하던 여백과 항목의 갯수에 비례해 공간이 될 경우에는 아래로 출력됨
  - 문서를 스크롤하여 아래의 셀렉트박스를 기준으로 아래위의 공간을 조절한 후 셀렉트박스를 클릭하면 알 수 있음

테스트용 1 (항목이 2개)
1번 항목
테스트용 2 (항목이 5개)
1번 항목
테스트용 3 (항목이 10개)
1번 항목
테스트용 4 (항목이 15개)
1번 항목
테스트용 5 (항목이 100개)
1번 항목

* 아이프레임 테스트
  - 아이프레임 또는 프레임 안에 셀렉트박스가 있을 경우 옵션 항목 창이 아이프레임 및 프레임을 넘어서 정상적으로
   출력 가능함



Posted by 1010
반응형

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<meta http-equiv="imagetoolbar" content="no">
<link rel="stylesheet" href="/css/admin.css" type="text/css">
<script language="javascript">
<!--
function Category(value, name, parent, depth) {
  this.value = value;
  this.name = name;
  this.parent = parent;
  this.depth = depth;
  this.length = 0;
}

function addCategory(category, value, name, parent, depth) {
  category[category.length] = new Category(value, name, parent, depth);
  category.length++;
}

var category = new Category();
var category1 = new Category();

addCategory(category, '00', '자동차계약', '01', '1');
addCategory(category, '01', '개인용', '01', '2');
addCategory(category, '02', '업무용', '01', '2');
addCategory(category, '03', '영업용', '01', '2');
addCategory(category, '04', '플러스 개인용', '01', '2');
addCategory(category, '05', '플러스 업무용', '01', '2');
addCategory(category, '06', '참좋은 개인용', '01', '2');
addCategory(category, '99', '기타', '01', '2');
addCategory(category, '00', '자동차보상', '02', '1');
addCategory(category, '01', '대인Ⅰ', '02', '2');
addCategory(category, '02', '대인Ⅱ', '02', '2');
addCategory(category, '03', '대물', '02', '2');
addCategory(category, '04', '자손', '02', '2');
addCategory(category, '05', '자차', '02', '2');
addCategory(category, '06', '무보험', '02', '2');
addCategory(category, '07', '상해', '02', '2');
addCategory(category, '08', '타차', '02', '2');
addCategory(category, '99', '기타', '02', '2');
addCategory(category, '00', '보장사업', '03', '1');
addCategory(category, '00', '장기계약', '04', '1');
addCategory(category, '01', '재물', '04', '2');
addCategory(category, '02', '운전자', '04', '2');
addCategory(category, '03', '저축성', '04', '2');
addCategory(category, '04', '상해', '04', '2');
addCategory(category, '05', '연금', '04', '2');
addCategory(category, '06', '질병', '04', '2');
addCategory(category, '99', '기타', '04', '2');
addCategory(category, '00', '장기보상', '05', '1');
addCategory(category, '01', '재물', '05', '2');
addCategory(category, '02', '상해', '05', '2');
addCategory(category, '03', '질병', '05', '2');
addCategory(category, '04', '연금', '05', '2');
addCategory(category, '05', '저축성', '05', '2');
addCategory(category, '06', '운전자', '05', '2');
addCategory(category, '99', '기타', '05', '2');
addCategory(category, '00', '일반보상', '06', '1');
addCategory(category, '01', '화재', '06', '2');
addCategory(category, '02', '기술', '06', '2');
addCategory(category, '03', '근재', '06', '2');
addCategory(category, '04', '배상', '06', '2');
addCategory(category, '05', '종합', '06', '2');
addCategory(category, '06', '상해', '06', '2');
addCategory(category, '07', '기타특종', '06', '2');
addCategory(category, '08', '종합(物)', '06', '2');
addCategory(category, '09', '기타특종(物)', '06', '2');
addCategory(category, '99', '기타', '06', '2');
addCategory(category, '00', '융자', '07', '1');
addCategory(category, '00', '영업', '08', '1');
addCategory(category, '00', '기타', '09', '1');
addCategory(category, '00', '일반계약', '10', '1');
addCategory(category, '01', '상해', '10', '2');
addCategory(category, '02', '재물', '10', '2');
addCategory(category, '99', '기타', '10', '2');

addCategory(category1, '10000', '자동차계약', '00000', '1');
addCategory(category1, '20000', '장기계약', '00000', '1');
addCategory(category1, '30000', '고객서비스', '00000', '1');
addCategory(category1, '10100', '계약인수', '10000', '2');
addCategory(category1, '10200', '계약관리', '10000', '2');
addCategory(category1, '10300', '계약해지', '10000', '2');
addCategory(category1, '20100', '계약인수', '20000', '2');
addCategory(category1, '20200', '계약관리', '20000', '2');
addCategory(category1, '20300', '계약해지', '20000', '2');
addCategory(category1, '30100', '임직원', '30000', '2');
addCategory(category1, '30200', 'PA', '30000', '2');
addCategory(category1, '30300', 'PA 제기 불만', '30000', '2');
addCategory(category1, '30400', '대출', '30000', '2');
addCategory(category1, '30500', '콜센터', '30000', '2');
addCategory(category1, '30600', 'SOS서비스', '30000', '2');
addCategory(category1, '30700', '현장출동', '30000', '2');
addCategory(category1, '30800', '시스템', '30000', '2');
addCategory(category1, '10101', '증권, 약관, 영수증 미수령', '10100', '3');
addCategory(category1, '10102', '인수기준 불만', '10100', '3');
addCategory(category1, '10103', '계약정보 착오입력', '10100', '3');
addCategory(category1, '10104', '자동이체 갱신특약 안내미흡', '10100', '3');
addCategory(category1, '10105', '특약/보상범위등 상품안내 미흡', '10100', '3');
addCategory(category1, '10106', '계약자 동의없이 임의 계약체결', '10100', '3');
addCategory(category1, '10107', '기타', '10100', '3');
addCategory(category1, '10201', '수납방법 배서누락', '10200', '3');
addCategory(category1, '10202', '자동이체일/갱신/연체/실효안내 미흡', '10200', '3');
addCategory(category1, '10203', '특약/담보변경사항 안내 미흡', '10200', '3');
addCategory(category1, '10204', '기타 요청 배서 지연 및 누락', '10200', '3');
addCategory(category1, '10205', '자동이체 해지/수납방법 변경 후 계좌에서 자동이체됨', '10200', '3');
addCategory(category1, '10206', '차량대체착오', '10200', '3');
addCategory(category1, '10207', '신용정보 유출 여부', '10200', '3');
addCategory(category1, '10208', '기타', '10200', '3');
addCategory(category1, '10301', '해지환급금 불만', '10300', '3');
addCategory(category1, '10302', '관련서류안내착오', '10300', '3');
addCategory(category1, '10303', '해지후 보험료 이체', '10300', '3');
addCategory(category1, '10304', '기타', '10300', '3');
addCategory(category1, '20101', '증권(영수증) 미수령', '20100', '3');
addCategory(category1, '20102', '인수기준 불만', '20100', '3');
addCategory(category1, '20103', '계약정보 착오입력', '20100', '3');
addCategory(category1, '20104', '피보험자 선정 착오', '20100', '3');
addCategory(category1, '20105', '특약/보상범위등 상품안내 미흡', '20100', '3');
addCategory(category1, '20106', '계약자 동의없이 임의 계약체결', '20100', '3');
addCategory(category1, '20107', '기타', '20100', '3');
addCategory(category1, '20201', '자동이체 약정일 임의 변경', '20200', '3');
addCategory(category1, '20202', '영업조직 임의로 실시간 출금', '20200', '3');
addCategory(category1, '20203', '특약/담보변경사항 안내 미흡', '20200', '3');
addCategory(category1, '20204', '수납방법 배서누락', '20200', '3');
addCategory(category1, '20205', '자동이체일/갱신/연체안내/실효안내 미흡', '20200', '3');
addCategory(category1, '20206', '기타 요청 배서 누락', '20200', '3');
addCategory(category1, '20207', '자동이체 해지/수납방법 변경 후 계좌에서 자동이체됨', '20200', '3');
addCategory(category1, '20208', '신용정보 유출 여부', '20200', '3');
addCategory(category1, '20209', '기타', '20200', '3');
addCategory(category1, '20301', '환급금 불만', '20300', '3');
addCategory(category1, '20302', '관련서류 안내착오', '20300', '3');
addCategory(category1, '20303', '해지후 보험료 이체', '20300', '3');
addCategory(category1, '20304', '기타', '20300', '3');
addCategory(category1, '30101', '업무처리 미흡', '30100', '3');
addCategory(category1, '30102', '응대 불친절', '30100', '3');
addCategory(category1, '30103', '약속 불이행', '30100', '3');
addCategory(category1, '30104', '직업윤리 위반', '30100', '3');
addCategory(category1, '30105', '기타', '30100', '3');
addCategory(category1, '30201', '업무처리 미흡', '30200', '3');
addCategory(category1, '30202', '계약후 별도의 관리없음', '30200', '3');
addCategory(category1, '30203', '응대 불친절', '30200', '3');
addCategory(category1, '30204', '약속 불이행', '30200', '3');
addCategory(category1, '30205', '보험료 유용', '30200', '3');
addCategory(category1, '30206', '직업윤리 위반', '30200', '3');
addCategory(category1, '30207', '기타', '30200', '3');
addCategory(category1, '30301', '수당,수수료 관련', '30300', '3');
addCategory(category1, '30302', '조직이관,해촉', '30300', '3');
addCategory(category1, '30303', '영업관리상 불만', '30300', '3');
addCategory(category1, '30304', '기타', '30300', '3');
addCategory(category1, '30401', '대출이자 관련', '30400', '3');
addCategory(category1, '30402', '신용정보 유출 여부', '30400', '3');
addCategory(category1, '30403', '소득정산관련', '30400', '3');
addCategory(category1, '30404', '대출이자연체 안내미흡', '30400', '3');
addCategory(category1, '30405', '기타', '30400', '3');
addCategory(category1, '30501', '응대 불친절', '30500', '3');
addCategory(category1, '30502', '상품/보상/배서 관련 착오안내', '30500', '3');
addCategory(category1, '30503', '변경업무 처리 미흡', '30500', '3');
addCategory(category1, '30504', '기타', '30500', '3');
addCategory(category1, '30601', '정비서비스 불만', '30600', '3');
addCategory(category1, '30602', '부당요금 청구', '30600', '3');
addCategory(category1, '30603', '출동지연', '30600', '3');
addCategory(category1, '30604', '현장조치 미흡', '30600', '3');
addCategory(category1, '30605', '업체 불친절', '30600', '3');
addCategory(category1, '30606', '업체 횡포 (부당한 요구)', '30600', '3');
addCategory(category1, '30607', '직원 복장/태도 불량', '30600', '3');
addCategory(category1, '30608', '기타', '30600', '3');
addCategory(category1, '30701', '현장출동 미실시(지연)', '30700', '3');
addCategory(category1, '30702', '현장조치 미흡', '30700', '3');
addCategory(category1, '30703', '직원 불친절', '30700', '3');
addCategory(category1, '30704', '직원 복장/태도 불량', '30700', '3');
addCategory(category1, '30705', '기타', '30700', '3');
addCategory(category1, '30801', '이메일 및 핸드폰으로 불필요한 안내', '30800', '3');
addCategory(category1, '30802', '전산 등 시스템으로 야기되는 불만', '30800', '3');
addCategory(category1, '30803', '홈페이지 관련 불만', '30800', '3');
addCategory(category1, '30804', '기타', '30800', '3');
 

function initForm() {
    var frm = document.form1;
    var j = 1;
    var k = 1;
    for (i = 0; i < category.length; i++) {
        if (category[i].depth == "1") {
            frm.ins_type.options[0] = new Option(":: 보험종목 ::", "");
            frm.ins_type.options[j] = new Option(category[i].name, category[i].parent);
            j++;
        }
    }
    for (i = 0; i < category1.length; i++) {
        if (category1[i].depth == "1") {
            frm.codeA.options[0] = new Option(":: 대분류 ::", "");
            frm.codeA.options[k] = new Option(category1[i].name, category1[i].value);
            k++;
        }
    }
    frm.ins_type.selectedIndex = 0;
    frm.codeA.selectedIndex = 0;
    changeMiddle(frm.ins_type, frm.ins_s_type, "1");
    changeMiddle(frm.codeA, frm.codeB, "1");
}

function changeMiddle(obj, changeObj, depth) {
    var j = 1;
    var i = obj.selectedIndex;
    if (i < 0) i = 0;
    var value = obj[i].value;
   
    if (obj == document.form1.ins_type) {
        changeObj.options[0] = new Option(":: 보험종목세부 ::", "");
        for (i = 0; i < category.length; i++) {
            var parent = category[i].parent;
            if (parent == value && category[i].depth == "2") {
                changeObj.options[j] = new Option(category[i].name, category[i].value);
                j++;
            }
        }
    } else {
        if (depth == "3") {
            changeObj.options[0] = new Option(":: 소분류 ::", "");
        } else {
            document.form1.codeB.options[0] = new Option(":: 중분류 ::", "");
            document.form1.codeC.options[0] = new Option(":: 소분류 ::", "");
        }
        for (i = 0; i < category1.length; i++) {
            var parent = category1[i].parent;
            if (parent == value) {
                changeObj.options[j] = new Option(category1[i].name, category1[i].value);
                j++;
            }
        }
    }

    changeObj.selectedIndex = 0;
}

function submitForm(){
    alert(document.form1.ins_type.value);
    alert(document.form1.ins_s_type.value);
    alert(document.form1.codeA.value);
    alert(document.form1.codeB.value);
    alert(document.form1.codeC.value);
}

// -->
</SCRIPT>
</head>

<body onLoad="initForm();">

<h1>3단 동적 셀렉트 박스 예제</h1>

<form name="form1" method="get" action="#">
<select name="ins_type" onchange="changeMiddle(this, document.form1.ins_s_type, '2')"></select>
<select name="ins_s_type"></select><br>

<select name="codeA" onchange="changeMiddle(this, document.form1.codeB, '2')"></select>
<select name="codeB" onchange="changeMiddle(this, document.form1.codeC, '3')"></select>
<select name="codeC"></select>
</form>
<input type="button" value="submit" onclick="submitForm();">
</body>
</html>



 

Posted by 1010
06.Ajax2008. 9. 3. 14:39
반응형

Ajax와 XML: 다섯 개의 추천할 만한 Ajax 위젯 (한글)

새로운 그래픽 툴로 Ajax와 XML을 사용하여 사이트 품질 높이기

developerWorks
문서 옵션
수평출력으로 설정

이 페이지 출력

이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기

토론


제안 및 의견
피드백

난이도 : 중급

Jack D Herrington, Senior Software Engineer, Leverage Software Inc.

2007 년 5 월 02 일

Web 2.0은 사용자 경험을 강조하고 있습니다. 이것의 일환으로 고급스러운 방식으로 사용자와 인터랙팅 하고 사용자에게 정보를 제공하는 것입니다. 이러한 새로운 인터페이스들을 위젯이라고 하며, Asynchronous JavaScript + XML (Ajax)을 사용하여 서버와 통신합니다. 사이트와의 상호 작동을 향상시키는데 사용할 수 있는 다섯 개의 위젯에 대해 알아봅시다.

Web 2.0 혁명은 웹 사이트 상에서 고객과 상호 작동하는 독특하면서도 고급스러운 방식이 탄생했다. 이렇게 새롭고 혁신적인 많은 기술들은 서버와 통신하는 그래픽과 위젯을 사용하여 데이터를 가져오는데 까지 진화했다. 이 글에서는, 다섯 가지 위젯을 소개하겠다. 일부는 오픈 소스이고, 일부는 상용이며, 이러한 위젯들은 Ajax와 XML을 통해 서버와 통신한다.

  • carousel: 이 위젯은 작은 그래픽으로 나타난 아이템 리스트를 스크롤 하는데 사용할 수 있는 회전식 이미지 뷰어이다. 사용자가 해당 아이템을 클릭할 때 어떻게 할 것인지는 여러분이 정한다. carousel의 예로는 Flikr 사이트와 Apple의 iTunes 인터페이스가 있으며, 이는 무료로 사용할 수 있으며, 대중적인 jQuery JavaScript 기반이다.
  • SWF/Charts: Adobe Flash 기반 컨트롤은 서버에 있는 차팅(charting) 데이터 및 스타일링 옵션용 XML을 읽고, 데이터에 기반하여 차트를 디스플레이 한다. 인터페이스는 고급스럽고, XML 데이터는 생성하기도 쉬워서 페이지에 동적 그래픽을 빠르게 추가할 수 있다.
  • SWF/Gauge: SWF/Charts의 사촌격인 이 Flash 위젯은 서버에 있는 XML을 사용하여 완전히 커스터마이징 가능한 게이지 디스플레이를 구현한다. 게이지는 비행기 또는 차에 있는 것과 비슷하다.
  • In-place editing: 엄밀히 말하면 위젯은 아니지만, In-place editing 컨트롤은 매력적이고, 대화식으로 사용자에게서 정보를 가져온다. In-place editing 기능은 Scriptaculous 프레임웍에 포함되어 있고, 이는 prototype.js 라이브러리에 있다.
  • DHTML windows: DHTML window는 모델이 없는 윈도우를 페이지 콘텐트에 놓는 장치이다. 사용자들은 윈도우를 이동하고, 사이즈를 조정하며, 제거하기도 한다. 이 윈도우의 콘텐트는 페이지 상에서 JavaScript 코드에 의해 지정되거나, 서버에서 Ajax를 통해 읽힌다. 이러한 유형의 윈도우는 경고 장치로 사용하기에 알맞으며, 전체 페이지를 재 로딩 할 필요가 없는 작은 폼을 가져오는데 알맞다.

SWF/Charts 위젯부터 설명하겠다. 내가 생각하기에 이 위젯이 전개하기에 가장 쉽다. 노력에 비해 보상도 가장 크다.

SWF/Charts 위젯

"한편의 그림이 천마디 말보다 낫다"라는 속담을 무시할 수 없으며 특히, 그래프가 관여된 곳에서는 더욱 그렇다. 그러나, 웹에서의 그래프는 언제나 문제가 되며, 대부분의 웹 프레임웍들은 그래핑 툴이 부족하다. 따라서 여러분 스스로 그래프를 만들어야 한다.

XML로 인코딩 된 데이터를 그릴 수 있는 위젯이 있다면 정말 좋을 것 같지 않은가? 마침 SWF/Charts가 있다. 이 위젯을 사용하려면, 사이트에서 SWF 파일과 이 위젯이 사용하는 추가 SWF 파일들을 다운로드 하고 나서, 사이트에 파일을 설치하고, HTML 페이지 상의 SWF 위젯에 링크를 추가했다. (Listing 1)


Listing 1. Chart_page.html
                
<html><body>

<object
  classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
  codebase="http://download.macromedia.com/pub.../swflash.cab#version=6,0,0,0" 
  width="400" height="250">
<param name="movie"
  value="charts.swf?xml_source=chart_data.xml&library_path=charts_library">

<embed
  src="charts.swf?xml_source=chart_data.xml&library_path=charts_library" 
  width="400" height="250" 
  type="application/x-shockwave-flash" 
  pluginspace="http://www.macromedia.com/go/getflashplayer">
</embed>
</object>

</body></html>

Charts.swf 는 두 개의 매개변수를 취한다. 라이브러리 디렉토리의 위치와 XML 데이터의 URL이다. XML 데이터 포맷은 매우 쉽다. Listing 2는 예제이다.


Listing 2. Chart_data.xml
                
<chart>
  <chart_type>bar</chart_type>
  <chart_data>
    <row>
      <null/>
      <string>2005</string>
      <string>2006</string>
    </row>
    <row>
      <string>Projected</string>
      <number>500</number>
      <number>700</number>
    </row>
    <row>
      <string>Actual</string>
      <number>600</number>
      <number>900</number>
    </row>
  </chart_data>
</chart>

이 파일은 차트용 데이터이고, 선택적인 비주얼 정보도 있다. 이 경우, 필자는 차트 유형을 바(bar) 차트로 지정했다. SWF 파일을 다운로드 했던 사이트에는 더 많은 옵션들과 그래프 유형들이 있다.

Firefox 브라우저에서 파일을 검색하면 그림 1과 같은 그래프를 볼 수 있다.


그림 1. Chart Widget
Chart Widget 보기

기본 컬러 스킴과 모습도 멋지며, 그래프는 중심축 값을 보기 좋게 처리했다. 적은 노력으로 전체적으로 큰 효과를 보았다.

분명히, graph_data.xml 파일을 동적인 웹 페이지로 대체할 수 있었다. 리턴된 데이터가 올바른 포맷으로 되어 있다면 그래프 컨트롤은 적은 부분만 신경 쓰면 된다. 이 글에 있는 대부분의 예제들이 이에 속한다. 사실, 웹 서버(Apache Tomcat 또는 IBM® WebSphere® Application Server)나 웹 프로그래밍 언어(PHP, Microsoft® ASP.NET, Java™ 2 Enterprise Edition [Java EE])를 사용하지 않고도 로컬 파일에 있는 웹 브라우저에서 이 예제들을 실행할 수 있다.




위로


SWF/게이지 위젯

데이터를 나타내는 또 다른 방법은 게이지로 표현하는 것이다. 개인적으로는 게이지에 대해서는 흥미가 별로 없다. 적은 정보를 나타내는 데도 많은 공간을 차지하기 때문이다. 하지만, 게이지는 전문 대시보드의 핵심 기능이기 때문에, 이들을 빠르게 생성하는 기능은 매우 유용하다.

하지만, 웹이 간단한 바 차트도 잘 수행하지 못한다면, 원형 게이지 역시 수행할 수 없다. 따라서, XML/Graph를 만들었던 회사에 문의했다. 그들도 게이지에 대한 솔루션이 있었다. 바로 XML/Gauge였다.

SWF게이지 위젯을 삽입하는 HTML 페이지로 시작하겠다. (Listing 3)


Listing 3. Gauge_page.html
                
<html><body>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
  codebase="http://download.macromedia.com/.../swflash.cab#version=6,0,0,0"
  width="110" height="55">
<param name=movie VALUE="gauge.swf?xml_source=gauge_data.xml">
<embed src="gauge.swf?xml_source=gauge_data.xml"
  width="110" height="55" type="application/x-shockwave-flash"
  pluginspace="http://www.macromedia.com/go/getflashplayer">

</embed></object>

</body></html>	

gauge.swf 영화는 하나의 인자를 취한다. 데이터의 위치이다. 이 경우, 그 위치는 gauge_data.xml이다. (Listing 4)


Listing 4. Gauge_data.xml
                
<gauge>

<circle fill_color="888888" start="275" fill_alpha="100"
  line_color="555555" line_thickness="3" line_alpha="90"
  radius="50" x="55" end="445" y="55"/>
<circle fill_color="99bbff" start="280" fill_alpha="90"
  line_thickness="4" line_alpha="20" radius="45" x="55"
  end="440" y="55"/>
<circle fill_color="666666" start="317" fill_alpha="100"
  line_color="333333" line_alpha="0" radius="44" x="55"
  end="322" y="55"/>
<circle fill_color="666666" start="337" fill_alpha="100"
  line_color="333333" line_alpha="0" radius="44" x="55"
  end="342" y="55"/>
<circle fill_color="666666" start="357" fill_alpha="100"
  line_color="333333" line_alpha="0" radius="44" x="55"
  end="362" y="55"/>
<circle fill_color="666666" start="377" fill_alpha="100"
  line_color="333333" line_alpha="0" radius="44" x="55"
  end="382" y="55"/>
<circle fill_color="666666" start="397" fill_alpha="100"
  line_color="333333" line_alpha="0" radius="44" x="55"
  end="402" y="55"/>
<circle fill_color="666666" start="417" fill_alpha="100"
  line_color="333333" line_alpha="0" radius="44" x="55"
  end="422" y="55"/>
<circle fill_color="99bbff" start="280" fill_alpha="100"
  radius="40" x="55" end="440" y="55"/>
<circle fill_color="FF4400" start="280" fill_alpha="100"
  radius="44" x="55" end="310" y="55"/>
<circle fill_color="44FF00" start="50" fill_alpha="100"
  radius="44" x="55" end="80" y="55"/>
<circle fill_color="99bbff" start="280" fill_alpha="80"
  radius="40" x="55" end="440" y="55"/>
<circle fill_color="333333" start="270" fill_alpha="100"
  line_alpha="0" radius="20" x="55" end="450" y="55"/>

<rotate start="280" shake_span="2" shadow_alpha="15"
  step="1" x="55" span="0" y="55" shake_frequency="20">
  <rect fill_color="ffff00" fill_alpha="90" line_alpha="0"
    height="40" x="53" width="4" y="13"/>
</rotate>

<circle fill_color="111111" start="270" fill_alpha="100"
  line_thickness="5" line_alpha="50" radius="15" x="55"
  end="450" y="55"/>

</gauge>

여러분도 보듯, SWF는 이 위젯에 다른 방식을 취했다. 게이지(또는 그래프)용 데이터를 지정하는 대신, 원, 호, 직사각형 같은 그래픽 프리머티브에서 게이지를 구현한다.

솔직히, 필자는 데이터를 제공할 수 있는 기본 게이지를 선호한다. 하지만, 이 방식도 작동하고, 얼마든지 조정이 가능하다. 비록, 필자는 기본 예제들을 몇 개 더 사용했다.

내 브라우저에 있는 페이지로 갈 때, 그림 2와 같은 게이지를 볼 수 있다.


그림 2. Gauge Widget
Gauge Widget

그래픽 프리머티브를 지정하는 것으로는, 이 위젯에서 얻을 수 있는 것이 많이 없다고 생각할 수도 있다. 그렇지 않다. 이 프리머티브에는 간단한 애니메이션 기술도 포함되어 있어서 바늘과 소리도 넣을 수 있고 사용자가 이것을 클릭하면 브라우저를 검색하는 중요한 연결 영역을 만드는 기능도 있다. 게다가, 이 콘트롤을 게이지에 사용하는 것뿐만 아니라, 간단한 그래픽 프리머티브 언어를 사용하여 어떤 유형의 이미지와 간단한 애니메이션을 구현할 수 있다.




위로


In-place editing

사용자들은 이제 데스크탑 애플리케이션에서 In-place editing을 기대하지만, 이러한 기능은 아직까지는 웹에서는 찾아보기 힘들다. Web 2.0에서는 상호 작동이 우수하기 때문에, In-place editing 같은 기술은 보다 더 일반화 된다.

In-place editing을 구현하려면, 직접 작성하거나, JavaScript 프레임웍들 중 하나를 사용한다. 가장 대중적인 툴킷은 Scriptaculous 프레임웍인데, 이것은 prototype.js에 구현된다. Scriptaculous 라이브러리를 사용하면 In-place editing 컨트롤을 매우 쉽게 구현할 수 있다.

In-place editing용 HTML 테스트 파일은 Listing 5를 참조하라.


Listing 5. Inplace.html
                
<html><head>
<script src="prototype.js"></script>
<script src="effects.js"></script>
<script src="controls.js"></script>
<script src="scriptaculous.js"></script>
</head><body>
<table width="100%">
<tr><th width="10%">Name</th>
<td width="90%"><p id="name">Candy bar</p></td>
</tr></table>
<script>
new Ajax.InPlaceEditor('name', 'submitted.html' );
</script>
</body>
</html>

Inplace.html에는 필요한 모든 JavaScript 소스 파일이 포함된다. 간단한 테이블에 In-place editing 가능한 데이터를 포함하고 있는 단락을 넣는다. 이 파일의 끝에, 이 단락의 InPlaceEditor 객체를 생성하는 스크립트를 삽입한다.

InPlaceEditor 컨스트럭터는 인자로서 단락의 ID와 편집을 수행한 후에 제출을 처리할 페이지의 URL을 취한다. 이 경우, 이 페이지는 submitted.html이다. 하지만 현실적으로, 이것은 ASP.NET, Java EE, 또는 PHP 페이지 또는 기타 동적 웹 기술이다.

Listing 6은 submitted.html 파일이다.


Listing 6. Submitted.html
                
<p>Name changed!</p>

이제 테스트 할 차례이다. 브라우저를 HTML 파일에서 연다. 이곳에서 원래의 텍스트를 보게 된다. 텍스트에 마우스를 갖다 대면, 노란색으로 변한다. (그림 3)


그림 3. in-place editing의 시작 포인트
in-place editing의 시작 포인트

노란색 하이라이팅은 이것을 클릭하여 필드를 편집할 수 있다는 사용자용 인디케이터이다. 따라서, 필자는 그 필드를 클릭하고 Name 필드, ok 버튼, cancel 링크를 만들었다. (그림 4)


그림 4. 클릭한 후 텍스트 편집하기
클릭한 후 텍스트 편집하기

텍스트를 수정하고 ok를 클릭한다. 이렇게 하면 데이터가 서버에 게시된다. (또는 이 경우 submitted.html page). 서버는 원래의 텍스트를 대체하는 HTML 페이지를 리턴한다. 이 경우에, 필자는 Name changed!를 보낸다. (그림 5) 실제로, 이것은 데이터의 새로운 값이 되어야 한다.


그림 5. ok를 클릭한 후 새로운 콘텐트
ok를 클릭한 후 새로운 콘텐트

이와 같은 간단한 인터페이스 업그레이드는 애플리케이션의 가용성에 차이를 만든다. 느린 서버에서 페이지 로드를 기다리는 것은 구식 인터페이스이다. In-place editing 같은 간단한 툴을 사용하면 구현 복잡성의 관점에서 볼 때 애플리케이션에 간단한 몸치장을 한 것과 같다.




위로


DHTML 윈도우

브라우저에서 윈도우를 웹 페이지에 구현하기 힘들다는 것은 좋은 일일지도 모른다. 하지만 가끔씩, 작은 윈도우도 좋은 것이 될 수 있다. 이는 경고를 디스플레이 하거나 작은 폼을 가져오는데 편리하며, 페이지의 내용을 덮어버리는 성가신 광고를 실행하기에 좋은 방법이다. 잠깐 기다려라. 마지막 말은 취소해야겠다.

어쨌든, 내가 말했지만 Dynamic HTML (DHTML) 페이지용 윈도우를 구현하는 것은 쉬운 일이 아니다. 그래서, Protoype.js 라이브러리에 기반한 매우 강력한 윈도우 패키지를 발견했을 때 너무 기뻤다. 사용하기 쉬울 뿐만 아니라, 인터페이스도 가볍고 모든 브라우저에서 잘 작동한다. Listing 7은 window.html 페이지 모습이다.


Listing 7. Window.html
                
<html>
<head>
<link href="default.css" rel="stylesheet" type="text/css" />
<script src="prototype.js"></script>
<script src="window.js"></script>
</head>
<body>
<script>
var win = new Window( 'myPopup', {
   title: "Terms and Conditions",
   top:70, left:100, width:300, height:200,
   resizable: true, url: "terms.html",
   showEffectOptions: { duration: 3 }
  } 
);
win.show();
</script>
</body>
</html>

prototype.js와 window.js 소스 파일을 헤더로 가져온다. 그런 다음, 내가 좋아하는 매개변수(크기, 위치, 타이틀, 위젯이 콘텐트를 얻는 페이지의 URL)로 팝(pop) 객체를 구현한다. Ajax를 통해 페이지에서 콘텐트를 로딩하는 것은 콘텐트를 얻는 방법들 중 하나이다. JavaScript 코드를 통해 동적으로 설정할 수 있고 또는 기존 <div> 태그 주위에 윈도우를 래핑할 수 있다.

이 경우 필자는 terms.html 파일을 참조한다. (Listing 8)


Listing 8. Terms.html
                
<html><body bgcolor="white">
<h1>Terms and Conditions</h1>
<p>In order to use this site you must comply
with the following conditions...</p>
</body></html>

내 브라우저에서 이 페이지를 실행하면 그림 6과 같은 윈도우를 보게 된다.


그림 6. 초기 윈도우
초기 윈도우

이것은 단지 두 개의 Mac 윈도우만은 아니다. Mac 처럼 보이는 DHTML 윈도우가 있고 그 밖에는 실제 Firefox 브라우저 윈도우이다. 하지만 어쨌든 같은 것으로 보여진다.

윈도우를 늘려 이동할 수 있다. (그림 7)


그림 7. 이동 및 크기 조정 후 윈도우 모습
이동 및 크기 조정 후 윈도우 모습

필자는 본 기술자료와 내 작업을 위해 여러 드물 윈도우 라이브러리를 검토했고, 이것이 가장 좋았다고 자신 있게 말할 수 있다. 다른 윈도우 패키지들은 실행 문제들이 있었고, 세그먼트에서 실행되며, 사이즈를 재조정 하면 형편없이 실행되었다. 브라우저 안에 갇힌 실제 윈도우처럼 보인다.




위로


carousel 위젯

많은 사용자 인터페이스(UI)를 다루어본 사람이라면 실제 상태를 나타내는 것이 중요하다고 말할 것이다. 꽉 찬 느낌을 주지 않고 주어진 공간에 최대로 담을 수 있는 데이터를 넣는 것이 중요하다. Apple iTunes의 carousel 컨트롤을 처음 보았을 때 깊은 감명을 받았다.

carousel 컨트롤은 고정된 공간에서 여러 이미지들을 보여준다. 이미지 블록의 왼쪽과 오른쪽은 왼쪽 화살표와 오른쪽 화살표이다. 화살표를 클릭하면, 이미지는 왼쪽 또는 오른쪽으로 이동하고, 새로운 이미지로 대체된다. iTunes 에서, 이 이미지는 앨범 커버였고, 각 장르마다 carousel 컨트롤이 있었다.

공간 절약은 중요하다. 세 개의 공간에 30 개의 앨범 커버를 넣을 수 있고, 각각 알맞은 크기로 보여줄 수 있다. 또한, 이 컨트롤은 매력적이다. 마치, 단순화 된 스크롤바 같다.

carousel의 단점은 구현이 쉽지 않다는 점이다. 특히, 이것의 특징 중 하나가 왼쪽 또는 오른쪽으로 이동하는 이미지의 애니메이션이기 때문이다. 따라서 jQuery JavaScript 프레임웍에 구현된 carousel이라고 하는 오픈 소스 carousel에 대해 알게 되었을 때 기뻤다.

필자는 웹 페이지에 간단한 carousel 위젯을 구현했다. ( Listing 9)


Listing 9. Carousel.html
                
<html>
<head>
<script type="text/javascript" src="js/jquery-1.0.3.js"></script>
<script type="text/javascript" src="js/jcarousel.js"></script>
<style type="text/css">
#mycarousel { display: none; }
.jcarousel-scope {  position: relative; width: 255px;
  -moz-border-radius: 10px; background: #D4D0C8;
  border: 1px solid #808080; padding: 20px 45px; }
.jcarousel-list li { width: 81px; height: 81px;
  margin-right: 7px; }
.jcarousel-list li img { border: 1px solid #808080; }
.jcarousel-list li a { display:block;  outline: none;
  border: 2px solid #D4D0C8; -moz-outline:none; }
.jcarousel-list li a:hover { border: 2px solid #808080; }
.jcarousel-next {  position: absolute; top: 45px;
  right: 5px; cursor: pointer; }
.jcarousel-next-disabled { cursor: default; }
.jcarousel-prev { position: absolute; top: 45px;
  left: 5px; cursor: pointer; }
.jcarousel-prev-disabled { cursor: default; }
.loading { position: absolute; top: 0px;
  right: 0px; display: none; }
</style>
<script type="text/javascript">
function loadItemHandler( carousel, start, last, available ) {
  if (available) { carousel.loaded(); return; }
  var cr = carousel;
  jQuery.get("data.xml", function(data) { appendItemCallback(cr, start, last, data); });
};

function appendItemCallback( carousel, start, last, data ) {
  var items = data.match( /(\<img .*?\>)/g );

  for (i = start; i <= last; i++) {
    if ( items[ i - 1 ] == undefined ) break;
    var item = carousel.add( i, getItemHTML( items[i-1]) );
    item.each(function() {
      jQuery("a.thickbox", this).click(function() {
        var t = this.title || this.name || null;
        var g = this.rel || false;
        TB_show(t,this.href,g);
        this.blur();
        return false;
      });
    });
  }
  carousel.loaded();
};

function getItemHTML( item ) {
  var found = item.match( /href=\"(.*?)\"/ );
  var url   = jQuery.trim(found[1]);
  var title = jQuery.trim(found[1]);
  var url_m = url.replace(/_s.jpg/g, '_m.jpg');
  return '<a href="' + url_m +
	'" title="' + title +
	'" class="thickbox"><img src="' + url +
	'" width="' + 75 + '" height="' + 75 +
	'" alt="' + title + '" /></a>';
};

var nextOver = function() {
  jQuery(this).attr("src", "img/horizontal-ie7/next-over.gif"); };

var nextOut = function() {
  jQuery(this).attr("src", "img/horizontal-ie7/next.gif"); };

var nextDown = function() {
  jQuery(this).attr("src", "img/horizontal-ie7/next-down.gif"); };

function nextButtonStateHandler(carousel, button, enabling) {
  if (enabling) {
    jQuery(button).attr("src", "img/horizontal-ie7/next.gif")
      .mouseover(nextOver).mouseout(nextOut).mousedown(nextDown);
  } else {
    jQuery(button).attr("src", "img/horizontal-ie7/next-disabled.gif")
      .unmouseover(nextOver).unmouseout(nextOut).unmousedown(nextDown);
  }
}

var prevOver = function() {
  jQuery(this).attr("src", "img/horizontal-ie7/prev-over.gif"); };

var prevOut = function() {
  jQuery(this).attr("src", "img/horizontal-ie7/prev.gif"); };

var prevDown = function() {
  jQuery(this).attr("src", "img/horizontal-ie7/prev-down.gif"); };

function prevButtonStateHandler(carousel, button, enabling) {
  if (enabling) {
    jQuery(button).attr("src", "img/horizontal-ie7/prev.gif")
      .mouseover(prevOver).mouseout(prevOut).mousedown(prevDown);
  } else {
    jQuery(button).attr("src", "img/horizontal-ie7/prev-disabled.gif")
      .unmouseover(prevOver).unmouseout(prevOut).unmousedown(prevDown);
  }
}

jQuery(document).ready(function() {
  jQuery().ajaxStart(function() { jQuery(".loading").show(); });
  jQuery().ajaxStop(function() { jQuery(".loading").hide(); });
  jQuery("#mycarousel").jcarousel({
    itemVisible: 3, itemScroll: 2, wrap: true,
    loadItemHandler: loadItemHandler,
    nextButtonStateHandler: nextButtonStateHandler,
    prevButtonStateHandler: prevButtonStateHandler
  });
});
</script></head><body><div id="mycarousel">
<div class="loading">
<img src="img/loading.gif" width="16" height="16" border="0" />Loading...</div>
<img src="img/horizontal-ie7/prev.gif" border="0" class="jcarousel-prev" />
<img src="img/horizontal-ie7/next.gif" border="0" class="jcarousel-next" />
<ul></ul>
</div></body></html>

이전 예제들 보다 방대하다. 하지만 코드 대부분이 그래픽을 설정하고 서버에서 리턴된 Ajax 데이터를 인터프리팅 하는 것이다. 사실, 이 글에 소개된 대부분의 코드는 다운로드에서 제공하는 예제를 기반으로 하고 있다. 따라서 이 콘트롤을 사용하기 위해 많은 부분을 배우거나 문서를 읽을 필요가 없었다.

이 carousel용 데이터는 Listing 10에 나와있다.


Listing 10. Data.xml
                
<images>
<img href="pics/image1.jpg" />
<img href="pics/image2.jpg" />
<img href="pics/image3.jpg" />
<img href="pics/image4.jpg" />
</images>

이 경우, 파일은 <images> 태그와 각 이미지의 URL을 포함하고 있는 <img> 태그 세트들을 갖고 있는 XML 포맷으로 되어있다. 어떤 포맷을 사용하든지 간에, 이 컨트롤은 기본적으로 Ajax 위젯이 아니다. 필자는 XML을 인터프리팅 하는 코드를 작성 중이고, 각각의 슬라이드 엘리먼트를 carousel에 구현하고 있다. 결과는 그림 8과 같다.


그림 8. 이미지 carousel
이미지 carousel

이미지를 클릭하고 그 이미지가 있는 페이지로 갈 수 있다. (또는 내가 지정한 URL로 간다.) 또는, 오른쪽/왼쪽 화살표를 클릭하여 carousel 주위를 스크롤 하여 더 많은 이미지들을 볼 수 있다. 효과는 매우 좋다.




위로


결론

웹 상에서 사용할 수 있는 무료/상용 위젯과 툴들을 소개했다. 이 글을 쓰면서 보았던 많은 툴들이 Ajax를 사용하지 않았고, 이 주제에도 잘 맞지 않았다. 하지만, 그 자체로도 주목할 만한 가치가 있었다. 특히, 필자는 고급의 오픈 소스 WYSIWYG 에디터를 다운로드 할 수 있다는 것에 놀랐다. 사용자들은 자신들의 사이트에 있는 콘텐트에 볼드체, 이탤릭체, 링크, 이미지 등을 사용하려면 텍스트 박스에서 HTML을 사용해야 하는 것에 많이 좌절했다. 이러한 에디터들은 모든 HTML을 숨기고 사용자에게 워드 프로세스 애플리케이션과 비슷한 느낌으로 편집할 수 있도록 해준다.

WYSIWYG 에디터 외에도, 프로그래스 바, 탭 다이얼로그 박스, 아코디언 컨트롤, 클락, 데이트 피커(date picker), RSS, Outline Processor Markup Language (OPML) 리더용 솔루션도 있다. 심지어 대화형 터미널 윈도우용 솔루션도 있다. DHTML 또는 Flash 컨트롤을 직접 구현하기 전에, 인터넷에서 (무료로) 무엇을 사용할 수 있는지 찾아봐야 한다. 이러한 위젯들을 사용하여 많은 노력을 들이지 않고도 사이트에 역동성을 부여할 수 있다.

기사의 원문보기



참고자료

교육

제품 및 기술 얻기

토론


필자소개

Jack D. Herrington은 20년 경력을 지닌 소프트웨어 엔지니어이다. Code Generation in Action, Podcasting Hacks, PHP Hacks 의 저자이다. 30개 이상의 기술자료를 기고했다. (jherr@pobox.com)


Posted by 1010
02.Oracle/DataBase2008. 9. 1. 17:45
반응형
Posted by 1010
90.개발관련문서2008. 9. 1. 13:33
반응형

대략 5분동안 자신의 컴퓨터를 손 봄으로써 인터넷 속도를 빨라지게 할수 있다.
다음과 같이 해서 좀 더 빠른 내 컴퓨터로 인터넷을 활보해보자.

- 내 네트윅에서 이웃 컴퓨터 빨리 찾기:
윈도우의 좌측 하단 "시작" 버튼을 누른후 "실행"을 찾아 "regedit"을 입력한후 확인을 누른다.
"regedit"창에서 다음 항목으로 들어간다.
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Explorer/RemoteComputer/NameSpace.
최종 namespace에서 다음 항목을 삭제하면 된다. {D6277990-4C6A-11CF-8D87-00AA0060F5BF}.

- 웹페이지 빨리 열기:

다음 Tweak 설정이 웹페이지를 빨리 열게해주지만 다운로드 속도에는 영향을 미치지 않는다.

윈도우의 좌측 하단 "시작" 버튼을 누른후 "실행"을 찾아 "regedit"을 입력한후 확인을 누른다.
"Regedit"에서 다음 항목으로 이동한다.

윈도우즈 XP & 2000의 경우HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ServiceProvider

윈도우즈 98, 98SE & ME 경우HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP\ServiceProvider

각 항목으로 이동하면 오른쪽 창에서 다음 엔트리들의 값을 헥사데시말(HEXIDECIMAL)의 값으로 1을 만든다.

DnsPriority = 1
HostsPriority = 1
LocalPriority = 1
NetbtPriority = 1

값을 바꾸기위해서는 각 엔트리에서 오른쪽 마우스 버튼을 눌러야한다.
값을 변경한후 변경된 것이 적용되게 하기 위해서는 컴퓨터를 다시 시작해야한다.

사용자 삽입 이미지

- 인터넷 익스플로러 제대로 설정하기

도구>인터넷 옵션의 일반 탭의 임시 인터넷 파일의 설정 버튼을 누른다.

사용자 삽입 이미지

임시 인터넷 파일 폴더 섹션의 사용할 디스크 공간의 크기를 100MB이하로 설정한다.
사용자 삽입 이미지

연결탭에서 LAN설정 버튼을 눌러 다음 화면의 모든 사항을 선택 해제한다.
사용자 삽입 이미지

개인정보 탭에서 고급 버튼을 누른후 다음 그림과 같이 설정한다.
사용자 삽입 이미지

임시 인터넷 파일의 용량을 100MB로 설정하고 주기적으로 일주일에 한번씩 임시 인터넷 파일을 삭제하라.


- 모뎀 주기적으로 다시 시작하기
모뎀은 하루 24시간 계속 연결되어 있기 때문에 일주일에 한번 정도는 파워를 15초 정도 끈후 다시 연결한다.


- DNS CACHE 수정

윈도우즈 2000 과 xp는 기본적으로 DNS 캐쉬 서비스에서 제대로 된 DNS 정보 또는 잘못된 DNS 정보를 저장하고 있다. 잘못된 DNS정보를 제거하는 기능을 높임으로서 접속 속도의 저하를 제거한다.
다음 엔트리에 있는 값을 모두 0 으로 만든다.
 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters]
"NegativeCacheTime"=dword:00000000
"NetFailureCacheTime"=dword:00000000
"NegativeSOACacheTime"=dword:00000000


- 스파이웨어를 주기적으로 체크해서 제거하기.

- 이더넷 드라이버와 펌웨어를 가능한 최신의 것으로 업데이트하라.


- 필요없는 프로트콜 제거하라.

윈도우지 2000이나 xp의 네트윅 연결에서 필요없는 프로토콜을 제거하라. 집에서 컴퓨터 한대만을 쓴다면 필요한 프로토콜은 TCP/IP만 있으면 된다.

- TCP/IP 제대로 설정하기

XP에서 TCP/IP 인터페이스 메트릭을 1로 설정하라.
파일또는 프린터 공유를 하지 않는다면 Netbios over TCP/IP 사용하지 않기로 설정하라.

사용자 삽입 이미지
Posted by 1010
98..Etc/Etc...2008. 8. 28. 11:45
반응형

무버블타입에 FCKeditor 장착 플러그인

Go to English entry


이 플러그인은 Movable Type내에서 FCKeditor라는 WYSIWYG 에디터를 쉽게, 또 간편히 커스터마이징시켜 사용할 수 있게 해주는 것입니다. 현재 많은 공개된 WYSIWYG 에디터가 존재합니다. 저는 그 중에서 HTMLArea와 FCKeditor를 조금 사용해 봤는데 둘다 매우 좋은 놈입니다. 물론 그 특성상 PC에 약간의 부하를 주긴 합니다만, 이 자체가 이의 사용여부를 가늠할 잣대로서의 비중은 점점 줄어들거라 봅니다.

alogblogMTinterface 플러그인은 매우 많은 대체 MT 템플릿을 이용합니다. 따라서 사용자가 개인적으로 W~G 에디터를 삽입하고자 하거나 혹은 이를 위한 다른 플러그인(EnhancedEntryEditing같은)을 적용하고자 할 경우에, 이런 저런 문제를 겪을 가능성이 크다 봅니다. 그래서 EnhanceEntryEditing(이는 TinyMCE라는 에디터를 달아 줍니다.)라는 같은 류의 플러그인이 존재함에도 이를 새롭게 추가하게 되었습니다.

이 FCKeditor의 가장 큰 특징/장점 중의 하나가 바로 미디어 브라우져라고 불리는 기능입니다. 이를 이용해 간편하게 이미지 등을 엔트리 작성중에 업로드하고 이 주소를 바로 엔트리 상에 삽입해주는 기능인데, TinyMCE의 경우 이 기능이 별도의 플러그인으로 제공되는데...유료더군요. 유료다보니 기능 자체는 FCKeditor의 그것보다 좀더 좋은것 같습니다만, 당연 사용해보진 못했겠죠.

현재 이 페이지가 설명하는 플러그인은 원래 alogblogMTinterface라는 MT의 기본 인터페이스를 획기적으로(^^) 세련되게 변경해주는 플러그인의 업데이트 버전일 뿐입니다. 즉 현재 이 플러그인을 설치하면 FCKeditor만 MT의 기본 인터페이스에 추가시켜주는게 아니라, alogblogMTinterface라는 제 인터페이스위에 깔리게 됩니다. 이를 현재와 같이 별도의 페이지에 설명하는 것은, 이 FCKeditor사용에 좀더 중점을 두고 설명하기 위함입니다. 인터페이스 자체에 대한 의문 등은 원 페이지를 참조하시길 바람니다.

Requirement

  • Movable Type 3.2
  • PHP, FCKeditor의 미디어 브라우져/업로더 이용시

Features

  • 일반 textarea(FCKeditor창이 아닌)창의 크기를 동적으로 변경할 수 있습니다.
  • FCKeditor창의 크기를 커스터마이징할 수 있습니다.
  • 이모티콘과 업로드한 파일을 저장할 UserFiles 폴더의 경로를 커스터마이징할 수 있습니다.
  • MT시스템의 템플릿을 이용해 FCK에디터의 템플릿 기능을 쉽게 이용할 수 있습니다.
  • MT시스템의 템플릿을 이용해 FCK에디터의 스타일 기능을 쉽게 이용할 수 있습니다.
  • alogblogMTinterface의 "classic, sky, peach" 스타일에 맞춘 FCK 스킨을 이용할 수 있습니다.
  • FCKeditor의 미디어 브라우져/업로더를 쉽게 이용할 수 있습니다.

Installation

아래 내용을 차분히 따라 하면 됩니다. 실제 FCKeditor 사용만을 위해선 1번의 설치후에 5,9번 단계의 간단한 확인 조치만 하면 가능합니다. 나머지 단계는 FCKeditor의 템플릿/스타일 기능을 MT내에서 편하게 사용할 수 있도록 하기 위한 별도의 추가 조치입니다.

  1. 이 플로그인을 받아, (mt home) 폴더 밑에서 $ tar xvfz alogblogMTinterface_fck-3.2.04.tar.gz 등과 같은 명령을 통해 풀어줍니다.
  2. (mt home) 폴더 밑에서 $ perl   tools/add-default-templates 명령을 실행합니다.
    ( *** 만약 터미널 환경에서 이 명령을 실행할 수 없는 상황인 경우엔, 직접 이 명령이 하는 일련의 과정을 수행해주면 가능합니다. )

  3. (mt home)/mt-static/FCKeditor 폴더로 가서 $ chmod -R 777 UserFiles 등의 명령으로 모든 권한을 부여합니다.

Trial for verification

FCKeditor를 디폴트로 설정
"Create New Entry"을 눌러 새 엔트리 작성 화면을 열어 봅니다. 아마 FCKeditor가 나타나지 않을 겁니다. 그건 새로운 엔트리의 "Text Formatting" 이 "Convert Line Breaks"로 디폴트로 되어 있기 때문입니다. 디폴트로 FCKeditor를 사용하길 원한다면 블로그 설정에서 "New Entry Default"탭 메뉴에서 FCKeditor를 디폴트 텍스트 포맷팅으로 정해주면 됩니다.
링크/이미지/플래시 브라우져와 업로더
링크 브라우져라는 것은 엔트리 내에 a태그 즉 링크를 삽입할 때, 그 해당 자원의 주소href의 대상을 내 블로그 서버에 있는 어떤 자원을 가리키고자 할 때 사용하는 것입니다. 이미지/플래시도 마찬가지지만 각각의 파일타입에 맞게 제한되는 것만 다릅니다.

먼저 "이미지 삽입" 메뉴버튼을 클릭해 봅니다. 그럼 팝업창이 뜹니다. 여기에서 소위 "업로더"와 "브라우져" 두가지의 조금 다른 방식으로 파일을 서버에 올릴 수 있습니다. Uploader의 경우에는 특정한 서브폴더를 지정할 수가 없고 그냥 UserFiles밑의 특정 폴더밑에만 바로 올립니다. 만약 자신의 별도로 서브폴더를 나눠서 사용하지 않는 상황에서, 이미 올린 파일이 아니라, 지금 새로 올리면서 그 파일을 링크/이미지/플래시의 주소로 이용하고자 할 경우에 편리합니다.

그 팝업창에서 "서버 보기"를 클릭하면 소위 "브라우져" 기능을 이용하는 게 됩니다. 말그대로 해당 파일타입관련한 폴더 밑에다 새로운 서브 폴더를 생성할 수도 있고, 거기에 파일을 올릴 수도 있습니다. 이때 새로운 폴더생성이 되지 않거나, 파일 업로드가 안되면 100에 98, 폴더 퍼미션 문제입니다.

이제 시험삼아 이미지 폴더에 테스트 용으로 올려놓은 cat 이미지 파일과 플래시 파일을 한번 엔트리에 삽입해 봅니다.

FCKeditor의 템플릿/스타일 기능 사용을 위한 준비
지금껏 설치하고 설정한 단계만으로도 충분히 위지윅 기능을 바탕으로 에디터를 사용할 수 있습니다. 만약 지금까지의 단계로도 머리가 조금 복잡하다면, 이하 내용은 당장에 안보셔도 전혀 상관이 없습니다. 이 에디터를 익숙해질 정도로 사용하신 후, FCKeditor의 템플릿과 스타일 기능에도 관심이 생길 때, 아래 내용을 습득하셔도 됩니다.


지금까지의 사항만으로 위지윅 기능과 미디어 브라우져/업로더를 이용하여 편리한 블로깅 환경을 만들 수 있지만, 이것만으로는 FCKeditor의 고급기능과 또 이를 뒷받침하기 위한 이 플러그인의 기능을 다 이용하는 것은 아닙니다. 템플릿과 스타일 지정을 MT의 템플릿 메뉴에서 커스터마이징할 수 있다는 점이 이 플러그인의 최대 특징입니다. 아래 내용을 따라 준비를 합니다.

  1. 먼저 System Overview 아래의 "List Weblogs" 페이지로 가서 현재 생성되어 있는 모든 블로그를 선택한 후에, "Add Default Template(s)" 액션을 실행합니다.
  2. 현재 블로그의 "List Template" 페이지로 가보면, 세 개의 FCKeditor 관련 템플릿을 볼 수 있습니다. 그 각각을 열고 Rebuild 를 해줘서 output file을 만들어 줍니다.
  3. 현재 블로그의 스타일스트 관련(styles-site.css) 템플릿을 열고 그 맨 첫줄에 @import url(fck_editorarea.css); 를 한줄 추가/리빌딩합니다.

* 어쩜 MT의 인덱스 템플릿 목록창에 난데없이 세개의 FCKeditor관련 템플릿이 있어서 의아해 하실수 있을지 모르겠습니다. 이 3개의 템플릿은 이미 설치과정에서 "디폴트" 템플릿으로 MT에 기록시켰고 또 현재 생성되어 있는 모든 블로그에 추가를 마쳤기 때문에 나타난겁니다. "디폴트" 템플릿이 되었다는 것은, 향후에 새로운 블로그를 생성시, 위의 세 템플릿도 같이 생성되어 진다는 뜻입니다. 물론 TemplateRefesh같은 액션을 적용할 수도 있게 됩니다. 이게 먼 소린지 잘 모르시면 설치과정의 2단계에서 있는 addDefaultTemplate 플러그인 페이지를 보시기 바람니다.

FCKeditor 템플릿:
FCKeditor 메뉴바에 있는 "템플릿" 버튼을 클릭해 봅니다. 나타나는 팝업창에서 "Plugin Document"을 한번 선택해 봅니다. 이 템플릿 기능을 이용하면 해당 창에 있던 기존의 내용은 사라지므로, 항상 처음에 템플릿 기능으로 사용해야 합니다. 제가 만들어놓은 플러그인 문서에 맞는 템플릿이 창에 삽입이 되어 나타나면 설정이 잘되어 있다는 뜻입니다.

일반적인 신변위주의 블로그 엔트리의 경우 특별한 문서 템플릿이 필요없지만, 현재 보고 계신 제 플러그인 페이지처럼 특정한 목적을 위해 사용할 경우 보통의 워드프로세서같은 곳에서 흔히 사용하는 템플릿 기능이 많이 요구되어 지는데, 이때 사용하는 것입니다.

만약 이 템플릿 기능을 이용해 나만의 템플릿을 만들어 사용하고 싶다면, MT의 템플릿 메뉴로 가서 "FCKeditor Templates" 라는 이름의 인덱스 템플릿을 열고, 거기에 추가/변경해서 저장/리빌딩해주면 됩니다. 이때 그 출력파일명(fcktemplates.xml)은 변경하면 안됩니다. 열어서 그 내용을 대충 보시면, 어려울건 없습니다. 그 신택스는 매우 직관적이므로 한두번 훑어보면 알 수 있으리라 봅니다.

FCKeditor 스타일
FCKeditor 등과 같은 소위 WYSIWYG에디터의 가장 큰 단점은 바로 폰트의 크기/색상/종류 등을 font태그를 이용해서 마구잡이로 엔트리 내에 하드코딩시킨다는 것입니다. 물론 초보자의 경우엔 별다른 준비없이 간단히 원하는 표현을 즉석에서 사용할 수 있다는 장점으로 작용하지만, 일반적으로는 피해야하는 작성 습관/태그라 할 수 있습니다. 만약 자신이 특정한 표현을 자주 사용한다면 그것을 스타일로 지정해두고, FCKeditor의 스타일 메뉴로 해결하는 것이 좋습니다. 이때 원하는 스타일을 담고 있는 스타일시트는 당연히 FCKeditor에서도 참조하고, 또 실제 출력된 페이지에서도 참조할 것입니다. 이 역할을 MT내에서 쉽게 할 수 있도록 이미 설치과정에서 지겨움을 참고 끝마쳤으므로 실제 사용시엔 그냥 위의 템플릿과 동일한 과정으로 MT의 템플릿 목록에서 "FCKeditor CSS" 와 "FCKeditor CSS Mapping" 템플릿을 열어서 커스터마이징하면 됩니다. 맵핑 파일의 경우에도 마찬가지로 매우 직관적이라 쉽게 그 문법을 이해할 수 있을 것입니다.


테스트 엔트리 Publishing

이 플러그인에는 HTMLArea에 포함되어 있는 작은 형태의 이모티콘도 같이 넣었습니다. 이런 저런 다양한 아이템을 엔트리에 추가해보고(반드시 하나 이상의 스타일 적용해 볼 것) 그것을 퍼블리싱합니다. 이때 결과 페이지에서 특히 스타일이 FCKeditor상에 나타난 것이랑 같게 적용이 되나를 확인합니다. 이는 설치단계의 8번이랑도 연관이 됩니다. 혹 스타일이 제대로 결과 페이지에 나타나지 않는다면... 위 설치단계를 다시 한번 확인하세요.

선택적 개인화(customization)

FCKeditor 창의 높이

FCKeditor 창의 높이도 동적으로 변경할 수 있도록 관련 API를 찾아 보았지만 없어서, 대신에 MT의 각 블로그 아래의 플러그인 설정에서 본문/확장문 각각 창의 높이를 설정할 수 있도록 했습니다. 텍스트 포맷팅을 "none이나 Convert Line Break"로 사용시엔 동적으로 변경가능합니다.

이모티콘

이모티콘은 특히 W~G에디터에선 쉽고 비교적 자주 사용하는 아이템입니다. 이 이모티콘은 그 특성상 특정한 블로그에 전용하다기 보단, MT인스턴스로 생성한 모든 블로그에 공통된 자원입니다. 일단 기본으로 위의 설치 과정을 따르면 (path/to/mt)/mt-static/FCKeditor/emoticons/ 폴더 아래에 이모티콘 파일들이 존재합니다. 만약 여러분의 MT설치 특성상 그 설치 경로가 꽤 깊거나 혹은 이미 기존의 다른 폴더를 공통의 이미지파일 폴더로 사용하고 있어서 이를 계속 유지하고 싶은 경우에 이를 설정해 줄 수 있습니다. 먼저 위 디폴트 경로 아래에 있는 파일들을 원하는 다른 곳에 옮긴 후에 그 변경된 경로를 MT의 "System Overview"내의 플러그인 설정란에서 지정해주면 됩니다.(이모티콘은 모든 블로그에 공통된 자원이기 때문에, 이 경로설정을 개개의 블로그밑이 아닌 시스템밑의 플러그인 설정란에서 하는 것입니다.)

UserFiles

"UserFiles"이라는 이름은 FCKeditor에서 디폴트로 사용하는 폴더명입니다. 이 폴더 밑에 File,Image,Flash등의 서브 폴더가 생기고 그 각각의 아래에 해당 파일들을 업로드하는 식입니다. 위의 설치과정을 따르면 이 경로가 "path/to/mt/mt-static/FCKeditor/UserFiles/"로 됩니다. 이 의미는 무엇일까요? 하나의 MT인스턴스로 생성한 모든 블로그가 공통된 저 경로밑에 파일들을 업로드하고 관리한다는 소립니다. 머 그렇게 사용할 수도 있겠지만, 또 다른 경우에는 각각의 블로그마다 각기 다른 곳(이를테면 바로 각각의 블로그 루트 경로 아래에)에 UserFiles폴더를 두고 각기 독자적으로 관리하고 싶은 경우가 왜 없겠습니까? 이럴땐 마찬가지로 원하는 폴더를 만들어 주고(꼭 UserFiles라는 이름일 필요도 당연히 없겠죠, 다만 관례상 그런 이름을 사용하면 차후에라도 이 폴더가 FCKeditor랑 관련있는 거구나...정도 할순 있겠죠) 그 경로를 MT메뉴의 플러그인 설정란에서 해주면 됩니다. 당연히 이 경로는 블로그마다 설정해주는 개념이므로 각 블로그밑의 플러그인 설정페이지로 가야 되겠죠?

FCKeditor의 툴바 등 기타 변경

이미 에디터의 툴바를 제가 적절히 커스터마이징해서 배포하고 있지만, 사람 취향이 제각각, 분명 난 다르게 툴바를 배치/선택하고 싶다!라는 생각이 없을수 없겠죠. 만약 그런 위험한(^^) 생각을 하셨다면 (mt home)/alt-tmpl/cms/header.tmpl 파일 내에서 적절한 키워드로 찾아서 수정하시면 됩니다.

예를 들면, 폰트 종류/크기 등의 메뉴를 좀더 다양하게 늘려주고 싶다는 생각은 누구나 본능적으로 하게 될거라 봅니다. 버뜨! 참으세요. 앞서 말씀드렸다시파, font태그를 지저분하게(?) 삽입하는 것은 배보다 배꼽이 더 큰 불량 엔트리로 가는 길이기 때문입니다. 가능하다면 자주 사용하는 스타일을 MT템플릿상에서 간편히 만들어 효율적으로 사용하십시요. 이 방법만이 차후에 업데이트 혹은 이런 저런 이유로 재설치시 등마다, 또 다시 FCKeditor 소스를 침투해서 방황하는 무모한 짓을 번번히 되풀이 하지 않는 유일한 길입니다. 그럼에도 불구하고(^^;;;) 초심자를 위해 폰트의 종류/크기 등을 변경하고 싶다면 그 또한 타당성이 있어보입니다. 혹 그런 경우엔 앞선 header.tmpl 파일과 (mt home)/mt-static/FCKeditor/ 폴더 밑의 소스를 뒤져서 헤쳐나가시면 됩니다.

FCKeditor의 source/config 레벨에서 좀더 특화된 customization을 감행하실 경우엔 충분한 지식을 가지고 하시길 바람니다. 또한 그로 인한 어떤 문제에 대해 저에게 도움을 요청하진 말아 주십시요.^^

Trobuleshooting

  • FCKeditor를 플러그인화하면서 종종 에디터가 나타나지 않는 등의 문제가 생겼는데 그런 원인의 대부분이 바로 클라이언트측의 브라우져 환경에 기인하는 것이었습니다. 특히 팝업 필터같은 것을 요즘엔 많이 사용하는데 이것이 FCKeditor의 생성, 미디어 브라우져의 착동 방해 등의 주요원인입니다. 혹 그런 경우에는 필터를 끄거나 혹은 예외목록등을 이용하십시요.
  • 만약 FCKeditor의 브라우져를 원할히 사용할 수 없는 경우의 태반은 앞선 UserFiles/ 폴더 이하 서브폴더 등의 생성/저장 등의 권한 부족문제입니다.
  • 혹 Firefox/Mozillar 에서 엔트리 저장시 공백 페이지만 나타나고, 원 엔트리 작성 페이지로 돌아오지 않는 경우가 생기는 재수없는(^^) 경우를 겪을 수도 있습니다. 이의 직접적인 원인제공 소스는 잘 모르지만, 확실한 것은 MT의 리다이렉션 방법 때문이라는 것입니다. 물론 디폴트 상태의 MT에서는 문제가 없습니다. 대부분이 HTTP의 Location헤더 방법으로 리다이렉션하기 때문입니다. 그런데 만약 설치한 어떤 플러그인이나 기타 원인으로 리다이렉션을 HTML의 META 태그를 이용해 하는 경우에, Firefox + FCKeditor의 환상적 조합에서 약간의 불협화음을 낸다고 합니다. 이런 재수없는 경우가 혹 발생시엔, 이런 점을 중점으로 먼저 설치한 플러그인을 불활성시켜보는 등의 방법으로 공략하십시요. 특히 제가 만든 Cool IRI라는 매우 훌륭한(?) 플러그인이 바로 그 재수없는 케이스를 발생시켰었습니다. 혹 구버전을 쓰셨던 분중에 FCKeditor를 Firefox상에서 사용하실 분들은 신버전으로 업데이트하십시요. 일반적으로 흔치 않은 에러입니다.

Notes

앞서도 약간 말씀드렸다시피 FCKeditor의 기능에 대한 문의나 그 자체의 에러 등은 제 능력 밖이라는 말씀을 드립니다. 특히나 FCKeditor를 제가 제공한 기능 외에 한층 커스터마이징을 시키는 등에서 발생하는 문제는 더더욱 그러합니다. 물론 제가 공개/배포한 범위 내에서의 문제에 대해선 얼마든지 환영입니다. 이를테면, "Entry Body에서의 FCK는 잘 작동하는데 Extended Entry의 창에서 이런 저런 놈은 저런 이런 문제를 발생시킨다. 왜 그런가? (답: 새 컴퓨터를 구입하세요)" 라는 것이 전형적인 이 플러그인 관련한 질문의 한 예일 것입니다. FCKeditor 등의 W~G 에디터 프로그램은 매우 매우 복잡한 프로그램이면서 특히나 브라우져의 특성에 매우 민감한 것입니다. 이 플러그인을 만들면서 FCKeditor의 Wiki사이트 등을 눈팅하면서 느낀 건, 그 (재수없는 경우) 발생하는 원인 모를(더우기 답은 더 잘모를) 비정상적 작동의 경우의 수가 많다는 점이었습니다. 혹 그러한 경우엔 과감히 이를 눈물을 머금고 포기하시고, EnhancedEntryEditing 과 같은 조금 저수준(^^)의 다른 플러그인를 시도해보시길 바랍니다.

FCKeditor와 Movable Type을 연결해 주는 이 작은 플러그인이 맘에 드신다면, 주변분에게 알리는 간단한 엔트리 하나 로깅하시는 센스.

License

FCKeditor follows its own copyright.
Relased under the Creative Commons License.

Version History

  • 3.2.04: FCKeditor 2.1.1 newly added. / Error "Can't call method "preferred_language"..." fixed, thanks dusl for reporting it.
  • 3.2.03: Chinese CSS version added.
  • 3.2.02: Korean/Japanese CSS version added.
  • 3.2.01: for MT 3.2
  • 1.0 : Initial but not released, for MT3.17

  • google.co.kr (91)
  • link.allblog.net (2)
  • search.naver.com (35)
  • google.com (7)
  • search.daum.net (8)
  • kr.search.yahoo.com (1)
  • search.empas.com (10)
  • web.search.naver.com (2)
  • 192.168.0.4 (1)
  • google.co.jp (1)

TrackBack

TrackBack URL: http://alogblog.com/movabletype/korean_plugins/TCode.name/49. 1284914640

QuickPost/Bookmarklet 등과 같은 자동화 도구로 트랙백을 보내시면, 귀하의 트랙백은 이 사이트의 운영자가 승인할 때까지 이 페이지에 표시되지 않습니다. 혹 자동화 방법으로 보내실 경우, 트랙백이 표시되지 않아도, 반복적으로 보내진 말아 주십시요. 감사합니다.


Comments

새 포스트를 선택하면 error loading "http://www.pdaclub.org/blog/fckstyles.xml" 이라는 팝업창이 두번 뜹니다. entry body쪽은 줄만 한줄 보이는데 선택하면 메뉴가 보이긴 합니다. Extended Entry 쪽은 FCKeditor 메뉴가 잘 보이구요. 뭘 봐야 될지 알수 있을까요?

먼저 본문은 디폴트 상태에서 FCKeditor를 줄여놓았구요, 확장문에서는 펼쳐놓았습니다. 본문 창이 상대적으로 작기때문에 설정에서 그렇게 만든겁니다. fckstyle.xml 파일은 FCKeditor의 "스타일"을 엠티의 템플릿에서 일괄적으로 만들 목적으로 있는 겁니다. 아마 에디터에서 스타일 메뉴를 보면 아무것도 안나타날겁니다. 거기에 "Yellow Pen" 같은 스타일이 나타나야 됩니다. 그 이유는 템플릿에 새로 만들어진 관련 템플릿을 각각 리빌딩하지 않았기때문일겁니다. 기본적으로 블로그 루트에 각각 생성되어 있어야합니다. 만약 스타일이나 FCKeditor의 템플릿 기능을 그리 이용할것이 아니라면, 그냥 /blog밑에 fckstyles.xml이름의 가짜 파일을 하나 두면 에러창은 없어질겁니다. 물론 절대 권하는 방법은 아니구요...

저같은 경우는 blog 폴더안의 내용을 지울수도 있을 것 같아서, 이미지 폴러는 루트의 images, 데이터 파일은 루트의 data 폴더를 만들어 이용하고 있습니다. 이 툴은 사용자가 지정한 폴더 안에 Image 같은 폴더를 생성한 후에 사용자가 원하는 폴더를 만들수 있던데요.
File,Image,Flash 라는 폴더안에 사용자가 새로 폴더를 생성하지 말고 사용자가 지정한 폴더안에 새 폴더를 만들수 있게는 안되나요?
(FCKeditor 자체기능이 이런가 싶기도 합니다.)

각 블로그의 플러그인 설정 메뉴에서 UserFiles폴더를 설정할 수 있습니다. 다만 FCK특성상 이 유저파일 폴더 밑의 Image폴더밑에 그림이 저장됩니다. 그러니까 원칙상 웹루트밑의 /images에 FCK를 이용해 그림을 저장하긴 어렵겠죠. 아니면 UserFiles밑에 있는 Images 폴더를 삭제하고 $ ln -s /.../images Images 처럼 한번 링크를 걸어보세요 혹 되는지... 즉 기존에 존재하는 이미지경로에 대한 링크로 UserFiles밑에 Image를 만드는겁니다.

영문링크(http://alogblog.com/movabletype/plugins/tagging_on_the_fly/)에 보면 태그관련 글이 있던데요. 제 생각에는 카타고리를 여러개 만드는것보다, 카타고리는 간단하게 만들고, 각가의 글들에 태그를 붙여 포스트들을 자세히 부류시키면 좋을 것 같아요. 호찬님 블로그같이 태그플러그인을 써보고 싶은데 한글태그는 안되는것 같더군요. 태그까지 영문으로 기입하는것은 제 생각에는 의미가 없는것 같은데, 혹 한글 지원되는 태그app 아시는게 있으시면 추천 좀 부탁드립니다.
http://hochan.net/archives/2006/01/11@05:09AM.html

태그는 대내적/대외적 의미로 나눠 생각해 볼 수 있는데, 대내적으로는 그 성질이 기존의 카테고리와 똑같습니다. 그럼에도 태그(Tagging)라고 별도로 나온것은, 기존의 카테고리는 새로 만들어줄때마다 사용자가 별도의 생성행위를 했어야했지만, 태그는 그냥 keyword란에 원하는 분류를 간단히 써넣기만 하면 되는 즉석생성이랄까요? 하여튼 그런 편리성때문에 생겨나고 또 인기를 얻는거라 봅니다. 어쨋든 그 내부적인 존재의미는 글을 분류하는 것이라 카테고리와 똑같죠. 말자체도 카테고리(category)보단 태그(tag)가 쉽네요. 하지만 이런 즉석 생성의 단점도 있겠죠. 바로 비슷비슷한 분류에 대해 중복적으로 태그를 만들 수있다는 점입니다. blog, blogging, blogs, Movable Type, movalbetype 이런 예에선 설마...싶을 수 있지만, 시간이 갈수록 진짜 태그구름(tag cloud, 원의미는 이것이 아니지만)처럼 유사한 태그로 산재해 나타날 가능성이 있죠. 물론 이건 실제 태그 메타사이트인 technorati등에서도 실제 발생하는 문제라면 문제이기도 합니다. 카테고리를 이용하면 그럴 염려는 없다고 봐야겠죠.

태깅을 해주는(즉 쉽게 카테고리같은 가외의 분류를 해주는) 플러그인은 그 MT 내부적인 기능상으로 두가지 종류가 있는데요, 하나는 태그를 기존의 MT카테고리와 똑같이 취급하면서 DB 의 카테고리 항목을 그대로 이용하는 놈과, 플러그인 데이터를 이용해 별도의 디비로 관리하는 놈이 있습니다. 머 이또한 일장일단이 있겠군요.

대외적 의미로는 태그메타사이트에 자신의 글에 분류를 넣어서 광고한다는 의미겠죠. 제 FCKeditor 플러그인이 Tagging on the fly는 이 목적의 플러그인입니다. 이 목적으론 기존의 카테고리는 불가하다고 봐야죠. 그 불가이유는 태그관련 메타사이트들이 rel="tag" 링크 속성만 이용하기때문입니다. 대내적인 분류목적으로는 걍 카테고리 사용하고 대외적인 광고(?)목적으로는 걍 Tagging on the fly사용하는...
http://www.sixapart.com/pronet/plugins/ 플럭인 디렉토리에서 Tagging 섹션에 보시면 관련된 놈을 몇개 보실수 있습니다. 전 사용해본적은 없지만, 그중 tagwire라는 놈이 일본분이 만드신거라 Multilingual Tagging을 지원한다고 하니 한글도 되지 않을까 싶긴 합니다.

감사합니다. 많은 도움이 될 것 같습니다. 워드프레스에서 태그를 잠깐 써봤습니다. 알록님이 언급한데로 나중에 되려 태그들로 인해 제대로 분류가 되지 않을까봐 단어선택에 많이 고민하게 되더군요. 저 나름대로 태그로 선택할 단어의 표준화를 시켜야 겠죠. 태그메타사이트에서는 개인마다 선택하는 단어가 틀릴수 있으니 어렵긴 하겠네요.

처음으로 FCKeditor를 설치하였습니다.

다른 부분은 문제없이 잘 돌아가는데
이미지 삽입시 링크를 통한 삽입중 서버보기를 실행하면
이상하게 Explorer 스크립트 에러가 발생합니다.

대충 fckimage.html소스를 살펴보니
서버보기시 실행시키는 스크립트가 함수가 LnkBrowseServer() 인듯한데
혹 어떤 문제로 일어나는 것인지 알고 계신지요?

(에러는 359라인에서 처음 발생합니다)

안녕하세요
FCKeditor의 최대(?)장점이 미디어 브라우저이기 때문에 가능하면 사용이 되도록 설정하는게 좋겠죠.
일단 많은(?) 분들이 사용하신 결과 제 플러그인 자체에는 별 문제가 없어보입니다. 가장 문제가 많이 발생하는 부분이 바로 미디어 브라우저입니다. 툴바기능중에 가장 복잡한 것중에 하나이기 때문일겁니다.
제가 보기에, 서버상의 UserFiles 내의 퍼미션이나 혹은 FCKeditor 자체 파일들의 퍼미션이 부족해서 에러가 뜨거나(일반적인 경우) 브라우저 상에서 스크립트 수행을 이런 저런 이유로 막기때문에 생기는게 가장 흔합니다.(이 경우에는 다른 브라우저, 예를 들면 파이어폭스 등에서는 되는데 IE에선 안된다.. 이러기 쉽습니다.)
가장 난해(?)한 문제는 FCKeidtor자체의 문제입니다. FCK 자체가 워낙 복잡한 프로그램이고 또 크로스 브라우징을 목표로 짠거라 모든 경우들 다 완벽하게 지원하지 못하는 경우가 생기는데, 이런 경우에 걸리면 조금 복잡해집니다. 제가 보기에 윈도 서버를 사용하면 리눅스서버 계열보다 조금더 그럴 확률이 크지 않나? 경험적으로 그리 보입니다.
정확히 어떤 원인인지 바로 알기는 어렵지만, IE는 오류 메시지가 그리 자세하지 못해서 원인을 찾아가는데 별 도움이 안되도군요. 파이어폭스나 오페라 에서는 비교적 자세한거 같습니다. 그렇게 해서 특정한 메시지 등을 발견한다면 그걸 근거로 FCKeidotr 포럼을 검색해보는게 비교적 확실한 방법같습니다.
http://sourceforge.net/forum/message.php?msg_id=3637647 하나 검색해보니 이런 비슷한 경우가 나오는데 이게 정확한 케이스인지는 물론 확신못하겠구요...
뚜렷한 해결책을 못드려 죄송합니다. 문제가 있으면 언제든지 코멘트 주세요.

메일로까지 답변을 주셔서 너무나 감사한 마음입니다.

해당 문제는 저의 경우 기본적으로 IE가 관리하는 팝업방지 보안책이
서버 스크립트를 통해 팝업을 띄우는 것을 가로막았기 때문입니다.
팝업차단 사이트에서 해제하여 주시면 사용에는 별다른 지장이 없습니다.

또는 Cookie가 new window로 전달되지 못하는 현상과도 문제가 있을 수
있다고 소스파일의 해당부분 주석에 명시되어 있으나, 이 보다는
위의 문제와 더욱 연관이 있어 보입니다.

그럼 감사한 마음으로 ^^

Posted by 1010
01.JAVA/Java2008. 8. 28. 10:58
반응형
How do I resolve a java.lang.UnsupportedClassVersionError?
Abstract: How do I resolve a java.lang.UnsupportedClassVersionError?

Issue:

When I attempt to run my Servlet, I receive the following exceptions:

javax.servlet.ServletException: Error allocating a servlet instance
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)
com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

root cause java.lang.UnsupportedClassVersionError: untitled1/Servlet1 (Unsupported major.minor version 49.0)
java.lang.ClassLoader.defineClass0(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:537)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1774)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:905)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1370)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1234)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)
com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

How do I resolve this issue?

Solution:

This exception can occur when the source is built targeting a JDK that is not supported by the JDK attempting to run it. In the above example, if the servlet was built targeting only JDK 1.5, but the web server runs JDK 1.4, the above exception will occur.

Check, Project Properties | Build | Java | Target VM, and verify that the Target VM indicates a JDK compatibility that is appropriate for the JDK that is running it. It is recommended to set this field to 'All Java SDKs' for the most compatibility. The only reason you would want to specify a particular version is if your code uses language features that only appear in a particular verison of the JDK, and you want to ensure that users use only a compatible JDK.

Also check, Project Properties | Build | Java | Language Features, and verify that the Language Features are applicable with JDK that is running it.

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

java.lang
Class UnsupportedClassVersionError

java.lang.Object
  extended byjava.lang.Throwable
      extended byjava.lang.Error
          extended byjava.lang.LinkageError
              extended byjava.lang.ClassFormatError
                  extended byjava.lang.UnsupportedClassVersionError
All Implemented Interfaces:
Serializable

public class UnsupportedClassVersionError
extends ClassFormatError

Thrown when the Java Virtual Machine attempts to read a class file and determines that the major and minor version numbers in the file are not supported.

Since:
1.2
See Also:
Serialized Form

Constructor Summary
UnsupportedClassVersionError()
          Constructs a UnsupportedClassVersionError with no detail message.
UnsupportedClassVersionError(String s)
          Constructs a UnsupportedClassVersionError with the specified detail message.
 
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

UnsupportedClassVersionError

public UnsupportedClassVersionError()
Constructs a UnsupportedClassVersionError with no detail message.

UnsupportedClassVersionError

public UnsupportedClassVersionError(String s)
Constructs a UnsupportedClassVersionError with the specified detail message.
Parameters:
s - the detail message.

JavaTM 2 Platform
Std. Ed. v1.4.2

Submit a bug or feature
For further API reference and developer documentation, see Java 2 SDK SE Developer Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.

Copyright 2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.
-------------------------------------------------------------------------

java.lang.UnsupportedClassVersionError

By Alvin J. Alexander, devdaily.com

You know what will really screw with your mind? When there is a 1.4.2 version of a java.exe file in the C:\Windows\System32 directory of your Windows XP system, and you're trying to compile and run a Java 1.5 program from the command line. I kept getting this error message and couldn't figure it out, even though I knew what it meant(!):

C:\Al\JavaProjects\AutomatedGUITester\deploy>java -jar xylocator.jar

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/devdaily/
xylocator/XYLocator (Unsupported major.minor version 49.0)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:537)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
3)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)

I knew that this error message was telling me that I was trying to run a Java program/class with a JVM version that was older than what I compiled it with, but I thought I had everything set up right, including my JAVA_HOME and PATH environment variables. (FWIW, after a little research it looks like the "Unsupported major.minor version 49.0" message refers to Java 1.5.0.)

Now, before you think I'm too crazy I compile my program with this batch file:

REM compile.bat
set JAVA_HOME=C:\jdk1.5.0_06
set PATH=C:\Windows;C:\Windows\System32;C:\jdk1.5.0_06\bin
set CLASSPATH=

javac com/devdaily/xylocator/XYLocator.java

Then I would create my jar file with this batch script:

REM createjar.bat
set JAVA_HOME=C:\jdk1.5.0_06
set PATH=C:\Windows;C:\Windows\System32;C:\jdk1.5.0_06\bin
set CLASSPATH=

jar cfm xylocator.jar Manifest.txt com/devdaily/xylocator/*.class

And finally, I would try to run it like this:

REM runjar.bat (BAD VERSION, NEED TO FIX PATH)

set JAVA_HOME=C:\jdk1.5.0_06
set PATH=C:\Windows;C:\Windows\System32;C:\jdk1.5.0_06\bin
set CLASSPATH=
set QTJAVA=

java -jar xylocator.jar

Now, once I realized that the #%$! java.exe file was in the C:\Windows\System32 directory the problem was easy to fix. I just had to put the Java 1.5 directory in the PATH before the System32 directory, like this:

REM runjar.bat
set JAVA_HOME=C:\jdk1.5.0_06
REM This works because the JDK is in the PATH before the System32
REM directory.
set PATH=C:\jdk1.5.0_06\bin;C:\Windows;C:\Windows\System32
set CLASSPATH=
set QTJAVA=

java -jar xylocator.jar

Now it works like a champ. FWIW, this Java program lets me determine the x/y coordinates of any point I choose on the screen. I basically take a snapshot of the screen, then display that snapshot as an overlay to the entire desktop, then use mouse click information to get the x/y coordinates. Some of this had to be done using Java 1.5.x, or native code, which I don't want to get into because I want this to work on the Mac as well as Windows.

------------------------------------------------------------------------
Posted by 1010
98..Etc/Etc...2008. 8. 27. 18:17
반응형

FCKeditor is an open source text editor for internet. It is compatible with most internet browsers which includes IE, Firefix, Mozilla and Netsacpe. On the server side, FCKeditor offers the JSP Integration Pack which makes it very easy to use FCKeditor in JSP web pages.

1. Download the JSP Integration Pack from the following URL:

http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=129511

And download FCKeditor editor from the following URL:

http://sourceforge.net/project/showfiles.php?group_id=75348&package_id=75845

2. Install FCKeditor in a JSP environment:

Unzip the Java Integration Library, put the jar files FCKeditor-x-x.jar and commons-fileupload.jar in your webapp's WEB-INF/lib/ directory.

Unzip the FCKeditor editor zip file and put all JavaScript scripts in the /FCKeditor/ directory of your webapp.

The director structure is as follows:

/webapp
/FCKeditor
/WEB-INF
/classes
/lib
/fckeditor-x-x.jar
/commons-fileupload.jar

3. Use FCKeditor in jsp pages

1) Put this taglib definition at the top of the JSP page:

<%@ taglib uri="http://fckeditor.net/tags-fckeditor" prefix="FCK" %>

2) Use the tag in jsp:

<FCK:editor id="marketing_scope" basePath="/FCKeditor/" height="300"
skinPath="/FCKeditor/editor/skins/office2003/"
imageBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector"
linkBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/jsp/connector">
</FCK:editor>

3) Config the File Browser Connector by adding the following piece of code in web application's web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<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
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<description>FCKeditor Test</description>
<servlet>
<servlet-name>Connector</servlet-name>
<servlet-class>com.fredck.FCKeditor.connector.ConnectorServlet</servlet-class>
<init-param>
<param-name>baseDir</param-name>
<param-value>/UserFiles/</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>

<servlet-mapping>
<servlet-name>Connector</servlet-name>
<url-pattern>/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
</servlet-mapping>
</web-app>

And put in the fckconfig.js the following line:

FCKConfig.LinkBrowserURL = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Connector=connectors/jsp/connector" ;

4) Get and set the content in the editor with javascript:

function getEditorValue( instanceName )
{
// Get the editor instance that we want to interact with.
var oEditor = FCKeditorAPI.GetInstance( instanceName ) ;

// Get the editor contents as XHTML.
return oEditor.GetXHTML( true ) ; // "true" means you want it formatted.
}

function setEditorValue( instanceName, text )
{
// Get the editor instance that we want to interact with.
var oEditor = FCKeditorAPI.GetInstance( instanceName ) ;

// Set the editor contents.
oEditor.SetHTML( text ) ;
}

4. Full example source code

<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://fckeditor.net/tags-fckeditor" prefix="FCK" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="../sample.css" rel="stylesheet" type="text/css" />

<script type="text/javascript">
function setEditorValue( instanceName, text )
{
// Get the editor instance that we want to interact with.
var oEditor = FCKeditorAPI.GetInstance( instanceName ) ;

// Set the editor contents.
oEditor.SetHTML( text ) ;
}

function getEditorValue( instanceName )
{
// Get the editor instance that we want to interact with.
var oEditor = FCKeditorAPI.GetInstance( instanceName ) ;

// Get the editor contents as XHTML.
return oEditor.GetXHTML( true ) ; // "true" means you want it formatted.
}
</script>

</head>
<body>

Hello World! FCKeditor



<%
String submit = request.getParameter("submit");
if (submit != null) {
String content = request.getParameter("content");
if (content == null) content = "";
out.println("Content: " + content);
out.println("
");
}
%>
<form method="post">
<FCK:editor id="content" basePath="/FCKeditor/" height="300"
skinPath="/FCKeditor/editor/skins/office2003/"
imageBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector"
linkBrowserURL="/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/jsp/connector">
</FCK:editor>


<input type="button" value="Set Value" onclick="setEditorValue('content', 'Hello World!')" />
<input type="button" value="Get Value" onclick="alert(getEditorValue('content'))" />
<input type="submit" value="Submit" name="submit" />
</form>
</body>
</html>
Posted by 1010
98..Etc/Etc...2008. 8. 27. 18:15
반응형

Index of /

      Name                    Last modified      Size  Description
Vanilla-1.1.4.zip 23-Oct-2007 16:55 385K Vanilla/ 24-Oct-2007 01:22 - drupal-6.1.tar.gz 27-Feb-2008 11:55 1.0M drupal/ 26-Dec-2007 00:46 - ichthux/ 12-Sep-2006 07:52 - latest.tar.gz 23-Oct-2006 04:56 735K lugradio/ 23-Sep-2007 07:34 - magento-0.9.17740.zip 19-Mar-2008 11:50 11M magento/ 19-Mar-2008 04:30 - mislaid/ 23-Aug-2006 06:17 - planet/ 27-Jun-2007 02:09 - testbed/ 13-Feb-2005 12:38 -

"""

FCKeditor Django Connector

Author: Nathan R. Yergler <nathan@yergler.net>
Copyright: 2006
License: GNU LGPL; see LICENSE for details.
Version: $Rev$
Updated: $Date: 2006-08-17 11:57:00 -0400 (Thu, 17 Aug 2006) $

Overview

FCKeditor is a Javascript-based rich text editor for web applications. One of the enhanced features it offers is a web-based browser for media files stored on the server. The browser relies on a server-side connector to provide XML responses for commands. FCKeditor includes connectors for many server-side technologies, including a Python CGI implementation. However, when using FCKeditor in a Django application, it is desirable to implement the connector within the Django process. This package provides a Django-based implementation of the FCKeditor server side specification.

Dependencies

The FCKeditor Connector relies on Django and ElementTree. Note that if you prefer to use lxml, you can simply modify the import at the top of views.py from:

from elementtree import ElementTree

to:

import lxml.etree as ElementTree

Usage

To use the FCKeditor Connector you must install the connector as a Django application in your project, connect the appropriate URLs, modify the admin interface to use FCKeditor and finally update the FCKeditor configuration to point to the connector.

Installing the Application

To install the application, simply place the fckeditor_connector Python package in your project directory and add fckeditor_connector to the INSTALLED_APPS setting in settings.py.

After installing the application you need to set two configuration variables found in views.py. BASE_PATH defines the base file-system path for FCKeditor-browsable files. Note that FCKeditor expects that this directory will contain sub-directories for specific file types. For example, if BASE_PATH is set to /var/www/media, FCKeditor expects that /var/www/media/Images will contain image files. See the server side specification for details on FCKeditor file paths.

BASE_URL should contain the base URL for the files served. This has only been tested with files served from the same server URL as Django (using the static files Django view for development).

Connecting the URLs

To enable the FCKeditor Connector URLs in your project, you can add something like:

...

(r'^fckeditor_connector/', include('fckeditor_connector.urls')),

...

to your project urls.py. If you want to use a different prefix, you'll need to use that instead of fckeditor_connector when configuring FCKeditor below.

Configuring FCKeditor

To enable FCKeditor to use the Django connector, you need to update fckconfig.js to point to the connector. The default FCKeditor connector configuration is based on a standard URL schema. Unfortunately this does not work with the Django connector, so we have to specify a complete URL. In fckconfig.js you will find a block on configuration parameters such as:

FCKConfig.ImageBrowser = true ;
FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
FCKConfig.ImageBrowserWindowWidth  = FCKConfig.ScreenWidth * 0.7 ;   // 70% ;
FCKConfig.ImageBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ;  // 70% ;

Below this block add the following line:

FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=/fckeditor_connector/browser/';

Note that if you did not use the suggested URL prefix you will need to modify this line. In particular, the first portion of the Connector query string parameter should contain the base URL provided in your project's urls.py.

Using FCKeditor in the Admin interface

There are several ways to connect the FCKeditor to the Admin interface. The way we have tested with is to replace a specific textarea. To use the FCKeditor, you need to download FCKeditor and put it in a location accessible by Django. Currently we put this underneath the admin media directory. Once you have it accessible, you need to add the following information to the Admin class of the appropriate model:

class Admin:
   # javascript for fck editor
   js = ( 'underlay/fckeditor/fckeditor.js',
          'underlay/news/story.js',
          )

In this case story.js is a small Javascript file which contains the following:

window.onload = function()
{
    // create the FCK Editor and replace the specific text area with it
    var oFCKeditor = new FCKeditor( 'id_text' ) ;
    oFCKeditor.BasePath    = '/underlay/fckeditor/';
    oFCKeditor.ReplaceTextarea() ;
}

Note that id_text is the name of the TextField in your model prepended with id. The BasePath setting should reflect the absolute path you used to make the FCKeditor files available.

Known Issues

The Connector currently only implements File Browser Connector at this point. The Quick Uploader API will be implemented in the future.
Posted by 1010
05.JSP2008. 8. 26. 18:29
반응형
jsp로 RSS페이지를 만드려고 하다가 얼떨결에. jsp에서 RSS 읽어들이는 방법을 익혀 버렸다.
젠장..
1. 먼저 library를 다운받는다.. 다운은 sun 홈페이지에서 손쉽게 찾을수 있다.
    (http://java.sun.com/developer/technicalArticles/javaserverpages/rss_utilities/rss_utils_1.1.zip)
2. 이곳에 있는 jar파일은 WebContent/WEB-INF/lib 폴더에 복사해넣고 tld파일은 WebContent/WEB-INF 폴더에 복사해 넣는다.
3. WEB-INF/web.xml에   
      <taglib>
            <taglib-uri>/WEB-INF/rssutils.tld</taglib-uri>
       
<taglib-location>/WEB-INF/rssutils.tld</taglib-location>
       </taglib>
     를 넣어준다.
4. 그리고 jsp파일에는 맨위에 <%@ taglib uri="/WEB-INF/rssutils.tld" prefix="rss" %>를 넣어주면 끝...

sample )
<%@ taglib uri="/WEB-INF/rssutils.tld" prefix="rss" %>
<rss:feed
url="http://static.userland.com/gems/backend/rssTwoExample2.xml"
feedId="example3"/>
<b>Image: </b><rss:channelImage feedId="example3"/><br>
<b>Title: </b><rss:channelTitle feedId="example3"/><br>
<b>Link: </b><rss:channelLink feedId="example3" asLink="true"/><br>
<b>Description: </b><rss:channelDescription feedId="example3"/><br>
<b>Copyright: </b><rss:channelCopyright feedId="example3"/><br>
<b>Docs: </b><rss:channelDocs feedId="example3"/><br>
<b>Generator: </b><rss:channelGenerator feedId="example3"/><br>
<b>Language: </b><rss:channelLanguage feedId="example3"/><br>
<b>Last Build Date: </b><rss:channelLastBuildDate
feedId="example3"/><br>
<b>Managing Editor: </b><rss:channelManagingEditor
feedId="example3"/><br>
<b>Pub Date: </b><rss:channelPubDate feedId="example3"/><br>
<b>Skip Days: </b><rss:channelSkipDays feedId="example3"/><br>
<b>Skip Hours: </b><rss:channelSkipHours feedId="example3"/><br>
<b>TTL: </b><rss:channelTTL feedId="example3"/><br>
<ul>
  <rss:forEachItem feedId="example3" startIndex="2" endIndex="4">
    <li><rss:itemDescription feedId="example3"/><br><br></li>
  </rss:forEachItem>
</ul>
Posted by 1010
98..Etc/Etc...2008. 8. 26. 13:26
반응형

##이지웍에디터 FCKEditor 설치 및 사용
# 필요성
게시판을 만들든 아니면 단순하게 디비를 이용해서 넣고, 뿌리고를 하다보면 textarea를 써야할 때가 있다.

하지만, textarea를 사용하다 보면 제한적인 기능에 실망을 감출수 없다.

그래서 알아본바 FCKEditor 를 찾아냈다.

기능도 많은 듯하고, 적용해보니 비주얼도 떨어지지는 않았다.



#설치
FCKEditor 공식 홈페이지에 방문한다. 
다운로드 페이지에서 최신 버전을 다운로드 한다. -> 상단에 최신버전의 zip 형식과 tar.gz 형식이 사이좋게 보인다.
다운받은 압축파일을 풀고, ftp로 설치를 원하는 적당한 장소에 업로드한다. 
이지웍에디터 삽입을 원하는 적당한 위치에 스크립트를 삽입한다. 
제대로 작동이 되는지 확인한다. 


# 삽입스크립트
<script type="text/javascript" src="../fckeditor/fckeditor.js"></script>
<script type="text/javascript">
 var sBasePath = '../fckeditor/';
 var oFCKeditor = new FCKeditor( 'name' ) ; // content는 내용의 속성 이름
 oFCKeditor.BasePath     = sBasePath ; // 기본Path를 잡아준다.
 oFCKeditor.Height       = 450 ; // 에디터의 세로 크기 설정
 oFCKeditor.Value        = '' ; // 수정/답변 등의 모드일 경우 value값 설정 가능
 oFCKeditor.Create() ;
</script> 
 주의
fckeditor 은 경로명을 표시... -> 자신의 서버 환경에 맞게 설정 
name 은 textarea name명 -> 자신의 개발 환경에 맞게 설정 
 450 은 보이는 대로 이지웍에디터의 높이값이다. -> 적당히 설정
 

#fckeditor로 이미지 업로드 하기
검색을 하다보니 죄다 ASP, ASP.NET, JAVA 환경에서 업로드 하기위한 설정이나 수정사항만 올라와 있었다.

좌절에 좌절을 딛고 구글링으로 결국 힌트를 하나 얻고, 몇글자 고치니 단순하게 잘 올라간다..

역시 검색은 구글~

##수정부분
파일 업로드 기능(이미지 뿐만 아니라...) /fckeditor/editor/filemanager/connectors/php/config.php 파일을 수정함으로써 사용할 수 있다.

아주 간단하다...

30라인 근처에 보면 다음과 같은 부분이 있다.

$Config['Enabled'] = true ; // 30라인
이 부분이 아마도 false로 되어 있을 것이다.특별히 수정한적이 없다면...

이부분을 true로 고쳐주는 것 만으로도 파일 업로드 기능은 사용가능하다.

보다 세밀한 설정은 아직 안해봤다 -_-;;

Posted by 1010
98..Etc/Etc...2008. 8. 25. 18:21
반응형
JVM terminated. Exit code=1073807364
C:\IBM\SDP70\jdk\jre\bin\javaw.exe
-Xquickstart
-Xms256m
-Xmx1024m
-Xgcpolicy:gencon
-Xscmx96m
-Xshareclasses:singleJVM,keep
-Xnolinenumbers
-XX:MaxPermSize=512M
-jar C:\IBM\SDP70\startup.jar
-os win32
-ws win32
-arch x86
-launcher C:\IBM\SDP70\eclipse.exe
-name Eclipse
-showsplash 600
-exitdata 488_8c
-product com.ibm.rational.rsa.product.ide
-nl en
-vm C:\IBM\SDP70\jdk\jre\bin\javaw.exe
-vmargs
-Xquickstart
-Xms256m
-Xmx1024m
-Xgcpolicy:gencon
-Xscmx96m
-Xshareclasses:singleJVM,keep
-Xnolinenumbers
-XX:MaxPermSize=512M
-jar C:\IBM\SDP70\startup.jar

왜 빨간색이 중복되었는지는 잘??

일단 RSA야.. 그나마 쓰다 전사했지만.. 웹스피어 어플리케이션 서버는 엔터프라이즈 어플리케이션 디플로이하다가 out of memory 났다.. ㅠㅜ

찾아라.. 갖고 놀 수 있는 옵션을..
Posted by 1010
98..Etc/Etc...2008. 8. 25. 18:15
반응형
D:\eclipse\eclipse.exe -vmargs -XX:MaxPermSize=128m -Xms128m -Xmx512m
Posted by 1010
05.JSP2008. 8. 25. 17:14
반응형

JSP 웹서버 셋팅 정리 문서

 

Ver.2007.09.11 (deprecated)

 

 

 

 

- 작성자: 화랑천(정광선)

- 이메일: gsun2@nate.com (nate)

 

- 구축환경: Apache2.2 + Tomcat6.0 + JK1.2 + MySql5 on Linux

 

- 차례

1.    Apache 2.2 Install

2.    Tomcat 6.0 Install

3.    JK 1.2 Install

4.    Apache Configuration

5.    Tomcat Configuration

6.    MySql 5 Install and Configuration

7.    Environment variable Configuration And TIP

8.    PHP5 And ZendOptimizer Install

 

- 참고사항

l  Linux SULinux(Redhat EL4) 버전에서 테스트 되었다.

l  문서는 최신(작성일기준) 버전들의 연동 셋팅방법을 자세히 설명한다.

l  기초적인 것부터 자세히 기술하여 초보자에게 확실한 도움을 주고자 한다.

l  단계를 벗어난 로드밸런싱, 클러스터링등은 다루지 않는다

l  다운로드 받거나 보관될 소스 원본 위치: /usr/local/src

l  원칙적으로 RPM 버전은 사용하지 않는다.

l  다운로드 주소는 마우스 오른 클릭 팝메뉴의 [바로가기 복사] 얻을 있다.

l  관리의 편의성을 위하여 프로그램 설치 디렉토리명에 버전까지 명시한다.

Ex) apache1.3 apache2.0 둘중 실제 사용하는 것을 apache 심볼릭링크


 

 

1. Apache 2.2 Install

 

Apache ? – 정적 파일의 서비스를 담당하는 웹서버

 

Tomcat 자체적으로도 정적 파일 서비스 기능이 있으나 속도가 느리기 때문에 정적 파일만을 전문으로 서비스하는 Apache 연동하여 역할을 분담하는 방식으로 주로 사용한다.

 

문서 작성 기준 버전: 2.2.6  (lastUpdate 2007.09.07)

 

" 버전이 아파치 최선이라고 생각하며, 모든 사용자가 업그레이드하기를 권장한다. 아파치 2.2 2.0 코드베이스와 비교할 수많은 개선점과 성능 향상을 이뤘다" // 아파치 재단 성명서

 

l  Apache2 Reference Doc: http://httpd.apache.org/docs-2.2/

l  Apache2 Download from httpd.apache.org (wget)

l  ]# tar xzvf httpd-2.2.6.tar.gz

l  ]# cd httpd-2.2.6

l  ]# ./configure --prefix=/usr/local/apache-2.2.6 --enable-so --with-mpm=worker

l  ]# make

l  ]# make install

l  ]# cd /usr/local/

l  ]# ln -s apache-2.2.6 apache

l  ]# ln -s /usr/local/apache/htdocs /home/webRoot

l  ]# ln -s /usr/local/apache/logs /logs

 

인터넷에서 접할 있는 여러 apache 설치 문서에서 -–bindir, --sbindir, --enable-layout 등을 사용하여 리눅스 공용 bin, sbin dir 옮기는 경우가 있는데, 관리상 불편을 초래하므로 절대 권장하지 않는다. --prefix 설치경로에 몰아 넣는 디폴트 설정에 따르도록 하자.

 

--enable-so 옵션은 동적공유객체(DSO) 사용 옵션으로 설치 당시의 공유객체들을 정적으로 사용하고 나중에 추가될 공유객체들의 httpd.conf 에서 추가할 있게 한다. (httpd –l 확인)

 

--with-mpm=worker 옵션은 다중처리모듈을 worker 설정한다. worker 방식은 쓰레드를 사용하여 많은 사용자수에 유연하게 대응할 있는 높은 확장성(scalability) 특징이다. 리눅스에서 설치시 기본값은 prepork 인데, 쓰레드를 사용하지 않으며 MaxClient 256 제한이라는 단점이 있다. worker 옵션을 적용하면 적은 메모리를 사용하여 빠른 속도를 있다.

 

$APACHE_HOME/htdocs 디렉토리를 /home/webRoot 심볼릭링크 이유는 이후 가상호스트로 여러 사이트를 운영시 모든 사이트들의 DocumentRoot /home/SITE_ID 처럼 만들어서 관리의 편의성을 통일하고 권한설정의 편의를 위해서 설정한다.


 

l  기타 유용한 Apache configure option

Apache configure 설정은 언제든지 재컴파일을 쉽게 할수 있다.(httpd.conf설정유지됨)

   ]# ./configure --prefix=/usr/local/apache-2.2.4 --enable-so --with-mpm=worker --enable-rewrite --enable-headers

 

--enable-rewrite 정규표현식을 사용하여 URI 포워딩 해주는 유용한 모듈로써 파라미터를 숨겨서 깔끔한 URI 처리가 가능하다.

 

사용되는 사이트의 DocumentRoot(./htaccess 있는 Dir) 설정

<Directory "/home/DOCUMENT_ROOT">

    AllowOverride all

</Directory>

 

 ex) http://domain.com/USER_ID/1234 -> http://domain.com/index.jsp?id=$1&no=$2

        ]# vi DOCUMENT_ROOT/.htaccess

        RewriteEngine On

        RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+)$ ./index.jsp?id=$1&no=$2

 

--enable-headers IE6 버전에서 각각의 프레임에서 쿠키를 구울 없는것을 헤더를 직접 컨트롤함으로써 사용가능하게 하는 목적으로 쓰인다.

 

 ex) Header set P3P "CP=\"ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC\""

 

--enable-cache 튜닝관련하여 민감한 부분으로 확실한 정보가 부족하기 때문에 Reference Doc 링크를 참조하여 사용할 있다면 성능향상을 기대할 있다.

http://httpd.apache.org/docs/2.2/mod/mod_cache.html


 

 

2. Tomcat 6.0 Install

 

Tomcat 이란? – 가장 유명한 JSP, Servlet Container

 

문서 작성 기준 버전: 6.0.14 (lastUpdate 2007.08.09)

 

Tomcat 설치하기 전에 반드시 먼저 JDK 설치되어 있어야 한다.

 

l  JDK Download from java.sun.com (wget) *Linux self-extracting version (not RPM)

l  wget으로 그냥 받을 경우 파일명이 너무 길기 때문에 -O 옵션을 써준다.

l  ]# wget http://192.18.108.208/~~~/jdk-6u2-linux-i586.bin -O jdk-6u2-linux-i586.bin

l  ]# chmod +x jdk-6u2-linux-i586.bin

l  ]# ./ jdk-6u2-linux-i586.bin

l  q (--more-- ,skip)

l  yes (agree)

l  ]# mv jdk1.6.0_02 /usr/local/

l  ]# cd /usr/local/

l  ]# ln –s jdk1.6.0_02 jdk

 

Tomcat 설치는 압축을 푸는 만으로 완료된다.

 

l  Tomcat5.5 Reference Doc: http://jakarta.apache.org/tomcat/tomcat-6.0-doc/

l  Tomcat5.5 Download from tomcat.apache.org (wget)

l  ]# tar xzvf apache-tomcat-6.0.14.tar.gz –C /usr/local/

l  ]# cd /usr/local

l  ]# mv apache-tomcat-6.0.14 tomcat-6.0.14

l  ]# ln -s apache-tomcat-6.0.14 tomcat

l  ]# ln -s /usr/local/tomcat/logs/catalina.out /logs/catalina.out

 


 

3. JK 1.2 Install

 

JK Connector ? - Apache + Tomcat 연동 프로그램

 

[참고1] JK2 Connector 2004.11. 이후 개발 지원 중단되어 더이상 사용되지 않으므로 JK2 최신버전인 것으로 오해하지 않도록 주의. (deprecated)

 

[참고2] JK1.2.21 버전과 JK1.2.23 버전에서 중요한 보안 업데이트가 이루어 졌으므로 반드시 1.2.24이상의 최신버전을 사용해야 한다. 최신버전을 사용하고 있지 않다면 반드시 업데이트 해야한다.

 

문서 작성기준 버전: 1.2.25 (lastUpdate 2007.08.07)

 

JK 설치에는 가지 방법이 있는데, 하나는 일반적인 컴파일로 jk_mod.so 생성 아파치 모듈 디렉토리에 복사하고 설정파일에도 추가하는 동적모듈방식이고, 다른 하나는 아파치를 설치하기 이전에 아파치 소스에 포함하여 아파치 설치 자동으로 설치되는 정적모듈방식이다. 이중 두번째 방식이 성능이 좋으나 Apache2.2 에서 아직 지원되지 않고 있기 때문에 동적모듈방식만 설명한다.

 

l  JK Connector Reference Doc: http://tomcat.apache.org/connectors-doc/

l  JK Connector Download from http://tomcat.apache.org/connectors-doc/ (wget)

l  ]# tar xzvf tomcat-connectors-1.2.25-src.tar.gz

l  ]# cd tomcat-connectors-1.2.25-src/native

l  ]# ./configure --with-apxs=/usr/local/apache/bin/apxs

l  ]# make

l  ]# cp ./apache-2.0/mod_jk.so /usr/local/apache/modules/

 


 

4. Apache Configuration

 

l  ]# vi /usr/local/apache/conf/httpd.conf

 

l  접근권한 디렉토리 변경 (웹서비스 디렉토리 : /home) (line:128)

<Directory “/home”>

l  웹에서 디렉토리 파일리스트 정보 출력막기 (Indexes 삭제) (line:141)

Option Indexes FollowSymLinks

l  디렉토리 인덱스파일 리스트에 index.jsp 추가 (line:163)

DirectoryIndex index.html index.jsp

l  에러로그 파일 설정 - 10메가 초과시 새로운 로그파일 생성 (cronolog 대체추천) (line:183)

ErrorLog "|/usr/local/apache/bin/rotatelogs /logs/errorlog.%y%m 10M"

l  기본 엑세스로그 주석처리 (가상호스트 사이트마다 따로 로깅함) (line:212)

CustomLog logs/access_log common

l  로그 필터링 - 불필요한 이미지파일등의 로그는 하지않음 (line:205)

SetEnvIfNoCase Request_URI "\.(gif|jpg|png|css|js|java|swf|ico)$" do_not_log

 

l  JK Connection 설정부분 추가 (line:마지막)

# JK Connection

LoadModule jk_module modules/mod_jk.so

JkWorkerProperty worker.list=ajp13

JkWorkerProperty worker.ajp13.type=ajp13

JkWorkerProperty worker.ajp13.host=localhost

JkWorkerProperty worker.ajp13.port=8009

JkLogFile "logs/mod_jk.log"

JkLogLevel info

JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

JkMount /*.jsp ajp13

JkMount /*.XXX ajp13

 

마지막줄은 원하는 JSP 파일 확장자를 추가하는 부분으로 $CATALINA_HOME/conf/web.xml (line:368) 위치에 다음과 같이 같은 확장자를 설정해주면 된다. (필수 아닌 선택)

 

<servlet-mapping>

    <servlet-name>jsp</servlet-name>

    <url-pattern>*.XXX</url-pattern>

</servlet-mapping>


 

l  가상호스트 설정 방법

NameVirtualHost * (line:마지막) 추가

<VirtualHost *>

    ServerAdmin admin@server.domain

    DocumentRoot /home/webRoot

    ServerName default.server.domain

    CustomLog "|/usr/local/sbin/cronolog /logs/SITE_ID/%y%m%d.log" combined env=!do_not_log

</VirtualHost>

 

- 처음설정은 디폴트 호스트(DocumentRoot)로써 주로 비워두거나 테스트용도로 설정한다.

- [주의] 가상호스트로 사용하기 위해선 반드시 위에서 설정한 <Directory “/home”> 확인해야한다. 이를 설정하지 않는다면 모든 가상호스트들 접속시 403에러(접근권한에러) 난다.

- 이후 추가되는 가상호스트는 같은 형식으로 추가 DocumentRoot ServerName 수정

 

l  Cronolog - 위에서 설정한 날짜 로그기록 유틸

- http://cronolog.org/download/cronolog-1.6.2.tar.gz

- cronolog 설치 ( ./configure > make > make install )

 

l  아파치의 접속자수 제한 튜닝 (동시접속자수 수백명이상일경우)

#Include conf/extra/httpd-mpm.conf (line:367) 주석 제거

]# vi /usr/local/apache/conf/extra/httpd-mpm.conf (worker 부분만 수정)

MaxClient 값의 제한은 ServerLimit*ThreadsPerChild 이므로 기본값에 의한 최대치는 현재 400 이다.(16*25) 최대치를 1024 정도로 맞추자면 다음과 같이 설정한다.

 

StartServers               16

MaxClients                  1024

MinSpareThreads         128

MaxSpareThreads        256

ThreadsPerChild           64

MaxRequestsPerChild    0

 

 




5. Tomcat Configuration

 

-      server.xml

 

l  Reference Doc: http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/

l  <Connector port="8080"> 모두 주석처리 (아파치와의 커넥터(ajp13) 사용)

l  <Connector port="8009"> URIEncoding="UTF-8" 추가. (GET request 한글처리)

 

l  가상호스트 설정(아파치와 똑같이 설정)

<Host name="virtual.host.domain" appBase="/home/virtualHomeDir" autoDeploy="true">

<Context path="" docBase="" reloadable="true" allowLinking="true"></Context>

</Host>

 

l  DBCP JNDI 설정

- <GlobalNamingResources>내에 다음과 같은 형식으로 추가.

<Resource name="jdbc/name" auth="Container" type="javax.sql.DataSource"

driverClassName="com.mysql.jdbc.Driver"               url="jdbc:mysql://xxx.xxx.xxx.xxx:3306/dbname?autoReconnect=true&amp;useUnicode=true&amp;min-connections=2"

username="dbid" password="dbpasswd" maxActive="25" maxIdle="10" maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"/>

- 사용할 <Context></Context> 내에 다음과 같이 ResourceLink 추가

<Context path="" docBase="" reloadable="true">

<ResourceLink name="jdbc/name" global="jdbc/name" type="javax.sql.DataSource"/>

</Context>


 

-      web.xml

 

l  “$CATALINA_HOME/conf/web.xml” “appBase/docBase/WEB-INF/web.xml” 이해

모든 application 설정 모두 적용되며, 해당 application 따라 conf/web.xml WEB-INF/web.xml include 되는 개념이다. 따라서 파일에 중복 설정은 불가능하며, 기본적인 공용 설정부분을 conf/web.xml 쓰고, 해당 application에서만 쓰이는 설정을 WEB-INF/web.xml 설정하면 된다. 보통 WEB-INF/web.xml 다음과 같이 만들어주면 된다.

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

    version="2.4"></web-app>

 

l  POST request 한글처리

]# cd /usr/local/tomcat/webapps/examples/WEB-INF/classes

]# jar cvf filters.jar ./filters

]# mv filters.jar /usr/local/tomcat/lib/

]# vi conf/web.xml (맨하단 </web-app> 바로윗줄에 추가)

 

<!-- Charactor Encoding(Only POST method Request -->

<filter>

<filter-name>Set Character Encoding</filter-name>

<filter-class>filters.SetCharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

 

<filter-mapping>

<filter-name>Set Character Encoding</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


 

 

6. MySql Install and Configuration

 

문서 작성 기준 버전: 5.0.45 (last update 2007.07.04)

 

설치 mysql 계정이 있는지 반드시 확인하고, 없으면 생성한다. (useradd mysql)

 

l  MySql5.0 Download from dev.mysql.com (wget)

l  ]# tar xzvf mysql-5.0.45-linux-i686.tar.gz -C /usr/local/

l  ]# cd /usr/local

l  ]# ln -s mysql-5.0.45-linux-i686 mysql

l  ]# cd mysql

l  ]# ./scripts/mysql_install_db

l  ]# chown –R mysql.mysql .

l  ]# cp support-files/my-huge.cnf /etc/my.cnf

l  ]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

l  ]# ln –s ../init.d/mysqld /etc/rc0.d/K01mysqld

l  ]# ln -s ../init.d/mysqld /etc/rc3.d/S99mysqld

l  ]# service mysqld {start|stop}

l  ]# vi /etc/my.cnf

[client]

default-character-set = utf8

[mysqld]

user = mysql

wait-timeout = 300

max-connections = 200

default-character-set = utf8

language = /usr/local/mysql/share/mysql/korean/

[mysqldump]

default-character-set = utf8

[mysql]

default-character-set = utf8

l  Connector/J Install

Connector/J Download from dev.mysql.com (wget) (/usr/local/src)

]# tar zxvf mysql-connector-java-5.0.7.tar.gz

]# cd mysql-connector-java-5.0.7

]# mv mysql-connector-java-5.0.7-bin.jar /usr/local/jdk/jre/lib/ext/

l  계정생성 권한설정

grant select,insert,update,delete,create,drop on databasename.* to 'id'@'lo

calhost' identified by 'pass';


 

 

7. Environment variable Configuration And TIP

 

l  다음과 같이 /etc/profile 환경변수를 추가할때 alias 추가해주자.

]# vi /etc/profile (맨하단에 추가)

 

# user alias

alias tl='tail -f /usr/local/tomcat/logs/catalina.out'

alias ac='vi /usr/local/apache/conf/httpd.conf'

alias tc='vi /usr/local/tomcat/conf/server.xml'

 

# user environment

export APACHE_HOME=/usr/local/apache

export JAVA_HOME=/usr/local/jdk

export CATALINA_HOME=/usr/local/tomcat

export CATALINA_OPTS="-server"

export MYSQL_HOME=/usr/local/mysql

export PATH=$PATH:$JAVA_HOME/bin

export PATH=$PATH:$CATALINA_HOME/bin

export PATH=$PATH:$APACHE_HOME/bin

export PATH=$PATH:$MYSQL_HOME/bin

 

l  서버 부팅 후에 바로 서비스가 실행되게 하는 설정

리눅스도 윈도우와 마찬가지로 MYSQL 설치 부분 에서 설정 한것과 같은 서비스방식과 윈도우의 시작프로그램과 같은 방식이 있다. 이중 TOMCAT APACHE 서비스방식보다 윈도우의 시작프로그램과 같은 방식이 편하기 때문에 이를 설명한다.

 

]# vi /etc/rc.d/rc.local (맨하단에 추가)

 

source /etc/profile

catalina.sh start

apachectl start

 

l  UTF-8 환경

UTF-8 인코딩은 완벽하게 한글을 지원할 뿐만 아니라 유니코드로써 다국어 지원 코드이다. 따라서 현재까지 많이 사용되어왔던 EUC-KR 인코딩 방식의 미지원한글 깨짐 문제를 해결할수 있다. 하지만 UTF-8 사용하기 위해서는 서버환경설정 뿐만아니라 작성되는 문서도 UTF-8 인코딩 저장되어야 한다. 따라서 개발할 사용되는 에디터에서 반드시 저장옵션을 UTF-8 해야한다.


 

 

8. PHP5 And ZendOptimizer Install

 

PHP ? - JSP 같은 웹서버 스크립트 언어를 뜻함과 동시에 Tomcat같은 웹서버컨테이너 프로그램.

 

기본적인 JSP 셋팅이 완료된 시점에서 PHP 설치는 선택사항으로써 필요한 경우에만 설치한다. 이는 JSP PHP 동시에 사용하고자 필요한 경우로써 매력적인 공개소스 하나인 제로보드 PHP 환경에서 실행되기 때문이다.

 

[참고] Tomcat 경우 Apache 와의 연동이 필수가 아닌 선택이지만 PHP 반드시 Apache 설치가 필수이다.

 

l  PHP5 Reference Doc: http://doc.php.net/php/dochowto/

l  PHP5 Download from http://www.php.net/downloads.php (wget)

l  ]# tar zxvf php-5.2.4.tar.gz

l  ]# cd php-5.2.4

l  ]#./configure --prefix=/usr/local/php-5.2.4--with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql--with-zlib --with-gd --with-ttf --with-png-dir

l  ]# make

l  ]# make test

l  ]# make install

l  ]# cp php.ini-dist /usr/local/php-5.2.4/lib/php.ini

l  ]# cd /usr/local/

l  ]# ln -s php-5.2.4 php

 

Zend Optimizer ? - PHP 성능을 40%가량 향상시켜 주는 최적화 유틸

 

l  Zend Optimizer Download from : http://www.zend.com/free_download/optimizer

[참고] 가입필수이며, wget 사용이 불가함. 다운로드 ftp 등을 통하여 업로드.

l  ]# tar zxvf ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz

l  ]# cd ZendOptimizer-3.3.0a-linux-glibc21-i386

l  ]# ./install

l  [TEXT GUI] 보통 OK YES EXIT 등의 단일선택으로 넘어가고 php.ini 경로만 적어주면 된다.

 

Apache httpd.conf 설정 (ac)

 

l  DirectoryIndex index.htm index.jsp index.php - index.php 추가

l  LoadModule php5_module modules/libphp5.so - 확인

l  AddType application/x-httpd-php .php .phtml - 추가

l  AddType application/x-httpd-php-source .phps - 추가
Posted by 1010
98..Etc/Etc...2008. 8. 25. 16:50
반응형

실제 이미지 업로드는 정상적으로 되는데 말이죠... (파일은 올라가 있음)
계속 사용권한이 없다는 JS는 오류메시지가 나왔거든요.

그런데, 이상하게도 오류메시지 없이 정상적으로 되었다가, 안되었다 하더군요~

고고참!

그런데... 미닝님 덕분에 깔끔하게 해결 되네요~!


해당포스트:
http://choimin.net/tc/entry/17

fckeditor 2.6 다운로드: http://www.fckeditor.net/download

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

 

 

참말로 편한 fckeditor 2.6버전에 버그가 있다...

젠장 한참 찾았다는...

아래 파일들을 각각 수정하면 되삼...


editor/filemanager/connectors/asp/io.asp

old new  
223 223     ' Test if we can access a parent property. 
224 224     Response.Write "        try" 
225 225     Response.Write "        {" 
226       Response.Write "            var test = window.top.opener.document.domain ;"
  226     Response.Write "            var test = window.parent.OnUploadCompleted ;"
227 227     Response.Write "        break ;" 
228 228     Response.Write "    }" 
229 229     Response.Write "    catch( e ) {}" 



editor/filemanager/connectors/cfm/cf5_upload.cfm

old new  
56 56                 // Test if we can access a parent property. 
57 57 "               try"& 
58 58 "               {"& 
59   "                       var test = window.top.opener.document.domain ;"&
  59 "                       var test = window.parent.OnUploadCompleted ;"&
60 60 "                       break ;"& 
61 61 "               }"& 
62 62 "               catch( e ) {}"& 

editor/filemanager/connectors/cfm/cf_io.cfm

old new  
276 276                 // Test if we can access a parent property. 
277 277                 try 
278 278                 { 
279                           var test = window.top.opener.document.domain ;
  279                         var test = window.parent.OnUploadCompleted ;
280 280                         break ; 
281 281                 } 
282 282                 catch( e ) {} 


editor/filemanager/connectors/lasso/upload.lasso

old new  
85 85                 // Test if we can access a parent property. 
86 86                 try 
87 87                 { 
88                           var test = window.top.opener.document.domain ;
  88                         var test = window.parent.OnUploadCompleted ;
89 89                         break ; 
90 90                 } 
91 91                 catch( e ) {} 


editor/filemanager/connectors/perl/commands.pl

old new  
183 183                 // Test if we can access a parent property. 
184 184                 try 
185 185                 { 
186                           var test = window.top.opener.document.domain ;
  186                         var test = window.parent.OnUploadCompleted ;
187 187                         break ; 
188 188                 } 
189 189                 catch( e ) {} 


editor/filemanager/connectors/php/io.php

old new  
288 288                 // Test if we can access a parent property. 
289 289                 try 
290 290                 { 
291                           var test = window.top.opener.document.domain ;
  291                         var test = window.parent.OnUploadCompleted ;
292 292                         break ; 
293 293                 } 
294 294                 catch( e ) {} 


editor/filemanager/connectors/py/fckoutput.py

old new  
111 111                                         // Test if we can access a parent property. 
112 112                                         try 
113 113                                         { 
114                                                   var test = window.top.opener.document.domain ;
  114                                                 var test = window.parent.OnUploadCompleted ;
115 115                                                 break ; 
116 116                                         } 
117 117                                         catch( e ) {} 





원글 : http://link.allblog.net/11266998/http://hanvalley.tistory.com/147

Posted by 1010
98..Etc/Etc...2008. 8. 25. 16:31
반응형

웹개발시 종종 필요로 하는 웹기반 HTML에디터..

Sourceforge에 등록되어 있는 오픈소스 웹기반 HTML 에디터의 종류와 기능비교  및 미리보기

순서는 Sourceforge의 Activity 순


- FCKeditor (http://sourceforge.net/projects/fckeditor/)
  * IE의 Editor Object 를 이용하여 제작
  * jsp, php, asp에 대응하는 이미지 업로드 및, 브라우징 기능
  * 미리 정의된 3가지 형태의 툴바 형태제공
  * 간편하게 기존 소스에 추가 가능
  * 테이블 편집 기능 지원
  * 타 사이트 내용 copy&paste시 이미지 경로 변경 필요
  * 다양한 언어 지원(한글포함)

  * 완성도 높음.. 강추!
  * sample - http://pistos.pe.kr/FCKeditor/_test/test.php

- HTMLarea (http://sourceforge.net/projects/itools-htmlarea)
  * 이미지 업로드 지원 안함
  * 풀스크린 편집 지원
  * 영문메뉴만 지원
  * 타 사이트 내용 copy&paste시 이미지 경로 변경 필요 없음  
  * PHP Image Editor 지원 (http://sourceforge.net/projects/imgmngedt/)

  * 한글화 및 이미지업로드만 커스터마이징하면 FCK에 떨어지지 않을듯
  * sample - http://pistos.pe.kr/htmlArea/examples/full-page.html

 

- SPAW web-based WYSIWYG editor control (http://sourceforge.net/projects/spaw/)
  * 예쁜 디자인
  * 이미지 라이브러리 기능
  * 이미지 업로드 지원 안함  
  * 타 사이트 내용 copy&paste시 이미지 경로 변경 필요 없음

  * 디자인만 놓고 보면 최고! 그러나 이미지삽입부분이 맘에 들지 않고, 사소한 버그가 좀 있는듯.
  * sample - http://pistos.pe.kr/spaw/test.php

 

- hypertextarea (http://sourceforge.net/projects/hypertextarea/)
  * 기본적인 기능만 제공
  * 이미지 업로드 지원 안함
  * 심플한 디자인
  * 타 사이트 내용 copy&paste시 이미지 경로 변경 필요 없음

  * 바로 갖다 쓰기엔 스크립트에러의 압박이 심함..
  * sample - http://pistos.pe.kr/hypertextarea/javascript/demo.html

 

- RichText-editor (http://sourceforge.net/projects/richtext/)
  * 브라우저 언어설정이 한글인경우 문제있음(한글지원 커스터마이징 필요)
  * 이미지 업로드 지원 안함
  * 타 사이트 내용 copy&paste시 이미지 경로 변경 필요 없음

  * 한때는 꽤 잘나가는 녀석이었는데... 이제는 경쟁력이 떨어짐.. 가져다 쓰려면 고쳐야 할것도 많음.
  * sample - http://pistos.pe.kr/richtext/editor/rte/richedit.html

 

- aynHTML (http://sourceforge.net/projects/aynhtml/)
  * 이미지업로드 지원
  * 이미지 저장소 지원
  * 깔끔한 디자인
  * 타 사이트 내용 copy&paste시 이미지 경로 변경 필요 없음

  * 나름대로 깔끔함.. 소스보기시 컬러링도 해주고.. 간단히 쓰기엔 좋을듯
  * sample - http://pistos.pe.kr/aynHTML/

 

- XsDhtmlEditor (http://sourceforge.net/projects/xsdheditor/)
  * 심플한 디자인
  * 이미지 업로드 지원
  * 타 사이트 내용 copy&paste시 이미지 경로 변경 필요 없음

  * 바로 쓰기에는 버그가 좀 있음..
  * sample - http://pistos.pe.kr/XsDhtmlEditor/

 

- bpEditor ( http://sourceforge.net/projects/bpeditor/)
  * 만들다 만듯..ㅡㅡ
  * sample - http://pistos.pe.kr/bpShitEditor/bpShitEditor.php

Posted by 1010
98..Etc/Etc...2008. 8. 25. 15:59
반응형
web.config 에 아래 부분 추가해 주시고

<appSettings>    
  <add key="FCKeditor:UserFilesPath" value="/UserFiles/temp/"></add>
  <add key="FCKeditor:BasePath" value="~/FCKeditor/"></add>
</appSettings>

 

fckconfig.js 파일 열어서

var _FileBrowserLanguage    = asp ;  // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage    = asp ;  // asp | aspx | cfm | lasso | php



var _FileBrowserLanguage    = 'aspx' ;  // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage    = 'aspx' ;  // asp | aspx | cfm | lasso | php

로 바꿔주십시요.
 

자세한 내용은 wiki.fckeditor.net 을 참조하십시요.



자료출처
http://blog.naver.com/lsv400?Redirect=Log&logNo=100043893231
Posted by 1010