21 คะแนน โดย xguru 2023-01-16 | 2 ความคิดเห็น | แชร์ทาง WhatsApp

NYCTrainSign ปิดกิจการมาแล้ว 5 ปี

  • ป้าย LED ส่วนตัวสำหรับบอกเวลาเข้าถึงของรถไฟใต้ดินนิวยอร์ก (ใช้ Raspberry Pi เป็นฐาน)
  • สืบหาว่าทำไมบริษัทถึงล้มเหลว และเขียน exploit เพื่อเข้ารับช่วงต่อ fleet ของพวกเขา
  • ตอนนั้นดังมากบน Instagram/Facebook แต่ก็มีคนจำนวนมากที่ไม่ได้รับสินค้า
  • หลังจากหาซื้อเครื่องจริงผ่านผู้ขายมือสองแล้วแกะดู พบว่าภายในต่ำกว่ามาตรฐาน และเป็นธุรกิจที่ไม่ยั่งยืน
    • BOM (Bill of Material) สูงเกินไป (หมายถึงต้นทุนการผลิตสูงมากตั้งแต่แรก)
    • ปกติผมจะคูณต้นทุน BOM ราว 4 เท่าเพื่อเดาราคาขายปลีก

ราคาชิ้นส่วน

  • Raspberry Pi 3 - $35
  • Adafruit LED Matrix Hat - $25
  • LED Matrix * 2 - $60
  • 5V 2A Power Supply - $5
  • 4GB MicroSD Card - $7
  • Wood Case - $15
  • อย่างอื่น เช่น สายไฟ ปุ่ม สกรู แพ็กเกจจิง ฯลฯ - $3
  • แค่คำนวณเท่านี้ก็ได้ $150 แล้ว ดังนั้นควรต้องขายที่ $600

พวกเขาไม่รู้ทริก

  • ดูหน้าเว็บเก่าจาก Web Archive แล้วเหมือนว่าพวกเขาตั้งใจจะขายที่ $599
  • แต่ช่วงแรกก็เคยขายที่ $299 หรือแม้แต่ $100 (เวอร์ชันเบต้า)
  • ดูเหมือนจะเคยพยายามปล่อยเช่าที่ $30/เดือน ด้วย (แต่ฮาร์ดแวร์ต้องใช้ต้นทุนล่วงหน้า จึงน่าจะทำได้ยากเหมือนกัน)

ใครเป็นคนขายพลั่ว

  • จากคำว่า "ช่วงตื่นทองให้ขายพลั่ว" ใครกันที่หาเงินได้จากการขายพลั่ว? Adafruit
  • การใช้ "Adafruit LED Matrix HAT" ทำให้ต้นทุนเพิ่มขึ้น $25 (ประมาณ 20%)
  • ต้นทุนส่วนนี้ลดได้ด้วยงานวิศวกรรมนิดหน่อย เพราะไม่ใช่ของที่จำเป็นขนาดนั้น
    • จะต่อสายเองก็ได้ หรือใช้ HAT ราคาถูก $2 ก็มี
  • โดยมากผลิตภัณฑ์ของ Adafruit ถูกใช้แค่ตอนทำ prototype ช่วงแรก แล้วตอนผลิตจริงก็มักเปลี่ยนเป็นของที่ถูกกว่า
  • จะมองว่า Raspberry Pi เป็นคนขายพลั่วด้วยก็ได้ แต่การใช้ Arduino หรือ ESP32 ก็ดูจะเกินความจำเป็นไปหน่อย
  • ผมคิดว่าควรเริ่มด้วย Pi 3 แล้วค่อยเปลี่ยนเป็น Pi Zero W จะเหมาะกว่า

ลองอ่านโค้ด

  • ผมดูโค้ด Python และ NodeJS ที่อยู่ใน MicroSD
  • มี 2 คอมโพเนนต์หลัก: Python server (LED server) และ NodeJS server (Config server)

LED Server

  • ทำหน้าที่วาดลงบน LED Matrix และดึงข้อมูลรถไฟจาก API ของบริษัท
  • สื่อสารกับ Config server เพื่อดึงค่าตั้งค่าของผู้ใช้
  • รับข้อมูลรถไฟแล้วสร้างภาพ/ข้อความเพื่อเรนเดอร์ลงบน LED Matrix

Config Server

  • เก็บข้อมูลผู้ใช้ไว้ใน JSON และรับคำขออัปเดตเพื่อแก้ไขไฟล์นั้น
  • ตอนบูต Config Server จะดึงข้อมูลล่าสุดมา
  • เชื่อมต่อกับ AWS IoT Core และรับข้อมูลเปลี่ยนค่าตั้งค่าแบบเรียลไทม์จาก MQTT server

คุณภาพโค้ด

  • มีปัญหาหลายอย่างในด้านคุณภาพโค้ด
  • Transit API ไม่ได้คำนึงว่าสถานีหนึ่งอาจมีหลายสายรถไฟ
  • ไม่มีกระบวนการอัปเดตเฟิร์มแวร์
  • โค้ด Python จำนวนมากใช้ system call ตรง ๆ เพื่อเปลี่ยนแปลงระบบ
  • Python LED server ไปคุยกับ NodeJS Config server เพื่อดึงข้อมูล ซึ่งคาดว่าน่าจะเป็นเพราะเขียน AWS IoT Core บน NodeJS ง่ายกว่า และ Python จัดการจอแสดงผลได้ง่ายกว่า
  • มีการปนกันระหว่าง tab กับ space (น่าจะมาจากการตั้งค่า editor ผิด)
  • git history ทั้งหมดถูกเก็บอยู่ใน micro sd
  • bash history ก็ถูกเก็บไว้ด้วย
  • แทบไม่มีการนำโค้ดกลับมาใช้ซ้ำเลย

การชุบชีวิต Sign

เอา Shell มาให้ได้

  • Raspberry Pi ส่วนใหญ่ไม่ได้เข้ารหัส MicroSD จึงได้ root shell ค่อนข้างง่าย
  • แค่บูตเข้า single-user mode แล้วรีเซ็ตรหัสผ่านของผู้ใช้ pi
  • API ของบริษัทไม่มีอยู่แล้ว และตัวเครื่องถูกตั้งให้ใช้ข้อมูล local ที่ hardcode ไว้เมื่อไม่มีอินเทอร์เน็ต

สร้างเซิร์ฟเวอร์ขึ้นใหม่

  • ซื้อโดเมนสำหรับ API คือ trainsignapi.com
  • ตอนนี้จึงควบคุมโดเมนได้ทั้งหมด
  • ใช้ https://wheresthefuckingtrain.com/ สำหรับข้อมูลรถไฟ และ https://open-meteo.com/ สำหรับข้อมูลอากาศ

ยึดการควบคุม Sign

  • เหมือนอุปกรณ์ IoT อื่น ๆ Sign นี้ก็ใช้ system call จำนวนมาก
  • หนึ่งในนั้นเอา Sign ID ไปต่อท้ายเป็น shell command โดยตรง
  • เพราะควบคุม API server ได้เอง จึงสามารถควบคุม Sign ทุกเครื่องจากระยะไกลได้
  • หลังลองอยู่หลายครั้งก็เขียน exploit ได้
    • เมื่อเครื่อง Sign เปิดขึ้น มันจะดึงข้อมูลการตั้งค่าและร้องขอ image logo
    • ตอนนั้น Sign ID จะถูกส่งมาด้วย
    • เก็บ ID นี้ไว้ แล้วพอมีการร้องขอ image logo ครั้งถัดไป ก็ส่ง exploit ไปที่ Sign
    • ถ้าทำให้ผู้ใช้รีบูต Sign ได้ exploit ก็จะทำงานตอนเริ่มระบบ
    • exploit จะอัปเดตโค้ดที่จำเป็นและทำให้มันจับคู่กับเซิร์ฟเวอร์ของเรา
  • จากนั้นอุปกรณ์เหล่านี้ก็ทำงานกับ API server ใหม่ได้ดี

เกิดอะไรขึ้นกันแน่?

  • ปัญหาคือการลดราคาหนักเกินไป
    • ผลิตที่ $150 แล้วขาย $117 เป็นไปไม่ได้
    • แม้แต่ $300 ก็ยังถูกเกินไป ตั้งแต่แรกควรขาย $600
  • สำหรับสตาร์ทอัป พวกเขามีพนักงานและค่าใช้จ่ายด้านการตลาดมากเกินไป
  • ผลิตสินค้าได้ไม่มากเมื่อเทียบกับดีมานด์ (เพราะทำด้วยมือ)
    • ถึงอย่างนั้นก็ยังรับออเดอร์ต่อไป จนแทบเหมือน Ponzi scheme ที่ใช้เงินจากออเดอร์ใหม่ไปผลิตของที่เคยขายลดราคาไปก่อนหน้า
    • พวกเขายังย้ายการผลิตไปจีนไม่สำเร็จด้วย
  • ดูจาก LinkedIn ผู้ก่อตั้งมี 4 คน ต่อมาขยายเป็น 11 คน และช่วงหนึ่งขึ้นไปถึง 15 คน
    • ต่อให้คิดแค่ผู้ก่อตั้งคนละ $60k ก็ต้องขายอุปกรณ์ที่กำไรเครื่องละ $400 ให้ได้ 600 เครื่องอยู่ดี
  • จากภาพหน้าจอที่ผู้ก่อตั้งแชร์ บอกว่าทำรายได้ $250k ในเวลา 2 เดือน
    • แต่ลดราคาเครื่องมากเกินไปจนไม่รู้ว่าจริง ๆ แล้วมีกำไรเท่าไร
  • ผู้ก่อตั้งไม่ได้อธิบายให้ชัดว่าเกิดอะไรขึ้น ทำไมส่งสินค้าออกไปได้น้อยมาก หรือเงินทั้งหมดหายไปไหน
  • ผู้ก่อตั้งคนหนึ่งบอกว่าส่วนตัวแล้วไม่ได้รับเงินเลยแม้แต่น้อย
  • ผมเชื่อว่าถ้าทีม NYCTrainSign อย่างน้อยได้คุยกับใครสักคนที่มีความรู้ด้านอิเล็กทรอนิกส์ พวกเขาอาจสำเร็จก็ได้
    • แต่ที่ปรึกษาหลักของพวกเขากลับเป็นอาจารย์คอมพิวเตอร์ไซเอนซ์ในมหาวิทยาลัย
  • NYCTrainSign คือโปรเจกต์ที่ CEO ทำขึ้นในเวลาว่าง แล้วพยายามขายที่ $300~$600 โดยไม่ได้คิดถึงสิ่งที่จะตามมา
  • สรุปคือ "Good Idea, Good Timing, Bad Team, Bad Product"

หลังจากนี้จะเกิดอะไรขึ้น

  • ตอนเริ่มทำเรื่องนี้ ผมเคยฝันว่าจะขาย Sign ของตัวเอง
  • ผมทำมันด้วย ESP32 และยังใช้อยู่จนถึงตอนนี้
  • แต่คิดไปคิดมา ผมคงไม่ใช่คนที่เหมาะจะทำสิ่งนี้แล้วเอาไปขาย
  • ตลาด LED Sign แข่งขันกันหนักอยู่แล้ว: มีทั้ง Tidbyt และบริษัทอีกมากมายบน Amazon
  • เลยตัดสินใจปล่อยให้มันเป็นแค่โปรเจกต์เพื่อการเรียนรู้ส่วนตัว
  • สิ่งที่เกี่ยวกับ NYCTrainSign ถูกปล่อยเป็นโอเพนซอร์สแล้ว
    • รวมถึง API server ที่มี exploit code ด้วย
  • และจะยังโฮสต์เซิร์ฟเวอร์ NYCTrainSign ตัวใหม่ต่อไป (ค่าโฮสต์ถูกมาก)
  • ไม่ได้ตั้งใจจะเพิ่มฟีเจอร์ใหม่อะไร แต่มีไอเดียสำหรับเฟิร์มแวร์ที่ปรับปรุงแล้วอยู่
  • ถ้าคุณมี Sign อยู่ ผมทำเว็บสำหรับจัดการมันจากระยะไกลไว้แล้ว ลองใช้ได้
  • "ถ้าคุณไม่มี Sign ก็อย่าเพิ่งไปซื้อใหม่"

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

 
loblue 2023-01-18

น่าสนใจดีครับ 555
แต่ถ้าตัดสินว่ามันทำกำไรได้แล้วเอาไปทำเป็นธุรกิจ แบบนี้จะไม่มีปัญหาทางกฎหมายเหรอ?

 
kloty 2023-01-16

ให้ความรู้สึกเหมือนกำลังดูเกมแนวไทคูนอยู่เลย

Code Quality > น่าจะพิมพ์ผิดเป็นว่า "ไม่มี" ทั้งที่จริง ๆ ต้องการบอกว่ามีปัญหาด้านคุณภาพโค้ดหลายอย่าง