프로그래밍 498

윈도우 인스톨러

윈도우 인스톨러윈도우 인스톨러란, 윈도우의 소프트웨어 설치, 유지, 제거를 위한 엔진이다.이전에는 마이크로소프트 인스톨러라고 불렀다.설치 정보는 설치 꾸러미 안에 저장되며,기보노 파일 확장자 MSI 파일로도 알려져 있다.마이크로소프트는 서드 파티 제품들이 원도우 인스톨러를 기본 설치 프레임워크로 사용을 돕고 있다.롤백(되돌리기)과 버저닝(DLL hell = 윈도우 기반 프로그램에서 DLL을 사용할 경우 발생할 수 있는 복잡성을 나타내는 말이다.)과 같은중요한 기능은 실제 동작을 위한 일정한 내부 데이터베이스에 따라 달라질 수 있다.Windows Installer를 사용할 위치Windows Installer를 사용하면 Windows에서 실행되는 제품 및 애플리케이션을 효율적으로 설치하고 구성할 수 있다.설..

D3D11 애파인 변환(=아핀 변환)

이동은 선형변환이 아니다.하지만 그래픽스에서 이동과 선형 변환을 동시에표현하고 싶을 때 사용하는 것이 애파인 변환이다. 즉, 애파인 변환이란선형 변환과 이동을 하나의 행렬로 표현한 것이다. Homogeneous Coordinates란?선형 변환하고 선형 변환이 아닌 이동을 합치기 위해서 새롭게 추가가 된 개념이다.벡터 : (x,y,z,0) 포인트 : (x,y,z,1)포인트 - 포인트 = 벡터포인트 + 벡터 = 포인트변환 전 직선은 변환 후에도 직선이다.이 식을 행렬 식으로 표현하면 다음과 같다.이러한 개념을 수학적으로 간단히 나타내면 애파인의 a를 따고,선형변환을 Tau라고 했다. 애파인 변환을 식으로 나타내면 다음과 같다.이런 식으로 애파인 트랜스폼을 사용할 수 있으므로,3차원에서는 4x4 행렬을 사용..

그래픽스/DX11 2024.12.16

IP(Internet Protocol) 열기

으래 컴퓨터를 어려서부터 접한 세대이고,초딩 때 크아나, 바람의 시대 혹은 롤에서 키보드 배틀 좀 떠봤다 싶은 독자들이라면,나보다 나이 좀 많아 보이는 형아들이 너 IP따서 디도스 공격한다.라는 으름장에 맘을 졸여본 적이 있을 것이다.그렇다. 사실 필자의 얘기다. 필자는 막연하게 IP가 뭐냐고 형제에게 물어봤다.필자의 형제는 간단하게 말해서IP란, 인터넷에서 사용하는 가상의 주소라고 답해줬다.우리집에도 주소가 있듯, 컴퓨터에도 주소가 있다는 개념을 그 때 처음 알았다. 초딩 때 나를 발발 떨게했던 IP주소 딴다의 말의IP의 풀네임을 수십년이 흐른 지금에야 알게 되었다.인터넷 프로토콜 (Internet Protocaol)이다. 인터넷 프로토콜 네트워크 계층의 가장 핵심적인 프로토콜 하나를 꼽자면 단연 인터..

프로그래머스 LV.2 모음사전

해당 자릿 수 별 경우의 수는 다음과 같다."(총자릿수 - 현자릿수) * 5 + 이전 경우의 수 = 현재 자릿 수의 경우의 수" 이다.5는 예외적으로 AAAAE - AAAAI 바로 바뀌므로 서로의 변환 관계는 1이다. A는 가장 첫 번째로 나온다. 따라서 0을 더해주면 된다.E는 그 다음이므로 1 따라서 알파벳 순서대로 2,3,4 이렇게 순차적으로 바뀐다. EAIOU가 word면E가 첫번째에 나오면 781번 1번 돌았다는 것이고, A가 0번 돌았다는 뜻이다.I는 3번째 자리이니, 31번을 2번 돌았다는 의미다.O는 4번째 자리이니, 6번을 4번 돌았다는 의미이다.U는 5번째 자라이니, 1번을 5번 돌았다는 의미이다. 해당 경우의 수를 다 더해주면 872번째 단어가 된다. #include #includ..

D3D11 회전축에 대한 벡터의 회전

회전축에 대한 벡터의 회전 회전도 행렬로 표현할 수 있다.회전을 하려면 먼저 회전축을 결정해야한다.어떠한 축에 대해서 회전해야할지, 그 다음은 몇 도만큼 돌아가야할지를 결정한다. 회전은 비교적 3차원 공간보단2차원 공간에서 구현하기 쉽다. (3차원 회전을 다룰 때는 사원수(Quaternion)를 사용하게 된다.숫자 4개를 사용해서 회전을 표현하는 것이다.) 회전을 시키고자 한다면, 2차원 평면에서의 회전을 생각하면 좀더 쉽다.2D 평면에서 회전을 생각해보자.서로 다른 벡터가 필요하다는 것을 금방 알 수 있다. 회전 과정 1. 먼저 회전축 벡터(n)와 회전하고 싶은 벡터(v)를 외적 (Cross Product)를 한다. 2. 외적 값은 회전축 벡터(n)와 회전하고 싶은 벡터(v) 두 벡터에 모두에 해서 수..

그래픽스/DX11 2024.12.13

D3D11 선형 변환(Linear Transformation) - 동차성과 가법성

선형 변환에서 변환은 그래픽스에서 뭘까? 뭐가 될 수 있을까?변환이란 어떠한 함수라고 생각해보자. 그렇게 되면 위와 같은 식이 전개가 된다.그럼 이 Tau가 어떤 함수인가에 따라,Scaling이 되기도 하고, Rotation이 되기도 한다. 이 두 가지 사례를 만족하는 것이 선형 변환이다.그렇다면 선형 변환이 아닌 경우는 뭘까? 이처럼 동차성과 가법성을 만족해야만 하는 것이 선형 변환이다. 선형 변환이 아닌 경우 예를 들어 tau라는 변환이 x,y,z를 넣었을 때,x,y,z를 x^2, y^2, z^2인 경우 왜 선형 변환이 아닐까?~이 아닌 경우를 찾을 때는 그에 대한 반례를 찾으면 된다. k가 2라고 하고, 해당 식을 전개하면 다음과 같은 결과값이 나온다.1,2,3에다가 2를 각각 곱하면2,4,..

그래픽스/DX11 2024.12.12

D3D11 그래픽스 - 변환

어떤 점을 원점에 대해서 회전시키는 경우어떤 점을 원점에 대해서 회전시키는 경우에어떠한 점 (= 임의의 점) xy를 하나의 미지수 (x,y)로 표현할 수 있고,그 임의의 점을 원점(여기서 원점은(0,0)이 아닐 수도 있다.)을 기준으로 θ만큼 회전 시킨 지점을 (x',y')로 표현할 수 있다.그러한 (x',y') 지점을 구하는 식은 아래와 같다. 그럼 열벡터(Column Vector) 형태의 회전 변환을행벡터(Row Vector)형태의 회전 변환 할까?방법은 간단하다. 좌변에도 전치(Transpose)를 해주고,우변에도 전치(Transpose)를 해준다. 이 식의 전개를 글로 풀어보면 다음과 같다.좌변에 Transpose를 해주고,우변에도 통째로 Transpose를 해준다. 이 Column vector는..

그래픽스/DX11 2024.12.11

프로그램 인터페이스 예시 STD::vector

하나의 기능을 다양한 기능으로 설계하는 인터페이스 원칙이 원칙의 대표적인 예시는 std::vector이다.std::vector는주어진 인덱스에 담긴 원소를 접근하기 위한두 가지 메서드를 제공한다.경곗값을 검사하는 at()메서드를 사용해도 되고,경곗값을 검사하지는 않지만좀 더 속도가 빠른 배열 표기법을 사용해도 된다.경곗값 검사를 반드시 한다면어느 정도 오버헤드를 감수하고 at() 메서드를 사용하면 된다.이 원칙은 인터페이스를 군더더기 없이설계해야 한다는 원칙의 예외로 봐야한다.이렇게 예외를 적용하더라도나머지 부분은 반드시 군더더기 없이 잘 설계해야한다.

백준 골드2 1167 트리의 지름 구하기

https://www.acmicpc.net/problem/1167 트리의 지름이라서 어떻게 구할까 했는데,그냥 가장 긴 경로를 찾으면 된다. 임의의 노드 하나를 정해서BFS로 탐색하면 그 중에서 가장 긴 노드를 찾아 그 노드 값을 저장한다.어떤 정점까지가 더 긴가는,해당 정점 수 만큼의 거리를 담은 배열로 비교한다. 가장 긴 경로를 가진 정점을 구했으면,가장 긴 경로를 가진 정점에서 다시 출발한다.거리를 담은 정점 배열에서,도착지까지 가장 길었던 값을 가져오면해당 정점의 최대 길이를 알 수 있다. 이 최대 거리가 트리의 지름이다. using namespace std;vector visited;vector mDistance;typedef pair edge;vector> tree;void BFS(int n..

인터페이스를 사용하기 쉽게 설계하기 (2)

필요한 기능 빼먹지 않기필요한 기능을 빼먹지 않는 원칙은두 단계로 적용한다.첫 번째는 클라이언트가 필요로 하는 동작은모두 인터페이스에 추가해야한다.간혹 포함시켜야할 지 불분명한 기능이 있다.이럴 때는 자신이 작성한 코드를 클라이언트가이용하는 모든 경우의 수를 따져봐야한다.인터페이스를 설계할 때 한 가지 관점만 고려하면다른 방식으로 바라보는 클라이언트가 필요한 기능을 놓칠 수 있다.물론 가능한 모든 경우의 인터페이스를 설계한다는 것이불가능에 가깝다.두 번째 인터페이스에 최대한 많은 기능을 구현하는 것이다.라이브러리에서 해결할 수 있거나그러나,인터페이스를 다르게 설계하면 알 수 있는 정보를클라이언트 코드에서 지정하도록 구현하면 안된다.또한 라이브러리의 결과를 합치는 데필요한 일을 클라이언트에게 떠넘기면 안된다.