<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Serena Sensini</title>
    <description>The latest articles on DEV Community by Serena Sensini (@serenasensini).</description>
    <link>https://dev.to/serenasensini</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1175968%2F17fc37de-9dfd-4968-b026-f646542c3dc6.jpeg</url>
      <title>DEV Community: Serena Sensini</title>
      <link>https://dev.to/serenasensini</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/serenasensini"/>
    <language>en</language>
    <item>
      <title>Quando muore un Pod</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Thu, 07 Dec 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/quando-muore-un-pod-21gj</link>
      <guid>https://dev.to/serenasensini/quando-muore-un-pod-21gj</guid>
      <description>&lt;p&gt;Quando un &lt;strong&gt;container fallisce&lt;/strong&gt; e un &lt;strong&gt;Pod muore&lt;/strong&gt; , possono esserci diverse ragioni, e queste sono sempre descritte all’interno dei &lt;em&gt;termination messages&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Questo tipo di dato è &lt;em&gt;fondamentale&lt;/em&gt; per comprendere quali siano gli eventi che hanno portato all’arresto dell’applicazione e quindi per permettere ai team di indagare sull’origine della causa.&lt;/p&gt;

&lt;p&gt;Di default, questi messaggi risiedono nella cartella &lt;em&gt;/dev/termination-log&lt;/em&gt;: questo vuol dire che, quando il Pod termina, il campo relativo al suo &lt;em&gt;status&lt;/em&gt; viene aggiornato con le informazioni che riguardano le cause di arresto, come mostrato di seguito.&lt;/p&gt;

&lt;p&gt;Creando un Pod come il seguente, facciamo sì che il container attenda 30 secondi prima di stampare in output il messaggio “&lt;em&gt;Good&lt;/em&gt; &lt;em&gt;night&lt;/em&gt;!”, riportandone il contenuto nel path di default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
 name: demo
spec:
 containers:
 - name: demo
 image: centos
 command: ["/bin/sh"]
 args: ["-c", "sleep 30 &amp;amp;&amp;amp; echo Good night! &amp;gt; /dev/termination-log"]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Questo messaggio è recuperabile sfruttando il campo &lt;em&gt;status&lt;/em&gt; del template del Pod, in questo modo: utilizzando il comando &lt;em&gt;kubectl get pod&lt;/em&gt; e recuperando l’output in formato yaml, dovremmo ottenere un risultato simile al seguente, dove il campo &lt;em&gt;status&lt;/em&gt; contiene al suo interno una serie di dettagli sullo stato dei container e della causa del loro arresto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pod demo --output=yaml

&amp;gt;&amp;gt;&amp;gt;
apiVersion: v1
kind: Pod
...
 lastState:
 terminated:
 containerID: ...
 exitCode: 0
 finishedAt: ...
 message: | #################
 Good night! ################
 ...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si è già detto che Kubernetes recupera i messaggi di arresto dal file &lt;em&gt;/dev/termination-log&lt;/em&gt;; qualora volessimo però specificare un path diverso, potremmo utilizzare il campo &lt;strong&gt;terminateMessagePath&lt;/strong&gt; all’interno delle specifiche del container.&lt;/p&gt;

&lt;p&gt;Kubernetes utilizzerà il contenuto del file specificato per popolare il messaggio di stato del container sia in caso di successo che di errore.&lt;/p&gt;

&lt;p&gt;Il messaggio di terminazione deve essere un breve stato finale, ad esempio un messaggio di errore rispetto a dei test o delle asserzioni che controllano lo stato di integrità del pod; dev’essere breve perché kubelet tronca i messaggi più lunghi di 4096 byte.&lt;/p&gt;

&lt;p&gt;Un’altra nota interessante è che &lt;strong&gt;non&lt;/strong&gt; è possibile impostare il percorso del messaggio di terminazione &lt;strong&gt;dopo l’avvio di un pod&lt;/strong&gt; : questo deve essere impostato prima del suo avvio, altrimenti verrà utilizzato quello di default.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
 name: demo
spec:
 containers:
 - name: demo
 image: centos
 terminationMessagePath: "/tmp/my-custom-log-file"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Risorse utili
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/debug/debug-application/determine-reason-pod-failure/"&gt;Documentazione ufficiale&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Voglio diventare... SEO Specialist</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/voglio-diventare-seo-specialist-57fp</link>
      <guid>https://dev.to/serenasensini/voglio-diventare-seo-specialist-57fp</guid>
      <description>&lt;h1&gt;
  
  
  Descriviti in 100 parole
&lt;/h1&gt;

&lt;p&gt;Sono una &lt;strong&gt;SEO Specialist&lt;/strong&gt; , ovvero una &lt;em&gt;specialista dell’ottimizzazione dei siti web per i motori di ricerca&lt;/em&gt;. Negli anni mi sono occupata sia di realtà locali, che di realtà internazionali e al momento lavoro prevalentemente su ecommerce &lt;a href="https://magento-ecommerce.it/"&gt;Magento&lt;/a&gt; e &lt;a href="https://www.shopify.com/it"&gt;Shopify&lt;/a&gt; - molti dei quali nel settore fashion.&lt;/p&gt;

&lt;p&gt;Sono una persona con una grande &lt;strong&gt;passione&lt;/strong&gt; per ciò che fa, ho la fortuna di lavorare in un settore che mi piace, mi trasmette passione e mi genera un desiderio di scoperta continua. La SEO è un grande amore per me, oltre che un lavoro.&lt;/p&gt;

&lt;p&gt;Ma il mio cuore non batte solo per il &lt;strong&gt;digital marketing&lt;/strong&gt; , sono anche amante del &lt;em&gt;cinema&lt;/em&gt; e laureata in &lt;em&gt;filosofia&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  In cosa consiste il ruolo di SEO Specialist?
&lt;/h1&gt;

&lt;p&gt;Il mio lavoro consiste in una serie di &lt;strong&gt;ottimizzazioni&lt;/strong&gt; legate ai siti web e alle piattaforme ecommerce che permettono di ottenere visibilità sui motori di ricerca. Le tre macro aree su cui lavora un SEO sono: &lt;em&gt;tecnica, contenutistica e off-site&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Per quanto riguarda la parte più &lt;strong&gt;tecnica&lt;/strong&gt; ogni piattaforma online richiede spesso gli interventi di un SEO con lavori come migrazioni, setting di tag html o generazione di &lt;em&gt;sitemap&lt;/em&gt; e file &lt;em&gt;robots.txt&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La parte &lt;strong&gt;contenutistica&lt;/strong&gt; riguarda invece tutti quei contenuti che tipicamente il bot del motore di ricerca ritrova su una pagina, rientrano in questa area i lavori di &lt;em&gt;analisi semantica, ricerca keywords, stesura dei metadati&lt;/em&gt;, ecc…&lt;/p&gt;

&lt;p&gt;Infine, il ramo &lt;strong&gt;off-site&lt;/strong&gt; riguarda tutto ciò che avviene al di fuori di un sito web, ma ne &lt;em&gt;influenza&lt;/em&gt; la &lt;strong&gt;reputazione&lt;/strong&gt; agli occhi del motore di ricerca. Un esempio di ciò è l’attività di link building.&lt;/p&gt;

&lt;h1&gt;
  
  
  Qual è la soft skill più importante che deve possedere una SEO Specialist?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Curiosità&lt;/strong&gt; senza ombra di dubbio, in quanto si tratta di un’attività in &lt;em&gt;fermento&lt;/em&gt; ed &lt;em&gt;evoluzione&lt;/em&gt;, che necessita studi continui.&lt;/p&gt;

&lt;h1&gt;
  
  
  La maggior parte di noi utilizza i social per parlare dei propri successi, ma la realtà è che siamo quel che siamo grazie al 90% dei nostri errori. Racconta il tuo più grande fallimento da quando lavori nel settore, che però ti ha reso ciò che sei.
&lt;/h1&gt;

&lt;p&gt;Non c’è mai stato un vero e proprio caso di fallimento, ma spesso capitano gli errori. Gli errori avvengono nelle carriere di ciascuno di noi e sono ciò che ci permette sempre di crescere e avanzare, evolverci! Ogni santo giorno imparo qualcosa soprattutto grazie agli errori che compio.&lt;/p&gt;

&lt;h1&gt;
  
  
  Come fare per diventare una SEO Specialist?
&lt;/h1&gt;

&lt;p&gt;Si tratta di un percorso composto da due elementi necessari: tanto &lt;strong&gt;studio&lt;/strong&gt; e tanta &lt;strong&gt;pratica&lt;/strong&gt;. Ho iniziato anni fa letteralmente lavorando gratis su progetti personali e non solo, studiando molto nel mentre. In definitiva, in fase di colloquio, conta ciò che si sa effettivamente, non tanto le certificazioni presentate.&lt;/p&gt;

&lt;h1&gt;
  
  
  Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?
&lt;/h1&gt;

&lt;p&gt;Al momento sono molto felice del mio lavoro attuale.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?
&lt;/h1&gt;

&lt;p&gt;Si tratta di un tema ampio, che non coinvolge solo l’ambito STEM. Personalmente ritengo ci siano realtà dove è più o meno accentuato il gender gap. &lt;strong&gt;Come superarlo?&lt;/strong&gt; Partendo da un educazione collettiva, fin dall’infanzia, alla meritocrazia.&lt;/p&gt;

&lt;h1&gt;
  
  
  Risorse utili
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Letture consigliate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://amzn.to/47KvEYN"&gt;SEO Checklist&lt;/a&gt; di Verdiana Amorosi&lt;a href="https://amzn.to/47HvO2K"&gt;SEO Audit Avanzato&lt;/a&gt; di Marco Maltraversi, Davide Prevosto e Giovanni Sacheli&lt;a href="https://amzn.to/47iZinT"&gt;Manuale di SEO Gardening&lt;/a&gt; di Francesco Margherita&lt;a href="https://amzn.to/3R5YEV7"&gt;Keywords research&lt;/a&gt; Avanzata di Alvise Canal&lt;a href="https://amzn.to/3G6sToz"&gt;Link Building&lt;/a&gt; di Ivano Di Biasi&lt;a href="https://amzn.to/47IYXLh"&gt;SEO per E-commerce&lt;/a&gt; di Gaetano Romeo&lt;a href="https://amzn.to/3QKqNjq"&gt;The Art of SEO&lt;/a&gt; di Eric Enge, Jesse C. Stricchiola, Stephan Spencer&lt;/p&gt;

&lt;h2&gt;
  
  
  Corsi consigliati
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://academy.webing.it/corsi/corso-deep-seo-marco-maltraversi/"&gt;Deep SEO di Marco Maltraversi&lt;/a&gt;&lt;a href="https://fattoretto.agency/seo/ecommerce/"&gt;SEO per E-commerce di Massimo Fattoretto&lt;/a&gt;&lt;a href="https://techseo.pro/"&gt;Tech SEO Pro - Advanced Technical SEO Course di Kristina Azarenko&lt;/a&gt;&lt;a href="https://www.coursera.org/specializations/seo"&gt;Search Engine Optimization (SEO) Specialization di University California Davis&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Contatti
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/seo-mariapaloschi/"&gt;Profilo LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Voglio diventare... SEO Strategist</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Tue, 21 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/voglio-diventare-seo-strategist-2emh</link>
      <guid>https://dev.to/serenasensini/voglio-diventare-seo-strategist-2emh</guid>
      <description>&lt;h1&gt;
  
  
  Descriviti in 100 parole
&lt;/h1&gt;

&lt;p&gt;Ciao, sono Francesca e sono un’amante dei &lt;em&gt;gatti&lt;/em&gt;, del &lt;em&gt;buon cibo&lt;/em&gt; e del &lt;strong&gt;True Crime&lt;/strong&gt;. Sono_leggermente_ appassionata di questioni di genere, tanto da aver dedicato la mia tesi di laurea magistrale proprio agli stereotipi nelle serie TV (ovviamente &lt;em&gt;Crime&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;A livello professionale mi definisco un’umanista a cui piacciono i dati. &lt;/p&gt;

&lt;p&gt;Dopo essermi laureata in Studi Internazionali e Scienze della Comunicazione, ho attraversato per qualche anno la fase critica dei tirocini (poco) formativi e sottopagati, senza smettere però di formarmi in autonomia e con progetti personali.&lt;/p&gt;

&lt;p&gt;Per puro caso nel 2018 sono arrivata in un’agenzia &lt;strong&gt;SEO&lt;/strong&gt; , nella quale sono rimasta fino a pochi giorni fa. Sono infatti in procinto di iniziare una nuova avventura come &lt;em&gt;Content Specialist&lt;/em&gt; in un’altra realtà!&lt;/p&gt;

&lt;h1&gt;
  
  
  In cosa consiste il ruolo di SEO Strategist?
&lt;/h1&gt;

&lt;p&gt;Non sono sicura che quello di SEO Strategist sia un Job Title effettivamente “codificato”. È un ruolo che mi sono attribuita perché mi sembrava idoneo a definire la mia attività quotidiana all’interno del team. Non avendo le competenze pratiche a livello informatico per potermi definire una SEO Specialist a tutto tondo, ma nemmeno occupandomi esclusivamente di SEO Copywriting, ho pensato di “affibbiarmi” il titolo di &lt;strong&gt;stratega&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nel corso degli anni il mio ruolo è andato evolvendosi, passando dalla &lt;strong&gt;creazione&lt;/strong&gt; e &lt;strong&gt;ottimizzazione&lt;/strong&gt;  &lt;strong&gt;di&lt;/strong&gt;  &lt;strong&gt;contenuti&lt;/strong&gt; e definizione di &lt;strong&gt;piani&lt;/strong&gt;  &lt;strong&gt;editoriali&lt;/strong&gt; per i siti dei clienti, allo sviluppo di strategie basate sui dati, passando per &lt;strong&gt;SEO Audit&lt;/strong&gt; , ottimizzazioni tecniche e contenutistiche e &lt;strong&gt;follow-up&lt;/strong&gt; degli andamenti.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Riassumendo in poche parole: il SEO Strategist è una figura che analizza il settore e i dati organici a disposizione per sviluppare una strategia SEO a tutto tondo, sia On Site che Off Site e si affianca, laddove non arriva da solo, a figure IT per le implementazioni più consistenti.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Qual è la soft skill più importante che deve possedere una SEO Strategist?
&lt;/h1&gt;

&lt;p&gt;Credo siano necessarie diverse skills, tra cui la &lt;strong&gt;flessibilità&lt;/strong&gt;  &lt;strong&gt;mentale&lt;/strong&gt; e il &lt;strong&gt;problem&lt;/strong&gt;  &lt;strong&gt;solving&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ma credo che la regina delle soft skills per fare SEO sia il &lt;em&gt;pensiero laterale&lt;/em&gt;: mai come negli ultimi anni ci sono stati aggiornamenti dell’algoritmo di Google, che hanno rimescolato le carte e cambiato i fattori che determinano il posizionamento di un contenuto.&lt;/p&gt;

&lt;p&gt;Per quanto alcuni elementi di ranking non siano mai stati messi in discussione, è fondamentale saper &lt;em&gt;analizzare&lt;/em&gt;, cogliere i segnali e prendere delle decisioni spesso basate su dati a bassa storicità e sulla propria esperienza, pensando fuori dai canoni che potevano essere veri fino a qualche settimana prima (ovviamente partendo da un buon set di conoscenze teoriche e pratiche).&lt;/p&gt;

&lt;p&gt;Da persona quadrata quale sono, sono spesso rimasta stupita di quanto alcune decisioni_istintive_ abbiano portato più risultati di quelle prese &lt;em&gt;razionalmente&lt;/em&gt;, manuale alla mano.&lt;/p&gt;

&lt;h1&gt;
  
  
  La maggior parte di noi utilizza i social per parlare dei propri successi, ma la realtà è che siamo quel che siamo grazie al 90% dei nostri errori. Racconta il tuo più grande fallimento da quando lavori nel settore, che però ti ha reso ciò che sei.
&lt;/h1&gt;

&lt;p&gt;Sarò sincera: &lt;strong&gt;non sopporto i post motivazionali&lt;/strong&gt; , né tantomeno i professionisti su LinkedIn che usano lo storytelling per raccontare anche il più banale degli avvenimenti. Questo perché credo, come dici tu, che a formarci siano i nostri errori e i periodi neri che ovviamente non andiamo a raccontare sui social (guai risultare fragili e fallaci in questa_&lt;a href="https://amzn.to/40SiMO2"&gt;società della performance&lt;/a&gt;_!).&lt;/p&gt;

&lt;p&gt;Faccio fatica però ad associare il termine &lt;strong&gt;fallimento&lt;/strong&gt; all’ambito lavorativo. Nel corso di questi anni ho commesso diversi &lt;em&gt;errori&lt;/em&gt;, fortunatamente mai tanto gravi da compromettere il successo di un sito, ma ho sempre pensato che in questi casi è fondamentale &lt;strong&gt;prendersi la propria responsabilità&lt;/strong&gt; con l’azienda e con il cliente e intervenire per risolvere al meglio.&lt;/p&gt;

&lt;p&gt;Solo in questo modo si può imparare e non perseverare nell’errore, perché lo “sbattimento” affrontato la volta precedente non lo scorderemo con facilità. Questo ci renderà molto più responsabili e consapevoli delle nostre azioni.&lt;/p&gt;

&lt;p&gt;E poi bisogna anche imparare ad &lt;strong&gt;essere clementi con sé stessi/e&lt;/strong&gt; - come ripeto sempre, solo chi non fa, non sbaglia mai - a delegare e a fidarsi del proprio team.&lt;/p&gt;

&lt;h1&gt;
  
  
  Come fare per diventare una SEO Strategist?
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Forse andrò controcorrente&lt;/em&gt;, ma credo che per fare bene SEO sia importante avere una &lt;strong&gt;formazione umanistica&lt;/strong&gt; in Semiotica o in Comunicazione, non tanto per le competenze in sé (quelle si possono sempre acquisire con il tempo), quanto per la forma mentis più aperta che solo le facoltà umanistiche sanno darti.&lt;/p&gt;

&lt;p&gt;Questo non toglie che sia fondamentale integrare le competenze tecniche, magari con libri e&lt;br&gt;
corsi mirati. Indispensabile è fare pratica con i tool principali per la SEO (&lt;em&gt;&lt;a href="https://www.screamingfrog.co.uk/seo-spider/"&gt;Screaming Frog&lt;/a&gt;,&lt;a href="https://search.google.com"&gt;Search Console&lt;/a&gt;, &lt;a href="https://marketingplatform.google.com/intl/it/about/analytics/"&gt;GA4&lt;/a&gt;&lt;/em&gt;, ecc…) in modo da familiarizzare anche con l’interpretazione dei dati e facilitare la comprensione del &lt;strong&gt;processo causa-effetto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ho aperto il mio primo blog a 15 anni, ai tempi di Fotolog e MySpace, e iniziato a smanettare con HTML e CSS quando non sapevo nemmeno si chiamassero così: per me erano solo le “cose” che dovevo fare per personalizzare esteticamente il sito e mettere online i miei pensieri.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Credo proprio che il modo migliore per imparare sia questo: aprire un proprio sito e sbatterci la testa, andando a tentativi, sbagliando e applicando ciò che si è imparato.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?
&lt;/h1&gt;

&lt;p&gt;Il mio obiettivo a brevissimo termine, come anticipavo poco fa, è quello di buttarmi a capofitto nel nuovo &lt;strong&gt;ruolo&lt;/strong&gt;  &lt;strong&gt;di&lt;/strong&gt;  &lt;strong&gt;Content Specialist&lt;/strong&gt; che andrò a ricoprire.&lt;/p&gt;

&lt;p&gt;Onestamente sono molto fan del “&lt;em&gt;qui e ora&lt;/em&gt;” per quanto riguarda il lavoro, perché le ambizioni possono cambiare da un giorno all’altro, così come rimanere le stesse per anni.&lt;/p&gt;

&lt;p&gt;Di una cosa però sono certa: voglio &lt;strong&gt;continuare a lavorare con i contenuti&lt;/strong&gt; in modo da tenere sempre viva la mia passione per la &lt;em&gt;scrittura&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?
&lt;/h1&gt;

&lt;p&gt;Come dicevo in apertura, sono molto coinvolta nei discorsi che riguardano la disparità di genere e l’emancipazione femminile. Credo il gender gap in ambito STEM abbia radici legate allo &lt;em&gt;stereotipo&lt;/em&gt; per cui il maschio ragiona in maniera analitica, mentre la donna prende le proprie decisioni sulla base dell’emotività.&lt;/p&gt;

&lt;p&gt;Questo stereotipo si traduce fin dall’infanzia in una sorta di “ruolo assegnato”: le bambine vengono “naturalmente” spinte verso le materie umanistiche, mentre i bambini verso quelle scientifiche. &lt;strong&gt;Mancano dei modelli di riferimento storici e attuali&lt;/strong&gt; per le ragazze e, allo stesso tempo, TV e Social Network rappresentano la donna quasi sempre come figura secondaria, subalterna o limitata a particolari ambiti, a scapito delle sue competenze.&lt;/p&gt;

&lt;p&gt;Credo che per superare il gender gap ognuno dovrebbe fare il suo: bisognerebbe in primis intervenire fin dall’infanzia in famiglia e a scuola, dando la possibilità ai bambini e alle bambine di &lt;strong&gt;sviluppare con il gioco e lo studio le proprie potenzialità a 360°&lt;/strong&gt; , senza alcun tipo di limite attribuito al genere o inconsciamente imposto dalla società.&lt;/p&gt;

&lt;p&gt;In secondo luogo, è importantissimo creare una &lt;strong&gt;narrazione diversa del femminile&lt;/strong&gt; , rappresentando più spesso modelli positivi e di successo in ambito accademico (per la mia generazione sono state Margherita Hack e Rita Levi Montalcini, per quelle attuali potrebbe essere, ad esempio, Samantha Cristoforetti).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bisogna, in sostanza, superare l’errata convinzione secondo cui in base al genere si sia più portati per una materia, piuttosto che per un’altra.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;D’altronde, diversi &lt;a href="https://www.assolombarda.it/media/comunicati-stampa/osservatorio-talents-venture-e-steamiamoci"&gt;dati&lt;/a&gt; dimostrano come le donne iscritte alle facoltà STEM, seppur in quantità inferiore, abbiano delle carriere accademiche più brillanti rispetto ai colleghi uomini, palesando la totale &lt;em&gt;assurdità&lt;/em&gt; dello stereotipo che ci portiamo dietro da secoli.&lt;/p&gt;

&lt;h1&gt;
  
  
  Contatti
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/francesca-col%C3%B2-0ba61774/"&gt;Profilo LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Kubectl: namespace vs context</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Thu, 16 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/kubectl-namespace-vs-context-2ifo</link>
      <guid>https://dev.to/serenasensini/kubectl-namespace-vs-context-2ifo</guid>
      <description>&lt;p&gt;Se usi &lt;em&gt;kubectl&lt;/em&gt;, ti sarà capitato di vedere su qualche guida online il comando &lt;em&gt;set-context&lt;/em&gt;: ma a che serve?&lt;/p&gt;

&lt;p&gt;Partiamo dal concetto di &lt;strong&gt;namespace&lt;/strong&gt; : questo serve a creare un raggruppamento logico di oggetti Kubernetes, proprio come raggruppiamo i file all’interno di cartelle diverse nei sistemi operativi.&lt;/p&gt;

&lt;p&gt;Infatti, i namespaces forniscono un meccanismo per &lt;strong&gt;isolare gruppi di risorse&lt;/strong&gt; all’interno di un singolo cluster. I nomi delle risorse devono essere univoci all’interno di uno stesso namespace, ma non tra namespace diversi.&lt;/p&gt;

&lt;p&gt;I namespace sono pensati per essere usati in ambienti con molti utenti che appartengono a più team o progetti. Per i cluster con pochi utenti, non dovrebbe essere necessario creare dei namespace, come avviene in un ambiente di sviluppo locale.&lt;/p&gt;

&lt;p&gt;Il concetto e il termine &lt;strong&gt;context&lt;/strong&gt; in Kubernetes invece si applica solo sul lato client di Kubernetes, ovvero il luogo in cui esegui il comando &lt;em&gt;kubectl&lt;/em&gt;. Ad esempio, quando lavori tramite terminale ed esegui il comando seguente, stai dicendo a &lt;em&gt;kubectl&lt;/em&gt; che, in questo ambiente dove viene eseguito, deve considerare come contesto corrente (quindi come &lt;em&gt;ambiente di lavoro&lt;/em&gt;) il namespace chiamato &lt;em&gt;test&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config set-context --current --namespace=test

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Questo vuol dire che, lato server, Kubernetes non riconosce questo “contesto”, ma che d’ora in poi, quando andremo a eseguire dei comandi, &lt;em&gt;kubectl&lt;/em&gt; ci risparmierà la fatica di dover aggiungere il parametro che specifica il namespace dove quell’istruzione dev’essere eseguita.&lt;/p&gt;

&lt;p&gt;Di base, la differenza è la seguente: quando esegui un comando come questo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -n test

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;stai recuperando l’elenco dei pod situati nel namespace “&lt;em&gt;test&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;Se invece esegui il comando precedente senza specificare il namespace, questo risultato potrebbe variare dal namespace in cui l’utente è loggato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods

kubectl config current-context # per verificare il contesto corrente

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il contesto diviene quindi un modo perfetto per &lt;strong&gt;specificare&lt;/strong&gt; che, in &lt;em&gt;questa sessione&lt;/em&gt; di lavoro con il cluster Kubernetes a cui abbiamo acceduto, i comandi eseguiti fanno tutti riferimento a &lt;strong&gt;un&lt;/strong&gt; solo &lt;strong&gt;namespace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;L’altro vantaggio nell’utilizzo dei contesti sta nel &lt;strong&gt;definire un contesto per ogni namespace&lt;/strong&gt; , così da poter_switchare_ dall’uno all’altro a seconda del momento: immagina di creare un contesto per l’ambiente di sviluppo che si riferisce al namespace &lt;em&gt;dev&lt;/em&gt;, uno per l’ambiente di collaudo, che si chiama &lt;em&gt;preprod&lt;/em&gt;, e così via…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config set-context preprod-context --namespace=preprod

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Senza contare il fatto che è possibile creare più contesti per più cluster, specificando il parametro &lt;em&gt;–cluster&lt;/em&gt;, come mostrato di seguito: questo ci permetterà di passare non solo da un namespace all’altro, ma anche di cambiare il cluster di lavoro utilizzato!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config set-context preprod-context --cluster=mycluster --namespace=preprod

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Come sfruttare i diversi contesti creati? Basterà eseguire il comando &lt;em&gt;kubectl use-context&lt;/em&gt; per passare dall’uno all’altro!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config use-context preprod-context

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Tip
&lt;/h1&gt;

&lt;p&gt;Ma dove vengono salvate queste informazioni? Dai un’occhiata all’interno del file &lt;em&gt;~/.kube/config&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
clusters:
 - cluster:
 insecure-skip-tls-verify: true
 server: https://api.xxx.yyy.zzz:6443
 name: api-xxx-yyy-zzz:6443
contexts:
 - context:
 cluster: api-xxx-yyy-zzz:6443
 namespace: dev
 user: kube:admin/api-xxx-yyy-zzz:6443
 name: dev/api-xxx-yyy-zzz:6443/kube:admin
current-context: dev/api-xxx-yyy-zzz:6443/kube:admin
kind: Config
preferences: {}
users:
 - name: kube:admin/api-xxx-yyy-zzz:6443
 user:
 token: sha256~217823932n3j...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Certificati Self-Signed e OpenSSL</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Thu, 09 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/certificati-self-signed-e-openssl-5b19</link>
      <guid>https://dev.to/serenasensini/certificati-self-signed-e-openssl-5b19</guid>
      <description>&lt;h1&gt;
  
  
  Definizione
&lt;/h1&gt;

&lt;p&gt;Un certificato &lt;em&gt;self-signed&lt;/em&gt; è un certificato SSL/TSL non firmato da un’autorità di certificazione pubblica o privata, che viene invece firmato dal certificato CA personale.&lt;/p&gt;

&lt;h1&gt;
  
  
  Come funziona
&lt;/h1&gt;

&lt;p&gt;Il modo per richiedere un certificato SSL/TLS a pagamento da una nota autorità di certificazione, come Verisign o Comodo, è il seguente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creare una richiesta di firma del certificato (in inglese certificate signing request, abbreviato in CSR) con una chiave privata. Un CSR contiene dettagli su posizione, azienda e FQDN (ossia il nome di dominio completo);&lt;/li&gt;
&lt;li&gt;Inviare la CSR all’autorità CA attendibile;&lt;/li&gt;
&lt;li&gt;L’autorità (chiamata Certificate Authority, ossia CA) a cui abbiamo inviato la richiesta manderà indietro il certificato SSL firmato dall’autorità stessa e insieme a una chiave privata;&lt;/li&gt;
&lt;li&gt;A questo punto, sarà possibile quindi convalidare e utilizzare il certificato SSL con le diverse applicazioni.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se invece parliamo di un certificato self-signed, abbiamo bisogno di rivedere gli step precedenti, tenendo conto che la CA sarà interna.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creare un’autorità locale e la chiave privata CA, e quindi prendere il posto della CA;&lt;/li&gt;
&lt;li&gt;Creare una chiave privata per generare la CSR;&lt;/li&gt;
&lt;li&gt;Creare un certificato SSL tramite la CSR utilizzando la nostra CA root e la chiave privata della CA;&lt;/li&gt;
&lt;li&gt;Installare il certificato dell’autorità nel browser o nel sistema operativo per evitare avvisi di sicurezza.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Dove trovo le Certificate Authority del browser?
&lt;/h1&gt;

&lt;p&gt;In Firefox, è sufficiente accedere alle “&lt;em&gt;Impostazioni&lt;/em&gt;” e cercare la parola “&lt;em&gt;certificati&lt;/em&gt;”: lì sarà presente una copia dei certificati che ogni sistema tiene a memoria di quelle che sono le autorità conosciute:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bK94eQ0Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/firefox-certificates.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bK94eQ0Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/firefox-certificates.png" alt="" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Allo stesso tempo, utilizzando un certificato self-signed, il browser genererà un avviso di sicurezza simile al seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4anRK7QY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-certificate-warning.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4anRK7QY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-certificate-warning.png" alt="" width="688" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In ogni caso, è possibile forzare il browser ad accettare l’autorità di certificazione anche se creata, così da non vedere più nell’ambiente locale l’avviso di sicurezza una volta aggiunto all’elenco di quelli attendibili.&lt;/p&gt;

&lt;p&gt;Chiaramente, è possibile anche condividere il certificato della CA con il team di sviluppo per installarlo anche nei loro browser, ma è un approccio che si consiglia di utilizzare solo su ambiente di test.&lt;/p&gt;

&lt;h1&gt;
  
  
  Come creare un certificato self-signed
&lt;/h1&gt;

&lt;p&gt;Il procedimento che seguiremo è descritto nella figura seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qZ_mH1Sb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qZ_mH1Sb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema.png" alt="" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Come discusso in precedenza, dobbiamo creare il &lt;strong&gt;certificato principale della CA&lt;/strong&gt; affinché i browser possano fidarsi del certificato self-signed.&lt;/p&gt;

&lt;p&gt;Creiamo una directory denominata &lt;em&gt;openssl&lt;/em&gt; per salvare tutte le chiavi e i certificati generati.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir openssl &amp;amp;&amp;amp; cd openssl

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esegui il seguente comando per creare il file &lt;em&gt;rootCA.key&lt;/em&gt; e il file &lt;em&gt;rootCA.crt&lt;/em&gt;. Sostituisci a &lt;em&gt;example.com&lt;/em&gt; il tuo nome di dominio o l’indirizzo IP.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl req -x509 \
 -sha256 -days 356 \
 -nodes \
 -newkey rsa:2048 \
 -subj "/CN=exaple.com/C=US/L=San Francisco" \
 -keyout rootCA.key -out rootCA.crt

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c8idOC5s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c8idOC5s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema1.png" alt="" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizzeremo questi due file per firmare il certificato self-signed a breve.&lt;/p&gt;

&lt;p&gt;A questo punto, creiamo una &lt;strong&gt;chiave privata&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl genrsa -out server.key 2048

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NTOtoZXR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NTOtoZXR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema2.png" alt="" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Poi, iniziamo a lavorare alla &lt;strong&gt;CSR&lt;/strong&gt; tramite un file &lt;em&gt;csr.conf&lt;/em&gt; che conterrà tutte le informazioni circa la richiesta da inviare all’autorità:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;gt; csr.conf &amp;lt;&amp;lt;EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[dn]
C = US
ST = California
L = San Francisco
O = TheRedCode
OU = TheRedCode
CN = example.com

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
IP.1 = 192.168.1.5
IP.2 = 192.168.1.6

EOF

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NHd_b5lE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NHd_b5lE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema3.png" alt="" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A questo punto, possiamo generare il file &lt;em&gt;server.csr&lt;/em&gt; per richiedere la &lt;strong&gt;firma del certificato&lt;/strong&gt; tramite la chiave privata generata in precedenza con il seguente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl req -new -key server.key -out server.csr -config csr.conf

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ora la cartella dovrebbe contenere tre file: &lt;em&gt;csr.conf, server.csr&lt;/em&gt; e &lt;em&gt;server.key&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Eseguiamo quanto segue per creare il file &lt;em&gt;cert.conf&lt;/em&gt; per il certificato SSL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;gt; cert.conf &amp;lt;&amp;lt;EOF

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com

EOF

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Infine, eseguiamo il comando seguente per generare il &lt;strong&gt;certificato SSL firmato&lt;/strong&gt; tramite i file &lt;em&gt;rootCA.crt&lt;/em&gt; e &lt;em&gt;rootCA.key&lt;/em&gt; creati come parte della nostra autorità di certificazione.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl x509 -req \
 -in server.csr \
 -CA rootCA.crt -CAkey rootCA.key \
 -CAcreateserial -out server.crt \
 -days 365 \
 -sha256 -extfile cert.conf

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0rgHBNC6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0rgHBNC6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema4.png" alt="" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il comando precedente genererà un file chiamato &lt;em&gt;server.crt&lt;/em&gt; che verrà utilizzato con la chiave privata _server.key_per abilitare il protocollo SSL.&lt;/p&gt;

&lt;p&gt;Ad esempio, nel caso di un server come &lt;strong&gt;Nginx&lt;/strong&gt; , nella configurazione potremo andare a inserire quanto segue per riportare i riferimenti ai due file appena creati:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {

listen 443;

ssl on;
ssl_certificate /etc/ssl/server.crt;
ssl_certificate_key /etc/ssl/server.key;

server_name your.domain.com;
access_log /var/log/nginx/nginx.vhost.access.log;
error_log /var/log/nginx/nginx.vhost.error.log;
location / {
root /home/www/public_html/your.domain.com/public/;
index index.html;
}

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OglMw_TE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OglMw_TE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/self-signed-schema5.png" alt="" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Non ci resta che installare la CA all’interno del &lt;em&gt;browser&lt;/em&gt; per evitare che il browser mostri il messaggio precedente quando verrà utilizzato il certificato self-signed, e il gioco è fatto!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; : come detto in precedenza, questa procedura dovrebbe riguardare i soli ambienti di sviluppo o test; nei casi d’uso in produzione, una valida alternativa gratuita è &lt;a href="https://letsencrypt.org/it/"&gt;Letsencrypt&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Drupal 9 + MySQL 5.7 su Kubernetes</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Thu, 02 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/drupal-9-mysql-57-su-kubernetes-50p7</link>
      <guid>https://dev.to/serenasensini/drupal-9-mysql-57-su-kubernetes-50p7</guid>
      <description>&lt;p&gt;Drupal è un CMS piuttosto popolare con una grande community dietro, ed è particolarmente popolare tra le grandi aziende e per i siti web complessi. Infatti, alcuni dei siti più visitati al mondo come &lt;a href="https://www.nokia.com/phones/it_it"&gt;Nokia&lt;/a&gt;,&lt;a href="https://www.wish.com/it"&gt;Wish&lt;/a&gt;, &lt;a href="https://www.nasa.gov/"&gt;NASA&lt;/a&gt;utilizzano Drupal come CMS per i loro siti aziendali.&lt;/p&gt;

&lt;p&gt;In questo post, andremo a vedere come configurare un’istanza di Drupal versione 9.5 con MySQL 5.7 su Kubernetes.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spoiler&lt;/strong&gt; : sarà più lungo l’articolo che la sua effettiva realizzazione!&lt;/p&gt;

&lt;p&gt;Questo è lo schema di ciò che otterremo alla fine:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FBT-rIkC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-full-schema.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FBT-rIkC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-full-schema.png" alt="" width="800" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Persistenza
&lt;/h1&gt;

&lt;p&gt;Sappiamo che i container non sono persistenti, quindi è necessario utilizzare dei Persistent Volumes per preservare i dati che Drupal dovrà salvare… Altrimenti, tutte le modifiche scritte nel database o in qualsiasi directory andranno perse dopo il riavvio del container!&lt;/p&gt;

&lt;p&gt;Andiamo quindi a definire due PVC, supponendo che il cluster Kubernetes su cui lavoriamo abbia a disposizione un provisioner che si occupa di eseguire il binding tra le claim per lo storage e i volumi persistenti.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_toXVsk3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-pvcs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_toXVsk3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-pvcs.png" alt="" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In questo caso richiediamo due volumi da 5 GB ciascuno, dove il primo sarà usato per i file del sito web e il secondo per il database MySQL. Chiaramente, questo dimensionamento è adatto a un ambiente di test o di demo, ma possono essere adattati!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: drupal-pvc
spec:
 accessModes:
 - ReadWriteOnce
 resources:
 requests:
 storage: 5Gi


apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: mysql-pvc
spec:
 accessModes:
 - ReadWriteOnce
 resources:
 requests:
 storage: 5Gi

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Invece, per installare l’istanza di MySQL utilizzeremo un Deployment e un Service. Si noti che eseguiamo MySQL con un’utenza amministrativa, che può essere anche cambiata seguendo le indicazioni presenti nella documentazione ufficiale.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VRAokl_6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-pvcs-and-secret.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VRAokl_6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-pvcs-and-secret.png" alt="" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Infatti, quando lo si utilizza in &lt;strong&gt;produzione&lt;/strong&gt; , utilizzare credenziali personalizzate e sicure. Peraltro, è buona pratica memorizzare questo tipo di informazioni in un Secret, per cui procediamo con la sua definizione e includiamo la password dell’utente &lt;em&gt;root&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Secret
metadata:
 name: mysql-creds
stringData:
 MYSQL_ROOT_PASSWORD: root_password

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il Deployment di MySQL è piuttosto semplice: utilizza un’immagine &lt;em&gt;mysql&lt;/em&gt; nella versione 5.7.8, tra le ultime disponibili e compatibili con la versione 9 di Drupal (vedi &lt;a href="https://www.drupal.org/docs/getting-started/system-requirements/database-server-requirements"&gt;documentazione&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Inoltre, definiamo quelle che sono le &lt;strong&gt;variabili di ambiente&lt;/strong&gt; che l’istanza dovrà utilizzare per configurare il database su cui l’istanza Drupal andrà a lavorare, e poi definiamo anche la &lt;strong&gt;porta&lt;/strong&gt; 3306 come porta di ascolto per gli altri servizi e anche il &lt;strong&gt;path&lt;/strong&gt; su cui il volume di MySQL creato in precedenza verrà montato.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
 name: mysql
spec:
 replicas: 1
 template:
 metadata:
 labels:
 app: mysql
 spec:
 containers:
 - env:
 - name: MYSQL_ROOT_PASSWORD
 valueFrom:
 secretKeyRef:
 name: mysql-creds
 key: MYSQL_ROOT_PASSWORD
 - name: MYSQL_DATABASE
 value: drupal-database
 image: "mysql:5.7.8"
 imagePullPolicy: IfNotPresent
 name: mysql
 ports:
 - containerPort: 3306
 name: mysql
 protocol: TCP
 volumeMounts:
 - mountPath: /var/lib/mysql
 name: drupal-pvc
 subPath: dbdata
 volumes:
 - name: drupal-pvc
 persistentVolumeClaim:
 claimName: mysql-pvc
 selector:
 matchLabels:
 app: mysql

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il &lt;em&gt;Deployment&lt;/em&gt; di Drupal sarà basato su un container con un’immagine di Drupal dal repository Docker Hub pari all’ultima versione ad oggi disponibile, ossia la 9.5.11.&lt;/p&gt;

&lt;p&gt;Inoltre, utilizzeremo anche un container temporaneo (ovvero, un &lt;em&gt;initContainer&lt;/em&gt;) la cui missione sarà quella di pre-popolare lo storage persistente con i dati utilizzati da Drupal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PF_ZBh5e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PF_ZBh5e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-d.png" alt="" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questo controller esporrà la &lt;strong&gt;porta&lt;/strong&gt; 80 e ugualmente monterà un proprio &lt;strong&gt;volume&lt;/strong&gt; con diverse cartelle per ogni componente necessario a Drupal per lavorare, come i &lt;em&gt;themes&lt;/em&gt;, i &lt;em&gt;modules&lt;/em&gt; o i &lt;em&gt;sites&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
 app: drupal
 name: drupal
spec:
 replicas: 1
 template:
 metadata:
 labels:
 app: drupal
 spec:
 initContainers:
 - name: init-sites-volume
 imagePullPolicy: IfNotPresent
 image: drupal:9.5.11
 command: ['/bin/bash', '-c']
 args: ['cp -r /var/www/html/sites/ /data/; chown www-data:www-data /data/ -R']
 volumeMounts:
 - mountPath: /data
 name: pvc-drupal
 containers:
 - image: drupal:9.5.11
 imagePullPolicy: IfNotPresent
 name: drupal
 ports:
 - containerPort: 80
 volumeMounts:
 - mountPath: /var/www/html/modules
 name: pvc-drupal
 subPath: modules
 - mountPath: /var/www/html/profiles
 name: pvc-drupal
 subPath: profiles
 - mountPath: /var/www/html/sites
 name: pvc-drupal
 subPath: sites
 - mountPath: /var/www/html/themes
 name: pvc-drupal
 subPath: themes

 volumes:
 - name: pvc-drupal
 persistentVolumeClaim:
 claimName: drupal-pvc

 selector:
 matchLabels:
 app: drupal

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ultimo, ma non ultimo, creiamo i &lt;strong&gt;Service&lt;/strong&gt; necessari per permettere ai due componenti di comunicare: quello per MySQL sarà di tipo ClusterIP, dal momento che dovrà interfacciarsi solo con Drupal, mentre quello per Drupal sarà di tipo LoadBalancer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
 name: mysql-service
spec:
 ports:
 - name: mysql
 port: 3306
 protocol: TCP
 selector:
 app: mysql

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A seconda del tipo di infrastruttura Kubernetes su cui stiamo lavorando, sarà infatti possibile &lt;strong&gt;accedere all’istanza tramite browser&lt;/strong&gt; : nel caso in cui si usi un cluster EKS su AWS, questo andrà a creare un Application Load Balancer che potremo usare per accedere alla prima pagina di Drupal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
 name: drupal-service
spec:
 ports:
 - name: http
 port: 80
 protocol: TCP
 selector:
 app: drupal
 type: LoadBalancer

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rke-6aw3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-lb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rke-6aw3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-lb.png" alt="" width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ora che la nostra soluzione è stata definita e importata, &lt;strong&gt;installiamo Drupal&lt;/strong&gt;. È sufficiente navigare verso l’indirizzo ottenuto nel passaggio precedente e seguire le istruzioni per l’installazione guidata. Utilizzate le credenziali del database configurate in precedenza nel Deployment di MySQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5jnMlmeA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-installation.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5jnMlmeA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/drupal-installation.png" alt="" width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ad esempio, nel nostro caso, ecco i dati da specificare nella schermata di configurazione del database:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nome del database: &lt;em&gt;drupal-database&lt;/em&gt;, come la variabile d’ambiente &lt;em&gt;MYSQL_DATABASE&lt;/em&gt; nel Deployment di MySQL.&lt;/li&gt;
&lt;li&gt;Password del database: &lt;em&gt;root_password&lt;/em&gt;, come la variabile d’ambiente &lt;em&gt;MYSQL_PASSWORD&lt;/em&gt; nel Secret di MySQL.&lt;/li&gt;
&lt;li&gt;Host: &lt;em&gt;mysql-service&lt;/em&gt;, uguale al nome del Service MySQL&lt;/li&gt;
&lt;li&gt;Porta: 3306, uguale alla porta specificato nel Service MySQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Questo è tutto!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ora avete un’istanza di Drupal &lt;em&gt;funzionante&lt;/em&gt;, distribuita in meno di 10 minuti.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Docker AI: aumentare la produttività tramite un bot</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Tue, 31 Oct 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/docker-ai-aumentare-la-produttivita-tramite-un-bot-2bbg</link>
      <guid>https://dev.to/serenasensini/docker-ai-aumentare-la-produttivita-tramite-un-bot-2bbg</guid>
      <description>&lt;p&gt;Durante la &lt;a href="https://www.dockercon.com/"&gt;DockerCon&lt;/a&gt;, a Los Angeles, Docker Inc ha presentato una novità: un programma che si occuperà di integrare tecniche di AI all’interno dei suoi strumenti, tra cui &lt;strong&gt;Docker AI&lt;/strong&gt; , progettato per aiutare chi sviluppa a distribuire e ottimizzare i prodotti che includano questo tool.&lt;/p&gt;

&lt;p&gt;Si tratta del primo prodotto che include degli strumenti AI per un prodotto che viene spesso utilizzato per creare a sua volta strumenti di AI, come &lt;a href="https://huggingface.co/"&gt;Hugging Face&lt;/a&gt; e &lt;a href="https://replicate.com/"&gt;Replicate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Secondo &lt;a href="https://www.linkedin.com/in/scottcjohnston"&gt;Scott Johnston&lt;/a&gt;, CEO di &lt;a href="https://www.linkedin.com/company/docker"&gt;Docker&lt;/a&gt;, molti team rilasciano il proprio software a clienti e community attraverso container Docker:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Le immagini dei container sono cosiddette &lt;em&gt;immutabili&lt;/em&gt;, cioè riproducibili […]. Quando si costruiscono modelli, si analizzano dati, e così via, si vuole essere in grado di riprodurre i risultati indipendentemente dalla persona con cui si lavora, e indipendentemente dalla situazione. Il fatto che l’immagine del container sia immutabile aiuta molto in questo senso”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Docker AI&lt;/strong&gt; dovrebbe fornire una sorta di &lt;em&gt;guida&lt;/em&gt; automatica quando le persone che sviluppano modificano un Dockerfile o simili, eseguono il debug della loro “docker build” in locale o eseguono un test, consentendo ai team di beneficiare della saggezza collettiva di milioni di professionisti/e che utilizzano Docker - alcuni da oltre 10 anni - seguendo le &lt;em&gt;best practices&lt;/em&gt; di scrittura di questi file e selezionando immagini aggiornate e sicure per le proprie applicazioni.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker AI&lt;/strong&gt; sarebbe dunque un &lt;strong&gt;bot&lt;/strong&gt; che utilizza la GenAI progettato per &lt;em&gt;assistere&lt;/em&gt; nell’utilizzo di Docker. È &lt;em&gt;addestrato&lt;/em&gt; sui file per Docker Compose e sulla raccolta di &lt;strong&gt;errori&lt;/strong&gt; che deriva dall’uso prodotto e dagli strumenti che offre Docker, ha dichiarato Johnston, senza “coinvolgere” o sfruttare i dati dei clienti.&lt;/p&gt;

&lt;p&gt;Mentre &lt;a href="https://github.com/features/copilot"&gt;Copilot&lt;/a&gt; e strumenti simili aiutano in attività come il &lt;strong&gt;completamento del codice&lt;/strong&gt; si occupano del 10 o 15% della costruzione di un’applicazione, queste non sono mai fatte di un singolo “componente”: di solito utilizzano anche un database, un server web, uno strato di frontend e molto altro.&lt;/p&gt;

&lt;p&gt;Questa percentuale è quella in cui Docker è spesso presente, perché fornisce immagini o &lt;em&gt;docker-compose&lt;/em&gt; file utili a definire altre parti dell’applicazione attorno al &lt;em&gt;core&lt;/em&gt; del prodotto. L’AI di Docker, quindi, servirebbe a completare questa fetta di componenti, occupandosi di quell'85-90% finale.&lt;/p&gt;

&lt;p&gt;Sembra che, inoltre, questo strumento si &lt;strong&gt;integrerà&lt;/strong&gt; con ambienti come &lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt; e con gli ambienti di sviluppo web di &lt;a href="https://www.jetbrains.com/"&gt;JetBrains&lt;/a&gt;, tra i più utilizzati nell’ecosistema di chi programma.&lt;/p&gt;

&lt;p&gt;Questo strumento è attualmente disponibile solo attraverso l’iscrizione a un programma di early access di Docker disponibile&lt;a href="https://www.docker.com/ai-early-access-program/"&gt;qui&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;E tu, intendi provarlo?&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Installa OpenShift Local con Podman Desktop</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/installa-openshift-local-con-podman-desktop-11i5</link>
      <guid>https://dev.to/serenasensini/installa-openshift-local-con-podman-desktop-11i5</guid>
      <description>&lt;p&gt;Qualche settimana fa abbiamo parlato di &lt;a href="https://www.theredcode.it/podman/cos-e-podman/"&gt;cosa fosse Podman&lt;/a&gt; e del nuovo strumento con interfaccia grafica chiamato &lt;a href="https://theredcode.it/devops/podman-desktop"&gt;Podman Desktop&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Una delle caratteristiche uniche di &lt;a href="https://theredcode.it/devops/podman-desktop"&gt;Podman Desktop&lt;/a&gt; è la sua integrazione con &lt;a href="https://theredcode.it/devops/openshift-local-come-installarlo"&gt;Red Hat OpenShift Local&lt;/a&gt;, che consente agli utenti di sviluppare e testare le applicazioni localmente, utilizzando le stesse immagini e lo stesso ambiente di container che utilizzerebbero in un ambiente di produzione su Red Hat OpenShift, ma più in piccolo.&lt;/p&gt;

&lt;p&gt;Questo significa che potete assicurarvi che le vostre applicazioni funzionino senza problemi in un ambiente OpenShift prima di distribuirle!&lt;/p&gt;

&lt;h1&gt;
  
  
  Configurazione
&lt;/h1&gt;

&lt;p&gt;Podman Desktop 1.0 include un’estensione per OpenShift Local, che si può installare dalla dashboard o attraverso le Impostazioni.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tBri15uL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-podman-desktop-extension.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tBri15uL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-podman-desktop-extension.png" alt="" width="800" height="490"&gt;&lt;/a&gt;&lt;em&gt;Configurazione tramite pagina principale&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Yv9ty3yE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/podman-desktop-openshift-local-settings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Yv9ty3yE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/podman-desktop-openshift-local-settings.png" alt="" width="800" height="581"&gt;&lt;/a&gt;&lt;em&gt;Configurazione tramite le impostazioni&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una volta installata, l’estensione consente di configurare le diverse impostazioni utilizzabili per OpenShift Local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenShift con un singolo nodo alimentato da OpenShift Container Platform: completo, e più impegnativo dal punto di vista delle risorse consumate&lt;/li&gt;
&lt;li&gt;MicroShift: leggero e ottimizzato (ad oggi ancora sperimentale) alimentato da un set di servizi minimo, ma molto veloce e leggero&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1p4UZqcF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/podman-desktop-openshift-local-options.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1p4UZqcF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/podman-desktop-openshift-local-options.png" alt="" width="800" height="674"&gt;&lt;/a&gt;&lt;em&gt;Opzioni disponibili per l’estensione di OpenShift&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Con Podman Desktop, è possibile facilitare la transizione di un’applicazione da un ambiente locale a un ambiente OpenShift remoto di produzione!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se ti stai chiedendo come funziona per Docker Compose, sappi che esiste un’alternativa: &lt;a href="https://www.theredcode.it/docker/podman-e-docker-compose/"&gt;Podman Compose&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Schedule di una AWS Lambda</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Thu, 12 Oct 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/schedule-di-una-aws-lambda-10in</link>
      <guid>https://dev.to/serenasensini/schedule-di-una-aws-lambda-10in</guid>
      <description>&lt;p&gt;Grazie al servizio Lambda di AWS, è possibile scrivere del codice tramite l’editor integrato della console di gestione AWS in diversi linguaggi e poter eseguire le tue funzioni in pochi attimi, il tutto in modalità serverless.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Per cosa può tornarci utile?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Per pianificare, ad esempio, lo &lt;strong&gt;spegnimento automatico&lt;/strong&gt; di una serie di macchine EC2 durante il weekend, piuttosto che per &lt;strong&gt;recuperare i log&lt;/strong&gt; di alcuni servizi critici per il proprio flusso di lavoro.&lt;/p&gt;

&lt;p&gt;Per far sì che questa funzione venga eseguita in maniera &lt;strong&gt;automatica&lt;/strong&gt; e &lt;em&gt;programmata&lt;/em&gt;, è possibile avvalersi di un servizio che segua una &lt;em&gt;regola&lt;/em&gt; per mettere in moto Lambda.&lt;/p&gt;

&lt;p&gt;Partiamo da un &lt;em&gt;esempio semplice&lt;/em&gt;, che poi può essere adattato a qualsiasi tipo di funzione Lambda, in qualsiasi linguaggio essa sia scritta.&lt;/p&gt;

&lt;p&gt;Immaginiamo di avere la seguente Lambda scritta in Python. In questo caso, recupera dei dati qualsiasi dal sito&lt;a href="https://random-data-api.com/"&gt;https://random-data-api.com/&lt;/a&gt; e li riporta sotto forma di JSON, tramite il modulo &lt;em&gt;json&lt;/em&gt; e &lt;em&gt;requests&lt;/em&gt; di Python e sfruttando la funziona &lt;em&gt;lambda_handler&lt;/em&gt; all’interno della quale avviene la request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import json
import requests

base_url = "https://random-data-api.com/"

def lambda_handler(event, context):
 res = requests.get(url=base_url+'api/v2/users?size=1&amp;amp;is_xml=true')
 return {
 'statusCode': res.status_code,
 'body': res.json
 }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vogliamo che questa chiamata venga eseguita ogni giorno, a mezzanotte: per farlo, possiamo sfruttare un servizio chiamato &lt;a href="https://aws.amazon.com/it/eventbridge/"&gt;EventBridge&lt;/a&gt;. Si tratta sempre di un servizio &lt;em&gt;serverless&lt;/em&gt; che permette di creare delle applicazioni basate su &lt;strong&gt;eventi&lt;/strong&gt; : questo vuol dire che utilizza una serie di &lt;em&gt;eventi&lt;/em&gt;, come un cambio dello stato di un servizio o di una funzione per scatenare delle azioni su altri servizi o applicazioni, tramite delle regole o delle vere e proprie pipeline.&lt;/p&gt;

&lt;p&gt;Nel nostro caso, è necessario utilizzare il servizio di creazione delle &lt;strong&gt;regole&lt;/strong&gt; tramite la &lt;em&gt;pianificazione&lt;/em&gt;: colleghiamoci al servizio Eventbridge, come prima cosa, e clicchiamo su “&lt;em&gt;Crea&lt;/em&gt; &lt;em&gt;Regola&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qc10jNH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-main.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qc10jNH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-main.png" alt="" width="800" height="558"&gt;&lt;/a&gt;&lt;em&gt;Pagina principale del servizio&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Si aprirà una pagina che riporta il wizard per la &lt;strong&gt;creazione della regola&lt;/strong&gt; : scegliamo un nome parlante, inseriamo eventualmente una descrizione e poi procediamo verso la sezione chiamata “&lt;em&gt;Modello&lt;/em&gt; &lt;em&gt;di&lt;/em&gt; &lt;em&gt;pianificazione&lt;/em&gt;”, dove potremo specificare lo &lt;strong&gt;schedule&lt;/strong&gt; con cui eseguire la funzione Lambda:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xfl3OL4F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xfl3OL4F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule1.png" alt="" width="800" height="578"&gt;&lt;/a&gt;&lt;em&gt;Creazione della regola&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Selezioniamo la voce “&lt;em&gt;Pianificazione&lt;/em&gt; &lt;em&gt;ricorrente&lt;/em&gt;”, così da poter definire sotto forma di &lt;strong&gt;cron&lt;/strong&gt; qual è la ricorrenza con la quale questa funzione dev’essere invocata. Nell’esempio in figura, la pianificazione prevede che la funzione venga eseguita tutti i giorni (terzo asterico) a mezzanotte (primi due zeri) ogni mese di ogni anno. Come forma di verifica, viene infatti anche riportata la data e l’ora che corrispondono all’espressione inserita delle prossime occorrenze: vediamo se tutto torna, e procediamo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TecbKFxp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TecbKFxp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule2.png" alt="" width="800" height="882"&gt;&lt;/a&gt;&lt;em&gt;Configurazione dei dettagli della pianificazione ricorrente&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Piccola nota&lt;/em&gt;: la voce “&lt;em&gt;Finestra&lt;/em&gt; &lt;em&gt;temporale&lt;/em&gt; &lt;em&gt;flessibile&lt;/em&gt;” permette di impostare un range temporale entro il quale eseguire la funzione. Questo vuol dire che la funzione potrebbe essere eseguita con un po’ di &lt;em&gt;ritardo&lt;/em&gt; rispetto all’orario indicato, ma sempre all’interno di questo intervallo.&lt;/p&gt;

&lt;p&gt;A questo punto, andiamo a selezionare &lt;strong&gt;quale servizio collegare alla pianificazione&lt;/strong&gt; , ossia Lambda, tramite l’azione di invocazione:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RkOqD7Fg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RkOqD7Fg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule3.png" alt="" width="800" height="526"&gt;&lt;/a&gt;&lt;em&gt;Configurazione del servizio Lambda per l’esecuzione programmata&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fatto questo, verrà mostrata una finestra che permette di &lt;strong&gt;selezionare&lt;/strong&gt; una tra le funzioni presenti nella _regioni_utilizzata e specificare un eventuale payload da associare a questa: nel caso di esempio, non era necessario, quindi selezioniamo la Lambda e procediamo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zh94VynM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zh94VynM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule4.png" alt="" width="800" height="786"&gt;&lt;/a&gt;&lt;em&gt;Selezione della funzione Lambda&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nello step successivo, vengono specificate una serie di &lt;strong&gt;opzioni&lt;/strong&gt; su come configurare questa pianificazione: se abilitarla immediatamente al momento della creazione, se cancellarla dopo il completamento, l’eventuale meccanismo di crittografia da utilizzare e le autorizzazioni: lasciamo che venga creato un ruolo in maniera automatica da AWS e clicchiamo su “Successivo”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yfW4u0IB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yfW4u0IB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule5.png" alt="" width="800" height="1150"&gt;&lt;/a&gt;&lt;em&gt;Configurazioni opzionali&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ultimo step: controlliamo il &lt;strong&gt;riepilogo&lt;/strong&gt; di quanto fatto finora, e creiamo la pianificazione.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YPwnWXVR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YPwnWXVR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/eventbridge-rule6.png" alt="" width="800" height="603"&gt;&lt;/a&gt;&lt;em&gt;Riepilogo della pianificazione&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una volta finito, la pianificazione sarà riportata nell’ &lt;strong&gt;elenco&lt;/strong&gt; delle pianificazioni a cui è possibile accedere dalla pagina principale del servizio EventBridge: questo riporterà anche qual è il servizio a cui è collegato, nonché tutti i dettagli sulla sua esecuzione.&lt;/p&gt;

&lt;p&gt;A questo punto, &lt;strong&gt;come verificare che la funzione venga invocata&lt;/strong&gt; correttamente e funzioni secondo pianificazione?&lt;/p&gt;

&lt;p&gt;Utilizzando il servizio &lt;a href="https://aws.amazon.com/it/cloudwatch/"&gt;CloudWatch&lt;/a&gt;: selezionando questo servizio e scegliendo dal menù di sinistra la voce “ &lt;strong&gt;Logs&lt;/strong&gt; ” e poi “ &lt;strong&gt;Gruppi di log&lt;/strong&gt; ”, possiamo cercare tramite il nome della funzione Lambda i log a essa associati:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QN7huCwj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/cloudwatch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QN7huCwj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/cloudwatch.png" alt="" width="730" height="654"&gt;&lt;/a&gt;&lt;em&gt;Pagina principale di CloudWatch&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G-6RxFFA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/cloudwatch-lambda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G-6RxFFA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/cloudwatch-lambda.png" alt="" width="800" height="163"&gt;&lt;/a&gt;&lt;em&gt;Ricerca dei log delle funzioni Lambda su CloudWatch&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se la pianificazione è appena stata creata e ha una data successiva a quella attuale, è possibile che non ci sia ancora nulla.&lt;/p&gt;

&lt;p&gt;A questo punto, non ci resta che attendere la prossima esecuzione e incrociare le dita! 🤞&lt;/p&gt;

&lt;h1&gt;
  
  
  Risorse utili
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/45D9eId"&gt;AWS Cloud Computing Concepts and Tech Analogies: A guide to understand AWS services using easy-to-follow analogies from real life&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Configurare OpenShift Local</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Thu, 05 Oct 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/configurare-openshift-local-1jf2</link>
      <guid>https://dev.to/serenasensini/configurare-openshift-local-1jf2</guid>
      <description>&lt;p&gt;Con le ultime versioni di OpenShift, il vecchio e caro Minishift ha cominciato a sparire, finché &lt;a href="https://developers.redhat.com/openshift/local-openshift"&gt;qualche tempo fa&lt;/a&gt;, Red Hat ha rilasciato OpenShift Local (prima CodeReady Containers), per consentire a chi sviluppa di testare una configurazione di OpenShift 4.x in un ambiente locale installando un cluster minimale.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cos’è
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Red Hat OpenShift Local&lt;/strong&gt; è il modo più rapido per iniziare a lavorare su un cluster OpenShift. È progettato per essere eseguito su un computer locale per semplificare la configurazione e i test e per emulare l’ambiente di sviluppo cloud a livello locale con tutti gli strumenti necessari per sviluppare applicazioni basate su container come su un cluster di produzione.&lt;/p&gt;

&lt;h1&gt;
  
  
  Come funziona
&lt;/h1&gt;

&lt;p&gt;OpenShift Local è essenzialmente un cluster OpenShift con un &lt;em&gt;singolo nodo&lt;/em&gt; che viene eseguito localmente sul computer dello sviluppatore. Si basa sulla stessa tecnologia di OpenShift e fornisce un ambiente coerente per lo sviluppo e il test delle applicazioni.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PBTdJ_99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-architecture.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PBTdJ_99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-architecture.png" alt="" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Installazione
&lt;/h1&gt;

&lt;p&gt;Naturalmente, ha dei requisiti minimi, sia dal punto di vista software che hardware. Vediamo quali:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://access.redhat.com/documentation/en-us/red_hat_openshift_local/2.25/html/getting_started_guide/installing#operating_system_requirements"&gt;Requisiti software&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Richiede un hypervisor per eseguire la VM contenente OpenShift: – macOS: xhyve (predefinito), VirtualBox – GNU/Linux: KVM (predefinito), VirtualBox – Windows: Hyper-V (predefinito), VirtualBox&lt;/li&gt;
&lt;li&gt;Un account su RedHat (è gratuito!) per accedere alla console ed essere in grado di ottenere il pull secret – Windows: per Microsoft, Red Hat OpenShift Local richiede l’aggiornamento &lt;a href="https://it.wikipedia.org/wiki/Cronologia_delle_versioni_di_Windows_10#Versione_1709_(Fall_Creators_Update)"&gt;Windows 10 Fall Creators Update (versione 1709)&lt;/a&gt; o successivo. Red Hat OpenShift Local non funziona su versioni precedenti di Microsoft Windows. Microsoft Windows 10 Home Edition non è supportato. – macOS: Red Hat OpenShift Local richiede macOS 11 Big Sur o successivo. Red Hat OpenShift Local non funziona su versioni precedenti di macOS. – Linux: Red Hat OpenShift Local è supportato solo sulle ultime due release minori di Red Hat Enterprise Linux/CentOS 7, 8 e 9 e sulle ultime due release stabili di Fedora. Quando si utilizza Red Hat Enterprise Linux, la macchina che esegue Red Hat OpenShift Local deve essere registrata nel Red Hat Customer Portal. Ubuntu 18.04 LTS o versioni successive e Debian 10 o versioni successive non sono supportate e potrebbero richiedere la configurazione manuale della macchina host.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://access.redhat.com/documentation/en-us/red_hat_openshift_local/2.25/html/getting_started_guide/installing#for_openshift_container_platform"&gt;Requisiti hardware&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;4 core fisici della CPU&lt;/li&gt;
&lt;li&gt;9 GB di RAM&lt;/li&gt;
&lt;li&gt;35 GB di spazio di archiviazione&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per procedere, accedere alla &lt;a href="https://console.redhat.com/"&gt;Red Hat Console&lt;/a&gt;, loggarsi e, facendo clic sulla voce “&lt;em&gt;Services&lt;/em&gt;”, cercare la parola “&lt;em&gt;OpenShift&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--avApz5Ao--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/redhat-console-main.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--avApz5Ao--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/redhat-console-main.png" alt="" width="800" height="617"&gt;&lt;/a&gt;&lt;em&gt;Pagina principale della console Red Hat&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--orJ7cHbd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/redhat-console-options.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--orJ7cHbd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/redhat-console-options.png" alt="" width="800" height="617"&gt;&lt;/a&gt;&lt;em&gt;Installazione di OpenShift locale&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ci verrà chiesto di &lt;strong&gt;scaricare un pacchetto&lt;/strong&gt; in base al sistema operativo; facciamo clic su “Download OpenShift Local” senza chiudere però la pagina; tra poco dovremo recuperare il &lt;em&gt;pull secret&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rXNLy_6Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/redhat-console-pull.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rXNLy_6Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/redhat-console-pull.png" alt="" width="800" height="368"&gt;&lt;/a&gt;&lt;em&gt;Download del file eseguibile&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In base al sistema operativo, installiamo OpenShift Local tramite il file eseguibile seguendo tutti i passaggi descritti dalla procedura guidata e lasciando il percorso predefinito per l’installazione.&lt;/p&gt;

&lt;p&gt;Verranno apportate molte modifiche al sistema, riguardanti la configurazione di rete, i servizi, l’ambiente e così via, per cui si consiglia di &lt;strong&gt;riavviare il sistema.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g6mDCfKv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-installation.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g6mDCfKv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-installation.png" alt="" width="493" height="388"&gt;&lt;/a&gt;&lt;em&gt;Esempio di schermata di installazione di OpenShift Local per Windows&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una volta riavviato il sistema, &lt;strong&gt;aprire RedHat OpenShift Local:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A6wXziBT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-config.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A6wXziBT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-config.png" alt="" width="800" height="575"&gt;&lt;/a&gt;&lt;em&gt;Configurazione iniziale di OpenShift Local&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fare clic su “Avanti” e passare alla seconda fase. Qui si può scegliere se proseguire la &lt;strong&gt;configurazione&lt;/strong&gt; usando OpenShift o Podman; le due cose non si escludono a vicenda, ma si può scegliere di installare Podman successivamente o manualmente. Lasciare la selezione attuale su OpenShift e continuare.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K-naz8CP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-config2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K-naz8CP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-config2.png" alt="" width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tornare alla Red Hat Console e copiare e incollare il &lt;strong&gt;pull secret&lt;/strong&gt; facendo clic sul link mostrato nell’immagine sottostante:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wurXIhE8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/redhat-console-pull-secret.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wurXIhE8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/redhat-console-pull-secret.png" alt="" width="800" height="617"&gt;&lt;/a&gt;&lt;em&gt;Recupero del pull secret dalla console Red Hat&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Proseguire e concludere il setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PZzE6xbF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-config3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PZzE6xbF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-config3.png" alt="" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’installazione potrebbe richiedere fino a &lt;strong&gt;5-15 minuti&lt;/strong&gt;. Se richiede più tempo, provare a chiudere e ricominciare.&lt;/p&gt;

&lt;p&gt;Una volta &lt;strong&gt;completata l’installazione&lt;/strong&gt; , sarà possibile avviare OpenShift Local e cominciare a utilizzarlo: per chi usa Windows, dovrebbe essere possibile trovare un’icona rossa nella barra degli strumenti in basso a destra: fare clic con il pulsante destro del mouse e verificare se il cluster è in esecuzione. Altrimenti, continuate a leggere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_jGdAben--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-icon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_jGdAben--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift-local-icon.png" alt="" width="322" height="308"&gt;&lt;/a&gt;&lt;em&gt;Icona di OpenShift Local per Windows nella barra degli strumenti&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Si noti che questo strumento sarà gestito attraverso questa finestra: qui è possibile arrestare il cluster, eliminarlo e ripartire da zero (opzione “&lt;em&gt;Delete&lt;/em&gt;”), aprire la console web (opzione “&lt;em&gt;Open console&lt;/em&gt;”), copiare e incollare il comando di accesso come amministratore (opzione “&lt;em&gt;Copy…&lt;/em&gt;”) e così via.&lt;/p&gt;

&lt;h1&gt;
  
  
  CLI
&lt;/h1&gt;

&lt;p&gt;Non è finita qui: OpenShift Local è dotato di uno strumento CLI chiamato &lt;strong&gt;crc&lt;/strong&gt; : è possibile utilizzarlo per configurare il cluster, avviarlo, arrestarlo e così via.&lt;/p&gt;

&lt;p&gt;Il suggerimento è, per la &lt;em&gt;prima volta&lt;/em&gt; che si installa il cluster, di aprire un terminale in base al proprio sistema operativo ed eseguire i seguenti comandi: &lt;em&gt;crc setup&lt;/em&gt; configura e verifica che tutto il necessario al cluster sia presente e funzionante.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ crc setup
&amp;gt;&amp;gt;&amp;gt; Expected output:
INFO Using bundle path C:\Users\xxx\.crc\cache\crc_hyperv_4.10.18_amd64.crcbundle
INFO Checking if current user is in Hyper-V Admins group
INFO Checking if CRC bundle is extracted in '$HOME/.crc'
INFO Checking if C:\Users\xxx\.crc\cache\crc_hyperv_4.10.18_amd64.crcbundle exists
INFO Checking if the daemon task is installed
INFO Checking if the daemon task is running
INFO Running the daemon task
INFO Checking admin helper service is running
Your system is correctly setup for using CRC. Use 'crc start' to start the instance

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nel caso in cui qualcosa vada &lt;em&gt;storto&lt;/em&gt;, possiamo provare ad aumentare il livello di log per eseguire un po’ più di informazioni:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ crc setup --log-level debug
&amp;gt;&amp;gt;&amp;gt; Expected output:
DEBU CRC version: 2.5.1+5b02b826
DEBU OpenShift version: 4.10.18
DEBU Podman version: 4.1.0
DEBU Running 'crc setup'
INFO Using bundle path C:\Users\xxx\.crc\cache\crc_hyperv_4.10.18_amd64.crcbundle
INFO Checking if current user is in Hyper-V Admins group
DEBU Running '$sid = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-32-578")
 @([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole($sid)'
INFO Checking if CRC bundle is extracted in '$HOME/.crc'
INFO Checking if C:\Users\xxx\.crc\cache\crc_hyperv_4.10.18_amd64.crcbundle exists
DEBU C:\Users\xxx\.crc\cache\crc_hyperv_4.10.18_amd64.crcbundle exists
DEBU Running 'Get-ScheduledTask -TaskName crcDaemon'
DEBU Running '(Get-ScheduledTask -TaskName "crcDaemon").Version'
INFO Checking if the daemon task is running
DEBU Running '(Get-ScheduledTask -TaskName "crcDaemon").State'
INFO Checking admin helper service is running
DEBU Running '(Get-Service crcAdminHelper).Status'
Your system is correctly setup for using CRC. Use 'crc start' to start the instance
DEBU Running '(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId'
DEBU Running '(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").EditionID'
INFO Checking if running in a shell with administrator rights
INFO Checking Windows 10 release
INFO Checking Windows edition
INFO Checking if Hyper-V is installed and operational
INFO Checking if crc-users group exists
INFO Checking if current user is in Hyper-V Admins group
INFO Checking if vsock is correctly configured
INFO Checking if the daemon task is installed
INFO Checking if the daemon task is running
INFO Checking admin helper service is running
INFO Loading bundle: crc_hyperv_4.10.18_amd64...
INFO Creating CRC VM for OpenShift 4.10.18...
...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una volta che il cluster sarà stato avviato (usando il comando &lt;em&gt;crc start&lt;/em&gt; nella riga di comando o usando l’interfaccia utente), la console sarà disponibile all’indirizzo &lt;a href="https://oauth-openshift.apps-crc.testing"&gt;https://oauth-openshift.apps-crc.testing&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crc start
&amp;gt;&amp;gt;&amp;gt;
Starting...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Ci siamo quasi!&lt;/em&gt; Per &lt;strong&gt;ottenere le credenziali&lt;/strong&gt; per accedere alla console, basta eseguire il seguente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ crc console --credentials
&amp;gt;&amp;gt;&amp;gt;
To login as a regular user, run 'oc login -u developer -p developer https://api.crc.testing:6443'.
To login as an admin, run 'oc login -u kubeadmin -p PASSWORD https://api.crc.testing:6443'

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A questo punto, collegandosi all’indirizzo mostrato in precedenza, sarà possibile visualizzare la &lt;strong&gt;pagina principale&lt;/strong&gt; della console OpenShift.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dVgQJ38o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift_local_console.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dVgQJ38o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/openshift_local_console.png" alt="" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ora che abbiamo un cluster OpenShift pronto all’uso… &lt;em&gt;Come sfruttarlo al meglio?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nei prossimi articoli, vedremo diversi esempi di utilizzo!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Voglio diventare... Full-Stack Recruiter</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Tue, 03 Oct 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/voglio-diventare-full-stack-recruiter-5cb6</link>
      <guid>https://dev.to/serenasensini/voglio-diventare-full-stack-recruiter-5cb6</guid>
      <description>&lt;h1&gt;
  
  
  Descriviti in 100 parole
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Ciao&lt;/strong&gt;! 👋 Sono &lt;strong&gt;Guido&lt;/strong&gt; e sono un &lt;em&gt;Tech Recruiter&lt;/em&gt; @ &lt;a href="https://polarisengineeringspa.com/"&gt;Polaris Engineering&lt;/a&gt;. Lavoro nel settore già da qualche anno, adoro il networking e creare relazioni, mi piace vivere le &lt;strong&gt;community&lt;/strong&gt; di dev, gli &lt;strong&gt;eventi&lt;/strong&gt; e i meetup e da marzo 2023, spinto dall’esigenza di fare qualcosa di utile per l’ecosistema IT italiano ho aperto un &lt;a href="https://www.twitch.tv/lalocandadeltech"&gt;canale Twitch&lt;/a&gt; (che nel frattempo è anche diventata una bella community su &lt;strong&gt;&lt;a href="https://t.me/+mqQJQ9BqKOViMmVk"&gt;Telegram&lt;/a&gt;&lt;/strong&gt; che al momento conta oltre 600 persone) che si chiama &lt;strong&gt;La Locanda del Tech&lt;/strong&gt; , dove parliamo di lavoro, crescita professionale e molto altro!&lt;/p&gt;

&lt;h1&gt;
  
  
  In cosa consiste il ruolo di Full-Stack Recruiter?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Fun fact&lt;/strong&gt; : il ruolo in sé &lt;em&gt;non esiste&lt;/em&gt;! E’ un “job title” immaginario che abbiamo coniato per unire un termine “tipico” del mondo dello &lt;strong&gt;sviluppo&lt;/strong&gt; alla figura del/della &lt;strong&gt;recruiter&lt;/strong&gt; , anche in maniera un pò &lt;em&gt;provocatoria&lt;/em&gt; volendo.&lt;/p&gt;

&lt;p&gt;Fra chi sviluppa c’è sempre questa diatriba fra l’essere full stack o meno, abbiamo voluto quindi utilizzare questa “&lt;em&gt;leva comunicativa&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;In generale, l’ &lt;strong&gt;obiettivo&lt;/strong&gt; è quello di fornire ai/alle recruiter gli strumenti necessari per avere delle skill tecniche più approfondite e diminuire le distanze comunicative e tecniche fra “noi e voi”.&lt;/p&gt;

&lt;h1&gt;
  
  
  Qual è la soft skill più importante che deve possedere?
&lt;/h1&gt;

&lt;p&gt;Personalmente è troppo difficile rispondere a questa domanda scegliendone una sola. &lt;strong&gt;Fare recruiting&lt;/strong&gt; è un mestiere dannatamente &lt;em&gt;complicato&lt;/em&gt;: il settore è iper-competitivo, l’&lt;em&gt;ansia&lt;/em&gt; da fallimento è sempre dietro l’angolo, l’universo di tecnologie/framework/linguaggi e chi più ne ha più ne metta è sconfinato, quindi le &lt;strong&gt;soft skills&lt;/strong&gt; da possedere a mio avviso devono essere tante: pazienza, empatia, saper costruire relazioni, non farsi trascinare nel vortice della “&lt;em&gt;pesca a strascico&lt;/em&gt;” ma &lt;strong&gt;cercare&lt;/strong&gt; , per quanto possibile, &lt;strong&gt;di fare questo lavoro in maniera etica&lt;/strong&gt; , trasparente e responsabile&lt;/p&gt;

&lt;h1&gt;
  
  
  Quali sono le difficoltà che può incontrare la figura di un/a recruiter in ambito tech?
&lt;/h1&gt;

&lt;p&gt;Ne ho parlato parzialmente nella domanda precedente: altissima &lt;strong&gt;competitività&lt;/strong&gt; , &lt;strong&gt;domanda sbilanciata&lt;/strong&gt; enormemente rispetto all’offerta, &lt;strong&gt;skill tecniche&lt;/strong&gt; che devono essere presenti (un minimo quantomeno, per non cadere nel classico errore &lt;em&gt;Java=Javascript&lt;/em&gt;), e mediamente una “&lt;em&gt;diffidenza&lt;/em&gt;” dei dev nei nostri confronti, unita anche al fatto che 9/10 non cercano attivamente lavoro e quindi proporre una nuova opportunità lavorativa davvero interessante è complicato.&lt;/p&gt;

&lt;h1&gt;
  
  
  Come fare per diventare un/a Full-Stack Recruiter?
&lt;/h1&gt;

&lt;p&gt;Che io sappia &lt;strong&gt;non esistono certificazioni&lt;/strong&gt; nel recruiting (ancora), se non attestati di frequenza erogati da enti privati. Sicuramente è estremamente utile aver frequentato un &lt;strong&gt;master in HR&lt;/strong&gt; per padroneggiare anche temi squisitamente burocratico/fiscali (ovvero sapere cos’è un CCNL, cosa vuol dire RAL, i livelli, superminimi e molto altro, per riuscire a gestire efficacemente una contrattazione economica).&lt;/p&gt;

&lt;p&gt;Per il resto, avere un’ &lt;strong&gt;esperienza pregressa&lt;/strong&gt; , anche minima, nel settore HR o Recruiting è indubbiamente un vantaggio. Infine, tocca &lt;strong&gt;studiare&lt;/strong&gt;! Il settore, il mercato, le communities e altro. Il settore è molto tecnico, e tipicamente chi di lavoro è “tecnico” è in costante aggiornamento e formazione. Dobbiamo (anzi, dovremmo) farlo anche noi!&lt;/p&gt;

&lt;p&gt;Per questa ragione, insieme a &lt;a href="https://www.linkedin.com/in/storrisi/"&gt;Simone Torrisi&lt;/a&gt; di &lt;a href="https://www.tomorrowdevs.com/"&gt;TomorrowDevs&lt;/a&gt; abbiamo creato questo &lt;a href="https://www.tomorrowdevs.com/corso-fullstack-recruiter/"&gt;percorso per diventare &lt;strong&gt;recruiter in ambito tech&lt;/strong&gt;&lt;/a&gt;: comprendere il CV di un/a developer, seguire tutte le ultime novità in merito alle tecnologie e framework, acquisire le terminologie e via dicendo è estremamente &lt;em&gt;complesso&lt;/em&gt;. In questo &lt;strong&gt;corso&lt;/strong&gt; , mettiamo a disposizione la conoscenza e l’esperienza di chi questo mestiere lo fa ogni giorno e che quindi può &lt;strong&gt;supportare il/la recruiter di domani&lt;/strong&gt; a muoversi più agilmente in questo contesto, in modo da avere una conoscenza di base del mondo tech e dei relativi ruoli che andranno a intervistare e con cui collaboreranno.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TOrr6FZO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/tomorrowdevs-corso.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TOrr6FZO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://theredcode.it/img/tomorrowdevs-corso.png" alt="" width="800" height="617"&gt;&lt;/a&gt;&lt;em&gt;Sito del corso&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Il corso partirà il &lt;strong&gt;23 ottobre&lt;/strong&gt; e conta già &lt;em&gt;20 iscritti&lt;/em&gt;, per cui rimangono solo &lt;strong&gt;5 posti&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Senza menzionare che ci sono anche due &lt;strong&gt;borse di studio&lt;/strong&gt; per seguire il corso gratuitamente, che &lt;a href="https://www.tomorrowdevs.com/"&gt;TomorrowDevs&lt;/a&gt; mette a disposizione per persone laureande/neolaureate in ambito HR o che hanno terminato un Master e vogliono entrare nel mondo del Tech Recruiting!&lt;/p&gt;

&lt;h1&gt;
  
  
  Parlando di successi e di questo percorso creato tramite la vostra sinergia, qual è il vostro prossimo obiettivo?
&lt;/h1&gt;

&lt;p&gt;Onestamente non ci aspettavamo un riscontro così &lt;em&gt;entusiasta&lt;/em&gt;, stiamo già pianificando la &lt;strong&gt;seconda edizione&lt;/strong&gt; per inizio 2024. Per il resto, &lt;strong&gt;le idee sono sempre tantissime&lt;/strong&gt; perché il settore ha tanto margine di innovazione e “freschezza”. Vedremo cosa ci riserverà il futuro!&lt;/p&gt;

&lt;h1&gt;
  
  
  Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Certo&lt;/strong&gt; , conosco molto bene il tema e a mio avviso una delle cose fondamentali è &lt;em&gt;parlarne&lt;/em&gt;. Organizzare eventi, condividere esperienze, fare rete e community su questi temi può davvero fare la differenza. Personalmente trovo che nel tech questo &lt;strong&gt;tema&lt;/strong&gt; risulta forse &lt;strong&gt;poco&lt;/strong&gt;  &lt;strong&gt;sentito&lt;/strong&gt; e bisogna parlarne maggiormente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nel mio piccolo&lt;/strong&gt; , per quanto possibile sia nella community Telegram sia nelle live su Twitch cerco di fare “&lt;em&gt;awareness&lt;/em&gt;” di questi temi e noto che, piano piano, qualcosa si muove (soprattutto nelle nuove generazioni, estremamente più attente a questi temi rispetto a noi, che apparteniamo a generazioni precedenti).&lt;/p&gt;

&lt;h1&gt;
  
  
  Contatti
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/guido-penta/"&gt;Profilo LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tomorrowdevs.com/corso-fullstack-recruiter/"&gt;Iscriviti al corso da tech recruiter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tomorrowdevs.com/"&gt;Sito TomorrowDevs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>interviste</category>
    </item>
    <item>
      <title>Come avviare un'istanza SQL Server su macOS Apple Silicon</title>
      <dc:creator>Serena Sensini</dc:creator>
      <pubDate>Thu, 28 Sep 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/serenasensini/come-avviare-unistanza-sql-server-su-macos-apple-silicon-2f3n</link>
      <guid>https://dev.to/serenasensini/come-avviare-unistanza-sql-server-su-macos-apple-silicon-2f3n</guid>
      <description>&lt;p&gt;&lt;a href="https://www.microsoft.com/en-us/sql-server"&gt;Microsoft SQL Server&lt;/a&gt; è uno dei sistemi di gestione dei database (&lt;a href="https://it.wikipedia.org/wiki/Relational_database_management_system"&gt;RDBMS&lt;/a&gt;) più popolari al mondo ma tradizionalmente era stato limitato all’uso su piattaforme con sistema operativo Windows. Attualmente, Microsoft SQL Server non è ufficialmente supportato per essere eseguito su &lt;a href="https://it.wikipedia.org/wiki/Apple_Silicon"&gt;macOS Apple Silicon&lt;/a&gt; ma solo su piattaforme hardware basate su architettura &lt;a href="https://it.wikipedia.org/wiki/X86-64"&gt;x86_64&lt;/a&gt; e sistemi operativi Windows e Linux.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Per maggiori informazioni sul supporto Linux, consiglio la lettura del documento &lt;a href="https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-ver16"&gt;Installation guidance for SQL Server on Linux&lt;/a&gt; e in particolare il paragrafo &lt;a href="https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-ver16#supportedplatforms"&gt;Supported platforms&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Qualora tu fossi un utente &lt;a href="https://www.apple.com/macos/ventura/"&gt;macOS&lt;/a&gt; (Apple Silicon) e avessi bisogno di utilizzare SQL Server per lo sviluppo o per altre attività, sarebbe possibile eseguire quest’ultimo utilizzando una&lt;a href="https://it.wikipedia.org/wiki/Macchina_virtuale"&gt;macchina virtuale (VM)&lt;/a&gt; o un &lt;a href="https://it.wikipedia.org/wiki/Virtualizzazione_a_livello_di_sistema_operativo"&gt;ambiente di containerizzazione&lt;/a&gt;. L’obiettivo è facilmente raggiungibile grazie a &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt;, e questo articolo ti guiderà attraverso i passaggi necessari per avviare SQL Server utilizzando &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt; su macOS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cos’è Colima
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt; è un progetto Open Source che implementa un &lt;a href="https://en.wikipedia.org/wiki/Open_Container_Initiative"&gt;container runtime&lt;/a&gt; che richiede una configurazione minima e funziona su sistemi operativi macOS e Linux. Le caratteristiche principali di questo tool sono:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intel and M1 Macs support&lt;/li&gt;
&lt;li&gt;Simple CLI interface&lt;/li&gt;
&lt;li&gt;Docker and Containerd support&lt;/li&gt;
&lt;li&gt;Port Forwarding&lt;/li&gt;
&lt;li&gt;Volume mounts&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Multiple instances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Colima è quindi un container runtime che esegue una VM Linux sul tuo Mac (in modo simile a come funziona &lt;a href="https://www.docker.com/products/docker-desktop/"&gt;Docker Desktop&lt;/a&gt; per Mac). Grazie al sistema di &lt;a href="https://github.com/abiosoft/colima/blob/main/docs/FAQ.md#can-config-file-be-used-instead-of-cli-flags"&gt;template&lt;/a&gt; (o anche da linea di comando), è possibile configurare la VM in modo tale che sia eseguita utilizzando l’&lt;a href="https://developer.apple.com/documentation/virtualization"&gt;hypervisor del framework di virtualizzazione nativo in macOS&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installazione del software
&lt;/h2&gt;

&lt;p&gt;Le prime operazioni da eseguire, riguardano l’installazione di tre principali componenti software:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rosetta&lt;/li&gt;
&lt;li&gt;Docker CLI&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://it.wikipedia.org/wiki/Rosetta_(software)"&gt;Rosetta&lt;/a&gt; è un software di emulazione sviluppato da Apple per i computer Mac con processori basati su architettura &lt;a href="https://it.wikipedia.org/wiki/Architettura_ARM"&gt;ARM&lt;/a&gt;, come il chip Apple M1. L’obiettivo principale di Rosetta è consentire l’esecuzione di applicazioni sviluppate per i processori Intel x86_64 su Mac con processori ARM64 senza richiedere alcuna modifica da parte degli sviluppatori delle applicazioni stesse. Questa tecnologia permette agli utenti di continuare a utilizzare le loro applicazioni esistenti su nuovi Mac con processori ARM.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/docker/cli"&gt;Docker CLI&lt;/a&gt; è uno strumento potente e flessibile che consente agli sviluppatori e agli amministratori di sistema di automatizzare il processo di creazione, gestione e distribuzione di applicazioni in container Docker.&lt;/p&gt;

&lt;p&gt;A seguire sono indicati i comandi necessari per l’installazione dei tre componenti. Per l’installazione di Docker e &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt; è necessario che sul vostro Mac sia installato il package manager &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Le versioni di riferimento di Docker e &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt;, per questo articolo, sono rispettivamente: 24.0.6 e 0.5.5.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Installazione di Rosetta, Docker e Colima
$ sudo softwareupdate --install-rosetta
$ brew install docker
$ brew install colima

# Verifica della versione di Docker
$ docker --version
Docker version 24.0.6, build ed223bc820

# Verifica della versione di Colima
$ colima version
colima version 0.5.5
git commit: 6251dc2c2c5d8197c356f0e402ad028945f0e830

runtime: docker
arch: aarch64
client: v24.0.6
server: v23.0.6

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output 1 - Installazione del software di base necessario per l’uso di Colima&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Al fine di poter sfruttare il framework di virtualizzazione nativo di macOS in combinazione con Rosetta, è necessario che la versione di macOS sia almeno la 13.x.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurazione di Colima
&lt;/h2&gt;

&lt;p&gt;Una volta che l’installazione del software è stata portata a termine con successo, possiamo procedere con la configurazione della macchina virtuale che deve essere creata al fine di fornire un kernel Linux per i container specifici x86_64 in esecuzione su macOS.&lt;/p&gt;

&lt;p&gt;Per configurare la VM secondo le specifiche richieste per l’esecuzione di SQL Server, è possibile agire sulla configurazione della VM attraverso il meccanismo dei template (in formato &lt;a href="https://it.wikipedia.org/wiki/YAML"&gt;yaml&lt;/a&gt;). Il template per il profilo di default è locato all’interno del folder &lt;code&gt;$HOME/.colima/_templates/default.yaml&lt;/code&gt;, in ogni caso, usando il comando &lt;code&gt;colima template --print&lt;/code&gt; riusciamo a ottenere il path assoluto del template di default.&lt;/p&gt;

&lt;p&gt;I parametri da configurare sul template per la nostra specifica VM sono:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;vmType&lt;/strong&gt; : imposta il tipo di VM che in questo caso deve essere &lt;strong&gt;vz&lt;/strong&gt; anziché quello predefinito, &lt;a href="https://it.wikipedia.org/wiki/QEMU"&gt;qemu&lt;/a&gt;. In questo modo potremo sfruttare il framework di virtualizzazione nativo di macOS (che richiede la versione 13 del sistema operativo);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rosetta&lt;/strong&gt; : abilita Rosetta in modo che sia possibile attivare l’emulazione per architetture amd64, così come richiesto da SQL Server Server. Il valore da impostare è &lt;strong&gt;true&lt;/strong&gt; (valido solo per Apple Silicon e vmType vz.) Il valore di default è false;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mountType&lt;/strong&gt; : imposta il driver per il mount dei volumi. Nel caso di macOS la scelta ricade su &lt;strong&gt;&lt;a href="https://virtio-fs.gitlab.io/"&gt;virtiofs&lt;/a&gt;&lt;/strong&gt;, dedicato alle VM vz su macOS. Il valore predefinito è sshfs;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cpu&lt;/strong&gt; : imposta il numero di CPU da allocare per la VM. Il valore di default è 2 ma consiglio di impostare il valore a 4;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;memory&lt;/strong&gt; : imposta la dimensione (in &lt;a href="https://it.wikipedia.org/wiki/Gibibyte"&gt;GiB&lt;/a&gt;) da allocare per la VM. Il valore di default è 2GiB che è il &lt;a href="https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-ver16#system"&gt;requisito minimo per l’SQL Server 2022&lt;/a&gt;, il mio consiglio è di portare il valore a 4.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Per apportare le modifiche sopra indicate alla configurazione del template, è necessario eseguire il comando &lt;code&gt;colima template&lt;/code&gt;. Il comando aprirà il file yaml del template per il profilo di default (se non diversamente specificato) utilizzando l’editor di default del vostro sistema o quello impostato tramite l’environment &lt;code&gt;$EDITOR&lt;/code&gt;. Nel caso in cui l’editor sia &lt;a href="https://www.vim.org/"&gt;vim&lt;/a&gt;, una volta eseguite le modifiche, usare il comando &lt;code&gt;:x&lt;/code&gt; per salvare la configurazione e uscire dall’editor.&lt;/p&gt;

&lt;p&gt;Su questo &lt;a href="https://gist.github.com/amusarra/9f39ee11e67f6df39eb227d2834c034e"&gt;GitHub Gist&lt;/a&gt; è disponibile il file di configurazione del template completo.&lt;/p&gt;

&lt;p&gt;Le configurazioni sopra impostate nel file del template, possono essere passate come parametri del comando &lt;code&gt;colima start&lt;/code&gt;. La mia preferenza è avere questi parametri di configurazione persistenti in un file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting up Colima
&lt;/h2&gt;

&lt;p&gt;Da questo momento è possibile creare la macchina virtuale dal template configurato in precedenza eseguendo il comando &lt;code&gt;colima start&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Il comando crea e avvia una VM così come configurata in precedenza. Inoltre, modifica il contesto del comando &lt;code&gt;docker&lt;/code&gt;, pertanto, quando si utilizzeranno i comandi docker, questi saranno inviati al runtime appena creato.&lt;/p&gt;

&lt;p&gt;L’output finale che dovreste ottenere eseguendo il comando &lt;code&gt;colima start&lt;/code&gt; dovrebbe essere quello indicato a seguire.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INFO[0000] starting colima
INFO[0000] runtime: docker
INFO[0000] creating and starting ... context=vm
INFO[0021] provisioning ... context=docker
INFO[0021] starting ... context=docker
INFO[0026] done

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output 2 - Output finale a fronte dell’esecuzione del comando colima start&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eseguendo il comando &lt;code&gt;colima status&lt;/code&gt; dovreste ottenere le informazioni circa il runtime appena avviato.&lt;/p&gt;

&lt;p&gt;L’output dovrebbe essere uguale a quello indicato a seguire a meno delle coordinate del socket.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INFO[0000] colima is running using macOS Virtualization.Framework
INFO[0000] arch: aarch64
INFO[0000] runtime: docker
INFO[0000] mountType: virtiofs
INFO[0000] socket: unix:///Users/&amp;lt;vostra-username&amp;gt;/.colima/default/docker.sock

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output 3 - Output del comando colima status&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eseguendo il comando &lt;code&gt;docker context list&lt;/code&gt; è possibile verificare che il contesto di default sia quello di &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt; (identificato attraverso il carattere *). A seguire l’output del comando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME DESCRIPTION DOCKER ENDPOINT ERROR
colima * colima unix:///Users/&amp;lt;vostra-username&amp;gt;/.colima/default/docker.sock
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock
desktop-linux Docker Desktop unix:///Users/&amp;lt;vostra-username&amp;gt;/.docker/run/docker.sock

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output 4 - Visualizzazione dei contesti Docker con evidenza di quello attivo (in questo caso colima)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Su &lt;a href="https://asciinema.org/a/606535"&gt;asciinema&lt;/a&gt; è disponibile l’intero processo di starting up e verifica del runtime di &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://asciinema.org/a/606535"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--quknhvXH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://asciinema.org/a/606535.svg" alt="asciicast" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Asciicast 1 - Processo di starting up e verifica del runtime di Colima&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting SQL Server Container
&lt;/h2&gt;

&lt;p&gt;Adesso che il runtime di &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt; è operativo, siamo nelle condizioni di poter creare ed eseguire il container di SQL Server a partire da una delle immagini pubblicate sull’account Docker Hub ufficiale di Microsoft. La pagina &lt;a href="https://hub.docker.com/_/microsoft-mssql-server?tab=description"&gt;Docker Hub&lt;/a&gt; descrive nel dettaglio le modalità d’uso, i tag dell’immagini (quindi delle versioni di SQL Server) che sono disponibili su &lt;a href="https://mcr.microsoft.com/v2/mssql/server/tags/list"&gt;https://mcr.microsoft.com/v2/mssql/server/tags/list&lt;/a&gt; e il significato dei nomi dei tag.&lt;/p&gt;

&lt;p&gt;Per avviare una configurazione minimale di SQL Server, è possibile eseguire il comando docker indicato seguire. Nello specifico, la versione di riferimento di SQL Server è la 2022 CU7 Ubuntu 20.04. Il comando &lt;code&gt;docker run&lt;/code&gt; si occuperà di eseguire il pull dell’immagine se necessario.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker run \
 --env 'ACCEPT_EULA=Y' \
 --env 'MSSQL_SA_PASSWORD=YourStrong@Passw0rd' \
 --name 'sqlserver-2022' \
 --hostname 'sqlserver-2022' \
 --publish 1433:1433 \
 --detach \
 --platform linux/amd64 mcr.microsoft.com/mssql/server:2022-CU7-ubuntu-20.04

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output 5 - Creazione e run del container SQL Server versione 2022&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Per chi ha della curiosità sull’uso dei tag, esiste questo post sul &lt;a href="https://www.theredcode.it/perch%C3%A9-il-tag-latest-non-va-utilizzato/"&gt;perché il tag “latest” non vada utilizzato&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Riprendendo la configurazione, a seguire è mostrato l’output che dovreste ottenere a fronte dell’esecuzione del comando precedente. La prima riga informa che l’immagine non è presente sul sistema locale e di conseguenza provvede a reperire l’immagine dal registry. Una volta completato il pull dell’immagine &lt;code&gt;mcr.microsoft.com/mssql/server:2022-CU7-ubuntu-20.04&lt;/code&gt;, il container sarà creato ed eseguito; l’ultima riga mostra l’identificativo assegnato al container, ovvero, il &lt;em&gt;containerId&lt;/em&gt; (vedi riga 9 di Console 6).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unable to find image 'mcr.microsoft.com/mssql/server:2022-CU7-ubuntu-20.04' locally
2022-CU7-ubuntu-20.04: Pulling from mssql/server
5b07ce5bcac1: Pull complete
b5f87f539427: Pull complete
8cf84f077c03: Pull complete
05a221025c3d: Pull complete
Digest: sha256:5362c818aad4a787e3bac20d19a2e8db7ac91cdc30b359c176bc986547b0c2d0
Status: Downloaded newer image for mcr.microsoft.com/mssql/server:2022-CU7-ubuntu-20.04
52a65e2200082558ac1accaf9ccc7d03679096a19f095b97809abfb1b7462a30

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output 6 - Output del comando docker run di creazione ed esecuzione del container SQL Server&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eseguendo il comando &lt;code&gt;docker ps -l&lt;/code&gt;, dovreste vedere una serie d’informazioni circa l’ultimo container creato. A seguire un esempio dell’output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52a65e220008 mcr.microsoft.com/mssql/server:2022-CU7-ubuntu-20.04 "/opt/mssql/bin/perm…" 2 hours ago Up 2 hours 0.0.0.0:1433-&amp;gt;1433/tcp, :::1433-&amp;gt;1433/tcp sqlserver-2022

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output 7 - Output del comando docker ps -l&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Come ultima verifica, potremmo provare a controllare il banner della versione di SQL Server eseguendo l’istruzione SQL &lt;code&gt;SELECT @@VERSION&lt;/code&gt; attraverso il comando &lt;code&gt;docker exec&lt;/code&gt;, così come mostrato a seguire.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost,1433 -U SA -P "YourStrong@Passw0rd" -Q 'SELECT @@VERSION'

# Output del comando
Microsoft SQL Server 2022 (RTM-CU7) (KB5028743) - 16.0.4065.3 (X64)
 Jul 25 2023 18:03:43
 Copyright (C) 2022 Microsoft Corporation
 Developer Edition (64-bit) on Linux (Ubuntu 20.04.6 LTS) &amp;lt;X64&amp;gt;

(1 rows affected)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Output 8 - Esecuzione dell’istruzione SQL per verificare la versione di SQL Server&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se non diversamente specificato tramite l’environment &lt;code&gt;MSSQL_PID&lt;/code&gt;, l’edizione di default è la &lt;em&gt;Developer Edition&lt;/em&gt; (vedi riga 7 del codice precedente).&lt;/p&gt;

&lt;p&gt;Su &lt;a href="https://asciinema.org/a/606537"&gt;asciinema&lt;/a&gt; è disponibile l’intero processo di creazione ed esecuzione del container di SQL Server e la successiva esecuzione del comando &lt;code&gt;docker exec&lt;/code&gt; di verifica del banner di SQL Server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://asciinema.org/a/606537"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k-XihHs4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://asciinema.org/a/606537.svg" alt="asciicast" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Asciicast 2 - Processo di creazione ed esecuzione del container di SQL Server e successiva esecuzione del comando docker exec&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Nota personale
&lt;/h2&gt;

&lt;p&gt;Per lo sviluppo software utilizzo due tipi di macchine: una &lt;a href="https://dev.to/amusarra/la-mia-workstation-di-sviluppo-da-smart-worker-33k1"&gt;Workstation basata su AMD e Fedora Linux&lt;/a&gt; (da me assemblata) e il Mac Book Pro con macOS. Dal momento in cui ho eseguito il passaggio a Apple Silicon, sono stato costretto a trovare una soluzione che mi consentisse l’esecuzione di quei container esclusivamente compatibili con piattaforme x86. SQL Server è uno degli strumenti che uso regolarmente e compatibile solo con architetture x86 e lo stesso vale per esempio vale per Oracle Database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt; è stato la mia salvezza, soprattutto per il fatto che supporta K8s e la configurazione tramite template YAML. Ho buttato via Docker Desktop (anche per via del &lt;a href="https://www.docker.com/pricing/faq/"&gt;cambio delle politiche di licenza&lt;/a&gt;) e sostituito con &lt;a href="https://github.com/abiosoft/colima"&gt;Colima&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Per chi non conosce Docker nel dettaglio o desidera approfondire l’argomento, si consiglia il libro &lt;a href="https://www.apogeonline.com/libri/docker-serena-sensini/"&gt;Docker - Sviluppare e rilasciare software tramite container&lt;/a&gt; di &lt;a href="https://www.linkedin.com/in/serena-sensini/"&gt;Serena Sensini&lt;/a&gt; (la versione eBook è scontata del 50% fino al primo ottobre).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Contatti
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dontesta.it/"&gt;Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/amusarra/"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//mailto:antonio.musarra@gmail.com"&gt;E-mail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>sqlserver</category>
      <category>macos</category>
    </item>
  </channel>
</rss>
