2014년 10월 29일 수요일

[JAVA] Iterator


1) key

Iterator<[타입(String, int ... )]> it = [ConcurrentHashMap].keySet().iterator();
while( it.hasNext() )
{
      [value] = [ConcurrentHashMap].get(it.next());
}

2) value


[MFC] 한글 ASCII UTF8 코드 변환

[Tip] 한글 ASCII 코드를 웹 URL에서 사용되는 UTF8 코드로 변환
 
팁스소프트에서 제공하는 프로그래밍과 관련된 자료나 정보들을 무단으로 복제하거나 게재하는 행위는
상호간의 신뢰를 무너뜨리는 행위이며, 법적인 문제를 야기할 수 있으므로 각별한 주의를 당부드립니다.
* 팁스소프트 저작권 정책 보기 -  http://www.tipssoft.com/bulletin/tb.php/FAQ/637
 
이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 -  http://www.tipssoft.com/bulletin/tb.php/QnA/8406
 
 
 
안녕하세요~!
 
한글 ASCII 형식의 문자열을 웹 URL에서 사용되는 멀티바이트 코드인 UTF8 형식의 문자열로 변환하는
방법에 대해서 설명하겠습니다.
 
웹에서는 ASCII 형식의 문자열이 사용되지 않고 UTF8 형식의 문자열이 사용됩니다. 특히 URL에서 한글이
적용되는 형태는 UTF8 형식에서 한단계 더 변형된 형태가 사용됩니다. 예를 들어 검색사이트 에서 "한글"
이라는 단어를 검색하게 되면 적용되는 URL에서 "한글" 이라는 단어는 "%ED%95%9C%EA%B8%80"
과 같은 형태로 변형 되어 사용됩니다.
 
일반 프로그래밍시 사용되는 문자열의 형태는 ASCII 코드이기 때문에 웹과 관련된 프로그래밍을 위해서는
ASCII 코드 형태의 문자열을 UTF8 형태로 변형해야 하고 URL에 적용되는 한글의 경우 위와 같이 한단계
더 변형된 형태로 프로그래밍이 이루어 져야 합니다.
 
한글 ASCII 코드를 UTF8 코드로 변환하기 위해서 ASCII 코드를 UTF8 코드로 바로 변환할 수 있는 함수가
없기 때문에 먼저 ASCII 코드를 유니코드로 변환하고 변환된 유니코드를 UTF8 코드로 변환해야 합니다.
 
 
          "ASCII 코드" -> "유니코드" -> "UTF8 코드"
 
 
ASCII 코드를 유니코드로 변환하기 위해서는 MultiByteToWideChar 함수를 사용하고 유니코드를
ASCII 코드로 변환하는것은 특별한 함수를 사용하지 않아도 CString 클래스가 변환해 주기 때문에
CString 클래스를 사용하면 됩니다.
 
그리고 변환된 한글 UTF8 코드를 URL에서 적용되는 형태로 변형합니다. 단, 영어의 경우 한글과 같이
UTF8 코드에서 한단계 더 변형된 형태로 사용되지 않습니다. 영어는 UTF8 코드 형태 그대로 사용되고
한글일 경우에만 위와 같이 변형 되어 사용됩니다.
 
 
// UTF8 코드로 변환하고자 하는 CString 타입의 parm_ascii_string, UTF8 코드로 변환된
// 값을 넣어줄 CString 타입의 parm_utf8_string 2개의 함수 인자를 사용한다.
void AsciiToUTF8(CString parm_ascii_string, CString &parm_utf8_string)
{
     parm_utf8_string.Empty();

     // 아스키 코드를 UTF8형식의 코드로 변환해야 한다. 아스키 코드를 UTF8 코드로 변환할때는
     // 아스키 코드를 유니코드로 먼저 변환하고 변환된 유니코드를 UTF8 코드로 변환해야 한다.

     // 아스키 코드로된 문자열을 유니코드화 시켰을 때의 길이를 구한다.
      int temp_length = MultiByteToWideChar(CP_ACP, 0, (char *)(const char *)parm_ascii_string, -1, NULL, 0);
     // 변환된 유니코드를 저장할 공간을 할당한다.     BSTR unicode_str = SysAllocStringLen(NULL, temp_length + 1);

     // 아스키 코드로된 문자열을 유니 코드 형식의 문자열로 변경한다.      MultiByteToWideChar(CP_ACP, 0, (char *)(const char *)parm_ascii_string, -1, unicode_str, temp_length);

     // 유니코드 형식의 문자열을 UTF8 형식으로 변경했을때 필요한 메모리 공간의 크기를 얻는다.     temp_length = WideCharToMultiByte( CP_UTF8, 0, unicode_str, -1, NULL, 0, NULL, NULL );

     if(temp_length > 0){
        CString str;
        // UTF8 코드를 저장할 메모리 공간을 할당한다.        char *p_utf8_string = new char[temp_length];
        memset(p_utf8_string, 0, temp_length);
        // 유니코드를 UTF8코드로 변환한다.        WideCharToMultiByte(CP_UTF8, 0, unicode_str, -1, p_utf8_string, temp_length, NULL, NULL);
 
        // UTF8 형식으로 변경된 문자열을 각 문자의 코드값별로 웹 URL에 사용되는 형식으로 변환한다.        for(int i = 0; i < temp_length - 1; i++){
            if(p_utf8_string[i] & 0x80){
                // 현재 코드가 한글인 경우..
                // UTF8 코드로 표현된 한글은 3바이트로 표시된다. "한글"  ->  %ED%95%9C%EA%B8%80
                for(int sub_i = 0; sub_i < 3; sub_i++){
                    str.Format("%%%X", p_utf8_string[i] & 0x00FF);
                    parm_utf8_string += str;
                    i++;
                }
   
                i--;
            } else {
                // 현재 코드가 영문인 경우, 변경없이 그대로 사용한다.
               parm_utf8_string += p_utf8_string[i];
            }
        }                                                             
 
        delete[] p_utf8_string;
     }

      // 유니코드 형식의 문자열을 저장하기 위해 생성했던 메모리를 삭제한다.
      SysFreeString(unicode_str);
}


출처 : http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=749

2014년 10월 27일 월요일

[web] referer

레퍼러(Referer) 를 얻어오는 방법

# 레퍼러(Referer : 유입경로) 를 얻어오는 방법    request.getHeader(“referer”);
      – 버튼이나 링크를 클릭해서, 혹은 폼을 전송해서 들어오는 경우 이전 페이지의 URL을 구할 수 있다.
# 참고 : referer 가 null 이 되는 경우
           – 브라우저 URL 입력란에 직접 입력하고 엔터 쳐서 들어오는 경우

[java] annotation

자바에서 Annotation은 소스코드에 주석을 다는 일이다.
별도의 properties파일이나 xml같은 설정파일에 작성하는 부가적인 정보를 어노테이션으로 간편하게 설정할 수 있으므로, 코드의 양을 줄일 수 있다. 

어노테이션은 @를 붙여 사용하며, 우리가 흔히 볼 수 있었던 어노테이션에는 @Override, @Deprecated 등이 있다.

어노테이션은 아래와 같이 사용자가 정의해서 쓸 수 있다.

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Anno { 
    public String defaultVal() default "OK"
    public String val(); 
}

여기서 Target은 어노테이션을 적용할 대상을 선택하고, Retention은 이 어노테이션의 정보가 어디까지 유지되는지 지정한다.

@Target - Constructor, Field, Enum, Local Variable, Method, Package, Parameter, Type(Class)
@Retention - Source, Class, Runtime
@Documented - 어노테이션을 javadoc에 포함한다.
@Inherited - 어노테이션 상속을 가능케 한다.

다음은 위에 정의한 어노테이션을 어떻게 사용하는지 보겠다.

@Anno(val = "Annotation!!"
public class Member { 
.....
}

Target을 TYPE인 클래스에 했으므로 위와 같이 클래스 위에 어노테이션을 사용하고, 아래와 같은 방식으로 어노테이션의 정보를 알아 올 수 있다.

Member member = new Member(); 
System.out.println(member.getClass().getAnnotation(Anno.class).val()); 
System.out.println(member.getClass().getAnnotation(Anno.class).defaultVal());

결과는
Annotation!!
OK


출처 : http://blog.naver.com/cracker542/40159657935

What are Java Annotations

Java5 에 소개된 기능으로, meta data 를 코드형태로 담을 수 있고, runtime 에 이 meta data 에 접근할 수 있다. pre-compiler 가 코드를 conversion 할 때 사용되기도 한다.

Annotation 은 interface 형태이다.

@Retention( RetentionPolicy.RUNTIME );
@Target( ElementType.TYPE )
public @interface TestAnnotation{
public String name();
public String value();
}

@TestAnnotation(name="variable", value="value")
public class TestClass{
// ...
}

@Retention( RetentionPolicy.RUNTIME ) 은 runtime 에 reflection 형태로 사용될 수 있다는 것을 의미한다.
이 구문이 없으면 runtime 에 이 annotation 은 사라진다. ( 구체적으로 compile time 에 제거한다. )

@Target( ElementType.TYPE ) 은 class, interface 와 같은 type 에 쓰인다는 것이다. TYPE 대신 METHOD, FIELD 를 줄수도 있다. 만약 이를 명시해주지 않으면 모든 곳에 사용될 수 있다.



Class Annotations

Annotations[] annotations = aClass.getAnnotations();

if ( annotaion instanceof TestAnnotation ){
((TestAnnotation )annotaion).name();
((TestAnnotation )annotaion).value();
}



Method Annotations

method.getDeclaredAnnotations();





Parameter Annotations

method.getParameterAnnotations();



Field Annotations

field.getDeclaredAnnotations();
field.getAnnotation( TestAnnotation.class );