2013년 2월 24일 일요일

AF NIKKOR 28mm 2.8D 분해조립

오래전에 AF NIKKOR 28mm 2.8D 단렌즈를 분해조립한 글을 쓴적이 있는데 디스크 정리하다가 찾아냈습니다.

혹시 참고자료가 필요하신 분이 있을까 싶어서 올립니다.

아래의 첨부파일을 받아가시기 바랍니다.
AF NIKKOR 28mm 2.8D 분해조립







2013년 2월 21일 목요일

Visual Studio 메시지 창에서 GCC(WinAVR) 컴파일 메시지 사용

ARM쪽 컴파일러나 AVR 컴파일러는 GCC(WinAVR)의 품질이 상당히 좋은데도 불구하고 일반사용자들은 일반 상용품을 쓰는 경우가 많은것 같습니다.

주변에서도 AVR을 쓸때 GCC를 쓰는것을 본적이 없을 뿐더러, 강요/권유를 해도 GCC로 옮겨 가지 않네요.
그러나 GCC는 상당히 품질이 높고, 정보가 많은데다가 대부분 MCU를 공통된 방식으로 지원하기 때문에 한번 익혀두면 여러가지로 쓸모가 있습니다.

프로그래머 입장에서 보면 에디터는 참으로 바꾸기 힘든 기본 도구임에는 틀림이 없습니다.

GCC는 아무래도 Eclipse와 같이 쓰시는 분이 많겠지만, 저는 오래전부터 GCC와 Visual Studio를 같이 썼습니다.
개발환경이나 에디터에 대한 의견에는 개인차가 있겠지만, Visual Studio의 IDE 환경이 상당히 우수하다고 생각합니다.

Visual Studio IDE환경의 Make 프로젝트를 통하면 GCC와 연계해서 사용하는것이 매우 쉽습니다.
(IDE 환경에 대한 논쟁을 하고 싶지는 않습니다.)

Visual Studio의 IDE 환경을 사용하면서의 문제는 GCC의 에러메시지가 VS IDE(이하 Visual Studio IDE)와 연계되는 방식이 아니라는 것입니다.

일반적인 GCC의 컴파일 에러메시지 포멧은 아래와 같습니다.

filename:line number: error message

하지만 VS IDE의 메시지 포멧은 다음과 같습니다.

full_path_and_filename(line number): error message

이렇게 다르기 때문에 GCC의 에러메시지가 VS IDE에서는 인식이 불가능해서, 컴파일러 메시지 창에서 더블클릭할때 해당 파일의 위치로 자동이동하지 않게됩니다.
이건 참 불편한 문제입니다.

저는 이 불편함을 그냥 어쩔수 없는것으로 받아들여왔지만 최근에 후배사원과 협업을 하면서, 이런 불편함을 개선하는 노력을 하지 않은것이 좀 미안했습니다.

구글링을 해보니 이런 문제에 대한 해결방법이 나와 있더군요.
지금 게시하는 내용은 해당 기사(원본)의 한글 의역판이 되겠습니다.

이것을 하는 방법을 정리하면 아래와 같습니다.

  1. VS IDE와 make 환경을 사용한다.
  2. filename을 full_path_and_filename로 바꾸기 위해 make 컴파일 규칙설정에 "$<" 대신에 "$(abspath $<)"를 써서 지정한다.
  3. stderr의 메시지를 파이프를 통해서 sed로 전달하기 위해서 "2>&1 | sed"를 쓴다.
  4. 파이프로 돌려진 텍스트 메시지를  sed로 변환하여 처리한다. 처리를 위한 sed 정규식 명령어는 's/\(\w\+\):\([0-9]\+\):/\1(\2):/' 이다.


이에 따라 변경된 make 파일의 컴파일 규칙 설정은 아래와 같습니다.
색을 칠한곳이 방법에 따라 변경된 부분입니다.

 # Compile: create object files from C source files.
$(OBJDIR)/%.o : %.c
$(CC) -c $(ALL_CFLAGS) $(abspath $<) -o $@ 2>&1 | sed -e 's/\(\w\+\):\([0-9]\+\):/\1(\2):/'

# Compile: create object files from C++ source files.
$(OBJDIR)/%.o : %.cpp
$(CC) -c $(ALL_CPPFLAGS) $(abspath $<) -o $@ 2>&1 | sed -e 's/\(\w\+\):\([0-9]\+\):/\1(\2):/'

그밖의 다른 종속성 지정도 비슷한 방식으로 하면됩니다.
위에서 맨 앞줄 $(CC)앞에는 공백이 아니라 1개의 탭문자로 해야 합니다.
그렇지 않으면 make가 작동하지 않습니다.

제 경우의 예를 보면 아래와 같은 컴파일러 메시지가


CSource/main-SRM.cpp: In function 'void Task1(void*)':
CSource/main-SRM.cpp:40: warning: unused variable 'Cnt'
./../Library/SHIFTREG.h: At global scope:
./../Library/SHIFTREG.h:28: warning: 'void SOREG_Shift(UINT08)' defined but not used
./../Library/SHIFTREG.h:47: warning: 'void SOREG_Set()' defined but not used
./../Library/SHIFTREG.h:82: warning: 'void LEDP_State(UINT08)' defined but not used


아래와 같은 형식으로 바뀌었습니다.


c:/Micro/AVR/Work/HS/CSource/main.cpp: In function 'void Task1(void*)':
c:/Micro/AVR/Work/HS/CSource/main.cpp(40): warning: unused variable 'Cnt'
./../Library/SHIFTREG.h: At global scope:
./../Library/SHIFTREG.h(28): warning: 'void SOREG_Shift(UINT08)' defined but not used
./../Library/SHIFTREG.h(47): warning: 'void SOREG_Set()' defined but not used
./../Library/SHIFTREG.h(82): warning: 'void LEDP_State(UINT08)' defined but not used


CS IDE에 나타난 메시지를 더블 클릭하면 해당파일이 열리면서 참조위치로 커서가 자동이동 합니다.

이와 관련한 추가 정보는 아래의 링크에서 확인하실 수 있으십니다.
http://aeroquad.com/showthread.php?2170-Using-Visual-Studio-as-IDE
http://utilitybase.com/article/show/2008/05/12/240/Cross+Compiling+for+OS4+or+OS3+using+MS+Visual+Studio+2005
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=367179
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=66984&highlight=


2013년 2월 19일 화요일

통화 자동 녹음 어플 Record My Call 설정

저는 오래전 부터 스마트 폰을 사용하게되면서 스마트폰에 자동녹음 기능을 사용하여왔습니다.
PocketPC(MS 계열)에서는 쓸만한게 많이 있었고 성능이나 기능도 만족스러웠습니다.

그런데 안드로이드로 오면서 그게 쉽지 않은일이 되었더라구요.
안드로이드의 본산지인 미국에서는 통화녹음에 대한 제한이 많습니다.
그래서 안드로이드에서 잘되는 어플을 찾기가 쉽지 않습니다.

Record My Call도 아주 딱 맘에 드는것은 아니지만 그래도 쓸만한 수준은 됩니다.
자동 통화 녹음 어플을 선택하면서 고려사항을 정리해보면

1. MP3를 지원하는것이 좋다.
   . 녹음된 통화를 정기적으로 다른곳으로 백업하는 경우에, 보관성이나 플레이어 호환성을 생각하면 MP3파일로 녹음파일이 만들어지는것이 좋습니다.
   . OGG나 MP4도 저장되어도 괜찮습니다.
   . Record My Call은 MP3와 MP4를 지원합니다.

2. 상대편 목소리가 커야 좋다.
   . 통화녹음을 하는 중요한 이유는 상대방이 말한 내용을 다시 듣기위해서 인데, 대부분 통화녹음 어플은 마이크로 피드백되는 수화음을 녹음하기 때문에 수화음량이 아주 작은것이 많습니다.
   . Record My Call은 "Phone Call"이라는 녹음모드를 선택할 수 있는데, 이렇게 하면 상대방의 목소리가 크게 들립니다. 오히려 자신의 송화음량이 상대적으로 더 작게느껴질 수도 있습니다.

3. 생성되는 파일이름에는 주소록의 연락처 이름이 넣어져야 한다.
   . 이것도 파일 보관성에 대한것인데 날짜/시간으로만 되어있는 저장파일은 누구와 통화했는지를 찾는데 별로 도움이 안됩니다.
   . 연락처의 이름으로 파일이름이 저장(연락처가 없을때는 수신번호로 저장)되면 통화내용 저장분류에 도움이 많이됩니다.

4. 전화기를 끄거나 켜는것에 무관하게 자동으로 서비스가 유지되는것이 있어야 한다.
   . 안드로이드 어플은 대개 안정성이 떨어지는것 같습니다. 그래서 그런지 자주죽죠.
   . 통화 녹음 어플은 안드로이드에서는 녹음기능으로는 기본적으로 제한된 기능의 시스템 자원을 강제로 획득해야하는 상황이 될것입니다.
   . 이에 대비해서 서비스가 죽더라도 다시 살아나는 기능이라든지, 시스템을 켜면서 항상 실행되는 기능이 되어 있으면, 통화를 놓치는 일이 적어집니다.
   . 이런일을 위해 루팅(Rooting)을 필요로하는 앱이 있는데, 이런앱을 쓸것인지는 사용자 선택입니다. Record My Call은 충분한정도의 서비스 복구기능이 있어서 사용하는데는 충분합니다.

5. 저장소를 외부 SD카드로 변경할수 있는것이 좋다.
   . 전화기에 많은 데이터를 쌓아두는것은 좋지 않습니다. 개인자료는 항상 신속히 회수 할수 있도록 해두는것이 좋습니다.
   . Record My Call은 외부 SD 카드로 저장소 변경을 할 수 있지만, 제가 해보니까 서비스가 자주 죽어서 기본상태로 복귀됩니다.

6. 통화내용의 전후에 잘림이 없어야 한다.
   . 수화 통화의 경우에 대개는 1초이내에 누구와 통화하는지를 알게됩니다. 변호만 남겨진 통화를 다시 들어보게되는 경우가 생기는데, 처음 1초의 내용이 잘리게 되면 통화 상대방이 누군지 알아내는데 힘들 수 가 있습니다.
   . 안드로이드 통화 녹음 어플은 전화기능과의 연계성이 떨어져서 통화요청시기와 통화개시 시기를 구분하여 신속히 받을 수가 없나봅니다. 그래서 딜레이를 적용하는 방식을 많이 사용하는데, 이게 적당한 시간을 설정하기가 힘들죠.


겔럭시 S2를 1년간 사용하면서 처음 사용한 통화녹은 어플은 토탈리콜(Total recall)이었는데 아이스크림샌드위치로 업그레이드하면서 루팅이 필요하게되어 이제는 사용하지 않습니다.
젤리빈으로 업그레이드 하면서 Record My Call을 쓰기 시작했는데 그렇저럭 쓸만합니다.

일단 플레이 스토어에서 Record My Call을 검색해서 어플을 찾습니다.


설치과정은 빠르게 끝납니다.


폰하단의 메뉴버튼을 누르면 "Dashboard"를 선택하면 아래와 같은 화면이 되는데, 각종설정을 바꿀 수 있습니다.


제가 사용하는 "Setting"메뉴의 설정 내용은 아래와 같습니다.




"Tricks"는 공식적이지 않은 기법이 사용되는 녹음설정에 대한 내용인듯 싶습니다.
여기서 중요한것은 겔럭시 S2에서는 "Audio Source"를 반드시 "Phone Call"로 하시라는겁니다.
이렇게 하지 않으면 수화 음량이 매우 작습니다.



"Renaming"메뉴에서는 저장 파일의 이름 패턴을 지정할 수 있습니다.


 "Filter"메뉴에서는 녹음대상 통화를 선택할 수 있습니다.