2007/12/17

(cygwin에서) profile 만들기

  1. 컴파일 option에 "-pg" 추가
  2. run application
    1. 이때 "gmon.out" 이라는 파일이 만들어 짐
  3. gprof application gmon.out > profile.txt
  4. profile.txt 분석

2007/10/05

생각의 탄생

간만에 읽은 전공서적이 아닌 책.
누군가의 블로그를 보다 한번 읽어보면 좋겠다는 생각이 들어 주저없이 주문하고 읽음. 주제는 마지막 장에 있는 "전인을 길러내는 통합교육"인것 같은데... 이런 내용으로 상당한 분량의 글을 쓸수 있다는 것에 대해서 놀람. 상당한 분량의 인용도...

  • 생각을 다시 생각하기
  • 상상력을 학습하는 13가지 생각도구
    1. 관찰
    2. 형상화
    3. 추상화
    4. 패턴인식
    5. 패턴생성
    6. 유추
    7. 몸으로 생각하기
    8. 감정이입
    9. 차원적 사고
    10. 모형 만들기
    11. 놀이
    12. 변형
    13. 통합
  • 전인을 길러내는 통합교육

2007/09/17

Lean Software Development

"린 소프트웨어 개발". 출판사 : 인사이트
예약 판매때 주문해서 이제야 다 읽었다.
(삼색볼펜 학습법? 에 의하면 이제야 1/3 읽은 거지만...)

폭포수 모델이 달이 아닌 달을 가리키는 손가락을 본것에서 비롯된 잘못된 해석이었다면,
이 책은 손가락이 아니라 달을 보게 하는 책인것 같다.

2007/09/13

next_permutation

C++ STL을 보면 next_permutation이란 알고리즘(?)이 있다.
int A[] = {1,2,3};
int N = sizeof(A) / sizeof(int);
next_permutaion(a, N)
이렇게 하고 나면 A에는 {1,3,2}가 저장되는데, {1,2,3}으로 만들수 있는 조합 중 다음번 조합을 구하는 함수이다.
그런데, 세자리 숫자로 표현할수 있는 모든 수를 구하는데는 문제가 있다.
예를 들어 {1,2,3} 다음 수로 {1,2,4}를 원할때는 next_permutation을 사용하기는 무리가 있다.
그래서... 비슷한거 하나 만들어 버렸다.
C로... :-)

얼마전에 배운 TDD도 살짝 도입하고... cgreen이라는 Test framework도 사용하고... ㅋㅋ
코드는 정리되는대로...

#include
#include

#include "cgreen/cgreen.h"

#define FALSE 0
#define TRUE 1

void PrintArray(int *start, int *end)
{
while(start != end) {
printf("%d ", *start);
start++;
}
printf("\n");
}

/**
* [start, end]에 num이 있는지 검사.
* 있으면 TRUE, 없으면 FALSE를 return한다.
*/
int is_exist(int *start, int *end, int num)
{
while(start <= end) {
if(num == *start) return TRUE;
start++;
}

return FALSE;
}

/**
* [start, end]를 검색해서 중복되지 않고 end에 사용할수 있는
* 숫자를 return한다.
*
* 예를 들어 [0,1,2]면 *num은 3을 가진다.
*/
int guess_number(int *start, int *end, int *num)
{
int i = 0;
int try = *end;

for(i = *end; i < 10; i++) {
if(is_exist(start, end, i) == FALSE) {
*num = i;
return TRUE;
}
}

return FALSE;
}

/**
* [start, end)에 저장되어 있는 조합 다음의 조합을 구한다.
* 가능한 조합이 있으면 TRUE, 없으면 FALSE를 return하고
* 결과는 [start, end)에 저장된다.
*
* Ex)
* int A[4] = {1,2,4,6};
* next_perm(A, A+4)
* ==>
* A는 {1,2,4,7}이 저장된다.
*/
int next_perm(int *start, int *end)
{
int *adj_ptr = end-1;
int num = 0;

while(adj_ptr >= start && adj_ptr < end) {
/*
* start ~ adj_ptr까지 검색결과 마지막 자리에 넣을 숫자가
* 있는지 검사.
* 있으면 adj_ptr에 그 숫자를 넣고,
* 없으면 adj_ptr을 앞으로 이동하여 다시 검사한다.
*/
if(guess_number(start, adj_ptr, &num) == TRUE) {
*adj_ptr = num;
adj_ptr++;
if(adj_ptr == end) {
return TRUE;
}
}
else {
*adj_ptr = -1;
adj_ptr--;
}
}

return FALSE;
}

void test_is_exist()
{
int A[4] = {1,2,3,4};

assert_equal(is_exist(A, A+4, 4), 1);
assert_equal(is_exist(A, A+4, 3), 1);
assert_equal(is_exist(A, A+4, 1), 1);
assert_equal(is_exist(A, A+4, 0), 0);
}

void test_guess_number()
{
{
int A[4] = {1,2,0,4};
int result;

assert_equal(guess_number(A, A+3, &result), 1);
assert_equal(result, 5);
}

{
int B[4] = {1,2,3,9};
int result = 0;
assert_equal(guess_number(B, B+3, &result), 0);
assert_equal(result, 0);
}
}

void test_perm()
{
int A[4] = {1, 2, 3, 4};

assert_true(next_perm(A, A+4));
}

int main(int argc, char *argv[])
{
if(argc == 2 && strcmp(argv[1], "-test") == 0) {
TestSuite *suite = create_test_suite();
add_test(suite, test_is_exist);
add_test(suite, test_guess_number);
add_test(suite, test_perm);
run_test_suite(suite, create_text_reporter());

return 0;
}

int A[] = {0, 9, 8};
int N = sizeof(A) / sizeof(int);

printf("inital value...\n");
PrintArray(A, A+N);
printf("next permutation is...\n");
next_perm(A, A+N);
PrintArray(A, A+N);

/*
while(next_perm(A, A+N)) {
PrintArray(A, A+N);
}
*/
}



2007/05/28

책... 지르다.

"The Goal"을 밤새가며 읽고, "면장선거" 대충 보고 있는데...
구미 출장가는 길에 "살인의 해석"을 질러 버렸다.
신문에 광고할때부터 보고 싶긴 했었고, 기차에서 할일이 없다는게 가장 큰 이유. :-)

이번달엔 책을 많이 보는것 같네.. ㅎㅎ

한빛미디어에서 "Head First Object Oriented Analysis & Design : 세상을 설계하는 객체지향 방법론"을 번역했나 보다. 원서로 사서 볼까도 생각했었는데, 번역서가 나와서 다행이다. 6월 도서지원비로 질러야지.. ㅋㅋ

2007.05.30 오전
"살인의 해석" 다 읽었다.
마지막에 반전및 해석이 있었고, 오랜만에 등장인물 소개가 나오는 책이었다. :-)
처음엔 조금 지루한 점이 있었는데, 중반이후 책 덮기가 아쉬울 정도.
이제... "Head First..." 만 지르면 된다.. ㅋㅋ

자동차 사고나다.

금요일 출근길... 저녁에 갈곳이 있어 간만에 차를 몰고 나왔는데...
앞차가 급정거 하는 바람에...
브레이크를 밟았지만... 너무 가까웠나 보다.

앞차 뒤쪽 범퍼가 망가지고, 내차 앞쪽이 밀려 버렸다. --;
앞쪽 범퍼가 찌그러 지고, 프레임이 휘었다네...

이번달 카드값은 어떻게 메울려나... 흑흑..

2007/05/14

링크

1주일이면 다 보겠지 생각했었는데, 어느덧 한달이 넘어 버렸다.
출판된지는 3~4년 된 책인데, 이제서야 읽었다.
기억나는것은...
  • (Social) Network에서 무작위로 선택된 노드 사이의 간격은 크지 않다 : 이것은 예전에도 알고 있었기 때문에 별로 놀라진 않았음
  • 파레토의 법칙(20/80법칙) : 이것도 알고 있었는데, 이책에서 한번더 확인하는 기회가 되었음.
  • 인터넷은 척도없는(Scale free) Network이다. : 노드와 노드가 무작위로 연결되어 있지 않고 대규모 허브를 중심으로 연결되어 있고, 이런 허브들간의 연결성.
  • 검색엔진으로는 모든 인터넷 검색이 불가능하다 : 검색엔진의 발전 속도보다 인터넷 발전속도가 빠르며 "링크"를 기반으로 검색하는 엔진으로는 단적된 노드를 검색하는것은 불가능하다.
머 이정도 되는데... 알고 있었던 부분을 확인하는것과 좀더 잘 알았게 되었다 정도...

2007/05/04

Semaphore, Mutex

지금까지 Semaphore나 Mutex나 Critical Section에 안전하게 진입하기 위한 방법으로 알고 있었다.
근데... 왜 VxWorks에서는 Mutex와 Binary Semaphore가 따로 구별되어 있는걸까?

잠깐 구글한테 물어보니 그 이유를 알것 같다.
대부분의 경우 Mutex를 Binary Semaphore처럼 사용하고, 그렇다 라고 생각하는 사람이 많은것 또한 사실이다.
하지만 VxWorks는 재귀적인 작업이 예상되는 곳에는 Mutex를, 단순히 Signal Send/Receive를 목적으로 할때는 Semaphore를 권하는것 같다.
VxWorks Training Workshop 책자를 보면 Mutex와 Semaphore의 차이를 설명하고 있는데, Mutex에서는 task ID를 검사하는 부분이 있다.

Mutex로 Lock(semTask)했을 경우 Lock한 thread에서만 Release(SemGive) 할수 있고... Lock한 thread가 다시 진입할때는 Ownership Count를 증가시키고 진입이 가능하다.


== 잊어먹기 전에 메모하기 ==

2007/04/15

추억의 뽑기?

유진이가 뽑기에서 뽑은 금붕어 사진.
뽑을때는 좋아하더니만 한번 맛을 보고는 찬밥신세가 되었다.

2007/04/12

구글 나이트

구글 나이트에 다녀왔습니다.
출장갔다 바로 참석하게 되어 꾀죄죄한 모습과 피곤이 쌓여 있었지만, 참석하길 잘했다라는 생각이 들었습니다.

행사 내용은 다른 분들의 참관기(?)와 별로 다르지 않았습니다. 물론 QnA에서 나온 내용은 참석한 사람과 질문 내용에 따라 달라지겠지만... 그런것은 누구와 함께 있어 많은 정보를 들었다라는 태도보다 내가 이런 질문을 했고 이런 답을 들었다가 중요하겠지요.. (딴길도 샜습니다. :-( )

행사 내내 의문이 있었는데(나름대로 결론은 내렸지만) 구글 한국 R&D 센터가 왜 적극적으로 이런 행사를 할까 하는 것입니다. 다른 기업들도 R&D 센터가 있긴 하지만 한달에 2~3번 사람들을 초청해서 소개하는 자리는 마련하지 않고 있지요. 기업문화의 차이일까요? 아니면 괜찮은 인력을 모집하기 위해서 일까요? 그냥 구글에 대한 소문의 진상을 직접 밝힌다 라고 하기엔 좀...

그리고 대부분의 관심사였던 채용에 대해서도 직접 들었습니다.
모집부분은 "SW 엔니지어". 구글에서 인정할수 있는 기본(?)능력을 갖춘 사람을 뽑는다는 예기인것 같았습니다. 그리고, 면접관도 같은 SW 엔지니어. 그래서 지원자와 면접관이 대화가 가능한, 공통적으로 알고 있는 알고리즘에 대한 질문이 많이 나오는것 같습니다. 특정분야에 국한된 전문지식은 면접관 보다 지원자가 더 많이 알고 있겠지요. :-)

그리고, 구글이 "일하기 좋은 일터"라는 것, 직원에 대한 배려가 좋다는 것, 이런것은 직원이 그만큼 능력이 되기 때문에 가능하다는 생각이 들었습니다. 그냥 동영상에서 볼때는 그쪽에 있는 사람이나 아닌사람이나 똑같아 보이지만, 실제로는 그만큼 받을 가치가 있는 사람들이라는...

2007/04/04

소프트웨어 컨플릭트 2.0

도서지원비가 부활되어 책 사는 부담은 줄었지만,
어떤 책을 살까.. 하는 또다른 고민이 생겼다.

3월에 산 책은 "소프트웨어 컨플릭트 2.0".
저자, 역자 모두 유명한(?) 사람이고, 서평도 그럭 나쁘지 않았지만..
역시... "아는 만큼 보인다"라는 말을 실감했다.

소프트웨어 공학에 대해서 아직 내공이 부족한 것인지
아직 나에겐 그닥 느낌이 오지 않는...
예전의 모습과 현재 S.E의 모습을 비교할수 있으면 좋을텐데...

2007/02/25

AVI 파일에서 MP3 추출

AVI 파일에서 MP3 추출하기 위해서는...
준비물
  1. mplayer
  2. Audacity

하는 방법
  1. AVI에서 소리 부분만 뽑아낸다.
    1. mplayer -vo null -ao pcm 동영상파일
    2. 이렇게 하면 "audiodump.wav" 파일이 만들어진다.
  2. 소리 부분을 Audacity로 편집한다.
이렇게 만들어진 파일을 Audio CD로 구우면 끝

2007/01/30

이솝보드 부팅 ^^

구입하고 랜카드 문제때문에 그냥 모셔놓고 있었는데,

드뎌 어제밤 부팅화면을 봤다. ㅋㅋ

처음엔 설마 랜카드가 문제가 될까 했었는데, 랜카드 위치를 이리 저리 바꿔 보니 되네..

그간 컴이 멈추던 현상도 거의 없어졌고... 온보드 랜카드랑 구입한 거랑 쫑났었나 보다.



어째든... Linux로 부팅하고, 쉘에서 몇가지 프로그램을 돌려봤으니까 이제 프로그램만 올려보면 된다. 흐~~


powered by performancing firefox

엘빈토플러 [부의 미래]

"부의 미래"이후 산 책:

- TCP/IP 소켓 프로그래밍

- 생각을 바꾸는 패턴

이 중 TCP/IP 소켓 프로그래밍은 친숙한 내용이고, 책도 별로 어렵지 않아 거의 다 봤고... 생각을 바꾸는 패턴은.. 꾸역꾸역 다 읽었는데, 별로 감흥이 없다.

차다리 "Pattern Oriented Software Architecture"나 계속 볼걸...



이제 "Writing Effective UseCase"만 보면 된다. 흐~~





powered by performancing firefox

2007/01/12

엘빈토플러 [부의 미래]

드디어 다 읽었다.

근 한달은 걸린것 같네. (작년 12월 12일 샀으니까...)

역시 이런 책은 아는 만큼 보인다는 말을 실감한다.

그리고 내가 이런쪽으로는 소질이 없다는 것도 :-(

그래서 전체적인 흐름보다는 간간히 나오는 눈에 띄는 문장들이 더 와닿는지도 모르겠다.



빠르게 변화하는 지식기반 사회에서 동시성과 부의 미래라...





powered by performancing firefox