인터넷과 연결된 도메인서버인데 매번 시간이 느려지면서 정시가 되지 않는 문제가 있다.

이 문제를 해결하기 위해 google을 찾아본 결과 사이트를 찾을 수 있었다.

Domain환경에서의 서버시간 설정(NTP)

일단 방법은 간단하다.

먼저 도메인서버에서 관리자 권한의 Command Line을 띄운다.

그리고 다음과 같은 명령을 입력한다.

w32tm /config /manualpeerlist:"time.windows.com time.nist.gov pool.ntp.org,0x01" /reliable:yes /update

위의 내용 중 time.windows.com time.nist.gov pool.ntp.org 에만 수정해주면 된다. 저 안에 NTP 서버 이름을 변경/추가하면 된다. 위의 샘플에서는 총 3개의 NTP 서버를 등록한 것이다. 각 구분은 공백(" ") 으로 하면 된다.

 

최종적으로 확인하고 싶으면 regedit를 열어 다음 경로에서 찾아보면 된다.

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

2019. 12. 23. 오후 12:21

728x90

보통 마인크래프트는 Java 버전을 메인으로 하고 있어 Java 버전에 대한 다양한 리뷰, 서버 구축 등 많은 내용이 있다. 그런데, 메인으로 사용 중인 노트북의 경우 내장 그래픽이 Intel CPU에 탑재된 GPU였고, 안타깝게도, Direct-X에는 어느정도 친화적이였지만, OpenGL 기반의 3D에서는 성능이 그다지 좋지 못했다.

다행히 Windows 10 에서 제공하는 App Store에 등록된 Minecraft의 경우에는 Direct-X 기반으로 제작되어서 인지 매우 부드러운 움직임을 보여주었고, 생각보다 원활하게 동작했다.

문제는 다른 부분에서 발생되었다. 노트북에서 하다가, 핸드폰으로 좀 하다가, 데스크톱으로 하려다가 보니, 매번 월드 설정 파일을 Export 해야 되었고, 파일 공유를 위해 클라우드에 업로드 해서 공유해야 했다. 가끔 Export/Import를 까먹다가 보면 같은 게임인데도 결국 최종 작업을 했던 위치와 전혀 다른 이전 위치에서 시작하기도 했다. 더욱이 다양한 작업을 하다가 노트북을 Reset을 했는데, 그만 백업을 안해서 기존 월드 정보가 깡그리 사라지는 일까지 벌어졌다.

그래서 아예 서버를 구축해서 그 내용을 공유해서 쓰면 되겠다 싶었다. 그래서 이미 다른 사람들이 Open 한 곳으로 접속을 하려는데, 왠걸... 가끔은 장시간 연결이 안될 때도 생기고, 월드가 사라지고, 좀 접속자들이 많은 것은 마인크래프트가 아닌 전혀 다른 형태의 게임이 만들어져서 뭔가 수익모델 창출하듯 이상한 작업을 요구했다. 집 짓고 놀고 싶으면 코인 만들어야 되었다.

그래서 내 서버를 구축해야 겠다는 생각을 했다.


최초는 Mojang 사이트에서 공식적으로 제공하는 서버를 받아서 설치했다. 그런데, 문제는 이 서버는 오로지 Java 버전의 클라이언트에서만 사용이 가능했다. 즉 공식 버전 서버는 내 Windows 10 버전의 클라이언트로는 접속이 안된다. 나중에 알고 보니, 마인크래프트는 크게 Java Edition과 Bedrock Edition 으로 나뉘고 대부분 Windows 10, XBox, Android 폰용 마인크래프트는 Bedrock 에 해당되었다. 결국 공식 서버로는 방법이 없다는 것을 깨달았다.

그래서 이번에는 google을 통해서 MCPE(Mine Craft Pocket Edition) 으로 검색했다. Bedrock Edition을 Pocket Edition 이라고도 지칭하는 것을 보고 검색해봤다. 그러자 여러가지 종류들의 서버들을 볼 수 있었다. 다만, 주류가 PHP 기반으로 된 PocketMin-MP 라고 듣게 되었고, 그 버전으로 찾았다.

맨 처음은 Nukkit 이라는 서버. 이 서버는 태생이 PocketMine-MP 라는 서버의 PHP 버전을 Java로 마이그레이션 한 버전이라고 했고, Java 여서 Windows 든 Linux든 적용하는데 어렵지 않다고 했다. 그래서 다운로드를 받고 Java로 띄우긴했는데, 생각보다 서버의 리소스 소모가 컸다. 뭐 커봐야 8G 램 안 쪽이고, i5 5세대 정도면 나름 훌륭한 PC라서, 큰 문제가 없을거라 생각했는데, , 제일 큰 문제는 게임이 계속 끊긴다는 점이였다. 부속을 뽀갰더니 갑자기 롤백되서 원래대로 돌아오고, 아이템을 옮겼는데, 다시 원상복귀되고, 이게 잘 되다가 갑자기 잘 안되기도 하고...

다음에는 아예 PocketMine-MP 를 직접 받아서 해봤다. PHP 의 Zend로 구성되어 있는데, 요즘은 아예 웹사이트 상에서 Linux 기반의 스크립트로 자동 설치를 구성해서 제공했다. 한국 내에서는 대부분 서버가 이 PcketMine-MP로 되어있고, 다양한 플러그인을 제공한다고까지 했다. 물론 난 실행을 해보는게 중요해 설치에 들어갔다. 몇가지 옵션 잡고 Start 하면 자동으로 PHP를 기반으로 띄워 주었다. 매우 기민하게 작동하였다. 그래서 LAN 상에서 직접 Windows 10 클라이언트로 연결해서 확인했는데, 뭘 부수던 깨던 바로 바로 반응하는 아름다운 모습을 보여주었다. 아이템 옮겨도 즉시 즉시 여기저기 뛰어 다녀도 드라마틱하게 동작했다. 그래서 이번에는 외부에서도 할 수 있도록 하는데... 기본 포트는 19132 를 Port-Forward 시키는데.. 안된다.로컬에서는 다 되었는데...

방화벽을 내릴까라는 심각한 고민을 할 정도로 여러가지를 봤는데, 알고보니, TCP만 쓰는게 아니라, UDP로 사용하는 구조였다. 방화벽에서 TCP/UDP 혹은 Both. 지원하지 않으면 TCP로 한번, UDP로 한번 해서 정책을 만들어주어야 했다. 그래서 간신히 외부에서 연결했고.. 슬슬 시동을 걸어보았다.

그런데... 이게 웃기는게 몬스터든, 동물이든 도통 Spawn 되지 않았다. 지도를 거의 1000단위로로 위치를 이동했는데, 나와주질 않았다. 도대체 어디까지 가야 하는지... 원.

그러다가 알게되었다. 이 PocketMine-MP는 원래 스마트폰 안에서 실행할 수 있도록 만든 매우 작은 사이즈의 서버였고, 몬스터나 동물의 Spawn은 서버의 리소스를 많이 잡아 먹기 대문에, PocketMine-MP에서는 해당 기능이 동작하지 않았다. 이것도 다양하게 검색을 해봤는데, 대부분의 답변은 PureEntitiesX 라는 플러그인을 설치해서 설정하라는 것이였다. 즉 플러그인을 추가해서 해당 기능을 동작하게 끔 하는게 유일하다고 했다. 그래서 부랴 부랴 설치해서 해봤는데, 게임 내 하루가 지나자 동물이 생성되고, 야간이 되자 몬스터들이 나타나기 시작했다. 여기까지는 딱 좋았다. 문제는 몹이나 동물이나 모두 바보였다. 벽에 부딪히자 몸으로 비비면서 떨어지질 않았고, 나를 향해 제대로 달려들지도 못했다.

결론적으로는 이 PocketMine-MP는 쓸모가 없었다. 거의 포기 할 즈음 게임피아라는 사이트에 있는 마인크래프트용 Wiki에 갔고, 그 중 Bedrock Deicated Server라는 문서를 보게 되었다. 그 중 리눅스 용으로 Open Source화된 서버를 알게 되었고, 그 서버 이름이 MinecraftBedrockServer 였다. 공식 사이트는 https://github.com/TheRemote/MinecraftBedrockServer 였다. 문제는 설치 방법이 없어서 해당 블로그를 찾게 되었고, 그 블로그가 https://jamesachambers.com/minecraft-bedrock-edition-ubuntu-dedicated-server-guide/ 였다.

먼저 Ubuntu와 같은 좀 메이저한 리눅스를 준비하고, 접속하는 사람에 따라 서버 H/W 사양을 좀 높이면 된다. 나야 혼자 할 것이라, 더 많이 낮은 PC에 구축했다.

방법은 아래와 같이 간단하다.

다음 명령을 한 줄 씩 실행한다. 설치용 스크립트 파일을 받아, 실행하는 작업이다.

wget https://raw.githubusercontent.com/TheRemote/MinecraftBedrockServer/master/SetupMinecraft.sh
chmod +x SetupMinecraft.sh
./SetupMinecraft.sh 

설치 중에 관리자 권한이 일시적으로 필요해기 때문에, sudo 할 수 있는 계정이여야 한다. 일단 권한 상승을 위한 암호를 입력하면 설치를 쭉하다가 몇가지 묻는다.

“Start Minecraft server at startup automatically (y/n)?” 라고 묻는다면, y를 택한다. 서버를 진짜 백그라운드 서비스를 만들어준다. 이게 활성화되면, 굳이 로그인해서 프로그램을 일일히 실행안해도 되고, 계정 로그 아웃되어도 실행된 상태를 유지한다.

“Automatically restart and backup server at 4am daily (y/n)?” 라고 묻는다면, 이 역시 y를 택한다. 매일 새벽 4가 되면, 자동으로 재부팅하고 백업을 해준다는 의미다. 중요하지 않아도 서버가 깨졌을 때, 복구하는데 큰 도움이 된다.

자 그러면 자동으로 이 서버의 서비스가 실행되고, Windows 10용 클라이언트로 접속해보았다. 19132 로 접속하자 딱 붙고 상태도 나온다.

더 감동적인 사실은 "벌꿀"이 보였다. 최신 버전의 스킨에서 나온다는 벌꿀이.. 게다가 주변에는 각종 동물이 나돌아 다녔고, 이 글을 쓴다고 방치해놓자, 어느새 다가온 몹에 쳐발렸다. 부활해서 잠깐 주변을 이리저리 살펴보자 좀비에 거미에 ...

이제 이 곳에 정착하면서 다시 집짓고 서바이벌 놀이를 해봐야 겠다.

2019. 12. 20. 오후 4:51

728x90

현재 가지고 있는 모니터가 2K 급인데, 화면 크기가 작으면  Hi-DPI 문제가 슬슬 보이기 시작한다. 웹 기반의 App 이나, 깔끔하게 MS에서 만든 Application 들은 문제가 없는데, 옛날에 개발된 프로그램이나, WinForm 기반으로 Hi-DPI 이슈를 대비하지 않은 Application의 경우, 보통 매우 쪼그만해져서 표시된다. 이게 2K 의 125% 나 150%, 모니터 사이즈가 27인치 정도 되면 그냥 저냥 봐줄 만 하긴 하다.


그런데, 3K에 13인치의 사이즈에서 200% 정도에 놓고 보기 시작하면 환장하게 된다.

200% 로 설정해서 다른 Hi-DPI 대응 Application들은 일반적으로는 글자가 큼직하게 잘 표시되지만, 옛날 프로그램의 경우 그에 따르지 않고 쪼그만하게 표시된다.

Visual Studio도 마찬가지인데, Hi-DPI로 WinForm Application 으로 개발하면, 이것도 매우 웃기는 짓이 된다. 100% 기준으로 디자인이 다 끝낸 WinForm을 Hi-DPI 지원되는 곳에서 다시 디자인을 할 때, Auto-Scale 옵션이 DPI나 Fonts 인 경우 제멋대로의 사이즈인 버튼과 텍스트 박스, 위치 정보들을 멍하니 구경하게 된다.

이 문제를 해결하는 방법은 Hi-DPI 일 때, Windows 자체가 적당히 확대해서 보여주는 기능이 있다. 이 기능을 활성화하면 유사한 사이즈로 맞추어 준다.

위에서 캡쳐한 이미지와 보면, 위의 캡쳐에서 해당 Application의 사이즈가 변화되지 않고 화면 해상도와 1:1로 맞추다 보니 쪼그매서 모두 다 보여주지만, 아래에서는 1:1이 아닌 Hi-DPI에 대응해서 억지로 늘려줘서 크기가 확커져 모두 캡쳐되지 않은 모습을 볼 수 있다.

물론 문제점이 있긴 하다. 약간 Blur 효과, 그러니까 좀 흐리게 표시되는 문제가 발생된다. 이 기능 처음 봤을 땐 야매다 뭐다 해서 참 비판을 많이 했는데, 막상 이런 Hi-DPI 때는 이 기능만이라고 해도 감지덕지 같았다.


기능의 활성화 방법은 레지스트리를 수정하는 방법이다.


Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\Users\\neohind\\AppData\\Local\\OpenLiveWriter\\app-0.6.2\\OpenLiveWriter.exe"="^ DPIUNAWARE"


위의 예제 처럼 HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 위치에 프로그램이름을 Value Name으로하고, Value를 ^ DPIUNAWARE 로 설정한다.

그러면 위와 같이 좀 흐리지만 제대로 커진 화면을 볼 수 있다.

참고로 관리자 권한까지 넣을려면 ^ RUNASADMIN DPIUNAWARE 라고 Value에 넣어주면 된다.  참고로 저는 아래와 같이 입력해서 사용하고 있다.

2019. 12. 3. 오후 8:40

728x90

아주 오래된 서버인 HP DL360 Gen6 장비가 있다. HP 서버에는 내부에 iLO라는 솔루션을 탑재하고 있어 이를 이용하면 원격에서 서버를 핸들링 할 수 있다. 이 기능은 매우 매력적인 기능이다.

보통 Windows 운영체제를 사용하고 있다면, Remote Desktop 이라는 기능을 이용해서 원격제어가 가능하긴 한데, 제일 큰 문제가, 리부팅 등 Windows가 떠 있지 않은 상태에서는 제어가 불가능하다. 이 iLO 를 이용하면 Windows가 부팅되어 있지 않아도 제어가 가능하다.

다만, 지금 가지고 있는 서버의 경우 2009년 부터 판매된 제품으로 이미 단종된지 오래이다. 당연히 iLO2의 경우 요즘 최신 웹브라우저나 Java 등이 제대로 동작하지 않는다. 이런 저런 문제들이 있는데, 약간은 편법이긴 하지만, 몇가지 수정을 하면 동작을 한다. 현재 작업한 내용을 기준으로 정리한다.


1. iLO2 활성화

iLO2를 사용하려면, 서버 뒷 면에 있는 iLO 용 포트에 네트워크를 연결한다. 기본적으로 iLO2의 설정은 DHCP로 되어 있으므로 DHCP 서버가 있는 쪽에서 해주는게 좋다.

그리고 난 뒤 부팅 중에 iLO 화면이 나올 때 표시되는 IP 주소를 확인한다. 만일 DHCP 서버의 내용을 확인할 수 있으면 IP 주소를 확인하는데 문제가 없을 듯 싶다.

확인되었으면, IE 11을 띄워서 https://{ip address}(예 http://192.168.50.141) 로 연결한다. 그러면 로그인 화면이 뜬다.

여기서 로그인은 서버 상판에 붙은 iLO 정보를 이용해서 로그인을 시도한다. 보통 계정은 Administrator 이고, 암호는 8글자의 랜덤 문자열이다. (이 정보가 없다면... 필자도 모름 -_-;;; )

성공적으로 로그인을 했다면 다음과 같은 화면이 뜬다.

뜬 내용 중에서 iLO 2 Firmware Version과 License Type를 확인한다.

만일 Firmware 버전이 2.33 보다 낮으면 2번을 적용하고, License가 Advanced가 아니면 3번을 적용해준다.


2. Firmware 업데이트

만일 2.33 보다 낮은 버전이라면, HP 사이트에서 다운로드 받아서 업데이트 한다. 펌웨어 업데이트 중에서 프로그램을 직접실행하는 방법과 iLO 사이트 내에서 온라인 업데이트 하는 방법이 있다.

프로그램을 직접 실행하는 방법은 Windows 용 혹은 Linux용을 구분해서 다운 받은 뒤, 서버가 운영체제가 뜬 상태에서 실행해주면 간단하게 업데이트 된다.
(아래 사이트 URL : https://support.hpe.com/hpsc/swd/public/detail?swItemId=MTX_f6a4b5346d3a4a92846da43104 )

만약 서버내 운영체제가 설치 안되어 있거나, 해당 프로그램을 복사하기 어려운 경우 펌웨어 설치 프로그램을 실행 한 뒤, Extract 라는 것을 이용해서 내용의 압축을 해제한다.

해제된 내용 중에, xxxx.bin 파일을 확보한다.

그리고 iLO 사이트에서 Administration 탭을 클릭한 뒤, iLO2 Firmware 를 클릭한 뒤, 사이트에서 직접 bin을 업로드해서 업데이트 하도록 한다.


3. iLO2 Advanced 라이선스 적용

iLO의 경우 Remote Console을 이용하려면, Advanced 이상의 라이선스가 필요하다. 정식적으로는 구매를 해야 하는데, 우리나라에서는 구하기 힘들고, ebay 같은 곳에서 구매를 해야 할 것이다. (ebay에서 iLO2 로 검색하면 됨) 대략 가격은 15 dollor 정도 한다. 물론 Google에서 iLO2 advanced license key 로 찾아보는 것도 좋을듯. 일단 구하면 Activation Key라는 CD 키 같은 값을 구할 수 있을 것이다.

이제 iLO 사이트에 접속한다.
그리고 난 뒤, Administrator 탭에서 License 메뉴에 들어가 Activation Key라는 부분에 입력 한 뒤 Install 버튼을 클릭하면 된다.


4. IE 로 접속하기.

위의 작업은 Chrome 이든, Firefox 든 무엇으로 접속하더라도 문제가 없지만, Remote Console을 하려면, 무조건 IE로 해야 한다.

그 이유는 Active-X를 이용한 방법으로 접속을 할 예정이라서 그렇다.

사이트 내에서 Remote Console 탭을 클릭 한 뒤, Information 메뉴를 선택한다. 그리고 난 뒤에 나온 링크 중, Integration Remote Console을 클릭하면 된다.

그러면 팝업으로 새로운 창이 뜬다. 최초로 실행하면 Active X 설치 요청 화면이 나오는데, 설치를 정상적으로 진행하면 다음과 같이 실행된 화면이 나온다.

실제로 리부팅을 해보면 서버의 부팅 화면도 확인할 수 있다.

2019. 11. 14. 오후 5:11

728x90
이거 수정해 봤는데, 새로운 기능을 또 발견했다.
현재 개발된 버전에서 Picture를 추가하게 되면, Google Drive 쪽에 업로드한 뒤, 공유 URL을 박는 구조인 것 같다. 그래서 붙여넣거나, Local PC에서 업로드하는 식으로 하면, HTML이 file:/// 을 사용해서 연결되도록 되어 있다.
문제는 Google 정책이 바뀌어서 더 이상 위의 방법으로 제공되지 않는다. 게다가, 근본적으로 올리는 방식을 바꾸려면, OpenLiveWriter.PostEditor 프로젝트를 수정해야 하는데, 이 작업을 하다가 보면, Google OAuth가 더 이상 지원되지 않는다. 이거 생각보다 심각한 문제라...
그래서 이전 포스트와 동일한 위치를 수정할 수 있을까 고민해 봤는데, 가만히 보니, 이미지 등록을 할 때도 img 라는 태그로 해서 추가되는 것 같았다. 그래서 img 태그로 추가 될 때, src 내용을 잽사게 가져와서 이를 base64 기반의 데이터로 변경하도록 수정해봤다.

(소스를 넣으려고 했더니, <img src가 regex에 걸려버려서, 소스를 넣을 수가 없다)
위의 내용으로 컴파일 한 뒤, 패치를 하자, 이미지가 Base64로 바뀌어 Source로 들어간다. 제대로 들어가긴 하는데, Source의 크기가 좀 커지는 것 같다. 그러다 보니, Source 탭으로 화면을 전환 할 때 다운된 것 처럼 매우 느려진다.
일단 파일 형태로 첨부들어가는 경우 알아서 자동으로 변환되므로 큰 문제없이 사용이 가능하다.

패치 결과물이 같은 파일이다 보니, 아래 포스트와 동일한 경로로 잡혀 버렸다.
이 패치를 하면, 아래 포스트 한 내용과 동일한 내용이 적용된다.
(Google Drive  : OpenLiveWriter.HtmlEditor.dll ) 

2019. 11. 8. 오후 8:00

728x90
과거 Windows Live Writer를 잘 쓰다가, 갑자기 MS 에서 정책을 바꾸더니 해당 솔루션이 없어져 버렸다. 다른 제품들은 모르겠지만, 이 Windows Live Writer는 블로그 글작성 시 가장 훌륭하게 동작하는 Offline 버전의 Blogger Writer App이다.
거의 포기하고 있었을즈음, 구글링으로 우연찮게 Open Live Writer 라는 것을 발견했다. 과거에 개발되어 배포 되던 Windows Live Writer의 원본 소스 그대로 가져와서 Open Source화를 하여 제공한다고 했다.
문제는 2017년 이후 더 이상의 버전업이나 업데이트 없이 현재는 0.67 로 Stop 된 상태.
다 좋은데, 이상하게 Source 탭만 넘어갔다오면 Source 내의 Html Source들이 한 줄로 쭉 표시된다는 점이였다. 게다가, Font도 너무 작아서 해상도가 높은데서는 완전히 쥐약과 같은 모습이였다. 다른 것보다 한글은 정말이지....


그래서 2가지 목표를 삼고 Open 된 소스를 수정해야 겠다는 생각을 갖게되었다.
  1. 폰트를 바꾸자 : D2Coding
  2. 폰트의 사이즈를 바꾸자 : 12.6f
  3. 소스 상에서 줄 바꿈한 것도 원래대로 표시하자

이 작업을 위해 공식 사이트에서 Source를 다운로드 받았다.
현재 Visual Studio 2017 Community Edition을 사용하는데 다행히 Open은 되었다. 이제 다음을 Focus로 수정을 하도록 하겠다.

1. 폰트 변경하기.(폰트 및 사이즈)

Font 부분은 OpenLiveWriter.HtmlEditor 프로젝트에 있는 HtmlSourceEditorControl.cs 파일에서 수정한다. 위치는 57 Line이고 해당 부분에 폰트 이름과 사이즈를 등록하면 된다.



2. 줄바꿈 문제 해결.

이 부분은 OpenLiveWriter.HtmlEditor 프로젝트에 있는 TextBoxEditorControl를 수정한다. 이 문제의 원인은 Html 소스에서는 \n 만 사용하다 보니, Textbox에서 작성된 \r\n 이 \n 으로 전환되서 발생되는 문제이다. 일단 \r\n 을 \n 으로 변경하는 부분은 손대지 않도록 한다. 그렇지 않으면 Blog에 포스팅할 때 문제가 되니, 그냥 Textbox로 전환될 때 \r\n 으로 전환되도록 한다. ( 아무래도 이 프로그램을 Linux에서도 쓸 수 있게 하려다가 보니, 자연스럽게 해당 코드가 적용된듯...)
이 부분의 수정은 Text 라는 프로퍼티를 이용해서 데이터를 쓸 때,  \n 을 \r\n 으로 수정될 수 있게 한다. 혹시 모를 \r 이 있을지 모르니 작업전에 \r 을 모두 없애는 로직까지 포함한다. 이 작업을 위해 Text를 Override 처리한다.



이제 완성되었으면 배포를 한다.
그래서 방법은 Open Live Writer 자체는 그냥 공식 사이트에서 받아서 그대로 설치하고 Dll 만 패치했다. 설치된 위치는 필자 기준으로 c:\Users\xxxxx\AppData\Local\OpenLiveWriter\app-0.6.2\ 위치에 설치되어 있었다. 해당 위치에 다음 DLL을 복사하면 된다.
  • OpenLiveWriter.HtmlEditor.dll

이렇게 수정하면 Source 창을 보다 편하게 사용할 수 있다!

나중에 활용을 위해 해당 DLL만 여기에 등록한다.
(Google Drive  : OpenLiveWriter.HtmlEditor.dll )

2019. 11. 8. 오후 6:41

728x90

C#을 이용해서 프로그램을 작성할 때, 암호화 관련되서는 대부분 CryptSteam 이라는 클래스를 이용하여 작성하곤 했다. 일단 Stream 계열로 작성되기 때문에, 매우 쉽게 접근할 수 있고 제작할 수 있어 매우 마음에 드는 구성이다.

그런데, 이 예제를 MS에서 제공하는 MSDN을 통해서 가져왔는데, 이 기법을 이용해서 빌드를 하게 되면, 중복 Dispose가 불린다는 Warning이 뜬다. 아마도 예제를 만든 사람은 C 계열 개발자 인듯. 매우 공격적으로 자원 해제를 하다가 보니, 중복 Dispose고 나발이고 작성된 것 같다. 프로그램 Run에는 문제가 없으나, 아마도 중복 Dispose로 인한 여러가지 수반되는 문제들이 있을 것은 어렵지 않게 예상된다.

먼저 MS에서 제공하는 예제는 다음 URL을 통해서 볼 수 있다.

CryptoStream Class(https://docs.micro…)

위의 내용 중 예제 부분만 추출하면 아래와 같다.

[ Encryption Part ]

// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{                    
    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
    {      
        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
        {
            //Write all data to the stream.
            swEncrypt.Write(plainText);
        }
        encrypted = msEncrypt.ToArray();
    }
}

[ Decryption Part ]

// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
    {
        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
        {
            // Read the decrypted bytes from the decrypting stream
                            // and place them in a string.
               plaintext = srDecrypt.ReadToEnd();
        }
    }
}

문제는 위의 예제대로 하면 어김없이 발생한다는 것이다. using 이라는 구분을 쓰게 되는데, 이게 바로 그 문제의 원인.

그래서 고민을 했는데, 아래와 같이 수정하면 된다.

[ Encryption Part ]

// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
    CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
    StreamWriter swEncrypt = new StreamWriter(csEncrypt);
    {
        //Write all data to the stream.
        swEncrypt.Write(plainText);
        encrypted = msEncrypt.ToArray();
    }
}

 

[ Decryption Part ]

// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
    CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
    StreamReader srDecrypt = new StreamReader(csDecrypt);
    {
        // Read the decrypted bytes from the decrypting stream
        // and place them in a string.
        plaintext = srDecrypt.ReadToEnd();
    }    
}

위와 같이 고치면 끝날까? 아직 끝나지 않았다. 그 이유는 Encoding 파트에서 발생된다.

중요 원인은 using이 가지는 특징 때문이다. using은 자체적으로 Dispose도 하지만, 그전에 자원을 모두 정리해주는 특성을 갖는다. 그래서 지금 저 Writer 부분에서 자체적으로 Dispose 하면서 자신이 갖은 데이터를 그대로 부을 수 있도록 해주기도 한다. 그러므로 무조건 using을 없애는 것은 답이 아니다.(실제 Debug로 해보면, Write를 하였음에도 불구하고 데이터가 없는 것 처럼 0 byte가 결과로 나온다.)

그러면 어떻게 해결해야 할까? Stack Overflow에서 확인해본 결과 Close를 해주면 깔끔하게 끝난다고 한다.

 

// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
    CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
    StreamWriter swEncrypt = new StreamWriter(csEncrypt);
    {
        //Write all data to the stream.
        swEncrypt.Write(plainText);
	  swEncrypt.Close();
        encrypted = msEncrypt.ToArray();
    }
}

내 코드에서도 위와 같은 문제가 발견되서 매우 당황했는데, 여튼 이번에 해결하게 되어 블로그로 남긴다.

Decrypt 부분은 위의 Encrypt와는 다르게 Close가 필요없다. 이미 데이터가 들어간 상태이고,  Write는 일단 캐쉬에 먼저 넣기 때문에 실제 데이터가 들어가 있지 않아서 발생된 문제다. 그러므로 그냥 using을 적당히 날리면 문제 없이 코드가 돌아간다.

2019. 11. 8. 오후 2:01

728x90

사실 우리나라에서 메신저는 역시 카카오톡이다. 모바일 전반적으로 다 쓰고, 거래처에서도 이 메신저를 가지고 업무의 내용을 주고 받는다. 심지어 가족들 사이에서도 이 메신저를 사용한다.

원활하긴 하다. 다만, 오로지 휴대폰으로만 할 때만이다.

만일 PC용을 사용하려할 때 말이 달라진다.
카카오톡 PC 버전이 없는 것은 아닌데, 문제는 광고다.
이게 무척 잦고 많고 시끄럽다.

툭하면 광고가 올라오고, 메시지 아래에 큼직하게 박혀 있다.
이윤을 추구하는 회사로써 꽁짜로 서비스를 사용하는 입장에서는 어쩔 수 없이 감당해야 하는 것일지는 모르겠지만 싫은 것은 싫기 때문이다. 요즘은 휴대폰용 메시전에서도 툭하면 나오기 시작했다.

텔레그램을 처음 사용한 이유는 서버가 해외에 위치해있고, 내부 암호화도 잘 구축되어 있어 안심하는 마음에 사용했지만, 요즘에 매우 애착가는 이유는 역시 광고가 전혀 없는 점이다. 이건 충분히 매력적인 것 같다.

모바일이든 PC든 어느 곳에도 광고라는 것이 존재하지 않고, 깔금하게 시작되고 깔끔하게 종료되니.

회사내에서 프로젝트 초기 때 주변에서 Slack Slack해서 Slack을 사용하긴 했는데, 이것도 금전적인 어느정도의 지원이 없으면 정작 활용도 높게 쓰지는 못하는것 같다. 차라리 이 대 텔레그램으로 할  걸이라는 생각이 가끔든다.

여튼 깔끔하게 사용하는 메시저가 필요하다면 역시 텔레그램이 좋은 것 같다.

2019. 10. 24. 오후 5:25

728x90

+ Recent posts

728x90