ESukmean’s Blog
짧은 글들을 주로 작성합니다.
-
2020년 정리
1~4월 군대에 박혀 있었다. 원래 전역일자는 5월 중순이었다. 그러나 코로나 때문에 4월 말 즈음에 현지전역 제도로 집에 갔다. 코로나로 인한 출타제한 때문에 거의 20일? 정도 일찍 나오게 되었다. 대대급 내에서는 인사를 다 드리고 나왔으나, 불교 군종장교님께는 인사를 못드린게 못내 아쉽다. 나름 불교 군종병으로 활동 했었는데 아쉽게 되었다. 19년 말 부터 리눅스용 사지방 접속기를 만들고 배포하였다. 병영내 사지방 개선 사업이 진행되면서 하모니카 OS가 설치된 PC들이 보급되기 시작했었다. 사업 초기에 여러 문제가 쌓여 있었다. 그중 병사로서 가장 크게 다가온 것은 구글 및 유튜브 접속장애 문제였다. 구글·유튜브 접속에 2~3분 걸리다가 끝내 타임아웃까지 발생하는 문제였다. 이로인해 사지방의 목적인 “인터넷 검색”을 할 수 없는 환경이 된 것이다. 네트워크 장비상의 문제를 우회하지 않고서는 해결할 방법이 없었다. 윈도우 상에서는 익히 알려진 우회방법이 있었으나, 하모니카에서는 불가능한 방법이었다. (루트 권한이 없는게 가장 크다) 그래서 유저 레벨에서 사용 가능한 우회 접속기를 만들어서 사용했었다. 그 과정속에서 사지방 운영 업체측에서 파이어폭스를 전체 차단하는 병맛 가득한 수를 두어서 충격 먹기도 하였다. 네트워크 장비에서 특정 IP대역을 필터링 하는 문제가 원인이었기에, 이 대역만 피해서 접속을 하면 해결되는 문제였다. 처음에는 파이어폭스의 Dns Over…
-
유챗 봇 만들기 #1 – Tokio 적용
이전 글에서 유챗이 어떤 프로토콜·구조를 가지고 통신을 하는지 알아 보았다. 이번 글에서는 Tokio를 이용해서 프로그램의 기본적인 구조를 짜 볼 것이다. 또한 tokio-tungstenite 라이브러리까지 결합하여 웹소켓 접속까지 다루어 볼 것이다. Rust 프로젝트 생성 가장 먼저 Rust를 설치해야 한다. Rust는 rustup으로 간단한게 설치 할 수 있다. rustup은 Rust를 사용하기 위해 필요한 툴체인들을 설치하도록 도와주는 공식 프로그램이다. rustup은 https://rustup.rs/ 에서 다운로드 및 설치 할 수 있다. 설치가 완료되었다면 cargo, rustup 등의 프로그램을 사용 할 수 있게 된다. cargo나 rustup가 바로 실행되지 않는다면 쉘(터미널)을 재시작 해야 한다. /usr/bin등이 아닌 /root/.cargo/bin 와 같은 별도의 폴더에 프로그램이 설치되기 때문에 $PATH를 업데이트 해야 하기 때문이다. 쉘을 재시작 하면 정상적으로 $PATH가 다시 읽혀저서 사용이 가능할 것이다. 그래도 안된다면 폴더를 $PATH에 집어넣든 ln -s $/.cargo/bin /usr/local/bin 등으로 적절하게 기존 $PATH에 집어넣든 해서 조치를 취하자. rustup까지 설정이 완료되었으면 Rust 프로젝트를 위한 작업공간을 만들어야 한다. Rust 프로젝트는 Cargo 라는 패키지 관리 프로그램으로 생성 할 수 있다. (npm 같은것이라고 생각하면 된다) cargo new 또는 cargo init를 사용하면 된다. cargo new 이름 을 실행하면 현재 위치 아래에 새로 이름에 해당하는 폴더가 생길것이다. 이미 있는 폴더에 프로젝트를 만들고 싶다면 해당 폴더안에서 바로 cargo init를 실행해도 된다. 정상적으로 실행 됐다면 위와 같은 파일 구조를 가질것이다. 여기서 Cargo.toml은 프로젝트의 설정 및 의존 라이브러리 지정에 사용된다. 실제 프로그램의 코드는 src/ 폴더 아래에 들어가게 된다. 이미 src/ 폴더 아래에는 main.rs가 존재하는데, src/main.rs 파일이 프로그램의 진입점이 된다. Tokio 라이브러리 사용 Tokio는 비동기 작업 스케줄링 라이브러리이다. tokio를 이용하면 빠르고 간편하게 프로그램을 비동기로 짤 수 있다. 우선 우리 프로젝트에 tokio를 적용해 보자. 먼저 Cargo.toml을 열어서 [dependencies] 하단에 tokio = { version = “0.3”, features = [“full”, “io-util”, “net”]…
-
유챗 봇 만들기 #0 – 프로토콜 분석
유챗에서 작동하는 간단한 봇을 만드려는 중에, 관련된 자료가 검색해도 보이지 안길레 적어본다. 어디까지나 내가 코드를 분석하면서 찾은것을 기반으로 작성한 글이기에 부정확한 내용이 있을 수도 있다. 우선 유챗의 통신 내용을 들여다보면 아래와 같이 나온다: 모든 통신은 웹소켓을 기반으로 동작하고 있음을 볼 수 있다. 특히 웹소켓중 바이너리 타입으로 데이터를 송수신 함을 볼 수 있다. 하나의 웹소켓 패킷(바이너리 타입 메세지) 안에서는 \n을 기준으로 여러개의 메세지를 담을 수 있다. 메세지는 중간에 끊어짐이 없다. 각 줄의 메세지는 다시 \x02, \x03, \x04, \x05, \x06, \x07 등으로 내용 구분된다. 다시 말하자면, 우선 바이너리 타입의 웹소켓 패킷으로 메세지의 덩어리가 온다. 들어온 메세지 덩어리는 우선 \n 단위로 나눠진다. 그렇게 나눠진 한줄 한줄 나눠진 메세지는 다시 \x02~\x07을 구분자로 해서 내용이 나뉘어진다. 맨 앞에는 메세지의 타입(기능)을 구분해 놓은것 인 것 같고, 나머지는 자신의 데이터 맨 앞에 있는 구분자에 의해 해당 내용(데이터)의 타입이 정해지는 것 같았다. 메세지1에 \x03 ESukmean 이라고 있으면, 이는 문자열 “ESukmean”임을 뜻한다. \x04 1이 있으면 이는 true를 의미한다. 내용들이 구분자로 (\x03 ~ \x07, \n등) 쪼개지기에 프로그램이 구분자와 일반 데이터를 구분하는것이 매우 중요하다. 누군가의 채팅 내용에 \n이 있었는데, 그것을 메세지의 분리로 인식하면 프로그램의 버그가 발생할 것이다. 이를 방지하기 위해 혹시라도 구분자에 해당되는 데이터가 들어온다면 그 앞에 \을 붙여서 escape하는 것 같았다. 예를 들어, 채팅 내용이 “가나다라 \n 아자차카” 라면, 우리가 받는 메세지는 “가나다라\\\n아자차카”가 되는것이다. “1234 \x06 5678″ 이라는 데이터는 “1234 \\\x06 5678″로 들어올 것이다. UChat.js를 보면 아래와 같은 구분자 타입이 존재함을 알 수 있다.…
-
부산진구 부암동 용사촌
부암동 롯데캐슬을 짓고있는 영역이 원래는 부암동 “용사촌”으로 불리던 곳이었다. 지금은 아파트 공사때문에 주변 부지들이 모두 철거되고 그저 공사장밖에 보이지 않는다. 원래 가지고 있던 쿠키폰(LG-SU910)에 그 이전 사진도 있을텐데… 그 까지는 찾아보지 않고, 여기서는가지고 있는 철거 공사전 용사촌 사진을 몇장 올려본다. 여기서 부터는 ’17년도에 당감천 지류를 찾아본다고 혼자 용사촌-(구)당감4동 주민센터-무궁화아파트를 다녔었던 때 찍었던 사진들이다. 사진에 나온 부분 모두가 아파트 건설로 인해 사라졌다. ’17년도는 한창 동천을 살리자는 이야기가 나왔던 시기였다. 그때 당감천도 고치자며 생태하천으로 바꾸겠다고 말이 나왔었는데 (http://web.archive.org/web/20201023160731/http://www.busan.com/view/busan/view.php?code=20160304000116) 아파트의 공사와 맞물려서 어떻게 결정이 됐는지는 모르겠다. 대신 아파트 공사 초기에 복개 부분을 다 보수한다고는 했던것 같다. 짜피 다 뜯어내야 하니까.. 이번에 안하면 아파트가 들어선 뒤로는 어떻게 손 댈 방법이 없으니.. 지금은 공사중이어서 뭘 어떻게 했는지는 모르겠다. 내 바람으로는 복개를 어느정도 걷어내어 물줄기를 보이게 했으면 좋겠긴 하다. 당감천으로 이야기가 잠시 세어 나왔는데, 여기까지가 내가 가지고 있는 용사촌의 사진들이다. 난 여기에 살지는 않았지만, 종종 답사처럼 갔었다. 기억상에서는 나름 조용하지만 활기찬 동네였는데… 어떻게 보면 안타깝고, 어떻게 보면 시대의 변화로 느껴진다. 혹시라도 미래를 위해.. 로드뷰 링크를 몇장 추가한다. 철거 될때에도 복개 부분은 건들지 못한것으로 보인다. http://naver.me/FZg35yX5 http://naver.me/xVKiMUEf http://naver.me/5rLWiUuu http://naver.me/F55tQpeA http://naver.me/Fxz7DbNF 당감동 자체가 재개발의 열풍을 띄고 있어서.. 올릴 사진이 더 많아질 수도 있을것 같다. 당감천 답사 사진은 나중에 따로 올리던가, 해당 구역이 재개발되어 사라지면 그때 올리도록 하겠다..
-
내원사 옆 지류 계곡(?) – 2020.08.03
태풍이 오고 이틀 뒤 정도에 가서 그런지 생각보다 물줄기가 많았다. 월요일이어서 그런지 이쪽은 사람이 거의 없었다. 비록 내원사쪽은 사람이 꽉 차서 못갔지만 말이다. 들어갈 때 입장료가 있으니 참고할 것!
-
프로그램을 조금더 빠르게 – AoS vs SoA 프로그램 비교
저번 글에서 AoS와 SoA의 개념에 대해 글을 써 보았다. AoS와 SoA 이야기를 논하려면 데이터가 메모리에 가지런히 모여있다는 전재를 해야한다. 배열을 만들었으나 실제로는 데이터가 연속적으로 모여있지 않고 뿔뿔히 흩어저 있으면 메모리 캐싱이 될 리가 만무하다. 즉, AoS와 SoA는 메모리 구조가 시스템적일수록 더욱 효율적으로 동작한다. 배열의 저장과 그 외 기능의 동작이 군더더기 없이 딱 필요한 기능만 동작될…
-
프로그램을 조금 더 빠르게 #1 – AoS와 SoA
메모리 속도는 CPU에 비해 훨 느리다. 이것을 극복하려면 CPU 캐시 메모리를 잘 써야한다. 이를 위해서는 SoA와 AoS (Struct of Array, Array of Struct)을 알 필요가 있다. 메모리 속도에 따른 프로그램 동작 속도를 알아보자.
-
Docker-Compose로 PHP + MySQL 묶기
지금 이 블로그도 그렇듯 서버내 모든 서비스가 도커 내에서 돌아가고 있다. 서버 맨 앞에 nginX를 두고 적절한 도커 컨테이너로 연결을 중계해 준다. 이때 기본 nginX로 다루기 껄끄러운 커넥션은 다시 Rust를 통해 다시 핸들링한다. 이런 구조속에서 각 컨테이너간 서로 통신해야할 일이 생길수 있다. 나로 같으면 PHP와 MySQL를 서로 연결해줘야 하는 상황이 생긴것이다. 짜피 Docker-Compose를 쓰기에 PHP와…
-
Thinkpad L15 (AMD)에 리눅스 설치기 : 커널은5.8 로
최근 Lenovo Thinkpad L15 (AMD, 4750U)를 구매했다. 기존에 윈도우 10을 설치해서 사용하고 있었으나, 개발에 리눅스가 필요해서 설치를 해 보았다. 설치한 배포판은 하모니카 ME (우분투 기반의 민트 기반의 한국형 배포판, https://hamonikr.org/menuDownload_RTM) 를 사용하였다. 커널 버전 리눅스를 설치한 직후에는 여러 문제가 발생했었다. VGA 드라이버가 안잡히는것 부터 해서 화면 밝기 조절 불가 문제, CPU 제어 불가, 그 외…
-
민감한 정보를 다룰 때 들이닥치는 사람 방어하기
이전에 상상실험 비스무리하게 민감한 정보를 다루고 있을때 적·스파이가 들이닥친다면 어떻게 해야할까? (좀 더 직설적으로 표현하자면, 작업중 경찰이 들이닥치면 어떻게 해야할까?) 에 대해 아는 형님하고 이야기 해 본적이 있다. 그 때 이야기가 끝이었지만, 다시금 생각이 나서 추가로 찾아보며 정리해 보려 한다. 윈도우를 버리고 리눅스로 옮겨탄다 매우 중요하다. 윈도우는 생각보다 편리하지만, 또 생각보다 보안에 좋지 못하다. 일반…