In Development of …

요즘 개인적으로 개발하고 있는 프로그램들.

MovableTypeWriter
http://www.lastmind.net/tWiki/bin/view/Main/MovableTypeWriter

MovableType(이하 MT)은 자체적인 웹상의 posting interface를 가지고 있으나, html을 직접 다루어야 한다. Microsoft Internet Explorer를 사용하는 환경에서는 mshtml을 사용할 수 있고, visual editing 능력을 활용할 수 있다. MovableTypeWriter는 mshtml을 활용하여 MT에 posting을 좀 더 쉽고 유연한 인터페이스로 만들어주기 위한 application이다. 기능이 많이 필요한 것이 아니라, 완전히 사용성의 문제를 해결하기 위한 프로그램이라서 시간과 고민, 그리고 번뜩이는 아이디어가 많이 필요한 프로그램이다.

아직은, 초보적인 mshtml을 활용한 visual/code editing을 지원하고 있고, mshtml의 기능들도 아직 다 활용하지 못하고 있다. 조금씩 시간나는대로 추가해나갈 예정.

Visual Studio 2003/C#을 이용하여 개발하고 있고, 사용하기 위해서는 CLR이 필요하다.

아직 기본적인 기능 구현이 마무리 되지 않았기 때문에, code도 binary도 open 하지 않은 상태. (9월 말 정도면 되지 않을까?) Screenshot은 Wiki page에서 볼 수 있다.

IRCJukeOn
http://www.lastmind.net/tWiki/bin/view/Main/IRCJukeOn

현재 JukeOn에서 플레이 중인 곡목을 얻어오기 위한 mIRC(잘 알려진 Windows 기반의 IRC client) plugin이다. 기능은 구현된 상태이지만, 간단한 몇가지 문제들을 귀찮아서 해결하지 않고 있다.

WebRSSAggregator
http://www.lastmind.net/tWiki/bin/view/Main/WebRSSAggregator

웹기반의 RSS reader이다. Outlook plugin 형태의 RSS reader인 intravnews를 사용하고 있었으나, 집과 회사간의 정보 sync 문제(esp. 읽었는 지 여부, flag)가 발생해서 개발하게 되었다. 사실, 지금은 VPN으로 Outlook을 읽는데 별 어려움이 없기 때문에, 이 이유는 좀 약해졌지만, 개인적으로 필요로 하는 몇가지 기능들을 추가적으로 만들어볼 생각이다. 예를 들면, 나는 MSDN blog의 RSS를 구독하고 있는데, 워낙 많은 사람들의 blog들을 모아놓은 RSS feed라서 상당히 내용이 많다. 이 때, content/history 기반으로 적절히 분류하거나 ranking을 부여함으로써, 내가 보고 싶지 않은 내용들을 보는 시간을 절약할 수 있을 것이다.

ruby를 사용한 CGI application의 형태로 개발 중이다. RDoc은 여기에서 볼 수 있다.

지금은 기본적인 기능만 구현되어있는 상태이고, 결과물은 여기에서 볼 수 있다. 다음 iteration에서는 IFMS-based feed retrieval, Web interface 다듬기, 사용자 기반 읽기 여부 flag 정도를 구현해 볼 생각.

In Development of … 더 읽기"

Drucker on Adaptive vs. Plan-Driven

“‘Planning’ as the term is commonly understood is actually incompatible with an entrepreneurial society and economy….innovation , almost by definition, has to be decentralized, ad hoc, autonomous, specific and microeconomic.”

excerpt from http://www.agilemanagement.net/Articles/Weblog/DruckeronAdaptivevs.Plan-.html

Drucker가 1985년에 그의 책인 ‘Innovation and Entrepreneurship’에서 얘기한 것. 여기서 말하는 entrepreneurial sociery and economy는 현재의 사회와 경제, 즉, 지식 근로자 사회/경제를 얘기하는 거라고 봐도 무방할 듯 하다. 지식 사회에서는 decentralized, ad hoc, autonomous, specific, microeconomic한 innovation을 해야한다는 것이다. XP나 FDD 등과 같은 Agile(Light-weight) Software Development가 바로 이러한 철학을 가지고 있지 않은가!

Drucker on Adaptive vs. Plan-Driven 더 읽기"

insert at end/push_back test on C++ Standard Library containers and ncl::Array

gcc(+stlport) 환경에서 C++ Standard Library container들과 ncl::Array에 대한 성능 측정을 해보았습니다. 다만, int형에 대한 insert at end/push_back operation에 대해서만 측정을 해보았습니다. 참고로, ncl::Array는 C Standard Library의 realloc을 활용하여 copy를 줄이는 container입니다. 즉, C++ Standard Library의 container들과는 semantic이 좀 다른 셈이지요.

1. insert at end

첫번째는 (Sheet 1) container.insert(container.end(), obj) operation을 사용한 테스트입니다. stlport가 들어가있는 결과물은 gcc의 기본 library 구현 대신 stlport를 사용한 결과이고, reserve란 단어가 들어가 있는 결과물은 vector::reserve나 Array::Array(int size)를 사용한 구현의 결과입니다. (deque, list는 reserve를 위한 mechanism이 없습니다.)

결과를 요약해보면, vector (reserving) < vector < deque(stlport) =~ deque < list < list (stlport) 입니다. code는 다음과 유사합니다.

#include 
int main(int argc, char * argv[])
{
if (argc != 3)
{
printf("usage: %s count sizen", argv[0]);
return 0;
}
int count = atoi(argv[1]);
int size = atoi(argv[2]);
for (int i = 0; i != count; ++i)
{
std::vector v;
#ifdef VECTOR_RESERVE
v.reserve(size);
#endif
for (int j = 0; j != size; ++j)
v.insert(v.end(), j);
}
}

2. push_back test

두번째는 (Sheet 2) container.push_back(obj) operation을 사용한 테스트입니다. vector의 경우에 위의 insert(container.end(), …)와 성능 차이가 2배정도 나는 것이 신기하군요.

결과를 요약해보면, Array (reserving) < vector (reserving) < deque < Array =~ vector << list 입니다. container들에 대한 코드는 다음과 유사합니다.

#include 
int main(int argc, char * argv[])
{
if (argc != 3)
{
printf("usage: %s count sizen", argv[0]);
return 0;
}
int count = atoi(argv[1]);
int size = atoi(argv[2]);
for (int i = 0; i != count; ++i)
{
#ifndef VECTOR_RESERVE
std::vector v;
#else
std::vector v;
v.reserve(size);
#endif
for (int j = 0; j != size; ++j)
v.push_back(j);
}
}

ARRAY의 테스트 코드는 다음과 같습니다.

#include 
#include "ncl/array.h"
int main(int argc, char * argv[])
{
if (argc != 3)
{
printf("usage: %s count sizen", argv[0]);
return 0;
}
int count = atoi(argv[1]);
int size = atoi(argv[2]);
for (int i = 0; i != count; ++i)
{
#ifndef ARRAY_RESERVE
ncl::Array v;
for (int j = 0; j != size; ++j)
//v.insert(v.size(), j);
v.add(j);
#else
ncl::Array v(size);
for (int j = 0; j != size; ++j)
v.item(j) = j;
#endif
}
}

3. Conclusion

신기하게도, insert at end의 경우에는 vector가 제일 빠르고, deque, list의 순입니다. push_back의 경우에는 deque, vector, list의 순이었습니다.

두 경우 모두 list는 매우 느렸습니다. link를 위한 pointer의 overhead와 entry 별 allocation이 큰 것 같습니다. (아마도 allocator 수준에서 pooling을 하게 되면 개선할 수 있을까요?)

reserve를 하지 않는 경우 vector와 Array는 거의 유사한 performance를 보여줍니다. 10만건이 되면 좀 차이가 납니다. item 수가 적은 경우 (10000건 이하인 경우) vector의 alloc/copy와 Array의 realloc이 별로 차이나지 않는 것을 알 수 있습니다. (copy cost외에도 pre-allocation의 전략이 다르기 때문일 수도 있을 것 같습니다.) int형이 아니라 좀 더 큰 size의 (따라서 copy cost가 더 큰) object를 사용할 경우에는, vector와 Array의 차이가 더 커질 수도 있을 것 같습니다. (테스트가 필요합니다)

그리고 deque가 vector와 Array보다 더 빠른 것을 알 수 있습니다. gcc의 구현을 조금 보니, deque는 memory chunk 단위로 alloc하고 이에 대한 index(map)를 유지하는 data structure더군요. push_back의 경우에 추가적인 메모리만 할당하고, index의 size만 조절해주면 되기 때문에 당연히 더 좋을 수 밖에 없는 것 같습니다.

또한, reserve하는 것이 단연 reserve 하지 않는 경우보다 빠른 것을 알 수 있습니다. reserve할 경우에는 ncl::Array가 std::vector보다 훨씬 빠릅니다. Array의 경우에는 생성자를 통하지만, vector의 경우에는 reserve() op를 통하기 때문일까요?

insert at end/push_back test on C++ Standard Library containers and ncl::Array 더 읽기"

Visual Studio 2005 Beta 1 Refresh with the Team System

기존에 release된 Visual Studio 2005 Beta 1에 Visual Studio 2005 Team System의 Community Technology Preview (CTP)가 추가되어있다. 기회가 되면 VSTS에 대해서 글을 써보도록 하겠다.

Get the Visual Studio 2005 Beta 1 Refresh with Visual Studio 2005 Team System
http://lab.msdn.microsoft.com/vs2005/get/default.aspx

Visual C++ 2005 Express Beta
http://lab.msdn.microsoft.com/express/visualc/default.aspx

Visual C++ 2005 Tools Refresh (patch to Visual C++ 2005 Beta 1 release)
http://www.microsoft.com/downloads/details.aspx?FamilyID=afd04ff1-9d16-439a-9a5e-e13eb0341923&displaylang=en

Update :

Microsoft Set to Launch Refreshed ‘Whidbey’ Preview
http://www.eweek.com/article2/0,1759,1640080,00.asp

Visual Studio 2005 Beta 1 Refresh with the Team System 더 읽기"

Why do some structures end with an array size 1?

Win32 API나 COM의 variable-length struct를 사용해보신 분이라면, 익숙하실, size 1의 array member에 관한 설명입니다.

Why do some structures end with an array size 1?
http://blogs.msdn.com/oldnewthing/archive/2004/08/26/220873.aspx

한편, Zero-length array (정확히는 Flexible array member)의 지원은 C99부터군요. gcc에서는 3.0부터 extension으로 C/C++에서 지원해왔다고 하는군요.
http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

C++ standard 쪽에도 병합되었는지는… 모르겠습니다. C++98 까지는 분명히 지원되지 않는 것 같습니다. C++03쪽을 확인해보고 업데이트 하겠습니다.
http://david.tribble.com/text/cdiffs.htm

Why do some structures end with an array size 1? 더 읽기"

유혹의 기술

‘유혹의 기술’이란 책을 읽지도 않고 서평을 쓰는 실험.
뭔가 의도를 담아내는 재치가 부족해 보인다.
글쓴이: Cestlavie (이방인) [writers/BlueEyes]
날 짜: 2002년 11월 25일 월요일 04:21:38
제 목: 유혹의 기술
나의 삶이 얼마나 거짓된 삶인지 명확하게 보여주는 글이다.
아이 재미있어라. 낄낄. 참고로 writers/cybgira의 동제목의 글에 대한 리.
남의 보드를 어지럽히기는 미안하여 내 보드로 옮김.

이 책에서는 유혹의 ‘필요’가 근대에서 발생하기 시작했다고 했는데,
그 때부터일까 근대의 어느 시점에서부터일지, 아니면 훨씬 더 오래전부터일지,
유혹은 부정적인 개념이 아니라 오히려 미덕이 되어버리지 않았을까.
유혹의 역사는 그것이 가능한 사회에서는 우리가 아는 바와 같이 분명히 기록되어
전해져왔으며, 아마도 탄복과 외경의 의미가 아닐지. (두려움과 비난의 형태로만
나타난다 하더라도)
인간사에 흔한 유혹의 시나리오에서 유혹하는 쪽은 유혹당하는 쪽에 비해서 뭔가
뛰어난 조건-능력을 가지고 있다고 생각되고 (그 뛰어난 조건이 아무리 원천적이고
인간 본능적인 것이라고 하더라도) 그러한 뛰어난 조건이 미덕인 것으로
생각해야할 터인데, 유혹과 유혹의 기술과 그것을 위한 조건들은 모두
뭉뚱거려져서 미덕으로 생각되고 있는듯하다.
많은 사람들이 유혹당하는 쪽보다는 유혹하는 쪽을 원한다. 심지어 유혹을
경멸하면서도 말이다. 합리적이라고 일컬어지는 인간은 불합리함의 점철이자
결정판이지만, 그러한 불합리성을 어떻게든 극복해낸 사람이라면 유혹에 있어서
좀 더 능수능란할 수 있을 것이고 유혹이 성공할 가능성도 높아질 것이다.
(살인에 대해서 자기합리화를 잘할 수 있는 병사가 더욱 능력있는 병사가
될 것이다.)
하지만, 이러한 유혹에 대한 합리성의 문제는 사소한 것에 불과하고,
합리성의 문제와 유혹의 기술 자체, 그리고 그 기술을 위한 능력의 세가지
중에 유혹의 실행을 위해서 가장 중요한 것은 아마도 유혹을 위한 조건,
즉 능력의 존재여부일 것이다.
이 책은 유혹을 실행하기 위한 이러한 세가지 조건 중 가장 덜 중요하지도 가장
중요하지도 않은 유혹의 기술 즉, 방법론에 관한 책이다. 유혹의 기술에 관한한
이 책은 상당히 잘 설명하고 있다. 이 책의 최고의 매력이라고 생각되는 점은
아무래도 유혹의 기술을 몇 가지의 유형으로 분리하고 예를 들어 설명한 것이다.
설명하기 힘든 인간간의 문제에 대해서, 역사는 가장 합리적인 설득이 될 수 있는
것이다. 덤으로 독자들은 유혹의 역사에서 조명을 받는 주인공들을 통해 어느
정도의 대리만족을 느낄 수도 있다.
하지만, 책을 덮고 나서 막상 유혹의 실행에 있어서 난감해지는 것을 느낄 수
있는데, 이것은 위에서 설명한 자신의 능력의 조건에 대해서 만족스러울 만큼 잘
알고 있지조차도 못하기 때문이다. 글쎄 이 책을 읽은 독자라면 다음과 같은
제목의 책을 기다리지 않을까?
‘유혹, 세라비만큼만 하기’
‘유혹자를 위한 변명’

유혹의 기술 더 읽기"

Identity

메일을 정리하다보니 이런 글도..
내가 봐도 무슨 말인지 모르겠군.
글쓴이: Cestlavie (이방인) [writers/BlueEyes]
날 짜: 2002년 10월 31일 목요일 01:10:38
제 목: Identity
하루만에 지하철을 2시간 가량 탔더니 나타나는 증세인가보다.
오묘한 원리로 지하철역으로 모여드는 엄청난 인파들을 질리게 보다보니,
이 삭막하기 그지없는 도시에서 자신의 아이덴티티를 지켜내기란 정말로
힘든 일인 것 같다. 무언가를 창조하는 일이 지속되어야 이유는 그것이 다른
사람들을 행복하게 해주기 때문이 아니라 자신을 지켜내는 행위이기
때문이어야 한다. 사실상 ‘창조’라는 단어를 쉽게 쓸만큼 우리들은
(적어도 난) 창조적이지 않다. 많은 사람들은 그들의 진취성과 창조성을
잃어버린지 오래다. 하여, 우리는 일생동안 자신도 감당못할 ‘생산’을 한다.
그 중 2/3 정도는 쓰레기이고, 1/3 정도는 다른 사람들을 행복해주기도 한다.
몇몇 안되는 창조물을 위한 희생이다.
인간은 그 홀로 있을 때에도 창조적일 수 있다. 창조성과 아이덴티티의 도식을
가볍게 받아들인다면, 창조적인가 아닌가 하는 것은 그것이 분리된 상태에서도
창조성을 유지하는가의 여부가 하나의 척도가 될 수 있다. 우리가 추구하는
아이덴티티의 궁극은 그런 것이 아닐까 생각된다. 24년동안의 궤적이 무색할
정도로 난 창조적이지 못하고 여느 사람과 거의 다른 점이 없어서
인파속의 나를 스스로도 구분하기도 힘들다. 하지만, 유치하기 그지없는 매일의
고심과 엄청나게 적체되어 먼지에 쌓여 빛나고 있는 위대한 창조물들의 연구와
습득은 24년의 궤적을 이어가는 같은 방향의 행로에 있는 것이기도 하다.
현재의 나는 다른 사람들과의 관계속에서 존재하고 다른 사람들과의 관계속에서만
나의 걸음을 옮길 수 있다. 하지만 언젠가는 스스로 홀로 설 수 있는 사람이,
스스로의 걸음을 걸을 수 있는 사람이 될 수 있지 않을까 상상해본다.

Identity 더 읽기"

Inside C#, Modern C++ Design

Inside C#, 2nd Edition

C# Programming Language에 관한 책이다. 사실 .Net Framework에 대한 내용도 상당히 포함되어있기 때문에, Language를 배우기에 좋은 책은 아니다. 그럼에도 불구하고, C#의 여러 언어적인 요소와 CIL(Common Intermediate Langauge; aka MSIL)을 비교하면서 작동원리를 설명해주기 때문에 C# Programming Language의 구현 방식을 약간이나마 들여다볼 수 있는 점은 이 책의 미덕이다. 번역은 엉망인 편이다. (10점 만점에, 초반은 4점 중반은 0점, 후반은 5점 정도?) 아르바이트 생들에게 시키고 한번도 제대로 읽어보지 않은 정도의 퀄리티. 읽어보면서 내가 직접 수정하면서 읽어간 곳만도 한 스무군데 정도 되는 것 같다. 요즘에 번역서를 몇권 보면서 신뢰를 약간 얻어가는 중이었는데, 이 책을 보고 다시 실망해버렸다. 따라서 이 책을 읽고자 하는 사람은 차라리 원서를 보기를 추천한다.

참고로, C# Programming Language를 공부하고 싶다면 이 책보다는, O’Reilly사의 Programming C#, Third Edition과, C# Programming Language의 아버지인 Anders Hejlsberg가 쓴 The C# Programming Language를 추천한다.

 

Modern C++ Design

Modern C++ Design은 template의 사용에 관한한 최고의 책이라고 한다. template이 어디에 쓰는 건지 모르겠다면 Modern C++ Design은 template을 사용해서 구현할 수 있는 모든 technique을 보여줄 것이다. (from http://www.lastmind.net/tWiki/bin/view/Main/SoftwareDevelopmentBooks)

현재 읽고 있는 책이다. 현재 Chapter 6를 읽고 있는데, 이번 달 안에 끝낼 생각. 번역은 C++ In-Depth 시리즈를 통틀어서 그렇듯이, 만족스러운 편이다. Template parameter를 Strategy로 사용하는 idiom을 Chapter 1에서 소개하고, Template을 사용하는 자잘한 techniqueue을 Chapter 2에 모아두었다. 이어서 Template을 이용해서 구현하는 굵직굵직한 주제들이 나온다. Typelists, SmallObjAllocator, Generalized functor, Singleton, Smart pointer, Object Factory, Abstract Factory, Visitor, Multi Method가 그것들인데, 잘 알려진 패턴이거나 현재 Library TR에서 adopting 중인 것이기 때문에 어쩌면 이미 잘 알고 있는 사람도 있을 것 같다. (저자인 Andrei Alexandrescu가 CUJ의 고정 칼럼 필자이기 때문에, CUJ에서도 이미 다루어졌던 주제들이 많다.) 어떤 것들은 이것이 쓸모가 있는가 싶을 정도인 것도 있고, 어떤 것들은 당장 내 코드에 반영할만한 것들도 있고, 또 내가 직접 구현해보고 싶은 것들도 있다. 확실히 template을 잘 쓰고 싶은 사람이라면 한번쯤은 거쳐가야할 책인 듯 싶다.

 

(참고로 이 글은 요즈음 만들고 있는 MovableTypeWriter로 작성한 글.)

Inside C#, Modern C++ Design 더 읽기"