컴퓨터/프로그래밍2011. 9. 23. 18:41


예전에 빠르고 가벼운 DB 를 찾다가 메모리 DB 도 만들 수 있는 SQLite 를 접하게 되었습니다. 하지만 영어권에서 만들어서 인지 UTF-8 방식으로 처리되어 불편한 점이 한두가지가 아니었습니다. 그래서 쉽게 사용하지 못하고 한동안 잊고 지냈습니다.

그리고 요즘들어서 다시 필요하게 되어 찾아봤지만 여전히 Unicode 사용이 너무 불편하고 제대로 안되서 고민하다가 해결 방법을 찾게되어 올려봅니다.

함수 하나를 추가하는 것으로 해결 가능한데 아래의 링크에서 SQLite 를 수정하는 방법을 찾을 수 있습니다.

http://greenfishblog.tistory.com/78

아래의 압축 파일은 위의 링크를 참조하여 수정한 것으로 SQLite 3.7.8 버전에 최소한의 코드만 수정했습니다. Unicode 를 사용하는 함수의 인자나 반환값을 wchar_t 형으로 수정했으며 DLL 에서도 사용 가능하도록 수정했습니다.

그리고 SQLITE_OMIT_DEPRECATED 전처리기를 정의하여 SQLite 에서 사용을 제한하는 함수들은 제외시켰습니다.

컴파일 환경은 Visual C++ 9.064비트 이며 DLL(동적 링크 라이브러리)LIB(정적 라이브러리) 로 컴파일 가능하도록 VC프로젝트 파일을 별도로 나누었습니다.


Posted by jungtae17
컴퓨터/프로그래밍2011. 8. 10. 21:01


책이나 교육을 통하여 학습되거나 선대(?) 프로그래머들에게서 전해져 오는 것들 중에서 아무 생각없이 받아들여져 사용되고 있는 것들이 많을 것입니다. "이런 것은 꼭 이렇게 해야되고, 저렇게 하는 것은 절대로 안된다."라는 것과 같이 프로그래머로써의 불문율이 존재합니다. 하지만 실제로 맞닥뜨리게 되는 문제들에서 책이나 학교에서 배운 원칙(?)이 무조건 옳은가라는 의문이 드는 경우가 많습니다. 결국 시간이 흐르고 경험이 쌓이면서 그 원칙이라는 것들에 대하여 무조건 맞는가 라는 생각이 들기 시작했습니다. 그럼, 이런 불문율들은 무엇이 문제일까요, 나름 비판적인 생각들을 정리해 봤습니다.

1. 완벽한(?) 설계
  • 환상은 완벽한 설계를 통해서 완벽한 프로그램을 만든다.
  • 현실은 완벽한 설계란 있을 수 없습니다. 있다고 해도 현실적인 문제(구현하기 위한 스킬, 변덕스러운 요구사항 등)로 인하여 완벽하게 설계된 것과는 동떨어진 프로그램이 만들어지게 됩니다. 그리고 시간이 흐르면 흐를수록 코드들이 걸레가 되어 가는 것을 지켜볼 수 밖에 없습니다.

2. 재사용 가능한 만능 코드
  • 환상은 어디에서든 사용 가능한 만능 코드를 만든다.
  • 현실은 모든 조건, 모든 상황에 만족하는 코드는 있을 수 없습니다. 따라서 기존의 코드를 수정하면서 개선하는 것이 효율적이며 최선의 선택이 될 수 밖에 없습니다.

3. goto 문은 절대악(惡)
  • 편견은 goto문은 프로그램 코드에 있어서 절대악이다. goto문을 사용하는 프로그래머는 하수(下手)다.
  • goto문 한 줄로 간단하게 해결할 수 있는 것을 굳이 싫다면 복잡해지는 코드를 어떻게 할 것인가? goto문은 절대로 쓰면 안되는 것이 아니라 남발해서 사용하면 안되는 것입니다. 독(毒)도 적절히 사용하면 약(藥)이 될 때가 있습니다.

4. 매크로는 위험한 물건
  • 편견은 매크로는 코드를 읽기 어렵게 만들고 버그를 만들낼 소지가 많다.
  • 반복되는 코드를 장황하게 코딩하는 것 보다 간단하게 한 줄로 코딩할 수 있다면 더 좋지 않을까요? 길고 복잡한 코드를 매크로로 만드는 것이 아니라 한두줄의 코드를 짧고 간단하게 만드는 것이 목적입니다. 특히, 짧지만 실수가 많이 발생할 수 있는 코드, 사용 설명이 필요한 함수나 코드를 짧고 간단한 매크로로 설명을 대신할 수 있습니다.

5. 꼼꼼한 주석은 필수
  • 상식은 내가 만든 코드를 이해하기 쉽도록 주석을 다는 것은 필수다.
  • 잘 만들어진 코드는 주석이 필요 없습니다. 쉽게 이해할 수 없는 코드에 주석을 많이 단다고 이해가 쉬워지는 것은 아닙니다. 오히려 명확한 함수명이나 변수명이 더 도움이 됩니다.

6. 모든 컴파일러와 운영체제에서 가능한 호환성
  • 환상은 C/C++ 표준을 만족하면서 모든 컴파일러에서 컴파일 가능하고 모든 운영체제에서 실행가능한 코드를 만든다.
  • 현실은 대부분은 회사에서는 내부적으로 개발환경이 정해져 있습니다. 다양한 개발환경이 있다고 해도 각각 담당자가 따로 있게 마련입니다.

저만의 개똥철학일지 모르겠지만 앞으로 이런 것들을 시간나는데로 차근차근 정리해 보겠습니다. 다른 의견이 있다면 댓글 주셔도 좋습니다. 일리 있는 의견이라면 저도 참고하겠습니다.

Posted by jungtae17
컴퓨터/프로그래밍2011. 8. 3. 15:39


※ 윈도우즈 비스타(윈도우즈 서버 2008) 이상에서만 실행 가능합니다.

@ECHO OFF

REM 변수 선언
SET _RULE_NAME="예제 프로그램"
SET _PROGRAM_PATH=%CD%\Example.exe
SET _DESC="예제 프로그램 입니다.(경로: %_PROGRAM_PATH%)"

REM 방화벽 등록
IF "%1"=="reg" (
  netsh advfirewall firewall add rule name=%_RULE_NAME% dir=in action=allow program="%_PROGRAM_PATH%" enable=yes description=%_DESC% profile=any > NUL
)

REM 방화벽 삭제
IF "%1"=="unreg" (
  netsh advfirewall firewall delete rule name=%_RULE_NAME% program="%_PROGRAM_PATH%" > NUL
)

REM 방화벽 정보 보기
IF "%1"=="show" (
  netsh advfirewall firewall show rule name=%_RULE_NAME% verbose
)

Posted by jungtae17
컴퓨터/프로그래밍2011. 8. 2. 00:12
Posted by jungtae17
컴퓨터/프로그래밍2011. 7. 29. 21:31


1. 파일 다운로드
   1) sqlite-amalgamation-XXXXXXX.zip : SQLite 소스 파일
      - sqlite3.c
      - sqlite3.h
      - sqlite3ext.h

   2) sqlite-dll-win32-x86-XXXXXXX.zip : 모듈 정의 파일
      - sqlite3.def

2. 프로젝트 생성
   1) Win32 콘솔 응용 프로그램
      - 응용 프로그램 종류 : DLL
      - 추가 옵션              : 빈 프로젝트

3. 프로젝트에 SQLite 소스 파일 추가
   - sqlite3.c
   - sqlite3.h
   - sqlite3ext.h

4. 프로젝트 속성 수정
   1) [C/C++] => [전처리기] => [전처리기 정의] 추가
      - SQLITE_ENABLE_FTS3
      - SQLITE_ENABLE_RTREE
      - SQLITE_ENABLE_COLUMN_METADATA

   2) [링커] => [입력] => [모듈 정의 파일] 추가
      - sqlite3.def

5. x64 솔루션 플랫폼 추가 & 설정
   1) [빌드] => [구성 관리자] => 솔루션 플랫폼(x64) 추가

   2) x64 플랫폼 전처리기 수정 (Debug/Release 공통)
      - [프로젝트 속성] => [C/C++] => [전처리기] => [전처리기 정의]
        => WIN32 을 WIN64 로 수정

   3) 출력 파일 이름 변경
      - [프로젝트 속성] => [링커] => [일반] => [출력 파일]
        => $(OutDir)\$(ProjectName)_$(PlatformName).dll

6. 솔루션 빌드

Posted by jungtae17
컴퓨터/프로그래밍2011. 7. 29. 11:29


Using Windows Firewall with Advanced Security - C/C++
: http://msdn.microsoft.com/en-us/library/ff956128.aspx

How to use the "netsh advfirewall firewall" context instead of the "netsh firewall" context to control Windows Firewall behavior in Windows Server 2008 and in Windows Vista
http://support.microsoft.com/kb/947709/en-us

참고> http://crystalcube.co.kr/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%EB%B0%A9%ED%99%94%EB%B2%BD-%ED%95%B4%EC%A0%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
Posted by jungtae17
컴퓨터/프로그래밍2011. 7. 28. 18:17


SELECT DISTINCT OBJECT_NAME(id) FROM sys.syscomments WHERE text LIKE '%검색어%'

sys.syscomments (시스템 뷰)
 : DB 내의 모든 뷰, 규칙, 기본값, 트리거, CHECK 제약 조건, DEFAULT 제약 조건 및 저장 프로시저 내용(코드)을 포함.

참고> http://msdn.microsoft.com/ko-kr/library/ms186293.aspx
Posted by jungtae17
컴퓨터/프로그래밍2011. 7. 1. 18:05

// TIMESTAMP 변수 선언 & 초기화
TIMESTAMP_STRUCT tmTime;

tmTime.year     = 2011;
tmTime.month    = 7;
tmTime.day      = 1;
tmTime.hour     = 12;
tmTime.minute   = 10;
tmTime.second   = 30;
tmTime.fraction = 0;            // 주의!> 무조건 0 으로 설정한다.

SQLLEN nParamLen = 0;

// 매개변수 바인딩
SQLBindParameter(
    hSTMT,                      // 명령 핸들
    1,                          // 매개변수 번호
    SQL_PARAM_INPUT,            // INPUT / OUTPUT / INPUT_OUTPUT
    SQL_C_TYPE_TIMESTAMP,       // [고정] 값 타입(C 타입 ID)
    SQL_TYPE_TIMESTAMP,         // [고정] 파라미터 타입(SQL 타입 ID)
    SQL_TIMESTAMP_LEN,          // [고정] 파라미터 크기(기본값: 19, 'yyyy-mm-dd hh:mm:ss')
    3,                          // [고정] 시간 데이터 중 밀리초의 자리수
    &tmTime,                    // 파라미터에 연결될 변수 포인터
    sizeof(TIMESTAMP_STRUCT),   // [고정] 파라미터에 연결될 변수의 크기
    &nParamLen                  // 반환값(길이, 상태)이 저장될 변수 포인터
);


TIMESTAMP_STRUCT 구조체의 fraction 값이 0이 아닐 경우 ODBC 오류가 발생한다.

오류 메시지 [22008]: [Microsoft][ODBC SQL Server Driver] 날짜/시간 필드 오버플로

참고 1> http://www.tech-archive.net/Archive/SQL-Server/microsoft.public.sqlserver.odbc/2006-08/msg00069.html
참고 2> http://msdn.microsoft.com/ko-kr/library/bb677267(v=SQL.100).aspx

Posted by jungtae17
컴퓨터/프로그래밍2011. 4. 6. 22:16
데이터베이스에서 인덱스를 사용하느냐, 안하느냐에 따라 DB 쿼리 속도가 다르고 어떤 인덱스를 사용하느냐에 따라 또 달라진다.

왜 이런 차이가 발생할까 라는 궁금함과 효율적인 쿼리를 만들기 위해서 간단히 정리 해본다.


 
그리고 조건절(Where 절)에 따라 다르겠지만 어떤 인덱스를 설정하고 사용하는 것이 좋을지 간단히 비교 해본다.


모든 DBMS 가 이런 것은 아니라고 하지만 익히 알고 있는 Oracle, MS-SQL 등 대부분의 DBMS 가 이렇게 처리하고 있다고 한다.

Posted by jungtae17
컴퓨터/프로그래밍2011. 4. 2. 21:20
Posted by jungtae17