Topic 21 การจัดการ Text

Pragmatic Programmer จัดการกับ Text เหมือนกับที่ช่างไม้ขึ้นรูปไม้นั่นแหละครับ ในหัวข้อก่อนหน้านี้เราพูดถึงเครื่องมือเฉพาะทางที่เราใช้ไปแล้ว—Shell, Editor, Debugger—ซึ่งก็เหมือนกับสิ่ว เลื่อย และกบไสไม้ของช่างไม้ เครื่องมือที่ถูกออกแบบมาให้ทำงานหนึ่งหรือสองอย่างได้ดีเป็นพิเศษ แต่ก็มีบางครั้งที่เราต้องทำ Transformation บางอย่างที่ชุดเครื่องมือพื้นฐานจัดการไม่ได้ง่าย ๆ เราจึงต้องการเครื่องมือจัดการ Text แบบอเนกประสงค์

ภาษาสำหรับจัดการ Text มีความสัมพันธ์กับการเขียนโปรแกรม เหมือนกับที่ Router [28] มีความสัมพันธ์กับงานไม้ มันทั้งเสียงดัง ยุ่งเหยิง และค่อนข้างเป็นวิธีที่ดิบเถื่อน ทำผิดพลาดกับมันเมื่อไหร่ ชิ้นงานทั้งชิ้นอาจพังได้เลย บางคนถึงกับยืนยันว่ามันไม่ควรมีที่ยืนอยู่ในกล่องเครื่องมือด้วยซ้ำ แต่ถ้าอยู่ในมือที่ถูกต้อง ทั้ง Router และภาษาสำหรับจัดการ Text ก็สามารถทรงพลังและใช้งานได้หลากหลายอย่างไม่น่าเชื่อ คุณสามารถตัดแต่งบางอย่างให้เป็นรูปทรงได้อย่างรวดเร็ว ทำรอยต่อ และแกะสลักได้ ถ้าใช้อย่างถูกวิธี เครื่องมือเหล่านี้จะมีความประณีตและความละเอียดอ่อนที่น่าประหลาดใจ แต่มันก็ต้องใช้เวลากว่าจะเชี่ยวชาญ

โชคดีที่มีภาษาสำหรับจัดการ Text ดี ๆ ให้เลือกอยู่หลายตัว Unix Developer (ซึ่งเรานับรวม macOS Users เข้าไปด้วย) มักชอบใช้พลังของ Command Shell เสริมด้วยเครื่องมืออย่าง awk และ sed ส่วนคนที่ชอบเครื่องมือที่มีโครงสร้างชัดเจนกว่า อาจเลือกใช้ภาษาอย่าง Python หรือ Ruby แทน

ภาษาเหล่านี้เป็นเทคโนโลยีสำคัญที่ช่วยเปิดโอกาสให้คุณทำงานได้ ด้วยการใช้มัน คุณสามารถแฮ็ก Utility และลอง Prototype ไอเดียต่าง ๆ ได้อย่างรวดเร็ว—งานที่อาจใช้เวลานานกว่าห้าถึงสิบเท่าถ้าใช้ภาษาทั่วไป และตัวคูณนี้แหละที่สำคัญอย่างยิ่งกับการทดลองแบบที่เราทำกัน การใช้เวลาแค่ 30 นาทีลองไอเดียบ้า ๆ สักอย่างมันดีกว่าการใช้เวลาห้าชั่วโมงเยอะเลย การใช้เวลาหนึ่งวัน Automate ส่วนประกอบสำคัญ ๆ ของโปรเจกต์ถือว่ายอมรับได้ แต่ถ้าต้องใช้เวลาเป็นสัปดาห์อาจจะไม่ไหว ในหนังสือของพวกเขา The Practice of Programming  [KP99] Kernighan และ Pike สร้างโปรแกรมเดียวกันขึ้นมาด้วยห้าภาษาที่แตกต่างกัน เวอร์ชัน Perl สั้นที่สุด (17 บรรทัด เทียบกับ C ที่ใช้ 150 บรรทัด) ด้วย Perl คุณสามารถจัดการ Text โต้ตอบกับโปรแกรมอื่น สื่อสารผ่าน Network ขับเคลื่อนหน้าเว็บ คำนวณเลขความละเอียดสูงตามใจชอบ และเขียนโปรแกรมที่หน้าตาเหมือนคำสบถของ Snoopy ได้เลยทีเดียว

Tip 35 เรียนรู้ภาษาสำหรับจัดการ Text สักภาษาหนึ่ง

เพื่อแสดงให้เห็นว่าภาษาสำหรับจัดการ Text นำไปประยุกต์ใช้ได้กว้างขวางแค่ไหน นี่คือตัวอย่างบางส่วนที่เราทำด้วย Ruby และ Python ซึ่งเกี่ยวข้องกับการสร้างหนังสือเล่มนี้:

การ Build หนังสือ

ระบบ Build ของ Pragmatic Bookshelf เขียนด้วย Ruby ทั้งผู้เขียน บรรณาธิการ คนจัด Layout และทีม Support ต่างก็ใช้ Rake Task ในการประสานงาน Build ไฟล์ PDF และ Ebook

การแทรกและไฮไลต์โค้ด

เราคิดว่ามันสำคัญมากที่โค้ดทุกชิ้นในหนังสือควรจะผ่านการ Test มาก่อน และโค้ดส่วนใหญ่ในหนังสือเล่มนี้ก็เป็นแบบนั้น อย่างไรก็ตาม ด้วยหลักการ DRY (ดู Topic 9, ​ DRY—The Evils of Duplication ​ ) เราไม่อยากจะ Copy และ Paste บรรทัดโค้ดจากโปรแกรมที่ผ่านการ Test แล้วลงไปในหนังสือตรง ๆ เพราะนั่นหมายความว่าเรากำลังทำโค้ดซ้ำซ้อน ซึ่งแทบจะรับประกันได้เลยว่าเราจะลืมอัปเดตตัวอย่างเมื่อโปรแกรมต้นฉบับมีการเปลี่ยนแปลง สำหรับบางตัวอย่าง เราก็ไม่อยากให้คุณเบื่อกับโค้ด Framework ทั้งหมดที่จำเป็นต้องมีเพื่อให้ตัวอย่างของเรา Compile และรันได้ เราจึงหันมาใช้ Ruby แทน Script ที่ค่อนข้างเรียบง่ายตัวหนึ่งจะถูกเรียกใช้ตอนที่เรา Format หนังสือ—มันจะดึงส่วนที่ระบุชื่อไว้จากไฟล์ Source ทำ Syntax Highlighting แล้วแปลงผลลัพธ์ออกมาเป็นภาษาจัดพิมพ์ที่เราใช้

การอัปเดตเว็บไซต์

เรามี Script ง่าย ๆ ตัวหนึ่งที่ทำ Build หนังสือบางส่วน ดึงสารบัญออกมา แล้วอัปโหลดขึ้นหน้าเว็บของหนังสือบนเว็บไซต์ของเรา นอกจากนี้เรายังมี Script ที่ดึงบางส่วนของหนังสือออกมาแล้วอัปโหลดเป็นตัวอย่างให้อ่านด้วย

การแทรกสมการ

มี Python Script ตัวหนึ่งที่แปลง Markup สมการแบบ LaTeX ให้กลายเป็น Text ที่จัดรูปแบบสวยงาม

การสร้างดัชนี

ดัชนีส่วนใหญ่มักถูกสร้างเป็นเอกสารแยกต่างหาก (ซึ่งทำให้ดูแลรักษายากเมื่อเอกสารมีการเปลี่ยนแปลง) แต่ของเรานั้นถูก Mark ไว้ในเนื้อหาโดยตรงเลย แล้ว Ruby Script ก็จะรวบรวมและจัดรูปแบบรายการเหล่านั้นให้เอง

และอื่น ๆ อีกมากมาย พูดได้เต็มปากเลยว่า Pragmatic Bookshelf ถูกสร้างขึ้นโดยมีการจัดการ Text เป็นแกนกลาง และถ้าคุณทำตามคำแนะนำของเราที่ให้เก็บทุกอย่างไว้ในรูปแบบ Plain Text การใช้ภาษาเหล่านี้จัดการ Text นั้นก็จะนำมาซึ่งประโยชน์มากมายครับ

Related Sections Include (หัวข้อที่เกี่ยวข้อง)

  • Topic 16, ​ The Power of Plain Text ​
  • Topic 17, ​ Shell Games ​

Exercises (แบบฝึกหัด)

Exercise 11

คุณกำลังเขียนแอปพลิเคชันตัวหนึ่งใหม่ ซึ่งแต่เดิมใช้ YAML เป็นภาษา Configuration แต่ตอนนี้บริษัทของคุณมาตรฐานเปลี่ยนไปใช้ JSON แล้ว คุณเลยมีไฟล์ .yaml อยู่หลายไฟล์ที่ต้องแปลงเป็น .json ลองเขียน Script ที่รับ Directory มาหนึ่งอัน แล้วแปลงไฟล์ .yaml แต่ละไฟล์ให้กลายเป็นไฟล์ .json ที่สอดคล้องกัน (เช่น database.yaml จะกลายเป็น database.json โดยเนื้อหาต้องเป็น JSON ที่ถูกต้องด้วย)

Exercise 12

ทีมของคุณเลือกใช้ชื่อตัวแปรแบบ camelCase ตั้งแต่แรก แต่ต่อมาก็เปลี่ยนใจกันทั้งทีมและเปลี่ยนไปใช้ snake_case แทน ลองเขียน Script ที่สแกนไฟล์ Source ทั้งหมดเพื่อหาชื่อแบบ camelCase แล้วรายงานผลออกมา

Exercise 13

ต่อเนื่องจากแบบฝึกหัดก่อนหน้านี้ ให้เพิ่มความสามารถในการเปลี่ยนชื่อตัวแปรเหล่านั้นโดยอัตโนมัติในหนึ่งไฟล์หรือมากกว่านั้น อย่าลืมสำรองไฟล์ต้นฉบับไว้ด้วย เผื่อมีอะไรผิดพลาดร้ายแรงสุด ๆ เกิดขึ้น