'Program/Info Etc'에 해당되는 글 9건

  1. 2008.03.04 vs2005 원격 디버깅.
  2. 2008.02.12 .Net 자동 문서화 SandCastle, GhostDoc 2
  3. 2008.02.03 비쥬얼 스튜디오 필수 유틸 목록
  4. 2008.01.22 SVN 설치/ 사용법
  5. 2008.01.16 싱글턴 패턴
  6. 2008.01.16 MD5 암호화
  7. 2008.01.16 XML 간단한 설명
  8. 2008.01.16 USB 자동인식 방지
  9. 2008.01.16 Windwo Vista 버젼 비교

vs2005 원격 디버깅.

Program/Info Etc 2008. 3. 4. 23:24

Vs2005 기준.. 원격 디버깅..
제가 주로 사용하는 원격 디버깅의 용도는 dll 디버깅 시 입니다.

예를 들어 App.exe 라는 어플이 AppDll.dll을 로딩한다고 한다면...
App.exe 를 실행 시켜 놓은 상태에서
AppDll 프로젝트의 [Tool] [Attach to Process] 메뉴를 누르면...
대상 실행 파일을 선택하는 창이 나옵니다.
이때 App.exe를 선택하게 되면 디버깅 모드로 빠지게 됩니다.

App.exe 를 조작하다 보면 dll 을 로드 하는 부분에서 Break Point로 들어갈 수 있습니다.

원격 디버깅의 원리라던가 작동 방식에 대한 이해는 일단 뒤로 미루고....
그런데 이렇게 하면 VS2005가 죽어버리는 경우가 있습니다.
그런 분들은... Project [Property] [Debugging] 메뉴에 디버깅 모드를
[Remote Debug .... ] 이 값으로 셋팅 해보시기 바랍니다

'Program > Info Etc' 카테고리의 다른 글

.Net 자동 문서화 SandCastle, GhostDoc  (2) 2008.02.12
비쥬얼 스튜디오 필수 유틸 목록  (0) 2008.02.03
SVN 설치/ 사용법  (0) 2008.01.22
:

.Net 자동 문서화 SandCastle, GhostDoc

Program/Info Etc 2008. 2. 12. 11:34
이하 내용에 대한 문서를 복사 , 링크 하실경우에 댓글을 남겨주세요 ^^*

닷넷 자동 문서화에 대해 알아보던중 SandCastle, GhostDoc 를 발견했네요..

Tool 들의 설치

환경 : vs2008, vista

SandCastle : Xml 태그를 Help 파일로 변환해 주는 툴, MS 에서 지원하고 MSDN 이 이를 이용하여 제작되었다고 합니다
홈페이지 : http://www.codeplex.com/Sandcastle
컴파일러 다운로드 : http://www.codeplex.com/Sandcastle/Release/ProjectReleases.aspx?ReleaseId=9921
Gui 빌더 다운로드 : http://www.codeplex.com/SHFB/Release/ProjectReleases.aspx?ReleaseId=9848
SandCastle, Sandcastle Help File Builder Installer 라는 파일만 다운로드 하시면 될듯..

GhostDoc : Xml 태그 주석을 입력하는 툴
vs 2008 버젼 다운로드 : http://www.roland-weigelt.de/ghostdoc/

SandCastle 컴파일러와 gui 버젼을 다운로드 한후 설치.. GhostDoc 를 설치합니다.
SandCastle 버젼 :  Sandcastle January 2008 Release
SandCastle GUI 버젼 : 1.6.0.4 Production
GhostDoc 버젼 : GhostDoc Version 2.1.3 for Visual Studio 2008

GhostDoc 를 설치하니 VS2008을 실행 단계에서 단축키 설정을 할 수 있도록 되어있군요..
단축키를 설치하여도 되고.. 안하여도 VS2008 팝업 메뉴에 XML 태그를 입력할 수 있는 메뉴가 보이네요..

1. 우선 테스트 삼아 프로젝트를 생성한후, 소스 상에서 XML 주석을 달아 줍니다.
GhostDoc를 설치하셨다면 팝업메뉴에서 확인이 가능하죠. ^^
사용자 삽입 이미지

2. 프로젝트 프로퍼티에 >> 빌드 >> 이곳에서 XML documention  옵션을 체크 해주셔야 xml 문서를 생성하실 수 있습니다.
이옵션을 체크하고 프로젝트를 빌드하면 프로젝트 폴더에 XML 파일이 생성된 것을 확인하실 수 있습니다.
사용자 삽입 이미지

3. SandCastle HelpBuilder 를 실행시키고, 생성된 Xml 파일을 Add 시킵니다.
여기서 한가지 주의 해야 할 점은.. SandCastle이 Xml 파일과 프로젝트 빌드로 만들어진 결과물(Exe, Dll)에 대한 정보 또한 필요로 한다는 점입니다.
프로젝트 생성과정에서 결과물이 생성되는 폴더에 대한 옵션을 건드리지 않았다면 XML 애드만 시켜주시면 자동적으로 연결이 되는데요..

만약 OutPut 폴더를 다른 곳으로 걸어주셨을경우에는 우선 XML 을 애드 한후,
SandCastle 의 Edit 버튼을 누르시고   AssemblyPath 에서 아웃풀 경로를 적어주셔야 합니다. ^^*
사용자 삽입 이미지

빌드를 수행하시면 MSDN 과 같은 헬프 파일을 보실 수 있습니다.

SandCastle 옵션 설정

귀찮은 관계로 기본 옵션을 사용하기로 했습니다만..
상속된 요소들까지 헬프파일에 포함을 시켰더니 용량또한 늘어나고 빌드 시간 또한 길어지는군요..
이부분을 False 처리해주었습니다.
사용자 삽입 이미지

그리고 위 메뉴중 Help File >> Language 탭에 가보시면 한국어 또한 ^^*
GhostDoc Xml 주석달기
소스 코드 상에서 마우스 우클릭 Document this 메뉴를 클릭해보면..
함수를 예로 들경우.. 아래와 같이 자동 주석이 달리는 군요..

사용자 삽입 이미지

Tests the function << 이부분에 함수에 대한 요약을 적어 주고..
보시면 파라미터 에 대한 주석과 리턴 값에 대한 주석 또한 달아 줄 수 있습니다.

또한 함수가 아닌 클래스에 대한 정보라던지 변수에 대한 정보 또한 표현이 가능하네요..

테스트를 사내 소스로 해봤더니 공개 하기가 그르네요.. ㅎㅎ;;
완성품의 일부만 봐볼까요 ^^;;
사용자 삽입 이미지
사용자 삽입 이미지

'Program > Info Etc' 카테고리의 다른 글

vs2005 원격 디버깅.  (0) 2008.03.04
비쥬얼 스튜디오 필수 유틸 목록  (0) 2008.02.03
SVN 설치/ 사용법  (0) 2008.01.22
:

비쥬얼 스튜디오 필수 유틸 목록

Program/Info Etc 2008. 2. 3. 15:50
원데지 님의 홈피 글입니다.

http://cafe.naver.com/projecteam.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=415



이 번역은 번역과정에서 오류가 있을 수 있고 그 내용을 잘 못 전달하거나 할 수 있으므로 100% 신뢰할 수 없으나 50% 이상은 의미 전달이 될 것이라고 개인적으로만 생각합니다. --;

후반으로 갈수록 성의가 떨어집니다. 번역이 어색하고 어이없더라도 널리 이해해주시기 바랍니다.

번역자 : 유신

메일주소 : jswiz@naver.com

원문 : http://msdn.microsoft.com/msdnmag/issues/05/12/VisualStudioAddins/default.aspx

 

10가지 필수 도구

모든 개발자가 지금 다운로드해야하는 비주얼스튜디오 추가기능

이 기사는 다음과 내용을 다룹니다.

l  단위 테스트를 위한 도구

l  코드 관리와 생성 문서화 관리와 생성을 위한 도구

l  개발 환경 변경을 위한 도구

l  데이터 작업을 위한 도구

 

1.      TestDriven.NET

2.      GhostDoc

3.      Smart Paster

4.      CodeKeep

5.      PInvoke.NET

6.      VSWindowManager PowerToy

7.      WSContractFirst

8.      VSMouseBindings

9.      CopySourceAsHTML

10.   Cache Visualizer

11.   Wrapping It Up

 

지난해 저는 지금 모든 개발자가 다운로드 받아야 할 10가지 툴이라는 주제로 기사를 작성했습니다. 이 툴들은 무료로 이용할 수 있는 닷넷프레인웍을 위한 10가지 툴로 주목 받을만합니다.

올해 저는 가지고 있어야 하는 툴 목록을 다시 작성합니다. 그러나 올해 저는 단독으로 실행되는 툴에 대조되는 비주얼스튜디오 애드인(역주 : 한글 비주얼스튜디오 버전에서 추가기능이라고 표기하였으나 영어발음으로 애드인으로 표기, 간단히 얘기해서 비주얼스튜디오 에 포함되어 실행되어 개발에 도움을 주는 프로그램 임)에 초점을 맞춰보겠습니다. 비주얼스튜디오는 풍부한 확장 모델을 제공합니다. 이는 마이크로소프트와 커뮤니티 개발자들에게 애드인을 통해 풍부한 장점을 제공합니다. 어떤 애드인은 이 기능이 없다면 어찌 살수 있을까 할 정도로 중요한 역할을 합니다. 어떤 것들은 여러분들이 계속적으로 수행하는 자잘하면서도 많은 작업을 자동화 해줍니다.

 

저는 무료로 다운로드해서 사용할 수 있는 아주 좋은 비주얼스튜디오 애드인을 몇 개 소개하려 합니다. 애드인의 기본기능만 여러분에게 소개하기에도 좁은 지면이므로 애드인 각각을 대략적으로만 살펴보겠습니다.

애드인 각각은 2003에서 작동하고 이미 대부분은 2005에서 사용 가능합니다.(역주: 안 되는것도 꽤 됨, 2005에서 포함된 기능도 있음) 2005버전은 이 글을 쓰는 시점에 이용할 수 없었습니다.(역주: 번역시점에 이용 가능했음 2005 11월말), 조만간 사용할 수 있게 될 것입니다.

 

TestDriven.NET

(역주: NUnit부터 사용해볼 것)

테스트 주도 개발은 코드를 작성하기 전에 단위(Unit) 테스트의 실행하는 것입니다. 그런 테스트를 통과하기 위해 코드를 작성하는 것입니다.

코드를 작성하기 전에 테스트를 작성함으로써 여러분의 코드가 보여줘야 하는 똑같은 동작을 증명하는 것입니다. 보너스로 결국 광범위한 리팩토링이 가능하게 해주는100% 테스트를 적용할 수 있습니다.

 

여러분이 비주얼 스튜디오 팀 시스템을 사용하고 있다면 비쥬얼 스튜디오안에 이미 내장된 단위 테스트 기능이 있습니다. 팀 시스템 전에  비주얼 스튜디오 통합개발환경에 NUnit를 바로 통합해 사용할 수 있는 TestDriven.NET 애드인이 있었습니다. 제 생각에 팀 시스템 버전이 아닌 2005를 사용하거나 2003을 사용한다면 여전히 좋은 해결책일 것입니다.

 

TestDriven.NET은 통합 개발환경에 바로 단위 테스트 기능을 추가합니다. 단위 테스트를 작성하는 대신에 NUnit GUI 도구로 전환하여 테스트를 실행하고 통합개발환경의 코드로 전환하게 해주는 등 모든 작업을 바로 할 수 있게 해줍니다.

그림 1 TestDriven.NET의 새로운 테스트 옵션

TestDriven.NET 설치 후에 그림1에서 보여주듯이 오른쪽 클릭 메뉴에서 새로운 메뉴 항목을 몇 개 볼 수 있습니다. 유닛 테스트를 오른쪽 클릭으로 바로 실행 할 수 있습니다. 결과는 그림 2에 보여주는 결과 창에서 처럼 보여질 것입니다.

그림 2 단위 테스트 결과

 

통합개발환경에서 단위 테스트를 수행하는 것은 중요한 한편, 아마도 가장 뛰어난 기능은 Test With | Debugger를 선택하여 오른쪽 클릭으로 디버거를 바로 실행할 수 있는 것입니다. 그러면 디버거를 실행하고 단위 테스트를 실행합니다. 그리고 이 테스트에서 중단점을 찍을 수 있습니다.

사실상 테스트를 수행하기 위해 TestDriven.NET을 위한 단위 테스트여야 할 필요는 없습니다. 단지 public이면서 반환값이 void형인 어떤 메서드이면 됩니다. 이것은 여러분이 과거 응용프로그램을 테스트 하고 몇몇 코드를 조사해 볼 필요가 있다면 바로 TestDriven.NET을 실행해 빨리 신속하게 테스트 해볼 수 있다는 것을 의미합니다.

TestDriven.NET은 단위 테스트 또는 테스트 주도 개발을 한다면 필수적 애드인입니다. 여러분이 아직 단위 테스트를 하지 않는다면 심각하게 이를 고려해 보기바랍니다. TestDriven.NET Jamie Cansdale에 의해 작성되었고 www.testdriven.net에서 다운로드 받을 수 있습니다.

 

GhostDoc

XML 주석은 여러분의 응용프로그램을 문서화할 때 필수적입니다. XML 주석을 사용하여 여러분의 코드에 표시를 할 수 있고 nDoc과 같은 툴을 이용해 이 주석에 기반한 웹 문서와 같은 MSDN 또는 도움말 파일을 만들 수 있습니다. XML 문서가 가지는 유일한 문제점은 그것을 작성하는데 시간이 걸리고 결국 비슷한 문장을 반복해서 작성하게 되는 점이다. GhostDoc의 목표는 여러분이 작성한 클래스 또는 메서드의 이름뿐만 아니라 인자까지 보고서 XML주석을 작성하는 지루한 작업을 자동화하는 것입니다. 그리고 추천되는 명명 규칙에 기초해 문서가 어떻게 보여져야 하는지 경험 있는 추측을 할 수 있게 합니다.

이것은 여러분의 업무 규칙과 제공되는 예제의 문서화를 통해서 글쓰기를 위해 대체하는 것이 아닙니다.

그러나 신경 쓰지 않아도 되는 부분의 문서 생성을 자동화해 줄 것입니다.

예를 들어 여기에서 보여주고 있는 메서드를 생각봅시다.

private void SavePerson(Person person)

{

 

}

GhostDoc 설치 후에 메서드 선언 위에서 마우스 오른쪽 버튼을 클릭해서 Document this를 선택합니다.

그러면 다음의 주석이 추가될것입니다.

/// <summary>

/// Saves the person.

/// </summary>

/// <param name="person">Person.</param>

private void SavePerson(Person person)

{

 

}

 

보시다시피 GhostDoc은 자동으로 메서드가 어떻게 이름이 지어졌는지에 기초로 하여 요약문을 생성합니다. 또한 인자에 대한 주석도 생성합니다. 여러분은 여기서 멈추지 말고 생성된 예제에서 구조할 사람을 명확하게 지칭해서 추가적이 주석을 추가해보세요. 아래는 제가 직접 추가적인 주석을 추가한 주석입니다.

/// <summary>

/// Saves a person using the configured persistence provider.

/// </summary>

/// <param name="person">The Person to be saved</param>

private void SavePerson(Person person)

{

 

}

별도의 주석을 추가하는 일은 GhostDoc 이 자동으로 생성하는 많은 부분에 비하면 훨씬 쉽습니다. GhostDoc은 또한 기존 규칙을 수정할 수 있게 하거나 어떤 종류의 주석이 생성되어야 하는 결정하는 부가적인 규칙을 추가할 수 옵션을 포함하고 있습니다.

GhostDoc Roland Weigelt에 의해 작성됐고 www.roland-weigelt.de/ghostdoc에서 다운받을 수 있다.

 

Smart Paster

문자열은 대부분의 응용프로그램에서 중요한 역할을 합니다. 사용자에게 보내지는 메시지로 사용될 수도 있고, 시스템의 동작을 묘사하는 데 사용되는 주석이 될 수 있고, SQL 문장으로 실행될 수도 있습니다. 문자열을 가지고 작업을 할 때 개발자를 좌절시키는 부분 중 하나는 통합개발환경(역주 : 비주얼스튜디오)에 결코 제대로 붙여 넣어지지 않는다는 점입니다.

주석을 붙여 넣을 때 문자열이 너무 길거나 잘 정렬되지 않아서 줄 바꿈 문자, 주석, 탭을 삽입하는데 시간을 보내야 합니다.

실제 연결되어야 하는 문자열을 가지고 작업을 할 때 여러분은 심지어 더 많은 작업을 해야 하는데 대체로 문자열을 분리하고 문자열 연결 심볼을 삽입하거나 스트링 빌더를 이용해야 합니다.

Smart Paster 애드인은 어떤 포맷을 사용해 비주얼 스튜디오로 클립보드로부터 문자열을 붙여넣을때 오른쪽 마우스 버튼 메뉴에서 많은 명령을 제공합니다.

설치 후에 오른쪽 버튼 메뉴에서 이용할 수 있는 새로운 붙여 넣기 옵션을 볼 수 있을것입니다.(그림 3 보기)

그림 3 Smart Paster로 붙여넣기

예를 들어 여러분은 업무 로직을 설명하기 다음의 문자열을 작성할 수 있습니다.

To update a person record, a user must be a member of the customer

service group or the manager group. After the person has been updated, a

letter needs to be generated to notify the customer of the information

change. (역주: 영어 주석이므로 굳이 해석 안 함)

 

Paste As | Comment option를 이용해 비주얼스튜디오에 복사하고 붙여 넣기를 할 수 있고 다음과 같은 결과를 얻을 수 있습니다.

//To update a person record a user must be a member of the customer

//service group or the manager group. After the person has been updated

//a letter needs to be generated to notify the customer of the

//information change.

 

자동으로 주석문자와 캐리지 리턴이 삽입됩니다. (어떤 길이에 리턴문자를 넣을지 설정할 수 있습니다.) Smart Paster 도움없이 이 문자를 삽입했다면 긴 문자열을 붙여 넣고 강제로 수동으로 줄 바꿈 문자를 추가하고 주석 문자를 추가해야 했을 겁니다. 또 다른 예로 실행 시간에 값을 삽입할 필요가 있는 아래와 같은 메시지가 있다고 봅시다.

 

You do not have the correct permissions to perform <insert action>.

You must be a member of the <insert group> to perform this action.

 

Paste StringBuilder command를 이용해 비주얼 스튜디오에 StringBuilder로 문자열을 추가할 수 있습니다. 결과는 이와 같습니다.

StringBuilder into Visual Studio. The results would look like this:

StringBuilder stringBuilder = new StringBuilder(134);

stringBuilder.AppendFormat(

    @"You do not have the correct permissions to ");

stringBuilder.AppendFormat(

    @"perform <insert action>. You must be a member of ");

stringBuilder.AppendFormat(

    @"the <insert group> to perform this action.");

 

문자열중에 변수 섹션은 대체하는 코드를 간단히 수정할 필요가 있을 것입니다.

StringBuilder stringBuilder = new StringBuilder(134);

stringBuilder.AppendFormat(

    @"You do not have the correct permissions to ");

stringBuilder.AppendFormat(

    @"perform {0}. You must be a member of ", action);

stringBuilder.AppendFormat(

    @"the {0} to perform this action.", group);

 

Smart Pasters는 비주얼 스튜디오에서 문자열을 작업 관련된 많은 바쁜 작업을 없애줄 수 있을 것입니다. 이 프로그램은 Alex Papadimoulis에 의해 작성되었고

weblogs.asp.net/alex_papadimoulis/category/5341.aspx에서 이용 가능합니다.

 

CodeKeep

소프트웨어 개발 과정을 통해 작은 코드 일부분을 재사용하는 것은 일반적입니다. 아마도 여러분은 문자열로부터 열거값을 어떻게 얻어내는 예제나 여러분이 선택한 언어에 어떤 패턴을 구현하는 방법에 대해 시작 정도는 재사용할 것입니다.

비주얼 스튜디오는 코드 스니핏(코드 조각(일부분))으로 작업하기 위한 기존 다소간의 기능을 제공합니다만 그것은 소수입니다. 첫째 자신의 컴퓨터에 여러분의 스니핏 모두가 저장되는 것을 가정합니다. 여러분이 컴퓨터를 바꾼다든지 직장을 이동한다면 여러분의 코드 스니핏을 챙겨야 하는 것을 기억해야 하고 그것들을 챙겨야 합니다. 둘째 이 스니핏은 여러분만 볼 수 있습니다. 사용자, 그룹 일반 대중 사이에 스니핏을 공유를 위한 메커니즘이 없습니다.

재사용이 필요한 곳에 CodeKeep이 필요합니다.

CodeKeep은 웹 응용프로그램입니다. 어떤 언어로 작성된 코드의 스니핏이라도 공유하고 만들려는 사람들을 위한 장소를 제공합니다.

CodeKeep의 진정한 유용함은 CodeKeep데이터베이스를 통해 자신이 등록한 스닛핏 뿐만 아니라 빠른 검색을 제공하는 비주얼스튜디오 애드인이라는 것입니다.

CodeKeep 설치 후에 도구 | CodeKeep | 검색 메뉴를 선택하여 기존의 코드 스니핏을 검색할 수 있고 그림 4에서 보여지는 검색 화면을 이용합니다.

이 화면에서 여러분 자신의 스니핏을 볼 수 있고 CodeKeep에 등록된 스니핏 모두를 검색할 수 있습니다. 스니핏을 검색할 때 다른 사용자가 등록하고 공개로 표시한 스니핏 모두를 볼 수 있습니다. 여러분이 검색한 스니핏을 찾는다면 여러분은 그것을 자세한 내용을 볼 수 있고 코드에 삽입하기 위하여 클립보드에 바로 복사할 수 있습니다.

여러분은 또한 저장하기를 원하는 코드를 오른쪽 클릭으로 선택하여 CodeKeep에 보내기를 선택하여 빠르고 쉽게 CodeKeep에 여러분의 코드를 추가할 수 있습니다. 이것은 새로운 화면 열 것입니다. 여러분의 스니핏 주위에 약간의 메타데이터를 추가해 줄 것입니다. 주석을 포함해서 어떤 언어로 작성되었는지 모두에게 보여질 것인지 개인적으로 보여질 것인지를 결정합니다.

코드 일부분을 작성하거나 미래에 그것을 사용할 필요가 있다고 생각될 때마다 단순히 그것을 잠깐 시간을 내서 등록하세요. 이 방법으로 여러분은 여러분의 스니핏을 관리하거나 미래에 그것을 다시 재 작성하는 문제에 대해 걱정할 필요가 없을 것입니다.

CodeKeep은 여러분의 스니핏을 서버에 저장되어 스니핏은 중앙으로 모아 관리하기 때문에 여러분의 코드를 시스템에서 시스템으로 또는 직장에 직장으로 옮기는 것에 대해 걱정할 필요가 없습니다.

CodeKeep Arcware's Dave Donaldson에 의해 작성되었고 www.codekeep.net에서 이용 가능합니다.

 

PInvoke.NET

P/Invoke는 닷넷프레임웍안에서 본래의 Win32 API 호출에 접근할 때 사용되는 방법입니다. P/Invoke를 사용할 때 어려운 부분중의 하나는 여러분이 사용할 필요가 있는 메서드의 용법을 결정하는 것입니다. 이 것은 종종 시행 착오가 될 수 있습니다. 올바르지 않은 데이터 형식이나 값을 비관리 API에 보내는 것은 메모리 누수나 다른 얘기치 않은 결과를 초래할 수 있습니다.

PInvoke.NET 정확한 비관리 Win32 API함수를 호출할 때 사용되는 P/Invoke 용법을 문서화할 수 있는 위키입니다. 위키는 누구나 편집할 수 있는 협력 웹사이트 입니다. 또한 거기에서 정보를 이용할 뿐만 아니라 정보를 제공할 수도 있습니다.

거기에 저장되어 있는 위키와 정보는 매우 가치있고 PInvoke.NET Visual Studio 애드인을 더 가치있게 만듭니다.

PInvoke.NET add-in을 한번 다운로드해 설치했다면 새로운 내용을 등록할 뿐만 아니라 용법을 검색할 수 있을것입니다. 간단히 코드 파일 오른쪽 마우스 클릭을 하면 두개의 새로운 상태 메뉴를 볼 수 있을것입니다. PInvoke 용법을 삽입하거나 PInvoke 용법과 타입을 등록해보세요

그림 5 PInvoke.NET 사용

Insert PInvoke Signatures를 선택하면 그림 5에서 보여지는 대화상자를 볼 수 있을것입니다. 이 간단한 대화 상자를 이용해 호출하기 원하는 함수를 검색할 수 있습니다. 선택적으로 여러분은 이 함수의 부분이 되는 모쥴을 포함시킬 수 있습니다. 이제는 대부분 주요 응용프로그램에서 중요한 부분이 컴퓨터에 삐 소리가 나게 하는 기능입니다. 그래서 저는 Beep함수를 검색할 것이고 무엇이 나타나는지 보겠습니다. 결과는 그림 6과 같습니다.

그림 6 PInvoke.NET에서 Beep함수 검색

결과는 메서드의 개요를 보여줍니다. 여기서는 스피커에 간단한 톤을 생성한다라고 보여주고 있습니다. 또한 여러분은 C# Visual Basic .NET에 대해 둘 다 코드 용법을 볼 수 있다. 위키는 또한 관리 API에 대해서도 닷넷프레임웍 2.0에서 새로운 System.Console.Beep 메서드가 있다고 제안을 합니다.

또한 대화 상자 하단에는 Beep 메서드에 위키에서 해당하는 페이지로 연결할 수 있는 링크가 있습니다.

해당 페이지는 어떻게 이용하는 지 예제 코드뿐만 아니라 이 메서드와 함께 이용될 수 다양한 인수에 대한 문서를 포함하고 있습니다.

여러분이 삽입하기 원하는 용법을 선택한 후에 삽입 버튼을 클릭하세요. 그러면 여러분의 코드 문서에 삽입될 것입니다. 다음 코드는 여러분을 위해 자동으로 생성될 것입니다.

[DllImport("kernel32.dll", SetLastError=true)]

[return: MarshalAs(UnmanagedType.Bool)]

static extern bool Beep(

    uint dwFreq, uint dwDuration);

그리고 나면 여러분은 단순히 이 메서드를 호출하기 위해 코드만 작성할 필요가 있습니다. 그러면 여러분의 컴퓨터는 즉시 삐 소리를 낼 것입니다.

PInvoke.NET 위키와 애드인은 때로 관리코드에서 Win32 API와 함께 작업해야 할 때 겪는 많은 고통과 조사시간을 없애줍니다.

위키는 www.pinvoke.net 주소에서 이용할 수 있고 애드인은 사이트 왼쪽 하단 구석에 유용한 도구들 링크에서 다운받을 수 있습니다.

 

VSWindowManager PowerToy

비주얼스튜디오는 각기 다른 많은 창을 포함합니다. 이들 모두는 다른 때에 유용하지요.(역주: 작업성격에 맞게 적절한 윈도우에 정보를 얻고 설정할 수 있어 편하다는 뜻). 여러분이 저와 같다면 여러분이 개발 작업에서 다양한 점(기능)을 사용하기 좋아하는 각기 다른 윈도우 배치구조를 가지고 있을 것입니다. 제가 HTML을 작성하고 있을 때 저는 도구상자와 작업 목록 창을 감추는 것을 좋아합니다. 폼을 디자인 할 때 저는 도구 상자와 작업 목록 창을 보여주기를 원합니다. 코드를 작성할 때는 작업 목록 창을 제외한 모든 창을 감추는 것을 좋아합니다.

제가 무슨 일을 하느냐에 따라 반복적으로 창을 열고 닫고 이동하는 것은 정말 한심스럽고 시간을 소비하는 일입니다.

비주얼스튜디오는 윈도우 레이아웃 개념을 포함하였습니다. 디버깅을 시작할 때 눈치채셨을 지 모릅니다. 창이 자동으로 마지막으로 디버깅 했을 때 레이아웃으로 원상태로 되돌아갈 것입니다. 이것은 비주얼스튜디오가 일반 창과 디버그 창 레이아웃을 포함하고 있기 때문입니다.

코딩할때와 디자인할 때 대조적으로 다른 레이아웃을 사용할 수 있다면 훌륭하지 않겠습니까? VSWindowManager PowerToy가 바로 해답입니다.

VSWindowManager PowerToy 설치 후에 그림 7에서 보여지는 것처럼 윈도우 메뉴에 몇 가지 새로운 옵션을 볼 수 있을 것입니다.

그림 7 VSWindowManager 레이아웃 명령

Save Window Layout As menu(메뉴로 창 배치 저장하기)는 현재 여러분의 창 배치를 저장할 수 있게 해줍니다. power toy를 사용을 시작하기 위해서 여러분의 Windows | Save Window Layout As | My Design Layout command 메뉴를 찾아들어가 디자인을 위해 여러분이 좋아하는 방식대로 설정하십시요. 이는 현재 레이아웃을 저장할 것입니다. 저처럼 코딩 레이아웃을 선택하여 좋아하는 코딩 레이아웃과 같게 하고 세가지 자기 자신취향에 맞게 해보세요.

VSWindowManager는 현재 디자이너 또는 코드를 보고 있는지에 따라 디자인와 코딩 레이아웃 사이에서 자동으로 레이아웃을 바꿔줄 것입니다. 또한 현재 저장한 레이아웃을 선택하기 위해 Apply Window Layout menu 명령을 사용할 수 있습니다. VSWindowManager은 창을 자동으로 감추고 보여주고 재배치하여 전과 똑같은 레이아웃을 유지할 수 있도록 해줍니다.

 

WSContractFirst

비주얼스튜디오는 언뜻 보기에는 쉽지만 .asmx 파일을 만들고, 코드를 추가하고, 웹서비스를 운용할 수 있게 준비하여 웹서비스를 만들어냅니다.

ASP.NET은 웹서비스를 위한 동작과 메시지 패턴을 표현하는데 이용 되는 Web Services Description Language(웹 서비스 기술 언어, WSDL) 파일을 만들 수 있습니다.

ASP.NET을 이용해 이 파일을 생성하게 하는 데는 2가지 문제점이 있습니다. 주된 문제는 여러분이 웹서비스를 위해 만든 Contract를 제어하지 못한다는 점입니다. 이를 해결하기 위해 contract-first 개발이 필요합니다.

Contract-first(선 계약) 개발은 또한 contact-driven development(계약 주도 개발)이라 불리고 웹서비스 자체를 여러분이 실제로 작성하기 전에 웹서비스를 위한 contract를 작성하는 것입니다.

WSDL파일은 여러분이 직접 작성함으로써 웹서비스가 외부로 노출시키는 구조와 인터페이스를 포함하여 웹서비스가 어떻게 보내지고 사용될 지 대해 완벽하게 제어합니다.

WSDL문서를 작성하는 것은 재미있는 일이 아닙니다. 그것은 일종의 법률 계약서를 작성하는 것과 같습니다. 그러나 많은 양의 XML을 사용합니다.

이럴 때 적용할 수 있는 게 WSContractFirst 애드인입니다. WSContractFirst WSDL파일 작성하는 것을 쉽게 해줍니다. 서버와 클라이언트측 코드를 생성해줍니다. 두 가지 좋은 점을 얻을 수 있는데 비주얼스튜디오 스타일의 서비스 개발에서 이용되던 신속 개발이 가능하고 contract를 직접 제어할 수 있습니다.

첫단계로 WSContractFirst을 이용해 XML 스키마 파일을 만드는 일입니다. 이 파일은 메시지 또는 웹서비스에서 사용될 메시지로 정의될 것입니다. 비주얼스튜디오는 여러분의 스키마를 정의하기 위한 사용하기 쉬운 GUI 인터페이스를 제공하는데 이는 특별히 도움이 됩니다. 이것은 웹서비스 개발 과정의 중요 과정 중에 하나입니다. 정의한 여러분의 스키마가 있다면 그들 중에 하나에 오른쪽 마우스 버튼 클릭을 해서 Create WSDL Interface Description을 선택합니다. 그림 8과 보여지는 첫 단계의 Generate WSDL Wizard가 실행될 것입니다.

그림 8 WSContractFirst으로 WSDL작성

단계 1 서비스의 이름 네임스페이스, 문서화에 대한 기본정보를 수집합니다.

단계 2 서비스에 포함하기 원하는 .xsd파일을 명기합니다. 이 마법사를 실행하기 선택한 스키마가 기본적으로 포함됩니다.

단계 3 서비스의 동작을 명기합니다. 단 방향의 동작이나 요청과 응답 동작을 할지 명기할 뿐만 아니라 동작에 이름을 지정할 수 있습니다.

단계 4 동작과 메시지에 대한 상세정보를 입력합니다.

단계 5 <service>요소가 생성되어야 하는 지와 이 마법사 완료되면 코드 생성 대화상자가 자동으로 실행될지 안될지 명기

단계 6 선택적인 .xsd 경로 명기 마법사가 완료되면 여러분의 WSDL파일은 프로젝트에 추가됩니다.

 

이제 WSDL파일을 가지게 되었고 몇 가지 할 수 있는 일이 생겼습니다. WSContractFirst의 코드 생성을 실행하기 위해서 WSDL파일에서 마우스 오른쪽 버튼을 클릭해서 Generate Web Service Code를 선택합니다. 이것은 그림 9에 보여지는 코드 생성 대화상자가 실행될 것입니다.

그림 9 WSContractFirst 코드 생성 옵션

여러분은 코드에 대한 다른 옵션을 설정하고 어떤 기능을 포함되게 할지 설정할 수 있을 뿐만 아니라 클라이언트 쪽의 프록시와 서버 쪽 스텁을 생성하기 위해서 선택할 수 있습니다. 이 코드 생성 기능을 사용하여 정말 빠르게 개발할 수 있을 것입니다. 만약 여러분이 비주얼 스튜디오를 사용하여 웹서비스를 개발하고 있다면 WSContractFirst와 선 계약 개발에 대해 확실히 살펴봐야 합니다.

WSContractFirst Thinktecture's Christian Weyer에 의해 작성되었고

www.thinktecture.com/Resources/Software/WSContractFirst/default.html

에서 다운받을 수 있습니다.

 

VSMouseBindings

여러분의 마우스는 아마도 다섯개의 버튼을 가지고 있습니다. 그런데 3개만 사용하고 있지 않습니까

VSMouseBindings power toy는 사용하기 쉬운 인터페이스를 제공하고 마우스 버튼에 비주얼스튜디오 명령을 지정할 수 있게 해줍니다.

VSMouseBindings는 다양한 명령 패턴 사용을 가능하게 해줍니다. 파일을 연다든지 선택한 텍스트를 클립보드에 복사한다든지 비주얼스튜디오에서 할 수 있는 어떤 것에 대해서도 마우스 버튼에 다양한 명령을 지정할 수 있습니다.

VSMouseBindings을 설치한 후에는 VSMouseBindings이라 불리는 대화 상자 옵션에서 새로운 영역을 확인할 수 있습니다. 인터페이스는 그림 10에서 확인할 수 있습니다.

그림 10 VSMouseBindings의 비주얼스튜디오에 대한 옵션

보시다시피 주요 버튼의 각각에 명령을 선택할 수 있습니다.

아마도 여러분은 왼쪽 오른쪽 마우스 버튼이 통상적인 기능이 유용하므로 쓸데없이 기능을 지정해 혼란을 야기하지 않는 것이 나을 겁니다.

그러나 뒤로가기 버튼과 앞으로가기 버튼은 다른 기능을 할당할 것입니다. 웹브라우져의 뒤로 와 앞으로 버튼의 기능과 유한 기능을 가지길 원한다면 비주얼 스튜디오에서 뒤로 이동과 앞으로 이동 명령을 지정할 수 있을 것입니다.

이것은 여러분이 소스 에디터에서 작업할 때와 달리 HTML 디자이너에서 작업할 때 다른 설정을 적용할 수 있다는 것을 의미합니다.

 

CopySourceAsHTML

다른 색의 텍스트를 이용해 나머지 코드와 구별되면서 코드는 점점 더 읽기 쉬워지고 있습니다. 비주얼스튜디오에서 코드를 읽을 때는 노트패드와 같은 에디터에서 읽으려고 할 때보다 일반적으로 훨씬 더 쉽습니다.

이제는 여러분의 블로그에서 읽을 기회가 있거나 적어도 코드를 읽을 기회를 더 가지게 되었습니다. 일반적으로 여러분의 블로그에 괜찮은 코드 스니핏을 포스트하려고 시도할 때 예전의 평범한 텍스트로 등록하게 됩니다. 그러면 그것은 읽기 쉽지 않습니다. CopySourceAsHTML 애드인은 이와 같은 곳에서 역할을 하기 위해 나오게 되었습니다. 이 애드인은 HTML로 코드를 복사할 수 있게 합니다. 비주얼 스튜디오를 통해 적용된 색을 유지하여 블로그나 웹사이트에 쉽게 포스팅할 수 있다는 것을 의미합니다.

CopySourceAsHTML 애드인을 설치한 후에 복사하기 원하는 코드를 오른쪽 마우스 클릭 메뉴에서 Copy Source as HTML command 메뉴를 선택해서 복사하기를 선택하십시요. 이 옵션을 선택한 후 그림 11에서 보여지는 대화상자를 볼 수 있을 것입니다.

그림 11 CopySourceAsHTML 옵션

어떤 종류의 HTML 뷰를 만들지 이 대화상자에서 선택할 수 있습니다. 줄번호를 포함 할 수 있고 탭 크기를 지정할 수 있고 그밖의 많은 다른 설정을 할 수 있습니다. OK를 클릭한 후에는 클립보드에 HTML이 저장됩니다. 예를 들어 아래와 같이 시작하는 코드 스니핏이 있다 가정하지요.

private long Add(int d, int d2)

{

    return (long) d + d2;

}

HTML로 복사 선택한 후에 줄번호를 포함하는 HTML을 선택한 후에는 코드는 그림 12에서 처럼 코드가 브라우져에 보여질것입니다.

그림 12

코드를 더 쉽게 공유하거나 우리 모두가 코드의 이점들을 이해하기 더 쉬워지게 되고 더 많은 사람들이 서로 지식을 공유하고 배우려고 애쓸 것이라는 것을 의미합니다.

CopySourceAsHTML Colin Coller에 의해 작성되었고

www.jtleigh.com/CopySourceAsHtml에서 다운 받을 수 있습니다.

 

Cache Visualizer

Visual Studio 2005는 비주얼라이져라 불리는 새로운 디버그 기능을 포함합니다. 디버깅 과정중에 사람이 읽을 수 있는 데이터 뷰를 만들 수 있죠.

Visual Studio 2005 기본적으로 많은 디버거 비주얼라이저를 포함합니다. 가장 탁월한 데이터셋 비주얼라이저는 데이터셋안에 데이터를 보고 편집하는 표형식의 인터페이스를 제공하죠. 기본 비주얼라이저가 매우 유익하지만 이 새로운 인터페이스의 가장 중요한 점 중 하나는 모든 점에서 확장 가능하다는 점입니다. 단지 약간의 작업만으로 디버깅을 더 훨씬 쉽게 만들 수 있는 여러분 자신만의 비주얼라이져를 작성할 수 있습니다.

많은 사용자들이 자신들의 복잡한 커스텀 타입에 대한 비주얼라이져를 작성할 것이지만 어떤 개발자들은 이미 프레임웍의 일부를 위해 이미 비주얼라이져를 제출하고 있습니다. 커뮤니티에서 만들어진 비주얼라이져중 하나를 살펴볼 텐데 이 것은 훨씬 디버깅을 쉽게 해줍니다.

ASP.NET 캐쉬는 나중에 이를 사용하기 위해 개체의 집합입니다. 각 개체는 그 주변에 포장된(wrapped 역주: 다른정보가 덧 데어져 지는 것을 말함) 어떤 설정정보를 가지는데 이는 얼마나 오랫동안 캐쉬가 유지될지 어느 캐쉬가 의존관계에 있는지에 대한 것입니다.

디버깅 하는 동안 캐쉬안에 무엇이 있는지 얼마나 오랫동안 유지될지 또는 어떤 것이 캐쉬를 이용하는지에 대한 정보를 얻는 것은 쉬운 방법이 없습니다.

Brett Johnson은 그 부족함을 확인하고 ASP.NET 캐쉬를 조사하기 위해 캐쉬 비주얼라이져를 작성했습니다.

이미 여러분들이 다운로드해서 비주얼라이져를 설치했다면 그림 13에서 보여지는 것처럼 디버그 창에서 캐쉬 개체 옆에 새로운 아이콘을 확인할 수 있을 것입니다.

그림 13 디버깅 할 Cache Visualizer 선택

캐쉬 비주얼라이져 대화상자를 이용하기 위해 돋보기를 클릭하면 그림 14에서 볼 수 있는 것처럼 나타나고 ASP.NET 캐쉬에 현재 저장된 모든 개체에 대한 정보를 포함하고 있습니다..

그림 14 Cache Visualizer ASP.NET 캐쉬안에 개체를 보여준다.

공개 캐쉬 엔트리아래 제가 캐쉬에 추가한 엔트리를 볼 수 있습니다. 비공개 캐쉬 엔트리 아래 엔트리는 ASP.NET에 의해 추가된 것입니다.

캐쉬 엔트리에 대한 파일 의존관계 뿐만 아니라 만료 정보를 볼 수 있다는 것을 주목해주세요.

캐쉬 비주얼라이져는 여러분들이 ASP.NET으로 작업할 때 훌륭한 도구입니다. 또한 훌륭한 커뮤니티에서 개발한 미래에서 볼 수 있는 비주얼라이져의 대표가 될만한 프로그램입니다. 여러분 Brett의 블로그인 blog.bretts.net에서 캐쉬 브라우져를 얻을 수 있습니다.

 

최종 요약

이 기사는 무료로 이용할 수 있는 애드인에 대해 소개하고 있지만 합리적인 가격에 구매할 수 있는 또다른 애드인이 있습니다.

저는 여러분이 다른 선택도 확인해보길 권장하고 어떤 경우에는 통합개발환경에 굉장히 뛰어난 기능을 추가시켜줄 수 있습니다.

이기사로 비주얼스튜디오를 위한 가장 괜찮은 무료로 이용할 수 있는 애드인에 간단한 여행이 되었을 것입니다. 이 애드인 각각은 단 작은 역할이 될 수 있지만 함께 잘 활용하면 여러분이 더 나은 코드를 작성할 수 있도록 여러분의 생산성을 향상시킬 수 있도록 도와줄 것입니다.

 

번역 끝 --;

 

이밖에 닷넷 애드인

시간이 없어 자세한 설명을 못하고 (지금 이 시간 지하철 끊기게 생겼음)

CodeSmart

음 좋기는 한데 코드 분석 기능 때문에 시스템 성능을 저하합니다. 비싸기도 하고요. 40만원 크랙도 현재는 없고 나올 가능성도 적습니다. 처음 보는 분은 화려한 기능에 입이 벌어지실 것입니다.

http://www.axtools.com/

 

MZ-Tools

http://www.mztools.com/

코드 스마트보다 화려하지는 않는 코드 스마트에 없는 편리한 기능이 있어 좋습니다. 뭘까 직접 써보고 느끼시기 바랍니다. 저도 정품 없으니 메일로 달라고 요청하지 마세요.

 

Refactor Pro

http://www.devexpress.com/Products/NET/Refactor/

그 현란한 리펙토링 기능에 놀라움을 금치 못하지만 99달러

 

CodeRush

http://www.devexpress.com/Products/NET/Coderush/

코드 달려. 그치만 느려지는 속도는 어쩌라구 249달러 좀 비싸네

 

csUnit

www.csunit.org/

또다른 공짜 TestDriven.NET의 경쟁자

 

Visual Assist X

말안해도 알 듯, 이제는 닷넷도 지원하네

 

그밖의 닷넷 관련 툴

FxCop, NUnit, C# Refactory, CVS, Subversion, ClearCase, Vault, CodeSmith, NAnt, Fianal Buider

 

번역 후기

번역하고 나서 타이핑을 오래하다 보니 관절이 상당히 아프군요 거의 8시간 이상 자료 찾고 번역하고 시간이 부족해 프로그램도 다 테스트를 못했습니다. 준비 못한 데모까지 시연하려니 걱정이 앞서는 군요. 하릴없이 노는 사람이 아닌 이상 여유 시간 내서 하기 쉽지 않군요. 다음에는 작은 것만 노려서 먼저 선점하지 않는 이상 번역에는 참여하지 못할 것 같습니다.

인터넷에서 번역된 글을 읽을 때는 참 편하게 읽었습니다만 이렇게 번역하고 보니 국어실력도 부족하다는 것을 느꼈고 번역하시는 분들에게 새삼 고마움을 느끼게 됩니다.

 

여담입니다만 여러분들은 개발을 하면서 똑 같은 반복적인 작업을 반복하고 있는 자신의 모습을 발견한 적이 없습니까? 어떤 일을 할 때마다 예전에 작업했지만 기억이 나지 않아 예전의 코드를 찾는데 오래 걸리지는 않습니까? 아니면 알고자 하는 정보를 찾는데 오래 걸리지 않습니까? 새로운 정보를 얻었을 때 체계적으로 보관 관리하고 있습니까? 정해진 원칙에 맞게 프로젝트 산출물을 표준화해 문서화하고 이를 나중에 잘 활용할 수 있게 정리하고 있습니까? 아닌 분들도 있겠지만 어느 정도 공감이 가는 부분이 있을 것입니다.

개발 툴을 사용하다 보면 이런 기능이 있으면 이런 생각이 들 때가 있습니다. 예를 들어 기존 코드를 분석해주는 도구가 있었으면 하는 생각이 듭니다. 품질 좋은 코드를 만들어내기 위해 룰을 정해주는 툴이 있었으면 좋겠습니다. 각 코드요소에 설명을 쉽게 추가하고 상호참조 관계를 얻고 싶습니다. 물론 코드요소와 관련된 또 다른 요소(DB개체, 문서)를 쉽게 참고 할 수 있었으면 좋겠습니다. 코드 안에 DB개체에 대한 정보를 키 하나로 바로 접근하고 싶고, DB개체나 쿼리를 통해 이미 설계된 업무 패턴에 따른 폼을 생성하고 사용할 컨트롤을 결정하고 레이아웃을 결정하고 관련 코드를 생산해내고 싶습니다. 물론 각 언어별 또는 개발 플랫폼별(VB, Delphi, Java, C#(ASP.NET), C++(MFC), C(SDK))로 생산하고 싶습니다. 엔터티를 통해 데이터베이스 개체(저장 프로시져, 사용자 정의 함수, 커서)를 쉽게 만들어내고 싶습니다. 언어의 코드요소를 자동완성 기능을 통해 쉽게 이동하고 싶습니다. 희망사항만은 아닐 것입니다. 이미 이런 개발을 하고 계신 분들도 있고 이를 지원해주는 툴들도 나오고 있습니다. 요즘 최근 개발환경들이 이런 추세로 가고 있지만 어느 특정 개인에 맞춰줄 수 없기 때문에 개발환경을 확장해서 자신만의 도구를 만들어 신속한 개발을 할 수 있도록 각각의 개발환경은 이에 대한 확장모델을 제공하고 있습니다. 델파이에서는 이를 활용한 유명한 GExpert가 있고 자바 개발에 많이 쓰이는 이클립스는 참 많은 플러그인들이 많습니다. Visual Basic에서도 상용인 CodeSmart나 무료인 MZ-Tools 3.0이 유명합니다. Visual C++에서는 C++에서 Visual Assist WindTab 등 의 기타 추가기능 툴이 애용됩니다. 이런 툴들은 도움이 되기도 하지만 개발환경을 느리게 하는 원인이 되기도 하기 때문에 맹목적으로 많이 설치해서 얻는 이점은 없습니다. 오히려 개발환경이 느려져 개발을 더 느리게 하기 때문에 자신에 필요한 툴을 잘 판단하여 이용하는 것이 바람직합니다

'Program > Info Etc' 카테고리의 다른 글

.Net 자동 문서화 SandCastle, GhostDoc  (2) 2008.02.12
SVN 설치/ 사용법  (0) 2008.01.22
싱글턴 패턴  (0) 2008.01.16
:

SVN 설치/ 사용법

Program/Info Etc 2008. 1. 22. 14:41
퍼오려 했으나.. 로그인을 하지 않으면.. 글을 남길수가 없는.. ㅡㅠㅡ

http://tong.nate.com/deergirl/40954435

'Program > Info Etc' 카테고리의 다른 글

비쥬얼 스튜디오 필수 유틸 목록  (0) 2008.02.03
싱글턴 패턴  (0) 2008.01.16
MD5 암호화  (0) 2008.01.16
:

싱글턴 패턴

Program/Info Etc 2008. 1. 16. 09:54
[Design Patterns] 싱글턴패턴(Singleton Pattern) Design Patterns
출처 :
2007/05/10 13:25

http://blog.naver.com/jsharp83/110017404424

예전에 쓰레드풀을 만들 때, 싱글턴 패턴을 썼었는데, 그 당시에는 역시 아무것도 모르던 시절이라, 그냥 시키는데로 그냥 그렇게 만들었었다. 왜 그렇게 만들어야 되는지도 모르고,

싱글턴패턴 - 싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴이다.

싱글턴 패턴은 스레드 풀이라던가, 캐시, 대화상자, 사용자설정, 디바이스드라이버 등등 객체가 전체프로그램에서 오직 하나만 생성되어야 하는 경우에 사용한다.

그럼 전역변수로 static 으로 선언해서 사용하면 되지 않느냐... 라는 생각을 가질 수가 있는데, 이런식으로 객체를 생성하면 프로그램이 실행 될 때 이미 그 변수가 메모리에 자리잡고 있게된다. 사용도 되기전에, 만약 이 변수가 안사용된다면(그럴리는 거의 없겠지만;) 그만큼 낭비가 되는것.

싱글턴 패턴은 필요한 때 오직 하나의 객체만을 만들어서, 그것이 다시 필요한 시점에서는 전에 만들었던 객체를 리턴해준다.

public class Singleton {

private static Singleton uniqueInstance;

private Singleton()

public static Singleton getInstance()

{

if(uniqueInstance==null)

uniqueInstance = new Singleton();

return uniqueInstance;

}

}

위의 코드에서 보는 것과 같이, 오직 하나의 객체를 만들어 주기 위해 생성자를 private 으로 두고, 객체를 얻기위해선 getInstance() 함수를 호출한다.

하지만 위의 코드는 두 개의 쓰래드가 객체를 얻으려는 상황에서 먼저온 if(uniqueInstance==null)를 실행하고 Context Switching이 일어나서 두 번째 객체도 if 문을 실행하게 된다면, 결국 두 개의 객체가 생성되게 되고, 프로그램에 문제가 생기게 될것이다. 이것을 방지하기 위한 방법으론 그냥 static 메소드로 선언하여 클래스가 로딩될 때 객체를 생성해 주는 방법과, getInstance() 메소드를 synchronized 시켜주면 된다.

하지만 메소드 전체를 synchronized 시켜주는 것이 부담이 된다면 DCL(Double-checking Locking) 이라는 방법이 있다.

public class Singleton {

private volatile static Singleton uniqueInstance;

private Singleton(){}

public static Singleton getInstance()

{

if(uniqueInstance==null)

synchronized (Singleton.class)

{

if(uniqueInstance==null)

{

uniqueInstance = new Singleton();

}

}

return uniqueInstance;

}

}

소스에서 보는것처럼 uniqueInstance 가 NULL 인지를 두 번 체크하는것이다.

이렇게 체크를 한다면 처음 객체가 만들어질 때를 제외하고는 synchronized 부분에 걸리는 일이 없을 것이다.

하지만 volatile 키워드는 자바 1.4 이전 버전에서는 잘 동기화가 안된다고 한다.

또한 자바 1.2 이전의 버전에서는 가비지컬렉터가 싱글턴으로 선언된 객체를 중간에 날려먹기도 한단다.

'Program > Info Etc' 카테고리의 다른 글

SVN 설치/ 사용법  (0) 2008.01.22
MD5 암호화  (0) 2008.01.16
XML 간단한 설명  (0) 2008.01.16
:

MD5 암호화

Program/Info Etc 2008. 1. 16. 09:53
출처 : http://www.faqs.org/rfcs/rfc1321.html


Network Working Group                                          R. Rivest
Request for Comments: 1321           MIT Laboratory for Computer Science
                                             and RSA Data Security, Inc.
                                                              April 1992

                     The MD5 Message-Digest Algorithm

Status of this Memo

   This memo provides information for the Internet community.  It does
   not specify an Internet standard.  Distribution of this memo is
   unlimited.

Acknowlegements

   We would like to thank Don Coppersmith, Burt Kaliski, Ralph Merkle,
   David Chaum, and Noam Nisan for numerous helpful comments and
   suggestions.

Table of Contents

   1. Executive Summary                                                1
   2. Terminology and Notation                                         2
   3. MD5 Algorithm Description                                        3
   4. Summary                                                          6
   5. Differences Between MD4 and MD5                                  6
   References                                                          7
   APPENDIX A - Reference Implementation                               7
   Security Considerations                                            21
   Author's Address                                                   21

1. Executive Summary

   This document describes the MD5 message-digest algorithm. The
   algorithm takes as input a message of arbitrary length and produces
   as output a 128-bit "fingerprint" or "message digest" of the input.
   It is conjectured that it is computationally infeasible to produce
   two messages having the same message digest, or to produce any
   message having a given prespecified target message digest. The MD5
   algorithm is intended for digital signature applications, where a
   large file must be "compressed" in a secure manner before being
   encrypted with a private (secret) key under a public-key cryptosystem
   such as RSA.

   The MD5 algorithm is designed to be quite fast on 32-bit machines. In
   addition, the MD5 algorithm does not require any large substitution
   tables; the algorithm can be coded quite compactly.

   The MD5 algorithm is an extension of the MD4 message-digest algorithm
   1,2]. MD5 is slightly slower than MD4, but is more "conservative" in
   design. MD5 was designed because it was felt that MD4 was perhaps
   being adopted for use more quickly than justified by the existing
   critical review; because MD4 was designed to be exceptionally fast,
   it is "at the edge" in terms of risking successful cryptanalytic
   attack. MD5 backs off a bit, giving up a little in speed for a much
   greater likelihood of ultimate security. It incorporates some
   suggestions made by various reviewers, and contains additional
   optimizations. The MD5 algorithm is being placed in the public domain
   for review and possible adoption as a standard.

   For OSI-based applications, MD5's object identifier is

   md5 OBJECT IDENTIFIER ::=
     iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5}

   In the X.509 type AlgorithmIdentifier [3], the parameters for MD5
   should have type NULL.

2. Terminology and Notation

   In this document a "word" is a 32-bit quantity and a "byte" is an
   eight-bit quantity. A sequence of bits can be interpreted in a
   natural manner as a sequence of bytes, where each consecutive group
   of eight bits is interpreted as a byte with the high-order (most
   significant) bit of each byte listed first. Similarly, a sequence of
   bytes can be interpreted as a sequence of 32-bit words, where each
   consecutive group of four bytes is interpreted as a word with the
   low-order (least significant) byte given first.

   Let x_i denote "x sub i". If the subscript is an expression, we
   surround it in braces, as in x_{i+1}. Similarly, we use ^ for
   superscripts (exponentiation), so that x^i denotes x to the i-th
   power.

   Let the symbol "+" denote addition of words (i.e., modulo-2^32
   addition). Let X <<< s denote the 32-bit value obtained by circularly
   shifting (rotating) X left by s bit positions. Let not(X) denote the
   bit-wise complement of X, and let X v Y denote the bit-wise OR of X
   and Y. Let X xor Y denote the bit-wise XOR of X and Y, and let XY
   denote the bit-wise AND of X and Y.

3. MD5 Algorithm Description

   We begin by supposing that we have a b-bit message as input, and that
   we wish to find its message digest. Here b is an arbitrary
   nonnegative integer; b may be zero, it need not be a multiple of
   eight, and it may be arbitrarily large. We imagine the bits of the
   message written down as follows:

          m_0 m_1 ... m_{b-1}

   The following five steps are performed to compute the message digest
   of the message.

3.1 Step 1. Append Padding Bits

   The message is "padded" (extended) so that its length (in bits) is
   congruent to 448, modulo 512. That is, the message is extended so
   that it is just 64 bits shy of being a multiple of 512 bits long.
   Padding is always performed, even if the length of the message is
   already congruent to 448, modulo 512.

   Padding is performed as follows: a single "1" bit is appended to the
   message, and then "0" bits are appended so that the length in bits of
   the padded message becomes congruent to 448, modulo 512. In all, at
   least one bit and at most 512 bits are appended.

3.2 Step 2. Append Length

   A 64-bit representation of b (the length of the message before the
   padding bits were added) is appended to the result of the previous
   step. In the unlikely event that b is greater than 2^64, then only
   the low-order 64 bits of b are used. (These bits are appended as two
   32-bit words and appended low-order word first in accordance with the
   previous conventions.)

   At this point the resulting message (after padding with bits and with
   b) has a length that is an exact multiple of 512 bits. Equivalently,
   this message has a length that is an exact multiple of 16 (32-bit)
   words. Let M[0 ... N-1] denote the words of the resulting message,
   where N is a multiple of 16.

3.3 Step 3. Initialize MD Buffer

   A four-word buffer (A,B,C,D) is used to compute the message digest.
   Here each of A, B, C, D is a 32-bit register. These registers are
   initialized to the following values in hexadecimal, low-order bytes
   first):

          word A: 01 23 45 67
          word B: 89 ab cd ef
          word C: fe dc ba 98
          word D: 76 54 32 10

3.4 Step 4. Process Message in 16-Word Blocks

   We first define four auxiliary functions that each take as input
   three 32-bit words and produce as output one 32-bit word.

          F(X,Y,Z) = XY v not(X) Z
          G(X,Y,Z) = XZ v Y not(Z)
          H(X,Y,Z) = X xor Y xor Z
          I(X,Y,Z) = Y xor (X v not(Z))

   In each bit position F acts as a conditional: if X then Y else Z.
   The function F could have been defined using + instead of v since XY
   and not(X)Z will never have 1's in the same bit position.) It is
   interesting to note that if the bits of X, Y, and Z are independent
   and unbiased, the each bit of F(X,Y,Z) will be independent and
   unbiased.

   The functions G, H, and I are similar to the function F, in that they
   act in "bitwise parallel" to produce their output from the bits of X,
   Y, and Z, in such a manner that if the corresponding bits of X, Y,
   and Z are independent and unbiased, then each bit of G(X,Y,Z),
   H(X,Y,Z), and I(X,Y,Z) will be independent and unbiased. Note that
   the function H is the bit-wise "xor" or "parity" function of its
   inputs.

   This step uses a 64-element table T[1 ... 64] constructed from the
   sine function. Let T[i] denote the i-th element of the table, which
   is equal to the integer part of 4294967296 times abs(sin(i)), where i
   is in radians. The elements of the table are given in the appendix.

   Do the following:

   /* Process each 16-word block. */
   For i = 0 to N/16-1 do

     /* Copy block i into X. */
     For j = 0 to 15 do
       Set X[j] to M[i*16+j].
     end /* of loop on j */

     /* Save A as AA, B as BB, C as CC, and D as DD. */
     AA = A
     BB = B

     CC = C
     DD = D

     /* Round 1. */
     /* Let [abcd k s i] denote the operation
          a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  0  7  1]  [DABC  1 12  2]  [CDAB  2 17  3]  [BCDA  3 22  4]
     [ABCD  4  7  5]  [DABC  5 12  6]  [CDAB  6 17  7]  [BCDA  7 22  8]
     [ABCD  8  7  9]  [DABC  9 12 10]  [CDAB 10 17 11]  [BCDA 11 22 12]
     [ABCD 12  7 13]  [DABC 13 12 14]  [CDAB 14 17 15]  [BCDA 15 22 16]

     /* Round 2. */
     /* Let [abcd k s i] denote the operation
          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  1  5 17]  [DABC  6  9 18]  [CDAB 11 14 19]  [BCDA  0 20 20]
     [ABCD  5  5 21]  [DABC 10  9 22]  [CDAB 15 14 23]  [BCDA  4 20 24]
     [ABCD  9  5 25]  [DABC 14  9 26]  [CDAB  3 14 27]  [BCDA  8 20 28]
     [ABCD 13  5 29]  [DABC  2  9 30]  [CDAB  7 14 31]  [BCDA 12 20 32]

     /* Round 3. */
     /* Let [abcd k s t] denote the operation
          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  5  4 33]  [DABC  8 11 34]  [CDAB 11 16 35]  [BCDA 14 23 36]
     [ABCD  1  4 37]  [DABC  4 11 38]  [CDAB  7 16 39]  [BCDA 10 23 40]
     [ABCD 13  4 41]  [DABC  0 11 42]  [CDAB  3 16 43]  [BCDA  6 23 44]
     [ABCD  9  4 45]  [DABC 12 11 46]  [CDAB 15 16 47]  [BCDA  2 23 48]

     /* Round 4. */
     /* Let [abcd k s t] denote the operation
          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  0  6 49]  [DABC  7 10 50]  [CDAB 14 15 51]  [BCDA  5 21 52]
     [ABCD 12  6 53]  [DABC  3 10 54]  [CDAB 10 15 55]  [BCDA  1 21 56]
     [ABCD  8  6 57]  [DABC 15 10 58]  [CDAB  6 15 59]  [BCDA 13 21 60]
     [ABCD  4  6 61]  [DABC 11 10 62]  [CDAB  2 15 63]  [BCDA  9 21 64]

     /* Then perform the following additions. (That is increment each
        of the four registers by the value it had before this block
        was started.) */
     A = A + AA
     B = B + BB
     C = C + CC
     D = D + DD

   end /* of loop on i */

3.5 Step 5. Output

   The message digest produced as output is A, B, C, D. That is, we
   begin with the low-order byte of A, and end with the high-order byte
   of D.

   This completes the description of MD5. A reference implementation in
   C is given in the appendix.

4. Summary

   The MD5 message-digest algorithm is simple to implement, and provides
   a "fingerprint" or message digest of a message of arbitrary length.
   It is conjectured that the difficulty of coming up with two messages
   having the same message digest is on the order of 2^64 operations,
   and that the difficulty of coming up with any message having a given
   message digest is on the order of 2^128 operations. The MD5 algorithm
   has been carefully scrutinized for weaknesses. It is, however, a
   relatively new algorithm and further security analysis is of course
   justified, as is the case with any new proposal of this sort.

5. Differences Between MD4 and MD5

     The following are the differences between MD4 and MD5:

       1.   A fourth round has been added.

       2.   Each step now has a unique additive constant.

       3.   The function g in round 2 was changed from (XY v XZ v YZ) to
       (XZ v Y not(Z)) to make g less symmetric.

       4.   Each step now adds in the result of the previous step.  This
       promotes a faster "avalanche effect".

       5.   The order in which input words are accessed in rounds 2 and
       3 is changed, to make these patterns less like each other.

       6.   The shift amounts in each round have been approximately
       optimized, to yield a faster "avalanche effect." The shifts in
       different rounds are distinct.

References

   [1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and
       RSA Data Security, Inc., April 1992.

   [2] Rivest, R., "The MD4 message digest algorithm", in A.J.  Menezes
       and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO '90
       Proceedings, pages 303-311, Springer-Verlag, 1991.

   [3] CCITT Recommendation X.509 (1988), "The Directory -
       Authentication Framework."

APPENDIX A - Reference Implementation

   This appendix contains the following files taken from RSAREF: A
   Cryptographic Toolkit for Privacy-Enhanced Mail:

     global.h -- global header file

     md5.h -- header file for MD5

     md5c.c -- source code for MD5

   For more information on RSAREF, send email to <rsaref@rsa.com>.

   The appendix also includes the following file:

     mddriver.c -- test driver for MD2, MD4 and MD5

   The driver compiles for MD5 by default but can compile for MD2 or MD4
   if the symbol MD is defined on the C compiler command line as 2 or 4.

   The implementation is portable and should work on many different
   plaforms. However, it is not difficult to optimize the implementation
   on particular platforms, an exercise left to the reader. For example,
   on "little-endian" platforms where the lowest-addressed byte in a 32-
   bit word is the least significant and there are no alignment
   restrictions, the call to Decode in MD5Transform can be replaced with
   a typecast.

A.1 global.h

/* GLOBAL.H - RSAREF types and constants
*/

/* PROTOTYPES should be set to one if and only if the compiler supports
  function argument prototyping.
The following makes PROTOTYPES default to 0 if it has not already

  been defined with C compiler flags.
*/
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif

/* POINTER defines a generic pointer type */
typedef unsigned char *POINTER;

/* UINT2 defines a two byte word */
typedef unsigned short int UINT2;

/* UINT4 defines a four byte word */
typedef unsigned long int UINT4;

/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
  returns an empty list.
*/
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif

A.2 md5.h

/* MD5.H - header file for MD5C.C
*/

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.

License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.

License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.

RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.

These notices must be retained in any copies of any part of this
documentation and/or software.
*/

/* MD5 context. */
typedef struct {
  UINT4 state[4];                                   /* state (ABCD) */
  UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */
  unsigned char buffer[64];                         /* input buffer */
} MD5_CTX;

void MD5Init PROTO_LIST ((MD5_CTX *));
void MD5Update PROTO_LIST
  ((MD5_CTX *, unsigned char *, unsigned int));
void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));

A.3 md5c.c

/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
*/

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.

License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.

License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.

RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.

These notices must be retained in any copies of any part of this
documentation and/or software.
*/

#include "global.h"
#include "md5.h"

/* Constants for MD5Transform routine.
*/

#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21

static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
static void Encode PROTO_LIST
  ((unsigned char *, UINT4 *, unsigned int));
static void Decode PROTO_LIST
  ((UINT4 *, unsigned char *, unsigned int));
static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));

static unsigned char PADDING[64] = {
  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/* F, G, H and I are basic MD5 functions.
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

/* ROTATE_LEFT rotates x left n bits.
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))

/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.
*/
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \

(a) += (b); \
  }
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
  }
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
  }
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
  }

/* MD5 initialization. Begins an MD5 operation, writing a new context.
*/
void MD5Init (context)
MD5_CTX *context;                                        /* context */
{
  context->count[0] = context->count[1] = 0;
  /* Load magic initialization constants.
*/
  context->state[0] = 0x67452301;
  context->state[1] = 0xefcdab89;
  context->state[2] = 0x98badcfe;
  context->state[3] = 0x10325476;
}

/* MD5 block update operation. Continues an MD5 message-digest
  operation, processing another message block, and updating the
  context.
*/
void MD5Update (context, input, inputLen)
MD5_CTX *context;                                        /* context */
unsigned char *input;                                /* input block */
unsigned int inputLen;                     /* length of input block */
{
  unsigned int i, index, partLen;

  /* Compute number of bytes mod 64 */
  index = (unsigned int)((context->count[0] >> 3) & 0x3F);

  /* Update number of bits */
  if ((context->count[0] += ((UINT4)inputLen << 3))

   < ((UINT4)inputLen << 3))
context->count[1]++;
  context->count[1] += ((UINT4)inputLen >> 29);

  partLen = 64 - index;

  /* Transform as many times as possible.
*/
  if (inputLen >= partLen) {
MD5_memcpy
   ((POINTER)&context->buffer[index], (POINTER)input, partLen);
MD5Transform (context->state, context->buffer);

for (i = partLen; i + 63 < inputLen; i += 64)
   MD5Transform (context->state, &input[i]);

index = 0;
  }
  else
i = 0;

  /* Buffer remaining input */
  MD5_memcpy
((POINTER)&context->buffer[index], (POINTER)&input[i],
  inputLen-i);
}

/* MD5 finalization. Ends an MD5 message-digest operation, writing the
  the message digest and zeroizing the context.
*/
void MD5Final (digest, context)
unsigned char digest[16];                         /* message digest */
MD5_CTX *context;                                       /* context */
{
  unsigned char bits[8];
  unsigned int index, padLen;

  /* Save number of bits */
  Encode (bits, context->count, 8);

  /* Pad out to 56 mod 64.
*/
  index = (unsigned int)((context->count[0] >> 3) & 0x3f);
  padLen = (index < 56) ? (56 - index) : (120 - index);
  MD5Update (context, PADDING, padLen);

  /* Append length (before padding) */
  MD5Update (context, bits, 8);

  /* Store state in digest */
  Encode (digest, context->state, 16);

  /* Zeroize sensitive information.
*/
  MD5_memset ((POINTER)context, 0, sizeof (*context));
}

/* MD5 basic transformation. Transforms state based on block.
*/
static void MD5Transform (state, block)
UINT4 state[4];
unsigned char block[64];
{
  UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];

  Decode (x, block, 64);

  /* Round 1 */
  FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
  FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
  FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
  FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
  FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
  FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
  FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
  FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
  FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
  FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
  FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */

/* Round 2 */
  GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
  GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
  GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
  GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
  GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
  GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
  GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
  GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */

  GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
  GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
  GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
  GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */

  /* Round 3 */
  HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
  HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
  HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
  HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
  HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
  HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
  HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
  HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
  HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
  HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */

  /* Round 4 */
  II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
  II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
  II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
  II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
  II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
  II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
  II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
  II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
  II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
  II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */

  state[0] += a;
  state[1] += b;
  state[2] += c;
  state[3] += d;

  /* Zeroize sensitive information.

*/
  MD5_memset ((POINTER)x, 0, sizeof (x));
}

/* Encodes input (UINT4) into output (unsigned char). Assumes len is
  a multiple of 4.
*/
static void Encode (output, input, len)
unsigned char *output;
UINT4 *input;
unsigned int len;
{
  unsigned int i, j;

  for (i = 0, j = 0; j < len; i++, j += 4) {
output[j] = (unsigned char)(input[i] & 0xff);
output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
  }
}

/* Decodes input (unsigned char) into output (UINT4). Assumes len is
  a multiple of 4.
*/
static void Decode (output, input, len)
UINT4 *output;
unsigned char *input;
unsigned int len;
{
  unsigned int i, j;

  for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
   (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
}

/* Note: Replace "for loop" with standard memcpy if possible.
*/

static void MD5_memcpy (output, input, len)
POINTER output;
POINTER input;
unsigned int len;
{
  unsigned int i;

  for (i = 0; i < len; i++)

output[i] = input[i];
}

/* Note: Replace "for loop" with standard memset if possible.
*/
static void MD5_memset (output, value, len)
POINTER output;
int value;
unsigned int len;
{
  unsigned int i;

  for (i = 0; i < len; i++)
((char *)output)[i] = (char)value;
}

A.4 mddriver.c

/* MDDRIVER.C - test driver for MD2, MD4 and MD5
*/

/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
rights reserved.

RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.

These notices must be retained in any copies of any part of this
documentation and/or software.
*/

/* The following makes MD default to MD5 if it has not already been
  defined with C compiler flags.
*/
#ifndef MD
#define MD MD5
#endif

#include <stdio.h>
#include <time.h>
#include <string.h>
#include "global.h"
#if MD == 2
#include "md2.h"
#endif
#if MD == 4

#include "md4.h"
#endif
#if MD == 5
#include "md5.h"
#endif

/* Length of test block, number of test blocks.
*/
#define TEST_BLOCK_LEN 1000
#define TEST_BLOCK_COUNT 1000

static void MDString PROTO_LIST ((char *));
static void MDTimeTrial PROTO_LIST ((void));
static void MDTestSuite PROTO_LIST ((void));
static void MDFile PROTO_LIST ((char *));
static void MDFilter PROTO_LIST ((void));
static void MDPrint PROTO_LIST ((unsigned char [16]));

#if MD == 2
#define MD_CTX MD2_CTX
#define MDInit MD2Init
#define MDUpdate MD2Update
#define MDFinal MD2Final
#endif
#if MD == 4
#define MD_CTX MD4_CTX
#define MDInit MD4Init
#define MDUpdate MD4Update
#define MDFinal MD4Final
#endif
#if MD == 5
#define MD_CTX MD5_CTX
#define MDInit MD5Init
#define MDUpdate MD5Update
#define MDFinal MD5Final
#endif

/* Main driver.

Arguments (may be any combination):
  -sstring - digests string
  -t       - runs time trial
  -x       - runs test script
  filename - digests file
  (none)   - digests standard input
*/
int main (argc, argv)
int argc;

char *argv[];
{
  int i;

  if (argc > 1)
for (i = 1; i < argc; i++)
   if (argv[i][0] == '-' && argv[i][1] == 's')
     MDString (argv[i] + 2);
   else if (strcmp (argv[i], "-t") == 0)
     MDTimeTrial ();
   else if (strcmp (argv[i], "-x") == 0)
     MDTestSuite ();
   else
     MDFile (argv[i]);
  else
MDFilter ();

  return (0);
}

/* Digests a string and prints the result.
*/
static void MDString (string)
char *string;
{
  MD_CTX context;
  unsigned char digest[16];
  unsigned int len = strlen (string);

  MDInit (&context);
  MDUpdate (&context, string, len);
  MDFinal (digest, &context);

  printf ("MD%d (\"%s\") = ", MD, string);
  MDPrint (digest);
  printf ("\n");
}

/* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte
  blocks.
*/
static void MDTimeTrial ()
{
  MD_CTX context;
  time_t endTime, startTime;
  unsigned char block[TEST_BLOCK_LEN], digest[16];
  unsigned int i;

  printf
("MD%d time trial. Digesting %d %d-byte blocks ...", MD,
  TEST_BLOCK_LEN, TEST_BLOCK_COUNT);

  /* Initialize block */
  for (i = 0; i < TEST_BLOCK_LEN; i++)
block[i] = (unsigned char)(i & 0xff);

  /* Start timer */
  time (&startTime);

  /* Digest blocks */
  MDInit (&context);
  for (i = 0; i < TEST_BLOCK_COUNT; i++)
MDUpdate (&context, block, TEST_BLOCK_LEN);
  MDFinal (digest, &context);

  /* Stop timer */
  time (&endTime);

  printf (" done\n");
  printf ("Digest = ");
  MDPrint (digest);
  printf ("\nTime = %ld seconds\n", (long)(endTime-startTime));
  printf
("Speed = %ld bytes/second\n",
  (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime));
}

/* Digests a reference suite of strings and prints the results.
*/
static void MDTestSuite ()
{
  printf ("MD%d test suite:\n", MD);

  MDString ("");
  MDString ("a");
  MDString ("abc");
  MDString ("message digest");
  MDString ("abcdefghijklmnopqrstuvwxyz");
  MDString
("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
  MDString
("1234567890123456789012345678901234567890\
1234567890123456789012345678901234567890");
}

/* Digests a file and prints the result.

*/
static void MDFile (filename)
char *filename;
{
  FILE *file;
  MD_CTX context;
  int len;
  unsigned char buffer[1024], digest[16];

  if ((file = fopen (filename, "rb")) == NULL)
printf ("%s can't be opened\n", filename);

  else {
MDInit (&context);
while (len = fread (buffer, 1, 1024, file))
   MDUpdate (&context, buffer, len);
MDFinal (digest, &context);

fclose (file);

printf ("MD%d (%s) = ", MD, filename);
MDPrint (digest);
printf ("\n");
  }
}

/* Digests the standard input and prints the result.
*/
static void MDFilter ()
{
  MD_CTX context;
  int len;
  unsigned char buffer[16], digest[16];

  MDInit (&context);
  while (len = fread (buffer, 1, 16, stdin))
MDUpdate (&context, buffer, len);
  MDFinal (digest, &context);

  MDPrint (digest);
  printf ("\n");
}

/* Prints a message digest in hexadecimal.
*/
static void MDPrint (digest)
unsigned char digest[16];
{

  unsigned int i;

  for (i = 0; i < 16; i++)
printf ("%02x", digest[i]);
}

A.5 Test suite

   The MD5 test suite (driver option "-x") should print the following
   results:

MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("123456789012345678901234567890123456789012345678901234567890123456
78901234567890") = 57edf4a22be3c955ac49da2e2107b67a

Security Considerations

   The level of security discussed in this memo is considered to be
   sufficient for implementing very high security hybrid digital-
   signature schemes based on MD5 and a public-key cryptosystem.

Author's Address

   Ronald L. Rivest
   Massachusetts Institute of Technology
   Laboratory for Computer Science
   NE43-324
   545 Technology Square
   Cambridge, MA  02139-1986

   Phone: (617) 253-5880
   EMail: rivest@theory.lcs.mit.edu

'Program > Info Etc' 카테고리의 다른 글

싱글턴 패턴  (0) 2008.01.16
XML 간단한 설명  (0) 2008.01.16
USB 자동인식 방지  (0) 2008.01.16
:

XML 간단한 설명

Program/Info Etc 2008. 1. 16. 09:52
XML 정리

 

XML (eXtensible Markup Language) 정의 ~.xml

  eXtensible : 확장 가능한 Markup : 마크업 Language : 언어(규칙)

  쉽게 표현하면 새로운 태그를 만들 수 있는 규칙 정도의 뜻이다.

 

XML은 메타 언어(Meta Language)

  언어를 표현하는 언어라는 뜻이다.

  즉, 태그를 이용하여 문서의 의미를 표현하는 언어라는 뜻이다.

  예를 들어 <가수>원더걸스</가수> 에서 원더걸스는 가수라는 추가 정보가 있는 것이다.

 

XML의 역사

  SGML 과 HTML 의 장점을 결합한 것이 XML 이다.

 

XML 공부하려면 최소한 에디터와 브라우저만 있으면 된다.

  1. XML 을 공부하려면 유니 코드를 지원하는 에디터

     (메모장, 울트라에디터, 에디트플러스 등)

  2. XML 브라우저

     (인터넷 익스플로러, 파이어 폭스 등)

 

XML 문서는 Well-Formed Document와 Valid Document로 나뉜다.

  1. Well-Formed Document : 한 마디로 여는 태그와 닫는 태그만 맞으면 된다.

  2. Valid Document

     DTD나 XML 스키마로 XML 문서의 규칙을 지정하는 데 이 규칙에 맞으면 된다.

 

----------------------------------------------------------

 

DTD : Document Type Definition ~.dtd

  XML 문서의 규칙을 지정.

 

DTD 의 서브셋

    텍스트 선언, 엘리먼트 선언, 속성 선언, 엔티티 선언, 노테이션 선언,

    프로세싱 지시자 선언, 파라미터 엔티티 참조, 주석, 공백, 컨디셔날 섹션

 

텍스트 선언

    <?xml version="1.0" encoding="UTF-8" ?>

 

주석

    <!-- 주석 -->


엘리먼트 = 태그

  1. 여는_태그  <가수>

  2. 내용         원더걸스

  3. 닫는_태그  </가수>


엘리먼트 내용에 나올 수 있는 것

  1. #PCDATA

  2. 자식_엘리먼트

  3. EMPTY

  4. MIXED

  5. ANY


자식 엘리먼트 리스트 표현 방법

  1. ,   : <!ELEMENT 연예인 (전화번호, 주소)>  ;  전화번호 다음에 주소가 나온다.

  2. |  : <!ELEMENT 분류 (가수 | 배우)> ; 가수 / 배우 중에 하나가 나온다.

  3. ?  : 생략하거나 한번만 나온다.

  4. +  : 한번 이상

  5. *  : 생략하거나 여러 번


속성의 디폴트 선언

  1. #IMPLIED : 생략 가능

  2. #REQUIRED : 필수

  3. #FIXED : 고정값

  4. "임의의_내용"


엔티티 분류

  1. 물리적인 저장 단위 분류 : 내부, 외부

  2. 사용되는 곳 : 일반, 파라미터

  3. 문자인지 여부 : 파스드, 언파스드


빌트인 엔티티

  5개 ( &lt; , &gt; , &amp; , &quot; , &apos; )


노테이션 == MIME 타입


----------------------------------------------------------


XML 스키마 : XML Schema ~.xsd

  DTD 보다 정확한 자료 구조 표현 가능.


외부 스키마 참조

  include, import, redifine, anotation


엘리먼트와 속성 선언

  element, attribute, simpleType, complexType, group, attributeGroup, notation, anotation


----------------------------------------------------------


XPath (XML Path Language)

  XML문서에서 태그와 속성에 접근하기 위한 경로를 지정하는 언어.

  운영체제의 폴더(디렉토리)에 비유된다.


경로 구분 : 절대 경로, 상대 경로


----------------------------------------------------------


XSL ( eXtensible Stylesheet Language ) ~.xsl

  확장 가능한 스타일 시트 언어

  XML 문서를 다양한 형태로 변환할 때 사용한다.


XSL 구성 파트

  1. XSLT (XSL Transfomation)

  2. XPath (XML Path Language)

  3. XSL-FO (XSL Fomatting Object)

'Program > Info Etc' 카테고리의 다른 글

MD5 암호화  (0) 2008.01.16
USB 자동인식 방지  (0) 2008.01.16
Windwo Vista 버젼 비교  (0) 2008.01.16
:

USB 자동인식 방지

Program/Info Etc 2008. 1. 16. 09:52
Usb 자동실행방지
시작-제어판-관리도구-서비스-shell hardware detection- 중지

'Program > Info Etc' 카테고리의 다른 글

MD5 암호화  (0) 2008.01.16
XML 간단한 설명  (0) 2008.01.16
Windwo Vista 버젼 비교  (0) 2008.01.16
:

Windwo Vista 버젼 비교

Program/Info Etc 2008. 1. 16. 09:26
내년 1월에 나올 윈도우 비스타 32비트용으로도 나온다고 하던데요.
       HT 기술이 안들어가는 펜티엄4 노스우드 계열에서도 돌아갈까요?

  윈도우Vista 32bit 제품은 기존의 윈도XP의 대다수 사용자에게 용도가 한정됩니다.
       그런 까닭에 몇가지 기능적인 부분에서 지원이 안되는 점을 빼면은 64bit 버전과
       차이가 없습니다
.

       윈도우Vista 의 최소사양과 권장사양은
              
                                http://www.microsoft.com/windowsvista/getready/capable.mspx

       에서 참고할수 있습니다.

       이곳에 잠깐 소개하자면
       최소사양은
  • A modern processor (at least 800MHz1).
  • 512 MB of system memory.
  • A graphics processor that is DirectX 9 capable.
      이며
      권장사양은
 
  • 1 GHz 32-bit (x86) or 64-bit (x64) processor1.
  • 1 GB of system memory.
  • Support for DirectX 9 graphics with a WDDM driver, 128 MB of graphics memory (minimum)2, Pixel Shader 2.0 and 32 bits per pixel.
  • 40 GB of hard drive capacity with 15 GB free space.
  • DVD-ROM Drive3.
  • Audio output capability.
  • Internet access capability.
      입니다.

      물론 윈도우Vista의 경우 버전이 여럿이 있는데다가 권장사양의 규정은
      Vista Premium 버전을 기초하고 있기 때문에 버전에 따라 약간 유동적일수 있습니다.

      하지만 어떤 S/W가 그렇듯 권장사양의 경우 적절히 사용한것이지
      모든 동작을 원활하게 하기 위해서는
      현재 베타테스트 하는 사용자들의 이야기에 따르면

      최소 듀얼코어기반의 CPU와 2GB의 메모리, 128MB(128bit)기반의 VGA가
      기본으로 전제
되어야 한다고 합니다. 상당한 사양이지요..^^

      아무튼 질문자가 질문에 제시하신 내용으로 Vista를 풀 가동하기엔 힘들수
      있지만 권장사양은 만족한다고 보여집니다.

      아울러 자신의 PC가 윈도Vista 를 사용할수 있을지에 대해서 궁금하다면
                
                             http://go.microsoft.com/fwlink/?linkid=65926&clcid=0x409
     
      참고해서 Windows Vista Upgrade Advisor 를 다운로드해서 실행해보면 알수 있습니다.

                     
                         (제 노트북은 윈도우 비스타 비지니스가 어울린다네요.//ㅋㅋ)



 윈도우 비스타의 각 에디션별 차이를 알려주세요

 비스타의 에디션별 차이는 (PC라인 10월호 참조) 아래와 같습니다.     
      
 
Home
Basic
Home
Premium
Business
Enterprise
Ultimate
지원CPU
1
1
2
2
2
최대메모리
(32bit/64bit)
4GB/8GB
4GB/16GB
4GB/128GB
4GB/128GB
4GB/128GB
백업기능
O
O
O
O
O
정기적 백업
X
O
O
O
O
시스템
이미지 백업
X
X
O
O
O
암호화
파일 시스템
X
X
O
O
O
IIS
X
X
O
O
O
도메인 참여
X
X
O
O
O
원격 데스크탑
X
X
O
O
O
Unix 응용
프로그램
X
X
X
O
O
가상PC
X
X
X
O
O
보호자 제한
O
O
X
X
O
에어로
인터페이스
X
O
O
O
O
미디어 센터
X
O
X
X
O
무비 메이커
O
O
X
X
O
DVD메이커
X
O
X
X
O
태블릿PC
X
O
O
O
O
윈도 팩스/스캔
X
X
O
O
O
 
 
 윈도우 비스타의 각 에디션별 기능을 간략히 정리해주세요

 비스타의 에디션별 기능은 (PC라인 07.1월호 참조) 아래와 같습니다.
 
         - 스타터 에디션 (Starter Edition) = 저사양PC용 버전으로, 한번의 3개의 창이상을 실행할수
                                                        없으며, 저개발 도상국용으로써 국내에서는 볼수 없습니다.
         - 홈베이직&홈프리미엄 에디션 (Home Basic & Premium Edition)
                       = 윈도XP 홈에디션과 맥락을 같이하며, XP에서보다 다양한 멀티미디어 환경을 제
                         공합니다. 홈 프리미엄 에디션은 베이직 에디션에서 HDTV지원,DVD비디오 오소링,
                          DVD리핑,태블릿PC등과 미디어 센터가 지원됩니다.
       
         - 비지니스 에디션 (Business Edition) = 윈도XP 프로페셔널과 맥락을 같이하며, 강력한 보안(?)
                                                             기능과 네트워크 기능등이 제공됩니다.
       
         - 엔터프라이즈 에디션 (Enterprise Edition) = 비지니스 에디션의 모든 기능에 다국어 사용자
                                                                  환경과 가상PC기능을 제공합니다.

         - 얼티케이트 에디션 (Ultimate Edition) = 위에 있는 모든 에디션의 기능을 묶은형태로
                                                                제공합니다.

'Program > Info Etc' 카테고리의 다른 글

MD5 암호화  (0) 2008.01.16
XML 간단한 설명  (0) 2008.01.16
USB 자동인식 방지  (0) 2008.01.16
: