[{"data":1,"prerenderedAt":3680},["ShallowReactive",2],{"category-dev":3},[4,482,833,1038,1211,1379,1787,1980,2197,2386,2699,2872,3026,3229,3486],{"id":5,"title":6,"body":7,"categories":463,"coverImage":466,"date":467,"description":16,"extension":468,"meta":469,"navigation":470,"path":471,"seo":472,"stem":473,"sticky":474,"tags":475,"__hash__":481},"articles/bullmq-rs-porting.md","L'interfaccia che non si vede",{"type":8,"value":9,"toc":450},"minimark",[10,17,25,33,36,41,44,49,56,59,62,66,69,72,79,82,85,96,99,103,106,114,121,128,131,134,150,157,161,164,226,241,255,258,261,265,268,311,314,317,321,324,330,337,343,346,357,362,366,373,376,391,394,397,400,403,406,409,415,418,421,425,445],[11,12,13],"p",{},[14,15,16],"em",{},"Un porting non è una traduzione. È un esercizio di scoperta su cosa, in un sistema, è davvero il contratto. Quasi sempre non è quello che pensi.",[11,18,19,20,24],{},"Qualche giorno fa è stato mergiato in upstream un PR che ho aperto su ",[21,22,23],"code",{},"bullmq-rs",", il porting Rust di BullMQ. Il diff è grosso — circa undicimila righe in più, duemila in meno — ed esce come release v2.0.0 breaking.",[11,26,27,28,32],{},"Quando ho riletto la description del PR a cose fatte, mi sono accorto che la sezione più informativa non era quella di cosa il PR includeva. Era quella di ",[29,30,31],"strong",{},"cosa avevo deliberatamente lasciato fuori",".",[11,34,35],{},"È l'unica cosa per cui valga la pena scriverci sopra.",[37,38,40],"h2",{"id":39},"cosè-successo","Cos'è successo",[11,42,43],{},"BullMQ è una libreria Node per code distribuite sopra Redis. È diffusa, ha un ecosistema consolidato attorno — Bull Board, dashboard, monitoring — e ha una specifica di fatto su come i dati sono strutturati dentro Redis. Non c'è uno standard formale: c'è il codice della libreria, e c'è il comportamento che il tooling esterno si aspetta di osservare.",[11,45,46,48],{},[21,47,23],{}," è il porting Rust. L'idea è semplice: chi vuole worker in Rust dovrebbe poter scrivere worker in Rust senza dover rifare l'infrastruttura attorno. La dashboard resta quella. I job creati da Node sono leggibili da Rust, e viceversa. Le metriche continuano a funzionare. Si può migrare un servizio per volta senza spegnere il resto.",[11,50,51,52,55],{},"Quando il porting esisteva nella versione precedente, l'API Rust si era avvicinata a quella di BullMQ ma il ",[29,53,54],{},"wire format"," — la struttura esatta dei dati che finiscono su Redis — era divergente in modi sottili. Liste dove dovevano esserci sorted set. Campi degli hash con nomi diversi. Eventi sullo stream con payload diverso da quello che il tooling Node si aspetta di leggere.",[11,57,58],{},"Risultato concreto: il tooling esterno non funzionava. Bull Board non vedeva le code create da Rust. Un worker Node sulla stessa coda di un worker Rust non vedeva i job dell'altro.",[11,60,61],{},"L'API Rust era pulita. Quello che usciva da Redis era un'altra cosa.",[37,63,65],{"id":64},"lo-scenario-per-cui-serve","Lo scenario per cui serve",[11,67,68],{},"Per essere concreti, lo scenario tipico è questo.",[11,70,71],{},"Hai un sistema Node con BullMQ in produzione. Funziona. Bull Board ti mostra le code, gli alert sono cablati, l'SRE sa dove guardare quando qualcosa fuma di notte.",[11,73,74,75,78],{},"A un certo punto un tipo di job smette di reggere. Encoding di video. Image processing. Una pipeline CPU-bound. Il worker Node fa quello che può, ma il throughput non basta più. Vorresti riscrivere ",[14,76,77],{},"solo quel worker"," in Rust, lasciando il resto dell'infrastruttura dov'è.",[11,80,81],{},"Senza wire compatibility, le opzioni sono due. Riscrivere tutto in Rust e perdere il tooling Node. Oppure tenere un layer di traduzione tra i due e portarsi dietro la complessità di mantenerlo allineato a ogni release di BullMQ.",[11,83,84],{},"Con wire compatibility, c'è una terza opzione. Lo stesso job prodotto da un producer Node viene processato da un worker Rust. La dashboard non sa che la stanno chiamando da due runtime diversi. Le metriche non cambiano forma. L'SRE che riceve la pagine alle tre vede le stesse cose che vedeva prima.",[11,86,87,88,91,92,95],{},"C'è anche una proprietà che in Rust emerge naturalmente e in Node non esiste: il payload del job è tipizzato. Scrivi ",[21,89,90],{},"Job\u003CEncodingTask>"," e il worker riceve la ",[21,93,94],{},"EncodingTask"," già deserializzata, controllata a compile time. Se cambi lo schema, il compilatore ti ferma prima del deploy. Per i job dove la correttezza del payload conta davvero — pagamenti, side effect costosi, transizioni di stato critiche — è una garanzia concreta, non un dettaglio estetico.",[11,97,98],{},"Non è un caso d'uso da keynote. È uno di quelli che fa la differenza dopo il deploy.",[37,100,102],{"id":101},"hyrums-law-applicata-al-porting","Hyrum's Law applicata al porting",[11,104,105],{},"C'è una formulazione attribuita a Hyrum Wright, che ha lavorato a lungo in Google sul tooling di refactor su larga scala:",[107,108,109],"blockquote",{},[11,110,111],{},[14,112,113],{},"With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.",[11,115,116,117,120],{},"In italiano stretto: con abbastanza utenti, ",[29,118,119],{},"non conta cosa dici di promettere",". Conta tutto quello che il sistema fa, comprese le parti che non avresti scelto di promettere. Qualcuno, da qualche parte, si è appoggiato a ognuna di quelle.",[11,122,123,124,127],{},"In un porting, questa frase ha un corollario molto preciso: l'interfaccia vera del sistema che stai portando ",[29,125,126],{},"non è la sua API",". È l'insieme dei comportamenti osservabili dall'esterno — strutture dati, formati di serializzazione, side effect, ordine degli eventi — su cui qualcun altro, fuori dal sistema, si è appoggiato per far funzionare le sue cose.",[11,129,130],{},"Per BullMQ quell'interfaccia è il layout su Redis. Non la signature di una funzione. La forma esatta di un hash, di una sorted set, di una entry su uno stream.",[11,132,133],{},"Quando porti un sistema così, le scelte si dividono in due categorie:",[135,136,137,144],"ol",{},[138,139,140,143],"li",{},[29,141,142],{},"Quello che non puoi cambiare"," — il wire format. Cambiarlo significa rompere ogni cosa che ci sta sopra senza che il chiamante se ne accorga, fino al prossimo deploy in cui scopre che la dashboard è vuota o che mancano metà dei job.",[138,145,146,149],{},[29,147,148],{},"Quello che puoi cambiare"," — l'API del linguaggio di destinazione. È libera. Nessuno la sta osservando dall'esterno.",[11,151,152,153,156],{},"Confondere le due categorie è il modo più sicuro di fare un porting che ",[14,154,155],{},"sembra finito"," e non lo è.",[37,158,160],{"id":159},"cosa-il-pr-ha-messo-dentro","Cosa il PR ha messo dentro",[11,162,163],{},"La prima parte del lavoro è stata appiattire il wire format sotto quello di BullMQ v5:",[165,166,167,180,201,204,207],"ul",{},[138,168,169,170,173,174,173,177],{},"liste per ",[21,171,172],{},"wait",", ",[21,175,176],{},"active",[21,178,179],{},"paused",[138,181,182,183,173,186,173,189,173,192,173,195,173,198],{},"sorted set per ",[21,184,185],{},"prioritized",[21,187,188],{},"delayed",[21,190,191],{},"completed",[21,193,194],{},"failed",[21,196,197],{},"waiting-children",[21,199,200],{},"marker",[138,202,203],{},"hash per i metadati",[138,205,206],{},"stream per gli eventi",[138,208,209,210,173,213,173,216,173,219,173,222,225],{},"campi degli hash dei job con gli stessi nomi e gli stessi formati di Node (",[21,211,212],{},"atm",[21,214,215],{},"ats",[21,217,218],{},"processedOn",[21,220,221],{},"pb",[21,223,224],{},"opts"," JSON-encoded)",[11,227,228,229,231,232,234,235,237,238,240],{},"Sopra, il porting degli script Lua atomici che BullMQ usa per le transizioni di stato. Una transizione di un job — da ",[21,230,172],{}," ad ",[21,233,176],{},", da ",[21,236,176],{}," a ",[21,239,191],{},", dal recovery di un job stallato — non si può implementare come sequenza di comandi Redis. Deve essere atomica, e BullMQ ottiene l'atomicità delegando a Lua. Riscriverle a mano in Rust significherebbe inventare race condition che il codice originale non ha. Quindi si portano, riga per riga, e si verifica che il comportamento osservato sia identico.",[11,242,243,244,247,248,251,252,254],{},"Sopra ancora c'è il runtime: marker-based loop con ",[21,245,246],{},"BZPOPMIN",", lock con token e TTL, recovery dei job stallati, fast-path per il ",[21,249,250],{},"moveToFinished",", fix del prefetch perché i job non rimangano orfani in ",[21,253,176],{}," quando un worker si chiude in modo non pulito.",[11,256,257],{},"Sopra ancora le API Rust: Queue, Job, QueueEvents, FlowProducer con parent/child cross-queue.",[11,259,260],{},"Tutto questo è abbastanza per usarlo in produzione, e abbastanza perché parli con un cluster Node esistente senza traduzioni intermedie.",[37,262,264],{"id":263},"cosa-il-pr-ha-deliberatamente-lasciato-fuori","Cosa il PR ha deliberatamente lasciato fuori",[11,266,267],{},"Una lista, nel corpo del PR:",[165,269,270,277,296,299,302,305,308],{},[138,271,272,273,276],{},"niente ",[21,274,275],{},"JobScheduler"," (i job ripetibili tipo cron)",[138,278,279,280,173,283,173,286,173,289,173,292,295],{},"niente bulk sulle Queue (",[21,281,282],{},"addBulk",[21,284,285],{},"clean",[21,287,288],{},"obliterate",[21,290,291],{},"retryJobs",[21,293,294],{},"promoteJobs",")",[138,297,298],{},"niente pause/resume lato Worker (sulla Queue sì)",[138,300,301],{},"niente rate limiting",[138,303,304],{},"niente deduplica",[138,306,307],{},"niente debounce",[138,309,310],{},"niente metriche",[11,312,313],{},"Sono tutte cose che BullMQ ha. Sono tutte cose che andranno aggiunte.",[11,315,316],{},"Ma non in questo PR.",[37,318,320],{"id":319},"perché","Perché",[11,322,323],{},"Perché un porting che prova a fare tutto in un colpo solo finisce in due modi: o non viene mai mergiato, o viene mergiato con compromessi nascosti.",[11,325,326,327,32],{},"I compromessi nascosti sono quelli che non vedi nella description ma sono nel codice. Convenzioni inventate dove la spec non era chiara. Edge case lasciati indietro perché stancavano. Comportamenti che divergono in silenzio da quelli del sistema originale e che si scoprono mesi dopo, quando un utente segnala che ",[14,328,329],{},"\"con Node funziona, con Rust no\"",[11,331,332,333,336],{},"È il debito ",[14,334,335],{},"accidentale"," di Cunningham — quello che accumuli senza saperlo, perché non hai capito abbastanza bene il problema. Non puoi quantificarlo. Non puoi ripagarlo. Non sai nemmeno dove sia.",[11,338,339,340,32],{},"Il modo per evitarlo, in un porting, è invertire l'istinto: ",[29,341,342],{},"dichiarare per primo quello che non stai facendo",[11,344,345],{},"Non in fondo al PR, in piccolo. Nella description, in una sezione dedicata, con i nomi precisi delle API e dei comportamenti che mancano. Pubblicamente, prima ancora che qualcuno chieda.",[11,347,348,349,352,353,356],{},"Questo trasforma la stessa identica situazione — ",[14,350,351],{},"\"una libreria con feature mancanti\""," — da debito accidentale in ",[29,354,355],{},"debito deliberato",": lo strumento legittimo di cui Cunningham parlava davvero. So cosa manca. È scritto. È tracciato. Il prossimo PR sa dove deve atterrare. Chi usa la libreria sa cosa può aspettarsi e cosa no.",[107,358,359],{},[11,360,361],{},"Il debito deliberato è uno strumento di scope. Il debito accidentale è scope che ti gestisce.",[37,363,365],{"id":364},"la-tentazione-di-portare-tutto","La tentazione di portare tutto",[11,367,368,369,372],{},"C'è una tentazione precisa, in qualunque porting o reimplementazione, ed è la stessa che la velocità di produzione dell'AI rende più facile da assecondare: provare a fare ",[14,370,371],{},"tutto"," in un colpo solo, perché tecnicamente si potrebbe.",[11,374,375],{},"Il sistema originale ha cento feature. Il porting può imitarle tutte. Le LOC scalano. Il PR si gonfia. La review diventa impossibile. Le scelte sulle parti che non hai capito davvero finiscono per essere prese per default — dal codice generato, da analogie con altri sistemi, da quello che sembrava ragionevole alle tre di notte.",[11,377,378,379,382,383,386,387,390],{},"E quando quel PR viene mergiato, il sistema risultante ha un'estensione paragonabile all'originale ma una superficie di bug che nessuno ha mappato. ",[14,380,381],{},"Sembra"," completo. E come ho scritto altrove, ",[14,384,385],{},"sembra completo"," ed ",[14,388,389],{},"è corretto"," non sono mai stati la stessa cosa.",[11,392,393],{},"L'alternativa è meno glamour. Portare prima ciò che è strutturale — il wire format, il runtime, gli atomi — e poi aggiungere superficie un pezzo alla volta, additivamente, scrivendo nero su bianco cosa manca ancora e perché.",[11,395,396],{},"Niente dimostra qualcosa nel portare di più. Qualcosa si perde quasi sempre nel portare senza dichiarare cosa è dentro e cosa è fuori.",[37,398,6],{"id":399},"linterfaccia-che-non-si-vede",[11,401,402],{},"Vale anche fuori dai porting.",[11,404,405],{},"In quasi tutti i sistemi che condividono stato con qualcosa di esterno — un'altra applicazione, un altro team, un altro runtime, un altro linguaggio — l'interfaccia che conta davvero non è quella che vedi nella signature di una funzione. È quella che attraversa il confine. Un payload JSON. Una riga di una tabella. Un evento su una stream.",[11,407,408],{},"È quella che il chiamante osserva. È quella che, se cambia in silenzio, rompe le cose lontano da dove l'hai cambiata, in un orario in cui non sei davanti allo schermo.",[11,410,411,412],{},"Quando lavori dentro un sistema chiuso, hai il lusso di poter rinominare, ristrutturare, refattorizzare a piacere. Quando il sistema ha un confine osservato da qualcun altro, quel lusso scompare. ",[29,413,414],{},"L'API del linguaggio è effimera. Il contratto reale è quello che passa attraverso il confine.",[11,416,417],{},"Per il porting di BullMQ quel confine era Redis. Una volta che il confine è giusto, tutto il resto è additivo. Se il confine è sbagliato, ogni feature aggiunta sopra è una bugia in più da mantenere.",[11,419,420],{},"E le bugie nei sistemi non scadono. Aspettano.",[37,422,424],{"id":423},"riferimenti","Riferimenti",[165,426,427,437],{},[138,428,429,430],{},"PR mergiato: ",[431,432,436],"a",{"href":433,"rel":434},"https://github.com/bogardt/bullmq-rs/pull/3",[435],"nofollow","bogardt/bullmq-rs#3",[138,438,439,440],{},"Issue di partenza: ",[431,441,444],{"href":442,"rel":443},"https://github.com/bogardt/bullmq-rs/issues/2",[435],"bogardt/bullmq-rs#2",[11,446,447],{},[14,448,449],{},"Il porting più onesto è quello che dichiara per primo cosa non sta portando.",{"title":451,"searchDepth":452,"depth":452,"links":453},"",2,[454,455,456,457,458,459,460,461,462],{"id":39,"depth":452,"text":40},{"id":64,"depth":452,"text":65},{"id":101,"depth":452,"text":102},{"id":159,"depth":452,"text":160},{"id":263,"depth":452,"text":264},{"id":319,"depth":452,"text":320},{"id":364,"depth":452,"text":365},{"id":399,"depth":452,"text":6},{"id":423,"depth":452,"text":424},[464,465],"Dev","Open Source","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/linterfaccia-che-non-si-vede.png","2026-06-07T10:00:00.000Z","md",{},true,"/bullmq-rs-porting",{"title":6,"description":16},"bullmq-rs-porting",false,[476,477,478,479,480],"rust","bullmq","open-source","porting","engineering","UuZirdWSmow4buT9WfQq0g6y2oE8l0x6cPdqDavWfHg",{"id":483,"title":484,"body":485,"categories":819,"coverImage":821,"date":822,"description":823,"extension":468,"meta":824,"navigation":470,"path":825,"seo":826,"stem":827,"sticky":474,"tags":828,"__hash__":832},"articles/velocita-senza-giudizio.md","Velocità senza giudizio",{"type":8,"value":486,"toc":810},[487,492,495,502,505,508,513,520,524,527,534,547,554,560,563,567,573,580,583,594,597,604,612,615,619,622,629,640,643,650,655,658,661,668,672,675,678,681,684,690,693,698,701,705,711,714,721,724,735,739,745,748,758,763,766,769,774,778,781,788,791,802,805],[11,488,489],{},[14,490,491],{},"Il vibe coding non ha inventato il codice scritto male. Ha solo tolto l'attrito.",[11,493,494],{},"Ho visto un backend con l'autenticazione hardcodata nel frontend. Password admin in chiaro, visibile a chiunque aprisse DevTools. Non era vibe coding — era 2018, dev umani, trovati su Upwork.",[11,496,497,498,501],{},"Ve lo dico perché quello che sta succedendo adesso ",[29,499,500],{},"non è una novità",". È la stessa roba, più veloce.",[11,503,504],{},"Ho visto Google Sheets usato come database. Collassava a quattro utenti. I fondatori si sono sorpresi.",[11,506,507],{},"Ho visto funzionalità dichiarate implementate che erano solo API vuote senza niente dietro. L'ho visto fare a dev umani. L'ho visto fare a Claude Opus 4.6, che in questo momento è il modello più capace di Anthropic. Ho visto test scritti per passare, non per verificare.",[107,509,510],{},[11,511,512],{},"Un sistema che si auto-certifica è più pericoloso di uno che fallisce apertamente.",[11,514,515,516,519],{},"Il problema non è l'AI. È che la velocità che offre può farti dimenticare che costruire software è ",[29,517,518],{},"fondamentalmente un atto cognitivo"," — non di scrittura.",[37,521,523],{"id":522},"il-software-non-è-testo","Il software non è testo",[11,525,526],{},"Questa è la cosa che l'entusiasmo attorno al vibe coding dimentica sistematicamente.",[11,528,529,530,533],{},"Il software non è testo. È un ",[29,531,532],{},"modello formale della realtà"," — un sistema di regole che descrive come un dominio si comporta, come gli stati cambiano, come le eccezioni vengono gestite, come il tempo e la concorrenza e il fallimento vengono trattati.",[11,535,536,537,540,541,543,544,32],{},"Scrivere codice non è mai stato il problema difficile. Il problema difficile è capire ",[14,538,539],{},"cosa"," scrivere — e ",[14,542,319],{},". È identificare i confini del dominio, le invarianti che devono reggere, i casi limite che il business non ti ha detto perché non sapeva di doverlo fare, le implicazioni che una scelta architetturale avrà tra sei mesi quando i requisiti cambieranno — ",[29,545,546],{},"perché cambiano sempre",[11,548,549,550,553],{},"Questa comprensione non si ottiene velocemente. Si ottiene attraverso iterazioni, conversazioni, errori, correzioni, notti a chiedersi perché quella cosa non funziona come dovrebbe. È quella che Michael Polanyi chiamava ",[14,551,552],{},"conoscenza tacita"," — sapere che non si riesce a trasferire completamente in parole, che risiede nell'esperienza accumulata, nei pattern riconosciuti, nelle intuizioni costruite su decine di progetti.",[11,555,556,559],{},[29,557,558],{},"L'AI non ha questa conoscenza."," Ha la media statistica di quello che è stato scritto su internet riguardo a problemi simili al tuo.",[11,561,562],{},"Che non è la stessa cosa.",[37,564,566],{"id":565},"la-trappola-della-perfezione-apparente","La trappola della perfezione apparente",[11,568,569,570,32],{},"C'è qualcosa di specifico nell'AI che aggrava tutto questo: ",[29,571,572],{},"il codice che produce sembra sempre scritto bene",[11,574,575,576,579],{},"È ben nominato, ha i commenti nei posti giusti, segue le convenzioni, usa i pattern corretti. Non sembra il codice di qualcuno che non sa quello che fa — sembra il codice di qualcuno che sa ",[14,577,578],{},"esattamente"," quello che fa.",[11,581,582],{},"Questo è il problema.",[11,584,585,586,589,590,593],{},"Il codice sbagliato scritto male ti ferma. Lo vedi, lo senti, ti insospettisce. Attiva il tuo senso critico prima ancora che tu abbia capito cosa fa. Il ",[29,587,588],{},"codice sbagliato scritto bene"," attraversa la code review senza attivare nessun campanello d'allarme, supera i test, va in produzione. E quando si rompe — ",[14,591,592],{},"perché si rompe"," — la forma corretta del codice rende ancora più difficile localizzare il problema concettuale che ci sta sotto.",[11,595,596],{},"Stai cercando un bug in codice che non sembra buggy. Stai cercando un'assunzione sbagliata in codice che sembra ragionevole.",[11,598,599,600,603],{},"Nel 1986 Fred Brooks scriveva che la difficoltà essenziale del software non è accidentale — non riguarda la sintassi, i compilatori, la velocità di scrittura. Riguarda la ",[29,601,602],{},"complessità concettuale intrinseca"," dei sistemi che costruiamo. Quarant'anni dopo, l'AI ha eliminato quasi completamente la difficoltà accidentale. Quella essenziale è rimasta intatta.",[107,605,606],{},[11,607,608,611],{},[14,609,610],{},"\"No silver bullet.\"","\n— Fred Brooks, 1986",[11,613,614],{},"E ora che la difficoltà accidentale è sparita, la difficoltà essenziale è più esposta che mai. Ma è anche più facile da non vedere, perché l'output che la nasconde sembra così convincente.",[37,616,618],{"id":617},"il-modello-della-realtà","Il modello della realtà",[11,620,621],{},"Quando chiedi all'AI di costruire qualcosa, quello che ricevi non è una soluzione.",[11,623,624,625,628],{},"È una ",[29,626,627],{},"interpretazione"," del problema che hai descritto.",[11,630,631,632,635,636,639],{},"L'AI costruisce un modello della realtà basato su quello che gli hai detto — e quello che gli hai detto è inevitabilmente incompleto, perché la conoscenza del dominio che hai in testa non si trasferisce per intero in un prompt. Il gap tra il problema che hai ",[14,633,634],{},"in testa"," e il problema che l'AI ha ",[14,637,638],{},"capito"," è sempre presente. A volte è trascurabile. A volte è la differenza tra un sistema che regge e uno che collassa al primo caso limite reale.",[11,641,642],{},"La velocità non ti dà il tempo di misurare quel gap. Peggio: la velocità e la perfezione apparente dell'output creano attivamente l'illusione che il gap non esista.",[11,644,645,646,649],{},"Questo è il motivo per cui ",[29,647,648],{},"\"funziona\" non è mai abbastanza"," come criterio di accettazione.",[11,651,652],{},[14,653,654],{},"Funziona rispetto a cosa?",[11,656,657],{},"Rispetto ai test che l'AI ha scritto per passare — costruiti attorno agli stessi casi che aveva in testa quando ha scritto il codice, in un loop chiuso che non include nessuna realtà esterna? Rispetto alla demo con dati puliti e percorsi felici? O rispetto alla logica reale del dominio, con tutti i casi limite che solo tu conosci perché ci hai lavorato dentro?",[11,659,660],{},"Salvatore Sanfilippo ha sollevato un problema analogo sulla code review: lo stato mentale di chi scrive non è trasferibile al reviewer. Il reviewer vede il testo, non il ragionamento che ha prodotto quel testo. O puntualizza cose superficiali, oppure non comprende abbastanza da vedere il problema vero.",[11,662,663,664,667],{},"Con l'AI il problema si radicalizza: ",[29,665,666],{},"l'AI non ha stato mentale da trasferire",". Ha prodotto output ottimizzando per la coerenza interna del testo, non per la corrispondenza con la tua realtà. Il reviewer — che sei tu — deve colmare quel gap da solo. Se non ti fermi a farlo, nessuno lo farà.",[37,669,671],{"id":670},"let-it-sink","Let it sink",[11,673,674],{},"C'è una pratica che ogni ingegnere con abbastanza cicatrici ha interiorizzato: dormirci sopra.",[11,676,677],{},"Non per pigrizia. Per necessità cognitiva.",[11,679,680],{},"Il cervello umano non elabora i problemi complessi in modo lineare e sequenziale. Elabora in parallelo, spesso al di sotto della soglia della coscienza. È per questo che le soluzioni migliori arrivano sotto la doccia, in macchina, la mattina appena svegli — non davanti allo schermo quando stai cercando attivamente la risposta. I problemi che non vedi nel momento emergono dopo, quando torni con occhi freschi e il cervello ha avuto il tempo di connettere pattern che la concentrazione attiva non riesce a vedere.",[11,682,683],{},"Non è misticismo. È neuroscienze. La modalità diffusa del cervello è essenziale per l'insight, per la comprensione profonda, per accorgersi delle incongruenze che la modalità focalizzata salta perché è troppo dentro il problema.",[11,685,686,687],{},"Con l'AI quella pratica diventa ancora più importante, e ancora più facile da saltare. Perché in pochi minuti hai davanti qualcosa che sembra completo. L'effort che hai speso è minimo, quindi la sensazione di investimento è bassa, quindi la soglia per dichiararlo fatto si abbassa. ",[29,688,689],{},"Non hai faticato per arrivare lì, quindi non senti il bisogno di proteggerti dall'errore di aver faticato invano.",[11,691,692],{},"Ma \"sembra completo\" e \"è corretto\" sono due cose diverse — e la velocità di produzione dell'AI ha reso quella distinzione più sottile che mai.",[107,694,695],{},[11,696,697],{},"Fermarsi non è perdere il vantaggio della velocità. È il momento in cui verifichi che quella velocità ti abbia portato nella direzione giusta.",[11,699,700],{},"Senza quel momento, stai solo andando veloce verso il posto sbagliato — e ci arrivi prima.",[37,702,704],{"id":703},"la-code-review-non-basta","La code review non basta",[11,706,707,708,32],{},"La risposta istintiva a tutto questo è: ",[14,709,710],{},"\"per questo c'è la code review\"",[11,712,713],{},"Ma la code review, così come è praticata nella maggior parte dei team, non risolve il problema che stiamo descrivendo.",[11,715,716,717,720],{},"La code review tradizionale è ottima per trovare bug sintattici, violazioni di convenzioni, problemi di sicurezza ovvi. È molto meno efficace per valutare se le ",[29,718,719],{},"decisioni architetturali sono corrette",", se il modello del dominio rispecchia la realtà, se le assunzioni implicite nel codice sono valide.",[11,722,723],{},"Con l'AI il problema si amplifica: il codice generato è sintatticamente inattaccabile. Il reviewer scorre, non trova niente che attivi i campanelli d'allarme standard, approva. Il problema concettuale che stava sotto passa indisturbato.",[11,725,726,727,730,731,734],{},"La code review utile in questo contesto non è ",[14,728,729],{},"\"questo codice è scritto bene?\""," — quella risposta è quasi sempre sì. È ",[14,732,733],{},"\"questo codice fa quello che dovrebbe fare nel contesto del dominio reale?\""," — e per rispondere devi avere la conoscenza del dominio che l'AI non ha, devi aver capito i requisiti abbastanza da sapere cosa verificare, devi aver lasciato che la soluzione sedimentasse abbastanza da poterla vedere con distacco critico.",[37,736,738],{"id":737},"il-debito-che-non-vedi","Il debito che non vedi",[11,740,741,742,32],{},"Il debito tecnico generato senza giudizio ha una caratteristica precisa: ",[29,743,744],{},"è silenzioso",[11,746,747],{},"Non si manifesta subito. Si accumula in decisioni prese per default dall'AI che non erano le tue decisioni — ma ora sono nel codice, e il codice è in produzione. In architetture che reggono il caso d'uso che hai descritto ma non quello successivo. In assunzioni implicite che l'AI ha fatto riempiendo i gap del tuo prompt con la media di quello che ha visto in training.",[11,749,750,751,754,755,757],{},"Ward Cunningham, che il termine \"debito tecnico\" lo ha inventato, intendeva qualcosa di specifico: il debito ",[14,752,753],{},"deliberato",", contratto consapevolmente per andare più veloci ora con l'intenzione di ripagarlo dopo. Non il debito ",[14,756,335],{},", quello che accumuli senza saperlo perché non hai capito abbastanza bene il problema.",[11,759,760],{},[29,761,762],{},"Il debito deliberato è uno strumento legittimo. Il debito accidentale è ignoranza capitalizzata.",[11,764,765],{},"Il vibe coding senza giudizio produce quasi esclusivamente debito accidentale. Perché la velocità impedisce la comprensione, e senza comprensione non puoi nemmeno scegliere consapevolmente di indebitarti — ti indebiti e basta, senza saperlo, senza poterlo quantificare, senza un piano per ripagarlo.",[11,767,768],{},"E quando emerge, emerge nel momento peggiore. Quando c'è trazione. Quando ci sono utenti reali. Quando il costo di sistemare è un ordine di grandezza superiore a quello che sarebbe stato all'inizio.",[107,770,771],{},[11,772,773],{},"Il conto arriva sempre. La velocità determina solo quanto in fretta lo accumuli.",[37,775,777],{"id":776},"la-velocità-è-un-mezzo","La velocità è un mezzo",[11,779,780],{},"L'AI nello sviluppo è straordinaria. La uso ogni giorno.",[11,782,783,784,787],{},"Ma la velocità non è il fine — è un mezzo. Il fine è costruire qualcosa che ",[29,785,786],{},"rispecchi la logica che avevi in testa",", che regga i casi limite del dominio reale, che qualcuno possa capire e modificare tra un anno senza maledire chi lo ha scritto.",[11,789,790],{},"Se la velocità ti impedisce di verificare che questo sia vero, non stai andando più veloce. Stai solo sbagliando più in fretta. Con più righe di codice. Con più fiducia. Con meno possibilità di accorgertene prima che diventi costoso.",[11,792,793,794,797,798,801],{},"La differenza tra un ingegnere che usa l'AI bene e uno che la usa male non è tecnica. ",[29,795,796],{},"È cognitiva."," È la capacità di fermarsi, lasciare che le cose sedimentino, tornare con distacco critico e chiedersi: questo rispecchia davvero quello che volevo? O sto guardando qualcosa che ",[14,799,800],{},"sembra"," quello che volevo?",[11,803,804],{},"Sono domande scomode da fare quando hai appena passato un pomeriggio produttivo e lo schermo è pieno di codice nuovo e i test passano.",[11,806,807],{},[14,808,809],{},"Falle lo stesso.",{"title":451,"searchDepth":452,"depth":452,"links":811},[812,813,814,815,816,817,818],{"id":522,"depth":452,"text":523},{"id":565,"depth":452,"text":566},{"id":617,"depth":452,"text":618},{"id":670,"depth":452,"text":671},{"id":703,"depth":452,"text":704},{"id":737,"depth":452,"text":738},{"id":776,"depth":452,"text":777},[464,820],"AI","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/velocita-senza-giudizio.png","2026-04-03T10:00:00.000Z","Il vibe coding non ha inventato il codice scritto male. Ha solo tolto l'attrito. E la velocità, senza il tempo di valutare, produce solo errori più rapidi.",{},"/velocita-senza-giudizio",{"title":484,"description":823},"velocita-senza-giudizio",[829,830,480,831],"ai","vibe-coding","build-in-public","U75B5WaPnYhOsgue02Cp92PwZioiIXFh6SRZMrizYok",{"id":834,"title":835,"body":836,"categories":1025,"coverImage":1026,"date":1027,"description":1028,"extension":468,"meta":1029,"navigation":470,"path":1030,"seo":1031,"stem":1032,"sticky":474,"tags":1033,"__hash__":1037},"articles/la-storia-si-ripete.md","La storia si ripete",{"type":8,"value":837,"toc":1017},[838,843,851,855,858,861,873,879,882,885,889,895,898,904,908,911,917,920,924,944,951,954,961,971,975,978,984,987,990,995,999,1004,1014],[11,839,840],{},[14,841,842],{},"Graph database, MongoDB, vector database dedicati. Il pattern è sempre lo stesso. Solo i nomi cambiano.",[11,844,845,846,850],{},"Nel ",[431,847,849],{"href":848},"/il-cms-in-c-che-non-ho-mai-scritto","post precedente"," ho raccontato di come nel 2015 ho scelto \"il solito\" WordPress per creare una piattaforma usata da decine di migliaia di persone. Ma c'è un'altra storia di quegli anni che vale la pena raccontare.",[37,852,854],{"id":853},"_2015-i-graph-database-erano-il-futuro-nosql-il-presente","2015: i graph database erano il futuro, noSQL il presente",[11,856,857],{},"Ogni conferenza, ogni blog post, ogni dev entusiasta. \"Le foreign key non scalano. I join sono roba vecchia. Il mondo è fatto di connessioni.\" Neo4j, Cypher, slide piene di nodi colorati e frecce.",[11,859,860],{},"Sullo stesso tono di guerra ai classici relazionali, le milioni di persone che si sono riversata su una unica combo, che quasi faceva da sinonimo a startup: nodejs + mongodb.",[11,862,863,864,173,867,173,870,32],{},"Partecipavo spesso a demo day tecnici dove CTO di altre startup raccontavano come stavano impostando la loro tecnologia.\nRicordo ancora uno ha esordire, appunto, con il classico dell'epoca: \"useremo node in accoppiata con mongo!\".\nPoi ha iniziato a descrivere il dominio: ",[14,865,866],{},"\"la relazione con\"",[14,868,869],{},"\"la relazione di\"",[14,871,872],{},"\"questo è collegato a quello tramite quell'altro\"",[11,874,875,876],{},"Ho detto: ",[29,877,878],{},"\"Che follia sarebbe stata salvare le relazioni in un db... relazionale, vero?\"",[11,880,881],{},"Oggi uso Postgres per quasi tutto. Quando mi serve qualcosa in più pesco a piene mani da estensioni per lo stesso : pgvector per i vettori, timescale per time series, pg_textsearch per full text con ranking.",[11,883,884],{},"Graph database: zero.",[37,886,888],{"id":887},"cosa-è-successo","Cosa è successo",[11,890,891,892],{},"Niente di drammatico. ",[29,893,894],{},"Postgres è andato avanti.",[11,896,897],{},"Recursive CTE, jsonb, estensioni per tutto. Ha cannibalizzato il 90% dei casi d'uso senza aggiungere un componente infrastrutturale in più da mantenere, sincronizzare, monitorare e pagare.\nIl costo operativo di un grafo dedicato non è banale: lo sharding è complicato, e il modello mentale è diverso da quello relazionale che la maggior parte degli sviluppatori ha già interiorizzato.",[11,899,900,901,32],{},"Risultato: ottimo strumento per nicchie specifiche — fraud detection su scala enterprise, knowledge graph in grandi organizzazioni. Per il 95% dei progetti: ",[29,902,903],{},"overkill",[37,905,907],{"id":906},"la-stessa-storia-prima","La stessa storia, prima",[11,909,910],{},"Prima dei graph database c'era stato MongoDB.",[11,912,913,916],{},[14,914,915],{},"\"I join non scalano\""," — ripetuto come un mantra da chi non aveva mai avuto problemi di scala.\nDue anni dopo: array di userId dentro il documento ordine, ma alcuni stringhe, alcuni numeri altri ObjectId e manca il 3% dei riferimenti, e nessuno sa perché.",[11,918,919],{},"MongoDB era genuinamente utile per alcuni casi d'uso e anch'io l'ho usato tantissimo (più frequentemento a fianco anziché in sostituzione).\nIl problema era che veniva usato per tutto, perché era nuovo, perché era cool, perché usarlo sembrava una scelta moderna.",[37,921,923],{"id":922},"il-pattern-è-sempre-lo-stesso","Il pattern è sempre lo stesso",[135,925,926,929,932,935,938,941],{},[138,927,928],{},"Tecnologia nuova risolve problemi reali in casi specifici",[138,930,931],{},"Viene presentata con casi d'uso di aziende con scala che il 99% dei team non avrà mai",[138,933,934],{},"Viene adottata come soluzione generale",[138,936,937],{},"Chi usa la tecnologia \"noiosa\" sembra un fossile",[138,939,940],{},"Arriva il momento dei conti",[138,942,943],{},"La tecnologia noiosa è ancora lì, qualcuno propone un refactor \"per irrobustire\" (leggasi tornare a schemi e contratti solidi), che durerà un anno.",[11,945,946,947,950],{},"C'è un concetto che si chiama ",[29,948,949],{},"Lindy Effect",": una tecnologia che esiste da vent'anni probabilmente esisterà altri vent'anni.",[11,952,953],{},"Ve lo dice uno che è smanettone e enthusiast dalla nascita: conoscere tutto, sperimentare tutto, ma in produzione... Dipende.",[11,955,956,957,960],{},"Il nostro mestiere è ",[29,958,959],{},"identificare contesti in cui è necessario operare scelte \"a mestiere\""," anche considerando aree di rischio come il supporto sul lungo periodo,\nla reperibilità (e dunque i costi) di risorse schillate in quella tecnologia col crescere del team, trasferimento di competenze, disponibilità di estensioni/librerie già pronte e battle-tested.",[11,962,963,966,967,970],{},[29,964,965],{},"E lo so che riusare qualcosa che usi da 20 anni è noioso",", ma a volte è anche il servizio più professionale che possiamo rendere. Per il brivido della novità basta un po' di pazienza e\ncertamente l'universo ci manderà il progetto in cui avrà veramente senso utilizzare la novità. Nel frattempo ci sono i vari progetti personali ",[14,968,969],{},"for fun"," come sfogo.",[37,972,974],{"id":973},"sta-succedendo-adesso","Sta succedendo adesso",[11,976,977],{},"Pinecone, Weaviate, Chroma. Vector database dedicati, presentati come componente necessario di qualsiasi architettura AI.",[11,979,980,981,32],{},"Anche qui: non è che siano inutili. È che nella stragrande maggioranza dei casi ",[29,982,983],{},"non ne hai bisogno",[11,985,986],{},"Una ricerca ibrida full-text con BM25 + pgvector risolve il grosso — con il vantaggio di avere tutto nello stesso database, relazioni intatte, zero sincronizzazioni, zero componenti aggiuntivi da mantenere. Fino a circa mezzo milione di record la differenza di performance rispetto a un vector database dedicato è risibile. E la maggior parte dei progetti non arriverà mai a mezzo milione di record.",[11,988,989],{},"Il costo dell'infrastruttura esotica lo paghi sempre dopo, mai subito. E \"dopo\" coincide quasi sempre con il momento peggiore: trazione reale, investitori che guardano, utenti che si lamentano.",[11,991,992],{},[29,993,994],{},"La storia è ciclica. Solo i nomi cambiano.",[37,996,998],{"id":997},"il-mio-mantra","Il mio mantra",[107,1000,1001],{},[11,1002,1003],{},"Minimum diff, less moving parts.",[11,1005,1006,1007,1010,1011],{},"Nei progetti ho una regola che mi porto dietro da anni: ",[29,1008,1009],{},"minimum diff, less moving parts",". Ogni componente aggiuntivo è una dipendenza, una cosa che può rompersi e che ha side effects a volte impliciti. Una cosa che qualcuno\ndeve capire, mantenere, aggiornare. ",[29,1012,1013],{},"Il costo non è mai solo tecnico — è cognitivo, operativo, economico.",[11,1015,1016],{},"Scegliere la tecnologia più \"dritta\" che risolve il problema non è una scorciatoia. È il mestiere.",{"title":451,"searchDepth":452,"depth":452,"links":1018},[1019,1020,1021,1022,1023,1024],{"id":853,"depth":452,"text":854},{"id":887,"depth":452,"text":888},{"id":906,"depth":452,"text":907},{"id":922,"depth":452,"text":923},{"id":973,"depth":452,"text":974},{"id":997,"depth":452,"text":998},[464],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/la-storia-si-ripete.png","2026-03-30T10:00:00.000Z","Nel 2015 i graph database erano il futuro. Oggi uso Postgres per quasi tutto. Nel mezzo: MongoDB, ObjectId misti, e il solito conto arrivato dopo. Sta succedendo di nuovo con i vector database.",{},"/la-storia-si-ripete",{"title":835,"description":1028},"la-storia-si-ripete",[1034,1035,480,1036,831],"postgres","database","tech-debt","VEFCqWkv1Yjj6bCK7VDZSq71yRGNeyfN3gYqOWZux44",{"id":1039,"title":1040,"body":1041,"categories":1198,"coverImage":1200,"date":1201,"description":1202,"extension":468,"meta":1203,"navigation":470,"path":848,"seo":1204,"stem":1205,"sticky":474,"tags":1206,"__hash__":1210},"articles/il-cms-in-c-che-non-ho-mai-scritto.md","Il CMS in C che non ho mai scritto",{"type":8,"value":1042,"toc":1193},[1043,1048,1052,1058,1072,1078,1081,1086,1093,1096,1100,1107,1130,1133,1140,1143,1145,1149,1160,1166,1172,1177,1182,1185,1188],[11,1044,1045],{},[14,1046,1047],{},"Nel 2015 valevi quanto il linguaggio che usavi. Questa è la storia di come ho ignorato quella regola e cosa è successo dopo.",[37,1049,1051],{"id":1050},"la-scelta","La scelta",[11,1053,1054,1055,32],{},"Nel 2015 ho passato qualche giorno a considerare seriamente di ",[29,1056,1057],{},"scrivere un CMS da zero in C",[11,1059,1060,1061,1064,1065,1068,1069,32],{},"Non era follia pura (certo, ci si avvicinava eh). Volendo, avrei avuto le competenze per farlo. Il problema era un altro: nel mondo dev di quegli anni ",[29,1062,1063],{},"valevi quanto il linguaggio che usavi",".\nNella narrativa da ",[14,1066,1067],{},"street credibility"," del tempo, più il linguaggio aveva una curva di apprendimento alto e più eri forte. C, di certo, era rispettabilità. PHP o JavaScript roba da pivelli. ",[29,1070,1071],{},"WordPress non ne parliamo proprio",[11,1073,1074,1075,32],{},"Poi ho detto: ",[14,1076,1077],{},"naaaaaaaaaaaaah",[11,1079,1080],{},"Dovevo costruire una piattaforma per la vendita di fumetti digitali. Utenti, contenuti, pagamenti, file protetti da download. Da solo, con poco budget che volevo però destinato a fornire a me e il mio socio non-tech un posto in cui dormire\ne coprire le spese necessarie a portare i primi contratti. Deadline vita o morte: 6 mesi per partecipare a un investor day presentando non solo l'app ma già dei risultati contati per numero di utenti.",[11,1082,1083],{},[29,1084,1085],{},"Ho preso WordPress e l'ho piegato a quello che mi serviva.",[11,1087,1088,1089,1092],{},"Non perché fosse la scelta più figa. Ma perché ",[29,1090,1091],{},"conoscevo quella codebase a memoria",". Sapevo come si comportava sotto carico, dove tendeva a rompersi, come estenderla. E soprattutto sapevo dove guardare quando qualcosa andava storto alle 2 di notte — cosa che succede sempre, invariabilmente, al momento peggiore.",[11,1094,1095],{},"Un CMS in C avrei ancora finito di scriverlo adesso.",[37,1097,1099],{"id":1098},"quello-che-è-uscito-fuori","Quello che è uscito fuori",[11,1101,1102,1103,1106],{},"In sei mesi, team di sviluppo, UI, UX, DevOps composto da... ",[29,1104,1105],{},"soltanto me",":",[165,1108,1109,1112,1115,1118,1124,1127],{},[138,1110,1111],{},"Backend della piattaforma",[138,1113,1114],{},"API REST per l'app mobile",[138,1116,1117],{},"App iOS",[138,1119,1120,1121],{},"Sistema di cifratura a chiave asincrona per la protezione dei file, ",[29,1122,1123],{},"registrato SIAE",[138,1125,1126],{},"Infrastruttura su due macchine sincronizzate con load balancer, gestita con Ansible",[138,1128,1129],{},"HHVM per la compilazione jit di php, visto che certo PHP 8 non esisteva ancora",[11,1131,1132],{},"Il back office era \"gratis\", e il solito WordPress che tutti gli interni sapevano già usare. Praticamente zero onboarding: lo usava chiunque dovesse usarlo, senza aprire un ticket.",[11,1134,1135,1136,1139],{},"Prima settimana dal lancio: 9.000 signup. ",[29,1137,1138],{},"app del mese su App Store Italia",". 400k raccolti dagli investitori.",[1141,1142],"hr",{},[1141,1144],{},[37,1146,1148],{"id":1147},"il-punto","Il punto",[11,1150,1151,1152,1155,1156,1159],{},"C'è una differenza tra ",[29,1153,1154],{},"non conoscere le alternative"," e ",[29,1157,1158],{},"conoscerle tutte e scegliere quella che funziona"," nel contesto e coi vincoli reali.",[11,1161,1162,1163,32],{},"Il rischio non è \"devo imparare la sintassi\" o \"l'eleganza della soluzione\". È che ",[29,1164,1165],{},"non conosci ancora i failure mode",[11,1167,1168,1169,32],{},"È come scegliere tra andare in gara con una 500 che guidi da 10 anni — sai che la terza gratta un po', quanti newton applicare allo sterzo, come frena sul bagnato — oppure con un veicolo di ultima generazione che si pilota usando il ",[29,1170,1171],{},"pronzione",[11,1173,1174],{},[29,1175,1176],{},"Tu dirai: ma che è il pronzione?",[11,1178,1179],{},[29,1180,1181],{},"Esatto.",[11,1183,1184],{},"Ed è proprio questo il problema. Con lo stack nuovo stai debuggando nel buio alle 2 di notte qualcosa per cui non hai ancora un nome.",[11,1186,1187],{},"Il CMS in C sarebbe stato figo da raccontare ai meetup.",[11,1189,1190],{},[29,1191,1192],{},"I 9.000 signup erano meglio.",{"title":451,"searchDepth":452,"depth":452,"links":1194},[1195,1196,1197],{"id":1050,"depth":452,"text":1051},{"id":1098,"depth":452,"text":1099},{"id":1147,"depth":452,"text":1148},[464,1199],"Startup","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/la-500-che-vinceva.png","2026-03-28T10:00:00.000Z","Nel 2015 avrei potuto scrivere un CMS in C. Ho scelto WordPress. Sei mesi dopo avevo 9.000 signup, app del mese su App Store Italia e 400k raccolti dagli investitori. Team di sviluppo: io.",{},{"title":1040,"description":1202},"il-cms-in-c-che-non-ho-mai-scritto",[1207,1208,480,1209,831],"wordpress","startup","indie","Q99QWwKOb-D7xX75KyiaDlui2yrSzAfsnqC1ps5KQv0",{"id":1212,"title":1213,"body":1214,"categories":1362,"coverImage":1364,"date":1365,"description":1366,"extension":468,"meta":1367,"navigation":470,"path":1368,"seo":1369,"stem":1370,"sticky":474,"tags":1371,"__hash__":1378},"articles/aisa-assistente-vendite-ai.md","AISA: Ho creato l'assistente alle vendite AI che dialoga con i tuoi clienti e potenzia le conversioni",{"type":8,"value":1215,"toc":1354},[1216,1225,1231,1238,1242,1248,1251,1305,1309,1319,1322,1326,1329,1332,1337],[11,1217,1218],{},[14,1219,1220,1221,1224],{},"Nel mio percorso di imprenditore e consulente digitale, ho sempre cercato soluzioni in grado non solo di risolvere problemi, ma di anticiparli. Oggi vi presento il mio ultimo progetto, ",[29,1222,1223],{},"AISA (AI Sales Assistant)",", un passo avanti nell'evoluzione dell'interazione tra brand e cliente, nato per superare i limiti dei chatbot tradizionali.",[11,1226,1227,1228],{},"Se gestisci un e-commerce o un qualsiasi business con una presenza online, sai bene quanto sia cruciale l'assistenza clienti. Spesso, però, i chatbot tradizionali sono una fonte di frustrazione, incapaci di comprendere le reali esigenze dell'utente. ",[29,1229,1230],{},"La tecnologia dovrebbe essere un acceleratore, non un ostacolo.",[11,1232,1233,1234,1237],{},"È da questa consapevolezza che nasce AISA. Non si tratta dell'ennesimo chatbot, ma di un vero e proprio ",[29,1235,1236],{},"agente AI"," pensato per le vendite, capace di integrarsi nel tessuto digitale di qualsiasi azienda e di agire come un venditore esperto, sempre disponibile.",[37,1239,1241],{"id":1240},"cosa-rende-aisa-diverso","Cosa rende AISA diverso?",[11,1243,1244,1245,32],{},"AISA è stato progettato per essere il punto di contatto intelligente e proattivo con la tua clientela. Il suo obiettivo non è solo rispondere, ma ",[29,1246,1247],{},"vendere e assistere in modo proattivo",[11,1249,1250],{},"Ecco le sue funzionalità chiave:",[165,1252,1253,1262,1268,1285,1295],{},[138,1254,1255,1258,1259,32],{},[29,1256,1257],{},"Dialogo multicanale",": Risponde ai clienti sul tuo sito web, su una landing page, all'interno della tua app e persino tramite ",[29,1260,1261],{},"WhatsApp",[138,1263,1264,1267],{},[29,1265,1266],{},"Tone of Voice personalizzato",": AISA impara e adotta il tono di voce del tuo brand, per un'esperienza utente sempre coerente con la tua identità.",[138,1269,1270,1273,1274,1277,1278,1281,1282,32],{},[29,1271,1272],{},"Base di conoscenza flessibile",": La sua intelligenza si nutre delle informazioni che già possiedi. Supportiamo l'indicizzazione di ",[29,1275,1276],{},"sitemap XML",", il ",[29,1279,1280],{},"crawling del sito",", e l'analisi di ",[29,1283,1284],{},"PDF, testi e tracciati di prodotto",[138,1286,1287,1290,1291,1294],{},[29,1288,1289],{},"Widget di prodotto interattivi",": Quando consiglia un articolo, genera in automatico un ",[29,1292,1293],{},"widget"," che mostra immagine, prezzo, sconto e pulsante \"Aggiungi al carrello\", semplificando il percorso d'acquisto.",[138,1296,1297,1300,1301,1304],{},[29,1298,1299],{},"Integrazione \"Agentic\"",": Grazie alla sua capacità di ",[29,1302,1303],{},"invocare i servizi web del brand",", può aggiornare lo stato di un ordine o reperire informazioni specifiche su un cliente, agendo come un vero agente autonomo.",[37,1306,1308],{"id":1307},"più-di-un-chatbot-un-partner-per-la-crescita","Più di un chatbot, un partner per la crescita",[11,1310,1311,1312,1315,1316,32],{},"La differenza è sostanziale. Mentre un chatbot segue un flusso rigido, AISA offre risposte dinamiche, impara dalle interazioni e personalizza i consigli. I primi dati raccolti sono incredibilmente promettenti, con un ",[29,1313,1314],{},"aumento medio del tasso di conversione dell'8%"," e una ",[29,1317,1318],{},"riduzione del 32% delle richieste di assistenza manuale",[11,1320,1321],{},"È la soluzione ideale per chi vuole fare un salto di qualità nella gestione delle vendite online, trasformando l'assistenza clienti da centro di costo a motore di ricavi.",[37,1323,1325],{"id":1324},"conclusione-un-nuovo-standard-per-linterazione-online","Conclusione: un nuovo standard per l'interazione online",[11,1327,1328],{},"AISA rappresenta la mia visione di come l'intelligenza artificiale possa essere applicata in modo concreto e profittevole nel mondo del marketing e delle vendite. È uno strumento potente, pensato per chi, come me, crede che la tecnologia debba lavorare al nostro fianco per creare valore reale.",[11,1330,1331],{},"Sei pronto a scoprire come AISA può trasformare la tua interazione con i clienti e spingere le tue vendite?",[1333,1334,1336],"h3",{"id":1335},"vuoi-saperne-di-più","Vuoi saperne di più?",[11,1338,1339,1340,1347,1348,1353],{},"Visita la pagina ufficiale del progetto ",[29,1341,1342],{},[431,1343,1346],{"href":1344,"rel":1345},"https://www.autocust.it/sales-assistant-ai",[435],"AI Sales Assistant"," o contattami ",[431,1349,1352],{"href":1350,"rel":1351},"https://www.linkedin.com/in/enricodeleo",[435],"sul mio profilo LinkedIn"," per discutere di come integrare AISA nel tuo business.",{"title":451,"searchDepth":452,"depth":452,"links":1355},[1356,1357,1358],{"id":1240,"depth":452,"text":1241},{"id":1307,"depth":452,"text":1308},{"id":1324,"depth":452,"text":1325,"children":1359},[1360],{"id":1335,"depth":1361,"text":1336},3,[829,1363],"dev","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/aisa.png","2025-07-27T18:45:00.000Z","Vi presento AISA, il mio nuovo progetto: un assistente vendite basato su AI che trasforma l'interazione con i clienti, aumentando le conversioni e offrendo un'esperienza utente senza precedenti.",{},"/aisa-assistente-vendite-ai",{"title":1213,"description":1366},"aisa-assistente-vendite-ai",[1372,1373,1374,1375,1376,1377],"aisa","ai-sales-assistant","intelligenza-artificiale","marketing-automation","ecommerce","chatbot","nJceN4OmS8f3dobB-ukZzdhUbCaRXDBbFCKoZmQ_KS8",{"id":1380,"title":1381,"body":1382,"categories":1771,"coverImage":1774,"date":1775,"description":1776,"extension":468,"meta":1777,"navigation":470,"path":1778,"seo":1779,"stem":1780,"sticky":470,"tags":1781,"__hash__":1786},"articles/generare-sdk-javascript-waterline-con-aquasdk.md","AquaSDK: Genera SDK JavaScript in stile Waterline da specifiche OpenAPI",{"type":8,"value":1383,"toc":1761},[1384,1395,1399,1425,1429,1433,1496,1548,1552,1590,1594,1680,1684,1691,1702,1706,1725,1727,1732,1750,1757],[11,1385,1386,1387,1390,1391,1394],{},"Nel mondo dello sviluppo moderno, la capacità di ",[29,1388,1389],{},"integrare rapidamente API"," è tanto cruciale quanto frustrante. Quante ore abbiamo perso a scrivere manualmente client SDK pieni di boilerplate? È per risolvere questo problema che ho creato ",[29,1392,1393],{},"AquaSDK",", uno strumento open-source che genera automaticamente SDK JavaScript con sintassi fluida e intuitiva partendo da qualsiasi specifica OpenAPI.",[37,1396,1398],{"id":1397},"perché-automatizzare-la-generazione-di-sdk","Perché automatizzare la generazione di SDK?",[165,1400,1401,1407,1413,1419],{},[138,1402,1403,1406],{},[29,1404,1405],{},"⏱️ Riduzione del 70% del tempo di sviluppo"," per integrazioni API",[138,1408,1409,1412],{},[29,1410,1411],{},"🔒 Consistenza automatica"," tra documentazione OpenAPI e implementazione",[138,1414,1415,1418],{},[29,1416,1417],{},"🚀 Esperienza developer-friendly"," con sintassi simile a Waterline ORM",[138,1420,1421,1424],{},[29,1422,1423],{},"💡 Supporto nativo a Promise/async"," per codice asincrono pulito",[37,1426,1428],{"id":1427},"funzionalità-avanzate-per-sviluppatori","Funzionalità avanzate per sviluppatori",[1333,1430,1432],{"id":1431},"per-gli-integratori-api","Per gli Integratori API",[165,1434,1435,1482,1490],{},[138,1436,1437,1440,1443,1444],{},[29,1438,1439],{},"Sintassi a catena fluida",[1441,1442],"br",{},"\nInteragisci con le API come se utilizzassi un ORM:",[1445,1446,1450],"pre",{"className":1447,"code":1448,"language":1449,"meta":451,"style":451},"language-javascript shiki shiki-themes github-light github-dark","await api.utenti\n  .find({ ruolo: 'admin', iscrizione: { '>': '2024-01-01' } })\n  .limit(10)\n  .populate('ordini')\n  .execute();\n","javascript",[21,1451,1452,1460,1465,1470,1476],{"__ignoreMap":451},[1453,1454,1457],"span",{"class":1455,"line":1456},"line",1,[1453,1458,1459],{},"await api.utenti\n",[1453,1461,1462],{"class":1455,"line":452},[1453,1463,1464],{},"  .find({ ruolo: 'admin', iscrizione: { '>': '2024-01-01' } })\n",[1453,1466,1467],{"class":1455,"line":1361},[1453,1468,1469],{},"  .limit(10)\n",[1453,1471,1473],{"class":1455,"line":1472},4,[1453,1474,1475],{},"  .populate('ordini')\n",[1453,1477,1479],{"class":1455,"line":1478},5,[1453,1480,1481],{},"  .execute();\n",[138,1483,1484,1487,1489],{},[29,1485,1486],{},"Validazione automatica",[1441,1488],{},"\nControllo degli input basato sugli schemi OpenAPI prima delle chiamate API",[138,1491,1492,1495],{},[29,1493,1494],{},"Generazione completa dell'SDK","*\nAquaSDK non si limita a produrre semplici wrapper API. Ogni SDK generato include:",[1445,1497,1501],{"className":1498,"code":1499,"language":1500,"meta":451,"style":451},"language-bash shiki shiki-themes github-light github-dark","├── README.md # Documentazione automatica con esempi d'uso\n├── models/   # Modelli dati validati basati sugli schemi OpenAPI\n├── resources/ # Controller pronti per ogni endpoint API\n└── utils/     # Helper per query complesse\n","bash",[21,1502,1503,1517,1527,1537],{"__ignoreMap":451},[1453,1504,1505,1509,1513],{"class":1455,"line":1456},[1453,1506,1508],{"class":1507},"sScJk","├──",[1453,1510,1512],{"class":1511},"sZZnC"," README.md",[1453,1514,1516],{"class":1515},"sJ8bj"," # Documentazione automatica con esempi d'uso\n",[1453,1518,1519,1521,1524],{"class":1455,"line":452},[1453,1520,1508],{"class":1507},[1453,1522,1523],{"class":1511}," models/",[1453,1525,1526],{"class":1515},"   # Modelli dati validati basati sugli schemi OpenAPI\n",[1453,1528,1529,1531,1534],{"class":1455,"line":1361},[1453,1530,1508],{"class":1507},[1453,1532,1533],{"class":1511}," resources/",[1453,1535,1536],{"class":1515}," # Controller pronti per ogni endpoint API\n",[1453,1538,1539,1542,1545],{"class":1455,"line":1472},[1453,1540,1541],{"class":1507},"└──",[1453,1543,1544],{"class":1511}," utils/",[1453,1546,1547],{"class":1515},"     # Helper per query complesse\n",[1333,1549,1551],{"id":1550},"per-i-maintainer","Per i Maintainer",[165,1553,1554,1582],{},[138,1555,1556,1559],{},[29,1557,1558],{},"Configurazione plug-and-play",[1445,1560,1562],{"className":1498,"code":1561,"language":1500,"meta":451,"style":451},"generate-sdk ./swagger.json ./sdk 1.0.0 --verbose\n",[21,1563,1564],{"__ignoreMap":451},[1453,1565,1566,1569,1572,1575,1579],{"class":1455,"line":1456},[1453,1567,1568],{"class":1507},"generate-sdk",[1453,1570,1571],{"class":1511}," ./swagger.json",[1453,1573,1574],{"class":1511}," ./sdk",[1453,1576,1578],{"class":1577},"sj4cs"," 1.0.0",[1453,1580,1581],{"class":1577}," --verbose\n",[138,1583,1584,1587,1589],{},[29,1585,1586],{},"Integrazione CI/CD",[1441,1588],{},"\nRigenera automaticamente l'SDK ad ogni aggiornamento dell'API",[37,1591,1593],{"id":1592},"come-iniziare-in-3-passi","Come iniziare in 3 passi",[135,1595,1596,1618,1641],{},[138,1597,1598,1599],{},"Installa il pacchetto globale:",[1445,1600,1602],{"className":1498,"code":1601,"language":1500,"meta":451,"style":451},"npm install -g aquasdk\n",[21,1603,1604],{"__ignoreMap":451},[1453,1605,1606,1609,1612,1615],{"class":1455,"line":1456},[1453,1607,1608],{"class":1507},"npm",[1453,1610,1611],{"class":1511}," install",[1453,1613,1614],{"class":1577}," -g",[1453,1616,1617],{"class":1511}," aquasdk\n",[138,1619,1620,1621],{},"Genera il tuo SDK:",[1445,1622,1624],{"className":1498,"code":1623,"language":1500,"meta":451,"style":451},"generate-sdk ./api-spec.yaml ./sdk --version 1.0.0\n",[21,1625,1626],{"__ignoreMap":451},[1453,1627,1628,1630,1633,1635,1638],{"class":1455,"line":1456},[1453,1629,1568],{"class":1507},[1453,1631,1632],{"class":1511}," ./api-spec.yaml",[1453,1634,1574],{"class":1511},[1453,1636,1637],{"class":1577}," --version",[1453,1639,1640],{"class":1577}," 1.0.0\n",[138,1642,1643,1644],{},"Integra nel tuo progetto:",[1445,1645,1647],{"className":1447,"code":1646,"language":1449,"meta":451,"style":451},"import API from './sdk';\n\nconst api = new API({\n  baseUrl: 'https://api.azienda.com',\n  auth: { token: process.env.API_KEY }\n});\n",[21,1648,1649,1654,1659,1664,1669,1674],{"__ignoreMap":451},[1453,1650,1651],{"class":1455,"line":1456},[1453,1652,1653],{},"import API from './sdk';\n",[1453,1655,1656],{"class":1455,"line":452},[1453,1657,1658],{"emptyLinePlaceholder":470},"\n",[1453,1660,1661],{"class":1455,"line":1361},[1453,1662,1663],{},"const api = new API({\n",[1453,1665,1666],{"class":1455,"line":1472},[1453,1667,1668],{},"  baseUrl: 'https://api.azienda.com',\n",[1453,1670,1671],{"class":1455,"line":1478},[1453,1672,1673],{},"  auth: { token: process.env.API_KEY }\n",[1453,1675,1677],{"class":1455,"line":1676},6,[1453,1678,1679],{},"});\n",[37,1681,1683],{"id":1682},"perché-open-source","Perché open-source?",[11,1685,1686,1687,1690],{},"AquaSDK è rilasciato sotto licenza ",[29,1688,1689],{},"GPL-3.0"," perché credo che:",[165,1692,1693,1696,1699],{},[138,1694,1695],{},"Gli strumenti fondamentali per lo sviluppo debbano essere accessibili a tutti",[138,1697,1698],{},"La collaborazione comunitaria produce soluzioni migliori",[138,1700,1701],{},"La trasparenza genera fiducia",[37,1703,1705],{"id":1704},"prossimi-sviluppi","Prossimi sviluppi",[165,1707,1710,1719],{"className":1708},[1709],"contains-task-list",[138,1711,1714,1718],{"className":1712},[1713],"task-list-item",[1715,1716],"input",{"disabled":470,"type":1717},"checkbox"," Generazione automatica di documentazione SDK",[138,1720,1722,1724],{"className":1721},[1713],[1715,1723],{"disabled":470,"type":1717}," Supporto Typescript",[1141,1726],{},[11,1728,1729],{},[29,1730,1731],{},"Vuoi provare AquaSDK o contribuire al progetto?",[165,1733,1734,1742],{},[138,1735,1736,1737],{},"🐙 GitHub: ",[431,1738,1741],{"href":1739,"rel":1740},"https://github.com/enricodeleo/aquasdk",[435],"github.com/enricodeleo/aquasdk",[138,1743,1744,1745],{},"📦 npm: ",[431,1746,1749],{"href":1747,"rel":1748},"https://www.npmjs.com/package/aquasdk",[435],"npmjs.com/package/aquasdk",[11,1751,1752,1753,32],{},"Per integrazioni enterprise o supporto personalizzato, ",[431,1754,1756],{"href":1755},"mailto:hello@enricodeleo.com","contattami direttamente",[1758,1759,1760],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":451,"searchDepth":452,"depth":452,"links":1762},[1763,1764,1768,1769,1770],{"id":1397,"depth":452,"text":1398},{"id":1427,"depth":452,"text":1428,"children":1765},[1766,1767],{"id":1431,"depth":1361,"text":1432},{"id":1550,"depth":1361,"text":1551},{"id":1592,"depth":452,"text":1593},{"id":1682,"depth":452,"text":1683},{"id":1704,"depth":452,"text":1705},[1363,1772,1773],"tools","api","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/aquasdk-cover.jpg","2025-03-11T17:00:00.000Z","Come trasformare qualsiasi specifica OpenAPI in un SDK JavaScript intuitivo con sintassi simile a Waterline ORM: la soluzione per integrazioni API veloci e senza boilerplate",{},"/generare-sdk-javascript-waterline-con-aquasdk",{"title":1381,"description":1776},"generare-sdk-javascript-waterline-con-aquasdk",[1449,1782,1783,1784,1785],"openapi","sdk","rest","developer-tools","77iS9QYVT1OJ4NuE9EjRe48k0fsby1X1WLULVndW9Zg",{"id":1788,"title":1789,"body":1790,"categories":1968,"coverImage":1969,"date":1970,"description":1971,"extension":468,"meta":1972,"navigation":470,"path":1973,"seo":1974,"stem":1975,"sticky":474,"tags":1976,"__hash__":1979},"articles/git-ingest-trasforma-repository-github-in-testo-per-llm.md","GitIngest: repository GitHub in testo per sfruttare al massimo gli LLM nell'analisi, debug e documentazione del codice",{"type":8,"value":1791,"toc":1959},[1792,1797,1800,1807,1811,1814,1828,1832,1835,1838,1858,1862,1865,1879,1882,1886,1920,1924,1927,1938,1942,1945,1948,1952],[11,1793,1794],{},[29,1795,1796],{},"Come sfruttare GitIngest per migliorare l’assistenza al codice con i modelli di linguaggio (LLM)",[11,1798,1799],{},"Negli ultimi anni, i modelli di linguaggio di grandi dimensioni (LLM) come GPT si sono rivelati strumenti potentissimi per supportare sviluppatori e team di programmazione. Dalla generazione automatica di codice all’analisi e al debug, gli LLM possono analizzare grandi quantità di testo e fornire soluzioni intelligenti. Tuttavia, per sfruttare al meglio queste potenzialità, è essenziale fornire al modello il contesto giusto, come una rappresentazione completa e leggibile del codice sorgente.",[11,1801,1802,1803,1806],{},"Ed è qui che entra in gioco ",[29,1804,1805],{},"GitIngest",": uno strumento progettato per semplificare il processo di integrazione dei repository GitHub nei modelli di linguaggio.",[1333,1808,1810],{"id":1809},"cosè-gitingest","Cos’è GitIngest?",[11,1812,1813],{},"GitIngest è un servizio che consente di trasformare qualsiasi repository GitHub in una rappresentazione testuale del suo contenuto, rendendolo immediatamente fruibile per applicazioni che utilizzano gli LLM. Con un semplice cambio nell’URL di un repository GitHub, puoi ottenere una versione testuale del codice sorgente che può essere elaborata da modelli di intelligenza artificiale per:",[165,1815,1816,1819,1822,1825],{},[138,1817,1818],{},"Generare documentazione tecnica.",[138,1820,1821],{},"Analizzare il funzionamento di un progetto.",[138,1823,1824],{},"Suggerire miglioramenti o refactoring.",[138,1826,1827],{},"Risolvere bug complessi.",[1333,1829,1831],{"id":1830},"perché-trasformare-il-codice-in-testo-è-utile-per-gli-llm","Perché trasformare il codice in testo è utile per gli LLM?",[11,1833,1834],{},"I modelli di linguaggio lavorano su dati testuali: il loro “punto di forza” è comprendere e generare testo in linguaggio naturale o in formati specifici (come il codice). Tuttavia, la struttura complessa di un repository – con file, directory e formati diversi – può rappresentare un ostacolo per un modello di intelligenza artificiale.",[11,1836,1837],{},"GitIngest rende il codice e la struttura di un progetto immediatamente leggibili e utilizzabili, eliminando la necessità di preparare manualmente i dati. Questo è particolarmente utile per:",[165,1839,1840,1846,1852],{},[138,1841,1842,1845],{},[29,1843,1844],{},"Addestramento personalizzato",": vuoi creare un chatbot che capisca il tuo software? Fornisci il repository al modello tramite GitIngest per insegnargli le specificità del tuo progetto.",[138,1847,1848,1851],{},[29,1849,1850],{},"Debug assistito",": trasforma il codice in un formato comprensibile per chiedere suggerimenti direttamente al modello.",[138,1853,1854,1857],{},[29,1855,1856],{},"Analisi di grandi codebase",": grazie alla trasformazione testuale, anche i progetti più complessi diventano accessibili agli LLM per analisi approfondite.",[1333,1859,1861],{"id":1860},"come-funziona-gitingest","Come funziona GitIngest?",[11,1863,1864],{},"Utilizzare GitIngest è semplicissimo. Basta sostituire \"github.com\" con \"gitingest.com\" nell'URL di un repository. Ad esempio:",[165,1866,1867,1873],{},[138,1868,1869,1870],{},"URL originale: ",[21,1871,1872],{},"https://github.com/utente/progetto",[138,1874,1875,1876],{},"URL GitIngest: ",[21,1877,1878],{},"https://gitingest.com/utente/progetto",[11,1880,1881],{},"Accedendo a questo nuovo link, otterrai un file testuale che rappresenta il codice e la struttura del repository. Puoi anche configurare il processo per includere o escludere specifici file o directory, in modo da focalizzarti solo sulle parti più rilevanti.",[1333,1883,1885],{"id":1884},"casi-duso-di-gitingest-con-gli-llm","Casi d’uso di GitIngest con gli LLM",[135,1887,1888,1896,1904,1912],{},[138,1889,1890,1893,1895],{},[29,1891,1892],{},"Documentazione automatizzata",[1441,1894],{},"\nGli LLM possono generare descrizioni dettagliate di funzioni, metodi e interi progetti se hanno accesso al codice sorgente. Con GitIngest, puoi fornire loro una base completa per creare documentazione leggibile e aggiornata.",[138,1897,1898,1901,1903],{},[29,1899,1900],{},"Supporto alla manutenzione del codice",[1441,1902],{},"\nIn team distribuiti o su progetti legacy, gli LLM possono analizzare il codice estratto con GitIngest per suggerire miglioramenti o identificare vulnerabilità.",[138,1905,1906,1909,1911],{},[29,1907,1908],{},"Onboarding di nuovi sviluppatori",[1441,1910],{},"\nFornire ai nuovi membri del team un riassunto chiaro di un progetto è spesso complesso. Con GitIngest e un LLM, puoi generare sintesi, diagrammi di flusso o spiegazioni passo-passo direttamente dal codice.",[138,1913,1914,1917,1919],{},[29,1915,1916],{},"Debug e troubleshooting più rapidi",[1441,1918],{},"\nPassare il codice a un LLM consente di chiedere assistenza diretta su errori o inefficienze. Puoi anche sottoporre porzioni del repository per ottenere suggerimenti mirati.",[1333,1921,1923],{"id":1922},"un-esempio-pratico","Un esempio pratico",[11,1925,1926],{},"Immagina di lavorare su un progetto open source complesso, come un’implementazione di un framework web. Puoi utilizzare GitIngest per trasformare l’intero repository in testo, quindi caricarlo in un LLM per:",[165,1928,1929,1932,1935],{},[138,1930,1931],{},"Identificare parti di codice ridondanti.",[138,1933,1934],{},"Suggerire ottimizzazioni di performance.",[138,1936,1937],{},"Proporre nuove funzionalità basandosi sulle linee esistenti.",[1333,1939,1941],{"id":1940},"perché-scegliere-gitingest","Perché scegliere GitIngest?",[11,1943,1944],{},"GitIngest è stato sviluppato per offrire flessibilità e velocità. Grazie alla possibilità di personalizzare il processo di estrazione, è uno strumento ideale sia per singoli sviluppatori che per team tecnici che vogliono potenziare il proprio workflow.",[11,1946,1947],{},"Inoltre, GitIngest è supportato da una comunità attiva su Discord, dove gli utenti possono scambiarsi consigli e best practice.",[1333,1949,1951],{"id":1950},"provalo-subito","Provalo subito!",[11,1953,1954,1955,32],{},"Se vuoi sfruttare al massimo i modelli di linguaggio per la gestione del tuo codice, GitIngest è la soluzione ideale. Scopri di più e inizia oggi stesso visitando ",[431,1956,1805],{"href":1957,"rel":1958},"https://gitingest.com/",[435],{"title":451,"searchDepth":452,"depth":452,"links":1960},[1961,1962,1963,1964,1965,1966,1967],{"id":1809,"depth":1361,"text":1810},{"id":1830,"depth":1361,"text":1831},{"id":1860,"depth":1361,"text":1861},{"id":1884,"depth":1361,"text":1885},{"id":1922,"depth":1361,"text":1923},{"id":1940,"depth":1361,"text":1941},{"id":1950,"depth":1361,"text":1951},[1363],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/gitingest.jpg","2025-01-06T22:12:00.000Z","Scopri come GitIngest trasforma i repository GitHub in testo leggibile per modelli di linguaggio (LLM), facilitando analisi, debug e generazione automatica di documentazione del codice.",{},"/git-ingest-trasforma-repository-github-in-testo-per-llm",{"title":1789,"description":1971},"git-ingest-trasforma-repository-github-in-testo-per-llm",[820,1977,1363,1978],"LLM","coding","_kVARkdSb0JdI9EhcpD1MtiFh3o62XLwnXwSmlLh4Rg",{"id":1981,"title":1982,"body":1983,"categories":2182,"coverImage":2183,"date":2184,"description":2185,"extension":468,"meta":2186,"navigation":470,"path":2187,"seo":2188,"stem":2189,"sticky":470,"tags":2190,"__hash__":2196},"articles/otto-anni-dopo-dallarchitettura-wordpress-al-boom-dei-siti-headless.md","Otto anni dopo: dall’architettura WordPress al boom dei siti headless",{"type":8,"value":1984,"toc":2174},[1985,1996,2006,2010,2026,2030,2050,2053,2057,2062,2082,2085,2089,2092,2144,2148,2155,2166],[11,1986,1987,1988,1995],{},"Nel 2016, al Meetup WordPress di Roma, parlavo di ",[431,1989,1992],{"href":1990,"rel":1991},"https://blog.enricodeleo.com/modern-gentlemens-wordpress-un-nuovo-approccio-al-web",[435],[29,1993,1994],{},"“Modern Gentlemen’s WordPress”",", un approccio metodico e strutturato per creare applicazioni WordPress mantenibili e performanti. Guardando indietro, quel talk fu una riflessione sullo stato dell’arte e una guida per affrontare il caos di plugin, temi pesanti e customizzazione spesso inefficiente.",[11,1997,1998,1999,1155,2002,2005],{},"Oggi, a distanza di otto anni, il panorama dello sviluppo web è radicalmente cambiato. Le parole chiave del 2024 sono ",[29,2000,2001],{},"headless CMS",[29,2003,2004],{},"frontend moderni",", con framework come Nuxt3 che dominano la scena. In questa retrospettiva, voglio analizzare cosa è cambiato e come WordPress continui a essere rilevante, ma in modi completamente nuovi.",[37,2007,2009],{"id":2008},"il-passaggio-allheadless-cms","Il passaggio all'headless CMS",[11,2011,2012,2013,2015,2016,173,2019,2022,2023,32],{},"Se nel 2016 WordPress era prevalentemente utilizzato come piattaforma monolitica, oggi si sta affermando sempre più come ",[29,2014,2001],{},". Questo approccio separa completamente il backend dal frontend: WordPress si occupa di gestire contenuti e API, mentre il frontend viene sviluppato con tecnologie come ",[29,2017,2018],{},"Nuxt3",[29,2020,2021],{},"React",", o ",[29,2024,2025],{},"Next.js",[1333,2027,2029],{"id":2028},"perché-scegliere-unarchitettura-headless","Perché scegliere un'architettura headless?",[165,2031,2032,2038,2044],{},[138,2033,2034,2037],{},[29,2035,2036],{},"Performance superiore",": Caricamenti più rapidi grazie a frontend ottimizzati per il rendering statico o server-side.",[138,2039,2040,2043],{},[29,2041,2042],{},"Flessibilità",": Il backend WordPress può alimentare diverse piattaforme (sito web, app mobile, chatbot).",[138,2045,2046,2049],{},[29,2047,2048],{},"Esperienza utente avanzata",": Un frontend moderno permette di implementare interfacce altamente interattive e dinamiche.",[11,2051,2052],{},"WordPress, con la sua API REST nativa e GraphQL tramite plugin come WPGraphQL, si adatta perfettamente a questo paradigma. Il tuo contenuto rimane centralizzato, ma puoi costruire esperienze utente al passo con le aspettative del 2024.",[37,2054,2056],{"id":2055},"perché-nuxt3-è-il-frontend-ideale","Perché Nuxt3 è il frontend ideale",[11,2058,2059,2061],{},[29,2060,2018],{},", basato su Vue 3, si è affermato come una delle soluzioni più robuste per lo sviluppo di frontend headless. Rispetto al Nuxt2 del 2016, questa nuova versione offre:",[165,2063,2064,2070,2076],{},[138,2065,2066,2069],{},[29,2067,2068],{},"Prestazioni migliorate",", grazie a Vue 3 e Vite per il bundling.",[138,2071,2072,2075],{},[29,2073,2074],{},"Supporto nativo per il rendering universale",", fondamentale per SEO e performance.",[138,2077,2078,2081],{},[29,2079,2080],{},"Modularità e scalabilità",", con un ecosistema che facilita l’integrazione con CMS, autenticazione e servizi cloud.",[11,2083,2084],{},"Con Nuxt3, puoi costruire siti che combinano il meglio del rendering statico (SSG) e server-side (SSR). Questo lo rende perfetto per e-commerce, blog e applicazioni web avanzate.",[37,2086,2088],{"id":2087},"come-coniugare-wordpress-e-nuxt3","Come coniugare WordPress e Nuxt3",[11,2090,2091],{},"Ecco una roadmap per implementare un sito headless con WordPress e Nuxt3:",[135,2093,2094,2111,2127],{},[138,2095,2096,1106,2099],{},[29,2097,2098],{},"Preparare WordPress come CMS headless",[165,2100,2101,2108],{},[138,2102,2103,2104,2107],{},"Utilizza ",[29,2105,2106],{},"WPGraphQL"," o la REST API per esporre i dati.",[138,2109,2110],{},"Ottimizza WordPress per funzionare come API server (disabilita temi e plugin non necessari).",[138,2112,2113,1106,2116],{},[29,2114,2115],{},"Costruire il frontend con Nuxt3",[165,2117,2118,2121,2124],{},[138,2119,2120],{},"Configura un’app Nuxt3 per consumare l’API di WordPress.",[138,2122,2123],{},"Implementa il rendering universale per ottenere un’ottima indicizzazione e prestazioni.",[138,2125,2126],{},"Integra strumenti moderni per immagini (Nuxt Image) e analytics.",[138,2128,2129,1106,2132],{},[29,2130,2131],{},"Deployment",[165,2133,2134],{},[138,2135,2136,2137,173,2140,2143],{},"Sfrutta piattaforme moderne come ",[29,2138,2139],{},"Vercel",[29,2141,2142],{},"Netlify",", o container su cloud per una distribuzione rapida.",[37,2145,2147],{"id":2146},"conclusioni","Conclusioni",[11,2149,2150,2151,2154],{},"Dal 2016 a oggi, la filosofia “Modern Gentlemen” ha trovato una sua naturale evoluzione. Oggi non si tratta solo di costruire applicazioni ben strutturate, ma di ",[29,2152,2153],{},"connettere i migliori strumenti disponibili"," per offrire esperienze utente eccezionali. Nuxt3 e l’approccio headless sono un esempio lampante di come possiamo adattarci a un web sempre più dinamico.",[11,2156,2157,2158,2165],{},"Se vuoi approfondire questo approccio, ti invito a esplorare il mio boilerplate open source ",[29,2159,2160],{},[431,2161,2164],{"href":2162,"rel":2163},"https://github.com/enricodeleo/wpacked",[435],"wpacked",", che rimane una solida base per chi vuole iniziare a lavorare con WordPress in maniera moderna.",[11,2167,2168,2169,2173],{},"Hai provato a creare un sito headless con WordPress e Nuxt3? Parliamone nei commenti o scrivimi ",[431,2170,2172],{"href":1350,"rel":2171},[435],"su LinkedIn",". Sarebbe interessante confrontarci sulle sfide e sulle opportunità che questa architettura porta nel 2024.",{"title":451,"searchDepth":452,"depth":452,"links":2175},[2176,2179,2180,2181],{"id":2008,"depth":452,"text":2009,"children":2177},[2178],{"id":2028,"depth":1361,"text":2029},{"id":2055,"depth":452,"text":2056},{"id":2087,"depth":452,"text":2088},{"id":2146,"depth":452,"text":2147},[1363],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/otto-anni-dopo-dallarchitettura-wordpress-al-boom-dei-siti-headles.jpg","2024-12-11T12:00:00.000Z","Una retrospettiva sull'evoluzione delle applicazioni WordPress dal 2016 al 2024 e la rivoluzione dei siti headless con Nuxt3.",{},"/otto-anni-dopo-dallarchitettura-wordpress-al-boom-dei-siti-headless",{"title":1982,"description":2185},"otto-anni-dopo-dallarchitettura-wordpress-al-boom-dei-siti-headless",[1207,2191,2192,2193,2194,2195],"nuxt3","headless","vue3","frontend","cms","tzHRnbi4BAHubpIahh1b0Mmoc57Fdi72dWvb8ayO_fo",{"id":2198,"title":2199,"body":2200,"categories":2372,"coverImage":2373,"date":2374,"description":2375,"extension":468,"meta":2376,"navigation":470,"path":2377,"seo":2378,"stem":2379,"sticky":470,"tags":2380,"__hash__":2385},"articles/woocommerce-agos-payment-gateway-integra-pagamenti-rateali-nel-tuo-e-commerce.md","WooCommerce Agos Payment Gateway: Integra pagamenti rateali nel tuo e-commerce",{"type":8,"value":2201,"toc":2359},[2202,2209,2213,2216,2242,2246,2249,2253,2279,2283,2303,2307,2310,2314,2318,2321,2332,2336,2339,2347,2349,2352],[11,2203,2204,2205,2208],{},"Nel panorama dell'e-commerce italiano, offrire opzioni di pagamento flessibili è diventato un fattore critico per il successo. I clienti cercano sempre più spesso la possibilità di dilazionare i pagamenti, specialmente per acquisti di importo significativo. È con questa consapevolezza che ho sviluppato il ",[29,2206,2207],{},"WooCommerce Agos Payment Gateway",", un plugin che integra perfettamente i finanziamenti Agos nel tuo store WooCommerce.",[37,2210,2212],{"id":2211},"perché-integrare-pagamenti-rateali-nel-tuo-e-commerce","Perché integrare pagamenti rateali nel tuo e-commerce?",[11,2214,2215],{},"L'implementazione di pagamenti rateali può avere un impatto significativo sul tuo business:",[165,2217,2218,2224,2230,2236],{},[138,2219,2220,2223],{},[29,2221,2222],{},"Aumento del valore medio ordine",": I clienti sono più propensi ad effettuare acquisti di importo maggiore quando possono dilazionare il pagamento",[138,2225,2226,2229],{},[29,2227,2228],{},"Riduzione dell'abbandono del carrello",": Offrire opzioni di pagamento flessibili può essere decisivo per completare l'acquisto",[138,2231,2232,2235],{},[29,2233,2234],{},"Competitività",": Allinearsi alle aspettative dei clienti che cercano sempre più spesso opzioni di finanziamento",[138,2237,2238,2241],{},[29,2239,2240],{},"Professionalità",": Integrazione con un partner affidabile come Agos aumenta la credibilità del tuo store",[37,2243,2245],{"id":2244},"caratteristiche-chiave-del-plugin","Caratteristiche chiave del plugin",[11,2247,2248],{},"Il WooCommerce Agos Payment Gateway è stato progettato pensando sia agli sviluppatori che ai merchant, offrendo:",[1333,2250,2252],{"id":2251},"per-i-merchant","Per i Merchant",[165,2254,2255,2261,2267,2273],{},[138,2256,2257,2260],{},[29,2258,2259],{},"Configurazione intuitiva",": Setup rapido con codici utente e convenzione forniti da Agos",[138,2262,2263,2266],{},[29,2264,2265],{},"Tabelle finanziarie personalizzabili",": Definisci tassi di interesse e importi min/max per diverse opzioni di finanziamento",[138,2268,2269,2272],{},[29,2270,2271],{},"Targeting preciso",": Applica le opzioni di finanziamento a specifici prodotti, categorie o brand",[138,2274,2275,2278],{},[29,2276,2277],{},"Testing sicuro",": Modalità test per verificare l'integrazione prima del go-live",[1333,2280,2282],{"id":2281},"per-gli-sviluppatori","Per gli Sviluppatori",[165,2284,2285,2291,2297],{},[138,2286,2287,2290],{},[29,2288,2289],{},"API robuste",": Integrazione completa con le API Agos",[138,2292,2293,2296],{},[29,2294,2295],{},"Debug avanzato",": Sistema di logging dettagliato per troubleshooting efficace",[138,2298,2299,2302],{},[29,2300,2301],{},"Codice pulito",": Sviluppato seguendo le best practice WordPress",[37,2304,2306],{"id":2305},"configurazione-e-personalizzazione","Configurazione e personalizzazione",[11,2308,2309],{},"L'implementazione del gateway Agos è stata progettata per essere il più flessibile possibile. Ad esempio, permette di definire condizioni precise per l'applicabilità dei finanziamenti definendo tabelle finanziarie e loro applicazione per prodotto, categoria, brand. Questo garantisce che le opzioni di pagamento rateale siano disponibili solo quando appropriato.",[37,2311,2313],{"id":2312},"casi-duso-reali","Casi d'uso reali",[1333,2315,2317],{"id":2316},"e-commerce-di-elettronica","E-commerce di Elettronica",[11,2319,2320],{},"Un negozio di elettronica ha implementato il plugin offrendo:",[165,2322,2323,2326,2329],{},[138,2324,2325],{},"Finanziamenti a tasso zero per acquisti sopra i 1000€",[138,2327,2328],{},"Tabelle finanziarie specifiche per brand premium",[138,2330,2331],{},"Risultato: +25% di conversione su ordini di alto valore",[37,2333,2335],{"id":2334},"prezzi-e-supporto","Prezzi e supporto",[11,2337,2338],{},"Il plugin è disponibile con diversi piani di sottoscrizione per adattarsi alle tue esigenze e include sempre:",[165,2340,2341,2344],{},[138,2342,2343],{},"Supporto tecnico dedicato",[138,2345,2346],{},"Aggiornamenti continui",[37,2348,2147],{"id":2146},[11,2350,2351],{},"In un mercato e-commerce sempre più competitivo, offrire opzioni di pagamento flessibili non è più un optional. Il WooCommerce Agos Payment Gateway ti permette di implementare questa funzionalità in modo professionale e personalizzato, aiutandoti a convertire più visitatori in clienti.",[11,2353,2354,2355,2358],{},"Se vuoi saperne di più o sei interessato ad implementare il gateway Agos nel tuo store, ",[431,2356,2357],{"href":1755},"contattami"," per una consulenza personalizzata.",{"title":451,"searchDepth":452,"depth":452,"links":2360},[2361,2362,2366,2367,2370,2371],{"id":2211,"depth":452,"text":2212},{"id":2244,"depth":452,"text":2245,"children":2363},[2364,2365],{"id":2251,"depth":1361,"text":2252},{"id":2281,"depth":1361,"text":2282},{"id":2305,"depth":452,"text":2306},{"id":2312,"depth":452,"text":2313,"children":2368},[2369],{"id":2316,"depth":1361,"text":2317},{"id":2334,"depth":452,"text":2335},{"id":2146,"depth":452,"text":2147},[1363,1376],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/agos-woocommerce.jpg","2024-12-01T09:00:00.000Z","Come integrare pagamenti rateali Agos nel tuo store WooCommerce: una soluzione completa per aumentare le conversioni offrendo finanziamenti flessibili ai tuoi clienti",{},"/woocommerce-agos-payment-gateway-integra-pagamenti-rateali-nel-tuo-e-commerce",{"title":2199,"description":2375},"woocommerce-agos-payment-gateway-integra-pagamenti-rateali-nel-tuo-e-commerce",[1207,2381,2382,1376,2383,2384],"woocommerce","payments","agos","fintech","nfmyWGhltsf306fn6a-cjemJrlLsUU1yNTsLTtu_GOU",{"id":2387,"title":2388,"body":2389,"categories":2686,"coverImage":2687,"date":2688,"description":2689,"extension":468,"meta":2690,"navigation":470,"path":2691,"seo":2692,"stem":2693,"sticky":474,"tags":2694,"__hash__":2698},"articles/cambusa.md","Scopri Cambusa: il nuovo web framework Bun developer-friendly e performante",{"type":8,"value":2390,"toc":2670},[2391,2398,2402,2409,2412,2419,2422,2429,2436,2441,2465,2472,2479,2483,2512,2516,2532,2536,2566,2578,2584,2587,2613,2619,2622,2648,2652,2655,2659,2662,2667],[11,2392,2393,2394,2397],{},"Nel panorama in continua evoluzione dello sviluppo web, avere gli strumenti giusti è fondamentale per costruire applicazioni robuste, scalabili e manutenibili. Oggi siamo entusiasti di presentare ",[29,2395,2396],{},"Cambusa",", un nuovo framework open source basato su Bun che promette di semplificare il processo di sviluppo, offrendo una struttura modulare e potente per creare applicazioni moderne.",[37,2399,2401],{"id":2400},"perché-cambusa","Perché Cambusa?",[1333,2403,2405,2406],{"id":2404},"_1-facilità-di-utilizzo","1. ",[29,2407,2408],{},"Facilità di Utilizzo",[11,2410,2411],{},"Cambusa è progettato per essere intuitivo e accessibile sia ai principianti che agli sviluppatori esperti. Con una curva di apprendimento rapida, puoi iniziare a costruire applicazioni complesse in pochissimo tempo.",[1333,2413,2415,2416],{"id":2414},"_2-struttura-modulabile","2. ",[29,2417,2418],{},"Struttura Modulabile",[11,2420,2421],{},"Grazie alla sua architettura modulare, Cambusa ti permette di organizzare il codice in modo chiaro e gestibile. Separando logica di business, routing, e gestione del database, mantenere e scalare il tuo progetto diventa un gioco da ragazzi.",[1333,2423,2425,2426],{"id":2424},"_3-gestione-avanzata-del-database","3. ",[29,2427,2428],{},"Gestione Avanzata del Database",[11,2430,2431,2432,2435],{},"Cambusa integra ",[29,2433,2434],{},"TypeORM",", uno dei più potenti Object-Relational Mapping (ORM) per Bun, offrendo supporto per diversi database come PostgreSQL, MySQL, MariaDB, SQLite, MongoDB, Oracle e MS SQL. Questo ti permette di interagire con il database in modo semplice e sicuro.",[2437,2438,2440],"h4",{"id":2439},"funzionalità-principali","Funzionalità Principali:",[165,2442,2443,2449,2455],{},[138,2444,2445,2448],{},[29,2446,2447],{},"Migrations Automatizzate:"," Gestisci le modifiche al tuo schema di database con facilità.",[138,2450,2451,2454],{},[29,2452,2453],{},"Definizione dei Modelli:"," Definisci i tuoi modelli utilizzando un formato intuitivo basato su TypeORM.",[138,2456,2457,2464],{},[29,2458,2459,2460,2463],{},"Sincronizzazione del Database (",[21,2461,2462],{},"db:sync","):"," Sincronizza automaticamente i tuoi modelli con il database durante lo sviluppo.",[1333,2466,2468,2469],{"id":2467},"_4-cli-potente","4. ",[29,2470,2471],{},"CLI Potente",[11,2473,2474,2475,2478],{},"Cambusa include una ",[29,2476,2477],{},"Command-Line Interface (CLI)"," versatile che semplifica molte operazioni comuni, come la generazione di controller, modelli, e la gestione delle migrazioni. Con comandi intuitivi, puoi velocizzare il tuo flusso di lavoro e concentrarti sulla scrittura del codice.",[2437,2480,2482],{"id":2481},"esempi-di-utilizzo-della-cli","Esempi di Utilizzo della CLI:",[165,2484,2485],{},[138,2486,2487,2490],{},[29,2488,2489],{},"Generare un Nuovo Controller:",[1445,2491,2493],{"className":1498,"code":2492,"language":1500,"meta":451,"style":451},"bun run bin/cambusa.js controllers:generate users/create\n",[21,2494,2495],{"__ignoreMap":451},[1453,2496,2497,2500,2503,2506,2509],{"class":1455,"line":1456},[1453,2498,2499],{"class":1507},"bun",[1453,2501,2502],{"class":1511}," run",[1453,2504,2505],{"class":1511}," bin/cambusa.js",[1453,2507,2508],{"class":1511}," controllers:generate",[1453,2510,2511],{"class":1511}," users/create\n",[2437,2513,2515],{"id":2514},"avviare-il-server","Avviare il Server:",[1445,2517,2519],{"className":1498,"code":2518,"language":1500,"meta":451,"style":451},"bun run bin/cambusa.js lift\n",[21,2520,2521],{"__ignoreMap":451},[1453,2522,2523,2525,2527,2529],{"class":1455,"line":1456},[1453,2524,2499],{"class":1507},[1453,2526,2502],{"class":1511},[1453,2528,2505],{"class":1511},[1453,2530,2531],{"class":1511}," lift\n",[2437,2533,2535],{"id":2534},"gestire-le-migrazioni","Gestire le Migrazioni:",[1445,2537,2539],{"className":1498,"code":2538,"language":1500,"meta":451,"style":451},"bun run bin/cambusa.js migrations:generate AddUserTable\nbun run bin/cambusa.js migrations:run\n",[21,2540,2541,2555],{"__ignoreMap":451},[1453,2542,2543,2545,2547,2549,2552],{"class":1455,"line":1456},[1453,2544,2499],{"class":1507},[1453,2546,2502],{"class":1511},[1453,2548,2505],{"class":1511},[1453,2550,2551],{"class":1511}," migrations:generate",[1453,2553,2554],{"class":1511}," AddUserTable\n",[1453,2556,2557,2559,2561,2563],{"class":1455,"line":452},[1453,2558,2499],{"class":1507},[1453,2560,2502],{"class":1511},[1453,2562,2505],{"class":1511},[1453,2564,2565],{"class":1511}," migrations:run\n",[11,2567,2568,2570,2571,386,2574,2577],{},[29,2569,2396],{}," è costruito su ",[29,2572,2573],{},"Bun",[29,2575,2576],{},"ElysiaJS",", due tecnologie all'avanguardia che insieme offrono prestazioni eccezionali e una produttività senza pari nello sviluppo di applicazioni web.",[1333,2579,2581],{"id":2580},"bun-il-nuovo-motore-javascript-ad-alte-prestazioni",[29,2582,2583],{},"Bun: Il Nuovo Motore JavaScript ad Alte Prestazioni",[11,2585,2586],{},"Bun è un runtime JavaScript moderno che si distingue per la sua velocità e efficienza. Sviluppato per essere compatibile con l'ecosistema Node.js, Bun offre numerosi vantaggi:",[165,2588,2589,2595,2601,2607],{},[138,2590,2591,2594],{},[29,2592,2593],{},"Velocità Superiore:"," Bun è ottimizzato per eseguire il codice JavaScript più rapidamente rispetto a Node.js, riducendo significativamente i tempi di esecuzione e migliorando le prestazioni complessive delle applicazioni.",[138,2596,2597,2600],{},[29,2598,2599],{},"Bundling Integrato:"," Con Bun, non è necessario utilizzare strumenti di bundling esterni come Webpack o Rollup. Bun integra un bundler ad alte prestazioni, semplificando il processo di compilazione e riducendo la complessità del progetto.",[138,2602,2603,2606],{},[29,2604,2605],{},"Gestione dei Pacchetti Efficiente:"," Bun utilizza il proprio gestore di pacchetti, che è più veloce e leggero rispetto a npm o Yarn, permettendo di installare le dipendenze in pochi secondi.",[138,2608,2609,2612],{},[29,2610,2611],{},"Supporto Migliorato per TypeScript:"," Bun offre un supporto nativo e ottimizzato per TypeScript, facilitando lo sviluppo di applicazioni tipizzate e riducendo gli errori a runtime.",[1333,2614,2616],{"id":2615},"elysiajs-un-framework-web-rapido-e-minimalista",[29,2617,2618],{},"ElysiaJS: Un Framework Web Rapido e Minimalista",[11,2620,2621],{},"ElysiaJS è un framework web leggero e altamente performante progettato per sfruttare al massimo le potenzialità di Bun. I suoi principali vantaggi includono:",[165,2623,2624,2630,2636,2642],{},[138,2625,2626,2629],{},[29,2627,2628],{},"Semplicità e Minimalismo:"," ElysiaJS si concentra sulla fornitura di un'API semplice e intuitiva, permettendo agli sviluppatori di creare applicazioni web rapidamente senza dover gestire configurazioni complesse.",[138,2631,2632,2635],{},[29,2633,2634],{},"Alte Prestazioni:"," Ottimizzato per funzionare perfettamente con Bun, ElysiaJS garantisce tempi di risposta rapidi e una gestione efficiente delle richieste, ideale per applicazioni ad alta intensità di traffico.",[138,2637,2638,2641],{},[29,2639,2640],{},"Flessibilità:"," ElysiaJS è modulare e facilmente estensibile, consentendo di aggiungere solo le funzionalità necessarie e mantenere il progetto leggero e manutenibile.",[138,2643,2644,2647],{},[29,2645,2646],{},"Supporto per le Migrazioni:"," Integrandosi perfettamente con Bun, ElysiaJS facilita la gestione delle migrazioni del database, assicurando che le modifiche allo schema siano applicate in modo sicuro e coerente.",[1333,2649,2651],{"id":2650},"community-e-contributi-aperto","Community e Contributi Aperto",[11,2653,2654],{},"Essendo un progetto open source, Cambusa è aperto a contributi da parte della community.",[1333,2656,2658],{"id":2657},"conclusione","Conclusione",[11,2660,2661],{},"Cambusa è qui per rivoluzionare il modo in cui sviluppi applicazioni web con Bun. Con la sua struttura modulare, potente gestione del database e una CLI intuitiva, offre tutto ciò di cui hai bisogno per costruire applicazioni moderne e scalabili. Non vediamo l'ora di vedere cosa realizzerai con Cambusa!",[11,2663,2664],{},[29,2665,2666],{},"Inizia oggi stesso e contribuisci a rendere Cambusa ancora più straordinario!",[1758,2668,2669],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":451,"searchDepth":452,"depth":452,"links":2671},[2672],{"id":2400,"depth":452,"text":2401,"children":2673},[2674,2676,2678,2680,2682,2683,2684,2685],{"id":2404,"depth":1361,"text":2675},"1. Facilità di Utilizzo",{"id":2414,"depth":1361,"text":2677},"2. Struttura Modulabile",{"id":2424,"depth":1361,"text":2679},"3. Gestione Avanzata del Database",{"id":2467,"depth":1361,"text":2681},"4. CLI Potente",{"id":2580,"depth":1361,"text":2583},{"id":2615,"depth":1361,"text":2618},{"id":2650,"depth":1361,"text":2651},{"id":2657,"depth":1361,"text":2658},[1363],null,"2024-09-21T00:02:51.000Z","Un Moderno Framework Bun Open-Source per lo Sviluppo Web Efficiente",{},"/cambusa",{"title":2388,"description":2689},"cambusa",[2695,2499,2696,1773,2697],"backend","nodejs","framework","_3oHDANcdozwUQlSS3bQU5v6I7twlrO_-U2L-umMYtg",{"id":2700,"title":2701,"body":2702,"categories":2859,"coverImage":2860,"date":2861,"description":2862,"extension":468,"meta":2863,"navigation":470,"path":2864,"seo":2865,"stem":2866,"sticky":474,"tags":2867,"__hash__":2871},"articles/migrare-da-magento-2-a-woocommerce-la-sfida-delle-password.md","Migrare da Magento 2 a WooCommerce: La Sfida delle Password",{"type":8,"value":2703,"toc":2849},[2704,2707,2711,2714,2718,2721,2725,2728,2732,2735,2739,2742,2746,2752,2761,2765,2768,2771,2775,2782,2801,2804,2808,2814,2821,2825,2832,2835,2838,2840],[11,2705,2706],{},"Mi sono imbattuto in una sfida interessante: creare un plugin per WordPress che permettesse una migrazione senza soluzione di continuità degli utenti da Magento 2 a WooCommerce. Sembra semplice, vero? Lo pensavo anche io, prima di rendermi conto che mi trovavo di fronte a un terreno inesplorato, senza una libreria, un plugin o una guida a cui fare riferimento. Lasciatemi spiegare.",[37,2708,2710],{"id":2709},"woocommerce-vs-magento-perché-scegliere-woocommerce","WooCommerce vs Magento: perché scegliere WooCommerce?",[11,2712,2713],{},"Quando si tratta di scegliere una piattaforma di e-commerce, WooCommerce e Magento sono due dei nomi più popolari che vengono in mente. Entrambi offrono un'ampia gamma di funzionalità che possono aiutare a costruire un negozio online robusto. Tuttavia, ci sono diverse ragioni per cui potresti voler scegliere WooCommerce su Magento. Ecco alcuni dei vantaggi principali:",[2437,2715,2717],{"id":2716},"facilità-duso","Facilità d'uso",[11,2719,2720],{},"WooCommerce è noto per la sua facilità d'uso. È un plugin di WordPress, il che significa che si integra perfettamente con qualsiasi sito WordPress esistente. Se hai già familiarità con WordPress, allora imparare a usare WooCommerce sarà un gioco da ragazzi. Magento, d'altra parte, ha una curva di apprendimento più ripida e può essere più complicato da configurare e gestire.",[2437,2722,2724],{"id":2723},"flessibilità-e-personalizzazione","Flessibilità e personalizzazione",[11,2726,2727],{},"WooCommerce offre una grande flessibilità quando si tratta di personalizzare il tuo negozio. Ci sono migliaia di temi e plugin disponibili che ti permettono di aggiungere nuove funzionalità e cambiare l'aspetto del tuo negozio con facilità. Magento offre anche molte opzioni di personalizzazione, ma può richiedere più competenze tecniche per apportare modifiche significative.",[2437,2729,2731],{"id":2730},"costi","Costi",[11,2733,2734],{},"WooCommerce è un plugin gratuito, il che lo rende una scelta eccellente per le piccole imprese o per chi è alle prime armi con l'e-commerce. Anche se ci sono costi associati all'hosting del tuo sito e all'acquisto di temi o plugin premium, questi costi sono generalmente più bassi rispetto a quelli di Magento. Magento offre una versione gratuita (Magento Open Source), ma per accedere a tutte le funzionalità e al supporto dovrai optare per estensioni premium o a Magento Commerce, ad un costo significativo.",[2437,2736,2738],{"id":2737},"supporto-della-comunità","Supporto della comunità",[11,2740,2741],{},"Sia WooCommerce che Magento hanno comunità di sviluppatori attive, ma la comunità di WordPress (e quindi di WooCommerce) è molto più grande. Questo significa che è più facile trovare risorse, tutorial e soluzioni a problemi comuni con WooCommerce.",[37,2743,2745],{"id":2744},"migrazione","Migrazione",[11,2747,2748,2749,32],{},"Mentre Magento può essere una scelta eccellente per le grandi imprese che necessitano di una soluzione di e-commerce robusta, WooCommerce offre una soluzione più accessibile e user-friendly che è ",[29,2750,2751],{},"perfetta per le piccole imprese",[11,2753,2754,2755,2760],{},"Per questi motivi, talvolta le imprese di piccole dimensioni che hanno adottato Magento inizialmente, si trovano in difficoltà con costi e rigidità difficilmente sostenibili ed optano per un'attività di ",[29,2756,2757],{},[14,2758,2759],{},"replatforming"," per proseguire le vendite su WooCommerce.",[1333,2762,2764],{"id":2763},"i-vantaggi-di-una-transizione-fluida","I Vantaggi di una transizione fluida",[11,2766,2767],{},"Una delle principali preoccupazioni quando si migra da una piattaforma all'altra è la frizione percepita dall'utente finale, che potrebbe incidere negativamente sulle conversioni.",[11,2769,2770],{},"Se mantenere la struttura generale del sito ecommerce familiare (o addirittura identica) ed il catalogo intatto è ragionevolmente semplice, non lo è quando si tratta di autenticazione.",[1333,2772,2774],{"id":2773},"magento-2-e-wordpress-autenticazione-a-confronto","Magento 2 e WordPress: autenticazione a confronto",[11,2776,2777,2778,2781],{},"WordPress utilizza una tecnologia chiamata ",[21,2779,2780],{},"phpass"," per l'hashing delle password. Si tratta di un framework di hashing delle password di dominio pubblico portatile per l'uso in applicazioni PHP.",[11,2783,2784,2785,2788,2789,2794,2795,2800],{},"Magento 2, d'altra parte, utilizza un algoritmo di hashing delle password più complesso. Da un lato infatti utilizza ",[21,2786,2787],{},"sodium"," (incluso in PHP dalla versione 7.2), dall'altro utilizza una tecnica chiamata ",[29,2790,2791],{},[14,2792,2793],{},"hash stretching"," per aumentare la sicurezza delle password hashate. Questo comporta l'hashing della password più volte (per di più con l'aggiunta di una stringa casuale detta ",[29,2796,2797],{},[14,2798,2799],{},"salt"," che ne aumenta ulteriormente la complessità).\nQuesto approccio rende il processo di hashing estremamente intensivo dal punto di vista computazionale, il che può aiutare a rallentare un attaccante che sta cercando di indovinare la password.",[11,2802,2803],{},"Questa sostanziale differenza nel processo di hashing delle password le rende incompatibili quando importate direttamente da Magento a WordPress e viceversa.",[1333,2805,2807],{"id":2806},"approcci-comuni","Approcci comuni",[11,2809,2810,2811,32],{},"La soluzione più comune è quella di forzare il reset delle password degli utenti. Questo può essere un processo fastidioso per gli utenti e ",[29,2812,2813],{},"può portare a una perdita di traffico e di fiducia",[11,2815,2816,2817,2820],{},"Un'altra soluzione diffusa è quella di introdurre un meccanismo che verifichi la correttezza della password attraverso un login via API verso la vecchia piattaforma. Ciò però comporta la ",[29,2818,2819],{},"necessità di mantenere attiva ed accessibile a tempo indefinito la vecchia piattaforma",". Per di più in caso di down di quest'ultima il meccanismo fallirà.",[37,2822,2824],{"id":2823},"la-mia-soluzione-insegnare-a-wordpress-come-comprendere-le-password-di-magento","La mia soluzione: insegnare a WordPress come comprendere le password di Magento",[11,2826,2827,2828,2831],{},"Dopo aver letto miriadi di articoli fuorvianti, ho deciso di sporcarmi le mani e di analizzare la classe ",[21,2829,2830],{},"Encryptor"," di Magento 2 per comprenderne a pieno l'algoritmo (e sì, avevo dapprima provato a\nchiedere a chatGPT4, con esito fallimentare). Da questo studio è scaturito un plugin WordPress leggerissimo che consente a WordPress di interpretare gli hash generati su Magento.",[11,2833,2834],{},"Il plugin si aggancia alla funzione di autenticazione di WordPress e verifica che l'hash importato dal database Magento 2 corrisponda alla password inserita, per poi eventualmente procedere\na creare un nuovo hash nativo di WordPress.",[11,2836,2837],{},"Gli utenti possono dunque effettuare il login su WordPress con le loro password Magento 2 esistenti, rendendo la transizione trasparente.",[37,2839,465],{"id":478},[11,2841,2842,2843,2848],{},"In piena filosofia open source, e per contribuire ad ambedue le community ho deciso di rilasciare questo plugin sotto licenza GPL2 sia sul repository dei plugin di WordPresss che\nsu ",[431,2844,2847],{"href":2845,"rel":2846},"https://github.com/enricodeleo/wp-password-migration-magento/",[435],"GitHub"," per eventuali contribuzioni da parte di altri dev.",{"title":451,"searchDepth":452,"depth":452,"links":2850},[2851,2852,2857,2858],{"id":2709,"depth":452,"text":2710},{"id":2744,"depth":452,"text":2745,"children":2853},[2854,2855,2856],{"id":2763,"depth":1361,"text":2764},{"id":2773,"depth":1361,"text":2774},{"id":2806,"depth":1361,"text":2807},{"id":2823,"depth":452,"text":2824},{"id":478,"depth":452,"text":465},[464],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/migration.jpeg","2023-06-07T12:27:00.000Z","La vera sfida nel rendere fluida la migrazione tra Magento e WooCommerce (WordPress). Un viaggio nell'algoritmo di hashing delle password di Magento 2 e come ho risolto questo problema.",{},"/migrare-da-magento-2-a-woocommerce-la-sfida-delle-password",{"title":2701,"description":2862},"migrare-da-magento-2-a-woocommerce-la-sfida-delle-password",[2868,2869,1207,2870],"sviluppo","magento","plugin","XMglEILjloRo_HKiYFSPtAoSKKAZ5VdYivsFrsy_yFQ",{"id":2873,"title":2874,"body":2875,"categories":3008,"coverImage":3009,"date":3010,"description":3011,"extension":468,"meta":3012,"navigation":470,"path":3013,"seo":3014,"stem":3015,"sticky":474,"tags":3016,"__hash__":3025},"articles/le-scelte-devops-che-influenzeranno-il-tuo-prossimo-progetto.md","Le scelte DevOps che influenzeranno il tuo prossimo progetto",{"type":8,"value":2876,"toc":2998},[2877,2884,2888,2891,2894,2898,2901,2905,2908,2912,2915,2919,2922,2929,2943,2950,2961,2965,2968,2975,2979,2982,2985,2988,2992,2995],[11,2878,2879,2880,2883],{},"Negli ultimi anni, il ",[29,2881,2882],{},"DevOps"," è diventato uno standard di settore per lo sviluppo software. Questa pratica unisce lo\nsviluppo (Dev) e le operazioni IT (Ops), permettendo alle aziende di sviluppare e distribuire software più velocemente ed\nefficientemente. Oggi vorrei fare un riassunto delle ultime tendenze nel DevOps che possono influenzare le performance del tuo prossimo progetto.",[37,2885,2887],{"id":2886},"automazione-su-larga-scala","Automazione su larga scala",[11,2889,2890],{},"L'automazione è sempre stata al cuore del DevOps, ma ora stiamo vedendo un'espansione dell'automazione a quasi ogni aspetto\ndel ciclo di vita dello sviluppo del software.",[11,2892,2893],{},"Questo include l'automazione dei test, del provisioning dell'infrastruttura, della gestione delle configurazioni, del monitoraggio\ne dell'analisi. L'obiettivo è ridurre l'errore umano, migliorare l'efficienza e permettere ai team di concentrarsi su compiti più\nimportanti.",[37,2895,2897],{"id":2896},"cloud-native-e-kubernetes","Cloud-native e Kubernetes",[11,2899,2900],{},"Le applicazioni cloud-native stanno diventando la norma, grazie alla loro scalabilità, resilienza e flessibilità. Kubernetes,\nuna piattaforma open-source per l'orchestrazione dei container, sta diventando lo standard de facto per la gestione delle applicazioni\ncloud-native. Questa tendenza può aiutare a gestire in modo efficiente i workload complessi e a sfruttare al meglio il cloud.",[37,2902,2904],{"id":2903},"devsecops","DevSecOps",[11,2906,2907],{},"La sicurezza sta diventando sempre più integrata nel ciclo di vita dello sviluppo delle applicazioni. DevSecOps, l'incorporamento\ndelle pratiche di sicurezza nel processo DevOps, sta diventando una necessità piuttosto che un'opzione. Questo significa che la\nsicurezza non è più solo un pensiero successivo, ma un aspetto centrale di tutto il processo di sviluppo e distribuzione. Security-by-design è il mantra di questi anni.",[37,2909,2911],{"id":2910},"intelligenza-artificiale-e-machine-learning-nel-devops","Intelligenza Artificiale e Machine Learning nel DevOps",[11,2913,2914],{},"L'intelligenza artificiale e il machine learning stanno iniziando a giocare un ruolo importante nel DevOps. Possono aiutare a\nmigliorare l'efficienza operativa attraverso l'automazione e a fornire approfondimenti utili attraverso l'analisi dei dati.\nInoltre, possono aiutare a prevedere problemi prima che accadano, migliorando la resilienza e la disponibilità del sistema.",[37,2916,2918],{"id":2917},"microservizi-e-serverless","Microservizi e Serverless",[11,2920,2921],{},"Sia i microservizi che l'architettura serverless rappresentano due approcci importanti per lo sviluppo e il deployment di applicazioni.",[11,2923,2924,2925,2928],{},"I ",[29,2926,2927],{},"microservizi"," sono un modello di architettura del software che suddivide un'applicazione in una serie di servizi più piccoli e gestibili. Questi servizi funzionano in modo indipendente l'uno dall'altro e comunicano attraverso un protocollo comune come ad esempio le richieste http oppure pub/sub su una coda condivisa. Ogni microservizio può essere sviluppato, implementato e scalato in modo indipendente, il che offre una serie di vantaggi:",[165,2930,2931,2934,2937,2940],{},[138,2932,2933],{},"Scalabilità: Poiché ogni servizio può essere scalato in modo indipendente, le risorse possono essere allocate in modo più efficiente.",[138,2935,2936],{},"Flessibilità di sviluppo: Diversi team possono lavorare su diversi servizi in parallelo.",[138,2938,2939],{},"Isolamento: Se un servizio fallisce, non influisce sugli altri servizi.",[138,2941,2942],{},"Velocità di implementazione: I servizi più piccoli possono essere sviluppati e implementati più rapidamente.",[11,2944,2945,2946,2949],{},"Il computing ",[29,2947,2948],{},"serverless"," è un modello di esecuzione di codice in cui il provider di cloud gestisce l'infrastruttura del server. Gli sviluppatori scrivono solo il codice dell'applicazione, e il provider del cloud si occupa dell'allocazione delle risorse, della scalabilità e della manutenzione del server. I vantaggi del serverless includono:",[165,2951,2952,2955,2958],{},[138,2953,2954],{},"Nessuna gestione dei server: gli sviluppatori possono concentrarsi sulla scrittura del codice invece che sulla gestione dell'infrastruttura.",[138,2956,2957],{},"Scalabilità automatica: l'infrastruttura può scalare automaticamente in base al carico di lavoro.",[138,2959,2960],{},"Costi basati sull'utilizzo: si paga solo per il tempo durante il quale il codice è in esecuzione.",[37,2962,2964],{"id":2963},"observability","Observability",[11,2966,2967],{},"L'osservabilità, che comprende il monitoring, la tracciabilità e i log, sta diventando sempre più importante. L'osservabilità non\nriguarda solo la raccolta di dati, ma anche la capacità di interpretarli e agire su di essi. Questa tendenza può aiutare a identificare\ne risolvere i problemi più rapidamente, migliorare la performance e ottimizzare l'esperienza dell'utente.",[11,2969,2970],{},[2971,2972],"img",{"alt":2973,"src":2974},"Coding","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/pexels-mikhail-fesenko-9553905.jpg",[37,2976,2978],{"id":2977},"infrastruttura-come-codice-iac-e-lascesa-del-gitops","Infrastruttura come Codice (IaC) e l'ascesa del GitOps",[11,2980,2981],{},"L'IaC è una pratica in cui l'infrastruttura di rete viene gestita tramite codice, allo stesso modo in cui il software viene gestito.\nQuesto consente un'automazione, un monitoraggio e una manutenzione più efficaci dell'infrastruttura. Questa tendenza può portare a\nun'implementazione più rapida, una maggiore efficienza e una migliore replicabilità.",[11,2983,2984],{},"Nella maggior parte dei casi vorrai implementare questo approccio fruendo di Git, il sistema di controllo di versione\npiù diffuso, come singola fonte di verità per la gestione dell'infrastruttura IT.",[11,2986,2987],{},"Con il GitOps, ogni cambiamento all'infrastruttura o alla configurazione dell'applicazione viene implementato tramite un commit Git.\nQuesto permette di registrare facilmente ogni cambiamento, migliorando la visibilità e la responsabilità. Inoltre, grazie alla sua\nnatura dichiarativa, il GitOps facilita la gestione delle configurazioni complesse e la risoluzione dei problemi.",[37,2989,2991],{"id":2990},"levoluzione-verso-il-noops","L'evoluzione verso il NoOps",[11,2993,2994],{},"Il NoOps (No Operations) è un concetto che sta guadagnando sempre più popolarità. L'idea è quella di automatizzare e astrarre le\noperazioni IT al punto che non siano più necessarie.",[11,2996,2997],{},"Con l'ascesa del cloud computing e dei servizi serverless, il NoOps sta diventando sempre più una realtà. Tuttavia, questo non\nsignifica che il ruolo delle operazioni IT stia scomparendo. Piuttosto, sta evolvendo verso ruoli più strategici, come l'architettura\ndel cloud e la gestione della sicurezza.",{"title":451,"searchDepth":452,"depth":452,"links":2999},[3000,3001,3002,3003,3004,3005,3006,3007],{"id":2886,"depth":452,"text":2887},{"id":2896,"depth":452,"text":2897},{"id":2903,"depth":452,"text":2904},{"id":2910,"depth":452,"text":2911},{"id":2917,"depth":452,"text":2918},{"id":2963,"depth":452,"text":2964},{"id":2977,"depth":452,"text":2978},{"id":2990,"depth":452,"text":2991},[464],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/pexels-realtoughcandycom-11035393.jpg","2023-05-29T00:02:51.000Z","DevOps unisce sviluppo e operazioni, accelerando il rilascio di software, migliorando la qualità e promuovendo la collaborazione interfunzionale.",{},"/le-scelte-devops-che-influenzeranno-il-tuo-prossimo-progetto",{"title":2874,"description":3011},"le-scelte-devops-che-influenzeranno-il-tuo-prossimo-progetto",[3017,2868,3018,3019,3020,3021,3022,3023,2948,3024,2904],"devops","architettura","tendenze","docker","kubernates","container","iass","git","o6OpcIUUFIBff3KkCClydithSw_ydcjN6Ur2BZAXuZE",{"id":3027,"title":3028,"body":3029,"categories":3214,"coverImage":3215,"date":3216,"description":3217,"extension":468,"meta":3218,"navigation":470,"path":3219,"seo":3220,"stem":3221,"sticky":470,"tags":3222,"__hash__":3228},"articles/vue-js-e-il-framework-front-end-piu-hot-del-momento.md","Vue.js è il framework front-end più hot del momento",{"type":8,"value":3030,"toc":3204},[3031,3036,3041,3044,3050,3056,3059,3063,3070,3076,3082,3086,3089,3096,3103,3107,3114,3121,3130,3136,3140,3143,3149,3158,3161,3165,3171,3174,3192,3196],[11,3032,3033],{},[14,3034,3035],{},"In questo post vorrei parlare delle caratteristiche che mi hanno fatto innamorare di Vue.js e che a mio avviso sono alla base dell'incredibile tasso di crescita di questo framework su GitHub e non solo.",[11,3037,3038],{},[14,3039,3040],{},"Questo non significa che strumenti come React ed Angular (2+) non siano a mio avviso validi, ma semplicemente che trovo che Vue.js sia la soluzione più bilanciata per iniziare un nuovo progetto.",[11,3042,3043],{},"La scelta di un framework o di una libreria per lo sviluppo di un nuovo progetto (ad esempio una web app) non è solo una scelta personale.",[11,3045,3046,3049],{},[29,3047,3048],{},"L'adozione di una libreria piuttosto che di un'altra potrebbe avvantaggiare o svantaggiare nel prosieguo dello sviluppo"," ed incidere nei tempi, costi di manutenzione così come le performances dell'applicazione stessa nel tempo man mano che il progetto cresce.",[11,3051,3052,3053,32],{},"Da professionista del settore ho lavorato con tutti i maggiori framework frontend in circolazione (Angularjs, Angular, React, Vue.js, Ember), eppure ",[29,3054,3055],{},"sono finito per prediligere Vue su tutti",[11,3057,3058],{},"Per non ridurre l'argomento del post ad una narrazione da fanboy, vorrei affrontare qui punto per punto le caratteristiche che ho trovato più interessanti e che motivano questa mia predilezione.",[37,3060,3062],{"id":3061},"popolarità-️","Popolarità ?️",[11,3064,3065,3066,3069],{},"Osservando i trend di crescita in termini di star su GitHub notiamo una ",[29,3067,3068],{},"ascesa vertiginosa"," del gradimento verso \"il nuovo arrivato\" rispetto ai più longevi Angular e React.",[11,3071,3072,3075],{},[29,3073,3074],{},"Vue ha addirittura superato React"," alla fine del 2018.",[11,3077,3078],{},[2971,3079],{"alt":3080,"src":3081},"Trend di crescita di Vue.js su GitHub","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/image.png",[37,3083,3085],{"id":3084},"caratteristiche","Caratteristiche",[1333,3087,2042],{"id":3088},"flessibilità",[11,3090,3091,3092,3095],{},"Forse la cosa che apprezzo di più: Vue è pensato per essere adottabile ",[14,3093,3094],{},"progressivamente",". Questo significa che posso decidere di volta in volta se utilizzarlo come una semplice libreria per arricchire una sola porzione di una pagina web, con un footprint bassissimo (= peso aggiuntivo dovuto all'introduzione della libreria) oppure come un framework completo e dotato di strumenti robusti.",[11,3097,3098,3099,3102],{},"Vue infatti è suddiviso in moduli perfettamente progettati ed oliati per lavorare fra loro, ma ",[29,3100,3101],{},"completamente opzionali",". Questo mo consente di selezionare solo ciò di cui ho realmente bisogno e non appesantire la struttura dell'applicazione con moduli inutilizzati.",[1333,3104,3106],{"id":3105},"stabilità","Stabilità",[11,3108,3109,3110,3113],{},"Vue.js è un ",[29,3111,3112],{},"framework stabile",". Con questo non intendo dire che non crasha, ma che la sua sintassi è fatta per rimanere stabile nel tempo.",[11,3115,3116,3117,3120],{},"Se hai sviluppato software che abbia una certa importanza business (o se hai intenzione di farlo) converrai con me che ",[29,3118,3119],{},"è fondamentale poter contare su uno strumento che, se aggiornato nel tempo, non richiede la riscrittura delle funzionalità sviluppate"," ad ogni aggiornamento delle dipendenze (chi ha detto Angular?).",[11,3122,3123,3124,3129],{},"Ti basti pensare che al rilascio della versione 2 del framework ",[431,3125,3128],{"href":3126,"rel":3127},"https://vuejs.org/v2/guide/migration.html",[435],"il 90% delle api sono rimaste invariate",", garantendo un processo di migrazione quasi totalmente indolore.",[11,3131,3132,3133,32],{},"In contesti business questo significa ",[29,3134,3135],{},"meno costi e tempi più brevi nella manutenzione dell'applicazione",[1333,3137,3139],{"id":3138},"developer-experience","Developer Experience",[11,3141,3142],{},"Si parla sempre di User Experience, ma chi pensa a noi sviluppatori? Ecco, Vue.js lo fa.",[11,3144,3145,3146,32],{},"Gli sviluppatori come me amano Vue.js non solo per la sua tecnologia, ma anche perché è ",[29,3147,3148],{},"disegnato per rendere la nostra vita più semplice possibile",[11,3150,3151,3152,3157],{},"Oltre a strumenti comodi come la CLI o l'",[431,3153,3156],{"href":3154,"rel":3155},"https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd",[435],"estensione DevTools"," di una efficacia e semplicità d'uso disarmanti, possiamo contare su una documentazione ufficiale completa e veramente ben fatta.",[11,3159,3160],{},"La struttura stessa del framework consente una curva di apprendimento davvero molto bassa e perfetta anche per i newbie che si approcciano per la prima volta allo sviluppo di una applicazione.",[37,3162,3164],{"id":3163},"curioso-di-iniziare-ad-utilizzare-vuejs","Curioso di iniziare ad utilizzare Vue.js? ?",[11,3166,3167,3168],{},"Il web è pieno di tutorial e documentazione in merito (specialmente in inglese e cinese). Nonostante questo ho voluto creare un piccolo ",[29,3169,3170],{},"testo interamente in italiano che possa aiutare a muovere i primi passi.",[11,3172,3173],{},"Il testo illustra i principi del framework da un punto di vista operativo, accompagnando ogni elemento con esempi pratici e mini-progetti.",[11,3175,3176,3177,3184,3185,32],{},"Il libro è ",[29,3178,3179],{},[431,3180,3183],{"href":3181,"rel":3182},"https://amzn.to/30T952A",[435],"disponibile su Amazon in versione Kindle"," oppure ",[431,3186,3189],{"href":3187,"rel":3188},"https://amzn.to/3839ulN",[435],[29,3190,3191],{},"in versione cartacea",[37,3193,3195],{"id":3194},"dubbiopinioni","Dubbi/Opinioni?",[11,3197,3198,3199,32],{},"Parliamone nei commenti o contattami ",[431,3200,3203],{"href":3201,"rel":3202},"https://www.facebook.com/therealenricodeleo",[435],"sulla mia pagina Facebook",{"title":451,"searchDepth":452,"depth":452,"links":3205},[3206,3207,3212,3213],{"id":3061,"depth":452,"text":3062},{"id":3084,"depth":452,"text":3085,"children":3208},[3209,3210,3211],{"id":3088,"depth":1361,"text":2042},{"id":3105,"depth":1361,"text":3106},{"id":3138,"depth":1361,"text":3139},{"id":3163,"depth":452,"text":3164},{"id":3194,"depth":452,"text":3195},[1363],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/pov-thumb.jpg","2020-01-26T13:09:09.000Z","Vue è il framework frontend con il tasso d'adozione più alto tra gli sviluppatori, e per ottime ragioni.",{},"/vue-js-e-il-framework-front-end-piu-hot-del-momento",{"title":3028,"description":3217},"vue-js-e-il-framework-front-end-piu-hot-del-momento",[3223,2194,1449,3224,3225,21,3226,3227],"vue","es6","development","react","angular","50xkfcsY2lGCAjAHsR6yYxtqw4ZBkLo8DpveLDx6vL4",{"id":3230,"title":3231,"body":3232,"categories":3472,"coverImage":3473,"date":3474,"description":3475,"extension":468,"meta":3476,"navigation":470,"path":3477,"seo":3478,"stem":3479,"sticky":470,"tags":3480,"__hash__":3485},"articles/i-10-migliori-plugin-visual-studio-code-per-qualsiasi-front-end-developer.md","Visual Studio Code: i 10 migliori plugin per qualsiasi front-end developer",{"type":8,"value":3233,"toc":3460},[3234,3241,3248,3251,3255,3262,3268,3280,3284,3290,3296,3299,3303,3309,3315,3318,3322,3328,3334,3337,3341,3347,3353,3361,3365,3371,3377,3380,3384,3390,3395,3398,3402,3408,3419,3423,3429,3435,3441,3445,3451,3457],[11,3235,3236,3237,3240],{},"Tutti amiamo Visual Studio Code: l'",[29,3238,3239],{},"editor gratuito e moderno"," sviluppato da Microsoft pensato per scrivere, ottimizzare e debuggare applicazioni web e cloud.",[11,3242,3243,3244,3247],{},"Visual Studio Code è disponibile su tutte le piattaforme (Windows, MacOS, Linux) ed è ",[14,3245,3246],{},"estendibile"," grazie all'ausilio di plugins, che ne aumentano le capacità introducendo funzionalità e comportamenti.",[11,3249,3250],{},"Al di là di casi specifici, a seguire quelli che secondo me sono i plugin imprescindibili per poter vivere bene quando si sviluppano webapp frontend.",[37,3252,3254],{"id":3253},"live-server","Live Server",[11,3256,3257],{},[431,3258,3261],{"href":3259,"rel":3260},"https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer",[435],"https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome",[11,3263,3264],{},[2971,3265],{"alt":3266,"src":3267},"Explorer Window Control","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/vscode-live-server-explorer-menu-demo-1.gif",[11,3269,3270,3271,3276,3277,32],{},"Questo plugin è in grado di creare un web server locale utile per testare la web app, risolvendo molti dei problemi che possono presentarsi effettuando la preview su protocollo file anziché http. Il pezzo forte è il ",[14,3272,3273],{},[29,3274,3275],{},"livereload",", e cioè l'",[29,3278,3279],{},"auto-aggiornamento della pagina ad ogni salvataggio del sorgente che stiamo scrivendo",[37,3281,3283],{"id":3282},"bracket-pair-colorizer","Bracket Pair Colorizer",[11,3285,3286],{},[431,3287,3288],{"href":3288,"rel":3289},"https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer",[435],[11,3291,3292],{},[2971,3293],{"alt":3294,"src":3295},"Screenshot","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/example.png",[11,3297,3298],{},"Le parentesi (tonde, quadre, graffe) sono il pane quotidiano di ciascun developer. Quando l'applicazione inizia ad avere una certa complessità può essere difficile individuare inizio e fine dei blocchi/parentesi senza un aiuto. Questo plugin fa proprio questo: colora in maniera diversa ed evidenzia le parentesi per rendere immediatamente individuabile la coppia di parentesi di interesse per capire immediatamente dove iniziano e dove finiscono.",[37,3300,3302],{"id":3301},"auto-close-tag","Auto Close Tag",[11,3304,3305],{},[431,3306,3307],{"href":3307,"rel":3308},"https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag",[435],[11,3310,3311],{},[2971,3312],{"alt":3313,"src":3314},"Usage","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/usage.gif",[11,3316,3317],{},"Questo plugin piazza automaticamente un tag di chiusura ogni volta che questo è necessario.",[37,3319,3321],{"id":3320},"path-intellisense","Path Intellisense",[11,3323,3324],{},[431,3325,3326],{"href":3326,"rel":3327},"https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense",[435],[11,3329,3330],{},[2971,3331],{"alt":3332,"src":3333},"IDE","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/iaHeUiDeTUZuo.gif",[11,3335,3336],{},"Path Intellisense suggerisce automaticamente il percorso di file e cartelle man mano che viene digitato. Comodissimo per chi detesta dover verificare e/o aprire le cartelle interessate per individuare il file corretto da includere (sia esso JS, CSS ecc).",[37,3338,3340],{"id":3339},"git-lens","Git Lens",[11,3342,3343],{},[431,3344,3345],{"href":3345,"rel":3346},"https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens",[435],[11,3348,3349],{},[2971,3350],{"alt":3351,"src":3352},"Git Code Lens","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/code-lens.png",[11,3354,3355,3356,3360],{},"Questa estensione integra ",[431,3357,3024],{"href":3358,"rel":3359},"https://git-scm.com/",[435]," direttamente all'interno del sorgente, mostrando di volta in volta chi e quando ha modificato un determinato blocco o riga del sorgente. Perfetto per tutti coloro che sono soliti sviluppare applicazioni a più mani e desiderano avere il polso della situazione.",[37,3362,3364],{"id":3363},"better-comments","Better Comments",[11,3366,3367],{},[431,3368,3369],{"href":3369,"rel":3370},"https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments",[435],[11,3372,3373],{},[2971,3374],{"alt":3375,"src":3376},"Annotated code","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/better-comments.PNG",[11,3378,3379],{},"Arricchisce i commenti variando colore ed evidenziandone immediatamente il significato.",[37,3381,3383],{"id":3382},"colorize","Colorize",[11,3385,3386],{},[431,3387,3388],{"href":3388,"rel":3389},"https://marketplace.visualstudio.com/items?itemName=kamikillerto.vscode-colorize",[435],[11,3391,3392],{},[2971,3393],{"alt":451,"src":3394},"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/demo.gif",[11,3396,3397],{},"Visualizza il colore corrispondete al codice colore selezionato (supporta hex, rgb, rgba, hsl) aiutando qualsiasi web designer a comprendere immediatamente il colore utilizzato nel codice.",[37,3399,3401],{"id":3400},"material-theme","Material Theme",[11,3403,3404],{},[431,3405,3406],{"href":3406,"rel":3407},"https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme",[435],[11,3409,3410,3411,3418],{},"Applica un tema ",[431,3412,3415],{"href":3413,"rel":3414},"https://material.io/",[435],[14,3416,3417],{},"material"," a tutto l'editor.",[37,3420,3422],{"id":3421},"material-icon-theme","Material Icon Theme",[11,3424,3425],{},[431,3426,3427],{"href":3427,"rel":3428},"https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme",[435],[11,3430,3431],{},[2971,3432],{"alt":3433,"src":3434},"file icons","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/fileIcons.png",[11,3436,3437,3438,3440],{},"Applica l'icona giusta al file o cartella giusti, in stile ",[14,3439,3417],{},". Adoro il modo in cui queste icone rendono tremendamente esplicita la tipologia di file e cartelle di cui si sta parlando.",[37,3442,3444],{"id":3443},"sort-lines","Sort lines",[11,3446,3447],{},[431,3448,3449],{"href":3449,"rel":3450},"https://marketplace.visualstudio.com/items?itemName=Tyriar.sort-lines",[435],[11,3452,3453],{},[2971,3454],{"alt":3455,"src":3456},"Usage animation","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/usage-animation.gif",[11,3458,3459],{},"Ordina alfabeticamente le righe di codice selezionate, regalando una incredibile sensazione di ordine al sorgente.",{"title":451,"searchDepth":452,"depth":452,"links":3461},[3462,3463,3464,3465,3466,3467,3468,3469,3470,3471],{"id":3253,"depth":452,"text":3254},{"id":3282,"depth":452,"text":3283},{"id":3301,"depth":452,"text":3302},{"id":3320,"depth":452,"text":3321},{"id":3339,"depth":452,"text":3340},{"id":3363,"depth":452,"text":3364},{"id":3382,"depth":452,"text":3383},{"id":3400,"depth":452,"text":3401},{"id":3421,"depth":452,"text":3422},{"id":3443,"depth":452,"text":3444},[1363],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/vscode-plugins.jpg","2019-09-27T21:18:09.000Z","A grande richiesta 10 dei plugin che più raccomando per una esperinza di coding veramente zen.",{},"/i-10-migliori-plugin-visual-studio-code-per-qualsiasi-front-end-developer",{"title":3231,"description":3475},"i-10-migliori-plugin-visual-studio-code-per-qualsiasi-front-end-developer",[21,3225,3481,3482,2194,3483,3484],"editor","extensions","ide","vscode","VBW7MYbSjbadO7QdRGK8tU1AbwFYM6naHmqeQzWSB6Y",{"id":3487,"title":3488,"body":3489,"categories":3668,"coverImage":3669,"date":3670,"description":3671,"extension":468,"meta":3672,"navigation":470,"path":3673,"seo":3674,"stem":3675,"sticky":474,"tags":3676,"__hash__":3679},"articles/modern-gentlemens-wordpress-un-nuovo-approccio-al-web.md","Modern Gentlemen's WordPress: Come sviluppare applicazioni WordPress oggi (2016)",{"type":8,"value":3490,"toc":3656},[3491,3496,3503,3507,3510,3536,3540,3543,3551,3557,3577,3581,3584,3600,3604,3607,3621,3625,3634,3638,3641,3643,3646],[11,3492,3493],{},[14,3494,3495],{},"Il 26 agosto 2016 ho presentato al Meetup WordPress di Roma il mio approccio allo sviluppo moderno e professionale di applicazioni WordPress. In questo articolo voglio condividere i punti chiave del mio intervento.",[11,3497,3498,3499,3502],{},"WordPress viene spesso celebrato per la sua installazione semplice e rapida, ma questa stessa caratteristica può indurre a pratiche di sviluppo approssimative. Con il talk ",[14,3500,3501],{},"Modern Gentlemen's WordPress",", ho voluto offrire una prospettiva alternativa: un metodo strutturato e scalabile per affrontare progetti WordPress con eleganza e professionalità.",[37,3504,3506],{"id":3505},"perché-modernizzare-lo-sviluppo-wordpress","Perché modernizzare lo sviluppo WordPress?",[11,3508,3509],{},"La \"famosa installazione in 5 minuti\" non deve essere un pretesto per trascurare la qualità del codice. Al contrario, uno sviluppo professionale richiede:",[165,3511,3512,3518,3524,3530],{},[138,3513,3514,3517],{},[29,3515,3516],{},"Codice pulito e leggibile:"," seguire standard di codifica chiari per facilitare manutenzione e collaborazione.",[138,3519,3520,3523],{},[29,3521,3522],{},"Scalabilità:"," strutturare i progetti per supportare futuri sviluppi senza difficoltà.",[138,3525,3526,3529],{},[29,3527,3528],{},"Automazione:"," sfruttare strumenti che semplifichino il lavoro manuale.",[138,3531,3532,3535],{},[29,3533,3534],{},"Deploy e gestione:"," garantire processi fluidi per il rilascio e l'aggiornamento delle applicazioni.",[37,3537,3539],{"id":3538},"gli-strumenti-del-mestiere","Gli strumenti del mestiere",[11,3541,3542],{},"Durante il talk, ho illustrato strumenti e metodologie chiave per elevare lo sviluppo WordPress. Ecco una panoramica:",[1333,3544,3546,3547],{"id":3545},"boilerplate-professionale-wpacked","Boilerplate professionale: ",[431,3548,3550],{"href":2162,"rel":3549},[435],"wPacked",[11,3552,3553,3554,3556],{},"Il mio boilerplate, ",[14,3555,3550],{},", è pensato per fornire una base robusta per progetti WordPress. Esso include:",[165,3558,3559,3565,3571],{},[138,3560,3561,3564],{},[29,3562,3563],{},"Struttura modulare:"," organizza codice e asset in modo coerente.",[138,3566,3567,3570],{},[29,3568,3569],{},"Supporto per Composer:"," gestione delle dipendenze semplificata.",[138,3572,3573,3576],{},[29,3574,3575],{},"Compatibilità con moderni strumenti di build:"," come Webpack o Gulp per il processing di CSS e JavaScript.",[1333,3578,3580],{"id":3579},"versionamento-con-git","Versionamento con Git",[11,3582,3583],{},"Git è uno strumento indispensabile per tracciare modifiche, lavorare in team e mantenere un controllo preciso sullo stato del progetto. Consiglio di:",[165,3585,3586,3597],{},[138,3587,3588,3589,3592,3593,3596],{},"Utilizzare un ",[21,3590,3591],{},".gitignore"," adeguato per escludere file inutili (es. ",[21,3594,3595],{},"wp-config.php"," o directory di cache).",[138,3598,3599],{},"Creare branch specifici per ogni funzionalità o bug fix.",[1333,3601,3603],{"id":3602},"local-development-con-vagrant-o-docker","Local Development con Vagrant o Docker",[11,3605,3606],{},"Ambienti di sviluppo locali come Vagrant o Docker permettono di replicare con precisione l'ambiente di produzione, evitando \"funziona solo sul mio computer\". Questi strumenti garantiscono:",[165,3608,3609,3615],{},[138,3610,3611,3614],{},[29,3612,3613],{},"Coerenza:"," ogni membro del team lavora sullo stesso setup.",[138,3616,3617,3620],{},[29,3618,3619],{},"Portabilità:"," facilità di condivisione e replica dell'ambiente.",[1333,3622,3624],{"id":3623},"coding-standards","Coding Standards",[11,3626,3627,3628,3633],{},"Seguire gli standard ufficiali di WordPress (PHP, CSS, JavaScript) migliora la leggibilità e facilita il lavoro di squadra. Strumenti come ",[431,3629,3632],{"href":3630,"rel":3631},"https://github.com/squizlabs/PHP_CodeSniffer",[435],"PHP CodeSniffer"," possono essere configurati per verificare automaticamente il rispetto degli standard.",[1333,3635,3637],{"id":3636},"automazione-con-gulp-o-webpack","Automazione con Gulp o Webpack",[11,3639,3640],{},"Automatizzare processi come il minifying di CSS/JS, la gestione di immagini o la rigenerazione automatica del browser durante lo sviluppo rende il workflow più efficiente.",[37,3642,2658],{"id":2657},[11,3644,3645],{},"La mia presentazione al Meetup WordPress di Roma aveva l'obiettivo di ispirare sviluppatori e team a vedere WordPress non come un CMS limitato, ma come una piattaforma capace di supportare applicazioni moderne e performanti, purché si adottino le giuste metodologie e strumenti.",[11,3647,3648,3649,3651,3652,3655],{},"Se vuoi approfondire, il boilerplate ",[14,3650,3550],{}," è disponibile su ",[431,3653,2847],{"href":2162,"rel":3654},[435],". Fammi sapere cosa ne pensi o se hai suggerimenti nei commenti o sui miei canali social!",{"title":451,"searchDepth":452,"depth":452,"links":3657},[3658,3659,3667],{"id":3505,"depth":452,"text":3506},{"id":3538,"depth":452,"text":3539,"children":3660},[3661,3663,3664,3665,3666],{"id":3545,"depth":1361,"text":3662},"Boilerplate professionale: wPacked",{"id":3579,"depth":1361,"text":3580},{"id":3602,"depth":1361,"text":3603},{"id":3623,"depth":1361,"text":3624},{"id":3636,"depth":1361,"text":3637},{"id":2657,"depth":452,"text":2658},[1363],"https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/modern-gentlemens-wordpress-un-nuovo-approccio-al-web.jpg","2016-08-26T00:00:00.000Z","Una panoramica delle migliori pratiche per lo sviluppo di applicazioni WordPress, basata sul talk presentato al WordPress Meetup di Roma nel 2016.",{},"/modern-gentlemens-wordpress-un-nuovo-approccio-al-web",{"title":3488,"description":3671},"modern-gentlemens-wordpress-un-nuovo-approccio-al-web",[1207,3225,3677,3678,3024,2164],"boilerplate","php","qBTrvlqr6V3hPvvw6cggdtjGN_idZwZjKqud_FXJrj4",1780867862627]