Monthly Archives: February 2008

미디로 악보 페이지 넘기기

몇일전에 Kotaro Oshio라는 기타리스트를 알게 되었는데, Departure라는 곡이 너무 마음에 들더군요. 계속 그 곡만 반복해서 듣고 있습니다. 예전에 핑거스타일 기타에 미쳤었던 시절이 있었는데… 아마 95년이나 96년 정도였던거 같네요. 마이클헤지스의 씨디들이 아직 가지런히 다~ 씨디장에 꼽혀있네요… 악보도 꽤나 출력했었죠. 그리고 지금 굴러다니는? 앰프 연결할수 있는 어쿠스틱 기타도 그때 샀던거죠. 피에조 픽업을 구하려고 했었는데 그당시는 구하기 쉽지 않더군요.

검색을 통해서 네이버의 핑거스타일 기타 클럽을 찾고, 가입했는데 정말 엄청난 정보들이 있더군요. 저는 혼자 악보와 몇몇 비디오만 보면서 약간 따라하는 정도였는데… 정말 대단한 분들이 많더군요. 강좌도 있고.. 악보도 많고… 하여간 생각지도 않게 위의 곡의 악보를 받고, 업무시간에 조용히 악보를 출력해 왔습니다. 집에와서 좀 쳐보니 어려운거도 있지만… 일단 악보 넘기기가 너무 귀찮은겁니다… 기타는 잠시 제껴뒀습니다.

제가 미디 풋 페달이 있는데 (베링거 FCB-1010), 이걸로 페이지 넘길수 있으면 딱이겠더군요. 그래서 MIDI, Keyboard 등의 단어로 조합해서 검색해봤는데 소득이 없었습니다. Keyboard라는게 건반으로 되서 MIDI와 항상 붙어다니더군요.. 검색에 실패해서 생각을 좀 해보니, 직접 만들어보는것도 어렵지 않을거 같더군요. Code Project에서 괜찮은 라이브러리가 있어서 받아서 MIDI 입력 받는 부분에서 현재 활성창을 구한 다음에 열심히 WM_KEYDOWN, WM_KEYUP 메시지를 보내봤습니다. 그런데 뭐가 문제인지 잘 안되더군요. SPY에서 확인해서 똑같이 보내는데 아무런 반응이 없더군요… 금방 해결이 안될거 같아서… 비슷한 역할을 하는 프로그램 소스를 찾아봤습니다. AutoIT과 AutoHotKey가 있더군요.. AutoIT은 소스 비공개인거 같고… AutoHotKey 소스를 받아서 봤는데 허거걱 이더군요. SendKeys라는 함수가 있는데 이게 680줄이네요. 내부에서 호출하는 함수는 포함 안하고요–. 소스파일(keyboard_mouse.cpp)은 4150줄이고, 크기는 237KB! 이건 쉽게 할수 있는 일이 아니군! 하고 포기.

AutoIT이나 AutoHotKey에서 혹시 미디 입력을 받는 방법이 없을까 해서 검색해보니, 이와 관련된 쓰레드를 찾았습니다. MIDI IN support in AutoHotKey . 다 읽어보진 않았지만, 제가 찾던걸 해주는 프로그램이 중간에 소개되었네요. Bome’s Midi Translator 라는 프로그램인데 미디 메시지 받아서 키보드로 바꿔주거나, 다른 미디로 바꿀수 있는 기능을 제공합니다. 쉐어웨어 비슷하게 처음에 등록화면이 뜨긴하는데 크게 귀찮지는 않더군요.

아래는 처음 등록 팝업 떴을때:

제가 필요한 페이지 넘기기 기능을 매핑한 상태:

주의할점은 미디입력에서 NoteOn 으로 매핑을 만들면 변환이 잘 안되더군요. 그래서 NoteOff로 매핑을 만들었더니 잘 동작하네요.

이 프로그램 라이센스가 특이한데.. 4만원정도(29유로)에 살수도 있고, 개인용도로만 사용한다면 오프라인으로 엽서를 하나 보내면 키를 보내준다고 합니다 :) 시간 나면 엽서 하나 보내봐야겠습니다. 홈페이지 보면 장난아니라고 아주 진지하게 설명하고 있습니다. 엽서 모으는게 취미인가보네요. 근데 독일로 엽서 보내려면 얼마나 드나요??

MS Office 이진 파일 포맷 공개했네요.

뭐 제가 스펙 볼 일은 아마도 없겠지만… MS 오피스 이진파일 포맷이 공개되었습니다.

http://www.microsoft.com/interop/docs/OfficeBinaryFormats.mspx

리버스 엔지니어링으로 이미 많이 알려져있지만, 스팩문서가 나왔으니, 오픈 오피스 등의 공개 프로그램에서 파일 호환성이 더 좋아질거 같네요.

Joel Spolsky의 블로그를 통해서 알게되었고, 파일포맷이 왜 이렇게 복잡한지에 대해서 설명하고 있습니다.

http://www.joelonsoftware.com/items/2008/02/19.html

Varnish Cache 소스로부터 배우기

요즘 Varnish Cache를 본격적으로 도입하기 위해서 노력중입니다. 설계 문서를 보면 많이 사용하는 Squid는 70/80년대 하드웨어에 적합하게 설계되었기 때문에 요즘 하드웨어에서는 퍼포먼스가 아주 많이 떨어진다는 흥미로운 얘기가 있습니다.

Squid에서는 소프트웨어적으로 캐시를 따로 구현해서, 커널에서 메모리 관리하는 것과 같이 잘 동작하지 않는다고 합니다. 소프트웨어적으로 캐시를 따로 구현하면 필요하지 않은 메모리 영역을 swap out할때, 똑똑한 커널에서 이미 swap out됐던 데이터를 메모리 영역으로 불러왔다가 다시 swap out 하는 과정이 일어난다고 합니다. 옛날 OS에서는 메모리 관리가 최적화가 안되어있었지만 요즘은 메모리 관리를 커널에서 알아서 하게 하면 퍼포먼스가 많이 빨라진다고 하네요.

Varnish Cache 최적화는 크게 3가지 정도로 요약할수 있을거 같습니다.

1. 메모리 관리를 커널에 위임
2. 메모리 할당/해제 부분을 최소화 (workspace 단위 할당, 한번에 해제)
3. 설정 파일 컴파일러로 컴파일

메모리 관리는 mmap을 통해서 관리합니다. 파일 시스템 영역과 메모리 영역을 연결하여 사용하고, storage_file.c에서 직접 메모리 쪼개서 관리합니다. 메모리 영역을 쪼개서 free list(VTAILQ)에 넣고, 할당할때 free list에서 꺼내서 쓰는 방식입니다. 프로그램에서는 무엇이 메모리에 있고, 파일로 swap 할지 결정하지 않고 커널이 하도록 내버려둡니다.

메모리 할당은 workspace 단위로 하고 그 안에서 쪼개서 쓰는 거 같습니다. 이 부분은 좀더 분석이 필요할거 같습니다.

설정 파일은 c로 변경한 다음 저장하고, 직접 cc를 호출해서 오브젝트 파일을 생성하며, dlopen으로 로드하게 되어있습니다.  mgt_vcc.c의 mgt_CallCc 함수를 참고하세요. dlopen을 사용하기 위해서 컴파일러에 -fpic -shared 등의 옵션을 넘기게 되어있습니다.

Varnish의 개발자가 FreeBSD 커널 개발자 출신입니다. 지금도 개발하는지는 모르겠네요..Varnish는 정말 BSD커널 소스처럼 짜놨네요. BSD 커널 소스보면 데이타 구조가 대부분 queue.h로 되어있는데, 여기서도 VTAILQ 등으로 이름만 조금 바꿔서 사용하고 있습니다. queue.h는 여러가지 데이타 구조를 C 매크로만으로 구현한 헤더파일 라이브러리입니다. 구현할때 struct 안에 포인터가 내장되서 여러가지 방법으로 메모리 사용을 최적화할수 있습니다. 커널에서는 대부분 블럭단위로 메모리 할당하여, 그걸 쪼개서 free 리스트에 넣어놓고 그걸 꺼내써서 사용하는 방식으로 메모리를 관리합니다. 메모리 할당과 해제가 간단한 포인터 연산으로 끝나기 때문에 매우 효율적이고, 메모리 fragmentation도 많이 줄여줍니다. 메모리 할당과 해제가 자주 일어나는 경우 아주 큰 도움이 되죠.

2000년에 FreeBSD에서 방화벽 커널 모듈을 개발한 적이 있었는데, 메모리 관리를 queue.h와 “Redesigning the BSD Callout and Timer Facilities (1995)”를 참고해서 구현했었습니다. 퍼포먼스 최적화에 아주 큰 도움이 됐었습니다. Redesigning the BSD Callout… 논문을 어떻게 알게 되었는지는 기억은 안나지만, 정말 많은 도움을 받았던 논문이네요. 지금 찾아보니 첫번째 저자는 구글에 있고, 두번째 저자는 벤처 만들었다가 시스코에 인수됐다고 하네요. 지금은 UCSD 교수로 있네요. 이 논문에 대해서는 블로그에 글을 한번 정리해서 올리도록 노력하겠습니다.