2026년 10월 29일 목요일

모네의 그림은 어디에 있을까? EO1-Museum의 발전

요즘 틈틈이 진행하는 EO1-Museum 프로젝트에서는 뉴욕 메트로폴리탄 미술관(The Metropolitan Museum of Art)의 Open Access 데이터를 이용하여 그림을 가져오고 있다. 미술관에서 제공하는 API와 전체 소장품 목록을 이용하여 원하는 화가나 키워드로 작품을 골라 내려받은 뒤, 전자액자의 1080×1920 해상도에 맞추어 변환하여 보여주는 방식이다.

이 작업을 위해 GET_MET_ART_KEYWORD.py라는 파이썬 프로그램도 만들었다. 처음에는 단순한 이미지 다운로드 프로그램이라고 생각했지만, 쓰다 보니 역할은 그보다 조금 더 넓었다. 방대한 공개 컬렉션에서 원하는 조건에 맞는 작품을 찾아내는 작품 디스커버리(discovery) 도구인 셈이다. 르누아르, 피사로, 시슬레 같은 화가를 지정하면 조건에 맞는 그림을 찾아 original 디렉토리에 넣어준다. 미술관이 Open Access로 공개한 자료만 대상으로 하므로 저작권 상태를 일일이 확인할 필요도 없고, 이미지 품질도 대체로 훌륭하다. 무엇보다 검색이 빠르다.

그런데 모네(Claude Monet)를 검색하면서 이상한 점을 발견했다. 그림이 너무 적었던 것이다.

처음에는 프로그램을 잘못 만들었다고 생각했다. 인상주의를 대표하는 화가인 모네의 작품이 메트로폴리탄 미술관에 거의 없을 리가 없지 않은가. 실제로 검색 결과를 자세히 살펴보니 모네와 관련된 회화 작품은 수십 점이 나왔다. 그런데 내가 사용하고 있는 Open Access 조건을 적용하면 거의 모두 탈락했다.

CSV 파일을 잘못 해석했나 싶어서 API를 직접 조회해 보았지만 결과는 같았다. 메트로폴리탄 미술관의 데이터에서 isPublicDomain이 참이고 내려받을 수 있는 이미지가 있는 작품만 남기면, 내가 기대했던 모네의 그림은 거의 나오지 않았다.

여기에서 한 가지 중요한 사실을 깨달았다. 그림 자체의 저작권과 그 그림을 촬영하거나 스캔해서 만든 디지털 이미지의 이용 조건은 같은 문제가 아니다.

모네는 1926년에 세상을 떠났다. 따라서 그의 회화 작품 자체는 저작권 때문에 접근하기 어려운 대상이 아니다. 하지만 어떤 미술관이 소장 작품의 고해상도 디지털 이미지를 어떤 조건으로 공개하느냐는 별개의 문제다. 내가 필요한 것은 단순히 '저작권이 끝난 그림'이 아니라, 자유롭게 이용할 수 있는 좋은 품질의 디지털 재현물이었다.

그렇다면 The Met 하나만을 작품 디스커버리의 창구로 삼을 이유도 없었다. 다른 공개 컬렉션에서 작품을 발견할 수 있는 두 번째 디스커버리 도구가 필요했다.

그래서 찾아간 곳이 Wikimedia Commons였다.

처음에는 단순할 것으로 생각했다. Commons에서 Claude Monet을 검색해서 Public Domain인 이미지를 받으면 되지 않을까? 그러나 실제로 해 보니 이야기가 훨씬 복잡했다. Category:Claude Monet에는 그림만 있는 것이 아니었다. 모네의 사진, 서명, 묘지, 장례식 사진, 책의 스캔, 전시회 자료까지 온갖 것이 함께 들어 있었다.

작가 이름은 곧 작품 목록이 아니었던 것이다.

Commons의 category 구조를 조금 더 들여다보다가 Paintings by Claude Monet by title이라는 훨씬 유용한 분류를 발견했다. 그 아래에는 개별 작품을 나타내는 category가 무려 319개 있었다. 프로그램이 이 category를 하나씩 방문하여 그 안의 파일을 조사하도록 했다.

하지만 문제는 여기에서도 끝나지 않았다.

하나의 실제 그림에 여러 개의 디지털 이미지가 존재할 수 있었다. 미술관에서 촬영한 것, 오래된 화집을 스캔한 것, 개인이 촬영한 것 등이 같은 작품 아래에 함께 나타난다. 해상도도 다르고 라이선스도 다르다. 따라서 프로그램은 각 작품마다 파일을 조사하여 JPEG, PNG 등의 이미지인지 확인하고, Public Domain 또는 CC0로 명확하게 사용할 수 있는 것만 남긴 뒤, 일정 해상도 이상인 것 가운데 가장 큰 이미지를 하나 선택하도록 했다.

첫 번째 전체 검색에는 꽤 오랜 시간이 걸렸다. 화면에는 319개 작품 category를 하나씩 조사하는 메시지가 끝없이 흘러갔다. 지구 전체를 스캔하는 기분이었다.

결과는 의외로 좋았다. 319개 작품 가운데 231개에서 조건을 만족하는 디지털 이미지를 찾았다.

이 결과는 JSON 파일에 저장해 두었다. 따라서 다음부터는 Wikimedia Commons를 처음부터 다시 뒤질 필요가 없다. 캐시된 작품 목록에서 원하는 수만큼 무작위로 골라 이미지를 내려받으면 된다. 현재는 파일 이름도 Claude_Monet__Water_Lilies.jpg와 같이 화가와 작품명이 그대로 드러나도록 했다.

이렇게 해서 두 번째 작품 디스커버리 도구인 GET_COMMONS_ART.py가 생겼다.

실제로 EO1에 모네 그림 100점을 넣어 돌려 보니 또 하나 알게 된 것이 있다. 해상도가 높다고 해서 반드시 좋은 이미지인 것은 아니다. 어떤 것은 색이 훌륭하고 선명하지만, 어떤 것은 오래된 인쇄물을 스캔한 듯하고 색감도 좋지 않다. 이것까지 프로그램이 판단하게 만들 수도 있겠지만, 굳이 그럴 필요가 있을까 싶었다.

결국 그림은 사람이 보는 것이다.

그래서 마음에 들지 않는 디지털 재현물은 사람이 직접 골라 reject 목록에 넣도록 했다. 다음번 작품 선택에서는 그 그림이 제외된다. 기계가 작품을 발견하고 이용 조건과 해상도를 검사하며, 마지막 품질 판단은 사람이 실제 디스플레이를 보면서 한다. 거창하게 표현한다면 human-in-the-loop curation인 셈이다.

이제 EO1-Museum에는 두 개의 주요 작품 디스커버리 도구가 생겼다.

GET_MET_ART_KEYWORD.py는 The Met이라는 잘 정리된 하나의 미술관 컬렉션을 탐색한다. GET_COMMONS_ART.py는 Wikimedia Commons라는 훨씬 넓고 복잡한 디지털 공유 공간을 탐색한다.

The Met은 정제된 디스커버리(curated discovery), Wikimedia Commons는 광범위한 디스커버리(broad discovery)를 담당한다고 할 수 있다.

The Met의 자료는 빠르고 정돈되어 있으며 품질도 일정하다. Commons는 훨씬 넓지만 복잡하고, 같은 작품에도 여러 파일이 존재하며 품질도 제각각이다. 어느 하나가 다른 하나를 대신하는 관계라기보다 서로 상당히 잘 보완한다.

그리고 여기에서 '디스커버리'라는 말을 쓰는 것이 꽤 중요하다고 생각한다. 이 프로그램들의 목적은 인터넷에서 그림 파일 몇 개를 다운로드하는 데 있지 않다. 수많은 공개 디지털 자료 가운데 내가 전시하고 싶은 작품을 발견하고, 실제로 사용할 수 있는 디지털 재현물을 골라내는 것이 먼저다. 다운로드는 그 과정의 마지막 단계일 뿐이다.

두 곳에서 발견한 자료는 결국 똑같은 길을 간다.

GET_MET_ART_KEYWORD.py 또는 GET_COMMONS_ART.py가 작품을 찾아 original 디렉토리에 넣고, make_gallery.py가 이를 EO1의 세로형 화면에 맞추어 변환한다. 그러고 나면 10년도 더 된 전자액자의 23인치 화면에 모네의 그림이 나타난다.

처음에는 그저 "왜 모네 그림이 이것밖에 없지?"라는 의문에서 시작했다.

그 의문 때문에 메트로폴리탄 미술관의 Open Access 정책을 다시 들여다보고, Wikimedia Commons의 category 구조를 헤매고, 하나의 실제 작품과 그것을 찍거나 스캔한 여러 디지털 파일이 서로 다른 존재라는 것도 생각하게 되었다. 그리고 그 과정에서 EO1-Museum에는 The Met과 Wikimedia Commons라는 두 개의 작품 디스커버리 통로가 생겼다. 그리고 이 취미 수준의 일은, 내가 KOBIC에서 근무하면서 접하는 데이터 관련 업무와 상당히 닮았다. 

전자액자 하나를 되살리려다가 생각보다 먼 곳까지 흘러 왔다. 그리고 그 중간에는 음악 정보학과 드럼 패턴학(drum patternology)가 있었다.

그래도 지금 눈앞에서는 모네의 그림이 조용히 바뀌고 있다.



2026년 10월 27일 화요일

이것이 1978년도 미슐랭 가이드(레드가이드) 실물이다

파주 헤이리 예술마을의 한 베이커리 카페(좋은날 189)에 갔다가 장식용으로 놓인 미슐랭 가이드 《MICHELIN Great Britain and Ireland 1978》를 발견하였다. 당시 미슐랭은 대략 France, Italia, Deutschland, Benelux, Suisse, España/Portugal, Great Britain & Ireland 같은 식으로 국가·권역별 Red Guide를 냈다고 한다. 좋은날 189는 치아바타를 주력으로 하고 있는 것 같았다.



한국 지사에서 사명을 '미쉐린'으로 정함에 따라서 공식 명칭도 미쉐린 가이드로 바뀌었다고 한다. 온라인 시대가 되었으니 이제는 이렇게 두꺼운 책을 찍어서 배포하지는 않을 것이다. 한국어판 온라인 가이드는 여기에 있다. 훌륭한 호텔이나 맛집을 찾아다닐 정도로 내가 여유로운 것은 아니지만, 어쩌다 한번은 사치를 부려도 되지 않을까?

EO1-Museum v0.3에서 비로소 웹브라우저의 굴레를 벗어나다

 


며칠 동안 붙들고 있던 Electric Objects EO1 되살리기 프로젝트가 어제 상당히 큰 고비를 넘었다. 처음에는 서비스가 종료되어 더 이상 쓸 수 없게 된 전자액자에 웹브라우저를 띄우고, PC에서 웹서버를 돌려 그림을 보내는 정도가 목표였다. 그런데 작업을 계속하다 보니 이제는 EO1 안에서 직접 돌아가는 전용 앱까지 만들게 되었다. 이름은 EO1-Museum이다.

처음 만든 방식은 매우 단순했다. PC에서 뉴욕 메트로폴리탄 미술관의 Open Access 작품을 내려받아 EO1 화면 크기에 맞게 가공하고, 웹페이지로 만든 뒤 HTTP 서버를 실행한다. EO1에서는 Firefox를 띄워 그 페이지를 보여주었다. 기본 웹브라우저에서는 시작 웹페이지를 지정하는 것이 어려웠다. 제조사가 서비스를 종료한 기기를 다시 그림 액자로 쓰는 데에는 이것만으로도 충분했다.

하지만 이 방식에는 분명한 한계가 있었다. PC가 계속 켜져 있어야 하고, 웹서버도 돌아가야 한다. 무엇보다 EO1이라는 기기가 스스로 그림을 보여주는 것이 아니라 사실상 PC가 만들어 주는 웹페이지를 원격 화면처럼 표시하는 셈이었다.

그래서 Android용 native gallery를 만들기 시작했다.

v0.1 — EO1 안에 그림을 넣다

JPEG와 PNG 파일을 EO1 내부 저장공간에 넣고 앱이 직접 읽어서 보여주는 것을 목표로 하였다. 미디어 파일은 다음 위치에 저장한다.

/sdcard/EO1-Museum/images/

앱은 이 디렉터리를 검색하여 그림 목록을 만들고 순서를 섞은 뒤 일정 시간마다 다음 작품으로 넘어간다. 이것이 성공하면서 EO1은 처음으로 PC와 완전히 분리된 상태에서도 다시 전자액자로 기능하게 되었다.

v0.2 — 동영상과 소리

다음 단계에서는 MP4 동영상도 같은 미디어 목록에 넣었다. 이미지가 나오다가 동영상 차례가 되면 전체 동영상을 재생하고, 끝나면 다시 다음 작품으로 넘어간다.

Bluetooth 오디오도 정상적으로 작동했다. 한번 페어링한 Bluetooth 장치는 재부팅 뒤에도 다시 연결되었다. 덕분에 EO1은 단순한 그림 액자를 넘어 이미지와 동영상을 함께 보여주는 미디어 디스플레이가 되었다. 오디오 기능은 겉으로 드러나지 않았던 것을 재확인한 것이라서 새로운 개발이 필요하지는 않았다. 소리가 포함된 동영상 재생에 매우 유용할 것이다.

v0.3 — 하나의 앱으로 합치다

어제 가장 큰 변화가 이루어졌다. 기존의 Local Gallery와 PC 기반 Gallery를 하나의 앱 안에 통합했기 때문이다.

PC Gallery를 선택하면 더 이상 Firefox를 실행하지 않는다. EO1-Museum 자체에 WebView를 넣어 PC에서 제공하는 gallery를 앱 안에서 직접 보여준다. 반대로 Local Gallery를 선택하면 EO1 내부에 저장된 이미지와 동영상을 표시한다.

마우스 오른쪽 버튼을 누르면 제어 메뉴가 열린다. 여기에서는 Local Gallery, PC Gallery, Next, Rescan Media, Clock On/Off를 제어할 수 있다. 현재 어떤 Gallery를 사용하고 있는지도 메뉴에서 확인할 수 있다.

이미지 사이에는 cross-fade 효과를 넣었고 화면에는 시계를 표시할 수 있게 했다. 새 파일을 ADB로 전송한 뒤에는 앱을 다시 시작하지 않고 Rescan Media만 선택하면 된다.

그리고 EO1-Museum을 Android의 HOME application으로 지정했다. 이제 전원을 넣으면 Android 바탕화면이나 원래 Electric Objects 프로그램을 거치지 않고 바로 EO1-Museum의 Local Gallery가 시작된다.

이 변화가 가장 마음에 든다. 전원을 넣고 잠시 기다리면 알아서 그림이나 동영상이 나온다. 전자액자는 원래 그래야 한다.

ADB를 여는 작은 열쇠

여기까지 오는 과정에서 의외로 중요한 역할을 한 것이 ADBApprovalHelper.apk였다.

EO1에 새 프로그램을 넣으려면 ADB를 사용하는 것이 가장 편하지만, 최초 USB 연결에서는 Android의 RSA debugging authorization을 통과해야 한다. EO1에서는 이런 시스템 대화상자를 다루는 것이 꽤 불편하다.

그래서 먼저 EO1의 내장 웹브라우저를 이용하여 ADBApprovalHelper.apk를 설치한다. 이때 PC에서는 APK가 Android application package임을 브라우저가 제대로 알아볼 수 있도록 MIME type을 설정한 server.py를 실행한다. ADBApprovalHelper.apk는 EO1 화면에 나타나는 인증 관련 화면에 자동으로 클릭을 해 준다. 이 화면은 ADB를 통해 PC가 연결된 상태에서만 나온다. PC가 host로 잡히기 때문에 중간에 USB hub를 끼운다 해도 마우스 포인터를 EO1에 나타나게 할 수 없다. 그래서 별도의 앱을 만드는 편법을 이용한 것이다.

Helper가 설치되고 USB ADB 연결이 확보되면 그다음부터는 일이 훨씬 쉬워진다. EO1-Museum APK 설치도, 이미지와 동영상 전송도 모두 ADB로 처리할 수 있다.

무선 ADB도 시험해 보았지만 정식 사용 방법에서는 제외하기로 했다. 연결 상태가 한번 꼬이면 오히려 복구하기가 번거롭다. 케이블을 꽂았다 빼야 하는 불편함이 있더라도 유지보수에는 USB ADB가 훨씬 명확하다.

버려진 기기에서 다시 하나의 제품으로

EO1-Museum v0.3까지 오면서 처음의 구조는 상당히 달라졌다.

예전에는

PC → HTTP server → Firefox → EO1 display

였다면 이제 기본 동작은

EO1-Museum → Local media → EO1 display

이다.

PC는 더 이상 필수가 아니다. 필요할 때만 PC Gallery를 선택해서 사용한다.

물론 아직 할 일이 조금 남아 있다. 현재 PC Gallery의 서버 주소는 프로그램에 들어 있으므로, 다음 버전에서는 화면에서 주소를 수정하고 저장할 수 있게 만들 생각이다. 설치 절차와 GitHub repository도 새 구조에 맞게 정리하고 있다.

그러나 기능적으로는 v0.3에서 이미 중요한 선을 넘었다고 생각한다.

2019년 무렵 우연히 얻었다가 제조사의 서비스 종료와 함께 사실상 쓸모를 잃었던 23인치 화면이 이제는 특정 회사의 서버도, 전용 앱도, 심지어 PC도 필요 없이 스스로 그림과 동영상을 보여준다.

처음에는 그저 고장 아닌 고장이 난 전자액자를 다시 켜 보자는 생각이었다.

그런데 어느새 전자액자에 새 프로그램을 만들어 넣고 있다. 이쯤 되면 '되살렸다'고 해도 되지 않을까.

2026년 10월 22일 목요일

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


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

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

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


직접 PHP를 업데이트해야 하는가? 호스팅어에 접속하여 에이전트 창에 다음과 같이 물어 보았다. 어쩌면 호스팅 업체의 기술진이 다 해 놓았을지도 모르는 일이니까 말이다.

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월 23일 업데이트

EO1의 내부 저장공간에 이미지 파일을 복사한 뒤 이를 순차적으로 재생하는 앱(v0.1)을 개발하였다. 이제는 웹브라우저를 쓰지 않기 때문에 테두리가 나타나지 않는다.


2026년 10월 26일 업데이트

EO1 내부 저장공간 모드(Local Gallery)와 PC에서 서비스하는 것을 보여주는 모드(PC Gallery)를 선택할 수 있게 하였다. PC Gallery는 웹브라우저에 의존하지 않으며, 메인 앱에 일체화하였다. 더불어서 오른쪽 위에 시계를 표시하게 하였다. 이러한 설정은 마우스를 통해 제어할 수 있다. 이제 더 이상 다음을 것이 없는 상태로 발전하였으므로, 공식적은 배포판이라 해도 무방하다. 문서만 조금 더 구조화시키면 이번 프로젝트는 종료를 선언해도 된다.

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 등의 공인영어시험으로 대체된 것은 훨씬 뒤의 일이었다. 내가 지금까지 커리어를 유지하면서 공인영어시험 성적은 전혀 필요하지 않았다. 더군다나 국외 연수 경험이 없는 순수 국내파였던 나는, 문서로서 영어를 읽거나 이따금 쓰는 것 말고는 실제 영어 활용 능력을 기르려는 동기 자체가 부족하였음을 고백하지 않을 수 없다.

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

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