ซีรีส์หนังสือที่สร้างอัตโนมัติจาก iMessage ตลอด 3 ปี
(benkettle.xyz)- เมื่อค้นหาแล้วก็ยังอ่านบทสนทนาเก่า ๆ ย้อนกลับได้ยาก จึงแปลงบทสนทนา iMessage ที่ยาวที่สุดให้เป็น หนังสือจริง เพื่อให้เปิดไล่ดูตามวันที่ได้
- เปิด
sms.dbจากแบ็กอัป iPhone ด้วย SQLite เพื่อดึงข้อความออกมา แต่เนื้อหาบางส่วนไม่ได้อยู่ในmessage.textแต่อยู่ใน binary blob ของmessage.attributedBodyจึงต้องมีขั้นตอนประมวลผลเพิ่มเติม - แทนที่จะเขียน parser เอง ได้ใช้ crate imessage-database ของ Rust เพื่ออ่านฐานข้อมูล iMessage เป็นข้อมูลแบบมีโครงสร้าง และปรับ SQL ให้ดึงมาเฉพาะบทสนทนาเดียว
- เนื้อหาในหนังสือสร้างด้วย LaTeX และเพื่อแก้ปัญหาการเรนเดอร์อีโมจิกับต้นทุนการพิมพ์ จึงใช้ XeLaTeX และฟอนต์ขาวดำ Google Noto Emoji
- ข้อความตลอด 3 ปีมีความยาวราว 1,300 หน้าในขนาด 6" x 9" จึงถูกแบ่งเป็น 3 เล่ม และพิมพ์ผ่าน Barnes & Noble Press ได้ในราคา 30 ดอลลาร์ รวมค่าส่ง
ทำไมถึงทำ iMessage ให้เป็นหนังสือ
- เวลานึกย้อนถึงเหตุการณ์เฉพาะในอดีต บันทึกข้อความมักเป็นเบาะแสสำคัญ
- แม้ว่าการค้นหาประวัติ iMessage ทั้งหมดบน iPhone จะเร็วขึ้นแล้ว แต่ถ้าจะใช้งานให้ได้ผล ก็ยังต้องจำ บางส่วนของถ้อยคำที่แน่นอน ในข้อความที่หาอยู่
- เมื่อกดจากผลการค้นหาเข้าไปดูบทสนทนาเก่าเพื่อดูบริบทรอบข้าง การโหลดแบบเลื่อนหน้าจอช้ามาก
- เพราะไม่มีฟังก์ชันให้กระโดดไปยังวันที่ที่ต้องการได้ทันที จึงตัดสินใจสร้าง ประสบการณ์แบบเปิดพลิกเหมือนหนังสือ จากบทสนทนาด้วยตัวเอง
ดึงข้อความออกจากแบ็กอัป iPhone
- หากจะนำข้อความไปประมวลผล ก่อนอื่นต้องดึงข้อมูลออกมาจาก iPhone ให้ได้
- ตามข้อมูลใน iPhone Wiki ถ้านำ
sms.dbออกจากแบ็กอัป iPhone มาได้ ก็จะสามารถจัดการข้อความผ่านฐานข้อมูล SQLite ได้ - หลังจากสร้างแบ็กอัปมาตรฐานด้วย Finder บน Mac แล้วเปิดโฟลเดอร์แบ็กอัป จะพบไดเรกทอรีที่ชื่อเป็นไบต์เลขฐานสิบหกอยู่ที่ระดับราก
- ชื่อไฟล์
sms.dbตามที่ iPhone Wiki ระบุคือ3d0d7e5fb2ce288813306e4d4636395e047a3d28และสามารถคัดลอกออกมาเป็นimessage.dbแล้วเปิดด้วย CLI ของsqlite3ได้ - ใน DB มีตารางอย่าง
message,attachment,chat,handle,chat_message_join
ปัญหาในการ query ด้วย SQL และการดึงเนื้อหาข้อความ
- หากต้องการดึงบทสนทนาจริงออกมา จำเป็นต้อง join ตาราง
message,chat_message_join,chat - เมื่อ query ข้อความตามลำดับวันที่โดยอิง
chat_identifierของแชตที่ต้องการ พบว่าข้อความบางรายการไม่มีเนื้อหา - ข้อความบางส่วนที่ดูเหมือนว่างนั้น ไม่ได้เก็บไว้ใน
message.textแต่เก็บเป็น NSMutableAttributedString แบบเข้ารหัสอยู่ในคอลัมน์ binary blob ของmessage.attributedBody - เมื่อนำข้อมูลไบนารีออกจาก
sqlite3เป็น hex แล้วตรวจด้วยxxdก็เห็นได้ว่ามีเนื้อหาตัวอักษรจริงอยู่ภายใน - แทนที่จะลงมือเขียน parser สำหรับฟอร์แมตไบนารีนี้เอง จึงใช้ crate imessage-database
- crate นี้สามารถอ่านฐานข้อมูล iMessage แล้วแปลงออกมาเป็นโครงสร้างข้อมูลของ Rust
- ไบนารี
imessage-exporterที่มาพร้อมกันสามารถสร้างบทสนทนาออกมาเป็นข้อความหรือ HTML ได้ - มีการปรับแต่งคำสั่ง SQL ของไลบรารีเล็กน้อย เพื่อให้ดึงมาเฉพาะบทสนทนาเดียว
สร้างเนื้อหาหนังสือด้วย LaTeX
- เป้าหมายไม่ใช่ HTML หรือไฟล์ข้อความ แต่เป็น หนังสือจริง ที่ถือและเปิดอ่านได้ จึงเลือกให้ผลลัพธ์เป็น LaTeX
- ซอร์สแบบข้อความของ LaTeX เหมาะกับเทมเพลตและการสร้างอัตโนมัติ จึงใช้วิธีส่งออกแต่ละข้อความให้เป็นโค้ด LaTeX
- การเรนเดอร์ช่วงแรกเริ่มจากรูปแบบง่าย ๆ
- ข้อความที่ส่งเองจัดชิดซ้าย ข้อความของอีกฝ่ายจัดชิดขวา
- ตำแหน่งที่มีรูปภาพจะใส่ข้อความระบุว่าเป็นไฟล์แนบ
- องค์ประกอบที่เรนเดอร์ยุ่งยาก เช่น reaction และ reply ถูกข้ามไป
- แบ่ง chapter ตามวันที่และปรับหน้าตาเล็กน้อย
การจัดการอีโมจิและ XeLaTeX
- LaTeX แบบปกติไม่รองรับ unicode ดังนั้นเมื่อเรนเดอร์จนถึงช่วงที่มีอีโมจิ คอมไพเลอร์จะล้มเหลว
- แม้จะสามารถลบอีโมจิออกได้ แต่เห็นว่าอีโมจิมีความสำคัญต่อการสื่อสารยุคใหม่ จึงไม่ตัดทิ้ง
- จึงเปลี่ยนไปใช้ XeLaTeX เพื่อใช้ความสามารถด้านฟอนต์ unicode
- ในซอร์ส LaTeX ที่สร้างขึ้น จะครอบอีโมจิแต่ละตัวให้อยู่ในรูป
{\\emojifont X}และกำหนด\\emojifontให้เป็นฟอนต์อีโมจิ ทำให้เรนเดอร์อีโมจิ inline ได้สำเร็จ - เพื่อหลีกเลี่ยงต้นทุนการพิมพ์สี จึงใช้ฟอนต์อีโมจิ ขาวดำ Noto Emoji ของ Google
- ใส่คำสั่ง LaTeX
\\markrightในแต่ละข้อความ เพื่อให้ส่วนหัวแสดงวันที่ปัจจุบันตามเนื้อหา
แบ่ง 1,300 หน้าออกเป็น 3 เล่ม
- เมื่อคอมไพล์ข้อความ 3 ปีในขนาดหน้ามาตรฐาน 6" x 9" ก็ได้ PDF ที่ยาวเกิน 1,000 หน้าไปมาก
- เนื่องจากช่วงเวลาที่นำมาทำมีความยาวครบ 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 ช้ามาก และระหว่างสั่งซื้อยังมีปัญหาที่หน้า checkout เปิดไม่ขึ้นนานเกิน 24 ชั่วโมง
- หลังจากปัญหาได้รับการแก้ไข คำสั่งซื้อจึงดำเนินต่อ และไม่กี่สัปดาห์ต่อมาก็ได้รับหนังสือจริงทั้ง 3 เล่ม
- การเปิดไล่ดูแบบหนังสือจริงนั้น ง่ายกว่าการย้อนหาบทสนทนาเก่าบนโทรศัพท์มาก
ลองทำเองได้
- ซอร์สโค้ดยังจัดระเบียบได้ไม่เรียบร้อยนัก และยังไม่ได้แพ็กเป็น Cargo binary แต่ปริมาณโค้ดไม่ได้มาก
- โค้ดของโปรเจกต์เผยแพร่อยู่ที่ bkettle/message-book
1 ความคิดเห็น
ความเห็นใน Hacker News
ชอบมากตรงที่มันชี้ให้เห็นว่าเราควรเก็บ บันทึกทางกายภาพ ของจดหมายส่วนตัวไว้ให้มากกว่านี้
ตอนเห็นแค่พาดหัวก็นึกว่าจะเป็นเรื่องที่ LLM สร้างเรื่องเล่าของเหตุการณ์จากประวัติข้อความ และคิดว่าถ้าทำเป็นบริการก็น่าจะเจ๋งดี
ตอนนี้เลยอยากลองทำกับ ประวัติแชต Telegram ของตัวเองบ้าง
มีหนังสือรวมจดหมายของ Feynmann, Feyeraband, Einstein และคนอื่น ๆ แต่ทุกวันนี้แทบทุกอย่างกลายเป็นอีเมลที่อยู่หลังรหัสผ่าน จึงมีโอกาสสูงมากที่เราจะไม่ได้กองจดหมายส่วนตัวไว้ใช้ทำความเข้าใจบุคคลสำคัญทางประวัติศาสตร์ในอนาคต
ถ้าต้องการสำเนาจริง ๆ ก็แค่คัดลอกลง microSD และถ้ากลัวหายก็ทำไว้สักสามชุด
ตอนนี้กลับอยากลองทำอะไรคล้าย ๆ กันด้วยตัวเอง
เจ๋งมากที่ได้เห็นไลบรารีที่ฉันทำ imessage-exporter ถูกนำไปใช้งานจริง
เป็นกรณีใช้งานที่น่าสนใจมาก
รอบหน้าถ้ากลับมาดูไอเดียนี้อีก ฉันตั้งใจจะเปลี่ยนไปใช้ไลบรารีนั้น และถ้ามีคำแนะนำหรือทิปเกี่ยวกับการเข้าถึงแบบเกือบเรียลไทม์ก็อยากรู้เหมือนกัน
ป้าของฉันเก็บรักษาจดหมายและไดอารีที่คุณตากับคุณยายเขียนถึงกันในช่วงสงครามโลกครั้งที่ 2 ไว้อย่างยอดเยี่ยม
สิ่งแรกที่ผุดขึ้นมาในหัวคือ ลูก ๆ และหลาน ๆ ของเราคงไม่ได้มีความสุขแบบเดียวกัน
ถ้าสนใจลองดู บล็อก ได้
มันน่าจะใกล้เคียงกับการเก็บ กระดาษโน้ต ทุกใบที่เขียนว่า “ขากลับซื้อ นมมาด้วย”, “เธอไปรับเด็ก ๆ ใช่ไหม?”, “เจอกันอีก 20 นาที” มากกว่า
ถึงอย่างนั้นมันก็มีเสน่ห์ในแบบของมัน หวังว่าจะไม่ฟังเหมือนตั้งใจมาดับอารมณ์
ถึงเวลาแล้วที่จะทำสิ่งนี้ให้ใช้กับ WhatsApp ได้ด้วยสำหรับชาวอังกฤษ
ตอนแรกตื่นเต้นกับไอเดียโปรเจกต์นี้มาก ก่อนจะรู้ว่าถ้าจะฟอร์กก็คงต้องไปเรียน Rust
แต่ยังไงก็ตาม เป็นไอเดียที่เจ๋งมากจริง ๆ และการอ่านประวัติแชตกับเพื่อน ๆ ก็ชวนให้คิดถึงวันเก่า ๆ มาก
มีลิงก์ไปยังเครื่องมือส่งออก Telegram ด้วย
เช่น ไม่แน่ใจว่าอีโมจิจะยังอยู่หรือเปล่า และไฟล์แนบหรือข้อความเสียงก็คงหายแน่นอน
ถ้าจะดึงจากฐานข้อมูลสำรองก็น่าจะมีการเข้ารหัสอยู่ด้วย
เอาจริง ๆ แค่มี คลังสำรองข้อมูล ที่มั่นใจได้ว่าสามารถกู้กลับไปยังอุปกรณ์อื่นได้ในภายหลังก็ยังดี
มีแค่ฉันหรือเปล่าที่รู้สึกกังวลนิด ๆ กับไอเดียส่งประวัติข้อความส่วนตัวทั้งหมดไปให้สำนักพิมพ์เพื่อพิมพ์?
สิ่งที่ควรกังวลกว่าคือการถูกโจมตีแบบ man-in-the-middle โดย บริษัททำเหมืองข้อมูล ที่มีหน้าที่เปลี่ยนพฤติกรรมคนผ่านโฆษณาหรือเครื่องมือสร้างฉันทามติ
ฉันวางแผนจะทำแบบที่ผู้เขียนทำมาค่อนข้างนานแล้ว และนี่ก็เป็นหนึ่งในอุปสรรคที่ยังแก้ไม่ได้
การพิมพ์และเข้าเล่มเองที่บ้านน่าจะเป็นทางเลือกเดียว และตอนนี้สิ่งที่เหลือคือจะทำอย่างไรให้ผลงานสุดท้ายทนทานและจับแล้วรู้สึกดี
มีโอกาสมากที่สำนักพิมพ์จะไม่คาดคิดว่าใน PDF สำหรับพิมพ์จะมี ข้อมูลระบุตัวตนส่วนบุคคล อยู่ และระยะเวลาเก็บข้อมูลก็อาจยาวไปแบบไม่มีกำหนด
—rot13ดู :-)อาจเป็นความเห็นที่ไม่ค่อยมีคนชอบ แต่ฉันว่ามันแอบหลอนนิด ๆ
ตั้งแต่แรกก็ไม่เข้าใจว่าทำไมคนถึงอยากเก็บบันทึกบทสนทนาส่วนตัวไว้
ต่างจากโพสต์สาธารณะหรือบล็อก ข้อความส่วนตัว ควรเป็นของชั่วคราว เพราะเราไม่ได้อัดเสียงบทสนทนาแบบเจอหน้าหรือโทรศัพท์ไว้ทั้งหมดนี่
ดูเหมือนแต่ละคนจะมองเรื่องนี้ต่างกัน
สำหรับฉัน ฉันพยายามเก็บประวัติแชตทุกอย่างที่ทำได้ และก็อยากให้บทสนทนาแบบเจอหน้าและการคุยโทรศัพท์ถูกบันทึกทั้งหมดและเข้าถึงได้ง่ายด้วย
ฉันมีความรู้สึกว่าผลรวมของประสบการณ์ทั้งหมดคือสิ่งที่เป็นตัวฉัน ดังนั้นจึงไม่อยากลืมประสบการณ์เหล่านั้น ถ้าจำไม่ได้ก็เหมือนตัวฉันหายไปบางส่วน
แต่ฉันก็เคยดูตอนนั้นของ Black Mirror เหมือนกัน เลยรู้สึกขัดแย้งระหว่างความอยากจดจำทุกประสบการณ์ให้สมบูรณ์แบบ กับประโยชน์ทางจิตใจและอารมณ์ที่มาจากการสามารถลืมได้
แต่สำหรับฉัน สิ่งที่น่าอายยิ่งกว่าคือการรู้ว่าข้อความที่เคยส่งไว้ยังคงอยู่ตลอดไป
ตัวฉันเมื่อ 10 ปีก่อน ต่างจากตอนนี้มาก จนเวลาอ่านข้อความเก่า ๆ แล้วรู้สึกกระอักกระอ่วนมาก
จนถึงราวปี 2004 ฉันยังติดต่อกับผู้คนด้วยจดหมายจริงอยู่ และการกลับไปอ่านจดหมายที่โดยเฉพาะแฟนเก่าหรือพี่สาวน้องสาวที่ส่งมาตอนฉันเข้าเรียนมหาวิทยาลัยใหม่ ๆ หลังจากนั้นหลายปี เป็นเรื่องที่ชวนให้คิดถึงอดีตอย่างมาก
ในทางกลับกัน หลังออกจากกองทัพฉันย้ายไปอยู่ที่เล็กลงมาก จึงเอาของส่วนใหญ่ไปเก็บในคลัง และตัดสินใจว่าของที่ผ่านไป 3 ปีแล้วยังไม่ได้แตะก็ไม่จำเป็น เลยยกให้ที่เก็บของไป
ดูเหมือนในนั้นจะมีจดหมายเก่าและรูปถ่ายทั้งหมดรวมอยู่ด้วย แต่ฉันก็พูดไม่ได้จริง ๆ ว่าคิดถึงของพวกนั้น
คนชอบพูดว่าไม่อยากลืมอดีต แต่ความจริงของการลืมคือคุณไม่รู้ตัวว่าตัวเองลืมไปแล้ว ดังนั้นพอลืมไปจริง ๆ มันก็ไม่มีผลกระทบที่รับรู้ได้
พูดตามตรง ฉันจมอยู่กับความคิดถึงอดีตมากพอแล้ว และไม่คิดว่าต้องมีอะไรไว้ยึดติดมากกว่านี้ ฉันไม่ดูรายการทีวีใหม่ ๆ ไม่ฟังเพลงใหม่ ๆ และเหมือนติดค้างอยู่ในปี 1999 ทางความคิด ซึ่งก็ไม่แน่ใจว่าสุขภาพจิตดีไหม
สิ่งที่เทียบได้ใกล้เคียงกว่าคือ จดหมาย ที่คงอยู่ได้นาน
ข้อความต่าง ๆ ร้อยเรียงเป็นเรื่องราวหนึ่งเรื่อง และบันทึก จิตวิญญาณแห่งยุคสมัย ของคนรุ่นเราไว้
ดูเหมือนผู้คนยังไม่ได้คิดกันมากพอว่าจะเก็บรักษาสิ่งเหล่านี้อย่างไร
ส่วนตัวฉันชอบไอเดียนี้ และนึกภาพออกเลยว่าตัวเองจะส่งออกข้อความทั้งหมดหรือบางส่วนที่คุยกับแม่ เพื่อเก็บไว้เป็นความทรงจำของช่วงเวลานั้น
เจ๋งมากจริง ๆ และดูเหมือนจะเป็นของขวัญที่ยอดเยี่ยมสำหรับคนที่คุณรักได้ด้วย
ช่วงนี้ฉันลองใช้ Nomic Atlas(https://docs.nomic.ai/) และใส่ประวัติแชตของตัวเองเข้าไปเยอะพอสมควร พบว่าการทำภาพแสดงกลุ่มตามหัวข้อของข้อความแล้วไล่ดูนั้นน่าสนใจมาก
เลยคิดว่าถ้าสร้าง embedding ของข้อความแล้วทำ topic modeling ก็อาจดึงความสามารถในการค้นหาของโลกดิจิทัลมาใส่ในรูปแบบกายภาพได้
แบบนั้นก็สามารถทำดัชนีตามหัวข้อไว้ท้ายเล่มจริง ๆ และใส่เลขหน้าอ้างอิงไปยังหน้าที่มีข้อความในหัวข้อนั้นได้
สคริปต์ Python สำหรับส่งออก iMessage บน Mac: https://pypi.org/project/imessage-reader/
อีก 2000 ปีข้างหน้า ตอนที่มีคนศึกษาว่าผู้คนในศตวรรษที่ 21 ใช้ชีวิตกันอย่างไร อาจเหลือเพียงหนังสือแบบนี้เท่านั้น
ข้อมูลชั่วคราว อย่างทวีต แชต SMS อีเมล และรูปดิจิทัลในอุปกรณ์ส่วนตัว อาจหายไปหมดแล้ว
เพิ่งรู้ว่ามี BN Press สำหรับใช้งานส่วนบุคคล
ฉันเคยดู KDP กับ Lulu มาบ้าง แต่หลังจากได้ลองใช้ Kindle แล้วชอบมันมาก ก็เลยตัดสินใจโฟกัสหลักไปที่อีบุ๊ก
แต่ถ้าเป็นงานพิมพ์จำนวนจำกัดหรือทดลองพิมพ์ BN Press ก็ดูยอดเยี่ยมมาก และ 1300 หน้าในราคา 30 ดอลลาร์นี่น่าทึ่งจริง ๆ