Do Not Think!!!

Posted
Filed under 01010101
JavaScript의 Equality Operators에는 ==과 ===이 있습니다.

==는 두 값을 비교합니다. 이때, 타입이 서로 다르면, 비교 가능한 타입으로 변환해서 비교합니다.
===는 타입을 고려하여 두 값을 비교합니다.

== 예제 (Language : javascript)
  1. alert(1 == true); // true
  2. alert(0 == true); // false
  3. alert(1 == "1"); // true

=== 예제 (Language : javascript)
  1. alert(1 === true); // false
  2. alert(0 === true); // false
  3. alert(1 === "1"); // false


위 예제를 보면 명확하게 알 수 있습니다.
==는 타입을 변환하며 값을 비교하고 있고, ===는 값과 타입을 비교하고 있습니다.


참고
Core JavaScript 1.5 Reference:Operators:Comparison Operators
Posted
Filed under 01010101
얼마 전에 phpschool에서 행복한고니 님의 특이한 javascript의 표현이라는 글을 보고 new Object()와 {}는 같다고 생각했습니다. 하지만, 이에 대해 숨어지내리 님은 반대 의견을 제기하셨고, 열띤 토론이 이루어지고 있습니다.


토론 내용만 봐서는 무엇이 사실인지 구분을 할 수 없어, 직접 rhino 소스를 분석해 보았습니다.


ScriptRuntime.java - new Object() 코드 (Language : java)
  1. public static Scriptable newObject(Context cx, Scriptable scope, String constructorName, Object[] args)
  2. {
  3.     scope = ScriptableObject.getTopLevelScope(scope);
  4.     Function ctor = getExistingCtor(cx, scope, constructorName);
  5.     if (args == null) { args = ScriptRuntime.emptyArgs; }
  6.     return ctor.construct(cx, scope, args);
  7. }

ScriptRuntime.java - literal {} 코드 (Language : java)
  1. public static Scriptable newObjectLiteral(Object[] propertyIds, Object[] propertyValues, Context cx, Scriptable scope)
  2. {
  3.     Scriptable object = cx.newObject(scope);
  4.     for (int i = 0, end = propertyIds.length; i != end; ++i) {
  5.         Object id = propertyIds[i];
  6.         Object value = propertyValues[i];
  7.         if (id instanceof String) {
  8.             ScriptableObject.putProperty(object, (String)id, value);
  9.         } else {
  10.             int index = ((Integer)id).intValue();
  11.             ScriptableObject.putProperty(object, index, value);
  12.         }
  13.     }
  14.     return object;
  15. }


코드를 간단하게 해석해 보면, new Object() 코드는 instance를 반환하고, literal {} 코드는 instance를 재가공해서 반환합니다.

즉, new Object() 와 literal {}는 같은 결과를 반환하기는 하지만, 내부적으로는 다르게 구현되어 있습니다.


어렵다. JavaScript

덧. JavaScript Literals 설명
Posted
Filed under 01010101
자바스크립트에서 Object의 Property를 이용하여 Hash 객체를 구현하는 예제코드입니다.

구현 예제 (Language : javascript)
  1. function Hash ()
  2. {
  3.     var m_objHash = new Object();
  4.    
  5.    
  6.     this.put = function (key, value)
  7.     {
  8.         m_objHash[key] = value;
  9.     }
  10.    
  11.     this.get = function (key)
  12.     {
  13.         return m_objHash[key];
  14.     }
  15.    
  16.     this.remove = function (key)
  17.     {
  18.         var temp = m_objHash[key];
  19.        
  20.         delete m_objHash[key];
  21.        
  22.         return temp;
  23.     }
  24.    
  25.     this.getKeys = function ()
  26.     {
  27.         var keys = new Array();
  28.         for (var key in m_objHash)
  29.         {
  30.             keys.push(key);
  31.         }
  32.        
  33.         return keys;
  34.     }
  35. }

Posted
Filed under 01010101
new String(byte[] buffer)에서 charset 문제에서 MS-Windows와 Linux등의 두개 이상의 다른 OS에서 자바 프로그램을 실행시킬경우 한글 문제를 해결하기 위한 내용을 다뤘습니다.

이번에는 반대로 Java에서 저장한 데이터를 .NET 프로그램에서 읽기 위한 방법입니다.

이번에도 Java 프로그램은 MS-Windows와 Linux등 두개 이상의 다른 OS에도 동작합니다.


예를들면 다음과 같이 동작하는 프로그램입니다.
.NET 프로그램 <----- DB, File, Network <----- Java 프로그램(MS-Windows, Linux등에서 동작)


이때에는 string을 만들때와는 반대로 명시적으로 charset을 사용해서 string을 인코딩(string -> stream)해야 합니다.

즉, 다음과 같은 코드 대신

(Language : java)
  1. byte[] buffer = str.getBytes()


다음과 같은 코드를 사용합니다.

(Language : java)
  1. byte[] buffer = str.getBytes("MS949") // MS949로 인코등해서 stream을 만듭니다.


.NET 프로그램과 Java 프로그램을 모두 UTF-8로 만들면 이런 문제를 생각하지 않아도 됩니다.
하지만,
.NET 프로그램이 만들어져 있는 상황에서, Java로 프로그래밍을 해야 한다면, 특히 데이터를 같이 사용해야 한다면, 이런 방법을 사용해서 한글 문제를 해결해야 합니다.

Posted
Filed under 01010101
Java에서 JDBC 프로그래밍을 시작하기 위한 내용을 간단하게 정리합니다.


JDBC 프로그래밍 순서

1. JDBC Driver 로딩
Class.forName(JDBC Dirver Class);


2. DB Connection 획득
Connection connection = DriverManager.getConnection(url, user, password);


3. Statement 획득
Statement statement = connection.createStatement();


4. SQL 쿼리 실행
ResultSet resultSet = statement.executeQuery(query);


5. ResultSet 처리
while (resultset.next())
{
}


6. 사용한 자원 반환
resultSet.close()
statement.close()
connection.close()


7. 성능을 위해 1, 2 대신 Connection Pool을 이용해서 Connection을 획득
(벤더에서 제공하는 DataSource 이용)
Context context = new InitialContext();
DataSource dataSource = (DataSource)context.lookup(JDBC JNDI);
Connection connection = dataSource.getConnection();




참고

Posted
Filed under 01010101
쿠키에 대한 자세한 정보는 다음 주소에서 확인하세요.
http://www.ietf.org/rfc/rfc2109.txt

  • 쿠키는 서버가 브라우저에 전송하는 정보입니다.
  • 이후 서버에 접속할 때마다 서버로 쿠키를 전송합니다.
  • 제약사항
    • 브라우저는 사이트당 20개의 쿠키만 받아들임
    • 사용자당 총300개만을 사용할 수 있음
    • 각 쿠키의 크기는 4KB
    • 쿠키를 받아들이지 않는 브라우저가 있음

샘플 코드 (Language : java)
  1. /*
  2. 서블릿 post 메소드
  3. */
  4. public void doGet (HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException
  5. {
  6.    // 쿠키 읽기
  7.    Cookie[] cookies = request.getCookies();
  8.  
  9.    /*
  10.    쿠키 정보를 사용하는 코드
  11.    */
  12.  
  13.    // 쿠키 만들기
  14.    Cookie cookie = new Cookie(name, value);
  15.  
  16.    // 쿠키 쓰기
  17.    response.addCookie(cookie);
  18. }




Posted
Filed under 01010101
C#의 constreadonly 키워드는 상수를 선언하는 키워드입니다.

하지만 둘 사이에는 약간의 차이가 있습니다.
const는 선언할 때 초기화 되어야 하지만, readonly는 생성자에서도 초기화 될
수 있습니다.

따라서, 다음과 같이 서로 다른 용도로 사용 할 수 있습니다.

  • const는 코드서 직접 상수값을 설정 할 경우.
  • readonly는 환경설정에 설정된 값을 읽어 상수값을 설정 할 경우.

Posted
Filed under 01010101
RFC 2616에서 인용한 HTTP 정의의 일부분입니다.

The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. It is a generic, stateless, protocol which can be used for many tasks beyond its use for hypertext, such as name servers and distributed object management systems, through extension of its request methods, error codes and headers. A feature of HTTP is the typing and negotiation of data representation, allowing systems to be built independently of the data being transferred.


우리가 보내는 데이터는 단지 01 2진수들의 흐름입니다. 좀 더 정확하게는 전기의 흐름이겠죠. 그리고 전기는 계속 흐로고 있습니다. 그렇다면 컴퓨터는 어디부터 어디까지를 데이터로 인식해야 할까요? 그래서 필요한게 프로토콜입니다.

프로토콜은 약속입니다.
내가 ~부터 ~까지 데이터를 보낼테니, 너는 ~부터 ~까지 받아라.
이런 약속은 웹브라우저와 웹서버사이의 약속입니다. 물론 우리가 사용하는 웹브라우저는 이런 약속을 잘 지키도록 만들어졌겠죠.

하지만, 잘 만들어진 웹브라우저만 사용하는 것이 아니라, 우리가 웹클라이언트, 또는 웹서버를 만들어야 할 경우가 있습니다.


저는 서버에 파일을 전송하는 웹클라이언트와 웹서버 프로그램를 만들었습니다. 물론 HTTP를 이용해서 파일을 전송하도록 만들었죠.

웹서버 프로그램은 Java Servlet으로 만들었고, 웹클라이언트 프로그램은 C#으로 만들었습니다

프로그램을 만들다 보니 다음과 같은 문제에 직면했습니다.
  • 웹브라우저에서 Java Servlet으로 만든 웹서버 프로그램 파일을 전송하면 잘 받아집니다.
  • C#으로 만든 웹클라이언트에서 PHP로 만든 웹서버 프로그램에 파일을 전송하면 잘 받아집니다.
  • C#으로 만든 웹클라이언트에서 Java Servlet으로 만든 웹서버 프로그램에 파일을 전송하면 받아지지 않습니다.

이런 문제때문에, HTTP에 관한 RFC문서를 보게 되었고, 다음과 같은 내용을 찾을 수 있었습니다.
  • RFC 1867에 정의된 multipart 포멧으로 data stream을 전송합니다.
  • multipart data stream은 다음과 같이 정의되어 있습니다.

data stream 포멧 보기



즉, HTTP Body는
  • heder-part와 body-data로 이루어지고
  • 각 HTTP Body는 delimiter로 구분됩니다.
  • 그리고 data stream의 마지막에는 close-delimiter로 끝나야 합니다.

기본에 충실했다면, 이런 문제는 바로 해결할 수 있었을 텐데, 그렇지 못했기 때문에 문제 해결에 많은 시간이 걸렸습니다.
모든 문제는 기본에 충실하지 않은 것에서부터 생깁니다.
항상 머리속에 새겨야 할 말입니다.


참고 URL 보기


Posted
Filed under 01010101
자바 프로그래밍을 하다보면 다음과 같이 String을 만들때가 있습니다.

코드 보기


보통 Stream에서 String을 만들경우 이런 방법을 사용합니다.

Java API를 보면 다음과 같은 말이 나옵니다.
Constructs a new String by decoding the specified array of bytes using the platform's default charset.
간단하게 말하면, 시스템의 기본 charset을 사용해서 byte[]을 디코딩해서 String을 만든다는겁니다.

그런데, 이렇게 코딩을 하게되면 기본 charset이 다른 플랫폼 사이에서의 호환성을 잃어버리게 됩니다.

예를들면,
  • .NET에서 파일을 System.Default로 인코딩해서 저장합니다.
  • 윈도우에서 Java로 개발하면서 위와 같이 코딩을 합니다.
  • 윈도우에서 테스트할 경우에는 문제가 발생하지 않습니다. (왜냐하면, charset이 같기 때문입니다.)
  • 이 프로그램을 UTF-8로 설정된 리눅스에서 돌리면, 디코딩을 제대로 하지 못하는 문제가 발생합니다.
.NET 프로그램 -----> DB, File, Network -----> Java 프로그램(MS-Windows, Linux등에서 동작)



이런 문제를 해결하기 위해 다음과 같이 저장시 사용한 charset을 명시적으로 사용해야 합니다.

코드 보기



Posted
Filed under 01010101
Javascript에는 arguments라는 객체가 있습니다.
함수를 호출할 때 전달되는 인자에 대응되는 배열 형태의 객체입니다.

간단한 사용법은 다음과 같습니다.

코드 보기



사용법을 보면 알겠지만, 이 객체를 이용하면 함수 호출 시 인자를 다르게 사용하는 함수 overloading을 흉내낼 수 있습니다. (물론 Javascript는 변수의 type을 실행시에 체크하기 때문에, 인자 type에 의한 함수 overloading은 구현 하기 힘듭니다.)