관계형 데이터베이스

 - 관계형 데이터베이스(Relational - Database) 시스템은 가장 대표적인 데이터베이스 시스템으로써 성공적인 데이터 모델이 되었습니다. 이렇게 된 이유에는 다음과 같은 몇 가지 특징이 있었기 때문입니다.



첫째, 2차원 구조의 모델을 기반으로 한다.
 - 기존 파일 시스템은 계층적인 수직적 구조를 가진 반면 관계형 모델은 수평적 구조이며 2차원적인 구조입니다. 우리가 많이 사용하는 엑셀 시트가 2차원적 구조의 대표적인 예입니다. 이러한 구조는 컴퓨터가 등장하기 훨씬 전인 종이에 기록하는 시대부터 많이 사용되어 왔고, 그만큼 누구에게나 친숙하고 이해하기 쉬운 구조라 할 수 있습니다. 관계형 모델은 데이터들을 이러한 2차원적인 구조를 가진 테이블 형태로 저장하는 구조를 기본으로 하고 있습니다.


둘째, 데이터의 무결성(Integrity), 트랜젝션 처리 등 데이터베이스 관리 시스템으로써의 기본적인 기능면에서 뛰어난 성능을 보여주었다.


셋째, 질의어(Query Language)를 사용한 데이터 접근 방법이다.
 - 초기 데이터베이스 모델들은 특정 정보를 검색하려면 해당 정보를 찾아가는 과정과 방법을 모두 개별 어플리케이션으로 구현해야만 했습니다. 따라서 그만큼 어플리케이션에 종속적이며 데이터를 추출하거나 저장하는 등의 작업을 수행할 때 효율성이 떨어지게 되었습니다. 이에 반해 질의어는 일정한 패턴이 있으며 이 패턴에만 맞게 질의하고자 하는 조건들을 나열하면 찾고자 하는 정보를 검색해 줍니다. 즉, 데이터베이스 사용자 입장에서는 개별 어플리케이션에 비해 상대적으로 간단한 질의어만 알고 있으면 원하는 정보를 쉽게 얻을 수 있게 된 것입니다. 이러한 접근법은 누구나 쉽게 데이터베이스의 정보를 검색할 수 있다는 점에서 시장에서 큰 환영을 받았습니다.





객체지향형 데이터베이스
 - 관계형 데이터 모델의 여러 가지 장점들로 인해 관계형 데이터베이스가 만능인 것처럼 생각되었지만 시간이 지나면서 몇 가지 문제들이 발생하였습니다. 기존에 내포하고 있던 문제라기보다는 새로운 요구사항의 발생으로 인한 문제였습니다.
  1990년대 들어오면서 어플리케이션들이 기존에 비해 더 많고 복잡한 처리를 하게 됨에 따라 데이터베이스도 좀 더 복잡한 데이터, 예를 들어 사용자 정의 데이터, 오디오 및 비디오 등의 멀티미디어 데이터 등에 대한 저장 및 과닐의 필요성이 대두되었다. 하지만 기존의 관계형 모델로는 이러한 데이터 타입을 지원하는 것이 어려웠으며, 1980년대 등장한 객체지향(Object Oriented) 기술을 데이터베이스에 접목하려는 시도가 생겨났다.
  사실 객체지향 기술은 데이터베이스가 아닌 프로그래밍 분야에서 시작된 기술이다. 모든 사물을 객체로 보고 이 객체들에 대한 정의와 처리방법을 정의한 기술입니다. 그렇다면 관계형 데이터베이스가 할 수 없었던 기능을 수행하는 객체지향 데이터베이스(Object-oriented Database)는 도대체 어떤 특징을 가지고 있는지 살펴봅시다.


첫째, 사용자가 정의한 사용자 정의 타입을 지원한다.
 - 사용자 정의 타입이란 말 그대로 사용자가 임의로 정의한 데이터 유형을 말하며, 기본형 데이터 타입을 뛰어넘어 다양한 형태의 데이터들을 다룰 수 있게 해준다.


둘째, 비정형 복합 정보의 모델링이 가능하다.
 - 비정형 정보(Unstructured Information)란 일반적인 관계형 데이터베이스에서 지원되는 날짜, 문자, 숫자 등의 데이터들을 일컫는 정형 정보(Structured Information)와는 반대되는 개념으로 멀티미디어, 이메일, 문서 등이 이에 해당된다.


셋째, 객체들 사이의 참조(reference)구조를 이용한 접근이 가능하다.


넷째, 90년대에 등장한 많은 객체지향 프로그래밍 언어들과 객체지향 데이터베이스의 스키마 구조가 유사하다는 점이다.
 - 다시 말하지만 데이터베이스는 그 근원이 프로그래밍 언어에서 나왔으므로 객체지향언어를 사용하는(사실 요즘 거의 대부분이 객체지향 언어입니다.) 개발자들의 입장에서 볼 때, 프로그램에서 사용하는 객체들과 데이터베이스 스키마 구조가 유사하다는 점은 프로그램과 데이터베이스 간에 발생하는 추가적인 변환 처리작업을 할 필요가 없어진다는 점을 의미합니다.





객체관계형 데이터베이스
 - 객체관계형 데이터베이스(Object-relational Database)는 기존의 관꼐형 데이터베이스 시스템들이 객체지향 데이터베이스가 제공하는 기능들 중 장점들만을 선별하여 관계형 모델에 통합한 새로운 개념의 데이터베이스입니다. 이것은 안정적으로 데이터베이스의 기본 기능을 지원하는 관꼐형 모델을 기반으로 하면서 객체지향 모델의 장점을 추가한 것입니다. 관계객체형이 아니라 객체관계형으로 표현되어 객체지향이 기반이라고 생각할 소지가 있지만 오해하지 않았으면 합니다. 아마 알파벳 순서로 나열하다 보니 이런식의 용어가 정의된 것 같다고 생각합니다.
  그러면 객체관계형 데이터베이스는 어떤 특징을 가지고 있을까요? 쉽게 추측할 수 있듯이 관계형 데이터베이스의 특징 모두를 가지면서 객체지향 데이터베이스의 장점을 고스란히 갖고 있을 것입니다. 기존의 관계형 데이터베이스에 추가된 특징들만 대표적으로 나열하면 다음과 같습니다.


첫째, 사용자 정의 타입을 지원한다.


둘째, 참조 타입을 지원한다.
 - 참조(reference) 타입이란 객체들로 이루어진 객체 테이블의 경우, 하나의 레코드가 다른 레코드를 참조할 수 있는 것을 말합니다. 관계형 데이터베이스에서는 다른 레코드와 연관관계를 조인을 통해서만 나타낼 수 있었지만, 객체 관계형은 참조 구조를 사용하여 객체지향이 가진 내비게이션 기반 접은이 가능하게 되었습니다.


셋째, 중첩 테이블을 지원한다.
 - 중첩(nested) 테이블이란 테이블을 구성하는 로우(Row) 자체가 또 다른 테이블로 구성되는 테이블을 말합니다. 이러한 구조는 좀 더 복잡하고 복합적인 정보를 표현하는 것을 가능하게 하였습니다.


넷째, 대단위 객체의 저장, 추출이 가능하게 되었다.
 - 이미지 오디오 및 비디오 등 멀티미디어에서는 기존의 일반적인 정형 데이터들보다는 그 크기가 상대적으로 큽니다. 이러한 데이터 유형을 지원하기 위해 대단위 객체(LOB, Large Object) 타입이 기본 타입으로 지원되었습니다.


마지막으로 객체 간의 상속 관계를 지원하는 것이 가능해졌다.
 - 오라클의 경우 OBJECT타입을 지원함으로써 상속(inheritance) 기능을 구현하고 있습니다.


 구분 관계형 데이터베이스 객체지향 데이터베이스 객체관계형 데이터베이스
 데이터 모델 문자, 숫자, 날짜 등
단순 정보타입만 지원
사용자 정의 타입,
비정형 정보타입 지원
사용자 정의,
비정형 정보타입 지원
 대규모 정보처리 우수 보통 우수
 안전성 우수 보통 우수
 장점 사용하기 쉽고,
편리하며 안정적이다.
복잡한 구조의
정보 모델링 가능
관계형 데이터베이스의 안정성에 객체지향 모델링 장점을 추가
 단점 확장성이 부족,
복합적 정보표현 어려움
기본적인 데이터베이스 기능에 있어 안정성과 성능이 떨어짐   




페도라 리눅스를 실행시키면,



윈도우즈에서는 명령프롬프트와 비슷한 터미널입니다.

bash: mycommand: command not found
터미널에서 나타나는 오류들입니다.
이것들은
ㅁ 사용자가 명령어 이름을 잘못 타이핑 했을 때,
ㅁ 명령어가 여러분이 위치한 경로에 있지 않을 때,
ㅁ 명령어 실행을 위해 root 사용자 권한이 필요할 때,
ㅁ 명령어가 사용자의 컴퓨터에 설치되지 않았을 때,
로 나뉘어 집니다.


그렇다면 명령어를 알아낼 수 있는 방법 없을까요?? 리눅스는 똘똘한 녀석이다보니 명령어를 찾는 명령어도 있습니다.

$ type mount
 - PATH 경로에서 첫 번째 mount 명령을 보여준다.

$ whereis mount
 - mount에 대한 binary, source, man 페이지를 보여준다.

$ locate bash.ps
 - 파일 시스템에서 back.ps가 어디 있는지 찾는다.

$ which umount
 - PATH 경로에 지정된 위치 또는 aliases에서 umount 명령을 찾아준다.

$ rpm -qal |grep umount
 - umount 명령어를 설치된 패키지에서 찾는다.

$ yum whatprovides bzfs
 - bzfs를 bzflag패키지에서 찾는다.




 ※ 기존의 리눅스와 UNIX 문서는 일반적으로 man페이지라고 하는 메뉴얼로 제작되고 있습니다. 약간의 더 세련된 문서 작업은 나중에 info 시스템과 함계 진행되었습니다. 그리고 각 명령어는 자체적으로 help메시지를 항상 보유하고 있습니다.

도움 메시지 사용(--help)

$ls --help | less
 - 뜻    : ls명령어를 위한 도움말을 표시
 - 출력 : Usage: ls [OPTION]...[FILE]...
            List information about the FILEs(the current directory by default).
            Sort entries alphabetically if none of -cftuSUX nor --sort.
            Mandatory arguments to long options are mandatory for short options.
              -a, --all                                  do not hide entries starting with.
              -A, --almost-all                       do not list implied. and...
                   --author                             with -l, print the author of each file
                                                 .
                                                 .
                                                 .
                                                 .

  바로 앞의 출력은 ls 커맨드라인이 어떻게 사용되고, 이용 가능한 옵션에는 무엇이 있는지 리스팅해 준다.

man 페이지의 사용

man페이지란?
- 명령어 도움말 페이지
- 서버 관리시 숙달되지 않은 명령어의 사용법이나 옵션들을 알고자 할 때 사용한다.


사용자가 어떤 단어와 관계가 있는 명령어를 man페이지에서 찾기를 원한다면 man페이지 데이터베이스를 찾아보는 apropos명령어를 사용하면 됩니다. 다음 명령어는 man페이지 NAME라인에서 crontab을 가지는 페이지를 보여줍니다.

$apropos crontab
...
/etc/anacrontab [anacrontab] (5) - configuration file for anacron
crontab                    (1)    - maintain crontab files for individual
                                      users (ISC Cron V4.1)
crontab                    (5)    - tables for driving cron ( ISC Cron V4.1)
crontabs                  (4) - configuration and scripts for running periodical jobs
...

 apropos 출력은 crontab을 포함하는 각 man 페이지 NAME라인을 보여준다. 숫자는 man 페이지에 나타나는 man 페이지 섹션을 보여줍니다.
 whatis명령어는 사용자가 입력한 단어를 포함하는 NAME라인만을 보여주는 방법입니다.

$whatis cat
cat                         (1)     - concatenate files and print on the standard output

 용어로 man페이지를 찾는 가장 쉬운 방법은 man 명령어 다음에 명령어 이름을 적는 것이다. 예를 들면, 다음과 같습니다.

$man find
FIND(1)                                        FIND(1)
NAME
            find - search for files in a directory hierarchy
SYNOPSIS
            find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...][expression]
...

이상과 같이 find 명령어와 관련된 첫 번째 man페이지를 표시합니다. 사용자가 이전의 예에서 보았던 것처럼, 일부 용어는 여러 가지의 man 페이지를 가집니다. 예를 들어, crontab으로 검색을 하게 되면 crontab 명령어와 crontab과 관련된 파일들에 대한 man페이지들이 나타납니다.

Man 페이지들은 여러가지 section별로 구성되어 있습니다.

 섹션
   1          - 일반 사용자 명령어
   2          - 시스템
   3          - 프로그래밍 루틴/라이브러리 함수
   4          - special 파일
   5          - configuration 파일과 파일 형식
   6          - 게임
   7          - 미분류 명령어들
   8          - 관리 명령어와 데몬들

  다음 코드들은 man 명령어에서 유용한 몇가지 옵션을 보여줍니다.
 $man mount -a               Show all man pages related to component
 $man 5 crontab               Show section 5 man page for component
 $man mount -P more       Use more, not less to page through
 $man --path                   List locations of man directories
/user/kerberos/man:/usr/local/share/man:/usr/share/man/en:
/usr/share/man:/usr/X11R6/man:/usr/local/man
 $man -f mount                 Same as the whatis command
 $man -k mount                Same as the apropos command

오랫동안, man 페이지를 표시하고 작동하는 방법들은 발전해 왔습니다. 예를 들면, man페이지를 man2html명령어를 사용하여 웹페이지(HTML)로 전환할 수도 있습니다. 예를 들면, 다음과 같습니다.

$where -m cat
cat: /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
$cd /tmp ; cp/usr/share/man/man1/cat.1.gz .
$gunzip cat.1.gz
$links cat.1.html

 첫 번째 명령은 cat man페이지를 찾습니다. 다음 명령은 그 man페이지를 /tmp 디렉터리에 복사하고 압축을 풉니다. 다음으로 man2html 명령어는 man페이지를 HTML(cat1.html파일)로 변환합니다. 그러고 나서 link(커맨드라인 기반의 웹브라우저)는 shell에서 웹 스타일의 man 페이지를 보여줍니다(link또는 elinks 텍스트 기반의 웹브라우저를 사용하기 위해서는 elinks패키지를 설치할 필요가 있다).




알아두기
$ reboot - 다시 시작
$ poweroff - 종료
입니다.

[윈도우 기반의 서버프로그래밍]

헤더파일
winsock2.h

라이브러리파일
ws2_32.lib

윈도우 기반의 서버프로그래밍에서 서버든 클라이언트든지
저 두가지가 없으면 안됩니다!!!

일단 WSADATA부터 알아볼까요?

typedef struct WSAData
{
 WORD              wVersion;
 WORD              wHighVersion;
 char                 szDescription[WSADESCRIPTION_LEN+1];
 char                 szSystemStatus[WSASYS_STATUS_LEN+1];
 unsigned short  iMaxSockets;
 unsigned short  iMaxUdpDg;
char FAR*          lpVendorInfo;
} WSADATA, FAR *LPWSADATA;

멤버변수

wVersion
 - 윈도우 소켓 버전.

wHighVersion
 - 윈도우 소켓의 가장 높은 버전. 통상적으로 wVersion과 같다.

szDescription
 - 윈도우 소켓 DLL이 관련한 지위 또는 구성정보를 카피하는 NULL로 끝나는 아스키 문자열.

iMaxSockets
 - 하나의 프로세스가 열 수 있는 소켓의 최대 수.

iMaxUdpDg
 - 데이터그램 프로토콜의 최대 바이트 단위.
    예를 들어, 버클리 소켓은 8192 바이트의 제한을 사용한다. 최저는 512.

lpVendorInfo
 - 벤더에 특유의 데이터 structure의 far pointer.


이것이 끝인데 솔직히 모르고 있어도 네트워크 프로그래밍 잘만 된다;;




다음으로 알아볼것은 WSAStartup함수
형태는
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
주로 윈속관련 라이브러리를 초기화하고, 그 데이터를 WSADATA에 넣어줄 때 쓰입니다.

매개변수
wVersionRequested : 프로그래머가 사용할 윈속의 버전정보 전달.
lpWSAData              : WSADATA라는 구조체 변수의 주소 값 전달.

반환값
 - 성공 시 0, 실패 시 0이 아닌 에러코드 값 반환

이렇게 됩니다.
wVersionRequested에는 보통 MAKEWORD라는 함수를 넣는데요

사용법
MAKEWORD(1,2); //주 버전 1, 부 버전 2, 0x0201반환
MAKEWORD(2,2); //주 버전 2, 부 버전 2, 0x0202반환
이렇게 됩니다.

마지막으로 WSACleanup함수입니다.
형태는
int WSACleanup(void); 입니다.
주로 윈속 관련 라이브러리를 해제할 때 사용합니다.

반환값
 - 성공 시 0, 실패 시 SOCKET_ERROR반환


int main()
{
  WSADATA wsaData;
  . . . .
 if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
      Error("WSAStartup() error!");
  . . . .
  WSACleanup();
return 0;
}

맨날 남이 포스팅한것만 보다가 직접 포스팅 해보니까

매우... 힘드네요. 여태까지 저에게 도움을 줬던 포스트들 너무 너무 너무

고맙습니다.ㅜ;;

아무튼 본격적인 Fedora설치 시작할께요.
왼쪽 상단에 보이시는 Favorites에 보면 FedoraServer라고 보이시는 것을 클릭해주세요.



 

그러면 이런 창이 뜨는데 저기 동그라미 쳐져있는 것을 클릭하면 Fedora가 부팅됩니다.

 

그리고 오른쪽 하단에 저것 보이시죠? 저게 바로 CD롬인데 ISO파일이나 CD를 불러오는 버튼입니다.





VMWare가 부팅됩니다.






Log In해주시구요.





Install to Hard Drive보이시죠. 클릭하고 Enter눌러주세요`~






드디어 Install시작 Next~!





언어 설정 Korean으로~





Basic Storage Devices를 선택하고





자신이 설치하고 싶은 HardWare를 선택...




Error메시지입니다. Re Initialize all을 선택해 주세요.





이거 나오기 전에 에러메시지 하나 더 뜨시는 분이 계실텐데 그것도 포맷하겠다고 눌러주심 되요.
HostName적어주시고 Next





시간대 설정해주시고 Next





Password입니다. 적어주시고 Next





사전에 있는 단어라고 쓰고싶음 쓰고 말고싶음 말라는 경고문입니다. Use Anyway눌러주세요.




아.. 여기서부터 쬐끔 어려워지는데요...
Create Custom Layout을 선택하고 Next





이제 파티션입니다. Linux에서는 파티션을 나눌 때, 조금 세밀하게 나눠주어야 하는데요.





Standard Partition하시고 Create





부팅할 때, 필요한 것들을 저장할 Size를 지정해 파일에 담아주는 겁니다.
Mouse Point를 /boot으로 설정해 주시고, File System Type은 ext3, Size는 300~500MB으로 설정해주신 후, OK를 눌러주시면 됩니다.





이번에 설정할 것은 가상메모리입니다. 보통은 아까 설정한 메모리에서 2배정도 설정해주시면 됩니다.





그 후, 설정해주어야 할 것은 사용자가 실제로 쓸 Hardware의 용량입니다.
아래처럼 설정해 주시고, OK를 눌러주세요.





아래처럼 설정된 것들이 보이시죠? Next를 눌러주세요.





Format을 눌러주시구요.





아래같이 설정이 됐다면 Next를 눌러주세요.




설치가 시작됩니다.




이렇게 설치가 끝납니다.

설치 완료 후, 재부팅 해주시구요. 그 다음에 설정해야 하는 것들은 사용자 정의 설정이기 때문에

여러분들이 알아서 체크해주시면 됩니다.


 

바탕화면에서 아래의 아이콘을 찾아서 더블클릭






OK누르시고...





이제 New Virtual Machin을 클릭해줍니다.





그리고 Custom에 체크를 하고 Next






그러면 아래와 같은 창이 뜨는데 Hardware compatibility : 를 Workstation 6.5-7.0으로 다음의 그림과 같이 맞춰줍니다.





그 후 CD를 삽입하여 CD가 있는 드라이브(첫번째에 체크 )를 설정해 주면 됩니다.
iso파일인 경우에는 두번째체크박스인 Installer disc image file(iso)를 체크하고, 경로를 설정해주면 됩니다.(iso다운은 http://fedoraproject.org/get-fedora)에서 받으세요. 불법 아닙니다.)





아래의 체크박스에서 Linux를 선택한 후 Version을 Other Linux 2.6.x kernel로 바꿔줍니다.




Location은 virtual machine설치 장소이고, Virtual machine name은 사용하고 싶은 이름을 설정하여 next를 눌러줍니다.





그 후 processors와 cores per processor를 1로 맞춰주고 next





이것은 Virtual Machine에 사용할 렘입니다. 보통은 256으로 맞추는데 저는 널널하게 512로 맞췄어요. 자신의 렘 성능에 맞게 써주세요;;




2번째 체크박스 클릭하고 next





LSI Logic(Recommended)선택





Create a new virtual disk 선택





SCSI(Recommended)선택하고





이곳은 virtual machine의 harddisk를 설정하는 부분 맨위의 칸에 원하는 gb를 설정한다.





HardDisk로 쓸 vmdk확장자의 이름을 정해주는 곳. next~!





이제 거의 끝났군요;;





완료됐을 때의 화면입니다.





이제 VirtualMachine의 성능을 업그레이드 하는 법과 다운그레이드 하는 법입니다.
먼저 렘부터. 아래 사진을 보면 Memory 512MB부분에 붉은 동그라미 보이시죠.
그걸 더블클릭해주세요.





그러면 이런창이 뜰꺼에요. 그럼 아래의 그림처럼 오른쪽 부분에 동그라미 안의 숫자를 바꾸면 렘의 용량이 바뀝니다.





이번엔 HardDisk의 용량을 바꿔보겠습니다.
아래의 그림처럼 붉은 동그라미를 더블클릭.





그 후 HardDisk를 Remove시켜버려요.
(만약에 이곳에 운영체제 깔고 Remove하는거면 당장멈춰요. 다 날아가버릴지도 몰라요.)





그 후 Add해주면 됩니다.





그럼 이런게 뜨는데 첫번째 HardDisk를 클릭하고 Next





첫번째 체크박스(Create a new virtual disk를 클릭하고 next~!)





SCSI를 클릭하고 Next~!





여기서 용량을 적어주고 Next~!





그 다음에 이름을 설정 Next





드디어 완료...ㅜ;;




Fedora설치는 3에서 할께요.


next를 눌러 다음으로


typical은 기본적으로 설정되어 있는 프로그램들만 인스톨됨.
custom은 자신이 마음대로 설치할 수 있음.
잘 아시는 분은 custom쓰시면 되구요. 잘 모르시는 분들은 typical쓰시면 됩니다.


어떤 환경에서 작업을 하실것인지 설정하는 것입니다.
debuggers는 vmware가 문제가 생겼을 경우 그 시스템을 디버깅하기 위해 있는것입니다.
visual studio쓰시는 분은 첫번재 체크
eclipse로 자바프로그래밍 하시는 분은 두번재 체크
eclipse로 c나 c++쓰시는 분은 세번째것을 체크해주세요.
프로그래밍 안하시는 분은 체크안해도 됩니다.


이건 영어읽어보면 다 알겠죠?


인스톨 되네요...


시리얼 넘버 입력해주시구요.


끝났습니다. 이제 Workstation설정하면 되겠네요.

BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
                                UINT wMsgFilterMax);
리턴값 - false면 윈도우 종료

BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
                                UINT wMsgFilterMax,UINT wRemoveMsg);
리턴값 - 메시지를 가져오면 true, 가져오지 못하면 false

LPMSG lpMsg
 - 메세지 구조체의 포인터
HWND hWnd
 - 메세지 큐를 확인할 윈도우의 핸들
UINT wMsgFilterMin
 - 최소값을 넘겨주면 최소값보다 작은 메세지는 가져오지 않는다. (보통 0)
UINT wMsgFilterMax
 - 최대값을 넘겨주면 최대값보다 큰 메세지는 가져오지 않는다. (보통 0)
UINT wRemoveMsg
 - 플래그 값



차이점 - GetMessage함수는 메시지 큐에서 메시지를 받아올 때까지 계속 기다린다.
           하지만 PeekMessage함수는 메시지큐에 메시지가 없어도 기다리지 않고 false를 리턴한다.


활   용 - 메시지 큐에 메시지가 없을 때, 데드타임이 발생하는데
         GetMessage를 사용한다면 데드타임을 활용할 수 없다.
         하지만 PeekMessage를 사용할 경우 이 데드타임을 활용할 수 있다.

데드타임 - 이 때는 주로 프레임을 그려주거나 프레임을 업데이트 시켜주는 일을 시킨다.

 여러개의 쓰레드가 동시에 하나의 변수를 변경시켜줄 때, 문제가 생기는 것을 방지하기 위해 쓰레드에 순위를 매겨서 처리하는 방식의 세마포어와는 달리 뮤텍스는 쓰레드가 들어오는 순서대로 처리해 주는 방식으로 사용한다.



class CMutex
{
private:
    static HANDLE m_mutex;    //뮤텍스 핸들
    DWORD m_owner; //지금 Lock되어있는 Thread ID값
public:
    static void Init();
    static void Remove();
    CMutex();
    ~CMutex();
    void Lock();
    void Unlock();
};

void CMutex::Init()
{
    m_mutex = CreateMutex(NULL,FALSE,NULL);
    memset(&m_owner, 0, sizeof(DWORD));
}
void CMutex::Remove()
{
    WaitForSingleObject(m_mutex,INFINITE);
    CloseHandle(m_mutex);
}

CMutex::CMutex()
{
}

CMutex::~CMutex()
{
}

void CMutex::Lock()
{
 DWORD ThreadID = GetCurrentThreadId();
    if(m_owner != ThreadID)
    {
        WaitForSingleObject(m_mutex,INFINITE);
        m_owner = ThreadID;<br />
    }
}

void CMutex::UnLock()
{
    DWORD ThreadID = GetCurrentThreadId();
    if(m_owner == ThreadID)
    {
        ReleaseMutex(m_mutex);
        memset(&m_owner,0,sizeof(DWORD));
    }
}
 

 쓰레드에서 다른 쓰레드와 공유중인 변수를 쓰기전에 Lock()로 막아 놓으면 WaitForSingleObject(m_mutex,INFINITE)에 의해 다른 쓰레드는 뮤텍스가 ReleaseMutex(m_mutex)되기를 기다리게 된다.



예전에 한번 파티클을 구현해 본적이 있는데 꽤나 단순하게 구현했습니다.
 그냥 아무렇게나 규칙에 맞춰 화면에 텍스쳐 잔뜩 뿌려주고, 좌표값 바꿔주고, 색상값 바꿔주고, 로테이션값 바꿔주면 됩니다. 하지만 그냥 이렇게만 하면 자연스러운 파티클은 나오지 않습니다.

위    - 자연스럽지 못한 파티클
아래 - 자연스러운 파티클

  위쪽 사진은 그냥 텍스쳐를 부려주는 것이고, 아래쪽의 사진은 텍스쳐를 뿌려주며 텍스쳐들의 색상값을 겹치게 하여 뿌리는 것입니다.

DXUTGetD3D9Device()->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
DXUTGetD3D9Device()->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
DXUTGetD3D9Device()->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);

 Draw하기 전에 위의 세줄을 입력하여 출력결과를 보십시요. 아마... 배경색과 합쳐져서 보이게 될 것입니다. 하지만 배경의 색이 검은색이라면 색이 전혀 합쳐지지 않고 그대로 출력되는 것을 볼 수 있습니다. 하지만 항상 배경색이 검은색으로 돼있을리는 없습니다.


void SetRenderTarget(LPDIRECT3DTEXTURE9 pTexture)
{
 LPDIRECT3DSURFACE9 pSurface;
 HRESULT hr = pTexture->GetSurfaceLevel(0, &pSurface);
 DXUTGetD3D9Device()->SetRenderTarget(0, pSurface);
 pSurface->Release();
}

void SetRenderTargetToOrigin(LPDIRECT3DSURFACE9 pTexture, bool EXIT)
{
 static LPDIRECT3DSURFACE9 _Origin = pTexture;
 DXUTGetD3D9Device()->SetRenderTarget(0,_Origin);
 if(EXIT)
  _Origin->Release();
}

 위의 두 함수는 사용자 정의 함수입니다. 첫번째 역할은 백버퍼를 자신이 원하는 LPDIRECT3DTEXTURE9형을 가진 변수로 바꾸는 것이고, 두번째 함수의 역할은 백버퍼를 원래의 백버퍼로 돌려놓는 것입니다. 
 SetRenderTarget을 이용해 어떤 텍스처에 그릴지 선택하고 그 텍스처에 r:0 g:0 b:0 a:0으로 색을 맞춰서 클리어해줍니다. 그리고 자신이 그리고 싶은 그림(Texture)을 그립니다(render). 그 다음SetRenderTargetToOrigin함수를 이용해 원래의 백버퍼로 렌더타겟을 잡습니다. 그리고 거기에 아까전에 Render를 마친 텍스쳐를 한번 더 뿌려줍니다.

하루에 6시간 3일 총 18시간을 투자해서 그래퍼&프로그래머 각각 한명씩해서 단 2명이 만든 리듬게임...
처음 만들기 시작했을 땐 불가능 할 줄 알았는데 막상 제작이 완료되니...


일단 메뉴.. 심플하다..ㅋㅋㅋ 저 오른쪽 아래 보이는 X버튼이 나가기버튼
게임 스타트 누르면 다음으로 넘어간다. 제작 기간은 30분??도 안걸렸을 것이다.

게임 세팅부분... 음악 선택하고 속도조절 난이도 조절 음악 미리듣고 랭킹도 보여주고
이 부분은 뭐 2시간만에 만들었던가... 나름 쉬웠다. 그냥 파일입출력이 제일 어려웠음.

그냥 미친듯이 막 코딩하다보니 나왔다... 그다지 어려운 부분은 없었는데 작업분량이 제일 많아서.... 제길..ㅜ;;



어려워 어려워 어려워..ㅜ;; 노트찍는게 제일 어려웠음.. 툴만들어서 음악들으면서 리듬에 맞춰 탁탁찍어줘야하니... 리듬게임 잘 못해서 노트찍는것도 꽤나 걸렸다. 노트 제작기간 2시간?

이거 이거 이거 만드는거 상당히 짜증났다..ㅡ;;
그냥 대충 코딩하다보니까 소스가 몇줄인지도 모르겠고... 어디에 뭐가있는지 짐작으로만 알뿐...
이거 끼워넣는데 버그가 좀 발생해서 그거 잡느라 짜증이 짜증이...

후후후.. 타이틀과 마찬가지로 엄청 쉬웠던 부분... 몇분걸렸더라??


우와 이부분 뭔가 상당히 많아서 효과넣어주고 하느라....
x누르면 랭킹등록창으로 넘어가고 또 누르면 타이틀로 간다.
제작기간은 몇시간이더라.. 좀 걸렸다...


이거 만드는게 제일 힘들었다...
랭킹등록... 제일 못하는 파일입출력..ㅜ;;
저거 만드는데만 몇시간 아직도 못잡은 버그가...


이렇게 게임 제작 완료 ㅋㅋㅋ