저는 이전에 스마트폰으로 게임을 하기 위해서

http://moordev.tistory.com/128

이런 물건도 만들었습니다.



사실 스마트폰은 OTG기능과 블루투스가 있기 때문에 스마트폰용 게임패드가 상당히 많이 나와있습니다.


다만, 문제는 게임패드를 지원하는 게임이 많지 않다는 겁니다. 의외로 대다수 게임들은 터치 스크린에 최적화 되어 터치스크린을 비비면서 하게 만들어져 있습니다. PC게임중에서 XBOX게임패드를 지원하지 않아 키보드로 인식시키는 것과 비슷하다고 할까요?


아무튼 그래서 Octopus란 앱이 PlayStore에 나왔습니다.

https://play.google.com/store/apps/details?id=com.chaozhuo.gameassistant&hl=ko_KR

이 앱은 중국에서 만들어진 것으로 그동안 터치패드로 인식 시키기 위해 루팅을 하거나 각종 디버그 도구를 써야했던 것을 벗어나 루팅 없이 게임 패드를 터치로 인식 시킬 수 있는 앱입니다. 지원 패드는 여러가지가 있지만 일단 XBOX패드 혹은 그 호환 패드를 추천합니다. 그리고 블루투스 연결은 인풋렉이 좀 심하더군요. 개인적으로 OTG케이블을 이용해서 유선으로 연결을 해주세요.


그럼 이것을 이용해서 이떻게 해야하는지 설명해 보겠습니다. 설명에 사용될 타깃은 Mihoyo의 붕괴3rd입니다.


오늘의 타깃은 바로 이 게임. 왼쪽에 조이스틱 터치패드가 보인다. 이것을 조이패드로 플레이 할 예정이다.

이 게임은 액션 게임이라 뭔가 마구 눌러주는 것이 많습니다. 하지만 터치스크린에 두드려봐야 그 재미가 줄어들지요. 그래서 Octopus로 이를 써먹을 예정입니다.


우선 Octopus를 안드로이드 스마트폰에 설치해야겠지요?


https://play.google.com/store/apps/details?id=com.chaozhuo.gameassistant&hl=ko_KR


이 링크로 들어가면 PlayStore가 나와서 설치할 수 있을 것입니다.

안드로이드 4.4 Kitkat 이상이면 실행이 아무 문제 없이 잘 됩니다. 현재 누가 7.0에서 문제 없이 구동됨을 확인 했습니다.


그리고 구동을 위한 게임도 함께 다운로드 합시다. 붕괴3rd는 생각보다 용량을 많이 먹는 게임입니다.


그리고 Octopus앱을 켜면...


여기 있는 PUBG는 미리 등록한 것이다. 난 없는데 뭐냐고 하는 사람은 없길 바란다.

뭔가 번역기가 심하게 돌아간 한국어가 여러분을 반길겁니다. 뭐 어쩌겠습니까 중국에서 만든 것이니 그냥 그러려니 해야지요. 여기서 "게임첨가"(?)를 누릅니다.


여기서 Octopus로 실행할 게임을 선택해서 등록합시다. 그리고 게임패드를 연결하면...


이렇게 메뉴에 추가 된것을 확인 할 수 있습니다. 그리고 위에 게임패드가 연결 되었음을 알 수 있습니다. 만약 연결 어쩌고가 없다면 그건 패드 연결이 안 된것이니 다른 패드를 쓰거나 블루투스라면 유선 연결을 시도해주시기 바랍니다. 저는 Xbox패드를 써서 Xbox패드라고 인식이 되었습니다.


그리고 Octopus앱에서 게임 아이콘을 눌러서 실행을 해봅시다.


만약 저 외계인이 보이지 않는다면 Octopus가 실행이 되지 않은 것이다. 당장 게임을 끄고 다시 Octopus에서 게임을 실행하길 바란다.

한쪽 구석에 귀여운 보라색 외계인이 떠 있는 것을 알 수 있습니다. 바로 이 외계인이 Octopus입니다. 저 외계인 버튼을 누르면 각 게임 패드의 버튼을 어디에 할당할 것인지 설정할 수 있는 창이 뜹니다.


여기서 왼쪽 스틱은 당연히 패드의 왼쪽 스틱을 말하는 것이고 이걸 길게 누르면 터치 스크린의 어디를 스틱으로 인식 시킬 것인지 나오게 됩니다. (이건 스크린샷을 찍기 힘들어서 포기 했습니다.) 저는 왼쪽 아래의 터치형 조이스틱부분에 걸쳤습니다.


그리고 손잡이라고 나온 것이 오른쪽 스틱입니다. 이 게임에서는 그냥 화면을 미는 것으로 카메라를 돌리게 됩니다. 저는 이 것을 적당히 그냥 빈 공간에 배치했습니다.


그리고 제일 중요한 버튼! 버튼은 길게 눌러 배치를 하고 조이패드의 버튼을 눌러서 이 버튼이 어떤 버튼에 대응되는지 알려주어야 합니다. 그럼 화면에 조이패드의 버튼이름이 뜨게 됩니다.


아무튼 이런 식으로 조정을 하다보면...


아이 이 자식이 터치형 조이스틱 화면을 가려버렸지만 아무튼 이 위치가 조이스틱 위치다. 버튼부는 각각의 버튼이 어떤 곳에 위치했는지 알 수 있게 잘 해놓았다.

이렇게 배치를 할 수 있습니다. 그리고 게임을 하면서 이상한 부분이나 잘못 맞춘듯한 부분은 크기를 조정하고 위치를 조정하면서 맞추면 됩니다.


이 게임은 하다보면 계속 버튼이 추가되기 때문에 Act1을 전부 클리어 한 다음에 버튼배치를 완료하는 것을 추천합니다. 적당한 연습 모드에서 배치를 하는 것이 제일 낫습니다.


P.S Octopus를 이용하면 GooglePlay로그인이 되지 않습니다. 구글 계정으로 게임을 하고자 하시는 분들은 아쉽게도 불가능합니다. Facebook이나 다른 방식 로그인을 하게끔 해주시기 바랍니다. 붕괴3rd같은 경우에는 MiHoYo계정으로 하는 것을 추천합니다.


이것으로 각종 스마트폰 게임을 패드로 할 수 있게 되었네요. TeraM 이나 위에서 보였던 PUBG모바일도 가능합니다.

,

csv파일은 굉장히 오래된 포맷입니다. Lotus 1-2-3시절부터 써오던 현재 Excel이 가지고 있는 위상을 그대로 가지고 있지요.


사실 csv포맷 자체는 단순하기 때문에 8bit마이컴에서도 쓸 수 있을 정도로 간단합니다. 하지만 그에비해 이를 이용하는 스프레드시트는 발전에 발전을 거듭하여 이에 범접할 수 없는 위치까지 왔습니다.


사실 최근에 쓰이는 스프레드시트는 csv포맷을 지금도 잘 읽어들입니다.

단, 나름 똑똑한 기능이라고 CSV파일에 숫자가 있으면 이를 Excel이나 LibreOffice Calc에서 읽어서 숫자 셀로 만들어버립니다. 편리한 기능이지요.


다만, 이건 숫자 데이터상의 CSV일때 이야기고 다른 상황이면 애매해집니다.


대표적인 경우가 다음과 같은 경우입니다.


대충 이런 형태의 CSV파일입니다.


제일 왼쪽은 16진수로 표시되고 그 다음열은 영문 문장 그 다음열은 번역된 문장으로 구성됩니다. 열과 열은 탭으로 구분되어있는 일명 TSV형태 입니다.


사실 LibreOffice의 Calc나 Excel, Google SpreadSheet 등 최근 스프레드시트는 모두 잘 읽어들입니다. 문제는.. 그놈의 숫자셀 기능이 문제를 일으킨다는 것이지요.


38e0이란 16진수가 38이 되어버렸다.

사실 그냥 숫자가 아닌 16진수이기 때문에 오인할 가능성은 있습니다. 문제는 16진수는 abcdef를 사용하는데 이를 알파벳으로 읽어버리고 이는 문자열셀로 만듭니다. 숫자만 있으면 숫자로 남기지요. 하지만 알파벳e와 숫자가 섞인 것은 자그마치 지수로 생각합니다!


그러니까 본래 38e0 이라는 16진수를 3.8 X 10 이라는 숫자로 읽어버리는 것입니다. 참고로 이를 원래의 텍스트로 되돌리지도 못합니다. 이놈의 프로그램은 CSV를 다시 읽어들인다든지 하는 것은 없더군요!


이는 Excel에도 같은 문제가 있기에 해당 문제에 대해 물어본 사람이 있습니다.

https://answers.microsoft.com/ko-kr/msoffice/forum/msoffice_excel-mso_winother-mso_2010/csv-%ED%8C%8C%EC%9D%BC-excel-open-%EC%8B%9C/7f8bcd9f-2177-4e80-b31c-0a79d61f117a


그런데 동문서답하네요. 그 이야기가 아닌 것 같은데...


그런데 불행인지 다행인지 딱 하나 Google 스프레드시트에서 이를 회피할 수 있는 방법이 있었습니다. 어차피 Google 스프레드시트에서 xls나 ods로 내보내기가 가능하니까 다른 프로그램 사용자도 이를 적용해서 변환한 다음 사용하면 아무 문제없이 쓸 수 있을 것입니다.


일단 https://docs.google.com/spreadsheets/u/0/ 일단 여기로 접속합니다. 구글 로그인은 되어있다는 가정하에요.


개인 적으로는 크롬을 사용하는 것을 추천합니다. 이러니 저러니해도 크롬이 가장 구글의 서비스를 쓰기 편하거든요.





그리고 오른쪽 아래의 빨간색 +버튼을 누릅니다. 그러면 빈 스프레드시트가 생성됩니다.


뒤에있는 데이터는 신경쓰지말자. 아까 보여줬던 그 데이터다.

파일 - 가져오기

이렇게 들어갑니다.


그리고 업로드 탭으로 들어간 뒤에 드래그 하라는 곳으로 CSV 파일을 던져 넣어서 업로드 합니다. 아니면 파란버튼을 눌러서 CSV파일을 열어도 됩니다.


그러면



파일 가져오기에 대한 옵션이 뜨는데 다른 것은 전부 기본상태로 둬도 되지만(구분 유형은 해주는 것이 그래도 좋습니다. 정 모르겠다고 하실 때만 자동 감지를 해주세요.)

"텍스트를 숫자 및 날짜로 전환" 부분을 아니오로 체크합니다. 그러면...


아까 지수로 읽히던 부분이 16진수의 텍스트로 잘 읽힙니다!


그럼 이걸 그냥 Google스프레드시트에서 바로 작업해도 되고 익숙한 다른 프로그램을 사용하고 싶으시면


파일 - 다른 이름으로 다운로드에서 xls 혹은 ods 다운로드가 가능합니다. 그러니까 이후에는 아무 문제없이 텍스트 셀로 된 파일을 열 수 있는 것입니다.


일단 구글의 프로그램으로 우회하긴 했지만 대량의 데이터가 들어간 CSV를 ods나 xls로 만들어 셀 속성을 살릴 수 있는 방법이었습니다. 이후 셀 속성을 바꾸고 싶다면 해당 프로그램에서 셀 속성을 바꾸면 그만입니다.

,

RenPy게임은 사실 허점이 많습니다. 이런 저런 잠금장치를 해봐도 결국 Python이라는 특성상 Py파일을 열 수 있고 엔진의 Py파일을 손대면 이러니저러니 해도 데이터 마이닝을 쉽게 할 수 있습니다.


사실 대다수 게임엔진은 개발자모드 혹은 콘솔진입을 허용합니다. 대표적인 게임이 퀘이크 엔진과 그의 영향을 받은 소스엔진 같은 게임 엔진입니다.


멀리 갈 것도 없이 소스엔진 게임인 half-life를 실행한 상태에서 `키(혹은~키)를 누르면 갑자기 게임 내에서 명령어 창이 뜹니다. 이게 바로 게임 엔진의 콘솔인 것이지요. 일반인들은 이 콘솔을 치트키를 치는 창 정도로 생각하지만 (sv_cheats 1 이런 것)사실은 이 명령창은 개발자의 개발 편의성을 위해 만들어진 것 입니다.


RenPy도 게임엔진이기에 개발자의 편의를 위한 기능을 내장하고 있습니다. 보통 options.rpy파일로 이를 제어하고 있습니다.


우선 매뉴얼을 볼까요?


https://www.renpy.org/doc/html/developer_tools.html

Shift+O키를 누르면 콘솔이 활성화 되고 Shift+R을 누르면 스크립트를 다시 읽어들인다고 합니다. 실시간 스크립트 수정이 필요할 때 아주 좋지요.


하지만 이것을 실제 게이머가 실수로 누르기라도 하면 난감해지겠지요? 어떻게 하는지도 잘 모를 것이고요. 이를 제어하는 일반적인 방법은 다음과 같습니다.


Renpy로 만들던 중에 Options.rpy 파일을 열면

init -1 python hide:
    config.developer = False
    config.console = False

이러한 구문이 있거나 이것과 흡사한 구문이 있습니다.


바로 개발자모드를 활성화 하는 코드입니다. 물론 실제 상용 게임에는 True를 False로 바꿔서 개발자모드 진입을 막습니다. 그리고 파일을 쉽게 읽기 어렵게 하기 위해 rpyc형태로 배포합니다. 한번 컴파일한 형태이지요. 물론 rpyc는 쉽게 디컴파일이 되지만 Python 직접 접근 구문에서 간혹 파일이 깨지기도 합니다. 그러므로 rpyc파일을 디컴파일해서 rpy로 만든 다음 수정해도 되지만 이는 별로 추천하지 않습니다.


무엇보다 Renpy는 Python이기에 위험한 작업 없이도 쉽게 됩니다.


Python은 인터프리터 언어이고 이미 있는 객체의 이름을 다른 객체로 선언하면 이전의 객체는 무시됩니다. 그리고 Renpy는 스크립트를 읽어들일때 이름 순으로 읽습니다. 즉, A로 시작되는 파일을 읽기 시작해서 z로 시작하는 파일로 끝내는 것입니다.


그렇다는 것은 Options.rpy를 읽어들여서 개발자모드가 비활성화 되었다고 한들 z로 시작되는 파일을 읽어서 활성화 되면 개발자모드가 다시 활성화 되는 것입니다.


두근두근 문예부의 경우 이를 비활성화 해 놓았습니다. 막말로 이런 플레이어를 가지고 노는 게임이 개발자모드로 진입하면 이게 게임의 일부분인지 아니면 실수인지 알 길이 없지요.(오류메시지나 블루스크린마저 게임의 일부분으로 써먹는 게임이니까요. 진짜 오류메시지와 구분이 안 갑니다.)


하지만 zzzzz.rpy라는 파일을 game폴더에 만들어 놓고 다음과 같이 적어봅시다.

init -1 python hide:
    config.developer = True
    config.console = True


이렇게 하고 게임을 실행하면...


평상시와 다를 것이 없습니다. 하지만 Shift+O키를 누르면 상황이 달라집니다.

>

어디서 많이 보지 않았나요?

닮았죠?

네 바로 Python 커맨드 창입니다. 직접 여기서 명령을 내려서 제어를 할 수 있습니다.

물론 Python구문뿐 아니라 RenPy모듈도 이미 import 되어 있기에 RenPy명령어도 먹힙니다.


그러므로 개발자 콘솔에서 탈출을 하려면 Python과 똑같이

exit

이 명령을 하면 됩니다.


그럼 한번 치트를 시도해봅시다.


jump credits


이러면 바로 credits라고 정의된 부분으로 바로 점프합니다. (타이틀에서는 먹히지 않습니다. 일단 새 게임을 눌러서 게임이 시작되야 먹힙니다. credits 레이블이 나중에 만들어지기 때문입니다.)


그럼 바로 엔딩 보는 겁니다. 물론 CG는 회수 된 부분 까지만 나오게 됩니다. Monika가 놀라서 뒤집어질 일이 일어난 것이지요. (이래서 데이터 마이닝을 하는 사람은 미스테리 게임을 못합니다. - 언더테일 제작자 왈)


이런 jump기능은 특정 label로 바로 넘어가기 위한 구문으로 실제로 스크립트에 써먹는 구문입니다. 이걸 명령을 때우는 겁니다. Python개발 할 때랑 비슷하지요.


그리고 넘기기가 안 먹히는 구간에서 콘솔을 열고 config.fast_skipping=True를 다시 때려버리면 마구 넘어갑니다. 이 외에도 많은 부분을 뜯어 볼 수 있습니다.


물론 이걸 남용하면 Monika가 그랬던 것처럼 게임이 망가집니다. 주의하세요!

,

더빙패치 :

https://drive.google.com/file/d/1P29VPtgWCW0fsQ-LfR1NrCKzmO-TSDs5/view


이젠 하다하다 한국어 더빙까지 입혔습니다.


유튜브에서 림뽐(https://www.youtube.com/watch?v=516BSRBQS7k)이란 분이 두근두근 문예부의 엔딩을 직접 불러서 올리셨더군요. 이 분말고도 다른 분도 많기는 했지만 한글패치에서 번역된 것과 다르게 직접 개사를 하셔서 상당히 가사 전달력이 좋았습니다.


그래서 혹시나 하고 패치를 만들어도 되는지 물어봤는데

바로 허락해주시더군요.


그래서 냉큼 유튜브의 영상의 음성 편집한 다음 게임에 적용했습니다.


편집은 Audacity를 이용했습니다.

필요한 부분만큼 뚝뚝 자른 다음 잇고 붙이고 잘라낸 다음 효과를 적용해서 마무리 지었습니다. 그리고 (싸구려 헤드셋을 끼고)볼륨 밸런싱 작업도 했습니다.


그 결과...




편집하고 개선하면서 개사되어 바뀐 부분을 수정하고 한국어로 더빙되었기에 필요 없어진 초반에 플레이어를 부르는 부분의 자막을 삭제했습니다. 물론 엔딩곡 부분도 없앨 수 있었지만 엔딩곡은 그래도 가사가 나오는 것이 좋겠다고 생각해서 한글패치에서 만들어진 부분을 살렸습니다.

겸사겸사 스크립트 수정하면서 보컬분의 이름도 추가하고 제 이름도 넣어놓고(...) 진엔딩도 같이 봤습니다. (사실은 개발자 모드로 들어가서 모니카와 싸웠습니다.)



패치 방법은

https://drive.google.com/file/d/1P29VPtgWCW0fsQ-LfR1NrCKzmO-TSDs5/view


위의 링크로 들어가신다음

오른쪽 우의 다운로드 버튼을 눌러서 파일을 다운로드 받으신 다음 한글패치 하듯이 압축을 풀어 그냥 게임 설치된 폴더에 넣어주시면 됩니다. 이왕이면 한글패치 배포사이트에서 같이 배포했으면 하는데 이걸 트위터로 알려야 할지 아니면 그냥 묻어버려야 할지 그것을 잘 모르겠네요.


대사를 입히는 더빙까지는...시간이 오래 걸리겠지요?

,

RenPy로 만들어진 게임은 기본 언어가 Python이라서 성능이 생각보다 많이 좋지 못합니다.


심지어 아직도 Python2.7을 사용하기 때문에 3.x에서 해결된 GIL이슈가 아직도 현재 진행형입니다. 고작 2D게임 주제에 무슨 성능 이슈냐! 라고 하시는 분도 있을 것입니다. 그런데 나름 2D게임에서도 3D 효과를 쓰거나 투명도를 잔뜩 쓰는 경우 성능 이슈를 겪을 수 있습니다. 그리고 빠른 프레임을 원한다면 더 하지요.


이러한 RenPy로 만들어진 게임은 대략 다음과 같습니다.


Long Live The Queen

두근두근 문예부

아날로그


등등


일단 RenPy게임에서 성능 이슈라긴 뭐하지만 묘한 성능 이슈를 여기서 겪었습니다.


..JUST MONICA

뒷 배경을 보면 알파값을 심하게 써서 살짝 버벅거림이 눈에 띄더군요. 이유를 잘 몰랐는데 아래의 페이지에서 원인을 알 수 있었습니다.


https://www.renpy.org/doc/html/display_problems.html


아마도 OpenGL설정이 제대로 되지 않아서 성능 이슈가 생긴 듯 합니다. 그럴 때는 여기에 나온 대로 Shift+G를 누른 다음


여기서 Force OpenGL Renderer를 선택하시면 됩니다. 강제로 OpenGL로 돌아가면서 성능 이슈가 조금이나마 나을 겁니다. 전 어찌된 영문인지 Software로 잠시 들어갔었던 듯 합니다.


만약 LLVM Pipe 등의 Software OpenGL 렌더러를 쓰신다면 반대로 Force Software Renderer를 쓰시면 조금이나마 나아집니다. 그런데 이런 경우는 요즘 많이 없을 듯 하네요.


참고로 Windows에서는 DirectX 렌더링이 뜨기도 하는데 이걸 쓰면 성능이 더 나아지기도 합니다. 그런데 Windows에서는 어눌한 해킹드라이버를 쓴다거나 하지 않는다면 OpenGL 2.0로 굴러가지 못하는 경우가 없습니다. 그냥 일반적으로 기본 설정으로 하다가 이상하다 싶으면 강제 설정을 하시면 됩니다.

,

Blender는 무료 3D 모델링 툴로 Autodesk사의 3DS MAX, Maya와 함께 3대 모델링 및 애니메이터로 유명합니다. 다른 두 도구가 더럽게 비싼데 Blender는 그정도의 기능을 무료로 제공하니 참 고마운 도구라고 할 수 있겠습니다.


여러모로 Gimp와 Photoshop과의 관계와 비슷하다고 할까요? 물론 Blender도 한계가 있습니다. 일단 기본 렌더러가 썩 좋지 않다는 문제가 있고 Python을 플러그인으로 활용하는데 Python의 단점 중 하나인 느린 성능이 발목을 잡습니다. 그리고 UI가 좀 난잡하다고 하더군요. (저는 잘 모르겠습니다.)


그런데 이 Blender가 한동안은 문제가 없더니 이번에 커널을 업그레이드 하고나서 사용하기 어려운 버그가 발생했습니다.


보시는게 더 나을 것 같네요.


카메라 회전을 하거나 기능을 쓰려고 할 때마다 화면이 깜빡깜빡 거리면서 이전의 메뉴가 뜨거나 UI가 왔다갔다 하는 모습이 뜹니다.


특히 아래쪽을 보시면 똑같은 메뉴가 두 줄이 보이는데 사실은 같은 메뉴가 지속적으로 깜빡거리면서 위치가 바뀌는 것입니다.


이래가지곤 작업이 불가능합니다. 단축키만으로 작업을 한다면 그래도 어찌하곘는데 사실상 불가능하지요.


해결 방법은 다음과 같습니다.


어떻게든 깜빡이는 UI를 뚫고 File-User Preference에 들어갑니다.

깜빡거리는 것이 너무 심하면 Ctrl+Alt+U를 눌러도 됩니다. 이쪽이 더 빠르겠네요.


그 다음 SYSTEM 탭에서 Window Draw Mathod 부분을 찾습니다. 여기서 Automatic이라 되어있는데 화면을 그리는 방법을 지가 알아서 하겠다는 것이지요. 근데 지가 알아서 하는게 이 모양이니 수동으로 바꿔주면 됩니다.


 

Automatic을 Triple Buffer로 고치고 아래에 새로 생긴 Save User Settings를 눌러주면 UI의 깜빡거림이 사라집니다!


이는 Windows에서도 통하고 Linux에서도 통합니다. Blender 쓰시는 분들 중에서 드라이버 업데이트나 커널 업데이트 등으로 UI가 고통스러워진 분들이라면 한번 확인해 보세요!

,

이전에 RWBY:Grimm Ecllipse란 게임을 우분투에서 실행 하는 방법에 대해 공개한 적이 있었습니다.

http://moordev.tistory.com/221


이 게임이 일단 영어권에서 만들어진 만큼 언어에 문제가 있었는데 일본어, 중국어 번체, 스페인어 등의 다양한 언어를 지원하더군요. 문제는.. 한국어는 없습니다.


그렇다고 괜찮은 이 게임을 그냥 외국어로만 하기는 좀 그렇더군요. 이 참에 조금 손을 보기로 했습니다.


우선 게임 분석을 해야겠지요. 스팀의 설치된 폴더에 가면 rwby_ge_Data란 폴더가 있습니다. 이 쪽을 들여다보면 assets란 파일들이 주르륵 나와있습니다.


이건 보통 Unity3D 엔진으로 만들었다는 증거가 됩니다. 그렇다면 Unity3D게임의 한글화 기법을 적용하면 되겠군요.


아쉽지만 Unity3D 게임은 한글화가 쉽지 않습니다.

우선 assets파일을 풀어내는 프로그램은 존재합니다. 다시 패킹도 가능하고요. UnityEX란 프로그램인데

UnityEX.rar

이것으로 assets파일을 풀어내고 다시 합칠 수 있습니다.


하지만 풀어냈다고 우리가 아는 그런 포맷이 튀어나오는 것이 아니라 확장자가 *.-숫자 형태로 된 파일이 튀어나옵니다.


물론 이미지는 dds포맷으로 풀 수 있고 일부 텍스트는 txt로 나오기도 합니다.(NGUI같은 라이브러리는 txt를 쓴다고 합니다. 하지만 이 라이브러리를 썼다는 보장이 없다면...) 그럼... 노가다 해서 알아내야지요...


그래서 알아낸 것이 아래와 같습니다.


sharedassets0.assets

resources.resource


이 두 파일이 핵심입니다.


그 중에서 sharedassets0.assets는 안에 TTF 파일을 가지고 있어서 폰트 수정을 위해 필요한 파일이고 resources.resource 파일에는 로컬라이징용 대사파일이 있습니다.


UnityEX로 해당 파일을 풀면 어마어마한 양이 튀어나오는데 sharedassets0.assets에서는 TTF파일만 찾아서 우리가 아는 한글폰트(나눔고딕이나 서울남산체, NotoSans 등...)으로 파일을 바꿔치기 해주면 해당 파일이 할 일은 끝납니다. 그리고 Import all file 버튼을 누르면 한글폰트가 담긴 파일이 나옵니다.


문제는...


resources.resource에 들어있는 스크립트입니다.


이걸 알아내기까지 좀 노가다했습니다.


옆의 사본은 무시. 그냥 내가 작업하다 날려먹을까봐 백업한 것.

resources_00001.-59 이 파일이 핵심입니다.

사실 여기서 제일 스크립트 파일 중에서는 용량이 크거든요. 그래서 헥스에디터로 열어봤더니 다행히도 이것이 Localize 어쩌고 하는 파일이더군요.


같이 들어있는 ARIAL.ttf는 무시해도 좋지만 혹시나 해서 이것도 나눔고딕으로 바꿔치기 했습니다. (ARIAL하고 나눔고딕이 제일 흡사하더군요.)


이걸 헥스에디터로 열고


한글로 덮은 부분은 본래 일본어가 있던 부분

인코딩을 UTF-8로 해 놓으니 온갖 언어가 다 보입니다.


여기서 전 일본어 부분을 덮기로 했습니다. 왜냐하면 UTF-8의 형태 때문인데 ASCII코드와의 호환을 위해 기존 ASCII코드는 1바이트만 차지하지만 나머지 글자는 3바이트를 차지하는 구조로 한글은 UTF-8에서 3바이트를 차지합니다. 그렇다는 것은 영어부분을 덮으면 본래 대사 길이의 1/3만 쓸 수밖에 없지만 일본어는 기존 대사 길이를 거의 다 쓸 수 있습니다. 게다가 특수문자는 ASCII의 반각(1바이트)을 거의 이용하는 한글과 달리 일본어는 전각(3바이트...)를 쓰곤 해서 번역된 문구를 쓸 공간이 매우 넉넉합니다.


이렇게 헥스에디터에서 노가다 작업을 하고 다시 UnityEX에서 패킹을 한 다음 한 번 테스트를 해봤습니다.


일본어 부분을 덮었기에 설정에서 일본어로 설정을 했습니다. 아직 번역이 안 된 부분은 일본어로 나오기에(덕분에 무슨 말인지...) 문제가 있지만 번역을 한 부분은 한국어로 잘 나오네요.


폰트는 서울남산체, 본고딕(NotoSans CJK)을 썼습니다. 헥스에디터로 노가다하면 충분히 한글화가 가능하겠네요.

,


VNC를 들어보신 적이 있으신가요?


VNC에 관해서는 위키백과에 이렇게 나와있군요.

VNC(Virtual Network Computing, 가상 네트워크 컴퓨팅)는 컴퓨터 환경에서 RFB 프로토콜을 이용하여 원격으로 다른 컴퓨터를 제어하는 그래픽 데스크톱 공유 시스템이다. 자판마우스 이벤트를 한 컴퓨터에서 다른 컴퓨터로 전송시켜서 네트워크를 거쳐 그래픽 화면을 갱신하는 방식을 제공한다.

VNC와 RFB는 미국과 다른 국가들에서 RealVNC Ltd.의 등록 상표이다

https://ko.wikipedia.org/wiki/VNC


쉽게 말해서 그냥 원격에서 컴퓨터를 조작하기 위한 수많은 기술중 하나인겁니다.


마이크로소프트는 여기에 대응하는 RDP라는 프로토콜을 만들었고 우리가 익히 아는 TeamViewer나 SplashTop같은 프로그램도 RFB를 변형하거나 자체적으로 프로토콜을 만들어서 서비스합니다.


보통 사람들에겐 VNC아이콘보다 이 아이콘이 더 친숙할지도 모르겠다. 이 아이콘의 정체는 Teamviewer의 아이콘



하지만 Teamviewer든 SplashTop이든 VNC든 RDP든 모두 공통적인 문제가 있는데 바로 반응속도가 더럽게 느리다는 것입니다.


VNC를 써본 사람들은 하나같이 이야기하는 것이 마우스 클릭하고 1초 프로그램 실행되는 것 보는데 1초 실수로 클릭을 하면 딜레이가 걸려서 한참뒤에 반응이 오니 관리하는 것 외에는 영 쓸만한 것이 못 된다고 하더군요.


그게 어쩔 수 없던것이 VNC가 사용하는 RFB프로토콜은 JPG로 캡쳐한뒤에 네크워크로 보내고 이를 다시 화면에 띄우는 옛날 웹캡이 쓰던 MJPEG방식과 거의 흡사한 방식을 사용합니다. 문제는 JPG인코딩이 CPU를 통해서 하기 때문에 그렇게 빠르지 않고 이를 디코딩하는 것도 사실 그렇게 빠르지 않다는 것입니다.


JPG가 빠르지 않다고? 하시는 분들은 DSLR에서 RAW이미지를 JPG로 인코딩할 때 생각보다 저장시간이 걸린다는 것을 생각해주셔야 합니다. (사진쪽 종사자들은 포토샵에서 결과물 뽑아낼 때 생각보다 시간이 걸린다는 것을 알고있지요. 이쪽 종사자들은 JPG로 뽑지 않고 보통 비손실 압축인 PNG로 뽑긴합니다만...) 우리가 흔히 사용하는 모니터가 60Hz인 점을 생각해주세요. 제가 위에서 말한 JPG인코딩-디코딩이 최소 1/60초안에 끝나야 합니다. 사실 요즘 CPU에 640x480정도의 해상도라면 그 정도는 충분히 가능하지만 데스크탑의 해상도가 점점 더 좋아지는 관계로 VNC의 속도는 예나지금이나 큰 차이가 나지를 않습니다. 그래서 TurboVNC라는 libjpeg-turbo를 사용하는 서버와 클라이언트가 나왔지만 서버와 클라이언트 둘 다 TurboVNC를 사용하지 않으면 다른 것이 하나도 없는 상황이 됩니다.


이런 복잡한 상황을 한큐에 해결할 수 있는 물건이 오픈소스로 공개되었으니 그것이 바로 JSMPEG-VNC입니다.

https://github.com/phoboslab/jsmpeg-vnc


어느정도 성능인지는 한번 보시지요.



Mac에서 Windows용 게임을 하고 있습니다. 심지어 클라이언트도 따로 없이 브라우저를 이용합니다.


그럼 jsmpeg는 뭔가 했더니 같은 곳에서 만들어낸 Javascript기반 MPEG동영상 재생 웹소켓입니다. 쉽게말해서 별도의 코덱따윈 갖다버리고 자바스크립트로 직접 MPEG를 디코딩하는 수준에 이른 것이지요. 요즘 브라우저는 asm.js를 위시해서 자바스크립트를 네이티브로 컴파일해서 사용하니까 직접 웹소켓으로 작업이 가능해진 것입니다.


예상도 못한 수준의 물건이 나왔는데요. 크기도 엄청 작은데 수준은 장난이 아닙니다. 서버 실행도 간단한데요.

jsmpeg-vnc.exe "desktop"


이렇게 하면 데스크탑 전체가 실행되며


jsmpeg-vnc.exe -s 크기 "cursor"


이렇게 하면 마우스를 따라 화면이 캡쳐됩니다.


동영상 마지막에보면 스마트폰으로 조작을 하는 모습을 볼 수 있는데 하이브리드 앱형태로 만들거나 웹페이지를 모바일에 맞게 만들어서 사용하면 똑같이 만들어 쓸 수 있습니다. 예전에 제가 소개했던 Liquidsky와 비슷하게 쓸 수 있는 것이지요.


그런데 현재 링크에 걸린 서버프로그램은 오직 Windows만 지원합니다. 하지만 이런 좋은 원격제어 프로그램을 Windows에서만 쓰긴 아깝지요. Linux도 원격제어 수요는 상당히 많기 때문에(보통 SSH와 터미널 작업으로 때우기는 하지만) 이쪽은 없나 살펴봤습니다.


있네요.

https://github.com/thesauri/jsmpeg-vnc-linux


Cusor를 따라가는 기능은 아직 포팅이 되지 않았지만 사실 그건 중요하지 않고 desktop 전체를 캡쳐하는 것은 포팅이 되었다고 합니다.


Windows의 그래픽 API를 X11로 포팅했다고 합니다.


이런 것을 찾아냈으니 한 번 해봐야겠는데요.


....그건 자고 일어나서 주말에 한번 해보지요.


build-essential

libavcodec-dev

libavutil-dev

libx11-dev

zlib1g-dev

libswscale-dev

libwebsockets-dev

libxtst-dev


이 패키지가 필요한 듯 합니다. 해당 프로젝트 관리자가 설명이 좀 부족합니다...


컴파일이 제대로 안 되네요...


일단 메일을 날려봐야겠습니다.


,

채팅봇이란 물건이 있습니다. 일종의 인공지능 대화상대인데 특정 대화방(채팅룸)에서 특정 키워드가 나오면 해당 키워드에 맞는 대답을 해주는 물건입니다.


이미 잘 이용되는 물건으로는 간단하게는 심심이가 있고 Youtube와 TwitchTV에서 사용하는 NightBot, MooBot등이 있고 인공지능 대화용으로 만들어진 MS의 테이(Tay)나 구글의 채팅봇도 있습니다. 카카오톡을 통해 알려주는 채팅봇도 있습니다.


사실 인공지능까지는 아니더라도 간단하게 유튜브나 TwitchTV등에서 방송하는 사람들을 도와주는 봇들은 이미 많이 쓰이고 있지요. 이들의 조상은 IRC에 플러그인 방식으로 사용되어서 해당 채팅방에서 물을 흐리는 몇몇 또라이들을 추방하거나 욕설등을 가려주는 등 IRC의 심판으로 쓰였던 그런 물건이 시초라고 보고 있습니다. 여기에 몇가지 키워드를 더 추가해서 특정 키워드가 나오면 대신 대답을 해주거나 간단한 대화기능을 넣는 등 발전을 했고 이후 지금의 시리같은 인공지능 기술과 음성인식 기술이 접목되어 굉장히 편리해졌지요.


지금 많이 이용되는 채팅봇 혹은 전자비서의 조상은 IRC의 플러그인들로 부터 시작되었다고 본다. 사진은 IRC클라이언트 중 제일 유명한 mIRC의 로고



이런 쪽에 제가 관심을 갖게 된 원인은 한 때 유명했지만 지금은 그저그런 Twitch Plays Pokemon때문이었습니다.

Twitch Plays Pokemon은 말 그대로 TwitchTV방송의 채팅을 통해 직접 게임을 움직여서 게임을 하는 특이한 방송이었습니다. 지금은 시들하지만 처음에는 방송을 보려는 사람들로 붐볐었습니다. 문제는 그만큼 컨트롤이 산으로 갔다는 것이지만...


당시 이슈가 되었던 Twitch Plays Pokemon 방송. 사공들의 수많은 채팅들을 봇이 읽어들여서 게임을 하는 그런 방송이었다.


해당 방송의 방식은 아주 간단합니다. 사람들이 채팅방에 특정 키워드(right, left, up, down, a, b, start, select 등)을 치면 게임과 함께 연동되는 봇이 해당 명령에 맞는 기능을 게임에 전달하여 움직이게 하는 것입니다.


이것이 가능했던 이유는 TwitchTV의 채팅이 기존의 IRC를 그대로 이용하기 때문이었습니다. TwitchTV는 채팅방식을 공개된 IRC프로토콜을 이용하되 약간의 보안을 적용해서 사용했기 때문에(그나마 그 보안도 알려진 방식입니다.) 기존의 IRC봇을 만들기 쉬웠습니다. 실제로 여기에 쓰인 플러그인과 비슷하게 구현된 소스코드도 공개되어 있지요.


https://github.com/hzoo/TwitchPlaysX

https://github.com/sunshinekitty/TwitchPlaysPokemon


위 github가 해당 플러그인을 구현한 소스코드입니다. IRC를 기반으로 키보드 혹은 마우스 명령을 내릴 수 있게 되어있지요.


채팅을 할 수 있는 방송은 TwitchTV만 있는 것은 아니지요. Twitch외에도 Youtube가 있고 국내에서는 DaumTV팟도 있습니다. (아프리카TV는 너무 구식이기 때문에 예외로 합시다.)


1. 실시간 방송이 가능하고

2. 동시에 채팅도 할 수 있으며

3. 여러명이 달려들어도 서버상태가 괜찮다면

이런 류의 봇을 직접 만들 수 있지 않을까?


라는 생각이 들더군요.


네, 사실은 안일한 생각이었습니다. 대다수 서비스는 IRC기반이 아닌 다른 방식을 사용하고 있었고 해당 프로토콜을 알아내는 것은 굉장히 어려웠습니다. TwitchTV가 알려진 방식을 사용한 특이 케이스였던 것입니다.


그런데 Youtube는 API를 통해 채팅봇을 만들 수 있게끔 공개가 되어있었고 실제로 NightBot이란 봇이 이미 만들어져 있었습니다. 즉, Youtube는 충분히 이러한 봇제작이 가능하다는 의미였지요.

https://developers.google.com/youtube/v3/live/docs/liveChatMessages/list


"그래! 그럼 나도 ChatBot이란 것을 한 번 만들어보자!"라는 생각으로 시작을 해봤습니다.


결과는...당연하게도 참패.


YoutubeAPI는 생각보다 요구하는 것이 너무 많았습니다. 저는 그저 채팅 내용을 읽어들인다음 키워드분석을 하는 것을 원했는데 해당 채팅방의 전반적인 것을 다 API로 세팅하게 만들어져 있더군요. 전반적인 IRC봇이 그렇기는 하지만 위의 TwitchPlaysPokemon의 소스코드는 그렇게 복잡하게 만들어지지는 않았습니다.


즉, 예상을 뛰어넘는 수준의 설정을 요구했던 것입니다. 


처음에는 그냥 장난으로 시작한 것인데 이런식으로 흘러가다간 올해안에 ChatBot은 커녕 비슷한 것도 만들기 어렵겠다는 생각이 들었습니다. 하지만 세상은 넓고 꼼수는 많습니다. 그리고 그 꼼수는 간단한 아이디어부터 시작되었습니다.


"Youtube나 TwitchTV나 웹페이지에서 채팅이 가능하다."


특히 Youtube는 어딘가의 방송시스템 처럼 클라이언트를 설치하지 않고 웹브라우저에서 볼 수 있게 만들어져 있습니다. 그렇다는 것은 웹페이지 분석을 하면 채팅의 키워드를 읽을 수 있다는 의미입니다!


Youtube는 편의를 위해 채팅창만 따로 빼서 쓸 수 있게 할 수 있는데 즉, 채팅페이지를 따로 찾을 필요없이 해당 채팅창만 분석, 확인하면 채팅창으로 올라오는 키워드를 읽을 수 있다는 의미가 됩니다. 게다가 해당 페이지의 주소를 긁어내는 것도 어려운 일이 아닙니다. 당장 위 스크린샷만 봐도 창 주소를 바로 읽을 수 있게 되어있습니다. 그리고 저 페이지주소는 어떤 웹브라우저를 사용해도 똑같습니다. (어딘가의 무언가와 다르게 말입니다.)


그렇다면 소스보기를 통해 채팅창의 코드 분석이 가능하다는 의미이므로 어떤 Element(요소)가 채팅 메시지 요소인지 확인하는 작업이 필요했습니다. 해당 작업에는 크롬의 개발자도구가 유용하게 쓰였습니다. 분석 시작 15분만에 코드를 찾아냈으니까요. 하지만 이후는 노가다로 귀결된 것은 어쩔 수 없었습니다.


채팅 메시지는 해당 페이지에서 content라는 이름으로 찾으면 (아이디)+(메시지)형태의 리스트로 되어있었고 author-name이라는 이름으로 찾으면 채팅창에 떠있는 아이디를 리스트형태로 찾을 수 있었습니다. 그렇다면 두 리스트를 이용해서 메시지만 뽑아낼 수 있다는 의미이기도 하지요.


그런데 채팅은 실시간으로 이루어지는데 새로운 메시지는 어떻게 아냐고요? 위 작업을 그냥 계속 하면 됩니다. 그리고 이전 리스트와 새 리스트를 비교한 다음 추가된 것만 뽑으면 되는 것이지요.


그런데 이걸 만들까요? Selenium이란 우리가 실제로 사용하는 웹브라우저에 덧붙여서 사용하는 웹 자동화 모듈이 있는데 이것을 Youtube채팅페이지를 띄워서 해당 요소를 찾으면 되는 것입니다.


(http://www.seleniumhq.org/projects/webdriver/)


Chrome, Firefox, Safari 등 유명 웹브라우저와 함께 PhantomJS란 따로 UI를 제공하지 않지만 WEB접속을 해주는 Selenium을 위한 웹브라우징 엔진도 지원합니다. 저는 Firefox에 Selenium을 설치한 후 읽어들이기로 했습니다.


그리고 문장처리는 Python으로 처리를 했습니다. Selenium의 예제는 JAVA로 되어있지만 Python이 문자열 처리는 월등하기 때문에(대신 느린것은 어쩔 수 없지요.) Python Wrapper를 찾았더니 있더군요. pip로 쉽게 설치 할 수 있었습니다.


sudo pip install selenium

혹은

sudo pip3 install selenium


만약 pip(Python2)나 pip3(Python3)가 없으시면 우분투의경우 저장소에서 설치할 수 있습니다. 아무래도 2017년 현재에는 Python3가 낫겠지요.


그리고 WebDriver를 설치해야 하는데

Firefox는 https://github.com/mozilla/geckodriver/releases

여기서 geckodriver를

Chrome은 https://sites.google.com/a/chromium.org/chromedriver/

여기서 파일을 다운로드 받은 다음 /usr/bin에 넣어주시면 알아서 활성화가 됩니다.

PhantomJS는 그냥 PhantomJS를 저장소에서 설치하시면 알아서 활성화가 되므로 상관이 없습니다.


from selenium import webdriver
driver = webdriver.Firefox()
#Firefox가 싫음 PanthomJS나 Chrome도 상관없다.

#Youtube chat room's page URL
driver.get(' 유튜브 채팅창 URL')
driver.implicitly_wait(10) 


요렇게 코드를 작성하고 실행하면 웹브라우저가 하나 실행되면서 Webdriver를 통해 자동화가 가능하게 됩니다.


위 코드 다음

id_msg = driver.find_elements_by_xpath('//*[@id="content"]')
id_l = driver.find_elements_by_xpath('//*[@id="author-name"]')


이렇게 하면 id_msg란 리스트에는 content항목인 요소들이 들어가고 id_l이란 리스트에는 author-name이란 이름의 요소들이 들어가게 됩니다. xpath란 것은 W3C에서 요소들을 쉽게 쓸 수있도록 XML형태로 만든 규약인데 자세한 것은 따로 찾아보시길 추천드립니다.


그리고

print (id_msg[0].text)

print (id_l[0].text)

이렇게 하시면 해당 채팅창의 제일 첫 메시지의 아이디와 문장이 콘솔창에 뜨는 것을 알 수 있습니다!!!!


즉, 채팅창의 메시지를 읽어들이는데에 성공한 것이지요. 그렇다면 문자열을 조작하고 Tokenizer를 통해 단어별로 자른다음 키워드를 분석하면 봇을 충분히 만들 수 있겠지요?


일단 오늘은 Youtube의 채팅창의 내용을 읽어들이는 것까지만 하고 나머지는 넘어가도록 하겠습니다.


다음 예시는 위의 방식을 이용해서 Youtube의 채팅창의 내용을 콘솔창에 계속 띄우는 소스코드입니다.


https://colorscripter.com/s/h7ME3n7

,

라즈베리파이나 오래된 PC를 에뮬레이터 머신으로 만들어줄 수 있는 Lakka란 프로젝트가 있습니다. RetroArch란 온갖 게임콘솔과 아케이드를 에뮬레이터 해주는 프로그램을 이용한 것인데요. 다른 것은 모두 배제하고 최소한의 OS(Libreelec 기반)와 RetroArch만 올려서 만든 배포판입니다.



http://www.lakka.tv/


2017년 현재 RetroArch는 상당한 수준의 인터페이스와 엄청난 지원 범위를 자랑하고 있어서 오래된 PC나 저렴한 라즈베리파이에 게임패드를 연결한 다음 Lakka만 올려서 게임기로 만드는 경우가 늘고 있습니다.




그런데말입니다.

RetroArch의 PSP코어(통칭 lr-ppsspp라고 합니다.)가 옵션이 상당히 부실합니다. PPSSPP의 소스코드를 이용해서 에뮬레이팅은 상당수준이지만 PPSSPP자체가 아직 완전하지 않아서 게임마다 설정을 다르게 줘야하고 이런 저런 삽질을 동원해야하는데 RetroArch는 다른 콘솔머신도 지원해야하다보니 크게 신경을 못 쓰는 것이 현실입니다.


즉, 통합 에뮬레이터로는 훌륭하지만 특정 기기의 성능은 그리 좋지 못하다는 의미지요. 특히 PSP의 명작이라 할 수 있는 DJMAX시리즈의 경우에는 링크디스크나 IO문제로 PPSSPP의 많은 설정과 기능을 요구합니다. 하지만 RetroArch의 PSP코어에는 이런 기능이 없습니다. 그래서 RetroArch의 PSP게임을 굴리면 완벽하게 돌아가지가 않지요. 게다가 RetroArch는 Adhoc을 이용한 온라인 기능도 부실합니다.


그래서 생각한것이 아에 RetroArch같은 통합에뮬레이터 시스템이 아닌 PPSSPP만 올려서 PSP 전용콘솔머신을 하나 만들자!라고 생각했습니다. 그래서 삽질을 시작했습니다. PSP게임외에 다른 콘솔은 Lakka에서도 아무 문제없이 굴러가니까 그 쪽은 그냥 Lakka를 쓰면 될테니까요.


PPSSPP 그 자체도 인터페이스는 상당히 편리하게 되어있고 패드만으로도 모든 옵션을 선택할 수 있게 잘 만들어져 있습니다.


다른 에뮬레이터와 다르게 상당히 예쁘게 잘 만들어져 있다. 디자인이 현대적이라고 해야할까.


그래서 이참에 백라이트 나간 노트북을 부셔서(!) 콘솔머신을 하나 만들기로 했습니다.

그래서 다음과 같은 계획을 하나 짰습니다.



1. 하드웨어는 백라이트 나간 오래된 노트북으로 하고 이것을 TV에 연결해서 쓸 수 있도록 한다.


2. 게임은 PPSSPP만을 올려서 PSP게임만 지원하게 한다.


3. 컨트롤러는 오로지 게임패드로 (다행히 PPSSPP가 게임패드만으로 굴릴 수 있다.)


4. FTP서버를 하나 만들어서 게임을 FTP로 전송할 수 있게 한다. (SMB도 생각했지만 FTP가 더 안정적이었습니다.


5. 라이브모드만 지원하되 Persistent모드로 만들어서 넣자. (설정 저장을 위해)


6. 어차피 나만 쓸 거 보안은 신경 끄자.



여기서 제일 중요하게 여긴것은 1번과 6번입니다. 사실 보안까지 신경쓰기 시작하면 취미로 하는 것이 일거리가 되기 때문에 처음부터 신경을 껐습니다.


세로로 세우기 위해서 다이소 도마꽂이에 꽂았는데 딱 맞는다. 도마꽂이가 랩톱 세우는데 최고였다.


그렇게 오늘 저의 게임기가 되어주실 노트북은 인텔 코어2듀오 콘로 2.4GHz 메모리 2GB 저장용량 250GB의 제품입니다. GPU는 자그마치 인텔 내장 그래픽. 백라이트가 나가서 액정을 그냥 떼버렸고 안테나는 외부에 노출 시켰습니다.


어차피 TV뒤쪽 공간에 밀어넣을 예정이니 모양은 상관없습니다.


그리고 상세한 제작 과정은 다음과 같습니다.


1. OS는 Customize(https://github.com/kamilion/customizer) 로 우분투 Mini-remix(http://www.ubuntu-mini-remix.org/)를 기반으로 한다.


1.1 Customizer를 리눅스 PC에 설치한다. (따로 설명하지 않겠습니다.)

1.2 Customizer-gui에서 ISO선택을 누르고 우분투 Mini-remix이미지를 선택한다.


1.3 소스 수정버튼을 누르고 한국서버를 선택한 다음 multiverse와 universe를 추가한다.


1.4 세팅 탭에서 위치(?)를 ko_KR.UTF8을 선택해서 한국어기반을 갖출 수 있도록 한다.

1.5 나머지는 터미널 버튼을 누른다음 명령으로 때운다. (sudo apt-get update 등등)


2. Customizer에서의 터미널 창에서 최대한 다른 것은 배제해야 하므로 다음 명령으로 기반만 갖춘다.


sudo apt-get install xorg alsa alsa-utils mesa-utils jstest-gtk fonts-nanum

sudo apt-get install --no-install-recommeds pulseaudio pulseaudio-utils slim wicd networkmanager openbox


이렇게 함으로서

소리가 나고(pulseaudio, alsa)

그래픽가속을 하고(xorg mesa)

네트워크에 접속을하며(wicd networkmanager)

최소한의 GUI세션에 접속을 할 수 있게 됩니다.(slim openbox)


물론 기반만 갖추었고 설정은 하나~~~도 안 했기 때문에 건드릴 것이 많지요.


3. PPSSPP는 그냥 PPA를 등록한다음 설치

sudo add-apt-repository ppa:ppsspp/stable
sudo apt-get update

sudo apt-get install ppsspp-qt


add-apt-repository에서 에러가 날 텐데요. PPA등록전에

sudo apt-get install python-software-properties software-properties-common


이 명령을 먼저 내려서 PPA등록용 스크립트들을 설치하도록 합시다. 왠지 쓸데없는 것이 설치된 듯하지만 귀찮은 것보단 이게 더 낫습니다.


4. 게임 이미지 전송용 FTP서버를 설치한다. 어떤 것을 설치해도 상관은 없지만 vsFTPD를 설치하겠습니다.


sudo apt-get install vsftpd


4.1 vsFTPd 설정

 sudo nano /etc/vsftpd.conf


다른 것은 기본값 혹은 마음대로 해도 되는데


write_enable=YES


이 옵션 만큼은 무조건 이렇게 해놓는다.


4.2 자신 있으면 SAMBA를 설치해도 되는데 나는 귀찮으니 PASS


5. slim을 설정해서 자동 로그온이 되도록 하자. slim은 데스크톱 관리자로 우분투의 lightdm보다 더 가볍고 세션 관리가 쉽기 때문에 선택


sudo nano /etc/slim.conf


제일 아래줄에 이렇게 적는다.

auto_login    yes
default_user  ubuntu


여기서 defulat_user는 Customizer에서 설정한 라이브유저 이름이다.(기본이 ubuntu라 그냥 여기서도 ubuntu)


6. openbox의 autostart를 만들어서 PPSSPP와 네트워크 관리자 등이 자동으로 실행되게 만들자.


sudo nano /etc/skel/.config/openbox/autostart


여기에 쉘스크립트 형태로 만들면 로그온 할때마다 자동으로 스크립트 형태로 실행된다.

sudo usermod -a -G audio $USER
sudo usermod -a -G video $USER
wicd-gtk &
start-pulse-audio-x11 &
xterm &
ppsspp --fullscreen
sudo shutdown -h now


다른 프로그램은 뒤에 &이 붙어있는데 (wicd-gtk는 무선랜 접속을 위함 만약 무선랜이 필요없으면 지워도 됨) ppsspp --fullscreen 뒤엔 없는 이유는 그 아래 명령어가 ppsspp가 종료될 때까지 실행되지 않도록 하기 위함이다.


보면 알겠지만 sudo shutdown -h now는 시스템 종료 명령어이다. 즉, PPSSPP의 실행이 끝나면 자동으로 시스템이 꺼진다는 것! 물론 xterm이나 wicd-gtk가 같이 실행되고 있으므로 Alt-Tab키를 눌러서 빠져 나올 수는 있다. 하지만 PPSSPP가 꺼지면 시스템 종료로 이어진다는 것!


7. 이제 라이브 ISO파일을 만들자!

터미널에 exit를 쳐서 빠져나오고

Customizer에서 ISO다시빌드 버튼을 누르면 시간이 지난뒤에 /home 폴더에 Ubuntu~~.iso파일이 하나 만들어졌을 것이다. 일단 궁금하니 VirtualBox나 Qemu같은 가상머신으로 테스트해보자. 부팅후에 PPSSPP가 실행되고 PPSSPP를 끄면 시스템이 꺼질 것이다. 이것이 잘 만들어졌다면 큰 그림은 완성


8. 이제 디스크를 준비합니다.

머신에 넣을 HDD를 USB to HDD기기로 USB장치로 인식되게 하셔야 합니다. (즉, 노트북에서 HDD를 꺼낸다음 연결합니다.) USB to SATA장비는 2만원에서 4만원 정도 합니다.


대충 이런형태의 물건이다. 저기 있는 SATA포트에 HDD를 연결하고 전원을 넣은다음 USB를 연결하면 PC가 외장하드로 인식한다.

Gparted를 실행!


보통은 /dev/sdb 혹은 제일 뒤쪽에 있는 것이 USB-HDD이니 해당 디스크를 선택한다.


그리고 파티션을 3개로 쪼개는데 포맷은 모두 ext4로 한다. 첫번째 파티션을 호환성을 위해 FAT32로 해도 상관은 없지만 ext4가 안정성은 더 높다.


예시로 든 것이므로 굳이 똑같이 따라할 필요는 없다. 다만 home-rw 파티션을 넉넉히 해주는 것이 중요하다. 게임 이미지가 저장될 공간이기 때문.


이 때 제일 처음 파티션은 ISO크기보다 약간 큰 정도면 되고(즉, ISO내의 내용물이 들어갈 자리) 두번째 파티션은 레이블을 casper-rw로 하고 40GB이상으로 잡는다. 나머지 파티션은 레이블을 home-rw로 하고 모든 용량을 투입하도록 하자.


2017. 5. 29 추가

파티션을 나눌 때 약 메모리 용량의 2배 크기 정도의 스왑파티션을 만들어두자. 가끔 메모리 부족으로 PPSSPP가 튕기는 경우가 있는데 PPSSPP가 종료되면 autostart 스크립트가 작동하면서 시스템이 종료되어버린다. 스왑을 잡아두면 이런 경우가 현저히 줄어들게 된다. 즉, 일종의 보험인 셈.


9. Unetbootin설치 및 실행


sudo apt-get install unetbootin

위 명령으로 unetbootin을 설치하고 실행하자. 아직 USB-HDD는 연결을 끊었다가 다시 연결하도록 하자.


위 스크린샷 처럼 Diskimage 라디오 버튼을 누르고 오른쪽의 ...버튼을 누른다음 아까 만든 ISO를 선택한다. 아래의 Drive는 제일 오른쪽 숫자가 1이 되는 장치를 선택한다.

(/dev/sdb1 혹은 /dev/sdc1 같이)


왜냐하면 아까 편집한 파티션의 제일 처음(아무런 레이블도 안 붙였던 ISO크기 정도의 파티션)이 바로 시스템 파티션이기 때문


그리고 Space used to preserve files across reboots라고 있는데 이것을 1MB라고 해 놓는다. 이 옵션이 바로 Persistent Live옵션의 필수다.


10. 아직 끝나지 않았다! 부트 옵션 수정!!!!!


USB-HDD내용물을 보면 1번 파티션에 ISO의 내용물이 거의 그대로 들어갔음을 알 수 있을 것이다. 여기서 몇가지 작업을 더 하도록 하자.


syslinux.cfg 파일을 관리자 권한으로 열자.


제일 위에 Timeout 100 이라고 쓰인 부분이 있다. 확 줄이자. 100초는 너무 길다. 한 5초?


그리고 부트옵션 중 Default 아래에

append  file=/cdrom/preseed/ubuntu.seed boot=casper

요렇게 써있는 부분이 있다.

여기에 몇가지 내용을 더 붙이자.


append  file=/cdrom/preseed/ubuntu.seed boot=casper lang=ko_KR keymap=kr net.ifnames=0 biosdevname=0

이렇게 해주면 무조건 한국어로케일로 부팅하게 된다. 그리고 무선랜의 인터페이스 이름이 wlan0로 만들어져서 다른 시스템에서도 wicd가 똑같이 작동 할 수 있게 된다.


그리고 casper-rw란 1MB짜리 파일이 보일 텐데 이건 그냥 삭제한다.


권한이 어쩌고 하면그냥 관리자 권한으로 밀어버리면 된다.


11. HDD를 다시 PC에 넣고 부팅


가상머신에서처럼 똑같이 작동한다면 시스템 구축에 성공한것이다. 이제 게임생활을 시작하자...가 아니라 네트워크 접속을 해서 게임 이미지를 밀어넣어야 할 시간이다.




12. 키보드를 이용해서 Alt-Tab키를 눌러 wicd-gtk를 띄우자. 일단 네트워크에 접속을 해야 뭘 밀어넣던지 말던지 할 것이 아닌가. (유선랜의 경우에는 별다른 문제없이 그냥 바로 접속 될것이다.)


네트워크에 접속이 완료되면 아래에 Wicd 창 아래에 IP주소가 뜬다. 이것을 가지고 다른 PC를 이용해서 FTP로 밀어넣으면 된다.


FTP프로그램은 파일질라가 제일 좋은데 다른 클라이언트들이 접속이 끊어지면 파일 전송도 같이 끊어버리는 반면 파일질라는 재접속을 해서라도 파일 전송을 끝내주기 때문에 굉장히 안정적입니다.


호스트에 게임머신의 IP를 넣고 사용자명에 아까 라이브 유저(기본값: ubuntu)를 적고 연결을 하면 그냥 연결이 됩니다. 왼쪽 로컬 사이트에서 PSP게임 이미지를 찾은 다음 그냥 업로드를 하면 끝입니다. 업로드 되는 곳은 /home/ubuntu(라이브유저이름)입니다.


13. 이제 실행해 볼까?


아쉽지만 소리 문제가 있을 수 있습니다. 난 HDMI를 통해 소리가 나오길 원했는데 엉뚱하게 노트북 스피커로 나오면(...)


Alt-Tab을 눌러서 xterm창을 띄웁시다.

pacmd set-card-profile 0 output:hdmi-stereo


이렇게 치면 HDMI로 소리가 나오게 될 겁니다. 우분투는 HDMI연결 여부를 확인하고 알아서 스위칭을 해주는데 이쪽은 그런 기능따윈 만들어 넣지도 않았으니 그냥 수동으로 해주는 것입니다.


게임패드를 USB포트에 연결하면 알아서 연결이 될 것이고 PPSSPP상에서 설정을 약간 하면 이후로는 키보드가 필요없을 것입니다. 가끔 게임 이미지 밀어넣을때정도?


이제 마음껏 게임을 해볼까요??후후...


개인적으로 XBOX패드보다는 PS패드가 이 시스템에는 더 잘 어울린다고 생각합니다.

PSP말고 다른 콘솔도 하고 싶으시다고요? 그럼 그냥 LAKKA쓰세요.

,