포인터 이해에 대한 글

RSS 리더로 나는 KLDP Geek forum 을 보곤 한다.
보다보면 재밌는 것들이 많단 말이지.. 글들에 글들을 따라가다보면 몰랐던 혹은 어렴풋이 알았던, 애매한 것들에 대해서 다시한번 생각해보게 되고 알게 된다. 언젠가 적었듯이 이게 KLDP의 묘미가 아닌가 한다.
그 중 하나로 오늘은 cinsk님의 “포인터 이해란 글에 대해.“란 글을 보게 되었다. 글들에 링크되어 있는 글들의 덧글들을 보라.

세상은 넓고, 난 너무 미약하다.

자주쓰는 Perl 구문들..

시작

#!/usr/bin/perl -w


STDIN 입력은 간단히 <>

$input = <>;


입력에서 마지막 \n 없애기

chomp($input);


문자열을 나눠서 리스트로 만들기

@list = split(/구분자/, 문자열);


파일을 쓰기 모드로 열기

open(HANDLE, ‘>filename’);

그냥은 filename, 추가 쓰기는 >>


파일에 뭘 쓰고 싶을 때

print HANDLE ‘쓸 내용’;


파일 닫기

close(HANDLE);


sprintf

$string = sprintf ‘%s’, ‘string’;


printf

printf ‘%d’, 2


찾을 문자열의 시작 인덱스 구하기

$i = index(string, substring, startIndex = 0);


시간 구하기

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);


시간 만들기

use POSIX;
$time_t = POSIX::mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = -1);

 

문자열 연결은 ‘.’ 으로..

‘string1’.’string2′

환경변수 접근

$ENV(‘env1’)

ascii <-> character

$ascii_value = ord(“e”);    # now 101

$character   = chr(101);    # now “e”

더 많은 정보는 http://perldoc.perl.org

Windows Batch 파일(.BAT)에서 프롬프트 입력받기

SET 에서 /P 옵션을 주면 환경변수에 입력값을 넣을 수 있다.
형식은 다음과 같다.


SET /P 변수=[promptString]


실행 예제


> SET /P DASOMOLI=DASOMOLI에 넣을 값을 입력하세요) 
DASOMOLI에 넣을 값을 입력하세요) haha
> set dasomoli
DASOMOLI=haha

Windows Batch 파일(.BAT)에서 IF 문에서 수식 사용

IF 문에서 수식을 사용하고 싶을 때, 예를 들면, 에러 체크를 위해 루프를 도는 개수등을 카운트하고 싶다면 SET 에서 /A 옵션을 사용하고 IF에서 비교 연산자를 사용하면 된다. IF 문의 비교 연산자는 다음과 같다

EQU – 같음
NEQ – 같지 않음
LSS – 보다 작은
LEQ – 작거나 같음
GTR – 보다 큰
GEQ – 크거나 같음

다음은 start 로 3가지 일을 동시에 처리한 후 goto와 label을 이용, cygwin의 delay로 일정 시간 체크한 후 그 후 에러로 처리하는 bat 파일의 예다.

@echo off
SET /A LOOP_COUNT=1
SET /A LOOP_MAX_COUNT=5
SET CYGWIN_DELAY=[Cygwin 경로]\delay.exe
SET DELAY_TIME=5m

rem WORK1, 2, 3를 동시에 돌린다. 다음 작업에 dependency 가 있는 작업에
rem start의 /W 옵션을 주어 기다리도록 한다.

start WORK1.bat
start WORK2.bat
start /W WORK3.bat

goto CHECK

:DELAY
rem if LOOP_COUNT >= LOOP_MAX_COUNT
IF %LOOP_COUNT% GEQ %LOOP_MAX_COUNT% (

echo ERROR!

exit 1

)
rem Delay 한다.
%CYGWIN_DELAY% %DELAY_TIME%

rem LOOP_COUNT += 1
SET /A LOOP_COUNT+=1

:CHECK
echo Checking…
IF [WORK1 실패조건] (


echo Work 1 is Failed!

goto DELAY

)
echo Work1 is success!
IF [WORK2 실패조건] (

echo Work 2 is Failed!

goto DELAY

)
echo Work2 is success!
IF [WORK3 실패조건] (

echo Work 3 is Failed!

goto DELAY

)
echo Work3 is success!

call WORK4.bat

Windows Shell Extension 개발 참고자료

MSDN : Creating Shell Extension Handlers

The Complete Idiot’s Guide to Writing Shell Extensions
 Part 1
 Part 2
 Part 3
 Part 4
 Part 5
 Part 6
 Part 7
 Part 8
 Part 9

Shell Extension Context Menu Sample
Registry에 등록하는 건 Post-Build Step 에서 Regsvr32를 이용해서 등록한다. 커맨드는 다음과 같다.

regsvr32.exe /s /c $(OUTDIR)\CtxMenu.dll

Registry에 등록을 해제하는 건 다음과 같은 커맨드로 가능하다.

regsvr32.exe /s /u $(OUTDIR)\CtxMenu.dll

Registry 등록 관련 절차는 ShellExtReg.cpp 내의 RegisterFileMenu() 와 UnregisterFileMenu() 내부를 참고하면 좋다.

Unicode string를 MBCS string으로 바꾸는 방법

1. WideCharToMultiByte() API를 호출하는 방법
2. CRT 함수 wcstombs() 를 호출하는 방법
3. CString 생성자나 assign을 통한 방법(MFC만 가능)
4. ATL string 변환 매크로를 이용하는 방법

WideCharToMultiByte

// Assuming we already have a Unicode string wszSomeString…
char szANSIString [MAX_PATH];

    WideCharToMultiByte ( CP_ACP,                // ANSI code page
                          WC_COMPOSITECHECK,     // Check for accented characters
                          wszSomeString,         // Source Unicode string
                          -1,                    // -1 means string is zero-terminated
                          szANSIString,          // Destination char string
                          sizeof(szANSIString),  // Size of buffer
                          NULL,                  // No default character
                          NULL );                // Don’t care about this flag

wcstombs

    wcstombs ( szANSIString, wszSomeString, sizeof(szANSIString) );

CString

// Assuming we already have wszSomeString…

CString str1 ( wszSomeString );    // Convert with a constructor.
CString str2;

    str2 = wszSomeString;          // Convert with an assignment operator.

ATL Macro

#include <atlconv.h>

// Again assuming we have wszSomeString…

{
char szANSIString [MAX_PATH];
USES_CONVERSION;  // Declare local variable used by the macros.

    lstrcpy ( szANSIString, OLE2A(wszSomeString) );
}

참고 : Introduction
to COM – What It Is and How to Use It.
by Michael Dunn

원격 데스크톱 연결 – XP3 에서 윈도우즈 키 안먹힐 때..

윈도우즈 XP SP3로 오면서 Remote Desktop Connection tool(RDP Client)인 mstsc가 Ver. 6.0.6001로 업그레이드되면서 몇 가지 변경이 있다.

1. /console 옵션 대신 /admin 옵션을 사용한다는 것
2. 원격 접속된 컴퓨터에서의 Windows-key나 Alt-key 조합이 먹지 않는 것

1 번은 그렇다쳐도 2 번은 정말 불편하다-_-

업그레이드된 버전으로 어떻게 안되나 많이 시도해보았지만 결론은 안되는 듯 하다.
이를 위해 기존 5.2 클라이언트를 사용하기로 결정하고 검색해보았더니 프리웨어로 TSplus Portable RDP 5.2 client가 있다. 이를 이용해서 사용하면 된다.

Windows Batch 파일(.BAT)에서 Exit code 조정

Windows의 Batch 파일에서 Exit code를 원하는 값으로 설정하고 종료하고 싶다면..

exit /B <exitCode>

Batch 파일 안에서 Exit code 는 ERRORLEVEL 환경변수(%ERRORLEVEL%) 로 접근할 수 있다.

Perl을 이용한 파일내의 문자열 치환

perl을 이용해서 파일 내부의 특정 문자열을 한번에 바꿀 수 있다.

perl -pi -e ‘s/<원본문자열>/<바꿀문자열>/g’ <FILE명>

<원본문자열> 부분은 정규식을 사용한다.

작은 따옴표와 큰 따옴표 사용에 관한 차이를 알고 싶다면 http://kldp.org/node/98639#comment-460800 를 참고!