C++ programs using the Standard Template Library (ie/ #include ) cause a large part of the library to be statically linked into the binary. The need to statically link the stdc++ into the binary is two fold. First MSVCRT.dll does not contain C++ stdlib constructs. Second the legal implications of generating a libstdc++.dll are restricted by the licensing associated with the library. If you wish to keep your file size down use strip to remove debugging information and other verbatim found in the binary.

strip --strip-all SOMEBINARY.exe

왜 C++에는 finally 키워드를 제공하지 않을까? #

아마 java개발자라면 의문시 되는 질문일것이다.
반대로 C++개발자로서는 왜 java나 C# 같은언어에서 저런 키워드를 제공하고 있는것일까 의문이 들수도 있을것이다.


Resource acquisition is initialization #

Stroustrup의 해답은 C++에서는 "finally" 키워드 보다 낳은 테크닉인 RAII(resource acquisition is initialization)가 있기 때문이라는 것이다.

RAII의 핵심은 소멸자에 있다
C++ 에서는 "finally"에서 해야할 동작(메모리, 리소스 해제..)을 각각의 객체의 소멸자에서 처리 할수 있기 때문에 오히려 더 OOP적인 아닌가 생각이 든다.

자기의 뒷처리(?)를 왜 남에게 맡기는가 ....


Why doesn't C++ provide a "finally" construct? #

Because C++ supports an alternative that is almost always better: The "resource acquisition is initialization" technique.

The basic idea is to represent a resource by a local object, so that the local object's destructor will release the resource. That way, the programmer cannot forget to release the resource


- "Bjarne Stroustrup's C++ Style and Technique FAQ"

http://kldp.org/node/27158

위 쓰레드에서 가장 인상 깊은 코드라고 하면 C++ Template Metaprogramming 으로 작성한 코드가 아닐까..

#include <iostream>
using namespace std;


template <int i>
void Say()
{
    Say<i-1>();
    cout << i << ". I will not throw paper airplanes in class" << endl;
}

template <>
void Say<0>() {}


int main()
{
    Say<100>();
}


class template 의 상속을 이용한 코드
아래 코드는 Base 클래스가 먼저 초기화 되야 한다는 규칙을 이용한 코드이다.

#include <iostream>
using namespace std;


template<int i>
struct C : C<i-1>
{
    C() { cout << i << ". I will not throw paper airplanes in class\n"; }
};
template<> struct C<0> {};


int main()
{
    C<100> c;
}


#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <functional>

using namespace std;

#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>

namespace std {
    namespace tr1 = boost;
}


// 테스트용 클래스
class CInt
{
public:
    CInt(int n = 0)
    {
        n_ = n;
    }

    CInt(const CInt &t)
    {
        n_ = t.n_;
    }

    const CInt& operator=(const CInt &t)
    {
        if (this != &t) {
            n_ = t.n_;
        }
        return *this;
    }

    const CInt& operator=(int n)
    {
        n_ = n;
        return *this;
    }

    ~CInt() {}

public:
    void Print(string str) const
    {
        cout << n_ << str;
    }

    int Get() const
    {
        cout << n_;
        return n_;
    }

    operator int() const
    {
        return Get();
    }

   

private:
    int n_;
};


void Write(int n, string str)
{
    cout << n << str;
}
   

int main()
{
    std::vector<int> v;
    std::vector<CInt> vc;

    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
        vc.push_back(i);
    }

    std::random_shuffle(v.begin(), v.end());
    std::random_shuffle(vc.begin(), vc.end());

    string sep = "-";

    // 기존 C++ 바인딩
    for_each(v.begin(), v.end(), bind2nd(ptr_fun(Write), sep));
    cout << endl;

    // 새로운 C++ 바인딩
    for_each(v.begin(), v.end(), tr1::bind(Write, ::_1, sep));
    cout << endl;

    using boost::lambda::_1;

    // lambda 표현식
    for_each(v.begin(), v.end(), cout << _1 << sep  );
    cout << endl;


    // 기존 C++ 바인딩
    for_each(vc.begin(), vc.end(), bind2nd(mem_fun_ref(&CInt::Print), sep));
    cout << endl;

    // 새로운 C++ 바인딩
    for_each(vc.begin(), vc.end(), tr1::bind(tr1::mem_fn(&CInt::Print), ::_1, sep));
    cout << endl;
}

무엇때문에 잘못됬는지는 모르겠지만..

컴포넌트를 등록했는데도 자꾸 아래와 같은 에러가 난다.

서버 개체 오류 'ASP 0177 : 800401f3'

Server.CreateObject 실패

/asp.asp, 줄 13

잘못된 클래스 문자열입니다.



꼬박 반나절을 뒤지고 찾아낸 결과..

레지스트리의  HEKY_CLASSES_ROOT 에 읽기(쓰기) 계정이 현재 로그인된 계정밖에 없었다.


아래 사이트에서 힌트를 얻음..
http://support.persits.com/show.asp?code=PS01032622

'Dev > Windows' 카테고리의 다른 글

.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14
DLL 파일 찾는 순서  (0) 2007.05.14
DLL export  (0) 2007.05.14
_beginthread, _beginthreadex  (0) 2007.05.14
VB 지원중단..  (0) 2005.03.23

1.
이제는 C#을 본격적으로 사용해 줄때가 된거 같다.

 

이전에는 사람들과의 업무 연관성 때문에(혼자 개발하는것이 아니기 때문에) 사용하기 꺼렸지만
이제는 그런것들이 무의미해진것 같다.

 

오히려 C++로 STLport니 boost를 이용하는것 자체가 더 복잡해지는 느낌이다.

 

Generic 기능의 C#은 맘에 든다.
( C++ Template 에서의 자유분방함은 덜하지만 그래도 나름대로 훌륭하다 )

 


이제는 .Net Framework 2.0을 모든 PC에 설치만 하면된다 -_-v

 

 

 

2.
Visual C++ 8.0의 라이브러리 배포정책이 발목을 잡는다.

 

정리하면 DLL Hell의 대안으로 CRT및 기타 DLL라이브러리들을 /Windows/WinSxS 폴더에 넣어두고 Side-by-side Assembly 라는 정책으로 버전별로 사용할수 있게 하는것이다.

 

그래서 라이브러리를 배포하던가 .manifest 파일을 만들어 라이브러리를 지정해주는 방식으로 사용을 해야한다.


테스트 해본 결과 XP이상 버전 부터 해당되는것 같다.

 


참고.
http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary

 

 

 


3.
Subversion을 사용하라.

 

CVS보다 좋고 SourceSafe보다 깔끔하다.

그러하면 코딩 생활이 더 윤택히 질것이다.

 

 

'Dev' 카테고리의 다른 글

Visual Studio Code, Python 개발환경 구축  (0) 2020.01.27
OS 커널 관련된 글들..  (0) 2008.09.01
Subversion 아직은...  (0) 2004.12.06
공익 광고 ..  (0) 2004.11.29
버전관리툴  (0) 2004.11.24

Solving "The underlying connection was closed: An unexpected error occurred on a send." (Webservices)

 

Sometimes when you invoke a webservice the call fails with the following exception:

 

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at ...

 

In some cases the first call to the webservice works just fine, but if in the following few minutes no new call to the webservice is made, the next call would throw the exception shown above. This problem could be solved by altering the generated proxy class; in the GetWebRequest function the KeepAlive property must be set to false. This can be accomplished by following these steps:

  • Add a Web Reference using the normal way (if you haven't already added one ofcourse).
  • Make sure Show All Files menu item is enable in the Project menu.
  • In the Solution Explorer window, navigate to:
    • Web References
      • <Name of your webservice>
        • Reference.map
          • Reference.cs (or .vb)
  • Open the Reference.cs file and add following code in the webservice proxy class:
    protected override System.Net.WebRequest GetWebRequest(Uri uri)
    {
     System.Net.HttpWebRequest webRequest =
      (System.Net.HttpWebRequest) base.GetWebRequest(uri);
     webRequest.KeepAlive = false;
     return webRequest;
    }

'Dev > .NET' 카테고리의 다른 글

SerializeToXML - C#  (0) 2009.08.10
C# Web Service -> REST  (0) 2009.08.09
Integrating WCF Services with COM+  (0) 2008.09.03
Interop 응용 프로그램 배포  (0) 2007.10.05
RCW, CCW  (0) 2007.10.04

MS 비주얼 베이직 지원 중단「올 것이 왔다!」

http://www.zdnet.co.kr/news/enterprise/0,39024412,39134585,00.htm

 

MS, 비주얼 베이직 지원 중단「비난 불구 강행」

http://www.zdnet.co.kr/news/enterprise/0,39024412,39134657,00.htm

 

 

Visual Studio.NET 2002, Visual Studio.NET 2003 이 나왔고 하반기이면 Visual Studio.NET 2005 가 출시가 되는 시점에서 1998년도에 런칭된 VB가 여태까지 자~알 버티고 있었다.

그런데 이제 혹시나 하는 다음 버전의 미련을 슬슬 접어야 될듯 하다.

 

물론 개인적으로 주력으로 사용하고 있지는 않지만 MS개발툴 중에서는 Native Code를 만들어내는 가장 편리한 도구임은 부정할수 없다.

 

이제 앞으로 Native Code를 만들어내는 것은 MS 환경에서는 VC++로 만족을 해야하나..

성능과 기능 향상으로 VB의 다음 버전을 만드는것도 그리 나쁘지는 않는데..

2%의 아쉬운 마음이 든다.

그리고 개인적으로 VB.NET은 맘에 안든다.. 차라리 내가 VB 주력 개발자라도 C#.NET 쪽으로 이전 할것이다.

 

 

 

 

 

볼랜드 경영진에게, C++빌더 개발자들의 오픈레터(초안 1.7f)

http://www.borlandforum.com/impboard/impboard.dll?action=read&db=news&no=258

 

C++빌더를 되살리기 위한 서명 운동에 참여합시다!

http://www.borlandforum.com/impboard/impboard.dll?action=read&db=news&no=259

 

 

볼랜드도 비슷한 경험을 했다.

 

한때 C++ Builder도 불투명한 미래를 가지고 있었으나 빌더 개발자들및 사용자들에 의해 볼랜드측에 어필을 하여 단종을 면할수 있었다.

 

차기버전은 델파이와 빌더가 같이 포함된 .NET 환경및 Native 환경의 개발을 할수 있는 통합환경을 제공 할것 같다.

 

'Dev > Windows' 카테고리의 다른 글

.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14
DLL 파일 찾는 순서  (0) 2007.05.14
DLL export  (0) 2007.05.14
_beginthread, _beginthreadex  (0) 2007.05.14
서버 개체 오류 'ASP 0177 : 800401f3'  (1) 2007.03.29

Subversion는 버전 관리를 위해 버클리 DB를 사용한다.

CVS 보다 많은 장점을 가지고 있으면서도 아직도 사용자를 못끌여 들이는 이유 ..

DB가 잘 깨진단다.  -_-;

 

머 차차 낳아질꺼라 보지만 서도 ...

아직은 개인적인 용도로만 사용을 해야될것 같다.

 

 

http://codian.net/blog/archive/0408211736330952_M_2004_09.html#0409221120182999

http://openlook.org/blog/opensource/0409DangerousSubversion.html

http://miren.info/nucleus/?itemid=51

 

 

흐흐흐 ...

'Dev' 카테고리의 다른 글

Visual Studio Code, Python 개발환경 구축  (0) 2020.01.27
OS 커널 관련된 글들..  (0) 2008.09.01
요즘, 단상..  (0) 2006.03.28
공익 광고 ..  (0) 2004.11.29
버전관리툴  (0) 2004.11.24

사용자 삽입 이미지

 

모 백화점 지하에서 맘마를 먹고 1층에서 공익광고 수상작을 전시하는 곳을 발견.

잠깐 들러 몇장의 사진 찰칵 했다.

 

 

사용자 삽입 이미지

이것은 미국광고 였는데 가정의 총기 보유로 인한 총기사고에 대한 내용이었다.

어린이들에게 무방비적으로 노출되어 있는 총기 관리에 대해 조심하라는 내용이다.

 

요즘 우리나라 지하철에서도 게임 중독으로 인한 폭력성 문제에 대한 공익 광고를 본적 있다.

내 지론중 하나.. 애들의 모든 안전과 잘못은 어른들의 책임이다.

 

이 광고를 본후 가장 처음으로 떠오른 것은 "BEAVIS & BUTT - HEAD EXP" 의 OST에 실렸던 "99 Ways To Die" 란 곡의  Megadeth 뮤직 비디오 이다.

비슷한 내용을 담고 있다.


 

 

사용자 삽입 이미지

"당신은 누구의 딸을 클릭 하고 있습니까"

원조교제에 관한 내용이다.

자기 딸이라도 저러겠는가?


 

사용자 삽입 이미지

"이웃집은 천리길"

약간은 상투적이긴 하지만 서도 ...


 

사용자 삽입 이미지

무리한 각성제 다이어트 오남용에 관한 일본 광고 이다.

다른 환경오염 광고 사이에 있던것. 

카펜터스의 여자 보컬도 각성제 남용으로 죽었다. 쩝.


 

사용자 삽입 이미지

담배피우는 권리도 있지만 아기를 건강하게 키울 권리도 더 많이 있다.

 

 

사용자 삽입 이미지

나와 다른 것에 대해 터부시 하거나 무시할 필요는 없다고 본다.

그들이 보기엔 내가 별종 일수도 ...

 

'Dev' 카테고리의 다른 글

Visual Studio Code, Python 개발환경 구축  (0) 2020.01.27
OS 커널 관련된 글들..  (0) 2008.09.01
요즘, 단상..  (0) 2006.03.28
Subversion 아직은...  (0) 2004.12.06
버전관리툴  (0) 2004.11.24
예전에는 버전관리툴의 필요성을 못느꼈었다.

못느꼈다기 보다  유용함을 못느꼇다는게 맞을것이다.

 

그런데 ASP.NET 프로젝트를 하면서 여러사람이 같은 프로젝트 파일을 관리를 해야할 일이 생기다 보니 자연스럽게 버전관리툴의 필요성을 느낀것이다.

물론 StandAlone 환경에서도 탁월한 선택이다.

 

 

간단히 끄적 거리는 정도의 사용이지만 지금까지 사용해본것을 나열 하자면 ...

 

 

- VSS(Visual Source Safe)

이것은 MS에서 Visual Studio에 번들로 나와 MS 툴과 궁합이 잘 맞지만 그다지 평이 좋은거 같지도 않고 별로 끌리지 않는 툴이다.

 

http://msdn.microsoft.com/vstudio/previous/ssafe/

 

 

- CVS

아마 가장 전통있고 유명한 툴일것이다.

플랫폼관계없이 사용할수 있고 사용자 층도 가장 두껍고 그리고 가장 중요한 오픈 소스 프로젝트 이다.

 

클라이언트 툴로 WinCVS를 사용해본 결과 설정 해줘야 할것도 좀있고 많이 불편하다는 생각이 들었다. (물론 내가 무지한 탓도 있다)

 

https://www.cvshome.org/

http://www.wincvs.org/

http://www.tortoisecvs.org/

 

 

- TeamSource

볼랜드 툴에 번들로 제공되는 것이다.

윈도우 환경에서 사용할 수있고 서버가 필요하지 않는 환경이다. (원격은 네트워크 드라이브를 이용..)

사용 해본것중 가장 많이 사용해봤으며 심플하고 성능면에서도 괜찮다고 생각이 들었다.

그러나 번들로 제공된것이다 보니 더이상의 버전업을 없고 볼랜드에서도 StartTeam 이란 툴을 인수해 밀고 나가는것 같다.

 

 

- Subversion

CVS의 단점을 개선하고자 나온 차세대 버전관리 오픈소스 프로젝트 이다.

 

클라이언트 툴인 TortoiseSVN를 통해 사용해 봤는데 CVS와 비슷하면서도 프로젝트를 관리하는데 좀더 편하게 사용할수 있게 만들었다.

 

그리고 TortoiseSVN는 윈도우 탐색기를 통해 관리를 할수 있게 되어 있어 다른 툴보다는 사용하기가 편하다는 장점이 있고 TeamSource처럼 TortoiseSVN는 개인저장소를 만들수 있어 서버없이도 사용할수 있다 ^^ 

(CVS도 TortoiseCVS 클라이언트 툴이 있다)

 

앞으로 좀더 사용해 봐야 알겠지만 주로 사용하게 될 툴이 아닐까 생각이다.

 

Subversion에 대한 내용 :http://wiki.kldp.org/wiki.php/Subversion?action=show

 

http://subversion.tigris.org/

http://tortoisesvn.tigris.org/

 

사용자 삽입 이미지

 

 

'Dev' 카테고리의 다른 글

Visual Studio Code, Python 개발환경 구축  (0) 2020.01.27
OS 커널 관련된 글들..  (0) 2008.09.01
요즘, 단상..  (0) 2006.03.28
Subversion 아직은...  (0) 2004.12.06
공익 광고 ..  (0) 2004.11.29

+ Recent posts