로지텍 Logitech Driver MouseWare 9.79
내가 재미를 느낄수 있을만한것들
- POSA I 읽기
- INI Loader 만들기.
- ODBC Class 만들기.
ODBC file DSN 접속하기
[ODBC]
DRIVER=SQL Server
UID=testid
DATABASE=testDb
PWD=passwd
APP=Microsoft Data Access Components
SERVER=testserver
=========
// 소스
#pragma comment(lib, "odbc32.lib")
#include <iostream>
#include <Windows.h>
#include <sql.h>
#include <sqlext.h>
using namespace std;
void DsnQuery()
{
//////////////////////////////////////////////////////////////////////////////////////
// start
SQLHENV hEnv;
// 환경 핸들을 할당하고 버전 속성을 설정한다.
if( SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv ) != SQL_SUCCESS )
return;
if( SQLSetEnvAttr( hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER ) != SQL_SUCCESS )
return;
// 연결 핸들을 할당하고 연결한다.
SQLHDBC hDbc;
if( SQLAllocHandle( SQL_HANDLE_DBC, hEnv, &hDbc ) != SQL_SUCCESS )
return;
SQLCHAR connectInfo[256] = { 0, };
wsprintf( (char *)connectInfo, "FILEDSN=.\\fileDSN.dsn" );
SQLCHAR outInfo[256] = { 0, };
SQLSMALLINT sqlRet = 0;
SQLRETURN ret = SQLDriverConnect( hDbc, NULL, connectInfo, sizeof( connectInfo ), outInfo, sizeof( outInfo ),
&sqlRet, SQL_DRIVER_NOPROMPT );
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO ) {
cout << "ERROR : INI Table을 가져올수 없습니다.\n";
return ;
}
//////////////////////////////////////////////////////////////////////////////////////
// 명령 핸들 할당. 및 바인딩.
// 명령 핸들을 할당한다.
SQLHSTMT hStmt;
SQLAllocHandle( SQL_HANDLE_STMT, hDbc, & hStmt );
// 결과를 돌려 받기 위해 바인딩한다.
SQLCHAR iniTablename[64];
SQLLEN lIniTablename;
SQLBindCol( hStmt, 1, SQL_C_CHAR, iniTablename, sizeof(iniTablename), &lIniTablename );
// SQL문을 실행한다.
SQLExecDirect( hStmt, (SQLCHAR *)"select name from test_table where name like 'test%' order by name", SQL_NTS );
while( SQLFetch( hStmt ) != SQL_NO_DATA ) {
cout << reinterpret_cast<char *>( iniTablename ) << endl;
}
SQLCloseCursor( hStmt );
SQLFreeHandle( SQL_HANDLE_STMT, hStmt );
//////////////////////////////////////////////////////////////////////////////////////
// clean up
SQLDisconnect( hDbc );
SQLFreeHandle( SQL_HANDLE_DBC, hDbc );
SQLFreeHandle( SQL_HANDLE_ENV, hEnv );
}
int _tmain(int argc, _TCHAR* argv[])
{
DsnQuery();
return 0;
}
dd로 MBR 백업및 복구
백업할 MBR /dev/sdb
$ dd if=/dev/sdb of=./usb.mbr count=1 bs=512
복구시
$ dd if=./usb.mbr of=/dev/sdb
멀티 바이트 코드 체크 _mbsbtype _ismbblead,
_mbsbtype : 해당 글자가 Single byte인지 멀티바이트 시작문자인지 멀티바이트 끝문자인지 알아낸다. |
사용예제
#include <mbctype.h> #include <mbstring.h> int main(int argc, char* argv[]) { const unsigned char str[] = "hello 헬로우 월드"; _setmbcp( 949 ); // 한글 윈도우에서는 codepage를 설정할 필요가 없다.
for( int i = 0 ; i < sizeof( str ) ; ++i ) {switch( _mbsbtype( str , i ) ) { case _MBC_SINGLE: // 싱글 바이트 printf( "1 : [%c]\n", str[i] ); break; case _MBC_LEAD: // 멀티 바이트 헤더 printf( "2 : [%c", str[i] ); break; case _MBC_TRAIL: // 멀티 바이트 테일 printf( "%c]\n", str[i] ); break; case _MBC_ILLEGAL: // 알수 없는 문자. break; default: break; } } return 0; } |
출력결과
1 : [h] 1 : [e] 1 : [l] 1 : [l] 1 : [o] 1 : [ ] 2 : [헬] 2 : [로] 2 : [우] 1 : [ ] 2 : [월] 2 : [드] |
패치및 데비얀 패키지 만들기
# apt-get source 패키지이름
패치
# patch -p0 < patch_file
# cd 소스디렉토리
# dpkg-buildpackage -rfakeroot
패키지 hlold
# echo "패키지이름 hold" | sudo dpkg --set-selections
참고 URL http://kldp.org/node/75845
sizeof와 유사한 offsetof는 무엇인가.
일단 소스와 결과를 보라.
#include <iostream>
using namespace std;
struct sA
{
int a;
double b;
short c;
short d;
int e;
};
int main()
{
cout << "sizeof(sA) : " << sizeof(sA) << endl;
cout << "offsetof(sA::a) : " << offsetof(sA, a) << endl;
cout << "offsetof(sA::b) : " << offsetof(sA, b) << endl;
cout << "offsetof(sA::c) : " << offsetof(sA, c) << endl;
cout << "offsetof(sA::d) : " << offsetof(sA, d) << endl;
cout << "offsetof(sA::e) : " << offsetof(sA, e) << endl;
return 0;
}
출력)
sizeof(sA) : 20
offsetof(sA::a) : 0
offsetof(sA::b) : 4
offsetof(sA::c) : 12
offsetof(sA::d) : 14
offsetof(sA::e) : 16
그럼 설명 하겠지만 엉성하다.
struct sA위 코드에서
{
int a;
double b;
short c;
short d;
int e;
};
32bit머신에서
int a 크기는 4byte.
double b 크기는 8byte.
short c 크기는 2byte.
short d 크기는 2byte.
int e 크기는 4byte 이다.
sizeof( sA ) 를 하면.
출력값이 4+8+2+2+4 = 20이 나올것이다.
cout << "sizeof(sA) : " << sizeof(sA) << endl;
출력)
$ ./sizeof
sizeof(sA) : 20
그러면 a위치가 어디인지 아는 방법은 없을까?
방법은 있다. offsetof라는거다.
a위치는 0번째부터 3번째까지일테고
b위치는 4번부터 11번째 위치.. 이렇게 될것이다.
자 그럼 어떤 원리일까?
offsetof를 따라가 보면 아래와 같은 소스가 나온다.
#define offsetof(s,m) (size_t)&(((s *)0)->m)무슨뜻일까?ㅡ.ㅡ
offsetof(sA, b) 를 대입 해보자
(size_t)&(((sA *)0)->b)아 머리 아프다.
아래걸 보자.
((sA *)0)무슨뜻일까?
0번지 주소값에 sA가 있다고 가정하는것이다.
결론은 0...
여기서 ->b를 넣었다.
(0)->b
움. 무슨뜻?
컴퓨터는 메모리를 접근할때 기본 주소에 해당 멤버의 offset을 더해서 나머지 값들을 구한다.
결국 위의 것은
(0)->b 는설명이 엉성하므로 아래 사이트를 보는것도 좋다.
0 + (b의 위치) 가 된다.
결국
0+4 = 4
http://kldp.org/node/62717
소스 코딩규칙
-
class
-
-
멤버 변수명 작명
- m_ 로 시작한다.
-
멤버 함수명 작명
- private : _소문자
- protected, public : 대문자
-
클래스명
- 첫문자는 대문자명으로
-
멤버변수 위치
-
하단, public/protected/private
-
-
-
struct
-
-
struct 작명
-
- s로 시작 ( Ex. sCar )
-
멤버 변수 작명
- m_ 제외
-
-
지역변수명
-
소문자로 시작.
- 예제 int i; int j; Car pony;
-
-
전역 변수
- g_로 시작
-
일반 함수 선언
- 첫문자가 대문자
-
define
- 모두 대문자. DF_로 시작( 예외인정 )
-
프리컴파일러
- #ifdef _TEST
# ifdef _TEST111
# endif // _TEST111
#endif // _TEST
- #ifdef _TEST
-
파일명
- 클래스명이나 struct 명과 동일( 예외인정 )
-
주석
- 파일 doxygen 주석 참고? 우선 맘대로
-
중괄호
- 되도록 아래로
이 글은 스프링노트에서 작성되었습니다.
디자인 패턴
스트래티지 패턴(Strategy patten)
알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할수 있도록 만든다. 스트래티지을 활용하면 알고리즘을 사용하는 클라이언트놔는 독립적으로 알고리즘을 변경 시킬수 있다.
예제) 오리 - 나는 오리, 못나는 오리, 꽥꽨 거리는 오리, 삑삑 소리지르는 오리등..
옵져버패턴(Observer pattern)
한 객체의 상태가 바뀌면 그 객체에 의족하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다의 의족성을 정의 합니다.
예제) 출판사와 구독자, 헤드헌터와 개발자.
데코레이터 패턴(Decorator patten)
객체에 추가 요소를 동적으로 더할수 있습니다. 데코레이터를 사용하면 서브 클래스를 만드는 경우에 비해 훨씬 유연하게 기능을 확장할수 있습니다.
예제) 스바버즈 커피점의 음료와 각종 양념등등의 가격 개산 문제.
팩토리 패턴(Factory patten)
팩소리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클레스에서 결정하게 만듭니다. 택토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이죠.
예제) 피자가계에서 뉴욕스타일, 캘리포니아스타일, 시카고스타일 피자 만들기.
프록시 패턴(Proxy patten)
어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴.
이 글은 스프링노트에서 작성되었습니다.
IME 구현 분석
다국어 IME 분석 문서
다국어 IME 예제 소스
조합 중인 문자 취소 시키기
const HIMC hIMC = ::ImmGetContext( m_hWnd );
ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
::ImmReleaseContext( m_hWnd, hIMC );
조합 중인 문자 가져오기
if(lParam&GCS_COMPSTR) {
const HIMC hIMC = ::ImmGetContext( m_hWnd );
int tempSize = ImmGetCompositionStringW(hImc, GCS_COMPSTR, NULL, 0);
char *pBuf = (char *)malloc(tempSize );
ImmGetCompositionStringW(hImc, GCS_COMPSTR, pBuf, tempSize);
ImmReleaseContext(m_hWnd, hImc);
}
조합이 완성된 문자 가져오기
if(lParam&GCS_RESULTSTR) {
const HIMC hIMC = ::ImmGetContext( m_hWnd );
int tempSize = ImmGetCompositionStringW(hImc, GCS_RESULTSTR, NULL, 0);
char *pBuf = (char *)malloc(tempSize );
ImmGetCompositionStringW(hImc, GCS_RESULTSTR, pBuf, tempSize);
ImmReleaseContext(m_hWnd, hImc);
}
조합 윈도우 위치 설정하기
void SetIMECompPos( int xpos , int ypos )
{
HIMC hImc = ImmGetContext(m_hWnd);
if( hImc ) {
COMPOSITIONFORM cf;
cf.dwStyle = CFS_POINT;
cf.ptCurrentPos.x = xpos;
cf.ptCurrentPos.y = ypos;
ImmSetCompositionWindow(hImc, &cf);
ImmReleaseContext(m_hWnd, hImc);
}
}
이 글은 스프링노트에서 작성되었습니다.