Loạt sách được tự động tạo từ iMessage trong 3 năm
(benkettle.xyz)- Khi việc đọc lại các cuộc trò chuyện cũ chỉ bằng tìm kiếm trở nên khó khăn, tác giả đã biến cuộc trò chuyện iMessage lớn nhất thành sách vật lý để có thể lật xem theo ngày
- Tác giả mở
sms.dbtrong bản sao lưu iPhone bằng SQLite để trích xuất tin nhắn, nhưng một số nội dung không nằm trongmessage.textmà nằm trong blob nhị phân củamessage.attributedBody, nên cần xử lý thêm - Thay vì tự viết parser, tác giả dùng crate imessage-database của Rust để đọc DB iMessage thành dữ liệu có cấu trúc, rồi chỉnh SQL để chỉ lấy một cuộc trò chuyện duy nhất
- Phần nội dung sách được tạo bằng LaTeX; để giải quyết vấn đề render emoji và chi phí in, tác giả dùng XeLaTeX cùng font đen trắng Google Noto Emoji
- Tin nhắn trong 3 năm tương đương khoảng 1.300 trang khổ 6" x 9", được chia thành 3 tập và in qua Barnes & Noble Press với giá 30 USD gồm cả vận chuyển
Vì sao biến iMessage thành sách
- Khi nhớ lại những sự kiện cụ thể trong quá khứ, lịch sử tin nhắn văn bản thường là manh mối hữu ích
- Tìm kiếm toàn bộ lịch sử iMessage trên iPhone đã nhanh hơn, nhưng để dùng hiệu quả thì phải nhớ một phần chính xác của câu chữ trong tin nhắn cần tìm
- Khi đi từ kết quả tìm kiếm vào cuộc trò chuyện cũ để xem ngữ cảnh xung quanh, việc cuộn tải rất chậm
- Không có chức năng nhảy thẳng tới một ngày cụ thể, nên tác giả quyết định tự tạo trải nghiệm lật xem như sách từ một điểm ngẫu nhiên trong cuộc trò chuyện
Lấy tin nhắn từ bản sao lưu iPhone
- Để xử lý tin nhắn, trước tiên cần đưa dữ liệu ra khỏi iPhone
- Theo iPhone Wiki, nếu lấy
sms.dbtừ bản sao lưu iPhone thì có thể thao tác tin nhắn như một cơ sở dữ liệu SQLite - Sau khi tạo bản sao lưu tiêu chuẩn bằng Finder trên Mac rồi mở thư mục sao lưu, ở thư mục gốc có các thư mục mang tên là các byte dạng thập lục phân
- Tên file
sms.dblà3d0d7e5fb2ce288813306e4d4636395e047a3d28như trên iPhone Wiki; tác giả sao chép file này thànhimessage.dbvà mở được bằng CLIsqlite3 - DB chứa các bảng như
message,attachment,chat,handle,chat_message_join
Truy vấn SQL và vấn đề trích xuất nội dung
- Để trích xuất cuộc trò chuyện thực tế, cần join các bảng
message,chat_message_join,chat - Khi truy vấn tin nhắn theo thứ tự ngày dựa trên một
chat_identifiercụ thể, nội dung của một số tin nhắn bị trống - Một số tin nhắn trông như trống thực ra không được lưu trong
message.text, mà nằm trong blob nhị phân NSMutableAttributedString đã mã hóa ở cộtmessage.attributedBody - Khi lấy dữ liệu nhị phân từ
sqlite3dưới dạng hex rồi kiểm tra bằngxxd, có thể thấy nội dung ký tự CVS thực sự nằm trong đó - Thay vì tự triển khai parser cho định dạng nhị phân, tác giả dùng crate imessage-database
- Crate này đọc cơ sở dữ liệu iMessage và xuất ra các cấu trúc dữ liệu Rust
- Binary
imessage-exporterđi kèm có thể tạo cuộc trò chuyện dưới dạng văn bản hoặc HTML - Tác giả chỉnh nhẹ câu SQL của thư viện để chỉ thu hẹp lấy một cuộc trò chuyện duy nhất
Tạo nội dung sách bằng LaTeX
- Mục tiêu không phải là file HTML hay văn bản, mà là một cuốn sách vật lý có thể cầm và lật, nên tác giả chọn LaTeX làm đích xuất
- Source dạng văn bản của LaTeX rất phù hợp với template và tự động sinh nội dung, nên tác giả xuất từng tin nhắn thành mã LaTeX
- Bản render ban đầu bắt đầu ở dạng đơn giản
- Tin nhắn do tác giả gửi được căn trái, tin nhắn của người kia căn phải
- Ở nơi có hình ảnh, chèn văn bản biểu thị file đính kèm
- Bỏ qua các yếu tố khó render như reaction và reply
- Chia chương theo ngày và tinh chỉnh nhẹ về mặt thị giác
Xử lý emoji và XeLaTeX
- LaTeX thông thường không hỗ trợ unicode, nên khi render đến đoạn có emoji, compiler bị lỗi
- Có thể loại bỏ emoji, nhưng tác giả cho rằng emoji quan trọng trong giao tiếp hiện đại nên không bỏ
- Chuyển sang XeLaTeX để dùng hỗ trợ font unicode
- Trong source LaTeX được tạo, mỗi emoji được bọc theo dạng
{\emojifont X}, và\emojifontđược chỉ định là font emoji để render được emoji inline - Để tránh chi phí in màu, tác giả dùng font emoji đen trắng Google Noto Emoji
- Với mỗi tin nhắn, tác giả thêm lệnh LaTeX
\markrightđể phần header bám theo ngày hiện tại
Chia 1.300 trang thành 3 tập
- Khi biên dịch tin nhắn trong 3 năm với khổ trang chuẩn 6" x 9", PDF tạo ra vượt xa 1.000 trang
- Vì giai đoạn mục tiêu đúng bằng 3 năm, tác giả chia toàn bộ thành 3 tập để mỗi tập có kích thước có thể in được
- Tổng dung lượng cuối cùng vào khoảng 1.300 trang
In bằng Barnes & Noble Press
- Sau khi xem xét nhiều lựa chọn in ấn, tác giả chọn Barnes and Noble Press
- Dù đắt hơn đôi chút so với các lựa chọn khác như Lulu hay Amazon KDP, dịch vụ này phù hợp hơn vì khi in sách cá nhân không cần “xuất bản” cuốn sách
- Có thể in cả ba tập, tổng khoảng 1.300 trang, với giá 30 USD bao gồm vận chuyển
- Khi tải PDF phần nội dung lên, trang B&N Press tạo ra kích thước cần thiết cho bìa; tác giả dùng Inkscape để làm bìa từng tập theo các kích thước này
- Website B&N Press nhìn chung rất chậm, và trong lúc đặt hàng có vấn đề khiến trang thanh toán không mở được trong hơn 24 giờ
- Sau khi vấn đề được giải quyết, đơn hàng được xử lý và vài tuần sau tác giả nhận được ba cuốn sách thật
- Cách lật xem bằng sách vật lý dễ hơn nhiều so với việc tìm lại các cuộc trò chuyện cũ trên điện thoại
Tự làm thử
- Mã nguồn còn khá thô và chưa được đóng gói thành binary Cargo, nhưng lượng code không nhiều
- Mã dự án được công khai tại bkettle/message-book
1 bình luận
Ý kiến trên Hacker News
Tôi rất thích ở điểm nó để lại nhiều bản ghi vật lý hơn cho thư từ cá nhân
Khi chỉ nhìn tiêu đề, tôi tưởng đây sẽ là câu chuyện về việc LLM tạo ra mạch truyện của các sự kiện dựa trên lịch sử tin nhắn, và nghĩ nếu biến thứ này thành dịch vụ thì sẽ rất hay
Giờ tôi cũng muốn thử với lịch sử chat Telegram của mình
Có những cuốn sách tập hợp thư của Feynmann, Feyeraband, Einstein, v.v.; nhưng giờ hầu như mọi thứ đều là email nằm sau mật khẩu, nên rất có khả năng chúng ta sẽ gần như không có được những đống thư cá nhân để đặt các nhân vật lịch sử tương lai vào bối cảnh
Nếu cần bản sao vật lý thì chỉ cần chép vào microSD, còn nếu lo bị mất thì làm khoảng ba bản là được
Giờ thì tôi muốn tự thử làm một thứ tương tự
Thật tuyệt khi thấy thư viện tôi tạo, imessage-exporter, thực sự được dùng
Đây là một use case rất thú vị
Lần tới quay lại ý tưởng này, tôi định chuyển sang dùng thư viện đó, và nếu có lời khuyên hay mẹo nào về truy cập gần thời gian thực thì tôi rất muốn biết
Dì tôi đã bảo quản rất tốt các bức thư và nhật ký mà ông bà tôi trao đổi trong Thế chiến II
Tôi lập tức nghĩ rằng con cháu chúng ta sẽ không được hưởng niềm vui tương tự
Nếu quan tâm, có thể xem blog
Nó có vẻ giống việc lưu lại toàn bộ giấy nhắn kiểu “trên đường về mua sữa nhé”, “anh/em đón bọn trẻ đúng không?”, “20 phút nữa gặp” hơn
Dù vậy, những thứ đó cũng có cái duyên riêng, nên hy vọng tôi không nghe như đang dội gáo nước lạnh quá mức
Đã đến lúc làm cho thứ này hoạt động với WhatsApp cho người Anh
Tôi đã hào hứng với ý tưởng dự án này, rồi nhận ra muốn fork thì phải học Rust
Dù sao đây cũng là một ý tưởng thật sự tuyệt, và đọc lại lịch sử chat với bạn bè khá gợi hoài niệm
Công cụ export của Telegram cũng được liên kết ở đó
Ví dụ không chắc emoji có còn không, còn file đính kèm hay tin nhắn thoại thì đương nhiên sẽ bị bỏ qua
Nếu trích xuất từ cơ sở dữ liệu sao lưu thì chắc cũng vướng mã hóa
Thành thật mà nói, chỉ cần tạo được một kho lưu trữ sao lưu mà sau này tôi có thể tin chắc là khôi phục được trên thiết bị khác cũng tốt rồi
Chỉ mình tôi thấy hơi bất an với ý tưởng gửi toàn bộ lịch sử tin nhắn cá nhân cho một nhà xuất bản để in ra sao?
Thứ đáng lo hơn là bị tấn công trung gian bởi công ty khai phá dữ liệu, những nơi có công việc là thay đổi hành vi bằng quảng cáo hoặc công cụ tạo đồng thuận
Tôi đã lên kế hoạch làm việc mà tác giả đã làm từ khá lâu, và đây là một trong những trở ngại tôi vẫn chưa giải quyết được
Tự in và đóng sách tại nhà có lẽ là lựa chọn duy nhất, và việc còn lại là làm sao để sản phẩm cuối bền và có cảm giác cầm nắm tốt
Nhà xuất bản có lẽ không ngờ rằng trong PDF để in lại có thông tin định danh cá nhân, và thời gian lưu giữ dữ liệu cũng có thể là vô thời hạn
—rot13:-)Có thể là ý kiến không được ưa chuộng, nhưng chuyện này hơi rợn
Ngay từ đầu tôi đã không hiểu vì sao người ta muốn lưu lại lịch sử trò chuyện cá nhân
Không giống bài đăng công khai hay blog, tôi nghĩ tin nhắn cá nhân nên mang tính nhất thời. Ta đâu có ghi âm toàn bộ cuộc trò chuyện trực tiếp hay cuộc gọi điện thoại
Có vẻ mỗi người nhìn vấn đề này khác nhau
Tôi cố gắng lưu giữ mọi lịch sử chat có thể, và cũng mong toàn bộ cuộc trò chuyện trực tiếp lẫn điện thoại đều được ghi âm và dễ truy cập
Tôi có cảm giác rằng tổng hòa trải nghiệm của mình chính là bản thân mình, nên tôi không muốn quên những trải nghiệm đó. Nếu không nhớ được, tôi cảm thấy ở đâu đó mình trở thành một phiên bản kém trọn vẹn hơn của chính mình
Tuy nhiên tôi cũng đã xem tập Black Mirror đó, nên tôi giằng co giữa mong muốn ghi nhớ hoàn hảo mọi trải nghiệm và những lợi ích tinh thần, cảm xúc đến từ khả năng được quên
Nhưng với tôi, cảm giác cringe vì những tin nhắn cũ mình gửi vẫn tồn tại mãi còn lớn hơn
Tôi của 10 năm trước quá khác so với bây giờ, nên đọc lại tin nhắn cũ cảm thấy cực kỳ ngượng
Đến khoảng năm 2004, tôi vẫn liên lạc với mọi người bằng thư giấy thật; việc đọc lại thư của bạn gái cũ hoặc của các em gái gửi khi tôi mới vào đại học sau vài năm đem lại cảm giác hoài niệm rất mạnh
Mặt khác, sau khi rời quân đội và chuyển đến một nơi nhỏ hơn nhiều, tôi cất phần lớn đồ đạc vào kho; sau 3 năm, những thứ vẫn chưa động đến được tôi xem là không cần thiết và giao lại cho kho lưu giữ
Tôi nghĩ trong đó có toàn bộ thư cũ và ảnh, nhưng tôi không thể nói là mình thật sự nhớ những món đồ đó
Người ta hay nói không muốn quên quá khứ, nhưng thực tế của việc quên là bạn không biết rằng mình đã quên, nên một khi đã quên thì không có tác động nào có thể nhận biết được
Thành thật mà nói, tôi đã đủ chìm trong hoài niệm rồi và không nghĩ mình cần thêm đồ vật để níu giữ. Tôi không xem chương trình TV mới, không nghe nhạc mới, có cảm giác tinh thần mình bị kẹt ở năm 1999, và tôi không chắc điều đó có lành mạnh không
So sánh chính xác hơn là thư vốn tồn tại lâu dài
Tin nhắn tạo nên một câu chuyện và chứa đựng tinh thần thời đại của thế hệ chúng ta
Có vẻ mọi người vẫn chưa suy nghĩ nhiều về cách bảo tồn những thứ như vậy
Cá nhân tôi thích ý tưởng này, và có thể tưởng tượng việc xuất toàn bộ hoặc một phần tin nhắn với mẹ để giữ lại như ký ức về thời kỳ đó
Thật sự rất tuyệt, và có vẻ cũng có thể là một món quà tuyệt vời cho người thân yêu
Gần đây tôi dùng thử Nomic Atlas(https://docs.nomic.ai/) và đưa khá nhiều lịch sử chat của mình vào; việc trực quan hóa và duyệt tin nhắn theo các cụm chủ đề khá thú vị
Vì vậy tôi nghĩ nếu tạo embedding cho tin nhắn và chạy mô hình hóa chủ đề thì có thể mang khả năng tìm kiếm của kỹ thuật số sang định dạng vật lý
Khi đó có thể tạo chỉ mục theo chủ đề ở cuối cuốn sách thật, và tham chiếu tới số trang có các tin nhắn thuộc chủ đề đó
Script Python để xuất iMessage trên Mac: https://pypi.org/project/imessage-reader/
Sau 2000 năm nữa, khi nghiên cứu người thế kỷ 21 đã sống như thế nào, có khi chỉ còn lại những cuốn sách kiểu này
Tất cả thông tin nhất thời như tweet, chat, SMS, email, ảnh số trên thiết bị cá nhân có thể đều đã biến mất
Tôi không biết có BN Press dành cho cá nhân
Tôi đã tìm hiểu KDP và Lulu một chút, nhưng sau khi dùng Kindle và thấy thích, tôi quyết định tập trung chủ yếu vào ebook
Nếu in giới hạn hoặc in thử nghiệm thì BN Press có vẻ rất tuyệt, và 30 đô la cho 1300 trang là quá ấn tượng