2 คะแนน โดย GN⁺ 2023-11-28 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • หลังจากลูกสาววัยสองขวบหลงใหลเครื่องบิน ผู้เขียนจึงทำแอป iOS ชื่อ Aviator เป็นโปรเจกต์ข้างในช่วงไม่กี่เย็น เพื่อแสดงเครื่องบินรอบตัวเหมือนเป็น เรดาร์บนมือถือ
  • แม้ FlightRadar24 จะแสดงตำแหน่งเครื่องบินบนแผนที่ได้ แต่ยังต้องคอยตัดสินเองว่า ควรมองไปทางไหนบนท้องฟ้า และลำไหนที่เด็กน่าจะหาเจอได้ง่าย
  • แอปรวมข้อมูลทิศทางจาก Core Location, REST API สำหรับใช้งานไม่เชิงพาณิชย์ของ OpenSky Network, annotation ของ MapKit และ UI ของ SwiftUI เพื่อแสดงเครื่องบิน ให้สอดคล้องกับทิศของอุปกรณ์
  • หลังยืนยันใน MVP test ว่าเครื่องบินจริงกับที่แอปแสดงตรงกัน ก็เพิ่มการซ่อนแผนที่, ขยายเครื่องบินที่บินต่ำ, แอนิเมชันเรดาร์, เอฟเฟกต์ CRT, เสียง·haptic และการตั้งค่าสี
  • แอปเวอร์ชันสุดท้ายถูกเผยแพร่บน App Store แล้ว และยังมีรายการปรับปรุงต่อไป เช่น ระดับการซูม, OpenSky advanced API, การแสดงประเทศต้นทาง·ปลายทาง, ปรับปรุง Metal shader, ฟิลเตอร์ระยะทาง·ความสูง และ “zany mode”

จากการดูเครื่องบินสู่ข้อกำหนดของแอป

  • ลูกสาวตั้งตารอการนั่งเครื่องบิน 3 ชั่วโมงสำหรับทริปต่างประเทศช่วงฤดูร้อน และหลังจากได้ชม ห้องนักบิน ตามคำแนะนำของลูกเรือ ก็ยิ่งหลงใหลเครื่องบินมากขึ้น
  • หลังจากนั้นเธอมักขอให้ช่วยหาเครื่องบินบนฟ้า จนถึงขั้นมีช่วงที่ผู้เขียนต้องอุ้มพาขึ้นบ่าอยู่ในสวนเป็นชั่วโมงเพื่อช่วยมองหาเครื่องบินยามเย็น
  • FlightRadar24 แสดงตำแหน่งเครื่องบินบนแผนที่ได้ แต่ผู้ใช้ยังต้องจับคู่เองว่าในท้องฟ้าจริงควรมองไปทางไหน
  • บนแผนที่ 2 มิติ Learjet ที่ระดับ 40,000 ฟุต กับ AirBus ที่เพิ่งทะยานขึ้นจาก London City Airport อาจดูคล้ายกัน แต่บนท้องฟ้าจริง เครื่องบินลำใหญ่ที่บินต่ำจะหาเจอได้ง่ายกว่า
  • สิ่งที่เด็กวัยสองขวบต้องการไม่ใช่การตีความแผนที่ แต่คือการ หาเครื่องบิน แบบง่าย ๆ
  • ปัญหาเริ่มต้นสรุปได้เป็น 3 ข้อ
    • การจับทิศทาง: ตำแหน่งเครื่องบินต้องสอดคล้องกับทิศบนท้องฟ้าจริงตามทิศของอุปกรณ์
    • การแสดงขนาด: ขนาดบนหน้าจอต้องเปลี่ยนตามระดับความสูงของเครื่องบิน
    • การใช้งาน: แอปนี้ควรให้ความรู้สึกเหมือนของเล่นเรโทร ไม่ใช่แอปติดตามเที่ยวบินสำหรับงานอาชีพ

การออกแบบ Aviator ระยะแรก

  • ไอเดียของแอปคือ “แสดงเที่ยวบินรอบตัวบนเรดาร์” และตั้งชื่อโปรเจกต์ว่า Aviator
  • ความต้องการหลักมี 3 ข้อ
    • เมื่อหมุนอุปกรณ์ หน้าจอก็ต้องหมุนตามเพื่อให้เครื่องบินแสดงในทิศที่ถูกต้อง
    • ขนาดของเครื่องบินบนจอต้องต่างกันตามระดับความสูง
    • ต้องให้ความรู้สึกสนุกแบบของเล่นเรโทรที่เหมาะกับเด็ก
  • การจัดการทิศทางใช้ heading update ของ iOS Core Location API
    • รับทิศของอุปกรณ์จาก didUpdateHeading ของ CLLocationManagerDelegate
    • ส่งค่าทิศทางไปยัง SwiftUI view ด้วย CurrentValueSubject ของ Combine
  • ข้อมูลการบินใช้ OpenSky Network
    • เป็น REST API แบบเรียบง่ายที่ให้ข้อมูลการบินแบบเรียลไทม์ในช่วงละติจูด·ลองจิจูดที่กำหนด
    • ใช้งานฟรีสำหรับกรณีไม่เชิงพาณิชย์
    • มีแผนจะเรียก endpoint ทุกไม่กี่วินาทีเพื่อให้ได้เอฟเฟกต์เรดาร์กวาดแบบสมจริง
  • ข้อมูลตำแหน่งได้จาก Core Location แล้วนำไป query ช่วงละติจูด·ลองจิจูดรอบตำแหน่งผู้ใช้
    • ในแนวคิดแรกตั้งใจใช้ละติจูด ±1 องศา และลดความแม่นยำตำแหน่งเหลือ 0.1 องศา หรือราว 10 กม. เพื่อทำให้ตำแหน่งผู้ใช้พร่าพอสมควร
    • แต่ในโค้ดตัวอย่างของ API จริง ใช้ช่วงละติจูด 0.5 องศา และลองจิจูด 1 องศา เพื่อให้ได้พื้นที่ใกล้เคียงสี่เหลี่ยมจัตุรัสในละติจูดของสหราชอาณาจักร
  • เนื่องจาก OpenSky Network API จำกัดไว้สำหรับการใช้งานไม่เชิงพาณิชย์ และตัวแอปก็ไม่ใช่บริการเชิงพาณิชย์ ในฝั่ง SwiftUI จึงใช้โครงสร้าง MV แบบง่ายและแยกเฉพาะ service หลักอย่าง API กับ Location ออกมา

PoC: ตรวจสอบทิศทาง ข้อมูลการบิน และแผนที่

  • PoC ด้านทิศทางใช้ singleton LocationManager เพื่อขอสิทธิ์ตำแหน่ง ตั้งค่า delegate และเริ่มรับ heading update
  • SwiftUI view subscribe rotationAngleSubject ผ่าน .onReceive แล้วจัดวางสี่เหลี่ยมเป็นวงกลมเพื่อให้หมุนเหมือนเข็มทิศ
  • บนอุปกรณ์ทดสอบ มันตอบสนองต่อการเปลี่ยนตำแหน่งจริงได้ดี แต่เกิด visual glitch ตอนผ่านทิศเหนือจริง เพราะแอนิเมชันมอง 0 องศากับ 360 องศาเป็นคนละค่า ทำให้สี่เหลี่ยมหมุนครบหนึ่งรอบ
  • OpenSky REST API ส่งคืนอาร์เรย์เที่ยวบินในพื้นที่จาก GET request ที่ระบุช่วงละติจูด·ลองจิจูด
    • ตัวอย่าง endpoint ใช้วิธีเรียก states/all พร้อมพารามิเตอร์ lamin, lamax, lomin, lomax
    • เอกสาร REST API ทำไว้ดี แต่ response เป็นโครงสร้างที่ไม่มี key จึงต้อง parse ฟิลด์ JSON ตามลำดับ
    • ใช้ UnkeyedContainer ของ Swift เพื่อ decode ค่าอย่าง icao24, callsign, origin_country, time_position, last_contact, longitude, latitude เป็นต้น
  • การลองวาดเครื่องบินครั้งแรก ใช้วิธีนำผลต่างละติจูด·ลองจิจูดระหว่างผู้ใช้กับเครื่องบินไปคูณด้วยสเกลหน้าจอคงที่ แล้ววางรูป airplane ของ SF Symbol
    • ระยะจริงของละติจูด·ลองจิจูด 1 องศาเปลี่ยนไปตามตำแหน่ง จึงไม่อาจแม่นยำนัก
    • แต่ก็มีประโยชน์ในฐานะจุดเริ่มต้น
  • เพื่อทดสอบความแม่นยำ จึงวาง Map ของ SwiftUI เป็นพื้นหลัง แล้วซ้อนเครื่องบินและเข็มทิศไว้ด้านบน
    • เมื่อเทียบกับ projection ของ FlightRadar จำนวนเครื่องบินและการกระจุกตัวใกล้เคียงกัน แต่ตำแหน่งคลาดเคลื่อนพอสมควร
    • หลังจากนั้นจึงเปลี่ยนไปวาดเครื่องบินเป็น annotation บนแผนที่โดยตรง

MVP: annotation ของ MapKit และการทดสอบกับผู้ใช้

  • เมื่อกำหนดเป้าหมายเป็น iOS 17 จึงใช้ความสามารถด้าน map annotation ของ MapKit เพื่อแสดง marker รูปเครื่องบินบนพิกัดภูมิศาสตร์จริง
  • FlightMapView วาด annotation ของเครื่องบินบน Map(position:) และปิดการโต้ตอบกับแผนที่ด้วย .allowsHitTesting(false) เพื่อให้เหมาะกับการใช้งานแบบเรดาร์
  • การปรับขนาดตามระดับความสูง ช่วงแรกใช้ log scale เพื่อให้เครื่องบินที่บินสูงดูใหญ่กว่า
    • นำ true_track ของเครื่องบินมารวมกับทิศของผู้ใช้จาก Core Location เพื่อปรับทิศของไอคอนเครื่องบิน
  • ในการทดสอบผู้ใช้กับ MVP ครั้งแรก ผู้เขียนกับลูกสาวสามารถหาเครื่องบินจริงได้ และยืนยันว่าเครื่องบินที่แสดงในแอปมองเห็นได้จริงบนท้องฟ้า
  • หลังการทดสอบพบจุดที่ต้องแก้ 2 อย่าง
    • การปรับขนาดกลับด้าน: ถ้าต้องการแสดงเครื่องบินที่มองหาได้ง่ายด้วยตาเปล่า เครื่องบินที่บินต่ำควรใหญ่กว่า
    • ลูกสาวต้องการเห็นแค่เครื่องบิน ไม่ใช่แผนที่ จึงต้อง เอาแผนที่ออก เพื่อลดสิ่งรบกวน
  • สูตร scale ที่แก้แล้วคือ min(2, max(4.7 - log10(flight.geo_altitude + 1), 0.7))
    • ในการสแกนท้องฟ้าแถวบ้าน ได้ค่าตั้งแต่ 0.7 ถึง 2.0 และการกระจายบนหน้าจอดูเหมาะสมดี

สร้าง UI แบบเรดาร์

  • OpenSky API มักส่ง timeout, 502 Bad Gateway และ response 200 ที่มีข้อมูลเป็น null กลับมา
    • เพราะเป็น API ฟรีสำหรับงานไม่เชิงพาณิชย์และไม่มี SLA จึงเพิ่ม retry logic พื้นฐานไว้ฝั่ง client
    • วันถัดมามันทำงานได้ดีตลอดวัน และดูเหมือนจะมีปัญหาเฉพาะบางช่วงเวลาที่ทราฟฟิกสูง
  • เพื่อซ่อนแผนที่จริง ใช้ overlay MapPolygon
    • เดิมเป็น overlay สำหรับเน้นพื้นที่บนแผนที่ แต่ถูกนำมาใช้ปิดแผนที่ไว้โดยคงเหลือเฉพาะ annotation ของเครื่องบิน
    • overlay ของ Apple ถูกวาดอยู่เหนือแผนที่และใต้ annotation จึงได้ผลลัพธ์ตามต้องการ
  • หน้าจอเรดาร์ทำจากเส้น วงกลมร่วมศูนย์กลาง และ angular gradient แบบหมุนกว้าง 20 องศา
  • ต่อมาลดความซับซ้อนของเอฟเฟกต์เส้นเรดาร์เป็น angular gradient 360 องศา
    • ใช้ gradient จากสีเขียวไปโปร่งใสแล้วต่อด้วยสีดำ หมุนไปมาให้ดูเหมือนการกวาดและภาพตกค้าง
    • ผู้เขียนมองว่าวิธีแบบ “grug-brained” มักเหมาะกว่าในหลายครั้ง
  • ตอนหมุนอุปกรณ์เร็ว ๆ มี visual artifact ที่เห็นเศษแผนที่โผล่ตรงมุมหน้าจอ และแก้ด้วย reverse mask ที่ปิดพื้นที่นอก radar view เป็นสีดำ

ทำเป็นผลิตภัณฑ์: เอฟเฟกต์ CRT เสียง การตั้งค่า และ App Store

  • เพื่อให้ได้อารมณ์ของเล่นเรโทร จึงเพิ่มเอฟเฟกต์หน้าจอ CRT
    • ใช้การรองรับ Metal shader ที่มีมาให้ใน colorEffect ของ iOS 17
    • shader จะใส่ค่า scanline ให้กับพิกเซลที่ไม่ใช่สีดำ
    • ใส่พารามิเตอร์ time เพื่อให้ scanline เคลื่อนขึ้นด้านบนอย่างรวดเร็วและดูมีชีวิตชีวา
  • ผู้เขียนสอบถาม OpenSky Network ว่านโยบายอนุญาตให้นำแอปขึ้น App Store ได้หรือไม่ และได้รับอีเมลตอบกลับภายใน 20 นาที
  • เพื่อเพิ่มประสบการณ์เรดาร์และการเข้าถึง จึงเพิ่มเสียงระบบและ haptic เมื่อข้อมูลเที่ยวบินอัปเดต
    • ใช้ AudioServicesPlaySystemSound(1052) เพื่อเล่นเสียง beep-boop
    • ใช้ sensoryFeedback(.levelChange, trigger:) ของ SwiftUI
  • เนื่องจากเสียงอาจรบกวน จึงเพิ่มการตั้งค่าแบบ @AppStorage
    • silent: โหมดเงียบ
    • showMap: ปิด radar overlay เพื่อดูแผนที่ด้านล่างได้
    • userColor: เลือกสีเรดาร์ด้วย SwiftUI color picker
  • เพราะยกเลิกสมาชิก Midjourney ไปแล้ว ผู้เขียนจึงใช้ตัวสร้างภาพฟรีแบบไม่เชิงพาณิชย์ของ Gencraft เพื่อทำ มาสคอต Aviator ที่ให้ความรู้สึกเหมือนลูกสาวสวมหมวกนักบิน
  • ผู้เขียนสมัคร Apple Developer Program ใหม่และจ่าย £79 เพื่อเตรียมปล่อยแอปบน App Store
    • แม้จะรองรับเฉพาะ iOS 17 แต่ก็ยังต้องส่งภาพหน้าจอ iPhone ขนาด 6.5 นิ้วและ 5.5 นิ้ว
    • เนื่องจาก iPhone 8 Plus ซึ่งเป็น iPhone ขนาด 5.5 นิ้วรุ่นล่าสุดรองรับได้สูงสุดแค่ iOS 16 จึงใช้ AppScreens ในการส่งออกภาพหน้าจอทั้งสองขนาด
  • แอปถูกนำขึ้น App Store แล้ว ลิงก์ดาวน์โหลดคือ Aviator — Radar on your Phone

ตัวเลือกสำหรับเวอร์ชันถัดไป

  • ผู้เขียนพอใจกับผลลัพธ์ของ side project ที่ทำในช่วงไม่กี่เย็น และบอกว่านี่เป็นประสบการณ์เขียนโค้ดที่สนุกที่สุดในรอบนาน เพราะได้ทำของเล่นให้ลูกสาว
  • ฟีเจอร์ที่อาจใส่ในรีลีสถัดไปมีดังนี้
    • เพิ่มระดับการซูมของแผนที่เพื่อจำกัดเรดาร์ให้แสดงเฉพาะเครื่องบินที่ใกล้กว่า
    • ใช้ OpenSky Network advanced API เพื่อแสดงเฮลิคอปเตอร์ ดาวเทียม และระดับขนาดของเครื่องบิน
    • เพิ่มตัวเลือกเปิดปิดการแสดงประเทศต้นทาง·ปลายทางของเครื่องบิน
    • ปรับปรุงเอฟเฟกต์หน้าจอ CRT ด้วย Metal shader ที่ซับซ้อนขึ้น
    • รีแฟกเตอร์คอนโทรลให้เป็น pull-out modal แบบ progressive disclosure ที่ปรับขนาดได้
    • ทำฟิลเตอร์แบบ slider สำหรับระยะทาง·ความสูง เพื่อซ่อนเครื่องบินที่บินต่ำแต่ไกล เป็นต้น
    • ทำ zany mode ที่เรนเดอร์ UFO แมลงยักษ์ และเอเลียนบนเรดาร์

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

 
GN⁺ 2023-11-28
ความคิดเห็นบน Hacker News
  • งานเจ๋งมาก และบทความก็ดีด้วย น่าสนใจที่การออกแบบของ จอแสดงผลเรดาร์ ดั้งเดิมยึดโยงโปรเจกต์นี้ไว้แน่นแค่ไหน
    เด็กอาจไม่มีโอกาสได้แตะ ASR-9 ที่มีจอ PPI ด้วยซ้ำ ไม่ต้องพูดถึง CRT จริง ๆ แต่ก็ยังทุ่มแรงไม่น้อยเพื่อจำลองสิ่งนั้น
    อาจเป็นเพราะชอบสเกวอมอร์ฟิซึมด้วย แต่ก็ดูเหมือนเป็นเพราะหน้าจอเรดาร์ต้นฉบับย่อคำถามว่า “มีอะไรอยู่บนท้องฟ้าไหม และอยู่ตรงไหนเมื่อเทียบกับฉัน?” ออกมาได้ยอดเยี่ยม
    UI สำหรับดูท้องฟ้าสมัยนี้เหมือนจะมุ่งไปทางข้อมูลบริบท ลิงก์ไปบริการภายนอก และพื้นที่โฆษณา จนเสียความสามารถในการตอบคำถามนี้ได้ง่าย ๆ ไป

    • ชอบตรงที่หน้าจอ RADAR เป็นผลผลิตของเทคโนโลยีที่สร้างมันขึ้นมา คือ การกวาดสัญญาณ แต่ขณะเดียวกันก็เป็นการนำเสนออย่างตั้งใจเพื่อให้เห็นเป้าหมายที่สังเกตได้อย่างชัดเจน
      ระยะของเป้าหมายแสดงด้วยระยะจากจุดศูนย์กลาง ส่วนทิศแสดงด้วยมุมรอบเส้นรอบวง
      แต่ส่วนที่เลียนแบบการกวาดสัญญาณอาจเป็นการออกแบบที่ควรตั้งคำถามได้ และพื้นหลังสีสว่างที่ไม่มีแผนที่ก็ดูไม่เป็นปัญหาเลย เพราะทำให้โฟกัสกับเจตนาของหน้าจอ
      ยังเห็นด้วยว่าฟีเจอร์ติดตามเข็มทิศตอนถือโทรศัพท์หมุนไปมาทำลายภาพลวงตาของการกวาดสัญญาณ
    • ไม่ใช่ว่า UI ดูท้องฟ้าทั้งหมดจะไปทางนั้น SkyMap ก็น่าดู
      https://github.com/sky-map-team/stardroid
    • บริการที่ยังจับประเด็น “มีอะไรอยู่บนท้องฟ้าไหม และอยู่ตรงไหนเมื่อเทียบกับฉัน?” ได้ดีคือ โหมด AR ของ FlightRadar24
      เข้าใจองค์ประกอบทางเทคนิคที่เกี่ยวข้องทั้งหมด และเปิดสถานี ADSB เองด้วย แต่การเล็งกล้องขึ้นฟ้าแล้วเห็นเมทาดาต้าของเครื่องบินในกรอบภาพก็ยังน่าทึ่งอยู่ดี
    • คิดว่าดีตรงที่จุดเริ่มต้นบริสุทธิ์มาก เริ่มจาก “ถ้าจะหาเครื่องบิน ต้องมองไป ทิศทางไหน?” แล้วค่อยต่อยอดจากตรงนั้น
  • ยอดเยี่ยม ใส่ไว้ในลิสต์สิ่งที่สักวันจะทำแล้ว
    คล้าย ๆ กัน ผมทำ สมุดบันทึกการบิน ให้ลูกชายวัย 5 ขวบ และเริ่มตั้งแต่ยังเป็นทารก ทุกครั้งที่บิน ให้เขาถามลูกเรือว่ากัปตันช่วยเขียนให้ได้ไหม
    บันทึกเส้นทางบิน รุ่นเครื่องบิน และเรื่องที่เกิดขึ้น ซึ่งลูกเรือชอบอะไรแบบนี้มาก ได้ไปดูห้องนักบินกับพื้นที่พักของลูกเรือด้วย และข้อความที่เขียนให้ก็น่ารักเสมอ
    ทุกครั้งที่ได้คืน เด็กจะยิ้มหน้าบาน เลยขอแนะนำอย่างยิ่งสำหรับเด็กน้อยสายคลั่งเครื่องบิน

    • พ่อเริ่มทำ สมุดบันทึก ให้ผมตั้งแต่ผมยังเป็นเด็กเล็ก และตอนนี้ผมอายุ 30 กว่าแล้วก็ยังอัปเดตต่ออยู่ ในนั้นมีทุกเที่ยวบินที่เคยขึ้นมา เป็นไอเดียที่เจ๋งมากจริง ๆ
    • ขอเชียร์สมุดบันทึกอีกเสียง ตอนลูกสาวอายุราว 8 สัปดาห์ เราบิน London - New York และยังได้รูปสวย ๆ ในห้องนักบินที่เธอสวมหมวกกัปตันด้วย
    • อัจฉริยะมาก แม้เป็นผู้ใหญ่เต็มตัวแล้ว การได้ รับเชิญเข้าห้องนักบิน ก็ยังเจ๋งสุด ๆ ดังนั้นเที่ยวบินหน้าต้องเริ่มทำแน่
  • ชอบที่ฟีเจอร์จำเป็นของรีลีสแรกมี การเปลี่ยนสีจอแสดงผล อยู่ด้วย แปลว่าเข้าใจความต้องการของกลุ่มผู้ใช้เป้าหมายอย่างแน่นมาก
    เด็ก 3 ขวบก็ชอบของเล่นอะไรก็ตามที่มีตัวเลือกสี

    • ผมเป็นผู้ชายโตแล้วก็ยังตื่นเต้นถ้ามี ตัวเลือกสี อยู่ในนั้น
      ลองนึกถึงความตื่นเต้นแบบไร้เหตุผลตอน karma บน HN เกิน 250 ก็ได้
    • เป็นหนึ่งในคอมโพเนนต์ที่ถูกประเมินต่ำที่สุดใน SwiftUI
      ต่อให้เอาให้เด็กดูวันนี้ สิ่งแรกที่เขาสนใจก็คือการเลือกสี และยังดีต่อพัฒนาการกล้ามเนื้อมัดเล็กด้วย
  • ส่วนที่ว่า “พูดถึงการเดินทางด้วยเครื่องบินไว้ยิ่งใหญ่เกินไป จนลูกแปลกใจที่ต้องนั่งแท็กซี่ไปสนามบิน นึกว่าจะเดินขึ้นเครื่องบินจากบ้านได้เลย” นี่ น่ารักและตลกมาก แต่ก็เข้าใจได้ จริง ๆ

    • ในชุมชน gated community หรู ๆ บางแห่งในฟลอริดา ทำแบบนั้นได้จริง
      https://www.architecturendesign.net/john-travoltas-house-is-...
    • พอถึงขากลับ ดูเหมือนเด็กจะเริ่มเข้าใจลำดับขั้นตอนมากขึ้นแล้ว
  • ตรงที่บอกว่าถ้าลูกเรือเห็นเด็กน้อยสายคลั่งเครื่องบินแสนน่ารัก เขาจะพาไปชมห้องนักบิน ทำให้ชุด จัมป์สูทสีส้มของ NASA แบบเข้าชุดกันกลายเป็นพาสปอร์ตสู่ทุกห้องนักบิน
    ลูกเรือตื่นเต้นกว่าเด็ก ๆ อีก และยังหาเด็กในสนามบินได้ง่ายมากด้วย

    • อัจฉริยะมาก งั้นก็แค่ให้ผมหรือภรรยาได้เข้า NASA ก่อนสินะ ในอวกาศต้องการนักพัฒนา iOS เยอะไหมนะ?
  • บทความ An app can be a home cooked meal ที่โคลนแอปโซเชียลเน็ตเวิร์ก Tapstack ที่ล้มเหลวมาใช้เฉพาะในครอบครัว ก็เกี่ยวข้องเหมือนกัน
    https://www.robinsloan.com/notes/home-cooked-app/

    • เป็นบทความที่ lovely เลยบุ๊กมาร์กไว้ เห็นด้วยว่าต่อให้ยอดดาวน์โหลดเป็น 0 กระบวนการทำเองก็คงคุ้มค่าในตัวมันเอง
      แน่นอนว่าถ้าไวรัลได้ก็ไม่แย่เหมือนกัน
  • มีจุดเสียดายเล็ก ๆ สองอย่าง
    พอจุดเครื่องบินถูกวาดแล้วขยับต่อ ความสมจริงจะหลุดไปนิดหนึ่ง ถ้าจุดถูก “ระบาย” โดยการกวาดสัญญาณ แล้วค้างอยู่กับที่จนกว่าจะถึงการกวาดครั้งถัดไป น่าจะรู้สึกสมจริงกว่า
    ถ้าอยากให้สมจริงขึ้นอีก อาจ extrapolate จากจุดข้อมูลก่อนหน้าเพื่อให้เครื่องบินแต่ละลำเคลื่อนที่อย่างสม่ำเสมอในแต่ละรอบกวาดได้

    • ทั้งสองประเด็นสมเหตุสมผล ถ้าจับเวลาและมุมให้ดี ข้อแรกดูน่าจะทำได้พอสมควร
      ข้อสองอาจง่ายกว่าด้วย API ส่งค่า ความเร็วของเครื่องบิน กลับมา ดังนั้นใช้จุดข้อมูลเดียวก็คำนวณได้
  • กิจกรรมที่เหมาะจะทำกับลูกสาวคือไปตามถนน ลานจอดรถ หรือสวนสาธารณะที่อยู่ปลายด้านทิศทางลงจอดของรันเวย์สนามบินนานาชาติที่ใกล้ที่สุด
    ปกติทิศทางจะเปลี่ยนไปตามลม ก็ดูให้ตรงแล้วไป จอดรถแล้วดูเครื่องบินบินเข้ามาลงจอดได้เลย
    เด็กจะใช้ เรดาร์ ของตัวเองดูได้ว่าเครื่องบินลำไหนกำลังมา ส่วนเราใช้ flightradar24
    เด็ก ๆ ตะลึงกันสุด ๆ เมื่อเห็นเครื่องบินเจ็ตลำใหญ่ที่กำลังเข้ามาใกล้พื้นมากแค่ไหน และสนุกได้ง่าย ๆ เป็นชั่วโมง ๆ ต้องต่อรองกันเลยเพราะไม่อยากกลับ อยากรอดูว่าเครื่องลำถัดไปจะใหญ่กว่าหรือใกล้กว่านี้ไหม

    • ถ้าเป็นผู้เขียน ก็น่าจะเป็น London City Airport (LCY) และที่นี่มีมุมร่อนลงที่ชันมาก
      ในบรรดาเครื่องบินปีกตรึงหลายเครื่องยนต์ขนาดไม่เกิน Airbus A318 จะให้บริการได้เฉพาะเครื่องบินและลูกเรือที่ได้รับการรับรองเป็นพิเศษให้ทำการร่อนลงที่มุม 5.5° ได้เท่านั้น
      https://www.youtube.com/watch?v=yZIDFgpT0-o
      https://en.wikipedia.org/wiki/London_City_Airport
    • ถ้าอยู่ใกล้ D.C. Gravely Point คือที่แบบนั้นพอดี ไม่ว่าจะเครื่องบินกำลังขึ้นหรือลง ก็รู้สึกเหมือนนับหมุดย้ำบนเครื่องบินได้เลย
    • ควรพกที่อุดหูไปด้วย
    • ตอนมัธยมมีลานกรวดโล่งอยู่นอกรั้วสนามบินตรงปลายรันเวย์พอดี ถ้าทิศลมถูกทางแล้วเครื่องบินขึ้นผ่านเหนือลานนั้น ก็เป็นจุดจอดรถเดตที่ดีมาก
    • อาจไม่ตรงกับข้อเสนอทั้งหมด แต่ที่ SFO มี Sky Terrace ในพื้นที่ก่อนจุดตรวจความปลอดภัย ให้ไปดูเครื่องบินได้
  • แอปนี้มีปัญหาอยู่อย่างหนึ่ง หน้าแอประบุชัดว่า 4 ปีขึ้นไป แต่ผู้ใช้เป้าหมายคือเด็ก 2 ขวบ
    ทำได้ดีมาก

    • หวังว่าจะรอดพ้นเรดาร์ของตำรวจ App Store ได้
  • ยอดเยี่ยม
    ขอถามรายละเอียดเล็กน้อยว่า สโคปเรดาร์ CRT มีเส้นสแกนจริง ๆ หรือ? ผมนึกว่ามันน่าจะเป็นจอเวกเตอร์
    เกี่ยวกับรายการฟีเจอร์เพิ่มเติม เนื่องจากเป็นแอปสำหรับดูเครื่องบิน ถ้าแตะจุดแล้วแสดงชนิดเครื่องบินสักสองสามวินาทีก็น่าจะเจ๋ง

    • ใช่แล้ว หน้าจอเรดาร์แบบเก่าโดยพื้นฐานแล้วเหมือนออสซิลโลสโคป ตำแหน่ง X/Y ถูกควบคุมด้วยมุมของเรดาร์และระยะปัจจุบันของสัญญาณสะท้อนเรดาร์ เป็นเหมือน กราฟพิกัดเชิงขั้ว ชนิดหนึ่ง
      ด้วยแสงค้างของสารเรืองแสง สัญญาณสะท้อนเรดาร์ที่แรงจะค้างอยู่บนหน้าจอชั่วครู่ หากในช่วงเวลานั้นเรดาร์หมุนครบหนึ่งรอบหรือมากกว่า เครื่องบินลำเดิมจะปรากฏเป็นจุดใหม่ที่ขยับไปเล็กน้อย หรือก็คือ “plot”
      ยังสามารถใช้ปากกาเมจิกทำเครื่องหมาย plot บนหน้าจอเพื่อสร้างเป็น “track” ได้ด้วย
      ยังมีหน้าจอพิเศษที่ตั้งกล้องถ่ายภาพยนตร์หันเข้าหาหน้าจอเรดาร์ เพื่อบันทึกสัญญาณสะท้อนเรดาร์หลายชั่วโมงแล้วนำมาเล่นย้อนหลังภายหลัง
      เช่น มีบันทึกแบบเร่งความเร็วของอากาศยานฝ่ายสนธิสัญญาวอร์ซอในช่วงการปฏิวัติเชโกสโลวาเกียปี 1968: https://youtu.be/rAUodXI4LPw?t=622
    • เป็นจอเวกเตอร์ก็จริง แต่อาจต่างจากแบบที่คุณนึกอยู่เล็กน้อย
      เดิมทีหน้าจอเรดาร์จะสแกนตามแนวรัศมีจากศูนย์กลางออกไปด้านนอก จังหวะการสแกนถูกกำหนดไว้ล่วงหน้าเพื่อสเกลระยะทาง และสัญญาณความเข้มของลำแสงก็คือสัญญาณสะท้อนเรดาร์ที่ถูกขยายแล้วโดยตรง
      ดังนั้นสัญญาณสะท้อนที่แรงกว่าจะปรากฏเป็น “blip” ที่เห็นชัดกว่าบนจอที่มีแสงค้างยาว
      จุดที่น่าสนใจคือ เพื่อให้ลำแสงเรดาร์สแกนไปรอบหน้าจอ CRT เขาขับเคลื่อน ชุดประกอบตัวปล่อยลำอิเล็กตรอนของหลอดรังสีแคโทด ทั้งชุดด้วยมอเตอร์ที่ซิงก์กับจานเรดาร์ที่กำลังหมุน
      การหมุนนี้ต้องตรงกับความเร็วและทิศทางของจานเรดาร์เสมอ ไม่อย่างนั้น blip จะไปปรากฏผิดตำแหน่ง
      เส้นรัศมีและเส้นระยะที่คงที่ถูกพิมพ์ไว้บนหลอด CRT เองหรือบนฝาครอบใส จอแบบนี้น่าจะถูกใช้งานมาหลายสิบปี อาจถึงทศวรรษ 1980 หรือช่วงต้นทศวรรษ 1990 ด้วยซ้ำ
      รุ่นที่ใหม่กว่าสามารถสแกนทิศทาง X/Y แยกกันด้วยวงจรอิเล็กทรอนิกส์ง่าย ๆ เพื่อเลี่ยงชุดประกอบตัวปล่อยลำแสงแบบหมุนที่ซับซ้อน
      รายละเอียดเพิ่มเติม: https://en.wikipedia.org/wiki/Radar_display#Plan_position_in...
    • ขยายจากสิ่งที่คำตอบอื่น ๆ ชี้ไว้เล็กน้อย ลำแสงสแกนแบบรัศมีจากศูนย์กลางออกไปด้านนอกจริง ๆ
      มุมอาจสร้างได้ด้วยการหมุนแผ่นเบี่ยงเบนทางกายภาพ หรือคำนวณ sin/cos ทางอิเล็กทรอนิกส์แล้วนำไปใช้กับแผ่นเบี่ยงเบน X/Y
      แอมพลิจูดของสัญญาณที่ย้อนกลับมาขับกระแสลำแสงโดยตรง ดังนั้นเป้าหมายที่มีการสะท้อนมากกว่าจะสว่างกว่า
      นอกจากนี้ยังมี เอฟเฟกต์หลอดเก็บภาพ ด้วย ซึ่งไม่ได้ทำงานแบบโหมด bistable ของจอเวกเตอร์ X-Y แบบหลอดเก็บภาพในคอมพิวเตอร์ยุคแรก ๆ แต่คล้ายโหมดภาพค้างแบบปรับได้ในออสซิลโลสโคปบางรุ่น
      คุณสมบัตินี้ทำให้เกิดผลลัพธ์บางอย่างที่เกี่ยวข้องกับความพยายามออกแบบอากาศยานสเตลท์ยุคแรก ๆ เช่น SR-71 หรือ XB-70
      หลอดเรดาร์ถูกตั้งค่ากระแสลำแสงให้ “blip” สะสมข้ามการกวาดหลายครั้ง และโดยปกติ blip จะเคลื่อนที่ระหว่างการกวาดน้อยกว่าขนาดเส้นผ่านศูนย์กลางของตัวมันเอง
      แต่ถ้าพื้นที่หน้าตัดสะท้อนเรดาร์ของเครื่องบินต่ำโดยธรรมชาติและเครื่องบินเร็วมากจน blip เคลื่อนที่ไกลกว่านั้นระหว่างการกวาด ผู้ควบคุมเรดาร์อาจตีความ blip หลอกเล็ก ๆ เหล่านั้นว่าเป็นสัญญาณรบกวน โดยเฉพาะในสถานการณ์วุ่นวายที่มีเป้าหมายจำนวนมาก