GSI


CrashLanding 소스를 보면서 Texture2D 클래스를 보니까. 전체 텍스처에 대한 처리만 가능하도록 되어 있었습니다.
그래서 이걸 메소드를 하나더 만들어서 텍스처의 일부 영역을 화면에 뿌리고자 할려고 했습니다.

이때 Texture2D를 상속해서 Texture2DEx로 만들려고 했지만.. 
에러가 주루룩 떠드군요.. 

그래서 생각한 결과 Categories를 사용하게 되었습니다.
이 내용은 검색을 해보면 많이 나옵니다.

우선 구현한 내용을 아래에 기술합니다.

1. Texture2DEx.h, m 을 만듭니다.

2. 아래와 같이 코드를 헤더 파일에 작성합니다.


#import <Foundation/Foundation.h>

#import "Texture2D.h"


@interface Texture2D (SpriteAnimation)

- (void) drawAtPointTest:(CGPoint)point;

@end



3. 아래와 같이 코드를 소스 파일에 작성합니다.

#import "Texture2DEx.h"


@implementation Texture2D (SpriteAnimation)


- (void) drawAtPointTest:(CGPoint)point 

{

_maxS = 63.0 / 256.0// test

GLfloat coordinates[] = { 0, _maxT,

_maxS, _maxT,

0, 0,

_maxS, 0 };

GLfloat width = (GLfloat)_width * _maxS,

height = (GLfloat)_height * _maxT;

width = 63.0; // test

GLfloat vertices[] = { -width / 2 + point.x, -height / 2 + point.y, 0.0,

width / 2 + point.x, -height / 2 + point.y, 0.0,

-width / 2 + point.x, height / 2 + point.y, 0.0,

width / 2 + point.x, height / 2 + point.y, 0.0 };

glBindTexture(GL_TEXTURE_2D, _name);

glVertexPointer(3, GL_FLOAT, 0, vertices);

glTexCoordPointer(2, GL_FLOAT, 0, coordinates);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

}


@end


Posted by gsi
:


## Style1
NSArray* array = [NSArray arrayWithObjects:object1, object2, object3 nil];
NSEnumerator* enumerator = [array objectEnumerator];
NSString* aString = @"son";
id anObject = [enumerator nextObject];
while (anObject != nil)
{
  [anObject doSomethingWithString:aString];
  anObject = [enumerator nextObject];
}

## Style2
NSArray* array = [NSArray arrayWithObjects:object1, object2, object3 nil];
NSEnumerator* enumerator = [array objectEnumerator];
NSString* aString = @"son";
id anObject = nil;
while ((anObject = [enumerator nextObject]))
{
  [anObject doSomethingWithString:aString];
}

##Style3
NSArray* array = ''';
for(id object in someContainer)
{
  ...
}
Posted by gsi
:


한달도 남겨 두지 않은 상태에서 사태에 대해서.. 주워 듣다 보니..
결국 이걸 보게 되었네요.

학교라는 시스템에 붙잡혀 있고 싶지 않았던 저로서는.. 자격증 조차도 반감을 가지고 사는데요.
결국.. 자신의 경력에도 족쇠를 채우겠다는 의미로 보입니다.

물론 장단점은 있지만..
기존의 경력 자체를 무의미 하게 만들더군요..

고졸 개발자가 얼마나 될지 모르지만..
현재 시점에서 등급을 보니
초급기술자에 해당하더군요. -.- (거의 7년 이상을 *빠지게.. 일했는데..)
내 나이 33살에.. 군대 갔다 오면 23살인데.. 10년 빡세게 해서.. 회사를 다녀도 초급 기술자 입니다.

결국 기사 자격증을 따지 그랬냐.. 이런 질문이 날라 오는 상황이네요..

앞으로도.. 이 기술자신고 자료를 통한 큰 업무들이 저의 발목을 잡을지도 모르겠네요.
등록하라고 해서 등록은 하겠지만. 그동안 제가 밤잠 안자가며, 노력한 세월들이 단지 등급 초급에 머물고 있으니
분통이 터집니다. (걍 무시하고 살고 싶네요.. 그래도 밥벌이는 하겠죠.. ^^)

대학을 나왔다는 그 기준 하나로 몇년 생활을 하면, 중급 기술자가 되는 시대~~
하지만.. 그 사람들 일부 보다는 제가 더 실력은 있다고 인정하지만.
서류 심사에서 바로 떨어지는 사태.. 생길지도 모르겠네요. 씁슬하군요..

이런 모든 상황들이 대학교를 무조건 가야 한다는 근시안적인 제도를 만들어 내고,
고등학교 입시를 만들어 내고..
유치원생이 영어 공부에 6개월 1000 만원을 들이는 시대..
이젠 태교 교육에도 몇백만원 들이는 시대가 오겠네요.. 쩝..

아.. 개발을 정말 재미나게 할려면.. 이민을 가야 할까요?..
여러분들 의견은 어떠신가요?
Posted by gsi
:


CrashingLanding 인가..
그 소스를 기반 코드로 해서 지금 다른 프로그램을 좀 만들고 있다.

Objective-C의 코딩도 아직 익숙하지 않고,
하지만.. 오픈지엘 코드는 조금은.. 손에 익은 터라..

오늘 작업 하면서 비행기의 스프라이트가 한 이미지에 3장 짜리로 구성되어져 있었다.

189 * 55 인데..
즉. 가로 63 사이즈로 3장이 있는 것이다.

이것을 로그해서 드로잉을 해보니 제대로 나왔다.
즉, 189라는 2의 승수가 아닌 정보를 2의 승수로 내부적 처리를 하게 되는거 같다.

하지만.. 이때 텍스처의 좌표를 3등분해서 추가를 해보면..
값이 제대로 표시가 되지 않는다.
내부적으로 다르게 처리 되어지는거 같았다.

그래서 이미지를 189 * 55를 256 * 55 로 크롭을 시켜서
이미지를 확장 시켰다.

그 이후에 63.0 / 256.0 으로 해서 텍스트 좌표를 추가 하니까.. 제대로 표시가 되었다.

소스 코드 및 관련 이미지들은.. 솔직히 맥에서 어떻게 스크린샷을 뜨는지도 몰겠고 ^^..
그래서 걍 패스..

혹시나 관련 질문이 있으시면 코멘트 부탁 해요..
Posted by gsi
:


...
<script type="text/javascript">
  function getDate()
  {
    var date = new Date();
    ....
  }

  window.setInterval(getDate, 1000);
  // 1초(1000)마다 window 를 호출한다.

</script>
<title> Javascript Timer </title>
</head>
<body>
...

화면의 특정 부분을 주기적으로 업데이트 하기 위해서는
위와 같이 window.setInterval() 메소드를 사용해서 타이머를 연동하면 된다.
이걸 사용해서 ajax 를 연동하게 되면 특정 DB나 기타 다른 내용들을
주기적으로 해당 div 등에 연동이 가능하다.
Posted by gsi
:

insert  into aaa.dbo.aa select * from bbb.dbo.bb;
-- 이걸 사용하게 되면 다른 DB의 같은 테이블 구조를 가지고 있을때 내용을 복사할 수 있다.

Posted by gsi
:


VS2003에서 InitializeCriticalSectionAndSpinCount 함수를 사용할려고 적용을 해보면
아래와 같은 컴파일 오류가 생긴다.

...\lock.cpp(50): error C3861: 'InitializeCriticalSectionAndSpinCount': 인수 종속성을 조회해도 식별자를 찾을 수 없습니다.

이런 경우는 window.h 이전에 _WIN32_WINNT의 디파인된 내용이 잘못되서 그런거 같다.

mfc의 경우 stdafx.h의 상단에 보면
#ifndef _WIN32_WINNT  // Windows NT 4 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_WINNT 0x400   // Windows 98과 Windows 2000 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif 

이란 부분에 있다.

여기서 0x400 부분을 0x403으로 수정해 주면 해결이 된다.
Posted by gsi
:

// 프로세스 찾기
#include <tlhelp32.h>
bool GetProcessModule(DWORD dwPID, char* sProcessName);

bool ProcessFind(char* strProcessName)
{
    HANDLE         hProcessSnap = NULL;
    BOOL           bRet      = FALSE;
    PROCESSENTRY32 pe32      = {0};

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hProcessSnap == (HANDLE)-1)
        return false;

    pe32.dwSize = sizeof(PROCESSENTRY32);

    //프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다
    if (Process32First(hProcessSnap, &pe32))
    {
        BOOL          bCurrent = FALSE;
        MODULEENTRY32 me32       = {0};

        do
        {
            bCurrent = GetProcessModule(pe32.th32ProcessID,strProcessName);
            if(bCurrent)
            {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
                if(hProcess)
                {
                    // 이 주석을 없애면 프로세스를 죽이는것도 가능하다.
                    //if(TerminateProcess(hProcess, 0))
                    //{
                    //    unsigned long nCode; //프로세스 종료 상태
                    //    GetExitCodeProcess(hProcess, &nCode);
                    //}
                    //printf("process exit\n");
                    CloseHandle(hProcess);
                    return true;
                }
            }
        }
        while (Process32Next(hProcessSnap, &pe32)); //다음 프로세스의 정보를 구하여 있으면 루프를 돈다.
    }
    CloseHandle (hProcessSnap);
    return false;
}

bool GetProcessModule(DWORD dwPID, char* sProcessName)
{
    HANDLE        hModuleSnap = NULL;
    MODULEENTRY32 me32        = {0};
    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);

    if (hModuleSnap == (HANDLE)-1)
        return (FALSE);

    me32.dwSize = sizeof(MODULEENTRY32);

//해당 프로세스의 모듈리스트를 루프로 돌려서 프로세스이름과 동일하면
//true를 리턴한다.

    if(Module32First(hModuleSnap, &me32))
    {
        do
        {
            printf("process name : %s\n", me32.szModule);

   if( strcmp(me32.szModule, sProcessName) == 0 )
   {
    CloseHandle (hModuleSnap);
    return true;
   }
            //if(me32.szModule == sProcessName)
            //{
            //    CloseHandle (hModuleSnap);
            //    return true;
            //}

        }
        while(Module32Next(hModuleSnap, &me32));
    }

    CloseHandle (hModuleSnap);
    return false;
}

----------------- 사용할때 -------------------
 // 런처가 돌고 있는지를 판단한다. (제가 한건 해당 프로세스가 돌고 있는지를 찾는 코드로 재사용 했음)
 if( ProcessFind("CruiseLauncher.exe") == false )
 {
  MessageBox(NULL, "CruiseLauncher가 실행중이지 않습니다.", "오류", MB_OK);
  exit(0);
 }

Posted by gsi
:


이 오류가 뭔지 처음에는 많이 애매했다.
이게 나온 경우는 아래와 같다.

UnitProject로 사용자 정의 컨트롤을 하나 만들었습니다.
그리고 테스트가 제대로 되서
메인 프로젝트에 해당 Xaml, cs 파일의 내용을 그대로 복사

그렇게 했을때 오류가 발생하더라구요.

오류 CS0103: 'InitializeComponent' 이름이 현재 컨텍스트에 없습니다.

왜 나왔냐.. 찾아 보니까 문제는 네임스페이스였습니다.

xaml 코드에서 x:Class="WpfApplication1.ucStartup" 라는 부분이 있었는데
메인 프로젝트의 네임 스페이스는 WpfApplication1 이게 아니였기 때문입니다.

그렇다 보니 cs 파일의 생성자 부분의 'InitializeComponent'  메소드가 네임스페이가 틀리게 되면
호출되지 않게 됩니다.

그러면 'InitializeComponent'  이 메소드는 어디 있는가?

이건 컴파일 타임에서 생성되며 보통 Xaml 파일이 obj/Debug/**.g.cs 파일로 만들어 지는데요.
그 속에 존재를 하게 됩니다.

뭐.. 잘만 하면 나오지 않는 오류이지만, 어떤 오류인지 알고 나니 더 좋다고나 할까요? ^^
Posted by gsi
:

스토리 보드를 사용할때 에니메이션이 끝나고 다른걸 처리 하는 경우가 많다.
<Storyboard x:Key = "ZoomInImage" Completed = "ZoomFinished">
...

위와 같은 코드가 xaml 파일에 존재 하면
cs 파일에는 Completed의 이벤트 메소드가 선언되어 있어야 한다. (블랜드에서도 자동으로 생성하게 된다.)

private void ZoomFinished(object sender, EventArgs e)
{
Window1 parentWindow = Window.GetWindow(this) as Window1;
parentWindow.UpdateDisplay(FolderPath);
}

위와 같이 sender로 전달되어온 Storyboard 의 부모 윈도우를 얻을때 GetWindow() 를 통해서
가져올 수 있다.
Posted by gsi
:


DROP TABLE #MyTempTable; --임시테이블을 만든다.
-- CTE 구조로 해서 원하는 내용을 뽑아 온다.
with empCTE(
 _idx,
 _uid,
 _puid)
as
(
 -- boss only
 select idx, uid, puid
 from userList_tmp
 where uid = 'test1' and grade = '2' --최초 탐색 시점

 union all

 select aa.idx, aa.uid, aa.puid
 from userList_tmp as aa inner join empCTE as bb
 on aa.puid = bb._uid
 --where bb.level < 3
)
select _idx into #MyTempTable from empCTE --임시테이블로 복사
GO
-- 임시 테이블의 내용을 원본 테이블에서 삭제
delete from userList_tmp where idx in (select * from #MyTempTable)  제

Posted by gsi
:

c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WinSock2.h(109): error C2011: 'fd_set' : 'struct' 형식 재정의

#define WIN32_LEAN_AND_MEAN  // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.

windows.h 위에 디파인을 추가 합니다.
Posted by gsi
:


c:\gsiproject\영호형회사\rfc\영호형_프로젝트\300.cruise\200.cruisemainproject\unit-module\cruise\network\lock.cpp(46): error C3861: 'InitializeCriticalSectionAndSpinCount': 인수 종속성을 조회해도 식별자를 찾을 수 없습니다.
c:\gsiproject\영호형회사\rfc\영호형_프로젝트\300.cruise\200.cruisemainproject\unit-module\cruise\network\lock.cpp(21): error C3861: 'SwitchToThread': 인수 종속성을 조회해도 식별자를 찾을 수 없습니다.
c:\gsiproject\영호형회사\rfc\영호형_프로젝트\300.cruise\200.cruisemainproject\unit-module\cruise\network\lock.cpp(59): error C3861: 'TryEnterCriticalSection': 인수 종속성을 조회해도 식별자를 찾을 수 없습니다.

위와 같은 오류가 난다면.

#ifndef _WIN32_WINNT  // Windows XP 이상에서만 기능을 사용할 수 있습니다.                  
#define _WIN32_WINNT 0x0501 // 다른 버전의 Windows에 맞도록 적합한 값으로 변경해 주십시오.
#endif
 

이 코드를 stdafx.h의 window.h 선언 위쪽에 추가해 준다.
Posted by gsi
:


돈을 표시할때 세자리 마다 콤마를 표시 할려고 할때 좀 삽질을 많이 했다.
BoundField 이걸 사용해서 바로 하기 위해서

DataFormatString="{0:n0}"    // 출력 : 1,000,000

를 사용하면 제대로 표시가 된다.

이거 말고 아래와 같이 사용하면 소수점도 표시가 되는거 같다.

DataFormatString="{0:n}"    // 출력 : 1,000,000.00
Posted by gsi
:



위쪽의 쿼리 결과 리스트에서 보면 uid, puid, grade 등의 조직도를 구성할 수 있는 정보가 존재 할때
아래와 같은 결과를 만들어 낼 수 있다.

[쿼리예]
with empCTE(empUid, mgrName, dept, level)
as
(
 -- 보스
 select uid, puid, grade, 0
  from userList
  where puid is null and grade = '0'
 union all
-- 나머지 grade를 포함한 내용
 select aa.uid, aa.puid, aa.grade, bb.level+1
  from userList as aa inner join empCTE as bb
  on aa.puid = bb.empUid
 where bb.level < 3  -- 이 코드가 없어지면 모든 grade에 대해서 출력이 된다. 즉, grade를 제한할때 사용
)
select replicate('ㄴ', level) + empUid as uid, dept from empCTE order by empUid, level
Posted by gsi
: