2 puan yazan GN⁺ 2024-10-05 | 3 yorum | WhatsApp'ta paylaş
  • Otomatik testlerin yalnızca 00:30'da başarısız olmasının nedeni, man -w komutunun beklenmedik stderr dizgesi gimme gimme gimme çıktısını da vermesiydi
  • Bu dizge, man içindeki bir easter egg idi; kılavuz sayfası belirtmeden çalıştırıldığında veya -w kullanıldığında yerel saat 00:30 ise görünüyordu
  • İfade, ABBA'nın “Gimme! Gimme! Gimme! (A Man After Midnight)” şarkısından geliyordu ve 2011'deki bir tweet şakası man-db koduna yansımıştı
  • man -w, manpath'i yazdırıp çıkış kodunu da 0 döndürdüğü için otomasyonda kullanılabiliyordu, ancak bu easter egg çıktı ayrıştırmasını bozabiliyordu
  • man-db önce bunun man -w ile tetiklenmemesini düzeltti, ardından man-db 2.8.0 ile easter egg'i tamamen kaldırmaya karar verdi

Yalnızca 00:30'da başarısız olan test

  • Otomatik test çoğu zaman normal çalışıyordu, ancak yalnızca 00:30'da çalıştığında başarısız oluyordu
  • Doğrudan neden, stderr'e beklenmeyen bir dizgenin eklenmesiydi
gimme gimme gimme
  • Testte kullanılan komut man -w idi ve amaç mevcut manpath değerini almaktı

man içindeki easter egg

  • Sorunlu dizge, man komutunun içine yerleştirilmiş bir easter egg idi
  • Tetiklenme koşulları şunlardı
    • man, bir kılavuz sayfası belirtilmeden çalıştırılır
    • veya man -w çalıştırılır
    • yerel saat 00:30 olur
  • Koşullar sağlanırsa stderr'e gimme gimme gimme yazdırılıyordu
# date +%T -s "00:30:00"
00:30:00


# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man
  • Bu durumda bile çıkış kodu 0 olarak kalıyordu

Aslında beklenen davranış

  • man -w için normal çıktı yalnızca kılavuz sayfası arama yolunu döndürmekti
# man -w
/usr/local/share/man:/usr/share/man:/usr/man


# echo $?
0
  • man sayfa belirtilmeden çalıştırıldığında, hangi kılavuz sayfasının istendiğini sorması ve 1 çıkış kodu döndürmesi beklenen davranıştı
# man
What manual page do you want?


# echo $?
1
  • man -w arama yolunu yazdırdığı için, kılavuz sayfası kurulumunu doğrulamakta veya test otomasyonunun bir bileşeni olarak kullanılabiliyordu

Kod ve dağıtım kapsamı

  • Bu dizge RHEL, OpenSUSE, Fedora, Debian gibi sistemlerde bulundu; davranış belirli bir dağıtıma özgü değildi
  • İkili dosyada dizgeyi grep ile arayarak varlığı doğrulanabiliyordu
  • Çıktı, man-db içindeki src/man.c kodundan geliyordu
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");

ABBA şarkısından ve tweet'ten gelen ifade

  • gimme gimme gimme, ABBA'nın “Gimme! Gimme! Gimme! (A Man After Midnight)” şarkısından gelen bir ifadeydi
  • Marnanel Thurman, 2011'de attığı bir tweette man komutunun 00:01'de çalıştırıldığında gimme gimme gimme yazdırması gerektiğini şaka yollu önermişti
  • man bakımcısı bu öneriyi gerçekten koda ekledi
  • İlk commit 00:01'de tetikleniyordu; daha sonra yorumlarda belirtildiğine göre, “half past twelve” commit mesajıyla 00:30'a değiştirildi

Düzeltme ve kaldırma

  • man-db bakımcısı Colin Watson önce 84bde8 commit'i ile bu easter egg'in man -w üzerinde tetiklenmemesini sağladı
  • Ardından Colin Watson, easter egg'i tamamen kaldıran commit'i uyguladı
  • Kaldırılan easter egg'in planlanan man-db 2.8.0 sürümünde artık bulunmaması bekleniyordu
  • Bakımcı, easter egg'in bazı insanları güldürdüğünü ama bazıları için rahatsız edici olduğunu, 6 yılın da yeterince uzun bir süre olduğunu düşündü

3 yorum

 
tribela 2024-10-07

Böyle türden bir easter egg ekleyecekseniz, standart giriş/çıkışın TTY olup olmadığını bir kez kontrol etmek de iyi bir yöntemdir. Shell script ise [[ -t 1]] ile doğrulanabilir.

 
y15un 2024-10-05

man erkek olarak çevrilmiş demek ki, haha

 
GN⁺ 2024-10-05
Hacker News yorumları
  • Bir zamanlar, uzaktan muayene bugünkü kadar yaygınlaşmadan önce bir uzaktan muayene web uygulaması yapmıştım; hastalar çevrimiçi bir anket dolduruyor, doktor da yanıtları görüyordu.
    Çeşitli uzmanlıkları sisteme dahil ederken soruların gösterilip gösterilmeyeceğini koşullu olarak kontrol eden epey güçlü bir mantığımız vardı. Yeni bir psikiyatri kliniği özelliği üzerinde çalışırken görünmesi gereken bir soru görünmüyordu; debug ederken soruların yanına saçma sapan ve biraz da öfkeli birçok debug ifadesi koydum.
    Sorunu düzelttiğimi ve ortalığı topladığımı sanıyordum, ama belirli bir yanıt kombinasyonunda büyük kırmızı harflerle I SEE YOU!!! yazan bir metni geride bırakmışım; bunu da yeni açılan psikiyatri kliniğinin paranoya değerlendirme anketini dolduran bir hasta fark etti.
    Ondan sonra debug işaretleri için aaa ya da 111 gibi şeyler kullanmaya başladım.

    • Google'da debug amaçlı dizgilerin içine DO NOT SUBMIT konması gerekiyordu; bir debug dizgisi üretim ortamına çıktıktan sonra bunu kontrol eden bir bot eklendi.
      Sanırım o efsanevi WD olayından sonraydı: test kodunda “western digital” ifadesi “woodly doodly” olarak değiştirilmiş, sonra da yanlışlıkla dağıtıma çıkmıştı.
    • Eskiden bir bahis sitesinde insanların özel bir dosyayla toplu bahis yükleyebilmesini sağlayan bir özellik geliştirirken benzer bir şey yapmıştım.
      Geliştirme sırasında yalnızca çok belirli bir durumda bozuluyordu ve yerel geliştirme ortamına özgü tuhaf bir koşul gibi görünüyordu; bu yüzden “watch and amaze while the application eats itself!” gibi bir hata mesajı koydum. İfade, PlayStation için olan Discworld oyununda gördüğüm bir hatadan esinlenmişti.
      Ama üretime çıkınca bu hatayı tetikleyen koşulun sandığımdan daha az özel olduğu ortaya çıktı; paralarının kaybolduğunu sanıp arayan yüzlerce kişi yüzünden müşteri destek kilitlendi. Bu özelliği kullananlar büyük paralar yatıran yüksek limitli bahisçilerdi, dolayısıyla yönetim de hiç memnun kalmadı.
      Neyse ki kovulmadım ve hızlıca düzelttim, ama bıçağın boğazıma dayandığını hissettim. Yaklaşık 20 yıl önceki ilk işlerimden birinde, o hafta gerçekten değerli bir ders aldım.
    • Bu dosyada uzun süre bıraktığım bir yorum vardı; proje lideri oldukça profesyonel biri olduğu için silip attı. Yorum # MULTIPASS! idi.
      https://github.com/workarea-commerce/workarea/blob/master/co...
      Bağlam şu: The 5th Element harika bir filmdi, ablamın köpeğinin adı Leeloo Dallas Multipass'tı ve en sevdiğim köpekti; ProductMultipass arama sorgusu özelliğini ilk yazan geliştirici de bendim.
      Eğlenceli yorumların, başka geliştiricilerin ürünü daha çok sevmesini sağladığını da öğrendim.
    • Debug işareti olarak genelde baş harflerimi DEBUG ile birlikte kullanırım.
      Commit öncesi grep ile bulması kolay oluyor; olur da üretim ortamına girerse de tamamen ne olduğu belirsiz bir dizgi olmuyor.
    • Debug mesajı commit ettiğim kesin olmuştur; kod yazan çoğu kişinin de en az bir kez başına gelmiştir diye düşünüyorum.
      Neyse ki çok utanç verici bir şey değildi. Bugünlerde commit ve push etmeden önce son kontrol olarak her zaman git diffe bakıyor, print ya da ilgili dildeki benzer çıktıları aramaya çalışıyorum.
      Lisede bir arkadaşımın taslak ödev başlıklarını uygunsuz şekilde adlandırma alışkanlığı vardı; birbirimizin yazılarını düzeltirken komikti ama sonunda bir kez başlığı geri çevirmeyi unuttu. İngilizce dersinde öğretmen ödevleri toplamak için dolaşırken arkadaşım kendi kâğıdına baktı, birden tuvalete gittiğini söyleyip fırladı, bilgisayar odasında en üstte 24 punto küfür olmayan bir kopyayı yeniden bastırıp geldi; ben de gülmekten ölüyordum.
  • Yazılım ücretsizse ve bakımcısı para almıyorsa, birkaç easter egg küçük bir bedel sayılır.
    Elbette Colin para alıyordu, ama esas olarak man bakımı karşılığında almıyordu.
    Bir zamanlar çalıştığım şirkette bir geliştirici, kullanım şartlarına kullanıcının ruhunu şirkete devrettiğini söyleyen bir cümle koymuştu. Amacı, yöneticilerin ya da hukuk ekibinin söz verdikleri gibi şartları kontrol edip etmediğini görmekti; etmediler ve birçok ruh ele geçirildi.

    • O zaman kullanım şartlarının tamamı geçersiz hâle gelebilir.
  • Kodlama eğlenceli olmalı, kod yazmak da eğlenceli olmalı. Bence bu kişiler iyi iş çıkarmış.
    Açık kaynağın soğuk ve ciddi olması gerektiği fikri, ancak şirketlerin işin başını çekmesiyle ortaya çıktı. Bir arkadaşımla program yazıyor olsam, karşı tarafta da bir insan olduğunu hatırlatmak için oraya buraya easter egg koyardım.

    • Gizli oldukları için çoğu kişi o easter egg'lerle karşılaşmaz.
      Karşılaşan kişi, asıl yazıdaki gibi tesadüfen üzerine basar; asıl yazıda sürekli entegrasyon pipeline'ı bozulmuştu. “Karşı tarafta da bir insan var”ı hatırlatma aracı olarak easter egg'lerin pek iyi olduğunu düşünmüyorum.
      En azından eğlence yazılımlarının dışında böyle.
    • İyi gizlenmiş bir easter egg kadar eğlenceli ve tatmin edici çok az şey vardır.
      Özellikle üzerinde çalıştığınız şey bürokratik süreçlerle çevriliyse. Kişisel favorim, birkaç yıl önce danışman olarak düzelttiğim bir devlet uygulamasının kaynak koduna sakladığım Rick Roll. Yalnızca çok belirli bir alt sistem üzerinde çalışan geliştiriciler bulabilir, ama bulduklarında bağlam gereği neden orada olduğunu anlarlar.
    • Birine eğlenceli gelen bir easter egg, başka biri için kendi iş akışında gerçek sonuçlar doğurabilecek deterministik olmayan bir hatalı davranış tetikleyicisi olabilir.
      Can güvenliği ya da görev açısından kritik uygulamalarda, farklı mühendislik süreçlerine sahip çok sayıda parçanın entegre edildiği yazılımlara güvenmeyi zorlaştıran bir neden daha.
  • Artık içinde yok.
    man-db geliştiricisi Colin Watson, bunun yeterince eğlenceli olduğunu ve hikâyenin de unutulmayacağını düşünerek easter egg'i tamamen kaldırdı.
    https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=b225...

    • Bu issue tartışmasında artık bulamadığım güzel bir yorum okumuştum.
      Böyle easter egg'lerin bırakılması gerektiğini söylüyordu; çünkü nihayetinde bizi insanlarla makineleri ayıran şeylerden biri bunlardı.
    • Eski bir Raspberry Pi'de az önce denedim, hâlâ var. Debian 9 Stretch tabanlı.
  • İlgili yazılar:
    Why does man print “gimme gimme gimme” at 00:30? (2017) - https://news.ycombinator.com/item?id=27994194 - Temmuz 2021, 211 yorum
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15747313 - Kasım 2017, 159 yorum
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15746972 - Kasım 2017, 1 yorum
    Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15742221 - Kasım 2017, 1 yorum

  • Eğlenceli bir fikir ama normal çalışma akışına konmamalı. Kullanıcıya zarar verir
    Orijinal yazının yazarının dediği gibi man -abba olsaydı daha iyi olurdu

    • İlk yanıta bakılırsa aslında yalnızca hata durumunda, yani bir sayfa belirtilmediğinde tetiklenmesi amaçlanmış
      Ancak yanlışlıkla sayfa adı yerine --path bayrağıyla man sayfası belirtildiğinde de tetiklenmiş
    • $ man --abba --format=json
      ["gimme", "gimme", "gimme"]
    • Kaldırıldı. Referans: https://news.ycombinator.com/item?id=41738239
  • Bu güncelleme yüzünden çalışma akışım bozuldu

    • Bu güncelleme sayesinde çalışma akışım düzeldi. Gece yarısından sonra mane ihtiyacım vardı
  • Eski telefon sistemini kaldırırken şirkete FreePBX kurmuştum
    Dahili hat sayısı fazla olmadığından 1xx, 2xx, 3xx’i farklı türde dahili hatlar için kullandıktan sonra bile çok numara kalmıştı; biri 666 numaralı dahili hattı ararsa Michael Jackson’ın Thriller’ının sonundaki Vincent Price’ın ürkütücü kahkahasını çalan küçük bir easter egg eklemiştim
    Bir iki yıl sonra bir sabah erken saatte bir iş arkadaşım telefonların hacklenmiş gibi göründüğünü, nereyi ararsa arasın ürkütücü bir ses duyduğunu yazdı. Kontrol edince bir şeylerin ters gittiğini ve tüm aramaların en son eklediğim dahili hat olan 666’ya yönlendirildiğini gördüm
    Doğal olarak insanlar bu easter egg’i komik bulmadı; kahkahadan rahatsız oldular

  • Neden argümansız man çağıran bir test vardı, buna dair bir varsayım var mı merak ediyorum
    Amaç yalnızca manin kurulu olup olmadığını kontrol etmek miydi? Öyle olsa bile komutu genelde kullanıldığı şekilde test ederler diye düşünürdüm

    • Yanıtı okuyunca, yüklenecek sayfa --path ile geçirildiğinde de easter egg’in yanlışlıkla tetiklendiği anlaşılıyor
      Daha sonra bu kısım düzeltildi, daha da sonra easter egg’in tamamı kaldırıldı
    • Stack Overflow sorusunun kendisi, başka birinin kendi hikâyesini açıkça anlatabilmesi için sorulmuş zorlama bir soru gibi görünüyor
    • Bağlantı verilen Stack Overflow sorusunun yorumlarında ayrıntılı ele alınmış; kısaca sebep manpath istenmesiydi: man -w
    • Derleme imajının düzgün kurulduğunu ve manin beklenen çıktıyı verdiğini kontrol eden bir otomasyon testi de olabilir
  • manin doğru şekilde sonlanıp sonlanmadığına karar vermek için çıkış koduna güvenmek yeterli bence
    stderr uzunluğuna göre karar vermek her zaman kırılgandır