git daemon 서버 설정

/pub/repo 에 “git clone git://xxx.xxx.xxx.xxx/repo/kernel kernel” 과 같이 하여 repository를 설정하였다면

# git daemon –verbose –export-all –base-path=/pub/repo –detach

git://<새 서버>/pub/repo/kernel 등의 URL로 접근이 가능.

touch .git/git-daemon-export-ok

git config daemon.receivepack=”true”

[Linux] Xming 접속 후 프로그램 실행하는 .xlaunch 만들기

0. 한글 입력이 필요할 경우 다음과 같은 스크립트를 ~/bin 아래에 적당한 이름으로 작성합니다.


#!/bin/bash
export LANG=ko_KR.EUC-KR
export LC_ALL=ko_KR.EUC-KR
export XMODIFIERS=”@im=nabi”
export GTK_IM_MODULE=hangul3f
export GDK_USE_XFT=1
nabi &
절대경로의 실행 프로그램 파일

1. “시작” -> “프로그램” -> “Xming” -> “XLaunch”
2. “Multiple windows” 선택 -> “다음(N)”

3. “Start a program” 선택 -> “다음(N)”
4. “Start program” 에 실행한 파일 이름을 적고(필요하면 절대 경로 포함),
(한글 설정 스크립트의 경우 ~/bin/스크립트명)
“Run Remote” 에 “Using PuTTY(plink.exe)” 를 선택하고,
“Connect to computer” 에 host 주소를, “Login as user” 에 id를, “Password” 에 말 그대로 password를 적는다
-> “다음(N)”
5. PuTTY가 설치된 경로(한글 PuTTY의 경우 C:\Program Files\iPutty)에서 plink.exe 를 선택한다.

6. Font dpi 설정을 위해 “Addtional parameters for Xming” 에 “-dpi 100” 을 적는다. -> “다음(N)”
7. “Save configuration” 을 눌러 바탕화면에 “runStart.xlaunch” 와 같이 저장한다. -> “마침”
 “Include PuTTY password as insecure clear text” 에 체크하면 패스워드를 입력할 필요는 없지만 저장된 파일 안에 패스워드가 그대로 저장되어 보이게 되므로, 취향에 따라 체크하도록 한다.


Ascii code 표
























































































































































































































































































































































Binary Oct Dec Hex Abbr PR[t 1] CS[t 2] CEC[t 3] Description
000 0000 000 0 00 NUL ^@ \0 Null character
000 0001 001 1 01 SOH ^A Start of Header
000 0010 002 2 02 STX ^B Start of Text
000 0011 003 3 03 ETX ^C End of Text
000 0100 004 4 04 EOT ^D End of Transmission
000 0101 005 5 05 ENQ ^E Enquiry
000 0110 006 6 06 ACK ^F Acknowledgment
000 0111 007 7 07 BEL ^G \a Bell
000 1000 010 8 08 BS ^H \b Backspace[t 4][t 5]
000 1001 011 9 09 HT ^I \t Horizontal Tab
000 1010 012 10 0A LF ^J \n Line feed
000 1011 013 11 0B VT ^K \v Vertical Tab
000 1100 014 12 0C FF ^L \f Form feed
000 1101 015 13 0D CR ^M \r Carriage return[t 6]
000 1110 016 14 0E SO ^N Shift Out
000 1111 017 15 0F SI ^O Shift In
001 0000 020 16 10 DLE ^P Data Link Escape
001 0001 021 17 11 DC1 ^Q Device Control 1 (oft. XON)
001 0010 022 18 12 DC2 ^R Device Control 2
001 0011 023 19 13 DC3 ^S Device Control 3 (oft. XOFF)
001 0100 024 20 14 DC4 ^T Device Control 4
001 0101 025 21 15 NAK ^U Negative Acknowledgement
001 0110 026 22 16 SYN ^V Synchronous Idle
001 0111 027 23 17 ETB ^W End of Trans. Block
001 1000 030 24 18 CAN ^X Cancel
001 1001 031 25 19 EM ^Y End of Medium
001 1010 032 26 1A SUB ^Z Substitute
001 1011 033 27 1B ESC ^[ \e[t 7] Escape[t 8]
001 1100 034 28 1C FS ^\ File Separator
001 1101 035 29 1D GS ^] Group Separator
001 1110 036 30 1E RS ^^ Record Separator
001 1111 037 31 1F US ^_ Unit Separator
111 1111 177 127 7F DEL ^? Delete[t 9][t 5]

 









































































































































































































Binary Oct Dec Hex Glyph
010 0000 040 32 20 space
010 0001 041 33 21 !
010 0010 042 34 22
010 0011 043 35 23 #
010 0100 044 36 24 $
010 0101 045 37 25 %
010 0110 046 38 26 &
010 0111 047 39 27
010 1000 050 40 28 (
010 1001 051 41 29 )
010 1010 052 42 2A *
010 1011 053 43 2B +
010 1100 054 44 2C ,
010 1101 055 45 2D
010 1110 056 46 2E .
010 1111 057 47 2F /
011 0000 060 48 30 0
011 0001 061 49 31 1
011 0010 062 50 32 2
011 0011 063 51 33 3
011 0100 064 52 34 4
011 0101 065 53 35 5
011 0110 066 54 36 6
011 0111 067 55 37 7
011 1000 070 56 38 8
011 1001 071 57 39 9
011 1010 072 58 3A :
011 1011 073 59 3B ;
011 1100 074 60 3C <
011 1101 075 61 3D =
011 1110 076 62 3E >
011 1111 077 63 3F ?








































































































































































































Binary Oct Dec Hex Glyph
100 0000 100 64 40 @
100 0001 101 65 41 A
100 0010 102 66 42 B
100 0011 103 67 43 C
100 0100 104 68 44 D
100 0101 105 69 45 E
100 0110 106 70 46 F
100 0111 107 71 47 G
100 1000 110 72 48 H
100 1001 111 73 49 I
100 1010 112 74 4A J
100 1011 113 75 4B K
100 1100 114 76 4C L
100 1101 115 77 4D M
100 1110 116 78 4E N
100 1111 117 79 4F O
101 0000 120 80 50 P
101 0001 121 81 51 Q
101 0010 122 82 52 R
101 0011 123 83 53 S
101 0100 124 84 54 T
101 0101 125 85 55 U
101 0110 126 86 56 V
101 0111 127 87 57 W
101 1000 130 88 58 X
101 1001 131 89 59 Y
101 1010 132 90 5A Z
101 1011 133 91 5B [
101 1100 134 92 5C \
101 1101 135 93 5D ]
101 1110 136 94 5E ^
101 1111 137 95 5F _

영문 위키피디아에서 참조
Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. See Terms of Use for details.

[Linux] Device driver 동시성 관련 함수 – Completion

현재 스레드 외부에다 작업을 시작하도록 지시하고 끝나기를 기다릴 때 사용. 세마포어를 LOCKED 상태로 하여 사용할 수도 있지만, 세마포어는 거의 항상 세마포어를 획득할 수 있을 때에 치중하여 최적화되어 왔다. 따라서 이럴 때는 completion 을 사용하는 것이 좋다. 구현은 kernel/sched.c 를 참조.

1. completion 초기화
<linux/completion.h>를 포함하여야 한다. 자료 타입은 struct completion.

1.1. Compile time 초기화

DECLARE_COMPLETION(my_completion);
1.2. Runtime 초기화

struct completion my_completion;
/* … */
init_completion(&my completion);

2. 완료 기다리기
인터럽트가 불가능한 대기(죽일 수 없는 프로세스를 만들 수도 있다)를 수행한다. LONG_MAX 만큼 대기.

void wait_for_completion(struct completion *c);
timeout 이 있는 인터럽트가 불가능한 대기. timeout 값을 리턴한다. 따라서 expire 되면 0을, 완료되면 남은 timeout 값(jiffies 값)을 리턴한다.

unsigned long wait_for_completion_timeout(struct completion *x, unsigned long timeout);
인터럽트가 가능한 대기를 수행한다.(추가필요:인터럽트 받으면 바로 리턴?)

int wait_for_completion_interruptible(struct completion *x);
인터럽트가 가능한 대기의 timeout 버전

unsigned long wait_for_completion_interruptible_timeout(struct completion *x, unsigned long timeout);
죽일 수 있는 대기(TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)를 수행한다.(추가 필요:kill받으면 바로 리턴?)

int wait_for_completion_killable(struct completion *x);
Blocking 없는 wait_for_completion. complete 되지 않았으면 바로 0을 리턴한다.

bool try_wait_for_completion(struct completion *x);

3. 완료 이벤트 알리기
completion을 기다리는 스레드(waiter)가 있는지 확인한다. waiter가 있으면(wait_for_completion()이 진행 중이면) 0을, 없으면 1을 리턴한다.

bool completion_done(completion *x);
대기 중인 스레드 하나만 깨우기
void complete(struct completion *c);
모든 스레드 깨우기

void complete_all(struct completion *c);

4. 재사용을 위해 다시 초기화하기

INIT_COMPLETION(struct completion c);

5. 모듈 종료 함수에서 종료 후 완료를 기다리리고 알릴 때(나중에 추가하기:이 함수 없어졌나?)

void complete_and_exit(struct completion *c, long retval);

[Linux] Device driver 동시성 관련 함수 – Semaphore & Mutex

동시성 관련 함수에 대해서 다시 한번 정리하고 가자. Linux device driver 3판, 5장. “동시성과 경쟁 상태” 를 기준으로 정리한다.

공유 자원 접근을 위한 Lock 을 위해서 다음과 같은 것들을 사용한다.

1. 세마포어와 뮤텍스
Critical Section을 정의하기 위해서 세마포어를 사용한다. 일반적으로 P와 V 함수 쌍을 사용하는데, linux 에서는 P함수는 “down”, V 함수를 “up”이라 부른다. 단일 세마포어(공유 자원 개수를 1개로 정의)로 사용할 때 뮤텍스(Mutual Exclusion)라 부른다.

1.1. 세마포어 초기화
<asm/semaphore.h> 를 포함하여야 한다. 관련 Type은 struct semaphore.
1.1.1. 세마포어로 사용할 때 초기화


void sema_init(struct semaphore *sem, int val);

val 은 세마포어에 할당할 초기값.

1.1.2. Mutex로 사용할 때 초기화
정적 초기화


DECLARE_MUTEX(name); // 1로 초기화.
DECLARE_MUTEX_LOCKED(name); // 0으로 초기화.

실행 중 초기화


void init_MUTEX(struct semaphore *sem); // 1로 초기화.
void init_MUTEX_LOCKED(struct semaphore *sem); // 0으로 초기화


1.2. 세마포어 획득하기
세마포어 값을 감소시키고 필요한 만큼 기다린다.


void down(struct semaphore *sem);


세마포어 값을 감소시키고 필요한 만큼 기다리지만, 인터럽트 가능하다. 인터럽트를 받으면 0이 아닌 값을 반환하고, 세마포어를 쥐고 있지 않는다. 때문에 항상 반환값을 확인하여야 한다.


int down_interuptible(struct semaphore *sem);


세마포어를 획득할 수 없다면 바로 0이 아닌 값을 반환한다.


int down_ttylock(struct semaphore *sem);


1.3. 세마포어 반환


void up(struct semaphore *sem);

2. 읽기/쓰기 세마포어
읽기만 수행하는 스레드라면 여럿이 함께 접근해도 된다. 이럴 때 rwsem 이라는 특수 세마포어를 이용한다.
rwsem 을 사용하면 쓰기 스레드 하나가 잡고 있던가 읽기 스레드 여럿이 잡고 있던가 둘 중에 하나가 되는데 우선순위는 쓰기 스레드에게 있다. 쓰기 스레드가 임계구역에 접근하는 순간, 읽기 스레드는 모든 쓰기 스레드가 작업을 끝낼 때까지 기다려야 한다. 그래서 쓰기 스레드가 많을 경우 읽기 스레드가 오랫동안 접근 권한을 얻지 못할 수 있다. 따라서 쓰기 접근이 매우 드물고, 짧은 시간 동안에만 필요한 경우에 적당하다.

2.1. 읽기/쓰기 세마포어 초기화
<linux/resem.h> 를 포함하여야 한다. 관련 타입은 struct rw_semaphore. 런타임에 명시적으로 초기화되어야 한다.


void init_rwsem(struct rw_semaphore *sem);

2.2. 읽기 전용 세마포어 사용
읽기 전용 접근 권한을 제공한다. 다른 읽기 스레드와 동시 참조가 가능하다. 호출 프로세스를 D 상태(인터럽트가 불가능한 잠자기 상태)로 빠뜨릴 수 있다는 사실에 주의한다.


void_down_read(struct rw_semaphore *sem);

읽기를 수행할 수 없을 경우 기다리지 않는다. 접근이 가능하다면 0 이 아닌 값을, 이외에는 0을 반환한다. 다른 커널 함수는 대부분 성공일 때 0을 반환하지만 down_read_ttylock은 반대다.


int down_read_ttylock(struct rw_semaphore *sem);

읽기 전용 세마포어 해제


void up_read(struct rw_semaphore *sem);


2.2. 쓰기 전용 세마포어 사용
down_read 와 동일


void down_write(struct rw_semaphore *sem);

down_read_ttylock 과 동일


int down_write(struct rw_semaphore *sem);

up_read 와 동일


void up_write(struct rw_semaphore *sem);

잠시만 쓰기 락을 걸어 수정하고 한동안은 읽기 권한만 필요하다면


void downgrade_write(struct rw_semaphore *sem);

 

USB Windows XP 설치

http://www.parkoz.com/zboard/view.php?id=my_tips&page=1&sn1=&divpage=3&sn=off&ss=on&sc=off&keyword=xp&select_arrange=headnum&desc=asc&no=13051
안됨 – /BOOT/BCD 어쩌고

http://blog.naver.com/lvis?Redirect=Log&logNo=10036988219&vid=0
안됨 – Disk error 어쩌고 저쩌고

http://www.usboffice.kr
 – http://www.usboffice.kr/zbxe/275520
  – http://blog.daum.net/idrlee/16100073
 – http://usboffice.kr/zbxe/use_boot/481399/page/3

http://www.msfn.org/board/install-usb-winsetupfromusb-gui-t120444.html

http://nofate.tistory.com/455

NETBOOT로 선회
 http://www.cyworld.com/hyunweb/2811496
성공 – 결국 관건은 C: 에 부팅할 수 있도록 Windows 98 부팅 디스크를 심고, D: 에 I386 폴더를 복사해서 I386 아래의 WINNT 를 실행하는 것이었다. 실행 후 파티션 작업 역시 다시 할 수 있는 듯 하다.

USB 부트
http://blog.naver.com/baljern/140097762413
성공 – diskpart 에서 “create partition primary size=200000 (200기가)”
cmd 에서 “format c: /fs:ntfs /q/u” 로 NTFS 포멧
cmd 에서 x:\i386> “winnt32.exe /syspart:c /tempdrive:c”

MBR 이상인 경우 MBR write 툴도 함께 있음.

우분투 설치 CD를 USB로 부팅

http://unetbootin.sourceforge.net/ 에서 unetbootin 을 다운받는다.
우분투 설치 ISO 파일을 http://www.ubuntu.com/getubuntu/download 에서 다운로드받는다.
미러를 통해 다운로드받는 것이 빠르다.
USB를 꽂고, unetbootin 을 실행시킨 후 Disk image의 ISO 에 다운로드 받은 ISO를 선택한 후 OK를 누른다.

1~4까지 진행된 후 뽑아서 쓰면 된다.
윈도우즈가 깨진 노트북에서 외장하드로 파일 복사(데이터 백업)가 필요해서 사용했다.

Moniwiki의 초기 설정

1. monisetup.php 에서 한 일.
 1.1. Site 이름 설정

$sitename=’Wiki’;
 1.2. 업로드 가능한 파일 확장자 추가.

$pds_allowed=”png|jpg|jpeg|gif|mp3|zip|tgz|gz|txt|css|exe|hwp|pdf|flv|alz|bmp|doc|xls|ppt|pptx|xlsx|docx|gul|gif|bz2″;
 1.3. 테마 바꾸기

$theme=’azblue’;
 1.4. 편집창 사이즈 좀더 길게..

$edit_rows=26;
 1.5. 위지윅 에디터는 아직 불안정 한 것 같으니 Disable

$use_wikiwyg=0;
 1.6. 부분 편집 가능하도록..

$use_sectionedit=1;
 1.7. 로그인한 후에 글 편집 가능하도록..

$security_class=’needtologin’;
 
2. php 설정(/etc/php.ini)에서 upload를 위한 작업
 2.1. 최대 업로드 파일 사이즈 조정

upload_max_filesize = 2048M
 2.2. POST 방식으로 업로드하므로 POST data size 조정

post_max_size = 1024M
 
3. azblue 테마 수정(theme/azblue/theme.php)
 3.1. 폭이 너무 좁으니 좀 넓게..

$_width=’80%’;
 

[Linux] 디렉토리 안의 모든 파일들을 일일이 링크 걸기 위한 방법

디렉토리 안의 모든 파일들을 일일이 심볼릭 링크를 걸고 싶을 때 Perl을 이용해서 하는 방법이다.(절대 경로를 준다면 cp -sR 옵션으로 줄 수도 있지만..)

다음을 link.pl 등의 이름으로 저장한다.

use File::Find;
$src = shift; # first arg is source
$dst = shift; # second arg is dest
                find(sub {
                                                (my $rel_name = $File::Find::name)
                                                =~ s!.*/\./!!s;
                                                my $src_name = “$src/$rel_name”;
                                                my $dst_name = “$dst/$rel_name”;
                                                if (-d) {
                                                print “mkdir $dst_name\n”;
                                                mkdir $dst_name, 0777
                                                or warn “mkdir $dst_name: $!”;
                                                } else {
                                                print “ln -s $src_name $dst_name\n”;
                                                symlink $src_name, $dst_name
                                                or warn “symlink $src_name $dst_name: $!”;
                                                }
                                                }, “$src/./”);

perl link.pl <SRC PATH> <DST PATH> 로 한다.
<DST PATH> 는 mkdir로 만들어 놓고 해야 한다.