2012-10-23

이클립스에서 톰캣 연결할때 UTFDataFormatException 오류



이클립스에서 톰캣 연결할때

Catalina.start: java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
 at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
 at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
 at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
 at org.apache.xerces.impl.XMLEntityScanner.scanLiteral(Unknown Source)
 at org.apache.xerces.impl.XMLScanner.scanAttributeValue(Unknown Source)
 at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanAttribute(Unknown Source)
 at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
 at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
 at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
 at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
 at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
 at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
 at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
 at org.apache.commons.digester.Digester.parse(Digester.java:1543)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:449)
 at org.apache.catalina.startup.Catalina.execute(Catalina.java:400)
 at org.apache.catalina.startup.Catalina.process(Catalina.java:180)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:324)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:203)

이런에러가 계속 발생합니다... 어떻게 해야하나여...?
플러그인은 추가시킨 상태에요..


===========================================================================================
server.xml에 한글문자가 주석이든 모든 들어가면 뜨는 에러입니다.
server.xml에 보시면 문자 인코딩이 iso8859-1 이라고 되어있는데 한글이 들어가면서 생기는 현상입니다.
한글 부분을 영어로 바꾸시면 해결됩니다. ㅡㅡ;

2012-10-22

Java] Eclipse + autoftp


ftp로 직접 연결해주는 플러그인.
각 프로젝트별로 설정해서 사용하면 된다.

epub관련 자료





epub 관련 자료

http://bany223.blog.me/10103012135
http://code.google.com/p/epubcheck/wiki/Development
http://threepress.org/tools/
ePub Reader & Editor :::   http://kogaeng.tistory.com/327
#summary 관련 프로젝트들

= ePUB 변환 =

  * [http://code.google.com/p/epub-tools/ epub-tools]
        Java로된 Adobe EPUBGen 엔진을 사용하고 있으며,
        frontend engine에는 XSLT 기술을 사용.
  * [https://code.google.com/p/python-epub-builder/ python-epub-builder]
        [http://genshi.edgewall.org/ Genshi] template library 기반으로 한 text to epub 변환기.
        Genshi 자체가 덩치가 있고, 간단한 text만을 대상으로 하여 markup을 넣기가 어려워 수정을 포기.
  * [http://epubsharp.sourceforge.net/ EPUB Sharp]
        .NET/C# 기반

= Markup 언어 =
여러 텍스트용 markup이 존재하고
주로 program document를 간단하게 작성하는 용으로 사용된다.

   * [http://docutils.sourceforge.net/rst.html reStructured Text](RST)
        Python Docutils에서 사용하는 포맷
   * [http://code.google.com/p/support/wiki/WikiSyntax Google Wiki]
        여기 문서 작성하는 포맷

= PDF 변환 =
PDF 생성엔진으로 [http://www.reportlab.com/software/opensource/rl-toolkit/ ReportLab Toolkit]을 대부분 사용하고 있고, 그위에 frontend engine을 올려 변환기들이 나와 있음.

  * [http://code.google.com/p/rst2pdf rst2pdf]
        reStructured Text를 PDF로 변환
  * [http://www.xhtml2pdf.com xhtml2pdf] (aka pisa)
        XHTML을 PDF로 변환

= RSS 언어 =
RSS 처리는 [http://feedparser.org Universal Feed Parser]가 진리.

  * [http://cafe.naver.com/ebook/82965 rss2epub]
        [http://ebookcafe.kr 이북카페] 욱님이 만든 python script.
        Matt's epub.py 라는 간단한 생성기를 사용


= 그외 =

  * [http://calibre-ebook.com Calibre]
         ePUB 툴의 대명사. Python 기반.
  * [http://code.google.com/p/lrf-epub-tools/ LRFtool]
        Sony Reader용 포맷인 LRF를 ePUB으로 변환하는 툴이지만
        그외에도 여러 포맷을 지원
  * [http://code.google.com/p/epubcheck epubcheck]
        ePUB 파일을 검사하는 툴. Java 기반.

Java] java Framework/DataBase별 JDBC 설정



http://blog.paran.com/powerkit/19887881


mssql 2000 jdbc driver download : http://www.microsoft.com/downloads/details.aspx?familyid=99B21B65-E98F-4A61-B811-19912601FDC9&displaylang=ko
mssql 2005 jdbc driver download : http://www.microsoft.com/downloads/details.aspx?FamilyID=e22bc83b-32ff-4474-a44a-22b6ae2c4e17&DisplayLang=ko

2012-10-14

Java] Java 파일 캐싱




출처 : http://www.ezslookingaround.com/blog/tech/?no=1414&category=


출처 : http://tripoverit.blogspot.com/2008/04/java-create-zip-file-in-memory.html



Java - Create Zip file in memory


 

I find myself writing and rewriting this piece of code whenever I want to zip a set of files (in memory) and return the zipped file back as an object in memory. I often use this when the user requests a download of multiple reports and the deployment environment doesn't allow for disk access.

I thought I'd post it here so that I could copy-paste it the next time I need it :) If you've stumbled upon this page, you're free to use the code below too!
  1. privatestaticbyte[] createZip(Map files) throws IOException {  
  2.     ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  3.     ZipOutputStream zipfile = new ZipOutputStream(bos);  
  4.     Iterator i = files.keySet().iterator();  
  5.     String fileName = null;  
  6.     ZipEntry zipentry = null;  
  7.     while (i.hasNext()) {  
  8.         fileName = (String) i.next();  
  9.         zipentry = new ZipEntry(fileName);  
  10.         zipfile.putNextEntry(zipentry);  
  11.         zipfile.write((byte[]) files.get(fileName));  
  12.     }  
  13.     zipfile.close();  
  14.     return bos.toByteArray();  


Java 로 간단한 파일 캐싱을. ^^

출처 : http://ncanis.tistory.com/104

File Caching.
오늘의 2번째 글입니다.~ ^^

간단한 파일캐싱에 대하여 한번 써봤습니다.
별로 팁이란것도 아니지만 심심해서. ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

보통 어떤 flag나 환경설정 정보를 파일에 저장할때가 있습니다.
예를 들어, database url 이나, 로그인 정보, 아니면 구현 클래스 이름 등등.
자주바뀌어야 하는 정보들 말이죠 :)

자주 바뀌어야 하는 정보라면 로더 클래스가 이 환경설정 파일을 읽어 시스템에 적용하는게 보통이죠.
그렇게 하면 파일내의 정보가 바뀌더라도 재 컴파일을 안해도 되는 장점이 있습니다.

근데,
만약 항상 파일내의 데이터를 가져오는 부분에 복잡한 루틴이 걸려있으면 어떨까요.
시스템의 성능은 많이 떨어지게 됩니다.

워, 파일 내용이 바뀌지도 않았는데 계속 파일을 읽어서 확인하다죠 ㅡ.ㅡ;

이럴때는 파일 캐싱을 통해 가져오면 되지요.

평소에는 파일내용을 메모리에 올려놓다가,
파일 내용이 바뀌었다면 다시 로딩해서 메모리에 올려놓으면 됩니다.

ps. 대부분의 개발자분들은 잘하시만, 가끔가다보면 요청함수에, 파일로딩 해서 정보를 분석하는 로직을 그냥 넣어놓는것도 심심찮게 보게 된답니다.~ -0-


아래는 파일 캐싱 예제 소스 입니다.
구현은 간단합니다. 그저 파일이 변경됬는지만 확인하고,
변경이 됐으면 => 다시 로딩해 메모리에 올리고,
변경이 안됐으면 => 기존에 저장해놓은 정보를 리턴하는거죠.~~
package test;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;

public class Caching {
    private long lastModified = 0L;
    private String value = null;
  
    // 키에 대한 value값을 가져온다.
    public String get(String key) throws IOException {
        URL url = this.getClass().getResource("/test/test.properties");
        File file = new File(url.getPath());
        // 파일이 수정되지 않았으면 기존에 로드된 정보를 리턴한다.
        if(file.lastModified()!=this.lastModified) {
            this.lastModified = file.lastModified();
            this.value = load(url,key);
        }
        return value;          
    }
    // test.properties 파일을 읽어 키의 value값을 읽어온다.
    public String load(URL url,String key) throws IOException {
        System.out.println("== 파일로부터 데이터 리로딩 ==");
        Properties p = new Properties();
        p.load(url.openStream());
        return p.getProperty(key);      
    }

    public static void main(String[] args) throws IOException {
        Caching c = new Caching();
        // 첫요청시에만 파일을 읽고, 나머지는 기존 정보를 가져오죠.~
        System.out.println("데이터로딩1 = "+c.get("message"));
        System.out.println("데이터로딩2 = "+c.get("message"));
        System.out.println("데이터로딩3 = "+c.get("message"));

    }

}

소스는 더럽지만 대충 개념은 나왔네용. ㅎㅎ
근데 한가지 주의 할 게 있습니다.
이런 설정정보를 File로 빼는것에 대한 주의점이.~
왜 몇년동안 바뀌지도 정보를 파일로 빼는지,
간단한 정보일 뿐인데 멋있다고(?) xml  로 설정정보를 만들어, 무거운 Parser를 돌리는 것인지. ㅡ.ㅡ;
이런거는 조심해야겠습니다.

무엇이든지 해당 프로젝트와 로직에 맞는 방법을 찾아 적용하는게 가장 중요하겠죠. :)
test.properties 내용.
message=ver_1.01

제우스 웹투비설정


--// webtoB  설정 후 컴파일. webtob 는 설정 작업 변경 후 반드시 컴파일 작업이 필요함.
--// 포트 설정 작업은 http.m 파일에서 수정 후 재컴파일, 웹투비 셧다운, 스타트 하면 됨.
[ECOWEB:tmax]/home/tmax/jeus5/webserver/config>wscfl -i http.m
        Current configuration:
                Number of client handler(HTH) = 1
                Supported maximum user per node = 8123
                Supported maximum user per handler = 8123
CFL is done successfully for node(ECOWEB(ECOWEB))

--// webtob down
[ECOWEB:tmax]/home/tmax/jeus5/webserver/config>wsdown -i

--// webtob startup
[ECOWEB:tmax]/home/tmax/jeus5/webserver/config>wsboot


--// webtob 모니터링 작업 
[ECOWEB:tmax]/home/tmax/jeus5/webserver/config>wsadmin
--- Welcome to WebtoB Admin (Type "quit" to leave) --- 

$$1 ECOWEB (wsadm): si
--------------------------------------------------------------------------------
 hth   svrname (svri)   status     count cqcnt    aqcnt qpcnt emcnt rscnt rbcnt
--------------------------------------------------------------------------------
   0  html       (  0)   RDY           0     0        0     0     0     0     0
   0  MyGroup    (  1)   NRDY          0     0        0     0     0     0     0

Subversion dump/load 방법(버전업 관련)




출처 : http://hanavy.egloos.com/256959



Subversion dump/load 방법(버전업 관련)

Subversion을 계속 1.4 버전대를 쓰다가 1.5 버전이 나온걸 보고 이동하려고 했다.

그런데 개인적으로는 주로 bdb 버전을 쓰고 있는데 일반적으로 공식버전으로 보는 CollabNet의 Binary는 더이상 bdb를 지원하지 않고 fsfs 만을 지원하기로 한 듯 하다.
예전부터 의견들을 살펴보면 bdb 는 DB 오류가 많이 발생하여 점점 쓰는 사람들이 줄어드는 추세인 듯 하기는 한데..
어차피 아직까지 개인적으로 사용하는데 아직까진 별 문제가 없기도 하고 일단은 내가 문제를 겪기 전에는 bdb로 하려고 하니(업로드 하는 파일별로 줄줄히 생성하는게 갠적으로 맘에 안들기도 하여...) CollabNet은 쓸 수가 없었다.
그렇다고 하여 소스를 다 받아서 build 하자니 자바 개발만 주로 하는지라 windows 빌드 하기도 만만치 않을듯 하고..
하던 차에 혹시나 그 밑에 나온 SlikSVN을 보니 bdb를 지원하는 듯 하여 이걸로 받았다.

기존 쓰던 놈들 백업하고 갠적인 취향으로 인스톨을 싫어하는지라 uniExtract로 풀어서 복사한 다음 돌리니 잘 되는 듯 하다가 기존 bdb 소스를 받을 때 svnserve가 죽는 증상이 발생했다.
귀찮아서 dump/load를 안했더니 그 문제인듯 하여 dump/load 방법을 찾아본 후 그 내용을 정리한다.

1. svnserve나 apache 등의 서비스 제공자를 다 종료한다. 덤프중에 누가 접근하면 곤란하겠지..

2. svnadmin dump /path/to/repository > dumpfile.txt 명령으로 dumpfile.txt 파일로 덤프를 받는다.
물론 덤프받는 파일명이야 자기 맘대로 설정.
혹시나 몰라 /path/to/repository라는건 서버상의 실제 경로이다.
예를들어 이번에 나 같은 경우는 svnadmin dump E:/Repository/SVN/ows 라는 경로에 있는 내용을 덤프받았다.

3. 기존 repository 경로를 다른 이름으로 변경한다. 일종의 백업.

4. Subversion을 업그레이드 한다. 충돌할 수도 있으니 기존 내용은 삭제를 하고 완전히 새로 설치하도록 한다.

5. svnadmin 명령으로 새 repository 를 생성한다.
svnadmin create /path/to/repository

6. 역시 svnadmin 명령으로 아까전에 받은 파일을 로드한다.
svnadmin load /path/to/repository < dumpfile.txt

7. 기존 repository에 있는 hook scripts나 기타 등등을 새 repository 로 복사한다.
나도 많이 써보지는 않아서 hook script라는게 뭘 의미하는지 확실히는 모르겠는데 나 같은 경우는 권한 등이 저장되는 conf 폴더를 다시 복사해 놨다.

8. 종료. 다시 서버를 기동하고 제대로 작동하는지 확인한다.