This week, I visited my parents' house. My sisters and brothers in law also came to my parents' house to celebrate my father's birthday. Actually, my father's birthday is fifteenth, Jan but that day is not weekend, so we gathered this weekend. 


We had delicious food my mom cooked, and played korean traditional card game "go and stop". My father said that he was very happy and thank you for visiting him. 



I played with my two nephews and I gave them dolls. They looked like very happy.






My wife was so tired because of preparing foods and washing dishes. I help her wash dishes and after came back home, I have her some massage.

저작자 표시
신고
by danguria 2016.01.10 19:07

Flower's goal was to design a diagrammatic programming language based on flow chart and develop integrated development environment.  This is demo videos. If you cannot watch the video clearly, please download the demo files and play it.

Change figures' level of layer.mp4

Copy, paste and cut the figures.mp4

Create figure and change its attribute.mp4

Procedure.mp4

Run the program and debug it.mp4


< Run the program and debug it>


< Create Figure and change its attributes>


< Copy, paste and cut the figures>


< Change figures' level of layer>


< Procedure>


저작자 표시
신고
by danguria 2016.01.10 18:39

This project is for researching rootkits and the way to detect it. In this projects, I researched hidden registry key detection module and IDT(Interrupt Descriptor Table)












































저작자 표시
신고
by danguria 2015.11.05 18:17

Virtual Bridge is a convenient and original solution to interact between digital devices that can share its media contents through Argument Reality. 



Step1.

Register source object such as camera that hold media contents such as digital camera and target like Television that can play media contends.




Step 2.

Select contents from the source object and drag and drop on the target object.



Step 3.

If Object can both hold media contents and play it, Virtual bridge also can play contents through virtual bridge.




저작자 표시
신고
by danguria 2015.11.05 17:32

[모듈과 커널 버전]


커널의 버전 확인하는 방법 : /linux/version.h


#define UTS_RELEASE "2.6.14.6"

#define LINUX_VERSION_CODE 132622

#define KERNEL_VERSION(a, b, c) (((a) <<16) + ((b) <<8) + (c))


예제)

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10)

MODULE_PARM(user_name, "char");

#else

MODULE_PARM(user_name, "s");

#endif


[모듈과 static 선언]


리눅스 커널은 커널전체가 하나의 프로그램이다. 그래서 기본적으로 (전역)함수나 전역 변수를 만들면 다른 모듈에서 접근이 가능하다. 그래서 이를 제어하기 위해서는 static 키워드를 적절히 사용해 주어야 한다.


공개된 함수나 변수등의 심볼들은 /proc/kallsyms에서 확인할 수 있다.


참고로, 2.6에서는 static없이 만들어신 함수는 자동으로 공개 되지 않는다.



저작자 표시
신고
by danguria 2012.11.23 07:31

C에서 프로그램 수행 시간 측정 방법

#include "stdio.h"
#include "time.h"

void main()
{
clock_t before;
double result;
before = clock();

for ( int i = 0; i <32765; i++ ) printf("%dn", i );
result = (double)(clock() - before) / CLOCKS_PER_SEC;

printf("걸린시간은 %5.2f 입니다.n", result); 

} 


저작자 표시
신고
by danguria 2012.11.22 10:08

1. 설정 파일 위치

/etc/screenrc


2. 유용한 옵션

# turn visual bell on

vbell on

vbell_msg "   Wuff  ----  Wuff!!  "


저작자 표시
신고
by danguria 2012.11.21 09:42

1. 2.6커널용 Hello_Module 작성


#include 
#include 
#include 

// init routine
int __init init_hello(void)
{
    printk(KERN_ALERT "[Module Message] Hello, Module.\n");
    return 0;
}

// finish routine
void __exit exit_hello(void)
{
    printk(KERN_ALERT "[Module Message] Do you realy want to break up with me?\n");
}

module_init(init_hello);
module_exit(exit_hello);

MODULE_LICENSE("GPL");

2. 2.6 모듈 빌드용 Make 파일



obj-m = hello_module.o
ARCH := arm
KDIR := /project/falinux/kernel/build_s5pv210
CROSS_COMPILE := arm-generic-linux-gnueabi-
PWD := $(shell pwd)

defaule:
        $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
        rm -rf *.ko
        rm -rf *.mod.*
        rm -rf .*.cm
        rm -rf *.o

3. 2.6커널에서 모듈 로드


insmod hello_module.ko

저작자 표시
신고
by danguria 2012.11.21 07:21

문제 출처 : http://www.jungol.co.kr/prog/Hanal/hanalView.php?qs_code=1889


나의 답 : 아래 코드이다.. 하지만 N = 13일경우 1초내에 계산이 안되서 accepted되었다..ㅠㅠ 속도 향상할 수 있는 point를 찾아야 겠다..


#include 
#include 
#define DEBUG 0
#define MAX_QUEENS 14

int g_cols[MAX_QUEENS]; // represent of chess board
                        // g_cols[index] : column, index : row
int g_num_queens;
int g_num_possible_sequence;

void SetInputFromFile(const char* fileName);
void PrintAnswerToFile(const char* fileName);
void NQueen(int irow);
int isThreathen(int irow);
void Print_Queen();

int main() {

    SetInputFromFile("input.txt");
    g_num_possible_sequence = 0;
    NQueen(0);
    PrintAnswerToFile("output.txt");

    return 0;
}

void SetInputFromFile(const char* fileName) {
    FILE *input = fopen(fileName, "r");
    if (input == NULL) {
        fprintf(stderr, "Can NOT open file: \n", fileName);
        goto bail;
    }

    //TODO:
    fscanf(input, "%d", &g_num_queens);
    fclose(input);
    return;
bail:
    if (input != NULL) fclose(input);
}

void PrintAnswerToFile(const char* fileName) {
    FILE *output = fopen(fileName, "w");
    if (output == NULL) {
        fprintf(stderr, "Can NOT open file: \n", fileName);
        goto bail;
    }

    //TODO:
    fprintf(output, "%d\n", g_num_possible_sequence);
    fclose(output);
    return;
bail:
    if (output != NULL) fclose(output);
}

void NQueen(int irow) {
    int icol;
    if (DEBUG) {printf("nqueen(%d)\n", irow + 1); Print_Queen();}
    if (isThreathen(irow)) {
        if (DEBUG) {printf("irow(%d) is Threathen\n", irow);Print_Queen();}
        return;
    }
    if (irow == g_num_queens) {
        if (DEBUG) {printf("completed\n");Print_Queen();}
        g_num_possible_sequence++;
        return;
    }

    for (icol = 1; icol <= g_num_queens; icol++) {
        g_cols[irow + 1] = icol;
        NQueen(irow + 1);
    }
}

int isThreathen(int irow) {
    int k; // irow 보다 작은 row를 가리키는 index
           // TODO : rename k

    for (k = 1; k < irow; k++) {
        if (g_cols[irow] == g_cols[k]
            || abs(g_cols[irow] - g_cols[k]) == (irow - k)) {
            return 1;
        }
    }

    return 0;
}

void Print_Queen() {
    int i;
    for (i = 1; i <= g_num_queens; i++) {
        printf("%d ", g_cols[i]);
    }
    printf("\n");
}


저작자 표시
신고
by danguria 2012.11.20 10:17
출처 : http://www.jungol.co.kr/prog/Hanal/hanalView.php?qs_code=2499
 2011.KOI.전국.초등부

#include 
#define DEBUG 1
#define MAX_WEIGHTS 1000

void SetInputFromFile(const char* fileName, int *num_weights, int *weights);
void PrintAnswerToFile(const char* fileName, int min_umw /*minimum unmeasurable weight*/);
int GetMinUnmeasurableWeight(const int num_weights, int *weights);
void SortWeight(int num_weights, int* weights);

int main() {

    int num_weights;
    int weights[MAX_WEIGHTS];

    SetInputFromFile("input.txt", &num_weights, weights);
    PrintAnswerToFile("output.txt", GetMinUnmeasurableWeight(num_weights, weights));

    return 0;
}

void SetInputFromFile(const char* fileName, int *num_weights, int *weights) {
    int i;
    FILE *input = fopen(fileName, "r");
    if (input == NULL) {
        fprintf(stderr, "Can NOT open file: \n", fileName);
        goto bail;
    }

    //TODO:
    fscanf(input, "%d", num_weights);
    for (i = 0; i < *num_weights; i++) {
        fscanf(input, "%d", &(weights[i]));
    }
  
    fclose(input);
    return;
bail:
    if (input != NULL) fclose(input);
}

void PrintAnswerToFile(const char* fileName, int min_umw /*minimum unmeasurable weight*/) {
    FILE *output = fopen(fileName, "w");
    if (output == NULL) {
        fprintf(stderr, "Can NOT open file: \n", fileName);
        goto bail;
    }

    fprintf(output, "%d\n", min_umw);
    fclose(output);
    return;
bail:
    if (output != NULL) fclose(output);
}

int GetMinUnmeasurableWeight(const int num_weights, int *weights) {
    int pmr; // possible_measurement_range
    int nw;  // new_weight
    int i;

    SortWeight(num_weights, weights);

    pmr = 0;
    for (i = 0; i < num_weights; i++) {
        nw = weights[i];
        if (nw - 1 > pmr) {
            return pmr + 1;
        }
        pmr += nw;
    }
    return pmr + 1;
}

void SortWeight(int num_weights, int* weights) {
    int i, j, temp;

    for (i = 0; i < num_weights; i++) {
        for (j = i + 1; j < num_weights; j++) {
            if (weights[i] > weights[j]) {
                temp = weights[i];
                weights[i] = weights[j];
                weights[j] =  temp;
            }
        }
    }
}


저작자 표시
신고
by danguria 2012.11.19 23:27

arm에서 사용하는 cpu_info 구조체는 /arch/arm/include/asm/cpu.h

에 struct cpu_info_asm {...}으로 정의 되어 있다.


이 정보는 책과는 달라서 타겟의 proc/cpuinfo를 보려고 하였으나, proc파일시스템이 없는 것이다!!!!!

허걱....


그래서 FALINUX포럼에 가서 proc파일 시스템 만드는 법이 있길래 해보려고 했다..

하지만, 아직 실력이 부족해서 뭔 말인지 모르겠다.ㅠㅠㅠ


나중에 실력좀 쌓이면 타겟에 간단하게나마 proc파일 시스템을 올려 보아야 겠다.

저작자 표시
신고
by danguria 2012.11.19 07:26

출저 : 정올 (http://www.jungol.co.kr/prog/Hanal/hanalView.php?qs_code=1370)


#include <stdio.h>

#define DEBUG  1


typedef struct {

    int requested_order;

    int start_hour;

    int end_hour;

}MEETING;


MEETING g_requested_meetings[501];

int     g_num_requested_meetings;

MEETING g_scheduled_meeting[501];


int  ScheduleMeetings();

void SortRequestedMeetings();

void PrintRequestedMeetings();


// input output

void SetInputFfromFile(char* fileName);

void PrintAnwserToFile(char* fileName, int i_last_meeting);


int main() {      

    

SetInputFfromFile("input.txt");    

PrintAnwserToFile("output.txt", ScheduleMeetings());

    

return 0;

}


void PrintRequestedMeetings() {

    int im;

    for (im = 1; im <= g_num_requested_meetings; im++){

        printf("%d %d %d\n", g_requested_meetings[im].requested_order,

                g_requested_meetings[im].start_hour,

g_requested_meetings[im].end_hour);

    }

}


// sorting by end_hour

void SortRequestedMeetings() {

    int i, j;

    MEETING temp;

int end_hour_i;

int end_hour_j;


    for (i = 1; i <= g_num_requested_meetings; i++) {

        for (j = i + 1; j <= g_num_requested_meetings; j++) {


end_hour_i = g_requested_meetings[i].end_hour;

end_hour_j = g_requested_meetings[j].end_hour;


if (end_hour_i > end_hour_j) {

                temp = g_requested_meetings[i];

                g_requested_meetings[i] = g_requested_meetings[j];

                g_requested_meetings[j] = temp;

            }

        }

    }

}



int ScheduleMeetings() {

MEETING last_meeting, new_meeting;

    int il, in;  // index of last_meeting, index of new_meeting    

    SortRequestedMeetings();


    if (DEBUG) PrintRequestedMeetings();

    il = 1;

    g_scheduled_meeting[il] = g_requested_meetings[il];


for (in = 2; in <= g_num_requested_meetings; in++) {

last_meeting = g_scheduled_meeting[il];

new_meeting  = g_requested_meetings[in];


if (DEBUG) {

printf("%d : %d\n", last_meeting.end_hour, new_meeting.end_hour);

        }


if (last_meeting.end_hour <= new_meeting.start_hour) {

g_scheduled_meeting[++il] = new_meeting;

}

}


return il;

}



void SetInputFfromFile(char* fileName) {

int i;


FILE *input = NULL;

input = fopen(fileName, "r");

if (input == NULL) {

fprintf(stderr, "file open error : %s\n", fileName);

return;

}


fscanf(input, "%d", &g_num_requested_meetings);

    for (i = 1; i <= g_num_requested_meetings; i++) {

        fscanf(input, "%d %d %d", 

&(g_requested_meetings[i].requested_order), 

&(g_requested_meetings[i].start_hour), 

&(g_requested_meetings[i].end_hour));

    }


fclose(input);

}


void PrintAnwserToFile(char* fileName, int i_last_meeting) {

int i;

FILE *output = NULL;

output = fopen("output.txt", "w");

if (output == NULL) {

fprintf(stderr, "file open error : %s\n", fileName);

return;

}


fprintf(output, "%d\n", i_last_meeting);

    for (i = 1; i <= i_last_meeting; i++) {

        fprintf(output, "%d ", (g_scheduled_meeting[i]).requested_order);

    }

    fprintf(output, "\n");


fclose(output);

}


저작자 표시
신고
by danguria 2012.11.11 16:04

개발 환경 세팅


임베디드 보드에 개발을 하기 위해서는 개발환경 세팅을 좀 해주어야 합니다.

이 부분은 인터넷을 찾아보면 다양하게 나와 있어 저도 많이 참고 했습니다.


많이 이용하는 방법은.

윈도우가 설치된 PC, 가상OS로 리눅스(HOST), 개발보드(TARGET)를 갖춘 상태에서,

서로를 연결하기 위한 공유기(로컬네트워크를 구축해야지요..), tftp, samba, nfs 를 이용하여 개발환경우 갖추었습니다.


다만 제가 가장 OS상에서 네트워크 설정을 잘 못해서 노트북에 리눅스를 설치에 버렸습니다.(다행이 노는 노트북이 있었네요.ㅎㅎ)


자 그럼, 제가 어떻게 세팅했는지에 대한 개략도입니다..



저작자 표시
신고
by danguria 2012.11.11 14:52

저는 학교에서 하드웨어에 의존적이지 않은 순수 소프트웨어 공부를 주로 해서 리눅스, 특히 하드웨어에 의존적인 부분에대해 잘 모릅니다. 회사에 들어오니 이런것들을 몰라서 힘든 부분이 있어 나름 공부를 해보고자 보드도 하나 사고, 리눅스 커널 책도 사서 공부를 하기 시작했습니다.(돈을 버니좋군요.ㅎㅎ)


제가 산 보드는 falinux에서 판매하는 G100-S5PV200입니다.(이런 숫자로된 이름 어려워요ㅠㅠ).

사실 리눅스 커널 공부하는데에 꼭 보드가 필요한것 같지는 않지만, 나중에 디바이스 드라이버도 공부해보고자 샀습니다.(사실 지름신때문이랍니다.ㅋㅋ)




잘못 사서 아까운 돈 날릴까봐 가장 싼것으로 샀습니다^^


자 그럼 오늘은 여기까지 하고 내일부터 개발환경 세팅부터 해볼까요?



저작자 표시
신고
by danguria 2012.11.11 14:28

안녕하세요, 오랜만입니다.^^

누구한테 인사를 드리는지 모르겠지만요.ㅎㅎㅎ (나중에 다시 읽어 볼 나를 위해서??)


학교 졸업함과 동시에 블로깅과 기타 메신저와 담을 쌓고 지냈네요..

한 2년이 다되었는 것 같습니다.


그동안 저는 회사에 들어가서 회사에 적응하느라 바깥 세상에 소흘히 하고 있었네요..

그사이에 많은 일이 있었습니다.

돈도 벌게 되고, 이사도 하고,,,


그중에서 가장 큰일은 사랑하는 사람과 함께 살게 되었습니다!!!

제가 가장 사랑하는 사람입니다^^

하지만 가장 잘해주고 있지 못한다는 생각이 드네요.ㅠㅠㅠ


아, 갑자기 다른 곳으로 빠졌네요..ㅋㅋ

다시 본론으로.


이제 다시 블로그를 꾸며 볼 생각입니다.

그동안 회사에 적응하면서 나름대로의 생활 패턴이 생겼고, 앞으로 어떤 분야에 관심을

가져야할지 생각이 정리 되면서 공부를 하게 되었습니다.


그러다 보니 자연스럽게 블로그에 정리를 해야 겠다는 생각이 들었습니다.

당장 정리하기 시작할 것은 리눅스 커널프로그래밍과 알고리즘입니다.


매번 이것 찔끔 저것 찔끔 손대다 보니 내공이 제대로 쌓이지 않은것 같아서,

우선 이 두가지를 끊기 있게 하려구 합니다.


잘 했는지 확인하기 위해서 나름 목표를 세웠습니다.


1. 사내 알고리즘 대회 입상

 음.. 사내에 뛰어난 사람들이 많지만 나도 할수 있다고 생각합니다!!!


2. 리눅스 커널책 끝까지!!! 읽기

끝가지 읽기.. 이것이 가장 어려운것 같습니다. 잘 해보렵니다!!

대상 커널은  falinux에서 산 G100-S5PV210 보드에서 할 겁니다..^^



다들 잘 부탁 드립니다.

저작자 표시
신고
by danguria 2012.11.11 14:25

출처 : http://nambaxa.springnote.com/pages/1593418


INT(0x10) : 비디오 관련

  • 비디오 모드 설정
    • AH = 0x00
    • AL = 모드(자주 사용되는 화면 모드만 설명)
      • 0x03:16색 텍스트, 80x25
      • 0x12:VGA 그래픽스, 640 x480x4bit 칼라
      • 0x13:VGA 그래픽스, 320 x200x8bit 칼라, Packed Pixel
      • 0x6a:확장 VGA 그래픽스, 800 x600x4bit 칼라
    • 반환값:없음

 

  • 커서 모양 설정
    • AH = 0x01
    • CH = 시작 라인
    • CL = 종료 라인
      • CH < CL라면 1개의 부분으로부터 되는 보통 커서
      • CH > CL라면 2개의 부분으로부터 되는 커서
      • CH == 0x20이면 커서는 표시되지 않는다
    • 반환값:없음

 

  • 커서 위치 지정
    • AH = 0x02
    • BH = 0(페이지 번호)
    • DL = x 좌표
    • DH = y 좌표
    • 반환값:없음

 

  • 점 출력
    • 굳이 이 함수를 이용하지 않고 바로 Video 메모리를 이용할 수도 있다.
    • AH = 0x0c
    • AL = 색상 코드(0 ~ 15)
    • CX = x좌표
    • DX = y좌표
    • 반환값:없음

 

  • 한 문자 출력
    • AH = 0x0e
    • AL = 문자 코드
    • BH = 0(페이지 번호)
    • BL = 문자의 색
    • 반환값:없음
    • 주의) beep(0x07), 백 스페이스(0x08), CR(0x0d), LF(0x0a)는 제어 코드로서 인식된다

 

  • 색상 코드를 대응되는 팔레트에 저장한다.
    • 16색 모드일 때만 사용가능하다.
    • AX = 0x1000
    • BL = 색상 코드(0 ~ 15)
    • BH = 팔레트 코드(0 ~ 63)
    • 주의) EGA 그래픽 카드와의 호환성을 유지하기 위해서 사용됩니다. 잘못 사용하면 상당히 복잡해지기 때문에 기본값 그대로 두고 사용하는 것이 좋습니다.

 

  • 팔레트 설정
    • AX = 0x1010
    • BX = 팔레트 번호(0 ~ 255)
    • DH = Red(0 ~ 63)
    • CH = Green(0 ~ 63)
    • CL = Blue(0 ~ 63)
    • 반환값:없음

 

  • 문자열 출력
    • AH = 0x13
    • AL = 옵션
      • 0x00:문자열의 속성을 BL 레지스터로 지정하고 커서는 이동시키지 않는다.
      • 0x01:문자열의 속성을 BL 레지스터로 지정하고 커서를 이동시킨다.
      • 0x02:문자열을 출력하고 커서는 이동시키지 않는다.
      • 0x03:문자열을 출력하고 커서를 이동시킨다.
      • 실제 데이터는 메모리에 [문자 코드] [칼라 코드] [문자 코드] [칼라 코드]와 같이 저장된다고 보면된다.
    • BH = 0(페이지 번호)
    • BL = 칼라 코드(AL 레지스터의 값이 0x01, 0x02일 경우에만 적용)
    • CX = 문자열의 길이
    • DL = x좌표
    • DH = y좌표
    • ES:BP = 출력할 문자열이 있는 곳의 주소
    • 반환값:없음

 

  • 제일 간단하게 사용할 수 있는 화면모드인 0x13의 사용법
    • 0x13번 화면모드는 그다지 해상도가 좋지는 않지만 Packed Pixel 모드이기 때문에 프로그래밍 하기가 편합니다. 우선 화면 모드를 변경하고 팔레트를 설정합니다.
    • 이 모드는 Video Ram의 0xa0000 ~ 0xafff의 64KB에 위치하게 됩니다. 정확히 말하면 320 x 200 = 64000이 되므로 62.5 KB라고 해야겠지만, VRAM는 0xa0000 ~ 0xaffff의 64 KB입니다.엄밀하게 말하면(자), 320 x200=64000이므로, 62.5 KB가 됩니다. 이 모드에서는 점 하나가 1바이트에 해당되기때문에 읽고 쓰기도 아주 간단합니다.

 

위 내용은 http://osguru.net/index.php/AT-BIOS 에서 찾을 수 있다.

 

80x25 16색상은 아래 캡쳐한 것처럼 나온다. 시시콜콜한 것을 좋아하는 나는 직접 어떤 색상이 나오는지 실험해보았다.

사용자_지정_1.gif

이렇게 나온다.

바로 아래는 HTML코드로 직접 텍스트로 만든 것

ABCDEFGHIJKLMNO

 

16진 : 색상 : 색상코드(HTML)

0x0 : 검정 : #000000

0x1 : 파랑 : #0000a8

0x2 : 초록 : #00a800

0x3 : 파랑 : #00a8a8

0x4 : 빨강 : #a80000

0x5 : 보라 : #a800a8

0x6 : 갈색 : #a85700

0x7 : 옅은 회색 : #a8a8a8

0x8 : 짙은 회색 : #575757

0x9 : 하늘색 : #5757ff

0xA : 연두 : #57ff57

0xB : 시안 : #57ffff

0xC : 마젠타? : #ff5757

0xD : 분홍 : #ff57ff

0xE : 노랑 : #ffff57

0xF : 흰색 : #ffffff

저작자 표시
신고
by danguria 2011.08.12 01:54
커맨드창에서 두개의 파일을 비교 하는 방법은

vimdiff a.c b.c

이렇게 바로 실행 할 수도 있고, 아래와 같이 실행 할 수도 있따.(수평 분할)

vim a.c
:diffs b.c   (:diffsplit b.c)

수직 분할하려 비교 하려면 아래와 같이 명령어를 사용하면 된다.
vim a.c
:vert diffs b.c   (:vertical diffsplit b.c)

이미 열러 있는 두개의 파일을 비교 할때는 아래 처럼 하면 된다.
vim a.c
:sp b.c
:diffthis 

실제로 vim은 실행시 몇 가지 모드 중 하나로 동작 하는 것이다. 즉, 실행시 readonly, vi compatible, diff mode등으로 전환 된다.


이제 부터는 비교하고 있는 파일의 내용을 편집하는 것을 알아 보도록 하자.
비교하는 파일의 편집이란, 한쪽의 내용을 다른쪽으로 copy하는 것이다.
:diffget
:diffset

위의 명령어는 현재 커서가 위치한 반대편의 내용으로 부터 가져오거나 보내는 것이다.
저작자 표시
신고
by danguria 2011.05.31 20:09
1.  cscope설치 하기

여기서 scsope 실행 파일을 다운로드 받고 압축을 풀면 sort.exe cscope.exe 두개의 실행 파일이 나온다.
이 파일을 콘솔에서 실행하기 쉽게 하기 위해 환경변수에 path를 설정해 놓는다. 나의 경우에는 gvim.exe가 있는 곳에 두 파일을 옮기고 환경변수 설정을 하였다.



2. findutils 다운로드

cscope는 내부적으로 find 명령어를 이용한다. find명령어는 리눅스 명령어인데 윈도우즈에서 사용할 수 있는 프로그램이 있다. 이 findutils라는 프로그램을 다운로드 받아 설치하도록 하자.


3. scope DB정보 구축하기

cscope를 사용하기 전에 소스파일로 부터 DB정보를 구축해야 한다.
소스파일이 있는 디렉토리에서 가장 루트 디렉토리에서 아래 명령어를 실행한다.
$ cscope -b -R

결과로 "cscope.out" 이라는 파일이 생성된다.
그러나 이 결과는 C, Cpp파일만 분석하기 때문에 다른 소스 파일을 분석할때 cscope를 사용할 수 없다.
다른 파일을 사용하기 위해서 find명령어를 이용해 DB로 구축하고자 하는 파일을 찾아서 cscope.files라는 파일에 저장해야 한다. 아래의 명령어를 통해 cscope.files 를 만들자.
$ find . W( -name '*.c" -o name '*.cpp' -o -name '*.cc' -o -name '*.java' \) -print > cscope.files

명령어 안에 분석하고자 하는 소스파일의 종류를 모두 기술하면 된다.

4. vim에 DB정보 등록하여 사용하기

아래의 명령을 .vimrc에 넣거나 필요할때 마다 vim명령으로 지정하면 된다.
cs add /cscope.out이 있는 경로/cscope.out

5. cscope 명령어


[cscope 명령어]

Add     :          새 데이터 베이스 더하기        (사용법:           add file | dir [pre-path] [flags]

Find     :          Query for a pattern

                     c: 이 함수를 부르는 함수들 찾기

                     d:  이 함수에 의해 불려지는 함수들 찾기

                     d: egrep 패턴 찾기

                     f: 이 파일 찾기

                     g: 이 정의 찾기

                     i: 이 파일을 포함하는 파일들 찾기

                     s: C 심볼 찾기

                     t: Find assignments to

help     :          이 메지시 보이기        (사용법 : help)

kill       :          연결 끊기                  (사용법 : kill #)

reset    :          모든 연결 다시 초기화 (사용법 : reset)

show   :          연결 보여주기            (사용법 : show)


저작자 표시
신고
by danguria 2011.05.17 14:12
1. ctags란?

ctag는 소스 파일을 태그라는 단위로 잘라서 태그정보를 토대로 소스 분석을 도와주는 유틸리티입니다.
윈도우즈 운영체제에서 많이 사용하는 IDE Tool 인 Visual studio에서는 기본적으로 제공하는 기능입니다. 리눅스 진영에서는 작은 기능을 하는 프로그램을 조합해서 쓰는 것을 좋아 하기 때문에 편집기에 ctags를 조합해서 사용합니다.

2. ctag설치

리눅스(우분투)에서 ctag를 설치 하기 위해서는 터미널에서 아래의 명령을 입력하면 됩니다.
$ sudo apt-get install ctags

3. tags 파일 만들기

ctag를 사용하기 위해서는 소스를 분석하고자 파일들에 대해서 tag정보를 추출해야 합니다.
아래의 코드를 사용하여 tag정보를 추출합니다.

(분석하고자 하는 소스파일이 있는 디렉도리의 최상위 디렉토리에서 실행) 
$ ctags -R

4. vim에 ctags 설정 정보 추가 하기

vim편집기에서 ctags정보를 이용하여 소스분석을 쉽게 할 수 있습니다.
아래의 설정정보를 .vimrc파일에 추가해 줍니다.
여러개의 tags파일 정보를 추가 하기 위해는 ','로 구분 합니다.

set tags=./tags, /usr/src/linu/tags


5. ctags 사용하기

4번 단계까지 설정이 끝났다면 vim에서 ctags를 이용할 수 있습니다. 아래는 ctags명령어를 정리해놓은 자료 입니다.

:ta [tag]   or   Ctrl + ]

[tag] 정의된 위치를 나열하고 선택한 위치로 점프. 현재 위치는 stack push 된다.

 :ta [tag]   or   tj [tag]

 :po   or   Ctrl + t

stack top에 저장된 위치를 pop하고 그 위치로 점프

 :sts [tag]

[tag]가 정의된 위치를 나열하고 선택한 위치로 창을 수평 분할하여 새로 생성된 창에 표시

 :stj [tag]

 :tn

 tj ts로 점프했을 때 다음 tag로 점프

 :tp

 tj ts로 점프했을 때 이전 tag로 점프

 :tr

 tj ts로 점프했을 때 처음 tag로 점프

 :tl

 tj ts로 점프했을 때 마지막 tag로 점프 

 :pts [tag]

 [tag]가 정의된 위치를 나열하고 선택한 위치로 창을 수평 분할하여 새로 생성된 창에 표시하지만 커서는 현재 위치에 유지

 :ptj [tag]

 미리보기 윈도우에 tag가 정의된 형식을 보임

 :ptn

 ptj pts로 점프했을 때 다음 tag로 점프

 :ptp

 ptj pts로 점프했을 때 이전 tag로 점프

 :ptr

 ptj pts로 점프했을 때 처음 tag로 점프

 :ptl

 ptj pts로 점프했을 때 마지막 tag로 점프


저작자 표시
신고
by danguria 2011.05.17 13:36

아래 글은 http://www.idhacker96.pe.kr/tc/27 의 글을 가져 왔습니다.


개인적으로 우분투 시스템에서는 gzip을 사용하여 압축을하고, 윈도우 시스템에서는 zip을 사용하여 압축을 한다. 문제는 우분투와 윈도우에서 압축한 파일을 상호 호환성 문제로 잘 풀리지 않을때가 있다.


우분투에서 압축한 파일인 *.tar.gz 파일을 윈도우에서 풀려고하면, 두번 압축을 풀어야하고, 윈도우에서 압축한 zip 파일을 우분투에서 압축을 해제하면, 한글 파일명이 깨져 출력된다.


7z 압축은 우분투와 윈도우에서도 압축을하면 한글이 깨지지 않는다는 장점과 압축 효율이 높다고 외국에서는 많이 사용한다고 들었다. 그러나 습관이 이미 들어서 인지 압축파일을 만들때만다 7z으로 만들지는 않는다.


우분투에 7z 패키지 설치


sudo apt-get install p7zip


7z에 대한 자세한 사항은 'man 7zr'을 통해서 확인할 수 있다.


7z으로 압축


7zr a 파일명.7z [대상]
ex) 7zr a filename.7z files/


7z으로 압축해제


7zr x filename.7z

저작자 표시
신고
by danguria 2011.04.24 19:15
1. 자바 JDK설치하기

안드로이드 어플리케이션을 개발하기 위해서는 자바를 설치해야 합니다.
리눅스에서 자바를 설치하기 위해서는 [리눅스에서 자바 설치하기] 글을 참고 하시기 바랍니다.

2. 이클립스 설치하기

리눅스에서 이클립스 설치하는 것은 압축파일을 이클립스 홈페이지에서 다운 받아서 압축 풀기만 하면 끝입니다.
자 그럼! [이클립스 홈페이지]에 가서 Eclipse IDE for Java Developers 리눅스용 압축파일을 받도록 합니다.
리눅스에서 압축 푸는 법을 모르시거나 기억이 안나면 [리눅스 파일 압축 명령어 정리] 글을 참고 하시기 바랍니다.

3. 안드로이드 SDK starter 패키지 다운로드 받기

이클립스에서 안드로이드 개발을 위해서는 SDK와 AVD Manger를 설치해야 합니다. 이것을 설치하고 관리해주는 툴이 SDK  start패키지 입니다. 다운로드 받기 위해서 안드로이드 개발자 사이트에 가서 다운로드 받을 수 있습니다.
자 그럼! [안드로이드 개발자 사이트]로 가서 다운 받도록 합시다~

다운 받은 파일을 적당한 위치에 적당한 위치에 압축을 풀도록 합니다. 저는 이클립스가 있는 폴더에 같이 두기로 하겠습니다. 이렇게 해 두면 다른 컴퓨터에 이 폴더를 그대로 복사하기만 하더라고 바로 안드로이드 개발을 바로 할 수 있기 때문이죠.

SDK starter 패키지안에는 sdk-tool이라는 폴더가 있습니다. 이 폴더안에는 각종 유용한 유틸리티가 있기 때문에 이 폴더를 환경변수에 등록하도록 하겠습니다. 아래의 명령을 실행하여 .bashrc 파일을 엽니다.

$ sudo vi ~/.bashrc

파일의 가장 마지막에 아래의 코드를 넣어 줍니다.

export PATH=${PATH}:~/eclipse/android-sdk-linux_86/tools

참고로, 제 컴퓨터에는 이클립스가 계정 폴더에 있고, SDK starter 패키지는 이클립스 안에 있습니다.

4. 각종 이클립스 플러그인 설치

이클립스에서 안드로이드를 개발하기 위해 각종 플러그 인을 설치 합니다. 이 플러그인중에는 Android DDMS와 같은 디버깅 툴도 있으므로 설치하시는 것이 좋습니다.

우선 이클립스를 실행 합니다.
[Help] -> [Install New Software] 매뉴를 클릭합니다.
location을 적는 곳에 https://dl-ssl.google.com/android/eclipse/ 를 적으면 아래에 설치할 수 있는 플러그인들이 나옵니다. 모두 선택한다음 설치를 진행하면 됩니다.



5. 안드로이드 SDK Component 추가

이클립스에서 안드로이드를 개발하려면 실제 안드로이드 SDK와 각종 Component들이 필요합니다.

우선 이클립스를 실행 합니다.
[Window] -> [Android SDK and AVD Manager] 매뉴를 선택한 뒤 Available Packages를 선택합니다.
설치 하능한 Component중 필요한 컴포넌트를 선택합니다. 반드시 sdk는 하나 이상 섳히 해야 합니다.



6. 안드로이느 SDK 경로 설정

이클립스에 안드로이드 SDK가 어디에 있는지 알려주어야 이클립스에서 컴파일을 할 수 있습니다.

우선 이클립스를 실행 합니다.
[Window] -> [Preferences] 매뉴를 클릭합니다.
새로 뜬창에서 Android를 선택하고 SDK Location을 선택하면 됩니다.
자신이 원하는 sdk버전을 선택한뒤 OK버튼을 누르면 됩니다.



저작자 표시
신고
by danguria 2011.04.24 01:49
리눅수에서 bin으로된 확장자를 실행하는 방법

기본적으로 다운로드 받은 bin파일은 실행 속성이 없습니다.
그래서 실행 속성을 주고 난 다음 실행을 해야 합니다.

실행 속성을 주는 명령어는 chmod이며, +x 옵션을 통해 실행가능하게 만들어 줍니다.
아래의 명령을 입력하면 됩니다.

$ sudo chmod + x 파일명.bin    (실행 속성 부여)
$ sudo ./파일명.bin                    (실행 하기)

저작자 표시
신고
by danguria 2011.04.24 00:31

처음으로 컴퓨터를 직접 조립하고 거기에 리눅스를 깔아보면서 그래픽 카드
드라이버 설치하는 것과,듀얼 모니터 설정하는데 어려움을 겪어서 이렇게 정리 해 봅니다.

제가 설치한 리눅스는 우분투 10.10이고 그래픽 카드는 GeForce 500 Series의 Geforce STX 550 Ti이며,모니터는 DELL 의 U2311H 두대를
사용하였습니다.


[NVIDIA 그래픽 카드 드라이버 설치]

1. 드라이버 다운로드

리눅스용 드라이버를 설치 하기 위해서는 NVIDIA 홈페이지(www.nvidia.com)에 가서 직접 자신의 그래픽 카드 종류를 입력하여
해당 드라이버를 다운로드 받을 수 있습니다.



※ 제컴퓨터만 그런지 모르겠지만 사용하는 언어를 한국어로 지저하면 다운로드가 안되더라구요.그래서 언어를 English로 지정했습니다.


2. 드라이버 설치

드라이버를 다운 받았으면, 드라이버를 설치 하면 됩니다. 설치 하기 위해 X window를 종료 하고 설치를 해야 하기 때문에 Ctrl + Alt + F1을 눌러서 콘솔하나 열어 줍니다.


그리고 아래의 명령어를 입력하여 X window를 종료 합니다.



$ sudo /etc/init.d/gdm stop

그런다음 드라이버를 받아 놓은 폴더로 이동하여 아래의 명령을 통해 드라이버를 설치 합니다.(보톤 ~/Downloads/ 폴더 아래에 있습니다.)

$ sudo sh NVIDIA-Linux-x86-270.41.06.run

※ 설치 하는 과정에서 pre-install이 실패 했다는 메시지가 나오던데, 무시하고 설치를 해도 크게 상관은 없는 듯 합니다.

설치가 끝나면 컴퓨터를 재 부팅하면 드라이버 설치는 끝이 나게 됩니다.

[NVIDIA 그래픽카드 듀얼 모니터 설정 (피벗 설정 포함)]

모니터를 듀얼로 사용하기 위해서는 /etx/X11/xorg.conf 파일에 설정 내용을 잘 작성하면 됩니다.
처음 부터 이것을 작성하기란 쉽지 않기 때문에 저 같은 경우 nvidia-settings 프로그램을 사용하였습니다.

※ 여기서 주의 해야 할 점은 xorg.conf를 직접 조작하면 이후부터 nvidia-settings 프로그램에서 설정하는 내용이 적용이 안되는 것을 보았습니다.
정확한 이유는 모르겠지만, 아무튼 nvidia-settings 프로그램을 통해 최대한 설정을 하고 난뒤 nvidia-settings에서 하지 못하는 설정을 직접 파일에 작성하는 순서로 진행하는 것이 좋을 듯 합니다. 그리고 설정하기 전에 xorg.conf파일은 반드시 백업 해 두세요. 잘못되었을때 다시 복구하기
어렵습니다.

1. nvidia-settings 파일 설치 하기

콘솔에서 아래의 명령을 통해 nvidia-settings파일을 설치 합니다.

$ sudo apt-get install nvidia-settings

설치가 다 되었으면 , 프로그램을 실행합니다. 여기서 주의 해야 할 점을 root권한으로 프로그램을 시작해야 하기 때문에
[System ]  --> [Perferences] --> [Nvidia Settings] 와 같은 매뉴를 선택하면 안됩니다. 아래와 같이 콘솔에서 root계정을 획득하여 실행 하도록 합니다.

$ sudo nvidia-settings




실행하면 위와 같은 화면이 뜰 것입니다. 여기서 X Server Display Configuration 매뉴만 잘 알면 됩니다.이 매뉴를 설명 하기 전에 몇가지 알아야 할 사항에 대해서 먼저 설명 드리겠습니다.

듀얼 모니터를 설정할때 두가지 모드가 있습니다. 하나는 TwinView라는 것으로 두개의 모니터를 하나의 화면처럼 사용하는 것입니다. 일반적으로 윈도우 운영체제에서 듀얼 모니터를 쓰는 것과 같은 개념입니다. 자신의 모니터가 피벗 기능을 갖지 않았음때 TwinView로 설정하면 무난하게 사용할 수 있습니다.

두번째는 Seperate X screen입니다. 이것은 말 그대로 두 모니터를 다른 화면으로 분리 하는 것입니다. 이렇게 하면 두 화면간 창을 이동할 수 없고 단지 마우스만 이동할 수 있습니다.  저 같은 경우 이 설정을 적용하였는데 이유는 피벗 기능을 사용하기 위해서 입니다.

TwinView로는 하나의 모니터에만 피벗을 적용할 수 없기 때문이죠..

그러면 지금부터 Seperate X screen 설정을 해 보겠습니다.

2. Seperate X screen 설정으로 듀얼 모니터 및 피벗 설정하기



위의 화면처럼 X Server Display Configuration매뉴를 선택하면 위와 같은 화면이 나옵니다. 저는 이미 설정을 마친 후라 두 모니터가 활성화 되어 있지만 처음 프로그램을 실행하면 하나의 모니터는 "Disable"되어 있습니다.

그러면 그 모니터를 선택한후 아래의 매뉴중 "Configure..."매뉴를 선택합니다.



그리고 나서 위와 같이 "Separate X screen"매뉴를 선택하면 됩니다. (TwinView를 선택하시고 할때도 여기서 TwinView를 선택하면 됩니다.)
다음으로, 두개의 모니터의 위치를 설정해 보겠습니다. 모니터의 위치를 설정하기 위해서는 매뉴중에서 X Screen탭을 선택해야 합니다.


위와 같이 "X Screen"탭을 선택 하면 "Position"이라는 매뉴에서 모니터간의 위치관계를 설정하면 됩니다. 저같은 경우는 왼쪽 모니터를 기준으로 하고 있기 때문에 왼쪽 모니터를 선택하고 Position을 Absolute로 하였습니다.
오른쪽 모니터는 왼쪽 모니터의 오른쪽에 있으므로 Position을 RightOf 로 설정하였습니다.



여기서 주의 해야 할 점을 Enable Xinerama 체크 박스 매뉴를 반드시 설정해야 하는 것입니다. 이것을 하지 않으면 두 모니터간 창을 이동할 수 없기 때문에 반드시 체크 하도록 합니다.
그리고 각 모니터의 스크린 번호(Screen Number)를 기억해 두시기 바랍니다. xorg.conf파일을 직접 수정할때 필요하기 때문입니다.
설정을 다 했으면 Save to X Configuration File을 선태하고 저장을 합니다. 제대로 되었는지 확인하기 위해 컴퓨터를 재 부팅해 보시기
바랍니다.

여기까지 하면 두 모니터의 듀얼 모드 설정을 마쳤습니다. 추가적으로 피벗 기능을 사용하기 위해 직접 xorg.conf파일을 수정해 보도록 하겠습니다.

아래의 명령으로 xorg.conf파일을 열도록 합니다.

$ sodo vi /etc/X11/xorg.conf


파일의 내용을 보면 Section "..." 과 EndSection을 쌍으로 이루어져 있음을 알 수 있습니다. 그 중에 Section "Device"을 찾습니다. 모니터가 두대이므로 Section "Device"은 두개가 있습니다.(아까 스크린 번호 기억 하셨죠?)
여기서 피벗을 하고자 하는 모니터의 스크린 번호가 있는 곳에서 아래와 같은 명령을 추가 해 줍니다.

Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 550 Ti"
BusID "PCI:1:0:0"
Screen 1
Option "Rotate" "CCW"  # 추가한 설정

CCW는 시계반시계방향 CW는 시계방향입니다만.. 직접 확인해 보시기 바랍니다.

여기 까지입니다.....
설정하시다가 궁금한것이 있으면 댓글 남겨 주시면 같이 고민 해 보도록 하겠습니다^^

첨부파일로 제가 설정한 xorg.conf파일을 올립니다.



















저작자 표시
신고
by danguria 2011.04.23 21:19
아래 코드는 "C++기초 플러스5판(성안당)"에 있는 프로그래밍 연습문제를 풀다가 작성한 코드입니다.

template <typename T>
T maxn( const T list[], int n);

template<>char* maxn<char*>(const char * list[], int n);


위코드를 컴파일 하면
"템플릿 선언과 매칭되는 것이 없다"는 내용의 에러가 납니다..
왜 그럴까요?

저는 구글링을 하면서 답을 구했는데요.. 잘 생각해 보세요^^
아시는 분들은 댓글 남겨 주세요~~
저작자 표시
신고
by danguria 2011.04.02 09:59

대뜸 질문입니다...
다음 코드에서 문제가 되는 부분을 설명 해 보세요^^

#include <iostream>
using namespace std;
double refcube(const double &ra)
{
 return ra * ra * ra;
}
void swapr(int &a, int &b)
{
 int temp;
 temp = 1;
 a = b;
 b = temp;
}
 
int main()
{
 double side = 3.0;
 long edge = 5L;
 double c1 = refcube(edge);
 double c2 = refcube(7.0);
 double c3 = refcube(side + 10.0);

 long a = 3L;
 long b = 5L;
 swapr(a, b);
 return 0;
}


C++ 기초 플러스 5판(성안당) 438페이지에 답이 있습니다^^

저작자 표시
신고
by danguria 2011.03.30 20:45
오랫동안 같은 섹터를 쓴 리눅스 식구들이랑 저녁을 먹었습니다.
그동안 자치회장을 한다고 같이 앉지 못해서 조금은 멀어진 기분이 있었지만
그래도 같은 시그라는 이유로 즐거운 저녁을 보냈습니다.

맛있는 저녁과 재미있는 이야기를 나누며 왜 좀더 재미있게 지내지 못했나 하는 아쉬움이 있었습니다.
동생들아~ 어서어서 수료하고 회사에서 만나도록 하자구! 먼저 가서 기다릴게~
편지도 고마워~


저작자 표시
신고
by danguria 2011.01.22 23:59
문자열 치환은 다음과 같은 구조로 이루어져 있다.

: [범위] / [매칭문자열] / [치환문자열] / [행범위]

ex ) : %s / old / new /g

치환 명령 요약
 :s/old/new  현재 행의 처음 old를 new로 교체
 :s/old/new/g  현재 행의 모든 old를 new로 교체
 :10, 20s/old/new/g
 10번째 행부터 20번째 행까지 모든 old를 new로 교체
 :-3, +4s/old/new/g
 현재 커서 위치에서 3행 위부터 4행 아래까지 
old를 new로 교체
 :%s/old/new/g  문서 전체에서 old를 new로 교체
 :%s/old/new/gc  문서 전체에서 old를 new로 확인하며 교체
 :g/pattern/s/old/new/g  pattern이 있는 모든 행의 old를 new로 교체
 :g/pattern/s//new/g  :%s/old/new/g와


저작자 표시
신고
by danguria 2011.01.22 12:07
find명령은 다음 형식 인자를 받아 들인다.

find [경로] [옵션] [테스트] [작동]

경로
경로 부분은 쉽다. /bin과 같은 절대 경로나 ..와 같은 상대 경로를 사용할 수 있다.
필요하다면 find /var /home과 같이 여러 경로를 지정할 수 있다.

옵션
옵션은 여러가지가 있는데, 가장 많이 사용하는 것은 다음과 같다.
옵션
의미
 -depth  디렉토리 자체를 살펴보기 전에 디렉토리의 내용을 검색한다.
 -follow  기호화된 링크를 따라간다.
 -maxdepths N
 검색할 때 최대 N 수준까지의 디렉토리를 검색한다.
 -mound (혹은 -xdev)
 다른 파일 시스템의 디렉토리는 검색하지 않는다.

테스트
find에 지정할 수 있는 테스트에는 여러 가지가 있는데, 각각의 테스트는 true혹은 false를 리턴한다. find가 동작할 때 자신이 찾은 각 파일에 대해 정의된 테스트를 순저대로 적용한다.
테스트가 false를 반환하면 find는 현재 자신이 찾고 있는 그 파일을 무시하고 다음 파일로 넘어간다. 테스트가 true를 반환하면 find는 현재 파일에 대해 그 다음 테스트나 작동을 수행한다. 다음은 많이 쓰이는 테스트들이다.
 테스트 의미
-atime N
 파일이 N일 이전에 마지막으로 액세스 되었다.
 -mtime M
 파일이 N일 이전에 마지막으로 수정되었다.
 -name 패턴
 경로를 제외한 파일의 이름이 주어진 패턴에 일치한다. 쉘이 패턴을 즉시 연산하지 않고 find에 전달하도록 만들기 위해 항상 패턴에 따옴표를 붙여야 한다.
 -newer otherfile
파일이 otherfile보다 최신이다.
 -type C
 파일이 형식 C이며 이때 C는 특정 형식이 될 수 있다. 가장 흔히 사용되는 것은 디렉토리를 가리키는 "d", 보통 파일을 가리키는 "f"이다.
 -user 사용자이름
 주어진 이름을 가진 사용자가 파일을 소유하고 있다.

테스트는 연잔자를 통해 여러 테스트들을 섞어 사용할 수 있다.
 연산자
의미
 !(-not)  테스트를 역으로 수행한다.
 -a(-and)  두 테스트가 모두 true가 되어야 한다.
 -o(-or)  둘 중 하나의 테스트가 true가 되어야 한다.

예) \(-newer X -o -name "_*" \)
괄호를 사용하기 위해서는 백슬래시(\)를 괄호 앞에 붙여주어야 한다. 이유는 쉘에서 괄호가 다른 의미를 가지기 때문이다.

작동
작동은 원하는 파일을 찾은경우 수행할 일을 처리하게 하는 것이다.
 작동 의미
 -exec 명령
명령을 실행한다.
 -ok 명령
 -exec와 같지만, 명령을 수행하기 전에 사용자에게 실행 여부를 물어본다.
 -print  파일의 이름을 출력한다.
 -ls  현재 파일에 대해 ls -dils명령을 실행한다.

-exec와 -ok명령은 \; 로 끝날 때까지 입력되는 이후 매개 변수를 자체 매개변수로 받아 들인다. 문자열 {} 은 -exec, -ok 명령에 대한 특별한 형식의 매개변수이며, 현재 파일에 대한 전체 경로로 대체 된다.
예) find . -newer text.txt -type f -exec ls -l {} \;
현재 경로에서 파일명이 text.txt인 보통파일을 찾으면 "ls -l 파일이 있는 경로" 명령을 실행하라 라고 해석하면 된다.


저작자 표시
신고
by danguria 2011.01.18 21:14








우분투 리눅스에서 APM(Apache+Php+MySQL)을 설치해 보도록 하겠습니다.

이 글은 컴파일해서 쓰는게 아니라 패키지 자체설치로 초보자도 간단하게 설치해볼수 있습니다.

APM이란 리눅스에서 웹서버를 구성할때 많이 쓰는 프로그램의 일반적인 통합명칭입니다.

부르기 쉽게 한데로 모아서 APM이라고 부릅니다. 요즘은 LAMP(Linux + Apache + MySQL + Php/Perl,Python)환경 이라고도 부르기도 합니다.

아파치(Apache)는 웹서버 자체로서 일반적인 프로토콜인 Http프로토콜을 사용합니다. 또한 Https,ftp등도 지원을 하게 됩니다.

MySQL은 데이터베이스 엔진으로서 각종 게시판이나 데이터베이스를 사용해야할때 많이 쓰이는 프로그램입니다. MySQL뿐만 아니라 PostgresSQL도 사용이 가능합니다.

PHP는 스크립트언어로서 웹페이지를 구성할수 있는 언어중 하나입니다. 많은 웹 프로그램들이 php로 작성 되고 있습니다.


일반적으로 설치순서는 Apache -> MySQL -> PHP 등으로 이루어 지게 됩니다.


1) 설치

1.Apache

먼저 Apache를 설치하여 보겠습니다. 버전은 apache2버전을 기준으로 하겠습니다.

터미널을 열고 다음 명령을 입력합니다.

 

sudo apt-get install apache2


다음으로 mysql을 인증을 위한 모듈을 설치하겠습니다.


sudo apt-get install libapache2-mod-auth-mysql


다음으로 MySQL


sudo apt-get install mysql-server mysql-client

설치가 완료되면 MySQL서버가 자동으로 시작이 됩니다.


마지막으로 PHP 버전은 PHP5 기준으로 하겠습니다.

마찬가지로 터미널에서 다음을 입력합니다.

sudo apt-get install php5-common php5 libapache2-mod-php5

MySQL과 연동하기 위한 모듈을 설치합니다.

sudo apt-get install php5-mysql

이상으로 설치가 완료 되었습니다.


아파치 웹서버를 제 시작하겠습니다.

sudo /etc/init.d/apache2 restart

MySQL서버도 정상적으로 작동하는지 확인해 보고 작동을 안한다면 restart 를 해줍니다.

sudo netstat -tap | grep mysql

명령을 줬을때

tcp 0 0 localhost.localdomain:mysql *:* LISTEN -

와 비슷한 것을 보면 정상이고 그렇지 않다면

sudo /etc/init.d/mysql restart

로 재시작을 해줍니다.


모든게 정상이라면

에디터를 열고 웹서버의 디렉토리(일반적으로 "/var/www" 에서 phpinfo.php라는 파일을 만들고 다음의 소스코드를 넣어 줍니다.

  1. <?php
  2. print_r(phpinfo());
  3. ?>

그리고 웹브라우저를 열고 실행을 시켜봅니다.


일반적으로 http://호스트주소/phpinfo.php 로 주소를 열면 됩니다.


다음과 같은 화면이 나오면 웹서버를 위한 환경이 구성이 되었습니다.

스크롤을 내려 Apache 와 MySQL 등을 찾아 제대로 연결이 되었는지 확인해 봅니다.

각종 사항은 설정마다 다르게 나올것입니다.

 

사용자 삽입 이미지

phpinfo



phpinfo.png

2) 설정

1. 아파치

아파치의 기본설정 파일은 /etc/apache2/apache2.conf

포트번호, 문서의루트, 모듈, 각종 로그파일, 가상 호스트 등을 설정할수 있습니다.

자세한 사항은 아파치 문서를 참조하시기 바랍니다.


2.  MySQL

mysql 의 관리자 암호는 처음에는 지정이 되지 않은 상태입니다.

관리자 암호를 설정하기 위해서는

sudo mysqladmin -u root password newrootsqlpassword

sudo mysqladmin -p -u root -h localohost password newrootpassword

을 입력합니다.

첫번째 줄만 실행해도 설정은 될것입니다.

MySQL 설정파일은 /etc/mysql/my.cnf 파일이고 로그 파일, 포트 번호등을 설정할수 있습니다.


이상으로 훌륭한 웹서버 환경을 구축하게 되었습니다.

처음 시작이니 만큼 보다 많은 노력과 시간을 들이는게 중요하다고 봅니다.

여러 문서를 참조하여 실력을 쌓으시길 바랍니다. 행운을 빕니다~


참고 : http://mysql.com
         http://apache.org
         http://php.net
저작자 표시
신고
by danguria 2011.01.17 00:45
1. install ssh
# sudo apt-get install ssh

2. start ssh
#sudo /etc/init.d/ssh restart
저작자 표시
신고
by danguria 2011.01.15 09:42
| 1 2 3 4 ··· 6 |

티스토리 툴바