Stamattina mi sono accorta, dopo essere già scesa di casa, che non avevo preso la mia borraccia, perché stava da diversi giorni fuori dallo zaino e non me lo ricordavo… ma ormai era tardi per tornare indietro a prenderla, avrei perso il bus, quindi dico #pazienza. 🙀️
Non avevo #urgenza di #bere, quindi non ho subito comprato una #bottiglietta di plastica, anche perché ero convinta che ai distributori fosse 1€ o poco meno, né tantomeno ho controllato se fosse davvero quello il prezzo. Non avendo sete, ed essendo in quel preciso istante diventata anche particolarmente #tirchia, ho detto vabbè, se proprio devo, vedremo se avrò sete più tardi. 🕓️
Ora di pranzo: passo ai distributori e mi accorgo che l’acqua naturale da 50 cl è appena 35 centesimi… stavo quasi per comprarla, ma poi mi accorgo che devo fare un casino per prendere le monetine dallo zaino, e quindi lascio stare per il momento. Anche perché ancora non avevo molta #sete, ma avevo fame, quindi mi sono seduta lì vicino a mangiare; e in ogni caso, ormai ero #spilorcia, quindi ben 1/3 di euro non lo avrei dato via tanto facilmente… 🔪️
Passano altre ore, momento di andarsene, penso un’ultima volta a se effettivamente mi servisse l’ #acqua oppure no, e ops, a quanto pare ho deciso di no. Sicuramente non stavo morendo di sete, e poi tra poco sarei tornata a casina, quindi spendere tutti quei soldi proprio ora sarebbe stato molto #stupido… perché io sono estremamente, pericolosamente, #TACCAGNA. 😈️
Quindi, torno in città e… la libreria è aperta, ci passo prima di tornare a casa, e ritiro i due libri che avevo ordinato, che sono fortunatamente arrivati: 32 #euro in meno in mio possesso. Sarei dovuta passare anche in fumetteria, ma c’era un botto di gente, e allora ho deciso di tornare prima a casa, posare la roba, riposarmi un po’, e poi ripassare più tardi. Non so ancora quanti #soldi dovrò spendere lì (mi secca premere i numerini nella calcolatrice), ma vi assicuro, saranno molti di più di 0,35€. 🤗️
Crepi l’ #avarizia, non è vero? …Beh, si, ma solo quando i #soldini sono regalati dallo Stato con il bonus cultura… quando è regolarmente liquido, un centesimo non sperperato oggi è un centesimo in più che si ha domani, invece… (anche se, da un momento all’altro, se i test che sto conducendo ora avranno esito negativo, dovrò spendere della valuta digitale per un aggeggino multimediale cinese dal costo di ~10€… assolutamente non di più, perché sono tirata, ci tengo a ribadire, ma immaginate quante bottigliette d’acqua comprerei con tali #danari?) 🤑️
Il #problemino (tra i tanti!) delle #webapp è che saranno anche facili da #archiviare o #clonare spesso, ma non per questo anche semplici… (o per caso non sono neppure facili e la mia #esperienza mi fa sottovalutare la cosa?) 😫
🅰️ Per quelle meno complesse, il metodo migliore è senza dubbio un bel wget -kp $URL, cioè scaricare la pagina #HTML con tutte le sue risorse collegate, e convertire i link da assoluti a relativi.
🅱️ Quel #metodo però non è a conoscenza di tutte le risorse caricate dinamicamente, cioè dichiarate in posti diversi dall’HTML. Per prendere anche quelle (ed è spesso necessario, tutte le app moderne caricano roba così), bisogna aprire la app nel #browser, e guardare le richieste di #rete che macina con il normale uso.
1️⃣ A questo punto, si può usare la funzione del browser per esportare le richieste in formato HAR, e poi tool come har-extractor o Har Extractor Online per ricavare i file effettivi da quel blob.
Ho notato però che Firefox in alcune situazioni genera #HAR corrotti (2 giochi fatti in Phaser avevo provato a scaricare, ed una volta estratti gli script tiravano errori; ho riprovato con Chromium, ed è andato tutto liscio), quindi a prescindere io userei l’altro#navigatore per questa cosa. 🥴
Poi, non ho ben capito se per via di come il file HAR in sé è generato, se come quegli #strumenti lo interpretano, o un misto delle cose, ma le risorse cross-domain (e credo anche caricate da iframe?) tendono a non venir estratte, quindi si deve andare poi a pescarle prelevando l’URL di ognuna a manina dai DevTools già aperti… 🤧
🆎 Si potrebbero usare primo e secondo metodo insieme in linea di principio (copiando i file del primo passaggio su quelli del secondo, sovrascrivendo gli esistenti), ma nella pratica è inutile… se c’erano link assoluti da convertire in relativi nell’HTML, con spaventosa probabilità questi sono presenti anche nel #JavaScript o chissà dove, per cui, dato che bisognerà comunque andare a mano a modificarli da qualche parte, 1 o 2 file in più non cambiano (spesso) nulla.
2️⃣ Se si è usato il secondo metodo, bisogna a questo punto effettivamente verificare che i link siano tutti corretti, le #risorse effettivamente scaricate, e la app funzionante indipendentemente dal dominio originale… il modo più efficiente che ho trovato è aprire già da subito un webserver locale sui file, navigarci nel browser, e controllare sia che tutto funzioni nel pratico, sia che tutte le #richieste di rete per risorse effettive (ossia, non contano chiamate di telemetria o simili) vadano al mio #server, anziché al dominio originale (attivando la colonna omonima della tabella nei #DevTools lo si vede a colpo d’occhio).
Quando ci sono richieste che falliscono o che vanno su altri server, bisogna capire da dove nel codice queste partono, e fare le opportune #modifiche per usare URL relativi. Quelle che partono dall’HTML o dal CSS (turns out, non molte, altrimenti avremmo usato direttamente wget) sono appunto una scemenza da sistemare… ma quando partono da #script, c’è poco da fare, con l’aiuto del debugger del browser (di nuovo, meglio Chromium, perché de-mininifica il JavaScript aggiungendo whitespace in automatico) si va a capire da che punto partono, e in base alla situazione si valuta che modifiche fare al #codice. Poi, si testa ancora, e ancora si applicano #fix, finché tutto non funziona. ♻️
In genere questo non è un problema, e anche per app più ostiche (come quella che ho ricaricato sulla #SalaMuseoGames ieri, Little Alchemy 2) si fa tutto in un quarto d’ora ben ristretto. Tuttavia, bisogna fare attenzione a quei programmi che caricano le risorse man mano che ne hanno bisogno e non tutto subito (in genere, maggior parte dei giochi, oppure parecchie #app React)… lì si può potenzialmente perdere un bel po’ di tempo, perché bisogna mettersi ad usare il #software raggiungendo idealmente il 100% del codice; cioè, cliccare tutti i bottoni, usare qualunque azione, giocare tutti i livelli… fino ad ora non ho mai incontrato #ostacoli, ma se succede, l’unica è navigare tra il codice già scaricato per vedere cos’è che manca (da qualche parte ci sono scritti i nomi delle risorse ancora da scaricare, per ovvi motivi). 🗡️
🔚 Aggiustamenti finali: in base alla situazione, vanno fatte altre modifiche al source per ovviare a #problemi banali ma frequenti. La maggior parte riguardano i domini, che in certi casi sono hardcodati, e quindi o ci sono iframe che comunicano con la Messaging API e gli va cambiato il dominio (come per il gioco di ieri), o c’è del DRM che ostacola il #rehosting (come il giochino dell’altro ieri) ecc… con #pazienza si risolve tutto.
E alla fine di tutto, una cosa che mi piace fare ma che non sarebbe obbligatoria, è disattivare tutte le componenti potenzialmente dannose dell’ #applicazione, ossia commentare via eventuali inclusioni e chiamate a sistemi di analitiche o pubblicità. 🚯
Dopo aver perso altre incalcolabili quantità di tempo oggi, alla fine, finalmente ho finito quel #programma malefico… circa, perché ha un #problema di cui ora non ho proprio manco la voglia di venire a capo: quando prova a convertire #foto che (a quanto pare) sono corrotte, manda in crash tutto il sistema. #Pazienza, questo ed altri brutti dettagli li lascio ai posteri. 😇️
La scelta un po’ bizantina di usare un #server per l’effettiva #conversione delle #immagini si è rivelata vincente (anche perché davvero ero a corto di soluzioni…), e sorprendentemente non è nemmeno troppo lento, impiega in media 1 secondo per file (nonostante il WiFi sulla #console faccia pena, ma al netto dell’avere il server in LAN). Creare lo script PHP è stato facilissimo, ovviamente, non è mica quello che mi ha fatto perdere il pomeriggio sano… è stato il fatto che c’è un #bug, da qualche parte in quella #monnezza di httpc (il servizio per le cose #HTTP) dentro libctru (la libreria per gli #homebrew del 3DS), se non direttamente nello stack di #rete di #HorizonOS, che faceva fallire il trasferimento di dati via #HTTPS verso o da il mio server, nonostante la connessione in sé avvenisse, e con altri server non ci fossero #problemi di alcun tipo. Io ovviamente ho provato tremila cose, e solo alla fine ho tentato di collegarmi senza cifratura, e ho visto tutto funzionare. 😤️
Ora quindi posso catturare #screenshot in qualunque gioco usando il menù Rosalina, poi avviare la mia #applicazione per avere tutto quanto convertito in #JPEG e messo nell’album di sistema in #automatico (non devo premere nulla), quindi tutto visibile dal selettore #media del browser web… e a quel punto posso pubblicare qui sopra direttamente da lì, per qualsiasi titolo. Forse però dovrei espandere il codice #ServerSide, facendogli scrivere le date delle foto nei parametri EXIF, altrimenti il #Nintendo3DS vede tutto come datato 01/01/1900… nulla di grave eh, ma un po’ scomodo per navigare nella galleria. 💀️
Ahhh, i #gamer, brutta razza. I #videogiocatori, che cosa #terribile. Ecco, ora, se non avete scrollato oltre dal disgusto al solo leggere queste parole, posso andare al dunque. 😈️
Negli ultimi giorni, praticamente tutte le persone che hanno preso questa brutta via nella loro vita sono #impazzite per un #giochino che si chiama #Palworld, ma non significa “mondo delle palle”. Tuttavia, ci sono #accuse a destra e a manca proprio riguardo le palle… le potenziali #palle che gli sviluppatori sembrano raccontare riguardo la #legittimità#intellettuale del gioco! 🧠️
La #questione deriva dal fatto che molti dei “pal”, gli “amichetti” #animali che si trovano in questo #gioco, somigliano veramente fin troppo a quelli che invece sono #Pokémon, esistenti da secoli nell’omonima #serie. E si, io mi trovo d’accordo con il giudizio di questa parte di #Internet: paiono veramente #copiati spiccicati certi; ragà, per favore, ma vi pagano perché voi li difendiate, ‘sti #sviluppatori, o fate gli avvocati del diavolo a gratis? 🥱️
Questo video rappresenta come vedo io le #questioni internettiane sull’argomento.Ovviamente, la mia #opinione è #morale, non #legale. Sto dicendo che secondo me hanno #copiato spudoratamente tutta l’estetica, le forme, e in parte la filosofia (poi per il resto ha effettivamente #meccaniche innovative, per questo sono tutti fissati), ma non conoscendo quasi per nulla questo specificissimo campo della #legge sul #copyright, non posso menare accuse legali, e francamente non ne ho voglia, non ci guadagno nulla. Tuttavia, a qualcuno dei piani alti tutta questa #storia non sta piacendo granché, e questo qualcuno ha infatti dichiarato di voler #investigare la vicenda. Ovviamente, parlo di #ThePokemonCompany… che si è comportata in modo buffo, dicendo “ah si, abbiamo ricevuto domande riguardo un gioco di un’altra azienda“… è chiaro che non vogliono accuse per diffamazione manco loro. 💫️
https://www.youtube.com/watch?v=B5Upc-1aNIMNe approfitto per raccontarvi una roba: anche io, come tutti, ho #scoperto questo Palworld solo l’altro giorno, anche se pare fosse stato annunciato moooolti anni fa. A vedere solo screenshot, qualche #notizia, e così via, l’ho reputato #ganzo. Però poi, appena ho provato a vedere qualche gameplay, mi è salita veramente la noia, la scocciatura, e ora la smetto con il trascrivere le mie emozioni che altrimenti mi risalgono. Non so se sia questo #videogioco in particolare, che forse percepisco come un #OpenWorld troppo #dispersivo come molti altri, però riflettevo sul fatto che questa è una cosa che mi capita relativamente spesso: un gioco mi sembra figo a vederne foto e descrizioni, però poi quando lo vedo veramente lo trovo #scocciante. Forse dovrei provarlo io, oltre che vedere come sono gli altri g*mer a provarlo, però, pur avendo già il link magnetico sotto mano, non ho né lo spazio su disco né la voglia in testa per poterlo fare. #Pazienza, amen, continuerò a #giocare ai retrogames. 👾️
Ho #perso una buona quantità di quarti d’ora (e #maremma…) oggi a cercare di capire come straca far funzionare questo altrimenti orribile #codice dentro un ciclo (che deve prima terminare tutto, o il programma non ha i dati giusti) in #JavaScript… 😵️
const reader = new FileReader();reader.onload = () => { const img = document.createElement('img'); img.onload = () => { // ... un sacco di stronzate che non centrano } img.src = reader.result;}reader.readAsDataURL(file);
Ho cercato #online varie soluzioni, per un motivo o per un altro non le capivo però (#skillissue skillissue skillissue), e ho perso la #pazienza a provare e riprovare, finché non ho chiesto alla divinità dell’autocompletamento#ChatGPT. A ‘sto giro, è stato più utile di mezzo #Stackoverflow. 🙏️
Unendo il suo aiuto, + un (1) consiglio di utenti umani su quei #forum brutti, è uscita una roba che funziona e non fa venire il mal di testa a leggere…
const img = new Image();img.src = await readFileAsync(file);await img.decode();// ... le stesse stronzate di prima, ma megliofunction readFileAsync(file) { return new Promise((resolve) => { const reader = new FileReader(); reader.onload = (event) => { resolve(event.target.result); };reader.readAsDataURL(file); });}
Non so perché, avevo voglia di provare #Preact, allora l’ho provato, ma dopo un po’ ho iniziato a rendermi conto che stava uscendo lo spaghetto… ho continuato fin quando non sono usciti addirittura bug di cui non avevo la minima idea, e allora #pazienza. Meglio fare come ho sempre fatto. 😩️
Nel #2024 le tecnologie #web#vanilla sono così buone, non c’è bisogno di usare #paradigmi strani (tutti nati quando le tecnologie web #standard non erano così buone, infatti) per #programmare… che non nego siano bellini, ma nella pratica non so perché non mi ci trovo, la mia mente sa riconoscere i pregi della #programmazione non-imperativa, ma poi nella pratica se mi cimento fo il macello… 😶🌫️️