블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2809)
Unity3D (865)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

안녕하세요? 맨날맑음 입니다.

WPF나 Silverlight 와는 다르게 Windows Form에는 '로드 완료' 이벤트가 없습니다. Load 이벤트가 제공 되고 있기는 하지만 MSDN에 나온 의미는 '폼이 처음으로 표시되기 전에 발생합니다.' 입니다. 즉 로드 완료가 아니라는 것입니다.

이것이 왜 문제일까?
로드 완료가 아닌 로드중 이벤트만 제공하여 생기는 문제가 있습니다.
예를 들어 프로그램을 시작할 때 폼을 숨기려고 한다고 하면, Hide() 메서드를 호출 해야합니다.
실행 할때 숨기려 했으니 당연히 폼의 생성자에 Hide()를 넣어보지만 전혀 동작 하지 않습니다.
두번째 방법으로 폼의 Load 이벤트 핸들러 안에 Hide()를 넣어봅니다. 역시 동작하지 않네요;
정확하지 는 않지만, MSDN의 설명대로 폼이 아직 표시되기 전이라 Hide()가 먹히지 않는 것 같습니다.
이밖에 Focus()나 몇몇 다른 메서드도 동작하지 않습니다.

어떻게 해결할까?
위의 문제를 해결하려면 '로드완료' 이벤트를 찾아야 하는데 아무리 뒤져보아도 로드완료는 존재하지 않았습니다.
그래서 임시 방편으로 Application.Idle 이벤트를 사용하여 해결 하였습니다. Application.Idle 이벤트는 말그대로 프로그램이 아이들 상태(쉬고 있을때) 발생합니다. 이걸 응용하면, 생성자에서 이벤트를 걸어주고, 이벤트 핸들러에서 이벤트를 빼주는 방법으로 로드 완료된 시점을 잡을 수 있습니다. 물론 엄밀히 말하면 프로그램이 더이상 할 일이 없어 쉬고 있을 시점을 잡아내는 것입니다.

using System;

using System.Windows.Forms;

namespace Sample

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            //Idle이벤트를 걸어준다.

            Application.Idle += Application_Idle;

        }

        void Application_Idle(object senderEventArgs e)

        {

            //Idle이벤트를 없앤다.

            Application.Idle -= Application_Idle;

            this.Hide();

        }

    }

}


위의 코드에서 Idle 이벤트 핸들러에서 Application.Idle -= Application_Idle; 이벤트를 빼주는 방법으로 프로그램이 처음으로 쉴때(로드완료)를 잡아내는 것입니다. 이렇게 임시 방편이나마 로드 완료 시점을 잡아서 hide() 메서드를 동작시킬 수 있습니다.




반응형
Posted by blueasa
, |

최근 이사를 했는데 창문을 열면 뻥~ 뚫린 전망이 좋다.


바람도 잘불고..(너무 세서 문제일때도 있지만..;;)


근데!! 근데!! 비가 오면 바람을 동반해서 창문에 비가 열심히 들이친다..;;


결국 창문을 닫을 수 밖에 없는데 창문을 닫으면 덥다..;;


좋은 방법 없나..하고 이리저리 검색해보다가 멋진 걸 발견..!!


직접 만드셨다고 한다..


어디 파는데 없나..


출처 : http://omini82.blog.me/50095454555









반응형
Posted by blueasa
, |

참조 사이트

Server/MS-SQL / 2012. 7. 4. 02:33

링크 : http://blog.naver.com/noir1986

반응형
Posted by blueasa
, |

[삽질] Unity3D 설치

Unity3D / 2012. 6. 30. 23:05

전에 아이폰/안드로이드 포팅 엔진 공짜로 받은 게 있어서 이참에 깔아볼려고 유니티를 받았다.


설치를 하고 라이센스 등록을 하려는 데 '인터넷 활성화(Internet Activation)'가 아래 스샷과 같이 인증서 날짜 만료 어쩌고 하면서 진행이 되지 않았다.

(인터넷 활성화 설치 방법 설명 링크 : http://www.masque.kr/free/50300)



                          [인터넷 활성화 시도 했는데 에러남..뭘까..-_-;]


그래서 '수동 활성화(Manual Activation)'를 하려하니..


뭐시기 파일 어쩌고 하면서 잘 모르겠다..


그래서 찾아보니


http://korea.unity3d.com/board/?db=licensefaq 에 '유니티 라이센스 수동 등록하는 방법 (Manual Activation)' 이 떡하니 있다.


설명대로 진행해서 깔았다.


인터넷에 이리저리 좀 뒤져봐도 '인터넷 활성화'로만 설명이 돼 있는것 같다.


잠시 삽질해서 기록 남기기..




[설치 끝내고 첫화면 스샷..]


P.s. 인증서 날짜 만료 어쩌고는 자료를 못찾겠다. 짜증나지만 그냥 넘어가야지..

반응형

'Unity3D' 카테고리의 다른 글

유니티에서 툴 만들기  (0) 2012.10.12
[링크] 유니티 관련 사이트  (0) 2012.10.12
Visual Studio C# Integration  (0) 2012.10.05
유니티 강좌  (0) 2012.10.03
유니티 코리아 공식 홈페이지  (0) 2012.08.21
Posted by blueasa
, |

A*에 비해 빨리 길을 찾아줍니다. 최단경로는 아님


반응형
Posted by blueasa
, |

프로그램에 실행 될 때마다 필요한 메모리 공간(지역 변수, 전역변수 공간)의 할당을 위해 메인 메모리(RAM)에 할당된다. 이렇게 할당되는 메모리 공간은 데이터, 힙, 스택의 세 영역으로 나뉜다.


[그림 1] C 언어의 메모리 관리 구조


■ 데이터 영역(Data Area)

데이터 영역은 전역 변수와 static 변수가 할당되는 영역이다. 이 영역에 할당되는 변수들은 일반적으로 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야만 메모리에서 소멸된다. 즉, 데이터 영역에 할당된 변수는 프로그램이 종료될 때까지 계속 존재한다는 특징을 지닌다. 전역 변수와 static 변수의 특징과 일치하는 부분이다.

■ 스택 영역(Stack Area)

스택 영역은 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다. 이 영역에 할당된 변수는 함수 호출이 완료되면 사라진다는 특징을 지닌다. 이는 다른 메모리 영역과 확실히 비교되는 특징이다. 늦게 할당된 변수의 메모리가 먼저 해제되므로 스택의 특징과 일치한다.

■ 힙 영역(Heap Area)

힙 영역은 프로그래머가 관리하는 메모리 영역이다. 즉 프로그래머의 필요에 의해서 메모리 공간이 할당 및 소멸되는 영역이다. 동적 할당으로 생성되는 메모리 영역이다.

※ 정적 할당되는 변수의 메모리는 변수의 특성에 따라 데이터 또는 스택 영역에 생성된다. 정적 할당은 컴파일 단계(Compile-time)에서 모두 이루어진다. 하지만 컴파일 단계에서는 메모리의 크기만 생성 할 뿐 변수의 값은 저장 되지 않는다. 이 때문에 배열의 크기는 상수로만 지정해야 하는 것이다. 변수 값의 저장은 런타임(Run-time)에서 이루어지며, 런타임 단계에서 메모리를 생성하고자 할때 사용하는 것이 동적 할당이다.


출처 : http://blog.naver.com/sulzi83/100065485863

반응형
Posted by blueasa
, |

필리핀 슬럼가에는 집안에 햇빛이 들지 않아서 대낮에도 어두운 집이 많다. 그렇지만, 이런 가난한 집안에서 전기를 끌어다 쓴다는 것은 커다란 사치이다. 이런 슬럼가에 한 줄기 빛을 전기도 없이 밝힐 수 있는 혁신적인 프로젝트가 소개되어 화제다. 

흔히 구할 수 있는 플라스틱 병에 물과 표백제를 약간 넣고, 지붕에 작은 구멍을 뚫어서 꽂으면 햇빛을 산란시켜서 집안 전체를 마치 형광등을 켠 것처럼 밝혀주게 된다. 55~60와트 백열등에 해당하는 밝기의 빛을 1년에 10개월 가까이 공급할 수 있는 것이다. 이 프로젝트는 Illac Diaz 라는 생태 운동가에 의해 진행이 되었다. 

이 기술의 최초 아이디어는 MIT의 학생에 의해서 제시되었다고 한다. 이렇게 제작된 물병등(?)은 5년 정도는 지속되는데, 첨가된 표백제가 이끼 등이 자라는 것을 막아주기 때문에 그 동안은 집안에 안정적으로 빛을 공급할 수 있다. 비록 밤에는 동작하지 않는다고 하더라도, 낮 동안 사용되는 이 물병등에 의해 저소득 층의 전기 사용량을 크게 줄일 수 있다. 

이 프로젝트는 지방정부와 여러 NGO 등과 함께 마닐라시와 주변의 라구나 지방에 10,000개가 넘게 설치가 되었으며, 일반 주택에서도 전기를 절약한다는 측면에서 설치하는 곳들도 많이 늘어나고 있다. 아주 첨단의 하이테크 기술이 아니더라도 얼마든지 많은 사람들의 생활을 증진시키고, 필요하지 않은 에너지를 절약할 수 있는 좋은 선례라고 할 수 있다.



출처 : http://www.journalogplus.net/economy/go/4146

반응형
Posted by blueasa
, |
반응형

'Memories' 카테고리의 다른 글

[M/V] 이선희 정규 15집 앨범 세렌디피티(Serendipity) - 그중에 그대를 만나  (0) 2014.03.27
자귀 나무  (0) 2013.05.24
[MUD] 마계지문 재오픈  (11) 2012.06.09
노이즈 - 착각  (0) 2012.06.04
고메~ 빼때기죽~  (1) 2012.01.25
Posted by blueasa
, |

GetAsyncKeyState() 함수와 GetKeyState() 함수는 키보드의 키가 눌렸는지를 체크하는 함수들이다.

GetAsyncKeyState() 함수는 비 동기(Asynchronism)로 처리한다. 즉, 호출된 시점에서 키 상태를 조사하여, 메시지 큐를 거치지 않고 바로 리턴을 해 주므로 키 입력을 바로 처리해 줄 수가 있다.

GetKeyState() 함수는 호출된 시점에서 메시지 큐를 거치며, 메시지 발생 후의 상태를 리턴하게 되므로, 키보드 메시지 처리 루틴내에서 사용해야 한다. 게임과 같이 키 입력에 바로 반응을 해 줘야 하는 프로그램에서는 GetAsyncKeyState()함수를 사용하는 편이 좋다.

GetAsyncKeyState() 함수의 사용은

[code]if ( GetAsyncKeyState(VK_RETURN) )        // enter 키가 눌렀다면
// 처리            }
[/code]

이렇게 직접 쓰여도 되지만, 아래와 같은 형식으로 많이 사용한다.

[code]if ( GetAsyncKeyState(VK_RETURN) & 0x8000 )         // enter 키가 눌렀다면
// 처리            }
[/code]

왜? 0x8000으로 AND 연산을 통하여 키 눌림을 체크할까?

GetAsyncKeyState() 함수는, 키가 눌려진 시점에서 0x8000 값을 리턴해 준다. 그리고 함수가 호출되었을때 키가 눌려져 있었다고 0x0001 값을 리턴해 준다. 즉, 0x8000 은 현재 키가 눌려진 상태를 뜻하고, 0x0001은 지난번 호출과 이번 호출 사이에 키가 눌려진 적이 있었다 라는 것을 뜻한다.

예를 들어, 아래 방향키가 게임내에서 비행기도 움직이고, 메뉴에서 위아래 선택에도 쓰인다고 가정해 보자. AND 연산없이 그냥 사용하여 비행기를 움직이다가, F1키를 눌러 메뉴를 띄웠을 때 커서가 자동으로 아래쪽으로 내려갈 위험성이 생긴다. 왜냐하면, F1키를 누르는 시점에서 - if ( GetAsyncKeyState(VK_F1) ) - VK_DOWN은 눌리지 않았지만 리턴값이 0x0001이 되어 if ( GetAsyncKeyState(VK_F1) ) 전에 호출된 if ( GetAsyncKeyState(VK_DOWN) ) 이 참이 되기 때문이다. 하지만, 0x8000으로 AND 연산을 하면,

   1000 0000 0000 0000 (키눌림 0x8000)                0000 0000 0000 0001 (눌러진 적이 있음 0x0001)
& 1000 0000 0000 0000 (AND 연산 0x8000)         & 1000 0000 0000 0000 (AND 연산 0x8000)
---------------------------------------       -----------------------------------------------
   1000 0000 0000 0000 (키눌림 0x8000)                0000 0000 0000 0000 (키 안 눌림)

위와 같은 결과가 되어, 정확한 시점에서 키가 눌러진 상태를 체크할 수가 있는 것이다. 즉, 정확한 시점에서 키눌림 상태를 체크하기 위해서 0x8000으로 AND 연산을 해 주는 것이다.

 

GetKeyState() 함수의 사용 예

[code]// 키보드 메시지 처리루틴이 있는 콜백 함수 내에서...
// char szTemp[256];

case WM_KEYDOWN:
        // Ctrl + 왼쪽 화살표키가 눌렸는지 조사
        if ( wParam == VK_LEFT ) && (GetKeyState(VK_CONTROL) < 0) )
        {
                wsprintf(szTemp, "Ctrl키와 왼쪽 화살표 키가 눌림");
        }
        return 0;
[/code]

GetKeyState() 함수의 리턴값이 음수일 경우는 해당키가 눌린 상태이고, 음수가 아닐 경우는 해당키가 눌리지 않은 상태이다.

GetAsyncKeyState와 GetKeyState는 둘 다 키의 상태값을 알아내는 함수이다. 하지만 이 둘 사이에는 차이점이 있는데 다음과 같은 것들이다.

GetAsyncKeyState는 "키가 눌렸는가?"와 "언제부터 눌렸는가?"를 알아낼 때 사용한다. 키가 눌렸을 때 GetAsyncKeyState는 0x8000 bit가 1이된다. 그리고, 이전에 GetAsyncKeyState가 호출되었을 때부터 이번에 GetAsyncKeyState가 호출될 때까지 중간에 끊기지 않고 계속 눌려있는 상태라면 0x0001 bit는 0이 되고, 그렇지 않은 경우는 1이 된다.

1) CTRL 키가 눌린 상태이다.
2) GetAsyncKeyState(VK_CONTROL)를 호출하면 0x8001을 리턴한다.
3) GetAsycnKeyState(VK_CONTROL)을 한번 더 호출하면 0x8000을 리턴한다.

1) CTRL 키가 눌린 상태이다.
2) GetAsyncKeyState(VK_CONTROL)를 호출하면 0x8001을 리턴한다.
3) CTRL 키를 뗬다가 다시 눌렸다.
4) GetAsycnKeyState(VK_CONTROL)을 한번 더 호출해도 0x8001을 리턴한다.

키가 눌리지 않았을 때, GetAsyncKeyState는 항상 0x0000을 리턴한다.


GetKeyState는 "키가 눌렸는가?"와 "키의 토글상태가 무엇인가?"를 알아낼 때 사용한다. 키의 토글 상태란 Caps Lock, Num Lock의 키가 한번 누르면 불이 켜지고 다시 한번 누르면 불이 꺼지는 것을 생각하면 이해가 빠를것 같다.
키보드 상에는 위에서 말한 키만 불이 켜졌다 꺼졌다하면서 토글상태를 알려주고 있지만 다른 키들도 토글 상태를 갖고 있으며 단지 우리 눈에 보이지 않을 뿐이다. 이 토글 상태를 GetKeyState 함수로 알아낼 수 있다.

GetKeyState의 리턴값은 SHORT가 아닌 CHAR로 생각된다.
리턴값을 살펴보면 0xffffff81, 0xffffff80, 0x00000001, 0x00000000이 되는 것을 볼 수 있기 때문이다.
참고로 같은 SHORT형을 리턴하는 GetAsyncKeyState의 리턴값은 다음과 같다.
0xffff8001, 0xffff8000, 0x00000000 셋 중 하나

** MSDN에는 현재 하드웨어(키보드)의 상태값을 알아내길 원한다면 GetAsyncKeyState를 사용하라고 나와있다. GetKeyState는 메시지큐에 저장된 메시지에 따라 값이 변하기 때문이다.
메시지큐에 처리되지 않은 CTRL키가 눌렸다는 메시지가 쌓여있을 때,사용자가 CTRL키를 더이상 누르지 않고 있다면. GetAsyncKeyState는 "키가 눌리지 않았음"을, GetKeyState는 "키가 눌렸음"을 리턴할 것이다.



출처 : http://www.silverwolf.co.kr/4842

반응형

'Programming > Win32API' 카테고리의 다른 글

윈도우 투명  (0) 2011.10.30
한영키 누름 윈도우 메세지 확인 관련  (2) 2010.09.06
Keyboard 입력 받기  (0) 2010.09.03
IME 영문만 입력가능하게 하기  (0) 2010.09.03
IME  (0) 2010.09.02
Posted by blueasa
, |

DSP 프로그래밍에서 중요한 개념인 빅 엔디안 (Big Endian)과 리틀 엔디안 (Little Endian)에 대해 정리해보려고 한다.

원래 빅 엔디안과 리틀 엔디안은 걸리버 여행기에 나오는 소인국의 일화에서 처음 등장했다. 
소인국에서는 달걀의 껍질을 까서 먹을때 뭉툭한 곳(Big End)을 깨서 먹어야 하는지, 뽀죡한곳 (Little End)를 깨서 먹어야 하는지에
대한 논쟁이 일어났는데, 그때 뭉툭한곳을 주장하는 사람들을 Big Endian이라고 하고, 뾰족한 곳을 주장하는 사람들을 Little Endian이라고 불렀다. 이 소설에서의 용어를 가져와서 사용하게 되었다.

위키백과에 들어가보면 Endianess를 컴퓨터의 메모리같은 1차원 공간에 여러개의 연속된 대상을 배열하는 방법을 뜻한다고 한다. 이 대상에는 Word가 될수도 있고, Byte가 될수도 있고 bit가 될수도 있다. 

빅 엔디안과 리틀 엔디안 둘중 어느것이 우월하다고 말하기는 어려우며, 상황에 따라 다르다고 할수 있다. 



다음의 예는 영문 위키백과에서 따옴을 밝힌다.
1) 빅 엔디안
예를 들어 레지스터에 0A0B0C0D의 8비트 정보들이 있고, 메모리 주소는 1바이트씩 증가한다고 하면,
메모리 주소가 a, a+1, a+2, a+3으로 증가한다고 했을때 다음과 같이 mapping 된다.


a: 0A
a+1: 0B
a+2: 0C
a+3: 0D

즉, MSB에서 부터 주소가 증가하는 방향으로 데이터가 메모리에 저장되게 된다.

2) 리틀 엔디안
위와 같이 똑같은 가정을 했을때 리틀엔디안에서는 다음과 같이 mapping된다.

a: 0D
a+1: 0C
a+2: 0B
a+3: 0A

즉, 빅 엔디언과 반대방향으로 메모리에 데이터가 저장되게 된다.

<빅 엔디언과 리틀 엔디언의 장단점>

빅 엔디언의 장점 : 사람이 읽고 쓰는 방법과 같은 순서로 데이터가 저장되기 때문에, 디버깅이 편하다.
빅 엔디언의 단점 : 연산에 따라 수가 커지면 왼편에 자리수를 추가하기 위해서 기존에 저장된 모든 데이터를 오른쪽으로 옮겨야 하는 경우가 발생한다.

리틀 엔디언의 장점 : 수가 커질때 새로운 자리수가 단순히 오른편에 추가만 하면 된다. 즉 연산이 빨라진다.
리틀 앤디언의 단점 : 디버깅할때 사람의 읽는 방향과 반대이므로 편의성이 떨어진다.



보통 인텔 프로세서 계열은 리틀 앤디언을, 모토롤라 프로세서 계열은 빅 앤디언을 쓴다고 한다.



출처 : http://pelleas.tistory.com/entry/%EB%B9%85-%EC%97%94%EB%94%94%EC%95%88Big-Endian-%EA%B3%BC-%EB%A6%AC%ED%8B%80-%EC%97%94%EB%94%94%EC%95%88Little-Endian

반응형
Posted by blueasa
, |