2008. 12. 17. 21:23 과거 저장소/IT infomation
728x90
DebugLab을 오랜만에 들어가서 기웃거리다가 오래된 글 중에 codeproject에 올라온 기사를 링크해 놓은 것이 있어서 저 역시 링크를 걸어봅니다.

제목에서처럼 .NET에 대한 여러가지 TIPs입니다.


.NET Framework

1. How to get the path for "My Documents" and other system folders?
2. How to get the path to my running EXE?
3. How to determine which operating system is running?
4. How to get a file's name from the complete path string?
5. How to get a file's extension from the complete path string?
6. What is difference beween VB.NET and C#.NET?
7. How to find whether your system has mouse or the number of buttons, whether it has wheel, or whether the mouse buttons are swapped or size of your monitor and many such information?
8. What is the purpose of the [STA Thread] attribute for the Main method of a C# program?
9. How to import CSV data using .NET application?
10. How to find size of logical drives using .NET?
11. How can I get the index of substring in a sentence irrespective of it's case?
12. How to access value of internal property Rawkind in System.Drawing.Printing.PaperSource in .NET 1.1?

OOPS

1. What are Copy Constructors?
2. What are Read-Only Constants?

VS.NET IDE

1. How to manage code snippets in VS.NET IDE?
2. How to display Line Numbers in code editor?
3. How to change the color of the regions?

Controls

Forms

1. How to create a form with resizing borders and no title bar?
2. How to use XP Themes with Windows Forms using the .NET?
3. How to prevent a form from being shown in the taskbar?
4. How to open default E-mail client on your system with all parameters entered in it,like Outlook Express or Eudora, from your .NET windows or Web Application?
5. How to create Pop-Up Alert windows like messengers?
6. What is difference between Anchoring and Docking?

Buttons

1. How to set the default button for a form?
2. How to set the Cancel button for a form?
3. How to trigger a button click event?

Combo Box

1. How to fill a ComboBox with the available fonts?

Text Box

1. How to disable the default ContextMenu of a TextBox?
2. How to enter multiline text in textbox through code?
3. Some useful TextBox Validations
4. How to unselect the text in textbox after it receives focus?

DateTime Picker

1. How to make the DateTimePicker show empty text if no date is selected?

Data Grid

1. How to remove the indeterminate status of checkbox in datagrid?
2. How to group columns in DataGrid?

Panel

1. How to make a Panel or Label semi-transparent on a Windows Form?

WebBrowser Control

1. How to print the contents of Web Browser control?
2. How to assign custom Header and Footer and other page settings while printing the contents of Web Browser control?

ADO.NET

1. How to bind two controls to the same DataTable without having changes in one control also change the other control?

Crystal Reports

1. How to hide the status bar of Crystal Report in Report Viewer?
2. How to generate PDF version of Crystal Report programmatically?
3. How to select a printer while printing through Crystal Report programmatically?

Deployment

1. How to install database while deploying .NET application ?
2. How to install MSDE while deploying .NET application?
3. How to create conditional shortcuts while deploying .NET application?

Add ins

1. How to get a reference to usercontrol in CreateToolWindow2()?

Miscellaneous

1. How to enable the mnemonics (underline) being displayed when an application is launched
2. An easy way to build connection string.
3. How to add a custom or destination folder to SendTo menu?
728x90
posted by acedon
2008. 8. 15. 01:39 과거 저장소/IT infomation
728x90
리팩토링(Refactoring)이란?
한마디로 말하면 "프로그램의 외부사양(입력과 출력)을 변경하지 않은 채 내부구조를 안전하게 개선하는 테크닉" 이라고 표현할 수 있습니다.

목적
그렇다면 이런 리팩토링이라는 작업을 수행해야 하는 이유는 무엇일까요?
그건 궁극적으로 프로그램을 이해하기 쉬운 상태로 유지하고, 확장성과 재사용성을 높이는 것이라고 할 수 있습니다.

프로그램의 수정이라는 행위에 대해서 4가지 정도의 예를 들 수 있습니다.
  1. 디버그(Debug)
  2. 기능 확장(Expansion)
  3. 퍼포먼스 개선(Tuning)
  4. 리팩토링(Refactoring)

위 네 가지를 어떤 상태(State)에서 수정하느냐의 관점에서 보게 되면 디버그나머지 세 가지로 분류 할 수 있습니다.
  - 디버그는 정상작동을 하지 않는 프로그램을 수정하는 행위
  - 나머지 세 가지는 정상작동을 하는 프로그램을 수정하는 행위

나머지 세 가지들은
  - 기능확장은 그 말 그대로 기능확장이 필요할 때 사용하게 되는 부분
  - 퍼포먼스 개선 또한 성능을 향상시키기 위하여 사용하게 되는 부분
하지만 리팩토링은 아무 문제가 없는 프로그램에 대해 행하는 부분입니다.

리팩토링을 안전하게 수행하는 요령
  1. 리팩토링과 다른 작업을 분리합니다.
  2. 리팩토링 전후에 반드시 테스트합니다.
  3. 한번에 최소한의 작업만 수행합니다.
  4. 기존의 로직에 미치는 영향을 적게합니다.
  5. 반드시 백업을 합니다.

- 백업 관리에 있어서 제공하는 툴로는 오픈소스S/W인 CVS, MS의 Visual SourceSafe 등이 있습니다.

이런 리팩토링에 대해서 노하우들이 적립되어 있는데, 그것이 바로 "리팩토링 카탈로그"입니다.

사용자 삽입 이미지

대표적인 리팩토링인 "메소드 추출"의 순서는 다음과 같습니다.
  1. 적절한 이름의 새 메소드를 생성합니다.
  2. 추출하고 싶은 로직을 새 메소드로 복사합니다.
  3. 추출된 로직 속의 로컬 변수를 새 메소드에 적합하도록 변경합니다.
  4. 컴파일 하여 테스트 합니다.
  5. 원래 메소드를 새로운 메소드를 호출하도록 변경합니다.
  6. 컴파일 하여 테스트 합니다.

간단하게 리팩토링이 무엇인지에 대해서 알아보았습니다.
관심이 있으신 분은 "Refactoring : Improving The Design of Existing Code" 책 또는 "저자 : 마틴파울러의 http://www.refactoring.com"을 방문해 보십시오.
물론 저도 아직 읽어보지 못했습니다. ^^

출처 : 아무도 가르쳐 주지 않았던 소프트웨어 설계 테크닉 - Watanabe Kouzo외 9인 저 참고
728x90
posted by acedon
2008. 7. 26. 09:36 과거 저장소/IT infomation
728x90

우리는 흔히들 겪는 일들 중에 하나가 메모리를 4GB로 업그레이드 하고 기분좋게 확인을 해보면 4GB로 잡히지 않고 3.2GB 아니면 3.4GB정도로 만족할만한 용량으로 잡히지 않는 경우가 대부분일 것입니다.

이런 부분에 있어서 보통 Windows XP가 32Bit 운영체제 이기때문에 참조 할 수 있는 주소가 32Bit이기 때문이라고 합니다. 사실상 32Bit이면 4GB까지 지원가능합니다.

이부분에 대해서 정리된 내용이 있어서 이렇게 링크를 걸어 봅니다.


728x90
posted by acedon
2008. 7. 21. 21:10 과거 저장소/IT infomation
728x90
레지스터 란?

어셈블리 언어로 프로그래밍을 하려면 C/C++ 같은 고급 언어와는 달리 CPU 내부에
있는 특별한 메모리에 대해서 잘 알고 있어야 한다. 우리가 일반적으로 알고 있는
메인메모리 혹은 시스템 메모리외에 CPU의 내부에는 레지스터(Register)라고 불리
는 특별한 메모리가 있다.

레지스터는 CPU가 접근할 수 있는 메모리 중에서 가장 빠르게 동작하는 메모리로
CPU가 여러가지 연산등의 처리를 하는 동안 필요한 임시적인 데이터들을 보관하는
데 사용된다.

메인 메모리는 바이트 단위로 매겨진 번지 혹은 주소를 이용해서 접근할 위치를 구
분하는데, 레지스터의 경우는 번지의 개념이 없고 모두 고유한 이름이 부여되어 있
다.

인텔 80x86 계열의 CPU에는 여러 개의 레지스터가 있어서 다양한 역할들을 맡고 있
다. 여러 레지스터 중에서 운영체제가 특별한 용도로 사용하는 레지스터를 제외하
면 일반적인 응용프로그램이 직접 이용할 수 있는 레지스터는 불과 10개 정도에 지
나지 않는다.

2. 레지스터의 종류

2.1 범용 레지스터

EAX      EBX      ECX      EDX

이들 레지스터는 말그대로 범용적인 목적으로 사용되는 레지스터로 크기는 각각 32
비트이고 다른 레지스터에 비해서 비교적 다양한 역할을 한다. 이름에서도 짐작이
가겠지만 단순히 A B C D 라는 이름을 가진 레지스터이다. A B C D 는
Accumulator, Base, Counter, Data 라는 단어의 첫 글자이기도 하다.      

16비트 시절에는 AX, BX, CX, DX 라는 이름을 가지고 있다가, 386 CPU부터 레지스
터의 크기가 32비트로 확장되면서 모두 이름앞에 E(Extended) 가 붙여진 것이다.

16비트 시절의 AX, BX, CX, DX 는 모두 16비트 크기였지만 8비트 크기로 나누어서
접근이 가능했다. 그래서 AX의 경우는 상위 8비트가 AH, 하위 8비트가 AL 이라는
이름을 가진다(H는 high, L은 Low라는 뜻). BX, CX, DX 의 경우도 마찬가지로 BH,
BL,    CH, CL,    DH, DL 이라는 이름으로 8비트 단위의 접근도 가능하다.

                                 EAX
----------------------------------
!..............EAX...............!    32비트
!---------------------------------      
!...............!.......AX.......!    16비트
!---------------------------------      
!...............!...AH...!...AL..!      8비트
----------------------------------

                                 EBX
----------------------------------
!...............EBX..............!    32비트
----------------------------------      
!...............!.......BX.......!    16비트
----------------------------------      
!...............!...BH...!...BL..!      8비트
----------------------------------

                                 ECX
----------------------------------
!..............ECX...............!    32비트
----------------------------------      
!...............!.......CX.......!    16비트
----------------------------------      
!...............!...CH...!...CL..!      8비트
----------------------------------

                                 EDX
----------------------------------
!..............EDX...............!    32비트
----------------------------------      
!...............!.......DX.......!    16비트
----------------------------------      
!...............!...DH...!..DL...!      8비트
----------------------------------

그림처럼 네개의 범용 레지스터는 동일한 32비트 공간을 이름에 따라 다양한 크기
로 접근할 수가 있다. 이는 범용 레지스터의 독특한 특징이기도 하다.

2.2 포인터 레지스터

ESI    EDI    ESP    EBP    (EIP)

이들 레지스터는 메인메모리의 번지값을 저장해서 포인터의 역할을 하는 레지스터
로 16비트 시절에는 SI, DI, SP, BP, IP 라고 불리던 레지스트이다. 범용 레지스터
와 마찬가지로 32비트로 확장 되면서 앞에 E가 붙게 된 것이다. 각각의 이름은
Source Index, Destination Index, Stack Pointer, Base Pointer, Instruction
Pointer 에서 유래한다.

이중에서 EIP는 현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리의 주소
를 가리키는 레지스터로 프로그램의 실행이 진행됨에 따라 자동으로 증가하고 프로
그램의 실행 순서가 변경되는 제어문이 실행될때 자동으로 변경된다. 그래서 직접
접근해서 값을 저장하거나 읽거나 하는 일이 없기 때문에 응용 프로그램에서는 손
댈 일이 없는 레지스터이다.

ESI와 EDI는 이름이 암시하듯이 주로 메모리의 한 영역(Source)에서 다른 역영
(Destination)으로 데이터를 연속적으로 복사해서 옮길 때 사용한다. 이렇게 메모
리의 번지를 저장하는 포인터의 역할 외에도 단순히 32비트 데이터를 저장하는 데
도 사용할 수 있다.

ESP와 EBP 는 STACK 으로 동작하는 특별한 메모리 영역을 가리키는 데 사용되는 포
인터 레지스터로 특히 ESP 의 경우는 절대적으로 이 용도로만 사용해야 한다.

스택은 보통 함수를 호출해서 프로그램의 제어가 서브루틴으로 넘어 간후 다시 원
래 실행되던 루틴으로 돌아오기 위한 복귀 주소를 저장해 두는 곳으로 사용되고.
특히 고급언어로 작성된 프로그램의 경우 함수의 파라메터나 함수 내부에서 선언
된 지역변수의 저장 공간으로도 사용된다. ESP 는 바로 이런 스택공간의 꼭대기를
가리키는 포인터 레지스터이다. ESP의 값은 직접 변경할 수도 있지만 보통은 스택
에 데이터를 넣고 빼는 PUSH, POP 명령어의 실행시 자동으로 변경된다.

EBP 는 ESP 에 보조적으로 사용되는 포인터 레지스터로 ESP를 대신하여 스택에 저
장된 함수의 파라메터나 지역변수의 주소를 가리키는 용도로 주로 사용된다. 스택
을 가리키는 데는 ESP 하나로도 충분하지만 ESP 대신 EBP를 보조적으로 사용하는
이유는 프로그램의 오류로 중요한 스택 공간이 망가지는 일을 어느정도 방지할 수
있기 때문이다. EBP를 이런 용도로 사용하지 않을 경우에는 단순히 데이터를 저장
하는 용도로도 사용할 수 있다.(보통 속도 최적화 옵션으로 컴파일된 프로그램들
의 경우 인텔의 모자라는 레지스터를 보충하기 위해 EBP를 데이터 저장용으로 사용
하고, 스택은 ESP 하나로 감당하기도 한다.)

2.3 플래그 레지스터

EFLAGS

이 레지스터는 16비트 시절 FLAGS 였고, 32비트로 확장 되면서 앞에 E가 붙은 것이
다. 이 레지스터는 이름이 암시하듯이 비트 단위의 플래그 들을 저장하는 레지스터
로 아주 특별한 용도로 사용된다. 이 레지스터는 비트 단위로 의미를 가지는데 32
비트 모두가 사용되는 것은 아니고, 일부만 의미를 가진다. 각각의 플래그 마다 SF
(Sign Flag), ZF(Zero Flag), CF(Carry Flag), DF(Direction Flag) 등의 이름이 붙
어 있다.

보통 이 레지스터의 값을 직접 읽거나 쓰는 일은 거의 필요하지 않다. 각종 연산을
수행한 결과가 어떠한 지를 기록해 놓는 용도나 특정 명령어의 동작을 조절하는 용
도로 활용된다. 연산 결과가 0인지 음수 인지 자리올림이 발생했는지 따라 각각
ZF, SF, CF등이 설정된다. 이렇게 설정된 플래그들은 조건 제어문들이 자동으로 참
조해서 자신의 동작을 선택하기 때문에 우리가 직접 그 값을 챙길 필요는 없다.

DF의 경우는 MOVS 같은 연속적으로 메모리 복사를 하는 명령어가 동작할 때 번지가
증가하면서 동작할지 감소하면서 동작할 지를 지정해주는 용도로 사용된다. 이 때
에도 이 플래그의 값을 켜고 끄는 명령어가 별도로 있기 때문에 직접 EFLAGS 의 값
을 손 댈 일은 없다.

일반적인 응용 프로그램에서 DF의 경우를 제외하면 나머지 언급하지 않은 플래그들
은 물론 이거니와 ZF, SF, CF등도 관련되는 명령어들이 자동적으로 참조하기 때문
에 이들 플래그의 값을 직접 신경쓰지 않아도 무방하고 그냥 없는 듯이 여기면 된
다.


2.4 세그먼트 레지스터

CS    SS    DS    ES    (FS    GS)

이들 레지스터는 모두 16비트 크기로 메모리의 특정 영역을 가리키는 용도로 사용
되는 레지스터이다. 인텔의 CPU는 메모리의 영역을 용도에 따라 세그먼트로 나누어
서 사용한다. 과거 16비트 프로그래밍 시절에는 한 세그먼트가 가리키는 메모리 영
역이 64KB에 불과 했기 때문에 중요한 의미를 가졌지만 요즘의 32비트 프로그래밍
시절에는 32비트 주소만 해도 4GB 라는 방대한 메모리 영역을 나타낼 수 있다.그래
서운영체제가 한번 설정을 해주고 나면 응용 프로그램에서는 신경 쓸일이 거의 없
는 레지스터들이다. 일반적인 프로그램에서는 없듯이 생각해도 무방하다는 것이
다.

각각의 레지스터의 이름은 Code Segment, Stack Segment, Data Segment, Extra
Segment이고 이름이 암시하듯이 코드 영역, 스택 영역, 데이터 영역 을 가리키는
용도로 사용된다.

ES, FS, GS 는 모두 Extra Segment로 DS 처럼 데이터 영역을 가리키는 용도로 사용
되고 DS를 보조 해주는 세그먼트 레지스터이다. 두곳 이상의 데이터 저장영역을 가
리켜야 할 때 DS와 함께 사용된다. 하지만 32비트 프로그램에서는 DS와 ES가 같은
영역을 가리키고 있기 때문에 굳이 세그먼트 레지스터에 대해서 신경을 쓸 필요가
없다. 특히 FS, GS는 286 이후에 추가된 것으로 운영체제를 작성하는 게 아니라면
없듯이 여겨도 된다.

3. 꼭 알아야 하는 레지스터
위에서 언급한 레지스터 외에도 다른 레지스터가 더 있지만 나머지는 모두 운영체
제 같은 시스템 프로그램들에서나 신경 쓸 레지스터이고 일반적인 응용 프로그램
을 작성한다면 아래 8개의 레지스터만 잘 알고 있으면 충분하다.

EAX, EBX, ECX, EDX
ESI, EDI, ESP, EBP
 
728x90
posted by acedon
2008. 7. 20. 22:36 과거 저장소/IT infomation
728x90

우연찮게 갱주니님의 블로그에서 흥미 있는 글이 있어서 읽어보게 되었습니다.

간략한 내용은 예전에 8086에서부터 서서히 발전해서 펜티엄이라는이름을 가지기까지, 또한 싱글코어라는 부분에서 이제는 듀얼코어,쿼드코어 등 멀티코어의 시대로 도래함에 있어서의 내용입니다.

그 안에서 코어의 스피드클럭(hz, Mhz, Ghz)이라는 부분으로 컴퓨터의 성능을 저울질 해왔지만 요새들어서는 오히려 몇 Ghz라는 말보다는 싱글? 또는 듀얼, 쿼드? 라는 말로써 컴퓨터의 성능이 표현되고 있는것 같습니다.
이런 말들에 대해서 왜 그렇게 갈수 밖에 없고 그렇게 가게 된다면(병렬프로세서형식) 우리 프로그래머들이 해나가야 하는 그에 합당한 행동태세는 어떤것인지에 대해서 설명해주고 있었습니다.

그렇게 길지 않은 글이라 생각보다 재미나게 읽었습니다.
워낙 가지고 있는 지식이 없는터라 유익하게 받아들였습니다.

그럼 이 글에 흥미를 가지시는 분들은 읽어보시기 바랍니다.
고고씽!  "멀티프로세서 프로그래밍의 시대 개막"

728x90
posted by acedon