[모듈과 커널 버전]


커널의 버전 확인하는 방법 : /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

출처 : 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
문자열 치환은 다음과 같은 구조로 이루어져 있다.

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

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
1. install ssh
# sudo apt-get install ssh

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


[tar.gz 압축 풀기]


$ gunzip filename.tar.gz        // tar.gz에서 gz을 풀어냅니다.
$ tar xvf filename.tar             // tar를 풀어냅니다. (x: 압축풀기, v: 압축푸는 상태를 본다. f:파일이름)

두개의 명령을 하나로 합칠 수도 있습니다.

$ tar xvzf filename.tar.gz



[tar.gz 압축 하기]

$tar cvf filename.tar file1...    //file1의 폴더나 파일을 filename.tar로 묶는다 (압축아님)
$gzip filename.tar                //filename.tar을 filename.tar.gz로 압축한다 (이땐 압축)

역시나 두개의 명령을 하나로 합칠 수 있습니다.

$tar cvzf filename.tar.gz file1...     //file1의 폴더나 파일을 filename.tar.gz로 묶고 압축한다.


저작자 표시
신고
by danguria 2011.01.13 03:48

Linux에 Windows용 True Type 글꼴 설치하기

기본적 으로 Linux 시스템에는 설치 언어를 '한국어'로 선택한 경우, 몇 가지 무료용 한글 글꼴이 설치된다. 그러나, 이 글꼴은 무료인 만큼 Windows에서 사용하는 글꼴처럼 미려하지 않은 단점이 있다.
이를 해결하는 방법으로는 일반적으로 무료로 배포되는 글꼴을 내려받거나 Windows 시스템에서 사용하는 TrueType 글꼴(ttf)을 가져다 쓰는 것이다. 다행이 TrueType 글꼴은 그대로 Linux 시스템에서 사용할 수 있다.

1. 글꼴 복사하기
Windows 시스템에서 사용할 글꼴을 복사한 다음, Linux 시스템에 옮긴다. Windows 시스템은 C:\Windows\Font 디렉토리에 글꼴이 설치되어 있다.
Linux 시스템에 복사한 글꼴을 다음과 같이 Linux의 글꼴 시스템 디렉토리에 설치한다.

># mv *.ttf /usr/share/fonts

2. 글꼴 캐쉬 정보 갱신하기
현재 시스템에서 사용하고 있는 글꼴에 대한 정보에 새로 설치한 글꼴 정보가 포함되도록 갱신하여야 한다. 시스템을 재시작하면 자동으로 반영되지만 현재 복사한 글꼴을 바로 확인하고자 할 때에는 다음을 실행한다.

># fc-cache -f -v

3. Anti-Aliasing 적용하기
지금까지의 과정으로 TrueType 글꼴의 기본적인 설치 과정은 완료된다. 그러나, Ubuntu와 같이 몇몇 시스템에서는 한글 글꼴에 대해 Anti-Aliasing (즉, 글꼴의 윤곽을 부드럽게 함)을 적용하지 못하도록 설정되어 있어, TrueType 글꼴인데도 불구하고 마치 Bitmap 글꼴이 확대되었을 때 깨지는 것처럼 보이는 경우가 있다. 이런 경우에는 다음과 같이 Anti-Aliasing을 적용하지 못하도록 설정된 두 부분을 주석 처리한다.

우선 편집기를 이용하여 다음과 같이 한글 설정 파일을 연다.

># gedit
/usr/share/language-selector/fontconfig/ko_KR


그런 다음, 내용 중에
<!-- Turn off antialias and autohint for Korean fonts depending on pixelsize --> 부분을 찾은 다음, 바로 아래 줄의 <match target="font">부터 </match>설정까지를 <!---->로 둘러싸서 주석 처리한다.

그리고, 조금 더 내려가면 다시 <!-- Turn off antialias and autohint for ttf-alee depending on pixelsize --> 부분이 나타나는데, 이 부분 또한 위와 마찬가지로 <match target="font"> 부터 </match>까지 주석 처리한다.

끝으로 설정 파일을 저장하고 닫은 다음, 시스템을 재시작하면 미려한 TrueType 글꼴을 즐길 수 있다.

저작자 표시
신고
by danguria 2011.01.13 03:47

들어가기 전에..

이 자료는 다음 사이트를 그대로 옮긴 것입니다. 사이트 주인께 감사 드립니다.

인문학적 프로그래머 NamSa님 의 자료 바로 가기



한참을 ubuntu subversion클라이언트에대해서 검색을 해댓군요.. 예전에 분명히 꾀나 쉽게 햇던것 같은데 어떻게 설치하는지 조차 구글신은 알려주지 않는것인가.. 라는 생각과 함께 설마하며

#  sudo apt-get install subversion

이라고 치고 svn 명령어를 날려보니 되더군요. 저녀석이 서버용 버전인걸로 착각하고 있엇다는 ㅠㅠ 요즘에는 3개월정도 윈도우에서 생활햇더니 리눅스에 대한걸 많이 까먹은듯 싶군요 ^^ 일단 설이는 요로케 마무리~

저의 것의 경우에는 커밋을 하려고 보니 에디터가 nano여서 고녀석을 vim으로 바꾸어 주엇습니다.

$  echo "export EDITOR=vim" >> ~/.bashrc 
$ . ~/.bashrc



그리고 자신의 작업할 svn에서 checkout을 하여서 소스파일을 내 시스템으로 받아옵니다

$ svn checkout <svn주소> <저장디렉토리>



이제 파일을 수정하시고 서버로 commit하시려면

$ svn ci -m "커밋주석"



서버로부터 최신 파일을 받아오려면

$ svn update



파일을 추가/삭제 하려면(svn은 파일을 자동으로 추가해주는게 아니라 직접 만들고 ADD 해주어야 한다)

$ svn add <파일명>
$ svn delete <파일명>


그 외믜 명령어는 아래의 표를 참고하시면 됩니다.

요즘 한 3개월정도 무선랜 문제라던지 이런 저런 문제가 있엇는데 해결되면서 저번주부터 리눅스로 다시 돌아왓는데 오랜만이라 어색한게 많네요. 그래도 다시 사용하면서 느끼는건데 손맛은 운영체제를 사용하는 제미는 리눅스가 최고인것 같다는 생각이 듭니다.

저작자 표시
신고
by danguria 2011.01.13 03:46

우분투에서 samba를 이용해서 파일공유 사용하기

파일을 공유하려는 서버에서 아래와 같이 삼바 패키지를 설치한다.
sudo apt-get install samba smbfs

이 공유에 접근할 아이디와 비밀번호를 설정한다.
sudo smbpasswd -a 아이디

접근 아이디를 지울 때는 다음과 같이 한다.
sudo smbpasswd -x system_username

삼바 서버를 설정하기 위해 문서 편집기로 설정파일을 연다.
sudo vim /etc/samba/smb.conf

그 안에 다음과 같은 내용을 입력한다.

# 기본적인 설정
[global]
# 워크그룹이름은 맘대로 정한다.
workgroup = WORKGROUP
encrypt passwords = yes
# 접근을 허락할 아이피 범위
hosts allow = 192.168.
# 문자 인코딩 설정, 우분투는 utf-8을 기본적으로 사용하고
# 이것이 윈도우즈에서도 한글이 잘 깨지지 않는다.
unix charset=utf-8
dos charset=utf-8
#공유할 디렉토리 이름, 이것은 여러개를 만들 수도 있다.
[MyDoc]
comment = My Documents
path = /공유할/디렉토리
#읽기 전용으로 접근할지 여부
read only = no
browsable = yes


삼바의 설정은 매우 다양하게 할 수 있다.
아래에 다양한 삼바 설정을 설명했다.

삼 바 설정이 끝났으면, 설정이 제대로 되었는지 검사한다.
sudo testparm

문제가 없으면 삼바를 실행한다.
sudo /etc/init.d/samba restart

우분투에서 패키지로 설치된 삼바는 컴퓨터가 켜질 때마다 실행될 것이다.

우분트 클라이언트에서 공유에 접근하는 법은 두가지이다.

첫째)
위치 메뉴 > 서버에 연결 을 선택한 후,
서비스 종류는 Windows공유를 지정하고,
사용자 이름과 연결에 사용할 이름 부분만 위에서 지정한 네트워크사용자아이디를 지정하면 된다.

둘째)
mount -t cifs //삼바서버아이피/삼바공유폴더이름 /공유가/지정될/로컬폴더 -o username=네트워크사용자아이디,password=비밀번 호,iocharset=utf8,file_mode=0777,dir_mode=0777
-o 이후로는 띄어쓰기를 해서는 안된다.

윈 도우즈에서 삼바 서버에 접근하려면,
네트워크 환경에서 새 연결을 설정하거나,
net use o: \\삼바서버아이피\삼바공유폴더이름 비밀번호 /user:네트워크사용자아이디
로 연결하면 되고,
삭제는 net use o: /delete
로 하면 된다.

저작자 표시
신고
by danguria 2011.01.13 03:44
리눅스에서 자바 JDK를 설치하는 방법에 대해서 설명 드리겠습니다.
이번에는 bin파일을 다운 받아서 직접 설치를 해볼 것인데요.
bin파일을 실행하기 위해서
우분투에서 bin파일 설치 편을 참고 하기시 바랍니다.

1. 리눅스용 패키지(bin) 다운로드 받기

리눅스용 패키지를 다운로드 받기 위해서
Sun의 홈페이지로 이동합니다. 홈페이지에서 Linux용 패키지를 다운로드 받습니다. bin을 통해 설치 할 것이기 때문에 bin 파일을 다운로드 받습니다. 현재 글을 쓰는 시점의 최신 버전의 파일 이름은
jdk-6u25-linux-i586.bin입니다.

2. bin파일 실행하기
다운로드 받은 파일은 폴더로 이동하여 아래의 명령을 수행하면 패키지의 압축이 풀리게 됩니다.

$ /{다운로드받은폴더}/ ./jdk-6u25-linux-i586

$ /home/danguria/Downloads/ ./jdk-6u25-linux-i586       (제가 다운로드 받은 폴더)

3. 압축 푼 폴더를 적절한 곳으로 이동하기
패키지의 압축을 풀었으면 적절한 곳으로 이동시켜 줍니다. 보통 이런류의 패키지는 /usr/lib 폴더 안에 두는 것이 관계이므로 그곳으로 폴더를 이동시키겠습니다.

아래의 명령을 실행 시켜 줍니다.

$ sudo mv /{압춘 푼 폴더가 있는 곳}/jdk-1.6.0???  /usr/lib/jvm

jvm이라는 폴더이름을 원하시는대로 정하면 됩니다.

4. PATH설정하기
자바를 컴파일 하기위해 컴파일 명령을 편하게 하기 위해서 PATH 설정을 해주면 좋습니다.
아래명령을 통해 설정파일을 열어 편집할 준비를 합니다.

sudo vi /etc/profile

그다음 파일의 가장 아래에 다음 3라인을 추가 합니다.

export JAVA_HOME=/usr/lib/jvm/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/bin/lib/ext:$JAVA_HOME

설치가 잘 되었는지 확인하기 위해 아래 명령을 수행 시켜서 봅니다.

$ java -version

이상 리눅스에서 자바 JDK 설치하는 방법이었습니다.
저작자 표시
신고
by danguria 2011.01.13 03:43

네트워크 설정(고정 IP)

1. 네트워크 설정파일 변경

sudo vi /etc/network/interfaces 엔터

auto eth0

iface eth0 inet static

address 210.118.75.xxx

gateway 210.118.75.1

netmask 255.255.255.0

network 210.118.75.0

broadcast 210.118.75.255

2. 네트워스 서비스 다시 시작

sudo /etc/init.d/networking restart

3. DNS 설정

sudo vi /etc/resolv.conf

nameserver 210.118.75.3



저작자 표시
신고
by danguria 2011.01.13 03:42
프로젝트를 하면서 SWIG라는 놈을 사용해야 해서 정리 해봅니다.
저도 SWIG를 잘 알지는 못하지만, 간단한 개념과 사용법을 알고자 하는 분들께 좋은 정보 이길 바랍니다.
pdf를 처부 하니 보시고 궁금한 건 댓글 남겨주세요.

저작자 표시
신고
by danguria 2011.01.13 03:39
저는 이렇게 해결했습니다. 이클립스에서

Window -> Preferences -> Android -> DDMS -> "ADB connection time out (ms)"의 값을 늘려준다.

apk 용량이 늘어나면 접속 시간을 늘려줘야 합니다.
저작자 표시
신고
by danguria 2011.01.13 03:25

소개

벌써 네번째 정리 입니다.

늦은 감이 있지만 NDK가 뭐인고? 라는 것을 정리 하지 않았군요. NDK를 이야기 하기 전에 JNI를 알고 계시나요? JNI는 C나 C++로 작성된 머신코드(Native machine code)를 Java 프로그램이 사용할 수 있도록 해주는 인터페이스(interface)입니다.

안드로이드 프로그래밍을 할때는 자바언어로 구현하죠.. 자, 그럼 답이 나왔네요. NDK는 안드로이드 응용 프로그램을 만들때 C/C++로 작성된 머신코드를 안드로이드 프로그램에서 사용할 수 있도록 해주는 도구입니다.

저는 개인적으로 자바와 C/C++쪽을 모두 잘 해야 한다고 생각 하기 때문에 NDK를 꼭 알고 싶었지요.. JNI를 기본적으로 잘 알고 있다면 NDK는 크게 어렵지 않은 것 같습니다.


Android NDK를 이용하면 좋은 경우

  • 빠른 처리를 요구하는 루틴을 작성할때 좋습니다.

    C/C++이 자바 보다 빠른건 당연합니다. 그러니 빠른 처리를 요구하는 루틴을 C/C++로 작성하고 그것을 호출하면 성능 향상을 꾀할 수 있죠

  • 하드웨어 제어 할때 필요합니다.

    안드로이드의 코어는 리눅스 입니다. 하드웨어를 직접 접근 하거나 디바이스 드라이버를 개발 할때는 당연히 C로 개발해야 하죠. 자바에서는 그렇게 구현된 코드를 이용해야 합니다.

  • 기존의 C/C++프로그램의 재사용할 수 있습니다.

    기조에 C/C++로 만들어진 좋은 소스가 있다면 그것을 굳이 자바로 다시 만들기 위해 많은 노력이 필요합니다. 이때 NDK를 사용하면 편리 하겠죠.


Android NDK를 이용하면 좋지 않은 경우

  • 프로그램 구조가 복잡해 집니다.

    프로그램을 설계할때, 프로젝트를 진행할때, 나중에 유지 보수 할때, 복잡한 구조때문에 코드분석하기가 힘들 수 있습니다.


Android NDK 개발 순서

  1. 작성된 native srouces를 $PROJECT/jni/ 에 둡니다.

    여기서 $PROJECT는 여러분이 작성한 안드로이드 프로젝트가 위치 하고 있는 주소 입니다.

  2. $PROJECT/jni/폴더에 Android.mk라는 파일을 만들고, NDK build를 위한 설정내용을 적어 줍니다. (이 부분은 추후 포스팅에서 설명하겠습니다.)
  3. $NDK/ndk-build 명령어를 통해 native codes를 빌드합니다.

    여기서 $NDK는 여러분이 설치한 NDK의 최상이 경로를 의미합니다.

실습을 위한 포스팅을 NDK First step - 1와  NDK First step - 2에 있으니 참고 하세요.


포스팅을 마치며

다음에는 makefile의 일부분인 Android.mk를 작성하는 방법을 알아보도록 하겠습니다.





저작자 표시
신고
by danguria 2011.01.13 03:21
| 1 2 |