2019의 게시물 표시

이직을 하게 되었습니다

5월 31일자로 퇴사를 하고 6월 10일부터 새로운 회사를 다니게 되었습니다. (병특 이직)
새로운 회사에서는 기존과는 다른 일을 하게 되었습니다. 신규 게임 서버 개발을 담당하게 됐고 스칼라를 이용해서 함수형 프로그래밍을 하게 됐습니다.

이직을 하는데는 다양한 요인들이 복합적으로 작용했습니다. 하지만 핵심적인 요인은 진로에 대한 저의 고민으로부터 비롯됐습니다.
지난 세월동안 저의 주된 관심사는 라이브러리/프레임워크 개발, 시스템 프로그래밍, C++, 코어 모듈 개발 같은 것들이였고, 이러한 것들을 공부하는 데 많은 노력과 시간을 투자했었습니다.
하지만 회사를 다니면서 저도 현실적인 측면들을 고려하게 되었고 저의 관심사도 변해가는걸 느꼈습니다.
    일단 첫째로 제가 좋아하던 것들은 현실적으로 양질의 일자리가 많지 않습니다. C++개발자로 예를 들자면 구글, 페이스북, 아마존 같이 매우 규모있는 회사 혹은 소수의 외국 회사들 외에는 "C++을 제대로" 하는 회사는 거의 없어보입니다. 그렇다보니 피고용인의 입장에서 회사를 선택할 수 있는 폭이 매우 적다고 느꼈고 일자리의 유연성이 떨어진다고 생각했습니다. 반면에 자바, 파이썬등을 이용해 인터넷 서비스를 개발하는 일자리들을 보면 양질의 일자리/회사가 매우 많고 대우도 매우 좋다고 생각합니다. (특히 한국은 더더욱 이러한 편차가 심하다고 느껴집니다.)
    둘째로 좀 더 세상에 직접적으로 영향을 끼치고 의미를 부여할 수 있는 개발이 하고 싶어졌습니다. 다양한 어플리케이션에서 활용할 수 있는 기반 라이브러리를 개발하는 것도 물론 아주 큰 의미가 있지만 세상에 실질적으로 가치를 창출하는 것은 어플리케이션 (응용개발) 입니다. 개발과정에서 기술적인 성취감외에도 내가 작성하는 코드가 많은 사람들의 삶에 영향을 준다는 느낌을 받고 싶어졌습니다.

위에 적은 것들을 비롯한 다양한 생각들을 하고있습니다. 개발 전반적인 것들에 대해서는 많은 경험을 했다고 생각하지만 아직 저에게는 뚜렷한 도메인이 존재하지 않습…

Bloom Filter 자료구조

이미지
안녕하세요, 오늘은 Bloom Filter 와 변종들중에 하나인 Scalable Bloom Filter 에 대해서 알아보는 시간을 가지려고 합니다.
너무 자세하거나 수학적인 설명은 배제하고 직관적인 이해를 기반으로 포스팅하겠습니다! 자세한건 그냥 논문을 보세요…
Bloom Filter 란?Bloom Filter 는 집합내에 특정 원소가 존재하는지 확인하는데 사용되는 자료구조입니다.
이러한 “membership test” 용도로 사용되는 자료구조들은 Bloom Filter 외에도 다양합니다. 대표적이고 널리 알려진 것으로는 Balanced Binary Search Tree (AVL, red-black tree 등) 과 해시 테이블등이 있습니다. 이 자료구조들의 특징은 100% 정확도로 membership test 를 수행할 수 있다는 것입니다.
Bloom Filter 는 이러한 정확도를 희생해서 메모리 사이즈를 최소화하는 것을 목표로 합니다.
Bloom Filter 구조 Bloom Filter 자료구조는 기다란 비트 배열로 구성됩니다. 그리고 “원소 추가” 와 “원소 검사” 연산을 수행하기 위해 서로 다른 해시 함수들이 사용됩니다.
비트 배열의 길이를 m, 해시 함수의 개수를 k 라고 하겠습니다. k개의 해시 함수들은 [0, m) 범위의 해시 값을 출력하게 됩니다.
그러면 Bloom Filter 의 2가지 연산에 대해서 알아보겠습니다.
원소 추가 추가하려는 원소에 대해서 k개의 해시 값을 계산한 다음, 각 해시 값을 비트 배열의 인덱스로 해서 대응하는 비트를 1로 세팅합니다.원소 검사 (membership test) 검사하려는 원소에 대해서 k개의 해시 값을 계산한 다음, 각 해시 값을 비트 배열의 인덱스로 해서 대응하는 비트를 읽습니다. k개의 비트가 모두 1인 경우 원소는 집합에 속한다고 판단하고, 그렇지 않은경우 속하지 않는다고 판단합니다. 매우 간단하죠? Bloom filter by example 사이트에서 직접 눈으로 확인해보시면 이해에 더 도움이 되실…

HPX parallel partition 알고리즘

이미지
안녕하세요. 오늘은 제가 예전에 HPX 라는 오픈소스에 구현했던 parallel partition 알고리즘에 대해 간단히 소개하고 설명하는 시간을 가져보도록 하겠습니다.
출처 먼저 이 포스팅에서 다루는 알고리즘/코드의 출처는 다음과 같습니다.
HPX : https://github.com/STEllAR-GROUP/hpx관련 MR : https://github.com/STEllAR-GROUP/hpx/pull/2778소스코드 : https://github.com/STEllAR-GROUP/hpx/blob/master/hpx/parallel/algorithms/partition.hpp 소개 parallel partition 알고리즘은 여러 개의 연산 유닛 (쉽게 말하면 cpu) 들을 이용해서 partition 알고리즘을 수행하는 것을 말합니다.
이 포스팅에서는 독자가 partition 알고리즘에 대해서 이미 알고있다고 가정합니다. partition 알고리즘에 대한 설명은 cppreference 를 참고하시기 바랍니다.
알고리즘 설명 partition 알고리즘은 주어진 영역을 정해진 규칙을 만족하는지 아닌지에 따라 두 영역으로 분류하는 알고리즘입니다.
예를 들어, 짝수인지 여부에 대해 partition 알고리즘을 수행한다고 하면 결과는 다음과 같습니다.
적용 전 : 3 5 7 4 2 1 9 8 6
적용 후 : 6 8 2 4 * 7 1 9 5 3
즉, partition 알고리즘의 핵심은 다음과 같습니다.
두 영역을 구분할 수 있는 boundary 를 찾는다.그 boundary 의 왼쪽에는 조건을 만족하는 원소들이, 오른쪽에는 조건을 만족하지 않는 원소들이 위치하게 된다. 자, 위의 핵심을 기억하면서 parallel partition 알고리즘을 살펴보도록 합시다.
결론적으로 parallel partition 알고리즘은 크게 4단계로 이루어집니다.
주어진 영역을 여러 개의 block 으로 쪼개서 병렬로 sub-partitioning 을 수행한다.남은 block 들에 대해서 순차…

Rust Procedural Macros By Example

이미지
안녕하세요. 제가 최근에 Rust 공부를 시작했는데요~
그래서 오늘은 Rust 1.29.0 부터 stable 이 된 Procedural Macros 에 대해서 포스팅해보도록 하겠습니다.
포스팅은 구구절절한 설명보다는 예제 코드 위주가 될 예정입니다!
Rust 의 매크로 시스템 Rust 의 매크로 시스템은 매우 강력한데요. 크게 다음과 같이 분류 할 수 있습니다.
Declarative MacrosProcedural Macros Function-like macrosDerive mode macrosAttribute macros 첫 번째는 Declarative Macros 는 일반적으로 개발자들이 흔히 알고 있는 “선언적” 형태의 매크로 방식인데요. C/C++ 등의 타언어들과의 차이점은 문자열 전처리기 방식이 아니라 Abstract Syntax Tree 를 직접 건드리는 방식이라는 점입니다.
// 출처 : https://doc.rust-lang.org/rust-by-example/macros/dsl.htmlmacro_rules! calculate {(eval $e:expr)=>{{{let val: usize = $e;// Force types to be integersprintln!("{} = {}",stringify!{$e}, val);}}};}fnmain(){calculate!{ eval 1+2// hehehe `eval` is _not_ a Rust keyword!}calculate!{eval(1+2)*(3/4)}} Declarative Macros 는 이번 포스팅의 주제가 아니므로, 더 이상 언급하진 않겠습니다.
두 번째는 이번 포스팅의 주제인 Procedural Macros 인데요. 함수의 실행 으로서 매크로를 정의하는 방식입니다.
일단 큰 틀에서 쉽게 얘기하자면 아래와 같습니다.
원래의 AST --input--> "함수" --output--> 수정된 AST “함수” 는 인풋으로 원래 소스코드…

C++ Boost 라이브러리를 Windows XP 에서 동작하도록 빌드하기

이미지
안녕하세요~ 반갑습니다!
C++ 개발자 여러분~ boost 많이 쓰시죠?? 저도 boost 참 좋아합니다 ㅎㅎ
이렇게 좋은 boost 를 Windows XP/2003 환경에서 사용할 때는 그냥 일반적인 방법으로는 사용이 불가능한데요. 그래서 오늘은 Windows XP 환경에서 동작하도록 boost 를 빌드하는 방법에 대해서 알아보도록 하겠습니다!
참고로 제가 설명할 방법은 100% 완벽하게 검증된 방법은 아니며, 제가 조사/연구를 통해 알아낸 방법입니다. 따라서 문제가 있을 수도 있으므로 참고자료정도로만 사용해주시면 감사하겠습니다. 그리고 이 포스팅에서는 Visual C++ 2015 Update 3 를 사용한다고 가정하고 설명하겠습니다. 또한, 이 포스팅에서 말하는 Windows XP 는 정확히 말하면 XP Service Pack 3 를 뜻합니다.
1단계) 사용하려는 라이브러리가 XP 를 지원하는 지 확인한다. 일단 첫 번째 단계는 사용하려는 라이브러리가 Windows XP 를 지원하는 지 확인하는 과정입니다. 다행히도 Boost 의 대부분 라이브러리는 XP 환경에서 잘 돌아갈텐데, 경우에 따라서 XP에서는 기능이 제한되거나 오동작을 일으킬 수 도 있으니, 라이브러리가 XP 를 지원하는 지 여부를 검토할 필요성이 있습니다.
근데 아쉽게도 라이브러리들이 XP 를 지원하는 지 여부가 명백하게 정리된 글같은 건 없어 보입니다 ㅜㅜ 그리고, 각 라이브러리의 레퍼런스를 봐도 잘 안나오는 경우가 많죠. 결국, 부스트 커뮤니티 혹은 스택오버플로우의 글들을 뒤지거나 직접 질문을 해서 도움을 얻어야 합니다. 그리고 직접 라이브러리 내부 소스코드를 까서 XP 지원 여부를 파악해야 할 수도 있습니다. 그리고, 무엇보다 실제로 라이브러리를 사용하는 프로그램을 XP에서 동작시켜서 잘 동작하는지 직접 확인하는 과정도 꼭 필요합니다.
이 글은 2015년도에 부스트 커뮤니티에 올라왔던 Windows XP 지원 관련 설문인데 한번 읽어보셔도 좋을 것 같습니다.
XP 호환 여부를 파악할 때 …