<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[IAD ]]></title><description><![CDATA[A Periscope on IT Oceans]]></description><link>https://periscope.iad2.it/</link><image><url>https://periscope.iad2.it/favicon.png</url><title>IAD </title><link>https://periscope.iad2.it/</link></image><generator>Ghost 4.32</generator><lastBuildDate>Sun, 26 Apr 2026 11:29:29 GMT</lastBuildDate><atom:link href="https://periscope.iad2.it/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Business Driven Architectures - Parte 3]]></title><description><![CDATA[<p>In questo articolo continuiamo ad esplorare il concetto di architetture Business Driven, tenendo in considerazione gli aspetti pi&#xF9; concreti di questo tipo di architetture. </p><p>Nell&apos;Information Tecnology il modello <em>X as a Service </em>&#xE8; facile da comprendere. Ci indica che alcuni servizi vengono forniti da un fornitore di</p>]]></description><link>https://periscope.iad2.it/business-driven-architectures-2/</link><guid isPermaLink="false">61d317bc00c4b40001a4b2fc</guid><dc:creator><![CDATA[Daniele Fiungo]]></dc:creator><pubDate>Tue, 29 Mar 2022 13:23:36 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1582736604119-596ee4cb45c4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDI1fHxnZWFyfGVufDB8fHx8MTY0MTIyNDg3OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1582736604119-596ee4cb45c4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDI1fHxnZWFyfGVufDB8fHx8MTY0MTIyNDg3OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Business Driven Architectures - Parte 3"><p>In questo articolo continuiamo ad esplorare il concetto di architetture Business Driven, tenendo in considerazione gli aspetti pi&#xF9; concreti di questo tipo di architetture. </p><p>Nell&apos;Information Tecnology il modello <em>X as a Service </em>&#xE8; facile da comprendere. Ci indica che alcuni servizi vengono forniti da un fornitore di terze parti oppure internamente gestendoli come se fossero servizi esterni.</p><p>Utilizzando un&apos;architettura a microservizi dovremmo operare questo cambiamento di prospettiva per ogni servizio. Il modello infatti garantisce, indipendenza al team che lo gestisce e un modello di utilizzo chiaro e ben documentato per i team che lo utilizzeranno.</p><h2 id="identity-as-a-service">Identity as a Service</h2><p>Adottare un servizio di Identity as a Service &#xE8; probabilmente una delle prime necessit&#xE0; per supportare questo tipo di architetture.</p><p>Le applicazioni / servizi devono poter contare su un servizio che gli consenta di condividere le utenze.</p><p>Le alternative presenti sul mercato sono molteplici e generalmente fanno utilizzo di protocolli di autenticazione standard (OAuth2, Open ID Connect 1.0, SAML, AD/LDAP). Questo ci garantisce un certo margine di portabilit&#xE0; tra una soluzione e l&apos;altra.</p><p>Scegliere un fornitore di terze parti (Okta, Auth0, AWS Cognito, ...) che si occupi di tutto il lavoro, ad esempio in caso di assenza di competenze interne, necessit&#xE0; di scaling su larga scala, riduzione dei costi, compliance con normative e regolamenti.</p><p>In base alle necessit&#xE0; e qualora si decida di eseguire carichi sulla propria infrastruttura si potrebbe optare per la gestione diretta del servizio.<br>Anche in questo caso ci sono diverse alternative su cui indirizzare la nostra scelta, citiamo ad esempio <a href="https://www.ory.sh/hydra/">Ory Hydra</a> , <a href="http://keycloak.org/">Keycloak</a> e <a href="https://apereo.github.io/cas/">CAS</a> oltre a quella di crearne uno da zero.</p><p>Se il nostro obiettivo non &#xE8; quello di rivendere il servizio di Identity, l&apos;implementazione personalizzata &#xE8; poco praticabile, non avremmo possibilit&#xE0; di acquistare supporto, una community che identifichi bug e migliori il prodotto.<br>Scegliendo invece un prodotto occorre essere pragmatici e valutare adeguatamente pro e contro di ognuno di essi. Ory Hydra e CAS ad esempio offrono ampi margini di personalizzazione ma richiedono un costo di integrazione pi&#xF9; elevato, Keycloak invece &#xE8; una soluzione sicuramente pi&#xF9; completa ma pu&#xF2; in alcuni casi risultare pi&#xF9; vincolante per alcuni aspetti. (<strong>fixme Federation, Spid, TFA)</strong></p><p>A prescindere da quale soluzione si scelga occorre ragionare attentamente sul processo di adozione che deve coinvolgere progressivamente applicazioni/servizi &#xA0;pre-esistenti o da creare. Percorrere questa strada richiede un impegno notevole, occorre prevedere migrazioni di utenze, librerie o componenti di integrazione per applicazioni pre-esistenti, documentazione e supporto adeguato.</p><p>Su questi temi facciamo un po&apos; di auto-promozione ai nostri contributi opensource: </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/iad-os/nightswatch#readme"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - iad-os/nightswatch: &#x2694;&#xFE0F;Night&#x2019;s Watch, the OIDC Relying Party that guards the realms</div><div class="kg-bookmark-description">&#x2694;&#xFE0F;Night&#x2019;s Watch, the OIDC Relying Party that guards the realms - GitHub - iad-os/nightswatch: &#x2694;&#xFE0F;Night&#x2019;s Watch, the OIDC Relying Party that guards the realms</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Business Driven Architectures - Parte 3"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">iad-os</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/12ce2691e04a207be3f8e426287b128f075599663c440022e4a5635727b8e716/iad-os/nightswatch" alt="Business Driven Architectures - Parte 3"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/iad-os/react-ghost-auth"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - iad-os/react-ghost-auth</div><div class="kg-bookmark-description">Contribute to iad-os/react-ghost-auth development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Business Driven Architectures - Parte 3"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">iad-os</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/bda58d1da06b1c54785e6d14755ad8d0c1779bceaca37d5957cad920a4b85d00/iad-os/react-ghost-auth" alt="Business Driven Architectures - Parte 3"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/iad-os/aemon-oidc-introspect"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - iad-os/aemon-oidc-introspect: I am a maester of the Citadel, bound in service to Castle Black and the Night&#x2019;s Watch... And I introspect OIDC Tokens in the spare time!</div><div class="kg-bookmark-description">I am a maester of the Citadel, bound in service to Castle Black and the Night&amp;#39;s Watch... And I introspect OIDC Tokens in the spare time! - GitHub - iad-os/aemon-oidc-introspect: I am a maester ...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Business Driven Architectures - Parte 3"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">iad-os</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/482c8cdd719822a9fb9209357032639b70614709e5f69acdf640b84000deb9d3/iad-os/aemon-oidc-introspect" alt="Business Driven Architectures - Parte 3"></div></a></figure><h2 id="event-driven-architecture">Event-Driven Architecture</h2><p>Le architetture a microservizi e quelle serverless richiedono l&apos;utilizzo di architetture event driven per:</p><ul><li>rendere l&apos;esperienza utente reactive e interattiva (notifiche, chat, collaborazione online, etc)</li><li>applicare il pattern &#xA0;&quot;Inversion of Control&quot; tra i singoli servizi, consentendo una maggiore coesione e un basso accoppiamento tra di essi. <br>Chi scatena l&apos;evento non &#xE8; a conoscenza di quali saranno i suoi utilizzatori, quindi un cambiamento su uno di questi servizi non produce nessun effetto su chi lo ha generato;</li><li>implementare la Consistenza Eventuale: L&apos;impossibilit&#xE0; di avere transazioni ACID su un sistema distribuito (<a href="https://en.wikipedia.org/wiki/CAP_theorem">CAP Theorem</a>), nelle situazioni dove non &#xE8; stato possibile risolvere il problema attraverso un&apos;oculata scelta dei contesti transazionali ci porta a considerare soluzioni capaci di convergere ad una situazione di consistenza, consistenza eventuale appunto.<br>Questi meccanismi utilizzano eventi per raggiungere questo traguardo;</li><li>utilizzare gli eventi per produrre informazioni aggregate utili a fini di monitoring, alerting e BI.</li></ul><p>Le principali caratteristiche di un sistema adeguato alle nostre necessit&#xE0; dovrebbe:</p><ul><li>gestire un numero adeguato di eventi e connessioni</li><li>garantire una durabilit&#xE0; degli eventi stessi</li><li>essere facile da integrare e con il supporto ai principali modelli di utilizzo (es. publish/subscribe, request/reply, queue group, ...)</li></ul><p>A seconda delle necessit&#xE0; esistono diverse soluzioni da poter metter in campo. La scelta deve avvenire in base alle necessit&#xE0; effettive di progetto.</p><p><a href="https://nats.io/">NATS</a>, &#xE8; una soluzione opensource che fornisce performance elevate, scalabilit&#xE0;, sicurezza e resilienza nella gestione di sistemi &quot;hyperconnected&quot;.<br>Il punto di forza di NATS &#xE8; nella sua &quot;ergonomicit&#xE0;&quot; di utilizzo. In altre parole consente agli sviluppatori di gestire diversi casi d&apos;uso con estrema semplicit&#xE0;.</p><p><a href="https://kafka.apache.org/">Apache Kafka</a> &#xE8; una piattaforma di event streaming utilizzata per applicazioni con data pipeline ad elevate performance, streaming analytics, data integration e applicazioni mission-critical. <br>La sua robustezza e le performance lo rendono adatto alla creazione di requisiti complessi. Purtroppo la sua natura non gli consente di avere la stessa &quot;ergonomicit&#xE0;&quot; di NATS e la sua gestione operativa &#xE8; molto pi&#xF9; complessa rispetto alle altre soluzioni.</p><h2 id="gitops">GitOps</h2><p>Il <a href="https://www.gitops.tech/">GitOps</a> &#xE8; una metodologia che ci consente di gestire il deployment di applicazioni Cloud Native. Lo sviluppatore viene messo in condizione di poter gestire direttamente l&apos;infrastruttura utilizzando gli strumenti con cui ha gi&#xE0; familiarit&#xE0;, incluso Git e i tools di Continuous Deployment</p><blockquote>GitOps: versioned CI/CD on top of declarative infrastructure. Stop scripting and start shipping.<br><br>&#x2014; <a href="https://twitter.com/kelseyhightower/status/953638870888849408">Kelsey Hightower</a></blockquote><p>Attraverso il GitOps &#xE8; possibile ottenere allo stesso tempo automazione e controllo. Questo risultato viene ottenuto utilizzando un approccio dichiarativo in tutti i livelli.</p><p>Tutti i passaggi necessari, dal provisioning infrastrutturale (es. IaaS) fino ad arrivare al rilascio in produzione, sono descritti all&apos;interno di un repository Git.</p><p>Per creare un nuovo ambiente o effettuare il rilascio di una singola commit non serve pi&#xF9; ingaggiare il gruppo di operations.</p><p>Gli interventi una volta sottoposti ad un processo di approvazione supervisionato o automatico, vengono accettati e realizzati direttamente dal sistema.<br>Il modello di contribuzione stesso viene inserito in questi repository, per convenzione denominato <strong><a href="https://github.com/github/opensource.guide/blob/HEAD/CONTRIBUTING.md">CONTRIBUTING.md</a>.</strong></p><p>In questo modo i singoli team possono disegnare la loro infrastruttura di base, lasciando ai gruppi di Operations l&apos;opportunit&#xE0; di adattarle in una fase successiva.<br>I singoli team non hanno nemmeno accesso diretto agli ambienti dove verranno eseguiti i loro workload, stabilendo un livello di sicurezza elevato.</p><p>Uno degli strumenti che ci consente di applicare questa metodologia &#xE8; <a href="https://argoproj.github.io/cd/">ArgoCD</a>.</p><blockquote><strong>Why ArgoCD?</strong><br>Application definitions, configurations, and environments should be declarative and version controlled. Application deployment and lifecycle management should be automated, auditable, and easy to understand.</blockquote><p></p><h2 id="conclusioni">Conclusioni</h2><p>Questi sono solo alcuni dei problemi e i relativi strumenti su cui occorre fare una riflessione. <br>Senza questi strumenti le architetture orientate al Business sono quasi impossibili da gestire e proibitive nei costi operativi e di gestione.<br>Anche se si pu&#xF2; procedere ad un&apos;adozione incrementale che vada di pari passo con il nostro business, avere gi&#xE0; un obiettivo e una strategia di breve e medio termine ci consente di non precludere l&apos;utilizzo di questi strumenti.</p>]]></content:encoded></item><item><title><![CDATA[Business Driven Architectures - Parte 2]]></title><description><![CDATA[<p>Evolvere il processo produttivo in qualsiasi campo di applicazione &#xE8; una sfida che ci pone di fronte a nuove opportunit&#xE0; ma anche a nuovi problemi.</p><p>L&apos;impulso che d&#xE0; vita all&apos;evoluzione &#xE8; sempre un&apos;opportunit&#xE0; o un problema. <br>Problema o opportunit&#xE0; &#xE8;</p>]]></description><link>https://periscope.iad2.it/business-driven-architectures-parte-2/</link><guid isPermaLink="false">61d143eb00c4b40001a4aeb0</guid><dc:creator><![CDATA[Daniele Fiungo]]></dc:creator><pubDate>Tue, 29 Mar 2022 13:23:21 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1582571352032-448f7928eca3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDI4fHxyb2JvdHxlbnwwfHx8fDE2NDExOTIwMDY&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1582571352032-448f7928eca3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDI4fHxyb2JvdHxlbnwwfHx8fDE2NDExOTIwMDY&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Business Driven Architectures - Parte 2"><p>Evolvere il processo produttivo in qualsiasi campo di applicazione &#xE8; una sfida che ci pone di fronte a nuove opportunit&#xE0; ma anche a nuovi problemi.</p><p>L&apos;impulso che d&#xE0; vita all&apos;evoluzione &#xE8; sempre un&apos;opportunit&#xE0; o un problema. <br>Problema o opportunit&#xE0; &#xE8; spesso un punto di vista. Sono entrambe un qualcosa che in un modo o nell&apos;altro ci consente di crescere.</p><p>Come accennavamo nel precedente articolo <a href="https://periscope.iad2.it/business-driven-architectures/">Business Driven Architectures - Parte 1</a>, i problemi da affrontare sono diversi e trasversali.</p><p>Visti sotto questa luce rappresentano anche delle opportunit&#xE0; ad esempio, inserirsi in nuovi mercati, strappare o riconquistare dai competitor quote di mercato.<br>Avere come obiettivo principale il valore dei servizi offerti, coincide con l&apos;obiettivo del business.</p><p>In questo articolo cerchiamo di analizzare meglio la situazione da diverse angolazioni.</p><h2 id="automazione-vs-burocrazia">Automazione vs Burocrazia</h2><p>Spesso l&apos;evoluzione di un sistema software viene inibita dal contesto e se ci &#xE8; ostile pu&#xF2; dissuadere o far fallire chiunque.</p><p>Un contesto &#xE8; ostile se: ogni intervento richiede montagne di ticket e gerarchie da scalare, la sua notevole complessit&#xE0; fa si che ogni intervento sia enormemente costoso, i benefici di ogni intervento non sono mai all&apos;altezza dei costi, i team che lavorano sul progetto non operano con una visione di insieme e si limitano alle loro responsabilit&#xE0;, quando il sistema &#xE8; fragile e quindi si ha paura di introdurre nuove funzionalit&#xE0;, &#xA0;... (la lista &#xE8; ancora molto lunga ). </p><p>Se queste situazioni vi sono anche in parte familiari, occorre effettuare una decisa inversione di rotta, ripensando, rimuovendo o intervenendo in modo tale da consentire al sistema &quot;azienda&quot; di poter evolvere su tutti i livelli.</p><p>L&apos;automazione &#xE8; uno strumento non sufficiente ma sicuramente necessario a correggere la situazione. Il motto &#xE8; &quot;Automate Everything&quot; ed &#xE8; solo uno dei principi che consentono di instaurare un processo meglio noto come DevOps e le sue declinazioni (DevSecOps , GitOps). </p><h2 id="iaas-infrastructure-as-a-service">IaaS (Infrastructure as a Service) </h2><p>Ridurre al minimo o rimuovere tutte le interazioni che non aggiungono valore per il cliente finale richiede che alcuni processi vengano descritti con un approccio pi&#xF9; dichiarativo che ne descriva il &quot;cosa&quot; non il &quot;come&quot;.</p><p>Ordinando al ristorante non ci interessano tutti i passaggi necessari per ottenere un piatto, possiamo essere interessati agli ingredienti utilizzati per eventuali intolleranze o possiamo ordinarne in base alla necessit&#xE0; (cena per due o rimpatriata con tutti gli amici delle elementari e rispettivi familiari).</p><p>Ottenendo a servizio le componenti necessarie a eseguire i nostri carichi di lavoro, possiamo contare su un&apos;infrastruttura virtualmente infinita, self-service (replicabile per esigenze specifiche e anche di brevissima durata), ridurre i costi di acquisto e gestione, gestire i minimizzare rischi associati senza aver paura di intervenire.</p><p>Tra principali fornitori di servizi IaaS ci sono AWS (Amazon) , Azure ( Microsoft ), GCS ( Google ), Digital Ocean che possono provvedere a tutte le necessit&#xE0; infrastrutturali operando a servizio. In caso di necessit&#xE0; (es. localizzazione dei dati, strategia aziendale, ...) &#xA0;si pu&#xF2; decidere di sostenere i costi di un&apos;infrastruttura on-premises, rapportandosi con essa come si farebbe per un fornitore del servizio IaaS. In questa configurazione si possono prevedere anche scenari ibridi ( Cloud Provider + On Premises) che possano sfruttare entrambe le soluzioni. </p><h2 id="cloud-native-applications">Cloud Native Applications</h2><p>Con una semplice e poco costosa operazione <em>Lift-and-shift (Migrazione senza modifiche), si possono:</em> aumentare scalabilit&#xE0; e performance, migliorare la sicurezza, ridurre i costi di esecuzione di applicazioni e carichi di lavoro.</p><p>Questa migrazione per&#xF2; riprodurr&#xE0; in Cloud, gli stessi problemi di operativit&#xE0; che avevamo prima, un processo batch potr&#xE0; passare da ore di lavoro a minuti di lavoro e non potr&#xE0; comunque fornire informazioni utili in real time agli utenti, i costi di sviluppo rimarranno invariati o aumenteranno in funzione della complessit&#xE0; aggiunta dal IaaS.</p><p>Occorre portare questo concetto nelle applicazioni stesse. Utilizzare tecniche, strumenti e metodologie che ci permettano di ottenere vantaggi sempre maggiori.</p><p>Da qui il concetto di Cloud Native Applications.<br>Le Cloud Native Applications sono tutte quelle applicazioni che seguono una serie di principi finalizzati a renderle adatte per il raggiungimento di questi obiettivi.</p><p>L&apos;esperienza di Heroku, uno dei primi fornitori del servizio Platform as a Service (PaaS). Opera su questo mercato sin dal 2007 ha riassunto la sua esperienza in questo documento <a href="https://12factor.net/">The Twelve Factors App</a>.</p><p>Le applicazioni che rispettano i principi del documento:</p><ul><li>utilizzano un formato <strong>dichiarativo</strong> per l&#x2019;automazione della configurazione, minimizzando tempi e costi;</li><li>possono essere utilizzate sui vari ambienti di esecuzione;</li><li>sono progettate per diminuire la necessit&#xE0; di server e amministrazioni di sistema;</li><li>hanno omogeneit&#xE0; tra gli ambienti di esecuzione (sviluppo/produzione)<strong> </strong>per una massima &#x201C;agilit&#xE0;&#x201D; del processo di rilascio;</li><li>possono <strong>scalare significativamente</strong> senza troppi cambiamenti ai tool, all&apos;architettura e al processo di sviluppo.</li></ul><h2 id="microservices-architecture">Microservices Architecture</h2><p>Le architetture a microservizi sono naturalmente correlate ai principi delle Applicazioni Cloud Native.</p><p>Dividere le applicazioni originali in una serie di microservizi, ci consente di ottenere numerosi vantaggi, ad esempio i singoli servizi: sono pi&#xF9; piccoli e gestiti in autonomia dai diversi team; possono essere scalati, rilasciati e testati in modo indipendente da tutte le altre componenti.</p><p>Questi vantaggi generano anche per&#xF2; un aumento della complessit&#xE0; del sistema, si passa dal singolo applicativo (monolite) ad una moltitudine di servizi pi&#xF9; piccoli ( microservizi) da dover gestire.</p><p>Saper gestire queste architetture pu&#xF2; non essere banale, richiede di utilizzare &#xA0;architetture adeguate, strumenti e processi automatizzati.</p><h2 id="containers">Containers</h2><p>Anche se esistono differenti modi di gestire i carichi di lavoro principalmente hardware dedicato o virtual machine, l&apos;approccio alla conteinerizzazione permette di ottenere gli stessi risultati in modo pi&#xF9; leggero e meno costoso.</p><p>I container non sono altro che dei processi adeguatamente isolati e connessi, che vengono eseguiti direttamente sul sistema operativo della macchina che li esegue.<br>Oltre ad ottenere un sistema di gestione dei carichi molto pi&#xF9; efficiente in termini risorse consumate, si ha anche uno strumento progettato specificamente per eseguire carichi Cloud Native.</p><p>La scelta dei container consente quindi di avere ambienti di lavoro standard, testati e subito operativi per gli sviluppatori, fino a raggiungere la parit&#xE0; tra sviluppo e produzione. Inoltre, come dicevamo, si adatta perfettamente alle esigenze dei 12 Factor / Cloud Native apps.</p><h2 id="container-as-a-service-caas">Container as a Service (CaaS)</h2><p>Questi container devono essere gestiti dichiarativamente in modo simile a quello utilizzato per IaaS, in questo ambito ci sono diverse alternative la pi&#xF9; nota &#xE8; <a href="https://kubernetes.io/">Kubernetes</a>, supportato da una vasta community e dai principali operatori del settore attraverso la <a href="https://www.cncf.io/about/members/">CNCF (Cloud Native Computing Foundation)</a>.</p><p></p><p>L&apos;Architettura che si viene a creare con questi strumenti e metodologie richieder&#xE0; inoltre di spostare o introdurre delle logiche prima gestite individualmente dai singoli applicativi a componenti infrastrutturali.</p><p>Nel prossimo articolo (Business Driven Architectures - Parte 3) proviamo ad individuare quali sono i servizi e gli strumenti che possono aiutarci a gestire il processo di adozione.</p>]]></content:encoded></item><item><title><![CDATA[Business driven Architettures - Parte 1]]></title><description><![CDATA[<p>Business e IT sono legati alle stesse sorti. La loro &#xE8; una relazione spesso difficile, dove si cerca di convergere sullo stesso obiettivo. </p><p>Le architetture, la progettazione, &#xA0;lo sviluppo e l&apos;operativit&#xE0; di un prodotto (con particolare riferimento al software) vengono spesso viste come una necessit&#xE0;</p>]]></description><link>https://periscope.iad2.it/business-driven-architectures/</link><guid isPermaLink="false">61cdbfacb39ba000011801a5</guid><category><![CDATA[business]]></category><category><![CDATA[architecture]]></category><category><![CDATA[devops]]></category><category><![CDATA[agile]]></category><dc:creator><![CDATA[Daniele Fiungo]]></dc:creator><pubDate>Tue, 11 Jan 2022 06:22:13 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1504805572947-34fad45aed93?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGRvJTIwc29tZXRoaW5nJTIwZ3JlYXR8ZW58MHx8fHwxNjQxMDIxMzky&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1504805572947-34fad45aed93?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGRvJTIwc29tZXRoaW5nJTIwZ3JlYXR8ZW58MHx8fHwxNjQxMDIxMzky&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Business driven Architettures - Parte 1"><p>Business e IT sono legati alle stesse sorti. La loro &#xE8; una relazione spesso difficile, dove si cerca di convergere sullo stesso obiettivo. </p><p>Le architetture, la progettazione, &#xA0;lo sviluppo e l&apos;operativit&#xE0; di un prodotto (con particolare riferimento al software) vengono spesso viste come una necessit&#xE0; tecnica, come un costo necessario che sottrae risorse a processi mirati a valorizzare il business.</p><p>In questo articolo proviamo a mettere in evidenza come l&apos;utilizzo di principi architetturali e di progettazione possono invece determinare il successo di un prodotto e quindi del nostro business. </p><blockquote>Il successo di un prodotto, &#xE8; in ultima analisi, determinato dalla capacit&#xE0; di soddisfare le necessit&#xE0; e le aspettative del cliente finale. </blockquote><p>Il concetto &#xE8; semplice, ma le sue implicazioni non lo sono affatto. Conservare o creare la propria base utenti &#xE8; gi&#xE0; complicato e oggi pu&#xF2; non essere sufficiente. Una volta raggiunto questo obiettivo la strada da percorrere &#xE8; ancora in salita.</p><h2 id="aumentare-il-valore-del-tuo-prodotto">Aumentare il Valore del tuo prodotto</h2><p>Sia che si tratti di un prodotto nuovo o di un&apos;evoluzione, gli architetti software devono fin da subito tenere in considerazione una serie di requisiti non funzionali che serviranno per migliorare, correggere ed infine aumentare il valore del prodotto nel tempo.</p><p>Un utente che si avvicina al nostro prodotto, prima di diventare cliente o anche se lo &#xE8; gi&#xE0;, terr&#xE0; sicuramente in considerazione:</p><ul><li>Funzionalit&#xE0; presenti</li><li>Semplicit&#xE0; di utilizzo</li><li>Affidabilit&#xE0; e Fluidit&#xE0; del prodotto </li><li>Capacit&#xE0; di adattamento alle sue esigenze</li><li>Costo di apprendimento </li><li>Costi di acquisto/licenza</li></ul><p>Questa valutazione &#xE8; continua e non si esaurisce nel momento della sua trasformazione a cliente. Nel tempo, bisogna continuare a conquistarne la fiducia e l&apos;interesse.</p><p>Queste necessit&#xE0; dovrebbero essere parte progettazione della soluzione. Aumentare il valore del servizio offerto &#xE8; un&apos;esigenza da cui nessuno pu&#xF2; prescindere.</p><h2 id="rimanere-al-passo-dei-tuoi-clienti">Rimanere al passo dei tuoi clienti</h2><p></p><blockquote>&#x201C;La vita &#xE8; come guidare una bicicletta. Per mantenere l&apos;equilibrio devi continuare a muoverti&#x201D; <br>&#x2013; Albert Einstein</blockquote><p>Capacit&#xE0; di comunicazione e marketing non sono pi&#xF9; sufficienti per garantire il successo di un prodotto.<br>In un mercato aggressivo come Internet, mantenere e far crescere le proprie quote, &#xE8; diventato a tutti gli effetti un requisito non funzionale alla base di ogni applicazione.</p><p>Nel bene o nel male, la tecnologia &#xE8; ormai parte di quasi ogni aspetto della nostra quotidianit&#xE0;. Tutte le informazioni e i prodotti sono letteralmente a portata di mano, l&apos;utenza &#xE8; pi&#xF9; coinvolta e si aspetta che le applicazioni siano stabili, facili da usare ma soprattutto in grado di sorprendere l&apos;utente migliorando il servizio offerto.</p><p>Anche in mercati meno competitivi, un servizio di qualit&#xE0; &#xE8; importante per mantenere o aumentare il proprio vantaggio competitivo.<br>La progettazione di un prodotto deve necessariamente tenere in considerazione questi aspetti.<br><br>Il mondo sta cambiando e anche le aziende devono scegliere se adattarsi oppure essere prima o poi travolte dal cambiamento. </p><h2 id="il-valore-dei-dati">Il valore dei Dati</h2><p>I dati sono considerati al giorno d&apos;oggi il bene pi&#xF9; prezioso <a href="https://www.invisibly.com/learn-blog/how-much-is-data-worth">How Much Is Your Data Worth?</a>. <br>Questo risorsa &#xE8; strategica per preservare e aumentare il successo della nostra attivit&#xE0;.<br><br>Generare dati di valore in modo preciso, veloce e intuitivo &#xE8; l&apos;obiettivo da centrare. Le informazioni ci aiutano a costruire &#xA0;applicazioni migliori per i nostri clienti, ma anche ad intervenire in funzione delle loro reali necessit&#xE0; e quindi di quelle del mercato.<br>Per sperimentare nuove funzionalit&#xE0; o cercare di migliorare quelle esistenti, occorre avere dei dati su cui valutare i risultati ottenuti. </p><p>Comprendere il valore di queste informazioni e metterlo a frutto richiede un cambiamento a tutti i livelli, compresa l&apos;adozione di architetture e metodologie adeguate. </p><h2 id="conclusioni">Conclusioni</h2><p>Il mercato ci indica chiaramente che per aver successo bisogna avere un buon piano, ma occorre anche saper utilizzare al meglio gli strumenti disponibili per ottenere un buon risultato.</p><p>Le aziende che sono state capaci di sopravvivere ma anche prosperare su questi mercati, hanno saputo rimodellare il loro modo di fare business, incentrandolo sul valore fornito al cliente.<br><br>Procedere su questa strada, o continuare per la propria rappresenta una scelta importante. <br>Prima di fare il prossimo passo, qualsiasi esso sia, occorre riflettere molto attentamente sulle reali necessit&#xE0; del vostro business.</p>]]></content:encoded></item><item><title><![CDATA[Storia di 2 parcheggi auto "SQL" e "NoSQL"]]></title><description><![CDATA[Breve storia per spiegare le differenze tra i mondi SQL e NoSQL]]></description><link>https://periscope.iad2.it/1-metafora-sql-vs-nosql/</link><guid isPermaLink="false">6031fdc2573c0f00014ebfb8</guid><category><![CDATA[sql]]></category><category><![CDATA[nosql]]></category><category><![CDATA[storytell]]></category><dc:creator><![CDATA[Daniele Fiungo]]></dc:creator><pubDate>Mon, 11 Oct 2021 15:59:36 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1569633586753-4cfeaa15bab5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MXwxMTc3M3wwfDF8c2VhcmNofDd8fHBhcmtpbmd8ZW58MHx8fA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1569633586753-4cfeaa15bab5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MXwxMTc3M3wwfDF8c2VhcmNofDd8fHBhcmtpbmd8ZW58MHx8fA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Storia di 2 parcheggi auto &quot;SQL&quot; e &quot;NoSQL&quot;"><p>Parliamo del proprietario di una catena di parcheggi che nasce da lontano. Il loro successo e dovuto alla continua cura per le auto depositate e alla ricerca di servizi innovativi che come piace dire a lui &quot;coccolino&quot; l&apos;utente.</p><p>Ovvio che tutti i servizi dovranno essere comodamente acquistati dall&apos;app scaricabile su tutti i cellulari. L&apos;app sarebbe stata resa accattivante rendendo disponibili tutte le informazioni sulla propria auto oltre a avvisi per i controlli di manutenzione, tasse automobilistiche e per finire anche &#xA0;il proprio conto dettagliato con le promozioni sui piani annuali.</p><p>Con questa app si possono controllare veramente tantissimi dettagli della propria auto. Si possono vedere cose come, il livello di carburante, lo stato degli interni, della batteria fino alla pressione dei pneumatici.<br>Insieme a ognuno di questi dettagli vengono offerti i servizi extra del parcheggio come quello per il servizio di sostituzione.</p><p>Delle tante proposte innovative ricevute il proprietario ne ritiene veramente adatte alla sue ambizioni solamente due. Ne aveva adocchiate tra quelle scartate che erano veramente interessanti ma purtroppo non si adattavano bene al suo caso. Si &#xE8; messo la coscienza apposto dicendosi che le avrebbe riprese in considerazione.</p><h2 id="proposta-del-team-sequel">Proposta del Team SeQueL</h2><p>Ogni volta che entra una macchina nel parcheggio, i robots impiegati nel parcheggio la disassemblano in parti pi&#xF9; piccole.</p><p>Ogni robot sa in quale reparto del parcheggio dovr&#xE0; mettere le componenti dello stesso tipo, motori con motori, ruote con ruote e cosi via... . </p><p>Dall&apos; app il cliente avrebbe potuto chiedere lo stato delle sue gomme, in poco tempo il reparto gomme del parcheggio le avrebbe recuperate per inviare le informazioni sullo schermo del cliente.<br>Nel caso in cui i pneumatici risultino usurati, l&apos;utente potr&#xE0; acquistare il servizio di sostituzione pneumatici offerto dal parcheggio come extra direttamente dal suo telefono.<br>Disponendo le componenti per reparto il proprietario potr&#xE0; anche facilmente calcolare quante ruote in totale sono presenti nel parcheggio o se ce ne sono di particolari dimensioni o marca e fare ordini per il magazzino.</p><h2 id="proposta-del-team-no-sequel">Proposta del Team &quot;No SeQueL&quot;</h2><p>Dopo aver spiegato che il nome scelto per il loro team &quot;No SeQueL&quot;non &#xE8; un consiglio a non scegliere la proposta del team &quot;SeQueL&quot;, ma indica che le due strategie utilizzano principi di differenti e risolvono e creano problemi diversi, proprio opposti e quindi No+SeQueL.</p><p>La proposta del team NoSeQueL non richiede di disassemblare la macchina, il loro motto &#xE8; &quot;come as you are&quot;. <br>La macchina tutta intera sar&#xE0; inserita in un posto auto ordinato per numero di targa.</p><p>Se ad esempio all&apos;ingresso viene letta la targa AA 000, l&apos;auto viene inserita nel reparto AA alla posizione 000, all&apos;arrivo della targa AA 001 , stesso reparto AA &#xA0;posto 001, subito sulla destra della &#xA0;AA 000, e cosi via per tutte le targhe.<br><br>Questo avrebbe aiutato nel trovare velocemente l&apos;auto del cliente, mostrargli lo stato dei suoi pneumatici e proporre il servizio di sostituzione.<br>Per soddisfare questa richiesta il parcheggio provvede alla ricerca del veicolo utilizzando il numero di targa, per poi collegarsi con il posto auto robotizzato (es. AA 000) che fornisce le informazioni su tutte le componenti dell&apos;auto.<br><br>Gli fanno notare che questa strategia ha anche un altro grande vantaggio, non dover ri-assemblare le vetture ogni volta che l&apos;utente vorr&#xE0; ritirare la sua auto per andare a lavoro. <br>Anche se &#xE8; corretto dire che i robot utilizzati dall&apos;altro team sono efficientissimi nel loro compito, assemblano e disassemblano in pochissimo tempo. Quando non ci sono tante richieste di ritiro e deposito sono veloci come il tempo impiegato dalla soluzione &quot;NoSeQueL&quot; che deve solo recuperare l&apos;auto. <br>C&apos;&#xE8; da dire che il vero collo di bottiglia non sono i robot che assemblano e disassemblano ma il tempo necessario al recupero di tutte le singole parti delle auto.</p><p><br>Il team &quot;NoSeQueL&quot; si comporta comunque correttamente e riconosce che la soluzione del Team SeQueL &#xE8; sicuramente pi&#xF9; efficiente nelle richieste incrociate dove si utilizzano pi&#xF9; auto per raccogliere informazioni, ad esempio: Quante auto nel parcheggio hanno bisogno di sostituire i pneumatici? La risposta a questa domanda avrebbe permesso di acquistare delle scorte a prezzi vantaggiosi con alta probabilit&#xE0; di vendita del servizio, un bel vantaggio.<br>Nella soluzione NoSeQueL sarebbe servito collegarsi a tutti i posti auto del parcheggio per soddisfare la stessa richiesta invece del solo reparto pneumatici.</p><p>Il proprietario del parcheggio non riesce a decidersi e vede pregi e difetti delle due soluzioni, cosi decide di provarle entrambe.</p><p>Fatto strano, il proprietario decide di chiamare i parcheggi con i nomi dei due team o quasi, il suo reparto marketing gli ha detto che SeQueL &#xE8; difficile da scrivere e se si tolgono le minuscole la pronuncia &#xE8; sempre la stessa, quindi SQL. Stesso per il team NoSeQueL ma in questo caso gli &#xE8; stata lasciata la &quot;o&quot; NoSQL.</p><p>TO BE CONTINUED ...</p>]]></content:encoded></item><item><title><![CDATA[Considerazioni sulla Scalabilità]]></title><description><![CDATA[Quali sono i vantaggi di un'applicazione in grado di dimensionarsi dinamicamente?]]></description><link>https://periscope.iad2.it/cluster-autoscaling/</link><guid isPermaLink="false">5eb4049a079dbd0001e966e0</guid><category><![CDATA[cloud]]></category><category><![CDATA[microservices]]></category><dc:creator><![CDATA[Daniele Fiungo]]></dc:creator><pubDate>Fri, 08 May 2020 13:47:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1586779312576-2e3acb9c7f70?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1586779312576-2e3acb9c7f70?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Considerazioni sulla Scalabilit&#xE0;"><p>Quali sono i vantaggi di un&apos;applicazione in grado di dimensionarsi dinamicamente?</p><h2 id="riduzione-dei-costi-di-infrastruttura-it">Riduzione dei costi di Infrastruttura IT</h2><p>Variando il numero delle repliche, variano anche le risorse impiegate da ogni singolo applicativo / microservizio.</p><p>Acquistando risorse in base all&apos;effettivo tempo di utilizzo come avviene nei Public Cloud la matematica &#xE8; piuttosto semplice (repliche per costo al minuto)</p><p>Quando invece le risorse sono di propriet&#xE0; e si parla di Private Cloud o pi&#xF9; in generale infrastrutture private, la riduzione dei costi pu&#xF2; essere ottenuta attraverso la condivisione.</p><p>In generale per dimensionare le risorse necessarie all&apos;esecuzione di un applicativo si prende come riferimento il <code>caso peggiore</code> dove si ipotizza un traffico / carico massimale e si acquistano risorse capaci di gestire quel carico. <br>Se la stima &#xE8; stata eseguita correttamente, l&apos;utilizzo effettivo sar&#xE0; molto inferiore alle capacit&#xE0; acquistate. Un p&#xF2; come avere una Ferrari per girare in citt&#xE0;, al semaforo tutti rimarranno impressionati dall&apos;accelerazione, ma il motore sar&#xE0; raramente al massimo della potenza. </p><p>La virtualizzazione consente di mitigare questo overprovisioning allocando risorse virtuali in quantit&#xE0; superiore a quelle reali.<br>Questo scenario nei casi comuni prevede un numero di repliche stabili che hanno un effettivo utilizzo di risorse anche quando queste non vengono utilizzate (spazio disco, allocazione ram).</p><p>Se l&apos;applicazione invece &#xE8; in grado di diminuire o aumentare le repliche senza produrre effetti collaterali apprezzabili e quindi di <code>scalare</code>, le risorse nuovamente disponibili possono essere ridistribuite attribuendo delle priorit&#xE0; ai carichi di lavoro: Transazioni OnLine &gt; Analisi Dati &gt; Processi Batch</p><h2 id="business-continuity">Business Continuity</h2><p>Un&apos;applicazione progettata per operare su apparati non affidabili &#xE8; nativamente in grado di spostare i suoi carichi di lavoro da un centro di calcolo ad un altro.</p><p>Se questa applicazione ad esempio viene eseguita in un Hybrid Cloud &#xE8; facile immaginare che in caso di interruzione del servizio nella parte Private i carichi di lavoro possano essere assorbiti nella parte Public e viceversa.</p><p>Attraverso i principali Public Cloud provider &#xE8; anche possibile distribuire le applicazioni su diverse <code>region</code> (aree geografiche) o all&apos;interno della stessa region su pi&#xF9; <code>availability zone</code> (suddivisioni indipendenti delle region inter-connesse con link a bassissima latenza) per ridondanza.</p><p>Utilizzando gli accorgimenti architetturali necessari e avvalendosi di questi strumenti &#xE8; perci&#xF2; possibile garantire livelli di business continuity molto elevati senza aumentare i costi ( es connettivit&#xE0; con SLA elevati, apparati in standby , costi di gestione, etc)</p><h2 id="aggiornamenti-e-miglioramenti-infrastrutturali">Aggiornamenti e Miglioramenti Infrastrutturali</h2><p>Le applicazioni non sono statiche e pi&#xF9; o meno velocemente aggiungono nuove funzionalit&#xE0;, aumentano la base degli utenti e gli apparati utilizzati per eseguire i carichi di lavoro sono soggetti ad obsolescenza.</p><p>L&apos;infrastruttura su cui questi carichi applicativi vengono eseguiti pu&#xF2; essere gestita seguendo due principi <code>Pet</code> (animale domestico) o <code>Cattle</code> (Bestiame).<br></p><p>Nell&apos;approccio Pet, le infrastrutture sono gestite in modo diretto ed eventualmente differenziato in relazione ai carichi di lavoro. Questo situazione crea una sorta di legame tra applicazione e server, (es. struttura del filesystem, indirizzi di rete, configurazione dei permessi, servizi di sistema, etc) difficile da spezzare.</p><p>In contrapposizione l&apos;approccio Cattle chiede ai carichi di lavoro di astrarre tutte le risorse necessarie. Le applicazioni non possono fare affidamento su un ambiente particolare ma solo su risorse astratte che una qualsiasi infrastruttura pu&#xF2; &#xA0;&quot;implementare&quot; e rendere disponibili ai carichi applicativi. <br>In pratica si chiede alle applicazioni di considerare le risorse come volatili ed effimere (pezzi di ferro), che in caso di problemi non vengono sistemate ma semplicemente rimpiazzate.</p><p>Seguendo questa filosofia, effettuare un aggiornamento infrastrutturale diventa semplice la cancellazione di una replica, nell&apos;attesa che questa venga ricreata in automatico su apparati di nuova generazione.</p><h2 id="performance-e-scalabilit-">Performance e Scalabilit&#xE0;</h2><p>Quando si dimensiona un sistema in base al caso peggiore, &#xA0;il business spera sempre di sbagliare per difetto. </p><p>Il sogno proibito di ogni imprenditore &#xE8; quello di dover correre ai ripari dopo aver sbagliato una previsione di circa 1.000 utenti paganti a fronte di 100.000 reali.<br>Anche se questo &#xE8; quello che potremmo definire come Happy Problem dal punto di vista tecnologico e architetturale potrebbe diventare un vero e proprio incubo.</p><p>Adeguare un applicativo progettato o costruito con strumenti non adatti a scalare di ordini di grandezza (es. database relazionali ) pu&#xF2; essere una operazione assai ardua, composta da una serie di interventi che possono essere costosi , rischiosi o complicati.</p><p>In queste situazioni, le architetture a microservizi si comportano molto bene permettendoci di:</p><ul><li>scalare indipendentemente ciascun servizio (es. il servizio di Ricerca Articoli pu&#xF2; essere sicuramente pi&#xF9; <code>congestionato</code> di un servizio registrazione utenti ) </li><li>aggiungere e rimuovere server per far fronte ad un carico immediatamente (anche senza intervento manuale) &#xA0;pagandoli al minuto o acquistandoli solo in momenti successivi</li></ul><h2 id="conclusioni">Conclusioni</h2><p>Cloud Computing, Virtualizzazione, Containerizzazione, Progettazione a risorse infinite, etc, &#xA0;sono <strong>strumenti</strong> indispensabili per la costruzione di applicazioni performanti, scalabili, localizzate su una singola regione o distribuite su scala mondiale ed utilizzare ( pagando l&apos;effettivo utilizzo) infrastrutture di ultima generazione.</p><p>La vita quotidiana ci insegna che possedere uno strumento non ci permette automaticamente di godere di tutti i benefici/servizi che questo pu&#xF2; offrire, se non li si utilizza adeguatamente si rischia di avere effetti potenzialmente devastanti.</p><p>Utilizzare le tecniche architetturali e le tecnologie pensate per sfruttare al massimo questi strumenti non &#xE8; banale e richiede una formazione costante. </p><p>La scelta, delle <code>-ilities</code> architetturali, di un&apos;approccio a microservizi o monolitico, coreografia o orchestrazione, ACID o consistenza eventuale sono solo alcuni esempi delle domande che ci si dovrebbe porre per sfruttare al meglio gli strumenti a nostra disposizione. </p><p>Sono proprio queste scelte frutto delle conoscenza della creativit&#xE0; &#xA0;che influenzano il successo o l&apos;insuccesso di un progetto, quelle pennellate di un quadro che in altri contesti chiamiamo arte.</p>]]></content:encoded></item><item><title><![CDATA[🚀 WebSocket, NodeJS ed Emoji in 10 minuti (forse 15 😉)]]></title><description><![CDATA[Come creare una comunicazione realtime tra più client attraverso i WebSocket in meno di 100 righe di codice 💪🏻]]></description><link>https://periscope.iad2.it/nodejs-websocket-and-emoji-in-10-minuti/</link><guid isPermaLink="false">5e8993b27b58730001d3fc69</guid><category><![CDATA[nodejs]]></category><category><![CDATA[tutorial]]></category><category><![CDATA[websocket]]></category><dc:creator><![CDATA[Fabio Valerio Romano]]></dc:creator><pubDate>Thu, 09 Apr 2020 07:12:15 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1526297003708-f5a1c2c9c6e7?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1526297003708-f5a1c2c9c6e7?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="&#x1F680; WebSocket, NodeJS ed Emoji in 10 minuti (forse 15 &#x1F609;)"><p>Lo scopo finale &#xE8; quello di creare un canale WebSocket che sia in grado di mandare lo stesso messaggio in real-time a pi&#xF9; client connessi al medesimo WebSocket Server.</p><h2 id="cosa-una-websockect">Cosa &#xE8; una WebSockect</h2><p>Una WebSocket viene utilizzata per creare un canale bidirezionale che permette di instaurare una comunicazione real-time tra Client e Server</p><h2 id="-1-min-creiamo-il-progetto-nodejs-">(1 min) Creiamo il progetto (NodeJS)</h2><p>Se avete gi&#xE0; installato NodeJS avete gi&#xE0; tutto il necessario, altrimenti (<strong><a href="https://nodejs.org/it/download/"><strong>Nodejs</strong></a></strong>).</p><pre><code class="language-shell">$ npm init -y</code></pre><h2 id="-3-min-come-aprire-una-websocket-server">(3 min) Come aprire una WebSocket Server </h2><p>Per questo progetto utilizzeremo la <a href="https://github.com/websockets/ws">Libreria ws</a> che ci permetter&#xE0; di implementare una WebSocket lato Client e Server in modo semplice e immediato. Installiamo la libreria con il comando:</p><pre><code class="language-shell">$ npm install ws</code></pre><p>Creiamo su un file <code>ws.js</code> un semplice WebSocket Server nel quale viene aperta la porta 8080 in attesa di nuove connessioni.</p><pre><code class="language-javascript">const WebSocket = require(&quot;ws&quot;);
const wss = new WebSocket.Server({port: 8080});
module.exports = wss;</code></pre><p>Creiamo un file <code>server.js</code> e importiamo il modulo <code>(&quot;./ws&quot;)</code>. Utilizziamo il metodo <code>.on</code> di wss per intercettare gli eventi di connessione che producono delle WebSocket, ovvero, i canali di comunicazione tra il server e chi si &#xE8; connesso alla WebSocket.</p><p>Ogni qual volta viene scatenato l&#x2019;evento di connessione e di conseguenza il Client si connette al Server Websocket viene aggiunto il canale di comunicazione tra Server e Client all&#x2019;array <code>connectedClients</code>.</p><pre><code class="language-JavaScript">const wss = require(&quot;./ws&quot;);
const connectedClients = [];
wss.on(&quot;connection&quot;, ws =&gt; { connectedClients.push(ws);});</code></pre><p>Creiamo un nuovo file <code>generator.js</code> che utilizzeremo per generare una stringa di 4 emoji casuali da un array di emoji. Definiamo una funzione <code>generator</code> che prende come parametro un oggetto composto dalla funzione <code>callback</code>, che come vedremo in seguito si occuper&#xE0; di inviare la stringa ai Client connessi, e dal <code>maxTime</code> che definisce l&#x2019;intervallo di tempo tra un invio e l&#x2019;altro.</p><pre><code class="language-JavaScript">

const dictionary = [&quot;&#x1F60E;&quot;, &quot;&#x1F95D;&quot;, &quot;&#x1F680;&quot;, &quot;&#x1F4A5;&quot;, &quot;&#x1F433;&quot;, &quot;&#x26BD;&#xFE0F;&quot;, &quot;&#x1F4A9;&quot;, &quot;&#x1F50C;&quot;, &quot;&#x1F41B;&quot;];

function generator({ callback, maxTime }) {  
let emoString = generateRandom();  
callback(emoString);  

setInterval(() =&gt; {    emoString = generateRandom();  
callback(emoString);  }, Math.floor(Math.random() * maxTime));

function generateRandom() {    
return `${pickEmojii()}${pickEmojii()}${pickEmojii()}${pickEmojii()}`;  }

function pickEmojii() {    return dictionary[Math.floor(Math.random() * dictionary.length)];  }}

module.exports = generator;</code></pre><p>Quindi nel file <code>server.js</code> importiamo il modulo &#xA0;<code>(&quot;./generator&quot;)</code>. E richiamiamo la funzione <code>generator</code>, passiamo l&apos;oggetto come parametro e definiamo le propriet&#xE0; <code>maxTime</code> e <code>callback</code>. </p><h2 id="-3-min-gestire-l-aggiornamento-su-tutti-i-client">( 3 min ) Gestire l&apos;aggiornamento su tutti i client</h2><p>Ragionamento che spiega come modificare il server per aggiornare tutti i ws ogni volta che la emoString cambia</p><p>Nella <code>callback</code> andremo a scorrere l&#x2019;array <code>connectedClients</code> e per ogni connessione invieremo la stessa stringa di emoji.</p><p>Il file <code>server.js</code> &#xA0;quindi apparir&#xE0; in questo modo:</p><pre><code class="language-JavaScript">const wss = require(&quot;./ws&quot;);
const generator = require(&quot;./generator&quot;);
const connectedClients = [];

wss.on(&quot;connection&quot;, ws =&gt; {  
connectedClients.push(ws);
});

generator({  maxTime: 20000,  callback: emoji =&gt; {    		         			connectedClients.forEach(ws =&gt; {
      ws.send(emoji);     
     });  
}});</code></pre><p>Quindi &#xA0;per avviare il server che sar&#xE0; in ascolto sulla porta 8080, da terminale eseguire il comando:</p><pre><code class="language-shell">$ node server.js</code></pre><h2 id="-3-min-il-client-w-stackblitz-">(3 min ) il Client (w/StackBlitz )</h2><p>StackBlitz &#xE8; un editor online per Web apps.</p><p>Su <a href="https://stackblitz.com/">StackBlitz</a>, si possono creare nuovi progetti e ottenere l&apos;embed code dal link &quot;Share&quot; nella barra di navigazione in questo modo:</p><figure class="kg-card kg-image-card"><img src="https://periscope.iad2.it/content/images/2020/04/stackbliz.JPG" class="kg-image" alt="&#x1F680; WebSocket, NodeJS ed Emoji in 10 minuti (forse 15 &#x1F609;)" loading="lazy"></figure><p>Il lato Client della websocket &#xE8; su <a href="https://stackblitz.com/edit/simple-ws-client?file=index.js"><strong>StackBlitz</strong></a><br>Con il file &#xA0;<code>index.js</code> creiamo la connessione WebSocket sulla porta 8080, <code>socket.addEventListener</code> si mette in ascolto della realizzazione dell&#x2019;evento <code>message</code>. Con l&#x2019; <code>event.data</code> prendiamo i dati dell&#x2019;evento, e quindi il contenuto del messaggio. All&#x2019;interno di <code>.data</code> sar&#xE0; presente la stringa di emoji inviata dal Server.</p><pre><code class="language-JavaScript">// Import stylesheets
import &quot;./style.css&quot;;

// Write Javascript code!
const appDiv = document.getElementById(&quot;app&quot;);
// Create WebSocket connection.
const socket = new WebSocket(&quot;ws://localhost:8080/&quot;);

// Connection opened
socket.addEventListener(&quot;open&quot;, function(event) {
  socket.send(&quot;Hello Server!&quot;);
});

// Listen for messages
socket.addEventListener(&quot;message&quot;, function(event) {
  appDiv.innerHTML = event.data;
});
</code></pre><p>creiamo un file index.html per la visualizzazione delle emoji:</p><figure class="kg-card kg-image-card"><img src="https://periscope.iad2.it/content/images/2020/04/html.JPG" class="kg-image" alt="&#x1F680; WebSocket, NodeJS ed Emoji in 10 minuti (forse 15 &#x1F609;)" loading="lazy"></figure><p>Risultato finale: </p><figure class="kg-card kg-image-card"><img src="https://lh5.googleusercontent.com/zkrN5FoO80vEfQ-QzQRGTQtYWsH8bYMkJ8_gPnMiebsK35VLoxOGcMb3Ujf7ta9BlLknoW94fsx9yiILzVwImJowuX3OFA9SWrq4vcMfSglyZjxuI92pMy9K4wZmL8IfvYXDcl6T" class="kg-image" alt="&#x1F680; WebSocket, NodeJS ed Emoji in 10 minuti (forse 15 &#x1F609;)" loading="lazy"></figure><h2 id="-1-min-compiacersi-del-lavoro-fatto-">( 1 min ) Compiacersi del lavoro fatto &#xA0;&#x1F4AA;&#x1F3FB;</h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://periscope.iad2.it/content/images/2020/04/shiba-inu-is-happy-for-you-41662938.png" class="kg-image" alt="&#x1F680; WebSocket, NodeJS ed Emoji in 10 minuti (forse 15 &#x1F609;)" loading="lazy"></figure><h2 id="-ngrok-codice-sorgente-e-bonus-vari-">+ (ngrok, codice sorgente e bonus vari)</h2><p>Per esporre il nostro localhost utilizzeremo <a href="https://ngrok.com/download">Ngrok</a>. Ngrok ti consente di esporre su Internet un server web in esecuzione sul tuo computer locale. Basta dire a Ngrok su quale porta il tuo server Web &#xE8; in ascolto con il comando:</p><pre><code class="language-shell">$  ngrok http 8080</code></pre><p>In questo modo viene creato un tunnel tra il server messo a disposizione da Ngrok e l&#x2019;eseguibile che gira sulla tua macchina localmente. Tutto quello che arriva sull&#x2019;host di Ngrok viene girato sulla porta 8080.</p><p>all&apos;avvio Ngrok, verr&#xE0; visualizzata un&apos;interfaccia utente nel tuo terminale con l&apos;URL pubblico del tunnel e altre informazioni sullo stato delle connessioni effettuate.</p><p>Nella parte inferiore della User Interface sono presenti tutte le chiamate HTTP che vengono effettuate dai client.</p><h2 id="-nei-prossimi-episodi">+ Nei prossimi episodi</h2><p>Creare un gioco con i Ws</p><figure class="kg-card kg-image-card"><img src="https://www.ultimavoce.it/wp-content/uploads/2017/10/to-be-continued.jpg" class="kg-image" alt="&#x1F680; WebSocket, NodeJS ed Emoji in 10 minuti (forse 15 &#x1F609;)" loading="lazy"></figure>]]></content:encoded></item></channel></rss>