외부에서 오송역으로 가는 경로. 오송역을 출발지로, 외부를 목적지로 하면 철도 심벌 위에서 방향을 잃기 쉽다. |
위에서 끊긴 종착점은 바로 오른쪽에 뚝 떨어진 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 이론(『불평등은 어떻게 몸을 갉아먹는가』)에서 밝혔듯이 개인 책임 내러티브로 이어지게 되는 것이다.