Sono sicuramente un po’ paxxerella per iniziare nuovi progettini mezzi complicati ancora prima di finire i precedenti, ma che ci voglio fare? Quantomeno, a ‘sto giro ho effettivamente portato #FrameNX, il programma iniziato ieri, ad uno stato di completezza, tant’è che da ora penso non avrò alcun intoppo ad usarlo… e quindi l’ho anche rilasciato già stasera pubblicamente con tanto di README quasi logorroico (il link di stamattina era privato): https://octt.itch.io/framenx 🪟
https://octospacc.altervista.org/wp-content/uploads/2024/05/screenshot_2024-05-05-02-14-47-843_io2733305805360369156-960x987.jpgLa UI è ancora grezza, ma ho migliorato i messaggi a schermo, aggiungendo avvisi a scomparsa quando si verifica un errore o viene fatta un’azione (qualcuno l’ho dimenticato però oooops, dovrò metterlo, ma poca roba). Funziona in ogni caso solo con la tastiera, perché il mouse è dannoso e #programmare le hitbox sarebbe uno sbattimento in più per nessun buon motivo, dato che comunque questa per ora è una #applicazione solo PC. (Ormai si sta costruendo una lore dietro questa interfaccia, ops.) ☠️In realtà sotto la scocca quella UI è comunque più complicata di quanto sembra, anche se è relativamente semplice, perché in primis già solo per le notifiche ho dovuto implementare tutto un sistema di coda… poi ho dovuto mettere il rendering video su un thread separato, perché l’accesso alla camera rallentava tutto il loop e quindi avrebbe inficiato sulla lettura degli input… ma spostarmi su un thread di sfondo ha introdotto non pochi casi limite strani che ho dovuto sistemare con ancora più codice… Comunque relativamente poco #codice, perché il #Python è simpatico e non è stato creato da gente che vuole vedere gli altri programmatori impiccarsi. 🦍
Btw, ho continuato a trovare altri problemi in #Pygame… Innanzitutto, un bug strano con lo stack dei joystick (cioè controller da gioco in generale, direi che il nome è scelto malino) che fa si che questi non mandino più eventi dopo essere stati inizializzati se non se ne tiene qualche reference nel codice (come una variabile assegnata che non muore), come se fossero levati dal garbage collector altrimenti… stranissimo. E poi, il fatto che per riprodurre il suono di dispositivi di input audio, tra metodi non wrappati e quindi richiamabili solo con la API grezza di SDL2, stack audio buggato in generale e comandi che letteralmente non sortiscono effetto, altri comandi che invece causano segfault alla chiusura del #programma… mi pare di stare programmando con una tempesta di raggi cosmici addosso. Ciò non lo gradisco. 😾
Dopo qualche giorno così penso che #Pinterest è l’ennesimo #accessorio che mancava nel mio #arsenale di (anche) gestione delle #informazioni digitali… come ho accennato, lo usavo secoli fa (per sfondi o immagini a caso mi pare?), poi ho smesso per non ricordo bene che motivo (più ci penso, meno mi viene in mente), ma ora, dopo anche le varie mie considerazioni #software degli ultimi mesi, ha tantissimo senso in più. 😇️
Più che un vero #social, lo vedrei più come motore di #ricerca di foto e video che, grazie alle funzioni di gestore di #segnalibri, ed l’algoritmo che si basa su di essi, è tutto-in-uno e diventa più utile man mano che lo si usa (e le funzioni social sono un buon bonus). ❤️🔥️
Per cercare e ritrovare #foto e piccoli video la UI è perfetta, lo spazio a schermo è ottimizzato al meglio con il layout a muratura; raccogliere e catalogare questi media poi (nonostante i glitch, maremma) è comodissimo con la suddivisione in “bacheche”, che a loro volta possono contenere “sezioni”, creando una gerarchia a #cartelle (credo senza limiti di livelli, ma io ci andrei piano). 🗃️
Nello specifico io ci trovo sopra tutti quei memini tossici, le #fotine kawaii, o comunque #immagini ispiranti in generale, che dovrei (impossibile) stare al passo con millemila canali Telegram o gruppi Lemmy/Kbin/Reddit per trovare, e ne avrei comunque molti meno. 💯️
Ovviamente, essendo software proprietario, out-of-the-box non funziona mai come dovrebbe, e servono quindi buone competenze di #informatica per tappare i buchi. Una cosa che un po’ mi rode è che, per quanto l’ #organizzazione degli elementi salvati sia la migliore che io abbia mai visto per un #programma#web di questa categoria, non è buona come spostare file in giro tra cartelle del PC… ma su questo per ora mi accontento. Poi però, ci sono altre cose che invece devo per forza affrontare, per cui sto già all’opera con il creare userscript e robe… ma dirò di più a breve. 😼️
Mm, comunque, quella mia particolare idea per sviluppare app web di 3 settimane fa (già volate?) alla fine è stata buona, penso (raro avvenimento). A parte che già l’avevo implementata nel codice di #WuppiMini, che quindi aveva iniziato a fungere sia lato client che server da uno stesso file #JS identico, l’altro dì ho separato buona parte di quel codice specifico in una libreria apposita della mia “collezione #SpaccDotWeb. 🫣
Usciranno minuzie da sistemare poi, ma il grosso funziona, nella repo c’è anche un #programma di esempio che la usa per chi vuole fare le mie stesse cose poco ortodosse. Ma comunque la sto già usando per tentare di tirare su una prima versione MVP di quel motore di ricerca bizantino che tanto vorrei avere… non tanto perché credo che possa mai funzionare lato client senza un #server centralizzato, ma più che altro perché non se fai finta che non avrai mai bisogno di riciclare del dato #codice, puntualmente una situazione uscirà e allora si finirà per piangere. 😠
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. 💀️
Una apparente #maledizione si è appena abbattuta su di me oggi: non riesco a far funzionare un #programma C!!! 😭️
Il problema è il seguente: il programmino di ieri per pubblicare su WordPress dal #3DS funziona benissimo, ma mi sono ricordata che dal browser del 3DS non si può caricare come #foto la schermata del gioco in pausa, ma solo cose dall’album… e non tutti i giochi permettono di salvare lì. Per salvare #screenshot da qualunque gioco c’è il menù #Rosalina, ma salva foto non-JPEG e in una cartella diversa. 😪️
Ho pensato per un attimo di forkare #LumaCFW (ho controllato e nessuno lo ha fatto, almeno non per versioni recenti), e modificare la funzione di screenshot per salvare in #JPEG, ma dopo qualche prova mi sa che evito, perché è un casino: l’ambiente di esecuzione è talmente ristretto che non vanno nemmeno tutte le funzioni della #stdlib#C, quindi non è immediato far funzionare tutto. 😮💨️
La seconda opzione, più sfavorevole ma comunque decente, sarebbe un #homebrew che converte le foto da #BMP a #JPG e le mette nella cartella giusta… e ovviamente non esiste, esistono cose simili ma non questo, quindi devo farlo io. Ho trovato questa repo da cui posso semplicemente rubare il #codice di #conversione, che sul 3DS compila e quindi dovrebbe tranquillamente fungere. E però mi sto incartando su tutto il resto, cioè la navigazione tra le cartelle e la gestione dei #file (automatica, non pianifico di mettere menù o cose, deve semplicemente aprirsi, convertire, e chiudersi). #Mannaggia! 🤢️
Purtroppo C per fare cose di #utilità pratica (ossia non videogiochini, o roba tipo demo audiovisive, e così via) è #tedioso… soprattutto perché la #API della stdlib fa proprio schifo, con tutti i nomi di funzioni e tipi scritti tutti in minuscolo e spesso senza vocali perché a qualcuno pesava il culo di scrivere parole intere. E quindi finisci per creare millemila macro e funzioni intermedie di astrazioni per evitare di ripetere di continuo le stesse criptiche righe ma così vai a creare astrazioni ancora più astruse per passare i dati in giro e così via. Mi chiedo come sia possibile usarlo per fare addirittura interi sistemi operativi, #pezzi. Vabbè, oggi si soffre. 💀️
La dualità del fixare #bug (o, in generale, far funzionare il #software?):
Perdi almeno 1 ora buona appresso ad un #glitch oscurissimo (spoiler: la codifica del testo centra sempre in tutti questi bug, in realtà estremamente stupidi), facendo svariati test e tentando varie opzioni prima sensate, e poi senza senso perché altrimenti non sai nemmeno come continuare. 🤥️
Nel frattempo si è fatto #tardi in culo, ti prepari per andare a #dormire e nel frattempo pensi, ma niente… a metà spegni ormai il PC, finisci di prepararti, e continui a #pensare, e solo a quel punto un’idea ovvia viene in testa. Troppo tardi ormai. 💀️
E poi ancora, perché le #incoerenze non sono mai abbastanza:
Giustamente nel letto ti irrequieti e non prendi #sonno, perché il cervello non prende pace senza vedere il #problema finalmente risolto dopo tutta la #pazzia passata, anche scommettendo che l’#idea appena venuta è giusta al 100%. 🥴
Però prima o poi il sonno lo prendi, e dopo ore arriva la #mattina dopo, in cui la sveglia suona e… pensi “zzzzzzz voglio stare nel lettino ancora, tanto la #rogna in mente l’ho risolta, chi me lo fa fare di ammazzarmi a prima mattina [prima mattina: le 9:30, ndr.]”. 🥹
Insomma, è una #condanna. Non se ne esce. Comunque si, il mio #errore era #stupido: stavo cercando di caricare #file nella galleria cloud di #WordPress tramite la #API REST, ma ricevevo sempre un rest_upload_sideload_error… controllo gli header, tutti giusti; cerco in giro, poca roba che non mi aiuta; provo #minuzie come mettere gli header lowercase, ancora niente; tento di settare a mano content-type parziali o estensioni file arbitrarie, e ovviamente non risolvo. 🤯️
Però, noto che un caricamento da curl, anziché dal mio #codice JS, va a buon fine. Allora, provo a caricare verso un server netcat in entrambi i modi, così da poter vedere al volo i dati della trasmissione #HTTP, e noto una differenza stronzetta: il corpo generato dal mio #server è molto più grosso del peso normale del file… quindi qualcosa lo sta corrompendo E qui, però, mi sono ribloccata. 🤔️
Solo poi, quando ormai avevo chiuso tutto come ho detto, ci ho pensato: ma io, nella parte del #programma che legge i #dati trasmessi dal client, vado a castare tutto ad una stringa; sarà questa la causa? …E, ricordandomi di altri #incidenti simili capitati in #NodeJS, capisco subito che è così. Detto in breve: la #codifica del testo centra sempre e rovina ogni cosa. Se esistesse solo l’ASCII, ecco che castare dati binari a stringhe non causerebbe alcun danno. E invece abbiamo deciso che i #computer devono supportare nella loro codifica migliaia di #caratteri discutibili, come tutti quelli emoji. E io, dopo aver apportato questo #fix, devo ora continuare a programmare. Non. Se. Ne. Esce. 😭️
Colpo di #genio estremamente radicale per risolvere un annoso #problema: il creare una data #webapp, che non abbia bisogno di grande interattibilità (vedi un social network, o un CMS), senza dover mantenere 2 #codebase separate e quindi impazzire, facendola funzionare sia con un #server che totalmente senza… ossia, come unire in una sintesi circa accettabile i due maggiori paradigmi del #frontend? 🤔️
Quello antico, delle prime #piattaforme#web, dove il server genera tutto l’HTML e il browser lo visualizza com’è, spesso con (quasi) zero #JavaScript (vedi la Spacc BBS). 📦️
Quello moderno, dove nel #backend si espongono API (spesso JSON REST), e il fronte viene sviluppato a parte come app che gira totalmente lato #client, con il #browser che richiede pezzetti di dati e fa i suoi iperprocessamenti. 💱️
Ormai quello antico non si usa quasi mai per #progetti nuovi, perché gli svantaggi sono pesanti appena si vuole andare un po’ più in là: per tappare i buchi nel progetto medio si finirebbe a dover scrivere talmente tanto #codice#ClientSide, che a questo punto era meglio fare tutto nel secondo modo, senza menzionare i modelli e le #API da esporre nel server che altrimenti non si sarebbero implementati. Però, le webapp antiche girano bene anche sul computer tascabile meno performante (average Ximi), sui browser vecchi, e spesso sono le uniche che vanno quando tutto il resto ti lascia a piedi. D’altro canto però, anche se in teoria quella #app potrebbe funzionare #offline, magari mostrando dati cachabili, se è sviluppata in modo attaccato al server ecco allora che non si può fare nulla: muore il server, muore tutto. 💣️
Quindi la mia #idea paxxerella, dato che devo fare banalmente una #applicazione come frontend per un altro servizio già esistente, ma voglio i vantaggi appena millantati: sviluppare con i paradigmi #ServerSide in un framework JS adatto, che giri sia in Node che nel browser. A quanto pare, qualcuno ci ha pensato prima, e qualcosa di già fatto ho trovato (Express+FrontExpress, Koa+Koa-Client, Rill)… ma è tutta roba ormai abbandonata, che o non funziona (ho provato) o ha altre #rogne. Te pareva che trovavo mai qualcosa di buono già pronto… Però, in un quarto d’ora ho tirato su uno #script scheletrino, giusto per poter partire per questa via. ☠️
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%. 😈️
Ho preso 5 minuti (uhmm, no, magari) per un breve #ReverseEngineering di quella parte della #applicazione, arrivando a questa sezione del file (baksmaliato dall’ultima versione presente su APKMirror) smali_classes6/posteitaliane/posteapp/apppostepay/ui/activity/SplashActivity.smali, che invoca il dialogo di avviso in foto: 🤓️
# riga 4358.method public final e()V# ... inizializzazione di altra roba# riga 4503new-instance v1, Lcom/scottyab/rootbeer/b;invoke-direct {v1, v0}, Lcom/scottyab/rootbeer/b;-><init>(Landroid/content/Context;)Vinvoke-virtual {v1}, Lcom/scottyab/rootbeer/b;->a()Zmove-result v1if-eqz v1, :cond_2# ... visualizza il dialogo se il codice sopra non ha saltato# riga 4542:cond_2# ... ritorna e termina il metodo
Detto in italiano, questo #codice invoca un metodo (dal nome offuscatino?) presente in una certa classe “com.scottyab.rootbeer“… ed esce fuori, con una #ricerca sul web, che questa è una #libreria#OpenSource (evidentemente integrata dagli sviluppatori di #PostePay) per controllare se un #dispositivo Android è #rootato. (Non se passa o meno #SlaveryNet, attenzione.) 🍻️
È un po’ troppo rubatempo mettersi a capire quale effettivamente è nel codice Java quella funzioncina b;->a()Z ora, quindi tiriamo a #indovinare. Ci sono, in RootBeer.java, tante #funzioniboolean, di cui varie ausiliarie, e 2 principali: isRooted[With/Without]BusyBoxCheck(). Queste due principali restituiscono un valore positivo qualora anche solo una delle ausiliari chiamate restituisca true, l’unica differenza tra le due è il fare anche il controllo per la presenza del binario busybox, oppure no… E quindi le opzioni sono le seguenti: 📜️
checkForBinary(BINARY_SU), checkSuExists(), checkForRootNative(), checkForMagiskBinary(): controllo effettivo del root; escludo, da quel che ricordo il suo telefono non è rootato, ed avendo il bootloader bloccato direi che possiamo stare tranquilli.
detectRootManagementApps(): scarto, se il telefono non è rootato non avrebbe senso tenere app di gestione del root.
detectPotentiallyDangerousApps(): controlla se sono installate app “a umma umma”; escludo perché credo nessuna sia utile senza il root, e qualcuna forse è pure malware… eccetto Lucky Patcher, che però ad oggi si auto-spoofa.
checkForRWPaths(): scarto, controlla se alcuni percorsi sensibili sono scrivibili, immagino di no col bootloader bloccato e senza root.
checkForDangerousProps(): da verificare, controlla se alcune #BuildProps di Android sono particolari.
detectTestKeys(): inizialmente sospettavo, ma lo abbiamo verificato (con getprop | grep build.tags), e pare non sia il caso (tutto è listato come “release-keys“).
checkForBinary(BINARY_BUSYBOX): questa potrebbe essere, ed è #interessante, controlla come ho detto prima la presenza del binario busybox, ma da questo commit del 2020 non è più usata nel check predefinito perché — come detto nel commento in quella parte di #source, e alla sezione “False positives” del readme — alcuni #OEM lo lasciano quando non dovrebbero (io credevo fosse normale tralaltro, non un’anomalia!).
Quest’ultima #ipotesi mi cattura perché innanzitutto, te micro hai proprio un #MotoEda quello che ricordo, che è uno dei #telefoni listati esplicitamente sul readme… certo, se la #lib usata nella app fosse stata aggiornata, questo non sarebbe dovuto succedere, a meno che i programmatori delle #Poste non abbiano stupidamente usato la funzione di #controllo aggressiva. Però tbh, considerando la qualità del #software#statale o semi-statale qui in #Italia, secondo me semplicemente quella #dipendenza non è mai stata aggiornata (da un lato però, come biasimarli… “se funziona, non toccare”…). Al momento però non riesco a #provare ciò, perché non trovo #APK abbastanza vecchi di PostePay, quindi lancio solo #idee al vento. 😩️
Io punto su #busybox per risolvere questo #mistero. Lo #smartphone non è il mio, quindi io ora posso solo aspettare, se dovessero uscire novità farò un banale edit. (Sperando non siano così grosse da necessitare di un nuovo #messaggio). 😼️
Edit: non ci ho beccato nemmeno per il cavolo: dalla regia, che ha ora testato con il #programma di #test di #RootBeer, vengo a scoprire #malamente che le mie opzioni tecnicamente più plausibili si sono rivelate sbagliate. “Root Management Apps” è cosa fa scattare gli allarmi, cosa che io giustamente ho escluso a priori, ma la regia mi fa appunto sapere che aveva #Magisk Manager installato (soltanto a prendere polvere perché, questo l’ho pensato bene, non ha il root nell’effettivo); e, come previso, la disinstallazione mette a tacere i falsi positivi. Vabbè oh, non potevo immaginarmelo… 🤕️
Discute di un concetto per me non nuovo, ma applicato ad un #retrogame per #Atari, #YarsRevenge. In pratica, il #gioco usa parte del suo codice per generare #pattern sullo schermo con un’#entropia abbastanza alta da sembrare #random, e creare effetti visivi interessanti. 🎇
Sarebbe definibile #quine, se non fosse che non è completo… manca una parte non trascurabile del #codice macchina, e anche per questo a conti fatti, anche se in teoria è possibile, nella pratica non si può realisticamente recuperare l’intero #programma semplicemente guardando cosa viene mostrato a schermo nella cosiddetta #NeutralZone. 🧱
Questo tipo di roba, ossia la visualizzazione di #dati in modi “non adatti”, mi intriga sempre. Non so perché, ma escono sempre effetti sensoriali unici quando si prendono dati #binari e li visualizzano direttamente per vie multimediali. In questo caso, c’è tanto da analizzare in una vista del genere, e perciò il video è #intrigante. 🪬
Pro: ora ho il #software che mi permette di fare quello che mi serviva, per cui non avevo trovato altre soluzioni già fatte che fossero funzionanti. In realtà, l’idea iniziale era di fare una #app specifica per questa #dimostrazione, ma strada facendo ho deciso che avrei reso questa più semplice e generica, potenzialmente utilizzabile anche per altri usi, e avrei implementato parte della mia logica sul mio #server con qualcosa di più rapido. Quello che è uscito fuori ora è una piccolissima app che esegue codice #JavaScript fornito dall’utente e permette a questo di interfacciarsi con API native. 3 API al momento, lmao. Non so se nel tempo la espanderò o no, ora mi serviva appena questa poca roba, e la #UX è #grezza grezza perché non ho tempo. Il codice è quì (ma non è bello): https://gitlab.com/octtspacc/DroidScriptin. ☕️
Contro: la programmazione Android in sé, che è sempre un leggero incubo. Tuttavia, l’unica alternativa teoricamente (chissà praticamente!) viabile sarebbe stata fare un’app per Symbian o J2ME, che certamente non avrebbe semplificato le cose. Vabbé, anche per questo ho alla fine realizzato questa parte del mio progetto demo nel modo in cui ho detto. La cosa più strana attuale del codice? (Content Warning: 🤓️) Il fatto che io debba tenere una classe dedicata funzionalmente vuota per dichiarare l’uso di un BroadcastReceiver all’OS, anche se io nella pratica quello lo uso nella MainActivity, e non nella classe che specifico nel manifest per quel permesso (perché non riesco a mettere MainActivity lì). Ah, però questo per quanto non abbia senso, funziona. La cosa veramente più strana, invece, lo è perché non funziona: su #Android4.4 (mio target) la UI è a posto, mentre su #Android13 (che monta il mio #smartphone principale) manca la barra dell’activity, e quindi non c’è manco modo di accedere al menu… vabbè, il #programma deve funzionare sul #telefono#vecchio, e lì appunto va. 🎈️
Il bug che ho descritto sopra, a confronto screenshot del mio telefono con quello dell'emulatore Android 4.4.(Ma come farà ad accadere questo #bug? 😩️)Nel mezzo: ne ho approfittato per provare #Kotlin un pochino, che avevo sempre snobbato, e adesso me ne pento… di non avergli dato una chance prima. È molto più piacevole di #Java da usare, secondo me, sintassi estremamente più pulita e concisa. Kotlin compila in #bytecode#dalvik e in generale targetta la #JVM direttamente, quindi le #API sono quasi identiche a Java, e avendo usato quello non bisogna imparare quasi nulla di nuovo; sintassi a parte appunto, che però si impara semplicemente scrivendo, è esotica ma assolutamente non esoterica. 🧶️
E giustamente vi chiedete, a che mi serviva esattamente? Se rientra nell’essere un sano #WeekendProject come ho programmato ieri, allora domani lo saprete… per ora non faccio spoiler, oltre a dire che il mio #MicroBlog potrebbe ottenere una funzione che solo #Twitter aveva e solo nei primissimi anni, e ora è un concetto estinto. Non vi dico che leggendo il #SourceCode potete intuire, ma mai dire mai… 👁️
Heel goed dat die #kijkcijfers nu toch maar buiten komen. Je wilt toch weten hoeveel mensen naar een #programma kijken? Ik keek iedere dag naar de kijkcijfers.