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
.inl 을 C++로 인식시키는 방법입니다.

인식시킬 언어를 알아냄
$ ctags --list-maps
Asm      *.asm *.ASM *.s *.S *.A51 *.29[kK] *.[68][68][kKsSxX] *.[xX][68][68]
Asp      *.asp *.asa
Awk      *.awk *.gawk *.mawk
Basic    *.bas *.bi *.bb *.pb
BETA     *.bet
C        *.c
C++      *.c++ *.cc *.cp *.cpp *.cxx *.h *.h++ *.hh *.hp *.hpp *.hxx *.C *.H *.inl
C#       *.cs
Cobol    *.cbl *.cob *.CBL *.COB
Eiffel   *.e
Erlang   *.erl *.ERL *.hrl *.HRL
Fortran  *.f *.for *.ftn *.f77 *.f90 *.f95 *.F *.FOR *.FTN *.F77 *.F90 *.F95
HTML     *.htm *.html
Java     *.java
JavaScript *.js
Lisp     *.cl *.clisp *.el *.l *.lisp *.lsp *.ml
Lua      *.lua
Make     *.mak *.mk [Mm]akefile
Pascal   *.p *.pas
Perl     *.pl *.pm *.plx *.perl
PHP      *.php *.php3 *.phtml
Python   *.py *.pyx *.pxd *.scons
REXX     *.cmd *.rexx *.rx
Ruby     *.rb *.ruby
Scheme   *.SCM *.SM *.sch *.scheme *.scm *.sm
Sh       *.sh *.SH *.bsh *.bash *.ksh *.zsh *.ebuild *.eclass
SLang    *.sl
SML      *.sml *.sig
SQL      *.sql
Tcl      *.tcl *.tk *.wish *.itcl
Vera     *.vr *.vri *.vrh
Verilog  *.v
Vim      *.vim
YACC     *.y

# .inl .h .cpp 파일을 c++언어로 인신시켜 tags파일을 만든다.
$ ctags --langmap=C++:.inl.h.cpp -R *

설정파일 셋팅

  • ~/.ctags 파일을 만든후 옵션을 적어 넣는다.
    --langmap=C++:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.C.H.inl
    

네이트온이나 메신저를 이용한 터널링을 하실려면 다른곳을 찾아보세요^^

이것은 방화벽으로 막혀있는 서버를 뚫는 방법을 설명합니다.

MyEn Tunnel을 사용하여 방화벽 안 서버(211.0.0.30) 에 ftp로 접속하는것을 가정하였습니다.

클릭하셔서 보셔야 제대로 보일것입니다.



MyEnTunnel 링크

http://nemesis2.qx.net/pages/MyEnTunnel


Plink 링크
http://the.earth.li/~sgtatham/putty/latest/x86/plink.exe

두개 툴을 동일 디렉토리에 둔후 MyEnTunnel를 실행하세요.
일단 shell에서 vim 명령을 실행해봐서 실행이 안되면 설치를 합니다.

저는 소스 설치를 하였습니다.

$ cd /tmp
$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
$ bunzip vim-7.3.tar.bz2
$ tar xvf vim-7.3.tar
$ cd vim73
$ ./configure --enable-multibyte --enable-cscope --enable-gui=no
$ make
$ make install
지우고 싶으면
$ make uninstall

아래 링크 끝에것을 적용하면 컬러가 나옵니다.
http://kldp.org/node/18698


간단히 정리하자면
.bashrc 제일 밑에 아래를 추가합니다.
alias vi='TERM=iris-ansi vim'


혹은
alias vi='TERM=dttermvim'
솔라리스에서는 아래도 된다고 합니다.
alias vi='TERM=xtermc vim'

http://blog.sdnkorea.com/blog/855?category=10
=================================================================
=================================================================
제 .bashrc 파일
# 특정 IP유저의 설정을 다르게. 자기 IP가 211.2xx.1xx.xx0 이라고 가정
if [ "(211.2xx.1xx.xx0)" = `who am i|awk '{print $6}'` ] ;then
    export LANG=ko_KR.UTF-8
    export LC_ALL="ko_KR.UTF-8"
    export LC_LANG="ko_KR.UTF-8"
    export LC_MESSAGE="ko_KR.UTF-8"
    unalias vi
    alias vi='TERM=dtterm vim'
    #alias vim='vim -T iris-ansi'
    export PS1='\e[0m[\e[1;32m\u\e[0m@\e[1;31m\h\e[0m \w \t]\n\$ '
fi

한글입력 가능하게
~/.inputrc 파일

set meta-flag On
set convert-meta Off
set output-meta On


=================================================================
=================================================================

이건 보너스로
.vimrc 파일

set sw=4 ts=4
sy on
colorscheme ron
set fileencodings=utf-8,euc-kr
map <f1>:!ctags *.h *.cpp<cr>
map <f2> :w!<cr>
map <f3> v%zf
map <f4> zo
map <f5> :25vs ./<cr>:set nunumber<cr>^Ww
map <f6> ^Ww
map <f7> O
map <f8> [i
map <f9> gd
map <f10> ''
map <f11> ^]
map <f12> ^T
set cindent
" set expandtab
set dy+=lastline
set tags=./tags,usr/include/tags
ACE를 공부하면서 해당 책을 4, 5번째 읽는중입니다.

한번씩 더 볼때마다 머리속에 좀더 와닫는 느낌을 받고 있는데요^^.

그런데 왠지 프로그램 공부법이 많이 잘못되지 않았나 하는 생각을 가지게 됩니다.

해당책은 5번정도 봤는데.. 책에 있는 내용을 보고 따라서 코딩은 1회정도밖에 안했다는겁니다.

그래서인지 잘 이해를 못하는 느낌을 받습니다.

몇몇 구간은 작은 프로젝트 때문에 여러번 보고 코딩하고 확인하고 수정하고 해서
어렵지 않게 배우게 되었습니다만..

그외에는 아직이해가 부족하거나 어렵게 생각되게 되는점이 있습니다.

그래서 인데 프로그램을 이해하는데 가장좋은방법은(일단 저에게..) 책을 보고 그것을 그대로 코딩해보고 컴파일및 실행을 꼭 해보는것이라고 생각합니다.

+ Recent posts