Skip to main content

Posts

Showing posts from September, 2007

6년 9개월

오늘이 6년 9개월동안 다녔던 회사에 출근하는 마지막 날입니다. 이제 이 자리에서 블로그에 글 쓰는 건 마지막이군요. 생각해보면 그렇게 길게 느껴졌던 국민학교 6년보다 여기서 더 오래 생활했네요. 일주일 쉬었다가 다음 회사로 출근합니다. 왠지 섭섭한 마음에 PC 반납하기 전에 한 줄 적어봤습니다. :-(

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

이번엔 sqlite3++를 소개하는 마지막 시간으로 SQLite3의 extension 기능에 대한 부분을 살펴 보겠습니다. SQLite3는 사용자가 정의할 수 있는 function과 aggregate들을 통해 기본 기능을 확장할 수 있도록 하고 있습니다. ((이외에 collation sequence라는 확장 기능도 있습니다만 sqlite3++에서는 지원하지 않습니다. 아직까지는...)) 예를 들어 A라는 column의 정보를 가지고 B와 C의 데이터 중 선택할 수 있는 cond(A, B, C)라는 function을 사용자가 정의할 수 있다면 복잡한 SQL 구문 대신 다음과 같이 간단하게 사용할 수 있을 것입니다. SELECT cond(A, B, C) FROM ...; 그리고 특정 규칙을 적용한 filter를 사용하여 해당 filter에 의해 선택된 항목들의 개수만 세고 싶다면 다음과 같은 aggregate를 만들어 사용할 수도 있습니다. 아래 코드에서는 count_of가 사용자가 정의한 filter라고 가정합니다. SELECT count_of(A, B, C) FROM ...; 이처럼 function이나 aggregate는 SQLite3가 기본적으로 제공하지 않거나 SQL만으로 작성하기에는 복잡한 기능들을 사용자가 정의할 수 있도록 해줍니다. 그럼 sqlite3++을 사용하여 간단하게 이런 function이나 aggregate를 만들 수 있는 방법을 알아보겠습니다. 먼저 ext::function의 경우에는 function pointer나 functor, boost::binder 그리고 boost::lambda등을 function으로 등록하여 사용할 수 있습니다. 예를 들면 다음과 같습니다. int plus100(int val) { return val + 100; } // ... sqlite3pp::ext::function func(db); func.create ("plus100", &plus100); /

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

지난 번에 이어 구현중인 SQLite3 C++ wrapper에 대해 살펴보겠습니다. 먼저 이 wrapper의 이름을 sqlite3++로 결정했습니다. 물론 코드안에서와 같이 특수 문자를 사용할 수 없는 경우에는 sqlite3pp라는 이름을 사용합니다. 지난번 글의 내용에서 변경된 사항들에 대해 먼저 알아보죠. 먼저 몇몇 클래스와 함수들의 이름을 알기 쉽게 바꾸었습니다. 다음이 바뀐 이름들의 목록입니다. connection --> database connection::open --> database::connect connection::close --> database::disconnect command::step --> command::execute command::finalize --> command::finish 클래스 상속 관계도 수정이 되었으나 사용자들에게 보이는 변경 사항은 없습니다. 그리고 command::step() 함수의 성공시에 SQLITE_DONE(101)이 출력되던 것을 다른 함수들과의 일관성을 위해 command::execute() 함수는 SQLITE_OK(0)를 리턴하도록 수정하였습니다. 이제 sqlite3++에서 함수의 성공 여부는 리턴값이 0인지를 확인하면 됩니다. 다음으로 SQLite3에서 지원하는 busy_handler, commit_hook, rollback_hook, update_hook, authorizer_handler와 같은 callback 함수들을 등록하는 인터페이스를 database 클래스에 추가하였습니다. 사용하는 방법은 다음과 같이 몇가지가 있습니다. ((boost::function을 사용하여 다양한 타입으로 등록할 수 있도록 구현하였습니다.)) 먼저 일반 함수 포인터를 사용하는 방법입니다. int handle_authorize(int evcode, char const* p1, char const* p2, char const* dbname, char const* tvna

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

The Definitive Guide to SQLite 를 읽다가 공부 겸 해서 C++ wrapper를 만들어 보았습니다. 최대한 C++ 냄새(?)가 나도록 만들어 보았습니다. :-) ((SQLite는 복잡한 관리가 필요없이 사용가능한, 파일이나 메모리 기반의, 라이브러리로 제공되는, 약 250kb 용량의, 대부분의 SQL92문을 지원하는, open source RDB입니다.)) 이 wrapper를 사용하기 위해서는 (당연하게도!) sqlite3 와 (당연하게도?) boost 라이브러리가 필요합니다. 사용 예들을 살펴보는 것으로 설명을 대신합니다. 이번 글에서는 다음과 같은 contacts 테이블이 test.db에 존재한다고 가정합니다. CREATE TABLE contacts ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, phone TEXT NOT NULL, UNIQUE(name, phone) ); Command 먼저 test.db 파일을 사용하기 위해 다음과 같이 파일 이름을 주어 connection 객체를 생성합니다. 생성과 동시에 test.db와 연결이 이루어집니다. ((생성자외에 open() 함수를 사용할 수도 있습니다.)) sqlite3pp::connection conn("test.db"); 다음은 contacts 테이블에 정보를 추가하는 가장 간단한 방법입니다. connection 클래스에서 제공하는 execute 함수를 사용합니다. ((executef 함수를 사용하면 printf와 같은 문법을 사용하여 query문을 작성할 수 있습니다.)) conn.execute("INSERT INTO contacts (name, phone) VALUES ('user', '1234')"); 위와 동일한 작업을 parameterized query를 사용하여 할 수도 있습니다. ((step()함수가 실제 query문을 수행하는 함수입니다.

의사 결정의 함정들

검색2.0 발견의 진화 (Ambient Findability) 라는 책 내용중에서 의사 결정의 함정들이라는 내용입니다. 책의 주제와는 크게 상관없는 연구 결과 내용인데 너무 와 닿습니다. 고착 결정을 내릴 때 우리의 정신은 우리가 처음 찾아낸 정보의 영향을 많이 받는다. 처음 발견한 데이터와 첫인상에 의해 그 이후의 판단이 고착된다. 확인 우리는 무의식적으로 기존의 시각을 옹호하는 데이터를 찾아 선택적으로 검색하고 받아들이며, 그와 반대되는 증거는 피하려고 한다. ((괴짜경제학이라는 책에서도 줄기차게 나왔던 내용이죠.)) 각인 최근에 있었거나 극적인 사건에 더 영향을 받는다. 어떤 정보가 하나 혹은 여러 개의 출처에서 반복해서 등장할 경우 신념, 기억, 그리고 판단에까지 영향을 미칠 수 있다. 현상 유지 의사 결정시 현재 상태를 영속화할 수 있는 보수성, 관성, 대안들에 강하게 치우치는 경향이 있다. 다시 말해 아무 것도 하지 않을 이유를 찾는 것이다. 매몰 비용 (Sunk Cost) 의식적이든 아니든, 지나간 실수들을 인정하기 싫어서 과거의 선택을 정당화하는 쪽으로 결정을 내린다. 저는 특히 현상 유지 항목의 보수성, 관성등의 말이 무섭게 느껴지더군요. 나도 점점 이렇게 되어 가는건 아닐까 하고요. 언제 어디서든 마음을 열고 이런 함정들에 빠지지 않도록 조심해야겠습니다. 뛰고 있는데도 힘들지 않다면 그길은 내리막길인 것이다. 요새 웹 2.0과 관련된 책들을 찾아 읽고 있는데 그중에서 제일 재밌게 읽었던 책 두권 추천해드립니다. 공교롭게도 둘다 아시아 저자들이네요. (한국, 일본) 웹 진화론, 우메다 모치오 웹 2.0 경제학, 김국현 또 괜찮은 책 있으면 추천해주세요. :-) 읽은 책에는 웹 2.0 이노베이션, 검색2.0 발견의 진화, 검색으로 세상을 바꾼 구글 스토리, The Google Story - 구글 성공 신화의 비밀, 웹 2.0 시대의 기회 - 시맨틱 웹 등이 있습니다.