โปรเจกต์ Rust เพื่อไม่ให้พลาดรถไฟ
(lilymara.xyz)- สำหรับชีวิตที่เดินทางในซานฟรานซิสโกโดยไม่มีรถยนต์ อุปกรณ์ที่ใช้ดู เวลามาถึงรอบถัดไปของป้ายใกล้บ้าน ได้ทันที ก่อนออกจากบ้าน จะใช้งานได้จริงมากกว่า
- เจลเบรก Kindle เก่าแล้วดัดแปลงเป็นป้ายข้อมูล e-ink ติดผนัง โดยช่วงแรกแสดงภาพแคปหน้าจอเว็บเพจ BART เป็นระยะ
- เมื่อเพิ่ม MUNI เข้าไปด้วย ความน่าเชื่อถือของโครงสร้างที่อิงสกรีนช็อตก็ลดลง เพราะต้องมีแท็บเบราว์เซอร์หลายแท็บ, ภาระหน่วยความจำบน Raspberry Pi และ HTTP 429 ซ้อนกัน
- เวอร์ชันที่เขียนใหม่ด้วย Rust ดึงข้อมูลจาก Stop Monitoring API ของ 511.org และใช้
skia-safeสร้าง PNG โดยตรงให้ตรงกับความละเอียดและความลึกสี 8-bit ของ Kindle - เมื่อตัดเอนจินเบราว์เซอร์ออก และเพิ่มแคช การแสดงข้อผิดพลาด รวมถึงการปรับเลย์เอาต์ ก็กลายเป็น ป้ายแสดงข้อมูลขนส่งสาธารณะบน Kindle ที่ใช้งานจริงได้
ข้อมูลที่ต้องใช้ตอนออกจากบ้านนั้นเรียบง่าย
- ผู้เขียนเดินทางในซานฟรานซิสโกโดยไม่มีรถยนต์ และใช้ขนส่งสาธารณะอย่างรถบัส รถไฟ รถราง รถรางไฟฟ้า เคเบิลคาร์ และเรือเฟอร์รีเป็นประจำ
- แอปอย่าง CityMapper มีประโยชน์สำหรับการนำทางไปยังจุดหมาย แต่หน้าบ้านนั้น สิ่งที่สำคัญกว่า “จะไปที่ไหน” คือ เวลามาถึงรอบถัดไปของแต่ละสาย
- หากรู้อยู่แล้วว่าจะใช้ป้ายและสายไหน โมเดลตำแหน่งปัจจุบัน·จุดหมายปลายทางของแอปนำทางทั่วไปก็ซับซ้อนเกินความจำเป็น
- ได้แรงบันดาลใจจาก บทความของ Matt Healy ที่ใช้ Kindle เก่าเป็นสมาร์ตโฮมดิสเพลย์ และ บทความของ Ben Borgers ที่ใช้ Nook เก่าเป็นกรอบรูป iCloud
กว่าจะทำให้ Kindle แสดงภาพได้
- ขั้นแรกคือเจลเบรก Kindle เพื่อเปิดใช้ USBNet และให้เชื่อมต่อ SSH ได้
- จากนั้นใช้ cron job อัปเดตหน้าจอเป็นระยะ
- ใช้เอกสารเกี่ยวกับการแฮ็ก Kindle จากวิกิและฟอรัมของ mobileread เป็นแหล่งอ้างอิง
- หน้า Real Time Departure ของ BART เหมาะเป็นแหล่งข้อมูลเริ่มต้น เพราะให้ข้อมูลรถไฟขบวนถัดไปของสถานีที่ต้องการและรีเฟรชอัตโนมัติ
- พยายามแสดง PNG ด้วย
eipsใน Kindle CLI แต่ช่วงแรกภาพถูกยืดหรือถูกตัดอย่างหนักจนใช้งานไม่ได้ - สาเหตุคือเครื่องมือแสดงผลของ Kindle จัดการ 24-bit RGB PNG ได้ไม่ถูกต้อง และอ่านเหมือนเป็นภาพ 8-bit
- เมื่อใช้
-colorspace gray -depth 8ใน ImageMagickconvertแล้วจึงแสดงผลได้ปกติ - ภาพที่มีขนาดตรงกับหน้าจอ Kindle และ ความลึกสี 8-bit กลายเป็นเงื่อนไขสำคัญ
- เมื่อใช้
การทำครั้งแรก: Node.js, Puppeteer, Raspberry Pi
- เซิร์ฟเวอร์รุ่นแรกใช้ Node.js และ Puppeteer เพื่อแคปเจอร์ส่วนที่ต้องการจากเว็บเพจ BART
- ภาพที่แคปเจอร์ได้ถูกแปลงให้ตรงกับขนาดหน้าจอ Kindle และเป็นเกรย์สเกล 8-bit ก่อนส่งกลับผ่าน HTTP endpoint
- รันเซิร์ฟเวอร์บน Raspberry Pi และให้ Kindle ใช้ cron ดึงภาพทุกนาทีมาแสดงด้วย
eips - เนื่องจากหน้า BART รองรับการรีเฟรชอัตโนมัติอยู่แล้ว จึงเปิดหน้าไว้ครั้งเดียวตอนเริ่มเซิร์ฟเวอร์ และไม่โหลดใหม่ทุกครั้งที่มีคำขอ
- เวอร์ชันนี้ทำงานได้ดีอยู่พักหนึ่ง แต่บางครั้งการรีเฟรชหยุดทำงาน หรือเซิร์ฟเวอร์ต้องรีสตาร์ตเพราะหน่วยความจำไม่พอ
ข้อจำกัดที่เผยออกมาเมื่อขยายไปยัง MUNI
- ในเขตอ่าวซานฟรานซิสโกมีผู้ให้บริการขนส่งสาธารณะ 27 ราย และการทำครั้งแรกครอบคลุมเฉพาะ BART ซึ่งเป็นรถไฟด่วนประจำภูมิภาค
- ต่อมาผู้เขียนอยากดูเวลามาถึงของรถบัสและรถไฟฟ้ารางเบาของ MUNI ด้วย
- เว็บเพจของ MUNI ก็ให้เวลามาถึงตามป้ายเช่นกัน ช่วงแรกจึงลองใช้ Puppeteer แคปเจอร์หน้าของหลายป้าย แล้วรวมภาพด้วย ImageMagick
- 7 ส่วนบนหน้าจอแต่ละส่วนสอดคล้องกับ แท็บเบราว์เซอร์ ที่ Puppeteer ต้องคงไว้
- Raspberry Pi มีหน่วยความจำไม่พอ และ Chrome ก็ไม่ได้เบา
- หน้า MUNI จะส่ง HTTP 429 กลับมาหากร้องขอบ่อย
- หน้าจอที่แสดง BART และ MUNI ร่วมกันไม่เสถียรกว่าหน้าจอ BART อย่างเดียวมาก และสำหรับป้ายข้อมูลที่ต้องมองเห็นได้ในครั้งเดียว จำเป็นต้องมีโครงสร้างที่เชื่อถือได้มากกว่า
โครงสร้างที่ออกแบบใหม่ด้วย Rust
- เวอร์ชันที่เขียนใหม่ตัด Puppeteer ออก และเปลี่ยนเป็นโครงสร้างที่เซิร์ฟเวอร์ HTTP ใน Rust สร้าง PNG โดยตรง
- ยังคงอินเทอร์เฟซสาธารณะให้คล้ายกับเซิร์ฟเวอร์ Node.js แต่เปลี่ยนการทำงานภายในทั้งหมด
- องค์ประกอบหลักมีสามอย่าง
- ดึงเวลามาถึงรอบถัดไปจาก 511.org
- เรนเดอร์เวลามาถึงเป็นภาพ 8-bit PNG
- ส่ง PNG ที่สร้างขึ้นกลับผ่านเซิร์ฟเวอร์ HTTP
- ใช้ Axum สำหรับเซิร์ฟเวอร์ HTTP
- ใช้ rust-skia สำหรับการเรนเดอร์ PNG
- Skia เป็นไลบรารีกราฟิกพื้นฐานของ Chrome ด้วย จึงใช้เทคนิคการเรนเดอร์ได้โดยมีภาระน้อยกว่า Puppeteer
- โค้ดเซิร์ฟเวอร์สุดท้ายมีประมาณ 1,200 บรรทัด และมีการสรุปเฉพาะส่วนสำคัญ
ดึงข้อมูลจาก Stop Monitoring API ของ 511.org
- Stop Monitoring API ของ 511.org ให้ข้อมูลเวลามาถึง·ออกเดินทางโดยประมาณของป้ายในเขตอ่าว ทั้งในรูปแบบ XML และ JSON
- endpoint ที่ใช้มีรูปแบบ
http://api.511.org/transit/StopMonitoring/…] agencyใช้ระบุหนึ่งในผู้ให้บริการขนส่งสาธารณะ 27 รายในเขตอ่าว โดยโค้ดของ SF MUNI คือSF- API ดึงข้อมูลได้ครั้งละหนึ่งผู้ให้บริการเท่านั้น
- ส่งกลับเวลามาถึงของป้ายเดียว หรือข้อมูล ทุกป้าย ของผู้ให้บริการรายนั้น
- ไม่พบวิธีดึงข้อมูลหลายป้ายแบบเป็น subset ในครั้งเดียว
- ขีดจำกัดของ API 511.org คือ 60 คำขอต่อชั่วโมง ดังนั้นวิธีร้องขอหลายครั้งแยกตามป้ายจึงไม่เหมาะกับการแสดงผลแบบเรียลไทม์
- เมื่อร้องขอข้อมูลทั้งหมดของ SF MUNI คำขอ HTTP ใช้เวลาประมาณ 5 วินาที และส่งข้อมูลกลับมาประมาณ 27 MiB โดย JSON ที่จัดรูปแบบแล้วมีมากกว่า 1 ล้านบรรทัด
- ในการตอบกลับทั้งหมดมีรายการ
MonitoredStopVisitประมาณ 26k รายการ แต่หน้าจอจริงต้องใช้เพียงLineRef,DirectionRef,DestinationName,StopPointRef,ExpectedArrivalTime,DestinationDisplayของป้ายและสายที่กำหนด
รายละเอียดปลีกย่อยที่พบในการประมวลผลข้อมูลด้วย Rust
- ใช้
reqwest,serde,serde_json,chrono,tokio,eyreเพื่อประกอบการร้องขอ HTTP, การพาร์ส JSON, การคำนวณเวลา, การทำงานแบบอะซิงโครนัส และการจัดการข้อผิดพลาด - ตรวจสอบ ID ป้าย MUNI ได้จากหน้าป้ายบนเว็บไซต์ SF MUNI
- เช่น Persia Ave & Paris St มี
15918สำหรับ inbound และ15919สำหรับ outbound แยกกัน - ป้าย MUNI มี ID แยกตามทิศทาง
- เช่น Persia Ave & Paris St มี
- การตอบกลับของ 511.org แนบ UTF-8 Byte Order Mark ไว้หน้า JSON และหากพาร์สด้วย
.json()ทันทีจะเกิดข้อผิดพลาดexpected value at line 1 column 1 - เมื่ออ่านการตอบกลับเป็นสตริง UTF-8 ด้วย
.text()แล้ว BOM จะถูกลบออก จึงพาร์สด้วยserde_json::from_strได้ - หลังกรองแล้วเหลือข้อมูลเวลามาถึงราว 20 รายการของป้ายที่สนใจ ทำให้จัดการได้ง่ายกว่ารายการ 26k ในตอนแรกมาก
- จัดกลุ่มตาม
LineRefและDirectionRefเรียงตามExpectedArrivalTimeแล้วแปลง timestamp แบบ UTC เป็นรูปแบบ “อีกกี่นาที”
สร้าง PNG สำหรับ Kindle ด้วย Skia
- การเรนเดอร์ PNG ใช้
skia-safe - สร้างบิตแมป
Gray8ให้ตรงกับขนาดหน้าจอ Kindle คือ 1024x758 เติมพื้นหลังเป็นสีขาว แล้ววาดข้อความและเส้น - เริ่มจากสร้างภาพ PNG8 ที่พิมพ์ “Hello World” เพื่อตรวจสอบ pipeline การเรนเดอร์
- จากนั้นใช้ข้อมูลเวลามาถึงปลอมสร้างภาพรูปแบบตารางที่มีสองคอลัมน์ inbound และ outbound
- เมื่อรวมกับข้อมูล API จริง จุดหมายและเวลามาถึงหลากหลายกว่าข้อมูลทดสอบ ทำให้เกิดข้อความทับกันในเลย์เอาต์แบบตายตัว
- เพื่อให้วนทดสอบได้เร็วและเลี่ยงขีดจำกัด API จึงเพิ่มโค้ดชั่วคราวสำหรับแคชการตอบกลับไว้ใน
data.json
ปรับแต่งเลย์เอาต์การแสดงผล
- หน้าจอข้อมูลจริงในช่วงแรกอ่านยาก เพราะแต่ละแถวมีปริมาณข้อมูลที่ต้องแสดงต่างกัน
- สิ่งที่ปรับปรุงมีดังนี้
- จัดเวลามาถึงชิดขวาเพื่อลดพื้นที่ว่างท้ายตาราง
- เอา
minหลังเวลาแต่ละตัวออก และใส่minไว้เฉพาะท้ายรายการ - แสดงเฉพาะรถ 3 คัน ถัดไป
- เลื่อนชื่อจุดหมายไปทางขวาเพื่อรองรับชื่อสายที่ยาว
- ต่อมาคำนวณขอบเขตข้อความด้วย
measure_strเพื่อแสดง ID สายเป็นกล่องคำพูดกลมสีเทา - วางสตริงจุดหมายไว้ห่างจากขอบขวาของกล่องคำพูด ID สาย 15 พิกเซล
- ด้านบนเพิ่มเฮดเดอร์สีเทาอ่อน และจัด
Muni Inbound,Muni Outboundให้อยู่กึ่งกลาง
ให้บริการ PNG ด้วย Axum
- สร้างเซิร์ฟเวอร์ HTTP ด้วย
Axum 0.7และส่ง PNG ที่ route/stops.png - ตั้งค่า header การตอบกลับเป็น
Content-Type: image/png - ตอนแรกตรวจสอบ HTTP 200 ด้วย body ว่าง จากนั้นเชื่อมฟังก์ชันสร้างภาพให้ส่งคืนไบต์ PNG จากหน่วยความจำโดยตรง
- เมื่อใช้
wgetบน Kindle ดึงภาพมาแสดงด้วยeipsตอนแรกพบปัญหาภาพหมุนและถูกตัด - Kindle ใช้งานแนวตั้งเป็นค่าเริ่มต้น ดังนั้นหากต้องการให้ดูเป็นหน้าจอแนวนอน ต้องใช้เมทริกซ์หมุนก่อนเรนเดอร์
- สลับขนาดภาพเป็น
(758, 1024) - หมุนแคนวาส
90.0องศา
- สลับขนาดภาพเป็น
ฟีเจอร์ที่เพิ่มในเวอร์ชันใช้งานจริง
- เวอร์ชันใช้งานจริงเพิ่มฟีเจอร์ต่อไปนี้
- ระบบแคช ที่ดึงข้อมูล API ต่อเนื่องในเบื้องหลัง เพื่อให้เซิร์ฟเวอร์ HTTP ตอบสนองได้รวดเร็ว
- การแสดงเวลาไว้ที่มุมล่างซ้าย และสถานะแคชข้อมูลไว้ที่มุมล่างขวา
- anti-aliasing
- การตัดชื่อจุดหมายไม่ให้ทับกับพื้นที่เวลามาถึง
- การใช้สีเทาต่างกันตามสาย เพื่อให้แยกได้รวดเร็ว
- การตั้งค่าผ่านไฟล์ config
- หากเกิดข้อผิดพลาด ให้เรนเดอร์ข้อผิดพลาดและเชน
.source()เป็น PNG เพื่อดูได้ทันทีบน Kindle
- โค้ดเซิร์ฟเวอร์แบบย่อที่ทำร่วมกันอยู่ที่ transit-kindle-simplified
- โค้ดเซิร์ฟเวอร์ที่ขับ Kindle ติดผนังจริงอยู่ที่ transit-kindle
- เวอร์ชันที่อิงสกรีนช็อต BART ทำงานได้ราวเดือนกุมภาพันธ์ 2023 และการปรับ UI ขั้นสุดท้ายของเวอร์ชันที่เขียนใหม่ด้วย Rust เสร็จในเดือนมกราคม 2024
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ฉันทำงานอยู่ที่องค์กรไม่แสวงหากำไรเบื้องหลัง OneBusAway โดย OneBusAway เป็นโปรเจกต์โอเพนซอร์สที่มีผู้คนหลายล้านคนใช้ทุกวันเพื่อตรวจสอบตำแหน่งและเวลาเดินทางมาถึงของรถบัส รถไฟ รถราง และ funicular
ถ้าเป็นเมืองที่มีเซิร์ฟเวอร์ OneBusAway อยู่แล้ว ก็สามารถใช้ SDK ใหม่เพื่อสร้างแอปแบบกำหนดเองได้: https://github.com/onebusAway/?q=sdk&type=all&language=&sort...
ถ้าเป็นเมืองที่ยังไม่มีเซิร์ฟเวอร์ ก็สามารถใช้ Docker image และการตั้งค่า OpenTofu ที่ทำไว้ในปีนี้เพื่อแปลงฟีด GTFS/GTFS-RT ให้เป็น REST API ได้
BART ก็ให้บริการ GTFS และ GTFS-RT เช่นกัน: https://mobilitydatabase.org/feeds/mdb-53
หน่วยงานขนส่งสาธารณะอื่น ๆ ในสหรัฐก็อยู่ในสถานการณ์ที่อย่างน้อยต้องเผยแพร่ข้อมูลตารางเวลาแบบคงที่ในรูปแบบ GTFS ตามกฎของรัฐบาลกลางใหม่
เรายินดีต้อนรับนักพัฒนาที่อยากมีส่วนร่วมกับซอฟต์แวร์ที่เกี่ยวข้องเสมอ โดยเฉพาะ นักพัฒนา iOS ที่จำเป็นมากเพื่อช่วยปรับปรุงประสบการณ์ให้ผู้ใช้วันละ 250,000 คน ติดต่อได้ที่ aaron@onebusaway.org
Docker: https://github.com/OneBusAway/onebusaway-docker / OpenTofu: https://github.com/OneBusAway/onebusaway-deployment
เมืองของฉันเองก็อยากเพิ่มเข้าไปเหมือนกันถ้าขั้นตอนไม่ยุ่งยากนัก ช่วงหลังดูเหมือนจะทุ่มเวลาเชิงวิศวกรรมไปกับการรองรับไลบรารีและ SDK มากพอสมควร แต่ดูแล้วน่าจะดีกว่าถ้าลงทุนกับ เส้นทางที่ง่ายในแง่ประสบการณ์นักพัฒนา เพื่อให้ผู้ร่วมพัฒนาใหม่เริ่มลงมือได้สะดวก
ตัวอย่างเช่น เอกสารนี้ค่อนข้างซับซ้อน: https://github.com/OneBusAway/onebusaway/wiki/Multi-Region
มันบอกว่า “จะมาถึงใน 4 นาที” แต่รถบัสกลับออกไปต่อหน้าต่อตา หรือบอกว่า “ล่าช้า 5 นาที” แต่จริง ๆ ดันมาเร็วกว่าเวลา 2 นาที บางทีก็ไม่มาเลย
เดาว่าน่าจะเป็นปัญหาจากข้อมูลต้นทาง แต่อยากรู้รายละเอียดวงในว่ามันไม่น่าเชื่อถือได้เพราะอะไร อ้างอิงจากประสบการณ์ใน Seattle
ทั้ง BART และ MUNI รองรับ General Transit Feed Specification และมีวิธีมาตรฐานในการดึงข้อมูลนี้
https://gtfs.org/documentation/overview/#gtfs-realtime
ชอบมากจริง ๆ เมื่อก่อนตอนอยู่ Boston โดยไม่มีรถ ฉันเคยต่อของแบบบ้าน ๆ ที่แย่กว่านี้มากขึ้นมาเอง เพื่อจัดการกรณีที่มีหลายวิธีในการไปจาก A ไป B และคำว่า “ดีที่สุด” เปลี่ยนไปตามเวลาหรือสถานที่ที่ต้องแวะระหว่างทาง
เช่น ก่อนออกไปทำงานฉันต้องพาลูกชายไปส่งที่โรงเรียน และบางครั้งก็แวะกินเช้าหลังส่งเสร็จ ถ้ามีฟีเจอร์ ดูเวลาออกเดินทางถัดไป มันจะช่วยให้ตัดสินใจได้ยืดหยุ่นขึ้นมาก ในสถานการณ์ที่คาดเดาไม่ได้อย่างการเดินเล่นกับเด็ก 4 ขวบในที่น่าสนใจ หรือจะต้องรีบเพื่อให้ทันรถไฟขบวนที่ถ้าพลาดแล้วจะมีช่วงห่างระหว่างขบวน
แปลกใจที่ยังไม่มีใครพูดถึง https://oeffi.schildbach.de/index.html ทั้งที่มันทำสิ่งที่ต้องการตรงนี้ได้พอดี
https://play.google.com/store/apps/details?id=nl.skywave.ovi... / https://apps.apple.com/nl/app/ovinfo/id1144468923
https://drgl.nl/
https://www.rijdendetreinen.nl/
https://spoorkaart.mwnn.nl/
มันดีกว่าแอปทางการมาก และแสดงข้อมูลที่ต้องการที่สุดได้ทันที คือป้ายรถเมล์ใกล้ที่สุดกับเวลาจริงของรถบัสคันถัดไป
ถ้าอยู่ในสหราชอาณาจักร คุณสามารถซื้ออุปกรณ์ป้ายแสดงเวลาออกเดินทางที่เลียนแบบบอร์ดประกาศเวลาออกจากสถานีได้
https://ukdepartureboards.co.uk/store/product/desktop-depart...
https://tramli.ch/en
ฉันก็อยู่ที่ SF เหมือนกัน และได้ทำแอป iOS ชื่อ A Better Ride เพื่อแก้ปัญหาเดียวกัน
มันแสดงเฉพาะเวลาออกเดินทางของขนส่งสาธารณะจากป้ายใกล้ตัว เป้าหมายคือทำให้การใช้ขนส่งสาธารณะคาดเดาได้และสำรวจได้ง่ายขึ้นเพื่อลดความเครียด เป็นโปรเจกต์ส่วนตัวที่ทำในเวลาว่างโดยไม่ได้หารายได้จากมัน
ทำให้คุณสำรวจสถานที่ที่ไปถึงได้โดยไม่ต้องกังวลเรื่องการต่อรถ
ฉันเองก็ทำฮาร์ดแวร์ในสายนี้อยู่และเพิ่งทำงานกับ GTFS ไปเยอะ เลยเห็นได้ทันทีว่าต้องใช้แรงมากแค่ไหนในการพาร์สและแสดงข้อมูลการเดินทาง
ถ้าคุณโอเค ฉันอยากคุยเรื่องการตัดสินใจด้าน UX ในการสรุปและจัดกลุ่มตัวเลือกการเดินทางจากแต่ละป้าย รวมถึงเรื่องแบ็กเอนด์ด้วย
ไม่จำเป็นต้องเจลเบรก Kindle หรือเรนเดอร์ภาพก็ได้
แค่เปิดหน้าเว็บที่ทำเองด้วยเบราว์เซอร์บน Kindle แล้วใช้คำสั่งดีบักเพื่อปิดโฆษณา “สกรีนเซฟเวอร์” หรือหน้าจอพักของ Kindle
แม้ว่าแถบเบราว์เซอร์จะยังค้างอยู่ที่ขอบด้านหนึ่งของ Kindle แต่คุณสามารถหมุนเครื่องให้มันไปอยู่ด้านล่างหรือด้านขวาได้ จากนั้นก็ทำหน้าจออากาศ·การจราจร·ข่าวด้วย HTML/CSS/JS แบบง่ายๆ และใช้ภาษาแบ็กเอนด์อะไรก็ได้ตามต้องการ แล้วรันมันบนที่อย่างอินสแตนซ์ราคา 4 ดอลลาร์ของ DigitalOcean ก็พอ
https://blog.notfaqs.com/2018/06/kindle-e-reader-disable-scr...
https://www.mobileread.com/forums/showthread.php?t=198334
ใช้
document.documentElement.requestFullscreen()เพื่อเข้าเต็มจอจริงๆ จนไม่เห็นแม้แต่แถบสถานะ และเพราะ API ขนส่งสาธารณะในพื้นที่เข้าถึงได้จากหน้าเว็บโดยตรง ก็เลยไม่ต้องมีแบ็กเอนด์เลยแต่ถ้าทำให้มันคุยกับเซิร์ฟเวอร์ในเครือข่ายท้องถิ่นก็น่าจะพอไหว
ฉันคิดว่าคุณอาจยังไม่เข้าใจกรณีใช้งานนี้นัก ไม่ใช่ว่าอยาก “ขึ้นรถไฟ” แต่คืออยากไปจาก A ไป B
ถ้ารถไฟเสีย มีการนัดหยุดงาน เส้นทางปิดช่วงบ่าย 1 ถึง 4 โมง หรือยังไม่ถึงเวลาวิ่ง ฉันก็อยากได้ทางเลือกอื่น นั่นจึงเป็นเหตุผลว่าทำไมสำหรับฉัน สิ่งที่ Google Maps ให้หรือพยายามจะให้จึงจำเป็น
ถ้าจะไป Oakland จาก Ferry Building แล้ว BART เสีย เรือเฟอร์รี่อาจดีกว่า และถ้าดึกมากแล้วก็อาจเหลือแค่แท็กซี่หรือ Uber
ถ้าอยู่ที่ Tokyo แล้วจะไป Azabujuban จาก Shibuya ก็มีตัวเลือกอย่าง Ginza Line→Namboku Line, Hanzomon Line→Oedo Line, Yamanote Line→Namboku Line, รถบัสสาย 6, แท็กซี่ ฯลฯ
และระหว่างสถานีแต่ละสายกับป้ายรถบัสก็ต้องเดินอีก 3-8 นาที ซึ่งความใกล้กับจุดไหนในตอนนั้นก็มีผลต่อการเลือก นอกจากนี้ยังขึ้นอยู่กับว่าคุณสายหรือไม่ หรือมีกระเป๋าใหญ่และหนักแค่ไหน
เช่น เวลาไปบางที่ คุณนั่งรถบัสสาย 39 แล้วเดิน 15 นาทีก็ถึง แต่ถ้าถาม Google มันจะให้เส้นทางที่ต้องต่อรถ 2 ครั้ง ถ้าโชคดีก็แค่ใช้เวลาใกล้เคียงกับขึ้นรถบัสครั้งเดียวแล้วเดิน
เพราะงั้นถ้าฉันอยากรู้ว่ารถบัสสาย 39 จะมาตอนไหน ฉันต้องตั้งใจบอกจุดหมายปลายทางเป็นที่อื่น
อีกอย่าง ในที่ที่ฉันอยู่ ข้อมูลเรียลไทม์ของ Google ก็ดูน่าสงสัย และข้อมูลจากผู้ให้บริการหรือบางแหล่งข้อมูลภายนอกกลับน่าเชื่อถือกว่า
บางครั้งก็มีสถานการณ์ที่ต้องวางแผนแบบซับซ้อนแบบเรียลไทม์ และเครื่องมือแบบนั้นก็ดี แต่การเดินทางประจำวันครอบคลุมได้ด้วยเครื่องมือที่ง่ายกว่ามาก
ตัวอย่าง Tokyo ที่ยกมาก็น่าสนใจ แต่ตามเกณฑ์ของ Google ตัวเลือกขนส่งสาธารณะส่วนใหญ่ใช้เวลา 30-40 นาทีพอๆ กัน จึงแทบเท่ากันสำหรับการวางแผนคร่าวๆ แท็กซี่เร็วกว่า และจักรยานก็ใกล้เคียงกันมาก
ถ้ารถไฟเสียหรือมีการนัดหยุดงาน มันก็จะเห็นได้จากช่องว่างที่ไม่คาดคิดในรายการรถไฟแบบเรียลไทม์
ตอนเดินทางไปรอบเมือง ฉันจะเปิด Google Maps แล้วใส่จุดหมาย แต่ตอนออกจากบ้านไปที่ที่เคยไปมาแล้ว 500 ครั้ง ฉันไม่จำเป็นต้องเปิดมันเลย
มันมีความหมายพอๆ กับการพูดถึงการช็อปปิ้งหรือการกินข้าวโดยอิงจากประสบการณ์ใน Disneyland เท่านั้น แค่แตะ Suica ก็เร็วกว่าอีกหลายที่หลายเท่าแล้ว และบางที่ก็ไม่มีระบบรองรับแบบนั้นตั้งแต่แรก
มันมีฟีเจอร์เยอะ แต่ฉันไม่รู้ว่ารองรับ Tokyo ดีแค่ไหน ใน London ถ้าคุณบอกให้พากลับบ้าน มันจะแสดงหลายวิธีโดยปรับให้เหมาะตามค่าใช้จ่าย ระยะเดิน ความเร็ว การต่อรถ การเข้าถึง และอื่นๆ
กำลังใช้อะไรที่คล้ายกันอยู่ โดยนำแท็บเล็ต/อุปกรณ์ห้องประชุม Lenovo ThinkSmart View ที่นำกลับมาใช้ใหม่มาต่อกับ Home Assistant และระบบของหน่วยงานขนส่งท้องถิ่น
ข้อดีคือพร้อมใช้งานได้ทันทีมากกว่าเยอะ แน่นอนว่าต้องลง custom Android ROM บน Lenovo แต่ก็สามารถแสดงอะไรก็ได้ตามต้องการ และควบคุมสิ่งต่าง ๆ อย่างไฟหรือหุ่นยนต์ดูดฝุ่นก็ได้
ยังมีผลิตภัณฑ์สวย ๆ ที่ทำแผนที่ BART เป็นป้าย LED แบบกายภาพด้วย: https://www.designrules.co/