|
IT활용 2007. 12. 7. 16:44
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
날짜 : 2007-12-07
저자 : hanburn
문서작업이 필요해서 UML을 간만에 그리려고 Visio를 사용해서 그리고 있었습니다. 셰이프를 UML로 선택해서 UML을 작성하는데, 익숙하지 않아서 인가 불편하더군요.. 뒤에서 지나가던 회사 동료 ‘병찬씨’가 StarUML을 써보라 해서 검색해보니 소스포지에 있더군요..
용량은 20MB정도 되구요, 서버가 느려서인지 저는 받는데 조금 걸리더라구요. 설치해서 띄우니까 이런~ 이런~. 모니터가 2개인 듀얼 환경인데 모니터 경계에 반반씩 걸처서 정중앙에 화면이 뜨네요 ㅎㅎ
그리고 클래스 다이어그램을 만들면, 클래스 이름으로 아래처럼 사람이름이 나옵니다. 총 9명으로김현수, 김기현, 이민규, 이장우, 정윤태, 금덕규, 김정일, 임헤진, 배란경등등..
이 StarUML을 만든 사람들이 한국사람인가 라는 생각에 sourceforge를 다시 유심히 살펴봤습니다. 역시나 다움과 같은 역사가 있는 프로그램이네요..
역사
* StarUML은 이전에 "플라스틱(Plastic)" 혹은 "아고라 플라스틱(Agora Plastic)"으로 알려져 있습니다.
1996년 |
Plastic의 최초 버전(v0.9) 탄생. 그것은 모듈과 그것들 사이의 의존관계만 표현할 수 있는 매우 단순한 것이었습니다. |
1997년 |
플라스틱 1.0 발표. 프리웨어, OMT-지원, 현대전자주최 전국대학생소프트웨어공모전 대상수상 |
1998년 |
플라스틱 1.1 발표. UML 클래스 다이어그램 지원. |
1999년 |
주식회사 플라스틱소프트웨어 설립. 플라스틱 2.0 출시. UML 지원, Java 코드 생성 및 역공학 지원 |
2001년 |
플라스틱 3.0 출시. UML 1.3 전체 다이어그램 지원 |
2003년 |
플라스틱 2003 출시. 모든 소스 코드가 완전히 다시 작성됨, UML 1.4 전체 지원, 개방형 아키텍처 채용. |
2005년 |
아고라 플라스틱 2005 출시. 국제화, 확장 가능한 플랫폼 구축. 'GS(Good Software)인증' 획득. |
2005년 |
StarUML 5.0 개명 및 출시. 오픈 소스 프로젝트로 전환, UML 2.0 지원, 표기법-확장 기술 구현. |
사용해 보니 완성도가 있다 생각했는데, 예전의 플라스틱이 OpenSource로 전환한 것이 군요.
우리나라에서 예전에 플라스틱 UML의 좋다는 얘기를 들었었는데, 이렇게 오픈소스로 만나게 되니 묘한 느낌이 듭니다. 주식회사를 만들었다가, 아마도 돈주고 구입하는 사람이 적어서 그냥 오픈소스로 전환시키도 떠나버린게 아닌가 걱정도 되구요. 사실이라면 같은 개발자로 씁씁한 마음이 듭니다. 또는 개인적인 사정으로 회사를 접었을 수도 있겠지만요.. 개인적으로 나름대로 우리나라의 소프트웨어 시장의 열악한 사정으로 작은 벤쳐들이 꽃을 못피우는게 아닌가 아쉽습니다.
아무튼 현재 무료로 사용할수 있는 StartUML 강력 추천입니다.
아래에 한글로된 자세한 정보가 있습니다.
정보 : http://staruml.sourceforge.net/ko/index.php
다운받기 : http://staruml.sourceforge.net/ko/download.php
사회&문화 2007. 12. 6. 14:17
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
날짜 : 2007-12-06
저자 : hanburn
인터넷을 서핑하다가 재밌는 것을 발견했습니다. 예전에 천리안이나 하이텔등의 PC통신을 했던 분들이라면 ansi에 대해서 기억의 저편에 향수로 간직되어 있을 것입니다. 80*25의 텍스트 모드에서 화면을 꾸미기 위한 하나의 방법이었죠.. 외국의 누군가 스타워즈를 무척이나 사랑하는 사람이 만든 것으로 추정이 되는 ansi버전의 스타워즈 입니다.
다음의 방법으로 볼 수가 있습니다.
1. 윈도우에서 ‘실행’을 시작시켜 ‘cmd'를 입력하여 콘솔 화면을 띄운다.
2. 다음명령을 실행킨다. ‘telnet towel.blinkenlishts.nl’
그러면 아래처럼 콘솔에서 스타워즈 스토리가 시작된다. ㅎㅎ
나름대로 에니메이션 효과도 있다~ ㅋㅋ
초반의 우주선에서 레이져 광선이 나가서 비행중인 우주선도 격추시키는..
역시 IT업종에 있는 사람들중에 비범한(?) 사람들이 많습니다. 끈질긴 집념은 배워야 됩니다. ^^
IT활용 2007. 12. 3. 14:48
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
날짜 : 2007-12-03
저자 : hanburn
IE(Internet Explorer)를 7.0으로 업그레이드를 한지 2~3달 된거 같습니다. 그리고 Flash Player도 최신버전인 9.0으로 설치를 하였습니다. 그런데 언제부터인지 IE가 자꾸 죽습니다. 죽으면서 오류정보를 MS로 보내고 나면 flash player에서 발생한 오류라고 하면서 아래처럼 지금은 딱히 방법이 없다는 군요..
이거 누구에게 문제 제기를 해야 하는지.. 아무래도 flash player 하고 IE하고 궁합이 잘 않맞아서 그런거 같은데..
컴퓨터에 Firefox 2.0도 있는데, 아무래도 사용빈도가 IE가 많다 보니까 IE에서 죽는 문제를 자주 경험하게 되는 것 같습니다. 요즘 왠만한 사이트에서 플래쉬를 사용하고 있고, 하루에도 몇번씩 죽는 IE를 보다보면, 이제 짜증이 나기 시작합니다. 우리나라 환경에서 Firefox로 않되는 곳이 많아서 그냥 IE를 주로 쓰고 있었는데, 이제 Firefox를 주로 사용하다가 않되는 곳에서만 IE를 써야할런지..
그럼 왜이렇게 IE는 자주 죽을까요? 아마도 MS에서 IE에 여러가지 추가기능을 넣을 수 있도록 나름대로 Open한 Add-on 프로그램이 아닐까 생각됩니다. 툴바나 BHO 객체, ActiveX등의 잡다한 것들이 달라붙어 같은 프로세스에 있다보니 이중에 어느 하나가 문제를 잃으키면 컨테이너 역할을 하는 IE의 프로세스가 죽어버려서 사용자는 “IE가 또 죽네~”라고 생각을 하게 됩니다. 그래서 문제를 일으키는 녀석을 잡아서 지워버리거나 사용을 중시시켜야 하는데, flash.ocx의 경우에는 사용을 안 할수도 없고~ 대략 난감합니다. 조금 검색해보면 9.0의 버전은 문제가 많아서 8.0 버전을 사용하는 사람도 꽤 되더군요.. 저도 8.0버전으로 down grading을 해보아야 겠습니다.
Flash.ocx 9.0을 삭제하려고 ActiveX라서 Windows->Downloaded Program Files 폴더에서 찾아보니 않보이더군요.. 이상하군.. 그래서 제어파의 프로그램 추가/삭제에 보니 있습니다. 여기서 지원주시고, 8.0 버전을 설치해야 하는데, 요츰에 찾기 힘듭니다. 국내 포털 자료실을 찾아도 않나오구요. 그래서 외국에서 찾은 파일을 첨부해 놓았습니다.
예전에 Window95/98도 참 많이 죽었습니다. 그때는 하드웨어 드라이버문제가 절반인 것을 모르고 MS에대한 생각이 별로 였습니다. 그리고 IE가 종종 죽을때마다 또 비슷한 생각을 했습니다. 저와 비슷하게 생각이 많아서인지 MS에서는 IE가 죽을 때 어떤 원인으로 해서 죽는지 에러 리포팅을 추가했습니다. 아마도 에러가 발생하는 원인을 제공하여 MS에대한 인식이 더 이상 나빠지는 것을 방지하려고 하는 의도라고 생각합니다. 사용자의 입장에서는 원망의 대상이 MS에서 다른 회사 바뀌는 것 말고는 사용상 불편한 점은 그대로인 것 같습니다. MS가 독점적인 지위에 있다보니 다른 대안이 별로 없어서 참 불편합니다. Firefox가 요즘 점점 점유율이 높아지는 이유가 IE의 대안이 되기때문이겠지요. 우리나라에서는 ActiveX 문제로 작은 대안밖에는 되지가 안습니다. 안습니다라고 말하니 정말 ‘안습(안구에 습기가 차는)’이네요~ ㅋㅋ
전 세계적으로 IE의 적활한 사용 비율을 모르지만, 만약 firefox가 지금의 IE처럼 많은 사용자들이 사용하고 있다고 가정하면, 지금의 IE보다 적거나 비슷한 비율의 죽는 문제를 일으킬 지도 모릅니다. 현재는 사용자가 적어서 에러 리포팅이 적을 수도 있으니까요? 이것은 단순히 개인적인 가정입니다.
개발 2007. 11. 30. 15:38
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
날짜 : 2007-11-30
저자 : hanburn
1. Singleton 정의
1.1 클래스 다이어그램
2. Singleton이 필요한곳
3. 구현
3.1 C++로 기본구현
3.2 Template 클래스화
3.3 template 화된 클래스 사용
1. Singleton 정의
클래스의 인스턴스가 하나만 만들어 지고 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한패턴
1.1 클래스 다이어그램
2. Singleton이 필요한 곳
스레드풀, 레지스트리 설정객체, 로그객체등
3. 구현
1. ‘single instance’ 클래스에서 private static 멤버를 정의 한다.
2. 클래스에 static accessor를 정의한다.
3. ‘lazy initialize(게으른 초기화 : 요청시 생성하는)’를 accesor에 구현한다.
4. 생성자는 protected 또는 private로 정의한다.
3.1 C++로 기본구현
class MyClass
{
public:
static MyClass* getInstance() // 스레드의 안정성 문제가 있음
{
if( m_pInstance == 0 )
m_pInstance = new MyClass();
return m_pInstance;
}
static releaseInstance()
{
delete m_pInstance;
m_pInstance = 0;
}
public:
void print()
{
std::cout<< "print.." << std::endl;
}
private:
MyClass(){}; // private
static MyClass* m_pInstance;
};
MyClass* MyClass::m_pInstance = 0;
위의 C++로 구현된 부분에는 getInstance 부분에 멀티스레드에서 안정성이 보장이 않되는 문제가 있습니다. 멀티스레드를 고려해서 m_pInstance 를 포인터대신 m_Instance로 정적 변수로 사용하면 create on demand는 구현이 되지만 destroy on demand가 되지 않는 문제가 있습니다. 객체가 많은 리소스를 사용하고 시스템의 요구사항에 최소의 메모리 사용이 필요하다면 이것 또한 문제가 될 수 있습니다.
3.2 template 클래스화
template <class Obj>
class Singleton
{
public:
static Obj* getInstance() // 스레드 안정성 문제 있음
{
if( m_pInstance == 0 )
{
m_pInstance = new Obj();
}
return m_pInstance;
}
static releaseInstance()
{
delete m_pInstance;
m_pInstance = 0;
}
private:
//Obj() {}; // 상속받는 곳에서 생성자를 private등으로 변경
static Obj* m_pInstance;
};
3.3 template화된 클래스 사용
#첫번째 방법
템플릿을 사용한 버전은 해당 클래스를 상속 받으면 Singleton 클래스로 된다. 한가지 상속을 받고 생성자를 private 또는 protected로 변경해주어야 한다. 이렇게 하면 컴파일시에 Singleton 템플릿 클래스의 getInstance()에서 new 부분에서 생성자가 private이라서 오류가 나므로 아래처럼 Singleton 클래스를 friend 클래스로 선언을 해주어야 한다.
<템플릿 클래스 상속을 통해서 정의>
class aa : public Singleton<aa>
{
friend class Singleton<aa>; // 생성자가 private이므로
public:
void print()
{
cout<< "aa::print" << endl;
}
private:
aa() {}; // 생성자는 private으로
};
<사용시에는>
aa::getInstance()->print(); // getInstance를 처음호출시 객체생성
// 기타작업
aa::releaseInstance(); // 자원을 해제할 경우 releaseInstance를 호출
# 두번째 방법
템플릿 버전을 아래처럼 사용하는 방법도 있다.
<보통 정의된 클래스>
class bb
{
public:
void print()
{
cout<< "bb::print" << endl;
}
int a;
};
<사용시>
Singleton<bb>::getInstance()->print();
Singleton<bb>::getInstance()->a = 5;
int b = Singleton<bb>::getInstance()->a;
Singleton<bb>::releaseInstance();
두번째 방법은 기존에 정의되어 있는 클래스에 Singleton 템플릿 클래스가 Singleton 컨테이너(?)역할을 하게 된다. 물론 bb라는 클래스를 정의해서 사용할 수도 있게 되므로 bb 클래스자체가 Singleton이 되는 것은 아니다. 그저 사용시에 Singleton처럼 사용이 되는 것이다.
템플릿화된 클래스를 첫번째 방법처럼 상속을 통해서 사용할 수 있고, 두번째 방법처럼 사용할 수도 있다. 템플릿 정말 매력적이다.
4. FAQ
Q : 정의대로 하나만 만들어 지고 어디서든지 접근 가능하다면 ‘전역변수’와의 차이점은 무엇인가요?
A : 전역변수는 프로그램이 시작될 때 객체가 생성되므로 객체의 라이프 싸이클(life-cycle)을 관리 할 수 없는 문제가 있음
사회&문화 2007. 11. 29. 11:54
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
요즘에 커피 종류가 참 많이 있습니다. 에스프레소, 카페라떼, 카푸치노등등.. 저는 주로 캬라멜 마끼야또를 즐겨 먹습니다. 단게 좋아 지는거 보니 나이가 들었나.. ㅋ
회사의 커피머신에도 카페라떼와 카푸치노가 있는데 맛이 비슷해서 질문을 했더니 누군가 아래의 정보를 알려 주셨습니다.
출처 : http://blog.naver.com/wagong/10013600709
|
|
|
에스프레소 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
에스프레소 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
뜨거운 물 |
|
|
|
거품낸우유 |
|
|
|
|
에스프레소 |
|
|
|
에스프레소 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
아메리카노 |
|
|
|
마키아토 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
생크림 |
|
|
|
캐러멜시럽 |
|
|
|
|
에스프레소 + 설탕 |
|
|
|
거품낸우유 |
|
|
|
|
|
|
|
에스프레소 |
|
|
|
|
|
|
|
|
|
|
|
콘파냐 |
|
|
캐러멜 마키아토 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
데운 우유 |
|
|
|
에스프레소 |
|
에스프레소 + 우유 |
|
|
에스프레소 |
|
|
|
|
|
|
|
|
|
|
|
|
쵸콜릿시럽 |
|
|
|
우유 |
|
|
|
카페모카 |
|
|
라떼 마키아토 |
카페라떼 |
|
|
|
|
|
|
(섞지 않음) |
|
(섞는다) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
생크림 |
|
|
|
|
거품낸우유 |
|
|
|
따뜻한 에스프레소 |
|
|
|
|
우유 |
|
|
|
|
|
|
|
에스프레소 |
|
|
|
설탕 |
|
|
|
|
|
|
|
비엔나 |
|
|
|
|
카푸치노 |
|
|
|
|
|
|
|
|
|
| 그림으로 아주 설명을 해주어서 따로 설명이 필요 없습니다. 스타벅스에서 먹던 캬라멜 마키아또를 생각해 보면 위의 그림대로 입니다. 섞이지 않은 상태로 에스프레소 / 거품낸 우유 / 캬라멜 시럽의 순서로 되었었는데..
근데 저는 캬라멜 마키아또를 먹을때 섞어서 먹곤 했는데, 카페라떼가 섞어서 만드는 것을 보면 왠지 섞어서 먹으면 않되는 것 같은 느낌이 드네요 ^^
IT활용 2007. 11. 26. 12:20
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
날짜 : 2007-11-26
저자 : hanburn
구글의 Desktop을 몇 일 전에 설치하였습니다. 내 컴퓨터의 모든 것들을 빠르게 찾아주는 기능과 구글의 위젯도 살펴볼겸해서 설치를 하였습니다. 설치를 하고 나니 가끔 컴퓨터가 느려지는 느낌이 있었습니다. CPU점유율은 낮은데도( 참고로 제 PC는 듀얼코어로 나름대로 최신입니다.) 컴퓨터의 하드디스크가 계속 돌아가는 것이다. 헐 이거 윈도우가 이제 느려지는 것인가 라고 생각하고 컴퓨터를 한번 밀어줘야 되나 생각을 했지요..
오늘 윈도우탐색기를 보다보니 어느새 이런 폴더가 보입니다.
“Google Desktop Data”
아하, 구글데스크탑이 검색을 위해서 인덱스를 만든다는 이야기를 들었던 터라 이 폴더가 그 데이터를 저장하는 폴더인가 라고 생각을 하고, 용량이 얼마인가 폴더 정보를 살펴 보았습니다. 이럴수가~ 자그마치 1.27GB의 용량을 먹고 있다니..
빠른 검색을 위해서 인덱싱을 어지간히도 했나 봅니다. 구글 데스크탑을 계속 써야 되는지 살짝 고민이 되네요..
구글 데스크톱을 사용하다 보니 한가지 문제가 더 발견되었습니다. 사용 PC 환경이 듀얼모니터 인데 2번 모니터에 구글 데스크톱을 오른쪽에 사이드바 형식으로 표시하게 한뒤에 데스트톱을 종료를 시켰습니다. 그랬더니 2번 모니터에서 어떤 윈도우든지 ‘최대화면’으로 표시를 하면 기존에 데스크톱이 있던 영역을 빼고 최대화가 되는 것입니다. 아마도 구글 데스크톱이 시스템의 정보를 제대로 변경시켜 놓지 않아서 발생한 것 같습니다. 헐~ 구글에서 프로그램을 이렇게 만들어 놓았을 줄이야..
혹시나 해서 다시 구글 데스크톱을 실행시키고 종료해보았습니다. 헉~ 정상 동작하네.. 이런 스샷이라도 남겨 놓을걸.. 아쉽네요..
소비자 입장에서는 이미 구글의 명성을(저는 개발자로 구글의 name value를 높이 생각하고 있습니다.) 머리속에 있는 이런 선입견 때문에 작은 버그가 구글에 대한 커다란 실망으로 다가옵니다. 구글이 조그만 신생 기업이었다면 실망도 들지 않고 오히려 이런 프로그램을 만들다니 대단하다고 놀라워 했을 것입니다.
회사가 커지고 유용한 서비스를 제공하다 보면, 소비자의 마음속에는 그 회사에 대한 신뢰가 쌓여 갑니다. 그래서 사용자는 브랜드 제품을 찾게 되는 것이고 브랜드 제품에서 발생한 작은 결함에 대해서 비브랜드 제품보다 커다란 실망(?)을 하게 됩니다. 프로그램을 개발 하는 입장에서도 사소한 것에도 신경을 써야하는 이유가 바로 여기에 있습니다. 소소한 버그 및 불편한 기능들은 지금까지 고객의 마음속에 쌓아놓은 신뢰를 갈아먹는 것입니다.
IT활용 2007. 11. 22. 15:23
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
날짜 : 2007-11-22
제저 : hanburn
구글형님이 캘린더 서비스(일정관리 및 공유기능)를 시작하자, 다음(daum)에서도 빠른 행보로 비슷한 서비스를 하고 있습니다 그래서 오늘은 이 두 서비스를 비교해보고, 일정관리의 원조(?)격인 Outlook과도 같이 살펴보도록 하겠습니다.
먼저 구글의 캘리더 모습입니다.
구글답게 캘린더 검색기능을 상단에 배치하고 있는 모습이 눈이 띄고, 날짜에 마우스를 클릭하면 새로운 일정을 입력하는 풍선도움말 모양의 UI가 보입니다. 여기서 일정만들기를 하면 간단하게 일정을 추가할수 있구요, ‘일정 세부정보수정’을 누르면 아래처럼 화면이 변경이 되어서 일정, 장소, 설명, 그리고 옵션으로 알리미, 참석자의 정보를 입력할 수 있습니다.
그리고 IE창의 크기를 resize하면 달력의 모양이 화면 크기에 맞게 조정이 됩니다. 역시 Ajax를 먼저 도입한 만큼 이런 처리가 잘되어 있습니다.
다음으로 daum의 캘린더를 살펴보겠습니다.
Google의 캘린더를 벤치마킹 해서 그런지 몇 가지 더 편리한 기능들이 들어 있습니다. 일단 UI가 한국의 네티즌에 더 어필 할 만한 디자인이구요 오른쪽 위에는 오늘의 날씨가 우리나라의 지역별로 제공되고 있습니다. 캘린더에 잘 어울리는 기능입니다. 일정을 입력하는 방식은 웹이라서 그런지 해당날짜를 클릭하면 일정입력 창이 하나 뜨는데, 마우스 오른쪽을 클릭해도 IE의 팝업메뉴와 함께 뜨더라구요.. (버그아닌지 ^^)
일정입력창에서 ‘일정자세히 입력’을 클릭하면 아래처럼 세부내용을 입력 할 수가 있습니다.
구글보다 더 좋아 보이는 것은, 알림을 메일, daum 메신저등 더 많은 방법으로 내용을 통지 받을수 있다는 것입니다.
그리고 ‘미니 캘린더’를 설치하게 되면 Outlook과 데이터도 연동이 되니 좀더 편리 할 수 있습니다. (iCal 형식이나 Outlook의 데이터는 구글도 가지고 올 수 있습니다.) 그런데 다음은 Sync형식으로 편하게 OutLook의 데이터를 가지고 오더군요.. ^^ 미니 캘린더는 OutLook에서 일정기능만 떼어서 가볍고 작게 만든 작은 프로그램입니다. 클라이언트에서 독립 실행되면서 daum의 웹과도 연동이 되니 IE없이도 편하게 사용 할 수 있을 것 같은 생각이 듭니다.
정리를 하면, 시작은 구글이 먼저 했지만, 아무래도 나중에 만든 것이 새로운 기능을 추가하고 그래서 그런지 다음의 캘린더에 한표를… 하지만 웬지 둘 다 사용은 안 할 것 같은.. ㅋㅋ
(회사에서 OutLook을 사용하고 있어서.. )
개발 2007. 11. 20. 12:00
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
날짜 : 2007-11-20
저자 : hanburn
Visual studio의 편리한 기능중에서 사용중인 변수에 마우스 오른쪽 클릭을 하면 해당 변수가 정의되어 있는 곳으로 이동하는 기능과 선언으로 이동하는 기능이 있어서 참 편리하게 사용하고 있습니다. 그런데 팝업메뉴에보면 ‘참조로 이동’ 이라는 메뉴에는 회색으로 disable 처리가 되어 있는 것을 볼 수 있습니다. 참조로 이동이라면 해당 변수가 사용되는 곳, 즉 참조하는 곳으로 이동한다는 것인데 상당히 유용한 기능이 될 수 있는 것 같은데, disable이라니.. 실망하지 마세요.. 방법을 찾았습니다.
BSC파일이라는 브라우서 소스파일을 먼저 만들어야 됩니다. 아래에서 만드는 방법을 설명합니다.
1. .BSC 파일 만들기
.BSC파일을 만들기 위해서는 커맨드 라인에서 BSCMake.exe 툴을 이용하여 만들어야 되는데, 아래의 방법으로 IDE 환경에서 간단하게 생성할 수 있습니다.
Visual Studio의 프로젝트 속성에서 아래와 같이 하면 각 소스파일(cpp파일)에 대해서 찾아보기 정보 파일을 생성할 수 있습니다.
먼저, C/C++탭의 찾아보기 정보에서 찾아보기 정보 사용에서 ‘FR’ 옵션으로 변경합니다.
이렇게 하면 각각의 소스파일에 대해서 sbr 파일이 release/debug 폴더에 생성이 됩니다.
각각의 sbr 파일을 합쳐서 .BSC 파일을 생성하려면, 속성의 일반탭에서 브라우저 정보 빌드를 ‘예’로 변경합니다.
이렇게 하고 다시 빌드를 해주면 release/debug 폴더에 .BSC 파일이 생성이 됩니다.
위의 과정을 해주면 아래그림처럼 마우스 오른쪽 버튼의 ‘참조로 이동’ 메뉴가 활성화가 됩니다.
2. 참조 이용하기
* 마우스 오른쪽을 클릭하여 ‘참조로 이동’을 선택하면 해당 기호의 첫번째 참조로 이동을 합니다. 이때 애매모호한 경우에 ‘모호성 해결’ 대화상자가 나타입니다. (많이보던 거죠 ^^)
* 다음 참조로 이동하고 싶으면 ‘Ctrl+Shift+1’ 단축키를 이용하면 됩니다.
* 기호찾기 대화상자에서 검색을 수행한 후에 표시되는 기호 찾기 결과 창에서 기호의 노드를 확장하여 기호의 참조를 탐색합니다.
기호찾기는 Alt+F12를 누르거나 메뉴의 편집->찾기및바꾸기->기호찾기에 있습니다.
관련자로 : http://msdn2.microsoft.com/ko-kr/library/95ws11cy(VS.80).aspx
개발 2007. 11. 20. 11:24
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
날짜 : 2007-11-20
저자 : hanburn
ATL 프로그램으로 WebBrowser 컨트롤을 hosting 하는 역할로 CAxWindow를 많이 사용합니다. 이 CAxWindow를 사용할때 주의를 기울이지 않으면 메모리릭(memory leak)이 발생할 수 있다고 합니다. 그리고 CAxWindow의 자체적인 버그도 있다고 합니다.
먼저, 다음은 메모리릭이 발생할 수 있는 잘못된 2가지 사용예입니다.
1번사용예
//Intialize ATL control containment.
AtlAxWinInit();
//Create container window.
HWND hWndCont = m_ax.Create(m_hWnd, rect, 0, WS_CHILD | WS_VISIBLE);
//Create & activate ActiveX control
HRESULT hr = m_ax.CreateControl("MSCAL.Calendar");
2번사용예
//Intialize ATL control containment.
AtlAxWinInit();
//Create container window
HWND hWndCont = m_ax.Create(m_hWnd, rect, 0, WS_CHILD | WS_VISIBLE);
// Create ActiveX control.
CComPtr<IUnknown> spunk;
HRESULT hr = CLSIDFromProgID(OLESTR("MSCAL.Calendar"), &clsid);
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IUnknown, (void**)&spunk);
// Activate ActiveX control.
HRESULT hr = m_ax.AttachControl(spunk);
위의 두 경우에 Create()함수는 CAxHostWindow 객체를 생성합니다. CreateControl()함수나 AttachControl()함수 또한 CAxHostWindow 객체를 생성합니다. 따라서 처음에 Create() 함수로 생성된 CAxHostWindow 객체는 소멸이 않되게 됩니다.
다음으로 ATL Containment의 메모리릭 버그입니다.
증상 : ActiveX를 ATL에서 hosting 할때에 메모리가 줄줄이 샘.
원인 : ATL내부에서 CreateAcceleratorTable 함수를 호출하는데 소멸시(release)시에 ATL에서 이것을 해제하지 않아서 발생함.
대책 :
1. Atlhost.h파일의 복사본을 만들어서 Fixatlhost.h 파일을 만든다.
2. FixAtlhost.h파일에 CAxHostWindow 클래스에 HACCEL타입의 멤버 변수를 하나 추가한다.
3. IOleInPlaceSite::GetWindowContext 메소드에서 CreateAcceleratorTabel함수의 반환값을 저장해 둔다.
4. IOleInPlaceSite::OnInPlaceDeactivate 메소드에서(Release되는 시점) DestroyAcceleratorTable함수를 호출해준다.
5. FixAtlhost.h 파일을 저장하고 atlhost.h 파일대신 include를 한다.
메모리릭이 발생하는 것은 ATL 3.0 이라네요.. ㅎㅎ
참고자료 :
http://support.microsoft.com/kb/229904 : CAxWindow Members Can Cause a Memory Leak
http://support.microsoft.com/kb/258235 : Memory Leak with ATL Containment
개발 2007. 11. 12. 11:35
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
저자 : hanburn 날짜 : 2007-11-12
마이크로소프트에서 VPL(Visual Programming Language : 이하 VPL)이라는 것도 만들었내요(july 2007). 말 그대로 코딩을 할 줄 모르는 사람들도 쉽게 그림을 통해서 프로그램을 할 수 있도록 만든 것인데요, 개념적으로 보면 재미가 있습니다.
프로그래밍에 필요한 기본적인 요소가 무었일까요? 또는 최소한으로 필요한 것은 무엇일까요? 현재의 튜링머신 구조상에서는 상수, 변수, 제어구조(비교, 반복구조)등이 아닐까 생각됩니다. 보통 우리가 사용하는 C/C++ 같은 언어는 너무나 잘 되어 있는 프로그래밍 언어입니다. 어셈블리어로 시야를 변경해 보면, 변수에 해당하는 register 나 메모리가 존재하구요, 값이 이동시키는 move 명령어, 그리고 제어구조에 해당하는 jmp 값은 명령어 들이 있습니다.
프로그래밍의 본질은(?) 변수에 값을 대입하고, 연산과 흐름을 제어 하는 것입니다.
그럼 이런 기본적인 것을 Visual 적으로 어떻게 표현을 할 수 있을까요? 궁금하지 않습니까? 아래를 보기전에 잠시 생각을 해보시기 바랍니다. 여러분이라면 어떤 방식을 사용해서 이런 것을 표현 할지를요… 때때로 발명은 재미로 시작하는 것들이 많습니다~ ㅋ
아래는 VPL의 모습입니다.
왼쪽상단에 Basic Activities에 기본적인 프로그래밍 요소들이 들어 있습니다. 변수에 해당하는 Variable, 상수에 해당하는 Data, 연산에 해당하는 Calculate, 제어구조에 해당하는 if, switch 등이죠.. 잉~ 반복문은 없나요? 네 없습니다. 연산과 if 블락을 이용해서 만들어야 합니다. 화면 가운에 Diagram 이라는 곳이 코딩(?)을 하는 공간입니다. 마우스로 해당 Activities를 드래그 하여 코딩을 하게 됩니다. 재미있죠~ ^^ 위의 코딩은 2개의 값을 입력 받아서 같으면 ‘같다’ 아니면 ‘다르다’ 를 출력하는 간단한 프로그램 입니다. 개발자라면 직관적으로 알 수 있을 것입니다. 그럼 하나 더 보도록 할 까요? 어떤 동작을 하는 것인지 추측해 보세요~
.
.
.
.
이것은 0이라는 상수를 loopInd라는 변수에 대입을 하고(set) if 비교를 통해서 5가 될때까지 +1을 해주는 코딩(?)입니다. 즉 반복구문 이죠. 이게 직관적으로 알기는 쉬운데, 조금만 복잡해져도 그림이 난장판이 될 것 같은 예감이 들지 않나요? 아니라구요? 그럼 아래를 보시구 어떤 동작을 하는지 맞추어 보세요 ㅋㅋ
|