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

신변잡기

안드로이드 에뮬 게임기에서 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>
Posted in: 신변잡기, 잡감 Tagged: Duckstation, ES-DE, NetherSX2, PPSSPP, Redream, 안드로이드, 에뮬레이터

내란 1년

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

수요일은 격주로 바쁘다. 한 주는 이것 저것 할 일이 많은데, 다른 한 주는 아예 일이 없다. 이번 주는 일이 없었어야 했던 날이다. 하지만 내란 1년이므로 일이 조금 있었다. 일정은 2개였지만 왠지 바쁘게 느껴졌고, 추웠다.

아무래도 지난해 12월 3일의 상황과 느낌을 개인적 차원에서 설명하는 내용이 많았는데, 남들이 현장에서 이리 저리 부딪칠 때 자리에 앉아서 떠드는 걸로 때운 것 같아 좀 죄책감 비슷한 것이 있었다. 그 때 국회에 가보지 못해 아쉽다는 생각을 해왔는데, 이번에 모처럼 국회를 찾아 일종의 ‘다크투어’를 했다. 옆에서 김종대님이 해설사 역할을 해 그 날의 상황을 생생하게 대리체험 할 수 있었다.

현장에서 보니, ‘이재명은 숲에 숨었지만 여당 대표인 나는 당당히…’라고 잘난 척을 하는 후니횽의 허세를 더 직관적으로 이해할 수 있었다. 국회 동쪽에 담을 넘어서 본관으로 넘어오는 곳에 솔밭이 있다. 해가 지고 나니 컴컴하고 으슥한 것이 매복을 하기에 좋은 공간 같았다. 국회의원들도 그런 생각을 했다고 한다. 당시에는 계엄군이 뭘 할지 예상할 수 없는 상황이었다. 그들로서는 당연히 몸을 조심할 수밖에 없다. 그런데 거기다 대고 나는 당당히 들어갔으며, 내가 모두를 구해낸 거나 다름이 없다는 식으로 말하는 사람을 도대체 어떻게 이해해야 할까?

Q. 국회에선 어땠나요?
A. “정문이 막혀 도서관 쪽으로 진입했는데, 우리가 들어간 직후 죄다 봉쇄됐어요. 본회의장에 들어가니 민주당 의원들이 겁먹은 표정으로 앉아있다가 안도하면서 ‘고맙다’고 인사하더군요. ‘여당이 왔으니 군인들에게 끌려나가진 않겠구나’고 생각한 거죠. 한참 뒤 이재명 대표가 들어왔는데, 굳이 저한테 오더군요. 의원들은 ‘피하세요’ 했지만 맞아줬죠. 뒷얘기인데, 해제 표결이 끝난 뒤에도 이재명 대표·우원식 국회의장이 제게 여러 번 전화했어요. 안 받았죠. 언론플레이 같은 정치적 활용 의도가 훤히 보여서죠.”

https://www.joongang.co.kr/article/25385087 

이런 사람을, 마치 희망은 후니횽 뿐이라는 듯… 일간지에다가 한동훈 각하 만세에 가까운 글을 써제끼는 중궈니횽은 어떻게 이해해야 하나? 심지어 당사자가 얘기를 안 해줬으면 이걸 어떻게 알지 싶은 대목도 있다.

주가조작 재판의 유죄판결은 사건의 전모를 꿰는 수사검사가 재판 전 과정에 참여한 덕. 그는 론스타 측 인사들을 법정에 세워 자백을 받아냈다.

(…)

당시 민주당은 항소를 결정한 당시 법무부 장관에게 엄청난 정치적 압박을 가했다. 심지어 윤 정권도 임기 내에 패소 판정을 받을지 모르는 항소를 달가워하지 않았다. 패소할 경우 주변의 만류에도 항소를 강행한 이는 엄청난 타격을 입을 것이다. 그럼에도 자신에게 닥칠 위험을 공적 책임감으로 기꺼이 끌어안은 관료가 그때만 해도 적어도 한 사람 있었다.

https://www.joongang.co.kr/article/25385441

관련 뉴스가 다 나와 있는데 내가 성실하지 못해 찾지 못한 것일 수도 있다. 어쩄든 이렇게까지… 오직 한 사람~ 분위기로 글을 쓰는 것은 창피하다. 이런 분들이 2022년에 윤석열의 자유민주주의 타령에 속아 오로지 민주당을 혼내줘야 한다는 일념으로 사실상의 윤석열 지지 활동(겉으로는 진보 지지라고 했으나, 아크로비스타까지 갔다고 본인이 실토한 사실을 놓고 보면 윤석열 안 찍었다는 식의 얘기는 포장지, 알리바이에 불과했다고 할 수밖에 없다)을 한 덕에 내란까지 이어지는 하나의 고리가 만들어 졌다고도 볼 수 있을 것이다.

이런 저런 생각을 하며 뒤숭숭한 가운데 저녁을 먹으러 갔다. 해물탕과 굴전을 먹으면서, 김종대님의 흥미진진한 말씀을 들었다. 군인들 얘기 등등을 들으니 헌법존중~~ TF 같은 걸 그냥 줄 세우기라고 평면적으로 평가하는 게 얼마나 게으른 일인지 알 수 있었다.

그런 얘기를 하다가 결국 AI 얘기로 빠졌는데… AI 담론, 정확히는 AGI 담론이 과장돼있다는 얘기로 시작을 했다. 요지는 아래의 글과 같은 얘기다.

샘 올트먼, 일론 머스크와 구글 등 미국의 거대 빅테크들이 한결같이 AGI를 목표로 치열한 AI 경쟁을 하는 것은 잘 알려져 있다. 이들이 새로운 버전의 AI 제품을 출시할 때마다 인간의 능력에 얼마나 가까워졌는지를 매번 강조하며, 앞으로 AGI에 도달할 시간이 얼마 남았는지 점을 치기도 한다. AGI라는 성배를 먼저 움켜쥔 기업과 국가는 엄청난 수익과 권력을 확보할 뿐만 아니라 다른 기업과 국가에 아무것도 남기지 않고 AI의 게임 규칙을 독점하게 된다는 것이 이들의 주장이다.

하지만 정말 그럴까? 최근 ‘포린어페어스’는 ‘AGI 환상에 치르는 대가’라는 기고를 통해, AGI가 무엇인지에 대한 제대로 된 합의도 없는 상황에서 AGI를 목표로 삼는 것은 오히려 경쟁에서 뒤질 가능성을 높인다고 문제 삼았다. 물론 현재 적자에 시달리는 AI 기업이 AGI라는 원대한 환상을 목표로 내걸면, ‘마케팅 차원’에서 투기적인 벤처 자본으로부터 대규모 추가 자본을 동원하는 데는 확실히 유리하다. 그러나 이는 보이지 않는 신화를 향해 헛된 경주를 하는 것이 될 수도 있다.

여기서 묘한 대조를 보이는 나라가 중국이다. 중국 사기업들은 미국처럼 AGI에 매력을 느끼지만, 중국 정치권은 전체적으로 AGI 경쟁보다는 ‘AI의 실용적 응용’에 방점을 찍고 있기 때문이다. 대표적인 사례가 지난 8월26일 중국 정부가 발표한 ‘AI 플러스’ 행동 심층 실시에 관한 의견이다. 과학기술, 산업, 소비, 민생, 거버넌스, 글로벌 협력 등 분야를 중심으로 AI를 다양하게 응용하겠다는 것이다.

https://www.khan.co.kr/article/202510212027015

이런 얘기하면 보통 AI를 제대로 쓰지도 못하는 놈들이 어쩌구 할텐데, 김종대님은 AI를 상당히 고급지게 사용하는 것으로 알려져 있다. 지난 번에 대선할 때 들은 얘기가 있는데, 토론 답변의 모범답안 같은 걸 만들 때 AI로 잘 다듬었다는 것이다. 그러면 그걸 누가 못하냐 라고 할텐데, 그때 내가 들은 얘기는 AI를 학습을 시켜서 자신의 전용 도구로 만들었다는 거였다. 설마 모델을 파인튜닝해서 쓴다는 건가? GPT api를 발급 받아서… 그런 생각을 했었는데, 오늘 들어보니 오픈인터프리터 혹은 anything llm류의 도구까지 활용하는 듯한 인상을 받았다.

그런 식의 AI 활용에 관한 많은 얘기가 있었는데, 연구자면 그런 활용이 필요하겠지만 평론가 수준에서는 그 정도까지는 안 해도 된다. 나이 문제인 것도 같다. 김종대님은 나이를 먹을수록 AI를 활용해 떨어진 기억 및 추론 능력 등을 보조할 필요가 있다고 주장했다. 나는 하는 일도 그렇고 나이(영포티)도 그렇고 아직은 그렇게까지 안 들어가도 될 거 같다. 그래서 챗gpt에다가 글 쓴 걸 던져주고 반론을 받아 보완을 하고, 모르는 학자나 책 이름을 찾아낼 때 실마리를 얻는 정도로 활용하고 있다고 말했는데, 왠지 스스로 쪼렙이 된 거 같아서 기분이 좀 그랬다.

그래서 나에게 필요한 방식으로… 기사를 하이라이트, 저장, 데이터베이스화 하는 등의 방법을 모색해보고자 했다. 이걸 챗gpt에게 물어보니 여러 대안을 가르쳐 줬는데, 유료 서비스를 쓰고 옵시디언을 연동하는 정도로 해결할 수 있다는 것이었다. 이것까지 AI에 의존하다니… 이런 판국에… AI를 그렇게까지 쓰면 지구가 너무 괴롭지 않을까요 라고 말하는 것은 무리였다.

이상하네. 분명 내란 1년으로 시작을 했는데 AI로 끝나버린, 다분히 2025년 같은 그러한 하루였다.

Posted in: 신변잡기, 잡감 Tagged: 김종대, 내란, 다크투어, 비상계엄, 시사인, 윤석열, 한동훈

영포티 생일 대모험

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

생일 기념 메시지를 보내라고 했더니, 많은 분들이 응해주셨다. 감동이 되는 메시지들이 있었다. 많은 힘이 된다. 감사드린다. 과거 운동권 동료들의 메시지도 있었다. 감사드리고, 늘 그리워 하고 있다. 비슷한 처지인 영포티 혹은 뭐 하여간 그 유사한 분들의 메시지도 있었다. 대개 나도 정신 차려보니 왕따가 돼있다는 내용의… 우리 세상에 복수합시다. I am vengeance, I am the night! 야채라디오 시절부터 함께 한 분들의 메시지도 있었다. 오랜 인연 이어가주셔서 감사드린다. 호주에 사는 실연왕님이 국빈 초청을 해오기도 했는데, 돈과 시간에 여유가 생기면 꼭 만납시다. 저와 내년에 밥을 먹는 것이 목표인 분도 있었다.

그 외 유튜브 채팅창에, 또 댓글에 축하 메시지를 남겨준 분들이 있었다. 공화국 수도에 글을 남겨주신 분들도 있다. 모두 다시 한 번 감사드린다.

낮 일정을 마치고 스스로에게 선물을 줘야겠다는 마음이 별안간 들었다. 선물을 뭘 줄지는 차차 생각해보고, 일단 케이크부터 사기로 했다. 큰 거 사봐야 다 먹지도 못하니 작은 조각 케이크를 사야 한다. 집 근처 단골 테이크아웃 커피 및 빵 가게에 가면 매일 바뀌는 1가지 종류의 조각 케이크가 있다. 오늘은 생크림과 밤이 올라가 있는 치즈 케이크였다. 과일 생크림 케이크를 기대했는데… 하여튼 하나 사가지고 집에 와서 커피와 함께… 그야말로 순삭했다. 카페 주인이 “달아요”라고 했는데, 진짜 달았다. 원래 이렇게 달면 안 되는 거 같은데… 뭐 생일이니까 달아도 되지 않을까 생각했다.

3시간도 못 잔 탓에 오후 6시 넘어서 잠깐 잠들었다. 눈을 뜨니 7시였다. 상암동 일정은 자전거를 타고 가리라 생각했는데, 그럴려면 8시에는 출발해야 했다. 1시간 안에 저녁 식사를 해야 한다. 그런데 생일이니까 뭔가 특별한 것을 먹고 싶지 않겠나. 아침은 스타벅스 베이글, 점심은 햇반에 레토르트 미역국이었다. 그래도 한국인인데 미역국 먹어야지… 근데 그랬으면 저녁은 뭔가 끝장나는 것을 먹어야… 치킨을 시켰다. 그러나 치킨은 8시가 다 되어서야 왔다. 다리와 날개, 갈비뼈 부위를 1조각씩 먹고 자전거를 타고 출발을 하려고… 했으나 밖에 나가보니 비가 오다가 막 그쳤는지 땅이 젖어있는 거였다. 어떤 사람은 우산을 쓰고 있었다. 다시 자전거를 제자리에 놓고 그냥 상암동으로 갔다.

일정을 마치고 나올 때까지 비는 오지 않았다. 도대체 뭐냐? 집에 돌아오면서 고민했다. 혼자 코인노래방을 가는 것으로 영포티다운 생일의 대미를 장식할 것인가, 아니면 타려다 못 탄 자전거를 탈 것인가? 내일은 비가 온다는 얘기도 있어 야밤에 자전거를 타기로 했다. 동네 산책+도심의 야경+한강의 조합을 즐기기 위하여 집에서 여의도 공원까지 간 다음 한강으로 빠지는 루트를 택했다.

그런데 여의도 공원에서 한강으로 나가는 통로 앞에서, 그러니까 파출소 앞에서 어떤 녀석들이 잠시만 기다려 달라며 막는 게 아니겠는가? 옆에 어느 여성이 주저 앉아 있던 데다 녀석들이 무전기를 손에 들고 있기에 경찰이 무슨 작전을 펼치는 중이라고 생각했다. 그러나 분위기가 좀 이상했다. 그래서 무슨 일이냐 물으니, 드라마 촬영 중이니 조금만 기다려 달라고 하는 거였다. 뭐가 어쩌고 어째? 다행히 몇 분 만에 한강으로 이어지는 통로를 통과할 수 있었다. 별 꼴 다 보네…

그렇게 한강으로 나가서 동쪽으로 달린 다음 샛강 루트로 돌아서 안양천 합수부를 거쳐 안양천을 달려 집으로 돌아왔다. 달리면서 많은 생각을 했는데, 뭔가 생각을 하지 말자는 생각을 가장 많이 한 거 같다. 집에 돌아와 치킨을 좀 더 먹으며 이걸 쓰고 있다.

그래도 많은 걸 했네… 이미 집이지만, 그런 생각을 하게 된다. 이제 집에 돌아갈 시간이다. 집에 가자.

Posted in: 신변잡기, 잡감 Tagged: 생일
1 2 … 101 다음 »

최근 글

  • 이대남에 대한 이중잣대라는 이중잣대
  • 안드로이드 에뮬 게임기에서 ES-DE와 Standalone 에뮬레이터 연결 문제
  • 내란 1년
  • 심야노동을 할 거냐 말 거냐
  • 하이퍼 능력주의와 공정 담론

분류

누적 카운터

  • 1,524,948 hits

블로그 구독

Flickr 사진

추가 사진

____________

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

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

Omega WordPress Theme by ThemeHall