1. 오일러 상수: 감마

초등학교 시절에 반비례 함수라고 배웠던 1/x는 조화급수를 나타내며, 궤적은 쌍곡선이고 부정적분은 ln x (+C)가 되는 꽤 독특한 함수이다.
그런데 1/x의 값을 1 간격으로 n까지 구한 조화수열의 합과(즉, 1 간격의 구분구적법), 아예 해당 함수의 정적분(실제 면적)은.. 일단 명목상으로 값이 비슷할 것 같은데 정확하게 얼마나 차이가 날까? n이 무한대로 근접할수록 값이 어떻게 될까?

먼저, 이런 발상이 왜 나왔겠는지부터 생각을 해 보자.
1/x라는 문제의 함수는 x가 무한대로 갈 때 함수값 자체는 0으로 수렴하여 한없이 줄어들지만, 급수의 무한합 내지 정적분은 무한대로 발산한다는 아주 기괴한 특징이 있다. 보통은 다 발산하거나 다 수렴하지, 저렇게 되는 건 몹시 드물다.

1/x 말고 그냥 x라든가 1/x^2 같은 주변의 다른 함수에 대해서  급수의 무한합과 정적분의 차이를 구해 보면 구하는 게 무의미한 trivial한 결론이 나와 버린다. 그냥 무한대로 빠지거나, 아니면 한쪽이 그냥 0이 돼 버려서 차를 구할 필요가 없어지는 식이다.

하지만 1/x는 그렇게 trivial하게 빠지지 않는다. 더구나 무한급수와 정적분의 차이가 “무한대 - 무한대” 꼴의 극한이 되는지라, 극한값이 유한하게 나온다는 게 직관적으로 보장도 되지 않는다. 그러니 이 극한값은 수학적으로 파고들 명분과 의미가 있으며, 옛날 천재 수학자의 관심을 끌게 되었다.

일단 1/x에 대해서 무한합과 정적분의 차이가 특정값으로 수렴한다는 것 자체가 증명되었으며, 그 값은 대략 0.577215… 형태로 빠진다. 이 수는 관례적으로 오일러-마스케로니 상수라고 불린다.

자연상수 e야 미적분과 밀접한 관계가 있으니 중등교육 수준에서도 이과의 최종 테크 한정으로 배운다. 하지만 저 상수는 쓰이는 곳이 너무 난해한지라, 수학과에서 해석학을 전문적으로 배우는 정도가 아니라면 딱히 접할 일이 없다.

더구나 쟤는 특성이 밝혀진 것도 별로 없다. 사칙, 삼각함수, 지수, 로그만으로는 저 수를 나타낼 수 없다. 그러니 정황상 초월수 무리수인 것이 99.999% 확실해 보이긴 하지만.. 수학자들이 수긍할 수 있는 완벽 엄밀한 논리 전개만 동원해서는 초월수는커녕 무리수인지도 정확하게 증명이 못 돼 있다고 한다. 의외의 일이다.

다만, 이 수는 e^(-x) * ln(x)라는.. 비교적 친근한(?) 초등함수 조합을 0부터 무한대까지 이상적분을 해서 얻을 수 있다(음수 버전이 나옴). 친근해 봤자 쟤는 이미 부정적분은 초등함수 형태로 나타낼 수 없는 수준이지만 말이다.

그리고 이 수는 팩토리얼의 대수적 확장 버전인 감마 함수와도 관계가 있다. GAMMA(x)-1/x라는 함수에서 x=0의 극한값이 이 수의 음수 부호 형태이다. 신기하지 않은가? 그래서 이 오일러 상수는 그리스 문자 ‘감마’(γ)를 써서 표기하곤 한다. 상수는 소문자 감마이고 함수는 대문자 감마이다.
이 글의 전체 내용을 수식으로 요약하면 다음과 같다.

사용자 삽입 이미지

2. 오메가 상수와 람베르트 함수

고등학교 수학에서는 지수와 로그를 다루고, 이과 및 자연계에서는 이에 대한 미· 적분까지도 다룬다.
그럼 다음으로 지수함수 e^x에다가 x를 또 곱한 x*e^x라는 함수를 생각해 보자. 취급하기가 약간 더 복잡해졌지만.. 그래도 얘는 부분적분을 통해 부정적분을 온전한 형태로 구할 수는 있다.

그런데 x*e^x = 1 이라는 방정식의 근을 구할 수 있을까? (뭔가 오일러의 항등식과 살짝 비슷하게 생겼는데.. 그냥 기분 탓임..)
양변에 로그를 씌워서 식을 정리하면 x= -ln x까지는 나온다. 하지만 이 이상 식을 정리하는 건 무리이고, 이 시점에서 발상을 전환하여 뭔가 새로운 개념이나 용어를 창조해야 할 것 같다. 그리고 그걸 1700년대에 이미 실제로 한 사람이 있다.

일단 저 식을 실수 범위에서 만족하는 근 x는 대략 0.567143…으로 전개되는 값이다. 앞서 다뤘던 오일러 상수와 얼추 비슷한 크기라는 게 흥미롭다. 물론 특성과 의미는 전혀 다르지만 말이다. 더 나아가 x에 대해 t*e^t = x를 만족하는 t를 되돌리는 함수가 바로 고안자의 이름을 딴 “람베르트 W” 함수이다.

고안자인 요한 하인리히 람베르트는 수학, 물리, 천문학, 철학 등 다방면에서 가히 레오나르도 다 빈치 급으로 불세출의 천재였다고 전해진다. 오일러와도 같은 국적의 동시대 사람이었으나.. 좁은 세상에 태양이 둘일 수는 없어서 그런지 람베르트는 오일러보다야 인지도가 낮다.

오일러 상수에 그리스 문자 ‘감마’가 부여되어 있다면, 앞서 언급한 W(1)에는 관례적으로 그리스 문자 ‘오메가’가 부여되어 있다. 오메가가 w와 비슷하게 생겨서 두 문자가 저렇게 섞여 쓰이는 것 같다.
W(1)은 오일러 상수보다는 분석하기가 아무래도 더 용이한지, 초월수라는 것은 간편하게 증명되어 있다.

하지만 W라는 함수도 기존 초등함수의 형태로 나타낼 수 없으며 절대로 만만한 물건이 아니다. 그럼 정체를 알기 위해 만년 수치해석 근사값에만 의지해야 하느냐 하면.. 그렇지는 않다. 해석학적인 의미를 지닌 형태로 나타낼 수는 있는데, 그게 감마 함수가 들어간 무한급수이다. 이 역시 공대 수준의 숫자 공부만 한 사람이라면 그냥 포기하는 게 속 편할 것 같다..;;

하지만 이런 물건이 왜 존재하느냐 하면.. 그게 존재함으로써 더 복잡한 문제를 풀 수 있고 다른 복잡한 개념을 간결하게 표현할 수 있기 때문이다.
x*a^x뿐만 아니라 아예 x^x=b 같은 방정식의 근도 Lambert 함수 형태로 표현 가능하다.

단적인 예로 x^x = e의 근은.. 저 오메가 상수의 역수.. 1/W(1), 대략 1.763222…이다. e에다가 단순 가공을 한 게 아닌, 뭔가 차원이 다른 수가 튀어나온 셈이다. x^x 정도면 적분도, 방정식 근도 모두 통상적인 방법으로는 못 구하는 난감한 물건이니 말이다.
어쩐지 뭔가 메이플 같은 수학 패키지로 지수함수가 섞인 복잡한 방정식 풀이를 시켜 보면.. LambertW 이러는 식으로 답이 나오곤 하던데 그게 저런 뜻이었다.

Lambert 함수는 양의 실수에서는 ln x보다도 더욱 느리게 증가하는 별볼일 없는 함수이다. 하지만 수학 전공자들은 이런 함수를 실수도 모자라서 복소수 영역에서 갖고 논다. 도함수나 부정적분을 구하면 이 함수 자체가 포함된 더 복잡한 형태가 나오는 게 지수/로그함수 계열과 비슷해 보인다.

얘는 음수 -1/e부터 0 사이에서는 마치 제곱근처럼 값이 2개가 나온다는 특징이 있다.
비록 중등 교육과정에서 가르치지는 않지만.. 해석적으로 분석을 못 하는 것도 아닌데, 관점에 따라서는 얘도 초등함수의 범주에 넣을 수 있어 보인다.

사용자 삽입 이미지

참고로 람베르트 함수 말고 삼각함수 중에도..
우리가 0 극한값을 배울 때 써먹었던 sin(x)/x처럼.. 하필 sin(x), cos(x), sinh(x), cosh(x)를 x로 나눈 물건의 정적분 함수를 따로 Si(x), Ci(x), Shi(x), Chi(x) 요렇게 표기한다. 기존 초등함수들의 조합으로 나타낼 수 없는 새로운 특성을 갖지만 그래도 수학적으로 다른 의미가 있기 때문이다.

저렇게 써 놓으니 무슨 한어병음 표기처럼 보인다만=_=;; 어쨌든 저런 건 초월함수들 중에서 적분함수라고 따로 불린다.

Posted by 사무엘

2020/07/09 08:35 2020/07/09 08:35
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1771

1. 그레이스케일

이건 이미지를 흑백 형태로 바꾸는 것이 핵심이다. 색을 구성하는 정보량의 차원이 줄어들고(3차원 → 1차원으로) 결과적으로 전체 색깔수가 줄어들기는 하지만(수천~수십만 종류의 색상 → 256단계의 회색), 그래도 아예 B&W 단색으로 바꾸는 건 아니다.
각 픽셀들은 색상과 채도가 제거되고 명도만 남아서 흑부터 백 사이에 다양한 명도의 회색으로 기계적으로 바뀐다. 같은 색의 픽셀이 인접 픽셀이 무엇이냐에 따라서 다르게 바뀐다거나 하지는 않는다.

그런데 그레이스케일 공식이 딱 하나만 존재하는 게 아니다. RGB 세 성분의 산술평균을 주면 될 것 같지만, 그렇게 그레이스케일을 하면 그림이 굉장히 칙칙하고 탁하게 보이게 된다.

똑같이 최대값 255를 주더라도 빨강(255,0,0), 초록(0,255,0), 파랑(0,0,255) 각 색별로 사람이 인지하는 명도는 서로 일치하지 않는다. VGA 16색 팔레트를 다뤄 본 사람이라면, 밝은 빨강이나 밝은 파랑을 바탕으로는 흰 글자가 어울리지만, 밝은 초록은 그 자체가 너무 밝아서 흰 글자가 어울리지 않는다는 것을 알 것이다.

사용자 삽입 이미지

그러니 공평하게 33, 33, 33씩 가중치를 주는 게 아니라 거의 30, 60, 10에 가깝게.. 초록에 가중치를 제일 많이 부여하고 파랑에는 가중치를 아주 짜게 주는 것이 자연스럽다고 한다.

이런 공식은 누가 언제 고안했으며 무슨 물리 상수처럼 측정 가능한 과학적인 근거가 있는지 궁금하다. 옛날에 흑백 사진을 찍으면 색깔이 딱 저 공식에 근거한 밝기의 grayscale로 바뀌었던가?
본인은 저 그레이스케일 공식을 태어나서 처음으로 접한 곳이 아마 QBasic 내지 QuickBasic의 컬러/팔레트 관련 명령어의 도움말이었지 싶다.

2. 디더링

이건 그레이스케일과 달리, 색깔수를 확 줄이는 것이 핵심이다. 그 대신 반드시 단색 흑백이어야 할 필요가 없다. 가령, 트루컬러를 16색으로 줄이는 것이라면 RGB 원색이 살아 있는 컬러라 할지라도 디더링의 범주에 든다. 이런 것처럼 말이다.

사용자 삽입 이미지

디더링에서는 어떤 원색을 직통으로 표현할 수 없을 때 근처의 비슷한 여러 색들을 고르게 흩뿌려서 원색과 비슷한 색감을 나타낸다. 팔레트까지 임의로 지정이 가능하다면 256색 정도만 돼도 생각보다 그럴싸하게 원래 이미지를 재현할 수 있다. 그런 게 아니라 그냥 흑백 단색 디더링이라면 아까 그레이스케일처럼 어떤 공식에 근거해서 명도를 추출할지를 먼저 결정해야 할 것이다.

0부터 1까지 가중치별로 점을 골고루 균등하게 뿌리는 공식은 이미 다 만들어져 있다. 이건 Ordered dither이라고 불리며, 보통 8*8 크기의 64단계 격자가 쓰이는 편이다. 그 구체적인 방식에 대해서는 수 년 전에 이 블로그에서 이미 다룬 적이 있다.

그레이스케일은 RGB(0.4,0.2,0.6)라는 색을 0.3이라는 명도로 바꾸는 것에 해당하는 기술이고, 단색 디더링은 이 색이 0.3, 0.3, 0.3 … 이렇게 쭉 이어지는 것을 1, 0, 0, 1, 0, 0 이런 식으로 이산적으로 표현하는 것과 같다.
그런데 원색을 기계적으로 이런 격자로 치환하기만 하면 보기가 생각보다 굉장히 좋지 않다.

원래 0.3을 표현해야 하는데 지금 지점에서 부득이하게 1을 찍어 버렸다면 0.7이라는 오차의 여파를 인접 픽셀에다가 떠넘겨서 거기서 계속해서 감당하게 해야 한다. 즉, 그레이스케일은 그냥 인접 픽셀을 신경 쓰지 않고 픽셀 대 픽셀 변환만 했지만 디더링은 그렇지 않다. ordered dither 내지 더 단순무식한 nearest color 찍기 신공이 아니라면.. 이전 픽셀에서 발생한 오차를 수습하는 error diffusion을 동원해야 부드러운 결과물이 나온다.

사용자 삽입 이미지

그런 지능적인(?) 디더링 알고리즘은 196~70년대에 컴퓨터그래픽이라는 분야가 등장한 초창기부터 연구되어 왔으며, 고안자의 이름을 따서 Floyd-Steinberg, Burks, Stucki 같은 알고리즘이 있다. 이미지를 다루는 사람이라면 포토샵 같은 그래픽 편집 프로그램에서 저런 명칭들을 본 적이 있을 것이다.
이런 알고리즘들은 ordered dither와 달리, 점들이 일정 간격으로 산술· 기계적으로 단순 투박하게 찍힌 게 아니라 뭔가 한땀 한땀 손으로 입력된 것 같고 부드러운 느낌이 든다. 그리고 무엇보다 색깔이 크게 바뀌는 경계 영역이 훨씬 더 선명하다.

3. 하프톤 (망점)

그레이스케일이 색깔 표현에 제약이 없는 아날로그 영상물(특히 흑백 필름 사진) 같은 느낌이 나고, 디더링은 초기에 해상도와 색상이 부족했던 디지털 영상과 관계가 있다면.. 하프톤은 색상이 부족한 대신 해상도가 높은 '인쇄물'과 관계가 깊은 기법이다.

사용자 삽입 이미지

하프톤은.. 일정 간격으로 망점을 두두두둑.. 찍고, 그 망점의 크기/굵기만으로 명도를 조절한다. 깨알같은 점들의 양과 배치 방식을 고민하는 통상적인 디더링과는 문제 접근 방식이 약간 다르다.
출력물의 해상도가 영 시원찮은 데서 하프톤을 동원하면 망점이 너무 커서 눈에 거슬릴 수 있다. 회색을 만들려고 했는데 하양과 검정이 그대로 눈에 띄게 된다는 것이다.

그러나 아무 인쇄물에서나 흑백이든 컬러든 문자 말고 음영(색깔 배경)이나 사진을 하나 보시기 바란다. 전부 촘촘한 점들로 구성돼 있다.
컴퓨터용 프린터나 전문 출판물 인쇄기들이 무슨 수십~수백 종에 달하는 물감을 갖고 있지는 않다. 잉크는 3원색에다가 검정 이렇게 4개만 갖고 있고, 나머지 색은 전부 얘들을 적절한 배율로 섞은 망점의 조합만으로 표현한다.

컴퓨터에서 보는 사진 이미지를 프린터로 출력하기 위해서는 가산 혼합 기반인 RGB 방식의 색을 감산 혼합 CMYK 방식으로 변환하고, 색 축별 망점 배합을 계산해야 할 것이다. 이건 디더링과는 다른 영역이다. 프린터 드라이버가 하는 일 중의 하나가 이것이며, 전문적인 사진이나 출판 프로그램 역시 색 축별로 인쇄 형태의 저수준 데이터를 export하는 기능을 제공한다.

그래도 요즘은 사진조차 필름 현상이 아니라 디지털 카메라로 찍은 뒤에 포샵질을 하고 고급 인화지에다 '인쇄'해서 만들어 내는 세상이니.. 컬러 인쇄 기술도 예전보다 굉장히 많이 좋아지고 저렴해졌다. 1990년대까지만 해도 가정용으로 컬러 레이저 프린터라는 걸 생각이나 할 수 있었겠는가?

유니코드 문자 중에 U+2591 ~ U+2593은 단계별 음영을 나타낸다.
굴림· 바탕 같은 통상적인 Windows 글꼴은 이를 하프톤 형태로 표현한 반면, 함초롬바탕은 디더링 형태로 표현했음을 알 수 있다.
윤곽선 글꼴의 래스터라이즈 방식의 특성상 디더링보다는 하프톤이 부담이 덜하기도 하다. 윤곽선 글꼴은 뭔가 덩어리· 군더더기가 늘어날수록 출력 성능이 급격히 떨어지기 때문이다. 그래서 매끄러운 곡선 말고 오돌토돌, 쥐 파먹은 효과 같은 걸 표현한 글꼴은 크기도 크고 처리하기 버거운 편이다.

사용자 삽입 이미지

이상이다. 이 사이트에도 그레이스케일, ordered 디더링, 기타 휴리스틱-_- 디더링, 그리고 하프톤까지 다양한 사례가 소개되어 있으니 관심 있는 분은 참고하시기 바란다.

우리가 사는 공간이 3차원일 뿐만 아니라, 시각 정보의 기본 단위인 색깔이라는 것도 어떤 방식으로 분류하든지 결국 3개의 독립된 축으로 귀착된다는 게 신기하지 않은가? 신학에서는 이게 하나님의 속성인 삼위일체와 관계가 있다고도 말하는데, 그건 뭐 결과론적인 해석이며 물증이라기보다는 심증 수준에서 만족해야 하지 싶다.

음악에서는 음계, 음정, 화성학 같은 이론이 수학과 연결되어 오래 전부터 연구돼 왔다.
그럼 일명 color theory라고 불리는 분야는 언제부터 누구에 의해 연구돼 왔을까? RGB, CMY, HSL 사이를 변환하는 공식 같은 것 말이다. 더디링은 컴퓨터그래픽 영역이겠지만 순수하게 색에 대한 수학적인 분석은 미술과 전산학 어디에도 딱 떨어지지 않아 보인다. 내가 알기로는 전파로 영상을 주고 받는 텔레비전 기술이 개발된 20세기 초쯤에야 이런 분야가 개척됐다.

본인이 색과 관련하여 감이 오지 않고 아직도 좀 알쏭달쏭한 걸 얘기하면서 글을 맺도록 하겠다.
모니터 화면 같은 건 그 본질이 빛이며, 빛은 색을 태생적으로 지니고 있다. 그러나 다른 세상 만물들, 특히 인쇄물은 색만 있지 빛은 지니고 있지 않다. 조명을 받아야만 자기 색을 비춰 보일 수 있다.

빛은 원색이 RGB라고 여겨지며, 섞일수록 더 밝아져서 최종적으로 white에 도달하는 ‘가산 혼합’을 한다. 그러나 빛이 없는 나머지 사물의 색들은 섞일수록 더 어두워져서 최종적으로 black에 도달하는 ‘감산 혼합’을 한다. 이 정도는 이미 초등학교 미술 시간에 배운다.

다만, 빛의 3축과 색의 3축은 노랑/초록 말고 빨강/파랑 부분도 서로 미묘하게 차이가 난다는 것부터는 고등교육 이상의 영역으로 보인다. 본인도 그걸 대학 이후에나 접했기 때문이다.
왜 그런 차이가 나는지에 대해서는 논외로 하더라도, 빛이건 색이건 두 색상을 물리적으로 섞지는 말고 디더링 하듯이 오밀조밀 가까이 배치시켜 놓으면 멀리서 볼 때 정확하게 어떤 혼색이 나타날까? 이걸 잘 모르겠다.

이건 빛이든 인쇄된 색이든 차이가 없어야 하지 않을까? 그리고 만약 차이가 없다면 그 결과는 감산 혼합이나 가산 혼합 중 어느 것과도 정확하게 일치하지 않을 것이다. 그 관계가 무엇일까? 마치 산술/기하/조화 평균처럼 서로 비슷하면서도 미묘하게 다른 결과가 나오지 않을까 싶다.

이해를 돕기 위해 아래 그림을 살펴보자. 반드시 확대/축소 왜곡되지 않은 원래 크기 형태로 볼 것!! (화면 확대 배율도 96DPI/100%로 맞춰야 함)
왼쪽은 그냥 RGB(0,0,0) 검정과 RGB(255,255,255) 하양을 1:1로 섞은 것이고, 오른쪽은 RGB(0,0,255) 파랑과 RGB(0,255,0) 초록을 섞어서 청록을 만든 것이다. 여기서 섞었다는 것은 픽셀 디더링을 말한다. 그리고 우측 하단에는 본인이 보기에 이들과 가장 비슷하다고 생각하는 순색(solid color)을 칠해 보았다.

사용자 삽입 이미지

255짜리 순색 파랑 255짜리 순색 초록을 섞어서 가산 혼합이 됐다면 RGB(0,255,255) 밝은 cyan 청록이 나타나야 하겠지만 실제로는 전혀 그렇게 되지 않았다. 그런데 그렇다고 해서 평균인 128짜리의 훨씬 어두운 색이 된 것도 아니다.
본인이 보기에 가장 비슷한 순색의 명도는 대략 180~184 정도이다. 생각보다 제법 밝다. 아.. 그래서 옛날에 VGA 팔레트도 어두운 색을 무식하게 128로 지정하지 않고 170 정도의 값을 줬는가 싶은 생각이 든다. 다른 색과 섞었을 때 재현 가능한 색이 나오라고 말이다.

이런 현상을 설명하기 위해 감마 보정 등 다른 어려운 이론들도 나온 게 아닌지 추측해 본다. 디더링 알고리즘이란 게 내가 생각했던 것보다 여러 단계로 나뉘고 더 어렵고 복잡할 수도 있겠다는 생각이 든다. 적절한 명도 추출하기, 적절히 대체색으로 분비하기, 오차 보정하기 등..;; 시각 디자인의 세계는 오묘하다.

Posted by 사무엘

2020/07/06 08:35 2020/07/06 08:35
, , , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1770

도로와 철도의 터널과 교량

1. 자동차용 터널과 교량

도로나 철도를 만들다가 산 같은 장애물을 정면돌파 하려면 터널을 뚫게 되고, 기존 도로를 입체 교차하거나 강을 건너기 위해서는 교량을 건설하게 된다. 이런 시설들은 구불구불 우회해서 가야 할 경로를 굉장히 곧게 해 준다.

기술이 발달한 덕분에 요즘은 옛날에 상상하기 어려웠던 매우 크고 길고 넓은 터널과 교량이 많다.
산 하나를 통째로 관통하는 건 일도 아니고 도시 시가지를 통째로 지하로 통과한다. 2차로를 넘어 4차로 광폭 터널도 어렵지 않게 볼 수 있으며, 제한적이나마 바다를 건너는 터널(아래로)이나 교량(위로..)도 있다. 아무래도 고가(교량)보다는 지하도(터널..)가 만들기 더 어려운 것이 주지의 사실인데, 하저· 해저터널 같은 건 참 경이롭다.

다만, 이런 곳을 자동차로 운전해서 갈 때는 좀 주의해야 한다. 터널을 드나들 때는 주변의 밝기가 갑자기 변하기 때문에 운전자의 시야가 교란될 수 있으며, 교량은 바람이나 온도가 일반 평지와는 달라서 길이 미끄러울 수 있다.
그리고 둘은 형태는 다르지만 길 밖으로 벗어날 곳이 딱히 없기 때문에 비상 대피나 탈출이 취약하다는 공통점이 있다. 특히 터널은 화재라도 났다간 질식의 위험까지 있다.

이런 이유로 인해 우리나라에서는 터널이나 교량에서는 한 치의 예외 없이 차선들이 실선으로 그어졌으며, 차로 변경과 추월이 금지돼 왔다.
하지만 모든 교통사고가 오로지 과속과 추월 때문에 발생하는 것도 아닌데, 저건 현실과 안 맞는 너무 규제 위주의 악법이라는 지적이 끊이지 않았다.

사용자 삽입 이미지

요즘은 시종일관 한 차로로만 달리기에는 너무 길고 큼직한 터널도 많다. 그리고 강을 건너는 교량 말고 강과 수 km째 나란히 가는 교량도 많은데 거기도 차로를 몽땅 실선으로 틀어막아야 하는지에 대한 형평성 문제도 있다.

국도 20호선과 4호선이 만나는 북건천 분기점은 긴 건천 터널을 통과하자마자 분기점이 뿅 나타난다. 경주에서 20을 이용해서 달리다가 저기서 4로 갈아타서 영천? 대구 방면으로 가려면 아예 터널에 진입하기 전부터, 한참 전부터 맨 오른쪽 n차로로 차로를 바꿔야 한다. 터널 안에서 차로를 바꾸는 건 실선 차로와 각종 차단봉으로 막혀 있기 때문이다. 이런 문제도 있다.

그래서 요즘은 특정 조건을 만족하는 형태로 새로 만들어지는 터널에 한해서 터널 안도 점선 차선이 그어지고 차로 변경을 허용하는 추세이다. 교량 쪽은 소식을 못 들었다만, 거기도 좀 더 합리적이고 개방적인 쪽으로 변화가 생겼으면 좋겠다.

2. 철도용 터널과 교량

자동차가 다니는 터널과 교량은 그렇고.. 그럼 이제부터는 철도의 터널과 교량에 대해서 얘기하도록 하겠다.
요즘 만들어지는 큼직한 터널은 도로용이나 철도용이 외관이 크게 차이가 나지 않는 듯이 보인다. 그러나 옛날 초창기에, 특히 철도가 다들 단선 비전철 위주이던 시절에는 그렇지 않았다.

철도 차량은 레일 근처 하부의 폭과 중상부의 폭이 차이가 많이 나는 교통수단이다. 이는 제한된 레일 궤간에서 최대한 큼직한 차량을 굴리기 위한 노력의 결과이다. 그래서 한국의 경우, 법적 차량 한계가 1250mm 이하의 낮은 부위와 그 이상 높은 부위의 폭이 서로 다르게 명시돼 있다.

철도 차량은 자동차와 달리 레일을 한 치도 벗어나지 않고 정밀 정확하게 다니니.. 터널도 그야말로 차량 한계가 허용하는 한계치까지 작게 만드는 게 가능하다. 그래서 터널의 단면조차 차량의 단면과 비슷하게 하부가 상부보다 더 작으며, 단면이 말발굽 모양처럼 돼 있다. 이것은 철도 터널이 자동차용 터널과 결정적으로 다른 특징이다.

사용자 삽입 이미지

뭐, 언제까지나 옛날에 그랬다는 것이다. 요즘은 한 터널 안에 복선 선로를 집어넣고 위에 전차선도 집어넣고.. 또 고속 주행을 위해 공기가 드나들 틈을 더 내기도 하니 철도 터널도 옛날보다야 더 큼직하게 만든다.

그리고 철도는 교량도 좀 특이했다.
옛날에는 철교의 상부에 딱히 난간이나 트러스 같은 게 없었고 생긴 게 참 단촐(?) 소박했다. 뭐, 어차피 레일이 있으니 단순히 통과 차량의 안전을 위한 난간이나 가드레일 따위는 없어도 될 것이다.

과거의 단선 비전철 철길은 선로의 좌우에 아무 인공물이 보이지 않아서 좌우의 창 밖을 보면 자동차를 탈 때보다 자연의 정취랄까 그게 더 강하게 느껴졌다. 반대편 선로라는 것도 없고 전차선 전봇대도 없고.. 침목과 레일이 놓인 자갈밭이 끝인데 그건 양 옆의 시야로는 어차피 보이지 않는다. 열차가 교량을 통과할 때면 그냥 강물 위로 공중에 떠 있기라도 한 것 같다.

그리고 이런 교량은 딱히 ‘도상’이란 게 없어서, 레일 밑에 깔린 침목 아래로 곧장 강물이 출렁출렁 내려다보였다. 자갈밭조차 없었다는 뜻이다. 옛 수인선의 소래철교처럼 말이다.

사용자 삽입 이미지

하지만 오늘날은 이런 식으로 철교를 만들지 않는다. 레일 밑에 아무 지반이 없으면 열차가 지나갈 때 소음과 진동이 주변에 너무 크게 전해지기 때문이다. 궤도 아래에 침목과 자갈 같은 걸 괜히 만드는 게 아니다. 물론 요즘은 나무 침목이나 자갈조차도 안 쓰고 싹 다 콘크리트 땜빵이지만..
자동차 도로도 고속도로 같은 건 옛날처럼 아스팔트를 안 쓰고 이제 시멘트 포장을 하니, 철길 노반과 도로 노반이 생긴 모습이 다 허옇게 비슷해졌다.

내 기분상 도로 교량보다는 철도 교량이 상부에 이렇게 철골 구조물이 치렁치렁 솟아 있는 경우가 많다. 삼각형 그물 모양의 뼈대 구조이다 보니 무슨 3차원 그래픽 와이어프레임을 보는 것 같은데..
단순히 잉여 미관 때문이 아니라 교량을 안정적으로 지탱하기 위해 일부러 만들어 넣은 거라고 한다. 한강 최초의 교량인 한강 철교도 이런 형태로 만들어졌었다. 110여 년 전에 처음 만들어졌을 때부터 말이다.

사용자 삽입 이미지


Posted by 사무엘

2020/07/03 08:35 2020/07/03 08:35
, , , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1769

추억의 옛날 수필

1. 비는 반드시 옵니다 (주 기운) (☞ 전문)

요즘은 전반적으로 장마나 태풍의 위력이 예전 같지 않고.. 기계에다 비유하자면 비구름들의 출력(?)이 좀 시원찮은 것 같다. 비는 대부분 일기예보보다 늦게 적게 내리고 금방 그치는 편이다.

지난 6월, 이례적인 이상 고온이 계속됐을 때 본인은 중학교 시절에 접했던 이 수필이 문득 생각났다.
‘사후약방문’, 그리고 ‘패연히’라는 단어가 인상적이어서 기억에서 잊혀지지 않는다. 비가 패연히 내리는 건 ‘태연히’가 아니라 콸콸 세차게 내린다는 뜻이다.

글쓴이인 주 기운(1928~2007. 3. 16.)에 대해서는 검색해 보니 광주/호남 지방의 유명 문인이었던가 보다.
기일을 보니 내가 곧바로 떠오르는 건.. “아, 이분은 공항철도 1차 구간 개통 딱 1주일 전에 돌아가셨구나.”이다. 철도님이 계시해 주셨다.

그런데 정작 저 글이 언제 쓰여졌는지, 우리나라에 언제 저런 기록적인 폭염과 가뭄이 들었었는지는 알 길이 없다. 카더라 통신에 따르면 1970년대에 신문에 기고된 글이라는데.. 저게 교과서에 소개되어 실린 건 1994년부터라고 한다.
“은전 한 닢”이라든가 “방망이 깎던 노인” 같은 유명 수필도 글이 발표되고 공개된 때는 거의 1970년대이고, 그 글이 다루는 배경은 1930년대인 걸로 난 알고 있다.

2. 아버지의 손 (오 천석) (☞ 전문)

올해 초에는 어느 현직 의사가 “내과 박원장”이라는 자전적인(?) 웹툰을 연재해서 의료인뿐만 아니라 의대 지망생 내지 일반인들에게도 큰 호응과 인기를 얻었다. 그림이며 스토리며 모두 전문 웹툰 작가 뺨치는 퀄티리였다. IT업계에만 월화수목 금금금이 있는 게 아니었군..

특히 몸집 크고 나이 많고 동기들에 비해 어리버리하지만.. 성격은 정말 순진하고 착하던 소대광이라는 의사를 소개한 에피소드는 정말 대박이었다. (☞ 보기)
물론 저건 의사로서 최악에 최악의 상황만 골라서 발생한 예외에 가까운 사례이겠지만.. 실화와 각색의 비율이 어느 정도 되는지 궁금하다. 이 정도면 단편영화 한 편 찍어도 될 것 같다.

요즘은 버스 기사를 폭행하는 것도 가중 처벌되고, 심지어 신호 대기 중이라도 운전 중과 동급으로 취급되도록 법이 바뀌었다. 하물며 밤에 고생하는 의료진을 술 쳐먹은 인간쓰레기들로부터 더 강력하게 보호할 수 없나 안타깝다. 삼청교육대 같은 거 만들어서 삼청의 삼짜만 나와도 무서워서 술이 확 깨는 지경 정도는 돼야 할 텐데.. 뭐 그건 그렇고.

소대광은 처자식을 먹여 살리려고 개원 후에 지나치게 과로하다가 돌연사하고 말았다.
심장에 문제가 생겨서 쓰라린 흉통이 느껴질 때 약을 먹으려고 했는데.. 좁쌀만 한 알약을 실수로 책상과 벽 사이의 좁은 틈새로 톡 떨어뜨려 버렸다. 그걸 큰 손으로 미처 건져내지 못하고 그만..

내과 박원장을 읽으면서 졸피뎀이라는 약이 있다는 걸 알게 됐고, 니트로글리세린이 폭약일 뿐만 아니라 협심증에 대처 가능한 의약품이기도 하다는 걸 알게 됐다.;; 뭐, 의사 약사 지망생들에게는 기본 상식이겠지만 말이다.
그런데.. 생각해 보니 비슷한 스토리가 나오는 옛날 수필이 하나 더 있었다. 바로 “아버지의 손”.

저 글에서는 글쓴이의 선친이 똑같은 협심증 지병 때문에 똑같은 니트로글리세린 약을 처방 받았다.
그러나 선친은 문맹이었던지라, 위급한 상황이 됐을 때 약병을 개봉하지를 못했다. 그래서 병을 돌로 쳐서 깰 생각까지 했지만 미처 그러지 못하고 통증을 호소하다가 최후를 맞이했다. ㅠㅠㅠㅠ

“어린이가 함부로 건드릴 수 없는 안전 뚜껑. 눌러서 돌리면 열립니다”를 읽지 못해서.
게다가 저 글에서도 아버지는 힘 세고 손이 크고.. 영락없이 소대광 같은 캐릭터였다고 묘사된다.

다만, 니트로글리세린은 혈관 문제나 심장병을 근본적으로 치료해 주는 약은 아니다. 글에서도 “그 약만 먹었으면 아버지는 도움을 청할 때까지 버틸 수 있어 안 돌아가셨을 것”이라고 쓰여 있다.
저 약은 환자가 의료진에게 도착할 때까지 생존할 수 있도록 잠시 시간을 벌어 주는 역할만 한다. 하지만 그것만으로도 충분히 매우 유용하며 사람 생명을 구할 수 있다. 마치 심폐소생술처럼 말이다.

저것도 완전히 낯설지는 않게 느껴지는 글인데.. 학교에서 접한 적이 있었나 모르겠다. 교과서 아니면 문학 시험지 지문으로..?? 잘 모르겠다.
참고로 저 글은 초판이 1977년에 나온 책에 소개되었고, 저자의 생몰년도가 1901-1987년이다. 그러니 저 글 역시 다루는 시점은 1930~40년대 정도이지 싶다. 문맹률이 아직 굉장히 높던 시절 말이다.

Posted by 사무엘

2020/07/01 08:35 2020/07/01 08:35
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1768

1. 멀티스레드

지난 날개셋 한글 입력기 9.9에서는 어쩌다 보니 스레드와 관련된 작업이 좀 있었다. 각종 대화상자에서 스레드 작업이 행해지던 것을 중단시켰을 때 프로그램이 멎던 문제를 해결했으며, 반대로 사용자의 타이핑에 실시간으로 반응하며 동작하는 일부 입력 도구에다가는 랙 없이 깔끔하게 동작하기 위해 스레드를 사용하게 하는 옵션을 추가했다. 뭐, 요즘 컴퓨터에서 랙을 걱정할 지경은 아니긴 하지만 말이다.

오랜만에 멀티스레드를 다루다 보니 지금까지 이론으로만 알고 있던 동기화라는 것도 구현해야 했다. worker 스레드는 입력 데이터를 지지고 볶고 열심히 건드리고 있는데, 그걸 표시하는 UI 스레드도 아무 통제 없이 같이 돌아가게 놔 두면 프로그램은 당연히 메모리 에러가 나고 뻗는다.

Critical section을 생성하고 소멸하는 부분은 클래스의 생성자와 소멸자에다 담당시켰는데, 이걸 이용해서 실제로 락을 걸고 푸는 것까지 또 다른 클래스의 생성자와 소멸자로.. 그렇다고 기존 오브젝트의 포인터를 명시적으로 지정하지 않고 자동 구현하는 것은 C++에서 안 되는가 보다. Inner class에서 바깥 class의 non-static 멤버에 접근 가능하지 않으니까..

임계 구간을 잘 설정해야 crash를 막을 수 있다. 하지만 그렇다고 개나 소나 마구 락을 걸어 버리면 성능만 떨어지는 게 아니라 반대로 deadlock이라는 부작용이 발생해서 프로그램의 응답이 멎어 버릴 수 있다. Crash는 사람이 다쳐서 의식을 잃는 것이고, deadlock은 사람이 수술 후 마취에서 못 깨어나는 것과 비슷하다..;;

주로 어떤 상황이냐 하면, UI 스레드가 worker 스레드의 실행이 끝날 때까지 기다리게 됐는데 worker 스레드는 데이터를 고친 뒤 UI 스레드의 응답이 필요한 요청을 해 버릴 때 이렇게 된다. 특히 윈도우에다가 메시지를 보내고 응답을 기다리는 API 함수를 호출하는 것 말이다.

이런 주의 사항을 염두에 두면서 프로그램의 주요 구간에 스레드 동기화를 시켜 놓았다.
당연한 말이지만 한 critical section 오브젝트는 단일 구간이 아니라 코드의 여러 구간에다가도 배치해서 이들 모든 구간을 통틀어서 한 순간엔 한 스레드만이 접근 가능하게 제약을 걸 수 있다. 이게 강력한 면모인 것 같다.

그러고 보니 Windows 프로그래밍 헤더에 들어있는 구조체들 중에는 내부 구조가 딱히 공개돼 있지 않은 것이 좀 있다.
가령, PAINTSTRUCT 내부에 있는 rgbReserved 같은 멤버, STARTUPINFO 내부에 있는 cbReserved2, 그리고 CRITICAL_SECTION도 어쩌면 CPU 아키텍처별로 크기와 내부 멤버가 제각각 다를 가능성이 높은 비공개 구조체이다.
이런 예가 무엇이 더 있을 텐데 궁금하다. 당장은 떠오르지 않는다.

2. C 라이브러리와 스레드 생성 함수

Windows에서 스레드를 생성하는 제일 저수준 API는 잘 알다시피 CreateThread 함수이다.
요즘이야 C++도 C++11부터 언어 라이브러리 차원에서 플랫폼· 운영체제를 불문하고 멀티스레드 기능을 std::thread, std::mutex 같은 클래스로 제공하고 있지만, 이들도 내부적으로는 물론 Windows API 같은 운영체제 API를 호출하는 형태로 구현된다. 심지어 native handle값을 되돌리는 멤버 함수도 제공한다.

(그러고 보니 C++ 라이브러리는 C 라이브러리와 달리 라이브러리의 소스가 공개돼 있지 않은 듯하다.. 소스가 어쩔 수 없이 공개되는 템플릿 쪽은 도저히 알아볼 수 없는 난독화 급으로 작성돼 있고, 내부적으로 호출하는 함수 같은 것은 구현체 소스가 딱히 보이지 않는다.)

C++11 이전에는 Visual C++의 경우, 언어 확장 명목으로 CreateThread (와 ExitThread)를 얇게 감싼 _beginthread[ex] (+ _endthread[ex]) 함수를 독자적으로 제공해 왔다.
얘는 Windows SDK의 헤더와 라이브러리를 끌어들이지 않고도 스레드를 사용할 수 있게 해 주는 동시에.. C 라이브러리가 자체적으로 스레드별로 사용하는 메모리를 제때 할당하고 제때 해제하는 역할도 담당했다.
그렇기 때문에 C/C++ 함수도 사용하면서 Windows용 프로그램을 개발한다면 일반적으로는 운영체제 직통 함수 대신 이런 상위 함수를 사용해서 스레드를 생성해야 한다.

C 라이브러리가 스레드별로 무슨 메모리를 사용하는가 하면.. 전역변수로 단순하게 구현되었지만 지금 관점에서 보면 스레드별로 값이 제각기 보존되어야 하는 정보들 말이다. errno라든가, strtok 함수의 내부 state 및 context.. 비록 이런 것에 의존하는 함수가 그리 많은 건 아니지만 어쨌든 그런 예가 있다.

C 라이브러리에서 제공하는 begin/end 함수는 ex가 붙은 놈과 그렇지 않은 단순한 놈으로 나뉜다. ex는 받아들이는 인자가 Windows API의 그것과 완전히 동일하다. 그에 비해 단순한 놈은 평소에 잘 쓰이지 않는 인자들을 과감히 생략했기 때문에 사용하기가 더 쉽다.

예를 들어 begin 버전은 SECURITY_ATTRIBUTES 정보를 입력받는 부분이 생략됐고, 거의까지는 아니어도 잘 쓰이지 않는 thread ID를 받아들이는 부분도 생략됐다. 또한, 프로세스도 아니고 스레드의 실행 후 리턴값은 거의 쓰이지 않는다는 점을 감안하여 end 버전은 리턴값을 지정하는 부분도 생략되고 그냥 0으로 고정됐다.

참고로 Windows NT의 경우 ReadFile/WriteFile에서 실제로 읽거나 쓰는 데 성공한 양을 받는 DWORD 포인터, 그리고 CreateThread에서 생성된 스레드의 ID를 받는 DWORD 포인터를 생략하고 NULL을 줄 수 있다. 굳이 그 정보들이 필요하지 않다면 말이다. 하지만 과거의 Windows 9x는 저들 함수의 인자에서 NULL을 줄 수 없으며, 그냥 잉여 변수라도 하나 반드시 선언해서 넘겨줘야 한다는 차이가 있었다(NULL 주면 실행 실패).

뭐 그렇긴 한데.. C 라이브러리의 간편 버전은 사용법을 간소화하기 위해 여러 인자들을 생략했을 뿐만 아니라, 스레드 핸들을 CloseHandle로 닫는 것까지 임의로 자동으로 해 버린다. 스레드가 아주 잠깐 동안만 실행됐다가 종료돼 버리는 경우, _beginthread 함수의 리턴값이 나중의 시점에서 유효하다는 보장을 할 수 없다.

이건 사족에 가까운 간소화 조치로 여겨지며, 이 때문에 _beginthread는 사용이 그리 권장되지 않고 있다. 아니면 정말 뒷감당 할 필요 없고 한번 생성된 뒤에 “나는 책임 안 지니 니가 알아서 모든 뒷정리 하고 곱게 사라져라” 급인 스레드를 간편하게 생성하는 용도로나 적합하다. 그게 아니면 번거롭지만 결국은 _ex 함수를 쓰고 핸들은 내가 수동으로 닫아 줘야 한다.

3. 실행 주체들의 종료 리턴값

프로세스와 스레드는 종료될 때 정수를 하나 되돌릴 수 있는데, 아무 일 없이 잘 끝났으면 간단히 0을 되돌리는 게 관행이다. 옛날에 도스에서는 프로세스의 종료 코드를 ERROR_LEVEL이라는 독특한 명칭으로 불렀었다.

프로세스의 종료값은 그럭저럭 고유한 용도가 있으며, 여러 프로그램들을 순차적으로 실행하는 배치 파일이나 스크립트 같은 데서 많이 쓰인다. 종료되고 없는 먼젓번 프로그램의 실행이 성공했는지 여부를 밖에서 알 필요가 있기 때문이다.

하지만 앞에서 잠시 언급한 바와 같이.. 스레드의 종료값은 내 경험상 거의 쓰이지 않는다. 스레드의 종료값을 읽고 판단할 수 있는 코드 자체가 동일 프로세스 안의 다른 스레드밖에 없고.. 한 프로세스 안에서는 굳이 종료값 말고도 스레드의 실행 결과를 알 수 있는 방법이 매우 많기 때문이다. 애초에 같은 메모리 주소 안이니..

또한 스레드는 애초에 여러 작업을 동시에 수행하라고 만들어지지, 배치 파일처럼 여러 스레드를 순차적으로 실행하면서 실행 결과를 확인하는 식으로 운용되지도 않는다. 그럴 거면 그냥 한 스레드에서 순차 실행을 구현하고 말지.. 프로세스와는 여러 모로 사용 여건이 다르다.

그 와중에 Windows에서는 259라는 값이 STILL_ACTIVE라는 의미로 예약돼 있는지라.. 프로세스나 스레드의 종료 리턴값으로 쟤를 돌려주는 것이 금지되어 있다. 자기는 종료되어서 없는데 GetExitCodeProcess/Thread 함수가 저 값을 되돌리고 있으면 다른 프로세스나 스레드는.. 없는 프/스의 실행이 끝날 때까지 기다리면서 데드락 같은 상태에 빠지기 때문이다.

4. 타 프로세스에다 내 스레드 생성하기: CreateRemoteThread

Windows API 중에는 기본적인 기능을 제공하는 함수가 있고, 거기에 덧붙여 어느 프로세스 문맥에서 그 기능을 수행할 것인지를 지정하는 인자가 추가로 붙은 Ex버전이 또 존재하는 경우가 있다.
예를 들어 ExitProcess(현재 프로세스만)의 상위 호환인 TerminateProcess, 그리고 VirtualAlloc에다가 HANDLE hProcess가 추가된 VirtualAllocEx처럼 말이다.

그것처럼 스레드를 생성하는 CreateThread에 대해서도 target 프로세스를 지정할 수 있는 CreateRemoteThread 함수라는 게 있다.
이런 함수들은 내부적으로 구현도 하위 함수를 호출하면 상위 함수에다가 GetCurrentProcess()의 리턴값을 붙여서 호출하는 형태로 돼 있다.

그런데 남의 프로세스 주소 공간에다가 스레드를 생성한다니??
이건 물론 디버거나 보안 솔루션 같은 특수한 프로그램에서나 필요하지 자기 일만 하는 일반적인 프로그램에서 쓰일 일은 없는 기능이다.
그리고 이 함수는 각종 명령 인자들을 준비하는 게 몹시 까다롭기 때문에 타 프로세스에서는 매우 제한된 형태로밖에 활용을 할 수 없다.

제일 근본적으로는.. 실행되어야 할 스레드 함수 코드와 실행에 필요한 데이터들이 몽땅 그 target 프로세스의 메모리에 마련돼 있어야 하며 주소값 또한 걔네들의 문맥으로 줘야 하기 때문이다. 잘못되면? 요청을 한 우리가 아니라 멀쩡히 돌아가던 저 프로세스가 뻑나게 된다.
global hook 프로시저를 지정할 때처럼 DLL에다가만 분리해서 구현해 놓으면 그 DLL이 알아서 거기로 주입.. 그런 것도 없다.

다만, CreateRemoteThread를 이용해서 타 프로세스에다 내 코드를 주입하려면 어차피 DLL을 만들기는 해야 한다. 그 이유는 이렇다.
CreateRemoteThread로 할 수 있는 게 사실상.. 스레드 callback 함수로 LoadLibrary를 지정하는 것밖에 없기 때문이다.

이게 가능한 이유는 (1) LoadLibrary(+ FreeLibrary도)가 machine word 하나를 받아서 word 하나를 되돌린다는.. 스레드 callback 함수와 prototype이 일치하기 때문이며, 그리고 (2) LoadLibrary가 소속된 kernel32.dll은 어느 프로세스에서도 메모리에 load된 주소가 동일 고정이기 때문이다. 즉, LoadLibraryA/W 함수의 주소도 고정이며 예측 가능하다. 요게 핵심이다. 요즘 보안을 위한 대세인 ASLR에서 열외된 영역인 듯..

물론 LoadLibrary에다가 주는 인자는 평범한 숫자가 아니라 포인터이므로 넘겨줄 때 조심해야 한다.
VirtualAllocEx를 이용해서 그 프로세스 문맥에서의 메모리와 포인터 주소를 얻은 뒤, 문자열을 그쪽으로 써 넣을 때도 WriteProcessMemory를 호출해서 하면 된다. 얘는 그야말로 memcpy를 fwrite처럼 구현한 상위 호환 버전이라고 생각하면 되겠다.

LoadLibrary에다가 넘겨주는 문자열 인자로 바로 상대방의 프로세스에서 수행할 작업(뭔가 엿보기, 훅킹하기 등등)이 구현된 내 DLL의 주소를 넣으면 된다. DllMain 함수에서 돌아가는 것이니 몸 사리면서 조심해서 실행돼야 한다.
혹시 내 DLL을 실행하면서 다른 DLL을 읽어 놓아야 한다면 내 DLL을 주입한 것과 동일한 테크닉으로 그런 dependency DLL들을 미리 읽어 놓는 게 좋을 것이다. LoadLibrary를 수행하던 스레드가 실행이 끝났다고 해서 그 DLL들이 해제되는 건 아니기 때문이다.

주입되었던 내 DLL을 빼내는 것도.. 간단하다.
스레드 함수에다가 FreeLibrary를 주고, 인자로는 저 target 프로세스에서 되돌려진 내 DLL의 핸들값을 주면 된다.
target 프로세스에서 되돌려진 핸들값이야 내 DLL의 DllMain 함수의 인자로 들어왔을 테니 모를 수가 없을 테고, 그걸 호스트에다가 전하는 건 어려운 일이 아닐 것이다.

이런 식으로 저 함수에다가 LoadLibrary 대신 ExitProcess를 주면 그 프로세스가 알아서 자기 자신을 강제 종료하게 되니, 사실상 TerminateProcess와 같은 효과도 낼 수 있다.

16비트 시절에는 단일 address 공간에서 시스템 전체에 영향을 끼치는 프로그램을 만드는 게 용이했기 때문에 그에 상응하는 점프/복귀 주소 변조, x86 어셈블리어 삽입 같은 꼼수 테크닉이 유행했었다. 그러나 32비트 이후부터는 방법론이 이렇게 더 고차원적으로 확 바뀌었다.;;

Posted by 사무엘

2020/06/28 08:36 2020/06/28 08:36
,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1767

4색 정리, 정사각형 분할 문제

일명 “4색 정리, 4색 문제”는 개념 자체는 마치 페르마의 마지막 정리처럼 초등학생도 이해할 수 있을 정도로 아주 단순하다. 하지만 엄밀한 증명은 20세기의 현대 수학자조차도 감당하지 못할 정도로 난해했던지라, 1976년이 돼서야 컴퓨터의 brute-force 계산 능력의 도움을 받아 간신히 증명됐다.

사용자 삽입 이미지

요즘으로 치면 무슨 머신 러닝을 돌리듯이 당대의 슈퍼컴 두 대를 장정 50일을 돌리면서 가능한 모든 지도 모델에서 증명이 성립함을 확인했다고 한다.
물론 저건 오늘날의 머신 러닝에 비할 바는 못 된다. 내 기억이 맞다면, 1970년대 중반의 크레이 슈퍼컴퓨터는 20여 년 뒤에 등장하여 클럭 속도가 GHz급에 도달한 펜티엄 3~4급 PC와 얼추 비슷한 성능이었다. 요즘 PC라면 GPU 세팅만 잘 하면 하루는커녕 길어야 수십 분~몇 시간이면 시뮬레이션이 끝나지 싶다. 그만치 세상이 많이 변했다.

하지만 1976년은 지금으로부터 무려 45년 가까이 전의 과거이다. 증명할 지도 모델을 설계하고 계산량을 그 시절 컴퓨터로 감당 가능하게 최소화한 것만으로도 독창적인 학술 공로이며, 대학교 수학과 교수 급의 전문가가 아니면 할 수 없는 일이었다.
또한 극도로 비싸고 귀하신 몸이던 슈퍼컴을 당장 실용적으로 필요하던 일기예보나 모의 핵실험, 탄도 예측(?)이 아닌 학술 연구용으로 끌어들여 온 것 역시 해당 연구자의 행정력과 근성과 로비 덕분이었던 셈이다.

한편, 정사각형을 크기가 서로 다른 작은 정사각형들로 분할하는 문제(lowest-order perfect squared squares)도 굉장히 난해하지만 답이 존재는 하는 굉장히 기묘한 문제인데.. 4색 정리와 비슷하다면 비슷한 시기인 1978년에 길이 112짜리 사각형을 21개로 분할하는 해법이 발견됐다. 이 역시 컴퓨터를 동원하여 찾아낸 것이었다.

사용자 삽입 이미지

또한, 저 정사각형들도 최대 4개의 색만으로 서로 경계를 구분하여 칠할 수 있을 테니, 이것도 4색 문제하고 관계가 있다고 볼 수 있겠다. =_=;;
1982년에는 동일 연구자의 후속 연구를 통해 저게 이론적으로 존재 가능한 optimal 내지 lower bound라는 것도 증명됐다. 즉, 20개 이하의 서로 다른 정사각형으로 큰 정사각형을 꽉 채우는 방법은 존재하지 않는다는 것이다.

다만, 가장 작은 정사각형 분할의 하한은 112가 아니라 110이라고 한다. 분할 개수는 21개보다 딱 1개 더 많은 22개이다. 참으로 신기한 노릇이다.

사용자 삽입 이미지

그 전에 컴퓨터의 도움 없이 사람이 찾아낸 가장 단순한 정사각형 분할은 175를 24개로 분할하는 것이었다. (81, 55, 39, …) 1946년에 데오필루스 윌콕스(1912-2014)라는 영국 사람이 발견했다.

사용자 삽입 이미지

정사각형을 서로 다른 정사각형으로 분할하는 방법 자체는 다양한 크기별로 무한히 존재하기라도 하는지? 이게 증명돼 있기라도 한지는 모르겠다. (자명한 닮은꼴은 물론 제외. 작은 정사각형의 크기값들이 모두 서로 소인 것으로 한정)

단지 2차원이 아니라 3차원에서 정육면체를 서로 크기가 다른 정육면체로 꽉 맞게 채운다거나 그 이상의 차원에서 같은 방법으로 hypercube를 채우는 방법은 아예 존재하지 않는다고 한다.
직관적으로 생각해도 명확한 것이... 3차원만 생각해 봐도 그런 정육면체가 있다면 여섯 면이 다 제각기 크기가 서로 다른 정사각형으로 거대한 정사각형을 이룬 모습을 기본적으로 하고 있어야 할 것이다. 하지만 정육면체만으로 그렇게 되는 것은 불가능하기 때문이다.

벡터의 외적이 딱 3차원 벡터에 맞게 존재하는 이항연산이듯이, a^n+b^n=c^n의 정수해가 존재하는 n의 상한이 딱 2인 것처럼.. 정사각형 분할은 딱 2차원 평면에서 존재 가능한 절묘한 문제인 것 같다.

Posted by 사무엘

2020/06/25 19:38 2020/06/25 19:38
, ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1766

1. 고속도로 톨비

우리가 고속도로를 주행할 때 늘 지불하는 통행료, 일명 톨비라는 건 생각보다 다양한 변수를 감안해서 복잡한 방식으로 산출된다.
가장 간단하게는 “기본 요금 + 주행 거리 * 임률”이며, 임률이 경차 포함 6종의 차종별로 차이가 있는 것까지는 다들 아실 것이다. 민자 고속도로는 여기에 부가세가 추가되어서 살짝 더 비싸진다.

그런데 이 표준 임률은 4차로(편도 2차로)짜리 고속도로 기준이다. 2차로 고속도로에서는 임률이 절반(50%)으로 할인되고, 반대로 6차로 이상의 넓은 고속도로에서는 20% 할증이 붙는다. 이런 제도도 있었다니.. 과거에 열악하던 88 올림픽 고속도로가 통행료를 반값만 받았던 건 단순 예외적인 특례가 아니라 매뉴얼 상의 규정이었다.

물론 오늘날은 2차로 고속도로는 모두들 확장되고 개량되어 사실상 전멸했으며, 1992년 이래로 국내에 새로 건설하는 고속도로는 무조건 4차로 이상의 규모로 만들고 있다.
그러니 2차로 고속도로의 50% 할인 규정은 마치 삼륜차 운전 면허처럼 비현실적인 사문이 됐다. 오늘날 실질적으로 50% 할인을 받고 있는 건 경차이다. 6종 경차의 임률은 1종 소형차의 절반이기 때문이다.

톨비는 여기에다가..

  1. 1~3종 차량(초대형 차량만 아니면 다~)에 한해서 출퇴근 시간대 할인,
  2. 사업용 화물차는 반대로 심야 시간대 할인이 적용된다. 대형 트럭 기사들이 톨비를 할인받으려고 무리해서 밤 시간대를 골라서 다니는 게 이 때문이다.
  3. 소형차는 주말과 공휴일에는 또 반대로 소폭이나마 할증되기도 한다.
  4. 끝으로, 차량이 아니라 사람을 근거로 할인해 주는 장애인 및 국가유공자 할인도 있다. 이 분야로 등급이 높으면 톨비가 아예 완전히 면제되기도 한다.

지난 2014년인가 15년부터는 설과 추석 연휴 3일 동안은 아예 전국의 모든 고속도로에서 모든 운전자를 대상으로 톨비가 면제되기 시작했다. 그 전에 무슨 임시 공휴일 때도 잠깐 면제된 적이 있었지만 그건 일회성 이벤트였고, 명절 면제는 관행이 됐다.

생각보다 변수가 굉장히 많지 않은가?
아 참, 폐쇄식 말고 개방식 구간도 있다는 걸 깜빡했다. 개방식은 차들의 실제 주행 구간을 알 수가 없는데 그럼 전국의 모든 개방식 고속도로 톨게이트는 차종별로 고정된 액수의 통행료를 징수하는지?
자동차 내비에서 경로 계산과 동시에 예상 톨비를 정확하게 계산하는 건 매우 까다로우며, 도로 공사로부터 공인 API/SDK 같은 거라도 받아야 하지 않을까 싶다.

지하철의 운임이 비현실적으로 환승을 자주 하더라도 이론적으로 가능한 최단 거리를 가정하고 산정되듯, 고속도로 톨비도 출발 IC와 도착 IC 사이에 여러 경로가 존재 가능하다면 이론적으로 가능한 가장 저렴한 구간을 가정하고 톨비가 산정될 것이다.

2. 수도권 대중교통 통합 요금제

오늘날 서울과 수도권에서 시외버스 아래 등급의 버스들, 그리고 일반열차 아래 등급의 광역전철과 지하철들은 통합 환승 할인 요금제를 적용받고 있다. 승객은 이용한 교통수단들 중 가장 비싼 것의 기본요금(마을버스 < 시내버스 < 지하철 < 좌석버스 < 광역버스..)부터 시작해서 나머지 추가 요금을 내게 되는데, 추가 요금은 이용한 거리에 비례한다.

대부분의 경우 10km 거리까지가 기본 요금이고, 그 뒤 5km당 100원씩 올라가는 게 원칙이다. 그런데 전철에는 버스에 없는 다음과 같은 바리에이션이 존재한다.

  • 총 이용거리가 50km (기본 10km + 40km, 800원 추가)를 초과하면 이후 거리부터는 8km당 100원으로 임률이 저렴해진다.
  • 단, 서울· 인천· 경기도 구간과 그 바깥 구간을 연속해서 이용하는 경우, 전자의 구간에 대해서만 위의 임률이 적용된다. 충청도(경부선 천안..)나 강원도(경춘선 춘천..) 구간은 무조건 4km당 100원으로 비싸게 계산된다.
  • 공항 철도는 역시 영종대교를 건너는 구간이 제일 비싸다. 10km까지는 900원 고정이지만 그 뒤부터는 1km당 130원으로 폭증한다.
  • 용인과 의정부에 있는 경전철들은 기본요금이 2, 300원 남짓 추가되는 것 말고 임률이 바뀌는 건 없다. 추가 요금이 발생하는 방식이 기존 기본요금 + alpha인지, 아니면 max(기존 기본요금, 경전철 기본요금)인지는 잘 모르겠다.
  • 신분당선은 1차 개통 구간인 강남-정자, 2차 개통 구간인 정자-광교로 구분해서 둘중 한 구간만 이용하면 기본요금 1000원 추가, 모두 이용하면 1300원 추가이다. 물론 거리비례 요금은 별도로.. 2차 구간이 개통했던 직후에는 요금 계산 방식이 더 복잡했고 서울-경기도 경계 구분을 했었지 싶은데.. 저건 그나마 간소화된 형태이다.
  • 경춘선 ITX 청춘, 공항철도 직통열차는 동일 승강장에서 운임 체계가 다른 별도의 좌석형 일반열차를 굴리는 예이다. 누리로는 동일 승강장까지는 아니기 때문에 좀 애매하고..

고속도로와 철도 모두 민자 구간이 등장하면서 요금을 따로 정산할 필요가 생겨서 시스템이 이렇게 복잡해져 있다.

  • 버스/전철 공통 적용: 조조할인
  • 버스: 아무리 장거리여도 추가요금이 기본요금보다 더 많이 발생하지는 않게 보정, 1회 비환승은 기본요금으로만(서울 한정), 다인승
  • 전철: 최단거리 이용 추정 원칙, 운영구간별 요금 정산, 노인 무임

3. 제한 시간

고속도로는 통행료만 지불한다고 다가 아니고.. 회당 체류 시간이 제한돼 있다.
서울 지하철이 5시간 제한이 있듯이 우리나라 고속도로의 제한 시간은 24시간이다. 즉, 진입한 지 하루 안으로는 출구 IC로 나가 줘야 한다. 시간이 경과되면 고속도로에서 도대체 뭘 했는지를 의심받을 수 있고 추가 요금을 내게 된다.

솔직히 이 좁은 땅에서 한쪽 끝에서 반대편 끝까지 이동한다 해도 자동차로 24시간이 넘게 걸릴 일은 없다. 하지만 문제가 되는 건 차로 여러 사람들이 휴게소에서 모인 뒤, 자기 차를 거기에 두고 한두 차량에만 다 모여서 타고 놀러 가서는 며칠 있다가 돌아오는 상황이다. 그러면 그 차들은 고속도로 내부에서 24시간이 넘게 세워져 있게 된다.

글쎄, 이렇게 세워진 차들이 많다면 휴게소에 장기 주차된 차들 때문에 다른 차들이 못 들어와서 문제가 될 수 있다. 그러니 장기 주차가 가능하다고 정식으로 지정된 휴게소에서 추가 요금이라도 내는 조건으로 이런 걸 허용한다면 운전자와 도로 공사들이 모두 윈윈 하는 전략이 나오지 않을까 싶다. 요즘은 화장실과 편의점 정도만 달랑 있는 '주차장' 휴게소도 있으니 말이다. (졸음 쉼터보다 크고 정규 휴게소보다는 작은..)

쉽게 말해 이런 식으로 장기 주차를 양성화 합법화하는 것이다. 주차 요금이 그 차들이 모두 움직일 때 드는 기름값과 톨비와 타지의 주차 비용보다 더 비쌀 리는 절대 없을 테니..
안 그래도 요즘은 하이패스 기술이 발전하고 휴게소도 중간 회차를 굳이 금지하지 않는 형태로 만들어지는 추세이지 않은가? 휴게소에다가 차를 장기 주차했다가 중간 회차하는 것은 마치 휴게소를 고속버스 중간 환승지로 이용하는 것만큼이나 새로운 활용 방안이 될 것으로 보인다.

Posted by 사무엘

2020/06/23 08:36 2020/06/23 08:36
, , , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1765

Windows 운영체제에서 GUI 요소로서 화면에 표시되는 윈도우들은 독자적으로 고유한 위치와 크기를 갖는 popup 및 overlapped 윈도우, 아니면 다른 창의 내부에 부속으로 딸려 있는 child 윈도우라는 두 형태로 나뉜다. 전자는 독립 윈도우이고 후자는 종속 윈도우라고 생각해도 될 것 같다.

그리고 전자는 운영체제가 자동으로 표시해 주는 제목 표시줄, 시스템 메뉴, 최소화/최대화 버튼 같은 걸 가질 수 있고 메뉴도 가질 수 있다. 물론 갖지 않는 것도 자유이며 해당 창의 재량이다.
그럼 반대로 후자는 사정이 어떨까? 차일드 윈도우가 자기가 속한 부모 윈도우 내부에서 또 제목 표시줄과 시스템 메뉴, 최소화/최대화 버튼 따위를 가질 수 있을까?

이에 대해서 결론부터, 답부터 말하자면 다음과 같다.
"외형만 그렇게 나오도록 할 수는 있다. 하지만 운영체제는 child 윈도우를 대상으로는 여느 popup/overlapped 윈도우에서 수행하는 기본 처리를 자동으로 해 주지는 않는다. 그렇기 때문에 창을 그렇게 만들어 놓은 뒤에 우리가 원하는 자연스러운 동작을 구현할 수는 없다. 이건 운영체제에서 의도한 보편적인(?) 방식대로 창을 만들고 활용하는 게 아니기 때문이다."

본인은 마소에서 보편적이지 않은 동작이 존재하는 프로그램을 만든 것을 지난 20여 년에 달하는 세월 동안 딱 하나 발견했다.
바로 HTML 도움말 파일을 생성해 주는 HTML Help Workshop이라는 툴에 내장된 그래픽 에디터이다.

도움말을 띄우면 HTML 도움말 창이 별도의 독립된 창으로 뜨는 게 아니라 자신의 도킹 패널 내부에.. child 형태로 뜬다! 시스템 메뉴와 캡션, 최소/최대화 버튼까지 있는 당당한 독립 윈도우가 무슨 MDI child 윈도우처럼 다른 윈도우 내부에 이상하게 끼여 있는 게 심히 기괴하다. 이런 것도 Windows API를 사용해서 이론적으로 만들 수 있다는 것이다.

사용자 삽입 이미지

그래서 본인도 간단히 실험을 해 봤다.
다음은 껍데기 overlapped 윈도우와 "동일한" 클래스 이름으로 자기 안에 child 윈도우를 또 만들어 돌린 모습이다. 윈도우를 생성할 때 WS_CHILD에다가 WS_CAPTION| WS_SYSMENU| WS_MINIMIZEBOX| WS_MAXIMIZEBOX| WS_THICKFRAME만 주면 됐다.

사용자 삽입 이미지

얘는 언뜻 보기에 그냥 평범한 클래식 MDI 앱처럼 생겼지만 실제로는 그렇지 않다.
자신이 껍데기일 때는 클라이언트 영역을 회색 GetSysColor(COLOR_APPWORKSPACE)로 칠하고, 차일드일 때는 흰색 COLOR_WINDOW로 칠하면 된다. 껍데기와 차일드 둘 다 동일 윈도우 프로시저가 수행한 결과물이다. 자기 창이 껍데기인지 차일드인지의 여부는 WS_CHILD 스타일의 존재 여부만으로 간단히 판별할 수 있다.

그럼 제목 표시줄이 달린 차일드 윈도우들을 저렇게 만들어 놓으면 부모 윈도우라는 틀 안에 종속된 overlapped/popup 윈도우처럼 매끄럽게 동작하는가?
안타깝지만 답은 "전혀 그렇지 않다"이다. 저 상태에서 창들을 마우스로 단 몇 분 동안만 조작해 봐도 이상한 점이 잔뜩 발견될 것이다.

마우스로 child 윈도우를 클릭하면 지금 화면의 제일 겉에 드러난 창이 아니라 엉뚱한 창이 인식된다. 윈도우를 드래그 해 보면 화면에 잔상이 생긴다.
WM_LBUTTONDOWN 메시지를 받은 child 윈도우에다가 SetFocus를 해도 제목 표시줄이 활성화/비활성화 처리가 되지도 않는다.
child 윈도우를 최대화한 모습은 꽤 어정쩡하며, 그 상태로 프로그램 창의 크기를 키워도 child 윈도우는 크기가 갱신되지 않는다.

이런 문제가 발생하는 이유는.. Windows라는 운영체제는 근본적으로 child 윈도우에 대해서는 이들이 서로 겹쳐져 있고 포개져 있을 때의 Z-order 처리를 overlapped/popup 윈도우처럼 정교하게 해 주지 않기 때문이다.
child 윈도우라는 건 저렇게 제목 표시줄과 시스템 메뉴가 있는 윈도우가 아니라.. 그냥 리스트 컨트롤, 에디트 컨트롤, 버튼 같은 물건들이다. 에디트 컨트롤이나 버튼 같은 게 서로 겹쳐질 일이 있고 포커스를 받았을 때 Z-order가 바뀌어야 할 일이 도무지 있는가? 그렇지 않다는 것이다.

사용자 삽입 이미지

더구나 child 윈도우의 제목 표시줄은 Windows 8/10에서도 옛날 Windows Vista/7의 기본 테마 모양 그대로이며 업데이트도 안 돼 있다. 푸르스름하고 모서리가 둥근 그 시절 디자인 말이다. 그만큼 이쪽 외형은 마소에서도 관심이 없으며 더 지원을 안 하고 손을 놨다는 뜻이다.

저 상황에서 화면 잔상이 발생하는 걸 조금이라도 줄이려면 이 윈도우의 클래스에다가는 화면 refresh를 적극적으로 하라고 CS_HREDRAW|CS_VREDRAW 스타일을 줘야 하더라.
그리고 마우스 메시지를 받았을 때 SetWindowPos를 호출해서 이 창의 Z-order를.. HWND_BOTTOM으로 지정해야 하더라. 왜 top이 아니라 bottom인지는 모르겠다.

저것만 한다고 해서 모든 문제가 해결되는 건 아니다. 이런 시행착오를 겪어 보면.. MDI 프로그램에서 일개 child 윈도우인 문서창들이 나름 MDI client 영역 내부에서 껍데기 독립 윈도우인 것처럼 유연하게 처리되는 게, 절대로 그냥 저절로 되는 일이 아님을 짐작할 수 있다. 운영체제 API 차원에서 추가적인/예외적인 보정을 굉장히 많이 해 주는 덕분이지 싶다.

실제로 MDI를 구현하기 위해 사용되는 윈도우 프로시저는 DefFrameProc와 DefMDIChildProc로 감싸져 있으며, 키보드 전처리도 TranslateMDISysAccel로 따로 있다. 대화상자에 고유한 윈도우 프로시저와 키보드 전처리(IsDialogMessage)가 있는 것과 비슷한 맥락이다.

MDI 문서창들은 WS_EX_MDICHILD라는 extended 스타일이 지정돼 있다. 물론 우리야 CreateMDIWindow 함수나 WM_MDICREATE 메시지로 생성 요청만 하기 때문에 저 스타일을 직접 지정할 일은 없다.
내부적으로 뭔가 큰 의미를 갖는 스타일이지 싶은데.. 진짜 MDI 문서창이 아닌 임의의 child 윈도우를 생성할 때 저 스타일을 일부러 줘 보면 CreateWindowEx 함수의 실행이 실패한다. 그러니 쟤는 비록 헤더 파일에 선언은 돼 있지만 사용법과 의미가 제대로 문서화되지 않은 내부 API나 마찬가지이다.

그 밖에 WS_CLIPCHILDREN이라든가 WS_CLIPSIBLINGS, WS_EX_TRANSPARENT는 child 윈도우가 영역이 여럿 겹쳐 있을 때 창들을 refresh 하는 방식이나 성능을 좌우하는 옵션일 텐데 본인은 구체적인 의미나 차이를 잘 모르겠다. 평소에는 몰라도 전혀 상관 없지만 child 윈도우들을 MDI 문서창처럼 정교하게 다루기 위해서는 알아야 할 기능이지 싶다.
이런 창을 마우스로 클릭하면 WM_CHILDACTIVATE라는 메시지도 온다는데 본인은 태어나서 지금까지 한 번도 안 써 봤다. 저런 메시지가 있다는 사실도 처음 알게 됐다.

오늘 이야기의 결론은 MDI 형태의 프로그램을 밑바닥부터 직접 구현하는 건 대단히 어렵고 삽질스럽다는 것이다.. =_=;; child 윈도우를 popup/overlapped 윈도우처럼 다뤄 줘야 하기 때문이다.
그런 데다가 한 프로그램 창 안에서 여러 문서창을 다루는 것은 오늘날 같은 멀티 모니터 환경하고도 그리 어울리지 않는다.

그러니 마소 프로그램들의 경우, Word는 거의 20년 전부터 문서창을 프로그램 창처럼 따로 따로 생성하는 형태로 바뀌었으며 Visual Studio IDE도 문서창을 새 탭 아니면 새 창으로 자유자재로 만들 수 있게 바뀌었다.
그래도 그 정도보다는 규모가 작은 아담한 프로그램에게는 여전히 MDI만 한 대안이 없으니 클래식 레거시 MDI 기능도 오늘날까지 완전히 멸종하지는 않고 명맥을 유지하고 있다.

Posted by 사무엘

2020/06/20 08:35 2020/06/20 08:35
, ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1764

5. 항공모함

군대라는 게 작전 방식의 특수성과 차이로 인해 육해공 3군으로 나뉘곤 한다. 하지만 타 영역을 살짝 걸치는 병과도 조금씩 존재한다.
가령, 해병대는 육군과 해군의 조합처럼 보인다. 법적으로는 해군에 소속돼 있고 병도 지원자만 받지만.. 병의 의무 복무 기간은 육군과 동일하다. (우리나라 기준)
그리고 육군에서도 헬기 정도는 육군 항공대 명목으로 운용한다.

사용자 삽입 이미지

그런 것처럼 항공모함은 바다 위의 공군 기지이니 해군과 공군의 조합 같다. 항공모함은 1차 세계 대전이 끝나고 192~30년대 전간기 때 강대국들을 중심으로 존재 가능성과 필요성이 논의되었으며.. 덕분에 2차 대전의 태평양 전쟁에서 제대로 활약하게 되었다.

항공모함은 그 특성상 덩치가 정말 거대하며, 건조 비용이 억소리 나게 비싸고 운영하는 비용도 나라 등골 브레이커 수준이다. 하지만 이게 있으면 망망대해에서 전투기를 출격시켜서 억만 리 타지에서 깜짝 타격을 가할 수 있다. 잠수함이 몰래 쏘는 어뢰하고는 다른 차원으로 전투력의 레벨이 올라간다는 것이다.

옛날에 타이타닉 여객선은 내부에 별 시설이 다 있는 그냥 작은 도시, 작은 사회나 마찬가지였는데.. 오늘날은 대형 항공모함이 그러하다. 천조국의 기상이 깃든 니미츠 급을 예로 들면, 수천 명이 먼 바다에 나가서 오랫동안 근무하는 곳이니 안에 수영장도 있고 극장도 있고.. 내부에 별도의 번지수 주소가 있고 우편번호가 할당돼 있다. 항공모함 안에서 길을 잃는 건 말할 것도 없고, 그 안에서 잘 짱박혀서 탈영하는 것조차도 가능할 정도라고 한다.

작은 도시 안에 작은 원자력 발전소도 없으란 법이 없으니.. 이런 거대한 항공모함은 무식한 디젤 엔진 대신 원자력으로 움직인다.
다만, 항공모함은 배로서는 그렇게 거대함에도 불구하고 그래도 지상 공항에 비할 바는 못 되니.. 활주로의 길이가 부족하고 환경이 열악한 관계로 아무 군용기나 다 띄우지는 못한다. 그 항공모함의 규격에 맞게 제작된 함재기만이 이· 착함 가능하다. 이함할 때는 양력을 얻는 데 도움이 되라고 모선도 전속력으로 같이 전진해 주곤 한다.

그럼에도 불구하고 함재기가 항공모함의 활주로를 벗어나서 뜨는 걸 보면, 잠시 배 밑으로 추락하는 듯하다가 아슬아슬하게 다시 붕~ 뜨는 게 다반사이고.. 아예 못 뜨고 바다에 떨어지는 사고도 종종 난다. 배의 앞부분의 수면에 추락한 함재기는 같이 전진하던 모선과 부딪혀서 으스러진다.

함재기가 임무를 마치고 착함하는 것도 위험하긴 마찬가지이다. 아니, 착함이 더 어렵다.
한 직후에도 활주로를 오버런해서 도로 바다로 빠지지 않으려면 정신 똑바로 차리고 배와 함재기가 힘을 합쳐서 필사적으로 감속을 해야 한다. 이 정도면 공군과는 약간 다른 방식의 노하우가 필요해 보인다.

글쎄, 소말리아 해적이나 알 카에다, ISIL 같은 조무래기(?)들을 토벌하는 데 딱히 항공모함이 투입된 것 같지는 않은데 앞으로 태평양 전쟁 시즌 2 같은 사건이 벌어질 일이 있을지는 모르겠다.
사실, 그 옛날의 2차 대전 중에도 선진국들의 군 수뇌부와 군수업체에서는 선박이 아니라 잠수함이나 타 수송기를 기반으로 하는 항공모함(?)까지 구상한 적이 있다고 한다.

물론 그건 너무 무리수이니 실현되지는 않았다. 오늘날 기준으로는 잠수함에서 그냥 미사일만 쏘면 되지 굳이 인터셉터를 날릴 필요는 없을 것이다. 자동차 캐리어도 아니고 비행기 캐리어는.. 아직은 스타크래프트 캐리어에서나 가능한 일이다.
프로토스는 우주 항공모함을 굴리고, 테란은 우주 전함을 굴린다니.. 흥미롭다.

6. 아이스크림

천조국은 무려 1940년대 2차 세계대전 당시에...
저 멀리 태평양 전장에 가 있는 병사들한테까지 아이스크림을 보급으로 챙겨 줄 수 있던 유일한 나라였다. 아이스크림 제조 공장선을 운영했기 때문이다..;;
그 시절에 시원하고 달콤한 아이스크림은 병사들의 사기에 아주 긍정적인 영향을 줬으며, 다른 유럽군에서도 이걸 부러워했다고 한다.

사용자 삽입 이미지

전투기와 전함을 팍팍 찍어내고 원자폭탄 만들어 내고 적군의 암호를 몽땅 해독했다는 얘기뿐만 아니라 저런 소소한 병사 복지마저도.. 정~~말 대단하고 경악스럽지다. 천조국은 다른 나라들보다 몇십 년 더 앞서 갔다.

7. 인종 차별

1941년 말의 진주만 공습 때 '도리스 밀러'(1919-1943)라는 한 흑인 병사는.. 기습을 당해 죽거나 다친 사수들을 대신하여 즉석에서 전함에 비치된 대공용 중기관총을 조종하며 용감하게 응사했다. 심지어 일본 적기를 격추시키기까지 했다.

이게 대단한 이유는.. 저 사람은 취사병이었고, 지금까지 총 쏘는 훈련을 제대로 받은 적이 없었는데도 저 정도의 무공을 세웠기 때문이다. 마이클 베이의 "진주만"(2001) 영화에도 이 장면이 괜히 들어간 게 아니다.
마치 <15소년 표류기> 소설에서 흑인 견습 선원인 모코가 요리사 일을 하고 있다가 끝부분에서 침입자 악당을 대포 한 방에 때려잡는 장면과 비슷한 느낌이 든다.

병사들에게 아이스크림까지 나눠 주던 천하의 천조국도 1940년대에는 아직 인종 차별이 지금보다 훨씬 더 심하게 존재했다. 군대에서 흑인과 백인은 훈련을 따로 받았으며, 흑인 병사는 감히 전함의 기관총 사수 같은 보직을 받을 수 없었다.
그랬는데 도리스 밀러와 같은 사례가 생기면서 그런 유리천장은 차츰 없어지게 됐다. 그는 명예 훈장까지는 아니지만 해군 십자장을 받았고.. 올해 초엔 미국에서 새로 취역한 핵 항공모함에 이름도 붙었다.

6· 25 사변을 거친 뒤 베트남전 타이밍이 되자, 미군에서는 흑인이 백인 신병을 가르치는 훈련소 교관도 맡으며(검프! 입대한 동기가 무엇인가!! 네놈 IQ는 160은 되는가 보다!).. 풀 메탈 자켓에서는 교관이 대놓고 "나는 검둥이건 유대인이건 집시건 아무 차별 안 한다. 여기서는 네놈들은 다 똑같이 쓸모없기 때문이지!"라고 능력 위주의 평등을 표방한다. 그 정도로 분위기와 방침이 바뀌었다.

1970년대 말에 중국에서는 마오 쩌둥이 '흑묘백묘' 운운하면서 "고양이는 색깔 불문하고 쥐만 잘 잡으면 된다"라는 논리를 펴는 지경이 되었다. 이건 공산주의건 자본주의건 경제만 살릴 수 있다면 체제를 가리지 않겠다는 실용주의를 표방한 말이었다.
미국은 체제는 이미 건전하니까 걱정할 필요 없고, 인종에 대해서 '흑묘백묘'가 아니라 아예 '흑인백인 인종무관' 실용주의가 나중에 등장하게 된 듯하다. "흰둥이건 검둥이건 적군만 잘 잡으면 된다"라고..

8. 대테러부대

경찰과 군대에는 정규전(경찰은 일반적인 시위 진압이나 범죄자 검거. 군인은 일반적인 야전 전투)을 수행하는 대다수의 일반적인 경력· 병력이 있는 한편으로, 뭔가 마이너하고 특수한 임무를 수행하는 부서도 있다.
가령, 일반 경찰이 담당하기에는 어려운 규모의 무장 테러리스트를 잡는 부대 말이다. 이런 애들을 잡기 위해서 무슨 탱크나 대포나 전투기를 동원할 필요는 없음이 명확하다.

이럴 때는 이런 임무를 위해 시꺼먼 복장을 하고 별도의 훈련을 받은 경찰 내지 군대 소속의 대테러부대가 투입된다. 이런 부대는 정체성이 경찰과 군대 어느 것에 딱 정확하게 떨어지지는 않는 것 같다. 아예 대놓고 특전사나 UDT 같은 급도 아니기 때문이다. 경찰특공대, 미국 SWAT.. 그런 쪽이다. (뭐, 그렇다고 군 특전사에서도 대테러임무를 수행하지 않는다는 얘기는 아님)

사용자 삽입 이미지

사실, 대테러부대라는 개념이 등장한 것은 생각만치 오래되지 않았다. 1972년 뮌헨 올림픽 때 독일(서독) 정부가 괜히 허둥대고 삽질한 게 아니었으며, 인질들이 전원 죽는 비극이 괜히 벌어진 게 아니었다. 법적 문제 때문에 정규군을 함부로 투입할 수 없었으며, 반대로 독일 경찰은 이런 상황에 대한 대처 매뉴얼이 갖춰져 있지 않았다. 북괴의 연이은 테러에 이골이 나 있던 한국 같은 나라나 극도의 통제된 분위기 하에서 치안이 덤으로 갖춰지는 정도에 불과했다.

경찰 소속의 대테러부대는 무력만 강화한 '경찰'이기 때문에 자국민을 최대한 보호해야 하고, 악당들도 사살보다는 생포하는 것을 지향해야 한다. 그러나 작전 지역이 국내가 아니거나 악당이 수가 많고 화력이 강하거나.. 아예 자국민이 아니다거나 하면 이들을 상대하는 공권력도 경찰이 아닌 군대 소속으로 바뀌게 된다.

참고로 지난 2009년 용산 철거 현장 참사 때 시위 진압을 위해 투입됐다가 순직한 사람들은 경찰특공대 소속이었다. 시위대가 무슨 전문적인 무장 테러리스트는 아니고, 그렇다고 통상적인 시위 현장 같은 전투경찰을 투입하기에는 장소가 위험하니 경찰특공대가 적절한 대응이었지만.. 그래도 안타깝게도 화재로 인한 희생자가 발생했다.

9. 토크멘터리 전쟁사

개인적으로 유튜브에서 연재되었던 토크멘터리 전쟁사 시리즈를 재미있게 봐 왔다.
국방부에서 유치한 애국심(?) 고취용으로 오글거리는 어용 관제 군대 홍보물만 만들 줄 알았더니 의외로 이런 재미있고 유익하고 수준 높고 건전한 교양 프로도 만들어 왔다. 그런데 왜 갑자기 종영했는지 이유를 모르겠다. 배후 음모 없이 정말로 단순한 소재 고갈 때문일까?

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

이놈의 친중종북 좌익 빨갱이 정권의 마음에 안 드는 너무 건전한 애국 메시지 때문에 짤린 것이 아니기를 바랄 뿐이다.

Posted by 사무엘

2020/06/17 08:35 2020/06/17 08:35
, , , , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1763

1. 옛날 냉병기 시절

옛날에 총(개인 화기)이라는 게 아직 없어서 전쟁터에서 갑옷 입고 투구 쓰고 냉병기로 적군을 직접 때리고 베고 찔러 죽이던 시절에는 군인과 무인의 차이가 지금보다 훨씬 작았다. 지금은 총검술 같은 부류가 제식처럼 거의 보여주기 스킬 아니면 특전사· 공작원의 영역에 머물고 있지만 그때는 그게 지금 군인의 사격술이나 수류탄과 동급으로 군인 본연의 임무를 수행하는 스킬이었을 것이다.

그때는 손가락 하나 방아쇠에 걸어서 까딱하는 것만으로 적군을 죽일 수 있는 마법 같은 도구가 존재하지 않았다. 그러니 죽음을 두려워하지 않고 전열을 갖춰 적진을 향해 용맹스럽게 닥치고 돌격하는 게 매우 중요했다. 화살..?? 정도는 그래도 갑옷과 방패로 그럭저럭 막을 수 있고, 기관총 참호에 비할 바는 아니었다.

그때는 기예의 달인이 벌이는 일당백의 비중이 컸으며 그게 군대의 사기에도 큰 영향을 끼쳤다. 지금의 관점에서야 무모한 개죽음처럼 보이지만, 신라 시대에 괜히 '관창' 같은 화랑을 혼자 희생시킨 게 아니었다.
심지어는 개떼같이 다 나와서 싸울 필요 없이, 각 진영의 대표 장수가 나와서 일대일로 결투를 벌인 결과만으로 전투의 승부를 가르는 일도 있었다.

성경에는 다윗과 골리앗 대결이 아주 유명한 예이다.
옛날에 "태조 왕 건" 드라마에서도 신라 박 술희와 후백제 애술의 결투씬이 시대적 배경과 이유가 있어서 들어간 셈이다.
그러니 영화 "봉오동 전투"도 총격전에다가 일대일 검술 대결을 어설프게 흉내 내서 집어넣었던데.. 저건 배경이 무려 20세기 근현대이니 현실성이 없다.

중일 전쟁 때 일본이 저지른 전쟁 범죄 중에 "100인 참수 경쟁"이란 게 있었다. 그게 일본군이 무슨 중세 판타지 급의 백병전을 벌여서 무장한 적군을 칼 한 자루만으로 순삭한 것이라면 아주 용맹스러운 무공이겠지만.. 실제로는 힘없는 민간인과 포로를 상대로 그런 짓을 한 것이니 그냥 범죄이고 상 또라이 싸이코 같은 짓일 뿐이었다. 심지어 신문 기사를 썼던 기자조차도 "엥..? 적군을 죽인 게 아니었어요?" 얘기를 나중에 듣고는 기겁했었다고 한다. (목적어 생략.. -_-)

자, 저런 낭만(?)이 있던 옛날과 달리..
지금이야 총기 화기의 성능이 워낙 좋기 때문에 그 어떤 체격 좋고 두꺼운 갑옷을 입은 병사라도 총에 맞으면 그대로 쓰러지고 죽는다. 소총탄을 막을 정도로 무겁고 두꺼운 장갑은 기계류에나 장착할 수 있지, 그걸 사람이 걸쳤다면 제대로 활동이 가능하지 않을 것이다.

이런 이유로 인해 오늘날 전쟁터에서 사격이 시작되면 제아무리 용맹한 군인이라도 일단은 닥치고 엎드리고 엄폐하고 숨어야 한다. 이것이 냉병기 시절과의 큰 차이점이다.
또한, 지금은 병사들과 같이 "돌격 앞으로~!"라고 외치고 뛰어드는 건 소대장 수준의 초급 장교의 몫이지, 더 높으신 분들이 야전에서 병사들을 직접 지휘하지는 않는다. 최고위 장수 장군 내지 아예 왕이 솔선수범해서 말 타고 앞장서서 돌격하던 옛날과는 많이 다르다.

오늘날 무인과 군인은 화가와 사진가만큼이나 영역이 달라져 있다.
사진 찍사는 무슨 붓이나 연필이나 물감을 능숙하게 다룰 필요는 없으며, 반대로 카메라의 기본 개념과 사용법을 잘 숙지해야 한다(소총 분해와 조립, 조준 따위).
하지만 사진을 잘 찍기 위해서는 색깔과 공간 배분· 구도에 대한 감이 여전히 필요하니, 사진가도 미술의 영역을 완전히 벗어났다고 볼 수는 없을 것이다. 무인과 군인의 관계도 이와 비슷하다.

사용자 삽입 이미지

* "라라 크로프트와 빛의 수호자" 게임의 컷씬에서 라라가 몇천 년 전의 옛날 장수인 '톨텍'에게 소총 사용법을 가르치는 장면이 문득 떠오른다. 저 장면에서 톨텍은 총열이 무슨 칼날이고, 개머리판 부분이 손잡이인 것처럼 생각했나 보다. ㅎㅎ

2. 근현대의 주요 전쟁사

19세기

  • 크림 전쟁: 나이팅게일, 최초의 종군기자와 전장 사진
  • 남북전쟁: 국제전이 아니라 일개 나라 안 내전에 불과했지만.. 천조국은 내전 하나도 유럽을 능가하는 당대 최첨단을 달리는 수준으로 치렀다.
    • 후미장전식 총기가 등장하면서 머스킷 전열보병 전술이 몰락하고 개인 각개전투 전술이 등장. 저격수도 등장.
    • 엄폐가 중요해지면서 예복과 전투복의 구분이 생김. 전투복은 100년 전 독립전쟁 시절보다 훨씬 더 저채도의 칙칙한 색상으로 바뀜
    • 병사들의 모자 크기(?)와 헤어스타일도 옆머리까지 꼬불꼬불 말던 시절보다는 짧아짐. 그래도 장교들은 여전히 수염이 덥수룩..;;
    • 초보적인 수준의 철갑선과 잠수함이 출현했고 찔끔찔끔 교전도 했음.
    • 철도를 이용한 대규모 병참 보급과 전면전이 실현됨.
      비행기와 탱크만 없는 1차 세계대전에 가까운 정도였다. 아직 내연기관이 아직 발명되지 않았으니..

사용자 삽입 이미지사용자 삽입 이미지

(미국 독립전쟁 vs 남북전쟁의 차이..)

남북전쟁이 끝난 게 1865년, 제너럴 셔먼 호 사건은 1866년, 그리고 신미양요는 한~참 뒤인 1871년이었다.
조선과 미국이 거리가 워낙 멀기도 하고, 미국도 전쟁 피해를 복구하느라 정신 없었기 때문에 신미양요가 저렇게 늦게 벌어진 것이다. 그런데 이 와중에 미국에 대한 조선의 인식은 정말 한심하기 그지없었다.

고종: 미리견(미국)이라는 나라는 어떠한 나라인가? (1871년 4월 어전회의에서..)

영의정 김 병학 (지금으로 치면 거의 국무총리와 비슷!!): 미리견이라는 나라는 화성돈(워싱턴)이라는 촌장이 영길리(영국)라는 나라와 교섭하면서 성곽과 연못을 개척해서 세운 작은 부족국가라고 지도에 나와 있네요.
얘들은 바다를 왕래할 때 약탈하는 습성이 있는 날강도 해적떼입니다. 일체의 교역 따위 할 필요 없구요, 만약 교역을 하게 되면 우리나라(조선) 국체를 보전할 수 없을 것입니다.

고종: 흠.. 그렇다면 우리가 저 코쟁이 오랑캐들과 교역하면 요사스러운 잡학들이 유입되어 공자의 예법이 무너질 것이고 가정이 무너지고 사회가 무너지겠구나.


대륙 횡단 열차를 굴리고, 세계에서 거의 최초로 후장식 총기를 도입하여 유럽보다도 앞선 방식으로 전투(남북전쟁)를 벌였던 엄청난 나라가.. 한낱 공자의 예법도 모르는 요사스러운 해적 오랑캐 내지 왜구 정도로 전락했다. ㅋㅋㅋㅋㅋㅋㅋㅋ

이웃 일본은 네덜란드를 거쳐서 외국어 통번역가부터 잔뜩 양성해서 서양 문물을 미친 듯이 받아들이면서 근대화 중이었는데.. 조선은 저 지경이었으니 안 망한 게 더 이상하지..
참고로, 야사에 따르면 고종이 신하들과 나눈 다른 대화로는 저 때로부터 30년쯤 뒤에 철도가 개통했을 때 "기차가 더 빠를까, 전차가 더 빠를까?"도 있다. 휴우~

20세기

  • 1차 대전: 참호전, 독가스, 탱크, 초보적인 수준의 전투기
  • 2차 대전(연합군): 역대 최대 규모의 해전.. 대형 전함, 뇌격기, 잠수함과 항공모함과 함재기, 수직 강하 폭격, 그리고 끝물에 개발되거나 등장하기 시작한 핵무기와 미사일, 제트기.
  • 6· 25 한국 전쟁(UN군): 인류 역사상 가장 많은 나라가 자그마한 듣보잡 작은 나라 하나를 도와주기 위해 결집함. 시기적으로 매우 특수한 배경 덕분에 가능했지, 이런 사례는 전무후무함. 이념 각축장 대리전 성격이 강했음.
  • 베트남전: 밀림을 날아다니는 헬리콥터, M16 소총. 언론이 조장한 반전 여론이 매우 강해졌음. 프래깅(상관 살해)이 본격적으로 거론되고 문제시됨
  • 걸프전(다국적군): 전투기와 미사일로 속전속결. 수송기도 맹활약했음. 전투 장면이 TV로 생중계됨.

중동 전쟁 쪽은 내가 딱히 기억하거나 아는 게 없다.;;

본인 생각에 역사는 국사와 세계사를 통합해서 가르치고 시험 문제도 그런 식으로 낼 필요가 있다고 본다.
하지만 현재 교사의 양성 과정과 교육과정을 감안하면 그건 물론 쉽지 않을 것이다. 더구나 역사의 모든 것을 동일 선상에서 객관적으로 봤다간 국뽕이고 동심이고 다 박살나 버릴 것이기 때문이다. 특히 18~19세기부터 벌어지는 동· 서양의 격차는 자괴감 들기에 충분할 것이다.

하지만 앞으로 악질 무단횡단자에게 100:0 판정이 늘어나는 것만큼이나 공교육에서 역사에 대한 인식도 갈수록 더 합리적인 방향으로 바뀌게 될 것이다. 언젠가는 말이다.

3. 기관총

그냥 총도 아니고 총알을 분당 수백 발씩 드르륵 갈겨 주는 기관총이라는 건 후장식 총기에 이어서 등장한 정말 획기적인 발명품이었다.
처음에는 대포처럼 크고 무거운 공용화기--혼자 간편하게 들고 다닐 수 없고 여러 명이 운용-- 형태로 먼저 등장했다가 나중에 더 작은 개인화기 버전도 등장하게 됐다.

물론 요즘은 일반 보병이 사용하는 일개 소총도 기관총 같은 자동 연사 기능이 있으며(방아쇠를 당기고 있으면 알아서 드르륵~), 심지어 소총탄 대신 권총탄을 갈기는 기관단총 같은 물건도 있다.
하지만 기관총이란 게 이름에 걸맞게 오랫동안 연사가 가능하려면 발열 관리를 위해 냉각 계통이 필요하고, 총구도 여러 개를 돌려 쓸 수 있어야 하는 등 단순 자동소총에는 필요하지 않은 추가적인 설계가 필요하다.

그러니 이것저것 오늘날까지도 기관총은 용도별로 경/중, 개인용과 공용의 체급 구분이 존재한다.
일반 소총이 정밀· 정확도 쪽으로 더 발전하면 저격수가 사용하는 망원경 달린 커다란 저격 소총으로 바뀌고(스타 고스트..??), 연사력 쪽으로 더 발전하면 M60 같은 경기관총으로 바뀌는 것 같다(둠 2 chaingunner).

모든 기관총이 그런 건 아니지만 기관총이라 하면 (1) 여러 총열이 뱅글뱅글 돌아가는 묘사가 많다.
그리고 급탄을 탄창 단위로 탄창 내부의 스프링에 의지해서 하는 게 아니라 (2) 수십· 수백 발의 총알이 일렬로 연결되어 들어간다. 이건 방아쇠만 당기고 있는다고 그냥 되는 게 아니다. 그렇기 때문에 기관총은 작동을 위한 별도의 동력이 필요하다.

사용자 삽입 이미지

이렇게 그냥 총이 아니라 넘사벽급의 화력을 내는 기관총은 무력의 종결자에 등극했다. 기관총이 없는 군대가 기관총을 보유한 군대를 상대로 싸워서 이길 가능성은.. 가히 0이 됐기 때문이다.

이로 인해 19세기엔 본격적으로 제국주의가 세계에 손길을 뻗치게 됐다.
오죽했으면 개틀링 기관총을 발명했던 리처드 조던 개틀링은 기관총 덕분에 앞으로 군대는 병사가 덜 필요해도 될 것이고, 더 나아가 너도 나도 기관총을 들고 있으면 다들 무서워서 전쟁을 할 엄두를 못 내게 될 것이라고.. 그렇게 역설적인 평화가 찾아올 것이라고 참 순진하게 예상했었다.

처음에는 기관총이 "유럽 vs 미개한 식민지" 이런 형태로 쓰였다. 그때야 일방적인 관광 플레이가 가능했다. 하지만 유럽 사람들은 얼마 못 가 동급인 자기들끼리 기관총 vs 기관총 형태로 싸우게 됐다. 1차 세계대전 참호전 말이다.
이때는 전략 전술이 기술 발달을 따라가지 못해서 병사들이 생지옥 속에서 끔찍한 희생을 치러야 했다. 기관총으로 철통 방어하는 참호를 돌파하기 위해서 결국 탱크, 군용기, 독가스 따위가 등장하게 됐다.

무서워서 전쟁을 안 하게 될 정도로 너무 강한 캐사기급 무기라는 개념은 다이너마이트의 발명자인 알프레드 노벨도 생각하고 있었다고 한다. 기관총 분야와 폭탄(!!) 분야에서 각각 저렇게 생각하는 엔지니어가 있었다는 게 흥미롭다.
하지만 그런 것은 인류가 20세기에 세계 대전급의 전쟁을 두 번이나 겪고 핵무기라는 것까지 발명된 뒤에야 현실이 되었다. 그 끔찍한 기관총조차 아득히 능가하여 화약 폭발력이 아니라 원자력 정도는 건드리는 경지가 돼서야 말이다.

4. 물과 뭍(!!)에서 폭발 무기의 종류

뭍이라는 말을 참 오랜만에 꺼내 보네.. 한 8~90년대까지만 해도 어린이용 동화책에서도 볼 수 있던 단어였는데 2000년대 이후로는 진짜 국어사전에서나 볼 수 있는 사어가 된 것 같다.

  • 목표물을 향해 날아간 뒤에 폭발: 각종 포탄(육지· 공중), 수류탄, 미사일 또는 어뢰(수중). 자체 추진이나 유도 기능까지 필요하기 때문에 비싸고 크기 대비 폭발 에너지가 적다.
  • 반대로 목표물이 근처에 와서 뭘 건드려 주면 폭발: 지뢰(육지) 또는 기뢰(수중). 이런 무기는 통제가 안 되어 "아무나 맞혀라"가 돼서는 매우 곤란하다.
  • 아래로 자유 낙하하면서 폭발: 항공포탄(육지) 또는 폭뢰(수중). 부가적인 설비 없이 순수하게 폭약의 비중이 크기 때문에 화력이 좋다.

옛날에는 화포로 배를 완전히 부숴서 격침시키기가 어려웠기 때문에 폭약을 싣고 불 붙인 작은 무인선을 적함에다가 접근시키고 충돌시켜서 펑~! 하는 저그 스커지 같은 전술도 쓰였었다.

내 기억으로 제너럴 셔먼 호를 격침시킨 방식도 그랬는데.. 거기는 바다가 아니라 대동강이고 배의 동선에 제약이 심했기 때문에 그런 전술이 가능했다.

Posted by 사무엘

2020/06/14 08:33 2020/06/14 08:33
, , ,
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1762

« Previous : 1 : 2 : 3 : 4 : 5 : ... 165 : Next »

블로그 이미지

철도를 명절 때에나 떠오르는 4대 교통수단 중 하나로만 아는 것은, 예수님을 사대성인· 성인군자 중 하나로만 아는 것과 같다.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2020/07   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Site Stats

Total hits:
1407209
Today:
43
Yesterday:
497