'분류 전체보기'에 해당되는 글 471건

  1. 2004.12.14 캐럿보이넷 :: 하루 24시간을 두배로 사는 20가지 조언
  2. 2004.12.14 캐럿보이넷 :: 이번에 비싸게 팔 컴퓨터..
  3. 2004.12.11 캐럿보이넷 :: 링크페이지..
  4. 2004.12.11 캐럿보이넷 :: FTP백업툴
  5. 2004.12.11 WinSockAPI, PHP, Javascript, JSscript, CSS, HTML, MySQL(영문) chm도움말(사전)파일들
  6. 2004.12.10 캐럿보이넷 :: 컬러테라피 인테리어
  7. 2004.12.06 캐럿보이넷 :: 결혼 적령나이 구하기.. 2
  8. 2004.12.05 캐럿보이넷 :: 스펀지.. 지식..
  9. 2004.12.04 캐럿보이넷 :: Donkey kong Country
  10. 2004.12.03 캐럿보이넷 :: 겸허한 마음으로..
  11. 2004.12.02 캐럿보이넷 :: 작년 이맘때쯤 삽질했던거..
  12. 2004.12.02 캐럿보이넷 :: 중얼거리기...
  13. 2004.11.30 캐럿보이넷 :: 먹는것이인성을 좌우한다
  14. 2004.11.30 캐럿보이넷 :: DirecDraw
  15. 2004.11.01 캐럿보이넷 :: PlaceBar 변경하기..
  16. 2004.10.29 캐럿보이넷 :: 개발-넷) 자신만의 클래스를 정의하자.
  17. 2004.10.29 캐럿보이넷 :: 개발-셋) TRY CATCH 문을 생활화하자
  18. 2004.10.29 캐럿보이넷 :: 개발-둘) 효율적인 프로그래밍 환경 설정
  19. 2004.10.29 캐럿보이넷 :: 개발-하나) 개발 생산성을 높이기 위해 고민하자.
  20. 2004.10.25 캐럿보이넷 :: MSN Web messenger. 1
  21. 2004.10.25 캐럿보이넷 :: -+ MSN 공개사진 사이즈 맞추기 +-
  22. 2004.10.23 캐럿보이넷 :: GNU선언문.. 1
  23. 2004.10.23 캐럿보이넷 :: [리눅스] 네트웍/인터넷 관련 툴 사용법
  24. 2004.10.22 캐럿보이넷 :: 진정으로 잘 사는 도시인 10계명
  25. 2004.10.22 캐럿보이넷 :: Visual C++ 단축키(퍼옴)
  26. 2004.10.22 캐럿보이넷 :: 택배 화물추적 주소
  27. 2004.10.22 캐럿보이넷 :: Cannot find the definition (implementation) of this function 2
  28. 2004.10.22 캐럿보이넷 :: Gloomy sunday 스나이퍼가 중얼거리는 부분...
  29. 2004.10.22 캐럿보이넷 :: 웹에서 텍스트박스나 버튼등에 배경 넣기
  30. 2004.10.22 캐럿보이넷 :: 웹페이지를 열면 자동으로 연사람 IP를 메일로 알려주는 php소스..
출처: http://www.jihyeon.net/blog/?no=21

1. 그날의 기분을 중요시한다.
2. 아침 일찍 일어난다.
3. 자는 시간에 관계없이 일어나는 시간을 일정하게 맞춘다.
4. 아침 일찍 일어나기 힘들다면 차 한잔 마시는 습관으로 시작한다.
5. 일어나서 맨 처음 할 일은 찬물로 세수하는 일이다.
6. 허둥대는 아침이 아닌 5분의 명상으로 아침을 시작한다.
7. 다음날의 계획은 전날 밤에 세운다.
8. 다음날 입을 옷은 미리 챙겨둔다.
9. 자정 전에 무조건 잘 수 있도록 노력한다.
10. 머리를 베개에 묻는 순간 모든 것을 잊어라.
11. 잠 안 오는 밤에 취할 수 있는 가장 좋은 방법은 독서다.
12. 일에 있어서나 사람에 있어서나 범위를 좁혀 선별하되 정해진 것에 집중 투자한다.
13. 10분의 낮잠은 밤잠 한시간의 차이가 있다.
14. 필요한 일과 필요치 않는 일을 구분한다.
15. 통근시간이 매우 생산적인 시간이 될 수 있음을 명심한다.
16. 여유 있는 계획을 세운다.
17. 모든 일에는 데드라인이 있다.
18. 모든 일에는 가 있다.
19. 모든 계획은 시작시간과 끝시간을 명시한다.
20. 항상 최상의 선택으로 시간을 낭비하지 않는다.

아놀드 베네트의 "아침의 차 한잔이 인생을 결정한다"에서
Posted by 장안동베짱e :
CPU : INTEL 1.7G
RAM : 256 M

그래픽카드 : voodoo 3 3000
랜카드 : realtek 8029AS

하드 : 80G (40기가 두개)
잘되면 하드 더 달아서 팔아야 겠다..











돈이 좀 필요 하다..흠흠..


Posted by 장안동베짱e :
잠시 보관...
Posted by 장안동베짱e :


작동환경 : Windows 2000/Xp
Lincense : Freeware
File size: 365 Kbytes
메뉴얼(?) : http://addtech.woto.net/toto/bdshot.php


WebPage : http://www.totoman.com
Posted by 장안동베짱e :



웹쪽은 코딩할일이 거의 없긴 하지만.. 놔두면 유용할겠지..?

















━━━━━━━━━━━━━━━━━━━━━━━━━━━━
요건 보너스


Posted by 장안동베짱e :
컬러테라피 인테리어
색으로 가족의 건강과 행복을 지킨다!
컬러는 건강과 심리상태에 많은 영향을 미친다. 컬러를 이용해 건강과 성격 변화에 도움을 주는 것이 컬러테라피.
고대 이집트에서는 색으로 질병을 치료했으며 현대에는 색상을 통해 성격과 심리상태를 파악하기도 한다. 가족들에게 필요한 컬러로 집안을 꾸미면 더욱 건강하고 화목해질 수 있다. 7가지 색상을 활용한 컬러테라피 인테리어 배우기.
편안한 기분과 안정감을 주는 핑크 & 바이올렛

클래식한 벽면과 로맨틱한 의자, 샹들리에로 꾸민 가족실이 화사하면서도 편안해 보인다.
핑크와 바이올렛의 매치는 달콤하면서도 로맨틱한 분위기를 연출한다.

 

 

Pink
마음을 안정시켜 주는 핑크색. 1980년 교도소 내의 폭력으로 고심하던 미국에서는 당시 회색이었던 교도소 내부를 핑크색으로 바꾸자 폭력사고가 눈에 띄게 줄어들었다고 한다.
자궁 내부의 색상이라 편안함과 안정감을 주는 핑크색은 따뜻하고 화사해 가족실이나 아이방에 활용하면 좋다.

Violet
우아한 느낌의 보라색은 식욕을 저하시키는 역할을 하기 때문에 다이어트에 도움이 되며 심장 활동을 편안하게 해준다. 불면증이 있다면 침구와 소품을 보라색으로 선택할 것! 편안한 휴식과 숙면을 취할 수 있도록 도와준다.

 

 

긴장 완화에 효과적! 블루 & 브라운

 

긴장을 풀어주는 블루와 브라운 색상을 활용하여 꾸민 침실은 세련되어 보이면서도 차가워 보이지 않는 것이 특징. 양한 톤의 블루 컬러를조화롭게 활용하여 색다른 분위기를 만들었다.

 

 

 

 

 

◀ Blue
파란색은 긴장이나 불안감을 가라앉히고 알레르기 및 피부개선, 피로 회복 등에 효과적인 것으로 알려져 있다.
색채 병리학에서 파란색은 두통, 신경성 고혈압, 불면증, 신경통, 히스테리 등의 치료에 사용된다.
마음을 차분히 가라앉히고 집중력이 향상되기를 원한다면 파란색으로 공간을 꾸미면 도움이 된다.

▶ Brown
아늑한 느낌을 주는 브라운 컬러는 가을과 울에 특히 많이 활용하는 컬러.
차분한 안정감과 따뜻함을 느끼게 해주기 때문에 거실 등 넓은 공간에 사용하면 좋다. 브라운을 활용해서 꾸민 공간은 긴장을 완화시켜 편안함을 느끼게 해준다.

기분 좋아지는 옐로· 오렌지 & 집중력을 높여주는 그린 컬러

바라보기만 해도 마음속까지 환해지는 기분 좋은 거실 풍경. 군데군데 그린 컬러를 사용해 차분함을 더했다.
오렌지 색상의 러그는 따뜻한 느낌을 주기에 안성맞춤.

 

 

 

 

 

 

◀ Yellow & Orange
노란색은 우울하거나 초조한 기분을 완화시켜 준다. 아이가 밥을 잘 먹지 않을 때 옐로와 오렌지로 주방을 꾸미면 식욕이 높아진다고. 욕실에 노란색 타일을 활용하거나 노란색 타월을 걸어두면 마음이 밝아지고 변비 해소에도 도움이 된다.
이밖에 노란색은 당뇨, 소화불량, 신장질환 등에 효과적이며 오렌지 색상은 호흡기 질환, 갑상선 기능장애, 의욕 저하 등에 치료효과가 뛰어나다.

▶ Green
그린은 스트레스 해소, 집중력 강화, 안정, 혈액순환 등에 도움이 된다. 심리적으로 자극을 주지 않기 때문에 신경과 근육의 긴장을 완화시켜 주고 마음을 평온하게 해주는 컬러.
집중해서 일해야 할 때는 방안의 벽지를 그린 컬러로 선택하거나 녹색 식물, 소품 등을 놓아두면 효과적이다.   (끝)

Posted by 장안동베짱e :
한국 결혼 정보 회사 듀오,선우,피어리 3사가 공동 개발한 결혼나이 산출 공식입니다..

거의 확실하다는데..... 재미로 한번 해보세요~ ㅎㅎ

1. 자신이 가장 좋아하는 숫자를 1~9까지중 하나를 선택한다..

2. 결혼해서 자기가 갖고 싶은 자녀의 수를 1번의 수와 (+)더한다.. (만약 두자리의 숫자가 되면 각각 자리수를 더해서 한자리로 만드세요. 예> 9+3=12 의 경우, 결과물 12로 다시 1+2=3 처럼 한다.)

3. 이렇게 만들어진 숫자에 3을 곱한다. (여기서도 두자리 숫자가 나오면 각각 자리수를 더해 한자리로 만드세요. 위와 동일한 방법)

4. 그리고 나온수에 6을 곱하고 또 두자리가 나오면 위와 같은 방법으로 한자리수로 만드세요!

5. 다시 나온 수에 21을 더하세요.

6. 그수에 여지껏 살면선 키스한 이성의 숫자를 (-)뺀다... (절대루 키스한 횟수가 아닙니다. 키스한 이성의 사람 숫자입니다. ㅡㅡ;)

7. 그렇게 나온수가 자신의 결혼 적령기랍니다...


ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
Posted by 장안동베짱e :

⊙ 라면을 먹고 얼굴이 붓지 않으려면 (우유를 부어 먹으)면 된다. (★★★★☆)
: 우리가 잠을 자는 동안에는 일정량의 수분을 몸에서 배출되는데 라면을 먹고 잠을
자면

라면의 염분이 수분을 붙들어 놓아 얼굴이나 몸이 붓게 되는 것이다. 그러나 라면에

우유를 부어 먹으면 우유의 칼슘과 칼륨이 라면의 염분을 몸 밖으로 배출시켜

몸을 붓지 않게 해준다.


⊙ 딸꾹질은 (혀를 잡아당기면) 멈춘다. (★★★★)
: 딸꾹질을 일으키는 신경은 주로 혀에 분포되어있다.

그래서 혀를 잡아당겨 딸꾹질을 일으키는 신경에 다시 자극을 주면

딸꾹질을 멈추게 된다.

(혀 당기는 법 : 혀 아래 안쪽 깊숙이를 지압하듯 지긋이 잡아 준 다음

확 잡아 당기지 말고 부드럽게 뺀 뒤, 30초 정도 잡고 계시다가 놓으면 됩니다.)


⊙ 술에 취했을 때는 (계란 프라이를 먹으)면 깰 수 있다. (★★★★☆)
: 콜레스테롤은 위 내의 알코올을 분해시키는 기능을 한다.

그렇기 때문에 콜레스테롤이 많이 함유된 계란이 술 깨는 데 효과적이다.

좀 더 빠른 효과를 보기 위해서는 계란의 노른자를 덜 익힌 프라이나

날계란 상태로 먹는 것이 더 좋다고 한다.

스펀지에서 실험을 해 본 결과 계란 프라이를 먹은 1시간 후 혈중 알코올 농도를

측정해보니 수치가 떨어진 것으로 확인되었다.


⊙ 스펀지 연구소 : 남자는 모른다, 여자는 모른다.
: 영원한 미스테리 남과 여...
스펀지는 전국의 남녀 500명을 대상으로 남자들이 모르는 여자 여자들이 모르는 남
자에 대해 설문조사를 해 보았다.



§ 여자들은 모른다 1 - 남자 화장실 소변기는 자동이다.
: 자동 센서가 있어 변기 앞에 다가만 가도 물이 자동으로 나온다는 사실!


§ 남자는 모른다 1- 에티켓 벨!
: 자신의 용변보는 소리를 가리기 위해 물소리, 새소리 등의 벨소리가 나오는
기계가 있다는 사실!


§ 남자들은 모른다 2- 모든 여자들은 학창시절 기절하길 꿈꾼다.
: 조회시간, 체육시간에 졸도해 체육선생님께 업혀 양호실에 실려가는
간절한 소망을 품는다는 사실!


§ 여자들은 모른다 2 - 남자의 서류 가방은 비어있다.
: 정말 복잡한 여자들의 핸드백 속과는 달리 달랑 우산 하나, 볼펜 하나만
들어있을 정도로 남자들의 서류 가방은 비어있다는 사실!


⊙ (아킬레스건을 주무르) 면 몸이 주~욱 늘어난다. (★★★★☆)
: 허리를 숙여 손이 바닥에 닿는 유연성 테스트를 잘하려면 발목 뒤편의

아킬레스건을 주물러주면 된다.
약 10분간만 주물러주면 근육이 이완되어 최고 15cm 정도까지 몸이 늘어난다.
그러나 이것은 단 1회성 효과를 볼 수 있는 방법이지만 지속적으로 아킬레스건을
마사지 해주면 몸이 유연해지는데 많은 도움을 준다고 한다.


⊙ 아침에 얼굴이 부었을 때 (면봉) 하나면 된다. (★★★★)
: 지난 밤, 지나친 수분 섭취나 엎드려 잠을 자 부은 얼굴...
이렇게 부은 얼굴을 간단하게 가라앉히는 획기적인 방법은
바로 면봉으로 손 등 부분의 합곡혈을 10분간 눌러주는 것!!
엄지 손가락과 검지 손가락 끝이 만나는 움푹 파인 부분이 합곡혈인데,
이 곳을 지압해 주면 혈액 순환이 잘 돼 부은 얼굴이 금방 가라앉는 효과를
볼 수 있다.
Posted by 장안동베짱e :
어렸을때 오락실에서 했던게임중하나..


invalid-file

에뮬레이터 다운로드




invalid-file

1탄 다운로드





invalid-file

2탄 다운로드


Posted by 장안동베짱e :
성공을 갈망하되..


겸허한 마음으로 살자..




행복은 삶에 만족함으로써 오는것이다!!


아님말고 ㅡ_ㅡ;;;
(따지진 마셈; )
Posted by 장안동베짱e :
일단,
c 와 자바의 구조체 타입이 틀립니다

에를 들어 C에서는 역word박식을 사용하고
(예)
258 ==> 0x01 0x02 이여야 되는데
실제로는 0x02 0x01 로 들어감

그래서 안됩니다.
그리고 float형도 마찬가지고요
자바는 point가없고 구조체가 없죠
그래서 C와 연동하기가 좀 어렵습니다

그래서 많은 분들이 C 와 JAVA 를 연동하는 방법을 물어오시는데

일단 C 와 JAVA에서 쓸수 있도록 공통된 Type은
없습니다

이유는 byteStream으로 전송하니까
(추가설명 할려면 너무길어서 생략)

그래서 일단 한번 가공해 조야되요

C의 Interger Stream을 Java의 형태로 바꾸는
예제를 한번 보겠습니다

파라메터로 소켓에서 읽은 4byte를
public int toInt( byte src[] )
{
try{
byte[] tmp = new byte[4];
tmp[0] = src[3];
tmp[1] = src[2];
tmp[2] = src[1];
tmp[3] = src[0];
DataInputStream dis = new DataInputStream ((InputStream)new ByteArrayInputStream(tmp));
return dis.readInt();
} catch(IOException e) {
return -1;
}
}

이런 형태로 쓰면 되고

C에서 구조체를 Stream으로 전송시엔
Java에서는 Class를 만들어 쓰면 편리 하지요..



ps. 아름이가 애플릿 예제 있나 물어 보길래 찾아 보다가 옛날에 몰라서 삽질했던거 생각나서 올림..
Posted by 장안동베짱e :

이때까지 영문서같은걸 읽을때는 미처 못느낀건데..

나.. 영어 진짜 못하는구나..


그냥 조금 못하는줄로만 알았는데..


영어 과제 때문에

작문을 하려니깐 어버어버 하네..


당근 말도 못하겠지..?


이래 갖고 어째 외국가서 살생각을 했을꼬..?


영어공부좀 해야겠다.



"불가능이란 나약한 자의 핑게이다"

"열정을 가지고 하고자 하는일에 미치면 뭐든 할수있다!!"


아자! 아자!가자!!!


Posted by 장안동베짱e :
식생활을 어떻게 해 나가느냐에 따라 건강이 좌우된다는 사실은 모든 건강연구가들의 한결같은 결론이다. 질병은 어느날 갑자기 아무런 이유없이 생기는 것이 아니며, 오랫동안의 잘못된 생활, 그중에서도 잘못된 식생활이 미치는 영향이 가장 크다고 할 수 있다. 자기에게 맞지 않는 잘못된 식생활을 계속하다보면 신체에 이상이 생기고, 그 신체 이상에 대한 몸 안의 자연치유력의 경고가 바로 우리가 병이라고 일컫는 현상이라고 할 수 있다.

■ 먹거리가 건강을 좌우한다


■ 먹거리가 인성을 좌우한다.







.
Posted by 장안동베짱e :
DirecDrawsms 7.x버전까지만 사용되고 이후 버전에서는 DirectGraphic으로 통합되어 사용되고 있다.

BUT!!!

수업시간에 교수님께서 하라고 하시니.. 므.. 떫어도 해야지..;
교재도 GDI랩에서 만든 교재를 쓰는데..
당최 예제가 없는 책(?)이다..
오타도 많고.. 종민이 말로는 빠진부분도 있는것 같다던데..
교수님 수업스타일도 그냥 앉아서 휙휙 설명하셔서..
잘 알아 먹기 힘든 과목이다.
예제라도 있었으면 좋으련만...


_M#]



.
Posted by 장안동베짱e :
Posted by 장안동베짱e :
출처 : 데브피아(조휘경님 글)


실무에서 프로젝트를 수행하다 보면 매번 중복되는 작업을 하게 된다. 예를 들면 레지스트리의 값을 읽고 쓰는 작업, GDI를 이용한 그래픽 작업, 멋진 버튼 같은 컨트롤들의 구현 작업 등 프로젝트에서 중요한 위치의 일이 아니면서도 안 할 수도 없고, 시간은 많이 걸리고, 코드도 복잡해서 프로젝트 전체 코드를 읽는데 적잖이 부담을 준다.



이전에 개발의 생산성에 관한 주제를 다루면서 이미 누군가 고민한 사람이 있을 테니 찾아보라고 언급한적이 있다. www.devpia.com www.codeproject.com www.codeguru.com 등의 사이트가 존재해서 얼마나 고마운지 모른다. 만일 내가 세세하게 모두 구현하려 한다면, 정말 많은 시간이 필요할 것이다. 모두 그러하겠지만 이런 개발자 사이트에서 적정한 코드를 구했다면, 자신의 것으로 소화해내는 작업을 수행해야 한다.



MyMSNMessenger 에서도 여기 저기서 구한 몇 개의 클래스들이 사용되는 그 소스에 관한 자세한 설명은 배제하기로 한다. 각 부분에 대한 이해는 여러분의 몫으로 남기고, 클래스들의 목적 및 사용법만 설명한다.



MyMSNMessenger 에서 다음과 같은 함수와 클래스들이 있다.



1. RgMgr.h 에는 레지스트리에 데이터를 저장하고 읽어들이는 함수가 선언되어 있다.



#define MY_DEFAULT_KEY "SoftWare\\MyMSNMessenger"

BOOL TfcGetRegData (LPCTSTR lpszKey, CString& strData);

BOOL TfcSetRegData (LPCTSTR lpszKey, LPCTSTR lpszData);

BOOL TfcGetRegData (LPCTSTR lpszKey, int& nData);

BOOL TfcSetRegData (LPCTSTR lpszKey, int nData);



함수명에서도 알 수 있듯이 함수가 중복 정의 되어 문자열, 숫자의 값을 레지스트리에 입출력할수 있다.

CMainFrame:: OnCreate() 함수에서 윈도우의 크기를 레지스트리에서 읽어들이고,

CMainFrame::OnClose() 함수에서 윈도우의 크기를 저장하는 루틴이 구현되어 있다.



::TfcGetRegData (_T("General\\MainFrame\\nX"), nX);

::TfcSetRegData (_T("General\\MainFrame\\nX"), rcFrame.left);



저장되는 위치는 HKEY_CURRENT_USER\Software\MyMSNMessenger\General\MainFrame\nX 이다.



2. CListCtrl 에서 상속받아 CMagicList 를 구현하였다.

CListCtrl 을 확장하여 만든 클래스들이 많이 존재한다. 그 기능을 살펴보면 다음과 같다.

1) 컬럼의 SORTING (문자 및 숫자) 기능을 제공한다.

2) 배경색과 선택된 라인 색상을 조절할 수 있다.

3) 가로 세로 그리드라인을 넣을 수 있다.

4) 폰트를 지정할 수 있다.

5) 헤더 컬럼의 개수, 크기, 문자열을 쉽게 정의할 수 있다.

6) 플랫 헤더 컨트롤을 사용한다.

7) 데이터의 입출력을 String Array 로 쉽게 처리할 수 있다.

8) 특정 컬럼의 문자열을 쉽게 검색해 낼 수 있다.



여기 저기서 모은 팁들을 혼합해서 구현하였다. 다른 부수적인 기능들은 타 리스트 확장 클래스와 비슷할 것이다. 다만, 리스트의 컬럼 지정과, 데이터의 입출력이 상당히 복잡하고, 코드양이 많아짐을 불편하게 여겨 CStringArray 에 담아 처리하는 큰 특징이 있다.



CMyMSNMessengerView::InitUserListCtrl () 에서 다음과 같은 리스트 컨트롤 초기화 하는 작업을 수행한다.

1) List 속성 설정 및 Subclassing

2) 리스트의 배경색, 선택라인 색상, 폰트 지정

3) 리스트 컬럼 (MSN Contact 상태, FriendlyName, SigninName) 만들기

4) 리스트 첫째 컬럼을 이미지로 사용

5) 플랫 헤더 컨트롤을 생성하고 헤더에 이미지 넣기



다음은 리스트 컨트롤을 사용하는 루틴이다.

void CMyMSNMessengerView::OnInitialUpdate() 에 테스트용으로 구현해 놓았다.



CStringArray saContactInfo;

saContactInfo.Add (_T("0")) // 온라인 상태

saContactInfo.Add (_T("거북선")); // 대화명

saContactInfo.Add (_T("gobuksun@empal.com")); // SignIn



m_listUser.InsertDataToList (&saContactInfo);



CStringArrary 에 들어갈 데이터를 입력한 후 리스트 컨트롤에 추가하면 된다.



입력된 데이터를 얻는 방법은 void GetDataFromList (CStringArray* psaData, int nPos = -1); 함수를 사용하면 되는데 입력과는 반대로 CStringArray 에 담아온다. 얻고자 하는 행을 nPos 로 지정할 수 있는 지정되지 않으면 현재 선택된 행의 값을 얻어온다.

또다른 방법으로 void GetSpecificData (CString& strData, int nCol, int nPos = -1); 함수가 있는데 특정 컬럼의 문자열을 스트링으로 바로 얻어올 수 있다.



다음 코드는 현재 선택된 행의 SigninName 을 얻어오는 루틴이다.

CString strSigninName = _T("");

m_listUser.GetSpecificData (strSigninName, 2);



리스트컨트롤을 더블클릭할 경우인

void CMyMSNMessengerView::OnRclickListUser(NMHDR* pNMHDR, LRESULT* pResult) 에 예제를 구현해 놓았다.



기타 MyMSNMessenger 에 다른 유용한 클래스들이 사용되는데 이는 개발자 사이트에서 구한것으로 원 저작자에 대한 주석이 달려 있다. 자세한 구현방법은 각자 소스를 살펴보기로 하고 여기서는 간단하게 기능적으로 살펴본다.



1. NewMenu Author : Bruno Podetti

XP 스타일의 메뉴를 구현한 클래스로 작지만 강력하다.

사용법은 간단하다. CFrameWnd 를 찾아 CNewFrameWnd 로만 바꿔주면 된다.

CMainFrame::OnCreate() 에서 메뉴 설정에 관한 간단한 수정만 해주면 된다.



2. SystemTray Author : Chris Maunder

시스템 트레이를 구현한 클래스로 애니메이션을 지원하고 안정적이다.

// 시스템 트레이 아이콘 설정

m_TrayIcon.Create (NULL, WM_TRAYICON_NOTIFY, "Click here", ::LoadIcon(NULL, IDI_ASTERISK),

IDR_MENU_TRAY);

m_TrayIcon.SetMenuDefaultItem (2, TRUE);



m_TrayIcon.SetIconList(IDI_TRAY_ANI_1, IDI_TRAY_ANI_4);

m_TrayIcon.Animate (50); // 50 millisecond delay between frames, for Infinite



3. void DrawCorner(….)

모서리를 곡선으로 그려주는 함수.



소스는 여기에~ http://myhome.konetic.or.kr/UserUploadData/gobuksun/MyMSNMessenger.zip



실무에서 뛰시는 분들은 나름대로의 유용한 클래스들을 라이브러리로 보관하고 있을 것이다. 중요한 것은 필요할 때 매번 찾을게 아니라, 유용할 것으로 판단되는 클래스들을 정리 정돈해서 자신의 것으로 만드는 작업일 것이다.



이제 마지막 한 강좌만 남았네요. IMessenger 인터페이를 사용한 MSN 메신저에 접근하는 방법 사용자 리스트를 얻어오는 방법에 대해 나가겠습니다. 저도 일년전이라 알쏭달쏭한 부분이 있어서 잠시 정리할 시간이 필요하군요. 역시 구현하는것과 누군가에게 전달하는것은 많이 다르다는걸 느낍니다. 아무쪼록 많은분들께 도움이 되었으면 합니다.. *^^*
Posted by 장안동베짱e :
출처 : 데브피아(조휘경님 글)


보통 실무에서의 프로젝트는 공부할 때와는 달리 크기가 방대하다. 따라서, 시간이 지나면 지날수록 그 복잡성은 증가할 수 밖에 없다. 이 방대함과 복잡성에서 버그를 줄이기 위해 프로그래머들이 택할 수 있는 유일한 방법은 잘 정리 정돈하는 것, 그리고 주석과 진단 매크로 등으로 도배하는 것이다. 그 중 아주 효율적인 방법중의 하나가 try catch 문을 생활화하는 것이다.



C 에 입문하는 모든 사람에게 GO TO 문은 사용하지 말아야 하는 것으로 거의 불문율처럼 여겨진다. 이는 GOTO 문의 남발이 코드의 복잡성을 증가시키기 때문이다. 그러나, 참 아이러니하게도 GOTO 문은 코드를 대폭 간결하게 처리할 수 있는 방법이기도 하다. 특히 에러처리에 있어서는 GOTO 문은 그 진가를 발휘한다. 그래서 그 대안으로 try catch 문을 제공하는 것이다.



다음 문장을 살펴보자.



A 수행;

If (A 수행이 성공하면)

{

B 수행;

If (B 수행이 성공하면)

{

C 수행;

If (C 수행이 성공하면)

{

OK;

}

else

{

에러처리;

}

}

else

{

에러처리;

}

}

else

{

에러처리;

}



위 문장을 try catch 문으로 다시 정리해 보면 아래와 같다.



try

{

A 수행;

If (A 수행 실패)

ThrowException ();



B 수행;

If (B 수행 실패)

ThrowException ();



C 수행;

If (C 수행 실패)

ThrowException ();



D 수행;

}

catch

{

에러 처리;

}



코드의 양도 양이지만, A->B->C->D 로 작업이 진행된다는 코드의 판독성이 상당히 증가하는 걸 알 수 있다.



일단 예외처리에 관한 기본적 지식은 관련 서적이 많으니 참고하길 바라고, 여기에서는 MFC에서 제공하지만 쓰기에는 약간 불편한 CException 클래스를 확장하여 좀더 편리하게 사용할 수 있는 방법에 대해 알아보기로 한다.



보통 try catch 문을 사용하면 아래와 같다.

try

{

// Do something to throw an exception.

throw "Alarm Error !!";

}

catch (char* szExcepy)

{

::AfxMessageBox (szExcepy);

}



그런데, 이를 MFC적 사고에서 MFC가 제공하는 CException 클래스를 사용하면,

TRY

{

// Do something to throw an exception.

CException* const e = new CException (TRUE);

THROW (e);

}

CATCH_ALL (e)

{

e->ReportError ();

}

END_CATCH_ALL



오류 메시지는 “사용가능한 오류메세지가 없습니다.” 이다. 오히려, 사용하기 더 어렵게 되었다는 것을 느낄 것이다. 그러나 CException 는 기초클래스일 뿐이고 ReportError () 함수 또한 가상함수로 만들어져 있어 사용자가 이를 확장하여 쉽게 처리할 수 있음을 암시하고 있다.



자 이제 우리는 CException 클래스에서 상속받아 확장된 CExceptionEx 를 만들것이다.

목적은 코드를 좀더 간결하게 처리하고, 원하는 에러 메시지를 효과적으로 발생시킬 수 있도록 하는것이다.



간략히 처리하기 위해서는 CExceptionEx* const e = new CExceptionEx (TRUE, “에러메세지”); 로 처리할 수 있도록 클래스를 정의해야 한다.

먼저 에러 메시지를 담을 CString 멤버 변수를 하나 갖고, 생성자를 추가한다.

다음 가상함수 ReportError () 에서 추가한 CString 변수를 출력하도록 처리한다.



우선 CExceptionEx 의 클래스 정의를 살펴보면 다음과 같다.

class CExceptionEx : public CException

{

protected:

DECLARE_DYNAMIC(CExceptionEx)



private:

CString m_strMessage;



public:

CExceptionEx ();

CExceptionEx (const BOOL bAutoDelete, LPCTSTR lpszMessage);



public:

virtual ~CExceptionEx ();

virtual int ReportError (UINT nType = MB_OK, UINT nError = 0 );

};



다음으로 ::AtxThrowXXXException () 처럼 전역함수를 만들어 사용해야 한다.



이는 다음과 같이 정의하였다.

void TfcThrowException (const UINT nFormatID, ...);

void TfcThrowException (const LPCTSTR lpszFormat, ...);

void TfcThrowNotSupportedException (void);

이는 리소스의 스트링 테이블의 문자열도 이용할 수 있고, 인자를 갖는 문자열을 사용할 수 있도록 처리하였다.



에러 메시지 박스 출력에 관련된 함수도 자신만의 예쁜 메시지 박스나, 스트링 테이블을 이용할 수 있고, 인자를 갖는 문자열을 이용할 수 있도록 전역적으로 정의하자.

이와 관련된 함수 정의는 아래와 같다.

void TfcMessageBox (const UINT nFormatID, ...);

void TfcMessageBox (const LPCTSTR lpszFormat, ...);

int TfcMessageBox (LPCTSTR lpszMsg, UINT nType, LPCTSTR lpszTitle = NULL);

int TfcMessageBox (const UINT nFormatID, UINT nType, LPCTSTR lpszTitle = NULL);

CString GetStringFromID (const UINT uFormatID, ...);



구현부는 별로 어렵지 않게 만들어져 있으므로 아래에서 다운 받아 확인해 보면 된다.

http://myhome.konetic.or.kr/UserUploadData/gobuksun/ExceptionEx.cpp
http://myhome.konetic.or.kr/UserUploadData/gobuksun/ExceptionEx.h





자, 그럼 어떻게 TRY CATCH 문을 사용하게 되었는지 예로 살펴보자.



만일 리소스 스트링 테이블에

IDS_USERID_NOT_EXIST 는 “아이디 %s는 존재하지 않습니다.”

IDS_INVALID_PASSWORD 는 “%s님의 비밀번호가 다릅니다.”라고 정의되어 있다고 가정한다.



TRY

{

CString strUserID = _T(“거북선”);

BOOL bSuccessLogin = FALSE;



// strUserID 아이디 검색

if (FALSE == bSuccessLogin)

::TfcThrowException (IDS_USERID_NOT_EXIST, strUserID);



// 패스워드 체크

if (FALSE == bSuccessLogin)

::TfcThrowException (IDS_INVALID_PASSWORD, strUserID);

}

CATCH_ALL (e) // 로그인 실패

{

// e->ReportError (REPORT_AS_TRACE); 이면 메시지 박스로 출력하지

// 않고 TRACE 처럼 결과창에만 보여준다.

e->ReportError ();

}

END_CATCH_ALL



이와 같이 사용 할 수 있다.



자신이 맡은 프로젝트의 성격에 따라, 에러 메시지 뿐만 아니라 에러 번호 같은 것을 멤버변수로 두어 각기 다르게도 처리할 수 있을 것이다.



실무에서 수많은 버그를 방지하는 방법은 빠져 나갈 수 있는 구멍을 철저히 막아버리는 것이다. 약간 귀찮아 보이지만 버그와 에러를 방지하는 방법으로써 Stdafx.h 파일에 #include "ExceptionEx.h"를 추가하고 TRY CATCH 문을 사용해보자.



PS) 글을 쓰다보니 TRY CATCH 문이 만능인것처럼 보일수가 있겠네요.. 아래 리플 달아주신 분들 감사합니다.

몇자 변경했습니다. 역시 논란이 있는부분입니다. 예외처리의 남용은 자칫 성능의 훼손이나 혹은 판독성마저 훼손할 수 있으니까 여러분 나름대로의 판단이 요구되는 부분이겠습니다.. ^^*
Posted by 장안동베짱e :
출처 : 데브피아(조휘경님 글)


이 강좌는 철저히 제가 실무에서 사용하는 방법을 토대로 설명하고 있습니다. 따라서, 저의 주관적인 의견이고 개인에 따라 다를 수 있습니다. 이번 주제는 우리가 Visual Studio 를 사용하는 데 있어 보다 프로그래밍 시간을 줄일 수 있는 효율적인 방법이 있는가를 알아보는 것입니다.



먼저, 제가 사용하는 환경을 스튜디오 스샷을 보면 다음과 같습니다.









에디터를 위와 같이 눈의 피로를 덜하게 비교적 중요하게 생각되는 문자열 숫자, 키워드 등의 색을 눈에 띄게 바꿔 줘야 합니다. 이는 메뉴의 Tools->Option->Format 에서 바꿀 수 있습니다.

다음으로 툴바를 없애야 합니다. 이는 스튜디오의 모든 기능들을 숙지해야 함을 전제로 합니다. 즉, 날 잡으셔서 모든 메뉴를 실행 시켜 보십시요. 모두 핫키 처리해야 하는데 처음에는 상당히 부담스럽고 어렵지만 익숙해지면 절대 툴바 사용 못합니다.. ^^*

핫키는 Tools->Customize->Keyboard 에서 설정할 수 있습니다. 에디터 콤보를 Main 으로 바꾸시고 하나 하나 핫키를 설정하시면 어느 상태이든 그 핫키는 작동하게 됩니다.



설정되어 있지 않아 눈여겨 설정해야 할 핫키를 정리하면 다음과 같습니다.

FileClose -> Ctrl+F4 or Alt+X

FindInFiles->Ctrl+Shift+F

ToggleCallStackWindow->Alt+7

ToggleDisassemblyWindow->Alt+8

ToggleFullScreen->Alt+9

ToggleMemoryWindow->Alt+6

ToggleOutputWindow->Alt+2

ToggleRegistersWindow->Alt+5

ToggleVariableWindow->Alt+4

ToggleWatchWindow->Alt+3

ToggleWorkspaceWindow->Alt+0

BuildBatch->Ctrl+Shift+B

BuildRebuildAll->Ctrl+Shift+F7

BuildBatchBuild->Ctrl+Shift+B

BuildSetActiveConfiguration->Ctrl+Shift+A



대충 이렇습니다. 기본적으로 설정되어 있는 핫키(예:컴파일 F7)는 당연히 그대로 사용하셔야 합니다.

다음으로 북마크를 잘 활용하셔야 하는데.. 북마크는 Ctrl+F2 로 만들고 없앨 수 있습니다. 여러 군데 만들어 보시고 F2 눌러서 날라다니십시요.. Ctrl+F3 는 단어 찾기 이고, F3 키로 계속 찾을 수 있습니다.

Ctrl+Tab 은 열린 파일간에 돌아다니실 수 있고, #include "MyMSNMessengerView.h" 에 커서를 위치시키시고 Ctrl+Shift+G 를 누르면 해당 헤더파일을 오픈시킵니다.

7.0 에서도 셋팅하는 방법이 있습니다. 시간을 갖고 잘 정리해보는 시간을 갖아야 합니다. 미래에 낭비될 시간에 비하면 결코 아까운 시간이 아닙니다.



역시 개인차가 있겠지만 프로젝트와 관련된 헤더파일과 구현파일을 각 기능별로 폴더에 몰아놓는 습관을 들여야 합니다. 파일수가 늘어나면 날수록 그 파일을 찾는데 소비하는 시간이 만만찮습니다.



MyMSNMessenger 의 경우 아래처럼 정리하였습니다.







라이브러리를 사용하는 경우 Lib 폴더에 xxx.lib 파일을 모아두고 exe 폴더에는 디버그모드의 출력들 (.exe, .dll)를 bin 폴더에 릴리즈 출력물들을 둡니다. 파일명만 보고도 디버그 모드인지 알 수 있도록 하고 exe 폴더에 몰아 두아 나중에 디버그 모드의 dll 도 릴리즈와 혼돈되지 않도록 exe 폴더로 저장되도록 처리합니다.



아래는 디버그 모드에서의 Output 파일을 지정하는 프로젝트 셋팅입니다.

디버그 버전은 끝에 D 를 붙여 MyMSNMessengerD.exe 로 저장했습니다.









지금까지 스튜디오 설정과 관련된 효율적인 방법에 대해 알아보았습니다.

써놓고 읽어보니 처음 시작하시는 분들께나 도움이 될 듯 하네요 .. 뻘쭘 -_-;;;;



혹시, 자신만의 아주 효율적이거나 간편한 방법이 있으신분들 공유해주세요 ^^*
Posted by 장안동베짱e :
출처 : 데브피아(조휘경님 글)



소프트웨어 공학의 주된 주제다. 학자들이 먹고 살자고 구조적 프로그래밍, 객체지향 프로그래밍, 최근에 UML, CBD(콤포넌트 기반) 프로그래밍 말이 바꿔가며 머리 아프게 하지만, 목적은 효과적인 개발이 무엇인가에 대한 고민일 것이다.



학교서 공부도 하고, 서적도 뒤적여 보고 눈을 크게 뜨고 변화의 흐름을 읽어야 할 것이다. 그런데, 문제는 실무에서 정작 중요한 것은 학문적으로 다뤄지지 않는다는 것이다. 왜냐하면 그건 논문으로 발표할 수 있는 주제가 아니지 않은가 ? 그것들이 무엇일까 ?



1. 문서를 잘 만드는 사람이 프로그래밍을 잘한다.

길지 않은 문장으로 쉽게 이해시킬 수 있는 능력, 남들이 쉽게 알아볼수록 문장을 잘 정리하는 능력, 눈에 띄게 문서를 만들 줄 아는 능력 등을 지닌 사람들이 프로그래밍을 잘한다. 결국엔 프로그램은 타이핑의 부산물이기 때문이다.

처음 코딩량이 적을 때는 쉽게 알 수 있지만 늘어나면 자기 자신도 못 알아보는게 다반사이다. 헝가리안 표기법을 반드시 지키며, 깔끔하고 알아보기 쉽게 만드는 것은 결국 미래의 자기 자신을 위해서다.

또 하나 중요한 것은 문서들을 잘 정리정돈 하는 것이다. 각 주제별로 잘 정리하는 시간을 절대 아까워해서는 안된다. 특히, 같은 문서는 중복되서 존재하지 않게 유지하는 것이 중요하다. DLL, LIB 파일들이 중복되어 난무해서 헤매게 되는 경우를 숫하게 봐왔기 때문이다.



2. 대부분의 문제는 누군가 고민했던 문제이다.

프로그래밍을 하다 보면 수많은 문제에 직면하게 된다. 그러한 문제 중 대다수는 이미 과거에 누군가 고민했던 문제이다. 따라서, 당면한 문제의 크기에 관계없이 혼자 삽질하지 말고 미리 찾아봐야 한다.

문제를 정확하게 파악하고 요구되는 사항을 분석하며 관련 자료를 개발하기 앞서 미리 수집해야 한다. 간과해서는 절대 안되는 것은 여기까지 즉, 자료 수집까지가 전부이다.

혹자는 그것이 문제를 해결해 줄 것처럼 착각한다. 후임에게 문제를 맡겼을 때 가장 깝깝한 대답이 인터넷에서 찾아봤는데 방법이 없다는 것이다. 온갖 다른 사람들이 고민한 흔적이 있는 자료는 삽질하지 않기 위한 참고일 뿐이다. 그 다음부터는 자신의 몫인 것이다.



3. 효율적인 프로그래밍 작업 환경을 구축한다.

다음 주제로 다뤄질 부분으로 하루 이틀 코딩할 것도 아닌데 미래를 위해 항상 가장 효율적이라고 생각되는 작업 환경을 구축해 놓아야 한다는 것이다. 참고로, 나의 Visual Studio 에는 툴바가 없다. 툴바는 시간을 빼앗는 가장 큰 적이다. 따라서, 모두 핫키 처리해야 한다. 또한, 스튜디오에서 제공하는 편리한 기능들, 디버그 기능들은 미리 숙지 해야 하고, 에디터도 자신이 좋아하는 스타일로 미리 바꿔 놓아야 한다.

프로젝트별로 각 기능별로 파일들을 분류하는 것도 중요하다. 예를 들어 헤더 파일은 include 폴더에, 라이브러리 파일은 lib 폴더에, 프로젝트를 위한 툴을 담은 구현파일들은 Tool 이라는 폴더에 위치시켜 척 보면 무엇을 위한 파일들인지 가늠되어야 한다. 특히 라이브러리에 관련된 위치는 분명하게 하여 라이브러리 소스를 변경해도 실행 파일에는 반영되지 않아 헤매는 일은 없어야 한다.



4. 잦은 컴파일과 실행을 통한 문제해결로 결코 문제는 해결되지 않는다.

개발자는 타이핑의 수고스러움을 결코 아껴서는 안된다.

가장 바보스러운 코딩은 클래스 뷰에서 멤버변수 만들고, 함수 만들고, 클래스 위자드에 있지 않은 메시지나 오버로드 함수 아니면 없다고 믿는 것이다. 개발자의 길을 걷겠다고 결심했다면 처음 해야 할 것은 개발자를 바보 만들기 위해 존재하는 스튜디오의 위자드 없이 조그마한 것이라도 직접 타이핑으로 작성해 보는 것이다.

다음으로 어떤 문제에 부딛히면 수없이 많은 컴파일과 실행을 남발하여 문제를 해결하려 해서는 안된다는 것이다. 변수 값을 하나 하나 바꿔가며 컴파일해서 문제를 해결했다면, 다음에 같은 문제에 부딛히게 되면 그 해결 방법은 컴파일뿐이다. 즉, 그 문제에 대한 해답을 모르는 것이다. 철저히 분석하고 원인을 규명하여 내 것으로 소화하고자 하는 노력이 요구되는 부분이다. 너무나 당연한 것이지만 어렵게 얻은 것은 결코 쉽게 잊혀지지 않는다.



5. 미래 지향적인 프로그래머가 되자.

프로그래밍의 기본 규칙 중에 하나가 “만들때는 어렵게, 사용할때는 쉽게” 이다. 어떤 기능을 수행하는 함수를 만들 때 이 함수를 사용하기 편리하게끔 만들어야 한다. 그냥 귀찮아서 코딩한 결과는 고스란히 다시 찾아와 더 귀찮게 만든다. 함수를 세분화 하고 명료화하는데 귀찮아해서는 안된다.

그리고 함수나, 클래스, 구조체, 프로토콜 등을 정의할 때 항상 미래를 염두에 두어야 한다. MS 의 코드들을 살펴보면 예약된 변수가 난무한다. 이러한 대비는 미래에 아주 유용하게 사용된다.

다음으로 굳이 성능에 연연할 필요가 없다는 점이다. 성능을 상당히 요구하는 복잡한 알고리즘이나 프로세스를 개발하지 않는 한 별로 신경 쓸 일이 아니다. 오히려 그 노력을 코드의 명료성, 확장성, 재사용성 등에 투자하는 것이 현명하다. 예전 도스시절 레지스터 변수, 재귀함수, GOTO문, 포인터에 포인터 등 온갖 알기 어렵게 구현해야 코딩 잘하는 사람으로 취급 받던 시절이 있었다. 하드웨어의 발전속도는 소프트웨어보다 월등히 빠르다. 그런 문제는 하드웨어가 해결해 줄 것이다.





이상으로 제가 개인적으로 실무에서 느끼는 점을 정리해 보았습니다. ^^

틀린 부분이나 개발 생산성과 관련된 여러가지 의견들 마구 마구 리플 달아주세요. 좋은 생각이나 경험은 서로 공유할 때 배가 됩니다. ^^*



다음엔 제가 알고 있는 효율적인 프로그래밍 환경 셋팅 방법에 대해 알아보겠습니다…
Posted by 장안동베짱e :
마이크로 소프트에서는
메신저를 따로 설치하지 않아도
웹상에서 사용할 수 있게
웹메신저라는 물건을 만들어 놓았습니다.

저도 안지 별로 안되었고-_- 모르는 분들이 계실거 같아서
약간의 설명을 드리고자.

http://webmessenger.msn.com

에 가시면 로그인만 하신 후에 사용이 가능합니다.

일단 기능은
대화기능
사용자 추가기능
대화명 변경기능
상태 변경기능
이메일 발송기능
글꼴 변경기능

정도가 있구요

파일전송이나
플러그인 그리고 탭기능등은 사용이 불가합니다.

웹 기반이라 iexplorer오류가 나면 같이 종료가 되긴하지만
상대적으로 가볍고 msn접속포트가 막혀있는 경우엔
사용이 편리하니 이쪽을 써보시는것도 좋을듯 하네요
Posted by 장안동베짱e :
MSN이 6.x버젼으로 업데이트 되면서 생긴 공개사진 기능..
그런데 어떤 사람은 사진이 깔끔하게 뜨는데 어떤 사람은 사진이 참 지저분하게 뜨죠?

그건 msn에서는 공개사진이 96x96 픽셀보다 크면 강제로 리사이징을 해서 그래요;;
싸이월드 해보셔서 알지요? 싸이월드도 400 넘으면 강제 리사이징 해서 그림 깨지는거..


이건 예시로 보여드리는 msn에 맞게 만들어진 공개사진입니다^^

그럼 어떻게 해서 msn에 맞는 깔끔한 공개사진을 만들수 있을까요?


Posted by 장안동베짱e :
Copyright (C> 1985 Richard M. Stallman (Copying permission notice at the end.)


GNU란 무엇인가? Gnu's Not Unix!
GNU는 유닉스와 완벽하게 호환하는 소프트웨어 시스템이며 사용가능한 모든이가 무료로 사용하도록 작성한 것이다. 몇몇 다른 자원자들의 도움이 있었으며, 많은 시간적, 금전적 지원과 프로그램과 장비가 절실히 필요한 상태이다.

우리는 문서 형식기로 TeX를 사용할 것이며, nroff도 여전히 사용될 것이다. 또한, X 윈도우 시스템도 사용할 것이다. 이런 후에 Common Lisp, Empire, 스프레드시트 등과 수많은 다른 프로그램을 온라인 문서를 포함하여 추가할 것이다. 우리는 결국, 일반적인 유닉스 시스템의 모든 기능을 갖추게 될 것이다.

지금까지 우리는 편집명령을 작성하기 위한 리스프를 갖춘 Emacs 문서 편집기, 소스수준의 디버거, yacc 호환 파서(parse) 생성기, 링커 등 35개 가량의 유틸리티를 만들어 왔으며, 쉘(명령어 번역기)은 거의 완벽한 수준에 이르렀다. 최적화된 포터블 C 컴파일러가 새로이 제작되었으며 이번 해에 배포될 것이다. 이미 처음의 커널이 있기는 하지만 유닉스를 구현 하기 위해서는 보다 많은 사양들이 추가되어야 할 것이다. 커널과 컴파일러가 완성되면 프로그램 개발에 적합한 GNU 시스템을 배포할 수 있을 것이다.

GNU는 유닉스 프로그램들을 사용할 수 있게 해주지만 유닉스와 동일한 것은 아니다. 우리는 다른 운영체제에서의 경험을 살려 가능한 사용하기 편리하도록 향상을 꾀했다. 특히, 긴 파일명을 쓸수 있게 하고, 파일 버젼넘버를 달고, 견고한 파일시스템을 구축하고, 터미널 비의존적인 디스플레이 장치를 만들 계획이며 최종적으로 몇개의 리스프 프로그램과 일반적인 유닉스 프로그램이 한 화면을 나누어 쓸 수 있는 리스프 기반의 윈도우 시스템을 만들 것이다. 시스템 프로그래밍 언어로 C와 리스프 두가지를 다 사용할 수 있을 것이다. UUCP, MIT Chaosnet, 인터넷 프로토콜을 지원할 것이다.

GNU는 본래 가상 메모리를 가진 68000/16000 계열의 컴퓨터를 겨냥하고 제작되었다. 그 까닭은 그 기계들에서 GNU를 가장 쉽게 작동시킬 수 있기 때문이다. 보다 작은 컴퓨터에서 작동 시키기 위해서는 사용하고자 하는 사람이 특별한 노력을 기울여야 할 것이다.

심각한 혼돈을 야기할 수 있기 때문에 'GNU'가 이 프로젝트를 지칭 할 때는 반드시 'G'를 발음해주기 바란다.


나는 누구인가?
나는 리처드 스톨맨이란 사람이며 Emacs 에디터의 고안자이다. 나는 컴파일러, 에디터, 디버거, 명령어 해석기, 시분할체제와 리스프머신 운영체제에 관해 광범위한 작업을 해왔으며, ITS에서 터미널 비의존적인 출력장치를 개발했다. 그런 다음 리스프기계를 위한 견고한(crashproof) 파일 시스템 하나와 두개의 윈도우 시스템을 구현했고, 지금은 세번째 윈도우 시스템을 구상했으며, 이것은 GNU는 물론 다른 많은 시스템에 이식될 것이다.


왜 GNU를 작성해야만 했는가?
어떤 프로그램을 좋아 한다면 당연히 그것을 좋아하는 사람들과 함께 나누는 것이 황금률(대우 받고자 하는 데로 대하라. - 성서)이라고 생각한다. 소프트웨어를 판매하는 사람들은 사용자를 각각 구분하고, 그들위에 군림하고, 사용자 서로가 프로그램을 공유하는 것을 거부한다. 나는 올바른 양심으로 비 공개 협정이나 소프트웨어 라이선스 협약에 서명할 수 없다. 여러해동안 인공지능 연구소에서 일하면서 그러한 경향과 다른 박정한 일들에 저항해 보았지만 결국에는 그들의 승리로 끝나고 말았다. 내의지에 역행하는 그런 일들이 일어나는 연구소에 나는 더이상 머무를 수가 없었다.

내가 계속해서 명예를 손상시키지 않고 컴퓨터를 사용하기 위해, 공개되지 않은 소프트웨어를 더이상 사용하지 않고도 작업을 해나갈 수 있는 충분한 공개 소프트웨어의 본체를 만들 결심을 했다.


유닉스와 호환성을 가지는 이유
유닉스가 이상적인 체제라고 생각하지는 않지만 제법 쓸만하다고 할 수 있다. 유닉스체제의 골자는 훌륭한 것이며 나는 유닉스의 장점을 해치지 않고도 부족한 점을 메울 수 있을리라 생각했다. 그리고 유닉스와 호환을 가지면 다른 많은 사람들이 적응하기에도 편리할 것이다 생각햇다.


GNU를 사용하는 방법
GNU를 사용하는데 지역적인 제한을 받는 것은 아니다. 누구나 GNU를 수정하고 배포할 수 있지만 어떤이도 GNU가 보다 널리 배포되는 것을 제한할 수 없다. 즉, 변경한 내용을 독점할 수 없다는 것이다. 나는 모든 버젼의 GNU가 공개된채로 남아있기를 보장 받고 싶은 것이다.


많은 다른 프로그래머들의 동참을 바라는 이유
나는 그동안, GNU에 흥미를 느끼고 돕고자 하는 많은 프로그래머들을 찾을 수 있었다. 많은 프로그래머들은 시스템 소프트웨어가 상용화된 것을 불쾌하게 생각한다. 이렇게 함으로 해서 보다 더 많은 돈을 벌 수는 있겠지만 일반적으로 이런 상황에서는 프로그래머들이 서로를 동지로 느끼기 보다는 투쟁해야할 대상으로 느끼게 된다. 프로그래머들 사이의 우정을 나타내는 가장 기본적인 행동은 프로그램을 나누는 것이다. 이제는 전형적인 핵심으로 여기는 마케팅 협정은 프로그래머들이 친구로서 다른 프로그래머를 대하는 것을 금하고 있다. 소프트웨어를 구입한 자는 우정과 준법중 하나를 선택해야만 한다. 물론 자연적으로 많은 이들이 우정을 보다 중요시한다. 그러나 법의 존재가치를 인정하는 사람들은 어떤 결정을 내리든 편한 마음을 가질 수 없다. 그들은 냉소적이 되어 프로그래밍은 단지 돈을 버는 수단이라고 생각하게 된다.

그러나 독점적인 프로그램들 대신 GNU를 사용하게 되면, 우리는 모든이에게 온정을 가질 수 있으며, 법도 준수하게 된다. 게다가 GNU는 영감을 주는 예와 다른이가 우리와 나누는 일에 동참하도록 고무하는 깃발 노릇도 한다. 이는 우리가 상용프로그램을 쓸 때는 느낄 수 없는 조화로운 느낌을 갖게한다. 나와 대화한 프로그래머들중 거의 반 정도는 이것은 돈이 대신할 수 없는 중요한 행복이라는데 공감했다.


당신이 기여할 수 있는 방법
나는 제조업자들에게는 기계와 돈을, 개인들에게는 프로그램과 노동을 지원해 줄 것을 요청한다. 컴퓨터를 기증해서 기대할 수 있는 중요한 점은 GNU가 머지않아 그 기계에서 작동 할 것이란 점이다. 기증된 컴퓨터는 완전해질 것이며, 따라서 시스템을 사용할 준비를 모두 갖추게 되어 파워와 효율을 과대 포장할 필요가 없을 것이다.

나는 GNU를 위해 시간제로 일하기를 갈망하는 많은 프로그래머들을 찾을 수 있었다. 대부분의 프로젝트에서 그러한 시간제로 배치된 작업을 통합하고 조정하는 일은 매우 어려웠다. 독립적으로 쓰여진 부분들은 함께 동작하지 않았다 그러나 특정한 작업인 유닉스를 대치하는 과정에서는 그러한 문제가 생기지 않았다. 완전한 유닉스 시스템은 개별적인 설명이 포함된 백여개의 유틸리티를 포함한다.

대부분의 인터페이스 사양은 유닉스에 호환되도록 맞추어 진다. 만약 각각의 프로그래머가 유닉스 유틸리티 한개를 유닉스에 호환하도록 재구현하고 본래의 유닉스 시스템에서 충분히 작동하게 할 수 있으면, 이것들은 함께 묶어 놓아도 올바르게 작동할 것이다. 만일 누군가가 예기치 못했던 문제를 야기시키다 해도, 전체적인 구성요소들을 통합하는 작업은 충분히 가능할 것이다. (커널을 만드는 작업은 세밀한 대화가 필요할 것이며, 소수의 호흡이 잘 맞는 집단이 적당할 것이다.)

만일 내가 금전적인 지원을 얻은다면, 약간의 인원을 전시간 또는 시간제로 고용할 수 있을 것이다. 일반적인 프로그래머 수준의 봉급을 줄 수는 없겠지만, 돈이 가지는 것 만큼 공동체 의식을 정립하는 일도 중요한 의미를 가진다고 생각하는 사람들을 찾아 볼 것이다.


모든 컴퓨터 사용자가 이득을 얻게되는 이유
일단 GNU가 작성되니까, 마치 공기처럼, 모든 사람들이 훌륭한 시스템 소프트웨어를 무료로 얻을 수 있게 되었다. 이것은 단지 모든 이에게 유닉스 저작권에 대한 비용을 덜어 주는 것보다 훨씬 더 많은 의미를 가진다. 이는 시스템 프로그래밍에 드는 노력이 불필요하게 중복되는 것을 피할 수 있음을 의미한다. 대신, 절약된 노력은 기술 수준을 향상시키는데 사용될 것이다.

완벽한 시스템 소스가 모든 사람들에게 제공될 것이다. 결과적으로, 시스템에 변화를 주고자 한다면 언제든지 스스로 자유롭게 수정할 수 있을 것이다. 혹은 적당한 프로그래머나 업체에 의뢰할 수도 있을 것이다. 사용자들은 더이상 프로그램 소스를 가진 프로그래머나 회사에 의존하지 않아도 될 것이며 독자적으로 수정을 가할 수 있을 것이다.

학교는 모든 학생들이 시스템 코드를 배우고 향상시키도록 장려함으로써 보다 나은 교육 환경을 조성할 수 있을 것이다. 하버드 컴퓨터 연구소에서는 어떤 프로그램이든지 그 소스가 공개 전시 되지 않으면 시스템에 설치하지 못하게 하는 정책을 쓰곤 했다. 실제로 어떤 프로그램들을 설치하지 못하게 함으로써 이 정책을 고수 했다. 나는 이것에서 커다란 영감을 받게 되었다. 결국에는, 누가 시스템을 소프트웨어를 소유하고 있으며 누구에게 사용할 수 있는 자격을 부여할 것인지 아닌지를 고려하는 제 비용은 상승하게 될 것이다.

복사 라이센스를 포함하여 프로그램 사용에 대한 지불을 준비 할때는 언제나 개인이 지불해야할 돈이 얼마인가를 알아내야 하는 필요성을 통하여 사회에 많은 비용을 야기시킨다. 그리고 오직 경찰 당국 만이 모든 사람이 그것을 따르게 하도록 힘을 행사할 수 있다. 막대한 비용을 들여 공기를 생산하는 우주정거장을 생각해보자. 이런 경우 각각의 개인은 자신이 호흡하는 공기에 대해 리터단위로 요금을 지불 하는 것이 합당할 것이다. 그렇다고 해도 호흡하는 공기의 양을 계측하기위해 메터기가 달린 방독면을 밤낮으로 쓰고 있어야 한다면 그런 방식은 타당한 것이 아니다. 그리고 TV 카메라는 당신이 마스크를 벗는 불법을 행하는지 어디서나 지켜 보아야 할 것이며 따라서, 이것 보다는 사람수에 따라 일정한 세금을 부과하고 마스크를 벗어던지는 것이 현명하다.

프로그램의 일부 혹은 전체를 복사하는 행위는 프로그래머에게 있어서는 숨을 쉬는 것만큼이나 자연스러운 일이며 생산적이다. 따라서, 프로그램은 마땅히 공개되어야 한다.


몇가지 GNU의 목표에 대한 반대 의견
"무료라면 아무도 그것을 쓰지 않을 것이다. 왜냐하면 무료라는 것은 어떠한 지원도 기대할 수 없다는 것을 의미하기 때문이다."
"당신은 그 프로그램에 대한 지원과 도움을 제공하는 댓가로 이에 관한 비용을 부과해야만 한다."

만약 사람들이 돈을 지불하고서 GNU에 대한 서비스를 받기를 희망한다면, GNU를 무료로 얻은 사람들에 그런 서비스를 제공하는 회사도 이익을 얻을 수 있을 것이다.

우리는 반드시 실제 프로그래밍 작업과 단순 관리 작업은 구별해야 한다. 전자는 때때로 소프트웨어 판매 회사에게 의존할 수가 없다. 만일 당신의 문제가 충분한 사람에 의해 나누어지지 않는다면, 회사는 잊어비리라고 말할 것이다.

만일 당신의 사업이 지원에 대한 의존이 필요하다면, 가능한 필요한 모든 소스와 도구를 갖추어야 할 것이다. 그러면, 당신은 당신의 문제를 해결해 줄 수 있는 사람을 고용할 수 있으며, 이것은 다른 어떤 사람의 자비를 받는 것은 아니다. 유닉스상에서, 소스의 가격은 대부분 고려되지 않으며, GNU는 더 쉬울 것이다. 이것은 여전히 유능한 사람이 필요없을 수는 있으나, 이 문제는 배포에 따른 비난을 할 수 없다. GNU는 모든 세계의 문제를 제거하는 것은 아니며, 단지 그중 하나이다.

한편, 컴퓨터에 대해 전혀 모르는 사용자들은 여전히 단순한 관리 서비스를 필요로 한다. 이러한 일은 사용자 스스로 능히 처리할 수 있는 종류의 일이지만 그러한 방법을 모르기 때문이다.

이런 서비스들은 단순한 수작업이나 복구 서비스를 지원하는 회사들이 제공할 수 있다. 사용자들이 제품을 사고 그에 대한 서비스를 받는 방식을 받아들인다면, 제품을 무료로 받고 서비스에 대한 비용을 지불하는 방식에도 기꺼이 동의할 것이다. 서비스를 제공하는 회사들은 가격과 질적인 면에서 모두 완벽을 기할 수 있을 것이며 사용자들은 어떤 특정한 업체에 얽메일 필요는 없을 것이다. 또한, 그러한 서비스가 필요하지 않은 사람들은 서비스에 대한 비용을 들이지 않고도 프로그램들을 쓸 수 있을 것이다.

"광고를 하지 않고는 많은 사람들에게 알릴 수 없을 것이며, 그러기 위해서는 필히 프로그램에 가격을 매겨야 한다. " "무료로 제공되는 프로그램을 광고하는 것은 무의미하다."

GNU 같은 프로그램을 많은 컴퓨터 사용자들에게 알릴 수 있는 방법에는, 무료, 혹은 극히 적은 비용으로 사용할 수 있는 다양한 공공 정보 전파 방식이 있다. 그러나 광고를 하는 것이 보다 많은 마이크로 컴퓨터 사용자에게 알릴 수 있는 방법일지도 모른다. 만일 실제로 이런것이 사실이라면, 복사와 배포를 하는데 돈을 받음으로써 능히 광고와 그외의 부수적인 비용을 감당할 수 있을 것이다. 이런 방식에서는, 광고를 보고 배포본을 구입해서 이익을 얻을 수 있는 사용자가 광고 비용을 부담하게 되는 것이다.

반면, 많은 사람들이 GNU를 그 친구들을 통해서 구한다면, 이런 종류의 회사들은 성공할 수 없을 것이다. 이는 GNU를 보급하는데 광고가 필요한 것은 아님을 보여준다. 그렇다고 한다면 무료로 보급되고 있다는 사실이 무료로 알려지는 것을 바라지 않을 만한 이유가 있겠는가?

"나의 회사는 경쟁사들에 대한 우위를 차지하기 위해 독점적인(고유의) 운영체제가 필요하다."

GNU는 시스템 소프트웨어 경쟁이라는 범주에서 제외될 것이다. 당신의 회사가 우위를 차지할 수 없는 것처럼, 당신의 경쟁사들도 그점에 있어서는 마친가지일 것이다. 당신과 당신의 경쟁사들 모두 이 분야에서는 별반 이득을 볼 수 없겠지만, 다른 분야에서 서로 경쟁하는 것은 가능할 것이다. 당신의 사업이 운영체제를 판매하는 것이라면, GNU가 마땅치 않게 생각 될 것이다. 당신의 사업이 이런 종류가 아니라면, GNU는 시스템 소프트웨어에 관련된 막대한 비용을 절감해 줄 것이다.

나는 제작자와 사용자들이 GNU의 발전에 기여해 나감으로써 서로의 비용을 절감할 수 있기를 희망한다.

"프로그래머는 그의 참의력에 대한 보상을 받을 자격이 있지 않은가?"

보상받을 만한 일이란 사회적 공헌을 말한다. 창의성이란 그 결과물을 사회가 댓가 없이 사용할 수 있을때 사회적 공헌이 되는 것이다. 어떤 혁신적인 프로그램을 제작한 사람이 그에 대해 보상을 받아야만 한다면, 같은 맥락에서 그것을 자유롭게 사용하지 못하게 한다면 그때는 제재를 받아야 할 것이다.

"프로그래머는 그의 창의력에 대한 보상을 요구할 수 없는가?"

유해한 수단을 사용하지 않는다면, 노동에 대한 보수와 자신의 소득이 극대화 되기를 바라는 것은 아무 문제가 없다. 그러나 지금까지 소프트웨어 산업에서 보편화된 수단은 유해한 방법이다.

프르그램을 사용하는 것에 제한을 둠으로써 돈을 벌어들이는 행위는 프로그램이 사용되는 범위와 방식을 제한하기 때문에 유해한 것이다. 이는 인간들이 프로그램으로부터 얻을 수 있는 전체적인 풍요로움을 감소시키는 것이다.

선량한 시민이라면 자신이 보다 부유해지기위해 그런 수단을 쓰지 않는다. 그 까닭은, 만일 모든 사람들이 그렇게 한다면 상호간의 유해한 행위로 인해 결과적으로 우리 모두는 보다 빈곤해질 것이기 때문이다. 이것은 칸트의 윤리학이나 황금율같은 분명한 것이다. 나는 모든 사람들이 자기만의 정보를 축적해나가는 것은 바람직하다고 여기지 않기 때문에, 누군가 그런 일을 한다면 나는 그것이 잘못된 일이라고 생각할 필요를 느끼게 되었다. 특히, 한 개인의 창의성을 보장 받고자하는 욕구가 일반적으로 전체의 창의성이나 혹은 그 일부분을 저하시키는 행위를 정당화 시키지는 않는다.

"프로그래머들의 밥줄이 끊기지 않을까?"

나는 모든 사람이 프로그래머가 될 필요는 없다고 답하고 싶다. 아마 우리들 대부분은 거리에 나가 인상을 써서 간신히 약간의 돈을 벌어 살아갈 수는 없을 것이다. 그러나 결과적으로, 우리는 거리에 나가 인상 써서 돈을 번다고 비난 받을 필요도 없고, 또한 빈궁해질 필요도 없을 것이다. 우리는 그와는 다른일을 할 수 있을 것이다.

그러나 이것은 프로그래머는 소프트웨어를 소유하지 않으면 단 한푼도 벌 수 없다 라는 질문하는 사람의 독단적인 가정을 받아 들였다는 점에서 오답이라 할 수 있다. 아마도, 이런 생각은 극단적일 것이다.

프로그래머가 생계에 지장을 받지 않을 것에 대한 진정한 이유는, 지금과 같은 정도는 아니겠지만 여전히 프로그래밍으로 돈을 벌 방법들이 있기 때문이다.

프로그램 복사를 제한하는 것이 소프트웨어 사업의 유일한 기본 방침은 아니다. 이런 방침이 보편화된 것은 이렇게 함으로써 가장 돈을 많이 벌 수 있기 때문이다. 고객들에 의해 이런 방식이 거부되거나 금지된다고 해도, 소프트웨어 사업은 지금까지 흔하지 않았던 새로운 조직체계로 전환해 나갈 길을 모색할 수 있을 것이다. 여러가지 사업을 한데 묶어 조직화하는 방법은 무궁 무진할 것이다.

아마 새로운 기반하에서의 프로그래밍은 지금처럼 수익성이 높은 일은 아닐 것이다. 하지만 이것이 변화의 쟁점은 아니다. 지금의 판매 사원들이 그들의 봉급을 버는 방식이 불합리한 것이라고 생각하지는 않는다. 프로그래머들이 그와같은 방법으로 소득을 올린다해도 하등 정당하지 못할 이유가 없다. (실제적으로 프로그래머들은 여전히 그들보다 월등히 많은 소득을 올리고 있다.)

"누구든 그들의 창의력이 사용되는 방법을 지배할 수 있지 않은가?"

"인간 생각의 쓰임새를 지배하는 것"은 실제적으로는 그의 인생을 지배하는 것이다. 이는 자신의 인생을 보다 어렵게 만들곤 한다.

지적 소유권에 관해 상세하게 공부한 사람들(변호사 등)은 그 자체로서 완벽한 지적 소유물을 없다고 말한다. 정보가 인정하는 추상적인 지적소유권들은 특정 목적을 위한 특정 법률 조항으로부터 발생한 것이다.

예를 들어, 특허제도는 발명가가 그의 고안품의 세부사항을 공개하는 것을 장려하고자 설립된 것이다. 시간의 측면에서 보면, 특허가 갖는 17년간의 유효기간은 기술이 발전하는 비율과 비교해 볼대 짧다. 특허권은 생산업자들 사이의 문제이고, 생산을 향상시키는 것과 비교해서 특허권 계약에 드는 비용과 노력은 작다고 보기 때문에, 특허권은 일반적으로 그다지 해악하게 작용하지는 않는다. 또한, 그것은 대부분의 특허 받은 제품을 사용하는 것을 제한하지는 않는다.

고대에는 저작권이라는 것이 존재하지 않았으며 그 시대에 작가들은 빈번하게 다른 이의 작품 상당량을 실제의 (허구가 아닌) 작품에 복제하기도 햇다. 이런 작업들은 유용한 것이었으며, 비록 그 일부분이기는 하지만 많은 사람들의 작품이 계속해서 전수되는(존재해 나가는) 유일한 방법이었다. 저작권 제도는 작가 의식을 고취 시키고자 급집적으로 만들어진 것이다. 이것이 처음 만들어 질 때 주로 염두에 두었던 책의 범주에서 보면 책은 실용적인 측면에서 인쇄기를 사용해서만이 복사가 가능 하기 때문에 저작권은 그다지 해롭지는 않았다. 또한, 대다수의 사람들이 책을 읽는 것을 제한하지도 않았다.

모든 지적 소유권은, 그것들이 어떻던지 그를 허용함으로써 사회전체에 이득이 된다고 여겨져서, 사회가 허용할 때만 정당하게 되는 것이다. 그러나 어떤 특정 상황에서든 우리는 "그런 인가를 내주는 것이 정말로 우리에게 유익한가?" 어떤 종류의 인가를 내줄 것인가?" 하는 질문을 해보아야만 한다.

오늘날의 프로그램들의 경우는 백여년전의 책의 경우와 크게 다르다. 프로그램이 이웃간에 손쉽게 복사될 수 있다는 사실, 소스 코드와 목적코드로 구분된다는 점, 읽기 위한 것이 아니라 즐기기 위한 것이라는 사실들이 묶여져서, 저작권을 강요하는 사람들이 전체사회에 정신적, 물질적으로 해를 끼치는 상황을 만들고 있다.

"경쟁 함으로써 보다 나은 결과를 얻을 수 있는가?"

모범적인 경쟁방식은 경주(race)이며, 승자에게 상을 줌으로써 주자들이 더욱 빨리 달리도록 장려할 수 있는 것이다. 만약 자본주의가 실제로 이런 방식을 따른다면 이는 바람직한 것이다 그러나 자본주의 옹호론자들은 실제로 항상 이런 방식으로 움직인다고 단정짖는 잘못을 범한다. 만일, 주자들이 상이 주어지는 이유를 망각한채 승리에만 집착한다면, 말할것도 없이 그들은 다른 주자를 공격한다든지하는 색다른 전략을 찾게 될 것이다. 주자들이 먼저 싸우기 부터 한다면, 그들은 결국 모두 늦어질 수 밖에 없는 것이다.

독점적이고 비밀에 싸인 소프트웨어는, 도덕적으로 먼저 싸우기 부터하는 주자들과 동일하다. 슬픈 일이지만, 우리의 유일한 심판은 그다지 공평해 보이지 않으며, "매 10 야드마다 한번씩 상대방을 가격할 수 있다" 는 규정을 적용하는 정도일 것이다. 그러한 싸움이 있을 때는, 그들을 떼어놓고 벌칙을 주어야하는데도 말이다.

"금전적인 장려가 없다면 아무도 프로그래밍을 하지 않을 것이다."

실제적으로, 많은 사람들이 분명한 금전적인 장려가 없이도 프로그래밍을 할 것이다. 프로그래밍은 어떤 사람들에게는 저항할 수 없는 매력인 것이며 보통 프로그래밍에 능숙한 사람에게 더욱 그렇다. 비록 생활의 기반이 될 가망이 없더라도 꾸준히 계속해가는 직업적인 음악인들이 많이 있다.

그러나 실제로 질문은, 비록 일반적으로 많이 제기 되지만, 상황에 적합하지 못하다. 프로그래머들의 소득원이 없어지는 것이 아니라 단지 수입이 줄어드는 것일 뿐이다. 따라서 올바른 질문은 "금전적인 보상이 줄어 들더라도 사람들이 프로그래밍을 하게 될까?" 일 것이다. 내 경험에 의하면 그렇게 할 것이다.

십년 이상 동안, 세계 정상급 프로그래머들이 인공지능 연구소에서 일햇었지만, 그들이 받은 보수는 다른 어떤 곳에서 기대할 수 있는 것보다 훨씬 적은 것이었다. 그들은 명성이나 감사 같은 다양한 종류의 비 금전적인 보상을 받았다. 그리고 창의력은 그 자체 안에 보상이라는 개념을 가지고 있다는 점에서 흥미로운 것이다.

그 후, 그들 대부분은 이전의 작업처럼 그들이 흥미롭게 생각하는 일을 높은 보수를 받으며 할 수 있는 기회가 주어지자 연구소를 떠났다.

이 사실에서 알 수 있는 것은 사람들은 부유해기기 보다는 어떤 까닭을 위해서 프로그래밍을 한다는 것이며 그런 조건위에 상단한 보수까지 받을 기회가 주어진다면, 그를 예상하고 요구하게 되는 것이다. 보수가 낮은 조직은 높은 보수를 받는 조직과의 경쟁에서 뒤지겠지만, 만일 높은 보수를 받는 조직과는 상호이동이 없는 완전히 개별적인 집단이라면 그들 나름대로 훌륭하게 활동할 것이다.

"우리는 프로그래머가 절대적으로 필요하다. 만일 그들이 우리의 이웃을 돕지말라 하면 우리는 따를 수 밖에 없다."

당신들은 결코 그런 종류의 요구에 복종해야할 만큼 절박하지 않다. 명심하라. 열 장정이 도둑 하나를 막지 못하는 법이다.

프로그래머들도 어떤식으로든 그들의 생계를 꾸려 나가야 하지 않은가?"

요컨데 이것은 진실이다. 그러나 프로그램의 사용에 대한 권리를 파는 것이외에도 생계를 꾸릴 수 있는 수많은 방법들이 있다. 현재 사용에 대한 권리를 파는 것이 보편적으로 받아 들여지는 것은 그런 방식으로 프로그래머나 사업자들이 보다 많은 돈을 벌 수 있기 때문이지, 결코 이것이 생계를 유지하는 유일한 방법이기 때문은 아니다. 다른 방법을 찾고자 한다면, 얼마든지 가능할 것이다. 여기 여러가지 예들이 있다.

새로운 컴퓨터를 내놓는 제조업자는 새 기계에 운영체제를 이식하기 위한 비용을 지불하게 된다. 교육, 단순관리 작업, 지속적인 서비스들을 제공하는 회사에서도 역시 프로그래머는 필요할 것이다.

사용자의 마음에 흡족하다면 그에 대한 보수를 지불해달라고 요구하는, 프리웨어라는 새로운 아이디어로 프로그램들을 배포하는 사람들도 있다. 혹은 단순 관리 서비스를 제공하고 보수를 받는 사람들도 있다. 나는 이미 이런 방식으로 성공한 사람들을 만났다.

도움이 필요한 사용자들은 사용자 그룹을 결성하고 회비를 조성할 수 있을 것이다. 그룹은 프로그래밍 회사와 계약을 맺고 회원들이 원하는 프로그램을 주문 제작할 수 있을 것이다.

모든 종류의 발전에 필요한 기금은 소프트웨어 세로 조성할 수 있을 것이다. 만약, 컴퓨터를 구입하는 모든 사람들이 가격의 x 퍼센트를 소프트웨어 세금으로 지불한다면, 정부는 그 돈을 소프트웨어 발전에 쓰여 지도록 NSF 같은 단체에 지원할 수 있을 것이다.

그러나 컴퓨터 구입자가 개별적으로 소프트웨어 발전에 공헌을 한바가 있다면, 그는 세금을 면제 받게 될 것이다. 그는 스스로 어느 프로젝트에 기부할 것이지를 결정할 수 있을 것이며, 때론 그 결과를 쓸 수 있을 것이란 기대를 품고 결정을 내리게 될 것이다. 얼마를 기부하든지 지불해야 할 세금 전액을 대신할 수 있을 것이다. 세금의 전체적인 세율은 납세자들이 투표를 해서 결정할 수 있을 것이며, 지불할 액수에 따라 차등 조정될 것이다.

결론:


컴퓨터 사용자 공동체는 소프트웨어 발전을 지원한다.
어는 수준의 지원을 할 것인가는 이 공동체가 결정한다.
자신의 몫이 어떤 프로젝트에 쓰일 것인가에 관심있는 사용자들은 이를 스스로 결정할 수 있을 것이다.


결국에는, 프로그램을 무료로 보급하는 것은 더이상 단지 생계를 위해 고되게 일할 필요가 없는 풍요로운 세계로 가는 한 단계인 것이다. 사름들은 프로그래밍 같은 자신이 흥미를 가질 수 있는 일에 몰입할 수 있는 자유를 갖게될 것이다. 법률이 규정하는 주당 열 시간 정도의 시간을 마친 후엔, 가족들과 담소한다든지, 로보트를 수리 한다든지, 천체를 관측하는 일 따위를 하게 될 것이다. 더이상 프로그램을 생계의 수단으로 삼을 필요가 없게 될 것이다.

우리는 이미, 실제적인 생산성을 향상 시키기 위해 전체 사회가 부담애햐할 작업의 분량을 많이 감소 시켰다. 이중 매우 적은 부분은 단지 프로그래머들의 유희를 위해서 작성되었다. 그 까닭은 비 생산적인 활동은 생산적인 활동을 하기우해 필요한 것이기 때문이다. 이런 일을 하게된 주된 이유는 경쟁을 대신할 수 있는 관료 정책이며 그와 동일한 부피를 갖는 몸부림인 것이다. 프리 소프트웨어는 소프트웨어 생산 분야에서 생산력이 낭비되는 것을 크게 감소 시킬 수 있을 것이다. 우리는 이러한 작업을 해나가야 하며, 생산성을 위한 기술 습득은 적은 노력으로 가능할 것이다.

Copyright (C) 1985 Richard M. Stallman

이 문서의 저작권과 배포 허용에 관한 주의사항을 전제하기만 한다면, 누구나 이 문서를 요약해서 배포하거나 부분적으로 인용할 수 있으며, 이 글과 같은 방법으로 자신의 문서가 재 배포되는 것을 허용할 수 있을 것이다.
Posted by 장안동베짱e :
Posted by 장안동베짱e :
환경 문제가 화두로 떠오르면서 웰빙 마케팅에 대한 기업들의 관심이 고조되고 있다.
또한 지나치게 음식을 가려먹는 등 몸을 챙기는 사람들을 칭하는 이른바 ‘웰빙족’이란
신조어도 생겼다. 그러나 웰빙은 피트니스센터를 갖춘 고급 아파트에서 비싼 건강식품
을 먹고 자기 몸만 잘 가꾸며 살자는 뜻이 아니다.

교수직을 버리고 미국 버몬트의 한 낡은 농가에서 농사를 지으며, 저서로 세계인들에게
자연사랑을 깨우치며 100살까지 산 스콧 니어링의 삶은 이러한 자연친화적인 삶의
표본이다. 그는 건강하게 100살까지 살다가 삶에 집착하지 않고 스스로 음식을 서서히
끊음으로써 자신을 붙들고 있던 목숨과 작별을 고했다. 그에게 죽음은 공포와 단절이
아니라 유기적인 순환으로 자연스러운 삶의 일부를 의미했던 것이다. 미국 인디언들도
이런 가치관을 갖고 있어서 죽음을 자연의 품으로 돌아가는 성스러운 과정으로 여겼
다. 전투에서도 죽음을 두려워하지 않고 부족을 위해 용감히 싸워 백인 군인들을 공포
에 떨게 만들었다. 니어링 박사의 삶을 중심으로 현대 도시인들에게 꼭 필요한 건강한
웰빙 생활습관을 정리해보면 다음과 같다.


하나, 저지방 유기농 식품을 소식한다.

둘, 흡연이나 과음은 절대 금한다.

셋, 화장품, 세제 등 생활용품은 천연제품을 이용한다.

넷, 정기적인 환기로 실내 공기를 깨끗하게 유지한다.

다섯, 일주일에 1회 이상 땀 흘리는 운동으로 체력을 높인다.

여섯, 가족과의 화합으로 행복지수를 높인다.

일곱, 동료 간의 경쟁을 피하고 자신의 목표를 세워 자신과 싸운다.

여덟, 평소 일찍 일어나 독서나 명상을 즐기고 클래식 음악을 듣거나 공연을 관람하는 등 취미생활로 스트레스를 푼다.

아홉, 정기적인 자원봉사 활동으로 보람을 느껴 마음의 기쁨과 평화를 유지한다.

열, 식구들이 함께 주말농장에 가는 등 가능하면 도시보다는 숲이 많은 지역에서 시간을 많이 보낸다.





이기영/호서대 교수, singreen.com ⓒ 한겨레(http://www.hani.co.kr)
Posted by 장안동베짱e :
사용법에 대한 의문사항은 향긋한 커피한잔의 여유를 본인에게 제공한다면 언제든 환영이외다.
앞으로 몇가지 더 올릴 내용이 있지만 도배나 광고성 글로 오인될 가능성이 농후한지라 짬짬이 올릴랍니다.
그럼 스타ADT를 작성하러... 휘리릭~~


툴 사용법이라고 등한시 하지 마시기 바랍니다.
어떤 툴이든 편리한 사용법을 습득해놓으면
나중에 틀림없이 습득하지 못한 사람이랑 차이가 납니다.
닷넷도 마찬가지 일겁니다.
회사마다 자기들만의 사용법을 거의 유지하니까요.

Esc : Output 윈도우 닫기(커서가 어디있든지 한두번 누르면 틀림없이 닫깁니다)
(화면이 좁은분한테 유용함)
Ctrl+F4 : 현재 에디트창 닫기
Ctrl+F, Alt+F3 : 찾기(대화상자 뜸)
Ctrl+Tab, Ctrl+F6 : 에디트창 바꾸기(.cpp나 .h파일 여러게 열어놓고 써보세요, Alt+W/W를 하면 고를수가 있습니다)
Ctrl+Space : 자동완성(유용한 기능)
Ctrl+Shift+Space : 함수 인자 리스트 보여주기
Ctrl+D : Find 창으로 커서 이동(메뉴바 밑에) 검색할 단어를 쓰고 F3이나 엔터로 검색
Ctrl+F3 : 커서위치 단어가 Find 창에 쓰여짐. F3 아래로 검색, Shift+F3 위로 검색(엔터키는 안됨)(깔끔한 기능)
Ctrl+Shift+U : 커서위치 문자나 블럭선택된 단어를 대문자로 바꿈
Ctrl+U : 커서위치 문자나 블럭선택된 단어를 소문자로 바꿈
Ctrl+-> : 커서가 단어 단위로 오른쪽으로 이동
Ctrl+<- : 커서가 단어 단위로 왼쪽으로 이동
Ctrl+Shift+-> : 단어 단위로 오른쪽으로 블럭선택
Ctrl+Shift+<- : 단어 단위로 왼쪽으로 블럭선택
Ctrl+위쪽 화살표 : 커서는 같은 라인에 있고 에디트 윈도우가 위로 이동
Ctrl+아래쪽 화살표 : 커서는 같은 라인에 있고 에디트 윈도우가 아래로 이동
Ctrl+L : 커서 위치 한 라인이 지워지고 클립보드에 복사됨(블럭선택, Ctrl+X/Ctrl+V을 Ctrl+L/Ctrl+V로 단순화)
Ctrl+F8 : 커서 위치 한 라인이 모두 선택됨. 아래, 위 방향키로 선택 영역 넓힘(요거 응용많이 해보세요. 편합니다)
Ctrl+F2 : 위치 표시(왼쪽에 하늘색 네모생김), F2 위치로 가기, 다시한번하면 위치 표시 삭제(진짜 편함)
Alt+W/p : split기능인데 요거 재미있습니다. 해보시면 어떤기능인지 알수 있습니다.
ALT+ F8 : 문맥정렬

이것 외에도 많을꺼지만 일단 한번이라도 쓰는것을 정리했습니다.
같은 기능도 쓰는사람마다 더 기발하고 편리하게 씁니다.
각자 스타일에 맞게 응용해서 쓰면 되겠습니다.
이해가 안되는 사용법이나 질문이 있으면 메일주시면 수정해놓겠습니다.
새로운게 생기면 업데이트하도록 하겠습니다.

p.s
써놓고 확인해보니 정열이 엉망이네요
복사하셔서 불필요한말 빼고 정리해서 보세요.




추가...++;
----------------------------------------------------
ALT+ F8 : 문맥정렬
----------------------------------------------------
Ctrl+D : Find 창으로 커서 이동
Ctrl+F3 : 커서위치 단어가 Find 창에 쓰여짐
----------------------------------------------------
Ctrl+Space : 자동완성(유용한 기능)
Ctrl + t : type info
Ctrl+shift+space: parameter info
Ctrl+Alt+t : list members
----------------------------------------------------
Posted by 장안동베짱e :



CJ택배(xxx-yyy-zzzz)
http://www.cjgls.com/contents/gls/gls004/gls004_06_01_detail.asp?slipno=xxxyyyzzzz


한진택배(xxx-yyy-zzzz)
http://www.hanjinexpress.hanjin.net/customer/plsql/hddcw07.result?wbl_num=xxxyyyzzzz


로젠 택배(xxxxxxxxxx)
http://www.ilogen.com/customer/reserve_03_detail.asp?f_slipno=xxxxxxxxxx


옐로우캡(xxxxxxxxxx)
http://yellowcap.bizeye.co.kr/search.asp?slipno=xxxxxxxxxx


대한통운(xxxxxxxxxx)
http://www.doortodoor.co.kr/servlets/cmnChnnel?tc=dtd.cmn.command.c03condiCrg01Cmd&invc_no=xxxxxxxxxx


아주택배(xx-yyyy-zzzz)
http://www.ajuthankyou.com:8080/jsp/expr1/expr_view.jsp?sheetno1=xx&sheetno2=yyyy&sheetno3=zzzz
Posted by 장안동베짱e :

이런 메시지가 뜨면 프로젝트를 닫고

프로젝트명.ncd를 지워 준뒤

다시 프로젝트를 열면 되더라..


흠..



아니면 클래스 선언부를 주석 처리했다가 다시 풀어보던가..
Posted by 장안동베짱e :
************
시작 부분..
************
hey yo!
당신의 눈물이
음악이 될수 있다면
그 음악의 선율은 Gloomy sunday
yo.. 나의 시를읊네..





************
끝부분...
************
A yo 아직도 못다한 이야기들을
한편의 시로 담아 당신에게로 읊네
나의 mind 나의 (영어로 뭐라고 하는데 못알아 듣겠음..)
아직도 못다한 이야기들을 담아
당신의 목소리에 나의 귀가 멀었네
(..어느나라 말인지도 모르게 또 뭐라고 떠듬..)
Posted by 장안동베짱e :
〈INPUT TYPE=text style="background-image: url(이미지주소);" name=q size=31 maxlength=255 value=""〉


===============================================================================
COLOR:색명또는 RGB 값 ⇒버튼이나 텍스트 상자에 나타나는 글자 색깔을 지정
background-color:배경색 이름 ⇒버튼의 색깔이나 텍스트의 배경색을 지정합니다.
border-width:수치px ⇒버튼이나 텍스트 상자의 바깥 테두리 두께 지정
border-color:색 값 ⇒테두리의 색깔을 지정
rows="수치" ⇒텍스트 상자의 칸(줄) 수
background-image:url('이미지 URL') ⇒배경으로 이미지를 입력할 경우의 속성
Posted by 장안동베짱e :
invalid-file

(php파일은 업로드가 안돼서.. 압축해서 넣어놨음..)



$tomail = "mail@carrotboy.net";
$from = "보낸사람이름";
$frommail = "mail@carrotboy.net" ;
$html = false;
$subject="제목";

이부분을 수정해서 사용하세요.
Posted by 장안동베짱e :
 이전 1 ··· 12 13 14 15 16  다음