L’ultimissimo miglioramento che ho in ogni caso poi fatto ad #MBViewer è stato l’aggiunta di una funzione per importare codice #CSS e #JavaScript, per modificare come i post possono essere visualizzati. Entrambi funzionano allo stesso modo, con i relativi parametri URL che accettano sia #URL esterni che data URI. Niente di particolare per gli stili, semplicemente importo nella pagina la qualunque cosa venga data lì, ma per gli #userscripts è stato leggermente più #complicato. 😕️
Il punto sta nel voler evitare che #script essenzialmente non affidabili siano iniettati nel contesto della pagina semplicemente da URL, perché potrebbero fare tante cosine cattive; prima fra tutte, rubare #dati dall’archiviazione del #browser del mio dominio, cosa che è un #problema, perché gli utenti inesperti che aprono la app da #link non andranno a cercare di investigare cosa accade dietro le quinte (e, molto probabilmente, non lo farei realisticamente nemmeno io, seguendo la logica del “i miei siti sono miei e li conosco, sui siti altrui ho le protezioni del browser attive“). E quindi inizio a scendere in un rabbithole… ☠️
#Iframe? Hmm… non so, non è il caso, sarebbero insicuri, ci sono alcuni modi in cui una pagina in frame può fare robe fastidiose. Non può essere assolutamente un’idea, proprio mai (foreshadowing). 🪟️
Trovo un bel po’ di #librerie vecchie che ricompilano codice #JS per rimuovere pericoli, o lo analizzano preventivamente per la presenza di operazioni dannose così che possa non essere mai eseguito… praticamente tutte abbandonate, qualcuna esplicitamente dichiarata insicura e non patchata, e per qualcun’altra lo possiamo dare per scontato. 🐛️
Forse questa libreria più recente, jailed, che sfrutta un iframe assieme ad un Web Worker per creare una sandbox forte e bloccare tutte le #API eccetto alcune che si decidono… No, l’ho provata e non va bene, non si riescono a passare alla sandbox oggetti complessi, tra cui i costruttori, è impossibile far funzionare API tipo quella del DOM. 🚧️
Sarebbe stata un’idea usare qualche reimplementazione del #DOM per NodeJS tramite browserify, tipo Cheerio, ma farla anche solo girare lì dentro è un altro casino allucinante. 🥴️
WASM tecnicamente è una #sandbox a sua volta, e non accede alle API del browser se non con codice colla, quindi magari… teoricamente ok, ma nella pratica non ho trovato nessuna soluzione già bella e pronta che potessi usare per questo specifico scopo. 🕳️
La #pazzia: PyScript… sarebbe quasi già pronto, ma avrei dovuto comunque modificarlo per bloccare tutte le API insicure (rimuovere #codice), e poi richiede 15+ MB di dipendenze di runtime… non ideale. 🗿️
Alla fine ci ho pensato meglio, e sono arrivata alla conclusione che è abbastanza sicuro far girare gli script in un iframe con proprietà src="data:[...]" e sandbox="allow-scripts" (che significa, “blocca tutte le proprietà sensibili eccetto gli script”)… voglio dire, nel visualizzare il contenuto dei siti, già permetto eventuali iframe provenienti dai post, e quelli teoricamente possono già fare quello che vogliono eccetto accedere ai dati della finestra root. Nella pratica, i programmini degli utenti quindi hanno accesso a (quasi) l’intera API JavaScript senza poter fare cose bruttissime. 🎉️
https://octospacc.altervista.org/wp-content/uploads/2024/02/image.pngEcco un esempio di tutto, alla fine: questo URL carica il mio MicroBlog, importa un foglio di #stile che mette questo font buffo, e uno script che colora le parole dei #messaggi in base a come si ripetono man mano (inutile, ma serve giusto per dare idea delle potenzialità)… <a href="https://hub.octt.eu.org/MBViewer/#/siteUrl=https://octospacc.altervista.org|platform=wordpress.org|includeStyle=data:text/css;utf8,@import%20url('https://fonts.googleapis.com/css2?family=Single+Day&display=swap');.MbPost{font-family:'Single%20Day',cursive;}|includeScript=data:text/javascript;utf8,function%20MbViewerFunction(data){const%20dom=new%20DOMParser().parseFromString(data.html,'text/html').body;const%20tokens=dom.textContent.split('%20');const%20words={};for(const%20i%20in%20tokens){const%20word%20=%20tokens[i];if(words[word])words[word]++;else%20words[word]=1;tokens[i]=%60%3Cspan%20style='color:${atob('Iw==')}${[0,'b58900','cb4b16','dc322f','d33682','6c71c4','268bd2','2aa198','859900'][words[word]]};'%3E${word}%3C/span%3E%60}data.html=tokens.join('%20').replaceAll('nn','%3Cbr%3E');for(const%20img%20of%20dom.querySelectorAll('img'))data.html+=img.outerHTML;MbViewerReturn(data)}">https://hub.octt.eu.org/MBViewer/#/siteUrl=https://octospacc.altervista.org|platform=wordpress.org|includeStyle=[...]|includeScript=[...]</a> (il link con tutta quella roba messa inline è una stringa di quasi 1 KB!). Userò tutta la cosa per rendere gli hashtag nel testo meno intrusivi per il mio sito anche lì, oltre che sul dominio originale. 👋️Finisco con dati ancora più tecnici, per chi non ha una vita: con questo #design, ogni #userscript deve provvedere ad esporre una funzione che, tramite la Channel Messaging API, viene richiamata dalla #app per ogni messaggio appena questo viene aggiunto al documento visibile; questa funzione riceve dati utili (per ora, solo l’HTML del contenuto; oltre a dati come l’id del messaggio nel flusso, che non sono granché utili all’utente ma devono essere restituiti alla app) e può rimandare nuovi dati indietro richiamando una funzione che è invece l’applicazione ad esporre allo script. Tutto questo ambaradan permetterebbe agli script di effettuare anche operazioni asincrone, comunque, non per forza di dover agire immediatamente alla chiamata. 🤓️
Tra i giorni passati fino a ieri, ho fatto delle robine #sperimentali su #MBViewer, era questo che dovevo #scrivere… La prima è stata, più che altro perché mi serviva effettivamente da tempo una piccola #app in grado di fare questa cosa, implementare la lettura del formato di esportazione chat in #JSON di #Telegram. Infatti, le #conversazioni da lì possono essere esportate anche in JSON per usi di manipolazione dati futuri, oltre che HTML per consultazione immediata; però, appunto non c’è ufficialmente un modo per leggere una #chat esportata in quel #formato macchina, e la conversione in HTML statico dopo sarebbe facile ma bruttina: avere un lettore con un’interfaccia a bolle classica so già che può tornarmi utile, perché ho qualche dump non-HTML da parte. 📦️
A parte la #scocciatura per interpretare la struttura #dati del testo di Telegram e trasporla in #HTML corretto, non è stato complesso… eccetto che c’è un #problema. Il sistema funziona, ma il #programma tende a soffocare male con dump di troppi #messaggi. Dopo poche migliaia, già subentrano #rogne, con l’uso di RAM della scheda del #browser che arriva a più di 1 GB, e il caricamento, se riesce a finire senza che tutto crashi, è veramente lentissimo. Potrei in teoria risolvere la cosa, ma è veramente una #pazzia, dovrei portare ancora di più la codebase all’assurdo per fargli caricare elementi DOM a mano a mano da una struttura che di base è comunque un singolo file tutto in memoria, perché così è il formato… per ora lascio tutto così, purtroppo nessuno mi paga, quindi nessuno godrà al 100%. 😈️
La fanbase di OctoSpacc sta morendo… ricondividete questo post se anche voi spacciate. 🙏
Seriamente, però, la gente sta pian piano fuggendo; almeno dal canale Telegram, mentre sul Fediverso non c’è nessuna discesa, ma un po’ di ristagno si. Non so se sono #io che sto diventando sempre più #cringe e #insopportabile, o sta succedendo tutto perché i miei “micro” #post sono diventati tutti papiri. In ogni caso, non so come mai la situazione del mio cervello sia diventata così nel giro di appena 2 settimane… credo che il codice auto-modificante che gira lì dentro si sia corrotto un’altra volta. 😭
Dovrei investigare meglio su cosa sto diventando senza accorgermene, ma intanto per il meme ho pensato ad una soluzione impraticabile, che risolverebbe questo #problema (ammesso ci riesca) creandone probabilmente di peggiori, ma tecnicamente è fattibile: posso integrare un sistema sul #MicroBlog che, per pubblicare qualcosa, mi costringa a “pagare” un prezzo proporzionale alla lunghezza… 😳
Questi criptospiccioli andrebbero in un montepremi che verrebbe automaticamente diviso tra chi abitualmente legge con interesse i messaggi e li condivide su siti esterni. Vorrei davvero fare questa cosa, quantomeno come esperimento, a pensarci… ma non durerebbe molto, perché prima o poi finirei i satoshi o quello che è, ed escludo di poter mai ricevere abbastanza donazioni per non andare in perdita. Ci penserò. Datemi altre #idee plz.❣️
Ora vi mostro una cosa #allucinante, cioè che il selettore di file di #Cinnamon è #spaccato: se si seleziona un #file o una cartella, ma nel frattempo si continua a scorrere, ciò che verrà registrato sarà l’elemento su cui il cursore di selezione sarà posizionato nell’ultimo momento in cui l’applet elabora i suoi vattelappesca; non, come invece dovrebbe essere, l’elemento su cui si era nell’istante in cui si è premuto Invio. (A parte il fatto che nessun ritardo sarebbe giustificabile, considerando che oggi abbiamo hardware che, relativamente alla storia di tutto l’home computing, è stellare.) Guardate il #video (rallentatelo dal vostro browser però magari) e notate come io premo Enter, ma poi scorro ancora, e finisce puntualmente male ogni volta, #mannaggia ai #bug. 🪲️
Penso che la colpa sia proprio del mio #DesktopEnvironment, perché questo #problema non succede, ad esempio, con le app di Flatpak che integrano l’intera runtime GTK e fanno apparire il #FilePicker di GNOME. È comunque #fastidiosissimo, devo ogni volta andare al ritmo del #computer solo perché un componente di sistema è programmato evidentemente male. Penso di cambiare #desktop, ma vorrei qualche consiglio… voglio qualcosa che non sia totalmente scarno, ma non abbia alcun problema di #prestazioni, voglio tutto istantaneo (cosa che al momento in media non ho, ho tanti altri #problemi oltre a questo specifico). 🐢️
Stamattina mi è venuto un colpo quando ho notato che il mio #FreshRSS non ha accumulato nessun nuovo elemento da ieri sera… cosa che ovviamente è sintomo di un problema, perché ho quasi 700 fonti #RSS, di cui alcuni che normalmente non stanno mai in silenzio. 😩️
Vado a vedere nei #log, ed è da ieri sera che a caso è iniziato uno spam di #errori “SQL error addEntry: HY000: 21 bad parameter or other API misuse while adding entry in feed 417 with title: […]”. Stranamente 1 #feed ha continuato ad aggiornarsi a quanto pare, ma la maggior parte no. Ovviamente, il file del #database in sé posso scommettere che non si è corrotto, perché è su archiviazione interna che si è altrimenti dimostrata affidabile, e sul mio sistema non sono successe cose pazze ultimamente… ma magari si è #corrotto mesi e mesi fa (possibile, perché mi dava problemini di altro tipo da tanto tempo), quando ancora non avevo il #server buono che ho ora, ma un Raspino che saltava ogni giorno. O magari semplicemente l’universo mi odia, sarebbe plausibile considerando il resto della mia vita. 🌋️
Ovviamente, ho cercato sul web, e nessuno ha mai avuto il mio stesso identico #problema. Fortunatamente, sembra che si sia tutto risolto creando un nuovo #file di database (copiando prima tutti i #dati dal vecchio, con sqlite3 old.sqlite ".dump { tutte le tabelle }" | sqlite3 new.sqlite); ha dato qualche errore riguardo una manciata di entry al momento della clonazione, ma intanto ora il mio #aggregatore funge senza #rogne. La mattinata è salva, posso risparmiarmi dal dover tirare un numero di imprecazioni al cielo pari al numero di sorgenti da importare su un nuovo profilo o #software. 😤️
Credo ci sia stato un ulteriore #problema da quando il mio #Telegram è stato #bannato a quando me l’hanno ridato, a parte quelle minuzie che avevo già detto… 😅
In pratica, ho fatto caso che mi appare di avere il #profilo#bandito da alcuni #canali, dove però non ho alcuna ragione per pensare che debbano essere stati i proprietari a rimuovermi volontariamente. Scommetto che quello che è successo è che qualcuno ha fatto #PULIZIAKONTATTI di membri “#Account eliminato“, e dato che su Telegram rimuovere un #utente da un proprio #canale ne comporta in automatico l’aggiunta alla lista di #banditi, secondo me ora sono nella #lista dei cattivi di varia gente che nemmeno mi vuole male! Ok che sono #cringe ma questo non me lo merito. ☠️