구조체 배열 길이 구하기

typedef struct {
int a;
int b;
....
} ITEM;

ITEM items[] = { .... };

있을때 배열 items 길이(원소의 갯수)는,

int items_len = sizeof(items)/sizeof(ITEM);

구조체나 배열길이가 변경되어도 상관없어서 유용하다.

by 그린데이 | 2010/03/31 15:22 | c/c++ | 트랙백 | 덧글(0)

문자열 검색시 match whole word, match case sensitive 간단구현

int search_string(char *str, char *search_str, int match_case, int match_whole)
{
char *cptr = NULL;
int search_str_len = strlen(search_str);
if (match_case) cptr = strstr(str, search_str);
else cptr = strcasestr(str, search_str);

if (!cptr) return -1;

if (!match_whole) return (cptr-str);

/* cptr 앞뒤로 알파벳있으면 not match */
if (cptr-str > 0) {
if (isalpha(*(cptr-1))) return -1;
}
if (cptr+search_str_len == NULL) return (cptr-str); // end of string

if (isalpha(*(cptr+search_str_len))) return -1;

return (cptr-str);
}

문자열 찾으면 인덱스 값 리턴, 못 찾으면 -1 리턴

by 그린데이 | 2010/03/31 14:50 | c/c++ | 트랙백 | 덧글(0)

strcasestr - 대소문자 구분않하는 strstr 함수

strstr 은 일반적으로 많이 알려진 함수로 목적 문자열에서 부분 문자열(substring)을 찾아준다.

이 함수는 대소문자를 구분해서 검색하는데 strcasestr 함수를 사용하면 대소문자를 구분하지않고

매칭되는 부분 문자열을 찾아준다. 사용법은 strstr과 똑같다.

char str1[] = "THESE are TEST";
char str2[] = "test";
char *cptr = strcasestr(str1, str2); // --> 대소문자 구분않하므로 "TEST" 를 찾아준다
char *cptr2 = strstr(str1, str2); // --> 대소문자 구분하므로 null
printf("cptr: %s\n", cptr);
printf("cptr2: %s\n", cptr2);

by 그린데이 | 2010/03/31 14:18 | c/c++ | 트랙백 | 덧글(0)

구조체 길이 정렬(align) 없애기

typedef struct DATA_T {
int a;
char b;
} DATA;

위와 같이 구조체를 선언했을때 sizeof(DATA) 길이는 int(4)+char(1)=5 가 아니라 8 바이트가 된다.

이유는 컴파일러가 최적화를 위해 구조체의 길이를 4의 배수(보통)로 맞추기 때문이다. 5 바이트에 3 바이트 패딩(padding)

을 더해서 8 바이트로 맞추는 것이다. 프로그램 내부적으로 사용될땐 효율적이고 문제가 없지만 다른 모듈과의 연동이나

통신 등을 할때는 문제가 생긴다. 따라서 

typedef struct DATA_T {
int a;
char b;
} DATA __attribute__((packed));

와 같이 해주면 정렬(align) 하지않고 구조체를 있는 그데로 사용한다. sizeof(DATA) 는 당연히 5 바이트가 된다.


by 그린데이 | 2010/03/31 14:02 | c/c++ | 트랙백 | 덧글(0)

텍스트,정보 그리고 구글

2002년 1월, 대학4학년에 진학할즈음 우연한 기회에 미국 연수를 가게 되었다. UCR(University of California at Riverside)이라는 학

교였는데 당시 아주아주 무식했던 나는 그냥 미국에 있는 허접한? 학교라고만 생각했다. 왜냐.. 학교 홈페이지를 들어가봤는데 화면

에 나오는것이라곤 jpg 그림파일 한 개와 허연바탕에 깨알같은 글씨밖에 없어서였다. -_-';;

2000년대초 한국은 그야말로 포털 춘추전국시대였다. 네이버,다음,라이코스,드림위즈,야후 등 닷컴거품을 등에입은 포털들이 그야

말로 우후죽순으로 생겨나고 없어지던 시대였다. 지금도 그렇지만 당시에도 어느 홈피,사이트를 가던 화려한 플레쉬와 쓸데없는 이

미지 파일들로 사이트를 꾸미고 덧칠하던 시기였다. 

당시 나는 그런 사이트들(네이버를 포함해서)이 너무너무 싫었는데 느린 컴퓨터성능(당시엔 듀얼코어도 없었음)에 비해서 사이트 

로딩 속도가 너무 느렸기때문이다. 그리고 무엇보다 내가 원하는 '정보'를 얻을 수가 없었기 때문이다. 당시 기억에 내가 본 것이라

곤 두둥실 떠다니는 광고배너와 도무지 의미를 알수 없는 텍스트 창 몇 개가 전부 였던것 같다. 

생각해보면 '검색창'이라는 곳에 단어를 입력해서 '내가 원하는 정보'를 얻은 기억이 '전혀' 혹은 '거의' 없었다. 

당시 대학생이라서 특별하게 중요한 정보를 찾을 일이 없어서였을수도 있겠지만 어째뜬 그랬다.

다시 UCR 연수 얘기로 돌아가서, 처음 기숙사를 배정받을때 오리엔테이션이라는 걸하면서 가이드북 한권을 받았다. 페이퍼백이라

는 한국의 전화번호부 종이재질 정도로 된 책이었는데 깨알같은 글씨로 뭐가 적혀있는데 읽어보지도 않고 라커에 쳐박아두었다.

4주간 기숙사생활을 하면서 저녁에 자주 주변 마트를 찾았는데 걸어서 15분정도 걸렸고 짐을 가져오기도 힘들었다. 4주차에 접어

들었을때 브라질 친구가 뭘 먹고있길래 어디서 샀냐고 물었다. 그 친구는 바로옆 마트에서 샀다고했다. 바로 옆에 마트가 있다고?

그걸 어떻게 알았냐고 물었는데 오리엔테이션때받은 책에 다 있다고했다. 이런! 라커를 열어서 가이드북을 읽어봤다. 마트에 관한

내용이 다 있었다. 어디가 가깝고 어디가 싸고 어떤 물건을 주로 팔고 등등의 정보가 있었다. 가이드북을 처음부터 찬찬히 읽어

봤다. 책에는 그 대학에서 생활에 필요한 그야말로 '정보'가 들어있었다. 그 깨알같은 글씨들이 전부 깊이있는 '정보'였던 것이다!

다시 학교 홈페이지에 들어가봤다. 여기저기 링크들을 클릭해서 내용들을 봤는데 그 '정보'의 깊이에 감탄했다. 

홈피에 접속한 사람이 관심을 가질만한 정보들이 거기 다 있었다. 비교를 위해 국내 대학들 홈피에 접속해봤다. 일단 외향은 화려

하다. 플레쉬는 기본이다. 하지만 '정보'랄 만한게 없다. 대부분 게시판이란게 있는데 주로 공지사항이나 개인의견을 게재하는곳

이지 정보랄 만한건 거의 없다. 참고로 미국대학 홈피엔 게시판이란게 거의 없다. 개인의견을 말하려면 사이트 운영자에게 메일을

보내면된다. 

이때 내가 배운것은 결국 정보는 텍스트로 기록될 수 밖에 없다는 것이다. 물론 몇몇 예외도 있다. 비디오나 오디오,멀티미디어 

매체가 더 나은 경우가 있지만 거의 대부분의 정보는 텍스트 즉 문자로 기록되는 것이 가장 효율적이며 어떤면에서 유일무이한

방식이다. 이런 평범하고도 당연한 사실을 미국인들은 실천하고 있었던것이다. 

그들은 엄청나게 많고도 깊이있는 텍스트 자료 - 서적,서류,문서 등을 가지고있다. 웹은 단지 이런 텍스트정보들을 기록하는 장소

에 불과하다. 그냥 가지고있는 책 내용을 그데로 타이핑하면 그 사이트는 중요한 정보를 가진 사이트가 되는것이다. 플레쉬나 예쁜

그림을 넣을 이유가 없다. 사용자들이 사이트에 접속해서 원하는 정보의 내용을 읽으면된다. 

다음은 구글 이야기인데 과연 구글검색에 사용된 알고리즘이 한국에서 시작되었다면 성공했을까 하는 의문이다. 구글은 사용자가

원하는 사이트를 찾아주는 서비스를 제공하는데 90년대말 2000년초 당시에 한국에 '정보'라는걸 담은 사이트가 몇개쯤 되었을까?

대학을 예를 들면, 일단 접속하면 메인화면에 학교본부건물,환하게 웃는 교수와 학생들,캠퍼스 풍경 등의 순으로 플레쉬가 뜬다.

메뉴를 클릭해보면 간단한 대학소개,총장님 말씀,공지사항,오시는 길 정도의 정보가 있다. 학과별 카테고리로 들어가면 역시 

간단한 학과소개,과목소개,커리큘럼,게시판 정도가 있다. '정보'랄 만한것이 별로 없다. 애당초 그런것들을 책이나 문서로 만들어

놓은게 없으니 올릴 내용이 없는건 당연한건지도 모르겠다. 구글에서 검색해서 사이트에 접속해도 정보랄 만한게 없으니 구글을 

사용할 이유가 별로 없어보인다. 네이버는 어떨까? 네이버에서 한국인이 많이 찾는 키워드 검색을 하면 짧게 요약되고 보기좋게 

포장된 정보를 보여준다. 사이트를 찾아주는게 아니라 백과사전처럼 자체 보유한 데이터베이스에 저장된 정보를 보여주는 방식이

다. 당시 한국적인 웹 환경에서는 네이버같은 방식이 더 유용했던것 같다. 깊이있는 정보는 부족하지만 짧게 읽어볼 정보는 꽤 유용

하다.

그런데 몇년전부터 한국도 웹환경에 많은 변화가 생겼다. 블로그라는게 생기고 사람들은 자신들의 전문지식이나 정보를 블로그

에 올린다. 구글검색을 통해 얻게되는 정보 중에 블로그에서 얻는 경우가 상당히 많다.(그래서 나도 블로그를 개설했다)

사소한 것이라도 자신이 알아낸 정보를 블로그에 올리면 누군가 유용하게 사용할수가 있다. 이런걸 웹2.0 이라고 하나?

어쨌든 이젠 시맨틱웹검색 이라는 말이 유행한다. 단순한 키워드 검색방식을 넘어 문장의 의미를 파악해서 관련 사이트를 찾아

주는 검색이다. 이것도 역시 텍스트 검색이다. 멀티미디어 검색이란게 있지만 알고보면 동영상 제목,설명 등을 검색해서 찾아

주는 방식이거나 아예 사용조차 하지않는 경우가 대부분이다. 결국 정보는 텍스트고 구글은 텍스트 검색을 해서 정보를 찾아준다.


간단한 얘기를 너무 장황하게 쓴 것같다. 짧게 요약하면,

1. 모든 정보는 텍스트로 기록(저장)된다.

2. 따라서 웹에서도 텍스트로 정보를 기록하는 것이 중요하다.

3. 구글은 텍스트 검색으로 정보를 찾아준다.

4. 따라서 구글은 위대한 회사다(?)

by 그린데이 | 2010/03/30 12:59 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶