3년간의 iMessage로 자동 생성한 책 시리즈
(benkettle.xyz)- 오래된 대화를 검색만으로 다시 읽기 어렵자, 가장 큰 iMessage 대화를 물리적인 책으로 바꿔 날짜별로 넘겨볼 수 있게 함
- iPhone 백업의
sms.db를 SQLite로 열어 메시지를 추출했지만, 일부 본문은message.text가 아니라message.attributedBody의 바이너리 blob에 들어 있어 추가 처리가 필요했음 - 직접 파서를 만들지 않고 Rust의 imessage-database crate를 활용해 iMessage DB를 구조화된 데이터로 읽고, 단일 대화만 가져오도록 SQL을 조정함
- 책 본문은 LaTeX로 생성했고, emoji 렌더링과 인쇄 비용 문제를 해결하기 위해 XeLaTeX와 Google Noto Emoji 흑백 폰트를 사용함
- 3년치 메시지는 6" x 9" 기준 약 1,300쪽이 되어 3권으로 나뉘었고, Barnes & Noble Press에서 배송 포함 30달러에 인쇄됨
왜 iMessage를 책으로 만들었나
- 과거의 구체적인 일을 떠올릴 때 텍스트 메시지 기록이 자주 단서가 됨
- iPhone의 iMessage 전체 기록 검색은 빨라졌지만, 유용하게 쓰려면 찾는 메시지의 정확한 문구 일부를 기억해야 함
- 검색 결과에서 오래된 대화로 들어가 주변 맥락을 보려 하면 스크롤 로딩이 매우 느림
- 특정 날짜로 바로 이동하는 기능이 없어, 대화를 무작위 지점에서 책처럼 넘겨보는 경험을 직접 만들기로 함
iPhone 백업에서 메시지 꺼내기
- 메시지를 가공하려면 먼저 iPhone 밖으로 데이터를 꺼내야 했음
- iPhone Wiki에 따르면 iPhone 백업에서
sms.db를 가져오면 SQLite 데이터베이스로 메시지를 다룰 수 있음 - Mac Finder로 표준 백업을 만든 뒤 백업 폴더를 열면, 루트에 16진수 바이트 이름의 디렉터리들이 있음
sms.db파일명은 iPhone Wiki에 나온3d0d7e5fb2ce288813306e4d4636395e047a3d28였고, 이를imessage.db로 복사해sqlite3CLI로 열 수 있었음- DB에는
message,attachment,chat,handle,chat_message_join같은 테이블이 들어 있음
SQL 조회와 본문 추출 문제
- 실제 대화를 뽑으려면
message,chat_message_join,chat테이블을 조인해야 했음 - 특정
chat_identifier를 기준으로 날짜순 메시지를 조회하자, 일부 메시지의 본문이 비어 있었음 - 비어 보이는 메시지 일부는
message.text가 아니라message.attributedBody컬럼의 인코딩된 NSMutableAttributedString 바이너리 blob에 저장돼 있었음 sqlite3에서 바이너리를 hex로 꺼내xxd로 확인하자 CVS 문자 내용이 실제로 들어 있음을 볼 수 있었음- 직접 바이너리 포맷 파서를 구현하는 대신 imessage-database crate를 사용함
- 이 crate는 iMessage 데이터베이스를 읽어 Rust 데이터 구조로 출력함
- 함께 제공되는
imessage-exporter바이너리는 대화를 텍스트나 HTML로 생성할 수 있음 - 단일 대화만 좁혀 가져오도록 라이브러리의 SQL 문을 약간 수정함
LaTeX로 책 본문 만들기
- 목표는 HTML이나 텍스트 파일이 아니라 손에 들고 넘길 수 있는 물리 책이었기 때문에 LaTeX를 출력 대상으로 선택함
- LaTeX의 텍스트 기반 소스는 템플릿과 자동 생성에 잘 맞아, 각 메시지를 LaTeX 코드로 내보내는 방식을 사용함
- 초기 렌더링은 단순한 형태로 시작함
- 내가 보낸 메시지는 왼쪽, 상대 메시지는 오른쪽에 정렬함
- 이미지가 있는 곳에는 첨부파일 표시 텍스트를 넣음
- 반응과 답장처럼 렌더링하기 번거로운 요소는 건너뜀
- 날짜 기준으로 챕터를 나누고 시각적으로 조금 조정함
emoji와 XeLaTeX 처리
- 일반 LaTeX는 unicode를 지원하지 않아, emoji가 포함된 범위까지 렌더링하면 컴파일러가 실패했음
- emoji를 제거할 수도 있었지만, 현대 커뮤니케이션에서 emoji가 중요하다고 보고 제외하지 않음
- XeLaTeX로 전환해 unicode 폰트 지원을 사용함
- 생성된 LaTeX 소스에서 각 emoji를
{\emojifont X}형태로 감싸고,\emojifont를 emoji 폰트로 지정해 inline emoji 렌더링을 성공시킴 - 컬러 인쇄 비용을 피하려고 Google Noto Emoji의 흑백 emoji 폰트를 사용함
- 각 메시지마다
\markrightLaTeX 명령을 넣어, 헤더가 현재 날짜를 따라가게 함
1,300쪽을 3권으로 나누기
- 3년치 메시지를 표준 6" x 9" 페이지 크기로 컴파일하자 1,000쪽을 훨씬 넘는 PDF가 생성됨
- 대상 기간이 정확히 3년이어서 전체를 3권으로 나눠 각 권을 인쇄 가능한 크기로 줄임
- 최종 분량은 총 약 1,300쪽이었음
Barnes & Noble Press로 인쇄
- 여러 인쇄 옵션을 검토한 뒤 Barnes and Noble Press를 선택함
- Lulu나 Amazon KDP 같은 다른 옵션보다 다소 비쌌지만, 개인용 책을 인쇄할 때 책을 “출판”하지 않아도 되는 점이 더 적합했음
- 세 권, 약 1,300쪽 전체를 배송 포함 30달러에 인쇄할 수 있었음
- 본문 PDF를 업로드하면 B&N Press 사이트가 표지에 필요한 치수를 생성했고, 이 치수에 맞춰 Inkscape로 각 권의 표지를 만듦
- B&N Press 웹사이트는 전반적으로 매우 느렸고, 주문 중 결제 페이지가 24시간 넘게 열리지 않는 문제가 있었음
- 문제가 해결된 뒤 주문이 진행됐고, 몇 주 후 세 권의 실제 책을 받음
- 물리 책으로 넘겨보는 방식은 휴대폰에서 과거 대화를 다시 찾는 것보다 훨씬 쉬웠음
직접 만들어보기
- 소스 코드는 정리 상태가 거칠고 Cargo 바이너리로 패키징되지는 않았지만, 코드 양은 많지 않음
- 프로젝트 코드는 bkettle/message-book에 공개돼 있음
댓글과 토론
Hacker News 의견들
-
개인 서신의 물리적 기록을 더 많이 남겨야 한다는 점에서 아주 마음에 듦
제목만 봤을 때는 메시지 기록을 바탕으로 LLM이 사건의 서사를 생성하는 이야기일 줄 알았고, 이런 걸 서비스로 만들면 멋질 것 같음- 나도 그렇게 생각했지만, 실제 이야기가 훨씬 좋았음
이제 내 Telegram 채팅 기록으로도 해보고 싶어짐 - 비공개 이메일과 문자 메시지의 큰 단점은 미래 역사가들이 볼 수 있는 개인 서신이 엄청나게 사라진다는 것임
Feynmann, Feyeraband, Einstein 등의 편지를 모은 책들이 있는데, 지금은 거의 모든 것이 비밀번호 뒤에 있는 이메일이라 미래의 역사적 인물을 맥락화할 개인 편지 더미를 거의 얻지 못할 가능성이 큼 - 예술로서는 좋지만 실용성은 의문임
물리 사본이 필요하다면 microSD에 복사하면 되고, 분실이 걱정되면 세 개쯤 만들면 됨 - 제목을 보고 정확히 그런 걸 상상했고, 이미 꽤 흥미롭겠다고 생각하고 있었음
지금은 비슷한 걸 직접 해보고 싶어짐 - 나도 채팅 기록을 바탕으로 한 AI 생성 범죄 소설 전체가 나오는 이야기일 줄 알았음
- 나도 그렇게 생각했지만, 실제 이야기가 훨씬 좋았음
-
내가 만든 라이브러리 imessage-exporter가 실제로 쓰이는 걸 보니 멋짐
정말 흥미로운 사용 사례임- 최근 새 메시지를 나타내는 변경을 감시하고 추출하려고 SQLite 파일을 파고 있었는데, 몇 가지 꼼수로 만든 초기 프로토타입은 대체로 동작했음
다음에 이 아이디어를 다시 볼 때는 해당 라이브러리로 바꿀 생각이고, 거의 실시간 접근과 관련해 조언이나 팁이 있으면 궁금함
- 최근 새 메시지를 나타내는 변경을 감시하고 추출하려고 SQLite 파일을 파고 있었는데, 몇 가지 꼼수로 만든 초기 프로토타입은 대체로 동작했음
-
이모가 2차대전 동안 할아버지와 할머니가 주고받은 편지와 일기를 훌륭하게 보존해 왔음
우리 아이들과 손주들은 같은 기쁨을 누리지 못하겠다는 생각이 바로 들었음
관심 있으면 블로그를 볼 수 있음- 대부분의 커플을 생각하면 이건 조금 다를 수도 있음
오히려 “집에 오는 길에 우유 사 와”, “애들은 네가 데려오는 거 맞지?”, “20분 뒤에 봐” 같은 메모지를 전부 보존하는 것에 더 가까워 보임
그래도 그런 데 나름의 매력이 있긴 하니 너무 찬물을 끼얹는 것처럼 들리진 않았으면 함
- 대부분의 커플을 생각하면 이건 조금 다를 수도 있음
-
영국인들을 위해 이걸 WhatsApp에서도 되게 만들 차례임
프로젝트 아이디어에 신났다가, 포크하려면 Rust를 배워야 한다는 걸 깨달았음
어쨌든 정말 멋진 아이디어고, 친구들과의 채팅 기록을 읽는 건 꽤 향수를 불러일으킴- 이 Python 패키지는 WhatsApp 백업 채팅을 JSON이나 HTML로 내보낼 수 있음: https://github.com/KnugiHK/WhatsApp-Chat-Exporter
Telegram 내보내기 도구도 링크되어 있음 - WhatsApp은 채팅을 txt로 내보낼 수 있지만, 손실이 있을 것 같음
예를 들어 이모지가 남아 있을지 확실하지 않고, 첨부파일이나 음성 메시지는 당연히 빠질 것임
백업 데이터베이스에서 추출하려면 암호화도 걸려 있을 것임 - 영국만이 아니라 전 세계가 필요함
- 모든 메시지와 미디어를 합리적으로 검토 가능한 형식으로 내보내는 기능이 절실함
솔직히 나중에 다른 기기에서 복원할 수 있다고 확신할 수 있는 백업 아카이브만이라도 만들 수 있으면 좋겠음
- 이 Python 패키지는 WhatsApp 백업 채팅을 JSON이나 HTML로 내보낼 수 있음: https://github.com/KnugiHK/WhatsApp-Chat-Exporter
-
개인 메시지 전체 기록을 인쇄하려고 출판사에 보내는 아이디어가 좀 불안한 건 나뿐인가?
- 내 개인 메시지 전체 기록을 출판사에 보낸다면, 가장 불안해질 쪽은 출판사일 것 같음
- 출판사는 종이에 잉크를 뿌리는 사업을 하는 곳임
오히려 광고나 합의 형성 도구로 행동을 바꾸는 게 일인 데이터 마이닝 회사에게 중간자 공격당하는 쪽을 더 불안해해야 함 - 나도 불안함
글쓴이가 한 일을 꽤 오래 전부터 계획해 왔는데, 이게 아직 풀지 못한 걸림돌 중 하나임
집에서 직접 인쇄하고 제본하는 것이 아마 유일한 선택지일 듯하고, 이제 남은 건 최종 결과물을 내구성 있고 손에 닿는 느낌이 좋게 만드는 방법임 - 파일이 특별히 안전하게 저장되지 않아도 놀랍지 않을 것 같음
출판사는 인쇄용 PDF 안에 개인식별정보가 들어 있을 거라고 예상하지 못했을 가능성이 크고, 데이터 보관 기간도 무기한일 수 있음 —rot13스위치를 써보면 될지도 :-)
-
인기 없는 생각일 수 있지만, 이건 조금 소름 끼침
애초에 왜 사람들이 개인 대화 기록을 보관하고 싶어 하는지 이해하지 못하겠음
공개 게시물이나 블로그와 달리 개인 메시지는 일시적이어야 한다고 봄. 대면 대화나 전화 통화를 전부 녹음하지는 않으니까- 흥미로운 주제이고, 꼭 인기 없는 생각도 아닐 수 있음
사람마다 이 문제를 다르게 보는 것 같음
나는 가능한 모든 채팅 기록을 보존하려고 하고, 대면 대화와 전화 통화도 전부 녹음되어 쉽게 접근 가능했으면 좋겠음
내 경험의 총합이 나 자신이라는 감각이 있어서, 그 경험들을 잊고 싶지 않음. 기억하지 못하면 어딘가 내가 나보다 덜한 존재가 되는 느낌임
다만 Black Mirror의 그 에피소드도 봤기 때문에, 모든 경험을 완벽히 기억하고 싶은 욕망과 잊을 수 있음에서 오는 정신적·감정적 이점 사이에서 갈등하게 됨 - 동의함
다만 내 경우엔 예전에 보낸 메시지가 영원히 남아 있다는 사실에 오그라드는 쪽이 더 큼
10년 전의 나는 지금과 너무 달라서, 예전 메시지를 읽으면 굉장히 어색하게 느껴짐 - 양쪽 다 이해됨
2004년쯤까지는 실제 편지로 사람들과 연락했는데, 특히 예전 여자친구들이나 대학에 처음 갔을 때 여동생들이 보낸 편지를 몇 년 뒤 읽는 건 강한 향수를 불러일으켰음
반면 군을 떠난 뒤 훨씬 작은 곳으로 이사하면서 대부분의 물건을 창고에 넣었고, 3년 뒤에도 건드리지 않은 물건은 필요 없는 것이라고 판단해 보관소에 넘겼음
거기엔 오래된 편지와 사진들이 전부 포함돼 있었던 것 같은데, 실제로 그 물건들이 그립다고는 말 못 하겠음
과거를 잊고 싶지 않다고들 하지만, 잊는다는 현실은 자신이 잊었다는 걸 모르는 것이기 때문에 일단 잊고 나면 지각 가능한 영향이 없음
솔직히 이미 향수에 충분히 젖어 있고, 더 붙잡을 물건은 필요 없다고 봄. 새 TV 프로그램도 안 보고 새 음악도 안 들으며, 정신적으로 1999년에 갇혀 있는 것 같고 그게 건강한지는 모르겠음 - 개인 메시지는 대면 대화나 전화 통화가 아님
오래 남는 편지가 더 정확한 비교 대상임 - 그런 것들이 비공개이거나 일시적이라고 가정하지 않음
메시지는 하나의 이야기를 만들고, 우리 세대의 시대정신을 담고 있음
이런 것을 어떻게 보존할지에 대해서는 아직 사람들이 많이 생각해 보지 않은 듯함
개인적으로는 마음에 드는 아이디어이고, 어머니와 나눈 전체 또는 일부 메시지를 내보내 그 시절의 기억으로 남기는 모습을 상상할 수 있음
- 흥미로운 주제이고, 꼭 인기 없는 생각도 아닐 수 있음
-
정말 멋지고, 사랑하는 사람에게 줄 훌륭한 선물이 될 수도 있어 보임
최근 Nomic Atlas(https://docs.nomic.ai/)를 써보면서 내 채팅 기록을 많이 넣어봤는데, 메시지를 주제별 군집으로 시각화하고 둘러보는 게 꽤 흥미로웠음
그래서 메시지의 임베딩을 생성하고 주제 모델링을 돌리면 디지털의 검색 가능성을 물리적 형식으로 가져올 수 있겠다는 생각이 듦
그러면 실제 책의 끝에 주제별 색인을 만들고, 해당 주제의 메시지가 있는 페이지 번호를 참조로 넣을 수 있음 -
Mac에서 iMessage를 내보내는 Python 스크립트: https://pypi.org/project/imessage-reader/
-
2000년 뒤에는 21세기 사람들이 어떻게 살았는지 연구할 때 이런 책만 남아 있을지도 모름
트윗, 채팅, SMS, 이메일, 개인 기기의 디지털 사진 같은 일시적 정보는 모두 사라졌을 수 있음 -
개인용 BN Press는 몰랐음
KDP와 Lulu는 좀 알아봤지만, Kindle을 써보고 좋아하게 된 뒤로는 전자책을 주된 초점으로 삼기로 했음
제한적이거나 시험적인 인쇄라면 BN Press가 훌륭해 보이고, 1300쪽에 30달러는 대단함