- 00:30 पर ही automated test के fail होने की वजह यह थी कि
man -w ने उम्मीद के विपरीत stderr string gimme gimme gimme भी प्रिंट कर दी
- यह string
man का एक easter egg था, जो manual page दिए बिना चलाने पर या -w इस्तेमाल करने पर local time 00:30 होने पर दिखाई देता था
- यह वाक्यांश ABBA के “Gimme! Gimme! Gimme! (A Man After Midnight)” से आया था, और 2011 के एक tweet वाले मज़ाक को
man-db code में डाल दिया गया था
man -w manpath प्रिंट करता था और exit code भी 0 देता था, इसलिए इसे automation में इस्तेमाल किया जा सकता था, लेकिन easter egg output parsing को तोड़ सकता था
man-db ने पहले इसे man -w पर trigger न होने देने के लिए ठीक किया, और बाद में man-db 2.8.0 में easter egg को पूरी तरह हटाने का फैसला किया
सिर्फ 00:30 पर fail होने वाला test
- automated test ज़्यादातर समय सही चलता था, लेकिन 00:30 पर चलने पर ही fail हो जाता था
- सीधा कारण यह था कि
stderr में एक अनपेक्षित string जुड़ रही थी
gimme gimme gimme
- test में इस्तेमाल किया गया command
man -w था, जिसका उपयोग मौजूदा manpath पाने के लिए किया जा रहा था
man में मौजूद easter egg
- यह problematic string
man command में मौजूद एक easter egg थी
- इसके trigger होने की शर्तें ये थीं
- manual page बताए बिना
man चलाया जाए
- या
man -w चलाया जाए
- local time 00:30 हो
- शर्तें पूरी होने पर
stderr में gimme gimme gimme प्रिंट होता था
# date +%T -s "00:30:00"
00:30:00
# man -w
gimme gimme gimme
/usr/local/share/man:/usr/share/man:/usr/man
- इस स्थिति में भी exit code 0 ही रहता था
मूल रूप से अपेक्षित व्यवहार
man -w का normal output सिर्फ manual page search path लौटाना था
# man -w
/usr/local/share/man:/usr/share/man:/usr/man
# echo $?
0
- बिना page के
man चलाने पर यह पूछना कि कौन-सा manual page चाहिए, और exit code 1 लौटाना अपेक्षित व्यवहार था
# man
What manual page do you want?
# echo $?
1
man -w search path प्रिंट करता है, इसलिए इसे manual page installation check या test automation के एक component के रूप में इस्तेमाल किया जा सकता था
code और distributions की सीमा
- यह string RHEL, OpenSUSE, Fedora, Debian आदि में मिली, इसलिए यह किसी एक specific distribution का व्यवहार नहीं था
- binary में string को
grep करके इसकी मौजूदगी जाँची जा सकती थी
- output
man-db के src/man.c code से आ रहा था
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 के गाने और tweet से आया यह string
gimme gimme gimme ABBA के “Gimme! Gimme! Gimme! (A Man After Midnight)” से आया हुआ वाक्यांश था
- Marnanel Thurman ने 2011 के एक tweet में मज़ाक में सुझाव दिया था कि
man को 00:01 पर चलाने पर gimme gimme gimme प्रिंट होना चाहिए
man के maintainer ने उस सुझाव को सचमुच code में डाल दिया
- comments में यह भी जोड़ा गया कि शुरुआती commit 00:01 पर trigger होता था, और बाद में “half past twelve” नाम के commit message के साथ इसे 00:30 कर दिया गया
fix और removal
man-db maintainer Colin Watson ने पहले 84bde8 commit के जरिए यह ठीक किया कि man -w पर यह easter egg trigger न हो
- इसके बाद Colin Watson ने easter egg को पूरी तरह हटाने वाले commit को लागू किया
- हटाया गया easter egg तयशुदा man-db 2.8.0 में गायब होने वाला था
- maintainer का मानना था कि इस easter egg ने कुछ लोगों को हँसाया, लेकिन कुछ के लिए यह परेशान करने वाला था, और 6 साल तक रहना काफी लंबा समय था
3 टिप्पणियां
अगर आप इस तरह के Easter egg जोड़ने वाले हैं, तो यह एक बार जाँच लेना भी अच्छा तरीका है कि standard input/output TTY है या नहीं। अगर यह shell script है, तो
[[ -t 1]]से इसकी जाँच की जा सकती है.manका अनुवाद पुरुष के रूप में हो गया है, हाहाHacker News की राय
काफी पहले, जब telemedicine आज जितनी आम नहीं हुई थी, मैंने एक telemedicine web app बनाया था। उसमें मरीज online questionnaire भरता था और डॉक्टर उसके जवाब देख सकता था।
कई specialties को onboard करते समय हमारे पास questions दिखाने या न दिखाने को conditionally control करने वाली काफी powerful logic थी। एक नए psychiatry clinic feature पर काम करते हुए, जो सवाल दिखना चाहिए था वह नहीं दिख रहा था, इसलिए debugging के दौरान मैंने सवाल के पास ढेर सारे बेतुके और थोड़े गुस्से वाले debug text डाल दिए।
मुझे लगा कि problem ठीक करके सब साफ कर दिया है, लेकिन एक खास answers combination में बड़े लाल अक्षरों में I SEE YOU!!! दिखाने वाला एक text छूट गया। उसे नए खुले psychiatry clinic की paranoia assessment questionnaire भर रहे एक patient ने देख लिया।
उसके बाद से debug markers के लिए मैंने
aaaया111जैसी चीजें इस्तेमाल करना शुरू कर दिया।मुझे याद है कि यह उस legendary WD incident के बाद हुआ था, जिसमें test code में “western digital” को “woodly doodly” में बदला गया था और वह गलती से deploy हो गया।
development के दौरान यह केवल बहुत specific situation में टूटता था, और local development environment से जुड़ी अजीब condition जैसा लग रहा था, इसलिए मैंने “watch and amaze while the application eats itself!” जैसा error message डाल दिया। यह phrase असल में PlayStation के Discworld game में देखे गए एक error से inspired था।
लेकिन production में जाने पर पता चला कि उस error को trigger करने वाली condition उतनी भी special नहीं थी, और पैसे गायब हो गए लगने पर call करने वाले सैकड़ों लोगों की वजह से customer support ठप हो गया। इस feature का इस्तेमाल करने वाले लोग बड़े पैसे लगाने वाले high-stakes bettors थे, इसलिए management भी बिल्कुल खुश नहीं था।
सौभाग्य से मुझे निकाला नहीं गया और मैंने जल्दी fix कर दिया, लेकिन ऐसा लगा जैसे तलवार गर्दन के बहुत पास आ गई हो। करीब 20 साल पहले अपनी शुरुआती नौकरियों में से एक में उस हफ्ते मैंने सचमुच कीमती सबक सीखा।
# MULTIPASS!https://github.com/workarea-commerce/workarea/blob/master/co...
context यह था: The 5th Element एक शानदार film है, मेरी बहन के कुत्ते का नाम Leeloo Dallas Multipass था और वह मेरा favorite dog था, और
ProductMultipasssearch query feature सबसे पहले बनाने वाला developer मैं ही था।मुझे यह भी समझ आया कि मजेदार comments दूसरे developers को product से ज्यादा लगाव करा देते हैं।
commit से पहले
grepसे ढूंढना आसान होता है, और अगर गलती से production environment में चला भी जाए तो वह पूरी तरह अनजान string नहीं लगती।शुक्र है कि उसमें कुछ बहुत शर्मनाक नहीं था, और आजकल commit और push करने से पहले आखिरी check के तौर पर मैं हमेशा
git diffदेखता हूं औरprintया उस language के similar output को search करने की कोशिश करता हूं।हाई स्कूल में मेरे एक दोस्त की आदत थी कि वह draft assignments को inappropriate titles देता था। जब हम आपस में proofread करते थे तो यह मजेदार लगता था, लेकिन आखिरकार एक बार वह title वापस बदलना भूल गया। English class में जब teacher assignments collect करने घूम रहे थे, तो दोस्त ने अपना paper देखा और अचानक bathroom जाने का बहाना करके भागा, computer lab से बिना ऊपर 24-point गाली वाले title की copy फिर से print कर लाया, और मैं हंसते-हंसते मरने वाला था।
अगर software free है और maintainer को पैसे नहीं मिलते, तो कुछ Easter eggs छोटी-सी कीमत ही लगते हैं।
बेशक Colin को पैसे मिल रहे थे, लेकिन मुख्य रूप से
manmaintain करने के लिए नहीं।एक company में जहां मैं कभी काम करता था, एक developer ने terms में एक line डाल दी थी कि user अपनी आत्मा company को सौंपता है। मकसद यह देखना था कि executives या legal team वादे के मुताबिक terms check करती है या नहीं। उन्होंने check नहीं किया, और कई आत्माएं कैद हो गईं।
coding मजेदार होनी चाहिए, और code लिखना भी मजेदार होना चाहिए। मुझे लगता है इन लोगों ने सही किया।
open source को ठंडा और बेहद serious होना चाहिए, यह विचार बस कंपनियों के हावी होने से आया है। अगर मैं अपने दोस्त के साथ कोई program बनाऊं, तो शायद जगह-जगह Easter eggs डालूंगा, ताकि यह याद रहे कि दूसरी तरफ भी इंसान हैं।
जो लोग टकराते हैं, वे original post की तरह गलती से उन पर कदम रख देते हैं, और original post में continuous integration pipeline टूट गई थी। “दूसरी तरफ भी इंसान है” याद दिलाने के tool के रूप में Easter eggs मुझे खास अच्छे नहीं लगते।
कम-से-कम entertainment software के बाहर तो नहीं।
खासकर जब जिस चीज पर काम हो रहा हो, वह bureaucratic procedures से घिरी हो। मेरी personal favorite चीज एक government application के source code में छिपाया गया Rick Roll है, जिसे मैंने कुछ साल पहले consulting में fix किया था। उसे केवल वही developer ढूंढ सकता है जो एक बहुत specific subsystem पर काम कर रहा हो, लेकिन मिलने पर context से समझ आ जाता है कि वह वहां क्यों है।
life-safety या mission-critical applications में अलग-अलग engineering processes वाले कई हिस्सों को जोड़कर बने software पर भरोसा करना मुश्किल होने की एक और वजह मिल जाती है।
अब यह इसमें नहीं है।
man-dbdeveloper Colin Watson ने माना कि यह काफी मजेदार था और कहानी भी भूली नहीं जाएगी, इसलिए उन्होंने Easter egg पूरी तरह हटा दिया।https://git.savannah.gnu.org/cgit/man-db.git/commit/?id=b225...
उसमें कहा गया था कि ऐसे Easter eggs रहने देने चाहिए, क्योंकि आखिर यही चीजें इंसान और मशीन में फर्क दिखाती हैं।
संबंधित पोस्ट:
Why does man print “gimme gimme gimme” at 00:30? (2017) - https://news.ycombinator.com/item?id=27994194 - जुलाई 2021, 211 कमेंट
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15747313 - नवंबर 2017, 159 कमेंट
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15746972 - नवंबर 2017, 1 कमेंट
Why does man print “gimme gimme gimme” at 00:30? - https://news.ycombinator.com/item?id=15742221 - नवंबर 2017, 1 कमेंट
आइडिया मज़ेदार है, लेकिन इसे सामान्य execution flow में नहीं डालना चाहिए। इससे users को नुकसान होता है
जैसा मूल पोस्ट के लेखक ने कहा, अगर यह
man -abbaहोता तो बेहतर होतालेकिन गलती से यह तब भी trigger हो गया जब page name की जगह
--pathflag से manpage specify किया गया$ man --abba --format=json["gimme", "gimme", "gimme"]इस update ने मेरा workflow तोड़ दिया
manचाहिए थापुराने phone system को हटाते समय हमने कंपनी में FreePBX install किया
extensions ज़्यादा नहीं थे, इसलिए 1xx, 2xx, 3xx को अलग-अलग तरह के extensions के लिए इस्तेमाल करने के बाद भी काफी numbers बचे हुए थे। मैंने एक छोटा Easter egg डाल दिया: अगर कोई extension 666 पर call करे, तो Michael Jackson के Thriller के अंत में आने वाली Vincent Price की डरावनी हंसी play हो
1-2 साल बाद, एक सुबह जल्दी एक colleague ने message किया कि लगता है phone hack हो गया है, और कहीं भी call करो तो डरावनी आवाज़ सुनाई दे रही है। जांचने पर पता चला कि कुछ गड़बड़ हो गई थी और सारी calls आख़िर में जोड़ा गया extension, यानी 666, पर forward हो रही थीं
जाहिर है, लोगों को वह Easter egg मज़ेदार नहीं लगा, और हंसी की आवाज़ से उन्हें अपमानजनक लगा
मुझे curious है कि बिना argument के
mancall करने वाला test था ही क्यों, इस पर किसी की कोई hypothesis है?क्या मकसद सिर्फ यह check करना था कि
maninstalled है या नहीं? ऐसा भी हो तो आम तौर पर जिस तरह use करते हैं, उसी तरह command test करेंगे--pathसे pass करने पर भी Easter egg गलती से trigger हो गया थाबाद में यह हिस्सा fix किया गया, और और बाद में पूरा Easter egg ही हटा दिया गया
man -wmanexpected output देता है या नहींअगर यह तय करना हो कि
manसही से exit हुआ या नहीं, तो मेरे हिसाब से exit code पर भरोसा करना चाहिएstderrकी length से तय करना हमेशा unstable होता है