PySkyWiFi: Membuat Wi-Fi lambat gratis di penerbangan jarak jauh
(robertheaton.com)- PySkyWiFi adalah eksperimen yang memakai field profil akun mileage maskapai yang tetap bisa dibuka sebelum pembayaran sebagai penyimpanan sementara, untuk bolak-balik mengirim request dan respons HTTP dengan sangat lambat selama penerbangan jarak jauh
- Prototipe awal memperbarui dan melakukan polling pada field nama akun untuk membuat chat, lalu diperluas sehingga daemon di darat membaca request seperti
STOCKPRICE: APPLdan mengembalikan hasilnya - Arsitektur akhirnya terbagi menjadi sky proxy di dalam pesawat dan ground daemon yang terhubung ke internet, dengan header
X-PySkyWiFipada requestcurllokal untuk menyampaikan URL tujuan - Transmisi dilakukan dengan memecah request HTTP menjadi chunk kecil, lalu menyelaraskan urutan dengan segmen
DATA,ACK,ENDdan nomor urut 6 digit - Pendekatan yang terus mengirim request otomatis ke akun maskapai sungguhan dihindari, dan pengujian akhir hanya sampai tingkat memanggil homepage blog lewat GitHub Gist dengan
curllalu menerima respons HTML beberapa menit kemudian
Jalur pintas yang ditemukan di portal Wi‑Fi sebelum pembayaran
- Halaman login Wi‑Fi pesawat meminta pembayaran, tetapi bahkan sebelum membayar, login akun mileage maskapai diizinkan secara gratis
- Saat melihat field nama di layar edit profil, muncul gagasan bahwa nilai ini bisa dipakai seperti saluran komunikasi kecil untuk bertukar data dengan luar
- Bahasa implementasi awalnya ingin memakai Go, tetapi Python dipilih karena nama alatnya bisa menjadi PySkyWiFi
- Kode sumber dipublikasikan di PySkyWiFi
Prototipe 1: pesan instan lewat field nama
- Setelah dua klien login ke akun mileage maskapai yang sama, mereka bertukar pesan dengan cara bergantian memperbarui dan membaca field nama
- Jika satu pihak mengubah nama menjadi
Hello how are you, pihak lain membacanya - Lalu ketika diubah lagi menjadi
Im fine how are you, pihak pertama melihat balasannya
- Jika satu pihak mengubah nama menjadi
- Mengubah nama langsung lewat UI terasa merepotkan, jadi diotomatisasi dengan alat command line
- Alat ini login ke situs web dan memperbarui field nama akun uji dengan pesan
- Setiap beberapa detik alat ini melakukan polling field nama, dan jika nilainya berubah, perubahan itu ditampilkan sebagai balasan lawan bicara
- Diputuskan untuk tidak lagi mengirim data otomatis ke akun mileage maskapai sungguhan, dan hanya diuji apakah pembaruan nama yang cepat sekitar 10 kali semuanya berhasil
- Hasil ini menunjukkan kemungkinan akun tersebut tidak membatasi kecepatan atau jumlah request
- Setelah itu, pengembangan dilanjutkan dengan mereproduksi prinsip yang sama menggunakan GitHub Gists dan file lokal
- Karena pengembangan berulang lebih cepat dan mudah dibanding memakai akun mileage maskapai
Prototipe 2: mengambil informasi eksternal lewat ground daemon
- Pada langkah berikutnya, daemon dijalankan di komputer yang terhubung internet di darat atau di cloud
- Daemon terus melakukan polling pada field nama akun mileage maskapai sambil mencari request terstruktur yang dikirim dari pesawat
- Contoh:
STOCKPRICE: APPL - Contoh:
SCORE: MANUNITED
- Contoh:
- Saat request baru ditemukan, daemon mem-parsing-nya, mengambil informasi lewat API terkait, lalu mengirimkannya kembali ke sisi pesawat melalui akun mileage maskapai
- Mulai tahap ini, sistem berkembang dari chat sederhana menjadi pencarian informasi real-time seperti harga saham atau skor olahraga
Arsitektur penuh dengan sky proxy dan ground daemon
- PySkyWiFi adalah protokol mirip TCP/IP yang mendorong seluruh request HTTP ke akun mileage maskapai, lalu komputer di darat menjalankan request HTTP yang sebenarnya dan mengunggah kembali respons dengan cara yang sama
- Ada dua komponen
- sky proxy: proxy yang berjalan di laptop di dalam pesawat
- ground daemon: daemon yang berjalan di komputer terhubung internet di rumah atau di cloud
- Sebelum digunakan, ground daemon dijalankan lebih dulu, lalu setelah tersambung ke Wi‑Fi di pesawat, sky proxy dijalankan di laptop
- Pengguna mengirim request HTTP ke proxy lokal dengan alat seperti
curl- Contoh:
curl localhost:1234 -H "X-PySkyWiFi: example.com" - URL tujuan sebenarnya dimasukkan ke header kustom
X-PySkyWiFi
- Contoh:
- Ground daemon menghapus header
X-PySkyWiFidan memakainya untuk routing ke situs target- Body request dan header lain diteruskan apa adanya
- Setelah seluruh proses selesai, pengguna menerima respons HTTP seperti request internet biasa, tetapi tergantung kondisi jaringan pesawat, request bisa berhenti selama beberapa menit dan kecepatannya mungkin hanya beberapa byte per detik
Chunk, ACK, dan HTTP bolak-balik dengan akun kedua
- Sky proxy menerima request
curllalu membagi seluruh request HTTP menjadi chunk- Karena jumlah yang bisa dimuat sekaligus di field nama akun mileage maskapai kecil
- Setiap chunk ditulis berurutan ke field nama akun mileage maskapai pertama
- Ground daemon melakukan polling pada akun itu, lalu saat menemukan chunk baru, membacanya dan meninggalkan acknowledgement bahwa chunk berikutnya boleh dikirim
- Setelah seluruh request HTTP dirakit ulang, ground daemon mengirim request sebenarnya ke internet
- Respons HTTP menempuh prosedur yang sama ke arah sebaliknya
- Ground daemon membagi respons menjadi chunk lalu mengirimnya
- Untuk menyederhanakan implementasi, chunk respons memakai akun mileage maskapai kedua
- Sky proxy membaca chunk, menyusun ulang respons HTTP, lalu mengembalikannya ke pemanggilan
curlsemula
Pemisahan peran antara transport layer dan network layer
- Logika komunikasi PySkyWiFi dibagi menjadi transport layer dan network layer
- Transport layer menentukan data apa yang dikirim dan dalam urutan seperti apa
- Cara membagi pesan panjang menjadi chunk kecil
- Cara memberi tahu bahwa penerima siap menerima chunk berikutnya
- Perannya sangat longgar mirip TCP
- Network layer menulis dan membaca data yang sudah ditentukan transport layer ke penyimpanan sebenarnya
- Penyimpanannya bisa berupa akun mileage maskapai, file lokal, atau profil Discord
- Pemisahan ini memudahkan untuk menambahkan platform mileage maskapai baru
- Cukup mengimplementasikan network layer baru dan transport layer bisa tetap dipakai
- Network layer untuk pengujian bisa membaca dan menulis file lokal alih-alih akun mileage maskapai
Aturan transmisi dengan DATA, ACK, dan END
- Koneksi transport PySkyWiFi terdiri dari dua pipe
- Tiap klien memiliki pipe SEND untuk menulis dan pipe RECV untuk membaca
- Akun mileage maskapai bisa dipakai sebagai pipe
- Klien PSWF pada satu saat tertentu hanya bisa mengirim atau menerima
- Dalam mode kirim, ia tidak bisa melihat data yang dikirim pihak lain
- Dalam mode terima, walaupun mengirim data, pihak lain tidak akan melihatnya
- Ini bukan model kirim-terima dua arah kapan saja seperti TCP
- Pesan panjang dikirim dengan segmen
DATA,ACK, danENDDATA: terdiri dari karakterD, nomor urut yang di-padding menjadi 6 digit, dan data chunk sebenarnya- Contoh:
D000451adline": "Mudslide in Wigan causes m ACK: terdiri dari karakterAdan nomor urut 6 digit yang dikonfirmasi- Contoh:
A000451 END: satu karakterEuntuk menandai akhir pesan
- Pengirim mengirim
DATAlalu menunggu sampai menerimaACKuntuk nomor urut tersebut- Saat menerima
A000451, ia menganggap chunk000451sudah diproses lalu mengirim chunk000452
- Saat menerima
- Saat penerima melihat
END, pesan dianggap selesai dan peran pengirim-penerima ditukar
Antarmuka implementasi network layer
- Network layer menyediakan antarmuka sederhana untuk menulis dan membaca data ke penyimpanan
- Ada dua operasi wajib
send(msg: str): menulismsgke penyimpananrecv() -> str: membaca pesan dari penyimpanan
- Dalam implementasi berbasis mileage maskapai, kedua operasi ini menjadi aksi menulis dan membaca field nama akun
- Ada juga dua properti wajib
sleep_for: waktu tunggu dalam detik yang dipakai transport layer di antara polling pipe RECVsegment_data_size: jumlah karakter yang bisa dimasukkan ke satu segmen
sleep_forbisa dibuat rendah pada implementasi uji seperti file, tetapi pada implementasi akun mileage maskapai harus dijaga minimal beberapa detik agar tidak mengirim terlalu banyak request ke server jarak jauhsegment_data_sizeharus sama dengan ukuran maksimum field akun mileage maskapai yang dipakai, dan contohnya sekitar 20 karakter- Ada dua hook opsional
connect_send(): dipanggil saat inisialisasi pipe SEND, dan pada implementasi mileage maskapai bisa dipakai untuk login dengan nama pengguna dan kata sandi agar memperoleh cookieconnect_recv(): dipanggil saat inisialisasi pipe RECV
Encoding base26 dan ide peningkatan bandwidth
- Form HTML mileage maskapai mungkin tidak mengizinkan karakter selain alfabet untuk nama
Stephenmungkin diizinkanGET /data?id=5mungkin ditolak
- Untuk menghindari ini, network layer harus meng-encode segmen ke base26 sebelum menulisnya ke akun mileage maskapai
- Base26 merepresentasikan string hanya dengan karakter
AsampaiZ - String byte diubah menjadi satu angka besar, lalu direpresentasikan sebagai digit basis 26 dengan karakter
A~Z - Contoh:
b26_encode("Hello world")mengembalikanCZEZINADXFFTZEIDPKM
- Base26 merepresentasikan string hanya dengan karakter
- Transport layer tidak perlu mengetahui encoding ini
- Network layer mengubah byte menjadi base26 saat menulis, lalu memulihkannya kembali menjadi byte saat membaca
- Base26 membuat string menjadi jauh lebih panjang sehingga bandwidth berkurang
- Menggunakan base52 yang memakai huruf besar dan kecil sekaligus bisa membuatnya lebih pendek, tetapi itu dibiarkan sebagai peningkatan versi 2
- Bandwidth bisa ditingkatkan dengan memperbesar ukuran segmen
- Walaupun 1 field hanya bisa menyimpan 20 karakter, jika 5 field berukuran 20 karakter ditulis sekaligus, segmen 100 karakter bisa dikirim dalam satu request
- Penerima bisa membaca 5 field itu dalam satu request lalu menggabungkannya kembali
Ruang peningkatan lewat HTTP CONNECT dan pengujian akhir
- Alih-alih bertukar request HTTP secara manual, PySkyWiFi bisa membuat tunnel yang lebih baik dengan memakai HTTP CONNECT requests
CONNECTadalah metode yang dipakai sebagian besar proxy HTTP, dan dengan ini PySkyWiFi bisa berfungsi seperti proxy tingkat sistem sehingga request browser juga bisa ditangani- Dengan
CONNECT, PySkyWiFi akan menegosiasikan koneksi TLS langsung dengan situs target, sehingga trafik yang melewati akun mileage maskapai akan terenkripsi - Kekurangannya, pekerjaan implementasinya menjadi jauh lebih besar
- Pada pengujian akhir, data ditunnel lewat GitHub Gist untuk memuat homepage blog dengan
curl, dan beberapa menit kemudian respons HTML diterima
1 komentar
Komentar Hacker News
Puluhan tahun lalu, pasangan saya menggunakan SMS Google Voice dengan membaca dan membalasnya langsung dari kotak masuk Gmail. Karena tidak suka ponsel, ia membawa Kindle Keyboard lama yang punya 3G tanpa batas
Browser sederhana di Kindle bisa membuka tampilan Gmail versi ringan, jadi bisa dipakai seperti perangkat SMS tanpa biaya bulanan; masalahnya hanya notifikasi SMS baru
Jadi setelah jailbreak, saya awalnya ingin menambahkan penghitung di layar beranda, lalu terpikir bahwa penghitung itu bisa diletakkan di samping nama perangkat Kindle yang bisa diubah dari akun Amazon
Dari server rumah, saya memakai otomatisasi browser untuk login ke Amazon dan mengubah nama perangkat menjadi
My Kindle (x), dengan x adalah jumlah SMS Google Voice yang belum dibaca, dan Kindle memperbarui nama di layar beranda dalam waktu satu menit, sehingga berjalan baik selama bertahun-tahunSeingat saya, mengurangi beberapa byte saja bisa menghemat sekitar satu juta dolar
Saat itu mungkin itu hampir merupakan Kindle tertua yang masih berfungsi, jadi sepertinya pencurinya hanya mengambil apa pun yang ada di dalam tas
Belakangan saya menemukan Kindle Keyboard lagi seharga 20 dolar di pasar loak, tetapi enam bulan kemudian baterainya mati; unitnya masih saya simpan, jadi saya penasaran berapa biaya baterai penggantinya
Gmail nyaris bisa dipakai lewat browser, dan saya juga membuat situs web Zork yang ramah Kindle untuk memainkan game teks dengan memilih dari beberapa ROM zmachine
Setelah diliput beberapa situs berita, responsnya lumayan juga
Tidak ada integrasi cerdas untuk mengubah nama Kindle, tetapi selama beberapa waktu saya mengirim SMS dengan Kindle Keyboard yang punya 3G tanpa batas
Situs web Google Maps nyaris bisa dijalankan
Dulu saya naik feri sekitar 20 jam dari Italia ke Yunani; ada Wi-Fi berbayar berbasis internet satelit, tetapi saya tidak ingin membayar
Akses ke Stripe dibuka untuk pembayaran, dan ternyata semua halaman stripe.com, termasuk dokumentasi pengembangnya, bisa diakses, jadi saya mulai membuang-buang bandwidth dengan mengunduh gambar berulang-ulang
Lalu saya teringat bahwa agar Stripe berjalan, akses ke Fastly CDN diperlukan, dan Reddit juga memakai Fastly; setelah terhubung ke Stripe, saya mengubah header HTTP
Hostmenjadireddit.com, dan Reddit bisa dibukaGambar tidak bisa karena
i.redd.itbukan Fastly, tetapi dengan memetakanold.reddit.comke IP Fastly milik Stripe di/etc/hostsdan mengabaikan peringatan TLS yang menyeramkan, saya bahkan bisa loginJika mereka tidak akan membelinya lagi karena koneksi menjadi lambat, perusahaan penyedia juga dirugikan, dan biaya bandwidth unggah Stripe juga bisa meningkat
Saya sendiri cenderung menghindari unduhan bahkan lewat seluler karena khawatir berdampak buruk pada orang di sekitar
Saya paham eksperimen intelektual untuk mengeksplorasi sejauh mana akses bisa dilakukan pada koneksi yang diblokir, tetapi sengaja membuang-buang bandwidth mirip membuka keran toilet umum untuk membuang air atau menyumbat kloset hingga meluap
https://en.wikipedia.org/wiki/Domain_fronting
Beberapa minggu lalu, saya mengantar anak-anak ke kelas di mal dan mencoba memakai Wi-Fi gratis. Login dari laptop berhasil, tetapi muncul bahwa internet tidak tersedia
Saat memeriksa gateway default, saya tersambung ke modem Cisco; terlihat alat diagnostik dan daftar perangkat yang terhubung, tetapi koneksi internet dimatikan
Saya mencari modelnya lewat ponsel, dan katanya akun admin adalah nomor seri sementara kata sandinya dibiarkan kosong; ada juga pola contohnya, dan nama salah satu perangkat yang terhubung tampak persis seperti pola itu
Saya login begitu saja, menyalakan tombol internet, dan 15 detik kemudian statusnya menjadi hijau; saya juga mengatur kata sandi perangkat baru
VPN tidak mau tersambung, lalu karena router mudah diakses, saya mengubah pengaturan MTU, dan setelah itu langsung berfungsi normal
Hacking seperti ini keren dan saya menyukainya, dalam arti aslinya
Namun ketika saya cek baru-baru ini, tampaknya DNS global di skywifi tetap dapat di-resolve secara normal tanpa membayar, dan pada penerbangan yang saya naiki, sepertinya tunnel iodine biasa juga akan berfungsi
https://github.com/yarrick/iodine
Untuk menghindari laporan penyalahgunaan, trafik keluar server saya lewatkan melalui Tor, dan saya juga mengumpulkan log tentang jaringan kereta, hotel, dan bandara mana saja yang bisa menjalankannya, serta menyediakan protokol tunneling lain
Itu proyek yang menyenangkan untuk sementara waktu, dan seharusnya saya biarkan terus berjalan
Sekarang DNS tunneling menjadi sedikit lebih sulit karena beberapa server DNS, terutama Google, mengacak huruf besar-kecil pada permintaan DNS sehingga merusak encoding tertentu dengan cukup parah
Ide dan prinsipnya menarik, tetapi karena kecepatannya, dalam praktik hampir tidak berguna; mungkin lain cerita kalau hanya menjalankan semacam messenger di atas UDP ;-)
“Saya lupa mengisi daya headphone, jadi Limp Bizkit mulai keluar dari speaker laptop. Untungnya, orang-orang lain di pesawat sepertinya tidak peduli, jadi kami semua menikmatinya bersama-sama dengan semangat.”
Orang-orang seperti ini kurang punya etika publik dasar
Banyak orang di sekitar pasti terganggu, tetapi kemungkinan besar mereka terlalu sopan untuk mengatakan agar jangan memaksakan kebisingan yang tidak perlu
Ada begitu banyak orang yang tidak punya etika dasar seperti ini sampai-sampai saya menganggapnya lelucon yang lucu, dan setidaknya penulisnya sepertinya bukan orang yang benar-benar seperti itu
Itu menunjukkan citra hacker yang melihat kemungkinan internet gratis sebagai peluang yang bisa dieksekusi, lalu di belakangnya mengambil jarak seolah-olah ia bukan orang yang benar-benar akan menyalahgunakan sistem maskapai, jadi nada pembukanya tampak seperti perangkat gaya penulisan
Kalau bukan, itu tindakan yang sangat tidak sopan dan tidak peka
Saya penasaran apakah hanya saya yang selalu lelah setiap kali naik pesawat sampai tidak bisa melakukan apa pun selain memejamkan mata dan menunggu sampai selesai
Membayangkan mengeluarkan laptop atau buku saja sudah melelahkan, banyak kebisingan, dan karena tidak punya headphone peredam bising, sulit untuk berkonsentrasi
Saya sudah menghabiskan setidaknya 2 jam sejak keluar rumah, naik kereta·trem·melewati pemeriksaan keamanan, dan makanan bandara yang tidak sehat juga tidak membantu
Cuaca selama setengah tahun juga terlalu panas atau terlalu dingin, dan ransel 10 kg membuat saya terus berkeringat, jadi akhirnya di dalam pesawat saya tidak punya mood untuk melakukan apa pun
Ini berlawanan dengan intuisi, tetapi saya dengar banyak otak ADHD bekerja seperti ini, dan waktu yang saya habiskan di pesawat adalah yang paling produktif
Harus diletakkan di pangkuan, atau kalau orang di depan merebahkan kursinya, layar bisa berisiko pecah; beberapa tahun lalu hal itu benar-benar terjadi pada rekan kerja saya
Sekarang saya hanya mengeluarkan iPad dan headphone peredam bising lalu menonton film atau acara TV
Tubuh saya juga bereaksi sama, dan saya pikir ini berkaitan dengan penurunan kadar oksigen di udara
Masalahnya bukan kebisingan, melainkan udara, dan headphone peredam bising memang sangat efektif
Namun memang ada orang-orang yang sama sekali tidak terpengaruh dan bisa melakukan pekerjaan berguna di pesawat
Seletih apa pun atau sekurang tidur apa pun, di pesawat saya tidak bisa tertidur dan tidak merasa mengantuk, jadi penerbangan transatlantik terasa lebih menyiksa, dan ketika teman seperjalanan tidur 8 jam rasanya bahkan seperti diejek
Saat terbang, kepala saya jadi sangat kosong sehingga saya memejamkan mata sampai mendarat, dan meski mencoba membaca buku atau bekerja, 5–10 menit kemudian otak saya mati
Anehnya, makanan pesawat selalu membuat perut kembung sehingga saya perlu obat segera setelah mendarat
Menariknya, dua kali saya naik kelas bisnis, saya bisa membaca cukup lama sebelum otak saya mati
Di kereta jarak jauh, kalau duduk menghadap arah perjalanan, sebenarnya lebih mudah untuk bekerja, tetapi kalau keretanya cukup penuh, otak saya kembali mati
Cerita tentang mengirim harga saham, skor pertandingan, cuaca, dan semacamnya mengingatkan saya pada fitur yang dulu disediakan Google lewat layanan pesan teks
Saya sangat sering memakainya sebelum membeli smartphone pertama; kalau mengirim
W[ZIP code]ke 46645(GOOGL), mereka membalas cuaca lewat SMSstock:[symbol]juga bisa, dan ada banyak fitur lain yang sekarang sudah saya lupaTentu saja Google menutupnya, tetapi selama masih berjalan, itu cukup keren
Strukturnya waktu itu: mengirim beberapa baris lirik lewat SMS DM yang didukung Twitter, lalu bot mencari
" lyrics"di Google, mem-parsing hasilnya, dan mengembalikan artis serta judul lewat SMSTidak berjalan dengan baik, tetapi saya cukup bangga dengannya
Berkat itu, saya bisa bertanya kepada ChatGPT dari mana saja di Bumi lewat komunikator satelit portabel inReach Mini 2, dan cukup menyenangkan bisa bertanya bahkan dari tengah Death Valley
Mengetik kueri Google memakan waktu lama dan hasilnya bisa butuh 1–2 menit untuk datang, tetapi itu tetap lebih baik daripada tidak ada
Biasanya saya memakainya untuk mencari alamat tempat yang ingin saya tuju lalu memasukkannya ke TomTom, dan zaman sudah banyak berubah
Sekitar 1995, saat bekerja di perusahaan riset telekomunikasi anak perusahaan Ericsson, saya memikirkan ide seperti ini, dan contoh utamanya adalah pembaruan status penerbangan
Karena tidak ada yang membayangkan bahwa pesan P2P, yang untuk memasukkan satu huruf di keypad numerik saja harus menekan beberapa kali, akan menjadi begitu populer, dalam situasi data di web awal makin bertambah, layanan informasi tampak seperti pemanfaatan terbaik
Teletext juga masih ada, dan ada proyek terpisah untuk mengambil datanya
Namun menarik juga memikirkan pada akhirnya untuk apa kami yang punya akses ke SMS, dan masyarakat umum, menggunakannya
Menarik bahwa penulis sudah cukup dekat dengan TCP di atas field penyuntingan bersama yang abstrak
Itu sendiri bisa menjadi alat yang sangat keren
Jika cara kedua pihak membaca dan menulis ke sumber daya bersama dirancang pada level tinggi, kita bisa membayangkan sebuah proksi yang menangani sisanya dan menyediakannya sebagai proksi SOCKS
Pada akhirnya Wi-Fi gratis menjadi standar sehingga itu bukan lagi hal besar, dan sekarang kita beralih ke perang Wi-Fi gratis di pesawat
Pada akhirnya Wi-Fi di pesawat juga akan gratis di mana-mana, dan beberapa maskapai sudah melakukannya
Mungkin hanya teks yang bisa, bukan gambar atau video, tetapi itu sudah cukup untuk penjelajahan web biasa
Beberapa tahun lalu, dekan universitas kami berkata kira-kira bahwa “game memengaruhi kehadiran,” lalu memutuskan untuk memblokir jaringan LAN setelah pukul 10 malam
Cara implementasinya adalah memblokir semua traffic yang keluar-masuk berdasarkan alamat IP, tetapi TCP itu sendiri tidak diblokir, dan IPv6, yang saat itu juga bukan hal yang benar-benar baru, sepenuhnya terlupakan
Jadi saya membuat aplikasi chat P2P sederhana yang berjalan lewat IPv6, dan satu-satunya masalah adalah harus membagikan alamat IPv6 kepada teman-teman serta meminta mereka menyimpannya di kontak
Itu berjalan dengan baik, tetapi belakangan saya menyadari bahwa melakukan tunneling ke komputer di luar jaringan jauh lebih mudah
Ini terasa seperti contoh yang hampir sempurna dari tulisan tentang menulis lebih banyak software yang tidak berguna dan diskusi HN yang menyusulnya
Apakah ini mengubah hidup? Mungkin tidak
Apakah proses membuat dan mengeksplorasinya menyenangkan? Hampir pasti
Kita perlu membuat lebih banyak hal seperti ini
https://ntietz.com/blog/write-more-useless-software/
https://news.ycombinator.com/item?id=37911900