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

Author: 이상한 모자

바이브 코딩

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

이대남에 대한 이중잣대라는 이중잣대

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

지겹다. 남들이 뭐라 말하든 듣지도 않고 계속 이대남은 극우가 아니예요~ 민주당에 실망한 것 뿐이예요~ 비상계엄에 찬성하지 않았어요~  극우라고 낙인찍지 말고 개혁부터 제대로 해요~ 왱알앵알… 언제까지 그런 소리를 할 건가?

언젠가 다 한 얘기지만 2030 남성 한 사람 한 사람의 피에 극우 농도가 얼마나 되는지, 이런 거는 정확한 측정도 되지 않고 관심도 없다. 문제는, 늘 강조하는 거지만! 대의민주주의의 매커니즘, 즉 정치의 조직화 방식에 유권자가 어떤 방식으로 응하고 있느냐이다. 이게 핵심이다.

한 사람 한 사람을 테스트를 해서 극우 농도가 얼마나 되는지, 좌파인지 우파인지… 야 그딴 게 어디있냐? 너는 좌파야 우파야? 오늘은 좌파고 내일은 우파이거나 오늘은 우파고 내일은 좌파인 사람이 얼마나 많은데… 다른 거 다 진보인데 젠더 문제에만 보수인 사람도 있고. 그 반대도 있고. 그럼 그런 건 다 어떻게 평가할거야? 항목별로 배점 줘가지고 시험 볼 거냐? 그러니까 그게 중요한 게 아니라고. 정치적으로 어떻게 조직화되고 평가되느냐!

그래서 극우포퓰리즘 얘기 하는 것이다. 극우포퓰리즘이란? 극우정치의 포퓰리즘적 방법론 차용을 통한 새로운(사실은 새롭지 않은) 유권자 포섭 전략이다. 그 포섭 전략에 젊은이들이 호응하고 있다. 결과적으로 그것은 사회 공동체의 극우정치를 활성화 한다. 그래서 극우적 에너지이다. 그런 점에서 보수화이거나 극우화이다. 이게 어렵나? 이 말이 어려워??? 7살도 알아 듣것네.

이해가 안 되면 86세대로 바꿔보자. 요즘 환단고기니 뭐니 말이 많아. 그게 뭐냐면 전형적인 저쪽이 싫어서 추종하는 민족주의야. 상대가 ‘독재-친일-기득권’이니까 ‘독재-기득권’ 반대인 사람들이 ‘친일’에도 반대로, 그 결과 완전히 거울쌍인 유사역사학으로 간 거라고. 위에 이대남에 대한 왱알앵알에 대입하면 그들은 진짜 민족주의자가 아니고 친일 기득권에 반대한 것 뿐인 거 아니냐? 유사역사학 애호가 문제라면 유사역사학 애호가를 욕하지 말고 기성 역사학이 정신 차리고 잘 하면 되는 거 아니냐? 근데 왜 환빠라고 난리냐?

숏츠형 인식을 가진 분들이 여기서 갑자기 뭐!? 환빠가 문제가 아니라고!? 이럴텐데, 글 처음으로 돌아가서 다시 읽으시오.

맨날 그러잖아. 진보의 내로남불, 위선, 이중성 어쩌구. 겉으로는 정의를 외치면서 뒤로는 사익을 추구하고 자기 자식새끼 좋은 대학 보내고 젊은 여자 보면서 군침 흘리고… ㅉㅉㅉ… 영포티? 근데 앞서 이대남 극우 아님 논리로 하면, 애초에 그런 진보들은 진정한 진보(이대남이 진정한 극우가 아니듯)가 아니고 단지 보수정권이 잘못해서 진보 포지션인 것 뿐인 게 아니냐? 그럼 이들에게 뭐라 할 게 아니고 보수정권이 잘하면 이들도 정신차린다~ 이렇게 접근해야 되지 않냐? 근데 왜 내로남불 진보의 위선 강남좌파 타령만 하지?

답은 간단하지. ‘민주당만 빼고’ 이거랑 똑같은 거거든. 정신차려 좀! 인생의 기준을 더블민주당에다가 두지 마세요. 인생의 기준이 더블민주당이니까 모든 걸 ‘이건 민주당에 유리한가? 이건 불리한가?’ 이것만 따지고 살지… 더블민주당에 혼을 빼앗긴 사람들…

Posted in: 잡감, 정치 사회 현안 Tagged: 86세대, 극우정치, 극우포퓰리즘, 극우화, 영포티, 이대남

안드로이드 에뮬 게임기에서 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 3 … 470 다음 »

최근 글

  • 감사하면서 살자
  • 포퓰리즘에 대한 좋은 말씀
  • 2026년, 변비
  • 바이브 코딩
  • 이대남에 대한 이중잣대라는 이중잣대

분류

누적 카운터

  • 1,533,722 hits

블로그 구독

Flickr 사진

추가 사진

____________

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

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

Omega Child (Weirdhat) WordPress Theme by ThemeHall