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

  1. 2005.02.10 캐럿보이넷 :: [뉴스] '학·석사 통합' 2학기부터 도입, 석사 1년 먼저 딴다
  2. 2005.02.10 캐럿보이넷 :: [뉴스] 강원대 첫 '석사 학위 없는 박사' 배출
  3. 2005.02.10 캐럿보이넷 :: [뉴스] 삼성 "이공계 전공성적 좋으면 가산점"
  4. 2005.02.10 캐럿보이넷 :: 이성이 본 섹시한 신체부위와 옷차림
  5. 2005.02.08 캐럿보이넷 :: Weekend(Guitar Sound), 슈퍼마리오 일렉기타버젼
  6. 2005.02.08 캐럿보이넷 :: 이번에 설 끝나고 살것들.. 3
  7. 2005.02.08 캐럿보이넷 :: 우울하면 기타를 잡아라 2
  8. 2005.02.08 캐럿보이넷 :: 영어 채팅용어 몇가지.
  9. 2005.02.04 캐럿보이넷 :: 스트링을 char형 배열에 넣기 2
  10. 2005.02.04 캐럿보이넷 :: String table 리소스 사용하기
  11. 2005.02.03 캐럿보이넷 :: DLL의 모든 것
  12. 2005.02.02 캐럿보이넷 :: 테터툴즈 수정
  13. 2005.01.31 캐럿보이넷 :: 부팅시디 만들기
  14. 2005.01.30 캐럿보이넷 :: 학교 대사전
  15. 2005.01.29 캐럿보이넷 :: 이메이징 테스트 2
  16. 2005.01.29 캐럿보이넷 :: 웹에서 메시지 박스 띄우고 페이지 이동
  17. 2005.01.20 캐럿보이넷 :: 윈도우즈 필수패치 4가지
  18. 2005.01.19 캐럿보이넷 :: LIVECD-HowTo 1
  19. 2005.01.19 캐럿보이넷 :: 버그 없는 깨끗한 프로그램 만들기
  20. 2005.01.13 캐럿보이넷 :: 화면 번쩍임 없애기 3
  21. 2005.01.12 캐럿보이넷 :: [뉴스]노래가사 홈피에 올려도 저작권위반 1
  22. 2005.01.12 캐럿보이넷 :: 운동 않고 게으른 사람이 장수한다
  23. 2005.01.08 캐럿보이넷 :: 요즘.. 2
  24. 2005.01.06 캐럿보이넷 :: Shock DLL Info v1.5
  25. 2005.01.06 캐럿보이넷 :: [cpu-z 1.26] CPU 정보 분석
  26. 2005.01.06 캐럿보이넷 :: [데스크칼럼] 경쟁상대는 세계다 이 바보야
  27. 2005.01.06 캐럿보이넷 :: [뉴스]19세 컴퓨터 천재 빌 게이츠 왕국 넘봐 2
  28. 2005.01.05 캐럿보이넷 :: 각 데이터타입별 최대값, 최소값 2
  29. 2004.12.30 캐럿보이넷 :: 실행시간 계산하는 코드..
  30. 2004.12.15 캐럿보이넷 :: 대한민국 언론 화이팅~!
출처 : http://news.naver.com/news/read.php?mode=LSS2D&office_id=038&article_id=0000268966§ion_id=102§ion_id2=250&menu_id=102

이르면 2학기부터 4년제 대학 신입생 및 재학생은 학교에 설치된 학ㆍ석사 통합과정을 신청해 이수할 수 있다. 이렇게 되면 양 과정을 합친 기간보다 1년 먼저 석사학위를 딸 수 있게 된다. 교육인적자원부는 10일 “고등교육법 개정안이 지난 7일 국무회의에서 의결돼 국회에서 통과되는대로 시행할 계획”이라고 밝혔다.

개정안에 따르면 학부과정 4년, 대학원 과정 2년인 전공은 대학 입학 후 5년 내에, 학부과정이 5년인 건축은 6년, 학부과정이 6년인 의학은 7년만에 석사학위 취득이 가능토록 했다. 현행 고등교육법은 ‘학사 4년 이상, 석사 2년 이상’ 등으로 각 과정 수업연한을 따로 규정하고 있어 대학이 학사와 석사가 연계된 교육과정의 효율적인 운영이 불가능했다.

개정안은 또 학ㆍ석사 통합과정을 마치고 학칙이 정하는 요건을 충족하면 석사학위를 취득할 수 있도록 하되 중도 탈락해 학사학위 취득조건만 만족시킬 경우 학사학위만 수여토록 했다.

교육부 관계자는 “학ㆍ석사 통합과정이 운영되면 우수학생의 대학원 진학, 교육과정에 대한 학생만족도가 높아지고, 전공교육의 연속성이 확대되는 등 가시적 효과가 나타날 것”이라고 기대했다. 그러나 일각에서는 이 제도가 우수학생들의 타 대학 석사과정 진학을 막거나 이미 시행중인 의대와 일부 공과대학 등의 석ㆍ박사과정과 충돌하는 부작용을 우려하는 목소리도 적지않다.

김진각 기자 kimjg@hk.co.kr
Posted by 장안동베짱e :
출처 : http://news.naver.com/news/read.php?mode=LSS2D&office_id=001&article_id=0000905028§ion_id=102§ion_id2=250&menu_id=102

(춘천=연합뉴스) 고미혜 기자 = 석사 학위 없이 8학기 만에 바로 박사 학위를 취득하는 석.박사 통합과정 졸업생이 강원대학교에서 처음으로 탄생했다.

오는 22일 강원대 학위수여식에서 박사 학위를 받는 대학원 생화학과의 민정기(31)씨는 강원대 석.박사 통합과정의 첫 졸업생.

민씨는 2001년 이 대학 생화학부를 졸업한 후 "어차피 박사 학위까지 취득할 결심이 섰으니 시간을 조금이라도 단축하자"는 생각에 곧바로 석.박사 통합과정에 지원했다.

이번에 '혈관 신생 및 혈관 염증의 유도와 억제에 관한 조절기전'이라는 논문으로 박사 학위를 취득하게 된 민씨는 8학기 동안 외국 저널 등재 논문 6편을 발표하는 성과를 거뒀다.

특히 2003년에는 한국 생화학분자생물학회에서 우수 논문상을 수상하기도 했고 지난 달에는 지도 교수와 함께 한국과학재단 산하 생물학연구정보센터로부터 '한국을 빛내는 사람들'로 선정되기도 했다.

민씨는 "지도 교수님이셨던 권영근.김성완 교수님 덕분에 좀더 빨리 학위를 딸 수 있었던 것 같다"며 "졸업 후 일단 연세대에서 포스트닥 과정을 밟고 전공분야에서 좀더 경험을 쌓은 후 학생들을 가르치고 싶다"고 포부를 밝혔다.

국내에서는 지난 96년 포항공대가 처음으로 도입한 석.박사 통합과정은 강원대에는 지난 2000년 도입됐지만 그해 합격자가 나오지 않아 이듬해 유일하게 합격한 민씨가 이 대학 석.박사 통합과정의 첫 졸업생이 됐다.
Posted by 장안동베짱e :
출처 : http://news.naver.com/news/read.php?mode=LSS2D&office_id=038&article_id=0000268926§ion_id=101§ion_id2=261&menu_id=101

삼성그룹이 이공계 대졸 신입사원 1차 서류심사 때 전공성적이 우수한 응시자에게 가점을 주는 방안을 추진중이다.

삼성은 올 하반기 삼성전자의 연구개발 및 기술 직군을 중심으로 ‘이공계 전공 우수자 가점제’를 실시한 뒤 다른 계열사로 확대할 방침인 것으로 10일 알려졌다. 이는 지난해 말 정보통신부와 11개 대학 공대 학장, 삼성전자 등 9개 주요 기업이 이공계 대학생들의 전공역량을 강화하는 방안을 협의한 뒤 나온 것이다.

삼성 관계자는 “지난해 하반기 삼성전자 이공계 신입사원 채용 과정을 분석한 결과 전공과목 평점이 높거나 전공 이수학점이 많을수록 면접 성적도 우수했다”며 “전공성적 우수자 뿐만 아니라 전공과목 이수학점이 높은 응시생에게도 가점을 주는 방안이 검토되고 있다”고 말했다.

지난해 하반기 삼성 공채에는 5,000명 모집에 5만5,000여명이 응시해 11 대1의 경쟁률을 기록했으며, 2만여명이 1차 서류심사에서 탈락했다.


김동국 기자 dkkim@hk.co.kr
Posted by 장안동베짱e :
출처 : http://news.naver.com/news/read.php?mode=LSS2D&office_id=001&article_id=0000908465§ion_id=103§ion_id2=245&menu_id=103

(부산=연합뉴스) 민영규 기자 = 나의 신체부위중 어디가 가장 섹시해보이고 가장 섹시해보이려면 옷을 어떻게 입어야 할까?
10일 경성대 의상학과 이정민씨의 석사학위 논문 `섹시한 신체부위와 섹시디자인의 인지도에 관한 성별 비교'에 따르면 부산에 거주하는 성인 여성 303명은 남성의 가슴이 가장 섹시하게 느껴진다며 5점 만점에 3.73을 부여했다.

여성 응답자들은 이어 남성의 어깨선(3.50), 팔(3.42), 등(3.41)의 순으로 섹시함을 느낀다고 응답했다.

여성의 섹시한 신체부위에 대한 설문에 응한 부산지역 성인 남성 265명도 여성과 마찬가지로 가슴(4.34)을 으뜸으로 꼽았으며 다음으로는 허리선(3.99)과 엉덩이 옆선(3.62), 다리(3.73)순으로 높은 점수를 줬다.

남성의 옷차림에 대한 설문조사에서 여성들은 니트(3.50)를 입었을 때 가장 섹시하다고 느꼈고, 단추가 열린 셔츠(3.42)와 민소매(3.30), 찢어진 청바지(3.15) 등이 뒤를 이었으며 타이트한 상의(3.14)도 섹시한 옷차림으로 지목했다.

반면 여성의 옷차림에 대해 남성들은 미니스커트나 핫팬츠(4.06)에 가장 높은 점수를 줬고, 다음으로는 옆부분이 트인 스커트(4.05)와 속이 비치는 상의(3.77), 가슴이 드러나게 만든 웃옷이나 어깨부분이 끈으로 된 원피스(3.74)를 들었다.

섹시한 색상에 대한 설문조사에서 남성은 빨강색(3.69)과 검정색(3.52), 흰색(3.49)순으로 높은 점수를 부여했고, 여성은 검정색(3.99)과 와인색(3.70), 빨강색(3.64)순으로 섹시한 느낌을 받는다고 응답했다.

이씨는 논문에서 "섹시하다고 느끼는 신체부위와 그 부위를 강조하는 의상사이에 밀접한 관계가 있는 것으로 나타났다"면서 "남성이 여성보다 속이 비치는 옷차림이나 타이트한 복장에 섹시함을 더 많이 느끼는 경향이 있다"고 설명했다.

youngkyu@yna.co.kr (끝)
Posted by 장안동베짱e :
출처 : 不褪之昏彬、( http://blog.naver.com/intokira )




Posted by 장안동베짱e :
물론 지금 살돈 있다;

설때 돈 긁어모아서 살거라는 생각따윈 하지도 않는다;;

단지 명절이라 지금 주문하면 물품분실우려가 있지 않을까 싶어서..

(난 어른이야~ ㅡㅡ;; )



음을 더 뽀대나게 해줄 앰~프~!!


케이스가 프라스틱 사출이 아닌 나무케이스라 미니 앰프임에도 가장 좋은 사운드를 내주고 있습니다.

여러 미니앰프중 최고라 말할 수 있습니다.





빈티지 타입의 디자인으로, 노브도 빈티지 노브를 사용하였습니다.



3W POWER,GAIN & TONE CONTROL,CLEAN & OVERDRIVE SWITCH

3 1/2" SPEAKER

WOOD CABINET

H,160mm x D,95mm x W,190MM







음을 더욱 정확하게 튜닝해줄 튜너~
내가 절~대~음~감~이 아니기에ㅋ; 하나 사야겠다.
이것보다 싸고, 평 좋은거 있었는데, 품절이다ㅠ


KORG Gutar/Bass Auto Tuner GA-30

코르그의 기타, 베이스 튜너 GA-30은 튜너 GA-20의 업그레이드 버젼입니다.
디자인부터 산뜻하게 업그레이드 되었으며 기존의 GA-20의 단점이었던 건전지 교체시 뒤
커버가 잘 열리지 않았던 점을 매우 쉽게 커버가 열리도록 보완하였으며,
내장된 마이크의 감도가 매우 뛰어나 튜닝하려는 악기와 튜닝기의 거리가 멀어도 튜너가
민감하게 반응하여 쉽게 튜닝이 가능합니다.
또한 기존에 GA-20에는 없었던 피치파이프와 소형 스피커가 내장되어 튜닝하려는 음을
직접 들으면서 보다 쉽고 빠르게 튜닝을 하실 수 있습니다.
이 제품은 오토매틱 기타 베이스 튜너로 사용이 매우 간편합니다.

그럼 GA-30에 대해 자세히 알아보도록 하겠습니다.

1. Power Switch : 파워를 On/Off 할 수 있는 스위치 입니다.
2. Input : 기타와 연결되는 잭을 꼽는 단자입니다.
3. Display 액정화면 :
이 액정화면의 왼쪽 상단에는 튜닝하고 있는 줄의 번호와 음정이 표시되며, 그 바로 옆에는
반음식 내려 튜닝시에 플랫 표시를 나타내어 줍니다. 기타 튜닝시에는 액정의 오른쪽상단에
GUTAR 라고 표시되도록 GUTAR/BASS 버튼을 눌러 설정하시고 베이스 튜닝시에는 BASS 라고
표시되도록 같은 버튼을 눌로 설정하시고 튜닝하시면 됩니다.
4.GUTAR/BASS 스위치 :
기타 튜닝시에는 액정의 오른쪽상단에 GUTAR 라고 표시되도록 GUTAR/BASS 버튼을 눌러
설정하시고 베이스 튜닝시에는 BASS 라고 표시되도록 같은 버튼을 눌로 설정하시고
튜닝하시면 됩니다.
5. FLAT 스위치 :
스위치를 한번 누를때 마다 반음씩 내려 튜닝이 가능하며 2음 반까지 음을 내려 튜닝하실
수 있습니다.
6. SOUND 스위치 :
튜닝을 하려는 각 음마다 사운드를 출력하여 주며, 여기서 다시 FLAT 스위치를 누르면
반음씩 낮아지는 음까지도 사운드를 출력하여 줍니다. 이는 기존의 튜너에서는 볼 수
없었던 기능입니다.
7. MIC :
내장되어 있는 마이크로 잭을 꼽지 않아도 튜닝을 할 수 있으며 감도가 매우 좋아 악기와의
거리가 멀어도 민감하게 반음하여 어쿠스틱 기타의 튜닝시에 매우 효과적입니다.
8. Speaker : 내장된 피치 파이프의 소리를 출력해 주는 역할을 합니다.
9. Tuning guide LED :
튜너의 왼쪽 상단에 위치한 LED 램프로 튜닝하려는 음보다 낮으면 b램프가 켜지고 높으면
#램프가 켜지며, 정튜닝이 되면 가운데의 녹색 LED 램프가 켜집니다.
# 건전지 AAA 2개가 포함되어 있습니다.

제품 상세 스펙

Tuning: 12 note equal-tempered Detection
range: 23.12Hz - 1975.54Hz
Guitar Reference tone: 7B-6E-5A-4D-3G-2B-1E
Bass Reference tone: LB-4E-3A-2D-1G-HC
Built-in Speaker
Tuning modes: Meter (auto guitar/bass) and Sound (auto guitar/bass)
Flat tuning: 1 - 5 semitones "Quinta Flat"
Tuning accuracy: +/-1cent
Sound accuracy:+/-1.5cent
Connection jack: Input jack (1/4" mono)
Power supply: Two AAA batteries 3V
Battery life: Approximately 100 hours
Dimensions: 4.1"(104mm) Wide x 2.52"(64mm) Deep x 0.6(15mm) High
Weight: 2.86 oz (81g) (Including batteries)
Included items: Owner's Manual, (2)AAA batteries


이건 심심할때 한옥타브 높여 칠려고..
왠지 고음이 더 뽀대 나는 것 같아,,,ㅎㅎ


★ Gyser Flat Capo
* Acoustic, Electric 기타에 사용 가능합니다.
* 빠르고 쉽게 부착 할 수 있습니다.
* 위, 아래 어느 플렛에도 부착이 가능합니다.

Capo 제대로 사용하기
먼저 카포는 카포타스토(Capotasto)의 준말로 기타의 여섯줄을 눌러 코드 전체의
음정을 조절할 수 있도록 도와주는 기구입니다.

카포의 종류에는 고무줄식, 용수철식, 나사식, 지랫대식, 집게식이 있는데 이중에
집게식이 제일 무난하고 사용하기도 편합니다.

카포는 사용하는 플랫만큼 음정이 올가가게 되는데, 기타는 한 플랫이반음이므로
카포를 2플랫에 설치하고 C코드를 잡게되면 D코드의 소리가 나게 됩니다.

카포는 운지가 어려운 Gm코드, Eb같은 코드가 나올경우 카포를 3째칸에 설치하고
Gm코드는 Em코드로 운지하고 Eb코드는 C코드로 운지하면 코드의 누르는 폼은
바뀌었지만 코드의 음정은 바뀌지 않게 됩니다.

이밖에도 카포는 자신이 부르고자 하는 노래가 높거나 너무 낮아서 부르기가 곤란한
경우, 카포를 사용하면 쉽게 자신의 음정에 맞는 음역대로 바꿀수가 있습니다.

몇 가지 예를 보면 자신의 음역대가 부르고 싶은 노래에 비해 많이 낮을때는 3~6번
플랫에 카포를 사용하고 조금 낮을때는 1~3번플랫에 사용해서 노래할수 있습니다.

그리고 이와 반대로 노래가 너무 높을때는 1~3번플랫에 사용하고 조금 높을때는
3~6번플랫에 사용하여 노래를 부를수 있습니다.

이밖에 카포를 이용해서 2대의 기타가 서로 듀엣을 하고자 할때 한 기타는 낮은
포지션과 나머지 다른 기타는 높은 포지션에서 연주하면 멋진 화음을 만들어 낼수
있습니다.
Posted by 장안동베짱e :

근호 님의 말 :
 므시또 그래 우울하노
[**] 우울,우울,우울, 님의 말 :
 흠.;
[**] 우울,우울,우울, 님의 말 :
 그냥 사는게 우울하죠
근호 님의 말 :
 ㅋㅋㅋ
근호 님의 말 :
 글루미 에브리데이 ;;
[**] 우울,우울,우울, 님의 말 :
 ㅎㅎ
근호 님의 말 :
 우울하면 기타를 잡아라
근호 님의 말 :
 흐흐흐
근호 님의 말 :
 파워코드 잡고 막 갈기면 존내 시원해진다 ;;


기타를 잡아야겠다. 저말 들으니, 뮤지션의 피가 끓어 오른다..

근데.. 아직 코드 잡는것도 너무 어렵다...ㅠ




Posted by 장안동베짱e :
afk: 잠수중(Away from keyboard)
그리고 무엇을 할지는 아무도 모른다.

bak: 돌아왔음(Back at keyboard)
무엇을 하다 왔는지는 아무도 모른다.

bfn: 잠시 실례(Bye for now)
사람들에게 얼마 후가 될지는 모르지만 한동안 나가있겠다고 알린다.

응용: b4n((Bye for now), bbl(be back later: 나중에 올께)

brb: 금방 돌아올께(Be right back)
잠깐 동안 나갔다 오겠다고 알린다. 잠시 멈춰 셰익스피어의 소네트(14행으로 이뤄진 유럽 서정시)라도 읽으려는 것처럼 말이다.

cu: 안녕히(See you)

cya(see ya: 안녕)의 격식 차린 표현

ltns: 오랜만이다(long time, no see)

ifuee(I forgot you even existed: 너 살아있었구나)의 정중한 표현이다.

ttfn: 잠깐 빠빠(Ta ta for now)

여배우 자자 게이버가 대화방을 나가면서 했을 법한 표현이다.

응용: l8tr(later: 안녕)

[격한 감정 표현들]

gal: 똑바로 살어(Get a life)

hand(have a nice day; 좋은 하루 되세요)와 정확히 반대되는 표현이다.

kiss: 좀 작작해라, 이 바보야(keep it simple, stupid)

ot(off topic; 주제에서 벗어났군요)의 무례한 표현

pu: 그거 엉망이네(That stinks)

tswc: 관심 있는 사람한테나 말해요(tell someone who cares)

[웃음을 뜻하는 표현들]

gfete: 씨익 웃다(Grinning from ear to ear)
이를 드러내며 가볍게 웃는 모습을 표현한다.

lmao: 배꼽 빠지게 웃다(Laughing my ankles off)

배꼽 대신 다른 신체 부위를 집어넣어도 좋다.

lol: 큰소리로 웃다(Laughing out loud)

일반적으로 재미있는 말에 대해 적당한 표현이다. 안타깝게도 매우 사랑함(lots of love)을 의미하지는 않는다.

rotfl: 바닥을 구르며 웃다(Rolling on the floor laughing)

너무너무 재미있을 때 이 표현을 사용한다. 물론 rotflmao(바닥을 구르며 웃다가 배꼽이 빠진다)는 표현도 가능하긴 하다.

[의견이나 정보를 전달할 때]
aamof: 사실상(As a matter of fact)
그러나 사이버 공간에서는 사실이 허구가 될 수도 있다.

afaik: 내가 아는 바로는(As far as I know)
사실 잘 모르지만 아는 척 하고 싶을 때 이 표현을 사용한다.

응용: afaic(as far as I'm concerned: 내가 보기에는), afaist(as far as I can tell: 내 생각에는)

btw: 말이 났으니 말인데(By the way)

fyi(for your information: 그냥 알아둬)와 fwiw(for what is worth: 내 나름대로)의 사촌격. damhikt: 이걸 어떻게 아는지 묻지 말아줘(Don't ask me how I know this)

[친구가 캐물을 때]

eod: 논의 끝(End of discussion)

대화방에서 '스타워즈' 신작 예고편에 관해 끝없이 이야기가 오고갈 때 EOD를 사용해라.

hth: 도움이 되면 좋겠다(Hope this (or that) helps)

imho: 내 변변찮은(혹은 솔직한) 생각으로는(In my humble (or honest) opinion)

"내가 너라면 시시한 네 여자 친구 따위는 당장 차버리겠다" 같이 구하지도 않은 조언을 할 때 이 표현을 사용하라.

응용: imnsho(in my not so humble opinion: 내 변변한 생각에는), imco(in my considered opinion: 사려 깊은 내 생각으로는)

inanalb: 난 변호사가 아니야, 하지만...(I am not a lawyer, but...)

"IANALB, TV에서 변호사로 나와"라고 사용할 수 있다.

j/k: 농담이야(Just kidding)

:)과 함께 쓰이면 아주 좋다. 더 많은 이모티콘 세계를 구경하려면 '에브리데이 이모티콘'를 참고하라.

ot: 주제에서 벗어났다(Off topic)

kiss(keep it simple, stupid: 작작 좀 해라 이 바보야)의 공손한 표현

otoh: 또 한편으로는(On the other hand)
이 표현을 사용하면 당신이 한때 고등학교 토론반에 몸 담았다는 것을 의미한다. 재미있는 약어들

aiamu: 그리고 난 원숭이 삼촌이다(And I'm a monkey's uncle)
원숭이를 이용한 비방은 어디에서나 인기가 있다. 사이버 공간에서도 예외는 아니다.

bbfbm: 피셔(완구회사)가 만든 몸에 마텔(완구회사)이 만든 머리(Body by Fisher, brains by Mattel)
다시 말해서 '너는 통카 장난감 트럭 같은 몸에 바비 인형 같은 머리를 가졌군' 이란 뜻이다.

cmf: 내 손가락 수를 세어봐(Count my fingers)
비슷한 표현에는 rml(read my lips: 잘 들어봐)나 tmt(tally my toes: 내 발가락 수를 합해 봐)가 있다.

dgt: 거기 가지 마라(Don't go there)
이 말은 눈썹을 찌푸리고 한손을 엉덩이에 걸친 채 다른 손 집게 손가락을 흔들면서 말해야 한다. 그러나 사이버 공간 속에서 상대방은 이런 모습을 상상만 해야 할 것이다.

dqydj: 하던 일이나 계속 해(Don't quit your day job)
아니면 드라마 '소프라노스'에 나온 대로 'fagiddaboudit(됐어)'라고 할 수도 있겠다.

tmi: 그런 것은 알고 싶지 않아(Too much information)
"우리 개는 고양이가 토해낸 털뭉치 먹기를 좋아해요"라고 말하는 사람에게 적절한 대답이다.
Posted by 장안동베짱e :
엄청 자주 써먹는 기능인데 잘 잊어 버려서...흠흠..


[CODE] CString str("흐흠.."); char charArr[SIZE]; // 요기 // 이근호님께서 잘못될 수도 있는 부분을 지적해주셨음ㅋ strncpy(charArr, (LPCTSTR)(LPSTR)str, SIZE<str.length()?SIZE:str.length()); [/CODE]
Posted by 장안동베짱e :

[CODE]char msg[BUFERSIZE];[/CODE]
//LoadString(핸들, 리소스ID, msg, BUFFERSIZE);
[CODE]LoadString(GetModuleHandle(NULL), IDS_STRING1, msg, MAX_PATH); printf(buff);[/CODE]
Posted by 장안동베짱e :
출처 : http://blog.naver.com/xinfra.do?Redirect=Log&logNo=80008191117

Win32 아키텍처 완전 해부 ?
DLL의 모든 것
이번 호에서는 DLL에 관한 전반적인 내용을 살펴보기로 한다. DLL을 사용하기 위해 알아야 할 일반적인 내용과 DLL의 생성 및 사용법을 알아보고, 필자가 코딩한 FTP 프로그램을 통해 어떻게 DLL을 exe 프로그램에서 사용할 수 있는지 살펴보겠다.

마이크로소프트의 윈도우 오퍼레이팅 시스템을 사용하는 사람이라면 DLL, 즉 Dynamic Linking Library를 모르는 사람이 거의 없을 것이다. 필자가 사용하는 윈도우 NT 4.0의 winnt\system32 및 winnt\system 디렉토리에는 200개가 넘는 DLL이 있으며, 윈도우 98 윈도우 디렉토리에 자그마치 450여 개의 DLL들이 있다. 물론 윈도우에서 DLL을 사용하는 응용프로그램들의 종류에 따라 차이가 있겠지만 우리가 사용하는 DLL의 수는 이보다 많을 수도 있다. 이렇게 많은 수의 DLL을 사용하고 있지만 정작 DLL에 대해 충분한 지식을 가진 사람은 그리 많지 않다.
이 글을 통해 어떻게 하나의 DLL이 생성되는지, 그리고 라이브러리 파일(.LIB) 및 실행파일 (.EXE)과는 어떻게 연동되는지에 대한 구체적인 내용을 살펴보겠다. 이것은 DLL과 실행 파일의 개발자, 테스터, 시스템 관리자, 윈도우 32 플랫폼 사용자 등 모든 윈도우 사용자에게 필요한 도움을 줄 것으로 생각한다. 이 글을 통해 윈도우에서 사용되는 DLL의 개발 과정, 윈도우 실행 프로그램과의 연동을 비롯하여 DLL에 관한 제반 사항들을 이해하게 될 것이다. 여기서는 DLL의 개념과 장점, 자원공유, DLL의 사용법 등 DLL을 사용하는데 알아야 할 일반적인 내용을 살펴보겠다.

DLL의 정의와 사용법
흔히 말하는 DLL이란 실행파일이 요구하는 함수, 변수, 또는 데이터를 담고 있는 프로그램을 의미한다. 보통 윈도우 32 플랫폼과 같은 프로세스 내에 존재하는 실행 프로그램의 필요에 따라 동적으로 사용되도록 하는데 그 목적이 있다. DLL은 흔히 같은 시스템 내에 존재하기 마련이지만 COM DLL과 같이 COM 클라이언트를 위해 만들어진 DLL도 있다. 어느 DLL이나 그 개념은 동일하므로 여기서는 윈도우 32 환경에서 사용되는 일반적인 DLL에 초점을 맞추어 설명하도록 하겠다. DLL은 공통된 프로그램만 하나의 파일 형태로 묶어 놓았으므로 사용할 때 다음과 같은 여러 이점이 있다.

·공통 프로그램은 다시 코딩할 필요가 없으므로 개발자의 개발 시간을 단축한다.
·해당 exe 파일의 크기가 축소되므로 하드디스크를 보다 효율적으로 사용할 수 있다.
·같은 프로세스 내에서는 동일한 DLL을 여러 번 메모리에 올리지 않아도 되므로 시스템의 메모리를 절약할 수 있다.

DLL과 자원 공유
DLL을 사용할 때 비록 같은 시스템이라도 다른 프로세스에 의해 사용되면 같은 DLL이 여러 번 메모리에 올라가게 된다. 윈도우 32는 다중 프로세스 환경을 지원하는데, 이는 여러 프로세스가 하나의 시스템에서 작동할 수 있음을 의미한다. 이 때 각 프로세스는 자신만의 가상 메모리 영역을 차지하게 되며 특별한 코딩 없이는 프로세스간의 메모리 영역은 침범할 수 없도록 되어 있다.
따라서 윈도우 32 환경에서 DLL이 필요한 어느 한 실행 프로그램을 사용자가 두 번 실행했다면 두 개의 프로세스가 생성되며, 각 프로세스는 자신의 가상 메모리 영역 내에서 같은 DLL을 따로따로 자신의 메모리 영역에 올리게 된다. 또한 DLL은 새로운 윈도우를 생성하지 않고 메시지 처리에 관한 코딩을 하지 않는다. 이 두 가지 작업은 모두 사용자 윈도우에서 처리해야 할 사항들이다.
윈도우에서 없어서는 안될 중요한 DLL 세 개를 꼽는다면 Kernel32.dll, user32.dll, 그리고 gdi32.dll이다. Kernel32.dll은 윈도우 파일 시스템, 메모리 관리 등에 관련된 기능을 가지고 있으며, user32.dll은 사용자 인터페이스와 관련된 함수를, 그리고 gdi32.dll은 그래픽에 필요한 제반 함수를 담고 있다.
다음에 나열된 .LIB 파일들은 필자가 본 글과 관련된 예제 프로그램을 링크하기 위해 사용한 DLL의 이름이다. 이들 중 wininet.lib를 제외한 모든 프로그램들은 Visual C++의 Win32로 링크하는 경우 기본적으로 따라오는 라이브러리들이다. wininet.lib을 제외한 다른 모든 .lib 파일들은 Visual C++에서 윈도우 32 프로그램을 만들 때 기본적으로 포함되는 DLL들을 사용할 수 있게 해주며, wininet.lib은 인터넷 서비스를 담고 있는 DLL을 사용할 수 있게 해 준다.

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
odbc32.lib odbccp32.lib wininet.lib
물론 여기의 링크 리스트에 포함되었다고 해서 이들 DLL이나 DLL에 포함되어 있는 함수들을 사용할 수 있는 것은 아니다. 이들 함수를 사용하기 위한 환경을 만들어 주는 적절한 헤더파일과 이에 해당하는 DLL 파일들이 제 위치에 존재하고 있어야 한다.
예를 들어 kernel32.lib에서 제공되는 함수들은 윈도우 NT 4.0의 경우 681개이다. 여기에는 LoadLibraryA, LoadLibraryExA, LoadLibrary ExW, LoadLibrar yW 등을 포함한 수많은 함수가 제공되고 있다.
앞으로 나오게 될 LoadLibrary를 예로 들어보자. LoadLibrary를 사용하기 위해서는 이 함수를 담고 있는 DLL, 즉 Kernel32.dll이 우선 시스템 내에 존재하고 있어야 하며 Kernel32.dll을 가리키는 Kernel32.lib 파일이 또한 존재해야 한다. 그리고 이 DLL을 사용하는데 필요한 준비를 하기 위해 헤더파일을 소스 프로그램에 첨부하여 컴파일하고 링크해야 비로소 알맞은 버전의 LoadLibrary를 시스템에서 사용할 수 있게 된다.
이렇게 한번 메모리에 적재된 DLL은 같은 프로세스 내의 어떠한 exe 파일에서도 접근이 가능하며 자유롭게 사용할 수 있다. DLL에 내장된 이런 함수들은 시스템의 여러 다른 프로그램들에 의해 계속 사용되며, 사용이 끝나면 프로세스의 메모리에서 삭제되어 시스템으로 자원을 환원하므로 불필요한 자원의 사용을 피하게 된다.

프로그램에서 DLL 사용하기
DLL을 우리가 만드는 exe 프로그램에서 사용하기 위해서는 우선 DLL 코드를 메모리에 적재 또는 매핑해야 하는데, 여기에는 implicit와 explicit의 두 가지 방법이 있다. implicit은 본 예제 프로그램과 같이 DLL에 내장된 함수를 exe 프로그램에서 그냥 사용하는 것이며, explicit은 LoadLibrary나 LoadLibraryEx를 사용하여 프로그래머가 직접 메모리에 올려주는 방법이다. 어떤 방법을 사용하든지 해당 DLL을 필요한 시기에 메모리로 올려주며 사용한 DLL의 사용 회수를 증가시킨다는 점에 있어서는 다를 바 없으나 운영에는 다소 차이가 있다.

Implicit Linking
Implicit은 정확하게 표현하면 Implicit 로더 타임 링킹이라 할 수 있는데, 이는 해당 exe 프로그램에서 사용될 DLL 정보를 exe 코딩에 내장하는 방법이다. 이렇게 하면 윈도우가 하나의 exe 파일을 실행할 때 어떤 DLL이 필요한지 알려주어 exe 파일이 착오 없이 실행된다. 이런 상태에서 exe 프로그램이 DLL에 내장된 어느 함수를 부르면 오퍼레이팅 시스템은 해당 함수가 실린 DLL을 정해진 알고리즘에 의해 찾아서 프로세스의 메모리 공유 지역에 적재하여 함수의 사용이 가능하게 된다. Implicit linking을 사용하기 위한 절차는 다음과 같다.

1. 원하는 함수가 적재하고자 하는 DLL에 내장되어 있음을 확인한다.
2. 원하는 함수가 다음과 같은 위치에 존재하고 있음을 확인한다.
·원도우 등록기의 KnownDlls 폴더의 값은 그림 1과 같이 윈도우 등록기의 “/HKEY_LOCAL_MACHINE/System/CurrentControl Set/Control/SessionManager/knownDlls” 폴더에 명시되어 있다.
·exe 실행 파일과 같은 디렉토리
·프로세스의 현재 디렉토리
·윈도우 시스템 디렉토리나 DLL 디렉토리이다. DLL 디렉토리는 보통 %systemRoot%를 의미하며 윈도우 NT 4.0의 경우 이 디렉토리는 위에서 언급한 등록기에 명시되어 있는데, 이 값은 특별히 관리자가 변동시키지 않았다면 WinNT/System32가 된다.
·윈도우 디렉토리이다. 윈도우 NT 4.0의 경우 이 값은 WinNT이다.
·PATH 환경 변수가 가리키는 디렉토리이다. 이 때 필요한 DLL을 항목 2에 명시한 위치의 어느 곳에서도 찾을 수 없다면 시스템은 오류 메시지가 담긴 다이얼로그 박스를 사용자에게 보여주고 해당 프로그램을 완전히 취소하게 된다.
3. 프로그램에서 필요한 함수를 불러 사용한다.
4. 해당 프로세스의 소멸과 함께 DLL 또한 메모리에서 소멸되며 프로그램의 실행이 종결된다.

Explicit Linking
Explicit linking은 Implicit linking에 비해 그 사용이 조금 까다롭지만 원하는 시점에 마음대로 올리고 내릴 수 있다는 점에서 관리가 훨씬 자유롭다. Explicit linking은 LoadLibrary나 LoadLibraryEx에 의해 처리되며, 프로그램에서 이러한 함수들을 호출함과 동시에 알고리즘에 의해 필요한 DLL을 찾은 후 해당 DLL을 프로세스의 메모리에 매핑하여 실행을 위한 준비를 끝낸다. 여기서 사용되는 LoadLibrary는 DLL의 이름을 LPCTSTR 타입의 인자로 받으며, 실행이 성공하면 HINSTANCE를, 실패하면 NULL을 각각 반환한다.
LoadLibrary와 비슷하지만 좀 더 많은 인자를 요구하는 함수가 LoadLibraryEx이다. 이 함수는 DLL이 프로세스의 메모리에 매핑되는 구체적인 방법을 명시하는 dwFlag가 DWORD 형태로 요구된다는 점 이외에는 LoadLib rary와 같은 일을 한다. 즉 LoadLibraryEx를 사용하면 DONT_RESOLVE_DLL_REFERENCES, LOAD_LIBRARY_AS_DATAFILE, 그리고 LOAD_WITH_ALTERED_SEARCH_ PATH와 같은 다양한 방법으로 DLL을 프로세스의 메모리에 매핑할 수 있다.

·DONT_RESOLVE_DLL_REFERENCES : 이 옵션은 윈도우 NT에서만 사용할 수 있으며 DllEntryPoint를 부르지 않을 때 사용한다. DllEntry와 DllExit 코드는 DllMain을 설명할 때 함께 하기로 하고, 지금은 Dll의 Entry Point에서 명시된 코드를 실행하지 않을 때 이 옵션을 사용한다는 것만 이해하도록 하자.
·LOAD_LIBRARY_AS_DATAFILE : 이 옵션은 DLL 파일을 하나의 단순한 데이터 파일로 이해하고 적재하도록 하는데 그 목적이 있다. 실행 코드가 전혀 없는 DLL들은 시스템에서 DLL의 실행을 위한 특별한 준비가 필요하지 않으므로 실행 시간을 절약할 수 있다.
·LOAD_WITH_ALTERED_SEARCH_PATH : 이 옵션을 사용하면 위에서 언급한 DLL을 탐색하는 경로를 LoadLibraryex(LPTCSTR)에 명시된 대로 바꿀 수 있다는 이점이 있으나 아직 필자도 이 옵션은 사용해 보지 않았다.

이렇게 LoadLibrary나 LoadLibraryex로 프로세스의 가상 메모리에 적재된 DLL은 사용이 끝나면 ‘BOOL FreeLibrary (HINSTANCE hInstDll)’을 사용하여 풀어주면 된다. 이상에서 설명한 Implicit linking과 Explicit linking의 과정을 종합하면 그림 2와 같다. DLL은 시스템에서 사용되는 하나의 자원으로서 독립된 카운터를 가진다. DLL이 메모리에 적재될 때, 그리고 사용 후 메모리에서 풀어줄 때 카운터의 값이 이에 따라 바뀌게 된다. 이 때 카운터가 0이면 해당 DLL은 더 이상 사용되지 않으므로 시스템은 자동으로 이 DLL을 메모리에서 삭제하게 된다.


Implicit linking으로 DLL을 사용하고자 할 때는 해당 LIB을 링크 옵션에 더해준 뒤 헤더파일을 소스코드에 포함시키고 원하는 함수를 사용하면 되므로 간단하다. 하지만 Explicit linking으로 DLL을 사용하고자 할 때는 몇 가지 과정이 더 포함되어야 한다. 이에 대한 자세한 내용은 ‘DLL의 생성과 사용’에서 다루어 보기로 하겠다.

DLL의 구현
여기서는 실제 DLL을 구현하는 과정에 대해서 살펴보기로 하겠다.
DLLMain
DllMain은 함수를 DLL을 통하여 export 할 때 적용할 수 있으며, 이 DllMain은 어떤 DLL 프로그램에 있어서 시작점이면서 또한 끝나는 점이기도 하다. 즉 DLL이 사용될 때와 풀어질 때 시스템은 DllMain을 거치도록 되어 있다. DllMain은 프로그래머가 생성해 주지 않을 때는 다음과 같은 기본값이 시스템에 의해 제공되지만, 스레드나 프로세스 레벨에서 DLL의 코드 실행과 관련된 초기화 작업이 필요하면 DllMain의 인자 중 하나인 ‘ul_reason_for_call’을 분석하여 필요한 초기화 작업을 처리해 줄 수 있다.

BOOL WINAPI DllMain (HANDLE hInst,
ULONG ul_reason_for_call,
LPVOID lpReserved)
{
return TRUE;
}
‘ULONG ul_reason_for_call’은 네 개의 옵션을 가지며 다음과 같은 방법으로 사용할 수 있다.

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
switch( ul_reason_for_call ) {
case DLL_PROCESS_ATTACH:
...
case DLL_THREAD_ATTACH:
...
case DLL_THREAD_DETACH:
...
case DLL_PROCESS_DETACH:
...
}
return TRUE;
}
이 코드에서 DllMain의 두 번째 옵션인 ul_reason _for_call을 분석하여 스레드와 프로세스 레벨에서 필요한 초기화 작업을 수행할 수 있다. DLL_PROC ESS_ATTACH 옵션은 새로운 프로세스가 기본 스레드와 함께 생성되면서 DLL을 사용할 때 시스템이 DllMain을 부르기 위한 옵션이다. 따라서 이 옵션은 프로세스 레벨에서 필요한 초기화 작업에 유용하게 사용할 수 있다. 예를 들어 프로세스 레벨에서 정의된 하나의 변수를 해당 프로세스에 속한 모든 스레드가 사용하고자 할 때 같은 변수지만 각 스레드마다 다른 값을 독립적으로 저장하도록 하기 위해 우리는 Thread Local Storage를 사용한다. 이 때 변수는 프로세스 레벨에서 정의되고 그 값은 스레드마다 독립되므로 초기화해 줄 수 있는 좋은 예가 된다. DLL_THRE AD_ATTACH 옵션은 기본 스레드 외에 다른 스레드가 새롭게 생성되어 DLL을 필요로 할 때 시스템이 사용하는 옵션이다. 이 옵션 역시 스레드 레벨에서 초기화하고 싶은 작업을 수행하기에 좋다. DLL_PROCESS_DETACH 및 DLL_THREAD_DETACH는 프로세스와 스레드가 사용 중인 DLL을 그만 사용하고자 할 때 시스템이 DllMain을 부르는 옵션으로 초기화된 데이터나 변수를 원래 값으로 환원할 때 사용한다.
시스템이 exe 실행 파일의 WinMain 직접 부르지 않는 것처럼 DllMain 함수 역시 시스템에서 직접 부르는 것이 아니다. DLL의 Attach 및 Detach 이벤트가 발생하면, 즉 DLL이 프로세스의 가상 메모리에 매핑이 되면 시스템은 dll의 시작을 위해 만들어진 DLL CRT startup 함수를 부른다. 이 DLL CRT 함수는 C Run-Time에 필요한 초기화 작업들을 수행하며, 이 DLL CRT startup code가 DllMain()을 실행하도록 되어 있다. DllMain에서 작업이 끝나면 exit 값을 다시 CRT startup code로 반환하여 DLL의 실행이 끝난다.

DLL의 생성과 사용
DLL 파일은 다른 exe 프로그램에서 사용할 여러 함수를 내장하고 있으며 exe 파일들은 필요한 함수를 DLL에서 불러와서 사용한다. 즉 DLL 파일은 함수를 export하게 되며, exe 파일은 함수를 import하는 방식이 된다. 물론 DLL 함수를 부르는 것이 반드시 exe 프로그램만은 아니다. 하나의 DLL이 또 다른 DLL을 부르는 경우도 많다. 중요한 것은 공유하는 함수를 제공해 주는 것은 export로, DLL에서 제공하는 공유 함수를 가져와서 사용하는 경우는 import라는 개념으로 정의한다는 것이다.
DLL 파일은 필요하다면 DllMain과 다른 여러 가지 함수를 export하기 위해 정의해 주게 되는데, 다음으로 DLL에서 어떻게 함수들을 export하기 위해 준비하는지 알아보도록 하겠다. 심볼 import와 export 테이블에 대한 보다 자세한 내용은 ‘DumpBin으로 WinInet.dll 보기’를 참조하기 바란다.

심볼 export
많은 경우 시스템에서 제공되는 DLL의 함수를 import하여 사용하지만 공통된 기능을 사용하는 여러 가지 프로그램이 포함된 큰 프로젝트를 만들 때는 자체적으로 필요한 함수를 정의하여 DLL 실행 파일로 만들어 export 할 수도 있다. 우선 하나의 함수를 DLL로부터 export하기 위해서는 특별한 정의가 필요한데, 이것이 바로 __declspec (dllexport)이다. 예를 들어 BOOL processData라는 함수를 DLL을 사용하여 다른 DLL이나 exe 파일에서 사용이 가능하도록 export하려면 다음과 같이 정의할 수 있다.

__declspec(dllexport) BOOL processData (DWORD, DWORD);

컴파일러에서 __declspec(dllexport)로 정의된 함수나 변수를 보면 .obj 파일에 특별한 정보를 첨부하여 export를 위한 함수라는 것을 표시한다. 이 정보는 링크로 인해 해당 DLL 파일과 같은 이름의 .LIB 파일을 생성하도록 해준다. 이 때 많은 함수가 DLL 파일로부터 export 되도록 정의되었다면 링크는 export 되는 모든 함수의 이름, 즉 심볼들을 알파벳 순서대로 저장한다. DLL을 만들 때 한 가지 유의할 점은 Visual C++로 만든 DLL의 심볼을 다른 컴파일러로 만든 exe나 DLL에서 export 할 때 심볼 이름의 차이점을 이해하는 일인데, export와 import에서 모두 같은 컴파일러를 사용한다면 걱정할 필요가 없다.
하지만 현재 우리는 다양한 종류의 컴파일러를 사용하고 있으므로 누가, 언제, 어떤 컴파일러로 export된 DLL 함수를 사용하게 될지 알 수 없다. 필자도 그렇게 다양한 컴파일러를 사용하는 편은 아니다. 윈도우 32 프로그램의 컴파일에는 주로 Visual C++와 Borland C++를 사용하고 있으며, 노벨 NLM의 컴파일에는 왓캄이나 코드와리어를 사용한다. 자바를 사용하기는 하지만 주로 JDK 레벨에서 사용하므로 특정 벤더의 자바 컴파일러를 사용하지는 않는다. 그렇다 하더라도 역시 다른 컴파일러에 의해 생성된 심볼의 통일성 문제에서 완전히 자유롭지는 않다. 어떤 이유에서건 하나의 DLL을 export 할 때 우리는 직접 만든 DLL이 어떤 컴파일러에서도 import 되도록 할 필요가 있다.

심볼 import
DLL에서 export 된 심볼을 다른 DLL이나 exe 파일에서 import하여 DLL 함수의 공유가 이루어진다. 하나의 exe 프로그램을 만들 때 지역 변수나 지역 함수들은 우리가 흔히 사용하는 방법대로 필요한 장소에 정의해 주면 된다. 하지만 DLL의 함수나 변수를 사용할 때는 컴파일러에게 특정한 정보를 제공할 필요가 있는데, 이것이 바로 심볼 export에서 사용한 것과 비슷한 방법인 __declspec (dllimport)이다. 따라서 위에서 export한 심볼을 import 하기 위해서는 다음과 같이 정의해 주면 된다.

__declspec(dllimport) BOOL processData (DWORD, DWORD);
컴파일러가 이 코드를 처리하면서 .OBJ 파일에 특별한 정보를 넣어 두는데, 이 정보는 링크가 EXE 파일을 만들 때 어떤 DLL의 함수를 .LIB 파일에서 찾을 수 있는지를 알려주는 역할을 한다. 링크가 .LIB 파일에서 import 심볼들을 발견하면 링크는 이러한 import 심볼들을 exe 파일의 import 심볼 테이블에 삽입하여 링크가 exe 파일을 하드디스크에 쓰기 위한 작업을 마치게 된다. 이렇게 준비된 exe 파일은 import된 심볼을 어떤 DLL에서 export하고 있는지 알고 있으므로 Implicit 또는 Explicit 링크 프로세스에 의해 함수의 사용이 요구되었을 때 해당 DLL을 현재 실행 중인 프로세스의 가상 메모리에 즉시 올릴 수 있게 된다.

DLL 헤더파일 만들기
심볼의 import, export를 위해 헤더파일이 반드시 필요한 것은 아니다. 하지만 import와 export 프로세스를 쉽고, 간편하게 코딩하기 위해 헤더파일을 사용하기도 한다. import 및 export 프로그램에서 정의된 ‘__declspec() ...’를 #include ‘myDll.h’와 같이 간단하게 정의할 수 있다고 해보자. 이렇게 하면 myDll.h 파일을 다음과 같이 만들 수 있다. EXPORTAPI를 DLL 파일에 정의한 후 본 헤더파일을 첨가하여 같은 파일을 import와 export 프로그램 모두에 사용할 수 있다.

#if !defined (EXPORTAPI)
#define EXPORTAPI __declspec(dllimport)
#endif
위의 헤더파일을 사용하기 위해 DLL의 export 파일에 있는 함수들을 #define EXPORTAPI로 정의하고 다음 줄에 #include “myDll.h”를 써주면 된다. import 프로그램에서는 EXPORTAPI를 정의할 필요 없이 바로 #include “myDll.h”를 사용하면 된다. 심볼을 import, export 하기 위해 각 함수를 __declspec(dllimport), 그리고 __declspec(dllexport)으로 정의한다고 언급한 바 있다. 이렇게 헤더파일을 사용하여 하나의 헤더파일을 import와 export 프로그램에 모두 사용할 수 있다. 수정이 필요할 때는 import와 export 모두를 수정할 필요없이 헤더파일 하나만 수정하면 되므로 프로그램의 관리가 용이하다.

DumpBin으로 WinInet.dll 보기
DumpBin.exe 프로그램은 마이크로소프트의 비주얼 C++ 컴파일러와 함께 제공되는 프로그래밍 툴이다. 이 툴은 주로 기존의 DLL에서 제공되는 함수들을 파악하고자 할 때 사용할 수 있고 실행에 필요한 다양한 옵션을 제공하고 있는데, 필자가 DLL DumpBin 실행 결과를 출력하기 위해 사용한 옵션은 다음과 같다.
DumpBin.exe /imports /exports /out:wininet.txt c:\winnt\
system32\wininet.dll
이 명령의 실행 결과로 윈도우의 C:\WinNT\Sys tem32 디렉토리에 위치하는 WinInet.DLL의 import와 export 함수들은 다음과 같다.

Dump of file c:\winnt\system32\wininet.dll
File Type: DLL
Section contains the following Imports
SHLWAPI.dll
70BD75E0 D2 StrCmpNIA
70BD2720 D6 StrCpyNW
. . .
ADVAPI32.dll
77DC208E E9 GetTokenInformation
77DD9815 19C RegOpenKeyA
. . .
KERNEL32.dll
77F0D109 23D ReadFile
77F1B2C1 1D0 IsBadReadPtr
. . .
USER32.dll
77E71BF1 15A GetWindowLongA
77E72575 218 SendMessageA
. . .
Section contains the following Exports for WININET.dll
ordinal hint name
115 0 CommitUrlCacheEntryA (00004C42)
116 1 CommitUrlCacheEntryW (0004F103)
. . .
Summary
3000 .data
4000 .reloc
A000 .rsrc
60000 .text
이 데이터를 살펴보면 import, export, 그리고 summar y 부분으로 크게 나눌 수 있고, import 부분은 다시 DLL 별로 구분되어 해당 DLL로부터 import 되는 모든 함수들을 심볼 주소, 인스턴스 핸들, 그리고 심볼 이름의 순으로 나열되어 있다.
따라서 우리는 WinInet.DLL이 StrCmp NIA, StrCpyNW 등의 함수들을 SHLWAPI.dll로부터, GetTokenInformation, RegOpenKeyA 등은 ADVAP I32.DLL로부터, ReadFile, IsBadReadPtr 등은 Kernel32.DLL로부터, 그리고 GetWindowLongA, SendMessageA 등은 USER32.DLL로부터 각각 import 하고 있음을 알 수 있다. Export 부분은 차례순, 인스턴스 핸들, 알파벳순으로 나열된 심볼 이름을, 그리고 괄호 속에는 심볼의 주소를 기록해 놓았다. 따라서 WinInet.DLL에서 export하는 많은 함수들 중에 CommitUrlCache EntryA, CommitUrlCacheEntryW 등이 포함되어 있음을 알 수 있다.
마지막으로 summary 부분을 보면 먼저 숫자가 나오고 점으로 시작하는 문자열이 나열되어 있는데, 처음 나오는 숫자는 16진법의 바이트의 크기를 나타내고 뒤따르는 문자열은 데이터 형태를 나타낸다. 모든 DLL이나 exe 이미지 파일은 정해진 특별한 부분, 즉 섹션들로 나누어지는데 이에 해당되는 부분은 DLL 이미지의 summary 부분에 나타나도록 되어 있다.
즉 .data는 초기화된 데이터를, .reloc은 relocation size를, .rsrc는 리소스를, 그리고 .text는 프로그램 코드를 저장하는 부분을 각각 나타내며 그 외에도 WinInet.DLL에서 사용하지는 않지만 .bss는 초기화되지 않은 데이터를, .rdata는 런타임 데이터, .edata는 export된 함수 이름의 테이블, .xdata는 예외 처리(exception handling) 테이블, .idata는 import 된 함수 이름 테이블, .CRT은 C 런타임 데이터, .debug는 디버깅 정보, 그리고 .tls는 thread local storage의 데이터를 각각 나타낸다.
이와 같이 이미 정해진 섹션 이름들이 있지만 필요하다면 프로그래머의 재량에 따라 임의로 이름을 정해주고 그 섹션으로의 접근을 Read, Write, Execute, Shared의 네 개의 모드(Access Mode)로 접근 권한을 조정할 수 있다.
임의로 섹션 만들기에 대해 간단하게 설명하도록 하겠다. 윈도우 프로그램에서 임의로 섹션을 만드는 것은 그리 어려운 일이 아니다. 프로그램의 소스 코드를 만들 때 다음과 같은 두 가지 지시어를 사용하여 섹션을 생성하고 필요한 권한을 부여할 수 있다.
첫째, 원하는 데이터를 #pragma data_seg()라는 명령어로 묶는다. 예제에서 보는 것과 같이 int global Counter=0;을 섹션 이름 “my_section”으로 표시하고자 한다면 다음과 같이 할 수 있다.

#pragma data_seg(“mysection”)
int globalCounter = 0;
#pragma data_seg()
이렇게 하면 컴파일러는 #pragma data_seg (“mys ection”)와 #pragma data_seg() 사이에 있는 초기화된 모든 변수를 새로운 섹션인 “.mysection” 내에 저장하게 된다.
이 때 globalCounter 변수가 초기화되지 않았다면 .bss 섹션으로 저장이 되므로 지정한 섹션으로 변수를 저장하기 위해서는 반드시 초기화하는 작업이 필요하다.
둘째, 이렇게 정해진 섹션에 필요한 접근 권한을 부여해 준다. 앞서 언급한 것처럼 프로그래머는 생성된 섹션에 읽기(Read), 쓰기(Write), 실행하기(Execute), 그리고 공유(Share) 권한을 부여할 수 있는데, 위에서 생성한 globalCounter에 읽기, 쓰기 및 공유 권한을 부여하고자 한다면 #pragma data_seg() 아래에 다음과 같은 명령어를 사용하면 된다.

#pragma comment(linker, “/section:mysection, RW”)
이렇게 하면 mysection은 다른 여러 프로세스가 읽고, 쓰고, 공유할 수 있게 되므로 프로세스간의 데이터 공유가 가능해진다.

예제 프로그램 이해하기
마지막으로 윈도우 32 API를 간략하게 소개하고, 필자가 코딩한 인터넷 FTP 프로그램을 살펴보도록 하자.

DLL과 관련된 윈도우 32 API
여기 소개된 윈도우 32 함수들은 예제 프로그램에서는 잘 사용하지 않은 API들이다. 이번 기회에 이러한 함수들을 본 예제 프로그램에 첨가하여 사용법을 익히고 반환값을 살펴보기 바란다.

·HINSTANCE LoadLibrary(LPCTSTR lpLibFileName) : LoadLibrary는 DLL의 이름을 입력받아 핸들을 반환하도록 되어 있다. 반환된 핸들은 GetProcAddress API를 사용하여 해당 DLL이 가상 메모리에 올려진 주소를 알려준다. LoadLibrary 실행 후 오류가 발생하면 NULL을 반환하며, 이 때는 GetLastError를 불러 오류의 종류를 알아볼 수 있다.
·HINSTANCE LoadLibraryEx(LPCTSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) : LoadLibraryEx는 모든 면에서 LoadLibrary와 그 성격이 동일하지만 dwFlags를 통해 DLL을 메모리에 올릴 때 여러 가지 옵션을 사용할 수 있다는 점이 다르다.
·BOOL FreeLibrary(HMODULE hLibModule) : FreeLibrary를 사용하므로 DLL의 사용 횟수를 한번 줄여주고, DLL 사용 회수가 0이 되면 시스템은 DLL이 사용하고 있는 메모리를 풀어서 다시 시스템으로 환원해 준다. FreeLibrary 실행이 성공하면 TRUE를, 실패하면 FALSE를 반환하도록 되어 있다.
·HMODULE GetModuleHandle(LPCTSTR lpModuleName) : GetModuleHandle은 DLL 이름을 변수로 입력해 줌으로써 메모리에 올려진 DLL의 핸들을 반환해 준다. GetProcaddress를 사용하여 시스템에 올려진 메모리의 값을 알아낸다는 점은 LoadLibrary와 동일하나 DLL 사용 횟수를 변경하지 않는다는 점이 LoadLibrary와 다르다. 실행이 성공적이면 DLL의 핸들을 반환하지만 실패하는 경우는 NULL을 반환한다.
·DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ) : 이 함수는 모듈 핸들에 해당하는 파일 이름을 알고자 할 때 사용한다. hModule의 값으로 NULL을 입력하면 현재 실행 중인 모듈의 파일 이름을 반환하게 된다. 인자로 모듈의 핸들, 스트링 포인터, 그리고 DWORD 사이즈를 받으며 실행 후 DWORD를 반환한다. hModule은 모듈 핸들을 입력하며 nSize는 lpFileName으로 복사하게 될 문자의 수를 입력한다. 이 핸들을 받아 시스템은 lpFileName 버퍼에 모듈에 해당되는 파일 이름을 채워주고, lpFileName으로 복사한 문자의 수를 반환해 준다.
·VOID FreeLibraryAndExitThread( HMODULE hLibModule, DWORD dwExitCode ) : 이 함수는 FreeLibrary(hLibModule)와 ExitThread (dwExitCode)를 순차적으로 실행시켜 준다. 따라서 이 함수를 사용하면 시스템에서 사용 중인 DLL의 사용 회수를 한 번 감소시키고 즉시 해당 스레드를 끝낸다.
·FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName) : 하나의 DLL에서 export된 함수의 메모리 위치를 알기 위해 사용하는 API이다. 즉 hModule에 DLL 이름을, lpProcName에 DLL이 export하는 함수의 이름을 인자로 입력하여 실행하면 lpProcName에 해당하는 메모리의 주소를 반환해 준다.

예제 프로그램
여기 소개하는 예제 프로그램은 마이크로소프트의 WinInet.DLL의 함수들을 사용한 FTP 프로그램이다. WinInet.DLL에서 export하는 함수들을 본 예제 프로그램이 LoadLibrary() 함수를 통해 import하는 과정을 참조하기 바란다. 사실 DLL은 윈도우의 어느 프로그램에서나 사용하므로 필자는 간단한 인터넷 FTP 프로그램을 코딩하면서 DLL을 사용하는 방법을 소개하고자 한다.
본 예제 프로그램의 사용법은 간단하다. 우선 소스로 제공되는 6six.exe를 실행하면 그림 3과 같은 FTP 콘솔 화면이 나타난다. 이 콘솔에는 ‘Run Program’, ‘About’, 그리고 ‘Quit’ 같은 세 개의 메뉴가 나타나는데, ‘Run Program’ 메뉴를 실행하면 FTP를 실행할 수 있는 다이얼로그 화면이 그림 4와 같이 나타난다. 여기에 FTP 서버의 주소를 입력하고 ‘File for FTP Manipulation’의 파일 형태를 수정한 후 GETter/PUTter 옵션을 선택하면 된다. 이 때 FTP 된 파일을 목적지에서 삭제하고자 한다면 ‘Delete the copy after GET/PUT operation’ 박스에 체크해 주면 된다. 그리고 끝으로 ‘Run’ 버튼을 누르면 FTP 세션이 시작된다. FTP 세션이 시작되면 이 다이얼로그 박스는 ‘Close’ 버튼으로 닫아도 프로그램이 계속되며, 모든 FTP 진행 상황은 FTP 콘솔 윈도우로 출력이 된다. FTP 프로그램의 소스코드는 리스트 1과 같다.


리스트 1 : FTP 프로그램 소스코드
/* ************************************************************
프로그램 이름 : FTP 클라이언트 프로그램
저자 : 성철기
*************************************************************/
#include
#include // FTP 함수 불러오기
#include “resource.h”

/* ************* Protocol type definitions ****************** */

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
// 메인 윈도우 메시지 펌프
BOOL CALLBACK dlgProc (HWND, UINT, WPARAM, LPARAM) ;
// FTP 다이얼로그 메시지 펌프
BOOL CALLBACK aboutProc (HWND, UINT, WPARAM, LPARAM) ;
// About 다이얼로그 메시지 펌프
DWORD WINAPI ftpThread(LPVOID lpParam); // FTP 세션을 위한 스레드
void ToConsole(); // FTP 콘솔로 상태 보고를 위한 출력 코딩
void CloseAll(); // 윈도우 핸들 및 인터넷 연결 종결
HINTERNET GetFirstFile(HINTERNET hFtp);
// 인터넷의 FTP 서버에서 처음 보여지는 파일 가져오기
HANDLE GetWinFirstFile();
// 지역 디렉토리에서 첫 파일을 가져와서 PUT을 위한 준비를 한다

/********************** Global Variables **********************/
// 전역 변수들을 정의하고 초기화한다
//static int InetServiceType = INTERNET_SERVICE_FTP;
HINTERNET hInternet, hFtp, hFile;
HINSTANCE ghInst;
HANDLE ghwnd, gdlghwnd, hWinFile;
HWND hCheckBox, hRadioButton1, hRadioButton2;
int iCheckBox, iRadioButton1, iRadioButton2;
static TCHAR * szTitle = TEXT(“FTP 프로그램”);
static TCHAR szBuffer[80];
static RECT rectScroll ;
static WIN32_FIND_DATA finddata;
/* ************* Input Storage from a Dialog Box ************* */
// 다이얼로그 박스의 FTP 세션에 필요한 변수들을 초기화한다
static TCHAR FtpServerAddr[40] = “www.pserang.co.kr”;
static TCHAR UserName[40] = “anonymous”;
static TCHAR Password[40] = “”;
static TCHAR FilePattern[40] = “*.*”;
static int FtpPort = INTERNET_DEFAULT_FTP_PORT; //21

/************************** WinMain ***************************/
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
/* 지역 변수들을 정의하고 필요하다면 초기화한다 */
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
ghInst = hInstance;
ghwnd = hwnd;
/* 예제 프로그램을 등록하기 위한 준비를 갖춘다 */
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_WINLOGO) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground=(HBRUSH) GetStockObject(WHITE_BRUSH) ;
wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
wndclass.lpszClassName = szTitle ;
// 프로그램을 등록한다
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT
(“본 프로그램은 윈도우 32 플랫폼에서 실행됩니다.”),
szTitle, MB_ICONERROR) ;
return 0 ;
}
// FTP 프로그램의 상태를 보고하게 될 윈도우를 열어 둔다
hwnd = CreateWindow (szTitle, TEXT (“Console for FTP Thread”),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
// 메인 윈도우의 메시지 펌프
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

/**************** 인터넷과 관련된 모든 핸들을 종료한다 ****************/
void CloseAll()
{
wsprintf(szBuffer, “Fail: Getting first file.
Exiting”);ToConsole();
InternetCloseHandle(hFile);
InternetCloseHandle(hFtp);
InternetCloseHandle(hInternet);
}

/* ****** 윈도우의 버퍼에서 받은 메시지를 화면에 출력한 후 재페인팅 한다 ****** */
void ToConsole()
{
InvalidateRect(ghwnd, NULL, FALSE);
}

/* ****** FTP의 GET에 사용될 첫 번째 파일을 가져오기 위해 준비한다 ****** */
HINTERNET GetFirstFile(HINTERNET hFtp)
{
wsprintf(szBuffer, “FTP서버 %s:%u의 현재 디렉토리에서 첫 번째 파일을 가져옴”,
FtpServerAddr,FtpPort);
ToConsole();
hFile = FtpFindFirstFile(hFtp, FilePattern,
&finddata, 0, 0);
return hFile;
}

/************ FTP의 PUT에 사용할 첫 번째 파일을 준비한다 ************* */
HANDLE GetWinFirstFile()
{
wsprintf(szBuffer, “Browsing for the first file in the current local directory.”);ToConsole();
hWinFile = FindFirstFile (FilePattern, &finddata);
return hWinFile;
}
/************** FTP 세션을 위해 스레드를 따로 마련해 둔다 **************/
DWORD WINAPI ftpThread(LPVOID lpParam)
{
BOOL bSuccess;
TCHAR prevFileName[80]=”test”;
BOOL endOfFileList;
/* FTP 다이얼로그 박스의 컨트롤 핸들을 준비한다 */
hCheckBox = GetDlgItem (gdlghwnd, IDC_CHECK1);
hRadioButton1 = GetDlgItem(gdlghwnd,IDC_RADIO1);
hRadioButton2 = GetDlgItem(gdlghwnd,IDC_RADIO2);
wsprintf(szBuffer, “인터넷을 열기 위한 준비를 한다...”);
ToConsole();
hInternet = InternetOpen(szTitle, INTERNET_OPEN_TYPE_
PRECONFIG, NULL,NULL, INTERNET_FLAG_ASYNC);
// 인터넷 준비가 실패하면 열린 핸들을 닫고 스레드를 종료한다
if(hInternet == NULL)
{
wsprintf(szBuffer, “Error (%i) InternetOpen.
Exiting Program ...”, GetLastError());
ToConsole();
CloseAll();
ExitThread(0);
return 0;
}
wsprintf(szBuffer, “done.”);ToConsole();

wsprintf(szBuffer, “Trying Ftp Open ...”); ToConsole();
// 인터넷의 FTP 연결을 시도한다
hFtp=InternetConnect(hInternet, FtpServerAddr, FtpPort,
UserName, Password, TERNET_SERVICE_FTP, 0, 0);
/* FTP 연결이 실패하면 기존의 윈도우 핸들들을 닫고 스레드를 종결한다 */
if(hFtp == NULL)
{
wsprintf(szBuffer, “Error (%i)
InternetConnection for FTP. Exiting ...”,
GetLastError()); ToConsole();
CloseAll();
ExitThread(0);
return 0;
}
/* 연결이 성공하면 메시지를 윈도우 화면으로 출력한다 */
wsprintf(szBuffer, “Success: Ftp Sessions
Open.”);ToConsole();
// 1초 동안 쉰다.
Sleep(1000);

/* FTP 다이얼로그 박스에서 꼭 필요한 컨트롤이 체크되었는지 확인하고 그 상태를
기억한다. Radio 버튼은 둘 중 하나는 반드시 선택하여야 하므로 whileloop을
통해 사용자가 체크할 때까지 기다린다 */
do
{
iRadioButton1 = SendMessage (hRadioButton1,
BM_GETCHECK, 0, 0);
iRadioButton2 = SendMessage (hRadioButton2,
BM_GETCHECK, 0, 0);

if ( (iRadioButton1 || iRadioButton2)
== BST_CHECKED)
{
break;
}
else
{
wsprintf(szBuffer, “GET 또는 PUT 중
하나를 꼭 선택하셔야 합니다.”);ToConsole();
Sleep(1000);
}
} while(1);

iCheckBox = SendMessage (hCheckBox, BM_GETCHECK, 0, 0);

/* 사용자가 GET을 선택하면 원격 FTP 서버에서 파일을 가져온다 */
if(iRadioButton1==BST_CHECKED)
{
hFile = GetFirstFile(hFtp);
if(hFile == NULL)
{
CloseAll();
ExitThread(0);
return 0;
}
}
/* PUT이 선택되었으면 지역 디렉토리의 파일을 원격 FTP 서버로 올린다 */
else if(iRadioButton2==BST_CHECKED)
{
hWinFile = GetWinFirstFile();
if(hWinFile == NULL)
{
CloseAll();
ExitThread(0);
return 0;
}
}

do
{ /* GET을 선택했을 때, 다음 파일을 원격 FTP 서버에서 가져온다 */
if(iRadioButton1)
{
wsprintf(szBuffer, “Getting a next file ...”);
ToConsole();
bSuccess = FtpGetFile (hFtp, finddata.cFileName,
finddata.cFileName, FALSE, FILE_ATTRIBUTE_NORMAL,
FTP_TRANSFER_TYPE_BINARY, 0);
if(bSuccess)
{
wsprintf(szBuffer, “Done “);ToConsole();
}
else
{
wsprintf(szBuffer, “Failed “);ToConsole();
}
Sleep(1000);
/* 만약 파일 지움 박스에 체크가 되었으면 지금 가져온 파일을 즉시 지워준다 */
if(iCheckBox && bSuccess)
{
wsprintf(szBuffer, “Deleting file (%s) at the local
drive.”, finddata.cFileName); ToConsole();
DeleteFile(finddata.cFileName);
}
}
/* PUT을 선택하였으면 원격 FTP 서버에서 다음 파일을 가져온다 */
else if(iRadioButton2)
{
wsprintf(szBuffer, “Putting %s “, finddata.cFileName);
ToConsole();
bSuccess = FtpPutFile(hFtp, finddata.cFileName,
finddata.cFileName, FTP_TRANSFER_TYPE_BINARY, 0);
if(bSuccess)
{
wsprintf(szBuffer, “Done “);ToConsole();
}
else
{
wsprintf(szBuffer, “Failed “);ToConsole();
}

Sleep(1000);
/* 다음 파일의 복사가 성공적으로 끝나고 파일 지움 박스가 체크되었으면
지금 복사한 파일을 지워준다 */
if(iCheckBox && bSuccess)
{
wsprintf(szBuffer, “Deleting file (%s) at %s.”,
finddata.cFileName, FtpServerAddr); ToConsole();
FtpDeleteFile(hFtp, finddata.cFileName);
}
}

Sleep(1000);

/* 더 이상 가져올 파일이 없으면 메시지를 화면으로 출력한다 */
if( lstrcmp(prevFileName, finddata.cFileName) ==0 )
{
wsprintf(szBuffer, “End of File List”); ToConsole();
endOfFileList=TRUE;;
}

lstrcpy(prevFileName, finddata.cFileName);
Sleep(1000);

/* 모든 파일의 복사가 끝나면 열었던 핸들들을 닫아준다. */
if(endOfFileList==TRUE)
{
endOfFileList=FALSE;

if(iRadioButton1)
{
InternetCloseHandle(hFile);
hFile = GetFirstFile(hFtp);
if(hFile == NULL)
{
wsprintf(szBuffer, “Fail: Getting the first file”);
}
}
else if(iRadioButton2)
{
CloseHandle(hWinFile);
hWinFile = GetWinFirstFile();
if(hWinFile == NULL)
{
wsprintf(szBuffer, “Fail: Getting the first file”);
}
}

Sleep(1000);
wsprintf(szBuffer, “One Cycle has been completed.”);
ToConsole();
}

else
{
if(iRadioButton1)
{
InternetFindNextFile (hFile, &finddata);
}
else if(iRadioButton2)
{
FindNextFile(hWinFile, &finddata);
}
}

Sleep(1000);

} while(1);
return 0;
}

/* ******* About 다이얼로그 메시지 엔진 ******* */

BOOL CALLBACK aboutProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hwnd, 0);
return TRUE;
}
}
return FALSE;
}

/* ******* FTP 다이얼로그 메시지 엔진 ******* */

BOOL CALLBACK dlgProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
TCHAR * param = “this is a test”;
DWORD dwCreationFlags=0;
DWORD dwThreadId;
HANDLE hThread;
TCHAR * temp = “test”;

gdlghwnd = hwnd;

switch(message)
{
/* 다이얼로그 박스가 열리기 직전에 필요한 초기화 작업을 한다 */
case WM_INITDIALOG:
SetDlgItemText(hwnd, IDC_ADDR, FtpServerAddr);
SetDlgItemText(hwnd, IDC_USER, UserName);
SetDlgItemText(hwnd, IDC_PASS, Password);
SetDlgItemText(hwnd, IDC_PATTERN, FilePattern);
SetDlgItemText(hwnd, IDC_PORT, “21”);
return TRUE;


case WM_COMMAND:
switch(LOWORD (wParam))
{
case IDC_CLOSE:
EndDialog(hwnd, 0);
return TRUE;

/* Run 버튼을 눌렀을 때 FTP 다이얼로그 박스에 입력된 데이터를 모아 FTP
세션을 시행한다 */
case IDC_RUN:
GetDlgItemText(hwnd, IDC_ADDR, FtpServerAddr,
lstrlen(FtpServerAddr)+1);
GetDlgItemText(hwnd, IDC_USER, UserName,
lstrlen(UserName)+1);
GetDlgItemText(hwnd, IDC_PASS, Password, lstrlen
(Password)+1);
GetDlgItemText(hwnd, IDC_PATTERN, FilePattern,
lstrlen(FilePattern)+1);
GetDlgItemText(hwnd, IDC_PORT, temp, lstrlen(temp)+1);
FtpPort = atoi(temp);

if(hInternet)
{
CloseAll();
}
/* FTP 세션을 위한 스레드를 하나 따로 생성해 준다 */
hThread = CreateThread(NULL,0, ftpThread, (LPVOID)
param, 0, &dwThreadId );
CloseHandle (hThread);

return TRUE;
}
}
return FALSE;
}

/* ******* Message Engine for Main Window ******* */

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
static int cyClient;
static int cyChar;
static int cLines = 0;
static BOOL isNewLine;
static RECT rectAll;
HDC hdc ;
PAINTSTRUCT ps ;
TEXTMETRIC tm ;
ghwnd = hwnd;

switch (message)
{

case WM_COMMAND:

switch(LOWORD (wParam))
{
case IDC_QUIT:
CloseAll();
SendMessage(hwnd, WM_DESTROY, wParam, lParam);
return 0;
/* Run 메뉴를 선택했을 때 다이얼로그 박스를 화면으로 출력해 준다 */
case IDC_RUNPROGRAM:
DialogBox(ghInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,
dlgProc);
InvalidateRect(hwnd, NULL, FALSE);
return 0;

case IDC_ABOUT:
DialogBox(ghInst, MAKEINTRESOURCE(IDD_DIALOG2), hwnd,
aboutProc);
return 0;
}

case WM_PAINT:

GetClientRect(hwnd,&rectAll);
cyClient = rectAll.bottom;
rectScroll = rectAll;

rectScroll.top = rectScroll.top+(cyChar*cLines);
hdc = BeginPaint (hwnd, &ps) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
SetBkMode (hdc, TRANSPARENT) ;

GetTextMetrics (hdc, &tm) ;
cyChar = tm.tmHeight ;
TextOut (hdc, 0, cyChar*cLines, szBuffer, lstrlen
(szBuffer)) ;
ZeroMemory(szBuffer, lstrlen(szBuffer));

cLines++;
EndPaint (hwnd, &ps) ;

if(cyChar*cLines+cyChar > cyClient)
{
isNewLine=TRUE;
cLines = 0;
}
if(isNewLine)
{
isNewLine=FALSE;
rectScroll.top = 0;
InvalidateRect(hwnd, &rectScroll, TRUE);
}

return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
Posted by 장안동베짱e :
Posted by 장안동베짱e :
Posted by 장안동베짱e :

학교대사전(클릭)



- 추천사-

감히 아무도 할 수 없었던 일

이 책은 학교에서 접할 수 있는 여러 사물에 대한 정감과 소회를 명쾌한 분석과 재치있는 표현으로 승화시킨 책이다. 작가의 예리한 통찰력을 바탕으로 한 가히 학교의 진정한 백과사전이라 할 만하다.
언젠가 그 누군가가 했어야 할 일을 앞장서서 한 ㅇㅇ군에게 깊은 경외를 표하며 이 책에 조금이라도 보탬이 된 듯한 느낌이라 뿌듯하다
통쾌한 웃음을 선사할 뿐 아니라 학교나 다른 사물들에 대한 새로운 각도에의 접근과 그 안에서의 자신을 돌아볼 수 있도록 하는책, 이 책을 강력히 추천하는 바이다.
2004년 4월, ㅁㅁ고에서 감수 ㅇㅇㅇ

Posted by 장안동베짱e :
음.. 근호쏭 블로그 갔다가 디게 신기한걸 발견했다.

우리 살람들 성격상 그냥 못넘어가지.. ^^흐흐


당장 테스트 해봤다..

거참.. 이거 만들려고 생각한 사람의 끈기와 삽질에 박수를 보내는 바이다;



상세정보는 http://www.imazing.net 에서..




ps. 사진속 주인공들한텐 죄송..;

ps2. 사진 출처는 배포자의 신변위협을 우려 하여 공개하지 않겠음. ^^;
Posted by 장안동베짱e :

[CODE] <IMG class=ib onclick="if (confirm('이동하시겠습니까?\t')) location.href='이동할주소'" alt="" src="이미지"> <a onclick="if (confirm('이동하시겠습니까?\t')) location.href='이동할주소'" alt="">이동</a> [/CODE]





예제)


이동


Posted by 장안동베짱e :
출처 : http://jaewook.net/aquamp/index.html?q=pl%3D142



윈도우를 설치한후 꼭 설치해야할 패치 3가지를 제공합니다.
OS별 언어별로 모두 올려서 한꺼번에 다운로드 받도록 정리했답니다....
이 자료는 안철수에서 필수로 선정한것으로.. MS사이트에서 다운받아 리스트했답니다.
참고로 winXP sp2는 해당되지않습니다. 하지만 sp2는 불편한게 한두가지가 아니라
XP sp2 자체를 권할수없답니다..... xp까시는 분들 sp1 깔고 패치하세요..

1. 블래스터웜 관련 패치 (KB828741)
이 패치들은 Win32/Blaster.worm관련 패치입니다. 이 패치가 설치되어 있지 않으면 Win32/Blaster.worm 때문에 컴퓨터가 60초마다 재부팅 될 수 있습니다. KB828741패치를 아래에 제공합니다. 이전에 나온 패치를 이미 포함하고있답니다.
KB828741 패치 다운받기 [MS04-012]

win2000한글|win2000영문|winXP한글|winXP영문|win2003한글|win2003영문




2. 새서웜 관련 패치 (KB835732)
Win32/Sasser.worm도 Win32/Blaster.worm처럼 60초 마다 재부팅을 일으킵니다. 반드시 패치를 설치하셔야 감염을 피하실 수 있습니다.
KB835732 패치 다운받기 [MS04-011]

win2000한글|win2000영문|winXP한글|winXP영문|win2003한글|win2003영문




3. IRC봇 웜 관련 패치(KB828749 / KB828035)
이 패치는 Win32/IRCBot.worm 관련 패치입니다. 물론 앞의 두 패치도 모두 설치 한 후 설치해 주어야 합니다. Win32/IRCBot.worm과 관련된 패치들은 이외에도 많이 있지만 서비스팩 안에 포함되어 있는 것들이기 때문에 서비스팩 최신 버전을 설치하면 대부분 해결됩니다.
KB828749 패치 다운받기 [MS03-049]

win2000한글|win2000영문|winXP한글|winXP영문|win2003한글|win2003영문


KB828035 패치 다운받기 [MS03-043]

win2000한글|win2000영문|winXP한글|winXP영문|win2003한글|win2003영문




그리고 이모든 패치를 설치한후 마지막으로.. 이 파일을 실행시켜주세요..
(각 패치 설치후 리부팅하라고하는데 리부팅하지말고 전부 설치한후 아래 파일실행하세요
qchain.exe (패치 리부팅하지않고 한꺼번에 깔때 실행)

가장 급한 패치이기때문에 미리 다운받아 usb 메모리등에 저장해두었다가
랜연결하지 않은 상태에서 OS설치후 즉시 이 패치들을 설치하고
그후에 랜을 연결해서 나머지 패치들을 하면 좋을것같습니다
Posted by 장안동베짱e :
출처 : http://wiki.kldp.org/wiki.php/LiveCD-HOWTO


(열기)
Posted by 장안동베짱e :

보러가기


요즘은 저작권개정안 무서워서 글도 함부러 못퍼겠다..;


Posted by 장안동베짱e :
1. 프로젝트유도
2. 비트맵에 배경그리기
* Resource Tab -> 프로젝트명에서 오른쪽 버튼 클릭 -> Insert -> Bitmap -> new버튼 클릭
글로 설명한 것들은 아래 그림과 같다.



*위의 과정의 하게되면 무슨 바둑판 같은 것이 나오게 된다. 그 바둑판같은 네모난 것은 안쪽에서는 포인터가 펜이나 아니면 드럼통같은 것인데 맨바깥부분으로 가면 그게 화살표로 바뀌는 부분이 있다. 그때 그 네모난 것을 더블클릭한다. (Bitmap Properties 나오게 하려고 하는 과정이다.)
그럼 아래과 같은 창이 나오는데 ID와 Width, 그리고 Height를 아래와 같이 설정해 준다.




네모난거 오른쪽 도구상자에서 페인트통 같은걸 선택해 주고 배경색을 빨간 색으로 준다. (그림판과 사용방법이 비슷함)
* 비트맵 2개더 추가(과정은 위와 동일함)
ID : IDB_BITMAPCar Width : 50 Height : 50
ID : IDB_BITMAPMonster Width : 50 Height : 50
처음에 비트맵은 자동차 그림을 그려주고 두 번째 비트맵은 괴물 그림을 그려준다.




3. Class View로 간다.

CDC m_BackDC; // back
CBitmap m_BackBit;

CDC m_CarDC; // car
CBitmap m_carBit;

CDC m_CarDC; // Mem
CBitmap m_MemBit;


4. [WM_CREATE]

int CA520View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CClientDC dc(this);

// 물리적 메모리 준비
m_MemDC.CreateCompatibleDC(&dc);
m_MemBit.CreateCompatibleBitmap(&dc, 500, 500);
m_MemDC.SelectObject(&m_MemBit);

// 배경준비
m_BackDC.CreateCompatibleDC(&dc);
m_BackBit.LoadBitmap(IDB_BITMAPBack);
m_BackDC.SelectObject(&m_BackBit);

// Car 준비
m_CarDC.CreateCompatibleDC(&dc);
m_CarBit.LoadBitmap(IDB_BITMAPCar);
m_CarDC.SelectObject(&m_CarBit);

// 몬스터 준비
m_MonDC.CreateCompatibleDC(&dc);
m_MonBit.LoadBitmap(IDB_BITMAPMonster);
m_MonDC.SelectObject(&m_MonBit);


m_CarPos = CPoint(100, 100);

m_MemDC.BitBlt(0, 0, 500, 500, &m_BackDC, 0, 0, SRCCOPY);
m_MemDC.BitBlt(200, 200, 50, 50, &m_MonDC, 0, 0, SRCCOPY); // 몬스터
m_MemDC.BitBlt(m_CarPos.x, m_CarPos.y, 50, 50, &m_CarDC, 0, 0, SRCCOPY);

return 0;
}


5. [OnDraw]

void CA520View::OnDraw(CDC* pDC)
{
CA520Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->BitBlt(0, 0, 500, 500, &m_MemDC, 0, 0, SRCCOPY);
}


6. [WM_KEYDOWN]

void CA520View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch (nChar)
{
case VK_LEFT:
m_CarPos.x -= 10;
if(TRUE==uIsColl())
{
m_CarPos.x += 20;
}
break;
case VK_RIGHT:
m_CarPos.x += 10;
if(TRUE==uIsColl())
{
m_CarPos.x -= 20;
}
break;
case VK_UP:
m_CarPos.y -= 10;
if(TRUE==uIsColl())
{
m_CarPos.y += 20;
}
break;
case VK_DOWN:
m_CarPos.y += 10;
if(TRUE==uIsColl())
{
m_CarPos.y -= 20;
}
break;
default:
break;
}

m_MemDC.BitBlt(0, 0, 500, 500, &m_BackDC, 0, 0, SRCCOPY);
m_MemDC.BitBlt(200, 200, 50, 50, &m_MonDC, 0, 0, SRCCOPY); // 몬스터
m_MemDC.BitBlt(m_CarPos.x, m_CarPos.y, 50, 50, &m_CarDC, 0, 0, SRCCOPY);

m_MemDC.MoveTo(0,0); // Line
m_MemDC.LineTo(m_CarPos);

m_MemDC.TextOut(100, 100, "Press any key"); // Text



CRect rc(0, 0, 500, 500);
InvalidateRect(&rc, FALSE);


CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
Posted by 장안동베짱e :
(::저작권법 16일시행 네티즌들 대혼선::)

‘좋아하는 노래 가사를 인터넷 홈페이지에 올려놓는 것도 저작 권법 위반.’ 오는 16일 저작권법 개정안 시행을 앞두고 네티즌들이 크게 반 발하고 있다. 지금까지는 저작물의 주요 권리인 전송권(저작물을 일반인들이 송신하거나 제공하는 권리)을 저작권자인 작사·작 곡자에게만 인정해 왔지만 저작권법 개정안이 시행되면 가수와 연주자, 음반제작자에게까지 전송권을 확대, 인정하게 된다.
이처럼 저작물의 전송권이 확대, 인정되면 앞으로 개인 이용자의 저작권법 위반행위에 대한 단속이 크게 강화되고 소송도 급증할 것으로 보인다. 여기다가 일부 네티즌들이 이번 개정안 시행으 로 개인홈페이지 등에 음악파일을 올려놓는 것이 불법행위가 됐 다는 잘못된 정보까지 나돌면서 네티즌들의 반발은 더욱 거세지 고 있다. 개인 홈페이지나 블로그에 올려놓는 음악파일의 경우, 현 행 법으로도 저작권 침해로 인정된다. 인터넷 포털사이트 ‘네이 버’ 게시판에 글을 올린 한 네티즌은 “(이번 법개정은) 결국 블로그나 미니홈피 서비스를 하는 포털사이트나 음반사 관계자들 만 배불리자는 속셈”이라며 목소리를 높였다.

또 다른 네티즌은 “개인 홈페이지까지 단속하는 것은 전국민을 범법자로 만들겠다는 것”이라고 주장했다. 실제로 한국 음원제 작자협회 윤성오 법무실장은 “이번 법 개정을 계기로 상업 사이 트는 물론 개인 홈페이지와 블로그에 대한 무단 저작물 도용 행 위에 대해서도 지속적인 단속을 해나갈 계획”이라며 “네티즌들 의 저작권에 대한 인식이 여전히 낮은 게 문제”라고 말했다.

한편 주무부처인 문화관광부측은 네티즌들의 반발에 적잖이 당황 해하는 눈치다. 저작권법 개정안 시행 이전에도 개인 홈페이지와 블로그의 저작물 무단 인용은 저작권법 위반이었다는게 문광부 측의 설명. 문광부에 따르면 ▲저작권자의 허락없이 인터넷상에 음악파일을 올려놓는 행위 ▲구입한 CD로부터 음원(MP3 파일 등) 을 추출해 홈페이지에 올려놓는 행위 ▲다른 사이트 올려놓은 음 악파일 소스를 인터넷상에 링크시키는 행위 ▲노래의 가사를 인 터넷상에 올려놓는 행위 등은 모두 저작권법 침해에 해당한다.

그러나 자신이 구입한 CD로부터 음원을 추출하는 행위 자체는 저 작권 침해 행위가 아니다.

이동현기자 offramp@
Posted by 장안동베짱e :
10일 영국에서 출간된 '게으름의 기쁨(The Joy of Laziness)'이라는 신간이 논란을 일으키고 있다. 게을러야 오래 산다는 것이 책의 주장이기 때문이다.
독일 풀다 대학에서 건강 과학을 가르치다 은퇴한 페터 액스트 박사와 그의 딸이 집필한 이 책은 무리한 운동보다는 나태한 생활이 장수의 비결이라고 강조한다.

왜냐하면 "삶의 에너지"가 한정되어 있기 때문이다. 그 에너지를 소비하는 속도가 수명을 결정하는데 빨리 소비할수록 더 빨리 사망한다는 것이 저자들의 설명이다. 비유하자면 인간은 충전이 안 되는 일회용 배터리와 같은 존재인 것이다.

반대로 격렬한 운동을 할수록 프리 래디컬(free radicals)라는 유해 산소 성분이 많이 생겨 오히려 노화를 촉진하게 된다고 저자들은 경고한다.

또한 저자들은 달리기 등 과격한 운동을 하면 혈압을 상승시켜 심장과 동맥에 손상을 입힐 호르몬이 분비된다는 지적도 덧붙인다. 대신 천천히 걷는 운동을 하면서 저 탄수화물과 고 단백질 음식을 먹으면 건강한 체형을 유지하는 것이 충분히 가능하다고.

기존 의학계에서는 액스터 박사의 주장에 대한 격렬히 비판하고 있다. 터무니없는 이론이라는 것이다. 하루 30분 내외의 운동은 심장 혈관의 기능과 면역력을 높일 뿐 아니라, 건강한 마음을 유지하는데 필수적이라는 것.

팝뉴스 이고원 기자
Posted by 장안동베짱e :
요즘 너무 정신이 없다..

오늘 너무 피곤해서 낮잠을 잤는데..

자고 일어나니 내가 병특준비를 하고 있었단게 생각이 났다..

아무리 바빠도 그걸 잊고 있었다니..

단숨에 이력서 하나 사사삭 해서 한 회사에 넣었다.



지금껏 두개밖에 안넣었었는데..

한회사는.. 쌩~이고..
한회사는 아직까지 해당 직원이 메일을 안열어보고 있다..
아마.. 잘못 보냈었나 보다..ㅡ,ㅡ;


오늘 넣은 회사는... 음.. 이력사항에 이상한걸 많이 물어보는 회사였다.
컴퓨터 사용 능력 정도?
프로그래머한테 그런걸 왜 물어 보는건지;;
그리고 음주량, 흡연여부, 혈액형 같은건 왜 물어 보는건지;;;;;;
술 많이 마시고 담배 많이 피고 혈액형 RH-이면 안 뽑겠다는건가??

완전.. X판이군.. 빨리 붙고 될수 있음 까리한데로 전직해야겠다.





( 오늘아침꿈에 이상한 꿈을 꿨다..
어떤 여자가 물어보지도 않았는데 느닷없이 자기이름이 이주혜란다;
ㅡ,ㅡ;;; 그래서 나더러 어쩌라고?;;
생긴건 멀쩡하게 생겼었는데;; )


Posted by 장안동베짱e :
출처 : http://www.docs.co.kr


시스템 프로그래머를 위한 DLL 탐색 유틸리티







사용환경
-Windows 95/98/XP/2000/2003
-펜티엄 III 이상 권장
-메모리 64MB 이상 권장

















이것도 역시.. 놔두면 나중에 써먹겠군..
Posted by 장안동베짱e :
출처 : 우키의 블로그우키의 블로그( http://jaewook.net/index.php?pl=296 )



이 프로그램은 사용에 제한이 없는 Freeware입니다.
덩치는 작지만 CPU에 관련한 정보라면 아낌없이 보여주는 유틸리티죠
파일을 실행하는 것만으로 CPU 뿐만 아니라 메인보드나 메모리의 세부 정보를 알수있습니다

◆주요기능
CPU 정보 보기 - 모델, 코드 이름, 브랜드 ID, 클럭, 캐시, 패키지 방식, 전압,
패밀리, 스테핑, 명령어 셋트
메인보드 정보 보기 - 모델, 제조사, 메인보드 칩셋, 바이오스 브랜드, 바이오스 버전,
그래픽 인터페이스, L1/L2 캐시
메모리 정보 보기 - 크기, 속도, 전압, 모듈
보고서 작성 - HTML 형식



나중에 필요 할때가 있을 것 같군. 그랴..
Posted by 장안동베짱e :
인천에서 비행기로 불과 1시간 30분 거리인 중국 상하이에 가보면 우리가 우물 안의 개구리 아닌가 하는 생각에 한숨이 절로 나온다. 큰 강과 바다를 끼고 눈 부시게 발전하는 포동지역은 서울과 비교가 되지 않을 정도로 활기가 넘친다. 기업을 도와주려는 중앙정부의 열의 또한 한국과 비교된다. 이곳에 주재하는 어느 대기업 현지법인 사장은 한국의 동북아허브계획에 대해 “어디서 허브라 는 말은 들어가지고…”라며 이젠 거의 끝난 게임이라고 단언했다.
수도이전에 대한 헌법재판소의 결정이 잘된 일인지 아닌지 아직 판단하기는 이 르다. 하지만 수도이전 추진과정을 보면 답답하기 짝이 없다. 국토 균형발전과 지방분권이 물론 중요하지만 선진국이 되려면 서울이 동아시아 중심도시로서 베이징, 상하이, 도쿄, 홍콩 등과 경쟁해야 한다. 좁은 국토에서 수도권과 비 수도권으로 나눠 싸우는 사이 외국 경쟁도시들은 세계를 향해 내달리고 있다. 수도이전보다 더 중요한 일은 서울을 어떻게 하면 한국의 대표선수로 키우느냐 다.

얼마 전 파이낸셜타임스(FT)에는 ‘어떻게 하버드가 앞서게 됐나’라는 제목의 커버스토리가 실렸다. 이 신문은 세계 최고의 대학이던 영국 옥스포드는 모든 대학을 똑같이 지원해야 한다는 평등주의 때문에 하강곡선을 그린 반면 미국 하버드는 재원마련, 최고의 학생, 최상의 교수진을 확보하기 위해 치열한 경쟁 을 벌였고, 이 경쟁이 미국대학들을 세계 최고로 끌어올렸다고 분석했다. 미국 대학의 캠퍼스를 걸으면 밤새 불이 켜져 있는데 옥스포드에는 식탁에나 불이 켜져 있을 정도란다. FT는 “가난한 집 자녀도 최고의 교육을 받을 수 있는 평 등주의적 꿈을 실현한 것은 하버드의 경쟁적인 시장제도이지, 국가가 아니다” 라고 지적했다.

요즘 논란이 되고 있는 대입 개선안도 그렇다. 조선시대처럼 대문을 걸어 잠그 고 우리끼리 오손도손 살 수 있다면 서울대학을 없애도 되고 로또식으로 대학 신입생을 뽑아도 된다. 하지만 한국대학의 경쟁상대는 미국의 하버드대, 일본 의 동경대, 중국의 베이징대나 칭화대이다. 서울대의 국제경쟁력은 전세계 대 학 중 고작 150위권 정도(중국 상하이 자오퉁대 조사)에 불과하다. 서울대 위 기는 국가 장래를 짊어질 엘리트육성의 위험신호인 동시에 장기적으로 국가경 쟁력 추락으로 이어질 것이다.

평등의 원칙은 ‘같은 것은 같게, 다른 것은 다르게’대우하는 것이다. 같은 것을 다르게 대우하는 것도 잘못된 일이지만 다른 것을 같게 취급하는 경우에 도 명백히 차별이며 사회정의에 역행한다. 미래학자 앨빈 토플러는 한국은 교 육부터 혁명을 해야 한다고 일침을 놓은 적이 있다. 답은 매일경제신문이 2000 년 5월 발표한 학습혁명보고서에 나와 있다. 이 보고서는 창조적 인재국가가 되기 위해서는 교육(Teaching)이 아닌 학습(Learning) 중심, 시장주의(국가통 제로부터 학교독립), 기업이 교육주체로 참여하고 교육부와 노동부를 통·폐합 시켜 평생학습고용부를 신설하는 내용을 담고 있다.

한국이 선진국이 되려면 각 부문에서 세계 일류와 경쟁해서 이겨야 한다. 삼성 전자, 포스코, 현대자동차, 현대중공업, SK텔레콤 등 대표선수들이 세계 1위가 되면 그게 바로 선진국이다. 세상이 광속으로 빠르게 바뀌는데 개혁이라는 미 명으로 좁은 땅에서 도토리 키재기 하듯 왈가왈부하는 것은 코미디적인 발상이 다.

지금처럼 1등을 끌어내리는 평준화로는 미래가 없다. 사회주의가 우월한 이념 이지만 나라 살림이 거덜난 이유는 경쟁없이 평등 타령만 했기 때문이다. 한국 은 소득 2만달러 달성은커녕 자꾸 못사는 쪽으로 달려가고 있다. 지뢰밭보다 더 무서운 평등화의 덫에서 탈출하는 길 외에는 대안이 없어 보인다.

<윤영걸 주간국장>



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
전적으로 동감한다.
자본주의 국가에서 중고등학교, 대학, 기업들이 평등하게 대우를 받는다는건 말도 안된다.
평등 보다는 능력에 맞는 대우와 지원이 필요하다.
그리고 평등이란 말의 의미도 그런곳에 갖다붙일 성격의 단어가 되진 않는다.
그것에 평등이란 말을 같다 붙이는 행위는 똑같은 시험치르고 어떤 놈은 10개 다 맞고 어떤 놈은 5개밖에 안맞았는데 '평등하게 둘다 100점 달라'라고 주장하는 것과 다르지 않다.

애시당초 처지는 놈들은 마이너리그로, 잘뛰는놈은 올림픽에 출전 시켜야 한다.
처지는 놈에게 평등하게 올림픽출전권을 줄수는 없다.

그게 싫다면 공산주의 국가로 가던가..
그것도 싫다면 죽기 살기로 뛰어라 !

『세상은 원래 불공평하다.. 하지만 노력으로 그차이를 메꿀뿐이다..』
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Posted by 장안동베짱e :
10대 천재 소년이 난공불락의 마이크로소프트(MS) 왕국을 무너뜨릴 수 있을까.

영국 일간 더 타임스는 4일 미국 마이애미에 사는 블레이크 로스(19)가 새로운 무료 인터넷브라우저를 고안, 빌 게이츠 MS 회장을 악몽으로 몰아넣고 있다고 소개했다.

로스가 만들어낸 브라우저 ‘파이어폭스’는 지난해 11월 공개된 후 약 1천5백만명이 다운로드할 만큼 인기를 끌고 있다. 웹브라우저 시장을 독점하다시피 해온 ‘MS 인터넷 익스플로러’의 위상을 위협하고 있다는 게 업계의 평가다.

업계 분석가들은 파이어폭스의 장점으로 ▲속도가 빠르고 ▲창 하나에 여러 사이트를 탭 형식으로 띄울 수 있으며 ▲바이러스·광고 차단 기능이 우수한 점 등을 들고 있다. 파이어폭스는 특히 인터넷상에서 무료로 구할 수 있고 소스코드와 기술이 공개된 ‘오픈 소스’ 소프트웨어다.

‘소프트웨어의 천재’로 불리는 로스는 피아노를 잘 치고 글솜씨도 빼어나다. 그의 어머니는 “이 아이는 무엇을 하든 잘 한다”고 자랑스러워 했다. 로스는 7살 때부터 컴퓨터 게임에 빠졌고 10살 때 자신의 웹사이트를 만들었다.

인생의 전기를 맞은 것은 14살 때 브라우저 업체인 넷스케이프사에서 인턴십을 하게 되면서다. 여기서 그는 오픈 소스 운동을 주도하는 비영리단체인 모질라 재단을 소개받았다.

모질라는 당시 익스플로러에 대항하는 대안브라우저의 개발을 시도하고 있었다. 로스와 그의 친구인 데이비드 하얏트도 이 작업에 합류, 사용자에게 초점을 맞춘 브라우저 개발에 들어갔다. 시험용 프로젝트로 나온 ‘작품’이 파이어폭스였다.

로스·하얏트 콤비는 대학에 진학하는 바람에 파이어폭스의 완성을 보지는 못했다. 하지만 모질라는 이들을 작업과정에서 획기적 돌파구를 연 ‘위대한 공헌자’로 대우하고 있다.

현재 스탠포드대에서 컴퓨터공학을 전공중인 로스는 아무런 물질적 보상도 없이 오픈 소스 소프트웨어 개발에 ‘자원봉사’하고 있다.

〈김민아기자 makim@kyunghyang.com〉

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
파이어 폭스 나온지가 언젠데 이난리야.. ㅡ,ㅡa;;

아무튼..개발한 녀석이 10대라니 좀 의외긴 해..
19살이면... 우리나라 나이로 20~21살정도 됐나..?
짜아식, 쫌 하네~ 흣 ^^

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

[CODE] #define SCHAR_MIN (-128) /* minimum signed char value */ #define SCHAR_MAX 127 /* maximum signed char value */ #define SHRT_MIN (-32768) /* minimum (signed) short value */ #define SHRT_MAX 32767 /* maximum (signed) short value */ #define USHRT_MAX 0xffff /* maximum unsigned short value */ #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */ #define UINT_MAX 0xffffffff /* maximum unsigned int value */ #define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */ #define LONG_MAX 2147483647L /* maximum (signed) long value */ #define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */ [/CODE]


흠.. 외우고 있기엔 좀 거시기해스..



Posted by 장안동베짱e :

[CODE] #include<time.h> { .... clock_t start, stop; double duration; start = clock(); (시간잴소스 코드...) stop=clock(); /*CLK_TCK=초당 똑닥거리는 수 */ duration = ((double) (stop-start)) / CLK_TCK; ..... } [/CODE]

으.. 요즘 날씨가 많이 춥다...

따듯하게 입고다녀야지..



.
Posted by 장안동베짱e :



메신저에 뿌리기 : http://news.paran.com/scartoon/cartoonview.php?dir=518&id=5180045
블로그에 붙이기 : <img src="http://ntafile.paran.com/UPLOAD/Cartoon/nangam_045.jpg">



Posted by 장안동베짱e :