예전에 글로 쓴 적이 있듯이 본인은 <놀라운 주의 은혜>(Wonderful Grace of Jesus)라는 찬양곡을 굉장히 좋아한다.

작사· 작곡자인 할도 릴레나스는 본인이 기억하는 위대한 노르웨이 출신 3인 중 하나이다.
5차 이상의 방정식은 대수적으로 풀 수 없다는 것을 증명한 닐스 아벨, 세계 최초로 남극점을 정복한 로알 아문센과 더불어서 말이다. (단, 할도 릴레나스는 어린 나이에 미국으로 이민을 간 뒤 거기서 귀화해서 살았기 때문에, 정확히 말하면 노르웨이계 미국인이긴 하다.)
곡에 대한 찬사는 그때도 실컷 늘어놓았으니 이 글에서 또 반복하지는 않겠다.

이 곡은 마지막 단에서 “O magnify the precious name of Jesus! Prase His Name!”이라는 가사로 끝나고 “magnify the precious” 마디에서는 임시표 #으로 인해 알토 및 베이스의 음이 반음 올라간다. 후렴 직전의 마지막 단에서 이 곡의 주제라 할 수 있는 “for the wonderful grace of Jesus reaches me” 가사가 나오는 곳과도 비슷한 코드(chord)이다.

사용자 삽입 이미지

아래음을 반음 올리지 않았으면 소프라노와 알토 사이의 음정이 단7도와 완전8도였을 텐데 임시표로 인해 음정이 반음 내려감으로써 이들은 모두 감음정으로(감7, 감8) 바뀐다.
비전공자인 관계로 난 정확하게는 잘 모르겠지만, 증/감음정은 통상적인 완전/장/단음정에 비해 듣는 사람을 긴장시키고 자극을 주는 효과가 더 큰 것 같다. 심지어 Looking for You에도 곡 전반부가 끝날 때 완전 짜릿한 감음정 화음이 나온다.

그런데 여기서 기보법과 관련하여 궁금한 게 하나 생겼다.
그림을 보면 아시겠지만, 알토는 '레'에 #이 붙었기 때문에 반음 올린 검은 건반으로 쳐야 한다. 하지만 소프라노의 '레'는 원래의 흰 건반으로 쳐야 한다. 그래야 감음정이 나온다.
내가 알기로 올림표, 내림표, 제자리표 같은 임시표들의 scope은 해당 마디가 끝날 때까지이다. 그리고 옥타브를 불문하고 어떤 곳에서든 해당 음은 모두 임시표를 적용하여 쳐야 한다.

자, 이 임시표의 scope은 소프라노/알토 같은 화음 파트까지 초월하여 적용되는 것일까? 아니면 따로 적용되는 것일까?
위의 그림처럼 알토 파트의 '레'에 #을 붙였다 하더라도, 나는 저렇게만 악보를 그려 놓으면 원칙대로라면 소프라노의 높은 '레'도 #이 적용되지 않나 그렇게 생각했다.

실제로 컴퓨터용 악보 편집 프로그램인 Noteworthy Composer는 내 생각대로 악보를 재생했다.
그러나 학교에서 음악을 가르치는 본인의 모 지인은, 임시표의 scope은 파트별로 따로 가는 게 맞으며 그 내용을 음악 교사 지도서에서도 본 적이 있다고 증언했다. 그럼 도대체 뭐가 맞는 거지?

고민 끝에 동일곡의 다른 악보들을 찾아 봤다.
곡의 퀄리티에 비해서 국내에서는 생각만치 유명하지 않은 게 유감이다만,
이건 워낙 전세계적으로 사랑받는 유명한 찬양이기 때문에 구글링만 하면 악보를 찾는 건 어렵지 않다.

단, 문제는 대부분이 유료로 판매하는 악보라는 점.
유료 악보 사이트들은 첫 페이지의 내용은 대부분 견본 명목으로 보여주지만, 내가 원하는 부분은 불행히도 곡의 끝부분이다. 그래서 다른 예를 찾는 데 애로사항이 꽃펴 있었다.
오랜 검색 끝에 악보를 딱 하나 어렵게 구했는데..

사용자 삽입 이미지

얘는 본인이 제기했던 문제를 의식해서인지 소프라노의 높은 '레'(pre-)에 제자리표가 적혀 있다.
그런데 이 방식을 아주 곧이곧대로 삐딱하게 해석하자면, 반대로 그 다음의 알토의 낮은 '레'(-cious)도 제자리표를 적용하여 쳐야 한다. 즉, 이 표기도 논리적으로 완전히 엄밀하지 못하다.

그러니 Noteworthy Composer는 이렇게 임시표를 일일이 지정해 줘야 원곡대로 음이 나온다.

사용자 삽입 이미지

이걸 보면, 악보를 읽는 것도 언제나 컴퓨터처럼 절대적인 원리원칙이 있는 게 아니라 가끔은 '유도리', 휴리스틱이 동원되는 부분이 있는 것 같다.
표기가 엄밀하지 않은 두리뭉실한 예가 심지어 수학에도 있다. 6/2(1+2) 내지 48/2(9+3)의 계산값이 무엇이냐 하는 게 아주 큰 논란이 된 적이 있지 않았던가?

Posted by 사무엘

2013/08/17 08:20 2013/08/17 08:20
, ,
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/867

수학에서 행렬은 굉장히 흥미로운 물건이다.
행렬끼리의 덧셈이나 행렬의 상수배는 어려울 게 없는 쉬운 연산이지만, 행렬끼리의 곱셈은 그렇지 않다. 행렬 A와 B사이의 곱셈은 A의 가로 크기와 B의 세로 크기가 같아야 정의되며, 새로 생기는 행렬의 크기(dimension)는 반대로 B의 가로 크기와 A의 세로 크기로 결정된다.

이런 특성상 행렬의 크기는 세로, 즉 row부터 먼저 써 주는 게 직관적이다. 세로 x줄 가로 y줄짜리 x,y 행렬과 y,z 행렬의 곱은 x,z 크기가 된다고 표기가 가능하기 때문이다.

또한, 앞에 있는 행렬과 뒤에 있는 행렬이 원소가 서로 연산되는 방향이 다르기 때문에 행렬의 곱셈은 교환 법칙이 성립하지 않는다. A×B가 일반적으로 B×A와 같지 않다는 뜻. 그러나 결합 법칙은 성립한다. (A×B)×C와 A×(B×C)는 동일하므로, 같은 방향만 유지하면 아무 순서로나 행렬을 곱해 줘도 된다.

그래서 이것과 관련하여 흥미로운 문제가 하나 있다.
크기가 들쭉날쭉 다르지만 순서대로 곱셈은 가능한(= 인접한 행렬끼리는 앞 행렬의 가로 크기와 뒤 행렬의 세로 크기가 일치) N개의 행렬들이 있다. 우리는 이들을 모두 최소의 계산량만으로 곱하고 싶다.

역행렬이나 행렬식 값을 구하는 비용에 비할 바는 아니겠지만 행렬의 곱셈은 꽤 비싼 연산이다. 일반적으로 x,y 크기와 y,z 크기의 행렬을 곱하는 데는 원소들간에 x*y*z회의 곱셈이 필요하다. n 크기의 정사각행렬의 경우 이는 n^3으로 귀착된다. (뭐, 분할 정복법을 활용하여 n^2.x승으로 줄이는 복잡한 알고리즘이 있긴 하지만 이것은 초기 준비 오버헤드가 굉장히 크기 때문에 행렬이 무진장 클 때에나 의미가 있다.)

예를 들어 A는 4*2 크기, B는 2*3 크기, C는 3*1크기의 행렬/벡터라고 치자.
이것을 A*B*C 순으로 진짜 순서대로만 곱하면 A*B를 곱하는 데 4*2*3=24회의 곱셈이 동원되고, 그 결과물인 4*3 행렬을 C와 곱하느라 12회의 곱셈이 필요해서 계산량은 총 36이 된다.

사용자 삽입 이미지

그러나 B*C부터 먼저 곱한 뒤 A를 거기에다 곱하면 열수가 적은 C 덕분에 B*C는 겨우 6회 만으로 끝나고, 거기에다 4*2*1=8회의 곱셈이 추가되어 총 14의 계산량만으로 A*B*C를 구할 수 있다. 답은 결국 똑같은데도 (AB)C보다 A(BC)가 훨씬 더 나은 전략인 것이다.

신기하지 않은가? 그래서 이런 configuration을 일반화하여 {4, 2, 3, 1}이라고 표현하고, 더 나아가 n>=3인 n개의 자연수라고 치자.
이 입력에 대해서 최소 곱셈 횟수와 실제 곱셈 순서를 구하는 것이 문제이다.

정올 공부를 한 분이라면 아시겠지만, 이것은 다이나믹 프로그래밍, 혹은 동적 계획법이라는 알고리즘 설계 방법론을 학습하면서 예시로 다뤄지는 아주 기본 문제이다. 다이나믹 프로그래밍은 다음과 같은 경우에 유용하다.

  • 전체 구간에 대한 최적해가 부분 구간의 최적해에다가 추가 연산을 함으로써 구하는 게 가능하다.
  • 그리고 한번 답을 구해 놓은 부분 구간의 최적해는 더 바뀌지 않는다는 게 보장된다.

이 행렬의 곱셈 문제에서 가장 작은 구간은 3이며, 이때의 답은 그냥 두 말할 나위 없이 세 정수의 곱이다.
그리고 전체 구간 [1..n]에 대해서 최적해는 바로..

  • 1을 [2..n]과 곱했을 때의 계산량 (맨 앞의 행렬과 나머지)
  • [1..n-1] 과 n을 곱했을 때의 계산량 (앞의 행렬들과 맨 뒤의 행렬)

중 더 작은 놈이라고 간주하면 된다.

그럼 [2..n]과 [1..n-1]은? 각 구간에 대해서 또 동일한 해법을 적용하여 재귀적으로 구간을 계속 쪼개 나가는 것이다. 언제까지? 구간의 길이가 3이 될 때까지 말이다.
이렇듯, 다이나믹 프로그래밍은 재귀성을 띠고 있다. 이것은 수학적으로는 점화식으로 표현되며, 코드로는...

const int dat[]={4,2,3,1,2,6,5,8,3,2}; //배열

int GetMin(int f, int t)
{
    int i=t-f, j;
    if(i<3) return 0; //should not reach here
    else if(i==3) return dat[f]*dat[f+1]*dat[f+2]; //obvious case
    else {
        //사실은 i가 3인 경우도 이 조건의 특수한 케이스라고 간주할 수 있다.
        //단지 GetMin값이 0이고, t-2와 f+1이 동일한 값이 될 뿐이다.
        i=GetMin(f,t-1) + dat[f]*dat[t-2]*dat[t-1]; //(A*B)*C
        j=GetMin(f+1,t) + dat[f]*dat[f+1]*dat[t-1]; //A*(B*C)
        return i<j ? i:j;
    }
}

int answer = GetMin(0, 10);

과연 이렇게 하면 답이 구해질까?
프로그램을 돌려 보면, 10개의 정수로 표현된 9개의 서로 다른 크기의 행렬들의 곱은..
146회의 곱셈만으로 계산이 가능하다고 나온다.

구체적인 계산 순서는 이러하다.

4 (2 (3 (((((1 2 6) 5) 8) 3) 2)))

이 경우, 각 단계별 계산 순서는 다음과 같이 되기 때문에,

x y z x*y*z
1 2 6 12
1 6 5 30
1 5 8 40
1 8 3 24
1 3 2 6
3 1 2 6
2 3 2 12
4 2 2 16

곱을 전부 합하면 진짜로 146이 맞다!
참고로, 이런 전략을 쓰지 않고 진짜 FM대로 앞에서부터 뒤로 행렬을 순서대로만 곱하면 계산량은 최적해의 세 배를 넘는 492에 달한다.
이것이 바로 알고리즘이 만들어 내는 차이이다.

다이나믹 프로그래밍에는 반드시 수반되어야 하는 작업이 있다. 바로 예전에 구했던 구간 계산값들을 배열에다 저장해 두는 것이다. 그렇게 하지 않으면, 마치 피보나치 수열을 f(x) = f(x-1)+f(x-2)라고만 구현하는 것만큼이나 계산량이 n이 커짐에 따라 기하급수적으로 커지게 된다. 그것도 예전에 한번 했던 똑같은 계산을 매번 반복하느라 말이다.
그래서 이 방법을 사용한 알고리즘은 대체로 시간 복잡도와 공간 복잡도가 모두 O(n^2)이 된다. 시간 복잡도가 지수함수에서 그래도 다항함수로 바뀐다.

구간별로 최적해 자체뿐만이 아니라 구간 분할을 어떻게 했는지에 대한 정보도 따로 보관해 놓으면 아까와 같은 구체적인 계산 순서도 그 정보를 추적함으로써 구할 수 있다.

정올에서 다이나믹 프로그래밍의 중요성은.. 두 말하면 잔소리이다.
본인은 20세기에 정올 공부를 한 세대인지라 그 시절의 문제밖에 기억을 못 한다만..

1997년 한국 정보 올림피아드의 고등부 3번인 벽장 문제는 최적해를 구하고자 할 경우 공간과 시간 복잡도가 O(n^3)인 다이나믹 프로그래밍으로 풀 수 있다. 이 때문에, 16비트 환경임을 감안하더라도 이 문제는 입력의 범위가 작다. 벽장의 개수와 벽장 사용 순서가 최대 겨우 20까지밖에 안 올라가는 소규모이다. 실용적인 상황에서는 이런 부류의 시뮬레이션 문제는 휴리스틱이 동원되어야 할 것이다.

이 외에,

1999년 고등부 1번 검은 점 흰 점 연결,
2000년 고등부 1번 수열 축소

도 다이나믹으로 푸는 문제이다.
국제 정보 올림피아드의 기출 문제 중에는
10회(1998)의 둘째 날 마지막 문제인 폴리곤 게임,
11회(1999)의 첫째 날 첫 문제인 꽃 진열이 기억에 남는다. 특히 꽃 진열은 상당히 기초적인 다이나믹 프로그래밍 문제로, <날개셋> 타자연습의 문장 정확도 측정도 이와 거의 같은 발상의 알고리즘을 사용하고 있다.

난 이 바닥은 손 놓은 지가 너무 오래 돼서 기억이 가물가물하다.
정보 올림피아드에서 경시와 공모는 마치 과학과 공학, 어학과 문학의 차이와 비슷한 것 같다.

Posted by 사무엘

2013/08/14 08:34 2013/08/14 08:34
, ,
Response
No Trackback , 8 Comments
RSS :
http://moogi.new21.org/tc/rss/response/866

철도 광고: 나도 KTX 탈 걸

1.

요즘 철도 내지 코레일 광역전철 구간을 이용하는 분들은 차내 모니터에서 “나도 KTX 탈 걸”이라는 테마의 CF 동영상을 본 적이 있을 것이다. 두 여배우가 누구인지도 몰랐는데 나중에 검색해 보니 에일리와 신 보라이다. 열차 안에서는 음성이 안 나오니 대화 내용은 전적으로 자막으로만 봐야 했는데 음성은 역시 인터넷을 통해서 들을 수 있었다.

4시간 후에 부산에서 생방송 촬영이 있는데 에일리는 서울에서 자가용을 끌고 가지만 교통 정체에 막혀서 지각하고, 언니인 신 보라는 공항 철도+KTX를 이용해서 빠르고 편안하게 간다는 내용이다.
(여담으로, 머지않아 아예 공항 철도에까지 KTX가 그대로 들어갈 예정이긴 하지만, 개인적으로는 별로 좋은 정책은 아니라 생각된다. 서울 역까지 찍었다가 다시 부산 방면으로 내려가는 건 동선이 너무 안 좋아서.. 정말 광명 역에서 인천 공항으로 가는 철길이 뚫리긴 해야 한다.)

철도청이 코레일이라는 기업으로 바뀐 뒤부터 확실하게 바뀐 것이 무엇이냐 하면, 대외 광고가 늘었다는 점이다. “당신을 보내세요”라는 캐치프레이즈도 비슷한 시기에 만들어진 것이다.
그 전에 철밥통 철도청 시절에  철도청이 자체 CF를 내보낸 건 1984년이 유일했다고 한다. “속도 향상으로 고속화된 철도 여행은...” 무궁화호 NDC 동차가 최신형 차량으로 소개되던 시절이었으니 얼마나 격세지감인지! ㅋㅋㅋ

2.

사실, 지금으로부터 10년 쯤 전, 본격적으로 철덕이 되기 전이던 2003년경의 일을 똑똑히 기억한다.
본인은 대학 시절에 열차 여행 중이었는데 객실이던가 역 내부이던가에 철도 노조에서 만든 광고 포스터가 붙어 있었다.
철도청이 기업으로 바뀌면 우리나라 철도도 영국이나 일본 꼴이 나서 서울-부산간 열차 운임이 10만원이 넘어가고 안전 관리도 개판이 되어서 철도 안프라가 완전히 망할 거라는 내용으로 가득했다.

그로부터 얼마 되지 않아 KTX가 개통하고 철도청은 코레일로 바뀌었다. 그러나 한국 철도는 저런 극단적인 꼴로 전락하지 않았다.
뭐든지 시장 경제에만 맡기고 민영화· 개방만 하는 게 능사는 아닐지 모른다. 하지만 저런 일도 한두 번 겪고 나면 국가 정책에 무조건 괴담 퍼뜨리면서 딴지 걸고 반대만 하는 주장은 좀 가려 가며 들을 줄 아는 안목이 생겨야 할 것 같다. 그런 쪽에 심취해 있는 분들은 반대로 비대한 정부 기관들의 비효율과 세금 낭비에 대해서는 너무 무관심한 측면이 없지 않다.

뭐, KTX는 이제 코레일의 최대 돈줄이며 특히 주말에 경부선은 굳이 명절이 아니어도 없어서 못 탈 정도로 만석이다.
그 어떤 경영자가 코레일의 사장이 되었다 해도 이런 상황에서는 서민들로부터 욕 먹는 한이 있어도 일반열차를 줄이고 KTX를 증차할 수밖에 없다. 임률 높고, 많이 태우고 빠르고 회전률 높고, 수송 원가 낮고 수요도 많고.. 도대체 주저할 이유가 어디 있는가.

그럼에도 불구하고 과거의 철도청도 경영을 아주 못한 건 아니었다.
어쩌다가 새마을호에 Looking for you 음악을 넣을 생각을 했을까?
그냥 어차피 탈 사람은 타고 안 탈 사람은 안 타고, 적자쯤이야 세금으로 메우면 된다는 식으로 철도를 아주 안일한 철밥통 사고방식으로 운영할 수도 있었을 텐데... 이런 데에다 고객 감동과 중독의 씨앗을 집어넣었을까?
이런 배려 때문에 대한민국에는 중증 말기 극성 철덕이 한 명 생겨 버렸고, 코레일은 철도청이 뿌린 씨앗의 열매를 마음껏 따 먹고 있는 중이다.

3.

지난 2011년 여름에는 꽤 도발적인 철도 광고가 옥외 광고판의 형태로 걸린 적이 있었다.
바로 경부 고속도로 신탄진 IC 북쪽으로 살짝 떨어진 곳에, “KTX 탈 걸”이라는 광고판 말이다. 혹시 아시는 분 계신지?

사용자 삽입 이미지

이건 여러 가지 이유로 인해 한국 철도 역사상 최대의 적절한 광고 전략으로 기록될 것이다.

  • 일단 경부 고속도로가 경부 고속선과 아주 가깝게 나란히 달리는 얼마 안 되는 구간이요,
  • 이곳은 버스 전용 차선이 시작되고 주말에 그렇잖아도 상습적으로 막히기 시작하는 곳이기 때문이다.
  • 또한, 수도권에서 충분히 멀리 떨어진 국토의 중부이기 때문에 상행과 하행에 모두 비슷한 광고 효과를 낼 수 있다.

도로는 막혀서 차들이 거북이걸음 중인데 옆에서는 KTX가 씽씽 지나가고 맞은편엔 “KTX 탈 걸”이라는 광고판이 놓여 있으면 운전자들이 이를 보고 무슨 생각을 하게 될까?

이 광고판이 있는 곳 근처를 로드뷰로 보면 이렇다.
요즘 인터넷 지도는 로드뷰 서비스를 제공하지만, 의외로 고속도로에는 유료 도로여서 그런지 로드뷰가 거의 없기 때문에 인터넷 상으로 사진을 찾기는 쉽지 않았다. 그리고 지금은 광고가 다른 것으로 바뀐 것으로 보인다.

Posted by 사무엘

2013/08/11 08:28 2013/08/11 08:28
,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/865

1.
지구상엔 여름에 우리나라보다 더 더운 나라도 있다. 하지만 그런 나라들은 여기만치 습하지는 않다. 그래서 낮 기온이 40도를 넘어가더라도 그늘에 들어가거나 조금만 바람이 불어 주면 또 금세 시원해지기도 한다.
자동차의 성능을 잴 때 마력뿐만 아니라 토크도 봐야 하고, 전기가 얼마나 위험한지 측정할 때 전압보다도 전류를 더 봐야 하듯(엥?), 사람의 불쾌지수에는 온도 이상으로 습도가 참 크게 작용하는 게 틀림없다.

요즘 날씨가 날씨이다 보니, 이놈의 습기를 증오로 죽이고 싶다는 생각이 종종 든다. 하지만 다시 생각해 보면, 반대로 습도가 너무 낮을 때 발생하는 현상도 절대로 유쾌한 게 아니다. 겨울철의 끔찍한 정전기와 거칠어지는 피부, 따가워지는 코와 까지는 입술을 생각하면 말이다. 지금은 최소한 그런 현상에 대한 걱정은 전혀 할 필요가 없다는 사실에 위안을 얻어 본다.

2.
매일 자전거로 출퇴근하는 도로의 인도에 대대적인 보도블록 교체 공사가 시작되었다. 인도가 전부 흙밭으로 바뀌었으니 어쩔 수 없이 위험한 차도로 다니게 됐다. 지금까지 보도블록의 교체에 대해 “쓸데없는 전시행정, 세금 낭비” 같은 부정적인 얘기만 언론으로부터 잔뜩 들어 왔던지라 나도 불평을 하면서 길을 지나갔는데..

생각해 보니 저 도로의 인도는 원래부터 상태가 진짜로 안 좋았다. 손상된 블록, 불쑥 튀어나오고 움푹 패인 곳 때문에 어차피 자전거가 인도로 다니기엔 위험했으며, 난 불과 몇 달 전까지만 해도 “여기 도대체 보도블록을 교체 안 하고 뭐 하냐?”라고 불평을 하면서 다니곤 했었다! 그런데도 상황이 조금만 바뀌니까 생각과 관점도 덩달아 달라지니.. 사람은 사고방식을 논리적으로 단련하지 않으면 참 간사해지기 쉬운 동물이란 걸 내 경험을 통해 느꼈다.

3.
사실은 알게 모르게 세상이 좋아진 게 많다.
20여 년 전까지만 해도 장마철만 끝나면 어김없이 수재민 돕기 성금 모금이 연중관례였는데 요즘은 그런 거 없다. 독자들 중에 2MB나 4대강 싫어하는 분들도 계실지 모르니, 저게 강 정비를 잘 해 놓은 덕분에 필요 없어진 거라고 굳이 결론을 내리지는 않겠다. -_-;;

20여 년 전만 해도 추석· 설 때 서울-부산을 가는 덴 10몇 시간이 훌쩍 넘게 걸렸다. 그러나 지금은 고속도로와 우회도로가 워낙 많이 생기고 실시간 도로 안내 시스템도 하도 발달한 덕분에, 명절에도 국토를 종단하더라도 10시간은 정말 안 넘긴다.

또한, 정부에서 시내버스를 경유 대신 천연가스 차량으로 교체하고 자동차에 대한 배기가스 규제를 꾸준히 강화한 덕분에(특히 디젤 차량을 상대로) 서울 시내는 그렇게 많은 자동차들이 지나다님에도 불구하고 20세기 중반 같은 끔찍한 스모그나 환경오염 사상자는 더 발생하지 않고 공기가 그나마 지금만큼이라도 유지되고 있다.

난 자연이 언제나 인간에게 선한 것만 주지는 않는다는 걸 안다. 그렇기 때문에 맹목적인 문명의 이기 부정(특히 원자력 발전 반대 같은 거 ㄱ-), 친환경, 채식 같은 구호에 동조하지 않는다. 백신과 수돗물 약품 소독만으로도 그야말로 넘사벽급으로 인간 주거 환경의 위생이 개선되었으며, 무수히 많은 전염병이 예방되고 영아 생존률이 올라가서 숱한 생명을 구했다. 이게 없으면 인구가 이렇게 밀집한 대도시는 위험해서 도저히 돌아갈 수가 없다.

그런 디테일은 간과한 채 오늘날과 같은 현대 문명을 이뤄 낸 과학 기술이나 사회 체제에 어설프게 이상한 음모론 제기하고 체제를 부정하는 낭설을 난 믿지 않는다. 그래, 가끔은 진실이 정말로 과격· 극단적인 곳에 있을 수 있다. 그러나 그 정도의 센 결론을 내리기 위해서는 정말로 팩트에 대한 철저한 교차검증과 균형 잡힌 판단이 필요하다.
내가 처한 상황으로 인해 위의 권위나 세상에다 불평을 하기 전에 정말로 그게 합당한지, 내가 모르는 사이에 오히려 세상이 좋게 바뀐 건 없는지 살펴보는 안목을 키워야겠다는 생각이 들었다.

Posted by 사무엘

2013/08/08 08:38 2013/08/08 08:38
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/864

군대는 흔히 육해공 3군으로 나뉘는데, 이들의 특성은 다음과 같이 요약할 수 있다.

  • 육군: 땅개로 설명 끝이다. 장병들은 병영에서 생활하면서 각종 작업이나 일과 수행을 위해 온갖 장소를 돌아다녀야 한다. 보병+소총수라는 제일 기본 보직이 있으며 이들에겐 행군 능력이 대단히 중요하다. 단, 의사 중에 TOP은 외과 의사이듯이, 육군 중의 TOP 병과는 역시 포병이 아닌가 싶다.
  • 해군: 배가 곧 생활 공간 겸 전장이기도 하다는 게 중요한 특징이다. 해군만의 그 특유의 세일러 복장이 있다. 육군에 행군과 화생방이 있다면 해군엔 전투수영이 있다. 연평해전, 천안함 등의 사건으로 인해, 근래까지 병사들 중에서 북한군의 공격으로 인한 전사자가 제일 많이 나온 곳이다.

그리고,

  • 공군: 여타 군과는 달리 공군은 소수의 전투기 조종사를 지원하고 비행장· 기지 내부를 방어한다는 개념이 강하다. 그렇기 때문에 비전투 병과의 비중이 높으며, 병사가 무슨 비행기 타고 영공을 지키다가 전사한다거나 하는 일은 없다. 육군 같은 행군· 숙영은 없지만 화생방의 비중이 높다.

공군 훈련소에서 수류탄 훈련은 완전 야메로 넘기면서 교관이 “너희들이 이걸 던지는 상황이라면 전쟁은 이미 진 거다.”라고 말하는 건 유명한 일화인 듯하다. 틀린 말은 아니다. 기지 바깥을 몇 겹으로 지키고 있던 육군 병력이 전멸했다는 뜻이므로.

군용기에는 비행기 대 비행기가 싸우는 전투기만 있는 게 아니다. 지상에다 다량의 폭탄을 떨어뜨리는 것이 전문인 폭격기도 있고, 정찰기· 조기경보기도 있다. (한편, 전투와 폭격을 겸할 수 있는 공격용 군용기를 전폭기라고 한다)
그리고 또 무시 못 할 비중을 차지하는 건 다름아닌 수송기이다. 방대한 물량이 생명인 오늘날의 전장에서 군대 유지의 생명은 보급이다. 수송기는 이 보급을 책임지는 물건이기 때문에, 비록 전투기 같은 화려함은 없을지언정 전쟁에서의 숨은 일등공신이 아닐 수 없다. 비록 배보다 수송량은 부족하지만 속도가 워낙 넘사벽이니..

역사적으로 볼 때 월남전의 상징이 헬리콥터라면, 걸프전 하면 수송기를 떠올려도 좋다. 다량의 수송기 덕분에 그 먼 중동에서 벌어진 전쟁에 미국(+다국적군)이 신속하게 대처할 수 있었다. 조종사밖에 못 타는 전폭기만 먼저 도착해 있으면 뭘 하나. 정비 인력, 각종 부품, 무장, 보급이 없는데?

군용 수송기는 웬지 프로펠러기가 많이 눈에 띄는 것 같다. 본인의 직장이 있는 판교도 아무래도 서울 공항과 가까운 곳인지라 종종 수송기가 저공으로 날아다니는 게 눈에 띈다.
굳이 군용기뿐만이 아니라 화물기가 전반적으로 그렇긴 하지만, 얘네들은 민항기에 비해 랜딩기어가 굉장히 낮은 걸 볼 수 있다. 개로 치면 다리가 몹시 짧은 닥스훈트 같은 품종? 기체가 지면에 더욱 가까이 있다. (왼쪽은 보잉 737, 오른쪽은 수송기 C-141)

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

이것은 사실 화물을 싣는 모든 교통수단들이 공통으로 갖는 특징이다. 기체의 높이가 낮아야 무거운 화물을 기내에 반입하기가 쉬우니까. 시내버스만 해도 사람이 타기 불편하다고 저상 버스가 있는 지경인데 하물며 화물은 어떠하겠는가? 짐받이에다가 탑승교를 마련할 수도 없는 노릇이니 말이다.

영화에서도 종종 보지만, 수송기의 뒷문은 아예 아래로 열어젖혀서 화물을 싣는 입구 램프(ramp)로 종종 쓰인다. 중세 영화 장면에서 성(castle)문을 바닥 쪽으로 열어서 문짝을 그대로 도랑과 성 사이를 연결하는 다리(bridge)로 쓰듯이 말이다.
이렇게 비행기의 기체가 지면과 가깝게 낮아지다 보니, 날개는 기체에서 상당히 윗부분에 달릴 수밖에 없어진다. 그래야 날개 밑에다 엔진이든 프로펠러든 달 수 있으니 말이다.

이런 이유로 인해 수송기의 외형은 일반 민항기와는 살짝 차이가 있다. 그러나 이런 날개의 구조는 비행기의 연비 절약에 유리하게 작용하는 특성은 아니라고 한다.
또한, 군용차만 해도 사륜구동에 차체가 온통 무거운 쇳덩이여서 튼튼하고 힘은 좋다만, 완전 기름 먹는 하마이지 않던가. 군용기 역시 마찬가지이다. 전장에서 임시로 만들어진 거칠고 험악한 활주로에서도 안 부서지고 뜨고 내릴 수 있게 튼튼하고 다소 무겁게 만들어진다. 그러니 군용 수송기는 민항기보다 경제성이 여러 모로 떨어진다.

앞서 말했듯이 수송기는 전투기보다 '간지'가 덜하다는 건 부인할 수 없는 사실이다.
조종 병과를 전공한 정예 공군 장교가 도저히 전투기를 조종할 수 없게 됐을 때 차순위로 빠지는 게 수송기나 헬리콥터 쪽 보직이다. (물론 처음부터 그런 보직으로 가는 인원도 있긴 하지만) 그리고 전투기의 조종간을 잡은 경험만이 공군 장성으로 진급할 때나 전역 후 민항사로 재취업할 때 뼈가 되고 살이 되는 경력으로 인정받는다. 수송기 경력은 별로..;;
그럼에도 불구하고 수송기도 전쟁에서 절대 없어서는 안 될 자원이니, 그 중요성을 간과하지 말아야겠다.

※ 덧붙이는 말

1. 수송기 추락 사고

우리나라는 1982년에 도대체 무슨 마가 씌였는지 군 수송기가 두 대나 산에 추락하는 사고가 난 적이 있었다.
하나는 2월에 제주도 한라산이고, 다른 하나는 6월에 서울 청계산.
사고의 원인(악천후 때문에 방향· 위치 감각 상실), 사고 기체(C-123),
게다가 인명 피해(50여 명의 탑승 장병 전원 사망)까지 완전 판에 박은 듯이 똑같다.

그 이듬해에 민간에서 워낙 큰 사건· 사고가 또 나긴 했지만(KAL기 추락, 그리고 아웅산 폭탄 테러)
5공 시절에 군 내부에서 발생한 저 사고는 완전히 흑역사로 치부되고 비밀로 함구되었으며, 희생자 유족은 제대로 된 보상이나 예우도 못 받았다. 지금도 인터넷에서 검색해도 관련 자료를 찾기가 매우 힘들다. 저런 거야말로 재조명과 진상 규명이 필요한 이슈가 아닌가 싶다.
과격한 훈련 중에 전투기가 떨어진 것도 아니고, 순전히 날씨 때문에 육지 지형을 파악 못 해서 비행기가 떨어졌다는 게 애석하다. 뭐, 기체의 노후화 때문이라는 지적도 있는 듯하지만 말이다.

2. 조종사가 되기

항공업계는 사람의 생명을 좌지우지하는 위험한 전문직군이다 보니, 의료계와 더불어 조직 내부의 군기가 세고 그 대신 종사자의 대우도 매우 좋은 곳이다.
우리나라에서 압도적으로 가장 저렴한 방법으로 비행기 조종사가 되는 방법은 두 말할 나위도 없이 공군 사관학교 + 조종 병과로 가는 것이다. 군기 바짝 든 건장한 공군 출신 조종사는 민항사에서도 아주 좋아하기 때문에 이건 그야말로 엘리트 코스가 보장돼 있다. 그러나 이 경우 어릴 적부터 몸 좋고 공부도 매우 잘해야 하거니와, 돈이 안 드는 대신 인생의 상당량을 국가를 위해 고된 군생활에 바쳐야 한다.

게다가 사관학교 출신 장교들의 의무 복무 기간은 10년이지만, 공군 조종사만은 그 기간이 15년이다. 양성 비용이 워낙 많다 보니 국가에서 좀 더 오래 뽕(?)을 뽑아야겠다고 판단한 모양이다.

예전에는 군을 거치지 않고 민간 테크만으로 조종사가 되는 방법은 사실상 외국으로 나가는 것밖에 없었다. 미국은 자동차는 이미 신발이나 다름없는 필수품이고, 진짜 돈 많은 유명인사는 자동차를 넘어 자가용 비행기까지 날리는 천조국이니 말이다.
지금은 상황이 나아져서 국내에도 차츰 항공 관련 학과가 개설된 대학이나 조종사 양성소가 생기고 있다. 그러나 국내든 국외든 그야말로 극심한 돈지랄은 불가피하다. 그 비싼 비행기를 조종하는 법을 배우는 게 돈으로나 노력으로나 어디 쉬운 일이겠는가.

항공사가 자체적으로 운영하는 조종사 양성 프로그램을 거쳐서 배출된 조종사는 한동안 자기 연봉에서 교육비가 공제된다. 그런 식으로 채무를 청산한다. 청산이 완료되기 전에 조종사가 그 회사를 퇴사한다면 미납 교육비를 모두 뱉어 주고 나가야 한다.

그러고 보니, 대한 항공 조종사 출신인 말씀 보존 학회 대표가 문득 대단하게 보인다. =_=;;; 공사가 아닌 민간 출신이다. 킹 제임스 진영을 이끄는 사람들은 다들 참 똑똑한 사람들이긴 하다.

Posted by 사무엘

2013/08/05 08:36 2013/08/05 08:36
, , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/863

페르시아의 왕자는 개발된 지 벌써 25년이 돼 가지만 아직도 기억하는 사람들이 있는 불멸의 명작 고전 게임이다.
개발자의 이름을 가히 전세계적으로 알린 물건이다. 로토스코핑 기법으로 주인공의 부드러운 움직임을 그 옛날에 만들어 냈다는 걸 생각하면 그 천재성에 감탄을 금할 수 없다.

게임 엔진도 충분히 기술적으로 뛰어나지만, 제작자인 Jordan Mechner는 방송· 연출 쪽으로도 조예가 있는 사람이다 보니 게임을 마치 한 편의 영화처럼 굉장히 웅장하게 만들고 어떤 사건이 발생했을 때 돌아오는 시청각 피드백의 디자인에 세심한 신경을 썼으며, 스토리를 탄탄하게 짜 넣은 것도 인상적이다.

가령, 적이나 주인공이 죽었을 때 매번 짤막한 멜로디가 나오는 게임, 적이 칼에 맞았을 때와 내가 칼에 맞았을 때의 소리가 서로 다른 게임은 지금 생각해 봐도 흔치 않다. (당연히, 내가 칼에 맞았을 때의 소리가 더 불쾌하고 위급하게 들린다. 이런 것까지 다 신경 썼다)
또한, 같은 엔진으로 천편일률적인 디자인의 맵만 집어넣은 게 아니라, 중간에 해골이라든가 영혼 탈출, 그리고 공주가 생쥐를 보내서 왕자를 구출하는 것 같은 이벤트도 집어넣어서 사용자가 지루하지 않게 배려했다. 괜히 명작 소리를 듣는 게 아니다.

제작자는 네이티브 뉴요커이며 예일대 출신이라는 건 덤이다. 페르시아의 왕자는 20대 중반의 나이로 그가 대학을 졸업한 거의 직후부터 개발을 시작한 것이지만 대학 재학 중에도 프로그래밍을 안 한 것은 아니다. 컴공 전공자도 아닌데 말이다.
게다가 오리지널 1편 기준으로 모션 촬영은 제작자의 동생을 뛰고 오르고 이리저리 구르게 하면서 촬영했으며, 음악은 제작자의 아버지가 만들었다 하니 이 정도면 가히 엄친아 집안이 따로 없다. 아버지 Francis Mechner는 심리학 박사 학위 소지자이다.;;

이 게임은 1989년에 최초로 애플 II 용으로 개발되었지만 이듬해에 PC용으로 이식되면서 대박을 터뜨렸으며, 여타 PC나 게임기용으로도 널리 이식되었다. 오늘날에는 3D 형태로 리메이크된 작품이 나오고 심지어 모바일용으로 이식되기도 했다.
어디 그 뿐인가? 게임 mechanic이 간단하다 보니 플래시로도 비스무리한 게임이 있다. 그리고 전세계의 양덕후들이 LEVELS.DAT 파일을 임의로 고친 custom level들까지 즐비하다. 이 정도면 페르시아의 왕자가 비디오 게임계에 끼친 영향은 가히 지존의 경지라 하겠다.

어휴, 말이 길어졌는데.. 이 글에서 소개하려 하는 것은 그 페르시아의 왕자 1 PC 버전에서 MEGAHIT 치트만 안 쓰고 프로그램 상의 모든 버그와 꼼수를 활용한 궁극의 타임어택이다.
어지간한 고퀄이 아니었으면 내가 굳이 내 블로그에다가 소개까지 하지도 않았을 것이다.
정말 프레임 단위로 삽질 없이 시간을 아껴 쓰려는 노력을 읽을 수 있었다.

http://www.youtube.com/watch?v=ZvlNppHraWs
http://www.youtube.com/watch?v=U8Kw2pA6hb8

레벨 1: 게임 시작 직후에 왕자가 엎드렸을 때 음악과 함께 살짝 랙이 있으니 이것은 Ctrl+A로 곧바로 스킵. (경악) 꿈에도 생각을 못 했다.
그리고 이 레벨의 경우, 정석대로 칼을 먹고 돌아오면 깨는 데 2분이 걸리지만, 잘 알다시피 칼 든 악당을 꾀어낸 뒤 칼을 먹지 않고 깨면 1분대로 시간이 줄어든다.
그러나 저 고수의 플레이 영상은 그마저도 초월했다. 칼을 먹으러 가지 않을 뿐만 아니라 일체의 우회가 없이, 칼 든 악당을 그대로 정면돌파하여 통과한다. -_-;; 이로써 1분도 걸리지 않고 깬다. 프로그램의 미묘한 버그를 활용해서 말이다. 더 설명이 필요하지 않으니 영상을 직접 보시라.

레벨 2와 3은 그냥 그럭저럭 보면 되고...

레벨 4: 포인트는 시작 후에 오른쪽 방에 있는 악당을 움직이게 하여 닫힌 문을 곧바로 열게 만드는 것이다. 버그 활용임.
출구가 있는 방에는 악당이 있다. 출구를 개방한 뒤에 다시 이쪽으로 돌아와야 하기 때문에, 여기 있는 악당은 시간 소요를 감수하고라도 보통은 어쩔 수 없이 싸워서 죽이는 것이 정석이다. 그러나 이 사람은 그 악당마저도 죽이지 않고 매번 도망쳐서 통과한다.

레벨 5: 역시 악당을 이용한 버그를 활용하여, 왼쪽 방의 닫힌 문을 그대로 워프로 통과한다. (빙빙 돌 필요가 없다!)

레벨 6: 이 레벨에는 일반적인 도움닫기 점프로는 통과할 수 없는 간격으로 가시가 놓여 있다. 그러나 딜레이 없이 빠르게 타넘는 점프 패턴이 있는데, 이것은 본인도 경험상 알고 있었던 것들이다.

레벨 7: 중간에 공간 워프 버그를 하나 활용한다.

레벨 8: 역시 우주괴수는 출구를 개방한 뒤에 철문에 갇혀서 생쥐가 발판을 밟아 주러 올 때까지 기다릴 필요가 없다. 최고다.
톱날이빨과 악당을 동시에 마주치는 곳에서는 악당을 죽이는 게 불가피한 듯. 문닫힘 발판을 통과하려면 뛰어야 하는데 도움닫기도 못 하고(바로 다음 방에서 절벽이 있기 때문에), 그러면서 악당의 공격을 당하지도 않아야 하니, 이러지도 저러지도 못하기 때문이다.

레벨 9: 중후반에 톱날이빨을 동작하지 않게 하는 버그는 나도 알고 있었다.

레벨 10과 11은 특이사항 없음.

레벨 12: 그 공간 워프 버그도 유명하며, 나 역시 스스로 발견했었다.

일반적으로 레벨을 깨는 출구는 문이 완전히 열리기 전까지는 왕자가 들어갈 수 없다. ↑ 키를 눌러도 왕자는 말 그대로 펄쩍 뛰기만 한다.
단, 최종 보스인 Jaffar를 죽이고 나서 자동으로 열리는 출구는 예외. 완전히 열리기 전에도 왕자가 쏙 들어가는 게 가능하다.
그러나 동영상을 보면 왕자는 여기서도 출구가 완전히 열릴 때까지 약 1초 남짓 기다렸다가 들어간다.
물론 어차피 Jaffar가 죽은 뒤부터는 게임 내부의 타이머가 정지하긴 하지만, 게임 시작 직후의 앉음 딜레이조차 건너뛰려고 Ctrl+A를 누른 타임어택의 취지에 비춰 보면 살짝 옥의티라면 옥의티 같다.

이 게임은 Shift+L을 누르면 레벨 4까지 레벨을 건너뛸 수가 있다. 물론 이 경우 60분이던 시간이 15분으로 1/4토막나기 때문에 게임을 제대로 더 진행할 수는 없다.
그러나 프로 타임어태커는.. 그 상태로 시작해서도 게임 엔딩을 볼 수 있다. 경악. =_=;;:

단, 후편인 왕자 2는 저런 게임 메카닉 상의 버그가 거의 다 사라졌으며, 악당도 움직임이 굉장히 빨라져서 자리 바꾸고 튀는 게 불가능해진 관계로 1과 같은 궁극의 타임어택이 나오지는 못한다. 결정적인 시간 절약 요인 버그 exploit들이 없어졌으니 말이다.

Posted by 사무엘

2013/08/02 19:20 2013/08/02 19:20
,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/862

분당선 구성 역

수도권 광역전철 분당선은 혼잡한 서울 시내와 분당 신도시를 지나지만 종종 한적한 곳도 지난다.

구룡은 서울 강남에서 잉여력 높기로 악명 높아서 '굴욕'이라고까지 불릴 정도인 역이다.
이매는 야탑과 서현 사이에 새로 생긴 역인데 출구 근처에 기본적으로 역세권이라 불릴 만한 업무· 상업 시설이 없으며, 길거리에 행인이 거의 안 보인다. 예전에 역이 괜히 없었던 게 아니다.

오늘은 그러한 역들 중의 하나로 '구성' 역을 살펴보겠다.
구성은 죽전 이남의 보정 다음에 등장하는 역으로, 서울-성남-용인을 잇는 대표적인 두 길인 경부 고속도로와 국가 지원 지방도 23호선--이 구간에서는 특별히 용구대로라는 이름으로도 불림--의 사이에 자리잡아 있다. 신분당선 청계산입구 역과 더불어 지하철 출입구에서 경부 고속도로를 곧장 볼 수 있는 얼마 안 되는 역이기도 하다.

고속도로가 코앞에 보인다는 건 그만큼 역도 한적한 곳에 있다는 뜻이다. 청계산입구 역과 같은 맥락이다.
주변의 분당선 역들이 여느 지하철들처럼 다 용구대로를 따라 만들어진 것과는 달리, 구성 역은 용구대로를 한 블록쯤 벗어나서 용구대로와 고속도로의 중간의 어정쩡한 지점에 자리잡고 있다. 역 주변에 보이는 건 자그마한 개천, 한적한 들판이다.

역이 그렇게 만들어진 이유는 선형 때문이다. 자동차 도로만 따라 남쪽으로 내려갈 경우 교차로에서 급곡선이 생기기 때문이다.
그래서 이곳에서는 일부 단거리 마을버스만이 일부러 대로에서 벗어나 구성 역 출입구 근처까지 들어갔다가 나오지, 간선 버스들은 그냥 용구대로만 달리면서 구성 역을 비껴 가 버린다.

구성 역은 비록 대로에서의 접근성을 희생했지만 이 때문에 여느 분당선의 역답지 않게 주변이 아주 전원적이며, 공간이 넉넉하여 공영 주차장 같은 시설도 갖추고 있다.
하지만 이 역은 생긴 지 얼마 안 된 관계로 다음, 네이버, 구글 등의 지도의 항공 사진들은 다 2013년 7월 현재까지도 역 주변의 실제 모습이 아니라 그냥 허허벌판만을 표시하고 있다. 하긴, 2010년 말에 생긴 신경주 역조차도 항공 사진에서 주변이 제대로 표시되기 시작한 건 정말 얼마 안 됐다.

그래서 궁금해졌다. 본인은 구성 역으로 직접 답사를 떠났다.

사용자 삽입 이미지사용자 삽입 이미지
이 역에서 내린 후 1번이나 2번 출구로 나가면 이런 지하 마당이 이용객을 반긴다. 고도상으로는 지하여서 에스컬레이터를 타고 올라가야 완전한 지상이 나오지만, 이곳은 하늘 위가 완전히 뚫려 있다. 분위기가 이색적이다.
사용자 삽입 이미지
사용자 삽입 이미지
지상으로 나오면 옆엔 좁은 도로가 뚫려 있고, 저 건너편에는 넓은 부지를 이용한 공영 주차장이 있다. 주차장 너머로는 그냥 들판이며, 더 건너편은 경부 고속도로이다.
공간이 넉넉한 덕분에 주차장 이용료는 어지간한 상업용 건물보다는 저렴한 편이다. 하루 종일 주차해도 6000원이면 된다.

사용자 삽입 이미지사용자 삽입 이미지
자동차라면 역의 좌우로 나 있는 도로로 빙 둘러서 다리를 건너야 옆의 용구대로로 진입할 수 있다. 그러나 사람은 그냥 센터에 있는 샛길을 이용해서 대로로 가도 된다.

사용자 삽입 이미지
구성 역 바로 옆에는 신기하게도 역세권 버프를 받은 절이 하나 있다. <전통사>.

사용자 삽입 이미지
그리고 역과 대로 사이에는 이런 게 있더라.
포장도 되지 않은 이런 공터는 이미 무료 주차장으로 널리 이용되고 있었다.

사용자 삽입 이미지
주말의 용구대로는 차들로 몸살을 앓고 있었다.

사용자 삽입 이미지
번화가인 용구대로 주변과는 달리, 구성 역 주변은 정말 한가롭고 전원적이었다.
구성 역은 공간이 넉넉하고 부지에 여유가 있는 덕분에 훗날 고심도 급행 전철(GTX) 같은 철도가 건설될 때 환승역으로 성장할 가능성도 있다고 한다.
구성 역 주변이 언제까지 이렇게 한가할지는 모르겠는데 앞으로도 발전 가능성을 좀 지켜봐야겠다.

Posted by 사무엘

2013/07/31 08:32 2013/07/31 08:32
, ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/861

한자어로 '원'이라고 부르는 동그라미라는 도형은 시각적으로나 수학적으로나 아주 신기한 도형이다.
둥글다는 게 무슨 의미인지 기계가 계산으로 표현할 수 있을 정도로 엄밀하게 정의하자면 결국 '어떤 점에서 거리가 같은 점들의 집합'이라는 정의가 등장하게 되고, n차원 직교 좌표에서 거리라는 건 결국 차원을 구성하는 각 축의 거리들의 제곱의 합의 제곱근이라고 정의된다.

원의 지름과 원의 둘레의 비율은 그 이름도 유명한 '파이'이며, 3.141592... 로 시작하는 이 값은 무리수인 동시에 초월수라는 것도 상식이다.

그런데 이 원을 정사각형 격자 모양의 래스터 그래픽 장치에서 어떻게 하면 효율적으로 그릴 수 있을까? 그런 물건의 내부엔 컴퍼스 같은 직관적인 도구가 없는데 말이다.
중심이 x, y이고 반지름이 r인 원을 구성하는 좌표들을 어떤 계산을 통해 얻어 올 수 있을까?
원점이 중심인 원의 방정식은 x^2+y^2=r^2. 따라서 y=sqrt(r^2-x^2) 방정식을 이용하면 사분원 내지 반원을 구성하는 점을 구할 수 있다. 그리고 이 값을 바탕으로 나머지 방향의 점을 그리면 될 것이다.

#include <math.h>
template<typename T>
void Draw_Circle(int x, int y, int r, T f)
{
    double R_2 = r*r;
    for(int i=0;i<r;i++) {
        int v = (int)(sqrt( R_2 - i*i )+0.5);
        f(x-i, y-v); f(x-i, y+v);
        f(x+i, y-v); f(x+i, y+v);
    }
}

for문 자체는 0부터 r까지 사분원의 x좌표만 돌고, 이를 바탕으로 점을 찍는 함수 f를 4개 방향으로 모두 호출한다.
r의 제곱 값은 한 번만 계산하면 되므로 for문 밖에서 별도로 선언해 주는 센스도.
소숫점은 버림이 아니라 반올림이 되도록 0.5를 더한 뒤에 int로 캐스팅하는 게 좋다. 그래야 당장 그려지는 원도 90*n도 부근이 더 탱탱하고 보기 좋아진다.

함수의 사용은 MFC 기준으로 이런 식으로 하면 된다. 함수 안에서 또 다른 함수를 내부적으로 호출할 때 함수 포인터보다 람다가 참 깔끔하긴 하다. (너무 남발한 게 꼬이면 code bloat은 피할 수 없겠지만)

CPaintDC dc(this);
auto x = [&](int x,int y) { dc.SetPixel(x,y,0); };
Draw_Circle(220,220, 200,  x);
Draw_Circle(420,330, 160,  x);

사용자 삽입 이미지

그런데 아뿔싸, 역시 기울기가 1보다 더 커지는 곳에는 점이 듬성듬성 떨어져 있게 된다.
이 틈을 점 찍기가 아니라 선 그리기 같은 다른 함수로 메운다는 건 있을 수 없는 일이고..
결국, 우리의 원 그리기 알고리즘은 언제나 기울기가 1보다 작은 구간에서만 동작하게 loop 구조를 바꿀 필요가 있다.
우리는 원을 4등분했는데, 그렇게 4등분된 조각도 한쪽 끝과 맞은편 끝이 완벽하게 대칭으로 이들을 동시에 그려 보자.

가령, 1사분면에서는 x좌표를 1씩 증가시키면서 r로 근접하고(위의 코드에서 i) y좌표는 r이다가 점점 0으로 작아지는데(위의 코드에서 v),
이와 동시에 반대편에서는 y좌표를 1씩 증가시키면서 r로 근접하고, x좌표는 r에서 0으로 근접시키도록 점을 같이 그리는 것이다.
이제 loop는 변수 i의 값이 r에 도달한 지점에서 끝나는 게 아니라 v와 값이 같아지는 지점에서 끝나면 된다. (정확히는 sqrt(2)*r/2 지점이 됨)

{
    double R_2 = r*r;
    for(int i=0; ;i++) {
        int v = (int)(sqrt( R_2 - i*i )+0.5);
        f(x-i, y-v); f(x-v, y-i);
        f(x-i, y+v); f(x-v, y+i);

        f(x+i, y-v); f(x+v, y-i);
        f(x+i, y+v); f(x+v, y+i);
        if(i>v) break;
    }
}

사용자 삽입 이미지
와, 이로써 굉장히 찰진 모양의 원이 그려졌다. 한 번 루프를 돌 때마다 점이 8개가 그려지는 것이다.
그러나 이런 원 하나 그리는데 부동소숫점에, 곱셈에, 심지어 제곱근까지 꽤 부담스러운 연산이 많이 들어갔다.
이걸 좀 줄일 수는 없을까?

...
    int R_2 = r*r;
    int v = r;
    for(int i=0; ;i++) {
        if(i*i + v*v > R_2) --v;
...

loop의 앞부분을 이렇게 고쳐 보자.
x축에 속하는 i의 값이 1증가할 때마다 y축에 속하는 v의 값은 그대로 유지되거나 1 감소하거나 둘 중 한 변화만을 겪을 것이다.
i가 증가함에 따라 원점에서 i, v까지의 거리가 R보다 확 커지게 됐다면, 이 궤적은 원의 범위를 벗어나는 것이므로 y축에 속하는 v를 1 줄여 준다.

실질적으로 행해지는 연산을 이렇게 최적화해 주면 최소한 부동소숫점과 제곱근 연산은 없어진다.
그러나 최적화의 여지는 그래도 여전히 남아 있다. 저 꼴도 보기 싫은 곱셈을 없애려면 어떡하면 좋을까?

방법이 있다.
결국, i*i는 0, 1, 4, 9, 16 ...의 순열을 생성해 낼 텐데, 얘는 덧셈을 두 번 하는 걸로 대체할 수 있다. 한 번 덧셈을 한 뒤엔 증가치가 2씩 늘어나니까 말이다(1과 4의 차는 3, 4와 9의 차는 5, 9와 16의 차는 7). x^2의 도함수가 괜히 2*x가 아니다.

그리고 v는 초기값이 아예 R_2와 같으니 약분이 가능하다. 그 뒤에 v의 값이 줄어들면서 차이만이 발생할 뿐이다. 그런데 얼마를 빼 줘야 할까?
x^2가 (x-1)^2로 바뀌었을 때 감소하는 값은 잘 알다시피 2*x-1이다. 따라서 이 값만 초기에 계산해 놓은 뒤, v가 1 감소하게 됐을 때 가상의 v_square은 그만치 빼 주고, 그 델타값 자체도 2 감소시키면 된다.

...
    int v = r, i_square = 0, i_delta = 1;
    int v_delta=2*r-1, v_square_delta = 0;
    for(int i=0; ;i++) {
        if(i_square + v_square_delta > 0) {
            --v; v_square_delta-=v_delta, v_delta-=2;
        }

... //점 여덟 군데를 찍어 준 뒤

        if(i>v) break;
        else i_square+=i_delta, i_delta+=2;
    }

이로써 그 부드러운 원을 오로지 정수의 덧셈만으로, 그리고 곱셈이라고는 loop 돌기 전에 *2 단 한 번밖에 안 하는 깔끔한 원 그리기 알고리즘이 완성되었다. 놀랍지 않은가? 게다가 고정적인 두 배 연산은 잘 알다시피 bit shift로도 수행 가능한 아주 가벼운 연산이기도 하고 말이다.

GWBASIC, Windows GDI API, 옛날 볼랜드 BGI 등 모든 그래픽 라이브러리에 들어있는 원 그리기 함수는 기본적으로 이 알고리즘을 이용하여 원을 그린다. 각종 알고리즘 서적에 예제로 실려 있는 소스들도 세부적인 변수 활용이나 계수 계산에 차이가 있을지언정 기본적인 아이디어는 동일하다.

사실, 이건 거의 대학교 학부 수준이고 정보 올림피아드 공부라도 했다면 중· 고등학교 시절에라도 접했을 기초적인 내용이다. 진짜 어려운 건 이걸 응용하여 안티앨리어싱을 적용한다거나 타원을 그리거나, 아예 부채꼴 내지 회전된 원을 그리는 알고리즘이다.

단, Windows GDI가 그리는 원은 왠지 좀 엉성하고 덜 예쁜 것 같다. 비교를 할 때 반올림 보정을 안 하는지 경계가 아주 약간 덜 통통하며, 특히 기울기가 1(45도)에 가까워지는 지점에 점의 배치가 지저분하다.
차이를 보이기 위해 움짤을 만들어 보았다. 파란색 원은 GDI 함수로 그린 것이고, 빨간색 원은 우리가 작성한 함수로 그린 것이다.

사용자 삽입 이미지

Posted by 사무엘

2013/07/28 08:27 2013/07/28 08:27
, , ,
Response
No Trackback , 6 Comments
RSS :
http://moogi.new21.org/tc/rss/response/860

6· 25에 대한 팩트들

1. 옛날에는 6· 25사변, 동란이라는 말을 자주 썼는데 요즘은 그런 단어를 접하기 힘들다. 그리고 옛날에는 적군을 북한군 대신 괴뢰군, 공산군이라고도 많이 불렀다.

2. 6· 25는 선악 구도가 매우 분명한 전쟁이었다. UN이 창립 이래로 거의 처음이자 마지막으로 유일하게 적극적으로 한 진영의 편을 들어서 반대편 진영을 군사력으로 퇴치했다.
역사상 이렇게 많은 나라들이 한 작은 나라 편을 들었던 전쟁은 없었다. 그러나 미래에 성경이 말하는 아마겟돈 전쟁 때는 많은 나라들이 똘똘 뭉쳐서 오로지 한 나라를 대적하게 될 것이다. 그게 어느 나라인지는 이 자리에서 설명하지 않겠다.

3. 일요일 새벽에 감행된 너무 갑작스러운 공격에 대한민국은 당시 제대로 허를 찔렸다. 모든 것이 열세였고 겨우 사흘 만에 수도 서울을 허무하게 빼앗겼으며, 정부의 대처도 우왕좌왕 허술하기 짝이 없었다. 특히 개전 직후에 타이밍이 어긋난 대국민 안내방송과 한강 다리 폭파는 정말 뼈아픈 실책으로 기록되었다.

4. 그러나 다소 출혈을 감수하고라도 나라에서 정말 혹독하게 군 내부의 숙군 작업을 진행하고 빨치산들을 토벌해 둔 것은, 추후에 더 끔찍한 비극을 예방한 매우 다행스러운 선견지명 조치였다. 국군 내부에서조차 빨갱이가 우글거렸다면 얘들은 전쟁 났을 때 맞서 싸우기는커녕 지시를 어기고 적에게 모조리 항복하거나 이적행위를 저질렀을 것이다.

내가 대통령이었다 해도 그런 위급하고 절박한 상황에선, 사상만 올바른 게 확실하다면 친일 경력 군경이라도 적극 채용해서 안 쓸 수가 없었겠다. 내가 늘 강조하지만, 우리나라의 친일 청산을 방해하고 원천 봉쇄한 건 북한이며 북한 역시 내부적으로 군경 한 명이 아쉬운 마당에 친일 청산 안 한 건 마찬가지였다.

5. 중공군은 우리나라에 1· 4 후퇴를 안기고 멸공 북진 통일의 절호의 기회를 영원히 박탈해 버린 원흉이다. 생각해 보면 굉장히 열받고 통탄할 일인데, 우리가 당한 악행에 '비해서' 우리나라 내부에서의 반중 정서는 그만치 크지 않다.
1· 4 후퇴 당시에는 믿어지지 않겠지만 한강이 자동차가 지나갈 수 있을 정도로 꽁꽁 얼었다고 한다. 그래서 강 앞에 피난민들의 발이 묶인 적은 없었다. 하지만 이때 이산가족이 가장 많이 발생했다.

6. 1951년 3월경에 남한이 서울을 재탈환한 뒤부터 전쟁은 휴전 협정이 맺어질 때까지 계속 38선 부근에서 국지전만 진행되었다. 38선이 지금의 휴전선으로 바뀌면서 영토 자체는 대한민국이 과거보다 더 많이 수복했다. 그러나 서울이 북한과 더욱 가까워졌고 서해 NLL의 군사 긴장도가 더 높아졌다.
 
7. 흔히 '종북 좌파'라고 불리는 정권 시절에 <독도는 우리 땅>과 <6· 25 노래>가 금지곡이 됐다는 말이 떠돈다. 허나 검색을 해 보면 도대체 무슨 금지 조치를 당해서 언제 다시 풀렸는지가 분명치 않고 출처가 불분명하며, 이건 그냥 루머일 가능성이 높다. 이것은 마치 “이 승만이 시민들한테는 피난 가지 말라고 속이고는 자기 고의로 혼자 튀었다” 같은 급의 거짓 중상모략이 될 수도 있으니 난 그 점은 섣불리 판단하지 않겠다.

하지만, 가사가 희석되고 변개된 심 재방 작사의 <신 6· 25 노래>는 정서상 절대 용납할 수 없으며, 그거야말로 개사의 저의를 의심하는 바이다.

오리지널이 무엇이냐고?

사용자 삽입 이미지

아아 잊으랴, 어찌 우리 이 날을
조국을 원수들이 짓밟아 오던 날을
맨주먹 붉은 피로 원수를 막아내어
발을 굴러 땅을 치며 의분에 떤 날을

단조로 시작해서 장조로 끝나는 이 노래이다.
갓 태어난 가난한 신생 독립국이던 대한민국이라는 나라가 지구상에서 사라질 뻔했던 절체절명의 위기를 정말 숨 막히고 섬뜩하고 처절한 가사로 표현했다. 6· 25를 직접 겪은 사람만이 쓸 수 있는 가사이다.

그런데, 이 노래 가사를 불순한 의도로 변개한 놈들이 있다.
가해자의 정체와 전쟁의 근본 원인을 쏙 감춰서 “원수들이 내 조국을 짓밟던 날”을 “국토가 두동강 나고 동족끼리 총부리를 들이댄 날”로.. 오로지 결과만 부각되어 보이게 바꾼 新 6·25 노래가 만들어져 한때 보급되었었다.

이건 일본이 자기네 전쟁 범죄는 입 싹 씻고 사과도 제대로 안 하고 그저 “다시는 실수를 반복하지 않겠습니다”로 얼버무리기만 하고, 자기들도 원폭 피해자일 뿐이라고 궤변을 늘어놓는 것과 하나도 다를 게 없다. 진짜 똑같다.

잘 들어라. 난 분명하고 단호하게 내 이름과 명예를 걸고 선언한다.
6·25 노래에서 북한의 정체성과 그들의 범죄 행위를 제거하는 것은
성경에서 지옥에 대한 묘사를 없애고 예수 그리스도의 피를 없애고 동성애를 정죄하는 표현을 희석시키는 식으로 말씀을 변개하는 것과 완전히 똑같은 맥락이다!

난 이런 짓을 조장하는 진영을 매우 싫어한다.
성경이 말하는 근본주의 교리를 믿고 절대적인 선과 악 관념과 내세관을 갖춘 신자라면 종북 좌빨의 영하고는 도저히 같이 상종을 할 수 없다.

Posted by 사무엘

2013/07/25 19:23 2013/07/25 19:23
, , ,
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/859

북한의 한글 서체

북한에서 만든 한글 서체의 중요한 특징 중 하나:
ㅌ을 E 모양이 아니라 ㅡ+ㄷ 모양으로 쓰는 걸 선호한다! 즉, 위의 가로줄을 아래의 몸통과 분리해서 따로 적는다는 뜻이다.

사용자 삽입 이미지

물론, 북한 서체 중에도 E자 모양인 물건이 없는 건 아니다.
그러나 일단 북한의 굴림-바탕-돋움-궁서에 해당하는 4대 기본 글꼴인 천리마-청봉-광명-붓글이 모두 ㅌ이 ㅡ+ㄷ모양이니, 북한에서는 이걸 ㅌ의 공식적인 기본형으로 간주하는 듯하다.

남한에서 쓰는 글꼴 중에는 ㅌ이 그렇게 돼 있는 물건은 진짜 궁서체밖에 없지 싶다.
북한이야 원래 문화가 196, 70년대-_-의 복고풍을 추구하고 서체도 순명조 내지 붓글씨 계열을 쓰는 걸 좋아하는 동네이긴 하지만, 명조 계열 서체까지 ㅌ을 그렇게 적는 관행은 남한에서는 좀체 찾아볼 수 없다.

북한과 한글 서체라는 두 분야에 모두 평균 이상으로 관심이 많은 나조차 이걸 눈치채는 데 시간이 굉장히 오래 걸린 이유는, 역시 ㅌ이 자주 쓰이는 자음이 아니기 때문이어서인 것 같다.

두음법칙만큼이나 한글의 자형의 미세한 차이도 남북의 문화 차이를 나타낼 수 있는 잣대가 된 듯하다.
원래 ㅌ의 모양은 ㅡ+ㄷ이 맞다는 설명도 옛날에 본 것 같으나, 그 근거를 모르겠다. 당장 훈민정음해례 같은 엄청 옛날 문헌을 봐도 ㅌ은 E 모양으로 그려져 있는데?

Posted by 사무엘

2013/07/23 08:36 2013/07/23 08:36
, ,
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/858

« Previous : 1 : ... 135 : 136 : 137 : 138 : 139 : 140 : 141 : 142 : 143 : ... 214 : Next »

블로그 이미지

그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2024/04   »
  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        

Site Stats

Total hits:
2673396
Today:
88
Yesterday:
1540