300x250
반응형

 

 

 

 

 

이번 내용은 OpenGL을 윈도우 창과 연동하는 방법을 작성하였습니다.

 

주 내용은 간단합니다.

예제 파일에 있는 GlRender.cpp, GlRender.h 파일을 사용해서 

GlRender클래스는 자체 OpenGLCreate 관련 함수와, 쓰레드 생성 함수들이 있습니다.

나중에 GlStart()를 호출하게되면 MFC 화면에 영상이 출력됩니다.

 

RenderTest라는 클래스를 만들었습니다.

 

 

RenderTest.h

#pragma once
#include "GlRender.h"

class RenderTest : public GlRender
{
public:
    RenderTest();
    ~RenderTest();
    
private:
    void GlInit() override;
    void GlDraw() override;
};

헤더는 GlRender를 상속받습니다.

GlRender 클래스에 가상함수로 호출되기 때문에 GlInit(), GlDraw() 함수는 오버라이드! 

 

RenderTest.cpp

#include "stdafx.h"
#include "RenderTest.h"


RenderTest::RenderTest(){}

RenderTest::~RenderTest(){}

void RenderTest::GlInit(){}

void RenderTest::GlDraw()
{
    glViewport(0, 0, gl_window_width, gl_window_height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho((double)-gl_window_width / 2, (double)gl_window_width / 2,
        (double)-gl_window_height / 2, (double)gl_window_height / 2,
        1, -1);


    glMatrixMode(GL_MODELVIEW);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0, 0, 0, 0);


    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glPushMatrix();
    {
        glBegin(GL_LINES);

        glColor4f(0, 1, 0, 1);
        glVertex2d(0, 0);
        glVertex2d(200, 100);

        glEnd();
    }
    glPopMatrix();
    glDisable(GL_BLEND);



    glMatrixMode(GL_MODELVIEW);
    glMatrixMode(GL_PROJECTION);

}

 

RenderTest의 GlDraw() 함수 내용을 보면

중요한 내용은 아니지만 대략적으로 설명을 해보겠습니다.

 

1. glViewport를 사용하여 그릴 화면 영역을 잡고

2. 공간 메트릭스 행렬 초기화

3. glOrtho를 사용하여 화면 Viewport 영역 좌표계를 설정 했습니다.

4. GL_BLEND를 사용하여 투명도 적용

 

GlBegin ~ GlEnd() 내용에 색상을 정하고, 점2개로 직선을 그리는 OpenGL 코드를 작성하였습니다.

 

 

이제 MFC 화면에 연동을 해볼께요

 

0. stdafx.h에 OpenGL 환경설정 추가

#pragma comment ( lib, "OpenGL32.lib" )

#ifdef _WIN32
#include "OpenGL_lib/core/x86/glew.h"
#include "OpenGL_lib/core/x86/wglew.h"
#endif

#ifdef _WIN64
#include "OpenGL_lib/core/x64/glew.h"
#include "OpenGL_lib/core/x64/wglew.h"
#endif

 

1. 먼저 출력할 Dialog 클래스 헤더에 객체 선언

    RenderTest m_render_test;

 

2.  OnInitDialog() 함수에

m_render_test.Create(this);
m_render_test.GlStart();

 

3. OnSize() 함수에

m_render_test.GlResize(cx, cy);

 

4. OnClose() 함수에

m_render_test.GlClose();

 

 

프로그램을 실행한 결과!

 

예시 코드는 아래에서 받을 수 있습니다.

1. Example_OpenGL_MFC.zip
8.23MB

VisualStudio 2012에서 작성되었습니다.

300x250
반응형
300x250
반응형

오늘은 부산광역시 수영구에 있는 수영산8193 후기 입니다.

부산에 있는 퓨전술집입니다.

다양한 우리 술을 먹을수 있으며, 안주도 맛있는 집입니다.

웨이팅도 많은곳

주소 : 부산 수영구 무학로49번길 71 1층 수영산8193​

오픈시간 : 5:00

 
 

술도 맛있고 음식도 맛있고 ㅋ

부산에 한잔 하려고 하신다면 꼭 가보시길 추천드립니다 ㅎ

300x250
반응형

'후기 > 맛집후기' 카테고리의 다른 글

부산 수영 금손 1983 (오마카세)  (0) 2022.11.25
부산 - 이정태 본참치  (0) 2022.10.07
부산 - 소수인  (0) 2022.09.15
김해 장유 모산 [ 오마카세 ]  (0) 2022.08.25
부산 파라다이스호텔 사까에  (0) 2022.08.25
300x250
반응형

 

member, log_view, trade
회원정보, 회원이 조회한 제품 로그, 회원이 구매한 제품 목록
이렇게 3개의 테이블이 있다.

보통은 

select * member as a
left join log_view as b
on a.userid = b.userid

left join trade as c
on a.userid = c.userid

 

이런식으로 join 쿼리를 사용하여 결과를 낼수 있는데

 

만약 회원아이디별 제품 조회수, 거래건수를 뽑을려고 하면

Scalar Subquery를 사용하여 심플하게 뽑을수 있다.

 

기존의

select userid from meber 쿼리에서

속성 쿼리 2개만 아래와같이 추가하면 아주 간단!

select userid
, ( select count(*) cnt from log_view where log_view.userid = member.userid ) cnt_view
, ( select count(*) cnt from trade where trade .userid = member.userid ) cnt_trade
from member

예상되는 결과는 아래와 같다.

userid cnt_view cnt_trade
test1 5 6
test2 2 8

 

간단하쥬 ㅋㅋㅋ

300x250
반응형

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

MYSQL 백업/복구 + 특정테이블만  (0) 2023.08.03
mysql 테이블 단위 내용 분리  (0) 2023.08.03
DB 인덱스 추가 쿼리  (0) 2022.08.17
300x250
반응형

 

서버를 운영하다 보면 특정 시간에 어떤 행동을 고정적으로 하고싶을 때가 있습니다.

 

예를 들면

  - 매일 새벽1시 백업

  - 매일 아침 문자 발송

  - 새벽 시간 바이러스 검사

  - 등등

 

이를 도와주는 프로그램이 crontab 이라는 프로그램 입니다. 아래와 같이 설치 하시면 됩니다.

우분투 설치 방법
sudo apt update -y
sudo apt install -y cron
CentOS 설치 방법
sudo yum update -y
sudo yum install -y cronie

설치가 끝나셨다면 이제 사용법을 알아볼게요.

 

 

먼저 작업 예정인 목록을 확인하는 방법
crontab -l

만약 스케쥴을 넣었다면 위와 같이 먼가 뜰껍니다.

 

 

스케쥴러 추가 및 수정 방법
위치를 옮깁니다.
cd /var/spool/cron/crontabs 

vi 편집기로 엽니다.
vi root 

위에 화면과 똑같은 내용이 뜰껍니다.

 

추가하고 싶으면 마지막 라인에 추가하면 되고, 수정은 vi 편집기 명령어를 사용하여 수정하면 됩니다.

0 1 * * * /root/backup.sh 이라인을 설명하면

 

숫자가 포함하는건 분 시간 일 월 년 순서 입니다.

시간 쉘커맨드
0 1 * * * /root/backup.sh

해석해 보면 매년, 매월, 매일 1시 마다 /root/backup.sh 을 해라

즉 매일 1시마다 backup을 해라라는 명령입니다.

 

backup.sh 파일에는

db를 백업 mysqldump 하고, 파일들을 tar 압축하는 명령어를 넣었습니다.

 

만약 특정 웹페이지를 호출하고 싶으면

sh 파일 안에다가

wget http://www.naver.com/today.php -O /dev/null

이런식으로 넣어두면 today.php 라는 페이지를 매일 1시에 호출하게 됩니다.

 

 

참 쉽죠 ㅋ

300x250
반응형
300x250
반응형

 

현재시간 기준으로 이전 날짜를 구해봅시다.

 

 

현재시간 구하기

$dt = date("Y-m-d H:i:s", time());
echo $dt;

 

1주일 전 구하기

 $dt = date("Y-m-d H:i:s", strtotime("-1 week", time()));
 echo $dt;

 

1달 전 구하기

$dt = date("Y-m-d H:i:s", strtotime("-1 month", time()));
echo $dt;

 

1년 전 구하기

$dt = date("Y-m-d H:i:s", strtotime("-1 year", time()));
echo $dt;

 

나머지 시, 분, 초를 더하거나 빼고싶으시면

strotime 함수 안에

+1 hours

-1 hours

 

+10 minitues

+1 seconds

 

이런식으로 넣으시면 됩니다.

 

 

! 만약  현재시간에 -3개월 한후 +30분을 더하고 싶다면?

(아래 두개는 결과가 같습니다.)  time() 에 해당하는 부분을 strtotime으로 한번더 대체하면 됩니다.

당연히 가독성은 (2) 번이 좋겠죠

 

(1)

$dt = date("Y-m-d H:i:s", strtotime("+30 minutes", strtotime("-3 month", time())));
echo $dt;

(2)

$time_pre_3month = strtotime("-3 month", time());
$dt = date("Y-m-d H:i:s", strtotime("+30 minutes", $time_pre_3month));
echo $dt.'<br>';

 

참 쉽죠 ㅋ

300x250
반응형
300x250
반응형

 

이번 예제는 현재 위치에 파일이 있는지 확인하는 코드 입니다.

CString full_path = GetExecutedPath() + _T("test/file.tmp");

if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(full_path) && GetLastError() == ERROR_FILE_NOT_FOUND)
{
	AfxMessageBox(_T("파일 X"));
}
else
{
	AfxMessageBox(_T("파일 O"));        
}

GetExcutedPath() 함수는 실행파일이 있는 위치를 리턴해 줍니다.

저걸 사용안하면 프로젝트 소스가 있는 위치에서 파일을 확인하기 때문에 ㅋ

아래 함수를 그대로 복사해서 붙여넣기 하시면 됩니다.

CString GetExecutedPath()
{
    //실행파일 경로 구하는 함수
    CString strResult;
    CString strPath;

    if (GetModuleFileName(nullptr, strPath.GetBuffer(_MAX_PATH + 1), MAX_PATH) != FALSE)
    {
        strPath.ReleaseBuffer();

        strResult = strPath.Left(strPath.ReverseFind('\\') + 1);
    }

    return strResult;
}

 

 

간단하쥬 ㅋ

300x250
반응형
300x250
반응형

 


아래 코드는 파일이름 변경 예제 입니다. 아래 2가지 방법중 하나를 사용하시면 됩니다.

아래 예제는 file.tmp 라는 파일을 file.xtf 로 확장자 / 이름 변경 하는 코드 입니다.

 

1. C 코드를 사용한 변환

CString full_path_tmp = GetExecutedPath() + _T("test/file.tmp");
CString full_path_xtf = full_path_tmp;        
full_path_xtf.Replace(_T(".tmp"), _T(".xtf"));


CStringA a_full_path_tmp = (CStringA)full_path_tmp;
CStringA a_full_path_xtf = (CStringA)full_path_xtf;

const char* char_path = a_full_path_tmp.GetBuffer();
const char* char_path_changed = a_full_path_xtf.GetBuffer();

rename(char_path, char_path_changed);

C 코드인 rename을 사용합니다.

해당 파라미터는 const char*를 인자로 사용하기 때문에 변환해서 넣어야 합니다.

장점은 오류 예외창이 안뜹니다.

 

 

2. MFC 코드는 사용한 변환

CString full_path_tmp = GetExecutedPath() + _T("test/file.tmp");
CString full_path_xtf = full_path_tmp;        
full_path_xtf.Replace(_T(".tmp"), _T(".xtf"));

CFile::Rename(full_path_tmp, full_path_xtf);

MFC 함수인 CFile::Rename 함수를 사용합니다.

해당 파라미터는 CString을 그대로 사용하시면 됩니다.

단점은 파일이 없을경우 오류 메시지창이 뜹니다.

 

 

간단하쥬 ㅋ

300x250
반응형
300x250
반응형

 

 

문자집합은 유니코드 기반 코드 입니다.

 

아래 코드는 CStringA로 형변환 후 GetBuffer()를 사용하여 변환하는 예제입니다.

CString file_name = _T("filename.dat");
CStringA a_file_name = (CStringA)file_name;

const char* ptr_name = a_file_name.GetBuffer();

 

아주 간단 하쥬 ㅋ

 

 

300x250
반응형

+ Recent posts