1 poin oleh GN⁺ 2024-03-08 | 1 komentar | Bagikan ke WhatsApp
  • Karena sulit membaca ulang percakapan lama hanya dengan pencarian, percakapan iMessage terbesar diubah menjadi buku fisik agar bisa dibolak-balik berdasarkan tanggal
  • Pesan diekstrak dengan membuka sms.db dari backup iPhone menggunakan SQLite, tetapi sebagian isi tidak berada di message.text melainkan di blob biner message.attributedBody, sehingga perlu pemrosesan tambahan
  • Alih-alih membuat parser sendiri, digunakan crate Rust imessage-database untuk membaca basis data iMessage sebagai data terstruktur, lalu SQL disesuaikan agar hanya mengambil satu percakapan
  • Isi buku dibuat dengan LaTeX, dan untuk mengatasi masalah rendering emoji serta biaya cetak, digunakan XeLaTeX dan font hitam-putih Google Noto Emoji
  • Pesan selama 3 tahun menjadi sekitar 1.300 halaman pada ukuran 6" x 9", dibagi menjadi 3 volume, dan dicetak melalui Barnes & Noble Press seharga 30 dolar termasuk pengiriman

Mengapa membuat iMessage menjadi buku

  • Saat mencoba mengingat kejadian spesifik di masa lalu, riwayat pesan teks sering menjadi petunjuk
  • Pencarian seluruh riwayat iMessage di iPhone memang sudah lebih cepat, tetapi agar berguna, kita harus ingat sebagian frasa yang tepat dari pesan yang dicari
  • Saat masuk ke percakapan lama dari hasil pencarian untuk melihat konteks di sekitarnya, pemuatan scroll sangat lambat
  • Karena tidak ada fitur untuk langsung lompat ke tanggal tertentu, diputuskan untuk membuat sendiri pengalaman membolak-balik seperti buku dari percakapan

Mengambil pesan dari backup iPhone

  • Untuk mengolah pesan, pertama-tama datanya harus dikeluarkan dari iPhone
  • Menurut iPhone Wiki, jika mengambil sms.db dari backup iPhone, pesan bisa ditangani sebagai basis data SQLite
  • Setelah membuat backup standar lewat Finder di Mac lalu membuka folder backup, di root ada direktori-direktori dengan nama byte heksadesimal
  • Nama file sms.db adalah 3d0d7e5fb2ce288813306e4d4636395e047a3d28 seperti yang tercantum di iPhone Wiki; file itu disalin menjadi imessage.db lalu bisa dibuka dengan CLI sqlite3
  • Di dalam DB ada tabel seperti message, attachment, chat, handle, dan chat_message_join

Query SQL dan masalah ekstraksi isi

  • Untuk mengambil percakapan sebenarnya, tabel message, chat_message_join, dan chat harus di-join
  • Saat mengambil pesan berurutan berdasarkan tanggal dengan acuan chat_identifier tertentu, isi sebagian pesan terlihat kosong
  • Sebagian pesan yang tampak kosong ternyata disimpan bukan di message.text, melainkan di blob biner NSMutableAttributedString yang terenkode di kolom message.attributedBody
  • Saat biner dikeluarkan sebagai hex dari sqlite3 lalu diperiksa dengan xxd, terlihat bahwa isi karakter CVS memang ada di dalamnya
  • Alih-alih mengimplementasikan parser format binernya sendiri, digunakan crate imessage-database
    • Crate ini membaca basis data iMessage dan mengeluarkannya sebagai struktur data Rust
    • Binary imessage-exporter yang disertakan dapat menghasilkan percakapan dalam bentuk teks atau HTML
    • Pernyataan SQL di pustaka sedikit dimodifikasi agar hanya mengambil satu percakapan tertentu

Membuat isi buku dengan LaTeX

  • Karena targetnya bukan HTML atau file teks melainkan buku fisik yang bisa dipegang dan dibolak-balik, LaTeX dipilih sebagai target output
  • Sumber LaTeX yang berbasis teks cocok untuk templating dan pembuatan otomatis, jadi tiap pesan diekspor sebagai kode LaTeX
  • Rendering awal dimulai dari bentuk yang sederhana
    • Pesan yang saya kirim diratakan ke kiri, pesan lawan bicara ke kanan
    • Di tempat yang memiliki gambar, dimasukkan teks penanda lampiran
    • Elemen yang merepotkan untuk dirender seperti reaksi dan balasan dilewati
    • Bab dipisahkan berdasarkan tanggal dan sedikit disesuaikan secara visual

Menangani emoji dan XeLaTeX

  • LaTeX biasa tidak mendukung unicode, sehingga ketika mencoba merender bagian yang berisi emoji, compiler gagal
  • Emoji sebenarnya bisa saja dihapus, tetapi karena emoji dianggap penting dalam komunikasi modern, itu tidak dilakukan
  • Beralih ke XeLaTeX untuk memakai dukungan font unicode
  • Dalam sumber LaTeX yang dihasilkan, tiap emoji dibungkus dalam bentuk {\\emojifont X}, lalu \\emojifont diarahkan ke font emoji sehingga rendering emoji inline berhasil
  • Untuk menghindari biaya cetak warna, digunakan font emoji hitam-putih Google Noto Emoji
  • Di setiap pesan ditambahkan perintah LaTeX \\markright agar header mengikuti tanggal saat ini

Membagi 1.300 halaman menjadi 3 volume

  • Setelah pesan selama 3 tahun dikompilasi pada ukuran halaman standar 6" x 9", dihasilkan PDF yang jauh melampaui 1.000 halaman
  • Karena rentang waktunya tepat 3 tahun, keseluruhannya dibagi menjadi 3 volume agar ukuran tiap volume tetap bisa dicetak
  • Hasil akhirnya berjumlah sekitar 1.300 halaman

Mencetak dengan Barnes & Noble Press

  • Setelah meninjau beberapa opsi pencetakan, dipilih Barnes and Noble Press
  • Memang sedikit lebih mahal dibanding opsi lain seperti Lulu atau Amazon KDP, tetapi lebih cocok karena saat mencetak buku untuk penggunaan pribadi, tidak perlu “menerbitkan” buku tersebut
  • Tiga volume, sekitar 1.300 halaman total, bisa dicetak seharga 30 dolar termasuk pengiriman
  • Setelah PDF isi diunggah, situs B&N Press menghasilkan ukuran yang diperlukan untuk sampul, lalu sampul tiap volume dibuat dengan Inkscape mengikuti ukuran tersebut
  • Situs web B&N Press secara umum sangat lambat, dan saat pemesanan ada masalah halaman pembayaran yang tidak terbuka lebih dari 24 jam
  • Setelah masalah itu teratasi, pesanan diproses, dan beberapa minggu kemudian tiga buku fisik diterima
  • Cara membolak-balik buku fisik ini jauh lebih mudah daripada mencari kembali percakapan lama di ponsel

Mencoba membuatnya sendiri

  • Kode sumbernya masih cukup kasar dan belum dipaketkan sebagai binary Cargo, tetapi jumlah kodenya tidak banyak
  • Kode proyek dipublikasikan di bkettle/message-book

1 komentar

 
GN⁺ 2024-03-08
Komentar Hacker News
  • Saya sangat menyukainya karena kita memang perlu meninggalkan lebih banyak catatan fisik dari korespondensi pribadi
    Dari judulnya saja, saya kira ini cerita tentang LLM yang membuat narasi peristiwa berdasarkan riwayat pesan, dan rasanya keren kalau hal seperti ini dijadikan layanan

    • Saya juga berpikir begitu, tapi cerita aslinya jauh lebih bagus
      Sekarang saya jadi ingin mencobanya juga dengan riwayat chat Telegram saya
    • Kekurangan besar dari email dan pesan teks pribadi adalah begitu banyak korespondensi pribadi yang bisa dilihat sejarawan masa depan akan hilang
      Ada buku-buku yang menghimpun surat-surat Feynmann, Feyeraband, Einstein, dan lainnya, tetapi sekarang hampir semuanya berupa email di balik kata sandi, jadi besar kemungkinan kita hampir tidak akan mendapat tumpukan surat pribadi yang bisa memberi konteks pada tokoh-tokoh historis di masa depan
    • Sebagai karya seni ini bagus, tetapi kegunaannya patut dipertanyakan
      Kalau butuh salinan fisik, cukup salin ke microSD, dan kalau khawatir hilang, buat saja sekitar tiga salinan
    • Saya melihat judulnya dan membayangkan persis hal seperti itu, dan sudah berpikir itu akan cukup menarik
      Sekarang saya jadi ingin mencoba sendiri sesuatu yang mirip
    • Saya juga mengira ini akan menjadi cerita tentang novel kriminal buatan AI penuh yang dibuat berdasarkan riwayat chat
  • Keren melihat library yang saya buat, imessage-exporter, benar-benar digunakan
    Ini kasus penggunaan yang sangat menarik

    • Baru-baru ini saya membongkar file SQLite untuk memantau dan mengekstrak perubahan yang menandai pesan baru, dan prototipe awal yang dibuat dengan beberapa trik pada dasarnya berjalan
      Lain kali saat meninjau ide ini lagi, saya berencana menggantinya dengan library tersebut, dan saya penasaran apakah ada saran atau kiat terkait akses yang nyaris real-time
  • Bibi saya telah menyimpan dengan sangat baik surat dan buku harian yang saling dikirim kakek dan nenek saya selama Perang Dunia II
    Saya langsung terpikir bahwa anak-anak dan cucu-cucu kita tidak akan bisa menikmati kegembiraan yang sama
    Kalau tertarik, bisa melihat blog ini

    • Kalau memikirkan kebanyakan pasangan, ini mungkin sedikit berbeda
      Rasanya lebih mirip menyimpan semua catatan kecil seperti “belikan susu dalam perjalanan pulang”, “kamu yang jemput anak-anak, kan?”, “ketemu 20 menit lagi”
      Meski begitu, hal seperti itu tetap punya daya tariknya sendiri, jadi semoga ini tidak terdengar seperti terlalu mematahkan semangat
  • Sekarang saatnya membuat ini bekerja juga untuk WhatsApp demi orang-orang Inggris
    Saya sempat bersemangat dengan ide proyeknya, lalu sadar bahwa untuk melakukan fork saya harus belajar Rust
    Bagaimanapun, ini ide yang sangat keren, dan membaca riwayat chat dengan teman-teman memang cukup membangkitkan nostalgia

    • Paket Python ini bisa mengekspor chat cadangan WhatsApp ke JSON atau HTML: https://github.com/KnugiHK/WhatsApp-Chat-Exporter
      Alat ekspor Telegram juga ditautkan di sana
    • WhatsApp bisa mengekspor chat sebagai txt, tetapi sepertinya ada yang hilang
      Misalnya saya tidak yakin apakah emoji tetap ada, dan lampiran atau pesan suara tentu saja tidak ikut
      Kalau mengekstrak dari database cadangan, pasti ada enkripsinya juga
    • Bukan hanya Inggris, seluruh dunia membutuhkannya
    • Kita sangat membutuhkan fitur untuk mengekspor semua pesan dan media ke format yang bisa ditinjau secara wajar
      Jujur saja, saya bahkan akan senang kalau setidaknya bisa membuat arsip cadangan yang bisa saya yakini dapat dipulihkan nanti di perangkat lain
  • Apakah hanya saya yang agak gelisah dengan ide mengirim seluruh riwayat pesan pribadi ke penerbit untuk dicetak?

    • Kalau saya mengirim seluruh riwayat pesan pribadi saya ke penerbit, sepertinya pihak yang paling gelisah justru penerbitnya
    • Penerbit bergerak di bisnis menaruh tinta di atas kertas
      Yang seharusnya lebih membuat gelisah adalah diserang man-in-the-middle oleh perusahaan data mining yang pekerjaannya mengubah perilaku sebagai alat iklan atau pembentukan konsensus
    • Saya juga gelisah
      Saya sudah cukup lama merencanakan hal yang dilakukan penulis ini, dan ini salah satu hambatan yang belum saya pecahkan
      Mencetak dan menjilid sendiri di rumah mungkin satu-satunya pilihan, dan yang tersisa sekarang adalah bagaimana membuat hasil akhirnya tahan lama dan enak digenggam
    • Saya tidak akan terkejut kalau file-file itu tidak disimpan dengan sangat aman
      Penerbit mungkin tidak menyangka ada informasi identitas pribadi di dalam PDF untuk cetak, dan masa retensi datanya bisa saja tidak terbatas
    • Mungkin bisa coba switch —rot13 :-)
  • Mungkin ini pendapat yang tidak populer, tapi ini agak menyeramkan
    Sejak awal saya tidak paham mengapa orang ingin menyimpan riwayat percakapan pribadi
    Berbeda dengan unggahan publik atau blog, menurut saya pesan pribadi seharusnya bersifat sementara. Kita kan tidak merekam semua percakapan tatap muka atau panggilan telepon

    • Ini topik yang menarik, dan belum tentu pendapat yang tidak populer
      Sepertinya tiap orang memandang masalah ini secara berbeda
      Saya berusaha menyimpan semua riwayat chat yang memungkinkan, dan saya juga berharap semua percakapan tatap muka serta panggilan telepon direkam dan mudah diakses
      Saya punya perasaan bahwa jumlah total pengalaman sayalah yang membentuk diri saya, jadi saya tidak ingin melupakan pengalaman-pengalaman itu. Kalau tidak mengingatnya, rasanya entah bagaimana saya menjadi lebih sedikit dari diri saya sendiri
      Namun saya juga sudah menonton episode Black Mirror itu, jadi saya bimbang antara keinginan mengingat semua pengalaman secara sempurna dan manfaat mental serta emosional dari kemampuan untuk melupakan
    • Setuju
      Namun bagi saya, yang lebih besar adalah rasa malu karena fakta bahwa pesan yang saya kirim dulu akan tersisa selamanya
      Saya 10 tahun lalu terlalu berbeda dari saya sekarang, sehingga membaca pesan lama terasa sangat canggung
    • Saya mengerti kedua sisi
      Sampai sekitar 2004 saya masih berhubungan dengan orang-orang lewat surat sungguhan, dan membaca beberapa tahun kemudian surat dari mantan pacar atau dari adik-adik perempuan saya saat pertama kali masuk universitas benar-benar membangkitkan nostalgia kuat
      Di sisi lain, setelah keluar dari militer saya pindah ke tempat yang jauh lebih kecil, memasukkan sebagian besar barang ke gudang, dan setelah 3 tahun memutuskan bahwa barang yang tidak tersentuh adalah barang yang tidak saya butuhkan, lalu menyerahkannya ke tempat penyimpanan
      Sepertinya semua surat dan foto lama termasuk di sana, tetapi saya tidak bisa bilang saya benar-benar merindukan barang-barang itu
      Orang bilang tidak ingin melupakan masa lalu, tetapi kenyataan dari lupa adalah kita tidak tahu bahwa kita sudah lupa, jadi begitu kita lupa, tidak ada dampak yang bisa dirasakan
      Jujur saja, saya sudah cukup tenggelam dalam nostalgia, dan saya rasa tidak butuh benda lain untuk terus menggenggamnya. Saya tidak menonton acara TV baru dan tidak mendengarkan musik baru, rasanya secara mental saya terjebak di 1999, dan saya tidak tahu apakah itu sehat
    • Pesan pribadi bukan percakapan tatap muka atau panggilan telepon
      Perbandingan yang lebih tepat adalah surat yang bertahan lama
    • Saya tidak menganggap hal-hal seperti itu bersifat privat atau sementara
      Pesan membentuk sebuah cerita dan memuat zeitgeist generasi kita
      Sepertinya orang belum banyak memikirkan bagaimana cara melestarikan hal semacam ini
      Secara pribadi saya menyukai ide ini, dan bisa membayangkan mengekspor seluruh atau sebagian pesan dengan ibu saya untuk menyimpannya sebagai kenangan dari masa itu
  • Benar-benar keren, dan tampaknya bisa menjadi hadiah yang luar biasa untuk orang tersayang
    Baru-baru ini saya mencoba Nomic Atlas(https://docs.nomic.ai/) dan memasukkan banyak riwayat chat saya, dan cukup menarik memvisualisasikan serta menjelajahi pesan sebagai klaster berdasarkan topik
    Jadi saya terpikir bahwa dengan membuat embedding pesan dan menjalankan pemodelan topik, kita bisa membawa kemampuan pencarian digital ke format fisik
    Dengan begitu, di akhir buku fisiknya bisa dibuat indeks berdasarkan topik, lalu mencantumkan nomor halaman tempat pesan tentang topik itu berada sebagai referensi

  • Skrip Python untuk mengekspor iMessage di Mac: https://pypi.org/project/imessage-reader/

  • 2000 tahun lagi, mungkin hanya buku-buku seperti ini yang tersisa saat meneliti bagaimana orang abad ke-21 hidup
    Semua informasi sementara seperti tweet, chat, SMS, email, dan foto digital di perangkat pribadi bisa saja sudah hilang

  • Saya tidak tahu tentang BN Press untuk penggunaan pribadi
    Saya sempat mencari tahu KDP dan Lulu, tetapi setelah mencoba Kindle dan mulai menyukainya, saya memutuskan menjadikan ebook sebagai fokus utama
    Untuk cetakan terbatas atau eksperimental, BN Press tampak bagus, dan 30 dolar untuk 1300 halaman itu luar biasa