2026년 10월 22일 목요일

긴급 PHP 취약점, 내 DokuWiki 웹사이트는 안전한가?

바로 어제, PHP 보안취약점(PHP2Shell)이 발견되어 웹사이트를 다루는 사람들은 바짝 긴장하지 않을 수 없게 되었다. 로그인 없이 외부에서 서버에 원하는 명령을 실행할 수 있는 매우 치명적인 취약점이라 한다.

PHP 보안취약점(PHP2Shell) 관련 기업 보안 대응 수칙 - KISA 보호나라

나는 호스팅어에서 DokuWiki를 설치하여 공식 웹사이트로 사용하고 있다. PHP 8.2.34는 업데이트 대상이라고 하던데...


호스팅어에 접속하여 에이전트 창에 다음과 같이 물어 보았다.

I understand that the PHP 8.2.34 version currently running on my hosting account was built yesterday. However, I would like to confirm whether this build is vulnerable to the critical PHP security vulnerabilities disclosed recently. Could you please confirm whether your PHP 8.2.34 build includes the necessary security patches, even though the displayed version is still 8.2.34? If not, when will the patched version be deployed?

이에 대한 답변은 다음과 같다.

PHP 8.2.34 can already include the required security fix even though the displayed version remains 8.2.34. Hostinger added the protection to the existing PHP builds, and the managed-hosting rollout is complete; if your PHP Info → Build Date is October 21, 2026, or later, that build includes the fix for these vulnerabilities.

You do not need to wait for a newer version number or change PHP versions for this issue. Hostinger’s Security team could not reproduce the vulnerabilities in its managed hosting environment, and firewall protections block attack attempts across all PHP versions.

Read Hostinger’s official PHP2Shell update.

빌드 데이트가 2026년 10월 21일 이후라면 이번 취약점 패치가 적용된 것이고, PHP 버전은 8.2.34를 유지한다고 한다. 이번 보안 이슈에 대해서 상당히 발빠르게 대처함 셈이다. 다만 PHP 8.2는 올해 연말에 보안지원 종료이니, 해가 바뀌기 전에 8.3으로 올릴 것을 권장하고 있다.

만약 집에서 데스크톱 컴퓨터에 적당히 리눅스와 PHP를 설치해 서버를 운영하고 있었다면, 이번 사태에 어떻게 대처했어야 할까? 인터넷에 공개하지 않은 서버라면 그나마 느긋하게 대응할 수 있겠지만, 외부에 공개된 웹 서버라면 이야기가 완전히 달라진다. 취약점의 영향을 확인하고, 보안 패치가 나온 배포판 패키지를 찾아 업데이트하고, PHP와 웹 서버를 재시작하고, 혹시 그사이에 침입 흔적은 없었는지 로그까지 살펴야 한다. 실제 공격 시도가 패치 공개 전부터 나타난 이번 사태 같은 경우라면 정말 진땀나는 일이다. 이런 순간에는 약간의 비용을 들이더라도 서버의 보안과 업데이트를 전문가가 관리해 주는 상용 호스팅 서비스의 진가가 드러난다.

상황 종료!

2026년 10월 21일 수요일

EO1-Museum: USB 메모리를 포기하고 내부 저장공간으로

Electric Objects EO1을 다시 살려 미술 작품을 보여주는 디지털 액자로 쓰는 작업을 계속하고 있다. 지금까지는 PC에서 메트로폴리탄 미술관의 공개 작품 이미지를 내려받아 EO1 화면에 맞게 가공한 뒤, 로컬 웹 서버를 통해 Firefox에서 슬라이드쇼로 보여주는 방식을 사용했다. 이 방법은 이미 꽤 안정적으로 작동한다. 두 기기는 서로 동일한 Wi-Fi 네트워크 안에 있어야 한다.

휴~ 힘들구나. 오늘 나의 기분을 잘 보여주는 그림.


그러나 가능하면 EO1이 PC의 도움 없이 독립적으로 작동하게 만들고 싶었다. 그래서 USB 메모리에서 Linux를 부팅하는 방법도 시험해 보았고, 이번에는 원래 설치되어 있는 Android 4.4에서 USB 메모리를 직접 사용할 수 있는지도 조사해 보았다.

이 과정에서 먼저 해결해야 했던 것이 ADB(Android Debug Bridge)였다. EO1의 micro-USB 단자는 하나뿐이므로 PC와 ADB로 연결하면 OTG 마우스나 USB 메모리를 동시에 사용할 수 없다. 더구나 처음 ADB를 연결하면 다음 사진과 같이 Android가 RSA 인증을 요구하는데, 화면을 터치할 수도 없고 USB 포트는 이미 PC가 차지하고 있으니 OK 버튼을 누를 방법이 마땅치 않았다. USB 허브는 소용이 없다. 왜냐하면 PC가 호스트로 잡히기 때문이다. 여기에서 인증을 완료하지 못하면 ADB shell을 열거나 파일을 전송할 수 없고, ADB를 TCP 모드로 전환하여 Wi-Fi로 접속하는 것도 불가능하다.

무슨 수로 체크박스를 표시하고 OK를 클릭한단 말인가?

결국 이 문제를 해결하기 위해 작은 Android 앱을 하나 만들었다. Accessibility Service를 이용하여 USB debugging 승인 창이 나타났을 때 'Always allow from this computer'를 선택하고 OK 버튼을 눌러 주는 앱이다. Android Studio에서 APK를 빌드하여 EO1에 설치한 뒤 실제로 시험해 보니 제대로 작동했다.

그 결과 ADB 연결에 성공했고, 이어서 ADB를 TCP 5555 포트로 전환하여 Wi-Fi를 통한 접속도 가능하게 만들었다. USB 케이블을 뽑은 뒤에도 PC에서 EO1에 접속하여 shell을 사용할 수 있게 된 것이다. 다만 이 설정은 재부팅 후에는 유지되지 않아, 다시 무선 ADB를 사용하려면 USB로 연결하여 TCP 모드로 전환해야 한다.

여기서 뜻밖의 사실도 하나 발견했다.

uid=0(root) gid=0(root) context=u:r:shell:s0

EO1의 ADB shell이 처음부터 root 권한으로 실행되고 있었다. 별도의 rooting 작업이나 su 명령도 필요하지 않았다. 덕분에 시스템을 변경하지 않고도 커널과 USB 장치의 상태를 상당히 자세히 조사할 수 있게 되었다.

 Shell을 열어서 EO1의 정체를 확인해 보았다.

이제 무선 ADB를 유지한 채 EO1의 micro-USB 포트에 OTG 어댑터와 USB 메모리를 연결해 보았다. USB 메모리는 전혀 인식되지 않는 것처럼 보였지만 실제로는 그렇지 않았다. 커널 메시지를 확인해 보니 USB 장치 자체는 정상적으로 발견되고 있었다.

usb 1-1: new high speed USB device number 7 using fsl-ehci
usb 1-1: device v23a9 pef18 is not supported

더 조사해 보니 이 장치는 class 08, subclass 06, protocol 50으로 인식되고 있었다. 즉 흔히 사용하는 표준 USB Mass Storage 장치임을 EO1이 정확히 알고 있었다. 문제는 그 다음 단계였다. USB 메모리를 block device로 취급하기 위해 필요한 SCSI 계층과 USB mass-storage 지원이 커널에 포함되어 있지 않았고, 따라서 /dev/sda와 같은 block device가 만들어지지 않았다.

마지막으로 실행 중인 EO1 커널의 /proc/config.gz를 꺼내 조사했다. 결정적인 설정은 다음과 같았다.

# CONFIG_SCSI is not set

즉 포맷이나 Android의 자동 마운트 기능에 문제가 있었던 것이 아니다. EO1의 기본 커널 자체가 일반적인 USB mass storage를 디스크로 사용하기 위해 필요한 SCSI 계층 없이 만들어져 있었다. 키보드와 마우스가 USB OTG에서 잘 작동하면서 USB 메모리만 사용할 수 없었던 이유도 이것으로 설명된다.

물론 커널을 다시 컴파일하는 방법도 있을 것이다. EO1은 i.MX6 계열의 ARM 프로세서를 사용하므로 PC의 Linux 환경에서 적절한 소스와 cross compiler를 이용하여 커널을 만들 수 있다. 그러나 단순히 미술 작품을 보여주기 위해 커널까지 교체하는 것은 일이 너무 커진다. 잘못된 커널을 내부 eMMC에 기록하면 멀쩡하게 작동하는 EO1을 부팅하지 못하게 만들 위험도 있다.

그런데 여기까지 조사하고 나니 훨씬 간단한 길이 보였다.

EO1에는 약 2.38 GB의 Android 사용자 저장공간이 있고, 현재 약 960 MB가 비어 있다. PC에 USB 케이블로 연결하면 이 공간을 볼 수 있으며, ADB를 이용해서도 파일을 복사할 수 있다. 그렇다면 굳이 USB 메모리가 필요할 이유가 없다.

PC
 |
 |  adb push
 v
EO1 내부 저장공간
 |
 +-- images/
 +-- metadata.json
 +-- exhibition.json
 |
 v
EO1-Museum Android app
 |
 v
1080 x 1920 fullscreen display

현재 EO1-Museum은 MetBoot가 부팅 완료를 감지하여 Firefox를 실행하고, Firefox가 PC의 로컬 웹 서버에 접속하여 작품을 보여주는 구조이다. 이것도 잘 작동하지만 PC와 Wi-Fi가 항상 필요하다.

다음 단계에서는 아주 작은 Android 디스플레이 앱을 직접 만들어 볼 생각이다. 내부 저장공간의 특정 디렉터리에 있는 JPEG 이미지를 읽어 전체 화면으로 보여주고, 예를 들어 15초마다 다음 작품으로 넘어가게 하면 된다. 처음에는 그것만으로 충분하다.

잘 작동한다면 나중에 부팅 후 자동 실행, 작품 순서의 무작위화, 메타데이터 표시, 밝기 조절, 가로로 긴 작품의 천천히 움직이는 화면 같은 기능을 하나씩 더할 수 있다. 예전에 EO1을 위해 만들어진 오픈소스 Android 앱(spalt/EO1)의 코드도 참고할 수 있을 것이다.

재미있는 것은 여러 방향을 돌아본 끝에 오히려 구조가 단순해졌다는 점이다. Linux를 설치할 필요도 없고, USB 메모리를 인식시키기 위해 커널을 고칠 필요도 없다. 완성된 상태에서는 Firefox도, PC의 웹 서버도, 심지어 Wi-Fi도 필요하지 않을 수 있다.

그림을 내부 저장공간에 넣고 그것을 전체 화면으로 보여주는 Android 앱 하나.

어쩌면 그것이 내가 개발하는 EO1-Museum의 가장 자연스러운 모습일지도 모르겠다.

2026년 10월 20일 화요일

Electric Objects EO1 되살리기: EO1-Museum, 그리고 신조어 '미술정보학'

이로써 GitHub의 여덟 번째 리포지토리가 만들어졌다. 먼지만 뒤집어쓰고 있던 전자액자 EO1을 어떻게 해서든 활용해 보자고 마음을 먹고 조사에 착수한 것이 지난 토요일. 오늘이 화요일이니 정말 최단 시간에 실제 활용 가능한 형태의 '해킹' 결과물이 나왔다.

EO1-Museum - Repurposing an Electric Objects EO1 as an open-access museum display.

이 모든 것은 바닥부터 시작한 것은 물론 아니다. 인터넷에 성공담을 올려 준 여러 선구자와 인공지능 덕분이었다.


아직 몇 가지 개선 아이디어가 남아있다. EO1의 웹브라우저 테두리를 없앤다든가, 종횡비가 맞지 않는 경우 이미지의 높이를 디스플레이에 딱 맞게 한 뒤 옆으로 흐르게 한다는가.

'오늘은 어떤 그림을 다운로드하여 표현해 볼까?' 지금은 이 질문에 대하여 간단한 키워드 조합으로만 작품을 선택하게 되어 있다. 예를 들어 '피카소의 청색 시대 작품을 보여줘'라는 지시에 맞게 작동하려면 약간의 인공지능 기술을 넣어야 한다. 물론 피카소는 1973년에 사망했으니 아직 사후 70년이 지나지 않았기 때문에 그의 작품은 2044년이나 되어야 저작권이 만료되어 퍼블릭 도메인이 될 수 있다. 검색 기술보다 박물관이 제공하는 디지털 이미지의 이용조건을 명확히 알야 하는 것이 더 큰 문제이다. 결국 미래의 EO1-Museum에는 “무엇을 보여줄 것인가”를 이해하는 지능뿐 아니라, “무엇을 보여주어도 되는가”를 판단하는 능력도 필요하다.

해외 미술관만 바라볼 필요도 없다. 우리나라의 국공립 박물관과 미술관에도 방대한 소장품과 디지털 이미지가 축적되어 있다. 일부 기관은 이미 공공누리 등의 조건에 따라 소장품 이미지를 내려받아 활용할 수 있도록 하고 있다. 다만 기관마다, 그리고 작품마다 이용 조건이 다르고 현대미술 작품에는 아직 저작권이 살아 있는 경우도 많다. 앞으로 이러한 이미지와 메타데이터가 기계가 읽을 수 있는 형태로 더 많이 공개되고 이용 조건까지 명확하게 표시된다면, EO1-Museum에서도 ‘오늘은 조선 후기의 산수화를 보여줘’와 같은 말 한마디로 우리 미술을 찾아 작은 전시를 구성하는 일이 가능할 것이다. 결국 필요한 것은 이미지의 공개뿐만 아니라 작품 정보와 이용 권리를 함께 알 수 있는 데이터의 공개이다.

생명정보학(bioinformatics)이 있고 음악정보학(music informatics)이 있다면, 이런 일을 ‘미술정보학’이라고 불러도 되지 않을까? 궁금해서 찾아보니 영어권에는 Art Informatics라는 표현이 간헐적으로 쓰인 사례가 있었다. 그러나 영어의 art는 우리말 ‘미술’보다 범위가 넓어 문학이나 공연예술까지 아우를 수 있으므로 이를 곧바로 미술정보학이라고 옮기기는 어렵다. 내가 말하는 ‘미술’의 범위를 좀 더 정확하게 영어로 표현한다면 Fine Arts Informatics 또는 Visual Arts Informatics 정도가 될 것이다. 적어도 내가 찾아본 범위에서는 ‘미술정보학’이라는 우리말이나 이와 정확히 대응하는 영어 표현이 독립된 학문 분야의 이름으로 널리 자리 잡은 흔적은 발견하지 못했다.

그렇다면 한번 써 보자. 내가 생각하는 미술정보학은 작품을 단순히 디지털 이미지로 만드는 일이 아니다. 미술 작품과 작가에 관한 데이터를 수집하고, 메타데이터로 기술하고, 컴퓨터로 검색하고 분류하며, 인공지능을 이용하여 작품의 맥락을 이해하고, 저작권과 이용 조건을 판단하고, 그 결과를 이용하여 새로운 방식으로 작품을 발견하고 감상하게 만드는 일까지를 포함한다. 우리나라 공공 미술관과 박물관이 소장품 이미지와 메타데이터, 그리고 각각의 이용 조건을 기계가 읽을 수 있는 형태로 더욱 적극적으로 공개한다면 할 수 있는 일은 훨씬 많아질 것이다. 

낡은 EO1 하나를 되살려 세계의 미술관을 연결해 보려던 작은 프로젝트가 뜻밖에도 미술과 데이터, 정보기술이 만나는 지점까지 나를 데려왔다. 돌이켜보면 그 출발점에는 생명과학 데이터를 다루는 나의 업무가 있었고, 취미로 즐겨 온 음악과 정보기술의 결합도 있었다. 생명정보학에서 출발하여 음악정보학을 기웃거리다가 이제 미술에까지 왔다. 나는 일단 이 새로운 활동을 ‘미술정보학’이라고 불러 보기로 했다.

2026년 10월에 MP3 플레이어를 구입하다

휴대폰으로 못 하는 일이 없게 된 요즘, 여전히 MP3 플레이어를 사는 사람들이 있다. 음원을 준비하여 기기에 넣는 과정이 번거롭지만, 오로지 감상 자체에만 집중할 수 있기 때문이다. 정신을 어지럽히는 소셜 미디어도, 자꾸 들여다보게 되는 비생산적인 화면도 없다. 음악이면 음악, 라디오면 라디오. 

나도 그런 이유로 MP3 플레이어를 구입한 사람 중의 하나가 되었다. 가격도 무척 싸다. 단, 메모리 가격이 요즘 너무 올라서 따로 갖고 있는 microSD 카드를 넣어야 했던 것은 함정이다. 광고에서는 마치 16GB의 기본 메모리가 포함된 것처럼 오해를 불러일으키게 만들어 두었다.



이번에 MP3 플레이어를 사게 된 것은 실은 어학 공부(영어) 때문이다. 사실 귀에다 뭔가를 꽂은 상태에서 뭔가를 중얼거리면서 살게 될 것이라고는 생각하지 못했다. 지금까지 단 한 번도 그래 본 적은 없었다. 학교에 다니던 시절부터 진작에 영어 회화 공부에 관심을 가졌더라면 얼마나 좋았을까? 그랬다면 지금 더 넓은 세상을 만날 수 있었을텐데.

지금 어떤 온라인 강좌를 듣고 있는지 여기에 밝히기는 부끄럽다. 강좌를 학습하고, 유튜브로 제공되는 녹음본을 다운로드하여 MP3 플레이어에서 반복하여 들음과 동시에 승용차로 출퇴근하는 동안에는 ChatGPT를 이용한 연습도 지속적으로 실시하고 있다. 유튜브 다운로드에는 명령행 도구인 yt-dlp를 사용한다.

요즘 젊은 세대의 어학 실력은 우리 세대보다 훨씬 나은 것 같다. 인터넷이나 '미드' 등을 통해 영어 환경에 자연스럽게 노출되고, 영어 학습도 문법이나 어휘 및 지필시험 중심에서 실제 활용을 중시하는 방향으로 많이 바뀌었기 때문이다. 이러한 변화에 따라 대학원 입시나 졸업 요건 등에서 일정 수준 이상의 공인영어시험 성적을 요구하게 된 것으로 보인다.

내가 마지막으로 본 영어 시험은 대학원 졸업 자격 획득을 위한 자체 지필고사가 전부였다. 이것이 TOEIC, TOEFL, 그리고 나중에 등장한 TEPS 등의 공인영어시험으로 대체된 것은 훨씬 뒤의 일이었다. 내가 지금까지 커리어를 유지하면서 공인영어시험 성적은 전혀 필요하지 않았다. 더군다나 국외 연수 경험이 없는 순수 국내파였던 나는, 문서로서 영어를 읽거나 이따금 쓰는 것 말고는 실제 영어 활용 능력을 기르려는 동기 자체가 부족하였음을 고백하지 않을 수 없다.

커리어 차원에서 이제 내려갈 일만 남은 지금, 오히려 영어에 대한 필요성을 더욱 강하게 느끼는 이 역설적인 현상을 어떻게 설명할 수 있을까? 생각해 보면 그렇게 이상한 일도 아니다. 젊었을 때는 영어가 시험을 통과하고 지식을 얻기 위한 도구였다면, 지금의 영어는 사람을 만나고 내가 가진 생각을 전하기 위한 도구이기 때문이다.

더 이상 영어 점수로 증명해야 할 것도 없고, 영어를 잘한다고 해서 승진할 일도 없다. 그런데 바로 그렇기 때문에 지금의 영어 공부가 더 절실하게 느껴지는지도 모르겠다.


2026년 10월 19일 월요일

Electric Objects EO1을 다시 살리는 사람들

Electric Objects EO1을 원래 서비스와 관계없이 활용하려는 시도는 이미 오래전부터 있었다. 이번에 EO1을 다시 사용해 보면서 특히 도움이 된 자료는 두 가지였다. 시간 순서로 보면 Darius Kazemi의 Hack Your EO1이 먼저이고, 그 뒤에 Christian Boyle의 eo1-workaround가 이어진다.

Hack Your EO1 — Darius Kazemi

먼저 참고한 것은 Darius Kazemi가 Feel Train 블로그에 2015년 9월 공개한 Hack Your EO1이다. 이 글은 EO1을 단순한 디지털 액자가 아니라 Android 4.4.2 KitKat이 돌아가는 하나의 컴퓨터로 바라본다.

EO1 뒷면의 micro-USB 단자에 OTG 어댑터와 USB 허브를 연결하여 키보드와 마우스를 사용할 수 있고, Windows 키와 B를 함께 누르면 Android의 기본 웹 브라우저를 실행할 수 있다는 매우 중요한 정보도 이 글에서 소개한다. 브라우저에서 APK를 내려받아 직접 설치하거나, Startup Manager를 이용하여 특정 앱을 부팅할 때 실행시키는 방법도 다룬다.

엊그제 EO1을 만지면서 OTG 허브에 키보드와 마우스를 연결하고 Win+B를 눌러 브라우저를 띄웠던 것도 바로 이 방법을 따른 것이다. 오래된 전자액자 안에 멀쩡한 Android 컴퓨터가 숨어 있다는 사실을 알려 준, 이번 작업의 출발점과 같은 글이었다.

참고: Darius Kazemi / Feel Train — Hack Your EO1

이 글은 Electric Objects의 서비스가 살아있던 시절 작성되었다. 당시에는 이를 이용하여 임의의 URL을 EO1으로 내보내는 것이 가능하였다. 그러나 지금은 다른 방법을 찾아야 하고, 몇 시간의 노력 끝에 같은 Wi-Fi 네트워크 내에 있는 PC 서버에서 제공하는 웹사이트를 EO1에서 디스플레이하는데 성공하였다.

eo1-workaround — Christian Boyle

그 다음으로 직접적인 도움이 된 것은 Christian Boyle의 eo1-workaround이다. GitHub에 공개된 이 프로젝트는 제목 그대로 서비스가 중단된 EO1을 다시 사용할 수 있도록 하는 우회 방법을 제시한다.

여기에서도 EO1에 USB 허브와 키보드·마우스를 연결하고 Win+B로 기본 브라우저를 여는 방법을 사용한다. 그 다음 Firefox를 APK 형태로 내려받아 설치하고, 웹페이지를 이용하여 사진이나 이미지를 EO1 화면에 표시한다.

특히 흥미로웠던 것은 Firefox를 사용하는 이유였다. EO1에 들어 있는 오래된 Android 기본 브라우저보다는 Firefox가 Fullscreen API를 지원하기 때문에 브라우저의 메뉴나 주소창이 없는 디지털 액자다운 화면을 만들기에 유리하다.

실제로 이번 작업에서도 이 아이디어를 따라 구형 Android에서 동작하는 Firefox 68을 설치했다. Firefox의 홈페이지를 PC에서 실행하는 로컬 웹 서버 주소로 지정했더니 EO1을 껐다 켜도 그 설정이 유지되었다. 결국 Firefox는 이번 시스템의 실제 디스플레이 역할을 맡게 되었다.

Firefox 앱을 설치하는 과정에서 한 가지 작은 장애물도 있었다. EO1의 브라우저에서 http://PC주소:8000/something.apk처럼 APK 파일의 주소를 직접 열면 파일 자체는 다운로드되지만, Android가 이를 설치 가능한 APK로 제대로 인식하지 못해 “Can’t open file”과 같은 문제가 발생했다. 원인은 Python의 기본 python -m http.server 8000이 이 환경에서 .apk 파일을 Android가 기대하는 MIME 형식으로 전달하지 못했기 때문이었다. 그래서 작은 server.py를 만들어 .apk 확장자에 application/vnd.android.package-archive라는 MIME type을 명시하고, 이 서버를 대신 실행하였다. 그 뒤에는 같은 주소에서 APK를 내려받아 정상적으로 설치할 수 있었다. 결국 server.py는 별도의 복잡한 웹 서버가 아니라, 오래된 Android가 APK 파일을 올바른 설치 패키지로 알아보도록 HTTP 응답의 파일 형식을 정확히 알려 주기 위한 작은 보완책이었다.

참고: Christian Boyle / GitHub — eo1-workaround

두 프로젝트에서 나의 MetBoot까지

두 자료를 시간 순서와 역할로 놓고 보면 꽤 자연스럽게 연결된다. Darius Kazemi의 글이 EO1의 Android 내부로 들어가서 키보드, 마우스, 브라우저와 APK를 사용하는 기본적인 방법을 보여 주었다면, eo1-workaround는 그 방법을 이용하여 원래 Electric Objects 서비스가 사라진 뒤에도 EO1을 웹 기반 디지털 디스플레이로 사용하는 구체적인 방법을 보여 주었다.

이번에 내가 한 작업도 처음에는 거의 같은 길을 따라갔다. OTG 키보드와 마우스로 EO1에 접근하고, Win+B로 브라우저를 열고, APK를 sideload하고 Firefox를 설치했다.

다만 마지막 단계는 조금 달라졌다. The Metropolitan Museum of Art의 공개 작품을 PC에서 자동으로 내려받아 로컬 웹 서버로 제공하고, EO1에서는 Firefox로 그 페이지를 표시하도록 만들었다. 그리고 EO1이 켜지면 Firefox를 자동으로 실행시키기 위해 Android 4.4(API 19)에서 작동하는 아주 작은 앱인 MetBoot까지 직접 만들었다. 여기까지 오게 될 줄 누가 알았겠는가?

따라서 이 작은 프로젝트의 계보를 한 줄로 적는다면 다음과 같다.

Hack Your EO1 → eo1-workaround → MetBoot + The Met local gallery

처음에는 오래된 전자액자 하나를 다시 써 보자는 생각이었는데, 결국 OTG, Android 4.4, APK sideload, Firefox, Python 웹 서버, Android Studio까지 건드리게 되었다. 하지만 앞서 이런 기기를 열어 보고 기록을 남긴 사람들이 있었기에 가능한 일이었다.

주소창이 드러나지 않도록 이미지를 스크린 전체에 표시하거나 설명을 보여주는 것, 그리고 가로 형태의 사진은 옆으로 흐르듯이 보여주는 것 등 추가할 기능이 더 있다.


다음의 목표는 Wi-Fi가 없는 환경에서도 쓸 수 있도록 USB 메모리에 사진을 담아서 이를 표시하게 만드는 일이다. 쉽게 될 것이라고는 생각하지 않는다.

2026년 10월 17일 토요일

Electric Objects EO1 전자액자를 되살려 보자

Electric Objects EO1이라는 전자액자를 우연한 기회에 구하여 잠깐 사용해 보았던 것이 2019년이다. 휴대폰 앱을 통해서 서버로 사진을 업로드하면 이를 와이파이로 접속한 상태에서 1080x1920의 세로 포맷의 이미지를 보여주던 물건이었다.


사진 출처는 내 블로그이다(링크). 잠깐 사용했던 초소형 푸시풀 진공관 앰프가 보인다. 

그 후 EO1에 대한 관심이 떨어져서 몇 년을 방치해 두었다가 다시 활용 가능성을 알아보기로 하였다. 이미 앱은 서비스가 되지 않는 상태였다. 전원을 넣어 보니 다음과 같이 접속 시도만 하는 상태이다.


2016년에 이를 용감하게 분해하여 정체를 알아 본 사람이 있었다(Electric Objects EO1 Digital Art Display Teardown). Freescale i.MX 6Dual SoC with two ARM Cortex A9 cores(싱글보드 컴퓨터)에 안드로이드가 설치되어 있으며, LCD 패널은 삼성전자 제품이고, 뒷면의 전원 어댑터 잭 바로 곁에 위치한 micro-USB가 USB OTG를 지원한다는 것까지를 확인하였다고 한다. Freescale은 2015년에 NXP에 인수되었다.

ChatGPT에게 물어보니 OTG를 꽂아서 키보드를 연결한 뒤 Windows + B 버튼을 누르면 웹브라우저가 뜬다고 하였다. 서랍 속을 뒤지면 micro-USB OTG가 있지 않을까?


그렇다. 용케 필요한 물건을 이미 갖고 있는 것을 확인하였다. 그러나... 이것을 꽂으면 어댑터를 꽂을 수가 없다! 그래서 늦은 밤에 다이소에 가서 micro-USB <-> USB-C 젠더를 사 가지고 돌아왔다. USB type-C의 OTG는 갖고 있었기 때문. 하지만 이것으로는 키보드가 작동하지 않았다. 너무 여러 단계의 접속을 거쳐서 문제가 되는 것 같았다. NumLock, CapsLock을 아무리 눌러도 LED가 들어오지 않았다.

결국 위 사진의 것을 칼로 가공하여 커넥터 가까운 쪽에서 케이블을 꺾을 수 있게 만든 뒤 전원 어댑터를 꽂았다.


USB 키보드를 연결하니 CapsLock 키를 눌렀을 때 불이 들어온다. 그러면 키보드는 인식이 잘 된다는 뜻이다. Windows + B 키를 눌러 보았다. 



오! 가능성이 있다. 와이파이도 잘 인식된 상태였다. Ctrl + L을 눌러서 주소창에 네이버를 입력해 보았으나 보안 경고가 나왔다. 브라우저가 너무 오래된 것이 문제이다. HTTPS를 사용하지 않도록 만들어진 테스트용 사이트인 http://neverssl.com을 접속해 보니 다음과 같이 창이 열렸다. HTTPS가 아니라 HTTP여야 한다. USB 허브를 중간에 꽂으니 마우스 포인터도 나타났다.


세상을 향하여 창은 열려 있지만, EO1을 돌리는 구형 Android 브라우저가 현대 HTTPS/TLS와 호환되지 않는 것이 문제이다. 

자, 이 전자액자를 2026년 현재 어떻게 활용할 것인가? EO1의 LCD(삼성 LTM230HL07, 23인치, 1920x1080 PLS)에 맞는 컨트롤러를 구해서 LCD를 HDMI 모니터로 사용하는 것이 가능하다고 한다. 그러나 그렇게까지 침습적인 방법까지는 쓰고 싶지 않다. 

또 다른 가능성은 휴대폰이나 PC에서 웹서버를 띄운 뒤 EO1에서 접속하여 사진 디스플레이 등의 용도로 사용하는 것이다. 바이브 코딩으로 index.html과 이미지 일괄 리사이즈용 파이썬 스크립트를 만든 뒤, PC에서 로컬 웹서버를 실행하였다. 집 안의 동일한 와이파이 네트워크에서만 사용하는 것이므로 여기서는 HTTPS가 아닌 HTTP로 접속하도록 하였다. 다음은 EO1의 웹브라우저에서 PC의 웹서버에 정상적으로 접속이 됨을 확인한 화면이다.



구글 포토에서 최근에 찍은 사진을 몇 장 다운로드한 뒤 일괄 리사이즈 명령을 실행한 후 EO1에서 접속해 보았다. 성공이다!


좀 더 적극적인 활용 방법은 EO1에서 Linux를 구동하는 것이다. EO1은 ARM 기반의 i.MX6 프로세서를 사용하므로 적절한 Linux 이미지를 USB 메모리에 기록한 뒤, micro-USB OTG 허브를 통해 USB 메모리와 키보드 등을 연결하여 Linux로 부팅에 성공하였다는 경험담이 존재한다. 

이는 내장 Android를 지우지 않고 외부 USB에서 Linux를 실행할 수 있다는 점이 장점이다. Linux가 정상적으로 부팅되면 EO1은 더 이상 단순한 디지털 액자에 머물지 않고 SSH 접속, Python 프로그램 실행, 웹서버나 정보 대시보드 운영 등에 사용할 수 있는 작은 ARM Linux 컴퓨터가 된다. 다만 아무 ARM Linux 이미지나 사용할 수 있는 것은 아니며 EO1의 i.MX6 하드웨어에 맞는 부트로더와 커널을 갖춘 이미지가 필요하다. 이는 또 별도의 프로젝트가 될 것이다. 

2015년 빌드된 EO1의 커널.


메트로폴리탄 미술관 소장품 다운로드하여 디스플레이하기

EO1에 내가 찍은 사진만 띄우는 것도 좋지만, 디지털 액자라는 물건의 성격을 생각하면 미술관 소장품을 전시하는 용도로도 잘 어울린다. 뉴욕 메트로폴리탄 미술관(The Metropolitan Museum of Art, The Met)은 Public Domain에 해당하는 소장품 이미지와 메타데이터를 Open Access 정책에 따라 공개하고 있다.

The Met은 소장품 메타데이터 전체를 CSV 파일로도 제공한다. 이를 이용하여 Public Domain으로 표시된 회화 작품을 골라낸 뒤, 이미지가 제공되는 작품 중 100점을 무작위로 선택하여 다운로드하는 Python 스크립트를 만들었다.

처음에는 The Met의 Collection API를 이용하여 작품을 검색하려 했으나 검색 API가 HTTP 410(Gone)을 반환하였다. 그래서 Open Access 데이터셋인 MetObjects.csv를 내려받아 작품을 선별하고, 개별 작품의 이미지 주소를 얻는 데에만 API를 이용하는 방식으로 바꾸었다. CSV 파일은 처음 한 번만 내려받으면 된다.

다운로드한 이미지는 EO1 화면에 맞추어 1080 × 1920 픽셀로 변환하였다. 원본의 종횡비는 그대로 유지하고 남는 부분에는 검은 여백을 넣었다. 이렇게 만든 이미지 목록을 images.js에 기록하고, index.html에서 일정 시간 간격으로 무작위로 바뀌어 표시되도록 하였다.

마지막으로 이미지가 들어 있는 디렉터리에서 다음과 같이 간단한 웹서버를 실행하였다.

python -m http.server 8000

EO1과 PC가 같은 Wi-Fi에 연결되어 있다면 EO1의 웹브라우저에서 http://PC의-IP주소:8000으로 접속하면 된다. 집 안의 로컬 네트워크에서만 사용하는 것이므로 여기서는 HTTPS를 사용하지 않았다. 오히려 오래된 Android를 사용하는 EO1에서는 최신 HTTPS 사이트 접속에 문제가 있기 때문에 단순한 HTTP 서버가 편리하다.

결과적으로 별도의 앱을 설치하거나 EO1의 운영체제를 개조하지 않고도, 원래의 웹브라우저만 이용하여 The Met의 회화 작품을 차례로 보여주는 디지털 액자로 다시 사용할 수 있게 되었다. 서버 쪽의 이미지와 HTML을 바꾸면 EO1에서는 페이지를 다시 불러오는 것만으로 새로운 내용을 표시할 수 있다.

여가를 위한 프로젝트가 하나 더 늘어났다.

2026년 10월 11일 일요일

물건은 남는데 정보는 먼저 사라진다

이 글은 GitHub에 추가한 SyX2ool 프로젝트의 Background and Modification(BACKGROUND.md)을 국문으로 옮긴 것이다.

ChatGPT 자동 생성 이미지.

Korg X2와 SyX2ool을 만들게 된 이야기

Korg X2와 X3가 출시된 1990년대에는 3.5인치 플로피 디스크가 신시사이저와 컴퓨터 사이에서 데이터를 주고받는 평범한 수단이었다. 특히 내장 시퀀서를 갖춘 워크스테이션급 신시사이저에서 플로피 디스크 드라이브는 단순한 부가 기능이 아니었다. 곡과 시퀀스, 음색을 비롯한 사용자 데이터를 저장하고 다시 불러오는 중요한 장치였다.

30여 년이 지난 지금은 상황이 달라졌다. 신시사이저 본체는 여전히 멀쩡하게 작동하는데 플로피 디스크 드라이브가 먼저 고장 나는 일이 생긴다. 드라이브가 살아 있다고 해도 요즘 컴퓨터에서 플로피 디스크를 사용하는 것 자체가 매우 번거롭다.

한 가지 해결 방법은 원래의 플로피 디스크 드라이브를 Gotek 같은 플로피 에뮬레이터로 교체하는 것이다. 과거의 디스크 기반 작업 방식을 그대로 유지하려면 아마 이것이 가장 간단한 방법일 것이다. 그러나 나는 플로피 디스크 드라이브를 교체하지 않고 어디까지 할 수 있는지가 궁금했다.

플로피 디스크라는 통로를 제외하면 X2/X3와 현대의 컴퓨터를 이어 주는 가장 중요한 통로는 MIDI 포트가 된다. 일반 MIDI 메시지로 연주 정보를 주고받을 수 있고, System Exclusive(SysEx) 메시지를 이용하면 해당 신시사이저에 고유한 데이터까지 주고받을 수 있다.

이 과정에서 오래전에 만들어진 Java 프로그램인 X3File2Sysex가 큰 도움이 되었다. 다행히 예전에 보관해 둔 Korg 디스크 파일도 있었다. X3File2Sysex를 이용하면 디스크의 데이터(.PCG, .SNG)를 SysEx 형태로 바꾸어 MIDI를 통해 신시사이저로 전송할 수 있었다.

이것이 특히 중요했던 것은 X2의 내장 백업 배터리를 교체했을 때였다. 배터리를 교체한 뒤 X2를 다시 제대로 사용할 수 있는 상태로 만들려면 Preload Data 디스크의 데이터를 다시 올려야 했다. 그런데 플로피 디스크 드라이브가 고장 난 상태에서는 원래의 복구 방법을 사용할 수 없었다. X3File2Sysex와 MIDI 연결을 이용하니 필요한 디스크 데이터를 SysEx로 바꾸어 X2에 전송하는 방법으로 이 문제를 해결할 수 있었다.

이 경험을 통해 고장 난 플로피 디스크 드라이브를 우회하는 통로로 SysEx를 충분히 활용할 수 있다는 것을 알게 되었다. 그러나 기존 도구에는 한계도 있었다. 이미 준비된 데이터를 복원하는 것은 가능했지만, X2에서 덤프한 시퀀서 데이터를 자유롭게 들여다보고 수정하거나 다른 형식으로 바꾸어 다시 이용하는 것은 또 다른 문제였다.

오래전에 받아 둔 파일이 다시 귀중한 자료가 되다

지금 생각하면 정말 운이 좋았다. 아주 오래전에 어느 웹사이트에서 Korg X2/X3용 디스크 파일을 모아 놓은 ZIP 파일을 발견하여 받아 두었기 때문이다. 지금은 그 자료가 있던 웹사이트의 흔적조차 찾기가 쉽지 않다.

당시에는 그 파일을 보관해 둔 것이 특별히 중요하다고 생각하지 않았다. 그러나 수십 년이 지난 뒤 그것은 매우 귀중한 시험 자료가 되었다.

그 안에는 실제 Song과 User Pattern, Program, Drum 데이터 등 X2/X3에서 사용하던 여러 종류의 데이터가 들어 있었다. 이 파일들을 실제 X2에서 덤프한 SysEx 데이터와 비교하면서 막연한 추측이 아니라 실제 데이터를 바탕으로 내부 구조를 조사할 수 있었다.

또 하나 결정적으로 중요했던 자료는 Korg X2/X3 Reference Guide였다.

신시사이저를 단순히 연주하는 데에는 별로 눈에 띄지 않는 내용이 이 매뉴얼에는 상당히 자세하게 기록되어 있다. SysEx 명령, 시퀀서 파라미터, 이벤트의 종류, Pattern 관련 기능, MIDI 동작 등 내부 데이터 구조를 이해하는 데 필요한 기술적인 정보가 들어 있다.

물론 Reference Guide만 읽는다고 해서 시퀀서 덤프의 모든 바이트가 저절로 해석되는 것은 아니었다. 하지만 실제 SysEx 파일에서 발견되는 데이터를 이해하는 데 필요한 용어와 구조적인 단서를 제공했다.

결국 Reference Guide, 오래전에 보관해 둔 디스크 파일, X3File2Sysex, 그리고 실제 X2에서 얻은 덤프 데이터를 서로 비교하는 것이 X2/X3 시퀀서 형식을 분석하는 기반이 되었다.

그래서 SyX2ool을 만들기 시작했다

X2에서 시퀀서 데이터를 덤프하고, 기존 SysEx 데이터를 다시 X2로 보내는 것까지는 가능했다. 하지만 나는 덤프 파일을 정체를 알 수 없는 하나의 거대한 바이트 덩어리로 취급하는 데서 그치고 싶지 않았다.

그 안에 무엇이 들어 있는지를 알고 싶었다.

10개의 Song은 어디에 저장되어 있는가? 100개의 User Pattern은 어떤 구조로 들어 있는가? 각 Track과 Event는 어떻게 표현되는가? 그리고 X2/X3의 시퀀서 데이터와 오늘날에도 널리 사용하는 Standard MIDI File(SMF)을 서로 변환할 수는 없을까?

무엇보다도 플로피 디스크 드라이브에 의존하지 않고 현대의 컴퓨터에서 X2/X3의 내장 시퀀서에 좀 더 자유롭게 접근하고 싶었다.

그것이 SyX2ool을 만들게 된 동기였다.

SyX2ool이라는 이름은 SysEx + X2 + Tool을 합쳐 만든 것이다. 처음에는 X2/X3의 ALL SEQUENCE DATA 덤프를 해석해 보는 작은 실험으로 시작했다. 그러나 작업을 계속하면서 Song을 가져오고 내보내고, User Pattern을 추출하고, SysEx 데이터를 분석하고, MIDI와 Pattern 데이터를 실시간으로 신시사이저에서 연주하는 기능까지 갖춘 명령행 도구로 조금씩 발전하게 되었다.

그런 의미에서 SyX2ool은 X2/X3를 대신하기 위해 만든 프로그램이 아니다. 오히려 그 반대다.

오래된 X2/X3에서 원래 가지고 있던 기능을 오늘날에도 조금 더 자유롭게 사용할 수 있게 만드는 것이 목적이다.

하드웨어만 보존한다고 끝나는 것이 아니다

이번 작업을 하면서 또 하나 느낀 점이 있다.

오래된 신시사이저는 그것을 둘러싸고 있던 정보와 소프트웨어 생태계보다 오히려 더 오래 살아남을 수 있다는 것이다.

개인이 운영하던 웹사이트는 사라진다. 다운로드 링크는 끊어진다. 한때 유용했던 작은 프로그램은 더 이상 구하기 어려워진다. 사용자들 사이에서 공유되던 사용법과 기술적인 지식도 조금씩 사라진다.

내 컴퓨터 한구석에 별 생각 없이 보관해 두었던 오래된 파일들이 수십 년이 지난 뒤 X2/X3를 이해하는 데 매우 귀중한 자료가 되었다.

물건은 남는데, 정보는 먼저 사라진다.

SyX2ool 개발에는 이러한 정보의 일부라도 다시 기록하여 남겨 두려는 의미도 있다.


이 '덧붙임' 단락은 GitHub의 문서에는 포함되지 않았다.

덧붙임.1: 이 글을 쓰면서 X3File2Sysex를 지금도 인터넷에서 구할 수 있는지 찾아보았다. 한참 찾다 보니 뜻밖에도 내 오래된 홈페이지(My old synth and MIDI)에 x3file2sysex.zip을 올려 둔 흔적이 검색되었다. 올려 놓은 나 자신도 까맣게 잊고 있었다. 물건뿐 아니라 정보도, 때로는 어디에 보관했는지조차 잊은 채 살아남는다. 😄 


덧붙임.2: 한 시대를 풍미했던 MIDI 관련 MIDI-OX가 최신 Windows 컴퓨터에서 제대로 전송하지 못하는 SysEx를 놓고 얼마나 고민을 하였던가? 그러나 바이브 코딩으로 만든 Syx2ool 파이썬 스크립트는 X2의 설정 상태를 전부 덤프한 꽤 큰 용량의 SysEx 파일을 구렁이 담 넘어가듯 잘만 전송하였다. 

웹 서핑을 하다가 우연히 MIDI-OX의 개발자인 Jamie O'Connell의 자기 소개 정보를 접하였다(링크). 8년 동안 고단하고 힘든 밴드 생활을 하다가 소프트웨어 엔지니어가 되었다는 진솔한 이야기가 실려 있다. 이 웹사이트는 마지막 갱신일이 2003년 7월이다. 그의 GitHub 프로젝트 사이트에도 약간의 활동 내역이 있지만, 시간이 흐를수록 이런 역사적 자료는 점점 사라질 것이다.