Oggi è una giornataccia e di solito in questi casi, mi comporto in due possibili modi completamente agli antipodi.

O mi butto a capofitto sul da farsi o pure... cazzeggio alla stra-grande! Questo mi permetterà di occuparmi meglio dei problemi piu' avanti ;)

Cinque minuti fa', mi sono imbattuto nell'ultimo easter egg di Google... in questo caso non è stato posizionato sul "doodle" in homepage... bensì sul logo centrato in homepage dell'evento per sviluppatori di tutto il mondo: Google I/O.

Cliccando sulla I e sull'O ed inserendo precise sequenze, si otterranno simpatici giochini a schermo.

Siccome non amo cliccare compulsivamente tastini senza un preciso senso logico, ho preferito spulciarmi il codice javascript che gestisce sti scherzetti ed ecco la parte interessante.

Ho notato che per gestire tutto l'ambaradam, hanno scritto una classe base che è stata poi estesa per ogni "giochino". Tale classe presenta un metodo chiamato "register" e ho pensato fosse un ottimo punto di partenza.

ww.mode.register = function (a, b, c, d) {
    ww.mode.modes[a] = {
        klass: b,
        pattern: c,
        len: d
    }
};
ww.mode.findModeByName = function (a) {
    return ww.mode.modes[a]
};
ww.mode.register("home", ww.mode.HomeMode, null);
ww.mode.register("cat", ww.mode.CatMode, 231, 8);
var isAndroid = navigator.userAgent.match(/Android/);
isAndroid || ww.mode.register("space", ww.mode.SpaceMode, 42, 8);
ww.mode.register("pong", ww.mode.PongMode, 129, 8);
ww.mode.register("bacon", ww.mode.BaconMode, 144, 8);
ww.mode.register("simone", ww.mode.SimoneMode, 211, 8);
ww.mode.register("eightbit", ww.mode.EightBitMode, 83, 8);
ww.util.getAudioContextConstructor() && (ww.mode.register("song", ww.mode.SongMode, 219, 8), ww.mode.register("synth", ww.mode.SynthMode, 136, 8));
ww.mode.register("ascii", ww.mode.AsciiMode, 127, 8);
ww.mode.register("bowling", ww.mode.BowlingMode, 117, 8);
ww.mode.register("rocket", ww.mode.RocketMode, 69, 8);
ww.mode.register("burger", ww.mode.BurgerMode, 57, 8);

Amo de-obfuscare i codici sorgenti OO... puoi pure modificarmi gli argomenti delle funzioni, ma sulle proprietà/attributi puoi far proprio poco! :)

E' proprio quì che mi son reso conto di tutto il funzionamento:

- La I viene interpretata come un 1 e la O come 0
- Ogni giochetto corrisponde ad un char preciso(tutti blank)
- Questo char, viene poi convertito in binario
- Digitando la I e la O si scrive il codice binario e se corrisponde ad un char registrato, inizializza il giochino a cui è associato

La lista di caratteri a questo punto è:

  • 231 (Binary: 11100111)
  • 129 (Binary: 10000001)
  • 144 (Binary: 10010000)
  • 211 (Binary: 10010000)
  • 83 (Binary: 01010011)
  • 127 (Binary: 01111111)
  • 117 (Binary: 01110101)
  • 69 (Binary: 01000101)
  • 57 (Binary: 00111001)
Inoltre, disponibile su qualsiasi dispositivo fatta eccezione per Android: 42 (Binary: 00101010)
Infine, disponibile su qualsiasi browser con libreria audio nativa: 219 (Binary: 11011011), 136 (Binary: 10001000)


P.s.: Qualche piccola circostanza divertente:
- Dopo aver fatto tutto ciò, non mi sono nemmeno goduto il piacere di provare tutti i giochini.
- Sempre e solo dopo aver fatto tutto ciò, trovo un simpaticissimo testo su stackoverflow dove specifica tutti gli easter eggs e ne da anche un piccolo codice javascript per l'esecuzione "on-demand". 

Rappresentazione oggetto: ww.mode.modes

Object {homeObjectcatObjectspaceObjectpongObjectbaconObject}
  1. asciiObject
    1. klassfunction (a,b){this.preloadSound("i.mp3");this.preloadSound("o.mp3");ww.mode.Core.call(this,a,b,"ascii",!0,!0,!0);this.getPaperCanvas_(!0)}
    2. len8
    3. pattern127
    4. __proto__Object
  2. baconObject
    1. klassfunction (a,b){this.preloadSound("bacon-sizzle.mp3");this.preloadSound("egg-cracked.mp3");this.preloadSound("cracked-open.mp3");this.preloadSound("eggs-sizzling.mp3");ww.mode.Core.call(this,a,b,"bacon",!0,!0,!1)}
    2. len8
    3. pattern144
    4. __proto__Object
  3. bowlingObject
    1. klassfunction (a,b){this.preloadSound("strike.mp3");this.preloadSound("whoosh-1.mp3");ww.mode.Core.call(this,a,b,"bowling",!0,!0,!1)}
    2. len8
    3. pattern117
    4. __proto__Object
  4. burgerObject
    1. klassfunction (a,b){this.preloadSound("bite-1.mp3");this.preloadSound("bite-2.mp3");ww.mode.Core.call(this,a,b,"burger",!0,!0,!1)}
    2. len8
    3. pattern57
    4. __proto__Object
  5. catObject
    1. klassfunction (a,b){this.preloadSound("cat-1.mp3");this.preloadSound("cat-2.mp3");ww.mode.Core.call(this,a,b,"cat",!0,!0)}
    2. len8
    3. pattern231
    4. __proto__Object
  6. eightbitObject
    1. klassfunction (a,b){this.preloadSound("i.mp3");this.preloadSound("o.mp3");this.preloadSound("error.mp3");ww.mode.Core.call(this,a,b,"eightbit",!0,!0,!0,!1);this.getPaperCanvas_(!0);this.frontmostWantsRetina_=this.frontmostRequestsRetina_=1<window.devicePixelRatio;this.canvas_=document.getElementById("eightbit-canvas")}
    2. len8
    3. pattern83
    4. __proto__Object
  7. homeObject
    1. klassfunction (a,b){this.preloadSound("i.mp3");this.preloadSound("o.mp3");ww.mode.Core.call(this,a,b,"home",!0,!0,!1,!0);this.patternMatcher_=new ww.PatternMatcher(ww.mode.modes);this.wentIdleTime_=0;this.isIdle_=!0;this.maxIdleTime_=12E3}
    2. lenundefined
    3. patternnull
    4. __proto__Object
  8. pongObject
    1. klassfunction (a,b){this.preloadSound("1.mp3");this.preloadSound("2.mp3");ww.mode.Core.call(this,a,b,"pong",!0,!0,!0);this.startBallSpeed_=this.ballSpeed_=250;this.maxBallSpeed_=800;this.startBallRadius_=this.ballRadius_=30;this.minBallRadius_=10;this.paddleX_=40;this.paddleY_=80;this.paddleWidth_=40;this.paddleHeight_=160;this.paused_=!0;this.bottomWallOpacity_=this.rightWallOpacity_=this.topWallOpacity_=0}
    2. len8
    3. pattern129
    4. __proto__Object
  9. rocketObject
    1. klassfunction (a,b){this.preloadSound("rocket-launch.mp3");this.preloadSound("rumble.mp3");this.preloadSound("sci-fi-door.mp3");ww.mode.Core.call(this,a,b,"rocket",!0,!0,!1);var c=this.find(".letter-i"),d=this.find(".letter-o");this.centerO_=d.attr("cx")+", "+d.attr("cy");this.centerI_=c.attr("cx")+", "+c.attr("cy");this.rocket_=this.find(".letter-i-wrapper");this.moons_=$("#moon-1");this.fires_=$("[id*=fire-]").css("opacity",0);this.maxFires_=this.fires_.length;this.currentFire_=0;this.isAnimating_=
    2. len8
    3. pattern69
    4. __proto__Object
  10. simoneObject
    1. klassfunction (a,b){ww.mode.Core.call(this,a,b,"simone",!0,!0)}
    2. len8
    3. pattern211
    4. __proto__Object
  11. songObject
    1. klassfunction (a,b){this.preloadSound("brass-note-1.mp3");this.preloadSound("brass-note-2.mp3");this.preloadSound("brass-note-3.mp3");this.preloadSound("brass-note-4.mp3");this.preloadSound("lute-note-1.mp3");this.preloadSound("lute-note-2.mp3");this.preloadSound("lute-note-3.mp3");this.preloadSound("lute-note-4.mp3");this.preloadSound("funky-note-1.mp3");this.preloadSound("funky-note-2.mp3");this.preloadSound("funky-note-3.mp3");this.preloadSound("funky-note-4.mp3");this.preloadSound("beats-piano.mp3");
    2. len8
    3. pattern219
    4. __proto__Object
  12. spaceObject
    1. klassfunction (a,b){this.preloadSound("i.mp3");this.preloadSound("o.mp3");this.world_=this.getPhysicsWorld_();this.world_.viscosity=0;ww.mode.Core.call(this,a,b,"space",!0,!0,!0);this.getPaperCanvas_();if(this.wantsAudio_){var c=this.getAudioContext_();this.tuna_=new Tuna(c);this.chorus_=new this.tuna_.Chorus({rate:1,feedback:0,delay:2,bypass:0})}}
    2. len8
    3. pattern42
    4. __proto__Object
  13. synthObject
    1. klassfunction (a,b){ww.mode.Core.call(this,a,b,"synth",!0,!0,!1)}
    2. len8
    3. pattern136
    4. __proto__Object
  14. __proto__Object




0 commenti:

Posta un commento

Visualizzazioni totali