728x90

Qt로 리눅스 마우스 매크로를 만드는 방법입니다. 리눅스는 마우스, 키보드와 같은 이벤트들도 파일로 처리가 되기 때문에 file open -> read / write 식으로 흘러가게 됩니다.

 

그러면 그 이벤트의 파일을 확인하기 위해서는 /dev/input 경로로 들어갑니다. 

ls 시 아래처럼 여러 이벤트, 장치 파일이 있을텐데 cat으로 파일을 읽어봅니다.

실행 후 마우스 클릭같은 이벤트 발생시켜보면 특정 이벤트에선 알수없는 문자들이 호출되는데 이 이벤트가 해당 마우스 이벤트라고 보시면 됩니다.

이제 마우스 이벤트의 파일을 확인했으니 file을 open합니다.

void MainWindow::LoadMouse()
{
    m_sMousePath = "/dev/input/event6";

    if ( (fd= open(m_sMousePath.toLatin1().data(), O_RDWR)) == -1 ) {
        QMessageBox::critical(this, "Open Error", "Open Error -  Check Touch Device Path");
        QTimer::singleShot(100, this, SLOT(close()));
    }
}

그리고 mouse 이벤트를 받을 쓰레드를 하나 만들어 따로 돌리겠습니다. 쓰레드를 사용하는 이유는 read 시 block 처리가 되기 때문에 특정 이벤트가 n초간 발생하지 않으면 사이클이 끝났다고 판단하게 처리하기 위함입니다.

#ifndef GETMOUSEEVENTTHREAD_H
#define GETMOUSEEVENTTHREAD_H

#include <QThread>

#include "linux/input.h"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

enum NState {
    enReady = 0,            // Record 버튼 눌렀을 때 이벤트 버리기 위함
    enGetInput = 1
};

class GetMouseEventThread : public QThread
{
    Q_OBJECT
public:
    explicit GetMouseEventThread(QObject *parent = 0, int fd = 0, QString sPath = "");
    ~GetMouseEventThread();

    void SetState(int State);
    int GetState()                  { return m_nState; }

    int inputListCount();
    struct input_event GetInputData(int nIndex);

    bool WaitFor(unsigned long time = ULONG_MAX);
private:
    void run();

    int m_nState;
    int m_nfd;
    QString m_sMousePath;                       // 터치 장치 경로
    QList<struct input_event> inputList;        // 터치 이벤트 저장 용
    
signals:
    void Emit_readRefresh();

public slots:
    
};

#endif // GETMOUSEEVENTTHREAD_H
#include "GetMouseEventThread.h"
#include <QDebug>

#include "unistd.h"

GetMouseEventThread::GetMouseEventThread(QObject *parent, int fd, QString sPath) :
    QThread(parent),
    m_nfd(fd),
    m_sMousePath(sPath)
{
}

GetMouseEventThread::~GetMouseEventThread()
{
}

void GetMouseEventThread::SetState(int State)
{
    m_nState = State;
}

int GetMouseEventThread::inputListCount()
{
    return inputList.count();
}

input_event GetMouseEventThread::GetInputData(int nIndex)
{
    struct input_event event;
    event = inputList.value(nIndex);

    return event;
}

void GetMouseEventThread::run()
{
    inputList.clear();
    struct input_event input;

    while ( read(m_nfd, &input, sizeof(struct input_event)) ){
        if ( m_nState == enGetInput ) {
            inputList.append(input);
        }

        emit Emit_readRefresh();
    }
}

bool GetMouseEventThread::WaitFor(unsigned long time)
{
    bool bResult = false;

    bResult = wait(time);

    return bResult;
}

위 쓰레드는 2가지 상태를 가집니다. 상태를 굳이 구분해 놓은 이유는 Record 라는 버튼을 클릭하는 이벤트도 기록이 되기 때문에 그 이벤트를 먼저 비우기 위함입니다. 상태가 GetInput일 경우에만 이벤트 리스트에 담고 read가 성공했을 때는 MainWindows에 emit을 날려줍니다.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include "GetMouseEventThread.h"

#include "linux/input.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

const int nWaitTime = 10;
const int nCycleTime = 20;

enum NRunState {
    enStop = 0,
    enRun = 1
};

enum NRecordState {
    enOff = 0,
    enOn = 1
};

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void InitUI();
    void LoadMouse();

private:
    Ui::MainWindow *ui;

    bool m_bRunState;
    bool m_bRecordState;

    QString m_sMousePath;       // 터치 장치 경로
    int fd;

    QTimer MacroTimer;      // Cycle 타이머
    QTimer recordTimer;     // ReadThread 갱신 확인용
    GetMouseEventThread* pReadThread;       // 터치 이벤트 read 용

public slots:
    void Slot_Click_RunStop();
    void Slot_Click_Record();

    void Slot_MacroOn();
    void Slot_recordTimerReFresh();
    void Slot_recordTimeout();
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QSettings>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_bRunState(enStop),
    m_bRecordState(enOff)
{
    ui->setupUi(this);

    setWindowFlags( Qt::WindowStaysOnTopHint);

    InitUI();
    LoadMouse();

    pReadThread = new GetMouseEventThread(this, fd, m_sMousePath);

    connect(pReadThread, SIGNAL(Emit_readRefresh()), this, SLOT(Slot_recordTimerReFresh()), Qt::UniqueConnection);
    connect(pReadThread, SIGNAL(terminated()), this, SLOT(Slot_threadTerminated()), Qt::UniqueConnection);

    connect(&MacroTimer, SIGNAL(timeout()), this, SLOT(Slot_MacroOn()), Qt::UniqueConnection);
    connect(&recordTimer, SIGNAL(timeout()), this, SLOT(Slot_recordTimeout()), Qt::UniqueConnection);
}

MainWindow::~MainWindow()
{
    delete ui;

    if ( pReadThread->isRunning() ) {
        pReadThread->WaitFor();
    }

    if ( pReadThread != NULL ) { delete pReadThread; }
}

void MainWindow::InitUI()
{
    ui->pbRunStop->setText("Run");
    ui->pbRecord->setText("Record");

    connect(ui->pbRunStop, SIGNAL(clicked()), this, SLOT(Slot_Click_RunStop()), Qt::UniqueConnection);
    connect(ui->pbRecord, SIGNAL(clicked()), this, SLOT(Slot_Click_Record()), Qt::UniqueConnection);
}

두 타이머는 기록이 끝났는지를 체크하기 위한 타이머와 사이클을 반복하기 위한 타이머로 구성되어 있습니다. Thread에서 emit을 통해 시그널을 받으면 계속해서 recordTimer를 갱신시켜주고 10초로 설정한 recordTimer가 timeout이 됐을 때는 녹화가 종료됩니다.

void MainWindow::Slot_recordTimerReFresh()
{
    recordTimer.start();        // ReadThread 갱신 확인
}

void MainWindow::Slot_recordTimeout()
{
    if ( pReadThread == NULL ) { return; }
    pReadThread->terminate();

    if ( pReadThread->GetState() == enReady ) {
        pReadThread->SetState(enGetInput);
        ui->statusBar->showMessage("No Action for 10 Sec, the recording stops.");
        recordTimer.setInterval(10000);
        recordTimer.start();
        pReadThread->start();
    } else {
        m_bRecordState = enOff;
        ui->pbRecord->setText("Record");
        ui->statusBar->showMessage("");

        ui->pbRunStop->setEnabled(true);
    }
}

마지막으로 Macrotimer에서는 받아온 이벤트 리스트들을 실행해 줍니다. 이 이벤트들도 open한 파일 디스크립터에 write 해주는 방식으로 진행합니다.

void MainWindow::Slot_MacroOn()
{
    if ( m_bRunState == enStop ) { return; }

    int nInputLIstCount = pReadThread->inputListCount();
    for ( int i =0; i < nInputLIstCount - 1; i++) {
        struct input_event currentinput = pReadThread->GetInputData(i);
        struct input_event nextinput    = pReadThread->GetInputData(i+1);

        struct timeval currentTime = currentinput.time;
        struct timeval nextTime = nextinput.time;

        write(fd, &currentinput, sizeof(input_event));

        QApplication::processEvents();

        uint nDelayTime =  (nextTime.tv_sec - currentTime.tv_sec) * 1000000 + nextTime.tv_usec - currentTime.tv_usec;
        usleep(nDelayTime);

    }
    MacroTimer.setInterval(nCycleTime * 1000);
    MacroTimer.start();
}

timeval 구조체와 input_event 구조체를 한번 살펴보겠습니다. input_event는 이벤트에 대한 정보들이 기록되는데 멤버로 time 정보들도 갖고 있습니다. 이를 통해서 이벤트들 사이의 간격을 구할 수 있는데 그 간격을 sleep을 주게 되면 기록한 사이클을 재현할 수 있게 됩니다.

struct input_event{
    struct timval   time;
    unsigned short  type;
    unsigned short  code;
    unsigned int    value;
};

struct timeval {
    long tv_sec;
    long tv_usec;
}

 

728x90
728x90

[스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(4) - VNC Auto Start 을 보고 오시는것을 추천드립니다.

 

[스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(4) - VNC Auto Start

https://1d1cblog.tistory.com/456를 보고 오시는 것을 추천드립니다. [스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(3) https://1d1cblog.tistory.com/455에 이어 VNC 세팅을 하려고 합니다. [스마트홈 구..

1d1cblog.tistory.com

이전까지 AWS EC2를 활용해 ubuntu 환경 및 VNC 접속을 위한 세팅을 마무리 하였습니다. 이제 실제 프로그램이 돌아갈 라즈베리파이를 세팅하려 합니다.

 

기본적인 라즈베리파이 os 설치는 포스팅하지 않을 예정이며 기타 설정, VNC 설정 등은 https://1d1cblog.tistory.com/category/Programming/Raspberry%20Pi 에서 찾아보실 수 있습니다.

 

'Programming/Raspberry Pi' 카테고리의 글 목록

개인공부 정리 블로그

1d1cblog.tistory.com

다음으로 라즈베리파이4와 Ubuntu 간에 크로스 컴파일 환경을 구축하려 합니다. 간단히 설명하면 Ubuntu에서 소스 작성 후 빌드까지 한 다음 실행파일을 라즈베리파이로 가져와 실행하게 됩니다.

 

이렇게 하는 이유는 이전 프로젝트에서는 직접 라즈베리파이에서 직접 코드 작성, 빌드를 했었는데 생각보다 답답했었습니다. 그래서 환경 구축 및 개념 공부 겸으로 진행하려 합니다.

 

먼저 실제 작업할 우분투 쪽에 Qt 5를 설치해줍니다. 먼저 필수 개발환경 관련한 것들을 설치합니다.

sudo apt-get install build-essential make

다음으로 Qt 관련한 것들을 설치합니다. qtcreator와 qt5-default는 필수로 그 뒤에는 추가로 필요한 항목들을 설치합니다.

sudo apt-get install qtcreator qt5-defualt qt5-doc qt5-doc-html

기본 프로젝트 생성 하시고 만약 variable hs incomplete type 'QApplication' 에러가 뜬다면 Qt Creator > Help > About Plugins에서 C++ > ClangCodeMocel을 체크 해제하신 후 재부팅 하시면 됩니다.

하지만 여기서 문제가 생겼습니다. 현재 사용하고 있는 ec2 프리티어의 메모리가 1GB인데 Qt Creator까지 실행하면 메모리가 거의 꽉차게 되서 제대로 사용하기 어려운 상황입니다.

이제 위 문제에서 할수 있는 방안이라고 하면

1. 프리티어가 아닌 시간 별 요금을 결제하고 메모리가 더 높은 인스턴스를 사용한다.

2. 다른 환경을 구축한다.

 

결정 후 다음 포스팅에서 이어서 작성하겠습니다.

728x90
728x90

Qt에서 Grid Layout을 사용하면 N x M 레이아웃을 사용할 수 있습니다. 

위와 같은 화면을 UI Desinger를 통해 구성한다면 크게 어려움이 없지만 C++ 코드에서 동적으로 AddWidget을 통해 배치하면 좀 헷갈릴 수 있습니다.

 

이럴 때 addWidget에 rowspan, columnspan 옵션을 이용하면 됩니다.

span 계산 대한 내용은 https://flower0.tistory.com/319#comment18476332 링크를 참고하시면 됩니다.

 

[Qt] GridLayout 셀 크기 조절하는 방법 (ColumnSpan)

GridLayout 각 셀의 크기를 다르게 조절하는 방법 Qt 에서 GridLayout을 사용하는데, 각 셀마다의 크기를 다르게 주고 싶다면? 방법이 있다!!!!!!!! 먼저, 각 셀의 크기를 다르게 준다는 말이 무슨 말인지

flower0.tistory.com

 

이걸 봐도 Span 값을 계산하기 힘들다면 빈 프로젝트 하나를 만들고 원하는 위젯 배치를 임의로 배치해봅니다.

이제 이 ui파일을 물고 있는 헤더파일로 가서 F2 버튼을 눌러줍니다.

이제 그동안 많이 본 ui->setupUi(this); 의 구현 부분을 볼 수 있는데 ui에서 배치한 위젯들을 동적으로 배치해주는 모습을 볼 수 있습니다. 이 구현부분만 따로 복사해 놓고 위젯들을 동적으로 생성하는 로직에 필요한 부분만 사용하면 됩니다.

// MainWidnow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGridLayout>
#include <QLineEdit>
#include <QCheckBox>
#include <QPushButton>
#include <QCommandLinkButton>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void MakeWidget();
    
private:
    Ui::MainWindow *ui;
    QGridLayout* gridLayout;
    QLineEdit *lineEdit;
    QCheckBox *checkBox;
    QPushButton *pushButton;
    QCommandLinkButton *commandLinkButton;
    QCheckBox *checkBox_2;
    QPushButton *pushButton_2;
    QPushButton *pushButton_3;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "QGridLayout"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    MakeWidget();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::MakeWidget()
{
    ui->centralWidget->setObjectName(QString::fromUtf8("ui->centralWidget"));
    gridLayout = new QGridLayout(ui->centralWidget);
    gridLayout->setSpacing(6);
    gridLayout->setContentsMargins(11, 11, 11, 11);
    gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
    checkBox_2 = new QCheckBox(ui->centralWidget);
    checkBox_2->setObjectName(QString::fromUtf8("checkBox_2"));

    gridLayout->addWidget(checkBox_2, 4, 2, 1, 1);

    commandLinkButton = new QCommandLinkButton(ui->centralWidget);
    commandLinkButton->setObjectName(QString::fromUtf8("commandLinkButton"));

    gridLayout->addWidget(commandLinkButton, 0, 2, 1, 1);

    pushButton_3 = new QPushButton(ui->centralWidget);
    pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));

    gridLayout->addWidget(pushButton_3, 1, 1, 1, 2);

    pushButton = new QPushButton(ui->centralWidget);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
    sizePolicy.setHorizontalStretch(0);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(pushButton->sizePolicy().hasHeightForWidth());
    pushButton->setSizePolicy(sizePolicy);

    gridLayout->addWidget(pushButton, 0, 0, 2, 1);

    pushButton_2 = new QPushButton(ui->centralWidget);
    pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));

    gridLayout->addWidget(pushButton_2, 5, 0, 1, 3);

    lineEdit = new QLineEdit(ui->centralWidget);
    lineEdit->setObjectName(QString::fromUtf8("lineEdit"));

    gridLayout->addWidget(lineEdit, 0, 1, 1, 1);

    checkBox = new QCheckBox(ui->centralWidget);
    checkBox->setObjectName(QString::fromUtf8("checkBox"));

    gridLayout->addWidget(checkBox, 4, 0, 1, 2);
}

728x90

'Programming > Qt' 카테고리의 다른 글

[Qt] QAbstractItemModel 적용된 View 폰트 변경  (0) 2022.12.07
[Qt] 리눅스 마우스 매크로 만들기  (0) 2022.09.21
Qt Creator white space 표시 제거  (0) 2022.01.18
Qt ToolTip  (0) 2021.08.17
Qt LineEdit 입력 값 제한하기  (0) 2021.05.07
728x90

https://1d1cblog.tistory.com/456를 보고 오시는 것을 추천드립니다.

 

[스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(3)

https://1d1cblog.tistory.com/455에 이어 VNC 세팅을 하려고 합니다. [스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(2) [스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(1) 에 이어 ssh 접속을 시도해..

1d1cblog.tistory.com

이전 포스팅에서 테스트 시에 vncsever에 localhost no 옵션을 주고 실행하여 테스트 했었습니다.

 

localhost 옵션은 외부에서도 접속이 가능하게 해주는 옵션인데 no 값을 주어 다른 호스트에서도 접근이 가능하도록 해줘야 합니다.

텍스트 에디터를 통해 /etc/vnc.conf 파일에 $localhost = "no"; 항목을 추가해줍니다.

위 설정을 추가하면 vncserver 실행 시 localhost 옵션을 설정하지 않아도 외부에서 vnc 접속이 가능해집니다. 우리는 여기서 ec2의 사용자 데이터를 사용하려고 합니다. 사용자 데이터를 사용하면 인스턴스가 다시 시작될 때마다 스크립트를 실행할 수 있습니다.

 

먼저 cloud-init의 최신 버전이 설치되어 있는지 확인합니다.

설치가 되어있지 않다면 cloud-init을 설치해 줍니다.

apt-get install -y cloud-init

ec2 인스턴스의 사용자 데이터에 스크립트를 넣어줍니다. 사용자 데이터를 편집하기 위해서는 인스턴스를 중지시킨 후 우클릭 > 인스턴스 설정 > 사용자 데이터 편집으로 들어갑니다.

위 화면에서 새 사용자 데이터 > 사용자 데이터를 텍스트로 수정을 체크 후 아래 코드를 입력 후 저장합니다.

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt
--//--

추가로 필요한 명령이나 쉘을 #!/bin/bash 와 --//-- 사이에 입력합니다.

이제 다시 인스턴스를 시작 후 제대로 적용되었는지 확인합니다.

제대로 적용되었습니다. 이제 vncserver를 자동 실행시켜보기전에 먼저 재부팅시 vncserver가 활성화가 되어 있는지 확인해 보기 위해 vncserver -list를 입력해 보겠습니다.

재부팅 시 vncserver가 실행되어 있지 않았고 이제 사용자 데이터에 vncserver 관련 명령어를 추가합니다.

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
su ubuntu -c "/usr/bin/vncserver"
--//--

vncviewer로 접속해보니 접속은 되는데 아래처럼 체크박스만 나옵니다.

이럴 때는 ~/.vnc/xstartup 파일을 아래처럼 수정합니다. (https://askubuntu.com/questions/1205687/ubuntu-18-04-vnc-grey-screen)

 #!/bin/sh
 autocutsel -fork
 xrdb $HOME/.Xresources
 xsetroot -solid grey
 export XKL_XMODMAP_DISABLE=1
 export XDG_CURRENT_DESKTOP="GNOME-Flashback:Unity"
 export XDG_MENU_PREFIX="gnome-flashback-"
 unset DBUS_SESSION_BUS_ADDRESS
 gnome-session --session=gnome-flashback-metacity --disable-acceleration-check --debug &

728x90
728x90
9. 소프트웨어 개발 보안 구축
Secure SDLC SDLC에 보안 강화를 위한 프로세스를 포함한 것
소프트웨어
개발 보안 요소
기밀성 : 시스템 내의 정보와 자원은 인가된 사용자에게만 접근이 허용
무결성 : 시스템 내의 정보는 인가된 사용자만 수정할 수 있음
가용성 : 인가받은 사용자는 언제라도 정보와 자원을 사용할 수 있음
SQL 삽입 웹 응용 프로그램에 SQL을 삽입하여 데이터를 유출 및 변조, 관리지 우회하는 보안 약점
크로스 사이트
스크립팅
웹 페이지에 스크립트를 삽입해 보안을 탈취하거나 비정상적인 기능을 유발하는 보안 약점
메모리 버퍼
오버플로
할당된 메모리의 범위를 넘어선 위치에서 자료를 읽거나 쓰려고 할 떄 발생하는 보안 약점
스택 가드 주소가 저장되는 스택에서 발생하는 보안 약점을 막는 기술
접근 제어자 외부로부터 접근을 제한하기 위해 사용되는 예약어
public / protected / default(java) / private
개인키 암호화 암호화, 복호화 하는 키가 같은 암호화 기법
공개키 암호화 암호화 할 때 사용되는 공개키는 사용자에게 공개, 복호화 할 때 상요되는 비밀키는 비밀리에 관리하는 암호화 기법
DES 개인키 암호화 알고리즘, NBS, 블록 64, 키 길이 56
AES 개인키 암호화 알고리즘, NIST, 블록 크기 128
RSA 공개 키 암호화 알고리즘, MIT
해시 입력 데이터나 메시지를 고정된 길이의 값이나 키로 변환하는 것
MD5 MD4를 대체하기 위 고안한 암호화 해시 함수, 블록 512, 키 길이 128
TKIP 무선 랜 프로토콜인 WEP의 취약성을 보완한 데이터 보안 프로토콜
스머핑 IPICMP의 특성을 악용하여 많은 양의 데이털르 한 사이트에 집중적으로 보내 네트워크를 불능 상태로 만드는 공격 방법
SYN Flooding 3-way-handshake 과정을 의도적으로 중단시켜 정상적인 서비스를 방해하는 공격 방법
LAND Attack 송신 IP 주소와 수신 IP 주소를 모두 공격 대상 IP로 지정하여 무한 응답을 하게 하는 방법
DDos 여러 곳에 반산된 공격 지점에서 한 곳의 서비스에 대해 서비스 거부 공격을 수행
세션 하이재킹 상호 인증과정을 거친 후 접속해 있는 서버와 클라이언트 사이의 세션 정보를 가로채는 공격 방법
ARP 스푸핑 자신의 MAC 주소를 공격대상의 것으로 변조하여 패킷을 가로채거나 방해하는 방법
스니핑 네트워크의 중간에서 남의 패킷 정보를 도청하는 방법
워터링 홀 웹 사이트를 사전에 감염시켜 사이트에 방문했을 때 악성 코드에 감염시키는 방법
키로거 공격 사용자의 키보드 움직임을 탐지해 정보를 빼가는 방법
랜섬웨어 잠입해 내부 문서나 파일 등을 암호화하는 프로그램
백도어 시스템 설계자가 액세스 편의를 위해 시스템 보안을 제거하여 만들어놓은 비밀 통로
11. 응용 SW 기초 기술 활용
운영체제 컴퓨터 시스템 자원을 효율적으로 관리하며 편리하고 효율적으로 사용할 수 있도록 환경을 제공하는 프로그램의 모임
UNIX AT&T 벨 연구소, MIT 등이 공동 개발한 운영체제, C언어로 작성되고 트리구조의 파일 시스템
커널 UNIX의 핵심적인 부분으로 프로그램과 하드웨어 간의 인터페이스 역할 담당
사용자의 명령어를 인식하여 수행하는 명령어 해석기
반입 전략 프로그램이나 데이터를 언제 주기억장치로 적재할 것인지를 결정하는 전략
배치 전략 프로그램이나 데이터를 어디에 주기억장치 어디에 위치시킬 것인지를 결정하는 전략
최초 적합 : 빈 영역 중에서 첫 번째 영역에 배치
최적 적합 : 단편화를 가장 적게 남기는 영역에 배치
최악 적합 : 단편화를 가장 많이 남기는 영역에 배치
가상기억장치 보조기억장치의 일부를 주 기억처럼 사용하는 것
페이징 기법 프로그램과 주기억장치의 영역을 동일한 크기로 나눈 후 주기억장치의 영역에 적재시켜 실행하는 기법
세그먼테이션 기법 프로그램을 다양한 크기의 논리적인 단위로 주기억장치에 적재시켜 실행시키는 기법
세그먼트 : 프로그램을 논리적인 크기로 나눈 단위
페이지 교체
알고리즘
페이지 부재가 발생하면 어떤 페이지 프레임을 교체할 것인지를 결정하는 기법
FIFO : 가장 먼저들어와 오래 있었던 페이지 교체
LRU : 최근에 가장 오랫동안 사용하지 않은 페이지 교체
Locality 프로세스가 실행되면서 주기억장치를 참조할 때 일부 페이지만 집중적으로 참조하는 성질
시간 구역성 : 하나의 페이지를 일정 시간 동안 집중적으로 액세스하는 현상
공간 구역성 : 일정 위치의 페이지를 집중적으로 액세스하는 현상
워킹셋 프로세스가 일정 시간 동안 자주 참조하는 페이지들의 집합
스래싱 프로세스의 처리 시간보다 페이지 교체에 소요되는 시간이 더 많아지는 현상
PCB 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓는 곳
프로세스 상태
전이

Dispatch : 준비 상태에서 대기하고 있는 프로세스 중 하나가 프로세스를 할당받아 실행 상태로 전이되는 과정
HRN 대기 시간과 서비스 실행 시간을 이용하는 기법
환경 변수 시스템 소프트웨어의 동작에 영향을 미치는 동적인 값들의 모임
chmod 파일의 보호 모드를 설정하여 파일의 사용 허가를 지정하는 UNIX 명령어
IP 주소 인터넷에 연결된 모든 컴퓨터 자원을 구분하기 위한 고유한 주소
IPv4 : 8비트씩 4부분 총 32비트로 구성된 주소
IPv6 : 16비트씩 8부분 총 128비트로 구성된 주소
프로토콜 데이터 교환을 원활하게 수행할 수 있도록 표준화시켜 놓은 통신 규약
OSI 참조 모델 물리 계층 : 기계적, 전기적 특성에 대한 규칙 정의
데이터 링크 계층 : 시스템 간 연결 설정과 유지 및 종료 담당
네트워크 계층 : 네트워크 연결을 관리하는 기능과 데이터의 교환, 중계 기능 담당
전송 계층 : 종단 시스템 간에 투명한 데이터 전송
세션 계층 : 송수신 측 간의 관련셩을 유지하고 대화 제어를 담당
표현 계층 : 시스템 간의 상호 접속을 위해 필요한 계층
응용 계층 : 사용자가 OSI 환경에 접속할 수 있도록 서비스 제공
패킷 교환 방식 메시지를 일정한 길이의 패킷으로 잘라서 전송하는 방식
가상 회선 방식 가상 통신 회선을 미리 설정하여 경로에 따라 패킷을 순차적으로 운반하는 방식
데이터그램
방식
연결 경로를 설정하지 않고 각각의 패킷들을 순서에 상관없이 독립적으로 운반하는 방식
TCP/IP 인터넷에 연결된 컴퓨터들 사이에 데이터를 주고받을 수 있게 하는 표준 프로토콜
ICMP IP와 조합하여 토신중에 발생하는 제어 메시지를 관리하는 역할
ARP IP 주소를 물리적 주소로 변환하는 기능을 수행하는 프로토콜
메시 네트워크 특수 목적을 위한 새로운 방식의 대규모 네트워크 기술
피코넷 블루투스 기술이나 UWB을 이용하여 통신망을 형성하는 무선 네트워크 기술
애드혹네트워크 모바일 호스트만을 이용하여 구성한 네트워크
NAT 한 개의 정식 IP 주소에 대량의 가상 사설 IP 주소를 할당 및 연결하는 기술
IGP 하나의 자율 시스템 내의 라우팅에 사용되는 프로토콜
RIP 거리 벡터 라우팅 프로토콜로 소규모 동종의 네트워크 내에서 효율적인 방법
OSPF 다익스트라 알고리즘을 사용한 대규모 네트워크에서 사용되는 인터넷 프로토콜
흐름제어 송수신 사이에서 전송되는 패킷의 양이나 속도를 규제하는 기능
블록체인 P2P 네트워크를 이용하여 온라인 금융 거래 정보를 온라인 네트워크 참여자의 디지털 장비에 분산 저장하는 기술
매시업 웹에서 제공하는 정보 및 서비스를 이용하여 새로운 소프트웨어나 서비스를 만드는 기술
RAID 2개 이상의 하드디스크로 디스크 배열을 구성하여 분산 저장하거나 다중화하는 저장 기술
Secure OS 보안 기능을 갖춘 커널을 이식하여 외부의 침입으로부터 시스템 자원을 보호하는 운영체제
하둡 일반 pc급 컴퓨터들로 가상화된 대형 스토리지를 형성하여 병렬로 처리하는 프레임워크
데이터 마이닝 대량의 데이터를 분서갛여 데이터에 내재된 변수 사이의 상호관계를 규명하여 일정한 패턴을 찾아내는 기법
타조 오픈 소스 기반 분산 컴퓨팅 플랫폼인 아파치 하둡 기반의 데이터 웨어하우스 프로젝트
로킹 트랜잭션들이 어떤 로킹 단위를 액세스하기 전에 잠금을 요청해서 허락되어야만 로킹 단위를 액세스할 수 있도록 하는 기법
교착상태 서로 다른 프로세스가 점유하고 있는 자원을 요규하여 무한정 기다리는 현상
12. 제품 소프트웨어 패키징
릴리즈 노트 소프트웨어 개발 과정에서 정리된 릴리즈 정보를 사용자와 공유하기 위한 문서
디지털 저작권
관리
저작권자가 배포한 디지털 콘텐츠가 저작권자가 의도된 용도로만 사용되도록 디지털 콘텐츠의 관리 및 보호 기술
클리어링
하우스
저작권에 대한 사용 권한, 라이선스 발급 등을 수행하는 곳
DRM 컨트롤러 배포된 콘텐츠의 이용 권한을 통제하는 프로그램
패키저 콘텐츠를 메타 데이터와 함계 배포 가능한 형태로 묶어 암호화하는 프로그램
형상 관리 개발 과정에서 소프트웨어의 변경 사항을 관리하기 위해 개발된 일련의 활동
저장소 최신 버전의 파일들과 변경 내역에 대한 정보들이 저장되어 있는 곳
커밋 작업 내용을 갱신
빌드 자동화
도구
빌드를 포함하여 테스트 및 배포를 자동화 하는 도구
728x90
728x90
4장. 서버 프로그램 구현
추상화 전체적이고 포괄적이 개념 설계 후 구체화시켜 나가는 것
정보 은닉 모듈 내부에 포함된 절차나 자료들의 정보가 감추어저 다른 모듈이 접근, 수정하지 못함
레이어 패턴 시스템을 계층으로 구분하여 구성하는 패턴
파이프-필터
패턴
데이터 스트림 절차의 각 단계를 필터로 캡슐화하여 파이프를 통해 전송하는 패턴
MVC 패턴 서브시스템을 모델, 뷰, 컨트롤러 구조화한 패턴
클래스 공통된 속성과 연산을 갖논 객체의 집합
캡슐화 외부에서의 접근을 제한하기 위해 인터페이스를 제외한 세부 내용을 은닉
상속 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려 받는 것
다형성 각각의 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력
객체지향 분석 객체, 속성, 연산, 관계 등을 정의하여 모델링하는 작업
럼바우 분석
기법
모든 소프트웨어의 구성 요소를 그래픽 표기법을 이용하여 모델링
객체 모델링 > 동적 모델링 > 기능 모델링
모듈 모듈화를 통해 분리된 시스템의 각 기능
결합도 모듈 간의 상호 의존하는 정도
내용 > 공통 > 외부 > 제어 > 스탬프 > 자료
응집도 모듈 내부 요소들이 서로 관련되어 있는 정도
기능 > 순차 > 교환 > 절차 > 시간 > 논리 > 우연
팬 인/아웃 인 : 제어 받는 모듈 수 / 아웃 : 제어 하는 모듈 수
IPC 모듈 간 통신 방식을 구현하기 위해 사용되는 대표적인 프로그래밍 인터페이스 집합
공유 메모리, 소켓, 세마포어, 파이프, 메시지 큐잉
테스트 케이스 소프트웨어가 사용자의 요규사항을 정확하게 준수했는지 확인하기 위한 항목에 대한 명세서
코드 자료의 분류, 추출 등을 용이하게 하기 위해 사용되는 기호
순차, 블록, 10진, 그룹 분류, 연상, 표의 숫자, 합성 코드
디자인 패턴 모듈 간의 관계 및 인터페이스를 설계할 때 참조할 수 있는 예제. 생성, 구조, 행위
생성 패턴 클래스나 객체 생성과 참조 과정을 정의
추상 팩토리 : 인터페이스를 통해 객체들의 그룹으로 생성하여 추상적으로 표현
빌더 : 건축하듯이 조합하여 객체 생성
팩토리 메소드 : 객체 생성을 서브 클래스에서 처리하도록 분리
프로토타입 : 원본 객체를 복제
싱글톤 : 하나의 객체를 생성하면 어디서든 참조 가능하지만 여러 프로세스 참조는 안됨
구조 패턴 클래스나 객체를 조합하여 더 큰 구조로 만드는 패턴
어댑터 : 클래스들의 인터페이스를 다른 클래스가 이용할 수 있도록 변환
브리지 : 독립적 확장 가능
컴포지트 : 복합 객체와 단일 객체를 구분 없이 다룸
데코레이터 : 결합을 통해 능동적으로 기능 확장
퍼싸드 : 상위에 인터페이스 구성하여 서브 클래스들의 기능을 간편하게 사용
플라이웨이트 : 인스턴스 공유하여 메모리 절약
프록시 : 객체 사이에서 인터페이스 역할 수행
행위 패턴 클래스나 객체들이 서로 상호작용하는 방법이나 책임 분배 방법을 정의하는 패턴
책임 연쇄 : 객체가 요청을 처리 못하면 다른 객체에 넘어감
커맨드 : 요청을 객체의 형태로 캡슐화
인터프리터 : 언어에 문법 표현을 정의
반복자 : 객체에 대해 동일한 인터페이스를 사용
중재자 : 수많은 객체들 간의 복잡한 상호작용을 캡슐화하여 객체로 정의
메멘토 : 특정 시점의 객체 내부 상태 객체화
옵서버 : 객체의 상태가 변화하면 상속되어 있는 다른 객체들에게 상태 전달
상태 : 객체의 상태에 따라 동일한 동작을 다르게 처리
전략 : 동일한 계열의 알고리즘들을 별개로 캡슐화하여 상호 교환
템플릿 메소드 : 상위 클래스에서 골격 정의 후 하위에서 구체화
방문자 : 클래스의 데이터 구조에서 처리 기능을 분리하여 따로 구성
배치 프로그램 여러 작업들을 미리 정해진 일련의 순서에 따라 일괄적으로 처리하도록 만든 프로그램
5장. 인터페이스 구현
요구사항 검토 요구사항 명세서의 오류 확인 및 결함 여부를 담당자들이 수작업으로 분석
워크스루 : 명세서를 미리 배포하여 사전 검토 후 짧은 회의를 통해 결함 발견
미들웨어 운영체제와 응용 프로그램 사이에서 다양한 서비스를 제공하는 소프트웨어
RPC : 원격 프로시저 호출
TP-Monitor : 온라인 트랜잭션 업무에서 트랜잭션을 처리 및 감시
EAI 기업 내 각 종 애플리케이션 및 플랫폼 간의 상호 연동이 가능하게 해주는 솔루션
Point-to-Point, Hub & Spoke, Message Bus(ESB 방식), Bus Hybrid
JSON 웹과 프로그램 사이에서 데이터를 교환하기 위해 객체를 속성, 값의 쌍 형태로 표현한 포맷
AJAX 자바스크립트를 사용하여 클라이언트와 서버간에 XML 데이터를 주고받는 비동기 통신 기술
IPsec 네트워크 계층에서 IP 패킷 단위의 데이터 변조 방지 및 은닉 기능을 제공하는 프로토콜
SSL TCP/IP 계층과 애플리케이션 계층 사이에서 인증, 암호화, 무결성을 보장하는 프로토콜
S-HTTP 클라이언트와 서버 간에 전송되는 모든 메시지를 암호화 하는 프로토콜
xUnit 같은 테스트 코드를 여러 번 작성하지 않게 도와주며 테스트마다 예상 결과를 기억할 필요가 없게 하는 자동화된 해법을 제공하는 단위 테스트 프레임워크
STAF 서비스 호출 및 컴포넌트 재사용 등 다양한 환경을 제공하는 테스트 프레임워크
FitNess 웹 기반 테스트 케이스 설계 등을 지원하는 테스트 프레임워크
NTAF FitNess + STAF, NHN의 테스트 자동화 프레임워크
Watir 인터프리터 방식의 Ruby를 사용하는 테스트 프레임워크
APM 애플리케이션 성능 관리를 위해 다양한 모니터링 기능을 제공하는 도구
6장. 화면 설계
UI 사용자와 시스템 간의 상호작용이 원활하게 이뤄지도록 도와주는 장치나 소프트웨어
UX 사용자가 시스템을 이용하면서 느끼고 생각하게 되는 총제적인 경험
CLI 명령과 출력이 텍스트 형태로 이뤄지는 인터페이스
GUI 아이콘이나 메뉴를 마우스로 선택하여 작업을 수행하는 그래픽 환경의 인터페이스
NUI 별도의 장치 없이 사용자의 자연스러운 움직임으로 기기를 조작하는 인터페이스
UI의 기본 원칙 직관성, 유효성, 학습성, 유연성
ISO/IEC 9126 소프트웨어의 품질 특성과 평가를 위한 국제 표준
기능성, 신뢰성, 사용성, 효율성, 유지보수성, 이식성
7장. 애플리케이션 테스트 관리
파레토 법칙 애플리케이션의 20%에서 전체 결함의 80%가 발견된다는 법칙
살충제
패러독스
동일한 테스트 케이스를 반복하면 더 이상 결함이 발견 안되는 현상
정적 테스트 프로그램을 실행하지 않고 명세서나 소스 코드를 대상으로 분석하는 테스트
동적 테스트 프로그램을 실행하여 오류를 찾는 테스트
검증 테스트 개발자의 시각에서 생산 과정을 테스트 하는 것
확인 테스트 사용자의 시각에서 생산된 제품의 결과를 테스트 하는 것
화이트 박스
테스트
원시 코드를 오픈한 상태에서 원시 코드의 논리적인 모든 경로를 테스트하여 테스트 케이스를 설계하는 방법
검증 기준 문장 검증 기준 : 소스코드의 모든 구문이 한번 이상 수행되도록
분기 검증 기준 : 모든 조건문에 대해 결과가 true와 false 한번 이상 수행되도록
조건 검증 기준 : 조건문에 포함된 개별 조건식의 결과가 ture와 false 한번 이상 수행되도록
블랙박스
테스트
각 기능이 완전히 작동되는 것을 입증하는 테스트
동치 분할 검사 입력 조건에 타당한 입력 자료와 타당하지 않은 입력 자료의 개수를 균등하게 테스트 케이스를 만들어 입력 자료에 맞는 결과가 출력되는지 확인
경계값 분석 입력 조건의 경계값에서 오류가 발생될 확률이 높다는 점을 이용해 경계값을 테스트 케이스로 선정하여 검사
원인-효과
그래프 검사
입력 데이터 간의 결과와 출력에 영향을 미치는 상황을 분석하여 다음 효용성이 높은 테스트 케이스를 선정하여 검사
V-모델 소프트웨어 개발 단계와 케이션 테스트를 연결하여 표현한 것
단위 테스트 모듈이나 컴포넌트에 초점을 맞춰 테스트
통합 테스트 단위 테스트가 완료된 모듈을 합쳐 하나의 시스템으로 완성시키는 테스트
인수 테스트 요구사항을 충족시키는지에 중점을 두고 테스트, 알파/베타 테스트
하향식 통합
테스트
상위 모듈에서 하위 모듈 방향으로 통합하여 테스트
스텁 : 제어 모듈이 호출하는 타 모듈의 기능을 단순히 수행하는 도구
상향식 통합
테스트
하위 모듈에서 상위 모듈 방향으로 통합하여 테스트
테스트 드라이버 : 테스트 대상의 하위 모듈을 호출, 전달, 수행 후 결과를 도출하는 도구
애플리케이션
성능 측정 지표
처리량, 응답 시간, 경과 시간, 자원 사용률
정적 분석 도구 작성한 소스코드를 실행하지 않고 코딩 표준이나 결함을 확인하는 코드 분석 도구
동적 분석 도구 작성한 소스코드를 실행하여 메모리 누수나 결함 등을 분석하는 도구
728x90
728x90

시험 전에 보면 좋을것을 간단하게 정리했습니다. 기출이랑 같이 보면 좋을거 같아서 공유합니다. 

 

프로그래밍과 SQL 부분도 많이 출제가 되니 따로 꼭 보셔야 합니다.

 

1. 요구사항
폭포수 모형 각 단계를 확실히 매듭짓고 그 결과를 검토하여 승인 과정을 거친 후에 다음 단계를 진행하는 개발 방법론
애자일 모형 요구사항 변화에 유연하게 대응할 수 있도록 일정한 주기를 반복하면서 개발하는 모형
소프트웨어 공학 소프트웨어의 위기를 극복하기 위한 방안으로 연구된 학문
XP 요구사항에 유연하게 대응하기 위해 고객의 참여와 개발 과정의 반복
의사소통, 단순성, 용기, 존중, 피드백
XP 주요 실천 방법 짝 프로그래밍, 공동 코드 소유, 전체 팀, 계속적인 통합, 리팩토링
리팩토링 : 프로그램을 쉽게 이해하고 수정하여 빠르게 개발할 수 있도록 프로그램의 기능 변경 없이 시스템을 재구성
요구사항 기능 요구사항 : 기능이나 수행과 관련된 요구사항
비기능 요구사항 : 품질이나 제약사항과 관련된 요구사항
자료 흐름도 자료의 흐름 및 변환 과정과 기능을 도형 중심으로 기술
프로세스, 자료 흐름, 자료 저장소, 단말
SADT 시스템 정의, 소프트웨어 요구사항 분석, 시스템/소프트웨어 설계를 위한 도구
HIPO 시스템 실행 과정인 입력, 처리, 출력의 기능을 표현한 것
UML 객체지향 모델링 언어. 사물, 관계, 다이어그램
집합 관계 하나의 사물이 다른 사물에 포함되어 있는 관계
일반화 관계 하나의 사물이 다른 사물에 비해 더 일반적이거나 구체적인 관계
의존 관계 서로에게 영향을 주는 짧은 시간 동안만 연관을 유지하는 관계

다이어그램 사물과 관계를 도형으로 표현한 것
구조적 다이어그램 : 클래스, 객체, 컴포넌트, 배치, 복합체 구조, 패키지
유스케이스
다이어그램
포함 관계 : 원래의 유스케이스와 새롭게 분리된 유스케이스와의 관계 <<include>>
확장 관계 : 특정 조건에 부합되어 유스케이스의 기능이 확장 <<extend>>
구조적 방법론 사용자의 요구사항을 파악하여 문서화하는 처리 중심의 방법론
소프트웨어 재사용 이미 개발되어 인정받은 소프트웨어를 다른 소프트웨어 개발이나 유지에 사용
합성 중심 : 소프트웨어를 부품(블록)으로 만들어 끼워 맞춰 완성시키는 방법
생성 중심 : 추상화 형태로 명세를 구체화하여 프로그램을 만드는 방법
CASE 소프트웨어 개발 과정에서 사용되는 과정 전체 또는 일부를 컴퓨터와 전용 소프트웨어 도구를 사용하여 자동화하는 것
LOC 기법 각 기능의 원시 코드 라인 수의 비관치, 낙관치, 기대치를 측정하여 예측치를 구하고 이를 이용하여 비용을 산정하는 기법
COCOMO 조직형 : 5만 라인 이하의 사무처리, 업무용
반분리형 : 30만 라인 이하의 컴파일러, 인터프리터 같은 유틸리티 개발용
내장형 : 30만 라인 이상의 미사일 유도 시스템, 실시간 시스템 등의 시스템 프로그램
Putnam 모형 소프트웨어 생명 주기의 전 과정 동안에 사용될 노력의 분포를 예상하는 모형
ISO/IEC 12207 표준 소프트웨어 생명 주기 프로세스
SPICE 소프트웨어의 품질 및 생산성 향상을 위해 소프트웨어 프로세스를 평가하는 표준
불완전 > 수행 > 관리 > 확립 > 예측 > 최적화
소프트웨어 개발
프레임워크
소프트웨어 개발에 공통적으로 사용되는 구성 요소와 아키텍처를 일반화하여 제공해주는 반제품 형태의 소프트웨어 시스템
모듈화, 재사용성, 확장성, 제어의 역 흐름
2. 데이터 입출력 구현
스키마 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 것
데이터베이스 설계
순서
요구 조건 분석 > 개념적 설계 > 논리적 설계 > 물리적 설계 > 구현
개념적 설계
-       개념 스키마, 트랜잭션 모델링, E-R 모델
-       현실 세계에 대한 인식을 추상적 개념으로 표현
논리적 설계
-       논리 스키마, 트랜잭션 인터페이스
-       현실 세계에서 발생하는 자료를 논리적 자료 구조로 변환
물리적 설계
-       DDL로 데이터 베이스 생성, 트랜잭션 작성
-       논리적 구조로 표현된 데이터를 물리적 구조의 데이터로 변환
데이터 모델 현실 세계의 정보들을 체계적으로 표현한 개념적 모형
표시될 요소 : 구조, 연산, 제약조건
릴레이션 데이터들을 표의 형태로 표현
개체 타입 = 릴레이션 스키마
개체 인스턴스 = 릴레이션 인스턴스 = 튜플
튜플 릴레이션을 구성하는 각각의 행
속성 데이터베이스를 구성하는 가장 작은 논리적인 단위
후보키 속성들 중에서 튜플을 유일하게 식별하기 위해 사용되는 속성들의 부분집합
유일성 : 하나의 키 값으로 하나의 튜플만을 유일하게 식별할 수 있어야 함
최소성 : 키를 구성하는 속성 하나를 제거하면 유일하게 식별할 수 없도록 꼭 필요한 최소의 구성으로 구성되어야 함
기본키 후보키 중에서 특별히 선정된 주키
대체키 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키
슈퍼키 속성들의 집합으로 구성된 키
외래키 다른 릴레이션의 기본 키를 참조하는 속성 또는 속성들의 집합
무결성 데이터베이스에 저장된 데이터 값과 현실 세계의 값이 일치하는 정확성
개체 무결성 : 기본 테이블의 기본키를 구성하는 어떤 속성도 NULL 값이나 중복 값을 가질 수 없음
참조 무결성 : 릴레이션은 참조할 수 없는 외래키의 값을 가질 수 없음
관계대수 데이터베이스에서 원하는 정보와 그 정보를 검색하기 위해 어떻게 유도하는가를 기술하는 절차적인 언어
순수관계연산자 Select : 튜플 중에서 조건을 만족하는 튜플의 부분집합을 구해 새로운 릴레이션을 만드는 연산, 수평연산, 시그마
Project : 속성 리스트에 제시된 속성 값들만 추출하여 새로운 릴레이션을 맏느는 연산, 수직연산, 파이
Join : 두 개의 릴레이션을 하나로 합쳐 새로운 릴레이션을 만드는 연산, 나비넥타이 기호
Division : 다른 하나의 속성 값을 모두 가진 튜플에서 속성을 제외한 속성만을 구하는 연산, 나눗셈 기호
교차곱 두 릴레이션에 있는 튜플들의 순서쌍을 구하는 연산. 디그리(속성 수)는 더한 것과 같고 카디널리티(튜플 수)는 곱한 것과 같음
이상 데이터베이스 내의 데이터들이 불필요하게 중복되어 조작 시에 예기치 않게 발생하는 곤란한 현상
삽입 이상 : 삽입 시 원하지 않는 값들로 인해 삽입할 수 없는 현상
삭제 이상 : 삭제할 때 의도와는 상관없는 값들도 같이 삭제되는 현상
갱신 이상 : 속성 값 갱신 시 일부 튜플의 정보만 갱신되어 정보 불일치성이 생기는 현상
정규화 테이블의 속성들이 상호 종속적인 관계를 갖는 특성을 이용하여 테이블을 무손실 분해하는 과정
반정규화 시스템 성능 향상을 위해 정규화된 데이터 모델을 의도적으로 통합, 중복, 분리하여 정규화 원칙을 위배하는 행위
시스템
카탈로그
다양한 객체에 관한 정보를 포함하는 시스템 데이터베이스, 데이터 사전
트랜잭션 논리적 기능을 수행하기 위한 작업의 단위, 한꺼번에 모두 수행되어야 할 일련의 연산
원자성 : 연산은 모두 반영되도록 완료되거나 반영되지 않도록 복구되어야 함
일관성 : 연산이 성공하면 언제나 일관성 있는 데이터 상태로 변환
독립성 : 둘 이상의 트랜잭션이 실행되는 경우 하나가 실행중에 다른게 끼어들 수 없음
지속성 : 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 함
인덱스 데이터 레코드를 빠르게 접근하기 위해 <키 값, 포인터> 쌍으로 구성되는 데이터 구조
접근이 허용된 자료만을 보여주기 위해 하나 이상의 테이블로부터 유도된 가상 테이블
파티션 테이블이나 인덱스를 파티션으로 나누는 것
범위 분할 : 지정한 열의 값으로 분할
해시 분할 : 해시 함수를 적용한 결과 값에 따라 분할
조합 분할 : 범위 분할 후 해시 분할
분산 데이터
베이스의 목표
위치 투명성 : 데이터베이스 명칭만으로 접근
중복 투명성 : 여러 곳에 중복되어 있어도 하나의 데이터만 존재하는 것처럼 사용
병행 투명성 : 다수 트랜잭션이 실행되도 결과는 영향이 없음
장애 투명성 : 장애에도 불구하고 정확한 트랜잭션 처리
RTO 복구되어 가동될 떄까지의 시간
RPO 중단 시점으로부터 데이터를 복구할 수 있는 기준점
암호화 데이터를 보낼 때 송신자가 지정한 수신자 이외에는 알 수 없도록 평문을 암호문으로 변환
개인키 암호 방식, 공개키 암호 방식
임의 접근통제 사용자의 신원에 따라 접근 권한 부여
강제 접근통제 등급을 비교하여 접근 권한 부여
DAS 서버와 저장장치를 전용 케이블로 직접 연결
NAS 서버와 저장장치를 네트워크 통해 연결
SAN DAS + NAS, 광채널 스위치 이용
3. 통합 구현
XML 특수한 목적을 갖는 마크업 언어를 만드는 데 사용되는 다목적 마크업 언어
SOAP 네트워크 상에서 HTTP/HTTPS, SMTP 등을 이용하여 XML을 교환하기 위한 통신 규약
WSDL 웹 서비스와 관련된 서식이나 프로토콜 등을 표준적인 방법으로 기술, 게시하기 위한 언어
728x90
728x90

https://1d1cblog.tistory.com/455에 이어 VNC 세팅을 하려고 합니다.

 

[스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(2)

[스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(1) 에 이어 ssh 접속을 시도해보려 합니다. [스마트홈 구축 프로젝트] 1. AWS EC2 개발환경 세팅(1) AWS는 Amazon Web Service EC2는 Elastic Compute Cloud로..

1d1cblog.tistory.com

 

이번에는 ssh가 아닌 ec2 인스턴스 연결로 사용하려 합니다. 인스턴스에서 우클릭 > 연결로 들어갑니다.

인스턴스에 연결 오른쪽 아래의 연결 버튼을 클릭합니다.

그러면 아래와 같이 웹에서 연결이 가능합니다.

우선 update 후 ubuntu desktop을 설치합니다.

sudo apt-get update
sudo apt-get install ubuntu-desktop

다음으로 gnome-panel을 설치합니다. 

sudo apt-get install gnome-panel


이제 vncserver를 설치할 차례인데 저는 tigervnc로 진행하려 합니다. 아래 명령을 입력해서 설치를 해줍니다.

sudo apt-get install tigervnc-standalone-server tigervnc-xorg-extension

설치가 완료되었다면 다음으로 비밀번호를 설정해줍니다.

vncpasswd

다음 ~/.vnc/xstartup 파일을 수정합니다.

접속 테스트를 위해 vncserver를 한번 실행해 봅니다. 

vncserver :1 -localhost no

뒤에 콜론 + 숫자는 디스플레이 번호로 기본 포트 5900 + 디스플레이 번호로 접근하면 됩니다.

뒤 옵션은 로컬호스트말고 다른 곳에서도 접근할 수 있게 해줍니다.

 

client에서 접속 전에 인스턴스의 인바운드 규칙을 설정해 줘야 합니다.

 

인스턴스 목록에 하위 설정에서 보안을 클릭 후 보안 그룹 아래 링크를 클릭합니다.

아래 화면에서 인바운드 규칙 편집을 클릭합니다.

규칙 추가 후 TCP - 5901 포트를 추가 후 저장합니다.

tiger vnc viewer를 통해 접속해 보겠습니다. https://tigervnc.org/로 접속해 아래 Download에서 Github Release page로 들어갑니다.

 

TigerVNC

TigerVNC is a high-performance, platform-neutral implementation of VNC (Virtual Network Computing), a client/server application that allows users to launch and interact with graphical applications on remote machines. TigerVNC provides the levels of perform

tigervnc.org

아래 sourceforge 링크로 들어갑니다.

vncviewer를 클릭하여 다운 받습니다.

다운이 완료됐으면 실행 후 public IP:Port로 연결합니다.

동일하게 vncviewer에서도 접속이 가능합니다.

728x90

+ Recent posts