외부에서 오송역으로 가는 경로. 오송역을 출발지로, 외부를 목적지로 하면 철도 심벌 위에서 방향을 잃기 쉽다. |
위에서 끊긴 종착점은 바로 오른쪽에 뚝 떨어진 8번 출구이다. 위성사진 모드로 해야 비로소 출구 번호가 보인다. |
외부에서 오송역으로 가는 경로. 오송역을 출발지로, 외부를 목적지로 하면 철도 심벌 위에서 방향을 잃기 쉽다. |
위에서 끊긴 종착점은 바로 오른쪽에 뚝 떨어진 8번 출구이다. 위성사진 모드로 해야 비로소 출구 번호가 보인다. |
DNA 이중나선이 품고 있는 암호를 해독하면서 인류는 생명의 신비가 이 안에 다 들어 있다고 여기고 새로운 지식을 밝혀 나가는 과정에 열광했을 것이다. 하지만 요즘의 결론은 어떠한가? 유전자가 생명 현상을 전적으로 결정한다는 것은 심각한 편견이며, 넌코딩 영역이라고 불리던 곳(실제로 인간 유전체에서는 압도적인 영역을 차지함)의 중요성이 점점 더 부각되고 있다. 실제로 국제우주정거장에서 혈액 줄기세포를 이용한 실험 결과에 따르면 우주에서 세포는 비정상적으로 활발해져 너무 빨리 늙어버렸다고 한다. 특히 평소에는 휴면 상태에 있던 영역(넌코딩 영역을 포함하는 '다크 게놈')까지 깨어나 들썩이기 시작하여 노화 가정을 더욱 가속했다고 한다.
코딩 영역과 그 주변부의 '뉴클레오티드 캐릭터 시퀀스'를 이해했다고 해서 우리가 생명의 신비를 완벽하게 이해했다고 보기 어렵다. 징검다리의 위치를 파악하고 겨우 건너게 되었다고 해서 큰 개울의 전체를 파악한 것은 아니기 때문이다. 코딩 영역은 물론이요 넌코딩 영역의 기능을 다 알게 되었다고 해서, 유전체가 모든 것을 전부 결정하고 있다는 생각을 해서는 곤란하다. 유전자(넌코딩, 다크 게놈 이런 것을 다 포함해서 생각해도 좋다)가 어떤 형태로 발현되어 개체의 특성을 나타내도록 만드는 과정을 크게 지배하는 것은 결국 외부 요인이기 때문이다. 모든 것이 유전체에 의해 결정되어 있다고 미리 낙담하지 말자. 이것이 오늘의 이중나선 선생님이 남기는 한 마디이다.
![]() |
롱 디엔에이? 이중나先生(이중나선생)의 오늘의 말씀. |
'모든 것은 (유전자에) 다 결정되어 있다' 또는 '단기간에 성과를 내야 한다'라는 생각은 우리를 좁은 사고의 틀에 가두게 된다. 특히 효율을 중시하는 자본주의 경제체제라든가 몇 년 뒤에 선출에 의해 새로운 정치 지도자를 뽑아야 하는 현대 사회에서는 아직 태어나지 않은 미래의 구성원들(그리고 그들이 물려받아야 할 환경을 포함)을 희생하여 최적의 현재를 만들기 위해 스스로를 채찍질하게 만든다.
리처드 피셔의 『롱 뷰』(원제: The Long View)는 이러한 단기적 사고가 개인과 사회에 미치는 영향을 비판하면서 장기적 사고로 전환하는 것이 최우선 과제임을 강조하고 있다. 기후 변화나 환경, 지속 가능성 문제 등은 특정 당이나 대통령이 집권을 하는 몇 년 동안의 짧은 기간 동안 감히 가시적인 성과를 내겠다고 짧은 안목으로 접근할 수 있는 성격의 것이 아니다. 그렇기에 늘 우선 순위에서는 밀리거나 임기 다음으로 책임을 전가해 버리는 것 아니겠는가. 오죽하면 트럼프는 기후위기가 사기라고 떠들고 다니겠는가. 현재의 방식을 그대로 유지해야만 일자리가 유지되고 투자자들이 손실을 입지 않는다고 믿기 때문이다. 정치주기의 단기 인센티브가 주는 문제점이다.
![]() |
최근 읽은 책. 『경험의 멸종』과 『소니 턴어라운드 』는 9월 21일에 독서 기록을 남겼다. |
'미래 세대가 우리에게 해 준게 뭐가 있지요? 왜 우리가 그들을 생각해야 되나요?'라고 물어서는 전혀 해결책이 나오지 않는다. 본문 394쪽에 소개한 어느 무명씨의 말, '노인들이 그 그늘에 앉아 쉴 수 없음을 알면서도 나무를 심을 때, 그 사회는 위대해진다'라는 말은 독자의 마음 속에 깊은 울림을 준다.
![]() |
305쪽의 그림. |
이 책의 1부에서는 단기적 사고의 폐해(자본주의 및 현대 민주주의 정치 체제), 2부에서는 단기적 사고의 근원이 되는 인간의 시간 인식 방식, 그리고 3부에서는 장기적 관점을 키우기 위해 시간 인식을 확대하는 실질절 방법을 다루고 있다. 특히 2장에서는 뇌에 손상을 입은 사람이나 아직 원시적인 생활을 답습하고 있는 사람 무리, 그리고 언어·문화적 배경이 다른 인류 집단에서 단기적인 시간 인식에 어떤 차이가 있는지를 예를 들어 설명하는 것이 매우 흥미로웠다.
장기적 사고를 갖도록 돕는 일에는 예술 작품의 창작에 동참하거나 전통 또는 종교적 의식을 이해하는 것이 포함된다. 그렇다고 해서 종교를 가지라는 뜻은 아니다. 세상의 모든 것이 연결되어 있어서 나의 행동이 모든 사람에게 영향을 미치고, 나아가서는 평생 쌓아 온 일에 의해서 사후에 평가를 받는다고 생각하면—물론 나는 이 세계관을 받아들이지 못한다—보다 장기적인 관점에서 행동을 하도록 스스로를 돌아볼 것이다. 나는 이에 더해서 지구 및 생명의 탄생에서 지금까지의 역사를 자연사적인 관점에서 공부하는 것이 매우 중요하다고 본다. 인간이 세상을 바꿀 수 있는 유일한 지적 존재라는 오만함을 방지하기 위해서 말이다.
이 책을 통해서 장기적 프로젝트의 대표적인 사례를 찾아 보자.
오늘 당장 느끼는 나의 괴로움은 장기적 목표 앞에서 수그러든다. 500년 뒤에 최종본을 만든다는 그 일을 왜 하는지, 목적에 대해서는 명확히 말하기 어렵지만. 지금 독서 기록을 쓰면서 돌이켜 보니 꽤 두꺼운 책을 너무 빨리 읽어 버린 것 같다. 미술관을 천천히 거닐듯 음미하면서 읽어야 하는데 말이다.
<나무 바위>는 시간과 인간의 관계를 나타내는 상징 중 내가 가장 좋아하는 사례다. <애시 돔>처럼 이 나무 바위 이야기는 아무리 계획을 잘 세운다고 하더라도 미래는 좌절을 안겨줄 것임을 드러낸다. 그러나 나무 바위는 또다른 중요한 것을 말한다. 모두가 강을 헤치고 넓은 바다로 나아간다는 사실이다. 사라짐과 망각이 결국 우리 앞에 놓여 있을지 모르지만, 그것은 내일을 위한 것이다. 그 과정에서 의미를 발견할 수 있을 것이다. (380-381쪽)
이는 내시가 인터뷰에서 밝힌 말이다. 원문은 위에서 소개한 <나무 바위>의 링크를 클릭해 보기 바란다.
새 정부가 들어서면서 던져진 화두인 프로젝트 베이스 시스템(PBS)의 폐지를 두고 논란이 뜨겁다("국책연 임무 vs 연구자 역할" PBS 폐지 이후 '출연연' 두고 현장 난상토론, 대덕넷 2025년 9월 25일). 나라의 과학기술 수준을 획기적으로 끌어올려서 경제 성장을 주도해야 한다는 시급함에 장기적 관점이 들어갈 틈은 별로 없다. 아주 개인적인 관점이자 여담이지만 우리나라에서만 '과학과 기술'이 아니라 '과학기술'이라는 한 낱말이 주도적으로 쓰이면서 정책이나 정치적 함의를 담게 된 것은 매우 불편하다.
이 토론회 기사를 보면 저마다 연구자의 입장에서 어떤 식으로 개혁이 이루어져야 하는지에 대한 각각의 주장은 일견 타당하다. 그러나 30년이 넘도록 PBS에 길들여진 우리 출연연 연구자들은, 경쟁을 통하여 수주해야 하는 과제와 무관하게 인건비를 보장받는 것은 '노는 것과 같다'라는 편협한 사고의 희생자가 된 것 같다. PBS 폐지의 핵심은 인건비를 안정적으로 주겠다는 현격한 처우 개선인가? 혹은 현재의 문제점을 타개하기 위해 바람직하든 아니든 일단 과거로 돌아가겠다는 것인가? 우리와 직접적으로 관련이 있는 어느 공무원은 이렇게 말했다. '달라질 것 별로 없을걸요?' 제목과 목표가 제시되고, 구체적인 방법은 일정에 쫒겨 얼기설기 만들어지며, 이를 추진하기 위한 미끼가 되는 단기성 인센티브만 나열된다. 그리고 어떤 형태일지는 알 수 없으나 통제와 관리라는 방식은 계속 남아 있을 것이다. 구체적으로 정해진 것이 없어서 온갖 억측만 난무하고 있으며, 점진적으로 PBS 제도의 폐지가 이루어질 전환기를 위해 마련되고 있다고 알려진 새로운 제도에 대한 불만의 목소리도 적지 않은 것 같다.
오늘의 글도 여러 주제를 널뛰기하고 있다. 글 작성의 주요 목적은 독서 기록이었고, 오늘 도서관에 이를 반납하고 나서도 별도로 구입하여 소장하여 읽고 싶은 생각이 드는 몇 안되는 책이었다고 말하고 싶다. 그리고 우리 '인류세'가 오래 지속되기를 바라는 마음에서 어떤 장기적 시각을 가져야 하는지, PBS 폐지라는 당장의 숙제에 대해서 어떤 자세를 가져야 하는지도 생각하는 계기가 되었다고 말하고 싶다. 인류세의 존속이라고 해서 현 지구의 모든 자원과 미래 세대까지 갈아 넣어야 한다는 의미는 절대 아니다. 무엇보다 중요한 것은 그런 자원 투입으로는 지속 가능성을 보장할 수 없다는 점이다.
오전 내내 연수직 채용 면접에 들어갔다가 허겁지겁 점심을 먹은 뒤 충남대학교로 약학대학(W6)으로 달려갔다. 융합연구 활성화를 위한 공동워크샵이 있었기 때문이다.
![]() |
앗, 쓰레기통... |
바야흐로 인공지능의 시대! 바이오 연구와 인공지능 기술을 접목하고 싶은 연구자는 양 기관에 모두 존재한다. 가까운 곳에 위치한 두 곳 사이에서 진정한 협업이 이루어지길 기대해 본다.
우리 연구소 디지털바이오센터의 김대수 박사가 발표할 차례가 되었다. 제목 슬라이드의 DNA 이중나선 그림을 보니 문득 인삼의 모습과 매우 흡사하다는 생각이 들었다.
갑자기 장난기가 발동하였다. 사진을 챗GPT에 업로드한 뒤 DNA 이중나선 이미지를 인삼 모양으로 바꾸어 보라고 하였다.
슬라이드 자체를 변조하라고 시키지는 않았는데 이런 결과를 만들어 냈다. 가짜 뉴스에 근거로 따라다니는 위조 또는 변조 사진이 이토록 쉽게 만들어지는 것이다! 인삼이 너무 사실적으로 표현되어서 내가 바라는 모습은 아니었다. 이중나선 모습을 유지하면서 다시 그려 보라고 하였다.
이제 내가 의도한 이미지가 생성되었다. 인삼 애호가로서 이 이미지를 종종 활용해야 되겠다. 안타깝게도 인삼을 자주 먹지는 못한다.
BioPerl의 상징 이미지는 먹과 붓으로 쓴 한자를 연상시킨다. 마치 갑골문자처럼 보이기도 한다.
출처: 위키피디아 BioPerl. |
오늘의 장난은 여기까지. 하나만 더 올리고 끝내겠다. 챗GPT에게 글씨를 쓰게 했더니 자꾸 틀려서 파워포인트를 이용할 수밖에 없었다.
분석에 사용한 데이터의 분량이 별로 많지 않아서 빅데이터라고 하기에는 민망하다. 무료 MIDI 드럼 파일 제공 웹사이트에서 80개(8개 장르 x 10개)의 MIDI 파일을 다운로드하여 어떤 타악기 종류가 쓰였는지 조사해 보았다. 표준적인 드럼세트의 각 파트가 대부분이지만, 라틴 계열의 리듬은 그렇지 않다. 분석에 쓰인 총 마디의 수는 1,184개였다. 분석 및 결과의 시각화에는 당연히 챗GPT가 쓰였다.
Rock 장르의 경우 총 13개 정도의 노트가 전부였는데, 장르를 확장하니 55개로 늘어났다. 타악기 연주 정보라서 노트의 길이는 별로 의미가 없다. Rock 장르 파일을 분석하였을 때 표준 GM 드럼 맵에 정의된 것은 10개였다. 왜 이런 분석을 하고 있는가? 아두이노 나노를 응용하여 만드는 Nano Ardule MIDI Controller에서 드럼 머신 기능을 추가하기 위함이다. 당초 계획은 SD카드에 저장한 짧은 MIDI 파일을 반복 재생하는 것이었으나, 구현 과정에서 잦은 에러에 직면하였기에 완전히 다른 방식을 택하기로 했다. 즉, 2마디 단위의 드럼 패턴을 MIDI 데이터가 아니라 스텝 형태로 전환하여 PROGMEM 또는 EEPROM에 저장하기로 한 것이다. 만약 Rock을 기준으로 하여 드럼 소리를 결정한다면 12비트가 필요하고, 여기에 4단계 정도의 액센트 정보를 넣어야 한다.
한 박자에 몇 스텝이면 충분한가? 최소 간격이 16분음표라고 가정하면 4/4 박자 한 마디에 16스텝(4 x 4)이 필요하다. 그런데 빈도가 높지는 않지만 스윙이나 트리플렛을 감안하면 1박자를 12스텝으로 분할해야 한다. 이 경우에 악기 정보까지 포함하면 대략 192B/패턴의 메모리가 필요하다. 1KB에 다섯 패턴 정도를 저장할 수 있다. 메모리 용량이 조금 더 큰 아두이노 나노 에브리를 사용한다고 해도 PROGMEM에 20KB를 확보하기도 힘들 터인데... 어쨌든 이를 실현하려 해도 많은 고민이 필요하다.
장르에 따라 사용하는 타악기의 종류가 무척 다르다. 10~13개 정도의 타악기 소리로 감당할 수 있는 것은 rock 정도. |
드럼 패턴에 따라서는 GM kit이 아닌 다른 것을 적용해야 할 것이다. 다음은 Cakewalk TTS-1에서 설정 가능한 Roland GS 계열의 드럼 킷 아홉 가지.
오랜만에 Cakewalk by BandLab을 실행하였더니 조만간 Cakewalk Sonar(유료)로 바뀐다고 한다. 이제 무료 시절은 끝났는가... 무료 서비스로는 Cakewalk Next라는 것이 있다고 하니 알아보아야 되겠다. |
챗GPT를 사용하면 드럼 MID 파일을 입력하면 두 마디 단위로 쪼개어 이런 '인코딩' 체계에 맞추어 재정리해주는 파이썬 스크립트도 만들어 낼 수 있다. 심지어 드럼패턴 MIDI 파일의 제목(장르)과 실제 사용한 노트를 이용하여 가장 어울리는 드럼킷을 제안해 보라고 했더니 다음과 같은 답변을 주었다.
Rock, Jazz, Blues, Folk → GS의 Rock Kit, Jazz Kit, Brush Kit 등이 더 적절.
Latin, World, Ethnic → GS의 Latin Kit, Ethnic Percussion Kit.
Dance, Contemporary → GM Standard Kit로 재생하면 “어쿠스틱 드럼” 느낌인데, 실제로는 GS Electronic Kit/TR-808 Kit 이 가장 적절.
👉 즉, 네. 지금 데이터 중에는 확실히 TR-808 / Electronic Kit이 어울리는 패턴이 있습니다.
특히 Dance/Contemporary 폴더 안에 있는 파일들이 그래요.
원하시면, 제가 Dance/Contemporary 계열 파일만 따로 추려서 → TR-808/Electronic Kit 추천 매핑을 표로 정리해 드릴까요?
오늘의 제목은 소니(SONY)의 전신인 도쿄통신공업주식회사의 설립 취지서(1946년)에 담긴 글을 인용한 것이다.
"자유활달하고 유쾌한 이상(理想) 공장의 건설"
그리고 경영방침 제1항에는 쓸데없이 규모의 크기를 쫒지 않는다는 글도 들어 있다고 한다.
퇴근 후의 자유로운 일상을 꿈꾸는 요즘의 사회적 분위기에서는 꺼내기 힘든 말이다. 직장은 거쳐 가는 곳이고, 이직을 준비하기 위함이 지금 직장을 다니는 유일한 이유라면 너무 슬프지 않은가? 나의 재능과 열정을 쏟아부을 곳이 바로 현재 근무하는 곳이 아니라면, 도대체 이 현실은 무슨 의미가 있을까?
히라이 가즈오의 책 『소니 턴어라운드』를 읽으면서 많은 생각을 하였다. 1960년생인 그는 소니의 계열사였던 CBS소니(현재의 소니뮤직엔터테인먼트)에 입사해 소니 사장의 자리에까지 오른 전설적인 인물이다. 오늘 글의 제목 또한 이 책을 읽으면서 알게 된 것이다.
4,550억 적자라는 최악의 상황에 사장이 되어 소니를 부활시키고 20년 만에 최고 이익을 이끌어낸 그의 비결은 무엇이었을까? 소니라고 하면 사람들은 고품질의 전자제품을 먼저 떠올리지만, 그는 엔지니어 출신이 아니었다. 이는 그를 공격하는 좋은 빌미가 되기도 하였다. 히라이 가즈오는 음악이나 게임과 같이 소니의 주류에서는 약간 벗어난 길을 걸어 왔지만, 이렇게 '이단'의 삶을 살아온 것이 오히려 리더로서 철학의 기반이 되었다고 한다.
노스탤지어와의 결별은 매우 중요하다. VAIO를 매각하면서 원로들로부터 많은 충고가 전해졌다고 한다. 전자(電子)를 경시할 수 없다는 의견은 매우 타당해 보인다. 그러나 급변하는 경영 환경에서 과거의 명성에 안주할 수는 없다. 당시 그는 이런 면담 요구를 전부 거절했다고 한다. 그 후 다소 유연한 자세를 갖게 되었다고는 하지만.
2013년 히라이 가즈오가 요시다 켄이치로를 소니의 매니지먼트 팀으로 불러 들였을 때, 그를 파트너로 확신하게 만든 대화가 있었다고 한다.
요시다 켄이치로는 2018년 소니의 회장 겸 CEO가 되었다. 그는 장기적 관점의 경영과 목적 중심의 리더십을 강조했다고 한다. 히라이 가즈오가 소니의 사장을 맡는 6년 동안 전 세계 거점을 돌며 가진 타운올 미팅에서 KANDO('감동'), 즉 소니는 고객에게 감동을 줄 수 있는 제품과 서비스를 모두 함께 만들어 내자고 역설하였다. 이 정신은 요시다 켄이치로에게도 고스란히 이어졌다. 즉, '창의성과 기술의 힘으로 세상을 감동으로 채운다'는 일명 'KANDO'은 소니의 존재 이유가 되었다.
우리는 가장 큰 회사가 아니라 아티스트와 작곡가에게 가장 친화적인 음악 회사가 되고자 노력하고 있습니다. 그래서 거의 실시간으로 플랫폼에서 얼마나 많은 수익을 얻고 있는지 알려주는 디지털 플랫폼을 아티스트에게 제공하고 있습니다. (출처: 차우진의 엔터문화연구소)
요즘 전 세계적으로 선풍적인 인기를 끌고 있는 『케이팝 데몬 헌터스』의 판권을 소니 픽처스가 넷플릭스에 팔아넘긴 것에 대해 안목이 부족했다고 비아냥거리는 글을 종종 보게 되는데, 모든 사업이 다 대박을 터뜨릴 수는 없으며 소니 픽처스 역시 이런 결정을 내린 합리적인 이유가 있을 것이다. 그보다는 소니가 창작자에게 얼마나 관심을 두고 있는지를 느끼는 것이 더 중요하다.
나는 엔지니어도 아니고 퇴직 후 취미생활을 발전시켜 뭔가 수익사업을 하려고 애를 쓰는 사람도 아니다. 집에서 뭔가 만들려고 뚝딱거리는 모습을 제조업에 비유한다면, 나 자신이 공급자이자 유일한 고객이 되는 셈이다. 다만 이렇게 시간을 보내면서도 의미를 찾기 위해 애를 쓰고 있다고 볼 수 있다. 원하는 기능을 구현하기 위해—물론 ChatGPT에 많은 것을 의존하고 있지만—시간과 노력을 적게 들이는 최적의 방법을 찾고 있음은 부정할 수 없다. 그러나 그러는 도중에도 진정한 배움이 있었으면 한다.
Nano Ardule MIDI Controller 개발은 과연 유쾌한 가내수공업 공장에서 이루어지고 있을까? 일요일이었던 오늘만 해도 ChatGPT를 통해 총 13번의 기능 요청 및 컴파일을 하였다. 이제 설정을 EEPROM에 써서 저장하거나 복원하는 기능을 추가하는 일이 남았다. 오늘까지 개발한 스케치는 단계별 코딩 로드맵 단계6의 v20250921로 공개해 놓았다.
처음에는 SD카드에 format 0 MIDI file을 저장하여 재생 또는 드럼 루퍼로 작동하는 기능까지 추가하려고 야심찬 계획을 세웠었으나 근본적으로 메모리 부족 문제에 부딪쳤고, 설상가상으로 SD카드에서 MIDI file을 안정적으로 읽어들이는 것이 썩 쉽지 않음을 깨달았다. 그냥 순차적으로 파일을 읽어서 재생하는 것은 그런대로 되는데, 별도의 인덱스 파일을 경유하여 접근하려고 하니 자꾸 에러가 발생한다. 원래 이것도 메모리 부담을 줄이기 위해서 시도한 편법이었는데 말이다.
작동 동영상을 빨리 찍어서 유튜브에 올리고 싶은 마음은 굴뚝같지만 아직은 조금 더 기다려야 한다.
그래서 지금은 드럼 루퍼의 경우 MIDI 파일을 쓰지 않고 48 스텝(2 마디 단위) 그리드 형태의 데이터를 만들어서 코드 내에 저장하거나 EEPROM에 저장한 뒤 불러서 재생하는 형태로 바꾸어 보려고 한다. 이렇게 하면 MIDI 파일에 비해 데이터의 크기가 획기적으로 줄어들게 된다.
외부 의뢰로 오랜만에 나노포어 시퀀싱 데이터를 매만지게 되었다. 나는 MinION Mk1B와 Mk1C에서 만들어진 데이터를 다루어 보았을 뿐이다. 그것도 약 3년 전이 마지막이었다. 이번에 부탁받은 8건의 데이터(박테리오파지)는 기록을 참조해 보니 PromethION에서 나온 것이었다.
수년 전의 경험에 의하면 FAST5 raw data를 GPU가 달린 컴퓨터에서 정확하게 basecalling하는 일이 골칫거리였다. CPU로 실시하면 정확성도 떨어지고 너무 느린데다가, GPU가 장착된 컴퓨터는 연구실에 흔하지 않았기 때문이다. 지금 받은 raw data는 POP5라는 생소한 것이었다. 검색을 해 보니 나노포어 raw data의 새로운 표준인 것 같다.
POD5 is a file format for storing nanopore sequencing data inan easily accessible way.
전달받은 데이터 뭉치에는 Dorado를 이용하여 어댑터를 제거하고 quality trimming을 실시한 FASTQ 파일이 함께 들어 있었다. 다행스럽게도 정확하게 basecalling이 이루어진 FASTQ 파일을 얻기 위해 별도의 전처리를 할 필요가 없는 셈이다. Flye로 조립을 실시한 뒤 결과를 살펴 보았다. 실은 Canu를 쓸까 생각하였다가 챗GPT에게 어떻게 하면 좋겠냐고 물어 본 뒤에 Flye를 택한 것이다. 다음은 구글이 생성한 AI 기반의 답이다.
Canu produces highly accurate, but often fragmented assemblies with long runtimes, while Flye is faster, generates more contiguous (though potentially less accurate) assemblies, and is better for metagenomic applications. Canu is a mature assembler but has reached end-of-life, with Flye being the recommended choice for newer projects.
총 8개의 샘플 중 2개는 너무 많은 contig가 나왔다. 이걸 어떻게 한다? Flye의 로그 파일을 챗GPT에게 입력한 뒤 개선책을 제시해 보라고 하였다. 이를 여기에 싣는다.
----------
원인 압축 정리부터 할게요. 로그에 답이 다 있습니다.
커버리지가 지나치게 높음 → 과도한 길이 컷오프
Estimated coverage: 4071× (입력 genome-size=200k 기준).
Flye가 “Using longest 150× reads” 전략으로 바뀌면서, Min read length cutoff = 79,477 bp 가 잡혔습니다.
그런데 원시 리드 분포는 N50 = 39,981 bp. 즉, 절반 이상 리드가 컷오프에 의해 버려짐(79.5 kb 이상 초장리드만 남음).
→ 소수의 아주 긴 리드만 남고, 지역적·구간별 균형이 무너지면 disjointig 시드(최소 4리드) 를 만들기 어려워집니다.
(로그: min_reads_in_disjointig=4
, Min read length cutoff: 79477
→ Assembled 0 disjointigs
)
--genome-size
추정치가 부정확
경고 그대로: “Expected read coverage is 4071, … genome size was entered correctly?”
T7 파지는 실제 길이가 ~40 kb 수준입니다. 여기에 200k 를 넣으면 Flye의 커버리지 추정과 리드 서브샘플링 로직이 비정상적으로 동작합니다(쓸데없이 긴 컷오프, 과도한 150× 추림 대상).
→ 작은 바이러스/파지에서는 genome-size를 현실값으로 정확히 주는 게 매우 중요합니다.
(부차) --min-overlap 1000
의 경직성
HQ 리드라 1 kb 오버랩도 가능하지만, 파지처럼 작은 게놈에서는 500 bp 정도로 낮추면 씨앗 그래프가 더 쉽게 잡히는 경우가 많습니다.
특히 79 kb 이상 초장리드만 남은 상태에서는, 내부 품질·키트 트리밍 상태에 따라 오버랩 탐색이 더 예민해질 수 있습니다.
(부차) 오차율·혼입 신호
로그상 median overlap divergence ≈ 3.17%. Dorado SUP(HQ)라면 보통 1–2%대가 흔한데, 샘플/트리밍/디멀티플렉싱 상태에 따라 3%대도 나올 수 있습니다.
다만 핵심 실패 원인은 위 1)–2)로 설명이 충분합니다.
----------
답변의 제2부에서는 "정확한 genome size, 과한 필터 해제, 기본값 긴뢰"에 입각한 새로운 flye 명령어를 제시하였다.
뒤통수를 한대 맞은 느낌이 들었다. 사실 수십 년 넘게 genome assembly를 해 왔지만 프로그램이 뱉어내는 log 파일을 읽어보면서까지 문제점을 파악하려고 애쓴 적은 별로 없기 때문이다. 연구자 한 사람의 경험이나 그가 속한 커뮤니티에서 다루어지는 지성의 범위를 훨씬 뛰어넘는 세계를 넘나드는 챗GPT를 이길 수가 없다. 랩 미팅에서 '챗GPT에서는 뭐라고 하는데? 왜 따라서 하지 않았어?'라는 분위기가 조성된다면 그것은 더 이상 토론의 장이 아니다. 물론 기밀을 유지해야 하는 민간 연구소에서는 벌어지기 어려운 광경이겠지만.
지금까지 인류가 쌓은 경험(디지털화한 것에 국한되지만 이제 대부분의 지식은 다 컴퓨터 어딘가에 들어 있음)을 순식간에 '세 줄 요약' 형식으로 받아 먹을 수 있게 되었으니 효율이라는 측면에서는 이보다 더 좋을 수는 없다. 그러나 기술은 경험-직접적인 체험으로서-의 종말을 부채질한다. 최근 읽은 크리스텐 로젠의 책 『경험의 멸종』(원제: The Extingtion of Experience)과 같은 상황을 나도 이렇게 겪게 되다니.
(책 소개 중에서) 책을 읽지 않고 기기에게 요약해 달라고 하는 일은 독서의 종말을, 문서 작성을 인공지능에게 맡기는 일은 생각의 종말을, 지시어만을 입력해 그림을 얻는 일은 창작의 종말을 앞당길 수 있다. 우리가 인간의 영역이라고 불렀던 모든 경험을 기술에 맡기게 된다면 우리는 인간을 어떻게 정의해야 할까?
인공지능은 때때로, 새로운 경험을 세상과 나누려는 자연스러운 욕구를 위축시키는 부작용을 낳는다. 마치 인터넷을 처음 만난 사람처럼 신기한 소식을 접하면 누구나 그것을 공유하고 싶어 한다. 그러나 요즘의 AI 서비스는 일종의 ‘경험의 블랙홀’처럼 작동한다. 챗GPT와 대화를 통해 새로운 사실을 알게 되었더라도, 그것이 결국 이미 축적된 지식을 종합해 산출된 결론임을 깨닫는 순간, 내가 방금 ‘배운 것’을 다시 인터넷에 올리고 싶은 마음이 사그라들기 쉽다. 엄밀히 말하면 타인의 경험을 활용하고 있으면서(챗GPT를 통해), 그 대가로 무엇인가를 되돌려 놓는 선순환이 끊기는 셈이다. ‘어차피 누가 질문하든 비슷한 답을 금방 얻을 텐데…’라는 생각이, 공유의 동력을 조금씩 갉아먹는다.
요즘 답보상태에 이른 Nano Ardule MIDI Controller 역시 챗GPT와 뒤엉킨 나의 경험에 대해 섣부른 결론을 내리기 어렵게 하고 있다. 거의 백지 상태나 다름이 없었던 C++ 지식으로도 목표 기능의 70% 정도를 달성하게 된 것은 매우 놀라운 일이다. 그런데 코드 분량이 어느 정도 길어지니까 1의 기능을 추가해 달라고 하면 0.7 정도의 예상치 못한 오류를 포함한 답을 제시하는 것 아닌가. 이 오류를 해결해 달라고 요청하면 또 새로운 문제가 생기고... 계속 개발 과정이 산으로 가는 것 같아서 최근에는 이 무의미한 사이클을 너댓 차례 경험하다가 일단은 중단한 상태이다.
일단 노트북 컴퓨터 뚜껑을 닫고 바람을 쐬러 나가는 것이 좋겠다.
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으로 시작하지 않도록 매번 설정을 건드리는 것이 너무나 불편하기 때문이다.
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 |
아두이노 등 임베디드 환경에서 INDEX.TXT
를 ASCII 또는 BOM 없는 순수 UTF-8로 가정하고 읽을 때,
파일 첫 줄 맨 앞의 BOM 3바이트가 내용으로 들어와 파싱 오류를 유발합니다.
그 결과 첫 파일명이 누락되거나, 비교 구문(strcmp
, strncmp
)이 실패하고,
LCD/로그에 깨진 문자가 표시될 수 있습니다.
(A) 파일 저장 단계에서 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()
또는 범위 검사로 비가시 제어문자를 걸러주는 보조 방어 로직을 추가하면 안정성이 올라갑니다.
아두이노 나노와 아두이노 나노 에브리는 SD카드 모듈을 연결하는 법이 다르다고 한다. 아두이노에서는 카드와 통신하기 위한 ICSP(In-Circuit Serial Programming)핀이 D11-D13에도 그대로 연결되어 있는데, 아두이노 나노에서 이들 디지털 입출력 단자는 일반 GIOP일 뿐이다. 보드 뒷면에 6개의 작고 둥근 패드 모임에 연결을 해야 한다는 것. 핀 헤더도 아니고 이걸 도대체 어떻게 쓰라는 거야...
처음 도서관에서 이 책을 접했을 때, 나는 국가간 불평등에 대해 이야기하는 것으로 생각했었다. 책등에 쓰인 제목만 보고 즉흥적으로 선택을 했다가 몰입해서 순식간에 읽은 뒤 정말 좋은 책을 골랐다는 만족감을 느낄 때도 있고, 인터넷 등에서 미리 책 소개를 보고 빌렸다가 정작 재미가 별로 없어서 읽다 만 책도 있다. 이 책은 전자에 해당한다.
알린 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월
이상의 자료 분석을 통해 내가 내린 결론은 이러하다. 스트레스는 근본적으로 마음을 고쳐먹음으로써 극복할 수 있는 것이 아니다. 특히 빈곤이나 소외에 의한 스트레스는 그 자체가 세포를 늙고 병들게 만든다. 사회 구조적인 변혁을 통해 빈곤과 소외를 퇴치하는 것이 급선무이며, 그 과정에서 반드시 당사자가 참여해야 한다. 그리고... 국가통합바이오빅데이터구축사업을 맡고 있는 사람으로서 드러내놓고 말하기는 조심스럽지만, 거대한 예산을 투입해 유전체를 해독하고 신약 개발의 실마리를 찾는 일도 중요하다. 그러나 개인 차원에서 건강한 삶을 추구한다면, 조금 덜 먹고 좋은 음식을 고르며 꾸준히 몸을 움직이는 것이 훨씬 더 구체적이고 실천 가능한 길이며, 비용 대비 효과도 크다고 믿는다.
인공지능의 도움으로 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를 살펴보자.
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)로 바꾸고 싶다면 다음의 순서로 명령을 전송하면 된다.
반면 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 장비를 (재)활용하기 위한 이런 노력을 들이는 것이 과연 가치가 있는 일인지는 잘 모르겠다. 하지만 그 과정에서 최신의 기술(인공지능)을 충분히 활용하고 있으며 취미 생활의 지평을 넓혀 가고 있으니 아주 무의미한 일은 아닐 것이다. 원래 본업이 아니라 취미에 빠져드는 일이 더 자연스럽고 또 즐겁기까지 하다. 다만 퇴근 후 개발에 몰두하느라 과로를 하지 않도록 주의해야 할 것이다.
아두이노 나노. 직접 촬영하였음. |
아두이노 나노를 이용한 MIDI 컨트롤러 'Nano Ardule'을 만들다가 매우 중대한 난관에 봉착하였다. 하드웨어 제작을 마친 뒤, 지금까지 많은 공을 들여서 키보드 입력을 두 채널로 복제하여 서로 다른 음색이 동시에 나오도록 레이어링하거나 키보드 영역을 위와 아래로 나누는 스플리팅하기, 그리고 음색 편집 등의 기본 기능이 가능하도록 프로그래밍을 해 왔다. 여기에다가 마이크로SD카드에 담긴 MIDI 파일을 재생하는 기능을 추가하려고 하니 드디어 메모리가 부족하여 로드를 하지 못하는 단계에 이르렀다. 에러 없이 컴파일은 되는데 저장장치에 업로드를 하다가 중단되는 모습을 보니 허탈함을 금할 수 없다.
아두이노 나노(ATmega328P)는 작은 마이크로컨트롤러라서 다음과 같은 3종류의 주요 메모리를 갖는다. SRAM은 휘발성이라 전원이 꺼지면 내용이 사라진다.
실시간 데이터는 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를 동시에 구현하기 위한 최적화 방법을 우선순위대로 정리했습니다.
F()
매크로 사용
lcd.print(F("Init SD..."));
const char sPlay[] PROGMEM = "Play";
char buf[17];
strcpy_P(buf, sPlay);
lcd.print(buf);
char[]
고정 버퍼(예: 32~64B) 공용 사용/SONGS/INDEX.TXT
, /DRUMS/INDEX.TXT
한 줄 한 파일 순차 읽기char line[32]
로 보관#define FEATURE_BROWSER 0/1
, #define FEATURE_EDIT 0/1
inline
남발 금지-Os
(기본) 유지read → parse → send
파이프라인INDEX.TXT
의존)#define
)를 말합니다. 즉, 빌드할 때 켜고 끄는 플래그로 코드/데이터(특히 PROGMEM 테이블, 브라우저 로직, 플레이어 로직)를 아예 포함하거나 제외해서 플래시·SRAM 점유를 즉시 바꾸는 방식이에요.freeRAM()
(남은 SRAM 추정) 한 번 출력INDEX.TXT
순차 브라우즈const char sLoading[] PROGMEM = "Loading";
char line[17];
void printP(const char* p) {
strcpy_P(line, p);
lcd.print(line);
}
#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;
}
// 사용 중인 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);
}
대전시립미술관 주차장에서 만난 후투티(영문: 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를 날아가야 하는 큰 일을 당장 하지 않고 한 곳에 머물게 된다면야 철새에게는 큰 이득이겠지만, 세상에 공짜가 어디 있으랴. 이에 따라서 멀리 날아가는 능력을 잃게 될지도 모른다. 인류도 인공지능 때문에 깊게 사고하고 판단하는 능력을 잃어버리고 있는지도 모른다.
9월에 접어들면서 비가 뿌리더니 제법 아침 저녁의 기온이 많이 내려갔다. 덕분에 어제 저녁의 달리기는 꽤 수월하였다. 준비운동 삼아서 아령을 이용한 상체 운동과 스쿼트 및 스트레칭을 한 때문이었을까, 어제의 '정량화된 자아(Quantified Self)'는 꽤 바람직한 기록을 보여주었다. 빨리 달렸다는 것이 아니라 8km를 달리는 동안 매우 균일한 페이스를 유지했다는 뜻이다. 항상 완만한 '우하향'의 직선 형태를 보이던 페이스가 어제는 거의 수평선이었다.
달리면서 혹시 처지고 있는 것은 아닌지 늘 의식을 하는 것, 그리고 글로 옮기기는 어렵지만 발바닥을 쓰는 방법에 신경을 쓴 것도 도움이 되었다. 나는 가급적 '미드풋'으로 뛰려고 애를 쓰는데, 여기에도 달리는 사람에 따라서 많은 변주가 가능할 것 같다,
아령 운동은 2년 전 다쳤던 오른쪽 상완골과 어깨 주변을 강화하기 위함이다. 작년 10월부터 녹슨 5kg 아령으로 상체 운동을 시작하였는데, 그렇게 자주 하지는 못한다.
뜻하지 않은 부상(상완골 근위부 골절) 후 꼭 1년이 지나다 - 상체 근력 운동의 필요성
내가 운동 매니아가 될 가능성은 거의 없다. 하지만 습관이 된 달리기, 아령 운동 + 보충 운동(플랭크, 스쿼트 등)으로 중년 건강을 지켜 나가야 되겠다.
소프트웨어 개발 절차는 보통 다음의 6가지 절차로 이루어진다고 한다.
현재는 데이터 센터와 유사한 성격의 곳에서 일을 하고 있노라니 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가 촉발한 과몰입(또는 과노동)'이 될 것 같다.
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 이론(『불평등은 어떻게 몸을 갉아먹는가』)에서 밝혔듯이 개인 책임 내러티브로 이어지게 되는 것이다.
![]() |
르누아르(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월 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에서 시작됩니다. 지금이 그 문을 열고 나아갈 시간입니다.
바로 직전의 글(링크)에서 감히 '완성 단계'라는 말을 했었다. 납땜은 이것으로 다 되었으니 앞으로는 코드를 작성하면서 단계별로 테스트를 진행해 나가면 최종 목표에 도달할 것이라는 허황된 생각을 했던 것이다. 주말 작업을 하면서 정말 많은 실수를 발견하였다. 금요일까지만 해도 앞으로 기판 고정용 나사를 풀 일이 없으리라 여겼으니 얼마나 가소로운 생각이란 말인가!
정말 운이 좋았다면 문제 자체가 발생하지 않았을 수도 있다(예: 절연 불량). 그러나 초심자의 행운이 항상 좋은 것만은 아니다. 경험하지 못한 실수를 나의 실력으로 착각하고 있다가 언젠가는 나를 다시 찾아올 것이고, 그때에는 원인을 몰라서 더욱 헤맬 수도 있다. 비교적 초기 단계에 실수를 발견하여 바로잡게 됨을 다행으로 여겨야 할 것이다.
첫 번째 실수는 전원 공급 방식의 몰이해가 빚은 것이었다. 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 신호 처리에 들어가게 될 것이다.