1 คะแนน โดย GN⁺ 2024-10-05 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เพื่อลดนิสัยไถข่าวในมือถือและโซเชียลมีเดียไม่รู้จบทุกเช้า จึงพิมพ์หน้าหนึ่งบนกระดาษแบบปรับแต่งเฉพาะบุคคลทุกวันด้วย เครื่องพิมพ์ดอตเมทริกซ์
  • องค์ประกอบมีเพียง Star NP-10, Raspberry Pi Zero W, อะแดปเตอร์พอร์ตขนาน-USB และแหล่งจ่ายไฟ โดยบน Pi จะมองเครื่องพิมพ์เป็นอุปกรณ์ /dev/usb/lp0
  • เครื่องพิมพ์รุ่นเก่ารับชุดอักขระแบบจำกัดที่ใกล้กับ Code Page 437 แทน Unicode ทั่วไป จึงส่งค่า hex ตรงจาก PHP เพื่อพิมพ์เส้น กรอบ และสัญลักษณ์อุณหภูมิ
  • ดึงข้อมูลจาก Open-Meteo, twelvedata, NYTimes และ Reddit JSON แล้วจัดรูปแบบสภาพอากาศ หุ้น พาดหัวข่าว และโพสต์ Reddit ให้พอดีกับความกว้างของกระดาษ
  • ตั้งให้รันอัตโนมัติด้วย cron ราว 8 โมงเช้าทุกวัน โดยใช้ข่าวแบบมีจุดสิ้นสุดบนกระดาษแผ่นเดียวมาแทนการเลื่อนฟีดไม่รู้จบบนเว็บไซต์และแอป

สร้างหน้าหนึ่งบนกระดาษแทนหน้าจอ

  • ต้องการลดนิสัยเปิดมือถือแล้วเลื่อนดูข่าวและโซเชียลมีเดียหลายเว็บในตอนเช้า แต่ยังอยากติดตามข้อมูลล่าสุดอยู่
  • จึงนำเครื่องพิมพ์ดอตเมทริกซ์ที่ซื้อจาก eBay มาใช้พิมพ์ หน้าหนึ่ง แบบปรับแต่งเองที่เตรียมไว้ทุกวัน
  • ซอร์สโค้ดทั้งหมดเผยแพร่ไว้ใน GitHub repo

การเลือกฮาร์ดแวร์และการเชื่อมต่อ

  • อุปกรณ์ที่ต้องใช้ค่อนข้างเรียบง่าย
  • เครื่องพิมพ์ที่ใช้คือ Star NP-10 ซึ่งดูเหมือนจะเป็นรุ่นจากช่วงกลางทศวรรษ 1980
    • ถ้าเป็นเครื่องพิมพ์ดอตเมทริกซ์ที่มีพอร์ตขนานก็มีโอกาสใช้งานได้
    • ราคาทั่วไปอยู่ราว 80–120 ดอลลาร์ แต่ซื้อมาได้ประมาณครึ่งราคาเพราะมีป้ายว่า “ไม่แน่ใจว่ายังใช้งานได้หรือไม่”
  • หลังทำความสะอาดเล็กน้อยและปรับตลับผ้าหมึก ก็พิมพ์หน้าทดสอบได้สำเร็จ
  • Raspberry Pi เชื่อมต่อ WiFi และต่อเข้ากับพอร์ตขนานของเครื่องพิมพ์ผ่านอะแดปเตอร์ USB
    • หลัง ssh เข้าไปที่ Pi ก็ยืนยันได้ว่าเครื่องพิมพ์ถูกมองเห็นที่ /dev/usb/lp0

ส่งข้อมูลเข้าเครื่องพิมพ์โดยตรง

  • ตอนแรกทดสอบว่าเครื่องพิมพ์ทำงานหรือไม่ด้วยการส่งข้อความดิบจากเชลล์โดยตรง
echo "Hello, world!" > /dev/usb/lp0
  • เกิดข้อผิดพลาดเรื่องการเข้าถึงไฟล์ จึงเลี่ยงปัญหาสิทธิ์ด้วย chmod
sudo chmod 666 /dev/usb/lp0
  • หลังจากนั้น ข้อความที่ส่งไปยัง /dev/usb/lp0 ก็ถูกพิมพ์ออกมา
  • จากนั้นจึงขยายเป็นการเปิดไฟล์เครื่องพิมพ์ด้วย fopen() ใน PHP แล้วเขียนข้อความลงไป
  • เมื่อทดลองทั้งประโยคทั่วไป ช่องว่าง และงานอาร์ตแบบ Unicode ก็พบว่า ขอบเขตการรองรับอักขระ ของเครื่องพิมพ์มีจำกัด

ชุดอักขระของ Star NP-10

  • ไปหา คู่มือผู้ใช้ Star NP-10 ฉบับสแกนมาอ่านเพื่อดูวิธีทำงานของเครื่องพิมพ์
  • เครื่องพิมพ์รุ่นนี้รับได้เฉพาะ ชุดอักขระ ที่เฉพาะเจาะจงมาก
    • อ้างอิงอย่างหลวม ๆ จาก Code Page 437 ของ IBM PC
    • มีตัวอักษรและตัวเลขมาตรฐาน รวมถึงสัญลักษณ์พิเศษ เส้น และอักขระแบบกรอบบางส่วน
  • ใน PHP สามารถสร้างสตริงจากค่า hex แล้วส่งตรงเข้าเครื่องพิมพ์ได้
$horizontalDouble = "\xCD";
$deg = "\xF8";

echo str_repeat($horizontalDouble, 24);
echo '78' . $deg . 'F' . PHP_EOL;
  • วิธีนี้ทำให้พิมพ์ได้ไม่ใช่แค่ข้อความธรรมดา แต่รวมถึง อักขระตกแต่ง อย่างเส้น กรอบ และสัญลักษณ์อุณหภูมิด้วย

ข้อมูลที่ดึงมาและ API

  • หน้าหนึ่งส่วนตัวนี้มี 4 ส่วน
    • สภาพอากาศ
    • หุ้น
    • พาดหัวข่าวสำคัญ
    • โพสต์ Reddit ยอดนิยม
  • เพราะเป็นโปรเจกต์ทดลอง จึงพยายามลดค่าใช้จ่ายด้านข้อมูลและใช้ API ฟรีให้มากที่สุด โดยค้นหา API ที่ต้องการจากคลัง public-apis ที่รวม API สาธารณะฟรีไว้
  • แหล่งข้อมูลที่ใช้มีดังนี้
    • Open-Meteo: ข้อมูลสภาพอากาศ ไม่ต้องใช้ API key
    • twelvedata: ข้อมูลหุ้น มี free tier ที่ให้โควตาค่อนข้างเยอะ
    • NYTimes: พาดหัวข่าว มี free tier เพียงพอสำหรับโปรเจกต์นี้
    • Reddit JSON: โพสต์ Reddit ใช้งานได้ฟรี แต่ต้อง spoof User-Agent
  • สคริปต์ PHP จะดึง payload จากแต่ละ API endpoint แล้วรวมเฉพาะข้อมูลที่ต้องใช้ไว้ในอาร์เรย์ขนาดใหญ่ตัวเดียว
    • ใช้เฉพาะหุ้นบางตัว ข่าวบางประเภท และโพสต์จากบาง subreddit เท่านั้น
    • ถ้าส่วนใดส่วนหนึ่งไม่มีข้อมูลสำหรับแสดง สคริปต์จะหยุดทำงานก่อนแล้วค่อยรันใหม่ภายหลัง

วิธีคัดกรองข้อมูลข่าว

  • ข้อมูลจาก NYTimes จะถือว่าล้มเหลวทันทีหากไม่มี results ในการตอบกลับของ API
  • จากบทความทั้งหมด จะคัดมาแสดงเฉพาะรายการที่เข้าเงื่อนไขต่อไปนี้
    • type เป็น Article
    • section เป็นหนึ่งใน U.S., World, Weather, Arts
    • จะเพิ่มก็ต่อเมื่อจำนวนยังไม่ถึงค่าสูงสุด MAXNEWS
  • กำหนด NEWS, NEWSKEY, MAXNEWS เป็นค่าคงที่ไว้ด้านบนของสคริปต์ เพื่อให้แก้ไขได้ง่าย

จัดรูปแบบการพิมพ์ให้พอดีกับกระดาษ

  • แทนที่จะพิมพ์แค่ชื่อส่วนเฉย ๆ จึงทำ กรอบขอบ ด้านบนที่มีวันที่ปัจจุบัน วันในสัปดาห์ และชื่อหน้าหนึ่งอยู่ภายใน
  • คำนวณเลย์เอาต์โดยยึดจากความกว้างหน้ากระดาษของเครื่องพิมพ์ที่ 80 ตัวอักษร
    • อักขระแบบ hex
    • str_repeat
    • ค่าความกว้างหน้าคงที่
  • ชื่อของแต่ละส่วนพิมพ์โดยผสมอักขระเส้นกับข้อความ
str_repeat($horizontalSingle, 3) . " WEATHER " . str_repeat($horizontalSingle, (PAGEWIDTH - 9)) . "\n";
  • ส่วนสภาพอากาศกับหุ้นสั้นพอที่จะพิมพ์เป็นบรรทัดเดียวโดยไม่ชนขอบกระดาษ
  • ส่วนพาดหัวข่าวและโพสต์ Reddit มักเป็นข้อความยาว จึงต้องมีการ ตัดบรรทัด แยกต่างหาก

การตัดบรรทัดสำหรับข้อความยาว

  • ตัวเครื่องพิมพ์สามารถพิมพ์บรรทัดยาวต่อเนื่องลงบรรทัดถัดไปให้อัตโนมัติได้
  • แต่เพื่อเลี่ยงไม่ให้คำถูกตัดครึ่งกลางแล้วไหลไปบรรทัดใหม่ จึงเขียนฟังก์ชันสำหรับแบ่งสตริงตาม ความยาวบรรทัดสูงสุด
  • ฟังก์ชัน splitString() จะแยกคำตามช่องว่าง และคืนค่าเป็นอาร์เรย์ที่ทำให้แต่ละบรรทัดไม่เกิน PAGEWIDTH
    • ถ้ามีคำเดี่ยวที่ยาวเกินความยาวสูงสุด ก็จะตัดคำนั้นแยกจัดการ
  • สำหรับโพสต์ Reddit จะวนลูปผ่านอาร์เรย์ของบรรทัดที่คืนมาแล้วเขียนลงเครื่องพิมพ์
foreach (splitString($redditPost) as $line) {
    fwrite($printer, $line) . "\n";
}

การทำงานอัตโนมัติและประสบการณ์ใช้งาน

  • ถ้าจะรันเองแบบแมนนวลสามารถใช้ php print.php ได้
  • ในการใช้งานจริงตั้งงาน cron ให้ทำงานอัตโนมัติ
    • ทุกวันเวลาประมาณ 8 โมงเช้า จะพิมพ์หน้าหนึ่งแบบปรับแต่งส่วนตัวออกมา
    • จากนั้นก็ฉีกกระดาษออกมาดูพร้อมดื่มกาแฟ
  • ข่าวแบบมีจุดสิ้นสุดที่อยู่บนกระดาษแผ่นเดียวให้ความรู้สึกดีกว่าการเลื่อนเว็บไซต์และแอปโซเชียลแบบไม่รู้จบ
  • กระบวนการนำฮาร์ดแวร์เก่าจับคู่กับเทคโนโลยีใหม่เพื่อใช้งาน ก็เป็นความสนุกสำคัญของโปรเจกต์นี้เช่นกัน

1 ความคิดเห็น

 
GN⁺ 2024-10-05
ความคิดเห็นใน Hacker News
  • ผมเคยลองทำอะไรคล้าย ๆ กันด้วยเครื่องพิมพ์ใบเสร็จ โดย เครื่องพิมพ์ใบเสร็จแบบความร้อน USB ราคาประมาณ 75 ดอลลาร์ และควบคุมด้วย Python ได้ง่าย
    การพิมพ์รูปภาพกับ QR code ทำได้ไม่ยาก และฟังก์ชันตัดกระดาษอัตโนมัติก็ช่วยให้แยกข้อความแต่ละรายการได้ดี
    ยังสั่งให้กระดิ่งภายในดังเพื่อใช้เหมือนเป็น การแจ้งเตือน เพิ่มเติมได้ และมีเอาต์พุตสำหรับควบคุมลิ้นชักเก็บเงินด้วย เลยคิดว่าจะลองต่อไปควบคุมอะไรอย่างไฟดู
    ผมตั้งค่าไว้สำหรับอีเมล และให้พิมพ์ตารางนัดหมายออกมาทุกเช้า
    ถ้าใช้ร่วมกับการควบคุมทางกายภาพอย่างปุ่มหรือ NFC reader อินเทอร์เฟซก็ค่อนข้างเข้ากันดี เช่น มีการ์ด NFC สำหรับพิมพ์ตารางนัดหมาย หรือการ์ด NFC สำหรับพิมพ์อีเมลที่ยังไม่ได้อ่าน เป็นการส่ง “คำสั่ง” แล้วรับผลลัพธ์ออกมา
    เป็นวิธีลดเวลาอยู่หน้าจอที่สนุกดี แต่ที่ประชดคือ ผมคงใช้เวลามองหน้าจอไปกับการเขียนโค้ดและตั้งค่าสิ่งนี้มากกว่าเวลาที่ประหยัดได้เสียอีก

    • เครื่องพิมพ์ใบเสร็จสนุกก็จริง แต่ต้องระวังอย่าซื้อ กระดาษความร้อนที่เป็นอันตราย
      https://www.consumerreports.org/cro/news/2014/03/the-health-...
    • เครื่องพิมพ์ความร้อนของผมก็พิมพ์ สภาพอากาศ ออกมาทุกเช้าเหมือนกัน และพิมพ์การแจ้งเตือนถ้าอุปกรณ์สำคัญหลุดออกจากเครือข่าย
    • เครื่องพิมพ์ใบเสร็จสนุกจริง ๆ หลายปีก่อนผมทำโปรเจกต์พิมพ์ ตั๋ว GitHub ด้วยชุดอุปกรณ์คล้าย ๆ กัน และก็คล้ายกับชุดที่ตอนนี้ใช้กับเครื่องพิมพ์ดอตเมทริกซ์อยู่
    • อยากรู้ว่าใช้เครื่องพิมพ์รุ่นไหนอยู่ กำลังคิดว่าจะซื้อสักเครื่อง แต่ไม่รู้มาก่อนว่ามี ฟังก์ชันแจ้งเตือน และฟังก์ชันควบคุมภายนอกอย่างที่บอก
  • วันนี้จู่ ๆ ก็สงสัยขึ้นมา
    สิ่งหนึ่งที่คนนี้ทำก็แค่ echo ไปที่ /dev/lp0 ซึ่งสมัยก่อนก็ทำกันแบบนั้นจริง ๆ คือส่งข้อความเข้าอินเทอร์เฟซ แล้วเครื่องพิมพ์ก็พิมพ์ออกมา
    เครื่องพิมพ์สมัยนี้หรูหรากว่ามาก แต่ก็ยังเป็นเครื่องพิมพ์ที่มีมรดกตกทอดยาวนานอยู่ดี เครื่องพิมพ์เลเซอร์ HP รุ่นแรก ๆ ก็แค่ส่งข้อมูลไปตามสาย แล้วมันจะพิมพ์ออกมาเป็น Courier 10 จำนวน 66 บรรทัดต่อหน้า ส่วน Apple LaserWriter น่าจะไม่ใช่แบบนั้น เพราะเป็นเครื่องพิมพ์ PostScript โดยเฉพาะ และคงต้องส่ง PostScript เข้าไปแทน
    เมื่อเครื่องพิมพ์พัฒนาขึ้น ภาษาที่ส่งไปก็ซับซ้อนขึ้น แต่ก็ยังรักษาความเข้ากันได้ย้อนหลังไว้ยาวนาน
    ดังนั้นถ้าเสียบเครื่องพิมพ์ USB เข้ากับคอมพิวเตอร์ แล้วสั่ง ls > /dev/usbXXX ทุกวันนี้ยังจะพิมพ์ออกมาไหม? มันยังทำงานแบบนั้นอยู่หรือเปล่า?
    ถ้าส่ง escape code ของ EPSON MX-80 ไปยัง EPSON มันจะยังใช้ได้ไหม? ไม่ว่าคำตอบจะเป็นทางไหนก็ไม่น่าแปลกใจ แต่สำหรับผม เครื่องพิมพ์สมัยนี้ค่อนข้างเป็นกล่องดำ เลยอยากรู้ว่ามีใครทราบไหม
    น่าจะยังมีคนจำความสนุกตอนต้องปลุกปล้ำให้รายงานพิมพ์ออกมาตรงกับแบบฟอร์ม NCR กระดาษสำเนาหลายชั้นที่พิมพ์ไว้ล่วงหน้าได้

    • ผมเพิ่งทดสอบบน OS X ดู เหมือนมันไม่ได้ expose เครื่องพิมพ์ไว้ใต้ /dev/ แบบที่อธิบายไว้ แต่ OS X ก็มี lp อยู่ จึงใช้แบบ echo "Hello printer" | lp -d ได้ และดูชื่อได้ด้วย lpstat -p
      ลองกับเครื่องพิมพ์ใหม่แล้ว ใช้งานได้จริง
    • สองคำสั่งด้านล่างนี้ใช้ได้ในสภาพแวดล้อมของผมทั้งคู่
      printf 'hello\f' > /dev/usb/lp0
      printf 'hello\f' | nc -N $printer_ip 9100
      เป็นเครื่องพิมพ์เลเซอร์ Brother และมีลิงก์คู่มือการเขียนโปรแกรมอยู่ข้าง ๆ คู่มือออนไลน์ ภาษาคือ PCL แต่สำหรับการพิมพ์ง่าย ๆ ไม่จำเป็นต้องรู้อะไรมาก
      สองวิธีข้างต้นไม่ได้ใช้ CUPS ถ้าจะใช้ไฟล์ปฏิบัติการ lp/lpr เหมือนคอมเมนต์อื่น ๆ ต้องลงทะเบียนเครื่องพิมพ์กับ CUPS ก่อน
      ในกรณี ls > เครื่องพิมพ์คาดหวังการขึ้นบรรทัดแบบ DOS \n จะเลื่อนไปบรรทัดใหม่เท่านั้น ไม่ได้ทำ “carriage return” ดังนั้นต้อง pipe ผ่าน sed 's/$/\r/' หรือใช้ nc -C
      เมื่อเชื่อมต่อผ่าน USB สามารถพิมพ์หลายครั้งเพื่อรวมเป็นหน้าเดียวได้ และกระดาษจะยังไม่ออกจนกว่าจะส่ง form feed ส่วนการเชื่อมต่อ TCP เมื่อปิดการเชื่อมต่อแล้วหน้ากระดาษจะถูกพิมพ์ออกมา
    • ผมมี Epson LX-350 ที่ซื้อใหม่เมื่อไม่กี่ปีก่อน เชื่อมต่อผ่าน USB ได้ และยังมีพอร์ต serial/parallel ด้วย เมื่อเชื่อมต่อผ่าน USB มันโผล่มาประมาณ /dev/usblp0 และส่งข้อมูลด้วย cat เฉย ๆ ก็ใช้งานได้
      ลูกค้าที่ซื้อผลิตภัณฑ์แบบนี้ใหม่คงต้องการให้เข้ากันได้กับกระบวนการที่ใช้มาตลอด 30–50 ปีที่ผ่านมา ดังนั้นตามคาดคือมันรองรับ ESC/P 2 และยังรองรับ escape code ของ IBM ด้วย น่าแปลกใจอยู่เหมือนกัน เพราะเครื่องพิมพ์เมทริกซ์รุ่นเก่าที่เคยใช้ในยุค 90 ดูเหมือนไม่รองรับโค้ด IBM
      ที่น่าประหลาดใจกว่านั้นคือ MacBook มีไดรเวอร์ในตัวสำหรับเครื่องพิมพ์ Epson แบบทั่วไป และมันใช้งานได้ คุณภาพไม่ดีนักและพิมพ์เป็นกราฟิก แต่ถึงอย่างไรก็มีอยู่จริง
      เครื่องพิมพ์อิงก์เจ็ตและเลเซอร์รุ่นใหม่ ๆ ผมไม่ค่อยแน่ใจ เครื่องพิมพ์อิงก์เจ็ต Epson ที่ใช้เมื่อราว 20 ปีก่อนรองรับโค้ด ESC/P แบบ raw
    • ใช้กับเครื่องพิมพ์เครือข่ายก็ได้ ส่ง PDF ด้วย netcat ไปยังพอร์ตที่เปิดอยู่ แล้วมันก็พิมพ์ออกมา
      https://retrohacker.substack.com/p/bye-cups-printing-with-ne...
    • ในห้องคอมพิวเตอร์ของโรงเรียนช่วงทศวรรษ 1990 ยังมีเครื่องพิมพ์ดอตเมทริกซ์อยู่ และถูกตั้งเป็นเครื่องพิมพ์เริ่มต้นในคอมพิวเตอร์ทุกเครื่องบนเครือข่าย
      ความผิดพลาดของผู้ใช้ที่เจอบ่อยอย่างหนึ่งคือ เมื่อมีใครพยายามพิมพ์เอกสาร Word PostScript จะถูกส่งไปยังเครื่องพิมพ์ดอตเมทริกซ์ แล้วเครื่องพิมพ์ก็พิมพ์ซอร์ส PostScript นั้นออกมาตามตัวอักษรอย่างซื่อสัตย์ ทำให้เปลืองกระดาษและริบบอนจนกว่าจะมีใครมาหยุด
  • เครื่องพิมพ์แบบเมทริกซ์ก็ทำอะไรได้ค่อนข้างมาก แล้วแต่รุ่น เช่น เปลี่ยนฟอนต์ ตัวหนา ขีดเส้นใต้ บางครั้งก็ทำตัวเอียง ตัวอักษรกว้าง/สูงสองเท่า ไปจนถึงกราฟิกได้ด้วย เพียงแต่กราฟิกมักมีความละเอียดค่อนข้างต่ำ เช่น 90 หรือ 180 DPI
    เมื่อก่อนเคยทำกล่องที่มีแค่คอนเนกเตอร์พรินเตอร์พอร์ตขนานไว้สำหรับอะไรสักอย่างคล้ายเกม escape room พอต่อเข้ากับพรินเตอร์ ไมโครคอนโทรลเลอร์ PIC ขนาดจิ๋วจะรับ ไฟเลี้ยงแบบพาราซิต จากสายควบคุมเส้นหนึ่งของพอร์ตขนาน ใช้ไฟแค่ไม่กี่ร้อย µA แล้วส่งคำใบ้ไปยังพรินเตอร์

    • สมัยก่อนมีหนึ่งในโปรแกรม desktop publishing ยุคแรก ๆ ของ SoftCraft ชื่อ Fancy Font เป็นโปรแกรม CP/M และต่อมาก็ DOS จึงไม่ใช่เครื่องมือจัดหน้าแบบ WYSIWYG อย่าง PageMaker แต่ใช้เอกสารข้อความที่จัดรูปแบบด้วยภาษา markup แบบง่าย ๆ
      ช่วงแรกมันใช้โหมดกราฟิกความละเอียดสูงของเครื่องพิมพ์ดอตเมทริกซ์ Epson พรินเตอร์เหล่านี้สามารถปรับ platen แบบละเอียดได้เล็กถึง 1/3 ของระยะห่างระหว่างเข็มบนหัวพิมพ์ ทำให้ได้ความละเอียดแนวตั้งมากกว่าที่หัวพิมพ์ทำได้เองถึง 3 เท่า
      Fancy Font เรนเดอร์ข้อความบนคอมพิวเตอร์แล้วส่งออกเป็นกราฟิกในโหมดความละเอียดสูงพิเศษนี้ ทำให้ได้ผลลัพธ์ที่ใกล้เคียงการจัดพิมพ์มากที่สุดเท่าที่อุปกรณ์สำหรับบ้านช่วงต้นทศวรรษ 1980 จะทำได้
      เวอร์ชันหลัง ๆ ยังมีไดรเวอร์สำหรับเครื่องพิมพ์เลเซอร์ยุคแรก ๆ อย่าง HP LaserJet รุ่นดั้งเดิมด้วย แต่พอ Mac ออกมา อนาคตของระบบแบบนั้นก็ค่อนข้างชัดเจน
    • พ่อของผมมี เครื่องพิมพ์ดอตเมทริกซ์ 4 สี ในยุค 90 การพิมพ์หัวฟาโรห์จาก Deluxe Paint II ใช้เวลานานมหาศาล แต่ผลลัพธ์ออกมาสวยทีเดียว
      เพียงแต่ว่าหลังพิมพ์แล้วกระดาษงอมาก ตอนนี้ยังมีพรินเตอร์อยู่ แต่ไม่รู้ว่าจะหา ribbon 4 สีได้จากที่ไหน
    • จำได้ว่าเคยพิมพ์แบนเนอร์ขนาดยักษ์ในโหมดแนวนอนบนกระดาษม้วนยาวไม่รู้จบ เป็นอะไรคล้าย ๆ ASCII art ที่คำสั่งอย่าง figlet ในเทอร์มินัลสมัยนี้สร้างขึ้น บางทีมันอาจยังรองรับการส่งออกไปพรินเตอร์อยู่ก็ได้
    • ในมุมมองด้านดีไซน์ ผมอยากสำรวจเรื่องนี้ต่อมาก คู่มือมีหน้าที่พูดถึงขนาดฟอนต์ การเน้น ตัวเอียง ตัวห้อย/ตัวยก อยู่เป็นสิบ ๆ หน้าเลย
      อาจจะลองทำในเวอร์ชัน 2.0 ก็ได้
    • ถ้ามีเทอร์มินัลที่เข้าใจ ESC/P และรองรับฟอนต์หลายแบบ รวมถึงอย่าง CPI ก็น่าจะสนุกดี
  • ผมเคยต่อเครื่องนี้เข้ากับฟีดข่าวไว้อยู่หลายปี[1] เป็นกลไกของ Model 14 Teletype tape printer และตอนนี้ก็ยังอยู่ในห้องนั่งเล่น โดยเทปจะไหลออกไปลงตะกร้าลวด
    ขับเคลื่อนด้วยโปรแกรม Python บนซับโน้ตบุ๊ก EeePC เก่า ๆ
    [1] https://aetherltd.com/refurbishing14.html

    • เจ๋งมาก ผมอยากหาอุปกรณ์แบบนี้มาสักครั้ง เพื่อเลียนแบบ ticker tape ที่พิมพ์ราคาหุ้น/คริปโตที่อัปเดตตลอดเวลา
      ได้ยินชื่อ EeePC อีกครั้งในรอบนานมาก ทำให้นึกถึงความหลังเลย
  • ดูเหมือนเป็นไอเดียผลิตภัณฑ์ที่ยอดเยี่ยมจริง ๆ แนวคิดที่ว่าได้ฟีดข่าวส่วนตัวทุกเช้า และไม่ใช่จากที่อย่าง MSN แต่เป็น ฟีดข่าวออฟสกรีนที่ผมเลือกเองจริง ๆ นั้นเท่มาก
    ถ้ายังสามารถ แทนนาฬิกาปลุกด้วยเครื่องพิมพ์ดอตเมทริกซ์ ได้ด้วยก็ยิ่งเจ๋ง
    การแก้ PHP ให้เข้ากับแหล่งข่าวของผมน่าจะทำได้ง่าย แต่ผมไม่รู้ว่าจะเริ่มทำฝั่งฮาร์ดแวร์เองอย่างไร น่าจะมีคนที่อยู่ในสถานการณ์แบบนี้ไม่น้อย
    ถ้ามีขายในตลาด ผมคงซื้อ แม้จะแพงกว่าราคาเครื่องพิมพ์เก่ามากก็ตาม

    • จากประสบการณ์ที่เคยทำอะไรคล้าย ๆ กัน จริง ๆ แล้วค่อนข้างง่าย แค่ต่อพรินเตอร์ แล้วเขียนไปที่เอาต์พุต dev เท่านั้น ถ้าสมมติว่ารันบน Linux เอาต์พุตนั้นก็เป็นแค่ไฟล์
      ส่วนที่ยากที่สุดคือการต่อพรินเตอร์ ซึ่งอาจต้องใช้ สายอะแดปเตอร์
  • เรียบร้อยดี ทำให้นึกถึงช่วงที่เคยทำงานสั้น ๆ ที่สถานีวิทยุ รายละเอียดแทบลืมไปหมดแล้ว แต่เหมือนว่าจะมีการโทรเข้าอัตโนมัติไปยัง หมายเลข Associated Press บางหมายเลขเพื่อดึงพาดหัวข่าวล่าสุด แล้วส่งไปยังเครื่องพิมพ์ดอตเมทริกซ์
    ตอนนั้นเป็นปลายยุค 90 และรันบน MS-DOS
    พรินเตอร์ส่วนใหญ่ในเวลานั้นสามารถตั้งฟอนต์ผ่าน control code ได้ และหลายรุ่นก็มี ฟอนต์แบบความกว้างแปรผัน ด้วย

  • ดีเลย ช่วงนี้กำลังคิดว่าจะสมัครรับ หนังสือพิมพ์ฉบับกระดาษช่วงสุดสัปดาห์ อย่าง FT Weekend เพราะผมอ่านข่าวบนมือถือบ่อยเกินไป
    ข่าวมักไม่ได้มีประโยชน์มากนัก แถมยังสร้างแต่อารมณ์ด้านลบ ถ้าอ่านข่าวบนกระดาษ และแค่สัปดาห์ละครั้ง น่าจะรู้สึกสบายใจกว่า
    วิธีพิมพ์ข่าวลงกระดาษทุกวันแบบนี้ดูเหมือนจะช่วยเติมช่องว่างตรงกลางได้ดี
    อีกอย่าง ผมชอบเครื่องพิมพ์ดอตเมทริกซ์มาก มี เครื่องพิมพ์โอเพนซอร์ส ที่เหมาะให้แฮ็กแบบนี้ไหม?

    • FT แนะนำยาก
      ผมเคยพยายามสมัครรับหนังสือพิมพ์กระดาษ แต่ไม่เคยได้รับเลย หลังโทรไป 3 ครั้งและส่งอีเมลไปประมาณ 10 ฉบับ พอขอยกเลิกสมาชิกและคืนเงิน เขาถึงบอกว่าจะยกระดับ ticket ให้ ตอนนั้นก็ผ่านไป 3 สัปดาห์แล้ว และผมก็เสียเวลาไปมาก
      ดังนั้นผมจึงสนใจมากเหมือนกันที่จะพิมพ์ข่าวจากอินเทอร์เน็ตเอง เพื่อไม่ต้องจ้องหน้าจอต่อไป
  • ผมพิมพ์ “การ์ดสามด้าน” มาระยะหนึ่งแล้ว ด้านหนึ่งเป็นรูปภาพ อีกด้านเป็น QR code ที่ลิงก์ไปยังเอกสาร
    https://mastodon.social/@UP8/111013706271196029
    “ด้านที่สาม” คือเว็บไซต์ที่ QR code ลิงก์ไป
    ผมเริ่มเบื่อภาพถ่าย เลยสร้างตัวละครที่พกเลนส์ราคาถูก ตั้งรูรับแสงให้แคบกว่า f/18 เสมอ ใช้ post-processing กับการปรับสีแรง ๆ และถ่ายด้วยอัตราส่วนภาพที่เป็นมาตรฐานแต่ให้ความรู้สึกไม่มาตรฐาน ตั้งใจให้ดูเหมือนใช้กล้องประหลาดจากไทม์ไลน์ทางเลือก
    พอเริ่มพิมพ์ซีรีส์นี้ ผมสรุปได้ว่าถ้าตัด 4x6 ก็ทำ 4x5 ได้ง่าย แต่แทนที่จะตัด ก็สามารถเว้นพื้นที่ 1 นิ้วไว้ใส่ QR code กับเอกสารบนด้านหน้าได้ เช่นเดียวกัน ถ้าตัด 5x7 ให้เป็นสี่เหลี่ยม 5x5 ก็จะมีพื้นที่สำหรับใส่เอกสาร
    ผมมีกระดาษมันอยู่หลายกล่องที่พิมพ์ด้านหลังไม่ได้ เลยคิดว่าจะใช้แบบนั้น ต่อมาจึงรู้ว่า Instagram มีมาตรฐาน 4x5 และภาพกีฬาที่ถ่ายด้วยเลนส์ดี ๆ ก็ดูดีมากในฟอร์แมตนั้น
    แต่ยังลังเลว่าจะทำให้เอกสารมีหน้าตาอย่างไร ระหว่างเปลี่ยนจากรูปแบบปัจจุบันให้น้อยที่สุด, ทำ เอฟเฟกต์ดอตเมทริกซ์ปลอม ให้ดูเหมือนพรินเตอร์เก่าที่น่าจะฝังอยู่ในกล้องแฟนตาซีนั้น, หรือใช้ข้อดีของเครื่องพิมพ์อิงก์เจ็ตให้เต็มที่

    • ผมอยากเข้าใจนะ แต่รู้สึกว่าไม่ว่าตัวข้อความเองหรือผมคงพลาดบริบทไปเยอะมาก แทบทุกย่อหน้าดูเหมือนไม่เกี่ยวข้องกับย่อหน้าก่อนหน้าเลย
  • หาก “เพราะเป็นโปรเจกต์ทดลอง เลยอยากคงค่าใช้จ่ายด้านข้อมูลนี้ให้ถูกมาก ๆ หรือถ้าเป็นไปได้ก็ฟรี” ก็มี NewsCatcher ด้วย ฟรีสำหรับโปรเจกต์เสริมแบบโอเพนซอร์ส
    https://docs.google.com/forms/d/e/1FAIpQLSejrsj4a1ZQkIasiKCt...

  • เกี่ยวข้องกันเล็กน้อย ผมใช้สคริปต์เล็ก ๆ ที่เปิด หน้าแรกของ NYTimes บน MacBook ทุกเช้า
    d=$(date +%d)
    m=$(date +%m)
    y=$(date +%Y)
    wget -q [https://static01.nyt.com/images/$y/$m/$d/nytfrontpage/scan.p...](<https://static01.nyt.com/images/$y/$m/$d/nytfrontpage/scan.pdf>;) && open ./scan.pdf

    • เมื่อก่อนเคยทำ RSS feed จากรูปหน้าแรกเหล่านี้ไว้ ใครอยากใช้ก็ใช้ได้
      https://nytonline.net/rss
    • เปลี่ยนมันเป็นแบบบรรทัดเดียวแล้ว
      rm todays_nyt.pdf; wget -q "[https://static01.nyt.com/images/$(date](<https://static01.nyt.com/images/$(date>) +%Y/%m/%d)/nytfrontpage/scan.pdf" -O todays_nyt.pdf && open todays_nyt.pdf
    • dmy=$(date +%d/%m/%Y)