work directory를 /media/외장하드/backup.tar.gz로 압축한다.
tar cvfz /media/외장하드/backup.tar.gz work/
위와 같이 할 경우 권한이 없는 파일을 백업하려 할때 Error exit delayed from previous errors 메시지와 함께 백업이 중단될 수 도 있다. 따라서 아래 처럼 하면 더 완벽하게 백업할 수 있다.
sudo tar cvfz /media/외장하드/backup.tar.gz work/


/media/외장하드/backup.tar.gz파일을 /home/kei/에 압축을 푼다.
tar xvfz /media/외장하드/backup.tar.gz /home/kei/
sudo를 이용해서 압축을 했을 경우 아래와 같이 압축을 푼다. 이렇게 하지 않으면 권한이 없는 파일일 경우 압축이 해제되지 않는다.
sudo tar xvfz /media/외장하드/backup.tar.gz /home/kei/



백업중 tar : Error exit delayed from previous errors
에러 발생 이유 :
1) 해당 파티션에 용량이 부족할 경우. 아래 명령으로 용량 확인
df -h
du -h work

2) 권한이 없는 파일을 백업하려 할 경우
tar cvfz /media/외장하드/backup.tar.gz work/ --ignore-failed-read

--ignore-failed-read
              don’t exit with non-zero status on unreadable files

#참고
--exclude=PATTERN
              exclude files matching PATTERN

Backing up data on a Windows machine using TAR and GZIP

Creating a Full Backup

You can create a simple batch file which calls both the tar and gzip programs in turn to create a compressed backup file, which contains all the data files in your specified directory.

Example1.bat

tar -cv –file=backup.tar d:/data*
gzip -9 < backup.tar > backup.tar.tgz
del backup.tar

Backing up More Than One Directory

You can set-up the batch file to backup multiple directory / folder tree structures. Example2.bat shown below demonstrates how this is achieved. You create the initial backup.tar file for your first directory using the -cv command. Then for every other directory structure, you use the -rv command to append the new directory / folder to the backup.tar file.

Example2.bat

tar -cv –file=backup.tar d:/data*
tar -rv –file=backup.tar d:/websites*
gzip -9 < backup.tar > backup.tar.tgz
del backup.tar

Creating an Incremental Backup

Creating an incremental backup is very easy, you just need to specify a date to the –newer command. Tar will then only include files which have changed since that date. The Example3.bat batch file shown below demonstrates creating an incremental backup for all files in the d:/data directory which have been modified since the 1st of September 2004.

Example3.bat

tar -cv –newer=2004-09-01 –file=incremental.tar d:/data*
gzip -9 < incremental.tar > incremental.tar.tgz
del incremental.tar

Download, References

http://downloads.cgi-interactive.net/tar-gzip.zip
http://www.gnu.org/software/tar/manual/index.html
http://www.gnu.org/software/gzip/manual/gzip.html

우선 "fdisk -l" 명령으로 장치 드라이버 이름을 알아본다.
sh-3.2# fdisk -l

Disk /dev/uba: 8292 MB, 8292139008 bytes
49 heads, 48 sectors/track, 6885 cylinders
Units = cylinders of 2352 * 512 = 1204224 bytes

  Device Boot      Start         End      Blocks  Id System
/dev/uba1               1        6886     8097780   b Win95 FAT32
sh-3.2#

여기서는 "/dev/uba1"으로 잡혔구나 ~
장치 드라이버 경로를 알았으니 "/mnt/usb" directory로 mount를 해보자.
만약에 "/mnt/usb" directory가 없을 경우 mkdir /mnt/usb로 directory 생성!!
sh-3.2# mount -t vfat /dev/uba1 /mnt/usb

mount되었는지 'ls"명령으로 확인해보자!
sh-3.2# ls /mnt/usb
??                                     Project_?? ??.zip
??                                     RFIDReader.zip
??                                     Release.zip
??.zip                                 SamsungPrint
????                                   ShapNWitServerProgram.exe
????.docx                              System Volume Information
CDMv2n_20100209.zip                    Utils
CDMv2n_20100211.zip                    Vcard
CDMv2n_20100216.zip                    Visual Studio ?? ?? ??
CDMv2n_20100222.zip                    c#
CDMv2n_20100224.zip                    desktop.ini
DrawCircle.zip                         jffs2root-inetok-20090216-0916.tar.gz
KDebug.cs                              linux-2.6.25.10_20090812.tar.gz
KeiRaysLibrary.zip                     make_root_image.tar.gz
Keipack_20100211.zip                   npki
Keipack_20100216.zip                   p07408_WIT SHAP ????? ???.zip
Keipack_20100222.zip                   r58562.exe
LineSelector                           rcwf.exe
NVCInstFull.exe                        recycler
Project.zip                            wmwifirouter1.3.cab
sh-3.2#

usb드라이버에 한글 부분이 깨져보인다. 이를 해결하기 위해서는 iocharset을 cp949로 맞추어준다.
sh-3.2# mount -t vfat -o iocharset=cp949 /dev/uba1 /mnt/usb
sh-3.2# ls /mnt/usb
CDMv2n_20100209.zip                    Utils
CDMv2n_20100211.zip                    Vcard
CDMv2n_20100216.zip                    Visual Studio 환경 설정 파일
CDMv2n_20100222.zip                    c#
CDMv2n_20100224.zip                    desktop.ini
DrawCircle.zip                         jffs2root-inetok-20090216-0916.tar.gz
KDebug.cs                              linux-2.6.25.10_20090812.tar.gz
KeiRaysLibrary.zip                     make_root_image.tar.gz
Keipack_20100211.zip                   npki
Keipack_20100216.zip                   p07408_WIT SHAP 무선데이터 수집기.zip
Keipack_20100222.zip                   r58562.exe
LineSelector                           rcwf.exe
NVCInstFull.exe                        recycler
Project.zip                            wmwifirouter1.3.cab
Project_회사 작업.zip                  기타
RFIDReader.zip                         동생사진
Release.zip                            문서
SamsungPrint                           작업
ShapNWitServerProgram.exe              작업.zip
System Volume Information              프로토콜.docx
sh-3.2#

usb메모리의 사용이 끝났으면 unmount를 한다.
sh-3.2# umount /dev/uba1
sh-3.2#





아래 코드로 간단하게 해결.

void ConfigureNetwork(char *ip, char *subnetmask, char *gateway)
{
    char command[255];
    sprintf(command, "ifconfig eth0 %s netmask %s up", ip, subnetmask);
    system(command);
   
    sprintf(command, "route add default gw %s", gateway);
    system(command);

    sleep(2);
    // 보나스로 gateway에 ping 3번 날려줌
    sprintf(command, "ping %s -c 3", gateway);
    system(command);
}


인수인계 안 하고 가면 발병 난다
당신은 당신이 없어서는 안 될 존재였음을 증명하고 싶을 것이다. 퇴직 전 업무 인수인계를 철저하게 하지 않으면 퇴직 후 당신의 전화는 마비될 것이요, 당신은 하찮은 놈이 되고 만다. 후임자에게 업무의 모든 것을 꼼꼼히 챙겨 주도록 하라. 단, 당신만의 결정적 노하우 2%는 숨겨둬라. 퇴직 후 꼭 한 번은 회사가 당신에게 부탁하도록 만들어라. 당신의 존재감을 두 번 각인시키는 방법이다.


실업급여, 보험료 혹은 퇴직금을 처절하게 챙겨라
혹, 이 땅의 모든 실업자에게 실업급여가 지급된다고 생각하는 실없는 사람은 아닌지. 실업급여를 지급받을 수 있는 ‘이직 사유’는 따로 있다. 고용안정센터나 노무사 사무실에 문의해 당신에게 최적의 항목으로 선택하라. 대부분의 회사는 이 상황에서 ‘유도리’를 발휘해 준다. 물론 당신의 인간관계도 적잖은 변수가 될 것이다. 건강보험료는 퇴직과 동시에 직장건강보험에서 지역건강보험으로 변경된다. 이때 가족의 피부양자로 등록하면 보험료를 내지 않아도 된다. 마지막으로 퇴직금이다. 회사의 퇴직 규정을 확인해 최대한의 수익(?)을 챙기도록 하자. 실업급여에 의료보험, 퇴직금만 관리해도 6개월은 그냥 먹고 산다. 


내일 그만두겠다고?
최소한 2주 전에는 퇴직 의사를 밝혀야 한다. 민법상으로는 1개월 전에 예고해야 하지만 보통 3주 정도면 충분한 시간이다. 이때 회사 특성을 고려해 퇴직 의사를 표시하는 게 좋다. 원리 원칙이 중요한 회사라면 더욱 주의해야 한다. 이 또한 훗날의 평판조회(Reference Check)를 대비하는 노하우다.


치사하게 굴지 마라
마지막으로 ‘화려한 휴가’를 계획하지 말 것. 밀린 휴가보다는 ‘화목한 근태’를 추구하라. 지각을 삼가고 업무에도 더욱 성실하게 임하라. 당신은 당연한 권리라고 말하겠지만, 주위의 동료들은 당돌한 권리라고 여길 것이다. 떠나는 자는 늘 시기와 질투의 대상이다. 유종의 미를 거두자.


원수가 되지 마라
이직이나 일신상의 이유가 아닌 이상, 회사나 상사와의 문제가 퇴직의 주원인이다. 그러다 보면 감정이 앞서거나 자칫 언성을 높여 실수할 수 있다. 마지막까지 웃어라. 퇴직의 그날까지 밝고 경쾌한 모습을 보여라. 절대 싸우지 마라. 세상은 넓고 할 일은 많지만 ‘바닥’은 좁고 찍히면 죽는다! 누군가 당신에 대해 물었을 때 감정 섞인 반응이 나오게 하지 마라. 이직에 장애물이 될 수 있다.


사직서부터 들이대지 마라
사직서 제출과 동시에 퇴직을 통보하는 이들이 있다. 보통 배짱이 아니다. 퇴직의 의사는 직속 상사와 먼저 상의하도록 하자. 물론 당신의 퇴직 사유를 완곡하게 설득시켜야 한다. 당신이 상사를 신뢰하고 있음을 보여주라. 퇴직의 모든 과정이 좀 더 원활하게 이뤄질 것이다. 단, 확실한 퇴직의 사유를 준비한 다음 대화에 임해야 한다. 사직서는 가장 마지막에 이뤄지는 서류상의 절차일 뿐이다.


퇴직도 타이밍이다
퇴직의 시기를 결정하는 것도 중요한 문제다. 물론 이직이 결정됐다면 어쩔 수 없겠지만 가급적 퇴직의 시기를 고려하라. 인수인계를 철저히 하고 회사에 미리 이야기했어도, 마지막까지 경쾌하게 근태했어도, 타이밍을 잘못 잡으면 아무 소용이 없다. 인사이동 직후나, 중요한 프로젝트의 절정을 퇴직의 타이밍으로 잡았다면 아스팔트에 다이빙하는 격이다.


‘쿨’하게 떠나고 ‘핫’하게 관계하라
모두가 아쉬움의 군침을 삼킬 만큼 멋지게 떠나라. 하지만 거기서 끝내지 마라. 회사를 떠난 후에도 관계를 유지하라. 정기적인 만남을 갖는 것도 좋다. 새로운 자리를 구하지 못했다면 이직의 정보를, 새로운 자리를 잡았다면 업계의 정보를 공유할 수 있다. 그리고 아등바등 살아남으려 애쓰기보다 바닥관리만 잘해도 평균 이상 간다.


절친한 상사에게 작별 인사
아무리 급작스러운 퇴직이라도 평소 절친했던 상사에게는 고마움을 전하라. 동년배나 후배는 퇴직 후에도 편하게 만날 수 있다. 하지만 상사는 쉽지 않다. 부서가 다르다면 더욱 그러하다. 일부러 찾아가 인사하는 당신, 언젠가 일로 부름을 당할 것이다. 간소한 선물로 감사의 마음을 전하는 것도 방법이다.


정에 얽매이지 마라
‘떠날 때는 말없이’라고 했다. 정에 얽매이지 마라. ‘일주일만 더’라고 요구할 수 있겠지만 냉정하게 잘라야 한다. 당신의 미래에 집중하라. 퇴직 예정자가 오랫동안 사무실에 남아있는 것도 민폐다. 배려는 장기화되면 배신이 되고, 과정(過程)이 길면 과정(過情)이 되니, 오만 정 다 떨어지기 십상이다.


 

 

그럼에도 불구하고 이것만은 꼭!

Rule No.1 이메일과 하드디스크의 야시시를 과감히 지워라
귀찮다고 정리하지 않은 이메일과 컴퓨터 하드디스크. 한번 쓴 컴퓨터, 중고라고 폐기처분하는 회사는 (아마도) 지구상에 없다. 분명 당신의 후임자가 물려받게 된다. 당신이 하이드로 변했을 때 긁어모았던 야시시~들, 지워라. 지우고 떠나자. 떠나고 나서 변태스러운 낙오자로 찍히기 싫다면 과감히 ‘delete’ 하라.


Rule No.2 “그~녀를 만나요~”
사내 연애에 상당한 거부감을 갖고 있었다면, 혹은 당신의 호감녀가 그러했다면 이젠 과감히 대시하라.(으흐흐!) 당신은 떠나고 그녀는 남았으니 더 이상 거리낄 것이 없다. 인생 짧은 거 초등학교 1학년도 알고 있다. 어찌 하늘을 봐도 별 딸 생각을 안 하느뇨. 떠나는 순간 이야기하자. “순자 씨, 나 이제 갑니다. 그동안 당신에게 품었던 연정은 그대로 두고 갑니다”(라고 말하면 쌍팔년 노총각 되기 십상이다. 비장의 무기는 각자 준비하자).


Rule No.3 거래처에 당신의 안위를 알려라
하루가 멀다하고 연락하던 거래처에 직접 퇴사를 알려라. 아무런 소식 없이 사라지면 다시 등장했을 때 서먹한 기운 감돌기 쉽다. 명함을 정리하고 목록을 뽑아 회사 이메일로 감사의 인사를 전하자. 마지막에는 꼭 당신을 기억할 만한 한마디를 남기자. 돌아온 장고가 되려면 확실한 인상을 남겨야 한다.


Rule No.4 영수증 정리 칼같이 하라
이미 사직서를 냈다면 회사에 단 1분도 앉아있기 어렵다. 마음이 떠나니 몸도 떠나고 싶고 날 받아 놨으니 긴장 풀리는 것은 당연하다. 여기서 간과하면 안 될 일이 있다. 남은 급여는 칼같이 챙기면서도 마지막 달의 진행비나 접대비는 귀찮다고, 혹은 마음이 바빠 잊고 지나가기 일쑤다. 퇴직 후 이런 일로 회사에 들르는 것도 못할 짓이다. 그렇다고 그냥 넘어가자니 적지 않은 액수에 배 아파 죽을 수도 있다. 늘 그랬듯이 영수증 보길 황금같이 하여 아픈 배 움켜잡는 일 없도록 하자.


출처:
http://blog.empas.com/knoize/25534563
http://blog.daum.net/unininu/5974461


MSTK2440 보드가 정상 동작하는가 확인하기 위해서 간단한 startup 프로그램과 c프로그램을 만들어 봤다.
start.s 파일을 보면 진짜 별거 없다. Watch dog과 인터럽트를 disable하고 바로 C프로그램의 Main함수로 jump했다. Reset 이외의 exception들은 전부 처리하지 않았다. 일단 스택과 SDRAM 동작 설정을 아무 것도 하지 않았기 때문에 C프로그램에서 변수와 로컬함수 사용은 불가능하다. ㅋㅋ 그저 LED만 껐다 켰다 해볼뿐. delay함수 구현도 안되었기 때문에 Jlink로 하나의 step씩 실행해야 LED 점멸 결과를 알 수 있다ㅋㅋ 아래의 start.s 소스를 보면 이후 start up 코드의 기본 뼈대가 될 것이다.

; start.s
 AREA    Init, CODE, READONLY
 ENTRY
 
 ;Exception Vector Table
 b ResetHandler
 b HandlerUndef ;handler for Undefined mode
 b HandlerSWI  ;handler for SWI interrupt
 b HandlerPabort ;handler for PAbort
 b HandlerDabort ;handler for DAbort
 b .    ;reserved
 b HandlerIRQ  ;handler for IRQ interrupt
 b HandlerFIQ  ;handler for FIQ interrupt


 IMPORT  Main    ; The main entry of mon program

;=======
; ENTRY
;=======
ResetHandler
 ldr r0,=0x53000000   ;watch dog disable
 ldr r1,=0x0
 str r1,[r0]

 ldr r0,=0x4A000008
 ldr r1,=0xffffffff  ;all interrupt disable
 str r1,[r0]

 ldr r0,=0x4A00001C
 ldr r1,=0x7fff  ;all sub interrupt disable
 str r1,[r0]

 b Main
 b .
 
HandlerUndef
HandlerSWI
HandlerPabort
HandlerDabort
HandlerIRQ
HandlerFIQ
 b .



// Main.c
#define rGPBCON (*(volatile unsigned int*)0x56000010)
#define rGPBDAT (*(volatile unsigned int*)0x56000014)

// start.s에서 스택설정이 안되었기 때문에 아직 동작안함
void delay(int d)
{
 int i=0;
 for(i=0;i<d;i++);
}

void Main()
{
 // GPB5,6,7,8 output으로 설정 -> s3c2440 데이터 시트 참조
 rGPBCON = (0+(0x01<<10)+(0x01<<12)+(0x01<<14)+(0x01<<16));
 rGPBDAT = ~((1<<5) + (1<<8)); // GPB5, GPB8 LED ON
 
 while(1)
 {
  rGPBDAT = 0xffffffff; // LED OFF
  //delay(1000);
  
  rGPBDAT = 0x0;    // LED ON
  //delay(1000);
 };
}



'ARM > MSTK-2440' 카테고리의 다른 글

MSTK-2440 보드 회로 분석  (0) 2009.08.21
MSTK-2440 보드 소개  (0) 2009.08.21
매수의 3신호
 쌍바닥
 추세선 상향 돌파
 거래량의 점진적 증가

----------------------------------
이동 평균
 현재 주가가 중장기적으로 어느 수준에 있는지를 나타낼 뿐 아니라 투자자들이 시장을 긍정적으로 보는지, 아니면 비관적으로 보는지를 평가할 때 쓰임.

상대강도지수(RSI)
 일정기간에 주가상승폭 합계를 상승폭 합계와 하락폭 합계를 더한 값으로 나눈 뒤 100을 곱해 구함. 이 값이 30아래이면 매수를 고려해볼만함

변동성 지수
 이 지표가 떨어지면 투자자들이 리스크를 떠안으려는 것으로, 반대로 올라가면 리스크를 조심하는 것으로 해석

THE TRIN
 상승 종목수, 하락 종목 수와 이들 종목 거래량 관계를 나타냄. 보통 장중에 세력 상황을 분석하는 데 사용되지만 중장기 분석을 하는데도 사용함

Odd-lot Shorts(단주 공매도 동향)
 개미 투자자는 항상 틀린다는 전제로 만들어진 기술적 지표. 단주 공매도 또는 100주 미만 소량 매물이 쏟아지면 개인들이 파는 것이므로 살 기회
[ 도 입 ]

ㅇ 나는 외모에 컴플렉스가 있다.

아시겠지만, 대학교 때 고시 3개를 합격했다.

사법고시 합격, 외무고시 2등, 행정고시 1등,

그리고 서울대 법대를 수석 졸업했다.

학교 졸업 후 부모님께 큰 절을 했었다.

똑똑한 머리를 물려줘서가 아니라,

사실은 변변찮은 외모덕에

그저 고시에만 전념할 수 있게 해줬기 때문에 감사하다는 의미로.


[ 본 론 ]

ㅇ 내 직업은

① 변호사이면서,

② 방송도 하고, 3년 전부터

③ 책을 쓰고 있다. 평생 소원이 1년에 1권씩 평생 책을 내는 것이다.

④ 글도 쓴다. 모 신문사에 경제기사를 1주일에 2개정도 쓴다.

⑤ 또 오늘과 같은 특강도 한다. 평균 1주일에 2회 정도.

⑥ 증권분야에서도 활동하고 있다.

운영하고 있는 사이트가 있는데

회원수만도 3만 5천명 정도 된다.

나름대로 홈페이지 관련 사업을 하나 구상중인 것도 있다.

⑦ 마지막으로 대학에서 겸임교수로 활동하고 있다.

이처럼 내가 하고 있는 일이 무척 많은 것 같고

어떻게 이걸 다 할까 생각이 들겠지만 다 가능하다.

이 중에서 한가지만 하더라도 힘들다고 하는 사람이 많다.

그러나 가능하다고 생각하면 다 가능하다.


ㅇ 무엇이든지 목표가 중요하며,

그 목표 달성을 위해 가장 중요한 것은 확신이다.

사람들은 어려운 일일수록 확신을 갖지 못한다.


ㅇ 사람들은 나의 삶을 보면서 머리가 좋다고 생각한다.

그러나 사실은 전혀 그렇지 않다.

다 노력의 결과다.


ㅇ 학교 다닐 때 누구나 학원도 다니고 과외도 해 봤을 것이다.

고 2때 수학 45점의 낙제점수를 받은 적이 있다.

그 때 대학을 못 간다는 선생님의 말이 나에겐 큰 충격이었다.

그러나 집안이 그리 넉넉하지 않았기 때문에

과외를 한다는 것은 생각 할 수 없었다.

그래서 6개월간 죽어라고 했다.

그리고, 그 해 9월 2학기 때 400점 만점에 400점을 받았다.

그 이후로 매 시험마다 1등 했고,

석달에 한 번 정도 2등을 했었다.

학생시절 나는 여러 차례

내가 결코 남들보다 머리가 좋지 않다는 것을 깨달았고,

남보다 더 많은 노력을 해야 남만큼의 결과를 얻을 수 있다는 것을

알았다.


ㅇ 인생에 있어 2가지 자세가 있다.

보통 사람들은 남보다 적게 노력하고

결과는 남들과 똑같이 나오게 하려고 한다.

사실은 이것이 경제학 법칙에 맞는 것이다.

투입을 적게하고 효과를 많이 내는 것.

반대로, 다른 사람들 만큼의 결과를 얻기 위해서는

더 많은 노력을 해야 한다고 생각하는 것이다.

나의 경험상으로 보면 후자가 훨씬 좋은 결과를 낳는다.

남보다 노력을 더 많이 해서 비슷한 결과를 가져 오는 것이

비효율적인 것 같지만,

실제로 이것은 어느 시점이 지나면 훨씬 더 좋은 결과를 가져온다.

이것이 내가 인생을 살면서 내 스스로 내린 결론이다.


ㅇ 그럼 노력이란 무엇이냐?

나는 “노력이란 성공의 확률을 높이는 것이다” 라고 정의 내린다.

하지만 물론 결과를 반드시 보장하지는 않는다.

노력에도 함수 관계가 성립한다.

* 노력 = f(시간 × 집중)

내가 실제 노력을 했는가 안 했는가를 판단하려면

시간을 많이 투입했거나 집중을 잘 했는가를 살펴보면 된다.


ㅇ 똑같은 일을 하더라도 3시간만에 끝내는 사람이 있는가 하면

5시간만에 끝내는 사람도 있다.

그러나 3시간만에 끝내는 사람이 실제 일을 더 잘하는 것 같지만

나머지 2시간을 어떻게 보내느냐가 중요하다.

더 많이 알기 위해 그 2시간을 투자하지 않았다면

노력하지 않은 것이다.


ㅇ 집중에 대해서 얘기해 보면,

고시 공부할 때 예를 들어 보겠다.

나는 고시 공부를 1년간 해서 합격했다.

어떻게 가능 했느냐?

첫째는 된다고 생각하는 확신이 있었기 때문이고,

둘째는 남보다 더 많은 노력을 했기 때문이다.

보통 고시에 합격하려면,

봐야 할 책이 50권,

권당 페이지는 500P,

그 책을 5번을 봐야 합격하다는 얘기가 있다.

그러나 나는 7번을 보았다.

이를 계산해 보면 50 × 500 × 7 = 175,000 페이지를

읽어야 한다는 얘기다.

이것을 1년을 360일로 계산해보면 1일 목표량이 나온다.

즉, 1일 500 페이지 정도의 분량을 봐야 한다는 계산이다.


ㅇ 이처럼, 목표를 세울 때는 구체적으로 세워야 한다.

막연한 목표는 달성하기 힘들다.

이 결론을 보면 "인간이 할 짓이 아니다" 라고 생각할 것이다.

누구나 그렇게 생각한다.

그렇게 생각하면 사람들은 포기하게 된다.

설사 하게 되더라도 하다가 흐지부지 된다.

이렇게 목표에 대해 확신이 없고,

목표를 의심하는 사람은 집중을 할 수 없다.

무엇보다도 자신의 목표에 확신을 가져라.


ㅇ된다는 사람만 되고 안 된다고 생각하는 사람은 안 된다.

일단 안 된다고 생각하는 대부분의 85%의 사람들은

이미 나의 경쟁상대가 아닌 것이다.

된다고 생각하는 일부만 나의 경쟁이 된다.

그럼 경쟁대상이 줄어드니 훨씬 마음도 한결 가벼워 진다.


ㅇ 세상도 절대적으로 잘 하는 사람은 원하지도 않고

필요하지도 않다.

남 보다만 잘 하면 된다.

그럼, 다른 사람보다 잘 하고 있는지를 어떻게 판단하느냐?

그것은 나 자신을 판단 기준으로 삼으면 된다.

인간은 거의 비슷하다.

내가 하고 싶은 선에서 멈추면 남들도 그 선에서 멈춘다.

남들보다 약간의 괴로움이 추가되었을 때라야 비로소

노력이란 것을 했다고 할 수 있다.


ㅇ 고시 공부할 때 7시간 잤다.

장기간 공부를 해야 할 경우라면 일단 잠은 충분히 자야 한다.

하루 24시간 중 나머지 17시간이 중요하다.

고시생의 평균 1일 공부시간은 10시간 정도다.

그러나 정말 열심히 하는 사람은 잠자는 시간 빼고

17시간을 하는 사람이 있을 것이다라는 생각을 했다.

그러면 정말, 밥 먹는 시간도 아까웠다.

남들과 똑같이 먹어서는 안 된다고 생각한 것이다.

반찬 떠 먹는 시간도 아까웠다.

씹는 시간도 아까웠다.

그래서 모든 반찬을 밥알 크기로 으깨어 밥과 비벼

최대한의 씹는 시간도 아꼈다.

숟가락을 놓는 그 순간부터 공부는 항상 계속 되어야 했다.

나의 경쟁자가 설마 이렇게까지 하겠냐 하고 생각들면

노력했다고 할 수 있는 것이다.


ㅇ 미국에서 생활 할 때 보면

소위 미국의 전문가라고 하는 사람들은

간단한 샌드위치로 끼니를 때운다.

점심시간 1시간 다 쓰고,

이래저래 20~30분 또 그냥 보내는 우리 나라 사람들은

그들에 비하면 일 하는게 아니다.


ㅇ 집중을 잘 하는 것은 벼락치기 하는 것이다.

벼락치기 할 때가 더 기억에 오래 남는다고 한다.

우등생은 평소에 벼락치기 하는 마음으로 공부를 한다.

이렇게 할 수 있는 이유는 목표가 분명하기 때문이다.

막연한 목표를 가지면 이렇게 긴장이 안되지만

분명하면 항상 긴장되고 집중을 잘 할 수 있다.


ㅇ 방송하면서 인생이 많이 바뀌었다.

처음 주변 사람들은 말렸지만

결과적으로 보면 좋은 결과를 가져왔다.

나는 세상을 살면서 이런 생각을 해 본다.

사람은 해야 할 일과 하지 말아야 할 일이 있다.

사람이 해야 할 일이란

남에게 해를 끼치는 일이 아니면 해도 되는 일이다라고 생각한다.

그렇게 생각하면 세상에 해야 할 일이 참 많다.


ㅇ 나에게는 인생 철학이 있다.

인생을 살다 보면 A와 B가 있을 때

나는 A가 더 중요하지만 B를 선택해야 할 경우가 많다.

그럴 때 어떤 것을 선택하느냐는 매우 중요하다.

학교 다닐 때 나는 A는 여자친구 였고,

B는 고시 합격 이었다.

대학시절 한 때 A는 내게 무척 중요한 시기가 있었다.

여기서 내가 말하는 t1, t2판단법이란게 중요하다.

내가 A를 선택하면 난 B를 성공할 수 있는 확률은 줄어든다.

그러나, 나의 외모 컴플렉스 때문에

A를 성공하는 일 또한 확신이 없었다.

그래서 나는 B를 먼저 해서

좀 더 유리한 조건이 되면 A도 이룰 수 있다고 생각했다.

그렇게 결론을 내리면

고시합격을 더 빨리 해야 할 필요성을 느끼게 되어 집중도 잘 되었다.

이것이 내가 인생을 살아가면서 느낀 것이다.

장기간 동안 시간의 흐름을 계산해 볼 때

무엇을 먼저 해야 하는가를 판단하는 것은 매우 중요하다.


ㅇ 그래서 난 남들이 말려도 우스꽝스러운 모습으로

코미디 프로에도 나갈 수 있었다.

난 "할 수 있을 때 뭐든지 해 버리자" 라는 생각으로

할 수 있는 건 다 한다.

그러면서 인생에서 내가 할 수 있는 일들을 쌓아 가면 된다.

하다가 안되면 포기하더라도 아예 안 하는 것보다는 낫다.

아예 하지 않으면 할 수 있는 일은 아무 것도 없다.


ㅇ 나의 징크스는 시험에 합격하려면 10번을 봐야 하는 것이다.

그래야 합격의 확신을 갖는다.

3~4번만 보면 불안하다.

그래서 그냥 뭐든지 기본적으로 10번을 본다.

몇 번 3~4번 책을 보고 시험을 본 적 있다.

역시 떨어졌다.


[ 결 론 ]

ㅇ 앞으로는 이렇게 해 보자.

첫째는 남보다 많이 노력하는 것이다.

둘째는 어려운 목표일수록 확신을 가져 보자.

그러면 정말 되는 일이 훨씬 많다.

셋째는 남보다 최소 3배는 해야 한다고 생각하자.

.
.
.
펌글
CF(Compact Framework)환경에서는 Applicaion.StartUp을 지원하지 않는다.
따라서 아래의 방법을 사용한다.

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)


'유머' 카테고리의 다른 글

대한민국 공대의 현실  (0) 2011.04.12
여보 우유좀 사와.  (1) 2011.04.05
회장님은 위장 취업 중  (0) 2011.02.25
대한민국 모임의 패기  (0) 2011.02.20
한라봉은 이렇게 까먹어야 제맛.  (0) 2011.02.18
우분투 기본 환경 설정

1. Ubuntu 7.1 Server 설치

# sudo apt-get update
# sudo apt-get dist-update


2. Locale 변경
#  sudo locale-gen ko_KR.EUC-KR
#  /etc/environment 의 LANG를 ko_KR.EUC-KR로 수정


3. Webmin 설치

# Webmin 다운로드 :  webmin_1.400_all.deb
# dpkg --install webmin_1.400_all.deb
# apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libmd5-perl


4. apache2 환경설정

# sudo a2enmod rewrite : mod_rewrite추가
# /etc/apache2/sites-available/default 에 AllowOverride all로 변경
# /etc/apache2/Apache2.conf에 다음의 설정을 추가/확인
<IfModule mod_rewrite.c>
   RewriteEngine On
</IfModule>


5. proFTPD 환경설정

# sudo apt-get install proftpd
# /etc/proftpd/proftpd.conf에 다음의 내용을 추가
<Global>
RootLogin off              # root 로그인 방지
AllowForeignAddress on     # 외부 접속 허용/금지
AllowRetrieveRestart on    # 이어받기 허용/금지
AllowStoreRestart on       # 이어쓰기 허용/금지
DeferWelcome on           
ServerIdent on
LoginPasswordPrompt on     # 사용자 암호 묻기
AllowOverwrite on          # 겹쳐쓰기 허용
AuthAliasOnly on           # 인증된 alias 사용자만 사용
UserAlias #### #### (ftp user, shell user : 필요한 사용자 이름으로 지정)
UseFtpUsers on             # Ftp용 사용자를 사용
RequireValidShell off      # shell로 로그인된 사용자만 사용
HiddenStor on              # hidden속성 저장
</Global>


6. Samba 환경설정

# sudo smbpasswd -a <userid> : Samba 사용자 추가
# /etc/samba/smb.conf Global 옵션 추가/확인
[global]
 encrypt passwords = true
 netbios name = <server name>
 server string = <server name>
 writable = yes 
 invalid users = root
 workgroup = WORKGROUP
 unix charset = euc-kr
# /etc/samba/smb.conf 에 공유디렉토리 추가
[test]
 hide dot files = no
 delete readonly = yes
 path = /../../.. (공유할 디렉토리)
 sync always = yes
# sudo /etc/init.d/samba restart
 

7. Java 설치

# sudo apt-get install sun-java5-bin sun-java5-plugin
# sudo update-alternatives --config java : Java Defualt를 설정

8. Tomcat & JDK 설치

# sudo apt-get install tomcat5.5 sun-java6-jdk tomcat5.5-webapps tomcat5.5-admin
# /etc/default/tomcat5.5 에 JAVA_HOME 설정/확인
JAVA_HOME=/usr/lib/jvm/java-6-sun
# sudo update-alternatives --config java : Java Defualt를 설정
# sudo /etc/init.d/tomcat5.5 start : 톰켓 시작
# wget http://localhost:8180 : 접속하여 확인

9. SVN 설치

# sudo apt-get install subversion libapache2-svn
# svnadmin create --fs-type fsfs /../../.. : 리포지토리 디렉토리 생성
# svnserve -d -r /../../..  : 시작 스크립트
# killall svnserve          : 종료 스크립트

10. build환경 구성
# sudo apt-get install gcc
# sudo apt-get install build-essential

특 이사항
# 보안상 문제가 있을지라도 Webmin은 상당히 좋은 툴 이다. 이런저런 스크립트가 내장되어 대부분 gui에서 실행하면 스크립트와 설정파일을 얻을수가 있다

# 문자세트를 euc-kr로 통일 Ftp, Web, Samba, Local에서 만든 한글 디렉토리또는 파일이름이 잘 출력된다.


참조 : http://jongsik.tistory.com/126
1. 서브버전 설치
$ sudo apt-get install subversion

2. 저장소 확보
$ mkdir /home/dev/svn

3. 저장소 생성 (sample 저장소 생성)
$ svnadmin create --fs-type fsfs sample

4. 사용자 인증 설정
$ vi /home/dev/svn/sample/conf/svnserve.conf

auth-access = write 주석 해제
password-db = passwd 주석 해제

$ vi /home/dev/svn/sample/conf/passwd 에서 아이디, 암호 입력

5. SVN 서버 시작
$ svnserve -d -r /home/dev/svn



# mkdir 리눅스폴더명
# mount -t smbfs -o username=test,password=test //호스트IP/윈도우폴더명 /리눅스폴더명

ex)
$ sudo mount -t smbfs -o username=jgl,password=jgl85 //192.168.1.39/jgl /mnt/

'Linux' 카테고리의 다른 글

우분투 기본 환경 설정  (0) 2010.02.11
kubuntu에서 SVN server 설치하기  (0) 2010.02.11
[kubuntu/ubuntu] NFS 서버 설치와 설정  (0) 2010.02.04
SSH, SAMBA 설정하기  (0) 2010.01.29
기본적인 개발 환경 구축  (0) 2010.01.29
 .NET Framework 2.0 이상에서는 손쉽게 Stopwatch 클래스를 사용하면 되겠지만 CF(Compact Framework) 환경에서는 이 를 사용할 수 없다. 이를 해결하기 위해서는 System.Environment.TickCount을 사용해야 한다.

int start = System.Environment.TickCount;
for (int i = 0; i < 10; i++) System.Threading.Thread.Sleep(10); // 100ms 대기
int end = System.Environment.TickCount;
int duration = end - start;
Console.WriteLine("{0}ms", duration);

Stopwatch 클래스를 이용해서 실행시간을 구하는 방법
http://ocplay.tistory.com/99


1. nfs-kernel-server, nfs-common, portmap 패키지 설치
$ sudo apt-get install nfs-kernel-server nfs-common portmap

2. 서버 설정
$ sudo vi /etc/exports

/home/dev 192.168.1.*(rw,no_root_squash,no_all_squash,async,no_subtree_check)

3. 서버 재시작
$ sudo /etc/init.d/portmap restart
$ sudo /etc/init.d/nfs-kernel-server restart
$ sudo /etc/init.d/portmap restart

-----------------------------------------------------------------------

다른 시스템에서 NFS 공유 폴더를 마운트하기
$ mount -t nfs -o nolock 192.168.1.48:/home/dev /mnt/nfs


'Linux' 카테고리의 다른 글

kubuntu에서 SVN server 설치하기  (0) 2010.02.11
리눅스에서 윈도우 공유 폴더 마운트하기  (0) 2010.02.10
SSH, SAMBA 설정하기  (0) 2010.01.29
기본적인 개발 환경 구축  (0) 2010.01.29
Kubuntu 9.10 한글 입력 설정  (0) 2010.01.29
작업 중에 데이터 복사하는 루틴을 수정하고 있었는데, 문득 for문을 돌려서 무식하게 데이터를 집어넣는 방법과 시샵에서 C언어의memset함수 격인 Array.Copy 메소드를 사용하는 방법 중 어는 쪽이 더 빠를까 궁금증이 생겼다. 그래서 바로 테스트 해본 결과 놀랍게도 무식하게 for문돌려서 데이터를 복사한 방법이 더 빨랐다.

테스트 코드
int[] src = new int[40000000];
int[] dst = new int[40000000];

for (int i = 0; i < src.Length; i++)
{
src[i] = 0xff;
}

Stopwatch sw = new Stopwatch();

// -------------------------------------------------------
 sw.Start();
for (int i = 0; i < dst.Length; i++)
{
                dst[i] = src[i];
}
sw.Stop();
Console.WriteLine("{0}ms", sw.ElapsedMilliseconds);
 // -------------------------------------------------------

sw.Start();
Array.Copy(src, dst, dst.Length);
sw.Stop();
Console.WriteLine("{0}ms", sw.ElapsedMilliseconds);


결과
for문 복사 : 262ms
Array.Copy 메소드를 이용한 복사 : 348ms

흥미로운 결과가 한가지 더 있다.
CPU 점유율을 체크해본 결과 for문으로 돌렸을 때 CPU점유율이 Array.Copy 메소드를 썼을 때 보다 약 10프로 정도 더 먹는 것을 볼 수 있있다. 뭐 Array.Copy 메소드 내부가 어떻게 구현되어있는지는 확인해봐야 알겠지만 for문 돌리는게 CPU 점유율이 더 먹는건 당연한 것 같다. 시간날 때 왜 이런가 이유를 밝혀내봐야 겠다 ㅋㅋ



1. SSH 설치
 $sudo apt-get install ssh

2. SSH 재시작
 $sudo /etc/init.d/ssh restart

-------------------------------------------------------------------

1. SAMBA 설치
 $sudo apt-get install samba smbfs

2. SAMBA ID 생성
 $sudo smbpasswd -a 아이디
 (가급적이면 리눅스 계정과 동일한 이름으로 해야  관리가 편하다.)

3. smb conf 수정
 $sudo vi /etc/samba/smb.conf

#======================= Share Definitions =======================
[Myfolder]
   comment = work Directories
   path = /
   browseable = yes
   read only = no
   writable = yes 

예)
[home]
 comment = Linux dev machine
 path = /home/dev
 browseable = yes
 read only = no
 writable = yes  

# samba 속도 향상
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=4096 SO_RCVBUF=4096 

4. SAMBA 재시작
 $sudo /etc/init.d/samba restart


우분투, 쿠분투들은 기본적으로 설치되지 않는다.
하지만 콘솔환경에서 손쉽게 설치할 수 있다.

sudo apt-get install build-essential

설치가 잘되었는지 확인하는 방법은
gcc 만 콘솔에 입력 했을 때 "gcc: no input files"라는 메시지가 나오면 성공!!
한글 입력이 안된다. ㅠ.ㅠ
구글에서 검색해보니 답을 찾았다.


Kickoff 프로그램 실행기(윈도우즈에서 시작메뉴와 같은 것) - 컴퓨터 - 시스템 설정 - 국가 및 언어 - Select System Language 에서,
언어선택: 한국어
키보드 입력 방식: nabi

그리고 시스템을 재부팅하고 나면 ctrl + space 키 조합으로 한글 입력이 잘된다.

쿠분투를 설치할 때 분명히 한글을 선택했음에도 불구하고 언어 설정이 영어로 되어 있었다.
이럴 경우 한국어 패키지를 설치 해야 한다.

터미널에서 apt-get을 이용하여 아래의 방법으로 한국어 패키지를 설치한다.
$sudo apt-get install language-pack-kde-ko
$sudo apt-get install language-pack-kde-ko-base

KDE가 아닐 경우 아래의 두 패키지를 설치한다.
language-pack-ko
language-pack-ko-base

설치 후
System Settings -> Personal의 Regional & Language 선택
Add Language에서 Korean 선택



악 ㅋㅋㅋㅋㅋ 배째겠당 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

'It`s me.' 카테고리의 다른 글

블로그 이사했습니다.  (0) 2010.05.10
Visual Studio 2010 사용기  (0) 2010.04.20
2009 개발 언어 순위  (2) 2009.12.13
더디어 성공.  (1) 2009.11.03
대형 사고를 치다.  (0) 2009.07.19

.NET 프로그래밍을 하는 데에 있어 한가지 장점을 꼽으라면 전에 비해 상당히 쉬워진 멀티쓰레드 프로그래밍이라고 있다. 하지만 많은 개발자들이 놓치는 부분이 쓰레드에서 UI 접근하는 부분이다.

 

우선 윈도우즈 프로그래밍에서 UI부분이 어떻게 동작하는지 이해할 필요가 있다. 윈도우에서 UI 메시지 펌프 (Message Pump)라고 불리는 방법에 의해서 화면에 그려진다. 선하나를 화면에 그린다고 가정하면, 윈도우즈는 선을 계속해서 반복적으로 그림으로써 사용자에게 마치 선이 하나가 있는 것처럼 보이게 하는 것이다. 그리고 이를 위해 많은 메시지, 인스트럭션이 보내진다.

 

예를 들어 폼의 이벤트를 살펴보면 OnPaint라는 이벤트를 발견할 있다. 이벤트내에 int I = 0; 이라는 코드를 삽입하고 브레이크 포인트를 걸어 실행을 시켜보면 윈도우는 보이지 않고 브레이크 포인트가 계속 해서 걸리는 것을 있다. 사용자가 모르는 사이 .NET 프레임웍은 윈도우즈에 해당 UI 화면에 그리도록 명령을 끊임 없이 보내며 이벤트를 발생시키는 것이다.

 

여기서 한가지 중요한 부분이 있다. .NET 프레임웍은 윈도우즈에 메시지를 보내는 과정에서 이벤트를 발생 시킴으로써 개발자에게 자신의 코드를 삽입할 기회를 부여한다는 것이다. 모든 부분이 UI 접근하려는 쓰레드와 관련이 있다.

 

모든 프로그램은 기본적으로 하나의 쓰레드로 시작이 된다. 따라서 폼을 화면에 그리는 메시지와 이벤트들도 쓰레드 안에서 구동이 된다. 하지만 사용자가 시작한 쓰레드는 쓰레드와는 별개로 실행이 된다. 따라서 커스텀 쓰레드에서 UI 직접 접근을 하면 적절한 마샬링 없이 다른 쓰레드를 침범하는 것이다 (Cross Thread). 다시 말해, UI 쓰레드가 열심히 화면에 폼을 그리고 있는데 갑자기 다른 쓰레드가 와서 짓을 하고 가는 꼴이 되버리는 것이다.

 

이를 위해서 UI 컨트롤들은 Invoke, BeginInvoke 메서드와 InvokeRequired 속성을 지원한다. Invoke 메서드는 동기 (Synchronous) 메서드이고 BeginInvoke 비동기 (Asynchronous) 메서드이다. 메서드들은 컨트롤들이 생성된 쓰레드의 메시지 펌프에 커스텀 코드를 삽입하여 쓰레드에서 컨트롤를 업데이트할 있도록 한다. Win32에서 SendMessage PostMessage 생각하면 된다. InvokeRequired 속성은 Boolean 값을 반환하며 Invoke InvokeRequired 메서드를 호출해야 하는지를 알려준다.

 

Invoke BeginInvoke 메서드는 인자로서 delegate 형태를 받는다. 다음은 Invoke 메서드를 호출하는 방법중 하나이다.

 

this.Invoke(new MethodInvoker(UpdateMe));

void UpdateMe()

{

}

 

MethodInvoker 프레임웍에서 지원하는 delegate 클래스로 인자가 없는 메서드들을 호출 있도록 정의가 되어있다. 만약 인자를 넘겨줄 필요가 있다면 delegate 따로 정의하여 사용하면 된다. 다음은 인자를 갖는 메서드를 호출할 때의 예이다.

 

Delegate void UpdateMeDelegate(string message);

this.Invoke(new UpdateMeDelegate(UpdateMe), “This is the message”);

toid UpdateMe(string message)

{

}

 

Invoke 메서드는 동기 메서드이기 때문에 바로 실행되어 시간이 걸리는 작업에는 적합하지 않다. 이런 경우는 비동기 메서드인 BeginInvoke 사용하면 된다. BeginInvoke 메서드는 EndInvoke 메서드와 짝으로 구동이 된다. EndInvoke 비동기로 실행된 작업을 완료하는 역할을 한다.

 

IAsyncResult ar = this.BeginInvoke(new MethodInvoker(UpdateMe));

 

 

this.EndInvoke(ar);

 

BeginInvoke 메서드에서 실행된 작업이 끝나면 EndInvoke 메서드를 호출하여 작업을 완료한다.


출저 : http://www.jongkok4.net/137

'닷넷 프레임워크' 카테고리의 다른 글

.NET Compact framework에서 실행시간 구하는 방법  (0) 2010.02.08
데이터 배열 복사 성능 비교  (1) 2010.01.30
Hex 문자열을 실제 Hex값으로 변경  (0) 2009.12.30
memset in c#  (0) 2009.12.20
UDP 통신  (0) 2009.11.26

string hexString = "FF";
int hex = Convert.ToInt32(hexString, 16);
Console.WriteLine("{0} {1} {2:x2}", hexString, hex, hex);

'닷넷 프레임워크' 카테고리의 다른 글

데이터 배열 복사 성능 비교  (1) 2010.01.30
c# UI 쓰레드 마샬링 - Invoke, BeginInvoke  (0) 2010.01.08
memset in c#  (0) 2009.12.20
UDP 통신  (0) 2009.11.26
[C#] 실행시간 측정  (0) 2009.10.20
C에서 배열을 한꺼번에 초기화 시킬 수 있듯이 C#에서도 아래의 방법처럼 가능하다.
byte[] data = new byte[10];
Array.Clear(data, 0, data.Length);


여전히 자바가 1위. 주목할점은 Object-c가 작년에 비해 비약적으로 점유율을 끌어 올렸다는 것.. 아이폰의 열풍을 짐작할 수 있다. 하지만 내년부터는 안드로이드폰이 본격적으로 출시됨에 따라 자바 또한 쉽사리 1위자리를 내놓지 않을 것으로 예상한다.

'It`s me.' 카테고리의 다른 글

Visual Studio 2010 사용기  (0) 2010.04.20
peeping life  (0) 2010.01.14
더디어 성공.  (1) 2009.11.03
대형 사고를 치다.  (0) 2009.07.19
4주 훈련을 끝내고 돌아오다.  (3) 2009.07.12

 UDP 어플리케이션은 코드상으로 서버와 클라이언트 구분이 없다. 하지만 구현상 그 기능으로 서버와 클라이언트를 구별한다. 코드를 살펴보면 서버와 클라이언트는 별 반 차이가 없다.

주의
서버와 클라이언트 모두 동일한 UDP 포트 번호를 바인드하기 때문에 서로 다른 시스템에서 실행시켜야 된다.

서버 코드
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDP
{
    class Server
    {
        static void Main(string[] args)
        {
            const int port = 0513;
            byte[] buff = null;
            int recv;

            /* 로컬 IPEndPoint, 서버 주소와 포트가 된다.
             * 서버 주소를 192.168.0.10으로 고정하기 위해서는
             * IPAddress.Parse("192.168.0.10", port)를 사용해야 한다.
             * 여기서는 서버 주소가 고정이 아니기 때문에 IPAddress.Any를 사용한다.
             */
            IPEndPoint ipepLocal = new IPEndPoint(IPAddress.Any, port);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            /* 서버에서 broadcast로 데이터를 전송하기 위해서는 소켓 옵션을 설정해야 한다. */
            server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
           
            /* 로컬 시스템의 0513포트에 바인드한다.
             * UDP 서버 프로그램에 들어오는 UDP패킷을 수신하기 위해서는 로컬 시스템의 특정 포트에 바인드되어야 한다.
             * 로컬 시스템에는 한번에 하나의 프로그램만이 특정 포트 번호에 바인드할 수 있다. 따라서 이미 사용중인 포트 번호로 바인드할 수 없다.
             */
            server.Bind(ipepLocal);


            /* 목적지 IPEndPoint, 서버와 통신하는 클라이언트의 주소와 포트가 된다.
             * 데이터를 전송할 클라이언트 IP를 192.168.0.11으로 고정하기 위해서는 IPAddress.Parse("192.168.0.11", port)를 사용한다.
             * broadcast로 날릴경우 IPAddress.Broadcast로 설정한다.
             */
            IPEndPoint ipepDest = new IPEndPoint(IPAddress.Parse("192.168.0.11"), port);
            EndPoint remote = (EndPoint)ipepDest;

            // 에코 루틴
            while (true)
            {
                buff = new byte [1024];
                recv = server.ReceiveFrom(buff, ref remote);
                string recvStr = Encoding.ASCII.GetString(buff, 0, recv);
                Console.WriteLine("{0}\t{1}", remote.ToString(), recvStr);

                if (recvStr == "exit") break;

                server.SendTo(buff, recv, SocketFlags.None, ipepDest);
                Console.WriteLine("{0}\t{1} 전송", ipepDest.ToString(), recvStr);
            }

            server.Close();
        }
    }
}



클라이언트 코드
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace UDPClient
{
    class Client
    {
        static void Main(string[] args)
        {
            const int port = 0513;
            byte[] buff = null;
            int recv;

            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            // 로컬 IP, port
            IPEndPoint ipepLocal = new IPEndPoint(IPAddress.Any, port);
            EndPoint remote = (EndPoint)ipepLocal;
            client.Bind(ipepLocal);

            // 접속할 서버 IP
            IPEndPoint ipepDest = new IPEndPoint(IPAddress.Parse("192.168.0.10"), port);

            while (true)
            {
                string inputStr = Console.ReadLine();
                client.SendTo(Encoding.ASCII.GetBytes(inputStr), ipepDest);
                if (inputStr == "exit") break;

                buff = new byte[1024];
                recv = client.ReceiveFrom(buff, ref remote);
                string recvStr = Encoding.ASCII.GetString(buff, 0, recv);
                Console.WriteLine("{0}\t{1}", remote.ToString(), recvStr);
            }

            Console.WriteLine("Stopping client");
            client.Close();
        }
    }
}


[퍼옴]http://cafe.naver.com/devctrl/1700

C와 C++는 컴파일시 obj에 함수 이름, 변수 이름 등의 심벌을 기록하는 방식이 다르다. 그래서 C++ 컴파일러에서 C로 작성된 코드를 컴파일 하고자 할 때 사용한다.


C 컴파일러는 함수 이름을 그대로 사용하는 반면 C++ 컴파일러는 그대로 사용하지 않는다.
C++에서 프로그래머가 Func라는 이름으로 함수를 만들어도 이 이름과 동일한 함수를  만들 수 있다. 어떤 Func라는 함수는 정수를 인자로 받고 또 어떤 Func라는 함수는 실수를 인자로 받도록 만들 수 있다.
이렇게 이름이 동일한 여러 개의 함수가 나타날 수 있기 때문에 C++ 컴파일러는 내부적으로 Func라는 이름에다가 인자들의 타입 및 리턴 타입으로 어떤 문자들을 덧붙여서 각 함수들을 구분할 수 있도록 새로운 이름을 만든다.

extern "C"는 C++에서 C 함수를 사용하고자 할 때, 컴파일러에게 C 함수라는 것을 알리는 역할을 한다.
이해를 돕기 위해 다음과 같은 프로그램 예를 들어보자(파일 확장자는 .cpp로 만들어 C++ style로 컴파일한다).
add_1(), fadd_2(), add_3()이 컴파일 된 후, 어떻게 이름이 바뀌는지 보면 왜 extern "C" 가 필요한지 알 수 있다.

#include "stdio.h"

int add_1(int a, int b);
float fadd_2(int a, int b);
extern "C" int add_3(int a, int b);

int main()
{
    int a = 2;
    int b = 3;
    int c;
    float fc;

    c  = add_1(a, b);
    fc = fadd_2(a, b);
    c = add_3(a, b);

    return 0;
}

/* -- 시험 삼아 여기를 막는다. --
int add_1(int a, int b)
{
    return a + b;
}

float fadd_2(int a, int b)
{
    return (float)(a + b);
}

int add_3(int a, int b)
{
    return a + b;
}
*/

################### compile/link 결과 ###############################
naver.obj : error LNK2001: unresolved external symbol _add_3
naver.obj : error LNK2001: unresolved external symbol "float __cdecl fadd_2(int, int)" (?fadd_2@@YAMHH@Z)
naver.obj : error LNK2001: unresolved external symbol "int __cdecl add_1(int, int)" (?add_1@@YAHHH@Z)

compile/link 하면 위와 같이 link error가 발생한다.
자세히 보면
add_1 -> ?add_1@@YAHHH@Z
fadd_2 -> ?fadd_2@@YAMHH@Z
add_3 -> _add_3
와 같이 compile 과정에서 이름이 바뀐다.
add_1(), fadd_2()는 C++ style의 decorated name으로 바뀐 것이며, add_3()는 prototype에서 extern "C"를 주었으므로 C style로 '_'만 앞에 붙은 것이 차이점이다.

C++ 는 argument, return value에 따라 이름이 바뀌어 반드시 protype과 일치하는 function이 link된다. argument가 틀린 경우에는 같은 이름의 function이 여러 개 존재할 수 있으며 argument에 따라 적당한 function이 link된다.

C는 단순히 이름 앞에 '_' 만 추가되므로 argument가 틀리던 return value type이 틀리던 link는 될 수 있다. 심하게 잘못되면 compile/link는 되는데 오동작을 할 수도 있다.

C++ 는 컴파일시 함수 이름을 모두 다른 이름으로 바꿔주기 때문에 C에서 컴파일된 함수를 링크시킬 때는 해당 함수의 선언부 혹은 include 부분에 extern "C"라는 키워드를 사용하여 해당 함수가 C로 컴파일된 함수라는 것을 컴파일러에게 명시적으로 알려줘야 한다.

그런데 이 extern "C" 키워드는 C++에서 사용하는 것이므로 C에서는 사용되지 않는다. 따라서 반대로 C++의 함수를 C에서 사용하고자 한다면 C++ 소스를 컴파일 전에 소스 내에서 사용되는 함수의 선언을 모두
extern "C" 함수선언
이렇게 변환해 주어야 한다.

C 에서는 이미 컴파일된 C++ 함수를 호출할 수 없다. 하지만, 만약 이렇게 C++ 소스에서 모든 함수를 extern "C"로 변환한다면 이 함수들은 C++의 함수 특성을 모두 잃게 된다. 즉, 클래스의 멤버 함수가 될 수 없고 인자만 틀리고 함수 이름은 같은 오버로딩 함수가 될 수도 없다.

보통 *.h 파일에 아래와 같이 하여 *.c, *.cpp에서 공용할 수 있는 protype 선언을 한다.

#if defined (__cplusplus)
extern "C" {
#endif

int func1();
int func2();
.
.
.

#if defined (__cplusplus)
};
#endif


게으른 관계로 미루고 미루던 흑백 그래픽 엘시디를 더디어 손을 됐다.
저번주에 납땜만 했었는데 선 20개 붙이는데 왜이렇게 오래 걸리는지
아무래도 난 납땜 체질은 아닌거같다.
뭔가 시행착오가 있었지만 결국 해결 ㅋㅋ 스코프가 없었으면 찾기 힘들었을텐데 ㅋㅋ
암튼 소스정리가 되는 대로 다시 블로깅해야 겠다.
다음 목표는 한글 출력..

'It`s me.' 카테고리의 다른 글

peeping life  (0) 2010.01.14
2009 개발 언어 순위  (2) 2009.12.13
대형 사고를 치다.  (0) 2009.07.19
4주 훈련을 끝내고 돌아오다.  (3) 2009.07.12
경래 군생활 1주차  (1) 2009.06.22

가장 현명한 사람은  늘 배우려고
노력하는 사람이고

가장 겸손한 사람은   개구리가 되어서도
올챙이적 시절을 잊지 않는 사람이다

가장 넉넉한 사람은   자기한테 주어진 몫에 대하여
불평불만이 없는 사람이다

가장 지혜로운 사람은
자신이 처한 현실에 대하여 감사하는 사람이고

가장 건강한 사람은
늘 웃는 사람이며

가장 인간성이 좋은 사람은
남에게 피해를 주지 않고 살아가는 사람이다

가장 좋은 스승은
제자에게 자신이 가진 지식을아낌없이 주는 사람이고

가장 훌륭한 자식은
부모님의 마음을 상하지 않게 하는 사람이다

가장 현명한 사람은
놀때는 세상 모든 것을 잊고 놀며
일할 때는 오로지 일에만 전념하는 사람이다

가장 좋은 인격은 자기 자신을 알고
겸손하게 처신하는 사람이고

가장 부지런한 사람은
늘 일하는 사람이며

가장 훌륭한 삶을 산 사람은
살아 있을 때보다 죽었을 때 이름이 빛나는 사람이다


[출처] 팍스넷 꽃보다서반 님의 글


'사회에 나가면 누구나 알게 되는 사실' 43가지의 전문.

1 나까지 나설 필요는 없다
2 헌신하면 헌신짝된다
3 참고 참고 또 참으면 참나무가 된다
4 포기하면 편하다
5 왕관을 쓰려는 자, 그 무게를 견뎌라
6 아니면 말고
7 나도 나지만 너도 너다
8 목숨을 버리면 무기만은 살려 주겠다
9 가는 말이 고우면 사람을 얕본다.
10 잘생긴 놈은 얼굴값하고 못생긴 놈은 꼴값 한다
11 공부는 실수를 낳지만 찍기는 기적을 낳는다.
12 까도 내가 까
13 난 오아시스를 원했고 넌 신기루만으로 좋았던 거지
14 동정할 거면 돈으로 줘요
15 "내 너 그럴 줄 알았다" "그럴 줄 알았으면 미리 말을 해주세요"
16 즐길 수 없으면 피하라
17 이것 또한 지나가리라
18 대문으로 가난이 찾아오면 사랑은 창문으로 도망간다
19 "내 부모에게 욕 하는 건 참아도 나에게 욕 하는 건 참을 수 없다"
20 일찍 일어나는 새가 더 피곤하다
21 일찍 일어난 벌레는 잡아 먹힌다
22 먼저 가는 건 순서가 없다
23 똥차가고 벤츠 온다
24 효도는 셀프
25 먹는 것이 공부라면 세상에서 공부가 가장 좋습니다
26 어려운 길은 길이 아니다.
27 개천에서 용 난 놈 만나면 개천으로 끌려들어간다
28 이런 인생으론 자서전도 쓸 수 없다
29 새벽에 맥주와 먹는 치킨은 0칼로리
30 늦었다고 생각 할 때가 가장 늦은 거다
31 성형수술하고 나아진 게 아니라 하기 전이 최악이었다
32 내일 할 수 있는 일을 오늘 할 필요는 없다
33 되면 한다
34 남자는 애 아니면 개다
35 성공은 1%재능과 99% 돈과 빽만 있음 된다
36 지금 쟤 걱정할 때가 아니다.. 내가 더 걱정이다
37 예술은 비싸고 인생은 더럽다.
38 고생 끝에 골병난다.
39 하나를 보고 열을 알면 무당눈깔이다
40 원수는 회사에서 만난다.
41 돌다리도 두들겨보면 내손만 아프다
42 재주가 많으면 먹고 살만한 길이 많다
43 티끌 모아봐야 티끌

+ Recent posts