chen_p5-sosp.pdf

The measured performance of personal computer operating system


What every programmer should know about memory.pdf

What every programmer should know about memory


준비. 준비.

Trackback Address :: http://zsimi.tistory.com/trackback/190

댓글을 달아 주세요

환경설정 수정하기. (CVS경로 설정)

CVS에서 체크아웃하기.

톰캣에 deploy하기.

cvsdeploy.sh 쉘 스크립트

Trackback Address :: http://zsimi.tistory.com/trackback/189

댓글을 달아 주세요

■ VBA
오늘 엑셀 작업을 할 일이 있어서 오랜만에 VBA를 짰다. 일회용으로 쓸 꺼라서 그냥 자동으로 생성되는 코드를 사용하기만 했다.

■ Greasemonkey와 자바스크립트
그러다가 웹 페이지에서 특정 수치를 긁어서 엑셀로 복사 붙여넣기를 해야하는 작업이 생겼다. (그것도 많이!) 똑같은 작업을 자동화 하는게 프로그래머의 임무라고 생각해서, 단순 노동을 하지 않고 Greasemonkey를 사용해서 자바스크립트로 해결 하려고 시도 하였다.

결과적으로는 단순 노동 보다 시간이 더 걸렸던것 같다. 자바스크립트가 손에 익지 않아서 일 것이다. (js는 아무리 해도 적응하기 힘들다.) 아무튼 일회용 코드이고, 기존 소스가 굉장히 더러운 소스였기 때문에 (태그별로 id가 전혀 없다) 위치를 통해서 객체를 얻고 그 객체의 문자열을 클립보드에 복사하는 스크립트를 짰다. 하지만 클립보드로 복사하는 코드가 익스플로러 밖에 안되서 좌절. (-_-;) 할 수 없이 그냥 아래와 같이 해당 숫자를 끊어서 링크가 안 걸린 순수 문자열을 복사하기 좋은 위치에 추가 시키는 스크립트로 만족했다.

var elPageView=document.elementFromPoint(623,206)
var strPV = elPageView.innerHTML.replace(/,/g,'')

var elP = document.createElement("p");
elP.innerHTML = strPV

elPageView=document.elementFromPoint(250,50)
elPageView.appendChild(elP)

'딱딱한것 > IT/프로그래밍' 카테고리의 다른 글

서버의 CVS에서 직접 deploy 하기.  (0) 2008/07/28
VBA와 자바스크립트  (2) 2008/07/15
MFC와 DX, 그리고 채팅 프로그램 만들기.  (2) 2008/06/29
리눅스 설치.  (0) 2008/06/24

Trackback Address :: http://zsimi.tistory.com/trackback/188

댓글을 달아 주세요

  1. 성기 2008/07/22 07:53 주소 수정 답글 달기

    프로그래밍 다시 짤생각하니 눈물이 앞을 가리네요...

    • 2008/07/22 22:39 주소 수정 BlogIcon 시미

      난 전역하고 학교 복학할때
      기뻐서 눈물이 앞을 가렸는데

■ MFC+DX를 이용하는 서버/클라이언트 방식의 채팅 프로그램
과제가 있어서 위와 같은 긴 컨셉으로 프로그램을 만들었다. 이 프로그램을 만들면서 새롭게 알게 된 것과 잘못 알고 있었던 사실에 대한 정리.

■ MFC에 DX 올리기.
hr = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
        GetDlgItem(IDC_RENDERVIEW)->GetSafeHwnd(),
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &m_d3dpp, &m_pD3DDevice );
여기서 윈도우의 핸들(HWND)를 주면 그곳으로 D3D를 렌더링 할 수 있다고 생각하고 ListBox 컨트롤을 만들어서 채팅 프로그램을 대충 다 만들고, 그 ListBox 컨트롤의 핸들을 넘겨 줬는데. 렌더링이 되지 않았다. 예제를 찾아서 연구(?)한 결과 Picture 컨트롤을 만들고 따로 변수를 만들필요 없이 위에서 한 것처럼 컨트롤 이름으로 핸들을 받아서 d3ddevice를 생성하면 된다.
사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지

Trackback Address :: http://zsimi.tistory.com/trackback/185

댓글을 달아 주세요

  1. 굳샷임돠 2008/08/13 13:50 주소 수정 답글 달기

    ㅋㅋ

코딩이 잘 안 되는 시간에는 그냥 소스코드를 켜 놓고 멍하니 있는게 도움이 된다. 그렇게 멍하니 있다보면 집중력이 돌아오고 해결해야 할 문제가 명확해지는 기분이다. 그리고 얼마지나지 않아 코딩할 기분이 난다. 코딩이란 내키지 않으면 절대로 못하는 법이라니까. 다시말해 집중이 잘 안된다고 다른 일을 하거나 하면 집중력은 이미 라스베가스로 가서 돌아오지 않는다. 소스코드를 보면서 멍하니 있는게 중요하다. (그리고 그 시간은 기분이 좋다. 사람은 멍때리기 위해 존재한다고까지 말할 수 있다니까.)

Trackback Address :: http://zsimi.tistory.com/trackback/184

댓글을 달아 주세요

■ 링크와 컴파일.
컴파일 후 목적 파일(obj)이 생긴다. 목적 파일은 헤더파일에 기록된 함수의 사용법이나 함수의 형식만 알고 있을뿐 다른 파일에 있는 함수의 실제 구현은 알지 못한다. 링크는 그런 목적파일들을 모아서 실행파일로 만들어 주는 것이다. 즉 말그대로 링크는 최종 실행파일을 만들기 위해 각 파일들에 연결되어 필요한 부분들을 찾아서 연결하는 작업이다. 완전히 링크하여 실행파일을 만드는 것을 정적링크라고 하고, 프로그램 실행중에 외부에 존재하는 필요한 목적코드를 찾아서 연결하는 것이 동적링크 이다.

■ static 함수
모듈 프로그래밍을 할 때, 이 함수가 모듈 안에서만 사용되고 다른 커널에서 참조할 필요가 전혀 없다면 static 으로 만든다. (init_module()과 cleanup_module()은 예외적으로 static을 하지 않아도 커널 영역에 공개되지 않는다. 자동으로) 커널 영역에 공개된 함수는 /proc/ksyms (커널 2.6에선 kallsyms)에서 확인할 수 있다. static은 원래 변수가 프로그램에서 가장 먼저 초기화되어 전역변수처럼 변수값이 유지된다. 함수 앞에 static이 붙으면 그 함수는 해당 파일에서만 사용되는 함수가 된다. (다른 함수에서 extern 으로 그 함수를 사용하려고 해도 static함수는 쓸 수 없다.)
한 줄 요약: static 함수는 이 함수를 이 파일에서만 쓰겠다는 뜻. (다른 파일에서는 못 씀)

'딱딱한것 > IT/프로그래밍' 카테고리의 다른 글

리눅스 설치.  (0) 2008/06/24
(커널)모듈 프로그래밍에서 링크, static  (1) 2008/06/07
HLSL without Effects(임시)  (4) 2008/06/05
Rendering Water Caustics  (0) 2008/05/29

Trackback Address :: http://zsimi.tistory.com/trackback/175

댓글을 달아 주세요

  1. simi 2008/06/09 14:45 주소 수정 답글 달기

    http://staruml.sourceforge.net/docs/user-guide(ko)/toc.html
    스타UML사용자 가이드

사용자 삽입 이미지

텍스쳐 효과가 아닌 정점이 직접 움직인다.

사용자 삽입 이미지

원래는 그냥 평면. 가운데는 왜 검지?

■ DX SDK 샘플들 중에서 HLSLwithoutEffects에 대한 세미나 발표 후 내용 정리. 아직까지는 임시변통적으로 키워드만 나열한 상태이므로 집중해서 읽을필요는 없음. 다음 주(가능하다면)에 정리해서 자세히 설명하겠음.

■ 일단 오늘 새롭게 뇌에 주입된 주제.
(1) GLUT를 모방한 것처럼 보이는 <DXUT> 이제 DirectX SDK 샘플들은 모두 DXUT바탕이 될 듯. 즉, GLUT처럼 콜백함수를 등록하는 방식으로 윈도우 생성이나 함수들을 등록하여 쉽게 DX를 배울 수 있다. 역시 점점 쉬워지는 구만.
(2) <HLSL>의 함수에 정점 정보를 넘겨주면 HLSL에서정점의 위치와 색을 변경할 수 있다.
(3) g_Camera에 대한 것.
(4) g_HUD에 대한 것. HUD는 무슨 뜻?
(5) 인덱스버퍼를 채우는 것에 대한 것.
(6) XZ평면에 놓인 직사각형의 면을 꿀렁꿀렁하게 하는(즉 Y좌표를 변화) 효과에 대한 것.

HLSLwithoutEffects.cpp파일의 OnResetDevice()

HLSLwithoutEffects.vsh파일 안의 HLSL코딩(면을 꿀렁꿀렁하게 만드는 Ripple() 함수)

HLSL에서 정점의 위치를(Output.Position) 바꿀 수 있는것 같다.
ConstantTable, HLSL, FVF없이 x와 y만 있는 vertex. 그후 HLSL의 Ripple함수에 정점을 넘겨줌.
HLSL의 Ripple 함수 내에서 넘겨받은 정점의 위치를 수정함.

XZ평면에 놓인 정사각형의 물체를 각 프레임 마다 Y축 방향으로 꿀렁꿀렁하게 만드는 프로그램이다. 꿀렁꿀렁한 것은 원래 평면과의 거리와 시간에 기초한다. 시간은 매 프레임마다 계속 증가한다. 왜냐하면 Y좌표와 정점의 색은 각 프레임마다 생성되기 때문이다. 그것들은 저장이 필요없다. 그러므로 정점정의(the vertex declaration)은 오직 D3DXVECTOR2만 포함된다. (X와 Z좌표로 이루어진.)
(주석: FVF를 안쓰고 X와 Z의 2개의 벡터만 사용한다. 근데 위의 소스에서는 x와 y의 값을 사용한다. 뭥미?)

초기화하는 동안, D3DXCompileShaderFromFile()로 파일로 부터 셰이더를 읽어 컴파일한다. 그 후에 ID3DXBuffer은 셰이더 코드와 ID3DXConstantTable을 포함한다. (ID3DXConstantTable은 App가 셰이더가 만든 전역변수를 얻고 설정하도록 허용한다.) 그리고 IDirect3DDevice9::CreateVertexShader를 호출한다.

FrameMove() 에서는 ID3DXConstantTable 인터페이스를 사용한다 (셰이더의 전역 변수들인 mViewProj과 fTime을 설정하기 위해, 그리고 view+projection transformation과 셰이더를 위한 time parameter를 업데이트 하기 위해) 렌더링 할때 이 샘플은 IDirect3DDevice9::SetVertexShader를 호출한다. SetVertexShader 함수는 디바이스에 버텍스 셰이더 렌더링이 가능하도록 키는(enable) 하는 것이다. IDirect3DDevice9::DrawIndexedPrimitive가 호출된 이후, 정점 셰이더는 버텍스 처리가 있을때마다 한번씩 불러지게 된다.

버텍스 쉐이더는 HLSLwithoutEffects.vsh 이 파일에 텍스트 형식으로 써 있다. 이 파일에는 두 개의 전역변수와 한 개의 셰이더 함수가(Ripple()) 있다. Ripple() 함수는 float2(정점의 X와 Z)을 받아서 2개의 float4를 리턴한다. 리턴하는 이 변수는 화면공간의 위치와 정점의 색을 나타낸다. Y좌표는 아래의 함수에 의해 매번 생성된다. 

Y = 0.1 * sin( 15 * L * sin(T) );

L은 정점과 Y가 조정되기 전 과의 거리이다. 즉 L은 루트(X제곱+Z제곱)의 값이다. 왜냐하면 정점들은 XZ평면 위에 있기 때문이다. T는 전역변수 fTime이다. sin(시간) 이니까 시간이 지나감에 따라서 sin 그래프 처럼 꿀렁꿀렁 해지는 것 같다.

정점의 색은 아래의 함수에 의해서 명암이 결정된다.

C = 0.5 - 0.5 * cos( 15 * L * sin(T) );

C는 RGBA(0~1의 범위).  (각 정점마다)검정에서 흰색으로의 색이 나온다. 그래서 명암이 꿀렁꿀렁하게 보이게 된다.

Trackback Address :: http://zsimi.tistory.com/trackback/172

댓글을 달아 주세요

  1. 현기쿤 2008/06/06 01:48 주소 수정 답글 달기

    D3DXVECTOR2( ((float)x / (float)(VERTS_PER_EDGE-1) - 0.5f) * D3DX_PI,

    이거 괜히 파이 들어있어서 꾸물꾸물하게 하는것 같았는데;;
    아니네 ㅋㅋ

    • 2008/06/06 12:52 주소 수정 BlogIcon 시미

      그러게. 왜 이렇게 되는지 연구(?) 하고 있으니까 다음주를 기대해. 후후.

  2. 현기쿤 2008/06/11 03:38 주소 수정 답글 달기

    예전에 내꺼 hlsl without effect 컴파일 할때
    __in, __out 때문에 컴파일 에러 났던적 있잖아 그게
    구글에서 검색해본 결과
    windows platform sdk 최신버전을 깔아야 한다는군~

    http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en

    에서 다운 받을수 있음~

    • 2008/06/15 22:35 주소 수정 BlogIcon 시미

      platform sdk 면 VS 설치할때 깔리는거 아냐? 그런 하위 호완성도 없이 특성 타도록 DX를 만들다니. MS가 점점 하위호완성을 무시하는것 같애. 비스타도 그렇고, 말이야. 쯧쯧.

보통 반복문을
for(int i=0 ; i<10 ; i++)
이런 식으로 사용 하듯이.

iterator도 first에서부터 last까지라고 하면 last는 포함이 되지 않는다. 그래서 .begin() 함수는 실제로 있는 데이터를 가리키지만, .end()는 이미 꼬리를 지난 마지막을 나타낸다. 그래서 아래와 같은식으로 사용한다.
for( it=notSearched.begin() ; it!=notSearched.end() ; it++)
이런식으로 .end()가 아닐 동안 돌아도 전 자료를 다 돌 수 있다.

그래서 it = find(inVector.begin(), inVector.end(), element); 과 같이 find문의 결과도 찾은 결과가 있으면 해당 원소의 iterator가 반환되고 결과가 없으면 .end() 즉, 마지막 iterator가 넘어오게 된다. 그러니까 아래 처럼 쓰면 된다.
it = find(inVector.begin(), inVector.end(), element);
    if( it == inVector.end() )
        return 0; //없음.
    else
        return 1; //있음.

'딱딱한것 > IT/프로그래밍' 카테고리의 다른 글

파일 입출력과 상수 벡터 인자.  (0) 2008/05/28
STL의 반복자.  (0) 2008/05/25
이중포인터  (0) 2008/05/22
루아 문법 규칙.  (2) 2008/05/18

Trackback Address :: http://zsimi.tistory.com/trackback/165

댓글을 달아 주세요

■ 어떤 함수에다가 구조체의 포인터를 인자로 넘겨주고
함수내부에서 그 구조체 포인터에 메모리를(heap에) 잡는다고 하면
이중포인터로 넘겨주어야 한다.

■ 그래서 오늘 아래와 같은 코드를 짰다.
typedef struct{ float x,y,z, nx,ny,nz; } VERTEX;
typedef struct{ int vertex[3]; float nx,ny,nz; } TRIANGLE;

void GetDataFromFile(int *nVertexies, int *nTriangles, VERTEX **v, TRIANGLE **t) {
    fscanf(fp,"%d",nVertexies);
    fscanf(fp,"%d",nTriangles);

    *v = new VERTEX[*nVertexies];
    *t = new TRIANGLE[*nTriangles];

    for(i=0 ; i<*nVertexies ; i++) {
        fscanf(fp,"%f", &((*v)[i].x) );
        fscanf(fp,"%f", &((*v)[i].y) );
        fscanf(fp,"%f", &((*v)[i].z) );
    }
}

void main() {
    VERTEX *vertex;
    TRIANGLE *triangle;

    GetDataFromFile(&nV, &nT, &vertex, &triangle);

    if(vertex!=NULL) delete vertex;
    if(triangle!=NULL) delete triangle;
}

■ 별로 안 좋은 코드이고, 잘 안 쓰일것 같은데.
의외로 DX에도 이런 코드가 여럿 보인다.
위의내용은 전적으로 (천재인)현기한테 배운것이다.
(고마움과, 도움 받은 것은 표현을 아끼지 말아야 한다.)

'딱딱한것 > IT/프로그래밍' 카테고리의 다른 글

STL의 반복자.  (0) 2008/05/25
이중포인터  (0) 2008/05/22
루아 문법 규칙.  (2) 2008/05/18
SVN에서 Repository의 일반적인 레이아웃.  (0) 2008/05/16

Trackback Address :: http://zsimi.tistory.com/trackback/163

댓글을 달아 주세요

루아 전체 문법 규칙.

■ Load 하기.
루아에서 텍스트를 불러오든 청크를 불러오든 lua_load() 를 써서 불러 올 수 있다.
int lua_load (lua_State *L, lua_Reader reader, void *data, const char *chunkname);

■ 바이트코드로 변환 하기.
luac -s -o test.out test1.lua test2.lua test3.lua
하면 test.out으로 합쳐지면서 바이트코드로 변환된다.
근데 바이너리코드와 바이트코드는 무슨 (의미의) 차이가 있을까?

'딱딱한것 > IT/프로그래밍' 카테고리의 다른 글

이중포인터  (0) 2008/05/22
루아 문법 규칙.  (2) 2008/05/18
SVN에서 Repository의 일반적인 레이아웃.  (0) 2008/05/16
STL, vector, cin  (0) 2008/05/15

Trackback Address :: http://zsimi.tistory.com/trackback/160

댓글을 달아 주세요

  1. BlogIcon 시미 2008/05/20 13:43 주소 수정 답글 달기

    for _, enemy in ipair(Enemies) do
    enemy:update()
    end

    이런식의 코드가 가능.