원문
attribute(속성) 라는 것은
attribute(속성)는 컴파일러에 추가 정보를 전달하는 구문으로 [[attributes]]
이라고 쓴다.
최적화나 경고 추가나 제어 등을 할 수 있다.
C++11
noreturn 속성
함수
함수가 결코 반환 하지 않는 것을 표시하는 속성
Read More
chan의 공간이 다 찰 때까지 보내기를 하면 빈 공간이 생길 때까지 블럭킹 상태가 된다.
블럭킹 상태에 빠지지 않게 하는 방법 중의 하나의 select
와 조합해서 사용한다.
ch1 chan []byte ch1 = make(chan []byte, config.MaxChannelSize)...
Read More
의사 코드
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
Read More
출처
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
출처
병행 프로그래밍으로 문제가 될 수 있는 캐시 무효화 문제를 제어 할 수 있다.
false sharing 제어
struct keep_apart { atomic<int> cat; atomic<int> dog; };
이런 구조가 있으면 cat와 dog가 같은 캐시...
Read More
std::sample()
이 <algorithm>
에 추가 되었다.
#include <iostream> #include <string> #include <iterator> #include <random> #include <algorithm> int main() { const std::string input = "abcdef"; // input에서 3개 요소를 무작위로 추출한다 // 기본 난수 생성기를...
Read More
Read More
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
value category
C++의 식은 타입과는 별도로 value category라는 것을 갖는다.
value category는 prvalue, xvalue, lvalue 중 하나이고, prvalue와 xvalue를 모아서 우측 값 이라고 부른다.
주의해야 할 것으로
- 같은 형을 가진 식에서도 다른 value category를 가질 있다.
- 같은 객체를...
Read More
일반적으로 C++로 작성된 코드가 C 보다 컴파일 시간이 느린 이유
그 이유는 주로 아래의 5개이다.
- C++ 문법의 복잡성, 소스 코드의 parse(어휘 분석, 구문 분석, 의미 분석)에 시간을 요하고 있다
- 템플릿의 실체화에 시간이 걸린다
- 복잡한 최적화를 실시 할 필요가...
Read More
출처
함수 템플릿의 포인터를 함수에 넘기는 경우
template<typename T, typename Func> T calc(T a, T b, Func func){ return func(a, b); } template<typename T> T plus(T a, T b){ return a + b; } assert(calc(1,...
Read More
Read More
template<class T> struct foo{ T operator()( ... ){ ... }; }; std::array< double, ... > a = ; bar( foo< >() ); // < > 안에 a의 요소 타입 double을 넣고 싶다..
Read More
예제 코드
#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++에 존재하는 여러 종류의 함수를 wrap 하여 똑같이 다룬다
C++에 있는 함수의 종류
클래스의 멤버 함수
람다식 사용법
[캡처](인수)->반환 값 타입 { 함수의 내용 }(실행 시 인수);
...
Read More
#include <iostream> // std::cout, std::endl; #include <algorithm> // std::unique #include <vector> // std::vector void printVec(std::vector<int> &vec) { std::cout << ""; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " ";...
Read More
지정한 함수를 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
Read More
C#의 확장 메소드와 같이 기존 클래스에 대해서 멤버 함수의 확장을 operator 오버로드를 구사하여 시뮬레이트 하는 idiom 이다.
예컨대 std::vector에 print 라는 모든 요소를 출력하는 확장 구성원을 만들려고 한다면
const struct Listed_print{ using result_type=void; template<class Range>...
Read More
원문
스마트 포인터는 객체의 라이프 타임이 다한 때에 자동적으로 확보된 리소스를 삭제한다. 생성자와 소멸자, 연산자 오버 라이드를 잘 구현하였다.
이것을 응용하면 클래스의 멤버 함수가 실행될 때 특정 처리를 실행하는 스마트 포인터를 구현할 수 있다.
Read More
원문
아래는 STL의 컨테이너에서 특정 요소를 삭제하는 코드.
std::vector<int> a; /*a에 요소를 추가하는 코드는 생략*/ std::remove(a.begin(), a.end(), 100);
이것으로 사라진 것이 아니다. 실은 remove 함수는 특정 요소를 컨테이너의 뒤에 만든 후 선두의 특정 요소에...
Read More
원문
생성자에서 멤버 초기화 때 예외가 발생하는 경우가 있더. try와 catch로 예외를 잡을 수는 있지만 때로는 아래와 같이 어디에서 예외가 발생했는지 알 수 없을 때가 있다.
class A { public: A(int n) { /* 초기화에...
Read More
원문
정적 오브젝트는 주의하지 않으면 초기화 되기 전에 사용하는 실수를 할 수 있다. 아래는 그 예이다.
#include <iostream> class StaticObject { public: StaticObject() { std::cout << "StaticObject::StaticObject()" << std::endl; } void callMethod() { std::cout <<...
Read More
클래스 B가 A에서 파생되어 B 타입 객체에 대한 포인터는 A 타입의 포인터에 대입할 수 있지만 이들 타입의 복합 타입은 바탕이 된 타입의 관계를 공유하지 않는다.
예를 들면 template_class는 template_class에 대입할 수는 없다.
class A{}; struct B:A{};...
Read More
Read More
계승된 클래스는 복사 금지라고 명쾌하게 표현할 수 있는 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
규격에 의해 delete식에 의해 불완전 타입을 delete에 넘기는 것이 허가되고 있다.
그러나 trival 생성자가 아닌지, 독자적인 delete 연산자를 정의하고 있는 경우 미 정의 동작이 된다.
미정의 동작은 좋지 않으므로 delete 대상 형식이 불완전 타입인 경우 컴파일러에 에러를...
Read More
CRTP는 Curiously Recurring Template Pattern의 약어로 자주 직역되고 있지만 기묘하게 재기한 템플릿 패턴이라고 부른다.
template<class Inher> struct X{}; struct Derived:X<Derived>{}; // CRTP
기본 클래스에서 파생 클래스를 볼 수 있으므로 이것을 이용한 다양한 패턴도 다시 생겨나고...
Read More
C++17에서 type_traits 헤더에 추가된 std::void_t를 이용한 idiom 이다.
std::void_t의 구현은 아래처럼 되어 있다.
template<class...> using void_t=void;
뭘 넣어도 void를 반환하므로 넢고 싶은 것을 마음대로 넣을 수 있다.
아래의 예는 클래스가 반복자를 가지고 있는가를...
Read More
Pimpl(Pointer to IMPLementation)은 구현을 숨기거나, 헤더를 바꾸지 않는 것으로 컴파일을 속도를 고속화 할 때 사용한다.
C++20의 module에서는 필요 없어지겠지만 아직은 필요하다
hoge.h
class Hoge { int foo_; void baz(); public: int bar(); Hoge() = default; ~Hoge()...
Read More
Read More
밀리 세컨드를 세컨드 단위로 변경할 때 딱 맞아 떨어지지 않는 경우 반올림 혹은 내림을 할 수 있는 floor(내림), ceil(올림), round(가장 근접한 수로)가 생겼다.
#include <iostream> #include <chrono> using namespace std::chrono; int main() { milliseconds ms(2500); seconds...
Read More
2개의 연관 컨테이너를 접합(splice)하는 기능이 생겼다.
map, set, unordered_map, unordered_set와 이 들의 multi 버전 모두도 포함된다.
특정 요소 추출
extract() 멤버 함수를 사용하면 컨테이너의 특정 요소를 추출 할 수 있다.
node_type extract (const_iterator position);...
Read More
아래 방식은 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
Read More
Read More
Read More
Read More
Read More
Read More
Read More
예제 코드
#include <iostream> #include <string> #include <tuple> struct Person { int id; double bodyHeight; std::string name; Person(int id, double bodyHeight, const std::string& name) : id(id), bodyHeight(bodyHeight), name(name) {} }; int main() { std::tuple<int, double, std::string>...
Read More
- 로케일은 C 로케일(POSIX 로케일) 고정
- 함수 내에서 동적 메모리 할당이 없다. 즉 호출 측에서 만들어줘야 한다
- 포맷은 파라메터로 주고, 자동적으로 포맷을 해석할 수 없다
- 사용할 수 있는 포맷은 최소한
Read More
C++17에서는 아래처럼 사용할 수 있다.
std::shared_ptr<double[1024]> p1 {new double[1024]};
std::shared_ptr<double[]> p2 {new double[n]};
double* p = p1[0];
Read More
Read More
Read More
Read More
C++14부터 사용 가능.
아래의 파일을 포함해야 한다
함수 원형
template< class T, class U = T > T exchange( T& obj, U&& new_value );
예제 코드
...
Read More
std::fill
// n 차원 배열의 초기화. 제 2인수의 형의 사이즈마다 초기화 해 둔다 template<typename A, size_t N, typename T> void Fill(A (&array)[N], const T &val){ std::fill( (T*)array, (T*)(array+N), val ); }
예제 코드
Read More
comcast
Simulating shitty network connections so you can build better systems.
- https://github.com/tylertreat/comcast
- 네트워크 상태 시뮬레이션 툴이다.
- 패킷 드럅율이나 레이턴시를 임의로 조정할 수 있어서 네트워크 상태가 좋지 않은 경우에 애플리케이션이 문제 없이 잘 동작하는지 테스트 할 때 사용하면 좋다.
...
Read More
Read More
Read More
Read More
Read More
Vcpkg 2020.04 Update and Product Roadmap 글에서 roadmap 관련된 부분만을 일부 번역하였다.
새로운 라이브러리의 지원을 계속하고, Linux와 macOS에서의 지원을 개선한다.
사용자들의 피드백이나 제안을 기초로 제품에 새로운 기능을 추가한다.
아래는 우리들이 작업할 예정의 최우선 순위가 높은 백로그 이다.
...
Read More
Read More
원문
매크로
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
libxlsxwriter
C용의 간단한 xlsx 쓰기 라이브러리.
Github 저장소에서 공개하고 있다.
풍부한 예제가 들어가 있다.
설치
설치 하지 않아도 이용 가능.
이 경우는 패스 설정이 필요.
$ git clone https://github.com/jmcnamara/libxlsxwriter.git $ cd...
Read More
Permalink to the playground
fn main() {
let xs: [u8; 5] = [1, 2, 3, 4, 5];
test(&xs[5..]);
}
fn test(data: &[u8]) {
println!("size: {}", data.len());
}
출력
size: 0
Read More
1
아래 코드는 페이스북의 한국 러스트 사용자 그룹에서 내가 올린 질문에 김지현님이 올린 답글이다 Permalink to the playground
use std::collections::HashMap; pub struct MyType { /* ... */ } impl MyType { fn new() ->...
Read More
Read More
Read More
출처
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
Read More
Read More
네트워크 프로그래밍을 할 때 소켓을 통해서 받은 데이터의 바이너리 값을 보고 싶을 경우가 있다.
바로 출력은 안되고 아래의 스택오버플로우의 글을 사용하면 좋다.
static public string ToReadableByteArray(byte[] bytes) { return string.Join(", ", bytes); }
...
Read More
Read More
Read More
출처
사전 준비
메모리 상에서 어떻게 되어 있는지 표현 되어 있는가를 확인하기 위해 아래 함수를 이용한다.
인수 x
를 *const T
로 캐스트하고, 생 포인터에서 std::mem::size_of_val(x)
로 얻은 바이트 길이를 읽는다.
Read More
std::reference_wrapper
를 사용하면 컨테이너에 오브젝트의 참조를 보관할 수 있다.
std::reference_wrapper
는 <functional>
헤더를 사용한다.
#include <iostream> #include <string> #include <vector> #include <functional> struct Base { void print() const { std::cout <<...
Read More
Read More
Read More
Read More
몇 년전에 번역했던 글이다.
번역이 좀 거친편이다^^;
Read More
출처
선점형 스케줄링 모델과 협조적 스케줄링 모델은 여러 작업이 프로세서나 하드웨어 스레드 같은 컴퓨팅 리소스를 공유하도록 해주는 두 가지 일반적인 방법이다.
선점형 스케줄링 및 협조적 스케줄링
선점형 스케줄링은 지정된 시간 동안 모든 작업이 번갈아 가면서 컴퓨팅 리소스에 대한...
Read More
Read More
출처
명령 검색 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
Read More
Read More
출처
콘솔 앱을 만든다
Program.cs using System; using System.Threading; namespace SingleFileConsole { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("Hello World!"); Thread.Sleep(1000); } } } }
애플리케이션을 발행한다
...
Read More
출처
Rust의 표준 매크로는 하나의 파일에 모두 정리하고 있다.
문서에서 볼 수 있다.
https://doc.rust-lang.org/src/std/macros.rs.html
일부 매크로는 컴파일러 매직이기도 하고, 보고있는 것만으로도 꽤 재미있다.
Rust의 편리한 매크로 목록
compile_error!
panic!
은 런타임 오류를 내지만,이것은...
Read More
출처
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#에서 비동기 메소드에서는 lock을 쓸 수 없다. 이 글은 그래도 lock을 사용 하고 싶을 때를 위한 것이다.
lock이 필요한 경우를 예를 들면 아래처럼 더블 체크 락킹을 하고 싶을 때이다.
// /이것이 여러 스레드에서 비동기에게...
Read More
출처
서버 사이드와 프론트 사이드가 다른 서버로 구현된 경우, Host된 포트 번호가 다르기 때문에 CORS 설정을 할 필요가 있다.
환경
- Angular 8.2.14
- .NET Core 3.1
- 서버 사이드: https://localhost:44342
- 프론트 사이드:http://localhost:4200
※ localhost:4200는 Angular의 기본 포트 번호
...
Read More
Read More
출처
STL 컨테이너를 public 상속한 경우
유의해야 할 것은 STL 컨테이너의 소멸자는 virtual 이 아니다
예를 들면 부모 클래스의 포인터로 업 캐스트하고 delete 하면 자식 클래스의 소멸자가 호출되지 않는다.
코드 예
Read More
C++ 17은 atomic 클래스 템플릿에 is_always_lock_free라는 정적 멤버 상수가 정의 되어 있는데 C++11의 is_lock_free()
의 static 멤버 버전이라고 생각하면 좋다.
is_lock_free()
를 사용하기 위해서는 atomic 클래스 오브젝트를 만들어야 하지만 is_always_lock_free
는 만들지 않는다.
Read More
출처
.NET Core도구?
.NET core 글로벌 툴
.NET Core 2.1에서 NuGet에 게재된 콘솔 응용 프로그램을 CLI 상에서 인스톨/실행/업데이트/언인스톨 하는 구조가 생겼다.
이들의 애플리케이션을 총칭해서 “.NET Core 툴” 이라고 부른다.
npm에서 말하는 npm install -g tool...
Read More
Read More
Read More
Read More
출처
C# 7의 클래스 라이브러리를 null 허용 참조 타입을 사용하는 C# 8로 업그레이드 하는 사례에 관한 글이다.
여기에 사용된 Tortuga Anchor 프로젝트는 MVVM 형식의 기본 클래스와 리플렉션 코드, 다양한 유틸리티 함수를 모아 놓은 것이다. 적당히 작고, 관용적...
Read More
출처
Git의 브랜치 조작
git branch
모든 로컬 브랜치를 나열한다.
git branch -a
원격 및 로컬 브랜치를 나열한다.
git checkout -b branch_name
로컬 브랜치를 생성하고 전환한다.
git...
Read More
출처
자신의 commit을 pull request 할 때까지
git pull #로컬 저장소를 최신으로 git checkout -b <branchName> #브랜치 작성과 이동 #파일 편진 git status #편집한 파일을 확인 git diff #차분을 확인 git add . #"."은...
Read More
Read More
몇 년전에 번역했던 글로 RAII idiom에 대한 글이다.
번역이 좀 거친편이다^^;
Read More
출처
기능은 아주 단순하다. 그만큼 분석하기 쉽다. 웹서버의 대략적인 동작을 엿볼 수 있다.
간단하게 아래의 기능만 구현했다.
환경
아래 환경에서 개발, 테스트 했다.
Read More
Read More
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++에서 GC(가베지컬렉션)를 사용할 수 있게 해주는 라이브러리 이다.
1. 소스 코드 다운로드
다운로드 페이지에서 다운로드.
특별한 이유가 없으면 ‘recent stable release” 버전을 다운로드.
압축을 푼다.
2. 솔루션 파일 만들기
솔루션을 만들기 위해 CMake를...
Read More
Read More
출처
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
Read More
C# 네트워크 프로그래밍 학습을 위한 자료를 모아 놓은 저장소이다.
jacking75/com2usStudy_CSharpNetworkProgramming
master 버전에는 주로 예제 코드만 있고 설명은 Docs 디렉토리에 있다.
회사 동료 분이 브랜치로 따서 만든 곳에는 잘 설명한 글이 있으므로 참고하기 바란다.
괜찮은 내용이라면 스타...
Read More
출처
타이머를 다시 이용하지 않는 경우
상태 변수를 추가하지 않고 취소를 알 수 있다.
#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
Read More
Read More
출처
split
지정한 구분 문자로 문자열을 분할 할 때는 boost::algorithm::split 함수를 사용한다.
얻어진 결과는 지정한 컨테이너에서 받는다.
구분 문자인지 판정하는 것은 boost::is_any_of를 사용한다.
아래 예는 문자열을 + 로 구분하고 있다.
split(plus_split_s, s,...
Read More
Read More
출처
다배수 길이 정수를 다룰 때는 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
출처
정수의 범위를 사용하려면 boost::irange 함수를 사용한다.
범위로서 [0, n)
을 지정하고, 제 3인수로 단계 폭을 2로 지정하고 있다. (제 3 인수를 생략하면 단계 폭은 1이 된다)
이것에 대해 range-based for 문을 작성할 수 있으며, Python의...
Read More
WSL 관련 글을 정리한 것과 볼만한 글 링크를 정리한 것이다.
jacking75/wsl_docs
괜찮은 내용이라면 스타 부탁한다~ ^^ (스타가 많으면 꾸준히 업데이트 할 확률이 높아진다)
Read More
Golang으로 게임서버(TCP)를 만들 수 있는 기술을 배우기 위해 단계 별로 실습을 할 수 있도록 만든 저장소이다.
golang_socketGameServer_codelab
회사에서 위 저장소 코드를 중심으로 실습을 하였다.
저장소가 도움이 되었다면 스타 부탁한다~ ^^
참고 코드
오픈 소스 TCP...
Read More
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 사용 방법 정리.
문자열 저장 및 읽기
출처
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 사용 방법 정리.
리스트 선두에 추가
출처
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");
리스트 꼬리에 추가
출처
Read More
Read More
StackExchange.Redis 사용 방법 정리.
접속 실패
출처
try { cache = Connection.GetDatabase(); } catch (RedisConnectionException e) { WriteException("접속 실패", e); return; }
key가 없는 경우
출처
Read More
몇 년전에 웹에 공개된 글을 보고 정리했던 글이다.
Read More
Read More
Read More
Read More
- 자세한 설명은 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
- 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는?
주로 Bjarne Stroustrup과 Herb Sutter에 의한 C++ Core Guidelines는 더 나은 C++ 코드를 작성하는데 필요한 지침이 정비 되어 있다. 이 지침의 많은 항목은 분석 도구를 통해 확인 가능하도록 쓰여져 있다.
C++...
Read More
Read More
출처
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
몇 년전에 웹에 공개된 글을 보고 정리했던 글이다.
Read More
출처
struct 모듈
struct 모듈은 pack, unpack, calcsize 등의 기능이 있으며, 이것들을 사용하여 정수, 부동 소수점 숫자, 문자열(을 encode 메소드에서 인코딩 한 것)을 bytes 객체로 변환하거나 반대로 bytes 객체에서 이것을 빼낸다.
bytes 객체로 변환하려면 “서식 지정 문자”라는 문자를...
Read More
참고
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 호출을 동시에 호출하지 않도록 하는 방법
출처
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
출처
기본
cd <path> #path로 이동 cd - #이동 전의 path로 이동 pwd #작업 디렉토리의 패스를 표시 ls #현재 디렉토리의 내용 표시 mv <originalPath> <newPath> #파일 이동, 이름 변경 cp <originalPath> <newPath> #파일 복사...
Read More
Read More
Read More
.editorconfig 파일을 만들면 쉽게 할 수 있다.
.editorconfig 파일
[*] end_of_line = lf charset = utf-8-bom
end_of_line 에서 개행 코드를 LF 지정으로 한다.
Visual Studio는 Bom 있는 UTF-8로 하는 것이 좋다
이 .editorconfig 파일을...
Read More
출처
Go 언어에서 환경 변수를 읽기
Go 언어의 표준 패키지에서 쉽게 환경 변수를 읽을 수 있다.
fmt.Println(os.Getenv("HOME"))
그러나 때때로 환경 변수가 없을 때의 기본 설정을 할 수 있다.
Read More
닷넷프레임워크의 WinForm/WPF는 그 자체로 바로 실행되지만 .NET Core로 만든 것은 dotnet
명령어를 사용하여 프로그램을 실행하기 때문에 프로그램의 실행 파일 패스를 얻을 때 이전(닷넷프레임워크)과 다르다.
Process.GetCurrentProcess
를 사용해야 한다.
using System.Diagnostics; using System.Windows.Forms;...
Read More
Read More
참조
어떤 이유로 프로그램이 오류로 비정상 종료하는 경우 기본적으로 프로세스의 현재 디렉토리에 core.PID 형태로 덤프를 남긴다.
CentOS에서는 기본적으로 코어 덤프를 남기지 않게 설정 되어 있다. 코어 덤프를 남기고 싶다면 아래처럼 수정해야 한다.
vi /etc/systemd/system.conf
...
Read More
최신 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
Read More
함수 인라인화 조건
- 함수에 포함 되는 식이 40개 미만
- 함수 호출・루프・클로져・panic・recover・select・switch 라는 복잡한 것을 포함하지 않는다
출처
인라인화 막기
//go:noinline
라는 pragma를 사용한다.
package main func main() { HelloNoInline() }...
Read More
몇 년전에 웹에 공개된 글을 보고 정리했던 글이다.
Read More
네트워크
특정 port에 접속한 네트워크 정보 보기
32452 port에 접속한 네트워크 정보를 보고 싶은 경우
netstat -nap | grep :32452
파일
디렉토리 이름 변경
mv 옵션... 원본 대상 mv 옵션... 원본......
Read More
출처
클래스의 같은 값 비교, 해시 함수가 필요
#include <unordered_map> class Point{ public: int x, y; Point(){} Point(int x, int y):x(x),y(y){} bool operator==(const Point &left) const {return this->y == left.y;} }; namespace std{ template<> class...
Read More
Read More
컴파일 시에 정해진 조건 C의 bool 값에 의해 타입 A 혹은 B를 선택하고 이 타입의 변수를 선언하고 싶은 경우 의사 코드는 아래와 같다.
if (C) { A x; } else { B x; }
이것을...
Read More
아래의 코드는 컴파일 에러가 된다.
using MyString = std::basic_string< char, std::char_traits<char>, MyAllocator<char>>; std::unordered_map<MyString, int> umap; // 이 부분이 에러
이유는 unordered_map이 필요로 하는 std::hash는 std::hash<std::string>로 정의 되어 있는데 allocator를 특별화한 문자열 타입의 정의가 없기 때문이다.
...
Read More
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
.NET 4.5 이상에서 컬렉션의 정렬 알고리즘에서 사용
https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/collections/generic/arraysorthelper.cs
Read More
출처
C++11 표준 라이브러리의 atomic 조작 함수 compare_exchange_weak와 compare_exchange_strong에 대한 메모.
두 함수 모두 변수의 atomic한 CAS(compare-and-swap) 작업을 제공한다. weak 버전과 strong 버전의 동작 사양은 weak 버전에서는 “교환 가능한 경우라도 CAS 조작 실패 할 가능성이 있다(spurious failure)”가(* 1), strong...
Read More
- C++17로 표준으로 구현.
- 헤더 파일 1개로 구성.
- 저장소: https://github.com/sailormoon/flags
- 라이센스: 퍼블릭도메인(완전 마음대로 사용 가능)
예제
#include "flags.h" void ParseConfig(int argc, char* argv[]) { const flags::args args(argc, argv); const auto ip = args.get<std::string>("ip"); if...
Read More
몇 년전에 웹에 공개된 글을 보고 정리했던 글이다.
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
Read More
GitHub에 C++ 오픈 소스 Poco를 사용한 네트워크 라이브러리 예제 코드를 정리한 저장소이다.
Poco_network_sample
Poco_network_sample 저장소가 도움이 되었다면 스타 부탁한다~
Read More
Read More
Read More
- 유한 상태 머신을 쉽게 구현해 주는 라이브러리.
- 닷넷 코어 지원.
- 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
- 콘솔 출력 문자에 컬러를 지정할 수 있다.
- 다양한 방식으로 컬러 출력.
- 닷넷 코어도 지원.
- 공식

Read More
Read More
Read More
Read More
GitHub에 C++에서 Redis 클라이언트 라이브러리에 대해서 간단하게 정리하였다.
jacking75/examples_cpp_redis
만약 Redis를 key-value 정도로 간단하게 사용한다면 RedisCpp-hiredis 와 redis_client 를 추천한다.
hiredis 라이브러리만 있다면 위 라이브러리는 헤더파일 1개만으로 redis를 사용할 수 있어서 준비가 간단하다
RedisCpp-hiredis 보다는 redis_client가...
Read More
Read More
원문
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
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 표준 라이브러리에서는 스마트 포인터인 std::shared_ptr의 unique 멤버 함수는 비추천이 되었다.
상위 호환이 되는 use_count 멤버 함수는 잔존하지만 스레드 간 동기에는 관여하지 않는다는 요건이 명확화 되어서 멀티스레드 실행에서는 반환 값은 근사(approximate)가 된다는 취지의 Note가 추가된다.
Read More
Read More
출처
conrod는 piston라는 게임 엔진을 개발 중인 곳에서 만들고 있는 Rust 정품의 GUI 라이브러리이다.
widget 구성과 관리, widget에 대한 이벤트의 전파 등 기본적인 기능을 담당할 수 있다.
그러나 실제의 렌더링이나 OS에서 행사의 수취는 conrod는 conrod에...
Read More
Read More
출처
방법
아래와 같은 배치 파일을 만든다. 하고있는 것은 아래와 같다.
- IP 주소를 고정으로 세팅(여기에서는 192.168.1.111 로 하고 있다)
- 폴더 공유를 활성화 한다
- “응용 프로그램 및 안전하지 않은 파일의 시작” 설정을 변경 (경고 창을 내지 않는다)
- 바탕...
Read More
Read More
출처
기본적으로 conrod_glium/examples/hello_world.rs 를 참고로 만들었다.
다만 이 샘플 코드는 여러가지 처리가 들어 있어 단순히 Window를 표시하는 것 이상의 일을 하고 있어서 Window를 표시만 하는 최소한의 코드를 모색하였다.
1. Project 작성
우선 실행 프로그램을 만드는 Project의...
Read More
IOCP 프로그래밍을 배울 때 사용할 자료로 IOCP 프로그래밍 tutorial을 만들었다.
jacking75/edu_cpp_IOCP
(도움이 되었다면 Star 부탁합니다 ^^)
아주 간단한 IOCP용 에코 서버에서 시작하여 10단계로 나누어서 기능을 확장하면서 채팅 서버를 만들어 가면서 IOCP 프로그래밍 방법을 배운다.
이 자료로 IOCP...
Read More
Syncthing는 분산 폴더 동기화 툴이다.
Syncthing 인터넷을 통해 여러 단말기의 로컬 폴더를 동기화 할 수있는 도구이다.
3자가 관리하는 중앙 서버를 거치지 않고 개인 데이터를 공유 하려는 경우에 적합하다.
통신이 완벽하게 암호화 되어 있는 것과 개발이 오픈 소스로...
Read More
GitHub examples C++ Poco
몇 년전에 만든 코드와 작년에 사내 발표에 사용한 문서가 있다.
이 저장소가 도움이 되었다면 스타 부탁한다~
Read More
참고
아래의 코드는 sigma_reference 함수에서 예외가 발생하는 경우 main에서 catch하고 있지만 예외가 잡히지 않는다.
이유는 sigma_reference 함수의 스레드와 main 함수의 스레드가 서로 다르기 때문이다.
#include <thread> #include <iostream> #include <functional> // ref #include...
Read More
약어 | 의미 |
ADL | Argument Dependent name Lookup |
COW | Copy On Write |
CRTP | Curiously Recurring Template Pattern |
ctor | constructor |
dtor | destructor |
EBO | Empty Base...
Read More
컴파일러 최적화 기능으로 RVO(Return Value Optimization) 나 NRVO(Named Return Value Optimization)를 지원하고 있었다. 그러나 이 최적화 기능은 각 컴파일러에서 제공하는 것이지 C++ 표준으로 정해진 것이 아니다. 즉 어떤 컴파일러는 지원하지 않을 수 있다. C++17 에서는 RVO에 한해서는 표준...
Read More
C++14까지는 메모리 할당을 받은 객체인지 확인 후 delete를 하였다. if(pUser) { delete pUser; }
C++17 에서는 null pointer를 delete 해도 문제 없다(아래 설명에서는 C++14도 괜찮은 듯…). http://en.cppreference.com/w/cpp/language/delete ...
Read More
출처 - string_view 클라스 == 문자열에 대한 읽기 전용 뷰.
- std::string와 같이 null 종단 문자열 이외도 올바르게 다룰 수 있다. null 종단 문자를 도중에 포함 할 수 있다.
- string_view 클래스는 참조처 문자열의 소유권을 관리하지 않는다.
Read More
Read More
헤더 파일은 Boyer-Moore - 최악의 케이스가 o(n). n은 검색 대상 범위의 길이
- 전처리 시에 테이블을 2개 만들므로 전처리 시간이 걸리고, 메모리를 더 먹는다.
- 검색 패턴이나 검색 대상 범위가 긴 경우, 혹은 같은...
Read More
C++17에서 숫자를 문자열로 변환, 문자열을 숫자로 변환 해주는 라이브러리가 새로 생김 출처 특징 - 서식 지정은 문자열이 아니다
- 동적 메모리 할당을 하지 않는다
- 로케일 무시
- 가상 함수 호출이 아니다
- 버퍼 오버런 방지
- 반환 값에서 에러를 반환한다
- 입력...
Read More
출처 mutex로 보호 된 데이터를 다수의 스레드가 액세스 할 때 성능이 저하된다. 이 데이터 변경을 하지 않는 스레드가 다수인 경우 성능 저하를 줄일 수 있다. 데이터의 변경을 하지 않는 읽기(reader) 스레드와 데이터의 변경을 하는 쓰기(writer) 스레드가 각각 복수...
Read More
컴투스에서 매달 게임 서버 프로그래머 대상으로 세미나(회사에서는 월 세션 이라고 부릅니다)를 진행합니다. 주제는 게임 서버 개발과 관련된 것입니다. 이번 달에 발표한 문서를 공유합니다. 컴투스에서 모든 서버 프로그래머는 기본으로 JetBrains의 All...
Read More
간결한 코딩을 위해 네임 스페이스를 생략하고 싶다면 using 선언을 사용한다 using std::cout; cout << "hello";
그러나 아래와 같은 경우는 using std::cout; using std::endl;...
Read More
Read More
C++14 까지
namespace A
{
namespace B
{
class AA {};
}
}
C++17 부터는
namespace A::B
{
class AA {};
}
Read More
출처 C++ 17 표준 라이브러리 헤더에 추가 되었다 hardware_destructive_interference_size False-Sharing 발생을 방지하기 위해 필요한 최소 메모리 주소 거리. 2개의 변수를 서로 다른 캐시 라인에 싣기 위해 얼라이먼트 정보로 사용한다. hardware_constructive_interference_size 동일한 캐시 라인에 올리는(True-Sharing) 최대 개체...
Read More
C++11에서 람다식의 캡쳐 리스트에 this를 지정하면 이 람다식이 속하는 클래스 오브젝트가 참조로 캡쳐된다. 비동기 처리나 병렬 처리에서 오브젝트 수명 관리를 간단하게 하기 위해 this를 참조가 아닌 복사로 캡쳐해야 하는 경우가 있다. 이 때 C++17에서 새로 생긴 *this 를 사용하여...
Read More
Read More
Read More
Read More
Read More
출처 Go 난수 생성에 관한 표준 패키지는 math/rand와 crypto/rand의 2가지가 있다. 각각 math/rand은 약한 난수에 crypto/rand 강한 난수인데 강한 난수 쪽이 반드시 좋다는 것은 아니고, 특성 및 성능의 차이에서 유스 케이스가 나누어진다. math/rand https://golang.org/pkg/math/rand/ 일반적으로 난수를 사용하는...
Read More
Read More
출처 #include <iostream> using namespace std; void print (){ cout << endl; } template <typename T,typename ...Types> void print (T head, Types... tail) { cout << head << endl; print(tail...); } void test06() { //...
Read More
일어로 된 문서는 번역기로 돌려서 보는 것을 추천한다. |