기본 콘텐츠로 건너뛰기

2월, 2012의 게시물 표시

Windows에서 F1이 도움말로 작동하지 않도록 하기

Linux에서 파일변경 알아내기

파일 변경을 알아내는 방법은 여러가지가 있다. 그중에 제일 생각하기 쉬운게 루프를 돌면서 짧은 시간에 한 번 씩 계속 검사하는 것이다. ... while ( true ) { lstat("myfile", &stat); sleep(1); } ... 그러나 뭔가 아름답지가 않다. 매번 파일을 검사하는 것도 후루꾸레머 프로그래머 양심이 허락하지 않는다. 변경 했을 경우에만 이벤트가 날아왔으면 좋겠고, 그것을 받을 수 있는 방법에는 여러가지가 있다. D-Bus+HAL :  http://www.freedesktop.org/wiki/Software/dbus   http://www.freedesktop.org/wiki/Software/hal FAM :  http://oss.sgi.com/projects/fam/ inotify :  http://www.ibm.com/developerworks/kr/library/l-inotify/index.html?ca=drs- 방법도 많은데, D-Bus+HAL은 나중에 따로 포스팅 하겠다. FAM은 SGI에서 만든 라이브러리인데, OS와 상관 없이 동일한 API를 제공해준다는 점이 매우 매력적이긴 하지만, D-Bus+HAL을 더 많이 쓰니, 가벼운 마음으로 넘어가자. inotify는 리눅스에서만 제공하는 API로 dnotify 대체 버전이다. dnotify는 파일 변경 이벤트를 시그널로 받지만, inotify는 select/epoll 같은 멀티플렉서로부터 이벤트를 감지해낼 수 있다. 그외에도 히스토리나 장점은 위키백과( http://ko.wikipedia.org/wiki/Inotify )를 참조하자. 사실 inotify에 대해 자세히 서술하고 싶지만, 이미 IBM에서 더 이상 깔끔하게 설명할 수 없을 정도로 잘 써놓은 문서가 있어 굳이 다시 적지는 않겠다. 이 문서는 D-Bus+HAL에 대한 예고와 inotify라는 존재만 기록에 남기기 위한 것이다. (응?) 원본 위치: http:/

EXIF 태그 알아내기

쩝... 대학교 때 작은 프로젝트로 CMS - Contents Management System을 개발한 적이 있다. 그때 업로드한 파일 메타 정보를 읽어 적당히 Title, Date 등을 뽑아 내어 DB에 저장하고 목록형태로 보여주는 (보기에는) 간단한 프로젝트였다. 당시 제일 힘들었던 것은 PDF와 Word 파일 메타정보 분석이었다. 남자라면 프로그래머라면 파일 포맷을 분석하여 그것에 맞게 메타데이터를 뽑아내는 라이브러리를 만들어 사용해야 직성이 풀리지만, 시간도 촉박하고 OS코드 마냥 복잡한 파일 포맷 덕분에 그냥 유틸리티를 파이프로 콜해서 사용했었다. 각설하고, EXIF는 디지탈 카메라에서 파일교환을 목적으로 만들어진 메타정보를 저장하는 파일포맷이랄까... 뭐 간단히 말해 사진이 찍힐 당시 시간, 노출 등을 기록한 메타정보이다. 이 역시 확장가능하고 이러저러한 이유 덕분에 파일을 해석하기 귀찮을 정도로 살짝 복잡하다. 이럴 때는 역시나 미리 잘 만들어진 라이브러리 같은 게 있으면 정말 좋으련만...하고 찾아봤는데, 당연히 있다. libexif가 바로 그것이다. 공식 홈페이지: http://libexif.sf.net - LGPL 2.1 적당히 들여다보면 파일 포맷 마냥 뭔가 너무 많은데, 역시 이해하기에는 예제만한게 없지. 간단히 찍은 날짜를 살펴보자. #include <libexif/exif-data.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { ExifDate* ed = NULL; ExifEntry* ee = NULL; char buf[1024]; // 파일로부터 EXIF 읽어오기 if ( NULL == ( ed = exif_data_new_from_file(argv[1]) ) ) { fprintf(stderr,"ERROR: no exif: %s\n", argv[1]); retur

MIME 알아내기

POSIX 시스템에는 file이라는 명령이 있고, 이것은 주어진 파일을 가지고 타입을 알아낸다. 별다른 것은 없고, 타입마다 헤더나 테일에 매직필드를 미리 알고 있고, 이것을 파일에 대입해서 mime을 알아내는 것이다. 이미 libmagic이라는 API가 존재하며 사용법은 매우 간단하다. #include <magic.h> #include <stdio.h> int main(int argc, char* argv[]) { // 초기화 magic_t mt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR|MAGIC_MIME); // DB 읽기 magic_load(mt, NULL); // 파일 검사 printf("%s\n", magic_file(mt, "SOD_AOI_SORA.AVI"); // 종료 magic_close(mt); } 중간에 이상한게 보인다면 착각이다. magic_open으로 적당히 핸들 얻고, magic_load로 DB를 로딩한 뒤부터 magic_file로 mime 문자열을 알아낸다. 물론 magic_file은 여러번 사용할 수 있다. * 컴파일 할 때, 반드시 -lmagic 을 붙여 라이브러리 링크를 하도록 하자. * 패키지 이름은 레드햇은 file-devel, 우분투는 libmagic-dev이다. 원본 위치: http://purewell.egloos.com/5082878

Windows 7 동일 업데이트를 계속 할 경우?

며칠 전부터 Windows 7 64bit를 설치한 PC에서 KB2656351 업데이트를 계속 하고 있다. 뭔가 시스템 보안 업데이트라던데 하지 않을 수 없는 노릇이지만, 매일 PC를 끌 때마다 업데이트 설치하고, 다음날 PC를 켤 때마다 새로운 업데이트가 있다고 동일 업데이트를 알려주니 미칠 노릇이다. 처음에는 이번에 적용한 그룹웨어에 문제라고 생각했는데, 그게 아닌 것 같다. 구글에 찾아보니 .NET Framework 4 쪽 문제인 것 같다고 한다. 참조: http://answers.microsoft.com/ko-kr/windows/forum/windows_7-windows_update/net-framework-4%EC%9A%A9-%EB%B3%B4%EC%95%88/f7ee467a-40e1-44af-8d4f-972cdadc2feb 해결 방법은 .NET Framework 4를 모두 제거(Extend언어팩->Extend->ClientProfile언어팩->ClientProfile 순으로 제거)하고, 업데이트를 하면 잘 넘어간다. 업데이트가 끝나면 바로 .NET Framework 4 Client Profile 설치하겠다고 업데이트가 뜨긴 하지만, 일단 이것으로 해결한 것 같다. 원본 위치: http://purewell.egloos.com/5080947

욕실 묵은 때

일 주일에 한 번씩 욕실 청소를 꼬박꼬박 하면서 느낀 점은 단순히 락스만 가지고는 묵은 때를 씻어내기 어렵다는 점이다. 욕조에서 샤워를 하고 오일도 바르다 보면 일주일 동안 욕조 모서리에 갈색으로 묵은 때가 자리잡기 시작한다. 그 때가 절정에 달했을 일요일 오후에 신나게 욕실 청소를 하고, 가장 깨끗할 때 바로 샤워를 하고 일요일 오후를 즐기곤 한다. 락스 맹신자라 자주 쓰던 세제 대신 락스를 희석해서 청소를 해봤지만, 힘 주어 솔로 밀고 또 밀어도 때가 살짝 긁히기만 할 뿐 씻겨지지 않았다. 일주일 동안 찜찜하게 욕실을 쓰고 - 다시 하기엔 기진맥진해서, 오늘 비로소 락스와 세제가 함께 섞인 것으로 청소를 해봤다. ㅠㅠ 오뉴월 눈 녹 듯 녹는게 아닌가! 곰곰히 생각해봤는데, 그럴만도 하더군. 락스는 독극물에 가까울 정도로 독하지만,  결국 염소를 이용해 강제로 산화시켜 소독이나 탈색 하는 것이 주 업무(?)이다. 곰팡이가 슬거나 했을 때, 락스를 통해 강제로 곰팡균을 산화시켜 죽이고, 탈색시키는 것에는 락스만한게 없다. (그것마저 없던 시절, 염산을 쓰던 때가 있었지) 그러나 락스는 지방이나 단백질로 이뤄진 묵은 때에는 잘 반응하지 않는다. 그들은 화학적으로 안정적인 상태라서 그런 것 같다. (가물가물 하네) 이런 것에 필요한 것이 계면활성제이다. 보통 비누, 세제에 많이 쓰이는 것으로, 물에 잘 녹는 부분과 기름에 잘 녹는 부분으로 이뤄진 물질이다. 이러한 성질을 이용해 묵은 때를 물에 녹여내는 것이다. ㅡ_-)/ 결론은 "그냥 쓰던 것 잘 쓰자~" 정도? ㅋㅋㅋㅋㅋㅋㅋㅋ 원본 위치: http://purewell.egloos.com/5080704

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)