Boost

Posted at 2010/04/25 21:14 // in Note/ETC // by drDorothy

Boost를 설치하려면 먼저 다운부터 받아야죠. [http://www.boost.org/]

무엇을 받아야 할까요? Boost 자체가 필요하고 빌드를 위한 Boost Jam입니다.

아무튼 두 개 다 받은 다음, 압축을 푸시고 Boost Jam안에 가보세요.

build.bat 라는 파일이 있답니다.

더블클릭해서 실행 하시면 뭔가 작업을 수행한 다음 끝날꺼에요.

다시 Jam 폴더를 보면 bin.ntx86 이라는 새로운 폴더가 만들어 지고, 그 안에 보면 bjam.exe 이 있을 거에요.

이제 bjam.exe을 복사하셔서 위에서 받은 Boost 폴더에 넣어 주세요.

이것으로 컴파일 할 준비는 끝입니다.

(취향에 따라 ICU나 Python을 깔아 두면, 해당 라이브러리도 함께 컴파일 된답니다.)

이제 cmd창을 띄우고 압축을 풀어둔 Boost 폴더로 이동하세요.

그리고 아래와 비슷하게 취향껏 입력 해 줍니다.

bjam --build-dir="C:\Library\boost_1_42_0" -sICU_PATH="C:\Library\icu" --without-mpi --build-type=complete stage --toolset=msvc

sICU_PATH는 정규식 라이브러리의 유니코드 사용 시 추가적으로 필요한 라이브러리입니다.

이렇게 입력하시고 실행을 시키면, 몇 시간 동안 컴파일이 진행됩니다....

resize_image

컴파일이 완료되면 C:\boost_1_42_0 를 인클루드 패스에 등록하시고, C:\boost_1_42_0\stage\lib 를 라이브러리 패스에 등록하면 끝!!

p.s. 가끔은 ICU를 뺀 버젼도 필요하니까..
bjam toolset=msvc-9.0 variant=release threading=multi link=static define=_SECURE_SCL=0 define=_HAS_ITERATOR_DEBUGGING=0
bjam toolset=msvc-9.0 variant=debug threading=multi link=static

2010/04/25 21:14 2010/04/25 21:14

Makefile

Posted at 2009/04/11 18:08 // in Note/ETC // by drDorothy
이번 SP 숙제하면서 급 다른 기능이 필요해서 수정..
디버그모드 릴리즈모드 구분하고, 프로파일 분석루틴 추가..
실행파일명은 현재 작업중인 폴더명으로 자동 컴파일됨

DBG_SUFFIX = _dbg

APPS    = $(word $(words $(subst /, ,$(shell pwd))), $(subst /, ,$(shell pwd)))
OBJS    = $(patsubst %.c, %.o, $(wildcard *.c))
OBJS_d    = $(patsubst %.o, %.o$(DBG_SUFFIX), $(OBJS))

CC    ?= cc
CFLAGS    = -W -Wall -std=c99
DFLAGS    = -O0 -g3 -pg -DDEBUG
RFLAGS    = -O2
LFLAGS    = -lpthread

.SUFFIXES: .o .c
.c.o:
    touch $<
    $(CC) $(CFLAGS) $(RFLAGS) -c -o $@ $<

.SUFFIXES: .o$(DBG_SUFFIX) .c
.c.o$(DBG_SUFFIX):
    touch $<
    $(CC) $(CFLAGS) $(DFLAGS) -c -o $@ $<

all: release debug

release: $(OBJS)
    $(CC) $(CFLAGS) $(RFLAGS) -o $(APPS) $? $(LFLAGS)

debug: $(OBJS_d)
    $(CC) $(CFLAGS) $(DFLAGS) -o $(APPS)$(DBG_SUFFIX) $? $(LFLAGS)

analysis:
    @gprof --brief $(APPS)$(DBG_SUFFIX)

clean:
    @rm -rf *.o *.o$(DBG_SUFFIX) $(APPS) $(APPS)$(DBG_SUFFIX) gmon.out

run:
    @-./$(APPS)
    $(APPS)

2009/04/11 18:08 2009/04/11 18:08

MRU vs. LRU

Posted at 2009/04/11 17:58 // in Note/ETC // by drDorothy
SP 과제...
A411069_김명환_결과보고서.hwp

발로쓴 결과 보고서


먼저 입력값을 그룹별로 나눠야 할 필요성이 있기에.. 크게 3가지 그룹으로 분리..

1. 랜덤한 인풋

resize_image

입력값 분포

resize_image

입력 순서

resize_image

입력 순서

그럼 성능 비교 시작..

resize_imageresize_image

이런 이런.. 별반 차이가 없군..
그냥 최대 허용 노드수만 늘리면 장땡..

2. 순차적 인풋

resize_image

입력값 분포

resize_image

입력 순서

resize_image

입력

성능은 뭐가 더 좋을까나!?..

resize_imageresize_image
그렇군열~ MRU 승..
간단히 머리 굴려보면..
계속해서 다른 수가 들어오는 것이 아니라, 어느 정도 들어온 다음에 다시 이전의 값에서부터 시작하고, MRU로 자료를 유지했다면 앞부분의 자료만 변했기에, 다시 예전의 값에서 시작할 때 Update가 호출되기땜시 승.. LRU면.. 예전께 남아 있을리 만무..

3. 말로 표현하기 힘든 인풋.. (펄스는 아니고.. 뭐라고 하지 ㅡ_ㅡ??..)

resize_image

입력값 분포

resize_image

입력 순서

resize_image

인력

성능비교 시작..

resize_imageresize_image

이번엔 LRU 승..
빈번하게 들어오는 입력값이 많으니..
기존 리스트에 있는 Data에 대한 Update 함수의 호출이 많아질 것이고..
Update 함수를 자주 사용한다면, 빈번히 호출되는 자료를 리스트의 앞쪽에 보관하게 될꺼고..
상대적으로 적게 사용되는 것들을 끝으로 밀어서 새로운 자료가 들어왔을 때..
안쓰는 것들을 지워야 효율적일테고..
위의 말 종합하면..LRU 쓰삼이란 뜻이고..
그래서 LRU의 승리고..
뭐.. 그렇고 그런 이야기 ㅡ_ㅡ..

그럼.. 코드 구현은 어떻게!??..

#include 
#include 
#include 
#include 

#ifndef TABLESIZE
#define TABLESIZE	10
#endif
#define HASH(a) ((a) % TABLESIZE)

typedef struct Node {
	int data;
	struct Node *right;
	struct Node *next;
} Node;

Node *head, HashTable[TABLESIZE];
int MaxItem, ItemCounter;

int _Insert(int data);
int Insert(int data, char* policy);
Node* Search(int data, Node** end);
void Update(Node* node);
void func_select(char* policy, Node* p);
void UnlinkMRU(Node* temp);
void UnlinkLRU(Node* temp);
void Delete(Node* node);
char* print(Node* p)
{
	static char buf[1024], t[16];
	for (	memset(buf,'\0',sizeof(char) * 1024);
		p != NULL;
		sprintf(t, "%d ", p->data), strcat(buf, t), p=p->right ) ;
	return buf;
}

void printTable()
{
	int i;
	Node* p;
	for (i=0; inext)
			printf("%d ", p->data);
		putchar('\n');
	}
}
int main(int argc, char* argv[])
{
	int data, ret;
	char mode[4];
	FILE* fp;

	if (argc != 3) exit(1);
	if ((MaxItem = atoi(argv[1])) == 0) exit(1);
	if ((fp = fopen(argv[2],"r")) == NULL) exit(1);

	memset((head=(Node*) malloc(sizeof(Node))), 0x00, sizeof(Node));

	while (!feof(fp) && fscanf(fp, "%3s %d", mode, &data))
	{
#ifdef DEBUG
		printf("input : %3s, %d\n", mode, data);
		printf("before entity list : %s\n", !ItemCounter ? "empty" : print(head->right));
#endif
		ret = Insert(data, mode);
#ifdef DEBUG
		printf("%d is %s in the list.\n", data, ret ? "missing" : "found");
		printf("after entity list : %s\n", print(head->right));
		printTable();
		putchar('\n');
#endif
	}

	printf("final entity list : %s\n", print(head->right));
	printTable();
	return 0;
}
// 실제 데이터를 리스트에 추가
int _Insert(int data)
{
	Node* temp;
	memset((temp = (Node*) malloc(sizeof(Node))), 0x00, sizeof(Node));

	temp->data = data; // 해시 테이블 연결부
	temp->next = HashTable[HASH(data)].next;
	HashTable[HASH(data)].next = temp;

	temp->right = head->right; // 우선순위 리스트 연결부
	head->right = temp;

	return ++ItemCounter;
}
// 선택적 삽입을 위한 분기점
int Insert(int data, char* policy)
{
	Node *temp, *end;

	if ((temp = Search(data, &end)) == NULL && ItemCounter < MaxItem)
		return _Insert(data); // 없는 자료 & 공간 존재

	else if (temp == NULL && ItemCounter >= MaxItem)
	{
		func_select(policy, end);
		return _Insert(data); // 없는 자료 & 공간 무
	}

	else // 이미 있는 자료일때
		return Update(temp), 0;
}
// 자료를 찾아서 존재한다면 바로 전 노드를 반환 (해시 테이블)
Node* Search(int data, Node** p)
{	// p 포인터는 RefCount를 줄여보기 위한 발악
	for (*p=HashTable+HASH(data); (*p)->next != NULL; *p=(*p)->next)
		if ((*p)->next->data == data)
			return (*p)->next;

	return NULL;
}
// 넘어온 노드의 우선순위리스트 전까지 이동해서 수정 (우선순위 리스트)
void Update(Node* node)
{
	Node *p, *target;
	if (head->right == node)
		return ;

	for (p=head; p->right != node; p=p->right) ;
	target = p->right;

	p->right = p->right->right;
	target->right = head->right;
	head->right = target;
}
// Delete 방법 호출 판단 및 레퍼런스 카운트 줄이기 대작전
void func_select(char* policy, Node* p) // 우선순위 리스트의 값
{
	static void (*fp[2])(Node*) = { &UnlinkLRU, &UnlinkMRU };
	int mode = !strcmp(policy, "MRU");
	if (!mode && p->right == NULL)
		p = (p->right != NULL && p->right->next != NULL) ? p->right : head;

	(fp[mode])(p);
}
// 앞의 노드를 삭제 -- 해시 테이블도 조절해야함 (우선순위 리스트)
void UnlinkMRU(Node* temp)
{	//여기 temp는 안씀
	temp = head->right;
	head->right = head->right->right;
	Delete(temp);
}
// 넘어오는 p의 위치에서 부터 찾도록 수정 (우선순위 리스트)
void UnlinkLRU(Node* p)
{	// 그나마 처음부터 검색하지 않게 하기 위함
	for (; p->right!=NULL; p=p->right)
		if (p->right->right == NULL)
			break;

	Delete(p->right);
	p->right = NULL; // 윗쪽에 1번 더 카운팅 되기에 여기선 안함
}
// 넘어오는노드 전까지 이동해서 삭제 (해시테이블)
void Delete(Node* node)
{
	Node *p;
	for (p=HashTable+HASH(node->data); p->next != node; p=p->next) ;
	p->next = p->next->next;
	free(node);
}

더블 리스트 쓰지 말라니.. 닥치고 쓰지 말아야지 ㅡ_ㅡ..
말을 참 잘 듣는 착한 학생..
2009/04/11 17:58 2009/04/11 17:58

KW-825 드라이버

Posted at 2009/01/30 15:08 // in Note/ETC // by drDorothy
보드를 지른관계로..
시리얼 포트가 없는 이 병삼 노트북을 위하여 컨버터 구입......ㅜ_ㅜ
이놈이 드라이버가 없으면 자동으로 안잡아 주기 때문에..
항상 수동으로 잡아줘야한다..

암튼..

이제 장난감(?) 가지고 놀아볼까..ㅋ
2009/01/30 15:08 2009/01/30 15:08

ASCII Table

Posted at 2009/01/15 11:22 // in Note/ETC // by drDorothy
resize_image

프로그램 만들다가 원래 가지고 있던 아스케 테이블에 바이너리값이 없어서 답답했던 관계로..
엑셀로 낼름 만들어봤음.. ㅡ_ㅡ.. (엑셀 만쉐이~)
2009/01/15 11:22 2009/01/15 11:22