싱싱한 해산물들을 맛볼 수 있는 곳 - 해운대 전통시장 [2019.06.15]


 매년 내일로 시즌 때마다 부산을 방문하면 해운대를 항상 방문해 바닷가를 감상해왔습니다. 그런데 매번 아름다운 바닷가에만 매료되어 인근에 전통시장이 있다는 사실을 이제서야 알게 되었습니다.

 그래서이번에는 해안도시 부산에 위치한 해운대 전통시장을 방문해 보았습니다.





해운대 시장은 해운대역에서 해운대 방향으로 계속 걷다보면 떡볶이를 파는 골목 즈음에 위치해 있습니다.



입구 인근에 도달하자마자 호떡 가판대가 보입니다.



확실히 부산의 랜드마크 인근에 있는 시장이다 보니 유동인구는 많습니다.



해운대 시장에서 가장 큰 특징이라면 곰장어를 파는 집이 많다는 점입니다.



어떤 시장에서는 누에를 팔고 있습니다. 누에를 실물로 보는건 처음이군요.



거리에 앉아 해물을 파는 상인 분도 계십니다.



말로만 듣던 독도꽃새우를 처음으로 봅니다. 무슨 맛일까요?



부산하면 횟집은 빼놓을 수 없는 곳이죠!



호떡이 굉장히 맛있어보입니다. 치즈 호떡도 맛이 좋더군요.



시장 한가운데에서는 청과물을 파는 시장도 존재합니다.



밤 시간대가 되면 시장은 또다른 모습으로 손님을 맞이합니다.



어항의 물고기들도 밤이 되니 좀 더 분주히 움직이는것 같아 보입니다.



시장을 돌아다니던 중 사람을 좋아하는 고양이 한 마리가 보입니다.



낮선 사람을 가리지 않고 놀아달라는 듯히 바라보는군요.



꼼장어의 껍질을 벗겨낸 모습입니다. 조금은 징그럽네요.



밤이 되니 손님들이 훨씬 많아졌습니다.



물고기 뿐 아니라 전복이나 개불과 같은 것들도 팔고 있습니다.



조금은 단촐하지만 3만원 어치의 막썰어회에 도전해 보았습니다.

광어, 우럭, 도다리로 구성되어 있는데 굉장히 맛이 좋더군요.



다음날 아침 해운대의 모습입니다.

슬슬 여름을 준비하는지 파라솔이 설치되어 있습니다.



이 큰 길을 지나 끝부분까지 걸어가면 구 해운대역이 있습니다.

이 거리에 관광객들이 많이 지나다니고 했었는데

광화문처럼 중앙에 보도를 둔 것은 상당히 좋은 아이디어인 듯 합니다.



바로 뒤편에서 바라본 해운대 바다의 모습입니다.



해운대를 떠나기 전 마지막으로 바라본 해운대 전통시장의 모습입니다.

다음에도 해운대에 놀러와 보고 싶네요!






300x250

2019 부산국제철도기술산업전 [2019.06.15]


 전에 모터쇼 전시회를 다녀오면서 장래희망을 꿈꾸었던 적이 있었습니다. 이번에 사회에 제 자신이 어떤 공헌을 할 수 있을지를 고민하면서 부산 BEXCO에서 주최하는 부산국제 철도기술산업전에 다녀와 보았습니다.




마침 벡스코 앞에서는 수제맥주 페스티벌도 동시에 열리더군요.



행사장 입구에서부터 기대감이 오르기 시작합니다.



철도 기술 박람회 답게 철도에 쓰이는 다양한 요소들이 전시되고 있습니다.



둘러보다 보니 인천공항 셔틀트레인의 모형이 보이는군요.



경춘선을 절찬리에 달리고 있는 ITX-청춘도 등장합니다.



철도계의 대기업인 현대로템 답게 다양한 볼거리를 제공하고 있었습니다.



심지어는 실제 전동차의 일부를 박람회에 가져다 놓기도 하더군요.



이 전동차는 튀니지로 수출이 예정되어 있다고 합니다!



열차 천장에서만 보던 팬터그래프를 이렇게 가까이 볼 수 있는것이 참으로 신기했습니다!



은하철도999에 등장하던 차장님이 현실에서도 나타났습니다.

머리가 없는 모습이 너무나 무서웠는지 지나가던 어린 아이들이 종종 이 모습을 보고 놀라기도 합니다.



돌아다니던 도중 다원시스 부스를 지나가게 되었습니다.



이번에 들어가게 된 7호선 열차라고 하네요.

얼핏 보고 최근 투입된 2호선과 헷갈렸습니다. 디자인은 비슷한 듯 하면서 다릅니다.



부스 한 켠에서는 동해선 연결을 기원하며 침목을 기증하는 자리가 있었습니다.

강릉에서 제진까지 험한 산지를 과연 어떻게 철길을 놓을지 조금은 궁금하기도 합니다.



철도 모형을 만드는 부스도 참가하였더군요.

어린 아이들이 많이 방문하여 모형을 주문해갑니다.



전차선이 늘어지지 않도록 잡아주는 역할을 하는 카테너리 시스템입니다.



손잡이의 디자인이 다양하게 전시되어 있는게 신기하네요.



심지어 건널목 아래에 깔리는 고무보드도 있습니다.

그러고보니 요즘 건널목에는 나무보다는 고무가 쓰이는 듯 하지요.



조만간 중앙선 구간을 달릴 열차입니다. 과연 어던 모습으로 나타날지 기대되네요.



다원시스에서 전시하였던 7호선 열차 내부에 들어가 보았습니다.

벌써 내부에는 노선도 스티커도 붙여놓았더군요.



과연 7호선에서 달릴 이 열차는 어떤 모습일지 벌써부터 기대됩니다.




 이날 부스는 전체적으로 볼거리는 괜찮았습니다. 다만 일반인들 입장에서는 VR이나 실물모형을 보는 정도면 충분히 만족할 만 하겠지만 열차에 대해 좀 더 자세히 알고 싶은 사람 입장에서는 중소기업 전시관이 마지막날이어서 짐을 싸고 있어서 충분히 구경을 다 하지 못한게 상당히 아쉬웠습니다.


 다음 전시는 2년후라고 합니다. 과연 2년 후의 우리나라의 철도 환경은 얼마나 달라져있을까요?




300x250

Extreme Learning Machine(극학습기계)

공대생의 팁 2019. 5. 15. 02:57


 인공지능 분야가 발전하면서 다양한 구조의 알고리즘들이 발굴되고 있으며 이는 조금씩 발전되고 있습니다. 물론 각 알고리즘들이 제시하는 다양한 제안들이 하나둘씩 쌓여가다 보면 언젠가는 알파고를 뛰어넘는 새로운 알고리즘이 나타나리라 기대합니다.

 이번 포스팅에서는 2006년 난양공대(NTU)의 Guang-Bin Huang이 투고한 2019년 5월 15일 현재 피인용수 7044회의 논문인 Extreme Learning machine에 대해 보도록 하겠습니다.



 Neural Network(인공신경망)의 구조는 거의 대부분이 다음과 같은 모습을 가지고 있습니다.


 위의 그림에서 x는 input, b는 bias, w는 input layer와 hidden layer를 연결해주는 weight vector, N는 hidden layer의 node, β는 hidden layer와 output layer를 이어주는 weight vector, t는 output을 의미합니다. 위 그림의 neural network를 식으로 다음과 같이 나타낼 수 있습니다.



 이 때 함수 g()는 무한으로 미분이 가능한 함수로 흔히 알려진 삼각함수 sin() 혹은 cos()와 자연함수 e^x가 있습니다.


 위 구조의 Neural Network를 기존의 방식대로 학습을 시킬때는 다음과 같은 방법으로 흔히 사용합니다.



 흔히 사용되는 알고리즘은 forward propagation으로 계산을 하여 기존의 출력값과 비교하여 오차를 구한 후 back propagation 과정을 통해 weight값을 조정합니다. 가장 보편적으로 사용되는 알고리즘이지만 다음과 같은 이슈가 존재합니다.


 1) learning rate인 η의 값이 너무 작으면 학습 속도가 매우 느려진다. 그러나 η의 값이 너무 클 경우 학습 속도가 불안전해 지면서 심할 경우 값이 수렴되지 않고 발산하는 경우가 발생한다.

 2) back propagation을 하는 과정에서 값이 local minima에 빠질 가능성이 존재한다. 이 경우 global minimum에 도달하지 못하고 local minima에 갇혀버릴 수 있다.

 3) back propagation에 의해 오버트래이닝이 되면 over-fitting이 되어 학습 결과물이 더 좋아지지 않을 가능성이 있다.

 4) 위의 알고리즘 자체에서 가지고 있는 핵심 수단인 gradient-base 학습은 시간이 매우 많이 걸리는 방법이다.


 가장 많이 사용되는 gradient-base 알고리즘의 단점들을 좀 더 효율적인 방법을 찾아보기 위해 만들어진 알고리즘이 이번에 소개하는 Extreme Learning Machine입니다.


 그럼 위에서 보았떤 Neural Network의 구조를 다시 한 번 보도록 하겠습니다.



 Neural Network의 입력에서 hidden layer까지의 과정을 H로 가정하고 이를 식으로 나타내면 다음과 같이 나타낼 수 있습니다.



이 때 위의 식에서 나타낸 부분들은 아래와 같이 나타낼 수 있습니다. 





 위에서 주어진 행렬 H를 사용하여 최적의 값을 찾기 위해 다음과 같은 식으로 나타낼 수 있습니다.



 기존의 출력값 T를 행렬 H와 β의 최소값을 찾아 결과값이 최소로 나오게 한다면 우리는 최적의 weight vector를 얻을 수 있습니다. 위 식에서 β의 최소값은 다음과 같은 식으로 찾을 수 있겠습니다.



 이 식을 사용함으로서 기존의 알고리즘에서 사용하던 back propagation 과정을 거치지 않고 적합한 값을 빠르게 찾을 수 있는 방법입니다. 여기서 †는 Dagger(칼표)로서 Moore-Penrose generalized inverse(Pseudo inverse, 의사역행렬)로서 행렬 H가 정사각행렬이 아닐 때 유사 역행렬을 구하는 방식입니다. pseudo inverse에 대해 자세히 알고 싶으신 분들께서는 아래의 사이트를 참조 하시면 큰 도움이 될 것입니다.


https://darkpgmr.tistory.com/108


 이러한 방식의 Extreme Learning Machine을 좀 더 발전시켜 auto encoding을 사용하는 OS-ELM알고리즘과 OR-ELM알고리즘으로 발전하게 됩니다. OR-ELM의 알고리즘에 대해 다루는 사이트를 소개하면서 글을 마치도록 하겠습니다.


Online Recurrent Extreme Learning Machine

https://github.com/chickenbestlover/Online-Recurrent-Extreme-Learning-Machine




출저 : HUANG, Guang-Bin; ZHU, Qin-Yu; SIEW, Chee-Kheong. Extreme learning machine: theory and applications. Neurocomputing, 2006, 70.1-3: 489-501

https://www.sciencedirect.com/science/article/pii/S0925231206000385



300x250

바닷가가 보이는 동해선 도보여행기(좌천역~월내역)(2)[2019.03.09]


 어느덧 2019년 4월이 지나 5월이 되어가고 있습니다. 4월 중순부터 작년 여름이 생각날 정도의 초여름이 이어지는 듯 하더니 비가 내린 후에는 밤이면 쌀쌀한 날씨가 이어지고 있습니다. 부디 이번 여름에는 작년처럼 밖에 나가기가 무섭지 않을 정도로 덥지 않기를 바라고 있습니다.

 이번 포스팅에서는 지난달에 다녀왔던 동해선 도보여행기 이야기를 이어서 올리도록 하겠습니다.



앞으로 이설될 동해선 철도의 모습입니다.

아직은 공사중이지만 개통된다면 열차 안에서 바다를 훤히 볼 수 있을 것으로 보입니다.



다리 밑으로 지나던 건널목은 개통된다면 자연스레 사라지겠지요.



길을 걷던 도중 저 멀리 왠 고양이 한마리가 보입니다.



불러봤더니 사람 곁으로 금새 다가오는 걸 보니 주인이 있는 고양이로 보입니다.



확실히 바닷가 근처의 길은 경치를 구경하기 참 좋습니다.



월내리 효마을



길을 지나던 도중 열차가 빠르게 통과합니다.



현재 철길과 새로 이설될 철길의 모습



원래 있던 철길 바로 옆으로 높게 철도를 깔고 있기 때문에

바다를 바라볼 수 있는 지점이 많이 늘어나고 있습니다.



철길 바로 옆으로 바다가 펼쳐집니다.

저 멀리 고리 원자력 발전소가 보입니다.



바다가 바로 눈 앞에 보이는 월내건널목

이 건널목도 곧 사라질 예정입니다.



월내리 구간은 인도가 비좁아 걸어다니기가 많이 불편힜습니다.

만약 이설된다면 기존 철길을 도보로 바꾸어도 좋을것같습니다.




길 바로 옆에 붙어있는 건널목이다 보니 도보로 건너기가 애매합니다.



그래도 바다가 눈앞에 보이는 건 볼만하네요.



드디어 월내역 인근까지 걸어오는데 성공하였습니다.



월내역은 이설을 준비하기 위해 임시역을 건설하여 운영되고 있습니다.



월내역은 인근에서 5분 거리에 이설될 예정이기 때문에 이 삼거리도 변화가 있을 것으로 보입니다.



임시역이지만 갗출 것은 모두 가지고 있습니다.



월내역 임시승강장 너머로는 새로운 복선전철이 건설중에 있습니다.



이 곳에서 바닷가 쪽으로 걸어가보니 저 멀리 발전소가 생각보다 가까이 있음을 알 수 있습니다.



지금은 무궁화호를 탈 수 있지만 이설 이후에는 전철 전용역이 될 것으로 보입니다.



승강장에서 바라본 월내역의 모습입니다.



열차에 오르기 전 바닷가 옆에 있었던 건널목으로 다시 와보았습니다.



잠시후 건널목에서 경고등이 켜지고



그 사이 열차가 빠르게 건널목을 통과합니다.



그렇게 열차는 희미하게 멀어져만 갑니다.



앞으로 이 곳에서 볼 수 없게 될 풍경이기에 더욱 아쉬워지는 듯 합니다.



다시 열차를 타기 위해 승강장으로 돌아왔습니다.



다음역인 서생역은 현재 열차가 정차하지 않습니다.

그러나 광역전철이 개통된 후에는 전철역으로 부활할 예정입니다.



부산 방면에서 동대구로 가는 열차를 열심히 기다리고 있습니다.



그 때 갑자기 반대편에서 왠 열차 한 대가 들어옵니다.



태화강발 동대행 열차가 왜 이곳으로 올라온 것일까요?

아무래도 부전역 쪽으로 회송중인 차량인 것으로 보입니다.



열차가 들어오더니 잠시후 들어오는 동대구행 열차와 교행을 위해 기다리는 중입니다.



월내역이 이설된다면 이 자리에는 어떤 것이 생길까요?


그렇게 사람들은 열차에 오르내립니다. 이제 저도 돌아가기 위해 동대구행 열차에 올라탑니다.


 


 차후 동해선은 영덕에서 삼척을 거쳐 정동진까지 개통이 준비중입니다. 앞으로도 이렇게 바닷가를 볼 수 있는 구간이 더 생겼으면 좋겠습니다!



300x250

LSD-SLAM에서 Semi-Dense의 의미

공대생의 팁 2019. 3. 19. 20:56


 최근 자동차의 자율주행에 대한 연구가 지속됨으로 인해 자율주행과 관련된 분야들에서 각종 기술들일 발전하고 있는 오늘날입니다. 자동 제어와 자동차 역학을 기본으로 주행중 다양한 위험물들을 감지해 낼 수 있는 센서들을 사용함으로서 자율주행 기술은 한 걸음씩 나아가고 있습니다.


 특히 기존 로봇공학에서 연구되어온 SLAM(Simultaneous Localization and Mapping)으로 지도를 만드는 기술을 사용하여 자율주행중인 자동차가 위험물을 감지해내 회피하는 알고리즘 또한 연구가 진행되고 있습니다. 특히 카메라의 경우 Rader나 Lidar 센서에 비해 가격이 압도적으로 저렴하고 상대적으로 많은 동영상 정보를 수집할 수 있으나 이를 처리하기에는 상당히 많은 변수가 존재하기 때문에 이와 관련된 연구 또한 다양하게 진행되고 있습니다. 이러한 카메라를 사용하여 Visual SLAM또한 자율주행의 연구 대상이기도 합니다.


 이번 포스팅에서는 카메라로 SLAM을 사용하는 알고리즘 중 하나인 LSD-SLAM(Large-Scale Direct SLAM)에서 Semi-Dense의 의미에 대해 파악해보고자 합니다.


1. LSD-SLAM이란?



 LSD-SLAM은 카메라로 들어오는 이미지에서 Feature point를 검출하는 과정을 거치지 않고 바로 사진 자체에서 Semi-Dense를 사용하여 카메라에 감지된 물체의 거리를 가늠하여 이를 SLAM에 적용하는 과정입니다.


사진 출저 : https://medium.com/@j.zijlmans/lsd-slam-vs-orb-slam2-a-literature-based-comparison-20732df431d


 쉽게 설명드리기 위하여 보조자료를 가져와 보았습니다. 위에서 보시는 바와 같이 Feature-Based 방식을 사용하면 카메라로 들어오는 이미지에서 Feature를 추출하는 과정이 추가로 존자하여 LSD-SLAM보다 느릴 수 있다는 단점을 가지고 있습니다.

 물론 ORB-SLAM는 Feature-Based 방식으로 ORB 방식으로 Feature point를 추출하는 과정이 존재하지만 빠른 속도록 Feature를 감지할 수 있어 최근 각광받는 기술이 존재하기도 합니다.


2. Semi-Dense의 의미


 그렇다면 LSD-SLAM의 핵심 기술인 Semi-dense는 어떤 의미일까요? 밀도를 의미하는 dense와 semi의 접두어가 붙었을 때의 의미가 이해되기 쉽지 않으시리라 생각됩니다. 아래 예제를 통해 말씀드리도록 하겠습니다.



만약 다음과 같은 이미지가 있다고 가정합니다. 위 사진을 통해 Dense를 추측하면 아래와 같이 나타낼 수 있습니다.



위 사진에서 파란색의 경우 화면에서 상대적으로 가깝다는 의미이고 빨간색의 경우 화면에서 상대적으로 멀다는 의미로 생각하시면 됩니다. 이를 통해 사진에서 보이는 물체들의 거리를 짐작할 수 있습니다. 이 결과물을  dense depth map이라 하겠습니다.


 하지만 SLAM에서 dense depth를 모두 사용하기에는 상당히 많은 시간이 걸리는 데다가 결정적으로 모든 dense depth가 사용되지 않기 때문에 이를 SLAM에 사용하기엔 매우 부적절하다고 할 수 있습니다.


 그렇다면 이를 좀 더 가볍게 사용할 수 있는 방법은 없을까요? 이 때 semi-depth 라는 개념을 적용해봅니다.



 위 그림은 dense depth map에서 필요하지 않은 부분을 Gaussian 확률 분포를 사용하여 처리하고 남은 부분들을 나타낸 것입니다. Feature-based 방식에서 Feature를 검출하였을 때와 유사한 부분들이 남아있는 것을 볼 수 있습니다.


 즉 모든 dense depth map을 사용하지 않고 일부분만을 사용하기 때문에 (full) dense depth map의 방식에서 일부분만 사용한다는 의미로 semi-dense depth map으로 이름을 붙인 것이지요.


 이러한 특성을 가지고 있는 LSD-SLAM을 사용한다면 좀 더 빠른 방법으로 SLAM을 사용할 수 있을 것으로 기대할 수 있겠습니다.


 - Reference -

https://github.com/tum-vision/lsd_slam

https://ieeexplore.ieee.org/document/6751290

300x250

바닷가가 보이는 동해선 도보여행기(좌천역~월내역)(1)[2019.03.09]


 며칠동안 연속으로 미세먼지 문제로 인해 뿌연 하늘 아래 감기와 몸살 등으로 아픈 나날을 보내고 있었습니다. 마침 주말 날씨가 너무나 좋아서 간단하게 여행을 다녀보고자 갑작스레 여행을 다녀오게 되었습니다.


 우리나라에서 열차를 타고 바닷가를 볼 수 있는 구간들이 몇몇 존재합니다. 아마 많은 분들이 강릉에 있는 정동진의 이미지를 많이 떠오르시리라 생각합니다.

 부산 구간에서도 한 때 해운대~송정 이설 전 구간이 열차를 타고 바닷가의 풍경을 만끽할 수 있었던 곳이었습니다. 지금은 이설되면서 철로를 걷어내지 않고 도보 여행지로 남겨두고 있지요.


 이번에는 앞으로 선로가 이설되면서 바닷가를 볼 수 있게 되는 월내역 인근의 바닷가를 보기로 하였습니다. 동해선 좌천역~월내역 구간을 걸어다니며 이곳 저곳 남긴 사진들을 감상해보도록 합시다!



 이번에 여행하면서 걸어다닌 구간을 확인해보니 무려 1시간 넘게 걸어다녔군요. 도보 후기는 다음 포스팅에서 작성하도록 하겠습니다.





여행의 시작은 언제나 동대구에서 시작됩니다. 부전행 열차에 탑승합니다.



태화강역에서 발견한 태화강발 동대구행 열차.

태화강에서 출발하는 열차기 있는 것으로 보아 울산에서 대구로 가는 수요가 어느 정도 있는 모양입니다.



어느덧 좌천역에 도착하였습니다.

보아하니 승강장이 이설된 것 같아 보입니다.



기존의 승강장은 저 너머에 있는 좌천역 인근에 있는 모양입니다.

선로를 이설하기 위해 임시로 승강장을 옮겨 영업을 하고 있습니다.



좌천역의 바로 다음역인 일광역은 일찍이 부산시내까지 광역전철이 개통되었습니다.

곧 있으면 이 곳 좌천역에서도 광역전철을 타고 부산 시내로 갈 수 있게 됩니다.



동대구에서 출발하였던 열차는 좌천역을 떠나 부전역으로 향합니다.



떠나가는 열차를 보며 지난주에 보았던 경원선 통근열차가 떠오르는 이유는 무엇일까요?



좌천역도 조만간 광역전철을 탈 수 있는 역이 지어집니다.



새 역이 완공된다면 이 곳도 곧 없어지겠지요.



이제 역 바깥으로 나가봅니다. 이전에 경춘선 청평역처럼 역까지 나가는데 거리가 있군요.



승강장을 벗어나는 중에 바라본 좌천역 역명판



역 주변에는 온갖 건축자재들이 굴러다닙니다.

전차선을 띄울 기둥도 이렇게 가지런히 누워있군요.



이전에 사용했던 승강장의 흔적입니다. 이 곳도 이렇게 흔적만 남기고 사라지겠지요.



어느덧 역 출입구까지 걸어 나왔습니다.



왠지 간이역에 딱 어울리는 빗자루 두 자루가 보입니다.

이런 빗자루로 전철역을 쓸고 다니는건 조금 위화감이 느껴질 듯 보입니다.



좌천역의 모습은 흔하지만 조금씩 사라져가는 간이역의 모습입니다.



좌천역에서는 생각보다 많은 열차가 정차합니다.

앞으로 광역전철이 개통된다면 한 시간에 2대 이상은 들어오겠지요.



역 바깥의 첫 인상은 온통 주차장 모습입니다.



역 광장에서 새 좌천역이 한창 건설중인 모습을 바라봅니다.



앞으로 좌천역이 이설되면 이 구 역사는 철거될 예정이라고 합니다.



멀지않은 미래에 이 곳은 왠지 주차장이 될 것 같아보입니다.



이제 본격적으로 월내역으로 걸어가보도록 하겠습니다.



기존의 역사와 새로 지어지는 역사를 비교하면 격세지감이라는 말이 절로 나올듯 합니다.

한 편으로는 좀 더 편한 교통환경이 마련되지만 또 다른 한편으로는 또 다른 모습은 사라진다는 것이지요.



새로 지어지는 고가와 기존 구간의 고가의 모습



길을 걷다 건널목 하나를 지나갑니다.



월내역 방향으로 바라본 모습입니다. 왼편으로 새로 이설될 철길이 보입니다.



좌천역을 향해 바라본 모습입니다. 새로 지어지는 역이 한 눈에 들어옵니다.



임시건널목에서는 '월래역'으로 적혀있네요.



철도 건널목을 지나서 부터는 산과 찻길만이 펼쳐집니다.



기존 철길과 새로 지어지고 있는 철길이 동시에 보이는군요.



이 곳에서 낚시를 하시는 분들이 보이네요.

바닷가와 가까운 위치인데 과연 어떤 물고기가 잡힐까요?



30분 정도 걸어가보면 작은 마을에 도착합니다.



작을 마을 사이로 철길 또한 지나갑니다.



마을에 도착하고 나서 부터는 도보가 사라지고 좁은 갓길만 걸어다닐 수 있어 불편해집니다.



길 바로 옆에는 보호수가 떡하니 서있습니다.

이 나무 때문에 길을 확장하지 못하는 듯 보입니다.



좁아터진 길을 피해 다른 길로 가볼까 했더니 마침 저 멀리 바닷가가 보입니다.



2019년이 되어서 처음 보는 바닷가로군요!



좌천역과 월내역 사이에 임랑해수욕장이 위치해 있습니다!



해수욕장을 바라보는 방향으로 놓인 밴치의 모습.

잠시 앉아서 쉬어가고 싶게 생겼습니다.



저 멀리에 원자력발전소가 보입니다.



임랑해수욕장에서 다시 월내역 방향으로 걷다보면 묘관음사라는 절 하나가 있습니다.



절의 입구에서 바라본 바닷가의 모습입니다.

매번 부산을 올 때 마다 항상 처음 오는 해수욕장들 중에 기찻길 바로 옆에서 바닷가를 보기는 미포 이후로 처음인 것 같습니다.



선로가 이설되는 구간에는 센스있게도 미관음사의 입구를 이렇게 잘 꾸며놓았습니다.



절 앞에 이렇게 철길이 지나가는 모습이 한 편으로는 신기한 모습이네요.



임랑해수욕장에는 임랑건널목이 있습니다.



월내역 쪽을 바라본 모습입니다. 이설구간의 모습도 보입니다.



부산역을 향해 바라본 모습입니다. 산 사이를 훓고 지나가는 듯한 모습이네요.



앞으로 사라질 건널목에서 바라본 이설구간의 모습입니다. 이제 이 모습도 곧 사라지겠지요.



 다음 포스팅에서 월내역에 도착하기 까지의 내용을 이어서 올리도록 하겠습니다!

300x250

시골길을 달리는 꼬마열차 이야기 - 경원선 통근열차(대광리~백마고지)[2019.03.01]


 지난 2017년 5월, 경의선과 동해북부선에서 남과 북의 철길이 연결되는 감동의 순간을 기억합니다. 비록 실질적으로는 경의선만 서울까지 연결되어 있지만 단절되었던 철길이 연결되었다는 것 만으로도 상당히 큰 의미를 갖고 있는 것이지요.


 비록 경원선은 현재 철원 백마고지 까지만 연결되어 있지만 머지않아 경원선 또한 북과 연결될 날이 곧 올 것이라 믿고 있습니다. 그렇게 된다면 금강산 까지 기차를 타고 갈 수 있었던 시절로 돌아갈 수 있는 것이지요.

 

 그러나 안타깝게도 경원선 통근열차는 경원선이 복구되는 그 순간에는 이미 폐차가 되어 사라져 버리게 될 것이라는 것이 참으로 슬픈 일입니다. 마치 북녘에 남겨둔 이산가족들이 다시 만나자는 꿈을 이루지 못한 것만 같은 상황처럼 말이지요.


 이번 포스팅에서는 나머지 구간인 대광리역에서부터 현재 경원선 최북단역인 백마고지역 까지 통근열차가 운행하였던 모습을 남겨보기로 합니다.



대광리역 맞이방의 모습입니다. 바로 전 역인 신망리역보다는 확실히 규모가 큰 역입니다.



비록 큰 역이지만 역무원이 없어 승차권을 열차 안에서 직접 구매해야 하는 곳이기도 합니다.

인건비 또한 운영에 있어서 무시할 수 없는 요소다보니 역은 더욱 사람이 없어 보입니다.



대광리역 바깥의 모습입니다. 나름 상권이 갖추어져 있습니다.



한적한 대광리역의 모습입니다.

어르신들께서 벤치에 앉아 쉬고 계시군요.



대광리역 입구 모습입니다. 인사하는 그림이 인상적입니다!



역 입구에서 멀리 바라본 모습입니다. 그래도 나름 큰 편입니다.



대광리역이 가장 인상적인 것은 다름아닌 역 바로 앞에 최신 브랜드의 카페가 마련되어 있던것이었습니다.

휴가나온 군인들이 쓰기에 더 없이 중요한 곳처럼 보입니다!



제 예상대로 많은 군인들이 음료수를 마시기 위해 대기하고 있더라고요.



역에서 좀 더 걸어나가면 거대한 편의점도 있습니다.

아무래도 흔한 시골의 편의점이 그렇듯이 마을 주민들의 슈퍼마켓 역할을 하고 있는 듯 보입니다.



어느덧 열차 시간이 되어 불이나케 역으로 뛰어와 통근열차에 몸을 싣습니다.



출발 전에 전방을 확인하는 차장님의 모습입니다.

통근열차도 수도권 전철처럼 2인 승무인 듯 보입니다.



10년 전에도 이 곳 신탄리역을 방문했던 것이 기억나는데

어느덧 다시 한 번 방문하게 되었군요.



왼편에는 DMZ 트레인이 신탄리역에서 운행대기를 하고 있었습니다.

그나저나 DMZ 트레인도 다음달부터는 운행이 중단되는걸까요?



신탄리역 내리는 곳으로 나가기 직전 바로 왼편에는 작은 쉼터가 마련되어 있습니다.

시 문구가 걸려있군요.



한 때 경원선 최북단이기도 했던 역이다보니 북한의 풍경을 담은 사진들이 몇 장 걸려 있었습니다.

마침 TV에서는 실향민 할아버지의 이야기를 다룬 국제시장이 방송되고 있었더군요.



한때 최북단의 역이기도 해서 인지 역무원이 근무하는 곳이었습니다.

옛모습을 간직한 간이역은 볼 때 마다 정겨운 기분이 감돕니다.



본래 이 자리에는 철도중단점 조형물이 설치되어 있었는데

경원선이 백마고지역까지 연장되면서 철거된 듯 합니다.



최신 코레일의 CI가 적용된 모습입니다.

백마고지역이 개통되기 전 까지는 옛날 역명판이었었지요.



백마고지역에서는 대피선이 없기 때문에 DMZ 트레인은 신탄리역으로 내려와 대기합니다.

대기중에도 시동은 끄지 않아서인지 주변에서 굉음이 들려옵니다.



과연 경원선도 경의선처럼 북으로 연결될 날은 올까요?



DMZ 트레인의 가장 큰 장점은 서울역에서 백마고지역까지 직통으로 올 수 있다는 점입니다.

그러나 통근열차를 개조한 열차인데다 새마을호 특실 요금을 받기 때문에 가격은 썩 저렴하지는 않습니다.



경원선에서 청량리역을 빼고는 아마도 유일하게 고객대개실이 설치된 곳이 이 곳 신탄리역이 아닐까 생각됩니다.

최근에는 작은 간이역에도 이렇게 고객대기실을 만드는 코레일의 배려가 돋보입니다.



이제 백마고지역으로 이동해보도록 합시다.



터널을 뚫고 나오면 넓디넓은 철원평야갸 펼처지다가 백마고지역에 도착합니다.



21세기에 처음으로 등장한 간이역의 스타일은 매우 적절한 모습입니다.

요즘처럼 몇 명 없는 시골역에 거대한 역을 지어서 예산낭비를 하느니

필요한 시설만 갖춘 백마고지역이 수요를 받아내는데 적당하다는 생각이 듭니다.



자세히 보니 백마고지역에서 출발하는 열차는 신탄리행으로 적혀 있습니다.

왜 굳이 동두천행으로 적어두지 않았는지 조금은 의야합니다.



간이역 주제에 큰 규모의 주차장이 마련되어 있습니다.

6.25 전쟁 이후 철원에 개통된 최초의 역이라는 상징성 때문인지 관광객도 많이 이 곳을 찾아오는듯 합니다.



백마고지역 주변에는 마을 조차도 멀리 떨어져 있어 역세권은 전혀 갖추어져 있지 않은 곳입니다.

오직 관광객만을 위해 존재하는 역이라는 것이지요.



백마고지역 출입구의 모습입니다.

사실상 매표 업무를 하지 않기 때문에 악천일 때에만 이용되는 대기실이라 할 수 있겠습니다.



역의 끝자락에는 철도중단점 조형물이 설치되어 있습니다.

한 컨에는 북녘으로 보낼 수 있는 우체통이 마련되어 있습니다.



조금 아쉬운 점이 있다면 철원 시내까지는 철도글 개통했으면 어떨까 하는 생각이 듭니다.

차후 철원역 재건 이후 시내 방향으로 철길을 이을 계획이 있는 것으로 보입니다.



동두천역과 백마고지역을 오가는 통근열차의 마지막 모습. 과연 어떤 모습일까요



운행을 위해 승무원께서 열차 안을 청소 하고 계십니다.



CDC 통근열차의 제작사가 대우중공업이었다니...

현재는 철도 제작은 현대로템이 맡고 나머지는 두산인프라코어가 되었다고 하지요.

순간 이 열차가 얼마나 오랫동안 사용되었는지 감이 오지 않습니다.

정말 오래 된 열차였다는 사실이 놀랍기도 합니다.



그래도 열차는 전체적으로 장항선에서 말년을 보낸 새마을호보다는 상태가 좋았습니다.

이 대로 몇 년은 더 다닐 줄 알았는데 사라진다는게 참으로 아쉽기만 합니다.



여행을 마치고 동두천역으로 돌아왔습니다.



그렇게 동두천역에서 통근열차의 마지막 순간을 지켜보며

백마고지가 새겨진 승차권을 주머니에 담고 다시 현실로 돌아갑니다.


비록 옛모습이 하나둘씩 역사속으로 사라지지만

이러한 오늘을 사는 우리들에게는 이를 추억속으로 남겨둘 수 있다는 것이 유일합니다.

이제 이 구간을 돌아다니던 열차는 교과서에만 남게 되겠지만

이후 북녘으로 힘차게 달릴 열차를 상상해 본다면 이 또한 얼마나 두근거리는 설레임일까요?

시골길을 달리는 꼬마열차가 원산까지 달릴 수 있는 그 날을 기약하며 글을 마쳐봅니다.


2019년 3월 1일 다녀옴

2019년 3월 11일 작성


300x250

시골길을 달리는 꼬마열차 이야기 - 경원선 통근열차(신망리역)[2019.03.01]


 어느덧 경원선 통근열차의 운행종료일이 20일 앞으로 다가왔습니다. 어느덧 경원선에서 시한부 인생을 살고 있는 통근열차를 보면서 안타까운 마음만이 가득한 나날을 보내고 있습니다. 그렇게 소중한 하루하루가 지난다는 생각을 하면 오늘 하루도 더 열심히 살아보고자 하는 생각이 들기도 하네요!



동두천역에서 신탄리까지 운행하는 39-2번 버스를 타고 경원선을 구경해보기로 했습니다.



소요산역에서 버스가 전동차가 도착하기를 기다린 후 내린 손님들을 기다리고 있습니다.

그렇게 사람들이 소요산역에서 하나둘 나오고 버스는 손님들을 태우고 신탄리를 향해 갑니다.


그렇게 저는 신망리역 인근 버스정류장에서 하차합니다.





신망리역 인근 마을은 철길과 거의 붙어 있는 모습입니다.



선로 바로 옆에 붙어있는 마을들을 보니 군산에 있던 철길마을의 모습이 떠오릅니다.

그곳은 아예 한 마을을 관통하던 모습이었지요.



저 멀리 신망리역의 모습이 보입니다.



아직 열차가 지나가지 않는 시간에는 상당히 조용한 동네입니다.



철도 건널목 바로 옆에는 조그마한 신망리역이 자리잡고 있습니다.



연천 관광객들을 위한 지도와 태풍전망대의 모습을 담은 돌이 서 있습니다.



신망리역의 고객대기실(?)의 모습입니다.

주변 동네 주민들의 작은 모임터 역할을 하는 듯 합니다.



백마고지행 방향을 바라본 모습

철길이 쭉쭉 뻗어있는 모양입니다.



현재 연장중인 전동열차는 연천역까지만 공사가 진행중입니다.

연천역까지 전철이 개통된다면 이 곳 주민들은 이 역을 자주 사용하지는 않을 듯 보입니다.



역 크기가 아담하다 보니 화장실 크기 또한 아담한 모습입니다.



역 앞에는 바로 한 민가가 위치해 있습니다.

흰식 강아지가 낮선 저를 보고 경계하는 모습입니다.



놀랍게도 신망리역의 입구 모습입니다.

역세권 치고는 너무나 초라한 모습입니다.



역 바로 앞에는 어떠한 가게도 없이 민가가 자리잡고 있습니다.

이 쯤 되면 3초 역세권이랄까요?



신망리역의 입구입니다.

확실히 운영중인 역 치고는 너무나 초라해 보입니다.



한국철도공사의 안내판은 아무것도 붙어 있지 않습니다.

역장이 상주하지 않아서 그런 듯 보입니다.



역 내부는 상당히 잘 꾸며져 있었습니다. 마을 주민들이 꾸며놓은 듯 보입니다.



탁자 위에 올려진 신문은 최근 날짜 인걸 보니 방문자는 종종 있는 듯 보입니다.



역무실은 주민들의 미술관으로 단장되어 있는 듯 보입니다.



역무원실 반대편에는 실제 주민들이 미술을 배우는 장소인 듯 보입니다.



확실히 신망리역은 역무 기능보다는 주민들을 위한 예술 공간으로 탈피한 모습입니다.



신망리의 역사를 기록한 모습입니다.

연천에서 가장 먼저 다방이 들어온 곳이라고 하네요!



열차 타는곳을 바라본 모습입니다.

저 곳으로 열차가 들어옵니다.



아까도 보았듯이 역무실은 주민들의 공간으로 평소에는 잠겨있습니다.



침목 위헤 주민들의 작품이 붙어 있습니다.

확실히 주민들의 관리를 받는 덕인지 역의 분위기는 상당히 친근감이 듭니다.



신망리역의 열차시간표입니다.

최근 시내버스보다 저렴한 요금 덕에 통근열차는 적자를 면치 못하는 신세가 되었다지요.



신망리역의 역명판 앞에 벤치가 이를 지탱하고 있는것처럼 보이네요.



뭔가 투박하지만 이런 모습이야 말로 간이역을 방문하는 재미가 아닐까요?



열차 시간이 다가오자 마을 주민들이 신망리역으로 하나 둘 모이기 시작합니다.



어느덧 건널목이 경고음을 내더니 차단기가 내려옵니다.



건널목의 경고음과 함께 저 멀리서 통근열차가 달려옵니다.



마을 사이를 달리는 열차의 모습.

이제 이 모습도 추억의 한켠에 남게 되는군요.



열차는 덜컹거리는 소리와 함께 주민들이 기다리는 역으로 들어옵니다.



신망리역에 그렇게 열차가 도착하고

주민들은 하나 둘 객실에 들어갑니다.



연천 시내로 달리는 통근열차의 모습입니다.

자리별로 손님을 채울 정도니 나름 열차로서의 일은 잘 하고 있어 보입니다.



연천역을 지나 전곡역으로 가는 길목에서 새로운 철길이 깔리는 모습을 목격할 수 있었습니다.

그런데 최근 뉴스에서 어느 땅 주인의 허가 없이 철길이 깔려 소송이 진행중이라는 이야기를 들었는데

그 때문인지 현재 경원선 공사는 지연되고 있다고 하네요.

부디 좋게 해결되고 이 곳에서도 열차들이 달리는 모습을 하루 빨리 볼 수 있었으면 합니다!




300x250

C++ 클래스 객체를 stream으로 통신 및 전달방법 - Boost Serialization(2) [Class를 TCP 소켓 통신으로 전송]

공대생의 팁 2019. 3. 8. 00:09
 이전에 Java를 사용하여 Object(객체)를 소켓 통신으로 전송하는 방법에 다루었던 적이 있었습니다. 확실히 Java는 이러한 기능이 구현되어 있어 프로그래밍을 하는 데 있어 상당히 훌륭한 기능을 수행합니다.

안드로이드 - Java 서버간 Object 객체 소켓 프로그래밍
https://elecs.tistory.com/147


 그러나 C++의 경우 아직까지 Java처럼 객체를 전송함에 있어 불편한 점이 있습니다. C를 사용할 경우 전송하기 위해 사용되는 Struct의 크기를 직접 확인하여야 하며 대용량 파일의 경우 한정된 버퍼의 크기에 맞추어 분리하여 전송하여야 하기 때문에 고려해야할 점이 상당히 많습니다.

 C++ 라이브러리 중 하나인 Boost에서는 향상된 소켓 프로그래밍인 ASIO와 Class를 직렬화 할 수 있는 Serialization을 제공합니다. 이름에서 볼 수 있듯이 Serialization를 사용하여 C++의 클래스를 직렬화 하여 Byte 형태로 변환할 수 있기 때문에 이를 다른 컴퓨터에 전송한 후 이를 역직렬화(De-serialization)하여 전송 받은 컴퓨터에서도 똑같은 Class 변수를 생성할 수 있게 되는 것입니다. 자세한 이야기는 아래의 링크를 참조해주시기 바랍니다.

C++ 클래스 객체를 stream으로 통신 및 전달방법 - Boost Serialization(1) [직렬화된 클래스 만들기]
https://elecs.tistory.com/289



 또한 이번 포스팅에서는 TCP 비동기 통신을 사용하여 class 객체값을 전달받는 과정이 구현되어 있습니다. 이와 관련된 정보에 대해 자세히 알고자 하시는 분들께 아래 링크를 참조해주시길 바랍니다.

C++에서 Boost ASIO를 사용하여 TCP 비동기(Unblocked) 통신 프로그래밍
https://elecs.tistory.com/314


 이번 프로그램의 경우 소스코드의 양이 크기 때문에 일부분을 설명하는 방식으로 진행하겠습니다. 먼저 아래에 자신의 환경에 맞는 소스코드를 다운로드 받습니다.

Ubuntu 18.04 버전 이전(Boost 1.65 버전 이전)

asio_serialization_1804.zip


Ubuntu 18.10 버전 이후(Boost 1.66 버전 이후)

asio_serialization_2004.zip


 위 소스코드의 알고리즘은 다음과 같이 구성되어 있습니다.



 서버측에서 stock라는 struct 타입의 object를 가지고 있으며 이를 Serialization하여 Binary 파일로 변환한 후 Server는 Client의 접속을 accept할 준비를 합니다. 서버에서 이와 같은 과정이 완료되면 client에서 connect를 요청합니다.

 client로부터의 connect 요청을 받은 server는 write를 하여 client에게 직렬화 된 object를 수신받습니다. 이후 handler에 등록된 handle_read 함수가 실행되어 수신된 Binary 파일을 역직렬화 한 후 이를 server에서 사용하던 대로의 파일 형식으로 되돌려놓는 방식입니다.



위 소스코드를 다운로드 받으신 후 해당 폴더에서 다음과 같은 명령어를 입력합니다.


$ mkdir build

$ cd build

$ cmake ..

$ make


 위와 같이 실행하셨을 경우 server와 client라는 이름의 실행 파일이 생성됩니다. 해당 파일들은 각각 다음과 같은 명령어로 실행하실 수 있습니다.

$ ./server 포트번호
$ ./client 서버IP 포트번호

 이와 같이 실행하면 client 화면에서 다음과 같은 결과를 확인하실 수 있습니다.






300x250

C++에서 Boost ASIO를 사용하여 TCP 비동기(Unblocked) 통신 프로그래밍

공대생의 팁 2019. 3. 7. 23:04
 C++에서 소켓 통신을 할 때 동기식(Blocked, sync)과 비동기식(Unblocked, async)방식으로 TCP 통신을 구현합니다. 그러나 Java에 비교하였을 때 C에서 기본으로 제공하는 socket 프로그래밍을 사용하는 것은 여간 불편한 일이 아닙니다.

 이러한 환경에서 Boost 라이브러리에서 제공하는 ASIO 소켓 통신 프로그램을 사용하게 되면 이전보다 코딩 환경이 매우 쾌적함을 경험할 수 있습니다.

 이번 포스팅에서는 Boost 라이브러리에서 제공하는 ASIO를 사용하여 Unblock(Asynchronization)방식의 소켓 통신 프로그램을 구현해 보았습니다.


 위 그림은 Boost library에서 ASIO의 비동기(Asynchronization)방식의 소켓 통신 프로그래밍의 알고리즘을 나타낸 것입니다.

 프로그램을 실행하게 되었을 때 Socket에 IP주소와 Port 번호를 등록하고 이를 io_service(1.66 버전 이후에서는 io_context)에 이 때 handle_connect, handle_read, handle_write와 같은 handler 또한 함께 등록합니다. 이 때 등록된 handler는 server 혹은 client에서 실행되었을 때 바로 handler를 실행하는 방법으로 어느 한 쪽으로부터 데이터 전달을 기다리지 않고 있다가 요청이 들어왔을 때 실행하는 것이지요.

 시작하기에 앞서 Ubuntu 환경에서 다음과 같이 Boost 라이브러리를 설치합니다.

$ sudo apt install libboost-all-dev

자세한 내용은 소스코드의 주석을 통해 설명을 달아보았습니다.

server.cpp
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
 
using boost::asio::ip::tcp;
using namespace std;
 
class session
{
public:
  session(boost::asio::io_service& io_service)
  //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
  //session(boost::asio::io_context& io_service)
    : socket_(io_service)
  {
  }
 
  tcp::socket& socket()
  {
    return socket_;
  }
 
  void start()
  {
    //client로부터 연결됨
    cout << "connected" << endl;
    //client로부터 비동기 read 실행
    socket_.async_read_some(boost::asio::buffer(data_, max_length),
        boost::bind(&session::handle_read, this,
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
  }
 
private:
  void handle_read(const boost::system::error_code& error,
      size_t bytes_transferred)
  {
    if (!error)
    {
      cout << data_ << endl;
    }
    else
    {
      delete this;
    }
  }
 
  tcp::socket socket_;
  enum { max_length = 1024 };
  char data_[max_length];
};
 
class server
{
public:
  server(boost::asio::io_service& io_service, short port)
  //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
  //server(boost::asio::io_context& io_service, short port)
    : io_service_(io_service),
      //PORT 번호 등록
      acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
  {
    start_accept();
  }
 
private:
  void start_accept()
  {
    session* new_session = new session(io_service_);
    //client로부터 접속될 때 까지 대기한다.
    acceptor_.async_accept(new_session->socket(),
        boost::bind(&server::handle_accept, this, new_session,
          boost::asio::placeholders::error));
  }
 
  //client로부터 접속이 되었을 때 해당 handler 함수를 실행한다.
  void handle_accept(session* new_session,
      const boost::system::error_code& error)
  {
    if (!error)
    {
      new_session->start();
    }
    else
    {
      delete new_session;
    }
    //client로부터 접속이 끊겼을 대 다시 대기한다.
    start_accept();
  }
 
  boost::asio::io_service& io_service_;
  //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
  //boost::asio::io_context &io_service_;
  tcp::acceptor acceptor_;
};
 
int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: async_tcp_echo_server <port>\n";
      return 1;
    }
 
    boost::asio::io_service io_service;
    //boost 1.66이후 (Ubuntu 18.10 이후) 버전의 경우 io_context를 사용
    //boost::asio::io_context io_service;
 
    server s(io_service, atoi(argv[1]));
    //asio 통신을 시작한다.
    io_service.run();
  }
  catch (exception& e)
  {
    cerr << "Exception: " << e.what() << "\n";
  }
 
  return 0;
}
cs

client.cpp

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<boost/asio.hpp>
#include<boost/bind.hpp>
 
using boost::asio::ip::tcp;
using namespace std;
 
enum { max_length = 1024 };
 
class client
{
public:
  client(boost::asio::io_service& io_context,
  //client(boost::asio::io_context& io_context,
      const string& host, const string& port) : socket_(io_context)
  {
    boost::asio::ip::tcp::resolver resolver(io_context);
    boost::asio::ip::tcp::resolver::query query(host, port);
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
 
    //비동기(Unblock) 상태로 서버와 접속한다.
    boost::asio::async_connect(socket_, endpoint_iterator,
        boost::bind(&client::handle_connect, this, boost::asio::placeholders::error));
  }
 
  void handle_connect(const boost::system::error_code& e){
    if(!e){
      cout << "Connected!" << endl;
      string msg = "Hello! Server!";
      //Server로부터 비동기 write를 시도한다.
      boost::asio::async_write(socket_, boost::asio::buffer(msg, msg.length()),
          boost::bind(&client::handle_write,this,boost::asio::placeholders::error)); 
    }
  }
 
  void handle_write(const boost::system::error_code& e){
    if(!e){
      cout << "Done!" << endl;
    }
  }
 
private:
  tcp::socket socket_;
  char data_[max_length];
};
 
int main(int argc, char* argv[])
{
  try
  {
    // Check command line arguments.
    if (argc != 3)
    {
      std::cerr << "Usage: client <host> <port>" << std::endl;
      return 1;
    }
 
    boost::asio::io_service io_context;
    //boost::asio:io_context io_context;
    client c(io_context, argv[1], argv[2]);
    io_context.run();
  }
  catch (std::exception& e)
  {
    cerr << e.what() << endl;
  }
 
  return 0;
}
cs

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cmake_minimum_required(VERSION 3.0)
 
project(asio_async)
find_package(Boost REQUIRED system)
find_package(Threads)
 
include_directories(${Boost_INCLUDE_DIR})
 
add_executable(client
    client.cpp
)
 
add_executable(server
    server.cpp
)
 
target_link_libraries(client
    ${Boost_LIBRARIES}
    ${CMAKE_THREAD_LIBS_INIT}
)
 
target_link_libraries(server
    ${Boost_LIBRARIES}
)
cs


Linux 환경에서 위의 3개의 소스코드를 한 폴더에 넣으신 후 다음과 같이 실행합니다.


$ mkdir build

$ cd build

$ cmake ..

$ make


 위와 같은 과정을 거치면 client와 server라는 실행파일이 build 폴더 안에 생성됩니다. 이 두 프로그램을 실행하면 다음과 같은 결과가 나옵니다.


1
2
3
4
$ ./server 2580
 
Connected!
Hello! Server!
cs



1
2
3
4
./client 127.0.0.1 2580
 
Connected!
Done!
cs


관련 자료

C++에서 Boost ASIO를 사용하여 TCP 동기화(Blocked) 통신 프로그래밍

https://elecs.tistory.com/332

300x250

시골길을 달리는 꼬마열차 이야기 - 경원선 통근열차(전곡역)[2019.03.01]


 언제나 사라지는 것을 사진으로 남길 때마다 사라져가는 추억은 아쉬움이 남습니다. 그러한 추억들을 남기기 위해서 이렇게 사진이라도 한 장 더 남기고 싶은 마음이랄까요?


 이번에는 전곡역 주변을 돌아다니며 여러 모습들을 사진으로 남겨보았습니다.




점심시간 무렵 전곡역에 도착하였습니다.



나름 전곡읍내에 위치한 곳이다 보니 역무원이 상주하고 계시군요.



전곡역 대기실에서 타는곳을 바라본 모습입니다.



전곡역의 모습입니다. 바로 옆의 시계탑이 보입니다.



읍내를 좀 더 들어가서 바라본 모습입니다.



동네 안을 걸어다니다가 역 근처 건널목까지 걸어오게 되었습니다.



희안하게도 건널목 옆에는 육교가 우뚝 서있습니다.

현재 이 육교는 입구가 봉쇄되어 있습니다.



열차가 지나갈 시간이 임박해서인지 관리인이 밖으로 나와계십니다.



또 한분은 건너편으로 넘어가 준비하고 계십니다.



건널목에서 바라본 전곡역의 모습



관리하는 분들께서 계신 대기실에 장치가 설치되어 있습니다.

이 것을 조작하여서 차단봉을 잠시 올려 통행할 수 있게 해주십니다.



연천역 쪽에서 오는 열차를 기다리고 있었는데 생각치도 못하게 서울쪽에서 DMZ 트레인이 지나갑니다.

DMZ 트레인을 서울역에서 백마고지까지 입석으로 타고 갔다온 적이 있었는데 생각보다 탈 만합니다.



물론 DMZ 트레인 또한 베이스는 통근열차이기 때문에

특유의 디젤 모터의 진동을 이 열차에서도 느낄 수 있습니다.



그렇게 DMZ Train이 전곡역을 통과하고 뒤이어 대기중이던 통근열차가 전곡역을 떠납니다.



방금전에 DMZ 트레인이 지나갔던 건널목을 통근열차 또한 빠르게 지나갑니다.



이제 다음달 부터는 이 광경은 더이상 볼 수 없다는게 참 아쉽기만 합니다.



이제 꽤 오랫동안 돌아다녔으니 전곡역 인근에서 점심을 먹기로 하였습니다.




해장국집에서 주는 고기 양이 상당히 푸짐하여 좋았습니다.



다시 전곡역으로 돌아옵니다.



집표함에 철도청 시절의 로고가 보이는군요.



열차가 출발하기 약 10분 전부터 역무원께서 표를 팔기 시작합니다.

지금 봐도 확실히 통근열차의 운임은 상당히 저렴합니다. 그동안 물가가 오르는 동안에도 그대로였으니 말이죠.



동두천에서 출발한 열차가 전곡역으로 들어옵니다.



과연 이 곳에 수도권 광역철도 1호선이 들어온다면 어떻게 변화할까요?



열차가 멈추자 많은 사람들이 열차를 오르내립니다.

확실히 사람들이 많이 거주하는 곳이다보니 타는 사람은 확실이 많습니다.




300x250

시골길을 달리는 꼬마열차 이야기 - 경원선 통근열차(초성리~한탄강)[2019.03.01]


 평소같이 지내던 어느날 코레일 홈페이지 공지사항을 보게 되었습니다. 다름 아닌 경원선 통근열차가 올해부터 운행이 중단될 예정이라는 소식이었습니다.



 그렇게 또 하나의 기억이 현실에서 사라져가게 된다는 안타까운 소식을 듣고 경원선 끝자락까지 다녀와 보았습니다.



통근열차를 타고 초성리역에 도착하였습니다. 역에서 내린 손님은 저 한 사람 뿐이더군요.



열차는 저만 이 곳에 내려다놓고 역을 떠납니다.



소요산역을 떠나자마자 가장 먼저 우리를 맞이하는 초성리역입니다.



아직까지 경기도에서 이러한 모습의 운영중인 간이역을 본다는 것은 종종 신기한 일입니다.



물론 바로 다음역인 소요산역까지 통근열차보다는 버스를 이용해 한승하는 사람들이 많기 때문에

승차권을 발권해주는 역무원은 근무하지 않고 있습니다.



경원선 통근열차가 다니는 구간의 역들에는 다음과 같이 역을 소개하는 안내문이 붙어있습니다.



역 입구에서 바라본 모습.



역앞의 모습만 봐도 사람들이 거의 이용하지 않을것 같이 작아보입니다.



역 인근 건널목에서 바라본 초성리역의 모습



역 바로 앞 슈퍼에 고양이 한 마리가 문 앞에서 낮잠을 곤히 자고 있습니다.



이 정도 규모의 역은 부산에 있는 사상임시역과 조금 비슷한 크기인 것 같습니다.



열차타는곳 출입문과 열차시간표



지역에 있는 시골역이서도 구경하기 힘든 집표함이 보입니다.



초성리역의 플랫폼 모습입니다. 저 멀리 시멘트 사일로가 보입니다.



가로등에 붙어있는 초성리역 역명판



동두천~연천 구간 공사를 위한 사무실이 있군요.



어느덧 역에서는 열차가 들어온다는 안내가 들려오고



소요산에서부터 출발하는 열차가 다가옵니다.



백마고지행 통근열차가 역으로 들어옵니다.



다음역인 한탄강역을 떠나가는 통근열차



열차는 유유히 한탄강철교를 건너 초성리역으로 건너갑니다.



바로 옆 다리의 태극기의 무리가 상당히 인상적입니다.

특히 3.1절에는 더욱 와닿는 모습입니다.



임시역인 한탄강에도 집표함이 설치되어 있었군요.



집표함 안을 살펴보았는데 생각보다 많은 승차권이 들어있었습니다.



비록 역건물은 없지만 갖출 시설은 모두 가지고 있는 역의 모습입니다.



한탄강역 역명판의 모습입니다.

간체자와 일본어 표기로 보아 역명판을 최근에 다시 만든 것으로 보입니다.



그 옆에는 버스정류장 같이 생긴 대기공간이 마련되어 있습니다.



열차시간표는 간단하기 생겼습니다.



한탄강역에도 역에 대한 정보가 걸려있습니다.



역 밖을 나오면 바로 도로가 보입니다.



진짜 역 바깥에 있는 눈에 보이는 건물은 버스정류장이 다입니다.



방금 보았던 태극기가 휘날리는 도로의 모습입니다.

38선 이북이다 보니 상징성이 매우 강한 곳이라 할 수 있겠습니다.



아까 그 버스정류장에서 바라본 한탄강역의 모습입니다.



이 역명판만이 이 곳이 한탄강역임을 알리고 있습니다.

이전의 역명판에는 글자가 떨어져 나갔었는데 그래서 새로 역명판을 달아둔 듯 보입니다.



한탄강역 주변을 걸어다니면 상당히 좋은 풍경을 감상할 수 있습니다.



한탄강철교가 높게 뻗은 모습 또한 은근 주변 풍경과 어울려 보입니다.



한탄강역 인근에 캠핑장이 있어 가족 단위의 여행객들이 자주 눈에 들어옵니다.



이제 전곡역으로 이동하기 위해 한탄강역으로 돌아옵니다.



사실 한탄강역은 2019년 3월 30일을 끝으로 더이상 열차를 탈 수 없게 됩니다.

선로 자체가 직선화되어 이설되기 때문에 이 곳을 지나가지 않게 되었기 때문이지요.



볼 때 마다 느끼지만 통근열차의 운전실은 객차간 통로와 비슷하게 생겼습니다.

그래서 승객들이 착각하고 문을 열려고 하곤 합니다. 기관사분이 깜짝 놀라시지는 않을까 합니다.


300x250