Skip to main content

Posts

Showing posts from May, 2006

C++ of the Day #2 - Sequence points.

Question 역시 C++ 뉴스그룹에 올라온 질문 하나 (( comp.lang.c++.moderated:Sequence points. )) int c = 0; cout << c++ << c; 질문을 요약하면... 위 문장의 결과는 undefined라고 한다. 하지만 이 경우는 다음과 같이 번역되지 않는가? cout.operator<<(c++).operator<<(c); 인자를 evaluation 한 후에 함수가 호출되므로 이 사이에는 반드시 [[http://en.wikipedia.org/wiki/Sequence_point|sequence point]]가 있어야 하지 않나? 따라서 출력은 항상 01 이 되어야 하지 않나? Answer 함수가 리턴하고 그 리턴된 객체의 함수가 호출되는 사이에는 sequence point가 존재합니다. 하지만 이는 함수 호출 사이의 순서를 보장해줄 뿐입니다. 위의 문장에서 두 인자의 evaluation 순서는 보장되지 않습니다. 설명을 쉽게 하기 위해 위의 문장을 다음 네개로 나누어보겠습니다. cout.operator<< c++ *((1번의 operator<<가 리턴한 객체)).operator<< c 여기서 함수 사이의 sequence point에 의해 1번이 3번보다 먼저 호출된다는 것이 보장됩니다. 하지만 인자의 evaluation인 2번, 4번의 순서는 보장되지 않습니다. 위에서 질문자는 이 경우 2 -> 1 -> 4 -> 3번순으로 실행된다고 예상했으나 실제로는 4 -> 2 -> 1 -> 3번순으로 실행되어도 컴파일러로서는 표준을 위반하지 않은 것이 됩니다. 물론 이런 순서로 실행되면 출력은 00 이 됩니다. 여기서 중요한 점은 이런 순서의 차이점은 단지 출력만을 얘기하는 것이 아니라 인자가 evaluation되면서 생기는 모든 side effect 에 대한 것이라는 점입니다. 간단한

C++ of the Day #1 - Be alert for C++'s most vexing parse.

Question 오늘 C++ 뉴스그룹에 올라온 질문 하나 (( comp.lang.c++.moderated: semantics??? )) class X { public: int i; private: //<<<<<(1) X():i(1) { printf ( "Ctor\n");} X(const X & ref ) { printf ( "CopyCtor\n" ); i = ref.i; } ~X() { printf ( "~Dtor\n" ); } }; int main() { X c(X()); //<<<<(2) //X& ref = c; <<<<(3) } 질문을 요약하면... - 위의 코드는 컴파일이 된다. - (1)에 있는 private을 public으로 변경해도 컴파일은 된다. 하지만 아무것도 출력되지 않는다. - (3)의 주석처리를 풀면 "c is not an lvalue"라는 컴파일 에러가 발생한다. - 도대체 왜 이런 결과가 나오는가? 답을 보기전에 한번 생각해 보세요. Answer 사실 정답은 Effective STL: Item 6 ((Effective STL: Item 6. Be alert for C++'s most vexing parse.)) 의 내용입니다. 위의 (2)번 라인은 실제 변수 선언이 아닌 함수 선언으로 파싱된 것입니다. 먼저 작성자의 의도는 아마 X() 로 temporary X 객체를 만든 후 이를 X의 복사 생성자에 넘겨 c라는 X 객체를 생성하려 했던 것일 겁니다. 하지만 실제로는 X를 리턴하고 인자로 X를 리턴하는 함수 포인터를 가지는 c라는 함수를 선언한 것이죠. (2)번 라인을 다르게 써보면 다음과 같습니다. X c(X (*pf)()); X c(X pf()); X c(X ()); 제일 위에 줄은 명확하게 함수 포인터를 인자로 가지는

Wiki 새글 - Double Delete에 관한 연구

Wiki에 double delete의 결과에 대해 조사한 내용을 올렸습니다. (( Double Delete에 관한 연구 )) 물론 double delete는 반드시 잡아야 하는 버그이지만 간단한 클래스의(포인터 변수가 없는) 경우에는 MemPool과 같은 도구를 사용하여 run-time시에 검출도 가능할 듯 합니다. 관찰을 위해 Intel CPU상에서 g++을 사용하여 컴파일한 a.out을 사용하였습니다.

CodeHighlighter Extension for MediaWiki

WordPress용 Code Highlighter 를 만들어보고 내친김에 MediaWiki용도 만들어보았다. (( CodeHighlighter MediaWiki Extension Site )) (( Screenshots )) 역시 MediaWiki쪽이 작성이 용이했는데 이유는 MediaWiki는 내용이 아직 wiki syntax 일때 extension이 동작하기 때문에 html tag나 escape character같은 것에 신경을 쓰지 않아도 되고 또한 tag 이름만 정하면 알아서 tag내의 attribute까지 parsing해주기 때문이었다. 사용법은 code 태그안에 lang이라는 속성을 다음과 같이 추가로 지정하면 된다. <code lang="cpp"> 추가로 원하는 라인을 강조하고 싶다면 다음과 같이 em 속성을 추가한다. <code lang="cpp" em="2,3,10-15"> 만약 code 태그안에 lang이라는 속성이 없으면 그냥 pre 태그로 치환된다.

Yet Another CodeHighlighter Plugin

WordPress를 사용하여 코딩에 관한 글을 쓰려다가 DokuWiki에서 사용하던 것과 유사한 syntax highlighter가 있었으면 하는 생각에 몇개 찾아보다가 결국 원하는 플러그인을 찾지 못해 하나 만들어보았다. (( CodeHighlighter WordPress Plugin Site )) ((Screenshot: <pre lang="cpp"> struct D : public B { int i, j; std::string s; }; D d; d.i = 1; d.s = "code"; )) GeSHi Site 라이브러리를 사용하였는데 알고보니 DokuWiki의 code 태그가 이 라이브러리를 사용한 것이었다. 사용법은 pre 태그안에 lang이라는 속성을 다음과 같이 추가로 지정하면 된다. <pre lang="cpp"> 추가로 원하는 라인을 강조하고 싶다면 다음과 같이 em 속성을 추가한다. <pre lang="cpp" em="2,3"> 추가 찾아보니 WP-Dokuwiki 라는 플러그인이 있다. 이 플러그인은 DokuWiki 의 모든 문법을 WordPress상에서 제공한다. 물론 GeSHi를 사용하는 code 태그도 지원한다. 테마에 맞게 몇군데 수정을 가하고 WP-Dokuwiki를 사용하게 되었다.

Yet Another BlogReader

한 2년전에 Java도 공부할겸해서 만들어 본 BlogReader 프로그램이다. (( BlogReader Site )) (( Screenshots )) SharpReader Site 의 Java 버전 정도라고 생각하면 된다. Atom, rdf, rss2를 지원하면 opml 형식의 export/import 도 지원한다. 한글과 영어를 지원하며 각 피드마다 갱신주기나 최대 저장 글 갯수등을 지정할 수 있다. 각 글들은 잠금기능이 있어 전체 삭제시 지워지지 않도록 설정할 수 있다. 현재 대부분의 사람들이 Bloglines 와 같은 online rss reader를 사용하고 있으며 나 역시 Bloglines를 사용하고 있다. 온라인 버전이 다른 장소에서 동일한 데이터로 blog들을 볼 수 있어 이 프로그램과 같이 데스크탑 버전의 rss reader들은 인기가 시들해지고 있다. :-( UI를 위해 SWT 를 사용하였고 trace logging을 위해 log4j 를 사용하였다.

Yet Another BookCover plugin

WordPress를 사용하기 시작하면서 테터툴즈에서 사용하던 bookcover 플러그인이 하나 필요하게 되었다. 여기저기 찾아보았으나 구미에 딱 맞는 것이 없어 WordPress 문서들을 뒤져가며 만들어보았다. (( BookCover WordPress Plugin Site )) ((Screenshot: [ bookcover:1932394613(Ajax In Action)] [bookcover:1932394613(Ajax In Action)] )) 태터툴즈에 비해 WordPress가 많은 장점이 있으나 무엇보다 잘 정리된 문서가 플러그인 개발자 입장에서는 가장 큰 장점이었다. 태터툴즈의 가장 시급한 보완점은 문서화가 아닐까? 만들다 보니 욕심이 생겨 관리자 페이지도 만들었다. 사용자들은 향후 책표지 이미지를 받아오기 위한 URI가 바뀌더라도 플러그인이 업데이트될때까지 기다리지 않고 스스로 URI를 셋팅할 수 있다. (물론 그런 URI를 발견하는 것이 우선!)

웹2.0에 관심이 생기다.

[bookcover:8995527625(웹 2.0 시대의 기회 - 시맨틱 웹)] "웹 2.0 시대의 기회 - 시맨틱 웹"이라는 책을 읽고 갑자기 웹2.0에 관심이 생겼다. 아니 뭔가 재밌는 것을 찾았다고 할까? 회사에서 몇년째 하고 있는 한 프로젝트에 질린건지 자꾸 다른 것에 관심이 간다. 책을 읽고 책에서 언급한 사이트들을 방문하여 사용해보기로 하고 오늘 여러 사이트를 방문하여 사용해 보았는데 다음이 그 리스트들이다. del.icio.us Technorati Bloglines Feedburner Flickr Flock 1~5번까지를 방문하고는 사실 별 감흥이 없었다. 그저 책에서 자주 언급되던 태그들이 여기저기 사용되고 있구나, 잘 만들었구나 하는 정도였다. 사실 Gmail의 Label 기능을 사용하면서도 Category처럼 하나의 메일에 하나의 Label만 적용해야 되는건줄 알만큼 태그에 무지했었다. 태그의 편리함은 TatterTools 의 태그 클라우드를 사용하면서 알게 된 정도였다. 하지만 마지막 Flock 사이트를 방문하여 Flock 브라우저를 설치하고 "Flock User's Guide" 문서를 따라하면서 이거 정말 장난 아닌데 라는 생각이 들었다. Flock 브라우저는 위에서 언급한 del.icio.us를 브라우저의 북마크 저장소로 사용하고 Flickr와 연동하여 사진 업로드 및 검색을 할 수 있으며 이글을 쓰고 있는 WordPress와 같은 툴들과 연동하여 브라우저내에서 Blog 글을 작성할 수 있게 해준다. 눈치채셨겠지만 이글이 TatterTools가 아닌 WordPress로 쓰이고 있는 이유가 바로 이 때문이다. Flock을 사용하면서 앞으로는 한 사이트가 모든 것을 다 하는 포탈들보다 각자 자기만의 전문 분야에서 최고의 기능을 제공하고 이 기능을 다른 툴들과 연동될 수 있도록 인터페이스(Open API)를 제공하는 사이트들이 힘을 얻겠다는 생각이 들었다. 위에서 언급한 사