본문 바로가기


소프트웨어 & 잡다

(20)
테크니컬 인터뷰 단골손님, 피보나치 수열 계산하기 요즘 인터뷰 질문들 훑다보니, 초반 웜업용 질문으로 피보나치 수열 값 구하는 코드가 심심치 않게 나온다. 그도 그럴것이, 연산 자체가 매우 간단하면서도 네가지 각기 다른 방법으로 작성 할 수 있기 때문이 아닌가 싶다. 첫재로, recursive 방식으로 구현한 코드.12345unsigned fibo_rec(unsigned n) { if(n == 0) return 0; if(n == 1) return 1; return fibo_rec(n-1)+fibo_rec(n-2);}Colored by Color Scriptercs 둘째로, iterative 방식으로 구현한 코드.1234567891011unsigned fib_itr(unsigned n) { if (n == 0) return 0; unsigned prev..
C++에서 데이터를 비트단위로 읽기 제작년부터인가 HEVC(H.265)의 필요성이 짙어지면서, 우리팀에서 제공하던 인크립션 서버들도 HEVC 비디오를 암호화 할것이 요구 되었다. 아주 오래된 시스템부터 최근에 개발된 시스템까지 그 필요성이 대두 되었는데, 그중 한 시스템은 여타의 상용 HEVC parser를 도입하할 필요까지는 없이 헤더안의 몇가지 필드만 필요로 했다. 그런데 그 과정이 상당히 복잡했고, 범용 파서를 사용할 경우 헤더 전체를 다 파싱하지 않고 그 정보들만 쏙 쏙 빼내는게 불가능 했다. AVC(H.264)와 HEVC의 헤더 구조는 매우 흡사한데, 새로 추가된 몇가지 정보들이 서로 각각 옵셔널하게 물려있어서 따로 떼어낼 수가 없었다. 그래서 딱 그 기능만 수행하기 위한 Parser 를 만들어야 했다. 비디오 스트림 헤더 par..
CentOS 5 에서 GCC4.4 사용하기. 호환소프트웨어 호환 관계로 아직도 CentOS5를 사용하는 경우가 많다.CentOS5를 설치하고 나면, 기본적으로 GCC 4.1.9 버젼이 설치 되어 있는데, 이 버젼은 개발용으로 사용하기에 조금 불편한 점이 많기에, GCC 4.4를 설치해서 사용하는것이 좋다.설치하는 법은 매우 간단하다. yum install gcc44 gcc44-c++ 이렇게 설치하고 나면, 기존의 gcc와 g++이 있던 /usr/bin 아래에 gcc44 와 g++44 가 설치된다. gcc 44를 기존의 소프트웨어들을 빌드에 사용하기 위해서는, bashrc 등에 환경변수를 추가해 주면 된다. export CC="gcc44"export CXX="g++44"
std::vector 정렬하기 - quick sort, merge sort std::vector를 정렬하기 위해서는 std::sort를 쓰면 되지만, 요즘 인터뷰관련해서 학부때 공부했던걸 복습하고 있던 참에, 그새 소팅을 까먹은걸 깨닫고 다시 공부해서 작성해 보았습니다.array가 아니라 vector 버전으로 짰습니다. array버전은 많지만 vector 버전은 별로 없는것 같아 학생분들이나 인터뷰보실분들이 필요할것 같아서 공유합니다. 물론 array나 vector나 마찬가지지이긴 하지만, vector쪽이 코드가 더 간결해집니다. template void quick_sort_recursive(std::vector& v, size_t left, size_t right) { size_t i = left, j = right; T pivot = v[(left+right)/2]; // ..
GCC 4.1 호환 지원 GCC 4.4.6 로(정확히는 GCC4.1 보다 높은 버젼으로) 라이브러리를 빌드하면, GCC 4.1 이하 버젼에서 사용할 수가 없다. 다음과 유사한 링크 에러가 발생하기 때문이다. /root/3rdPartyDependencies/lib/libcryptopp.a(gf2n.o): In function `operator
SVN trunk 변경사항 되돌리기 (SVN Rollback) 가끔 뻘짓을 하다보면 SVN trunk의 변동사항을 되돌려야만 할 때가 있다. 이럴 때 merging을 이용한 rollback으로 간단히 해결이 가능하다. Check out 해놓은 trunk 디렉터리로 이동하여 다음을 실행한다. 여기서 HEAD는 최신 revision을 의미하고, xxxx에는 rollback 하고자 하는 rivision number를 적는다. 당연히 trunk repository 주소는 본인의 것으로 변경하고 실행할것. svn updatesvn merge -rHEAD:xxxx svn+ssh://svn/myserver/trunk ./svn ci -m "Roll back to the revision xxxx"
SVN branch and merge 쉽게 활용하기 #2 이전에 잠깐 SVN에서 branch만들어서 사용하는 법과 merge하는 법을 적은 적이 있다. 뭔가 잘 안되어서 삽질하다가 적은건데, 좋은 방법은 아니었다. 그런데 우연히 블로그 유입경로를 보니 SVN/BRANCH/MERGE가 엄청 많다는걸 알고는, 가만 있을수가 없었다. 사실 적어놓고 잊고 있었는데, 요새 branching을 많이 하다보니, 나름 정형화 된 방법이 있어서 새로 적을까 한다. branch를 생성하고 작업하고, merging 하기까지 일련의 과정을 나열해 보겠다. 잘 모르는 사람을 위해서 당연한것도 적도록 하겠다. 1. branch 만들기branch를 만든다는것이 최신 trunk를 복사하는것이기 때문에, 기본적인 명령어 사용 순서는 이렇다.svn copy [TRUNK] [BRANCH PAT..
Redhat/Ubuntu 리눅스에서 램디스크(RAM disk) 만들기 소프트웨어 개발을 하다 보면, 다양한 디스크 상태에 따른 예외처리를 구현해야 할 때가 많다. 일일이 열거하기는 어렵지만, 예를들면 디스크 용량 부족에 대한 예외 처리가 있을 수 있겠다. 하지만 이런 상황을 만들어내기 위해서 하드디스크에 파일을 채울 수도 없는 노릇이 아닌가. 이럴때 작은 아주 작은 크기로 램디스크를 만들면 쉽게 재현 할 수 있다. 또 한가지는, profiling 등을 할 때, 디스크IO로 인한 부하 및 지연시간을 없애고 싶을 때가 있다. 이 때 파일 read/write를 램디스크로부터 하도록 함으로써 이를 해소 할 수도 있다. 램디스크는 비교할 수 없을만큼 access 시간이 짧기 때문에, 디스크 IO에 묻혀서 분간하기가 힘들었던 hot spot을 발견할 확률도 높일 수 있다. Redha..