1 पॉइंट द्वारा GN⁺ 2024-03-08 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • पुराने conversations को सिर्फ search करके दोबारा पढ़ना मुश्किल था, इसलिए सबसे बड़े iMessage conversation को भौतिक किताब में बदल दिया ताकि तारीख के हिसाब से पन्ने पलटे जा सकें
  • iPhone backup के sms.db को SQLite में खोलकर messages निकाले, लेकिन कुछ body text message.text में नहीं बल्कि message.attributedBody के binary blob में था, इसलिए अतिरिक्त processing की जरूरत पड़ी
  • अपना parser बनाने के बजाय Rust के imessage-database crate का इस्तेमाल करके iMessage DB को structured data के रूप में पढ़ा, और केवल एक conversation लाने के लिए SQL को adjust किया
  • किताब का body LaTeX से generate किया गया, और emoji rendering व printing cost की समस्या हल करने के लिए XeLaTeX और Google Noto Emoji black-and-white font का इस्तेमाल किया गया
  • 3 साल के messages 6" x 9" format में करीब 1,300 pages बने, इसलिए उन्हें 3 volumes में बांटा गया, और Barnes & Noble Press से shipping सहित 30 डॉलर में print किया गया

iMessage को किताब क्यों बनाया

  • अतीत की किसी खास घटना को याद करते समय text message history अक्सर clue बनती है
  • iPhone में पूरे iMessage history की search तेज हो गई है, लेकिन उपयोगी तरीके से इस्तेमाल करने के लिए जिस message को ढूंढ रहे हैं उसकी ठीक-ठीक wording का कुछ हिस्सा याद होना चाहिए
  • Search result से पुराने conversation में जाकर आसपास का context देखने की कोशिश करें तो scroll loading बहुत धीमी होती है
  • किसी खास तारीख पर सीधे जाने का feature नहीं है, इसलिए conversation को किसी random point से किताब की तरह पलटकर देखने का experience खुद बनाने का फैसला किया

iPhone backup से messages निकालना

  • Messages को process करने के लिए पहले data को iPhone से बाहर निकालना जरूरी था
  • iPhone Wiki के मुताबिक iPhone backup से sms.db निकालने पर messages को SQLite database के रूप में handle किया जा सकता है
  • Mac Finder से standard backup बनाने के बाद backup folder खोलने पर root में hexadecimal byte names वाली directories दिखती हैं
  • sms.db filename iPhone Wiki में दिया गया 3d0d7e5fb2ce288813306e4d4636395e047a3d28 था, और इसे imessage.db के रूप में copy करके sqlite3 CLI से खोला जा सका
  • DB में message, attachment, chat, handle, chat_message_join जैसी tables थीं

SQL query और body extraction की समस्या

  • असली conversation निकालने के लिए message, chat_message_join, chat tables को join करना पड़ा
  • किसी खास chat_identifier के आधार पर date order में messages query करने पर कुछ messages का body खाली था
  • खाली दिखने वाले कुछ messages message.text में नहीं बल्कि message.attributedBody column के encoded NSMutableAttributedString binary blob में stored थे
  • sqlite3 से binary को hex में निकालकर xxd से check करने पर दिखा कि CVS text content वास्तव में मौजूद था
  • Binary format parser खुद implement करने के बजाय imessage-database crate का इस्तेमाल किया
    • यह crate iMessage database पढ़कर Rust data structures के रूप में output देता है
    • साथ आने वाला imessage-exporter binary conversations को text या HTML में generate कर सकता है
    • सिर्फ एक conversation तक सीमित करके लाने के लिए library के SQL statement में थोड़ा बदलाव किया

LaTeX से किताब का body बनाना

  • लक्ष्य HTML या text file नहीं, बल्कि हाथ में लेकर पलटी जा सकने वाली भौतिक किताब था, इसलिए output target के रूप में LaTeX चुना गया
  • LaTeX का text-based source templates और automatic generation के लिए अच्छा fit है, इसलिए हर message को LaTeX code के रूप में export करने का तरीका इस्तेमाल किया गया
  • शुरुआती rendering simple form से शुरू हुई
    • मेरे भेजे messages को left, और दूसरे व्यक्ति के messages को right align किया
    • जहां image थी वहां attachment संकेत text डाला
    • reactions और replies जैसे render करने में झंझट वाले elements skip किए
    • तारीख के आधार पर chapters बांटे और visual तौर पर थोड़ा adjust किया

emoji और XeLaTeX handling

  • सामान्य LaTeX unicode support नहीं करता, इसलिए emoji वाला range render करने पर compiler fail हो गया
  • emoji हटाए भी जा सकते थे, लेकिन modern communication में emoji महत्वपूर्ण हैं, इसलिए उन्हें exclude नहीं किया
  • XeLaTeX पर switch करके unicode font support का इस्तेमाल किया
  • Generated LaTeX source में हर emoji को {\emojifont X} form में wrap किया, और \emojifont को emoji font के रूप में specify करके inline emoji rendering सफल की
  • Color printing cost से बचने के लिए Google Noto Emoji का black-and-white emoji font इस्तेमाल किया
  • हर message में \markright LaTeX command जोड़ा, ताकि header current date के साथ follow करे

1,300 pages को 3 volumes में बांटना

  • 3 साल के messages को standard 6" x 9" page size में compile करने पर 1,000 pages से काफी ज्यादा का PDF बना
  • Target period ठीक 3 साल था, इसलिए पूरे content को 3 volumes में बांटकर हर volume को printable size में घटाया गया
  • Final length कुल मिलाकर करीब 1,300 pages थी

Barnes & Noble Press से printing

  • कई printing options देखने के बाद Barnes and Noble Press चुना गया
  • Lulu या Amazon KDP जैसे दूसरे options से थोड़ा महंगा था, लेकिन personal book print करते समय किताब को “publish” न करना पड़े, यह बात ज्यादा suitable थी
  • तीन volumes, कुल करीब 1,300 pages, shipping सहित 30 डॉलर में print हो सके
  • Body PDF upload करने पर B&N Press site ने cover के लिए जरूरी dimensions generate किए, और इन dimensions के हिसाब से Inkscape में हर volume का cover बनाया गया
  • B&N Press website कुल मिलाकर बहुत slow थी, और order के दौरान payment page 24 घंटे से ज्यादा समय तक नहीं खुलने की समस्या आई
  • समस्या ठीक होने के बाद order आगे बढ़ा, और कुछ हफ्तों बाद तीनों physical books मिल गईं
  • Physical book की तरह पन्ने पलटकर देखना, phone पर पुरानी conversations फिर से खोजने की तुलना में कहीं ज्यादा आसान था

खुद बनाकर देखें

  • Source code की स्थिति अभी rough है और इसे Cargo binary के रूप में package नहीं किया गया है, लेकिन code बहुत ज्यादा नहीं है
  • Project code bkettle/message-book पर public है

1 टिप्पणियां

 
GN⁺ 2024-03-08
Hacker News की राय
  • मुझे यह बात बहुत पसंद आई कि हमें निजी पत्राचार का भौतिक रिकॉर्ड ज्यादा छोड़ना चाहिए
    शीर्षक देखकर लगा था कि यह संदेशों के इतिहास के आधार पर LLM द्वारा घटनाओं की कथा बनाने की कहानी होगी, और ऐसा कुछ service के रूप में बनाया जाए तो बढ़िया लगेगा

    • मैंने भी यही सोचा था, लेकिन असली कहानी कहीं बेहतर निकली
      अब अपने Telegram chat history के साथ भी यह आजमाने का मन हो रहा है
    • निजी emails और text messages की बड़ी कमी यह है कि भविष्य के इतिहासकारों के लिए उपलब्ध निजी पत्राचार बहुत बड़े पैमाने पर गायब हो जाएगा
      Feynmann, Feyeraband, Einstein आदि के पत्रों के संग्रह वाली किताबें हैं, लेकिन अब लगभग सब कुछ password के पीछे छिपे email में है, इसलिए भविष्य की ऐतिहासिक हस्तियों को संदर्भित करने के लिए निजी पत्रों के ढेर मिलने की संभावना बहुत कम है
    • कला के रूप में अच्छा है, लेकिन उपयोगिता पर संदेह है
      अगर physical copy चाहिए तो microSD पर copy कर सकते हैं, और खोने की चिंता हो तो तीन-चार बना लें
    • शीर्षक देखकर मैंने ठीक यही कल्पना की थी, और पहले से ही सोच रहा था कि यह काफी दिलचस्प होगा
      अब कुछ मिलता-जुलता खुद करके देखने का मन हो रहा है
    • मुझे भी लगा था कि chat history के आधार पर पूरी AI-generated crime novel बनने वाली कहानी होगी
  • मेरी बनाई library imessage-exporter को असल में इस्तेमाल होते देखना अच्छा है
    सचमुच दिलचस्प use case है

    • हाल ही में मैं नए messages को दर्शाने वाले बदलावों को watch और extract करने के लिए SQLite file में digging कर रहा था, और कुछ hacks से बना शुरुआती prototype ज्यादातर काम कर रहा था
      अगली बार इस idea पर लौटूंगा तो उस library पर switch करने का सोच रहा हूं, और near-real-time access को लेकर कोई सलाह या tips हों तो जानना चाहूंगा
  • मेरी मौसी ने द्वितीय विश्व युद्ध के दौरान मेरे दादा-दादी के बीच हुए पत्रों और diaries को बहुत अच्छी तरह संजोकर रखा है
    तुरंत यह ख्याल आया कि हमारे बच्चे और पोते-पोतियां वही खुशी नहीं ले पाएंगे
    दिलचस्पी हो तो blog देख सकते हैं

    • ज्यादातर couples के बारे में सोचें तो यह थोड़ा अलग हो सकता है
      यह तो ज्यादा “घर आते हुए दूध ले आना”, “बच्चों को तुम ही लेने जा रहे हो न?”, “20 मिनट में मिलते हैं” जैसे सारे notes संजोने जैसा लगता है
      फिर भी इसमें अपनी अलग charm है, इसलिए उम्मीद है यह बहुत ज्यादा उत्साह ठंडा करने जैसा नहीं लगेगा
  • अब ब्रिटिश लोगों के लिए इसे WhatsApp पर भी काम कराने की बारी है
    project idea से उत्साहित हुआ, फिर समझ आया कि fork करने के लिए Rust सीखनी पड़ेगी
    वैसे भी सच में शानदार idea है, और दोस्तों के साथ chat history पढ़ना काफी nostalgic होता है

    • यह Python package WhatsApp backup chats को JSON या HTML में export कर सकता है: https://github.com/KnugiHK/WhatsApp-Chat-Exporter
      Telegram export tool भी link किया गया है
    • WhatsApp chats को txt में export कर सकता है, लेकिन लगता है कुछ loss होगा
      जैसे, पक्का नहीं कि emoji बचे रहेंगे या नहीं, और attachments या voice messages तो जाहिर है छूट जाएंगे
      backup database से extract करना हो तो encryption भी होगी
    • सिर्फ UK नहीं, पूरी दुनिया को इसकी जरूरत है
    • सभी messages और media को reasonably review किए जा सकने वाले format में export करने की क्षमता की सख्त जरूरत है
      सच कहूं तो कम से कम ऐसा backup archive ही बना पाऊं जिस पर भरोसा हो कि बाद में किसी दूसरी device पर restore किया जा सके, तो भी अच्छा होगा
  • क्या सिर्फ मुझे ही निजी messages का पूरा इतिहास print कराने के लिए publisher को भेजने का idea थोड़ा बेचैन करने वाला लगता है?

    • अगर मैं अपने निजी messages का पूरा इतिहास publisher को भेजूं, तो सबसे ज्यादा बेचैन शायद publisher ही होगा
    • publisher का business कागज पर ink डालना है
      बल्कि ज्यादा चिंता उस data mining company द्वारा man-in-the-middle attack की होनी चाहिए जिसका काम ads या consensus-building tools के जरिए व्यवहार बदलना है
    • मुझे भी बेचैनी होती है
      लेखक ने जो किया, मैं काफी समय से वैसा करने की planning कर रहा हूं, और यह उन hurdles में से एक है जिसे अभी तक solve नहीं कर पाया
      घर पर खुद print और bind करना शायद इकलौता option होगा, और अब बस यह बचता है कि final result को durable और हाथ में अच्छा महसूस होने वाला कैसे बनाया जाए
    • अगर files खास तौर पर सुरक्षित तरीके से store न की जाती हों तो मुझे हैरानी नहीं होगी
      publisher ने शायद उम्मीद नहीं की होगी कि print-ready PDF में personally identifiable information होगी, और data retention अवधि भी indefinite हो सकती है
    • —rot13 switch आजमाया जा सकता है शायद :-)
  • यह unpopular thought हो सकता है, लेकिन यह थोड़ा creepy है
    मुझे समझ नहीं आता कि लोग शुरू में ही निजी बातचीत के records क्यों रखना चाहेंगे
    सार्वजनिक posts या blogs के उलट, private messages temporary होने चाहिए। हम आमने-सामने की बातचीत या phone calls पूरी record नहीं करते

    • दिलचस्प विषय है, और जरूरी नहीं कि यह unpopular thought ही हो
      लगता है लोग इस मुद्दे को अलग-अलग तरह से देखते हैं
      मैं संभव हर chat history को preserve करने की कोशिश करता हूं, और चाहता हूं कि आमने-सामने की बातचीत और phone calls भी पूरी record होकर आसानी से accessible हों
      मुझे यह एहसास है कि मेरे experiences का कुल योग ही मैं हूं, इसलिए उन experiences को भूलना नहीं चाहता। याद न रहे तो कहीं न कहीं लगता है कि मैं अपने आप से कम हो गया हूं
      हालांकि मैंने Black Mirror का वह episode भी देखा है, इसलिए हर experience को perfectly याद रखने की इच्छा और भूल पाने से मिलने वाले मानसिक व भावनात्मक फायदे के बीच conflict रहता है
    • सहमत हूं
      हालांकि मेरे मामले में यह बात ज्यादा cringe कराती है कि मेरे पुराने भेजे हुए messages हमेशा के लिए बचे हुए हैं
      10 साल पहले का मैं आज से इतना अलग था कि पुराने messages पढ़ना बहुत awkward लगता है
    • दोनों पक्ष समझ आते हैं
      करीब 2004 तक मैं लोगों से असली letters के जरिए संपर्क में रहता था, और खासकर पुरानी girlfriends या जब मैं पहली बार college गया था तब छोटी बहनों के भेजे letters को कुछ साल बाद पढ़ना बहुत nostalgic था
      दूसरी तरफ, सेना छोड़ने के बाद मैं बहुत छोटी जगह में शिफ्ट हुआ, तो ज्यादातर सामान storage में रख दिया, और 3 साल बाद भी जिन चीजों को नहीं छुआ था उन्हें गैरजरूरी मानकर storage facility को दे दिया
      लगता है उनमें सारे पुराने letters और photos भी शामिल थे, लेकिन सच कहूं तो मैं नहीं कह सकता कि मुझे वे चीजें याद आती हैं
      लोग कहते हैं कि वे past भूलना नहीं चाहते, लेकिन भूलने की हकीकत यह है कि आपको पता ही नहीं होता कि आप भूल चुके हैं, इसलिए एक बार भूल जाने पर कोई perceivable impact नहीं रहता
      ईमानदारी से कहूं तो मैं पहले ही nostalgia में काफी डूबा हूं, और पकड़कर रखने के लिए और चीजों की जरूरत नहीं है। नए TV programs नहीं देखता, नया music नहीं सुनता, और मानसिक रूप से 1999 में अटका हुआ लगता हूं; यह healthy है या नहीं, पता नहीं
    • private messages आमने-सामने की बातचीत या phone calls नहीं हैं
      ज्यादा सही तुलना उन letters से है जो लंबे समय तक टिकते हैं
    • मैं यह assume नहीं करता कि ये चीजें private या temporary हैं
      messages एक कहानी बनाते हैं, और हमारी पीढ़ी की zeitgeist को समेटे होते हैं
      लगता है लोगों ने अभी इस बारे में ज्यादा नहीं सोचा कि ऐसी चीजों को कैसे preserve किया जाए
      निजी तौर पर मुझे यह idea पसंद है, और मैं कल्पना कर सकता हूं कि अपनी मां के साथ हुए सारे या कुछ messages export करके उस समय की याद के रूप में रखूं
  • सच में शानदार है, और किसी प्रिय व्यक्ति को देने के लिए बढ़िया gift भी हो सकता है
    हाल ही में Nomic Atlas(https://docs.nomic.ai/) इस्तेमाल करते हुए मैंने अपनी काफी chat history इसमें डाली, और messages को topic-wise clusters में visualize और explore करना काफी दिलचस्प था
    इसलिए लगा कि messages के embeddings generate करके और topic modeling चलाकर digital की searchability को physical format में लाया जा सकता है
    फिर असली किताब के अंत में topic-wise index बनाया जा सकता है, और उन pages के नंबर reference के रूप में दिए जा सकते हैं जहां उस topic के messages हैं

  • Mac पर iMessage export करने वाली Python script: https://pypi.org/project/imessage-reader/

  • 2000 साल बाद, 21वीं सदी के लोग कैसे रहते थे इसका अध्ययन करते समय शायद ऐसी किताबें ही बची होंगी
    tweets, chats, SMS, emails, निजी devices की digital photos जैसी ephemeral information सब गायब हो चुकी हो सकती है

  • personal use के लिए BN Press के बारे में नहीं जानता था
    KDP और Lulu को थोड़ा देखा था, लेकिन Kindle इस्तेमाल करके पसंद आने के बाद मैंने ebooks को main focus बनाने का फैसला किया
    limited या experimental printing के लिए BN Press शानदार लगता है, और 1300 pages के लिए 30 dollars कमाल है