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

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 를 참고!

NMake – Makefile 내부의 인라인 파일

NMake를 사용할 때 Makefile 내부에 파일을 내장해서(인라인 파일) 사용할 수 있다.
형식은 다음과 같다.

<<[Filename]
파일 내용
<<[KEEP or NOKEEP]

위와 같은 내용을 Makefile 내부에 써놓으면 << 들 사이의 내용이 파일로 저장되어 사용가능하게 된다. Filename 을 적으면 해당파일명으로 파일이 생성되고 적지 않으면 임의의 이름으로 임시파일이 생성된다. 또한, Make 세션 사용 후에 파일을 남겨두고 싶다면 KEEP을, 아니라면 NOKEEP 또는 아무것도 쓰지 않으면 된다.

파일 내용 안에는 $(변수) 등을 써두면 써둔 “$(변수)”가 아닌 변수로 치환되는 내용이 그대로 들어가므로 편리하다.

참고 : http://msdn.microsoft.com/ko-kr/library/seaaew50(VS.80).aspx

Python import 경로추가, 주석, 함수선언, Dictionary, List, Tuple

파이썬 문서고

Dive into Python

wxPython Tutorial(http://zetcode.com/wxpython/)
구글의 파이썬 튜토리얼 번역

import 경로 추가

import sys;
sys.path.append(‘/mypath’)

주석(문서화에 사용)

“”” 여

줄 주석 “””

함수 선언

def functionname(parameter):
    body

Dictionary : {, } 사용, 순서라는 개념 없음

dic = { <key1>:<value1>, <key2>:<value2> }

Dictionary Data 제거

del dic[<key>]

Dictionary의 모든 element 삭제

dic.clear()

List : [, ] 사용, 인덱스 사용. Element가 중복 존재 가능

li = [ <element1>, <element2> ]

음수 인덱스 사용가능. -1이 가장 끝

li[-1]

List slice

li[1:3] 1, 2번째 인덱스의 원소의 리스트를 새로 생성
li[:] 리스트의 복사본 생성

List 원소 추가

li.append(<element>)
li.insert(<index>, <element>)
li.extend(<list>)

List 검색
list 내의 가장 첫번째 원소의 index

li.index(<element>)

list 에 있는지 검사

<element> in li

List 에서 원소 제거

li.remove(<element>)

가장 마지막 원소 제거하면서 리턴

li.pop()

+ 연산자 : 새로운 리스트를 리턴(extend는 변경)

li = <list1> + <list2>

+= 연산자는 extend와 동일

li += <list>

* 는 반복자로 작동

li = <list> * 3

Tuple : (, ) 사용. 변경 불가능, append, extend, remove, pop, index는 없음, in 으로 검사는 가능, 리스트보다 빠름

tup = ( <element1>, <element2> )

GNU make 확장자 규칙, 패턴 규칙

GNU Make에 대해서 아주 간략하면서도 핵심적인 내용들을 적어놓은 문서가 있길래 모르거나, 쓸 때마다 헷갈렸던 내용들을 정리해 둔다.

확장자 규칙, 패턴 규칙

전통적인 형식

.c.o:

gcc -c ${CFLAGS} $<

GNU make 확장 기능
%.o: %.c
gcc -c -o $@ ${CFLAGS} $<
기호 정리

$< 입력 파일, 콜론의 오른쪽에 오는 패턴을 치환
$@ 출력 파일, 콜론의 왼쪽에 오는 패턴을 치환
$* 입력 파일에서 확장자(.c, .s 등)을 떼어낸 파일명

예제

%_dbg.o: %.c
gcc -c -g -o $@ ${CFLAG} $<

DEBUG_OBJECTS = main_dbg.o edit_dbg.o

edimh_dbg: $(DEBUG_OBJECTS)

gcc -o $@ $(DEBUG_OBJECTS)
매크로 조건
예제
ifdef XPM
LINK_DEF = -DXPM
endif

$make XPM=yes


주의사항
타겟 아래의 명령에 대해서는 하나의 행이 각각의 쉘에서 실행됨. 순차적이 아님. 순차적인 실행을 원할 때는 ‘;’ 와 ‘\’ 를 이용.
예제
target:
cd obj ; \
HOST_DIR=/hom/e ; \
mv *.o $$HOST_DIR

Google Android 관련 Reference & JNI Complie 옵션

예전에 안드로이드 관련 과제를 진행하면서 보았던 Reference 들이다.

1.2 Reference #

[edit]

1.2.2 Android Internal #

이건 아마도 JNI 관련 라이브러리를 만드는 중에 시도했던 삽질 과정 중의 컴파일 옵션들..

  • ./configure –host=arm-none-linux-gnueabi –enable-shared CFLAGS=-fpic CXXFLAGS=-fpic LDFLAGS=-shared
  • ./configure –host=arm-none-linux-gnueabi –enable-shared
    CFLAGS=-fpic CXXFLAGS=-fpic CPPFLAGS=”-fpic -I/usr/local/include/
    -I/usr/lib/jvm/java-6-sun/include
    -I/usr/lib/jvm/java-6-sun/include/linux” LDFLAGS=-shared

이후에 자료들이 많이들 생긴 듯 해서 별로 필요는 없을 듯 하지만, 위키 쪽 자료들을 조금씩 정리하면서 블로그로 옮기고 정리해가자.

2012. 6. 19. 추가
Make shared native library: g++ -shared -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -o libjnifunc.so jnifunc.cpp
Run: java -Djava.library.path=. JniFuncMain
Geting “Signature”: javap -s -p JniFuncMain

FTL 중 FAST 기법 정리

멤버십 초기에 FTL에 관련된 과제를 하면서 보았던 FTL 기법 중 FAST에 관련된 것들을 잊어버리기 전에 정리해두고자 한다.

FAST는 FAST의 저자들이 BAST라고 이름붙인 기법의 원리와 문제점을 설명하고 이를 해결하기 위해
완전연관섹터변환(Fully Associative Sector Translation) 방식을 사용하는 것을 말한다. 즉,
BAST에서는 임의쓰기가 동시에 발생할 때 여러 논리블록에 대한 로그블록이 경쟁상태에서 모든 섹터가 사용되지 않고 합병되는
문제점이 있는데 이를 해결하기 위해 각 로그블록의 활용률을 최대한 높임으로써 각 로그블록이 블록 전체의 섹터가 모두 사용된
이후에 소거되도록 한다.

이를 위해서 최초 쓰기 연산시에는 해당 자리에 섹터 데이터를 기록하고, 덮어쓰기 연산시에 아래의 조건들을 검사하여 적절한 연산을 수행한다.

조건 1. (start_lsn mod 32 = 0) & (lbn = (start_lsn div 32) !∈ rw_lbn_set)
조건 2. (lbn = sw_lbn) & (start_lsn mod 32 = sw_sec_num)
조건 3. (lbn = sw_lbn) & (start_lsn mod 32 > sw_sec_num)
조건 4. (lbn = sw_lbn) & (start_lsn mod 32 < sw_sec_num)
조건 5. 조건 1, 2, 3, 4를 모두 만족하지 않는 경우

위의 1~4까지의 조건들은 모두 순차쓰기용 로그블록에 쓰여지는 경우의 조건들이다. rw_set_of_lbn은 임의쓰기용 로그블록
그룹에 기록된 섹터들의 논리블록들의 주소 정보이고, sw_lbn는 순치쓰기용 로그블록에 현재 쓰여지고 있는 논리블록 주소,
그리고 sw_sec_num은 논리 블록에 대해 순차적으로 쓰여진 섹터의 수이다.

조건 1의 경우 순차쓰기용 로그블록의 첫번째 섹터에 기록된다. 이 때, 순차쓰기용 로그블록에 이미 다른 섹터들이 저장되어 있다면 그 블록과 원본 데이터 블록간의 합병 연산이 발생하여 순차쓰기용 로그블록을 소거한 후 기록된다.

조건 2의 경우 순차쓰기용 로그블록에 기록된 데이터의 다음 위치에 추가(append)할 수 있는 쓰기연산이다. 순차쓰기용 로그블록의 모든 섹터가 순차적으로 다 기록된 경우 교환 연산을 한다.

조건 3의 경우 순차쓰기용 로그블록에 연이어쓰여지지는 않지만 기록할 수 있는 쓰기 연산이다. 이 때, 그 중간 섹터가 채워질 확률이 낮기 때문에 합병 연산을 수행한다. 이 때 비어있는 섹터들만 쓰기연산을 수행하여 교환연산을 수행하면 데이터 블록만 한번 소거하면 된다.

조건 4의 경우 순차쓰기용 로그블록에 이미 기록되어 있는 섹터들 중 일부분에 대해서 덮어쓰기가 발생하는 쓰기연산이다. 이 때는 데이터 블록과 로그 블록간의 합병 연산이 수행된다.

조건 5의 경우 임의쓰기용 로그블록에 기록하며, 기록할 위치는 로그블록에 마지막으로 기록한 위치 바로 다음이 된다. 만약, 로그
블록 그룹에 더 이상의 빈 섹터가 없으면 첫 번째 로그블록에 대해 합병 연산을 수행하여 공간을 확보한다. 합병 연산 수행시에는
원형 큐 방식으로 시작 로그 블록을 합병 연산의 대상으로 삼는데, 그 로그 블록에 쓰여진 섹터들의 논리 블록의 개수만큼
합병연산이 발생한다. 이 때 로그블록에서 최신 섹터를 찾아 이 최신 섹터의 내용을 예비블록에 기록하고 데이터 블록으로부터 나머지
최신 섹터를 복사한다. 로그블록에서 최신 섹터를 찾을 때는 큐의 마지막부터 역탐색(backward search)를 수행하고,
합병 연산의 대상이 아닌 역탐색으로 찾은 최신 섹터를 포함하는 로그블록에서 섹터를 복사하고 해당 섹터 번호를 사상테이블에서
-1로 설정하여 무효화(invalid)시켜 그 로그블록이 나중에 합병연산의 대상이 되었을 때 무시하도록 한다.