1 poin oleh GN⁺ 2023-09-11 | 1 komentar | Bagikan ke WhatsApp
  • Untuk menghindari kehabisan pizza di titik suplai pada Gravel Worlds Long Voyage di Nebraska, saya membuat otomatisasi yang memesan pizza Casey's lebih dulu berdasarkan lokasi GPS sepeda
  • Strukturnya menggunakan AWS Location geofence untuk mendeteksi keluarnya pelacak GPS, lalu Lambda menjalankan pemesanan online sesuai ETA ke titik berhenti berikutnya
  • Karena Casey's tidak memiliki API pemesanan publik, saya melakukan screen scraping pada situs berbasis React dengan Playwright, dan hasil pesanan dikirim melalui notifikasi push ke iPhone dan Apple Watch
  • Dalam balapan sebenarnya, notifikasi sukses pemesanan datang, tetapi toko tidak memiliki catatan pesanan, yang menunjukkan adanya false positive pada otomatisasi browser cloud
  • Setelah diubah agar video aktivitas browser disimpan ke S3, pesanan uji berhasil, tetapi di lingkungan Lambda sulit merasa yakin akan keandalannya hanya dari pengujian lokal

Alasan saya ingin mengamankan pizza saat balapan

  • Saya mengikuti balapan sepeda Gravel Worlds Long Voyage di Nebraska pada musim panen di Midwest
  • Pada tahun sebelumnya, para rider yang lebih cepat tiba lebih dulu dan mengambil semua pizza Casey's di titik suplai, sehingga saat saya sampai tidak ada pizza yang tersisa
  • Target tahun ini adalah memesan pizza segar lebih dulu agar pas dengan waktu berhenti saya
  • Di atas pelacak GPS sepeda serverless yang sudah ada, saya ingin menambahkan cara untuk menjalankan skrip pemesanan saat keluar dari geofence tertentu

Cara memicu pemesanan dengan GPS dan Lambda

  • Desain keseluruhannya adalah geofence dari AWS Location memantau pelacak GPS
    • Saat pelacak keluar dari geofence, sebuah fungsi Lambda dipicu
    • Lambda menghitung ETA ke titik berhenti berikutnya
    • Sesuai waktu yang dihitung, Lambda memesan pizza Casey's
  • Karena Casey's tidak memiliki API publik untuk pemesanan online, saya memilih screen scraping situs web
    • Situs Casey's adalah aplikasi React kompleks yang dirender di sisi klien
    • Saya menggunakan Playwright alih-alih scraper biasa
    • Menjalankan Playwright di Lambda cukup rumit sampai layak ditulis di artikel terpisah
  • Untuk memeriksa status pesanan, saya mengatur agar notifikasi push dikirim ke ponsel dan jam tangan saat berhasil atau gagal
    • Menyiapkan Web Push agar berjalan di perangkat iOS juga cukup rumit hingga bisa jadi bahan tulisan tersendiri

Hasil di lapangan yang berbeda dari notifikasi sukses

  • Geofence untuk memicu pesanan dipasang di sekitar titik 180 mil balapan
  • Pizza rencananya akan diambil di titik 200 mil
  • Begitu keluar dari geofence, notifikasi push sukses pemesanan pizza muncul di jam tangan saya
  • Saat tiba di titik berhenti, tidak ada pesanan di meja kasir dan toko juga tidak memiliki catatan pesanan
  • Setelah memeriksa akun, ternyata pesanan memang tidak pernah dibuat, jadi itu adalah false positive yang hanya memunculkan notifikasi sukses
  • Di lokasi masih ada beberapa potong pizza siap saji, jadi saya membeli itu
  • Setelahnya, sepanjang menyelesaikan balapan 300 mil, saya terus memikirkan apa yang salah pada fungsi Lambda

Petunjuk datang dari tangkapan video, bukan log

  • Setelah balapan saya memeriksa log, tetapi tidak ada informasi yang menunjukkan penyebab kegagalan
  • Dari log, semuanya tampak seolah berhasil secara diam-diam sehingga hampir tidak ada petunjuk untuk debugging
  • Beberapa hari kemudian saya mengubah Lambda agar merekam video aktivitas browser dan mengunggahnya ke bucket S3
  • Saat diuji dengan perubahan itu, pesanan benar-benar berhasil dan saya bisa mengambil Hawaiian pizza seperti semestinya
  • Penyebab pastinya belum dipastikan
    • Ada kemungkinan Lambda mengakhiri proses tepat setelah form.submit() terakhir dijalankan di browser Playwright tersemat
    • Ada kemungkinan situs pemesanan online tidak sepenuhnya memproses pesanan karena tidak sempat mengonfirmasi bahwa browser menerima respons sukses
    • Waktu tambahan yang dibutuhkan untuk pemrosesan dan pengunggahan video mungkin memberi cukup waktu untuk pembersihan browser

Hal yang akan saya ubah jika membuatnya lagi

  • Melakukan screen scraping aplikasi klien React secara andal dengan browser cloud itu memungkinkan, tetapi sangat rumit
  • Jika membuatnya lagi, saya mungkin akan mempertimbangkan reverse engineering aplikasi native Casey's dan memicu API internalnya secara langsung
  • Diperlukan workflow yang baik untuk mensimulasikan perilaku geospasial
    • Awalnya saya membuat geofence di sekitar rumah untuk pengujian
    • Keluar berjalan kaki pada pukul 11 malam untuk menguji secara nyata cepat terasa merepotkan
  • Pengujian di lingkungan nyata tidak boleh dikurangi
    • Sebelum balapan, sebagian besar pengujian dilakukan dengan menjalankan fungsi di workstation lokal
    • Itu memberi rasa percaya diri yang keliru bahwa keberhasilan lokal berarti akan berjalan benar juga di lingkungan Lambda
  • Jika Anda khawatir pizza Casey's akan habis, ada juga cara dengan memberi jarak lebih dari 30 menit dari grup depan agar toko punya waktu membuat pizza potong baru
  • Kodenya tersedia publik di GitHub: https://github.com/mattdsteele/spot-tracker-tracker/…

1 komentar

 
GN⁺ 2023-09-11
Komentar Hacker News
  • Colin bisa membuat pizza juga sambil mengantarkannya: https://youtu.be/YjyJRTM0knE?si=fes2lbRntUlciPSH

    • Memang lucu, tapi konsep video YouTube ini sebenarnya adalah model bisnis sebuah startup yang didanai SoftBank, dan mereka mendapat investasi 500 juta dolar
      Cacat fatal dari rencana yang tampak sempurna itu adalah ketika truk melewati jalan bergelombang, pizzanya beterbangan dan kehilangan semua topping: https://gizmodo.com/zume-softbank-ai-pizza-delivery-stellar-...
    • Jadi begini jadinya kalau GIL dihapus
      Video itu membuat saya tertawa paling keras dari semua yang saya tonton di YouTube tahun ini
    • Saya tidak tahu apakah kenekatan Colin itu akting seperti Electroboom, atau memang benar-benar nekat seperti yang terlihat
      Saya masih belum bisa menilainya, dan anehnya itu membuatnya jadi sulit ditonton. Tentu saja ia mungkin tidak akan merilis video saat ada sesuatu yang benar-benar kacau
    • Astaga, Minggu malam saya hilang seluruhnya
      Saya menonton video orang ini menggali terowongan dari rumahnya ke gudang selama dua setengah jam; kanalnya benar-benar menghibur
  • Bagus sekali. Rasanya seperti interpretasi abad ke-21 dari pizzatool
    https://donhopkins.medium.com/the-story-of-sun-microsystems-...
    Sebagai catatan, kedai pizza bernama Waypoint Pizza di Tiburon bisa mengantar sampai ke atas perairan San Francisco Bay kalau diminta baik-baik. Ini cukup berguna untuk lomba yacht unik yang tidak terlalu serius seperti Three Bridge Fiasco

    • Pengantaran pizza biasa saja bisa tambah 5–10 dolar; saya penasaran kira-kira berapa biaya pengantaran di atas air kalau diminta baik-baik
  • Dean Karnazes pernah melakukan hal serupa dalam lomba ultra running tanpa teknologi
    Katanya ia membawa pizza sambil berlari dengan menggulungnya seperti burrito: https://gffmag.com/the-raw-endurance-of-ultramarathon-man-de...

    • Lari ketahanan pada dasarnya lebih mirip kegiatan makan
  • Kalau itu situs web React, besar kemungkinan ada API yang bisa dipakai langsung
    Mungkin perlu login untuk mendapatkan token, tetapi pendekatan itu jauh lebih kokoh

    • Setuju. Saya selalu bingung kenapa tidak memantau dan memutar ulang network request alih-alih melakukan screen scraping
      Itu jauh lebih murah dan jauh lebih kokoh; apakah ada yang saya lewatkan?
  • Saya sangat menikmati tulisan ini
    Banyak unsur bagus: masalah teknis yang menarik, pizza, membuat saya mencari tahu apa arti “s-tier”, premisnya saja sudah lucu lalu ditambah humor lagi, sampai mea culpa di akhir dan dugaan penyebab bug. Teorinya juga terlihat masuk akal, meski belum pasti

    • Saya sama sekali tidak suka. Rasanya seperti perangkat Rube Goldberg yang tidak berfungsi, dibuat dari 100 lapis abstraksi, lem cloud, dan solusi tambal sulam
      Rasanya seperti semua sisi buruk teknologi modern dikumpulkan jadi satu
  • Jujur, ini cukup keren. Saya penasaran apakah hal serupa bisa dilakukan di layanan seperti Deliveroo
    Jika pada tanggal tertentu X kondisinya terpenuhi, misalnya saat lembur dan sudah tersisa kira-kira jarak Z dari rumah, tampaknya bisa memesan pesanan Y yang sudah ditentukan sebelumnya

    • Kenapa harus berbohong bahwa ini cukup keren? Rasanya agak aneh menyebut “jujur” begitu
    • Sambungkan ke fitness tracker, lalu atur agar pizza yang diantar hanya sebanyak yang masih menjaga defisit kalori supaya berat badan turun
    • Rasanya layanan pemesanan makanan seharusnya punya API yang bagus untuk keperluan seperti ini
      Kenapa tidak membuat pemesanan makanan hingga pembayaran mudah diintegrasikan ke hack bergaya IFTTT?
  • Saya punya kenangan indah tumbuh besar sambil makan Casey's pizza
    Setiap kali kembali ke Midwest saya membelinya; sulit menjelaskan secara persis, tapi ada daya tarik khas tersendiri

    • Mungkin karena minyaknya lebih banyak? Pizza sarapannya yang terbaik. Apalagi biasanya setelah malam sebelumnya minum Busch Light
  • Ah, ternyata akhirnya tidak berfungsi
    Kalau baru tahu di titik 200 mil, pasti lumayan berat

  • Software, sepeda, dan pizza—semua hal yang saya suka dalam hidup
    Saya sangat menikmati proyek dan tulisan ini, dan itu juga membuat saya memikirkan ide serupa

    • Itu juga hal-hal yang saya sukai. Sepertinya OP, Anda, dan saya harus membuat klub hobi
  • Kalau saya, mungkin saya akan menelepon hands-free, atau meminta teman menelepon dan memicunya lewat pesan
    Dan mereka terus menyebutnya “pengantaran”, padahal sebenarnya itu pickup, bukan?