Software Development

Indigo: The Five Minute Challenge

Don Box의 Indigo가 무엇인지/왜 Indigo를 만들었는지에 대해 ‘5분 안에 설명하기’. 영문를 읽기 싫어하는 사람들을 위해 대충 번역을 해주겠다.

The Five Minute Challenge

Indigo는 structureal contracts (schemas) 또는 behavioral contracts (message exchange pattern) 를 사용하여 software를 연결한다.

CLR과 COM을 연동하고, local type을 data contracts나 service contracts로 추출해준다. Indigo의 특히 멋진 기능은 sender와 receiver가 같은 CLR type을 공유할 필요가 없다는 것이다. (Indigo와 CLR 혹은 COM 사이에서도..)

Indigo에서 사용하는 message는 SOAP processing/data model이 기반하고 있지만, 필요하지 않다면, angle bracket을 사용하지 않을 수 있다.

여러 message transport를 지원하고 transport-level/SOAP-level 모두에서 보안과 신뢰성(reliability)을 지원한다.

System.Transactions와 queueing system과도 tight하게 연동한다.

Indigo가 local type에 독립적으로 동작한다는 점은 매우 마음에 든다. 왜냐하면, Indigo와 같은 integration solution에서 가장 큰 문제 중 하나가, platform (예를 들면, programming language) 별로 local type을 어떤 common type으로 static하게 binding 해야한다는 점이 solution을 매우 구리게 만드는 점 중의 하나였기 때문이다. php와 C++ 간의 data mapping을 예로 들면, php 상의 array는 (요즘 대부분의 dynamic language에서 그런 것처럼) 실제로 hash이다. 하지만, C++의 array는 hash가 아닐 뿐더러, size 정보조차 없다. 물론 standard library (container)를 사용할 수 있다. 하지만, std::vector를 선택할 것인가? 아니면 hash container를 추가할 것인가? 논의가 이렇게 되면 C++ 개발자는 raw array를 돌려달라고 외친다. Microsoft의 경우 local type의 문제는 CLR에서 어느 정도 해결했겠지만, non-CLR platform에서는 다시 이 문제가 불거지게 마련이므로, Indigo에서 이러한 점을 해결(?)한 것은 매우 훌륭하다고 생각한다. 아마도 구현상으로는 XML messaging이 이러한 점을 해결해주는 것이 아닐까 하는데, contract 상에 정의된 데이터 모델과 local type 사이의 변환이 매우 자유로운 스타일 정도가 아닐까 생각된다. 자세한 것은 좀 더 살펴봐야할 듯 하다.

Message 자체와 Message Transport의 분리, 그리고 거기에 Aspect의 형태로 여러가지 서비스(Transaction, Security, …)를 붙일 수 있는 점은 매우 훌륭한 architecture인 것 같다. 물론 CORBA도 이러한 architecture이고, EIP 같은 책에서도 이러한 architecture를 언급하고 있으므로 절대 처음은 아니다.

SOAP/XML은 Service간의 integration을 위한 Web Services에서는 표준 프로토콜이 되었지만, 하나의 Service 내에서의 component/module 간의 integration에 과연 XML을 사용하는 것이 맞는 solution일까 하는 의문이 든다. 성능 때문에 XMLRPC도 버리는 마당에 말이다. (이것이 미신은 아니라고 생각한다.) angle bracket 없이 SOAP data를 전송한다는 것도 흥미로운 점인데, 일종의 binary protocol인지 아니면 단순히 약간의 성능을 위한 tweak인지가 궁금하다.

Why Indigo? : The Five Minute Challenge

대부분의 소프트웨어 개발은 이미 만들어진 코드와 이미 저장된 정보를 서로 붙이는 (gluing together) 것이다. 순수하게 처음부터 개발을 시작하는 (pure green fields development) 사치를 가진 사람은 거의 없다.

Microsoft나 업계 전체의 현상태는 integration (CORBA, DCOM, EDI)와 access (JNDI, JDBC, JMX)를 위한 여러 solution들을 만들어내고, 개발자들이 알아서 해결하는 것이다. Indigo에서는 XML messaging을 사용하여 interact하는 service에 기반한 새로운 범용 platform을 만들 수 있다.

중심 metaphor로 messaging을 선택한 것은, pipe의 end(역주: messaging을 주고 받는 peer/endpoint)에 사용되는 기술이 아닌, 교환되는 데이터의 통합(integration)에 집중을 하게 해준다. 이것은 great discipline으로 증명되었고, Indigo의 시작으로부터 수백명의 사람을 가진 팀(역주: Indigo 팀)이 집중을 할 수(초점을 가질 수) 있게 해주었다.

XML을 선택한 것은 진입점(bar of entry)을 가능한 한 낮게 해주었다. 돌아보면, XML stack은 상당히 복잡해졌고, (XSD, XML DSIG, XML Encryption, XQuery) 나는 XML 대신 Lisp S-Expressions에 기반한 architecture를 원했었다. 하지만 우리는 XML을 선택했다.

“service”란 용어를 선택한 것은 사실 어느 정도 임의적이다. 업계는 XML message를 사용하는 code에 대해 용어를 필요로 했고, “service”는 그 첫번째 용어였다. “SOA”의 인기(glow)가 사그라들기 시작하면, 우린 다른 이름을 사용하게 되리라고 확신한다. (예를 들면, “business agents”?)

재미있는 의문은 도대체 왜 Microsoft가 이것을 하느냐이다. 그것은 쉽다. 우리는 새로운 platform을 만들기 위한 local execution의 토대를 필요로 했고, CLR을 만들었다. CLR-based platform은 distributed/heterogeneous integration/access를 위한 토대를 필요로 하고 있고, 따라서 Indigo를 만들고 있는 것이다.

“Message”라는 metaphor를 왜 썼느냐보다, ‘metaphor’를 적극적으로 활용하고 있는 것이 인상적이었다. 우리 회사의 경우, 개개의 ‘requirement’가 개발의 주축을 이루기 때문에, 결과물인 product는 공유된 ‘metaphor’를 가지지 못하는 문제가 있는 것 같다. 진짜 문제는 ‘metaphor’가 없는 것이 아니라, 이로 인해, 해당 product의 정체를 아무도 모른다는 것이고, 또한 앞으로 어떤 방향으로 나가야할 지를 모른다는 것이다.

Indigo가 완성되면, CLR과 함께 엄청난 시너지를 발생시킬 것 같다. 어떻게 보면 ‘reinventing wheel’처럼 보이지만, ‘wheel’은 승합 마차에 쓰이느냐, 전차에 쓰이느냐에 따라 새로 발명할 필요도 있는 것이다.

Indigo: The Five Minute Challenge 더 읽기"

OOPSLA '2004

OOPSLA는 10월 24일부터 시작하는 Object technology에 관한 ACM conference이다. 본인도 참석하려 하였으나, 제출한 paper가 accept되지 않는 바람에, 기분이 나빠서 안가기로 했다..는 것은 농담. 아직도 병역의 의무를 다하지 못한 본인은, keyword라도 살펴볼 생각에, 프로그램이나 살펴보기로 하였다.

개인적으로 눈에 띄는 topic을 다룬 것들을 몇몇 뽑아보았다. Google에서 찾을 수 있는 것들은 link도 걸어놓았으니, 참고.

Tutorials

  • Model-Driven Software Development: Introduction & Best Practices
    Markus Voelter, Indepdendent Consultant
    Jorn Bettin, SoftMetaWare
  • Scrum and Agile Project Management
    Angelika Langer, Independant Trainer/Mentor/Consultant
  • Generative Software Development http://www.swen.uwaterloo.ca/~kczarnec/gsdoverview.pdf
    Krzysztof Czarnecki, University of Waterloo
    Jack Greenfield, Microsoft Corporation
  • Feature Oriented Programming and Product-Lines http://portal.acm.org/citation.cfm?id=776935 (ACM Portal로의 link이니 필요한 사람은 개인적으로 contact 바람.)
    Don Batory, University of Texas at Austin
  • Testing Component-Based Software
    John McGregor, Clemson University

Practitioner Reports

  • Synchronization-Free Concurrency: Comparing the RTSJ to C++
    Daniel Dvorak & William Reinholtz, Jet Propulsion Laboratory, California Institute of Technology

Technical Papers

Workshops

  • Patterns for Retrospectives http://www.cs.unca.edu/~manns/retropatterns.html
    Linda Rising, Independent Consultant
    Mary Lynn Manns, University of North Carolina at Asheville
  • Early Aspects 2004: Aspect-Oriented Requirements Engineering and Architecture Design http://www.early-aspects.net/events/oopsla04ws
    Ana Moreira, Universidade Nova de Lisboa
    Awais Rashid, University of Lancaster
    Elisa Baniassad, Trinity College
    Bedir Tekinerdogan, University of Twente
    Paul Clements, Carnegie Mellon University
    Joao Araujo, Universidade Nova de Lisboa
  • Component And Middleware Performance http://nenya.ms.mff.cuni.cz/projects/corba/oopsla-workshop
    Petr Tuma, Charles University, Czech Republic
    Paul Brebner, University College London, United Kingdom
    Emmanuel Cecchet, INRIA Rhone-Alpes, France
  • Objects in Large Distributed Applications III (OLDA-III) http://www.dcs.gla.ac.uk/~pd/OLDA3/
    Peter Dickman, University of Glasgow
    Karen Renaud, University of Glasgow
    Huw Evans, Kelvin Institute

OOPSLA '2004 더 읽기"

Double-Checked Locking

Double-Checked Locking은 C++/Java 세계에서는 Singleton 또는 Lazy Initialization을 구현하는데에 잘 알려진 idiom이다. DCL은 Singleton object를 생성하는 부분에 필요한 synchronization cost를 절약하기 위한 방법이다. (자세한 내용은 다음 paper를 참고. “Double-Checked Locking” http://www.cs.wustl.edu/~schmidt/PDF/DC-Locking.pdf)

하지만, DCL은 compiler optimization 문제와 Multiprocessor에서의 cache coherence 문제 때문에 portable하게(Memory barrier를 사용하지 않고) 동작하는 것이 불가능한 것이라고 한다. (자세한 내용은 Scott Meyer가 정리한 다음 note를 참고. “Double-Checked Locking, Threads, Compiler Optimizations, and More” http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf)

이러한 문제는 C++이 memory model(e.g. memory read/write ordering)을 명시하기 않기 때문이라고 볼 수도 있고, Java에서는 Memory Model의 개선을 통해 이 문제를 해결하려는 것 같다. (http://www.cs.umd.edu/~pugh/java/memoryModel/)

관련 링크들

Double-Checked Locking 더 읽기"

rpm vs dpkg

흔히 rpm이 dpkg에 비해 나쁘다는 얘기가 있다. 자주 들리는 얘기임에도 불구하고, 확실한 근거가 따라다니지 않으며, rpm과 dpkg를 동시에 ‘잘’ 써본 사람이 드물다는 점 때문에, ‘미신’이 아닌가하는 의심이 크게 들었다.

일단 나의 경험을 얘기해보자면, 학교 다니던 시절에만 redhat을 쓰고 이후에는 FreeBSD, 지금 회사에선 debian을 쓰고 있기 때문에, 동시에 사용하면서 비교해본 적은 없다고 할 수 있을 것 같다. 개인적으로 rpm을 사용할 때 가장 불편했던 점은 dependency에 해당하는 package들을 모두 따로 www.redhat.com이나 www.rpmfind.net에서 받아서 써야한다는 것, 그리고 cyclic dependency가 있으면 update하기가 불편해지는 점 (내가 기억하고 쓰는 rpm command line option은 ‘rpm -qa’와 ‘rpm -Uvh’ 밖에 없기 때문일지도) 이었다. 하지만, 데비안에서도 이러한 문제를 pakaging system인 dpkg가 해결하는 것이 아니라, apt가 해결하는 것이란 것은 rpm와 dpkg의 비교에서 항상 사람들이 혼동하는 사실중의 하나다. redhat에서 제공하는 상용 패키지 관리툴인 up2date가 apt에 equivalent한 product라고 볼 수 있는데, RHN에 등록해야하고 또 무료로는 불편한 점(업데이트 주기에 제한)이 있어서 사용을 그만두었었다. 하지만, 현재는 “ Yes, but it no longer uses the Red Hat Network (RHN). (It still downloads from the Red Hat servers, you just can’t use the features of the Red Hat Network.”라고 한다. (from http://www.fedorafaq.org/#up2date)

이러한 package management tool에는 up2date, yum, apt가 있다. apt야 debian에서는 검증된 시스템이지만 rpm 쪽에서는 porting 중이고 아직 신뢰할 만한 수준은 아닌 것 같다. (?) up2date는 위에서 말한대로 RHN에 관련된 문제없이 사용가능하다. 결국, rpm에서도 package management tool로서 3가지의 option이 존재한다는 것인데, 한번 써봐야할 것 같다.

결국, 내가 직접 경험한 차이도 rpm과 dpkg 자체와는 관련없는 외적인(package management) 문제라는 것인데, 주변 사람의 얘기를 들어보아도 거의 비슷한 의견을 들려주었다.

다음은 googling을 통해 얻은 rpm과 dpkg의 비교에 관한 page들인데,

사실, 단순한 package의 사용자 측면에서는 느끼기 힘든 차이들(pros and cons)인 것 같다.

다음은 RPM의 문제를 지적하고 해결책을 제시하는 article인데, 역시 마찬가지.

결론은 사용자 (특히, 나)의 입장에서 rpm과 dpkg는 별로 차이가 없으며, rpm과 함께 사용할 수 있는 package management tool(up2date w/o RHN, yum, apt)을 한번 사용해보자는 것.

rpm vs dpkg 더 읽기"

The New C++: Part 2

h2. Library TR
p. 추가되는 Library facility들에 대한 자세한 글을 쓰다보니, 너무 오래걸려서, 일단 먼저 각각에 대한 간단한 설명을 정리하려고 한다. 이 글은 JTC1.22.19768 ISO/IEC TR 19768 – C++ Library Extensions[1] 문서와 CUJ 2004년 9월호에 Herb Sutter가 기고한 Trip Report: March 2004[2]에 나와있는 정보를 기초로 하여 작성된 것이다.
h3. Smart pointers (shared_ptr, weak_ptr)
p. 일반적으로 Smart pointer는 동적으로 할당된 object에 대한 pointer를 안전하게 다루게 해줄 수 있도록 해준다. shared_ptr은 이미 표준에 포함되어있는, auto_ptr의 치명적인 결함(특히, container에 넣을 수 없는 점)을 보완하는, reference counting 방식의 smart pointer이다. weak_ptr은, shared_ptr에서 raw한 pointer를 빼내는 대신 dangling pointer 문제를 안전하게 처리해주는 pointer의 역할을 대신해준다.
h3. Tuple types (tuple)
p. pair가 2개의 type을 저장하는 generic container라면, tuple은 n개로 확장한 형태이다.
h3. Generalized function pointers (function)
p. function pointer의 역할을 하는 세가지 C++ 요소, 즉 function pointer, member function pointer, functor들에 대한 facade로 똑같이 취급할 수 있도록 해준다.
h3. Nearly complete C99 library compatibility
p. 기본적으로 모든 C99와 C++03의 차이를 반영하는 것을 목적으로 하고 있다.
h3. Hash-based container (unordered_set, unordered_map, unordered_multiset unordered_multimap)
p. 많은 C++ 사용자들이 필요로 해왔을 Hash table을 기초로 하는 container가 추가된다.
h3. Type traits (alignment_of, has_nothrow_copy, has_virtual_destructor, is_base_of, is_const, is_convertible, ..)
p. type에 대한 정보, type 간의 관계에 대한 정보들을 얻어낼 수 있는 traits들을 제공함으로써, concept check나 meta programming에 도움을 줄 수 있다.
h3. Regular expressions (basic_regex)
p. 말그대로 regular expression. ‘basic_’이란 prefix에서 짐작할 수 있듯이, string 만을 위한 것은 아니라는 것을 알 수 있다.
h3. Random-number generation(random_device, poisson_distribution)
p. C library 함수들에 비해 어떤 장점이 있는지는 좀 더 살펴봐야할 듯 하다.
h3. Mathematical special functions
p. 여러가지 수학 함수들. 본인은 잘 모르기 때문에, 관심 있는 사람은 직접 draft[1]를 참고하시길.
h3. 아직 draft에는 없지만 Trip Report[2]에서 언급하고 있는 facility들.
h4. [“N1548, A Proposal to Add a Fixed Size Array Wrapper to the Standard Library Technical Support”:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1479.html]
p. 기존의 array를 container 형태로 구현한 것. initializer 문법을 지원하면서도, 다른 container와 유사한 interface를 가지므로, 사용성을 크게 해치지 않으면서 자연스럽게 C++ Standard Library에(특히, algorithm) 어울릴 수 있다.
h4. [“N1550, New Iterator Concepts”:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1477.html]
p. 기존의 iterator가 access와 positioning을 동시에 취급하는 개념이라서 좀 더 넓은 범위의 iterator 개념을 표현할 수 없었던 문제가 있었다. 이를 해결하기 위해 두 개념을 분리하는 iterator 구조에 대한 제안.
h4. [“N1530, Iterator Facade and Adaptor”:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html]
p. 서로 다른 종류의 iterator들을 wrap하는 iterator facade와 다른 방식으로 동작하는 iterator로 변용해주는 adaptor를 정의한다. 위의 ‘New Iterator Concept’에 의존한다.
h3. Conclusion
p. 언제 쓰여질 지 모를 다음 part에서는 Evolution WG에서 언급되는 C++ language 자체에 대한 변경 사항들을 정리해보겠다. 그 다음부터는 Library TR Draft를 중심으로 흥미가 가는 내용에 대해서 자세히 써보려고 생각 중..
fn1. [“http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1540.pdf”:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1540.pdf]
fn2. [“http://www.cuj.com/”:http://www.cuj.com/]

The New C++: Part 2 더 읽기"

Log file analyzer (esp. for web server)

웹서버를 운영하면서 보안상 몇가지 statistics가 필요해서, Log file analyzer를 좀 찾아보았다.

screenshot으로 판단해볼 때, 개인적으로 사용하기에는 Awstats가 제일 나아보여서 그걸로 설치했다. 설치과정은 거의 수동에 가깝지만, 별 어려움 없이 무난했음. 몇몇 통계 수치를 (e.g. 국가별 통계) 산출하는 데에 Perl module이 필요한 듯 보인다.

이 외에 혹시 유명한 Log file analyzer가 있다면 알려주시길. (for the completeness!)

Log file analyzer (esp. for web server) 더 읽기"

Use –export-dynamic instead of -rdynamic

executable에 symbol A가 있고 shared library에서 symbol A를 사용하고, executable이 shared library를 dynamic loading (with dlopen()) 할 경우, executable의 symbol을 shared library에게 노출(export)해주려면 GNU ld의 –export-dynamic이라는 option을 사용하여야 한다. -rdynamic이 같은 역할을 하는 옵션이지만, manual에 나오지 않는 걸로 봐서 deprecated된 것으로 보인다.

BSD 계열의 native linker쪽에서 -rdynamic을 사용하던가?

다음 URL을 참고할 것.

http://www.cygwin.com/ml/cygwin/2001-03/msg01895.html
http://www.mail-archive.com/perl5-build@perl.org/msg00108.html

Use –export-dynamic instead of -rdynamic 더 읽기"

time-to-adapt

bq. SOA is a means to an end, it’s not an end in and of itself. It’s a great way, but not the only way, to enable the flow of information across disparate systems. It’s also a great way, but not the only way, to enable more flexibility in the way we build systems. A key success metric for companies today is time-to-market. However, time-to-market usually refers to the time it takes to develop something the first time. In the future, I think the time-to-adapt will become even more important than time-to-market. Flexibility – you are gonna need it.
p. from [“http://devhawk.net/PermaLink.aspx?guid=31accdb2-2491-47f2-8d8d-37c343ee9cc8”:http://devhawk.net/PermaLink.aspx?guid=31accdb2-2491-47f2-8d8d-37c343ee9cc8]

time-to-adapt 더 읽기"

The New C++: Smart pointers

h2. Library TR
p. JTC1.22.19768 ISO/IEC TR 19768 – C++ Library Extensions[1] 문서에 나와있는 정보를 기초로 하여 작성된 것이다.
h3. Smart pointers (shared_ptr, weak_ptr)
p. ‘Smart pointer’란 동적으로 할당된 object에 대한 pointer를 나타내는 object이다. C++ 프로그래머들이 흔히 가장 쉽게 떠올릴 수 있는 smart pointer의 기능이 바로 scope를 벗어나면 할당된 object를 해제해주는 것이고, 이는 바로, 이미 C++ standard에 포함되어있는 auto_ptr의 역할이다. 하지만, 이 auto_ptr는 semantic상 실용적으로 쓰이기에 치명적인 제약사항들이 있다.
p. 일반적으로 auto_ptr에 pointer를 대입하고 scope가 끝나서 해제되는 것까지는 별로 문제가 없다. 하지만, auto_ptr이 다른 곳으로 이동할 때 문제가 된다. auto_ptr이 복사가 될 때, auto_ptr은 복사가 되는 곳 (destination)으로 pointer를 옮기고 원본(source)에서는 pointer의 흔적을 지워버린다. 다시 말하면, auto_ptr의 복사가 일어날 때, 실제로는 pointer의 이동이 일어나는 것이다. (이를 ownership의 이동이라고 표현한다) 이러한 copy 방식을 destructive copy라고 한다. auto_ptr의 destructive copy 방식은 source를 가진 쪽이 더이상 pointer를 사용할 필요가 없을 때, 즉 소유권(ownership)을 이전하고 싶을 때, 매우 유용하다. 예를 들면, dynamic하게 할당된 object를 caller쪽으로 return하고 싶은 경우가 있을 수 있다.
bq.. class SomeProtocol
{
public:
typedef std::auto_ptr ResponsePtr;
ResponsePtr getResponse();
};
void foo()
{
SomeProtocol::ResponsePtr respPtr = getResponse();

// scope가 끝나면 respPtr내에 들어있는 Response 객체는 자동으로 해제된다.
}
p. 다른 한가지 예는, 다른 함수로 pointer를 전달하고 자신은 더이상 사용하고 싶지 않은 경우이다.
bq.. void foo(SomeProtocol::ResponsePtr ptr)
{
….
// scope가 끝나면 respPtr내에 들어있는 Response 객체는 자동으로 해제된다.
}
void bar()
{
SomeProtocol::ResponsePtr respPtr = someProtocol.getResponse();
….
foo(respPtr);
….
// foo에 respPtr을 복사하고 나면, respPtr은 더이상 Response 객체를 가지지 않는다.
}
p. 반면, 이러한 destructive copy policy 때문에 auto_ptr을 C++ standard library의 container에서 사용할 수 없게 된다. container들은 destructive copy semantic을 지원하지 않기 때문이다. (Assignable concept는 copy ctor 또는 assignment의 post condition으로, source와 target이 equivalent할 것을 명시하고 있다.) container에 auto_ptr을 넣는 데까지는 문제가 없다고 쳐보자. 하지만, container에서 값을 참조하기만 해도, container 내의 auto_ptr은 빈 auto_ptr이 되어버리는 것을 쉽게 상상할 수 있다. 물론 이렇게 하기 전에도 내부 동작에 의해 망가져버릴 가능성은 얼마든지 있다.
p. 따라서, scope을 벗어났을 때, 자동으로 해제되면서도, (auto_ptr처럼), container에서도 사용할 수 있는 무언가가 당연히 표준에 있어야할 것 같다. 이것이 바로 TR1에 추가될 shared_ptr이다. (현재의 표준에는 없다는 얘기)
p. shared_ptr은 말그대로 shared ownership의 방식으로 동작하는 smart pointer이다. 즉, copy가 될 때, ownership을 공유한다는 것이다. 이러한 방식을 구현하는 가장 간단한 방식이 바로 reference counting이고, TR1 draft를 에서 counter(use_count())를 explicit하게 표현하는 것을 보면, reference counting을 하는 smart pointer라고 봐도 거의 무방할 듯 하다. 그리고, shared_ptr은 CopyConstructible, Assignable, LessThanComparable 이므로, 모든 표준 container에 들어갈 수 있다.
p. shared_ptr로 공유되는 pointer를 꺼내서 사용하고 싶은 경우도 당연히 존재하기 때문에, weak_ptr을 제공한다. weak_ptr은 말그대로 weak reference를 의미하는 것이고 따라서 무효화(nullify)될 수 있는 pointer라고 보면 된다. 단순히 pointer value를 꺼내서 사용할 경우에는 (shared_ptr이 모두 사라졌을 때) dangling pointer 문제가 발생할 수 있으나, weak_ptr은 무효화여부를 체크할 수 있기 때문에, dangling pointer 문제는 발생하지 않도록 보장해주는 역할을 한다고 볼 수 있다.
p. shared_ptr와 weak_ptr은 MT safety에 대해서 별로 신경을 쓰지 않는 것 같은데, 만약에 이것이 사실이라면 과연 shared_ptr은 MT app에서는 무용지물이 되는 것이 아닐까 약간 걱정이 된다. 그렇다고 해서, shared_ptr의 구현상에서 무조건 MT safety를 보장해주는 것은 또 performance overhead를 발생시킬 수도 있는 일이고 말이다.
p. 이러한 문제를 그나마 깔끔하게 해결하고 있는 쪽이, policy-based design으로 ownership 정책, MT 지원 여부 등을 policy로 분리한 Loki[2]의 design이 아닐까 한다.
p. 관심이 있는 사람들은 다음 링크를 참조할 것.
* [“http://www.cuj.com/documents/s=7980/cujcexp2008sutter/”:http://www.cuj.com/documents/s=7980/cujcexp2008sutter/]
h3. Tuple types (tuple)
p. CS를 전공한 사람이라면 discrete mathematics에서 tuple을 배웠을 것이다. tuple은 여러개의 object를 묶어서 표현할 수 있는 일종의 container이다.
p. 현재의 표준에는 pair가 있어서 한 쌍의 object를 generic하게 표현할 수 있다. 하지만, n개의 묶음을 표현하기 위해서는 pair의 pair와 같은 꽁수를 쓰거나, 그 때마다 struct를 정의하거나 해온 것이 사실이다.
p. pair의 pair와 같은 방법을 사용할 경우에는 코드가 매우 깔끔하지 못하게 된다는 것을 쉽게 알 수 있다.
bq.. typedef std::pair > MyTableEntry;
typedef std::vector MyTable;
MyTable myTable;
myTable.push_back(make_pair(1, make_pair(“foo”, true)));
MyTableEntry foundEntry = myTable.find(…);
std::cout << "(" << foundEntry.first << ", " << foundEntry.second.first << "," << foundEntry.second.second << ")" << std::endl; p. 3개짜리 tuple이었기에 망정이지 5개 정도 된다면 그야말로 악몽이다. 복잡한 코드는 버그의 원인이 된다. p. struct를 정의하는 방법은 코드의 복잡성은 전혀 없다. struct는 단순한 object의 모음을 표현하는 데에 있어서, 어떤 개발자에게는 불필요한 기능들을 포함하고 있을 수도 있다. 그 외에도 struct는 tuple이 제공하는 여러 기능 (operator<(), make_tuple(), operator<<(ostream, ...))을 가지고 있지 않으므로 불편할 수 있다. 개인적으로는 struct type을 정의하는 순간부터 새로운 object (그것도 어설픈) 가 탄생하는 것 같아서 여러 struct들이 난무하는 상황은 꺼려지기도 한다. (C에서와는 완전히 다른 얘기다.) p. 다음 tuple의 template parameter를 보면, 더욱 확실한 감이 올 것이다. 단지 pair의 확장판이라고 봐도 거의 무방하다. bq. template class tuple;
p. template parameter list를 보면 …가 있어서 어떤 사람들은 의아해하겠지만, 이것은 새로 추가된 C++ 문법 같은 것이 아니다. 단순히, 구현에 따라 M개까지의 tuple을 지원하도록 하는 것을 의미한다. 당황스럽게도, 이것의 가장 단순한 구현 (boost의 구현)은 3개짜리 tuple, 4개짜리 tuple, …, M개짜리 tuple을 각각 정의하는 것이다. 이러한 제약이 없는 tuple을 만들 수 없으냐고 한다면, 만들 수 있다. 역시 Loki[2]를 보면 Type들의 list를 표현하는 장치를 구현하고 있는데, 이를 이용하여, 제약없는 tuple을 만들 수 있다. 하지만, 실제로 100개짜리 tuple을 쓰는 개발자는 거의 없다고 봐도 무방하므로, tr1::tuple의 접근도 acceptable하리라고 본다.
p. 관심이 있는 사람들은 다음 링크를 참조할 것.
* [“http://www.cuj.com/documents/s=8250/cujcexp2106sutter/”:http://www.cuj.com/documents/s=8250/cujcexp2106sutter/]
h3. Generalized function pointers (function)
p. 관심이 있는 사람들은 다음 링크를 참조할 것.
* [“http://www.cuj.com/documents/s=8464/cujcexp0308sutter/”:http://www.cuj.com/documents/s=8464/cujcexp0308sutter/]
h3. Nearly complete C99 library compatibility
fn1. [“http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1540.pdf”:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1540.pdf]
fn2. Modern C++ Design의 저자인 Andrei Alexandrecu가 만든 C++ library이다. [“http://sourceforge.net/projects/loki-lib/”:http://sourceforge.net/projects/loki-lib/]

The New C++: Smart pointers 더 읽기"

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 … 더 읽기"