컴투스 서버캠퍼스 2기

안녕하세요
2023년에 이어 올해도 컴투스 서버캠퍼스를 합니다.
접수는 3월 6(수요일)일부터 시작합니다 (3월21일(목요일) 16시까지)
지원


  • 작년과 달라진 것
    • 소켓 방식의 게임 서버 개발이 중심.
    • 교육 기간이 5주에서 7주로
    • 오프라인 주 1회에서 2회로
    • ...
Read More

컴투스 서버캠퍼스 2기

안녕하세요
2023년에 이어 올해도 컴투스 서버캠퍼스를 합니다.
접수는 3월 6(수요일)일부터 시작합니다 (3월21일(목요일) 16시까지)
지원


  • 작년과 달라진 것
    • 소켓 방식의 게임 서버 개발이 중심.
    • 교육 기간이 5주에서 7주로
    • 오프라인 주 1회에서 2회로
    • ...
Read More

컴투스 서버캠퍼스 2기

안녕하세요
2023년에 이어 올해도 컴투스 서버캠퍼스를 합니다.
접수는 3월 6(수요일)일부터 시작합니다 (3월21일(목요일) 16시까지)
지원


  • 작년과 달라진 것
    • 소켓 방식의 게임 서버 개발이 중심.
    • 교육 기간이 5주에서 7주로
    • 오프라인 주 1회에서 2회로
    • ...
Read More

C# - .NET 8 에서 WinForm 프로그램 빌드 시 경고 발생하는 것 수정하기

.NET 7 에서는 WinForm 프로그램을 빌드할 때 나오지 않던 경고는 .NET 8에서는 발생했다.
경고는 아래와 같다.

1>C:\SuperSocketLite\Tutorials\PvPGameServer_Client\PacketProcessForm.cs(119,17,119,49): warning CA1416: 이 호출 사이트에는 모든 플랫폼에서 연결할 수 있습니다. 'ListBox.ObjectCollection.Clear()'은(는) 'windows' 6.1 이상에서만 지원됩니다. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1416) 

Read More

GitHub Copilot 사용합시다

비주얼스튜디오 사용한다면(C++, C#) GitHub Copilot 강력하게 추천합니다.
아직 초창기라 엄청나게 뛰어난 AI는 아니지만 생산성, 편리성에 크게 도움이 됩니다.

사람마다 다르게 느끼겠지만 저는 아무리 낮게 보더라도 비주얼어시스트 발전형 정도는 된다고 봅니다.
월 2만원 정도의 비용 보다는 훨씬 더...

Read More

C# - ASP.NET Core Web API 프레임워크 학습 자료

컴투스에서 이번에 서버캠퍼스 라는 이름으로 5주 동안 ASP.NET Core Web API 프레임워크를 사용하여 웹서버 방식의 게임 서버 개발 교육을 하고 있습니다.

아래는 교육생들이 학습을 위해 정리한 글들입니다.
학습에 참고하시면 좋겠습니다.

  • https://sueshin.tistory.com/category/%EA%B0%9C%EC%9D%B8%EA%B3%B5%EB%B6%80/Web%20API%20%EA%B2%8C%EC%9E%84%20%EC%84%9C%EB%B2%84%20%EA%B3%B5%EB%B6%80
  • https://gist.github.com/jacking75/344fd3c8c16fc27fe51d4c983a3a6306
  • https://paper-tub-6ae.notion.site/0be4168f7f224f82a89110423e3943cb
  • https://babebab.tistory.com/53?category=1124984
  • https://wallyyoucandoit.tistory.com/?page=2
  • https://dong-d.gitbook.io/webapi-server/
  • https://easy-cell-518.notion.site/ASP-0f310b9157de4cb683a5250c5eb9cc19
  • https://velog.io/tags/%EC%BB%B4%ED%88%AC%EC%8A%A4-%EC%84%9C%EB%B2%84%EC%BA%A0%ED%8D%BC%EC%8A%A4-1%EA%B8%B0
  • ...
Read More

컴투스 서버캠퍼스가 궁금하다면? 대표 강사 인터뷰

[컴투스 서버캠퍼스가 궁금하다면? 클릭!🤓 대표 강사 인터뷰](https://blog.com2us.com/?p=3475)

클라이언트, 서버 양쪽 다 하기를 원하거나 혹은 호기심에 게임 서버 개발을 배우기 원하는분 보다는 게임 서버 개발자가 되기 원하는 분들을 교육 대상자로 생각하고 있습니다.

Read More

컴투스 서버캠퍼스 1기 모집

안녕하세요
컴투스에서 서버캠퍼스라는 교육 프로그램을 4월부터 시작하려고 합니다.
이 교육에 참가를 원하신다면 3월31일까지 지원하시면 됩니다.
지원하기
위 링크에 이 교육에 대한 자세한 설명도 있습니다.

이 교육을 통해서 게임 서버 중 웹서버 방식의...

Read More

모임 - 게임 서버 개발자 학습 및 취업 멘토링

안녕하세요
신입 온라인 게임 서버 프로그래머가 되기 위한 분들을 대상으로

  • 무엇을, 어떻게 공부해야 하는지
  • 취업 준비는 어떻게 해야 하는지 등을 주제로 온라인으로 멘토링을 하려고 합니다.

1명이라도 신청자가 있으면 1월 5일 22:30분에 시작합니다.
진행 시간은 1시간...

Read More

2022년 회고

회고를 거의 하지 않았지만 올해 게임 개발자로서 변화가 있어서 남겨 봅니다.

관리자로 더 진화
현 회사에서(어디인지 궁금하다면 제 깃허브 보시면 됩니다^^) 이미 2년 전부터 팀장 직책으로 관리자 업무를 하고 있었지만 그래도 업무 비중에서 관리 비중이 50% 이하였는데 올해 관리직에서...

Read More

컴투버스 경력직 대규모 특별 채용

안녕하세요

https://www.com2us-recruit.com/

메타버스 개발에 관심 있는 분들은 꼭 지원해 보시기 바랍니다.
저를 아는 분이라면 추천인에 제 이름을 넣어주시면 됩니다^^

궁금한 것이 있으면 이메일로 연락주시기 바랍니다~

Read More

유튜브 하고 있습니다

유튜브 시작한지는 2년전쯤 되는데 조금 하다가 중단하고… 또 다시 자주는 아니라도 꾸준히 하려고 합니다.
돈을 벌 목적은 아니라서 시간 투자가 작아야 하므로 퀄리티는 높지 않습니다^^;

https://www.youtube.com/user/jacking75/videos

Read More

컴투스에서 야구 프로젝트 대규모 채용을 합니다(~04/17)

안녕하세요
컴투스에서 야구 프로젝트 대규모 채용을 합니다.
https://com2us.recruiter.co.kr/app/jobnotice/view?systemKindCode=MRS2&jobnoticeSn=88971

컴투스는 복수의 야구 게임을 신규 개발 및 라이브 서비스를 하고 있습니다.
스포츠 게임 중 야구 게임이 가장 인기가 많은 게임이고, 한국에서는 컴투스 야구가 선두 주자라고 생각합니다^^
컴투스에서...

Read More

C# - Release와 Debug 각각의 버전의 성능 차이는 있을까?

C++의 경우 Release와 Debug 버전으로 각각 빌드를 했을 때 성능 차이도 동작이 서로 다른 부분이 있다.
C#은 어떨까?

아래는 닷넷포럼에 내가 올린 질문과 관련 글을 번역한 것이다.

닷넷포럼

[번역] Performance differences between debug and release builds

Read More

C# - 복수 설치된 .NET Core SDK 삭제

dotnet-core-uninstall 툴을 설치한다
https://docs.microsoft.com/ko-kr/dotnet/core/additional-tools/uninstall-tool?tabs=windows

아래 명령어로 삭제할 수 있는 SDK 버전을 본다

dotnet-core-uninstall list 


아래 명령어로 삭제할 수 있는 버전을 본다

dotnet-core-uninstall dry-run --all --sdk 


...
Read More

C++20 - Using enum

using enum은 C++20의 새로운 기능.
scoped enum을 namespace의 using directive를 사용할 수 있다.

C++17까지는 enum을 아래처럼 사용한다.

enum struct color { red, green, blue } ; void f( color c ) { switch( c )...
      
Read More

C++ - C++20 Designated initializers

출처
Designated initializers(지시 붙은 초기화) C++20 에서 집성체 초기화 때에 데이터 멤버를 지정하는 구문이다.

struct(class)

struct A { int x = 0; int y = 0; int z = 0; }; A a{.x...
      
Read More

UDP에서 recvmmsg를 사용하여 고성능 Receive 처리하기

recvmmsg 라는 함수를
http://www.jp.square-enix.com/conference/2018/onlinetech/pdf/20180421_ishimori.pdf
라는 문서에서 알게 되었다.

Linux에는 recvmmsg 라는 함수를 사용할 수 있고, 시스템 호출 1회로 대량의 패킷을 얻어올 수가 있다.
1024개 패킷을 한꺼번에 얻는다면 시스템 호출로 인한 부하가 그만큼 줄게된다.

마찬가지로 sendmmsg 라는 함수도...

Read More

WSAPoll

개요

  • Windows Vista부터 새로 생긴 네트워크 API
  • UNIX(Linux) OS의 poll과 비슷한 것이다
  • 복수의 파일 디스크립터를 감시하는 API
  • 지정한 소켓의 상태가 변화했는지 확인하는 기능을 제공한다. 기능적으로는 select와 유사하다

API 설명

WSAPoll function

golang - epoll 예제 코드

Golang에서 epoll API를 호출해서 서버 프로그램을 만드는 예제 코드이다.
출처

epoll.go

package main import ( "syscall" "fmt" ) const ( EPOLLET = 1 << 31 MaxEpollEvents = 32 ) type epoll struct { fd...
      
Read More

유튜브 시작

몇 년전에 유튜브에 개인 채널을 만들어서 예전 강연 중 동영상으로 남아 있는 것은 올려 놓았는데 영상 보관용으로 사용하고 있었습니다.
그러다가 올해에 코로나로 인해 강연 등을 정상적으로 할 수 없게 되어서 앞으로는 유튜브에 영상을 자주 올려 볼려고 합니다.
주제는...

Read More

C++ - 공변형 반환 값과 오버라이드 룰 완화

출처

C++에서는 일반적으로 반환 값만 다른 메소드를 오버라이드 할 수 없다.

struct Base{ virtual int func()=0; }; struct Derived:public Base{ float func()override; //에러! 반환 값 타입이 다르다! }; 

인수가 다르면 다른 함수로 분류되고 단순히...

Read More

C# - LinqPad 사용 정리

5년 전쯤에 만든 자료이다.
오래된 자료이지만 지금과 크게 바뀐 부분은 없다.
웹에 공개된 자료를 정리한 것이다.

```

Read More

C++ - Aggregates(집성체)

출처

Aggregates(이하, 집성체)는 배열과 아래의 조건을 충족한 클래스이다.

  • 사용자 정의 생성자(복사, 무브 포함)이 없음.
    • 생성자는 전혀 기술되지 않거나 default 지정된 상태다.
  • 모든 데이터 멤버가 public 이다. static 데이터 멤버의 가시성은 영향을 주지 않는다.
  • 기본(부모)...
Read More

C++ - delete 호출과 구현

출처

#define SAFE_DELETE(p)if(p){delete p;} 

옛날, 마이크로 소프트가 DirectX의 샘플에서 이런 매크로를 정의한 바 있다.
아마도 많은 사람이 그 샘플의 대로 익힌 결과, 특히 생각 없이 구현하는 경우도 적지 않을것이다.

포인터가 null이 아님을 판정한...

Read More

C++ - 가상함수의 inline화에 대해서

출처: Web의 어딘가…

혹시 가상함수는 inline 되지 않는다고 생각하는 사람이 있을 것이다.
경우에 따라서 되기도 하고 안 되기도 한다.
되는 경우는 컴파일 시점에서 어떤 클래스의 가상함수를 사용하는지 알 수 있느냐 이다.

아래 코드의 경우 컴파일 시점에서 Delived...

Read More

C++ - 비 public 계승을 사용하는 곳

출처: 웹 어딘가에서…

계승에는 3가지 단계가 있다.

  • public
  • protected
  • private

객체 지향적 사고로는 public 계승은 자주 is-a 관계를 나타낸다 라고 한다.
한편 private 계승, protected 계승은 is-a 관계가 아니다.
is-a 관계와 대비해서 has-a 관계 또는 is-implemented-in-terms-of...

Read More

C++ - C++ 표준 위원회 문서 P0563R0:Vector Front Operations (pdf)

흥미로운 글이 있어서 일부 번역했습니다.(오랜전에)
(원본 https://cpplover.blogspot.kr/2017/02/c-p0550r0-p0601r0.html )

PDF P0563R0:Vector Front Operations

vector에 push_front와 pop_front가 없는 이유는 O(N)의 비효율적인 조작 때문이다.
vector에 대해 선두에서의 insert, erase는 나머지 요소를 모두 1개씩 당기거나 밀어내야한다.

그런데 최근의 하드웨어의 사정에...

Read More

golang - Go 1.15 정보

“Go 1.15”에서 변화의 대부분은 툴 체인, 런타임, 라이브러리의 구현이며, 기존과 마찬가지로 Go 버전 1과의 호환성이 유지되고 있어서 대부분의 프로그램은 수정 없이 실행할 수 있다.

주요 변경 사항 중 하나는 링커의 대폭적인 개선으로 링커의 리소스 사용량(시간 및 메모리)이 절감 되고, 코드...

Read More

C++ - f()와 f(void)의 차이

VC++을 통해서 멤버 함수를 정의할 때 파리미터가 없는 함수의 경우 파라미터 리스트가 들어가는 자리에 void가 들어가는 것을 볼 수 있다.

기본적으로 void f()void f(void)의 함수 시그네쳐는 같은 것이다.
다만 파라미터 리스트에 void를...

Read More

C# - foreach로 순회 중 List의 요소 삭제하기

List에 있는 요소를 foreach로 순회하는 중에 요소를 삭제하는 방법
삭제할 항목을 다른 컨테이너에 담아 놓고, 뒤에 일괄적으로 삭제한다.

List<GameObject> RemoveList; foreach(GameObject obj in colliderList) { if(obj.currenthp <= 0) { RemoveList.Add(list); } } foreach (GameObject...
      
Read More

C++ - _pFirstBlock == pHead 에러

실행 프로그램에서 공용 dll을 사용하는 경우 아래와 같은 에러가 발생할 때가 있다.

 File: f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c Line: 1424 Expression: _pFirstBlock == pHead 
  • 2중으로 free에서도 발생하는 에러로 dll 내부에서 free 한 것을 그 뒤에 다시 free 하면 이런 에러가 발생한다.
  • ...
Read More

C++ - 컴파일과 링크가 느린 경우 개선 방법

헤더 의존을 줄인다. 자주 변할 수 있는 코드는 헤더에 쓰지 않는다.

 

모듈화 하여 의존을 줄이거나 모듈을 dll화 하여 링크 시간을 단축하다(단 너무 나누는 것은 주의).

모듈별로 프로젝트를 분할하면 자연스럽게 의존이 없어지고 그 결과 프로그램 변경 시 빌드 시간 단축도...

Read More

C++ - VC++ 에서 링크 에러가 발생하는 경우

VC++을 사용할 때 링크 오류가 발생하여 시간을 허비하는 경우가 있다.
보통 아래의 이유로 링크 오류가 발생하는 경우가 많다.

문자 코드의 취급이 같지 않다.

Use Unicode Character Set, Use Multi-Byte Character Set

[C/C++][Code generation][Runtime Library]의 취급이 같지 않다.

...
Read More

C++ - stdafx.h 파일을 찾지 못한다는 에러가 나올 때

VC++에서 프로그래밍을 할 때 컴파일 속도를 올리기 위해 대부분 ‘프리 헤더’ 파일을 사용한다.
보통 자신이 만든 소스파일을 사용할 때 문제가 없다가 외부 파일을 가져와서 사용하는 경우 또는 비슷한 행동을 하는 소스 파일 마다 별도의 디렉토리에 들어가 있는 경우 (예...

Read More

C++ - Writing modern C++ code. how C++ has evolved over the years

몇 년전에 번역 했던 글이다.

Herb Sutter씨의 2011년 “Writing modern C++ code: how C++ has evolved over the years” 강연 문서이다.
문서 하단의 설명 부분에 Herb Sutter씨의 말을 일본어로 번역된 것이 있어서 이것을 한글로 번역했다.
Herb Sutter씨의 강연...

Read More

C++ - NEW 구현

출처

new는 인수로 사이즈를 받지만 표준 new는 size가 0에서도 올바르게 동작하는 것을 규격으로 정하고 있다.
직접 구현 할 때에 의식하면 약간으로 규격에 준한 코드가 되어서 좋다.

void* operator new(std::size_t size) { if (size ==...
      
Read More

C++ - Argument Dependent Lookup

출처

C++ 언어가 가진 화려한 기구의 하나로 ADL(Argument Dependent Lookup)라는 것이 있다.
번역하면 “실 매개 변수 의존 이름 검색”으로 읽고, 글씨처럼 “실 매개 변수”에 의존하는 “이름 검색”이 된다.

ADL의 동작

코드를 보면서 차례로 이해해 보자.

Read More

C++ - 배열 참조

출처

배열 참조는 배열보다 안전한 속도 면에서 유리하다 !!!

int *a[1]; // (1) int (*a)[1]; // (2) int &a[1]; // (3) int (&a)[1]; // (4) 

이 4개의 차이점은 ?
(1)은 모두 알다시피 int의...

Read More

C++ - Virtual 전파

이 Box 클래스를 public 계승해도 안전할까?

class Box : public Object { public: Box(); ~Box(); }; 

정답은…이 정보만으로는 뭐라고 말할 수 없다 이다.
얼핏 보면 안 되다고 느끼는 사람도 많을 걸로 생각한다.특히 c++를 좀...

Read More

C++ - PLAIN OLD DATA

출처

C++의 POD(Plain Old Data)는 C언어의 데이터와 호환을 가진 데이터 구조이다.

memcpy로 데이터를 복사하거나 하지만 그것은 본질적인 것이 아니지만 어쨌든 POD의 가장 큰 의미는 C 언어의 데이터와 bit 수준으로 완전히 호환을 갖는다는 것이다.
C++과 C 언어의 프로그램이...

Read More

C++ - 생성자에 용도 별로 이름 붙이기

최근 C++ 표준 라이브러리와 Boost의 작은 유행으로 태그 디스패치의 태그를 사용자에게 명시적으로 지정하게 함으로써 함수 오버로드를 손쉽게 하는 방법이 몇몇 곳에서 나타나고 있다.

// Boost.Container의 vector의 예 // 태그 정의 struct default_init_t {}; constexpr default_init_t default_init...
      
Read More

C++ - 라이브러리 출력 이름 변경하기

출처

라이브러리 출력 이름을

MyLibrary_x86_Debug.lib 

라고 하고 싶다.
또 아래처럼 디렉토리 구성으로 하고 싶다.

 MyLibrary MyLibrary.sln MyLibrary MyLibrary.vcxproj lib MyLibrary_x86_Debug.lib MyLibrary_x64_Debug.lib MyLibrary_x86_Release.lib MyLibrary_x64_Release.lib 

으 프로젝트는 라이브러리를 만드는 것이다.

구성 프로퍼티...

Read More

C++ - PRIVATE 멤버에 합법적으로 접근하기

출처

class Employer{ float time_for_game_;//게임 시간 float time_for_anime_;//애니메이션의 시간 float time_for_family_;//가족과의 시간 public: float time_for_work_;//일의 시간 // 인사 template<class Rank> void greet(Rank target){ std;cout<<"hello"<<std::endl; } }; //사장에게만은 인사 말고 휴가를 조르다 template<> void Employer::greet(President target){...
      
Read More

Linux TCP 서버와 관련된 커널 파라메터 튜닝

출처

커널 파라메터 설명은 아래 링크에서 참고
linux/Documentation/sysctl/

예를 들어 net 계열의 파라메터 설명을 보고 싶다는 아래에서 확인한다.
linux/Documentation/sysctl/net.txt

TCP 서버용 tuning

기본

# 항구적 설정 $ vi /etc/sysctl.conf $ sysctl...
      
Read More

C++ - C++11에서 추가된 사이즈 엄밀한 정수 타입

출처

C++11에서 새로 추가됨

int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t, uint_fast64_t, int_least8_t, int_least16_t, int_least32_t, int_least64_t, uint_least8_t, uint_least16_t, uint_least32_t, uint_least64_t, intmax_t, uintmax_t, intptr_t, uintptr_t 

아래 헤더...

Read More

C++ - __if_exists

출처

Visual C++ 전용 키워드 이다.

__if_exists ( identifier ) { statements }; 
  • identifier에 전달한 식별자가 존재한다면 statements가 실행된다.
  • 부정형으로 __if_not_exists가 있다.
  • 컴파일 타임 때 실행.


Read More

C++ - 추상 기저 클래스

아래 코드처럼 virtual 이 붙은 가상 기반 클래스는 “모호성” 을 피하기 위함이다.

class B : virtual public A{} class C : virtual public A{} class D : public B, public C{} 

가상 기반 클래스가 아니라면...

Read More

C++ - DO-WHILE에 의한 매크로 트랩핑

출처

#ifdef _DEBUG #define DEBUG_LOG(exp, ...) do {if (!(exp)){std::printf(__VA_ARGS__);}} while(0) #else #define DEBUG_LOG(exp, ...) do {(void)(exp);} while(0) #endif int main() { int x = 99; DEBUG_LOG(x > 100,"warning! x = %d", x); // x가 100...
      
Read More

C++ - 문자열을 수치로 변환하는 방법

atoi

#include <cstdlib> #include <iostream> #include <string> #include <typeinfo> int main() { const std::string str("123"); auto num = std::atoi(str.c_str()); std::cout << typeid(num).name() << " : " << num << std::endl; } 

strtol

Read More

C++ - 표준 attribute 정리

원문

attribute(속성) 라는 것은

attribute(속성)는 컴파일러에 추가 정보를 전달하는 구문으로 [[attributes]] 이라고 쓴다.
최적화나 경고 추가나 제어 등을 할 수 있다.

C++11

noreturn 속성

함수

함수가 결코 반환 하지 않는 것을 표시하는 속성 Read More

C++ - 간단한 Object 메모리 풀링

의사 코드

class Player { Player(const int index) {} }; class UserManager { public: void NewUser(); void DeleteUser(const int playerIndex); private: list<shared_ptr<Player>> m_PlayerList; // 실제 사용 중인 플레이어들 vector<shared_ptr<Player>> m_PlyerPool; // Player 객체 pool deque<int> m_EmptyPoolIndex;...
      
Read More

C++ - shared_from_this가 가리키는 곳을 변경하지 못하도록 규정

출처

this 포인터를 std::shared_ptr로 얻을 수 있는 기능으로 std::enable_shared_from_this 기본 클래스와 멤버 함수 shared_from_this()가 있다.

std::enable_shared_from_this에서 파생된 클래스의 개체를 new 하고 shared_ptr의 생성자에 전달하면 이 개체의 this를 shared_ptr로 취득 할 수 있다.

그러나 아래와 같은 포인터에서 복수의 shared_ptr 개체를...

Read More

C++17 - false sharing와 true sharing 제어

출처
병행 프로그래밍으로 문제가 될 수 있는 캐시 무효화 문제를 제어 할 수 있다.

false sharing 제어

struct keep_apart { atomic<int> cat; atomic<int> dog; }; 

이런 구조가 있으면 cat와 dog가 같은 캐시...

Read More

C++17 - 랜덤 샘플링 알고리즘

std::sample()<algorithm>에 추가 되었다.

#include <iostream> #include <string> #include <iterator> #include <random> #include <algorithm> int main() { const std::string input = "abcdef"; // input에서 3개 요소를 무작위로 추출한다 // 기본 난수 생성기를...
      
Read More

C++17 - map과 unordered_map의 try_emplace()와 insert_or_assign()

try_emplace() 멤버 함수: 삽입 실패 시에 주어진 파라미터 args…를 변경하지 않는다.
insert_or_assign() 멤버 함수: 삽입에 실패하면 덮어 쓴다.

std::map<std::string, std::unique_ptr<Foo>> m; m["foo"] = nullptr; std::unique_ptr<Foo> p(new Foo); auto res = m.try_emplace("foo", std::move(p)); assert(p); // p는...
      
Read More

C++ - 우측 값 참조 value category

value category

C++의 식은 타입과는 별도로 value category라는 것을 갖는다.

value category는 prvalue, xvalue, lvalue 중 하나이고, prvalue와 xvalue를 모아서 우측 값 이라고 부른다.

주의해야 할 것으로

  • 같은 형을 가진 식에서도 다른 value category를 가질 있다.
  • 같은 객체를...
Read More

C++ - C 언어 보다 왜 컴파일이 느릴까?

일반적으로 C++로 작성된 코드가 C 보다 컴파일 시간이 느린 이유

그 이유는 주로 아래의 5개이다.

  • C++ 문법의 복잡성, 소스 코드의 parse(어휘 분석, 구문 분석, 의미 분석)에 시간을 요하고 있다
  • 템플릿의 실체화에 시간이 걸린다
  • 복잡한 최적화를 실시 할 필요가...
Read More

C++ - std::map과 함수 포인터

예제 코드

#include <iostream> #include <map> #include <string> double Add(double a, double b){ return a + b; } double Sub(double a, double b){ return a - b; } double Mul(double a, double b){ return a *...
      
Read More

C++ - std::function

C++에 존재하는 여러 종류의 함수를 wrap 하여 똑같이 다룬다

C++에 있는 함수의 종류

  • 함수
  • 람다식
  • 함수 객체

클래스의 멤버 함수

람다식 사용법

 [캡처](인수)->반환 값 타입 { 함수의 내용 }(실행 시 인수); 
...
Read More

C++ - std::bind 사용

지정한 함수를 wrap해서 std::function을 만든다.

#include <iostream> void test_function(int a, int b) { printf("a=%d, b=%d\n", a, b); } int main(int argc, const char * argv[]) { auto func1 = std::bind(test_function, std::placeholders::_1, std::placeholders::_2); func1(1, 2); // ->...
      
Read More

C++ - 자주 사용하는 C++ 이디엄(idiom) Extension Member Function

C#의 확장 메소드와 같이 기존 클래스에 대해서 멤버 함수의 확장을 operator 오버로드를 구사하여 시뮬레이트 하는 idiom 이다.
예컨대 std::vector에 print 라는 모든 요소를 출력하는 확장 구성원을 만들려고 한다면

const struct Listed_print{ using result_type=void; template<class Range>...
      
Read More

C++ - idiom - Execute-Around Pointer

원문

스마트 포인터는 객체의 라이프 타임이 다한 때에 자동적으로 확보된 리소스를 삭제한다. 생성자와 소멸자, 연산자 오버 라이드를 잘 구현하였다.
이것을 응용하면 클래스의 멤버 함수가 실행될 때 특정 처리를 실행하는 스마트 포인터를 구현할 수 있다.

C++ - idiom - Erase-Remove

원문

아래는 STL의 컨테이너에서 특정 요소를 삭제하는 코드.

std::vector<int> a; /*a에 요소를 추가하는 코드는 생략*/ std::remove(a.begin(), a.end(), 100); 

이것으로 사라진 것이 아니다. 실은 remove 함수는 특정 요소를 컨테이너의 뒤에 만든 후 선두의 특정 요소에...

Read More

C++ - idiom - Construction Tracker

원문

생성자에서 멤버 초기화 때 예외가 발생하는 경우가 있더. try와 catch로 예외를 잡을 수는 있지만 때로는 아래와 같이 어디에서 예외가 발생했는지 알 수 없을 때가 있다.

class A { public: A(int n) { /* 초기화에...
      
Read More

C++ - idiom - Construct on First Use

원문

정적 오브젝트는 주의하지 않으면 초기화 되기 전에 사용하는 실수를 할 수 있다. 아래는 그 예이다.

#include <iostream> class StaticObject { public: StaticObject() { std::cout << "StaticObject::StaticObject()" << std::endl; } void callMethod() { std::cout <<...
      
Read More

C++ - 자주 사용하는 C++ 이디엄(idiom) No Copyable mix-in

계승된 클래스는 복사 금지라고 명쾌하게 표현할 수 있는 idiom 이다.

class noCopyable{ noCopyable(const noCopyable&)=delete; noCopyable& operator=(const noCopyable&)=delete; protected: noCopyable()=default; ~noCopyable()=default; }; struct X:private noCopyable{}; 

CRTP를 이용한 구현

template<class> class noCopyable{ noCopyable(const...
      
Read More

C++ - 자주 사용하는 C++ 이디엄(idiom) cheked delete

규격에 의해 delete식에 의해 불완전 타입을 delete에 넘기는 것이 허가되고 있다.
그러나 trival 생성자가 아닌지, 독자적인 delete 연산자를 정의하고 있는 경우 미 정의 동작이 된다.
미정의 동작은 좋지 않으므로 delete 대상 형식이 불완전 타입인 경우 컴파일러에 에러를...

Read More

C++ - 자주 사용하는 C++ 이디엄(idiom) CRTP

CRTP는 Curiously Recurring Template Pattern의 약어로 자주 직역되고 있지만 기묘하게 재기한 템플릿 패턴이라고 부른다.

template<class Inher> struct X{}; struct Derived:X<Derived>{}; // CRTP 

기본 클래스에서 파생 클래스를 볼 수 있으므로 이것을 이용한 다양한 패턴도 다시 생겨나고...

Read More

C++ - 자주 사용하는 C++ 이디엄(idiom) Detection

C++17에서 type_traits 헤더에 추가된 std::void_t를 이용한 idiom 이다.
std::void_t의 구현은 아래처럼 되어 있다.

template<class...> using void_t=void; 

뭘 넣어도 void를 반환하므로 넢고 싶은 것을 마음대로 넣을 수 있다.
아래의 예는 클래스가 반복자를 가지고 있는가를...

Read More

C++ - 자주 사용하는 C++ 이디엄(idiom) pimpl

Pimpl(Pointer to IMPLementation)은 구현을 숨기거나, 헤더를 바꾸지 않는 것으로 컴파일을 속도를 고속화 할 때 사용한다.

C++20의 module에서는 필요 없어지겠지만 아직은 필요하다

hoge.h

class Hoge { int foo_; void baz(); public: int bar(); Hoge() = default; ~Hoge()...
      
Read More

C++17 - 시간 반올림 연산

밀리 세컨드를 세컨드 단위로 변경할 때 딱 맞아 떨어지지 않는 경우 반올림 혹은 내림을 할 수 있는 floor(내림), ceil(올림), round(가장 근접한 수로)가 생겼다.

#include <iostream> #include <chrono> using namespace std::chrono; int main() { milliseconds ms(2500); seconds...
      
Read More

C++17 - 연관 컨테이너의 extract, merge, insert

2개의 연관 컨테이너를 접합(splice)하는 기능이 생겼다.
map, set, unordered_map, unordered_set와 이 들의 multi 버전 모두도 포함된다.

특정 요소 추출

extract() 멤버 함수를 사용하면 컨테이너의 특정 요소를 추출 할 수 있다.

node_type extract (const_iterator position);...
      
Read More

C++11 - map에 삽입 insert, emplace

아래 방식은 unordered_map에도 적용된다.

map::insert

insert를 사용하면 key와 value의 pair를 삽입할 수 있다.

map<int,int> dic{}; dic.insert(std::make_pair(1,3)); 

map::emplace

insert와 비슷하지만 이쪽은 값을 key와 value의 생성자에 전송한 값을 구축한다.

std::map<int,int> dic{};...
      
Read More

C++ - std::exchange

C++14부터 사용 가능.

아래의 파일을 포함해야 한다

#include <utility> 

함수 원형

template< class T, class U = T > T exchange( T& obj, U&& new_value ); 


예제 코드

...
Read More

네트워크 상태 시뮬레이션 툴

comcast

Simulating shitty network connections so you can build better systems.

  • https://github.com/tylertreat/comcast
  • 네트워크 상태 시뮬레이션 툴이다.
  • 패킷 드럅율이나 레이턴시를 임의로 조정할 수 있어서 네트워크 상태가 좋지 않은 경우에 애플리케이션이 문제 없이 잘 동작하는지 테스트 할 때 사용하면 좋다.
  • ...
Read More

Vcpkg Product Roadmap - 2020.04

Vcpkg 2020.04 Update and Product Roadmap 글에서 roadmap 관련된 부분만을 일부 번역하였다.

새로운 라이브러리의 지원을 계속하고, Linux와 macOS에서의 지원을 개선한다.
사용자들의 피드백이나 제안을 기초로 제품에 새로운 기능을 추가한다.
아래는 우리들이 작업할 예정의 최우선 순위가 높은 백로그 이다.

...
Read More

C++ - Google Test/Mock 기능 정리

원문

매크로

TEST(), TEST_F(),TEST_P()

https://github.com/google/googletest/blob/master/googletest/docs/primer.md#simple-tests

TEST(TestSuiteName, TestName) { ... test body ... } 
  • 테스트 케이스의 대 항목dls 이름과 소항목인 이름을 입력한다.
    • 여러 테스트가 있는 경우는 대 항목 이름과 소항목 이름의...
Read More

Rust - Windows에서 scoop로 Rust 설치하기

출처

Scoop 설치

설치 방법은 아래의 구글링에서 나온 글을 참고한다.
https://www.google.com/search?q=scoop+%EC%84%A4%EC%B9%98&rlz=1C1NHXL_koKR713KR713&oq=scoop+%EC%84%A4%EC%B9%98&aqs=chrome..69i57j0l4.4881j0j1&sourceid=chrome&ie=UTF-8

gcc 설치

필요한 것을 설치한다

PS C:\> scoop install pkg-config openssl gcc PS C:\> which gcc C:\Users\magic\scoop\apps\gcc\current\bin\gcc.EXE PS C:\> which ar...
      
Read More

C# - byte array 내용 출력하기

네트워크 프로그래밍을 할 때 소켓을 통해서 받은 데이터의 바이너리 값을 보고 싶을 경우가 있다.
바로 출력은 안되고 아래의 스택오버플로우의 글을 사용하면 좋다.

static public string ToReadableByteArray(byte[] bytes) { return string.Join(", ", bytes); } 
...
Read More

C++11 - 컨테이너에 참조 보관하기

std::reference_wrapper를 사용하면 컨테이너에 오브젝트의 참조를 보관할 수 있다.
std::reference_wrapper<functional> 헤더를 사용한다.

#include <iostream> #include <string> #include <vector> #include <functional> struct Base { void print() const { std::cout <<...
      
Read More

선점형 스케쥴링(Preemptive Scheduling)과 협조적 스케줄링(Cooperative Scheduling) 비교

출처

선점형 스케줄링 모델과 협조적 스케줄링 모델은 여러 작업이 프로세서나 하드웨어 스레드 같은 컴퓨팅 리소스를 공유하도록 해주는 두 가지 일반적인 방법이다.

선점형 스케줄링 및 협조적 스케줄링

선점형 스케줄링은 지정된 시간 동안 모든 작업이 번갈아 가면서 컴퓨팅 리소스에 대한...

Read More

Linux - PATH에 대해서

출처

명령 검색 PATH의 확인 방법

$ echo $PATH로 확인 가능하다.

$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin 

경로는 :로 구분되고, /usr/local/bin, /usr/bin, /bin, /usr/sbin, /sbin, /usr/local/sbin 6개가 검색 명령 경로로 설정되어...

Read More

Rust - 편리한 매크로 소개

출처

Rust의 표준 매크로는 하나의 파일에 모두 정리하고 있다.
문서에서 볼 수 있다.
https://doc.rust-lang.org/src/std/macros.rs.html
일부 매크로는 컴파일러 매직이기도 하고, 보고있는 것만으로도 꽤 재미있다.

Rust의 편리한 매크로 목록

compile_error!

panic!은 런타임 오류를 내지만,이것은...

Read More

Rust - bytes Read, Write

출처

Read 와 Write

let mut bytes: &[u8] = &[1, 2, 3, 4, 5, 6]; let mut buf = [0;3]; bytes.read_exact(&mut buf).unwrap(); println!("read: {:?}, rest: {:?}", buf, bytes); 

결과

 read: [1, 2,...
      
Read More

C# - async-await에서 lock 사용하기

출처

C#에서 비동기 메소드에서는 lock을 쓸 수 없다. 이 글은 그래도 lock을 사용 하고 싶을 때를 위한 것이다.

lock이 필요한 경우를 예를 들면 아래처럼 더블 체크 락킹을 하고 싶을 때이다.

// /이것이 여러 스레드에서 비동기에게...
      
Read More

C# - .NET Core3.1에서 CORS 설정하기

출처

서버 사이드와 프론트 사이드가 다른 서버로 구현된 경우, Host된 포트 번호가 다르기 때문에 CORS 설정을 할 필요가 있다.

환경

  • Angular 8.2.14
  • .NET Core 3.1
  • 서버 사이드: https://localhost:44342
  • 프론트 사이드:http://localhost:4200

※ localhost:4200는 Angular의 기본 포트 번호

...
Read More

C++17 - atomic::is_always_lock_free

C++ 17은 atomic 클래스 템플릿에 is_always_lock_free라는 정적 멤버 상수가 정의 되어 있는데 C++11의 is_lock_free()의 static 멤버 버전이라고 생각하면 좋다.

is_lock_free()를 사용하기 위해서는 atomic 클래스 오브젝트를 만들어야 하지만 is_always_lock_free는 만들지 않는다.

C# - .NET 로컬 툴 사용법

출처

.NET Core도구?

.NET core 글로벌 툴

.NET Core 2.1에서 NuGet에 게재된 콘솔 응용 프로그램을 CLI 상에서 인스톨/실행/업데이트/언인스톨 하는 구조가 생겼다.
이들의 애플리케이션을 총칭해서 “.NET Core 툴” 이라고 부른다.
npm에서 말하는 npm install -g tool...

Read More

git - GitSheet

출처

Git의 브랜치 조작

git branch
모든 로컬 브랜치를 나열한다.

git branch -a
원격 및 로컬 브랜치를 나열한다.

git checkout -b branch_name
로컬 브랜치를 생성하고 전환한다.

git...

Read More

git - 자주 사용하는 git 명령어

출처

자신의 commit을 pull request 할 때까지

git pull #로컬 저장소를 최신으로 git checkout -b <branchName> #브랜치 작성과 이동 #파일 편진 git status #편집한 파일을 확인 git diff #차분을 확인 git add . #"."은...
      
Read More

C 언어로 Simple HTTP 서버 만들기

출처
기능은 아주 단순하다. 그만큼 분석하기 쉽다. 웹서버의 대략적인 동작을 엿볼 수 있다.

간단하게 아래의 기능만 구현했다.

  • HTTP 서버
  • HTML 출력
  • 라우팅

환경

아래 환경에서 개발, 테스트 했다.

  • OS : Windows 10
  • IDE :...
Read More

C++ 오픈소스 서버 라이브러리

sniper00/moon

  • 저장소: https://github.com/sniper00/moon
  • A cross-platform,lightweight,scalable game server framework written in C++, and support Lua Script
  • Boost.Asio와 Lua를 기반으로 만든 게임 서버 프레임워크

libuv_cpp11

  • 저장소: https://github.com/wlgq2/libuv_cpp11
  • libuv를 Modern C++로 랩핑한 라이브러리

uvw

  • 저장소:...
Read More

C++11 - std::atomic::compare_exchange_strong

출처

bool compare_exchange_strong(T& expected, T desired, memory_order success, memory_order failure ) volatile noexcept; // (1) bool compare_exchange_strong(T& expected, T desired, memory_order success, memory_order failure ) noexcept; // (2) bool compare_exchange_strong(T& expected, T desired, memory_order order...
      
Read More

C++ - Boost 타이머 취소하기

출처

타이머를 다시 이용하지 않는 경우

상태 변수를 추가하지 않고 취소를 알 수 있다.

#include <iostream> #include <boost/asio.hpp> #include <boost/asio/steady_timer.hpp> int main() { using namespace boost::asio; io_service io_srv{}; steady_timer timer{io_srv, std::chrono::nanoseconds{1}}; timer.async_wait([&](boost::system::error_code ec) {...
      
Read More

C++ - split, join, replace_all, brent_find_minima

출처

split

지정한 구분 문자로 문자열을 분할 할 때는 boost::algorithm::split 함수를 사용한다.
얻어진 결과는 지정한 컨테이너에서 받는다.
구분 문자인지 판정하는 것은 boost::is_any_of를 사용한다.
아래 예는 문자열을 + 로 구분하고 있다.
split(plus_split_s, s,...

Read More

C++ - boost::multiprecision::cpp_int

출처

다배수 길이 정수를 다룰 때는 boost::multiprecision::cpp_int를 사용한다.

#include <bits/stdc++.h> #include <boost/multiprecision/cpp_int.hpp> using namespace std; using boost::multiprecision::cpp_int; int main() { cpp_int a, b; cin >> a >> b; cout << (a > b ? "GREATER"...
      
Read More

C++ - boost::irange

출처

정수의 범위를 사용하려면 boost::irange 함수를 사용한다.

범위로서 [0, n) 을 지정하고, 제 3인수로 단계 폭을 2로 지정하고 있다. (제 3 인수를 생략하면 단계 폭은 1이 된다)
이것에 대해 range-based for 문을 작성할 수 있으며, Python의...

Read More

StackExchange.Redis - score 사용하기

StackExchange.Redis 사용 방법 정리.

접속 실패

출처

//Redis의 DB를 선택 IDatabase db = RedisRepository.SelectCache(0); //key 생성 var key = "hoge"; // score 계산을 위해 Unixtime 얻기 var unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds(); //경과 초 수를 score로...
      
Read More

StackExchange.Redis - 간단 사용

StackExchange.Redis 사용 방법 정리.

문자열 저장 및 읽기

출처

using System; using StackExchange.Redis; using System.Threading; namespace RedisSample { class Program { static void Main(string[] args) { ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); // 데이터베이스 얻기 IDatabase...
      
Read More

StackExchange.Redis - list

StackExchange.Redis 사용 방법 정리.

리스트 선두에 추가

출처

var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379"); var db = redis.GetDatabase(); db.ListLeftPush("mykey", "value1"); db.ListLeftPush("mykey", "value2"); db.ListLeftPush("mykey", "value3"); 

리스트 꼬리에 추가

출처

var...
      
Read More

C++ - TimingWheel 알고리즘을 사용한 타이머

  • 자세한 설명은 http://d2.naver.com/helloworld/267396.
  • 타임아웃 작업의 만료 여부에 대한 검사가 필요 없는 등록과 실행 두 작업만을 모두 O(1)의 시간 복잡도로 처리할 수 있는 타이머를 구현할 수 있다.

출처: https://github.com/billlin0904/librapid

uint64_t TimingWheel::add(uint32_t timeout, bool onece, TimeoutCallback callback) { //std::lock_guard<platform::Spinlock>...
      
Read More

C++ - Win32API 스레드 풀을 사용하는 타이머

  • Windows Vista부터 사용 가능.
  • CreateThreadpoolTimer, SetThreadpoolTimer API 사용.
  • ‘윈도우 시스템 프로그램을 구현하는 기술(한빛미디어)’에 설명이 잘 나와 있음


예제 코드 출처: https://github.com/billlin0904/librapid

using TimerPtr = std::shared_ptr<Timer>; class Timer { public: using TimeoutCallback =...
      
Read More

C++ - Core Guidelines Checker와 GSL 도입

출처

시작하기

C++ Core Guidelines Checker는?
주로 Bjarne Stroustrup과 Herb Sutter에 의한 C++ Core Guidelines는 더 나은 C++ 코드를 작성하는데 필요한 지침이 정비 되어 있다. 이 지침의 많은 항목은 분석 도구를 통해 확인 가능하도록 쓰여져 있다.

C++...

Read More

Rust - VS Code의 Remote Container로 Rust를 시작하기

출처

VS Code의 Remote Container 기능을 사용하여 최대한 빨리 Rust을 시작하려는 사람들에게 아래의 docker-compose.yaml 를 준비했다!

docker-compose.yaml

version: '3' services: rust: image: rust:1.38 volumes: - .:/opt/rustapp environment: - USER=`${USER}` working_dir: /opt/rustapp stdin_open: true 

rust:1.38는...

Read More

Python - struct 모듈을 사용하여 Binary 읽고/쓰기

출처

struct 모듈

struct 모듈은 pack, unpack, calcsize 등의 기능이 있으며, 이것들을 사용하여 정수, 부동 소수점 숫자, 문자열(을 encode 메소드에서 인코딩 한 것)을 bytes 객체로 변환하거나 반대로 bytes 객체에서 이것을 빼낸다.

bytes 객체로 변환하려면 “서식 지정 문자”라는 문자를...

Read More

MySQL 8.0.16의 CHECK 제약

참고

CHECK 제약 조건을 지정하여 테이블을 만든다. (※ t1.a에 “0 < a AND a <= 3” 이라는 CHEKC 제약을 지정한다)

 mysql> SELECT version(); +-----------+ | version() | +-----------+ | 8.0.16 | +-----------+ 1 row in set (0.00 sec)...
      
Read More

Http 호출을 배타적으로 하기

특정 http 호출을 동시에 호출하지 않도록 하는 방법
출처

public static void ExecuteSync(Action SynchronousAction, Action OnBlocked) { string appKey = "MyState"; var app = System.Web.HttpContext.Current.Application; app.Lock(); var state = app[appKey]; if (state == null)...
      
Read More

Linux - 자주 사용하는 명령어

출처

기본

cd <path> #path로 이동 cd - #이동 전의 path로 이동 pwd #작업 디렉토리의 패스를 표시 ls #현재 디렉토리의 내용 표시 mv <originalPath> <newPath> #파일 이동, 이름 변경 cp <originalPath> <newPath> #파일 복사...
      
Read More

Visual Studio - 개행 코드 설정 방법

.editorconfig 파일을 만들면 쉽게 할 수 있다.

.editorconfig 파일

[*] end_of_line = lf charset = utf-8-bom 

end_of_line 에서 개행 코드를 LF 지정으로 한다.
Visual Studio는 Bom 있는 UTF-8로 하는 것이 좋다

이 .editorconfig 파일을...

Read More

C# - .NET Core의 WinForms/WPF로 만든 프로그램의 실행 파일 패스

닷넷프레임워크의 WinForm/WPF는 그 자체로 바로 실행되지만 .NET Core로 만든 것은 dotnet 명령어를 사용하여 프로그램을 실행하기 때문에 프로그램의 실행 파일 패스를 얻을 때 이전(닷넷프레임워크)과 다르다.
Process.GetCurrentProcess를 사용해야 한다.

using System.Diagnostics; using System.Windows.Forms;...
      
Read More

CentOS에서 프로그램의 코어 덤프 파일을 남기는 장소

참조

어떤 이유로 프로그램이 오류로 비정상 종료하는 경우 기본적으로 프로세스의 현재 디렉토리에 core.PID 형태로 덤프를 남긴다.

CentOS에서는 기본적으로 코어 덤프를 남기지 않게 설정 되어 있다. 코어 덤프를 남기고 싶다면 아래처럼 수정해야 한다.

vi /etc/systemd/system.conf 
...
Read More

C++ - localtime_s 사용 예

최신 VC 에서는 localtime을 사용하면 경고(컴파일 실패 되는)가 나온다.
localtime_s를 사용해야 한다.

include<stdio.h> include<time.h> int main(void) { time_t curTime = time(NULL); struct tm tmCurTime; errno_t error; error = localtime_s(&tmCurTime, &curTime); if...
      
Read More

golang - Golang의 함수 인라인

함수 인라인화 조건

  • 함수에 포함 되는 식이 40개 미만
  • 함수 호출・루프・클로져・panic・recover・select・switch 라는 복잡한 것을 포함하지 않는다

출처

인라인화 막기

//go:noinline 라는 pragma를 사용한다.

package main func main() { HelloNoInline() }...
      
Read More

Linux How To

네트워크

특정 port에 접속한 네트워크 정보 보기

32452 port에 접속한 네트워크 정보를 보고 싶은 경우

netstat -nap | grep :32452 

파일

디렉토리 이름 변경

 mv 옵션... 원본 대상 mv 옵션... 원본......
      
Read More

C++ - Win32API 실행 파일의 full path 얻기

Win32 API의 ‘GetModuleFileName’ 함수 사용.

std::wstring getApplicationFilePath() { wchar_t fileName[MAX_PATH] = { 0 }; ::GetModuleFileNameW(nullptr, fileName, MAX_PATH - 1); return fileName; } 


파일의 full path에서 실행 파일 이름만 추출하기

  • getApplicationFileName()
  • _wsplitpath_s...
Read More

introselect 알고리즘

.NET 4.5 이상에서 컬렉션의 정렬 알고리즘에서 사용
https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/collections/generic/arraysorthelper.cs

Read More

C++ - atomic compare_exchange_weak/strong 함수

출처

C++11 표준 라이브러리의 atomic 조작 함수 compare_exchange_weak와 compare_exchange_strong에 대한 메모.

두 함수 모두 변수의 atomic한 CAS(compare-and-swap) 작업을 제공한다. weak 버전과 strong 버전의 동작 사양은 weak 버전에서는 “교환 가능한 경우라도 CAS 조작 실패 할 가능성이 있다(spurious failure)”가(* 1), strong...

Read More

.NET 오프 소스 - stateless 라이브러리

  • 유한 상태 머신을 쉽게 구현해 주는 라이브러리.
  • 닷넷 코어 지원.
  • Export to DOT graph 지원으로 상태 머신 구조를 이미지로 출력한다.
  • async/await 지원.
  • 공식
var phoneCall = new StateMachine<State, Trigger>(State.OffHook); phoneCall.Configure(State.OffHook) .Permit(Trigger.CallDialed, State.Ringing); phoneCall.Configure(State.Ringing)...
      
Read More

C++ - Redis 사용 방법 정리 GitHub 저장소

GitHub에 C++에서 Redis 클라이언트 라이브러리에 대해서 간단하게 정리하였다.
jacking75/examples_cpp_redis

만약 Redis를 key-value 정도로 간단하게 사용한다면 RedisCpp-hiredisredis_client 를 추천한다.
hiredis 라이브러리만 있다면 위 라이브러리는 헤더파일 1개만으로 redis를 사용할 수 있어서 준비가 간단하다
RedisCpp-hiredis 보다는 redis_client가...

Read More

C++ - 4개의 auto, 4개의 C++ 규격

원문

2020년에 출시될 예정인 「C++20」에서는 아래와 같은 함수 템플릿을 쓸 수 있다.

cpp20.cpp

template <auto N> auto func(auto x) { auto r = N + x; return r; } // 호출 예 assert( func<1>(0.5) ==...
      
Read More

C++ - Boost.Asio에서 Boost.Chrono 베이스의 타이머 사용

Boost 1.49.0 버전에서 Boost.Chrono 베이스의 타이머가 도입 되었다.

  • basic_waitable_timer : 클락 전환용
  • system_timer : system_clock용 타이머
  • steady_timer : steady_clock용 타이머
  • high_resolution_timer : high_resolution_clock용 타이머

예제 코드

#include <iostream> #include <boost/asio.hpp> #include <boost/asio/steady_timer.hpp> namespace asio...
      
Read More

C++17 - shared_ptr의 참조 카운트와 data reace

C++17 표준 라이브러리에서는 스마트 포인터인 std::shared_ptr의 unique 멤버 함수는 비추천이 되었다.
상위 호환이 되는 use_count 멤버 함수는 잔존하지만 스레드 간 동기에는 관여하지 않는다는 요건이 명확화 되어서 멀티스레드 실행에서는 반환 값은 근사(approximate)가 된다는 취지의 Note가 추가된다.

  • shared_ptr 참조 카운트를...
Read More

Rust - conrod을 이용한 GUI 프로그래밍

출처

conrodpiston라는 게임 엔진을 개발 중인 곳에서 만들고 있는 Rust 정품의 GUI 라이브러리이다.
widget 구성과 관리, widget에 대한 이벤트의 전파 등 기본적인 기능을 담당할 수 있다.
그러나 실제의 렌더링이나 OS에서 행사의 수취는 conrod는 conrod에...

Read More

IOCP 프로그래밍 tutorial

IOCP 프로그래밍을 배울 때 사용할 자료로 IOCP 프로그래밍 tutorial을 만들었다.
jacking75/edu_cpp_IOCP
(도움이 되었다면 Star 부탁합니다 ^^)

아주 간단한 IOCP용 에코 서버에서 시작하여 10단계로 나누어서 기능을 확장하면서 채팅 서버를 만들어 가면서 IOCP 프로그래밍 방법을 배운다.

이 자료로 IOCP...

Read More

분산 폴더 동기화 툴 Syncthing

Syncthing는 분산 폴더 동기화 툴이다.

Syncthing 인터넷을 통해 여러 단말기의 로컬 폴더를 동기화 할 수있는 도구이다.
3자가 관리하는 중앙 서버를 거치지 않고 개인 데이터를 공유 하려는 경우에 적합하다.
통신이 완벽하게 암호화 되어 있는 것과 개발이 오픈 소스로...

Read More

C++ - 스레드 내에서 발생한 예외 처리

참고
아래의 코드는 sigma_reference 함수에서 예외가 발생하는 경우 main에서 catch하고 있지만 예외가 잡히지 않는다.
이유는 sigma_reference 함수의 스레드와 main 함수의 스레드가 서로 다르기 때문이다.

#include <thread> #include <iostream> #include <functional> // ref #include...
      
Read More

C++ - 약어와 의미

약어 의미
ADL Argument Dependent name Lookup
COW Copy On Write
CRTP Curiously Recurring Template Pattern
ctor constructor
dtor destructor
EBO Empty Base... Read More

C++17 - RVO(Return Value Optimization) 지원

컴파일러 최적화 기능으로 RVO(Return Value Optimization) 나 NRVO(Named Return Value Optimization)를 지원하고 있었다.
그러나 이 최적화 기능은 각 컴파일러에서 제공하는 것이지 C++ 표준으로 정해진 것이 아니다.
즉 어떤 컴파일러는 지원하지 않을 수 있다.

C++17 에서는 RVO에 한해서는 표준...

Read More

C++17 - null pointer를 delete 해도 문제 없음

C++14까지는 메모리 할당을 받은 객체인지 확인 후 delete를 하였다.

if(pUser) { delete pUser; } 

C++17 에서는 null pointer를 delete 해도 문제 없다(아래 설명에서는 C++14도 괜찮은 듯…).

delete pUser; 

http://en.cppreference.com/w/cpp/language/delete

...
Read More

C++17 - string_view의 주의점

출처

  • string_view 클라스 == 문자열에 대한 읽기 전용 뷰.
    • std::string와 같이 null 종단 문자열 이외도 올바르게 다룰 수 있다. null 종단 문자를 도중에 포함 할 수 있다.
  • string_view 클래스는 참조처 문자열의 소유권을 관리하지 않는다.
      ...
Read More

C++17 - shared_mutex

출처

mutex로 보호 된 데이터를 다수의 스레드가 액세스 할 때 성능이 저하된다.
이 데이터 변경을 하지 않는 스레드가 다수인 경우 성능 저하를 줄일 수 있다.

데이터의 변경을 하지 않는 읽기(reader) 스레드와 데이터의 변경을 하는 쓰기(writer) 스레드가 각각 복수...

Read More

C++17 - 람다식에서 *this의 복사 캡쳐

C++11에서 람다식의 캡쳐 리스트에 this를 지정하면 이 람다식이 속하는 클래스 오브젝트가 참조로 캡쳐된다.

비동기 처리나 병렬 처리에서 오브젝트 수명 관리를 간단하게 하기 위해 this를 참조가 아닌 복사로 캡쳐해야 하는 경우가 있다.
이 때 C++17에서 새로 생긴 *this 를 사용하여...

Read More

golang - math/rand와 crypto/rand

출처

Go 난수 생성에 관한 표준 패키지는 math/rand와 crypto/rand의 2가지가 있다.
각각 math/rand은 약한 난수에 crypto/rand 강한 난수인데 강한 난수 쪽이 반드시 좋다는 것은 아니고, 특성 및 성능의 차이에서 유스 케이스가 나누어진다.

math/rand

https://golang.org/pkg/math/rand/

일반적으로 난수를 사용하는...

Read More

C# - .NET Core 3.0에서 Blazor가 정식 버전으로

출처

마이크로 소프트의 Web 응용 프로그램 프레임워크 “Blazor”가 .NET Core 3.0의 출시와 동시에 정식으로 출시 되었다.

Blazor는 JavaScript와 React나 Angular 등의 프레임워크 대신 C# 및 .NET Core 프레임워크 등을 이용하여 Web 애플리케이션의 개발을 가능하게 하는 프레임워크이다.

Blazor는 WebAssembly에 .NET...

Read More

C++17 - __has_include

포함(include)하는 파일이 존재하는지 확인하는 프리프로세서 기능이다.

아래는 optional 파일이 존재하는지 확인한다.

#if __has_include(<optional>)
    #include <optional>
#endif

혹은

#if __has_include("optional")
    #include "optional"
#endif
Read More

C++17 - static_assert의 에러 메시지 생략 가능

static_assert는 C++11에서 생긴 기능으로 컴파일 타임에 식의 true, false 여부를 조사해서 false인 경우 지정한 에러 메시지를 출력한다.

static_assert(a == b, "a와b는 같아야 한다"); 

C++17에서는 static_assert 에 에러 메시지 지정을 하지 않아도 괜찮다.

C++11 - std::exception_ptr 사용하기

출처

Windows의 윈도우 관련 프로그래밍을 할 때 반드시 나오는 윈도우 프로시저이지만, 윈도우 프로시저 외부에 그대로 예외를 던지려하면 무시되거나 프로세스를 강제 종료하는 것이 MSDN의 WindowProc callback function의 Remarks에 적혀 있다.
WindowProc callback function

그래서 C++11에서 추가된 std::exception_ptr에 윈도우...

Read More

C++ - Visual C++에서 UTF-8 소스 코드를 사용하는 방법

출처

전제

최신 msbuild가 필요하다. VisualStudio 2017 Community Edition을 설치하면 자동으로 설치 될 것이다.
경로가 통하지 않는 경우 다음 명령을 실행 msbuild을 사용할 수 있게하자.

set PATH=%PATH%;%PROGRAMFILES(x86)%\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin 

UTF-8에 대한...

Read More

C# - Unity와 .NET

출처

2016년 여름

  • Unity가 .NET Foundation에 참가

2017년 여름 Unity 2017.1 출시

  • .NET 3.5 Equivalent에 더하여 .NET 4.6 Equivalent가 Experimental로 선택할 수 있게 됨

2018년 초 여름 Unity 2018.1 출시

  • .NET 4.x Equivalent가 Experimental에서...
Read More

C# - 잡지 못한 예외 처리

Application.ThreadException 이벤트 사용

Windows Form 애플리케이션에서는 잡지 못한 예외가 throw 되면 Application.ThreadException 이벤트가 발생한다.
단 ThreadException 이벤트가 발행할 수 있는 부분은 Windows Form 작성, 소유하고 있는 스레드(UI 스레드)에서 예외가 throw 될 때이다.
Thread.Start 메소드나 BeginInvoke 메소드 등에서...

Read More

IOCP 관련 확장 함수 사용 준비

오랜된 Windows(아마 Windows Vista 이전)에서는 Winsock 확장 함수를 사용하기 위해서는 확장 함수의 함수 포인터를 가져와야 사용할 수 있었다.

예를들면 AcceptEx의 경우는 아래처럼 해야 사용할 수 있었다.

static LPFN_ACCEPTEX mFnAcceptEx; GUID guidAcceptEx = WSAID_ACCEPTEX ; if (SOCKET_ERROR...
      
Read More

C++ - libuv - Visual Stuido 솔루션 파일 만들기

GitHub
에서 소스 코드를 받는다.

소스 코드의 root 디렉토리에 vcbuild.bat 파일이 있다.
콘솔 창을 열어서 vcbuild.bat을 실행한다.
사전에 Visual Stuido가 먼저 설치 되어 있어야 한다.

vcbuild.bat 이 있는 root 디렉토리에 uv.sln가 생성 되어 있다.

Read More

git - submodule 사용 예

C++ 오프소스 라이브러리 googletest를 submodule로 설치 후 커밋하기

cd helloworld
mkdir third_party
cd third_party/
git submodule add git@github.com:google/googletest.git gtest
cd gtest
git checkout release-1.8.1
git add ../../../.gitmodules
git commit 
Read More

C++ - C++를 공부할 때 도움이 되는 C++ MS Docs 사이트

마이크로 소프트사의 개발자 지원 중에서 예전부터 칭찬을 받는 것 하나가 풍부한 문서를 제공하는 것이다.
예전에는 MSDN 이라는 사이트에 가서 MS가 만든 다양한 기술 문서를 보았다.

몇 년전부터는 MS는 Docs 라는 사이트를 만든 후 여기에 문서를 업데이트 하고, 이전 문서는...

Read More

golang - 시그널 핸들링

Go에서는 아래처럼 시그널을 핸들링 할 수 있다.

package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGINT) s := <- sig fmt.Println("signal: ", s) }...
      
Read More

C++ - POD 타입의 기본 초기화

출처

C++ 에서는 변수의 선언이나 new 식에서 생성자에 넘기는 인수가 빈 경우는 인수 리스트를 생략할 수 있다.

class foo { // 생략 }; int main(void) { // ↓ 어느쪽을 사용해도 같다 foo a; foo b{};...
      
Read More

C++ - C#의 region 사용하기

VC 에서는 개요 확장/축소 기능이 있다.
클래스, 함수, if 문 등을 개요 축소로 화면에 시작 줄만 표시할 수 있다.
긴 코드를 핵심만 보고 싶을 때 사용하면 유용하다.

그런데 아래와 같은 변수들의 나열은 개요 축소를 할 수 없다.

Read More

ZeroMQ

소개

  • 공식 사이트 http://www.zeromq.org/
  • Github https://github.com/zeromq
  • 예제 https://github.com/imatix/zguide
  • N-N 통신을 구현하는 socket API풍의 경량 메시지 라이브러리
  • 자동적으로 재접속이나 메시지 큐잉을 해 준다
  • 복수의 메시징 패턴 이라는 것을 조합하여 유연한 메시징 배신을 할 수 있다.
  • 오픈소스
  • Windows 및 리눅스...
Read More

C# - binary 데이터 읽고, 쓰기

읽기

BitConverter

BitConverter 클래스의 타입 별 함수를 사용한다

var data = new byte[2048]; var pos = 0; Int16 PacketID = BitConverter.ToInt16(data, pos); pos += 2; 

UnSafe

public static...
      
Read More

MQTT

출처

##MQTT란? MQTT(MQ Telemetry Transport)는 publish/subscribe 모델을 기반으로 하는 경량 메시지 프로토콜이다. 네트워크가 불안정한 장소에서 동작하기 위한 기능이나 힘이 약한 장치에서 움직이기 위한 경량화 등이 특징이다.

MQ라고 이름이 붙어 있지만, 부하를 분산시키기 위한 이른바 Job Queue는 없다 . 그런...

Read More

C++ - C4100 경고를 없애주는 UNREFERENCED_PARAMETER 매크로

VC에서 경고 레벨 4로 컴파일 하면 자주 볼 수 있는 경고주 하나가 아래와 같은 경고이다.

 warning C4100: 'argc' : unreferenced formal parameter warning C4100: 'argc' : 참조되지 않은 형식 매개 변수입니다. 

</br>

선언은 했는데 사용하지 않았기 때문에 나온...

Read More

golang - CentOS 7에서 Go 설치하기

Go 다운로드

여기에서 다운로드

$ cd ~ $ wget https://dl.google.com/go/go1.12.6.linux-amd64.tar.gz 

설치

다운로드한 파일의 업축을 푼다.

$ sudo tar -C /usr/local -xzf ~/go1.12.6.linux-amd64.tar.gz 

환경 변수

환경 변수에...

Read More

C# - 소켓 옵션

아래 코드는 C#에서 소켓 옵션을 설정하는 예제 코드이다.
출처: https://docs.microsoft.com/ko-kr/dotnet/api/system.net.sockets.socket.lingerstate

static void ConfigureTcpSocket(Socket tcpSocket) { // Don't allow another socket to bind to this port. tcpSocket.ExclusiveAddressUse = true; // The socket will linger for 10...
      
Read More

ASP.NET Core 서버 시작까지 흐름 추적

출처

프로그램 엔터리

Program#Main

Program 클래스의 Main 메소드 안은 아래처럼 되어 있다.

이것을 1행씩 따라가 본다.

Program.cs WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build() .Run(); 

1행: .CreateDefaultBuilder(args)

WebHostBuilder 인스턴스 만들기

WebHostBuilder 인스턴스를 만든다.

소스...

Read More

ASP.NET Core 애플리케이션 최소 구현 치트 시트

원본

아래의 설정만 하면 OK.

csproj

App.csproj

<Project Sdk = "Microsoft.NET.Sdk.Web" > <PropertyGroup> <TargetFramework> netcoreapp2.0 </TargetFramework> </PropertyGroup> <ItemGroup> <! - 진짜 최소 구성 -> <PackageReference Include = "Microsoft.AspNetCore.Server.Kestrel" Version = "2.0.3" /> <! -...
      
Read More

C# - Random 유틸리티

.NET 라이브러리의 기본 Random에 기능을 추가한 것이다.

아래 코드는 Unity용인데 조금 고치면 .NET에서도 사용할 수 있다.

출처

using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using Random = UnityEngine.Random; namespace Assets.Scripts.Utils { public static class...
      
Read More

C# - DateTime의 ParseExact, TryParseExact 메소를 이용하여 문자열 변환

ParseExact 메서드의 문자열 변환

DateTime 구조체에는 문자열을 변환하는 방법으로 Parse 메서드와 ParseExact 메서드가 준비 되어 있지만, 전자의 Parse 메서드는 문화권 정보를 사용하여 출력된 문자열을 같은 문화권 정보를 사용하여 DateTime 개체로 변환하는 것이다. 자신의 형식을 가진 문자열을 취급하는 경우에는 후자의...

Read More

C# 7.2의 구조체의 성능

출처

C# 컴파일러는 readonly를 따르는 일부 조건에서 구조체의 방어적 복사(defensive copy)를 생성한다.
이 문제는 잘 알려져 있고 문서화 되어 있지만 C# 7.2의 일부 기능과 관련이 있기 때문에 검토 가치가 있다.
in및 ref readonly 키워드는 문제의 발생을 높이고...

Read More

posix aio의 네트워크 소켓을 지원에 대해서

posix의 비동기 IO의 API인 aio는 파일 조작만 지원하는 걸로 알고 있었는데 소켓 조작에도 사용할 수 있다고 한다.
https://koyo.kr/post/posix-aio-socket-server-example/

그런데 리눅스쪽 서버 개발 관련해서 자료를 찾을 때 소켓 통신으로 aio를 사용하는 것을 본적이 없다.
(boost.asio나 node.js의 libuv도 사용하지 않고...

Read More

ØMQ (ZeroMQ) 서론

출처
https://www.infoq.com/jp/news/2010/09/introduction-zero-mq/

PostRank의 설립자이자 CTO인 Ilya Grigorik씨가 지난주 ZeroMQ의 소개 기사를 썻다 .

버클리 소켓(BSD)는 모든 네트워크 통신의 기본 API이다. 1980년대 초로 기원을 가진 TCP/IP 스윗의 원래 구현이기도 한 BSD 소켓이 오늘 날 모든 운영체제에서 가장...

Read More

CPU 사용률이 오르지 않을 때

처리하는 것에 비해 CPU 사용률이 오르지 않는 경우 .NET 런타임의 GC 설정을 변경해서 해결 할 수도 있다.
.NET의 GC 모드를 서버GC로 변경한다.

.NET Core

프로젝트 파일에 ServerGarbageCollection을 추가하고 값을 true로 한다.

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup>...
      
Read More

socket 프로그래밍을 할 때의 SIGPIPE에 의한 문제

출처

연결이 끊어진 소켓에 쓰기(send(2) 혹은 write(2) 같은 것)를 하면 SIGPIPE 시그널이 발생하고 프로세스가 종료하기 때문에 제대로 SIGPIPE 시그널을 핸들링 해 두자는 이야기 이다.
(Windows OS에서는 상관 없는 이야기이다)

SISGPIPE를 받은 프로세스의 행동과 소켓 프로그래밍에서의 대응책

“sigpipe”로...

Read More

네트워크 용어

Receive-Side Scaling(RSS)

  • http://minimonk.net/2728
  • Windows Server 2012의 NIC 티밍(teaming)에 대응.

TCP Chimney Offload

  • http://vstarmanv.tistory.com/58
  • VM에서는 사용 불가.
  • Windows Server 2012의 NIC 티밍에 비 대응.

NetDMA

  • 네트웍 수신 데이터를 네트웍 어댑터의 수신 버퍼에서 애플리케이션...
Read More

golang - bcrypt로 패스워드를 hash화 할 때 패스워드의 bytes 수에 조심하자

bcrypt는 자주 사용 되고 있는 패스워드의 해시 함수이다.

Slack’s hashing function is bcrypt with a randomly generated salt per-password which makes it computationally infeasible that your password could be recreated from the hashed form.
https://slackhq.com/march-2015-security-incident-and-the-launch-of-two-factor-authentication-3cdcc8efba29

bcrypt가 생성하는 해시는 $2a$10$OTKlbteacFY8DOeZY5imi.wvNLmJ1WDenLlDSzXfFxizVX.D1BNfu...

Read More

Poco 라이브러리 설치하기

Linux

  • 공식 사이트에서 최신 버전을 다운로드 한다.
  • 압축을 풀고, 빌드한다.
  • 아래는 64비트, static 라이브러리, 테스트와 샘플은 제외 하는 설정으로 빌드 한다
$ tar zxvf poco-1.7.8p2-all.tar.gz $ cd poco-1.7.8p2-all/ $ export OSARCH_64BITS=1 $ ./configure...
      
Read More

LinuxBrew 설치하기 (CentOS, WSL)

Linux (CentOS)에 Homebrew on Linux (Linuxbrew)를 설치하기 전에

출처: https://qiita.com/libra_lt/items/548fcbdfbcf992cba4ed

CentOS Linux release 7.6.1810 (Core)

Linuxbrew는

다음 특징을 가진 패키지 관리 도구이다.

  • root가 아닌 사용자의 home에 설치하는 것이 가능하다. sudo가 필요 없다.
  • 호스트 배포판에 패키지 되지 않은...
Read More

Boost 라이브러리 설치하기

설치

Linux

  1. Boost 라이브러리 공식 사이트에서 다운로드 후 압축 풀기
  2. 압축을 푼 디렉토리로 이동 후 아래처럼 입력
  3. $ ./bootstrap.sh
  4. 생성된 b2를 사용하여 Boost 라이브러리 빌드하기
  5. $ ./b2 toolset=gcc link=static threading=multi address-model=64
  6. 빌드가 끝나면...
Read More

C# - SuperSocketLite으로 게임 서버 만들기 - 05 채팅 서버

방 구조의 채팅 서버이다.

패킷 처리는 1개의 스레드만으로 처리한다.
(네트워크 IO는 멀티 스레드)

프로젝트 구조는 아래와 같다. 파일 이름을 보면 대충 어떤 일을 맡고 있는지 알 수 있을 것이다
supersocket

네트워크 관련 처리를 1개의 스레드에서...

Read More

C# - SuperSocketLite으로 게임 서버 만들기 - 04 MultiPortServer

서버가 복수의 port 번호를 사용하는 경우에 대한 예제이다.

서버는 클라이언트 이외에 서버간 통신을 위해 연결 하기도 한다(보통 분산 서버를 만드는 경우이다).

이 프로젝트는 서버 객체를 2개 생성해서 하나는 클라이언트와 연결, 또 하나는 서버와 연결한다.
서버와 클라이언트 연결 포트를 다르게...

Read More

C# - SuperSocketLite으로 게임 서버 만들기 - 03) 에코 서버 2

EchoServer를 좀 더 고도화 한 것이다.

SuperSocketLite 프로젝트를 추가해서 참조하지 않고, SuperSocketLite를 빌드한 dll 파일을 참조한다.
00_superSocketLite_libs 디렉토리에 있는 dll을 추가한다.
supersocket

또 Nuget으로 System.Configuration.ConfigurationManager을 추가한다
supersocket

서버 옵션을...

Read More

Ubuntu에 gcc 8, clang 6 설치하기

gcc 8 (Ubuntu 17.04)

PPA로 최신 버전 설치

sudo add-apt-repository ppa:jonathonf/gcc-8.0 sudo apt update sudo apt install gcc-8 g++-8 

LLVM 설치

Ubuntu 18.04

apt-get install llvm 

6.0 버전이...

Read More

C# - SuperSocketLite으로 게임 서버 만들기 - 02) 에코 서버

가장 간단한 서버이다.
클라이언트가 보낸 것을 그대로 클라이언트에게 보낸다.
간단하게 SuperSocketLite를 애플리케이션에서 어떻게 사용하는지 배울 수 있다.

코드는 Tutorials/EchoServer 디렉토리에 있다.
빌드를 하면 Tutorials/00_server_bins 디렉토리에 관련 파일을 출력한다.
run_EchoServer.bat 배치 파일로 실행한다.

코드 설명

Read More

C# - SuperSocketLite으로 게임 서버 만들기 - 01

C#에서 가장 유명한 네트워크 라이브러리로 SuperSocket 이라는 것이 있다.
앞으로 여러 번을 나누어서 SuperSocket을 사용하여 게임 서버를 만드는 방법을 설명하려고 한다.

SuperSocket 이란?

SuperSocket의 코드는 Github에 있다.
https://github.com/kerryjiang/SuperSocket
현재는 2.0 버전을 작업 중으로 올해말 정도에 첫...

Read More

C++ - Windows 텍스트 인코딩 변환

Ansi <-> UTF-8

std::string CGlobal::ToUFT8( const char* pszIn ) { std::string resultString; int nLenOfUni = 0, nLenOfUTF = 0; wchar_t* us = NULL; char* pszOut = NULL; if ( ( nLenOfUni = MultiByteToWideChar( CP_ACP, 0,...
      
Read More

참, 거짓을 반환 하는 함수의 네이밍

참 거짓 값(Boolean, bool)을 반환하는 함수는 is로 시작하는 것이 일반적이라고 생각한다. 적어도 C++ 에서는…
그러나 영어적으로 is 시작이 어려운 경우도 있다.
is로 시작할 수 없는 함수 이름의 명명 방식을 생각해 봤다.

존재 하는가?

가장 하기 쉬운 실패가...

Read More

좋은 함수 이름을 짓기 위한 참고 정보

참 거짓을 돌려주는 메소드

장소 단어 의미
Prefix is (오브제그트가)대기 하는 상태가 되어 있나? isChecked
Prefix can (오브제그트가)기대하는 동작을 할 수 있나? canRemove
Prefix should (호출 측이)어떤... Read More

좋은 클래스 이름을 짓기 위한 참고 정보

데이터 소스를 취급하는 레이어

이름 보충
Client HttpClient 등 Server-Client 의미로 사용하는 TwitterApiClient, QiitaApiClient
Gateway API를 요청하기 위한 게이트 웨이로서 TwitterTimelineGateway, QiitaAccountGateway
Store, Storage, Registry DB를 요청하거나... Read More

이름 붙이기

메소드 이름은 동사로 시작한다

동사 이름 한글 표현 주된 반환 값
Get 취득하다 객체
Set 설정하다 void
Update 갱신하다 void(update한 건수 돌려줄 경우도)
Delete 삭제하다 void(delete한... Read More

epoll을 사용한 echo 서버

출처

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/epoll.h> #include <netinet/in.h> #define SERVER_PORT 10007 #define MAX_EVENTS 10 #define BACKLOG 10 static int listener; static int epfd; static...
      
Read More

C++ - STL function, lambda, bind 사용 예

/* * std_function1.cpp * Copyright (C) 2014 kaoru <kaoru@bsd> */ #include <iostream> #include <functional> using namespace std; struct Foo { Foo(const int n) : i_(n) {} void print_add(const int n) const { std::cout << i_ +...
      
Read More

C++ - STL map에 함수 포인터 사용

#include <iostream> #include <map> #include <string> double Add(double a, double b){ return a + b; } double Sub(double a, double b){ return a - b; } double Mul(double a, double b){ return a * b; }...
      
Read More

C++ - 컴퓨터의 실제 IP 얻기 (code)

#include <ws2tcpip.h> bool ServerInfoMgr::GetLocalIP( string& strIP ) { char host_name[256]; if (gethostname(host_name, 256) == SOCKET_ERROR) return false; struct addrinfo hints, *res = NULL; char *szRemoteAddress=NULL, *szRemotePort=NULL; int rc; memset( &hints, 0, sizeof(hints) ); hints.ai_family = AF_INET;...
      
Read More

C++ - Win32 시스템 정보 얻기(Code)

출처
win32_systemInfo.h

#pragma once #include <cstdint> #include <vector> #include <string> #include <memory> #include <rapid/utils/singleton.h> namespace rapid { namespace platform { struct ProcessorInformation { ProcessorInformation() : numaNodeCount(0) , processorCoreCount(0) , logicalProcessorCount(0) , processorL1CacheCount(0) , processorL2CacheCount(0)...
      
Read More

C# - tip 모음

System.BitConverter

byte에서 short로 변환하기

http://msdn.microsoft.com/ko-kr/library/system.bitconverter.toint16.aspx
BitConverter.ToInt16

스트링을 바인트로 변환

//the below code converts byte[] type string type string txt = System.Text.Encoding.GetEncoding("utf-8").GetString(bytes); //using Default Encoding string txt = System.Text.Encoding.Default.GetString(msg2.getData()); 

다른 클래스에...

Read More

C# - 시스템 프로그래밍

다른 프로세스 실행

System.Diagnostics.Process.Start("실행파일경로\실행파일명.exe",파라메터) System.Diagnostics.Process.Start("cmd.exe 명령어"); 

프로세스 종료

System.Diagnostics.Close(); // 프로세스의 리소스를 해재(종료) 시킨다. System.Diagnostics.CloseMainWindow(); // UI가 있는 프로세스에 메시지를 보내 종료 시킨다. System.Diagnostics.Kill(); // 즉시 프로세스를 종료시킨다. 
...
Read More

C# - SharpZipLib을 사용한 복수 개의 파일 압축 및 해제

SharpZipLib : http://icsharpcode.net/OpenSource/SharpZipLib/Default.aspx

// 압축 void Compression() { try { string zipPath = "test.zip"; System.IO.FileStream writer = new System.IO.FileStream( zipPath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.Write); ICSharpCode.SharpZipLib.Zip.ZipOutputStream zos = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(writer); foreach (string file in DiffFiles) { int Substringindex...
      
Read More

C# - Timer

DispatcherTimer

일반 타이머는 메인 스레드가 아닌 다른 스레드를 만들어서 처리 되지만 이것은 실행은 메인 스레드에서 처리 되어 메인 스레드와 동기화가 보장 된다.

MSDN의 설명

각 Dispatcher 루프의 맨 위에서 DispatcherTimer가 다시 평가됩니다. 시간 간격이 발생할 때...

Read More

C# - SmtpClient로 메일 보내기

닷넷의 SmtpClient 클래스를 사용하여 메일을 보내는 방법이다.
MSDN의 예제는 빠진 부분이 많아서 그걸 사용하면 제대로 되지 않았다.
삽질하다가 구글링으로 알아냈다.
아래 예제는 구글의 Gmail을 사용하는 것으로 했다.
Gmail의 주소는 smtp.gmail.com 이다.
포트번호는 587을 사용한다. Read More

C# - WPF - 멀티 스레드에서 컨트롤 조작

from : MSDN

// 아래의 예는 리스트박스에 새로운 데이터를 추가하는 것이다. private delegate void ListBoxDelegate(string arg); void SetStateText(string state) { this.listBox1.Dispatcher.BeginInvoke( System.Windows.Threading.DispatcherPriority.Normal, new ListBoxDelegate(UpdateListBox), state); } private void UpdateListBox(string state) { this.listBox1.Items.Add(state); } // 메인 스레드가...
      
Read More

C# - 다중 스레드에서 컨트롤을 변경 할 때

출처: MSDN

// 델리게이트를 선언한다. delegate void SetTextCallback(string text); // 컨트롤의 접근은 따로 함수를 만들어서 접근하도록 한다. private void SetText(string text) { // InvokeRequired required compares the thread ID of the // calling thread to the...
      
Read More

C# - 문자열

지정 단어로 문자열 분해

string readLine = "A=B"; string[] word = readLine.Split(new Char[] { '=' }); 

문자열 포맷

string CheatString = string.Format("@timeevent1:{0}", textBoxBlessing.Text); 

지정된 단어를 문자열에서 (제일...

Read More

C# - 파일 조작

클래스 단위로 파일에 쓰기

이 직렬화 방식은 꼭 .NET 플랫폼에서 서로 파일을 읽고 쓸 때만 사용 가능하다.
만약 .NET으로 만든 프로그램에서 아래와 같이 파일을 만들고 이것을 네이티브에서 읽으면 앞에 다른 값이 들어가 있다( 정확하게는 직렬화 되는 클래스의 메타...

Read More

C# - json 데이터 암호화, 복호화 하기

AESEncrypt로 암호화/복호화 하기

public static async Task<RESULT_T> RequestHttpAESEncry<REQUEST_T, RESULT_T>( string address, string reqAPI, string loginSeq, string userID, REQUEST_T reqPacket) where RESULT_T : new() { var resultData = new RESULT_T(); var api = "http://" + address +...
      
Read More

svn 에러 E155010 is scheduled for addition, but is missing

svn 업데이트를 하니 특정 디렉토리가 삭제가 되었는데 충돌이 나서 수동으로 지웠음.
이 후 커밋을 하려니 위와 같은 에러가 발생.

이런 경우 –force라는 플래그를 사용하여 강제적으로 없애준다.
위에 삭제된 디렉토리가 test1 이라고 하면

svn delete...
      
Read More

golang - 랜덤 seed 설정하기

출처: https://qiita.com/makiuchi-d/items/9c4af327bc8502cdcdce

시간을 seed로 설정하기

time.Now().UnixNano()를 사용한다.

package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) fmt.Println(rand.Int63()) } 

보안성이 높은 seed 사용하기

crypto/rand 패키지를 사용한다.

package...
      
Read More

C# - 예외 출력 helper 클래스

출처: https://teratail.com/questions/24669

public static class ExceptionHelper { public static string ExtractException(this Exception ex, int indent = 2) { var indentStr = new String(' ',indent); StringBuilder traceLog = new StringBuilder(); StackTrace trace = new StackTrace(ex, true); foreach...
      
Read More

C++ - Delegate 라이브러리

상호 참조를 할 경우, 상호 참조 되는 클래스 중 둘 중 하나가 변경될 경우 상호 컴파일이 일어난다
-> 작은 프로젝트라면 모르겠지만 대규모 프로젝트에서는 작은 소스 수정 하나가 큰 짐이 될 수 있다
그리고 설계 상 상호 참조를 하고...

Read More

C# - C++과 연동

꼭 봐야 될 것

  • http://sj21.wo.to/tt/483
  • http://sj21.wo.to/tt/484
  • http://blogs.msdn.com/junfeng/archive/2006/05/20/599434.aspx

How to: Marshal Structures Using C++ Interop How to: Marshal Embedded Pointers Using C++ Interop

C++

#include <msclr\marshal.h> using namespace System; using namespace msclr::interop; int main(int...
      
Read More

C#의 클래스를 byte[]로 변환하는 방법

패킷 헤더 클래스

[StructLayout(LayoutKind.Sequential)]//[StructLayout(LayoutKind.Sequential, Pack=1)] public class HEADER { public ushort a1; public ushort a2; public ushort a3; public ushort a4; } 

로그인 요청 클래스

// GetBuffer을 부모 클래스에서 정의하고 여기서는...
      
Read More

golang - 에코 서버 예제코드

  • 클라이언트 관리를 채널 별로 나누어서 처리.
  • distribute 라는 함수를 고루틴으로 동작시키고, 내부에서 채널을 통해서 메시지를 받는다.
  • 클라이언트 접속, 클라이언트 접속 해제, 클라이언트에게 메시지 보내기 채널을 나눈다.
  • 고루틴은 handle, distribute(메시지 보내기 채널을 호출하는 고루틴이 있음)

서버

Read More

golang - 04) TCP Server 만들기

출처

비동기 Write

main.go

package main import ( "context" "log" "os" "os/signal" "syscall" "github.com/dmmlabo/tcpserver_go/tcp4/server" ) func main() { sigChan := make(chan os.Signal, 1) // Ignore all signals signal.Ignore() signal.Notify(sigChan, syscall.SIGINT)...
      
Read More

golang - 03) TCP Server 만들기

출처

server 패키지 만들기

  • struct를 이용한다.
  • handleConnection에서 사용하는 속성을 Server 구조체, handleConnection에서 사용하는 속성을 Conn 구조체에 정리한다.

main.go

package main import ( "context" "log" "os" "os/signal" "syscall" "github.com/dmmlabo/tcpserver_go/tcp3/server"...
      
Read More

golang - 02) TCP Server 만들기

출처

서버 종료하기

package main import ( "context" "log" "net" "os" "os/signal" "strings" "sync" "syscall" ) const ( listenerCloseMatcher = "use of closed network connection" ) func handleConnection(conn *net.TCPConn, serverCtx context.Context, wg *sync.WaitGroup) {...
      
Read More

golang - 01) TCP Server 만들기

출처

Echo Server 예제 코드

package main import ( "log" "net" ) func handleConnection(conn *net.TCPConn) { defer conn.Close() buf := make([]byte, 4*1024) for { n, err := conn.Read(buf) if err != nil { if...
      
Read More

Redis 서비스 전에 조사할 것들

Redis 서버의 흔한 실수 법

Redis 서버가 떨어지거나 APP서버가 떨어질지는 상황에 따른다.

  1. KEYS 명령과 ZRANGE 명령으로 수만건 이상에 접근하여 I/O대기로 죽는다
  2. 데이터 설계를 실패하여 메모리 부족으로 쓸 수 없게 되어 죽는다

Redis 서버에서 장애 발생 시의...

Read More

좋은 에러 메시지 쓰는 법

원문

에러 메시지를 2가지로 분류한다

우선, 에러 메세지라고 해도 다음의 2가지 패턴에서 크게 달라진다.
(1) 이용자가 보는 에러 메세지
(2) 개발자가 보는 에러 메시지

(1) 이용자가 보는 에러 메세지

내부 구현에 대해서는 적지 않는다
...

Read More

로그 설계 지침

원문

개요

이 문서는 효율적이고 안정된 시스템 개발/운용을 하기 위한 로그 설계 지침이다.
정확하면서 낭비 없는 로그 출력을 목표로 한다.

로그 수준

로그의 긴급도나 용도에 따라서 다음처럼 로그 수준을 설정한다.
Log4j의 로그 수준을 따라하고 있어서...

Read More

Redis 4.0의 핵심 기능

(몇년 전의 글을 블로그에 올린 것임)
참고

redis 4.0은 지금까지와는 비교하면 아마 가장 극단적인 버전 업 중 하나이다.
향후 사용자에 의해 발견된 중대한 문제는 수주일에서 수개월로 패치 발표할 테니 신중하게 이용하자.

a modules system

redis는 이미...

Read More

C#에서 async-await를 사용하여 TCP Server 만들기

이 글은 여기 글을 번역,정리 한 것이다.
예제 코드는 여기

C# 네트워크 프로그래밍에서 비동기 IO를 사용할 때는 3가지 방법이 있다.

각 방법 별 성능은 아래와 같다.

... Read More

premake

  • CMake와 같은 멀티 플랫폼 오픈소스 개발에 유용한 툴.
  • lua를 통해 스크립트를 작성한다. 루아 파일 이름과 같은 이름의 솔루션 파일을 만들어준다.
  • 현재 premake4와 premake5 두 가지 버전이 있다.
    • Visual Studio 2013 이상을 지원하려면 premake5를 사용해야 한다.
  • C,...
Read More

C# - Ubuntu에서 snap으로 dotnet-sdk 설치하기

아래 명령어를 실행한다.

sudo apt search dotnet-sdk

dotnet-sdk 명령어

dotnet-sdk.dotnet

만약 「dotnet-sdk」 명령어로 「dotnet-sdk.dotnet」을 실행하고 싶다면 아래 명령어를 실행한다.

sudo snap alias dotnet-sdk.dotnet dotnet
Read More

MongoDB - C# find

모든 도큐먼트 가져오기

  • 클래스 맵핑
var collection = GetDBCollection<DBBasic>("Basic"); var documents = await collection.Find(_ => true).ToListAsync(); return documents; 
  • BsonDocument
    var collection = GetDBCollection<BsonDocument>("Basic"); var documents = await...
          
    Read More

MongoDB - C# insert, update, delete

기본 추가

  • 클래스 맵핑으로 새 도큐먼트 추가
var newData = new DBBasic() { _id = "test01", Level = 1, Exp = 0, Money = 1000, Costume = new List<int>(Enumerable.Repeat(0, 12)), }; // Basic...
      
Read More

MongoDB - wiredTiger

wiredTiger 사용 conf 파일 예

// mongodb_wt.conf storage: dbPath: "/data/mongod_wt" engine: "wiredTiger" directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true statisticsLogDelaySecs: 0 collectionConfig: blockCompressor: "snappy" indexConfig: prefixCompression: true journal: enabled: true systemLog: destination: file path:...
      
Read More

프로그램을 관리자 권한으로 실행하는 코드

출처

권한을 확인하고 관리자 권한이 아니면 다른 프로세스로 관리 권한을 부여하고 다시 시작한다

Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); var pri = (WindowsPrincipal)Thread.CurrentPrincipal; //관리자 권한 이외로 실행했다면 다른 프로세스로 이 프로세스를 실행한다 if (!pri.IsInRole(WindowsBuiltInRole.Administrator)) { var proc = new ProcessStartInfo()...
      
Read More
구현 방법 행수 난이도 초당 요청 수
출처: [리눅스 정적 라이브러리 만들어 쓰기 작성자 라온이아부지 선성태] (http://blog.naver.com/r2adne/120127876141)

순서

  • 라이브러리로 쓸 함수가 포함된 파일 두개 만들기
  • 컴파일 해서 오브젝트로 만들기
  • 두개의 오브젝트를 하나의 라이브러리로 합치기
  • 라이브러리를 사용할 메인프로그램 코딩
  • 라이브러리를...
Read More

C++ - [펌] Linux에서 동적 라이브러리 만들기

출처: [리눅스 공유라이브러리(동적 라이브러리) 만들어 쓰기 작성자 라온이아부지 선성태](http://blog.naver.com/r2adne/120127832516)

순서

  • 라이브러리로 쓸 함수가 포함된 소스 두 개 작성
  • 공용으로 각각 컴파일
  • 두개의 오브젝트를 하나의 라이브러리로 통합
  • 링크파일 생성
  • 라이브러리 등록
  • 라이브러리의 함수를...
Read More

C++ - [펌] Linux에서 라이브러리 로딩

출처: 라이브러리 로딩 - ld.so.conf

라이브러리 로딩 - ld.so.conf

  • 동적 라이브러리를 호출하기 위해서는 path 지정이 필수이다.
  • 해당 라이브러리가 어디에 위치해 있는지 모든 디렉토리를 탐색하기에는 비효율적이기 때문이다.
  • 우리가 흔히 설정하는 LD_LIBRARY_PATH 환경변수가 동적 라이브러리 호출을 위한 path 지정에...
Read More

Node.js - UDP Socket

데이터 수신

dgram.createSocket(type, [callback]) 

type 에는 udp4, udp6, unix_dgram 지정 가능.

콜백은 message 이벤트가 발생했을 때의 내용을 기술.

function (msg, rinfo) { } 

버퍼(msg)와 송신자 정보와 데이터의 바이트 수를...

Read More

Node.js - TCP Socket

간단한 hello world

Class: net.Server 이벤트

 'listening': server.listen()를 호출 후 서버가 바인드 되었을 때 발생. 'connection': 새로운 연결이 만들어지면 발생. 'close': 서버가 끊어지면 발생. 'error': 에러 발생. 이 이벤트 이후 'close' 이벤트가 직접 생성되는 경우도 있다. 

Class:...

Read More

C# - ScriptCs.WebApi

개요

  • 2015.09.14 현재 WebAPI 2는 ScriptCs 1.5에서 에러 발생
  • ScriptCs.WebApi2
  • WebApi를 사용할 수 있게 해준다.

설치 및 간단 사용

  • Web API script pack을 설치한다.
    • scriptcs -install ScriptCs.WebApi2
  • start.csx 파일을 만든 후...
Read More

C# - scriptcs-nancy

개요

  • scriptcs-nancy
  • NancyFX 라이브러리를 사용할 수 있게 해준다.
  • 중요. 2015-09-15
    • ConcurrentDictionary<string, AgentData> AgentStatus 와 같이 클래스(혹은 구조체)를 컨테이너에 저장하면 모듈 로딩 에러가 발생하므로 객체를 담는 컨테이너 사용불가

설치 및 간단 사용

    ...
Read More

C# - ScriptCs.Request

개요

  • http 요청 모듈
  • https://github.com/martinobrink/ScriptCs.Request

설치

scriptcs -install ScriptCs.Request 

사용법

public class Notification { public string Message {get; set;} public string SenderName {get; set;} } var...
      
Read More

C# - ScriptCs

개요

  • 텍스트 파일에 적은 C# 코드를 컴파일러를 사용하지 않고 명령어로 실행할 수 있는 툴이다.
  • Roslyn을 힘을 이용한 것이다.
  • .NET Framework 4.5 이상이 필요하다.
  • 공식 사이트 http://scriptcs.net/
  • 샘플 사이트 https://github.com/scriptcs/scriptcs-samples
  • 위키 https://github.com/scriptcs/scriptcs/wiki
  • 설치
    • Windows의 패키지 관리 소프트인 chocolatey(...
Read More

C# - AWS S3

개요

S3 객체 만들기

var config = new AmazonS3Config(); config.RegionEndpoint = RegionEndpoint.APNortheast1; var s3Client = AWSClientFactory.CreateAmazonS3Client("XXXXXX", "YYYYYYY", config); 

버킷 안의 리스트 보기

C# - AWS SNS

AWS SNS 프로그래밍

  • 디바이스 토큰: 애플리케이션의 식별자. 각 플래폼이 발행.
  • Endpoint Arn: 디바이스 토큰으로 생성하는 모바일 엔드포인터. SNS에서는 이 모바일 포인트를 사용하여 push를 보낸다.
  • 가격: 월 100만 요청은 무료. 100만을 초과하면 100만 요청마다 0.5$
  • 안드로이드에서 디바이스 토큰이 바뀌는...
Read More

C# - etc

const 배열을 정의 할 수 없을 때

static readonly int[] LEVEL_TABLE = { 1, 2, 3, 4, 5 }; static readonly string[] STR_TABLE = { "NONE", "1", "2", "3" }; 

다른 클래스에 있는...

Read More

C# - 정규 표현식

문자 집합

  • [] 안에 일치시키려는 문자를 일일이 나열해주거나 범위 지정이 가능할 경우 그 범위만큼만 지정해 주면 된다.
  • [a-z] : 영어 소문자
  • [A-Z] : 영어 대문자
  • [0-9] : 숫자
  • [k-p] : 알파벳에서 k 부터 p 까지만.
  • [4-8] :...
Read More

C# - serilog

  • .NET의 많은 다른 라이브러리와 마찬가지로 Serilog는 파일, 콘솔 등의 다양한 저장소로의 로깅을 제공한다. 또한 설정하기 쉬운 깨끗한 API를 가지고 있으며, 다양한.NET 플랫폼으로 이식성을 가지고 있다. 또 다른 로깅 라이브러리와는 달리 Serilog는 강력한 구조화 된 이벤트 데이터로 구축된다.
  • http://serilog.net/
  • NLog와...
Read More

C# - Fluent Scheduler

기본

  • 주 기능: 지정된 시간에 실행해야 할 Job을 등록해 놓으면 해당 시간이 되면 Job을 실행한다.
  • 오픈 소스: https://github.com/jgeurts/FluentScheduler
  • 설치: Nuget으로 쉽게 설치할 수 있다.

예제 코드

1) 현재 등록된 job 개수

//...
      
Read More

C# - Process

실행중인 프로세스트의 디렉토리 위치

string 현재위치 = Environment.CurrentDirectory; 

다른 프로세스 실행

System.Diagnostics.Process.Start("실행파일경로\실행파일명.exe",파라메터) System.Diagnostics.Process.Start("cmd.exe 명령어"); 
  • C# - 배치 파일 실행하고 출력 결과를 얻는 방법
    • http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=1810&rssMode=1&wtype=0
  • ...
Read More

C# - config-r

개요

  • scripts와 Roslyn을 사용하여 스크립트 방식의 설정 파일을 사용할 수 있다.
  • 저장소 https://github.com/config-r/config-r
  • NuGet으로 설치

Quickstart

  1. NuGet으로 설치
  2. 실행 파일과 같은 이름의 .csx 파일을 프로젝트에 추가(예 실행파일 이름이 ConsoleApplication1.exe 라면 ConsoleApplication1.exe.csx). 추가한 파일의 프로젝트 속성...
Read More

C# - Async/Await

  • http://csharpstudy.com/CSharp/CSharp-async-await.aspx
  • C# 5.0 이 나온 이후 각 써드파티 라이브러리에서 비동기 메소드 지원

간편한 비동기 프로그래밍:async/await

  • http://www.simpleisbest.net/post/2013/02/06/About_Async_Await_Keyword_Part_1.aspx
  • http://www.simpleisbest.net/post/2013/02/12/About_Async_Await_Keyword_Part_2.aspx
  • http://www.simpleisbest.net/post/2013/02/16/About_Async_Await_Keyword_Part_3.aspx
  • http://www.simpleisbest.net/post/2013/02/28/About_Async_Await_Keyword_Part_4.aspx
  • http://www.simpleisbest.net/post/2013/03/12/About_Async_Await_Keyword_Part_5.aspx

###async를 사용한 가상 함수 정의

virtual public async Task<bool> Process() {...
      
Read More

C# - Windows Event Log

  • 개발 시에 Windows가 제공하는 이벤트 로그를 사용하면 로그 보기/관리가 쉬워진다.
  • C# 을 이용해 Windows Event Log 쓰기 [http://mainia.tistory.com/412]
static void Main(string[] args) { WriteEventLogEntry("This is an entry in the event log by daveoncsharp.com"); }...
      
Read More

C# - WM_COPY_DATA

참고 글

  • http://www.codeproject.com/KB/cs/ipc_wmcopy.aspx
  • http://www.codeproject.com/KB/threads/InterprocessCommunicator.aspx
  • http://www.codeproject.com/KB/cs/wm_copydata_use.aspx
  • MessageWindow http://www.codeproject.com/KB/threads/IPCBetManagdUnmanagd.aspx

예제 코드

const int WM_COPYDATA = 0x4A; [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); ................ //Process[]...
      
Read More

C# - NLog

특징

  • 오픈소스 닷넷 플랫폼 로그 라이브러리
  • .NET Compact, mono도 지원
  • 사용이 쉽고, 설정은 설정 파일과 소스 코드를 통한 2가지 방법 제공.
  • 옵션 지정으로 버퍼링, 비동기, 로드 밸런싱, 장애대처 등을 할 수 있다.
  • 출력 옵션
    • Files - single...
Read More

C# - 정규 표현식 라이브러리 VerbalExpressions

소개

  • 기존의 복잡한 방식의 정규식을 이해하기 쉽도로 해주는 라이브러리.
  • 처음에는 JavaScript용으로 나왔지만 이후 대부분의 언어를 지원하고 있다.
  • 소스 코드는 GitHub에 공개 되어 있다.
    https://github.com/VerbalExpressions/CSharpVerbalExpressions
  • 간단 예제
[TestMethod] public void TestingIfWeHaveAValidURL() { //...
      
Read More

C# - Thread Local

  • 닷넷 프레임워크 4.0 에서 추가
    • 이전에는 비슷한 것으로 ThreadStatic 속성이 있었음
      • 그러나 static 멤버에만 사용 가능.
      • 멤버의 값은 보통 그 타입의 기본 값으로 초기화된다. 초기 값을 설정해도 무시된다.
  • ThreadLocal 클래스는 위의 문제를 모두...
Read More

C# - File

클래스 단위로 파일에 쓰기

이 직렬화 방식은 꼭 .NET 플랫폼에서 서로 파일을 읽고 쓸 때만 사용 가능하다.만약 .NET으로 만든 프로그램에서 아래와 같이 파일을 만들고 이것을 네이티브에서 읽으면 앞에 다른 값이 들어가 있다( 정확하게는 직렬화 되는 클래스의 메타 정보가 들어가...

Read More

C# - System.Lazy

System.Lazy ?

  • System.Lazy 는 지연 초기화를 지원하는 클래스이다. .NET Framework 4.0 에서 추가
  • 사용하는 경우
    • 멀티 스레드 환경에서 공유 리소스의 초기화를 스레드 세이프하게 하고 싶을 때
    • 초기화에 시간이 걸리는(또는 많은 하드웨어 자원을 사용하는) 클래스가 있을 때 이것을...
Read More

C# - string

문자열의 마지막에 있는 \r\n 제거 하기

Text2.TrimEnd(Environment.NewLine.ToCharArray()); 

지정 단어로 문자열 분해

string readLine = "A=B"; string[] word = readLine.Split(new Char[] { '=' }); string[] stringSeparators = new string[] {"[#@#]"};...
      
Read More

C# - Simple Winform Logger

로그 클래스. DevLog

// public enum LOG_LEVEL { TRACE, DEBUG, INFO, WARN, ERROR } public class DevLog { static System.Collections.Concurrent.ConcurrentQueue<string> logMsgQueue = new System.Collections.Concurrent.ConcurrentQueue<string>(); static LOG_LEVEL 출력가능_로그레벨 = new LOG_LEVEL(); static public void Init(LOG_LEVEL logLevel)...
      
Read More

C# - SharpSVN

설명

  • 닷넷에서 SVN을 조작하기 위한 라이브러리
  • SVN 서버의 버전과 맞추어야 한다.
  • 공식 홈페이지는 http://sharpsvn.open.collab.net/
  • 1.7, 1.8 용은 NuGet으로 받을 수 있다.
  • SharpSVN 라이브러리는 32비트,64비트로 나누어지는데 선택에 따라서 명시적으로 프로젝트의 32 or 64비트를 결정해야한다. AnyCPU로 하면 빌드 시 경고...
Read More

C# - IDisposable

개요

  • Disposable.Create() 로 IDisposable을 모을 수 있다.
  • 컨테이너(IDisposableContainer)를 만들고 IDisposable한 인터페이스를 .AddTo(container)로 등록한다.
public sealed class Resource : IDisposable { private readonly string name; public Resource( string name ) { this.name = name;...
      
Read More

C# - 날짜와 시간

MSDN의 날짜 포맷

  • https://msdn.microsoft.com/en-us/library/az4se3k1.aspx

현재 시간 중에서 시간:분(09:01)으로 얻고 싶을 때

DateTime.Now.ToString("hh:mm") // for non military time DateTime.Now.ToString("HH:mm") // for military time (24 hour clock) 

C#에서 String 형식으로 넘어온 날짜와...

Read More

C# - IPC

참조에 System.Runtime.Remoting을 추가한다.

IPC로 통신할 데이터 객체

public class RemoteObject : MarshalByRefObject { static Queue<string> ClientMessage = new Queue<string>(); static Queue<string> ServerMessage = new Queue<string>(); public void ServerToClient(string msg) { ClientMessage.Enqueue(msg); } public void...
      
Read More

C# - Linq

기본

  • Linq는 아래의 2개의 데이터 소스를 대상으로 한다.
    • IEnumerable 주로 온 메모리 데이터 소스를 나타내는 Interface LINQ to Object, LINQ to XML
    • IQueryable 주로 외부 데이터 소스를 나타내는 interface LINQ to SQL, LINQ to Entity
  • ...
Read More

C# - 메모리

스택할당

  • stackalloc 키워드를 사용하면 지역 변수에 한해서 스택 할당을 할 수 있음
  • 해당 함수를 벗어나면 메모리는 삭제된다.
  • unsafe 기능으로 사용할 수 있다.
  • MSDN 문서
    • http://msdn.microsoft.com/ko-kr/library/cx9s2sy4.aspx
    • http://msdn.microsoft.com/ko-kr/library/aa664785(v=vs.71).aspx
  • C#에서 포인터 사용하는 방법
    • http://rkddlsghk98.blog.me/30160902176
...
Read More

C++11 - 고정형 정수 타입

C++11에서 고정형 길이의 정수 타입이 새로 생겼음.
고정형 길이라는 것은 int8_t, int16_t 등 타입에 숫자가 붙는 것을 말함.
플랫폼에 상관 없이 크기가 고정 되어 있어서 크로스 플랫폼 개발에 사용하면 좋음.

헤더 파일

C# - Enum

Enum의 요소를 foreach로 열거하기

void Main() { foreach (TEST val in Enum.GetValues(typeof(TEST))) { Console.WriteLine("{0} - {1}", val, (int)val); } } enum TEST { ITEM_1 = 1, ITEM_2 = 10, ITEM_3 = 21, } 
...
      
Read More

C# - 자신의 ip 주소 얻기

string myIPAddress = "";
var ipentry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());

foreach (var ip in ipentry.AddressList)
{
    if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
    {
        myIPAddress = ip.ToString();
        break;
    }
}
Read More

C# - ConcurrentQueue, ConcurrentDictionary

ConcurrentQueue

  • 자료구조 Queue의 멀티 스레드용 컨테이너
  • MSDN http://msdn.microsoft.com/ko-kr/library/dd267265.aspx

정의

var queue = new System.Collections.Concurrent.ConcurrentQueue<string>(); 

데이터 추가

queue.Enqueue("First"); 

데이터 참조

string...
      
Read More

C# - Http Request

  • 닷넷프레임워크에서는 서버로의 동시 접속수가 기본으로 최대 2로 제한되어 있다. 이 때문에 웹서비스 클라이언트에서 웹 서비스등을 호출할 때 처리량을 올리가 위해서는 멀티스레드에서 웹서비스를 호출하여도 액티브한 최대 동시 접속 수는 2로 된다.
  • 싱글 스레드로 통신 할 때와 비교하면 처리량(시간당 처리량)은 향상...
Read More

C# - http 요청 시 동시 접속 수 제한

  • 닷넷프레임워크는 서버로의 동시 접속 수가 기본으로 최대 2로 제한 되어 있다
    • 즉 클라이언트는 한 서버로 머신당 최대 동시 접속 수가 2개로 제한
  • 그래서 웹 서비스 클라이언에서 웹 서비스 등을 호출할 때 출력결과를 올리기 위해서는 멀티스레드로 웹서비스를...
Read More

C# - Dataflow

  • 닷넷프레임워크 4.5에 추가
  • NuGet으로 입수 가능 https://www.nuget.org/packages/Microsoft.Tpl.Dataflow
    • MSDN에 문서는 있지만 정식 닷넷프레임워크에는 추가 되지 않은 상태
  • MSDN: http://msdn.microsoft.com/en-us/library/hh228603.aspx
  • 일어 MSDN: http://msdn.microsoft.com/ja-jp/library/vstudio/system.threading.tasks.dataflow.aspx
    • 번역기로 돌리면 영어보다 보기 편함
  • 비동기 프로그래밍은 쉽지는 않지만 의외로 기존의 동기식...
Read More

C# - TPL

닷넷 프레임워크 4.0에서 추가된 병렬 프로그래밍 라이브러리
여기의 글을 정리

Parallel.ForEach/For

  • Parallel.ForEach
using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace Sample01_ParallelForEach { class Program { static void Main() { //-----...
      
Read More

C# - Thread

현재 스레드의 ID 얻기

System.Threading.Thread.CurrentThread.ManagedThreadId 

스레풀의 최소, 최대 스레드 개수 알기

int workThreads = 0; int iocpThreads = 0; // 최소 스레드 개수 System.Threading.ThreadPool.GetMaxThreads(out workThreads, out iocpThreads); // 최대...
      
Read More

C# - Trace

Trace 클래스

  • 코드 실행을 추적하는 데 필요한 메서드 및 속성 집합을 제공
  • 네임스페이스: System.Diagnostics
  • 어셈블리: System(system.dll)
  • Trace 클래스의 속성 및 메서드를 사용하여 릴리스 빌드를 측정 할 수 있다. 이렇게 하면 실제 설정에서 실행되는 응용 프로그램의 상태를 모니터링할 수...
Read More

C# - Unit Test Mock

왜 사용하는가?

  • Mock 라이브러리는 단위 테스트를 쉽게 하기 위해 존재합니다.
  • 예를 들어서, 한 클래스 테스트에 데이터베이스를 활용해야 하는 경우가 있다고 가정을 합시다. 이 경우 직접 데이터베이스에 정보를 넣었다 뺐다 하면 상당히 큰 부담이 됩니다.
  • 이런 부담을 주지 않고,...
Read More

마크다운 문법 - Table of contents

 Table of contents =================  * [gh-md-toc](#gh-md-toc) * [Table of contents](#table-of-contents) * [Installation](#installation) * [Usage](#usage) * [STDIN](#stdin) * [Local files](#local-files) * [Remote files](#remote-files) * [Multiple files](#multiple-files) * [Combo](#combo) * [Auto insert and update TOC](#auto-insert-and-update-toc) * [Github token](#github-token) * [Tests](#tests)...
      
Read More

C# - Unit Test

준비

  • 보통 프로그램이나 라이브러리 프로젝트에 추가 프로젝트로 유닛테스트 프레임워크를 사용하는 프로젝트를 만든다.
  • 이렇게 하면 유닛테스트에 영향을 받지 않으면서 기존처럼 개발을 할 수 있다.

  • 유닛테스트 프로젝트에 테스트 메소드를 만들면 테스트 탐색기에 리스트로...
Read More

C# - 콘솔 키보드 입력, 프로그램 종료 키 조사

키보드 입력

class Program { static void Main(string[] args) { System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(키보드입력조사), null); while (true) { ...... System.Threading.Thread.Sleep(128); } } static void 키보드입력조사(object userState) { while (true) { var command = Console.ReadLine(); if (command ==...
      
Read More

C# - ArraySegment 배열을 새로 할당하지 않고 특정 위치의 내용을 참고 하고 싶을 때

  • 배열(예를들면 네트워크에서 받은 데이터를 저장한 버퍼 byte[] buffer)의 특정 위치에서 특정 크기만큼 참고하고 싶을 때 보통 새로 배열을 만든 후 복사해야 원하는 데이터만을 참조할 수 있다.
  • 그러나 ArraySegment를 사용하면 새로 배열을 만들지 않으면서 버퍼의 특정 데이터를 참조할 수 있다.
  • ...
Read More

C# - AutoMapper

기본

  • 객체간의 복사를 자동으로 한다. 복사되는 객체에 복사한다.
  • Nuget으로 설치 가능.
public class SourceType { public int SourceId { get; set; } public string Value { get; set; } public DateTime DateUpdated...
      
Read More

C# - Debug 클래스

Debug 클래스

  • Debug 클래스는 그 이름대로 디버그 정보를 출력하는 클래스이다.
  • Debug 클래스는 System.Diagnostics 이름 공간에 있다.
  • 사용 예
using System.Diagnostics; Debug.WriteLine("Start Method"); Debug.IndentSize = 4; Debug.Indent(); Debug.Write("Debug.Write"); Debug.WriteLine("는 개행합니다."); for (int i =...
      
Read More

C# - List, Tuple, Queue, SortedList, SortedDictionary, SortedSet

List

정렬

  • https://msdn.microsoft.com/ja-jp/library/w56d4y5z(v=vs.110).aspx
  • https://msdn.microsoft.com/ja-jp/library/b0zbh7b6(v=vs.110).aspx
  • https://msdn.microsoft.com/ja-jp/library/234b841s(v=vs.110).aspx
List<UserWeekTotalNetProfitResult> TopPlyser = new List<UserWeekTotalNetProfitResult>(); TopPlyser.Sort(PlayerCompare); static int PlayerCompare(UserWeekTotalNetProfitResult user1, UserWeekTotalNetProfitResult user2) { if (user1.TotalScore == user2.TotalScore) { if (user1.Level == user2.Level) { // UID는 절대 동점이...
      
Read More

C# - XmlTextReader

XmlTextReader 로 XML 읽기

  • 예제 1
<?xml version="1.0" encoding="utf-8" ?> <Config> <log4net> <root> <!--로그 레벨 지정. 아래에서는 INFO 레벨 이상만 로그가 남는다--> <level value="INFO" /> <!--어느 로그를 사용할 것인지 지정한다. 파일 로그와 날짜별...
      
Read More

Windows에 Rust 설치하기

Rust를 Windows에서 사용할 때 C++ 컴파일러가 별도로 필요하므로 먼저 VisualStudio Build Tools를 설치한다.(Visual Studio를 설치하면 된다)

Rustup 설치

Rustup 사이트에 가서 rustup‑init.exe 링크를 클릭해서 다운로드 한다.
다운로드한 rustup-init.exe을 클리하여 설치한다.

설치가 끝난 후 아래 명령어를 실행하여 잘...

Read More

C# - 닷넷프레임워크의 타이머 관련 클래스

인터넷에 있는 글에서 가져온 것입니다.

DispatcherTimer

일반 타이머는 메인 스레드가 아닌 다른 스레드를 만들어서 처리 되지만 이것은 실행은 메인 스레드에서 처리 되어 메인 스레드와 동기화가 보장 된다.

MSDN의 설명

  • 각 Dispatcher 루프의 맨 위에서 DispatcherTimer가 다시 평가된다.
  • ...
Read More

CMake에서 GoogleTest 사용하기

출처

구성은 아래와 같이 되어 있다고 한다.

  • src 폴더 아래가 테스트 대상 코드, test 폴더 아래는 테스트 코드
    • 클래스 단위로 파일이 나누어져 있다고 가정한다.
  • mk.sh을 실행하면 build/src/ 에 응용 프로그램의 실행 파일, build/test/ 에 테스트의...
Read More

cmake에서 CMAKE_C_FLAGS에 설정한 값이 무시될 때

출처

CMakeLists.txt 안에서 컴파일 옵션을 지정하려고 했는데 설정이 무시되는 문제를 만났다.
컴파일 옵션 지정과 add_subdirectory 명령어 기술 순서가 문제였다.

문제

CMakeLists.txt

cmake_minimum_required(VERSION 3.12) project(cmake_01) set(APP_NAME example) add_subdirectory(src) # 여기가 무시된다. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")...
      
Read More

스터디 - 신입 게임 서버 프로그래머 학습 모임

신입 게임 서버 프로그래머를 목표로 하는 분을 도와 드리려고 하다가 이왕 하는 것 좀 더 많은 분들을 도와 드리면 좋을 것 같아서 모임을 만들기로 했습니다.
게임 서버 프로그래머가 되기 위해서 어떤 것을 공부해야 할지 잘 모르는 분들에게 제가 어떻게...

Read More

C# 7.3의 새로운 기능

출처

Overload 해결

버전 1.0의 C#에서 overload의 해결 규칙은 의문이 남는 디자인이었다.
어떤 상황에서 두 개 이상의 메소드가 후보가 되는데, 하나 밖에 사용할 수 없다. 우선 순위에 따라 잘못된 방법을 선택하거나 컴파일러가 일치하는 메소드를 찾지 못하거나 일치하지만...

Read More

golang - 구조체의 정확한 크기 계산하기

golang의 구조체도 c/c++과 같이 패딩이 있다.

type PacketHeader struct { N1 int32 N2 int16 N3 int64 } 

위 구조체를 unsafe.Sizeof를 하면 패딩 때문에 크기가 16이 나온다.
(sizeof가 기본 기능이 아니고 unsafe 패키지를 사용해야 한다.)

...
Read More

C++ - 안전한 문자열 조작 함수

문자열 복사

strcpy_s, strcpy, _tcscpy_s, wcscpy, wcscpy_s 

대체 추천 함수

strncpy_s(char), _tcsncpy_s(TCHAR) , wcsncpy_s(wchar_t) errno_t wcsncpy_s( wchar_t *strDest, strDest의 크기, const wchar_t *strSource, 복사할 문자 수 ); wchar_t szDest[256] =...
      
Read More

C++ - C++/CLI

클래스(class), 핸들(^)

  • C++/CLI에서 관리 클래스는 ‘ref’라는 키워드를 사용하여 만든다.
  • 비 관리 클래스
class Test { }; 
  • 관리 클래스
ref class Test { }; 

관리 클래스는...

Read More

golang - 패닉 발생 시 stack trace 출력

아래 코드는 어떤 오픈 소스에서 본 것을 아주 약간 변경한 것이다.
보기 좋게 출력하기 위해 go-spew 라는 오픈 소스 라이브러리를 사용하였다.

import ( "fmt" "runtime" "github.com/davecgh/go-spew/spew" ) func PrintPanicStack(extras ...interface{}) { if x :=...
      
Read More

ASP.NET Core 하나의 호스트에서 http와 socket 통신 같이 하기

Github

ASP.NET Core의 Kestrel을 사용하여 TCP Socket 프로그래밍을 할 수 있다.
MultiProtocolAspNetCore 프로젝트의 Program.cs 파일의 내용은 아래와 같다.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel(options => { // TCP 8007 options.ListenLocalhost(8007, builder =>...
      
Read More

Homebrew 1.9.0에서 Linux/WSL을 실험적으로 지원

출처

macOS용 패키지 관리자 “Homebrew」의 최신판인 Homebrew 1.9.0 이 1월 9일에 공개 되었다.
본 버전에서는 Linux 및 Windows10의 “Windows Subsystem for Linux (WSL)”가 베타 버전으로 지원되고 있다.

“Homebrew”는 응용 프로그램과 구성 요소 및 라이브러리 관리를 원활하게 할 수...

Read More

LinuxBrew

특징

  • macOS의 Homebrew를 리눅스로 이식한 것
  • http://linuxbrew.sh/
  • root 권한이 필요 없다.
  • home dir 에 설치 할 수 있다.
  • 배포 package manager 에 의존하지 않는다
  • 패키지 검색은 http://braumeister.org/

설치

Debian계(Ununtu)

$ sudo...
      
Read More

Span 를 사용해야 할 5가지 이유

출처

소개: Hello World

런타임이 .Net Core 2.1 이후라면 표준으로 사용할 수 있다.
그렇지 않으면 Nuget에서 System.Memory 라는 패키지를 넣자.

그리고, 언어는 C# 7.2 이상이 필요하다.

Span라는게 뭐야?

A. 우선, 배열 같은 것이라고 생각해도 좋다.

정확하게...

Read More

Span 이용에 따른 최적화

출처

힙 사용량 절감

Span 를 사용하면 빠르게 되는 이유는 간단하게 힙 사용량을 줄아가 때문이다.

  • string.Substring 등으로 새로운 문자열을 만들어 않아도 된다.
  • stackallock욿 임시 버퍼에 힙을 사용하지 않는다
  • 네이티브 메모리를 직접 읽을 수 있게함으로써 관리되는 배열에 복사하지...
Read More

WCF - Tips

클라이언트가 요청 데이터를 null로 보내는 경우 대처

클라이언트에서 public RES_LOGIN_DATA RequestLogin(REQ_LOGIN_DATA reqData)을 요청한 경우 reqData을 null로 보낼 수 있음(악의적인 이유로).
그래서 아래처럼 요청 데이터를 null 조사를 해야한다.

public class ServerService : IServerService { public...
      
Read More

WCF - TCP Sample

서버

WCF LIB

namespace WCFServerLib { public interface IClientCallback { [OperationContract(IsOneWay = true)] void SendMessageToClient(string message); } } namespace WCFServerLib { [ServiceContract(CallbackContract = typeof(IClientCallback))] public interface IServerService { [OperationContract(IsOneWay = true)] void RegistClinet(string id);...
      
Read More

WCF - AsyncAwait

예제 코드

[ServiceContract] public interface IServerService { [OperationContract] Task<RES_LOGIN> RequestUserLogin(REQ_LOGIN reqData); } // http://localhost:15501/GameService/RequestUserLogin [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "RequestUserLogin")] public async Task<RES_LOGIN> RequestUserLogin(REQ_LOGIN reqData) { try { var result...
      
Read More

WCF - RESTful API

RESTful 서비스

  • URI나 표준 동사(POST, GET, PUT, DELETE) 등 HTTP 사양을 강하게 의식한 리소스 베이스의 접근을 제공.
  • 최신의 프레임워크는 대 부분 RESTful 서비스를 만들 수 있는 기능 지원.
  • WCF의 REST 서비스에서는 POX (Plan XML 형식), AJAX 애플리케이션 등에서...
Read More

golang - 스택과 힙에 대해

  • 실행 시 동적으로 메모리를 확보하는 영역으로서 스택과 힙이 있다.
  • 스택 메모리는 함수 호출 스택을 저장하고 로컬 변수, 인수, 반환 값도 여기에 둔다.
  • 스택의 Push와 Pop은 고속이므로 객체를 스택 메모리에 저장하는 비용은 작다. 단 함수를 나오면 스택이 Pop 되어 해제되므로...
Read More

golang - OOP 프로그래밍 하기

캡슐화

  • Go에서는 구조체와 해당 필드, 함수, 메소드의 범위는 이름의 선두가 대문자, 소문자로 결정된다.
  • 대문자이면 public, 소문자라면 같은 패키지 내로 닫힌 범위로.
  • 그러므로 아래와 같이 쓰는 것으로 캡슐화를 실현할 수 있다.
//human.go package class...
      
Read More

golang - 성능 튜닝하기

대전제

  • 프로파일링을 취한 뒤 어떻게 최적화 할 것인가에 대한 이야기
    추측하지말고 계측하라
  • 알고리즘이나 데이터 구조는 최적인 것을 선택하고 있다고 가정.
    손 재주로 최적화하는 것보다 알고리즘 자체를 바꾸는 쪽이 압도적으로 좋아진다.
  • 이 기사의 각 벤치 마크는 Go...
Read More

회고 - 2018년에 본 책(IT)

당연히 올해에 본 책들도 다 회사의 도움을 받았다.
대부분의 회사들은 책 구입을 지원할테니 회사 도움을 받아서 가능하면 책을 사 보기 바란다.
2018년에는 아래의 책을 구입해서 보았다.

  • PHP 7 예비학교 예비 웹 프로그래머를 위한 과외 수업
  • 러닝 PHP...
Read More

golang - 핸들러 패턴

type SpecialFunc func(int) bool 

SpecialFunc은 int를 받고 bool을 반환하는 함수를 뜻하는 타입이 된다.
이것에 대해서 메소드를 생성하는 것이 가능핟.

func (sf SpecialFunc) SpecialMethod() { ... } 

일회용 구조체에...

Read More

golang - 구조체 구현 패턴

출처

  • 생성자 함수
  • export에 의한 접근 허가
  • 인터페이스에 의한 다형성
  • 구조체에 의한 다형성
  • 구조체에 의한 서브 클래스, responsibility
  • 구조체에 의한 이양
  • 함수에 의한 이양

생성자 함수

Go 언어는 구조체의 생성자가 없으므로 구조체를 초기화 하려면 구조체가 속하는...

Read More

AWS Lambda에서 C++ 프로그램 실행하기

이 글을 번역한 것이다.

re:Invent 2018에서 AWS Lambda의 새로운 기능, Custom Runtime이 발표 되었다.
이 기능은 Custom Runtime을 준비하는 것으로서 임의의 언어로 Lambda를 사용할 수 있다.

Custom Runtime은 직접 구현해도 괜찮고, AWS가 제공하는 것도 있다.
아래는 2018/11/30...

Read More

golang - or-done-channel로 코드 가독성을 높인다

원문

Go 병렬 패턴

  • for-select loop
  • or-channel
  • or-done-channel
  • tee-channel
  • fan-in, fan-out 등이 있다.

어떤 때 or-done-channel을 사용하나

상한 수가 정해져 있는 것 같은 처리를 할 경우

  • 데이터 소스에서 입력이 끝나 버린 경우(channel의 close에 대응)
  • ...
Read More

AppImage 패키지

Linux 배포본 중에서 AppImage 형식으로 배포되는 것이 있다.

설치 방법은 실행 권한을 부여하고, 실행만 하면 되기 때문에 매우 간단하다.

이 패키지 배포 형식이 보급되면 좀 더 Linux에서 앱 설치 및 사용이 쉬워질 것이다.


다운로드 한 파일(예를 들어 exampleName.AppImage...

Read More

golang - 주기적으로 실행하는 패턴

main에서는 아래와 같이 ctx를 만들어서 periodicLoop에 넘기고, 멈추고 싶을 때는 cancel()을 호출한다.

func main() { ... ctx, cancel := context.WithCancel(context.Background()) defer cancel() go periodicLoop(ctx, 2*time.Second) /* call cancel() to stop */ } 

golang - 고루틴과 콜스택

고루틴이 기동한 시점에서 함수의 콜스택이 분리된다.
panic은 고루틴의 콜스택을 돌아간다.
즉 defer & recover는 panic이 발생한 고루틴 내에서 사용해야 한다.

goroutine_callstack
일바 함수 호출


goroutine_callstack
고루틴을 포함한 함수...

Read More

MS 기술 문서 번역하기

MS의 기술 문서는 예전에는 MSDN을 통해서 제공했지만 몇년 전부터는 https://docs.microsoft.com 을 통해서 제공하고 있다.
(이전에 만든 문서는 아직 MSDN에 있다)

https://docs.microsoft.com 의 장점은 한글로 번역되어 있지 않는 문서를 MS가 번역 해주기만을 기다리지 않고, 커뮤니티에서 직접 번역해서 반영할 수 있다는...

Read More

golang - web

시작

기본적으로 필요한 것은 net/http 패키지에 있다.

import "net/http" 

이것만으로 기본적인 HTTP 리퀘스트와 리스폰에 관한 처리를 실시할 수 있다

http.Handle("/foo", fooHandler) http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %q",...
      
Read More

golang - new와 make의 차이

원문

정리

차이를 간략하게 설명한다.

... Read More

golang - 구조체

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

구조체 만들기

package main import ( "log" ) type Money struct { amount uint currency string } func main() { money := &Money{120, "yen"} //...
      
Read More

golang - 변환

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

출처
문자열 <-> 수치 변환
strconv 패키지를 사용한다.

문자열 → 수치변환

  • func Atoi(s string) (i int, err error)
    문자열을 10 진수 int 타입으로 변환한다....
Read More

golang - 패키지 관리와 유용한 라이브러리들

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

라이브러리 관리

go get 으로 받은 패키지 갱신

go get -u all
로 안된다면 문제의 xx.a 파일을 삭제하고 go run을 실행한다.

rm /Users/kjunichi/gocode/pkg/darwin_amd64/github.com/andrebq/gas.a...
      
Read More

golang - random

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

공식 문서
일어

0 에서 9까지(포함)의 난수 얻기

import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) for i :=...
      
Read More

golang - package의 prefix를 생략

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

// main.go package main import ( "log" ) func main() { log.Printf("hello") } 

에서 “log.”를 생략하려면

import ( . "log" )...
      
Read More

golang - exec.LookPath 커맨드 명령어가 실행 가능한지 조사

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

os/exec.LookPath를 사용하면 커맨드가 실행 가능한지 조사 할 수 있다.
$PATH 를 고려하여 찾아주지만 슬래쉬가 들어가 있으면 $PATH를 고려하지 않는다.

package main import ( "log" "os/exec"...
      
Read More

golang - string

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

[]byte를 string으로 변환 시 널 문자 제거하기

var rawUserID []byte userID := strings.Trim(string(rawUserID), "\x00") 

byte array to string

출처

강의 - IOCP를 이용한 비동기 IO 네트워크 프로그래밍

일시: 2018년 12월 6일(목) 15시~18시(3시간)
주제: IOCP를 이용한 비동기 IO 네트워크 프로그래밍
유료: 토즈에서 공간을 대여하므로 공간 비용을 내야 합니다.

Windows에서 IOCP를 사용하여 서버 프로그램을 만드는 방법을 설명합니다.
3시간이라는 시간이 길지는 않으므로 참석 전에 꼭 네이버 검색이나...

Read More

golang - sync.Map

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

sync.Map의 성능

원문

Golang 동시성은 공유 리소스에 액세스 하는 경우 충돌이 발생하지 않도록 잠금을 준비해야 한다.
예를 들어 표준 맵의 경우 goroutine safe 하지 않기 때문에, Write...

Read More

golang - 호출 측의 func 이름 알기

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

pc, _, _, _ := runtime.Caller(1) caller_name := runtime.FuncForPC(pc).Name(); 

로 할 수 있다.
DEBUG 플래그가 있으면:

import ( "log" "runtime"...
      
Read More

FASTER에 대해서

원문

  • KVS 라이브러리
    • 내장 KVS로 사용이 가능
    • 프로세스간 스토리지 공유는 상정하지 않는 듯?
    • 메모리 이상의 DB 크기를 설정 가능(메모리 + 파일 읽기 및 쓰기)
    • LiteDB와 다소 영역이 겹칠 수도(최종 목표는 다르지만)
    • 로그 데이터베이스(내장해성) 및 인-메모리 데이터베이스(성능)의 좋은...
Read More

추천 프로그램(개발 유틸리티)

  • asciinema https://asciinema.org/
    • 터미널에서의 입력 기록과 재생, web으로 공유도 가능
    • 사용법 소개 (일어) https://dev.classmethod.jp/tool/intro-asciinema/
  • cmder http://cmder.net/
  • Windows 터미널. (일어) http://qiita.com/murachi1208/items/d6e4ce7ba75f1625fe51
  • Markdown을 사용하여 가볍게 슬라이드 작성・공개할 수 있는 서비스 「slideship.com」. (일어) http://codezine.jp/article/detail/10278
  • GitHub만으로 초 고기능 슬라이드를 만들 수...
Read More

golang - nil

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

nil

타입을 가진 nil

nil은 사실 타입이 있다.

nil과 nil이 등가가 아닌 것처럼 보인다

nil이 타입 정보를 가지므로 nil==nil 이 true가 된다는 법은 없다.
true가 되기...

Read More

golang - error

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

Error

스택 상태 출력과 에러 핸들링

github.com/pkg/errors 를 사용하여 error 오브젝트를 랩핑하면 스택 트레이스를 추가할 수 있다.
error 중의 스택 트레이스는 “%+v” 포맷 지정으로 출력 할...

Read More

golang - channel 사용하기

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

채널 사용하기

받기 전용, 보내기 전용 채널 선언

받기 전용

c <-chan int 

보내기 전용

c chan<- int 
...
Read More

golang - binary encoding

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

바이너리 엔코딩

개요

  • 복수의 값과 바이트 열의 상호 교환을 한다
    • 복수의 값은 고정 길이 값으로 해석된다.
    • 고정 길이 값으로 다룰 수 있는 것
      • 수치 타입:...
Read More

golang - slice의 shuffle

Fisher–Yates shuffle 이라는 알고리즘 사용

package main import ( "fmt" "math/rand" ) func main() { n := 30 arr := generate(n) fmt.Println(arr) shuffle(arr) fmt.Println(arr) } func generate(n int) []string { arr := make([]string, n) for i...
      
Read More

golang - webFramework Echo

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

개요

  • 웹 프레임워크.
  • 경량 고속.
  • 공식 페이지 https://labstack.com/echo
  • 설치 go get github.com/labstack/echo
  • 버전 2부터는 fasthttp 모듈을 선택해서 사용 가능하다.
  • 성능 테스트 예. http://yamamaijp.hatenablog.com/entry/2016/03/10/161831

간단 예제 코드

...
Read More

golang - defer

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

defer

테스트

테스트 1: 마지막으로 쓴 것이

  • 가장 뒤에 쓴 것이 제일 처음 호출된다
  • http://play.golang.org/p/gb8tbGk4wr
package main import "fmt" func f()...
      
Read More

golang - 코드 정적 분석 툴 go vet

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

go vet

  • go의 표준 패키지에 포함된 코드 정적 분석 툴이다.
  • 공식 문서는 https://golang.org/cmd/vet/

go vet 사용 방법 ・flag 등

go vet package/path/name...
      
Read More

golang - time

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

시간 및 날짜

표준 API

표준 라이브러리 사용 예

현재 날짜

package main import ( "fmt" "time" ) func main() { now...
      
Read More

C++ - C++의 dangling 검출, 제안 문서 버전 1.0 공개

출처

C++의 저명한 개발자, ISO C++ 표준위원회의 위원장 Herb Sutter씨가 dangling(잘못된 영역에 대한 잘못된 참조)의 검출 방법을 제안하는 문서 “Lifetime Safety: Preventing Common Danglng”의 버전 1.0을 공개 했다.
C++ 코드에 숨어있는 전형적인 dangling을 컴파일 시에 발견하고 경고하는 방법을...

Read More

golang - 파일 업로드 하기

출처

Go 언어에서 HTML 페이지에서 파일 업로드 된 경우 서버 측의 임의의 장소에 업로드 된 파일을 저장하는 샘플 코드.

sever.go

 package main import (format "fmt"); import ("net/http"); import "os"; import "html/template"; import "mime/multipart"; func main () { var...
      
Read More

golang - serialization benchmarks (2018년 8월)

출처: https://github.com/alecthomas/go_serialization_benchmarks

2018-08-19 Results with Go 1.10 on a 2.5 GHz Intel Core i7 MacBook Pro (Retina, 15-inch, Mid 2015):

benchmark iter time/iter bytes/op allocs/op tt.time tt.bytes time/alloc --------- ---- --------- -------- --------- ------- -------- ----------...
      
Read More

AWS - 1대의 EC2에서도 ELB을 사용하면 좋은 점

인스턴스 교체가 편리하다

운용을 시작한 후 EC2에 대해서 수정을 해야하는 경우 인스턴스 교체가 쉬워진다.
DNS 변경을 할 필요 없이 백엔드 교체가 가능하다.

ELB의 헬스 체크로 감시

ELB의 헬스 체크를 이용하여 WEB...

Read More

.NET - WCF

기초

  • WCF 기초(한글) http://akj61300.blog.me/80182137426
  • WCF Step by Step http://blog.naver.com/saeparam/90024967440
  • WAS에서 호스팅하기 http://blog.ruaa.me/23
  • WCF로 만든 라이브러리를 다른 프로젝트에서 사용하기 http://www.codeproject.com/Articles/154870/WCF-Service-Library-A-Good-Approach-for-WCF-Servic
  • WCF와 동시성 http://ruaa.tistory.com/20 http://ruaa.tistory.com/21
  • WCF Concurrency (Single, Multiple, and Reentrant) and Throttling - 그림으로 잘 표현 http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and
  • Task-based asynchronous...
Read More

C++ - Ubuntu에 clang, libc++-, lldb 설치하기

wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - echo deb http://apt.llvm.org/stretch/ llvm-toolchain-stretch-6.0 main>> /etc/apt/sources.list echo deb-src http://apt.llvm.org/stretch/ llvm-toolchain-stretch-6.0 main >> /etc/apt/sources.list sudo apt-get update sudo apt-get install -y clang-6.0 lldb-6.0 lld-6.0 sudo apt-get install -y libc++-dev sudo...
      
Read More

SignalR 정리

SignalR 정리

http://jacking.tistory.com/1139

self 호스팅

  • (영어) http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-host
  • (일어. 클라이언트) http://okazuki.hatenablog.com/entry/20130512/1368371469
  • 위의 도움말과 다르게 Nuget으로 SignalR-selfHost을 설치한 후 따로 Microsoft.OWIN.Cors를 Nuget에서 다시 설치해야 한다.
  • 서버의 경우 SignalR 부분을 클래스 라이브러리에서 사용하는 경우 이 클래스 라이브러리를 사용하는 프로그램에서 class...
Read More

최소한으로 ASP.NET Web API 사이트 만들기

  • Visual Studio의 프로젝트 템플릿으로 만들면 불필요한 코드가 너무 많이 붙어 있음.
    • 특히 Razor은 사용하지 않고 클라이언트 부분은 JavaScript를 사용하고 싶은 경우에 좋지 않음.
  • Building Out a Clean, REST-ful WebAPI Service with a Minimal WebApi Project 라는...
Read More

Linux에서의 최대 스레드 수

Linux에서 스레드의 최대 수를 변경하고 싶다면 커널의 파라메터를 조정하면 된다.
kernel.threads-max와 kernel.pid_max, vm.max_map_count 수를 늘리면 된다.

예)

sysctl -w kernel.threads-max=600000
sysctl -w kernel.pid_max=600000
sysctl -w vm.max_map_count=600000
Read More

.NET Core - RID 카탈로그

RID는 Runtime IDentifier(런타임 식별자)의 약어이다.
RID 값은 응용 프로그램을 실행하는 대상 플랫폼을 식별하는데 사용된다.
Docs의 설명

예)

dotnet publish --runtime centos.7-x64

\bin\Debug\netcoreapp2.1\centos.7-x64\publish
에 파일이 만들어진다.

Read More

IDC Japan의 일본의 서버 OS 점유률

IDC Japan에 의하면 일본에서 서버 OS 점유률은 Windows Server 52%, Linux 24.8%. 클라우드에 의해 Linux가 높은 성장을 하고 있다고 한다.
Windows Server는 대기업의 프라이베트 클라우드나 클라우드 벤더 등의 대 규모 데이터 센터용으로 많이 판매 되고 있다고 한다.
Linux는...

Read More

golang - erning/gorun 패키지 소개

출처

Github : https://github.com/erning/gorun
용도는 매우 간단하다. “Go 소스 코드를 Python이나 Ruby 같은 실행 파일로 돌린다.”라는 느낌이다.
아이디어의 승리라는 느낌이다.

hello.go

#!/usr/bin/env gorun //go 에 gorun 패키지를 쓰면 완성. package main func main()...
      
Read More

golang - 기본 문법

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

지원 기능

  • tar, zip, zlib, gzip, bzip2
  • DES, AES, SHA1, SHA256, SHA512
  • PE, ELF, DWARF
  • BASE64, ASN.1, JSON, XML, PEM
  • HTTP, SMTP
  • 패키지 시스템
  • 빌드 시스템
  • 문서 시스템
  • ...
Read More

golang - Build

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

빌드

go build

-tags를 사용하여 Release/Debug를 바꾸기

디버깅/릴리스에서 기능을 바꾸고 싶은 경우 Build constrains를 사용하면 좋다.

Build Constrains는? Build constrains는 필요에 따라서 파일을 바꾸는 Go의 기능이다.
...

Read More

golang - Ubuntu에 최신 버전 설치하기

출처: https://medium.com/@RidhamTarpara/install-go-1-11-on-ubuntu-18-04-16-04-lts-8c098c503c5f

Step 1  Install Go Language

패키지 설치

sudo apt-get update sudo apt-get -y upgrade 

</br>

직접 설치

cd /tmp wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz sudo tar -xvf go1.11.linux-amd64.tar.gz sudo mv go /usr/local...
      
Read More

C++ - Ubuntu 18 에서 g++(gcc) 설치

출처: https://linuxconfig.org/how-to-install-g-the-c-compiler-on-ubuntu-18-04-bionic-beaver-linux

우분투 18 에서 apt-get으로 설치하는 g++ 버전은 7.3 이다.
7.3 버전은 C++17 표준을 지원한다.
C++ Standards Support in GCC

설치 명령어
$ sudo apt install g++

아래 명령어로 버전을 확인할 수 있다.
$...

Read More

golang - atomic

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

atomic

atomic 패키지는 int32, uint32, int64, uint64, uintptr의 5가지 타입 각각에 Add, CompareAndSwap, Load, Store, Swap 5 종류의 작업을 제공한다.

  new(T) make(T)
대상 임의의 타입 slice, map, channel 만
초기화 초기화 하지 않는다(0 값으로 된다) 초기화 한다
반환 값 *T T
... Read More

golang - 배열과 slice 기초

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

배열

배열 기초

  • 배열 사용
// 크기 4, int 형 배열 var a [4]int // 0번째 요소에 1 대입 a[0] = 1...
      
Read More

C++ - 라이브러리를 사용한 프로그램 고속화

tcmalloc, jemalloc, nedmalloc

  • malloc 대체에 의한 고속화.
  • 아래와 같이 실행함으로써 malloc이 대체되어 실행된다.
  • LD_PRELOAD=/usr/lib/libtcmalloc.so ./exefile

상황에 따라 다르겠지만 tcmalloc이 제일 좋은 듯.

google::dense_hash_map

  • tcmalloc에 이어 google 라이브러리가로 Hash Map을 사용할 때의 고속화이다.
  • 아래 링크에 다양한...
Read More

C++ - JSON for Modern C++ 이 버전 3.1로

원문

JSON for Modern C ++ 3.1 에서는 Universal Binary JSON(UBJSON) 기능 지원 및 JSON Merge Patch가 새롭게 추가 되었다.

UBJSON는 JSON for Modern C++에서 지원하는 여러 가지 형식의 하나로, 인코딩 크기 감소 및 디코딩 속도를 목적으로 한다.
...

Read More

GPU를 타깃으로 한 C# 이용

원문

NVIDIA GPU를 이용하는 범용 프로그램을 만드는 것은 오랫동안 NVIDIA의 CUDA 플랫폼을 사용하는 것을 의미하고 있었다.
CUDA는 몇몇 다른 프로그래밍 언어를 지원하고 있지만 고성능 코드를 기술하려면 보통 C 또는 C++ 이 필요했다.
최근까지 이 상황에 의해서 C#...

Read More

golang - 길이가 0인 slice는 nil로

출처

package main import ( "fmt" ) func testNil(p []byte) { fmt.Printf("p: %v\n", p) fmt.Printf("len(p): %d\n", len(p)) fmt.Printf("cap(p): %d\n", cap(p)) for i := range p { fmt.Println("NG: %d\n", i) } fmt.Printf("p[:]: %v\n", p[:]) fmt.Printf("append(p, 0):...
      
Read More

C++ - Visual Studio 2017 15.7이 C++17 완전 준수

원문

Microsoft는 Visual Studio 2017 15.7 일반용 제공을 발표했다.
InfoQ는 VS2017의 7번째 메이저 업데이트 개발을 쫓아왔다. 이것에 의해 IDE 전체의 많은 영역이 개선되었다.

이 업데이트는 현재 복사본을 덮어 설치할 수 있지만, 반면에 새로 설치할 때의 이점이있다.
VS2017...

Read More

C++ - redis 사용하기

게임 서버를 개발할 때 사용하는 기술이 모바일 시대 이전에 비해서 많이 다양해졌는데 거의 대부분 꼭 사용하고 있는 것이 redis 이다.
다른 언어들은 redis 사용이 간단한데 C++은 간단하지는 않아서 정리를 해 봤다.
boost를 사용하면 아주 쉽게 사용할 수 있고,...

Read More

golang - goroutine이 교체 되는 타이밍

결론

Go언어에서 goroutine은 반드시 스위치 하는 것은 아니다.
“for() {}” 같은 비지 루프를 GOMAXPROCS의 지정 수 이상 포함시키면 스위칭 되지 않는다.

경위

처리가 없는 비지 루프가 있으면 goroutine이 교환 되지 않고 처리가 멈추는 것을 알았다.
처리...

Read More

golang - thread pool과 GOMAXPROCS는 관계 없음

golang의 경우 스레드 풀을 사용하고 있으며 블러킹 하는 시스템 콜이라면 다른 스레드로 옮겨서 처리한다. 부족한 경우에는 OS가 허락하는 한도 내에서 만든다.
이 수는 GOMAXPROCS 와는 관계 없다.

Read More

.NET - Enums.NET

Enums.NET

C#의 enum을 직접 사용하는 것에 비해 Enums.NET을 사용하는 것이 더 빠름.
아래는 비교 코드.
출처

using EnumsNET; using System; using System.Diagnostics; using System.Text; public static class Program { private enum TYPE...
      
Read More

golang - 성능 조사 slice vs array

출처
테스트 환경: go version go1.7.3 windows/amd64

package go1_6 const capacity = 1024 //배열 조작 array는 slice 보다 빠르다 func array() [capacity]int { // 배열 처리 테스트 함수 var d [capacity]int for i :=...
      
Read More

golang - 성능 조사 map과 GC

테스트 환경: go version go1.7.3 windows/amd64

기본 용량

golang의 map은 용량을 확장 할 때 원 데이터의 복사와 재 해시를 하기 때문에 map을 만들 때 용량을 설정하는 것이 좋다.

package main import "testing" func test(m map[int]int)...
      
Read More

editorconfig 파일

이것으로 프로젝트 디렉토리에 .editorconfig 파일을 준비해 두면 설정이 적용된다.
(Visual Studio, Atom 등 유명 에디터에서 지원하고 있다)
즉 git의 관리 대상으로 하면 프로젝트에서 통일 시킬 수 있다.

.editorconfig 파일의 예

# EditorConfig helps developers...
      
Read More

.NET Core 2.1 preview2에서 네트워킹 개선

원문

Microsoft는 .NET Core 2.1 를 진화시키고 있다.
최신 프리뷰 버전에서는 속도의 대폭적인 향상 순수, .NET 소켓을 기반으로 네트워크 코드 재 작성, 도구의 개선이 이루어지고 있다.

dotnet 툴 시스템은 프리뷰 1에서 발표되었지만, 상당한 성장을 이루었다.
글로벌 툴...

Read More

패킷과 프레임의 차이

출처

네트워크를 통해 전송되는 데이터는 패킷이나 프레임이라는 단위로 분할되어 회선 위를 왕래한다.
같은 것을 가리키면서 패킷 이라고하거나, 프레임이라고도 하지만 엄밀하게는 다른 것이다.

인터넷 기술 표준화를 추진하는 단체 IETF(Internet Engineering Task Force)의 용어 해설 「RFC 1983 Internet Users ‘Glossary...

Read More

NDC 2018 go로 네트워크 프로그래밍 하기 강연 자료

NDC 2018. 4/24일에 강연한 ‘ go로 네트워크 프로그래밍 하기’의 강연 자료입니다.
https://github.com/jacking75/conf_ndc_2018

25분짜리 강연이고, 초급자 대상이라 초급 레벨을 넘은 사람에게는 도움 안됩니다.

go 공부로는 2년 전부터 했지만 현업에 사용하는 것은 이제 3개월 정도인고 사이에 못한 기간도 있고, 지금 회사에서...

Read More

RPS(Receive Packet Steering)와 RFS(Receive Flow Steering)

RPS(Receive Packet Steering)

RPS는 수신한 패킷을 처리하는 네트워크 부하를 다중 코어로 분배할 수 있다.
이 기술은 TCP/IP 같은 프로토콜을 패킷으로서 병행적으로 처리할 수 있다.
매핑은 해시 테이블 메커니즘에서 행해진다.
수신한 큐에는 CPU에 대한 마스크 인덱스로 특정의...

Read More

C++ http 클라이언트 요청하기 - HappyHttp

HappyHttp

Visual Studio 2017에서 빌드하면 에러가 난다. 조금 수정이 필요하다.
happyhttp.cpp 파일의 상단에 아래의 전처리를 선언한다.

#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 #define _CRT_SECURE_NO_WARNINGS 1 

개요

  • 오픈 소스 라이브러리. 링크
    • 위에 언급된...
Read More

WCF와 ASP.NET Core의 성능 비교

원문

Microsoft는 ASP.NET Core 개발에 많은 시간과 개발 능력을 지출했다.
그 결과, 새로운 기능을 가진 오픈 플랫폼이 탄생하고, 큰 개발자 커뮤니티와의 오픈된 노력에서 혜택을 받아왔다.
ASP.NET Core는 WCF(Windows Communication Foundation)와 같은 기존 기술보다 성능이 우수한 것으로 기대하고...

Read More

CTO에게 중요한 3가지 스킬

원문

읽는 것:
나는 언제나 날듯이 빠르게 읽어 왔다.
이것은 좋은 일이기도 했다. 왜냐하면 이제 읽어야 할 필요가 있기 때문이다.
기계 학습 논문과 Github의 README, API 문서, 그리고 테크니컬 튜터리얼.
야심적인 설계 문서와 고객의 요청서. Read More

네트워크&게임 서버 프로그래밍 배우기 - 7

신청

시간: 4월 15일 (일) 10시 00분 ~ 12시 00분 장소: 투썸플레이스 낙성대역점

이론 공부는 어느 정도 했기 때문에 토즈와 같은 장소를 빌리지 않고 카페에서 모여서 각자 코딩을 하면서 막히는 부분이 있으면 저에게 질문하거나, 참석한 분들과 상의하면서 네트워크 라이브러리...

Read More

닷넷 코어 2.1은 어디로 향하고 있는가?

원문

Microsoft의 Scott Hunter씨는 .NET Core 2.1에서의 동사의 계획을 발표했다.
CLI 툴이 개발자의 편리한 사용을 대폭 향상시키는 것으로 보인다.
Microsoft는 매일 50만명에 가까운 개발자의 적극적인 이용을 감시할 수 있다고 Hunter씨는 말했다.
Microsoft 통계에 따르면 2017년 9월...

Read More

LLVM 이란?

원문

LLVM 프로젝트는 모듈러와 재이용 가능한 컴파일러와 툴 체인 기술의 집합이다.
이 이름에도 불구하고 LLVM은 기존 VM과는 거의 관계가 없다.
LLVM이라는 이름은 머리 글자를 딴 것이 아니라 프로젝트 이름이다.

LLVM은 모던하고 SSA 베이스한 임의의 프로그래밍 언어의 정적...

Read More

C 언어의 현대화를 목표로 하는 C2

원문

C2는 부트 로더, 커널, 드라이버, 시스템 레벨의 도구와 같은 저 레벨 프로그램에 적합한 C 언어의 진화를 목표로 하는 새로운 프로그래밍 언어이다.

C2의 기본 이념은 C 언어의 좋은 부분을 유지하면서 40년 이상을 거친 옛 언어 부분을 버리는 것에...

Read More

Cassandra의 스토리지 엔진을 바꾸어서 고속화한 Rocksandra를 Instagram이 오픈소스로 공개

원문

Instagram은 NoSQL 데이터베이스 Cassandra에서 발생했던 Java의 가베지 컬렉션에 기인한 지연을 해소한 고성능 개량 버전 Cassandra를 오픈 소스로 공개했다고 발표했다.
https://engineering.instagram.com/open-sourcing-a-10x-reduction-in-apache-cassandra-tail-latency-d64f86b43589

스토리지 엔진인 key-value 스토어 “RocksDB”를 이용했다는 이유로 이 개량 버전 Cassandra를 “Rocksandra”라고 부르고 있다.

Instagram에서는 Cassandra를 사용하고...

Read More

C++ http 클라이언트 요청하기 WinHttp

아직은 기본 C++ 라이브러리로 http 통신을 할 수 없다.
(아마 C++ 20 에서는 가능하지 않을까 생각한다).

C++로 웹서버에 http 통신을 하려면 외부 라이브러리를 사용하던가 혹은 OS에서 제공하는 API를 사용해야 한다.
이 글에서는 Windows 플랫폼 한정으로 Win32 API를 사용하여...

Read More

구인 - 서버 프로그래머

저는 현재 가산디지털역에 있는 컴투스에서 일 하고 있습니다.
제가 소속된 회사에서 서버 프로그래머를 구인 중이라서 혹시나 하는 마음에 글 올려봅니다.

스카이랜더스

컴투스의 스카이랜더스 라는 프로젝트에서 서버 프로그래머를 구인 중입니다.
스카이랜더스는 해외 유명 IP로 애니메이션까지 있습니다.

네이버...

Read More

C++ - Windows 에서 hiredis 사용하기

MS에서 Windows용으로 redis를 포팅한 것이 있어서 여기서 hiredis 윈도우 버전을 구할 수 있다.

아래 글은 MS가 윈도우로 포팅한 redis 프로젝트를 기준으로 한 것인데 얼마전에 hiredis 부분만 따로 떨어져 나온 프로젝트가 공개 되었다(이 글은 2017년 10월 이전이다).
https://github.com/Microsoft/hiredis

입수

...
Read More

C# - 속성을 사용하여 항목 체크

DisplayName과 StringLength, Required 라는 기존 속성을 사용한다.
Attribute.GetCustomAttribut 메소드로 대상( 이 코드에서는 프로퍼티)에서 속성을 얻을 수 있다.

using System; using System.Reflection; using System.ComponentModel; using System.ComponentModel.DataAnnotations; public class Program { public static void Main() { Entity...
      
Read More

. NET Core 2.1의 개선 및 신 기능

  • 툴 도입이나 확장 기능으로 기존 .NET CLI 툴 대신 “.NET Core 글로벌 툴(Global Tools)”라고 칭하는 새로운 기능이 도입된다. Node의 글로벌 툴과 같은 것으로 구문도 이쪽을 따르고 있다. .NET의 툴에 관한 새로운 에코 시스템이 확립되는 것을 Microsoft는 기대하고 있다.
  • 런타임...
Read More

책 - 러스트 핵심 노트(e-book)

출판사: 한빛미디어
한빛미디어

2018년 2월에 읽은 책.
이전부터 미루다가 3~4일 동안에 다 보았다.
Go 언어와 비슷한 부분이 있어서 Go 언어를 알면 공부하기 좋을 듯(물론 그 반대도)
원서가 Packt 출판사인데 책...

Read More

C++ - C++03과 C++11 싱글톤 구현 차이

C++11에는 ‘C++11 - 블럭 범위를 가진 static 변수 초기화는 스레드 세이프 하다’ 라는 기능이 생겼다.
그래서 아래와 같이 쉽게 싱글톤 인스턴스 생성 가능하다.

template <typename T> inline T& Singleton<T>::getInstance() { static T inst; return inst;...
      
Read More

C#으로 대규모 모바일 게임 서버 만들기- ASP.NET Web API와 NoSQL

작년에 할 예정이었던 강의이었지만 수강자 부족으로 열리지 못했습니다.
(작년에 하반기 예정했던 강의가 수강자 부족으로 모두 열리지 못했습니다)

제가 Next에서의 계약이 끝나서 구직 중이라 지금 잠깐 시간이 날 때 강의를 하려고 합니다.
유료 강의는 진행하기 쉽지 않은 것 같아서...

Read More

C++ - EASTL

GitHub EASTL
게임 회사 EA에서 오픈 소스로 공개한 것으로 C++ STL을 게임 개발에 맞게 고친 STL 이다.
크로스플랫폼을 지원하고 Visual Studio 2017을 지원한다.
빌드는 Cmake를 사용한다.

관련 글

일어로 된 글은 네이버...

Read More

C++ - Visual C++ 에서의 std::chrono의 고해상도 시계

Visual Studio 2015 이전에는 std::chrono(high_resolution_clock을 사용해도)로 시간 측정을 하면 nano 단위로는 측정할 수 없었다.
그래서 VC에서 nano 단위로 측정하려면 이전처럼 Win32 API인 PerformanceCounter를 사용해야 했다.
그러나 Visual Studio 2015부터는 nano 단위의 측정이 가능하다.

C++ - null 객체의 멤버 함수 호출

클래스를 메모리 할당(new 생성)하지 않고 생성한 후 멤버 함수를 호출하면 어떻게 될까?
호출된 멤버 함수가 자신의 멤버 변수를 호출하지 않는다면 무사히 호출된다.
당근 멤버 변수를 호출하면 세그먼트폴이 생긴다.

아래 코드는 gcc 8.0 에서 테스트 되었다. VC에서도 문제 없이...

Read More

영어로 기술 문의를 할 때의 영작문 Tips

첫 번째: 자신이 하고 싶은 것과 문제를 간결하게 설명한다

영어는 짧고 알기 쉽게 간단하게 설명하는 것이 매우 중요하다.
나는 가급적 직접 만든 템플릿에 맞추어 자신의 하려고 하는 것과 발생한 문제를 설명하도록 한다.

 I tried to $자신의 하고...
      
Read More

C++ - SSO(Small-string optimization)

보통 std::string는 문자열을 확보할 때 동적으로 메모리를 확보하지만 작은 크기의 문자열의 경우는 동적 할당은 성능적으로 낭비이므로 동적 할당을 하지 않는 최적화가 구현 되어 있고 이것을 SSO 라고 한다.

아래처럼 std::string 안에 문자열을 저장할 수 있는 버퍼를 가진다.

C++ - 포인터 변수에서 const 위치에 따른 차이

변수에 const를 사용하는 이유와 사용 방법은 아주 쉽다.
그런데 포인터 타입 변수에 const를 붙였을 때 포인터의 앞이나 뒤 어디에 붙여야 할지 헷갈릴 때가 있다.

포인터에 const를 붙이는 경우 아래에 따라서 차이가 발생한다.

*앞에 const를 붙인 경우는 포인터를 가리키는 곳이...

Read More

.NET - Buffer.MemoryCopy 함수

메모리 복사 속도를 올리기 위해서는 Array.Copy 보다는 Buffer.BlockCopy를 사용하는 것이 좋다.

단 Buffer.BlockCopy는 작은 크기(10~30 바이트 이하)의 복사에서는 Array.Copy 보다 뛰어나다고 할 수 없다. 원래 Buffer.BlockCopy에는 낭비가 있다.
Buffer.BlockCopy는 네이티브의 C++ 코드를 호출하고, 타입 체크와 범용적인 타입에 의한 처리가...

Read More

C++ - C++17시대 Herb Sutter씨에게 듣는다

원문

Herb Suttrer씨는 소프트웨어 개발의 제일인자로 “Exceptional C++” 이나 “C++Coding Standars”라는 책을 집필했다.
ISO C++ 표준 위원회 위원장을 15년간 맡음과 더불어 Microsoft에서는 소프트웨어 아키텍트로서 C++/CLI, C++/CX, C++ AMP 같은 기술을 위한 언어 확장 설계를 담당하고 있다.


...

Read More

네트워크&게임 서버 프로그래밍 강의를 계획 하고 있습니다.

제게는 큰 기술은 아니지만 다른 사람에게는 필요한 기술은 가능하면 공유하려고 합니다.
그래서 2018년 1월부터 네트워크와 게임서버 프로그래밍(프로그래밍 언어는 C++, C#) 중심으로 강의를 할 예정입니다.

교육 기관에서 하는 것이 아니고 개인적으로 하는 것이라서 강의비를 받지 않지만, 강의할 공간에 대한 대여...

Read More

.NET Core 설치 및 프로젝트 생성하기

원문

설치

  • Windwos
 - 다운로드 후 설치 - https://www.microsoft.com/net/core#windowscmd 
  • Ubuntu
 - 패키지 추가 - curl https://packages.microsoft.com/keys/microsoft.asc| gpg-dearmor>microsoft.gpg - sudo mv microsoft.gpg/etc/apt/trusted.gpg.d/microsoft.gpg - 설치는 Ubuntu 버전마다 좀 다르다 - Ubuntu 17.04 -...
      
Read More

Visual Studio - editorconfig 사용하기

VS 2017에서는 프로젝트 마다 혹은 프로젝트의 특정 폴더마다 에디터 설정을 바꾸기 원한다면 .editorconfig 파일을 사용한다.
VS 2015에서는 이와 동일한 기능을 사용하려면 플러그인을 사용해야 했으나 2017에서는 기본 기능으로 들어왔다.

.editorconfig

root = true [*] indent_style =...
      
Read More

신입 게임 프로그래머가 될 분들께 간단한 조언

아는 내용일 수도 있지만 혹시나 하는 마음에 간단하게 글 적습니다.

큰 회사들은 공채로 신입을 많이 뽑고, 공채는 10월초부터 시작합니다.

요즘은 큰 회사(상장된, 혹은 규모가 큰)들은 신입을 공채로 많이 뽑고 있습니다.
대부분의 회사가 공채는 10월초부터 시작합니다.
그러니 10월...

Read More

Visual Studio - Productivity Power Tools

이전 버전의 Productivity Power Tools는 복수의 확장 기능을 모은 패키지로 제공되고 있었지만 VS 2017용 Productivity Power Tools에서는 아래의 기능이 개별 확장 기능으로서 VS Marketplace에서 배포된다(VS 2017의 [도구]-[확장 및 업데이트..] 에서도 입수 가능).

Read More

C++ - Visual Studio 2017 에서 최신 C++ 기능 사용하기

Visual Studio 2017에서는 C++17 및 C++20에 들어갈 기능이 일부 구현 되어 있다.
그러나 이 기능들은 그냥은 사용할 수 없고 컴파일러 옵션에서 사용함을 선언해야 한다.
(C++17 기능 중 VS 업데이트를 통해서 구현된 기능은 보통 바로 사용할 수 없다.)

VC...

Read More

C++- Poco 1.8 Net 라이브러리 빌드 하기

본인이 집필한 poco 네트워크 프로그래밍 책의 예제가 poco 1.8 에서는 빌드 에러가 난다.
이유는 스태틱 라이브러리 사용, win32 lib 미 추가 문제이다.
아래 그림처러 하면 문제 없이 빌드가 된다.

Read More

Win32 API - 대기 체인 분석

Windows7 에서 새로 생긴 기능이다.
이것을 사용하면 프로그램을 종료 시켰는데는 프로세스는 죽지 않고 살아 있는 경우 어디서 문제가 되었는지 어느 정도 알아낼 수 있다.


이 프로그램은 내가 집에서 만든 서버 애플리케이션으로 X 버튼을...

Read More

Visual Studio - Nuget 패키징 포맷이 packages.config 뿐만이 아닌 PackageReference도 사용 가능

Nuget으로 라이브러리를 설치하면 기존까지는 packages.config 파일이 만들어지면 이 파일에 관련 정보가 들어가 있었다.
그러나 VS2017부터는 .NetCore에서 사용 하는 방식처럼 PackageReference도 사용할 수 있다.
PackageReference를 사용하면 프로젝트 설정 파일에 nuget 정보가 들어간다.
PackageReference를 사용하려면 아래 화면의 옵션 화면에서...

Read More

APNS/GCM의 리퀘스트 제한

번역 글로 2016/10월 기준. 이후 바뀔 수 있음

APNS와 GCM에서 Push 통지를 할 때의 제한 정리

APNS

iOS8 미만의 경우 페이 로드 데이터의 상한은 256 바이트까지.
iOS8의 경우 페이 로드 데이터의 상한은 2K 바이트까지.
iOS9 이후의...

Read More

Visual Studio - 커스텀 템플릿 만들기

게임 개발에 사용할 프로젝트가 틀이 잡혔다면 다음에도 이와 비슷하게 프로젝트를 만들어서 사용하기 위해 커스텀 템플릿을 만들어서 사용하면 좋다.
먼저 커스텀 프로젝트를 만들 프로젝트는 기본적인 것들만 있도록 정리한다.
이후 아래와 같이 템플릿을 만든다.


...

Read More

Visual Studio - 디버깅 모드에서 역어셈블리 코드 보기

VC++ 에서는 디버깅 모드에서도 역어셈블리 코드를 볼 수 있다.


메뉴에서 “Debug” -> “Windows” -> “Disassembly”를 선택한다.
역어셈블리 코드 창이 나타난다.
이 화면을 보면 코드 바이트는 표시되지 않고 있다.
코드 바이트를 보고 싶다면 화면 왼쪽...

Read More

내 PC에서 실행 중인 VirtualBox에 내트워크 연결하기

내 PC에서 실행 중인 VirtualBox에 설치된 애플리케이션에 네트워크로 접속하려면 VirtualBox의 ‘포트 포워딩’을 설정하면 된다.

아래는 VirtualBox에 설치된 MongoDB를 내 PC에서 접속하기 위해 포트 포워딩 설정을 하였다.

VirtualBox에 설치된 우분투의 네트워크 설정은 아래와 같다.

아래의 화면에서...

Read More

Visual Studio - 확장 툴 Code alignment

Test.dsdsds = 10; Test.ds = 10; 

이런 코드가 있을 때 아래처럼 = 중심으로 코드를 정렬하고 싶을 때가 있을 것이다.

Test.dsdsds = 10; Test.ds = 10; 


이런 것을 Visual...

Read More

Visual Studio - 일치한 부분 강조 표시(Match highlighting)

VS2017 에서는 C++은 미 지원.

결과를 빨리 얻기 위해서 카멜 케이스 매칭(한 묶음으로 한 합성어의 각 대문자를 입력하여 보완) 등을 할 경우 아이템이 어느 부분에서 일치하는지 판단하기 힘들다.
C#, VB, JavaScript, TypeScript의 IntelliSense에서는 아래 그림과 같이 일치한 곳을 굵은...

Read More

C++ - 분산환경에서의 uniqueId 생성 오픈 소스 snowflake-ModernCpp

snowflake ?

Twitter에서 만든 오픈 소스 라이브러리로 주 목적은 분산 서버에서 일련 번호를 생성하는 것이다.
자세한 설명은 본인의 문서(https://www.slideshare.net/jacking/twitter-snowflake)를 보기 바란다.

snowflake-ModernCpp

  • https://github.com/jacking75/snowflake-ModernCpp
    • 사용법도 여기에 있다.
  • C++11을 지원하는 snowflake.
  • C++11을 지원하는 모든 컴파일러에서...
Read More

Visual Studio - 모든 프로젝트의 디렉토리 설정

VS2008까지는 ‘도구’ – ‘옵션’ 메뉴를 통해서 VC++ 디렉토리를 설정하였다.
이렇게 설정한 정보는 모든 VC++ 프로젝트에 적용된다.

그러나 VS2010에서는 각 프로젝트 별로 VC++ 디렉토리를 설정한다.


각 프로젝트 마다 독립적으로 설정을 할 수 있어서 편한...

Read More

HyperV-Switch를 사용하여 Windows 10의 HyperV on-off 하기

Windows 10에서 VirtualBox에 linux를 설치할 때 64비트를 설치 못하는 문제가 있다.
이것은 Windows에서 HyperV를 사용하고 있기 때문이다.

해결을 위해서는 HyperV를 종료하면 된다.

HyperV를 때때로 사용해야 하는 경우는 HyperV-Switch 라는 툴을 사용하면 cmd 사용보다 쉽게 on-off 할 수 있다....

Read More

Visual Studio - 리팩토링 제안

VS2017에서는 리팩토링 기능이 강화되었다.
내가 만든 코드를 더 좋은 코드로 바꿀 수 있도록 새로운 코드를 제안해준다.
이 기능은 C#과 Visual Basic 에서 사용할 수 있다.




...

Read More

Visual Studio - C++ 솔루션 로딩과 빌드 고속화

MSDN에 있는 글 의 번역 입니다.

C++ 솔루션 로딩 고속화

C++ 프로젝트를 향해서 “신속한 프로젝트 로딩”이라는 시험적인 기능이 도입되었다.
C++ 프로젝트를 처음 열었을 때의 로딩 시간을 단축하는 것으로 2번째 이후에는 더 짧아진다.
이 시험 기능을 사용하는...

Read More

.NET Core 2.0 Ubuntu에 설치하기

공식 설치 문서

우분투에 아래와 같은 명령어를 터미널에 순서대로 입력하면 간단하게 설치가 끝난다.

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg 
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg 

Ubuntu(16.10, 17.04) 라면

Read More

Visual Studio - 인텔리센스 필터링(IntelliSense filtering)

IntelliSense는 카테고리 마다 일련의 값을 압축함으로써 새로운 API를 재 빠르게 참조할 수 있는 필터링 기능이다.
이 기능을 사용하면 필요한 변수를 많은 타입 속에서 찾아낼 필요가 없어진다.
아래 스크린 샷은 필터를 사용하여 C++ 코드 파일의 IntelliSense의 결과에 변수와 상수만...

Read More

Visual Studio - Structure Guidelines

Visual Studio 2017 에서 추가된 기능이다.
한국어로는 ‘구조 안내선 표시’ 라고 한다.

이 기능은 코드 블록 구조에 맞추어 에디터에 세로 선이 표시된다.
이 세로 선에 커서를 맞추면 그 블록의 모든 부모 블록을 나타내는 힌트가 팝업 표시된다.
...

Read More

C++ - Boost의 object_pool 사용은 비 추천

boost 라이브러리에는 메모리 풀 라이브러리로 object_pool 이라는 것이 있다.
사용법은 아래와 같다.

boost::object_pool<int> pool; int* p = pool.construct(10); pool.destroy(p); 

사용하면 안 되는 이유는 사용한 오브젝트를 해제할 때 너무 느리기 때문이다.
검증 코드

느린 이유는 오브젝트의...

Read More

Visual Studio - 업데이트 등에서 에러가 발생했을 때의 대처 방법

  1. Open an elevated command prompt.
  2. Run:
    %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\resources\app\layout\InstallCleanup.exe -i 

위 조작으로 설치를 위해 다운로드된 것이나 사용한 것이 지워지고, 리셋 된다.

%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\resources\app\layout\InstallCleanup.exe 를 찾을 수 없는 경우는 https://www.visualstudio.com/downloads /...

Read More

MongoDB - 데이터 추출 툴 mongoexport 와 mongodump 간단 비교

MongoDB의 데이터를 출력하는 툴로 mongoexport 와 mongodump가 있다.
둘 다 mongodb-tools 패키지에 포함되는 도구이다.

mongoexport는 CSV 또는 JSON 텍스트 데이터, mongodump는 BSON 형식의 이진 데이터로 출력한다.

사용법도 데이터 포맷 지정 외에는 거의 똑같이 이용할 수 있다.

atomic 함수 대체로 같은 의미의 표현
... Read More

MySQL의 3가지 lock - Record lock, Gap lock, Next-key lock

  • Record lock(레코드 락): 단일 인덱스 레코드의 락.
  • Gap lock(갭 락): 인덱스 레코드 사이의 갭의 락, 선두 인덱스 레코드의 앞이나 말미 인덱스 레코드의 뒤의 갭의 락
  • Next-key lock(넥스트 키 락):레코드 락과 이 레코드 직전의 갭 락의 조합

InnoDB의 default...

Read More

C++- Poco 라이브러리를 VC++에서 static 라이브러리로 사용할 때

Poco 라이브러리를 VC++ 에서 static 라이브러리로 사용할 때 lib 파일을 찾을 수 없다는 링크 에러를 만나는 경우는 아래의 선언을 추가하면 된다.

#define POCO_STATIC 


Poco 라이브러리는 default로는 동적라이브러리를 사용하는 것으로 설정 되어 있다. 그래서 위의 선언으로 정적...

Read More

Visual Studio - C++ 라이브러리 프로젝트 시작하기

Visual Studio 2017의 세번째 업데이트 버전이 얼마전에 나왔다.
Visual Studio 15.3 이다(이후 또 이버전의 패치 버전이 나와서 지금은 15.3.1 이다).


기존의 Visual Studio 버전 정책과 다르게 메이저 업그레이드도 아닌데 UI 변경이 꽤 많다. 새 프로젝트를 시작하면 어디에...

Read More

ISO 드래프트 종류

새로운 C++ 표준이 만들어 질 때 공개되는 문서에 ISO 드래프트 라는 단어가 나오는데 이 ISO 드래프트 종류에 대한 간단한 설명이다.


발행까지 6 단계이다.

  1. Proposal stage 만들고 있는 규격이 정말 필요한지 확인.

  2. Preparatory stage working...

Read More

Boost보다 쉽고 빠른 POCO C++ 라이브러리로 채팅 서버 개발하기(9/16)

9월 16일 토요일에 ‘POCO 네트워크 프로그래밍’을 주제로 강연을 합니다.
실습도 같이 하기 때문에 오전 10시~18시까지 합니다.
POCO를 사용한 네트워크 프로그래밍을 빨리 배우기 원하는 분들에게 좋을 것 같습니다.
그리고 네트워크 프로그래밍을 잘 모르는 분들을 위해 관련 기초 지식도...

Read More

golang - 버전 1.9

“Go 1.9”의 가장 중요한 변경은 타입 앨리어스의 도입으로

type T1=T2 

라고 선언함으로써 타입 T2의 앨리어스 이름을 T1으로 정의할 수 있다.

또 math/bit 패키지는 CPU의 특수 명령에 대응한 무부호 정수비트 계수/조작 기능을 갖추고 있으며 sync 패키지에는...

Read More

동영상 전달 서비스에 UDP를 사용하는 Akamai

일본의 Akamai 기사 중 동영상 전달 서비스에 UDP를 사용하는 이야기가 흥미로워서 일부 번역했다.
원문


방송국은 지상파, 위성, 케이블 텔레비전을 통해서 프로그램을 전달하고 있다. Akamai로는 이러한 서비스의 IP 전개를 한층 촉진하고 싶다.

첫째 라이브 배급 워크 플로의...

Read More

Visual Studio - Go To All (모두로 이동)

검색 하기 원하는 단어를 선택 후 [Ctrl]+[T] 키를 누르면 아래와 같은 창에 검색 결과가 나온다.

그리고 만약 검색 단어가 타입으로 사용된 것만 찾고 싶다면 ‘t 검색어’를 입력한다.
또 멤버 변수로 사용된 것만 검색하고 싶다면 ‘m...

Read More

Visual Studio - Find All References (모든 참조 검색)

코드 중의 변수나 함수가 다른 코드에서 어떻게 참조 되고 있는지 알고 싶을 때 ‘모든 참조 검색’을 사용한다.
단축키는 Shift + F12 이다.
VS 2017에서는 이전과 다르게 검색 결과에 마우스를 올리면 해당 코드를 미리 볼 수 있다.
...

Read More

Visual Studio - 성능 관리

VS 2017의 부팅 속도 및 솔루션 로드, 코드 편집에 악 영향을 미치는 확장 기능의 감시 기능의 도입되었다. (본인도 이전에 확장 기능 설치 후 VS의 시작이 엄청 느려져서 확장 기능을 하나씩 삭제하면서 문제 있은 확장 기능을 찾았다)
성능이 낮은 확장에...

Read More

C#으로 대규모 모바일 게임 서버 만들기- ASP.NET Web API와 NoSQL(8월31일)

8월 31일에 2년만에 이전에 했던 ‘C#으로 대규모 모바일 게임 서버 만들기’라는 제목으로 세미나를 진행합니다.
시간의 흐름에 따라서 당연하지만 이전에 했던 것과 내용에 변경이 있습니다.


이전에는 WCF를 게임 서버 프레임워크로 사용했다면 이번에는 ASP.NET Web API를 사용합니다. 이유는 현재...

Read More

Visual Studio - 더 편리해진 시작 페이지

시작 페이지는 VS를 시작하면 첫 화면에 나오는 페이지다.
이 페이지의 유용성 향상은 VS 2015에서 시작되었고 VS 2017에서 더 향상 되었다.

  • 최근에 사용한 항목이 페이지 왼쪽에 크게 표시
  • 페이지 중앙부에서는 VSTS와 GitHub 등의 저장소에서 코드 가져 오기
  • 폴더 열기
  • ...
Read More

C#으로 대규모 모바일 게임 서버 만들기- ASP.NET Web API와 NoSQL(8월31일)

8월 31일에 2년만에 이전에 했던 ‘C#으로 대규모 모바일 게임 서버 만들기’라는 제목으로 세미나를 진행합니다.
시간의 흐름에 따라서 당연하지만 이전에 했던 것과 내용에 변경이 있습니다.


이전에는 WCF를 게임 서버 프레임워크로 사용했다면 이번에는 ASP.NET Web API를 사용합니다. 이유는 현재...

Read More

Visual Studio - 구성 요소 추가하기

VS를 설치 후 추가로 구성 요소를 설치하고 싶다면 아래와 같이 하면 된다.
(추가 구성 요소 예로는 MFC 라이브러리 추가 하기 등)

VS 실행 후 새 프로젝트 선택 후 아래 창에서 왼쪽 아래의 ‘Visual Studio 설치 관리자 열기’를 선택한다.

Read More

Visual Studio - 폴더(디렉토리) 선택으로 열기

VS 2017 이전에는 VS 솔루션 파일이 소스 파일은 VS에서 사용할 수 없었다.
VS에서 사용하려면 새로 솔루션을 만든 후 수동으로 소스 파일들을 추가해야 했다.
그러나 VS 2017의 새로운 기능으로 폴더 선택 열기만으로 솔루션 파일이 없는 소스 파일들을 사용할 수...

Read More

Visual Studio - VS2017의 성능 강화

  • 프로젝트의 읽기를 경량화 하고, 로딩 시간을 단축: 100 종류등 많은 프로젝트가 포함 되어 있는 솔루션에서는 모든 파일이나 프로젝트가 동시에 사용되지 않는다.
    VS 2017에서는 모든 프로젝트를 읽기 전까지 기다리지 않고 편집과 디버깅을 시작할 수 있다.

  • ...
Read More

스터디 인원 모집 - Go로 게임 서버 만들기

프로그래밍 언어 Go로 게임 서버를 만들기 위해 필요한 기술과 경험을 서로 공유하기 위해 스터디를 시작하려고 합니다.


스터디를 만드는 큰 이유는 이 모임을 통해서 꾸준히 Go를 공부하고, 다른 사람들과 Go 관련 지식이나 경험을 공유하기 위해서 입니다.
아마 Go로...

Read More

C/C++에 죽음을

역자주: 제목이 자극적이라서 보았는데 핵심은 Rust 사용하자는 글이다. 그런데 아직은 Rust의 개발 환경은 덜 만들어져서 시기 상조라고 생각된다.

프로그래밍 언어 C는 역겹다. 물론 훌륭함 것도 있다. 우리가 사는 세계의 대부분은 C 위에 만들어졌다. 그리고 대부분의 컴퓨터 프로그래밍의 기초를 이루고 있다....

Read More

Actor 프레임워크의 메시지 전달에서 사용하는 용어

  • at-most-once delivery는 메커니즘에 건네지는 각 메시지에 대해 해당 메시지가 0 번 또는 1 번 전달됨을 의미합니다. 보다 일반적인 용어로는 메시지가 손실 될 수 있음을 의미합니다.


  • at-least-once(최소한 한 번 전달) 메커니즘에 전달 된 각 메시지에 대해...
Read More

C# - proto.actor 프레임워크

proto.actor

Akka와 비슷한 프레임워크이다.
Akka.NET의 개발자가 만든 것이다.
Akka.NET 이 있는데 이것을 만든 이유는 Akka.NET은 처음부터 모든 것을 다 만들어서 점차 유지 보수가 힘들었다고 한다.
proto.actor는 이미 검증 받은 라이브러리를 조합하여 만들었다.
그리고 멀티플랫폼을 지원하고...

Read More

Windows에서 IOCP를 사용하는 경우의 설계에 관한 문제

MSDN에서…

개요

이 자료는 Windows NT IOCP(I/O Completion Port)의 입출력 모델에 대해서 이미 이해하고 관련된 API에 대한 자세한 지식이 있는 유저를 대상으로 하고 있다. IOCP에 대해서는 IOCP의 구현과, IOCP를 사용하기 위해서 필요한 API에 대해서 기재된 『 Advanced Windows 개정...

Read More

그랑 블루 판타지를 뒷받침하는 인프라 기술

일본의 데브서밋 컨퍼런스에서

그랑 블루 판타지에 대해서

특징

  • 스마트 폰 RPG
  • 브라우저 게임
  • 협력 플레이, 멀티 플레이

시스템 규모

  • 등록 유저 수 1400만명
  • 월간 300억 PV
  • 100만 query/sec
  • 8만 req/sec
  • 트래픽 12Gbps(CDN 제외)

시스템 구성

...
Read More

warning C4996 'inet_addr'

몇 년전에 만들어진 Winsock API를 사용한 코드를 최신 VC++로 빌드하면 아래와 같은 경고를 볼 수 있다.

 warning C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings 

inet_addr 라는 API는 비 추천이 되었으므로...

Read More

lock-free 알고리즘 - 순차일관성

순차일관성(sequential consitency)이란?

순차일관성은 컴퓨터 시스템에 관한 메모리 일관성 모델의 하나이며 정의를 Wikipedia에서 인용하면 “어떤 실행 결과도 모든 프로세서가 어떤 순서로 차례적으로 실행한 결과와 동일하며, 또한 각각의 프로세서의 처리 순서가 프로그램에서 한 대로다”라고 한다.

병렬 처리 중인 실행 결과가 항상...

Read More

rasberry pi zero + C#으로 카메라 조작

nuget의 아래 모듈을 받는다. https://www.nuget.org/packages/Unosquare.Raspberry.IO/
GPIO 에 더해서 카메라 모듈도 조작할 수 있다.
이것을 사용하여

public static async Task SendImage() { var cam = new Unosquare.RaspberryIO.Camera.CameraController(); var result = await cam.CaptureImageJpegAsync(640, 480,System.Threading.CancellationToken.None); } 
...
Read More

Win32API - CRITICAL_SECTION의 OwningThread

Windows Vista부터 CRITICAL_SECTION의 내부 구조가 바뀌었다고 한다.
이 중 눈여겨 볼 것은 CRITICAL_SECTION의 멤버 변수 중 OwningThread 인데 이 변수에는 CRITICAL_SECTION을 소유중인 스레드의 ThreadID가 설정된다.
그래서 멀티스레드에서 CRITICAL_SECTION를 사용할 때 특정 스레드가 락을 획득하지 못하고 대기중이라면 어떤...

Read More

.NET Core용 이미지 라이브러리

.NET Core를 사용하여 애플리케이션을 개발할 때 개발자가 알아야 할 결점 하나는 영상 기반 API가 없는 것이다.
보급된 API 중의 하나로 훌륭한 System.Drawing 이 있지만 이것은 Windows 기반의 GDI+ 인터페이스에 의존하고 있다.
.NET Core에서는 이용할 수 없다.
다행스럽게도...

Read More

C++ - 메모리 영역

메모리 영역에 대해서

5 종류의 메모리 영역

C++ 에서는 다른 특성을 갖는 5 종류의 메모리 영역이 존재한다.
(※ 단 c++ 규격에는 스택이나 힙은 명시 하지 않고 Free-Store는 명시 하고 있다)

Const Data

컴파일 시 값을 알...

Read More

해외 게임 업계의 아웃소싱

여러 인기 작품에 관련있지만 아무도 모르는 게임 회사

Blizzard Entertainment의 인기 작품 “오버 워치”를 조사하고 있을 때 어떤 게임 업체 사이트에 맞닥뜨렸다.
회사 이름은 SuperGenius로 사이트의 톱 페이지에는 “오버 워치”의 친숙한 아트 워크가 큼직하게 게재되고 있었다. 그뿐인가 2K...

Read More

프로그래밍 어록 - egoless programming 10계명

Gerald Marvin Weinberg의 “The Psychology of Computer Programming” 에서

  1. 자신이 잘못을 저지른다는 것을 이해하고 받아들이기.
  2. 자신과 자신의 코드는 별개이다.
  3. 아무리 “가라데”를 배워도 언제든지 당신보다 더 잘 아는 사람이 있다.
  4. 상의 없이 코드를 다시 쓰지 않는다.
  5. 자신보다 무지한 사람에 대해서도...
Read More

프로그래밍 어록 - 안드레 테일러의 10년간의 소프트웨어 개발에서 배운 10가지

http://www.globalnerdy.com/2007/03/22/andres-taylor-top-ten-things-ten-years-of-professional-software-development-has-taught-me/ 에서

  1. 객체 지향은 생각보다 어렵다.
  2. 소프트웨어 개발에서 어려운 부분은 커뮤니케이션이다.
  3. NO라고 말 할 수 있게 된 것 같다.
  4. 모두가 똑같이 중요하다면 중요한 것이 없다는 것이다.
  5. 하나의 문제만 너무 생각하지 않는다.
    [악마는 디테일에 숨어 있지만 지불 방법은...
Read More

프로그래밍 어록 - 소프트웨어 프로젝트 실패의 10가지 징후

http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=a76eab63-70f0-48b4-8b75-66c366a651cd

  1. 첫번째 버전에서 너무 많은 것을 하려고 한다.
  2. 확립되지 않은 기술에 크게 의존하고 있다.
  3. 조직의 주 수입원이거나 강력한 후원자를 가지고 있는 사내의 다른 프로젝트와 경합하고 있다.
  4. 팀 인원 부족.
  5. 복잡한 문제에는 복잡한 해법이 필요, 복잡함 자체가 프로젝트의 목표이다.
  6. Read More

프로그래밍 어록 - Microsoft에서(또는 다른 곳에서) 일하기 위한 10가지 힌트

Omar Shahine

  1. 프로세스는 사고의 대용이 되지 않는다.
  2. 사무실에만 있지 않는다.
  3. 자신의 제품을 사용한다(당신의 고객이 사용하도록).
  4. 뭔가가 고장 나고 있으면 불평만 하지 않고 고친다. 행동은 불평보다 웅변이다.
  5. 어려운 문제를 쉽게 보이도록 한다. 간단한 문제를 어렵게 보이도록 하지 않는다.
  6. 일이나 상대에...
Read More

ebook - POCO를 이용한 C++ 네트워크 프로그래밍

구입

며칠 전에 나왔습니다^^
NHN Next 에서 일하게 되면서 시간 여유가 생겨서 짧은 분량이지만 책을 집필 할 수 있었습니다.

책 내용은 제목 그대로 POCO 라이브러리 중 Net 부분의 라이브러리를 사용하여 네트워크 프로그래밍을 하는 방법을...

Read More

NLog - 기존의 설정을 사용하면서 파일 패스만 동적으로 변경하기

NLog.config 설정을 사용하지만 파일 패스만 바꾸고 싶다. 파일 경로는 프로세스나 인스턴스 마다 변경하기를 바란다.

프로세스나 인스턴스가 항상 일정하다면 NLog.config에 필요한 수만큼의 설정을 추가하면 되지만, 파일 패스만 다르므로 비슷한 설정 코드를 늘리는 것은 귀찮다.

그래서 로거마다 Variables 속성 값을 독립적으로 설정하는...

Read More

NLog - 동적으로 로그 파일 이름 설정하기

NLog는 동적으로 파일 이름을 설정할 수 있는 기능이 있다.

아래의 방법은 커스텀 플레이스 홀더를 설정하고, 그 플레이스 홀더에 임의의 텍스트를 설정하는 방법으로 파일 이름을 변경한다.

NLog.config

<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="LogFile"...
      
Read More

2017년 04월 ‘온라인 서버 제작자 모임’ 정기 세미나

한국 MS의 멜팅팟 프로그램 지원을 받고 ‘온라인 서버 제작자 모임’에서 4월 정기 모임을 합니다.
날짜: 4월 26일(수요일) 19시 30분 ~ 21시 30분 장소: 토즈 강남점

내용

  1. Visual Studio 2017 Linux development with C++ (최흥배)
    https://channel9.msdn.com/events/Connect/2016/119
    ...
Read More

C# - 꼬리 재귀 최적화

// 꼬리 재귀가 아니다 long SumNormal(long n) { if (n <= 0) return 0; return SumNormal(n - 1) + n; } // 꼬리 재귀 long SumTailCall(long n) { return SumTailCallAcc(n, 0); } long SumTailCallAcc(long n, long...
      
Read More

Visual Studio - 툴 박스에 코드 보관하기

VS의 툴박스에 특정 코드를 보관하고, 이 코드를 선택하여 코딩 시 삽입할 수 있다.

툴박스에 보관하기 바라는 코드를 마우스로 선택 후 툴박스로 드래그 한다.

위에서 드래그한 코드가 툴박스에 들어가 있는 것을 볼 수 있다. 추가한 코드를 마우스...

Read More

C99의 sizeof와 가변길이 배열

C99 에서는 배열의 사이즈 지정에 변수를 사용할 수 있다.

void test1( int n ) { int fixed_array[10]; int varlen_array[n]; printf( "sizeof(fixed_array)==%ld\n", sizeof(fixed_array) ); printf( "sizeof(varlen_array)==%ld\n", sizeof(varlen_array) ); } 

test1(10); 로 인수를 10으로 해서 호출하면 아래와...

Read More

C++14 - shared_(timed_)mutex가 지원하는 Reader 스레드 수

C++14 표준 라이브러리의 shared_timed_mutex 클래스는 적어도 10000 스레드 이상의 Reader 스레드에서의 공유 lock(shared lock) 동시 획득을 지원한다.
또 동시 획득 가능한 공유 lock 수 상한을 넘은 경우도 공유 lock을 획득 할 수 있을 때까지 Reader 스레드가 대기하는 것을 보증한다.

...
Read More

C++14 - recursive_(timed_)mutex의 재귀 lock 상한 수

C++11 표준 라이브러리의 recursive_mutex, recursive_timed_mutex 클래스는 동일 스레드에서의 재귀 lock 획득 횟수의 상한은 미정의로(unspecified) 되어 있다.
단 상한 회수를 넘는 try_lock 조작은 실패하고, lock 조작은 예외를 던지는 것을 보증 한다.




출처: http://d.hatena.ne.jp/yohhoy/20170214/p1

Read More

네이티브 모듈의 ABI 호환성 문제 대처

2017년 3월 13일(미국)에 열렸던 ‘Node.js VM Summit’ 에서 Node의 네이티브 모듈의 ABI 호환성 문제에 대해서 회의를 하였다.
회의 동영상

Node의 네이티브 모듈 문제

Node의 네이티브 모듈은 C/C++로 만들었고 V8과 NAN API(Application Programming Interface)에 직접 의존하고 있다.
...

Read More

std::codecvt_utf8로 wstring을 utf-8 문자열로 변환 하기

std::wstring을 utf-8 문자열로 변환 하는 방법은 아래와 같다.

std::wstring wStr = L"우하하"; std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> utf8Conv; auto utf8Str = utf8Conv.to_bytes(wStr.c_str()); 

wchar_t의 크기는 windows, linux 각각 크기가 다르다. 그래서 만약 크기를 특정 길이로 고정하고 싶다면 wchar_t 대신...

Read More

Microsoft MVP가 되었습니다

Microsoft MVP
몇 년 전에 2009,2010,2011년 3년 연속으로 Visual C++ 부분 MVP로 선정된 적이 있습니다.
그러나 2012년부터는 MVP 신청을 하지 않았습니다.
이유는 당시에는 MVP 자격 조건이 MS 제품만을 다루고, MS가 운영하는 포럼에 답글 다는...

Read More

C++11 - alignof

개요

alignof()는 지정한 타입이 메모리의 어느 위치에 배치될지를(배치) 얻는 연산자이다.
sizeof()와는 다르고 alignof()는 변수에는 사용할 수 없다.
예를 들면 타입 int가 4바이트 경계 위치로 배치되는 시스템이라면 alignof(int)은 4를 반환한다.

문법

alignof(타입)은 지정한 타입의 배치 크기를 반환한다....

Read More

C++11 - alignas

개요

alignas()은 컴파일러에 대한 변수를 메모리 상의 특정 위치에 배치(배열) 하도록 요구하는 키워드이다.
예를 들면 4바이트 경계 위치에 배치할 경우 변수는 4의 배수 주소로 배치되고, 8바이트 경계 위치에 배치할 경우 변수는 8의 배수 주소로 배치된다.

문법

alignas()는...

Read More

Visual Studio - 자주 사용하는 단축키

문자 검색/치환

  • Ctrl+F: 문자 검색
  • Ctrl+H:문자의 치환

직사각형 선택

Alt 키를 누른 상태에서 마우스로 원하는 직사각형 모양의 범위를 만든다.

자동 인덴트(indent)

  • Ctrl+K, Ctrl+D: 파일 전체의 인덴트 조정
  • Ctrl+K, Ctrl+F: 선택 범위의 인덴트 조정
...
Read More

C++11 - type_info와 type_index

C++에서는 RTTI(Run Time Type Infomation/Identification)라고 불리는 기능이 있다.
( 타 언어의 리플렉션과 좀 비슷한데 기능은 훨씬 떨어짐 ^^;)
std::type_info는 타입 정보를 표현하는 클래스이다. type_info 객체는 typeid 식에서 얻을 수 있다.
typeid 식은 오퍼랜드 식 혹은 type-id를 취한다. Read More

VS2017 에 포함되어 있는 C++ 컴파일러 버전 매크로

VS2017 에 포함되어 있는 C++ 컴파일러의 버전 매크로는

 
_MSC_VER 1910  

참고로 VS 2015는 1900.

MSVC 런타임은 2015와 바이너리 호환. 그리고 VS 2017를 설치할 때 옵션 선택에 의해 VS 2015.3의 MSVC도 별도 추가할 수 있다.

출처: https://blogs.msdn.microsoft.com/vcblog/2017/03/07/binary-compatibility-and-pain-free-upgrade-why-moving-to-visual-studio-2017-is-almost-too-easy/

Read More

Boost.Asio 공부하기

나는 2007년부터 Boost.Asio를 온라인 게임 서버 개발에 처음 사용하였다(업무에 사용하는 것을 말한다.그전에 공부는 했었다)

당시 주위의 게임 개발자를 통해서 생각외로 사용하는 곳이 꽤 있었다.
이 후 한국 및 해외의 유명 회사들도 C++ 네트워크 프로그래밍에 사용하고 있다고 들었다.

한국의 온라인...

Read More

Google Cloud Platform의 15개 서비스를 영구 무료 한도를 제공

구글은 2017년 3월 10일 Google Cloud Next 17의 3일째 기조 강연에서 15개 서비스의 영구 무료 쿼터를 발표.

영구 무료 한도 대상 서비스 이름과 월 제한은 다음과 같다(제품에 따라서는 아래 외에도 제한이 있다).

  • Google Cloud Engine(미국 지역의 f1-micro 1 인스턴스...
Read More

Visual Studio 제거하기

MS가 만든 Visual Studio Uninstaller를 사용하여 제거하는 것이 좋다.

설치 파일은 아래 링크에서 얻을 수 있다. 다운로드

사용법

다운로드 -> 압축 해제 -> Setup.ForcedUninstall.exe 실행 -> 질문에 Y 답변

콘솔 창 혹은 파워셀을 관리자 권한으로 실행해서 Setup.ForcedUninstall.exe 실행하는...

Read More

Node 7.6 에서 async/await를 기본으로 지원

Node.js 7.6 이 출시 되었다.
async/await 지원이 기본적으로 유효하게 되어 낮은 메모리 디바이스에서의 성능이 개선되었다.

Node 7.6의 async/await 지원은 Chromium의 JavaScript 엔진인 V8를 버전 5.5로 업데이트한 데 따른 것이다. 이것이 의미하는 것은 async/await는 이제 실험적인 것이 아니라는 점이다.

async/await의...

Read More
Read More

초보 프로그래머를 위한 9가지 조언

  1. 항상 하나의 일에 집중한다 나는 새로운 것을 배울 때는 언제든지 할 일을 분해하고 임한다. 프로그래밍을 할 때 작업에 따라서는 복잡하게 구조화하여 생각하는 것이 있을 것이다. 1개의 태스크를 소화하기 위해서도 다양한 방법이 있고 선택하는 것만으로 방황한다. 다만 무엇을 해도...

Read More

Amazon S3의 대규모 장애는 인위적 실수가 원인

미국 Amazon.com의 클라우드 사업 Amazon Web Services(AWS)는 “Amazon Simple Storage Service(S3)”서비스에서 발생한 대규모 장애에 관한 조사 보고를 현지 시간 2017년 3월 2일 공개하면서 인위적 실수가 원인이었음을 밝혔다.

S3의 장애는 미국 버지니아 주 북부의 “US-EAST-1” 지역에서 태평양 표준 시간 2월 28일...

Read More

C++11 - 예외 지정

C ++에서는 함수에 예외 지정이라는 것을 작성할 수 있다.
이것은 C++98에서 부터 있는 기능으로 throw (T1, T2, …)라는 문법으로 함수가 밖으로 던지는 예외를 지정하는 기능이다.

// C++98/03 void f() throw( int, double ); 
...
Read More

C++11 - noexcept

noexcept 키워드 목적.

1) throw 키워드에 의한 예외 사양 대체. 함수가 어떤 예외를 던질 가능성이 있는지를 열거하는 것이 아니라 예외를 던질 가능성이 있는지 없는지만 지정한다. 예외를 던질 가능성이 있는 함수에는 noexcept(false)을 지정하고, 예외를 던질 가능성이 없는 함수에는 noexcept(true) 또는...

Read More

함수의 적절한 길이는? 마틴 파울러씨는 길이보다 의도와 구현 분리 그리고 좋은 함수 이름이 중요하다고 지적

FunctionLength

내 경력에서 함수의 길이는 어느 정도여야지? 라는 논란을 자주 들었다. 이것은 더 중요한 물음으로 대체할 수 있다. 그것은 어느 정도 길이의 코드가 되면 그것을 함수로 삼아야 하느냐는 것이다.

몇 가지 가이드 라인에서는 한 화면에 잡히지 않는다면, 이 밖에도...

Read More

여성 게이머가 가장 좋아하는 장르

해외 컨설팅 기업 Quantic Foundry는 27만명 이상의 세계 게이머를 대상으로 조사 하여 “여성 게이머들이 좋아하는 게임 장르” 라는 리서치 결과를 보고했다.

Quantic Foundry의 보고에 따르면 27만명 이상의 샘플 중 여성 게이머는 18.5% 정도이고, 조사 대상자에게 최대 9개의 “좋아하는 게임 타이틀/프랜차이즈”...

Read More

Google에서 3DCG를 위한 압축 라이브러리 「Draco」를 GitHub에 공개

https://github.com/google/draco

Chrome Media팀이 개발한 압축 라이브러리로 ZIP 형식보다 효율적으로 데이터 압축을 실행할 수 있는 오픈 소스이다.
압축한 Mesh 파일의 크기 100MB 일 때 ZIP으로는 30MB 이지만, Draco에서는 10MB 이하가 되어 훨씬 압축 효과가 있다고 한다.

Draco는 메시와 점군 데이터를...

Read More

(일본)임베디드 개발자가에 인기 있는 언어와 OS

일본의 ‘fabcross for 엔지니어’ 라는 곳에서 제조업에서 임베디드 관련 프로그래밍을 하는 엔지니어를 대상으로 한 설문 조사에서

업무에서 자주 사용하는 언어는

  • C (36 %)
  • C++ (32.5 %),
  • Java (23.5 %),
  • Visual Basic (21 %),
  • Visual C++ (21 %),
  • 어셈블러...
Read More

C++11 - std::get_time

개요

» get_time(tmb, fmt) 식을 사용하여 현재 입력 스트림에서 전달 받은 로컬 시간 값을 변환 형식 문자열에 맞추어 tm 오브젝트로 변환한다.



문법

template< class CharT > /*unspecified*/ get_time( std::tm* tmb,...
      
Read More

C++11 - std::put_time

개요

날짜 서식을 출력한다.



문법

template <class CharT> unspecified put_time(const struct tm* tmb, const CharT* fmt); 
  • tmb 은 유효한 tm 타입 오브젝트를 가리키는 포인터
  • fmt 는 유효한 문자...
Read More

GitHub Awards

개요

Github 계정을 갖고 있다면 “GitHub Awards” 라는 Web 서비스를 사용할 수 있다.
자신의 레포지토리에 붙여진 “스타”의 수를 기준으로 전 세계 GitHub 사용자 중 자신의 “랭킹 순위”를 알 수 있다.

  • http://github-awards.com/
  • 프로그래밍 언어 구분
  • 지역 구분
...
Read More

C++11 - 문자열 리터럴과 wide 문자열 리터럴 결합

C99 호환을 위해서 만들어진 기능으로 문자열 리터럴과 wide 문자열 리터럴을 결합하면 wide 문자열로 결합한다. 문자열 리터럴인란 멀티바이트 문자열을 뜻하고, wide 문자열 리터럴은 유니코드 문자열을 뜻한다.
C++11 이전에는 문자열 리터럴과 wide 문자열 리터럴 결합에 대해서 미정의 동작이었다.


Read More

.NET Core 2.0 봄에 출시 예정

원문

2017년 봄에 출시 예정.
.NET Core 플랫폼에 있어서 큰 변화가 있는 버전이다. 버전 2이 되는 것으로 .NET Core 능력을 크게 확대하기 때문이다.
.NET Standard의 버전이 2.0 이된다.
.NET Standard 2.0 에서는 2배 가까운...

Read More

C++11 - 최근접 짝수 반올림 std::nearbyint

개요

실수를 정수로 변환할 때 ceil()로 소수점 올림하거나, floor()로 소수점 버림을 한다.

nearbyint는 정수로 변환할 실수의 가장 가까운 짝수로 올림 혹은 버림을 한다. 이러한 방식을 “bankers’rounding” 이라고 부른다



문법

cmath 헤더파일을 포함해야 한다.

Read More

C++11 - 생성자 상속(inheriting constructors)

개요

부모 클래스에서 정의한 생성자들을 자식 클래스에서 그대로 사용할 수 있는 편의 기능이다.



문법

자식 클래스에서 using 키워드를 사용하여 부모 클래스 이름과 부모 클래스의 생성자 이름을 :: 구분으로 호출한다.
자식 클래스는 복수의 부모...

Read More

C++11 - 인라인 이름 공간(inline namespace)

개요

이름 공간 내에 있는 기능을 투과해서 접근할 수 있는 기능이다. 즉 이름 공간(my_namespace) 안에 또 다른 이름 공간(features)을 inline로 선언하고 있으면 features에 정의된 기능을 my_namespace를 통해서 접근 할 수 있다.

#include <iostream> namespace my_namespace...
      
Read More

C++11 - long long 타입

개요

C99 호환을 위해 long long 정수 타입이 추가 되었다.

long long 과 unsigned long long 타입은 64비트 이상의 값을 표현할 수 있는 것을 보증한다.
long long 타입의 최대 값 매크로는 LLONG_MAX 이다.
long long을 뜻하는 정수...

Read More

C++11 - _Pragma 전처리 연산자

개요

C99 에서 도입된 전처리 연산자 이다.

_Pragma 연산자는 매크로에서 처리 계 정의 기능을 사용하기위한 기능이다.
처리 계 정의 기능을 사용하기 위해 기존에는 #pragma 지시자를 사용하여 왔지만 이 기능은 매크로 내에서는 사용할 수 없다. #pragma 지시자를 매크로 내에서...

Read More

클래스 멤버 함수 포인터 배열 사용하기

함수 포인터 관련 검색을 하면 C 버전이 많이 나오고, 배열 타입을 사용하는 경우는 별로 없어서 공유한다.
(사실 최신 C++에서는 std::function을 사용하면 되기 때문에 이걸 사용하지 않아도 된다)

선언

bool(TEST::*m_pFunc[4])(const int, bool); 

멤버 함수 연결

...
Read More

이 블로그의 rss 피드 주소

나처럼 Feedly 서비스를 사용 중이라면 피드 추가에 이 블로그 url을 입력하면 된다.

이 블로그 주소로 rss 리더에 등록 되지 않는다면 아래의 주소를 사용해 보기 바란다. https://jacking75.github.io/feed.xml

Read More
  time_t→ tm 구조체 tm 구조체 → time_t
현지 시각 localtime