[Bloom Filter란]

Bloom Filter는 어떠한 값이 특정 데이터 집합에 속하는지를 판단하는데 사용하는 확률적 자료구조이다.
주로 데이터 집합의 크기가 매우 커서 데이터가 집합에 속해있는지 판단하는데 오래걸리는 경우 Bloom Filter를 사용한다.

  

그러나 언제나 정확한 값을 도출하지는 않는다. false nagative는 없으나 false positive가 발생할 수 있다.
즉, 집합에 속한것이 없는데 있다고 할 수는 있어도 있는걸 없다고 할일은 절대 없기 때문에
Bloom Filter에서 '이거 있어?'에 대한 대답은 '확실히 이건 없어요' 혹은 '있는거 같은데요'만 있다. '이거 있어요!'는 없다.
'있는거 같은데요'의 경우 확실히 있는지 알기위해서는 실제 데이터베이스에 접근하여 데이터 존재 여부를 정확히 판단하면 되므로 전체 시스템 구성에서 오류 발생률은 0%이다. (보통 Bloom Filter는 real DB 앞단에 구성되기때문)

  

Bloom Filter 말고도 Hash Table, AVL Tree, RB tree와 같은 오류 발생률 0%의 자료구조들도 있지만
Bloom Filter를 사용하는 이유는 바로 적은 메모리 사용을 통한 속도향상이다.
그러나 또 다른 특징중 하나는 데이터 집합에 원소를 삭제하는것이 불가능하다는 것이다.

  

Bloom Filter와 같은 용도에 삭제까지 가능한 자료구조가 있다.
바로 Cuckoo Filter라는 확률적 자료구조인데 성능에는 약간 차이가 있다.
Bloom Filter는 원소를 삽입 할 때 성능이 좋기 때문에 데이터 집합에 원소를 자주 추가하는 경우 사용하면 좋다.
반면 Cuckoo Filter는 데이터 조회가 더 빠르며 삭제도 가능하다.

[Bloom Filter 적용 사례]

- Chrome은 악성 URL을 확인하기위해 사용.
- Medium은 기사가 이미 유저에게 추천되었는지 확인하기위해 사용.
- Ethereum Blockchain 로그를 빠르게 찾기위해 사용.
- PostgreSQL과 Google Bigtable은 존재하지 않는 튜플 또는 컬럼을 찾는데 디스크 탐색을 줄이기 위해 사용.

[Redis에 Bloom Filter 설치]

Redis에서 BloomFilter는 기본적으로 내장된 자료구조가 아니다.

때문에 모듈을 redis server에 로드해서 사용해야한다.

RedisBloom 모듈의 소스코드를 다운받는다.
빌드하면 so 파일이 생성된다.
 /etc/redis/redis.conf 파일에 RedisBloom 모듈을 추가해준다.
서비스를 재시작한다.

RedisBloom 모듈은 여러 자료구조를 지원한다.

  • Bloom Filter

  • Cuckoo Filter

  • Count-Min Sketch

  • Top-K

[Bloom Filter 사용법]

  • BF.RESERVE : 빈 key를 생성하며 false positive 발생률, 원소의 갯수 등 옵션을 설정할 수 있다.
    포맷 - BF.RESERVE {key} {error_rate} {capacity} [EXPANSION expansion] [NONSCALING]

    key [필수] : 키 이름 설정  
    error_rate [필수] : false positive 발생률을 설정하며 인자 1을 100%로 기준삼아 0.1을 주면 10%이고 0.001을 주면 false positive 발생률 0.1%을 의미한다.  
    capacity [필수] : 최대 원소의 갯수를 설정하며 이 기준을 초과할 때 성능은 하락할 수 있다.  
    expansion [옵션] : 최대 원소의 갯수 초과시 몇개의 원소를 추가로 받을지 설정하는 옵션  
    NONSCALING [옵션] : 최대 원소의 갯수 초과시 추가 원소를 받지 않는다는 옵션  
    집합 false positive 최대 원소의 갯수 추가원소 허용
    BlackList 0.1% 50000 불가능
    WhiteList 1% 30000 5000
  • BF.ADD : key에 원소를 추가하며 없는 key라면 생성후 추가한다.
    포맷 - BF.ADD {key} {item}

      key [필수] : 키 이름 설정
      item [필수] : 삽입 할 원소
  • BF.MADD : BF.ADD와 같으며 다량의 원소를 한번에 추가할 수 있다.
    포맷 - BF.ADD {key} {item} [item] [item] [item]

  • BF.INSERT : BF.RESERVE와 BF.ADD를 합친것과 같다.
    포맷 - BF.INSERT {key} [CAPACITY {cap}] [ERROR {error}] [EXPANSION {expansion}] [NOCREATE] [NONSCALING] ITEMS {item...}

      key [필수] : 키 이름 설정
      cap [옵션] : 최대 원소의 갯수를 설정하며 이 기준을 초과할 때 성능은 하락할 수 있다.
      error [옵션] : false positive 발생률을 설정하며 인자 1을 100%로 기준삼아 0.1을 주면 10%이고 0.001을 주면 false positive 발생률 0.1%을 의미한다.
      expansion [옵션] : 최대 원소의 갯수 초과시 몇개의 원소를 추가로 받을지 설정하는 옵션
      NOCREATE [옵션] : 키가 존재하지 않는경우 키를 생성하지 않는다는 옵션
      NONSCALING [옵션] : 최대 원소의 갯수 초과시 추가 원소를 받지 않는다는 옵션
      item [필수] : 삽입 할 원소
  • BF.EXISTS : 데이터 집합안에 해당 원소가 들어있는지 확인한다.
    포맷 - BF.EXISTS {key} {item}

      key [필수] : 키 이름 설정
      item [필수] : 삽입 할 원소
    존재하는것 같으면 1, 존재하지 않으면 0을 반환
  • BF.MEXISTS : BF.EXISTS와 같으며 다량의 원소를 한번에 조회할 수 있다.
    포맷 - BF.EXISTS {key} {item} [item] [item] [item

* https://github.com/RedisBloom/RedisBloom/blob/master/docs/Bloom_Commands.md

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

How to run multiple instances of MariaDB  (0) 2020.04.07
How to create RESTAPI using DreamFactory  (0) 2020.03.23
Database Cache Server  (0) 2020.01.23
[Redis] HyperLogLog  (0) 2020.01.22
[hiredis] Using redis Database in C  (0) 2020.01.17

[RDBMS의 문제점]
서버를 구성할 때 데이터베이스는 주로 RDBMS를 사용해 운영한다.
서버의 용도에 따라 다르겠지만 구글이나 네이버 같은 매우 많은 사람들이 사용하는 규모가 된다면
데이터베이스도 포화상태가 될 것이고 쿼리를 하나 실행하는 데에도 많은 시간이 들어갈 것이다.
실제로 공공데이터 포탈에서 2000만 Cardinality 규모의 데이터를 받아 샘플 DB를 생성하고 조회해보면 Index를 걸어놓았음에도 불구하고 20초가 넘게 걸린다.
간단한 조회 쿼리가 아니라 다양한 조건이 걸리고 몇 개의 테이블이 조인되면 더 오래 걸릴 것이다.

 


[데이터베이스 데이터 캐싱]
DB를 튜닝하고 다원화하고 좀 더 효율적으로 인덱스를 걸 수도 있겠지만 가장 근본적인 문제인 RDBMS로의 쿼리 전송을 줄이는 방법도 있을 수 있는데 데이터 캐싱을 통해 어느 정도 쿼리 전송을 줄일 수 있겠다.
데이터베이스에서의 데이터 캐싱이란 처음 쿼리를 전송할 때는 데이터베이스에서 직접 가져오지만 두 번째 쿼리부터는 캐시에 저장된 데이터를 가져와 데이터베이스까지 직접 쿼리를 전송하지 않아도 된다.

 

주로 데이터베이스에서 캐시용으로 NoSQL 류의 Redis나 Memcached를 사용한다.
두 DB 모두 디스크 기반이었던 기존의 RDBMS 들과 달리 메모리 기반이며 성능을 목적으로 개발되었기 때문에 캐시 서버로 주로 사용된다.
(메모리 캐시라는 공통점 이외에는 다른 점이 더 많은 Redis와 Memcached이다.)
가장 기본적이고 단순한 Key-Value 형태로 메모리에 저장하고
또한 내부적으로도 성능에 목적을 둔 기능들이 많기 때문에 데이터 캐시 서버로 사용하기 매우 좋다.

 

메모리 캐시는 잘못 사용하면 성능이 더 안 좋아질 수도 있다고 한다.
보통 캐시에 들어갈 데이터는 자주 사용하는 데이터 위주로 저장해야 하고,
읽기는 많지만 쓰기는 적은 데이터 그리고 데이터의 양이 많지 않은 데이터를 캐싱 하는 것이 적합하다고 한다.
또한 캐시에도 데이터가 쌓이면 언젠가는 RDBMS와 다를 게 없어지므로 적절한 데이터 캐시 만료 기간을 설정해야 한다.

 

 

[데이터 캐싱이 적용된 시스템에서 CRUD]

캐시 서버가 사용되는 데이터베이스 시스템 구성도는 시스템 상황, 용도, 설계자의 캐싱 전력에 따라 달라질 수 있고 매우 다양하게 구성될 수 있으나 나는 가장 기본적인 개념을 설명하기 위해 DB 서버와 캐싱 서버 하나만 둔다.
(캐싱 전략에도 방법론이 있고 공부할게 많다.)

- Read

캐시 서버에 데이터가 없는경우
캐시서버에 데이터가 있는경우

 

- Create : Database에 데이터를 생성한다.

- Update : Datebase에 데이터를 수정하고 캐시서버에도 데이터가 있다면 마찬가지로 수정한다.

- Delete : Database에 데이터를 삭제하고 캐시서버에도 데이터가 있다면 마찬가지로 삭제한다.

 

 

 

물론 캐싱이 만능은 아닐 것이다. 비용도 비용이지만, 제대로 사용하지 못하면, 최신으로 업데이트되지 않은 “틀린” 데이터를 클라이언트에게 제공할 수도 있고 비용이 최적화되지 않을 수도 있다.
가장 중요한 건 기존의 시스템에 정확히 어떤 부분에서 성능이 저하되는지를 주안점으로 두고 그에 대한 대처를 가장 효율적으로 하는 것이 좋지 않을까 싶다.

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

How to create RESTAPI using DreamFactory  (0) 2020.03.23
[Redis] Bloom Filter  (0) 2020.01.31
[Redis] HyperLogLog  (0) 2020.01.22
[hiredis] Using redis Database in C  (0) 2020.01.17
Can't connect to MySQL server on 'address' (10061)'  (0) 2020.01.16

[HyperLogLog란]

HyperLogLog(hll)은 간단히 말하면 중복제거된 값을 매우 적은비용과 매우 빠른 속도로 계산하는데 사용하는 확률적 자료구조이다.

대용량의 데이터에서 중복제거된 unique value을 계산하는데 의미가 있으며 적은 메모리로 정확하지는 않지만 최소한의 오차율을 통해 unique value를 계산한다.

예를들어 포털 사이트에 방문한 사람의 수를 구하는데 또는 포털 사이트에서 하루에 검색한 검색어의 수를 구하는데 사용된다.

물론 집합이나 다른 자료구조를 통해 구할 수 있겠지만 데이터의 크기가 커질수록 엄청난 시간복잡도가 요구될것이다.

 

메모리 기반의 Redis에서 unique value를 찾으려고 하면 용량이 커질수록 메모리는 한정적이기 때문에 한계가 있었다.

 

hll은 이러한 문제를 아주 적은 메모리와 아주 적은 오차율을 통해 해결한다고한다.

참고로 1.5KB의 메모리에는 실제 키를 저장하는데 사용된 메모리는 포함되지 않는다.

 

redis에서 hll은 별도의 자료구조를 사용하지 않으며 raw한 스트링을 사용하며 스트링은 hll자료구조로 이루어져있다고 한다.

또한 unique value를 저장하고있지 않으며 때문에 unique value들을 추가하면 value를 확인할 수 없다.

대용량의 디스크가 또한 필요하지 않다.

 

[HyperLogLog 사용법]

- PFADD 

시간복잡도 O(1)

IP라는 Key에 ip 원소들을 추가한다.

Key에 unique한 원소가 추가되었다면 1이 반환되고 unique하지 않다면 0이 반환된다.

unique하지 않을경우 아무일도 일어나지 않는다.

 

 

- PFCOUNT

시간복잡도 O(1)

IP라는 Key에 있는 원소의 수를 출력한다.

 

 

-PFMERGE

시간복잡도 O(N)

두개 이상의 Key를 하나로 병합한다.

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

[Redis] Bloom Filter  (0) 2020.01.31
Database Cache Server  (0) 2020.01.23
[hiredis] Using redis Database in C  (0) 2020.01.17
Can't connect to MySQL server on 'address' (10061)'  (0) 2020.01.16
How To Use UDF In MySQL  (0) 2020.01.06

[CMake 설치]

sudo apt install cmake

 

[CMake 주요 문법]

- 변수

set(변수명 값)

set(변수명 "값1 값2") => 공백있는경우 쿼터사용

set(변수명 값1 값2) => 직렬화

 

- 출력

message(${변수명})

message(문자열)

message(타입 문자열)

* 출력타입

STATUS : 상태 메시지
WARNING : 경고 메시지
SEND_ERROR : 에러 메시지를 출력(Makefile생성X)
FATAL_ERROR : 에러 메시지 출력 후 작업 중단
AUTHOR_WARNING : 디버깅 메시지

- 프로젝트명 

project(sampleProject) => 프로젝트명 설정을 설정하면 CMAKE_PROJECT_NAME이라는 변수에 저장된다.

- CMake 버전관리

CMAKE_MINIMUM_REQUIRED(VERSION x.xx)

=> 최소 cmake 버전을 명시한다.

=> 최소 버전보다 낮은 cmake를 사용한다면 에러를 출력한다.

 

- 최종빌드 바이너리

ADD_EXECUTABLE(바이너리명 소스코드명 소스코드명)

 

- 최종빌드 라이브러리

ADD_LIBRARY(라이브러리명 소스코드명)

libcmaketest.a 파일이 생성된다.

SHARED(동적 라이브러리) : DLL(Windows), SO(Linux)

STATIC(정적 라이브러리) : LIB(Windows), A(Linux) => 디폴트

 

- 컴파일러 설정

SET (CMAKE_C_COMPILER "gcc" )

=> 환경변수 설정이 되어있지않다면 절대경로로 지정해준다.

 

- 컴파일 옵션

ADD_COMPILE_OPTIONS(-g -W)

 

- 전처리기 매크로

ADD_DEFINITIONS(-DDEBUG=1)

=> 해당 구문은 cmake파일 어디에 두어도 정상 동작한다.

=> gcc에서 -D 옵션

 

- 헤더파일 디렉토리 추가

INCLUDE_DIRECTORIES(/${PATH}/include)

=> 해당 구문은 cmake파일 어디에 두어도 정상 동작한다.

=> gcc에서 -I 옵션

 

- 라이브러리 디렉토리 지정

LINK_DIRECTORIES(/lib /usr/lib)

=> /lib과 /usr/lib를 링크 시 필요한 라이브러리를 참조하도록

=> gcc에서 -L 옵션

 

- 링크옵션 추가

LINK_LIBRARIES(WS2_32)

=> gcc에서 -l 옵션

 

- 출력디렉토리 지정

SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../)  => 바이너리

SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../)   => 동적 라이브러리

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ../)   => 정적 라이브러리

 

[CMake 샘플 코드]

[CMake를 이용해 프로젝트 빌드]

 

 

 

 

 

* https://cmake.org/

 

CMake

CMake is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefile

cmake.org

* https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/Useful-Variables

 

Useful Variables · Wiki · CMake / Community

CMake Wiki

gitlab.kitware.com

 

'C&C++' 카테고리의 다른 글

How to use constructor and destructor in C language  (0) 2024.04.24
Errno Setting Function List  (0) 2024.01.17
How To Use Unit Test In C++  (0) 2020.01.13
WINAPI How To Hook ConnectEx  (0) 2019.11.06
WINAPI DLL_PROCESS_DETACH  (1) 2019.08.08

[redis]

redis는 디스크가 아닌 메모리 기반 NoSQL로 굉장한 성능을 자랑하는 데이터베이스다.

 

[redis 라이브러리 다운]

 

[소스코드]

 

[컴파일]

gcc 컴파일시 -lhiredis 옵션을 붙여줘야한다.

 

 

[결과]

 

* https://redis.io/clients

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

[Redis] Bloom Filter  (0) 2020.01.31
Database Cache Server  (0) 2020.01.23
[Redis] HyperLogLog  (0) 2020.01.22
Can't connect to MySQL server on 'address' (10061)'  (0) 2020.01.16
How To Use UDF In MySQL  (0) 2020.01.06

외부에서 DB에 접근하려고 할 때 에러가 발생한다.

 

DB는 MariaDB 10.1.43기준이다.

 

/etc/mysql/mariadb.conf.d 디렉토리에 50-server.cnf 파일을 편집기로 오픈한다.

 

29번째 라인을 주석처리한다.

 

DB를 재구동한다.
정상적으로 접근이 되는것을 확인할 수 있다.

 

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

[Redis] Bloom Filter  (0) 2020.01.31
Database Cache Server  (0) 2020.01.23
[Redis] HyperLogLog  (0) 2020.01.22
[hiredis] Using redis Database in C  (0) 2020.01.17
How To Use UDF In MySQL  (0) 2020.01.06

블로그는 정말 공부 저장용으로만 쓰고 있는데 심심해서 써본다.
후기는 처음 써보는 거라 어떻게 쓰는 건지 잘 모르겠고 그냥 서류부터 수료까지 시간순으로 기억나는 대로 써보겠다.

 


소마가 무엇이냐. 그냥 IT 대외활동인데 다른 대외활동에 비해 지원이 짱짱하다.
(매달 000만원 장학금, IT기기 000만원, 플젝비용 000만원, 학습비 000만원)
참고로 개발 쪽은 한이음, 멋쟁이사자처럼, 42서울 
보안 쪽은 케이쉴드, 비오비 같은 것도 있다. 
자격은 학력전공나이 무관이나 수입이 있는 사람 즉 직장인은 불가하다.

지원 절차는 서류 - 인적성 - 코딩테스트 - 면접 순이다.


[서류]
전역직후 공부 계획도 제대로 안 잡혀있었고 시간도 많아서 신경 써서 썼던 것 같다.
서류접수 기간에 사무국에서 설명회도 개최하는데 나는 안가서 어떤지 모르겠다.

문) 소프트웨어 분야 전문성을 키우기 위해 남들과 달리 특별한 노력을 한 경험이 있다면 서술해 주시기 바랍니다  
답) 내가 여태 공부했던 기술 스택 위주로 서술 

문) 귀하의 장래 희망을 서술하여 주시기 바랍니다. 
답) 앞으로 IT업계에서 내가 하고싶은것 위주로 서술 

문) 귀하께서는 2019년도「SW마에스트로」연수과정에서 동료 연수생 3~5명과 협력하여 새로운 프로젝트를 완성하여야 합니다. 어떤 능력을 갖춘 연수생들과 어떤 프로젝트를 어떻게 수행할 것인지 귀하의 구체적인 계획을 서술하여 주시기 바랍니다. 
답) 소마에서 해보고싶은 프로젝트 간단하게 3~4개정도 서술 

문) 6개월간 본 과정을 통해 이루고자 하는 구체적인 목표 
답) 소마에서 얻어가고싶은것들 서술 


[인적성]

인적성 검사는 AI를 통해 진행되는데 AI면접 처음이라 집에서 신기해하면서 대답했다.

내용이 기억이 잘 안나고 나 혼자 로봇한테 대답한 거 보고 뭔가 최첨단인데 자괴감 들었다.


[코딩테스트]
나는 ps문제를 백준에서 조금 풀어보긴 했지만 시간 안에 푸는 연습은 한 번도 안 해봐서 애좀 먹었다.

15문제 중 5~6개 정도 맞았던 거 같고 시간은 90분 줬다.

4문제 푼 사람은 떨어진 사람도 있고 붙은 사람도 있고 3문제 풀고 붙은 사람은 못 봤다. 나도 운 좋게 붙은 것 같다.
내 생각에는 15문제 다 풀라고 낸 건 절대 아닌데 ps 괴물들은 거의 다 맞추는 거 같더라.
(실제 10기 연수생들과 만남을 가진 후 5명의 괴물이 있다는 걸 알게 댐
IT 공부하면서 항상 우물 속에 있다고 느꼈는데 역시나 세상에 천재는 많드라)

 

ps. 강남 소재 컴퓨터학원에서 봤는데 사람이 정말 많이 왔더라. 알고 보니 역대 최고 경쟁률(8.1:1)이었다고 한다.

하지만 42서울이라는 새 대외활동이 생겼기 때문에 11기부터 다시 좀 줄어들 거라고 생각한다. 지원해보세요.

 
[면접]

취준 하면서 면접 다닐 때도 많이 안 떨었는데 이때는 왜 이렇게 떨었는지 모르겠다.

면접은 다대다 면접이다. 면접관이 6분 정도 면접자는 7명 정도 들어왔던 것 같다.

지원동기 같은 기본적인 질문들은 공통으로 한 번씩 하고,

면접자 별로 본인이 서류에 썼던 공부 했던 분야 위주로 개인 질문이 들어온다.

나 같은 경우 보안에 대한 내용을 좀 썼어서 PKI, 프로가드, 암호화와 인코딩 차이를 물어봤던 것 같다.

교통비도 준다.

[연수생 멘토 팀 매칭(가장 중요)]

3주 정도의 시간이었던 거 같다.

자유 멘토링을 통해서 팀을 구성하고 담당 멘토님을 정해야 한다.

먼저 사무국에서 그룹웨어에 본인 자기소개를 올리라고 한다.

그러면 10기 연수생, 멘토님들이 모두 자기소개를 올린다.

대충 어느분야에 관심이 있고 공부해왔는지 알 수 있다.

이때 적극적으로 연수생들 간에 네트워킹이 이루어져야 한다.

그리고 멘토님들이 자율주제로 자유 멘토링을 개설하시는데 매일 있으니 가능한 시간별로 참석하면 좋다.

본인들 소개하고 대화하며 이 사람이 어떤 생각을 가지고 있는지 알 수 있고 6개월간 함께 프로젝트할 팀원을 정하는데 큰 도움이 된다.

3명으로 팀을 구성했으면 이제 멘토님들께 연락해서 담당 멘토님이 되어주실 수 있냐고 여쭤봐야 한다.

팀당 멘토님은 4명이 붙어주신다.

 

이 기간에 멘토 특강도 같이한다. 여러 주제로 특강을 해주시고 그분들의 10년 20년 업계 노하우를 알려주시기도 하니 많이 참석하면 좋다.


[1차 워크샵]

리조트로 1박 2일 갔었던 거 같은데 그냥 자기소개하고 특강 몇 개 하고 레크리에이션 하고 돌아온다.

이때는 아직 팀 구성이 대부분 안되어있을 때라 자유시간에 연수생들끼리 많은 대화를 하고 팀을 구성하게 된다.

사실 일정이 매우 빡빡해서 자유시간이 많이 없다.

그래서 팀 구성을 하기 위해 잠도 포기하고 사람들을 만나고 다니는 연수생들도 있다.

 

[발대식]

뭐 뻔하다. 선서하고 영상 좀 보고 높으신 분들 훈화 말씀 듣고 밥 먹고 사진 찍고 끝이다.

 

[프로젝트 기획 심의]

팀을 구성하고 이제 어떠한 주제로 프로젝트를 진행할지를 정해야 한다.

매우 많은 고민을 했고 어려웠던 시기이다.

일단 외부에서 실제 사업하시는 분들을 심사위원으로 초빙해오기 때문에

프로젝트 주제가 단지 기술적인, 공부 목적의 자신의 실력을 발전시킬 수 있을만한 프로젝트가 아니고

사업성이 있는 프로젝트  즉 '결과물을 통해 돈을 벌 수 있는가'가 중요하다.

물론 기술적인 부분도 중요하지만 사업적인 부분을 더 본다는 것이다.

이때 멘토님들도 사업적인 부분을 강조하신다.

프로젝트 주제, 개요, 향후 일정, 기술적 요소, 기대효과 등 프로젝트 제안서 비슷하게 문서를 작성하고

심사위원분들 앞에서 발표를 한다.

첫 번째 심의에서 떨어지면 두 번째 세 번째 심의도 있다고 한다.

다행의 우리 팀은 1차 심의에서 통과돼서 바로 개발에 들어갈 수 있었다.

 

ps. 지정 프로젝트가 따로 있는데 3개의 팀은 멘토님들이 정한 프로젝트를 진행할 수 있다.

 

[2차 워크샵]

심의 끝나고 바로 2차 워크샵을 가는데 이때는 프로젝트 주제까지 모두 정해진 시기라 다들 편안한 마음으로 간다.

1차 워크샵하고 다를 건 별로 없고 50팀의 프로젝트 소개 간단하고 기억에 남는 게 없다.

선배 기수들이 몇 명 왔는데 그냥 Q & A 시간 가졌던 거 같다.

 

[중간평가]

8월 말쯤에 중간평가를 진행하는데 약 2달간 진행했던 프로젝트 내용을 발표한다.

우리 팀은 프로젝트 전체에서 1/3 정도 목표치를 달성해 발표했다.


[탑싯]

평가요소에 TOPCIT 점수가 들어가기 때문에 사무국에서 시험 접수를 해주고 공짜로 시험을 볼 수 있다.

10월 중순쯤에 시험을 보는데 우리 팀은 처음 팀이 구성될 때 열심히 하되 인증에 대해서 부담감을 갖지는 말자는 주의였기 때문에 프로젝트 막바지에 너무 힘들어서 나는 그냥 안 갔다. 사실 전날 밤까지 멘토링 하다가 다음날 못 일어나서 못 갔다.

어쨌든 공짜로 시험 볼 수 있기 때문에 보는 걸 추천한다.


[최종평가]

11월 말쯤에 최종평가를 진행한다.

중간평가 이후로 결원이 생겨서 부득이하게 2명에서 진행했다.

인증에 대한 부담은 없었기 때문에 멘탈이 흔들리지는 않았고 유종의 미를 거두자는 마인드로 진행했다.

웹 개발자가 없었기 때문에 마지막 1달은 처음 배우는 언어를 통해 개발을 진행해야 했고 웹 디자이너에게 외주를 맡겨가며 진행했다.

어쨌든 안 되는 건 없었고 우리 팀 프로젝트 주제가 흔치 않은 주제였기 때문에 평가 때 심사위원분들께서 고생했다고 격려를 많이 해주셨다.

 

[수료식]

역시 뻔하다. 선서하고 훈화 말씀 듣고 밥 먹고 사진 찍고 수료증 받고...

다만 6개월 전과 달라진 점은 모두 친해진 것


[해외연수]

팀 구성되면서 팀원들끼리 인증에 부담 갖지 말자는 마인드였기 때문에 우리 팀은 당연히 인증자가 없었지만

인증자로 선정돼 무료로 미국을 가는 연수생들에게는 축하를 보낸다. 

물론 우리 팀도 열심히 했다. 다만 인증자들은 더 열심히 했다.

센터에 그냥 상주하며 살았고 항상 있었던 사람들이다.

나도 마지막 한 달 동안 웹 개발하면서 막힐 때마다 물어보러 센터에 가면 항상 있던 사람들이었다.

받을만한 사람들이 받았던 것 같다.


내가 지원할 시기에 후기를 찾아봤을 때는 찾아도 안 나와서 매우 궁금했었는데 다음 지원자들을 위해 써줘야겠다.
휴학에 대해서 궁금할 텐데 결론적으로 우리 팀은 안 했다. 하지만 팀원들끼리 상의하에 휴학을 해도 되고 안 해도 된다.
이건 팀 구성 전에 팀원들이 소마에 어떤 마음으로 임하는지 서로 확인해야 하고 피해를 주지 않아야 하기 때문에 많은 고민을 요한다.
하면 얻어가는 건 더 많겠지만 본인의 성향 그리고 상황에 따라 해도 되고 안 해도 된다고 생각한다. 


ps. 개인적으로 휴학 추천함(남성은 재수를 안 했거나 군대가 면제라면 한 학기 휴학할만한 가치가 있다고 생각하고 여성은 4년 동안 휴학을 했거나 할 계획이 없었다면 한 학기 휴학하는 거 추천)


[경험에서 우러나온 팁] 
- 팀 꾸리기 전 최대한 많은 사람들과 많은 이야기를 해봐라.
- 팀 꾸리기 전 가능하면 소마에 임하는 태도를 확인하면 좋겠다.
- IT는 확실히 좁고 가면 분명 아는 사람 만날 것이다.

- 사무국분들은 매우 친절하고 잘 활용해라.

- 행사 때마다 유용한 굿즈를 많이 준다. 다만 전부 소마 로고가 각인되어있다.
- 9월쯤에 팀 전체가 침체기였는데 살면서 이런 거 해보는 기회 흔치 않은데 시간 날리지 말자.

- 당시에는 힘들지 몰라도 돌아보면 후회이다. 힘들어도 참고 그냥 해라.

- 소마에 시간을 많이 쓸수록 멘토님들께 배울 건 더 많아질 것이고 당연히 배우는 건 많아질 것이다.

- 소마는 90프로 자율적으로 진행된다. 본인이 노력하면 노력할수록 얻는 건 정비례한다.

- 안 하면 얻는 것도 없다.

- 새로운 것을 하는데 두려워하면 안 된다.

 


공교롭게도 조만간 사무국에서 11기 선발 공지를 올릴 텐데...
나도 그랬고 일부 수료생들도 내가 왜 붙었지 라는 생각을 해본 사람 많다.

나만 빼고 다들 가만 보면 붙을만해서 붙었는데 정작 본인은 왜 붙은 건지 의아해한다.
나는 안될 거라 생각하지 말고 무조건 지원해보길 바란다. 

국내 IT 대외활동에서 높은 수준의 지원과 학부생이 쉽게 경험하기 힘든 경험을 하게 될 것이다.

[C++에서 Visual Studio 2019를 사용해 유닛테스트 진행하는법]

 

기존 프로젝트에 프로젝트 추가(솔루션 - 추가 - 새 프로젝트)

 

기본 단위 테스트 프로젝트 선택

 

해당 솔루션에 유닛테스트 프로젝트가 추가되었고 참조 추가를 해준다.

 

참조 추가는 기존의 메인 프로젝트를 선택.

 

테스트 - 창 - 테스트 탐색기를 활성화 한다.

 

메인 소스코드

 

메인 소스코드의 코드를 include해주고 테스트 케이스 추가 후 테스트 탐색기에서 실행

 * 참고 : https://docs.microsoft.com/ko-kr/visualstudio/test/microsoft-visualstudio-testtools-cppunittestframework-api-reference?view=vs-2019

'C&C++' 카테고리의 다른 글

Errno Setting Function List  (0) 2024.01.17
CMake Syntax  (0) 2020.01.21
WINAPI How To Hook ConnectEx  (0) 2019.11.06
WINAPI DLL_PROCESS_DETACH  (1) 2019.08.08
WINAPI Options Using Bit Flag  (0) 2019.08.07

[MySQL 라이브러리다운]
apt-get install libmysqlclient-dev

[다운 후 라이브러리의 위치를 찾는다.]

해당 경로에 mysql.h가 설치되었다.


[so파일 소스코드]

문자열에 있는 알파벳 대문자의 갯수를 반환하는 함수 작성(Non Aggregate)

* UDF 작성 공식 문서(https://mariadb.com/kb/en/creating-user-defined-functions/)


[so파일 생성]

so파일 생성 후 plugin 디렉토리로 복사
get plugin directory 

 

[MySQL에서 UDF 정의 및 사용] 

 

 

* 참고 : 윈도우에서 작업할 때 mysql.h위치는 mysql 설치 경로에 include 폴더이고,

           DLL은 설치경로에 lib/plugin 폴더에 위치시키면 된다.

mysql.h 경로
DLL 경로

 

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

[Redis] Bloom Filter  (0) 2020.01.31
Database Cache Server  (0) 2020.01.23
[Redis] HyperLogLog  (0) 2020.01.22
[hiredis] Using redis Database in C  (0) 2020.01.17
Can't connect to MySQL server on 'address' (10061)'  (0) 2020.01.16

[SPICE Protocol]

SPICE(Simple Protocol for Independent Computing Environments) 프로토콜은 가상머신 전용 원격 접근 프로토콜로 오픈소스이다.(https://www.spice-space.org/)
비슷한 종류의 프로토콜로는 RDP, VNC 등이 있다.
SPICE의 특징으로는 QEMU와 같이 동작하기 때문에 가상머신에 별도의 프로그램을 설치하지 않고 QEMU를 통해 가상머신을 실행시키면 원격 접속할 수 있다.
SPICE 프로토콜을 통해 클라이언트 원격 접속 프로그램으로  원격제어가 가능하며 웹 상에도 클라이언트 라이브러리가 존재하기 때문에 가상머신 제어가 가능하다.

[SPICE 프로토콜을 이용한 웹 상에서의 원격제어]

  • 실습 환경
    • Google Cloud Platform n1-standard-4(vCPU 4, RAM 15GB)
    • Ubuntu 18.04 Server
    • Node.js 8.10.0
 

kvm 설치

해당 명령어의 실행결과는 가상화 기능을 지원하는 CPU의 갯수를 출력해준다.
만약 0이 나온다면 가상화를 지원하는 CPU가 없으므로 가상머신의 성능이 떨어진다.
가상화를 지원하는 CPU인데 0이 나온다면 BIOS 설정에 들어가 가상화 확장 기능을 활성화 해준다.
 
이후 아래 명령들을 통해 kvm을 설치한다.
sudo apt-get install qemu-kvm libvirt-bin bridge-utils ubuntu-vm-builder
sudo apt-get install virt-manager
(virt-manager는 우분투 서버버전에서는 사용 불가능하니 서버버전을 사용중이라면 GUI를 설치한다.)
sudo apt-get install ubuntu-desktop
아래 명령어를 통해 아래와 같은 결과가 나온다면 성공적으로 kvm이 설치되었다.

kvm에 윈도우 설치(virt-manager사용)

sudo virt-manager
 

 

virt-manager를 통해 버츄얼박스에 윈도우 설치하듯 설치한다.

 

kvm-spice설치

 
sudo apt-get install qemu-kvm-spice
kvm-spice를 설치하고 가상머신을 동작시킨다.
아래 명령으로 가상머신을 동작시킨다.
sudo kvm-spice -enable-kvm -hda /var/lib/libvirt/images/win10.qcow2 -spice port=5900,disable-ticketing -m 8192 -net nic -net user -usb -device usb-tablet
 
명령에서 가상머신의 이미지 경로는 virt-manager에 IDE Disk1 탭에서 얻을 수 있고 포트는 5900으로 열어준다.
-m 옵션은 메모리 설정이다.
  • qcow2파일은 QEMU Copy On Write의 약자로 가상머신 디스크의 이미지 저장 형식이다. 
  • 버츄얼 박스, vmware의 vmdk파일과 같은 역할이라고 보면된다.
이후 ubuntu 기본 원격 프로그램 remote viewer를 통해 접속해본다.
 
 
가상머신에 원활히 접속된다면 kvm-spice를 통해 정상적으로 가상머신이 작동한다는 뜻이다.
 

Nginx 설치

sudo apt-get install nginx
 

Spice-html5 다운

nginx 기본 웹 루트인 /var/www/html에 https://gitlab.freedesktop.org/spice/spice-html5에서 클론을 받는다.

Websockify 실행

npm install node-websockify
위 명령을 통해 node-websockify패키지를 설치한다.
node-websockify는 웹소캣 트래픽을 일반 소캣 트래픽으로 전송해 준다고 나와있는데 그냥 포트포워딩 정도로 생각하고싶다.
위 코드를 실행시키면 서버에서는 websockify가 동작하고있다.
 

웹 접속

현재까지 kvm에 윈도우 설치이후 작동시키는것, websockify 실행, nginx 웹서버 구동이 끝났고 
이제 웹을 통해 접속하여 가상머신을 제어할 수 있다.
아래 host와 port 적어주는 부분이 있는데 공인 ip와 8080포트를 적어주면 websockify가 웹소켓 패킷을 일반 소켓 패킷으로 전송해주고 
5900포트로 전송되어 kvm-spice를 동작시킬 때 입력했던 5900포트로 연결되어 가상머신 화면을 받아온다.
 

virsh를 이용한 가상머신 관리 [참고]

가상머신 리스트 출력
virsh list --all 
가상머신 켜기(추천하지 않는다.)
virsh start 가상머신이름(virt-manager기준)
  • Windows10기준 qemu-system-x86_64를 통해 켤때 부팅속도가 30초이상 차이났다.
가상머신 스냅샷 찍기
virsh snapshot-create-as --domain 가상머신이름(virt-manager기준) --name “스냅샷명"
가상머신 스냅샷 돌리기
virsh snapshot-revert 가상머신이름(virt-manager기준) 스냅샷명
 

+ Recent posts