728x90
반응형
728x90
반응형
728x90
반응형

MultiByteToWideChar 함수로 멀티바이트 문자열을 유니코드로 변환하기

MultiByteToWideChar 함수는 멀티바이트 문자열을 유니코드 문자열로 변환하는 Windows API 함수입니다.

이 함수는 특정 코드 페이지를 사용하여 멀티바이트 문자열을 유니코드로 변환합니다.

함수 원형은 다음과 같습니다:

int MultiByteToWideChar(
  UINT   CodePage,
  DWORD  dwFlags,
  LPCSTR lpMultiByteStr,
  int    cbMultiByte,
  LPWSTR lpWideCharStr,
  int    cchWideChar
);

각 매개변수의 의미는 다음과 같습니다:

  • CodePage: 변환에 사용할 코드 페이지를 지정합니다. 예를 들어, 한국어의 경우 949(ANSI/OEM - Korean (Unified Hangul Code))를 사용합니다. 코드 페이지 상수로 CP_ACP 등을 사용할 수 있습니다.

  • dwFlags: 변환 동작을 제어하는 플래그로, 일반적으로 0을 사용합니다.

  • lpMultiByteStr: 변환할 멀티바이트 문자열의 포인터입니다.

  • cbMultiByte: 변환할 멀티바이트 문자열의 길이입니다. 이 값이 -1이면 함수는 문자열이 null로 종료된 것으로 간주합니다.

  • lpWideCharStr: 변환된 유니코드 문자열을 저장할 버퍼의 포인터입니다.

  • cchWideChar: 유니코드 문자열 버퍼의 크기입니다.

함수의 반환값이 0이면 변환에 실패한 것이며, 이 경우 GetLastError()를 호출하여 오류 정보를 확인할 수 있습니다. 주로 출력 버퍼의 크기가 충분하지 않거나 입력 문자열이 너무 길 때 오류가 발생합니다.

이 함수는 멀티바이트 문자열을 유니코드로 변환할 때 유용하게 사용됩니다.

728x90
반응형
728x90
반응형

C++ 구조체 멤버의 오프셋(offset) 얻기

간단한 구조체라면 직관적으로 그 구조체의 멤버의 위치, 크기를 알 수 있다.

struct Hello
{
  int hello1; // size 4
  short hello2; // size 2
  double hello3; // size 8
};

그런데 문제는 아주~큰 구조체의 경우에는 이점이 쉽지 않다는 것이다. 예를 들자면 구조체 멤버가 천 개 정도인데 그 멤버들 중 일부는 또 구조체인 구조체라고 한다면 특정 멤버의 위치가 어느 정도인지 계산하기가 까다로울 수 밖에 없다.

struct BigHello
{
  int hello1;
  //
  int hello 100;
  //
  double hello 199;
  Hello hello200;
  Hello hello201;
  //
  Hello hello500;
  //
}

그럴 경우를 위해서 자신만의 아래와 같은 매크로를 만들 수도 있다.

#define OFFSETOF(a, b) ( (size_t) &((a)NULL)->b )

이 때, a 는 구조체의 포인터이고, b 는 멤버가 될 것이다.

약간 이상해 보이지만 c 의 포인터 개념을 알고 있다면 전혀 이상할 것은 없다. 임의의 구조체 대신에 NULL 을 가리키는 구조체 포인터a를 이용하여 멤버인 b가 무언지를 접근하는 매크로일 뿐이다. 실제 사용 방법은 아래와 같이 쓰면 될 것이다.

struct HelloOffset
{
  long hello1;
  long hello2;
  double hello3;
};
size_t s1 = offsetof(struct HelloOffset *, hello3); // 결과는 8 이다. (32bit OS)

그런데, offsetof() 라는 동일한 기능을 갖는 매크로가 이미 존재한다.

// #include <stddef.h>

#ifdef _WIN64

#define offsetof(s,m) (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) )

#else

#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))

#endif

위의 OFFSETOF() 보다는 타입 변환 등이 더 C++ 표준적인 요소가 많음을 알 수 있다.

728x90
반응형
728x90
반응형

VC++ 2005로 개발된 프로그램을 배포하려면 Microsoft에서 제공하는 재배포 패키지를 설치해야 합니다. 이 패키지는 두 가지 버전이 있으며, 하나는 VC++ 2005용(x86) 이고 다른 하나는 VC++ 2005 SP1용(x86)  입니다. 설치 방법은 해당 실행 파일을 실행하면 됩니다.

 

첨부파일
다운로드

 

첨부파일
다운로드

 

 

728x90
반응형
728x90
반응형
출처 : http://www.office-humour.co.uk/g/i/2722/

MS 워드 2007 을 시작한 후, 새 문서를 만든다.
새 문서에서

=rand(200,99)

를 입력한다.

워드 2007 부활절 겨란...
728x90
반응형

'정보기술' 카테고리의 다른 글

IEEE 1471  (0) 2009.05.18
Ghostscript & GSview for Windows  (4) 2009.01.13
Acrobat 최대 파일 관리 pdf 파일 개수는??  (0) 2007.09.12
Ini Translator  (0) 2007.08.14
OpenSSH for Windows 설치  (0) 2007.07.09
728x90
반응형

문자열(string) 필수 기능

문자열(string)
├── 문자열의 설정
├── 두 문자열 비교하기
├── 다른 형(type)의 자료형을 문자열로 변환하기
├── 문자열을 다른 자료형으로 변환하기
├── 문자열 중에서 임의의 문자(또는 문자열)을 찾기
│   ├──문자열 처음부터 찾기
│   ├──문자열 맨 뒤부터 찾기
│   ├──문자열 중 임의의 위치에서 찾기
├── 문자열의 길이 얻기
├── 임의의 문자로 검사
│   ├──임의의 문자로 시작하는지의 검사 여부
│   ├──임의의 문자로 종료하는지의 검사 여부
├── 문자열 중 임의의 문자열을 위치(offset), 길이(length)에 따라 추출하기
├── 문자열 중 임의의 문자(또는 문자열)을 다른 문자(또는 문자열)로 변경하기
├── 전체 모두 변경하기
├── 임의의 지정한 영역에서만 변경하기
├── 영어(English)일 경우, 대문자화, 소문자화

문자열은 프로그래밍에서 매우 중요한 요소로, 다양한 기능을 제공합니다. 이 글에서는 문자열의 필수 기능을 이해하기 쉽게 설명하겠습니다.

1. 문자열의 정의

문자열은 문자들의 연속으로, 텍스트 데이터를 표현하는 데 사용됩니다. 예를 들어, "Hello, World!"는 문자열입니다.

2. 문자열의 길이 확인

문자열의 길이는 문자열에 포함된 문자 수를 의미합니다. 프로그래밍 언어마다 문자열의 길이를 확인하는 방법이 다릅니다. 예를 들어, Python에서는 len() 함수를 사용하여 문자열의 길이를 확인할 수 있습니다.

3. 문자열 연결

두 개 이상의 문자열을 하나로 합치는 것을 문자열 연결이라고 합니다. 예를 들어, "Hello"와 "World"를 연결하면 "HelloWorld"가 됩니다. Python에서는 + 연산자를 사용하여 문자열을 연결할 수 있습니다.

4. 부분 문자열 추출

문자열의 일부분을 추출하는 것을 부분 문자열 추출이라고 합니다. 예를 들어, "Hello, World!"에서 "World"를 추출할 수 있습니다. Python에서는 슬라이싱(slicing)을 사용하여 부분 문자열을 추출할 수 있습니다.

5. 문자열 검색

문자열 내에서 특정 문자열이나 문자의 위치를 찾는 것을 문자열 검색이라고 합니다. 예를 들어, "Hello, World!"에서 "World"의 위치를 찾을 수 있습니다. Python에서는 find() 메서드를 사용하여 문자열을 검색할 수 있습니다.

6. 문자열 대체

문자열 내의 특정 문자열이나 문자를 다른 문자열이나 문자로 바꾸는 것을 문자열 대체라고 합니다. 예를 들어, "Hello, World!"에서 "World"를 "Python"으로 바꾸면 "Hello, Python!"이 됩니다. Python에서는 replace() 메서드를 사용하여 문자열을 대체할 수 있습니다.

7. 문자열 분할

문자열을 특정 구분자를 기준으로 나누는 것을 문자열 분할이라고 합니다. 예를 들어, "apple,banana,cherry"를 쉼표(,)를 기준으로 나누면 ["apple", "banana", "cherry"] 리스트가 됩니다. Python에서는 split() 메서드를 사용하여 문자열을 분할할 수 있습니다.

8. 문자열 결합

리스트 등의 여러 문자열을 하나의 문자열로 합치는 것을 문자열 결합이라고 합니다. 예를 들어, ["apple", "banana", "cherry"] 리스트를 쉼표(,)로 결합하면 "apple,banana,cherry" 문자열이 됩니다. Python에서는 join() 메서드를 사용하여 문자열을 결합할 수 있습니다.

9. 문자열 대소문자 변환

문자열의 모든 문자를 대문자나 소문자로 변환할 수 있습니다. 예를 들어, "Hello, World!"를 모두 대문자로 변환하면 "HELLO, WORLD!"가 됩니다. Python에서는 upper()lower() 메서드를 사용하여 문자열의 대소문자를 변환할 수 있습니다.

10. 문자열 공백 제거

문자열의 앞뒤에 있는 공백을 제거할 수 있습니다. 예를 들어, " Hello, World! "에서 앞뒤 공백을 제거하면 "Hello, World!"가 됩니다. Python에서는 strip() 메서드를 사용하여 문자열의 공백을 제거할 수 있습니다.

이러한 문자열의 기본 기능들을 이해하고 활용하면 프로그래밍에서 문자열을 효과적으로 다룰 수 있습니다.

728x90
반응형
728x90
반응형

디피 헬만(Diffe-Hellman) 알고리즘 이해하기

디피-헬만(Diffie–Hellman) 알고리즘은 왠지 호감이 가는(?) 인상의

아저씨들이 1976년에 만든 알고리즘입니다.

(사진은 1977년의 것입니다. 왼쪽부터 Ralph Merkle, Martin Hellman, Whitfield Diffie)

원리는 간단히 이야기하자면,

--- 아주 큰 2 개의 소수를 양쪽(peer)에서 공유하면서 시작합니다. ---

소수(prime number)는 자신과 1 로만 나누어 지는 수를 말합니다. (2, 3, 5, 7, ...)

일단 소수 1개(N)를 정의하여 두 노드간에 값을 공유합니다.

소수 N의 크기가 매우 클수록 암호화 수준이 올라갑니다.

G는 1부터 N-1 사이의 자연수입니다.

-- 여기까지는 이해가 물론 가시죠? --

그러면 이상태에서,

한쪽(1번측이라고 봅시다)에서 공개키(public key)인 R1을 생성합니다.

R1 = G^x mod N 입니다.

(^는 승수를 의미하고, mod는 나머지를 의미합니다. 2^3=8 이고 10 mod 3 = 1 입니다.)

이 때, x 는 물론 1번측의 비밀키(private key)입니다.

비밀키(private key)는 공개키와 다르게 외부에 노출되면 안되는 값입니다.

그리고 이 공개키인 R1 을 다른측(2번측)으로 전송합니다.

R1은 통신(전송)을 할 경우 값이 외부로 값이 노출 될 수 있습니다.

--- 여기까지는 이해가 가시죠? ---

그리고 다른쪽(=2번측)에서도 마찬가지로 2번측의 공개키인 R2를 만듭니다.

R2 = G^y mod N 입니다.

이 때, y 는 2번측의 비밀키(private key)입니다. 당연히 y는 공개되면 안되죠.

그리고 R2를 2번측에서 1번측으로 전송합니다.

이제 양쪽은 다른 쪽이 전송한 수(R1,R2)를 서로서로 알고 있습니다.

즉, 1번측에서는 2번측이 전송한 R2 를 알고 있고요,

반대로, 2번측에서는 1번측이 전송한 R1 을 알고 있습니다.

단, 상대방의 비밀키(x, y)는 모릅니다. 비밀키는 자신만이 알고 있습니다.

--- 여기까지도 이해가시리라 믿고요 ---

그 상태에서 1번측은

전송받은 수 R2 를 가지고 K1 = R2^x mod N 값을 계산합니다.

그리고 마찬가지로,

2번측도 전송받은 수 R1 으로 K2 = R1^y mod N 값을 계산합니다.

그러면, 이때 K1 = K2 은 관계가 성립합니다!

(둘은 수학적으로 동일하게 증명됩니다.)

그리고, K1 = K2 = K = G^(xy) mod N 의 관계도 성립하게 됩니다.

K는 1번측과 2번측 모두가 알 수 있는 키값입니다.

--- 이제 서로 키 교환과 연산은 끝났습니다. ---

마지막으로 생성된 키 K 를 이용하여서

일반적인 세션키 알고리즘(AES, SEED 등)의 키로

이용하는 것이 일반적인 사용방법입니다.

--- 이해되시나요? 설명이 별로죠. 죄송합니다. ㅋ ---

예전에는 귀찮아서 대충 라이브러리 함수로 대충 코딩했는데

지금 정리해보니까 대충 이런 내용이군요 ㅎ

728x90
반응형
728x90
반응형
Acrobat 을 통하여 한번에 최대한 관리할 수 있는 pdf 파일 개수는 몇 개나 될까?

정답 : 50개 (50개 이상은 한 번에 보거나 편집할 수 없다...)


728x90
반응형

'정보기술' 카테고리의 다른 글

Ghostscript & GSview for Windows  (4) 2009.01.13
Word 2007 부활절 달걀(easter egg)  (0) 2007.09.20
Ini Translator  (0) 2007.08.14
OpenSSH for Windows 설치  (0) 2007.07.09
[꽁수] TrustedInstaller.exe 와 CPU 점유율 100%  (0) 2007.06.09
728x90
반응형

py2exe를 활용한 파이썬 실행 파일(.exe) 생성 가이드

파이썬은 인터프리터 언어로, 때로는 소스 코드를 배포하지 않고 실행 파일 형태로 배포하고자 할 때가 있습니다.

이러한 경우에 py2exe를 사용하여 파이썬 스크립트를 실행 파일(.exe)로 변환할 수 있습니다.

py2exe는 파이썬 버전에 맞는 설치 파일을 다운로드하여 설치하면 됩니다.

설치 후에는 간단한 콘솔 프로그램을 exe 파일로 변환하는 예제를 통해 사용법을 익힐 수 있습니다.

예를 들어, hello.pyhello.exe로 변환하는 작업이 가능합니다.

또한, wxPython을 사용하는 GUI 프로그램도 exe 파일로 변환할 수 있습니다.

다만, 한글 처리와 관련된 문제가 발생할 수 있으므로, 한국 파이썬 사용자 그룹의 자료를 참고하는 것이 좋습니다.

또한, py2exe와 같은 도구는 모든 문제를 해결해 주는 만능 도구는 아니며, 윈도우 전용 애플리케이션을 개발할 때는 윈도우 전용 컴파일러와 라이브러리를 사용하는 것이 더 적합할 수 있습니다.

그럼에도 불구하고, py2exe는 파이썬의 강력한 기능을 활용하여 실행 파일을 생성할 수 있는 유용한 도구이므로 적극적으로 활용해 보시기 바랍니다.


다음은 py2exe를 사용하여 파이썬 스크립트를 실행 파일로 변환하는 간단한 예제입니다.

1. 파이썬 스크립트 준비

예제 파일인 hello.py를 생성합니다.

python

# hello.py
print("Hello, World!")

2. 설정 파일 작성

setup.py 파일을 생성하여 변환 설정을 작성합니다.

python

# setup.py
from distutils.core import setup
import py2exe

setup(
    console=['hello.py']  # console은 콘솔 기반 프로그램을 지정
)

3. py2exe 설치

py2exe는 Python 2.7에서 주로 사용되며, Python 3.x 버전용은 비공식 지원만 가능합니다. 아래 명령으로 py2exe를 설치합니다.

pip install py2exe

4. 실행 파일 생성

명령 프롬프트에서 다음 명령어를 실행합니다.

python setup.py py2exe

5. 출력 결과 확인

dist 디렉토리에 hello.exe 파일이 생성됩니다. 이를 실행하면 Hello, World!가 출력됩니다.


추가 참고

  • GUI 프로그램 변환 : console=['file.py'] 대신 windows=['file.py']를 사용합니다.
  • 추가 파일 포함 : 이미지, 텍스트 파일 등 리소스를 포함하려면 data_files 옵션을 설정합니다.
  • 한글 인코딩 문제 : UTF-8 또는 다른 인코딩 관련 설정을 추가해야 문제가 발생하지 않습니다.
728x90
반응형
728x90
반응형
// 출처 : MSDN
// crt_strlen.c
// Determine the length of a string. For the multi-byte character
// example to work correctly, the Japanese language support for
// non-Unicode programs must be enabled by the operating system.
#include <string.h>
#include <locale.h>
int main()
{
char* str1 = "Count.";
wchar_t* wstr1 = L"Count.";
char * mbstr1;
char * locale_string;
// strlen gives the length of single-byte character string
printf("Length of '%s' : %d\n", str1, strlen(str1) );
// wstrlen gives the length of a wide character string
wprintf(L"Length of '%s' : %d\n", wstr1, wcslen(wstr1) );
// A multibyte string: [A] [B] [C] [katakana A] [D] [\0]
// in Code Page 932. For this example to work correctly,
// the Japanese language support must be enabled by the
// operating system.
mbstr1 = "ABC" "\x83\x40" "D";
locale_string = setlocale(LC_CTYPE, "Japanese_Japan");
if (locale_string == NULL)
{
printf("Japanese locale not enabled. Exiting.\n");
exit(1);
}
else
{
printf("Locale set to %s\n", locale_string);
}
// _mbslen will recognize the Japanese multibyte character if the
// current locale used by the operating system is Japanese
printf("Length of '%s' : %d\n", mbstr1, _mbslen(mbstr1) );
// _mbstrlen will recognize the Japanese multibyte character
// since the CRT locale is set to Japanese even if the OS locale
// isnot.
printf("Length of '%s' : %d\n", mbstr1, _mbstrlen(mbstr1) );
printf("Bytes in '%s' : %d\n", mbstr1, strlen(mbstr1) );
}
//--------------------------------------------------------------
// Output
//
// Length of 'Count.' : 6
// Length of 'Count.' : 6
// Length of 'ABCァD' : 5
// Length of 'ABCァD' : 5
// Bytes in 'ABCァD' : 6
//
// 로케일을 적용하여 문자열 길이를 얻는 API 입니다. 지원은 Windows 2000/XP/2003/Vista 에서만 됩니다.
// (유닉스/리눅스는 일부만 표준 호환)
// 예제에서는 일본 로케일을 적용 하였습니다.
// 결과 중 세번째를 보시면(_mbslen) 길이가 5글자로 반환되는 것을 알 수 있습니다.
728x90
반응형
728x90
반응형

Windows 환경에서 Tomcat 6JRE/JDK 1.6 설치 문제 해결 방법


문제 및 해결 방안

  • Windows 환경에서 Tomcat 6JRE/JDK 1.6 을 설치한 후, NT 서비스로 실행할 때 오류가 발생하는 문제 가 보고되었습니다.
  • 이 글에서는 문제의 원인과 해결 방법을 설명합니다.


본론

1. 문제 발생

  • Tomcat 6NT 서비스로 실행하려고 하면 다음과 같은 오류 메시지가 나타납니다.

  • Message

    ... [174  javajni.c] [error] ...
    ... [947  prunsrv.c] [error] ...
    
  • 이 오류로 인해 Tomcat 서비스가 정상적으로 시작되지 않습니다.


2. 원인 분석

  • Tomcat 설정에서 Java Virtual Machine(JVM) 경로가 c:\java\jre...\jvm.dll로 설정되어 있었습니다.
  • jvm.dll 파일이 msvcr71.dll 파일을 필요로 하는데, 해당 DLL이 시스템에 없어서 문제가 발생했습니다.

3. 해결 방법

  • (1) msvcr71.dll 파일을 확보 합니다.
  • (2) 해당 파일을 Windows 시스템 폴더(C:\Windows\System32)에 복사 합니다.
  • (3) Tomcat 서비스를 다시 실행하면 정상적으로 작동합니다.


정리

  • Tomcat 6JRE/JDK 1.6을 함께 사용할 때 msvcr71.dll이 없으면 실행 오류가 발생할 수 있습니다.
  • 이 문제는 DLL 파일을 수동으로 복사하여 해결할 수 있으며, JDK 1.5 등의 다른 버전을 사용하면 문제를 피할 수도 있습니다.
  • Windows에서 JVM을 실행할 때 종종 발생하는 문제이므로, 비슷한 오류가 발생하면 필요한 DLL 파일이 존재하는지 확인하는 것이 중요합니다.
728x90
반응형

'Java' 카테고리의 다른 글

자바(Java) 멀티쓰레드(multi-thread)  (0) 2019.07.11
데코레이터 패턴과 자바 입출력  (0) 2019.07.10
ToBinaryString  (0) 2019.02.10
J2SE 8 documentation CHM Html Help file  (0) 2018.01.11
[github] OpenJDK 1.8 Windows  (0) 2018.01.09
728x90
반응형

32비트 윈도우즈 자료형과 크기

32비트 윈도우즈 환경에서 사용되는 주요 자료형과 그 크기는 다음과 같습니다:

  • 1바이트 정수형:

    • char
    • unsigned char
    • signed char
    • byte
  • 2바이트 정수형:

    • short
    • unsigned short
  • 4바이트 정수형:

    • int
    • unsigned int
    • long
    • unsigned long
    • dword
  • 부동소수점형:

    • float (4바이트)
    • double (8바이트)

부호 있는 정수형의 경우, 최상위 1비트가 부호를 나타냅니다. 또한, 32비트 윈도우즈에서는 포인터의 크기가 4바이트이며, 이는 2^32 주소 공간을 의미합니다.

728x90
반응형
728x90
반응형

과연 정렬 알고리즘을 몇 가지 이상 알아야 훌륭한 개발자인가?

개발자 채용 면접에서 정렬 알고리즘에 대한 질문이 자주 등장합니다. 일부 면접관은 지원자가 버블 정렬 이상의 알고리즘을 알고 있어야 합격 가능성이 높다고 생각합니다. 그러나 실제 업무에서 다양한 정렬 알고리즘을 모두 숙지하는 것이 얼마나 중요한지 의문이 듭니다.

모든 상황에 완벽하게 적용되는 '최적의' 정렬 알고리즘은 존재하지 않습니다. 데이터의 분포와 특성은 각기 다르기 때문에, 특정 알고리즘이 항상 최선의 선택이 될 수는 없습니다. 또한, 많은 프로젝트에서는 최적의 결과보다는 빠른 개발과 결과물을 중요시합니다.

예를 들어, 최상의 결과를 얻는 데 1년이 걸리고, 상용화 가능한 수준에 도달하는 데 6개월, 기본적인 데모 버전을 만드는 데 한 달이 소요된다고 가정해봅시다. 이러한 상황에서 경영진이나 프로젝트 관리자는 항상 최적의 결과만을 기다릴 수 없습니다. 때로는 버블 정렬과 같은 간단한 방법으로라도 데모 버전을 만들어 투자자나 이해관계자에게 빠르게 보여주는 것이 필요할 수 있습니다.

물론, 정렬 알고리즘에 대한 질문은 지원자의 기본적인 소양을 평가하기 위한 것입니다. 그러나 특정 기술에만 집중하는 것은 다양한 역량을 가진 인재를 놓칠 위험이 있습니다. 따라서, 면접에서는 지원자의 문제 해결 능력과 상황에 맞는 판단력을 함께 평가하는 것이 중요합니다.

728x90
반응형

+ Recent posts