1 puntos por GN⁺ 2024-03-08 | 1 comentarios | Compartir por WhatsApp
  • Como era difícil volver a leer conversaciones antiguas solo con búsqueda, convirtió su conversación más grande de iMessage en un libro físico que puede hojearse por fecha
  • Extrajo los mensajes abriendo sms.db del respaldo del iPhone con SQLite, pero parte del contenido no estaba en message.text, sino en un blob binario de message.attributedBody, así que hizo falta procesamiento adicional
  • En vez de crear su propio parser, aprovechó el crate de Rust imessage-database para leer la base de datos de iMessage como datos estructurados, y ajustó el SQL para traer solo una conversación
  • El contenido del libro se generó con LaTeX, y para resolver el renderizado de emoji y el costo de impresión usó XeLaTeX y la fuente monocromática Google Noto Emoji
  • Los mensajes de 3 años sumaron unas 1,300 páginas en formato 6" x 9", así que se dividieron en 3 volúmenes y se imprimieron por 30 dólares con envío incluido en Barnes & Noble Press

Por qué convertir iMessage en un libro

  • Al intentar recordar hechos concretos del pasado, el historial de mensajes de texto suele servir como pista
  • La búsqueda del historial completo de iMessage en iPhone ha mejorado en velocidad, pero para que sea útil hay que recordar una parte exacta del texto del mensaje que se busca
  • Al entrar desde los resultados de búsqueda a una conversación antigua para ver el contexto alrededor, la carga por desplazamiento es muy lenta
  • Como no existe una función para saltar directamente a una fecha específica, decidió crear por su cuenta una experiencia de hojear la conversación como si fuera un libro

Extraer mensajes desde un respaldo de iPhone

  • Para procesar los mensajes, primero tuvo que sacar los datos fuera del iPhone
  • Según iPhone Wiki, al obtener sms.db desde un respaldo de iPhone se pueden manejar los mensajes como una base de datos SQLite
  • Tras crear un respaldo estándar con Finder en Mac y abrir la carpeta del respaldo, en la raíz aparecen directorios con nombres en bytes hexadecimales
  • El nombre de archivo de sms.db era 3d0d7e5fb2ce288813306e4d4636395e047a3d28, tal como aparece en iPhone Wiki, y pudo copiarlo como imessage.db y abrirlo con la CLI de sqlite3
  • La base incluía tablas como message, attachment, chat, handle y chat_message_join

Consulta SQL y el problema de extraer el contenido

  • Para sacar la conversación real, tuvo que unir las tablas message, chat_message_join y chat
  • Al consultar los mensajes de un chat_identifier específico en orden cronológico, vio que algunos mensajes aparecían sin contenido
  • Parte de esos mensajes aparentemente vacíos no estaba en message.text, sino en un blob binario codificado de NSMutableAttributedString dentro de la columna message.attributedBody
  • Al extraer el binario en hex desde sqlite3 y revisarlo con xxd, pudo ver que el contenido de texto realmente estaba ahí
  • En lugar de implementar por cuenta propia un parser del formato binario, usó el crate imessage-database
    • Este crate lee la base de datos de iMessage y la convierte en estructuras de datos de Rust
    • El binario imessage-exporter incluido puede generar conversaciones como texto o HTML
    • Modificó ligeramente la sentencia SQL de la librería para limitar la extracción a una sola conversación

Crear el contenido del libro con LaTeX

  • Como el objetivo no era un archivo HTML o de texto, sino un libro físico que pudiera sostenerse y hojearse, eligió LaTeX como formato de salida
  • El código fuente basado en texto de LaTeX encaja bien con plantillas y generación automática, así que exportó cada mensaje como código LaTeX
  • El renderizado inicial comenzó de forma simple
    • Los mensajes enviados por él se alineaban a la izquierda, y los de la otra persona a la derecha
    • Donde había imágenes, insertó un texto indicando archivo adjunto
    • Omitió elementos más engorrosos de renderizar, como reacciones y respuestas
    • Dividió capítulos por fecha e hizo algunos ajustes visuales

Manejo de emoji y XeLaTeX

  • LaTeX normal no soporta unicode, así que si intentaba renderizar tramos que incluían emoji, el compilador fallaba
  • Podría haber eliminado los emoji, pero consideró que son importantes en la comunicación moderna y decidió no excluirlos
  • Cambió a XeLaTeX para usar soporte de fuentes unicode
  • En el código LaTeX generado, envolvió cada emoji con la forma {\\emojifont X} y asignó \\emojifont a una fuente de emoji, logrando renderizar emoji inline
  • Para evitar el costo de la impresión a color, usó la fuente monocromática de emoji de Google Noto Emoji
  • Insertó el comando LaTeX \\markright en cada mensaje para que el encabezado siguiera la fecha actual

Dividir 1,300 páginas en 3 volúmenes

  • Al compilar 3 años de mensajes con el tamaño de página estándar de 6" x 9", se generó un PDF de bastante más de 1,000 páginas
  • Como el período objetivo era exactamente de 3 años, dividió el conjunto completo en 3 volúmenes para reducir cada uno a un tamaño imprimible
  • La extensión final fue de aproximadamente 1,300 páginas en total

Impresión con Barnes & Noble Press

  • Después de revisar varias opciones de impresión, eligió Barnes and Noble Press
  • Era algo más caro que otras opciones como Lulu o Amazon KDP, pero resultó más adecuado porque al imprimir un libro para uso personal no era necesario “publicarlo”
  • Pudo imprimir los tres volúmenes, unas 1,300 páginas en total, por 30 dólares con envío incluido
  • Al subir el PDF del interior, el sitio de B&N Press generó las medidas necesarias para la portada, y con esas medidas creó las portadas de cada volumen en Inkscape
  • El sitio web de B&N Press en general era muy lento, y durante el pedido hubo un problema por el cual la página de pago no abría durante más de 24 horas
  • Una vez resuelto el problema, el pedido siguió adelante y unas semanas después recibió los tres libros físicos
  • Hojearlos como libros físicos resultó mucho más fácil que volver a buscar conversaciones pasadas en el teléfono

Cómo hacerlo tú mismo

  • El código fuente está algo desordenado y no está empaquetado como binario de Cargo, pero la cantidad de código no es mucha
  • El código del proyecto está publicado en bkettle/message-book

1 comentarios

 
GN⁺ 2024-03-08
Opiniones de Hacker News
  • Me encanta por la idea de dejar más registros físicos de la correspondencia personal
    Por el título pensé que sería una historia sobre un LLM generando una narrativa de eventos a partir del historial de mensajes, y siento que eso sería genial como servicio

    • Yo también pensé eso, pero la historia real fue mucho mejor
      Ahora me dieron ganas de intentarlo también con mi historial de chats de Telegram
    • Una gran desventaja del correo privado y los mensajes de texto es que hace desaparecer una enorme cantidad de correspondencia personal que los historiadores del futuro podrían ver
      Hay libros que recopilan cartas de Feynmann, Feyeraband, Einstein y otros; ahora casi todo son correos detrás de una contraseña, así que es muy probable que no quede ese montón de cartas personales para contextualizar a las figuras históricas del futuro
    • Como arte está bien, pero dudo de su utilidad práctica
      Si necesitas una copia física, podrías copiarlo a una microSD, y si te preocupa perderla, haces unas tres
    • Por el título imaginé exactamente eso, y ya me estaba pareciendo bastante interesante
      Ahora quiero intentar hacer algo parecido yo mismo
    • Yo también pensé que sería una historia donde sale toda una novela criminal generada por IA a partir del historial de chats
  • Qué genial ver que la librería que hice, imessage-exporter, se usa de verdad
    Es un caso de uso realmente interesante

    • Hace poco estuve metiéndome con el archivo SQLite para vigilar y extraer cambios que indicaran mensajes nuevos, y un prototipo inicial armado con algunos trucos funcionaba más o menos
      La próxima vez que retome esta idea pienso cambiarme a esa librería, y me interesaría cualquier consejo o tip sobre acceso casi en tiempo real
  • Mi tía ha conservado de forma maravillosa las cartas y diarios que mis abuelos intercambiaron durante la Segunda Guerra Mundial
    De inmediato pensé que nuestros hijos y nietos no van a poder disfrutar de lo mismo
    Si les interesa, pueden ver el blog

    • Pensando en la mayoría de las parejas, quizá esto sea un poco diferente
      En realidad se parecería más a conservar todas las notitas de “compra leche de camino a casa”, “sí vas a recoger a los niños, ¿verdad?” o “nos vemos en 20 minutos”
      Aun así, eso también tiene su encanto, así que espero no sonar demasiado aguafiestas
  • Ya toca hacer que esto funcione también con WhatsApp para los británicos
    Me emocioné con la idea del proyecto, hasta que me di cuenta de que para hacer un fork tendría que aprender Rust
    De todos modos, es una idea realmente genial, y leer historiales de chat con amigos da bastante nostalgia

    • Este paquete de Python puede exportar chats de respaldo de WhatsApp a JSON o HTML: https://github.com/KnugiHK/WhatsApp-Chat-Exporter
      También enlaza una herramienta de exportación de Telegram
    • WhatsApp puede exportar chats a txt, pero parece que habría pérdidas
      Por ejemplo, no estoy seguro de que conserve los emojis, y obviamente dejaría fuera adjuntos o mensajes de voz
      Si lo extraes de la base de datos de respaldo, además seguro está cifrada
    • No solo el Reino Unido; lo necesita todo el mundo
    • Hace mucha falta una forma de exportar todos los mensajes y medios en un formato razonablemente revisable
      Si soy sincero, me conformaría incluso con poder crear un archivo de respaldo del que realmente pudiera estar seguro de restaurar más tarde en otro dispositivo
  • ¿Soy el único al que le inquieta un poco la idea de mandar a una editorial el historial completo de mensajes personales para imprimirlo?

    • Si yo le mandara a una editorial el historial completo de mis mensajes personales, creo que la parte más nerviosa sería la editorial
    • Una editorial se dedica a poner tinta sobre papel
      Más bien debería preocuparte más un ataque de intermediario por parte de una empresa de minería de datos cuyo negocio es cambiar comportamientos mediante publicidad o herramientas de formación de consenso
    • A mí también me inquieta
      Llevo bastante tiempo queriendo hacer algo como lo que hizo la autora, y este sigue siendo uno de los obstáculos que no he resuelto
      Imprimir y encuadernar en casa probablemente sea la única opción, y ahora lo que queda es encontrar cómo hacer que el resultado final sea duradero y agradable al tacto
    • No me sorprendería que el archivo no se guardara de una forma especialmente segura
      Es muy probable que la editorial no esperara que el PDF de impresión incluyera información de identificación personal, y el período de retención de datos incluso podría ser indefinido
    • Tal vez podrías probar con el switch —rot13 :-)
  • Puede que sea una opinión impopular, pero esto me da un poco de escalofríos
    Para empezar, no entiendo por qué la gente querría guardar un registro de sus conversaciones privadas
    A diferencia de las publicaciones públicas o los blogs, creo que los mensajes privados deberían ser efímeros. No grabamos todas las conversaciones cara a cara ni todas las llamadas telefónicas

    • Es un tema interesante, y quizá ni siquiera sea una opinión impopular
      Parece que cada quien ve este asunto de forma distinta
      Yo intento conservar todos los historiales de chat que puedo, y también me gustaría que todas las conversaciones cara a cara y llamadas telefónicas quedaran grabadas y fueran fácilmente accesibles
      Siento que la suma total de mis experiencias es lo que soy, así que no quiero olvidarlas. Si no puedo recordarlas, siento como si de algún modo fuera menos yo mismo
      Pero también vi ese episodio de Black Mirror, así que termino dividido entre el deseo de recordar perfectamente todas mis experiencias y los beneficios mentales y emocionales de poder olvidar
    • Estoy de acuerdo
      Aunque en mi caso me da más cringe saber que los mensajes que mandé antes siguen ahí para siempre
      Yo hace 10 años era tan distinto a como soy ahora que leer mensajes viejos se siente muy incómodo
    • Entiendo ambos lados
      Hasta alrededor de 2004 todavía me comunicaba con la gente por cartas reales, y leer unos años después cartas de exnovias o de mis hermanas menores cuando entré por primera vez a la universidad me provocaba una nostalgia muy fuerte
      Por otro lado, después de dejar el ejército me mudé a un lugar mucho más pequeño y metí la mayoría de mis cosas en una bodega; tras tres años, decidí que cualquier cosa que no hubiera tocado no la necesitaba y la mandé al almacén
      Creo que ahí iban incluidas todas mis cartas y fotos antiguas, pero no puedo decir que de verdad extrañe esas cosas
      La gente dice que no quiere olvidar el pasado, pero la realidad de olvidar es que no sabes que olvidaste algo, así que una vez que ya lo olvidaste no hay un efecto perceptible
      Si soy sincero, ya estoy lo bastante empapado de nostalgia y no necesito más cosas a las que aferrarme. Ni siquiera veo programas nuevos ni escucho música nueva; siento que mentalmente sigo atrapado en 1999, y no sé si eso sea saludable
    • Los mensajes privados no son lo mismo que las conversaciones cara a cara o las llamadas telefónicas
      La comparación más precisa serían las cartas, que sí duran mucho tiempo
    • Yo no doy por hecho que esas cosas sean privadas o efímeras
      Los mensajes forman una narrativa y capturan el espíritu de la época de nuestra generación
      Parece que la gente todavía no ha pensado mucho en cómo conservar este tipo de cosas
      En lo personal, me gusta la idea, y puedo imaginar exportar todos o algunos de los mensajes que intercambié con mi madre para conservarlos como recuerdo de esa época
  • Está padrísimo, y parece que podría ser un regalo excelente para alguien querido
    Hace poco, mientras probaba Nomic Atlas(https://docs.nomic.ai/), le metí bastante de mis historiales de chat, y fue muy interesante visualizar y explorar los mensajes agrupados por temas
    Así que se me ocurre que, si generas embeddings de los mensajes y corres modelado de temas, podrías llevar la capacidad de búsqueda de lo digital a un formato físico
    Entonces podrías crear al final del libro real un índice por temas, con referencias a los números de página donde aparecen mensajes sobre ese tema

  • Script de Python para exportar iMessage en Mac: https://pypi.org/project/imessage-reader/

  • Dentro de 2000 años, quizá este tipo de libros sea lo único que quede para estudiar cómo vivía la gente del siglo XXI
    Puede que toda la información efímera —tuits, chats, SMS, correos, fotos digitales en dispositivos personales— haya desaparecido

  • No conocía BN Press para uso personal
    Había investigado un poco KDP y Lulu, pero después de probar Kindle y de que me gustara, decidí enfocar mis esfuerzos principalmente en libros electrónicos
    Para impresiones limitadas o experimentales, BN Press se ve excelente, y 30 dólares por 1300 páginas es impresionante