2 पॉइंट द्वारा GN⁺ 5 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Uniqlo स्टोर में बेची गई Akamai डिज़ाइन टी-शर्ट पर obfuscated bash code छपा था, जो base64 --decode के परिणाम को eval से चलाता है, लेकिन असल में यह Peace for All कैंपेन के लिए एक easter egg था
  • Base64-encoded Here string को खोलने पर एक स्क्रिप्ट मिलती है जो टर्मिनल में ♥PEACE♥FOR♥ALL♥ टेक्स्ट को sine wave animation के रूप में बार-बार दिखाती है
  • Base64 में error correction नहीं होने से transcription मुश्किल थी, इसलिए string padding और quotes·braces के सही होने की जांच के बाद Android OCR, Tesseract और Claude के परिणामों की तुलना कर इसे व्यवस्थित किया गया
  • डिकोड की गई स्क्रिप्ट tput, bc और 256-color ANSI escape sequences को मिलाकर टर्मिनल आकार के हिसाब से अक्षरों की स्थिति और रंग निकालती है, और CTRL+C पर बंद होने पर cursor को restore करती है
  • Akamai ने पीछे छपे वास्तविक कोड को Linux से जोड़कर समझाया, और फ़ॉन्ट को शुरुआती अनुमान Consolas नहीं बल्कि Roboto Mono बताया गया

टी-शर्ट के पीछे का executable code

  • Uniqlo x Akamai Peace for All टी-शर्ट के सामने braces के अंदर heart बना है, और पीछे बड़े alphanumeric block छपे हैं
  • पास से देखने पर यह ब्लॉक shebang से शुरू होने वाला bash code है, जो Base64-encoded Here string को base64 --decode से खोलकर eval को देता है
  • ऊपर से देखने पर यह “virus distribution method” जैसा लग सकता है, लेकिन इसका असली उद्देश्य easter egg message दिखाना है
  • यह टी-शर्ट Akamai द्वारा Uniqlo की Peace for All campaign के समर्थन में डिज़ाइन किया गया उत्पाद है

OCR और transcription प्रक्रिया

  • Base64 में error correction feature नहीं होने के कारण, छपी हुई string को executable रूप में लाने के लिए perfect transcription ज़रूरी थी
  • string expected padding पर खत्म हो रही थी और quotes व braces भी मेल खा रहे थे, इसलिए इसके पूर्ण code होने की संभावना अधिक थी
  • transcription के लिए तीन तरीकों का साथ में उपयोग किया गया
    • Android का circle-to-search built-in OCR
    • Tesseract और कुछ options व adjustments
    • Claude के जरिए OCR और position table बनाना
  • तीनों परिणामों की diff से तुलना कर mismatch वाली जगहें ढूंढी गईं, और बाकी हिस्से को हाथ से ठीक किया गया
  • इसी Uniqlo x Akamai लाइन की दूसरी टी-शर्ट डिज़ाइन किसी बड़े code block से कटी हुई लगती है; imports कटे हुए हैं और return सिर्फ retu तक छपा है, इसलिए वह compile नहीं हो सकती

डिकोड किए गए bash स्क्रिप्ट का व्यवहार

  • Base64 को decode करने पर अच्छी तरह comments वाला bash easter egg सामने आता है
  • स्क्रिप्ट की शुरुआत में अंग्रेज़ी और जापानी में बधाई संदेश शामिल हैं
    • Congratulations! You found the easter egg! ❤️
    • おめでとうございます!隠されたサプライズを見つけました!❤️
  • animation के लिए इस्तेमाल होने वाली string ♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL... के रूप में दोहराई जाती है
  • टर्मिनल का आकार tput cols, tput lines से लिया जाता है, और string length bash के ${#text} से निकाली जाती है
  • cursor को tput civis से छिपाया जाता है, और SIGINT मिलने पर tput cnorm; exit से उसे वापस लाया जाता है

animation कैसे लागू किया गया

  • loop for (( t=0; ; t+=1 )) के रूप में एक infinite loop है जो लगातार चलता रहता है
  • हर iteration में अभी दिखाया जाने वाला character text से एक-एक करके लिया जाता है
  • position calculation के लिए bc -l से sine value निकाली जाती है
    • angle = t * 0.2
    • sine_value = s(angle)
    • x = (cols / 2) + (cols / 4) * sine_value
  • निकाले गए x को टर्मिनल सीमा से बाहर न जाने देने के लिए 0 से कम नहीं और cols - 1 से ज़्यादा नहीं रहने दिया जाता
  • रंग 256-color palette में cyan के 12 और orange के 208 के बीच gradient के रूप में निकाला जाता है
  • output ANSI escape sequences और tput cup का उपयोग करके तय position पर रंगीन character प्रिंट करता है, और newline के साथ नीचे की ओर बढ़ता है
  • नतीजतन Peace for All कैंपेन का संदेश टर्मिनल में लगातार चलने वाले sine wave loop के रूप में दिखाई देता है

फ़ॉन्ट और Akamai की डिज़ाइन व्याख्या

  • फ़ॉन्ट को लेकर शुरुआती अनुमान Consolas था, लेकिन Hacker News यूज़र ralphinus की पुष्टि के बाद इसे Roboto Mono के रूप में सुधारा गया
  • गलत अनुमान के आधार के रूप में हल्का तिरछा 0, serif-रहित 1, और BDyg व अंक 2 की गोल वक्रता जैसी बातें बताई गईं
  • Akamai ने टी-शर्ट लॉन्च के समय press release के जरिए डिज़ाइन का संदेश समझाया
  • हल्का पीला-भूरा रंग शुरुआती इंटरनेट कंप्यूटरों के “beige box” plastic case की ओर इशारा करता है, और सामने का heart यह दर्शाता है कि इंटरनेट का दुनिया भर में अच्छे काम के लिए इस्तेमाल हुआ है
  • पीछे का वास्तविक code Linux का reference है, और Akamai इसे “इंटरनेट की open source language” तथा अधिक सुरक्षित और connected दुनिया की साझा भाषा से जोड़ता है
  • इसी टी-शर्ट में रुचि लेने वाले दूसरे उदाहरण के रूप में Wen Chuan Lee की पोस्ट भी है, जो आगे एक और संबंधित लेख की ओर जाती है

1 टिप्पणियां

 
GN⁺ 5 시간 전
Hacker News की राय
  • “Uniqlo x Akamai की उसी लाइन में बिकने वाली दूसरी शर्ट का code साफ़ तौर पर अधूरा design है”
    सोचिए, T-shirt malfunction करे और उसे return करना पड़े—कितना मज़ेदार है
    “आप return क्यों कर रहे हैं, size fit नहीं हुआ या पसंद नहीं आई?”
    “नहीं, line 37 में syntax error है इसलिए run नहीं होती, और मुझे चिंता है कि सड़क पर लोग सोचेंगे कि मैं unsafe Bash scripting को promote कर रहा हूँ”

    • Uniqlo customer support कर्मचारियों के लिए: अगर कोई printed computer code error की वजह से shirt return करने की कोशिश करे, तो मना कर दें और जवाब दें, “असली script kiddie होता तो खरीदने से पहले ही वह error पहचान लेता”
    • Quality assurance की इतनी कमी देखकर shell-shocked हूँ। कम से कम कोई patch तो apply कर सकते हो?
  • अगर आपको ऐसी चीज़ें पसंद हैं, तो Martin Kleppe का काम भी पसंद आ सकता है। उदाहरण के लिए Quine Clock है
    https://aem1k.com/qlock/
    कुछ साल पहले मैंने इसका unobfuscated रूप में reverse-engineered version भी बनाया था
    https://gist.github.com/olooney/a89db3932b089925b71b68d7e9f2...
    इसके अलावा भी उन्होंने कई बेहतरीन ASCII visualizations बनाई हैं
    https://aem1k.com/

    • क्या वह सच में Quine है?
      बेहद impressive तो है, लेकिन फिर भी
  • Font Consolas नहीं, Roboto Mono है
    और भी अजीब बात यह है कि font खुद तो सही monospace font है, लेकिन shirt की typesetting वैसी नहीं है। इसमें kerning है, खासकर ‘Iy’ pair में दिखता है, और ‘i’ जैसे पतले characters कम horizontal space लेते हुए लगते हैं। मेरा अंदाज़ा है कि इसे InDesign के “optical kerning” जैसे किसी tool से typeset किया गया होगा

    • क्या किसी ने dynamic kerning वाला monospace font बनाया है? ऊपर वाली comment पढ़ने से पहले यह खयाल भी नहीं आया था—थोड़ा अटपटा idea है। पहले सुनने में बेमतलब लगता है, लेकिन सुनिए
      Monospace font इस्तेमाल करने की वजह यह है कि वह grid में अच्छी तरह fit होता है। लेकिन उसी grid के अंदर भी अक्षरों को थोड़ा left या right shift करने की गुंजाइश होती है, और उससे शायद एक ज्यादा readable monospace font बन सकता है। बेशक, हर बार कोई character left की ओर खिसकेगा तो right side की space बढ़ेगी, और उतनी ही संभावना है कि नतीजा भयानक हो जाए
    • लगता है सही है। मैंने article में correction जोड़ दी है, और इस comment को भी quote किया है
  • यह shirt सच में बढ़िया है। इसे बनाने की process समझाते हुए actual designer का एक अच्छा video है। इसमें जानबूझकर OCR को मुश्किल बनाने की process भी शामिल है: https://youtu.be/jocGLiecpjU?t=526

    • OCR का तरीका खोजने से शायद सीधे खुद type करना तेज़ हो। 45 साल पहले COMPUTE! magazine से game code नकल करके type करने जैसा लगेगा
      https://archive.org/details/1983-01-compute-magazine/page/96...
    • मैं author हूँ। यह link मैंने नहीं देखा था, बहुत धन्यवाद। इसे देखकर खुशी हुई, और यह जानकर भी अच्छा लगा कि OCR मुश्किल होना सिर्फ मेरी problem नहीं थी, बल्कि intentional design था
    • Link देखा, लेकिन वह हिस्सा नहीं मिला जहाँ कहा गया हो कि OCR मुश्किल बनाया गया था। ठीक-ठीक क्या किया गया जिससे OCR मुश्किल हो गया?
    • लेकिन OCR मुश्किल नहीं है। समझ नहीं आया कि article ने उस हिस्से पर पूरा section क्यों खर्च किया
      Samsung S24U पर home screen के “circle to search” button को long-press करके AI tool interface खोला, फिर text को long-press करके पूरा text एक बार में copy कर लिया। Official नाम नहीं पता, लेकिन लगभग 2 seconds लगे
  • इसका OCR करना nightmare है, और जो खुद को अच्छा OCR/vision model बताते हैं उनके लिए यह अच्छा benchmark बनता है
    हालांकि latest Claude या GPT जैसे अच्छे vision model के साथ agent-style tool को image देकर, उसे line-by-line split करके हर line का अलग OCR करने को कहें तो शायद काफी आसानी से हो जाएगा
    यह भी curious हूँ कि obfuscation से पहले यह script खुद LLM से लिखी गई थी या नहीं। Comments काफी ज्यादा लगती हैं, हालांकि इस case में वह ठीक है :)

    • मुझे नहीं लगता कि इसे LLM ने लिखा है। कुछ चीज़ें ध्यान खींचती हैं
      बधाई का message English और Japanese दोनों में है, और एक heart emoji है। Cyan से orange तक gradient का इरादा था, लेकिन range ANSI block से शुरू होकर 256-color block के बीच में खत्म होती है, और 256 terminal colors वैसे भी gradient की तरह arranged नहीं होते। साथ ही loop के अंत में sleep नहीं है, जबकि LLM शायद defensive तरीके से उसे जोड़ देता
    • इतना मुश्किल नहीं है। हमारे industrial OCR model ने default parameters के साथ पहली कोशिश में सही पढ़ लिया
      Characters आसानी से अलग होते हैं, और reader को confuse करने वाला कोई structural background भी नहीं है। जैसे yogurt के aluminium lid पर expiry date वाली चीज़ से अलग मामला है। Result बिगाड़ने वाली लगभग-text जैसी texture भी नहीं है, और font भी साफ़ और standard है
    • Internet लोगों ने आखिरी बार जिस base64 का OCR करने को लेकर obsession किया था, वह कुछ महीने पहले था। DoJ ने किसी मृत व्यक्ति के emails बड़े पैमाने पर release किए थे, और वे rasterized PDF के रूप में release हुए थे
      अभी नाम याद नहीं आ रहा। इस बीच दिमाग भटकाने वाली बहुत चीज़ें हो चुकी हैं
    • Safari की image से text copy करने वाली feature ने string के base64 हिस्से को लगभग पूरा handle कर लिया। बस पहला character T के बजाय I पढ़ लिया
      अजीब बात यह है कि अगर hashbang हिस्से समेत पूरी string copy करने की कोशिश करें तो performance बहुत खराब हो जाती है। अंदर क्या कर रहा है कि इतना अच्छा काम करता है, यह जानने की curiosity है
    • सच में nightmare है? मैंने shirt की पहली thumbnail image ChatGPT में paste की, और उसने एक बार में decode कर दिया, साथ ही यह भी बता दिया कि Bash script क्या करती है
  • base64 encoding को obfuscation कहना
    मैं किसी cool JS deobfuscation technique की उम्मीद कर रहा था; हल्के शब्दों में कहूँ तो disappointment इतनी ज्यादा थी कि मेरा दिन खराब हो गया

  • वाह, मैंने store में वह T-shirt देखकर girlfriend से कहा था “वह script सच में काम कर ही नहीं सकती, बस decoration होगी।” और गहराई से देखना चाहिए था

    • चूकना आसान है। ज्यादातर समय हम शांत नहीं होते, इसलिए हमारा दिमाग autopilot mode में रहता है
  • ठीक है। स्क्रिप्ट को लेकर बस एक ही कमी लगी कि लगता है लूप के अंदर
    sleep 0.1
    डाला गया होगा। तभी टर्मिनल में आउटपुट होते समय उसे सच में पढ़ा जा सकता है। आधुनिक टर्मिनल इतनी तेज़ी से स्क्रॉल होते हैं कि मैसेज गुजरते हुए दिखते ही नहीं
    करीब 10Hz refresh तक धीमा कर दें तो देखने में बहुत अच्छा लगेगा

    • तो शायद उसमें कोई patch सिलकर जोड़ सकते हैं?
  • लेखक ने कई OCR टूल आज़माए, नतीजे ऊपर-नीचे रहे, और फिर सबसे अच्छे आउटपुट को काफ़ी देर तक manually ठीक करता रहा—यह देखकर हंसी आई। सीधे खुद टाइप क्यों नहीं कर लिया

    • मेरा भी यही ख्याल था। लेकिन मैं उस पीढ़ी से हूं जो पत्रिकाओं और किताबों में छपे “games” को घंटों तक rubber keyboard पर कॉपी करके टाइप करते हुए बड़ी हुई। फिर typos ठीक करने में कुछ घंटे और लगते थे
    • PaddlePaddle OCR में चलाया तो उसने बिल्कुल सही कर दिया
      फोन पर Google Lens के जरिए Google OCR ने भी काफ़ी अच्छा extract किया, लेकिन 100% accurate नहीं था। फिर भी हाथ से कॉपी करके टाइप करने की तुलना में सुधारने में बहुत कम समय लगता। पता नहीं लेखक ने क्या इस्तेमाल किया, लेकिन अच्छा होता अगर वे बताते कि OCR के प्रयास कैसे रहे; शायद उन्होंने कोई साधारण OCR टूल ही आज़माया होगा
    • 4 लाइनें डालने में करीब 2 मिनट लगे, और उनमें से एक character छूट गया
      मैं भी जाहिर तौर पर OCR ही चुनता। अगली Bash T-shirt के लिए तैयार रहना पड़ेगा
    • इससे enterprise environment में task automation की हकीकत याद आ गई। कोई junior 10 मिनट में manually कर सकता है और हफ्ते में सिर्फ एक बार जरूरत पड़ती है, फिर भी engineers उसे automate करने में 40 घंटे से ज्यादा लगा देते हैं—यह आम बात है। लगता है automate everything ही भविष्य है
    • “बस टाइप कर दो” औसत व्यक्ति के लिए ज्यादा errors की संभावना रखता है
  • एक पुराने colleague के पास Go program वाली shirt थी, और मुझे वह हमेशा काफी cool लगती थी
    [0] https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code

    • पक्का नहीं था कि Go board-game program की बात है या Go language की। अगर कोई Go में Go program बनाए तो मजेदार होगा
    • इस साल मैंने Go code वाली एक खरीदी। मुझे बिल्कुल नहीं लगा था कि वह असली code है; लगा था बस random चीज़ें छपी हैं