(일상) 4월 3일
일상 카테고리
이 블로그에 컴퓨터 기술만 쓰면 너무 허전하니,
일상 블로그도 적어보기로 한다.
게임
DS2
저번 달 Death Stranding 2가 PC판으로 나와서 바로 구매했다.
3년 전 1편을 정말 재미있게 해서(인생게임) 2편을 정말 기대했었다.
중학생 시절 반 친구로부터 Call of Duty 4라는 게임을 처음 접했는데,
당시 적진에 잠입하는 미션에서 행군중인 적들의 길목 한복판에 위장복만 입고 엎드려
적들이 나를 밟지 않고 그대로 지나가기만을 바라는 기믹이 지금도 기억날 만큼 너무 스릴넘쳤다.
그때의 쫄깃함을 이후 게임들에선 느낄 수 없었는데, Death Stranding 1편을 할 때 다시 접하게 되었고, 그렇게 인생게임이 되었다.
그래서 작년 2편이 출시되었을 때, 플레이스테이션 기간 독점이라 게임기까지 살까 생각도 했었는데
2주 전(3/19), PC판이 출시되었던 것이다!
19일 출시되자마자 구매해서 지금까지 15시간 정도 진행했는데,
이미 접한 기억이라 그런지 그때의 감정은 아직 느낄 수 없었다.
아직 극초반이고, 인터넷 후기로는 1편보다 더 호평이라고 하니 꾸준히 진행해 봐야겠다.
Zomboid 서버 오류와 Linux
Openstack으로 다시 구축한 Zomboid 서버는 잘 운영되고 있다.
(Cinder를 포함한 나머지 포스트도 조만간 올릴게요~)
문제는 서버에 모드를 이것저것 넣다 보니까, 모드가 업데이트 되면 서버에도 자동으로 업데이트가 되지 않아
클라이언트와 서버의 모드 버전이 불일치해 서버를 재시작하여 업데이트를 반영하지 않는 이상 접속이 불가능한 오류가 생긴다.
이 디스코드 봇을 사용하면 봇이 모드 업데이트를 감지해 자동으로 서버를 재시작해준다는데,
문제는 이 봇을 적용해도 모드 업데이트 감지가 안 되었다.
Exception: System.ArgumentNullException
Message: 값은 null일 수 없습니다.
매개 변수 이름: s
Stack trace: 위치: System.IO.StringReader..ctor(String s)
위치: Newtonsoft.Json.Linq.JToken.Parse(String json, JsonLoadSettings settings)
위치: SteamWebAPI.<GetWorkshopItemDetails>d__3.MoveNext() 파일 C:\Documents\Programming\C#\PZServerDiscordBot\src\Bot\Util\SteamWebAPI.cs:줄 80
--- 예외가 throw된 이전 위치의 스택 추적 끝 ---
위치: System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
위치: Schedules.<>c__DisplayClass4_0.<<WorkshopItemUpdateChecker>b__0>d.MoveNext() 파일 C:\Documents\Programming\C#\PZServerDiscordBot\src\Bot\Schedules\WorkshopItemUpdateChecker.cs:줄 58
Date: 06-03-2026 15:31:47 UTC
Bot Version: v1.11.5
Exception occured in ScheduleItem callback function. ScheduleItem: WorkshopItemUpdateChecker
(THIS IS AN INNER EXCEPTION, NUMBER 1)
봇 로그를 보니 봇의 모드 업데이트 감지 스케줄러가 돌 때마다 위와 같은 오류가 나왔다.
그래서 소스 코드를 뜯어보니 해당 스케줄러 코드(WorkshopItemUpdateChecker.cs)에서
string[] workshopIdList = iniData.GetValue("WorkshopItems").Split(';');
...
var fetchDetails = Task.Run(async () => await SteamWebAPI.GetWorkshopItemDetails(workshopIdList));
var itemDetails = fetchDetails.Result;
foreach(var item in itemDetails)
{
...
이 부분에서 원인을 찾을 수 있었는데,
workshopIdList가 가져오는 ini 파일의 부분이 아래와 같다.
1
WorkshopItems=(모드id1);(모드id2);(모드id3);...(모드id마지막);
workshopIdList는 ini 파일의 WorkshopItems 부분을 가져와 세미콜론(;)으로 Split 한 리스트인데
문제는 위 코드처럼 맨 끝에 세미콜론이 있으면 리스트의 마지막 항목이 빈 값(null)으로 들어가버리는 것이고
이걸 SteamWebAPI.GetWorkshopItemDetails(workshopIdList) 부분으로 넘길 때 해당 null 항목 때문에 에러가 난 것이다.
따라서 ini 파일에서 맨 뒤의 세미콜론을 빼 주니 정상 작동하였다.
참고로 이 스케줄러의 원리는 SteamWebAPI를 사용해 모드들의 최종 수정 시간을 찾아, 수정 시간이 바뀐 모드가 있으면 서버를 재시작하는 것이다.
이 봇 자체가 Windows에서만 작동하는 프로그램이라(.NET Framework 사용),
리눅스에서도 돌아가도록 .NET Core로 포팅하는 작업도 구상 중이다.
Windows에서 서버를 돌리니 너무 메모리를 많이 잡아먹어서 말이지…
음악
Cambodian Rock과 킬링필드
작년 하반기를 뜨겁게 달군 캄보디아 범죄도시의 역사가 흥미로워, 관련 인터넷을 뒤져보다
캄보디아 록이라는 음악까지 발견하게 되었다.
위키피디아를 보니 캄보디아는 1960년대 서양의 록을 받아들여 나름 아시아의 음악 선구주자였다고 한다.
당시 서구권은 비틀스(The Beatles)나 롤링 스톤스(The Rolling Stones) 등을 통해 몽환적이고 이국적인 싸이키델릭 록이 히피 문화를 타고 유행했는데
이거의 원조가 동양(주로 인도)이다 보니 캄보디아의 전통음악과 죽이 잘 맞아, 국왕 시아누크(Norodom Sihanouk)의 전폭적인 지원으로 캄보디아에도 록 음악이 성행하였다.
문제는 1976년, 베트남이 적화통일되고 그 여파로 친미 독재국가였던 시아누크 왕정(+논 롤 공화국)도 무너지게 되어 캄보디아는 크메르 루주(Khmer Rouge, 불어로 붉은 크메르라는 뜻)라는 공산 세력이 지배하게 되었다.
프랑스 유학파였던 폴 포트(Pol Pot)가 이끈 크메르 루주는 극단적인 공산주의 사상을 내세워 말도 안되는 이유로 자국민을 학살했는데, 이게 바로 그 유명한 킬링필드이다.
킬링필드의 만행은 워낙 유명하지만 몇 가지 예를 들자면
- 책을 똑바로 봤다고 처형
- 외국어를 할 수 있다고 처형
- 안경 썼다고 처형
그냥 폴 포트의 맘에 들지 않으면 전부 처형되었다 보면 된다.
웃긴 건 폴 포트는 대학을 나오고, 불어를 할 줄 알며, 안경을 썼다는 거였지만…
아까 말한 캄보디아 록 음악도 이때 가수들이 전부 크메르 루주에게 끌려가 실종되면서 그 명맥이 끊기게 되었다.
1978년, 급기야 이들은 베트남에게까지 처들어가 베트남인들을 학살했는데
폴 포트가 개인적으로 베트남을 고깝게 봤다는 이유에서였다.
결국 분노한 베트남은 캄보디아를 전면 침공, 월남전으로 단련된 월맹군은 자국민 학살 말곤 할 줄 모른 크메르 루주를 무너뜨리고 캄보디아를 장악하게 된다.
(당연히 캄보디아인들은 진주한 월맹군을 적극 환영했다고 합니다)
도망친 폴 포트와 크메르 루주 잔당은 정글 깊숙한 곳에 숨어들어 베트남과 유격전을 펼쳤는데, 이들은 미국과 중국의 지원을 받아 10년이 넘게 버틸 수 있었다.
미국과 중국이 크메르 루주를 지원한 이유가 가관인 게, 예나 지금이나 베트남의 뒷배는 소련이였으므로
미국은 월남전의 치욕을 갚고자, 중국은 소련과 사이가 좋지 않았기 때문에 서로 크메르 루주의 뒷배를 자처했다고 한다. 참으로 냉전의 비극이 아닐 수 없다.
(이러한 이유로 7~80년대에는 미중관계가 매우 좋았다고 합니다. 미중관계가 틀어진 건 1989년 천안문 사태 이후)
(또한 유고, 루마니아, 북한같이 소련에서 벗어나 독자노선을 걷던 공산국들도 크메르 루주를 지원했다고 합니다)
아무튼 이야기가 길어졌는데, 그렇게 역사에도 남지 않았던 캄보디아 록은 1996년,
한 미국인이 캄보디아를 여행하다 좌판에서 녹음 테이프(빽판)을 구매했고 이를 뉴욕의 음반사를 통해 Cambodian Rock이란 앨범으로 발매하면서 주목받게 되었다.
물론 이 테이프에 수록된 곡은 20여곡 가량으로, 실제 불려진 곡에 비하면 빙산의 일각일 것이다. 킬링필드의 비극을 단적으로 보여주는 사료(史料)이지 않을 까 싶다…



