Shopify
Temi Online Store 2.0, Liquid, sezioni, metafield e Storefront API.
{% render 'card', product: product %} The Last Developer
Nell'apocalisse dell'IA faccio l'ultimo custode del codice: leggo ancora quello che spedisco. Temi Shopify, backend Java e software pensato, ottimizzato, funzionante e pure bello da guardare.
Sonic BlasterRiscaldamento145 BPM
Prendi il controllo %Skill
Temi Online Store 2.0, Liquid, sezioni, metafield e Storefront API.
{% render 'card', product: product %} Vanilla e Custom Elements, con il minimo indispensabile nel browser.
customElements.define('x-tabs', Tabs) Interfacce React e Next.js tipizzate, contratti condivisi con le API.
type View = Partial<Summoner> Scroll-driven animation, :has(), container query e @property al posto del JavaScript.
animation-timeline: view() Record, stream e concorrenza per code, scheduler e servizi su VPS Debian.
record Rank(String tier, int lp) {} Controller REST su Tomcat embedded, validazione e job schedulati.
@GetMapping("/profile/{puuid}") Dati canonici, aggregation pipeline e facet per le statistiche.
db.match.aggregate(pipeline) Schemi relazionali e query scritte a mano. MariaDB in produzione per guild e impostazioni.
SELECT prefix FROM guild WHERE id = ? Progetti
Un backend Java e un frontend Next.js che formano un’unica piattaforma di statistiche per League of Legends. Scegli uno scenario e guarda cosa succede dietro ogni richiesta.
Bot Discord e motore statistiche per League of Legends, scritto in Java. Le API non aspettano mai Riot: leggono da Redis e Mongo e accodano il resto.
Esempio con tempi indicativi. Le chiamate a Riot passano sempre dalla coda.
Statistiche di League of Legends dentro un sistema operativo virtuale: ogni profilo è una cartella, ogni pagina una finestra, ogni percorso un URL.
Ogni comando risolve un nodo del VFS; i dati arrivano dalle API di Beebot.
Shopify
Sviluppo di temi, componenti e integrazioni per brand di moda e lusso.
Filtri con :has() e selettori di attributo. Liquid precalcola variantMap e sold-out, JS resta solo per i reset.
Per Kappa: metafield JSON, swatch con gradienti hard-stop e radio nascosti.
Per Montura: aggiornamenti bulk dei campi stagione sulle varianti.
OneTrust collegato alla Customer Privacy API di Shopify.
Come funziona il gioco: solo CSS
Ogni ostacolo ha una colonna: left = x × cella. Niente canvas, niente coordinate in JS.
Una keyframe trasla il percorso di una tile in loop; il cubo resta fermo sull’asse X.
I keyframe del salto cadono sulle colonne degli ostacoli, con cubic-bezier per la gravità.
Il click imposta un data-attribute: particelle, onda d’urto e restart sono CSS.
[data-obstacle] {
left: calc(var(--x) * var(--cell));
}
[data-world] {
animation: world var(--period) linear infinite;
}
@keyframes hop {
22%, 41% { translate: 0 0 }
31% { translate: 0 calc(-2.2 * var(--cell)) }
}
[data-lab]:has(#lab-grid:checked) [data-x]::after {
content: "x " attr(data-x);
} Filosofia
Il codice va pensato, ottimizzato, deve funzionare ed essere bello da leggere. Anche dopo l'apocalisse dell'IA.
Fanno ormai parte del lavoro e lo rendono più veloce. Il controllo però resta umano: ogni riga va capita, verificata e scelta.
Chi scrive il codice ne risponde. Ogni logica ha un solo proprietario e ogni decisione ha una ragione.
Nomi espliciti, responsabilità chiare, nulla di superfluo. Il codice pulito costa meno a ogni modifica.
La brevità ha valore solo se resta leggibile. Meno codice significa meno errori e meno da mantenere.
naming/no-type-in-name JAVA La dichiarazione dice già int: ripeterlo nel nome è rumore. Un intero locale si chiama count, non itemCounterInt.
int itemCounterInt = items.size();int count = items.size();
naming/explicit-unit JAVA Un long può contenere secondi, millisecondi o nanosecondi: qui il nome deve dirlo. Meglio ancora, un tipo che lo sa già.
long start = System.currentTimeMillis();long timeout = 30;long startTimeMillis = System.currentTimeMillis();Duration timeout = Duration.ofSeconds(30);
naming/no-abbreviations JS Il codice si scrive una volta e si legge cento. Tre lettere risparmiate non valgono un dubbio.
const usrCfg = getCfg(req);const btn = el.querySelector('.btn');const userConfig = getConfig(request);const button = element.querySelector('[data-button]');
comments/name-over-comment JS Se una condizione ha bisogno di un commento, merita una costante con un nome.
// controlla se l’utente è adminif (user.role === 'admin' && user.active) {const isAdmin = user.role === 'admin' && user.active;if (isAdmin) {
flow/early-return JAVA Prima si escludono i casi che non servono, poi il percorso principale resta piatto.
if (player != null) {if (player.isRanked()) {return player.getRank();}}return Rank.UNRANKED;if (player == null || !player.isRanked()) return Rank.UNRANKED;return player.getRank();
size/readable-lines JS La versione corta vince solo se si legge meglio di quella lunga.
let r = false;for (let i = 0; i < p.v.length; i++) {if (p.v[i].a) r = true;}return r;return product.variants.some((variant) => variant.available);
Prima gli sviluppatori. Poi il prodotto. Infine i clienti.
Gaming
Le mie statistiche di League of Legends, servite dall’API di Beebot, più qualche clip. Altri giochi in arrivo.
Stagione 2026 · Support main
Riepilogo delle partite caricate
Nessuna partita con questi filtri.
Contatti