'2008/08'에 해당되는 글 121건

  1. 2008.08.28 무버블타입에 FCKeditor 장착 플러그인
  2. 2008.08.28 java.lang.UnsupportedClassVersionError
  3. 2008.08.27 Using FCKeditor in JSP web pages
  4. 2008.08.27 FCKeditor Django Connector
  5. 2008.08.26 jsp에서 RSS 읽어들이는 방법을
  6. 2008.08.26 이지웍에디터 FCKEditor 설치 및 사용 3
  7. 2008.08.25 JVM terminated. Exit code=1073807364
  8. 2008.08.25 eclipse mem 문제...
  9. 2008.08.25 JSP 웹서버 셋팅 정리 문서
  10. 2008.08.25 fckeditor 2.6 파일 업로드 버그 1
  11. 2008.08.25 웹개발시 종종 필요로 하는 웹기반 HTML에디터..
  12. 2008.08.25 FCKeditor 이미지 업로드
  13. 2008.08.25 FCKeditor java 버전 설치
  14. 2008.08.20 www.eclipse-plugins.info
  15. 2008.08.20 자바 Security 알고리즘 보기 1
  16. 2008.08.20 서버이전시 생긴 문제!!! <<org.apache.jasper.JasperException: Unable to compile class for JSP>>
  17. 2008.08.20 자바에러메세지정리
  18. 2008.08.19 아파치 로그분석툴 awstats 설치/활용 가이드 1
  19. 2008.08.19 보안서버구축 의무화...구축방법...
  20. 2008.08.19 java에서 properties 활용 가이드 라인
  21. 2008.08.19 파일이 어떤 포맷인지 알아볼때..
  22. 2008.08.19 Java 맵 컬렉션 클래스의 소개
  23. 2008.08.19 파일 다운로드 관련 팁
  24. 2008.08.19 DBUtils에서 Clob 사용하기
  25. 2008.08.19 POI의 HSLF를 이용하여 PowerPoint 문서를 읽어보자
  26. 2008.08.19 POI의 HWPF를 이용하여 MS WORD문서를 읽어보자
  27. 2008.08.19 Validator 속성들
  28. 2008.08.19 Commons-Fileupload 1.2
  29. 2008.08.19 DBUtils에서 number 타입의 컬럼이 int형으로 안넘어올때..
  30. 2008.08.19 Installing Tomcat with commons-daemon (jsvc)
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
01.JAVA/Java2008. 8. 25. 14:22
반응형
Posted by 1010
98..Etc/Etc...2008. 8. 20. 15:14
01.JAVA/Java2008. 8. 20. 15:11
반응형

만약 내가 특정 알고리즘으로 파일을 인코딩하고, 디코딩하며 보안을 철저히 하고 싶을때..

또는 통신 알고리즘상에서 스푸핑을 방지하고 싶을때..


또는 DB 설정파일을 보안화하고 싶을때..


그냥 자바를 보면 답이 나온다.



 import java.util.Iterator;
import java.security.Security;
import java.security.Provider;

public class PrintProviders {
    public static void main(String[] args) {
        Provider[] providers = Security.getProviders();
        for (int i = 0; i < providers.length; i++) {
            String name = providers[i].getName();
            String info = providers[i].getInfo();
            double version = providers[i].getVersion();
            System.out.println("-------------------------------------");
            System.out.println("name: " + name);
            System.out.println("info: " + info);
            System.out.println("version: " + version);

            for (Iterator iter = providers[i].keySet().iterator(); iter
                    .hasNext();) {
                String key = (String) iter.next();
                System.out.println("\t" + key + "\t"
                        + providers[i].getProperty(key));
            }

            System.out.println("-------------------------------------");

        }
    }
}



자바에서는 Security 알고리즘이 무상하게 제공되고 있다.


위의 소스의 결과를 볼까?


 -------------------------------------
name: SUN
info: SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
version: 1.6
 Alg.Alias.Signature.SHA1/DSA SHA1withDSA
 Alg.Alias.Signature.1.2.840.10040.4.3 SHA1withDSA
 Alg.Alias.Signature.DSS SHA1withDSA
 SecureRandom.SHA1PRNG ImplementedIn Software
 KeyStore.JKS sun.security.provider.JavaKeyStore$JKS
 Alg.Alias.MessageDigest.SHA-1 SHA
 MessageDigest.SHA sun.security.provider.SHA
 KeyStore.CaseExactJKS sun.security.provider.JavaKeyStore$CaseExactJKS
 CertStore.com.sun.security.IndexedCollection ImplementedIn Software
 Alg.Alias.Signature.DSA SHA1withDSA
 KeyFactory.DSA ImplementedIn Software
 KeyStore.JKS ImplementedIn Software
 AlgorithmParameters.DSA ImplementedIn Software
 Signature.NONEwithDSA sun.security.provider.DSA$RawDSA
 Alg.Alias.CertificateFactory.X509 X.509
 CertStore.com.sun.security.IndexedCollection sun.security.provider.certpath.IndexedCollectionCertStore
 Provider.id className sun.security.provider.Sun
 Alg.Alias.Signature.SHA-1/DSA SHA1withDSA
 CertificateFactory.X.509 ImplementedIn Software
 Signature.SHA1withDSA KeySize 1024
 KeyFactory.DSA sun.security.provider.DSAKeyFactory
 CertPathValidator.PKIX ImplementedIn Software
 Configuration.JavaLoginConfig sun.security.provider.ConfigSpiFile
 Alg.Alias.Signature.OID.1.2.840.10040.4.3 SHA1withDSA
 Alg.Alias.KeyFactory.1.2.840.10040.4.1 DSA
 MessageDigest.MD5 ImplementedIn Software
 Alg.Alias.Signature.RawDSA NONEwithDSA
 Provider.id name SUN
 Alg.Alias.AlgorithmParameters.1.2.840.10040.4.1 DSA
 CertPathBuilder.PKIX ValidationAlgorithm RFC3280
 Policy.JavaPolicy sun.security.provider.PolicySpiFile
 Alg.Alias.AlgorithmParameters.1.3.14.3.2.12 DSA
 Alg.Alias.Signature.SHA/DSA SHA1withDSA
 Alg.Alias.KeyPairGenerator.1.3.14.3.2.12 DSA
 MessageDigest.SHA-384 sun.security.provider.SHA5$SHA384
 Signature.SHA1withDSA ImplementedIn Software
 AlgorithmParameterGenerator.DSA sun.security.provider.DSAParameterGenerator
 Signature.NONEwithDSA SupportedKeyClasses java.security.interfaces.DSAPublicKey|java.security.interfaces.DSAPrivateKey
 MessageDigest.SHA-512 sun.security.provider.SHA5$SHA512
 CertPathBuilder.PKIX sun.security.provider.certpath.SunCertPathBuilder
 Alg.Alias.Signature.1.3.14.3.2.27 SHA1withDSA
 CertPathBuilder.PKIX ImplementedIn Software
 Provider.id version 1.6
 AlgorithmParameters.DSA sun.security.provider.DSAParameters
 Signature.SHA1withDSA SupportedKeyClasses java.security.interfaces.DSAPublicKey|java.security.interfaces.DSAPrivateKey
 CertStore.Collection sun.security.provider.certpath.CollectionCertStore
 AlgorithmParameterGenerator.DSA ImplementedIn Software
 KeyPairGenerator.DSA KeySize 1024
 CertStore.LDAP sun.security.provider.certpath.LDAPCertStore
 CertificateFactory.X.509 sun.security.provider.X509Factory
 CertStore.LDAP LDAPSchema RFC2587
 CertStore.LDAP ImplementedIn Software
 KeyPairGenerator.DSA ImplementedIn Software
 CertPathValidator.PKIX ValidationAlgorithm RFC3280
 CertStore.Collection ImplementedIn Software
 Alg.Alias.Signature.1.3.14.3.2.13 SHA1withDSA
 CertPathValidator.PKIX sun.security.provider.certpath.PKIXCertPathValidator
 Alg.Alias.MessageDigest.SHA1 SHA
 AlgorithmParameterGenerator.DSA KeySize 1024
 SecureRandom.SHA1PRNG sun.security.provider.SecureRandom
 Signature.SHA1withDSA sun.security.provider.DSA$SHA1withDSA
 Alg.Alias.KeyFactory.1.3.14.3.2.12 DSA
 KeyPairGenerator.DSA sun.security.provider.DSAKeyPairGenerator
 MessageDigest.SHA ImplementedIn Software
 Provider.id info SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
 Alg.Alias.KeyPairGenerator.1.2.840.10040.4.1 DSA
 Alg.Alias.Signature.SHAwithDSA SHA1withDSA
 MessageDigest.MD5 sun.security.provider.MD5
 Alg.Alias.Signature.DSAWithSHA1 SHA1withDSA
 MessageDigest.SHA-256 sun.security.provider.SHA2
 Alg.Alias.KeyPairGenerator.OID.1.2.840.10040.4.1 DSA
 MessageDigest.MD2 sun.security.provider.MD2
-------------------------------------
-------------------------------------
name: SunRsaSign
info: Sun RSA signature provider
version: 1.5
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.4 MD5withRSA
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.2 MD2withRSA
 Alg.Alias.KeyFactory.1.2.840.113549.1.1 RSA
 Signature.SHA512withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey
 Provider.id version 1.5
 Signature.MD5withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey
 Alg.Alias.Signature.1.2.840.113549.1.1.13 SHA512withRSA
 KeyPairGenerator.RSA sun.security.rsa.RSAKeyPairGenerator
 Alg.Alias.Signature.1.2.840.113549.1.1.12 SHA384withRSA
 Alg.Alias.Signature.1.2.840.113549.1.1.11 SHA256withRSA
 KeyFactory.RSA sun.security.rsa.RSAKeyFactory
 Alg.Alias.Signature.1.3.14.3.2.29 SHA1withRSA
 Alg.Alias.KeyPairGenerator.OID.1.2.840.113549.1.1 RSA
 Signature.MD2withRSA sun.security.rsa.RSASignature$MD2withRSA
 Signature.SHA384withRSA sun.security.rsa.RSASignature$SHA384withRSA
 Signature.MD5withRSA sun.security.rsa.RSASignature$MD5withRSA
 Provider.id info Sun RSA signature provider
 Signature.SHA1withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey
 Signature.SHA1withRSA sun.security.rsa.RSASignature$SHA1withRSA
 Alg.Alias.Signature.1.2.840.113549.1.1.5 SHA1withRSA
 Signature.SHA256withRSA sun.security.rsa.RSASignature$SHA256withRSA
 Alg.Alias.Signature.1.2.840.113549.1.1.4 MD5withRSA
 Provider.id className sun.security.rsa.SunRsaSign
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.13 SHA512withRSA
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.12 SHA384withRSA
 Alg.Alias.Signature.1.2.840.113549.1.1.2 MD2withRSA
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.11 SHA256withRSA
 Signature.MD2withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey
 Provider.id name SunRsaSign
 Alg.Alias.KeyFactory.OID.1.2.840.113549.1.1 RSA
 Signature.SHA384withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey
 Signature.SHA512withRSA sun.security.rsa.RSASignature$SHA512withRSA
 Signature.SHA256withRSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.5 SHA1withRSA
 Alg.Alias.KeyPairGenerator.1.2.840.113549.1.1 RSA
-------------------------------------
-------------------------------------
name: SunJSSE
info: Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
version: 1.6
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.4 MD5withRSA
 Alg.Alias.KeyFactory.1.2.840.113549.1.1 RSA
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.2 MD2withRSA
 SSLContext.Default com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl
 Provider.id version 1.6
 TrustManagerFactory.SunX509 com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl$SimpleFactory
 KeyManagerFactory.NewSunX509 com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$X509
 KeyPairGenerator.RSA sun.security.rsa.RSAKeyPairGenerator
 KeyStore.PKCS12 com.sun.net.ssl.internal.pkcs12.PKCS12KeyStore
 SSLContext.SSLv3 com.sun.net.ssl.internal.ssl.SSLContextImpl
 KeyFactory.RSA sun.security.rsa.RSAKeyFactory
 Alg.Alias.Signature.1.3.14.3.2.29 SHA1withRSA
 Alg.Alias.TrustManagerFactory.X509 PKIX
 Alg.Alias.KeyPairGenerator.OID.1.2.840.113549.1.1 RSA
 Signature.MD5andSHA1withRSA com.sun.net.ssl.internal.ssl.RSASignature
 Signature.MD2withRSA sun.security.rsa.RSASignature$MD2withRSA
 Signature.MD5withRSA sun.security.rsa.RSASignature$MD5withRSA
 Provider.id info Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
 Signature.SHA1withRSA sun.security.rsa.RSASignature$SHA1withRSA
 Alg.Alias.Signature.1.2.840.113549.1.1.5 SHA1withRSA
 Alg.Alias.Signature.1.2.840.113549.1.1.4 MD5withRSA
 Provider.id className com.sun.net.ssl.internal.ssl.Provider
 Alg.Alias.Signature.OID.1.3.14.3.2.29 SHA1withRSA
 Alg.Alias.Signature.1.2.840.113549.1.1.2 MD2withRSA
 Provider.id name SunJSSE
 SSLContext.SSL com.sun.net.ssl.internal.ssl.SSLContextImpl
 SSLContext.TLS com.sun.net.ssl.internal.ssl.SSLContextImpl
 TrustManagerFactory.PKIX com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl$PKIXFactory
 SSLContext.TLSv1 com.sun.net.ssl.internal.ssl.SSLContextImpl
 Alg.Alias.KeyFactory.OID.1.2.840.113549.1.1 RSA
 KeyManagerFactory.SunX509 com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509
 Alg.Alias.TrustManagerFactory.SunPKIX PKIX
 Alg.Alias.TrustManagerFactory.X.509 PKIX
 Alg.Alias.Signature.OID.1.2.840.113549.1.1.5 SHA1withRSA
 Alg.Alias.KeyPairGenerator.1.2.840.113549.1.1 RSA
-------------------------------------
-------------------------------------
name: SunJCE
info: SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
version: 1.6
 Cipher.Blowfish SupportedKeyFormats RAW
 AlgorithmParameters.DESede com.sun.crypto.provider.DESedeParameters
 AlgorithmParameters.DES com.sun.crypto.provider.DESParameters
 Cipher.DES SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING
 AlgorithmParameters.Blowfish com.sun.crypto.provider.BlowfishParameters
 Cipher.DESedeWrap SupportedKeyFormats RAW
 Alg.Alias.KeyAgreement.1.2.840.113549.1.3.1 DiffieHellman
 AlgorithmParameterGenerator.DiffieHellman com.sun.crypto.provider.DHParameterGenerator
 Cipher.RSA SupportedPaddings NOPADDING|PKCS1PADDING|OAEPWITHMD5ANDMGF1PADDING|OAEPWITHSHA1ANDMGF1PADDING|OAEPWITHSHA-1ANDMGF1PADDING|OAEPWITHSHA-256ANDMGF1PADDING|OAEPWITHSHA-384ANDMGF1PADDING|OAEPWITHSHA-512ANDMGF1PADDING
 Alg.Alias.Cipher.TripleDES DESede
 Cipher.ARCFOUR SupportedModes ECB
 Mac.SslMacSHA1 SupportedKeyFormats RAW
 KeyGenerator.DES com.sun.crypto.provider.DESKeyGenerator
 Provider.id version 1.6
 KeyGenerator.DESede com.sun.crypto.provider.DESedeKeyGenerator
 Alg.Alias.SecretKeyFactory.PBE PBEWithMD5AndDES
 Alg.Alias.KeyFactory.1.2.840.113549.1.3.1 DiffieHellman
 Mac.HmacSHA1 com.sun.crypto.provider.HmacSHA1
 Cipher.PBEWithMD5AndDES com.sun.crypto.provider.PBEWithMD5AndDESCipher
 Cipher.AES SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128
 Cipher.AESWrap SupportedModes ECB
 SecretKeyFactory.DESede com.sun.crypto.provider.DESedeKeyFactory
 KeyGenerator.SunTlsKeyMaterial com.sun.crypto.provider.TlsKeyMaterialGenerator
 AlgorithmParameters.OAEP com.sun.crypto.provider.OAEPParameters
 Cipher.AES SupportedKeyFormats RAW
 AlgorithmParameters.RC2 com.sun.crypto.provider.RC2Parameters
 AlgorithmParameters.PBE com.sun.crypto.provider.PBEParameters
 Alg.Alias.KeyPairGenerator.DH DiffieHellman
 Alg.Alias.KeyAgreement.OID.1.2.840.113549.1.3.1 DiffieHellman
 Cipher.AES com.sun.crypto.provider.AESCipher
 KeyGenerator.RC2 com.sun.crypto.provider.KeyGeneratorCore$RC2KeyGenerator
 Mac.HmacSHA512 com.sun.crypto.provider.HmacCore$HmacSHA512
 Provider.id info SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
 Cipher.AES SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING
 Alg.Alias.AlgorithmParameters.OID.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40
 Cipher.Blowfish SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING
 Alg.Alias.AlgorithmParameters.OID.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede
 KeyStore.JCEKS com.sun.crypto.provider.JceKeyStore
 Cipher.Blowfish SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64
 Alg.Alias.SecretKeyFactory.1.2.840.113549.1.5.12 PBKDF2WithHmacSHA1
 Mac.HmacSHA384 SupportedKeyFormats RAW
 Cipher.DESedeWrap com.sun.crypto.provider.DESedeWrapCipher
 Cipher.ARCFOUR SupportedPaddings NOPADDING
 Alg.Alias.KeyPairGenerator.1.2.840.113549.1.3.1 DiffieHellman
 Cipher.PBEWithMD5AndTripleDES com.sun.crypto.provider.PBEWithMD5AndTripleDESCipher
 Alg.Alias.Cipher.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40
 Alg.Alias.Cipher.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede
 Mac.HmacSHA256 SupportedKeyFormats RAW
 Alg.Alias.AlgorithmParameterGenerator.1.2.840.113549.1.3.1 DiffieHellman
 Cipher.PBEWithSHA1AndDESede com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndDESede
 SecretKeyFactory.PBEWithMD5AndDES com.sun.crypto.provider.PBEKeyFactory$PBEWithMD5AndDES
 KeyPairGenerator.DiffieHellman com.sun.crypto.provider.DHKeyPairGenerator
 Cipher.RC2 SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64
 Alg.Alias.AlgorithmParameters.Rijndael AES
 KeyAgreement.DiffieHellman SupportedKeyClasses javax.crypto.interfaces.DHPublicKey|javax.crypto.interfaces.DHPrivateKey
 Mac.HmacMD5 SupportedKeyFormats RAW
 KeyGenerator.SunTlsRsaPremasterSecret com.sun.crypto.provider.TlsRsaPremasterSecretGenerator
 Cipher.AESWrap SupportedKeyFormats RAW
 SecretKeyFactory.DES com.sun.crypto.provider.DESKeyFactory
 Cipher.AESWrap SupportedPaddings NOPADDING
 Provider.id name SunJCE
 KeyGenerator.HmacSHA512 com.sun.crypto.provider.KeyGeneratorCore$HmacSHA512KG
 Mac.HmacSHA256 com.sun.crypto.provider.HmacCore$HmacSHA256
 Cipher.ARCFOUR SupportedKeyFormats RAW
 Cipher.DES SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64
 Cipher.RSA SupportedKeyClasses java.security.interfaces.RSAPublicKey|java.security.interfaces.RSAPrivateKey
 SecretKeyFactory.PBEWithMD5AndTripleDES com.sun.crypto.provider.PBEKeyFactory$PBEWithMD5AndTripleDES
 Cipher.PBEWithSHA1AndRC2_40 com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndRC2_40
 AlgorithmParameters.DiffieHellman com.sun.crypto.provider.DHParameters
 Mac.HmacMD5 com.sun.crypto.provider.HmacMD5
 Cipher.RSA com.sun.crypto.provider.RSACipher
 Mac.SslMacMD5 com.sun.crypto.provider.SslMacCore$SslMacMD5
 Alg.Alias.AlgorithmParameters.OID.1.2.840.113549.1.5.3 PBEWithMD5AndDES
 Cipher.DESede SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING
 Alg.Alias.AlgorithmParameterGenerator.OID.1.2.840.113549.1.3.1 DiffieHellman
 Cipher.DESede com.sun.crypto.provider.DESedeCipher
 Alg.Alias.AlgorithmParameters.OID.1.2.840.113549.1.3.1 DiffieHellman
 Alg.Alias.AlgorithmParameters.1.2.840.113549.1.5.3 PBEWithMD5AndDES
 Mac.HmacSHA512 SupportedKeyFormats RAW
 Mac.HmacPBESHA1 SupportedKeyFormats RAW
 Alg.Alias.AlgorithmParameterGenerator.DH DiffieHellman
 Cipher.DESedeWrap SupportedPaddings NOPADDING
 Alg.Alias.SecretKeyFactory.OID.1.2.840.113549.1.5.12 PBKDF2WithHmacSHA1
 Alg.Alias.AlgorithmParameters.1.2.840.113549.1.3.1 DiffieHellman
 Mac.HmacPBESHA1 com.sun.crypto.provider.HmacPKCS12PBESHA1
 Cipher.DES SupportedKeyFormats RAW
 AlgorithmParameters.PBEWithMD5AndTripleDES com.sun.crypto.provider.PBEParameters
 Cipher.DESedeWrap SupportedModes CBC
 Alg.Alias.KeyFactory.OID.1.2.840.113549.1.3.1 DiffieHellman
 Alg.Alias.Cipher.OID.1.2.840.113549.1.5.3 PBEWithMD5AndDES
 AlgorithmParameters.AES com.sun.crypto.provider.AESParameters
 Alg.Alias.AlgorithmParameters.TripleDES DESede
 Alg.Alias.SecretKeyFactory.TripleDES DESede
 KeyGenerator.HmacSHA256 com.sun.crypto.provider.KeyGeneratorCore$HmacSHA256KG
 Alg.Alias.KeyGenerator.TripleDES DESede
 Alg.Alias.AlgorithmParameters.DH DiffieHellman
 KeyGenerator.AES com.sun.crypto.provider.AESKeyGenerator
 Cipher.RC2 SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING
 Alg.Alias.Cipher.RC4 ARCFOUR
 Alg.Alias.KeyPairGenerator.OID.1.2.840.113549.1.3.1 DiffieHellman
 Mac.HmacSHA384 com.sun.crypto.provider.HmacCore$HmacSHA384
 SecretKeyFactory.PBKDF2WithHmacSHA1 com.sun.crypto.provider.PBKDF2HmacSHA1Factory
 Provider.id className com.sun.crypto.provider.SunJCE
 Cipher.DES com.sun.crypto.provider.DESCipher
 Cipher.Blowfish com.sun.crypto.provider.BlowfishCipher
 KeyGenerator.SunTlsMasterSecret com.sun.crypto.provider.TlsMasterSecretGenerator
 KeyGenerator.HmacSHA1 com.sun.crypto.provider.HmacSHA1KeyGenerator
 Alg.Alias.SecretKeyFactory.1.2.840.113549.1.5.3 PBEWithMD5AndDES
 KeyGenerator.SunTlsPrf com.sun.crypto.provider.TlsPrfGenerator
 SecretKeyFactory.PBEWithSHA1AndDESede com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndDESede
 KeyGenerator.ARCFOUR com.sun.crypto.provider.KeyGeneratorCore$ARCFOURKeyGenerator
 Alg.Alias.KeyAgreement.DH DiffieHellman
 Alg.Alias.KeyGenerator.Rijndael AES
 AlgorithmParameters.PBEWithSHA1AndDESede com.sun.crypto.provider.PBEParameters
 Alg.Alias.KeyGenerator.RC4 ARCFOUR
 Alg.Alias.Cipher.OID.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40
 Alg.Alias.Cipher.OID.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede
 Mac.SslMacMD5 SupportedKeyFormats RAW
 Mac.HmacSHA1 SupportedKeyFormats RAW
 Cipher.DESede SupportedKeyFormats RAW
 Cipher.RC2 com.sun.crypto.provider.RC2Cipher
 SecretKeyFactory.PBEWithSHA1AndRC2_40 com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndRC2_40
 KeyGenerator.HmacMD5 com.sun.crypto.provider.HmacMD5KeyGenerator
 AlgorithmParameters.PBEWithSHA1AndRC2_40 com.sun.crypto.provider.PBEParameters
 KeyGenerator.HmacSHA384 com.sun.crypto.provider.KeyGeneratorCore$HmacSHA384KG
 Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40
 KeyFactory.DiffieHellman com.sun.crypto.provider.DHKeyFactory
 Alg.Alias.AlgorithmParameters.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede
 AlgorithmParameters.PBEWithMD5AndDES com.sun.crypto.provider.PBEParameters
 Alg.Alias.SecretKeyFactory.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40
 Alg.Alias.SecretKeyFactory.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede
 Cipher.AESWrap com.sun.crypto.provider.AESWrapCipher
 Alg.Alias.SecretKeyFactory.OID.1.2.840.113549.1.5.3 PBEWithMD5AndDES
 Alg.Alias.Cipher.Rijndael AES
 Cipher.RSA SupportedModes ECB
 Cipher.DESede SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64
 Alg.Alias.SecretKeyFactory.OID.1.2.840.113549.1.12.1.6 PBEWithSHA1AndRC2_40
 Alg.Alias.SecretKeyFactory.OID.1.2.840.113549.1.12.1.3 PBEWithSHA1AndDESede
 Cipher.ARCFOUR com.sun.crypto.provider.ARCFOURCipher
 Alg.Alias.Cipher.1.2.840.113549.1.5.3 PBEWithMD5AndDES
 Mac.SslMacSHA1 com.sun.crypto.provider.SslMacCore$SslMacSHA1
 KeyAgreement.DiffieHellman com.sun.crypto.provider.DHKeyAgreement
 Cipher.RC2 SupportedKeyFormats RAW
 Alg.Alias.KeyFactory.DH DiffieHellman
 KeyGenerator.Blowfish com.sun.crypto.provider.BlowfishKeyGenerator
-------------------------------------
-------------------------------------
name: SunJGSS
info: Sun (Kerberos v5, SPNEGO)
version: 1.0
 GssApiMechanism.1.3.6.1.5.5.2 sun.security.jgss.spnego.SpNegoMechFactory
 Provider.id info Sun (Kerberos v5, SPNEGO)
 Provider.id className sun.security.jgss.SunProvider
 Provider.id version 1.0
 GssApiMechanism.1.2.840.113554.1.2.2 sun.security.jgss.krb5.Krb5MechFactory
 Provider.id name SunJGSS
-------------------------------------
-------------------------------------
name: SunSASL
info: Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)
version: 1.5
 Provider.id className com.sun.security.sasl.Provider
 SaslClientFactory.CRAM-MD5 com.sun.security.sasl.ClientFactoryImpl
 Provider.id version 1.5
 SaslClientFactory.EXTERNAL com.sun.security.sasl.ClientFactoryImpl
 SaslClientFactory.DIGEST-MD5 com.sun.security.sasl.digest.FactoryImpl
 SaslClientFactory.PLAIN com.sun.security.sasl.ClientFactoryImpl
 Provider.id name SunSASL
 SaslClientFactory.GSSAPI com.sun.security.sasl.gsskerb.FactoryImpl
 SaslServerFactory.DIGEST-MD5 com.sun.security.sasl.digest.FactoryImpl
 SaslServerFactory.CRAM-MD5 com.sun.security.sasl.ServerFactoryImpl
 SaslServerFactory.GSSAPI com.sun.security.sasl.gsskerb.FactoryImpl
 Provider.id info Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)
-------------------------------------
-------------------------------------
name: XMLDSig
info: XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
version: 1.0
 Alg.Alias.TransformService.XPATH http://www.w3.org/TR/1999/REC-xpath-19991116
 TransformService.http://www.w3.org/TR/1999/REC-xslt-19991116 MechanismType DOM
 Provider.id version 1.0
 Alg.Alias.TransformService.INCLUSIVE http://www.w3.org/TR/2001/REC-xml-c14n-20010315
 TransformService.http://www.w3.org/2000/09/xmldsig#base64 MechanismType DOM
 Alg.Alias.TransformService.EXCLUSIVE http://www.w3.org/2001/10/xml-exc-c14n#
 KeyInfoFactory.DOM org.jcp.xml.dsig.internal.dom.DOMKeyInfoFactory
 TransformService.http://www.w3.org/2001/10/xml-exc-c14n#WithComments org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod
 Alg.Alias.TransformService.INCLUSIVE_WITH_COMMENTS http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments
 TransformService.http://www.w3.org/2002/06/xmldsig-filter2 MechanismType DOM
 TransformService.http://www.w3.org/TR/1999/REC-xpath-19991116 MechanismType DOM
 TransformService.http://www.w3.org/2001/10/xml-exc-c14n# org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod
 XMLSignatureFactory.DOM org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory
 Alg.Alias.TransformService.XPATH2 http://www.w3.org/2002/06/xmldsig-filter2
 TransformService.http://www.w3.org/2001/10/xml-exc-c14n# MechanismType DOM
 TransformService.http://www.w3.org/2001/10/xml-exc-c14n#WithComments MechanismType DOM
 TransformService.http://www.w3.org/TR/1999/REC-xslt-19991116 org.jcp.xml.dsig.internal.dom.DOMXSLTTransform
 TransformService.http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod
 Alg.Alias.TransformService.BASE64 http://www.w3.org/2000/09/xmldsig#base64
 Alg.Alias.TransformService.ENVELOPED http://www.w3.org/2000/09/xmldsig#enveloped-signature
 Provider.id info XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
 TransformService.http://www.w3.org/TR/2001/REC-xml-c14n-20010315 org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod
 Provider.id className org.jcp.xml.dsig.internal.dom.XMLDSigRI
 Alg.Alias.TransformService.EXCLUSIVE_WITH_COMMENTS http://www.w3.org/2001/10/xml-exc-c14n#WithComments
 TransformService.http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments MechanismType DOM
 TransformService.http://www.w3.org/2002/06/xmldsig-filter2 org.jcp.xml.dsig.internal.dom.DOMXPathFilter2Transform
 TransformService.http://www.w3.org/2000/09/xmldsig#enveloped-signature org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform
 Provider.id name XMLDSig
 TransformService.http://www.w3.org/2000/09/xmldsig#base64 org.jcp.xml.dsig.internal.dom.DOMBase64Transform
 TransformService.http://www.w3.org/TR/1999/REC-xpath-19991116 org.jcp.xml.dsig.internal.dom.DOMXPathTransform
 TransformService.http://www.w3.org/TR/2001/REC-xml-c14n-20010315 MechanismType DOM
 Alg.Alias.TransformService.XSLT http://www.w3.org/TR/1999/REC-xslt-19991116
 TransformService.http://www.w3.org/2000/09/xmldsig#enveloped-signature MechanismType DOM
-------------------------------------
-------------------------------------
name: SunPCSC
info: Sun PC/SC provider
version: 1.6
 Provider.id info Sun PC/SC provider
 Provider.id className sun.security.smartcardio.SunPCSC
 Provider.id version 1.6
 Provider.id name SunPCSC
 TerminalFactory.PC/SC sun.security.smartcardio.SunPCSC$Factory
-------------------------------------
-------------------------------------
name: SunMSCAPI
info: Sun's Microsoft Crypto API provider
version: 1.6
 SecureRandom.Windows-PRNG sun.security.mscapi.PRNG
 Provider.id version 1.6
 Cipher.RSA/ECB/PKCS1Padding sun.security.mscapi.RSACipher
 Signature.MD5withRSA SupportedKeyClasses sun.security.mscapi.Key
 KeyPairGenerator.RSA sun.security.mscapi.RSAKeyPairGenerator
 KeyStore.Windows-ROOT sun.security.mscapi.KeyStore$ROOT
 Signature.NONEwithRSA SupportedKeyClasses sun.security.mscapi.Key
 Cipher.RSA SupportedKeyClasses sun.security.mscapi.Key
 Signature.MD2withRSA sun.security.mscapi.RSASignature$MD2
 Signature.MD5withRSA sun.security.mscapi.RSASignature$MD5
 Cipher.RSA SupportedModes ECB
 Provider.id info Sun's Microsoft Crypto API provider
 Signature.SHA1withRSA SupportedKeyClasses sun.security.mscapi.Key
 Signature.SHA1withRSA sun.security.mscapi.RSASignature$SHA1
 Provider.id className sun.security.mscapi.SunMSCAPI
 KeyPairGenerator.RSA KeySize 1024
 Signature.MD2withRSA SupportedKeyClasses sun.security.mscapi.Key
 Provider.id name SunMSCAPI
 Cipher.RSA SupportedPaddings PKCS1PADDING
 Cipher.RSA sun.security.mscapi.RSACipher
 KeyStore.Windows-MY sun.security.mscapi.KeyStore$MY
-------------------------------------




이렇게 많ㅇ이 사용될 수 있는 알고리즘 구현방식이 있다.



아래 URL의 샘플 코드를 봐보자.

http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html



    import java.security.*;
   import javax.crypto.*;
   import javax.crypto.spec.*;
   import java.io.*;

   /**
   * This program generates a AES key, retrieves its raw bytes, and
   * then reinstantiates a AES key from the key bytes.
   * The reinstantiated key is used to initialize a AES cipher for
   * encryption and decryption.
   */

   public class AES {

     /**
     * Turns array of bytes into string
     *
     * @param buf Array of bytes to convert to hex string
     * @return Generated hex string
     */
     public static String asHex (byte buf[]) {
      StringBuffer strbuf = new StringBuffer(buf.length * 2);
      int i;

      for (i = 0; i < buf.length; i++) {
       if (((int) buf[i] & 0xff) < 0x10)
    strbuf.append("0");

       strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
      }

      return strbuf.toString();
     }

     public static void main(String[] args) throws Exception {

       String message="This is just an example";

       // Get the KeyGenerator

       KeyGenerator kgen = KeyGenerator.getInstance("AES");
       kgen.init(128); // 192 and 256 bits may not be available


       // Generate the secret key specs.
       SecretKey skey = kgen.generateKey();
       byte[] raw = skey.getEncoded();

       SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");


       // Instantiate the cipher

       Cipher cipher = Cipher.getInstance("AES");

       cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

       byte[] encrypted =
         cipher.doFinal((args.length == 0 ?
          "This is just an example" : args[0]).getBytes());
       System.out.println("encrypted string: " + asHex(encrypted));

       cipher.init(Cipher.DECRYPT_MODE, skeySpec);
       byte[] original =
         cipher.doFinal(encrypted);
       String originalString = new String(original);
       System.out.println("Original string: " +
         originalString + " " + asHex(original));
     }
   }

Posted by 1010
01.JAVA/Java2008. 8. 20. 11:46
반응형
서버에 소스를 이전시켰다.

Window 2000 서버 ==> IBM AIX 서버(유닉스)

코드 폴더 통째로 바꿨다!! 그런데..!!!

잘 돌아가던 소스가 실행이 안되는 거다!!!

다음과 같은 에러가...!!!@@

org.apache.jasper.JasperException: Unable to compile class for JSP
Generated servlet error:
/home/lsms/WEB-INF/work/org/apache/jsp/main_jsp.java:1033: handlePageException(java.lang.Exception) in javax.servlet.jsp.PageContext cannot be applied to (java.lang.Throwable)
(source unavailable)
1 error

at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:332)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:412)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:300)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:374)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:743)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:675)
at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:568)


이런 에러가 뜨면서..뜨아..

아무리 찾아봐도 안되는거다. 그 좋다는 지식검색마저도...

결국 해결봤다.

어떻게??~~ ==> 소스 폴더 안에 WEB-INF 라는 놈도 같이 다 카피가 됐었는데. 그놈은 서버마다 다른거 같다.

따라서 WEB-INF 라는 폴더를 통째로 삭제시켜주자!!!!

그럼 이런 에러 없이 전혀 문제없이 잘 돌아간다. 6시간 뺑이친 결과물이다. ㅡㅡ;


출처 : http://sweetjini.egloos.com/2477988
Posted by 1010
01.JAVA/Java2008. 8. 20. 11:32
반응형
-->(세부출처 : http://www.dbtool.co.kr/)

Java Error Message 정리 자료입니다.


1. ERROR Exception in thread "main" java.lang.NoClassDefFoundError: 파일명
발생되는 경우 클래스 파일을 찾을 수 없는 경우
조 언 실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인한다.
또한, CLASSPATH 설정이 제대로 되어 있는지 확인하며 (도스모드에서 set명령어)
만약, 되어있지 않다면 설정한다. (CLASSPATH = jdk1.3/jre/lib/rt.jar; 2-1강좌 참조)
 
2. ERROR cannot resolve symbol
symbol : class in(에러가 난 부분)
location : class StackTest(찾으려는 위치)  
발생되는 경우 이해할 수 없는 클래스나 메소드, 변수명이 올경우
조 언 보통 이 에러는 철자가 틀렸을 경우에 많이 발생한다. 클래스, 메소드, 변수의 철자를 세심히 확인해 본다.
특히, 철자를 확인할때 대소문자 구분을 확실히 체크한다.(자바는 대소문자를 구별한다.) 그리고 클래스에서 발생할 경우 import를 해주었는지 확인해 봅니다.
 
3. ERROR non-static variable 변수이름(or method 메소드이름) cannot br referenced from a static context
발생되는 경우 static 메소드 안에서 static 으로 선언되지 않은 메소드나 변수를 참조(사용)했을 경우.
특히, 메소드의 경우는 인스턴스를 사용하지 않고 static메소드 내에서 바로 선언한 경우.
조 언 static 선언자의 사용여부를 살펴보고 static 메소드 안에 static으로 선언되어지지 않은 메소드나 변수가 있느지 확인해본다.
만약 그런것이 있으면 메소드를 새로 만들어 그쪽에서 선언한다. 단, 인스턴스를 생성해서 불러줘야 한다는 것을 잊지 말아야한다.
 
4. ERROR valiable 변수명 might not have been initialized
발생되는 경우 지역변수인 변수명의 변수가 초기화가 되어있지 않았을 경우
조 언 지역변수(메소드 내에서 선언한 변수)를 초기화 하지 않은채 선언했을 경우 발생한다.
멤버 필드가 아닌 경우는 반드시 변수 선언시 초기화를 해주어야 한다.
(멤버 필드는 자바 프로그램 자체에서 자동으로 default값으로 초기화 해준다.)
 
5. ERROR class 클래스명 is public, should be declared in a file named 클래스명.java
발생되는 경우 클래스명이 public으로 선언되었는데 파일명과 다를 경우
조 언 public으로 선언된 클래스가 있다면 반드시 그 클래스명과 파일명이 같아야 한다.
클래스명과 파일명의 대소문자 및 철자가 같은지 비교해 본다.
또한, public으로 선언된 클래스가 하나 이상 있는지 찾아본다.(반드시 하나만 있어야한다.)
 
6. ERROR push(java.lang.object)[메소드(인자로 받을 수 있는 형)] in java.util.Stack(메소드의 클래스) cannot be applied to (int)[잘못 들어간 형]
발생되는 경우 메소드에서 인자를 받을 때 받을 수 있는 형이 아닌 자료형 또는 클래스형을 사용할 경우
조 언 사용하는 메소드의 API를 참고하여 어떤 형을 인자로 받을 수 있는지 찾아본다.
API를 보지 못할 경우는 각 자료형으로 인자를 직접 바꾸어 본다.
 
7. ERROR java.lang.NoSuchMethodError: main
Exception in thread "main"
발생되는 경우 클래스 파일 안에서 main() 메소드를 찾을 수 없는 경우
조 언 자바 애플릿이 아닌 이상 자바 애플리케이션은 반드시 main() 메소드를 사용해야 합니다.
main() 메소드를 빼먹지 않았는지 확인해 보십시요. 또한 public static void main(String[] args) 형식으로 씌어졌는지도 확인해 보십시요.
(main 클래스는 반드시 위와 같은 형식으로 만들어져야 합니다.)
 
8. ERROR unreported exception java.io.IOException(Exception명); must be caught or declared to be thrown
발생되는 경우 예외가 발생하는데 예외처리를 해주지 않았을 경우
조 언 예외를 발생하는 메소드 같은 경우는 반드시 예외처리를 해주어야 합니다.
예외를 발생하거나 예외처리를 해야하는 메소드는 API를 확인해 보시면 알 수 있습니다.
그렇지 않다면 컴파일 후 지금처럼 에러가 난 예외를 예외처리해 주시면 됩니다.
또한, 예외를 처리할 때는 메소드 차원에서 throws 예외명을 이용해서 처리할 수 있고
try{} catch{} 구문을 이용해서 직접 처리해 주셔도 됩니다.(예외 강좌를 참고하세요.)
특히, 예외도 클래스이므로 반드시 예외가 들어간 패키지를 import 해주어야 합니다.
 
9. ERROR Note : Calculator.java(파일명) uses or overrides a deprecated API.
Note : Recompile with -deprecation for details.  
발생되는 경우 JDK 버전이 높아졌거나 보안등의 기타이유로 사용이 deprecated된 메소드를 사용한 경우
조 언 이건 예외라기 보다는 경고 입니다.(실행하면 됩니다.^^)
JDK가 버전이 높아지거나 보안등의 이유에 따라 예전에 만들어졌지만 필요가 없어지거나 대체된 메소드가 생겨났습니다.
그런 메소드를 deprecated 되었다고 하는데 이것은 API상에 나왔있습니다.
또한, 컴파일할때 -deprecation 옵션주면 어떤 메소드가 deprecate됐는지 알수있읍니다.
사용이 중지 됐다고 보기 보다는 사용을 가능하면 하지 않게끔 해주는 거죠.
대치되었거나 버전 업된 메소드를 사용하시면 됩니다.

 
10. ERROR MouseEvent(클래스명) should be declared abstract; it does not define mouseDragged(java.awt.event.MouseEvent)[메소드명(메소드가 포함된 클래스)] in MouseEvent(클래스명)  
발생되는 경우 implements한 Interface의 모든 메소드를 구현하지 않아서 발생됨  
조 언 Interface는 모든 메소드가 선언만 되고 구현되지 않은 추상(abstract) 메소드입니다.
만약 Interface를 implements하려면 implements한 클래스가 Interface에서 선언한 모든 메소드를 구현해 주어야 합니다.
하나라도 빠질 경우 implements한 클래스도 추상 클래스로 보고 에러가 발생합니다.
에러에 구현해 주어야할 메소드명이 나오므로 그곳에 쓰여있는 메소드를 구현해 주면 됩니다.
만약, 그 메소드를 구현해 주었는데 에러가 나면 철자 및 대소문자를 다시 확인해 보십시요.
 
11. ERROR incompatible types
found : /null(입력한 자료형)
required : int(요구하는 자료형)
발생되는 경우 입력을 했을때 맞지 않는 자료형이나 클래스형을 입력할 경우
조 언 incompatible 은 '성미가 맞지 않는','모순된' 이라는 뜻을 가진 단어 입니다.
단어뜻 처럼 입력 경우 required 에 나타난 자료형 및 클래스형을 요구하는데
found 에서 나타난 자료형 및 클래스형을 써주어서 입력을 하지 못하게 되어서 발생하는 에러입니다.
found 에 나타난 자료형을 required 에 나타난 자료형으로 변경해 주시면 됩니다.

 
12. ERROR package java.servlet(패키지명) does not exist
발생되는 경우 import한 패키지가 존재하지 않을 경우
조 언 import한 패키지가 존재하지 않을 경우에 발생하는 에러입니다.
철자와 대소문자를 먼저 확인하고 CLASSPATH 설정을 확인해 보시기 바랍니다.
또한 그 곳에 패키지가 jar파일로 있는지도 확인해 보셔야 합니다.
(API에 나와있는 패키지는 rt.jar에 다 있습니다.
단 javax가 붙거나 다름으로 시작되는 확장 패키지는 설치해 주어야합니다.(javax.swing 제외))  
 
13. ERROR java.lang.NullPointerException
Exception in thread "main"(메소드) java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:341)... [에러가 일어난 부분]
발생되는 경우 참조하거나 사용한 클래스 또는 자료형이 초기화 되지 않은 경우
조 언 보통 이것은 awt나 배열 부분에서 자주 발생하는데 초기화를 해주지 않아서 많이 발생합니다.
자바의 변수들은 기본적으로(자동으로 초기화 되는 멤버필드등을 제외하고) 초기화를 요구합니다.
에러에 체크된 부분을 검토해 보시고 초기화를 해주십시요.  
 
14. ERROR ';'(빠진 부분) expected
발생되는 경우 문법상으로 써야할 것을 쓰지 않은 경우 발생합니다.
조 언 주로 ';'을 안써주시거나 아님 '()'(괄호)를 열기만 하고 닫지 않은 실수를 할 경우 발생합니다.
대부분 이 에러가 발생한 경우는 에러에 나온것을 소스에 추가해 주시면 됩니다.
 
15. ERROR unexpected type
required : value(요구하는 타입)
found : class(소스상 써준 타입)

발생되는 경우 써주어야 할 타입이 아닌 잘못된 타입을 써주었을 경우
조 언 unexpected type 에러를 해석하면 '기대하지 않은 타입'이란 뜻을 가지고 있습니다.
즉, 원하는 타입(required)이 아닌데 잘못된 타입(found)을 써준 경우 발생합니다.
에러 체크된 부분의 타입을 required 에서 나타난 타입으로 변경해 주시면 됩니다.

 
16. ERROR java.lang.ArrayIndexOutOfBoundsException
at Test.main(Test.java:10)[클래스.메소드(파일명:에러난 위치)]
Exception in thread "main"(예외가 던져진 메소드)

발생되는 경우 배열의 범위를 넘어선 값을 넣었을 경우
조 언 위의 에러는 특이하게 컴파일은 이상없이 되지만 실행을 하면 발생하는 에러입니다.
배열의 범위를 넘어설 경우에 발생하므로 에러난 위치의 배열의 참조 범위를 확인해보시고
선언해둔 배열의 범위에 맞게 조정해 주시면 됩니다.  
 
17. ERROR illegal start of expression
발생되는 경우 선언자(modifier)를 잘못 집어 넣은 경우
조 언 에러의 단어뜻을 확인해 보면 '표현의 시작이 부적격 합니다.'하고 해석할 수 있습니다.
보통 선언자가 맞지 않거나 쓰일데가 아닌데 선언자를 줄 경우에 많이 발생합니다.
특히 메소드안에서 static 선언자를 쓴 경우에는 직격으로 볼수 있죠.
에러가 난 부분의 선언자를 제거하거나 맞는 것인지 다시 확인해 보십시요.  
 
18. ERROR java.io.InputStream(클래스) is abstract; cannot be instantiated
발생되는 경우 abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우
조 언 abstract로 선언된 클래스를 직접 new 명령어를 이용하여 인스턴스화 할 경우에 발생하는 에러입니다.
왜냐하면, 추상 클래스는 직접 new 명령어를 이용하여 인스턴스화 할수 없기 때문입니다.(객체를 못만든다구요.)
이 경우에는 인스턴스를 다른 방법으로 생성하시면 됩니다.
예를 들어 인스턴스를 반환하는 메소드를 이용한다거나 상속을 통해서 상속받은 클래스의 인스턴스를 만들어
직접 인스턴스를 만드는 효과를 낼수도 있구요. 원하시는 방법으로 바꾸어 보시길...  
 
19. ERROR local variable name(변수명) is accessed from within inner class; needs to be declared final
발생되는 경우 Local Class의 변수를 final로 선언하지 않은 경우
조 언 Local Class의 변수는 참조변수의 참조값 변동을 방지하기 위하여 final 선언자를 붙여주어야 합니다.
변수에 final 선언자를 붙이면 변수는 값을 변동할 수 없는 상수 처럼 쓰이며
만약 이 값을 참조할 경우 자바는 이 값을 넘기는게 아니라 이 값의 복사본을 참조 값으로 넘기게 됩니다.
그러므로 Local Class에서 참조값 변동없이 변수를 참조할 수 있게 되는 것입니다.
Local Class를 정의해준 곳을 살펴보고 final 선언자를 확실하게 확인하시기 바랍니다.  
 
20. ERROR inner classes cannot have static declarations
발생되는 경우 내부 클래스 안에서 static 선언자를 쓴 경우
조 언 내부 클래스 안에서는 static 선언자를 쓸수 없습니다.
내부 클래스 안에서 사용된 static 선언자를 제거해 주십시요.  
 
21. ERROR referenceto List is ambiguous,both class java.util.List(클래스) in java.util(패키지)
and class java.awt.List(클래스) in java.awt(패키지) match  
발생되는 경우 클래스 사용시 다른 패키지내에 동일이름의 클래스들이 있어서 참조가 모호할 경우
조 언 예시를 보면 아시겠지만 import 한 패키지중에 같은 이름을 사용하는 클래스를 클래스 이름만으로
생성함으로서 참조가 모호해질 경우 발생하는 에러입니다.
이와 같은 경우는 import를 하나 제거 하거나 아님 java.util.List 이런식으로
직접 그 클래스의 패키지를 같이 써줌으로서 모호성을 제거할수 있습니다.

 
22. ERROR m()(메소드명) in B(클래스명) cannot override m()(메소드명) in A(클래스명);
attempting to use incompatiable return type  
발생되는 경우 클래스를 상속받고서 메소드를 오버라이드 하고자할때 잘못한 경우
조 언 클래스를 상속받고서 메소드를 오버라이드 할 경우에는 지켜야 하는 규칙이 있습니다.
1. 메소드의 이름이 같아야 합니다.
2. 메소드의 파라미터 개수, 데이터형이 같아야 합니다.
3. 메소드의 리턴형이 같아야 합니다.
4. 상위 메소드와 동일하거나 더 구체적인 Exception을 발생시켜야 합니다.
5. 상위 메소드와 동일하거나 접근범위가 더 넣은 접근 제한자를 사용해야 합니다.

님의 메소드 오버라이드시 위 규칙을 잘 지켰는가를 다시 한번 확인해 보세요.

 
23. ERROR getPathBetweenRows(int,int)(메소드) has protected access in javax.swing.jTree(클래스)
발생되는 경우 protected로 선언된 메소드를 상속 없이 직접 불러쓸 경우
조 언 protected로 선언되어 있는 메소드는 상속하거나 같은 package에 있을 때만 쓸 수 있습니다.
상속해서 다시 public 메소드로 값을 받던지 아니면
public 메소드 중에서 비슷한 기능을 하는 메소드가 있는지 찾아서 바꾸어주어야 합니다.  
 
24. ERROR invalid method declaration; return type required
발생되는 경우 리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우
조 언 리턴 타입을 쓰지 않아 메소드의 선언이 잘못된 경우에 발생하는 에러이므로
에러가 발생한 메소드를 확인해보고 리턴 타입을 맞게 적어주어야 합니다.  
 
25. ERROR Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
발생되는 경우 static으로 선언된 변수중 초기화가 안되어 있는 것이 있는 경우
조 언 static으로 선언된 변수중에 초기화가 안된게 있는 경우에 발생하는 에러이므로
에러가 발생한 변수를 확인해보고 알맞은 초기화를 시켜주거나 변수의 위치를
자동 초기화가 가능한 메소드 밖의 클래스 변수로서 사용하게 합니다.  
 
26. ERROR Error opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment
발생되는 경우 중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우
조 언 중복설치 등으로 인해 레지스트리 키값이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft에
보시면 3개의 키가 있을 겁니다. 그중에서 첫번째 키인 Java 런타임 환경 을 마우스
오른쪽 버튼으로 클릭하여 Java Runtime Environment로 이름을 바꿔주시면 됩니다.

 
27. ERROR Error Registry Key 'Sofrware\JavaSofrware\Java Runtime Environment\CurrentVerison'
has value '1.1',but '1.3' is requried.
Error: could not find java.dll
Error: could not find java 2 Runtime Enviroment.  
발생되는 경우 중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우
조 언 중복설치 등으로 인해 레지스트리 키값의 자바 버전이 잘못되어 있는 경우에 발생하는 에러이므로
레지스트리 편집기를 열어서 HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft -> Java Runtime Environment의 Current version의 값을 1.3으로 되어있는지 확인해 주시면 됩니다.

 
28. ERROR java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver(드라이버명)  
발생되는 경우 JDBC로 데이터 베이스에 연결하는 중 드라이버를 찾지 못할 경우
조 언 JDBC를 연결하는 중에 드라이버를 찾지 못할 경우에 발생하는 에러이므로
각 데이터 베이스에 맞는 드라이버가 제대로 다운로드 되었는지 확인해 보시고
드라이버의 위치가 클래스 패스에 잡혀 있는지 확인해주시면 됩니다.  
 
29. ERROR Method printIn(java.lang.String)(메소드명) not found in class java.io.PrintStream(클래스명)  
발생되는 경우 자신이 사용한 클래스의 메소드가 맞지 않는(=없는)경우
조 언 자신이 사용한 클래스의 메소드가 맞지 않는(=없는) 경우에 발생하는 에러이므로
API를 통해서 사용하고자 하는 클래스와 메소드를 다시 한번 확인해 봅니다.
보통 이경우 메소드의 철자나 대소문자를 잘못 쓴 경우가 많으니 그점을 유심히 살표봅니다.
마지막으로 철자와 대소문자도 맞는다면 메소드의 인자의 객체형을 맞게 주었는지 확인해보면 됩니다.

Posted by 1010
반응형
아파치 로그분석툴 awstats 설치/활용 가이드 itrend
웹로그 분석이 필요하신 분은 사용해 보세요.

awstats 리눅스용 tar파일도 같이 올립니다.

리눅스포털에서 만든 가이드입니다.
첨부파일 :  
awstats-6.8.tar.gz   [1097 KB]   다운로드 횟수 35 회
20060804_TD_AWSTATS의설치와활용1편.pdf   [696 KB]   다운로드 횟수 85 회
20060901_TD_AWSTATS의설치와활용2편.pdf   [619 KB]   다운로드 횟수 86 회
Posted by 1010
90.개발관련문서2008. 8. 19. 17:30
반응형
Posted by 1010
01.JAVA/Java2008. 8. 19. 16:52
반응형

규칙1: properties 파일은 Text 파일이며, 다음과 같은 형태의 이름들을 가질 수 있습니다.

MyResource_ko_KR_IBMeucKR.properties
MyResource_ko_KR.properties
MyResource_ko.properties
MyResource_en_US.properties
MyResource_en.properties
MyResource.properties


baseclass "_" language1 "_" country1 "_" variant1
baseclass "_" language1 "_" country1
baseclass "_" language1
baseclass

즉, 자동으로 JVM의 Locale 정보를 찾아서 위 순서대로 프로퍼티 파일을 순차적으로 찾아
나갑니다.

Locale 옵션을 주지 않으면, Locale.getDefault()를 사용하게 됩니다.
System.out.println(Locale.getDefault()) 해 보시면 확인이 가능하며, 이 값은
"file.encoding" 이라는 System Property 값에 의해 영향을 받으며, 이것은 다시
환경변수 "LANG" 값에 영향을 받습니다.

이 기능을 이용하여, Locale 값이 무엇이냐에 따라 서로 다른 문자열을 프로그램내에서
제공할 수 있게 되는 것이지요...
즉, 아래와 같은 서로 다른 이름의 resource 파일을 두게 되면, 영어와 한글 문자열을
Locale 값에 따라 서로 다르게 제공할 수 있는 것이지요.

MyResource_ko.properties
MyResource_en.properties
MyResource.properties <--- 이도저도 아닐 때 사용되는 defualt



규칙2: 위의 해당 properties 파일은 classpath 에 잡혀 있는 곳에 있어야 하며,
만약, package 로 구분된 sub directory 에 두었다면, 반드시 full path 를 주어야
합니다.


ResourceBundle resource =
    ResourceBundle.getBundle("org.jsn.somewhere.MyResource")

그리고, MyResource_??_??.properties 파일들(!)은 org/jsn/somewhere/ 하부 디렉토리에
놓여 있어야 합니다.

해당 properties 파일들은 jar 파일내에 함께 묶어 두어도 됩니다.


규칙3: properties 파일들은 다음과 같은 포멧으로 구성되어 있습니다.
----------------------------------------------------------------------
# 1. key = value_string 으로 기술된다.
# 2. Comment 는 '#'으로 시작되면 되나, 문자열 중간에 있는 '#'기호는 Comment로
#    인식하지 않는다.
# 3. '=' 대신 ' '(공백)을 사용해도 된다.
#    (즉 첫번째 나오는 공백이 key와 vlaue string를 나누는 구실도 한다.
# 4. 3번의 이유로 인하여 key에는 중간에 공백이 허용되지 않는다.
# 5. 반면, value string에는 공백이 허용된다.
# 6. value string를 사용할 때 한글이 지원된다. 그러나 key는 한글지원이 안된다.
# 7. 두 줄 이상을 사용하려면 라인의 끝에 '\' 문자를 사용하면 된다.
#    '\'문자 자체가 필요할 땐 '\' 대신 '\\'을 사용하라.
# 8. 7번의 이유로 인하여 Windows 환경에서 디렉토리 구분은 '\'가 아니라 '\\' 이다.
key = value
name = 이원영
.....
----------------------------------------------------------------------




규칙4: 한글은 8859_1 캐릭터 셋으로만 읽혀 집니다. 따라서, JVM의 인코딩이 8859_1 이
아니라면, 다음처럼 변환하여야 합니다. file.encoding 이 "KSC5601" 이라면,


ResourceBundle resource = ResourceBundle.getBundle("resource.MyResource");
System.out.println(Locale.getDefault());
System.out.println(resource.getString("name"));
System.out.println(new String(resource.getString("name").getBytes("8859_1"),"KSC5601"));

내부적으로 ClassLoader.getResourceAsStream(filename); 의 형태로 읽혀 들이기
때문입니다.

보다 자세한 사항은 해당 클래스의 API 문서와 JDK 소스를 직접 읽어 보시길 바랍니다.
가장 빨리/정확히/깊이있게 공부하는 지름길입니다.


------------------------------------------------------- 
  본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
  이 문서의 저자에 대한 언급을 삭제하시면 안됩니다
================================================
  자바서비스넷 이원영
  E-mail: javaservice@hanmail.net
  PCS:011-898-7904
================================================


출처 : http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=993541416&p=13&s=t

Posted by 1010
01.JAVA/Java2008. 8. 19. 16:50
반응형

File이 어떤 포맷인지 알아보자


public String getFileType (File file) {
        InputStream inputStream = null;
        byte[] buf = new byte[132];
        try {
            inputStream = new FileInputStream(file);
            inputStream.read(buf, 0, 132);
        } catch (IOException ioexception) {
            return "UNKNOWN";
        } finally {
            if (inputStream != null) try { inputStream.close(); } catch (Exception exception) {}
        }
       
        int b0 = buf[0] & 255;
        int b1 = buf[1] & 255;
        int b2 = buf[2] & 255;
        int b3 = buf[3] & 255;
       
        if (buf[128] == 68 && buf[129] == 73 && buf[130] == 67 && buf[131] == 77
            && ((b0 == 73 && b1 == 73) || (b0 == 77 && b1 == 77)))
            return "TIFF_AND_DICOM";
       
        if (b0 == 73 && b1 == 73 && b2 == 42 && b3 == 0)
            return "TIFF";
       
        if (b0 == 77 && b1 == 77 && b2 == 0 && b3 == 42)
            return "TIFF";
       
        if (b0 == 255 && b1 == 216 && b2 == 255)
            return "JPEG";
       
        if (b0 == 71 && b1 == 73 && b2 == 70 && b3 == 56)
            return "GIF";
       
        if (buf[128] == 68 && buf[129] == 73 && buf[130] == 67 && buf[131] == 77)
            return "DICOM";
       
        if (b0 == 8 && b1 == 0 && b3 == 0)
            return "DICOM";
       
        if (b0 == 83 && b1 == 73 && b2 == 77 && b3 == 80)
            return "FITS";
       
        if (b0 == 80 && (b1 == 50 || b1 == 53) && (b2 == 10 || b2 == 13 || b2 == 32 || b2 == 9))
            return "PGM";
       
        if ( b0 == 66 && b1 == 77)
            return "BMP";
       
        if (b0 == 73 && b1 == 111)
            return "ROI";
       
        if (b0 >= 32 && b0 <= 126 && b1 >= 32 && b1 <= 126 && b2 >= 32 && b2 <= 126
                     && b3 >= 32 && b3 <= 126 && buf[8] >= 32 && buf[8] <= 126)
            return "TEXT";
       
        if (b0 == 137 && b1 == 80 && b2 == 78 && b3 == 71)
            return "PNG";
       
        return "UNKNOWN";
}


Posted by 1010
01.JAVA/Java2008. 8. 19. 16:49
반응형

Java 맵 컬렉션 클래스의 소개

 

 

Map 인터페이스와 메소드의 이해

 

Java 코어 클래스에는 여러 가지 사전정의된 Map 클래스가 존재합니다. 구체적인 구현 방식을 설명하기 전에 Map 인터페이스를 살펴보고 모든 Map 클래스가 공유하는 공통점이 무엇인지 이해해 보기로 하겠습니다. Map 인터페이스는 모든 Map이 공통적으로 갖는 네 가지 종류의 메소드를 정의하고 있습니다. 그 중에서 별로 중요하지 않은 두 가지 메소드를 살펴 보기로 하겠습니다.

 

표 1: 아래 두 가지 메소드는 오브젝트에 의해 오버라이드(override)되며, Map 오브젝트가 동등(equallity) 조건에 의해 비교될 수 있게 합니다.

equals(Object o) 지정한 오브젝트과 이 맵의 동등(equality) 조건을 비교합니다
hashCode() 이 맵의 해시 코드를 리턴합니다.

 

 

맵 빌딩

 

맵은 엘리먼트를 삽입/제거하기 위한 다양한 뮤테이터(mutator) 메소드를 제공합니다

 

표 2: 맵 업데이트 메소드: 맵의 컨텐트를 변경하기 위한 메소드.

clear() 모든 매핑을 맵으로부터 제거
remove(Object key) 키와 연계된 값을 맵에서 제거
put(Object key, Object value) 지정된 값을 지정된 키와 연계(associate)
clear() 모든 매핑을 맵으로부터 제거
putAll(Map t) 특정 맵에서 이 맵으로 모든 매핑을 복사

 

여기에 별다른 것은 없습니다. 한 가지 참고할 만한 사항은 putAll()이 여러 번의 put() 호출을 사용하는 것보다 효율적인 경우가 드물다는 사실입니다. putAll()을 전달하기 위해 다른 맵을 생성하는데 드는 비용을 고려하지 않더라도 마찬가지입니다. putAll()은 전달된 Map의 각 엘리먼트에 대해 루프를 실행하며, 각각의 키 값을 put()이 실행되는 Map에 추가하는 알고리즘을 실행해야 하기 때문입니다. 하지만 putAll()이 전체 엘리먼트를 추가하기 전에 Map의 크기를 적절하게 설정하는 작업을 수행하는 작업을 수행하므로, 사용자가 직접 Map의 사이즈를 설정하는 것보다 putAll()이 좀더 효율적으로 실행될 수 있음을 참고하시기 바랍니다.



맵의 조회

Map의 각 엘리먼트 별로 알고리즘을 실행하는 방법은 상황에 따라 달라집니다. 특정 쿼리를 만족하는 엘리먼트가 무엇인지 확인하려면, 또는 어떤 이유로든 전체 엘리먼트에 대해 알고리즘을 반복적으로 실행하려면 먼저 Map의 “뷰”를 가져와야 합니다. 뷰에는 크게 3 가지가 있습니다 (표3) 참고

  • 전체 키-값 쌍(key-value pair) — entrySet()
  • 전체 키 — keySet()
  • 전체 값 — values()

앞의 두 가지는 Set 오브젝트를, 마지막은 Collection을 반환합니다. 세 가지 경우 모두 Collection 또는 Set 오브젝트를 직접 반복실행(iterate)할 수는 없으므로, 반복실행을 위한 Iterator 오브젝트를 먼저 가져와야 합니다. 따라서 Map의 여러 엘리먼트에 대해 반복실행을 하기 위해서는 다소 복잡한 구문을 사용해야 합니다.

 

Iterator keyValuePairs =  aMap.entrySet().iterator();
Iterator keys = aMap.keySet().iterator();
Iterator values =  aMap.values().iterator();

 

이 오브젝트들(Set, Collection, Iterator)는 실제로 하부 맵의 뷰로써 존재할 뿐, 전체 엘리먼트의 사본을 포함하고 있지 않다는 점을 참고할 필요가 있습니다. 따라서 조회 작업은 매우 효율적으로 수행됩니다. 반면 Collection 또는 Set의 toArray() 메소드는 Map의 모든 엘리먼트를 포함하는 어레이 오브젝트를 생성하므로, 실제로 어레이 내부의 엘리먼트를 일일이 확인해야 하는 경우가 아니라면 비효율적일 수 있습니다.

아래 예제는 HashMap을 이용하여 간단한 테스트를 실행하고 두 가지 방법을 이용하여 Map 엘리먼트들을 일일이 확인하는데 드는 비용을 비교하고 있습니다 (Test1.java 참고) 

 

int mapsize = aMap.size();
Iterator  keyValuePairs1 = aMap.entrySet().iterator();
for (int i = 0; i < mapsize; i++)
 {
    Map.Entry entry = (Map.Entry) keyValuePairs1.next();
    Object  key = entry.getKey();
    Object  value = entry.getValue();
    ...
 }
Object[]  keyValuePairs2 = aMap.entrySet().toArray();
for (int i = 0; i < mapsize; i++)
 {
    Map.Entry entry = (Map.Entry) keyValuePairs2[i];
    Object  key = entry.getKey();
    Object  value = entry.getValue();
    ...
 }

이 테스트를 수행하는 방법에는 여러 엘리먼트에 대한 실행 시간을 측정하는 방법과 toArray 호출을 이용하여 어레이를 생성하는데 드는 추가적인 비용을 산출하는 방법이 있습니다. 첫 번째 방법에서 어레이를 생성하는데 소요되는 시간을 무시한다면, Iterator를 이용하는 방법보다 toArray 호출을 통해 기존에 생성된 어레이를 사용하는 방법이 30%-60% 정도 빠릅니다. 하지만, toArray를 사용하여 어레이를 생성하는데 수반되는 오버헤드를 고려한다면, 오히려 Interator가 10%-20% 정도 빠른 성능을 보입니다. 그러므로, 컬렉션으로부터 엘리먼트 어레이를 생성해야 할 필요가 있는 경우라면, 각 엘리먼트 별로 작업을 수행하는 대신 어레이를 사용하는 편이 빠릅니다. 반면에 어레이가 굳이 필요하지 않은 경우라면 어레이를 아예 생성하지 않고 Iterator를 사용하는 것이 바람직합니다

 

표 3: 뷰를 반환하는 Map 메소드: 아래 메소드들은 Map 엘리먼트를 조회(traverse)하거나 Map의 엘리먼트를 삭제하기 위한 오브젝트를 반환합니다

entrySet() 맵에 포함된 매핑에 대한 Set 뷰를 반환합니다. 셋에 포함된 각 엘리먼트는 Map.Entry 오브젝트로 구성되며, getKey(), getValue() 메소드의 접근을 위한 key/value 엘리먼트를 포함할 수 있습니다(setValue() 메소드도 함께 제공됩니다).
keySet() 맵에 포함된 키에 대한 Set 뷰를 반환합니다. Set에서 엘리먼트를 제거하면 해당되는 매핑(key, value) 역시 Map에서 제거됩니다.
values() 맵에 포함된 값에 대한 Collection 뷰를 반환합니다. Collection에서 엘리먼트를 제거하면 해당되는 매핑(key, value) 역시 Map에서 제거됩니다.




엘리먼트에 대한 접근

 

맵 액세스를 위한 메소드는 표 4에서 확인하실 수 있습니다. 맵은 (value가 아닌) key를 기준으로 한 액세스에 최적화되는 것이 일반적입니다. 이러한 환경이 Map 정의에 분명히 명시되지는 않지만, 일반적으로 그러하다고 기대할 수 있습니다. 따라서 containsKey() 메소드는 get() 메소드와 유사한 실행 속도를 갖는 것으로 기대할 수 있습니다. 반면 containsValue() 메소드는 맵의 value를 일일이 스캔해야 하므로 훨씬 느린 속도를 보이는 경우가 대부분입니다.

 

표 4: 맵 액세스 및 테스트를 위한 메소드: Map 컨텐트를 변경하지 않은 상태에서 Map 컨텐트에 대한 정보를 조회하기 위한 메소드입니다.

get(Object key) 지정된 키에 관련된 값을 반환합니다.
containsKey(Object key) 맵이 지정된 키에 대한 매핑을 포함하고 있는 경우 True를 반환합니다.
containsValue(Object value) 맵이 지정된 값에 대한 하나 또는 그 이상의 키를 포함하고 있는 경우 True를 반환합니다.
isEmpty() 맵이 key-value 매핑을 전혀 포함하고 있지 않은 경우 True를 반환합니다.
size() 맵에 포함된 key-value 매핑의 수를 반환합니다.

 

HashMap에서 containsKey(), containsValue() 메소드를 이용하여 모든 엘리먼트를 테스트하는데 걸리는 시간을 비교해 보면, containsValue()의 실행 시간이 수십 배나 오래 걸림을 확인할 수 있습니다. (참고 Test2.java) 따라서 containsValue()가 애플리케이션의 성능 문제를 유발할 가능성이 매우 높습니다. 이 경우, containsValue() 이외의 다른 대안을 사용하여 보다 효율적인 방법으로 문제를 해결할 수 있을 것입니다. 이러한 대안이 불가능하다면, 첫 번째 Map의 모든 값을 키로 갖는 두 번째 Map을 생성하고, 첫 번째 Map에 대해 containsValue()를 실행하는 대신 두 번째 Map에 containsKey()를 실행하는 방법을 고려해 볼 수 있을 것입니다

 

 

코어 맵

 

Java는 다양한 Map 클래스를 포함하는 형태로 배포됩니다. Map 클래스는 크게 세 가지 종류로 구분됩니다

  1. 매핑 관리를 위해 애플리케이션에서 사용하는 범용 Map (대부분 java.util 패키지에 구현)
    • HashMap
    • Hashtable
    • Properties
    • LinkedHashMap
    • IdentityHashMap
    • TreeMap
    • WeakHashMap
    • ConcurrentHashMap
  2. 직접 생성하는 대신 다른 클래스를 이용하여 액세스하는 특수 목적의 Map
    • java.util.jar.Attributes
    • javax.print.attribute.standard.PrinterStateReasons
    • java.security.Provider
    • java.awt.RenderingHints
    • javax.swing.UIDefaults
  3. 별도의 Map 클래스 구현을 지원하기 위한 추상화 클래스
    • AbstractMap

 

해시 매핑 테크닉

 

대부분의 범용 Map은 해시 매핑(hash mapping)을 사용합니다. 해시 매핑은 엘리먼트를 어레이에 매핑하기 위한 매우 단순한 메커니즘을 제공합니다. Map을 제대로 이해하기 위해서는 먼저 해시 매핑을 이해하는 것이 중요합니다.

 

해시 맵 구조는 엘리먼트가 저장되는 내부 어레이로 구성됩니다. 내부 저장소가 어레이 형태로 구성되므로, 임의의 키를 이용하여 어레이에 인덱스를 적용하기 위한 메커니즘이 필요합니다. 이 메커니즘은 어레이의 크기보다 작은 어레이 인덱스 값을 생성하는데 사용됩니다. 이러한 메커니즘을 해시 함수(hash function)이라 부릅니다. Java 해시 기반 Map에서, 해시 함수는 임의의 오브젝트를 내부 어레이에 적합한 정수로 변환합니다. 해시 함수를 다른 데서 찾을 필요는 없습니다. 모든 오브젝트는 정수값을 반환하는 hashCode() 메소드를 가지고 있습니다. 이 값을 어레이로 매핑하려면, 값을 양수로 변환한 뒤 어레이 사이즈로 나눈 나머지값을 취하면 됩니다. Java의 모든 오브젝트에 대해 사용 가능한 단순한 해시 함수의 예가 아래와 같습니다.

int hashvalue = Maths.abs(key.hashCode()) %  table.length;

(modulo라 불리는 % 바이너리 연산자는 좌항을 우항으로 나눈 후 나머지값으로 남는 정수를 반환합니다.)

실제로 버전 1.4가 출시되기 전까지, 위의 해시 함수가 해시 기반 Map 클래스를 위해 사용되어 왔습니다. 실제 코드는 아래와 같습니다

int hashvalue = (key.hashCode() &  0x7FFFFFFF) % table.length;

이는 양수 값을 얻기 위해 좀 더 효율적인 메커니즘을 사용하고 있을 뿐, 앞에서 예시한 함수와 동일합니다. 버전 1.4가 출시되면서 HashMap 클래스는 Doug Lea의 util.concurrent 패키지를 기반으로 하는 좀 더 복잡한 해시 함수를 사용하게 되었습니다(Doug Lea의 클래스에 대해서는 뒷부분에서 좀 더 자세하게 설명합니다).


그림1 해싱의 동작 원리


지금까지 해시 매핑의 기본적인 원리를 설명했습니다. 하지만 이것으로 설명이 충분한 것은 아닙니다. 해시 함수는 임의의 오브젝트를 어레이의 특정 위치에 매핑시킵니다. 하지만 서로 다른 두 개의 키가 동일한 위치에 매핑되는 경우는 어떻게 해야 할까요? 이러한 현상을 근본적으로 차단할 수 있는 방법은 없습니다. 해시 매핑에서는 이러한 문제를 충돌(collision)이라 부릅니다. 맵에서는 이러한 충돌을 피하기 위해 인덱스 위치에 링크드 리스트(linked list)를 삽입하고, 각각의 엘리먼트를 링크드 리스트에 추가하는 방법을 사용합니다. 따라서 해시 기반 Map의 기본적인 put() 메소드는 아래와 같이 구현됩니다.


public Object put(Object key, Object value) {  
//Our  internal array is an array of Entry objects   
//Entry[] table;
 //Get  the hashcode, and map to an index
int hash  = key.hashCode();
int  index = (hash & 0x7FFFFFFF) % table.length;

//Loop through the linked list at table[index] to see if
//we  already have this key entry — and if so overwrite it
for  (Entry e = table[index] ; e != null ; e = e.next) {
//Must  check that the key is equal, since the hash
//could be the same for different key objects
if  ((e.hash == hash) && e.key.equals(key)) {
//This is the same key, overwrite the value
//and keep the old value to return from the method
Object old = e.value;
e.value = value;
return old;
}
}

//Still here, so it's a new key, just add a new Entry
//An  Entry object has Object "key" and "value", an int  "hash",
//and an  Entry "next" to point to the next Entry in the list

//Create a new Entry pointing to the start of the previous
//list,  and insert that new Entry into the table
Entry e  = new Entry(hash, key, value, table[index]);
table[index] = e;

return null;
}

다양한 해시 기반 Map의 소스를 살펴보면 그 내용이 서로 상당히 유사하다는 것을 알 수 있습니다. 널 키, 널 값을 처리하는 방법, 내부 어레이의 리사이즈와 같은 별도의 고려사항이 존재하기는 합니다. 위에서 정의된 put() 메소드는 get() 메소드를 위한 알고리즘을 함께 포함하고 있습니다. 삽입 과정에서 키가 이미 존재하는지의 여부를 확인하기 위해 매핑된 인덱스의 엔트리를 검색하는 작업이 필요하기 때문입니다. (get() 메소드는 put()과 동일한 알고리즘을 가지고 있지만 삽입, 덮어쓰기를 위한 코드가 없다는 차이만을 갖습니다.) 링크드 리스트 이외에도 충돌 현상을 방지하기 위한 방법으로, 해시 맵에서 별도의 “open addressing” 접근법이 사용되기도 합니다(본 문서에서는 자세히 다루지 않습니다).



해시맵의 최적화

 

해시 맵의 내부 어레이가 단 하나의 엘리먼트만으로 구성되어 있다면, 모든 엔트리는 동일한 어레이 위치의 링크드 리스트에 삽입되어야 할 것입니다. 이 방법은 매우 비효율적입니다. 링크드 리스트에 대한 선형 검색을 이용한 액세스 또는 업데이트는 각각의 어레이 인덱스가 하나의 오브젝트만을 가진 경우보다 훨씬 느립니다. 링크드 리스트의 액세스/업데이트 속도는 리스트의 사이즈에 정비례하는 반면, 해시 함수를 이용하여 어레이의 단일 엘리먼트를 액세스/업데이트하는 속도는 어레이 사이즈와 무관합니다. 점근적 성능(asymptotic performance, Big-O notation)의 용어에 대응시킨다면 전자는 O(n)이고 후자는 O(1)이 됩니다. 따라서 여러 엔트리가 동일한 어레이 위치에 집중되는 것을 방지하고 어레이의 사이즈를 크게 잡는 것이 유리합니다.

 

Map의 리사이즈

 

해시에서 각각의 내부 어레이 위치를 “버킷(bucket)”이라 부르고, 사용 가능한 버킷의 수(내부 어레이의 사이즈)를 용량(capacity)이라 부릅니다. Map 오브젝트가 임의의 수의 엔트리를 효과적으로 처리하게 하려면, 맵의 리사이즈가 가능해야 합니다. 하지만 리사이즈 작업은 매우 많은 비용이 필요합니다. 어레이의 사이즈가 바뀌면 인덱스 값 또한 바뀔 수 밖에 없기 때문에 리사이즈 과정에서 모든 엘리먼트를 새로운 어레이에 다시 삽입해야 합니다. 이전에 충돌하던 키들이 서로 충돌하지 않는 반면, 이전에는 충돌하지 않던 키들이 서로 충돌할 수 있습니다. Map을 충분한 크기로 늘리는 경우, 충돌의 가능성을 최소화할 수 있으며 따라서 극적인 성능 향상이 가능합니다.

 

1.4.2 JVM에서 많은 수의 엔트리(백만 개 이상)를 HashMap에 추가하는 간단한 테스트를 수행해 보았습니다. 표 5는 그 결과를 보여 주고 있으며, 모든 시간은 ‘pre-sized 서버 모드’에 정규화되었습니다(참고Test3.java). pre-sized JVM의 경우 클라이언트/서버 모드 JVM 모두 동일한 시간을 보입니다(JIT 컴파일 단계의 시간은 계산하지 않았습니다). 하지만 Map의 디폴트 사이즈를 사용하는 경우에는 여러 차례 리사이즈 작업이 발생하며 그 비용은 상당합니다. 서버 모드의 경우 50%나 증가하였으며, 클라이언트 모드와 비교했을 때는 3배나 많은 시간이 걸렸습니다!

 

표 5: pre-sized HashMap과 default sized HashMap에 엔트리를 추가하는데 소요되는 시간

  Client mode Server mode
Pre-sized large 100% 100%
Default size 294% 157%

 

 

Load Factor의 사용

 

각 버킷의 링크드 리스트 사이즈를 추적하지 않고도 리사이즈가 필요한 시점을 결정할 수 있도록 하기 위해, 해시 기반 Map은 별도의 매개변수와 계산식을 이용하여 버킷의 밀집도를 측정합니다. Map은 “로드 팩터(load factor)”라 불리는 매개변수를 이용하며, 로드 팩터는 Map에 리사이즈가 수행되기 전에 얼마나 많은 “로드” 작업이 허용되는지를 결정하는데 사용됩니다. 로드 팩터, 엔트리의 수(맵 사이즈), 용량의 관계는 아래와 같이 정의됩니다.

  • (load factor) x (capacity) > (map size)인 경우 맵은 리사이즈 된다.

예를 들어, 디폴트 로드 팩터가 0.75이고 디폴트 용량이 11이면 11 x 0.75 = 8.25가 됩니다. 이 값에 버림을 적용하면 8 개의 엘리먼트를 얻습니다. 따라서 이 Map에 8 개째의 엔트리를 추가하는 시점에 Map은 보다 큰 용량으로 리사이즈 됩니다. 역으로, 리사이즈를 피하기 위해 초기 용량을 계산할 때에는 추가되는 엔트리의 수를 로드 팩터로 나누고 그 결과에 올림을 적용하면 됩니다.

  • 로드 팩터가 0.75일 때 100 개의 엔트리를 추가하려면, 용량은 100/0.75 = 133.33, 이 결과에 올림을 적용하여 134 (또는 홀수 값이 필요한 경우 135)

홀수 값을 갖는 버킷 사이즈는 충돌의 가능성을 줄여주므로 보다 효율적입니다. 소수(素數)를 적용하는 것이 이상적이지만, 실제로 테스트해 보면 소수가 항상 최상의 결과를 보여 주는 것은 아닙니다(참조Test4.java). 버전 1.4 이후의 일부 Map(예: HashMap과 LinkedHashMap (Hashtable과 IdentityHashMap은 제외))은 2n의 용량을 필요로 하는 해시 함수를 사용하지만, 이러한 Map은 결과값에 가장 근사한 2n 값을 자동으로 계산하므로, 별도의 계산 작업이 불필요합니다.

 

로드 팩터는 시간과 공간의 조율을 위한 변수입니다. 로드 팩터가 작으면 공간을 더 많이 차지하지만 충돌의 가능성이 적어지므로, 액세스/업데이트가 빨라집니다. 0.75 이상의 로드 팩터는 일반적으로 권장되지 않으며, 로드 팩터 1.0은 최소한 하나 이상의 충돌 가능성을 담보합니다. 로드 팩터가 0.50 이하로 내려가면 그 효과는 점차적으로 약해지지만, 맵 사이즈를 효과적으로 관리하는 이상 작은 로드 팩터가 (메모리 비용을 제외하고) 성능에 부정적인 영향을 미칠 가능성은 없습니다. 하지만 Map의 사이즈를 충분히 크게 설정해 놓지 않은 상태라면, 로드 팩터가 작으면 작을 수록 리사이즈가 더욱 빈번하게 발생하고 성능 저하 현상으로 연결될 수 있습니다.

 

 

적절한 맵의 선택

 

그렇다면 어떤 맵을 사용해야 할까요? 동기화가 필요할까요, 그렇지 않을까요? 애플리케이션의 최적화된 성능을 보장하기 위해 가장 중요한 두 가지 고려사항이 바로 이 두 가지입니다. 범용 Map을 사용하는 경우에는 맵 사이즈와 로드 팩터의 두 가지 튜닝 옵션만으로 대부분의 문제를 해결할 수 있습니다.

최적의 Map 성능을 얻기 위한 방법이 아래와 같습니다.

  1. 모든 Map 변수를 Map으로 선언합니다(다시 말해, HashMap, Hashtable과 같은 다른 Map 클래스를 사용하지 않습니다.)
    Map criticalMap = new HashMap(); //GOOD
    HashMap criticalMap = new HashMap(); //BAD

    이와 같이 선선하면 코드의 한 라인만 수정함으로써 특정 Map 인스턴스를 쉽게 대체할 수 있습니다.

  2. Doug Lea의 util.concurrent 패키지를 다운로드합니다. (http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html) ConcurrentHashMap을 디폴트 Map으로 사용합니다. 1.5 릴리즈로 이전하는 경우, 디폴트Map을 java.util.concurrent.ConcurrentHashMap으로 변경합니다. 멀티-쓰레드 환경이라 하더라도 Synchronized wrapper를 이용하여 ConcurrentHashMap을 래핑하지 않습니다. 디폴트 사이즈와 로드 팩터를 그대로 사용합니다.
  3. 애플리케이션 프로파일링을 수행합니다. Map이 성능 병목으로 작용하는 경우, 그 원인을 분석하고 Map 클래스, Map 사이즈, 로드 팩터, 키 오브젝트 equals() 메소드 등에 관련한 설정 변경을 시도합니다. 범용적이지 않은 특수 목적의 Map 활용 시에는 예외 없이 특수 목적의 커스텀 Map 구현 방식이 필요하지만, 그렇지 않은 경우라면 범용적인 Map을 이용하여 원하는 성능 목표를 달성할 수 있을 것입니다.

 

맵의 선택

 

어쩌면 여러분들은 좀 더 복잡한 설명을 기대하고 있을지도 모르겠습니다. 조금 여유를 갖고 접근해 봅시다. 먼저, 어떤 Map을 사용해야 할까요? 그 답은 매우 간단합니다. 특정 Map 유형을 필요로 하는 실질적인 설계 요구사항이 도출되기 전까지는 Map을 선택하지 않습니다. 구체적인 Map 구현 방식은 일반적으로 설계 단계에서 결정되지 않습니다. Map이 필요하다는 사실은 알더라도, 어떤 Map이 필요한지는 모를 수 있습니다. Map 인터페이스가 필요한 이유가 바로 여기에 있습니다. 필요한 시점까지 Map 구현 방식의 결정을 미루는 것이 좋습니다. 또 “Map” 선언 변수를 올바르게 활용하였다면, 라인 하나만 변경함으로써 특정 Map의 구현 방식을 변경할 수 있을 것입니다. 이것은 매우 적은 비용을 수반하는 튜닝 방법입니다. 그렇다면 디폴트 Map 구현 방식은 무엇을 선택해야 할까요? 여기에 대해서는 곧 설명하겠습니다.

 

 

맵의 동기화

 

그렇다면 동기화 여부는 어떻게 결정할 수 있을까요? (동기화를 위해서는 synchronized Map을 사용하거나 Collections.synchronizedMap()을 이용하여 unsynchronized Map dmf synchronized Map으로 변환해야 합니다. 두 번째 테크닉에서는 “synchronized wrapper”가 사용됩니다.) 이것은 매우 복잡한 문제입니다. Map이 멀티-쓰레드 동시 액세스/업데이트를 위해 사용될 것인지의 여부를 고려해야 하며, 이와 별도로 유지보수에 관련한 고려가 필요합니다. 예를 들어, 동시 업데이트를 고려하지 않고 Map을 시작하였다가, 나중에 동시 업데이트가 필요해지는 경우를 고려해 봅시다. 이러한 상황이라면, unsynchronized Map으로 시작하였다가 나중에 애플리케이션에 동시 업데이트 쓰레드를 추가하는 시점에 synchronized로 변경하는 방법을 사용할 가능성이 매우 높습니다. 이러한 작업은 애플리케이션의 손상을 초래하며, 이러한 형태의 버그는 그 원인을 확인하고 추적하기가 가장 어렵습니다.

하지만 디폴트로 synchronized Map을 선택하고 멀티-쓰레드 애플리케이션의 실행을 순차화(serialize)하는 경우에는 심각한 성능 저하를 경험하게 됩니다. 해답을 찾기는 무척 어려운 것처럼만 보입니다.


Doug Lea는 뉴욕 주립대학의 컴퓨터 과학 교수입니다. 그는 util.concurrent라 통칭되는 몇 가지 퍼블릭 도메인 패키지를 생성하였으며, 이 패키지에는 고성능 동시 접속 프로그램을 단순화하기 위한 여러 가지 유틸리티 클래스가 포함되어 있습니다. 이 클래스에 포함된 두 가지 Map으로 ConcurrentReaderHashMap과 ConcurrentHashMap이 있습니다. 이 Map 구현방식은 쓰레드로부터 안전(thread-safe)하며, 동시 액세스/업데이트를 위해 동기화를 요구하지 않을 뿐 아니라, Map을 필요로 하는 대부분의 상황에서 유용하게 활용됩니다. 또 이 Map들은 Hashtable과 같은 synchronized Map이나 synchronized wrapper를 사용하는 방식보다 훨씬 더 뛰어난 확장성을 제공하며, HashMap과 비교했을 때의 성능적인 손실은 매우 적은 수준입니다. utl.concurrent 패키지는 1.5 Java 릴리즈를 위한 동시성 유틸리티의 개발을 추진해 온 JSR166의 기반을 이루고 있으며, 1.5 릴리즈는 이 Map을 새로운 java.util.concurrent 패키지에 포함하게 될 것입니다.


결론적으로 synchronized/unsynchronized Map을 선택하기 위해 복잡한 결정 과정을 거칠 필요는 없으며, ConcurrentHashMap을 사용하기만 하면 됩니다. 물론 ConcurrentHashMap이 적합하지 않은 경우도 있을 수 있습니다. 하지만 이러한 경우의 가능성은 극히 적으며 각 케이스 별로 별도로 해결하는 것이 바람직합니다.


저자 - Jack Shirazi

출처 한국오라클

Posted by 1010
98..Etc/Etc...2008. 8. 19. 16:48
반응형

파일 다운로드에 관하여 여러모로 고민하다가 기본의 Struts내에서 지원하는 DownloadAction 클래스를 상속하여 Streaminfo를 받아오는 방식을 포기하고 직접 새로운 DownloadFile 메소드를 짜보았습니다. 직접 적용하여 쓰시려면 필히 DownFileException 예외클래스를 만들어주시고 MessageResource.properties속에 해당 키를 설정해주어야 합니다. 기존의 파일이 존재하지않으면(즉 파일 사이즈가 0 바이트) DownFileException을 만들어서 에러페이지로 포워딩 하는 방법을 사용하였습니다. 다양하게 스크립트를 띠우거나 다른 방식을 취하셔도 좋습니다.^^

참고로 파일 명이 깨지는 문제를 해결하기 위하여 DownloadFileAction에서 아래와 같이 미리 파일명을 처리해주었습니다.

logicalFileName = URLEncoder.encode(logicalFileName,"UTF-8");

 

 

public static void DownloadFile(HttpServletRequest request,
   HttpServletResponse response, String filePath, int maxFileSize,
   String physicalFileName, String logicalFileName) throws Exception {

  File file = new File(filePath + physicalFileName); // Realpath of
                 // file...
 
  // Primary check for whether the selected file is existed...
  if (file.length() == 0) {
   DownFileException dfe = new DownFileException();
   dfe.setMessageKey("error.board.nonexist.files.error");
   throw dfe;
  }
 
  response.setContentType("application/octet-stream");
  String Agent = request.getHeader("USER-AGENT");
  if (Agent.indexOf("MSIE") >= 0) {
   int i = Agent.indexOf('M', 2);
   String IEV = Agent.substring(i + 5, i + 8);
   if (IEV.equalsIgnoreCase("5.5")) {
    response.setHeader("Content-Disposition", "filename="
      + logicalFileName);
   } else {
    response.setHeader("Content-Disposition",
      "attachment;filename=" + logicalFileName);
   }
  } else {
   response.setHeader("Content-Disposition", "attachment;filename="
     + logicalFileName);
  }

  byte b[] = new byte[maxFileSize * 1024 * 1024];
  if (file.exists()) {
   try {
    BufferedInputStream fin = new BufferedInputStream(
      new FileInputStream(file));
    BufferedOutputStream outs = new BufferedOutputStream(response
      .getOutputStream());
    int read = 0;
    while ((read = fin.read(b)) != -1) {
     outs.write(b, 0, read);
    }
    outs.flush();
    outs.close();
    fin.close();
   } catch (Exception e) {
   }
  }
 }

Posted by 1010
반응형

DBUtils에서 Clob 사용하기


최근 오라클버젼들은 일반 String처럼 clob을 처리할 수 있지만 그렇지 않은 버젼들은 DBUtils를 조금 수정해 주서야 합니다

resultset의 메타 정보를 이용해서 컬럼 타입이 clob인 넘들만 따로 처리하는 로직입니다


org.apache.commons.dbutils.BasicRowProcessor.java 를 다음과 같이 수정한 후 다시 컴팔 하세요



    private Object createBean(
        ResultSet rs,
        Class type,
        PropertyDescriptor[] props,
        int[] columnToProperty,
        int cols)
        throws SQLException {


        Object bean = this.newInstance(type);       
        Object value = null;
        ResultSetMetaData meta = rs.getMetaData();
        for (int i = 1; i <= cols; i++) {

            if (columnToProperty[i] == PROPERTY_NOT_FOUND) {
                continue;
            }
           
            PropertyDescriptor prop = props[columnToProperty[i]];
            Class propType = prop.getPropertyType();
           
            if ("CLOB".equals(meta.getColumnTypeName(i))) {
                value = readClob(rs, i);
            }
            else {
                value = rs.getObject(i);
            }

            if (propType != null && value == null && propType.isPrimitive()) {
                value = primitiveDefaults.get(propType);
            }
           
            this.callSetter(bean, prop, value);
        }

        return bean;
    }
   
    protected Object readClob(ResultSet rs, int idx) {
        StringBuffer stringbuffer = new StringBuffer();
        char[] charbuffer = new char[1024];
        int read = 0;
       
        Reader reader = null;
        String result = null;
        try {
            reader = rs.getCharacterStream(idx);
            while ((read = reader.read(charbuffer, 0, 1024)) != -1)
                stringbuffer.append(charbuffer, 0, read);

            result = stringbuffer.toString();
        } catch (Exception exception) {
            System.out.println(exception);
        } finally {
            if (reader != null) try { reader.close(); } catch (Exception e){}
        }

        return result;
    }




Posted by 1010
반응형

POI HSLF

Java API To Access Microsoft Powerpoint Format Files



1. POI API Document

http://jakarta.apache.org/poi/apidocs/index.html


2. POI Download

http://www.apache.org/dyn/closer.cgi/jakarta/poi/


3. 간단한 텍스트 읽기

<%@ page import="java.io.*"%>
<%@ page import="org.apache.poi.hslf.model.*"%>
<%@ page import="org.apache.poi.hslf.usermodel.*"%>
<%@ page import="org.apache.poi.hslf.*"%>

<%

    SlideShow src =

          new SlideShow(

          new HSLFSlideShow("C:\\Web\\Tomcat 5.5\\webapps\\ROOT\\test.ppt"));


    Slide[] sl = src.getSlides();


    for (int i = 0; i < sl.length; i++) {
        Slide s = sl[i];
        TextRun[] trs = s.getTextRuns();
        for (int k = 0; k < trs.length; k++) {
            TextRun tr = trs[k];
            System.out.println(tr.getText());
           }
    }

%>


4. 테스트버젼

PPT 2000


Posted by 1010
반응형

POI HWPF

Java API to Handle Microsoft Word File



1. POI API Document

http://jakarta.apache.org/poi/apidocs/index.html


2. POI Download

http://www.apache.org/dyn/closer.cgi/jakarta/poi/


3. 간단한 텍스트 읽기

<%@ page import="java.io.*"%>
<%@ page import="org.apache.poi.hwpf.usermodel.*"%>
<%@ page import="org.apache.poi.hwpf.*"%>

<%

   HWPFDocument doc =

           new HWPFDocument(

           new FileInputStream("C:\\Web\\Tomcat 5.5\\webapps\\ROOT\\2007.doc"));


    Range r = doc.getRange();
   
    for (int x = 0; x < r.numSections(); x++) {
        Section s = r.getSection(x);
        for (int y = 0; y < s.numParagraphs(); y++) {
            Paragraph p = s.getParagraph(y);
            for (int z = 0; z < p.numCharacterRuns(); z++) {
                CharacterRun run = p.getCharacterRun(z);
                String text = run.text();
                System.out.print(text);
            }
            System.out.println();
        }
    }

%>


4. MS Word 테스트 버젼

MS워드 2000, MS워드 2003


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

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

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

Posted by 1010
98..Etc/Etc...2008. 8. 19. 16:43
반응형

Validator 속성

depends 속성

체크

에러 메세지

required 필수 체크 errors.required {0}입고 안되어 입력해 주세요
minlength 최소장 체크 errors.minlength {0}은{1}캐릭터 이상으로 입력해 주세요
maxlength 최대장 체크 errors.maxlength {0}은{1}캐릭터 이내에서 입력해 주세요
mask 정규 표현 체크 errors.invalid {0}은 올바른 형식에서 입력해 주세요
byte Byte형 체크 errors.byte {0}은 byte형으로 입력해 주세요
short Short형 체크 errors.short {0}은 short형으로 입력해 주세요
integer Integer형 체크 errors.integer {0}은 int형으로 입력해 주세요
long Long형 체크 errors.long {0}은 Long형으로 입력해 주세요
float Float형 체크 errors.float {0}은 Float형으로 입력해 주세요
double Double형 체크 errors.double {0}은 Double형으로 입력해 주세요
date 일자형 체크 errors.date {0}은 일자형으로 입력해 주세요
range 범위 체크 errors.range {0}은{1}이상{2}이하의 범위에서 입력해 주세요
intRange 범위 체크(정수) errors.range {0}은{1}이상{2}이하의 범위에서 입력해 주세요
floatRange 범위 체크(소수) errors.range {0}은{1}이상{2}이하의 범위에서 입력해 주세요
email E-Mail 포맷 체크 errors.email {0}은 올바른 형식에서 입력해 주세요


depends속성에 따른 파라미터

depends 속성

필요한 파라미터

minlength minLength
maxlength maxLength
mask mask
range max, min
intRange max, min
floatRange max, min
date datePattern(datePatternStrict)


예제

<?xml version="1.0" encoding="EUC-KR"?>
<!DOCTYPE form-validation PUBLIC
    "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
    "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

<form-validation>
 <formset>
  <form name="signon">
   <field property="user_id" depends="required, mask">
    <arg0 key="signon.user_id"/>    
    <var>
     <var-name>mask</var-name>
     <var-value>^[0-9a-zA-Z]*$</var-value>
    </var>
   </field>
   <field property="passwd" depends="required, mask">
    <arg0 key="signon.passwd"/>
    <var>
     <var-name>mask</var-name>
     <var-value>^[0-9a-zA-Z]*$</var-value>
    </var>
   </field>
  </form>
 
  <form name="commoncdMast">
   <field property="common_gb" depends="required, intRange">
    <arg0 key="code.common_gb"/>
    <arg1 key="1"/>
    <arg2 key="5"/>      
   </field>
   <field property="common_gb_nm" depends="required">
    <arg0 key="code.common_gb_nm"/>
   </field>
  </form>
 
  <form name="commoncdDtl">
   <field property="common_gb" depends="required, minlength, maxlength">
    <arg0 key="code.common_gb"/>
    <arg1 name="minlength" key="${var:minlength}" resource="false" />
    <arg1 name="maxlength" key="${var:maxlength}" resource="false" />
    <var>
     <var-name>minlength</var-name>
     <var-value>5</var-value>
    </var>
    <var>
     <var-name>maxlength</var-name>
     <var-value>5</var-value>
    </var>
   </field>
   <field property="common_cd" depends="required, minlength, maxlength">
    <arg0 key="code.common_cd"/>
    <arg1 name="minlength" key="${var:minlength}" resource="false" />
    <arg1 name="maxlength" key="${var:maxlength}" resource="false" />
    <var>
     <var-name>minlength</var-name>
     <var-value>5</var-value>
    </var>
    <var>
     <var-name>maxlength</var-name>
     <var-value>5</var-value>
    </var>
   </field>
   <field property="common_cd_nm" depends="required">
    <arg0 key="code.common_cd_nm"/>
   </field>
   <field property="common_order" depends="required, mask">
    <arg0 key="code.common_order"/>
    <var>
     <var-name>mask</var-name>
     <var-value>^[0-9]*$</var-value>
    </var>
   </field>
  </form>  
 </formset>
</form-validation>

Posted by 1010
반응형

Commons-Fileupload 1.2


1.2 버젼이 2007.2.13에 새롭게배포되었습니다

1.1 이하단계 버젼과 달라진 점을 알아보도록 하지요

 

I. commons-fileupload 1.1

http://www.jakartaproject.com/article/jakarta/110887666654000

 

 

II. 다운로드 및 설치

 -. fileupload는 commons의 io가 필요합니다

commons-fileupload

http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi

commons-io

http://jakarta.apache.org/site/downloads/downloads_commons-io.cgi



III. 달라진점

 -. DiskFileUpload 가 Deprecated 되었습니다

 -. 리스너 추가를 통해 업로드 진행 상태를 파악할 수 있습니다(대용량 파일인 경우 유용)

 -. 비정상적인 업로드시 나타나는 중간 쓰레기 파일들을 제거할 수 있습니다

 

IV. 예제소스코드


upload.html

<form name=fileupload method=post action=./upload enctype="multipart/form-data">
 file : <input type=file name=file1><br>
 text : <input type=text name=text1><br>
 <input type=submit name=button1 value=submit>
</form>

web.xml

가비지 파일 cleaner에 사용되는 FileCleanerCleanup을 listener로 추가

샘플 코드에서 사용되는 서블릿 등록

<web-app>

   ...

 

   <listener>
       <listener-class>
           org.apache.commons.fileupload.servlet.FileCleanerCleanup
       </listener-class>
   </listener>


    ...


    <servlet>
        <servlet-name>uploadServlet</servlet-name>
        <servlet-class>UploadServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>uploadServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>

    ...

</web-app>


UploadServlet.java


import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class UploadServlet extends HttpServlet {
   
    String upload_dir = null;
    public void init(ServletConfig config) throws ServletException {
          super.init(config); 
          upload_dir = config.getServletContext().getRealPath("/upload/");
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   

        // form type이 multipart/form-data 면 true 그렇지 않으면 false를 반환
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
       
        if (isMultipart) {
            try {

                int yourMaxMemorySize = 1024 * 10;                 // threshold  값 설정
                long yourMaxRequestSize = 1024 * 1024 * 100;   //업로드 최대 사이즈 설정 (100M)

                File yourTempDirectory = new File(upload_dir);
               
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold(yourMaxMemorySize);
                factory.setRepository(yourTempDirectory);               
   
                ServletFileUpload upload = new ServletFileUpload(factory);
                upload.setSizeMax(yourMaxRequestSize);          // 임시 업로드 디렉토리 설정
                upload.setHeaderEncoding("EUC_KR");               // 인코딩 설정
               

                /**

                 *  업로드 진행 상태 출력 (Watching progress)

                */
                ProgressListener progressListener = new ProgressListener(){
                   private long megaBytes = -1;
                   public void update(long pBytesRead, long pContentLength, int pItems) {
                       long mBytes = pBytesRead / 1000000;
                       if (megaBytes == mBytes) {
                           return;
                       }
                       megaBytes = mBytes;
                       System.out.println("We are currently reading item " + pItems);
                       if (pContentLength == -1) {
                           System.out.println("So far, " + pBytesRead + " bytes have been read.");
                       } else {
                           System.out.println("So far, " + pBytesRead + " of " + pContentLength
                                              + " bytes have been read.");
                       }
                   }
                };
                upload.setProgressListener(progressListener);   // 진행상태 리스너 추가
   

                String fieldName = null;
                String fieldValue = null;
                String fileName = null;
                String contentType = null;
                long sizeInBytes = 0;

                List items = upload.parseRequest(request);               
                Iterator iter = items.iterator();
                while (iter.hasNext()) {
                    FileItem item = (FileItem) iter.next();
   

                    // 정상적인 폼값 출력 및 처리
                    if (item.isFormField()) {
                        fieldName = item.getFieldName();
                        fieldValue = item.getString();
                       
                        System.out.println("-----+-----+-----+-----+-----+-----+-----+-----");
                        System.out.println("Field Name : "+fieldName);
                        System.out.println("Field Value : "+fieldValue);
                        System.out.println("-----+-----+-----+-----+-----+-----+-----+-----");
                       

                    // 업로드 파일 처리
                    } else {
                        fieldName = item.getFieldName();
                        fileName = item.getName();
                        contentType = item.getContentType();
                        sizeInBytes = item.getSize();
                       
                        System.out.println("-----+-----+-----+-----+-----+-----+-----+-----");
                        System.out.println("Field Name : "+fieldName);
                        System.out.println("File Name : "+fileName);
                        System.out.println("ContentType : "+contentType);
                        System.out.println("File Size : "+sizeInBytes);
                        System.out.println("-----+-----+-----+-----+-----+-----+-----+-----");

                        String savefile = fileName.substring(fileName.lastIndexOf("\\")+1, fileName.length());
                        File uploadedFile = new File(upload_dir+"\\"+savefile);
                        item.write(uploadedFile);
                    }
                }


            // 설정한 업로드 사이즈 초과시 exception 처리
            } catch (SizeLimitExceededException e) {
                e.printStackTrace();   

            // 업로드시 io등 이상 exception 처리
            } catch (FileUploadException e) {
                e.printStackTrace();

            // 기타 exception 처리
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }   
}


V. 실행결과

-----+-----+-----+-----+-----+-----+-----+-----+-----
Field Name : file1
File Name : C:\Program Backup\AromNet11a\AromNet.exe
ContentType : application/octet-stream
File Size : 274432
-----+-----+-----+-----+-----+-----+-----+-----+-----
-----+-----+-----+-----+-----+-----+-----+-----+-----
Field Name : text1
Field Value : this is test
-----+-----+-----+-----+-----+-----+-----+-----+-----

큰 파일을 업로드한 경우 업로드 상태 출력

We are currently reading item 0
So far, 4096 of 338043623 bytes have been read.
We are currently reading item 1
So far, 1003477 of 338043623 bytes have been read.
We are currently reading item 1
So far, 2002901 of 338043623 bytes have been read.
We are currently reading item 1
So far, 3002325 of 338043623 bytes have been read.
We are currently reading item 1
So far, 4001749 of 338043623 bytes have been read.
We are currently reading item 1
So far, 5001173 of 338043623 bytes have been read.
We are currently reading item 1
So far, 6000597 of 338043623 bytes have been read.
We are currently reading item 1
So far, 7000021 of 338043623 bytes have been read.
We are currently reading item 1
So far, 8003498 of 338043623 bytes have been read.
We are currently reading item 1
So far, 9002922 of 338043623 bytes have been read.
We are currently reading item 1
So far, 10002346 of 338043623 bytes have been read.
We are currently reading item 1
So far, 11001770 of 338043623 bytes have been read.
We are currently reading item 1
So far, 12001194 of 338043623 bytes have been read.
We are currently reading item 1
So far, 13000618 of 338043623 bytes have been read.
We are currently reading item 1
So far, 14000042 of 338043623 bytes have been read.
We are currently reading item 1
So far, 15003605 of 338043623 bytes have been read.
We are currently reading item 1
So far, 16003029 of 338043623 bytes have been read.

...


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

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

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


Posted by 1010
반응형

DBUtils에서 number 타입의 컬럼이 int형으로 안넘어올때..


데이터베이스의 컬럼이 NUMBER 타입인데 VO객체의 int형 setter를 통해 그 값이 안넘어 오는 경우가 있습니다


데이터베이스 테이블 스크립트

CREATE TABLE user_t (

    user_id VARCHAR2(12) PRIMARY KEY NOT NULL,

    user_point NUMBER(8)

);


데이터베이스의 값을 저장하는 VO 객체

public class UserVO {

    String user_id;

    int user_point;


    public void setUser_id(String user_id) { this.user_id = user_id; }

    public void setUser_point(int user_point) { this.user_point = user_point; }

    public String getUser_id() { return user_id; }

    public int getUser_point() { return user_point; }

}



JSP

...

ResultSetHandler rsh = new BeanListHandler(UserVO.class);

QueryRunner qr = new QueryRunner();

List list = (List)qr.query(conn, "SELECT user_id, user_point FROM user_t WHERE user_id = ?", new String[]{"unicorn"}, rsh);

...


간단히 위와 같이 코딩을 하면 다음과 같은 에러 메세지가 납니다

java.sql.SQLException Cannot set user_point : argument type mismatch Query

user_point 컬럼이랑 먼지 모르지만 아규먼트랑 type이 맞지 않는다는 말 같군요


DBUtils 받아서 차근차근 소스를 보다보니..

org.apache.commons.dbutils.BasicRowProcessor.java

private void callSetter(
    Object target,
    PropertyDescriptor prop,
    Object value)
    throws SQLException {


    Method setter = prop.getWriteMethod();
    if (setter == null) {
        return;
    }

    Class[] params = setter.getParameterTypes();
    try {

        // Don't call setter if the value object isn't the right type
        if (this.isCompatibleType(value, params[0]))
            setter.invoke(target, new Object[] { value });  //--


    } catch (IllegalArgumentException e) {
        throw new SQLException(
            "Cannot set " + prop.getName() + ": " + e.getMessage());

    } catch (IllegalAccessException e) {
        throw new SQLException(
            "Cannot set " + prop.getName() + ": " + e.getMessage());

    } catch (InvocationTargetException e) {
        throw new SQLException(
            "Cannot set " + prop.getName() + ": " + e.getMessage());
    }
}


의 setter.invoke 에서 IllegalArgumentException 가 throw 되고 있었습니다

즉 값에 해당하는 setter 함수를 찾다가 setUser_point(int user_point) 가 있음에도 불고하고 적당한 것이 없어서 Exception을 던지고 있는 실정입니다

원인은 value 때문이었는데, 이는

value = rs.getObject(i+1)

와 같이 resultset에서 받아온 값입니다

invoke 함수에 두번째 파라미터로 Object형태의 객체형태로 넘겨주어야 하는데 이넘은 Integer형이 아닌것 같았습니다

Integer.class.isInstance(value) 로 값을 찍어보니 역시나 false가 리턴되었습니다


그래서 다음과 같이 약간 수정하였습니다


private void callSetter(
    Object target,
    PropertyDescriptor prop,
    Object value)
    throws SQLException {


    Method setter = prop.getWriteMethod();
    if (setter == null) {
        return;
    }

    Class[] params = setter.getParameterTypes();
    try {

        // Don't call setter if the value object isn't the right type


        if (params[0].equals(Integer.TYPE)) {
            value = new Integer(value.toString());  //-- ②
       }


        if (this.isCompatibleType(value, params[0]))
            setter.invoke(target, new Object[] { value });  //-- ①


    } catch (IllegalArgumentException e) {
        throw new SQLException(
            "Cannot set " + prop.getName() + ": " + e.getMessage());

    } catch (IllegalAccessException e) {
        throw new SQLException(
            "Cannot set " + prop.getName() + ": " + e.getMessage());

    } catch (InvocationTargetException e) {
        throw new SQLException(
            "Cannot set " + prop.getName() + ": " + e.getMessage());
    }
}


과 같이 명시적으로 Integer 타입일때 Integer형태를 만들어 주었습니다

MySQL과 Oracle 두가지 테스트해보았는데, MySQL에서는 발생하지 않았지만 Oracle에서는 위와같은 문제가 발견되었습니다

아마도 M$SQL에서도 동일한 문제가 발생할것 같습니다

소스는 동일한데 어디선 되고 안되고를 보니 JDBC영향일것으로 추측이 되는데, JDBC 소스를 보아도 별 특별한데는 아직 찾지 못했습니다


사실 DBUtils는 잘쓰면 무척 편합니다

하지만 많이 좋아졌다고는 하나 reflect에 대한 비용 없잖아 들겁니다

DBUtils는 그 자체로 괜찮지만 아마 사용하다보면 소스에 손을 데야될겁니다

한글 인코딩, 디코딩이나 쿼리등을 DBUtils에 심어놓으면 코딩은 아마 더 줄어들겁니다

Posted by 1010
반응형

Installing Tomcat with commons-daemon (jsvc)

Most installation that I've seen of Tomcat is made with tomcat running as root. This could potentially be a disasters security hole. Most Linux systems only allow the root to listen to port 80...which is why many users of tomcat under Linux run tomcat as root. With jscv, the process will start off as root but later on will change owner to a user of your choice.

 

 

Installation

Create the user to run tomcat under with

useradd tomcat


This will create a directory under


/home/tomcat


Download and install tomcat under /usr/tomcat. This is how my tomcat directory looks like


ls -l /home/tomcat
drwxr-xr-x  3 tomcat tomcat  4096 Dec 13 02:51 bin
drwxr-xr-x  6 tomcat tomcat    56 Sep 23 09:42 common
drwxr-xr-x  3 tomcat tomcat  4096 Dec 13 05:18 conf
-rw-r--r--  1 tomcat tomcat 11357 Sep 23 09:44 LICENSE
drwxr-xr-x  2 tomcat tomcat    25 Dec 13 02:51 logs
-rw-r--r--  1 tomcat tomcat   688 Sep 23 09:44 NOTICE
-rw-r--r--  1 tomcat tomcat  6403 Sep 23 09:42 RELEASE-NOTES
-rw-r--r--  1 tomcat tomcat  7006 Sep 23 09:44 RUNNING.txt
drwxr-xr-x  5 tomcat tomcat    44 Sep 23 09:42 server
drwxr-xr-x  4 tomcat tomcat    30 Sep 23 09:42 shared
drwxr-xr-x  2 tomcat tomcat     6 Sep 23 09:42 temp
drwxr-xr-x  3 tomcat tomcat    35 Dec 13 05:17 webapps
drwxr-xr-x  3 tomcat tomcat    21 Dec 13 02:52 work


Compile the jscv code by following the instructions on http://tomcat.apache.org/tomcat-5.0-doc/setup.html


 

Run As Service


Tomcat 5.x ship with a tomcat service file which you can use and modify. However, it's written to be used with Java 1.4. To use it with Java 1.5 you need to tweak it some more or use the following file. Please note the items in red. Tomcat user and the JDK path which you must update to fit your system. Also make sure the DAEMON_HOME executable is in the right place.


#!/bin/sh
#
# Startup script for Tomcat, the Apache Servlet Engine
#
# chkconfig: 345 80 20
# description: Tomcat is the Apache Servlet Engine
# processname: tomcat
# pidfile: /var/run/tomcat.pid
#
# Mike Millson <*******@meritonlinesystems.com>
#
# version 1.02 - Clear work directory on shutdown per John Turner suggestion.
# version 1.01 - Cross between Red Hat Tomcat RPM and Chris Bush scripts


TOMCAT_PROG=tomcat
JAVA_HOME='/usr/java/jdk1.5.0_06'
CATALINA_HOME='/home/tomcat/'
DAEMON_HOME=$CATALINA_HOME/bin/jsvc
TMP_DIR=/var/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar


# if TOMCAT_USER is not set, use tomcat like Apache HTTP server
if [ -z "$TOMCAT_USER" ]; then
 TOMCAT_USER="tomcat"
fi


RETVAL=0


# start and stop functions
start() {
    echo -n "Starting tomcat: "
    chown -R $TOMCAT_USER:$TOMCAT_USER /home/tomcat/*
    $DAEMON_HOME \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Djava.io.tmpdir=$TMP_DIR \
    -Djava.awt.headless=true \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \

    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat
    return $RETVAL
}


stop() {
    echo -n "Stopping tomcat: "
    PID=`cat /var/run/jsvc.pid`
    kill $PID
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/tomcat /var/run/tomcat.pid
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        # Ugly hack
        # We should really make sure tomcat
        # is stopped before leaving stop
        sleep 5
        start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac


exit $RETVAL



Start and Stop

To start tomcat, use (on redhat)

service tomcat start


To stop

service tomcat stop


from http://waelchatila.com/2005/12/13/1134504717808.html


commons의 daemon을 이용해서 일반유저로 톰캣을 80포트로 올리는 법입니다

이전에 jsvc가 이미 make 되어 있어야 합니다

Posted by 1010