thrift c# file I/O

  • 파일 입출력으로는 streamTStreamTransport를 이용하면 된다.

handling JSON with Apache Thrift

c++로 JSON과 연동하는 템플리트 코드이다.

참고: http://trevorgattis.blogspot.kr/2011/12/apache-thrift-converting-from-simple.html

한마디

소중한 정보를 공유해주는 인터넷 사람들 !! 감사해요.

boost 기반 httpd lib : cpp-netlib

node.js, python … 웹프로토콜 지원은 당연시하는 시점에서
c++에서 간단한 웹서버 기능이 필요할 때 사용하면 좋을듯 하다.
boost를 설치하고 있는 상황이라면 http://cpp-netlib.org/
boost에 편입되진 않았지만 boost의 껍데기를 둘러쓰고 있다.

간단한 웹서버 구현

한마디

따로 설치해야 하는 불편함이 있지만 간단한 http client/server구현에는 딱 좋을 듯.

apache thrift with c#

apache thrift c# 예제 구하기 정말 힘들다. byte[]로 받고 json모양으로 화면 출력도 해보고 괜춘함.

thrift 정의

thrift compile

버퍼에 저장하고 복원

byte[]로 저장할 수 있다는 것은 그것을 파일로 보내 것 나만의 네트워크 엔진을 쓰건 원하는 대로 수정할 수 있다는 뜻. TJSONProtocol대신 TBinaryProtocol을 성능 차원에서 추천한다. json한번 보고 싶었음.

소감

c#에서도 맘껏 쓸 수 있다니 좋네.

build redis with msvc

redis windows 버젼 다운로드

(redis for window)[https://github.com/MSOpenTech/redis]

  • redis 2.8 압축풀면
  • redis2.8\msvc\RedisServer.sln에서 64bit/release를 선택한다.
  • x64디렉토리에 .exe파일들 생성

redis client lib

  • redis for windows 프로젝트에 포함되어 있는 hiredis 사용
  • redis-cplusplus-client 사용
    • (Redis cplusplus client Win32 port)[http://sourceforge.net/projects/rediscplusplusc/]
    • 테스트를 위해 boost 설정
  • 참고: http://stpetrus27.wordpress.com/2014/05/20/vc-redis-client-2

build mongodb 3.0 c++ driver with msvc

참고: [https://github.com/mongodb/mongo-cxx-driver/wiki/Download-and-Compile-the-Legacy-Driver#scons-options-when-compiling-the-c-driver]

mongodb 실행

  • mongodb를 먼저 실행시킨다. c:\data\db디렉토리를 기본으로 만들어서 실행한다.
  • C:\Program Files\MongoDB\Server\3.0\bin\mongod를 실행.

scons mongo db options

  • scons는 32bit버젼에만 설치가 가능하다. 아직까지 python자체는 32bit를 설치하는 것이 더 낫다.
  • boost 경로지정 : %joy_extlib%에 boost lib을 설치했다.
  • /MD 옵션 : --dynamic-windows
  • 아키텍쳐선택: --msvc-host-arch, x86 or x86_64

  • build디렉토리 이하에 있음.
  • 실행환경: msvc 2013
  • mongodb c++ driver git최신버젼

build boost for windows

빌드환경

  • boost 1_57
  • msvc 2013
  • mingw 491

윈도우 환경에서는 bootstrap.bat를 실행한다. 기본 컴파일러를 찾아서 b2를 빌드하고 복사해 줄 것이다. b2를 가지고 필요한 라이브러리 빌드를 할 수 있다.

테스트 빌드 환경을 위해서 아래 처럼 환경을 선택했다.
clean하고 다시 빌드 방식 선택

boost library 종류 선택

  • link 종류 : boost 라이브러리가 dll인가 static인가를 선택
  • runtime link : c++라이브러리가 dll인가 static인가 선택, 이쪽은 dll(/MD)를 선호 )
  • address-model : 32bit인가 64bit인가

msvc

  • c++전용: static link(boost static), shared_dll을 사용(/MD)
  • 다른언어와 함께사용 : shared link(boost dll), shared dll(/MD)
  • address-model : 32/64

mingw

  • c++전용: static link(boost static)
  • address-model : 32/64

  • mingw-w64 모델중 x86_64가 64bit 컴파일러를 제공한다. i686은 win32임.

pure virtual function call exception handling

Pure virtual functions 예외발생

의도하지 않게 pure virtual function을 호출하는 경우가 발생, exception handler를 설치해보아야 콜스택도 안남긴다.
msvc의 pure call함수는 핸들러를 호출 후 abort()를 친절하게 불러준다. 죽지않는 서버를 만들고자하는 사람에게는 절망을;;;
pure functaion을 사용하는 심각한 경우가 아니라면 로그정도 남기고 무시할 수 있으면 얼마나 좋을까?

[http://http://wiki.osdev.org/C++]에 훌륭한 솔류션이 나와 있어 소개한다. 함수는 어딘가에 선언되어 있으면 기존 pure call핸들러를 무시할 수 있다.

  • 테스트환경 : msvc 2010
  • 결과: 원하는대로 프로그램은 동작하고 종료는 안됨.

빠르고 가벼운 c++ format 라이브러리 : cppformat

cppformat

boost::format의 믿지못할 정도의 느린 성능에 fastformat을 사용하고 있으나 narrow char와 wide char의 둘중의 하나 지원, stlsoft의 의존성등으로 울며 겨자먹기식으로 사용하고 있는 상황,

매우 감동적인 라이브러리 cppformat 발견, 일단 속도는 홈페이지상에서 보았을 때 fastformat과 별반차이 없을듯, 사용상 편의점은 cppformat이 우수한듯. 무엇보다 감동적인것은 소스가 파일 두개! format.[h,cc]

사용해보기

  • msvc사용시 경고가 몇개 발생하는데 pragma warning위치가 소스 중간에 있는 것을 맨 위로 올려주고 추가 발생하는 경고를 더해주도록 하자.
  • 테스트환경 : msvc 2010, gtest, cppformat 1.0
  • 포맷오류시 exception을 발생시키는데 극복할 수 있는 매크로 define을 추가해놓았으니 참고하면 좋겠다.

사용소감

  • 한마디로 우수하다. 유연성도 뛰어남.
  • 포맷파라메터보다 인자가 많은 경우 무시하는데 이부분은 오류를 내주었으면 하는 바램이 있다.

using apache thrift like google protobuf

버퍼를 이용한 시리얼화

protobuf 처럼 serialize에 집중해서 apache thrift를 사용해보고 싶지만, 좋은 예제를 찾기가 어렵다.
테스트한 버젼: thrift-0.9.2

인터넷 자료의 경우 비교적 오래된 자료가 검색이 되어 변경되거나 개선된 점이 부각이 안되는 듯하다.
사용할 때는 라이브러리 버젼을 표시하는 것이 좋겠다.

thrift 메시지(구조체)와 상수 정의
- enum 숫자 자동으로 붙여주는 것은 좋은 기능인 듯.
- 전반적인 정의 언어는 thrift가 더 좋게 느껴진다.

thrift 정의

C++ 코드생성

thrift.exe -I src -r --gen cpp -out src guild.thrift
src디렉토리 안에 guild.thrift파일이 있다고 가정한다.

  • 생성하는 파일은 파일이름_constants.[h,cpp]파일이름_types.[h,cpp]이다.
  • include시에는 파일이름_constants.h만 하면 됨.

thrift를 메모리 버퍼에 할당/복원

  • 중간에 transport의 개념을 넣어 소켓/파일등 I/O를 담당하도록 할 수 있다.
  • 소스 pragmamsvc전용임.

  • 경고가 protobuf 보다는 적게 발생
  • msvc기반으로 빌드, gtest로 테스트
  • protobuf의 장점이 있고 thrift의 장점이 있다.
  • thrift site의 예제로 나와 있는 것은 소켓통신만 나와 있어서 전체적인 구조 파악이 어렵다.
  • 사용 샘플이 적은 것은 thrift 도입에 어려움 중 하나 일듯.