"엄마, 감기 걸리면 어느 병원에 가야 돼?"
"이비인후과에 가야지"
"이비인후과는 어디가 아플 때 가는 거야?"

이비인후과는 한자로 耳鼻咽喉科라고 쓴다. 말 그대로 귀(耳, 귀 이), 코(鼻, 코 비), 목구멍(咽喉, 인후)을 다루는 과(科)이다. 중국 사람에게는 아주 직관적이어서 어린이도 알아들을만한 이름인데 (중국어에서는 한 글자를 빼서 이비후과라고 한다) 우리말에서는 한자를 알아야만 이해할 수 있는 어려운 이름이다.

의학 용어가 이해하기 쉬운 말로 바뀌었으면 좋겠다. 이비인후과가 귀코목구멍과였다면 이름만 보고도 어디가 아플 때 가는 병원인지 바로 알 수 있을 것이다. 영어에서 이비인후과를 otorhinolaryngology 라는 어려운 단어 대신에 ear, nose and throat (ENT) 라고 부르고 있는 것을 볼 때 못 할 것도 없다. 그렇게 되면 위의 대화가 이렇게 바뀌지 않을까?

"엄마, 감기 걸리면 어느 병원에 가야 돼?"
"감기 걸리면 콧물 나고 목이 아프지?"
"응"
"그러면 귀코목구멍과 가야지."
"아, 그렇구나!"

제목은 거창하게 썼는데 사실은 나도 잘 모르면서 비전공자이니까 틀려도 창피하지 않다는 뻔뻔한 마음으로 쓴 글이다.

 

최근 한국 기독교계에서 "꽃들도" 라는 CCM이 인기를 끌고 있다. 이 노래의 원곡은 "花も(하나모)" 라는 일본 찬양인데, 멜로디만 들어보면 일본 드라마나 애니메이션의 배경 음악으로도 잘 어울릴 듯한 전형적인 일본 곡이다. 그런데 이 노래에는 매우 일본적이지 않은 부분이 있다. 바로 다음 가사이다.

 

꽃들도 구름도 바람도 넓은 바다도

(花も雲も風も大海も)

찬양하라 찬양하라 예수를

(奏でよ奏でよイエスを)

 

꽃, 구름, 바람, 넓은 바다 순으로 크기가 커지고 있다. 꽃보다는 구름이 크고 구름보다는 바람이 더 활동 범위가 넓다. 바람과 바다는 비교하기가 애매한데 그래서인지 굳이 "넓은" 바다라고 해서 바다가 더 크다는 것을 확실히 해 주었다. 이게 왜 특이하냐 하면 일본 문화는 이어령 씨의 명저 "축소지향의 일본인" 에서 볼 수 있듯 큰 것을 작게 만드는(응축하는) 문화이기 때문이다. 해당 책 초반부에 언급된 이시카와 다쿠보쿠(石川啄木)의 하이쿠를 보자.

 

동해의 작은 섬의 갯벌의 흰 모래밭에

(東海の小島の磯の白砂に)

내 눈물에 젖어 게와 노닐다

(われ泣きぬれて蟹とたはむる)

 

동해에서 작은 섬, 갯벌, 흰 모래밭, 게와 눈물 순으로 크기가 작아지는 것을 볼 수 있다. 이어령 씨는 이를 두고 "동해 바닷물은 결국 눈물 한 방울로 축소" 되었다고 표현하고 있다.

 

이를 염두에 두고 "꽃들도"의 가사를 보면 분명 이상하다. 전형적인 일본 노래라면 추측컨대 아마도 가사가 다음과 같이 되었어야 할 것이다. 불러보면 확실히 일본 정서가 더 잘 느껴진다.

 

바다도 바람도 구름도 작은 꽃들도

(海も風も雲も小花も)

 

그러면 왜 "꽃들도" 에서는 점점 커지는 방향으로 단어들이 배치되었을까? 노래나 시에는 그것을 쓴 사람의 사고방식 밑바탕에 깔린 사상이 당사자도 모르는 사이에 배어들어 있게 마련이다. (그래서 언어영역에 "작가가 이 시를 쓸 당시의 감정으로 옳은 것은?" 하는 문제가 나오면 시인 자신은 그 문제를 못 맞추는 것이다.) 이 노래는 찬양이니 기독교 사상에서 그 원인을 찾는 것이 바람직하다 하겠다.

 

이는 땅과 거기 충만한 것이 주의 것임이라 (고린도전서 10:26)

 

기독교는 채우는 종교이다. 그래서 성령 충만이라는 말은 있어도 성령 비움이라는 말은 없다. 묵상은 하나님의 말씀을 내 안에 채우는 작업이고 명상은 내 속을 비우는 작업이다. 그래서 기독교에는 묵상은 있어도 명상은 없다. 채우려면 꽃이 구름과 바람과 큰 바다가 되어야지 바다가 작은 꽃이 되어서는 안 된다. 그래서 "꽃들도"의 가사 순서가 저렇게 일본적이지 않은 순서가 되었을 것이라 추측해본다. 그러면 왜 마지막이 넓은 땅이 아니라 하필이면 넓은 바다여야 했을까. 다음 구절이 해답이 되어줄 수 있을 것 같다.

 

이는 물이 바다를 덮음 같이 여호와의 영광을 인정하는 것이 세상에 가득함이니라 (하박국 2:14)

 

'글쓰기 > 기독교' 카테고리의 다른 글

최소한 시신은 없었다  (0) 2020.05.17
겸손  (0) 2019.05.29
사상으로서의 기독교, 신앙으로서의 기독교  (0) 2019.01.02
수학으로 설명해본 기독교 교리 1 - 구원  (2) 2018.08.09

[코틀린] 물음표(?)의 기능


코틀린에서 변수형에 물음표가 붙어 있으면 그 변수의 값이 null이 될 수 있다는 뜻입니다. 반대로 물음표가 없다면 그 변수는 null이 될 수 없습니다. null이 될 있는 변수형을 nullable이라고 하고 null이 될 수 없는 변수형은 non-null 이라고 합니다. 다음은 간단한 예제입니다.


fun goodMorning(data: Intent?) // data가 null이어도 괜찮습니다.

fun goodAfternoon(data: Intent) // data가 null이면 안 됩니다.


[안드로이드] 화면 녹화하기


개발자 옵션에서 USB 디버깅이 활성화되어 있는 상태라면 adb를 사용해서 쉽게 안드로이드 화면을 녹화할 수 있습니다.


adb shell screenrecord /sdcard/file_name.mp4

// 녹화를 끝낼 때에는 Ctrl + C


이렇게 하면 저장소에 file_name.mp4 라는 이름으로 녹화 파일이 저장됩니다.


( 참조한 곳: https://mytalkhome.tistory.com/610 , https://www.androidpub.com/2579669 )

사상으로서의 기독교, 신앙으로서의 기독교


유튜브에서 꽤 유명한 기독교 강사가 있다고 해서 동영상을 찾아봤다. 보면서 이 사람은 기독교를 신앙이 아니라 사상으로 받아들였다는 생각을 지울 수가 없었다. 그러다가 결정적으로 "신앙인은 우울할 수 없습니다. 하나님을 믿는데 어떻게 기쁘지 않을 수가 있습니까?" 하는 소리를 듣고서 동영상을 꺼 버렸다. 저렇게 교조적으로 기독교를 받아들인 사람들은 주위에 있는 상처받은 사람들에게 위로가 아니라 더 큰 상처를 주게 된다.


성경의 주요 인물들도 슬픔과 절망에 빠진 적이 있었다. 다윗이 그랬다. "내가 아프고 심히 구부러졌으며 종일토록 슬픔 중에 다니나이다 (시38:6)" 바울도 그랬다. "형제들아 우리가 아시아에서 당한 환난을 너희가 모르기를 원하지 아니하노니 힘에 겹도록 심한 고난을 당하여 살 소망까지 끊어지고 (고후1:8)" 결정적으로 예수님도 그러셨다. "이에 말씀하시되 내 마음이 매우 고민하여 죽게 되었으니 너희는 여기 머물러 나와 함께 깨어 있으라 하시고 (마26:38)"


기독교를 사상으로, 교조적으로 받아들이면 저 유명한 유튜브 강사처럼 슬픔에 빠진 사람의 신앙을 무시하게 된다. 하지만 참된 기독교인은 슬퍼하는 사람과 함께 운다. "즐거워하는 자들과 함께 즐거워하고 우는 자들과 함께 울라 (롬12:15)"


그 유명 기독교 강사의 동영상이 여기저기 퍼지고, 그 강사가 방송에도 초대되는 걸 보면서 마음이 참 씁쓸하다.

'글쓰기 > 기독교' 카테고리의 다른 글

최소한 시신은 없었다  (0) 2020.05.17
겸손  (0) 2019.05.29
"꽃들도" 가사에 담긴 일본 기독교 사상 분석  (6) 2019.01.25
수학으로 설명해본 기독교 교리 1 - 구원  (2) 2018.08.09

[Git] 다른 브랜치와 합치지는 않되 특정 커밋은 가져오고 싶은 경우


여러 브랜치에서 작업을 하다가 공통된 코드에 변경이 있을 경우, 병합은 하지 않으면서 똑같은 커밋을 여러 브랜치에서 사용하고 싶을 때가 있습니다. 그럴 때에는 체리픽 (cherry-pick) 명령어를 사용하면 됩니다.


// 만약에 브랜치1에 있는 abcd1234라는 SHA-1 ID로 시작하는 커밋을 브랜치2에 적용시키려면


git checkout 브랜치2

git cherry-pick abcd1234


[토치 (Torch)] error: more than one operator "==" matches these operands

 

Lua 기반의 딥 러닝 프레임워크인 토치(Torch)를 빌드하다 보면 error: more than one operator "==" matches these operands 와 같은 에러 메시지가 뜰 때가 있습니다. 이 현상은 CUDA가 9.0 버전에서부터 절반 정확도의 부동 소수점 연산을 지원하면서 생기는 문제입니다. 이럴 때에는 빌드 전에 다음과 같이 환경 변수를 추가로 지정해주면 됩니다.

 

export TORCH_NVCC_FLAGS="-D__CUDA_NO_HALF_OPERATORS__"

 

이 글을 쓸 때에 https://github.com/torch/torch7/issues/1086 를 참조하였습니다.

[자바] 밑줄 (_) 이 들어가는 JNI 함수명


JNI에서는 함수명에 자바의 패키지 경로를 모두 쓰게 되는데, 그 때에 .(점)을 _(밑줄)로 치환하게 됩니다. 따라서 자바 함수명 자체에 밑줄이 있으면 문제가 생깁니다. 이런 경우 자바 함수명에 있는 밑줄은 JNI에서 _1로 치환하면 됩니다. 아래는 간단한 예제입니다.


// 자바

package com.tistory.crmn;

public class Hello {

    static native int get_hello();

}



// JNI

extern "C" JNIEXPORT jint JNICALL

Java_com_tistory_crmn_Hello_get_1hello(JNIEnv* env, jobject thiz) { // get_1hello에 주목하세요

    return (jint) 1;

}


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

전 국민 중 딱 한 명만 예방접종을 안 맞는다면 그 사람은 예방접종을 안 맞더라도 병에 걸리지 않는다. 다른 사람들이 다 접종을 받았기 때문에 그 사람에게 병을 옮길 사람이 없어서 그렇다. 해외 여행을 갔다가 병에 걸려 올 수는 있겠지만 그럴 확률은 낮다. 전국에서 두 사람만 예방접종을 안 맞더라도 마찬가지다. 남한 인구 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를 사용하는 데에는 큰 문제가 없을 것입니다.

+ Recent posts