전염병이 하나 있다고 하자. 당연한 이야기이지만 전 국민이 모두 예방접종을 맞으면 아무도 그 병에 걸리지 않는다. 복잡한 일은 전 국민 중 일부가 예방접종을 안 맞을 때에 일어난다.

전 국민 중 딱 한 명만 예방접종을 안 맞는다면 그 사람은 예방접종을 안 맞더라도 병에 걸리지 않는다. 다른 사람들이 다 접종을 받았기 때문에 그 사람에게 병을 옮길 사람이 없어서 그렇다. 해외 여행을 갔다가 병에 걸려 올 수는 있겠지만 그럴 확률은 낮다. 전국에서 두 사람만 예방접종을 안 맞더라도 마찬가지다. 남한 인구 5천만 중에서 자기 빼고 예방접종을 안 맞은 다른 한 사람을 마침 그 사람이 병에 걸렸을 때에 만나서 병을 옮아 올 확률은 0에 가깝다.

이렇게 예방접종을 안 맞아도 병에 안 걸리는 사람이 하나 둘 늘어가면 예방접종은 제약회사가 돈을 벌기 위해 만들어낸 개념이라는 음모론이 돌기 시작한다. "누구네 집 애는 예방접종 안 맞았는데도 건강하게 잘만 살더라" 하는 카더라 통신도 함께다. 곧 그런 사람들이 인터넷에 카페를 만들고 무슨 병에는 숯가루를 탄 물이 좋다는 등의 괴소문을 퍼뜨리기 시작한다. 주위에서 그러지 말라고 말리면 자기들이 진리 때문에 핍박을 받는 줄로 생각한다. 이쯤 되면 종교의 영역이다. 이런 집단에는 숯가루 먹고서 병이 나았다는 사람들이 의외로 많이 보이는데 그건 숯가루 먹고 병이 심해진 사람들이 그 카페를 탈퇴해서 그렇다.

자기들끼리만 병에 걸리면 그러든지 말든지라고 할 수도 있겠지만 문제는 이런 사람들이 많아지면 그 자녀들이 피해를 본다는 점에 있다. 전반적인 공중 보건에 악영향을 끼치는 건 말할 것도 없다. 2005년 부터 필수가 된 수두 예방접종을 아직도 안 맞히고, 수두 걸린 아이를 집으로 초대해서 자기 아이에게 수두를 옮기게 하는 어리석은 부모들이 아직도 있다. 애를 때리는 것만이 아동 학대가 아니다. 이런 게 바로 아동 학대다. 그런 부모들이 지금이라도 정신을 차렸으면 좋겠다. 그래서 어릴 때 수두에 걸렸던 자식들이 커서 대상포진으로 고생할 때에는 적어도 따뜻한 물에 숯가루를 타서 마시면 바로 낫는다는 류의 소리 대신 빨리 병원에 가 보라는 말을 하게 되었으면 좋겠다.

[안드로이드] CMakeLists.txt 파일 설명


안드로이드에서 JNI를 통해 C나 C++ 코드를 사용하려면 CMake나 ndk-build중 하나를 사용해야 합니다. 이 글에서는 CMakeList.txt에 사용되는 여러 옵션에 대해 알아보겠습니다.


1. 사용할 CMake의 최소 버전 설정


cmake_minimum_required(VERSION 3.4.1)



2. 안드로이드에서 사용할 라이브러리의 이름과 공유 및 정적 여부, 소스 코드 경로 설정


아래 예제의 경우 라이브러리의 이름은 native-lib이고 공유 라이브러리이며 소스 코드 경로는 src/main/cpp/native-lib.cpp 입니다. 참고로 이렇게 컴파일을 하면 CMake는 컴파일 결과물을 libnative-lib.so 라는 이름으로 저장합니다.


add_library( native-lib

             SHARED

             src/main/cpp/native-lib.cpp )



3. 소스 코드에서 사용하는 헤더 파일이 들어있는 디렉토리 설정


설정해주지 않아도 동기화 이후에는 자동으로 헤더 파일이 인식되기는 합니다만, 설정해주면 컴파일 단계에서부터 연결된 헤더 파일을 볼 수 있습니다.


include_directories(src/main/cpp/include/)



4. 이미 존재하는 안드로이드 NDK 기본 라이브러리 사용하기


find_library()와 target_link_libraries()를 사용하면 안드로이드 NDK에서 기본으로 제공하는 라이브러리를 따로 컴파일할 필요 없이 바로 사용할 수 있습니다. 아래 예제는 NDK에 있는 log라는 라이브러리를 찾아서 log-lib이라는 변수명으로 저장한 뒤에 native-lib에서 불러와서 사용하는 코드입니다. log-lib이 변수명이기 때문에 target_link_libraries() 에서는 ${log-lib} 으로 표기됩니다.


find_library( log-lib

              log )

target_link_libraries( native-lib

                       ${log-lib} )



5. 소스 코드 형태로 존재하는 안드로이드 NDK 기본 라이브러리 사용하기


4번 경우와 유사한데 이 경우는 안드로이드 NDK 기본 라이브러리가 컴파일되지는 않고 소스 코드 형태로 존재한다는 점이 다릅니다. 사용법은 3번과 4번을 합친 형태입니다.


add_library( app-glue

             STATIC

             ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )


target_link_libraries( native-lib

                       app-glue

                       ${log-lib} )



6. 이미 컴파일 된 외부 라이브러리를 불러와서 사용하기 (매우 중요)


현업에서 안드로이드 개발을 하다 보면 다른 사람이 만든 라이브러리를 이미 컴파일 된 상태로 불러와서 사용해야 할 경우가 정말 많습니다. 이 경우는 add_library()와 set_target_properties()를 사용해야 합니다. add_library()에서는 이 라이브러리가 이미 컴파일 된 상태라는 것을 알려주기 위해 IMPORTED를 사용하고, set_target_properties()에서는 컴파일 된 파일의 경로를 지정해줍니다. 여러가지 CPU 구조를 지원하려면 ANDROID_ABI 변수를 사용하면 됩니다. 컴파일 단계에서 헤더 파일 정보를 보려면 include_directories()를 사용하면 되고, 외부 라이브러리를 불러온 뒤에는 target_link_libraries()를 사용해서 원하는 라이브러리에 연동시키면 됩니다.


아래는 libimported-lib.so 파일을 불러와서 imported-lib 이라는 변수에 저장한 뒤에 native-lib에서 imported-lib을 다른 라이브러리와 함께 사용하는 예제입니다. PROPERTIES IMPORTED_LOCATION는 IMPORTED_LOCATION이라는 값을 정해주겠다는 이야기입니다.


add_library( imported-lib

             SHARED

             IMPORTED )


set_target_properties( imported-lib

                       PROPERTIES IMPORTED_LOCATION

                       imported-lib/src/${ANDROID_ABI}/libimported-lib.so )


include_directories( imported-lib/include/ )


target_link_libraries( native-lib imported-lib app-glue ${log-lib} )



이 정도면 안드로이드에서 일반적으로 CMake를 사용하는 데에는 큰 문제가 없을 것입니다.

대학교 기숙사 주위에는 고양이가 많았다. 그 고양이들을 학교 학생들은 학교 이름을 따서 xx캣이라고 불렀다. 고양이들의 주식은 학생들이 먹고 남긴 배달 음식이었다. 기숙사에 사는 학생들은 종종 치킨, 피자, 족발, 두루치기 등의 다양한 음식을 시켜 먹곤 했다. 학생들이 하도 배달 음식을 많이 시켜먹으니 학교에서 아예 기숙사 건물 입구에 그릇 반납용 선반을 설치해 주었는데, 학생들이 그 곳에 배달 음식 그릇을 가져다 놓고 가면 고양이들이 슬금슬금 다가와서 잔반을 먹곤 했다.

어느 해 겨울이었다. 겨울학기 수업은 듣는 학생이 적어서 학교가 휑했다. 학교가 있던 곳은 평소에 눈이 거의 안 오는 지역이었는데 그 날 따라 눈이 엄청나게 왔었다. 쌓인 눈을 밟으며 밤에 기숙사로 돌아가는데 기숙사 입구에 고양이 두 마리가 있는 것이 보였다. 학교 고양이들은 학생들을 보면 멀찌감치서부터 도망가곤 했는데 얘네들은 희한하게도 나를 보고도 가만히 있었다. 기숙사 입구에 다 가서 보니 고양이들이 비어있는 배달음식 퇴식구를 바라보고 있었다. 겨울방학이라 학생들이 다 집에 가고 나니 잔반이 주식인 고양이들이 먹을 게 없어진 것이었다. 게다가 눈이 와서 추워서 그랬는지 그 고양이들은 눈이 쌓이지 않은 기숙사 처마 밑에서 움직이지 않고 있었다. 못 먹어서 그랬는지 학기중과 비교하면 매우 홀쭉해진 모습이었다.

카드키를 찍고 기숙사로 들어가려는데 자꾸 고양이들이 마음에 걸렸다. 그래도 나랑은 상관없는 일이지 하며 계단을 올라가려는데 발이 안 떨어졌다. 고민을 하다가 학교 매점에 가서 천하장사 소시지를 샀다. 매점까지 갔다 오는 데 시간이 꽤 걸렸는데도 고양이들은 기숙사 입구에 그대로 있었다. 천하장사를 까서 조금 잘라서 던져줬더니 허겁지겁 먹었다. 한 조각 또 던져줬더니 여전히 잘 먹었다. 이번에는 천하장사를 길게 까서 손에 잡고 내밀어 봤더니 가까이 와서 순식간에 다 먹어버렸다. 원래는 고양이에게 천하장사를 하나만 주고 나머지는 내가 먹으려고 했는데 어쩔 수 없이 더 줘야 했다. 두 개째가 지나고 세 개째가 되자 배가 불렀는지 잘 안 받아먹길래 나중에 먹으라고 남은 천하장사를 다 던져주고 방으로 올라갔다. 지금까지 살면서 처음이자 마지막으로 야생 고양이에게 음식을 줘 본 경험이다.

주인 없는 야생 고양이를 일컫는 표준어는 도둑고양이다. 애묘인들 중에는 도둑고양이 대신 길고양이라는 말을 써야 한다고 주장하는 사람들도 있지만 나는 도둑고양이라는 말이 싫지 않다. 꿈보다 해몽이라고, 고양이들은 귀여워서 사람들의 마음을 훔쳐가기 때문에 도둑고양이라고 해석하면 되지 않을까. 그리고 따지고 보면 이 녀석들은 내가 먹으려던 천하장사까지 자기들이 다 먹어버렸으니 도둑이 맞다.

옛날 사진을 뒤져보니 그 때 찍은 사진이 아직 남아 있다. 흰 색 바탕에 검은 색 얼룩 무늬가 있던 고양이. 고양이들 평균 수명을 생각해보면 아마 지금은 이 세상에 없을 거다. 인터넷에 보면 고양이한테 잘 해 줬더니 고양이가 쥐나 벌레를 선물로 잡아왔다는 이야기도 많던데 저 고양이들은 내 천하장사를 다 먹어 놓고는 고맙다는 말 한 마디 없이 입을 싹 닦아 버렸다. 그래도 이렇게 10년 가까이 지난 지금 웃으며 옛날을 추억하게 해 줬으니 이 녀석들은 이미 나한테 천하장사보다 훨씬 큰 보답을 해 준 셈이다.

+ Recent posts