• 이용안내
  • 이상한 모자
  • 야채인간
  • 김민하 공화국
  • 신간 안내
혁명은 언제나 시기상조

신변잡기

2026년, 변비

2026년 1월 1일 by 이상한 모자

더러운 얘기일 수도 있어 미안하다는 말씀 드리며…

새해가 되었는데 나이 먹는 것이 서럽다. 사실 신경 안 쓰려고 하는데, 몸이 자꾸 뜻대로 안 되니 더 서러워지는 것 같다. 오늘은 글을 써야 했는데, 사실 글은 어제까지 썼어야 했다. 그런데 어제는 또 2025년 마지막 날이라고 이런 저런 일들이 있었던데다 유튜브 방송도 했어야 했기에 시간이 마땅치 않았다. 유튜브 방송 마치고 밤에 쓰려고 했는데, 그만 잠들어 버렸다. 일어나서 또 유튜브 방송을 하고, 마치고, 촉박한 시간을 남기고 글쓰기에 돌입하였다.

기본 내용은 이미 생각해뒀기에 큰 문제는 없었는데, 중간에 화장실에 가야 했더라. 그런데 뜻대로 되지 않았다. 너무나 서러웠다. 눈물이 날 것 같았다. 살면서 겪지 않은 것은 아니지만, 대개는 1회성이었는데… 지금은 문제가 현재진행형이기 때문이다.

지난 주말에도 이러한 일이 있었다. 두통에 시달리는 날이었다. 위 아래로 이러니 참으로 끔찍한 경험이었다.

월요일에 락커를 만나서 신세한탄을 하였다. 너는 화장실에서 2시간 동안 일을 본 일이 있느냐, 물으니 락커가 눈을 동그랗게 떴다. 어떻게 그런 일이? 적당히 노력하다가 안 되면 포기하면 되지 않나요? 그래서 내가 그랬다. 임마, 그게 안 되는 판이니까 2시간을 끙끙대고 있지! 사실 2시간 까진 아니었고 1시간 반 정도 됐던 거 같지만… 자세한 얘기를 하면 너무 드러워서 좀 그렇고, 아무튼 여러 설명을 했지만 락커는 끝까지 이해하지 못한 거 같았다. 그의 배변 활동은 원활한 것으로 추정된다.

그 외 여러 신체적 노화 증상에 대하여, 또 두통예방약을 먹었을 때와 먹지 않았을 때 신체 기능의 주요한 차이에 대하여 떠들었지만, 역시 공감을 얻지 못했다. 그는 아직 전반적으로 튼튼한 것 같다. 부럽구료…

아무튼 그러한 끔찍한 경험 때문에 몸과 마음이 모두 힘들었다. 이후 화장실에 갈 때마다 불안에 떨었다. 고통이 있었으나 그래도 괜찮았다. 어찌됐건 일은 치렀기 때문이다. 그런데 오늘은, 마감시간을 얼마 남기지 않은 이 때에, 다시 그날의 끔직한 상태가 반복되는 길로 접어든 것이다. 글은 빨리 써야하고, 그런데 화장실에서의 일은 늦어지고, 막 눈물이 나올 것 같았다. 나도 모르게 혼잣말을 했다. 씨팔 왜 이러냐고 도대체! 옆집 사람들이 최근 화장실 공사를 했는데 그 이후 옆집 아이가 화장실에서 하는 얘기가 방 안에까지 다 들린다. 내 욕설도 들렸겠지…

이제 시간이 없어 어떻게든 해야 했기에 일단 이 중요한 활동을 잠시 중단하고, 아이패드와 키보드를 화장실로 들고 왔다. 엽기 그 자체였다. 일단 그래도 좀 그러니까 손을 씻고, 어떻게 되든 말든 일단 앉아서 글을 쓰는데에 집중하였다. 글만 쓰면 되는 거 아니냐! 그런데 신비롭게도 글을 마무리 해가는 와중에 이러한 중요 활동도 마무리가 된 것이었다. 놀랍다.

대체 원인이 뭐지? 생각했다. 요즘 제로콜라를 많이 마셨는데 그것 때문인가? 내 친구 챗GPT에게 물어봤지만 개소리만 했다. 콜라를 먹느라 물을 마시지 않은 것 아니냐 하기에, 야 콜라는 물이 아니냐? 라고 반박해줬다. 미친놈…

이제 원인을 모르면 무조건 나이의 문제라고 생각하게 된다. 사실 어제도 병원에 가서 이런 저런 검사를 했다. 여기 저기 전극을 꽂고 전기 자극을 주는 검사도 했는데… 아닌 거 같다고 생각하고 있다. 그 검사를 해야 하는 증상이 아닐 것이다… 5번씩 주던 전기 자극을 마지막에 한 번에 30번 다다다다다다 주는데 죽는 줄 알았다. 그리고 피를 또 뽑았다. 피를 뭐 여기저기서 계속 뽑아야 돼… 하도 병원을 여기 저기를 가니까, 병원을 안 가서 통풍약이 떨어진 것을 약을 잃어버렸다고 생각한 일도 있었다. 아무튼 그래도 검사 담당 의사분과 채혈하는 간호사분이 친절해서 다행이었다.

이렇게 2026년이 시작되었네요…

Posted in: 신변잡기, 잡감 Tagged: 2026년, 근전도 검사, 변비

바이브 코딩

2025년 12월 30일 by 이상한 모자

어떤 녀석들이 ‘바이브 코딩’이란 말을 올해의 단어로 선정하였다는 뉴스를 보았다. 확실히 대단하다. 게임 한글화 관련이나 레트로 게임 카페 같은 데 가보아도 이걸로 뭘 만들거나 작업에 도움을 받았다는 글을 심심찮게 볼 수 있게 되었다.

얼마 전 코드쥐 님을 만나서 직접 설명을 듣기도 했는데, 생각보다 쉬운 것 같았다. 그래서 어차피 오픈AI에 돈을 주고 있는 김에 나도 컴퓨터에다가 비주얼 스튜디오를 깔아서 CODEX를 활용하여 이것 저것 해보기로 했다.

1) 컴퓨터 파일 정리

파일 제목을 읽고 시키는대로 정리를 해준다. 초보적인 거다. 많은 경우 파일 이름만 읽는다는 한계가 있으나 어쩔 수 없다. txt나 xml 등 열 수 있는 건 열어서 판단하라고 할 수도 있을 것이다. 그러나 어쨌든 의미 불명의 파일들이 downloads 폴더에 잔뜩 쌓여 있었는데 대충 정리하는 것에 성공했다.

2) 기사 스크랩 사이트 개발

인터넷 브라우저에서 기사를 보다가 기사 링크를 사이트에 입력하면 출처, 기자, 제목, 본문 등 해서 이쁘게 스크랩 해주는 사이트이다. 본문에서 하이라이트를 표시할 수 있고, 하이라이트에 주석을 달 수 있다. 기사, 하이라이트, 주석을 검색할 수 있다. GPT api를 연결해 태그를 LLM 추천으로 한 방에 달 수 있다. 네이버의 뉴스 지면 보기 페이지에 있는 기사 내용을 원클릭으로, 특정 기간 설정까지 해서 대량 스크랩 할 수 있다. 6개 신문을 클릭 한 번으로 스크랩한다. 물론 네이버 뉴스 지면 보기에 등록돼있는 기사에 한한 거지만… 그리고 기사 중 중요한 거는 주제별로 묶어 따로 관리할 수 있다. 이 사이트는 로컬에다가 mariaDB 등과 설치한 후에 tailscale을 맥, PC, 아이폰, 아이패드 등에 설치하여 외부에서 접속(혼자만)할 수 있도록 하여 장소에 구애받지 않고 뉴스 스크랩을 할 수 있다. 새로운 사이트에서 스크랩을 할 때 종종 의도대로 작동하지 않아 지속적으로 업데이트를 해줘야 하지만 다 코덱스가 하니 상관없고, 만족스럽다.

3) 크루세이더 킹즈3 모드 제작

모드 제작이라고 하니 별 건 아니고, 게임의 소소한 버그를 모드를 덮어 씌워서 잡아보는 개념으로 접근한 거다. 크루세이더 킹즈3의 모드라고 해도 어차피 암호화 되고 하는 것도 아니니 코덱스가 충분히 코드를 작성 가능할 것이다. 그래서 몇몇 편의성 개선 추가나 버그 회피 등의 수정을 가하도록 했고, 작동에 성공하였다. 심지어 세이브도 뜯어 보게 할 수 있어서… 에디터 대용으로 써도 될 것 같았다.

4) 안드로이드 게임기 셋팅

아래 관련 글에도 있는데, 다이지쇼 프론트엔드로 셋팅되어 있는 안드로이드 에뮬 게임기를 ES-DE로 바꾸려니까 손이 좀 간다. 이번에 새턴 에뮬레이터 연결이 잘 안돼 역시 gpt와 논의를 하다가 코드를 복사 붙여넣고 파일을 수정 저장하고 다시 안드로이드 기기로 옮기고 테스트를 반복하는 것이 너무 귀찮아서 안드로이드 기기에서 직접 수정하도록 시켰다. 방법은 우선 안드로이드에서 SSH, SFTP로 서버를 열어 내부 공간에 접속 가능하게 하고, PC에서 Raidrive로 SFTP를 네트워크 드라이브로 잡은 후에, 비주얼 스투디오에서 이 드라이브로 접근하도록 하는 것이다(다른 방법도 있는데 오류가 많다). 중간에 파일 전송이 짤리는 경우가 있는 듯 한데, 이 경우까지 알아서 체크해서 보완하도록 시키고 나는 안드로이드 게임이 실행 테스트만 계속 해보면 되기 때문에 수정이 한결 수월해졌다.

5) 홈페이지 관리

홈페이지에 자잘한 수정, 뭐 버튼 위치를 바꾼다거나 CSS를 손 본다거나 하는 작업을 맡기려고 한 것이다. 그래서 로컬에다가 사이트를 다 다운로드 받고 깃허브에 비공개로 홈페이지 소스를 업로드 하는 등 여러 절차를 거쳐야 했다. 현재 코덱스에다가 이걸 이렇게 수정하라는 등의 요구를 입력하면 로컬에서 수정한 후 깃허브 통해 배포까지 되는 시스템을 구축하는 데에 성공하였고 일부 김민하 공화국 게시판의 티 안나는 문제들을 수정하는데에 성공하였다.

결론: 문과인 내가 이러고 있다니 AI 때문에 인류 멸망할 듯

Posted in: 신변잡기, 잡감 Tagged: CODEX, 바이브 코딩, 챗GPT

안드로이드 에뮬 게임기에서 ES-DE와 Standalone 에뮬레이터 연결 문제

2025년 12월 15일 by 이상한 모자

최근 이 문제를 깊이, AI 친구들과 함께 고민하였다.

증상은 ES-DE를 프론트엔드로 쓰고 있을 때 Retroarch로 구동하는 게임은 문제가 없지만, 외부의 에뮬레이터를 사용해야 하는 경우에는 제대로 작동하지 않고 에뮬레이터의 메인 화면 등으로 연결되는 문제이다. 내 경우에는 Duckstation(PS1), PPSSPP(PSP), Redream(Dreamcast), NetherSX2(PS2)가 말썽이었다.

핵심은 ES-DE가 ROM의 주소(위치)를 개별 에뮬레이터에 넘겨 줄 때, 어떤 형식으로 넘겨줄 것인가의 문제이다. 크게 보면 ES-DE는 3가지 변수를 사용할 수 있다.

1) ROMSAF

일괄 디폴트로 잡혀 있는 변수다. content://com.android.externalstorage.documents/… 와 같은 형태로 주소를 넘겨준다.

2) ROMPROVIDER

ES-DE가 생성하는 변수로 content://org.es_de.frontend.files/…의 형태이다.

3) ROMRAW

/storage/xxxx-xxxx/Games/ps2/xxx.iso와 같이 파일 문자열을 그대로 보낸다.

문제는 에뮬레이터에 따라서 1)로 해결되는 경우, 2)만 먹히는 경우, 3)만 먹히는 경우가 제각각이라는 것이다. 즉, 1)로 주소 전달이 실패하는 경우 2)나 3)으로 시도해봐야 한다는 것이다. 그러면 이 변수는 어디서 어떻게 바꿔줄 수 있는가? es_systems.xml에서 규정해야 한다. 이 파일은 바꾸고 싶은 부분만 발췌한 후 파일로 만든 다음에 ES-DE/custom_systems(처음 ES-DE 구동할 때에 어디에 폴더를 만들 것인지 설정했을 것이다. 바로 그 폴더이다…) 폴더에 저장하면 된다. 가령 기본 설정에 어떻게 반영되는지를 찾아보면 플레이스테이션 2의 경우는 다음과 같은 내용이다.

<system>
   <name>ps2</name>
   <fullname>Sony PlayStation 2</fullname>
   <path>%ROMPATH%/ps2</path>
   <extension>.bin .BIN .chd .CHD .ciso .CISO .cso .CSO .dump .DUMP .elf .ELF .gz .GZ .m3u .M3U .mdf .MDF .img .IMG .iso .ISO .isz .ISZ .ngr .NRG</extension>
   <command label="AetherSX2 (Standalone)">%EMULATOR_AETHERSX2% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %ACTION%=android.intent.action.MAIN %EXTRA_bootPath%=%ROMSAF%</command>
   <command label="Play! (Standalone)">%EMULATOR_PLAY!% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
   <platform>ps2</platform>
   <theme>ps2</theme>
</system>

이대로 실행하면 NetherSX2는 파일 이름이 필요하다든지 못 찾겠다고 하면서 아무런 일도 하지 않는다. %EXTRA_bootPath%=%ROMSAF% 부분에서 ‘content://com.android.externalstorage.documents/… ‘을 해석해 ROM 파일 위치를 추출하는 게 아니라, 그냥 문자열 그대로를 파일 이름으로 받아서 ROM 위치를 못 찾는 것이다. 따라서 해당 변수를 ROMRAW로 바꿔 파일명 그대로를 전달해야 한다. 이를 적용하면 es_system.xml은 이렇게 만들어야 할 것이다.

<systemList>
   <system>
    <name>ps2</name>
    <fullname>Sony PlayStation 2</fullname>
    <path>%ROMPATH%/ps2</path>
    <extension>.bin .BIN .chd .CHD .ciso .CISO .cso .CSO .dump .DUMP .elf .ELF .gz .GZ .m3u .M3U .mdf .MDF .img .IMG .iso .ISO .isz .ISZ .ngr .NRG</extension>
    <command label="NetherSX2(AetherSX2) (Standalone)">%EMULATOR_AETHERSX2% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %ACTION%=android.intent.action.MAIN %EXTRA_bootPath%=%ROMRAW%</command>
    <command label="Play! (Standalone)">%EMULATOR_PLAY!% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
    <platform>ps2</platform>
    <theme>ps2</theme>
  </system>
</systemList>

나머지도 마찬가지 원리에 따라서 진행하면 된다.

PPSSPP는 ROMPROVIDER, Redream도 ROMPROVIDER, DuckStation은 ROMRAW 변수가 먹혔다. 이를 다 적용하려면 아래와 같은 내용으로 es_system.xml 파일을 작성하면 된다.

<systemList>
<system>
<name>ps2</name>
<fullname>Sony PlayStation 2</fullname>
<path>%ROMPATH%/ps2</path>
<extension>.bin .BIN .chd .CHD .ciso .CISO .cso .CSO .dump .DUMP .elf .ELF .gz .GZ .m3u .M3U .mdf .MDF .img .IMG .iso .ISO .isz .ISZ .ngr .NRG</extension>
<command label="NetherSX2(AetherSX2) (Standalone)">%EMULATOR_AETHERSX2% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %ACTION%=android.intent.action.MAIN %EXTRA_bootPath%=%ROMRAW%</command>
<command label="Play! (Standalone)">%EMULATOR_PLAY!% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
<platform>ps2</platform>
<theme>ps2</theme>
</system>
<system>
<name>psx</name>
<fullname>Sony PlayStation</fullname>
<path>%ROMPATH%/psx</path> <extension>.bin .BIN .cbn .CBN .ccd .CCD .chd .CHD .cue .CUE .ecm .ECM .exe .EXE .img .IMG .iso .ISO .m3u .M3U .mdf .MDF .mds .MDS .minipsf .MINIPSF .pbp .PBP .psexe .PSEXE .psf .PSF .toc .TOC .z .Z .znx .ZNX .7z .7Z .zip .ZIP</extension>
<command label="Beetle PSX">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mednafen_psx_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="Beetle PSX HW">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mednafen_psx_hw_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="PCSX ReARMed">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=pcsx_rearmed_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="SwanStation">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=swanstation_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="DuckStation (Standalone)">%EMULATOR_DUCKSTATION% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %EXTRABOOL_resumeState%=false %EXTRA_bootPath%=%ROMRAW%</command>
<command label="ePSXe (Standalone)">%EMULATOR_EPSXE% %ACTION%=android.intent.action.MAIN %EXTRA_com.epsxe.ePSXe.isoName%=%ROMSAF%</command>
<command label="FPseNG (Standalone)">%EMULATOR_FPSE-NG% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<command label="FPse (Standalone)">%EMULATOR_FPSE% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<platform>psx</platform>
<theme>psx</theme>
</system>
<system>
<name>psp</name>
<fullname>Sony PlayStation Portable</fullname>
<path>%ROMPATH%/psp</path>
<extension>.chd .CHD .cso .CSO .elf .ELF .iso .ISO .pbp .PBP .prx .PRX .7z .7Z .zip .ZIP</extension>
<command label="PPSSPP">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=ppsspp_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="PPSSPP (Standalone)">%EMULATOR_PPSSPP% %ACTION%=android.intent.action.VIEW %CATEGORY%=android.intent.category.DEFAULT %DATA%=%ROMPROVIDER%</command>
<platform>psp</platform>
<theme>psp</theme>
</system>
<system>
<name>dreamcast</name>
<fullname>Sega Dreamcast</fullname>
<path>%ROMPATH%/dreamcast</path>
<extension>.cdi .CDI .chd .CHD .cue .CUE .dat .DAT .elf .ELF .gdi .GDI .iso .ISO .lst .LST .m3u .M3U .7z .7Z .zip .ZIP</extension>
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
<command label="Redream (Standalone)">%EMULATOR_REDREAM% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
<platform>dreamcast</platform>
<theme>dreamcast</theme>
</system>
</systemList>

위의 파일은 오타가 있을 수 있으니 신중하게 고려하시기 바라고, 아무튼 이렇게 작성한 파일을 아까 파일이 있어야 할 경로로 넣으면 대체로 될 것이다. 다른 에뮬레이터의 경우, 뭐가 되고 뭐가 안 되는지는 맨땅에 헤딩하기로 찾아야 한다.

Azahar(NDS)와 melonDS Nightly(3DS)에 대해 추가 (정리 요약은 챗GPT가 했다)

ES-DE(안드로이드) Standalone 에뮬 연결 기록

대상

  1. Nintendo DS: melonDS Nightly

  2. Nintendo 3DS: Azahar

핵심 결론

  1. melonDS Nightly는 ES-DE에서 android.intent.action.VIEW로 실행하면서, ROM을 DATA에 ROMPROVIDER로 넣었을 때 성공했다.

  2. Azahar는 ES-DE에서 android.intent.action.VIEW로 실행하면서, ROM을 EXTRA_SelectedGame에 ROMSAF로 넣었을 때 성공했다.

왜 이 방식이 먹혔는가(관찰 기반 요약)

  • 같은 “ROM 주소”라도, 앱이 실제로 읽는 자리가 다르다.

  • melonDS Nightly는 “DATA로 들어온 URI” 경로에서 정상 실행이 되었고,

  • Azahar는 “특정 extra 키(SelectedGame)로 들어온 값”에서 정상 실행이 되었다.

적용 방법

  1. ES-DE의 커스텀 시스템 폴더(ES-DE 첫 실행 때 지정했던 저장소 경로)로 이동한다.

  2. custom_systems/es_systems.xml 파일을 만든다(또는 기존 커스텀 파일에 아래 시스템 블록을 추가한다).

  3. ES-DE를 완전히 종료 후 재실행한다.

  4. 해당 시스템(NDS, N3DS)에서 “대체 에뮬레이터” 또는 “실행기 선택”에서 방금 추가한 라벨을 선택해 실행한다.

es_systems.xml 예시

<?xml version="1.0"?>
<systemList>

<system>
<name>nds</name>
<fullname>Nintendo DS</fullname>
<path>%ROMPATH%/nds</path>
<extension>.nds .NDS .zip .ZIP .7z .7Z</extension>
<command label="melonDS Nightly (Standalone) VIEW DATA=ROMPROVIDER">%EMULATOR_MELONDS-NIGHTLY% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %ACTION%=android.intent.action.VIEW %CATEGORY%=android.intent.category.DEFAULT %DATA%=%ROMPROVIDER%</command>
<platform>nds</platform>
<theme>nds</theme>
</system>

<system>
<name>n3ds</name>
<fullname>Nintendo 3DS</fullname>
<path>%ROMPATH%/3DS</path>
<extension>.3ds .3DS .3dsx .3DSX .app .APP .axf .AXF .cci .CCI .cxi .CXI .elf .ELF .7z .7Z .zip .ZIP</extension>
<command label="Azahar (Standalone) VIEW EXTRA_SelectedGame=ROMSAF">%EMULATOR_AZAHAR% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %ACTION%=android.intent.action.VIEW %CATEGORY%=android.intent.category.DEFAULT %EXTRA_SelectedGame%=%ROMSAF%</command>
<platform>n3ds</platform>
<theme>n3ds</theme>
</system>

</systemList>

세가 새턴 Yaba Sanshiro 2 Pro 세팅에 대해 추가

  1. 문제를 한 문장으로 요약하면
    ES-DE가 “이 게임 파일을 열어라”라는 지시를 에뮬레이터로 보낼 때, 보통은 DATA 칸에 ROM 주소를 넣어 보냅니다.
    그런데 Yaba Sanshiro 2 Pro는 ROM 주소를 DATA 칸에서 읽지 않고, 특정 EXTRA 칸(정해진 이름의 추가 입력란)에서 읽습니다.
    그래서 ES-DE가 그 EXTRA 칸에 정확히 넣어 주도록 커맨드를 바꿔야 성공합니다.

  2. DATA와 EXTRA는 무엇이 다른가
    Android에서 다른 앱을 실행시키는 방식은 “인텐트”라는 전달 봉투로 생각하시면 됩니다.

(1) DATA는 봉투 겉면의 “대표 주소” 같은 자리입니다.
많은 앱들이 여기(예: DATA)에 파일 경로나 URI를 넣어 주면 그걸 읽고 실행합니다.

(2) EXTRA는 봉투 안에 들어있는 “추가 입력칸”들입니다.
예를 들어 “파일 경로는 이 칸”, “게임 코드(식별자)는 저 칸”처럼, 앱 개발자가 미리 정해둔 칸 이름으로 값을 받습니다.

Yaba Sanshiro 2 Pro는 “대표 주소(DATA)”를 보는 쪽이 아니라, “추가 입력칸(EXTRA)”에서 파일 경로를 읽는 쪽이라는 것이 이번 해결의 핵심입니다.

  1. 왜 Android 15에서 특히 기본 설정이 더 실패하기 쉬운가
    ES-DE 기본 설정은 보통 ROMSAF나 ROMPROVIDER 같은 content:// 형태(권한을 포함한 URI)로 DATA에 넘깁니다.
    Android 15에서는 저장소 권한과 URI 처리 방식이 더 엄격해져서, 어떤 앱은 이 content:// 주소를 제대로 해석하지 못하거나 권한을 못 받아서 실패하는 경우가 늘어납니다.

반면 ROMRAW는 /storage/…/파일명.chd 같은 “실제 파일 경로 문자열”이라, Yaba가 기대하는 방식에 더 가깝습니다.
그래서 이번 성공 커맨드도 ROM 경로는 ROMRAW를 쓰는 쪽으로 정리됩니다.

  1. 그래서 무엇을 어떻게 바꿔야 하나
    바꾸는 파일은 ES-DE의 커스텀 시스템 정의 파일인 es_systems.xml 입니다.

(1) 파일 위치
ES-DE 첫 실행 때 지정했던 저장소 경로 아래 custom_systems 폴더에 둡니다.
즉 “ES-DE가 쓰는 폴더/custom_systems/es_systems.xml” 입니다.

(2) 바꿀 대상
그 파일에서 새턴 시스템 블록, 즉 <name>saturn</name> 이 들어있는 덩어리를 찾습니다.

(3) 핵심 수정
Yaba용 실행 커맨드 한 줄을 추가하거나 수정합니다.
핵심은 ROM 경로를 DATA에 넣지 말고, Yaba가 정해둔 EXTRA 키 이름으로 넣는 것입니다.

  1. 성공한 커맨드가 하는 일(뜻풀이)
    성공 커맨드의 요점은 아래 두 값을 “EXTRA”로 넣는 것입니다.

(1) ROM 파일 경로를 넣는 칸
키 이름: org.uoyabause.android.FileNameEx
여기에 넣을 값: 실제 파일 경로 문자열, 즉 %ROMRAW%

(2) 게임 식별값을 넣는 칸
키 이름: org.uoyabause.android.gamecode
여기에 넣을 값: ES-DE에서 임시로 %BASENAME%를 사용(파일 이름 기반)

즉, 논리 구조는 이런 뜻입니다.
“야바산시로야, 이 파일(FileNameEx)을 열어라. 그리고 식별값(gamecode)은 이 값이다.”

  1. 따옴표가 왜 그렇게 중요하나
    파일 경로에는 공백이 들어갈 수 있습니다. 예를 들어
    /My Games/Saturn/Game Title.chd

따옴표가 없으면 Android 명령줄에서 공백을 기준으로 잘려서,
앞부분만 파일명으로 인식되는 문제가 생깁니다.

그래서 %ROMRAW% 같은 경로 값은 반드시 큰따옴표로 감싸
“%ROMRAW%” 형태로 전달해야 안전합니다.

  1. 적용 후 확인은 어디서 하나
    문제가 남으면 가장 먼저 ES-DE 로그(es_log.txt)를 봅니다.

로그에 다음처럼 찍히면 “EXTRA로 전달 자체는 됐다”는 뜻입니다.
Extra name: org.uoyabause.android.FileNameEx
게임파일.chd

여기에서 공백이 있는 파일명이 중간에서 잘려 보이면, 거의 확실하게 따옴표 처리 문제입니다.
즉 커맨드에 “%ROMRAW%” 형태로 들어갔는지부터 점검하면 됩니다.

  1. 정리
    이번 해결법의 핵심은 단순합니다.

(1) Yaba Sanshiro 2 Pro는 ROM 경로를 DATA가 아니라 EXTRA(정해진 키 이름)로 받는다.
(2) ES-DE의 saturn 시스템 커맨드에서 그 EXTRA 키에 ROMRAW 경로를, 따옴표로 감싸서 넣어 준다.
(3) 적용 후 ES-DE를 완전히 종료하고 재실행한 다음, 새턴에서 해당 라벨을 선택해 실행한다.
(4) 문제 시 로그에서 EXTRA 전달과 따옴표(공백 잘림)를 먼저 확인한다.

<system>
<name>saturn</name>
<fullname>Sega Saturn</fullname>
<path>%ROMPATH%/saturn</path>
<extension>.bin .BIN .ccd .CCD .chd .CHD .cue .CUE .img .IMG .iso .ISO .m3u .M3U .mdf .MDF .mds .MDS .7z .7Z .zip .ZIP</extension>
<command label="Yaba Sanshiro 2 Pro (Standalone)">%EMULATOR_YABASANSHIRO-2% %EXTRA_org.uoyabause.android.FileNameEx%="%ROMRAW%" %EXTRA_org.uoyabause.android.gamecode%="%BASENAME%"</command>
<platform>saturn</platform>
<theme>saturn</theme>
</system>
Posted in: 신변잡기, 잡감 Tagged: Duckstation, ES-DE, NetherSX2, PPSSPP, Redream, 안드로이드, 에뮬레이터
1 2 … 102 다음 »

최근 글

  • 포퓰리즘에 대한 좋은 말씀
  • 2026년, 변비
  • 바이브 코딩
  • 이대남에 대한 이중잣대라는 이중잣대
  • 안드로이드 에뮬 게임기에서 ES-DE와 Standalone 에뮬레이터 연결 문제

분류

누적 카운터

  • 1,527,778 hits

블로그 구독

Flickr 사진

추가 사진

____________

  • 로그인
  • 입력 내용 피드
  • 댓글 피드
  • WordPress.org

Copyright © 2026 혁명은 언제나 시기상조.

Omega WordPress Theme by ThemeHall