Archive for programming

argv[0]

main 함수의 인자인 argv 배열의 첫번째 항목에는 command line에서 입력된 첫번째 인자, 즉 수행되는 프로그램의 이름이 들어갑니다.1 일반적으로 이 argv[0]는 잘 사용하지 않지요. 간혹 usage 출력에 사용되기는 합니다만… 그런데 예전에 Embedded Linux 교육을 받으면서 보니 이 argv[0] 항목을 사용한 BusyBox라는 재밌는 프로젝트가 있더군요. Embedded 시스템들은 일반 시스템들보다 컴퓨팅 파워나 메모리 용량, 디스크 크기(플래시 메모리)에 있어서 [...]

C++ of the Day #45 – SQLite3 C++ wrapper #3

이번엔 sqlite3++를 소개하는 마지막 시간으로 SQLite3의 extension 기능에 대한 부분을 살펴 보겠습니다. SQLite3는 사용자가 정의할 수 있는 function과 aggregate들을 통해 기본 기능을 확장할 수 있도록 하고 있습니다.1 예를 들어 A라는 column의 정보를 가지고 B와 C의 데이터 중 선택할 수 있는 cond(A, B, C)라는 function을 사용자가 정의할 수 있다면 복잡한 SQL 구문 대신 다음과 같이 간단하게 [...]

C++ of the Day #44 – SQLite3 C++ wrapper #2

지난 번에 이어 구현중인 SQLite3 C++ wrapper에 대해 살펴보겠습니다. 먼저 이 wrapper의 이름을 sqlite3++로 결정했습니다. 물론 코드안에서와 같이 특수 문자를 사용할 수 없는 경우에는 sqlite3pp라는 이름을 사용합니다. 지난번 글의 내용에서 변경된 사항들에 대해 먼저 알아보죠. 먼저 몇몇 클래스와 함수들의 이름을 알기 쉽게 바꾸었습니다. 다음이 바뀐 이름들의 목록입니다. connection –> database connection::open –> database::connect connection::close –> [...]

C++ of the Day #43 – SQLite3 C++ wrapper #1

The Definitive Guide to SQLite를 읽다가 공부 겸 해서 C++ wrapper를 만들어 보았습니다. 최대한 C++ 냄새(?)가 나도록 만들어 보았습니다. 1 이 wrapper를 사용하기 위해서는 (당연하게도!) sqlite3와 (당연하게도?) boost 라이브러리가 필요합니다. 사용 예들을 살펴보는 것으로 설명을 대신합니다. 이번 글에서는 다음과 같은 contacts 테이블이 test.db에 존재한다고 가정합니다.   CREATE TABLE contacts ( id INTEGER PRIMARY KEY, name [...]

BookCover plugin test page

This post is for testing BookCover plugin.1 The ‘Books Reading’ section in the sidebar is also using this plugin. [ bookcover:1932394613] [ bookcover:1590598385(Smart and Gets Things Done)] [ bookcover:1591841380(Wikinomics : How Mass Collaboration Changes Everything)] [ bookcover:8995856408] [ bookcover:8831793721] [ bookcover:9788831793728] The previous test page has some comments from users.[back]

C++ of the Day #42 – Use of std::bad_exception

이번 글은 Use of std::bad_exception을 보고 작성하였습니다. 아래 프로그램의 실행 결과는 무엇일까요? void my_unexpected() { if (!uncaught_exception()) cerr << "my_unexpected() called\n"; throw;} void my_terminate() { cerr << "my_terminate() called\n";} void func() { cerr << "func() called\n";} void g() throw (int) { throw 1.0; // throws double} int main(){ set_unexpected (my_unexpected); set_terminate (my_terminate); atexit (func); try { g(); } catch [...]

C++ of the Day #41 – Maintaining const in Impl classes

이번 내용은 c.l.c.m.에 올라온 Maintaining const in Impl classes라는 글에서 가지고 왔습니다. Pimpl Idiom과 const correctness에 관한 글입니다.   struct Foo { struct Impl { void A() const { }; // unreachable code! void A() { }; };   Foo() : pimpl_(new Impl) { };   void A() const { pimpl_->A(); }; void A() { [...]

1의 개수 세기 – 해답

벌써 어제 말한 내일이 되었는데 답을 주신 분이 아무도 없어서 좀 뻘쭘하네요. 그리고 어제 문제에 O(1)이라고 적었는데 엄밀히 얘기하자면 O(log10 n)이라고 적었어야 했네요. 죄송합니다. … 문제를 잠시 생각해보면 1~n까지의 수들 중 1의 개수를 얻기 위해서는 해당 숫자 n의 각 자리의 1의 개수가 모두 몇개나 될지를 구해서 더하면 된다는 사실을 알 수 있습니다. 예를 들어 13이라는 [...]

1의 개수 세기

저도 간단한 알고리즘 문제 하나… 어떤 수 n이 주어졌을때 1~n까지의 수를 쭈욱 썼을때 나오는 1의 개수를 구하는 문제입니다. 예를 들어 13이라는 수가 주어지면 1~13까지의 수 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13에서 1은 1, 10, 11, 12, 13에 나오며 그 개수는 6이 됩니다. 즉, f(13)=6. 원래 문제는 f(n)=n이 되는 [...]

어떤 두 정수의 합이 주어진 숫자가 되는 경우가 있는가?

art.oriented에 올라온 어떤 두 정수의 합이 주어진 숫자가 되는 경우가 있는가?라는 글의 트랙백입니다. 코드가 비교적 단순해서 코드만 보시면 어떤 방법인지 아실 수 있습니다. 실행 파일을 만들 수 있는 전체 코드입니다. (에러 체크같은건 없습니다. )   #include <iostream>   using namespace std;   int main(int argc, char *argv[]) { int V[] = { 1, 4, 7, [...]

C++ of the Day #40 – Python의 OptionParser 클래스 따라잡기

텍스트 기반 프로그램을 만들때 필요한 기능중의 하나가 command line option들을 parsing 해주는 것입니다. 원래는 boost::program_options 라이브러리를 소개하는 글을 쓰려고 했습니다. 그런데 마침 Python을 사용하면서 알게 된 OptionParser 클래스가 좀 더 사용하기가 쉬운 것 같아 이 클래스를 C++ 버전으로 만들어 보았습니다. boost::program_options 라이브러리와는 달리 옵션들의 grouping이나 설정 파일을 사용하는 기능은 구현되어 있지 않습니다. 그리고 옵션들의 타입은 [...]

Bad smell in mind

Refactoring을 읽어 보면 bad smell in code라는 말이 나옵니다. 코드에서 나쁜 냄새가 느껴질 때가 refactoring을 해야 할 때라는 내용이죠. 예전에 했던 생각인데 bad smell을 꼭 코드에서만 맡을 수 있는 것은 아닌 것 같습니다. 제목에 쓴 것처럼 뭔가 심리적인 bad smell이 있을 것 같은데 제가 생각했던 한가지 bad smell in mind는 바로 이것입니다. 내 코드를 남들에게 [...]

assert()와 NDEBUG

바로 이전 글에서 “디버깅 옵션으로 컴파일하니 문제가 없어져요”와 같은 주장을 엉뚱하다고 써놓고 제가 바로 그런 실수를 했네요. 물론 이전 글과 같이 multi-threading 환경에서의 문제는 미묘한 타이밍 문제를 말하는 것이었지만 제가 한 실수는 바로 assert()와 관련이 있습니다. 모든 C/C++ 책들에서 경고하듯이 assert() 안에는 실제 동작해야 하는 코드가 들어가서는 안되죠. 제가 한 실수는 바로 아래 보이는 코드입니다. [...]

Low-Level Envy

Paul Graham이 쓴 Hackers and Painters라는 글을 보면 math envy라는 말이 나옵니다. 과학계에 있는 사람들은 속으로 수학자들이 자신들보다 똑똑하다고 믿는 것을 두고 나온 말입니다. 이런 생각의 결과로 자신의 작업을 되도록이면 수학적으로 보이려고 애쓰게 되는데 물리학같은 과학에선 이런 현상이 별 해가 없지만 자연과학에서 멀어질수록 문제를 발생시킬 수 있습니다. 정말 중요한 문제보단 수학적으로 보일 수 있는 문제를 [...]

Core Dump Pattern 두번째

Code Dump Pattern에 대해서는 지난 번 글에서 얘기한 바 있습니다. 한동안 잠잠하다가 다시 core dump가 발생했는데 이번에도 제가 담당하는 부분이 아니어서 보지 않고 있다가 다른 분이 pstack을 구해 공지한 것을 보니 대략 원인이 보이더군요. 그럼 먼저 증상을 보여 드릴테니 원인을 찾아보세요. 먼저 log 파일에는 pure virtual function called라는 문장이 출력되었으며 해당 pstack은 다음과 같았습니다.   [...]

C++ of the Day #39 – State with NVI (or Template Method)

프로토콜을 다루는 프로그램에서 가장 많이 사용되는 design pattern은 아마 State pattern일 것입니다. GoF의 State pattern 설명에서 Structure 부분을 보면 다음과 같습니다. (State pattern의 설명은 다들 아실테니 생략합니다.) 이번 글에서는 프로토콜을 다루는 코드 대신 Wikipedia에 있는 State pattern 코드를 가지고 설명하겠습니다. 이 예제는 drawing program에 대해서 다루고 있습니다. 먼저 Wikipedia에 있는 코드를 보시죠. 아래의 AbstractTool 클래스는 [...]

Textiler plugin test page

This post is for testing Textiler plugin. This plugin uses Textile engine (version 2.0.0). The sample text is come from Textile test page. (Note that the result will be vary according to your CSS options.) Supported wiki syntax Rendering result h2{color:green}. This is a title h3. This is a subhead p{color:red}. This is some text [...]

Refactoring과 Optimization

이번 글에서는 refactoring이 어떻게 optimization에 도움을 주는지 알아보도록 하겠습니다. 아래 코드와 같이 극단적인 예를 사용해서 말이죠. 다섯개의 함수가 있습니다. func1과 func3는 주어진 수까지의 짝수의 합을 출력하고 func2와 func4는 홀수의 합을 출력합니다. func5는 하나의 루프에서 둘 다를 계산한 후 출력하고요.   void func1(int cnt) { int e_sum = 0; for (int i = 0; i < [...]

std::map에 insert하기

얼마전 회사 동료가 refactoring한 코드를 열심히 revert하고 있어서 물어보니 다음과 같은 문제였습니다. 원래 코드와 refactoring한 코드는 다음과 같더군요.   nvp[name] = value; // original code   nvp.insert(make_pair(name, value)); // refactored   아시겠지만 위의 두 라인은 전혀 다른 기능을 하죠. C++03에 보면 각각 다음과 같이 설명되어 있습니다. 23.1.2/7 Associative containers a_uniq.insert(t): pair<iterator, bool> inserts t if [...]

Core Dump Pattern?

지난 주에 현장에 있던 시스템에서 core dump가 발생했습니다. 제가 담당하는 부분은 아니어서 쳐다보지도 않고 있다가 오늘 뭔가 의심스러운게 있는지 확인하기 위해 불려갔지요. 사실 core dump를 열어 보지도 않아서 그냥 듣고만 있었는데 듣다 보니 원인이 뭔지는 짐작이 가더군요. 소멸자에서 core가 났는데 소멸자 코드안에는 아무 것도 없습니다. 그리고 call stack의 마지막 부분은 std::string에 있는 lock 관련 함수에서 [...]