Posted by 사무엘
Posted by 사무엘
1. 요즘 날씨도 다시 쌀쌀해져 있는데, 고단한 일과를 마치고 퇴근길에 먹는 순대와 뜨끈한 오뎅 국물이 이리도 맛있을 수가 없다. 행복이란 의외로 작은 곳에 있는 것 같다.
2. 교회에서 어느 샌가 20대 청년 중 최고령-_-에 등극하게 됐고, 여차여차 하던 끝에 20대 청년부 회장으로 당첨. 예배 전 찬양 인도에(부를 찬송을 완전히 내 마음대로 선곡 가능), 교회 홈페이지 운영자 권한 등, 한 교회에서 4년이 넘게 오래 정착해 있으니 점점 권력(?)도 생기고 역할도 커지고 있다.
3. <날개셋> 한글 입력기 버전업을 계속하고 싶은데... 요즘은 관심사가 여기저기 쏠리고 개인 신상의 변화도 있고 해서 영 작업이 안 되고 있다. ㅜ.ㅜ 최근에 스타크래프트 2에서 한글 입력이 잘 안 된다는 보고가 들어와 있지만 이건 뭐 프로그램 덩치가 너무 크고 게다가 계정까지 필요하니 여기서는 도저히 확인할 길이 없다. 이것만 마무리 짓고 나서 5.53 패치라도? 사실 5.52 이후로 이미 이것저것 고친 게 그래도 꽤 된다.
4. 리눅스 쪽은 한글 입력기조차도 EXE 프로세스라는 게 굉장히 인상 깊다. 과거 윈도우 3.1이 그랬었다. 간단하게 실행했다가 종료가 되는 덕분에, 이것저것 고쳐서 테스트하기는 윈도우 환경보다 훨씬 쉬울 것 같다. 이미 실행 중인 EXE 파일을 지울 수도 있다는 것도 윈도우 세상에서는 상상할 수 없던 굉장한 충격임.
앞으로 3년 안으로 맥이나 리눅스 중 최소한 한 플랫폼에다가는 <날개셋> 포팅을 완료하고 싶다. 그런데 XIM이라는 입력 프로토콜 자체가 이미 너무 구닥다리가 되어서, 앞으로 딴 걸로 바뀐다는 말이 있는데 사실인지?
5. 내 홈페이지에서 내 소개와 <날개셋> 한글 입력기와 관련된 페이지만은 영문과 일본어 버전도 만들까 생각 중이다. 특히 한글 입력기의 경우, 이미 일부 일본인들 사이에서도 알려져 있다. 일본어는 보통 로마자 표기 발음으로 입력하기 때문에 그들은 한글도 로마자 발음으로 입력하는 방식을 원하고 있으며, 내 프로그램이 그에 대한 좋은 솔루션을 제공하기 때문이다.
Posted by 사무엘
수학에서 방정식이란, 미지의 변수가 존재하여 이 변수의 값이 무엇이냐에 따라 성립 여부가 달라지는 등식을 말한다.
사실 일차방정식.. 즉, 미지수에 대해서 잘 해 봤자 상수배의 곱만 존재하는 간단한 방정식만 해도 인간의 지적 수준을 크게 끌어올릴 수 있다. 가령, "아날로그 시계에서 5시와 6시 사이에 긴 바늘과 짧은 바늘이 겹치거나 직각이 되는 시각은?" 같은 것도 일차방정식으로 풀어 낼 수 있으며,
마음속으로 어떤 수를 생각해서 뭘 곱하고 뭘 했는데 언제나 무슨 수가 딱 떨어지게 나오는 것은 마술이나 독심술이 있어서 그런 게 아니라 구조적으로 그렇게 될 수밖에 없다는 것을 증명할 수 있다는 말이다. 놀랍지 않은가?
그리고 차수는 일차인데 변수가 여러 개인 경우가 있다. 미지수도 n개이고 식도 n개. 이런 형태의 문제를 푸는 것은 실용적인 가치가 대단히 높기 때문에, 행렬이라는 추상적인 모델로 간단히 표현하여 선형 대수학이라는 별도의 분야까지 수학에 존재한다. 개인적으로 행렬도 굉장한 발견이라고 생각함. 이런 개념을 만듦으로써 어마어마한 양의 문제를 손쉽게 해결할 수 있게 됐기 때문이다.
식에 미지수 자체의 제곱이 들어있으면 이차방정식으로 방정식의 격이 올라간다. 여기서부터는 제곱근, 인수분해 같은 개념이 등장하고 예전보다 살짝 더 어려워진다. 하지만 2차 정도는 인수분해 뿐만 아니라 일반해를 구하는 근의 공식조차 유도가 가능하다. 이미 수백 년 전에 발견되기도 했고, 그렇게 어렵지 않다.
이공계를 나온 친구라면, 비록 입시 코스를 통과했더라도, 수학 감각 자가유지 테스트 차원에서라도 근의 공식 유도 정도는 이따금씩 해 볼 만하다.
참고로 이차방정식의 양변을 x로 나누면 분수 방정식이 된다. 그래프 모양은 2차 방정식과 완전히 다르지만, 반대로 양변에 x를 곱해서 이차방정식 풀듯 풀면 된다. 단, 풀고 나서는 분모를 0으로 만드는 무연근만 버리면 된다. (수학에서 0으로 나누는 게 용납된다면 "모든 수는 0이다" 같은 궤변도 증명할 수 있고 별별 게 다 가능해진다.) 분수 방정식은 비록 정석적인 형태는 아니지만, 조화평균처럼 나눗셈이 수반되는 곳에 미지수가 있을 때 쓰인다.
2차 방정식보다도 차수가 올라간 3차 이상부터는 일반해를 구하는 공식은 2차 방정식의 근의 공식과는 비교도 못 할 정도로 살인적으로 복잡해진다. 대학교 수학과 교수라도 안(못) 외운다. ^^ 학교에서 3차 이상의 고차 방정식은 인수분해가 안 되는 이상한 식이 다뤄지는 일은 없다고 생각하면 된다.
3차 방정식은 2차항을 소거하여 x^3 + p*x + q = 0 형태로 바꾼 후 푼다. 즉, 임의의 3차 방정식은 저 꼴로 본질적인 정보량을 줄일 수 있다는 뜻이다.
본인의 지인 중엔 손으로 3차 방정식의 일반해 공식을 스스로 유도해 냈다고 자랑하던 녀석이 있었다. 뼛속까지 수학과 물리를 진심으로 벗삼아 즐기는 놈인데, 흠좀무.
4차 방정식 역시 일단 3차항을 소거한 뒤 풀이하는데, 임의의 케이스에 대한 일반해 공식은 3차보다도 더욱 길고 아스트랄하다. 과연 대수학(algebra)의 무서움이다. 그냥 저런 게 있다는 것만 알고 넘어가면 된다. 실용적인 가치는 별로 없으며, 실생활에서 그 정도 방정식을 풀 일이 있으면 그냥 numerical하게 근사해를 사용해도 아무 지장 없다.
그런데..
문제는 5차 이상부터이다.
수학 쪽으로 조금만 상식이 있는 분이라면 잘 알 것이다.
5차 이상의 방정식은 대수적인 방법으로 해를 구하는 방법이 존재하지 않는다.
P=NP 같은 것처럼 아직 해답을 못 찾은 게 아니라, 원천적으로 절대 존재 불가능하다는 게 증명이 되어 있다.
인수분해가 안 되는 놈이라면 얄짤없이 포기하고 일찌감치 numerical 근사해로 만족하라는 뜻.
왜... 왜 없는 것일까? 그것도 왜 하필 5차부터?
2차부터 4차까지 일반해를 대수적으로 구하는 근의 공식을 살펴보면
비록 말도 못 하게 복잡하더라도 그 연산 자체는 평이하며 우리의 이해가 가능한 수준이다. 식의 계수에 대해서 적당하게 사칙 연산 씌우고, 거듭 제곱하거나 (거듭) 제곱근을 구하는 작업을 유한 번 적용해 주면 답이 나온다. 즉, 이들 방정식의 해는 대수적 연산이라는 언어로 기술이 가능하다. (좀 전산학적인 개념이 들어가는군..)
그런데 5차 이상의 방정식은 해 자체가 그런 대수적인 방법으로 얻을 수 없는 수에 존재할 수 있다는 걸 증명해 냄으로써,
일반해 공식이 원천적으로 존재할 수 없음을 증명한 것이다.
아니, 사실은 저것도 직접적인 증명이 아니라, 5차 방정식의 일반해를 대수적인 방법으로 기술했을 때 모순이 생긴다고.. 귀류법을 이용해 증명했다.
헐, 그런 수는 도대체 어떻게 생겨먹은 수이며 어떤 특성을 가질까? 루트라든가 기존 대수적 조작을 통해서 특성을 기술할 수 없는 수? 그런데 그렇다고 해서 초월수도 아니고?? 아마 이런 수는 별 특성이 없고 의미가 없다 보니 그렇게 연구가 잘 안 돼 있는 것 같다.
그리고 왜 하필 5차부터 그런 경우가 생기는 걸까? 잘 모르겠다. 그런 걸 알면 내가 이 자리에 안 있지.. ㅋㅋㅋ
※ 외전: 방정식 연구자들의 말로
3차 방정식의 근의 공식을 최초로 찾아낸 사람은 타르탈리아라는 수학자이다(16세기 사람). 그는 이 사실을 절대로 외부에 발설하지 말라는 조건을 걸고 카르다노라는 의사 겸 수학자에게 해법을 전수해 줬는데... 제자인지 라이벌이지 뭐 어떤 사이인지는 모르겠다. 그런데 이 카르다노라는 양반, 아예 책을 써서 해법을 공개적으로 발설하는 것도 모자라서, 그걸 자기 이름으로 떠벌리면서 3차 방정식의 해법의 발견자로 '카르다노'라는 이름을 학계에 당당히 올려 버렸다.
타르탈리아로서는 "저런 쌍노무 새퀴, 인간말종 호로자식을 봤나!" 정말 이성을 잃을 정도로 노발대발하고 카르다노를 향해 매일 축시의 저주를 거행했을 것이다. -_-;; 그것 때문이었을까? 카르다노는 아들이 어머니(=카르다노의 아내)를 살해하고 그 죄에 대한 벌로 아들도 덩달아 처형 당하는 가정 팀킬-_-을 겪었다. 그 역시 도박에 빠져 가난하게 지냈으며, 나중엔 죽는 날짜를 예고한 후 자살로 생을 마감했다. 하긴, 타르탈리아도 그 천재성에 비해 가난하고 어린 시절이 불우했으며 후천성 장애를 얻어 말더듬이였으니 더욱 안습.
4차 방정식의 근의 공식은 카르다노의 제자이고 사실상 그의 양자였을 거라고 추정되는 로도비코 페라리가 최초로 발견했다. 이쪽은 다 16세기 이탈리아 라인이구나. 그런데 그 역시 술과 도박에 빠져 지내다 손가락 장애를 얻고 나중엔 무려 애인 또는 여동생으로 추정되는 여인에게 독살 당했다. -_-;;
그리고 끝으로, 5차 이상의 방정식에 대한 연구는 19세기에 와서야 잘 알다시피 갈루아와 아벨이라는 두 천재 덕후 수학자가 확실하게 종지부를 찍었다. 수학사를 조금이라도 아는 사람이라면 이들이 얼마나 불운한 천재였는지 알 것이다.
닐스 헨릭 아벨(노르웨이)은 5차 이상의 방정식은 대수적으로 풀이가 불가능하다는 것을 최초로 증명하고 이외에도 여러 분야에 탁월한 논문을 남겼다. 그 분야 중 하나는 타원 함수는 아마 20세기 말에 와서 페르마의 마지막 정리를 증명하는 데도 쓰인 이론인 걸로 알고 있다.
그런데 그는... 너무 천재여서 능력을 인정을 못 받은 채, 가난에 찌들고 살다가 26세의 나이로 결핵과 영양실조로 인해 사실상 굶어 죽었다... ㅎㄷㄷㄷㄷㄷ 그가 죽고 나서 이틀 뒤에, 드디어 베를린 대학 교수로 임용됐다는 편지가 도착했으니, 지못미 아벨. ㅠ.ㅠ
갈루아(프랑스)는?? 아벨보다 더하면 더하지 못하지는 않은 덕후였다. 불세출의 논문을 하나 쓴 게 프랑스 과학원의 병신 같은 실수로 인해 분실되어 심사도 제대로 못 받았고, 겨우 21세의 나이로 치정 문제에 연루되어 권총 결투 중에 목숨을 잃었다...;;;
죽기 전날 유언장처럼 쓴 노트가 후대의 수학자들을 놀라게 한 논문이 되었다. 그는 아벨과는 다른 방법으로 5차 방정식의 대수적 풀이 불가능성을 증명하고 더 나아가 n차 방정식의 대수적 풀이 가능 조건을 논하면서 군론(group)이라는 분야를 개척했다. 군 이론에 기초한 방정식의 갈루아 이론은 완전히 이해되는 데만 70년이 넘는 시간이 걸렸다.
Posted by 사무엘
우리나라에서 최초로 마천루 시대를 연 건물은 다름 아닌 ‘삼일 빌딩’이다.
서울 종로구 관철동에 있는 이 건물은 1960년대 말, 경부 고속도로와 거의 비슷한 시기에 완공되었으며,
15년 남짓 뒤에 63 빌딩이 생기기 전까지는 우리나라에서 가장 높은 건물이었다. 건물 높이는 약 110m에 달한다.
작명 원리는 63 빌딩과 동일하다. 이 건물은 31층이다. 하지만 삼일 빌딩은 31 빌딩이라고 쓰지 않으며, 63 빌딩은 육삼 빌딩이라고 표기하지 않는 게 흥미롭다. 물론 63 빌딩은 지상은 60층일 뿐이긴 하지만 말이다.
31일이라는 층수는 ‘삼일절’에서 모티브를 딴 것이며, 항일 의지를 담아서 의도적으로 이 층수대로 건물을 만들라고 당시 박 정희 대통령이 지시를 했다고 한다. 다행히 우리나라 기술진이 나름 성공적으로 설계와 건설을 해 냈으며, 건물이 완공되자 시민들은 감탄하여 목이 빠지게 위를 쳐다보면서 층수를 세느라 정신없었다고 한다. 훗날 서울 지하철이 첫 개통했을 때 신기해하던 것과 비슷한 맥락이다.
삼일 빌딩은 있는 곳도 지극히 서울스러운 도심 한복판이다. 그러니 서울의 상징으로 등극할 수밖에 없다. 청계천이 내려다보이며, 종각· 종로3가· 을지로입구· 을지로3가라는 네 전철역의 정확한 중앙에 자리잡고 있다. 서울 역, 서울 시청 등과 아주 가깝다. 꼭대기 층인 31층에는 뷔페식당이 있는데 창밖을 내려다보면 청와대도 보이고 동대문 두산 타워까지 서울 시내가 한눈에 들어온다.
본인은 이 건물에 입주해 있는 회사에서 병역 특례 근무를 한 적이 있는지라 이 건물에 더욱 애착이 간다. 위치 하나는 정말 끝내 준다. 청계천 길을 따라 자전거로도 출퇴근도 해 보고, 거기서 한글 회관까지도 자전거로 가 봤다.
이제 무려 40년을 묵은 건물이 됐지만 그리 낡은 티는 안 난다. 단 하나, 엘리베이터가 굉장히 후지고 더구나 주행 모습이 위태로웠는데 2008년을 전후하여 다행히 새 걸로 교체되었다.
서울 금싸라기 한복판이라는 특성상 임대료가 너무 비싸서(그럴 만도 하다-_-), 당시 회사가 구로나 DMC 쪽으로 이사를 가려 한다는 말이 있었는데 그냥 루머로 끝났는가 보다.
한국 최고층 건물이라는 기록은 훗날 63 빌딩에게로 넘어갔다. 위치는 잘 알다시피 여의도이다.
철도로 상경하다 보면 이 63 빌딩 건물은 창밖으로 꼭 보게 된다. 서울 톨게이트보다 이런 게 진짜 내가 서울에 도착했다는 인상을 더욱 강렬히 준다.
63빌딩의 높이는 약 240~250m이며, 층수가 두 배이니 높이도 삼일 빌딩의 두 배보다 약간 더 높다. 건설은 외국 회사가 한 것이다.
63빌딩과 직선 거리상으로 가장 가까운 전철역은 노량진 역이다. 하지만 지정학적인 이유로 인해 거기서 바로 63빌딩으로 가지는 못하고 여의도 상에 있는 5호선 여의나루나 9호선 샛강 역에서 내린 후 도보로 6, 700미터 이상 꽤 걸어야 갈 수 있다. 여의나루 역에서 여의도 순복음 교회와 63빌딩은 방향이 정반대일 뿐 서로 비슷한 거리이다. -_-
건물 주변 경관은 무척 좋다. 여의도 하면 증권가가 먼저 생각나지만, 63빌딩이 있는 곳은 강변 고수부지가 코앞에 있고, 지어진 지 오래된 것 같은 아파트들이 들어선 주거 구역에 더 가깝다. 도심이라기보다는 꼭 지하철 종점 같은 교외 느낌이 들 정도이다. 삼일 빌딩 주변과는 사뭇 다른 느낌이다. 이런 곳에 있는 회사에서 근무하는 것도 재미는 있을 것 같다.
지금은 63빌딩보다도 더 높은 건물이 강남 타워팰리스를 포함해 서울 목동에도 생겼지만, 평일 낮에 아무나 들어갈 수 있는 “업무 건물” 중에서는 지금도 여전히 63빌딩이 국내 최고층 빌딩이다. ^^;;
옛날에 분당선 구룡 역과 도곡 역 일대를 답사하면서 타워팰리스를 직접 본 기억이 있다. 양재천이 바로 앞으로 지나기도 하고 나름 괜찮은 주거 구역이라는 인상을 받았다. 비록 구룡 역은 정말 태어나지 말았어야 할 ‘굴욕’ 역임이 틀림없음도 확인했지만 말이다.
앞으로도 63빌딩보다 더 높은 건물은 계속 지어질 예정이다.
1990년대에 전철 분당선만 해도 신도시 건설과 동시에 건설되는 노선이었고, 지하로 건설해야 할 이유가 전혀 없었다. 그런데도 불구하고 안산선 같은 지상+고가 형태도 아니요, 하다못해 일산선처럼 지상+지하 짬뽕도 아니라, 건설비 증가를 감수하면서까지 전구간 지하로 건설된 이유 중 하나는 인근의 성남 서울 공항 보안 문제 때문이었다고 한다.
그런데 지금은? 보안 같은 건 안중에도 없다. 오히려 고층 건물 짓느라 서울 공항 활주로를 틀겠다고 하니 세상 참 심하게 많이 바뀌었다. 그렇잖아도 지금 잠실 역은 역명을 롯데 역으로 바꿔도 좋을 정도로 온통 롯데월드 천지가 되었는데 초고층 건물까지 생기면... 흠좀. 잠실 역의 혼잡도 가중되고 교통 역시 강남 역 주변 수준으로 열악해지지 않을까 우려된다.
고층 건물은 엘리베이터도 굉장한 고성능으로 장착하게 된다.
목적지 층보다 두세 층 이전부터 속도를 줄이는 기미가 느껴지는 정도라면, 어지간한 건물에서는 찾기 어려운 고속 엘리베이터이다. ^^;;
엘리베이터의 수 자체도 여러 대가 필요해지는데, 과거에는 단순히 저층/고층과 홀수층/짝수층으로 수요를 분산하는 정도였지만 요즘은 그런 거 구분 없이 버튼만 누르면 가장 빨리 도착할 수 있는 엘리베이터를 알아서 세워 주며, 아무 걸 타도 아무 층으로나 갈 수 있다. 그래서 야기될 수 있는 비효율은 오로지 엘리베이터의 뛰어난 가감속력만으로 극복하는 것이다.
아무튼, 고층 건물만으로도 글 쓸 게 참 많다. ^^;;
Posted by 사무엘
C/C++ 언어는 언어 차원에서 자체 제공하는 문자열 타입이란 게 없다.
문자열은 단순히 문자의 배열 내지 이를 가리키는 포인터로 취급되며, 코드 번호 0인 문자가 문자열의 끝을 나타내는 매우 원시적이고 단순한 방법을 사용하고 있다. 그 이름도 유명한 null-terminated string 기법이다. (이하 편의상 NTS로)
깔끔하고 쓰기 편한 문자열 처리를 제대로 구현하는 데 드는 비용을 감안한다면, 이것은 그렇게 나쁜 방법은 아니다. string은 int보다야 처리하기가 훨씬 무거운 건 사실이다. 더구나 C/C++은 정말 1바이트라도 더 아끼고 한 클럭이라도 더 줄여야 하는 시스템 프로그래밍 용도로 개발된 언어인 것이다.
NTS 방식으로 문자열을 다루지 않는 언어도 있다. 이런 언어는 문자열의 길이는 별도의 장소에 보관하며 스트링의 내부에 0번 문자가 있을 수도 있다. 그런데 이런 언어로 프로그램을 짜더라도, NTS를 받는 운영체제 API에다 문자열을 넘겨줄 때는 뒤에다 0번 문자를 손수 추가하여 문자열을 변환하곤 한다. 운영체제 커널이야말로 C 언어 기반인 경우가 태반이기 때문이다.
하지만 다른 모든 곳에는 NTS 문자열 포인터만 받더라도, 그래픽 API는 비록 C언어 스타일이라 할지라도 이례적으로 문자열 포인터뿐만 아니라 문자열의 길이를 별도의 인자로 따로 받는 경우가 많다. 윈도우 API도 그 대표적인 예인데, 그 이유는 명백하다. 그래픽 처리의 특성상 NTS 문자열을 일부 몇 글자만 찍어야 하는 경우도 빈번하게 발생하기 때문이다.
NTS는 간단하고 효율적인 대신, 문자열의 끝을 언어나 프레임워크 차원에서 보장을 하지 않는다는 특성 때문에 오늘날 버퍼 초과 같은 보안 문제의 온상이 되어 있다. 가령, C 표준 함수 중에 strcpy는 잠재적으로 굉장히 위험한 함수이거니와, 파일도 아니고 키보드 입력을 받는데도 버퍼 크기 한계 지정도 없이 설계되어 있는 gets는 정말 도저히 그대로 쓸 수 없는 지경이 되어 있다.
이 문제를 해결하기 위해 윈도우 SDK에는 꽤 오래 전부터 StringCb* 함수들을 도입했다. write 버퍼의 포인터뿐만 아니라 버퍼 크기도 별도로 지정하여 복사가 그 영역 밖으로는 되지 않게, 즉 문자열이 잘리도록 조치를 취한 것이다. 이것들은 그냥 static 링크되는 코드이지 운영체제 커널 DLL에 있지는 않다는 점에서 lstrcpy 같은 함수와는 위상이 다르다. 사실 저 함수 자체가 기존 커널 l* 함수보다 더 안전한 솔루션을 제공하기 위해 추가된 것이다.
비주얼 C++ 2005부터는 보안 문제를 더욱 적극적으로 대처하는 함수군이 생겼다. 아예 _s 접미사가 붙은 strcpy_s 류이다. 이것도 하는 일은 기존 strcpy보다 더욱 안전하게 문자열을 복사하는 것이지만, 다음과 같은 면에서 StringCb*와는 동작 방식이 약간 다르며, 쓰임이 더 엄격하다는 것을 알 필요가 있다.
첫째, StringCb*는 버퍼 크기가 걸리면 문자열을 그냥 자르고 null-terminate까지 알아서 시켜 주는 반면, *_s는 런타임 에러를 발생시킨다. 그러므로 전자는 단순히 로그를 찍는 것과 같이 문자열이 꼭 다 복사되지는 않아도 되고 버퍼 초과 에러만 예방하고 싶을 때 쓰면 되며, 후자는 어떤 경우에도 버퍼가 초과하는 일 자체가 없이 문자열이 100% 정확하게 복사되는 게 보장되어야 할 때 쓰면 된다.
둘째, 특히 디버그 버전의 *_s 함수는 지정해 준 버퍼 영역을 다 검사한다. 비록 지금 한 글자밖에 복사할 게 없더라도 사용자가 100글자를 지정했다면 그 메모리가 다 안전한지 일일이 검사한다는 뜻이다. 그렇기 때문에
char a[8];
strcpy_s(a, 12, "ABC"); //12>8
는 비록 전혀 해롭지 않은 코드임에도 불구하고 에러를 일으킨다. 디버그 빌드에서는 말이다.
strcpy 같은 간단한 함수뿐만 아니라 scanf 함수도 쓰임이 강화되었다. 가령,
char s[64];
scanf_s("%s", s, 64);
이런 식으로 %s도 버퍼뿐만 아니라 버퍼의 크기까지 덧붙이도록 동작이 수정되었다는 뜻이다.
*_s 함수는 일부 템플릿 오버로드 버전도 존재하기 때문에, 기존 코드에다 *_s 함수를 넣는 리팩터링 작업을 할 때 일일이 배열 사이즈를 집어넣어야 하는 수고를 상당수 덜어 준다. 가령, 쓰기 버퍼가 포인터가 아니라 static 배열인 경우,
template<int N>
.... strcpy_s(char (&dst)[N], const char *src)
{
return strcpy_s(dst, N, src);
}
이런 템플릿 오버로드가 이미 구비되어 있는 덕분에, strcpy를 strcpy_s로 바꾸기만 해도 알아서 배열의 크기가 전달된다. 물론 컴파일 타임에 말이다.
물론, 쓰기 버퍼가 임의의 포인터인 경우에는 이런 방법을 쓸 수 없고 사용자가 버퍼 크기를 수동으로 전달해 줘야 할 것이다.
본인도 어지간하면 이런 안전한 함수를 쓰고 싶은데, strchr/strstr 같은 함수의 결과값에다가 또 strcpy를 해야 할 때는 남은 버퍼 크기를 지정해 주는 게 좀 난감하다.
덧.
1. C언어에서 정적 배열의 원소 개수를 구할 때는 통상
#define ARRAYSIZE(x) sizeof(x)/sizeof(x[0])
과 같은 형태로 정의하며, 이렇게만 써 놔도 이 식은 최적화 과정에서 모두 컴파일 타임 때 고정된 값이 계산되어 들어간다. 하지만 ARRAYSIZE 매크로도 템플릿을 이용한 매크로로 바꾸면 나눗셈 연산도 없고 더구나 배열이 아닌 일반 포인터를 넘겨주면 에러까지 나는(더욱 type-safe하기까지 한) 버전을 만들 수 있다.
템플릿으로 컴파일 타임 때 정말 별 걸 다 할 수 있다. ^^;; strcpy_s의 템플릿 오버로드 버전을 보니까 문득 이게 생각이 났다.
2. 아울러 어떤 구조체 멤버가 메모리 상으로 몇째 오프셋을 나타내는지 가리키는 매크로도 NULL 포인터로부터 ->로 참조한 멤버 값의 주소를 가리키는 방식으로 만들 수 있다. NULL 포인터는 -> 연산자를 적용하기만 하면 바로 에러가 날 것 같지만 주소 연산자 &는 메모리 위치에 상관없이 컴파일 타임 때 값이 계산되는 연산자이기 때문에 그런 일은 발생하지 않는다.
3. C/C++에서 0이라는 수치는 숫자와 포인터에 모두 아무런 형변환 없이 적용 가능한 녀석이어서 문제이다. true, false는 이미 진작부터 예약어가 생겼는데 C++도 nil이나 null 같은 예약어가 있어야 하지 않나 싶다. 본인은 전에도 이런 언급을 한 적이 있을 것이다.
Posted by 사무엘


Posted by 사무엘
Posted by 사무엘
![]() | ![]() |
Posted by 사무엘
서울의 도시철도는 잘 알다시피 코레일 광역전철, 1기 지하철, 2기 지하철, 3기 지하철 정도로 나뉜다. 여기에다 앞으로 공항 철도도 서울로 더욱 가까이 진입하게 된다.
1기 지하철들은 연혁이 긴 덕분에 초기 전동차들은 모두 은퇴하고 일종의 ‘세대교체’까지 이루는 경지에 도달했다. 차량도 매우 다양하다.
이에 반해 2기 지하철들은 한국형 표준 대형 전동차 규격대로 디자인되어 외관이 일관성이 있다. 그 대신 VVVF 과도기에 도입되었다는 특성 때문에 전국 어느 철도에서도 찾을 수 없는 다이나믹한 구동음을 들을 수 있다. 즉, 보이는 것보다는 들리는 것이 사람을 더욱 즐겁게 한다.
3기 지하철들은 이제 중형 전동차의 표준 규격이 제정되고 지방 광역시에도 속속 지하철들이 개통하는 시기에 개통했다. 9호선 전동차는 폭만 조금 더 클 뿐 그 규격을 따르고 있으며, 이제는 구동음마저도 음높이의 차이가 있을 뿐 딱히 차이가 나타나지 않고 있는 게 대세이다.
이렇게 서울 지하철에는 나름 개성과 사연이 존재한다. 하지만 이들 철도는 모두 표준궤를 달리는 대형 중전철이라는 기본적인 공통점이 있다. 대형 중전철은 서울을 통과하지 않는 곳에서는 어디에서도 볼 수 없다.
그럼 우리나라 제 2위의 대도시인 부산은 어떨까?
비록 시설과 규모면에서 서울 수도권을 따를 수는 없으나, 나름대로 개성이 넘치고 재미있다.
특히 지하철은 서울처럼 ‘기’라는 묶음이 있는 게 아니라, 각각의 노선이 ‘기’라고 해도 과언이 아닐 정도로 특색이 넘친다. 늦게 개통하는 노선일수록 규모가 더욱 작아지고 있다.
부산은 서울처럼 여러 지하철 노선이 동시에 건설된 적이 없다. 하지만 그럼에도 불구하고 환승역들은 전반적으로 환승 거리가 괜찮은 편이다. 최소한 잠실이나 신길 같은 막장환승은 없다.
- 부산 지하철 1호선: 중형 중전철 8량. 개통 시기가 서울 2호선과 비슷. 전국에서 유례를 찾을 수 없는 특이한 3도어 전동차. 2010년 현재 전국에서 VVVF 차량이 전혀 없는 유일한 지하철.
- 부산 지하철 2호선: 중형 중전철 6량. 대구 1호선과 비슷한 시기이며 동일한 스펙. 기술적으로도 서울 2기 지하철 VVVF를 답습
- 부산 지하철 3호선: 중형 중전철 4량. 광주/대구 1호선과 비슷한 시기이며 동일한 스펙. 중형 전동차 표준안이 반영됨
- 부산 지하철 반송선: 처음엔 마치 3호선의 지선인 것처럼 계획되었다가 결국은 경전철로 전환. 시설면에서 기존 3호선과는 사실상 아무 관계가 없는 노선이 되었고 이게 사실상 4호선으로 확정되었다. 서울도 이제야 경전철 건설이 논의되고 있는데 꼭 그런 차원이라 하겠다.
고무 바퀴 차량이 다니며, 3호선보다도 많은 6량 1편성이 다닐 거라고 하니 뜻밖이다. 용인 경전철과는 달리 지하 구간도 존재한다.
- 김해 경전철: 전통적인 부산 관할의 도시 철도라기보다는, 서울로 치면 공항 철도나 9호선뻘 되는 위상이다. 이름에서 알 수 있듯 시내라기보다는 부산-김해간의 광역 기능을 담당하는 경전철인데, 반송선과는 완전히 다른 차량이다. 표준궤에 철 바퀴이고 그 상태로 덩치만 줄인 2량 1편성짜리 전철이다.
이 사업에서 지분을 70%나 차지하고 있는 기업은 다름 아닌 서울 메트로이다. 우리나라의 지하철 회사 중 최강의 경험과 자본을 자랑하는 이 회사는 이미 서울만의 지하철 회사 수준을 벗어난 지 오래 됐다.
타자기와 비슷한 형태의 키보드를 탑재하고 있던 데스크톱 컴퓨터뿐만이 아니라 요즘은 모바일 터치스크린 기기가 뜨고 있는 것과 마찬가지로, 철도계도 전통적인 표준궤 철도 말고도 여러 형태의 경전철들이 등장하고 있는 느낌이다.
김해 경전철이 개통하면 이제 김해 공항에도 철도로 갈 수 있게 된다. 다만 KTX가 완전히 개통하면 국내선 승객이 크게 감소할 것을 우려하여 역은 국제선 청사 쪽에다 만든다고 한다. (김포공항 역처럼 중앙이 아니라)
끝으로,
- 울산-부산 동해남부선 광역전철: 서울은 무려 40년 전에 인천, 수원 가는 전철이 그것도 지하철과 직통으로 뚫렸는데 그동안 부산은 뭘 했나? 게다가 이미 지하철 2호선은 경부선과 선형이 겹치는 구간까지 있는데 말이다.
수도권으로 치면 응당 광역전철과 같은 위상이다. 동해남부선은 경주 쪽은 KTX 2차 구간 개통으로 인해 대대적인 리모델링을 거칠 것이고, 울산과 부산도 광역전철 개통이 계획은 되어 있다. 하지만 언제 실현될지는 미지수. 철도계의 ‘듀크 뉴켐 포에버’가 되지 않길 바란다. 참고로 수도권에서는 수인선이 저런 떡밥으로 전락하고 있는 중이다. -_-;;
서울-수도권과 같은 철도 네트워크를 비수도권에서도 볼 수 있었으면 좋겠다.
Posted by 사무엘
전철(서울 지하철 5, 9호선; 공항 철도) 김포공항 역은 여러 건물로 이루어진 김포 공항 단지(complex? ㅋㅋ)의 딱 중앙에 자리잡아 있다.
내부엔 자연 채광이 들어오는 로터리가 하나 있는데 그 로터리의 남쪽은 국내선 청사 방면이요, 북쪽은 국제선 청사 방면이다.
그리고 서쪽은 한국 공항 공사 본사 방면이고 동쪽으로 가면 9호선과 공항 철도 공용 승강장이 나온다.
하지만 인천 공항 개항 전에는 지금의 한국 공항 공사 건물이 국내선 청사였고, 지금의 국내선과 국제선 청사는 각각 국제선 1청사와 2청사였다고 한다. 인천 공항에 비해 지금 김포 공항은 정말 규모가 작음을 알 수 있다. 있던 건물도 각종 상업 시설로 개조를 많이 했기 때문이리라. 비록 공간에 한계를 느껴서 인천 공항을 더 만들게 됐지만, 김포 공항도 왕년에 한 나라의 허브 공항 역할을 할 정도였으니 원래 작은 크기는 결코 아니다.
전철이 있는 로터리는 5호선의 뒷쪽(상일동· 마천 방면)에 치우쳐 있는 편이기 때문에, 서울 도심에서 5호선을 타고 김포 공항 국내선을 이용하거나 공항 철도로 여행을 계속하려면(인천 공항 국제선), 진행 방향 기준 뒷칸을 타는 게 환승에 유리하다. 하지만 흔치는 않은 경우이지만 김포 공항 국제선을 이용하기 위해서는 앞칸을 타는 게 유리하다.
5호선과 9-공철 승강장은 서로 L자형으로 교차하며, 둘의 고저 차이가 무척 크기 때문에 환승 거리는 약간 긴 편이다. 5호선은 김포 공항을 경유하기 위해서 심한 드리프트를 한 후, 방화 방면으로 북쪽으로 향하게 된다. 마치 월드컵 경기장을 경유하기 위해 드리프트가 생긴 6호선과 비슷한 맥락이라 하겠다.
그 반면 9호선과 공철은 수평을 향하고 있으며 잘 안다시피 평면 환승에다 직결 운행까지 예정되어 있다. 2기 지하철에는 전혀 없고 1기 지하철인 1, 3, 4호선에서나 볼 수 있던 직· 교류 겸용 전동차를 9호선에서 보는 날이 과연 올까?
전철역 환승 로터리에서 국내선이든 국제선이든 공항 여객 터미널까지는 여전히 250~300미터 가까이 긴 통로를 통과해야 한다. 사실 어느 정도 되는 규모의 공항에서, 국내선과 국제선 청사는 지하철 한 정거장 거리까지는 안 되더라도 버스 한 정거장 정도 거리는 된다. 여기는 무빙워크가 진작부터 존재해 왔다. (종로3가 역 무빙워크보다 훨씬 더 일찍) 물론 인천 공항도 전철역에서 터미널까지 거리가 꽤 길기 때문에 무빙워크가 중간 통로에 있다.
각종 표지판들은 인천 공항은 잘 알다시피 군청색 바탕의 전속 서체를 쓰고 있는 반면
김포 공항은 짙은 고동색 바탕의 맑은 고딕 서체를 쓴다.
무선 인터넷은 인천과 김포 모두 잘 되는 것을 확인했다. 인천은 네이버가 제공했는데 김포는 알 수 없는 이름이 뜬다.
인천 공항은 지하 1층 로비(환전과 로밍 시설), 1층 도착장, 2층 항공사 사무실, 3층 항공사별 탑승 수속 부스 겸 탑승장으로 딱 나뉜 것으로 기억한다. 그리고 그 위로 3층이 내려다보이는 4층에 일부 식당가가 있다.
김포 공항의 구조는 이와는 약간 다르다. 국내선과 국제선 모두 1층 로비 겸 도착장, 2층 항공사 부스이고 2층보다 공간이 좁은 3층에 몇몇 식당들과 더불어 탑승구가 있다.
한편 부산의 김해 공항은 어떻더라? 딱 들어가서 비행기를 탈 때까지 계단을 이용한 기억이 없는데 잘 모르겠다. 공항까지 지하철이 아닌 버스를 탔기 때문에 애초에 위쪽의 탑승층에서 내린 것일 수도 있다.
국내 대부분의 국제공항들은 국내선과 국제선의 비중이 서로 비슷한 수준이다. 그에 반해 인천 공항은 압도적으로 국제선의 비중이 높다. 그렇지만 인천 공항에도 국내선이 전혀 없는 건 아니다. 가령, 대구는 KTX에 밀려 김포 공항 노선은 없어졌지만 하루 단 한 번 인천 공항으로 바로 가는 노선은 있다.
인천 공항 내부의 국내선 이용 통로는 마치 서울 역으로 치면 서울-천안 급행 전동차를 타는 통로처럼 아주 작고 평상시엔 찾기도 쉽지 않은 그런 시설이겠다는 생각이 든다.
항공을 포함해 모든 원거리 대중교통들은 탑승 전에 별도의 직원이 승차권/탑승권을 검사하는 반면, 우리나라에서는 최소한 철도만은 그런 게 (거의) 없다. 지하철은 아예 기계가 개· 집표를 대신하고 있고 일반열차는 그런 절차가 사실상 완전히 사라졌다. 아마 KTX 정도나 입석· 자유석 승객을 중심으로 하여 승무원이 차내 불시 검문이나 아주 가끔씩 하고 있을 것이다.
김포 공항을 주말에 답사하니 역시 인천만치는 아니어도 북적북적 분주한 분위기가 느껴졌다. 여행 가는 승객도 많고, 출장이라도 오고 가는지 검은 양복 넥타이 부대 아저씨들도 많이 보였다. 나도 어서 성공하고 돈도 많이 벌어서 KTX도 많이 타고 비행기 많이 타고 다니고 싶다.
Posted by 사무엘
그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.
- 사무엘
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |