September 26, 2008
Java와 C간의 socket 통신시 주의할 사항
Java는 platform과 상관없이 무조건 big-endian으로 데이터를 처리하는 반면에 C는 platform에 따라서 big-endian과 little-endian이 달라진다.따라서 java에서 ByteBuffer의 order()함수를 이용하여 endian을 맞추든, C에서 맞추든 endian을 통일시켜야, socket 통신을 원하는 결과를 얻을 수 있다.
September 12, 2008
Firefox Shortcut Keys
| CTRL+N | 새로운 창 열기 |
|---|---|
| CTRL+R | 현재 page 다시 불러오기 |
| ALT+← | 이전 page로 돌아가기 |
| ALT+→ | 다음 page로 돌아가기 |
| ALT+HOME | Home page로 돌아가기 |
| CTRL+k | 검색어 입력창으로 이동 |
| ALT+d | URL 입력창으로 이동 |
| CTRL+ENTER | 입력한 URL 앞에 "http://www.", 뒤에 ".com"을 붙여준다. |
| CTRL+T | 새로운 Tab 열기 |
| CTRL+W | 현재 Tab 닫기 |
| CTRL+SHIFT+T | 닫은 Tab 되돌리기 |
| CTRL+TAB | 다음 Tab으로 이동 |
| CTRL+SHIFT+TAB | 이전 Tab으로 이동 |
| CTRL+[0-9] | 1번째 Tab부터 10번째 Tab까지 바로 이동 |
| / | 입력하는 글자에 해당하는 글자로 이동 |
| ' | 입력하는 글자에 해당하는 link로 이동 |
| CTRL+G | 다음 글자 or link로 이동 |
| CTRL+SHIFT+G | 이전 글자 or link로 이동 |
August 29, 2008
DRM Free 음악 서비스 비교 (계속 작성 중.)
DRM Free 음악 서비스를 상당히 기다려왔다. 원하는 음악을 정당한 대가를 지불하고, "내가 원하는 방식"으로 즐길 수 있기 때문에 나로써는 정말 고대하던 서비스가 아닐 수 없다. Bugs를 시작으로 해서 일단 한 달 씩 각 서비스를 이용해 보고 있다. 뭐, 처음부터 그럴 생각은 없었지만 이용하다보니 장기적으로 이용할 서비스 업체를 찾아보는게 좋겠다는 생각이 들어서 본의 아니게 비교기 까지 작성하게 됐다.
1. Bugs (2008. 07)
3. 멜론 (2008. 09 ~)
- Player: Melon Player 프로그램. 상당히 안정적이며, 사용이 편리함. 방화벽이 있는 곳에서 사용시 streaming이 제대로 안되는 경우 발생.
1. Bugs (2008. 07)
- Player: Active-X를 이용한 web 기반 player. 안정적.
- 음원: 가요는 대부분 DRM Free로 이용 가능. 나머지는 잘 모르겠음.
- 다운로드: 대부분의 모든 곡에 대해서 128kbps부터 320kbps까지 원하는데로 다운 가능.
- Tag: Tag정리가 제대로 되어 있지 않아서, 노래 별로 재각각임. Album Cover는 대부분 없음.
2. Dosirak (2008. 08)
- Player: Dosirak Player 프로그램. 상당히 불안함 (특히 휴대폰 연결시).
2. Dosirak (2008. 08)
- Player: Dosirak Player 프로그램. 상당히 불안함 (특히 휴대폰 연결시).
- 음원: 몇몇 원하는 음악을 찾지 못했음. 몇몇 원하던 노래가 DRM이 걸려 있음.
- 다운로드: 128kbps부터 320kbps까지 선택은 가능하나, 상당히 많은 곡들이 192kbps까지 밖에 지원하지 않음.
- Tag: Tag정리는 상당히 잘 되어 있지만, 이름을 "성 이름" 처럼 조금 이상한 기준으로 되어 있어서 나의 기준에 맞도록 약간의 정리가 필요함. Album Cover도 대부분 다 있음.
3. 멜론 (2008. 09 ~)
- Player: Melon Player 프로그램. 상당히 안정적이며, 사용이 편리함. 방화벽이 있는 곳에서 사용시 streaming이 제대로 안되는 경우 발생.
- 음원: 멜론의 가장 큰 장점으로 음원이 지금까지 알고 있기로는 가장 풍부하다. 몇몇 노래들이 DRM이 걸려 있기는 하다.
- 다운로드: Melon Player를 통해서 편하게 다운로드 받을 수 있다. 128kbps부터 320kbps까지 선택하여 다운 받을 수 있지만, 192kbps까지 밖에 지원하지 않는 곡들도 상당히 많음.
- Tag: Tag정리는 일반적인 기준에 따라서 상당히 잘 되어 있어서 따로 정리할 필요가 거의 없다. Album Cover는 거의 다 있음.
4. 쥬크온 (미정)
August 05, 2008
July 28, 2008
July 17, 2008
double pointer
void **
이렇게 사용되는 pointer variabel을 double polinter라고 부른다. 사용하는 이유는 보통 single pointer variable에 메모리를 할당하기 위함이 일반 적이다. 예를 들어보자.
boolean func(char **ptr, int nSize)
{
if(*ptr != NULL) {
free(*ptr);
}
*ptr = (char *)malloc(sizeof(char) * nSize);
return (*ptr == NULL) ? FALSE : TRUE;
}
위와 같은 형식이 아마도 가장 일반적인 double pointer의 예일 것이다. 종종 위와 같은 기능을 single pointer를 이용하여도 상관없지 않냐는 궁금증을 갖게 되는 경우가 있다. 예를 들어보자.
boolean func(char *ptr, int nSize)
{
if(ptr != NULL) {
free(ptr);
}
ptr = (char *)malloc(sizeof(char) * nSize);
return (ptr == NULL) ? FALSE : TRUE;
}
결과는 전혀 다르다. Pointer variable은 주소를 담는 공간이다. 인자로 전달 받은 char *ptr은 callee가 전달한 주소를 담는 공간이며, local variable 임을 명심하자. 즉, ptr에 malloc을 통해 새로운 pointer를 할당하는 것은 local variable에 malloc을 통해서 새로운 주소를 할당하는 것과 동일한 것이다.
조금 다른 얘기지만, 종종 아래와 같은 오류가 있는 code를 볼 수 있다.
char doubleArray[2][3];
char **ppArray = doubleArray;
기본적인 문법 오류이지만, 실수하기 쉬운 부분이다. 첫번째의 multi-dimensional array의 경우 6개의 char variable이 연속으로 붙어 있는 형태를 가지며, 아래의 double pointer로 표현하고자 하는 multi-dimensional array의 경우, 2개의 char * variable이 연속으로 붙어 있고, 각 variable은 3개의 char variable이 연속으로 붙어 있는 영역을 가리키고 있다. 즉, 두 변 수 모두 multi-dimensional array를 표현하기 위한 의도를 가지고 정의 했지만, 실제로는 아래와 같이 다른 의미를 가지게 된다.
char doubleArray[2][3];
char **ppArray;
ppArray = (char **)malloc(sizeof(char *) * 2);
for(int i = 0; i < 2; i++) {
ppArray[i] = (char *)malloc(sizeof(char) * 3);
}
이렇게 사용되는 pointer variabel을 double polinter라고 부른다. 사용하는 이유는 보통 single pointer variable에 메모리를 할당하기 위함이 일반 적이다. 예를 들어보자.
boolean func(char **ptr, int nSize)
{
if(*ptr != NULL) {
free(*ptr);
}
*ptr = (char *)malloc(sizeof(char) * nSize);
return (*ptr == NULL) ? FALSE : TRUE;
}
위와 같은 형식이 아마도 가장 일반적인 double pointer의 예일 것이다. 종종 위와 같은 기능을 single pointer를 이용하여도 상관없지 않냐는 궁금증을 갖게 되는 경우가 있다. 예를 들어보자.
boolean func(char *ptr, int nSize)
{
if(ptr != NULL) {
free(ptr);
}
ptr = (char *)malloc(sizeof(char) * nSize);
return (ptr == NULL) ? FALSE : TRUE;
}
결과는 전혀 다르다. Pointer variable은 주소를 담는 공간이다. 인자로 전달 받은 char *ptr은 callee가 전달한 주소를 담는 공간이며, local variable 임을 명심하자. 즉, ptr에 malloc을 통해 새로운 pointer를 할당하는 것은 local variable에 malloc을 통해서 새로운 주소를 할당하는 것과 동일한 것이다.
조금 다른 얘기지만, 종종 아래와 같은 오류가 있는 code를 볼 수 있다.
char doubleArray[2][3];
char **ppArray = doubleArray;
기본적인 문법 오류이지만, 실수하기 쉬운 부분이다. 첫번째의 multi-dimensional array의 경우 6개의 char variable이 연속으로 붙어 있는 형태를 가지며, 아래의 double pointer로 표현하고자 하는 multi-dimensional array의 경우, 2개의 char * variable이 연속으로 붙어 있고, 각 variable은 3개의 char variable이 연속으로 붙어 있는 영역을 가리키고 있다. 즉, 두 변 수 모두 multi-dimensional array를 표현하기 위한 의도를 가지고 정의 했지만, 실제로는 아래와 같이 다른 의미를 가지게 된다.
char doubleArray[2][3];
char **ppArray;
ppArray = (char **)malloc(sizeof(char *) * 2);
for(int i = 0; i < 2; i++) {
ppArray[i] = (char *)malloc(sizeof(char) * 3);
}
July 09, 2008
Google의 작명 센스
잘 알려진 메모리 문제인 copy constructor와 assign constructor를 Google의 open source에서는 다음과 같은 이름으로 해결하고 있다. 작명 센스가 너무 마음에 든다^^
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
Subscribe to:
Posts (Atom)