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

카테고리

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

녹화, 만화, 압축류의 3대 종결자(반디캠, 꿀뷰, 반디집)로 불리는 반디소프트에서


반디집의 정식버전을 냈습니다



주요 특징으로는 세계 유일 모든 압축 확장자 완벽 지원외에도..


  • 분할 압축 기능이 뛰어납니다.
  • MFC와 같은 무거운 라이브러리를 사용하지 않아 프로그램이 작고 빠르고 가볍습니다.
  • 64bit OS를 네이티브로 지원합니다.
  • 유니코드를 정말 '잘' 지원 합니다.
  • 반디집은 무료(無料)입니다.
  • ALZ, EGG 포맷도 지원합니다.
  • 쓰기 편합니다.



64비트 기본 지원이라서 윈7에서도 작동이 잘된다고 하고 유니코드 지원으로 파일명이 깨지는


일어파일도 문제없이 풀린다고 합니다


저도 미루다가 방금전부터 사용중인데 정말 마음에 들어서 알집을 삭제해버렸습니다


최근 이스트 소프트가 네이트온 사건부터해서 좀 말이 많아서 슬슬 갈아타는 중입니다


알집은 반디집으로 알씨는 편집이 편해서 그냥 두긴했지만


이미지뷰어로는 구글의 피카사를 쓰기 시작했습니다 (압도적으로 빠릅니다 강력추천-_-b)


아무튼...



 


기존 알집 사용자분들이 익숙해져서 갈아타기 고민되셨을 부분같은데..


오른쪽 클릭 메뉴에 바로 풀기, 폴더명으로 풀기 기능이나


압축파일 미리보기(스샷에서는 기능 꺼놓은 상태입니다)


무려 새폴더만들기 기능도 있습니다!!



물론 위의 모든 오른쪽 클릭 메뉴는 설정에서 변경 가능합니다


아이콘이 마음에 안들면 환경설정에서 역시 변경 가능합니다



지원가능 확장자수가 정말 많습니다


특히나 그동안 쉽사리 다른 압축프로그램으로 갈아탈수 없게 했던 알집 고유 압축 확장자인


EGG와 ALZ도 지원한다는 점과


알집에서 제대로 지원이 안되던 7Z도 완벽하게 호환되는점이 좋습니다


겸사겸사 갈아타시면 좋을것 같습니다


.

.

.


설치파일은 ↗에서 받을수도 있고 아래의 홈페이지 링크에서 받으셔도 됩니다


반디집 홈페이지

http://apps.bandisoft.com/bandizip/

반응형
Posted by blueasa
, |
어젠가 그젠가 MSDN 보다가 재미난 문서를 발견했습니다. 안전한 DllMain을 작성하는 방법에 관한 글인데, 이 곳에서 다운로드 받아서 보실 수 있습니다. DLL의 로딩 과정과 로더 락에 관한 설명을 곁들여서 왜 그런 일들이 문제를 일으키는지 자세히 설명해 준답니다. 심심하지 않으신 분들도 꼭 챙겨보세요. ㅋ~ 

아래는 문서 내용 중에 괜찮은 부분 같아서 퍼온 겁니다. 의외로 저런 작업들을 하는 코드를 만나는 경우가 많습니다. 대부분 문제가 발생하지 않더라도 어디선간 문제가 발생하고 있다는 것을 의미하는 거겠죠. 좀 더 자세한 시나리오와 함께 문제를 설명해줬으면 했는데 그런 부분이 없는 것이 약간 아쉽더군요.

경고!!! 
DllMain에서 다음 작업들은 절대로 하지 말 것.

  1. LoadLibrary, LoadLibraryEx 호출. 데드락이나 크래시를 유발한다.
  2. 다른 스레드와 동기화. 데드락을 유발한다.
  3. 로더 락을 획득하려는 코드가 가지고 있는 동기화 오브젝트를 획득하려는 시도. 데드락을 유발한다.
  4. CoInitializeEx를 사용한 COM 스레드 초기화. 특정 조건이 충족될 경우 이 함수는 LoadLibraryEx를 호출한다.
  5. 레지스트리 함수들. 이 함수들은 advapi32.dll에 구현되어 있다. advapi32.dll이 초기화 되지 않았다면 크래시가 발생할 수 있다.
  6. CreateProcess 호출. 프로세스 생성은 다른 DLL을 로드할 수 있다.
  7. ExitThread 호출. DLL 디태치(detach) 과정 중에 스레드를 종료하면 로더 락을 다시 획득하도록 만들 수 있다. 이는 데드락이나 크래시가 유발된다.
  8. CreateThread 호출. 동기화만 하지 않는다면 스레드 생성은 괜찮을 수 있다. 하지만 위험하다.
  9. 네임드 파이프나 네임드 오브젝트 생성 (2000만 해당한다). 윈도우 2000에서 네임드 오브젝트 생성은 터미널 서비스 DLL에서 구현되어 있다. 해당 DLL이 초기화되어 있지 않다면 크래시.
  10. CRT에 포함된 메모리 관리 함수들. CRT DLL이 초기화되어 있지 않다면 크래시.
  11. user32.dll이나 gdi32.dll에 포함된 함수 호출. 일부 함수들은 다른 DLL을 로드하고, 이 사실은 크래시가 발생할 수 있다는 것을 의미한다.
  12. 관리된 코드 사용.
* 가장 아름다운 DllMain은 존재하지 않는 것이다 (비어 있는 함수 바디).
** 그래도 먼가 하고 싶다면 kernel32.dll에 포함된 함수 중에 위에서 언급되지 않은 것들만 쓰도록 한다. kernel32.dll이 초기화는 운영체제가 보장해 준다. 
*** 글로벌 오브젝트에 대한 초기화 코드 또한 DllMain 과정에 포함된다. 따라서 글로벌 오브젝트의 생성자 내지는 초기화 함수 부분에 위에서 언급한 내용이 있어서는 안된다.
**** 초기화를 하지 말란 소린가? 아니다. 지연시키라는 말이다.

요 근래엔 정말 컴터 책은 한 권도 안 읽은 것 같네요. 참신한 책 있으면 추천 좀 해주세용. 《실용주의 프로그래머》나 《The Art Of Unix Programming》을 보면서 흘렸던 눈물이 그립군요. 그나마 제프리 아저씨의 신간이 있었지만, 그마저도 사실 전 전판에 비해서 큰 차이를 보기는 힘들었던 것 같습니당.

출처 : http://www.jiniya.net/tt/788
반응형
Posted by blueasa
, |
반응형

'Programming > C#' 카테고리의 다른 글

C#으로 xml 처리하기  (0) 2011.10.25
현재 Process의 한영 정보 얻기  (0) 2011.10.10
C# XML 다루는 간단한 소스  (0) 2011.09.16
DLL 파일을 별도 폴더에서 관리하자  (0) 2011.09.14
[펌] 입력 문자 검사  (0) 2011.09.14
Posted by blueasa
, |
반응형
Posted by blueasa
, |

Debugging Applications For Microsoft Windows 책에 보면 O1최적화 (크기 최소화)가 O2최적화(속도 최대화)보다 더 빠르다고 나와있다..

정말????


책에 보면 대략 실행파일의 이미지 크기가 작으면 page fault를 더 적게 일으키므로 더 빠르다라고 나와있다..

음.. 맞는말이다.. page fault가 일어날 경우에는 OS가 프로그램 실행에 필요한 데이터를 page file에서 실제 메모리에 load하기 위해서 엄청난 오버헤드가 발생한다..

그렇지만 고작 몇백킬로 차이밖에 안나는 것이 얼마나 눈에 띄게 속도 차이가 날까? 라는 의문이 마구마구 들었다..

그래서 테스트를 해봤다..

우선 테스트 프로그램을 만들어야하는데.. 대략 만들기는 귀찮고 해서 GUI를 이용하기로 했다.. GUITester에서 상단에 프레임률을 표시하기 때문에 이를 확인해보면 된다.

그래서 우선 프로젝트 세팅에서 아래와 같이 O2 최적화로 세팅을 했다.



그리고 컴파일.................................................


그리고나서 바이너리의 크기를 확인했다.



대략 1메가 정도 한다..
그럼 이제 실행을 해보자..



음.. 약 262프레임정도 나온다..



그럼 이제 O1로 컴파일을 해보자... 우선 프로젝트 세팅을 하고..



그리고 컴파일.............................

그리고나서 바이너리 크기 확인



약간 줄었다.. 70kb정도 ㄱ- 이정도로 정말 속도 차이가 날까???

그리고 실행...



엇!!!!! 이게 무슨일인가.. 미약하지만 정말 O2보다 프레임률이 올라갔다...

혹시나 하여 두세번 반복해서 재컴파일을 하여 비교를 해봤지만 확실히 차이가 보였다..

그렇지만 내가 생각하기에 page fault때문에 성능 차이가 나는것 보다는 바이너리의 크기가 작아지면서 CPU의 명령어 캐시히트율이 올라가서가 아닌가 하는 생각이 든다..

아마 항상 O1이 O2보다 빠르진 않을거라 본다.. 실제로 어떤게 더 빠른지는 테스트를 통하여 최적의 최적화 옵션을 선택해야 할 것이다.


반응형
Posted by blueasa
, |

요샌 프로그램 하나 만들려면 엄청난 dll들이 부가 되는데

이것들이 실행 파일과 혼재되어 정신 사납기 이를데 없다

이럴때 dll 파일만 따로 모아서 관리 할수 있으면 얼마나 좋을까??

자~ 해봅시다~

그림으로 보면 DLL폴더와 실행 화일이 따로 분리 된걸 볼 수 있다

DLL 폴더내에 따로 모아진 dll 파일들과 pdb 파일들을 볼수 있다

이렇게 하기 위해서는 먼저 DLL 폴더를 만들고 랩작업을 할때 다음 처럼

경로를 지정해서 랩을 한다

이렇게 하면 당연히 하위 DLL 폴더에서 해당 dll을 찾아 프로그램이 실행된다

하지만 그림처럼 참조 추가된 Cinch 같은 dll도 DLL 폴더로 넣을라면 어떻게 해야 할까?

이런 경우에는 Project에 프로퍼티에서 그림 처럼 설정 해준다

이렇게 해주면 참조 추가된 dll들도 DLL 폴더로 컴파일 시 옮겨지게 된다

move "$(TargetDir)\*.dll" "$(TargetDir)\DLL"
move "$(TargetDir)\*.pdb" "$(TargetDir)\DLL"

옮겨지기는 했지만 실제 프로그램을 실행 시켜 보면 dll을 찾을수 없다는 에러가 발생된다

솔루션 창에서 아래 그림처러 새로운 아이템으로 appication configuration file을

app.config란 파일 이름으로 생성한다

그리고 그 파일 안에는

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="DLL"/>
</assemblyBinding>
</runtime>
</configuration>

이렇게 써주고 실행하면 해당 dll들을 DLL폴더에서 찾아오게 된다

이로서 실행파일과 dll 파일을 깔끔하게 분리하여 산뜻하게 관리 할 수 있게 되었다

반응형
Posted by blueasa
, |

입력 문자 검사
프로그램을 작성하다 보면 사용자의 키보드 입력 문자를 검사해서 유용한 문자만을 허용하는 경우가 많이 있습니다.입력 문자열을 검증하는 방법 두 가지를 알아 보겠습니다
(아래 모든 코드는 TextBox KeyPress 이벤트에 정의된다고 가정한다)

1. Char 
구조체를 사용한 문자 검증 방법
Char 구조체의 static 메서드를 이용하여 입력문자를 검증할 수 있다
아래 표는 문자열을 검증하는 메서드의 표이다



     
 

예제> 몇 가지 예를 살펴보면..
a. 
숫자만 허용
if(!(Char.IsDigit(e.KeyChar)) && e.KeyChar != 8){

             e.Handled = true;

}

b. 
문자만 허용
if(! ((e.KeyChar >= 65 && e.KeyChar <= 90) ||  (e.KeyChar >= 97 && e.KeyChar <= 122))

&& e.KeyChar != 8) {

             e.Handled = true;

}

c. 
한글만 허용
if ((Char.IsPunctuation(e.KeyChar) || Char.IsDigit(e.KeyChar) ||

                           Char.IsLetter(e.KeyChar) || Char.IsSymbol(e.KeyChar))

                           && e.KeyChar != 8)

{

             e.Handled = true;

}


설명>>
TextBox KeyPress 이벤트에서 사용자의 입력값을 받아서 Char 구조체가 제공하는 메서드를 사용해서 문자 검증을

수행한다. 입력을 불허해야 하는 상황이라면 KeyPressEventArgs  Handled 속성을 true 로 설정하여 TextBox KeyPress 이벤트를 취소 시킨다 (, TextBox 에 글이 적히지 않도록 한다)
e.KeyChar != 8  이부분은 빽스페이스 키가 아니면 참이라는 것인데 즉 이말은 빽스페이스 키는 검증대상에 포함시키지 않는다는 의미가 된다

 


2. 사용자가 입력한 char를 자체를 검증하는 방법
위의 예제를 보면 알 수 있듯이 KeyPressEventArgs  KeyChar 는 현재 입력한 char를 의미한다.  char 의 범위나

키 자체의 단일 정수값을 이용해 입력 값을 검증할 수 있다. 아래 표는 각 키의 값을 나타내는 표이다


             
  
예제> 위에서 살펴본 문자열만 입력 허용하는 것을 아래와 같이 할 수도 있다

 
if(! ((e.KeyChar >= 65 && e.KeyChar <= 90) ||  
      (e.KeyChar >= 97 && e.KeyChar <= 122))

&& e.KeyChar != 8)

{

             e.Handled = true;

}  

 


정리>> 자주 쓰이는 부분만 따로 정리해 보면…


8 : 백 스페이스

32 : 스페이스

13 : 엔터

16 : Shift

17 , 18 : Ctrl , Alt

20 : Caps Lock

27 : ESC

                                                                                             

45 , 46 : Insert , Delete

                                                        

48 ~ 57 : 숫자(0 ~ 9)                                   

65 ~ 90 : A ~ Z

97 ~ 122 : a ~ z

                                                       

112 ~ 123 : F1 ~ F12

144 : Num Lock

 



출처 : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=23&ID=272
반응형
Posted by blueasa
, |
반응형

'Programming > C#' 카테고리의 다른 글

DLL 파일을 별도 폴더에서 관리하자  (0) 2011.09.14
[펌] 입력 문자 검사  (0) 2011.09.14
Processing Global Mouse and Keyboard Hooks in C#  (0) 2011.05.13
Array -> String  (0) 2011.05.09
SaveFileDialog  (0) 2011.03.25
Posted by blueasa
, |

.dmp 파일 남기기

Tip & Tech / 2011. 9. 11. 21:11

SetUnhandledExceptionFilter 를 사용하자.

#include <dbghelp.h>

#pragma comment(lib, "dbghelp.h")

함수원형

LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter (

__in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter

);

사용법

1. ExceptionHandler implementation

LONG CALLBACK FunctionName (_EXCEPTION_POINTERS *pExceptionInfo)

{

pExceptionInfo->ExceptionRecord->ExceptionCode; // ExceptionCode

HANDLE hFile = CreateFile(DumpFileName);

MINIDUMP_EXCEPTION_INFORMATION eInfo;

eInfo.ThreadId = GetCurrentThreadId();

eInfo.ExceptionPointers = pExceptionInfo;

eInfo.ClientPointers = FALSE;

MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal,

pExceptionInfo ? &eInfo : NULL, NULL, NULL);

return EXCEPTION_EXECUTE_HANDLER;

}

2. Main 함수에서 1에서 구현한 ExceptionHandler 등록

int main(void)

{

....

SetUnhandledExceptionFilter(UnhandledExceptionHandler);

....

}

[출처] .dmp 파일 남기기|작성자 미락꿀

반응형
Posted by blueasa
, |

하루 6분 복근만들기

Etc / 2011. 9. 11. 20:13
반응형
Posted by blueasa
, |