1 điểm bởi GN⁺ 2024-03-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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.db trong 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 trong message.text mà nằm trong blob nhị phân của message.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.db từ 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.db3d0d7e5fb2ce288813306e4d4636395e047a3d28 như trên iPhone Wiki; tác giả sao chép file này thành imessage.db và mở được bằng CLI sqlite3
  • 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_identifier cụ 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ột message.attributedBody
  • Khi lấy dữ liệu nhị phân từ sqlite3 dưới dạng hex rồi kiểm tra bằng xxd, 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

 
GN⁺ 2024-03-08
Ý 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

    • Tôi cũng nghĩ vậy, nhưng câu chuyện thực tế còn hay hơn nhiều
      Giờ tôi cũng muốn thử với lịch sử chat Telegram của mình
    • Nhược điểm lớn của email và tin nhắn riêng tư là lượng thư từ cá nhân mà các nhà sử học tương lai có thể xem sẽ biến mất cực kỳ nhiều
      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
    • Với tư cách nghệ thuật thì hay, nhưng tính thực dụng thì đáng nghi
      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
    • Nhìn tiêu đề là tôi đã tưởng tượng đúng kiểu đó, và đã nghĩ nó khá thú vị rồi
      Giờ thì tôi muốn tự thử làm một thứ tương tự
    • Tôi cũng tưởng đây sẽ là câu chuyện về cả một tiểu thuyết tội phạm do AI tạo ra dựa trên lịch sử chat
  • 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ị

    • Gần đây tôi đang đào sâu vào file SQLite để theo dõi và trích xuất các thay đổi biểu thị tin nhắn mới; nguyên mẫu ban đầu làm bằng vài mẹo nhìn chung đã chạy được
      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ếu nghĩ đến phần lớn các cặp đôi thì chuyện này có thể hơi khác
      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

    • Gói Python này có thể xuất chat sao lưu WhatsApp ra JSON hoặc HTML: https://github.com/KnugiHK/WhatsApp-Chat-Exporter
      Công cụ export của Telegram cũng được liên kết ở đó
    • WhatsApp có thể xuất chat ra txt, nhưng tôi nghĩ sẽ có mất má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
    • Không chỉ nước Anh, cả thế giới đều cần
    • Rất cần một chức năng xuất toàn bộ tin nhắn và media sang một định dạng có thể rà soát hợp lý
      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?

    • Nếu tôi gửi toàn bộ lịch sử tin nhắn cá nhân của mình cho nhà xuất bản, bên bất an nhất có lẽ sẽ là nhà xuất bản
    • Nhà xuất bản làm nghề phun mực lên giấy
      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 cũng thấy bất an
      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
    • Tôi sẽ không ngạc nhiên nếu file không được lưu trữ đặc biệt an toàn
      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
    • Có lẽ nên thử dùng switch —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

    • Đây là chủ đề thú vị, và cũng chưa chắc là ý kiến không được ưa chuộng
      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
    • Đồng ý
      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
    • Tôi hiểu cả hai phía
      Đế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
    • Tin nhắn cá nhân không phải là trò chuyện trực tiếp hay gọi điện thoại
      So sánh chính xác hơn là thư vốn tồn tại lâu dài
    • Tôi không giả định những thứ đó là riêng tư hay nhất thờ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