Do Not Think!!!

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은 구현 하기 힘듭니다.)