블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2737)
Unity3D (817)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
04-18 17:47
using System.Text.RegularExpressions;

    static void Main(string[] args)
    {
        string str = "abcwDW2";
        System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^[0-9a-zA-Z가-힣]{1,100}$");
          bool ismatch = regex.IsMatch(str);
        if (!ismatch)
        {
            Console.WriteLine("숫자와 영문 소문자,대문자,한글만 입력가능합니다.(글자제한1~100)");
        }
    }



출처 : http://hoons.kr/board.aspx?Name=QAASPNET&BoardIdx=21361&Page=1&Mode=2

 

 

반응형
Posted by blueasa
, |


일본 어느 네티즌이 아내의 이상 행동에 대해 글올리고 질문했는데

능력자들이 그림에 노래까지 만들어 영상으로 만듦...ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ

반응형
Posted by blueasa
, |

nullptr

Programming/C# / 2010. 10. 26. 16:06

일본사이트의 내용을 네이버번역 및 수정 한 것입니다. 

nullptr

C++에서 포인터가 아무값도 없을 때NULL을 사용하듯이, 핸들이 아무값도 없을 때는 nullptr을 사용합니다.

초기화하고 있지 않는 핸들은nullptr로 설정되어 있습니다.

nullptr은 C++/CLI의 키워드이며,C++과 같이 0이 아닙니다.

핸들이bool값과 같은 취급을 받을 때는nullptr은 비교를 하는 의미가 됩니다.

String^ s;
if(s)  // if ( s != nullptr )(와)과 같다   ...
bool isnull = !s;  // bool isnull = s ==nullptr; (와)과 같다

[출처] nullptr|작성자 난이s

반응형
Posted by blueasa
, |

[펌] 프로그래머에 관한글

Etc / 2010. 10. 25. 21:22
프로그래밍이란 절대 코딩이 아니다. 먼저 생각하고 만든 것을
  정리하고 문제점을 해결해 나가는 모든 과정이 프로그래밍이다.
  이 점을 자기 자신에게 충분히 납득시켜야 한다. 코딩은 프로그래밍
  의 일부이다.

- 각 언어는 모두 나름의 탄생 이유가 있으면 그 언어를 만든 사람의
  아이디어가 담겨 있다. 언어를 먼저 선택하려 하지 말라.
  유능한 프로그래머는 절대 한 가지 언어에 집착하지 않는다.

언어를 처음 배울 때에는 그에 걸맞게 쉬운 언어부터 시작하라.
  실전에서 사용하는 언어를 먼저 배워두면 더 이득이 될 것이라고
  생각하지 말라. 전문 프로그래머가 되려면 최소한 세 개 이상의
  언어를 익혀야 한다. 물론 세 가지 언어를 똑같이 잘 할 필요는
  없다. 자기 주 종목 언어를 갖지 말라는 말이 아니다.

- 책을 다 읽고 나서야 프로그래밍할 수 있다고 생각하지 말고
  배운 만큼만 갖고도 연습 코드를 작성할 수 있어야 한다.

- 언어 그 자체는 여러분의 상상력을 키워주지 않는다. 상상력은
  여러분 스스로 인생의 모든 영역에서 듣고 배우면서 채워야 한다.
  언어는 상상력을 실현할 도구만 제공할 뿐이다. 과학과 수학에
  관심을 가져 보라(그렇대고 해서 A 등급을 맞을 만큼 잘 할 필요는
  없다).

주석과 문서화 버릇을 들이자. 프로그래밍의 귀찮은 일부가 아니라
  매우 중요한 핵심 부분이다.

- 언어책이 줄 수 있는 지식의 양은 딱 그만큼이다. 여러분의 상상력과
  프로그래밍 능력을 살찌워주는 것은 다른 사람, 다른 프로그래머다.
  적극적으로 프로그래밍 사용자 모임 또는 뉴스그룹에 참여해 남을
  돕고 남으로부터 도움을 받는것이 자기 계발의 원천이다.

자기가 습득한 지식은 자기만이 볼 수 있는 형태든 아니면 홈페이지를
  통해 누구나 볼 수 있는 형태든 상관없이 정리하는 습관을 갖자.
  무엇이든 막상 글로 적으면 자신이 얼마나 피상적으로 알고 있는지
  각성하게 되고 지식을 좀 더 견고하게 만들게 된다.

- 현실은 현실이다. 영어를 잘 못하고 두려워하는 사람이 최고의
  프로그래머가 되기는 거의 불가능하다. 여러분이 한국어만 하면
  한국 프로그래머의 지식만 습득할 수 있을 뿐이다. 영어를 두려워
  하지 않는다면, 그 대가는 전세계 프로그래머의 지식 습득이 된다
  (영어를 잘 하는 방법은 영어를 잘하는 사람에게 물어보라).


반응형
Posted by blueasa
, |

C++/CLI Singleton

Programming/C++/CLI / 2010. 10. 22. 16:12
public ref class MySingleton sealed
{
public:
	static MySingleton (void);
private: MySingleton (void);
public: static property MySingleton ^ mySingleton
{ MySingleton ^ get()
{ return m_mySingleton;
} } private: static MySingleton ^ m_mySingleton;
};

출처 : mine


ref class MyClass {
    // If you use a getter for 'instance' you can avoid 'initonly' keyword
    static MyClass^ instance = gcnew MyClass();

public:
    ...

    static property MyClass^ Instance
    {
        MyClass^ get()
        {
            return instance;
        }
    }
    ...
};

출처 : http://www.ureader.com/msg/14523461.aspx




반응형
Posted by blueasa
, |

작년 11월 14일 KGC 2008에서 발표했던 강연의 문서입니다



 

[출처] [본문스크랩] [GameDev] KGC 2008 - C#을 사용한 빠른 툴 개발|작성자 구리구리

반응형

'Programming > C#' 카테고리의 다른 글

작성된 프로그램에 의해 윈도우종료가 문제될 때  (0) 2010.10.28
nullptr  (0) 2010.10.26
C#에서 C함수 사용하기  (0) 2010.10.20
스레드를 사용하는 2가지 방법  (0) 2010.10.14
재귀함수 호출로 트리뷰 구성  (0) 2010.10.13
Posted by blueasa
, |

조직내 침묵현상

Etc / 2010. 10. 21. 18:03

 어느 조직에서나 있을 법한 일이며, 이로 인해 정신적, 육체적으로 피해를 받기도하고 업무 진행에 방해가 되기도 한다.

결국 리더가 변하지 않으면 해결될 수 없는 문제이다.

 리더가 되었을 때 이런 실수를 하지 않기 위해서 꼭 읽어둘 필요가 있는 글




출처 : http://blog.naver.com/nkein82

[출처] 조직내 침묵현상|작성자 구리구리

반응형
Posted by blueasa
, |

 "d3dx9math.h"를 include할때 이전에 정의되어있는 'new'때문에 에러가 발생했다.

그렇다고 기본new를 그냥 undef하고 사용하기는 찝찝해서 아래와 같이 잠깐동안만 기본new를 undef하고

다시 선언하는 방법을 사용해 에러를 없앴다.

 

// 이전의 new를 저장했다 다시 디파인
#pragma push_macro("new") // 기본new를 저장
#undef new // 기본new를 삭제
#include "d3dx9math.h" // 이 파일에 같은 이름의 new 매크로가 존재
#pragma pop_macro("new") //  저장해둔 기본new를 로드



출처 : http://blog.naver.com/nkein82?Redirect=Log&logNo=100088967998

반응형
Posted by blueasa
, |
Visual C++ 위자드로 자동 생성되는 코드들 중에서 stdafx.h 와 stdafx.cpp 이 있다. 

여기에서 stdafx 란 Standard Application Freamworks 의 약자로 개발자들의 생산성 향상을 위해 MS 에서 제공하는 소프트웨어 라이브러리 체계를 뜻하며, MFC 로 구성되어 있다. 참고로 많이 사용되는 application framework 로는 .NET Framework( Windows 계열 ),  Cocoa ( Objective C / Mac OS X), Swing (Java) 등이 있다.

그럼 Precompiled header (미리 컴파일된 헤더. 여기에서는 precompiled header 로 통일) 란 무엇인가... 

C / C++ 언어에서 헤더 파일은 C 전처리기(preprocessor) 에 의해 자동적으로 소스 코드를 포함하게 된다. 

그런데 일부 헤더 파일의 경우 방대한 크기의 소스 코드를 포함할 수 있고( 예를 들면 window.h), 이런 코드들을 매번 컴파일하면 컴파일 시간이 매우 길어지게 된다. 그래서 자주 바뀌지 않는 기본적인 라이브러리들의 경우에 컴파일 시간을 줄이고자 컴파일러가 사전에 헤더 파일들을 미리 컴파일 해 놓고 쓸 수 있게 하고 있다. 

이렇게 컴파일 시간을 줄이기 위해 사전에 컴파일한 결과물이 VC 의 경우 pch(precompiled header) 라는 확장자 명으로 저장된다. 비주얼 스튜디어의 솔루션 폴더에 생기는 프로젝트명.pch 가 바로 그것이다. precompiled header 를 사용할 경우 precompiled header 로 지정한 헤더 파일 및 소스 코드는 컴파일시에 컴파일 되지 않고 pch 의 결과물을 가져다 사용하게 되는 것이다. 


자.. 이제 원리를 이해했으니 많은 궁금중들이 풀릴 수 있다. 


질문 1 ) stdafx.h 와 stdafx.cpp 파일의 용도가 무엇인가요?  stdafx.h 가 포함하는 정보는 무엇들인가요? 

앞서 말했듯이 MFC 에서 자주 사용되는 공용 소스들을 precompiled header 로 만들어 제공하기 위해 디폴트로 stdafx.h 와 sfdafx.cpp 이 위자드에서 자동 생성되는 것이다. 참고로 precompiled header 는 stdafx.h 외에 다른 파일들을 설정할 수도 있다. (아래 그림과 같이..)

VC 에서는 프로젝트 속성 - C/C++ - 미리 컴파일된 헤더 항목에서 Precompiled header 사용 여부를 선택할 수 있다. 



stdafx.h 에 포함하는 내용들을 살펴보면 윈도우 객체 생성에 필요한 기본 클래스 (afx.h / afxwin.h 등),  윈도우 컨트롤( afxctl.h / afxcmn.h 등), 기본 DB 관련 클래스 ( afxdb.h / afxdao.h ), 네트워크 관련 클래스 ( afxsock.h ) 등등 기본적인 프레임워크 구축에 필요한 필수 헤더들이 포함되어 있다. 

질문 2 ) 다음의 에러들은 무엇인가요 

에러 : fatal error C1010: unexpected end of file while looking for precompiled header directive
미리 컴파일된 헤더 지시문을 찾는 동안 예기치 않은 파일의 끝이 나타났습니다
( 혹은 버전에 따라 "Did you forget to add '#include "stdafx.h"' to your source?" 라는 문구가 표시되기도 함 )

해결방안 :  precompiled header 를 사용하도록 설정된 상태에서 컴파일을 하였는데 precompiled header 를 찾지 못했다는 의미. 
보통 해당 소스코드에 stdafx.h 가 인클루드 되어 있지 않거나, stdafx.h 의 위치가 잘못 되어 있어서 발생한다.  
stdafx.h 를 소스코드의 가장 위쪽에서 include 하도록 해 주면 된다. 
혹은 precompiled header 가 잘못 세팅되어 찾지 못하는 문제일수도 있다. precompiled header 를 사용 안함으로 체크하여 pch 를 현재 소스 코드에 맞게 재 생성을 해 준다. 

에러 : fatal error C1853: "Debug/test.pch" is not a precompiled header file created with this compiler

해결방안 :  현재 소스 코드에서 사용할 수 있는 pch 와 버전이 맞지 않는다는 의미. 
precompiled header 를 사용 안함으로 체크하여 pch 를 현재 소스 코드에 맞게 재 생성을 해 준다. 

참고로, precompiled header 를 사용 안함으로 체크할 경우 매번 전체 헤더파일을 재빌드 하므로, 아래와 같이 "미리 컴파일된 헤더 만들기"를 선택하여 최초에 한번 pch 를 만들어 주면, 그 다음부터는 precompiled header 사용하기를 선택하여 사용할 수 있다. 



질문 3 ) 그렇다면 stdafx.h 에 어떤 내용을 넣으면 되나요 

앞서 말했듯이 stdafx.h 는 한번만 미리 빌드해 놓고 그 다음부터는 재빌드 안하고 쓰는 모듈들이 되야 하므로, precompiled header 인 stdafx.h 에는프로젝트 진행 중에 거의 값이 바뀌지 않는 외부 라이브러리나 전역 변수 등의 내용을 포함시키면 된다.
이들을 pch 로 만들어 놓고 빌드하면 매번 재빌드 하지 않고 컴파일 시간을 많이 줄일 수 있다. 

참고로, GCC ( .gch ) ,  C++ Builder ( vcl.h ) 등에서도 precompiled header 를 지원한다. 

참고 : Wikipedia - Precompiled header 

precompiled header 를 씁시다 (제발)


반응형
Posted by blueasa
, |

일전에 Dependency에 대한 고찰이라는 글로, Dependency의 종류와 xDepend 툴들을 소개한 적이 있습니다.

이번 POST는 윗 글의 연장선상으로 Dependency 를 해결하기 위한 올바른 설계 방법 몇가지를 소개하고자 합니다.

물론 재미난(?) 그래프로 여러분의 시스템의 Depedency를 파악하는 것을 보여드리고 싶지만..  모든 일에는 순서가 있는 법.  여러분이 와 닿는 그림과 코드로 간단히 설명드리도록 하겠습니다.

Dependency가 없는 상태로 시스템을 구축한다는 것은 불가능합니다. 재사용의 미덕이 바로 Dependency의 또다른 이름이기도 하죠.

어떻게 하면 Dependency를 잘 관리할수 있을까?  그 해답을 제시해주신  아키텍트를 소개하고자 합니다.

그 분은 바로 Object Mentor의 Robert C. Martin 입니다.  Clean Code의 저자로써 알려져 있지만, 사실 이것보다  이름을 더 크게 알리게 한 주역은 패턴의 5가지 법칙(OCP, DIP, LIP, ISP, SRP)입니다.

그런데 이 5원칙의 빛에 가려 숨겨진 Principle이 하나 있는데요.  이름하여 패키지 구조의 원칙들(Principles of Package Architecture) 입니다.

이 논문에서 Dependency를 깨거나 완화하는 방법들을 여러분에게 소개하고자 합니다.

1단계: Circular Depedency를 무너 뜨려라

Circular Dependency는 패키지 소프트웨어를 만드는 구조에서 꼭 피해야 되는 구조입니다. 바로 Change Propagation (변화 전파)이 체인을 이루어 구성될수 있기 때문입니다.

여러분의 모듈중 일부분에 변화를 가하면, 다른 것들이 연쇄적으로 체인과 같이 묶여 변화를 한다면 어떻게 될까요?   생각만 해도 무시무시한 일이죠. 결국 그래프를 이루는 모든 모듈에 대해서 검증(테스팅)을 해야 하는 문제가 발생합니다.

Robert C. Martin은 Circular Dependency를 끊는 방법으로 완충작용을 해줄 새로운 Package 생성 또는  Interface 를 통해 변화를 상쇄시키는 방법을권하고 있습니다.

개발자라면 누구나, Try.. Catch문을 걸어서 발생한 오류를 화면에 MessageBox로 뛰워 본 경험이 있을 겁니다.  이렇게 되면 바로 위 그림과 같은 Circular Dependency가 발생하게 됩니다.

이 그림은 통신 모듈에 필요한 에러사항들을 GUI 관련 모듈을 통해 출력하다 보니, 이 세가지가 연관성을 갖게 되는 것입니다.   이러한 관계를 끊기 위해서 Robert C. Martin은 아래와 같이 새로운 Package를 만드는 것을 권고하고 있습니다.

시스템에서 사용하는 모든 메세지(Error 메세지를 포함)를 관리하는 Manager를 별도로 두어,  GUI와 통신 모듈이 한 방향으로 Dependency를 구성해 Circular Dependency를 끊어 버린 경우입니다.

이런 상황에서는  Log4X (NET, J)처럼 Attribute(AOP) 이용해 기존 모듈에 영향을 최소화하거나,  Listener를 이용해 IoC를 구성하는 것도 좋은 방법입니다. (IoC는 뒷부분에서 언급하도록 하죠)

또 다른 형태의  Circular Dependency를 보도록 합시다.

이 것은  두 패키지를 구성하는 내부 모듈들간에  간접적인 Circular Dependency가 생겼습니다.  하지만 Interface를 통해서 완충 장치를 두어 해결한 경우입니다. 이건 그림을 보니 다 아실것이라 생각이 들어서 패스하도록 하죠 :)

2 단계: 무거운 Dependency를 깨뜨리는 무기, IoC (Inversion of Control)

무거운 Dependency라고 해서 읽으신 분이 의아해 하셨을 겁니다.  이 의미는 모듈간에 강력한 결합으로 인하여  쉽게 테스트하거나 확장하기 어려운  상황에 무거운(Heavy) Dependency라고 합니다.

또는 전에 언급했던 Implementation Dependency에서 특정 모듈이 없으면 아예 돌아가지도 않는 상황을 말하는 Hard Dependency라고 봐도 무방합니다.

01 // your API
02 public class Tracer {
03     MessageQueue mq = new MessageQueue(…);
04     public void Trace(string message){
05         mq.Send(message);
06     }
07 }
08  
09 // your customer’s program that is hard to test
10 Tracer tracer = new Tracer();
11 public void ProcessOrder(Order order){
12     tracer.Trace(order.Id);
13     
14 }

이 소스 코드는 Tracer를 MessageQueue 로만 데이터를 추적할수 있기 때문에, Tracing이 어렵고 확장성 역시 떨어집니다.  MessageQueue에서 다른 형태로 출력을 하기 위해서는 결국 Tracer를 수정해야 되는 문제가 발생하죠.

그래서 IoC (Inversion of Control)을 적용하여, 다양한 방법으로 데이터를 추적할수 잇는 TraceListner를 아래와 같이 설계를 해봅시다.

01 // your better API using IoC (Inversion Of Control)
02 public abstract class TraceListener {
03     public abstract void Trace(string message);
04 }
05  
06 public class Tracer {
07     TraceListener listener;
08  
09     public Tracer(TraceListener listener){
10         this.listener = listener;
11     }
12  
13     public void Trace(string message){
14         listener.Trace(message);
15     }
16 }
17  
18 // Dependency Injection
19 Tracer tracer = new Tracer(new FileListener());
20  
21 public void ProcessOrder(Order order){
22     tracer.Trace(order.Id);
23     
24 }

소스에서 보이는 IoC의 핵심 키워드인 XXXListenr(TraceListener)를 통해서 MessageQueue외에도 File, XML과 같은 다양한 형태로 출력을 할수 있을뿐만 아니라, 확장성과 테스팅이 좀더 용이 하게 되었습니다.

3단계: NINJA가 도와 드려요! 한발더 Dependency Injection (NInject)

IoC를 이용하여 좀더 변화에 유연하며 확장 가능한 소스코드가  생성되었습니다.

하지만 FileListener를 XXXListener로 변경을 위해서는 소스 코드를 변경하거나 Metadata 형식 (Component Configurator)를 직접 구축해야 합니다.

이러한 문제점들을 한방에 해결해 줄수 있는 정보들을 실시간을 삽입,삭제 변경할수 있는 Dependency Injection Container가 나왔습니다.

Container를 통해서 이제 우리는 Dependency의 제어가 한결 더 쉬워졌습니다.

위 의 예를 잠시 이용해 볼까요?


출처 : http://arload.wordpress.com/2008/12/07/dependency_managment/

반응형
Posted by blueasa
, |