1 ポイント 投稿者 GN⁺ 2024-03-08 | 1件のコメント | WhatsAppで共有
  • 古い会話は検索だけでは読み返しにくいため、最も大きな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としてコピーし、sqlite3 CLIで開くことができた
  • DBにはmessageattachmentchathandlechat_message_joinなどのテーブルが含まれている

SQLクエリと本文抽出の問題

  • 実際の会話を取り出すには、messagechat_message_joinchatテーブルをJOINする必要があった
  • 特定の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フォントを使用した
  • 各メッセージごとに\markright LaTeXコマンドを入れ、ヘッダーが現在の日付に追従するようにした

1,300ページを3冊に分ける

  • 3年分のメッセージを標準的な6" x 9"ページサイズでコンパイルすると、1,000ページを大きく超えるPDFが生成された
  • 対象期間がちょうど3年だったため、全体を3冊に分け、各巻を印刷可能なサイズに抑えた
  • 最終的な分量は合計約1,300ページだった

Barnes & Noble Pressで印刷

  • 複数の印刷オプションを検討したうえで、Barnes and Noble Pressを選んだ
  • LuluやAmazon KDPなど他の選択肢よりやや高かったが、個人用の本を印刷する際に本を「出版」しなくてもよい点がより適していた
  • 3冊、約1,300ページ全体を送料込み30ドルで印刷できた
  • 本文PDFをアップロードすると、B&N Pressのサイトが表紙に必要な寸法を生成し、その寸法に合わせてInkscapeで各巻の表紙を作った
  • B&N PressのWebサイトは全体的に非常に遅く、注文中に決済ページが24時間以上開かない問題があった
  • 問題が解決した後、注文が進み、数週間後に3冊の実物の本を受け取った
  • 物理的な本としてめくって見る方式は、スマートフォンで過去の会話を探し直すよりはるかに簡単だった

自分で作ってみる

  • ソースコードは整理状態が粗く、Cargoバイナリとしてパッケージ化されてはいないが、コード量は多くない
  • プロジェクトのコードはbkettle/message-bookで公開されている

1件のコメント

 
GN⁺ 2024-03-08
Hacker Newsの意見
  • 個人的な書簡の物理的な記録をもっと残すべきだという点で、とても気に入った
    タイトルだけ見たときは、メッセージの記録をもとにLLMが出来事の物語を生成する話かと思っていて、こういうものをサービス化したら面白そうだと思った

    • 私もそう思ったけれど、実際の話のほうがずっと良かった
      今度は自分のTelegramチャット履歴でもやってみたくなった
    • 非公開のメールやテキストメッセージの大きな欠点は、未来の歴史家が読める個人的な書簡が大量に失われてしまうことだ
      Feynmann、Feyeraband、Einsteinらの書簡を集めた本はあるが、今ではほとんどすべてがパスワードの向こう側にあるメールなので、将来の歴史的人物を文脈づける個人的な手紙の山は、ほとんど得られない可能性が高い
    • アートとしては良いが、実用性には疑問がある
      物理コピーが必要ならmicroSDにコピーすればよく、紛失が心配なら3つくらい作ればいい
    • タイトルを見て、まさにそういうものを想像したし、すでにかなり面白そうだと思っていた
      今では似たようなものを自分でもやってみたくなっている
    • 私も、チャット履歴をもとにしたAI生成の犯罪小説が丸ごと出てくる話かと思っていた
  • 自分が作ったライブラリ imessage-exporter が実際に使われているのを見ると嬉しい
    本当に興味深いユースケースだ

    • 最近、新しいメッセージを示す変更を監視して抽出しようとSQLiteファイルを掘っていたが、いくつかの小技で作った初期プロトタイプはだいたい動いていた
      次にこのアイデアを見直すときはそのライブラリに切り替えるつもりで、ほぼリアルタイムのアクセスに関する助言やコツがあれば知りたい
  • 叔母が第二次世界大戦中に祖父母がやり取りした手紙と日記を素晴らしく保存してくれていた
    自分たちの子どもや孫は同じ喜びを味わえないのだろうなと、すぐに思った
    興味があればブログを見てほしい

    • たいていのカップルを考えると、これは少し違うかもしれない
      むしろ「帰りに牛乳を買ってきて」「子どもたちはあなたが迎えに行くんだよね?」「20分後に会おう」みたいなメモを全部保存するのに近い気がする
      それでもそういうものには独特の魅力があるので、水を差すように聞こえなければいいのだけれど
  • イギリス人のために、次はこれをWhatsAppでもできるようにすべきだ
    プロジェクトのアイデアに興奮したが、forkするにはRustを学ばなければならないと気づいた
    とにかく本当に素晴らしいアイデアで、友人とのチャット履歴を読むのはかなりノスタルジックだ

    • このPythonパッケージならWhatsAppバックアップチャットをJSONまたはHTMLにエクスポートできる: https://github.com/KnugiHK/WhatsApp-Chat-Exporter
      Telegramのエクスポートツールへのリンクもある
    • WhatsAppはチャットをtxtにエクスポートできるが、情報の欠落がありそうだ
      たとえば絵文字が残るか確信が持てないし、添付ファイルや音声メッセージは当然含まれないだろう
      バックアップデータベースから抽出するなら暗号化もかかっているはずだ
    • 必要なのはイギリスだけではなく、世界中だ
    • すべてのメッセージとメディアを、現実的に見返せる形式でエクスポートする機能が切実に必要だ
      正直なところ、せめて後で別のデバイスに復元できると確信できるバックアップアーカイブだけでも作れたらと思う
  • 個人メッセージの全履歴を印刷するために出版社へ送るという発想に、少し不安を感じるのは私だけだろうか?

    • 自分の個人メッセージ全履歴を出版社に送ったら、いちばん不安になるのは出版社のほうだと思う
    • 出版社は紙にインクを載せる仕事をしている会社だ
      むしろ、広告や合意形成ツールとして行動を変えることを仕事にしているデータマイニング企業に中間者攻撃されるほうを心配すべきだ
    • 私も不安だ
      筆者がやったことをかなり前から計画していたが、これはまだ解決できていない障害のひとつだ
      家で自分で印刷して製本するのが、おそらく唯一の選択肢で、残っているのは最終成果物を耐久性があり手触りのよいものにする方法だ
    • ファイルが特別安全に保存されていなくても驚かないと思う
      出版社は印刷用PDFの中に個人識別情報が入っているとは想定していなかった可能性が高く、データ保持期間も無期限かもしれない
    • —rot13 スイッチを使ってみるといいかも :-)
  • 人気のない意見かもしれないが、これは少し不気味だ
    そもそも、なぜ人々が個人的な会話記録を保存したがるのか理解できない
    公開投稿やブログと違って、個人メッセージは一時的であるべきだと思う。対面の会話や電話を全部録音するわけではないのだから

    • 興味深いテーマだし、必ずしも少数意見ではないかもしれない
      人によってこの問題の見方はかなり違うようだ
      私は可能な限りすべてのチャット記録を保存したいし、対面の会話や電話も全部録音されて簡単にアクセスできればいいと思っている
      自分を形作っているのは経験の総体だという感覚があるので、その経験を忘れたくない。覚えていないと、どこか自分が自分でなくなるように感じる
      ただ、Black Mirrorのあのエピソードも見ているので、すべての経験を完璧に記憶したい欲求と、忘れられることによる精神的・感情的な利点との間で揺れてしまう
    • 同意する
      ただ私の場合は、昔送ったメッセージが永遠に残っているという事実のほうが、いたたまれない気持ちになる
      10年前の自分は今とはあまりに違うので、昔のメッセージを読むととても気まずく感じる
    • どちらの気持ちもわかる
      2004年ごろまでは実際に手紙で人と連絡を取っていて、特に昔の恋人たちや大学に入ったばかりのころに妹たちが送ってくれた手紙を、何年か後に読み返すのは強いノスタルジーを呼び起こした
      一方で、軍を離れたあと、もっとずっと狭い場所へ引っ越したため、持ち物のほとんどを倉庫に入れ、3年後にも手を付けていないものは不要だと判断して処分した
      そこには古い手紙や写真が全部入っていた気がするが、実際のところそれらが恋しいとは言えない
      人は過去を忘れたくないと言うが、忘れるという現実は、自分が忘れたこと自体に気づかないということなので、いったん忘れてしまえば知覚できる影響はない
      正直、私はすでに十分ノスタルジーに浸っていて、これ以上しがみつくものは必要ないと思う。新しいテレビ番組も見ず、新しい音楽も聴かず、精神的に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ドルはすごい