Eclipse에서 C++11 이상 지원하도록 설정하는 방법

|

C++11

C언어는 지금도 계속해서 발전하고 있습니다. 2011년 C++11 규격이 정해졌으며, 그 이후에도 계속하여 발전하고 있습니다. 지금은 현재 C++14, C++17 까지 나온 상태입니다. 개인적인 생각으로는 C++11에서 아주 큰 변화(스마트 포인터 지원 및 Thread 표준화)가 있었던 것 같습니다. 그래서 신규 프로젝트를 진행한다면 적어도 C++11 이상은 사용하는 것이 좋다고 생각합니다. 그 중에서도 스마트 포인터(Smart Pointer)는 메모리 릭(Memory Leak) 방지에 아주 큰 도움이 되며, 표준화가 된 쓰레드(Thread)는 멀티 플랫폼 지원에 유리할 것 같습니다.


Eclipse for C++11

Visual Studio나 CLion 등 좋은 C++ IDE가 많이 있지만, 회사에서는 아무래도 Eclipse를 많이 사용하게 되네요. 아마도 라이센스를 크게 신경쓸 필요가 없어서이지 않을까 싶습니다. 그래서 Eclipse에서 C++11 이상을 지원하는 방법을 포스팅해봅니다. 저는 현재 PC에 MinGW를 설치했기 때문에 포스팅을 MinGW 기준으로 설명을 하고 있지만, MinGW가 아니더라도 Cygwin 등 기타 다른 컴파일러에서도 거의 동일한 설정을 하면 됩니다.


image

일단 새로운 프로젝트를 시작하고 컴파일러를 MinGW를 선택합니다. (굳이 새로운 프로젝트를 시작할 필요없이 세팅에서 바로 설정을 할 수도 있지만, 여기서는 실제로 C++11 문법으로 잘 빌드가 되는지 확인하기 위해서 새로운 프로젝트를 만들어서 테스트를 합니다.)


image -fullwidth

Project > Properties > C/C++ Build / Settings > Tool Settings에서 [GCC C++ Compiler] 항목과 [GCC C Compiler] 항목에서 [Miscellaneous] 항목을 찾습니다. 그리고 [Other flags] 뒷 부분에 다음 옵션을 추가합니다.

-std=c++0x


이제 간단한 코드를 작성하여 테스트를 해봅니다. 코드 예제는 다음과 같습니다. 코드 작성 후 빌드를 실행해봅니다.


#include <cstdio>
#include <memory>
#include <string>
#include <thread>

using namespace std;

int main(void) {
  printf("Hello SnowDeer.\n");

  shared_ptr<string> a = make_shared<string>();

  return 0;
}


image -fullwidth


위 이미지와 같이 빌드가 잘 되는 것을 확인할 수 있습니다.

하지만 다음 이미지에 나온 것처럼 문제점이 하나 있습니다.


image -fullwidth

컴파일 및 빌드는 잘되지만, Eclipse의 에디터에서는 오류가 난 것처럼 표시되고 있습니다. 그냥 무시하고 개발을 진행해도 되지만, 시각적으로 상당히 불편합니다. 이럴거면 IDE를 사용하는 의미가 없을 것 같네요. 이를 해결하기 위해서는 IDE 내의 에디터키가 C++11 이상을 지원하도록 추가 설정을 해주어야 합니다. 앞서 설정한 내용은 컴파일러의 옵션만 설정한 것이기 때문에 추가 설정이 필요합니다.


image -fullwidth

Project > Properties > C/C++ General > Preprocessor Include Paths, Macros etc에서 [Providers] 탭을 선택한 다음 [CDT GCC Built-in Compiler Settings MinGW] 항목을 선택합니다. 그리고 아래쪽에 있는 Flag 설정 칸에 다음 옵션을 추가해줍니다.

-std=c++0x


image

그 이후 C/C++ Index Rebuild 를 수행해주면 Eclipse IDE가 C++11 문법을 정상적으로 인식하기 시작합니다.


image -fullwidth

이제 깔끔하게 Eclipse에서 C++11 이상의 문법들로 프로그램을 작성할 수 있습니다.

블루투스 페어링하기

|

라즈베리 파이(Raspberry PI)와 블루투스 기기간의 페어링하는 방법입니다. 터미널 명령어를 이용한 블루투스 페이렁 방법을 소개합니다.

먼저 라즈베리 파이 터미널에서 다음 명령어를 입력합니다.

bluetoothctl

image -fullwidth

위 스크린샷과 같이 프롬프트가 ‘[bluetooth]’로 바뀌면, 이제 블루투스 명령어들을 사용할 수 있습니다.

이 상태에서 사용할 수 있는 블루투스 명령어들은 다음과 같습니다. (명령어 ‘help’를 통해 확인할 수 있습니다.)

image -fullwidth


라즈베리 파이의 블루투스 정보는 다음 명령어를 이용해 조회할 수 있습니다.

show

image -fullwidth


다른 디바이스들을 탐색하기 위해서 디스커버리(Discovery)를 수행하거나 종료하는 명령어는 다음과 같습니다. 이 때, 페어링하고 싶은 디바이스(ex. 스마트폰)에서도 블루투스 검색 허용을 활성화해줘야 아래 명령어로 검색을 할 수 있습니다. 탐색이 되지 않은 상태에서 Bluetooth MAC Address를 이용한 페어링을 시도했을 때는 페어링이 되지 않더군요.

scan on
scan off

image -fullwidth


자기 자신을 다른 디바이스에서 보이도록 하는 명령어는 다음과 같습니다.

discoverable on
discoverable off


페어링을 원하는 디바이스의 맥 어드레스(MAC Address)를 기억해둡니다. 그리고 페어링을 시도합니다.

pair [MAC Address]


페어링이 되면 스마트폰에 페어링 확인 창이 뜹니다. 스마트폰 화면에서 확인을 눌러줍니다. 그 다음 trust 명령어를 수행합니다.

trust [MAC Address]

image -fullwidth


이제 페어링이 끝났습니다. 다음 명령어를 통해 현재 페어링된 디바이스 목록을 조회할 수 있습니다.

paired-devices

Windows 10 - 복구 파티션 삭제하기

|

복구 파티션 삭제하기

집에 있는 데스크탑을 업그레이드하고, 예전에 사용하던 하드 디스크를 연결했습니다. 덕분에 현재 컴퓨터에 하드 디스크 3개가 주렁주렁 매달려 있습니다. 세세하게 나눴던 파티션을 좀 정리하고 커다란 공간을 쓰고 싶어서 각 하드 디스크의 파티션 정리를 하려고 했습니다.

image


하지만, 삭제가 안되는 파티션이 있네요 !!! ‘복구 파티션’이라고 표시된 영역은 컴퓨터 관리 윈도우에서 건드릴 수가 없게 되어 있었습니다. 그냥 무시하고 나머지 영역만 쓸까 생각도 했지만, 17.08 GB는 너무 큰 용량이라서 완전히 삭제하는 방법을 찾아보게 되었습니다.

관리자 모드로 커맨드 창 실행

먼저 관리자 모드로 커맨드 창을 실행합니다.

image

그리고 커맨드 창에서 다음 명령어를 실행합니다.

image

그 이후, 아까 삭제를 할 수 없었던 물리 디스크를 선택하고(저는 디스크 3번이 삭제가 안되었기 때문에 3번 디스크를 선택했습니다.)

select disk [번호]

파티션 리스트를 확인합니다.

list partition

image

그 이후 지우고자 하는 파티션을 선택하고

select partition [번호]

삭제를 합니다.

delete partition override

image

그런 다음 컴퓨터 관리 윈도우로 간 다음 파티션이 정상적으로 삭제된 것을 확인할 수 있습니다.

image

블록체인과 P2P 통신

|

P2P 네트워크

P2P는 ‘Peer-to-Peer’라는 뜻으로 중앙 서버없이 각 단말들이 서로 동등한 입장에서 통신을 하는 네트워크를 말합니다. 각 단말은 서버이기도 하면서 동시에 클라이언트가 됩니다. 대표적인 P2P 서비스로 비트토렌트(BitTorrent)를 들 수 있습니다.

블록체인은 P2P 형태의 이루어진 탈중앙화 네트워크입니다. 따라서 P2P 네트워크가 갖고 있는 특징 및 장단점을 그대로 갖고 있습니다.


서버/클라이언트 네트워크의 장단점

  • 서버가 서비스 관리를 집중적으로 수행하기 때문에 시스템의 설계 및 유지가 쉬움
  • 기능 추가, 버그 수정 등 업데이트 및 관리가 쉬움
  • 서버 장애 등이 발생할 경우 서비스 전체가 중단됨


P2P 네트워크의 장단점

  • 서버를 준비할 필요가 없고, 각 노드들이 트래픽과 자원을 할당해 부하를 분산시켜줌
  • 즉, 노드가 증가하더라도 서비스를 유지할 수 있는 높은 확장성을 갖고 있음
  • 새로운 기능을 추가하거나 업데이트를 할 경우 관리가 어려움
  • 네트워크 전송 시간 때문에 노드간 정보 불일치, 성능 저하가 발생하기 쉬움


하이브리드 P2P와 퓨어 P2P

P2P 시스템을 크게 2가지로 분류하면 각 노드들을 발견하고 탐색하기 위한 인덱스 서버(Index Server)를 사용하는 ‘하이브리드(Hybrid) P2P’와 순수하게 노드들만 존재하며, 노드 탐색 등의 기능도 노드들이 알아서 수행하는 ‘퓨어 P2P(Pure P2P)’로 구분할 수 있습니다.


하이브리드 P2P

image -fullwidth

하이브리드 P2P는 각 노드의 정보들이 인덱스 서버에 기록이 됩니다. 각 노드들간 데이터를 주고 받는 방식은 P2P로 이루어지지만, 노드들의 검색 및 발견 등은 인덱스 서버를 통해서 이루어집니다. 그래서 마치 서버/클라이언트 구조처럼 설계와 관리가 용이하지만 확장성이 떨어지는 단점이 있습니다. 스타크래프트와 같은 많은 게임들이 하이브리드 P2P 방식을 사용하고 있습니다. 게임상의 높은 네트워크 성능을 위해 유저간 직접 연결하는 P2P 통신을 사용하지만, 서로 방을 만들고 검색, 조인하기 위해서는 인덱스 서버를 활용합니다.


퓨어 P2P

image -fullwidth 퓨어 P2P는 모든 노드가 동등한 입장으로 네트워크에 연결되어 있습니다. 즉, 새로운 노드가 추가되는 등의 확장성은 높으나 시스템 전반을 설계하고 관리하기가 어렵다는 단점이 있습니다. 또한 각 노드들이 자율적으로 다른 노드들을 발견하고 탐색할 수 있도록 하는 알고리즘을 구현해야 하는 문제점이 있습니다.


구조화 오버레이와 비구조화 오버레이

구조화 오버레이는 각 노드들이 물리적으로 연결되어 있으며, 그에 따라 네트워크 토폴로지(Topology)도 반영되어 있는 네트워크입니다. 각 노드들의 ID가 할당되어 있고, 그에 따라 연결되는 대상들도 이미 정해져 있습니다. 라우팅(Routing)을 통해 메세지 전송 경로가 선택되어 있습니다. 따라서 다음과 같은 특징을 가집니다.

  • 메세지를 전송하면 목적지 ID를 향해 효율적으로 전송이 되기 때문에 메세지 도착 가능성이 높음
  • 노드의 확장성이 높음
  • 노드 수가 증가하더라도 메세지의 전송 횟수는 크게 늘어나지 않음
  • 노드 탐색은 네트워크의 물리적인 구조에 영향을 받아 유연함이 떨어짐


반면 비구조화 오버레이는 서로 물리적으로 연결되어 있지는 않지만, 논리적으로 연결된 것처럼 사용하는 네트워크입니다. 일반적으로 각 가정에서 P2P를 이용하는 경우가 비구조화 오버레이 구조입니다. 네트워크 토폴로지가 없으며, 각 노드를 탐색할 때는 탐색 메세지를 브로드캐스트(Broadcast)하여 주변 노드들에게 확산해나가는 방법을 사용합니다. 그러다보니 특정 노드를 향해 메세지를 전송할 경우 각 노드들간 메세지가 전파되면서 중간에 소실되는 경우가 많으며, 노드 수가 증가할 수록 메세지의 전송 횟수가 크게 증가하는 문제점이 있습니다.

  • 메세지 전송시 주변 노드에게 전파시켜 전달하다보니, 특정 노드에 메세지 전달하는 것을 보장할 수 없음
  • 노드 수가 많으지면 메세지 전송 횟수가 크게 증가함
  • 물리적 네트워크 구조와 관계없이 주변 노드들을 유연하게 탐색하기 유리함

비구조화 오버레이에서 메세지 전송 문제를 해결하기 위해, 중간 중간 슈퍼 노드를 배치하여 메세지 전송을 효율적으로 하려는 개념도 있습니다.

image -fullwidth


블록체인의 기술 분류

블록체인은 P2P 기술을 이용하고 있습니다. 다만 블록체인의 종류에 따라서 그 특징이 다르기 때문에 분류 또한 다릅니다.

비트코인과 이더리움같은 경우는 모든 노드가 동등한 입장에서 네트워크를 형성하기 때문에 퓨어 P2P로 분류 가능합니다. 또한 네트워크 토폴로지 역시 정해지지 않았기 때문에 비구조화 오버레이라고 할 수 있습니다.

하이퍼레저같은 경우는 각 노드마다 그 역할을 다르게 지정할 수 있습니다. 네트워크 토폴로지가 정해지지 않았기 때문에 비구조화 오버레이이긴 하지만, 각 노드마다 역할을 다르게 하여 슈퍼 노드를 도입할 수 있습니다. 또한, 전용 멤버쉽(Membership) 서버를 갖고 있어 인덱스 서버 역할을 할 수 있기 때문에 하이브리드 P2P라고 할 수 있습니다.

비트코인 거래가 이뤄지는 방식

|

인터넷에서 우연히 발견한 그림입니다. 비트코인의 거래가 이루어지는 과정에 대해서 한 장의 그림으로 나름 친절하게 설명을 하고 있는 것 같아서 포스팅을 해봅니다. 그림에 이미 많은 설명이 되어 있어서 별도의 설명은 필요없을 것 같습니다.

image -fullwidth


블록체인이 아닌 비트코인의 방식에 대한 설명이긴 하지만, 다른 사람들에게 설명할 때 유용하게 사용할 수 있을 것 같습니다.