2025년 9월 17일 수요일

코딩하기 좋은 비 내리는 날

MIDI controller와 MIDI file player를 하나의 아두이노 나노에서 구현하기에는 너무 벅차다고 생각해서 아두이노 나노(ATMega328)보다 메모리가 조금 더 큰 아두이노 나노 에브리(ATMega4809)를 구입하였다.

쿠팡에서 구입한 '정품' 아두이노 나노 에브리(플래시 메모리 48KB, SRAM 6KB, EEPROM 256byte). 핀에는 마킹이 되어 있지 않지만 전반적으로 매우 고급스럽다. USB 단자도 C-type이다.


이번에 구입한 아두이노 나노 에브리는 호환품이 아니라 정품이라서 가격은 조금 나가는 편이다. MIDI 파일 플레이어를 별도로 구현하면서 오늘도 수십 차례의 컴파일과 업로드 및 테스트를 진행해 보았는데, 이것만으로도 상당한 수준의 메모리를 쓰고 있다. 플레이어 기능은 매우 단순하므로(착각이었음) 따로 떼어내면 아주 수월하게 개발이 되고 또 메모리도 적게 쓰리라 기대했는데 그렇지만도 않다. 

Sketch uses 22346 bytes (72%) of program storage space. Maximum is 30720 bytes.

Global variables use 1544 bytes (75%) of dynamic memory, leaving 504 bytes for local variables. Maximum is 2048 bytes.

두 기능을 합쳐 놓으면 아두이노 나노 에브리의 48KB 메모리에 채워 넣기 위해서 상당한 수준의 '다이어트'를 해야 할 것이다. 곡예 수준의 다이어트를 하지 않으면 불가능할지도 모른다. 이런 현실을 모르고 아두이노 나도 단독으로 개발하려 했으니... 불가능함이 판명되면 두 기능을 각각 별개의 아두이노 나노에 업로드한 뒤 필요에 따라서 소켓에 아두이노를 갈아 끼우는 그야말로 미련한 방법으로 운용해야 한다. 

오늘도 수십 차례의 디버깅이 이루어 지고 있다. 챗GPT를 이용하여 MIDI 파일을 점검 및 처리용 파이썬 스크립트 mid_check.py를 뚝딱 만들었다. 옵션을 사용하는 방법이나 도움말 기능 등에 부족함이 없다. 이걸 그대로 GitHub에 올려도 문제가 없을 것이다.

ChatGPT가 도운 코드를 GitHub에 올리는 것은 도덕적으로 문제가 없으며, 오히려 오픈소스 공유 정신에 부합합니다. 필요하다면 라이선스와 크레딧 표기 정도만 신경 쓰시면 됩니다.

누구나 mid_check.py 정도의 코드는 이제 챗GPT로 만들어 낼 수 있다. 그러니 내가 이를 인터넷에 공개하는 것이 무슨 의미가 있느냐고 되물을 수도 있다. 그러나 챗GPT가 처음부터 실수를 전혀 하지 않는 파이썬 스크립트를 만들어 내지는 않았다. 사람에 의한 검증을 거쳤다는 의미를 부여할 수 있다. 이 작업을 하면서 Windows PowerShell에서 파이썬 인터프리터를 설치하여 쓸 수 있다는 것도 알았다. 간단한 프로그래밍을 할 수 있는 아나콘다/미니콘다 외의 대안으로서 나쁘지 않다.

Nano Ardule + 컴퓨터 + MIDILIFE 2.0은 반주기의 모습을 점점 닮아간다. SD카드에 담긴 format 0 MID file(제목은 8.3 포맷에 맞추어야 함)은 INDEX.TXT 파일을 통해 접근한 뒤 원하는 BPM이나 드럼킷으로 재생하고, 이펙트(리버브)를 조절할 수 있다. 앞서 언급한 mid_check.py는 포맷을 1에서 0으로 전환하고 긴 파일명을 8.3 포맷에 맞춘 뒤 INDEX.TXT 파일을 만드는 것까지 가능하다. 단순 MIDI file player라면 트랙이 별도로 나뉜 포맷 1을 굳이 필요하지 않다. 추가할 기능은 박자에 맞추어 LED를 점멸하게 하는 것과 loop play이다. 그러면 아주 고급스런 메트로놈 대용도 할 수 있다. 

반주기와 흡사한 구성.
 

어제 SD카드에 담긴 INDEX.TXT 파일을 제대로 처리하지 못해서 생겼던 BOM(Byte Order Mark) 문제를 간단히 설명해 보고자 한다. 나는 코드에서 BOM 3바이트를 건너뛰는 방식을 택하였다. 부득이하게 편집기를 이용하여 INDEX.TXT을 만들 때 BOM으로 시작하지 않도록 매번 설정을 건드리는 것이 너무나 불편하기 때문이다.

1) BOM(Byte Order Mark)이란?

BOM은 텍스트 파일의 맨 앞에 붙는 특별한 바이트 시퀀스로, 파일의 문자 인코딩을 알리기 위해 사용됩니다. 가장 흔한 것은 UTF-8 BOM이며 3바이트 0xEF 0xBB 0xBF로 시작합니다. Windows 메모장 등 일부 에디터는 기본 설정에서 BOM을 덧붙여 저장할 수 있습니다.

인코딩 BOM 바이트 비고
UTF-8 EF BB BF 가장 흔함
UTF-16 LE FF FE 2바이트 BOM
UTF-16 BE FE FF 2바이트 BOM


2) INDEX.TXT에서 왜 문제가 되나?

아두이노 등 임베디드 환경에서 INDEX.TXTASCII 또는 BOM 없는 순수 UTF-8로 가정하고 읽을 때, 파일 첫 줄 맨 앞의 BOM 3바이트가 내용으로 들어와 파싱 오류를 유발합니다. 그 결과 첫 파일명이 누락되거나, 비교 구문(strcmp, strncmp)이 실패하고, LCD/로그에 깨진 문자가 표시될 수 있습니다.

3) 대표적인 증상

  • 첫 번째 파일이 목록에 나타나지 않음 (예: "no mid found").
  • 첫 줄 파일명이 공백/깨짐으로 보임(앞에 보이지 않는 문자가 섞임).
  • 문자열 비교/파싱이 실패해 재생·선택 로직이 비정상 동작.

4) 해결 방법

(A) 파일 저장 단계에서 BOM 제거

  • Windows 메모장: "다른 이름으로 저장" → 인코딩에서 UTF-8(서명 없음, no BOM) 선택.
  • VS Code: 상태바의 인코딩 표시 클릭 → Save with EncodingUTF-8 선택( with BOM 아님 ).

(B) 코드에서 BOM 감지 후 건너뛰기

파일을 열고 첫 3바이트가 EF BB BF인지 검사한 뒤, 맞으면 스킵합니다.

// 간단한 BOM 스킵 예시(C/C++)
// 파일에서 처음 3바이트를 미리 읽어 검사
uint8_t bom[3]; 
size_t n = file.read(bom, 3);
bool hasBOM = (n == 3 && bom[0]==0xEF && bom[1]==0xBB && bom[2]==0xBF);
if (!hasBOM) {
  // BOM이 아니면, 읽은 3바이트를 다시 처리해야 함
  // 구현에 따라 버퍼 복원 또는 파일 포인터 되감기 필요
  file.seek(0); 
}
// 이후 라인 단위 파싱 진행

팁: 줄을 읽을 때 isprint() 또는 범위 검사로 비가시 제어문자를 걸러주는 보조 방어 로직을 추가하면 안정성이 올라갑니다.

5) 요약

  • BOM(특히 UTF-8 BOM: EF BB BF)은 텍스트 선두의 보이지 않는 3바이트입니다.
  • INDEX.TXT를 파싱할 때 첫 줄이 깨지거나 누락되는 주원인이 될 수 있습니다.
  • 가장 확실한 해결은 BOM 없이 저장하거나, 코드에서 BOM을 감지해 스킵하는 것입니다.

2025년 9월 10일 수요일

불평등이 건강과 수명에 남기는 흔적

처음 도서관에서 이 책을 접했을 때, 나는 국가간 불평등에 대해 이야기하는 것으로 생각했었다. 책등에 쓰인 제목만 보고 즉흥적으로 선택을 했다가 몰입해서 순식간에 읽은 뒤 정말 좋은 책을 골랐다는 만족감을 느낄 때도 있고, 인터넷 등에서 미리 책 소개를 보고 빌렸다가 정작 재미가 별로 없어서 읽다 만 책도 있다. 이 책은 전자에 해당한다.



알린 T. 제로니머스의 「불평등은 어떻게 몸을 갉아먹는가」(영문 원제: Weathering: The Extraordinary Stress of Ordinary Life in an Unjust Society)는 바로 미국의 실정을 이야기하고 있었다. 자유와 평등을 건국 이념으로 삼는 미국에서 왜 백인과 흑인의 평균 수명에 현격한 격차가 존재하는가? 10대보다 20대에 아이를 낳은 흑인이 왜 더 빨리 사망하는가? 철이 없고 절제를 하지 못해서 10대에 임신을 하는 것이 아니다. 20대에 아이를 낳으면, 아이가 충분히 자랄 때까지 엄마가 건강한 상태를 유지하기 어렵다는 것을 잘 알고 있기 때문이다! 병원 응급실에 실려 갔을 때 의료 인력이나 환자 중에 흑인이 얼마나 있는지를 먼저 살펴보고 과연 나의 다급한 목소리가 무시되지 않고 잘 전달될지 고민해야 하는 입장을 생각해보라. 

미국의 백인 청년 대다수는 자신이 장애 없이 살아서 50세 생일을 맞이할 것이라고 기대할 수 있을 뿐 아니라 그 이후로도 수십 년간 건강하게 살 것이다. 우리가 연구를 진행한 재정 지원이 끊긴 극빈곤지역 흑인 및 백인 집단에서는 죽지 않고 살아남은 사람들도 생존 기간 중 최대 30퍼센트를 장애인으로 살았다. (17쪽)

웨더링(weathering)이란 차별과 편견, 배제 등에 의하여 일어나는 반복적이고 만성적인 스트레스가 신체에 점진적으로 영향을 끼쳐서 건강과 수명에 나쁜 영향을 미치는 것을 의미한다. 19쪽의 설명에서는 '인종, 민족, 종교, 계급 차별에 의해 공격당하는 소외된 지역사회에서 살아가는 사람들이 겪는 생리학적 작용을 포괄하는 과정'이라고 하였다. 우리가 흔히 생각하듯 불평등한 사회에서 겪는 스트레스는 심리적인 영향으로 끝나는 것이 결코 아니다. '스트레스 받지 마. 다 마음먹기에 달린 거야'는 하등 도움이 되지 않는다. 스트레스는 스트레스이고, 우리의 몸에 직접적인 영향을 미친다. 

이 책에 의하면 건강과 수명을 개인의 책임으로 돌리는 비난 또는 개인적 책임 내러티브는 결코 바람직하지 않으며, 문제의 해결 방식도 되지 못한다. 이러한 불평등을 해소하기 위한 노력의 한 사례로서 저자는 뉴욕시에서 추진하는 바이탈 브루클린(Vital Brooklyn) 프로그램을 소개하였다. 이 사업에는 재생에너지 사회로의 전환을 꾀하면서 경제 및 건강 형평성을 도모하고자 한다. 바이탈 브루클린의 웨더링을 고려한 공평한 사회 정책 지침은 다음과 같다.

  • 전체론적, 생태학적으로 생각하라
  • 억압받는 이해관계자를 지우지 마라. "우리 없이 우리에 대해 아무것도 하지 말라"
  • 노동연령 및 생식연령 성인의 필요에 관심을 가져라
  • 우리 모두의 운명이 연결되어 있음을 인정하라

웨더링에 의한 만성 스트레스는 텔로미어의 길이를 줄이고 이는 세포 노화와 매우 연관이 깊다. 노화된 세포는 염증성 사이토카인을 분비하여 전신 건강에 영향을 미칠 수 있다. 예를 들어 만성 염증은 췌장 세포에 이상을 일으켜 당뇨병을 유발하거나 자가면역질환으로 이어질 수 있다. 이는 소외집단의 구성원에게서 발생할 가능성이 높은 일인 것이다. 

또 다른 연구에서는 사회경제적으로 취약한 청소년이 시간이 지남에 따라 SLC6A4 유전자(세로토닌 수송체)의 프로모터 부위에 메틸화, 즉 후생유전학적 표지를 더 많이 축적하는 경향이 있고, 이는 뇌의 편도체 반응성을 높이고 공포 표정에 더 민감하게 반응하며, 향후 우울 증세의 증가와 연계된다고 한다.

Poverty marks a gene, predicting depression Duke Today 2016년 5월 24일

스트레스가 일상인 한국 사회는 얼마나 건강한가? 최근 Nature Medicine에 실린 다음 논문에서는 BBAG(Biobehavioral Age Gap), 즉 보호 요인(건강, 인지, 기능, 교육)과 위험 요인(심혈관질환, 시각·청각장애 등)을 활용해 예측된 나이실제 나이 의 차이를 계산한 지표를 써서 각 국가의 가속 노화 정도를 산출하였다. 이에 의하면 유럽은 가장 건강하게 노화하고 있고 이집트와 남아프리카공화국은 가장 빠르게, 그리고 아시아 및 라틴아메리카는 그 중간에 해당하였다. 이 연구에는 한국인도 포함되어 있다. 거의 선진국 수준에 다다른 한국은 높은 경제 수준에도 불구하고 환경적 요인, 사회 불평등, 대기 오염, 정치·사회 구조 등의 exposome 요인이 복합적으로 작용하여 노화를 가속화하는 경향이 확인되었다. 

The exposome of healthy and accelerated aging across 40 countries Nature Medicine 2025년 7월

여기에서 새로운 개념이 또 하나 등장한다. 그것은 바로 엑스포좀(exposome). 이는 개인이 삶 전반에 걸쳐서 겪는 물리적·사회적 환경 요인의 총합을 의미한다. UK Biobank의 약 50만 명의 데이터를 이용하여 exposome과 유전적 요인(다유전자 위험 점수 , PSR)이 사망 및 노화에 미치는 상대적 기여를 비유한 다음의 논문에서는 exposome에 의한 설명력이 훨씬 컸다고 한다(5.5-49.4% vs. 10.3-26.2%). 그나마 다행스러운 것은, 변경 가능한(modifiable) 환경 요인—흡연 여부, 신체활동, 사회·경제적 상태—에 대한 개입을 통해 이를 개선할 수 있다는 점.

Integrating the environmental and genetic architectures of aging and mortality Nature Medicine 2025년 2월 

이상의 자료 분석을 통해 내가 내린 결론은 이러하다. 스트레스는 근본적으로 마음을 고쳐먹음으로써 극복할 수 있는 것이 아니다. 특히 빈곤이나 소외에 의한 스트레스는 그 자체가 세포를 늙고 병들게 만든다. 사회 구조적인 변혁을 통해 빈곤과 소외를 퇴치하는 것이 급선무이며, 그 과정에서 반드시 당사자가 참여해야 한다. 그리고... 국가통합바이오빅데이터구축사업을 맡고 있는 사람으로서 드러내놓고 말하기는 조심스럽지만, 거대한 예산을 투입해 유전체를 해독하고 신약 개발의 실마리를 찾는 일도 중요하다. 그러나 개인 차원에서 건강한 삶을 추구한다면, 조금 덜 먹고 좋은 음식을 고르며 꾸준히 몸을 움직이는 것이 훨씬 더 구체적이고 실천 가능한 길이며, 비용 대비 효과도 크다고 믿는다.

빠르게 진도를 나간다고 해서 꼭 좋은 것만은 아니다 - AI가 가져온 착각?

사진 속 물건은 Arduino Nano를 이용하여 제작 중인 MIDI controller.

(들어가는 말) 인공지능과 협업하는 프로그램 개발 작업은 과몰입 또는 과로를 유발하기 좋다. 많은 부분을 ChatGPT가 도와주고 있어서 과연 이 일을 누가 하고 있는지 철학적인 고민을 하는 것은 새로운 숙제이다. ChatGPT는 과거에는 하지 못하던 일을 가능하게 만들어 주지만, 사용자로 하여금 결과적으로 과로를 유발하는 것은 부정할 수 없다. 일손을 덜어주는 것이 아니라, '오늘이 가기 전에 조금만 더 하면 좋겠는데, 조금만 더 하면...'하면서 인간을 지나치게 드라이브하게 된다.

인공지능의 도움으로 Nano Ardule MIDI Controller를 구동할 코드를 작성하면서 오늘 쓴 글의 제목과 같은 교훈을 뼈저리게 느끼고 있다. ChatGPT에게 요구사항을 하나씩 제시하여 C++ 코드를 얻어내고, 이를 컴파일하여 아두이노 나노에 업로드한 뒤 오류를 수정하고 새로운 기능을 추가하는 방식으로 내 나름대로는 개발 목표에 빠르고 능률적으로 근접하고 있다고 착각을 하였었다. 코드가 어떻게 돌아가는지 근본 원리를 배우려는 생각은 별로 없이, 그저 기기를 돌아가게만 하면 된다는 생각으로.

왜 착각인가? Sound Module을 제어하는 기능 목표치의 60% 정도를 달성해 놓은 뒤 이어서 마이크로SD카드에 수록된 MIDI 파일을 재생하는 기능을 추가하려는 단계에서 한계에 도달하였다. 바로 메모리가 부족하게 된 것이다. 여기까지를 제1기 개발이라고 부르겠다.

메모리 한계에 부딪친 Nano Ardule 컨트롤러 (2025년 9월 9일 작성)

ChatGPT가 제시하는 최적화 방안을 적용하기 이전에, 악기의 목록 정의를 재정비하기로 하였다. SAM9703 + GSM963200-B(CleanWave32) synthesizer ROM 보드의 sound variation은 GS의 그것과 완벽하게 같지는 않기 때문이다. GSM963200-B와 같은 CleanWave32 계열의 ROM인 GMS973201B의 데이터시트를 입수하여 악기 목록을 다시 만들었다. 엑셀 파일로 악기 배치를 정리한 다음 ChatGPT에 업로드한 뒤 헤더 파일을 제대로 만들게 하였다. 그런데 표준이라고 알려진 Roland의 GS와 확장 사운드의 맵이 너무나 다름을 알게 되었다. Roland SoundCanvas SC-D70 매뉴얼의 34쪽 Playing the Internal Sound Generator를 살펴보자.

■ Using MIDI message to switch sounds from another device or sequencer software

By sending MIDI messages from sequencer software that is running on your computer, you can specify the sound (instrument) for each of the SC-D70’s parts.

Sounds are specified by variation number and instrument number (p. 33). However, you should be aware that the way in which numbers are displayed may differ depending on your software. On the SC-D70, variation numbers begin from 0, and instrument numbers begin from 1.

The variation number corresponds to the MIDI bank number, and the instrument number corresponds to the MIDI program number.

(Note) The MIDI bank number consists of a “Most Significant Byte” (MSB) and a “Least Significant Byte” (LSB). Since each can have a value of 0–127, a total of 128 x 128 = 16384 banks can be specified. The most significant byte of the bank number corresponds to the variation number of the SC-D70. The least significant byte of the bank number is used to switch between the SC-55 map/SC-88 map/SC-88Pro/SC8820 map. 

예를 들어 SC-D70의 파트 1(1번 채널)을 SC-8820 map의 005 Dist. E.Piano(variation 17)로 바꾸고 싶다면 다음의 순서로 명령을 전송하면 된다.

  1. MIDI CH = 01
  2. CC#00 017 ...select variation number 017
  3. CC#32 004 ...select the SC-8820 map
  4. PC# 004 ...select instrument number 005
SC-D70의 매뉴얼에서.
Dream의 CleanWave32 매뉴얼에서.

반면 Dream의 사운드 체계에서는 CC#32를 쓰지 않으며, 대부분의 variation sound는 CC#00=127에 몰려있다. 더군다나 variation sound와 주 악기 소리가 서로 연관성이 없는 것이 많다. 예를 들어 PC = 12(Vibraphone)의 variation sound는 Elec Organ이다. 이런 상황에서는 유사한 악기를 패밀리로 묶기도 곤란하다. 1기 개발은 이 데이터시트를 접하기 전이라서 패밀리 개념으로 악기를 묶어서 선택하는 계층형 사운드 브라우저를 만들고 있었다.

Ardule Controller 하나를 이용하여 내가 보유한 두 개의 사운드 모듈(Roland SoundCanvas SC-D70과 SAM9703 기반 제품)을 같이 제어하려던 당초의 목표는 빗나가고 말았다. 더 큰 문제는 Dream 제품 체계에 맞게 악기 목록을 재정의한 헤더 파일을 쓸 수 있도록 기존의 코드를 수정해 달라고 하였더니 꼬인 구조가 많아서 거의 처음부터 다시 만들어내는 것이 아닌가. 그것도 단계별로... 예를 들어 아두이노 나노의 A6 핀은 아날로그 전용이라서 이를 버튼 스위치에 연결하여 쓰려면 풀업저항이 필요하다. 이미 지난번 개발 단계에서 이를 감안하여 하드웨어적으로 수정을 다 해 놓았는데, ChatGPT는 원론적인 접근부터 다시 시작하고 있었다. 풀업저항을 연결하지 않은 상태라고 가정하고!

수 주에 걸쳐 나눈 대화의 맥락을 전부 기억하는 것이 아닌데다가, 결론적으로는 어차피 대수술이 필요한 상태였던 것이다. 모든 기능을 1500라인이 넘는 하나의 .ino 파일에 쑤셔넣은 1기의 코드를 분리하여 모듈화하는 것까지 포함하여 상당히 방대한 개조를 해야 한다. 이러한 대수술이 한 단계로 이루어지는 것은 불가능하다. 파트 선택 기능부터 하나씩 추가하여 성공하면 다음 단계의 것을 넣는 방법이 유일하다. 다음은 왜 이렇게 해야만 하는지에 대한 ChatGPT의 대답.

그렇다. 1기 개발에서는 '지름길'로 가고 있다고 착각을 했던 것이다. 어쩌겠는가. 다소 시간이 걸리더라도 처음부터 다시 시작한다고 생각하자. 

2025년 가을에 20여년 전 제조된 Legacy MIDI 장비를 (재)활용하기 위한 이런 노력을 들이는 것이 과연 가치가 있는 일인지는 잘 모르겠다. 하지만 그 과정에서 최신의 기술(인공지능)을 충분히 활용하고 있으며 취미 생활의 지평을 넓혀 가고 있으니 아주 무의미한 일은 아닐 것이다. 원래 본업이 아니라 취미에 빠져드는 일이 더 자연스럽고 또 즐겁기까지 하다. 다만 퇴근 후 개발에 몰두하느라 과로를 하지 않도록 주의해야 할 것이다. 

2025년 9월 9일 화요일

메모리 한계에 부딪친 Nano Ardule 컨트롤러

아두이노 나노. 직접 촬영하였음.

아두이노 나노를 이용한 MIDI 컨트롤러 'Nano Ardule'을 만들다가 매우 중대한 난관에 봉착하였다. 하드웨어 제작을 마친 뒤, 지금까지 많은 공을 들여서 키보드 입력을 두 채널로 복제하여 서로 다른 음색이 동시에 나오도록 레이어링하거나 키보드 영역을 위와 아래로 나누는 스플리팅하기, 그리고 음색 편집 등의 기본 기능이 가능하도록 프로그래밍을 해 왔다. 여기에다가 마이크로SD카드에 담긴 MIDI 파일을 재생하는 기능을 추가하려고 하니 드디어 메모리가 부족하여 로드를 하지 못하는 단계에 이르렀다. 에러 없이 컴파일은 되는데 저장장치에 업로드를 하다가 중단되는 모습을 보니 허탈함을 금할 수 없다.

아두이노 나노(ATmega328P)는 작은 마이크로컨트롤러라서 다음과 같은 3종류의 주요 메모리를 갖는다. SRAM은 휘발성이라 전원이 꺼지면 내용이 사라진다.

  • 플래시(32 KB): 코드와 상수 저장, PROGMEM 활용.
  • SRAM(2 KB): 런타임 변수/스택, 제일 부족하므로 절약 최우선.
  • EEPROM(1 KB): 전원 꺼져도 남는 데이터 저장.

실시간 데이터는 SRAM, 큰 테이블이나 문자열은 PROGMEM(플래시), 사용자 설정은 EEPROM에 두는 것이 바람직하다. 아직 이러한 원칙에 입각하여 코드를 모두 최적화하지는 않았다. 얄궂게도 EEPROM는 수명이 있어서 데이터를 약 10만회까지 쓸 수 있다. 읽는 것은 상관이 없다. 여기에는 사용자 설정이나 영구 데이터를 넣으면 적당하다.

아두이노 IDE에서 업로드한 코드는 플래시에 저장된다. const 변수나 문자열 리터럴도 기본은 플래시에 저장되지만 실행 시 SRAM으로 복사되는 경우가 많다. 2KB에 불과한 협소한 SRAM을 작업대로 여기고 많은 일거리를 펼쳐 놓으려니 아두이노 나노가 한계에 이르는 것은 당연하다. 그래서 PROGMEM이나 F() 매크로를 써서 복사하지 않고 플래시에서 직접 읽게 하면 SRAM을 절약할 수 있다. 마이크로SD카드에 담긴 모든 파일은 PC에서 미리 인덱스 파일을 만들어서 한 줄씩을 읽으면서 실제 파일에 접근하게 하는 방법도 고려해야 한다. MIDI 파일은 미리 type 0으로 바꾸어 놓아야 한다.

아두이노 나노 에브리(ATmega4890)로 업그레이드하면 코드를 거의 바꾸지 않고 원활한 작업이 가능할 것이다. 플래시는 48KB, SRAM은 6KB, EEPROM은 약간 적어서 256B(플래시에서 에뮬레이션)이다.

아두이노 나노 에브리. 사진 출처: 쿠팡


2만원 조금 넘는 비용을 들여서 아두이노 나노 에브리를 살 것인가? 또는 최적화 기법을 총동원하여 아두이노 나노에 모든 기능을 욱여넣을 것인가? 9월 한달 동안은 아두이노 나노를 최대한 쥐어짜서 하는 데까지 해 보려고 한다. 다음은 챗GPT가 제안한 최적화 방안이다.


아두이노 나노(ATmega328P)로 프로그램/콤비 저장MIDI 파일 재생, 기본 UI를 동시에 구현하기 위한 최적화 방법을 우선순위대로 정리했습니다.

1) SRAM(2 KB) 먼저 살리기 — 최우선

  • 모든 상수 문자열은 플래시에서 직접 출력: F() 매크로 사용
    lcd.print(F("Init SD..."));
  • 테이블/이름 전부 PROGMEM (GM/GS/드럼 이름, UI 라벨)
    const char sPlay[] PROGMEM = "Play";
    char buf[17];
    strcpy_P(buf, sPlay);
    lcd.print(buf);
  • String 금지char[] 고정 버퍼(예: 32~64B) 공용 사용
  • 큰 로컬 배열 금지 (스택 폭발 방지) → 전역의 작은 공용 버퍼 재사용
  • 시리얼 버퍼 축소/끄기, 디버그는 필요한 구간만
  • SD 브라우저 최소화
    • 8.3 파일명 only (LFN 비활성)
    • /SONGS/INDEX.TXT, /DRUMS/INDEX.TXT 한 줄 한 파일 순차 읽기
    • 현재 선택 항목만 char line[32]로 보관

2) 코드/플래시(32 KB) 절약

  • 기능 스위치: #define FEATURE_BROWSER 0/1, #define FEATURE_EDIT 0/1
  • 중복 문자열 제거 (공통 접두/접미어 조합), inline 남발 금지
  • 가벼운 LCD 라이브러리/필요 함수만 사용, 미사용 라이브러리 제거
  • 컴파일 옵션: LTO, -Os(기본) 유지

3) MIDI 재생부 설계(작고 단단하게)

  • Type-0 전용 스트리밍 (PC에서 Type-1 → 0 변환)
  • 템포(Meta 0x51)만 처리, 나머지 Meta는 스킵
  • Running Status 유지, 이벤트 즉시 전송 (대형 큐 금지)
  • 버퍼 1개(≤512B)read → parse → send 파이프라인

4) 파일시스템 선택

  • SdFat (설정 최소화, LFN off)로 충분하면 그대로
  • 더 빡빡하면 Petit FatFs (읽기 전용, 초저메모리) 검토

5) EEPROM(1 KB) 사용 요령

  • 콤비/설정은 고정 구조체(≈32B)로 저장 → 20~30개 가능
  • 저장은 버튼으로만 (수시 자동 저장 금지)
  • 간단 wear-leveling: 다음 슬롯에 순환 저장 + CRC로 무결성 체크

6) 빌드 프로파일 두 가지 운용(권장)

  • A안: 편집/브라우저 중심 (재생 최소)
  • B안: 재생 중심 (브라우저 축소, INDEX.TXT 의존)
  • → 스위치 1–2개로 코드 크기·RAM 밸런스 즉시 전환
* 여기서 말하는 '스위치'란 컴파일 타임 스위치(전처리 매크로 #define)를 말합니다. 즉, 빌드할 때 켜고 끄는 플래그로 코드/데이터(특히 PROGMEM 테이블, 브라우저 로직, 플레이어 로직)를 아예 포함하거나 제외해서 플래시·SRAM 점유를 즉시 바꾸는 방식이에요.

7) 진단/관찰 루틴(문제 예방)

  • 부팅 시 freeRAM() (남은 SRAM 추정) 한 번 출력
  • SD 읽기/파싱 오류는 짧은 메시지로만 표시
  • LCD 갱신 주기 완만하게 (예: 150–200 ms) → MIDI 막힘 예방

8) “정 안 되면” 최후의 수단

  • UI 라벨 더 줄이기, GM/GS 풀네임 대신 축약명
  • 드럼 브라우저는 숫자+간단명
  • 그래도 모자라면 Nano Every(6 KB SRAM) 고려
    (단, Every는 EEPROM 256B → 콤비는 SD 저장 권장)

바로 적용 체크리스트

  • [ ] F()/PROGMEM 전면 적용, String 전면 금지
  • [ ] 공용 워크버퍼 1개(64–128B)로 파서/표시 공유
  • [ ] 8.3 이름 + INDEX.TXT 순차 브라우즈
  • [ ] Type-0 스트리밍 + 템포만 처리
  • [ ] EEPROM: 버튼 저장 + CRC + 간단 wear-leveling
  • [ ] 기능 스위치로 “편집↔재생” 빌드 분리

참고 코드 조각

(1) PROGMEM 문자열 출력

const char sLoading[] PROGMEM = "Loading";
char line[17];

void printP(const char* p) {
  strcpy_P(line, p);
  lcd.print(line);
}

(2) 간단한 Combi 저장(EEPROM, CRC 포함 예시 골격)

#include <EEPROM.h>

struct Combi {
  uint8_t ver, mode;
  uint8_t chA, chB, progA, progB;
  uint8_t bankA_msb, bankA_lsb, bankB_msb, bankB_lsb;
  uint8_t volA, volB, panA, panB;
  uint8_t splitPoint, octaveA, octaveB;
  uint16_t crc;
};

uint16_t crc16(const uint8_t* d, size_t n); // 구현 필요

bool loadCombi(uint8_t idx, Combi& c) {
  int addr = idx * sizeof(Combi);
  EEPROM.get(addr, c);
  uint16_t got = c.crc;
  c.crc = 0;
  return (crc16((uint8_t*)&c, sizeof(Combi)) == got);
}

bool saveCombi(uint8_t idx, Combi& c) {
  c.ver = 1; c.crc = 0;
  c.crc = crc16((uint8_t*)&c, sizeof(Combi));
  int addr = idx * sizeof(Combi);
  EEPROM.put(addr, c);
  return true;
}

(3) INDEX.TXT 한 줄씩 읽기(개념)

// 사용 중인 FS 라이브러리에 맞게 File 타입/호출 교체
bool readIndexLine(File& f, char* out, size_t n) {
  size_t i = 0; int ch;
  while (i < n - 1 && (ch = f.read()) >= 0) {
    if (ch == '\n' || ch == '\r') { if (i == 0) continue; break; }
    out[i++] = (char)ch;
  }
  out[i] = 0;
  return (i > 0);
}

2025년 9월 8일 월요일

가을의 문턱에서 여름 철새 후투티를 만나다

대전시립미술관 주차장에서 만난 후투티(영문: Eurasian hoopoe, 학명: Upupa epops). 이미지 이어붙이기는 여기(bbom.org)를 이용하였다. 화려한 모관을 자랑하는 후투티를 휴대폰으로 찍었다. 모자 혹은 댕기로 표현하는 사람들도 있다. 관모는 씨앗에 붙어 바람에 잘 날아가게 만든 솜털과 같은 구조물을 말한다.



뽕나무 숲에 잘 나타나서 오디새라고도 부른다고 한다. 후투티는 순 우리말로서, '훗 훗'하고 우니까 서울대학교 동물학교실에서 1950년에 발간된 한국조류명휘(韓國鳥類名彙, A Hand-List of the Korean Birds)에서 이런 이름을 제안한 것이 그대로 정착했다고 한다. 彙('휘')는 '무리, 고슴도치라는 뜻을 갖는다. 잘 쓰지 않는 한자라고 생각하기 쉽지만, '어휘(語彙)'라는 용례가 있다.

국내 최초의 조류 종목록은 1948년 남태경 박사에 의한 「한국조류명휘」로 431종이 기재되었습니다.. (국가생물종목록 발간사 링크)

1948년과 1950년, 어느 것이 맞는지는 잘 모르겠지만(첫 번째 링크에서 보인 영문 책자에는 1950년), 해방 후 전란이 일어날 때까지 혼란스러운 시기에 이런 역작을 만들어냈다는 것은 놀랍다.

후투티는 한국 중부 이북 어디서나 볼 수 있는 여름 철새이나 흔치는 않다고 한다. 지구 온난화로 인해 한반도로 점점 내려와서 텃새가 되고 있다니, 기후 변동은 지구상에 사는 모든 생명체에게 영향을 미침을 알 수 있다. 

겨울 대구서 발견된 여름 철새 후투티…텃새가 됐나! 연합뉴스 2021년 12월 5일

벌써 9월 초순이니 예년 같으면 조석으로 제법 쌀쌀한 기운이 느껴지고 여름 철새도 남쪽으로 슬슬 이동을 해야 할 터인데 여전히 기온이 높으니 한반도에 남아서 겨울을 나기로 한 모양이다. 원래는 4월 말에 한국을 찾아 새끼를 키운 뒤 6~7월에는 남쪽으로 날아가야 한다. 방향을 잃지 않고 수천 km를 날아가야 하는 큰 일을 당장 하지 않고 한 곳에 머물게 된다면야 철새에게는 큰 이득이겠지만, 세상에 공짜가 어디 있으랴. 이에 따라서 멀리 날아가는 능력을 잃게 될지도 모른다. 인류도 인공지능 때문에 깊게 사고하고 판단하는 능력을 잃어버리고 있는지도 모른다. 


2025년 9월 3일 수요일

빠르지 않았지만 매우 균일한 페이스를 보여준 어제의 달리기

9월에 접어들면서 비가 뿌리더니 제법 아침 저녁의 기온이 많이 내려갔다. 덕분에 어제 저녁의 달리기는 꽤 수월하였다. 준비운동 삼아서 아령을 이용한 상체 운동과 스쿼트 및 스트레칭을 한 때문이었을까, 어제의 '정량화된 자아(Quantified Self)'는 꽤 바람직한 기록을 보여주었다. 빨리 달렸다는 것이 아니라 8km를 달리는 동안 매우 균일한 페이스를 유지했다는 뜻이다. 항상 완만한 '우하향'의 직선 형태를 보이던 페이스가 어제는 거의 수평선이었다.



랩 통계에서도 매 km 구간에 따른 편차가 많지 않았다. 내 기억으로도 이렇게 고른 페이스를 유지하면서 달린 것은 어제가 처음인 것 같다. 



달리면서 혹시 처지고 있는 것은 아닌지 늘 의식을 하는 것, 그리고 글로 옮기기는 어렵지만 발바닥을 쓰는 방법에 신경을 쓴 것도 도움이 되었다. 나는 가급적 '미드풋'으로 뛰려고 애를 쓰는데, 여기에도 달리는 사람에 따라서 많은 변주가 가능할 것 같다,

아령 운동은 2년 전 다쳤던 오른쪽 상완골과 어깨 주변을 강화하기 위함이다. 작년 10월부터 녹슨 5kg 아령으로 상체 운동을 시작하였는데, 그렇게 자주 하지는 못한다.

뜻하지 않은 부상(상완골 근위부 골절) 후 꼭 1년이 지나다 - 상체 근력 운동의 필요성

내가 운동 매니아가 될 가능성은 거의 없다. 하지만 습관이 된 달리기, 아령 운동 + 보충 운동(플랭크, 스쿼트 등)으로 중년 건강을 지켜 나가야 되겠다.

2025년 9월 2일 화요일

아두이노 자작품을 만들면서 얻은 교훈 - 코딩은 기다림이다!

소프트웨어 개발 절차는 보통 다음의 6가지 절차로 이루어진다고 한다.

  1. 요구사항 분석(Requirement Analysis)
  2. 시스템 명세
  3. 설계(Design)
  4. 프로그래밍(Programming)
  5. 테스트(Testing)
  6. 유지보수(Maintenance)

현재는 데이터 센터와 유사한 성격의 곳에서 일을 하고 있노라니 1번 단계, 즉 개발자가 사용자를 만나서 인터뷰를 수행하는 모습을 곁에서 많이 접하게 된다. 프로젝트의 성격이 단순하다면 이러한 6가지의 단계를 다 거칠 필요는 없고, 몇 가지 단계가 한꺼번에 뭉쳐서 진행되기도 한다.

아두이노 나도 응용 DIY 제품을 구동할 용도로 프로그램을 만드는 것도 비교적 단순한 소프크웨어 개발 절차라고 할 수 있다. 프로그램 코드를 저장하고기 위해 마련된 플래시 메모리의 공간이 32KB에 불과한 아두이노 나노에 채워 넣어야 하는 코드가 아무리 방대하고 복잡한들 그게 얼마나 되겠는가? 

C/C++ 문법도 잘 모르는 내가 아두이노 나노로 구동되는 MIDI sound module 제어기('Nano Ardule MIDI Controller')용 코드를 짜고 있다니 생각해 보면 정말 말도 안되는 일이다. 제어 대상은 본 블로그에서 여러 차례 소개했던 SAM9703 기반의 반주기 개조품(유튜브 링크).

그런데 그게 정말 현실에서 일어나고 있다. 필요한 기능을 챗GPT 대화창에 입력해 넣으면, 이를 실행하게 해 주는 .ino 파일을 생성하여 통째로 다운로드할 수 있게 만들어 주기 때문이다.

기다림은 바로 이 과정에서 필요하다. 챗GPT가 생각을 하고 코드를 짜 주는 동안 기다려야 한다. 문제는 이렇게 하여 제공한 코드가 항상 잘 컴파일이 되지는 않는다는 것이다. 중괄호를 빼먹는 것으로부터 선언하지 않은 변수나 함수가 쓰인다든지... C/C++을 잘 이해하는 사람이라면 아두이노 IDE에서 뱉어내는 에러 메시지만 보고서 금방 소스 코드를 수정할 터인데, 나와 같은 코딩맹(盲)은 에러 메시지를 그대로 복사하여 챗GPT에 붙여 넣은 뒤 문제를 파악하고 개선한 코드 파일을 다시 제공할 때까지 기다려야 한다. 

그런데 내가 봐도 똑같아 보이는 실수를 계속 반복하는 모습을 보고 있노라면 부글부글 속에서 뭔가 치밀어 오르는 답답함을 느낀다. 그러면 또 컴파일 중에 나오는 오류 메시지를 복사해서 제출하고, 기다리고... 그래서 코딩은 기다림이다. 지루한 반복 작업을 견디다 못한 나는 가장 마지막에 컴파일 및 작동에 성공한 코드 파일을 업로드한 뒤 여기에 추가 기능을 단계적으로 더해 나가는 방식으로 전환하였다. 너무 많은 양의 요구사항을 들이대면 실수를 많이 하는 것 같다. '잘 되고 있는 것은 건드리지 말아라'라는 식의 너무나 당연하고도 구체적인 요구를 때로는 해야 한다.

챗GPT는 마치 머리는 꽤 좋은데 가끔 딴생각을 하고 주위가 산만한 천재를 대하는 것 같다. 가끔 고집도 피운다. 그러나 조금만 마음을 가다듬고 생각해 보면 챗GPT가 없이 과연 내가 이런 취미 프로젝트를 단 한 발자국도 실현해 나갈 수 없었을 것이다. 그러니 다소 오류가 포함된 소스 코드를 반복적으로 토해 내더라도 무한한 인내심을 발휘해야 한다. 예를 들어 버튼을 한번 클릭할 때와 길게 눌렀을 때 서로 다른 동작을 하게 만드는 코드를 내 창의력과 검색만으로 짠다고 생각해 보라. 가당키나 한 일이겠는가. 1602 LCD, 4개의 LED, 5개의 버튼, 로터리 인코더... 시프트 레지스터 칩를 쓰지 않은 상태에서 아두이노 나노의 모든 입출력 핀을 전부 사용해야 하는 데다가, 메뉴 구성도 결코 단순하지 않기 때문이다.

끊이지 않는 버그, 머리를 쥐어뜯고 싶다!


테스트를 하는 과정에서 비합리적이거나 무리한 요구사항을 재정의하여 개선하는 일도 흔히 벌어진다. 모든 부품을 기판 위에 전부 올려서 배선을 한 날, 이것이 마지막 납땜이라고 호기롭게 자신했지만 그 뒤로 몇 번이나 회로 수정을 했는지 모른다. 코딩 역시 마찬가지다. 정의해 놓은 기능을 단계적으로 구현해 나가는, 즉 절대로 우회나 후진은 하지 않으면서 프로젝트가 진행될 것이라고 생각했으나 그것은 헛된 기대였다. 다시 중간 지점으로 돌아가서 기능을 다시 정의하는 일이 허다하게 벌어지고 있다.

현재 소스 코드의 분량은 700줄 정도이다. 마이크로SD카드에 데이터를 쓰고 읽는 기능까지는 아직 구현하지 못한 상태다. 바로 어제까지 작업하여 MIDI IN으로 들어오는 단일채널 키보드 신호를 MIDI 사운드 모듈의 2개 채널로 복제하여 보내는 것에 성공하였다. 채널은 서로 다른 악기(program)으로 할당해 둔 뒤, 버튼을 눌러서 어느 하나만 연주하거나 layer 또는 split이 가능하게 만들었다. Korg의 방식으로 말하자면 두 개의 프로그램으로 이루어진 심플한 'combi' 음색을 만들 수 있는 것이다. 보람이 느껴지지만 몸은 고단하다.

돌이켜보니 연기를 피우며 납땜을 할 때, 즉 하드웨어를 제작하던 단계가 훨씬 덜 고되었던 것 같다. 정신건강까지 고려한다면 하드웨어 제작단계가 건강에 미치는 영향은 코딩 단계보다 더 적은 것이 아닐까...

'몰입'은 즐거운 일이다. 그러나 몸과 마음을 너무 갉아먹을 정도라면 이야기는 달라진다. AI가 사람의 수로고움을 대신한다고? 어떤 측면에서는 옳다. 그러나 결과적으로 일을 더 하게 된다. 아무래도 다음번 글의 주제는 'AI가 촉발한 과몰입(또는 과노동)'이 될 것 같다.


 


2025년 9월 1일 월요일

2025년 8월 달리기 결산(~88km), 더 철저한 측정과 동기 부여가 필요한가?

7.33km의 저녁 달리기를 마치고 집으로 돌아와서 땀을 식히고 있는데 TV에서는 기안84가 러닝 크루(션과 이영표 등 유명인이 포함된 '언노운 크루')와 함께 15km에 달하는 아침 달리기를 마치고 야외 수영장으로 향하는 장면이 나왔다. 아침식사를 대신하여 수영장 매점에서 라면을 끓여 먹는 모습을 보면서, 서울이 아닌 광역시에 사는 주민으로서는 이러한 일상을 누릴 수 있는 사람들을 부러워하지 않을 수 없었다. 상대적 박탈감을 느끼게 하는 방송의 역효과를 다시 한번 느꼈다.

방송에 소개된 이번 15km 아침 달리기의 페이스는 5분 30초 정도라고 하였다. 5분대라! 기가 죽는다. 이제 달리기 입문 13개월차를 마친 나는 페이스에 너무 신경을 쓰지 않아서 지난 몇 달 동안 가장 초라한 기록이 되었다.

8월 달린 거리는 공식 82.17km이다.


8월 29일의 달리기에서는 런데이 앱을 잘못 조작해서 6km 정도 달린 기록이 날아가고 말았다. 대단히 아쉽다. 위에서 보인 화면 캡쳐의 기록(82.17km)에서 이를 더해야 된다. 매달 80km를 조금 넘게 달리고 있는데 평균 페이스는 지난 4월과 5월의 6분 15초를 정점으로 찍은 뒤 계속 나빠지고 있다. 

약간 느리게 달린 만큼 평소 피로도는 조금 적어졌다. 나의 경우에 달리는 도중 체력 소모 정도를 가장 크게 좌우하는 것은 준비운동 여부와 기온이다. 유난히 길고 더운 여름이었지만 이제 가을로 접어들었으니 기록도 조금은 나아질 것으로 믿는다.

측정이라는 행위가 개입하면서 모든 것이 부자연스러워진다는 글을 최근 읽은 책(저드슨 브루어, 『식탐 해방: 살찌지 않는 뇌를 만드는 21일 식습관 혁명』에서 본 기억이 있다. 그렇다 해도 지금의 페이스는 너무 느리다. 6분 30초를 유지하기가 이렇게 어렵다니! 마음을 가다듬고 달리기에 새로 입문한다는 기분으로 돌아가도록 하자.

A step too far? How fitness trackers can take over our lives by James Tapper, 가디언 2019년 11월 10일

우리는 모두 아마추어 심리학자, 민속 심리학자가 되어 가고 있습니다. 문제는 우리는 통계학자가 아니고, 자기 데이터를 해석하는 전문가도 아니라는 점이에요. 그래서 잘못된 결론을 내리기 쉽습니다. 톰 캘버트, 에딘버러대 비즈니스스쿨

Quantified Self(QS)는 개인의 신체, 행동, 생활 패턴을 수치화하여 기록하고 분석하는 운동 또는 문화를 말한다. 2007년 Wired의 편집자 개리 울프와 케빈 켈리가 모임/블로그 이름으로 창안한 용어이며, 다음에서 두 번째로 보인 2009년 울프의 Wired 기사를 통해 대중적으로 알려졌다고 한다.

What is The Quantified Self? by Gary Wolf, 2007년 3월 3일

Know Thyself: Tracking Every Facet of Life, from Sleet to Mood to Pain, 24/7/365 2009년 Wired

웨어러블 센싱 기반의 Quantified Self 기술 동향 전자통신분석동향 2015년

내가 사용하는 런데이 앱도 QS의 실제 수단이다. 기대되는 효과는 분명히 있지만, 데이터에 집착하느라 즐거움이 사라지는 부작용도 있으며, 건강 관리 책임을 개인에게 돌리게 된다. 바로 알린 T. 제로니머스가 Weathering 이론(『불평등은 어떻게 몸을 갉아먹는가』)에서 밝혔듯이 개인 책임 내러티브로 이어지게 되는 것이다. 


2025년 8월 31일 일요일

대전시민천문대를 찾다

르누아르(1841-1919)의 전성기에는 미국 캘리포니아의 리크 천문대에 설치된 36인치 굴절 망원경이 세계 최대 규모였다고 한다. 망원경으로 태양을 관측하는 아내의 모습을 르누아르 화풍으로 다시 그려 보았다(ChatGPT) 


출퇴근을 하면서 매일 대전시민천문대로 오르는 길 입구를 스쳐 지나간다. 아이들이 어렸을 때 마지막으로 가 본 것이 언제였는지 잘 기억이 나지 않는다. 한때 월평동에 망원경을 파는 상점이 있었다는 것을 누가 믿겠는가. 잠들지 않는 도시의 밤하늘은 점점 밝아지고, 스마트폰 속에 구경거리가 가득한 요즘 세상에 별을 올려다보는 사람이 얼마나 될까? 어려운 살림에 적지 않은 돈을 주고 구입한 스카이워처의 12인치 막스토프 카세그레인 경통을 그 후 몇 년이 지나서 장식작에서 꺼내어 삼각대 위에 얹어 본 것도 벌써 12년 전이다. 추적장치에 납축전지를 다시 연결하면 과연 움직이기나 할지 알 수가 없다.

망원경 거풍시키기(2013년 8월 18일에 쓴 글)

토요일 외출에서 이른 귀가를 하는 도중 대전시민천문대에 들러 보았다. 매일 그 앞을 지나다니면서도 천문대로 오르는 길로 진입할 수 있도록 별도 좌회전 신호를 준다는 것을 인식하지 못하고 있었다. 예전에는 장애인 차량만 근처에 주차를 할 수 있었던 것 같은데, 이제는 산 정상 가까이 있었던 시설물을 정비하고 없애고 주차장을 만들어 놓았다.

얼마만에 만나는 관측실의 천체망원경인가. 8월이 다 끝나가도록 뜨겁게 타오르는 태양의 광구와 흑점을 보았다. 기대한 것보다 흑점이 훨씬 많고 컸다. 언론 보도에 의하면 올해는 태양의 활동이 매우 활발한(따라서 흑점도 많은) 극대기에 해당한다고 한다. 태양 활동은 약 11년을 주기로 극대기와 극소기를 반복한다.

내년 강력한 '태양 폭품' 예보...흑점 20년 만에 가장 많을 듯(한겨레 2024년 6월 29일)




칼 자이스의 광학식 플라네타리움은 MEGASTAR-Neo라는 디지털 방식의 것에게 자리를 내어 주고 천문대 건물 바깥에서 전시된 상태였다. 별을 깨끗하고 선명한 점으로 표현하는 성능은 구식(광학식)이 더 나았던 것 같다. 

태양을 관측한 뒤 천체 투영실에서 오후 4시에 시작하는 영상물 관람 및 별자리 해설 프로그램에 참석하였다. 소요 시간은 25분 정도. 우주선에서 태양의 활동을 점검하는 동영상을 먼저 보았다. 타이틀에 표시된 'Made possible by NASA'라는 표현이 흥미로왔다. 코로나 질량 방출(CME, corona mass eject)라는 용어도 동영상을 통해서 접했다. 대부분의 CME는 흑점 집단과 같이 태양 표면의 활성 구역에서 일어난다고 한다. 이러한 강력한 '우주 기상'은 지구에 큰 영향을 미치지만, 다행스럽게도 자기장과 대기권 덕분에 우리는 안전한 일상 생활을 영위할 수 있다. 그리고 극지에 가까운 곳에서는 아름다운 오로라를 만날 수 있는 것이다.

다음으로 이어지는 여름 밤하늘의 별자리 해설에서는 한동안 잊고 있었던 별 이름을 되새길 수 있었다. 베가(거문고자리) - 데네브(백조자리) - 알타이르(독수리자리)라는 1등성 3개로 이루어지는 여름의 대삼각형! 최근 비가 매우 많이 내려서 광해가 심한 도시의 천문대에서 보기 어려운 뱀주인자리를 간혹 볼 수 있다고 한다. 가을로 접어들면 동쪽 하늘에서는 페가수스가 떠오를 것이다.

MEGASTA-Neo 플라네타리움(링크). 직경 5~15m의 돔에 적합한 성능이라고 한다

대전광역시의 지원과 내부 카페 운영 수익만으로 대전시민천문대를 운영하는데 어려움이 없을지 걱정이 된다. 

한때 망원경을 만들거나 구입하는 것은 돈이 꽤 많이 드는 취미였다. 친구와 함께 선두과학이나 계룡광학을 다녔던 기억이 난다. 열심히 반사경을 연마하던 대가들은 하나 둘 활동을 접거나 세상을 떠나고 있고, 관측 장비의 디지털화(특히 촬영용 장치)가 심화되면서 아마추어 천문 활동은 저변도 상당히 줄고 소수 매니아의 것으로 그 범위가 좁혀진 것은 아닌가 하는 생각이 든다. 예를 들어 안시관측을 하거나, 스케치로 기록을 남기는 일은 요즘 거의 보기 어려운 것 같다.

내가 기억하는 한국 (아마추어) 천문학계의 주요 인물은 천문우주기획의 대표이기도 한 이태형 님, '성도'로 유명한 조상호 님(직접 만난 일은 없음), 그리고 대학교 시절 같이 활동했던 신명근 박사. 이외에도 내가 알지 못하는 많은 고수가 있을 것이다. 

지자체의 지원과 자체적으로 운영하는 카페 수입만으로는 대전시민천문대를 안정적으로 운영하기가 쉽지 않을 것이다. 홈페이지(링크)도 한동안 업데이트가 되지 않고 있는 것 같다. 어린 자녀가 있을 때에만 잠깐 오는 곳이 아니라, 모든 세대의 시민이 과학하는 마음을 품고 즐겁게 찾을 수 있는 놀이터가 되었으면 하는 바람이다. 이런 마음은 국립중앙과학관에 대해서도 마찬가지이다. 시민의 한 사람으로서 내가 기여할 수 있는 바는 없을까? 50이 훌쩍 넘어서 요즘 이렇게 취미 수준의 납땜과 코딩에 몰두하고 있는데, 역시나 마찬가지로 초등학교 시절부터의 꿈이었던 아마추어 천문에 제대로 입문하는 일이 벌어지게 될지 누가 알겠는가?

'유전체'나 인간이 만든 '데이터'에만 집착할 것이 아니라 광대한 지구 밖 세상을 통해 인간이 얼마나 나약하고 보잘것 없는 존재인지를 깨달아야 한다. 태양이 조금만 심술을 부려서 물질과 에너지를 쏟아내면, 당장 인류의 일상 생활에 큰 지장이 생기기 때문이다.

멀리 보이는 오노마 호텔 또한 천문대 입장에서는 관측에 어려움을 주는 '광공해 유발' 건물일 것이다. 따라서 광역시 중심가 가까운 곳에 위치한 천문대의 관측 대상은 한정될 수밖에 없다.



2025년 8월 25일 월요일

데이터 주권에서 글로벌 리더십까지 - KOBIC의 INSDC 가입 도전

[일러두기] 이 글은 2025년 8월 24일 디지털타임스에 실린 저의 기고문 「'바이오 데이터, 韓이 국제규범 만들어야」의 원본입니다.

생명·의료 연구 분야에서는 아주 아름다운 전통이 있습니다. 논문에 실은 데이터를 공개된 저장소('repository'라 합니다)에 등록하여 누구나 쉽게 검증하고 자유롭게 활용할 수 있게 하는 것입니다. 많은 학술지에서는 아예 논문 투고 시점에 데이터를 공인된 저장소에 먼저 등록한 뒤 접근번호('accession number')를 발급받아 원고에 명시하도록 요구합니다. 공개된 과학연구 데이터는 논문에서 주장하는 결론을 뒷받침하는 중요한 근거이자 2차적 활용을 통해 지속적으로 가치를 드러내게 됩니다. 이는 단순한 배려나 관행이 아니라 신뢰, 협력, 재현성을 통해 ‘좋은 과학’을 실천하는 숭고한 길이기도 합니다.

최근 단백질 구조 예측의 혁신을 불러온 알파폴드(AlphaFold)는 방대한 공개 연구데이터 없이는 탄생할 수 없었습니다. 수십 년 동안 전 세계 연구자들이 Protein Data Bank(PDB) 등에 등록한 수백만 개의 단백질 구조와 서열 데이터 및 문헌 정보가 AI 학습의 토대가 되었음은 잘 알려져 있습니다. 

글로벌 데이터 저장소로 인정을 받는 것은 쉬운 일이 아닙니다. 연구 커뮤니티을 통해 그 필요성에 대한 공감대가 형성되고, 오랜 논의와 협의를 거쳐 등록 데이터에 대한 사실상의 표준('de facto standard')을 만들며, 이를 기술적으로 뒷받침할 수 있는 운영 주체가 결정됩니다. 대표적인 것이 바로 40년 가까운 역사를 지닌 국제염기서열데이터베이스협력체(International Nucleotide Sequence Database Collaboration, INSDC)입니다. 이는 미국 국립보건원 국립의학도서관의 NCBI, 유럽분자생물학연구소의 EBI, 그리고 일본 국립유전학연구소 산하의 DDBJ로 구성된 연합체입니다. 정부나 국제기구가 나서서 시험을 치르듯 INSDC의 회원 자격을 부여하는 것은 아니지만, 세 기관 모두 정부 기관이거나 정부가 주도하는 공공 기관이라는 점은 우연이 아닐 것입니다. 그만큼 생명·의료 분야의 연구 데이터 공유가 공익 목적에 부합하고, 이를 지원하는 인프라인 데이터 리포지토리는 오랜 기간에 걸쳐 안정적으로 운영되어야 함을 전제로 하기 때문입니다.

INSDC의 어느 한 곳에 데이터를 제출하든지 등록 후 하루가 지나면 전부 동기화가 이루어져서 나머지 두 곳의 데이터베이스에서도 같은 접근 번호를 이용하여 동일한 데이터를 다운로드할 수 있습니다. NGS가 보편화되면서 전 세계적으로 생산되는 생물학적 서열 데이터가 기하급수적으로 증가하고 있음에도 불구하고 동기화가 가능한 것은 IT 기술의 발전뿐만 아니라 데이터의 표준화가 잘 이루어졌기 때문입니다. 

데이터의 특성에 따라 메타데이터만 동기화하고 실데이터는 분산된 개별 리포지토리에 보관하는 형태도 존재합니다. 예를 들어 단백체 데이터의 공유와 재사용을 위한 연합체인 ProteomeXchange에서는 동일한 접근번호를 이용하여 모든 회원 웹사이트에서 검색이 가능하지만, 실제 데이터는 사용자가 제출한 곳에서만 접근 가능합니다. 데이터가 매우 크거나 표준화 수준이 낮고, 동일한 실데이터가 여러 방식으로 재해석될 수 있는 여지가 있는 경우라면 이러한 방식이 적합할 수 있습니다. 염기서열 데이터는 레퍼런스의 성격이 강하고 표준화된 주석화 방식 및 동기화 전통이 오랫동안 이어져 왔기에 현재의 모습으로 성숙하게 되었습니다.

KOBIC의 국가바이오데이터스테이션(K-BDS)은 국내 바이오 분야의 연구개발사업에서 도출된 연구 데이터를 통합관리하기 위하여 2022년 말부터 본격적으로 운영되었습니다. 정부로부터 연구비를 지원받은 국내 연구자들은 관련 법령에 따라 생명연구자원 연구성과물(‘데이터’)을 K-BDS에 등록해야 합니다. 그러나 학술지에서 공인하는 저장소는 아니었으므로 논문을 내기 위해서는 이를 INSDC에 다시 등록해야 하는 번거로움이 있었습니다. 점점 많은 학술지가 K-BDS를 데이터 저장소로 인정하고는 있지만, 아직 INSDC와 같은 정도로 인정을 받는 수준은 아니었습니다.

그러던 중 KOBIC과 오래 교류를 해 왔던 일본 DDBJ에 의해 우리의 존재가 INSDC측에 알려지게 되었고, 연합체의 멤버십 확장 정책화에 따라서 2024년과 2025년 2년 연속으로 연례 회의의 초청을 받아서 신규 회원으로서 가입 가능성을 논의하게 되었습니다. 이는 데이터 폭증, 지역 데이터 주권 요구, 그리고 기술·표준의 성숙이 맞물려서 INSDC를 개방형 네트워크로 전환하려는 정책 변화의 일환입니다.

현재는 NGS 원데이터를 K-BDS에 등록하면 DDBJ를 거쳐서 INSDC로 전송되는 데이터 브로커링(data brokering)이 원활히 이루어지고 있어서 최소한 NGS 데이터의 경우 논문 투고를 위해 INSDC에 별도로 등록할 필요가 없습니다. 우리의 기술적 준비 상황이 INSDC의 요구 수준을 충족하여 그 일원으로 인정이 된다면, 우리 데이터가 K-BDS에 등록된 그대로 전 세계로 퍼져 나가게 될 것입니다.

우리가 INSDC의 일원이 된다는 것은 어떤 의미가 있을까요? 앞서 설명드렸듯이 과제 평가를 위한 연구성과물 등록과 학술지에 논문을 내기 위한 국외 리포지토리 등록을 한 번으로 해결할 수 있는 매우 현실적인 편익을 제공합니다. 그러나 이 편익을 더욱 뛰어넘는 의미가 있습니다. 선진국이 이미 만들어 놓은 생명·의료 분야의 정보 인프라를 이용만 해 오던 수동적 위치에서, 세계 10위권의 글로벌 중추국 위상에 어울리는 역할을 바이오 정보 분야에서 수행할 수 있음을 입증받게 되는 것입니다. 예를 들어 메타데이터 표준 강화나 민감 데이터 보호 정책, DSI 이익 공유와 같은 정책 결정에 참여함으로써 국내 법·윤리와 국제 규범 간의 조율권을 확보할 수 있으며, K-BDS를 통한 국외 연구자의 데이터 등록도 늘어날 것으로 기대됩니다. 즉 단순한 데이터의 제공국에서 국제 생명정보 거버넌스의 일원이 되는 것입니다.

‘데이터 공유지’를 조성하기 위한 기술을 이용하여 만든 별도의 파생 데이터베이스 및 서비스에 INSDC의 숨은 매력이 있는지도 모릅니다. 각 멤버들은 공유되지 않는 영역에서는 독자적인 기술력을 자랑합니다. KOBIC은 K-BDS가 본격 출범하기 이전부터 클라우드 기반의 생명정보 분석 워크플로우 설계 및 활용 시스템을 서비스해 왔으며, INSDC에서는 직접 다루지 않는 단백체·대사체·이미지·화합물 데이터를 수집함으로써 멀티모달 AI 시대를 위한 대비를 착실히 해 왔습니다.

INSDC는 오픈 사이언스를 위한 실천 모델이자 매우 구체적인 성공 사례입니다. 그러나 회원이 되었다고 하여 수집한 모든 데이터를 국경 바깥으로 내보냄을 의미하지 않습니다. 개인의 유전체 데이터는 재식별 가능성이 있으며, 다른 데이터와 결합할 경우 그 가능성은 더욱 커집니다. 또한 많은 국가에서 유전체 정보는 개인정보의 한 종류로 간주되어 제공자의 명시적 동의 없이는 국외 리포지토리에 저장할 수 없습니다. 따라서 이러한 데이터는 제한된 접근을 표방하는 별도의 리포지토리에 안전하게 저장되며, INSDC의 자동 동기화 대상도 아닙니다. 

데이터 주권은 국내에서 생성된 데이터를 국경 안에 가두고 국내 연구자와 산업계에서만 쓸 수 있게 만드는 소극적인 의미로만 해석해서는 곤란합니다. 국제 무대에 동참하면서 기술 동향을 정확히 파악하고 정책 마련 과정에 적극적으로 참여해 나갈 수 있을 때, 비로소 소버린 AI로 나아가는 지름길로 접어들 수 있다고 생각합니다.

INSDC 가입은 단순히 데이터가 국경을 넘어 흐르도록 하는 기술적 절차가 아니라, 한국이 세계 생명정보 질서의 한 축을 담당하겠다는 선언입니다. KOBIC은 준비되어 있고, 국제사회는 새로운 파트너를 받아들일 준비가 되어 있습니다. 그러나 그 기회는 오래 열려있지 않으며, 우리가 이를 노리는 다른 국가도 존재할 것입니다. 데이터 주권을 지키면서도 세계 표준을 주도하는 나라, 국내 연구자를 돕고 해외 연구를 끌어들이는 허브 국가, 그리고 멀티모달 AI 시대의 기반을 다지는 전진기지—이 모든 길이 INSDC에서 시작됩니다. 지금이 그 문을 열고 나아갈 시간입니다.

Nano Ardule MIDI Controller 제작 - 실수를 통해 배우다

바로 직전의 글(링크)에서 감히 '완성 단계'라는 말을 했었다. 납땜은 이것으로 다 되었으니 앞으로는 코드를 작성하면서 단계별로 테스트를 진행해 나가면 최종 목표에 도달할 것이라는 허황된 생각을 했던 것이다. 주말 작업을 하면서 정말 많은 실수를 발견하였다. 금요일까지만 해도 앞으로 기판 고정용 나사를 풀 일이 없으리라 여겼으니 얼마나 가소로운 생각이란 말인가!

정말 운이 좋았다면 문제 자체가 발생하지 않았을 수도 있다(예: 절연 불량). 그러나 초심자의 행운이 항상 좋은 것만은 아니다. 경험하지 못한 실수를 나의 실력으로 착각하고 있다가 언젠가는 나를 다시 찾아올 것이고, 그때에는 원인을 몰라서 더욱 헤맬 수도 있다. 비교적 초기 단계에 실수를 발견하여 바로잡게 됨을 다행으로 여겨야 할 것이다.

첫 번째 실수전원 공급 방식의 몰이해가 빚은 것이었다. 5V가 나오는 외부 전원 어댑터로 아두이노 나노를 작동할 때에는 Vin 핀이 아니라 5V 핀으로 넣어야 한다. Vin로 들어오는 직류전원은 아두이노 나노에 내장된 레귤레이터로 안정화를 거치면서 낮아지므로,  최소 7V는 되어야 한다.

USB 케이블을 연결하여 테스트하면서 LCD 밝기를 적당하게 맞춰 놓은 뒤 USB 접속을 끊고 외부 전원 어댑터를 연결하면 표시가 너무 밝아 알아볼 수 없는 상태가 되어 LCD 모듈 뒤의 가변저항을 돌려서 조정하였다. 여기에서 뭔가 눈치를 챘어야 했다. LCD 등 외부 모듈을 위한 전원은 아두이노 나노의 Vin에서 뽑았다. 이게 중대한 실수였다. Vin은 전원 입력을 위한 곳이지, 출력을 위한 곳은 아니기 때문이다. 여기에서 전압이 나올 수는 있지만 5V보다는 낮고, 충분한 전류를 공급하지도 못한다.

이보다 더 큰 실수는 어댑터에서 공급되는 5V를 Vin에 찔러 넣었다는 것이다. 앞서 언급했듯이 Vin에는 7~12V를 넣어 주어야 한다. 올바른 전원 연결 요령은 별도의 문서(링크)로 정리하였다. 5V 핀의 성격이 다면적임을 잘 이해해야 한다. USB 연결 시에는 외부 모듈을 위한 5V 공급선이 될 수 있고, 어댑터 사용 시에는 외부 전원이 들어오는 입구가 된다.



두 번째 실수Burnley 솔더링 페이스트의 전류 누설 부작용을 가볍게 여겼던 것. USB 연결을 통한 시리얼 통신 시 RX/TX 단자가 다른 회로와 이어져 있으면 문제를 일으키므로 배선을 끊고 점퍼를 삽입하여 용도에 맞게 닫거나 열 수 있게 해 두었다. 그런데 이를 연결하지 않는 상태에서 아무리 기다려도 스케치 업로드가 완료되지 않는 것을 발견하였다. 아두이노 나노를 소켓에서 뽑으면 업로드가 잘 된다. 이렇게 불편하게 일을 할 수는 없지 않은가.

점퍼를 꽂도록 만든 핀 양단을 멀티미터로 찍어보니 개방 상태가 아니라 수백 옴 정도로 측정이 되었다. 이것은 절대로 있을 수 없는 일이다. TX 핀을 납땜한 패드와 한 패드 건너 곁을 지나는 그라운드 레일 사이의 저항을 측정하니 비슷한 값이 나왔다. 페이스트 잔류물에 의한 전류 누설임에 틀림이 없었다. 패드 사이를 잘 긁어내고 물에 적신 칫솔로 문질러서 무한대 저항으로 만들었더니 비로소 스케치 업로드가 잘 되었다.

세 번째는 실수인지 오해인지 아직 잘 모르겠다. 테스트용 스케치를 업로드한 상태에서 로터리 인코더를 돌리면서 LCD 화면에 나타나는 숫자를 관찰하면 갑자기 값이 튀는 것으로 보였다. 이를 개선하라면 바이패스 커패시터와 '강한' 풀업 저항이 필요하다고 하였다. 어떤 글에서는 바이패스 커패시터만으로 개선이 되었다고 하여 이를 따라서 해 보았다.

103 세라믹 커패시터(10nF = 0.01uF) 두 개를 업어서 인코더 모듈 핀에 직접 납땜을 하였다.


그래도 특정 값에서 튀는 현상이 발견되었다. 항상 같은 값에서 튄다는 것은 좀 이상하다. LCD의 동작을 제대로 이해하지 못한 다른 오해가 그 원인이 아닐까? 숫자를 표시할 때 자릿수를 채우는 방식이나, 이전에 표시된 숫자를 지우는 방식에 대하여 이해가 부족하여 인코더 수치가 튄다고 생각했는지도 모른다. 어쨌든 ChatGPT와 대화하면서 코드를 계속 최적화하였더니 최종적으로는 문제가 사라졌다. 이렇게 하여 LCD와 버튼(짧게 누름 및 길게 누름까지 전부 포함하여)의 동작은 전부 원활하게 되고 있음을 어제의 작업으로 모두 확인하였고, 그 영상을 유튜브에 올렸다.


여전히 손으로 인코더를 빠르게 돌리면 카운트가 누락되는 경우가 종종 발생하였다. 출력핀을 74HC14 인버터에 넣어서 깔끔하게 정리하였다.

PC900 포토커플러를 통한 MIDI IN 신호 처리도 원활하지 않아서 낙담을 하였는데, 이것 역시 기판 세척으로 해결되었다.

어제 작업으로 단계별 코딩 로드맵의 단계 2-로터리 인코더 & 버튼 입력을 통과하였다. 순탄하지는 않았으나 값진 경험이었다. 다음부터는 본격적으로 MIDI 신호 처리에 들어가게 될 것이다.




2025년 8월 21일 목요일

완성 단계에 이른 Nano Ardule MIDI Controller

Nano Ardule MIDI Controller 설계 요약 문서

완성 단계라고는 하지만 하드웨어 제작만 거의 끝나갔음을 의미한다. 아직 플라스틱 케이스 가공을 완벽히 끝내지도 못했고, 코딩은 거의 처음부터 다시 시작해야 한다. 앞으로 특별한 일이 없다면 회로는 바뀌지 않을 것이다. 기능을 하나씩 추가하면서 코드를 짜서 검증해 나가면 된다. 이 과정에서 ChatGPT가 친절한 코치 역할을 할 것임을 믿어 의심치 않는다.



기판 위 커넥터류의 위치가 마음에 들지 않는다. 기판 뒷면의 배선을 되도록 단순하게 만들려고 애를 쓰다 보니 이렇게 되었다. 

단순화했다는 수준이 이런 정도. 남에게 보이기 참 부끄러운 수준이다. 지금은 여기에 몇 개의 커패시터를 덧붙였고, 8월 24일에는 배선 오류도 수정하였다.


MicroSD카드에 담긴 MIDI 파일 재생은 브레드보드 수준에서 실험을 통해 성공하였었다. 당시에는 아두이노 나노의 TX 핀에서 나오는 MIDI 신호를 곧바로 SAM9703 보드로 보냈었다. 지금 만들어진 구성에서는 74HC14 슈미트 인버터 IC를 거쳐서 5핀 MIDI OUT 단자로 나간다. 이것과 GM 사운드 모듈을 MIDI 케이블로 연결하여 정말 MIDI 파일 재생이 잘 이루어지는지 확인해야 한다. LCD와 LED 작동은 만능기판에 제작한 상태에서 잘 작동함을 확인하였다. 

원래 올해의 전자 DIY는 6П6С(6P6S, equivalent to 6V6GT) 싱글 앰프를 고쳐 만드는 것이 목표였다. LibreCAD를 이용하여 상판을 다시 설계하고 필요한 부품도 다 사 두었지만 Korg X2 Music Workstation을 수리하는 것으로 갑작스럽게 방향을 틀었다가 전혀 예상도 하지 않았던 곳까지 흘러들었다. 만약 2004년에 중고 X2를 구입하지 않았다면? 2020년에 아두이노 나노 스타터 키트를 구입하지 않았다면? 만약 이런 초기의 시도가 없었다면 오늘의 뻘짓(또는 성취?)은 존재하지 않았을 것이다. 조금이라도 젊을 때 직업과의 연관성이 당장은 적어 보이더라도 다양한 일을 많이 경험해야 나이가 들어서 삶이 풍성해진다. 어쩌면 그 일이 두 번째 직업이 될지도 모르는 일이니까.


2025년 8월 22일 업데이트

케이스에 구멍을 뚫어서 5핀 DIN 커넥터를 고정해 놓으니 제법 MIDI 기기처럼 보인다.




단계별 코딩 로드맵에 따라 단계 2까지 진행했다가 멈춘 상태이다. 아두이노 나노 A6 핀에 버튼 스위치를 연결하여 디지털 입력용으로 쓰도록 하였는데, 풀업 저항이 필요하다는 것을 알았기 때문이다. 프로그램 업로드 시 충돌이 일어나지 않도록 D0/D1(RX/TX)를 임시적으로 끊는 방법도 모색해 봐야 한다. 이 두 개의 핀은 시리얼 통신에 쓰이는 것으로서, 아두이노 보드를 PC와 USB 케이블로 연결하여 데이터를 주고받을 때 반드시 필요하다. 지금까지는 아두이노 나노를 아예 소켓에서 뺀 상태로 프로그램 업로드를 한 뒤 다시 꽂는 아주 무식한 방법을 쓰고 있다. 배선을 끊고 점퍼핀 처리를 하려니 상당히 번거롭다. 할까 말까 할때는 하라던데...

그림 출처: 나무위키 점퍼(부품).


2025년 8월 25일 업데이트

주말 동안 동안 RX/TX 연결선의 점퍼 처리, 오배선 수정, 절연 불량 문제 해결, 로터리 인버터의 바이패스 커패시터 연결 등 꽤 많은 일을 하였다. 74HC14의 8번 핀이 소켓에 제대로 꽂히지 않은 것도 새롭게 발견하여 다시 제대로 꽂았다. 이로써 LCD와 버튼 동작의 테스트까지는 완벽하게 진행하였다. 이날 소화한 작업의 분량과 배운 점이 상당히 많으므로 별도의 글로 정리하도록 하겠다.

2025년 8월 20일 수요일

샘 올트만 가라사대 'AI는 거품이다'

AI로 큰 주목을 받는 회사가 '우리는 AI 거품 속에 있다'고 말하였다. 이 발언은 증시에 영향을 끼쳐서 AI 관련주 중심으로 미국은 물론 우리나라에서도 매물이 쏟아졌다고 한다. 오픈AI는 이 분야를 선도하면서 대중적인 관심이나 투자 유치 등에서 가장 많은 수혜를 입는 기업이라고 생각하였는데, 왜 이런 냉정한 발언을 했을까?



샘 올트만은 늘 자신감에 넘쳐 있으면서 누구보다 이미지 마케팅에서 열성적이었던 사람 아니었던가. 어느 댓글에서 본 표현을 가져오자면 '기대를 만들고 부추기는 사람'이라는 말에 아주 잘 어울린다. 어떤 맥락에서 AI가 거품이라는 말을 했는지-본인이 그 거품의 가장 큰 수혜자임이 분명한데-원문을 찾아보기로 했다. 원문은 The Verge라는 매체에서 직접 올트만과 진행한 긴 인터뷰 기사인데 구독을 하지 않으면 전체를 읽을 수 없다. 수익 창출을 위해 매우 현명한 방법이지만 얄밉다. 그러나 핵심 메시지를 추린 별도의 기사를 같은 매체에서 제공하고 있으니 그건 또 고마운 일이다. 아마도 게시한 글의 레벨에 따라서 완전공개와 구독자에게만 공개로 구별하는 것 같다.

Sam Altman says 'yes,' AI is in a bubble - The Verge 2025년 8월 15일

올트만은 투자자들이 AI에 비합리적일 정도로 과도하게 기대하고 있다고 하였다. 이 현상은 1990년대 말 닷컴 버블과 유사하다. 그는 '아이디어만 있는 3인 스타트업이 엄청난 가치로 평가받는 것은 비합리적'이라고 하였다. 누군가는 돈을 벌지만, 그것은 돈을 잃는 사람이 있기에 가능한 일이다. 그러면서도 전반적인 경제에는 긍정적인 영향이 있을 것이라고 낙관하였다.

이 인터뷰는 8월 7일에 공식 공개된 GPT-5에 대한 실망스런 반응 직후에 나온 것이다.

GPT-5 failed the hype test - The Verge 2025년 8월 15일

어떤 글에서는 'GPT-5 launch fiasco'라는 표현을 사용하였다. Hype(사기, 과대 광고), fiasco(대실패)... 평소에 잘 쓰지 않던 말을 이번 기회에 접하게 되었다.

어쨌든 이 실패를 접하고 나서 사람들의 날카로운 시선을 돌리고 감정을 진정시키기 위해 의도적으로 AI는 거품이란 말을 한 것이 아닌가 싶기도 하다. 나는 얼마 전부터 ChatGPT 화면 왼쪽 위에 'ChatGPT 5'라는 낯선 번호가 보이는 것에 대해 실은 별로 신경을 쓰지 않고 있었다. 기대에 미치지 못한 GPT-5에 관해서는 다음의 링크를 참조해 보라.

GPT-5: 출시 지연, 과대평가됐고, 기대에 못미침 그리고 그보다 더 심각한 문제는 - GeekNews 22448

원본 글(substack.com, 이것 역시 유료 구독을 해야 읽을 수 있음)을 쓴 Gary Marcus는 누구인지 찾아 보았다.

Scientist, author and entrepreneur, know as a leading voice in AI. Six books including The Algebraic Mind, Rebooting AI, and Taming Silicon Valley; NYU Professor Emeritus. 링크

그의 날카로운 분석도, 그리고 GeekNews의 댓글도 모두 유익하였다. 특히 댓글에서 드러난 Marcus에 대한 비판도 흥미로웠다. 비평가에 대한 비평이라!

  • 하필 포스트 쓴 사람이 헛소리만 하던 Gary Marcus라서 영...
  • Gary Marcus는 항상 분석이 얕은 편임
  • AI 커뮤니티는 Marcus 같은 독립 전문가가 더 필요함

'지금 GPT에 진짜 필요한 가장 큰 개선점은, 모르면 모른다고 말하는 것임'이라는 댓글이 특히 가슴에 와 닿았다. 다음의 댓글을 특히 시사하는 바가 커서 아예 화면을 캡쳐하여 그대로 옮기기로 하였다.


생명 및 의학 관련 연구계에서는 아직도 양질의 데이터가 더 필요하다고 주장하고 있다. 이는 곧 데이터 생산을 위한 투자 논리로 이어진다. 그런데 이제 훈련 데이터는 남아있지 않다는 것이다. 나의 상식으로는 합성 데이터가 어떻게 학습에 쓰일 수 있는지 감조차 잡기가 어렵다. 

이토록 세상은 빨리 변하고 있다. 앞서 소개한 Geek의 댓글 중에서는 '(AI로 인해) 모두 실업될 것처럼 호도되는 분위기는 정말 어이없다'고 한 것이 있었다. 그런데 다음과 같은 기사가 있음에 관심을 가져야 한다. 기자의 분석이 100% 옳다고 할 수는 없겠지만, 초짜 신입 직원 채용 고민과  '그거 AI로 대신 하면 되는거 아냐?'라는 생각 사이에 저울질을 하다 보면 결론은 너무나 자명하다. 물론 판교의 활력이 사라진 다른 이유도 있을 것이다.

'4050 고인물' 천국 된 판교…20대 초짜 신입 사라진 이유가 - 한경 2025년 8월 17일


2025년 8월 18일 월요일

납땜 용어 900M, 936, 937, T12

제목에 나열한 낱말은 전부 하코(HAKKO) 생태계에서 유래한 것이다.

요즘 내가 취미 작업을 위해 사용하는 납땜인두는 (주)엑소의 세라믹 히터를 사용한 40와트급 제품 JY-2200이다. 2019년부터 사용 중이며, 내 생애 네 번째의 납땜인두이다. 온도도 빨리 오르고 열량도 높아서 트랜스포머 단자 납땜 등 큰 작업물을 대상으로 납땜을 하기에는 매우 좋다.

칼팁이 있으면 편리할 것 같아서 얼마 전 알리익스프레스에서 별 생각 없이 팁 세트를 싼 값에 구입하였다. 그러나 나의 엑소 인두에는 전혀 맞지 않았다. 인두팁의 규격에 대해 아무런 지식도 없이 세라믹 히터를 쓰는 납땜인두라면 그냥 다 맞을 것으로 기대하고 덜컥 구입한 것이 화근이었다.

출처: 알리익스프레스.
구입 후 실제로 받은 제품.

900M이라는 것은 하코에서 제조한 온도조절형 스테이션 납땜인두에 쓰이던 인두팁 규격이라고 한다. 실제 개별적인 팁은 900M-T-I(뾰족한 콘형), 900M-T-K(칼날형) 같은 형식으로 부른다. 이 인두팁(+인두 핸들)이 쓰이는 스테이션은 하코 936/937이 대표적인데, 2009년에 공식 단종되었다. 936은 다이얼식, 937은 버튼식(+LED 디스플레이)으로 온도조절 메커니즘은 그렇게 정밀하지는 않다고 한다. 트랜스포머를 통해 약 24V 교류 전원을 세라믹 히터에 인가하고, 센서를 통해 온도를 측정하면서 과열되면 전원을 차단하는 방식이다. 요즘은 중국산 호환(카피) 제품이 널리 판매되고 있다. 인두핸들, 온도조절기 회로부 등 호환 부품의 가격도 싸고 사용자가 얼마든지 교체할 수 있다. 907은 핸들의 형번이다.

Hakko 936의 호환품 TAIKD-936b. 가격은 배송료 별도 16,550원. 출처: 알리익스프레스.

그 후에 나온 모델인 FX-888은 DC 펄스파와 센서를 이용한 PID(Proportional-Integral-Derivative) 제어 방식을 사용한다. 여기까지는 팁과 히터를 분리할 수 있었다. 그보다 나중에 나온 T12 규격부터는 히터와 팁이 일체 형태를 띠고 있다. 이를 흔히 고주파 인두라고도 하는데, 사실 ‘고주파’라는 용어는 교류에 대해 쓰는 것이 옳다.

스테이션 타입의 인두는 인두 핸들과 이에 딸린 케이블이 가볍고 유연해서 편하다는 말이 있다. 그러나 스테이션의 무게를 생각해 보라. 이동하지 않고 작업대 위에 두고 쓰는 조건에서는 매우 적합한 물건일 것이다.

요즘은 한술 더 떠서 C-type USB 단자가 달린 ‘스마트 인두’까지 나왔다. 어떤 것은 충전도 된다! 몇 볼트의 직류라고 해서 우습게 생각하면 안 된다. 불과 수 초 만에 무연납을 녹일 수준으로 온도가 올라가기 때문이다. GVDA라는 중국산 브랜드의 GD301 같은 제품이 꽤 인기인 것 같은데, 이런 부류는 LCD와 버튼까지 달려 있어서 떨어뜨리면 금방 망가질 것만 같다. 220V에 직접 연결해서 쓰는 인두는 내동댕이쳐도 망가질 일이 별로 없지 않은가.

JY-2200은 만능기판 작업을 하기에는 너무 용량이 커서 조금만 부주의하면 패드가 떨어져 나가거나, 또는 납이 산화되어 광택이 없어지면서 잘 흐르지 않는 일이 생겼다. 그래서 요즘은 원래 자작 트랜스포머 권선기에 사용하려고 만들었던 조광기(전동 드릴 속도 제어용)를 대충 연결해서 쓰고 있다. 그런대로 만족하고는 있지만, 기왕 구입해 놓은 900M 인두팁 식구들을 언젠가는 사용해 보고 싶다. 알리익스프레스에서 ‘907 인두(iron)’로 검색하면 900M 팁을 사용하는 저렴한 스틱형 온도조절 인두(스테이션형 아님)가 꽤 나오니 나중에 적당한 것을 고르거나, 아니면 스테이션에 대한 호기심으로 936 호환품 중에서 고를 가능성이 매우 크다.

JY-2200을 구입하였을 때 T-B 기본 팁 외에도 끝이 더 뾰족한 교체용 팁(T-I)이 하나 더 들어 있었다. 어제 이것으로 바꾸어 놓으니 만능기판 작업을 하기가 훨씬 수월해졌다.

새로 교체한 엑소 SY 시리즈의 T-I 인두팁. 세라믹 히터 겉을 둘러싼 파이프가 살짝 휘어 있다. 열에 의한 변형일지도 모른다. 이런 상태에서는 나중에 내부의 세라믹 히터(구입처)를 교체하기 아주 곤란하다. 새 히터를 구입하느니 아예 납땜인두 자체를 바꾸는 것이 현명할 것이다.

경주 보문호 주변을 달리며 많은 생각을 하다

작년(8월과 10월 2회)에 이어 올해 여름에도 휴가차 경주를 찾았다. 남들은 경주를 왜 그렇게 자주 가느냐고 하지만, 이곳은 나에게 항상 새로움을 주는 곳이다. 또한 변하지 않는 경주의 모습에서 평안함을 느낀다. 뜨거운 여름날, 첨성로를 걸으며 인왕리 고분군에 펼쳐진 거대한 무덤의 곡선을 보라. 거대하고 부드러운 윤곽선 아래로 꽉 채워진, 이보다 더 선명할 수 없는 잔디색(lawn green, #5EA152, color-hex 웹사이트)의 공간을 보고 있노라면 인공물 중에 이런 편안함을 자아내는 것이 또 있을까 하는 생각이 든다. 

거대한 인교동 119호분. 이 동네에서 내가 가장 좋아하는 고분이기도 하다.

북쪽에서 바라본 월정교.


월정교 안에서 맞는 바람이 얼마나 시원하였던지!

태종무열왕릉을 중심으로 하는 서악동 고분군도 마찬가지이다. 이곳은 경주 중심가에 비하여 관광객의 발길은 적은 편이다. 소나무 그늘에서 쉬면서 새소리를 듣고 있노라면 이보다 더 좋은 휴식이 없다.

자연석 그대로의 소박한 호석(護石)이 무덤을 둘러싸고 있다.

거북 모양 받침돌(귀부)는 하나의 바위를 정교하게 깎아서 만든 것이다. 몸통돌(비신)은 어디로 갔을까?

이번에 찾은 경주는 오는 10월 31일부터 11월 1일까지 열리는 APEC 준비로 매우 분주한 모습이었다. 몹시 더운 날씨임에도 불구하고 소규모 그룹으로 가이드와 함께 탐방 중인 외국인 관광객도 꽤 많이 보였다. 첫날에는 고속도로에서 경주 IC로 진입하기 위해 몇 km나 줄을 지어서 1시간이 훨씬 넘는 시간을 보내야만 했다. 경주를 그렇게 많이 왔지만 이렇게 교통체증을 겪어 보기는 처음이었다. 특히 황리단길 인근은 차량이 얼마나 몰려드는지 여기를 지나는 것을 후회할 지경이었다. 겨우 쪽샘지구 임시주차장에 차를 대고 대릉원을 찾을 수 있었다.

대릉원에서.


이틀째에 찾은 불국사는 언제는 옳다! 그래서 나는 여기를 불굳(good)사라고 부를 만큼 경주 여행에서 언제나 들러도 좋은 곳이다. 약간의 입장료를 내더라도 불국사박물관을 들러 보기를 권한다. 특히 요즘과 같이 더운 여름에는 불국사 경내를 둘러보다가 지친 몸을 이끌고 땀을 식히기에 아주 좋다.




대종천 다리 밑에서 더위를 식히다

불국사에서 이틀째 오전을 보낸 뒤 읍천항으로 향했다. 읍천항은 감포 바닷가(봉길해수욕장)으로 나가서 남쪽으로 내려가다가 월성원자력본부를 지나면 나오는 작은 포구다. 돌아오는 길에는 T맵이 아니라 차량용 내비게이션을 이용했더니 토함산로(길이 4.3km의 토함산터널 통과)를 따라 서쪽으로 가다가 갑자기 경감로로 빠져나가라는 것이었다. 영문도 모른채 다리 밑 그늘을 지나는데 개울가에 자동차 여러 대가 서 있고 사람들이 더위를 식히는 모습이 보였다.  여기는 축암교(토함산로) 아래를 동쪽으로 흘러서 감포읍에서 바다로 나가는 대종천에 해당한다. 서쪽으로 보이는 한국수력원자력 본사 건물까지는 대략 1.1km 떨어진 곳이다. 



이곳의 GPS 좌표는  N 35.793, E 129.403

그대로 지나쳤다가 차를 되돌려서 물가로 내려가 보기로 하였다. 물이 맑고 얕아서 아이들이 놀기에 적당해 보였다. 아마 경주 시민들만 알고 있는 로컬 놀이터인 것 같았다. 고기를 구워 먹는 나이 지긋한 부부도 있었고, 바로 옆 텐트에서는 할아버지와 손주까지 가족 3대가 와서 물놀이를 하고 놀다가 짐을 챙겨 돌아갈 준비를 하고 있었다. 건너편에서는 어느 할머니가 도시락 그릇을 냇물에 부셔 내더니 아예 바지를 걷고 물에 들어와서 머리를 감는다! 엄격하게 관리하는 유원지가 아니므로 모두가 푸근한 마음으로 그러려니하고 신경을 쓰지 않았다. 다음에도 더운 날 감포읍에서 경주 시내로 돌아올 때는 이 곳을 찾아 더위를 식히고 가고 싶다. 여기를 거쳐서 보문관광단지로 돌아오려면 추령을 지나 상당히 구불구불한 도로를 따라가야 한다. 속도를 내기도 어려운데 뒤에서 바싹 붙어서 따라오는 비매너 승용차 때문에 상당히 신경이 쓰였다.

저녁이 되어 보문관광단지 안에 자리한 숙소를 찾으니 전국 각지에서 모여든 유소년 축구단의 버스가 주차장을 가득 메우고 있었다. 아이들을 유명한 축구 스타로 키우고 싶은 부모도 있을 것이고, 그저 운동을 잘하고 스포츠를 통한 협동심과 리더십 함양을 위해 축구팀에 아이를 넣은 부모도 있을 것이다. 지도자로 여겨지는 사람들이 모여서 선수들의 기용에 대해서 이야기하기도 하고, 어느 방 안에서는 아이들을 모아놓고 뭔가를 지시하는 목소리가 들렸다. 1층 복도에 내 놓은 빨래 건조대에 가득 널린 유니폼을 보면서 경기를 대비하는 사람들의 희망과 고단함을 느낄 수 이었다. 나는 아이들을 키우면서 스포츠의 재미나 의미를 전혀 가르쳐 주지 못했다. 이는 정말 아쉽다.

보문호의 박정희 동상

저녁을 먹은 뒤 여행의 피곤함과 식곤증으로 잠시 잠에 빠졌다가 운동복으로 갈아입고 밖으로 나왔다. 여행지라고 해서 이틀에 한번 꼴로 실천하는 달리기를 게을리 할 수는 없는 노릇. 이번에는 보문호의 산책로을 뛰어 보기로 하였다. 걷기 좋게 길이 잘 단장되어 있고, 호수에는 각종 조형물이 조명을 받으며 빛나고 있었다. 둘레길은 총 8km라고 하니 다음 기회에는 한 바퀴를 달리는 것도 좋을 것이다. 삼삼오오 이야기를 하며 거니는 여행객 사이로 총 5km의 거리를 뛰었다. 호수의 북쪽 끝에 해당하는 곳에 이르니 '대한민국 관광역사 이곳에서 시작되다'라는 글씨가 불을 밝히고 있었다. 그 이름하여 관광역사공원. 세워진지 얼마 되지 않아 보였다. 그간 보문관광단지에서 여러 차례 숙박을 했지만 호숫가에 내려와 본 일은 한번도 없었다. 공원 내부를 잠시 돌아보는 중에 뜬금없이 박정희 전대통령을 표현한 조형물이 유난히 많다는 것을 발견하였다. '여기는 내가 설계하고 만든 곳이니 고마워 해야 돼!'를 부르짖는 듯한.

여기에서는 별다른 이상한 느낌을 받지 않았다.

영웅 만들기? 박정희가 앞서 나아가고, 그 뒤로 보문관광단자의 역사가 쓰였음을 보여주고 싶은 의도가 적나라하게 나타난 조형물 및 전시 자료.

이런 자료는 어디 실내 기념관에다 전시할 일이다.


이 동상이 나중에 미술사적으로 어떤 평가를 받을지 걱정이 된다.

경주 보문관광단지가 박정희 시대에 첫 삽을 떴다는 것은 대충 알고는 있었다. 특히 이 지역은 여느 관광지와는 달리 정부 주도로 이루어졌다는 것이 큰 특징이다. 이것이 과연 옳은 방식이었는지는 두고두고 논할 일이다. 어쨌든 내가 가족과 함께 이곳을 자주 찾아 즐길 수 있는 기반은 이때 마련된 셈이니까 말이다. 대통령이 1971년 여름 직접 친필로 '경주발전계획 작성 지침'을 써서 내리고, 건설부에서는 이 지침을 받들어 두 달 만에 계획을 완성했다나? 

박정희 전대통령 친필로 쓴 경주발전계획 지침-40년전 '경주발전계획' 아버지 뒤이은 딸이 개발 마무리 해줄까(영남일보 2013년 1월 23일)

지금 생각하면 한숨이 나오는 기사가 아닐 수 없다. 이것이 대다수 지역민들의 정서인가... 이 기사에 의하면, 박정희가 쓴 친필 지침은 창고에 장기간 보관만 되어 있다가 박근혜 취임 직전 재발견(?)되어 기사화되었다. 그리고 현재 관광역사공원에서 전직 대통령의 동상과 함께 전시되고 있었다.

기사를 검색해 보니 50억원을 들여 지은 이 공원이 2024년 문을 열면서 내부 곳곳에 세원진 박정희 동상 때문에 적잔이 논란이 되었다고 한다. 개장 전까지는 이런 구체적인 설치물에 대해서 제대로 공개가 되지 않았었다고 한다. 내 생각도 이런 비판과 별로 다르지 않다.  

"내 나라의 미래는 가 그려 나간다." 

아마 박정희는 이런 생각을 갖고 있지 않았었을까? 아마 스스로를 '유일한 대한민국 디자이너'로 생각했을 것이다. 박정희의 친필 휘호로 잘 알려진 '내 一生 祖國과 民族을 爲하여'가 떠오른다. 이 문장에선 여러 '나'가 모여서 '우리'가 된다는 생각은 별로 없었을 것이다. 어느 한 사람의 아이디어가 즉시 구체화하여 계획으로 세워지고, 이를 무서운 속도로 추진하였을 것이다. 그렇게 하여 경부속도로도 생겨나고, 보문관광단지도 만들어졌을 것이다. 

경부고속도로 건설 뒷이야기① 三無 상태, 치열한 전투  - 월간 국토해양저널 2001년 3월호에 실렸던 글

그렇다면 그 '그림'을 순식간에 그려낸 사람은 진정한 천재급 지도자였단 말인가? 평전에 의하면, 그의 리더십은 단계적으로 이루어졌다고 한다(박정희도 처음엔 카리스마 없었다… 철저한 기획, 단계적으로 이룬 리더십 조선일보 2023년 6월 15일).

어쨌든 그 시절에는 그렇게 세상이 움직였다. 어려운 시대에는 이러한 방식이 유일하고 가장 효율적인 모습이었을 것이다. 그 움직임을 찬성하지 않거나, 밀려난 사람은 많은 괴로움을 당하고 잊혀져 갔을 것이다. 

지금 나는 박정희가 뿌린 씨앗이 성장하여 여문 과실을 따 먹고 있는가? 그런지도 모른다. 하지만 그가 뿌린 씨앗이 정말 정당하였는지, 그 과정 중에서 어떤 부정적인 효과가 발생하였는지는 얼마든지 비판해 볼 수 있다. 우리 사회는 그런 비판을 수용할 정도로 자유로운 곳이기 때문이다. 

독재를 가미한 정부 주도형 모델이 일제 강점기와 6·25 전쟁이라는 어려운 처지를 헤치고 국가의 기틀을 세우기 위한 유일한 방법이었다고 믿는 사람들이 아직도 많다. 그러나 동상 건립과 같은 방법을 이용하여 그들의 마음 속에 있는 지도자의 추억을 소환하는 곳은 바람직하지 않다고 본다. 특히 최근의 보수 정권일 때 이런 움직임이 더욱 심하게 나타나고 있다. 역사를 바로 알고 '자유로운' 나라를 바로 세우자는 명분을 내세우지만, 실은 다른 정치적인 목적을 품고 있을 것이다. 그에 대한 올바른 재평가는 더 나중에 해도 늦지 않다. 박정희에 대한 숭모는 숭미(崇美)와 더불어 반드시 극복해야 할 정신이라고 믿는다. 

관광지 경주에서 정말 많은 생각을 하고 돌아왔다.


감은사지 서탑을 바라보며.

월성원자력홍보관에서 찍은 원자로의 모습. 월성원자력발전소는 우리나라 유일의 중수로형 원전(3기)을 사용한다. 모든 사용후 핵연료는 각 원자력발전소의 임시 저장 시설에 보관되는데, 월성원자력발전소의 경우 포화율이 가장 높아서 92%에 이르며, 2031년이면 꽉 찬다. 대책이 필요하다. 안전기준을 만족하여 계속운전에 착수한다 하여도 사용후 핵연료를 둘 곳이 없다면 어떻게 하겠는가. 우리나라는 재처리도 하지 못한다. 사족으로서 용어의 문제-원자력발전이냐, 핵발전이냐?(박정희도 '핵발전'이라 불렀다)

감은사지 동탑의 시원한 그늘에서 촬영.