2 poin oleh GN⁺ 2024-10-05 | 3 komentar | Bagikan ke WhatsApp
  • Alasan pengujian otomatis gagal hanya pada 00:30 adalah karena man -w ikut mencetak string stderr yang tak terduga: gimme gimme gimme
  • String ini adalah easter egg di man; muncul ketika dijalankan tanpa halaman manual, atau saat menggunakan -w, jika waktu lokal menunjukkan 00:30
  • Frasa tersebut berasal dari “Gimme! Gimme! Gimme! (A Man After Midnight)” milik ABBA, dan lelucon di tweet tahun 2011 kemudian masuk ke kode man-db
  • man -w mencetak manpath dan kode keluarnya juga 0, sehingga bisa dipakai untuk otomasi, tetapi easter egg ini dapat merusak parsing output
  • man-db pertama-tama memperbaikinya agar tidak terpicu pada man -w, lalu kemudian memutuskan untuk menghapus easter egg sepenuhnya di man-db 2.8.0

Pengujian yang gagal hanya pada 00:30

  • Pengujian otomatis berjalan normal hampir sepanjang waktu, tetapi gagal hanya ketika dijalankan pada 00:30
  • Penyebab langsungnya adalah adanya string tak terduga yang ditambahkan ke stderr
gimme gimme gimme
  • Perintah yang digunakan dalam pengujian adalah man -w, untuk mendapatkan manpath saat ini

Easter egg yang ada di man

  • String bermasalah tersebut adalah easter egg yang ada di perintah man
  • Syarat pemicunya adalah sebagai berikut
    • Menjalankan man tanpa menentukan halaman manual
    • Atau menjalankan man -w
    • Waktu lokal adalah 00:30
  • Jika syarat terpenuhi, gimme gimme gimme dicetak ke stderr
# date +%T -s "00:30:00"
00:30:00


# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man
  • Bahkan dalam kasus ini, kode keluar tetap 0

Perilaku yang semula diharapkan

  • Output normal man -w seharusnya hanya mengembalikan jalur pencarian halaman manual
# man -w
/usr/local/share/man:/usr/share/man:/usr/man


# echo $?
0
  • Jika man dijalankan tanpa halaman, perilaku yang diharapkan adalah menanyakan halaman manual apa yang diinginkan dan mengembalikan kode keluar 1
# man
What manual page do you want?


# echo $?
1
  • Karena man -w mencetak jalur pencarian, perintah ini dapat dipakai sebagai komponen untuk memeriksa instalasi halaman manual atau dalam otomasi pengujian

Kode dan cakupan distribusi

  • String tersebut ditemukan di RHEL, OpenSUSE, Fedora, Debian, dan lainnya, sehingga bukan perilaku khusus distribusi tertentu
  • Keberadaannya dapat diperiksa dengan melakukan grep string tersebut pada biner
  • Output muncul dari kode src/man.c di man-db
time_t now = time (NULL);
struct tm *localnow = localtime (&now);
if (localnow &&
    localnow->tm_hour == 0 && localnow->tm_min == 30)
  fprintf (stderr, "gimme gimme gimme\n");

String dari lagu ABBA dan tweet

  • gimme gimme gimme adalah string yang berasal dari “Gimme! Gimme! Gimme! (A Man After Midnight)” milik ABBA
  • Dalam tweet tahun 2011, Marnanel Thurman mengusulkan sebagai lelucon bahwa jika man dijalankan pada 00:01, ia seharusnya mencetak gimme gimme gimme
  • Pemelihara man memasukkan usulan itu ke kode sungguhan
  • Commit awal terpicu pada 00:01, lalu dalam komentar ditambahkan bahwa kemudian waktunya diubah menjadi 00:30 bersama pesan commit “half past twelve”

Perbaikan dan penghapusan

  • Colin Watson, pemelihara man-db, pertama-tama memperbaikinya lewat commit 84bde8 agar easter egg ini tidak terpicu pada man -w
  • Setelah itu, Colin Watson menerapkan commit penghapusan untuk menghapus easter egg sepenuhnya
  • Easter egg yang dihapus itu dijadwalkan hilang pada man-db 2.8.0 yang saat itu akan datang
  • Pemelihara menilai bahwa easter egg tersebut memang membuat sebagian orang tertawa, tetapi mengganggu sebagian lainnya, dan enam tahun sudah cukup lama

3 komentar

 
tribela 2024-10-07

Kalau mau memasukkan Easter egg seperti ini, ada baiknya juga memeriksa sekali apakah standard input/output adalah TTY. Jika itu skrip shell, bisa diverifikasi dengan [[ -t 1]].

 
y15un 2024-10-05

man diterjemahkan menjadi “pria”, ya wkwk

 
GN⁺ 2024-10-05
Opini Hacker News
  • Dulu, sebelum telemedicine sepopuler sekarang, saya membuat aplikasi web telemedicine, dengan fitur pasien mengisi kuesioner online lalu dokter melihat jawabannya.
    Saat melakukan onboarding berbagai spesialisasi, ada logika yang cukup kuat untuk mengontrol apakah pertanyaan ditampilkan secara kondisional. Ketika mengerjakan fitur untuk klinik psikiatri baru, ada pertanyaan yang seharusnya muncul tapi tidak muncul, jadi saat debugging saya menaruh banyak teks debug yang konyol dan agak kesal di samping pertanyaan.
    Saya pikir masalahnya sudah diperbaiki dan semuanya sudah dibersihkan, tetapi ternyata masih ada satu teks I SEE YOU!!! dalam huruf merah besar yang muncul pada kombinasi jawaban tertentu, dan itu ditemukan oleh seorang pasien yang sedang mengisi kuesioner penilaian paranoia untuk klinik psikiatri yang baru dibuka.
    Setelah itu saya mulai memakai penanda debug seperti aaa atau 111.

    • Di Google, string untuk debugging diwajibkan memuat DO NOT SUBMIT, lalu setelah string debug pernah masuk ke lingkungan produksi, ditambahkan bot yang memeriksanya.
      Seingat saya itu terjadi setelah insiden WD yang legendaris, ketika dalam kode pengujian “western digital” diubah menjadi “woodly doodly” lalu tanpa sengaja ter-deploy.
    • Dulu saya pernah melakukan hal serupa saat membuat fitur di situs judi yang memungkinkan orang mengunggah taruhan secara massal lewat file khusus.
      Saat pengembangan, fitur itu hanya rusak dalam kondisi yang sangat spesifik dan tampak seperti kondisi aneh yang hanya berlaku di lingkungan pengembangan lokal, jadi saya memasukkan pesan error seperti “watch and amaze while the application eats itself!”. Kalimat itu terinspirasi dari error yang pernah saya lihat di game Discworld untuk PlayStation.
      Namun begitu naik ke produksi, kondisi yang memicu error itu ternyata tidak sespesifik yang saya kira, dan dukungan pelanggan lumpuh karena ratusan orang menelepon, mengira uang mereka hilang. Pengguna fitur ini adalah petaruh besar yang memasang taruhan bernilai tinggi, jadi manajemen sama sekali tidak senang.
      Untungnya saya tidak dipecat dan masalahnya cepat diperbaiki, tetapi rasanya seperti pisau sudah dekat sekali dengan leher. Di salah satu pekerjaan pertama saya hampir 20 tahun lalu, minggu itu saya benar-benar mendapat pelajaran berharga.
    • Ada komentar yang sudah lama saya tinggalkan di file ini, tetapi project lead saya orang yang cukup profesional, jadi ia menghapusnya. Komentarnya adalah # MULTIPASS!
      https://github.com/workarea-commerce/workarea/blob/master/co...
      Konteksnya begini: The 5th Element adalah film keren, nama anjing kakak perempuan saya adalah Leeloo Dallas Multipass dan dia anjing favorit saya, serta sayalah developer pertama yang membuat fitur query pencarian ProductMultipass.
      Saya juga jadi tahu bahwa komentar yang lucu bisa membuat developer lain lebih menyukai produk.
    • Untuk penanda debug, biasanya saya memakai inisial saya bersama DEBUG.
      Mudah dicari dengan grep sebelum commit, dan kalaupun masuk ke lingkungan produksi, setidaknya bukan string yang benar-benar tidak jelas identitasnya.
    • Saya cukup yakin pernah meng-commit pesan debug, dan rasanya kebanyakan orang yang menulis kode setidaknya pernah sekali melakukannya.
      Untungnya isinya tidak terlalu memalukan, dan sekarang sebagai pemeriksaan terakhir sebelum commit dan push, saya selalu melihat git diff lalu mencari print atau keluaran serupa dalam bahasa yang dipakai.
      Waktu SMA, seorang teman punya kebiasaan memberi judul yang tidak pantas pada draf tugas. Saat kami saling mengoreksi memang lucu, tetapi akhirnya ia pernah lupa mengembalikan judulnya. Di kelas bahasa Inggris, ketika guru berkeliling mengumpulkan tugas, teman saya melihat kertasnya sendiri lalu tiba-tiba lari keluar dengan alasan ke toilet, pergi ke lab komputer, dan mencetak ulang salinan tanpa umpatan 24 poin di bagian paling atas. Saya hampir mati tertawa.
  • Kalau perangkat lunaknya gratis dan maintainer-nya tidak dibayar, menurut saya beberapa easter egg adalah harga kecil yang wajar.
    Memang Colin dibayar, tetapi bukan terutama untuk memelihara man.
    Di sebuah perusahaan tempat saya dulu bekerja, ada developer yang pernah memasukkan kalimat dalam syarat dan ketentuan bahwa pengguna menyerahkan jiwa mereka kepada perusahaan. Tujuannya untuk melihat apakah eksekutif atau tim legal benar-benar memeriksa syarat dan ketentuan seperti yang dijanjikan; ternyata tidak, dan banyak jiwa berhasil ditangkap.

    • Kalau begitu, seluruh syarat dan ketentuan bisa saja menjadi tidak sah.
  • Coding harus menyenangkan, dan menulis kode juga harus menyenangkan. Menurut saya orang-orang ini melakukannya dengan baik.
    Gagasan bahwa open source harus dingin dan serius itu muncul karena didorong perusahaan. Kalau saya membuat program bersama teman, saya mungkin akan menyelipkan easter egg di sana-sini untuk mengingatkan bahwa ada manusia di sisi lain.

    • Karena tersembunyi, kebanyakan orang tidak akan menemui easter egg itu.
      Orang yang menemuinya akan menginjaknya secara tidak sengaja seperti penulis asli, dan pipeline continuous integration penulis asli jadi rusak. Menurut saya easter egg bukan alat yang bagus untuk mengingatkan bahwa “ada manusia di sisi lain”.
      Setidaknya begitu di luar perangkat lunak hiburan.
    • Jarang ada hal yang semenyenangkan dan sepuas easter egg yang tersembunyi dengan baik.
      Apalagi jika hal yang dikerjakan dikelilingi prosedur birokratis. Favorit pribadi saya adalah Rick Roll yang saya sembunyikan di dalam source code aplikasi pemerintah yang saya perbaiki sebagai konsultan beberapa tahun lalu. Hanya developer yang mengerjakan subsistem yang sangat spesifik yang bisa menemukannya, tetapi jika ditemukan, dari konteksnya akan jelas mengapa itu ada di sana.
    • Easter egg yang lucu bagi seseorang bisa menjadi pemicu perilaku salah nondeterministik yang menghasilkan konsekuensi nyata dalam alur kerja orang lain.
      Ini menambah satu alasan lagi mengapa sulit memercayai perangkat lunak yang mengintegrasikan berbagai bagian dengan proses rekayasa yang berbeda-beda ke dalam aplikasi keselamatan jiwa atau misi-kritis.
  • Sekarang sudah tidak ada lagi.
    Developer man-db, Colin Watson, menilai itu sudah cukup lucu dan ceritanya juga tidak akan terlupakan, lalu menghapus easter egg itu sepenuhnya.
    https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=b225...

    • Saya pernah membaca komentar indah dalam diskusi isu ini yang sekarang tidak bisa saya temukan.
      Isinya mengatakan bahwa easter egg seperti ini seharusnya dibiarkan, karena pada akhirnya hal-hal seperti inilah yang membedakan manusia dan mesin.
    • Saya baru saja mencobanya di Raspberry Pi lama dan masih ada. Berbasis Debian 9 Stretch.
  • Artikel terkait:
    Why does man print “gimme gimme gimme” at 00:30? (2017) - https://news.ycombinator.com/item?id=27994194 - Juli 2021, 211 komentar
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15747313 - November 2017, 159 komentar
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15746972 - November 2017, 1 komentar
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15742221 - November 2017, 1 komentar

  • Idenya menarik, tapi tidak boleh dimasukkan ke alur eksekusi normal. Itu merugikan pengguna
    Seperti yang dikatakan penulis artikel asli, akan lebih baik kalau bentuknya man -abba

    • Kalau melihat jawaban pertama, awalnya ini dimaksudkan hanya aktif dalam kondisi error, yaitu saat tidak ada halaman yang ditentukan
      Namun karena kesalahan, ini juga aktif ketika halaman man ditentukan dengan flag --path alih-alih nama halaman
    • $ man --abba --format=json
      ["gimme", "gimme", "gimme"]
    • Sudah dihapus. Referensi: https://news.ycombinator.com/item?id=41738239
  • Update ini merusak workflow saya

    • Berkat update ini workflow saya jadi beres. Soalnya saya butuh man lewat tengah malam
  • Saat menyingkirkan sistem telepon lama, saya memasang FreePBX di perusahaan
    Karena ekstensi tidak terlalu banyak, kami memakai 1xx, 2xx, 3xx sebagai ekstensi berdasarkan jenisnya dan masih banyak nomor tersisa. Lalu saya memasukkan easter egg kecil: kalau ada yang menelepon ekstensi 666, sistem akan memutar tawa menyeramkan Vincent Price di bagian akhir Thriller-nya Michael Jackson
    Satu atau dua tahun kemudian, pada suatu pagi buta, seorang rekan mengirim pesan bahwa sepertinya telepon kami diretas, dan katanya ke mana pun dia menelepon selalu terdengar suara menyeramkan. Setelah dicek, ternyata ada sesuatu yang salah sehingga semua panggilan dialihkan ke ekstensi yang terakhir ditambahkan, yaitu 666
    Tentu saja orang-orang tidak menganggap easter egg itu lucu, dan mereka merasa tersinggung oleh suara tawanya

  • Saya penasaran apakah ada hipotesis kenapa ada pengujian yang memanggil man tanpa argumen
    Apakah tujuannya hanya memastikan man terpasang? Kalaupun begitu, rasanya orang akan menguji perintah dengan cara yang biasa dipakai

    • Kalau membaca jawabannya, sepertinya easter egg itu juga tidak sengaja aktif ketika halaman yang akan dimuat diberikan lewat --path
      Bagian ini kemudian diperbaiki, dan setelah itu seluruh easter egg juga dihapus
    • Sepertinya pertanyaan Stack Overflow itu sendiri adalah pertanyaan rekayasa agar orang lain bisa menceritakan kisahnya secara publik
    • Ini dibahas lebih detail di komentar pertanyaan Stack Overflow yang ditautkan; singkatnya, karena yang diinginkan adalah manpath: man -w
    • Bisa juga itu adalah tes otomatis untuk memastikan image build terpasang dengan benar dan man menghasilkan output yang diharapkan
  • Untuk menentukan apakah man berakhir dengan benar, menurut saya cukup percaya pada exit code
    Menilai dari panjang stderr selalu rapuh