데이터베이스 시스템 구성

데이터베이스 2014. 10. 24. 00:28

데이터 베이스 시스템

: 데이터를 데이타베이스로 저장 관리하여 정보를 생성하는 컴퓨터 중심 시스템

 

스키마(schema) : DB의 구조(개체, 관계) 와 제약조건 을 명세

 - 외부 스키마 : 개개 사용자 관점에서 정의한 DB 스키마, 전체 DB의 한 논리적인 부분

 - 개념 스키마 : 범 기관적인 관점에서 정의한 DB 스키마, 모든 응용에 대한 전체적인 통합된 데이터 구조

 - 내부 스키마 : 저장장치 관점에서의 정의한 DB 스키마, 개념 스키마에 대한 저장구조를 정의

 

카탈로그 : 시스템 내의 모든 객체들에 대한 정의나 명세에 대한 정보를 수록(데이터베이스 정보를 갖고 있음)

데이터 디렉토리 : DB에 저장된 데이터를 참조 하는데 필요한 정보를 수록

 

데이터 언어

데이터 정의어 : DDL(Data Definition Language), 데이터베이스 구조를 정의 하고 변경 하는데 사용

데이터 정의의 내용

 - 논리적 데이터 구조의 정의 : 스키마, 외부 스키마 명세

 - 물리적 데이터 구조의 정의 : 내부 스키마 명세

 

데이터 조작어

- DML : Data Manipulation Language

- 데이터 처리 연산의 집합(데이터의 검색, 삽입, 삭제, 변경 연산)

'데이터베이스' 카테고리의 다른 글

병행제어  (0) 2014.10.24
데이터베이스 정규화  (0) 2014.10.24
데이터베이스론 이석호 솔루션  (0) 2014.10.24
데이터베이스 관리 시스템  (0) 2014.10.24
데이터베이스 환경  (0) 2014.10.24

데이터베이스 관리 시스템

데이터베이스 2014. 10. 24. 00:27

데이터베이스 관리 시스템(DBMS : DataBase Management System)

DBMS 발전 배경

1. 데이터 종속성 : 응용프로그램과 데이타 간의 상호 의존 관계

2. 데이터 중복성 : 한 시스템 내에 같은 내용의 데이타가 여러 회일에 중복 저장되어 관리

 

DBMS이란 ?

 응용 프로그램과 데이터 사이의 중재자로서 모든 응용 프로그램(사용자)들이 데이터베이스를

 공용할 수 있게 관리해 주는 범용 소프트웨어 시스템

 

DBMS의 필수 기능

1. 정의 기능

 - 하나의 저장 구조로 여러 사용자의 요구를 지원할 수 있도록 데이타를 조직 하는 기능

2. 조작 기능

  - 사용자와 데이터베이스 간의 interface를 위한 수단

3. 제어 기능

  - 데이터의 정확성 과 보안성을 유지하는 기능

 

DBMS의 장단점

장점 : 데이터 중복의 최소화, 데이터의 공용

         일관성 유지, 무결성 유지

         보안 보장, 표준화 용이, 기관 전체 데이타 요구의 조정

단점 : 운영비의 overhead, 특정 응용 프로그램의 복잡화, 복잡한 backup과 recovery, 시스템의 취약성

 

DBMS의 궁극적 목적은 데이터의 독립성

1. 논리적 데이터 독립성 : 응용 프래그렘에 영향을 주지 않고 논리적 데이타 구조의 변경이 가능

2. 물리적 데이터 독립성 : 응용 프로그램과 논리적 데이터 구조에 영향을 주지 않고 물리적 데이터 구조의 변경이 가능

 

DBMS의 발전 과정

1세대 : IMS(Information Management System) DBMS

2세대 : SQL(세계 표준 데이터베이스 언어)

3세대 : 현재는 제 2세대 DBMS + 제 3세대 DBMS -> 객체 관계 DBMS

'데이터베이스' 카테고리의 다른 글

병행제어  (0) 2014.10.24
데이터베이스 정규화  (0) 2014.10.24
데이터베이스론 이석호 솔루션  (0) 2014.10.24
데이터베이스 시스템 구성  (0) 2014.10.24
데이터베이스 환경  (0) 2014.10.24

데이터베이스 환경

데이터베이스 2014. 10. 24. 00:27

정보와 데이터

- 데이터 : 관찰이나 측정을 통해서 수집된 사실 이나 값

- 정보 : 의사결정을 할 수 있게 하는 데이터의 해석이나 데이터 상호간의 관계

데이터 =/ 정보

데이터 - > 처리기 =  정보

- 정보 시스템 : 한 기관을 위해 데이터를 수집, 조직, 저장하고 정보를 생성, 분배하는 수단

 

일괄 처리(모아서 처리)

- 사전 준비 작업 필요 : 원시 데이터(raw data)의 수집, 분류 정리하여 화일에 수록

- 시스템 중심 처리 방법 : 높은 시스템 성능, 낮은 시스템 비용

- 순차 접근 방법 이용 업무에 유리

 

온라인 처리(실시간 처리)

- 사용자 중심 처리 방법 : 낮은 시스템 성능, 높은 처리 비용

- 통신제어기 가 필요함

 

분산처리(인터넷 시스템)

- 클라이언트/서버 시스템 운영 형태

 

Database란?

- 한 조직의 여러 응용 시스템들이 공용하기 위해 통합, 저장 한 운영 데이터의 집합

공용 데이터 : 한 조직의 여러 응용 시스템들이 공동으로 소유, 유지, 이용하는 데이터

통합 데이터 : 최소의 중복, 통제된 중복

저장 데이터 : 컴퓨터가 접근 가능한 저장 매체에 저장

운영 데이터 : 한 조직의 고유 기능을 수행하기 위해 필요한 데이터

 

Database의 특성

1. 실시간 접근성 : 질의에 대한 실시간 처리 및 응답

2. 계속적인 변화 : 갱신, 삽입, 삭제 : 동적 특성

3. 동시 공용 : 여러 사용자가 동시에 사용

4. 내용에 의한 참조 : 데이타의 위치 나 주소가 아닌 내용에 따라 참조

 

Database의 구성 요소

- 논리적 구성요소

   데이터베이스 = {개체, 관계}

개체 : 표현하려는 유무형 정보의 객체

관계

속성 관계 : 개체 내 관계

- 개체 관계 : 개체 간 관계

'데이터베이스' 카테고리의 다른 글

병행제어  (0) 2014.10.24
데이터베이스 정규화  (0) 2014.10.24
데이터베이스론 이석호 솔루션  (0) 2014.10.24
데이터베이스 시스템 구성  (0) 2014.10.24
데이터베이스 관리 시스템  (0) 2014.10.24

메모리 관리 함수(memset, memcpy, memmove)

프로그래밍/C/C++ 2014. 10. 24. 00:19

메모리 관리 함수

메모리 관리함수는 문자열에 제한하지 않고 , 메모리에 할당된 값을 직접적으로 바꾸기 때문에 자료형에 상관없이 

사용할수있다몇몇 메모리 관리함수는 문자열 함수와 기본적인 동작 방식은 비슷하다. 하지만 다음과 같은 

차이점이 있다.

1. 인수와 리턴값의 타입이 다르다. 메모리 관리 함수는 거의 대부분 void *형태이다

    메모리의 바이트 단위로 작업을 하기때문에 자료형을 몰라도 되기 때문이다.

2. 문자열은 끝을 알리는 NULL 때문에 최대값 범위를 따로 지정안해줘도 되는 함수가 있었지만

    메모리는 어디까지 작업해야하는지 알려줘야하기 때문에 count 라는 인수를 써야한다.


memcpy(메모리 복사) 


1
void *memcpy(void *dst, const void *src, size_t count);

memcpy는 두 메모리의 값을 복사할때 사용한다. 복사될 대상의 주소 (매개변수1) , 복사할 대상의 주소(매개변수2) , 

그리고 복사할 크기(매개변수3) 을 써준다면 src의 값이 dstcount 만큼 복사될것이다. 배열은 요소끼리 개별적으로 

대입해야하는데 , memcpy는 메모리에 값을 바로 주소값으로 전달해서 복사하기때문에 바로 대입이 된다.


또한 memcpy는 대응되는 바이트 끼리 기계적으로 복사하기때문에 대상의 논리적인 구조는 무시한다

구조체 배열도 memcpy를 통해서 복사할수있다 .

  

memset(메모리 초기화 및 설정)


1
void *memset(void *dst, int c, size_t count);

memset은 보통 선언과 동시에 배열 초기화를 하지 않았을때, 혹은 실행중 특정값으로 바꾸고싶을때 사용한다.

사용법은 우선 *dst 에 복사될 대상의 주소 (매개변수1) 넣어주고, int c(2번째 매개변수) 에 바꿀 값(보통은 초기화 시

킬값), count*dst의 사이즈를 넣어주면 된다.

그러면 dst 의 시작 주소로 부터 count 만큼의 메모리 (보통은 count sizeof(dst)식으로 넣어서 값을 지정)가 전부 

int c 로 변한다.

 

memmove(메모리 이동)


1
void *memmove(void *dst, const void *src, size_t count);

 

memmove 는 메모리의 내용을 지정한 만큼 다른곳으로 옮긴다. 이 함수를 사용하면 배열 중간을 뒤쪽으로 밀어서 

빈공간을 만든후 그 공간에 다른 내용을 삽입해 넣을수도 있다

dst 에 이동할 위치 . src 에 이동대상의 시작점 , count 에 움직일 대상의 크기(문자열이면 NULL문자를 포함하자) 를 

적는다. (dst - src = 넣을 대상의 크기가 된다.)

 

'프로그래밍 > C/C++' 카테고리의 다른 글

c++ strtok  (0) 2014.12.13
스마트 포인터  (0) 2014.11.28
C++ 파일 입출력  (0) 2014.02.24
함수 주요 형태(_stdcall, _cdecl, _fastcall)  (0) 2014.02.24
비트 연산자  (0) 2014.02.12

OpenCV 요약 정리(자주쓰는 기능)

IplImage 생성

1
2
3
4
// 생성
IplImage *srcimg_R = NULL;
srcimg_R = cvCreateImage(cvSize(m_width,m_height), 8, 3); // cvSize(640,480) 같은 것도 됨
srcimg_R = cvCreateImage(cvGetSize(src_color), 8,3)// 다른 IplImage 사이즈 받아와서

1
2
3
4
5
// 이 방법도 사용 가능
CvSize img_size; 
img_size.height = ImageHeight;
img_size.width = ImageWidth;
IplImage* BGR_image = cvCreateImage(img_size, IPL_DEPTH_8U, 3)


이미지 복사하기

1
2
src = cvCloneImage(src_img)// src가 비어있어야 함. 데이터가 있으면 메모리 계속 쌓인다.
cvCopy(src_img, src_img2);


컬러 이미지 각 채널별 분리 및 결합

1
2
cvCvtPixToPlane( src_hlsimg, Hue, Intensity, Saturation, NULL )// HLS 이미지 각 속성별로 나눔
cvCvtPlaneToPix( Hue, Intensity, Saturation, NULL, Equ_hls )// 다시 합친다


IplImage 이미지 데이터 0초기화(검정 이미지)

1
cvZero(src_img);


IplImage 해제

1
2
if(srcimg_R)
   cvReleaseImage(&srcimg_R);


IplImageROI 설정하기

1
2
3
4
5
//설정한 ROI 부분을 전체 이미지 인 것처럼 다룬다
//cvSetImageROI( IplImage* img, CvRect rect )
//rect는 순서대로 ROI의 왼쪽 위점의 좌표, ROI의 width, height이다.
 
cvSetImageROI(src, cvRect(CenterX-ROI_width/2, CenterY-ROI_height/2, ROI_width, ROI_height));

설정한 ROI 해제하기

1
cvResetImageROI( IplImage* img );


1
2
3
4
5
6
7
8
//ROI가 설정되어 있다면
if(inputimg->roi != 0x00)
{
    //ROI의 속성 접근하기
    inputimg->roi->width 
    inputimg->roi->height
    ...
}


이미지 불러오기, 저장하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//불러오기 1
Img = cvLoadImage("AndroidImage.bmp"); // Img 구조체에 AndroidImage.bmp를 load
 
//불러오기 2
if ((Img = cvLoadImage("AndroidImage.bmp")) == 0) // load image
{
   printf("%s", "image file read has failed!! \n");
   return 0;
}
 
//저장하기
char file_name[20];
sprintf(file_name,"WriteImage.bmp")//파일이름 만들기
cvSaveImage(file_name,srcimg_R)//srcimg_R 이라는 IplImage를 저장 



이미지 위 아래나 좌우 뒤집기, 반전

1
cvFlip(src, dst, 0)//0은 수직방향 반전, 1은 수평방향 반전, -1은 양방향 다 반전



카메라로 부터 입력받기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
IplImage *src; 
 
//capture for cam
CvCapture* capture = cvCaptureFromCAM(0); // 0번 카메라로부터 입력받음
 
//get init scene
src=cvRetrieveFrame(capture); //src에 capture된 이미지 담기
 
....
// 처리
....
 
//해제
cvReleaseCapture( &capture );


동영상으로 부터 입력받기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CvCapture* input_video = 0;
input_video = cvCreateFileCapture( "movie.avi");
 
//받아온 프레임 사이즈
CvSize frame_size;
int height =(int) cvGetCaptureProperty( input_video, CV_CAP_PROP_FRAME_HEIGHT );
int width =(int) cvGetCaptureProperty( input_video, CV_CAP_PROP_FRAME_WIDTH );
int fps =(int) cvGetCaptureProperty(input_video, CV_CAP_PROP_FPS);
printf("width : %d, height : %d, fps : %d\n", width, height, fps)
 
//연산에 사용될 IplImage 구조체
IplImage *src;
 
if( (src=cvQueryFrame(input_video)) != 0)
{
   printf("file read success!!\n");
}
 
while(1)
{
   src=cvQueryFrame(input_video)
}
 
cvReleaseCapture( &input_video );


윈도우 생성 및 파괴

1
2
3
4
5
6
7
8
9
10
11
12
13
//생성
cvNamedWindow("Right Original", CV_WINDOW_AUTOSIZE);
 
//창 움직이기
cvMoveWindow("source_color",610,0);
 
//보이기
cvShowImage( "Right Original", srcimg_R );
 
//창 닫기
cvDestroyAllWindows();  //모든 OpenCV 윈도우 닫기
 
cvDestroyWindow("Right Original"); //특정 윈도우만 닫기



창으로 부터 키 입력 받기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pressed_key=cvWaitKey(0);
 
if(pressed_key=='q'//q 키가 누르면 빠져나가기
    break;
else if(pressed_key=='c'//캡쳐 키 누르면 캡쳐
{
   timer=time(NULL)//현재시간저장
   t=localtime(&timer)//지역시간
   sprintf(file_name,"img_%4d%02d%02d%02d%02d%2d.bmp",t->tm_year + 1900, 
            t->tm_mon +1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec)//파일이름 만들기
   cvSaveImage(file_name, src_color);
 
   printf("%s file saved is success!!\n",file_name);  //확인메시지 출력
}



이미지 크기 줄이기

1
2
3
4
5
6
7
//생성
pEviMonitor = cvCreateImage(cvSize(m_pImgWidth, m_pImgHeight), IPL_DEPTH_8U, 1);
pEviMonitor2 = cvCreateImage(cvSize(m_pImgWidth/2, m_pImgHeight/2), IPL_DEPTH_8U, 1)
 
// 1/2 크기로 생성
// 크기 줄이기
cvResize(pEviMonitor, pEviMonitor2, CV_INTER_LINEAR)//Resize



화면에 글자 쓰기

1
2
3
4
5
6
7
char s_output_result[50];
CvFont font;
 
sprintf(s_output_result,"sum vector x:%1.3f y:%1.3f",sumvector_x,sumvector_y )//우선 sprintf로 문자열 생성
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, 0.5, 0.5, 0, 1); // font 초기화
 
cvPutText(src_color, s_output_result ,cvPoint(15,20),&font,cvScalar(0,255,0))//cvPoint로 글자 시작 위치 설정


트랙바 생성

1
2
3
4
int hue_threshold=139; //Hue 값의 피부색 threshold
 
cvNamedWindow( "HLS_image", CV_WINDOW_AUTOSIZE );
cvCreateTrackbar("Hue","HLS_image",&hue_threshold,255, NULL );


마우스 입력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void on_mouse( int event, int x, int y, int flags, void* param );
 
......
cvSetMouseCallback( "LKTracker", on_mouse, NULL );
......
 
void on_mouse( int event, int x, int y, int flags, void* param )
{
   if( !image )
      return;
    
   if( image->origin )
      y = image->height - y;
    
   if( event == CV_EVENT_LBUTTONDOWN )
   {
      pt = cvPoint(x,y);
      add_remove_pt = 1;
   }
}

canny edge detect 사용하기

1
2
3
4
5
6
IplImage *canny_R = NULL;
canny_R = cvCreateImage(cvSize(m_width,m_height), 8, 1);
 
cvCvtColor(srcimg_R, grayimg_R, CV_BGR2GRAY)//원본 컬러이미지를 흑백으로 변환하고
 
cvCanny( grayimg_R, canny_R, 40, 130, 3 )//그 흑백이미지를 캐니로 변환



Harris edge detector 사용하기

1
2
IplImage *harris = cvCreateImage(cvSize(WIDTH,HEIGHT), IPL_DEPTH_32F, 1);
cvCornerHarris(src_gray, harris, 3, 9, 0.07)



Smoothing 연산

1
2
3
4
5
6
7
//Gaussian filtering
cvSmooth(src, Gaussed_image, CV_GAUSSIAN, 3)
 
//DoG(Difference of Gaussian)
cvSmooth(src_gray, GaussImg1, CV_GAUSSIAN, 3);
cvSmooth(src_gray, GaussImg2, CV_GAUSSIAN, 27);
cvSub(GaussImg1, GaussImg2, dst);



HLS 이미지로 변환하기

1
2
3
4
5
6
7
8
9
10
11
//HLS 이미지
IplImage* src_hlsimg = cvCreateImage(cvSize(m_width,m_height), 8, 3)
 
//각 속성들 저장할 곳 선언
IplImage* Hue = cvCreateImage(cvSize(m_width,m_height), 8, 1);
IplImage* Intensity = cvCreateImage(cvSize(m_width,m_height), 8, 1);
IplImage* Saturation = cvCreateImage(cvSize(m_width,m_height), 8, 1);
 
cvCvtColor(srcimg, src_hlsimg, CV_BGR2HLS)//src_hlsimg IplImage 구조체에 HLS 이미지 담긴다
cvCvtPixToPlane( src_hlsimg, Hue, Intensity, Saturation, NULL )//HLS 이미지 각 속성별로 나눔
cvCvtPlaneToPix( Hue, Intensity, Saturation, NULL, hsvVideo2 )//도로 합치기



모폴로지 연산 Morphology

1
2
3
IplConvKernel* kernel;
kernel= cvCreateStructuringElementEx( 3, 3, 0, 0, CV_SHAPE_RECT, NULL );
cvMorphologyEx( temp_eyeimg, temp_eyeimg, NULL,kernel, CV_MOP_CLOSE , 1 );



히스토그램 관련

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CvHistogram* hist;
float min_value, max_value; //히스토그램 최대값 최소값 저장
int hist_size = 255; //히스토그램 축 개수
 
hist = cvCreateHist( 1, &hist_size, CV_HIST_UNIFORM)//1차원의, 각 속성 크기 hist_size인 히스토그램 생성
cvCalcHist( &Hue, hist, 0, 0)//Hue가 1차원 IplImage -> 실질적 입력
cvGetMinMaxHistValue(hist, &min_value, &max_value, 0, 0)//히스토그램 최소최대값 얻기, 최대최소값의 위치
printf("hist min max:%f %f\n",min_value, max_value);
 
cvZero(Hue_hist);
 
int axis_base = 210; //그릴 때, 아래 축이 어느정도에 위치하는가
CvFont font; //축에 글자 쓰기
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, 0.3, 0.3, 0, 1);
char text[50];
 
for ( int i = 0; i <255; ++i)
{   
    int hist_value = cvRound(cvQueryHistValue_1D(hist,i)*255/max_value)//히스토그램 값 normalization
    cvLine(Hue_hist, cvPoint(i+20, axis_base), cvPoint(i+20, abs(axis_base - hist_value) ), CV_RGB(255,255,255), 1);
    
    if ((i % 20) == 0 )
    {
       sprintf( text, "%d", i);
       cvPutText( Hue_hist, text, cvPoint(i+20, axis_base+10), &font, CV_RGB(255,255,255))
    }
}
 
if(hist) //히스토그램 제거
   cvReleaseHist(&hist);
 


히스토그램 평활화 (histogram equalization)

1
2
3
IplImage* Src = cvCreateImage(cvSize(width,height), 8, 1)//원본 이미지
IplImage* Equalized = cvCreateImage(cvSize(width,height), 8, 1)//평활화 된 이미지
cvEqualizeHist( Src, Equalized );


이미지 회전시키기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CvPoint2D32f rot_center = cvPoint2D32f(ROI_width/2 , ROI_height/2); //회전중심설정
 
// 회전 매트릭스 만들기
CvMat *rot_mat = cvCreateMat( 2, 3, CV_32FC1);
 
//매트릭스 계산 
cv2DRotationMatrix( 
      rot_center, //Source Image의 센터
      Rotation_Angle, //각도 + 값은 시계 반대 반대 방향을 의미
      1, // 이미지 크기(scale)... 
      rot_mat); // 결과를 저장하는 매트릭스
      
//원본 이미지에 ROI 적용하기
cvSetImageROI(src, cvRect(CenterX-ROI_width/2, CenterY-ROI_height/2, CenterX+ROI_width/2, CenterY+ROI_height/2));
 
//변환하기
cvWarpAffine(src, dst, rot_mat, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0)); // 선형보간


OpenCV CvMat InputArray로 변환

CvMat *gray_1 = NULL;

으로 선언한 CvMat 구조체가 2.3 버전부터 inputArray으로 변경되었다.


간단하게 (Cv::Mat)만 붙여주면 해결할 수 있다.


c언어 int string 변환

알고리즘 2014. 10. 22. 06:06


1
2
3
4
5
6
7
8
9
int len = sprintf(buf, "%d", a);
int aaa = 0;
int power = 1;
 
for(int i=0; i<len; i++)
{
    aaa += (buf[len-i-1] - '0') * (power);
    power *= 10;
}


c언어 시계방향으로 최소값 구하기

알고리즘 2014. 10. 22. 06:04


1
2
3
4
5
6
7
8
9
10
int data = 1526;
int size = 3;
int min = INT_MAX;
 
for(int i=0; i<=size; i++)
{
   data = (data%1000) * 10 + data/1000;
   if(min>data)
     min = data;
}


'알고리즘' 카테고리의 다른 글

c언어 int string 변환  (0) 2014.10.22
문자열 비교(strcmp)  (0) 2014.10.22
c언어 char int변환  (0) 2014.10.22
int 형 데이터 자리수 구하기  (0) 2014.10.22
C언어 최대공약수 최소공배수 구하기  (0) 2014.10.22

문자열 비교(strcmp)

알고리즘 2014. 10. 22. 06:02


1
2
3
4
5
6
int strcmp(const char *a, const char *b)
/*
a > b 이면 리턴값 양수
a < b 이면 리턴값 음수
a == b 이면 리턴값 0
*/


c언어 char int변환

알고리즘 2014. 10. 22. 06:01

 


1
2
3
4
char c = '1';
int i;
 
i = c-'0';


'알고리즘' 카테고리의 다른 글

c언어 시계방향으로 최소값 구하기  (0) 2014.10.22
문자열 비교(strcmp)  (0) 2014.10.22
int 형 데이터 자리수 구하기  (0) 2014.10.22
C언어 최대공약수 최소공배수 구하기  (0) 2014.10.22
동적계획법  (0) 2014.01.28