'분류 전체보기'에 해당되는 글 243건

  1. 2010.04.01 :: SVN 커넥터 업데이트
  2. 2010.03.25 :: prove tomcat-users.xml
  3. 2010.03.25 :: java.io.FileNotFoundException SESSIONS.ser 관련
  4. 2010.03.24 :: 양성원의 선행
  5. 2010.03.12 :: 윈도우 서비스 삭제 방법
  6. 2010.02.23 :: DataBase 즐겨찾기
  7. 2010.02.23 :: [Mysql] 실행 계획 보기
  8. 2010.02.12 :: Google의 독립도메인 기반 Gmail 등록.
  9. 2010.01.20 :: java 숫자 인지 아닌지 판별
  10. 2010.01.07 :: 프록시 관련.
  11. 2010.01.05 :: 문자열을 16진수 유니코드로 변경
  12. 2010.01.05 :: jquery select
  13. 2009.11.27 :: jeus session 컨테이너 관련
  14. 2009.11.17 :: encodeURIComponent 로 인코딩 한 후 서버로 전송했을 때 한글이 깨지는 문제. 1
  15. 2009.10.28 :: OSGi 란 무엇인가?
  16. 2009.10.16 :: 공인인증서로 전자서명해보기 java
  17. 2009.10.06 :: java, 자바로 짠 배치 프로그램 ^^
  18. 2009.09.27 :: MySQL 명령어 정리.
  19. 2009.09.25 :: In-Container 방식 Struts Test(ServletTestCase)
  20. 2009.09.24 :: Mysql 5.1.1 커넥터/Java 버젼
  21. 2009.09.21 :: Jeus - License file read error
  22. 2009.09.04 :: You can't specify target table .....
  23. 2009.08.30 :: Subversion 설치 및 Eclipse와의 연동
  24. 2009.08.26 :: 구글 영어 번역
  25. 2009.07.28 :: Imdb.java
  26. 2009.07.24 :: AJAX로 파일 내용 가져오는 예제
  27. 2009.07.24 :: AJAX로 다른 도메인 데이터 가져오기
  28. 2009.07.24 :: 자바스크립트 - 엔터 눌러도 submit 하지 않게 하기
  29. 2009.07.22 :: HTTPclient의 사용
  30. 2009.07.22 :: 정규표현식으로 email 형식을 체크하는 자바스크립트
TOOL/Eclipse 2010. 4. 1. 15:08

svn 설치하고 아래 주소에서 커넥터 업데이트

http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/



SVN: '0x00400006: Validate Repository Location' operation finished with error: Selected SVN connector library is not available or cannot be loaded.
If you selected native JavaHL connector, please check if binaries are available or install and select pure Java Subversion connector from the plug-in connectors update site.
If connectors already installed then you can change the selected one at: Window->Preferences->Team->SVN->SVN Connector.
Selected SVN connector library is not available or cannot be loaded.
If you selected native JavaHL connector, please check if binaries are available or install and select pure Java Subversion connector from the plug-in connectors update site.
If connectors already installed then you can change the selected one at: Window->Preferences->Team->SVN->SVN Connector.

posted by 나는너의힘
:
WAS/TOMCAT 2010. 3. 25. 16:00

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
 <role rolename="poweruser" />
 <role rolename="probeuser" />
 <role rolename="manager" />
 <role rolename="poweruserplus" />
 <user username="admin" password="11" roles="manager,admin,poweruser,poweruserplus,probeuser" />
</tomcat-users>
posted by 나는너의힘
:
WAS/TOMCAT 2010. 3. 25. 12:01

출처 : http://cafe.naver.com/ArticleRead.nhn?articleid=32106&sc=e0d432120c41299d0b&query=Exception+unloading+sessions+to+persistent+storage&clubid=10153147#content-area


SEVERE: Exception unloading sessions to persistent storage
java.io.FileNotFoundException: apache-tomcat-6.0.18/work/Catalina/localhost/axis2/SESSIONS.ser (No such file or directory)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
        at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:489)
        at org.apache.catalina.session.StandardManager.unload(StandardManager.java:463)
        at org.apache.catalina.session.StandardManager.stop(StandardManager.java:667)
        at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4519)
        at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:924)
        at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:1191)
        at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1162)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:313)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1086)
        at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1098)
        at org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:448)
        at org.apache.catalina.core.StandardService.stop(StandardService.java:584)
        at org.apache.catalina.core.StandardServer.stop(StandardServer.java:744)
        at org.apache.catalina.startup.Catalina.stop(Catalina.java:628)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:603)
        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:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)



처리 방안 :

일단 axis2관련된 디렉토리를 다 찾아봤는데요
context.xml파일은 없었습니다.
그래서 %catalina_home%\conf 디렉토리에 있는 context.xml에서 pathname을 찾아서 올렸습니다.
그런데 conf 밑에 context.xml파일은 webapps에 있는 모든 application에 적용되는건가요?? ^^;;


<!-- The contents of this file will be loaded for each web application -->
<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->

</Context>
posted by 나는너의힘
:
카테고리 없음 2010. 3. 24. 11:50

posted by 나는너의힘
:
MS/Windows 2010. 3. 12. 00:21
시작 - 실행- CMD 창에서

서비스 정지 
net stop 정지 할 서비스명(예 : OracleJobSchedulerORACLE10)

서비스 삭제
sc delete 삭제 할 서비스명(예 : OracleJobSchedulerORACLE10)


posted by 나는너의힘
:
카테고리 없음 2010. 2. 23. 19:18

http://www.databaser.net/

http://database.sarang.net/

http://www.sqlworld.pe.kr/
posted by 나는너의힘
:
DATABASE/MYSQL 2010. 2. 23. 19:01

[Mysql] 실행 계획 보기

사용은 아래처럼 합니다.
   
EXPLAIN tbl_name  OR  EXPLAIN SELECT select_options

tbl_name은 테이블의 구조를 나타냅니다.



EXPLAIN SELECT select_options

EXPLAIN SELECT select_options 은 SQL의 실행계획을 표시합니다.
결과에 나오는 항목으로는
table : 테이블 명
type : 조인의 타입
    - system : 테이블이 하나의 레코드만 가지는 경우
    - const : 테이블에 조건을 만족하는 레코드가 하나일 때, 상수 취급
    - eq_ref : 인덱스가 UNIQUE이거나 PRIMARY KEY인 경우의 조인으로 const를 제외한 조인 중 가장 좋은 형태
    - ref : eq_ref와 다른 점은 UNIQUE가 아닐 경우 사용한다는 것.
    - range : 조건에 레코드의 범위가 주어진 조인.
    - index : all 형태와 비슷하며, 인덱스를 사용한다.
    - all : 모든 레코드를 스캔한다.
possible_keys : 테이블에서 사용 할 수 있는 키(인덱스)
key : possible_keys에 나온 키 중에서 실제로 사용한 키
key_len : 키의 길이
ref : 인덱스를 사용할 때 어떤 컬럼과 조건이 맞아야 하는지
rows : 조건을 만족하는 레코드를 찾기 위해 몇개의 레코드를 검사해야 하는지
Extra : 부가적인 정보
    - distinct : 조건을 만족하는 레코드를 찾았을 때 같은 조건을 만족하는 또 다른 레코드가 있는지 검사하지 않음.
    - not exist : left join 조건을 만족하는 하나의 레코드를 찾았을 때 다른 레코드의 조합은 더 이상 검사하지 않는다.
    - range checked for each record : 최적의 인덱스가 없는 차선의 인덱스를 사용한다는 의미.
    - using filesort : mysql이 정렬을 빠르게 하기 위해 부가적인 일을 한다.
    - unsing index : select 할때 인덱스 파일만 사용
    - using temporary : 임시 테이블을 사용한다. order by 나 group by 할때 주로 사용
    - where used : 조건을 사용한다는 의미.

posted by 나는너의힘
:
카테고리 없음 2010. 2. 12. 17:08
MX 서버 주소 우선 순위
ASPMX.L.GOOGLE.COM. 1
ALT1.ASPMX.L.GOOGLE.COM. 5
ALT2.ASPMX.L.GOOGLE.COM. 5
ASPMX2.GOOGLEMAIL.COM. 10
ASPMX3.GOOGLEMAIL.COM. 10
ASPMX4.GOOGLEMAIL.COM. 10
ASPMX5.GOOGLEMAIL.COM. 10

http://www.google.com/apps/intl/en/group/index.html

posted by 나는너의힘
:
JAVA 2010. 1. 20. 15:17

 public static boolean isNumber(String number){
  boolean flag = true;
  if ( number == null  ||    "".equals( number )  )
   return false;

  int size = number.length();
  int st_no= 0;

  if ( number.charAt(0)  ==  45 )//음수인지 아닌지 판별 . 음수면 시작위치를 1부터
   st_no = 1;


  for ( int i = st_no ; i < size ; ++i ){
   if ( !( 48   <=  ((int)number.charAt(i))   && 57>= ( (int)number.charAt(i) )  )  ){
    flag = false;
    break;
   }

  }
  return flag;
 }

posted by 나는너의힘
:
Ajax 2010. 1. 7. 12:41
http://www.parosproxy.org/index.shtml



http://blog.pages.kr/517  보안쪽에서 많이 사용한다함.

http://okjsp.tistory.com/tag/fiddler

피들러 : 통신하는 내용 볼수 있음.프락시 툴 같은 것임.통신하면서 눈에 보이지 않는것까지 모두 다 보면서 개발자들은 디버깅할때 주로 사용.

보안에서도 중간에 값을 변조해서 테스트 하고 자바스크립트로 값을 제어할 경우 자바스크립트로 숫자만 입력되도록 한 경우라면 실제 입력은 숫자뿐 안되겠지만 숫자 입력하고 중간에서 문자로 바꿔치기해서 보내면 받는 쪽에서 검증하지 않으면 통과됨.그런 테스트 할때 쓰이기도 하고 그렇지


왔다 갔다 하는 모든 내용들을 눈으로 보는거고 중간에서 변조도 가능하고 디버깅할때 어디에 문제가 있는지 확인하기도 하고 그렇지
posted by 나는너의힘
:
JAVA 2010. 1. 5. 17:42

출처 : http://www.okjsp.pe.kr

import java.util.StringTokenizer;

public class CommString {
 /*
  * 문자열을 16진수 유니코드로 변경
  */
 public static String StrtoUni(String str) {
  String uni = "";

  for (int i = 0; i < str.length(); i++) {
   char chr = str.charAt(i);
   String hex = Integer.toHexString(chr);
   uni += "\\u" + hex;
  }
  return uni;
 }

 /*
  * 16진수 유니코드를 문자열로 변경
  */
 public static String UnitoStr(String uni) {
  String str = "";
  StringTokenizer str1 = new StringTokenizer(uni, "\\u");

  while (str1.hasMoreTokens()) {
   String str2 = str1.nextToken();
   int i = Integer.parseInt(str2, 16);
   str += (char) i;
  }
  return str;
 }

}

posted by 나는너의힘
:
JS/jQuery 2010. 1. 5. 17:39
&lt;select onchange="functionname(this.options[this.selectedIndex].value)" name='newdataselect' &gt; &lt;/select&gt;
posted by 나는너의힘
:
WAS/Jeus 2009. 11. 27. 20:56

2. 세션이 자꾸 죽는다.

2개의 컨테이너를 하나의 도메인에 context만 다르게 해서 사용했는데

세션이 자꾸 죽는다.

알고보니 쿠키에 저장되는 세션아이디가 같아서 생긴문제 설정에서 jsessionId의 키값을 변경할 수 있다.





+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
JEUS 에서의 JSESSIONID 설정입니다.
WEBMain.xml에 아래 항목을 추가해 주면 된다고 하네요..

        <response-header>
          <session-id-cookie>
          <jsessionid-name>JSESSIONID1</jsessionid-name>
          </session-id-cookie>
        </response-header>



URL : http://www.javaservice.net/~java/bbs/read.cgi?b=jeus&c=r_p&n=1146740519
 
요지는 각 컨테이너 마지막 부분에 
JSESSIONID1, JSESSIONID2, JSESSIONID3, JSESSIONID4~~~~~~~~~
이렇게 넣으면 됨..
posted by 나는너의힘
:
JAVA 2009. 11. 17. 16:30

[출처] encodeURIComponent 로 인코딩 한 후 서버로 전송했을 때 한글이 깨지는 문제.|작성자 희주




encodeURIComponent는 javascript에서 string을 UTF-8로 인코딩해주는 함수이다.

보통 http 로 주소를 전송할 때, 넘겨야 하는 변수 값 중간에 &나 #이 있으면 변수값이 제대로 전달되지 않기 때문에

인코딩을 해줘야 할 필요성이 생기는데, javascript에서 인코딩 하는 방식은 몇가지가 더 있지만,

서버에서 해석이 가능한 인코딩은 encodeURIComponent 함수를 이용하는 방법 뿐이다.

그러나 서버의 기본 문자 인코딩 타입이 UTF-8이라면 아무런 문제 없이 한글이 깨지지 않지만,

그 외의 인코딩 타입이 기본 문자셋이라면 한글이 깨지게 된다. (특히 서버가 MS949로 되어있는 경우-)

왜 깨지는 것일까-? 복원할 방법은 없는 것일까.. 를 고민했다.

문자가 깨지는 상황을 재현하기 위해 테스트 파일을 만들어봤다.

 

public void test() throws UnsupportedEncodingException {

  String a = "건강·의학";
  a = URLEncoder.encode(a, "UTF-8");
  log.info("encode : " + a);  //%EA%B1%B4%EA%B0%95%C2%B7%EC%9D%98%ED%95%99
  
a = URLDecoder.decode(a, "MS949");
  log.info("decode : " + a);  //嫄닿컯쨌?쓽?븰
  a = URLEncoder.encode(a, "MS949");
  log.info("encode : " + a);  //%EA%B1%B4%EA%B0%95%C2%B7%3F%9D%98%3F%95%99
  a = URLDecoder.decode(a, "UTF-8");
  log.info("decode : " + a);  //건강·??????

}

 

처음에 UTF-8로 인코딩 한 상태가 javascript에서 encodeURIComponent함수를 이용하여 인코딩한 결과와 같다.

그리고 서버에서는 MS949로 디코딩을 자동으로 수행하게 된다. (서버의 기본 캐릭터 셋이 MS949일 때)

그래서 결국 "건강·의학"이라는 글자는 "嫄닿컯쨌?쓽?븰" 이라는 알 수 없는 알 수 없는 글자로 깨지게 되고,

이를 다시 복구하기 위해 MS949로 인코딩을 해보았지만,

처음 javascript에서 encodeURIComponent 함수를 이용하여 인코딩 한 결과와 정확히 일치하지 않는다.(위에 빨간글자)

UTF-8로 인코딩한 한글 문자열을 MS949로 디코딩할 때는 이미 캐릭터의 byte값이 알 수 없는 정보로 저장되며,

다시 인코딩을 한다고 해서 원복이 되지 않는 것 같다.

 

해결방법은 아래 3가지이다.

1. UTF-8로 인코딩 하지 않고 그냥 전송한다.

  이 방법은 변수의 값을 온전하게 전송할 수 없기 때문에 문제가 된다.

2. MS949로 인코딩하여 전송한다.

  불행히도 javascript에서는 MS949인코딩을 지원하지 않는다.

  구글링을 해보면 개인적으로 javascript의 인코딩을 지원해주는 유틸들을 만들어서 배포한 걸 볼 수 있는데, 완벽하지 않다. 잘못 쓰면 낭패본다.;; 

  서버에서 MS949로 인코딩하여 내려보내주고, 그 데이터를 활용하면 되지만,

  html에서 script로 동적으로 생성되는 문자열을 인코딩해야 한다면, ajax를 활용해서 서버로부터 MS949변환된 문자열을 가져와야 한다.

  하지만 매번 ajax 호출이 힘든 환경도 있을 것이다..

3. encodeURIComponent 함수를 두번 사용하여 UTF-8로 두번 인코딩 한 후에 서버에서 UTF-8로 한번 더 인코딩을 한다.

  아래 코드를 참고한다.

 

 public void test() throws UnsupportedEncodingException {

  String a = "건강·의학";
  a = URLEncoder.encode(a, "UTF-8");
  a = URLEncoder.encode(a, "UTF-8");
  log.info("encode : " + a); //%25EA%25B1%25B4%25EA%25B0%2595%25C2%25B7%25EC%259D%2598%25ED%2595%2599
  a = URLDecoder.decode(a, "MS949");
  log.info("decode : " + a); //%EA%B1%B4%EA%B0%95%C2%B7%EC%9D%98%ED%95%99
  a = URLDecoder.decode(a, "UTF-8");
  log.info("decode : " + a); //건강·의학

}

 

두번 인코딩을 하기 때문에 변수 명도 길어지고, 받는 쪽에서도 디코딩을 한번은 해야 하기 때문에 그다지 나이스한 방법은 아니지만,

어쨌든 문제 해결은 되고, 코드 복잡도는 적은 편이며, 왜 이런 행위를 했는지만 잘 적어놓으면 된다. -_-;;

위와 같은 꽁수가 통하는 이유는, 영문과 숫자, %로만 이뤄진 문자열을 UTF-8로 인코딩한 문자열은

MS949로 디코딩하나, UTF-8로 디코딩하나 결과는 동일하기 때문이다.

 

인코딩의 세계는 쉽지 않다;;

 

posted by 나는너의힘
:
JAVA 2009. 10. 28. 09:12

출처 : http://blog.daum.net/7dbwnckd/7972610
1. OSGi 란 무엇인가?

- Open Services Gateway initiative

- Dynamic Module System for Java

 

요약하면, OSGi 는 한 개의 번들 또는 여러 개의 번들로 이루어진 애플리케이션 자체를 언제든지 동적으로 프레임워크상에 설치, 실행, 업데이트, 중단, 제거하는 것을 가능하게 하는 매우 유연한 라이프 사이클 모델을 지원하는 프레임워크이다.

 

2. OGSi 의 특징

 바이트코드와 가상머신 기술을 이용하여 코드 호환성을 보장하는 자바 플랫폼 위에서, 각 애플리케이션들이 번들이라 불리는 작고 재사용 가능한 컴포넌드로부터 조립될 수 있도록 도와준다. 번들은 OSGi에서 얘기하는 각각의 컴포넌트 똔느 애플리케이션을 가리키는 단위를 의미한다. OSGi는 JVM 위에서 돌아가는 하나의 프레임워크이며, 사용자가 개발한 프로그램들은 번들 형태로 선언되어 OSGi 내부에서 실행된다.

 

3. OSGi 아키텍쳐

3-1. OSGi 프레임워크

* Secutiry Layer : 자바의 보안 구조에 기반하고 있으며, 패키지나 서비스에 대한 권한을 관리하거나, Digitally Signed JAR 파일에 대한 지우너을 해주는 레이어이다.  꼭 사용하지 않아도 되는 선택가능한 레이어이다.

* Service Layer : 서비스 레지스트리 를 통해 서비스를 등록하고 찾을 수 있도록 지원하는 레이어이다.

* Life Cycle Layer : 번들이 어떻게 동적으로 설치되고 관리될 수 있는지를 정의하는 레이어이다. 번들 내에서 어떻게 외부의 OSGi Context에 접근할 수 있는지를 정의함.

* Module Layer : OSGi의 근간이 되는 번들

* Execution Environment : 번들이 수행될 수 있는 환경(J2SE등)


posted by 나는너의힘
:
JAVA 2009. 10. 16. 13:27
인터넷 뱅킹을 하시는 분이라면 대부분 공인인증서를 가지고 있다. 이 공인인증서를 가지고 전자서명을 해보도록하자(전혀 쓸데없는 일이긴 하다 ^^;)
필자의 경우 yessign에서 발급한 은행용 공인인증서를 가지고 있는데 그 경로는 C:\NPKI\yessign\USER\아래폴더... 에 위치해 있다.
그 디렉토리에 보면 CaPubs, signCert.der, signPri.key 세 파일이 존재한다.
CaPubs은 무슨 파일인지 잘 모르겠다. signCert.der는 공인 인증서 파일이고, signPri.key는 개인키 파일이다.
(der은 인증서 저장시 바이너르 형태로 저장하기 위한 포맷이고, pem은 문자열로 표현가능한 데이터로 인코딩(BASE64같은..)한 포맷이다.)
한국정보보호진흥원(http://www.rootca.or.kr/kcac.html)의 기술규격을 참조해보면, 현재 사용하는 공인인증서는 RFC3280을 준수하여, 전자서명인증체계에서 사용하는 정수2를 갖는 X.509 v3을 사용하고 있다고 한다.

1. 공개키 가져오기.
 - 자바에서 X.590를 지원해주니 간단히 사용해보자.
package test.security;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

public class CertificateTest1 {

	public static void main(String[] args) throws Exception {
		X509Certificate cert = null;
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(new File("C:/signCert.der"));
			CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");
			cert = (X509Certificate) certificateFactory.generateCertificate(fis);
		} finally {
			if (fis != null) try {fis.close();} catch(IOException ie) {}
		}
		System.out.println(cert);
		System.out.println("-----------------");
		System.out.println(cert.getPublicKey());
	}
}

실행해보면 아래처럼 인증서에 대한 정보를 볼 수 있을것이다.(보안 관계상 많은 부분을 생략하겠다.)

[
[
  Version: V3
  Subject: CN=누굴까(RangWoo)0000000000000000, OU=XXX, OU=personalXXX, O=yessign, C=kr
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 1024 bits
... 생략 ...
[7]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
  [accessMethod: 1.3.6.1.5.5.7.48.1
   accessLocation: URIName: http://ocsp.yessign.org:4612]
]
... 생략 ...
Sun RSA public key, 1024 bits
  modulus: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  public exponent: 00000

당연히, V3 버젼을 사용하고 서명 알고리즘은 SHA1withRSA을 사용한다. SHA1withRSA 옆에 보면 OID란 놈이 있다.
OID란 Object IDentifier의 약어로서 객체식별체계정도로 이해하면 되겠다. 즉, OID의 값이 1.2.840.113549.1.1.5이면 SHA1withRSA란 의미이다.
http://www.oid-info.com/ 사이트에 가서 1.2.840.113549.1.1.5 값을 입력하면 아래와 같은 값을 얻을 수 있다.

그리고 중간쯤에 ocsp(Online Certificate Status Protocol)라고 실시간으로 인증서 유효성 검증을 할수 있는 정보도 나온다.
좀더 내려가보면 공개키부분이 나오는데, 이놈이 우리가 사용할 부분이다. cert.getPublicKey() 메소드를 이용하면 직접 공개키를 가져올 수 있다.

2. 개인키 가져오기
 - 공개키는 거의 날로 먹었는데, 개인키란 놈은 만만하지가 않다.
 - 기본적으로(?)는 PKCS#8를 이용해서 개인키를 저장하는데, 국내 공인인증서에 사용하는 개인키 파일는 암호화(?)해서 저장한다.
PKCS#5(Password-Based Cryptography Standard)의 PBKDF1(Password-Based Key Derivation Function), PBES1(Password-Based Encryption Scheme)를 이용한다는 것이다.
여기까지는 별 문제가 없는데, 데이터 암호화를 할때 국내에서만 사용하는 SEED란 블럭암호화 알고리즘를 사용한다는것이다.
즉, 기본적으로 제공이 안되므로 직접 구현을 해야한다.
뭔소리인지 이해가 안가면 한국정보보호진흥원(http://www.rootca.or.kr/)의 암호 알고리즘 규격(KCAC.TS.ENC)를 한번 읽어보자. (사실 읽어봐도 이해가 안가지만... ^^;)
  간단히 설명을 하자면, PBES(Password-Based Encryption Scheme) 즉 패스워드 기반의 키 암호화 기법을 사용하겠다는 것이다. 암호화 할때 필요한게 비밀키이다. 이 키는 해당 알고리즘에 맞는 바이트 배열로 보통 사용을 하는데, 이것을 사람이 쉽게 인식할 수 있는 패스워드로 사용하겠다는것이다.
 뭐 필자처럼 무식하게 "hello123".getBytes(); 를 사용해서 키로 사용할 수 있지만, 모양새가 안좋아보인다는것이다. 그래서 "hello123" 문자열을 가공해서 멋진(?) 키로 만들어 사용한다는 것이다.
이 가공하는 함수가 PBKDF(Password-Based Key Derivation Function)이다. 그리고 이 함수를 이용해서 비밀키를 생성해서 암호화/복화하는 하는 구조를 PBES라고 한다.
자바에서 기본적으로 "PBEWithMD5AndDES", "PBEWithSHA1AndDESede" 등의 알고리즘을 제공해준다.
Security.getProviders(); 메소드를 이용해서, Provider 정보를 출력해보면 지원하는 알고리즘을 알 수 있다.
package test.security;

import java.security.Provider;
import java.security.Security;

public class ProviderInfo {

	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 (Object key : providers[i].keySet()) {
				System.out.println(key + "\t"+ providers[i].getProperty((String)key));
			}
		}
	}
}

그런데 불행히도 "PBEWithSHA1AndSeed"같은 알고리즘은 없는거 같다. 어떻게 해야할까? 당연히 삽~을 들어야한다.(아~~ 또 무덤을 파는구나 ㅠㅠ)
일단 파일의 구조를 파악해서 필요한 정보를 읽어와야한다.(ASN. 1으로 인코딩되어있다.)
다행히도 PKCS#8로 정의하고 있는 구조를 읽을 수 있는 EncryptedPrivateKeyInfo 클래스가 존재해서 한결 쉽게 작업을 할 수 있다
EncryptedPrivateKeyInfo 클래스를 사용해서 정보를 읽어오자. 사용하는 알고리즘을 출력해 보자.
		// 1. 개인키 파일 읽어오기
		byte[] encodedKey = null;
		FileInputStream fis = null;
		ByteArrayOutputStream bos = null;
		try {
			fis = new FileInputStream(new File("C:/signPri.key"));
			bos = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int read = -1;
			while ((read = fis.read(buffer)) != -1) {
				bos.write(buffer, 0, read);
			}
			encodedKey = bos.toByteArray();
		} finally {
			if (bos != null) try {bos.close();} catch(IOException ie) {}
			if (fis != null) try {fis.close();} catch(IOException ie) {}
		}

		System.out.println("EncodedKey : " + ByteUtils.toHexString(encodedKey));
		
		// 2. 개인카 파일 분석하기
		EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = new EncryptedPrivateKeyInfo(encodedKey);
		System.out.println(encryptedPrivateKeyInfo);
		System.out.println(encryptedPrivateKeyInfo.getAlgName());

필자의 경우  "1.2.410.200004.1.15"란 값을 얻을 수 있었다. 나머지 파라메터 정보는 불행히도 제공을 안해줘서 직접 처리해야한다.
"1.2.410.200004.1.15" 어디서 많이 본 형식이다. 그렇다. OID이다. 사이트(http://www.oid-info.com/)가서 조회를 해보자.
"Key Generation with SHA1 and Encryption with SEED CBC mode" 란다.

한국정보보호진흥원(http://www.rootca.or.kr/)의 암호 알고리즘 규격(KCAC.TS.ENC)에서도 해당 OID에 대한 정보를 알 수 있다.

  즉, 두 번째 방법이라는 것인데, DK의 값을 이용해서 해쉬값을 만든다음 그 값을 IV(초기화 벡터)로 사용하라는 것이다.
 여기서 DK란 PBKDF를 사용해서 만든 추출키를 의미한다. 그렇다면 먼저 추출키를 만들어보자.

  위의 설명대로 해당 함수를 구현해보자.
 salt와 iteration count가 필요하다.
 salt는 공인인증서를 발급할때마다 랜덤하게 생성되는것으로, 블특정다수의 사전(Dictionary) 공격을 방지하는 역할을 한다.(21-28바이트 사이의 8바이트를 사용함)
 iteration count는 비밀키 생성을 위해 해쉬함수를 몇번 반복할 것인가를 나타낸다. (31-32바이트 사이의 2바이트를 사용함)
		byte[] salt = new byte[8];
		System.arraycopy(encodedKey, 20, salt, 0, 8);
		System.out.println("salt : " + ByteUtils.toHexString(salt));
		byte[] cBytes = new byte[4];
		System.arraycopy(encodedKey, 30, cBytes, 2, 2);
		int iterationCount = ByteUtils.toInt(cBytes);
		System.out.println("iterationCount : " + ByteUtils.toHexString(cBytes));
		System.out.println("iterationCount : " + iterationCount);

그럼 PBKDF1을 구현해보자. RFC2898(http://www.ietf.org/rfc/rfc2898.txt)을 보면 아래처럼 설명이 나와있다.
5.1 PBKDF1

   PBKDF1 applies a hash function, which shall be MD2 [6], MD5 [19] or
   SHA-1 [18], to derive keys. The length of the derived key is bounded
   by the length of the hash function output, which is 16 octets for MD2
   and MD5 and 20 octets for SHA-1. PBKDF1 is compatible with the key
   derivation process in PKCS #5 v1.5.

   PBKDF1 is recommended only for compatibility with existing
   applications since the keys it produces may not be large enough for
   some applications.

   PBKDF1 (P, S, c, dkLen)

   Options:        Hash       underlying hash function

   Input:          P          password, an octet string
                   S          salt, an eight-octet string
                   c          iteration count, a positive integer
                   dkLen      intended length in octets of derived key,
                              a positive integer, at most 16 for MD2 or
                              MD5 and 20 for SHA-1

   Output:         DK         derived key, a dkLen-octet string

   Steps:

      1. If dkLen > 16 for MD2 and MD5, or dkLen > 20 for SHA-1, output
         "derived key too long" and stop.

      2. Apply the underlying hash function Hash for c iterations to the
         concatenation of the password P and the salt S, then extract
         the first dkLen octets to produce a derived key DK:

                   T_1 = Hash (P || S) ,
                   T_2 = Hash (T_1) ,
                   ...
                   T_c = Hash (T_{c-1}) ,
                   DK = Tc<0..dkLen-1>

      3. Output the derived key DK.
  설명대로 구현해주자. 피곤한 관계상 SHA1을 사용해서 20바이트의 추출키만을 반환하도록 만들었다.
	public static byte[] pbkdf1(String password, byte[] salt, int iterationCount) throws NoSuchAlgorithmException {
		byte[] dk = new byte[20];
		MessageDigest md = MessageDigest.getInstance("SHA1");
		md.update(password.getBytes());
		md.update(salt);
		dk = md.digest();
		for (int i = 1; i < iterationCount; i++) {
			dk = md.digest(dk);
		}
		return dk;
	}
}

해당 함수를 사용해서 추출키(DK) 초기화 벡터(IV)를 만들어 보자.
		String password = "password";

		// 추출키(DK) 생성
		byte[] dk = pbkdf1(password, salt, iterationCount);
		System.out.println("dk : " + ByteUtils.toHexString(dk));
		
		// 생성된 추출키(DK)에서 처음 16바이트를 암호화 키(K)로 정의한다.
		byte[] keyData = new byte[16];
		System.arraycopy(dk, 0, keyData, 0, 16);
		
	    // 추출키(DK)에서 암호화 키(K)를 제외한 나머지 4바이트를 SHA-1
	    // 으로 해쉬하여 20바이트의 값(DIV)을 생성하고,  그 중 처음 16바이트를 초기 
	    // 벡터(IV)로 정의한다.
		byte[] div = new byte[20];
		byte[] tmp4Bytes = new byte[4];
		System.arraycopy(dk, 16, tmp4Bytes, 0, 4);
		div = SHA1Utils.getHash(tmp4Bytes);
		System.out.println("div : " + ByteUtils.toHexString(div));
		byte[] iv = new byte[16];
		System.arraycopy(div, 0, iv, 0, 16);
		System.out.println("iv : " + ByteUtils.toHexString(iv));

당연히 password 변수에는 공인인증서 암호를 입력해야한다. 안그러면 에러가 난다.
이제 고지가 눈앞에 보인다. 남은것은 SEED를 이용해서 복화만 하면 되는것이다. SEED 구현 + CBC 운용모드 구현을 직접하려면 정신적인 데미지가 커질 수 있으므로, 만들어놓은것을 가져다 쓰겠다.
Bouncy Castle Crypto APIs(http://www.bouncycastle.org/)를 감사하는 마음으로 가져다 쓰자.
%JAVA_HOME%/jre/lib/ext에 해당 jar파일을 복사한 다음, %JAVA_HOME%/jre/lib/security/java.security 파일에
security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider
을 추가해서 사용할 수 있지만, 귀찮은 관계로 그냥(?) 사용하겠다.
		// 3. SEED로 복호화하기
		BouncyCastleProvider provider = new BouncyCastleProvider();
		Cipher cipher = Cipher.getInstance("SEED/CBC/PKCS5Padding", provider);
		Key key = new SecretKeySpec(keyData, "SEED");
		cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
		byte[] output = cipher.doFinal(encryptedPrivateKeyInfo.getEncryptedData());

이젠 해당 데이터로 개인키를 생성만 해주면 된다.
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(output);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey)keyFactory.generatePrivate(keySpec);
		System.out.println(privateKey);
 패스워드를 일치여부는 PBES에서 정의한 패딩이 존재하는지 여부로 판단한다. 만약 잘못된 패스워드라면
Exception in thread "main" javax.crypto.BadPaddingException: pad block corrupted
같은 에러가 발생할것이다.


그럼 마지막으로 공인인증서의 공개키와 개인키를 가지고 어제 해본 전자서명을 한번 해보자.
package test.security;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.spec.PKCS8EncodedKeySpec;

import javax.crypto.Cipher;
import javax.crypto.EncryptedPrivateKeyInfo;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import kr.kangwoo.util.ByteUtils;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import com.jarusoft.util.security.SHA1Utils;

public class CertificateTest {
	
	public static void main(String[] args) throws Exception {
		String msg = "하늘에는 달이 없고, 땅에는 바람이 없습니다.\n사람들은 소리가 없고, 나는 마음이 없습니다.\n\n우주는 죽음인가요.\n인생은 잠인가요.";
		PublicKey publicKey = getPublicKey("C:/signCert.der");
		PrivateKey privateKey = getPrivateKey("C:/signPri.key");

		// 전자서명하기
		Signature signatureA = Signature.getInstance("SHA1withRSA");
		signatureA.initSign(privateKey);
		signatureA.update(msg.getBytes());
		byte[] sign = signatureA.sign();
		System.out.println("signature : " + ByteUtils.toHexString(sign));
		
		// 전사서명 검증하기
		String msgB = msg;
		Signature signatureB = Signature.getInstance("SHA1withRSA");
		signatureB.initVerify(publicKey);
		signatureB.update(msgB.getBytes());
		boolean verifty = signatureB.verify(sign);
		System.out.println("검증 결과 : " + verifty);
	}
	
	public static PublicKey getPublicKey(String file) throws Exception {
		X509Certificate cert = null;
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(new File(file));
			CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");
			cert = (X509Certificate) certificateFactory.generateCertificate(fis);
		} finally {
			if (fis != null) try {fis.close();} catch(IOException ie) {}
		}
		System.out.println(cert.getPublicKey());
		return cert.getPublicKey();
	}

	public static PrivateKey getPrivateKey(String file) throws Exception {
		// 1. 개인키 파일 읽어오기
		byte[] encodedKey = null;
		FileInputStream fis = null;
		ByteArrayOutputStream bos = null;
		try {
			fis = new FileInputStream(new File(file));
			bos = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int read = -1;
			while ((read = fis.read(buffer)) != -1) {
				bos.write(buffer, 0, read);
			}
			encodedKey = bos.toByteArray();
		} finally {
			if (bos != null) try {bos.close();} catch(IOException ie) {}
			if (fis != null) try {fis.close();} catch(IOException ie) {}
		}

		System.out.println("EncodedKey : " + ByteUtils.toHexString(encodedKey));
		
		// 2. 개인카 파일 분석하기
		EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = new EncryptedPrivateKeyInfo(encodedKey);
		System.out.println(encryptedPrivateKeyInfo);
		System.out.println(encryptedPrivateKeyInfo.getAlgName());
		
		byte[] salt = new byte[8];
		System.arraycopy(encodedKey, 20, salt, 0, 8);
		System.out.println("salt : " + ByteUtils.toHexString(salt));
		byte[] cBytes = new byte[4];
		System.arraycopy(encodedKey, 30, cBytes, 2, 2);
		int iterationCount = ByteUtils.toInt(cBytes);
		System.out.println("iterationCount : " + ByteUtils.toHexString(cBytes));
		System.out.println("iterationCount : " + iterationCount);

		
		String password = "password";

		// 추출키(DK) 생성
		byte[] dk = pbkdf1(password, salt, iterationCount);
		System.out.println("dk : " + ByteUtils.toHexString(dk));
		
		// 생성된 추출키(DK)에서 처음 16바이트를 암호화 키(K)로 정의한다.
		byte[] keyData = new byte[16];
		System.arraycopy(dk, 0, keyData, 0, 16);
		
	    // 추출키(DK)에서 암호화 키(K)를 제외한 나머지 4바이트를 SHA-1
	    // 으로 해쉬하여 20바이트의 값(DIV)을 생성하고,  그 중 처음 16바이트를 초기 
	    // 벡터(IV)로 정의한다.
		byte[] div = new byte[20];
		byte[] tmp4Bytes = new byte[4];
		System.arraycopy(dk, 16, tmp4Bytes, 0, 4);
		div = SHA1Utils.getHash(tmp4Bytes);
		System.out.println("div : " + ByteUtils.toHexString(div));
		byte[] iv = new byte[16];
		System.arraycopy(div, 0, iv, 0, 16);
		System.out.println("iv : " + ByteUtils.toHexString(iv));

		// 3. SEED로 복호화하기
		BouncyCastleProvider provider = new BouncyCastleProvider();
		Cipher cipher = Cipher.getInstance("SEED/CBC/PKCS5Padding", provider);
		Key key = new SecretKeySpec(keyData, "SEED");
		cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
		byte[] output = cipher.doFinal(encryptedPrivateKeyInfo.getEncryptedData());

		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(output);
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey)keyFactory.generatePrivate(keySpec);
		System.out.println(privateKey);
		return privateKey;
		
	}

	public static byte[] pbkdf1(String password, byte[] salt, int iterationCount) throws NoSuchAlgorithmException {
		byte[] dk = new byte[20]; // 생성이 의미가 없지만 한눈에 알아보라고 20바이트로 초기화
		MessageDigest md = MessageDigest.getInstance("SHA1");
		md.update(password.getBytes());
		md.update(salt);
		dk = md.digest();
		for (int i = 1; i < iterationCount; i++) {
			dk = md.digest(dk);
		}
		return dk;
	}
}

ByteUtils.java

SHA1Utils.java

posted by 나는너의힘
:
JAVA 2009. 10. 6. 13:55

#########################################################################################################
# 1. 파일명 : Common.java                   #
# 2. 용   도 : 한국어 웹 싸이트 개발시에 사용되는 JAVA용 배치 유틸리티        #
# 3. 개발자 : (주)이엔아이스튜디오 웹 사업팀 팀장 조동희           #
# 4. 싸이트 : http://blog.naver.com/dongheejo               #
# 5. 최초 개발일 : 2009년 05월 13일                 #
# 6. 최종 수정일 : 2009년 05월 13일                 #
#########################################################################################################

 

/************************************************************************************************
* Common.java : 365일 24시간 동작하면서, 관련 웹하드 업체에 대한 배치 포인트를 실시한다. *
*************************************************************************************************/
// 관련 파일을 인쿨루드 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
 
// 클래스를 정의한다.
public class Common
{
 // 메인메서드 정의
 public static void main(String[] args)
 {
  Common ssb = new Common();
  int i = 0;

  while (true)
  {
   i++;
   try
   {
    Thread.sleep(60000); // 최초 실행시간을 기점으로 60초 단위로 시간을 찍는다.

    //포맷을 지정해서 날짜 구하기                                 
    SimpleDateFormat formatter =                                  
      new SimpleDateFormat("yyyy.MM.dd HH:mm:ss EEE",Locale.ENGLISH);
    Date currentTime = new Date();                                
    String dTime = formatter.format(currentTime);                 

    System.out.println(dTime);
    //System.out.println(dTime.indexOf(" 00:00"));

    /********************************************************
    * 일배치를 실행시킬 시간  (월요일 ~ 토요일 11:59) *
    *********************************************************/
    if(dTime.indexOf(" 23:59") != -1 && dTime.indexOf(" Sun")== -1)
    {
     System.out.println("Step-1. www.kiniwini.com Connect Resquest. : 명령어.");
     ssb.callBatch("명령어");
    }

    /********************************************************
    * 일배치를 실행 및 초기화할 시간  (일요일 11:59)  *
    *********************************************************/
    if(dTime.indexOf(" 23:59") != -1 && dTime.indexOf(" Sun")!= -1)
    {
     System.out.println("Step-1. www.kiniwini.com Connect Resquest. : 명령어.");
     ssb.callBatch("명령어");

     System.out.println("Step-1. www.kiniwini.com Connect Resquest. : 명령어.");
     ssb.callBatch("명령어");
    }

   }
   catch (Exception e)
   {
    e.printStackTrace();
   }
  }
 }

 // 배치 함수 정의
 public void callBatch(String CMD_COMMON)
 {
  // 속성 정의
  URL url;// URL 주소 객체
  URLConnection connection;// URL접속을 가지는 객체
  InputStream is;// URL접속에서 내용을 읽기위한 Stream
  InputStreamReader isr;
  BufferedReader br;
  String cmd_common = CMD_COMMON;
  
  try
  {
   // URL객체를 생성하고 해당 URL로 접속한다..
   url = new URL("접속주소);
   connection = url.openConnection();

   // 내용을 읽어오기위한 InputStream객체를 생성한다..
   is = connection.getInputStream();
   isr = new InputStreamReader(is);
   br = new BufferedReader(isr);

   // 내용을 읽어서 화면에 출력한다..
   String buf = null;

   while (true)
   {
    buf = br.readLine();
    if (buf == null) break;
    System.out.println("Step-2. www.kiniwini.com Connect Response. : " + buf);
   }
  }
  catch (MalformedURLException mue) 
  {
   System.err
    .println("잘못되 URL입니다. 사용법 : java URLConn http://hostname/path]");
   System.exit(1);
  }
  catch (IOException ioe)
  {
   System.err.println("IOException " + ioe);
   ioe.printStackTrace();
   System.exit(1);
  }
  }
}


posted by 나는너의힘
:
DATABASE/MYSQL 2009. 9. 27. 19:50
출처 : http://blog.naver.com/myrilke/150019611211



이 메뉴얼은 http://www.mysqlkorea.co.kr/sub.html?mcode=develop&scode=01&lang=k 의 한글메뉴얼 중 겨우 3장을 정리한 내용입니다. 버전은 5.0 기준이므로 이보다 낮은 버전의 MySQL에서는 몇 가지 기능이 실행되지 않습니다. 좀 더 자세히 SQL문에 대해 알고 싶으시다면 한글 메뉴얼의 13장을 보세요. 레퍼런스 북처럼 되어 있습니다.

참고하세요.

 

mysql 실행시

-h: MYSQL서버의 IP또는 호스트명

-u: 유저명

-p: 패스워드

-D: 데이터베이스명

ex) mysql -h localhost -u root -p

// localhost에 root라는 유저명의 유저가 접속, -p를 쓰면 패스워드를 묻는 절차가 실행됨

// 귀찮다면 만약 패스워드가 myrilke라면 -pmyrilke로 쓰면 바로 접속 가능

// 만약 떨어져 있을 시에는 myrilke라는 데이터베이스로 오판함

 

1.mysql에는 쿼리를 넣을 때 대소문자 구분을 하지 않습니다. 쿼리 입력시 제일 마지막에는 ;(세미콜론)을 입력하는 것도 잊지 말아야 합니다.

 

2.입력을 하다 이 명령어를 실행시키고 싶지 않으면 \c로 취소하면 '삐'하는 경고음없이 취소할 수 있습니다. 가끔 \c로 못 마칠 때가 있는데 이는 문장구조가 여전히 대기 상태이기 때문입니다. 그럴 때엔 필요로 하는 문자(아래 Prompt형태에서 1)을 제외한 모든 경우)을 입력 후 \c를 입력해야 합니다. ex) '\c, "\c...

 

3.Prompt 형태
1) mysql> 새로운 명령어를 위한 준비
2) -> 다중 라인 명령어의 다음 라인 대기 상태
3) '> '로 시작된 문장의 완결을 위한 다음 문장 대기
4) "> "로 시작된 문장의 완결을 위한 다음 문장 대기
5) `> `로 시작된 식별자의 완결을 위한 다음 문장 대기
6)/*> /*로 시작된 주석문의 완결을 위한 다음 문장 대기

 

4. 단순 Query입력
1) select version(), current_date; (버전정보및 오늘 날짜 확인)
2) select sin(pi()/4), (4+1)*5; (파이를 4로 나눈 값의 sin값과 (4+1)*5값이 출력)

 

5. 데이터베이스 생성 및 사용
1) show databases;

//현재 서버의 데이터 베이스들 출력

 

2) use test

//Database changed라는 출력과 함께 test라는 데이터 베이스에 접속,

//이 때에는 세미콜론 사용을 안 한다.

//또한 단일라인에서만 사용가능하므로 한 줄에 다 입력해야 함.

3) grant all on test.* to 'myrilke'@'localhost';

//myrilke라는 이름의 등록된 사용자가 localhost라는 호스트 이름으로

//test라는 데이터베이스에 사용자 권한을 요청

4) create database test;

//test라는 데이터베이스 생성

 

5) show tables;

//현 데이터베이스 내의 테이블들을 출력

 

6) create table pet(name varchar(20), owner varchar(20),
species varchar(20), sex char(1), birth date, death date);

//name, owner, species, sex, birth, death의 정보를 가질 table을 생성,

//가독성을 높이기 위해 2줄에 걸쳐 타입

7) describe pet;

//pet이라는 테이블이 가지는 정보에 대해 검사, 이 때 필드 이름, 데이터 타입,

//NULL의 여부, Key의 여부, DEFAULT의 여부, 기타 에 관한 정보가 출력된다

 

8) load data local infile
'C:/mysql/pet.txt' into table pet;

//C:\mysql\에 있는 pet.txt 내에 있는 정보를 pet이란 테이블에 불러와서 입력한다.

//텍스트 파일로 데이터 입력시 각각의 필드는 tab이나 띄어쓰기로 구분하도록 디폴트

//텍스트 파일 입력 중 누락된 값들은 NULL값으로 자동처리된다.

//주의할 점은 mysql에서 위치입력시 Dos처럼 \를 쓰는 것이 아니라 /를 사용한다

9) load data local infile
'C:/mysql/pet.txt' into table pet
lines terminated by '\r\n';

//\r\n을 라인 터미네이터로 사용한다

 

10) insert into pet
values('Puffball','Diane','hamster','f',1993-03-30',NULL);

//pet이란 테이블에 값을 입력, 이 때는 NULL을 써줘서 누락된 값을 표시한다.

 

11) select * from pet;

//pet테이블에 있는 모든 정보 출력

 

12) delete from pet;

//pet테이블에 있는 모든 정보 삭제, 이 명령어는 텍스트 파일의 자료 중 잘못된 값이 많을 때

//텍스트 파일의 정보 수정 후 다시 입력하려고 할 때 필요하다. 만약 정보 수정 후 바로 load

//data를 해주게 되면 정보가 중복입력이 되기 때문이다.

 

13) update pet set birth = '1989-08-31' where name = 'Bowser';

//pet 테이블에서 name이 Bowser인 줄의 birth를 1989-08-31로 수정한다,

//update A set B=C where D set E의 형태로 작성하면

//A테이블의 D필드의 값이 E인 줄에서 B필드의 값을 C로 수정한다.

14) select *from pet where name = 'Bowser';

//pet 테이블에서 name이 Bowser인 줄을 모두 출력한다.

 

15) select *from pet where birth >= '1998-1-1';

//pet 테이블에서 birth가 1998-1-1 이후인 줄을 출력한다.

//만약 비교연산자 사용시 문자를 사용하면 ASCII코드 값을 비교한다.

//예를 들어 select *from pet where name >='S';를 타입하면

//'T~Z'까지의 문자로 시작되는 이름을 가진 줄들이 출력된다.

16) select *from pet where species = 'snake' or species = 'bird';

//pet 테이블에서 species가 snake이거나 species가 bird인 줄을 출력한다.

//or 뿐만 아니라 and도 사용된다.

//예를 들어 select *from pet where species ='cat' and owner = 'Gwen';

//을 타입하면 pet 테이블의 species가 cat이고 owner가 Gwen인 줄이 출력된다.

 

17) select *from pet where (species='cat' and sex='m')
or (species='dog' and sex='f');

//pet 테이블에서 species가 cat이고 sex가 m인 줄이거나 species가 dog이고 sex가 f인 줄은

//모두 출력한다.

//괄호를 쓰는 까닭은 and와 or 중 우선순위가 and가 더 높기 때문에

//혼용할 수 있으므로 방지차원에 쓴다.

 

18) select name, birth from pet;

//pet테이블에서 name과 birth필드값들을 모두 출력한다.

//이는 특정 행을 선택하여 출력하는 것과 같다.

 

19) select distinct owner from pet;

//pet테이블에서 같은 이름의 owner는 한 번만 출력하도록 owner필드값들을 모두 출력한다.

 

20) select name, species, birth from pet
where species='dog' or species='cat';

//pet테이블에서 species가 dog이거나 cat인 줄의 name, species,birth를 출력한다.

 

21) select name, birth,

(year(curdate())-year(birth) - (right(curdate(),5)<right(birth,5))

as age

from pet;

 

//pet 테이블에서 name과 birth 그리고 age를 출력한다.

//age는 오늘 날짜(curdate()는 오늘 날짜를 불러오는 MySQL지원 메소드) 중 연도에서

//생일의 연도를 뺀 다음에

//right(curdate(),5)는 curdate() 중 오른쪽 5자리 (몇월-몇일)를 추려내서 birth의 월일과

//비교했을 때 작으면 1, 크거나 같으면 0이란 값을 출력하게 된다.

//(비교연산자 식이 true면 1, false면 0을 리턴한다)

//그래서 나온 값을 빼주면 나이가 된다.(조금만 생각해보시면 이 식이 이해가 갈껍니다.;;)

 

22) select * from pet where name like 'b%';

// pet테이블에서 name이 b로 시작되는 줄을 찾는다.

// '_'을 사용하면 단일문자 매칭

// '%'를 사용하면 문자의 부정 숫자를 매칭

// SQL 패턴 사용시 논리연산자 사용불가

// 대신 like 또는 not like를 사용할 수 있다.

 

23) select * from pet where name like '%fy';

// pet테이블에서 name이 fy로 끝나는 줄을 찾는다.

 

24) select * from pet where name like '%w%';

// pet테이블에서 name이 이름 내에 w를 포함하고 있는 줄을 찾는다.

 

25) select * from pet where name like '_____';

// pet테이블에서 5개의 문자로 name이 되어있는 줄을 찾는다.

// _의 갯수만큼의 문자검색을 할 수가 있다.

 

26) select * from pet where name  regexp '^b';

// pet테이블에서 name이 b로 시작하는 줄을 찾는다.

// regexp는 테스트가 되는 값이 있는 모든 곳에서 매칭

// like는 전체값에서만 패턴매치를 진행

 

27) select * from pet where name regexp 'fy$';

// pet테이블에서 name이 fy로 끝나는 줄을 찾는다.

 

28) select * from pet where naem regexp 'w';

// pet테이블에서 name이 중간에 w를 가지고 있는 줄을 찾는다.

 

29) select * from pet where regexp '^.....$';

// pet테이블에서 name이 5문자인 줄을 찾는다.

// regexp에서는 .을 단일문자로 취급한다.

 

30) select * from pet where name regexp '^.{5}$';

// pet테이블에서 name이 5문자인 줄을 찾는다.

// {n}은 repeat - n - times 연산자이다.

 

31) select count(*) from pet;

// pet테이블에 몇 개의 줄이 있는지 찾는다.

 

32) select owner, count(*) from pet group by owner;

// pet테이블에서 owner의 이름에 따른 줄이 몇 개가 있는지 그룹화한 결과를 출력한다.

// group by n은 n이란 속성에 따라 그룹화한다.

// 만약 select 후 n만 사용하고 뒤에 group by n을 붙이지 않으면 에러가 발생한다.

// ex) select owner, count(*) from pet; <- ERROR 1140

 

33) select species, sex, count(*) from pet group by species, sex;

// pet테이블에서 species와 sex의 조합에 따른 줄이 몇 개가 있는지 그룹화한 결과를 출력한다.

 

34) select species, sex, count(*) from pet

where species = 'dog' or species = 'cat'

group by species, sex;

// pet 테이블에서 species 이름이 dog 나 cat인 줄들을 species와 sex의 조합으로 그룹화하여 결과를 출력한다.

 

35) select species, sex, count(*) from pet

where sex is not null

group by species, sex;

// pet테이블에서 sex가 null이 아닌 줄들을 species와 sex의 조합으로 그룹화하여 결과를 출력한다.

 

36) select pet.name,

(year(date)-year(birth)) as age,

remark from pet, event

where pet.name = event.name and event.type='litter';

// pet테이블의 name과

// 오늘 날짜(date) 중 년도에서 birth의 년도를 뺀 것을 age로 한 것과

// remark를

// pet과 event 테이블에서

// pet테이블의 name이 event테이블의 name과 같고

// event테이블의 type이 litter인 줄을 출력한다.

// 만약 name이나 type처럼 두 테이블에 동시에 있는 field같은 경우

// (테이블명).(필드명)을 사용한다.

// 사용 안 할시 ambigugous 에러 발생

// ex) pet.name, event.type

 

37) select p1.name, p1.sex, p2.name, p2.sex, p1.species

from pet as p1, pet as p2

where p1.species=p2.species and p1.sex='f' and p2.sex = 'm';

// pet테이블 과 pet테이블, 즉 같은 2개의 테이블에서

// pet테이블에서 species값은 같지만

// sex에서 값이 'f'와 'm'으로 다른

// 줄의 name, sex를 각각 출력하고 species도 출력한다.

// 이 때 두 species는 같으므로 한 테이블의 species만 출력

 

38) select name,birth from pet order by birth;

// pet테이블에서 birth를 기준으로 오름차순으로 정렬된 name과 birth 출력

 

39) select name,birth from pet order by binary name;

// pet테이블에서 name을 기준으로 대소문자 구별하여 오름차순으로 정렬된 name과 birth 출력

// binary를 사용하면 ASCII코드 값의 크기에 따라 정렬

 

40) select name, birth from pet order by birth desc;

// pet 테이블에서 birth를 기준으로 내림차순으로 정렬된 name과 birth를 출력한다

// 마지막에 desc입력시 내림차순 정렬

// desc는 바로 앞에 있는 birth에만 영향을 미친다.

// 하나의 컬럼 이상의 컬럼에 영향을 주고 싶을 땐 계속 써넣어줘야 한다.

 

41) select name, species, birth from pet

order by species,birth desc;

// pet테이블에서 species와 birth 내림차순으로 기준을 한 name,species,birth를 출력한다.

// 먼저 species기준으로 정렬후 birth 내림차순을 기준으로 삼아 정렬한다.

 

42) show index from pet;

// pet테이블에 있는 인덱스들을 보여준다.

 

43) !!이 구문은 윈도우 프롬프트 창에서 쓰는 명령어다!!

C:\> mysql -e "source c:/mysql/src.txt"

// mysql을 사용하여 c:\mysql\src.txt란 스크립트를 실행시킨다

// 만약 엑세스 문제가 발생한다면

// mysql -h localhost -u root -pmyrilke -e "source c:/mysql/src.txt"

// localhost에서 사용자 이름이 root이고 비밀번호가 myrilke인 계정으로 mysql에 접속하여

// c:\mysql\src.txt란 스크립트를 실행시킨다

 

44) source c:\mysql\src.txt;

// c:\mysql\src.txt란 스크립트를 실행시킨다.

// 이 것은 mysql프롬프트 에서 쓰는 것으로 기능은 위와 똑같다

 

45) \. c:\mysql\src.txt

// c:\mysql\src.txt란 스크립트를 실행시킨다

// 끝에 ;(세미콜론)을 붙이지 않는 점에 주의

 

46) select max(article) as article from shop;

// shop 테이블에서 article중에서 가장 큰 값을 가진 것을 article이라는 이름으로 출력

// select max(A) as B from C;

// C테이블에서 A중에 가장 큰 값을 가진 것을 B라는 이름 하에 출력

 

47) select article, dealer, price

from shop

where price=(select max(price) from shop);

// shop 테이블에서 price가 가장 큰 값인 줄의 price를 선택하여 그 줄에 있는 article, dealer, price를 출력

 

48) select article, dealer, price

from shop

order by price desc

limit 1;

// shop테이블에서 price를 내림차순으로 정렬하여 그 중 위에서 1개의 줄만 article,dealer,price를 출력

// limit에 들어가는 값은 출력해낼 줄의 숫자

// 47번 예제보다 좀 더 유동성있고 사용하기 편함

 

49) select article, max(price) as price

from shop

group by article;

// shop테이블에서 article, price 중에 가장 큰 값만 price로 하여 article로 그룹화한 결과를 출력

 

50) select article, dealer, price

from shop s1

where price=(select max(s2.price)

from shop s2

where s1.article = s2.article);

//shop테이블에서 price가 가장 높은 줄의 article,dealer,price를 출력한다.

 

51) select @min_price:=min(price),@max_price:=max(price) from shop;

select * from shop where price=@min_price or price=@max_price;

// shop테이블에서 min_price라는 변수를 선언하고 그 값은 price중 가장 작은 값

// 또한 shop테이블에서 max_price라는 변수를 선언하고 그 값은 price중 가장 큰 값

// shop테이블에서 price가 min_price값을 가지거나 max_price값을 가진 줄 모두를 출력

 

52) select name, sex

from pet where name='Claws'

union

select name,sex

from pet where sex='f';

// pet테이블에서 name이 Claws인 줄의 name, sex를 출력하고

// pet테이블에서 sex가 f인 줄의 name,sex를 출력한다.

// union은 두 개의 쿼리문 결과를 붙여서 보여준다.

// 따라서 select하는 필드값은 일치해야 한다.

posted by 나는너의힘
:
JAVA/jUnit 2009. 9. 25. 09:43
출처 : http://cptcho.tistory.com/18

먼저 CACTUS와 StrutsTest를 받아야 한다.

CACTUS를 사용하기 위해서 해주어야 하는일은 3가지다.

 1. class-path에 CACTUS 라이브러리들을 복사
 2. web.xml 에 ServletRedirector Servlet 추가

<servlet>
     <servlet-name>ServletRedirector</servlet-name>
     <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
 </servlet>
<servlet-mapping>
     <servlet-name>ServletRedirector</servlet-name>
     <url-pattern>/ServletRedirector</url-pattern>
 </servlet-mapping>

3. cactus.properties 생성 후 class-path에 추가

cactus.contextURL=http://IP:PORT/CONTEXT ROOT
cactus.servletRedirectorName=ServletRedirector
cactus.enableLogging=true


이렇게 하면 CACTUS 사용 준비는 끝나게 되고 StrutsTest는 다운받은 jar파일을 lib에 추가만 해주면 된다.

그럼 TestCase를 작성해 보자
public class LoginTestCase extends CactusStrutsTestCase {
    public LoginTestCase(String testName) {
        super(testName);
    }

    /**
     * Client side execution
     */
    public void beginLogin(WebRequest theRequest) {
        // Request Parameter Setting
        theRequest.addParameter("KEY", "VALUE");
    }

    /**
     * Server side execution
     */
    public void testLogin() {
        setRequestPathInfo("/LoginAction");
        actionPerform();
        verifyForward("login_success");
    }
}

TestCase를 만들고 나면 WebAPP WEB-INF/classes에 추가해준다.

다른 방법이 있는지 모르겠지만 웹어플에 추가해주지 않으면 테스트가 안되었다.
posted by 나는너의힘
:
DATABASE/MYSQL 2009. 9. 24. 14:58

mysql-connector-java-5.1.10.zip

Mysql 5.1.1 커넥터/Java 버젼
posted by 나는너의힘
:
WAS 2009. 9. 21. 10:11
License file read error
License file read error
License file read error
Invalid License


license.dat
의 확장자를 지운
license로 변경하여 다시 실행해보자

참고로 폴도옵션에서 알려진 파일 형식의 파일 확장자명 숨기기 이거 풀어주고 하자
아놔 분명히 license인데 안되는거다 확장작 숨겨져 있어서 ㅡㅡ

몇 시간동안 이게 뭐니 ㅡㅡ;;
 

출처 : http://blog.naver.com/caesar0342?Redirect=Log&logNo=20053354731
posted by 나는너의힘
:
DATABASE/MYSQL 2009. 9. 4. 14:32

출처 : http://darky.egloos.com/2378550

업데이트(인서트) 할때 같은 테이블명이 중복사용되서는 안된다
sub Query로 처리해야 함.
 
insert into xt_tbl (
컬럼들 .................. )
values  (
값들.....,        (select (max(seq) + 1) from xt_tbl) )

You can't specify target table 'goodsrate' for update in FROM clause



FAILcom.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred while applying a parameter map. 
--- Check the goodsrate.insert-InlineParameterMap. 
--- Check the statement (update failed). 
--- Cause: java.sql.SQLException: You can't specify target table 'table_name' for update in FROM clause

posted by 나는너의힘
:
TOOL/Eclipse 2009. 8. 30. 11:46

Subversion 설치 및 Eclipse와의 연동

Summary : 현재 버전 관리 시스템으로는 CVS를 가장 많이 사용하고 있다. Subversion은 CVS가 가지고 있는 기능 외에 더 많은 기능들을 제공하고 있다. 속도 또한 CVS보다 더 좋은 상태로 현재 많은 오픈 소스 진영에서 CVS 대신 Subversion을 사용하고 있다. 이번 강좌는 Subversion의 설치에서부터 Eclipse와 연동하는 과정까지 다룬다.

Apache, Subversion설치하기

  • 1. http://httpd.apache.org/download.cgi에서 2.x 버전의 apache를 다운 받는다.
  • 2. http://subversion.tigris.org/project_packages.html에서 가장 최신의 subversion을 다운 받는다.
  • 3. 먼저 apache를 설치한다.
  • 4. 그리고 subversion을 설치한다. subversion설치중에 다음과 같은 화면이 나오는데 3번째 Apache modules부분에 체크가 되어 있는지 확인한다. 디폴트로는 체크가 되어 있을것이다.

  • 5. apache설치 디렉토리\conf\httpd.conf파일을 열어보면 중간쯤에
LoadModule dav_module modules/mod_dav.so 
LoadModule dav_svn_module modules/mod_dav_svn.so

두줄이 주석이 없는
것이 보일것이다. Subversion이 설치중에 관련 모듈을 설치하면서 주석을 삭제하기 때문이다. 자동으로
된다. 따로 할필요가 없다.

  • 6. svnadmin create 명령어로 저장소를 생성한다.

필자는 다음과 같이 수행했다.
E:\svn\repository에 저장소를 생성한다는것이다.

파일 시스템 타입으로 생성한것이다.
버클리 DB타입은 ?fs-type bdb라고 하면된다.

svnadmin --fs-type
fsfs create e:/svn/repository

  • 7. 다음처럼 유저 파일을 생성한다. 물론 이때 path가 안걸려 있을때는 아파치 설치디렉토리밑에
    bin디렉토리를 path에 걸어주고 다시 실행한다.

htpasswd -cm
e:/svn/svn-auth-file 유저명

-> 여기서 c옵션은 새로운 파일 생성, m옵션은
md5타입으로 암호화하는것을 의미한다.

필자는 htpasswd -cm
e:/svn/svn-auth-file fromm0 으로 명령을 수행했다.

htpasswd -m
e:/svn/svn-auth-file 유저명

-> 따라서 이건 해당 유저의 패스워드만
바꾸는것이다.

  • 8. httpd.conf파일에 저장소 관련 셋팅 추가하기.

파일 검색해서 Location이
위치한 부분 마지막에 다음과 같이 추가해준다.

<Location /repos> 
  DAV svn
  SVNPath e:/svn/repository

  Require valid-user

  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile e:/svn/svn-auth-file
</Location>

이 셋팅엔 여러가지 방법이 있다. 자세한 내용은 매뉴얼을 참조하기 바란다.

<Location>
태그내의 /repos는 나중에 http로 접근할 때 http://서버주소/repos형식으로 붙는다.

SVNPath : 저장소 위치를 적어준다. 여러 개의 저장소를 생성할때는 SVNParentPath라고 적어주면
된다.

Require : valid-user라는 값은 승인된 유저만 접근이 가능하다는 것을 의미한다.

AuthType : 인증 타입으로는 필자는 Basic인 기본타입을 사용한다.

AuthUserFile에는 위에서 셋팅한것처럼 사용자 정보가 들어가는 파일의 위치를 지정한다.

  • 9. 보통 아파치 설치후 subversion을 설치하면 아파치 관련 서비스가 사라진다. 이때는 명령창에서
    apache -k install 라고 해주면 다시 서비스가 설치된다.
  • 10. 아파치를 다시 시작 시키고 나서 웹브라우저로 http://localhost/repos 해주면
    Revision 0: / 라는 메시지를 보여준다. 물론 위처럼 설정을 했다면 인증절차를 거치게
    된다.

Eclipse와 Subversion을 연동해서 사용하기.

필자는 eclipse3.1.M4버전을 사용했다.

  • 1. 일단 eclipse용 subversion플러그인은 현재 두가지가 나와있다.

http://subclipse.tigris.org

http://ar.geocities.com/itcrespo/eclipse/

두가지 중에 필자는 위의 것을 사용한다.

  • 2. 홈페이지에서 보면 알겠지만 subclipse는 eclipse내의 software updates를
    사용한다.

Help -> software updates -> find and install를
누른다.

  • 3. search for new features to install를 체크하고 next한다.
  • 4. 다음처럼 new remote site를 추가해 준다. 그럼 sites to include in
    search에 추가가 되고, subclipse에 체크를 한 다음에 다음으로 넘어가자.

  • 5. 다음처럼. 선택한다. 그리고 몇번의 페이지 이동을 한다.

  • 6. 그럼 다음과 같은 화면이 나온다.

  • 7. 설치하고 나면 eclipse를 다시 시작할지 물어본다. 그냥 다시 시작한다.

window->preferences에 team부분을 보면 다음처럼 svn관련이 추가된걸 볼수있다.

  • 8. 메뉴에 window -> show view -> other -> svn하위의 svn
    repositories를 선택한다.

그럼 다음과 같은데 마우스 오른쪽을 클릭해서 new ->
repository location으로 새 저장소를 생성한다.

  • 9. 다음처럼 셋팅해주고 finish를 해준다.

  • 10. 그럼 svn repositories에 등록이 된다. 그리고 다음과 같이 보여준다.

필자의
경우 기존에 등록된 프로젝트가 있어서. 조금 다르게 나온다.

  • 11. 프로젝트를 생성하고 svn에 연결을 시도한다.

  • 12. 다음처럼 cvs와 svn을 선택하는 화면이 나온다.

  • 13. 셋팅이 되어 있는 svn repository를 선택하면 된다.

  • 14. 그럼 svn연결이 되면서 다음과 같은 화면이 나온다. cvs와는 조금 다르게 연결이 되었는데, ?
    표시가 보인다.

Subversion은 연결후 다시 subversion version
control등록을 해야 한다.

  • 15. 다음처럼 version control제어에 추가하고 다시 commit를 하면 연결작업이 사실상 끝난다.

강좌에 대하여

작성자 : [이동국]
작성일 : 2005년 2월 20일

문서이력 :

  • 2005년 2월 20일 이동국 문서 최초 생성

참고 자료


posted by 나는너의힘
:
JS 2009. 8. 26. 01:03
번역할 영어 :



<html>
  <head>
    <script type="text/javascript" src="http://www.google.com/jsapi">    </script>
    <script type="text/javascript">
    google.load("language", "1");
    function initialize() {
      var text = document.getElementById("itext").value;
   google.language.detect(text, function(result) {
   try
   {
   if (!result.error && result.language) {
     google.language.translate(text, result.language, "ko",
          function(result) {
           alert('function(result)');
           var translated = document.getElementById("translation");
           if (result.translation) {
             translated.innerHTML = result.translation;
           }
           });
   }
  
   }   catch (e)   {alert(e)  }
      });
    }
    </script>
  </head>
  <body>
    <div ><input type='text' onchange='initialize()' name='text' size='100' id='itext'/></div>
    <div id="translation"></div>
  </body>
</html>
posted by 나는너의힘
:
카테고리 없음 2009. 7. 28. 14:14
package test;
import java.io.FileOutputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
// Get Method를 사용한 예제
public class Imdb {
 private static String url = "http://www.imdb.com/title/tt0120338/";
 private static StringBuffer sb = new StringBuffer();
 
 /**
  * @param args
  */
 public static void main(String[] args) {
System.out.println("main Strat  1");
  // HttpClient 생성
  HttpClient client = new HttpClient();
 
  // 요청 Method 지정
  HttpMethod method = new GetMethod(url);
  System.out.println("main Strat  2");
 
  try {
  
   // QueryString 지정, 1.문자열
//  url = url + "?mode=LSD&section_id=001&menu_id=001&view=1";
   // QueryString 지정, 2.NameValuePair 사용
//   NameValuePair nvp1= new NameValuePair("mode","LSD");
//   NameValuePair nvp2= new NameValuePair("section_id","001");
//   NameValuePair nvp3= new NameValuePair("menu_id","001");
//   NameValuePair nvp4= new NameValuePair("view","1");
//   method.setQueryString(new NameValuePair[]{nvp1,nvp2, nvp3, nvp4});
//   System.out.println("QueryString>>> "+method.getQueryString());
   // HTTP 요청 및 요청 결과
   int statusCode = client.executeMethod(method);
  System.out.println("#############   statusCode " + statusCode);
  System.out.println("#############   method " + method.getName());
   // 요청 결과..
   if (statusCode == HttpStatus.SC_OK) {
    System.out.println("요청 성공");
//    System.out.println("응답 HTML:\n" + method.getResponseBodyAsString());
  
    // 결과 저장
    Imdb.saveBytes("naver_news.html", method.getResponseBody());
   } else if ((statusCode == HttpStatus.SC_MOVED_TEMPORARILY) ||
                 (statusCode == HttpStatus.SC_MOVED_PERMANENTLY) ||
                 (statusCode == HttpStatus.SC_SEE_OTHER) ||
                 (statusCode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
    System.out.println("Redirecte !!!");
    System.out.println("Redirect target: " + method.getResponseHeader("location").getValue());
         }
  
  } catch (Exception e) {
   System.out.println("Exception 발생 ");
   e.printStackTrace();
  
   // Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
   // commons-logging.jar, commons-logging-api.jar 를 CLASSPATH에 추가한다.
  
   // Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException
   // commons-codec-1.3.jar 를 CLASSPATH에 추가한다.
  }
  System.out.println();
 }
 // 가져올 페이지 주소, 네이버 뉴스 속보
 
 
 // 파일에 byte[] 저장
 public static void saveBytes(String filepath, byte[] byteData) throws Exception {
  System.out.println("#############   saveBytes ");
  FileOutputStream foStream = null;
  try {
   sb.append(byteData);
   foStream = new FileOutputStream(filepath);
//   foStream.write(byteData);
  } finally {
   try { foStream.close(); foStream = null; } catch (Exception e) {
    System.out.println("saveBytes 익셉션 발생 ");
   }
  }
 }
commons-codec-1.3.jarcommons-httpclient-3.1.jarcommons-logging-1.1.1.jarcos.jarhttpclient-4.0-beta2.jarhttpcore-4.0.1.jarhttpcore-nio-4.0.1.jarhttpmime-4.0-beta2.jaribatis-2.3.4.726.jarlog4j-1.2.15.jar

 
posted by 나는너의힘
:
JS/Ajax 2009. 7. 24. 16:36

다음은 AJAX로 파일 내용을 가져오는 예제이다.

<script type="text/javascript">
var http = false;

if(navigator.appName == "Microsoft Internet Explorer") {
  http = new ActiveXObject("Microsoft.XMLHTTP");
} else {
  http = new XMLHttpRequest();
}

http.open("GET", "test.txt");
http.onreadystatechange=function() {
  if(http.readyState == 4) {
    document.write(http.responseText);
  }
}
http.send(null);
</script>

text.txt 대신 URL을 넣으면 해당 URL의 내용을 가져온다.

Reference:
http://daniel.lorch.cc/docs/ajax_simple/

posted by 나는너의힘
:
JS/Ajax 2009. 7. 24. 16:04

AJAX로 다른 도메인의 데이터를 가져오려고 시도하면 오류가 발생한다.

오류 내용은 다음과 같다.

오류: 사용 권한이 없습니다.

보안 상의 이유로 AJAX를 통해 다른 도메인의 데이터를 가져올 수 없다.

하지만 우회하는 방법이 있다.

AJAX를 통해 다른 도메인의 데이터를 가져올 수 있도록 웹 브라우저의 설정을 바꿔준다.

바꾸는 방법은 다음과 같다.

도구 -> 인터넷 옵션

'보안' 탭에서 '사용자 지정 수준'을 선택한다.

'기타' -> '도메인 간의 데이터 소스 액세스'를 '사용 안함'에서 '사용'으로 변경한다.

물론 이러한 요청이 사용자에게 받아들여질리 만무하다.

차선책으로 프록시를 사용하는 방법이 있다.

동일 서버에 프록시 페이지를 생성해두고 우회하는 방법이다.

동일 서버에 프록시 페이지를 생성할 수 있는 경우에만 가능한 방법이다.

그 외에 좋은 방법을 알고 있다면,

comment plz :-)


posted by 나는너의힘
:
JS 2009. 7. 24. 11:20

출처  : http://blog.daum.net/nanhjb/5912900

아무것도 실행안되게 하기.. 엔터키쳐도 무반응

 

<input type="text" name="searchWord" value="" size="25" value=태그인넷 tagin.net
onKeyDown="javascript:if (event.keyCode == 13) window.event.returnValue = false;">

posted by 나는너의힘
:
JAVA 2009. 7. 22. 11:35
출처 : http://programmers.tistory.com/entry/HTTPclient%EC%9D%98-%EC%82%AC%EC%9A%A9-1

3.0의 내용이지만 3.1만에서도 같다.

물론 4.0은 다르다

목차

  1. 설치 및 설명
  2. getMethod
  3. postMethod
  4. Header 설정
  5. Cookie 설정

  기타. 1) Reference




#### 1. 설명 및 설치
1-1. HttpClient 소개
HttpClient은 HTTP상에서 커뮤니케이션을 하는 자바 기반의 어플리케이션 개발을 쉽게 할수 있도록 제공한다.
우리가 웹 브라우저 또는 그에 준하는 어플리케이션을 개발한다면 HttpClient은 우리에게 클라이언트 코드 개발에 도움을 줄수있다.
이름에서 의미하는것과 같이 HttpClient는 오직 HTTP 클라이언트 코드을 위한 컴포넌트이지 HTTP 요청을 처리하는 서버측 프로세스을 지원하지는 않는다.

1-2. 설치
현재 아파치 HttpClient 는 3.0.1 안정버전을 지원한다.
Jakarta Commons HttpClient 페이지에서 다운로드 받으면 된다.
(다운로드 페이지: http://jakarta.apache.org/commons/httpclient/downloads.html)
(최신버전 다운로드:
  - http://jakarta.apache.org/site/downloads/downloads_commons-httpclient.cgi
  - http://mirror.apache-kr.org/jakarta/commons/httpclient/binary/commons-httpclient-3.0.1.zip
)

commons-httpclient-3.0.1.zip 를 받아서 압축을 풀고,
commons-httpclient-3.0.1.jar 를 CLASSPATH 에 추가하면 된다.

1-3. 추가 설정(Dependencies)
http://jakarta.apache.org/commons/httpclient/dependencies.html

Artifact ID  Type  Version  Scope  URL  Comment 
commons-codec jar 1.2  http://jakarta.apache.org/commons/codec/
                       http://jakarta.apache.org/site/downloads/downloads_commons-codec.cgi
commons-logging jar 1.0.4  http://jakarta.apache.org/commons/logging/  
junit jar 3.8.1 test  http://www.junit.org/ 


#### 2. getMethod 사용 예제
=========================== GetSample.java =================================
package test.httpclient;

import java.io.FileOutputStream;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;

// Get Method를 사용한 예제
public class GetSample {

 // 가져올 페이지 주소, 네이버 뉴스 속보
 private static String url =
  "http://news.naver.com/news/list.php";
 
 
 // 파일에 byte[] 저장
 public static void saveBytes(String filepath, byte[] byteData) throws Exception
 {
  FileOutputStream foStream = null;
  try {
   foStream = new FileOutputStream(filepath);
   foStream.write(byteData);
  } finally {
   try { foStream.close(); foStream = null; } catch (Exception e) {}
  }
 }
 
 
 /**
  * @param args
  */
 public static void main(String[] args) {

  // HttpClient 생성
  HttpClient client = new HttpClient();

 
  // 요청 Method 지정
  HttpMethod method = new GetMethod(url);

 
  try {
   
   // QueryString 지정, 1.문자열
   url = url + "?mode=LSD&section_id=001&menu_id=001&view=1";
   // QueryString 지정, 2.NameValuePair 사용
//   NameValuePair nvp1= new NameValuePair("mode","LSD");
//   NameValuePair nvp2= new NameValuePair("section_id","001");
//   NameValuePair nvp3= new NameValuePair("menu_id","001");
//   NameValuePair nvp4= new NameValuePair("view","1");
//   method.setQueryString(new NameValuePair[]{nvp1,nvp2, nvp3, nvp4});

   System.out.println("QueryString>>> "+method.getQueryString());

   // HTTP 요청 및 요청 결과
   int statusCode = client.executeMethod(method);

   // 요청 결과..
   if (statusCode == HttpStatus.SC_OK) {
    System.out.println("요청 성공");
    System.out.println("응답 HTML:\n" + method.getResponseBodyAsString());
   
    // 결과 저장
    GetSample.saveBytes("naver_news.html", method.getResponseBody());
   } else if ((statusCode == HttpStatus.SC_MOVED_TEMPORARILY) ||
                 (statusCode == HttpStatus.SC_MOVED_PERMANENTLY) ||
                 (statusCode == HttpStatus.SC_SEE_OTHER) ||
                 (statusCode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
    System.out.println("Redirecte !!!");
    System.out.println("Redirect target: " + method.getResponseHeader("location").getValue());
         }
   
  } catch (Exception e) {
   e.printStackTrace();
   
   // Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
   // commons-logging.jar, commons-logging-api.jar 를 CLASSPATH에 추가한다.
   
   // Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException
   // commons-codec-1.3.jar 를 CLASSPATH에 추가한다.
  }

 }

}

=========================== GetSample.java =================================



#### 3. postMethod 사용
GetMethod 나 PostMethod 나 사용방법은 비슷합니다.


PostMethod method = new PostMethod("http://xx.com/ex_login_ok.php");
NameValuePair userid = new NameValuePair("nick", "aaaaa");
NameValuePair userpw = new NameValuePair("password", "bbbb");

method.setRequestBody( new NameValuePair[] {userid, userpw});

client.executeMethod(method);


 

#### 4. Header 사용
헤더를 사용하기 위해서는 setRequestHeader() 를 이용하여 원하는 헤더를 정의해 주시면 됩니다.


String charset = null; // 기존 charset 사용
//String charset = "euc_kr"; // charset 지정

// 요청 헤더 설정
if (charset == null) {
    method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
} else {
    method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" + charset);
}


 

#### 5. Cookie 사용
아직 정리가 않되서.. 분량이 좀 많네요.^^;
찬찬히 정리하겠습니다.



#### Reference
1) 자카르타 프로젝트 HttpClient와 FileUpload 사용하기
  - http://blog.empas.com/inter999/read.html?a=3271313&l=1&v=trackback

posted by 나는너의힘
:
JS 2009. 7. 22. 10:57
출처 : http://tong.nate.com/monkey82/2947064
<script>
/*
 이메일을 체크하기 위한 함수
 인수로는 element(input type=text)를 받음.
 정규 표현식 ==>
^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$
 
^[0-9a-zA-Z]                --> 첫글자는 숫자또는 영문자
[-_\.]?                           --> - 또는 _ 또는 . 이 0번 또는 1번  .은 특수문자 이므로 \. 으로
[0-9a-zA-Z]                 --> 숫자또는 영문자
([-_\.]?[0-9a-zA-Z])*@ --> @ 앞에(-,_,. 이 0~1번, 그 뒤에는 숫자,영문자)이 한번 또는 여러번
[0-9a-zA-Z]                --> @ 뒤에는 숫자 또는 영문자
[-_\.]?                          --> - 또는 _ 또는 . 이 0번 또는 1번
([-_\.]?[0-9a-zA-Z])*.   --> . 앞에(-,_,. 이 0~1번, 그 뒤에는 숫자,영문자)이 한번 또는 여러번
[a-zA-Z]{2,3}$             --> . 뒤 마지막 문자열은 영문자가 2~3개
   가능한 형식 예 : aaa@bbb.com  a7a.dd@bbbb.pe.kr.com  777_d-3@bbb.com
불가능한 형식 예 : -aaa@bbb.com  a#aa@co.kr  aaa@bbb@ccc.com  aaa@bbb.c  aaa@bbb.comp
*/
function valid_email(ele) { 
    re=/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
   
    // 위의 조건을 만족하려면 최소 6자 이상이어야 함.
    if(ele.value.length<6 || !re.test(ele.value)) {
        alert("메일형식이 맞지 않습니다.\n 다시 입력해주세요.\n");
        ele.select();
        ele.focus();
        return false;
    } else {
        alert("제대로된 형식");
        return true;
    }
}
</script>
 
<h2>E-mail 확인</h2>
<p>
<font size=4>이메일 형식을 체크하는 정규식 입니다.</font>
<FORM name=data_form>
    Email: <INPUT TYPE=TEXT NAME=email value="">
    <input type=button value="확인" omClick="javascript:valid_email(document.data_form.email);">
</FORM>
posted by 나는너의힘
: