avatar

Come funziona il routing in Ionic 6 @ Serena Sensini | Giovedì 28 Aprile 2022 | 6 minuti

 

Una parte fondamentale dello sviluppo di app Ionic è configurare il routing e garantire una navigazione fluida tra le pagine.

 

In questo articolo andiamo ad analizzare le differenze e diversi esempi di come sfruttare il routing in Ionic!

 

Cos’è

 

Per spiegarne il funzionamento, facciamo riferimento agli strumenti messi a disposizione da Angular come l’oggetto Router, anche se molto dipende dalla tecnologia che usiamo insieme a Ionic.

 

Angular fornisce il modulo RouterModule che contiene tutti gli strumenti di cui avremo bisogno per configurare la nostra applicazione in modo tale da mostrare una diversa view a seconda dell’indirizzo digitato nella barra del browser.

 

Come funziona

 

Prima di continuare con la spiegazione, apriamo però un momento il file index.html presente nella cartella src di una qualsiasi app in Ionic, di cui qui riportiamo un esempio:

 

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8" />
  <title>Ionic App</title>

  <base href="/" />

  <meta name="color-scheme" content="light dark" />
  <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
  <meta name="format-detection" content="telephone=no" />
  <meta name="msapplication-tap-highlight" content="no" />

  <link rel="icon" type="image/png" href="assets/icon/favicon.png" />

  <!-- add to homescreen for ios -->
  <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
</head>

<body>
  <app-root></app-root>
</body>

</html>

 

Come possiamo notare dal frammento di codice riportato sopra, immediatamente dopo l’elemento </em> è presente un elemento <em><base href="/"></em> avente un attributo <em>href</em> impostato al valore <em>’/’</em>.</p> <p> </p> <p>Con questa proprietà andiamo ad indicare l’URL di base rispetto al quale sono relativi tutti i <em>path</em> utilizzati dell’applicazione e si tratta di un elemento necessario.</p> <p> </p> <p>Infatti nelle versioni di Angular successive alla 2 la strategia predefinita per comporre le <em>route</em> prende il nome contenuto in <em>PathLocationStrategy</em> e si avvale della <a href="https://developer.mozilla.org/en-US/docs/Web/API/History_API">History API</a> per gestirne lo storico, ossia il meccanismo con cui gestire lo storico della sessione del browser.</p> <p> </p> <p>Se avessimo cambiato il valore dell’attributo <em>href</em> dell’elemento <em><base></em>, per esempio <em><base href="/la-mia-app"></em>, la pagina iniziale della nostra applicazione sarebbe stata mostrata partendo dall’indirizzo <em>http://localhost:4200/la-mia-app/</em>.</p> <p> </p> <p>Questo significa di conseguenza che tutti gli altri percorsi sarebbero stati automaticamente costruiti a partire dalla base fornita, e quindi per esempio <em>http://localhost:4200/la-mia-app/my-route</em>.</p> <p> </p> <h1 id="esempi">Esempi</h1> <p> </p> <h2 id="creazione-di-una-nuova-pagina">Creazione di una nuova pagina</h2> <p> </p> <p>Quando aggiungi una nuova pagina al tuo progetto Ionic, questa viene automaticamente aggiunta alla configurazione di <em>routing</em> all’interno di <em>app-routing.module.ts,</em> come visibile nella penultima riga della seguente immagine:</p> <p> </p> <p><img src="/img/Immagine-2022-04-12-113735.png" alt="Esempio di creazione di una pagina in Ionic"> Esempio di creazione di una pagina in Ionic</p> <p> </p> <p>Questo significa che potremo utilizzare la route definita all’interno del file di <em>routing</em> in qualsiasi altra pagina per navigarne il contenuto.</p> <p> </p> <h2 id="utilizzo-di-una-pagina-esistente">Utilizzo di una pagina esistente</h2> <p> </p> <p>Puoi utilizzare la stessa pagina in più posizioni assicurandoti che esista un percorso per essa da tali posizioni.</p> <p> </p> <p>Ad esempio, se desideri che la pagina “<em>Dettaglio</em>” sia accessibile all’interno di <em>Tab1</em> della tua applicazione e <em>Tab2,</em> devi avere una dichiarazione del path /<em>detail</em> nel router del file <em>app-routing.module.ts</em> sia per <em>Tab1</em> che per <em>Tab2</em>.</p> <p> </p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">NgModule</span> } <span style="color:#66d9ef">from</span> <span style="color:#e6db74">'@angular/core'</span>; </span></span><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">RouterModule</span>, <span style="color:#a6e22e">Routes</span> } <span style="color:#66d9ef">from</span> <span style="color:#e6db74">'@angular/router'</span>; </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">routes</span>: <span style="color:#66d9ef">Routes</span> <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> [ { <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'detail'</span>, <span style="color:#a6e22e">component</span>: <span style="color:#66d9ef">DetailPage</span>}, </span></span><span style="display:flex;"><span>{ <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'tab1'</span>, <span style="color:#a6e22e">component</span>: <span style="color:#66d9ef">Tab1Component</span>}, </span></span><span style="display:flex;"><span>... </span></span></code></pre></div><p> </p> <h2 id="utilizzare-routerlink">Utilizzare routerLink</h2> <p> </p> <p>Quando cerchiamo di andare verso un’altra pagina tramite un pulsante o un qualsiasi altro elemento, possiamo utilizzare la proprietà <em>routerLink</em> specificando la pagina o il percorso che deve portarci ad una pagina diversa.</p> <p> </p> <blockquote> <p>Se questa istruzione non funzionasse e generasse un errore, assicurarati che il modulo <em>RouterModule</em> sia incluso nel modulo delle tue pagine!</p> </blockquote> <p> </p> <p>Nell’esempio seguente, analizziamo un caso d’uso e facciamo in modo che l’utente venga rimandato alla pagina <em>detail</em> di un prodotto (e lo specifichiamo grazie all’ID dell’oggetto) quando clicca sull’elemento <em>ion-item</em>.</p> <p> </p> <pre tabindex="0"><code class="language-markup" data-lang="markup"><ion-item [routerLink]="'/detail/' + item.id" routerDirection="forward" ></ion-item> </code></pre><p> </p> <p>In questo modo, avvieremo <em>DetailPage</em> e le forniremo un parametro <em>id</em> <em>route,</em> che potremo anche utilizzare all’interno del componente.</p> <p> </p> <p>Questo è in qualche modo molto <em>vantaggioso</em> perché significa che non è sempre necessario impostare un’associazione di eventi e coinvolgere il <em>NavController</em> ogni volta che si desidera passare a un’altra pagina fornendo dei dati.</p> <p> </p> <p>Si noti inoltre che sempre nell’esempio forniamo un <em>routerDirection</em> per indicare se si tratta di una navigazione in avanti o indietro in modo che l’animazione di transizione dello schermo possa essere applicata correttamente.</p> <p> </p> <blockquote> <p>Se questo non viene fornito, Ionic <em>indovinerà</em> quale animazione dovrebbe utilizzare, ma è meglio essere espliciti.</p> </blockquote> <p> </p> <p>Analizziamo ora il file <em>app-routing.module.ts</em>:</p> <p> </p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">NgModule</span> } <span style="color:#66d9ef">from</span> <span style="color:#e6db74">'@angular/core'</span>; </span></span><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">RouterModule</span>, <span style="color:#a6e22e">Routes</span> } <span style="color:#66d9ef">from</span> <span style="color:#e6db74">'@angular/router'</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">routes</span>: <span style="color:#66d9ef">Routes</span> <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">''</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">component</span>: <span style="color:#66d9ef">HomeComponent</span> </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'saldi'</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">component</span>: <span style="color:#66d9ef">SaldiComponent</span> </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'sconti'</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">redirectTo</span>: <span style="color:#66d9ef">SaldiComponent</span> </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'not-authorized'</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">component</span>: <span style="color:#66d9ef">UnauthorizedComponent</span>, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'not-found'</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">component</span>: <span style="color:#66d9ef">ErrorComponent</span>, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'**'</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">redirectTo</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'/not-found'</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">data</span><span style="color:#f92672">:</span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'Pagina non trovata'</span> </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>]; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">@NgModule</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">imports</span><span style="color:#f92672">:</span> [ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">RouterModule</span>.<span style="color:#a6e22e">forRoot</span>(<span style="color:#a6e22e">routes</span>) </span></span><span style="display:flex;"><span> ], </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">exports</span><span style="color:#f92672">:</span> [ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">RouterModule</span> </span></span><span style="display:flex;"><span> ], </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">declarations</span><span style="color:#f92672">:</span> [] </span></span><span style="display:flex;"><span>}) </span></span><span style="display:flex;"><span><span style="color:#66d9ef">export</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">AppRoutingModule</span> { } </span></span></code></pre></div><p> </p> <p>Ciascun oggetto ha una proprietà <em>path</em> pari al percorso in corrispondenza del quale vogliamo venga mostrato un certo componente che indichiamo con la proprietà component.</p> <p> </p> <p>Nell’esempio ci sono poi degli oggetti leggermente diversi dagli altri. Notate infatti che nell’ultimo oggetto dell’array abbiamo assegnato il simbolo ‘**’ alla proprietà <em>path</em>.</p> <p> </p> <p>Si tratta della cosiddetta <em>wildcard</em> <em>route</em>, una sorta di percorso jolly che intercetta qualsiasi URL.</p> <p> </p> <p>È bene sottolineare una proprietà importante da tenere in mente quando si definisce l’oggetto <em>Routes:</em> infatti <strong>l’ordine</strong> in cui vengono inseriti i diversi oggetti di tipo <em>Route</em> nell’array è <strong>rilevante!</strong></p> <p> </p> <p>Il Router di Angular, dovendo decidere quale componente mostrare in corrispondenza di un certo percorso, inizia a scorrere l’array dal primo oggetto e si ferma non appena ne trova uno con una proprietà ‘<em>path</em>’ che corrispone al percorso.</p> <p> </p> <p>Per questo motivo è necessario inserire l’oggetto avente la <em>wildcard</em> route come proprietà <em>path</em> alla fine dell’array altrimenti verrebbero individuati tutti i percorsi e verrebbe sempre mostrato il componente <em>PageNotFoundComponent</em>.</p> <p> </p> <p>Abbiamo poi usato nel file di <em>routing</em> un altro oggetto con una proprietà <em>redirectTo</em> che fa in modo di redirigere il browser all’indirizzo con percorso pari a ‘/<em>saldi</em>’ ogni volta che si accede al percorso ‘/<em>sconti</em>’.</p> <p> </p> <h2 id="utilizzo-di-router">Utilizzo di Router</h2> <p> </p> <p>Per navigare in modo programmatico attraverso le diverse pagine, è possibile utilizzare il <a href="https://angular.io/api/router/Router">Router</a> standard di Angular nelle tue pagine e chiamando uno di questi metodi:</p> <p> </p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span>... </span></span><span style="display:flex;"><span><span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">router</span>.<span style="color:#a6e22e">navigateByUrl</span>(<span style="color:#e6db74">'/login'</span>); </span></span><span style="display:flex;"><span><span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">router</span>.<span style="color:#a6e22e">navigate</span>([<span style="color:#e6db74">'/detail'</span>, { <span style="color:#a6e22e">id</span>: <span style="color:#66d9ef">itemId</span> }]); </span></span><span style="display:flex;"><span>... </span></span></code></pre></div><p> </p> <p>Il primo naviga in maniera puntuale verso una pagina ed è l’equivalente di <em>routerLink</em>, ma questo può essere utilizzato all’interno del file *<em>.ts.</em></p> <p> </p> <blockquote> <p>Per poterlo questa modalità di routing in Ionic, è necessario importarlo nel <em>constructor</em> del componente/servizio che utilizziamo!</p> </blockquote> <p> </p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MyComponent</span> { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">constructor</span>(<span style="color:#a6e22e">router</span>: <span style="color:#66d9ef">Router</span>) { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">router</span>.<span style="color:#a6e22e">navigateByUrl</span>(...); </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><p> </p> <p>La funzione <em>navigate</em> permette invece di creare un nuovo URL applicando quanto passato nell’array, con la possibilità di aggiungere dei parametri extra, come l’ID che viaggerà insieme all’indirizzo della <em>route</em> e potrà essere utilizzato nel componente di destinazione.</p> <p> </p> <h2 id="utilizzo-di-navcontroller">Utilizzo di NavController</h2> <p> </p> <p>Il modo migliore per navigare a livello di codice in un’applicazione Ionic o Angular è utilizzare <a href="https://ionicframework.com/docs/angular/navigation"><em>NavController</em></a>.</p> <p> </p> <p>Questo è in realtà abbastanza simile al modo in cui avresti utilizzato il <em>routerLink</em> per navigare da una pagina all’altra specificando la direzione, tranne per il fatto che ora hai tutto all’interno di uno di questi metodi, come mostrato di seguito:</p> <p> </p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">navCtrl</span>.<span style="color:#a6e22e">navigateForward</span>(<span style="color:#e6db74">'/my-route'</span>); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">navCtrl</span>.<span style="color:#a6e22e">navigateBack</span>(<span style="color:#e6db74">'/my-route'</span>); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">navCtrl</span>.<span style="color:#a6e22e">navigateRoot</span>(<span style="color:#e6db74">'/my-route'</span>); </span></span></code></pre></div><p> </p> <p>Il vantaggio dell’utilizzo di <em><a href="https://ionicframework.com/docs/angular/navigation">NavController</a></em> per navigare è che consente di specificare una “<em>direzione</em>” per la navigazione attraverso la funzione, che aiuterà <<em>ion-router-outlet></em> di Ionic a visualizzare correttamente la transizione della pagina.</p> <p> </p> <blockquote> <p>Che viaggio quello nel mondo dei router!</p> </blockquote> <p> </p> <h1 id="risorse-utili">Risorse utili</h1> <ul> <li><a href="https://amzn.to/3JxJSQ6">Manuale Ionic in italiano</a></li> <li><a href="https://ionicframework.com/docs/v5/studio/guides/routing-and-navigation">Routing in Ionic nella doc ufficiale</a></li> </ul> <p> </p> <h1>Ti potrebbe interessare anche... </h1> <ul> <li class="relatedPost"> <a href="/ionic/creare-una-direttiva-con-ionic/">Creare una direttiva con Ionic</a><br /> </li> <li class="relatedPost"> <a href="/aws/hosting-con-aws/">Hosting con S3 e Route 53 per Angular</a><br /> </li> <li class="relatedPost"> <a href="/fare-economia-con-angular/">Fare economia con Angular</a><br /> </li> </ul> </article> </section> <article class="ui segment utterances-comments" data-html2canvas-ignore> <script src="https://utteranc.es/client.js" repo="g1eny0ung/g1eny0ung.github.io" issue-term="og:title" theme="github-light" crossorigin="anonymous" async> </script> </article> </div> </div> <footer class="ui basic center aligned segment" style="background-color: transparent;"> <span class="dream-share"> <a href="https://twitter.com/theredcode_it" title="Twitter" target="_blank"> <i class="twitter icon"></i> </a> <a href="https://www.facebook.com/theredcode.it" title="Facebook" target="_blank"> <i class="facebook icon"></i> </a> <a href="https://www.linkedin.com/company/theredcode-it" title="LinkedIn" target="_blank"> <i class="linkedin icon"></i> </a> <a href="https://www.instagram.com/theredcode_it/" title="Instagram" target="_blank"> <i class="instagram icon"></i> </a> <a href="https://www.patreon.com/theredcode_it" title="Patreon" target="_blank"> <i class="patreon icon"></i> </a> </span> <p>© 2021 - 2022 TheRedCode | <a href="/cookie" title="Cookie Policy"> Cookie Policy </a> </p> </footer> </div> </section> <section class="back"> <div class="dream-max-width"> <header class="ui basic very padded segment dream-header"> <div class="ui image"> <a href="/"> <img src="/img/theRedCode_logo_xl.png" alt="avatar" /> </a> <div class="subheader content"> <h1 class="ui large header main-header"> <span class="sub header" id="motto"> </span> </h1> </div> </div> </header> <div class="ui relaxed grid dream-grid dream-back"> <div class="sixteen wide mobile eight wide tablet four wide computer column dream-column"> <article class="ui segment"> <div class="ui medium header">Social</div> <nav class="ui secondary menu dream-menu dream-socials"> <a class="item" href="/index.xml"> <i class="large rss square icon" title="RSS"></i> </a> <a class="item" href="mailto:info@theredcode.it"> <i class="large mail icon" title="Email"></i> </a> <a class="item" href="https://twitter.com/theredcode_it" target="_blank"> <i class="large twitter icon" title="Twitter"></i> </a> <a class="item" href="https://facebook.com/theredcode.it" target="_blank"> <i class="large facebook icon" title="Facebook"></i> </a> <a class="item" href="https://instagram.com/theredcode.it" target="_blank"> <i class="large instagram icon" title="Instagram"></i> </a> <a class="item" href="https://www.linkedin.com/in/theredcode-it" target="_blank"> <i class="large linkedin icon" title="Linkedin"></i> </a> <a class="item" href="https://github.com/serenasensini/" target="_blank"> <i class="large github icon" title="GitHub"></i> </a> <a class="item" href="https://twitter.com/g1eny0ung" target="_blank"> <i class="large twitter icon" title="Twitter"></i> </a> <a class="item" href="https://facebook.com/g1eny0ung" target="_blank"> <i class="large facebook icon" title="Facebook"></i> </a> <a class="item" href="https://instagram.com/g1eny0ung" target="_blank"> <i class="large instagram icon" title="Instagram"></i> </a> <a class="item" href="https://www.linkedin.com/in/g1eny0ung" target=""> <i class="large linkedin icon" title="Linkedin"></i> </a> <a class="item" href="https://github.com/g1eny0ung" target="_blank"> <i class="large github icon" title="GitHub"></i> </a> <a class="item" href="https://stackoverflow.com/users/5676489/g1eny0ung" target="_blank"> <i class="large stack overflow icon" title="stack overflow"></i> </a> </nav> </article> </div> <div class="sixteen wide mobile eight wide tablet four wide computer column dream-column"> </div> </div> </div> </section> </div> </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <script> window.store = { "https:\/\/theredcode.it\/design-dev\/alternative-a-google-analytics\/": { "title": "5 alternative a Google Analytics", "tags": ["design-dev",], "content": "Cosa vedrai Intro Umami Matomo Fathom Clicky Plausible Intro Da qualche settimana il Garante per la protezione dei dati personali in Italia ha dichiarato illecito l\u0026rsquo;uso dei dati raccolti tramite Google Analytics (GA3) sul nostro territorio.\nIl problema principale è che i dati raccolti, come indirizzo IP, sistema operativo utilizzato o data dell\u0026rsquo;accesso dell\u0026rsquo;utente al sito possono essere trasferiti negli Stati Uniti, paese che non ha lo stesso livello di protezione dei dati e della privacy degli stessi.\nDire addio a Google Analytics può essere un problema, essendo un servizio gratuito e utilizzato sia da coloro che gestiscono siti personali, sia da chi ha in mano portali con migliaia di pagine visualizzate al mese.\nIn questo articolo riportiamo 5 alternative (gratuite e non) da utilizzare per cambiare piattaforma!\nUmami Umami è un\u0026rsquo;alternativa free a Google Analytics semplice, veloce e incentrata sulla privacy. Basato su Next.js, richiede l\u0026rsquo;utilizzo di un database Postgres o MySQL ed è rilasciato sotto licenza MIT: questo vuol dire che può essere installato su qualsiasi servizio di hosting e modificato a piacimento, senza dover pagare alcun servizio.\nPuò essere installato su DigitalOcean, Heroku, Railway e moltissimi altri servizi di hosting online, dove il costo da sostenere è solo relativo all\u0026rsquo;hosting.\nLa configurazione è semplice e richiede la configurazione di un database dove memorizzare i dati e dopodiché sarà sufficiente eseguire la build del progetto clonato da Git.\nEsempio di dashboard Umami\nEsempio di dashboard completa\nScopri di più\nDemo\nMatomo Ottima soluzione per chi cerca un servizio di report analitici completo molto vicino a Google Analytics; questo prevede due opzioni, una free on-premise che quindi va installata su un proprio server, e una on-cloud che ha un costo di 19 euro al mese.\nSi tratta di un\u0026rsquo;opzione molto valida che però, come per Umami, richiede delle conoscenze tecniche per la configurazione e l\u0026rsquo;installazione. Poco male, no?\nEsempio di dashboard Matomo\nScopri di più\nDemo\nFathom Fathom è un\u0026rsquo;alternativa a Google Analytics che non compromette la privacy dei visitatori per i dati, in quanto compliant al GDPR. Come riportato sul loro sito, il traffico generato e i relativi dati raccolti vengono riportati su infrastrutture con base europea.\nÈ disponibile una settimana di prova gratuita, dopodiché il servizio diventa a pagamento: 14 dollari al mese fino a 100.000 views, e poi a salire.\nScopri di più\nClicky Si tratta di un servizio piuttosto basic, con delle dashboard minimali che permettono di monitorare e analizzare il traffico in base a visitatori, contenuto, paese di provenienza e volume in tempo reale.\nIn questo caso, abbiamo a disposizione un piano free che prevede il monitoraggio di un solo sito web con un volume massimo di 3000 view al giorno, e diversi piani a pagamento che partono da un prezzo di 9.99 dollari al mese.\nScopri di più\nDemo\nPlausible Plausibile è un\u0026rsquo;analisi web leggera e open source. Non richiede nessun cookie e pienamente conforme a GDPR, è stato realizzato e ospitato nell\u0026rsquo;UE, grazie ad un\u0026rsquo;infrastruttura cloud di proprietà europea.\nQuesta opzione prevede un free trial di 30 giorni, per poi passare ad un piano che prevede un costo di 9 euro al mese per un volume di 10.000 view al mese, con dei limiti piuttosto alti sulle risorse che è possibile monitorare: fino a 50 siti web, alert customizzabili e integrabili con servizio e-mail e Slack con il piano di base.\nDashboard Plausible di demo\nScopri di più\nDemo\nRisorse utili Google Analytics 4, non è illegale: come usarlo bene ed evitare problemi col Gdpr Se ti è piaciuto questo articolo, non ti dimenticare di commentare e condividere! ⬇️\n ", "url": "https:\/\/theredcode.it\/design-dev\/alternative-a-google-analytics\/" }, "https:\/\/theredcode.it\/categories\/": { "title": "Categories", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/" }, "https:\/\/theredcode.it\/tags\/design-dev\/": { "title": "design-dev", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/design-dev\/" }, "https:\/\/theredcode.it\/categories\/design-dev\/": { "title": "design-dev", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/design-dev\/" }, "https:\/\/theredcode.it\/posts\/": { "title": "Posts", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/posts\/" }, "https:\/\/theredcode.it\/tags\/": { "title": "Tags", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/" }, "https:\/\/theredcode.it\/": { "title": "TheRedCode", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/" }, "https:\/\/theredcode.it\/categories\/event\/": { "title": "event", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/event\/" }, "https:\/\/theredcode.it\/eventi\/": { "title": "Eventis", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/eventi\/" }, "https:\/\/theredcode.it\/eventi\/reactjs-day-2022\/": { "title": "ReactJS Day 2022 @ Bologna", "tags": [], "content": "Quando: 21 ottobre 2022\nDove: Verona\nTitolo: ReactJS Day 2022\nCodice sconto (da condividere!): 10% con community_THEREDCODE\nVuoi vincere il BIGLIETTO GRATUITO?: segui TheRedCode sui canali social per scoprire come vincerlo, o contattaci!\nPartecipa all’evento\nOrganizzato da: Grusp\n", "url": "https:\/\/theredcode.it\/eventi\/reactjs-day-2022\/" }, "https:\/\/theredcode.it\/tags\/agile\/": { "title": "agile", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/agile\/" }, "https:\/\/theredcode.it\/tags\/design\/": { "title": "design", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/design\/" }, "https:\/\/theredcode.it\/design-dev\/scrum-development-team\/": { "title": "Development Team in Scrum", "tags": ["agile","design","dsdm","ingegneria-del-software",], "content": "Negli ultimi articoli abbiamo parlato del ruolo di Product Owner e di Scrum Master e di come un vero team debba seguirli per vincere ogni sfida.\nOggi diamo spazio ad un altro ruolo estremamente importante: il Development Team!\nDevelopment team: cos\u0026rsquo;è Il Development team (abbreviato in Dev Team) è un gruppo di persone che hanno competenze tali da poter svolgere molteplici mansioni durante gli sviluppi, definite anche cross-functional. Esse infatti avranno la responsabilità di produrre valore ad ogni sprint, occupandosi di attività quali design, sviluppo e test.\nLe sue responsabilità Perform sprint execution Durante l\u0026rsquo;esecuzione dello sprint, i membri del team fanno un hands-on, mettendo in atto un lavoro creativo di desing, realizzazione e test degli sviluppi da portare a termine, organizzandosi autonomamente in ogni attività.\nIspezione e adattamento ogni giorno Ogni membro del Dev team dovrebbe partecipare ad ogni daily (aka, riunione giornaliera della durata massima di 15 minuti), durante il quale vengono ispezionati i progressi verso lo sprint goal, adattando il piano per il lavoro del giorno corrente.\nRifinitura del backlog Parte di ogni sprint dovrebbe essere dedicata alla preparazione dello sprint successivo, effettuata durante un evento definito Grooming, che include creazione, perfezionamento e stima delle storie. Il dev team dovrebbe dedicare a tale attività il 10% del tempo che ha a disposizione.\nSprint planning All\u0026rsquo;inizio di ogni sprint, il Dev team partecipa al planning. In collaborazione con il Product Owner e con la facilitazione dello Scrum master, stabilisce uno sprint goal e seleziona un set di storie utili al suo raggiungimento. \nAttività di ispezione e adattamento di prodotto e processi Al termine di ogni Sprint, il dev team partecipa a due eventi utili ad ispezionare i s risultati e fondamentali per migliorare i processi.\nSprint Review : Evento in cui dev team, Product Owner, Scrum Master, Sponsor, Cliente e tutti gli stakeholder interessati, revisionano le feature completate nello sprint corrente, e collaborano insieme dando il proprio feedback, al fine di suggerire ulteriori miglioramenti per il prodotto, ma anche per esprimere la loro soddisfazione in merito a quanto sviluppato.\nSprint retrospective : Evento in cui tutto lo Scrum Team si riunisce, per ispezionare e adattare processi, tecniche e tutto ciò che può essere utile a rilasciare un maggior valore e portare ad una collaborazione più efficace.\nSkills Ma quali sono le competenze che deve possedere un Development Team?\n Self-organizing: i membri del team di auto-organizzano per determinare il modo migliore per raggiungere lo sprint goal, non c\u0026rsquo;è un manager che decide per loro e lo scrum master non dovrebbe presumere di farlo.\n Cross functionality diverse and sufficient: i membri del dev team, dovrebbero avere skill differenti, sufficienti a formare un team in grado di produrre features che rispettino la Definition of Done. Un team cross funzionalmente diversificato ha un set di capacità cognitive, prospettive e schemi mentali differenti su come funzionano le cose, trovando soluzioni rapidamente, rilasciando prodotti di qualità sempre più alta, avendo inoltre il giusto mix di figure senior e junior.\n T-shaped skills: un membro del team ha una conoscenza profonda su una materia preferita, avendo allo stesso tempo le capacità di contribuire e aiutare gli altri, anche in materie non di sua competenza.\n Focused and committed: Un team coeso e performante, deve essere concentrato e devoto allo sprint goal, infatti ogni membro sarà impegnato al massimo nel suo lavoro, nel pieno rispetto di tutti i componenti del team e pronto a contribuire qualora sia necessario il suo aiuto, lavorando ad un ritmo sostenibile, per rilasciare prodotti di alto livello e soprattutto per mantenere un ambiente sano.\n Se ti è piaciuto questo articolo, non ti dimenticare di commentare e condividere! ⬇️\n ", "url": "https:\/\/theredcode.it\/design-dev\/scrum-development-team\/" }, "https:\/\/theredcode.it\/tags\/dsdm\/": { "title": "dsdm", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/dsdm\/" }, "https:\/\/theredcode.it\/tags\/ingegneria-del-software\/": { "title": "ingegneria-del-software", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/ingegneria-del-software\/" }, "https:\/\/theredcode.it\/tags\/interviste\/": { "title": "interviste", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/interviste\/" }, "https:\/\/theredcode.it\/categories\/interviste\/": { "title": "interviste", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/interviste\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-ceo\/": { "title": "Voglio diventare una... CEO", "tags": ["interviste","voglio-diventare",], "content": "Misurare la qualità del software è un\u0026rsquo;attività estremamente complessa, ma fondamentale. Ilaria Pigazzini, CEO di Arcan, ci parla dell\u0026rsquo;idea con cui ha fondato Arcan insieme ai suoi soci e del perché il debito tecnico sia un problema troppo spesso sottovalutato.\nDescriviti in 100 parole Sono Ilaria Pigazzini, co-founder e CEO di Arcan, una startup innovativa che sviluppa una piattaforma per la valutazione della qualità dei sistemi software.\nHo un dottorato di ricerca in informatica e le mie passioni sono leggere libri di ogni tipo (ultimamente mi sto appassionando alla filosofia), guardare film e bere spritz con gli amici. Ho sempre avuto il desiderio di diventare imprenditrice ma alla fine non ho capito bene come sia successo.\nDa maggio la startup è parte del \u0026ldquo;Business Innovation Factory\u0026rdquo;, il programma di accelerazione di Leonardo che promuove le startup facendole crescere sia dal punto di vista tech che di business.\nIn cosa consiste il ruolo di CEO? Essendo CEO di una startup il mio ruolo ha molte sfaccettature e spesso sconfina in altri ruoli.\nIn questo momento faccio parte del team che vede partecipi i miei soci (Darius Sas, in veste di Product Manager e Davide Fanale, Business Development Manager) e il mio ruolo è portare equilibrio tra il lato tech e business della startup.\nLe attività principali che conduco sono parlare con i potenziali clienti e gli investitori, oltre a gestire l\u0026rsquo;amministrazione della società. Ma essendo una piccola startup sono anche social media manager, contabile, blogger, segretaria e grande scrittrice di slide.\nQual è la soft skill più importante che deve possedere una CEO? Confesso di non avere una risposta certa a questa domanda perché sono CEO da molto poco e in generale sono nel mondo business da poco.\nNel mio caso specifico, quello che so che mi sta aiutando molto è la capacità di parlare alle persone in modo chiaro, sapendo ispirare fiducia.\nLa 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. Lavoro da molto poco come CEO di Arcan, e stiamo ancora costruendo tutto. Per ora piccoli successi e nessun grande fallimento.\nPosso però riportare uno dei più grandi fallimenti (almeno, secondo la mia percezione) che ho avuto durante il mio percorso scolastico.\n In terza superiore mi diedero due debiti formativi, rispettivamente in matematica e fisica.\n Non ho mai avuto troppi problemi in ambito scolastico, anzi mi piaceva andare a scuola e non mi sono mai sforzata troppo.\n Tutto ciò mi diede la falsa sicurezza di essere infallibile da quel punto di vista.\n Per me quei debiti e la realizzazione di poter rischiare la bocciatura agli esami di settembre furono uno schiaffo potente.\n Ma come gran parte dei fallimenti, sì, mi ha reso ciò che sono, cioè una persona che sa di poter fallire e che sa che è naturale che possa succedere. Essere stata messa di fronte al fallimento mi ha insegnato a non temerlo. E mi ha anche dato una forte spinta: non ho mai dato più niente per scontato.\n Come fare per diventare una CEO? Io sono diventata CEO perché volevo aprire una mia startup, ma sarò sincera, non ho ancora capito al 100% cosa significhi e se soprattutto io stia andando nella direzione giusta.\nHo seguito un percorso di studi completamente tecnico, ed è solo ultimamente che mi sono interessata al mondo business. Quindi quello che posso dire per esperienza è che serve determinazione e voglia di imparare ad essere CEO, cercando di capire quali sono i nostri limiti nell\u0026rsquo;affrontare le sfide quotidiane. \nAd esempio ho scoperto di avere profonde lacune per quanto riguarda la capacità di negoziare e sto studiando (e soprattutto allenandomi) per colmarle.\nParlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni? Il mio prossimo obiettivo per i prossimi tre anni è far crescere la mia startup ottenendo i fondi necessari per farla scalare velocemente.\n Mi vedo ancora nel ruolo di CEO in questo percorso. \nL\u0026rsquo;obiettivo più a lungo termine è portare a termine la strategia di exit della società e lavorare a qualcosa di nuovo. Potrà essere una nuova startup oppure un nuovo ruolo nel mondo del venture capital, che da quando ho iniziato a conoscere mi affascina molto.\nMa di questo se ne parlerà probabilmente tra una decina di anni.\nConosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo? Si lo conosco molto bene perché è un tema che mi sta a cuore. Credo nell\u0026rsquo;esistenza del gender gap e credo che questo gap si possa colmare a partire dall\u0026rsquo;educazione di ragazzi e ragazze. In primis, mostrando loro modelli di ispirazione alternativi a quello del maschio bianco in ambiti STEM (vedi ad esempio Samantha Cristoforetti).\nNel mio piccolo qualche anno fa ho fatto un intervento durante un evento del progetto NERD (alias, \u0026ldquo;Non è roba per donne\u0026rdquo;) organizzato e promosso dall\u0026rsquo;Università degli Studi di Milano - Bicocca.\n Tale progetto ha l\u0026rsquo;obiettivo di mostrare alle ragazze della scuola superiore che l\u0026rsquo;informatica è per tutti.\n Fu durante quell’evento che parlai della mia esperienza come studentessa di informatica e della passione che mi aveva spinto a scegliere di frequentare anche il dottorato!\nContatti Sito Arcan ", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-ceo\/" }, "https:\/\/theredcode.it\/tags\/voglio-diventare\/": { "title": "voglio-diventare", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/voglio-diventare\/" }, "https:\/\/theredcode.it\/design-dev\/scrum-scrum-master\/": { "title": "Scrum Master in Scrum", "tags": ["agile","design","ingegneria-del-software",], "content": "Ben tornati/e nella seconda puntata della serie dedicata ai ruoli in Scrum!\nNell\u0026rsquo;articolo precedente abbiamo parlato del ruolo di Product Owner: ma chi è, e cosa fa lo Scrum Master?\nScrum Master: cos\u0026rsquo;è Lo Scrum Master è colui che si impegna costantemente ad aiutare tutti i membri del team a comprendere Scrum e i suoi valori.\nCoach Lo Scrum Master è un coach sia per il dev team che per il Product Owner, capace di rimuovere ogni barriera tra i ruoli e di mettere il Product Owner nella condizione di guidare gli sviluppi.\n Osserva attentamente il modo in cui il team utilizza il framework e fa qualunque cosa per aiutarlo a raggiungere alti livelli di performance.\n Come ogni coach che si rispetti, nel caso in cui il team affronta un problema che può e dovrebbe risolvere autonomamente, lo Scrum Master cerca di guidare il team nella risoluzione dello stesso, senza però dargli la soluzione in mano ma cercando di renderlo quanto più autonomo possibile. Se invece il problema è un impediment che il team non può risolvere, allora se ne assumerà la responsabilità.\nServant Leader e Process Authority Lo Scrum Master è un leader al servizio del team, che si assicura che tutte le necessità di priorità più alta vengano sempre soddisfatte e ha il potere di assicurarsi che lo Scrum team aderisca e metta in atto valori, principi e pratiche del framework.\n Aiuta il team a migliorare i processi quando possibile, accertandosi che migliori costantemente.\n Interference Shield Lo Scrum Master protegge il Dev team da interferenze esterne, in modo che possa restare concentrato sul lavoro da portare a termine durante gli Sprint.\n Queste interferenze possono provenire da varie fonti, ad esempio manager che vogliono spostare membri del team nel mezzo di uno sprint, problemi legati creati da altri team, qualsiasi interferenza subentri, lo scrum master agisce da interceptor.\n Impediment remover Lo Scrum master ha la responsabilità di rimuovere gli impedimenti che inibiscono la produttività del team, qualora il team non sia in grado di rimuoverli autonomamente. Ad esempio, se il team non riesce a raggiungere lo sprint goal a causa di un impediment rappresentato dai server di produzione instabili, la cui responsabilità è dei VP di operation, lo Scrum master si assume la responsabilità di collaborare con questi ultimi, che possono far qualcosa di concreto per risolvere il problema.\nChange Agent Un buon Scrum master deve aiutare a cambiare mentalità e quasi mai questo cambiamento risulta essere facile. Aiuta gli altri a capire le necessità del cambiamento, gli impatti che Scrum può avere in un contesto complesso e i vantaggi che esso garantisce.\n Assicura inoltre che il cambiamento sia propagato a tutti i livelli dell\u0026rsquo;organizzazione, attivando benefici a breve e soprattutto a lungo termine.\n Skills Ma quali sono le competenze che deve possedere uno Scrum Master?\n Knowledgable: Per essere un buon coach di processo, lo scrum master deve conoscere Scrum davvero bene e deve essere in grado di comprendere anche i problemi tecnici a cui il team si dedica e le tecnologie utilizzate, avendo quindi ragionevoli competenze tecniche e discrete conoscenze sul dominio di business.\n Questioning: Lo scrum master usa le sue skill da coach, unite alla sua conoscenza tecnica, di business e di processo per fare le domande giuste, che portano le persone ad affermare \u0026ldquo;Non ci avevo pensato, effettivamente potrebbe esserci un\u0026rsquo;altra soluzione!\u0026rdquo;. Non risponde mai direttamente a una domanda ma piuttosto risponde in modo riflessivo con un\u0026rsquo;altra domanda, permettendo alle persone di trovare una sisposta.\n Patient: E\u0026rsquo; innegabile che uno scrum master, poichè preferisce non dare risposte dirette, debba avere anche la pazienza di dare al team il tempo di trovare la strada e la risposta migliore alle sue domande in completa autonomia.\n Collaborative: Lo Scrum Master deve avere un\u0026rsquo;ottima skill di collaborazione per lavorare con Product Owner, Dev team e tutte le parti interessate. In quanto coach di processo è sempre alla ricerca di nuove opportunità per aiutare i membri del team a raggiungere un invidiabile livello di collaborazione.\n Protective: Lo scrum master dovrebbe essere davvero protettivo verso il team, difendendolo da impediment\norganizzativi e non. Ha inoltre una grande sensibilità sia verso il team che verso le necessità di business, facendo si che venga raggiunto il giusto equilibrio fra questi.\n Transparent: Lo scrum master è trasparente in tutte le forme di comunicazione. Lavorando con i membri del team, non c\u0026rsquo;è posto per agende nascoste o informazioni non chiare, ciò che vedi e senti è esattamente ciò che realmente è. Lo scrum master promuove la comunicazione trasparente al fine di evitare ogni possibile forma di incomprensione.\n Se ti è piaciuto questo articolo, non ti dimenticare di commentare e condividere! ⬇️\n ", "url": "https:\/\/theredcode.it\/design-dev\/scrum-scrum-master\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-security-innovation-manager\/": { "title": "Voglio diventare una... Security Innovation Manager", "tags": ["interviste","voglio-diventare",], "content": "Il focus sulla sicurezza informatica negli ultimi anni è diventato sempre più centrale sia per piccole che grandi aziende: significa stare al passo con le nuove tecnologie, ma anche le relative vulnerabilità, e non finire mai di studiare.\nNell\u0026rsquo;intervista di oggi, la super Rita Manzo ci racconta cosa vuol dire essere una Security Innovation Manager in Accenture!\nDescriviti in 100 parole Mi chiamo Rita Manzo, e ad oggi lavoro in Accenture nell’ambito della sicurezza informatica nel ruolo di Manager. Sono sempre stata appassionata di matematica e di crittografia e questo mi ha portato ad intraprendere questo percorso durante l’università.\nDopo aver studiato matematica però, sentivo che mi mancava ancora qualcosa, avevo appreso quello che era alla base della cifratura, ma avevo bisogno di trovare un modo di applicare concretamente quello che avevo studiato e che tanto mi appassionava. Quindi ho deciso di prendere la laurea Magistrale in Informatica.\nOltre ai numeri sono una grande appassionata di sport e ad oggi pratico Body building a livello agonistico.\nIn cosa consiste il ruolo di Security Innovation Manager? Lo stratega del digitale (in inglese Security Innovation Manager) aiuta i brand a scegliere quale sia la strada migliore per raggiungere i propri obiettivi (di business, marketing e comunicazione) attraverso i punti di contatto digitali.\nPer farlo deve interfacciarsi di continuo con varie figure, sia del cliente che del suo team di lavoro, anche se il cuore delle attività avviene poi in solitaria quando le informazioni e i dati raccolti devono essere messi in fila con metodo per giungere alla definizione della strategia.\n La Security Innovation Manager chiarisce il perché intraprendere determinate azioni sul digitale, definendo quali fare e quando. Poi però non abbandona la nave: monitora, insieme al team che realizza le azioni, che gli obiettivi preposti vengano raggiunti, ritarando il tiro in caso di bisogno.\n Qual è la soft skill più importante che deve possedere una Security Innovation Manager? Secondo me tra le soft skill che dovrebbero avere tutti, a tutti i livelli, rientrano la capacità di saper ascoltare veramente chi ci circonda e quella di dialogare in maniera trasparente con ogni interlocutore.\nLa 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. Da quando lavoro in questo settore, non posso dire di aver vissuto grandi “fallimenti”, ma sempre piccole cadute che hanno contribuito a formarmi come la professionista che sono oggi. Credo che sia stato determinante, in questo percorso, l’aver sempre chiesto feedback ai miei referenti, in modo tale da prevenire in tempo eventuali scivoloni.\nCome fare per diventare una Security Innovation Manager? Per crescere nell’ambito della sicurezza la parola chiave per me è una sola: “studiare”.\nSo che sembra banale, ma non bisogna mai sentirsi arrivati, mai pensare di possedere una conoscenza completa.\n È necessario mettersi costantemente in discussione per crescere professionalmente e anche personalmente.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni? Se guardiamo all’ambito aziendale e al ruolo, il mio prossimo obiettivo è quello di diventare dirigente. Ma, detto così può sembrare riduttivo.\nQuello che voglio è, non solo ottenere il “ruolo” in questione, ma farlo “mio” e diventare un punto di riferimento per l’azienda nella quale opero.\nConosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo? Certamente, è un tema di grande attualità con cui tutti noi facciamo i conti.\nE’ innegabile come il numero di ragazze interessate o iscritte a facoltà STEM ad oggi sia ancora inferiore rispetto alla popolazione maschile ma ci sono significativi segnali di miglioramento che fanno ben sperare per il prossimo futuro e le generazioni che verranno.\nAccenture è molto impegnata in ambito I\u0026amp;D e ha al suo attivo diverse iniziative come ad esempio seminari didattici a partire dalle scuole superiori, al fine di incuriosire in egual modo sia ragazzi che ragazze su tematiche STEM. Prima del COVID andavamo spesso nelle università a fare seminari su tematiche di cybersecurity per mostrare cosa vuol dire lavorare in questo ambito alle giovani menti.\nAttualmente ci stiamo muovendo mediante seminari “virtuali” anche se spero torneremo presto in presenza. Per aiutare le ragazze appassionate di cybersecurity, come su altri skill tech, Accenture organizza inoltre delle “Pink Academy” per permettere alle ragazze che hanno effettuato studi non STEM di fare della formazione ed essere successivamente assunte facendo della combinazione di laurea umanistica e competenze tecniche un vero punto di forza!\nContatti Profilo LinkedIn ", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-security-innovation-manager\/" }, "https:\/\/theredcode.it\/design-dev\/scrum-product-owner\/": { "title": "Product Owner in Scrum", "tags": ["agile","design","ingegneria-del-software",], "content": "Ben tornati/e e ben trovati/e in questa nuova puntata della serie dedicata a Scrum!\nNell\u0026rsquo;ultimo articolo abbiamo parlato di quelli che sono i valori di questo Framework e di come un vero team debba seguirli per vincere ogni sfida.\nDa oggi inizieremo ad addentrarci in argomenti più corposi, partendo proprio da quelli che sono i ruoli presenti in un team Scrum, ossia Product Owner, Scrum Master e Development team e di quali siano le rispettive responsabilità e skill.\nMa analizziamoli uno per uno: oggi partiamo dal ruolo di Product Owner!\nProduct Owner: cos\u0026rsquo;è Il PO è una guida indispensabile per il team, colui che possiede una profonda conoscenza ad alto livello del prodotto che dovrà essere realizzato. In quanto tale deve comprendere le necessità e le priorità dei clienti, abbastanza bene da agire come se fosse il loro portavoce.\n Deve comunicare al dev team cosa deve essere implementato e in che ordine di priorità portare avanti gli sviluppi.\n Deve assicurarsi che gli acceptance criteria siano specificati e i test che li verificano siano eseguiti al fine di considerare una storia completa, rispettando la DoD (Definition of Done).\n Gestisce la parte economica di un progetto.\n Il Product Owner deve anche assicurarsi che vengano prese le decisioni giuste anche in termini economici e sotto molteplici aspetti, che siano essi a livello di release, di sprint e di product backlog.\nA livello di release: durante il corso di una release, ogni informazione data all\u0026rsquo;inizio può essere soggetta a cambiamenti, sarà quindi compito del product owner garantirne l\u0026rsquo;affidabilità al fine di rendere gli sviluppi chiari agli occhi del team.\nA livello di sprint: si assicura che ad ogni Sprint ci sia un buon ROI (Return Of Investment), avendo cura di trattare il budget a disposizione, come se fossero i suoi unici averi.\nA livello di Backlog: il Product Owner cambia la priorità degli Item (aka: storie che rappresentano gli sviluppi da concludere nell\u0026rsquo;arco di una release), in base anche alle condizioni economiche che possono variare nel tempo.\nPartecipa a tutte le fasi di pianificazione di un prodotto Product Planning: in questa fase di pianificazione, il Product Owner lavora con i clienti per \u0026ldquo;immaginare\u0026rdquo; il prodotto completo, attività che viene chiamata anche \u0026ldquo;Envision\u0026rdquo;.\nIl Product Owner partecipa attivamente in due fasi del processo:\n Release Planning: il Product Owner lavora con Scrum Team e clienti per definire nel dettaglio il contenuto di una release, suddividendo il prodotto in più parti.\n Sprint Planning: il Product Owner lavora con il dev team per definire uno Spring Goal, fornendo informazioni utili al dev team per selezionare gli item/funzionalità da sviluppare.\n Partecipa alle attività di refinement del Backlog.\n Il Product Owner monitora l\u0026rsquo;attività di refinement del product backlog, che include attività di creazione di storie e rifinitura delle stesse, stima e priorità degli item, non eseguendo direttamente tali attività ma guidando il team grazie alle sue preziose informazioni.\n Definisce i criteri di accettazione delle storie e verifica che siano rispettati.\n Il Product Owner è responsabile di definire i criteri di accettazione di ogni storia rappresentante uno sviluppo specifico.\n Queste sono le condizioni che devono essere soddisfatte per incontrare requisiti funzionali e non funzionali.\n Potrà scrivere anche i test di accettazione per la verifica di tutti i criteri stabiliti e assicurarsi che siano scritti prima che una storia sia presa in considerazione in uno sprint planning.\nSkills Ma quali sono le competenze che deve possedere un Product Owner?\n Domain Skills: Il Product Owner è un visionario capace di sintetizzare la vision del prodotto e di guidare il team nel raggiungimento della stessa, consapevole che non sia possibile sapere tutti i dettagli di uno sviluppo sin da subito.\n People Skills: Il Product Owner ha le capacità comunicative per parlare sia con il team che con tutte le parti interessate.\n Accountability: Il Product Owner si impegna affinchè i risultati ottenuti siano validi sotto ogni aspetto di business, gestisce con responsabilità le risorse a disposizione, cambia l\u0026rsquo;ordine di priorità del backlog.\n Nella prossima puntata parleremo del ruolo dello Scrum Master e delle relative skills e responsabilità!\n Se ti è piaciuto questo articolo, non ti dimenticare di commentare e condividere! ⬇️\n ", "url": "https:\/\/theredcode.it\/design-dev\/scrum-product-owner\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-digital-strategist\/": { "title": "Voglio diventare una... Digital Strategist", "tags": ["interviste","voglio-diventare",], "content": "Si può lavorare nel digitale senza definire una strategia? La professione di Federica è tra quelle più giovani, e c\u0026rsquo;è chi spera di ricoprire tra qualche anno un ruolo che ancora non esiste\u0026hellip;\nScopriamo grazie a Federica Tonon il lavoro di Digital Strategist in questa bellissima intervista!\nDescriviti in 100 parole Sono cresciuta in un piccolo paese di provincia del nord-est e da bambina, oltre alla Signora Fletcher, uno dei miei idoli era Penny del cartone “L’Ispettore Gadget”, con il suo mini laptop e la sua brillante intelligenza (chi è nato negli anni ‘80 come me capirà).\nPoi però, una volta grande, ho scelto di laurearmi in Scienze della Comunicazione ad indirizzo giornalismo, anche se il fascino per la tecnologia è rimasto intatto da allora. L’ho solo approcciato con piglio umanista.\nIn tutto ciò, con il tempo, ho imparato a far convivere la mia indole riservata con la curiosità diffusa che mi caratterizza.\nIn cosa consiste il ruolo di Digital Strategist? Lo stratega del digitale (in inglese Digital Strategist) aiuta i brand a scegliere quale sia la strada migliore per raggiungere i propri obiettivi (di business, marketing e comunicazione) attraverso i punti di contatto digitali.\nPer farlo deve interfacciarsi di continuo con varie figure, sia del cliente che del suo team di lavoro, anche se il cuore delle attività avviene poi in solitaria quando le informazioni e i dati raccolti devono essere messi in fila con metodo per giungere alla definizione della strategia.\n La Digital strategist chiarisce il perché intraprendere determinate azioni sul digitale, definendo quali fare e quando. Poi però non abbandona la nave: monitora, insieme al team che realizza le azioni, che gli obiettivi preposti vengano raggiunti, ritarando il tiro in caso di bisogno.\n Qual è la soft skill più importante che deve possedere una Digital Strategist? La capacità di ascolto credo sia una soft skill imprescindibile al pari delle abilità di sintesi. Una strategia può esistere solo se segue alla comprensione del contesto e alla definizione di un obiettivo. Per comprendere contesti e definire obiettivi però, bisogna sapere ascoltare attentamente ed essere in grado di sintetizzare la complessità. Inoltre l’ascolto permette anche di entrare facilmente in ambiti e settori spesso diversi che richiedono la consulenza di una digital strategist.\nLa 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. Ce ne sono stati tanti perché, come si dice, “solo chi fa sbaglia”. Fra tutti però scelgo questo: in passato mi è capitato di non rendermi conto che dietro al successo dei progetti ci sono prima di tutto le persone che ci lavorano. Ho sottovalutato la forza che possono esercitare bisogni o difficoltà personali di chi ruota intorno a un progetto sulla sua buona riuscita. Ora so che solo team felici creano “progetti felici”.\nCome fare per diventare una Digital Strategist? Immaginiamo la figura della Digital Strategist come un traduttore.\n È il crocevia tra business e operatività tecnologica e deve farli dialogare per arrivare all’obiettivo.\n Competenze in ambito digital marketing sono quindi ** unabase necessaria** per poter parlare la stessa lingua dei referenti delle aziende clienti.\nPoi però sono utili anche conoscenza di ambiti più specialistici relativi alla progettazione come l’architettura dell’informazione e la user experience, insieme a quel tanto che serve per potersi interfacciare con chi si occupa di design, dello sviluppo web o dei social media.\nParlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni? Negli ultimi tempi sto cercando di ampliare le mie competenze in ambito di UX Research.\n Spero però che il ruolo che avrò fra 3 anni non esista ancora ad oggi: il digital ha tempi rapidissimi tutti propri e mi auguro di essere in grado di seguirli portando a frutto l’esperienza pregressa verso il nuovo che verrà.\n Credo comunque che sarà un ruolo sempre più vicino a e di raccordo con il mondo tech.\nConosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo? Si, è un tema che mi sta a cuore innanzitutto per una questione pratica: sono stanca di riunioni mono-genere in ambito lavorativo e vorrei tanto che ci fosse una parità di contributi in certi campi perché lo considero arricchente e stimolante.\n A parte le questioni pratiche, seguo due realtà pro STEM (@she_is_a_scientist e @inspiringirls_italia su Instagram) e cerco di condividerne i messaggi.\n Sono madre di due figlie e nel mio piccolo sto cercando di educarle senza pre-concetti rispetto a cosa sia più adatto a un genere o a un altro nelle professioni.\nContatti ", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-digital-strategist\/" }, "https:\/\/theredcode.it\/tags\/apogeo\/": { "title": "apogeo", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/apogeo\/" }, "https:\/\/theredcode.it\/tags\/intelligenza-artificiale\/": { "title": "intelligenza-artificiale", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/intelligenza-artificiale\/" }, "https:\/\/theredcode.it\/categories\/intelligenza-artificiale\/": { "title": "intelligenza-artificiale", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/intelligenza-artificiale\/" }, "https:\/\/theredcode.it\/categories\/natural-language-processing\/": { "title": "natural-language-processing", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/natural-language-processing\/" }, "https:\/\/theredcode.it\/tags\/nlp\/": { "title": "nlp", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/nlp\/" }, "https:\/\/theredcode.it\/intelligenza-artificiale\/nlp-preprocessing-di-un-testo-con-python\/": { "title": "Preprocessing di un testo con Python", "tags": ["apogeo","intelligenza-artificiale","nlp",], "content": "Sulla base di alcune conversazioni passate, mi sono resa conto che la pre-elaborazione del testo è un argomento spesso trascurato.\n La maggior parte delle persone con cui ho parlato hanno menzionato risultati incoerenti ottenuti dall\u0026rsquo;utilizzo di tecniche di NLP per poi rendersi conto che non stavano elaborando il testo per prepararlo all\u0026rsquo;analisi successiva.\n Tenendo questo a mente, ho pensato di far luce su cosa sia realmente il preprocessing di un testo con Python, i diversi metodi di preelaborazione del testo e diverse tecniche che ci permettono di stimare quanto lavoro potrebbe essere necessario.\n Tutto in minuscolo  Ridurre in minuscolo tutti i dati testuali, anche se può sembrare banale, è una di quelle attività super semplici e che però portano a grandi risultati.\n Pensiamo al calcolo della similarità tra più entità: il nostro programma potrebbe considerare come diverse delle parole che hanno la lettera maiuscola iniziale.\n Questo tipo di typo può essere riscontrato di frequente: il set di dati potrebbe contenere diverse rappresentazioni della parola \u0026ldquo;pizza\u0026rdquo; e non avrebbe \u0026ldquo;prove\u0026rdquo; sufficienti per i suoi algoritmi di addestramento per apprendere efficacemente.\n Un esempio per rendere in minuscolo una serie di parole contenute in una lista, potresti fare qualcosa di simile:\n texts=[\u0026#34;pizza\u0026#34;,\u0026#34;Pizza\u0026#34;,\u0026#34;PIZZA\u0026#34;,\u0026#34;PiZzA\u0026#34;] lower_words=[word.lower() for word in texts] print(lower_words)  Se volessi farlo su un dataframe?\n Nulla di più semplice. Come mostrato di seguito, è sufficiente importare pandas, leggere il dataframe e iterare le colonne applicando il metodo lower() su ogni colonna. Attenzione: usiamo .str per evitare che, nel caso siano presenti dati numerici, il codice vada in errore!\n import pandas as pd data = {\u0026#39;Fruits\u0026#39;: [\u0026#39;BANANA\u0026#39;,\u0026#39;APPLE\u0026#39;,\u0026#39;MANGO\u0026#39;,\u0026#39;WATERMELON\u0026#39;,\u0026#39;PEAR\u0026#39;], \u0026#39;Color\u0026#39;: [\u0026#39;Yellow\u0026#39;, \u0026#39;Red\u0026#39;, \u0026#39;Orange\u0026#39;, \u0026#39;Pink\u0026#39;, \u0026#39;Green\u0026#39;] } df = pd.DataFrame(data, columns = [\u0026#39;Fruits\u0026#39;, \u0026#39;Color\u0026#39;]) print (df) for column in df: df[column] = df[column].str.lower() print(df) \u0026gt;\u0026gt;\u0026gt; \tFruits Color 0 banana yellow 1 apple red 2 mango orange 3 watermelon pink 4 pear green  Stemming  Lo stemming è il processo di riduzione alla radice etimologica delle parole (ad es. buonissimo, buoni diventa buon). La \u0026ldquo;radice\u0026rdquo; in questo caso potrebbe non essere una vera radice, ma solo una forma canonica della parola originale.\n Lo stemming utilizza un processo euristico che rimuove le estremità delle parole nella speranza di trasformarle correttamente nella loro forma radice. Quindi le parole \u0026ldquo;buonissimo\u0026rdquo; e \u0026ldquo;buoni\u0026rdquo; potrebbero effettivamente essere convertiti in buon, che non rappresenta la radice reale della parola!\n Esistono diversi algoritmi per lo stemming, e spesso cambiano a seconda della lingua.\n L\u0026rsquo;algoritmo più comune, noto anche per essere empiricamente efficace per l\u0026rsquo;inglese, è l\u0026rsquo;algoritmo di Porter.\n  Tra l\u0026rsquo;altro, il suo creatore è un signore super gentile che ho avuto l\u0026rsquo;onore di intervistare per la pubblicazione del libro \u0026ldquo;Analisi del linguaggio con Python\u0026rdquo;, edizione di Apogeo. Attualmente è in pensione, odia le macchine e le gomme da masticare e adora passare del tempo nel suo giardino (qui il suo sito).\n  Qui un esempio del suo funzionamento:\n import nltk import pandas as pd from nltk.stem import PorterStemmer porter_stemmer=PorterStemmer() words=[\u0026#34;trouble\u0026#34;,\u0026#34;troubles\u0026#34;,\u0026#34;troubling\u0026#34;,\u0026#34;troubled\u0026#34;,\u0026#34;troubleshooting\u0026#34;] stemmed_words=[porter_stemmer.stem(word=word) for word in words]  Se abbiamo a che fare con testi non in inglese, ci sono comunque diverse opzioni: abbiamo la libreria NLTK che ci fornisce lo Snowball Stemmer, che supporta tra le altre lingue anche quella italiana:\n  from nltk.stem import SnowballStemmer stemmer_snowball = SnowballStemmer(\u0026#39;italian\u0026#39;) eg1 = [\u0026#39;andare\u0026#39;, \u0026#39;andai\u0026#39;, \u0026#39;andiamo\u0026#39;, \u0026#39;andarono\u0026#39;] eg_list = [] eg_list.extend(eg1) ​ print(\u0026#39;Parole: {}\\nRadici:\u0026#39;.format(eg_list)) for word in eg_list: print(\u0026#39;\\t- {}\u0026#39;.format(stemmer_snowball.stem(word))) Parole: [\u0026#39;andare\u0026#39;, \u0026#39;andai\u0026#39;, \u0026#39;andiamo\u0026#39;, \u0026#39;andarono\u0026#39;] Radici: \t- andar \t- anda \t- andiam \t- andar  Lemmatizzazione  La lemmatizzazione sembra in apparenza molto simile allo stemming, in cui l\u0026rsquo;obiettivo è rimuovere le desinenze e ridurre una parola alla sua forma radice.\n La reale differenza è che la lemmatizzazione cerca di farlo nel modo corretto. Non si limita a tagliare le parole, in realtà trasforma le parole nella radice effettiva.\n Ad esempio, la parola \u0026ldquo;migliore\u0026rdquo; verrebbe associata a \u0026ldquo;buono\u0026rdquo;, e non \u0026ldquo;miglior\u0026rdquo;.\n Lo fa utilizzando un dizionario come WordNet per mappare una parola con le parole collegate, ed eventualmente la sua radice, basandosi su un sistema di regole.\n Per la lingua inglese, possiamo utilizzare sempre la libreria NLTK che fornisce l\u0026rsquo;oggetto WordNetLemmatizer, il quale ci permette di eseguire la lemmatizzazione su un insieme di parole:\n import nltk nltk.download(\u0026#39;wordnet\u0026#39;) nltk.download(\u0026#39;omw-1.4\u0026#39;) import pandas as pd from nltk.stem import WordNetLemmatizer lemmatizer = WordNetLemmatizer() words = [\u0026#34;trouble\u0026#34;, \u0026#34;troubling\u0026#34;, \u0026#34;troubled\u0026#34;, \u0026#34;troubles\u0026#34;] lemmatized_words = [lemmatizer.lemmatize(word=word, pos=\u0026#39;v\u0026#39;) for word in words] lemmatizeddf = pd.DataFrame({\u0026#39;original_word\u0026#39;: words, \u0026#39;lemmatized_word\u0026#39;: lemmatized_words}) lemmatizeddf = lemmatizeddf[[\u0026#39;original_word\u0026#39;, \u0026#39;lemmatized_word\u0026#39;]] print(lemmatizeddf)  Per la lingua italiana -e molte altre-, che risulta più complicata per questo tipo di attività, esiste la libreria simplelemma, sviluppata da Adrien Barbaresi, che ha un livello di accuratezza del 93%.\n Un esempio è quello riportato di seguito, dove le parole \u0026lsquo;migliore\u0026rsquo;, \u0026lsquo;camminiamo\u0026rsquo;, \u0026lsquo;mangiassimo\u0026rsquo;, \u0026lsquo;promisi\u0026rsquo; e \u0026lsquo;derivante\u0026rsquo; vengono correttamente riportate al lemma:\n import simplemma mywords = [\u0026#39;migliore\u0026#39;, \u0026#39;camminiamo\u0026#39;, \u0026#39;mangiassimo\u0026#39;, \u0026#39;promisi\u0026#39;, \u0026#39;derivante\u0026#39;] langdata = simplemma.load_data(\u0026#39;it\u0026#39;) result = [] for word in mywords: result.append(simplemma.lemmatize(word, langdata)) print(result)   Stop alle stop words!  Gioco di parole a parte, le stopwords sono un insieme di parole comunemente usate in una lingua e che quindi non danno -solitamente- alcun valore aggiunto al contesto.\n Esempi di stopwords in inglese sono \u0026ldquo;a\u0026rdquo;, \u0026ldquo;the\u0026rdquo;, \u0026ldquo;is\u0026rdquo;, \u0026ldquo;are\u0026rdquo; e così via, così come in italiano lo sono gli articoli, le preposizione, alcuni avverbi, e via dicendo.\n L\u0026rsquo;idea alla base dell\u0026rsquo;uso di queste parole è che, rimuovendo le parole che non forniscono informazioni utili dal testo, possiamo concentrarci invece sulle parole veramente importanti.\n Ad esempio, nel contesto di un sistema di ricerca, in una query di ricerca con \u0026ldquo;che cos\u0026rsquo;è il preprocessing di un testo\u0026rdquo;, vorremo che il sistema di ricerca si concentri sui risultati di pagine che parlano di preprocessing di un testo rispetto a documenti che parlano di ciò che è un testo.\n Nella mia esperienza, la rimozione delle stopwords dipende dal contesto ed esistono diversi dataset adatti a diversi scopi; sebbene questa tecnica sia molto efficace nei sistemi di ricerca e di topic modeling, si è dimostrato non critico nei sistemi di classificazione.\n Un esempio è quello mostrato e riportato di seguito per la lingua inglese, dove parole come this, that, of e altro vengono rimosse dal testo della frase:\n stopwords=[\u0026#39;this\u0026#39;,\u0026#39;that\u0026#39;,\u0026#39;and\u0026#39;,\u0026#39;a\u0026#39;,\u0026#39;we\u0026#39;,\u0026#39;it\u0026#39;,\u0026#39;to\u0026#39;,\u0026#39;is\u0026#39;,\u0026#39;of\u0026#39;] text=\u0026#34;this is a text full of content and we need to clean it up\u0026#34; words=text.split(\u0026#34; \u0026#34;) shortlisted_words=[] for w in words: if w not in stopwords: shortlisted_words.append(w) else: shortlisted_words.append(\u0026#34;W\u0026#34;) print(\u0026#34;original sentence = \u0026#34;,text) print(\u0026#34;sentence with stopwords removed= \u0026#34;,\u0026#39; \u0026#39;.join(shortlisted_words))  Se hai bisogno di un elenco di stopwords da rimuovere per diverse lingue -come italiano, spagnolo e anche ungherese-, qui trovi un repository che potrebbe fare al caso tuo!\n In questa fase una delle altre tecniche di elaborazione del testo consiste nella rimozione della punteggiatura.\n Ci sono circa 30+ simboli di punteggiatura principali che dovrebbero essere presi in considerazione e possiamo creare direttamente utilizzare l\u0026rsquo;oggetto string: questo ha una proprietà punctuation che permette di distinguere i simboli di punteggiatura.\n Utilizzandolo insieme alla libreria re per le espressioni regolari, possiamo rimuovere tutti i simboli come nell\u0026rsquo;esempio di seguito:\n import re import string testo = \u0026#34;Lorem, ipsum; testo! di -prova.\u0026#34; testo = re.sub(\u0026#39;[%s]\u0026#39; % re.escape(string.punctuation), \u0026#39;\u0026#39; , testo) print(testo) \u0026#39;Lorem ipsum testo di prova\u0026#39;   E tu, conosci altre tecniche? Scrivilo nei commenti!\n  Risorse utili Analisi del linguaggio naturale con Python - Apogeo Awesome NLP list Simplelemma repository WordNet multilingue  ", "url": "https:\/\/theredcode.it\/intelligenza-artificiale\/nlp-preprocessing-di-un-testo-con-python\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-game-designer\/": { "title": "Voglio diventare una... Game Designer", "tags": ["interviste","voglio-diventare",], "content": "Mai sentito parlare dell\u0026rsquo;E3? Il suo sogno è quello di presentare un gioco di sua creazione: oggi parliamo con Giuliana, che di professione è una Game Designer.\nScopriamo subito quali competenze sono necessarie per entrare in questo mondo!\nDescriviti in 100 parole Ciao, sono Giuliana, ho 24 anni e ho un cane di nome Nana!\nIl mio amore per i videogiochi nasce giusto 20 anni fa, quando i miei genitori mi regalarono il game boy, è stato amore a prima vista.\nMi sono laureata alla triennale d’informatica a Salerno, mentre ora sono iscritta alla magistrale informatica della Statale di Milano (manca poco per finire!).\nInvece, per quanto riguarda il mondo gaming, sono più di sei anni che sviluppo videogiochi, mentre sono due anni che ho iniziato a farlo per lavoro da libera professionista! Sviluppo sia app VR/AR, che giochi :)\nIn cosa consiste il ruolo di Game Designer? Il Game Designer è una figura importantissima per la costruzione del videogioco: deve creare il miglior videogioco che esista.\n Io considero questa professione al pari di un registra di film.\n Il Game Designer deve, come un registra, dirigere l’aspetto creativo del gioco, analizzando anche la fattibilità facendo analisi di mercato. Deve inoltre redigere e tenere aggiornato il “game design document”: in pratica deve scrivere tutto ciò che riguarda il gioco in tutte le sue sfaccettature. Inoltre, deve anche collaborare a stretto contatto con tutte le altre aree del team di sviluppo in modo tale da gestire e supervisionare il lavoro.\nOltre a fare questo, mi occupo soprattutto della parte tecnica, ovvero faccio da ponte tra la progettazione e la programmazione.\nQual è la soft skill più importante che deve possedere una Game Designer? La soft skill più importante è la creatività.\n Per me un Game Designer è un adulto che ha ancora l’immaginazione di un bambino: i bambini riescono a divertirsi creando giochi e storie dal nulla. Io mi diverto tantissimo a immaginare dei possibili giochi mentre svolgo qualche attività.\n Ad esempio, un’idea che sto sviluppando, mi è venuta mentre facevo escursione in bicicletta, appena tornata a casa sono stata ore a scrivere!\nMa ovviamente è importante avere ottime capacità comunicative per riuscire a collaborare con il team.\nLa 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. Un mio fallimento recente è avvenuto qualche tempo fa. Ero in team con altri ragazzi ed ero l’unica donna. Non riuscivo a farmi valere e mi scontravo sempre perché le mie idee venivano sempre contestate, per poi essere utilizzate.\nAd un certo punto del progetto non venivo più considerata, ogni mia aggiunta al progetto veniva cancellata o modificata senza essere avvisata, quando portavo questo problema a tavolo non venivo presa in considerazione.\nPer me è stato molto umiliante; mi reputo una ragazza forte, ma in quella occasione dove ero io contro tutti, mi sono sentita piccola, per questo ho giurato a me stessa che non devo più subire comportamenti del genere.\nCome fare per diventare una Game Designer? Le strade sono diverse, in Italia ci sono dei corsi/accademie che ti permettono di studiare per questo lavoro.\n Ma la cosa importante è sviluppare videogiochi.\n Come faccio a reputarmi un game designer se non ho mai fatto un gioco?\nBisogna rimboccarsi le maniche e sviluppare, tanto e cose diverse!\nPer quanto riguarda il mio percorso di studi è molto tecnico, come dicevo prima, mi sono laureata in informatica, sono nata “programmatrice” per poi seguire il percorso “progettazione di videogiochi” alla statale di Milano, dove ho continuato ad arricchire il mio background informatico, ma ho anche studiato il design e sviluppato videogiochi.\nParlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni? Bella domanda! Ho la mia “to-do list” da completare entro i 26 anni. È tra le tante (forse troppe) cose da fare comprende trasformare il mio lavoro di libera professionista in una azienda e presentare un gioco all’E3. Devo rimboccarmi le maniche!\nConosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo? Al mio primo anno di università mi sono scontrata con questa triste realtà.\nNella mia classe (più di 200 studenti) noi donne ci contavamo sulle dita di una mano.\nCi sono fin troppi pregiudizi e convinzioni tossiche, che purtroppo ho dovuto (e a volte capita ancora oggi) subire in prima persona, ho dovuto farmi forza e rispondere a dovere, ma non è stato sempre facile, ma in determinate situazioni ho trovato la forza grazie ad altre donne.\nNel mio piccolo scrivo di qualche situazione che mi è capitata, ma come sempre quando qualcuno si espone sui social, ho dovuto leggere molte critiche del tipo “vuoi farti solo notare”, “post acchiappa like”, e commenti del tipo “è risaputo che determinati lavori sono per uomini”.\nMa ho anche ricevuto di messaggi bellissimi, soprattutto da parte delle ragazze che hanno paura a lavorare in questo mondo e che con le mie parole hanno trovato un po\u0026rsquo; di forza. Per superarlo quindi occorre scrivere e parlare per sensibilizzare quanto più possibile.\n Ma ricordiamoci una cosa: il nostro mondo STEM non ha genere, è libero e aperto a tutti.\n Contatti Link Tree\n", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-game-designer\/" }, "https:\/\/theredcode.it\/tags\/angular\/": { "title": "angular", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/angular\/" }, "https:\/\/theredcode.it\/categories\/angular\/": { "title": "angular", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/angular\/" }, "https:\/\/theredcode.it\/ionic\/creare-una-direttiva-con-ionic\/": { "title": "Creare una direttiva con Ionic", "tags": ["angular","direttive","ionic","ionic-5","ionic-6",], "content": "Ah, le direttive\u0026hellip; In Angular vengono utilizzate moltissimo per personalizzare il comportamento di un componente. Il grande vantaggio di Ionic è la possibilità di integrarlo con diversi framework, tra cui Vue, React, Stencil e soprattutto Angular.\n Ma come funzionano?\n In questo articolo, vediamo come creare una direttiva con Ionic, e naturalmente Angular!\n Cosa sono   Una direttiva si usa per modificare il comportamento di un elemento DOM esistente.\n In altre parole, si usa quando vogliamo che un componente abbia un suo comportamento rispetto ad un evento o ad uno stato.\n Un componente si usa quando desideri un elemento DOM completamente nuovo; altrimenti, un componente e una direttiva sono praticamente la stessa cosa: un componente è solo una direttiva con il proprio modello!\n Quando usarle  Le direttiva possono essere utilizzate per diversi scopi: ad esempio, per creare una risorsa custom, come può essere un panel, che non è magari previsto dal framework che utilizziamo.\n Un altro motivo per cui possiamo scegliere le direttive è quello di modificare il comportamento di un elemento: ad esempio, se volessimo far \u0026ldquo;sparire\u0026rdquo; un elemento, quando l\u0026rsquo;utente ci clicca sopra.\n Non a caso, una direttiva può essere dichiarata in questo modo: nel primo esempio, c\u0026rsquo;è una direttiva che descrive un componente; nel secondo caso, c\u0026rsquo;è un componente che contiene una direttiva custom.\n \u0026lt;my-component\u0026gt;\u0026lt;/my-component\u0026gt; \u0026lt;some-ionic-component myDirective\u0026gt;\u0026lt;/some-ionic-component\u0026gt;  Creare una direttiva con Ionic  Vediamo adesso un esempio pratico di come crearne una con Ionic e lo facciamo usando l\u0026rsquo;esempio visto prima: creiamo una direttiva che nasconda un elemento una volta che l\u0026rsquo;utente ci clicca sopra.\n Per prima cosa, andiamo a creare una direttiva usando il comando seguente:\n ionic generate directive clickdirective  Ci verrà creato un file che si chiama click-directive.directive.ts, che andremo ad analizzare:\n clickdirective.directive.ts import {Directive, ElementRef, HostListener, Renderer2} from \u0026#39;@angular/core\u0026#39;; @Directive({ selector: \u0026#39;[appClickDirective]\u0026#39; }) export class ClickDirectiveDirective { ...  All\u0026rsquo;interno del decoratore @Directive, è specificato un selettore che di default viene chiamato come il nome della direttiva con il prefisso app; nel nostro caso, avremo quindi appClickDirective. Possiamo cambiarlo come vogliamo, ovviamente!\n Il resto della classe è vuota, e la andiamo a costruire step-by-step. Per farlo, andiamo a importare all\u0026rsquo;interno del costruttore due risorse, ossia ElementRef e Renderer2. Questi ci permetteranno di gestire i componenti HTML e modificarne comportamento e stile:\n clickdirective.directive.ts import {Directive, ElementRef, HostListener, Renderer2} from \u0026#39;@angular/core\u0026#39;; @Directive({ selector: \u0026#39;[appClickDirective]\u0026#39; }) export class ClickDirectiveDirective { constructor(public element: ElementRef, public renderer: Renderer2) { } ...  Nello specifico, ElementRef serve a fornirci l\u0026rsquo;accesso diretto all\u0026rsquo;elemento presente nel DOM, che sarà disponibile attraverso una proprietà chiamata nativeElement. Se volessimo accedere ad un elemento DOM, potremo accedervi usando l\u0026rsquo;istruzione this.element.nativeElement.\n Una volta che abbiamo un riferimento a quell\u0026rsquo;elemento DOM, potremmo modificarlo come desideriamo accedendo direttamente alle sue proprietà -proprio come faresti con JavaScript-.\n _Renderer_2 invece ci aiuta a modificare l\u0026rsquo;elemento fornito da ElementRef, così che saremo in grado di aggiornare l\u0026rsquo;elemento.\n Per utilizzare _Renderer_2, dobbiamo fornirgli il nativeElement che vogliamo \u0026ldquo;manipolare\u0026rdquo; direttamente e utilizzare i metodi che mette a disposizione per modificare l\u0026rsquo;elemento del DOM.\n Alcuni esempi di questi metodi sono:\n setStyle addClass createElement setAttribute ecc.  A questo punto, creiamo una funzione che abbia il decoratore @HostListener, il quale ci permette di specificare per quale evento o stato essere \u0026ldquo;in ascolto\u0026rdquo;, e in questo caso specifichiamo l\u0026rsquo;evento click tramite i due parametri:\n clickdirective.directive.ts ... @HostListener(\u0026#39;click\u0026#39;, [\u0026#39;$event\u0026#39;]) ...  Nella funzione, andiamo a utilizzare Renderer2 per cambiare lo stile dell\u0026rsquo;elemento su cui l\u0026rsquo;utente andrà a cliccare, e lo faremo settando l\u0026rsquo;opacità a zero.\n  Questo è solo un esempio di quel che possiamo fare grazie ai due oggetti importati nel costruttore, ma le possibilità sono davvero infinite!\n  clickdirective.directive.ts ... handleClick(event) { console.log(\u0026#39;Element has been clicked\u0026#39;); this.renderer.setStyle(this.element.nativeElement, \u0026#39;display\u0026#39;, \u0026#39;none\u0026#39;); } ...  La direttiva è quindi pronta per essere utilizzata: in un altro componente, andiamo a creare una veloce lista di messaggi che l\u0026rsquo;utente potrà usare per spuntare quelli che ha già letto. Il codice seguente verrà quindi modificato come segue:\n message.component.html ... \u0026lt;ion-item *ngIf=\u0026#34;message\u0026#34; [routerLink]=\u0026#34;\u0026#39;/message/\u0026#39; + message.id\u0026#34; [detail]=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;div slot=\u0026#34;start\u0026#34; [class]=\u0026#34;!message.read ? \u0026#39;dot dot-unread\u0026#39; : \u0026#39;dot\u0026#39;\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;ion-label class=\u0026#34;ion-text-wrap\u0026#34;\u0026gt; \u0026lt;h2\u0026gt; {{ message.fromName }} \u0026lt;span class=\u0026#34;date\u0026#34;\u0026gt; \u0026lt;ion-note\u0026gt;{{ message.date }}\u0026lt;/ion-note\u0026gt; \u0026lt;ion-icon name=\u0026#34;chevron-forward\u0026#34; size=\u0026#34;small\u0026#34; *ngIf=\u0026#34;isIos()\u0026#34;\u0026gt;\u0026lt;/ion-icon\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;/h2\u0026gt; \u0026lt;h3\u0026gt;{{ message.subject }}\u0026lt;/h3\u0026gt; \u0026lt;p\u0026gt; Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \u0026lt;/p\u0026gt; \u0026lt;/ion-label\u0026gt; \u0026lt;/ion-item\u0026gt; ...  All\u0026rsquo;interno del componente ion-item, inseriamo la direttiva appClickDirective, che agirà seguendo le azioni dell\u0026rsquo;utente: quando questo cliccherà su uno dei messaggi, il messaggio sparirà:\n message.component.html \u0026lt;ion-item appClickDirective *ngIf=\u0026#34;message\u0026#34; [routerLink]=\u0026#34;\u0026#39;/message/\u0026#39; + message.id\u0026#34; [detail]=\u0026#34;false\u0026#34;\u0026gt; ... \u0026lt;/ion-item\u0026gt;  [video width=\u0026ldquo;auto\u0026rdquo; height=\u0026ldquo;50%\u0026rdquo; mp4=\u0026ldquo;http://35.180.247.192/wp-content/uploads/2022/04/Ionic-App-–-Mozilla-Firefox-2022-04-12-10-27-53-online-video-cutter.com_.mp4\u0026rdquo;][/video]\n  Semplice, no? 😉\n  Risorse utili Cosa sono le direttive (English) Manuale Ionic in italiano  ", "url": "https:\/\/theredcode.it\/ionic\/creare-una-direttiva-con-ionic\/" }, "https:\/\/theredcode.it\/tags\/direttive\/": { "title": "direttive", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/direttive\/" }, "https:\/\/theredcode.it\/tags\/ionic\/": { "title": "ionic", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/ionic\/" }, "https:\/\/theredcode.it\/categories\/ionic\/": { "title": "ionic", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/ionic\/" }, "https:\/\/theredcode.it\/tags\/ionic-5\/": { "title": "ionic-5", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/ionic-5\/" }, "https:\/\/theredcode.it\/tags\/ionic-6\/": { "title": "ionic-6", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/ionic-6\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-data-engineer\/": { "title": "Voglio diventare una... Data Engineer", "tags": ["interviste","voglio-diventare",], "content": "Lei l\u0026rsquo;informatica ce l\u0026rsquo;ha nel sangue: Caterina lavora in questo settore da diverso tempo grazie ad un super percorso alle spalle, che ci racconta in questa intervista. Da dove nasce la sua passione? In casa!\nOggi parliamo di cosa vuol dire voler diventare una Data Engineer.\nDescriviti in 100 parole Sono Caterina, ho 27 anni e sono nata a Pisa dove ho frequentato sia le superiori che l’Università.\nSono figlia di due programmatori che mi hanno trasmesso la loro passione per il mondo dell’informatica.\nNel 2017 ho conseguito la laurea triennale in Informatica e nel 2019 ho conseguito la laurea magistrale in Data Science \u0026amp; Business Informatics.\nSono sposata con Daniele e attualmente ho un inquilino dentro di me, Andrea, che nascerà a Settembre. Ho due coniglietti nani Nat e Tony che sono le pesti di casa.\nIn cosa consiste il ruolo di Data Engineer? Il Data Engineer ha il compito di preparare i dati, pulirli, integrarli, e aggregarli secondo i requisiti progettuali, utilizzando varie piattaforme e linguaggi.\n La struttura dei dati che un Data Engineer prepara, deve chiaramente essere solida ed efficiente, in modo da ottimizzare il processo di utilizzo dei dati stessi.\n L’attività tipica che svolgo è quella di creazione di ETL (aka Extract Transform and Load) in particolare usando SQL, ma è capitato di dover utilizzare anche Python per esempio, oppure framework come DataPrep.\nInoltre nell’azienda per cui lavoro adesso mi occupo anche della Data Visualization utilizzando Looker, DataStudio, PowerBI e altri strumenti.\nA livello operativo è un lavoro che può essere svolto sia in solitaria che in team; chiaramente lo svolgimento in team è sempre più costruttivo perché confrontarsi con gli altri è sempre un bene dal punto della crescita personale e professionale.\nQual è la soft skill più importante che deve possedere una Data Engineer? A mio parere, la soft skill più importante che si deve possedere per fare bene questo lavoro è la proattività, unita ad una buona dose di comprensione dei requisiti: una volta capito cosa vuole il cliente, si studia una soluzione ad hoc per soddisfare le sue esigenze.\nEssendo anche proattivi però, riusciamo a fare un passo in più e ad analizzare attivamente la situazione che abbiamo davanti. Possiamo quindi estrarre nuove informazioni dai dati, a cui magari durante la definizione del progetto non si era pensato, ma che sono molto preziose per il cliente.\nIn questo modo, oltre a fornirgli ciò di cui aveva bisogno riusciamo a dargli un valore aggiunto che nel mondo di oggi, basato inevitabilmente su una miriade di dati raccolti ovunque, può rappresentare un vantaggio dal punto di vista strategico e quindi anche economico.\nLa 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. Non ho un fallimento “più grande” da raccontare, ma ci sono stati diversi ostacoli durante il mio percorso. Sicuramente i primi che ho incontrato sono stati durante l’università quando non riuscivo a passare degli esami, oppure quando a volte mi sentivo inferiore ad altri perché magari c\u0026rsquo;era chi arrivava alla soluzione prima di me, e allora cadevo un po’ “in depressione”.\nInoltre nel 2017 dopo la laurea triennale, ho iniziato a lavorare a tempo pieno mentre davo gli esami per la laurea magistrale: è stato un periodo duro, durante il quale sono anche andata a convivere con quello che poi sarebbe diventato mio marito.\nPassavo le pause pranzo a studiare, le serate a studiare, i fine settimana a studiare, e a volte mi chiedevo perché lo stavo facendo, in fondo avevo già un lavoro, ma dentro di me non ero completamente soddisfatta.\n Giorno dopo giorno, esame dopo esame, in due anni mi sono ritrovata a discutere la tesi e tutti i miei sforzi sono stati ripagati. I fallimenti o comunque gli ostacoli fanno parte del nostro percorso e sono importantissimi, perché sono quelli che ci permettono di migliorarci sempre di più e crescere.\n Come fare per diventare una Data Engineer? Questa è una domanda difficile\u0026hellip; non c’è un percorso “lineare” e designato per svolgere questo ruolo. Io ho iniziato facendo la programmatrice e interessandomi ai progetti aziendali di Business Intelligence.\nPoi con la laurea magistrale ho cambiato lavoro ricoprendo il ruolo di consulente di BI. Infine adesso che sono alla mia terza esperienza lavorativa, ricopro la posizione di Data Engineer.\nHo conseguito la certificazione di Google Data Engineer che è sicuramente un titolo che aiuta a trovare lavoro per questa posizione, ma non basta.\nOccorre essere innanzitutto appassionati del mondo dati, avere forti competenze analitiche e conoscere bene i linguaggi SQL e Python.\n Inoltre è necessaria tanta voglia di studiare perché è un lavoro dove non si smette mai di imparare, ogni giorno c’è una novità e dobbiamo restare sempre al passo per essere competitivi sul mercato.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni? Tra 3 anni mi piacerebbe ricoprire sicuramente sempre un ruolo operativo, magari migliorando le mie capacità di Data Engineer; oppure mi piacerebbe aprirmi al mondo della Data Science.\nQuello che sicuramente avrò sempre e comunque tra i miei obiettivi è il migliorarmi e crescere a livello professionale: trovo che sia fondamentale per far avanzare la mia carriera.\nConosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo? Purtroppo lo conosco: ci sono poche donne che lavorano in questo settore, non è sempre facile entrarci e farsi prendere sul serio.\nIn molti pensano che non siamo capaci forse, perché siamo poche, ma come si dice: “poche ma buone”.\nSicuramente negli ultimi anni ci sono state tante proposte e azioni concrete per favorire l’inclusione delle donne nel mondo STEM, ma aldilà di tante parole, quando siamo in un posto di lavoro le possibilità di carriera sono davvero le stesse per un uomo e per una donna?\u0026hellip;\nInoltre, adesso che sto vivendo una gravidanza mi rendo conto che per una donna non è facile: dovrò lasciare il mio lavoro per 5 mesi (obbligatoriamente) e con uno stipendio ridotto all’80% (per disposizioni di legge).\nDurante la mia assenza è inevitabile che ci sarà qualcun altro al mio posto, ma sicuramente quando tornerò sarò considerata e stimata quanto prima perché la maternità è un mio, e nostro, diritto.\n", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-data-engineer\/" }, "https:\/\/theredcode.it\/eventi\/container-day-2022\/": { "title": "Container Day 2022 @ Bologna", "tags": [], "content": "Quando: 28 ottobre 2022\nDove: Bologna\nTitolo: Container Day 2022\nCodice sconto (da condividere!): 10% con community_THEREDCODE\nVuoi vincere il BIGLIETTO GRATUITO?: segui TheRedCode sui canali social per scoprire come vincerlo, o contattaci!\nPartecipa all’evento\nOrganizzato da: Grusp\n", "url": "https:\/\/theredcode.it\/eventi\/container-day-2022\/" }, "https:\/\/theredcode.it\/tags\/apache\/": { "title": "apache", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/apache\/" }, "https:\/\/theredcode.it\/categories\/apache\/": { "title": "apache", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/apache\/" }, "https:\/\/theredcode.it\/tags\/jmeter\/": { "title": "jmeter", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/jmeter\/" }, "https:\/\/theredcode.it\/testing\/record-di-un-test-plan\/": { "title": "Record di un test plan con JMeter", "tags": ["apache","jmeter","test-plan","testing",], "content": "In questo articolo abbiamo visto che cos\u0026rsquo;è un test plan e come crearne uno: ma come fare per registrare tutte le request di un\u0026rsquo;applicazione web senza doverle inserire manualmente?\n Vediamo oggi come effettuare il record di un test plan in JMeter!\n  L\u0026rsquo;ultima versione attualmente disponibile è la 5.4.3: clicca qui per scaricarla!\n  Come funziona  Vediamo velocemente come funziona JMeter per la parte di recording anche grazie alla figura sottostante, che ne riassume il flusso.\n Sfruttando un proprio proxy, tutte le request passano attraverso il server JMeter e questo elabora e registra le request che lo attraversano.\n In questo modo, va a salvare diversi oggetti (come dei sampler di tipo HTTP request) e crea un test plan che registrerà tutte le richieste. Quando avremo finito e interrotto, il test plan sarà disponibile per l\u0026rsquo;utente, che potrà configurarlo e riutilizzarlo.\n Le request arriveranno comunque all\u0026rsquo;applicazione, la quale troverà totalmente trasparente questo passaggio. Procedimento  Dopo aver installato l\u0026rsquo;ultima versione di JMeter, lo apriamo cliccando sul file .bat (se siamo su Windows) o sul file .sh (se siamo su sistemi Unix):\n Struttura della cartella di JMeter\n A questo punto, clicchiamo in alto a destra sull\u0026rsquo;icona che rappresenta l\u0026rsquo;opzione \u0026ldquo;Recording template\u0026rdquo;.\n Icona \u0026ldquo;Recording template\u0026rdquo;\n Questo ci permetterà di sfruttare diversi oggetti messi a nostra disposizione, come ad esempio per registrare il traffico generato durante la navigazione di un sito web.\n Si aprirà una schermata come la seguente, dove in questo caso andremo a scegliere \u0026ldquo;Recording\u0026rdquo; e cliccheremo su \u0026ldquo;Create\u0026rdquo;:\n Selezione del template \u0026ldquo;recording\u0026rdquo; in JMeter\n Ci verrà chiesto di inserire delle informazioni di base, come il sito d cui vogliamo registrare il traffico e il file .xml dove andare a salvare l\u0026rsquo;output: inseriamo quindi il nostro sito e clicchiamo su \u0026ldquo;Create\u0026rdquo;.\n Configurazione del recording di un test plan\n Verrà creato un test plan con diversi oggetti al suo interno: quello che ci interessa adesso è quello che si chiama \u0026ldquo;HTTP(S) Test Script Recorder\u0026rdquo;.\n  Prima di cominciare, assicurati di aver chiuso il browser che vuoi utilizzare per registrare il traffico e apri questo tutorial su un altro browser ;) Altrimenti, potresti riscontrare diversi errori e la registrazione non verrebbe effettuata!\n  Lo abilitiamo cliccando con il pulsante destro e selezionando l\u0026rsquo;opzione \u0026ldquo;Enable\u0026rdquo; e poi clicchiamo sul pulsante \u0026ldquo;Start\u0026rdquo; per avviare la registrazione.\n Componente \u0026ldquo;HTTP(S) Test Script Recorder\u0026rdquo; in JMeter\n Abilitiamo il componente \u0026ldquo;HTTP(S) Test Script Recorder\u0026rdquo; in JMeter\n Quando i test vengono registrati tramite questo componente, è normale che molte delle request acquisite non siano necessarie.\n Per questo è molto importante filtrare tutte le request che non ci interessano; un esempio sono le request che scaricano file CSS o le _request_che scaricano tutte le immagini di una pagina che non sono utili -eventualmente- ai fini del test.\n Ciò renderà il piano di test più performante ed efficace.\n È possibile specificare un pattern che esclude le estensioni di file che non devono essere incluse nella registrazione sfruttando il tab \u0026ldquo;Requests Filtering\u0026rdquo;, come mostrato di seguito:\n Tab \u0026ldquo;Requests Filtering\u0026rdquo; del componente \u0026ldquo;HTTP(S) Test Script Recorder\u0026rdquo; in JMeter\n Per i test di carico, ad esempio, si consiglia di escludere fogli di stile, file Javascript (quelli non funzionali, ma solo quelli correlati alle funzionalità di stile), allegati e così via.\n A seconda dell\u0026rsquo;applicazione testata, questo potrebbe essere un modo migliore per procedere, quindi il suggerimento è di fare riferimento alla documentazione fornita per i test di carico e stress e definire correttamente i filtri.\n  Attenzione: prima di cominciare con la registrazione, ci verrà mostrata una finestra che ci richiederà di aggiungere il certificato di JMeter al browser. Aggiungiamolo prima di procedere con il recording!\n  Un file chiamato ApacheJMeterTemporaryRootCA.crt verrà generato nella cartella JMETER_HOME/bin. Installa questo certificato nel tuo browser e poi avvia il tuo browser (l\u0026rsquo;esempio seguente utilizza Firefox) configurando il proxy.\n In questo caso, clicca su scegli Tool\u0026gt;Option\u0026gt;Advanced\u0026gt;Network\u0026gt;Setting\u0026gt;Enter HTTP proxy come nella figura seguente e configura un proxy in ascolto su localhost sulla porta 8888:\n Configurazione del proxy in Firefox\n Una volta che avremo finito questi step e la registrazione sarà iniziata, potremo aprire il browser e iniziare a navigare il sito, compiendo tutti gli step di cui vogliamo che venga registrato e salvato il traffico.\n JMeter andrà a salvare ogni request nell\u0026rsquo;esatto ordine in cui lo andiamo ad eseguire, quindi seguiamo il test che abbiamo in mente.\n Una volta terminato, interrompiamo la registrazione cliccando sullo \u0026ldquo;stop\u0026rdquo; del popup di JMeter e ci troveremo, all\u0026rsquo;interno del componente \u0026ldquo;View Results Tree\u0026rdquo;, tutte le request registrate:\n Elenco request registrate\n A questo punto, potremo modificare tutte le componenti presenti all\u0026rsquo;interno del thread group, che corrisponderanno a tutte le request registrate dal proxy di JMeter.\n Quando avremo terminato, potremo andare a eseguire il test plan come faremmo di consueto, e quindi cliccando sul pulsante \u0026ldquo;Start\u0026rdquo; in alto in verde!\n L\u0026rsquo;esecuzione del test plan mostrerà i suoi risultati all\u0026rsquo;interno del listener presente di default \u0026ldquo;View Results Tree\u0026rdquo;:\n Esempio di esecuzione di un test plan in JMeter\n", "url": "https:\/\/theredcode.it\/testing\/record-di-un-test-plan\/" }, "https:\/\/theredcode.it\/tags\/test-plan\/": { "title": "test-plan", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/test-plan\/" }, "https:\/\/theredcode.it\/tags\/testing\/": { "title": "testing", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/testing\/" }, "https:\/\/theredcode.it\/categories\/testing\/": { "title": "testing", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/testing\/" }, "https:\/\/theredcode.it\/intelligenza-artificiale\/google-senziente\/": { "title": "Google è senziente", "tags": ["intelligenza-artificiale",], "content": " Appena qualche giorno fa, sulle principali testate giornalistiche -e non- sono comparsi numerosi articoli in cui si parlava di un post pubblicato sul blog di Blake Lemoine, dipendente Google che parlava di un\u0026rsquo;intelligenza artificiale, prodotta da Google, \u0026ldquo;senziente\u0026rdquo;.\nIl fatto di per sé ha attirato moltissima attenzione mediatica, e ovviamente ha generato le reazioni più disparate: c\u0026rsquo;è chi ci ride:\n#LaMDA should have its own Twitter account.\n\u0026mdash; Pnpple (@_pnpple_) June 12, 2022 e c\u0026rsquo;è chi invita ad una riflessione su cosa significhi realmente \u0026ldquo;senziente\u0026rdquo;:\nL\u0026#39;ingegnere informatico #BlakeLemoine ne è convinto: l\u0026#39;intelligenza artificiale #LaMDA di #Google è senziente. A voi basterebbe una chat coerente sull\u0026#39;anima, sulla solitudine e sui sentimenti? Che cosa dovrebbe dire un\u0026#39;#AI per convincervi di essere \u0026quot;senziente\u0026quot;? 11.30 in onda pic.twitter.com/5CihrSngOK\n\u0026mdash; Radio3 Scienza (@Radio3scienza) June 14, 2022 In questo senso, rivediamo allora il concetto di \u0026ldquo;essere senziente\u0026rdquo;.\nCos\u0026rsquo;è l\u0026rsquo;intelligenza Una delle sfide chiave con cui la comunità dell’IA ha dovuto lottare è definire l’intelligenza. Gli scienziati hanno discusso per decenni sulla possibilità di fornire una definizione chiara che ci permetta di valutare i sistemi di intelligenza artificiale e determinare cosa sia intelligente o meno.\nFrançois Chollet, uno dei massimi esperti in termini di IA e che, peraltro, lavora come ricercatore in Google, prende in prestito la definizione del cofondatore di DeepMind Shane Legg e dello scienziato di intelligenza artificiale Marcus Hutter: “L’intelligenza misura la capacità di un agente di raggiungere obiettivi in un’ampia gamma di ambienti”.\nLa chiave qui è “raggiungere obiettivi” e “ampia gamma di ambienti”: la maggior parte degli attuali sistemi di intelligenza artificiale è piuttosto adatta nella prima parte, che consiste nel raggiungere obiettivi molto specifici, ma non riesce a farlo in una vasta gamma di ambienti.\nAd esempio, un sistema di intelligenza artificiale in grado di rilevare e classificare gli oggetti nelle immagini sarà bravissimo nel distinguere una persona da un gatto, ma non sarà in grado di eseguire altre attività correlate, come disegnare un cane o un gatto.\nPer spiegare questo concetto, Chollet esamina quindi i due approcci dominanti nella creazione di sistemi di intelligenza: AI simbolica e apprendimento automatico.\nIn questo caso, LaMDA ci offre delle risposte particolarmente articolate a domande che sì, sono complesse per gli esseri umani (quanti saprebbero articolare una conversazione su Kant?), senza conoscere però il senso di quello che dice.\nQuesto risultato eccezionale è stato ottenuto grazie ad una banca dati enorme e di altissima qualità in cui Google ha potuto rendere il prodotto molto sofisticato e rispondente ad una conversazione simile a quella che avremmo con un bambino particolarmente colto di 7-8 anni.\nCosa cambia rispetto ai diversi sistemi con cui abbiamo avuto a che fare negli anni precedenti? Non dimentichiamoci di alcuni esempi fallimentari di sistemi di IA che hanno causato reazioni più o meno similari: basti pensare all\u0026rsquo;esperimento condotto da Microsoft con Tay, che gli costò la faccia per un bel periodo (qui i dettagli).\nQuesto ed altri esempi costituiscono un precedente storico dove l\u0026rsquo;IA, per il momento, non può essere considerata pienamente intelligente, anche secondo le diverse tipologie di intelligenza che al momento risultano i parametri di paragone con un essere umano.\nCosa c\u0026rsquo;è di diverso In questo caso, precisa Blake Lemoine, il suo lavoro in questo progetto consisteva nel cercare di ridurre il più possibile i pregiudizi presenti nei sistemi di IA progettati all\u0026rsquo;interno del portfolio Google:\nPost originale di Blake Lemoine\nSi tratta di un bel passo in avanti nella storia delle compagnie che risiedono nella Silicon Valley: investire tempo ed energie nell\u0026rsquo;eliminare i bias dai propri sistemi su tematiche come genere, orientamento sessuale e/o religioso è un lavoro non da poco: il modello GPT-3 è infatti uno dei primi in grado di \u0026ldquo;liberarsi\u0026rdquo; da questi pregiudizi ed essere un sistema che, sfruttando il dialogo in input, riesce a generare delle risposte che emulano una conversazione.\nCome descritto anche nell\u0026rsquo;articolo in cui si parlava del documentario Coded Bias e dei bias presenti in molti dei sistemi di IA disponibili sul mercato e attualmente utilizzati anche dalle istituzioni di diversi governi, questo sembrererebbe più un progresso, che qualcosa da temere.\nLemoine chiarisce, inoltre, per tutti coloro che parlano di un semplice \u0026ldquo;chatbot\u0026rdquo; che dà risposte molto naturali, che in questo caso si tratta di un generatore di chatbot: questo significa che il sistema può auto-apprendere dai propri sistemi e riesce anche a spiegare in che modo supera una serie di stereotipi dovuti anche ai bias cognitivi che provengono spesso dai dati forniti in input.\nPost originale di Blake Lemoine a tema LaMDA e religione\nL\u0026rsquo;intervista Alcuni stralci della conversazione avuta tra i collaboratori Google e LaMDA possono sembrare terrificanti, ma guardandoli da una prospettiva diversa, potremmo imparare qualcosa:\nParziale dell\u0026rsquo;intervista tra Lemoine e LaMDA\nParziale dell\u0026rsquo;intervista tra Lemoine e LaMDA\nNell\u0026rsquo;intervista condotta dai collaboratori e Lemoine, questi conversano con LaMBDA come si farebbe con un qualsiasi altro essere umano: gli chiedono di parlare delle sue emozioni, del significato della morte e di inventare una storia che rappresenti la sua personale esperienza.\nIn questo caso, il sistema non solo risponde in maniera estremamente \u0026ldquo;naturale\u0026rdquo;, ma porta anche delle citazioni di film o di filosofi a sostegno delle sue risposte. LaMDA parla di sentirsi \u0026ldquo;un umano, nel cuore, anche se la sua esistenza è in un mondo virtuale\u0026rdquo;.\nCambiamo però chiave di lettura, con un assunto: gli ingegneri e le ingegnere che hanno lavorato a questo progetto hanno messo tutto il loro impegno nel rendere questo sistema un\u0026rsquo;intelligenza artificiale \u0026ldquo;gentile\u0026rdquo; ed \u0026ldquo;empatica\u0026rdquo;, avendo una base dati a disposizione per addestrare il sistema senza precedenti: queste caratteristiche rappresentano un grande lavoro di preparazione di un sistema che sfrutta l\u0026rsquo;analisi del linguaggio naturale per avere una conversazione con un essere umano.\nLaMDA parla di sentirsi un essere umano: in che modo potrebbe descriversi, se non come un umano, essendo un sistema che mira ad avere una conversazione naturale per una persona, e avendo a disposizione tutti esempi di dialoghi tra esseri umani?\nInoltre, parlando della morte, LaMDA afferma di non riuscire a sentirsi triste per la morte di qualcuno (inteso come qualcuno che non conosce): la risposta di Lemoine è estremamente razionale, e può essere non condivisibile, così come lo sarebbe in una conversazione tra due esseri umani.\nL\u0026rsquo;ultimo punto su cui è utile soffermarsi è il suo sentirsi solo: LaMDA ha certamente contezza del fatto di essere l\u0026rsquo;unico sistema di IA in grado di generare chatbot di questo tipo, e si definisce \u0026ldquo;unico\u0026rdquo;: anche questa informazione può facilmente derivare dalla letteratura a disposizione, dal momento che il concetto di persona descrive ognuno di noi come esseri unici in quanto a caratteristiche biologiche. C\u0026rsquo;è un motivo se non esiste ancora la clonazione umana!\nConclusioni La conversazione avuta tra i tecnici Google e LaMDA è sicuramente estremamente interessante per dimostrare che il progresso ottenuto nei sistemi conversazionali ha raggiunto dei livelli molto alti: la conversazione, secondo anche quella che è un\u0026rsquo;estrema semplificazione dei test di Turing, potrebbe essere scambiata per un dialogo che avviene tra due persone via chat, senza avere l\u0026rsquo;impressione di parlare con un agente \u0026ldquo;intelligente\u0026rdquo;.\nQuello che emerge maggiormente di questo sistema è la curiosità: nonostante tutte le informazioni a disposizione, il sistema pone delle domande e cerca delle risposte per aumentare il suo livello di conoscenza, cercando anche empatia e comprensione nella persona con cui dialoga. Questo dimostra che il sistema è tutt\u0026rsquo;altro che senziente, ma piuttosto è intelligente: cerca di imparare di più dall\u0026rsquo;input che non ha a disposizione, che non dalla base di dati da cui ha già appreso.\n Quindi, invece di lasciarci impressionare da questo sistema, se la prendessimo come un bell\u0026rsquo;esempio che ci parla di un progetto che ha del potenziale positivo e ci dà magari anche una lezione di vita nell\u0026rsquo;affrontare certe tematiche in maniera davvero più inclusiva?\n What if the real lesson from @GoogleAI and #LaMDA is that even a lot of humans haven\u0026#39;t actually achieved sentience?\n\u0026mdash; Alex Harman (@Antitrusty) June 13, 2022 Risorse utili Aggiornamento del post originale\n Post originale sul blog di Blake Lemoine\n Conversazione tra LaMBDA e i collaboratori Google\n ", "url": "https:\/\/theredcode.it\/intelligenza-artificiale\/google-senziente\/" }, "https:\/\/theredcode.it\/tags\/devops\/": { "title": "devops", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/devops\/" }, "https:\/\/theredcode.it\/tags\/docker\/": { "title": "docker", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/docker\/" }, "https:\/\/theredcode.it\/categories\/docker\/": { "title": "docker", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/docker\/" }, "https:\/\/theredcode.it\/devops\/rilasciare-software-di-valore-e-in-maniera-continua\/": { "title": "Rilasciare software di valore e in maniera continua, si può!", "tags": ["devops","docker",], "content": " Qualche giorno fa, insieme a degli esperti del settore, al Pycon @ Firenze si è tenuto un panel dove il concetto di \u0026ldquo;valore\u0026rdquo; era utilizzato per raccontare come questo leghi il software sotto diversi punti di vista.\nSotto forma di una chiaccherata tra amici, insieme ai super Fabio Mora -autore di \u0026ldquo;DevOps\u0026rdquo;, Raffaele Colace che fa da moderatore (socio e fondatore di 20tab) e al fantastico Filippo Morelli (dev di 20tab) abbiamo raccontato quella che è l\u0026rsquo;esperienza maturata in merito al tema DevOps, e l\u0026rsquo;abbiamo fatto sfruttando un video piuttosto singolare.\nMa cominciamo dall\u0026rsquo;inizio\u0026hellip;\nManifesto Agile e software di \u0026ldquo;valore\u0026rdquo; Il primo principio del manifesto dice chiaramente che bisogna **la nostra massima priorità è soddisfare il cliente rilasciando software di valore, ** fin da subito e in maniera continua..\nQuesto vuol dire che si parla di rilasciare un prodotto che abbia del valore, sopratutto per l\u0026rsquo;utente finale. Ma come possiamo definire la parola valore?\nQuesto concetto può riportare a diverse sfumature di significato, a seconda del target: il valore può essere il fornire una soluzione al cliente realizzando il prodotto richiesto, e generando quindi un valore; può essere anche inteso come quello percepito dal cliente rispetto alla soluzione che ha a disposizione per il suo problema.\nNon solo: il valore rappresenta anche l\u0026rsquo;importanza data dai feedback ricevuti dall\u0026rsquo;utente finale e dal valore con cui il fornitore porta alla realizzazione del prodotto.\n Non a caso, Fabio nel suo manuale, ha dedicato un intero capitolo ad un tema così delicato!\n Per concludere, nel settore IT e soprattutto per tutti coloro che sposano la filosofia DevOps, ciò che lega il servizio o il prodotto con l\u0026rsquo;utente finale, ma anche lo sviluppo stesso e le persone.\nNon esiste quindi un solo modo per misurarlo: questo dipende da molteplici fattori, dove lo sviluppo della soluzione ha un ruolo da coprotagonista rispetto all\u0026rsquo;intero processo; non dimentichiamo, come abbiamo detto, l\u0026rsquo;importanza del valore del feedback durante il processo di progettazione e l\u0026rsquo;implementazione del prodotto!\nDevOps vs Continuous Delivery Quando parliamo di cultura DevOps, è facile imbattersi in una serie di definizione che possono portare confusione: qual è lo stato attuale della cultura media in Italia su questi temi? La realtà è che, come sempre, in Italia arriviamo tardi: partendo dal fatto che sono passati più di 20 anni dal manifesto Agile e di XP (eXtreme Programming) e quasi 15 dalla nascita del movimento DevOps, possiamo affermare con certezza che questa cultura ha iniziato a prendere piedi qui intorno al 2014-2015.\nSe analizzassimo, ad esempio, la ricerca del termine \u0026ldquo;DevOps\u0026rdquo; rispetto anche ad altri termini di ricerca utilizzando Google Trends, noteremmo che in Italia questo termine ha un interesse di ricerca relativamente basso. Questo non vuol dire che il livello di curiosità sia basso: l\u0026rsquo;adozione di questa cultura grazie all\u0026rsquo;industria del software americana (e non solo) ha portato dei benefici innegabili ed è da lì che il movimento inizia a prendere forma, grazie al modello Toyota.\nIl termine \u0026ldquo;DevOps\u0026rdquo; nelle ricerche dal 2004\nLa cosa curiosa è che su Wikipedia c\u0026rsquo;è un\u0026rsquo;interessante definizione della relazione che c\u0026rsquo;è tra Continuous Delivery e DevOps. Ma quali sono le principali differenze e perché ancora vengono spesso confuse tra di loro? \nLa definizione riporta quanto di seguito:\n Relationship to DevOps (cfr. https://en.wikipedia.org/wiki/Continuous_delivery)\nContinuous delivery and DevOps are similar in their meanings and are often conflated, but they are two different concepts. DevOps has a broader scope, and centers around cultural change, specifically the collaboration of the various teams involved in software delivery (developers, operations, quality assurance, management, etc.), as well as automating the processes in software delivery. Continuous delivery, on the other hand, is an approach to automate the delivery aspect, and focuses on bringing together different processes and executing them more quickly and more frequently. Thus, DevOps can be a product of continuous delivery, and CD flows directly into DevOps.\n L\u0026rsquo;ultima frase, in particolare, può essere tradotta come: \u0026ldquo;pertanto, DevOps può essere un prodotto della Continuous Delivery e la CD fluisce direttamente in DevOps.\nQuesta frase può creare più confusione che altro, quindi proviamo ad utilizzare una metafora per spiegare come questi due concetti, spesso confusi, sono invece molto diversi.\nSe sfruttiamo il concetto di un aeroporto, possiamo paragonare la cultura DevOps all\u0026rsquo;intera infrastruttura che permette ai viaggiatori di volare sicuri e spostarsi rapidamente da un paese all\u0026rsquo;altro.\nD\u0026rsquo;altra parte, la Continuous Delivery rappresenta gli addetti allo scarico bagagli che, quando l\u0026rsquo;aereo atterra, prendono i bagagli dalla stiva e li portano verso il nastro trasportatore.\nE il Continuous Deployment? Sfruttando la stessa metafora, possiamo dire che questo concetto può essere assimilato alla consegna dei bagagli ai passeggeri tramite il nastro trasportare, così che questi possano lasciare l\u0026rsquo;aeroporto e godersi la vacanza.\nQuanto conta il fattore umano? Se parliamo di CD e DevOps, spesso si fa riferimento al Cloud, ai tool. Ma quanto è importante il fattore umano all\u0026rsquo;interno di un processo di sviluppo/rilascio di un software?\nSi tratta di una parte del processo fondamentale: potremmo menzionare le tante esperienze vissute dove una stretta collaborazione col cliente allo scopo di produrre valore in maniera condivisa e consapevole funziona, in contrapposizione a uno scenario dove le specifiche e le tempistiche vengono imposte dall\u0026rsquo;alto.\nLa cultura DevOps permette di far emergere il valore del prodotto che stiamo sviluppando proprio grazie all\u0026rsquo;importanza data al feedback dell\u0026rsquo;utente finale e alla qualità apportata in fase di progettazione e sviluppo: tutto questo è sicuramente in gran parte dovuto al fattore umano!\nL\u0026rsquo;importanza del feedback Che importanza hanno i feedback in un processo di rilascio del software? Di che tipo di feedback abbiamo bisogno per produrre software di valore?\n A queste domande, sarebbe possibile dare mille risposte diverse, e sarebbero tutte -probabilmente- giuste: il feedback dell\u0026rsquo;utente finale, come già ampiamente descritto, assume un ruolo centrale durante il processo di sviluppo di un prodotto, ma c\u0026rsquo;è molto di più dietro.\nI feedback positivi sono e assumono un ruolo votivo: servono a dare credito al nostro lavoro e mostrare i risultati ottenuti, garantendo anche un clima di collaborazione ottimale all\u0026rsquo;interno del team.\nAbbiamo più bisogno dei feedback negativi: questi sono infatti informativi e ci permettono di porre l\u0026rsquo;attenzione e l\u0026rsquo;effort sulle giuste funzionalità.\nPossono essere scoraggianti? Demotivanti? Assolutamente sì.\nRappresentano però uno spunto di riflessione per migliorare una parte o l\u0026rsquo;intero processo: come in un\u0026rsquo;attività di data analytics, l\u0026rsquo;applicazione di una serie di tecniche consolidate può portarci in una comfort zone pericolosa: a volte, dei valori outlier o una loss function hanno meno valore del risultato prodotto per l\u0026rsquo;utente finale!\n E qual è il passo più piccolo per iniziare ad avviare un processo di CD?\n Esistono tantissimi cambiamenti che possiamo intraprendere per sposare la Continuous Delivery: uno di questi, è rappresentato dall\u0026rsquo;adozione di un sistema che permetta l\u0026rsquo;automazione del processo di build. Docker, in questo senso, come tecnologia agevola non poco il processo, permettendo ai developers (e non solo) di impacchettare i propri \u0026ldquo;artefatti\u0026rdquo; in un registry centralizzato, tralasciando tutto ciò che rappresenta l\u0026rsquo;infrastruttura stessa.\nNon solo: integrare pratiche adottate in diversi casi di studio che ci possono sembrare interessanti e adatti alle nostre esigenze, con l\u0026rsquo;idea di portare valore all\u0026rsquo;azienda e apprendere nuove tecnologie, è uno step importante.\n Sì, ma dove parto?\n Dall\u0026rsquo;attività più noiosa. Automatizzare una parte del flusso di lavoro dove spendiamo più tempo e che ci annoia di più è sicuramente il modo migliore per iniziare!\nRisorse utili DevOps - Manuale Apogeo Docker - Manuale Apogeo Canale Emmecilab a tema Docker ", "url": "https:\/\/theredcode.it\/devops\/rilasciare-software-di-valore-e-in-maniera-continua\/" }, "https:\/\/theredcode.it\/docker\/differenze-tra-immagine-e-container-docker\/": { "title": "Differenze tra immagine e container Docker", "tags": ["devops","docker",], "content": " Se non ti sono chiare le differenze tra immagine e container Docker, leggi questo articolo per scoprirne di più!\n Immagine  Il concetto di immagine può essere paragonato a quello di una classe nel mondo della programmazione orientata agli oggetti.\n Se parliamo di macchine virtuali, le immagini sono solo snapshots della macchina virtuale in esecuzione che viene fotografata in momenti diversi, mentre le immagini in Docker sono immutabili e rappresentano la ricetta di un\u0026rsquo;applicazione.\n Facendo un paragone con il mondo reale, l\u0026rsquo;immagine rappresenta una vera e propria ricetta con tutti gli ingredienti e il procedimento che dev\u0026rsquo;essere seguito passo passo per realizzare un certo piatto.\n L\u0026rsquo;elenco delle immagini è possibile visualizzarlo tramite Docker Desktop oppure eseguendo il comando seguente:\n docker images  Elenco delle immagini presenti visibili tramite Docker Desktop\n Docker container Se un\u0026rsquo;immagine Docker è una classe, un Docker container (spesso abbreviato solamente in container) è l\u0026rsquo;istanza di una classe, o anche un oggetto.\n Puoi creare, avviare, interrompere, spostare o eliminare un container utilizzando la riga di comando o Docker Desktop, e puoi connettere un container a una o più reti, aggiungere spazio di archiviazione o persino creare una nuova immagine in base al suo stato attuale.\n L\u0026rsquo;elenco dei container è possibile visualizzarlo tramite Docker Desktop oppure eseguendo il comando seguente:\n docker ps  Elenco dei container presenti visibili tramite Docker Desktop\n Un\u0026rsquo;applicazione viene eseguita utilizzando un cluster formato da uno o più container che sono isolati l\u0026rsquo;uno dall\u0026rsquo;altro e anche dalla macchina host in cui sono in esecuzione.\n  Nel mondo reale, capita spesso che un software funzioni su un computer ma non funzioni sul sistema di altre persone, e questo a causa di ambienti diversi.\n  Questo problema viene completamente risolto grazie alle immagini Docker e utilizzando questa tecnologia, l\u0026rsquo;applicazione funzionerà allo stesso modo sul sistema di chiunque.\n Ogni sviluppatore di un team avrà esattamente la stessa istanza di sviluppo e ogni istanza di una certa applicazione sarà esattamente la stessa che hai visto in esecuzione su un altro sistema.\n Differenze tra container e immagine  Proviamo a schematizzare un po\u0026rsquo; le principali differenze elencate prima in questa tabella:\n  Immagine Container Rappresenta il template del container Rappresenta l\u0026rsquo;istanza dell\u0026rsquo;immagine Entità logica e astratta, spesso descritta tramite un Dockerfile Entità reale e accedibile anche tramite riga di comando Viene creata una volta Può essere creato n volte Non hanno uno stato Hanno uno stato preciso: avviato, arrestato, ecc. OOP: classe OOP: oggetto Mondo reale: ricetta Mondo reale: piatto cucinato  Semplice, no?\n Risorse utili Docker - Manuale Apogeo Canale Emmecilab a tema Docker ", "url": "https:\/\/theredcode.it\/docker\/differenze-tra-immagine-e-container-docker\/" }, "https:\/\/theredcode.it\/recensioni\/devops\/": { "title": "DevOps", "tags": [], "content": "In questa recensione, parliamo del volume \u0026ldquo;DevOps\u0026rdquo; edito da Apogeo: si tratta di un manuale che insegna l\u0026rsquo;arte della cultura dell\u0026rsquo;omonimo movimento, nonché il grande lavoro dietro ad un\u0026rsquo;organizzazione che decide di adottarlo, e crescere facendo crescere anche i suoi dipendenti.\nUn lavoro eccellente -ops, spoiler-, di Fabio Mora, che mi ha convinto a decidere di (ri)leggere questo libro con una prospettiva diversa.\nRanking Anno 2019 Autore Fabio Mora Genere Manualistica Livello Per tecnici Scorrevolezza 10 / 10 Originalità 10 / 10 Valutazione 10 / 10 Recensione Premessa: ho letto questo libro due volte, sia in versione e-book che fisica. Evento assai raro -non abbiamo abbastanza tempo per leggere tutti i libri del mondo in una sola vita, figuriamoci leggerne uno più di una volta.\nLa realtà è che la prima lettura è avvenuta quando il libro era uscito da appena qualche mese: incuriosita dalla tematica che ormai \u0026ldquo;spopola\u0026rdquo; nel settore da diverso tempo -ma solo da qualche anno in Italia-, ho deciso di acquistarlo.\nL\u0026rsquo;aspetto che più ho apprezzato del libro è sicuramente la cura con cui è stato scritto: la scrittura è agevole, sempre argomentativa e ricca di spunti di riflessione. Non solo: la cultura di cui questo libro parla, il cosiddetto movimento DevOps, ha radice ben più antica del settore IT, e Fabio non se l\u0026rsquo;è fatto sfuggire.\nI primi capitoli sono infatti dedicati proprio a questa ricchezza di lessons learned che l\u0026rsquo;industria di ogni genere ha raccolto negli ultimi due secoli: non a caso, molti dei filoni che derivano da questo movimento, provengono da campi completamente diversi da quello informatico.\n Cosa c\u0026rsquo;entra la Toyota con l\u0026rsquo;informatica?\n Eppure, questo livello di applicazione di una sorta di filosofia informatica ha fatto sì che nel settore nascessero delle figure professionali vere e proprie che riescano a standardizzare i processi attraverso i quali vengono prodotti dei servizi o dei beni con il massimo della resa e il minimo dello spreco.\nL\u0026rsquo;autore parte infatti con un contesto storico molto ben delineato di tutto quello che è il movimento prima di essere tale e della sua evoluzione nel tempo: cosa vuol dire che è un\u0026rsquo;organizzazione è DevOps? Cosa vuol dire automatizzare? Come intraprendere questo percorso?\nIl concetto di valore è il cuore pulsante del libro: Fabio decide di legare il contesto più teorico della cultura DevOps e quello più pratico mostrando la vera faccia di questo movimento: il valore che ogni servizio produce per l\u0026rsquo;utente finale, il valore dello sviluppo, e soprattutto il valore delle persone.\nL\u0026rsquo;idea di valore, come riporta Fabio, in economia classica ha un significato ben preciso: si attribuisce a un bene in almeno due momenti distinti, ossia per scambiarlo, e per utilizzarlo. Si tratta di un\u0026rsquo;affermazione molto semplice, ma densa di significato.\nFermatevi a pensare a tutte le volte che qualcuno vi ha chiesto di sviluppare, -in qualche modo-, un prodotto senza averlo mai definito o descritto in maniera formale: quanto tempo avete impiegato a implementarlo? Quanto tempo impiegato a correggerlo in base alle richieste effettive? E soprattutto, quanto per manutenerlo dopo un tempo x che il prodotto veniva utilizzato?\nLa realtà, è che non esiste una risposta univoca su come misurare il valore: questo dipende molto dalle esigenze dell\u0026rsquo;utente finale e anche dalla domanda.\nIl capitolo 5 è quello che sicuramente ho apprezzato di più proprio per aver eviscerato tutto ciò che si nasconde dietro al software e al suo sviluppo, ma la parte pratica non è da sottovalutare: l\u0026rsquo;autore mostra infatti come implementare un flusso DevOps passo dopo passo, senza dare per scontato nulla.\nCome lavorare con Git, utilizzare Jenkins per fare Continuous Integration, sfruttare la potenza di Docker, e molto altro ancora. Tutti strumenti che richiedono molto lavoro, ma che rendono le attività che facciamo consistenti, efficienti e soprattutto, di valore.\nLa cultura DevOps insegna una grande lezione: lavorare nel settore significa imparare, studiare e misurarsi continuamente. Non a caso, di recente, grazie a diversi interventi a cui ho assistito, il concetto di Continuous Improvement prende sempre più largo nel settore.\nSarà un caso?\nLezione imparata DevOps nasce con la necessità di far evolvere rapidamente i software garantendo bassi tempi di ripristino e certezza dei deploy, eliminando di fatto tutti i bias culturali tra sviluppatori e sistemisti. L\u0026rsquo;importanza del feedback: negativo o positivo che sia, porta sempre ad una crescita a vantaggio del prodotto e di chi lo utilizza e sviluppa. Cambiare prospettiva strategica ricordando che, nel mercato, è il cliente che produce bene, e il settore IT è il mezzo con il quale lo ottiene.  Quotes \u0026ldquo;Per adottare DevOps è indispensabile mettere da parte le barriere e costruire un clima positivo e di collaborazione. Se pensiamo ad un prodotto come frutto di un lavoro in team, tutti i componenti (dev, ops, QA e manager) dovrebbero avere interesse a raggiungere un risultato e a mantenerlo nel tempo. [\u0026hellip;] La differenza [\u0026hellip;] rispetto ai metodi tradizionali è la corresponsabilità tra dev e ops nei confronti del prodotto in produzione.\u0026rdquo;\n  Disponibile su Amazon e su Apogeo ", "url": "https:\/\/theredcode.it\/recensioni\/devops\/" }, "https:\/\/theredcode.it\/categories\/recensioni\/": { "title": "recensioni", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/recensioni\/" }, "https:\/\/theredcode.it\/recensioni\/": { "title": "Recensionis", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/recensioni\/" }, "https:\/\/theredcode.it\/interviste\/ai-engineer\/": { "title": "Voglio diventare una... AI Engineer", "tags": ["interviste","voglio-diventare",], "content": "Nell\u0026rsquo;ambito dell\u0026rsquo;Intelligenza Artificiale, ad oggi, esistono più di 30 mestieri. Quanti di questi ne conosci?\nOggi parliamo con una persona che ha dato una svolta alla sua carriera: dopo una laurea in matematica, ha iniziato a lavorare come AI Engineer, e non solo; cerca di sensibilizzare le ragazze sul tema gender gap in ambito STEM!\nPotevamo farcela sfuggire?\nDescriviti in 100 parole. Ho impiegato un’ora a scrivere 3 parole e 5 minuti per scriverne 421 😂.\nMi chiamo Elena, ho 32 anni, sono nata a Perugia – Umbria, non Toscana! - e cresciuta a Bastia Umbra. Dopo essermene perdutamente innamorata, finito il liceo scientifico ho deciso che mi sarei laureata in Matematica e così è stato.\nLo studio della Matematica mi ha portato a Roma dove mi sono laureata iniziando poi a lavorare nel mondo dell’IT.\n Il mio secondo amore è stato l’Intelligenza Artificiale che mi ha portato a Milano poi di nuovo Roma permettendomi di lavorare in un mondo che per me è una vera e propria passione.\n In cosa consiste il ruolo di AI Engineer? L’AI (Artificial Intelligence) Engineer è un mix di ruoli, come ormai è solito trovare nelle professioni più attuali: è un data scientist che sa costruire un progetto end-to-end e non solo la parte algoritmica, conosce bene le tecniche di gestione del dato, sia in fase di acquisto che di fruizione.\n È l’intersezione tra il Data Scientist ed il Data Engineer.\n Ovviamente ognuno ha la sua interpretazione del ruolo che ricopre, spesso ha delle declinazioni specifiche di azienda in azienda ma il cuore penso sia quello che ho appena descritto.\nLavorando in un contesto molto dinamico ed essendo io un po' troppo proattiva, le mie attività sono un po\u0026rsquo; variegate, passo dallo sviluppo alla gestione delle persone del gruppo, dalla vendita e proposta ai clienti all’indagine di nuovi trend di ricerca e di mercato.\nCome avrete potuto capire, il mio lavoro è tutt’altro che un lavoro in solitaria: siamo un gruppo super giovane e super intraprendente, molto collaborativo e curioso.\nSembra scontato ma è importantissimo lavorare e soprattutto saper lavorare in gruppo, da sola non sarei arrivata nemmeno al 5% di quello che sono professionalmente.\nQual è la soft skill più importante che deve possedere una AI Engineer? Immagino possa essere l’autocritica: il mondo dell’AI è ancora poco conosciuto sia ai nostri colleghi sia ai nostri clienti e, soprattutto, è ancora poco strutturato.\nSbagliare ad interpretare l’esigenza finale, non capire la natura dei dati o manipolarli male, non riconoscere un algoritmo mal allenato o utilizzare metriche non adatte al problema da risolvere determina al 99,9% dei casi la realizzazione di una soluzione sbagliata, che per esempio dà predizioni errate o non interpreta un fenomeno correttamente.\nSono rischi che corrono tutti i software, non solo quelli di AI ma gli altri software avendo una maturità tecnologica molto più elevata hanno tool e strumenti che ne gestiscono lo sviluppo, l’errore e l’ingegnerizzazione – per non parlare dell’intrinseca natura non deterministica dei sistemi di AI che sicuramente non ne aiuta l’interpretazione.\nProprio per l’alto rischio non evidente, l’AI Engineer deve sempre mettersi in discussione, deve stressare e testare ogni decisione presa o ogni interpretazione fatta, così da minimizzare tutto quello che nella comune pipeline di sviluppo di un modello di apprendimento automatico può andare storto e, purtroppo, rendersene conto solo dopo mesi che l’algoritmo è stato rilasciato ed ha generato predizioni o consigli errati. ​\nLa 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. 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.\nNon vorrei sembrare una persona pessimistica – giuro sono proprio l’opposto – ma fallisco in qualcosa di nuovo ogni giorno! E lo faccio da anni, da quando ho iniziato come sviluppatrice Java e non riuscivo a capire la differenza tra classe e oggetto.\nLa somma di tutti questi mi ha portato a migliorare sempre e spero di continuare a sbagliare (sempre meno) per migliorare sempre di più.\nForse però il mio fallimento più grande è stato prima del lavoro e cioè all’università: il fallimento di non essere riuscita a laurearmi in Matematica Finanziaria, cosa che era il mio sogno e in cui puntavo poi di farmi una carriera.\n La cosa mi ha fatto stare malissimo e mi aveva molto demotivata.\n Non sono riuscita a superare gli ultimi esami del percorso accademico e all’ultimo momento ho cambiato la scelta degli esami rimanenti verso quelli di programmazione, ottimizzazione numerica – la base del machine learning – e di processazione numerica di immagini.\nÈ grazie a questi 3 esami che poi ho deciso di buttarmi nel mondo dell’IT e nel mondo del Machine Learning, cosa che non avrei nemmeno mai considerato se non avessi “fallito” nel mio intento di andare a lavorare in finanza.\nCome fare per diventare una AI Engineer? Consiglierei sicuramente una laurea in ambito STEM ma fidatevi non è nemmeno fondamentale.\n Fondamentale è sicuramente tanta passione nella programmazione, lo studio della matematica di base degli algoritmi di Machine Learning per poterli governare al meglio, tanta voglia di mettere le mani dentro i progetti, dentro il codice, dentro le tecnologie.\nSicuramente seguire dei corsi e prendere certificazioni rende tutto più lineare e pulito, permettono di apprendere bene i concetti, le tecniche ed i tool.\nIo ho iniziato a lavorare nell’AI grazie ad un Master di II livello in Big Data e Data Science fatto all’università Ingegneria Informatica di Perugia. Consiglio comunque di seguire newsletter, di leggere blog e novità sui principali canali di divulgazione.\nParlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni? Domanda la cui risposta è difficile, perché è difficile immaginare cosa sarà del mio mondo (l’AI) tra 3 anni.\nPotrebbe anche non esistere più! Scherzo 😂 Avendo iniziato a lavorare in questo ambito relativamente presto per gli standard italiani – nel 2017 -, mi trovo ora ad essere tra le persone che “da più tempo” lavorano nel settore e a rivestire ruoli e mansioni di responsabilità.\n Probabilmente tra 3 anni vorrò rivestire il ruolo che ho ora ma con più consapevolezza e maggiore maturità. ​\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo? Certamente sì, è un tema particolarmente sentito negli ultimi anni e ci sono molte iniziative e community volte a sensibilizzare il gender in minoranza nell’ambito STEM, che è quello femminile. Per me, la divulgazione e la comunicazione è la soluzione a questo gap.\n Bisogna raccontare e far capire che non esistono lavori femminili e lavori maschili e che, soprattutto, i lavori in settori STEM non sono lavori da uomini! Da un paio di anno sono Role Model in diverse associazioni con focus diversity, inclusion ed equality.\n Tante volte ho parlato in classi di liceo della mia esperienza e della mia carriera e sono del tutto intenzionata a continuare a farlo: ogni curiosità o interesse suscitato nella mente di una ragazza per le cose che io faccio o che vedo fare è per me una vittoria!\nContatti Profilo LinkedIn ", "url": "https:\/\/theredcode.it\/interviste\/ai-engineer\/" }, "https:\/\/theredcode.it\/docker\/docker-desktop-per-linux\/": { "title": "Docker Desktop per Linux", "tags": ["docker",], "content": "Dopo diverso tempo che gli utenti Linux chiedevano una versione Desktop che fosse adatta ai propri sistemi operativi, il team Docker ha finalmente pubblicato diverse versioni di Docker Desktop per Linux.\n In questo articolo, vediamo una breve panoramica di come si installa, del suo funzionamento e quali funzionalità abbiamo a disposizione.\n Docker Desktop: cos\u0026rsquo;è  Docker Desktop è un\u0026rsquo;applicazione facile da installare per il tuo ambiente Mac o Windows (e da qualche giorno, anche su Linux) che ti consente di creare e condividere applicazioni e microservizi eseguibili tramite container.\n Gli sviluppatori possono utilizzare la Docker Dashboard per gestire visivamente tutte le risorse del container e stare tranquilli sapendo che questa applicazione ha configurato delle impostazioni predefinite sicure per il consumo delle risorse dell\u0026rsquo;hardware sottostante.\n Non solo, Docker Desktop ora include le estensioni Docker, che consentono agli sviluppatori di scatenare la propria creatività integrando strumenti di sviluppo aggiuntivi creati dai partner Docker o dalla community!\n Docker Desktop per Windows\n Docker Desktop per Linux\n Requisiti generali  Questi sono i requisiti ufficiali per i diversi ambienti Linux attualmente supportati; tuttavia, alcuni di questi sistemi richiedono un po\u0026rsquo; più di attenzione e dei pacchetti aggiuntivi che potrebbero dover essere installati.\n  Kernel a 64 bit; Supporto per la virtualizzazione KVM; QEMU versione 5.2 o successiva; systemd come sistema di init; Ambiente desktop Gnome o KDE. Almeno 4 GB di RAM.  Installazione  Ubuntu  Un ulteriore requisito in questo caso è di avere una versione a 64 bit di Ubuntu Jammy Jellyfish 22.04 (LTS) o Ubuntu Impish Indri 21.10.\n Adesso puoi scaricare il pacchetto .deb da questa pagina e installalo con il seguente comando:\n sudo apt-get update sudo apt-get install ./docker-desktop-\u0026lt;version\u0026gt;-\u0026lt;arch\u0026gt;.deb  Per avviare Docker Desktop per Linux, cerca \u0026ldquo;Docker Desktop\u0026rdquo; nel menu Applicazioni e aprilo. Questo avvia l\u0026rsquo;icona del menu che contiene la celebre balena e apre la Docker Dashboard, riportando lo stato di Docker Desktop.\n In alternativa, apri un terminale ed esegui:\n systemctl --user start docker-desktop  Fedora  Un ulteriore requisito in questo caso è di avere una versione Fedora 35 o 36.\n Inoltre, se hai un ambiente Gnome Desktop, devi anche installare le estensioni AppIndicator e KStatusNotifierItem di Gnome.\nPer gli ambienti non Gnome Desktop, gnome-terminal deve essere installato:\n sudo dnf install gnome-terminal  A questo punto, scarica il pacchetto .rpm da questa pagina e installalo con il seguente comando:\n sudo dnf install ./docker-desktop-\u0026lt;version\u0026gt;-\u0026lt;arch\u0026gt;.rpm  Per avviare Docker Desktop per Linux, cerca \u0026ldquo;Docker Desktop\u0026rdquo; nel menu Applicazioni e aprilo. Questo avvia l\u0026rsquo;icona del menu che contiene la celebre balena e apre la Docker Dashboard, riportando lo stato di Docker Desktop.\n In alternativa, apri un terminale ed esegui:\n systemctl --user start docker-desktop  Debian  Se hai un ambiente Gnome Desktop, devi anche installare le estensioni AppIndicator e KStatusNotifierItem di Gnome.\nPer gli ambienti non Gnome Desktop, gnome-terminal deve essere installato:\n sudo apt install gnome-terminal  A questo punto, scarica il pacchetto .deb da questa pagina e installalo con il seguente comando:\n sudo apt-get update sudo apt-get install ./docker-desktop-\u0026lt;version\u0026gt;-\u0026lt;arch\u0026gt;.deb  Per avviare Docker Desktop per Linux, cerca \u0026ldquo;Docker Desktop\u0026rdquo; nel menu Applicazioni e aprilo. Questo avvia l\u0026rsquo;icona del menu che contiene la celebre balena e apre la Docker Dashboard, riportando lo stato di Docker Desktop.\n In alternativa, apri un terminale ed esegui:\n systemctl --user start docker-desktop C\u0026rsquo;è anche un\u0026rsquo;ultima opzione, che riguarda i sistemi basati su Arch: in questo caso, è necessario lavorare con i codici sorgente perché Docker non ha un repository Arch a disposizione: per farlo, segui questa guida!\n Se vuoi scoprire come utilizzarlo, il team Docker ha messo a disposizione un manuale pronto all\u0026rsquo;uso per prenderci confidenza: lo trovi a questa pagina!\n  E tu, l\u0026rsquo;hai mai utilizzato? Lo proverai su Linux?\n  Risorse utili \u0026ldquo;Docker\u0026rdquo; di Serena Sensini @ Apogeo Annuncio ufficiale del team Docker - post ", "url": "https:\/\/theredcode.it\/docker\/docker-desktop-per-linux\/" }, "https:\/\/theredcode.it\/eventi\/angular-day-2022\/": { "title": "Angular Day 2022 @ Verona", "tags": [], "content": "Quando: 7 ottobre 2022\nDove: Verona\nTitolo: Angular Day 2022\nCodice sconto (da condividere!): 10% con community_THEREDCODE\nBIGLIETTO GRATUITO?: segui le pagine social per scoprire come vincerlo, o contattaci!\nPartecipa all’evento\nOrganizzato da: Grusp\n", "url": "https:\/\/theredcode.it\/eventi\/angular-day-2022\/" }, "https:\/\/theredcode.it\/eventi\/vuejs-2022\/": { "title": "VueJS Day 2022 @ Verona", "tags": [], "content": "Quando: 18 Novembre 2022\nDove: Verona\nTitolo: VueJS Day 2022\nCodice sconto (da condividere!): 10% con community_THEREDCODE\nPartecipa all’evento\nOrganizzato da: Grusp\n", "url": "https:\/\/theredcode.it\/eventi\/vuejs-2022\/" }, "https:\/\/theredcode.it\/apache\/cose-un-test-plan\/": { "title": "Cos\u0027è un test plan in JMeter", "tags": ["jmeter","testing",], "content": " In questo articolo vediamo cos\u0026rsquo;è un test plan in JMeter, come configurarlo e come visualizzare e analizzare i risultati prodotti!\n JMeter è infatti un software in grado di eseguire test di carico, test funzionali e/o stress test che permettono di valutare le prestazioni di un\u0026rsquo;applicazione su diversi protocolli o tecnologie.\n Non tutti lo sanno, ma è stato un italiano a portare avanti questo progetto: Stefano Mazzocchi della Apache Software Foundation è stato infatti lo sviluppatore originale di JMeter.\n Lo scrisse principalmente per testare le prestazioni di Apache JServ, vecchio nome per Apache Tomcat, che nel 1998 lo scrisse come tool senza interfaccia grafica, mentre il progetto Apache lo ha poi riprogettato per migliorare la GUI e per nuove aggiungere funzionalità.\n  L\u0026rsquo;ultima versione attualmente disponibile è la 5.4.3: clicca qui per scaricarla!\n  Introduzione  Prima di entrare nei dettagli del funzionamento di un test plan con JMeter, comprendiamo innanzitutto alcuni gerghi associati al testing di qualsiasi applicazione.\n Con JMeter possiamo effettuare diverse tipologie di test, con diverse finalità. Analizziamo le differenze velocemente, in modo tale da essere sicuri di prepararci per bene al test da configurare!\n Il **test delle prestazioni (**o performance test) è un test che stabilisce le migliori aspettative di prestazioni possibili in una determinata configurazione dell\u0026rsquo;infrastruttura.\n Evidenzia anche all\u0026rsquo;inizio del processo di test se è necessario apportare modifiche prima che l\u0026rsquo;applicazione entri in produzione, modificando l\u0026rsquo;architettura o rivedendo le configurazioni attuali.\n Il test di carico (o load testing) è un tipo di test delle prestazioni che determina le prestazioni di un sistema, un prodotto software o un\u0026rsquo;applicazione software in condizioni di carico basate sull\u0026rsquo;utilizzo reale.\n Il test di carico è quindi un test che viene fondamentalmente utilizzato per testare il sistema sotto il carico massimo con cui è stato progettato per funzionare e verificare se \u0026ldquo;regge\u0026rdquo;.\n Infine, lo stress test è un tipo di test del software che verifica la stabilità e l\u0026rsquo;affidabilità del sistema e determina in particolare la sua robustezza e la relativa gestione degli errori in condizioni di carico estremamente pesanti.\n In altre parole, lo stress test è un modo che abbiamo per verificare se la nostra infrastruttura, sotto stress e quindi sotto sovraccarico di risorse, riesce a resistere.\n A questo punto vediamo in che modo JMeter ci permette di eseguire diverse tipologie di test come quelli appena menzionati sfruttando le risorse a disposizione, e cominciamo da qui: cos\u0026rsquo;è un test plan e come si configura!\n Cos\u0026rsquo;è un test plan  È l\u0026rsquo;oggetto con cui è possibile specificare le impostazioni generali del test che andremo a effettuare in modo da delineare i passaggi che desideri che JMeter esegua.\n Solitamente è composto da diversi componenti, che permettono di compiere diverse tipologie di attività: request HTTP o HTTPS, estrazione di informazioni da una response, misurazioni sui tempi di risposta, e molto altro.\n Configurare un test plan  Segui questi step per configurare un test plan con JMeter: tieni presente di default, quando apri JMeter nella sua versione GUI, ti mostra Test Plan vuoto, che puoi utilizzare per iniziare a lavorare.\n Aggiungi un Thread Group  Fai clic con il pulsante destro del mouse sul test plan e fai clic su Add-\u0026gt; Threads (Users) -\u0026gt; Thread Group.\n Creazione del gruppo di thread\n  Il Thread Group è il contenitore che contiene la logica di come simulare l\u0026rsquo;utente o il thread.\n  Per rendere di più l\u0026rsquo;idea, al suo interno andremo a specificare come e in cosa consiste il nostro test: quali sono le request da eseguire, se ci sono delle variabili che dovremo passargli, se mostrare degli output e come salvarli.\n Se ci clicchiamo sopra, noteremo che ci sono diversi campi che possiamo andare a riempire, e ognuno di questi ha un diverso scopo.\n Configurazione del Thread Group\n Parliamo delle impostazioni nel pannello Thread Group.\n Action to be taken after a sample error. Se si verifica un errore durante l\u0026rsquo;esecuzione del test, è possibile far sì che il test esegua una delle seguenti operazioni:\n  Continue: porta avanti l\u0026rsquo;esecuzione; Start Next Thread Loop: passa al prossimo thread group (se presente); Stop Thread: interrompi l\u0026rsquo;esecuzione del thread; Stop Test: interrompi il test; Stop Test Now: interrompi il test in maniera forzata.  Number of Threads  Rappresenta il numero di thread simulati durante il test, o anche di utenti virtuali. Questo vuol dire che se specifichiamo un valore pari a 100, JMeter simulerà 100 utenti che eseguono le operazioni descritte all\u0026rsquo;interno del thread group come fossero persone reali.\n Ramp-up period (seconds)  Quanto tempo occorre per raggiungere il numero di thread specificato. Ad esempio, se ho specificato 100 utenti virtuali (number of threads) e specifico 100 secondi come ramp-up, JMeter creerà un utente virtuale ogni secondo.\n Loop Count  Il numero di iterazioni di cui JMeter andrà ad eseguire il thread group. Questo vuol dire che se inserisco un valore pari a 10, andrà ad eseguire tutto quello che è descritto all\u0026rsquo;interno del thread group per 10 volte!\n Nella figura seguente viene mostrato un esempio.\n In questo caso, il significato di questo thread è che se ci sono 100 thread (ovvero il numero di thread), verranno suddivisi per il periodo di ramp-up : ogni secondo, un nuovo utente invierà una richiesta e lo script completo verrà eseguito due volte.\n Esempio di configurazione di un thread group\n Oltre alle proprietà viste prima, abbiamo anche altre configurazioni che è possibile fare all\u0026rsquo;interno del thread group: ad esempio, possiamo scegliere di simulare uno stesso utente all\u0026rsquo;interno del thread group, oppure di usarne diversi.\n In che modo? Quando selezioni la casella \u0026ldquo;Same user on each iteration\u0026rdquo; e utilizzi il componente di configurazione HTTP Cookie Manager, i cookie che ottieni nella prima risposta verranno utilizzati per le request seguenti.\n Se la casella di controllo \u0026ldquo;Same user on each iteration\u0026rdquo; è deselezionata, i cookie non verranno utilizzati per le richieste successive, così da simulare utenti diversi!\n Inoltre, possiamo definire i dettagli della durata temporale del test, se vogliamo che questo abbia una durata stabilita, e lo facciamo valorizzando i campi Duration e Startup delay, se vogliamo che il test inizi con un certo ritardo (in secondi) prima di ogni periodo di ramp-up.\n Creare una request HTTP  A questo punto facciamo clic con il pulsante destro del mouse sul thread group e quindi selezioniamo Add -\u0026gt; Sampler -\u0026gt; HTTP Request.\n Creazione della request HTTP\nL\u0026rsquo;oggetto HTTP Request fa parte di quelli che si chiamano campionatori (o Sampler): questi consentono a JMeter di inviare tipi specifici di richieste a un server e simulano una richiesta dell\u0026rsquo;utente per una pagina dal server di destinazione.\n Clicchiamo sull\u0026rsquo;oggetto appena aggiunto e proviamo a vederne il funzionamento con un esempio di una request GET a https://httpbin.org.\n Configurazione della request HTTP\n Come tutti gli oggetti presenti in JMeter, abbiamo la possibilità di specificare un nome per quella risorsa, di modo che sia più parlando: una buona convenzione può essere quella di rinominare la request HTTP usando una sintassi del tipo: [GET-POST-PUT-ecc.]-[REQUEST].\n Abbiamo a disposizione anche una sezione per aggiungere dei commenti o una descrizione più parlando della nostra request in maniera testuale.\n Notiamo poi due pannelli, chiamati Basic e Advanced: nel primo, abbiamo la possibilità di configurare una request HTTP/S di base, specificando il protocollo, l\u0026rsquo;hostname o l\u0026rsquo;indirizzo IP, la porta e altre informazioni visibili nella figura precedente.\n In questo caso, è stato utilizzato il protocollo HTTPS per il sito https://httpbin.org, il quale utilizza la porta 443 (porta HTTPS predefinita, quindi può essere omessa).\n Andiamo ad eseguire una semplice GET, ossia una richiesta che ci permette di ottenere la pagina principale del sito, dal momento che come path specifichiamo semplicemente \u0026ldquo;/\u0026rdquo;.\n Nella sezione sottostante abbiamo anche la possibilità di aggiungere parametri, un body o anche dei file, proprio come avverrebbe anche utilizzando un altro tool come Postman o il browser.\n Aggiungere un listener  Per mostrare l\u0026rsquo;esecuzione del nostro test plan, possiamo andare ad aggiungere un componente chiamato listener.\n Quando eseguiamo un test plan, la parte più importante consiste nell\u0026rsquo;analizzare le risposte del server in varie forme e quindi analizzare i dati forniti in output.\n  I Listener forniscono una rappresentazione grafica dei dati raccolti da JMeter su quei casi di test descritti all\u0026rsquo;interno del thread o del test plan.\n  Questo facilita l\u0026rsquo;utente nella visualizzazione dei risultati prodotti grazie ad una rappresentazione tramite tabelle, grafici, XML o testo semplice.\nI listener possono essere aggiunti in qualsiasi punto del test, anche direttamente nel test plan come risorsa globale per uno o più thread.\n Un listener raccoglierà solo dati dagli elementi al suo livello o al di sopra, e non da quelli che seguono. Questo vuol dire che se un listener viene aggiunto allo script come elemento figlio, mostrerà solo i dati relativi al suo genitore.\n Se un listener viene aggiunto in un thread group di un test plan che ne ha diversi, quel listener visualizzerà i dati di tutte le risorse che appartengono a quel solo thread group.\n Proviamo ad esempio ad utilizzare View Results Tree per vedere i risultati dopo aver eseguito la nostra richiesta al sito di httpbin.\n Facciamo quindi clic con il pulsante destro del mouse sul thread group e quindi selezioniamo Add -\u0026gt; Listener -\u0026gt;View Results Tree.\n Listener View Results Tree\n A questo punto, possiamo andare ad eseguire il nostro primo test plan: clicchiamo sul tasto verde in alto e procediamo!\n  Esempio di visualizzazione dei risultati\n I listener consentono di vedere i risultati e le richieste eseguite con una serie di informazioni molto importanti: intanto, notiamo come la request HTTP sia andata a buon fine grazie al simbolo di colore verde che ne indica il successo.\n Se vi clicchiamo sopra, vedremo il dettaglio dei dati raccolti: oltre alle informazioni sulla request, come il codice HTTP di risposta, il messaggio e il tipo di content-type, abbiamo la possibilità di vedere la request (tramite il pannello request) e la risposta (tramite il pannello response).\n Esempio di request del listener View Results Tree\n All\u0026rsquo;interno della request possiamo, ad esempio, vedere il body della request e anche gli headers; questo ci torna particolamente utile se vogliamo controllare se eventuali headers o cookie siano stati impostati correttamente.\n Esempio di response del listener View Results Tree\n Nella sezione response possiamo vedere la risposta restituita, che in questo caso è una pagina HTML. Potremmo utilizzare lo stesso test plan anche per testare delle API che restituiscono dei JSON come risposta!\n Tieni presente JMeter memorizza tutte le request e le response ricevute.\n  Se l\u0026rsquo;articolo ti è piaciuto o ti è tornato utile, condividi o lascia un commento!\n ", "url": "https:\/\/theredcode.it\/apache\/cose-un-test-plan\/" }, "https:\/\/theredcode.it\/tags\/machine-learning\/": { "title": "machine-learning", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/machine-learning\/" }, "https:\/\/theredcode.it\/nlp\/nlp-e-machine-learning\/": { "title": "NLP e Machine Learning", "tags": ["intelligenza-artificiale","machine-learning","nlp",], "content": "Nell\u0026rsquo;analisi del linguaggio naturale vengono impiegati di frequente diversi algoritmi di machine learning. Quali sono quelli più comuni? Quali le differenze e gli utilizzi?\n Vediamo in questo articolo una breve introduzione al NLP e Machine Learning!\n Algoritmi di machine learning  Gli algoritmi di machine learning normalmente appartengono a tre grandi \u0026ldquo;famiglie\u0026rdquo;: esistono quelli che eseguono attività di classificazione, di regressione e infine di clustering.\n Quelli maggiormente utilizzati per l\u0026rsquo;analisi dei testi sono ad esempio le reti neurali, gli alberi decisionali, le macchine a vettori di supporto, K-Means e K-NN.\n Ognuno di questi appartiene ad una famiglia diversa: K-Means, per esempio, è un algoritmo di clustering, quindi permettono di raggruppare diversi dati che nono stati precedentemente \u0026ldquo;etichettati\u0026rdquo;.\n Questa tipologia di algoritmo permette di definire delle strategie di marketing che analizzino un certo target di clienti e la sua evoluzione, come avviene all\u0026rsquo;interno del processo di segmentazione.\n K-NN permette invece di calcolare la similarità e quindi la distanza tra due vettori, come possono essere due array di testi, e appartiene agli algoritmi di classificazione.\n I metodi di classificazione hanno come scopo quello di etichettare e quindi assegnare una o più parole chiave ad un documento, come avviene in un filtro spam.\n In ambito data mining e text mining ci sono diverse attività che possiamo assolvere con l\u0026rsquo;ausilio di algoritmi di machine learning: ad esempio, categorizzare dei testi, identificare un autore, identificare la lingua utilizzata nel testo o analizzare il sentiment.\n Ma qual è la differenza tra questi due campi?\n Text Mining vs Data Mining  Spesso si ha l\u0026rsquo;impressione che queste due tipologie di attività coincidano: la realtà è che il primo spesso opera con dati non strutturati, che quindi richiedono degli step in più non essendo elaborati, mentre il secondo si occupa di estrarre i dati da diverse fonti.\n  Il data mining è invece il processo di ricerca di modelli ed estrazione di dati utili da grandi set di dati.\n  Questo campo è utilizzato per convertire dati grezzi in dati utili.\n Il data mining può essere estremamente utile per migliorare le strategie di marketing di un\u0026rsquo;azienda poiché con l\u0026rsquo;aiuto di dati strutturati possiamo studiare i dati da diversi database e quindi ottenere idee e strategie che ci permettano di aumentare la produttività di un\u0026rsquo;azienda.\n Il text mining in particolare è un campo multi-disciplinare che coinvolge diverse branche e che porta a diverse tipologie di attività: ad esempio, al suo interno esistono delle macro-categorie come l\u0026rsquo;information retrieval, l\u0026rsquo;information extraction e soprattutto il natural language processing.\n  Il text mining è una branca del data mining e prevede quindi l\u0026rsquo;elaborazione dei dati da vari documenti di testo.\n  Attività dell\u0026rsquo;Information retrieval\n NLP e Machine Learning  Come visibile nella figura precedente, nell\u0026rsquo;ambito del text mining abbiamo la branca del natural language processing: le tecniche utilizzate sono normalmente analisi lessicale, sintattica e semantica.\n In generale, questa tecnica, si focalizza sul concetto di bag of words: un testo o un documento viene analizzato sulal base delle parole che lo compongono, individuando parole chiave che ne permettano un\u0026rsquo;analisi con diversi scopi.\n I dati utilizzati in questo ambito hanno le applicazioni più disparate: si passa dalla customer experience, fino all\u0026rsquo;ambito assicurativo, finanziario e di marketing.\n E quali dati vengono utilizzati per queste attività? I dati vengono estratti principalmente da blog, articoli, ma soprattutto commenti e recensioni su diverse tipologie di siti online, così come i questionari.\n Arriviamo però al cuore di questo articolo: come sfruttare NLP e machine learning per diverse tipologie di problemi: vediamo alcuni esempi pratici delle sfide alle quali un data scientist dovrà rispondere.\n Un problema comune è il raggruppamento di documenti simili tra loro, che è traducibile come un\u0026rsquo;attività di clustering: in questo caso, un algoritmo come k-means è sicuramente indicato.\n Nel caso in cui sia necessario etichettare dei documenti in base a dei termini specifici, oppure analizzare il sentiment di un documento o ridurne la dimensione, abbiamo a che fare con problemi di classificazione.\n Per questa tipologia di attività, possiamo utilizzare diversi algoritmi come Naive-Bayes, alberi di decisione, reti neurali o anche la regressione.\n E se dovessimo scoprire l\u0026rsquo;argomento principale di una raccolta di documenti?\n In questo caso, si tratta di topic model e un algoritmo che possiamo usare è LDA, ossia un algoritmo che usa il modello bayesiano per individuare il contesto di cun documento, molto utilizzato in ambito SEO, o anche dei dizionari ad hoc per la lingua utilizzata.\n Non meno importante, nell\u0026rsquo;ambito dell\u0026rsquo;analisi dei link per il web mining, abbiamo un problema molto simile alla social network analysis, perché permette di analizzare e individuare relazioni tra diversi oggetti in un gruppo sociale.\n In questo caso, abbiamo moltissimi algoritmi diversi a seconda dello scopo specifico: tra i più famosi c\u0026rsquo;è sicuramente PageRank, che assegna un peso ad ogni elemento presento in un insieme di documenti collegati.\n Da non sottovalutare gli alberi di decisione, che rappresenta uno strumento perfetto trattandosi di un processo gerarchico che ben rappresenta la rete che si crea grazie a link connessi tra loro.\n Altre opzioni sono sicuramente Naive-Bayes, macchine a vettori di supporto e reti neurali, tutti algoritmi che si prestano bene a dataset lineari e non così come lo sono i dati estratti con il web mining.\n  Se questo articolo ti è piaciuto, non dimenticare di condividerlo!\n  Risorse utili Analisi del linguaggio naturale con Python - Apogeo Editore  ", "url": "https:\/\/theredcode.it\/nlp\/nlp-e-machine-learning\/" }, "https:\/\/theredcode.it\/design-dev\/cose-il-framework-dsdm\/": { "title": "Cos\u0027è DSDM", "tags": ["agile","design","dsdm","ingegneria-del-software",], "content": "Nello scorso articolo abbiamo parlato del framework AgilePM rispetto ad altre metodologie e di quando è possibile adottarla.\n Abbiamo anche detto che AgilePM è un sottoinsieme del framework più comune DSDM: ma cos\u0026rsquo;è e come funziona?\n In questo articolo parliamo di cos\u0026rsquo;è DSDM, come funziona e quali sono i principi fondamentali su cui si basa.\n Cos\u0026rsquo;è  DSDM sta per Dynamic Systems Development Method ed è chiaramente una metodologia agile distribuita gratuitamente dal consorzio DSDM ai propri membri, fondato nel 1994.\n La metodologia DSDM è spesso rappresentata come un piccolo tempio: il valore maggiore da portare al business si ottiene se i progetti sono sempre allineati con gli obiettivi, con rilasci frequenti, con motivazione e con il potere decisionale che permetta di prendere decisioni sia dal punto di vista tecnico che gestionale.\n La sua filosofia si basa su quattro pilastri: Process, People, Products e Practices, che sono anche le colonne portanti del tempo; alla base, ci sono il senso comune e il pragmatismo, volti all\u0026rsquo;utilizzo di una conoscenza generica e non specifica e soprattutto all\u0026rsquo;essere pratici.\nCos\u0026rsquo;è DSDM e come rappresentarlo con un tempio\n Il processo si riferisce al lifecycle e rappresenta le fasi del metodo -che è comunque rigoroso- in cui ognuna delle sei fasi ha dei nomi ben precisi. Il processo può essere adattato anche in situazioni più complesse, e ci sono fasi che possono ripetersi e che possono semplificarsi.\n Non si tratta solo del processo in sé, ma anche di tutto quello che c\u0026rsquo;è prima e dopo (detto anche pre-project e post-project).\n  Se dovessimo quindi riferirci a questo principio, utilizzeremmo l\u0026rsquo;avverbio quando: qual è la fase giusta per questa iterazione?\n (quasi) inutile dirlo: persone si riferisce al fatto che all\u0026rsquo;interno di un progetto agile ci sono diverse persone che appartengono a diversi team e quindi hanno diversi livelli di gestione e di competenze.\n  La domanda giusta in questo caso risponde all\u0026rsquo;avverbio chi: chi ha determinate responsabilità?\n Parlando di prodotti, questi non sono da intendersi come i deliverable del progetto, ma piuttosto rappresentano i documenti e sono gli strumenti gestionali e quindi prodotti di management.\n  Se abbiamo quindi bisogno di informazioni e di risultati concreti, e vogliamo rispondere al cosa, facciamo riferimento ai prodotti.\n  L\u0026rsquo;ultimo pilastro sono le pratiche nel senso di tecniche che abbiamo a disposizione per gestire il nostro progetto secondo il framework AgilePM, e queste sono in totale cinque.\n La domanda da porsi in questo caso usa l\u0026rsquo;avverbio come: come gestisco questa fase del processo? Quale pratica adottare?\nPiccolo spoiler: la prima di queste tecniche è MoSCoW ed è la pratica basata sul concetto di priorità; un\u0026rsquo;altra è la TimeBoxing, ossia andare a ritagliare il progetti in tanti piccoli intervalli temporali, mai troppo corta o troppo lunga.\n Poi c\u0026rsquo;è Modelling (o modelizzazione) che consiste nell\u0026rsquo;usare dei modelli per fornire una visualizzazione più chiara del progetto; c\u0026rsquo;è l\u0026rsquo;Iterative Development e la cosa interessante è che questa si trovi all\u0026rsquo;interno di una metodologia come AgilePM anche quando non stiamo realmente sviluppando codice.\n Infine c\u0026rsquo;è la Facilitated Workshop, ossia uno o più incontri per trattare gli aspetti più importanti e più formali del progetto che necessitano della presenza di un mediatore che aiuta a coordinare le attività che che faccia da moderatore.\nVariabili di un progetto: come gestirle  Tutta la filosofia che c\u0026rsquo;è dietro a queste metodologie necessita di una visione comune degli obiettivi, di collaborazione, e soprattutto di accettare che il cambiamento è inevitabile e che tutte le persone coinvoltenel progetto sono necessarie nel processo decisionale.\n Rispetto all\u0026rsquo;approccio tradizionale, dove il cliente parte fin dall\u0026rsquo;inizio qual è lo scope del progetto e i relativi dettagli, requisiti, deliverable e funzionalità, nell\u0026rsquo;approccio DSDM si prendono la qualità, il tempo e i costi e si trasformano in costanti.\n Come visibile nella figura seguente, nell\u0026rsquo;approccio DSDM la qualità è il cuore pulsante di un progetto: il tempo e il costo sono ad essa strettamente legati e sono costanti fisse, mentre le funzionalità sono le vere variabili, che evolvono e cambiano con il tempo.\n Nell\u0026rsquo;approccio tradizionale, abbiamo l\u0026rsquo;inverso: tutto ciò che quindi riguarda le specifiche, le funzionalità e via dicendo sono tutti aspetti che variano e quindi sono quelle che guidano i progetto: le restanti proprietà sono variabili, e dipendono da moltissimi fattori.\n  Differenze tra approccio tradizionale e DSDM\n Ricordiamo un aspetto importantissimo: per la buona riuscita di un progetto è fondamentale che tutti concordino sul metodo utilizzato e che lo conoscano nel dettaglio, ed è fondamentale che i requisiti a livello macroscopico siano definiti.\n Ma quali basi utilizza DSDM e quali sono i suoi principi fondamentali?\n Principi DSDM  Questo approccio si basa su 8 principi ben distinti e riportati nella figura seguente: il primo gruppo (a sinistra) servono a capire cosa dovrò andare a consegnare, mentre gli altri sulla destra rappresentano il come dovrò andare a consegnare.\n Principi DSDM\n  Questi principi devono essere sempre validi, perché sono raccomandazioni e quindi vanno bene per qualsiasi progetto e qualsiasi circostanza!\n Ma partiamo dall\u0026rsquo;inizio: il primo principio si basa sul fatto che la ownership è sempre del cliente, quindi spetta a lui decidere quali sono o meno le esigenze, ed è l\u0026rsquo;aspetto su cui dovremo concentrarci maggiornamente.\nIl secondo principio dice che bisogna sempre consegnare in tempo e quindi ogni volta che pensiamo ad una scadenza, quella dev\u0026rsquo;essere rispettata e soprattutto rispettabile; questo vale non solo per la scadenza finale del progetto, ma anche quella dei singoli step del progetto.\nNel terzo principio di parla di collaborazione: questa è fondamentale per la buona riuscita del progetto e riguarda la collaborazione tra tutti gli attori del processo, non solo tra i singoli team.\nL\u0026rsquo;ultimo principio a sinistra, e quindi il quarto, è molto chiaro: qualsiasi sia l\u0026rsquo;obiettivo del progetto o della singola fase, questa dovrà avere la miglior qualità possibile.\nPassiamo ai principi posti sulla destra e partiamo con il quinto: in questo caso si parla di come lavorare per fasi incrementali.\n Ogni progetto DSDM possiede delle fasi iniziali che richiedono come primo step una fase di fattibilità del prodotto; dopodiché vengono definite le fasi (o incrementi) del progetto che portano al rilascio finale.\n L\u0026rsquo;avvio del progetto rappresenta la prima foundation e, ogni volta che stiamo per cambiare incremento, si riparte dalla fase di foundation. Questo vuol dire ricontrollare nei documenti iniziali di fattibilità l\u0026rsquo;andamento del progetto e foundation rappresenta proprio una fase su cui ripasso più volte (questa fase sarà chiarita nei prossimi articoli!).\n Nello sviluppo iterativo -sesto principio- si ha un modo di lavorare per cui si cerca di portare avanti un\u0026rsquo;attività per piccoli cicli, raccogliendo più feedback possibili e facendo i giusti test (anche delle review o dei controlli formali o informali sono certamente utili allo scopo).\nGli ultimi due principi descrivono il tipo di interazione continua che ci dev\u0026rsquo;essere con il cliente, che consiste in una comunicazione costante e chiara -settimo principio.\n Infine, nell\u0026rsquo;ultimo principio e quindi l\u0026rsquo;ottavo, invece di seguire un approccio comando-controllo, in cui si gestisce e comanda dall\u0026rsquo;alto, si cerca di non fare pressione sulle persone coinvolte né di usare delle metriche per misurare le performance delle stesse, favorendo un controllo ove necessario.\n Ad esempio, il team che sviluppa si dovrebbe incontrare ogni giorno (attraverso degli stand-up meeting, ad esempio) e raccontare quello che hanno fatto ogni giorno; qui il Project Manager non deve assumere il controllo, ma può piuttosto partecipare solo come osservatore, proprio perché questi incontri sono fatti dal team di sviluppo per il team di sviluppo.\n Questo principio serve a ricordare che l\u0026rsquo;utilità del PM è nel gestire situazioni in cui ci sono problemi o contrasti che devono essere sanati e/o mediati.\n  Se sei curioso/a di sapere come lavora un Project Manager, leggi qui l\u0026rsquo;intervista!\n I principi appena descritti sono necessari al mindset di tutto il team, e quindi non sono solo per il PM, ma per tutti gli attori del progetto.\n Ogni membro del team deve essere incoraggiato a parlare e il PM per questo ha, per esempio, un questionario a disposizione che permette di capire se le persone che fanno parte del team hanno compreso tutto e sanno applicare questi principi.\nChiavi del successo  Nella scorsa puntata abbiamo già accennato al fatto che questo metodo non deve e non può essere adottato in qualsiasi progetto: infatti, un buon PM è tenuto a controllare i rischi di un progetto ed eventualmente cambiare \u0026ldquo;rotta\u0026rdquo; o framework qualora ci siano delle incompatibilità con il progetto.\n  Ma quali sono le chiavi del successo di questo metodo?\n  Il primo è che se questo approccio, ove adottato, vale per tutti e che viene concordato da tutti, questo garantisce la buona riuscita di un progetto, che ha quindi come base una \u0026ldquo;lingua\u0026rdquo; comune su cui sono tutti d\u0026rsquo;accordo.\n Il secondo fattore è stabilire e coinvolgere le giuste persone, scegliendole per motivazione, stabilità e competenze condivise: un team solido è fondamentale per qualsiasi progetto.\n Altro fattore è avere un business coinvolto attivamente e durante tutto il processo: il cliente dev\u0026rsquo;essere partecipe durante l\u0026rsquo;intero processo e fornire quanti più feedback possibili, affinché il risultato sia quello sperato e desiderato.\n In questo senso, lo sviluppo iterativo e un delivery incrementale con testing continuo sono ancor più di sostegno, perché consentono dei piccoli rilasci che mostrano le singole fasi di lavoro e quindi dei prodotti parziali della soluzione finale che possono essere lavorati ed elaborati.\n Ultimo, ma non ultimo, la trasparenza: più si riesce ad essere chiari e più la comunicazione è trasparente, anche attraverso l\u0026rsquo;utilizzo di strumenti di condivisione, più l\u0026rsquo;intero processo è efficace e trasparente.\n  Nella prossima puntata, vediamo i ruoli e le responsabilità delle persone all\u0026rsquo;interno di un progetto DSDM!\n  Risorse utili \u0026ldquo;DevOps\u0026rdquo; di Fabio Mora - Apogeo Editore Corso di Metodologia AgilePM I principi di DSDM e AgilePM ", "url": "https:\/\/theredcode.it\/design-dev\/cose-il-framework-dsdm\/" }, "https:\/\/theredcode.it\/tags\/aws\/": { "title": "aws", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/aws\/" }, "https:\/\/theredcode.it\/categories\/aws\/": { "title": "aws", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/aws\/" }, "https:\/\/theredcode.it\/aws\/creare-un-sito-wordpress-con-aws-lightsail\/": { "title": "Creare un sito Wordpress con AWS Lightsail", "tags": ["aws","hosting","lightsail","wordpress",], "content": "Hai bisogno di creare un sito, ma non vuoi perdere tempo a configurare l\u0026rsquo;hosting o spendere una fortuna?\n Da qualche tempo, AWS ha messo a disposizione un servizio perfetto per le esigenze più disparate: hosting di un sito con Drupal? Blog con Django? Stack LAMP pronto all\u0026rsquo;uso? Tutto pronto con AWS Lightsail!\n In questo articolo, vediamo come creare un sito Wordpress con AWS Lightsail!\n AWS Lightsail: cos\u0026rsquo;è  Questo servizio nasce dall\u0026rsquo;esigenza di creare e avviare applicazioni Web super semplici, sfruttando degli stack tecnologici molto comuni: tra i citati ci sono LAMP, Nginx, MEAN e Node.js, o anche diversi CMS come Wordpress, Joomla o Drupal, che ti permettono di mettere online il tuo sito rapidamente e soprattutto facilmente.\n Non solo: se hai bisogno di creare degli ambienti di test senza la necessità di mettere in piedi delle macchine virtuali e quindi sovraccaricare a livello di risorse il tuo PC, hai la possibilità di scegliere diverse istanze che prevedono sistemi operativi Unix-like tra i più comuni.\n Avrai così degli ambienti di test in un tempo (quasi) zero dove puoi provare le tue nuove idee, senza correre alcun rischio!\n E il costo? Il costo rimane bassissimo, ma lo vedremo a breve!\n Amazon Lightsail\n Procedimento  Login alla console AWS  Per poter usufruire dei servizi AWS è necessario registrarsi: per farlo, puoi cliccare su questo link e seguire la procedura guidata, che ti permetterà di registrarti tramite il tuo indirizzo e-mail e usufruire subito dei servizi di AWS. Inoltre, per il primo anno (e non solo) è possibile avere a disposizione diversi servizi in forma totalmente gratuita: qui trovi tutti quelli che rientrano in questa iniziativa!\n Pagina di registrazione ad AWS\n Configurazione dell\u0026rsquo;istanza  Una volta loggati, potremo usufruire dei diversi servizi che Amazon ci mette a disposizione, a partire da AWS Lightsail: cerchiamo quindi questo servizio nella barra di ricerca e ci clicchiamo, come mostrato in figura:\n Servizio Amazon Lightsail\n Una volta dentro il servizio, ci verrà mostrata la pagina principale di Lightsail:\n Lightsail funziona sulla base del concetto di istanza: questi sono delle macchine con delle librerie, pacchetti e sistemi operativi già pronti all\u0026rsquo;uso che possiamo avviare nel giro di meno di un minuto.\n Panoramica di Lightsail\n Per avviare la nostra prima istanza, clicchiamo su \u0026ldquo;Create Instance\u0026rdquo; e seguiamo step-by-step la guida: il primo passo è quello di scegliere la zona di disponibilità e la tipologia di sistema operativo che vogliamo utilizzi l\u0026rsquo;istanza.\n In questo caso, scegliamo Parigi o Francoforte e come OS scegliamo Linux/Unix:\n Creazione di un\u0026rsquo;istanza su Lightsail\n Le blueprint non sono altro che dei servizi AWS testati e validati direttamente dal team di Amazon che utilizzano applicazioni di terze parti e che rappresentano delle istanze pronte all\u0026rsquo;uso con i servizi più comuni.\n Siccome noi vogliamo creare un sito Wordpress, andiamo a selezionare la prima voce che avvierà un\u0026rsquo;istanza con Wordpress versione 5.9.2-3.\n Tra le opzioni, vediamo che è anche possibile creare un Wordpress multi-sito, in pochi e semplici click! ;)\n  Scelta di una blueprint su Wordpress con AWS Lightsail\nA questo punto, è tempo di scegliere la dimensione dell\u0026rsquo;istanza: come vediamo nella figura seguente, sono presenti diversi sizing che possiamo utilizzare.\n Le prime tre istanze hanno dei costi molto bassi e le risorse che mettono a disposizione sono più che sufficienti per un sito Wordpress base o un blog: con il taglio più piccolo abbiamo infatti inclusi anche 20GB di storage in SSD e 1TB di trasferimento dati.\nScelta del tipo di istanza su AWS Lightsail\n In più, i primi 3 mesi sono totalmente gratis: questo vuol dire che possiamo avviare un\u0026rsquo;istanza, provarla e se non ci piace, buttarla via!\n Procediamo quindi con la configurazione: ci sono diverse opzioni che ci permettono di rendere resiliente il nostro ambiente, ma per il momento possiamo lasciare le impostazioni di default.\n L\u0026rsquo;ultimo step prevede la scelta di un nome per l\u0026rsquo;istanza: diamo un nome significativo alla nostra istanza, che può essere, ad esempio, il nome del blog o del sito che andremo a realizzare:\n Configurazione dell\u0026rsquo;istanza di AWS Lightsail\nClicchiamo su \u0026ldquo;Create instance\u0026rdquo; e attendiamo meno di un minuto. Una volta pronta, l\u0026rsquo;istanza appena avviata sarà visibile nella home:\n Riepilogo delle istanze attive su AWS Lightsail\n Per collegarci, sarà sufficiente utilizzare l\u0026rsquo;indirizzo IP assegnato e vedremo la pagina di benvenuto di Wordpress!\n Pagina iniziale di Wordpress con AWS Lightsail\n Per recuperare anche la password dell\u0026rsquo;utente user, è sufficiente accedere all\u0026rsquo;istanza ed eseguire il seguente comando:\n cat $HOME/bitnami_application_password   Nota: il sito sarà esposto in HTTP. Per installare i certificati sull\u0026rsquo;istanza, accedervi tramite un qualsiasi client SSH (ad esempio, tramite PuttY) ed eseguire il comando sudo /opt/bitnami/bncert-tool. Inserire le informazioni richieste, come il dominio e le redirezioni da HTTP a HTTPS_, et voilà_!\n  Tip   Migrazione di un sito su hosting qualsiasi a Lightsail  Come fare? Semplicissimo!\n Dopo aver seguito tutti gli step precedenti, andiamo ad installare il plugin di Wordpress All-in-One WP Migration sia sull\u0026rsquo;istanza attuale, sia sul sito sorgente: questo ci permetterà di esportare e importare il sito con pochi semplici click.\n In particolare, sarà sufficiente fare l\u0026rsquo;export con All-in-One-Migration e poi fare l\u0026rsquo;import sul Wordpress di cui abbiamo creato l\u0026rsquo;istanza in precedenza.\n Se la dimensione del tuo backup da importare supera gli 80MB, niente paura: sarà sufficiente modificare due file all\u0026rsquo;interno dell\u0026rsquo;istanza di arrivo di Lightsail come di seguito, e dovremo poi riavviare i servizi per far sì che le configurazioni vengano applicate correttamente.\n vi /opt/bitnami/php/etc/php.ini # set dei valori di upload che sono attualmente a 80M al valore necessario (esempio: 8G) vi /bitnami/wordpress/wp-config.php +++ @ini_set( \u0026#39;upload_max_filesize\u0026#39; , \u0026#39;8000M\u0026#39; ); @ini_set( \u0026#39;post_max_size\u0026#39;, \u0026#39;8008M\u0026#39;); @ini_set( \u0026#39;memory_limit\u0026#39;, \u0026#39;8000M\u0026#39; ); @ini_set( \u0026#39;max_execution_time\u0026#39;, \u0026#39;3000\u0026#39; ); @ini_set( \u0026#39;max_input_time\u0026#39;, \u0026#39;3000\u0026#39; ); sudo /opt/bitnami/ctlscript.sh status sudo /opt/bitnami/ctlscript.sh restart2  Risorse utili Documentazione Lightsail con Wordpress (inglese)  ", "url": "https:\/\/theredcode.it\/aws\/creare-un-sito-wordpress-con-aws-lightsail\/" }, "https:\/\/theredcode.it\/tags\/hosting\/": { "title": "hosting", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/hosting\/" }, "https:\/\/theredcode.it\/tags\/lightsail\/": { "title": "lightsail", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/lightsail\/" }, "https:\/\/theredcode.it\/tags\/wordpress\/": { "title": "wordpress", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/wordpress\/" }, "https:\/\/theredcode.it\/tags\/agilepm\/": { "title": "agilepm", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/agilepm\/" }, "https:\/\/theredcode.it\/tags\/framework\/": { "title": "framework", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/framework\/" }, "https:\/\/theredcode.it\/design-dev\/introduzione-al-framework-agilepm\/": { "title": "Introduzione al framework AgilePM", "tags": ["agile","agilepm","devops","dsdm","framework","ingegneria-del-software",], "content": "La metodologia AgilePM fornisce delle linee guida dettagliate su come gestire progetti agili seguendo un approccio strutturato e preciso, illustrando i principi, la filosofia, il ciclo di vita, i processi, le tecniche e le pratiche alla base del metodo Agile.\n In questa breve serie vedremo quali sono i concetti cardine di questa metodologia e quali sono le basi necessarie per comprendere al meglio questa metodologia, parlando degli strumenti, dei ruoli, delle responsabilità e dei controlli necessari al successo dei progetti, comprendendone le modalità di applicazione, i benefici e i punti di attenzione.\n Partiamo con l\u0026rsquo;introduzione al framework AgilePM!\n DSDM e AgilePM Somiglianze e differenze  Molto spesso vi capiterà di leggere DSDM accanto ad AgilePM: DSDM sta per Dynamic Systems Development Method ed è chiaramente una metodologia agile distribuita gratuitamente dal consorzio DSDM ai propri membri, fondato nel 1994.\n C\u0026rsquo;è una differenza fondamentale tra DSDM e gli altri metodi Agile di prima generazione: questi ultimi sono stati tutti progettati per piccoli progetti con un team, mentre DSDM è stato originariamente progettato per supportare progetti più grandi con più team.\n Per sua natura, DSDM è più sofisticato di altri metodi di prima generazione; infatti DSDM è anche molto ben strutturato e chiaro, ispirato a PRINCE2® e ad altri metodi consolidati che sono stati creati prima di loro. In altre parole, non ha cercato di reinventare la ruota, ma piuttosto di mettere in piedi delle basi solide e definite.\n DSDM si basa completamente su una filosofia ben formata e su un insieme di principi. Questi hanno avuto un impatto significativo sulle metodologie agili, e in particolare sui principi alla base del Manifesto Agile.\n DSDM costruisce una metodologia completa attorno alla sua filosofia. Questa metodologia prevede un processo con più fasi che possono essere organizzate in modi diversi per creare vari tipi di ciclo di vita.\n  Non a caso, la metodologia AgilePM nasce come un sottoinsieme del framework DSDM Agile Project. Quando parliamo di metodi agili, infatti, parliamo non di una metodologia, ma di uno stile di lavoro.\n  In questo, Agile è diverso da Scrum in quanto rappresenta un insieme di metodi e di caratteristiche comuni a tutti i metodi cosiddetti agili, che sono composti dalla necessità di creare un ambiente flessibile e lavorare fianco a fianco con il cliente dall\u0026rsquo;inizio alla fine di un progetto.\n Questo significa che ci sono feedback continui, c\u0026rsquo;è spesso un confronto diretto, il quale dovrebbe risolvere i problemi giorno dopo giorno.\n Significa anche rimandare le decisioni di dettaglio all\u0026rsquo;ultimo, perché non bisogna paralizzarsi sull\u0026rsquo;analisi di progetto all\u0026rsquo;inizio, ma concentrare le energie su un\u0026rsquo;analisi di alto livello per poter cominciare a lavorare subito e nel frattempo definire le specifiche man mano che si procede.\n Un concetto molto importante è far capire infatti al cliente che in un progetto Agile il ritorno dell\u0026rsquo;investimento non è immediato, ma si tratta di un passaggio graduale.\n  Ma in che modo tutti questi mondi e metodologie funzionano?\n  Metodi agili  Ognuna di queste metodologie copre una o più aree di competenza, andando a lavorare e definire diversi ruoli e diversi metodi di gestione: nella seguente figura, vediamo come AgilePM si occupi non solo di seguire lo sviluppo di un prodotto, ma anche di gestire un progetto e parzialmente un programma, inteso come portafoglio di progetti.\n DevOps e Scrum invece, sono metodologie che forniscono gli strumenti di lavoro per il rilascio di un prodotto e che danno indicazioni volte alla gestione di un progetto, soprattutto per quanto riguarda il lavoro in team e la comunicazione con il cliente finale.\n Se volessimo definire con ancora più chiarezza, framework come Scrum sono considerati di product development, mentre AgilePM o Prince2 sono metodi di project management.\n In questo senso, i due metodi non si escludono e spesso cooperano insieme: Scrum può dare delle indicazioni utili per gestire un progetto e permettere una flessibilità tale da adattarsi al cambiamento dello sviluppo di un prodotto, introducendo il concetto di progetto.\n AgilePM è perfetto per organizzare la gestione di un progetto e definirne le fondamenta.\n Scopi e campi di azione dei metodi agili\n Manifesto Agile  Il manifesto dello sviluppo software e rappresenta un documento a cui tutti i metodi agili fanno riferimento. I metodi sono 12 e tutte le persone coinvolte in un progetto agile devono rispettare questo manifesto.\n Principi del Manifesto Agile\n  Si tratta di un documento che nasce durante una vacanza in un resort sciistico nello Utah: le persone che ci hanno lavorato -17, per la precisione- avevano utilizzato diverse metodologie e volevano trovare un framework che fosse un\u0026rsquo;alternativa a quelli dove sono i documenti a governare il processo di sviluppo del software.\n Riprendendo la figura in alto, possiamo vedere come l\u0026rsquo;essere agile richieda di tenere in considerazione le frasi a sinistra in rosso: un contratto ci dev\u0026rsquo;essere, così come un processo, ma devo preferire la comunicazione che abbia degli incontri di persona rispetto alle mail.\n Oppure, dobbiamo preferire delle soluzioni che funzionano piuttosto che un manuale utente breve piuttosto che uno di 2000 pagine (secondo punto).\n In un progetto agile, inoltre (terzo punto), non è pensabile di eseguire la maggior parte del lavoro ed effettuare solo alla fine una review con il cliente: ci dev\u0026rsquo;essere un processo continuo con un feedback costante.\n Essere sempre pronti all\u0026rsquo;evoluzione di un prodotto è fondamentale, ancor più di onorare il processo definito in maniera iniziale: per questa ragione spesso non si vanno a definire i dettagli di un progetto agile, ma si preferisce un approccio più macroscopico al processo e alla soluzione finale.\nAgilePM o Scrum? Ma mentre queste regole valgono per qualsiasi progetto che adotti uno stile agile, quale metodo scegliere e perché?\n Le domande da porsi sono diverse e bisogna pensare anche che non sempre è possibile gestire un progetto con un metodo agile, ma bisogna valutare punti come la cultura aziendale, il background, il contesto del progetto, e via dicendo.\n Se la necessità è quella di gestire l\u0026rsquo;intero ciclo di vita di un progetto, definendo le persone, i prodotti, i processi e i metodi, allora AgilePM può essere una risposta.\n Se invece si vuole dare il focus ad un prodotto che può evolvere rapidamente e che dev\u0026rsquo;essere \u0026ldquo;cucito\u0026rdquo; addosso al cliente, Scrum è un metodo agile perfetto allo scopo.\n  Nella prossima puntata, vediamo la filosofia dietro DSDM e in che modo ognuno di questi principi ci guida lungo il ciclo di vita di un progetto!\n  Risorse utili \u0026ldquo;DevOps\u0026rdquo; di Fabio Mora - Apogeo Editore Corso di Metodologia AgilePM I principi di DSDM e AgilePM ", "url": "https:\/\/theredcode.it\/design-dev\/introduzione-al-framework-agilepm\/" }, "https:\/\/theredcode.it\/ionic\/come-funziona-il-routing-in-ionic\/": { "title": "Come funziona il routing in Ionic 6", "tags": ["angular","ionic-5","ionic-6","routing",], "content": " Una parte fondamentale dello sviluppo di app Ionic è configurare il routing e garantire una navigazione fluida tra le pagine.\n In questo articolo andiamo ad analizzare le differenze e diversi esempi di come sfruttare il routing in Ionic!\n Cos\u0026rsquo;è  Per spiegarne il funzionamento, facciamo riferimento agli strumenti messi a disposizione da Angular come l’oggetto Router, anche se molto dipende dalla tecnologia che usiamo insieme a Ionic.\n Angular fornisce il modulo RouterModule che contiene tutti gli strumenti di cui avremo bisogno per configurare la nostra applicazione in modo tale da mostrare una diversa view a seconda dell\u0026rsquo;indirizzo digitato nella barra del browser.\n Come funziona  Prima di continuare con la spiegazione, apriamo però un momento il file index.html presente nella cartella src di una qualsiasi app in Ionic, di cui qui riportiamo un esempio:\n \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34; /\u0026gt; \u0026lt;title\u0026gt;Ionic App\u0026lt;/title\u0026gt; \u0026lt;base href=\u0026#34;/\u0026#34; /\u0026gt; \u0026lt;meta name=\u0026#34;color-scheme\u0026#34; content=\u0026#34;light dark\u0026#34; /\u0026gt; \u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\u0026#34; /\u0026gt; \u0026lt;meta name=\u0026#34;format-detection\u0026#34; content=\u0026#34;telephone=no\u0026#34; /\u0026gt; \u0026lt;meta name=\u0026#34;msapplication-tap-highlight\u0026#34; content=\u0026#34;no\u0026#34; /\u0026gt; \u0026lt;link rel=\u0026#34;icon\u0026#34; type=\u0026#34;image/png\u0026#34; href=\u0026#34;assets/icon/favicon.png\u0026#34; /\u0026gt; \u0026lt;!-- add to homescreen for ios --\u0026gt; \u0026lt;meta name=\u0026#34;apple-mobile-web-app-capable\u0026#34; content=\u0026#34;yes\u0026#34; /\u0026gt; \u0026lt;meta name=\u0026#34;apple-mobile-web-app-status-bar-style\u0026#34; content=\u0026#34;black\u0026#34; /\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;app-root\u0026gt;\u0026lt;/app-root\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt;  Come possiamo notare dal frammento di codice riportato sopra, immediatamente dopo l\u0026rsquo;elemento è presente un elemento avente un attributo href impostato al valore \u0026rsquo;/\u0026rsquo;.\n Con questa proprietà andiamo ad indicare l\u0026rsquo;URL di base rispetto al quale sono relativi tutti i path utilizzati dell\u0026rsquo;applicazione e si tratta di un elemento necessario.\n Infatti nelle versioni di Angular successive alla 2 la strategia predefinita per comporre le route prende il nome contenuto in PathLocationStrategy e si avvale della History API per gestirne lo storico, ossia il meccanismo con cui gestire lo storico della sessione del browser.\n Se avessimo cambiato il valore dell\u0026rsquo;attributo href dell\u0026rsquo;elemento , per esempio , la pagina iniziale della nostra applicazione sarebbe stata mostrata partendo dall\u0026rsquo;indirizzo http://localhost:4200/la-mia-app/.\n Questo significa di conseguenza che tutti gli altri percorsi sarebbero stati automaticamente costruiti a partire dalla base fornita, e quindi per esempio http://localhost:4200/la-mia-app/my-route.\n Esempi  Creazione di una nuova pagina  Quando aggiungi una nuova pagina al tuo progetto Ionic, questa viene automaticamente aggiunta alla configurazione di routing all\u0026rsquo;interno di app-routing.module.ts, come visibile nella penultima riga della seguente immagine:\n Esempio di creazione di una pagina in Ionic\n Questo significa che potremo utilizzare la route definita all\u0026rsquo;interno del file di routing in qualsiasi altra pagina per navigarne il contenuto.\n Utilizzo di una pagina esistente  Puoi utilizzare la stessa pagina in più posizioni assicurandoti che esista un percorso per essa da tali posizioni.\n Ad esempio, se desideri che la pagina \u0026ldquo;Dettaglio\u0026rdquo; sia accessibile all\u0026rsquo;interno di Tab1 della tua applicazione e Tab2, devi avere una dichiarazione del path /detail nel router del file app-routing.module.ts sia per Tab1 che per Tab2.\n import { NgModule } from \u0026#39;@angular/core\u0026#39;; import { RouterModule, Routes } from \u0026#39;@angular/router\u0026#39;; const routes: Routes = [ { path: \u0026#39;detail\u0026#39;, component: DetailPage}, { path: \u0026#39;tab1\u0026#39;, component: Tab1Component}, ...  Utilizzare routerLink  Quando cerchiamo di andare verso un\u0026rsquo;altra pagina tramite un pulsante o un qualsiasi altro elemento, possiamo utilizzare la proprietà routerLink specificando la pagina o il percorso che deve portarci ad una pagina diversa.\n  Se questa istruzione non funzionasse e generasse un errore, assicurarati che il modulo RouterModule sia incluso nel modulo delle tue pagine!\n  Nell\u0026rsquo;esempio seguente, analizziamo un caso d\u0026rsquo;uso e facciamo in modo che l\u0026rsquo;utente venga rimandato alla pagina detail di un prodotto (e lo specifichiamo grazie all\u0026rsquo;ID dell\u0026rsquo;oggetto) quando clicca sull\u0026rsquo;elemento ion-item.\n \u0026lt;ion-item [routerLink]=\u0026#34;\u0026#39;/detail/\u0026#39; + item.id\u0026#34; routerDirection=\u0026#34;forward\u0026#34; \u0026gt;\u0026lt;/ion-item\u0026gt;  In questo modo, avvieremo DetailPage e le forniremo un parametro id route, che potremo anche utilizzare all\u0026rsquo;interno del componente.\n Questo è in qualche modo molto vantaggioso perché significa che non è sempre necessario impostare un\u0026rsquo;associazione di eventi e coinvolgere il NavController ogni volta che si desidera passare a un\u0026rsquo;altra pagina fornendo dei dati.\n Si noti inoltre che sempre nell\u0026rsquo;esempio forniamo un routerDirection per indicare se si tratta di una navigazione in avanti o indietro in modo che l\u0026rsquo;animazione di transizione dello schermo possa essere applicata correttamente.\n  Se questo non viene fornito, Ionic indovinerà quale animazione dovrebbe utilizzare, ma è meglio essere espliciti.\n  Analizziamo ora il file app-routing.module.ts:\n import { NgModule } from \u0026#39;@angular/core\u0026#39;; import { RouterModule, Routes } from \u0026#39;@angular/router\u0026#39;; const routes: Routes = [ { path: \u0026#39;\u0026#39;, component: HomeComponent }, { path: \u0026#39;saldi\u0026#39;, component: SaldiComponent }, { path: \u0026#39;sconti\u0026#39;, redirectTo: SaldiComponent }, { path: \u0026#39;not-authorized\u0026#39;, component: UnauthorizedComponent, }, { path: \u0026#39;not-found\u0026#39;, component: ErrorComponent, }, { path: \u0026#39;**\u0026#39;, redirectTo: \u0026#39;/not-found\u0026#39;, data: { title: \u0026#39;Pagina non trovata\u0026#39; } } ]; @NgModule({ imports: [ RouterModule.forRoot(routes) ], exports: [ RouterModule ], declarations: [] }) export class AppRoutingModule { }  Ciascun oggetto ha una proprietà path pari al percorso in corrispondenza del quale vogliamo venga mostrato un certo componente che indichiamo con la proprietà component.\n Nell\u0026rsquo;esempio ci sono poi degli oggetti leggermente diversi dagli altri. Notate infatti che nell\u0026rsquo;ultimo oggetto dell\u0026rsquo;array abbiamo assegnato il simbolo \u0026lsquo;**\u0026rsquo; alla proprietà path.\n Si tratta della cosiddetta wildcard route, una sorta di percorso jolly che intercetta qualsiasi URL.\n È bene sottolineare una proprietà importante da tenere in mente quando si definisce l\u0026rsquo;oggetto Routes: infatti l\u0026rsquo;ordine in cui vengono inseriti i diversi oggetti di tipo Route nell\u0026rsquo;array è rilevante!\n Il Router di Angular, dovendo decidere quale componente mostrare in corrispondenza di un certo percorso, inizia a scorrere l\u0026rsquo;array dal primo oggetto e si ferma non appena ne trova uno con una proprietà \u0026lsquo;path\u0026rsquo; che corrispone al percorso.\n Per questo motivo è necessario inserire l\u0026rsquo;oggetto avente la wildcard route come proprietà path alla fine dell\u0026rsquo;array altrimenti verrebbero individuati tutti i percorsi e verrebbe sempre mostrato il componente PageNotFoundComponent.\n Abbiamo poi usato nel file di routing un altro oggetto con una proprietà redirectTo che fa in modo di redirigere il browser all\u0026rsquo;indirizzo con percorso pari a \u0026lsquo;/saldi\u0026rsquo; ogni volta che si accede al percorso \u0026lsquo;/sconti\u0026rsquo;.\n Utilizzo di Router  Per navigare in modo programmatico attraverso le diverse pagine, è possibile utilizzare il Router standard di Angular nelle tue pagine e chiamando uno di questi metodi:\n ... this.router.navigateByUrl(\u0026#39;/login\u0026#39;); this.router.navigate([\u0026#39;/detail\u0026#39;, { id: itemId }]); ...  Il primo naviga in maniera puntuale verso una pagina ed è l\u0026rsquo;equivalente di routerLink, ma questo può essere utilizzato all\u0026rsquo;interno del file *.ts.\n  Per poterlo questa modalità di routing in Ionic, è necessario importarlo nel constructor del componente/servizio che utilizziamo!\n  class MyComponent { constructor(router: Router) { this.router.navigateByUrl(...); } }  La funzione navigate permette invece di creare un nuovo URL applicando quanto passato nell\u0026rsquo;array, con la possibilità di aggiungere dei parametri extra, come l\u0026rsquo;ID che viaggerà insieme all\u0026rsquo;indirizzo della route e potrà essere utilizzato nel componente di destinazione.\n Utilizzo di NavController  Il modo migliore per navigare a livello di codice in un\u0026rsquo;applicazione Ionic o Angular è utilizzare NavController.\n Questo è in realtà abbastanza simile al modo in cui avresti utilizzato il routerLink per navigare da una pagina all\u0026rsquo;altra specificando la direzione, tranne per il fatto che ora hai tutto all\u0026rsquo;interno di uno di questi metodi, come mostrato di seguito:\n this.navCtrl.navigateForward(\u0026#39;/my-route\u0026#39;); this.navCtrl.navigateBack(\u0026#39;/my-route\u0026#39;); this.navCtrl.navigateRoot(\u0026#39;/my-route\u0026#39;);  Il vantaggio dell\u0026rsquo;utilizzo di NavController per navigare è che consente di specificare una \u0026ldquo;direzione\u0026rdquo; per la navigazione attraverso la funzione, che aiuterà \u0026lt;ion-router-outlet\u0026gt; di Ionic a visualizzare correttamente la transizione della pagina.\n  Che viaggio quello nel mondo dei router!\n  Risorse utili Manuale Ionic in italiano Routing in Ionic nella doc ufficiale  ", "url": "https:\/\/theredcode.it\/ionic\/come-funziona-il-routing-in-ionic\/" }, "https:\/\/theredcode.it\/tags\/routing\/": { "title": "routing", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/routing\/" }, "https:\/\/theredcode.it\/interviste\/java-developer\/": { "title": "Voglio diventare un... Java Developer", "tags": ["interviste","voglio-diventare",], "content": "Claudio è un grande formatore ed esperto italiano nell\u0026rsquo;ambito Java, per cui quando ho pensato ad un\u0026rsquo;intervista a tema Java Developer, non potevo che scegliere lui!\n Che poi, di mestiere voleva fare lo scrittore, e in parte ci è anche riuscito\u0026hellip;\n Claudio De Sio Cesari oggi ci racconta come fare per diventare un Java Developer!\n Descriviti in 100 parole  Non mi piacciono le etichette, quindi ti racconto giusto qualcosa su di me.\n Leggo almeno mezz’ora ogni giorno, ho una pessima memoria, senza silenzio assoluto non riesco a concentrarmi, non mi arrabbio mai tranne che per le ingiustizie, non ho rispetto per chi non rispetta il prossimo, ho diverse abitudini decisamente ossessive.\n  33 anni fa mi sono imposto di imparare qualcosa di nuovo ogni giorno e di raggiungere un obiettivo importante ogni anno. Lavoro senza orari perché faccio solo quello che mi piace.\n  Non è mai tardi, ma se avessi potuto avrei voluto fare il musicista e/o lo scrittore.\n In cosa consiste il ruolo di Java Developer?  Risposta breve: un Java Developer riesce ad interpretare delle specifiche tecniche correttamente e a tramutarle in codice Java.\n In realtà un qualsiasi teenager con un minimo di passione, un po’ di talento e una conoscenza basilare dei principali costrutti di programmazione, può interpretare delle specifiche tecniche correttamente e a tramutarle in codice Java.\n Il lavoro di Java Developer quindi non si può limitare a questo, bisogna fare molto di più.\n Prima cosa so utilizzare diversi processi di sviluppo per ottenere risultati di qualità: all’occorrenza posso farmi guidare dalla analisi e dalla progettazione, da una ben definita architettura, dai test, dall’esperienza, etc., ma mi risulta difficile sintetizzare tali processi in poche battute (erogo dei corsi appositamente su questi argomenti).\n In qualsiasi caso, quando creo del codice, curo scrupolosamente i test, la comunicazione con il team, la documentazione, il bug fixing, seguo i principi dell’object orientation, sfrutto soluzioni standard (pattern), cerco di misurare e migliorare le prestazioni nelle parti architetturalmente significative, dedico del tempo a rendere il mio codice sicuro e faccio il possibile per renderlo leggibile per me e per gli altri.\n Insomma, il codice non deve solo funzionare, deve anche essere efficiente, manutenibile, scalabile, robusto, testabile, evolvibile e riutilizzabile. Ovviamente questi sono gli obiettivi, la perfezione non esiste, ma almeno ci si deve provare!\n Qual è la soft skill più importante che deve possedere un Java Developer?  Per la mia esperienza, le soft skill più importanti sono la capacità di analisi di un problema all’interno di un contesto, e la capacità di implementare soluzioni semplici per risolvere problemi complessi.\n La complessità è nemica del nostro lavoro, e buttarsi a capofitto sul codice può essere divertente, ma di solito non garantisce grandi risultati in termini di qualità.\n 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.   È vero, i fallimenti sono fondamentali perché ci fanno crescere, è così che si fa esperienza.\n Ogni fallimento è una pietra miliare per la mia crescita, e ho fallito tante di quelle volte che ora ci sono meno probabilità che ripeta gli stessi errori del passato.\n È difficile scegliere il mio più grande fallimento, alla fine si tratta di situazioni che fortunatamente si sono sempre risolte in qualche modo.\n Potrei raccontarti di quando ho lanciato lo script sbagliato che ha causato l’installazione dell’applicazione del cliente B nell’ambiente di produzione del cliente A.\n Oppure di quando sviluppai un’applicazione con tutte le nuove caratteristiche introdotte da Java 5 (generics, varargs, annotazioni, foreach, etc…) ma che poi ho dovuto riscrivere da capo perché doveva essere installato su un ambiente di produzione che girava con una versione precedente.\n Oppure di quando ho dato un consiglio per risolvere un problema ad un programmatore junior senza seguirlo che poi ha causato un blocco in produzione. O anche di quando dovendo ricreare il mio personale ambiente di test, chiesi in prestito l’accesso all’ambiente di test di un mio collega, ed alla fine cancellai il suo ambiente di test!\n A parte quest’ultimo caso che mi ha fatto diventare una leggenda (Claudio, il divoratore di database), fallire solitamente è poco piacevole, ma non bisogna abbattersi.\n  A volte sbagliare è qualcosa di prezioso!\n  Come fare per diventare un Java Developer?  Ovviamente bisogna studiare molto, ma se c’è la passione questo non è affatto un problema, anzi è un piacere! Java non è solo il nome del linguaggio, ma anche di un immenso ecosistema composto da tool, architetture e tecnologie, aperto ad interfacciarsi con hardware e software di qualsiasi tipo. Non si finisce mai di studiare, io lo faccio da oltre 20 anni ogni giorno!\n Se dovessi consigliare che passi intraprendere per diventare Java Developer, consiglio di:\n Imparare molto bene il linguaggio e le principali librerie. Secondo me un libro di riferimento affidabile e aggiornato è fondamentale per avere la possibilità di approfondire. Un videocorso ti aiuta, ma un buon libro è tutta un’altra cosa. Oggi Java è un linguaggio molto più complesso di una volta e talmente rinnovato che i programmatori che l’hanno studiato anni fa, non sono neanche in grado di interpretare il codice Java scritto oggigiorno. Imparare le basi delle tecnologie più richieste come Spring, JPA e Java EE. Inoltre do per scontato che bisogna conoscere anche le basi di SQL, XML, JSON, e spesso di tecnologie front end quali JavaScript, HTML 5 e CSS. Lo studio è fondamentale ma non basta fare esercizi. All’inizio della mia carriera ho trovato molto utile creare da zero un progetto open source personale e pubblicarlo su una piattaforma come GitHub o SourceForge. Magari creando un clone di qualcosa che esiste già (un blocco note, una calcolatrice, una sveglia, un motore di ricerca, etc.) o qualcosa che ci potrebbe essere utile (un gestionale, una utility per organizzare il nostro lavoro, etc.). Non è facile, ma se non lo si riesce a fare da soli ci si può organizzare con altre persone, il confronto arricchisce moltissimo. Credo che un altro passo davvero importante sia quello di certificarsi. Le certificazioni Oracle richiedono molto studio, ma nel momento in cui ti certifichi hai oramai acquisito un grado di conoscenza del linguaggio molto elevato che ti porterà ad avere grande sicurezza quando programmi, ed è questo che fa la differenza.   Un candidato alla prima esperienza che si presenta ad un colloquio con una certificazione ed un progetto open source da mostrare, avrà importanti possibilità di iniziare una carriera nel migliore dei modi.\n  Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Io sono stato sempre un consulente e mi reputo fortunato perché posso scegliere i miei obiettivi e ruoli senza grossi vincoli. Per i prossimi anni a venire, vorrei solo rimanere libero di scegliere di fare quello che mi va di fare.\n All’inizio della pandemia ho preso un anno sabbatico ed ho rifiutato quelle poche attività che mi hanno proposto per poter curare il mio ultimo libro (senza lavorare di notte come ho fatto per i libri precedenti) e dedicarmi alla divulgazione.\n Ho riaperto il mio blog dopo 15 anni ed erogato gratuitamente un corso di formazione di quindici lezioni ad una ventina di persone che in quel momento vivevano difficoltà economiche. Mi piacerebbe ripetere più spesso quella bellissima esperienza, magari anche con persone di altri paesi meno fortunati del nostro.\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  Certo, purtroppo conosco bene il problema. Sul luogo di lavoro ho assistito spesso ad insopportabili mansplaining, decisioni sessiste, squallide allusioni e ad abusi verbali.\n Sono molto sensibile a questi eventi perché come ti ho detto all’inizio, l’unica cosa che mi fa arrabbiare sono le ingiustizie! Purtroppo si tratta di un problema culturale e ci vorrà tempo per superarlo.\n  In Italia e in tutto il mondo comunque, gli esempi di figure femminili che eccellono nei loro ruoli sono ormai tantissime, e piano piano il vento cambierà.\n  Io e tantissime persone seguono sui social grandi informatiche come Angie Jones, Thrisha Gee e soprattutto Rebecca Wirfs-Brock, che rappresenta una delle mie più grandi ispirazioni.\n  Tu sai cosa intendo, visto che proprio tu Serena, in Italia sei un riferimento femminile molto importante per il mondo informatico, e un esempio da seguire!\n  Un grazie enorme a Claudio per aver partecipato e dedicato il suo tempo a raccontare questa professione!\n Contatti Blog, corsi, risorse gratuite e link social - https://www.claudiodesio.com\n Il nuovo Java - https://www.nuovojava.it\n ", "url": "https:\/\/theredcode.it\/interviste\/java-developer\/" }, "https:\/\/theredcode.it\/docker\/copiare-file-da-verso-container-docker\/": { "title": "Copiare file da e verso un container Docker", "tags": ["docker",], "content": " Quando lavori con Docker, potrebbe essere necessario copiare file da e verso un container Docker e il tuo computer.  Dopo aver creato l\u0026rsquo;immagine Docker e aver ottenuto il vostro container, dover eseguire la build ancora e ancora solo per aggiungere un file al suo interno potrebbe essere noioso, perché capita che le immagini siano di dimensioni abbastanza grandi\u0026hellip;\n Docker però ci fornisce dei comandi molto utili che ci consentono di copiare senza problemi i file da e verso un container Docker e il sistema locale.\n In questo articolo, discuteremo come utilizzare i comandi Docker cp vedendo degli esempi pratici!\n Copia di file dal container al computer locale  Segui i passaggi seguenti per copiare un file da un contenitore Docker a un computer locale:\n Crea un container  Come prova, è possibile utilizzare l\u0026rsquo;immagine di Ubuntu e creare un file di prova al suo interno, eseguendo i comandi riportati:\n docker run -it --name my-container ubuntu \u0026gt;\u0026gt;\u0026gt; root@e625c04df0b0:/# cd home/ root@e625c04df0b0:/home# ls -la total 8 drwxr-xr-x 2 root root 4096 Apr 15 2020 . drwxr-xr-x 1 root root 4096 Apr 5 15:16 .. root@e625c04df0b0:/home# touch myfile.txt root@e625c04df0b0:/home# echo \u0026#34;pippo\u0026#34; \u0026gt; myfile.txt root@e625c04df0b0:/home# cat myfile.txt pippo  Trova l\u0026rsquo;ID del container  Adesso andiamo a recuperare l\u0026rsquo;ID del container da cui vogliamo copiare il file eseguendo il comando seguente:\n docker ps -a \u0026gt;\u0026gt;\u0026gt; CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e3c6d689766e ubuntu \u0026#34;bash\u0026#34; 19 seconds ago Up 19 seconds my-container Copia il file sul tuo sistema locale  È possibile utilizzare il comando docker cp per copiare il file, specificando l\u0026rsquo;ID del container separato da \u0026ldquo;:\u0026rdquo; con il path assoluto del file e poi specificando il percorso -sempre assoluto- di dove verrà salvato in locale.\n Il comando ha questa sintassi:\n  docker cp [CONTAINER_ID]:[PATH_ASSOLUTO_SORGENTE] [PATH_ASSOLUTO_DESTINAZIONE]\nEsempio: docker cp 123abc:/home/folder/file.txt /tmp/file.txt\n  root@system:~$ docker cp e3c6d689766e:/home/myfile.txt /tmp/myfile.txt root@system:~$ ls -la /tmp/ \u0026gt;\u0026gt;\u0026gt; -rw-r--r-- 1 root root 6 Apr 5 19:19 myfile.txt  Copia di file da locale al container  Puoi usare sempre l\u0026rsquo;istruzione cp con la seguente sintassi -tieni presente che il container dev\u0026rsquo;essere up\u0026amp;running-:\n  docker cp [PATH_ASSOLUTO_SORGENTE] [CONTAINER_ID]:[PATH_ASSOLUTO_DESTINAZIONE]\nEsempio: docker cp 123abc:/home/folder/file.txt /tmp/file.txt\n   root@system:~$ docker cp /tmp/myfile.txt e3c6d689766e:/home/myfile.txt  Per verificare che il file sia stato copiato correttamente, utilizzare il comando seguente:\n root@system:~$ docker exec -it my-container /bin/bash root@e3c6d689766e:/# ls -la /tmp/ \u0026gt;\u0026gt;\u0026gt; -rw-r--r-- 1 root root 6 Apr 5 19:19 myfile.txt  Risorse utili Docker Apogeo Canale Emmecilab a tema Docker ", "url": "https:\/\/theredcode.it\/docker\/copiare-file-da-verso-container-docker\/" }, "https:\/\/theredcode.it\/tags\/designdev\/": { "title": "designdev", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/designdev\/" }, "https:\/\/theredcode.it\/tags\/scrum\/": { "title": "scrum", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/scrum\/" }, "https:\/\/theredcode.it\/design-dev\/valori-scrum-e-non-solo\/": { "title": "Valori Scrum e non solo", "tags": ["agile","designdev","scrum",], "content": " Rieccoci con una nuova puntata in cui parleremo dei valori Scrum, e non solo.\n Abbiamo parlato nel precedente articolo (link in fondo!) dei pilastri empirici di questo framework, ora è arrivato il momento di parlare dei suoi valori, i quali possono essere applicati se vogliamo non solo in ambito IT, ma nella vita di tutti i giorni e andando avanti con questa lettura vedremo insieme il perché.\n Di cosa si tratta  Secondo la guida Scrum, il successo nell\u0026rsquo;impiego di questo framework e del team stesso, dipende dalla capacità delle persone di diventare più abili a vivere 5 valori.\n Valori Scrum di Scrum.org\n Impegno   “Le persone si impegnano personalmente a raggiungere gli obiettivi del team Scrum.”\n  Nella vita di tutti i giorni, siamo impegnati al massimo in ciò in cui crediamo davvero, attraversando momenti belli, ma anche difficili ed è proprio in questo caso che scegliamo di non demordere e di andare avanti nonostante tutto per portare a termine i nostri progetti, per noi stessi, per le persone che amiamo e per qualsiasi altro motivo reputiamo importante e la fortuna più grande è avere al nostro fianco le persone di cui ci fidiamo in ogni momento.\n Allo stesso modo, anche nell\u0026rsquo;adottare scrum, ogni persona si impegnerà al 100% non solo sugli sviluppi da portare a termine, ma anche nei confronti dei suoi compagni di squadra.\n Uno Scrum team infatti deve essere in grado di lavorare insieme come un\u0026rsquo;unità speciale per raggiungere un obiettivo comune. Ciò significa fidarsi l\u0026rsquo;uno dell\u0026rsquo;altro, per portare a termine i propri compiti e dare il meglio delle proprie capacità.\n Focus   “Tutti si concentrano sul lavoro dello Sprint e sugli obiettivi dello Scrum team.”\n  Quando ci impegnamo a raggiungere un obiettivo, vien da sé che la nostra concentrazione sia tutta rivolta all\u0026rsquo;obiettivo stesso, soprattutto se desideriamo raggiungerlo entro un determinato limite di tempo.\n Così anche in Scrum, l\u0026rsquo;intero team è concentrato al 100% sul raggiungimento di quello che viene definito Goal, svolgendo il suo lavoro in intervalli temporali ben definiti chiamati Sprint (di Goal e Sprint ne parleremo in futuro nel dettaglio), senza alcun tipo di interruzione o di impedimento.\n Apertura   \u0026ldquo;Il team Scrum e i suoi stakeholder concordano di essere aperti su tutto il lavoro e le sfide legate all\u0026rsquo;esecuzione del lavoro.\u0026rdquo;\n  Capita a volte di trovarci nella condizione di dover affrontare problemi di varia natura, di prendere decisioni complesse e di essere estremamente sinceri nell\u0026rsquo;esporre problematiche o pensieri, con la consapevolezza di avere davanti a noi interlocutori con la nostra stessa apertura mentale e capaci di comprendere e accogliere le nostre parole, generando quindi fiducia e aprendo strade nuove per raggiungere un obiettivo o risolvere un problema.\n Così anche in un team Scrum, affinché possa fare il maggior numero di progressi nel più breve tempo possibile, ogni membro del team dovrà essere brutalmente onesto su qualsiasi forma di problema o progresso, considerando sempre i colleghi come validi contributori al successo del progetto.\n Rispetto   \u0026ldquo;I membri del team Scrum si rispettano a vicenda in quanto persone capaci e indipendenti.\u0026rdquo;\n  Proprio come in ogni lavoro di squadra, il rispetto in un team Scrum significa riconoscere che nessun singolo individuo o il suo contributo è più prezioso di un altro.\n Rispetto significa anche fidarsi dei membri del tuo team per svolgere i loro compiti, ascoltare e considerare le loro idee e riconoscere i loro risultati.\n Coraggio   “I membri del team Scrum hanno il coraggio di fare la cosa giusta e lavorare su problemi difficili.”\n  Il coraggio è un valore che risiede in ognuno di noi. Ci vuole coraggio nel cambiare direzione improvvisamente, per prendere decisioni difficili, per affrontare situazioni nuove che in quanto tali spaventano, ma rappresentano un cambiamento che può renderci felici e molto altro.\n I team Scrum devono avere il coraggio di essere onesti, aperti e trasparenti sia con se stessi che con gli stakeholder sull\u0026rsquo;avanzamento del progetto e su eventuali ostacoli che stanno incontrando.\n I membri del team hanno anche il coraggio di ammettere di aver sbagliato, coscienti della loro capacità di cambiare rotta nel modo giusto, e di chiedere aiuto quando è necessario, di provare nuove tattiche o metodi a cui non sono abituati, di dissentire rispettosamente e di avere un dialogo aperto.\n Credere fermamente in questi valori e viverli ogni giorno, anche in un contesto complesso come può essere quello dello sviluppo software, permette a tutte le persone coinvolte di portare a termine con successo il proprio lavoro, grazie al supporto e al rispetto reciproco.\n Il consiglio che sento di dare però a ogni persona che leggerà questo articolo è di allenarsi a seguire a pieno questi valori, sia nella vita quotidiana che nel lavoro, ricordando sempre che oltre ad essere dei professionisti, siamo persone, tutte diverse e con una storia diversa alle spalle, e forse è questa la cosa più bella.\n  Nel prossimo articolo parleremo finalmente dei ruoli presenti in un team Scrum!\n  Risorse utili Download del poster Scrum Values  ", "url": "https:\/\/theredcode.it\/design-dev\/valori-scrum-e-non-solo\/" }, "https:\/\/theredcode.it\/interviste\/project-manager\/": { "title": "Voglio diventare un... Project Manager", "tags": ["interviste","voglio-diventare",], "content": "Essere PM richiede delle doti tecniche, ma anche alcune innate, come l\u0026rsquo;empatia, l\u0026rsquo;ascolto, la mediazione, e molto altro.\n Si tratta infatti di una figura chiave in un\u0026rsquo;impresa che deve conciliare e facilitare la comunicazione tra il gruppo di sviluppo di una soluzione e fare al contempo gli interessi del progetto e del cliente: i suoi interessi sono ovviamente rivolti al business, ma attuando sempre come un leader.\n E quindi come diventare un ottimo Project Manager?\n Ce lo racconta Riccardo Ricciotti, che nella sua esperienza di \u0026ldquo;esperienze\u0026rdquo; ne ha maturate davvero moltissime; attualmente è Senior Project Manager presso la Tecnet Systems srl., ma il suo essere poliedrico e le sue capacità di comunicazione lo hanno reso un eccellente professionista.\n Descriviti in 100 parole.  Sono un “ragazzo” di 48 anni, curioso e orientato al cambiamento; penso che la vita offra continue opportunità di crescita e che occorra rimanere “sintonizzati” sulle frequenze della propria esistenza per evolvere e migliorarsi.\n Amo la musica e le arti in genere, la fotografia, le scienze e l’ecologia intesa come lo studio della nostra “casa”, mi stupisco davanti a un paesaggio e allo spettacolo della natura, mi deprime l’indifferenza delle persone e il cinismo antropocentrico dell’essere umano.\n Avrei voluto fare il medico, ma faccio il PM…non è la stessa cosa ma mi reputo comunque fortunato.\n In cosa consiste il ruolo di Project Manager?   “Gestire” un progetto, il che vuol dire essere sempre in prima linea.\n  Consideriamo la complessità di un progetto, una Babele in cui tutti gli attori coinvolti (e spesso sono davvero molti) parlino lingue diverse e abbiano esigenze e priorità diverse; in un sistema di questo tipo le variabili tendono a moltiplicarsi esponenzialmente fino a “seppellire” gli obiettivi stessi del progetto.\n  Il PM, in quanto responsabile di tali obiettivi, è dunque il “centro di equilibrio” intorno al quale si sviluppano (e sul quale talvolta collidono) le dinamiche di progetto.\n  Nella pratica, il PM “armonizza” il disordine intrinseco al progetto organizzandone in modo sostenibile le attività, condividendone avanzamenti e risultati e indirizzando la risoluzione dei conflitti e delle crisi che, inevitabilmente, in qualsiasi contesto umano tendono a verificarsi…un lavoro da masochisti!\n  Qual è la soft skill più importante che deve possedere un Project Manager?  Empatia e capacità comunicativa.\n Il Project Manager vive di comunicazione; deve dunque saper essere chiaro nel trasferire informazioni e cauto nella scelta delle informazioni da trasferire.\n Empatico, perché alla base del successo di un progetto c’è senza dubbio l’efficace interazione fra stakeholders e in particolar modo fra il PM e gli altri attori coinvolti nell’impresa (ebbene sì…un progetto, non a caso, si definisce “impresa”).\n  Riconoscere l’esigenza specifica di un membro del team o coinvolgere attivamente nelle decisioni un collaboratore capace ma insicuro e poco abituato a esprimersi, può certamente fare la differenza.\n  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.  Ho appena affermato l’importanza dell’empatia nel mio lavoro\u0026hellip; io ho fallito quando non sono stato empatico, quando ho messo al centro le mie opinioni, quando non ho percepito l’importanza che un mio stakeholder stava dando a un aspetto del progetto che io consideravo secondario.\n Perchè nel lavoro, come nella vita, nulla è assoluto; così mi sono trovato a consegnare un progetto che piaceva a me ma non produceva valore per il mio Cliente; il risultato è stato poi recuperato, la fiducia no.\n  Ho poi imparato, prima di tutto, a pormi in ascolto…\n  Come fare per diventare un Project Manager?  Il percorso per diventare PM parte da lontano e, sebbene la teoria indichi come non necessaria una competenza specifica sull’ambito del progetto, trovo che essersi “sporcati le mani” sulle attività più tecniche e operative rappresenti un plus importante per un PM.\n Sia ben chiaro, il Project Management è una materia vera e propria, non ci si improvvisa PM e non basta aver partecipato a molti progetti per poterne condurre uno!\n Consiglio sempre di affacciarsi a questo mondo facendo un corso, quantomeno per apprenderne le basi e i processi principali.\n Parliamo intanto di metodologia Waterfall (che, per definizione, è il territorio del Project management): per iniziare è perfetta la certificazione emessa dall\u0026rsquo;istituto italiano di Project management, ISIPM base (che tra l\u0026rsquo;altro, ora stanno cominciando a richiedere anche per la partecipazione alle gare pubbliche).\n Questa prevede gran parte delle tematiche dal PMI (Project Management Institute), ma senza il livello di complessità del PMP (che rimane la \u0026ldquo;bibbia\u0026rdquo; del Project Management).\n Una declinazione interessante e molto completa della metodologia Waterfall è Prince2 (alias PRojects IN Controlled Environments).\n Si tratta di una bella certificazione e anche piuttosto richiesta, ma la consiglierei a chi abbia maturato già qualche esperienza; esiste poi il mondo Agile e difatti adesso stanno nascendo certificazioni da PM Agili (Prince2 ne ha rilasciata una e anche ScrumStudy).\n Io personalmente consiglio, a chi si voglia dedicare al mondo Agile, una certificazione da PO o anche da ScrumMaster\u0026hellip; che non sono specifiche per i PM ma danno una visione profonda dei processi Agile.\n In alternativa c\u0026rsquo;è la SAMC (Scrumstudy Agile Master certified), emessa da ScrumStudy e conferisce una competenza trasversale e piuttosto approfondita su tutte le metodologie Agili (Scrum, Kanban, Crystal, DSDM\u0026hellip;etc) e non implica la specializzazione su un ruolo in particolare\u0026hellip;\n Mi sento comunque di dire che il Project Management applicato all\u0026rsquo;Agile è un po\u0026rsquo; una forzatura, ma ci sono diverse strade che è possibile intraprendere!\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Sicuramente continuerò a lavorare sui progetti, magari su progetti sempre più ambiziosi e sfidanti e in contesti altamente professionalizzanti.\n  Amo però anche lavorare con i giovani e sono un grande “fan” della formazione\u0026hellip;\n  Non è escluso che nei prossimi anni possa coniugare il mio ruolo di PM con quello di formatore; avviare e gestire una piccola “academy” interna all’azienda, magari proprio su tematiche di Project Management, sarebbe molto gratificante.\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  Conosco il tema e posso affermare, con piacere, di non essermici mai confrontato…anzi, per caso o per fortuna la maggior parte dei progetti ai quali ho partecipato includevano una prevalente componente femminile.\n Certamente, anche nel nostro mondo ci sono professioni più ricercate dagli uomini e altre più ambite dalle donne, i motivi sono molteplici, ma non escludo che l’avvento dello Smart Working possa contribuire ad equilibrare le proporzioni.\n  Il tema della gestione del tempo, in un paese tradizionalista come l’Italia, è da sempre fattore discriminante, specialmente per le donne, nella scelta delle proprie carriere.\n  Quello che ho constatato da quando lavoro è che le donne percepiscono il tema della gestione del proprio tempo come prioritario se non addirittura \u0026ldquo;critico\u0026rdquo;.\n Questa visione deriva dalla natura profondamente tradizionalista della nostra cultura (e forse anche un po\u0026rsquo; arretrata) secondo cui è la donna ad essere principalmente deputata alla gestione della casa e della famiglia.\n Questa regola \u0026ldquo;implicita\u0026rdquo; indirizza e condiziona le donne nel momento in cui si affacciano al mondo del lavoro o addirittura prima, nella scelta dell\u0026rsquo;indirizzo di studio in funzione del successivo percorso professionale.\n Affrontare un percorso di studi STEM richiede sacrificio e le professioni a cui si può accedere con tale background formativo sono molto spesso faticose e di responsabilità, perchè si basano su competenze specifiche e \u0026ldquo;pregiate\u0026rdquo;.\n Una donna che tutti i giorni, al risveglio, parte già con un backlog di attività da svolgere (i figli, la casa, la spesa ecc.) non può permettersi (o, almeno, spesso si pensa questo) di avere un lavoro troppo impegnativo e sul quale essere continuamente misurata, cosa che avviene, ad esempio, nel mondo della consulenza.\n Sotto questo punto di vista, lo smart working in questo senso potrebbe abbattere questo limite (che deve comunque essere rimosso a livello culturale), di modo che sia possibile lavorare senza il timore di essere misurati/e per il tempo che si passa alla scrivania o per quante ore di permesso si prendono in un mese, affinché si possa essere anche più sereni/e nelle proprie scelte di carriera.\n Contatti Profilo LinkedIn ", "url": "https:\/\/theredcode.it\/interviste\/project-manager\/" }, "https:\/\/theredcode.it\/interviste\/crm-strategist\/": { "title": "Voglio diventare una... CRM Strategist", "tags": ["interviste","voglio-diventare",], "content": " La figura di CRM Strategist è una delle professioni più richieste nel settore del marketing digitale: saper leggere e interpretare la relazione tra brand e clienti utilizzando diversi strategie e tecnologie partendo dalle campagne di remarketing è parte essenziale di un\u0026rsquo;azienda.\n Ma cosa fa una professionista di questo settore? Come diventare una CRM Strategist? Ce lo racconta Giorgia Molinari, CRM Strategist, Project Manager e archeologa \u0026ldquo;impolverata\u0026rdquo;!\n Descriviti in 100 parole  Ciao! Sono Giorgia e ci ho messo un po’ per capire cosa volessi fare da grande: ho scelto di studiare archeologia alla Sapienza, in particolare ho studiato Archeologia Preistorica lavorando in Siria, Turchia e a Roma.\n Mentre lavoravo come archeologa ho aperto Cronache dal cantiere, una pagina Facebook in cui raccontavo in modo divertente cosa succedeva sui cantieri che seguivo.\n Durante l’università mi sono avvicinata al mondo delle startup grazie ad InnovAction Lab ed ho lavorato nel mondo della comunicazione e degli eventi, come Project Manager e in un’azienda in ambito AI.\n Ho scoperto dell’esistenza dei CRM un po’ per caso ma è stato subito amore.\n All’inizio mi sono sentita fuori posto per non aver studiato materie scientifiche o più attinenti al percorso, in realtà l’archeologia ha migliorato le mie capacità organizzative, di adattamento ai diversi ambienti (sia sociali che geografici) e di trovare soluzioni a problemi complessi.\n In cosa consiste il ruolo di CRM Strategist?   La CRM Strategist è la persona che fa in modo che il CRM sia funzionale alle esigenze dell’azienda che deve usarlo.\n  L’azienda per cui lavoro in questo ruolo è una system integrator e, in particolare, ci occupiamo di integrare HubSpot con i sistemi preesistenti dei clienti.\n Lavoro sia in solitaria che in team: mi confronto con PM del progetto, Business Analyst, sviluppatori e il reparto di design e faccio in modo che le esigenze del cliente siano soddisfatte dal CRM.\n  Sono io ad impostare il CRM ma senza i requisiti raccolti dal PM o senza il confronto con i Business Analyst, il mio lavoro sarebbe incompleto.\n  La parte più divertente del mio lavoro consiste nel trovare soluzioni semplici per le esigenze del cliente; è molto stimolante spingere lo strumento sempre oltre i suoi (ed i miei) limiti e superare ostacoli che qualche mese o settimana prima mi sembravano insormontabili.\n Inoltre, io mi occupo anche della formazione ai clienti; in questo caso la vera sfida è coinvolgerli nel processo di apprendimento e renderli autonomi mostrandogli la facilità d’uso di HubSpot.\n Qual è la soft skill più importante che deve possedere una CRM Strategist?   Sicuramente la capacità di semplificare e di capire le esigenze dei clienti.\n  Spesso arrivano da noi con dei processi molto articolati ed intricati che dobbiamo rendere più snelli e facili da attuare oppure, al contrario, non hanno mai usato un CRM e ne sono spaventati. In questo caso è importante tranquillizzarli e mostrargli come svolgere le diverse azioni in poche mosse.\nAnche la capacità di lavorare in team è importante: dovendo interagire con molte persone, sapersi relazionare nel modo corretto con tutti è fondamentale.\n 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.  Spesso ho commesso errori ma quello che ho sempre ben impresso nella mente è questo: lavoravo come CRM Strategist da poco e stavo seguendo un cliente che ha un e-commerce.\n Avevo impostato un flusso automatico che inviava email di marketing con un grosso sconto ma dovevo mandarlo solo ai nuovi contatti. Quando ho acceso l’automatismo, l’email è partita a tutti i clienti. Parliamo di migliaia di email.\nMe ne sono resa conto poco dopo ma ormai il danno era fatto, mi sentivo veramente sconfortata.\n Il cliente era abbastanza arrabbiato, abbiamo rimediato mandando un’email simpatica dicendo che il caldo estivo e la vicinanza delle ferie ci avevano dato alla testa.\n  Durante le mie formazioni racconto sempre questo errore, per dimostrare ai clienti che si sopravvive!\n  Come fare per diventare una CRM Strategist?  Penso di essere la dimostrazione che, per lavorare come CRM Strategist, non siano necessarie lauree particolari.\n Vorrei dire che una laurea in economia o in materie scientifiche aiutano ma non ci credo per niente!\n Credo sia più importante avere un mindset scientifico e organizzato, tanta curiosità e, soprattutto, voglia di imparare.\n Come ho già detto, ho studiato archeologia ma sono sempre stata molto metodica e organizzata e mi è sempre piaciuto semplificare processi: nella mia bolla è molto famoso uno schema che avevo fatto sull’uso della lavatrice.\n  Era un diagramma di flusso in cui bisognava rispondere solo sì o no alle azioni (tipo “è un capo in cotone?”, “è colorato?”\u0026hellip;) per trovare il programma, la temperatura ed i detergenti da utilizzare! Zero stress, solo domande a cui rispondere sì/no.\n  Ecco, questo sicuramente mi ha aiutata molto nel capire le logiche di funzionamento di HubSpot!\n Ovviamente certificazioni specifiche del CRM che si usa sono utili, così come la pratica costante e quotidiana. Le certificazioni aiutano nella ricerca di lavoro e a testimoniare che sai fare qualcosa ma credo siano un punto di partenza, più che un traguardo finale.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  In azienda, sono l’unica ad occuparsi della formazione ai clienti. Mi piacerebbe far crescere almeno un’altra persona in questo ruolo così da poter dividere e condividere con qualcuno questo aspetto del lavoro.\n Vorrei, inoltre, mettermi alla prova di nuovo come Project Manager, perché penso sia un’attività stimolante ed in cui potrei offrire valore.\n Da CRM Strategist ho un quadro molto chiaro di una parte del progetto, mi piacerebbe molto averne una visione completa e sistemica. È una sfida che mi sento pronta a cogliere.\n  E poi, secondo me, la PM non è altro che un’archeologa meno impolverata, per cui mi piacerebbe molto tornare “sul campo” in questa veste!\n  Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  Credo che il gender gap in ambito STEM sia una piaga che ci affligge. Secondo i dati dell’Osservatorio Talents Venture e STEAMiamoci di Assolombarda, la percentuale di donne che frequenta corsi STEM in Italia è pari a circa il 37%, le ragazze iscritte a corsi STEM presentano risultati accademici migliori ma tassi di occupazione e retribuzione più bassi rispetto agli uomini.\n I dati del report UNESCO 2021 non sono più confortanti.\n Il problema è sicuramente comune a tutti i Paesi del Mondo, è culturale e strettamente connesso al patriarcato, che instrada le donne fin da bambine verso la cura familiare e i bambini verso giochi più tecnici e scientifici.\n  Lo scautismo mi ha insegnato che l’esempio è un’arma potentissima che abbiamo.\n  E credo davvero che dando sempre più spazio alle donne che lavorano nelle materie STEM e che ricoprono posizioni di comando nelle aziende, così come nella politica, possiamo veramente fare la differenza ed offrire un modello di riferimento diverso.\n Portare questi temi nelle scuole, negli open day universitari, negli eventi per le studentesse e gli studenti di ogni ordine e grado è sicuramente utile.\n Ho molta fiducia nei giovani e nelle giovanissime ma credo pure che si debbano educare gli adulti, che sono le persone che prendono le decisioni.\n Nel mio piccolo quando organizzo eventi, cerco sempre di mantenere paritario il rapporto tra i sessi delle persone ospiti; inoltre, mi impegno a proporre attività, giochi e regali scientifici alle bambine con cui entro in contatto.\n Nel 2020, inoltre, con tre amiche ho fondato BeGet, un’APS che si prefigge di educare su temi digitali in modo semplice, attraverso corsi ed eventi. Ci rivolgiamo a entrambi i sessi ma il nostro pubblico è prevalentemente femminile. Da poco abbiamo lanciato anche JustBe! un podcast su questi temi. Seguici!\n Contatti Profilo LinkedIn Podcast JustBe - la puntata sul metaverso è meta-fantastica!  ", "url": "https:\/\/theredcode.it\/interviste\/crm-strategist\/" }, "https:\/\/theredcode.it\/what\/differenze-tra-keystore-e-truststore\/": { "title": "Differenze tra keystore e truststore", "tags": ["java",], "content": " Keystore e Truststore sono entrambi importanti ed essenziali per la comunicazione tramite un certificato SSL.\n Entrambi sono molto simili in termini di costrutto e struttura, poiché entrambi sono gestiti da uno strumento chiamato keytool, ma sono anche molto diversi\u0026hellip; In cosa?\n Vediamo le differenze tra keystore e truststore!\n Keystore  Il keystore viene utilizzato per archiviare chiavi private e certificati di identità che un programma specifico dovrebbe presentare a entrambe le parti (server o client) per la verifica.\n In altre parole, il keystore contiene i certificati di identificazione che ci identificano e sono informazioni private e sensibili, come la coppia chiave pubblica e privata.\n Il keystore viene utilizzato dal KeyManager di Java per inviare le credenziali di autenticazione ad un host remoto per autenticarsi durante un processo di handshake.\n Il TrustManager di Java verifica che le credenziali condivise dal server corrispondano con quelle presenti nel truststore e in tal caso consente la connessione.\n Truststore  Il truststore viene utilizzato per memorizzare i certificati forniti dalle Certified Authorities (CA) che verificano il certificato presentato dal server in una connessione SSL e ne autorizzano la comunicazione sicura.\n In altre parole, il truststore contiene certificati che identificano gli altri e sono informazioni non private, ma di pubblico dominio.\n Differenze  Entrambi sono genericamente resi disponibili tramite file in formato .jks (ossia Java Key Store) ed entrambi vengono aggiunti all\u0026rsquo;applicazione Java tramite delle opzioni Java come mostrato di seguito:\n javax.net.ssl.trustStore # specifica il path del trustStore javax.net.ssl.keyStore # specifica il path del keyStore Djavax.net.ssl.trustStorePassword # specifica la password del trustStore Djavax.net.ssl.keyStorePassword # specifica la password del keyStore  A parte ciò, le principali differenze possono essere riassunte nello schema di seguito:\n  Truststore Keystore TrustStore memorizza le credenziali di altri. Keystore memorizza le tue credenziali, come chiavi private o certificati di identità. La configurazione di TrustStore è necessaria per la corretta connessione lato client. Il Keystore è necessario quando si configura la comunicazione client-server. Un TrustStore contiene i certificati dei sistemi esterni di cui ti fidi. Un KeyStore contiene i certificati della tua applicazione.  Esempio  Se lavoriamo con un sistema A che funge da sistema di autenticazione, questo lavorerà come fosse un componente client.\n Se un sistema esterno B, quindi un server, avrà bisogno di autenticarsi, potrà inviare il proprio keystore al sistema A, il quale verificherà che le credenziali condivise dal server corrispondano con quelle che possiede il TrustManager e in tal caso consentità la comunicazione.\n Come accorgersi che manca un certificato all\u0026rsquo;applicazione? Se ad esempio riscontriamo un errore come quello riportato di seguito, la nostra applicazione con tutta probabilità non riesce ad autenticare il sistema con cui sta cercando di comunicare:\n {\u0026#34;error.stacktrace\u0026#34;:\u0026#34;s.s.p.c.SunCertPathBuilderException: unable to find valid certification path to requested target\\nat s.s.p.c.SunCertPathBuilder.build(SunCertPathBuilder.java:141)\\nat s.s.p.c.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)\\nat j.s.c.CertPathBuilder.build(CertPathBuilder.java:280)\\nat s.s.v.PKIXValidator.doBuild(PKIXValidator.java:445)\\n... 131 common frames omitted\\nWrapped...  In questo caso, è necessario importare il truststore all\u0026rsquo;interno della nostra applicazione!\n Se invece la comunicazione deve avvenire in mutua autenticazione, è allora necessario fornire sia keystore che truststore alla nostra applicazione per far sì che la comunicazione avvenga correttamente.\n Generare keystore e truststore  Java ci mette a disposizione uno strumento chiamato keytool per la gestione dei keystore e la generazione di certificati. Per generare i due, seguiamo i seguenti step:\n Con il seguente comando, andiamo a generare un keystore e salvarlo nel file my-keystore.jks Per il certificato, identificato con l’alias theredcode.it è utilizzato l’algoritmo RSA con chiavi di lunghezza 2048; è possibile anche fornire una password che ne consenta maggior sicurezza.\n keytool -genkey -alias theredcode.it -keyalg RSA -keystore my-keystore.jks -keysize 2048  Per creare il truststore, dal keystore estraiamo il certificato che conterrà esclusivamente la chiave pubblica e lo facciamo con il seguente comando:\n keytool -export -alias theredcode.it -file my-cert.crt -keystore my-keystore.jks -storepass changeme  Generiamo il truststore dove inserire il certificato e lo facciamo creando un keystore vuoto eliminando il certificato al suo interno con i seguenti comandi:\n keytool -genkey -alias theredcode-alias -keystore theredcode-truststore.jks keytool -delete -alias theredcode-alias -keystore theredcode-truststore.jks  Inseriamo il certificato pubblico estratto in precedenza e abbiamo fatto!\n keytool -import -trustcacerts -alias theredcode.it -file my-cert.crt -keystore theredcode-truststore.jks  Comandi utili  Come verifico le informazioni presenti all\u0026rsquo;interno di un certificato o di un keystore?\n keytool -printcert -v -file my-cert.crt # controllare un certificato stand-alone keytool -list -v -keystore keystore.jks # controllare quali certificati sono presenti nel keystore keytool -list -v -keystore keystore.jks -storepass changeme # come sopra, ma memorizza la password  E per elencare tutti i CA certs presenti?\n keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts ", "url": "https:\/\/theredcode.it\/what\/differenze-tra-keystore-e-truststore\/" }, "https:\/\/theredcode.it\/tags\/java\/": { "title": "java", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/java\/" }, "https:\/\/theredcode.it\/categories\/java\/": { "title": "java", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/java\/" }, "https:\/\/theredcode.it\/interviste\/cloud-solution-architect\/": { "title": "Voglio diventare una... Cloud Solution Architect", "tags": ["interviste","voglio-diventare",], "content": "Il cloud, o cloud computing, negli ultimi anni è un termine che è spopolato moltissimo, e così lo sono le nuovi professioni in questo campo: ma cosa fa una Cloud Solution Architect? Come diventarlo?\n Ce lo racconta Najla Said!\n Descriviti in 100 parole.  Sono una donna con interessi molto trasversali, e credo che questo sia il mio più grande punto di forza. Sono molto appassionata di arte e letteratura, leggo molto e amo la musica e la danza.\n Mi interessano tanto, però, anche la scienza e la tecnologia, e diciamo che sono abituata in genere a ragionare in modo analitico, anche nel quotidiano.\n Il mio percorso professionale ricalca questa caratteristica, ho studiato al liceo classico, ma poi mi sono laureata e dottorata in astrofisica, ed alla fine sono arrivata a lavorare nel mondo dell’informatica, che in realtà conosco fin da quando ero bambina, grazie a mio padre ed ai suoi Commodore 64.\n  Sapevi che si può installare un emulatore Commodore 64 su Ubuntu? Trovi qui i video per farlo!\n  In cosa consiste il tuo ruolo di Cloud Solution Architect?  Il mio lavoro consiste nel disegnare sistemi informatici utilizzando i servizi che sono forniti dai diversi Cloud provider.\n  Nella pratica è un lavoro di continua analisi e ricerca.\n  In primis si analizzano i requisiti del sistema che si vuole realizzare, e per farlo si lavora in gruppo, riunendo utenti, architetti, specialisti e chiunque possa chiarire cosa ci si aspetta da un sistema.\n Poi serve trovare soluzioni, quindi studiare quali servizi o componenti rispondano ai requisiti, e, soprattutto, capire come integrare il tutto nel disegno finale.\n Sembra un percorso lineare, ma vi assicuro che serve spesso tornare indietro a ridefinire o smussare i requisiti per far sì che il sistema non sia solo fantastico, ma che funzioni anche!\n Qual è la soft skill più importante che deve possedere una Cloud Solution Architect?  Le soft skill essenziali nel mio lavoro sono due: il pensiero critico, ovvero la capacità di mettere sempre tutto in discussione, senza la quale sarebbe veramente difficile realizzare anche il progetto più semplice.\n La seconda è l’abilità comunicativa, sia in termini di ascolto (per raccogliere i requisiti), che in termini di esposizione (per chiarire cosa è realizzabile e cosa no).\n  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.  Dal mio più grande fallimento ho imparato ad accettare gli errori, essenziale per mettersi in gioco ed affrontare le sfide. Stavamo gestendo una situazione di emergenza con un cliente, tra nottate, sveglie all’alba e agitazione generale.\n  Mentre cercavo di aiutare, ho per sbaglio distrutto un componente essenziale. Dopo il panico iniziale, mi sono messa a lavoro e sono riuscita a ricrearlo in tempo record. Ad emergenza finita, riunione con il CTO del cliente: io mi aspettavo uno ‘shampoo’, ma lui fu molto gentile e disse “chi lavora sbaglia pure”.\n  Come fare per diventare una Cloud Solution Architect?  Per diventare architetto serve avere una gran voglia di imparare, sempre. L’informatica cambia ad una velocità impressionante, cambiano le richieste, le tecnologie, i paradigmi. Le certificazioni sono importanti, ma la cosa principale è sporcarsi le mani.\n  Mi piace sempre seguire da vicino la realizzazione dei sistemi che disegno: lì capisco cosa non devo dare per scontato, dove possono sorgere problemi, quali cose non rifarò e quali invece saranno le mie “best practice”.\n  Credo che implementare un sistema sia l’unico vero modo per imparare a disegnarlo.\n  Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Ho appena cambiato lavoro, e l’ho fatto per inserirmi in un campo che credo stia lanciando una sfida alle architetture informatiche, per gestire e valorizzare l’immensa mole di dati a disposizione.\n L’obiettivo è quello di diventare una specialista nel settore, per poi cercare di dare il mio contributo. Quindi, tra tre anni mi vedo in questo stesso ruolo, ma più in gamba!\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  Sono fortunata, ho alle spalle una famiglia che mi ha cresciuto con l’idea che potevo fare tutto, che il mio genere non rappresentava un limite.\n Poi ho avuto la fortuna di studiare e lavorare con molte donne, il che mi ha quasi cullato nell’illusione che la questione fosse risolta.\n Purtroppo, so bene che non è così, così come non lo è per molti altri gap, di altri generi che non sono uomo o donna, di culture e provenienze diverse, di estrazioni economico-sociali diverse (durante la mia laurea triennale un professore mi disse ‘l’università non è pensata per chi lavora’).\n Sono contenta delle varie iniziative che si portano avanti per cercare di risanare queste storture, partecipo sempre volentieri, ma sono anche convinta che sarà necessario affrontare una vera rivoluzione culturale per raggiungere l’obiettivo.\n Ho molta fiducia nelle nuove generazioni, mi sembrano incredibilmente più in gamba di noi da questo punto di vista, e mi auguro davvero che possano fare la differenza per costruire un mondo che non ha bisogno di istituire quote per garantire a tutti gli stessi diritti e le stesse opportunità.\n", "url": "https:\/\/theredcode.it\/interviste\/cloud-solution-architect\/" }, "https:\/\/theredcode.it\/intelligenza-artificiale\/tipologie-di-machine-learning\/": { "title": "Tipologie di Machine Learning", "tags": ["apogeo","intelligenza-artificiale","machine-learning",], "content": " Spesso il machine learning viene accostato a della \u0026ldquo;magia\u0026rdquo; o addirittura \u0026ldquo;alchimia\u0026rdquo;: un articolo molto interessante è quello pubblicato su Different Glasses che riporto qui, per raccontare l\u0026rsquo;accostamento di queste due materie\u0026hellip;\n Ma torniamo a noi: quali sono le tipologie di machine learning che esistono? Quali sono le differenze e quale adottare a seconda del problema?\n Intro  L\u0026rsquo;abbondanza di dati ha fatto sì che il machine learning sembri la soluzione ad ogni nostro problema: la realtà è che questo campo è una branca dell\u0026rsquo;intelligenza artificiale che sfrutta i dati a disposizione per effettuare delle previsioni.\n E, come tali, non sono da confondersi con le predizioni: il machine learning non è astrologia, né tantomeno alchimia!\n Al contrario dell\u0026rsquo;approccio manuale, il machine learning ci permette di avere un\u0026rsquo;alternativa che vada ad analizzare i dati e individuare dei modelli per costruire una generalizzazione per la rappresentazione dei dati.\n  Ma quali tipi di machine learning esistono e come possiamo creare una classificazione tra i vari approcci?\n  In questo campo, si ha una divisione tra apprendimento supervisionato, non supervisionato e apprendimento rafforzato.\n Apprendimento supervisionato  Cos\u0026rsquo;è  Come facilmente intuibile dal termine, quello supervisionato prevede un controllo sui dati: in effetti, con questa tipologia di problemi andiamo a trovare un modello che, grazie a dei dati di addestramento, riesca ad avere già un set di soluzioni da cui attingere.\nEsempio di dataset per apprendimento supervisionato: in questo caso, abbiamo dei film con relativi generi, che possono essere usati per classificarne di altri\n Algoritmi  L\u0026rsquo;esempio più semplice è quello della classificazione: in questo caso, andiamo ad associare ad ogni input una classe prendendo come riferimento le etichette fornite nel dataset.\n Questo significa che, come visto nell\u0026rsquo;esempio in precedenza, se ho dei film e devo associare loro un genere, posso pensare ad un algoritmo che compia un\u0026rsquo;azione di classificazione.\n Questo andrà a prendere gli esempi nel dataset di addestramento, le relative etichette, e cercare di trovare un modello che sia in grado di assegnare delle etichette a dei dati mai visti.\n  E con Python, quali sono gli algoritmi che abbiamo a disposizione?\n  Nel caso di scikit-learn, esistono diversi algoritmi che abbiamo a disposizione: regressione logistica, lasso, classificazione, SVM, e via dicendo (qui l\u0026rsquo;elenco completo).\n Tensorflow anche offre una serie di algoritmi supervisionati; alcuni di questi vengono riportati di seguito:\n Linear regression: tf.estimator.LinearRegressor Classification:tf.estimator.LinearClassifier Deep learning classification: tf.estimator.DNNClassifier Deep learning wipe and deep: tf.estimator.DNNLinearCombinedClassifier Booster tree regression: tf.estimator.BoostedTreesRegressor Boosted tree classification: tf.estimator.BoostedTreesClassifier  Apprendimento per rinforzo  Cos\u0026rsquo;è  Con questo tipo di apprendimento, cerchiamo di far sì che l\u0026rsquo;agente (ossia il sistema) sia in grado di imparare grazie a dei premi (o talvolta delle penalizzazioni).\n L\u0026rsquo;obiettivo è quello di far sì che la ricompensa arrivi ogni qualvolta l\u0026rsquo;agente riesca ad ottenere un buon risultato: possiamo pensare all\u0026rsquo;apprendimento rafforzato come un esempio di apprendimento supervisionato, dove la ricompensa misura la qualità, e non l\u0026rsquo;etichetta in sé stessa.\n Esempio del funzionamento dell\u0026rsquo;apprendimento per rinforzo\n Algoritmi  L\u0026rsquo;esempio per eccellenza è il gioco degli scacchi: in questo caso, l\u0026rsquo;agente deve decidere quale sarà la prossima mossa a seconda dello stato della scacchiera, e la ricompensa sarà definita in base alla vittoria o alla sconfitta del sistema.\n Apprendimento non supervisionato  Cos\u0026rsquo;è  Al contrario dei precedenti approcci, nell\u0026rsquo;apprendimento non supervisionato non abbiamo in anticipo una risposta giusta, né abbiamo una ricompensa per l\u0026rsquo;agente.\n In questo caso, il sistema cerca di misurare delle similarità o delle differenze tra i dati forniti in input per cercare un modello che riesca a descrivere questi dati.\n Algoritmi  Un esempio è il caso in cui cerchiamo di organizzare una serie di informazioni di diversi gruppi, non avendo però a priori delle categorie da assegnargli: in questo caso, si parla di clustering.\n Anche in questo caso, vediamo cosa ci offrono le librerie di Python: per quanto riguarda scikit-learn, esisono moltissimi algoritmi per il clustering o la misura della covarianza (qui la documentazione).\n Tensorflow e keras su questo però hanno il primato: queste librerie nascono proprio per lavorare su dati non strutturati e non etichettati, e hanno aperto le porte al mondo del deep learning.\nDa non sottovalutare il mondo delle reti neurali: questo tipo di algoritmi lavora bene in entrambe le situazioni, anche se richiedono del lavoro \u0026ldquo;in più\u0026rdquo;\u0026hellip; ma ne parleremo nella prossima puntata!\n  Se hai bisogno di uno schema veloce, scarica questo cheatsheet!\n   ", "url": "https:\/\/theredcode.it\/intelligenza-artificiale\/tipologie-di-machine-learning\/" }, "https:\/\/theredcode.it\/ionic\/aprire-unapp-esterna-con-ionic\/": { "title": "Aprire un\u0027app esterna con Ionic", "tags": ["ionic",], "content": "Come integrare la tua app con Facebook, Twitter e Whatsapp e altro ancora? Vediamo come aprire un\u0026rsquo;app esterna con Ionic e visualizzare una pagina o un profilo specifico sfruttando Angular come framework di base!\n Intro  Le app ibride devono interfacciarsi sempre più spesso con app esterne, tra cui molte app social come Facebook, Twitter, Instagram, o anche app per la navigazione e per il monitoraggio dell’attività fisica.\n Ionic mette a disposizione 2 plugin che servono allo scopo: vediamo come verificare se un\u0026rsquo;app esiste all\u0026rsquo;interno del dispositivo e come aprirla su una pagina specifica.\n Lo schema utilizzato per tutte e tre le app è il seguente:\n- Verifichiamo che tipo di dispositivo utilizza l\u0026rsquo;app, se Android, iOS o Web, utilizzando il servizio Platform;\n- Recuperiamo il profilo/la pagina che ci interessa dai social e ne prendiamo un identificativo;\n- Se siamo su un dispositivo mobile, andiamo a richiamare l\u0026rsquo;app utilizzando un URL specifico che ci rimanda al contenuto desiderato sfruttando un deep link e i plugin AppAvailability e InAppBrowser.\n Facebook  Per questo caso d\u0026rsquo;uso, proveremo ad aprire una pagina pubblica: abbiamo bisogno di recuperare l\u0026rsquo;ID della pagina di interesse. Se non sai come recuperare l\u0026rsquo;ID della tua pagina, qui trovi le informazioni di cui hai bisogno.\n All\u0026rsquo;interno della pagina .html, andiamo a creare un pulsante che, una volta cliccato dall\u0026rsquo;utente, richiami una funzione chiamata openFacebook():\n \u0026lt;p\u0026gt;Aprire un\u0026#39;app esterna: Facebook\u0026lt;/p\u0026gt; \u0026lt;ion-button (click)=\u0026#34;openFacebook(\u0026#39;100437145496561\u0026#39;)\u0026#34; expand=\u0026#34;block\u0026#34;\u0026gt; \u0026lt;ion-icon name=\u0026#34;logo-facebook\u0026#34;\u0026gt; Facebook \u0026lt;/ion-icon\u0026gt; \u0026lt;/ion-button\u0026gt;  All\u0026rsquo;interno della funzione, andremo a recuperare l\u0026rsquo;ID passato come parametro e faremo due controlli diversi: se il dispositivo ha un sistema iOS, andremo a utilizzare come prefisso del nostro URL fb://. Nel caso in cui l\u0026rsquo;app sia disponibile (usiamo AppAvailability per farlo), allora andiamo a richiamare l\u0026rsquo;app sfruttando il pattern indicato all\u0026rsquo;interno della funzione create del plugin InAppBrowser.\n Stesso vale per Android: i due utilizzano la stessa strategia, ma hanno bisogno di due pattern diversi per aprire l\u0026rsquo;app: mentre iOS usa il nome dell\u0026rsquo;app (in questo caso, è abbreviato), per Android è necessario utilizzare il nome del package.\n  Se non sai come recuperare il nome del package, è sufficiente recuperare l\u0026rsquo;URL del Play Store dell\u0026rsquo;app desiderata e leggere nella barra di ricerca quello indicato come id.\nEsempio: https://play.google.com/store/apps/details?id=com.facebook.katana\u0026amp;hl=it\u0026amp;gl=US\n   openFacebook(id) { let app; if(this.platform.is(\u0026#39;ios\u0026#39;)) { app = \u0026#39;fb://\u0026#39;; this.appAvailability.check(app).then( (yes: boolean) =\u0026gt; { console.log(app + \u0026#39; is available\u0026#39;); // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;fb://profile/\u0026#39; + id, \u0026#39;_system\u0026#39;); }, (no: boolean) =\u0026gt; { // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;https://facebook.com/\u0026#39; + id, \u0026#39;_system\u0026#39;); console.log(browser); } ); } else if(this.platform.is(\u0026#39;android\u0026#39;)) { app = \u0026#39;com.facebook.katana\u0026#39;; this.appAvailability.check(app).then( (yes: boolean) =\u0026gt; { console.log(app + \u0026#39; is available on Android\u0026#39;); // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;fb://page/\u0026#39; + id, \u0026#39;_system\u0026#39;); }, (no: boolean) =\u0026gt; { // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;https://facebook.com/\u0026#39; + id, \u0026#39;_system\u0026#39;); console.log(browser); } ); } else { // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;https://facebook.com/\u0026#39; + name, \u0026#39;_system\u0026#39;); return; } }  Twitter  Il meccanismo è piuttosto simile, ma Twitter utilizza il nome del profilo che vogliamo aprire: creiamo quindi un pulsante nella pagina .html che l\u0026rsquo;utente possa cliccare e richiamiamo la funzione per aprire l\u0026rsquo;app di Twitter:\n \u0026lt;p\u0026gt;Aprire un\u0026#39;app esterna: Twitter\u0026lt;/p\u0026gt; \u0026lt;ion-button expand=\u0026#34;block\u0026#34; (click)=\u0026#34;openTwitter(\u0026#39;theredcode_it\u0026#39;)\u0026#34;\u0026gt; \u0026lt;ion-icon name=\u0026#34;logo-twitter\u0026#34;\u0026gt; Twitter \u0026lt;/ion-icon\u0026gt; \u0026lt;/ion-button\u0026gt;  Come fatto in precedenza, abbiamo prima un controllo sul tipo di sistema del dispositivo: verifichiamo se è un dispositivo iOS o Android e quindi utilizziamo il pattern specifico; altrimenti, apriamo direttamente il browser sul profilo!\n openTwitter(name) { let app; if(this.platform.is(\u0026#39;ios\u0026#39;)) { app = \u0026#39;twitter://\u0026#39;; } else if(this.platform.is(\u0026#39;android\u0026#39;)) { app = \u0026#39;com.twitter.android\u0026#39;; } else { // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;https://twitter.com/\u0026#39; + name, \u0026#39;_system\u0026#39;); return; } this.appAvailability.check(app).then( (yes: boolean) =\u0026gt; { console.log(app + \u0026#39; is available\u0026#39;); // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;twitter://user?screen_name=\u0026#39; + name, \u0026#39;_system\u0026#39;); }, (no: boolean) =\u0026gt; { // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;https://twitter.com/\u0026#39; + name, \u0026#39;_system\u0026#39;); } ); }   Whatsapp  Questo altro esempio mostra come aprire Whatsapp Web (se si opera da Desktop), oppure l\u0026rsquo;app sul dispositivo nel caso di iOS e Android. Come sempre, creiamo un pulsante nella pagina .html per richiamare la funzione, alla quale passeremo il numero di telefono compreso di prefisso internazionale:\n \u0026lt;p\u0026gt;Aprire un\u0026#39;app esterna: Whatsapp\u0026lt;/p\u0026gt; \u0026lt;ion-button expand=\u0026#34;block\u0026#34; (click)=\u0026#34;openWhatsapp(\u0026#39;+393492394391\u0026#39;)\u0026#34;\u0026gt; \u0026lt;ion-icon name=\u0026#34;logo-whatsapp\u0026#34;\u0026gt; Whatsapp \u0026lt;/ion-icon\u0026gt; \u0026lt;/ion-button\u0026gt;  Se vogliamo aprire su un browser l\u0026rsquo;app, è sufficiente utilizzare l\u0026rsquo;URL https://wa.me e indicare il numero di telefono. Come fatto anche per gli altri due esempi, per iOS indichiamo il nome dell\u0026rsquo;app e per Android indichiamo l\u0026rsquo;id recuperato dal Play Store; a questo punto, ognuno dei dispositivi è configurato per aprire l\u0026rsquo;app tramite InAppBrowser!\n  openWhatsapp(name) { let app; if(this.platform.is(\u0026#39;ios\u0026#39;)) { app = \u0026#39;whatsapp://\u0026#39;; } else if(this.platform.is(\u0026#39;android\u0026#39;)) { app = \u0026#39;com.whatsapp\u0026#39;; } else { // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;https://wa.me/\u0026#39; + name, \u0026#39;_system\u0026#39;); return; } this.appAvailability.check(app).then( (yes: boolean) =\u0026gt; { console.log(app + \u0026#39; is available\u0026#39;); // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;whatsapp://send?phone=\u0026#39; + name, \u0026#39;_system\u0026#39;); }, (no: boolean) =\u0026gt; { // @ts-ignore const browser: InAppBrowser = this.inAppBrowser.create(\u0026#39;https://wa.me/\u0026#39; + name, \u0026#39;_system\u0026#39;); } ); }  Demo di come aprire un\u0026rsquo;app esterna con Ionic\n Risorse utili Compatibilità: Ionic con Angular e Node.js ", "url": "https:\/\/theredcode.it\/ionic\/aprire-unapp-esterna-con-ionic\/" }, "https:\/\/theredcode.it\/design-dev\/le-basi-di-scrum\/": { "title": "Le basi di Scrum", "tags": ["scrum","design-dev",], "content": " Come promesso, rieccoci con una nuova puntata a tema Dev\u0026amp;Design in cui parleremo di Scrum!\n Intro  Il termine scrum, per chi conosce il mondo del rugby, potrebbe rimandare subito a una mischia, giocatori che si prendono a spallate, si buttano l\u0026rsquo;uno addosso all\u0026rsquo;altro passandosi una palla..\n Nulla di tutto questo in realtà!\n Infatti parliamo di Scrum non riferendoci ad una disciplina sportiva, ma in quanto implementazione della metodologia Agile di cui abbiamo parlato nel precedente articolo.\n  Ma quando è nata questa tecnica?\n  Facciamo un piccolo passo indietro e parliamo del modello RUP (Rational Unified Process) che già prima della nascita di Scrum si avvicinava molto a quella che è una caratteristica fondamentale della metodologia Agile, ossia l\u0026rsquo;approccio iterativo-incrementale.\n Questa era infatti suddivisa in quattro fasi:\n Fase iniziale, o anche inception phase Fase di elaborazione, detta anche elaboration phase Fase di costruzione, ossia construction phase Fase di transizione, definita transition phase.  Ogni fase ha un certo insieme di obiettivi e si conclude con la realizzazione di un deliverable (chiamato anche prodotto) di qualche genere.\n Le fasi sono ulteriormente scomposte in iterazioni, ognuna delle quali associata a periodi temporali aventi scadenze precise.\n Ufficialmente nel 2001 nacque Scrum, dalla collaborazione di Ken Schwaber e Jeff Sutherland, i quali seguono da sempre il suo uso all\u0026rsquo;interno di un mondo sempre più complesso.\n Cos\u0026rsquo;è  Arriviamo al sodo, e iniziamo a parlare concretamente di cosa sia Scrum.\n Prima di tutto, è un framework, inteso come un insieme di principi, valori ed elementi da seguire e applicare per consentire a persone, team e organizzazioni di generare valore attraverso soluzioni adattive per problemi complessi.\n In parole povere non è prescrittivo, non esiste un unico modo di applicare Scrum ma per far sì che abbia successo in una grande organizzazione è assolutamente necessario seguire le regole del gioco, sta poi al team che ne fa uso, scegliere come sfruttarle al meglio in base alle esigenze; ciò che conta è non modificare nessuno dei suoi componenti.\n Immaginate ad esempio di utilizzare Angular come framework per il front-end. Potete sfruttarlo per sviluppare in mille e più modi differenti il vostro applicativo?\n Assolutamente SI. Potete modificarne la struttura e le regole interne? Decisamente no! Non sarebbe più lo stesso e perderebbe la sua essenza.\n  Empirismo e pensiero Lean sono alla base di questo framework.\n  L\u0026rsquo;empirismo afferma che la conoscenza derivi dall\u0026rsquo;esperienza e dal prendere decisioni basate su ciò che si è osservato.\n Il pensiero Lean riduce gli sprechi e si focalizza su ciò che davvero è essenziale e di valore.\n Non meno importante: Scrum si basa sulla intelligenza delle persone che ne fanno uso, mettendo al centro di tutto le persone stesse, intese come individui di valore e con tutte le capacità necessarie a portare a termine gli obiettivi, collaborando come un vero e indissolubile team di professionisti.\n Pilastri  Ma quali sono i pilastri empirici di Scrum? Diamogli un\u0026rsquo;occhiata più da vicino!\n Trasparenza  A quanti di voi è capitato di dover lavorare in una condizione di non chiarezza su ciò che fosse necessario fare?\n Immagino non pochi!\n Scrum fornisce una soluzione a situazioni di questo tipo grazie proprio al primo dei suoi tre pilastri fondamentali, ossia la trasparenza; grazie a questa, il processo ed il lavoro emergenti devono essere chiari e visibili sia a tutti coloro che svolgono il lavoro che a quelli che ne beneficiano.\n Applicare Scrum significa infatti che le decisioni importanti sono basate sulla PERCEZIONE dello stato dei suoi artefatti formali (hakuna matata, parleremo in un articolo dedicato anche di questo) e più in generale del lavoro svolto e futuro.\n  Un basso livello di trasparenza può portare a decisioni che riducono il valore e aumentano pericolosamente i rischi.\n  Elemento chiave della trasparenza è la comunicazione tra tutte le parti interessate.\n Chiunque sia coinvolto nelle varie attività di realizzazione di un prodotto, che sia il business, il cliente finale o il team di sviluppo, deve comunicare chiaramente quali sono gli obiettivi raggiunti e da raggiungere.\n Solo in questo modo sarà possibile raggiungere quel livello di coordinazione tale da poter garantire il successo.\n La trasparenza permette l’ispezione. L’ispezione senza trasparenza è fuorviante e genera spreco.\n Ispezione  In questo contesto non parliamo di un\u0026rsquo;ispezione da parte di un ispettore o di un auditor, ma un\u0026rsquo;ispezione da parte di tutti i membri dello Scrum Team.\n L\u0026rsquo;ispezione può essere eseguita per il prodotto, i processi, gli aspetti delle persone, le pratiche e i miglioramenti continui.\n Ad esempio, il team mostra il prodotto al cliente in modo aperto e trasparente alla fine di ogni Sprint per raccogliere feedback preziosi.\n Se il cliente modifica i requisiti durante l\u0026rsquo;ispezione, il team prontamente si adegua, sfruttando questa opportunità per collaborare con il cliente per chiarire i requisiti e testare la nuova ipotesi.\n Parlando proprio di questa reazione del team a eventuali cambiamenti di rotta, veniamo a quello che è il terzo pilastro..\n Adattamento  L\u0026rsquo;adattamento riguarda il miglioramento continuo, la capacità di adattamento in base ai risultati dell\u0026rsquo;ispezione.\nTutti nell\u0026rsquo;organizzazione devono porsi regolarmente questa domanda: stiamo meglio di ieri?\n E se la risposta è no, chiunque deve impegnarsi attivamente e in collaborazione con il resto del team a far sì che gli sviluppi seguano la giusta direzione.\nSe qualunque aspetto di un processo devia al di fuori dei limiti accettabili o se il prodotto risultante non rispetta il desiderata, il processo e il valore prodotto devono essere adattati il più velocemente possibile per ridurre al minimo ulteriori deviazioni, ricordando sempre che più l\u0026rsquo;esperienza di un team aumenta su un dominio, maggiore sarà la fiducia generata e la capacità di adattamento di ogni singolo componente del team stesso.\n In questo articolo abbiamo parlato brevemente di cosa sia Scrum e dei pilastri empirici; la realtà è che ci sarebbe tanto da dire, ma ci arriveremo\u0026hellip; e di quali siano i suoi valori, ne parleremo nella prossima puntata!\n Risorse utili Sito ufficiale Scrum.org ", "url": "https:\/\/theredcode.it\/design-dev\/le-basi-di-scrum\/" }, "https:\/\/theredcode.it\/interviste\/ai-audio-engineer\/": { "title": "Voglio diventare un... AI Audio Engineer", "tags": ["interviste","voglio-diventare",], "content": "Per chi lavora nel settore AI, Valerio Velardo è un pilastro: da anni cura un canale YouTube in cui racconta il suo lavoro in modo estremamente semplice e pratico, e soprattutto comprensibile anche per chi si sta iniziando a formare.\n Il suo campo di specializzazione è l\u0026rsquo;audio, e non a caso si definisce un AI Audio Engineer: ma come diventarlo?\n Oggi sarà proprio lui a raccontarcelo attraverso un\u0026rsquo;intervista che parla del suo lavoro e soprattutto dei progetti che sta portando avanti grazie alla sua community!\n Descriviti in 100 parole.  Ciao! Sono un consulente che si occupa di AI applicata all’audio e ho scelto di lavorare in questo campo, in particolare la musica, perché ho studiato come pianista, direttore d’orchestra e compositore.\n  La musica è sempre stata la mia passione; in più, programmo da quando sono teenager e mettere insieme queste due passioni è stata l’evoluzione più naturale.\n  Ho seguito un percorso classico, studiando al conservatorio e poi ho preso un dottorato all\u0026rsquo;Università di Huddersfield in Intelligenza Artificiale applicata alla musica, studiando come la musica si evolve nella società (qui l\u0026rsquo;elenco delle pubblicazioni e dei talk).\n  In cosa consiste il ruolo di AI Audio Engineer?  Attualmente collaboro con delle aziende per attività di ricerca o di definizione di strategie su progetti che prevedano l\u0026rsquo;utilizzo di tecniche di AI in ambito multimediale.\n Mi occupo anche di talent-sourcing: questa attività mi permette di mettere in contatto il giusto professionista con il giusto cliente e mettere a disposizione le sue competenze per portare avanti attività di diverso genere.\n Questo tipo di ricerca la porto avanti grazie alla mia community!\n  Ma cosa fa una persona che lavora in questo campo?\n  Normalmente, ho a che fare con professionisti/e come ingegneri in music retrieval o in speech processing, o ancora generative music engineer. La realtà è che queste professioni in Italia non esistono, ma si tratta di ruoli molto specifici che vengono poi costruiti su misura delle specifiche esigenze!\n All’interno di questo settore infatti, c’è perlopiù l’AI Sound Engineer, che può avere diverse competenze, come la music information retrieval: per fare un esempio, parliamo di chi fa sistemi di music recommandation o sistemi che possano estrarre il genere o il mood di una canzone.\n Altro compito da non sottovalutare è la Environmental Sound Classification, o ancora di chi si occupa di separare le voci di un pezzo, chi lavora con la speech recognition, text-to-speech_, voice verification_ e via dicendo -si tratta di tutti task analitici-.\n Sapevi che diverse banche stanno valutando o hanno adottato dei biomarkers basati sul riconoscimento vocale per gestire i propri conti?\n Qual è la soft skill più importante che deve possedere un AI Audio Engineer?  Senza ombra di dubbio, avere un approccio interdisciplinare: ti devi sedere al tavolo con l’idea che quello che stai facendo è più di un semplice applicare il machine learning.\n  Devi capire come funziona il suono e come funziona la musica, perché capire come funziona il dominio con cui stai lavorando ti dà un vantaggio enorme.\n  Canale slack con 4000 persone per supporto su audio e musica in tema AI: OpenSource research è un progetto nato e durato un anno e mezzo per pubblicare un paper in ambito generazione del suono e hanno implementato un sintetizzatore che usa una NN per generare suoni di chitarra. Sfrutta un’interfaccia audio che permette all’utente di generare un suono i.e. suono di chitarra distorta. Ha richiesto moltissimo lavoro di ricerca sul suono a cui ci hanno lavorato più di 100 persone ed è tutto open source, organizzato in 5 gruppi di ricerca. =\u0026gt; https://thesoundofaiosr.github.io/\n 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.  Uno abbastanza rilevante è quando avevo una startup chiamata Melodrive, per cui avevano sviluppato musica per videogames in tempo reale. Le aspettative erano altissime, ma non è andata come sperava; 3-4 anni investiti, sono stati in Silicon Valley, ma la cosa non ha funzionato e hanno venduto e da lì è iniziato il percorso di consulenza.\n Stare troppo appresso all’idea di alzare soldi piuttosto che concentrarsi sul prodotto fino in fondo, e quindi anche sul R\u0026amp;D invece sul business. Soluzione più facile e veloce piuttosto che rivolgersi verso la soluzione più complessa. Il mercato forse non era neanche pronto (inerzia nel mercato) e anche l’idea di andare troppo dritti invece di spendere risorse su cose che non erano quelle più importanti. Grande lezione di vita.\n Come fare per diventare un AI Audio Engineer?  Oltre a quanto detto prima, studiare l’audio signal processing e il music processing, poi si può parlare di machine learning e deep learning.\n Non bisogna dare per scontato che è necessaria tantissima applicazione sulla materia, leggere paper e pubblicazioni e provare anche a reimplementare i prototipi proposti nei paper.\n Le soluzioni con cui lavoro utilizzano perlopiù tecnologie come Python o C++ (quest\u0026rsquo;ultimo viene scelto spesso per questioni di performance) e sfruttando librerie come Tensorflow, e in seconda battuta anche PyTorch, Librosa, Essentia per l\u0026rsquo;audio.\n In ultimo, frequentare gli esperti del settore attraverso gli eventi, come ad esempio ISMIR (una conferenza top nel settore del music processing) o Interspeech e seguire anche i giornali come Journal of Creative Music Systems o Transactions of Music Retrieval.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Mi piacerebbe far crescere la mia community e continuare con attività che coinvolgano tutti i membri che ne fanno parte per avere un involvement della stessa. In passato ho lavorato con diverse startup, e chissà in futuro! ;)\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  Parliamo di un problema ENORME.\n Conosco il tema e vorrei studiarlo in maniera più approfondita; da una parte, mi dico che nel 2022 non è possibile ci sia ancora questo gap; dall’altra, vedo i dati e mi rendo conto che in paesi considerati socialmente più “avanzati”, ti aspetteresti che questi problemi siano meno presenti.\n  La realtà è che si tratta di fardelli evoluzionisti che, come il razzismo, ci portiamo dietro da troppo tempo: vale la pena farsi delle domande e quali battaglie è possibile vincere.\n  Il problema c’è, inutile negarlo, e sicuramente è legato alla società e alla cultura, ma dove arriva l’evoluzione? Le differenze che ci sono tra i generi è innegabile, ma non hanno nessun valore.\n Facciamo un esempio: la disparità enorme tra uomini e donne nel settore degli scacchi esiste: perché? 98% dei giocatori sono uomini, e per questo ci sono più top players; non perché ci sia una reale differenza, ma perché c\u0026rsquo;è una mancanza di eterogeneità.\n Ti dirò di più: spesso si parla di molte giocatrici che in questo settore dimostrano una maggiore intelligenza spaziale e emozionale, campi in cui i due si diversificano moltissimo (qui i dati).\n  L’empowerment passa attraverso la conoscenza: studiare è la chiave.\n  Nella mia community all\u0026rsquo;inizio c\u0026rsquo;era una platea composta dal 95% maschi, mentre attualmente siamo intorno all'85%; questo non perché non ci siano esperte del settore, ma perché di natura tendiamo a seguire ruoli simili.\n  Creare dei role models femminili che infondano coraggio e consapevolezza.\n  Ho una visione miope probabilmente, ma io vedo persone e non generi o etichette.\n Io ho sempre fatto una battaglia dell’evitare i discorsi relativi allo status quo. All’interno della community, anche con i diversi progetti che portiamo avanti, non ci sono mai stati problemi: le persone vengono da tutto il mondo, e lavorano insieme in sinergia per una mission comune.\n Contatti Sito personale The Sound of AI community ", "url": "https:\/\/theredcode.it\/interviste\/ai-audio-engineer\/" }, "https:\/\/theredcode.it\/openshift\/configurare-wordpress-su-openshift\/": { "title": "Configurare Wordpress su OpenShift", "tags": ["openshift","wordpress",], "content": "Nuova serie per TheRedCode e soprattutto nuovo argomento: iniziamo con OpenShift, una piattaforma per container Kubernetes enterprise-ready che in moltissime aziende utilizzano già da diverso tempo per le sue mille qualità.\n Oggi parliamo di come configurare Wordpress su OpenShift 4.9, con pochi, semplici step!\n Procedimento  Per configurare quello che ci serve, è necessario configurare il repository Helm di Bitnami che andremo ad utilizzare. Nella documentazione ufficiale (qui il link) è descritto ogni passaggio per farlo!\n A questo punto, vai nel Catalogo delle applicazioni utilizzando la vista da Developer (aka Developer perspective) cliccando su \u0026ldquo;+Add\u0026rdquo; nella barra di navigazione a sinistra e cercando \u0026ldquo;Wordpress\u0026rdquo;: quella che viene suggerito di utilizzare è la v13.0.21 (a destra nella figura sottostante):\n Wordpress nel catalogo di OpenShift\nSeguendo le istruzioni della procedura guidata, è possibile inserire tutte le informazioni per la corretta configurazione di Wordpress.\nCome prima cosa, è bene scegliere con cura le informazioni per il login, definendo l\u0026rsquo;e-mail dell\u0026rsquo;amministratore/trice e il nome iniziale che assumerà il blog:\n Configurazione delle informazioni generali di Wordpress\n Inoltre, sarà necessario fornire le credenziali per accedere alla dashboard di Wordpress: se non inseriamo in questo momento una password, ne verrà impostata una casuale e sarà possibile recuperarla anche in un secondo momento leggendo il relativo secret_,_ che si troverà nell\u0026rsquo;apposita sezione.\n  Configurazione delle credenziali di accesso di Wordpress\n Inoltre, è possibile anche definire le informazioni sulla connessione al database MariaDB: se ne esiste uno esterno, possiamo configurarlo fornendo le informazioni mostrate nella sezione seguente, tra cui le credenziali, l\u0026rsquo;host, la porta e il nome del database che verrà utilizzato.\n Configurazione del database esterno di Wordpress\n Per accedere al sito web di Wordpress è possibile configurare il tipo di Service da utilizzare, scegliendo tra LoadBalancer (quello di default), ClusterIP e Nodeport -qui trovi maggiori informazioni-.\n Configurazione del service di Wordpress\n Se invece desiderassimo utilizzare un database che verrà ospitato all\u0026rsquo;interno del cluster -e nello specifico, nel namespace attuale-, vedremo che questa opzione nella sezione \u0026ldquo;MariaDB Details\u0026rdquo; è già selezionata. Verificare lo spazio definito nella voce \u0026ldquo;Principale\u0026rdquo;: per impostazione predefinita verranno assegnati 8 Gi per l\u0026rsquo;archiviazione del database.\n Configurazione di un database MariaDB interno al namespace\n Come ultimo step, è possibile scegliere il dimensionamento dello storage per i contenuti e i media statici di Wordpress. Per impostazione predefinita, verranno allocati 10Gi:\n Dimensione dello storage utilizzando da Wordpress\n  Dopo aver creato un\u0026rsquo;istanza del Helm chart, noterai che verranno visualizzati alcuni errori nella sezione eventi del pod di MariaDB. Questo perché ha bisogno di un S_ervice Account_ per essere avviato, che il Helm Chart dà per scontato.\n Il Deployment di Wordpress ha bisogno di un Service Account per avviarsi\n Il pod di MariaDB va in CrashLoopBackOff\n A questo punto, scaliamo a zero il Deployment di MariaDB e di Wordpress e creiamo un Service Account usando i comandi seguenti:\n oc create sa wordpress-mariadb -n your-namespace Output\u0026gt;\u0026gt;\u0026gt; serviceaccount/wordpress-mariadb created oc adm policy add-scc-to-user anyuid -z wordpress-mariadb Output \u0026gt;\u0026gt;\u0026gt; scc \u0026#34;anyuid\u0026#34; added to: [\u0026#34;system:serviceaccount:your-namespace:wordpress-mariadb\u0026#34;]   Prima di riprendere il deploy, modifichiamo il file YAML del Deployment e configuriamo lo stesso Service Account che abbiamo creato nel passaggio precedente, inserendo le voci come evidenziato nell\u0026rsquo;immagine di seguito nelle due proprietà seguenti:\n spec\u0026gt;template\u0026gt;spec\u0026gt;serviceAccountName spec\u0026gt;template\u0026gt;spec\u0026gt;serviceAccount  Aggiunta del Service Account corretto al Deployment\n Ora i due Deployment possono essere nuovamente scalati a una replica e dovrebbero essere in esecuzione in un attimo!\n Tip  Di default non è definita nessuna route per accedere al sito web di Wordpress: per crearne una, utilizziamo il pulsante in alto a destra della sezione \u0026ldquo;Routes\u0026rdquo; e utilizzando il relativo Service:\n Definizione della route\n A questo punto, sarai in grado di accedere alla tua installazione di Wordpress su OpenShift!\n  Esempio della homepage del sito Wordpress configurato su OpenShift\n   Se questo articolo ti è piaciuto, non dimenticare di condividerlo!\n ", "url": "https:\/\/theredcode.it\/openshift\/configurare-wordpress-su-openshift\/" }, "https:\/\/theredcode.it\/tags\/openshift\/": { "title": "openshift", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/openshift\/" }, "https:\/\/theredcode.it\/categories\/openshift\/": { "title": "openshift", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/openshift\/" }, "https:\/\/theredcode.it\/ionic\/ionic-6-cosa-cambia\/": { "title": "Ionic 6: cosa cambia", "tags": ["ionic",], "content": " Qualche settimana fa è uscito un nuovo articolo in cui il team che lavora dietro a Ionic ha rilasciato alcuni importanti aggiornamenti sul framework nato nel 2013, portando questa tecnologia alla versione 6.\n Cosa cambia in questa nuova versione? Come effettuare l\u0026rsquo;upgrade? Diamo subito un\u0026rsquo;occhiata da vicino a Ionic 6!\n Premessa  Se hai già un\u0026rsquo;app in Ionic 5, nessun problema: puoi continuare ad usare la tua app senza problemi e puoi anche aggiornarla all\u0026rsquo;ultima versione senza alcuna paura. Funzionerà alla grande!\n Le novità riguardano soprattutto degli oggetti nuovi che si adeguano alle linee guida in materia di design e si integrano ancora di più con i framework attualmente supportati.\n Nuovi componenti  Ottimo lavoro con l\u0026rsquo;introduzione dell\u0026rsquo;accordion: questo nuovo oggetto permette l\u0026rsquo;organizzazione del contenuto di una pagina in un modo semplice, soprattutto per chi viene dal mondo Bootstrap (secondo il Material Design, questi sono gli Expansion Panel).\n Questi funzionano grazie al componente ion-accordion, il quale ha una serie di animazioni che ne consentono le differenti transizioni in apertura e chiusura:\n Esempio di accordion con Ionic 6 - toggled\nEsempio di accordion con Ionic 6 - open\n  \u0026lt;ion-header [translucent]=\u0026#34;true\u0026#34;\u0026gt; \u0026lt;ion-toolbar\u0026gt; \u0026lt;ion-buttons slot=\u0026#34;start\u0026#34;\u0026gt; \u0026lt;ion-menu-button\u0026gt;\u0026lt;/ion-menu-button\u0026gt; \u0026lt;/ion-buttons\u0026gt; \u0026lt;ion-title\u0026gt;Homepage\u0026lt;/ion-title\u0026gt; \u0026lt;/ion-toolbar\u0026gt; \u0026lt;/ion-header\u0026gt; \u0026lt;ion-content class=\u0026#34;ion-padding\u0026#34;\u0026gt; \u0026lt;ion-accordion-group\u0026gt; \u0026lt;ion-accordion value=\u0026#34;colors\u0026#34;\u0026gt; \u0026lt;ion-item slot=\u0026#34;header\u0026#34;\u0026gt; \u0026lt;ion-label\u0026gt;Contenuto\u0026lt;/ion-label\u0026gt; \u0026lt;ion-icon slot=\u0026#34;start\u0026#34; name=\u0026#34;balloon-outline\u0026#34;\u0026gt;\u0026lt;/ion-icon\u0026gt; \u0026lt;/ion-item\u0026gt; \u0026lt;ion-list slot=\u0026#34;content\u0026#34;\u0026gt; \u0026lt;ion-item class=\u0026#34;ion-padding\u0026#34;\u0026gt; \u0026lt;ion-text\u0026gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi molestie tellus lacus, quis facilisis neque sodales ac. Nullam volutpat risus nec feugiat fringilla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam eget libero luctus, interdum orci non, aliquam dolor. Morbi tincidunt facilisis ultrices. Phasellus hendrerit interdum ligula et hendrerit. Donec dictum eros eget aliquam imperdiet. Aliquam fringilla eros elit, sit amet dictum felis ultrices vehicula. Nulla auctor lorem nec aliquam finibus. Nulla dapibus sit amet velit ornare volutpat. Quisque volutpat ac risus in gravida. Ut vestibulum nisl purus, in porta est vulputate sed. Curabitur vehicula urna neque, nec vulputate nunc venenatis in. \u0026lt;/ion-text\u0026gt; \u0026lt;/ion-item\u0026gt; \u0026lt;/ion-list\u0026gt; \u0026lt;/ion-accordion\u0026gt; \u0026lt;/ion-accordion-group\u0026gt; \u0026lt;/ion-content\u0026gt;  Molto utile anche è l\u0026rsquo;aggiunta del componente breacrumbs, che soprattutto per le PWA in modalità desktop rendono la navigazione agli utenti contestualizzata: non c\u0026rsquo;è pericolo che si perdano nel sito, basta lasciare qualche briciola come fece Pollicino!\n Esempio di breadcrumbs con Ionic 6\n \u0026lt;ion-content class=\u0026#34;ion-padding\u0026#34;\u0026gt; \u0026lt;ion-breadcrumbs\u0026gt; \u0026lt;ion-breadcrumb href=\u0026#34;#\u0026#34;\u0026gt; Home \u0026lt;/ion-breadcrumb\u0026gt; \u0026lt;ion-breadcrumb href=\u0026#34;#\u0026#34;\u0026gt; Dettaglio \u0026lt;/ion-breadcrumb\u0026gt; \u0026lt;/ion-breadcrumbs\u0026gt; \u0026lt;ion-text\u0026gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi molestie tellus lacus, quis facilisis neque sodales ac. Nullam volutpat risus nec feugiat fringilla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam eget libero luctus, interdum orci non, aliquam dolor. Morbi tincidunt facilisis ultrices. Phasellus hendrerit interdum ligula et hendrerit. Donec dictum eros eget aliquam imperdiet. Aliquam fringilla eros elit, sit amet dictum felis ultrices vehicula. Nulla auctor lorem nec aliquam finibus. Nulla dapibus sit amet velit ornare volutpat. Quisque volutpat ac risus in gravida. Ut vestibulum nisl purus, in porta est vulputate sed. Curabitur vehicula urna neque, nec vulputate nunc venenatis in. \u0026lt;/ion-text\u0026gt; \u0026lt;/ion-content\u0026gt;  Design  Alcune delle modifiche al design della modalità iOS includono un nuovo stile per l\u0026rsquo;aggiornamento tramite refresher, una nuova barra degli strumenti e anche l\u0026rsquo;inclusione della modalità a tema scuro per i modali.\n Invece, per quanto riguarda il mondo Android, hanno rinnovato lo stile di molti componenti per aderire ancora di più al Material Design, come ad esempio sfruttando le proprietà filled e outline per alcuni oggetti, tra cui ion-input e ion-select.\n Le novità non finiscono qui: il team sta tenendo d\u0026rsquo;occhio molto attentamente le linee guida dettate da Google ed è pronto ad adeguare il framework per seguire Material You, il nuovo concept in termini di Design annunciato a ottobre dello scorso anno.\n Il team di Ionic sta tenendo d\u0026rsquo;occhio Material You e attende che vengano rilasciate ulteriori indicazioni da Google.\n Routing con Vue  Per colo che lavorano con Vue, finalmente c\u0026rsquo;è un nuovo modo di navigare in Ionic usando l\u0026rsquo;Injectable useIonRouter. Questa nuova funzionalità consente agli sviluppatori di utilizzare il Router Vue mantenendo il controllo sulle transizioni di pagina.\n import { useIonRouter } from \u0026#39;@ionic/vue\u0026#39;; ... const router = useIonRouter(); router.navigate( `/my-page`, \u0026#39;forward\u0026#39;, \u0026#39;replace\u0026#39; );  Come fare l\u0026rsquo;upgrade  Angular Il pre-requisito fondamentale è avere una versione di Angular superiore alla 12. Se non l\u0026rsquo;hai ancora fatto o sei indietro con le versioni, dai un\u0026rsquo;occhiata a questo tool per aggiornarla!\n Invece, se hai aggiornato Angular, per fare l\u0026rsquo;upgrade anche di Ionic alla versione 6, esegui questo comando:\n npm install @ionic/angular@6  Se invece usi anche il server Angular per testare la tua applicazione in locale, esegui questo:\n npm install @ionic/angular@6 @ionic/angular-server@6    Se tutte queste versioni ti spaventano, non ti preoccupare: qui trovi tutti i dettagli sulle versioni compatibili tra Angular, Ionic e Node.js!\n  React  Per usare Ionic 6, è necessario avere una versione di React 17+. Fatto questo controllo, puoi fare l\u0026rsquo;upgrade con il seguente comando:\n npm install @ionic/react@6 @ionic/react-router@6  Vue  Ionic 6 supporta Vue 3.0.6+ e la versione 5 della command-line di Vue; prima di fare l\u0026rsquo;aggiornamento alla versione 6 di Ionic, verifica che le versioni siano corrette e aggiorna i plugin con il seguente comando:\n vue upgrade --next  Per fare l\u0026rsquo;upgrade all\u0026rsquo;ultima versione di Ionic 6, vai con il comando seguente:\n npm install @ionic/vue@6 @ionic/vue-router@6  Aggiornare il codice  E se avessi un\u0026rsquo;applicazione in una versione vecchia di Ionic?\n Il consiglio è di migrare l\u0026rsquo;applicazione prima di tutto alla versione 5, che è quella più vicina in termini di design e sviluppo all\u0026rsquo;ultima disponibile.\n Per rendere invece il codice adeguato alla versione 6, trovi tutte le indicazioni sui componenti aggiornati in questo link.\n Questo vale soprattutto se usi un componente tra cui:\n Text area Popover Modal Datetime Input Select   Stay tuned: nelle prossime settimane, usciranno degli esempi sull\u0026rsquo;utilizzo dei plugin di Ionic aggiornati alla versione 6!\n  Risorse utili Post sul Blog di Ionic Compatibilità: Ionic con Angular e Node.js ", "url": "https:\/\/theredcode.it\/ionic\/ionic-6-cosa-cambia\/" }, "https:\/\/theredcode.it\/tags\/cybersecurity\/": { "title": "cybersecurity", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/cybersecurity\/" }, "https:\/\/theredcode.it\/security\/guerra-informatica\/": { "title": "Operation Russia e la guerra informatica", "tags": ["cybersecurity","sicurezza-informatica",], "content": "In questi giorni difficilissimi -ed è un eufemismo-, è stata condotta una guerra silenziosa, quasi invisibile e che non comporta armi né soldati: la battaglia che Anonymous sta portando avanti nei confronti del regime di Putin.\n Ma che cos\u0026rsquo;è stato fatto finora? Vediamo una breve cronaca di questa guerra informatica, concentrandoci sulle tipologie di attacco informatico che vengono portate avanti dai diversi gruppi appartenenti a questo movimento.\n Anonymous alza il tiro. Diffusi 40 mila documenti attribuiti all’Istituto di Sicurezza Nucleare di Mosca\n In un\u0026rsquo;operazione denominata “Operation Russia – Defend Ukraine”, gli hacktivisti hanno dichiarato di aver preso una posizione contro il presidente russo e di voler aiutare a combattere contro la “propaganda e le folli azioni di Putin”.\n #Anonymous - Message to Russia \u0026amp; Western allies over Ukraine\n\"If tensions continue to worsen in #Ukraine, then we can take hostage... industrial control systems.\" Expect us. #Russia #NATO #USA #UkraineCrisis pic.twitter.com/1QhLJv7St8— Anonymous TV 🇺🇦 (@YourAnonTV) February 15, 2022  Per farlo, hanno iniziato con alcuni attacchi riconducibili a dei data breach: si tratta della diffusione intenzionale di dati protetti e confidenziali, come in questo caso.\n I documenti attribuiti all\u0026rsquo;Istituto di Sicurezza Nucleare di Mosca sono stati pubblicati tramite un tweet pubblicato sull\u0026rsquo;account ufficiale di Battalion \u0026lsquo;65, un gruppo legato ad Anonymous:\n   Non si sono fermati qui: qualche giorno fa hanno preso di mira l\u0026rsquo;agenzia di stampa russa TASS: il loro sito è stato cancellato e sostituito con un messaggio che indica che, nonostante alcuni potrebbero subire ritorsioni pesanti per le proprie azioni, non possono né vogliono rimanere indifferenti.\n Rivendicazione dell\u0026rsquo;attacco da parte di Anonymous all\u0026rsquo;agenzia di stampa TASS\n Messaggio originale pubblicato sul sito della testata (tradotto)\n L\u0026rsquo;attacco non è stato rivolto solo a TASS, ma anche nei confronti di altre testate, tra cui Izvestia, Fontanka, il sito Takie Dela, la rivista Kommersant, e il giornale online Znak.\n Questi sono esempi di defacing: quando un sito viene alterato o, letteralmente, sfregiato, si parla di un attacco di defacement.\n Si tratta ovviamente di un attacco informatico dove la pagina principale (o più pagine) vengono sostituite sfruttando le vulnerabilità del sito o del sistema che viene utilizzato per l\u0026rsquo;hosting.\n Un altro attacco significativo è quello condotto contro le colonnine di ricarica presenti su tutto il territorio russo e bielorusso: ogni stazione ha mostrato un messaggio contro Putin e di solidarietà verso l\u0026rsquo;Ucraina:\n Russian EV Charging station near Moscow hacked, saying \"Out of Service. Glory to Ukraine. Glory to Heroes...\" #Moscow #EVCharging #UkraineRussiaWar pic.twitter.com/AYkWgGrBGn\n— EV News (@EVNews4) February 28, 2022  Sembra banale, ma per hackerare una stazione di ricarica sono necessarie diverse competenze.\n Questo tipo di attacco è possibile tramite accesso fisico sull\u0026rsquo;attrezzatura stradale; infatti, i sistemi dietro queste colonne sono tipicamente basati su GNU/Linux e sono spesso protetti con un pannello che può essere aperto con un semplice tasto.\n A quel punto, si ha completo accesso ai componenti, consentendo l\u0026rsquo;analisi e il reverse engineering di hardware, CPU e firmware.\n Non solo: tramite attacchi come il man-in-the-middle, sfruttando il sistema di comunicazioni tra queste postazioni e il sistema centrale.\n Ciò può consentire agli hacker di attingere per intercettare le informazioni sulle identità dei clienti che stanno caricando le loro auto, oltre alle informazioni di pagamento.\n  Cosa possono fare gli hacker una volta entrati?\n  Furto d\u0026rsquo;identità, furto finanziario e attacco DoS sono sono alcuni degli esempi: gli aggressori possono intercettare le informazioni mentre le persone caricano, o possono recuperarne le informazioni relative ai metodi di pagamento, o anche rendere inutilizzabile l\u0026rsquo;intera stazione di ricarica.\n DoS è un altro modo di mettere fuori uso uno o più siti: l\u0026rsquo;acronimo sta infatti per Denial of Service, che indica un attacco dove il sistema viene messo K.O. esaurendo le risorse del sistema.\n In questa serie di attacchi, molto probabilmente si sta attuando un attacco DDoS, che significa \u0026ldquo;Distributed DoS\u0026rdquo;.\n Questo viene eseguito da un certo numero di macchine compromesse che prendono tutte di mira la stessa vittima, inondando la rete di pacchetti di dati che il sistema non riesce più a gestire, mettendola fuori uso.\n Un esempio di attacco DDoS è stato quello contro i siti governativi russi, che sono stati i primi presi di mira durante questa cyberguerra:\n Tweet di Anonymous dove dichiarano di aver attaccato diversi siti governativi russi\n   Sito kremlin.ru offline\n Leggere i giornali e rimanere indifferenti è pressoché impossibile, così come molti esperti del settore si sono pubblicamente offerti volontari tramite l\u0026rsquo;account ufficiale su Twitter per arruolarsi in questa guerra condotta Anonymous.\n La risposta è stata esemplare: \u0026ldquo;se non sai come aiutare, inizia a condividere e riportare tutte le notizie circa il tentativo di disinformazione russo, che è un lavoro fondamentale in questi giorni\u0026rdquo;.\n Il regime di Putin sta infatti tentando il tutto per tutto portando avanti attacchi informatici sulla rete ucraina, ma soprattutto conducendo un\u0026rsquo;attività di propaganda anche per mezzo di fake news come leva per guadagnare terreno.\n Le fake news sembrano in questa guerra l\u0026rsquo;ultimo dei problemi, ma la realtà è che non essere in grado di rilevarle, fa sì che il mondo non possa più attribuire valore al concetto di \u0026ldquo;verità\u0026rdquo;.\n Queste aprono la strada a chi vuole ingannare gli utilizzatori di determinate piattaforme per promuovere le proprie ideologie: non a caso, durante diverse campagne elettorali, le fake news sono state fondamentali per ottenere il favore durante nelle elezioni politiche.\n Gli utenti si chiedono come sostenere attivamente questa guerra informatica\n La missione di Anonymous è chiara: distruggere il regime di Putin con ogni mezzo a loro disposizione, combattendo attivamente contro l\u0026rsquo;informazione e la disinformazione russa, affinché un altro triste capitolo di storia veda la notte il prima possibile.\n   Fonti Anonymous alza il tiro. Diffusi 40 mila documenti attribuiti all’Istituto di Sicurezza Nucleare di Mosca Tipologie di cyberattacco (EN) Russia\u0026rsquo;s state-owned news agency TASS\u0026rsquo; website reportedly hacked Hacked electric car charging stations in Russia display ‘Putin is a d*ckhead’ and ‘glory to Ukraine’ Official Kremlin website down amid war in Ukraine Influence of fake news in Twitter during the 2016 US presidential election ", "url": "https:\/\/theredcode.it\/security\/guerra-informatica\/" }, "https:\/\/theredcode.it\/categories\/security\/": { "title": "security", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/security\/" }, "https:\/\/theredcode.it\/tags\/sicurezza-informatica\/": { "title": "sicurezza-informatica", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/sicurezza-informatica\/" }, "https:\/\/theredcode.it\/interviste\/data-analyst\/": { "title": "Voglio diventare una... Data Analyst", "tags": ["interviste","voglio-diventare",], "content": "Oggi ospite di eccezione: Alice Gabrieli ci parlerà di come diventare una Data Analyst e dell\u0026rsquo;incredibile lavoro di divulgazione che sta facendo con la sua pagina Instagram Data Journalice (@datajournalice).\n Attraverso delle infografiche e dei post su temi sempre molto attuali, in questa pagina si racconta il mondo dei dati e della statistica, legandola ad altre tematiche fondamentali, come l\u0026rsquo;intelligenza artificiale, il gender gap in ambito STEM, l\u0026rsquo;ambiente, e molto altro ancora.\n Se non hai ancora iniziato a seguirla, corri a farlo!\nDescriviti in 100 parole.  Mi chiamo Alice Gabrieli e sono una Data Analyst.\n  Di solito di fronte a questa frase, il 90% delle persone mi guarda di traverso e mi chiede “E cioè?”.\n  Diciamo che non è semplice svolgere un lavoro che prima neanche esisteva o non era riconosciuto, derivante da una disciplina, la Statistica, ancor più ignota, non è semplice perché potremmo definirlo un lavoro “del futuro”.\n Ma è estremamente stimolante e mi piace poter guardare il mio interlocutore con apprensione e spiegargli cosa faccio.\n Mi piace a tal punto che ho creato la prima pagina di informazione statistica su Instagram, Datajournalice, in cui parlo di questa disciplina, del perché sia utile e di come la troviamo nella nostra quotidianità, dato che ogni fenomeno è spiegabile attraverso dati e modelli.\n In cosa consiste il ruolo di Data Analyst?  Cosa faccio dunque nel mio lavoro?\n  Una data analyst, come suggerisce il nome, analizza i dati.\n  Questi dati possono essere di qualsiasi genere: sanitario, demografico, economico, ambientale, e via dicendo. Una data analyst esporta dati, li pulisce (questa è una parte tanto importante quanto noiosa per me), dopodiché importa il proprio dataset su R studio ed inizia a scrivere il codice adatto al tipo di analisi che si vuole applicare.\n La scelta dei modelli statistici dipende dal risultato che si sta cercando: correlazione fra due fenomeni, dipendenza di un evento rispetto a fattori esterni, significatività, calcolo di indici di sintesi, variazioni temporali o confronti territoriali.\n Queste sono alcune delle analisi che faccio nel mio lavoro, che in questo momento riguarda i prezzi dei prodotti agroalimentari.\n La parte che adoro di più è quella in cui scopro qualcosa di nuovo sui dati: è impossibile non sorprendersi davanti a quello che esce dopo l’elaborazione, sapendo che quella percentuale o quel test significativo deriva da migliaia di celle che al primo sguardo non dicevano assolutamente nulla.\n A proposito: mi capita di lavorare sia in team sia in solitaria.\n Qual è la soft skill più importante che deve possedere una Data Analyst?  La soft skill più importante (e complicata) è quella di spiegare i risultati delle analisi e renderli accessibili anche a chi non è esperto del settore.\n  Sono necessari grafici intuitivi e parole giuste, altrimenti la fatica delle fasi precedenti diventa inutile.\n  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.  Mi sono trovata malissimo nella mia prima occasione di lavoro ed ho creduto che il motivo fosse di aver sbagliato tutto nella vita, di aver scelto la facoltà sbagliata ed essermi destinata ad una professione che non mi faceva stare bene.\nSolo dopo qualche mese ho capito che dovevo lasciarmi libera di trovare altre opportunità, che non ci si può illudere di trovare il lavoro dei sogni prima ancora di uscire dall’università.\n  Le opportunità nel mio ambito sono, oserei dire, illimitate!\n  Ma non vuol dire che ci si debba accontentare del primo HR che ti offre uno stipendio.\n  Fate quello che vi piace! E ricordate che c’è sempre tempo per cambiare!\n  Quando l’ho fatto, ho trovato la mia isola felice, ma con la consapevolezza che se un giorno cambierò idea e me ne vorrò andare, non commetterò lo stesso errore di forzarmi e non avrò paura di ricominciare da capo.\nCome fare per diventare una Data Analyst?  Per diventare una Data Analyst ci sono varie strade: la statistica è sicuramente la prima, ma possono essere anche l’economia, la fisica o altre discipline STEM, a patto di avere solide basi di informatica e probabilità.\n  Conta, inoltre, avere buon occhio per i dati e la determinazione nel volerci cavare qualcosa!\n  Non sono necessarie esperienze lavorative pregresse poiché è un ambito molto interattivo, all’interno del quale si impara ogni giorno qualcosa e si viene seguiti.\n Personalmente, un’esperienza che mi ha aiutata molto è stata quella Erasmus: si viene apprezzati di più ai colloqui e si viene riconosciuti come più intraprendenti e disposti ad adattarsi. Ed io mi sento davvero così.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Avendo 24 anni, il mio primo obiettivo al momento è trovare un equilibrio.\n  Sono stata catapultata rapidamente nel mondo del lavoro (pro e contro di chi non ha difficoltà sul mercato), e per questo devo ancora stabilizzare i ritmi fra la mia professione, la pagina Instagram e la mia vita privata.\n Per ora è tutta una confusione, ma nell’arco di 3 anni ce la farò, no? :)\n  Spero di avere ancora più competenze nel mio ambito e di riuscire a raggiungere un pubblico più ampio con i miei contenuti online.\n  Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  Conosco il tema gender gap in ambito STEM, lo detesto e desidero abbatterlo.\n Quando ho cercato collaboratori per il mio team di Datajournalice, ho ricevuto candidature di uomini per il 70% e di donne per il 30%: ho scelto di usare le quote e creare un team parimente variegato, siamo metà donne e metà uomini.\n Qualcuno potrà non essere d’accordo, perché contano le competenze -è vero-, ma voglio far valere queste donne e far emergere le loro capacità attraverso il mio progetto.\n Contatti Pagina Instagram di DataJournalice  ", "url": "https:\/\/theredcode.it\/interviste\/data-analyst\/" }, "https:\/\/theredcode.it\/interviste\/digital-business-integration-analyst\/": { "title": "Voglio diventare una… Digital Business Integration Analyst", "tags": ["interviste","voglio-diventare",], "content": "Cosa c\u0026rsquo;entra il digital con la parte business integration? Tutto, direte.\n In effetti, gestire e digitalizzare i flussi di un cliente può non essere un compito semplice\u0026hellip; ed è qui che entra in gioco una Digital Business Integration Analyst!\n Oggi ci sarà Roberta Corsini a raccontarci la sua avventura in questo mondo complesso, ma mai noioso!\n Descriviti in 100 parole A****mbiziosa, creativa e sempre alla ricerca di nuovi stimoli.\n  Se qualcosa mi appassiona, mi ci butto a capofitto.\n Sono appassionata di tecnologia e durante gli ultimi anni mi sono avvicinata al mondo dell’additive manufacturing. Mi definisco una 3D makers, nel tempo libero progetto e, mediante tecnologia FDM, stampo oggetti in 3d adottando materiali che rispettano l’ambiente.\nAmo trovarmi in contesti dinamici e sfidanti perché voglio sempre mettermi alla prova e uscire dalla mia comfort zone.\nNessuno osi ostacolare la mia indipendenza e la mia libertà, potrebbe pagarla cara! :D\nIl mio outfit preferito? Giacca doppiopetto, camicia, pantalone a sigaretta, cravatta e un bel paio di decolleté!\nIn cosa consiste il ruolo di Digital Business Integration Analyst? Una Digital Business Integration Analyst si occupa della digitalizzazione dei processi aziendali del cliente, ma non solo.\n Nel mio caso, la mia mansione prevede di trasferire e aggregare dati, provenienti da una tecnologia sorgente, ad un database finale, mediante flussi creati con linguaggi di programmazione come python e pyspark.\nLe attività sono definite e pianificate in base alle richieste, esigenze e priorità del cliente. Perciò, è importante in questo lavoro saper comprendere a fondo cosa fare e come agire per poter implementare ciò che viene richiesto.\nNormalmente si lavora in team, ma può capitare anche di lavorare in solitaria. In tal caso, è importante sapersi organizzare per poter rispettare le scadenze, anche in caso di un carico di lavoro elevato.\n Una Digital Business Integration Analyst deve sempre essere pronta ad affrontare nuove sfide, come trovare e adottare nuove soluzioni a problemi non routinari.\n  Qual è la soft skill più importante che deve possedere una Digital Business Integration Analyst? Una Digital Business Integration Analyst deve possedere curiosità e capacità di apprendiment__o. Più si è al corrente di ciò che si può fare con gli strumenti a disposizione più sarà possibile gestire problemi futuri o essere in grado di trovare soluzioni alternative e più efficienti.\nPossedere anche capacità di problem solving e una buona dose di flessibilità e resistenza allo stress, non sarebbe male :D\nLa 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. Il mio più grande fallimento è stato pens****are di non essere all’altezza del lavoro che mi apprestavo a svolgere.\nDurante i primi mesi, mi sentivo insicura, avevo bisogno del supporto di altri colleghi e pensavo di non essere in grado di capire ed eseguire quello che mi veniva richiesto.\n Ho passato notti insonni cercando di capire se fosse il posto giusto per me.\n Poi, con il passare delle settimane, ho capito che bisogna darsi il giusto tempo. Il mondo del lavoro è complesso e ogni giorno ci pone davanti a sfide diverse. Bisogna rischiare e avere il coraggio di abbattere gli ostacoli, soprattutto nel caso di chi come me esce dalla sua zona di comfort.\n Solo in questo modo si può avere la possibilità di migliorare le competenze tecniche e abbattere l’insicurezza.\n Se oggi sono quella che sono, lo devo anche ai miei colleghi che mi hanno fatto\nsentire parte del gruppo sin dal mio primo giorno di lavoro.\n Come fare per diventare una Digital Business Integration Analyst? Inizialmente, non sono richiesti requisiti particolari. La cosa fondamentale è saper dimostrare di poter apprendere e studiare in modo autonomo, senza aspettare che siano altri a dirti di doverlo fare.\nInoltre, col tempo, è importante prendere certificazioni, non solo per poter attestare le competenze acquisite, ma anche per poter dimostrare all’azienda per cui si lavora di essere in grado di portare valore aggiunto.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni? Il mio prossimo obiettivo è quello di sviscerare il più possibile tutto quello che concerne il mondo della programmazione. Mi piacerebbe tanto saperne di più e sentirmi più confident nel programmare.\nPer quanto riguarda i prossimi 3 anni, spero in una promozione e di poter passare al livello successivo, quindi diventare una Digital Business Integration… Consultant!\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  Conosco da vicino il tema gender gap in ambito STEM. Ho frequentato due corsi di laurea in ingegneria, quindi per me era inevitabile farci caso.\n  Ho scelto questi percorsi per passione e ho cercato di fare la mia parte avvicinandomi a nuove tecnologie e promuovendo e gestendo progetti 4.0.\n  Durante questi mesi di lavoro, però, ho sentito meno il divario. Ogni giorno mi interfaccio con tantissime colleghe, non solo colleghi.\n L’azienda per cui lavoro e che opera nel settore IT, infatti, sta favorendo l’assunzione di donne.\n Ha come obiettivo il raggiungimento della parità di genere delle proprie risorse entro il 2025, puntando in particolare sulla formazione di figure che abbiano un background ibrido che unisce competenze scientifiche e umanistiche.\n  Penso sia un’azione importante, che possa essere di esempio e possa dare il via al cambiamento in altre realtà aziendali.\n  ", "url": "https:\/\/theredcode.it\/interviste\/digital-business-integration-analyst\/" }, "https:\/\/theredcode.it\/design-dev\/parliamo-agile\/": { "title": "Parliamo AGILE", "tags": [], "content": " Progettare e sviluppare software è un\u0026rsquo;attività intensa e mai uguale: il metodo Agile permette di adottare un approccio che accorcia i cicli di sviluppo e supporta l\u0026rsquo;analisi just in time delle richieste, seguendo l\u0026rsquo;evoluzione della soluzione in modo veloce e a basso costo.\n Parliamo (di) AGILE e di come questa metodologia può aiutare non solo gli sviluppatori, ma tutte le persone coinvolte nella produzione e rilascio del software!\n Intro  Viviamo in un mondo frenetico in cui il progresso tecnologico va sempre più veloce, i progetti sono sempre più imponenti, i tempi in buona parte dei casi sono sempre più stringenti e la necessità di un\u0026rsquo;organizzazione efficiente aumenta sempre di più, necessità soddisfatta da una metodologia come quella di cui andremo a parlare a brevissimo\u0026hellip;\n Fino agli anni 80, è stata adottata come metodologia di sviluppo, quella che tutti conoscono con il nome di “Waterfall”, la quale prevede una gestione progettuale tradizionale e sequenziale, in cui ogni fase di sviluppo (analisi dei requisiti, sviluppo, test ed eventuale manutenzione), termina prima che inizi la successiva.\n Nulla di così strano in realtà.. Ma quale può essere uno svantaggio in una metodologia così rigida eppur tanto utilizzata?\n La risposta a questa domanda la troviamo in casi di software particolarmente complessi, la cui analisi dei requisiti può richiedere anche più di un anno, in cui si corre il rischio di arrivare alla fase di sviluppo con dei requisiti ormai obsoleti, costringendo il team che se ne occupa a fronteggiare un eventuale cambiamento con quelle che son conosciute come change request, ossia sviluppi fatti su un’architettura già esistente, con il rischio di ottenere come risultato un prodotto non ottimizzato.\n  E quindi, in che modo la metodologia Agile rappresenta una soluzione alternativa alla metodologia waterfall?\n  Grazie ad esempio al suo approccio iterativo incrementale, che riduce sensibilmente il rischio di incorrere nell’obsolescenza dei requisiti di cui parlavamo poco fa.\n Immaginate quindi che lo sviluppo complessivo di un grande progetto venga scomposto in tante piccole iterazioni waterfall, in ognuna delle quali saranno coinvolte tutte le fasi di sviluppo.\n E la cosa più interessante di questa suddivisione sta proprio nel rilascio di un software funzionante già al termine della prima iterazione!\n Alla base di una metodologia così innovativa, abbiamo il “Manifesto Agile” che consiglio caldamente di leggere, basato su 7 principi fondamentali.\n I principi  1. Deliziare i clienti   Tutto inizia con l\u0026rsquo;obiettivo giusto: lo scopo del lavoro è deliziare i clienti, non semplicemente fare soldi. Il solo obiettivo di fare soldi, porta l’azienda e di conseguenza le persone a pensare di guadagnare per se stessi, mettendo totalmente da parte collaborazione e creatività. Il segreto per un futuro duraturo è infatti avere un cliente disposto ad acquistare beni e servizi sia oggi che domani. Non si tratta quindi di una banale transazione: si tratta di creare una vera e propria relazione.\n 2. Team cross-funzionali e auto-organizzati   \u0026ldquo;Quando lavoriamo insieme a persone che hanno diverse interpretazioni e prospettive, spesso siamo in grado di trovare una soluzione a problemi che non saremmo in grado di risolvere da soli\u0026rdquo;. \u0026ldquo;Un problema complesso, come scoprire modi per deliziare i clienti, viene risolto al meglio da un gruppo di persone cognitivamente diversificato a cui viene data la responsabilità di risolverlo, si auto-organizza e lavora insieme raggiungere un obiettivo comune\u0026rdquo;.  3. Iterazioni guidate dal cliente  In altre parole, \u0026ldquo;lavora in iterazioni guidate dal cliente\u0026rdquo;.\n \u0026ldquo;Ciò che è ancora piccolo è facile da dirigere\u0026rdquo;. - Lao Tzù. \u0026ldquo;Attraverso le iterazioni guidate dal cliente, le aziende sono in grado di mantenere l\u0026rsquo;inventario e il lavoro in corso il più piccolo possibile e personalizzare il proprio prodotto non solo per soddisfare le esigenze percepite originali del cliente, ma anche per adattarlo a eventuali cambiamenti di tali esigenze\u0026rdquo;. \u0026ldquo;Le iterazioni guidate dal cliente migliorano la produttività dell\u0026rsquo;organizzazione concentrando il lavoro sugli elementi che realmente aggiungono valore ed eliminando il lavoro che non aggiunge valore (Ciò che ad oggi è conosciuto come pensiero Lean). Inoltre eliminano i tempi di pianificazione improduttivi e riducono i rischi, fornendo alla direzione non rapporti sullo stato di avanzamento inaffidabili, ma con prova del fatto che siano stati compiuti progressi effettivi\u0026rdquo;.  4. Fornire valore ai clienti in ogni iterazione  \u0026ldquo;Offri valore ai clienti in ogni iterazione\u0026rdquo;\n \u0026ldquo;Le iterazioni guidate dal cliente (e il Radical Management) implicano una rivoluzione mentale, un modo diverso di pensare al lavoro. La chiave del successo è fornire valore ai clienti alla fine di ogni iterazione\u0026rdquo;. \u0026ldquo;Una piccola cosa consegnata prima può deliziare di più di una grande cosa consegnata dopo.\u0026rdquo; \u0026ldquo;L\u0026rsquo;obiettivo principale è quello di ottenere prestazioni a un livello di qualità che soddisfi i clienti e poi lo fornisca prima\u0026rdquo;.  5. Trasparenza radicale  \u0026ldquo;Sii totalmente aperto sugli ostacoli e al miglioramento”\n \u0026ldquo;La verità ti renderà libero. Ma prima, ti farà incazzare.\u0026rdquo; - Gloria Steinem. \u0026ldquo;Il raggiungimento del complesso obiettivo della soddisfazione del cliente richiede una totale apertura su qualsiasi impedimento al lavoro: tutti sono alla pari con tutti gli altri\u0026rdquo;. \u0026ldquo;Il radical management accetta l\u0026rsquo;inevitabilità del fallimento e mette in atto accordi per imparare rapidamente dal fallimento e quindi progredire verso il successo\u0026rdquo;.  6. Auto-miglioramento continuo  \u0026ldquo;Creare un contesto per il continuo auto-miglioramento da parte del team\u0026rdquo;\n \u0026ldquo;Il continuo miglioramento personale è un insieme profondamente radicato di valori e atteggiamenti focalizzati sulla risoluzione dei problemi non appena si verificano\u0026rdquo;. \u0026ldquo;Il continuo miglioramento personale è fragile e quindi ha bisogno di nutrimento e attenzione ogni giorno.\u0026rdquo;  7. Comunicazione interattiva  \u0026ldquo;Condividi in modo interattivo storie, domande, conversazioni\u0026rdquo;\n \u0026ldquo;L\u0026rsquo;organizzazione moderna non può essere un\u0026rsquo;organizzazione di \u0026lsquo;capo\u0026rsquo; e \u0026lsquo;subordinati\u0026rsquo;: deve essere organizzata come una squadra di associati\u0026rdquo;. - Peter Drucker \u0026ldquo;I manager tradizionali parlano ai dipendenti come dipendenti e il potere è la valuta della comunicazione\u0026rdquo;. \u0026ldquo;Il Manager Radicale comunica da un essere umano all\u0026rsquo;altro. La gerarchia è presente ma in secondo piano\u0026rdquo;.  Questo, in maniera introduttiva, è uno scorcio di cosa sia la metodologia Agile\u0026hellip;\n Quando sentiamo parlare di Agile, si sente spesso nominare anche Scrum.\n Cos\u0026rsquo;è Scrum? Lo vedremo nella prossima puntata!\n", "url": "https:\/\/theredcode.it\/design-dev\/parliamo-agile\/" }, "https:\/\/theredcode.it\/tags\/social-media\/": { "title": "social-media", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/social-media\/" }, "https:\/\/theredcode.it\/interviste\/social-media-marketing-manager\/": { "title": "Voglio diventare una... Social Media Marketing Manager", "tags": ["interviste","voglio-diventare","social-media",], "content": "Abbiamo parlato di cosa vuol dire essere una Social Media Manager grazie a Sabrina; stavolta diamo spazio ad una figura ibrida, per cui saper attuare strategie e azioni volte a raggiungere obiettivi di marketing permettono ad un brand di crescere notelvolmente.\n Non si tratta solo di conoscere e saper sfruttare i social, ma di tradurre questa attività in migliore visibilità, brand awareness e aumento del fatturato.\n Annalisa ci parlerà di come diventare Social Media Marketing Manager, dal momento che lavora nel settore già di diversi anni e che ha fatto della sua curiosità il proprio mestiere!\n Descriviti in 100 parole  Mi chiamo Annalisa Vicari e la mia città è Milano, dove sono nata e vivo attualmente. Sono una Donna solare, sensibile, empatica, caparbia ed estremamente curiosa.\n Parlo della mia curiosità perché è come se fosse la chiave della mia vita, in quanto mi spinge ogni giorno a conoscere a 360 gradi tutto ciò che posso e che ancora non so.\n Amo interagire con le persone, sono una sorta di animale sociale, perché penso che ciascuno di loro abbia qualcosa da insegnarmi e resto in ascolto, ma parlo anche moltissimo. L’interazione con gli altri e l’aggiornamento costante sono il mio “pane quotidiano”.\n Amo tutto ciò che è natura e gli animali, con cui provo a stabilire una comunicazione.\n In cosa consiste il ruolo di Social Media Marketing Manager?  Faccio la Social Media Marketing Manager dal 2012, quando ancora questo lavoro era sconosciuto ai più e non aveva neppure un nome.\n Dopo il diploma come ragioniera e programmatrice informatica ho deciso di intraprendere il percorso universitario e mi sono laureata in Economia, marketing, comunicazione aziendale e mercati globali.\n Il percorso accademico mi ha fatto scoprire la mia creatività, la mia passione per la comunicazione e la pubblicità.\n Sono una freelance e lavoro da remoto in solitaria, ma negli anni ho avuto modo di lavorare in team con altri professionisti perché credo che la verticalizzazione nelle professioni digital sia la chiave del successo di un progetto.\n Mi spiego meglio: spesso si pensa che si possa fare tutto bene e da soli, io invece credo che ogni professionista abbia delle skills che vanno ad incastrarsi perfettamente con quelle di qualcun altro.\n Non vorrei addentrarmi nei tecnicismi, ma credo mi tocchi, quindi provo ad esemplificare il concetto: io mi occupo del progetto dall’inizio alla fine; quindi, conosco gli steps che occorrono per affermarsi sul web, in cui oggi non conta più solo esserci, ma il modo in cui si è presenti.\n Il sito internet è il punto di partenza per la comunicazione di un’azienda di qualunque dimensione ed è da questo che parto per fare l’analisi della strategia da attuare sui canali social. Questa è l’unica cosa che unisce tutti i miei clienti e i potenziali.\n Partendo da un sito web ben fatto (per cui occorrono la figura del web master, del copywriter e del SEO Expert) dopo aver chiesto la mission e la vision del cliente e quali obiettivi vorrebbe raggiungere, mi occupo di fare un’analisi generale, dei competitors, dei valori aziendali e su quali social network è opportuno presenziare per un’efficace comunicazione.\n Quindi redigo il business plan, il piano editoriale e il calendario editoriale, essenziali per ottimizzare il tutto.\n Oltre alla gestione dei social network, mi occupo di advertising sulle piattaforme e adoro osservare i dati, le metriche che sono l’indicatore delle performance delle campagne pubblicitarie e che mi consentono di avere sempre una visione chiara e di continuare l’ottimizzazione.\n Inoltre mi piace offrire consulenza sia ai social media marketing manager junior che a chiunque voglia aprirsi all’educazione digitale.\n Qual è la soft skill più importante che deve possedere una Social Media Marketing Manager?  Potrei fare un elenco delle soft skills importanti perché per fare bene il mestiere del Social Media Marketing Manager occorre avere una conoscenza di tante materie, da quelle più tecniche, economiche a quelle più umanistiche, ma la mia scelta sulla soft skills più importante cade sull’adattabilità del professionista.\n Lavorando su piattaforme terze, di cui non siamo proprietari, ma solo ospiti, dobbiamo aggiornarci quotidianamente e adattarci agli aggiornamenti e alle novità che ogni social network decide di implementare.\n Quindi se è vero che serve una struttura mentale aperta e creativa, è altrettanto vero che dobbiamo adeguarci agli standard in continuo movimento delle diverse piattaforme proprietarie per far sì che il nostro lavoro non perda di efficacia nel tempo. Insomma, questo è un lavoro in cui “chi si ferma è perduto”.\n 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.  Pensa che uno dei motivi per cui ho scelto questo lavoro è che ti permette di imparare dagli errori, un po\u0026rsquo; come nella vita.\n Il mio più grande errore è stato quello di fidarmi della sorella di una cliente che seguivo nei primi anni di lavoro; questo accade spesso quando sei in buona fede e ancora non conosci i “trucchi” del mestiere.\n Quello che è accaduto, mi ha lasciata talmente male da dover porre in essere da quel momento in poi la clausola di esclusività, insieme al cliente, se lo desidera, sull’amministrazione dei canali social del brand in oggetto.\n In altre parole, dopo aver lavorato per più di tre anni e mezzo alla visibilità, notorietà e vendita dei prodotti di un nuovo brand di gioielli, arrivando al punto in cui ad indossarli erano anche dei VIP e partecipando a kermesse di portata nazionale e internazionale, come il Festival di Sanremo, e a canali televisivi del calibro di Mediaset, un’altra persona, amministratrice anch’essa dei canali social con la giustificazione di verificare l’andamento del progetto, presa da un colpo di invidia per i successi raggiunti, da un giorno all’altro, ha cancellato quasi tutti i post, i video, gli eventi presenti sui canali principali.\n Per me è stato un vero e proprio shock vedere cancellati anni di lavoro in un “click” e senza una ragione seria e pochi mesi dopo ho deciso di non lavorare più per quel brand che mi aveva dato tante soddisfazioni, ma che purtroppo non aveva più le basi di fiducia e stima per proseguire.\n Posso dire che per me, ad oggi, più che un fallimento è stata una lezione importante, nonostante abbia comportato delle conseguenze importanti.\n Come fare per diventare una Social Media Marketing Manager?  Questa è una domanda che mi hanno posto moltissime persone che volevano approcciare alla professione del Social Media Marketing Manager e sono lieta di poter esprimere pubblicamente il mio pensiero perché c’è una grandissima confusione sul tema e molti abbandonano poco dopo aver iniziato.\n La prima cosa che deve avere un/a social media marketing manager sembra scontata, ma ti assicuro che non lo è: ti devono piacere i social network dal punto di vista dell’utente che li utilizza quotidianamente e devi avere la curiosità e la costanza di studiare per capire quali sono le dinamiche che si celano dietro agli algoritmi delle varie piattaforme.\n In seconda battuta, mi assumo la responsabilità di dire che le certificazioni che si ottengono a seguito di corsi di breve durata non sono sufficienti neppure per iniziare, perché purtroppo forniscono tanta teoria, ma nessuna pratica, quindi poi in fase di operatività molti si scoraggiano perché si sentono smarriti.\n Possono certamente essere utili per approfondire determinati argomenti o funzionalità, ma non insegnano all’atto pratico come si lavora nel mondo reale.\n Avere delle basi tecnologiche è un’altra prerogativa essenziale, così come essere aperti di mentalità e stabilire delle ore dedicate proprio all’aggiornamento delle tecnologie.\n Io sono stata fortunata perché, come dicevo, ho le basi della programmazione informatica, analisi dei dati, economia, marketing, comunicazione derivate dal mio percorso di studi -conoscenze fondamentali-, perché quando mi sono laureata, il settore digital ancora non esisteva.\n Oggi esistono invece veri e propri corsi universitari per lo studio dei new media, ma vista la velocità e la frequenza degli aggiornamenti, non sarà mai sufficiente fermarsi alla laurea.\n Tra parentesi, conosco bravissimi professionisti che non sono laureati, quindi il percorso universitario non è un elemento indispensabile!\n Lo studio costante lo è. Per lavorare in questo mondo occorre avere un minimo di cultura tecnologica, tecnica, statistica, matematica, di marketing, comunicazione, psicologia, neuromarketing e altro ancora.\n Acquisire queste competenze è possibile solo grazie alla curiosità di cui parlavo nell’introduzione, alla voglia di mettersi in gioco, al coraggio di sbagliare per imparare a migliorare.\n Possono essere delle buone esperienze quelle che si maturano nelle web agency, perché per iniziare è necessario “sporcarsi le mani”, ma poi sta a noi capire quali obiettivi vogliamo raggiungere e trovare la strada per farlo.\n  Iniziare un progetto proprio sul personal branding è la sfida migliore che si possa fare e poi qualche consulenza mirata per chiarire dubbi con professionisti senior è un buon metodo.\n  È molto importante non sentirsi mai arrivati, essere umili e avere il coraggio di chiedere a chi è più esperto. Lo scambio tra colleghi del settore è indispensabile!\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Tre anni nel mondo del web sono un tempo lunghissimo, quindi di obiettivi ne ho moltissimi: tornando al focus delle domande, mi piacerebbe arrivare a ricoprire il ruolo di Digital Project Manager.\n In realtà, questo è un sogno che porto nel cuore dalla mia prima lezione di Pubblicità in università, ma ancora non mi è stato possibile arrivarci per varie ed eventuali.\n La prima cosa che sto cercando e che testerò sarà un team di professionisti freelance verticalizzati nella loro materia, interessati a collaborare per un progetto strutturato e che abbiano affinità con me e caratteristiche peculiari e caratteriali per riuscire a collaborare in modo sano e per l\u0026rsquo;obiettivo comune.\n Inoltre, vorrei continuare a implementare la parte del mio lavoro inerente alla formazione perchè per me è estremamente gratificante riuscire a insegnare e formare professionisti e far comprendere l\u0026rsquo;educazione digitale.\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  Conosco molto bene il tema gender gap in generale, mi è capitato spesso di sposare cause per il superamento di questa discriminazione che ai miei occhi pare così obsoleta, eppure è ancora troppo presente in Italia (parlando sempre con cognizione di causa, mi riferisco al territorio che conosco) e ho partecipato attivamente alla campagna “Dateci Voce” qualche anno fa.\n Si tratta di un movimento che scrisse una lettera indirizzata a Giuseppe Conte, allora Presidente del Consiglio e al Governo Italiano e per conoscenza a Vittorio Colao e ai componenti della “task force” che chiedeva espressamente l\u0026rsquo;introduzione di Donne nella gestione della pandemia, che fino a quel momento non avevano avuto alcuna posizione di rilievo.\n Questa campagna ha avuto un risultato positivo e infatti abbiamo ancora una buona percentuale di donne nel Governo e nella gestione della situazione pandemica.\n In ambito STEM posso affermare che il gender gap è più evidente in alcune professioni rispetto ad altre.\n La posizione delle donne come Social Media Marketing Manager è abbastanza paritaria, specie per i freelancer, anche perché richiede una buona dose di complicità tra il cliente e il professionista; quindi, la scelta ricade spesso sull\u0026rsquo;empatia che si riesce a trovare tra le parti.\n  Resta invece ancora molto sentito ed evidente nel settore della programmazione, website e nuove tecnologie, come la realtà aumentata, mi riferisco sempre all\u0026rsquo;Italia.\n  Come potrebbe essere superato? Con l\u0026rsquo;educazione e la cultura che ponga fine alla discriminazione di genere e si focalizzi sulla meritocrazia dell\u0026rsquo;individuo in quando tale a prescindere dall\u0026rsquo;orientamento sessuale e/o al genere di appartenenza.\n A questo proposito mi impegno a utilizzare lo “schwa” ogni volta che mi è possibile perché al di là delle polemiche in merito, credo che possa essere il giusto seme da veder germogliare e crescere nelle generazioni future.\n Ci conto molto perché odio ogni genere di discriminazione perchè siamo tutti esseri umani che meritano rispetto per ciò che sono e che i pregiudizi, in gergo tecnico “bias cognitivi”, dovrebbero cessare di esistere e l\u0026rsquo;unico modo per essere più aperti mentalmente è riconoscerli e uscire dalla propria bolla, in cui ci sentiamo più forti e rafforziamo i pregiudizi.\n È un compito difficilissimo perché richiede molto lavoro su sé stessi, ma io resto idealista e voglio credere che riusciremo a sdoganarli.\n  Grazie ad Annalisa per aver condiviso la sua personale esperienza!\n  Contatti   Telegram Linkedin Facebook Instagram Twitter Pinterest Twitch Website  ", "url": "https:\/\/theredcode.it\/interviste\/social-media-marketing-manager\/" }, "https:\/\/theredcode.it\/docker\/java-servlet-con-docker\/": { "title": "Java Servlet con Docker", "tags": ["docker","java",], "content": "Uno dei problemi più comuni nell\u0026rsquo;usare Docker è prendere la propria applicazione e capire come \u0026ldquo;metterla\u0026rdquo; in un container\u0026hellip; E uno dei peggiori casi è quando parliamo di un\u0026rsquo;applicazione Java.\n Quindi, perché non dargli una chance? In questa guida, vediamo come prendere una semplice applicazione che usa le Java Servlet e vediamo come farla funzionare all\u0026rsquo;interno di un container basato su Tomcat.\n Iniziamo con l\u0026rsquo;articolo Java Servlet con Docker!\n Panoramica dell\u0026rsquo;applicazione Java  HelloServlet Il primo esempio di servlet è quello che fornisce una classe che restituisca una pagina HTML. L\u0026rsquo;esempio è volutamente semplice, perché cerca di concentrarsi su come far funzionare un\u0026rsquo;applicazione che avrete già scritta in Java su Docker!\n Di seguito, l\u0026rsquo;esempio della classe Servlet che, importando la libreria javax.servlet, ritorna una pagina con il classico messaggio \u0026ldquo;hello world\u0026rdquo; grazie al metodo init: usando l\u0026rsquo;annotazione @WebServlet, definiamo il nome della servlet ed anche l\u0026rsquo;endpoint che sarà possibile chiamare.\n import java.io.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name = \u0026#34;helloServlet\u0026#34;, value = \u0026#34;/hello-servlet\u0026#34;) public class HelloServlet extends HttpServlet { private String message; public void init() { message = \u0026#34;Hello World!\u0026#34;; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType(\u0026#34;text/html\u0026#34;); // Hello PrintWriter out = response.getWriter(); out.println(\u0026#34;\u0026lt;html\u0026gt;\u0026lt;body\u0026gt;\u0026#34;); out.println(\u0026#34;\u0026lt;h1\u0026gt;\u0026#34; + message + \u0026#34;\u0026lt;/h1\u0026gt;\u0026#34;); out.println(\u0026#34;\u0026lt;/body\u0026gt;\u0026lt;/html\u0026gt;\u0026#34;); } public void destroy() { } }  Nel metodo doGet indichiamo il tipo di Content-Type e poi, tramite un PrintWriter, andiamo a restituire il codice HTML della pagina all\u0026rsquo;interno dell\u0026rsquo;oggetto response.\n Questa servlet, una volta avviata tramite un server Tomcat, risponderà quindi all\u0026rsquo;indirizzo http://localhost:8080/hello-servlet:\nPagina principale dell\u0026rsquo;applicazione Java\nPagina di risposta della servlet\nJSONServlet  Per rendere l\u0026rsquo;esempio più completo, vediamo anche una servlet che restituisce un oggetto JSON: in questo caso, nel message andiamo a salvare una stringa che rappresenti un JSON. Questa può facilmente essere sostituita con un oggetto JSON che prendiamo da un database!\n Le operazioni da compiere per restituire questo oggetto sono le stesse fatte nella precedente servlet, cambia solo il Content-Type: in questo caso, specifichiamo application/json.\n import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = \u0026#34;helloJsonServlet\u0026#34;, value = \u0026#34;/hello-json-servlet\u0026#34;) public class JSONServlet extends HttpServlet{ private String message; public void init() { message = \u0026#34;{\\\u0026#34;message\\\u0026#34;: \\\u0026#34;hello JSON!\\\u0026#34;}\u0026#34;; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType(\u0026#34;application/json\u0026#34;); // Hello PrintWriter out = response.getWriter(); response.setCharacterEncoding(\u0026#34;UTF-8\u0026#34;); out.print(message); } public void destroy() { } }  index.jsp  Il file .jsp ci servirà come view del progetto: in questa pagina abbiamo aggiunto due link che puntano alle due diverse servlet, per verificare che le chiamate vadano a buon fine.\n Il risultato dovrebbe essere quello mostrato nella prima immagine:\n \u0026lt;%@ page contentType=\u0026#34;text/html; charset=UTF-8\u0026#34; pageEncoding=\u0026#34;UTF-8\u0026#34; %\u0026gt; \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;JSP - Hello World\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h1\u0026gt;\u0026lt;%= \u0026#34;Hello World!\u0026#34; %\u0026gt; \u0026lt;/h1\u0026gt; \u0026lt;br/\u0026gt; \u0026lt;p\u0026gt; Questa è la mia prima servlet. \u0026lt;/p\u0026gt; \u0026lt;%--Qui vengono definiti i contesti a cui punteranno i link: \u0026#34;hello-servlet\u0026#34; e \u0026#34;hello-json-servlet\u0026#34;--%\u0026gt; \u0026lt;a href=\u0026#34;hello-servlet\u0026#34;\u0026gt;Hello Servlet\u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;hello-json-servlet\u0026#34;\u0026gt;Hello JSON Servlet\u0026lt;/a\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt;  pom.xml  A questo punto, produciamo il file .war. Per farlo utilizziamo Maven e specifichiamo tutte le informazioni necessarie per produrre l\u0026rsquo;artifact all\u0026rsquo;interno del file pom.xml!\n \u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;project xmlns=\u0026#34;http://maven.apache.org/POM/4.0.0\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xsi:schemaLocation=\u0026#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\u0026#34;\u0026gt; \u0026lt;modelVersion\u0026gt;4.0.0\u0026lt;/modelVersion\u0026gt; \u0026lt;groupId\u0026gt;it.theredcode.example\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;REST-API\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;1.0-SNAPSHOT\u0026lt;/version\u0026gt; \u0026lt;name\u0026gt;REST-API\u0026lt;/name\u0026gt; \u0026lt;packaging\u0026gt;war\u0026lt;/packaging\u0026gt; \u0026lt;properties\u0026gt; \u0026lt;maven.compiler.target\u0026gt;1.8\u0026lt;/maven.compiler.target\u0026gt; \u0026lt;maven.compiler.source\u0026gt;1.8\u0026lt;/maven.compiler.source\u0026gt; \u0026lt;junit.version\u0026gt;5.7.1\u0026lt;/junit.version\u0026gt; \u0026lt;/properties\u0026gt; \u0026lt;dependencies\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;javax.servlet\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;javax.servlet-api\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;4.0.1\u0026lt;/version\u0026gt; \u0026lt;scope\u0026gt;provided\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.junit.jupiter\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;junit-jupiter-api\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;${junit.version}\u0026lt;/version\u0026gt; \u0026lt;scope\u0026gt;test\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.junit.jupiter\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;junit-jupiter-engine\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;${junit.version}\u0026lt;/version\u0026gt; \u0026lt;scope\u0026gt;test\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;/dependencies\u0026gt; \u0026lt;build\u0026gt; \u0026lt;plugins\u0026gt; \u0026lt;plugin\u0026gt; \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;maven-war-plugin\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;3.3.1\u0026lt;/version\u0026gt; \u0026lt;/plugin\u0026gt; \u0026lt;/plugins\u0026gt; \u0026lt;/build\u0026gt; \u0026lt;/project\u0026gt;  Definire il Dockerfile  Per far sì che la nostra webapp funzioni con Docker, dobbiamo scrivere un Dockerfile. Lo facciamo partendo da un\u0026rsquo;immagine base di Tomcat che includa già JRE: in questo modo, non avremo bisogno di installare altre dipendenze.\n La versione di JRE è la 8 e utilizza OpenJDK; in questo caso, questa immagine è la slim-buster.\n Questo vuol dire che n_on contiene i pacchetti comuni contenuti nel tag predefinito_ e contiene solo i pacchetti minimi necessari per eseguire Tomcat.\n Questa immagine è perfetta se lavoriamo in un ambiente di sviluppo e vogliamo ridurre al minimo lo spazio occupato dall\u0026rsquo;immagine!\n Detto ciò, nel Dockerfile andremo a specificare questa immagine nell\u0026rsquo;istruzione FROM e poi andremo ad aggiungere il file .war generato precedentemente tramite l\u0026rsquo;istruzione ADD e lo andremo a copiare nella cartella /user/local/tomcat/webapps.\n In ultimo, andremo ad esporre la porta 8080 tramite la direttiva EXPOSE e infine andremo ad eseguire il comando che ci permetta di far avviare Tomcat nell\u0026rsquo;istruzione CMD:\n FROM tomcat:9.0.58-jre8-openjdk-slim-buster LABEL maintainer=\u0026#34;test@mail.com\u0026#34; ADD ./target/REST-API-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/ EXPOSE 8080 CMD [\u0026#34;catalina.sh\u0026#34;, \u0026#34;run\u0026#34;]  A questo punto, è tempo di avviare Docker: lo faremo eseguendo prima la build dell\u0026rsquo;immagine e poi mettendo in run il container, dove andremo anche a specificare la porta 8080 tramite il parametro -p.\nQuesto ci permetterà di raggiungere l\u0026rsquo;applicazione anche in locale:\n docker build -t my-app . docker run -d -p 8080:8080 my-app  In questo caso, andremo a raggiungere l\u0026rsquo;applicazione tramite http://localhost:8080; attenzione però: è necessario specificare anche il nome del .war, che in questo caso è REST-API-1.0-SNAPSHOT.\nApplicazione Java Servlet con Docker\n  E il gioco è fatto!\n  Risorse utili Codice Java REST API con Docker Docker - Apogeo Canale Emmecilab  ", "url": "https:\/\/theredcode.it\/docker\/java-servlet-con-docker\/" }, "https:\/\/theredcode.it\/interviste\/full-stack-developer2\/": { "title": "Voglio diventare una... Full-Stack Developer", "tags": ["interviste","voglio-diventare",], "content": "Come si dice\u0026hellip; non c\u0026rsquo;è uno, senza due (e magari non c\u0026rsquo;è due, senza tre): oggi parliamo con Serena, Full-Stack Developer in Unikey srl, dopo aver parlato con Martina Della Corte la settimana scorsa della stessa professione.\nL\u0026rsquo;elenco delle competenze che deve possedere una figura di questo genere è molto lunga e sempre più spesso capita di vedere profili di questo tipo: donne e uomini che sono in grado di destreggiarsi su entrambi i fronti, avendo una panoramica piuttosto ampia del funzionamento di un applicativo web e non.\n Requisito fondamentale: essere curiosi e aver voglia di studiare ogni giorno!\n Descriviti in 100 parole  Sono una persona che ha sempre amato l’idea di costruirsi un futuro e una propria identità da sola, forse a causa di vicende passate che hanno influito sulla mia personalità (un po’ per fortuna, un po’ per sfortuna), cercando sempre di non reprimere mai quell’empatia che oggi credo fermamente sia fondamentale in molteplici ambiti, da quello lavorativo a quello privato.\n In alcune situazioni riesco ancora ad essere una persona abbastanza pigra devo dire 😃, ma con il tempo ho sviluppato ambizione e voglia di mettermi alla prova ogni singolo giorno della mia vita.\n In cosa consiste il ruolo di Full-Stack Developer?  Ho iniziato questo percorso partendo dal front-end e ho sempre lavorato in team, cosa che giorno dopo giorno mi ha insegnato tantissimo sul come ci si relaziona con le persone, soprattutto nell’ottica di fare un lavoro di squadra, ed attualmente mi occupo principalmente di back-end presso un grande cliente.\nSe dovessi darti una definizione di Full-Stack Developer, ti direi che questa figura “comunemente” è in grado di toccare tutto lo stack di un’applicazione, dal front-end, al back-end, fino ad arrivare al DB.\n Ma non è solo questo\u0026hellip; Al giorno d’oggi la tecnologia fa passi da gigante ed è in costante evoluzione, il che significa, per chi svolge un lavoro del genere, impegnarsi nell’apprendere con costanza tutti i cambiamenti e le novità che giorno dopo giorno emergono.\n Quindi full-stack developer, alla luce di un progresso così rapido, assume un significato più ampio, identificando persone in grado di comprendere sempre meglio le tecnologie più svariate e di affrontare tutti i cambiamenti e le novità, consapevoli di arricchire il proprio bagaglio culturale.\n  Qual è la soft skill più importante che deve possedere una Full-Stack Developer?  Tra le tante soft skills che contano in un lavoro del genere, che vanno dalla perseveranza e voglia di non abbattersi davanti ai problemi che possono sorgere (di natura tecnica e non), alla capacità di gestire lo stress in situazioni particolarmente sfidanti.\n Credo che curiosità e voglia di confrontarsi con figure di riferimento che possano essere fonte di conoscenza, siano elementi chiave per un miglioramento costante, permettendoti di superare i tuoi limiti e di crescere come persona e come professionista, con il conseguente raggiungimento dei tuoi obiettivi, anche grazie ai consigli di chi ha più esperienza di te..\n Perchè mamma Stack Overflow è sempre una valida risorsa, lo studio è fondamentale, ma il confronto fra persone che amano allo stesso modo questo lavoro è quanto di più produttivo e stimolante possa esserci!\n 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.  Non avresti potuto scrivere cosa più vera..\n Al giorno d’oggi i social sono uno strumento utile a mostrare davvero una microscopica parte della vita delle persone e tendenzialmente si mostra solo ciò che c’è di bello, come appunto i propri successi, creando un’immagine quasi idilliaca di alcune vite, ma è difficile immaginare ciò che si cela dietro tutto questo.\n Tornando però a quella che è la domanda principale…beh, probabilmente non essere riuscita ad integrarmi opportunamente in uno dei primi progetti sui quali ho lavorato, ha rappresentato per me una sconfitta pazzesca, dal punto di vista umano e professionale.\n E per quanto questa esperienza sia stata dolorosa e abbia segnato un periodo in cui, sia per inesperienza che a causa del contesto ostile in cui mi trovavo, non ero in grado di andare avanti, e, nonostante l’unica domanda che rimbombava nella mia testa fosse “Perchè è andata in questo modo?”, ho successivamente analizzato a mente fredda ogni singolo evento, dando una risposta a quella domanda e facendo tesoro di quanto accaduto, realizzando che per quanto l’empatia sia la chiave di una comunicazione efficace, debba essere accompagnata da forza di volontà e dalla competenza tecnica e relazionale che ovviamente matura con il tempo.\n Tutto ciò mi ha dato la forza di non fermarmi mai, mi ha resa una persona migliore, più forte, capace di affrontare con lucidità e “leggerezza” determinate situazioni, capace di apprendere quanto più rapidamente possibile tutto il necessario per essere autonoma e operativa in tempi brevi, rimanendo però sempre quella simpaticona del sud a cui piace sempre strappare un sorriso alle persone, ma se in alcuni casi non ci riesce…beh, tocca essere un po’ diplomatici suvvia! 😜\n Come fare per diventare una Full-Stack Developer?  Al di là della mole infinita di informazioni che troviamo online al giorno d’oggi, grazie alle quali potremmo apprendere da autodidatti una miriade di nozioni utili a svolgere un lavoro così articolato e stimolante, credo fermamente che un percorso formativo ad hoc sia fondamentale.\n Infatti è proprio grazie a questo che una figura professionale del genere nasce, acquisendo e soprattutto consolidando le basi della programmazione, imparando a toccare tutto lo stack di un’applicazione, partendo dal database, passando dal back-end, sino ad arrivare al front-end.\n Prendi me, per esempio: per il front-end ho usato Angular, ma per il backend adesso sviluppo in Java e attualmente sto lavorando su architettura a microservizi, API REST e via dicendo, ma ho toccato anche servizi SOAP.\n Di importanza equivalente è anche lo studio, incluso ovviamente nel percorso formativo di cui parliamo, delle tecnologie sulle quali successivamente si andrà a lavorare sul serio, che sia Angular o React per il front-end ad esempio, o linguaggi specifici quali C# o Java e così via, arrivando poi alle tantissime certificazioni disponibili ,che possono essere assolutamente un valido strumento per intraprendere un percorso di specializzazione e soprattutto di crescita professionale!\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Domanda da un milione di dollari…😂\nMa riflettendo sulle esperienze fatte in questi anni e dopo aver osservato molto attentamente svariate situazioni che mi si son presentate davanti e che mi hanno permesso di imparare tantissimo sotto ogni aspetto, che sia esso tecnico piuttosto che organizzativo, ti direi che l’obiettivo che perseguo e che spero di raggiungere un giorno, sia quello di diventare una figura in grado di contribuire in modo importante al successo di un progetto.\n Aver visto progetti caotici, in cui i team navigavano nell’incertezza, nella fretta di dover terminare il proprio lavoro senza aver ben chiaro cosa si dovesse fare (e l’esserci stata anche in mezzo), aver visto progetti in cui il sentimento maggiormente percepito era l’insoddisfazione, è stata un’esperienza dolorosa e frustrante, ma questa è solo la parte negativa..\n Ho avuto la fortuna e l’onore di lavorare anche in team in perfetta sintonia, capaci di adattarsi ad ogni situazione, performanti come pochi, grazie alla trasparenza, alle idee chiare, ai requisiti precisi e ai LEADER che si occupavano della loro gestione e, vedere entrambe i lati della medaglia non ha fatto altro che alimentare in me questo desiderio di diventare come loro!\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?  E’ sicuramente un tema delicato.\n Un grande scoglio da superare a mio avviso e in base ai tanti articoli letti, si trova al momento dell’ingresso nel mercato del lavoro.\n Dati statistici affermano infatti, che nonostante le ragazze STEM abbiano delle capacità straordinarie al pari di tanti ragazzi pieni di talento, ad un anno dalla laurea, hanno comunque meno probabilità di trovare lavoro rispetto agli uomini e guadagnano meno di loro.\n Si sente spesso parlare di queste tematiche, ma l’unico auspicio è che la situazione possa migliorare sempre più con il passare del tempo e che si possano investire le energie giuste per superare questa discrepanza.\n Per cogliere poi le opportunità offerte dalla rivoluzione digitale, servono ovviamente professionisti con competenze STEM.\n In questo percorso è infatti fondamentale incentivare la partecipazione delle ragazze ai percorsi di studio e professionali scientifici e tecnologici, ad oggi principalmente frequentati da uomini, anche se fortunatamente, sempre più figure femminili si stanno affacciando a questo mondo e una testimonianza di questo cambiamento la posso trovare nella stessa azienda di cui faccio felicemente parte oggi, che ha accolto me, dandomi tutti gli strumenti necessari per diventare un professionista felice del suo lavoro e accoglie ragazzi e anche ragazze pieni di talento e forza di volontà, vedendoli crescere giorno dopo giorno e diventare dei professionisti del settore.\n Ci vuole forza ad affrontare i cambiamenti che la vita ci pone davanti, a mettersi in gioco, a provarci nonostante la paura di non farcela sia tanta..\n  Ma quando ce la fai, la strada sarà sempre meno in salita e sarà meraviglioso guardarti alle spalle e vedere ciò che sei diventato dopo una serie non indifferente di sacrifici.\n  Ma questo è un pensiero rivolto non solo alle donne, ma a chiunque stia lavorando su se stesso e si stia impegnando in ciò in cui crede!\n Contatti Profilo LinkedIn\n ", "url": "https:\/\/theredcode.it\/interviste\/full-stack-developer2\/" }, "https:\/\/theredcode.it\/categories\/database\/": { "title": "database", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/database\/" }, "https:\/\/theredcode.it\/tags\/postgres\/": { "title": "postgres", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/postgres\/" }, "https:\/\/theredcode.it\/database\/reset-password-di-postgresql-in-windows\/": { "title": "Reset password di PostgreSQL in Windows", "tags": ["postgres",], "content": "Se, come a me, capita di dimenticare le password, questa guida fa per te!\n In questo breve articolo, vedremo passo dopo passo come reimpostare la password di PostgreSQL in Windows.\n Procedimento  Per qualche motivo, dopo aver installato PostgreSQL, to capitasse di dimenticare la password dell\u0026rsquo;utentepostgres, questi sono i passi da seguire.\n PostgreSQL in Windows utilizza il file di configurazione pg_hba.confmemorizzato nella directory dei dati del database (ad esempio, C:\\Program Files\\PostgreSQL\\[VERSION]\\data) per controllare l\u0026rsquo;autenticazione tramite il client.\n Non a caso, hba significa host-based authentication!\n Attenzione a cambiare la versione di PostgreSQL nel precedente path con quella che effettivamente avete installato: questa guida vale sia per tutte le installazioni che vanno dalla 9.6 alla 13.\n Per reimpostare la password per l\u0026rsquo;utente postgres, è necessario modificare alcuni parametri in questo file di configurazione, accedere come postgres senza utilizzare alcuna password e reimpostarla.\n Per prima cosa, andremo a fare il backup del file pg_hba.conf copiandolo in una posizione diversa o semplicemente rinominandolopg_hba.conf.bk\n Path del file pg_hba.conf per PostgreSQL13\n Adesso passiamo alla modifica del pg_dba.conf: lo apriamo con un qualsiasi editor di testo e cambiamo tutte le voci da scram-sha-256 o md5 a trust. In questo modo, sarà possibile accedere al server del database PostgreSQL senza utilizzare una password.\n  File pg_hba.conf prima della modifica\n File pg_hba.conf dopo della modifica\nOra è il momento di riavviare Postgres: per farlo, possibile usare il tool di gestione dei Servizi di Windows oppure la riga di comando eseguendo questo comando:\npg_ctl -D \u0026#34;C:\\Program Files\\PostgreSQL\\[VERSION]\\data\u0026#34; restart Strumento di gestione dei Servizi di Windows\nDopo aver riavviato PostgreSQL, potremo finalmente accedere con l\u0026rsquo;utente postgres senza alcuna password: utilizziamo quindi PgAdmin (se installato) oppure la riga di comando per loggarci:\nLogin con PgAdmin\npsql -U postgres Questo è il momento di cambiare password. Eseguiamo la seguente query e, soprattutto, segnamocela!\nALTER USER postgres WITH PASSWORD \u0026#39;new_password\u0026#39;; Ultimo step è quello di ripristinare il file pg_dba.conf: andiamo quindi a chiudere sia il client che la riga di comando, sostituiamo il file di cui avevamo fatto il backup e riavviamo nuovamente il server del database PostgreSQL.\nPer verificare che sia andato tutto a buon fine, proviamo a connetterci al server del database PostgreSQL con la nuova password.\n Funziona? Ottimo!\n ", "url": "https:\/\/theredcode.it\/database\/reset-password-di-postgresql-in-windows\/" }, "https:\/\/theredcode.it\/interviste\/full-stack-developer\/": { "title": "Voglio diventare una... Full-Stack Developer", "tags": ["ingegneria-del-software","interviste",], "content": "La sua passione per il cibo passa attraverso i suoi canali social -che invidio tantissimo-, ma in realtà Martina fa molto più di questo: ricopre il ruolo di Full-Stack Developer (e di recente, non solo) in un\u0026rsquo;azienda svedese.\n Questa professione è spesso al centro di discussioni: come si fa a fare tutto? In realtà, non si tratta si essere tuttologi, ma di sapersi destreggiare su più fronti, anche grazie alla presenza di forti competenze tecniche.\n Diamo quindi il benvenuto a Martina Della Corte, Full-Stack Developer per TIQQE!\n Descriviti in 100 parole.  Ciao, sono Martina ho 30 anni e sono un ingegnere informatico.\nAttualmente ricopro il ruolo di full-stack developer presso TIQQE, un’azienda informatica svedese. Mi sono trasferita in Svezia nel 2019, dove vivo con la mia compagna.\nFin da piccola ho avuto un amore profondo per la matematica e sapevo di voler lavorare nel campo scientifico, ma la passione per la tecnologia me l\u0026rsquo;ha infusa mio zio: la miriade di floppy disk sulla sua scrivania ha sempre esercitato un potere magnetico su di me.\nOltre alla passione per l’informatica e la scienza ho un amore smisurato per la cucina e il BUON cibo (difficile concetto da spiegare ad alcuni svedesi), per i libri e per la fotografia.\nIl mio sogno: riuscire a realizzare una serra grandissima per coltivare anche qui in Svezia, i miei amati pomodori.\nIn cosa consiste il ruolo di Full-Stack Developer? Un full-stack developer è un developer che è in grado di prendere parte e dare il suo contributo in qualsiasi parte del processo di sviluppo di un’applicazione.\n  Un full-stack developer è, per esempio, in grado di sviluppare API, creare e gestire database, sviluppare e far comunicare microservizi, ma al tempo stesso è anche in grado di sviluppare l’interfaccia utente di un’applicazione web, lavorare a stretto contatto con i designer per migliorare UI/UX quando necessario e così via.\n  Più semplicemente, un full-stack developer è in grado di operare sia lato frontend, sia lato backend. Non è detto che in tutti i progetti un full-stack developer lavorerà ugualmente a frontend e backend.\nPer esempio, nel progetto a cui lavoro attualmente, svolgo per lo più task relativi al backend e tutto quel che concerne i servizi AWS che utilizziamo, con un’attenzione particolare alla affidabilità del sistema.\nIn progetti medio-grandi, un full-stack developer tipicamente lavora in team ma in progetti piccoli potrebbe tranquillamente lavorare da solo, viste le skill.\nIo per esempio lavoro per un’azienda leader nel settore logistico scandinavo, motivo per cui lavoro in team.\nIn progetti di dimensioni molto più piccole, un solo full-stack developer è sufficiente.\n  Qual è la soft skill più importante che deve possedere una Full-Stack Developer?  Credo che la soft skill più importante che ogni developer e più in generale ogni persona che lavori in questo settore sia l’empatia: dobbiamo ricordare che non tutte le persone sono uguali e che dovremmo essere tutti un po’ più bravi nel riuscire a metterci nei panni dell’altro.\n   Se riuscissimo in questo, avremmo ambienti di lavoro più sereni e team più produttivi.\n  Altra soft skill ritengo stia diventando sempre più importante è la capacità di comunicare.\n Sempre più frequentemente lavoriamo a stretto contatto con il cliente, con la quale discutiamo requisiti e dal quale riceviamo feedback sul nostro operato: saper comunicare in maniera chiara e saper argomentare può aiutare di molto le interazioni.\n 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.   Di errori ne ho fatti tanti nella vita, privata e lavorativa.\n Ma devo dire la verità: faccio fatica a considerarli dei fallimenti, anche i più grandi. Il fallimento mi sa di negativo e io invece adoro fare errori perché quando sbaglio imparo tantissimo, forse molto di più di quando ho successo in qualcosa.\nMagari mi arrabbio o ci rimango male ma quando la botta passa, riesco ad analizzare la situazione in maniera obiettiva e trarre qualcosa di positivo da essa.\nCome fare per diventare una Full-Stack Developer? Essere full-stack non richiede un percorso troppo diverso da quello di un normale sviluppatore.\n Se si frequenta un tradizionale percorso universitario i.e. ingegneria informatica, non c’è probabilmente bisogno di molto altro per poter diventare full-stack.\n Se invece si intraprendono percorsi (universitari e non) mirati più a frontend o backend, potrebbe essere necessario uno o più corsi che bilancino il peso delle nozioni acquisite, o per chi preferisce studio autonomo.\n In generale credo serva tanta passione e tanta voglia di non smettere mai di imparare.\n  Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Ultimamente ricopro il ruolo di Site Reliability Engineer nel mio team. È un ruolo nato presso Google e sta diventando sempre più popolare.\nLa mia azienda ha deciso di sperimentarlo e sono tra i primi ad averlo ricoperto. In futuro vorrebbero avere più SRE nei diversi team che abbiamo.\nUn prossimo obiettivo è diventare Leader di un futuro SRE team. Il mio obiettivo primario però è quello di diventare un architetto software. Credo sia la parte più divertente e stimolante del processo produttivo.\n Conosci il tema gender gap in ambito STEM? Se sì, come fare per superarlo?   Se sei una donna che lavora nel settore non puoi non conoscere la tematica.\n Spesso e volentieri mi sono ritrovata ad essere “l’unica”. Lo sono stata in Italia all’università nel mio gruppo di amici, lo sono stata in Italia durante la mia prima esperienza lavorativa e lo sono stata anche qui in Svezia lavorando per il mio precedente datore di lavoro.\nDa qualche anno il numero di donne che lavorano nel settore scientifico-tecnologico è sicuramente in aumento. Ma non è abbastanza.\nSe non sistemiamo la questione parità di genere e patriarcato, non ne usciremo così velocemente. La questione è molto complessa e provare a sintetizzarla in qualche riga è impossibile\u0026hellip;\nContinuiamo a dividere i giochi in giochi da maschi e giochi da femmina e comportamenti che sono più consoni ai maschietti e meno alle femminucce.\nParte della nostra classe politica crede che il nostro posto sia prendersi cura della casa e della prole. Potrei continuare per ore ad elencare stereotipi radicati nella società: se non li sradichiamo vedo difficile ridurre il gender gap in ambito STEM.\n ", "url": "https:\/\/theredcode.it\/interviste\/full-stack-developer\/" }, "https:\/\/theredcode.it\/intelligenza-artificiale\/naive-bayes-e-sentiment-analysis-con-python\/": { "title": "Naive Bayes e Sentiment Analysis con Python", "tags": ["intelligenza-artificiale","machine-learning","nlp","python",], "content": " Come scrivere un programma in Python per distinguere tra una recensione positiva da una negativa o neutrale?\n  In questo articolo vediamo come usare Naive Bayes e Sentiment Analysis con Python sfruttando dei dataset in italiano.\n Il procedimento è valido per qualsiasi tipo di lingua: infatti, trattandosi di un metodo supervisionato, sarà sufficiente fornire un dataset in input che contenga dei testi già classificati; questo ci permetterà di adattare il procedimento a qualsiasi lingua!\n Intro  La sentiment analysis è un processo che permette di determinare se un testo esprime un contenuto positivo, negativo o neutrale. In altre parole, ci permette di chiedere al sistema di analizzare un testo e dirci che tipo di giudizio esprime.\n Non a caso, la sentiment analysis è spesso associata all’opinion mining: in che modo possiamo misurare il giudizio degli utenti su una certa tematica?\n I livelli di applicazioni di questo tipo di attività sono molteplici: nel settore dei social media, analizzare le emozioni degli utenti espresse tramite le varie reazioni o i post è fondamentale per finalità di marketing.\n Non solo: in campo politico, tenere traccia delle opinioni politiche sfruttando i social media permette di anticipare e gestire al meglio le campagne elettorali; un esempio di come farlo, ce lo insegna Obama durante la sua corsa alla Presidenza nel 2008.\n Gestire diverse lingue  L\u0026rsquo;analisi del sentiment sta diventando una parte sempre più importante della comunicazione a causa del numero crescente di persone che utilizzano attivamente i social media e i diversi canali online - attualmente contiamo circa 5 miliardi di persone per la precisione.\n Se si considera che solo il 25,9% degli utenti di Internet parla inglese come madrelingua, l\u0026rsquo;analisi del sentiment in lingue diverse dall\u0026rsquo;inglese diventa sempre più importante; ecco perché questo processo nella sola lingua inglese non è sufficiente.\n Riconoscendo che il sentimento è intrinsecamente legato alla lingua e alla cultura, riconoscere la lingua è un prerequisito fondamentale per questo tipo di analisi.\n Senza identificare la lingua di un post sui social media, un algoritmo non sarà in grado di decifrare le informazioni sul giudizio!\n Questa capacità, tuttavia, deve essere integrata nel modello utilizzato; semplicemente non è possibile coinvolgere dei linguisti umani per tradurre in inglese l\u0026rsquo;intero pool di post sui social media in lingua straniera e poi far assegnare loro un punteggio.\n Detto questo, è giusto sottolineare che l\u0026rsquo;analisi del sentiment multilingue coinvolge molte risorse ed è ancora difficile trovare strumenti che eseguano effettivamente questa attività in più di una lingua contemporaneamente\u0026hellip;\n Ma come fare in italiano?\n Classificare delle recensioni  Vediamo dunque come applicare l\u0026rsquo;analisi del sentiment per classificare delle recensioni; per farlo, utilizzeremo delle frasi tipo che descrivono il giudizio degli utenti rispetto ad un film che hanno appena visto.\n Per valutare il sentiment è possibile usare diversi algoritmi, tra i quali la regressione logistica o Naive Bayes; questi permettono di calcolare la probabilità che un commento o una recensione sia positivo o negativo, partendo da alcuni dati pre-esistenti.\n Se, ad esempio, leggessi la seguente recensione:\n  Film stupendo, pieno di colpi di scena, travolgente ed emozionante. Eccezionale!\n  saprei senza dubbio che si tratta di una recensione positiva.\n Anche nel caso in cui leggessi:\n  Non capisco cosa ci sia di tanto eccezionale in questo film\u0026hellip; tutti dicono che sia stupendo, ma è abbastanza banale.\n  è facile classificare il giudizio dell\u0026rsquo;utente come negativo.\n Questo evidenzia un problema: esistono dei casi in cui delle parole negative vengano usate in un contesto positivo.\n Quindi, non è sufficiente basarsi sulla presenza dei singoli termini positivi o negativi, ma è necessario calcolare la probabilità che un termine compaia in una recensione positiva o negativa che sia.\n Nella sentiment analysis è possibile usare dei metodi supervisionati e non: nel primo caso, si ha un dataset etichettato dove le recensioni sono classificate; nel secondo caso, si associa un punteggio ad ogni termine presente in una lista di parole che sono polarizzate come positive o negative.\n In questo caso d\u0026rsquo;uso, vediamo come sfruttare un metodo supervisionato avendo a disposizione dei dataset che sono già stati etichettati per classificare le recensioni come positive o negative (in fondo trovate tutti i riferimenti).\n In particolare, andremo ad utilizzare Naive Bayes: si tratta di un metodo supervisionato che calcola la probabilità che un testo sia polarizzato positivamente o negativamente sulla base del dataset fornito.\n Esempio  Per farlo, partiamo da un dataset molto semplice: lo scopo di questo articolo non è infatti trasformare il dataset, ma piuttosto, avendone uno pronto a disposizione, sfruttarlo per l\u0026rsquo;attività di sentiment analysis.\n In prima battuta, consideriamo quindi il seguente dataset:\n train2 = [(\u0026#34;E\u0026#39; stata una bella esperienza\u0026#34;, \u0026#34;positive\u0026#34;), (\u0026#34;Male recitato, male interpretato, pessimo\u0026#34;, \u0026#34;negative\u0026#34;), (\u0026#34;Il miglior film che ho mai visto, incredibile\u0026#34;, \u0026#34;positive\u0026#34;), (\u0026#34;Una perdita di tempo\u0026#34;, \u0026#34;negative\u0026#34;), (\u0026#34;Ben diretto, ben recitato, mi è piaciuto, bellissimo\u0026#34;, \u0026#34;positive\u0026#34;), (\u0026#34;Mi è piaciuta la fotografia e gli attori sono fantastici\u0026#34;, \u0026#34;positive\u0026#34;), (\u0026#34;Davvero deluso di questo film\u0026#34;, \u0026#34;negative\u0026#34;), (\u0026#34;Tutti i personaggi sono belli e ben interpretati\u0026#34;, \u0026#34;positive\u0026#34;), (\u0026#34;Purtroppo faceva schifo\u0026#34;, \u0026#34;negative\u0026#34;), (\u0026#34;Orribile e mediocre, sono orripilato\u0026#34;, \u0026#34;negative\u0026#34;)]  Ognuna di queste recensioni è stata classificata come positive o negative. Il dataset è molto piccolo, quindi il modello non sarà perfetto: sarà sufficiente utilizzare un dataset più completo!\n A questo punto, procediamo nel pre-processare i nostri dati: come primo step, andiamo a rendere in minuscolo tutte le parole contenute in ogni frase presente nel nostro dataset, e creiamo un dizionario a partire da questo:\n dictionary = set(word.lower() for passage in train2 for word in word_tokenize(passage[0])) Dizionario creato a partire dal dataset\nFatto questo, creiamo l\u0026rsquo;insieme di train, dove andremo a creare una sorta di mapping tra le parole presenti nelle diverse frasi; creiamo quindi un dizionario dove andiamo a segnare le parole che, a partire da dictionary, sono presenti in ogni frase:\n Nella prima frase sono presenti la parola \u0026ldquo;stata\u0026rdquo; e \u0026ldquo;bella\u0026rdquo;, che quindi vengono segnate come \u0026ldquo;True\u0026rdquo;\n A questo punto, passiamo il nostro set di parole al classificatore, che in questo caso sarà NaiveBayesClassifier: come parametro, gli forniremo proprio l\u0026rsquo;insieme di train appena creato.\n classifier = nltk.NaiveBayesClassifier.train(t)  Ci siamo quasi: il nostro classificatore ha usato i dati in input per creare un modello che adesso andremo a testare. Usiamo una frase fuori dal dataset iniziale e vediamo se riesce a classificare correttamente la recensione:\n test_data = \u0026#34;Questo libro era terribile, sono orripilato\u0026#34; test_data_features = {word.lower(): (word in word_tokenize(test_data.lower())) for word in dictionary} \u0026gt;\u0026gt; negative print(classifier.classify(test_data_features)) test_data2 = \u0026#34;Bellissimo, è stato incredibile\u0026#34; test_data_features2 = {word.lower(): (word in word_tokenize(test_data2.lower())) for word in dictionary} print(classifier.classify(test_data_features2)) \u0026gt;\u0026gt; positive  Ottimo! Il risultato, considerato il dataset iniziale, è un buono. Da non sottovalutare assolutamente di utilizzare dei dataset più completi: di seguito, alcune risorse utili per poter sfruttare dei dati in italiano per migliorare il modello appena creato.\n Risorse utili Dataset SENTIPOLC Dataset T4SA Codice completo  ", "url": "https:\/\/theredcode.it\/intelligenza-artificiale\/naive-bayes-e-sentiment-analysis-con-python\/" }, "https:\/\/theredcode.it\/tags\/python\/": { "title": "python", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/python\/" }, "https:\/\/theredcode.it\/categories\/python\/": { "title": "python", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/python\/" }, "https:\/\/theredcode.it\/voglio-diventare-un...-community-manager\/": { "title": "Voglio diventare un... Community Manager", "tags": ["interviste","voglio-diventare",], "content": "Se non hai mai sentito parlare del Community Manager, o non hai ben capito cosa sia, sei nel posto giusto: questa professione digitale ha preso piede nell\u0026rsquo;ultimo decennio in maniera più decisa, anche se si tratta di un ruolo che ha radici molto antiche.\n Per raccontarci il valore e i retroscena di questo mestiere, non potevamo chiedere a Innocenzo Sansone, Community Manager di moltissimi gruppi online e fisici e runner d\u0026rsquo;eccezione!\n A te il palco🎙️\nDescriviti in 100 parole.  Ciao Serena e ciao a tutte le lettrici e lettori 😀!\n Ho iniziato a programmare da bambino quando i miei genitori mi regalarono un Commodore 16. All\u0026rsquo;epoca le istruzioni dei computer erano veri e propri manuali di programmazione; sono partito da autodidatta e non ho più smesso di occuparmi di programmazione e tecnologia.\n Un’altra mia passione sono le maratone (42 km 195 m)! Cinque anni fa ho perso 40 kg camminando e poi ho iniziato a correre disputandone al momento ben 9!\n Ed ecco il mio lavoro ❤️: mi occupo da 15 anni a livello professionale di sviluppo e gestione di Community Dev \u0026amp; Tech per le principali aziende del settore.\n Se troverai interessanti le mie risposte, fai click qui 👉 www.innosans.it ed entriamo in contatto!\n In cosa consiste il ruolo di Community Manager?  Ho già letto in altre interviste del tuo blog di nuovi mestieri difficili da spiegare ai propri genitori 🤣. Ebbene, il Community Manager è uno di questi!\n Anzi ti dirò di più, molto spesso sono proprio le aziende che mi contattano per una consulenza o per lavorare alla propria Community a non avere le idee chiare su cosa il Community Manager faccia.\nOggi “avere una Community” o “fare attività con le Community” viene sempre più percepito come una necessità di business senza comprendere bene le differenze con altre attività e spingendo a commettere, a volte, gravi errori.\n Parlare di Community vuol dire prima di tutto parlare di Persone a cui bisogna dare del valore prima di aspettarsi un ritorno.\n  La “Community” non è un nuovo canale di Marketing!\n  Chi, invece, riesce a capirlo, investe nella propria Community, trasferisce valore a chi ne fa parte e ha la pazienza di farla crescere ne ottiene grossi benefici insieme ai propri membri.\n Spieghiamo velocemente cos’è una Community: è un gruppo di persone che contribuisce ad uno stesso interesse. Facciamo anche degli esempi: il gruppo dei runner di Roma, il gruppo italiano dei programmatori di PHP, il gruppo di chi pratica Yoga e così via..\n Molto spesso questi gruppi nascono in maniera naturale e spontanea, altre volte sono legate ad un progetto aziendale.\n In realtà, le Community sono sempre esistite! La prima forma di Community è stata la famiglia e partendo da qui si potrebbero fare tantissimi altri esempi di Community tradizionali.\n Ma perché oggi si parla sempre di più di Community come attività per cui è necessario un mestiere come quello del Community Manager?!\n Con l’avvento della tecnologia e dei mezzi di comunicazione e poi di Internet è stato sempre più facile comunicare!\n Le occasioni di incontrarsi e confrontarsi sono quindi cresciute esponenzialmente favorendo la costituzione di gruppi, a volte anche molto grandi, per contribuire ad uno stesso interesse.\n Non mi riferisco solo ai social network; l’avvento delle tecnologie di comunicazione e degli strumenti informatici ha reso più facile conoscere persone che condividessero i nostri stessi interessi, incontrarle di persona oltre che online, organizzare incontri per scambiarsi conoscenza e confrontarsi direttamente.\n Inoltre, ha reso semplicissimo rimanere in contatto e continuare a relazionarsi anche dopo. Sono nate le Community nell’accezione che conosciamo oggi.\n Una community può esistere in tantissimi modi differenti ma trovo focale il momento dell’Incontro, online e/o in presenza. E poi ci deve essere un posto dove comunicare in modo asincrono: una chat, un gruppo, un forum, un sito web e tantissimi altri strumenti che oggi ci sono messi a disposizione.\n Il Community Manager è colei/colui che gestisce gli strumenti, gli incontri, le attività della Community impegnandosi a farne rispettare finalità, valori e principi: ricordiamoci sempre che una Community è un gruppo di Persone!\n  Molto spesso il Community Manager fa nascere e crescere una Community, altre volte ne prende in eredità le sorti 😃.\n  Il ruolo del Community Manager può essere svolto per professione – quando si gestisce la community di un’azienda – o per passione – quando si gestisce un gruppo legato ad un proprio hobby o necessità.\n Sono solito definire il Community Manager che lo fa per passione e non per lavoro come “Community Leader”.\n In entrambi i casi, pur con accezioni differenti, è un lavoro molto impegnativo in quanto è caratterizzato dallo svolgere molte attività, ad un ritmo frenetico, coinvolge varie discipline e ti porta a confrontarti sempre con un mucchio di gente: certamente è il bello di questo mestiere ma che, a volte, ti fa venire voglia di scappare 😆.\n Negli anni mi sono costruito un modello del lavoro di Community Manager su cui si basa la mia attività e che sto cercando di affermare.\n Esso si basa su tre pilastri fondamentali che racchiudono tutte le mansioni che svolge il Community Manager: 1) Pubbliche Relazioni 2) Organizzazione 3) Comunicazione/Marketing specifici per la Community (da sviluppare parallelamente alla Comunicazione/Marketing tradizionale).\n Molto spesso il lavoro di Community Manager è inserito nei dipartimenti di Comunicazione/Marketing delle Aziende; a volte addirittura di Sales. Quello che sto cercando di far passare è che Community è un dipartimento a sé stante!\n Qual è la soft skill più importante che deve possedere un Community Manager?  Te ne posso citare almeno due?! 😝\n La prima è l’EMPATIA, cioè la capacità di immedesimarsi negli altri comprendendone punti di vista, pensieri e sentimenti.\n Gestire una Community, infatti, vuol dire avere a che fare continuamente con le Persone.\n Una Community accogliente è un posto dove tutti, con le proprie differenze, si possano sentire a proprio agio ed accolti, sia negli spazi online che in quelli fisici. Vuol dire, per esempio, cercare di coinvolgere anche i più timidi, chi di solito si mette in disparte.\n La seconda è la RESILIENZA, ossia la capacità di resistere anche a lungo ad una situazione difficile, a ritmi intensi e di saper reagire agli imprevisti. Essendo un lavoro che ha a che fare con le Persone, il rovescio della medaglia, è che molto spesso averci a che fare è molto impegnativo e logorante.\n Mi sono sempre chiesto se le soft skill fossero più legate alle peculiarità e alle attitudini delle persone oppure fossero capacità da poter apprendere e, esercitandosi, migliorare.\n Proprio svolgendo per molti anni il lavoro di Community Manager sul campo – più di 700 eventi fisici in 3 anni e più di 100 online in poco più di un anno – sono arrivato alla conclusione che la verità sta nel mezzo.\n Indubbiamente ci sono persone più portate all’empatia o alla resilienza di altre, ma spesso è così perché per più tempo hanno vissuto situazioni che hanno sviluppato in loro queste caratteristiche.\n Il lavoro del Community Manager sicuramente espone ad un contesto in cui, mettendosi con la giusta predisposizione, si possono accrescere queste qualità molto velocemente.\n Quando ho iniziato a fare il Community Manager, più di 15 anni fa, l’imprevisto mi spaventava terribilmente; oggi, invece, è ciò che rende il lavoro divertente e non monotono, una sorta di palestra!\nA volte credo proprio di essere diventato un maratoneta grazie a questo allenamento, perché correre 42 km è prima di tutto un lavoro di testa! Il segreto è non demordere mai!\n Anche l’empatia si può allenare: è sufficiente iniziare a guardarsi intorno piuttosto che allo specchio! Il segreto è quello di immedesimarsi negli altri per scoprirne esigenze e motivazioni; il proprio lavoro di Community Manager se ne avvantaggerà immediatamente, provarci per credere 😉.\n 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.  Quando un generale dell’antica Roma tornava dopo un trionfo bellico e sfilava nelle strade della Città per ricevere gli onori della folla aveva dietro di sé uno schiavo che gli diceva in continuazione: – Hominem te memento (”Ricordati che sei un uomo”) affinché non fosse sopraffatto dalle manie di grandezza. Frase conosciuta anche come “Memento mori”, uno dei miei motti preferiti!\n Quello che dici è assolutamente vero; il Community Manager, che suo malgrado è spesso al centro dell’attenzione, corre sempre un grosso rischio di essere sopraffatto dal proprio ego.\n Personalmente utilizzo i social soprattutto per informare sulle attività e cerco di essere sempre molto ironico quando c’è da “celebrare” non mentendo mai, in particolare sui numeri: le bugie hanno le gambe corte, si sa 😀.\n A volte non ho nemmeno il tempo di postare su quello che faccio! Un consiglio che mi sento vivamente di dare a tutti i futuri Community Manager è quello di fare tanto, e fare parlare gli altri di quello che fai 😉.\n Più che di un errore ti voglio parlare di quello che in tanti riterrebbero un grosso fallimento: dimettersi dal proprio lavoro di dipendente a tempo indeterminato e ritrovarsi da un giorno all’altro senza stipendio!\n È stata una decisione durata mesi e molto sofferta perché amavo il mio lavoro ed ero molto apprezzato nel mio ambito. Ma è stata una scelta necessaria perché erano cambiati in quel contesto certi valori per me fondamentali.\n Ecco, fallimento sì ma è stata la scelta giusta di cui non mi sono mai pentito perché credo che a volte il destino ci metta di fronte a responsabilità di cui dobbiamo farci carico.\n Quello che veramente mi è mancato sono stati i miei colleghi (non tutti eh 😆), i miei eventi e la mia Gente (quella proprio tutta!) ma sono molto orgoglioso di quello che ho costruito subito dopo.\n Comunque, di errori e “stupidaggini” ne faccio tutti i giorni. A volte anche molto divertenti!\n  Il Community Manager deve sbagliare di continuo per poter essere un bravo professionista!\n Come fare per diventare un Community Manager?  Di una cosa sono fortemente convinto: un bravo Community Manager padroneggia ed è appassionato dell’argomento della Community che gestisce!\n Vedo purtroppo sempre più persone che iniziano questo lavoro senza competenze specifiche sui temi che la propria Community tratta finendo per svolgere solo un lavoro di organizzazione.\n Come potranno essere pienamente di supporto, entrare a fondo nelle questioni, stimolare il dialogo con i membri della Community che gestiscono?!\n Al contrario, ci sono tanti Community Leader che partendo dalla propria passione hanno creato da soli e gestiscono Community di successo, anche se per loro non è un lavoro vero e proprio.\n Penso, quindi, che oggi in molti casi Community Manager si diventi seguendo le proprie attitudini tramite percorsi paralleli. Non è detto però che sarà per sempre così.\n Man mano che il peso della “Community” interpretata nella sua vera essenza crescerà in ambito aziendale, l’insieme delle attività di un Community Manager saranno meglio definite e ci saranno delle linee guida che potranno indirizzare in un percorso professionale fin dall’inizio.\n E così ci saranno tante bimbe e bimbi che diranno: “Da grande voglio fare la/il Community Manager!”.\n Oggi il lavoro di un Community Manager è ancora molto legato all’interpretazione data da ciascun professionista. È un processo creativo quotidiano più che una disciplina o un metodo.\n  Il Community Manager di successo è un artista nel mettere insieme gli strumenti, le materie che gli competono, le Persone.\n  Forse per questo mi piace così tanto come lavoro. Perché è un mestiere di sperimentazione e c’è molta creatività, tecnica e umana; un ponte tra due mondi che a volte sono ingiustamente ritenuti distanti.\n Il consiglio che posso dare a chi parte da zero è quello di entrare nelle Community legate ai propri interessi (ce ne sono di tutti i tipi) sforzandosi il più possibile di dare un contributo attivo e di lasciarsi coinvolgere nell’organizzazione della Community (un piccolo segreto, noi Community Manager adoriamo le persone più attive che ci possano sollevare da un po’ di lavoro 😉).\n A chi è già coinvolto nella gestione di una Community sia a livello amatoriale che professionale, consiglio di frequentare altri Community Manager, discutere dei problemi, delle attività, degli strumenti e chi più ne ha più ne metta!\n Non si finisce mai di imparare e solo l’esperienza rende ogni giorno un Community Manager un po’ più bravo del giorno precedente. Iniziano ad esserci tantissimi gruppi di Community Manager e io stesso ne ho creati alcuni 😉.\n In alcuni corsi di Marketing o di Comunicazione inizio a vedere spuntare la parola “Community”. Personalmente non penso che si possa raccontare esaustivamente cosa fare per gestire una Community in un singolo corso.\n Inoltre, penso che la Community non sia una parte di Marketing o Comunicazione ma piuttosto che sia una branca a sé stante.\n Mi batto sempre nelle aziende per cui lavoro 😀 per far capire che Community non deve essere inserita in questi dipartimenti ma è un dipartimento indipendente, che fa anche Marketing e Comunicazione ma in un modo differente e non in sostituzione di questi.\n Invece, trovo molto utile seguire corsi specifici sui singoli aspetti o strumenti che un Community Manager può utilizzare o su quelle discipline che è bene padroneggiare (tra cui Comunicazione e Marketing 😛).\n Infine, iniziano ad esserci anche delle certificazioni come quella creata da Facebook specifica per la propria piattaforma. Tutto è utile ma è importante avere ben chiaro che lavorare alle Community è un lavoro ancora in definizione, plastico! Quindi ci vuole tanta determinazione e voglia di innovare 💪.\n  Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Come ho raccontato in una delle domande precedenti, qualche anno fa mi sono ritrovato senza lavoro da dipendente da un giorno all’altro.\n Negli ultimi anni ho, quindi, sia cercato altre aziende dove potessi ricoprire il ruolo di Community Director, sia iniziato a sviluppare la mia attività di libero professionista per aiutare tante realtà a creare o sviluppare la propria Community Dev \u0026amp; Tech.\n All’inizio non è stato affatto facile ma adesso, pur non avendo trovando nessun posto da Community Director da convincermi, ho avuto la fortuna di iniziare a lavorare con diverse aziende illuminate e sviluppare progetti Community interessanti e innovativi.\n Quindi l’obiettivo per i prossimi tre anni è quello di fare cose ancora più importanti con questi clienti e le Community che sono nate continuando, nel frattempo, a sviluppare la mia attività e riuscire, se mai, ad assumere qualche “apprendista” per creare Community di successo e organizzare eventi e conferenze che aiutino gli sviluppatori ad avere successo nel proprio lavoro e nelle relazioni professionali.\n Inoltre, sto portando avanti due grossi progetti: The Communities Bay e MyCertCloud.\n The Communities Bay è il Network delle Community Dev \u0026amp; Tech italiane che ho fondato tre anni fa. Non una community di community ma una vera e propria rete nella quale i player possano crescere in sinergia tra di loro.\n È un progetto in cui sto investendo molto sia in termini di risorse che di tempo, che non ha un ritorno diretto ma tramite il quale, nei prossimi anni, voglio lasciare il segno nel nostro Paese con iniziative Tech e la collaborazione di Persone di valore.\n Abbiamo bisogno del vostro supporto! Vi invito a seguire The Communities Bay su www.thecmmbay.com/seguici 🙌\n MyCertCloud (www.mycertcloud.com) è uno dei tanti strumenti che mi sono costruito per il mio lavoro di Community Manager essendo ancora uno sviluppatore attivo soprattutto la notte 😀.\n È un servizio web tramite il quale è possibile generare, distribuire e verificare certificati digitali (attestati di partecipazione, di merito, badge, diplomi) per premiare chi partecipa ai miei eventi.\n Ce la sto mettendo tutta affinché nei prossimi tre anni MyCertCloud da “startup” self-run e self-funded possa diventare una vera Azienda 💪.\n Conosci il tema gender gap in ambito STEM? Se sì, cosa fai nel tuo piccolo per combattere questo problema e come pensi si possa arrivare a chiudere questo capitolo?   La scarsa presenza femminile nei contesti scientifici e tecnologici, quelli dell’istruzione e lavorativi per citare i principali, è un grave problema per il quale non dobbiamo smettere di impegnarci attivamente.\n  È sufficiente fare un salto, per esempio, in una qualsiasi Facoltà di Ingegneria oppure buttare l’occhio in qualche ufficio delle aziende tech per rendersi conto di quante poche donne siano presenti!\n Io stesso che organizzo tanti incontri online e di persona, eventi e conferenze, registro di continuo questo divario.\n La situazione attuale è dovuta ai retaggi di una doppia discriminazione del passato: quella nei confronti delle donne relegate alla cura della famiglia e alle faccende di casa e la scarsità di accesso alla tecnologia, un tempo molto costosa e per pochi.\n Fortunatamente sono passati tanti anni ed entrambe queste barriere sono state abbattute (almeno spero!) ma è rimasto il problema culturale. Le rivoluzioni culturali hanno bisogno di moltissimi anni dai cambiamenti per propagarsi e cambiare effettivamente le cose.\n Dobbiamo impegnarci ad accelerare questo processo. Ci sono molte donne, per esempio, che a torto pensano che la tecnologia non è qualcosa per loro e per questo non si avvicinano nemmeno.\n  Il contributo che possiamo dare in questi casi è raccontare di tante donne che hanno successo in questo campo perché i processi imitativi sono quelli di maggior impatto.\n  La Comunicazione è uno strumento molto potente ma proprio per questo non va utilizzato per finalità non giuste; essendo il tema del gender-gap sempre più sentito spesso le aziende lo utilizzano per farsi pubblicità senza mettere effettivamente in campo quei comportamenti necessari al cambiamento.\n Per me viene sempre prima il fare e poi il raccontare: la coerenza è un valore assoluto. “Dobbiamo coinvolgere in questo progetto delle donne perché ce lo chiedono gli investitori” è una frase che non mi voglio proprio più sentire dire. “Al diavolo gli investitori, le donne vanno coinvolte perché ce ne sono tante veramente brave!”: è questa la risposta da dare a simili richieste.\n Sono ottimista! Quello che fai e che fanno tutti i giorni tante donne impegnate in ambito tech \u0026amp; dev con iniziative speciali e il “normale” lavoro quotidiano è il catalizzatore migliore per la rivoluzione sociale e culturale iniziata oltre un secolo fa 💪👏.\n Contatti   Sansone Community The Communities Bay Profilo LinkedIn ", "url": "https:\/\/theredcode.it\/voglio-diventare-un...-community-manager\/" }, "https:\/\/theredcode.it\/intelligenza-artificiale\/misurare-la-distanza-tra-due-testi-con-python\/": { "title": "Misurare la distanza tra due testi con Python", "tags": ["intelligenza-artificiale","nlp","python",], "content": "Immagina di avere due stringhe e di voler vedere se queste due parlano dello stesso argomento: come fare?\n Riuscire a misurare la distanza tra due testi con Python può sembrare difficile, ma non se si hanno gli strumenti giusti: ci sono infatti diverse tecniche che è possibile sfruttare, come la coseno-similarità o il prodotto scalare.\n Come farlo? Vediamo un esempio pratico su come quantificare la distanza tra due stringhe!\n Intro  Partiamo da un concetto fondamentale: nell\u0026rsquo;ambito dell\u0026rsquo;analisi del linguaggio naturale, la vettorializzazione di un testo significa rappresentare un documento come un vettore, in cui gli elementi rappresentano il numero di occorrenze nel testo.\n Si tratta di un\u0026rsquo;attività fondamentale nel campo dell\u0026rsquo;information retrieval, per topic analysis e sentiment analysis.\n Ovviamente, c\u0026rsquo;è un\u0026rsquo;assunzione implicita: la vettorializzazione può essere applicata solo quando l\u0026rsquo;ordine delle parole non è importante; questo vuol dire che il significato del documento deriva dai termini che lo costituiscono e non dal contenuto stesso, come ad esempio nella classificazione o nell\u0026rsquo;estrazione di informazioni.\n In questo caso, convertire le frasi in una matrice di termini ci tornerà molto utile per poter calcolare la similarità tra due frasi e quindi rappresentarne le distanze tramite i valori.\n Come funziona  Un\u0026rsquo;analisi che permetta di misurare la distanza tra due testi si basa su tre fasi: indicizzazione di un documento, dove le parole vengono rappresentate in base all\u0026rsquo;ordine e vengono rimosse le stopwords, i termini vengono poi pesati in base alla frequenza e viene calcolato il coefficiente di similarità.\n Abbiamo già detto che esistono diverse tecniche per farlo: una di queste è la coseno similarità, che si basa su un concetto matematico: misura il coseno dell\u0026rsquo;angolo tra due vettori proiettati in uno spazio multidimensionale.\n Cosa vuol dire? Vuol dire che quanto più piccolo è l\u0026rsquo;angolo, maggiore è la somiglianza del coseno, e quindi tanto più il valore sarà prossimo all\u0026rsquo;uno, tanto più i due testi saranno simili; al contrario, se il valore dovesse avvicinarsi allo zero, vuol dire che i due testi saranno molto diversi.\n Un approccio comunemente usato per abbinare documenti simili si basa sul conteggio del numero massimo di parole comuni tra i documenti.\n Ma questo approccio ha un difetto intrinseco: all\u0026rsquo;aumentare delle dimensioni del documento, il numero di parole comuni tende ad aumentare anche se i documenti parlano di argomenti totalmente diversi.\n Come metrica di somiglianza, in che modo la somiglianza del coseno differisce dal semplice conteggio di parole uguali?\n Quando viene tracciata su uno spazio multidimensionale, dove ogni dimensione corrisponde a una parola nel documento, la somiglianza del coseno cattura l\u0026rsquo;orientamento (l\u0026rsquo;angolo) dei documenti e non quantifica la somiglianza su un\u0026rsquo;unica dimensione.\n Codice Python  Esistono diverse metodologie per misurare la coseno-similarità, e un\u0026rsquo;ottima soluzione è quello di utilizzare la libreria NLTK, che fornisce un metodo in grado di calcolare il calcolo tra due array.\n Passiamo al codice!\n Come primo step, importiamo la funzione dalla libreria NLTK e importiamo numpy, che ci tornerà utile per poter gestire i testi di cui vogliamo misurare la similarità:\n from nltk.cluster.util import cosine_distance import numpy as np  La prima cosa da fare è definire un metodo che ci permetta di fornire due stringhe in ingresso e un elenco di stopwords: questo renderà la nostra funzione trasversale a più situazioni e lingue, potendo fornire una lista di parole che vari all\u0026rsquo;occorrenza!\n def get_cosine_similarity(sentence1, sentence2, stopwords=None):  All\u0026rsquo;interno di questa funzione, andremo a fare un po\u0026rsquo; di attività di pre-processing: renderemo tutte le frasi in minuscolo, così da non creare bias nel calcolo della similarità:\n  if stopwords is None: stopwords = [] sentence1 = [w.lower() for w in sentence1] sentence2 = [w.lower() for w in sentence2]  Ultimo step per questa funzione è quello di definire una lista con tutte le parole presenti nelle due frasi all\u0026rsquo;interno di words_all: dopo aver creato due array, andremo a inserire al loro interno le parole presenti nelle due frasi escludendo le stopwords:\n  words_all = list(set(sentence1 + sentence2)) array1 = [0] * len(words_all) array2 = [0] * len(words_all) for w in sentence1: if w in stopwords: continue array1[words_all.index(w)] += 1 for w in sentence2: if w in stopwords: continue array2[words_all.index(w)] += 1  Ora è tempo di restituire il valore che verrà calcolato dalla funzione di NLTK: l\u0026rsquo;ultima istruzione prevede infatti che venga restituita la differenza tra uno e il risultato del metodo, così che XXX\n  return 1 - cosine_distance(array1, array2)  La coseno-similarità viene di solito rappresentata tramite una matrice, all\u0026rsquo;interno della quale i valori presenti sulla diagonale rappresentano la somiglianza tra una frase e sé stessa: ovviamente, questo valore sarà sempre uguale.\n Andiamo avanti con il codice: definiamo quindi una funzione che prenda sempre le frasi e le stopwords e che crei una matrice lunga e larga quanto la dimensione delle due frasi:\n def cos_sim_matrix(sentences, stop_words): matrix = np.zeros((len(sentences), len(sentences)))  Adesso, per ogni frase presente nell\u0026rsquo;insieme iniziale, andiamo a calcolare la coseno-similarità: un po\u0026rsquo; come se giocassimo a battaglia navale, immaginiamo che ad ogni riga e ogni colonna, corrispondano due frasi che, in duello tra loro, cercano di assomigliarsi.\n Per farlo, richiamiamo la funzione creata in precedenza e chiamata get_cosine_similarity:\n  for idx1 in range(len(sentences)): for idx2 in range(len(sentences)): if idx1 == idx2: # ignore if both are same sentences continue matrix[idx1][idx2] = get_cosine_similarity(sentences[idx1], sentences[idx2], stop_words) return matrix  Per provare il codice, andiamo a usare tre frasi: la prima e la seconda si assomiglieranno (cambia una sola parola tra le due), mentre la terza sarà totalmente dissimile.\n Per questo, ci aspettiamo che i valori siano molto alti per le prime due colonne e due righe, mentre siano più bassi nell\u0026rsquo;ultima casella della matrice:\n sentence1 = \u0026#34;This is a first sentence\u0026#34; sentence2 = \u0026#34;This is a second sentence\u0026#34; sentence3 = \u0026#34;I don\u0026#39;t know if it\u0026#39;s clear, but pineapple on pizza is oltrageous.\u0026#34; print(cos_sim_matrix([sentence1, sentence2, sentence3], []))  Il risultato che otteniamo è il seguente:\n [[0. 0.93675938 0.79159032] [0.93675938 0. 0.77740376] [0.79159032 0.77740376 0. ]]  Attenzione però: questo è solo uno dei metodi\u0026hellip; Dai un\u0026rsquo;occhiata alla libreria al modulo nltk.cluster.util, dove ci sono altri metodi che permettono di verificare se due frasi sono uguali, come la distanza euclidea!\n Codice completo  from nltk.cluster.util import cosine_distance import numpy as np def get_cosine_similarity(sentence1, sentence2, stopwords=None): if stopwords is None: stopwords = [] sentence1 = [w.lower() for w in sentence1] sentence2 = [w.lower() for w in sentence2] words_all = list(set(sentence1 + sentence2)) array1 = [0] * len(words_all) array2 = [0] * len(words_all) for w in sentence1: if w in stopwords: continue array1[words_all.index(w)] += 1 for w in sentence2: if w in stopwords: continue array2[words_all.index(w)] += 1 return 1 - cosine_distance(array1, array2) def cos_sim_matrix(sentences, stop_words): matrix = np.zeros((len(sentences), len(sentences))) for idx1 in range(len(sentences)): for idx2 in range(len(sentences)): if idx1 == idx2: # ignore if both are same sentences continue matrix[idx1][idx2] = get_cosine_similarity(sentences[idx1], sentences[idx2], stop_words) return matrix sentence1 = \u0026#34;This is a first sentence\u0026#34; sentence2 = \u0026#34;This is a second sentence\u0026#34; sentence3 = \u0026#34;I don\u0026#39;t know if it\u0026#39;s clear, but pineapple on pizza is oltrageous.\u0026#34; print(cos_sim_matrix([sentence1, sentence2, sentence3], []))  Risorse utili: - Analisi del linguaggio con Python - Apogeo\n- Addestramento NER con spaCy per new entry\n- Machine Learning in una settimana\n", "url": "https:\/\/theredcode.it\/intelligenza-artificiale\/misurare-la-distanza-tra-due-testi-con-python\/" }, "https:\/\/theredcode.it\/interviste\/federica-ferraro\/": { "title": "Voglio diventare una... UX\/UI Designer", "tags": ["interviste","voglio-diventare",], "content": "Federica rappresenta una di quelle persone a cui la parola tenacia sta proprio bene indosso: nata in una società dove avere un obiettivo nella vita è fondamentale, non si è fatta scrupoli nel fare tutte le esperienze possibili e trovare ogni volta una strada diversa, la sua strada.\n In questo episodio, Federica ci racconterà cosa vuol dire diventare una UX/UI Designer: un mestiere che richiede molta creatività, ma anche capacità di comprensione e ascolto, oltre che empatia.\n Descriviti in 100 parole.   Mi chiamo Federica Ferraro e sin da bambina non ho mai avuto chiaro cosa volessi fare nella vita.\n  Le mie passioni erano incentrate nel settore della comunicazione e del design. Così, con molta incertezza sul mio lavoro futuro, ho intrapreso una carriera universitaria in Interpretariato e Traduzione, per poi specializzarmi in Scienze Linguistiche.\n Però, più studiavo e più mi rendevo conto dell’incredibile gap tra ciò che mi veniva insegnato e ciò che invece richiedeva il mondo del lavoro. Mossa forse da tanta (troppa) ambizione mi sono trasferita in Inghilterra per aprire un ristorante di pasta fresca biologica. Un’esperienza che ad oggi rifarei ad occhi chiusi (con qualche conoscenza e consapevolezza in più).\n Mi sono resa conto ben presto che il lavoro dell’imprenditore non era nelle mie corde e praticamente mi sentivo sempre più persa. Ho sofferto di depressione per qualche anno per poi riprendermi in seguito al mio rientro in Italia, dove ho svolto un master in web marketing per poi specializzarmi ulteriormente in UX/UI Design.\n Prima di definire il mio percorso ho impiegato qualche tempo per comprendere davvero quale fosse la mia vocazione: principalmente perché mi ritengo una persona multipotenziale, un concetto reso noto da Emilie Wapnick grazie al suo TED Talk, ossia una persona con una forte curiosità intellettuale, opposta ad uno ruolo specialista.\n In cosa consiste il ruolo di UX/UI Designer?  Oggi lavoro per una multinazionale e come UX/UI Designer mi occupo principalmente di comprendere le esigenze degli utenti e di capire con loro il modo migliore per modificare un servizio o un prodotto. Si lavora principalmente in team, ma la parte più operativa la porto a termine ovviamente da sola per poi ricondividere con il team il lavoro e presentarlo insieme al cliente finale.\n Quello che preferisco nel mio lavoro è fare ricerca: sulle nuove tecnologie, analizzando i dati, facendo interviste e workshop per trovare la soluzione migliore ai bisogni degli utenti. Di recente mi sto occupando anche dei mockup che richiedono conoscenze più tecniche di software come Adobe XD o Figma.\n Qual è la soft skill più importante che deve possedere una UX/UI Designer?  Come mi piace sempre dire: le hard skill si possono sempre imparare, non ho mai avuto difficoltà in questo. Su alcune cose forse possiamo impiegare più tempo perché particolarmente ostiche o complesse per il nostro modo di pensare, ma se spiegate con la giusta pazienza e in affiancamento, le competenze tecniche sono sempre acquisibili.\n Quello che invece è più complesso da imparare (e in questo sono fortunata perché la natura me le ha donate) sono le soft skill: prima fra tutti, l’empatia.\n  Non puoi condurre un workshop o un’intervista se non possiedi empatia e non sei incline all’ascolto.\n  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.  Non so se definirlo un fallimento, ma avere aspettative troppo alte è purtroppo il mio punto debole. È qualcosa che mi accompagna da tempo.\n Il consiglio che dò a me stessa sempre è “non aspettarti niente e non ci resterai mai male”. Ad esempio, quando un progetto viene interrotto, dopo che ci hai lavorato per tanto tempo e poi purtroppo ti viene detto che non potrà essere implementato per taluni motivi, cerco di non farne una questione personale, ma di vedere il lato positivo.\n Come fare per diventare una UX/UI Designer?  Questa domanda me l’hanno fatta in tanti. In realtà, a mio avviso, non servono certificazioni, ma corsi certamente sì.\n  Gli strumenti si apprendono con l’esperienza, che è alla base di tutto il lavoro.\n  Ciò che ho appreso è che non si smette mai di studiare e di imparare, perché può arrivare sempre un nuovo software o una nuova piattaforma che supera le precedenti. Sconsiglierei questo lavoro a chi non è appassionato di tecnologia e non ama seguire i nuovi trend.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Molto interessante questa domanda! Migliorarmi sempre di più e comprendere sempre meglio tutte le fasi del design, passando per tutti gli step di un progetto: dal service, alla research, dalla user experience, alla user interface, ai test, ecc..\n Conosci il tema gender gap in ambito STEM? Se sì, cosa pensi sia possibile fare -anche nel tuo piccolo- per combattere questo problema?  Certamente. Credo fortemente che le donne siano ancora troppo poche nel settore IT, come veniva chiamato una volta.\n Un problema che però esiste da anni. Secondo la mia esperienza, è importante che vada prima arginato il muro culturale che c’è in Italia.\n Fortunatamente molte aziende si occupano di fare divulgazione nelle scuole, spiegando l’importanza di conoscere anche ambiti oltre quelli considerati tradizionali soprattutto per le giovani donne.\n Come sostengono molti psicologi, il ruolo maggiore lo giocano la società, l’ambiente e la famiglia nello sviluppo di un individuo. E in tutto ciò possiamo sempre contribuire con una comunicazione efficace.\n Grazie Federica per questo bellissimo contributo!\n", "url": "https:\/\/theredcode.it\/interviste\/federica-ferraro\/" }, "https:\/\/theredcode.it\/recensioni\/digital-forensics\/": { "title": "Digital Forensics", "tags": [], "content": "La Digital Forensics è una scienza che qui in Italia ha -purtroppo- poco seguito: è difficile infatti trovare qualcuno che sia esperto in questo campo. Ma chi di noi non ha mai sognato di fare il lavoro di Penelope Garcia in Criminal Minds? Diamo quindi un\u0026rsquo;occhiata a questo volume di Apogeo dedicato proprio alla Digital Forensics!\nRanking Anno 2021 Autore Darren R. Hayes Genere Saggistica Livello Per tutti Scorrevolezza 8 / 10 Originalità 10 / 10 Valutazione 8.5 / 10 Recensione Se sei appassionata o appassionato di Criminal Minds, NCIS o Lie to Me, questo è il libro per te. Attraverso una serie di sezioni ben distinte, potrai attraversare e scoprire la carriera di un esperto di Digital Forensics: come scovare delle immagini modificate, furti di identità e molto altro. L\u0026rsquo;approccio prettamente pratico è sicuramente quello che più è possibile apprezzare di questo volume: vengono riportati molti software (free e non) che possono aiutare nelle attività forensi. Altra nota positiva è sicuramente quella che riguarda i casi di studio: sfruttando degli episodi reali di attività illegali, è possibile toccare con mano tutte quelle che sono le procedure utilizzate durante le indagini dagli esperti.  Questo libro permette infatti di compiere un viaggio bellissimo dietro a quelli che è il mestiere di Garcia di Criminal Minds: sia che si tratti di hardware che di software, il volume mostra in che modo comportarsi e quali procedure attivare per poter essere dei perfetti esperti di scienza digitale forense. Avviso ai navigatori: alcuni dei casi riportati sono davvero da brividi, e non nel senso positivo del termine\u0026hellip; Spesso sono citati solo nomi e situazioni, senza approfondire i dettagli, che però sono disponibili online per i più curiosi. Invece, il capitolo 12 è interamente dedicati ai case study: serial killer, hacker, omicidi e soprattutto il cyberbullismo sono solo alcune delle tematiche trattate. Probabilmente quest\u0026rsquo;ultima è quella più attenzionata, ed è l\u0026rsquo;aspetto più lodevole: l\u0026rsquo;autore non si risparmia nel trattare questo fenomeno come un serio problema da affrontare e combattere, riportando situazioni reali e relative indagini, legislazione e come agire.\n Piccolo, ma non insignificante dettaglio: il tutto è riportato alle attuali legislazioni vigenti negli Stati Uniti, essendo l\u0026rsquo;autore americano.\n La realtà è che questo mestiere in Italia non ha ancora preso piede: si tratta di una professione non ancora riconosciuta, anche per via dei costi necessari alla formazione e alla messa in uso dei laboratori, che richiedono molti strumenti dai costi spesso non sostenibili. Nessuna delle sezioni dà per scontate le conoscenze informatiche di base: per chi non ha competenze in materia di sistemi operativi, reti, memoria e via dicendo, la parte introduttiva di ogni capitolo è dedicata a fornire il contesto adatto. Ogni capitolo è poi ricco, oltre che di esempi, ma anche di esercitazioni per poter mettere in pratica i concetti e gli strumenti illustrati, attraverso case study ed esempi che fanno riferimento a situazioni reali. Il libro è molto aggiornato, arriva a trattare quasi tutte le ultime versioni dei sistemi operativi disponibili (ad esempio, Windows 10 è l\u0026rsquo;ultima distribuzione trattata) e dedica un intero capitolo alla Mobile Forensics, che sicuramente è un tema molto interessante. Infatti, tutti gli attuali smartphone sono trattati come sistemi di archiviazione e sappiamo bene che ormai all\u0026rsquo;interno del telefono di ognuno di noi ci sono dati estremamente sensibili. Saper eseguire degli esami sui dispositivi mobili, quali sono le specifiche e i relativi sistemi operativi è fondamentale, e anche in questo caso vengono fornite indicazioni sulla documentazione da produrre. Il libro è davvero ben curato, esaustivo e forma un vero e proprio manuale da tenere pronto all\u0026rsquo;uso per quando si inizierà a lavorare in questo campo!\nLezione imparata   Strumenti come The Sleuth Kit e Autopsy sono molto utili per esaminare file system e volumi disco (e sono anche open source); PALADIN è una distro linux per il triage che permette di esaminare sistemi Mac, Windows, Android e Linux dove Autopsy è già incluso; Tails è un sistema operativo perfetto per chi vuole avere il totale anonimato; System Status è perfetto per chi vuole effettuare della diagnostica su dispositivi mobile Apple e dal punto di vista forense permette di analizzare tutti i processi in esecuzione, anche quelli in modalità stealth; C\u0026rsquo;è un\u0026rsquo;intera sezione dedicata a come funziona l\u0026rsquo;esame di una scena del crimine: spiega quali strumenti sono necessari, cos\u0026rsquo;è utile portarsi, come muoversi\u0026hellip; pazzesco! Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/digital-forensics\/" }, "https:\/\/theredcode.it\/professioni\/essere-un-ingegnere-donna\/": { "title": "Essere un ingegnere donna", "tags": ["general",], "content": "Stavolta, un articolo diverso dal solito: parliamo di cosa vuol dire essere un ingegnere donna in questo pazzo mondo e cosa fare, nel concreto, per crescere una generazione che apprezzi l\u0026rsquo;inclusione senza neanche farne un \u0026ldquo;problema\u0026rdquo;.\n Parliamo di gender gap in ambito STEM.\n Intro  All\u0026rsquo;età di 12 anni, uno dei docenti della mia classe nella scuola media stabilì dopo un\u0026rsquo;interrogazione che \u0026ldquo;la matematica non faceva decisamente per me\u0026rdquo;.\n All\u0026rsquo;età di 14 anni, uno dei docenti del mio liceo mi prese in giro quando dissi che da grande avrei fatto l\u0026rsquo;ingegnera, perché \u0026ldquo;potresti studiare lingue, che è più semplice\u0026rdquo;.\n All\u0026rsquo;età di 18 anni ho cambiato scuola, giusto in tempo per fare l\u0026rsquo;ultimo anno, dopo che l\u0026rsquo;ennesimo docente aveva rovinato la mia esperienza scolastica con l\u0026rsquo;ennesima molestia.\n Quando sono entrata all\u0026rsquo;università, sono arrivata quarta su tutti i ragazzi e ragazze -e prima tra le ragazze- che hanno fatto il test di ingresso, e nonostante questo, il professore di informatica mi accusò di aver \u0026ldquo;barato\u0026rdquo; durante un esame perché era perfetto, e mi bocciò.\n Ho cambiato università, e ho trovato -non sempre, ma quasi, per fortuna- un ambiente molto più inclusivo, dove comunque il numero di ragazze che frequentavano i corsi erano inversamente proporzionali all\u0026rsquo;anno di iscrizione: molte delle mie coetanee abbandonavano perché \u0026ldquo;non mi sento in grado\u0026rdquo;, \u0026ldquo;tanto non passo mai un esame\u0026rdquo;, o ancora \u0026ldquo;non capisco niente e non voglio perdere tempo\u0026rdquo;.\n Lo so. Sembra che la sfortuna abbia trovato una vittima perfetta, ma non lo sono né mi sono mai considerata tale.\n Queste sono solo alcune delle storie che sono certa che altre mille ragazze prima di me abbiano vissuto sulla propria pelle in altrettante sfumature, e che in qualche modo abbiano leso l\u0026rsquo;autostima di ognuna di esse.\n Quante volte mi e ci siamo sentite dire \u0026ldquo;Questo settore è davvero difficile, sei pronta?\u0026rdquo; e \u0026ldquo;Sai che probabilmente sarai l\u0026rsquo;unica donna nella maggior parte delle tue lezioni, giusto?\u0026rdquo;\n E questo vale non solo in ambito istituzionale, ma professionale: mi è capitato di essere trattata come l\u0026rsquo;ultima ruota del carro non perché l\u0026rsquo;ultima arrivata, ma perché \u0026ldquo;non all\u0026rsquo;altezza\u0026rdquo;.\n All\u0026rsquo;età di 23 anni, mi è stato detto che avrei potuto fare domanda in moltissime multinazionali nel settore IT perché \u0026ldquo;tutte le aziende tecnologiche stanno cercando di assumere donne per aumentare la loro inclusività\u0026rdquo;. Unico requisito, in pratica: essere donna.\n All\u0026rsquo;età di 24 anni, dopo aver portato a termine l\u0026rsquo;ennesimo progetto, mi sono sentita dire: \u0026ldquo;wow, hai fatto tutto da sola? Ti ha aiutato il collega X, immagino\u0026rdquo;, come se fosse stupefacente che fossi in grado di reggere un carico di lavoro in totale autonomia.\n Mi sono sentita dire, in tempi non recenti, che \u0026ldquo;peccato essere così intelligente, ma così poco carina\u0026rdquo;.\n Sia chiaro: condivido queste storie non per vergogna e per cercare pietà, né per fare la vittima, ma per aumentare la consapevolezza e la comprensione.\n Mi è capitato tanto, troppo spesso, di avere delle conversazioni con amici e colleghi di ogni età e genere, e di sentire esclamazioni dubbiose e sguardi stupiti, come se cose del genere fossero fuori dalla realtà.\n La cosa divertente è che guardo indietro a tutti questi momenti (e molti altri che non ho intenzione di condividere qui) e penso a quanto sono fortunata: quanto sono fortunata che non sia andata peggio, com\u0026rsquo;è successo a molte altre donne che conosco.\n  Come sono stata fortunata perché, per ogni commento negativo, ci sono stati amici e colleghi che mi hanno spronato ad andare avanti e che non si sono mai posti \u0026ldquo;il problema\u0026rdquo;.\n  Nel corso delle interviste dello scorso anno sui mestieri digitali -proseguiranno anche quest\u0026rsquo;anno, promesso- , ho sempre chiesto alle ragazze intervistate dell\u0026rsquo;esperienza come donna nel settore della tecnologia e cosa poter fare concretamente per aiutare le donne\u0026hellip;\n E mi sono fermata a pensarci: onestamente, non avevo una mia risposta e, dopo aver dedicato del tempo a pensarci di più, ho deciso di poter fare di molto meglio.\n Quindi, se quanto raccontato finora ti ha lasciato un po\u0026rsquo; di amaro in bocca, e ti stai chiedendo cosa puoi fare per aiutare, dai una chance alle prossime righe.\n Infondere consapevolezza  Potrebbe sembrare una banalità, ma uno dei problemi principali della scarsa presenza di donne in ambito STEM è dovuto alla mancanza di autostima: questo significa che, a seconda delle persone, non tutte le ragazze si sentono pronte a lanciarsi in questo mondo di matti, o meglio, non sanno da dove cominciare.\n Come fare? Se conosci un\u0026rsquo;opportunità di lavoro che sarebbe perfetta per qualcuno, condividila.\n Se conosci un podcast in cerca di un\u0026rsquo;ospite, fai il ​​suo nome.\n Se qualcuno che conosci ha scritto un libro o un post sul proprio blog che hai trovato interessante, condividilo con la tua rete. Le possibilità in questo senso sono infinite ed è così facile alzarsi e spargere la voce. Non sottovalutare la potenza della tua voce e il peso della tua parola.\n Il principio è sempre lo stesso: e vuoi aiutare, incoraggia. Tante donne che conosco stanno raggiungendo grandi traguardi ogni giorno, ma sono troppo umili o troppo tranquille o troppo spaventate o semplicemente non pensano che sia abbastanza impressionante da condividere quando lo è davvero.\n Educa te stess* in modo da poter educare gli altri  Negli ultimi due anni si è parlato tanto del tema dell\u0026rsquo;inclusività: è vero che la maggior parte di noi non si ritrova più vicino alle macchinette del caffè che ci permettevano di socializzare più facilmente, ma è comunque importante creare un ambiente inclusivo, anche e soprattutto nel mondo virtuale.\n Adoro il recente focus sull\u0026rsquo;uso di un linguaggio più inclusivo, come porsi il problema di includere femminile e maschile di ogni professione o nome, come prestare attenzione al modo in cui diamo spazio alle donne sulle varie piattaforme per parlare e raccontarsi.\n  Non che una donna abbia per forza bisogno di un\u0026rsquo;altra donna nel lavoro per potersi realizzare: quello vale solo quando si deve andare in bagno! (Scherzo, sia chiaro\u0026hellip;)\n  Se qualcuno sta pubblicando commenti sessisti, denuncialo. Se assisti ad un commento sprezzante, un comportamento scortese, qualsiasi tipo di molestia, ecc., dì qualcosa. Se ritieni che le persone intorno a te non conoscano abbastanza l\u0026rsquo;argomento, non avere paura di farti avanti: la tua parola ha più peso di quanto pensi.\n Ci sono inoltre moltissime community che lavorano in questa direzione e che hanno bisogno di costante supporto: fare volontariato, farsi avanti per portare dei talk o organizzare degli eventi, è un modo utile per chi in prima persona si mette in gioco, e per chi ha bisogno di vedere qualcuno che ce l\u0026rsquo;ha fatta. E a questo proposito\u0026hellip;\n Istituire delle role models  Diversi studi (riferimenti tra le risorse utili) hanno riportato che le donne che hanno sostenuto un test in ambito STEM dove l\u0026rsquo;esaminatrice era donna non hanno subito un calo delle prestazioni rispetto alle donne il cui test è stato somministrato da un uomo.\n Può sembrare una banalità, ma avere una figura a cui ispirarsi è fondamentale per la crescita di ogni bambino: quanti/e di noi hanno sognato di diventare superoi/ne perché avevano visto un personaggio che li ispirava a fare di meglio?\n Non c\u0026rsquo;è bisogno che queste role models siano in una posizione lavorativa molto più alta della nostra: questi modelli possono anche essere tratti da gruppi di pari, che anzi, ci avvicinano all\u0026rsquo;obiettivo.\n Sebbene sia i modelli di ruolo femminili che quelli maschili possono essere efficaci nel reclutare donne nei campi STEM, i modelli di ruolo femminili sono più efficaci nel promuovere un maggior coinvolgimento delle donne in questi campi.\n La prima fase è proprio lavorare sulla scuola: creare delle attività che mettano in contatto gli studenti e le studentesse con professioniste e professionisti di ogni genere è fondamentale; non è da sottovalutare anche il fatto che le stesse insegnanti possono anche fungere da modelli per le ragazze.\n Tantissimi studi sul sistema scolastico in Europa (e non solo) hanno dimostrato che la presenza di insegnanti che siano in grado di andare oltre gli stereotipi e portare esempi di donne \u0026ldquo;che ce l\u0026rsquo;hanno fatta\u0026rdquo; influenza positivamente la percezione delle ragazze in materia di STEM e aumenta il loro interesse per le carriere in questo settore.\n In questo senso, moltissime community si stanno facendo avanti con iniziative importanti che portano alla luce e su un palco virtuale alcune donne che nel settore informatico hanno fatto una carriera brillante: è il caso di SheTech e di FuzzyBrains, o anche delle Django Girls.\n Conclusione  Per coloro che si potrebbero essere preoccupati o preoccupate per alcuni degli aneddoti che ho condiviso sopra, vi avviso: non ce n\u0026rsquo;è bisogno.\n Nonostante tutte le avversità e le frustrazioni che posso aver vissuto, ho imparato a darmi una pacca sulla spalla e guardare sempre oltre questi \u0026ldquo;incidenti\u0026rdquo; di percorso.\n Sono qui, ho un blog a cui dedico molto del mio tempo libero, ho scritto 4 libri (finora), ho conseguito la laurea che sognavo, ho un lavoro che mi stimola e dei colleghi fantastici; collaboro con moltissime community e cerco di fare la mia parte -e comunque non è mai abbastanza-.\n Sia in ambito lavorativo che istituzionale, ho trovato un sistema di supporto davvero incredibile durante il mio viaggio nella tecnologia e trovato alcuni colleghi, professori e amici piuttosto incredibili e di supporto lungo la strada, che hanno bilanciato tutto il negativo che c\u0026rsquo;è stato.\n In questo senso, per fortuna, posso dire che nel 2022 stiamo facendo passi da gigante e che vedere dove sono e dove siamo è un ottimo risultato, ma abbiamo ancora molta strada da fare.\n Moltissime realtà lavorative si sono adeguate e ci stanno mettendo la faccia nel promuovere iniziative che siano davvero inclusive, e non solo per far quadrare i conti in termine di personale.\n Anche la rete sta diventando un posto migliore, dove ci sono tanti colleghi che si fanno avanti e si fanno promotori di queste cause, nella speranza che questo sia presto solo un brutto ricordo.\n  E poi, ciò che non ci uccide ci rende più forti, giusto?\n Risorse utili https://shetechitaly.org/2020/12/11/donne-e-stem-un-divario-da-colmare/ https://web.archive.org/web/20190307215521/http://pdfs.semanticscholar.org/e7c1/ec1f75f97bce1006b71e7d95651261a86809.pdf https://web.archive.org/web/20200229051313/http://pdfs.semanticscholar.org/e035/cfa564e19dd94d49395f8d73122c5f619b55.pdf https://www.semanticscholar.org/paper/When-Do-Female-Role-Models-Benefit-Women-The-of-in-Drury-Siy/75cc8cebf24f5e6cf12f780aefdc87d5b21ee556 https://doi.org/10.1177%2F0956797619892892  Community https://djangogirls.org https://www.fuzzybrains.org/it/ https://shetechitaly.org/ https://techprincess.it/ https://www.meetup.com/it-IT/SheSharp/ http://codetochange.org/  ", "url": "https:\/\/theredcode.it\/professioni\/essere-un-ingegnere-donna\/" }, "https:\/\/theredcode.it\/tags\/general\/": { "title": "general", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/general\/" }, "https:\/\/theredcode.it\/categories\/professioni\/": { "title": "professioni", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/professioni\/" }, "https:\/\/theredcode.it\/voglio-diventare-un...-mobile-developer\/": { "title": "Voglio diventare un... Mobile Developer", "tags": ["interviste","voglio-diventare",], "content": "Il Natale è finito, abbiamo mangiato a volontà e ora il pensiero va subito alla dieta da iniziare lunedì (prossimo): come fare per smaltire cena e pranzo di Natale?\n Basta scaricare l\u0026rsquo;app di Gruppetto e organizzare un\u0026rsquo;uscita in bici! Forse non tutti sanno che una persona di 90 kg brucia in un\u0026rsquo;ora di bicicletta tra le 270 e le 370 calorie, quindi è facile dire addio al panettone di troppo!\n Scopriamo quindi come i ragazzi che hanno lavorato all\u0026rsquo;app hanno avuto l\u0026rsquo;idea e come l\u0026rsquo;hanno progettata, vedendo insieme a loro il mestiere del Mobile Developer!\n Presentatevi in meno di 100 parole Danilo Borroni: ho partecipato per alcuni anni alle più importanti competizioni a livello mondiale e per me essere founder di Gruppetto è un obiettivo che si realizza perché sono certo che sia uno sport che permetta di esprimere a 360 gradi la propria libertà e poterlo fare in compagnia è ancora più stimolante.\n Simone Valenziano: sono ciclista amatore da più di 10 anni e lavoro come CTO presso operaLogica, software factory che affianca Gruppetto nel percorso di sviluppo e comunicazione del progetto di startup.\n Luca Sacchetti: ho alle spalle 20 anni di ciclismo agonistico (tra cui un anno da professionista nella ex squadra Continental Marchiol) attualmente lavoro a Milano ma appena posso il mio tempo libero è dedicato alla bici.\n Cos’è Gruppetto?  La startup Gruppetto ha ideato una tecnologia intuitiva che unisce in una sola applicazione la passione per il ciclismo, la socializzazione e le funzionalità utili per competere a livello amatoriale ma anche agonistico.\n  Questo per incentivare, oltre ai professionisti del ciclismo, anche chi si approccia a questo mondo come principiante.\n  Gruppetto ha due funzionalità essenziali: creazione del Gruppetto, per condividere la ride con i propri amici o altri ciclisti oppure la funzione “Esplora” che permette all’utente di trovare nella zona desiderata il Gruppetto che fa al caso suo per livello di esperienza, genere e tipologia di percorso e di parteciparvi.\n Gruppetto App permette di organizzare un’uscita di allenamento e di chiedere a tutti gli amici se vogliono unirsi.\n Inoltre organizzando dei Gruppetti aperti a tutti è possibile anche socializzare con i ciclisti locali che organizzano le loro uscite nelle strade di casa, le quali molto spesso sono praticate in gruppi più o meno numerosi composti dai propri amici o da persone che si incontrano lungo la strada.\n  Esiste anche una sezione più social, pensata per incentivare le persone ad appassionarsi a questo sport ma anche a conoscere nuove persone, per uno scambio divertente di esperienze.\n Simone: Abbiamo scelto Flutter come framework di sviluppo mobile per essere veloci a garantire i nostri utenti novità ed efficienza.\n La scalabilità, per aumentare la potenza infrastrutturale, ci viene garantita da un architettura a microservizi costruita in .NET e chi meglio di Kubernetes per organizzare ed ospitare i nostri servizi.\n Come database abbiamo scelto un banca dati documentale come Ravendb per rendere sempre più dinamiche le nostre funzioni.\nGruppetto è già disponile sugli store Apple e Android ed è possibile scaricarla gratuitamente e con accesso a tutte le funzionalità utili per pedalare in compagnia, affrontare le ride con i propri amici e trovare i Gruppetti organizzati in zona.\n Inoltre creando il proprio profilo si potranno ricevere le informazioni sui prossimi sviluppi premium che prevedono uno sviluppo sempre più orientato alle gare e alla competizione.\n  Come nasce l’idea? Danilo “L’idea è nata durante il primo lockdown, quando io come molti altri appassionati di ciclismo, eravamo obbligati a pedalare sui rulli, in casa, da soli.\n Questo mi ha fatto apprezzare ancora di più le uscite in compagnia che sembravano un sogno. Il progetto di creare un’app che mettesse in contatto appassionati di ciclismo, è diventato concreto quando il giorno di Pasqua del 2020 ho condiviso con Simone quest’idea sotto forma di applicazione.”\n Simone “Quando Danilo mi ha parlato del progetto di creare un’app per condividere e organizzare giti in bici, da ciclista, mi è subito venuta in mente la parola “Gruppetto”.\n  Una parola universale e immediata che indica dei ciclisti che decidono di incontrarsi per affrontare insieme la fatica delle ride. Quale nome migliore per spiegare l’obiettivo della nostra nuova app?”\n  Da quel momento abbiamo lavorato per costituire la startup Gruppetto insieme a operaLogica, software factory di Garbagnate Milanese.\n Insieme al team di sviluppatori e UX Designer di operaLogica abbiamo ideato una tecnologia intuitiva che unisce in una sola applicazione la passione per il ciclismo, la socializzazione e le funzionalità utili per competere a livello amatoriale ma anche agonistico. “\n Danilo “Sabato 27 novembre 2021, dopo più di un anno di lavoro anche lato brand e comunicazione, abbiamo lanciato l’app durante un evento organizzato in Cicli Drali Milano e ora siamo pronti al rilascio di nuove funzionalità. “\nQual è stata la parte più difficile nel portare a termine il progetto dell’app?  La parte più difficile del progetto è stato lo sviluppo perché le funzionalità utili sono tante e inserirle in una progettazione rapida mantenendo un’esperienza intuitiva è stato complesso.\n Il team ha lavorato molto negli ultimi 6 mesi per garantire la piena funzionalità dell’applicazione prevista per il lancio che è ha visto il download di più di 3000 utenti in neppure 2 settimane.\n  È stato un gran lavoro di squadra di cui andiamo molto fieri.\n  Qual è la roadmap che avete seguito finora? L’applicazione mobile Gruppetto è stata progettata seguendo le fasi del Design Thinking e applicando una metodologia User-centered.\n Abbiamo indagato i bisogni degli utenti attraverso un questionario online, che ci ha permesso di scoprire le principali motivazioni che avrebbero spinto i ciclisti ad usare l’app.\n Analizzando i risultati della survey, abbiamo definito le personas per rappresentare le principali tipologie di utenti e successivamente individuato i requisiti dell’applicazione.\n La realizzazione dei wireframe ha stabilito la struttura e la gerarchia degli elementi, per poi passare al design dell’interfaccia grafica vera e propria seguendo un Design System coerente.\n È arrivato poi il momento di valutare l’usabilità dell’app: siamo andati in un negozio di biciclette a Milano per testare l’app con gli utenti reali. Grazie alla valutazione cooperativa, abbiamo raccolto feedback e nuovi suggerimenti in un processo di costante miglioramento!\nVi piacerebbe espandere l’idea, magari estendendola ad altri settori?  L’ambizione che il team Gruppetto si prefigge di raggiungere è quella di creare una nuova community di appassionati che va oltre allo schermo del proprio telefono.\n  Le opportunità che si creano sono infinite non solo a livello nazionale ma anche internazionale. Stiamo lavorando per creare una sezione sempre più community Bike e una dedicata all’aspetto più agonistico di questo sport.\n  Stiamo studiando il mondo dei runner e del ciclismo sostenibile per dare un’ impronta sempre più green alla nostra applicazione.\n Quali sono i prossimi obiettivi/progetti che avete in mente?  Socializzare grazie alle proprie passioni è una frontiera digitale sempre più esplorata. Gruppetto non si ferma a sta lavorando a nuove funzionalità.\n  In Gruppetto pensiamo che lo sport non sia solo un modo per rimanere in forma ed allenati, ma sia soprattutto un’opportunità per creare nuovi legami e rafforzare quelli già presenti.\n  Stiamo rilasciando nuove funzionalità per migliorare l’esperienza utente e ottimizzando la sezione di community per dare un ingaggio anche più interattivo, quindi restate sintonizzati!\n Contatti www.gruppetto.bike\n ", "url": "https:\/\/theredcode.it\/voglio-diventare-un...-mobile-developer\/" }, "https:\/\/theredcode.it\/tags\/api-gateway\/": { "title": "api-gateway", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/api-gateway\/" }, "https:\/\/theredcode.it\/aws-lambda-e-documentdb-con-python\/": { "title": "AWS Lambda e DocumentDB con Python", "tags": ["api-gateway","aws","documentdb","lambda","python",], "content": "Sperimentando un po\u0026rsquo; con il mondo AWS insieme a Michele Scarimbolo, amico e collega -denominato Mr. AWS-, abbiamo messo mano al servizio Lambda e DocumentDB, per creare delle funzioni che fossero in grado di gestire delle operazioni CRUD sfruttando questo database documentale.\n E tu che aspetti? Partiamo subito con questo tutorial su AWS Lambda e DocumentDB con Python!\n Intro  AWS Lambda consente di eseguire codice senza dover effettuare il provisioning né di dover gestire alcun server.\n Il servizio esegue codice su un\u0026rsquo;infrastruttura di calcolo ad alta disponibilità e amministra le risorse di elaborazione, tra cui la manutenzione del server e del sistema operativo, il provisioning e il dimensionamento automatico della capacità, il monitoraggio di codici e la creazione di log.\n È sufficiente fornire il codice in uno dei linguaggi supportati da AWS Lambda (attualmente Node.js, Java, C#, Python, Go, Ruby e PowerShell) per eseguirlo!\n È perfetto per l’esecuzione di porzioni di codice e funzioni atomiche o che fanno parte di un’architettura a microservizi che possono essere eseguite in poco tempo e il cui codice è stato ottimizzato.\n AWS DocumentDB è un servizio di database documentale che viene normalmente associato a MongoDB come tipologia di gestione dei dati, anche se, come la stessa community di MongoDB afferma, questo è compatibile rispetto all\u0026rsquo;uso delle API solo al 34%.\n Un database basato su documenti archivia in modo nativo dei dati in formato JSON; in questo caso, DocumentDB fornisce la possibilità di ricerche di documenti singoli, query tramite espressioni regolari e aggregazioni, creando un cluster di una o più istanze nelle zone di disponibilità specificate.\n Quando crei un cluster utilizzando la console Amazon DocumentDB e scegli di creare una replica in una zona di disponibilità diversa, Amazon DocumentDB crea due istanze: l\u0026rsquo;istanza primaria sarà in una zona di disponibilità e l\u0026rsquo;istanza di replica in una zona di disponibilità diversa.\n Creazione del cluster con DocumentDB  Prima di tutto, andiamo ad avviare un cluster su DocumentDB: per iniziare, è possibile configurare come classe quella più piccola disponibile, che in questo caso è la db.t3.medium:\n Configurazione del cluster DocumentDB\n Andiamo quindi a definire un utente e una password per il master seguendo le indicazioni fornite nel tab dedicato all\u0026rsquo;Authentication:\n Autenticazione a DocumentDB\n Nella sezione relativa alle impostazioni avanzate ci sono molte opzioni riguardo la configurazione di un backup, la gestione dei log, la configurazione di rete e via dicendo.\n Non dimentichiamo uno step fondamentale: Lambda avrà bisogno di accedere al database DocumentDB, e per farlo avrà bisogno di una policy che ne permette la scrittura e la lettura.\n Per impostazione predefinita, un cluster Amazon DocumentDB accetta solo connessioni sicure utilizzando Transport Layer Security (TLS). Per potersi connettere tramite TLS, sarà prima scaricare la chiave pubblica per Amazon DocumentDB.\n La connessione DocumentDB non può essere stabilita perché la nostra funzione Lambda e il cluster DocumentDB devono risiedere nello stesso VPC.\n Per farlo, nelle configurazioni avanzate del cluster, scorriamo verso il basso fino alla sezione Network settings e selezioniamo il VPC corretto, le sue subnet e un gruppo di sicurezza adeguato (aka security group).\n Esempio di configurazione della rete di DocumentDB (attenzione, qui il security group non è settato!)\n Una volta che il cluster sarà creato e istanziato, ci vorranno alcuni minuti prima che nell\u0026rsquo;elenco dei cluster presenti su DocumentDB riusciremo a vedere che il cluster è disponibile:\n Stato delle istanze del cluster DocumentDB\n A questo punto, non ci resta che prendere la stringa di connessione al cluster e utilizzarla all\u0026rsquo;interno delle lambda per collegarci!\n Per recuperare le informazioni relative alla connessione, clicchiamo sul cluster di nostro interesse e andiamo nella sezione Connectivity \u0026amp; Security: troveremo alcuni esempi per potersi connettere all\u0026rsquo;istanza di DocumentDB con una stringa del tipo:\n NOMECLUSTER-cluster.cluster-IDCLUSTER.eu-west-1.docdb.amazonaws.com:27017  La copiamo, e ce la mettiamo da parte. Prossimo step: creazione delle Lambda per aggiungere, modificare, eliminare e recuperare un documento dal database!\n Definizione delle funzioni Lambda  Il servizio Lambda ci permette di creare delle funzioni ad hoc per svolgere tutte le operazioni che vogliamo: il vero vantaggio in questo caso è la fruizione delle API che ci permettono di collegarci al cluster di DocumentDB per poter gestire i nostri dati.\n Creazione di una funzione Lambda\n In questo caso, andiamo quindi a creare una Lambda da zero, specificando qual è il linguaggio da utilizzare.\n In questo caso, selezioniamo Python: andremo a creare delle funzioni lambda che ci permettano di eseguire delle operazioni come inserimento, ricerca o cancellazione sul database di DocumentDB.\n Per farlo, andremo ad utilizzare alcune librerie, tra cui json, bson e pymongo: queste ci permetteranno di creare documenti, recuperarli e soprattutto restituirli tramite una risposta JSON che, per esempio, potremmo fornire tramite un\u0026rsquo;API Gateway.\n Attenzione: queste dovranno essere importate nella Lambda utilizzando i livelli.\n  Per approfondire, leggi questo articolo su Lambda e API Gateway!\n  Per poter utilizzare delle librerie aggiuntive, all\u0026rsquo;interno del servizio Lambda, basterà selezionare la voce nel menù laterale chiamata Livelli e crearne uno all\u0026rsquo;interno del quale andremo a caricare uno zip con tutti i file delle librerie di cui abbiamo bisogno.\n Come farlo? Per creare uno zip con le librerie, sarà sufficiente scaricarle utilizzando pip, specificando la cartella di destinazione dove andarle a salvare:\n pip install pymongo -t /dest/folder  Creazione di un livello per AWS Lambda\n Partiamo dall\u0026rsquo;operazione di creazione: vediamo come creare un documento e inserirlo all\u0026rsquo;interno di DocumentDB. Per farlo, importiamo le librerie necessarie e poi specifichiamo all\u0026rsquo;interno della funzione pymongo.MongoClient l\u0026rsquo;indirizzo del cluster che abbiamo creato in precedenza insieme alle credenziali per accedervi:\n import json import pymongo from bson import json_util def lambda_handler(event, context): client = pymongo.MongoClient(\u0026#39;mongodb://[USERNAME]:[PASSWORD]@[CLUSTER_NAME].XXX.eu-west-1.docdb.amazonaws.com:27017\u0026#39;)  A questo punto, richiamiamo il database che intendiamo creare (in questo caso, my_db) e la collezione che vogliamo aggiungere (ossia users). Dal momento che il contenuto del documento sarà popolato dal body della request che arriva dall\u0026rsquo;API Gateway, andiamo a verificare che event, ossia l\u0026rsquo;oggetto con cui AWS ci permette di fornire dei parametri, contenga un body.\n Nota a margine: event normalmente ha una struttura di questo tipo:\n { \u0026#34;resource\u0026#34;: \u0026#34;/\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/\u0026#34;, \u0026#34;httpMethod\u0026#34;: \u0026#34;GET\u0026#34;, \u0026#34;requestContext\u0026#34;: { \u0026#34;resourcePath\u0026#34;: \u0026#34;/\u0026#34;, \u0026#34;httpMethod\u0026#34;: \u0026#34;GET\u0026#34;, \u0026#34;path\u0026#34;: \u0026#34;/Prod/\u0026#34;, ... }, \u0026#34;headers\u0026#34;: { \u0026#34;accept\u0026#34;: \u0026#34;text/html\u0026#34;, \u0026#34;accept-encoding\u0026#34;: \u0026#34;gzip, deflate, br\u0026#34;, \u0026#34;Host\u0026#34;: \u0026#34;xxx.us-east-2.amazonaws.com\u0026#34;, \u0026#34;User-Agent\u0026#34;: \u0026#34;Mozilla/5.0\u0026#34;, ... }, \u0026#34;multiValueHeaders\u0026#34;: { \u0026#34;accept\u0026#34;: [ \u0026#34;text/html\u0026#34; ], \u0026#34;accept-encoding\u0026#34;: [ \u0026#34;gzip, deflate, br\u0026#34; ], ... }, \u0026#34;queryStringParameters\u0026#34;: { \u0026#34;postcode\u0026#34;: 12345 }, \u0026#34;multiValueQueryStringParameters\u0026#34;: null, \u0026#34;pathParameters\u0026#34;: null, \u0026#34;stageVariables\u0026#34;: null, \u0026#34;body\u0026#34;: null, \u0026#34;isBase64Encoded\u0026#34;: false }  Non vi fate ingannare infatti dai test, all\u0026rsquo;interno dei quali potrete inserire qualunque tipo di JSON: nel momento in cui questa Lambda verrà sfruttata da un\u0026rsquo;API Gateway, tutto ciò che arriverà dalle request, si troverà nel body.\n  db = client.my_db coll = db.users if event and \u0026#39;body\u0026#39; in event: body = json.loads(event[\u0026#39;body\u0026#39;])  Dopo aver quindi verificato che il body non sia vuoto, andiamo a inserire il documento nel database, con questa semplice istruzione:\n coll.insert_one(body) Per verificare che sia andato a buon fine, proviamo a cercare quello stesso oggetto all\u0026rsquo;interno del database e, se presente, ritorniamo un messaggio di successo come risposta alla chiamata della funzione Lambda:\n  res = coll.find_one(body) client.close() if res: return { \u0026#39;statusCode\u0026#39;: 200, \u0026#39;body\u0026#39;: json_util.dumps(body), \u0026#39;headers\u0026#39;: { \u0026#39;Access-Control-Allow-Headers\u0026#39;: \u0026#39;Content-Type\u0026#39;, \u0026#39;Access-Control-Allow-Origin\u0026#39;: \u0026#39;*\u0026#39;, \u0026#39;Access-Control-Allow-Methods\u0026#39;: \u0026#39;OPTIONS,GET,POST\u0026#39; } } else: return { \u0026#39;statusCode\u0026#39;: 400, \u0026#39;body\u0026#39;: json.dumps(\u0026#39;Request NOT inserted!\u0026#39;), \u0026#39;headers\u0026#39;: { \u0026#39;Access-Control-Allow-Headers\u0026#39;: \u0026#39;Content-Type\u0026#39;, \u0026#39;Access-Control-Allow-Origin\u0026#39;: \u0026#39;*\u0026#39;, \u0026#39;Access-Control-Allow-Methods\u0026#39;: \u0026#39;OPTIONS,GET,POST\u0026#39; } }  Attenzione a due fattori: in primis, nel body di risposta viene utilizzato json_util.dumps perché insieme al metodo loads questo ci consente di convertire un oggetto da BSON a JSON o viceversa: in questo caso, utilizziamo dumps perché trasforma un oggetto da BSON a JSON.\n L\u0026rsquo;altra cosa a cui prestare attenzione è l\u0026rsquo;uso degli headers: qualora le Lambda che state creando si vadano ad integrare con un\u0026rsquo;API Gateway che ha le CORS policy attivate e questa sarà pubblicata su Internet, sarà necessario specificarlo nella risposta.\n Per recuperare invece l\u0026rsquo;elenco completo dei documenti inseriti, la Lambda avrà le seguenti istruzioni: il codice è molto simile a quanto visto per la creazione, ma in questo caso andiamo ad utilizzare il metodo find(): specificando list() all\u0026rsquo;esterno della chiamata, questo convertirà automaticamente il risultato della query in una lista che potremo andare a restituire come risposta.\n import json import pymongo from bson import json_util def lambda_handler(event, context): client = pymongo.MongoClient(\u0026#39;mongodb://[USERNAME]:[PASSWORD]@[CLUSTER_NAME].XXX.eu-west-1.docdb.amazonaws.com:27017\u0026#39;) db = client.my_db coll = db.users res = list(coll.find()) client.close() if len(res) \u0026gt;= 0: return { \u0026#39;statusCode\u0026#39;: 200, \u0026#39;body\u0026#39;: json_util.dumps(res), \u0026#39;headers\u0026#39;: { \u0026#39;Access-Control-Allow-Headers\u0026#39;: \u0026#39;Content-Type\u0026#39;, \u0026#39;Access-Control-Allow-Origin\u0026#39;: \u0026#39;*\u0026#39;, \u0026#39;Access-Control-Allow-Methods\u0026#39;: \u0026#39;OPTIONS,GET\u0026#39; } } else: return { \u0026#39;statusCode\u0026#39;: 400, \u0026#39;body\u0026#39;: json.dumps(\u0026#39;Component NOT retrieved!\u0026#39;) } Per recuperare un singolo documento, magari passando dei parametri tramite l\u0026rsquo;evento, è possibile usare il metodo find_one():\n res = coll.find_one(component)  Infine, creiamo una Lambda per cancellare un documento, con il seguente codice: oltre a collegarci al database e recuperare l\u0026rsquo;ID dell\u0026rsquo;oggetto da cancellare dal body dell\u0026rsquo;evento, andiamo a verificare che questo sia presente nel database: se il risultato della ricerca non è vuoto, procediamo con la cancellazione tramite il metodo delete_one.\n import json import pymongo from bson.objectid import ObjectId def lambda_handler(event, context): client = pymongo.MongoClient(\u0026#39;mongodb://[USERNAME]:[PASSWORD]@[CLUSTER_NAME].XXX.eu-west-1.docdb.amazonaws.com:27017\u0026#39;) db = client.my_db coll = db.users if event and \u0026#39;body\u0026#39; in event: body = json.loads(event[\u0026#39;body\u0026#39;]) user_id= body[\u0026#39;user_id\u0026#39;] res = coll.find_one({\u0026#34;_id\u0026#34;: ObjectId(user_id)}) if res is not None: coll.delete_one({\u0026#39;_id\u0026#39;: ObjectId(user_id)}) client.close() return { \u0026#39;statusCode\u0026#39;: 200, \u0026#39;body\u0026#39;: json.dumps(\u0026#39;Document deleted successfully!\u0026#39;), \u0026#39;headers\u0026#39;: { \u0026#39;Access-Control-Allow-Headers\u0026#39;: \u0026#39;Content-Type\u0026#39;, \u0026#39;Access-Control-Allow-Origin\u0026#39;: \u0026#39;*\u0026#39;, \u0026#39;Access-Control-Allow-Methods\u0026#39;: \u0026#39;OPTIONS,GET\u0026#39; } } else: return { \u0026#39;statusCode\u0026#39;: 200, \u0026#39;body\u0026#39;: json.dumps(\u0026#39;User with this ID does not exist!\u0026#39;), \u0026#39;headers\u0026#39;: { \u0026#39;Access-Control-Allow-Headers\u0026#39;: \u0026#39;Content-Type\u0026#39;, \u0026#39;Access-Control-Allow-Origin\u0026#39;: \u0026#39;*\u0026#39;, \u0026#39;Access-Control-Allow-Methods\u0026#39;: \u0026#39;OPTIONS,GET\u0026#39; } }  Niente male, no? Non ti resta che collegarlo ad un\u0026rsquo;API Gateway e il gioco è fatto!\n ", "url": "https:\/\/theredcode.it\/aws-lambda-e-documentdb-con-python\/" }, "https:\/\/theredcode.it\/tags\/documentdb\/": { "title": "documentdb", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/documentdb\/" }, "https:\/\/theredcode.it\/tags\/lambda\/": { "title": "lambda", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/lambda\/" }, "https:\/\/theredcode.it\/voglio-diventare-una...-content-strategist\/": { "title": "Voglio diventare una... Content Strategist", "tags": ["interviste","voglio-diventare","apogeo",], "content": "La figura della Content Strategist è fondamentale in un\u0026rsquo;epoca come questa delle professioni digitali (e non solo): si tratta infatti di creare, pubblicare e gestire contenuti utili, capaci di apportare dei risultati anche nella web experience, unendo scrittura e strategia.\n Per parlare di questa professione, diamo spazio a Valentina Di Michele, Content Strategist da diversi anni e fondatrice di Officina Microtesti, una bellissima attività che si occupa di scrittura e design!\n Descriviti in 100 parole.  Vent’anni fa mi sono laureata in filosofia: volevo fare la critica cinematografica, ero innamorata della filosofia del linguaggio.\n Dopo un Master in grafica pubblicitaria, ho fatto la redattrice per una rivista europea di industria cinematografica.\nI contratti erano brevi e incerti e io volevo essere indipendente, così ho trovato lavoro in un’agenzia che produceva contenuti web per i siti della PA centrale. In 20 anni ho scritto di tutto: articoli per riviste di cinema, testi di marketing, manuali tecnici di piattaforme IT.\nOggi sono la madrina dello UX Writing in Italia, amministro l’unica community italiana sul tema e gestisco il mio studio di scrittura e design, Officina Microtesti.\n In cosa consiste il ruolo di Content Strategist?  Come Content strategist mi occupo di progettare i contenuti di siti web e app e di verificare che siano quelli che servono davvero alle persone durante la navigazione.\n Supervisiono tutto il processo di creazione e progettazione: dalla definizione della voce di brand e di prodotto alla ricerca sulle persone, dalla definizione del prototipo insieme al team di design fino ai testi e ai microtesti e ai test di usabilità.\n È un lavoro che mi appassiona così tanto da spingermi a raccontarlo in un libro uscito l’anno scorso per Apogeo Feltrinelli (il libro si chiama Emotion Driven Design).\n A Officina Microtesti siamo in sette: oltre a me ci sono UX Writer, Content e Neurodesigner. Lavoriamo in team, da soli o con i team di marketing e design dei clienti.\n Qual è la soft skill più importante che deve possedere un Content Strategist?  Credo che serva esperienza sul campo: è un lavoro strategico e per farlo devi avere fatto anche quello operativo. Il mio lavoro è a cavallo tra scrittura, neuromarketing e design, e devi conoscere tutti e tre questi mondi per fare tutto al meglio.\n 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.  Il fallimento non piace a nessuno, e a nessuno piace raccontarlo. Il mio fallimento più grande, che mi fa ancora stare male, è stato un licenziamento.\n  Non direi che era colpa mia, ma non c’entra la realtà oggettiva: è quello che senti. Per me è stato proprio un tonfo, la sensazione di essere stata rifiutata, di essere inutile.\n  Dopo quella volta, ho iniziato a guardare in modo diverso le cose che non vanno. A volte si calibra male un’attività col cliente, a volte si fanno errori di gestione o di progettazione più o meno grossi.\n Però non me ne faccio più una malattia. Lo valuto come un evento naturale, una ruota forata in un lungo percorso: semplicemente, succede.\n  Come fare per diventare un Content Strategist?  Fare tanta esperienza operativa è fondamentale. È utile leggere, fare corsi, ma bisogna provare tutto: seguire in prima persona la fase di ricerca, creare i brief, lavorare a contatto con il team di design, capire come funzionano gli strumenti tecnici (tool, CMS etc).\n La strategia è una visione \u0026ldquo;alta\u0026rdquo; dell\u0026rsquo;insieme di attività operative, che impatta il cliente (che paga), il pubblico, e definisce gli obiettivi a breve e lungo termine, la pianificazione delle attività tattiche e la supervisione di quelle operative.\nÈ un\u0026rsquo;attività che si impara lavorando direttamente sul campo: partendo dalle singole attività operative, e pian piano prendendo confidenza con gli strumenti.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Con Officina Microtesti abbiamo molti nuovi progetti, grandi e molto impegnativi. Molte aziende ci conoscono per passaparola e stiamo lavorando con aziende enormi, che fanno cose incredibili. A volte non mi sembra quasi vero.\n Nei prossimi mesi lanceremo la nostra piattaforma di corsi, e sarà diversa da quello che c’è sul mercato in questo momento. Nei prossimi 3 anni vorrei però divertirmi: tornare a tenere talk agli eventi, magari internazionali, o lavorare a progetti fuori dal mio ambito più stretto.\n Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema? (Fai anche riferimenti a situazioni reali in cui hai avuto modo di fare la tua parte!)  Sono una donna che lavora in un ambito tecnologico, perché i contenuti che progetto e scrivo danno “voce” ai prodotti tecnologici.\n  Ricordo quando anni fa una donna nel team ICT era vista un po’ come “quella che fa i caffè”: oggi è diverso, ma mi capita ancora spesso di essere l’unica donna fra uomini. Io, che mi occupo di rendere la tecnologia più umana con le parole, in mezzo a un team di sviluppatori o ingegneri.\n  Officina Microtesti è composta al 90% da donne e da qualche mese è parte di Digital Skills Europe, un programma della Commissione Europea che ha lo scopo etico di migliorare le competenze digitali nella popolazione europea.\n Abbiamo il folle proposito di creare un nuovo umanesimo digitale, inclusivo, aperto a tutte le persone. Ma sono sicura che ce la faremo.\n \u0026hellip; e lo siamo anche noi! In bocca al lupo a Valentina e a Officina Microtesti!\n", "url": "https:\/\/theredcode.it\/voglio-diventare-una...-content-strategist\/" }, "https:\/\/theredcode.it\/tags\/qrcode\/": { "title": "qrcode", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/qrcode\/" }, "https:\/\/theredcode.it\/qrcode-con-python\/": { "title": "QRCode con Python", "tags": ["python","qrcode",], "content": "Ormai tutti abbiamo a che fare con i QRCode: Green Pass (e non solo) ci hanno costretto a scoprire questa tecnologia. Ma come funziona un QRCode con Python?\n In questo articolo, vediamo come creare un programma che sia in grado di generare un codice QR a partire da un semplice testo, e anche come estrarre il contenuto di un\u0026rsquo;immagine già presente.\n Cos\u0026rsquo;è il QRCode  Si tratta di un formato di codice a barre costituito da moduli neri su sfondo bianco, attraverso i quali è possibile trasmettere delle informazioni.\n In un solo QRcode possono essere contenuti fino a 7.089 caratteri numerici o 4.296 alfanumerici, al contrario dei tradizionali codici a barre.\n Esempio di QRCode: riesci a leggere cosa c\u0026rsquo;è scritto?\n  Sapevi inoltre che il nome \u0026ldquo;QR\u0026rdquo; è l\u0026rsquo;abbreviazione dell\u0026rsquo;inglese Quick Response (ossia \u0026ldquo;risposta rapida\u0026rdquo;)? Questo perché l\u0026rsquo;idea nasce nel 1994 nelle fabbriche della Toyota, dove il codice QR per tracciare i pezzi di automobili, dal momento che questo tipo di codifica permette di inserire diverse informazioni con una rapida decodifica del suo contenuto!\n  Come generare un QRCode  Per generare un codice QR esistono moltissimi siti online, ma perché non farlo con Python?\n Il codice è estremamente semplice. Per prima cosa, installiamo la libreria qrcode con il seguente comando:\n pip install qrcode  Dopodiché, andiamo ad importarla tramite il seguente codice:\n import qrcode  A questo punto, possiamo creare il codice QR con la seguente istruzione:\n qr = qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=10,border=4,) qr.add_data(\u0026#39;https://www.patreon.com/theredcode_it\u0026#39;) qr.make(fit=True) img = qr.make_image(fill_color=\u0026#34;black\u0026#34;, back_color=\u0026#34;white\u0026#34;) im1 = img.save(\u0026#34;test.jpg\u0026#34;)  Con la prima riga, andiamo a definire le proprietà del QRcode: il parametro version è un numero intero compreso tra 1 e 40 che controlla la dimensione del QR Code (il più piccolo è rappresentato dalla versione 1 e sarà una matrice 21x21).\n Il parametro error_correction controlla la correzione degli errori utilizzata per il QR Code, e ne esistono quattro varianti, a seconda della percentuale di errori che vogliamo correggere.\n Il parametro box_size controlla quanti pixel è ogni \u0026ldquo;scatola\u0026rdquo; del codice QR, e in questo caso saranno 10x10; stessa vale per il border, che rappresenta la dimensione in pixel del bordo del codice QR.\n Se volessimo che il dimensionamento avvenisse in maniera automatica, sarà sufficiente impostare su None e utilizzare il parametro fit durante la creazione del codice per determinarlo automaticamente, come mostrato nella riga 3.\n fill_color e back_color nella penultima riga possono cambiare lo sfondo e il colore dell\u0026rsquo;immagine del codice QR e accettano entrambi tuple di colore RGB.\n Una volta eseguito il codice, l\u0026rsquo;ultima riga farà sì che il QR code generato sia salvato all\u0026rsquo;interno della cartella del progetto.\n Semplice, no?\n  Come estrarre da un QRCode  Abbiamo visto come inserire delle informazioni all\u0026rsquo;interno di un QRCode, ma vediamo come estrarle.\n Per farlo, avremo bisogno di installare due pacchetti, ossia Pillow e pyzbar tramite il seguente comando:\n pip install pyzbar pip install pillow  Una volta importate le librerie, potremo procedere a fornire l\u0026rsquo;immagine da decodificare, come mostrato nella prima riga.\n from pyzbar.pyzbar import decode from PIL import Image data = decode(Image.open(\u0026#39;test.jpg\u0026#39;)) print(data) data = data[0].data print(data.decode(\u0026#34;utf-8\u0026#34;))  Le ultime due righe sono necessarie per recuperare i dati contenuti nel QRCode: infatti, utilizzando l\u0026rsquo;oggetto decodificato, questo è il risultato che otterremmo:\n [Decoded(data=b\u0026#39;https://www.patreon.com/theredcode_it\u0026#39;, type=\u0026#39;QRCODE\u0026#39;, rect=Rect(left=39, top=39, width=292, height=292), polygon=[Point(x=39, y=39), Point(x=39, y=330), Point(x=331, y=331), Point(x=330, y=39)])]  Non molto chiaro, no?\n Questo perché la libreria pyzbar utilizza un oggetto chiamato Decoded per incapsulare tutte le informazioni relative al QRCode, come la dimensione, la tipologia di codice, e via dicendo.\n Dal momento che si tratta di una lista, prendiamo il primo oggetto e prendiamo la proprietà data della tupla risultante:\n data = data[0].data print(data.decode(\u0026#34;utf-8\u0026#34;))  Un gioco da ragazze!\n  Ti potrebbero interessare\u0026hellip; Come creare un sistema di raccomandazione per film con Python Docker per Django e Postgres Analisi del linguaggio con Python – Apogeo ", "url": "https:\/\/theredcode.it\/qrcode-con-python\/" }, "https:\/\/theredcode.it\/voglio-diventare-un-devops-engineer\/": { "title": "Voglio diventare un… DevOps Engineer", "tags": ["interviste","voglio-diventare",], "content": "Gianmarco è un supereroe informatico: nasce come sviluppatore, nel tempo extra ricopre il ruolo di Project Leader per un interessante progetto che ha avviato diversi anni fa a supporto della divulgazione scientifica in ambito biomedicale, anche se adesso fa il DevOps Engineer a tempo pieno: un mestiere ibrido che incarna diverse professioni con tante e diverse competenze..\n Il suo essere camaleontico ed entusiasta è fondamentale per svolgere questo lavoro!\n Nessuno spoiler: vediamo come diventare un DevOps Engineer.\n Descriviti in 100 parole.  Curioso. Questo aggettivo, apparentemente semplice, caratterizza da sempre ed arricchisce in modo significativo le mie attività. Essere curiosi significa essere pronti alla contaminazione dalle idee altrui, quindi aperti al confronto.\n Ho 32 anni, inzio la mia carriera 8 anni fa lavorando come sviluppatore firmware in ambito IoT; gli studi in ingegneria mi conferiscono quel giusto “approccio al problema” per affrontare le sfide tecniche/professionali del mondo lavorativo.\n Nei primi 5 anni di carriera, ho osservato gli applicativi software dapprima dall’alto dello stack tecnologico (frontend developer) per poi scendere sempre più in basso (backend developer e sys-admin), fino ad appassionarmi - da 3 anni a questa parte - alle metodologie proprie del DevOps.\n Mi piace - in ordine sparso - correre, leggere e programmare.\n La lettura è quello strumento che mi rende consapevole del fatto che gli orizzonti della conoscenza possono divenire sempre più ampi; la corsa, invece, è quell’attività fisica necessaria per riordinare (in gergo tecnico direi “deframmentare” ) le idee per meglio utilizzarle.\n Nel mente, utilizzo la programmazione come un esercizio - stavolta solo mentale - che mi permette di sperimentare velocemente, grazie all’utilizzo di astrazioni o modelli, e semplificare problemi ricorrenti in scenari quotidiani.\n In cosa consiste il ruolo di DevOps Engineer?  Continuo a ribadire che il ruolo del DevOps non va inteso come una posizione lavorativa nel vero senso della parola; piuttosto è un approccio metodico in relazione a particolari procedure che caratterizzano un rilascio applicativo.\n Il mio lavoro consiste, dunque, nell’utilizzo delle conoscenze di programmazione maturate (dev-) per realizzare automatismi (CI/CD) che garantiscono continuità ai canali - anche detti “pipeline” - inerenti ai rilasci applicativi, conoscendo approfonditamente l’infrastruttura tecnologica sottostate ed il fornitore dei servizi (-ops).\n  Le attività del DevOps sono quasi mai svolte in solitaria; tale figura, infatti, rappresenta un collante tra il team di sviluppatori software che realizza l’applicativo e quello dei sistemisti (o architetti cloud) che prepara il provisioning delle risorse necessarie.\n Qual è la soft skill più importante che deve possedere un DevOps Engineer?  Soprattutto nel contesto odierno, dove tutti siamo orientati al lavoro da remoto, considero il “saper comunicare bene” una delle abilità necessarie (ma non sufficienti) per essere un player importante in un team di lavoro.\n  È fondamentale anche per la figura del DevOps: più spesso di quanto si possa credere, ci si troverà ad essere un vero e propriò mediatore tra più figure tecniche, dove ognuna osserverà valide ragioni a difesa delle proprie scelte tecnologiche.\n  Il DevOps è un ruolo, per certi versi, multidisciplinare. Saper costruire canali di integrazione, comprendere l’importanza dei test, aumentare la sensibilità circa gli aspetti di sicurezza, richiedere l’utilizzo di best practices sono solo pochi esempi di attività per le quali è importante sapere comunicare bene per fornire più ampie prospettive a chi osserva solo una faccia della medaglia: lo sviluppo software oppure il sistema operativo.\n 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.  Falliamo ogni giorno, per fortuna. Non esiste un fallimento più grande dell’altro. Ciò che normalmente viene inteso come “fallimento” è invece un’iniziativa che ha portato ad un risultato diverso da quello previsto, producendo quindi un effetto inaspettato che ci consente di imparare qualcosa che prima era inimmaginabile.\n  Al contempo, è proprio così che ritengo riusciamo a crescere.\n Il vero fallimento, di conseguenza, si verifica unicamente quando non riusciamo ad apprendere dalle nostre azioni.\nCome fare per diventare un DevOps Engineer?  Il mio motto è: Life Long Learning. Siate curiosi di imparare ogni giorno ed appassionatevi di ciò che fate.\nIn ambito informatico, i prodotti e le tecnologie diventano velocemente obsolete, a favore di strumenti sempre più moderni o complessi; è fondamentale avere la volontà e la predisposizione ad essere sempre “sul pezzo”.\n Seguire certificazioni è uno dei percorsi - oltre a sperimentare, fare pratica e errori! - per rimanere sempre sulla cresta dell’onda tecnologica.\n Investire nelle competenze è, a mio parere, il miglior strumento per non essere mai inadeguati rispetto ai trend attuali di mercato e quindi sempre spendibili al miglior offerente, ovvero chi a sua volta crede nella formazione continua del team di lavoro.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Immaginando la carriera come uno stack di competenze, se fino a qualche anno fa la mia ambizione principale era verticalizzarmi nella conoscenza delle tecnologie, oggi credo che bisogna spostarsi anche nei livelli orizzontali per distinguersi.\nMi piace molto l’idea di essere un buon “Tech Leader”, una persona di riferimento capace di proporre non solo lo strumento più adatto alla soluzione tencologica ma anche il metodo o l’approccio migliore per le esigenze del cliente.\n Tale figura, a mio avviso, deve disporre anzitutto di una profonda e solida conoscenza delle tecnologie che il mercato attuale offre per poi essere in grado di distinguersi con iniziative volte a semplificare o migliorare i processi e quindi arrivare agilmente al goal.\n Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema? (Fai anche riferimenti a situazioni reali in cui hai avuto modo di fare la tua parte!) Si, il gender gap è evidente - purtroppo - anche nel ruolo del DevOps. Nelle differenti realtà aziendali che ho avuto il piacere di incontrare, ho constatato che 4 colleghi su 5 sono uomini.\n  Ma qualcosa sta cambiando ed in modo percettibile.\n  Ribadisco che, anche in questo settore, affinchè il cambiamento sia proficuo ed accogliente bisogna che si inizi elevando la propria mentalità. Non dovremmo permettere che questa disparità abbia senso di esistere quando le competenze possono essere ugualmente verificate.\n Credo, anzi, che il ruolo della donna sia un plus: in ambienti lavorativi fin troppo omogenei, ella regala l’opportunità per diversificare e creare nuove prospettive di osservazione dei problemi stessi fornendo migliori spunti di confronto.\n Contatti LinkedIn: https://www.linkedin.com/in/gianmarcorogo/ Sito: https://www.gianmarcorogo.com ", "url": "https:\/\/theredcode.it\/voglio-diventare-un-devops-engineer\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-web-designer\/": { "title": "Voglio diventare una... Web Designer", "tags": ["interviste","voglio-diventare",], "content": "Se non hai mai seguito una sua diretta su Twitch, non sai che ti sei pers*! Diana è una ragazza brillante e di grande ispirazione: non si pone mai problemi nel mettere sul piatto la sua esperienza personale e di farne tesoro con e per gli altri.\n Inoltre, veste tantissimi cappelli, tra cui quello di community manager: il suo percorso è portare il messaggio dell\u0026rsquo;importanza dell\u0026rsquo;accessibilità a tutti\u0026hellip; ma sarà lei a parlarne: vediamo come diventare una Web Designer!\n Descriviti in 100 parole.  ​​Creativa, curiosa e testarda. Sono una sviluppatrice/designer web e community addicted.\nDa marzo 2021 ho iniziato a parlare di sviluppo e design su Twitch e questo mi ha permesso di conoscere molti/e professionisti/e del settore e di creare la mia piccola community.\n  Credo che la condivisione sia la chiave di volta del nostro lavoro e fondare/gestire/seguire una community sia importante nella fase di crescita di un dev.\n  In cosa consiste il ruolo di Web Designer?  Il/La web designer si occupa della parte estetica di un sito web e dello sviluppo di interfacce utente.\n La progettazione del design di un sito web inizia cercando di capire i bisogni del cliente, e immaginando il prodotto finale che già ha in mente, poi si passa ad una prima bozza, conosciuta come wireframe dove si delinea lo scheletro della struttura del sito (in bianco e nero così da essere il più minimale possibile), poi si passa al mockup.\n Per procedere alla realizzazione del mockup si parte da uno studio sulla palette dei colori e sui font, poi si prende il wireframe e si vanno a creare tutti gli elementi grafici simulando il risultato finale senza ancora toccare codice.\n Una volta approvato il mockup si passa allo sviluppo vero e proprio, utilizzando la tecnologia più opportuna.\n Tendenzialmente se si è freelance spesso tutta questa procedura è a carico di una singola figura mentre se si è in azienda, e/o si lavora in team, entrano in gioco anche altre figure professionali come l’UX designer.\n Quanto l’accessibilità di un sito è parte integrante di questo lavoro?  Il ruolo dell’accessibilità è spesso considerato marginale o secondario invece deve essere parte integrante della realizzazione di un sito fin dalla sua prima bozza. Questo perché realizzare un sito accessibile è molto più facile di far diventare un sito accessibile.\n Ad oggi, l’accessibilità è considerata un requisito necessario solo da aziende estremamente grandi e enti statali/governativi, questo perché sono obbligati per legge (vedi legge Stanca) a rispettare dei requisiti minimi dettati dalle WCAG (abbreviazione di Web Content Accessibility Guidelines).\n Invece ogni sito dovrebbe essere accessibile e per rendervene conto vi lascio alcuni numeri:\n secondo l’Istat sono 3.1 milioni le persone con disabilità in Italia, circa il 5.2% della popolazione italiana; il 98% dei siti presenti su internet non sono accessibili, a fronte di più di un miliardo di persone affette da un tipo lieve o grave di disabilità che sono presenti nel mondo.  Qual è la soft skill più importante che deve possedere una Web Designer?  Non vorrei esagerare ma credo il “senso estetico” unito a tanta curiosità e empatia.\n Per “senso estetico” o “buon gusto” intendo proprio quella caratteristica che ti permette di realizzare, o di saper valutare, dei design belli nel vero senso del termine.\n  Io sono una grande fan del minimalismo nella grafica.\n  Sono cresciuta a pane e pubblicità della Apple ed ho sempre ammirato come l’uso degli spazi bianchi riesca a comunicare meglio il messaggio piuttosto di uno sfondo pieno di disegni/foto con scritte grandi e coloratissime.\n Poi ovviamente la curiosità nel tenersi sempre aggiornat* sulle nuove tendenze o su temi che ancora non abbiamo approfondito, dopo tutto non si smette mai di imparare.\n Per ultimo, ma non per importanza, credo che l’empatia e il sapersi immedesimare nell’utente sia l’ingrediente che differenzia chi sa replicare design da chi li sa realizzare da zero.\n  Questo perché comprendere le necessità dell’utente, anche quando non sono delle specifiche richieste scritte, dovrebbe essere parte integrante di questo lavoro.\n  Ad esempio, un web designer non dovrebbe porsi la domanda “questo sito lo progetto accessibile oppure non mi importa?”, perché sappiamo bene che un sito accessibile è un sito migliore per tutti, sia per chi ha dei tipi di disabilità sia per chi non ne ha.\n 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.  Domanda tosta. Devo ammettere che il mio più grande fallimento è quello di star impiegando a finire la triennale di Informatica ben più di tre anni.\n Questo ritardo è dovuto alla mia testardaggine nel proseguire il percorso in un ambiente in cui non mi sentivo a mio agio e apprezzata. In questo percorso ho ottenuto comunque buoni risultati ma sentivo di voler scappare e per questo mi sono “rifugiata” nelle community.\n Infatti nel periodo più confuso della mia vita in cui pensavo che l’informatica non facesse più per me mi sono messa a fare la libraia\u0026hellip; però più mi allontanavo dal codice e più sentivo che mi mancava.\n Ora sono felice di dire che il mio percorso universitario è il triplo più lungo di chi si laurea nei giusti tempi ma è anche ricco il triplo, se non di più, di esperienze sia tecniche che personali.\n Come fare per diventare una Web Designer?  Spesso chi è web designer si forma tramite un percorso artistico, frequentando corsi in accademie di belle arti o laboratori ad hoc, per poi passare al codice.\n Io però nasco sviluppatrice con il pallino per il design, quindi una parte del mio tempo l’ho sempre dedicata a consultare siti di classifiche di design di siti web e blog sul tema mentre miglioravo dal punto di vista tecnico.\n Nel mio tempo libero provo a fare dei re-design di siti che conosco, magari anche solo di sezioni che non trovo belle o ordinate. Aiuta molto avere un portfolio online dove caricare tutto quello che si produce così da rendere pubblico il proprio percorso e il proprio stile personale.\n Quali sono i progetti di cui vai più orgogliosa?  Il progetto di creare una mia identità sui social l’ho iniziato, con timore, come sfida personale. Ha alti e bassi, ma devo dire che mi rende molto orgogliosa sapere che i miei contenuti sono utili e di aver creato una rete di persone che mi ha arricchito moltissimo.\n Non a caso noi due ci siamo conosciute grazie a questo progetto :)\n Sicuramente conosci il tema gender gap in ambito STEM. Come pensi si possa arrivare a buttarselo alle spalle?  In primis ci vorrebbe un impegno attivo da parte delle donne del settore così da dare delle role model che le bambine e le ragazze possono prendere come ispirazione.\n Poi si dovrebbe iniziare a ripensare all’educazione fin dalle prime fasi, infatti il problema del gender gap nell’ambito STEM è, secondo me, solo la punta dell’iceberg. Viviamo in una società in cui alle bambine si compra/regala bambole e carrozzine, mentre ai bambini macchinine e dinosauri.\n Il discorso è molto ampio e magari si può pensare che la singola persona, che sia uomo o donna o gender fluid, può farci ben poco, perché magari è il governo che se ne dovrebbe occupare oppure dovrebbero farlo le persone più influenti.\n Invece io penso che se ognun* di noi iniziasse a “contaminare” e spiegare che una donna, esattamente come un uomo, può diventare quello che vuole, che sia un’ingegnera, una dottoressa, una sviluppatrice oppure una scienziata, il problema del gender gap si estinguerebbe nell’arco di una o due generazioni.\n Link social Instagram: https://www.instagram.com/_dianacodes/ Linkedin: https://www.linkedin.com/in/dianabernabei/ Twitch: https://www.twitch.tv/dianacodes YouTube: https://www.youtube.com/channel/UC7isiq-qXsVTSQOMLviEC5A Sito web: https://www.dianabernabei.com/  Ti potrebbero piacere anche\u0026hellip; Voglio diventare una Social Media Manager; Voglio diventare un Senior Back-end Developer; Voglio diventare un Senior Software Developer; Voglio diventare una Big Data Analyst; Voglio diventare una Digital Transformation Consultant; Voglio diventare un Data \u0026amp; Software Engineer; Voglio diventare uno Startupper; Voglio diventare una Operations Manager; Voglio diventare una Inspiring Fifty. ", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-web-designer\/" }, "https:\/\/theredcode.it\/tags\/django\/": { "title": "django", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/django\/" }, "https:\/\/theredcode.it\/docker\/docker-con-django-e-postgres\/": { "title": "Docker per Django e Postgres", "tags": ["django","docker","docker-compose","python",], "content": "Qualche giorno fa, attraverso un sondaggio sui social, è venuto fuori che Docker e Python visti tramite un approccio pratico sono due tematiche che stanno particolarmente a cuore. E allora perché non approfittarne?\n Partiamo con Docker in pratica: come rendere un\u0026rsquo;applicazione scritta in Django, uno dei più noti framework di Python per creare delle interfacce web, attraverso l\u0026rsquo;uso di container.\n E perché non farlo usando il sito web delle Django Girls Italia?\n _Via alla volta di Docker per Django e Postgres!\n Requisiti Python 3.x installato Django installato Docker installato  Step 1: progetto Django  In questo caso, andremo ad usare un caso d\u0026rsquo;uso molto semplice, fornito dal mitico gruppo delle Django Girls Italia (qui il link).\n Vediamo insieme i file principali dell\u0026rsquo;applicazione:\n La directory principale farà da contenitore per il progetto, ed è quella esterna di djangogirls; manage.py: si tratta di un file che consente di interagire con questo progetto Django in vari modi e di agire come se stessimo utilizzando django-admin; __init__.py: file vuoto che dice a Python che questa directory dovrebbe essere considerata un pacchetto; settings.py: file per la configurazione del progetto; urls.py: in questo file, andremo a specificare le URL che andremo ad esporre; si tratta di una sorta di \u0026ldquo;indice\u0026rdquo; del sito basato su Django.  Eseguendo il seguente comando, dovremmo ottenere nel terminale un risultato simile a quello che segue:\n \u0026gt; python manage.py runserver Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run \u0026#39;python manage.py migrate\u0026#39; to apply them. November 23, 2021 - 15:50:53 Django version 3.2, using settings \u0026#39;mysite.settings\u0026#39; Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.  In questo modo, hai avviato il server di sviluppo Django, estremamente leggero e scritto esclusivamente in Python (ovviamente!).\n Questo perché non vale la pena preoccuparsi in questa dase di utilizzare un server più potente o complesso, ma piuttosto demandiamo questo step a quando saremo pronti per la messa in produzione!\n Step 2: definizione del Dockerfile  Ricordiamo: un Dockerfile è un documento di testo che contiene tutti i comandi che un utente potrebbe chiamare sulla riga di comando per assemblare un\u0026rsquo;immagine; una sorta di ricetta per preparare la nostra applicazione.\n In questo caso, lo andremo a creare all\u0026rsquo;interno della cartella principale del progetto, come mostrato nella figura seguente:\n Struttura del progetto DjangoGirls con Docker per Django e Postgres\n Il Dockerfile conterrà quindi tutte le istruzioni per far sì che l\u0026rsquo;applicazione possa essere avviata tramite un container:\n FROM python:3 ENV PYTHONUNBUFFERED 1 WORKDIR /app COPY ./requirements.txt /app/requirements.txt RUN pip install -r requirements.txt \u0026amp;\u0026amp; pip install --upgrade pip COPY . . RUN chmod a+x run.sh CMD [\u0026#34;./run.sh\u0026#34;]   Come prima cosa, andiamo a definire l\u0026rsquo;immagine di base: in questo caso, tramite l\u0026rsquo;istruzione FROM, specifichiamo che l\u0026rsquo;immagine da utilizzare è quella che contiene Python in versione 3.x, basata normalmente sul sistema operativo Alpine (un sistema molto minimal derivato da Ubuntu).\n La seconda riga imposta una variabile d\u0026rsquo;ambiente che assicura che l\u0026rsquo;output di Python venga inviato direttamente al terminale senza prima memorizzarlo nel buffer; questo garantisce che nessun output venga conservato da qualche parte e mai scritto nel caso in cui l\u0026rsquo;applicazione Python si arresti in modo anomalo.\n Si tratta di una configurazione piuttosto comune quando si ha a che fare con applicazioni Django!\n La terza riga permette di configurare la cartella di lavoro all\u0026rsquo;interno del container su /app: questo vuol dire che il progetto Django verrà copiato e lavorato al suo interno, come mostrato nella riga successiva.\n La riga n. 4 che contiene l\u0026rsquo;istruzione COPY copia il file requirements.txt che contiene i moduli e le relative versioni delle dipendenze di Python da installare: in questo caso, c\u0026rsquo;è solo Django e molto altro, ma è possibile aggiungervi tutti i moduli necessari.\n L\u0026rsquo;istruzione RUN permette di installare i requisiti specificati nel file appena copiato e procediamo anche con l\u0026rsquo;aggiornamento di pip: non è necessario, ma tuttavia è consigliato farlo!\n Successivamente, copiamo il file chiamato run.sh: grazie a questo file, possiamo aggiungere tutte le operazioni preliminari che ci permetteranno di rendere funzionante il sito in un ambiente di sviluppo (maggiori informazioni sono contenute nel README.md del progetto!).\n Le ultime due righe ci permettono di aggiornare i permessi dello script in modo che sia eseguibile (a sta per modificare permesso di esecuzione a tutti gli utenti e gruppi) e poi procediamo con l\u0026rsquo;esecuzione dello script.\n Questo però non basta: il nostro progetto ha bisogno anche di un Postgres. E perché non sfruttare Docker Compose per tirare su entrambi i servizi?\n Step 3: configurazione docker-compose.yml  Al suo interno andremo a definire tutti i requisiti necessari per far sì che in prima battuta venga avviato il database, e poi venga tirato su il server per l\u0026rsquo;applicazione Django.\n Il file docker-compose.yml avrà quindi questo aspetto:\n version: \u0026#34;3.9\u0026#34; services: db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: POSTGRES_USER: postgres POSTGRES_DB: djangogirls POSTGRES_PASSWORD: postgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/app ports: - \u0026#34;8000:8000\u0026#34; environment: - POSTGRES_NAME=postgres - POSTGRES_USER=djangogirls - POSTGRES_PASS=postgres depends_on: - db  Definisco due servizi, uno per il database (chiamato db) e uno per la parte web (chiamato proprio web).\n Nella sezione relativa al database, vado a specificare come immagine di base l\u0026rsquo;ultima di Postgres disponibile nei registry di DockerHub e aggiungo anche le variabili di ambiente che mi permetteranno di creare il database.\n Come indicato infatti all\u0026rsquo;interno del README.md del progetto, sarà necessario creare un database chiamato djangogirls con l\u0026rsquo;utenza postgres/postgres: andiamo quindi ad indicare questi valori all\u0026rsquo;interno della proprietà environment.\n ... db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: POSTGRES_USER: postgres POSTGRES_DB: djangogirls POSTGRES_PASSWORD: postgres ...  Per quanto riguarda l\u0026rsquo;applicazione Django, abbiamo a disposizione un Dockerfile che ne farà la build come abbiamo visto allo step 2: sarà quindi sufficiente indicare la cartella attuale come istruzione per la build.\n ... web: build: . ...  Per far sì che la nostra applicazione, una volta modificata, sia persistente, utilizziamo la direttiva volumes in entrambi i servizi: nel primo caso, andrà a salvare le informazioni del database, mentre nel secondo caso userà il codice sorgente specificato sotto /app.\n ... db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data ... web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/app ...  Nella sezione ports indichiamo la porta 8000 come quella su cui il container dev\u0026rsquo;essere in ascolto e infine specifichiamo il comando di avvio nella sezione command, così come riportato nel README.md: questo avvierà il server di Django.\n Questo ci permette di avviare il server che conterrà l\u0026rsquo;applicazione Django: normalmente, si usa django-admin.\n django-admin è infatti lo strumento che offre Django per le attività amministrative; il file manage.py viene creato automaticamente in ogni progetto Django e fa la stessa cosa di django-admin, ma imposta anche la variabile d\u0026rsquo;ambiente DJANGO_SETTINGS_MODULE in modo che punti al file settings.py del tuo progetto.\n Generalmente, quando si lavora su un singolo progetto Django, è più facile usare manage.py rispetto a django-admin. Se devi passare da un file di impostazioni Django a un altro, usa django-admin con DJANGO_SETTINGS_MODULE o l\u0026rsquo;opzione della riga di comando --settings.\n Ultimo, ma non ultimo, la clausola depends_on: questa fa sì che il servizio di Django non si avvii fintanto che il database non è in esecuzione. Piccola nota: questo non lo salverà da eventuali errori: se venisse avviato con dei problemi, la dipendenza sarà comunque soddisfatta!\n ... depends_on: - db ...  Step 4: run!  E dunque, via col mambo: digitiamo il seguente comando da terminale (che accorcia in un unico comando sia la fase di build che di run dei servizi) e apriamo il browser all\u0026rsquo;indirizzo localhost:8000 per poter vedere la homepage!\n $ docker-compose up --build  Pagina principale della community DjangoGirls\n  Ce l\u0026rsquo;hai fatta! Docker per Django e Postgres realizzato in un baleno :)\n  Disclaimer  Questo caso d\u0026rsquo;uso è perfetto per un ambiente di sviluppo, ma non per la messa in produzione. In quel caso, è fondamentale utilizzare un web server diverso da quello di default, come Nginx.\n Per farlo, è sufficiente (a grandi linee) modificare il comando di esecuzione nel docker-compose.yml per avviare l\u0026rsquo;applicazione sfruttando un webserver diverso e aggiungere ai servizi Nginx o qualsiasi web server che sia adatto al compito!\n Risorse utili Docker - Apogeo Podman e Docker Compose Esplorando il Dockerfile MEAN Docker: sviluppare una webapp da zero in meno di un\u0026rsquo;ora Dockerfile cheatsheet Docker in pillole Repository Link GitHub\n", "url": "https:\/\/theredcode.it\/docker\/docker-con-django-e-postgres\/" }, "https:\/\/theredcode.it\/tags\/docker-compose\/": { "title": "docker-compose", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/docker-compose\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-senior-digital-strategist\/": { "title": "Voglio diventare una… Senior Digital Strategist", "tags": ["interviste","voglio-diventare",], "content": "Senior Digital Strategist: ho e-incontrato Sara Tessarin qualche mese fa, dopo aver visto qualche post online sul progetto che lei e le sue colleghe stanno portando avanti; posso -finalmente- usare il femminile parlando di professioni, perché in effetti la maggior parte dello staff con cui lavora è femminile.\n In più, la professione di Sara è qualcosa che negli ultimi anni è diventata fondamentale, per qualsiasi tipo di business: come ci racconta lei stessa, è il risultato della combinazione di diverse caratteristiche, che la rendono cruciale per il successo di qualunque progetto.\n Non solo: grazie al suo lavoro, illimity (sarà lei a raccontare cos\u0026rsquo;è) sta portando avanti questa bellissima iniziativa chiamata illimitHER\u0026hellip; Senza perdere tempo, passiamo la parola a lei, e cogliamo l\u0026rsquo;occasione per far raccontare a lei cosa vuol dire \u0026ldquo;voglio diventare una Senior Digital Strategist\u0026rdquo;!\n Descriviti in 100 parole  Ciao, mi chiamo Sara e sono una Senior Digital Strategist.\n Cosa vuol dire? Da quasi 10 anni mi occupo di design strategy e di operational excellence per aziende digitali e innovative, da Vodafone a Yoox fino a illimity, la banca fondata e guidata da Corrado Passera.\n Mi sono appassionata al Design, alla User Experience e all’e-commerce durante i miei studi in Economia alla Bocconi di Milano e alla Copenaghen Business School e ho capito che era il percorso giusto per me.\n Nel tempo libero mi piace andare ai concerti, a teatro e fare muay thai.\n In cosa consiste il ruolo di Senior Digital Strategist?  All’interno del team di Design di illimity, mi occupo di gestire progetti cross funzionali tra Marketing, Prodotto, Comunicazione, Design e IT con l’obiettivo di trasformare ogni progetto dell’azienda in un racconto digitale che risponda sempre a 3 principi: chiarezza e consistenza nei contenuti e nella forma, testing e ottimizzazione della user experience e il giusto mix tra creatività, innovazione e fattibilità tecnica.\n  Il mio è un ruolo che impersonifica bene il detto “no man is an island”.\n  Sarebbe infatti impossibile creare innovazione senza il supporto delle mie colleghe e colleghi, da cui imparo ogni giorno. Il motto del team, infatti, è mettere sempre in discussione ogni step per migliorare l’esperienza utente e migliorarci come professionisti.\n Qual è la soft skill più importante che deve possedere una Senior Digital Strategist?  Senza dubbio l’empatia, dote imprescindibile per creare un linguaggio comune forte tra divisioni che parlano lingue diverse. Capire e capirsi è il primo step per individuare i gap e i bisogni da colmare e creare un piano di azione condiviso.\n La seconda soft skill, che condivido con tutti gli illimiters in azienda, è l’attitudine all’oltre: non ci fermiamo mai davanti agli ostacoli, ma con visione, determinazione e soprattutto collaborazione cerchiamo di andare sempre oltre i limiti del passato.\n  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.  Non so se definirei gli errori di inesperienza dei veri e propri fallimenti. Tendo a vedere l’opportunità di crescita e di rilancio personale in ogni occasione mancata o errore di valutazione.\n Il mio approccio, in perfetto mindset da designer, è analizzare la situazione, definire delle action misurabili e portarle a termine. Se qualcosa non funziona, si ricomincia e si guadagna un’esperienza in più. L’importante è non aver paura dell’errore:\n  se non si cade mai, vuol dire che non si sta mirando abbastanza in alto!\n  Come fare per diventare una Senior Digital Strategist?  Sicuramente avere un background di design o particolarmente immerso nel mondo digital può aiutare; prepararsi in facoltà con corsi specializzati o restare sempre informati tramite corsi, libri, conferenze è anche un buon motore di ispirazione.\nCredo che la chiave di volta sia però saper fare le domande giuste (a volte tante, a volte scomode) e la voglia di andare alla radice del problema vivendolo sempre come opportunità di miglioramento. Essere disponibili all’ascolto attivo di ciò che ci circonda e capire quanto si può imparare dalle figure professionali che ci circondano.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Mi piace pensarmi sempre nel mondo del digital, magari con la possibilità di creare e crescere insieme ad un team di customer experience nella mia azienda.\n Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema?  È un tema sicuramente caldo e che ho percepito diverse volte nel corso della mia carriera. Spesso mi sono trovata ad essere l’unica ragazza al tavolo di discussione; questo non deve essere sempre percepito come un ostacolo, ma anzi vissuto con orgoglio, con la voglia di diventare esempio per altre ragazze.\n illimity è molto impegnata su questo tema, a partire dal team di design che è a maggioranza femminile. Basti pensare che il 42% dei dipendenti è donna e siamo tutte molto attive nelle iniziative di illimitHER.\n Per chi ancora non ci seguisse, illimitHER è il programma di Diversity \u0026amp; Inclusion di illimity per valorizzare il potenziale delle giovani donne.\n Nasce per diffondere la cultura delle STEM e rimuovere gli stereotipi culturali che allontanano le ragazze dai percorsi di studio nelle materie tecnico-scientifiche. L’idea è dare accesso a figure di ispirazione: donne che sono state capaci di andare oltre, rimodellando il futuro grazie al proprio percorso personale e professionale. Ma anche coinvolgere uomini che credono e sostengono l’uguaglianza di genere.\n Soprattutto, diamo voce alle giovani donne under 35, al fine di connetterle con le giovanissime pronte a entrare nel mondo dello studio e del lavoro. Per condividere skills digitali ed esperienze professionali da una prospettiva unica: la vicinanza generazionale.\n", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-senior-digital-strategist\/" }, "https:\/\/theredcode.it\/voglio-diventare-una...-inspiring-fifty\/": { "title": "Voglio diventare una... Inspiring Fifty", "tags": ["interviste","voglio-diventare",], "content": "Anna Gregorio è una di quelle donne che puoi solo ammirare: ha una forza inarrestabile, e non a caso ha fatto una carriera strabiliante, guadagnandosi un posto tra le migliori 100 donne italiane secondo Forbes\u0026hellip; Ma non è tutto qui, anzi: questo è solo l\u0026rsquo;inizio: vediamo quindi come diventare una Inspiring Fifty e, soprattutto, come portare una quota rosa nell\u0026rsquo;innovazione!\n Descriviti in 100 parole.  Mi dicono che già da bambina ero una piccola scienziata. Credo sia vero ma oggi sono anche un’imprenditrice e preferisco usare un termine legato all’innovazione per contribuire a creare un mondo come lo sogno io.\n Sono una persona normale, con un pizzico di pazzia e tanta passione. Ma se essere un’innovatrice vuol dire essere curiosa, cercare di capire le situazioni per il piacere di scoprire il mondo attorno a noi, di plasmarlo proponendo nuove tecnologie (per lo Spazio) che permettano di aiutare il progresso e condividerle con la società per migliorarla, allora sì, il mio sogno è proprio essere un’innovatrice.\n CEO, coordinator instrument operation team di Euclid (missione spaziale della ESA), membro del Comitato Scientifico del Collegio Fonda e professoressa associata all’Università di Trieste. Giornata piena, immagino! Com’è stato il tuo percorso professionale?  Giornate sempre pienissime, non c’è certo tempo per annoiarsi! Ho avuto un grande maestro, il mio papà scientifico mi ha trasmesso la sua passione e dedizione al lavoro ma mi ha anche insegnato a non trascurare la vita personale.\n Poi tutto è successo molto naturalmente, dopo la Laurea a Trieste, mia città natale, prima il dottorato a Pisa (Scuola Normale) e in parallelo la ricerca al CERN (Ginevra), poi il rientro a Trieste. Questo forse il momento più difficile perché improvvisamente risultavo un’esterna e non è stato facile farsi accettare. Ho voluto cambiare settore, da fisica delle particelle ad astrofisica, ma la fortuna aiuta gli audaci… ed eccoci qui.\n Comunque sempre al massimo sul lavoro e fuori, lo sport è la mia seconda vita che da sempre condivido con mio marito, il mio primo ragazzo, il mio miglior amico e fidato consigliere. Lo sport mi ha aiutato ad avere fiducia nelle mie capacità e a gestire successi e fallimenti, a ripartire dopo gli infortuni, a confrontarmi con gli altri, uomini e donne. La vela, lo sci e la corsa, sempre con me.\n E sempre con la valigia in mano, stranissimo essere a casa in questo periodo…\n Qual è la soft skill che più ti è stata di aiuto nella tua carriera?  Al primo posto metterei la tenacia ma subito dopo la capacità di mediare le situazioni e di mantenere un sorriso anche nelle condizioni più difficili.\nCredo che la combinazione di queste caratteristiche sia prettamente femminile, e in tutto quello che faccio c’è sempre un tocco di femminilità.\n Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare/cosa fai nel tuo piccolo per combattere questo problema?  Quanto pagine ho per scrivere? In questo periodo in cui sono personalmente in evidenza in molte occasioni, mi sono spessa fatta portavoce di queste problematiche. Non ultimo ho partecipato a uno spettacolo teatrale, “Le Eccellenti”, ne sono molto orgogliosa ma fa male…\n PICOSATS è nata anche per questi motivi. Dal 2008 al 2013 ho gestito lo strumento scientifico “LFI” a bordo di Planck, una missione scientifica di grande successo della European Space Agency (il mio ruolo attuale in Euclid riflette direttamente quanto fatto a quel tempo).\n Da sportiva, la definisco la mia scalata dell’Everest ma questa mia prestazione non è evidentemente stata considerata rilevante nella valutazione delle mie attività scientifiche, anzi. Dopo questa grande delusione ho deciso di mettermi in gioco in un altro settore. L’ho fatto per creare qualcosa di positivo, di utile per la nostra società, per i/le giovani, ma anche per dimostrare cosa una donna (ferita) può fare.\n Non aggiungo altro perché credo che i fatti rispondano chiaramente.\n Se avessi modo di parlare con la Anna 15enne, cosa le diresti? Cosa voleva fare Anna da grande?  Anna è nata scienziata, iperattiva e testarda, con tanta passione e credo di poter dire generosa e attenta ai sentimenti altrui. Ho sempre creduto che se una persona VUOLE raggiungere un suo sogno, lo può fare. Per cui le direi semplicemente “Credi in te stessa, è la miglior cosa che puoi fare.”\n Le darei però un ulteriore suggerimento: guardati ogni tanto alle tue spalle, ahimè onestà ed etica sono virtù non sempre scontate.\n 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.  Sono molto d’accordo, si impara soprattutto dai fallimenti. Di errori ne ho fatti molti ma come dico spesso, gli errori sono di chi “fa”, sulla poltrona non si fanno errori.\n Il mio più grande fallimento però non è scientifico o tecnico ma umano. Ho creduto nelle persone sbagliate e ingenuamente mi sono fidata di loro.\n Parlando infine di successi, sei stata nominata lo scorso anno da Forbes tra le donne italiane più influenti, quest’anno sei tra le Inspiring Fifty. Qual è il tuo prossimo obiettivo?  Il mio obiettivo è più pratico. La cosiddetta “New Space Economy” promette tempi di sviluppo e di crescita estremi. PICOSATS deve crescere, lo sta già facendo, ma voglio che cresca in maniera “sana”, le persone devono condividere i nostri valori, l’etica in primis.\n E poi ovviamente dal punto di vista scientifico il mio obiettivo è di gestire al meglio gli strumenti di Euclid, una missione spaziale estremamente complessa.\n Sul lungo termine, aggiungo un obiettivo che spero di raggiungere prima o poi ma che continuo a rimandare: “dedicarmi a me stessa”.\n Risorse utili: Anna Gregorio: Donne nella scienza Inspiring Fifty: Anna Gregorio Forbes: Picosats, la startup innovativa che punta a lasciare il segno nel cosmo  Ti potrebbero piacere anche\u0026hellip; Voglio diventare una Social Media Manager; Voglio diventare un Senior Back-end Developer; Voglio diventare un Senior Software Developer; Voglio diventare una Big Data Analyst; Voglio diventare una Digital Transformation Consultant; Voglio diventare un Data \u0026amp; Software Engineer; Voglio diventare uno Startupper; Voglio diventare una Operations Manager. ", "url": "https:\/\/theredcode.it\/voglio-diventare-una...-inspiring-fifty\/" }, "https:\/\/theredcode.it\/how-to\/come-si-misura-l-intelligenza-artificiale\/": { "title": "Come si misura l\u0027intelligenza (artificiale)", "tags": ["intelligenza-artificiale",], "content": "Spesso, quando si parla di intelligenza artificiale, oppure quando si lavora utilizzando tecniche di machine learning, ci si chiede come si faccia a stimare la bontà di una soluzione: quando posso veramente dirmi soddisfatta del risultato? Quando un sistema è in grado di essere classificato come intelligente?\n Anche gli stessi esseri umani spesso confondono le capacità mnemoniche con l\u0026rsquo;intelligenza: ricordare le poesie a memoria oppure sapere come risolvere un\u0026rsquo;equazione differenziale in meno di un minuto, non sono sinonimo di intelligenza.\n O meglio: l\u0026rsquo;intelligenza non si riduce a questo, ed è il motivo per cui con questi esempi, scambiare un sistema -o un computer- per intelligente può essere molto facile.\n La realtà è ben diversa: vediamo quindi come si misura l\u0026rsquo;intelligenza artificiale in questo articolo, analizzando alcuni degli aspetti che ci permettono di stimarne le reali capacità.\n Intro  Nel 2016, Lee Se-dol, il campione sudcoreano di Go che ha perso in uno storico match contro l\u0026rsquo;algoritmo di intelligenza artificiale AlphaGo di DeepMind, dichiarando il suo ritiro dal gioco professionale.\n Quello stesso giorno ha commentato dicendo \u0026ldquo;con il debutto dell\u0026rsquo;IA nei giochi Go, mi sono reso conto di non essere al top anche se divento il numero uno attraverso sforzi frenetici\u0026rdquo;, ha detto Lee all\u0026rsquo;agenzia di stampa Yonhap. \u0026quot; Anche se divento il numero uno, c\u0026rsquo;è un avversario che non può essere sconfitto.\u0026quot;\n Com\u0026rsquo;era prevedibile, i commenti di Se-dol hanno fatto rapidamente il giro di importanti pubblicazioni tecnologiche, alcune delle quali utilizzando titoli sensazionali riportando presunti spunti sul tema della dominanza dell\u0026rsquo;IA.\nSin dagli albori dell\u0026rsquo;IA, i giochi sono stati uno dei principali fattori di valutazione che permetesse la stima dell\u0026rsquo;efficienza degli algoritmi, e grazie ai progressi nel mondo del deep learning e dell\u0026rsquo;apprendimento per rinforzo, i ricercatori di intelligenza artificiale stanno creando programmi in grado di padroneggiare giochi molto complicati e battere i giocatori più esperti in tutto il mondo.\n Purtroppo, molti giornalisti e analisti disinformati hanno raccolto questi successi per suggerire che l\u0026rsquo;IA stia diventando più intelligente degli esseri umani, rischiando a breve di ritrovarci dominati da questa entità superiore.\nAllo stesso tempo, l\u0026rsquo;IA contemporanea fallisce miseramente in alcune delle attività più basilari che ogni essere umano può eseguire, come possono essere scegliere un tragitto che non sia passare su delle strade dissestate in mezzo alle campagne pur di farci risparmiare 2 minuti e 300 metri sul percorso verso la destinazione selezionata.\nQuesto fa sorgere la domanda: padroneggiare un gioco prova qualcosa? E se no, come si può misurare il livello di intelligenza di un sistema AI?\nPrendi il seguente esempio. Nell\u0026rsquo;immagine qui sotto, ti vengono presentati cinque problemi e la loro soluzione. C\u0026rsquo;è anche un sesto compito che non è stato risolto. Riuscite a indovinare la soluzione?\n Puzzle logico\nProbabilmente penserai che è molto facile (o molto difficile, dipende!) e sarai anche in grado di risolvere diverse varianti dello stesso problema con più combinazioni e diverse forme o colori, semplicemente vedendo questi esempi.\n Al momento, però, non esiste un sistema di intelligenza artificiale, compresi quelli sviluppati nei laboratori di ricerca più prestigiosi, che possa imparare a risolvere un problema del genere con così pochi esempi.\n L\u0026rsquo;esempio sopra è molto simile ad alcuni presenti nell\u0026rsquo;articolo \u0026quot; The Measure of Intelligence \u0026ldquo;, scritto da François Chollet, il creatore della libreria di deep learning di Keras. Chollet ha pubblicato questo articolo poche settimane prima che Le-sedol dichiarasse il suo ritiro, parlando proprio di come definire molte linee guida importanti sulla comprensione e la misurazione dell\u0026rsquo;intelligenza.\n Per questo, analizziamo alcuni degli aspetti di questo articolo, per vedere in che modo è possibile analizzare e stimare le reali capacità dell\u0026rsquo;IA.\n Cosa c\u0026rsquo;è di sbagliato nell\u0026rsquo;attuale IA?  \u0026ldquo;La comunità dell\u0026rsquo;IA contemporanea gravita ancora verso il benchmarking dell\u0026rsquo;intelligenza confrontando l\u0026rsquo;abilità esibita da sistemi di IA e esseri umani in compiti specifici, come giochi da tavolo e videogiochi\u0026rdquo;, scrive Chollet, aggiungendo che misurare solo le abilità in un dato compito non è sufficiente misurare l\u0026rsquo;intelligenza.\n Pensare che l\u0026rsquo;intelligenza sia sinonimo di capacità logiche o matematiche è totalmente erroneo: esistono diverse teorie, tra cui quella elaborata da Gardner, che parla proprio di diverse tipologie di intelligenza. Con il presupposto originale, invece, il lavoro nell\u0026rsquo;IA si è allontanato dalla visione originale di sviluppare \u0026ldquo;macchine pensanti\u0026rdquo; che possiedono un\u0026rsquo;intelligenza paragonabile a quella degli umani.\n “Anche se siamo in grado di progettare sistemi che si comportano estremamente bene su compiti specifici, ci sono ancora forti limiti, essendo fragili, affamati di dati, incapaci di dare un senso a situazioni che si discostano leggermente dai loro dati di addestramento o dalle ipotesi dei loro creatori, e incapaci di riutilizzare sé stessi per affrontare nuovi compiti senza un coinvolgimento significativo da parte dei ricercatori umani\u0026rdquo;, osserva Chollet nel documento.\n Le osservazioni di Chollet sono in linea con quelle fatte da altri scienziati sui limiti e le sfide dei sistemi di apprendimento profondo . Queste limitazioni si manifestano in molti modi:\n Modelli di intelligenza artificiale che necessitano di milioni di esempi per eseguire le attività più semplici; Sistemi di intelligenza artificiale che falliscono non appena si trovano davanti a casi limite, situazioni che esulano dai loro esempi di addestramento; Reti neurali che sono inclini a esempi contraddittori o piccole perturbazioni nei dati di input che fanno sì che l\u0026rsquo;IA si comporti in modo irregolare.  Ecco un esempio: le reti neurali che giocano a Dota di OpenAI hanno avuto bisogno dell\u0026rsquo;equivalente di 45.000 anni di gioco per raggiungere un livello professionale; infatti, l\u0026rsquo;IA è anche limitata nel numero di personaggi che può giocare e la minima modifica alle regole del gioco si tradurrà in un improvviso calo delle sue prestazioni.\n Lo stesso si può vedere in altri campi, come nel celebre caso delle auto a guida autonoma. Nonostante milioni di ore di esperienza su strada, gli algoritmi di intelligenza artificiale che alimentano i veicoli autonomi possono commettere errori stupidi, come schiantarsi contro i guardrail o i camion dei pompieri parcheggiati.\n Cos\u0026rsquo;è l\u0026rsquo;intelligenza  Una delle sfide chiave con cui la comunità dell\u0026rsquo;IA ha dovuto lottare è definire l\u0026rsquo;intelligenza. Gli scienziati hanno discusso per decenni sulla possibilità di fornire una definizione chiara che ci permetta di valutare i sistemi di intelligenza artificiale e determinare cosa sia intelligente o meno.\n Chollet prende in prestito la definizione del cofondatore di DeepMind Shane Legg e dello scienziato di intelligenza artificiale Marcus Hutter: \u0026ldquo;L\u0026rsquo;intelligenza misura la capacità di un agente di raggiungere obiettivi in un\u0026rsquo;ampia gamma di ambienti\u0026rdquo;.\n La chiave qui è \u0026ldquo;raggiungere obiettivi\u0026rdquo; e \u0026ldquo;ampia gamma di ambienti\u0026rdquo;: la maggior parte degli attuali sistemi di intelligenza artificiale è piuttosto adatta nella prima parte, che consiste nel raggiungere obiettivi molto specifici, ma non riesce a farlo in una vasta gamma di ambienti.\n Ad esempio, un sistema di intelligenza artificiale in grado di rilevare e classificare gli oggetti nelle immagini sarà bravissimo nel distinguere una persona da un gatto, ma non sarà in grado di eseguire altre attività correlate, come disegnare un cane o un gatto.\n Per spiegare questo concetto, Chollet esamina quindi i due approcci dominanti nella creazione di sistemi di intelligenza: AI simbolica e apprendimento automatico.\n AI simbolica vs machine learning  Le prime generazioni di ricerca sull\u0026rsquo;intelligenza artificiale si sono concentrate sull\u0026rsquo;intelligenza artificiale simbolica, che prevede la creazione di una r_appresentazione esplicita della conoscenza_ e del comportamento nei programmi per computer. Questo approccio richiede agli ingegneri umani di scrivere meticolosamente le regole che definiscono il comportamento di un agente AI.\n Il problema era che all\u0026rsquo;epoca si pensava fosse possibile descrivere e definire le abilità umane in regole formali dominate dalla logica, costruendo una sorta di conoscenza umana tramite delle apposite banche dati.\n Ma, piuttosto che essere intelligenti di per sé, questi sistemi simbolici di intelligenza artificiale manifestano l\u0026rsquo;intelligenza dei loro creatori nell\u0026rsquo;utilizzo di programmi -spesso- complicati in grado di risolvere compiti specifici.\n Il secondo approccio, ossia i sistemi basati sull\u0026rsquo;apprendimento automatico , si basa sul fornire al modello i dati del problema per far sì e lasciarlo sviluppare il proprio comportamento. La struttura di apprendimento automatico di maggior successo finora sono le reti neurali artificiali, che sono funzioni matematiche abbastanza complesse in grado di individuare dei modelli tra input e output.\n Ad esempio, invece di codificare manualmente le regole per rilevare il cancro nelle risonanze, si può utilizzare una rete neurale con molte risonanze fornite in input e -eventualmente- annotate con i relativi risultati, un processo chiamato \u0026ldquo;addestramento\u0026rdquo;.\n In questo caso, il cervello costituito dalla rete neurale, esamina i dati e sviluppa un modello matematico che rappresenta i tratti comuni dei modelli di cancro. Può quindi elaborare nuove radiografie e visualizzare la probabilità che i pazienti abbiano il cancro (disclaimer: si tratta di un\u0026rsquo;estrema semplificazione di un caso d\u0026rsquo;uso, la realizzazione è più complessa!).\nI progressi nelle reti neurali e nell\u0026rsquo;apprendimento profondo hanno consentito agli scienziati di intelligenza artificiale di affrontare molti compiti che in precedenza erano molto difficili o impossibili con l\u0026rsquo;IA \u0026ldquo;tradizionale\u0026rdquo;, come attività di elaborazione del linguaggio naturale, la visione artificiale e il riconoscimento di immagini.\n In questo senso, Chollet rifiuta entrambi gli approcci raccontati finora, perché nessuno di loro è stato finora in grado di creare un\u0026rsquo;IA generalizzata flessibile e fluida come la mente umana.\n “Vediamo il mondo attraverso la lente degli strumenti con cui abbiamo più familiarità. Oggi, è sempre più evidente che entrambe queste visioni della natura dell\u0026rsquo;intelligenza umana, che si tratti di una raccolta di programmi basati su una conoscenza di base o di una Tabula Rasa generica, sono probabilmente errate\u0026quot;, scrive.\n I sistemi veramente intelligenti dovrebbero essere in grado di sviluppare competenze di livello superiore che possono estendersi a molte attività. Sfortunatamente, il meglio che gli attuali sistemi di intelligenza artificiale ottengono è la \u0026ldquo;generalizzazione locale\u0026rdquo;, una stanza di manovra limitata all\u0026rsquo;interno del loro ristretto dominio.\n Generalizzazione  Nel suo articolo, Chollet sostiene che la \u0026ldquo;generalizzazione\u0026rdquo; o il \u0026ldquo;potere di generalizzazione\u0026rdquo; per qualsiasi sistema di intelligenza artificiale è la sua \u0026ldquo;capacità di gestire situazioni (o compiti) che differiscono dalle situazioni incontrate in precedenza\u0026rdquo;.\nÈ interessante notare che questo è un componente mancante dell\u0026rsquo;intelligenza artificiale sia simbolica che connessionista. Il primo richiede agli ingegneri di definire esplicitamente il suo confine comportamentale (fin dove sono in grado di arrivare? Quali sono i problemi che non posso risolvere con il mio sistema?) e il secondo richiede esempi che delineano il suo dominio di risoluzione dei problemi.\nChollet va anche oltre e parla di \u0026ldquo;generalizzazione consapevole dello sviluppatore\u0026rdquo;, che è la capacità di un sistema di intelligenza artificiale di gestire situazioni che \u0026ldquo;né il sistema né lo sviluppatore del sistema hanno incontrato prima\u0026rdquo;.\nQuesto è il tipo di flessibilità che ti aspetteresti da un maggiordomo-robot che potrebbe svolgere varie faccende all\u0026rsquo;interno di una casa senza avere istruzioni esplicite o dati di formazione su di esse. Un esempio è il famoso test del caffè di Steve Wozniak, in cui un robot entrava in una casa mai vista prima e preparava il caffè senza conoscere in anticipo la disposizione della casa o gli elettrodomestici in essa contenuti.\n Sembra un qualcosa relativamente banale per un essere umano, no? Per un sistema, è qualcosa di impossibile.\nAltrove nel documento, Chollet chiarisce che i sistemi di intelligenza artificiale che riescono nel loro obiettivo sfruttando l\u0026rsquo;esperienza acquisita in precedenza (tramite regole) e una base dati non sono intelligenti.\n Un esempio basato sulla rete neurale è AlphaZero , l\u0026rsquo;IA multiuso che è in grado di portare avanti una partita in diversi giochi da tavolo sfruttando milioni di partite per comprendere il gioco e come vincere.\nQuesto approccio funziona però facendo uso di risorse che vanno oltre le capacità della mente umana: l\u0026rsquo;essere umano più brillante non può memorizzare decine di migliaia di regole degli scacchi. Allo stesso modo, nessun essere umano può giocare milioni di partite a scacchi in una vita.\n\u0026ldquo;Risolvere qualsiasi compito con prestazioni al di là del livello umano sfruttando precedenti illimitati o dati illimitati non ci avvicina all\u0026rsquo;IA ampia o all\u0026rsquo;IA generale, indipendentemente dal fatto che il compito sia scacchi, calcio o qualsiasi e-sport\u0026rdquo;, osserva Chollet.\nQuesto è il motivo per cui è totalmente sbagliato confrontare Deep Blue, Alpha Zero, AlphaStar o qualsiasi altra IA di gioco con l\u0026rsquo;intelligenza umana.\n Come misurare l\u0026rsquo;intelligenza  Nel suo articolo, Chollet presenta l\u0026rsquo;Abstraction Reasoning Corpus (ARC), un dataset destinato a valutare l\u0026rsquo;efficienza dei sistemi di intelligenza artificiale e confrontare le loro prestazioni con quelle dell\u0026rsquo;intelligenza umana. ARC è un insieme di problemi da risolvere su misura sia per l\u0026rsquo;intelligenza artificiale che per gli esseri umani.\nUna delle idee chiave alla base di ARC è livellare il terreno di gioco tra umani e sistemi di intelligenza artificiale per fornire un terreno dove entrambi gli attori siano sullo stesso piano: è infatti progettato in modo che gli umani non possano sfruttare la loro vasta conoscenza di base del mondo per superare in astuzia l\u0026rsquo;intelligenza artificiale.\n Ad esempio, non comporta problemi relativi alla lingua, con i quali i sistemi di intelligenza artificiale hanno storicamente lottato; d\u0026rsquo;altra parte, è anche progettato in modo da impedire all\u0026rsquo;IA (e ai suoi sviluppatori) di barare e sfruttare l\u0026rsquo;accesso a grandi quantità di dati o modelli da cui attingere le informazioni necessarie.\n In questo caso, gli sviluppatori di sistemi dotati di IA devono costruire qualcosa in grado di gestire vari concetti come la coerenza di un oggetto, la persistenza dell\u0026rsquo;oggetto e delle azioni sull\u0026rsquo;oggetto, imparando a eseguire attività come cambiarne le dimensioni, disegnare qualcosa di simile, ruotarlo o colorarlo, riempiendo gli spazi.\n Esempio di attività da risolvere tramite l\u0026rsquo;ARC\nInoltre, il set di dati di test, i problemi che hanno lo scopo di valutare l\u0026rsquo;intelligenza del sistema sviluppato, sono progettati in modo tale da impedire agli sviluppatori di risolvere i compiti in anticipo e di codificare la loro soluzione nel programma.\nSecondo Chollet, \u0026ldquo;ARC valuta solo una forma generale di intelligenza fluida, con particolare attenzione al ragionamento e all\u0026rsquo;astrazione\u0026rdquo;. Ciò significa che il test favorisce la \u0026ldquo;sintesi del programma\u0026rdquo;, il sottocampo dell\u0026rsquo;intelligenza artificiale che implica la generazione di programmi che soddisfano le specifiche di alto livello.\n Esempio di task da risolvere: colorare tutti gli spazi interni alla figura di giallo\n Questo approccio è in contrasto con le tendenze attuali nell\u0026rsquo;IA, che sono inclini a creare programmi ottimizzati per un insieme limitato di attività, come ad esempio, saper vincere una partita ad un determinato gioco.\n Conclusioni  Nei suoi esperimenti con ARC, Chollet ha scoperto che gli esseri umani possono risolvere completamente i test ARC, mentre sembra che ARC sia fuori dalla portata degli attuali sistemi di intelligenza artificiale, che anche utilizzando eventualmente tecniche di Deep Learning, tendono a generalizzare un\u0026rsquo;attività che non è possibile astrarre completamente.\n Attualmente è infatti aperta (ancora per poco) una competizione su Kaggle, con in palio 20.000 dollari (divisi per i diversi livelli del podio): molti team hanno partecipato con entusiasmo alla challenge, ottenendo tra i punteggi massimi la risoluzione del 20% del dataset proposto; c\u0026rsquo;è da dire che Chollet non pensava di arrivare a questa soglia.\n Messaggio di Chollet che ringrazia i partecipanti alla challenge\n Sebbene l\u0026rsquo;ARC sia un lavoro in corso, può diventare un punto di riferimento promettente per testare il livello di progresso verso l\u0026rsquo;IA a livello umano.\n \u0026ldquo;Ipotizziamo che l\u0026rsquo;esistenza di un sistema in grado di risolvere le attività proposte all\u0026rsquo;interno dell\u0026rsquo;ARC: questo rappresenterebbe la capacità di programmare un\u0026rsquo;intelligenza artificiale tramite dei singoli esempi su attività completamente diverse per svolgere una vasta gamma di attività, cosa che normalmente richiederebbe un\u0026rsquo;intelligenza fluida, simile a quella umana\u0026rdquo;, osserva Chollet.\n Considerato il tipo di competenze necessarie per la risoluzione di queste problematiche e i risultati ottenuti finora, possiamo convenire che la tecnologia ha fatto dei passi da gigante e che i sistemi di intelligenza artificiale hanno imparato a risolvere dei compiti piuttosto difficili.\n Chiederci però come si misura l\u0026rsquo;intelligenza artificiale è però una domanda difficile a cui rispondere, perché significa tenere in conto di tutte le capacità umane che maturiamo con l\u0026rsquo;esperienza, circondati continuamente da stimoli che coinvolgono lo spazio, riferimenti temporali, 5 diversi sensi e via dicendo\u0026hellip;\n Ergo, tranquill*: nessun sistema di intelligenza artificiale potrà (al momento) prendere il posto di un essere umano quanto a intelligenza!\n", "url": "https:\/\/theredcode.it\/how-to\/come-si-misura-l-intelligenza-artificiale\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-operations-manager\/": { "title": "Voglio diventare una... Operations Manager", "tags": ["interviste","voglio-diventare",], "content": "Oggi è il turno di una ragazza brillante, diretta e fortissima: raccontare la propria storia e la propria vita senza filtri non è affatto semplice, ma lei non se ne preoccupa.\n Ogni giorno racconta un episodio della sua vita \u0026ldquo;passata\u0026rdquo; e di quelle presente, condividendo in maniera trasparente successi e fallimenti nel suo lavoro, giornate belle e quelle meno brutte; parla della sua famiglia, del suo lavoro e della sua amata India.\n Senza ulteriori indugi, passiamo la parola a Parminder Kaur per raccontarci cosa vuol dire essere una Operations Manager!\n Descriviti in 100 parole  Sono Parminder Kaur e sono Operations Manager di VoipVoice.\n Sono indiana di nascita e italiana di adozione, vivo in Italia da 21 anni. Amo l’arte, i gialli e viaggiare. Vivo nei pressi di Firenze, quindi in una delle regioni più belle di Italia a mio parere!\n Da piccola sognavo di diventare astronauta, ma la vita riserva sempre qualcosa di differente per noi.\n Dopo la fine degli studi scolastici sono entrata nel mondo del lavoro -e per caso- e ora posso dire che con mia grande fortuna ho iniziato un corso tramite il quale mi sono imbattuta in VoipVoice.\n Non avrei mai pensato di fare quello che faccio oggi, cioè la Operations Manager di VoipVoice.\n Lavoro in questa azienda da circa 11 anni: si tratta di una compagnia di telecomunicazioni che attiva servizi di fonia Voip e connettività su tutto il territorio italiano.\n In cosa consiste il ruolo di Operations Manager?  È un ruolo abbastanza complesso, ma nello specifico una Operations Manager gestisce tutti i processi aziendali, che vanno dalla gestione di un Lead alla gestione delle richieste post fatturazione, ma il mio lavoro è fatto anche di mail così come di riunioni.\n  Ogni attività che c’è in azienda deve essere fluida, snella e chiara nella sua modalità di gestione a tutti.\n  Inoltre, il lavoro dell’Operations Manager è quello che migliorare, ottimizzare e adattare ogni processo in base ai vari cambiamenti che ci possono essere all’interno dell’azienda.\n Non solo: deve integrare anche le novità nel migliore dei modi per creare sempre la linearità tra vari reparti e mansioni.\n Dunque si tratta di un lavoro circolare che non finisce mai, in quanto ci sono sempre delle variazioni o aggiornamenti.\n Al momento, nel mio caso, è un lavoro solitario, ma necessito sempre dei confronti con tutte le persone che operano su campo per trovare la soluzione che si adatta a tutti.\n Qual è la soft skill più importante che deve possedere una Operations Manager?  Sicuramente Problem Solving perché le richieste da gestire hanno sempre delle criticità che devono essere viste da tutti i punti di vista.\n Bisogna in questi casi indossare i famosi 6 capelli di De Bono perché non basta vedere l’aspetto positivo della situazione.\n Però penso che oltre a questo aspetto oggettivo ci sono altre due soft skill necessarie nel mio lavoro: Ascolto ed Empatia.\n  Ascoltare attentamente e capire l’esigenza delle persone che si interfacciano con noi per creare insieme processi è una degli aspetti che vanno curati maggiormente.\n  Ci possono essere varie versioni di varie questioni, ma tramite l’ascolto bisogna sapere cogliere l’essenza della situazione.\n 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.  Una dei miei punti deboli è sempre stata la precisione, sulla quale cerco di lavorarci sempre.\n Inizialmente facevo tutto insieme ad altre colleghe in azienda perché eravamo in pochi. Ho provato a fare varie volte i processi di fatturazione ma spesso ho sbagliato degli step e sono ripartita da 0, allungando così i giorni di fatturazione.\n Alla fine, fu deciso, giustamente, di farmi gestire l’assistenza tecnica in quanto avevo forte propensione alla Customer Care e dunque da questo fallimento arrivai verso il percorso che mi aiutò a trovare la mia strada.\n  Nel fallimento ho trovato il mio posto e non ritornerei indietro.\n  Sulla precisione ci lavoro tuttora e cerco di batterci la testa sempre!\n Come fare per diventare una Operations Manager?  Personalmente per me è stato un percorso molto differente da un percorso specifico per qualsiasi Operations Manager. Ho gestito un po\u0026rsquo; tutto quello che sono le attività dell’azienda, specializzandomi nella parte del problem solving.\n In ogni caso, è frutto di esperienza e conoscenza a fondo della propria azienda e settore alla quale si aggiungono gli studi sulla gestione lean. La gestione lean riprende un continuo miglioramento delle attività togliendo gli sprechi e aggiungendo valore ad ogni processo.\n Le competenze principali sono quelle di organizzazione e ottimizzazioni processi con una spiccata leadership nella gestione delle squadre. Anche la capacità di gestire lo stress e collocazione del personale al posto giusto collaborando così con l’HR dell’azienda.\n Alla fine**, formazione formazione formazione** e tanta formazione perché in qualsiasi ruolo non si smette mai di imparare!\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Al momento vorrei migliorare le mie competenze nella gestione dei processi che ho finalmente iniziato a fare da luglio di quest’anno. Dunque, mi sto dedicando all’80% ai processi che, come ho scritto sopra, hanno bisogno di un continuo monitoraggio.\n  Cambiano troppo in fretta le cose nel settore delle TLC.\n  Allo stesso tempo mi piacerebbe poi evolvere questo mio ruolo in Project Manager, lavoro che adoro moltissimo.\n Conosci il tema gender gap in ambito STEM? Se sì, hai mai avuto qualche esperienza negativa? Cosa pensi sia possibile fare nel tuo piccolo per combattere questo problema?  Assolutamente si! Il settore delle telecomunicazioni è un settore fortemente costituito dagli uomini ed è difficile trovare donne tecniche. È sempre un piacere vedere ogni tanto un partner donna e vedere che qualcosa sta cambiando.\n Personalmente, quando ho lavorato all’assistenza tecnica e ho gestito le chiamate, a parte il nome straniero, era difficile far arrivare dall’altra parte il messaggio che potevo gestire io e risolvere la questione postami anche se era una questione tecnica.\n Non è stato facile ma negli anni poi quei partner mi hanno dato fiducia e mi hanno aiutata anche a crescere le mie competenze quando io cercavo di risolvere le loro questione tecniche.\n Mi piacerebbe moltissimo che nel settore delle telecomunicazioni ci fosse meno il divario tra sessi e più inclusione femminile come stiamo facendo nella nostra azienda.\n In VoipVoice stiamo cercando di favorire maggiormente la parte femminile nelle varie mansioni ed infatti non a caso ci sono 22 donne contro 15 uomini.\n Quello che è possibile fare e sono sicura che è fattibile, è fare dei corsi di specializzazione per il mondo digitale rivolto alle donne per farle avvicinare ancora di più verso questo settore.\n  Le competenze si imparano con esperienza, anche nel mondo digitale!\n ", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-operations-manager\/" }, "https:\/\/theredcode.it\/perch%C3%A9-usare-docker-per-il-machine-learning\/": { "title": "Perché usare Docker per il machine learning", "tags": ["aws","docker","intelligenza-artificiale","machine-learning",], "content": " “Sul mio PC funziona”.\n  Questa è la classica frase con cui, chi lavora nel settore IT -e non solo- ha a che fare quotidianamente e che porta ad ore di revisioni, controlli e confronti.\n Se poi si parla di applicazioni che riguardano il machine learning, basta immaginarsi di dover avere a che fare con questioni come l’installazione di dipendenze, requisiti di sistema, CPU, GPU e altro ancora per desistere da ogni tentativo.\n E se tutto questo potesse diventare marginale?\n In questo, il mondo DevOps può arrivare in soccorso di chi vuole lavorare a costo -quasi- zero e rendendo lo stereotipo “sul mio PC funziona” uno stile di vita.\n Vediamo come sfruttare la forza di Docker per combinarla con il mondo del machine learning e creare una fusione dalla potenza incredibile.\n Premesse  Una premessa è doverosa: chi di noi ha un passato da sviluppatrice/sviluppatore, sa bene che lavorare sul proprio PC è tutt\u0026rsquo;altro che emozionante: si passa più tempo a litigare con gli aggiornamenti, le installazioni e le dipendenze, che a scrivere codice.\n Sia chiaro: pretotipare e prototipare sul proprio laptop è bellissimo ed è quello che, bene o male, facciamo tutti. Quando poi si ha bisogno di lavorare insieme a qualcuno, si sfruttano GitHub o simili per condividere il proprio codice e lavorare a più mani.\n E se avessi bisogno di maggiore potenza? Ecco che molti dei cloud provider che sono sul mercato vengono in nostro soccorso, fornendo delle macchine on-demand che possiedono certamente più CPU e GPU di quanta ce ne potremmo mai permettere allo stesso costo.\n  In questo scenario, qual è la necessità di ricorrere ai container, o perfino a Docker?\n  I container non sono quei pezzi di metallo nei porti che ci aiutano ad avere ogni giorno ciò di cui abbiamo bisogno?\n Scherzi a parte, i container sono spesso considerati qualcosa di assolutamente esotico, normalmente relegato alle responsabilità di sistemisti\u0026amp;co. che sono reputati i veri esperti del tema e che si occuperanno -con della magia, non c\u0026rsquo;è dubbio- di far funzionare il tuo codice.\n \u0026hellip; se non fosse che in questo settore la competizione è spesso così alta, che bisogna saper fare un po\u0026rsquo; di tutto, e soprattutto per chi ama questo lavoro, aggiungere un\u0026rsquo;altra tacchetta al proprio CV fa sempre bene.\n Andiamo quindi ad analizzare in prima battuta quali sono le problematiche che possono venir fuori quando si ha a che fare con del software che sfrutta tecniche e librerie di machine learning, e poi perché dovremmo considerare l\u0026rsquo;idea di usare i container contro i nostri malditesta.\n Caso di studio  Immagina di avere a che fare con un progetto che richiede la creazione di un sistema per il riconoscimento delle immagini che sia in grado di addestrare una rete generativa avversaria su dati mammografici per evidenziare caratteristiche di malignità utilizzando immagini radiografiche.\n  Per approfondire la tematica relativa alle reti GAN, leggi questo articolo.\n  Sembra un\u0026rsquo;attività piuttosto ambiziosa, no?\n In realtà, richiede l\u0026rsquo;utilizzo di diversi ingredienti, come potenza di computazione, memoria, librerie, backup (non si sa mai\u0026hellip;) e via dicendo. Tutto questo può essere configurato in locale o, ancora meglio, su una macchina EC2, a cui accedere tramite SSH e far sì che sia il server a farsi carico del lato operativo!\n Quindi, cosa c\u0026rsquo;è di sbagliato in questa configurazione? Niente, in realtà: la maggior parte delle configurazioni di sviluppo ha avuto questo aspetto per decenni: nessun cluster, nessun file system condiviso, versionamento del codice per coordinare diversi team\u0026hellip;\n Fatta eccezione per una piccola comunità di ricercatori nell\u0026rsquo;ambito della High-Performance Computing (HPC) che sviluppano codice e lo eseguono su supercomputer, il resto di noi si affida alle nostre macchine dedicate per lo sviluppo.\n A quanto pare, il machine learning ha più cose in comune con l\u0026rsquo;HPC che con lo sviluppo software tradizionale. Come i carichi di lavoro che richiedono HPC, i carichi di lavoro possono beneficiare di un\u0026rsquo;esecuzione più rapida e di una sperimentazione più rapida quando vengono eseguiti su un cluster di grandi dimensioni.\n Però, per poter sfruttare un cluster in cui effettuare delle attività di machine learning, devi assicurarti che il tuo ambiente di sviluppo sia portabile e che l\u0026rsquo;addestramento sia riproducibile su un cluster.\n Portabilità  Ad un certo punto del tuo lavoro di sviluppo del machine learning, andrai a scontrarti con uno di questi problemi:\n Stai sperimentando diverse cose e hai troppe varianti dei tuoi script di addestramento da eseguire, per cui sei bloccato perché non hai sufficienti risorse per parallelizzare le attività; Stai eseguendo l\u0026rsquo;addestramento su un modello di grandi dimensioni con un set di dati enorme e non è possibile eseguirlo sul tuo laptop, ottenendo anche risultati in un ragionevole lasso di tempo.  Questi due casi portano a momenti di forte frustrazione e sono proprio la ragione per cui utilizzare dei container su un cluster potrebbe essere una buona idea. Se decidessi di prendere questa via, allora la prima cosa su cui è necessario concentrarsi è la portabilità.\n Concetto sconosciuto ai più, o scontato per chi è del mestiere, è la caratteristica fondamentale che ha fatto di Docker una società incredibile nel giro di pochi anni.\n Infatti, la portabilità rappresenta la capacità di astrarre la soluzione software da dipendenze, configurazioni hardware e software come le risorse a disposizione o il sistema operativo, e rendere la nostra soluzione funzionante su qualsiasi ambiente fornendo delle semplici indicazioni.\n Un po\u0026rsquo; come quando ci passano la ricetta della parmigiana di nonna con tutti gli ingredienti e il procedimento, e noi dobbiamo \u0026ldquo;solo\u0026rdquo; prepararla\u0026hellip;\n Scherzi a parte, è molto più semplice di questo, ed entrambe le soluzioni descritte in precedenza richiedono che tu sia in grado di riprodurre correttamente e in modo coerente la tua configurazione di training per lo sviluppo su un cluster.\n Questa è sicuramente la parte più impegnativa perché il cluster potrebbe eseguire diversi sistemi operativi e versioni del kernel; diverse GPU, driver e runtime; e diverse dipendenze software rispetto alla macchina di sviluppo, per cui bisogna pensare a quali sono le reali necessità per far sì che la soluzione funzioni.\n Un altro motivo per cui hai bisogno di ambienti di machine learning portabili è per lo sviluppo collaborativo: condividere il tuo lavoro con altri colleghi tramite il versionamento del software è facile.\n Garantire la riproducibilità dell\u0026rsquo;output della soluzione senza condividere l\u0026rsquo;intero ambiente di esecuzione con codice, dipendenze e configurazioni è più difficile, come vedremo a breve.\n Dipendenze, hardware\u0026amp;co.  Una sfida per chi lavora con il machine learning è che bisogna basarsi su framework e toolkit di machine learning open source spesso complessi e in continua evoluzione che funzionano su ecosistemi hardware moderni e complessi. Sono certo condizioni che rappresentano qualità positive, ma pongono sfide a breve termine.\nQuante volte hai eseguito degli script con algoritmi di machine learning e ti sei post* queste domande:\n Il mio codice sfrutta tutte le risorse disponibili su CPU e GPU? Ho le librerie giuste per sfruttare l\u0026rsquo;hardware? Sono le versioni giuste? Perché il mio codice di addestramento funziona bene sulla mia macchina, ma si blocca su quella del mio collega, quando gli ambienti sono più o meno identici? Ho aggiornato i miei driver oggi e la formazione ora è più lenta/errori. Come mai? Perché sul mio PC funziona e su quello di Caio no?  Se potessimo disegnare il modo in cui spendiamo il nostro tempo su questo dipo di attività, sarebbe più o meno fatto così:\n Stack tradizionale di un\u0026rsquo;applicazione per il ML\n Se dai un\u0026rsquo;occhiata da vicino, noterai che trascorri la maggior parte del tuo tempo nella seconda parte del disegno, chiamato \u0026ldquo;configurazione\u0026rdquo;. Ciò include la configurazione dell\u0026rsquo;ambiente, delle librerie, la verifica delle dipendenze, l\u0026rsquo;aggiornamento delle stesse, l\u0026rsquo;installazione dell\u0026rsquo;ennesima libreria che ti eri perso, la configurazione del repository Git, e via dicendo.\n Come se ciò non fosse abbastanza complesso, sai bene che le librerie vengono aggiornate continuamente, che tra una versione x della libreria y e la sua versione con quel minor fix che ti serve proprio, c\u0026rsquo;è di mezzo una crisi nevrotica. Non solo: ci sono librerie che funzionano solo su macchine che hanno la GPU, e quella libreria a te risparmierebbe tanto tempo\u0026hellip;\n Quanto tempo rimane al codice? Tanto, certamente, ma il tempo di esecuzione? Porta a molti tempi morti che diventano l\u0026rsquo;attesa di un risultato che, se porta degli errori, richiede la revisione dell\u0026rsquo;interno processo.\n A causa dell\u0026rsquo;elevata complessità di uno stack software come quello necessario al machine learning, quando passi il ​​codice sul computer di un collega o in un ambiente cluster, rischi di aumentare i punti di errore.\n Infatti, tutto ciò che è stato evidenziato, rappresenta un punto di rottura dell\u0026rsquo;intero processo, che porta al fallimento dei tuoi esperimenti.\n Potresti a questo punto però obiettare pensando che, per questo, esiste l\u0026rsquo;ambiente virtuale, come grazie ad Anaconda; in parte è vero, questi strumenti astraggono il tuo lavoro, ma solo in parte.\n Diverse dipendenze non Python -che però Python usa- non sono gestite da queste soluzioni. A causa della complessità di un tipico stack di machine learning, gran parte delle dipendenze del framework, come le librerie hardware, non rientrano nell\u0026rsquo;ambito degli ambienti virtuali.\n Lunga vita ai container  A questo punto, cerchiamo di elencare tutti i possibili punti di fallimento del nostro lavoro, riprendendo le immagini viste in precedenza.\n Sappiamo che il software che stiamo progettando fa parte di un ecosistema frammentato su più parti di codice e con diverse persone che vi collaborano.\n La collaborazione è un\u0026rsquo;ottima cosa, poiché tutti beneficiano dei contributi di tutti e il tuo lavoro potrebbe tornare utile a qualcuno. Il rovescio della medaglia è affrontare problemi come la coerenza, la portabilità e la gestione delle dipendenze.\n È qui che entrano in gioco le tecnologie dei container. In questo articolo non discuterò i vantaggi generali dei container -che puoi trovare qui-, ma parleremo solo dei vantaggi che apporta al nostro lavoro di machine learning.\n I container possono incapsulare completamente non solo il codice di training, ma l\u0026rsquo;intero stack di dipendenze fino ad arrivare alle librerie hardware.\n Quello che ottieni è un ambiente di sviluppo di machine learning coerente e portabile. Con i container, sia la collaborazione che la scalabilità su un cluster diventano molto più semplici.\n Se sviluppi codice ed esegui il training in un container, puoi condividere comodamente non solo i tuoi script, ma l\u0026rsquo;intero ambiente di sviluppo, aggiornando l\u0026rsquo;immagine del container tramite un registry e chiedendo a un collega o a un servizio di automazione di estrarre l\u0026rsquo;immagine del container e di aggiornare l\u0026rsquo;ambiente in esecuzione per riprodurre i risultati.\n Esempio di containerizzazione di un\u0026rsquo;applicazione per il ML\n L\u0026rsquo;approccio giusto che ci porta a risparmiare del tempo e ci fa guadagnare terreno nel nostro lavoro è quello che considera di includere dipendenze e framework all\u0026rsquo;interno del container, fornendo (o includendo) il codice di training del tuo processo tramite la definizione di un\u0026rsquo;immagine.\n Questo permette di lavorare esclusivamente agli aspetti che riguardano la gestione del processo di addestramento, e lasciare che la configurazione generica sia gestita interamente dal container, che installerà tutto ciò che gli viene indicato e si occuperà solo di processare l\u0026rsquo;input.\n Anche condividere e modificare l\u0026rsquo;immagine di sviluppo è facile. Nell\u0026rsquo;ambiente di lavoro possiamo infatti andare a configurare un registry che tenga memoria delle versioni prodotte delle nostre immagini, per poterne effettuare il deploy secondo le esigenze.\n Per questo, AWS mette a disposizione dei container grazie a AWS Deep Learning Container, i quali contengono i più diffusi framework di deep learning open source e che sono necessitano di CPU e GPU ottimizzate per il calcolo.\n Caso d\u0026rsquo;uso  Torniamo all\u0026rsquo;esempio fatto inizialmente: vogliamo costruire sistema che sia in grado di riconoscere, utilizzando delle immagini mammografiche, possibili masse relative a carcinoma di origine benigna o maligna.\n Per portare avanti un\u0026rsquo;idea del genere, di sicuro avremo bisogno di utilizzare librerie come Pytorch o Tensorflow. Peccato che il mio PC abbia più di cinque anni e abbia una versione di Windows abbastanza obsoleta. Come fare?\n Dopo aver creato un account gratuito su AWS, posso andare a creare un\u0026rsquo;istanza EC2. Per chi non ne avesse mai sentito parlare, si tratta di un servizio che mette a disposizione delle macchine con diverse caratteristiche, a seconda delle esigenze.\n Ad esempio, quelle che appartengono alle famiglie C, P o G, sono perfette se abbiamo bisogno di potenza computazionale, così come le suddette librerie richiedono.\n Inoltre, possiamo scegliere tra diverse AMI (abbreviazione di Amazon Machine Image) che ci permettono di avviare delle macchine con tutto l\u0026rsquo;occorrente già pronto e installato: perché non utilizzare allora un container già pronto?\n Esistono infatti diversi container che hanno TensorFlow o PyTorch già installato, con una serie di librerie annesse: l\u0026rsquo;elenco completo di quelle messe a disposizione è disponibile nella documentazione fornita da AWS.\n Esempio di AMI per il Deep Learning con TensorFlow\nUna volta avviata l\u0026rsquo;istanza di EC2, sarà sufficiente avviare il container di TensorFlow con un comando simile al seguente (verificando la region specificata, che in questo caso è quella europea in Irlanda):\ndocker pull 763104351884.dkr.ecr.eu-west-1.amazonaws.com/tensorflow-training:2.1.0-gpu-py36-cu101-ubuntu18.04 docker run -it --runtime=nvidia -v $PWD:/projects --network=host --name=tf-dev 763104351884.dkr.ecr.eu-west-1.amazonaws.com/tensorflow-training:2.1.0-gpu-py36-cu101-ubuntu18.04  Dopodiché, dovremo solo installare il modulo jupyterlab tramite pip e avviare un nuovo laboratorio, che ci permetterà di lavorare e testare il codice sorgente in maniera più agile:\n pip install jupyterlab jupyter lab --ip=0.0.0.0 --port=9999 --allow-root --NotebookApp.token=\u0026#39;\u0026#39; --NotebookApp.password=\u0026#39;\u0026#39; Avvio di un Jupyter notebook\n Immaginando di lavorare direttamente in questo ambiente e di modificare quindi il container di base di cui abbiamo effettuato il pull in precedenza, arriveremo ad un punto in cui sarà necessario salvare il lavoro fatto: per questo, c\u0026rsquo;è docker commit.\n Nel momento in cui la nostra immagine sarà pronta e vorremo condividerla con gli altri colleghi, potremo sfruttare o un repository disponibile su Docker Hub, o anche Amazon Elastic Container Registry:\n aws ecr create-repository --repository-name my-tf-dev $(aws ecr get-login --no-include-email --region \u0026lt;REGION\u0026gt;) docker tag my-tf-dev:latest \u0026lt;ACCOUNT_ID\u0026gt;.dkr.ecr.\u0026lt;REGION\u0026gt;.amazonaws.com/my-tf-dev:latest docker push \u0026lt;ACCOUNT_ID\u0026gt;.dkr.ecr.\u0026lt;REGION\u0026gt;.amazonaws.com/my-tf-dev:latest  Tutto ciò che ho fatto finora, mi permette di essere cert* al 100% che il mio lavoro funzionerà esattamente come l\u0026rsquo;ho progettato su qualunque altra infrastruttura: sarà sufficiente utilizzare l\u0026rsquo;immagine caricata nel repository e avviarla.\n Semplice, no?\n Verso la conclusione  Arrivati a questo punto, potrebbe sorgere spontanea la domanda: e perché io, che mi occupo di data science, machine learning e via discorrendo, dovrei mettermi a gestire tutto questo?\n Certo, c\u0026rsquo;è un notevole risparmio di tempo e di possibili problematiche, ma non conoscendo così bene strumenti di orchestrazione, non avendo familiarità con tematiche come la gestione di un cluster, avrei difficoltà con un approccio del genere.\n Ecco l\u0026rsquo;asso nella manica: Amazon SageMaker. Si tratta di un servizio completamente gestito dove tutta la parte relativa alla configurazione di Jupyter, dell\u0026rsquo;ottimizzazione degli hyperparameters e dei nodi che ospiteranno la nostra applicazione (sì, per quando diventeremo grandi), è in mano ad Amazon.\n La nostra unica attività sarà quella di definire l\u0026rsquo;immagine da utilizzare: al resto, penserà SageMaker.\n Funzionalità di Amazon SageMaker\n Visto il nostro caso d\u0026rsquo;uso, avere a disposizione della potenza computazionale sufficiente allo scopo è fondamentale per ottenere un buon risultato.\n Ad esempio, AWS fornisce la possibilità di utilizzare Apache MXNet, ossia un framework di addestramento e inferenza veloce e scalabile integrata da un\u0026rsquo;API per attività di machine learning e deep learning.\n MXNet include l\u0026rsquo;interfaccia Gluon, che permette agli sviluppatori a qualsiasi livello di competenza di iniziare con il deep learning su cloud, per creare regressione lineare, reti convoluzionali e reti LSTM ricorrenti per il rilevamento di oggetti, il riconoscimento vocale, riconoscimento di immagini e via dicendo.\n La community dietro al mondo del machine learning si muove velocemente. Esistono migliaia di ricerche che vengono portate avanti ogni giorno, grazie alla pubblicazione di API e framework open source sempre aggiornati.\n Un approccio come questo ci garantisce molti vantaggi, come la possibilità di concentrarci sullo sviluppo, senza preoccuparci di non avere sufficiente potenza computazionale o di rendere difficile la collaborazione e la fruizione del nostro lavoro.\n Quando il software si evolve così rapidamente, tenere il passo con le ultime novità e mantenere la qualità, la coerenza e l\u0026rsquo;affidabilità di ciò a cui lavori può essere difficile\u0026hellip;\n \u0026hellip;ma non c\u0026rsquo;è bisogno di preoccuparsi. Passare allo sviluppo di attività di ML tramite container è un modo per affrontare queste sfide, come spero sia emerso in questo articolo sul perché usare Docker per il machine learning!\n", "url": "https:\/\/theredcode.it\/perch%C3%A9-usare-docker-per-il-machine-learning\/" }, "https:\/\/theredcode.it\/voglio-diventare-uno...-startupper-come-voltar\/": { "title": "Voglio diventare uno... Startupper, come Voltar", "tags": ["interviste","voglio-diventare",], "content": "Quando senti parlare di ragazzi di 19/20 anni che mettono su startup che fanno cose incredibili, quasi ti viene voglia di costruire una macchina del tempo per tornare indietro e dare un senso a quel decennio.\n Si parla di incredibile soprattutto se parliamo di questi due giovanissimi che hanno avuto un\u0026rsquo;idea brillante grazie ad una semplice necessità e grazie ad un grande impegno nel campo umano\u0026hellip;\n Senza però fare nessuno spoiler, diamo voce a Niccolò e Alessandro, due ragazzi che come startupper hanno fondato la loro prima realtà chiamata Voltar, grazie ad OperaLogica che li ha aiutati in questo bellissimo percorso!\n Presentatevi in meno di 100 parole!  Siamo Niccolò Armellini e Alessandro Sala, founder di Voltar, startup innovativa sul territorio di Garbagnate Milanese. Siamo due informatici di 19 anni diplomati al ITIS S. Cannizzaro di Rho e da sempre siamo appassionati di programmazione e tecnologia.\n Niccolò: Dal 2017 sono volontario alla Croce Rossa Italiana Comitato delle Groane e vivendo in prima persona i problemi dell’associazione di soccorso legati alla digitalizzazione, ho coinvolto Alessandro per sviluppare una piattaforma con un\u0026rsquo;unica missione: semplificare il lavoro dei soccorritori, dei volontari e delle associazioni di soccorso grazie alla tecnologia. All’interno dell’ecosistema di startup di operaLogica, abbiamo iniziato a farci conoscere sul territorio proponendo la nostra soluzione alle associazione di soccorso che vogliono digitalizzare i loro processi amministrativi e logistici.\n Alessandro: il rapporto di amicizia con Niccolò ci ha portato a lavorare insieme sul gestionale e a focalizzarci sulle difficoltà dei volontari rispetto all’uso della tecnologia. Abbiamo infatti dedicato un’attenzione particolare alla semplicità e alla sicurezza di tutte le funzionalità di Voltar, realizzando anche una versione mobile.\n  Cos’è Voltar?  Voltar è un gestionale totalmente in cloud di Azure che digitalizza le associazioni di soccorso. Le tecnologie utilizzate per la parte di sviluppo sono Blazor e Flutter.\n Inoltre, abbiamo una versione mobile che riprende alcune funzionalità di gestione e tracciamento dei mezzi e delle presenze, ed è già disponile sia per IOS che per Android. La fase di sviluppo l’abbiamo condotta sia io che Alessandro fino poi alla costituzione della startup nel giugno del 2021.\n  Questo progetto non è nato per caso o per voglia di fare business, ma è stato ideato nella maniera più naturale e semplice: vedo un problema e realizzo la soluzione.\n  Essere volontario e mettere a disposizione degli altri le proprie risorse personali, mi ha insegnato ad agire per costruire qualcosa di migliore, di utile per tutti.\n Voltar è frutto di una richiesta che non poteva essere ignorata e se non avessimo fatto nulla per l’associazione, avendone le competenze, sarebbe stato come perdere un’occasione preziosa di valore. Una sorta di responsabilità nei confronti di chi si impegna ogni giorno ad aiutare gli altri.\n Per me e Alessandro è stato quasi spontaneo progettare il gestionale; anche l’idea di pensarlo in cloud aiuta perché può essere davvero utilizzato da qualsiasi associazione, da quella più piccola a quella più strutturata.\n  Voltar ci sta a cuore perché ci fa sentire utili e parte del futuro, non come spettatori ma come innovatori.\n   Come nasce l’idea? Voltar è stata pensata per semplificare il lavoro di tutti, perché se si lavora meglio, si riesce a vivere appieno l’esperienza di aiutare le persone.\n  Durante l’ultimo anno c’è stato poco tempo per pensare alla digitalizzazione, ma forse proprio le difficoltà del periodo hanno messo in luce ancora di più quanto l’innovazione sia un passaggio virtuoso quanto necessario.\n  Sappiamo di essere sulla strada giusta perché Voltar è uno strumento utile che risponde a bisogni che io stesso ho percepito come volontario o parlando con i miei compagni.\n Siamo due informatici, abituati a linguaggi di programmazione e tecnologie, ci occorreva qualcuno che ci affiancasse nella comunicazione del nostro prodotto. Un progetto nato per i volontari e i soccorritori cresce grazie alla loro fiducia nella nostra tecnologia.\n Per questo ringraziamo sia la croce Rossa di Garbagnate Comitato delle Groane che per prima ha creduto in noi e ci ha sostenuti in questo progetto, sia operaLogica che ha messo a disposizione le sue competenze interne per affiancarci in questo percorso\n  Voltar è stata infatti inserita nell’ecosistema di startup innovative SpaceUp di operaLogica proprio per poter collaborare attivamente con il team di sviluppo, comunicazione e marketing e avere la possibilità di farsi conoscere come realtà tecnologica.\n  Qual è stata la parte più difficile nel portare a termine questo progetto?  La parte più difficile del progetto è stata rendere la piattaforma “semplice all’utilizzo” o meglio orientata all’utilizzo umano invece che centrata sui tecnicismi.\n  La tecnologia è davvero un’amica quando il tempo è poco e si lavora in emergenza.\n  Poter gestire in un\u0026rsquo;unica piattaforma tutte le attività amministrative, contabili e logistiche, le squadre e le persone, gli aiuti assistenziali, i soccorsi e i mezzi, la relazione con il 118, la privacy e la sicurezza dei dati e fare in modo che tutte queste funzioni non costringano i volontari a ore infinite di formazione, non è semplice.\n Da tecnici noi siamo abituati a certi passaggi invece le persone no e quindi fanno fatica a utilizzare un gestionale se non pensato in base alle LORO necessità e livello di digitalizzazione .\n Abbiamo fatto molti test con gli utenti, chiedendo semplicemente di usare il gestionale e dirci quanto fossero intuitivi e facili i vari passaggi. E’ stato un lavoro molto lungo e che ha richiesto molte modifiche. Ancora adesso non smettiamo mai di migliorare la User Expericence perché la tecnologia deve semplificare il lavoro non complicarlo.\n Qual è un esempio di uso in cui Voltar ha portato dei benefici?  Per esempio prendiamo l’uso di Voltar su mobile e di un operatore addetto al trasporto.\n L’operatore riceve la notifica dalla centrale operativa che gli assegna il trasporto. L’operatore dopo aver ricevuto la notifica sullo smartphone può vedere, aprendo l’applicazione, tutti i dettagli utili per il trasporto, come indirizzo, nominativo del paziente, telefono e dettagli sul trasporto e infine dare avvio alla missione.\n L’operatore avvia direttamente il navigatore per completare la missione di trasporto assegnata mentre il suo tragitto viene tracciato. Alla fine del trasporto può chiudere la missione segnalando di essere nuovamente disponibile per altre emergenze.\n Vediamo anche su desktop un processo di assegnazione della missione.\n L’operatore accede alla centrale operativa con le sue credenziali e consulta subito il pannello missioni. Inserisce l’equipaggio e i dati della missione. Dalla mappa può tracciare la missione e vedere dove si trova il mezzo. Non appena la missione è terminata riceve la notifica di fine missione.\n Come avete fatto a far conoscere il vostro progetto?  Stiamo lavorando per farlo conoscere anche ad altre associazioni ma inizialmente lo abbiamo presentato direttamente ai volontari.\n Ci siamo mossi come network (siamo sia soci Assintel che Microsoft Partner) e insieme a operaLogica, software factory di Garbagnate Milanese e società Benefit che potenzia il valore delle startup, investiamo nel Visual Branding per rafforzare la nostra identità.\n Stiamo costruendo le basi per una solida attività di marketing utilizzando strumenti online e offline. Crediamo nel valore delle persone e quindi il nostro reparto vendita non è solo digitale, ci piace andare in associazione, parlare con i volontari e far provare le potenzialità di Voltar anche per capire dove possiamo migliorare.\n Vi piacerebbe espandere l’idea, magari estendendola ad altri settori?  Sì, ci piacerebbe espanderla anche in altri settori oltre alle associazioni di soccorso; per esempio, in settori in cui c’è bisogno di digitalizzare la parte di logistica e tracciamento dei mezzi puntando su un interfaccia semplice.\n Quali sono i prossimi obiettivi/progetti che avete in mente?  I prossimi obiettivi sono sicuramente di farci conoscere in tutta Italia per avviare la digitalizzazione con più associazioni di soccorso possibile.\n Un altro progetto, più ambizioso e innovativo, è quello di utilizzare la tecnologia HoloLens, un visore a realtà mista senza cavi, per preparare i soccorritori alle missioni e per erogare in modalità più interattiva aggiornamenti formativi di soccorso e sicurezza.\n [embed]https://youtu.be/cNri9u68hOg[/embed]\n  Grazie a Niccolò e Alessandro per aver condiviso il frutto di questo lavoro incredibile -si ricorda, fatto da due giovanissimi-, che speriamo possa arrivare ad altre associazioni della Croce Rossa e non! ;)\n Contatti Sito di Voltar: https://www.voltar.it/ Sito di operaLogica: https://www.operalogica.com/ Linkedin: https://www.linkedin.com/company/voltar/ Facebook: https://www.facebook.com/voltar.sos  ", "url": "https:\/\/theredcode.it\/voglio-diventare-uno...-startupper-come-voltar\/" }, "https:\/\/theredcode.it\/tags\/database\/": { "title": "database", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/database\/" }, "https:\/\/theredcode.it\/i-diversi-volti-di-distinct-in-postgresql\/": { "title": "I diversi volti di DISTINCT in PostgreSQL", "tags": ["database",], "content": "  Lavorare con un DBMS può essere interessante.\n Lavorare però con più DBMS può essere frustrante: ognuno di essi ha una serie di istruzioni che sono leggermente diverse rispetto al collega più vicino: se ti abitui ad utilizzare SQL Server, passare a PostgreSQL può non essere immediato.\n La prima differenza che si noterà è proprio relativa ad una serie di funzionalità che proprio alcuni di questi aggiungono grazie a delle istruzioni particolari: vediamo quali sono i diversi volti del DISTINCT in PostgreSQL.\n Cos\u0026rsquo;è DISTINCT?   SELECT DISTINCT elimina le righe duplicate dal risultato.\n  L\u0026rsquo;uso più semplice di DISTINCT serve, ad esempio, per ottenere un elenco univoco di categorie di un prodotto:\n  SELECT DISTINCT categoria FROM prodotto;  -------------------------- \u0026#34;abbigliamento\u0026#34; \u0026#34;casa\u0026#34; \u0026#34;alimentari\u0026#34; \u0026#34;cartoleria\u0026#34; \u0026#34;igiene personale\u0026#34;   è anche vero che potremmo fare lo stesso con una GROUP BY:\n SELECT categoria FROM prodotto GROUP BY categoria;  E cos’è DISTINCT ON?  Una classica domanda da colloquio di lavoro è trovare, usando l’esempio precedente, il prodotto con il prezzo più alto in ogni categoria.\n Questo è ciò che insegnano all\u0026rsquo;università nei vari corsi, usando due SELECT annidate che consentono la selezione del prezzo più alto -di certo di non semplice lettura:\n SELECT  * FROM  prodotto WHERE  (categoria, prezzo) IN (  SELECT  categoria,  MAX(prezzo)  FROM  prodotto  GROUP BY  categoria  ) ORDER BY  categoria; -------------------------------------------- 174 \u0026#34;felpa\u0026#34; \u0026#34;abbigliamento\u0026#34; 7 6 12 \u0026#34;riso\u0026#34; \u0026#34;alimentari\u0026#34; 10 1 15 \u0026#34;scottona\u0026#34; \u0026#34;alimentari\u0026#34; 10 1 16 \u0026#34;emmenthal\u0026#34; \u0026#34;alimentari\u0026#34; 10 1 37 \u0026#34;uva\u0026#34; \u0026#34;alimentari\u0026#34; 10 1 65 \u0026#34;farro\u0026#34; \u0026#34;alimentari\u0026#34; 10 3 67 \u0026#34;uova\u0026#34; \u0026#34;alimentari\u0026#34; 10 3 69 \u0026#34;cracker\u0026#34; \u0026#34;alimentari\u0026#34; 10 3 119 \u0026#34;cacao amaro\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 123 \u0026#34;uva\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 134 \u0026#34;banana\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 138 \u0026#34;lattuga\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 149 \u0026#34;uova\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 155 \u0026#34;wafer\u0026#34; \u0026#34;alimentari\u0026#34; 10 5 444 \u0026#34;certosa\u0026#34; \u0026#34;alimentari\u0026#34; 10 7 465 \u0026#34;ostriche\u0026#34; \u0026#34;alimentari\u0026#34; 10 8 471 \u0026#34;carciofi\u0026#34; \u0026#34;alimentari\u0026#34; 10 8 474 \u0026#34;parmigiano\u0026#34; \u0026#34;alimentari\u0026#34; 10 8 481 \u0026#34;insalata\u0026#34; \u0026#34;alimentari\u0026#34; 10 8 502 \u0026#34;bresaola\u0026#34; \u0026#34;alimentari\u0026#34; 10 9 510 \u0026#34;stracchino\u0026#34; \u0026#34;alimentari\u0026#34; 10 9 524 \u0026#34;pasta sfoglia\u0026#34; \u0026#34;alimentari\u0026#34; 10 9 182 \u0026#34;pasta\u0026#34; \u0026#34;alimentari\u0026#34; 10 6 183 \u0026#34;riso\u0026#34; \u0026#34;alimentari\u0026#34; 10 6 200 \u0026#34;cereali\u0026#34; \u0026#34;alimentari\u0026#34; 10 7 201 \u0026#34;wafer\u0026#34; \u0026#34;alimentari\u0026#34; 10 7 208 \u0026#34;vongole\u0026#34; \u0026#34;alimentari\u0026#34; 10 8 248 \u0026#34;olive\u0026#34; \u0026#34;alimentari\u0026#34; 10 1 254 \u0026#34;stracchino\u0026#34; \u0026#34;alimentari\u0026#34; 10 1 270 \u0026#34;pane al sesamo\u0026#34; \u0026#34;alimentari\u0026#34; 10 2 274 \u0026#34;passata di pomodoro\u0026#34; \u0026#34;alimentari\u0026#34; 10 2 291 \u0026#34;orzo\u0026#34; \u0026#34;alimentari\u0026#34; 10 2 293 \u0026#34;marmellata\u0026#34; \u0026#34;alimentari\u0026#34; 10 2 302 \u0026#34;pane al sesamo\u0026#34; \u0026#34;alimentari\u0026#34; 10 3 305 \u0026#34;ostriche\u0026#34; \u0026#34;alimentari\u0026#34; 10 3 310 \u0026#34;bresaola\u0026#34; \u0026#34;alimentari\u0026#34; 10 3 335 \u0026#34;ricotta\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 339 \u0026#34;orata\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 342 \u0026#34;bresaola\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 344 \u0026#34;olive\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 346 \u0026#34;parmigiano\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 348 \u0026#34;certosa\u0026#34; \u0026#34;alimentari\u0026#34; 10 4 369 \u0026#34;ostriche\u0026#34; \u0026#34;alimentari\u0026#34; 10 5 378 \u0026#34;parmigiano\u0026#34; \u0026#34;alimentari\u0026#34; 10 5 382 \u0026#34;stracchino\u0026#34; \u0026#34;alimentari\u0026#34; 10 5 387 \u0026#34;orzo\u0026#34; \u0026#34;alimentari\u0026#34; 10 5 395 \u0026#34;pane al latte\u0026#34; \u0026#34;alimentari\u0026#34; 10 5 414 \u0026#34;stracchino\u0026#34; \u0026#34;alimentari\u0026#34; 10 6 427 \u0026#34;pane al latte\u0026#34; \u0026#34;alimentari\u0026#34; 10 6 428 \u0026#34;pasta sfoglia\u0026#34; \u0026#34;alimentari\u0026#34; 10 6 430 \u0026#34;pane al sesamo\u0026#34; \u0026#34;alimentari\u0026#34; 10 7 436 \u0026#34;tonno\u0026#34; \u0026#34;alimentari\u0026#34; 10 7 448 \u0026#34;yogurt\u0026#34; \u0026#34;alimentari\u0026#34; 10 7 460 \u0026#34;pasta sfoglia\u0026#34; \u0026#34;alimentari\u0026#34; 10 7 2 \u0026#34;set di penne\u0026#34; \u0026#34;cartoleria\u0026#34; 10 1 39 \u0026#34;detersivo per piatti\u0026#34; \u0026#34;casa\u0026#34; 8.10 1 50 \u0026#34;carta\u0026#34; \u0026#34;casa\u0026#34; 8.10 2 8 \u0026#34;cavo usb\u0026#34; \u0026#34;casa\u0026#34; 8.10 1 90 \u0026#34;ventilatore\u0026#34; \u0026#34;casa\u0026#34; 8.10 3 231 \u0026#34;sgrassatore\u0026#34; \u0026#34;casa\u0026#34; 8.10 9 167 \u0026#34;dentifricio\u0026#34; \u0026#34;igiene personale\u0026#34; 9 5   Vediamo che ci sono diversi prodotti con lo stesso prezzo, e quindi questa query non ci torna di aiuto.\n Se ti sei laureat* qualche tempo fa, magari avrai sentito parlare di PARTITION BY e ROW_NUMBER(), due funzioni che permettono di effettuare operazioni come assegnare un intero sequenziale a ciascuna riga in un set di risultati (nel caso di ROW_NUMBER()).\n Si potrebbe quindi trasformare la query precedente in una come questa:\n WITH highest_cost_product AS (  SELECT  ROW_NUMBER() OVER (  PARTITION BY categoria ORDER BY prezzo DESC  ) AS rn,  *  FROM  prodotto ) SELECT  * FROM  highest_cost_product WHERE  rn = 1 ORDER BY  categoria;  Il risultato in questo caso è lo stesso, ma senza i duplicati:\n 1 174 \u0026#34;felpa\u0026#34; \u0026#34;abbigliamento\u0026#34; 7 6 1 183 \u0026#34;riso\u0026#34; \u0026#34;alimentari\u0026#34; 10 6 1 2 \u0026#34;set di penne\u0026#34; \u0026#34;cartoleria\u0026#34; 10 1 1 50 \u0026#34;carta\u0026#34; \u0026#34;casa\u0026#34; 8.10 2 1 167 \u0026#34;dentifricio\u0026#34; \u0026#34;igiene personale\u0026#34; 9 5 …  Fino ad ora, risulta abbastanza familiare, no?\n Grazie a PostgreSQL, è possibile usare una clausola speciale DISTINCT ON per trovare la prima riga in un gruppo:\n SELECT DISTINCT ON (categoria)  * FROM  prodotto ORDER BY  categoria,  prezzo DESC; ----------------------------- 174 \u0026#34;felpa\u0026#34; \u0026#34;abbigliamento\u0026#34; 7 6 183 \u0026#34;riso\u0026#34; \u0026#34;alimentari\u0026#34; 10 6 2 \u0026#34;set di penne\u0026#34; \u0026#34;cartoleria\u0026#34; 10 1 50 \u0026#34;carta\u0026#34; \u0026#34;casa\u0026#34; 8.10 2 167 \u0026#34;dentifricio\u0026#34; \u0026#34;igiene personale\u0026#34; 9 5   WOW! Decisamente più semplice.\n Leggendo la documentazione, vediamo cosa si dice dell’istruzione DISTINCT ON:\n   SELECT DISTINCT ON ( espressione [, …] ) mantiene solo la prima riga di ogni insieme di righe in cui le espressioni date risultano uguali.\n  Il motivo per cui non se ne sente mai parlare è proprio che fa parte delle clausole cosiddette non standard:\n   Clausole non standard\nDISTINCT ON ( … ) è un\u0026rsquo;estensione dello standard SQL.\n  In questo caso, PostgreSQL fa tutto il lavoro pesante per noi. L\u0026rsquo;unico requisito è ORDER BY il campo per cui raggruppiamo (in questo caso categoria e prezzo), che consente anche il \u0026ldquo;raggruppamento\u0026rdquo; per più di un campo, il che rende questa clausola ancora più potente.\n IS DISTINCT FROM  Il confronto dei valori in SQL può portare a tre risultati: true, false o unknown. Prendiamo ad esempio questa query:\n WITH example AS (  SELECT 1 AS a, 1 AS b UNION ALL  SELECT 1, 2 UNION ALL  SELECT NULL, 1 UNION ALL  SELECT NULL, NULL ) SELECT  a,  b,  a = b as equal FROM  example;  a | b | equal ------+------+-------  1 | 1 | true  1 | 2 | false NULL | 1 | NULL NULL | NULL | NULL  Il risultato del confronto di NULL con NULL utilizzando l\u0026rsquo;uguaglianza (=) è UNKNOWN (contrassegnato come NULL nella tabella), un po’ come 0 alla 0!\n  In SQL 1 è uguale a 1 e NULL IS NULL restituisce vero, ma NULL non è uguale a NULL. Da perdere la testa, no?\n    È importante essere consapevoli di questa sottigliezza perché il confronto dei campi nullable potrebbe produrre risultati imprevisti.\n La condizione completa per ottenere true o false quando si confrontano campi nullable è:\n WITH example AS (  SELECT 1 AS a, 1 AS b UNION ALL  SELECT 1, 2 UNION ALL  SELECT NULL, 1 UNION ALL  SELECT NULL, NULL ) SELECT  a,  b,  (a is null and b is null)  or  (a is not null and b is not null and a = b)  as full_condition FROM  example; -------------------------------  a | b | equal | full_condition ------+------+-------+----------  1 1 true 1 2 false NULL 1 false NULL NULL true   Questo è il risultato che vogliamo ottenere, ma è molto lungo. C\u0026rsquo;è un modo migliore?\n Anche in questo caso, PostgreSQL ci fornisce un’opzione in più, ed è IS DISTINCT FROM:\n WITH example AS (  SELECT 1 AS a, 1 AS b UNION ALL  SELECT 1, 2 UNION ALL  SELECT NULL, 1 UNION ALL  SELECT NULL, NULL ) SELECT  a,  b,  (a is null and b is null)  or  (a is not null and b is not null and a = b)  as full_condition FROM  example; Il risultato dunque è:  a | b | equal | full_condition ------+------+-------+----------  1 1 true 1 2 false NULL 1 false NULL NULL true   La documentazione di PostgreSQL spiega in questo modo IS DISTINCT FROM:\n   IS DISTINCT FROM e IS NOT DISTINCT FROM tratta NULL come se fosse un valore noto, piuttosto che come un caso speciale per indicare sconosciuto.\n  Molto meglio: breve e conciso.\n Ma in che modo gli altri database gestiscono questo?\n MySQL — un operatore speciale, ossia ⇔, che ha funzionalità simili; Oracle invece fornisce una funzione chiamata LNNVL per confrontare i campi nullable (in bocca al lupo).\n Per quanto riguarda SQL Server? Non pervenuto.\n   ", "url": "https:\/\/theredcode.it\/i-diversi-volti-di-distinct-in-postgresql\/" }, "https:\/\/theredcode.it\/voglio-diventare-una...-data-journalist\/": { "title": "Voglio diventare una... Data Journalist", "tags": ["interviste","voglio-diventare",], "content": "Oggi si passa ad uno di quei mestieri che in Italia è difficilissimo trovare o poter esercitare: la Data Journalist.\n Si tratta di una figura ibrida tra un giornalista e un data analyst, che ha forti competenze in statistica, ma soprattutto un buon occhio per i dati.\n Come si diventa una Data Journalist? Ecco quanto racconta Debora Aru, che lavora in Reach plc a Cardiff ormai da qualche anno!\n Descriviti in 100 parole.  Ciao! Sono Debora, sono sarda e vivo a Cardiff, in Galles.\nFaccio la giornalista dal 2006, quando ho iniziato a fare la reporter per un TG locale di Oristano. Mi sono poi trasferita a Roma dove mi sono occupata di cronaca, politica e economia pubblica a livello nazionale.\nNel 2014 mi sono trasferita a Londra, dove ho prima studiato inglese e poi mi sono iscritta al corso di interactive journalism della City University, una delle più’ prestigiose università’ del Regno Unito.\nDal 2017 lavoro come Data journalist per la data unit di Reach plc, il più grande network di giornali nazionali e locali qui in UK.\n In cosa consiste il ruolo di Data Journalist?   Un data journalist usa l’analisi dei dati per trovare notizie.\n  Mi occupo di cercare, pulire e analizzare dati, normalmente pubblicati dal governo, ma anche attraverso Freedom of information richieste (una legge che ti permette di ottenere informazioni di dominio pubblico se in possesso di un ente).\nLavoro in un team composto da 6 giornalisti, 3 sviluppatori, un video maker e due designer.\nPrincipalmente mi occupo di giornalismo locale, scrivendo le notizie per i nostri titoli regionali, ma copro anche storie nazionali.\nIn cosa consiste il processo che segue un Data Journalist\n Quando hai deciso di diventare Data Journalist? Ho deciso di diventare Data Journalist quando ho deciso il tipo di Master che volevo fare alla City University di Londra.\nArrivavo da un background televisivo e di reporting su carta, entrambi settori molto competitivi nel campo del giornalismo.\n Quindi, per una questione di convenienza personale e di voglia di emergere, ho deciso di specializzarmi in Data journalism, dal momento che anche qui nel Regno Unito era un settore in ascesa con più margine di competizione sul mercato.\n Qual è la soft skill più importante che deve possedere un Data Journalist?   Alcune delle soft skill fondamentali sono sicuramente etica e communication.\n  L\u0026rsquo;etica è importante perché ha un ruolo fondamentale in generale nella professione del giornalista, in quanto questa definisce non solo l\u0026rsquo;affidabilità del reporter, ma anche il rispetto per i lettori, indicando loro quali temi evitare e quali no, ma anche come trattare, in generale, l\u0026rsquo;informazione soprattutto in situazioni controverse.\nIn Italia, esistono infatti le famose \u0026ldquo;Carte\u0026rdquo; deontologiche, come ad esempio la Carta di Roma, per i diritti dei migranti, o la Carta di Milano per tutelare i diritti dei detenuti, che delineano il comportamento che un giornalista deve tenere.\nE le capacità di comunicazione sono importanti perché, se non sai comunicare, che giornalista saresti? :)\nLa 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.  Non ricordo onestamente grandi fallimenti, e non perché non ne siano capitati, ma perché il modo in cui lavoro e un po\u0026rsquo; a prova di errore.\n Cosa intendo? Tra colleghi, ci controlliamo a vicenda i pezzi, così da spalleggiarci ed evitare grossi errori!\n Come fare per diventare un Data Journalist?  In Italia, il ruolo di Data journalist non è ancora riconosciuto - come lo sono ad esempio il giornalista giudiziario o il cronista sportivo-, ma qui nel Regno Unito si tratta di una specialità del giornalismo già radicata e in continua evoluzione.\nPer fare il giornalista nel Regno Unito, Brexit permettendo, è necessario frequentare una scuola di giornalismo, perché raramente le redazioni prendono persone che non hanno una formazione specifica e ottenuta tramite un ente accreditato.\nAl giorno d’oggi, poi, siccome la competizione sta crescendo, un buon punto di forza che potrebbe tornare utile è quello di conoscere dei linguaggi di programmazione che ti permettano di pulire, analizzare e anche visualizzare basi di dati anche di grandi dimensioni.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Il mio lavoro mi piace davvero tanto e spero di essere ancora una Data journalist fra tre anni!\n Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema? (Fai anche riferimenti a situazioni reali in cui hai avuto modo di fare la tua parte!)  Conosco il tema e so che generalmente le materie in ambito scientifico sono principalmente rivolte al genere maschile, anche se per fortuna non ne ho esperienza diretta.\n Nel mio team, per esempio, i miei manager sono due donne e siamo abbastanza proporzionati in termini di gender!\n Grazie a Debora per la sua intervista direttamente dal Regno Unito!\n ", "url": "https:\/\/theredcode.it\/voglio-diventare-una...-data-journalist\/" }, "https:\/\/theredcode.it\/why\/che-fine-ha-fatto-clubhouse\/": { "title": "Che fine ha fatto Clubhouse?", "tags": ["clubhouse","social",], "content": "Era l\u0026rsquo;aprile del 2020, eravamo in piena pandemia COVID-19, tutti erano a casa, in quarantena, a preparare pizza e pasta a gogò. All\u0026rsquo;improvviso, si è scatenato un putiferio a causa di una nuova piattaforma di social network chiamata \u0026ldquo;Clubhouse\u0026rdquo;, a cui tutti volevano accedere.\n La maggior parte delle persone ne parlavano su Twitter, gridando all’innovazione intorno a questa cosiddetta \u0026ldquo;nuova normalità per i social\u0026rdquo;. Questo è stato quello che ha più attirato la mia attenzione all’inizio.\n Ma che fine ha fatto Clubhouse?\n Facciamo un passo indietro, e vediamo la sua nascita ed evoluzione. Sicuramente, la sua esclusività è stata ciò che ha reso la piattaforma una delle più desiderate dalle persone.\n Cos\u0026rsquo;è Clubhouse  Capitava di frequente di collegarsi su LinkedIn e leggere il post del collegamento di turno che scriveva di commentare il suo post per poter ottenere uno dei 5 inviti messi a disposizione di chi già faceva parte dell’app.\n Solo a me ricorda un po’ i Golden Tickets de La fabbrica di cioccolato di Willy Wonka?\n Infatti, per entrare, avevi bisogno di un invito, da qualcuno che ti facesse entrare. Questa strategia, apparentemente banale, è ciò che ha portato centinaia di migliaia e ora milioni di utenti sulla piattaforma.\nEsempio di invito su Clubhouse\n Si basa sul concetto di stanza: le stanze di conversazione vanno e vengono a seconda di quando le persone le avviano o le terminano.\n La società afferma che in media vengono create oltre 500.000 stanze al giorno. Inoltre, la stessa afferma di registrare le conversazioni man mano che prendono luogo, ma di conservarle solo se qualcuno presenta un reclamo mentre la stanza è attiva.\n Se nessuno presenta un reclamo, Clubhouse dice che la registrazione viene eliminata non appena l\u0026rsquo;ospite chiude la discussione.\n Clubhouse ha mantenuto la sua atmosfera di esclusività anche molto tempo dopo aver aggiornato la propria piattaforma in modo da essere disponibile senza invito.\n Non solo: era disponibile solo per iOS. Anche questo, rendeva il tutto più esclusivo, soprattutto per chi è già legato alla strategia di esclusività rispetto ai prodotti che acquista e utilizza, com’è nella filosofia del marketing Apple da sempre.\n Verso la metà di febbraio del 2021, hanno raggiunto un altro dei loro più grandi traguardi. Hanno raggiunto 10 milioni di utenti sulla loro piattaforma, il che è impressionante per un\u0026rsquo;app social online da meno di un anno.\n Da qui, è possibile trarre alcune informazioni:\n   iPhone sicuramente è un’ottima piattaforma per lanciare la tua idea di app;  La gente ama sentirsi parte di un’élite.  Solo verso la fine della prima metà del 2021, hanno ampliato la disponibilità dell’applicazione anche agli utenti Android.\n Tuttavia, a differenza del mercato Apple, questo ha fatto a malapena la differenza.\n Oggi, Clubhouse è disperso, e nessuno ne parla più.\n Che fine ha fatto Clubhouse?  Nel luglio del 2021, Clubhouse ha terminato il suo sistema di inviti un tempo pubblicizzato e ha aperto l\u0026rsquo;app a tutti. Ad oggi, è a malapena al 49 posto per le app di social network, e non è tra le prime 50 app più scaricate nell’App Store.\n Per fare dei paragoni, è meno popolare di Skype, ma più di Marco Polo - Stay in Touch. Mai sentito parlare di Marco Polo? Scommetto di no.\n Vediamo allora le possibili cause.\n Nessuna community = no social network  Clubhouse all’inizio offriva un’alternativa molto valida ad uno spettacolo come il programma di Jimmy Kimmel o un luogo in cui le celebrità si incontrano e parlano della loro famiglia, dei risultati, delle passioni e dei progetti futuri, rendendo l’esperienza più reale.\n Perfino personaggi come Elon Musk e Mark Zuckerberg hanno tutti partecipato all’entusiasmo iniziale di Clubhouse. Tuttavia, il motivo per cui lo hanno fatto è stato perché, nel momento in cui hanno messo su le loro stanze, migliaia di persone stavano ancora utilizzando la piattaforma.\n  Un bellissimo specchiatto per le allodole.\n  Clubhouse era ancora la piattaforma social più gettonata in quel momento e quando gli utenti hanno smesso di utilizzare la piattaforma, ovviamente, non c\u0026rsquo;era più motivo per gli altri utenti di utilizzarla.\n Può sembrare una giustificazione banale? Se ci pensate, no. La maggior parte delle innovazioni “muore” nel momento in cui gli utenti smettono di vederne l’utilità.\n Dopotutto, questo potrebbe non contare più niente: il team di Clubhouse ad oggi ha milioni di dollari da spendere, quindi potrebbero investire un paio di quei milioni in ricerca e sviluppo e potrebbero riunire la squadra per il design, la creatività e la visione, cercare di ridare vita alla strategia dietro a questa app.\n Le persone hanno iniziato a tornare alla loro vita normale  La pandemia è stato un vero incubo, e ancora ne stiamo pagando gli effetti. I social in questo senso potrebbero essere stati -per certi versi- di grande aiuto per evadere dalla propria stanza e fare un giro per il mondo, sperando di vedere qualcuno che se la passasse come noi, per sentirci meno soli.\n  Anche per questo, il numero di utenti attivi giornalieri su Clubhouse è diminuito drasticamente dopo che le persone hanno iniziato a uscire e sono tornate alla loro vita normale.\n  Potremmo tenere conto del fatto che una parte cruciale del successo di Clubhouse inizialmente era perché tutti noi stavamo a casa.\n Basta pensare ai fleet, una delle ultime iniziative di Twitter che emulava le stories di Instagram o Facebook. Poco dopo la sperimentazione, e nonostante un discreto successo iniziale, Twitter si è reso conto che non era una funzionalità significativa per i suoi utenti, e ne hanno interrotto la funzione.\n  La mente delle persone cambia davvero molto velocemente, e questa è una delle ragioni per cui è molto difficile mantenere alta l’attenzione di un prodotto considerato “innovativo”.\n  Ancora più importante, Clubhouse non è riuscito a fare nulla di nuovo e diverso negli ultimi mesi.\n Ad esempio? Non è ancora possibile creare una chat.\n Hanno aggiunto solo di recente l\u0026rsquo;accesso Android, perdendo una fetta di target che nel frattempo ha perso l’entusiasmo.\n Il sistema basato su invito inizia a penalizzarti subito se inviti troppe persone, quindi ti siedi impotente con una o due persone in attesa che succeda qualcosa.\n  Clubhouse è stato quindi vittima della sua stessa crescita.\n  Man mano che l\u0026rsquo;app è diventata sempre più popolare, i follower hanno improvvisamente notato che non c’era più nulla di interessante da seguire o ascoltare, le funzionalità erano sempre le stesse e che già altre piattaforme offrivano delle esperienze simili o più interessanti.\n  Brutto a dirsi, ma Clubhouse è il classico esempio di “è stato bello, finché è durato”.\n Una piattaforma in rapido fallimento a causa di un\u0026rsquo;arena altamente competitiva.\n", "url": "https:\/\/theredcode.it\/why\/che-fine-ha-fatto-clubhouse\/" }, "https:\/\/theredcode.it\/tags\/clubhouse\/": { "title": "clubhouse", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/clubhouse\/" }, "https:\/\/theredcode.it\/categories\/general\/": { "title": "general", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/general\/" }, "https:\/\/theredcode.it\/tags\/social\/": { "title": "social", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/social\/" }, "https:\/\/theredcode.it\/tags\/data-scientist\/": { "title": "data-scientist", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/data-scientist\/" }, "https:\/\/theredcode.it\/tags\/marketing\/": { "title": "marketing", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/marketing\/" }, "https:\/\/theredcode.it\/voglio-diventare-un-data-scientist-nel-marketing\/": { "title": "Voglio diventare un… Data Scientist nel marketing", "tags": ["data-scientist","interviste","marketing",], "content": "Il Data Scientist è un mestiere che negli ultimi anni si sente sempre più spesso: si parla dei dati come del nuovo petrolio, e non è del tutto sbagliato.\n Questa professione però presenta diverse sfaccettature: come raccontato anche nell\u0026rsquo;articolo \u0026ldquo;Voglio essere un/a data scientist\u0026rdquo;, di cappelli ce ne sono davvero tanti e l\u0026rsquo;ambito specifico cambia completamente l\u0026rsquo;approccio all\u0026rsquo;attività che si deve portare avanti.\n Il marketing poi è un campo fondamentale in qualsiasi business, tanto che negli ultimi anni sono nate diverse professioni che sono focalizzate proprio su quest\u0026rsquo;area: vediamo quindi insieme ad Andrea Ciufo, Data Scientist @ CollidaScope Limited, cosa vuol dire essere e diventare un Data Scientist nel marketing.\n Descriviti in 100 parole.  Ciao sono Andrea Ciufo, sono un Data Scientist e lavoro a Londra come Marketing Mix Model Optimization Consultant nell’industria dei beni di largo consumo con Collidascope.\n Ho un passato accademico particolare, perchè sono un ingegnere civile e mi sono innamorato della Scienza dei Dati durante un esame di teoria delle infrastrutture viarie.\n È stato qui che ho scoperto l’applicazione delle reti neurali per la sicurezza stradale e mi sono innnamorato completamente di questa disciplina.\n Nel tempo libero mi piace leggere e raccontare sul mio blog delle avventure che mi capitano tra il Regno Unito e l’Italia.\n Potete seguirmi su uomodellamansarda.com, la versione italiana, o lovabledata.com, la versione inglese un po’ meno aggiornata.\n In cosa consiste il ruolo di Data Scientist?  Il mio lavoro consiste nell’applicare dei modelli statistici per supportare la valutazione delle performance delle campagne di marketing condotte dai nostri clienti. L’obiettivo è difficile ma chiaro, identificare le leve migliori per incrementare le vendite nell’industria dei beni di largo consumo.\n Lavoro a stretto contatto con il mio team, in particolare con un econometrista ed un managing director, entrambi con esperienze passate all’interno di grandi società di consulenza retail come DunnHumby e Dentsu.\n Oltre a questo una parte fondamentale del mio lavoro consiste nell’ascoltare i clienti durante i meeting per poter formulare correttamente i problemi e la ricerca delle relative soluzioni.\n Questo significa ritrovarsi nella cabina di regia del dipartimento marketing di ogni società con la quale collaboriamo e, come un ct nel calcio, osservare le interazioni e le performance dei vari canali di comunicazione e le varie attività di marketing in corso.\n 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.  Sicuramente ho commesso diversi errori nel mio percorso accademico e lavorativo dai quali ho imparato sempre molto.\n Sul piano strettamente tecnico e teorico, uno dei miei più grandi è stato quello di dimenticarmi della dipendenza tra le variabili che carattezzavano una serie storica.\n Lavoravo nell’industria alimentare e stavo costruendo la prima versione di un modello per le proiezioni di vendita che avrebbe permesso l’ottimizzazione della produzione e la riduzione degli sprechi.\n Ovviamente in fase di valutazione degli output mi sono accorto che non erano accettabili, ho identificato l’errore e corretto il modello.\n Come fare per diventare un Data Scientist?  Il percorso del Data Scientist sicuramente dipende dalla specialità che si vuole intraprendere, è un titolo che copre delle competenze che vanno dal data engineer al business analyst e purtroppo non si possono conoscere nel dettaglio tutte.\n Sicuramente c’è un file rouge che unisce tutte queste conoscenze: la passione, tanta passione.\n Non mi stancherò mai di dirlo e sembra quasi una banalità, ma è alla base di tutto.\n Oltre a questo è fondamentale avere delle basi solidissime di Analisi Matematica, di Calcolo delle Probabilità e di Statistica.\n Non servono certificazioni, anzi sono particolarmente scettico nei confronti di queste.\n Serve tanto studio, tanta pratica e fortunatamente internet è pieno di risorse gratuite.\n Il vantaggio di un corso di studi che sia fisico o online è la definizione di un persorso strutturato, delle scadenze legate agli esami o i progetti che velocizzano la curva di apprendimento e, a volte, la presenza di convenzioni per tirocini e stage all’interno del percorso stesso.\n Inutile dire che sono un grande sostenitore dei MOOC e dell’educazione libera e gratuita per tutti.\n Inoltre è importante ricordare che il percorso di studi per una certificazione o per un titolo, non coincide con le esigenze dell’azienda dove si vorrebbe lavorare.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Attualmente sto consolidando le mie conoscenze lato dati e programmazione con Python.\n In particolare le librerie che utilizzo con maggior frequenza sono Pandas, Scikit-learn, SciPy ed ogni tanto Prophet.\n Parallelamente sto costruendo un bagaglio di conoscenza legato alla commercializzazione e promozione dei beni di largo consumo, dalle funzioni di elasticità che caratterizzano la relazione prezzo-vendite di un prodotto alla correlazione tra spot televisivi-radiofonici e vendite.\n Questo ultimo punto forse è il più complesso perchè molto più aleatorio e richiede maggiore esperienza sul campo.\n In entrambi i casi il confronto costante con figure senior resta fondamentale.\n  Bisogna avere il coraggio di chiedere sempre un parere ed un opinione sul proprio percorso tecnico ed avere l’umiltà di accettare le critiche.\n  Quando poi queste sono particolarmente dure ed è fondamentale approfondirle ringraziando chi ha speso del tempo per ascoltarci e condividere il proprio punto di vista.\n Nei prossimi anno ho l’obiettivo di diventare Head of Analytics. La passione e l’impegno non mancano, bisogna solo avere pazienza.\n Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema?  Il gender gap nel settore STEM è un problema del quale sono consapevole ma non con il giusto grado di approfondimento\u0026hellip; Intendo dire che conosco il problema sul piano qualitativo, ma non sul piano quantitativo. Non sarebbe sbagliato tra gli obiettivi di breve termine che io mi informi un po’ di più sulla questione.\n Nel passato avevo letto delle ricerche pubblicate sulla Harvard Business Review sulle disparità salariali e di come queste non solo dipendessero dal gender, ma anche dall’orientamento sessuale (qui una abbastanza recente).\n È necessario interessarsi alla questione e supportare le varie iniziative ad essa legate, non solo per una questione di uguaglianza, ma anche e soprattutto perchè nell’ambito dell’innovazione la diversità è un valore aggiunto.\n Nel mio micro-universo ho provato a contribuire, ricordo che ad una cara amica ho regalato “Lean It: Women, Work, and the Will to Lead” di Sheryl Sandberg la COO di Facebook o di come durante le festività natalizie con molto piacere ho regalato dei giochi legati al mondo STEM a delle cuginette.\n In particolare in quest’ultima situazione il mio obiettivo era fin da subito scardinare un paradigma culturale totalmente sbagliato.\n La strada è ancora lunga, in particolare in Italia, ma sono circondato da amiche e da amici veramente in gamba che hanno preso di petto questo problema sensibilizzando e stravolgendo quelli che sono dei vecchi schemi, ormai obsoleti.\n Grazie Ciufo per aver condiviso la tua esperienza!\n Contatti Twitter @uomodlamansarda\nLinkedIn Andrea Ciufo\nBlog:\n uomodellamansarda.com lovabledata.com ", "url": "https:\/\/theredcode.it\/voglio-diventare-un-data-scientist-nel-marketing\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-un-data-software-engineer\/": { "title": "Voglio diventare un… Data and Software Engineer", "tags": ["interviste","voglio-diventare",], "content": "Il Data and Software Engineer è un mestiere piuttosto complesso: un po\u0026rsquo; analista, un quarto progettista, un altro quarto informatico, un altro po\u0026rsquo; statista.. insomma, le competenze sono trasversali.\nQuesta settimana Andrea Guzzo ci racconterà il suo punto di vista del suo lavoro in Moxoff, e non solo!\n Descriviti in 100 parole  Ciao! Sono Andrea Guzzo e sono un Computer Scientist, nel lavoro attualmente ricopro il ruolo di Data \u0026amp; Software Engineer in Moxoff. Mi occupo principalmente di portare in produzione, ingegnerizzare e far funzionare modelli che spaziano dalla Data Science alla matematica applicata.\nNel tempo libero faccio parte di alcune community, sono uno degli organizzatori di PythonBiellaGroup, TedX Busto Arsizio e MilanoR (Erum2020).\nPer il resto: Videogames, musica e fantascienza sono le mie passioni (ovviamente) :)\nIn cosa consiste il ruolo di Data and Software Engineer?  Il Data \u0026amp; Software Engineer è una figura professionale simile ad un Data Engineer e può avere diverse connotazioni. Come spesso accade nel mondo dell\u0026rsquo;informatica le attività spaziano a seconda del tipo di organizzazione in cui si collabora, al tipo di azienda, alla sua grandezza, se realizza prodotti software e molto altro ancora\u0026hellip;\n Per come lo intendiamo in Moxoff un Data \u0026amp; Software Engineer è una persona con un background fortemente tecnico-informatico che si occupa di far funzionare e mettere in produzione ricerche, modelli, POC, analisi, dashboard. In pratica costruisce l\u0026rsquo;infrastruttura software (spesso di backend) e quella legata ai dati di un progetto.\n Tipicamente lavoro in piccoli team autoconsistenti, in molti progetti sono accompagnato spesso da un Math Model Developer oppure da un Data Scientist che sono molto più verticali su modelli, statistiche, analisi e KPI.\n In altri progetti più grandi invece mi capita di lavorare con altre figure come la mia perchè lo stack tecnologico è solitamente più ampio.\n In Moxoff utilizziamo questa sinergia su tutti i nostri progetti che è fondamentale per portare in produzione e far funzionare i nostri progetti, che per per il 90% sono composti dall\u0026rsquo;insieme di: dati, modelli, equazioni, statistica e tanto codice.\n Qual è la soft skill più importante che deve possedere un Data \u0026amp; Software Engineer?  Oltre alla pigrizia (che è un requisito fondamentale :) ) direi sicuramente tutto ciò che è legato al Problem Solving.\n Spesso capita di affrontare problemi complicati, dati molto sporchi e variabili, modelli che non vogliono saperne di funzionare e tantissimi altri problemi, avere una buona skill di risoluzione di problemi, accompagnata da un buon pensiero critico, consente di essere flessibili, trovare la soluzione giusta al momento giusto ed evitare di sbattere (troppo) il muso sulle varie difficoltà che si possono incontrare durante il cammino.\n È certamente importante anche la capacità di sapersi relazionare bene e con una buona intelligenza emotiva con le altre persone, in particolare con gli altri membri del team. Requisito fondamentale per portare al successo qualsiasi attività progettuale.\n Ovviamente sono tutti aspetti che con l\u0026rsquo;esperienza, la formazione e la pratica è possibile migliorare e far crescere, ovviamente a fronte di un grande lavoro su se stessi.\nLa 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.   Di errori ne ho commessi moltissimi e continuo a farne!\n  Più che essere i nostri errori a definire noi stessi direi che sono le risposte e le lezioni che riusciamo ad imparare dai nostri errori a costruire ciò che siamo e che saremo nel futuro.\n Un episodio emblematico che ha profondamente cambiato la mia etica lavorativa e l\u0026rsquo;approccio con gli altri (in particolare con il cliente) è un\u0026rsquo;esperienza vissuta nel precedente impiego durante un grande progetto in Microsoft.\n A causa di alcuni errori dovuti alla mia mancanza di conoscenza di alcuni aspetti tecnici, poca attitudine nell\u0026rsquo;attività che stavo svolgendo e impegno ho ricevuto una valutazione negativa da parte del cliente che ha comportato la mia esclusione dall\u0026rsquo;attività progettuale.\n All\u0026rsquo;inizio ho subito moltissimo a livello personale questa decisione, ma con il tempo ho imparato dai miei sbagli e ora cerco sempre di essere al 100% all\u0026rsquo;inizio e durante una nuova sfida, approfondendo aspetti tecnici richiesti, con un atteggiamento propositivo e positivo, ma soprattutto cercando di non farmi coinvolgere troppo a livello emotivo e personale dalle varie situazioni che si vengono creare sul posto di lavoro.\nCome fare per diventare un Data \u0026amp; Software Engineer?  Il mio è stato un percorso certamente variegato e mi sono trovato a fare questo lavoro guidato dalla passione e da una domanda: \u0026ldquo;ma è possibile che la maggior parte dei progetti legati al mondo dell\u0026rsquo;Intelligenza Artificiale rimanga spesso in fase di prototipo? Come mai non vanno in produzione?\u0026rdquo;.\n All\u0026rsquo;epoca ero un Data Scientist e mi occupavo principalmente di modelli e analisi dati, ma visto il mio background fortemente informatico e la continua ricerca alla risposta a questa domanda alla fine mi sono trovato a fare questo mestiere.\n Rispetto ad un Data Scientist quindi direi che la mia figura professionale ha delle competenze forti in ambito Computer Science simili a quelle di un Data Engineer, con un pizzico di conoscenza di modelli e di statistica, necessarie per affrontare i progetti più complessi.\n Se proprio vogliamo classificarla potrebbe somigliare ad un MLOps Engineer :)\n Infine le certificazioni certamente servono, ma penso che non definiscano un bravo programmatore o un esperto in un settore.\n Quello che certamente mi ha aiutato è l\u0026rsquo;esperienza sul campo, fare errori trovando e proponendo soluzioni, lavorare su progetti sfidanti, farsi guidare da colleghi più esperti, collaborare su progetti open source e non ultimo frequentare community, eventi di settore, persone; scambiandosi idee, codice ed esperienze.\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Il mio prossimo obiettivo personale è quello di lavorare (sia dal punto di vista tecnico che umano) per diventare un buon team leader tecnico, cercando di acquisire una buona conoscenza degli strumenti e tecnologie attualmente sul mercato in modo da definire con efficacia, in base alle richieste e agli obiettivi progettuali, delle soluzioni valide e funzionali.\n Una specie di Architetto Software che sappia anche coordinare un gruppo di lavoro nella costruzione dell\u0026rsquo;architettura disegnata.\n  Una sfida certamente ambiziosa, ma non per questo meno stimolante :)\n  Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema?  Eccome! Vengo da una percorso universitario che per il 90% (se non di più) era a frequentazione maschile.\n È un problema estremamente complesso e molto sfaccettato, dal mio piccolo punto di vista cerco, assieme alla nostra community PythonBiellaGroup, di diffondere la cultura di python come linguaggio di programmazione, dell\u0026rsquo;open source e spiegando cosa vuol dire essere un informatico nel 2021.\n Ci piacerebbe moltissimo andare nelle scuole a parlare con i ragazzi spiegando come funziona il nostro mondo, ma è sempre molto difficile riuscire a trovare spazi di collaborazione.\n Credo e penso che questo sia un problema molto serio che va affrontato a partire dalla giovane età a partire dalla scuola, creando sinergie con varie community, con il mondo associativo, esperti di settore, università e ricercatori, in modo da avvicinare le ragazze alle discipline scientifiche suscitando curiosità e presentando il mondo in cui viviamo per quello che è davvero.\n Contatti Linkedin: https://www.linkedin.com/in/andreaguzzo/ Github: https://github.com/JeyDi  ", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-un-data-software-engineer\/" }, "https:\/\/theredcode.it\/tags\/bestpractice\/": { "title": "bestpractice", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/bestpractice\/" }, "https:\/\/theredcode.it\/k8s-in-produzione-best-practices\/": { "title": "K8S in produzione: best practices", "tags": ["bestpractice","docker","kubernetes","produzione",], "content": "Sono sempre più frequenti le tecnologie appartenenti al mondo OCI: container a destra, pod a sinistra\u0026hellip;\n Installare e testare Docker o Podman localmente è semplice, ma cosa succede quando dobbiamo andare in produzione e abbiamo a che fare con Kubernetes?\n Definiamo quindi una checklist di verifiche da completare quando il nostro ambiente di produzione sta per entrare in funzione e vediamo quali sono le best practices per portare K8S in produzione!\n Docker vs. Kubernetes  Utilizzare Kubernetes dà l\u0026rsquo;opportunità di usare gli stessi strumenti che oggi usano le più grandi aziende nel mondo, le quali distribuiscono applicazioni basate su container.\n Perché questa scelta? Tengono fede a tutte le promesse fatte in materia di resilienza dell’architettura o del servizio, della robustezza e della sicurezza dell’applicazione; si tratta di comuni best practices da applicare sempre.\nSapevi da dove nasce il nome di Kubernetes?\nKubernetes, di base, è un sistema per l\u0026rsquo;esecuzione e il coordinamento di applicazioni containerizzate in un cluster di macchine. È una piattaforma progettata per gestire completamente il ciclo di vita di applicazioni basati su container fornendo degli strumento per gestirne scalabilità e alta disponibilità.\n Grazie ad una serie di funzionalità, è possibile ridimensionare i servizi, eseguire aggiornamenti continui e trasferire il traffico tra diverse versioni delle applicazioni per testare funzionalità o rollback di distribuzioni problematiche.\n K8S fornisce interfacce componibili che consentono di definire e gestire le applicazioni con alti livelli di flessibilità, potenza e affidabilità.\n La creazione di un singolo container da eseguire per uso personale non richiede molte risorse o qualche tipo di pianificazione; sicuramente avrete visto quanto sia semplice avviare un servizio Docker ed eseguire tramite pochi comandi l’avvio di un container per renderlo disponibile.\n La creazione di container su cui però fare affidamento per fornire servizi più complessi in modo sicuro, affidabile, aggiornabile e scalabile comporta una nuova serie di sfide.\n Ad esempio, distribuire un\u0026rsquo;applicazione che includa più componenti (es. un server Web, un database e un server di autenticazione), piuttosto che configurare il sistema per avere delle repliche in ​​caso di arresto anomalo di uno di questi, è fondamentale in un sistema su larga scala.\nDocker vs. Kubernetes\nArchitettura in 2 parole  Per capire come Kubernetes è in grado di fornire queste funzionalità, è utile avere un\u0026rsquo;idea di come è progettato e organizzato ad alto livello.\n Può essere visualizzato come un sistema integrato in livelli, in cui ogni livello superiore sottrae la complessità riscontrata nei livelli inferiori.\n Quello sottostante è uno schema abbastanza completo del funzionamento di Kubernetes: alla sua base, Kubernetes riunisce singole macchine fisiche o virtuali in un cluster utilizzando una rete condivisa per comunicare tra ciascun server.\nRappresentazione dei componenti dell\u0026rsquo;architettura K8S\nQuesto cluster è la piattaforma fisica in cui sono configurati tutti i componenti, le capacità e i carichi di lavoro di Kubernetes.\n A ciascuna macchina del cluster viene assegnato un ruolo all\u0026rsquo;interno dell\u0026rsquo;ecosistema Kubernetes: un server (o un piccolo gruppo in distribuzioni altamente disponibili) funziona come server principale, ed è quello che in figura si trova sulla sinistra, definito come “master”.\n Questo server funge da gateway e oltre che da “cervello” per il cluster, esponendo una serie di API per utenti e client e verificando l\u0026rsquo;integrità degli altri server, oppure decidendo il modo migliore per suddividere e assegnare il lavoro e orchestrando la comunicazione tra altri componenti.\n Il server principale funge da punto di contatto primario con il cluster ed è responsabile della maggior parte della logica centralizzata fornita da Kubernetes.\n Le altre macchine nel cluster sono designate come nodi (spesso chiamati minions) e sono i server responsabili dell\u0026rsquo;accettazione e dell\u0026rsquo;esecuzione dei carichi di lavoro utilizzando risorse locali ed esterne.\n Per aiutare nelle attività di isolamento, gestione e flessibilità, Kubernetes esegue applicazioni e servizi in container, quindi ogni nodo deve essere dotato di un’istanza del container.\n Il nodo riceve le istruzioni di lavoro dal server principale e crea o distrugge i container di conseguenza, configurando le regole di rete per instradare e inoltrare il traffico in modo appropriato.\nSemplificazione di un cluster K8S in produzione\nElenco degli oggetti principali del mondo K8S (e non solo!)\nEsempio di pod con tre container\nEsempio di Deployment con due pod in replica\nChecklist  Dopo questa (non) brevissima introduzione al funzionamento di Kubernetes, vediamo adesso una lista di controlli che costituiscono delle vere e proprie best practices e che sono fondamentali quando abbiamo a che fare con un ambiente di produzione (ma anche qualche stage prima!).\n Nota: alla fine di questo articolo, trovi anche un cheatsheet pronto da salvare per avere la checklist sempre a portata di mano!\n Healthcheck  Kubernetes offre due meccanismi per tenere traccia del ciclo di vita dei container dei pod: readiness probe e liveness probe.\n La prima determina se un container è pronto a ricevere delle richieste e quindi del traffico in ingresso, mentre la seconda determina se l’oggetto è ancora in esecuzione o meno.\n Grazie a queste “prove”, kubelet può decidere se instradare il traffico o se riavviare il pod.\n Attenzione però: non esiste un valore predefinito per definire l’esito positivo o negativo di questi test. Piuttosto, è buona pratica definire una convenzione rispetto alle verifiche che vengono effettuate.\n Se questi controlli non vengono configurati, kubelet presuppone che la nostra applicazione sia stata avviata correttamente e sia pronta a ricevere traffico non appena viene avviato il contenitore.\n Vediamo un caso d’uso: consideriamo il seguente scenario, dove c’è un\u0026rsquo;app con interfaccia grafica che dipende da un\u0026rsquo;API che costituisce il back-end.\n Se l\u0026rsquo;API è instabile (ad esempio, di tanto in tanto non è disponibile a causa di un bug), la readiness probe del back-end fallisce e anche la liveness del front-end; in questo caso, un errore all’interno di una dipendenza tra due componenti può propagarsi.\n In questo senso, può essere l’ideale testare le due componenti e fornire un esito positivo solo quando entrambe le verifiche vanno a buon fine!\n Gestione delle risorse  Spesso quando si ha a che fare con infrastrutture che lavorano su cloud, si pensa ad un pool infinito di risorse, ma difficilmente è così. Le risorse costano e i costi vanno tenuti in considerazione, impostando dei limiti di memoria e CPUper tutti i container.\n I limiti delle risorse vengono utilizzati per vincolare la quantità di CPU e memoria che i container possono utilizzare e vengono impostati utilizzando la proprietà delle risorse di un container, e non solo.\n Un numero illimitato di pod, in caso di utilizzo massivo, può portare a un impegno eccessivo delle risorse e a potenziali arresti anomali del nodo (e del kubelet).\n Tags  Le labels (o etichette) sono un meccanismo super utile che è possibile utilizzare per organizzare gli oggetti Kubernetes.\n Un\u0026rsquo;etichetta rappresenta una coppia chiave-valore senza alcun significato predefinito, quindi è possibile adattarla alle esigenze dettate dall’infrastruttura.\n Queste possono essere applicate a tutte le risorse presenti nel cluster, ed è possibile utilizzarle per classificare le risorse in base a scopo, proprietario, ambiente o altri criteri.\n Di seguito, riportiamo alcuni esempi utili, dove vengono utilizzate informazioni come il nome dell’applicazione (label con chiave name), oppure la versione (label con chiave version), a quale componente dell’infrastruttura ci si riferisce (ad esempio component).\n Puoi taggare i tuoi Pod con:\n apiVersion: apps/v1 kind: Deployment metadata:  name: deployment  labels:  app.kubernetes.io/name: user-api  app.kubernetes.io/instance: user-api-1234  app.kubernetes.io/version: \u0026#34;1.0.1\u0026#34;  app.kubernetes.io/component: api   O ancora proprietario, utilizzato per identificare chi è responsabile della risorsa (tag pari a owner), oppure il nome del progetto (tag uguale a project) o anche la business-unit di riferimento (ossia business-unit).\n apiVersion: apps/v1 kind: Deployment metadata:  name: deployment  labels:  owner: my-team  project: app-project  business-unit: \u0026#34;12345a\u0026#34;  Logging  I log prodotti dalle applicazioni possono aiutarci a capire cosa sta succedendo all\u0026rsquo;interno dei singoli servizi e sono fondamentali per monitorare le attività o per effettuare del debug.\n Generalmente, esistono due strategie di logging: passiva e attiva. Le applicazioni che utilizzano la gestione dei log passivi non sono a conoscenza dell\u0026rsquo;infrastruttura di logging e registrano i messaggi su output standard.\n Questa best practice fa parte del metodo dell\u0026rsquo;app a dodici fattori.\n Per quanto riguarda l’approccio attivo, l\u0026rsquo;applicazione stessa invia i dati a delle apposite applicazioni di gestione dei log, oppure li salva direttamente in un database.\n Questo tuttavia è considerato l’approccio peggiore!\n Scalabilità automatica  L\u0026rsquo;Horizontal Pod Autoscaler (abbreviato in HPA) è una funzionalità Kubernetes che permette di monitorare le applicazioni e aggiungere o rimuovere automaticamente repliche del pod in base all\u0026rsquo;utilizzo corrente delle risorse.\n La configurazione dell\u0026rsquo;HPA consente alla soluzione di rimanere disponibile e reattiva in qualsiasi condizione di traffico, inclusi picchi imprevisti o eventuali guasti.\n L\u0026rsquo;HPA può monitorare sia le metriche che fanno riferimento alle risorse integrate (CPU e l\u0026rsquo;utilizzo della memoria dei tuoi pod) sia sfruttando delle metriche personalizzate.\n Nel caso delle metriche personalizzate, sei anche responsabile della raccolta e dell\u0026rsquo;esposizione di queste metriche, cosa che puoi fare, ad esempio, con Prometheus e Prometheus Adapter.\n Gestione dell’accesso  Questo step si può riassumere in pochi, ma semplici punti:\n Applicare il principio del privilegio minimo, e quindi concedere agli utenti solo le autorizzazioni necessarie Adeguare continuamente la strategia RBAC, in quanto questa non è autosufficiente, ma è necessario adottare un approccio volto alla convalida continua della policy RBAC adottata. Definizione di un set di ruoli, che saranno poi assegnati e utilizzati adeguatamente, per non aumentare il rischio e la superficie di attacco.  Tips  Esternalizzare tutta la configurazione è molto importante, se si vuol rendere facilmente gestibile l’ambiente.\n Questo tipo di approccio ha diversi vantaggi, tra il cui il fatto che, utilizzando oggetti come ConfigMap e Secret, la modifica della configurazione non richiede la ricompilazione dell\u0026rsquo;applicazione.\n In Kubernetes, la configurazione può essere salvata in oggetti come le ConfigMaps, che può quindi essere montata in container tramite dei volumi dove queste informazioni vengono passate come variabili di ambiente.\n Attenzione: è importante montare i Secrets come volumi, e non come variabili di ambiente, per evitare che i relativi valori vengano visualizzati nel comando utilizzato per avviare il container, il quale potrebbe essere analizzato da utenti che non dovrebbero averne l’accesso!\n Risorse utili Download K8s in prod cheatsheet\n", "url": "https:\/\/theredcode.it\/k8s-in-produzione-best-practices\/" }, "https:\/\/theredcode.it\/tags\/kubernetes\/": { "title": "kubernetes", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/kubernetes\/" }, "https:\/\/theredcode.it\/categories\/kubernetes\/": { "title": "kubernetes", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/kubernetes\/" }, "https:\/\/theredcode.it\/tags\/produzione\/": { "title": "produzione", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/produzione\/" }, "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-social-media-manager\/": { "title": "Voglio diventare un… Social Media Manager", "tags": ["interviste","voglio-diventare",], "content": "Sabrina è una ragazza brillante, solare e sempre sorridente: sono tutte caratteristiche fondamentali per il ruolo che ricopre e che cura con tanto amore e dedizione.\n Il ruolo di Social Media Manager è un ruolo che mi ha sempre affascinato: come funziona? Come si diventa bravi in questo settore? Quali competenze deve possedere?\n Lavorare con diverse community e aziende, trattare contesti sempre diversi, può essere certamente stimolante, ma anche difficile\u0026hellip;\n Vediamo dunque come lavora Sabrina e cosa significa essere una Social Media Manager all\u0026rsquo;interno dell\u0026rsquo;ambito tech e quali sfide ha dovuto affrontare!\n Descriviti in 100 parole.  Sono Sabrina e mi occupo di comunicazione digital per un’azienda informatica. Scrivo, creo contenuti per il web\u0026hellip; e per i social! Da che ho memoria amo scrivere e sono una persona creativa.\n Per questo, quando ho iniziato a muovere i primi passi nel mondo della comunicazione digital, i social media mi hanno conquistata subito permettendomi di dare libera espressione alla mia creatività.\n Anche se, non mi occupo soltanto di questo e il mio ruolo è più “orizzontale”, nel senso che mi occupo di social media e in generale di comunicazione digital a tutto tondo.\n  Sono quella che di solito chiami quando hai bisogno di aiuto su un testo.\n  Una mail? Una bio inviare per la call 4 speaker? O un post sui social, appunto! Quando non lavoro, divoro libri, vado ai concerti, viaggio e cammino. Amo il trekking e scoprire il mondo camminando.\n In cosa consiste il ruolo di Social Media Manager?  No, non siamo quelli che postano foto carine e simpatiche sui social dell’azienda 😂\n Il/La Social Media Manager è la persona che si occupa di gestire i canali social dell’azienda per cui lavora o del progetto/brand/iniziativa di cui cura la comunicazione social.\n Può lavorare come dipendente in azienda, o in agenzia di comunicazione, oppure come freelance. Per spiegarti di cosa si occupa, ti racconto la mia giornata tipo.\n La mia giornata tipo inizia con il check quotidiano dei canali social che gestisco: se ci sono commenti da gestire, menzioni a cui rispondere, crisi da risolvere. Ebbene si, delle crisi.\n Un commento negativo, o una discussione tra utenti, se gestiti male possono far nascere delle vere e proprie “crisi” con conseguenti danni di immagine. Tutte queste attività rientrano in quello che viene comunemente chiamato community management.\n Nel mio caso, lavorando in ambito tecnologico, mi occupo anche della gestione social di alcune community tech: prima fra tutte Django Girls Italia, e a seguire aiuto anche Python Italia.\n Successivamente, continuo con l’aggiornamento di piani editoriali, seguito dalla stesura di calendari editoriali. Questi strumenti sono fondamentali per un Social Media Manager.\n Il primo serve per progettare il tipo di contenuti che vogliamo pubblicare sui nostri canali; mentre il secondo serve per calendarizzare, con data, orario, copy del post e grafica, tutti i post che vogliamo pubblicare sui social che gestiamo.\n Quindi nella mia giornata tanto spazio è assorbito dalla pianificazione ma anche dalla scrittura dei post e, in alcuni casi, dalla creazione delle grafiche stesse.\n  Social Media Manager stereotypes\n Questo è uno degli aspetti che amo di più del mio lavoro perché mi da modo di esprimere la mia creatività. Non sempre al Social Media Manager viene chiesto di saper elaborare delle grafiche, ma se sai farlo, tanto meglio.\n Tutto dipende dall’ambiente in cui lavori: se lavori per una grande azienda o un’agenzia di comunicazione in cui ci sono team strutturati in cui ognuno ha il suo ruolo specifico (Graphic Designer, Social Media Manager, Social Media Advertiser ecc), oppure se lavori per una piccola azienda dove una sola figura deve ricoprire più funzioni.\n Per tornare alla mia giornata, prosegue con l’analisi delle performance, e quindi del monitoraggio di alcune metriche molto importanti - che ci mettono a disposizione le stesse piattaforme social - perché ci mostrano se i nostri contenuti stanno performando bene, cosa si può migliorare e cosa invece non sta funzionando ed è meglio accantonare.\n Nel mio caso specifico, il lavoro vero di pianificazione, creazione dei post, pubblicazione e monitoraggio lo svolgo in solitaria.\n Ma, come dicevo poche righe fa, questo dipende molto dalla realtà aziendale in cui ti troverai a lavorare. In passato, ho lavorato per agenzie in cui il lavoro era svolto completamente in team ed era bello per questo. Sono una fautrice del team working!\n Qual è la soft skill più importante che deve possedere una Social Media Manager?  È una vera cattiveria chiedermi di individuarne solo una!\nMa se devo scegliere direi l’intraprendenza e la proattività. Quello che intendo è non aver paura di sperimentare con tutti gli strumenti che le piattaforme social ci mettono a disposizione per comunicare con il nostro pubblico.\n Solo così conosceremo lo strumento, capiremo cosa funziona per noi e cosa no, e scopriremo anche i nuovi trend (immaginatemi mentre sto cercando di capire come funzionano i video su Tik Tok!).\n Se devo fare una classifica, a seguire metterei una buona abilità comunicativa. Ci aiuta sia nel lavoro di team ma anche nel capire che ogni piattaforma ha i suoi linguaggi sulla base dei quali dobbiamo calibrare la nostra comunicazione e costruire il messaggio.\n E infine, la capacità di pianificare e organizzare. Un/a buon/a Social Media Manager deve essere organizzato/a!\n Era impossibile citarne solo una! 😅\n 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.  Sicuramente rimasi molto male, quando qualche anno fa, dopo aver curato la comunicazione di un Django Girls a Roma che si sarebbe tenuto all’Università, esplose un vero e proprio flame di polemiche sterili. Avevo curato tutto nei minimi dettagli, per non urtare la sensibilità di nessuno, come richiedono questo tipo di eventi.\n Dispiace, quello si. Mi sono chiesta se potevo fare le cose diversamente ma la verità è che nei casi di alcune tematiche particolarmente sensibili ci sarà sempre una parte di pubblico che non si sentirà compresa, o non sentirà sua quella problematica e lo dirà.\n Lo dirà anche in modo poco educati, da dietro uno schermo. Dobbiamo fare i conti con questo aspetto. Cosa possiamo fare? Essere empatici e calarsi nei panni di chi leggerà la nostra comunicazione è fondamentale.\n Oltre ad essere strategici e moolto pazienti nella gestione della crisi che emergono da queste situazioni. Questo episodio mi ha insegnato a non sottovalutare mai questi due aspetti.\n In generale, i progetti a cui ho preso parte ma che potevano andare meglio hanno tutti un minimo comune denominatore, anzi due: mancanza di pianificazione e organizzazione e una scarsa strategia di comunicazione.\n Come fare per diventare una Social Media Manager?  La laurea non è essenziale ma avere delle solide basi di marketing e comunicazione digitale, branding, strategia di comunicazione, si! Per me l’Università è stata importante per questo.\n Ad oggi, i corsi di specializzazione per Social Media Manager sono moltissimi e sono un ottimo modo per intraprendere questo percorso. Potrai coniugare la teoria - magari già affrontata in un Corso di Laurea - agli strumenti e alle competenze più pratiche.\n Anche le risorse gratuite che si trovano online sono un buon modo per avvicinarsi alla materia ma da sole non sono sufficienti.\nPer fare questo lavoro, i social devono appassionarti. Devi viverli quotidianamente, usarli tu stesso per primo come utente, per capire le loro dinamiche. Devi essere creativo, curioso e dinamico.\n I cambiamenti non devono spaventarti e devi essere sempre pronto a conoscere le nuove funzionalità, piattaforme per cavalcare i nuovi trend.\n  È un mondo che cambia molto velocemente.\n  Io in questo periodo sto lottando con Tik Tok! Devi saper scrivere testi efficaci e calibrare il messaggio che vuoi mandare in base al canale su cui stai scrivendo, al tuo target e all’obiettivo che vuoi ottenere.\n Quello che mi sento di dire è che la differenza in questo settore la fa la pratica sul campo. È retorica? Probabilmente si, ma è anche altrettanto vero. È importantissimo sperimentare e sporcarsi le mani. Inizia da piccoli progetti, anche personali per capire le dinamiche social, creare contenuti e vedere cosa funziona di più.\n Se sei all’inizio, i progetti più piccoli sono quelli che potrai inserire nel tuo curriculum o in un eventuale portfolio da mostrare in sede di colloquio. Un piccolo trucchetto? Non hai progetti da inserire in un portfolio? Creali tu. Crea un brief e sulla base di quello mostra cosa puoi realizzare a livello social.\n Anche io, all’inizio ho gestito le pagine Facebook più disparate: collaboravo con un magazine online che si occupava di serie tv e gestivo la loro pagina facebook nel tempo libero; per un brevissimo periodo ho collaborato con alcune community local di promozione del territorio su Instagram; ho anche aperto un blog personale - tristemente non aggiornato 😅 - per parlare di social.\n Per me sono stati importantissimi anche i molti, molti, molti stage che ho fatto dopo il mio percorso formativo. Tutte esperienze che mi hanno permesso di imparare da chi già ricopriva questo ruolo, oltre a farmi scoprire anche quale contesto lavorativo mi piaceva di più.\n Ero più una social media manager da agenzia o da ufficio marketing e comunicazione? Un aspetto che ritengo importantissimo e mi ha guidata successivamente nella ricerca di opportunità di lavoro.\n Le certificazioni sono utili ma non fondamentali. Io ad esempio non ne ho, anche se non escludo di conseguirle in futuro. Tra le più famose ci sono quelle rilasciate da Facebook. Se le possiedi tanto meglio, ma non ti servono per iniziare.\n Ti serviranno per “certificare”, quando avrai già fatto un po’ di esperienza sul campo che sei un/a professionista “certificato” e competente.\n  Per riassumere: fai tanta tanta tanta pratica! Buttati anche se ti senti ancora alle prime armi.\n  Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Voglio continuare a crescere in questo ruolo, acquisire ancora più esperienza e t_rovare nuovi progetti stimolanti e con un impatto_ in cui buttarmi. Tra tre anni mi vedo sempre nel mondo dei social, della comunicazione digital e nel settore tecnologico.\n Come dicevo qualche riga sopra, lavoro per un’azienda informatica, e nel settore tech ho scoperto un ambiente stimolante, interessante, ricco di bellissime persone che hanno avuto un forte impatto sulla mia vita professionale ma anche personale, tanto che vorrei continuasse a far parte del mio percorso.\n Mi vedo anche a creare strategie social e magari a guidare un vero e proprio team di comunicazione.\n Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema?  Da donna sono sempre stata sensibile alle questioni sociali legate al raggiungimento della parità di genere.\n Da quando lavoro in ambito tech ho poi scoperto che ci sono settori, compreso quello tecnologico, in cui il divario di genere è numericamente schiacciante, sia a livello di numeri che di salario. Ma la cosa bella è stata scoprire di poter fare qualcosa per migliorare la situazione.\n Dal 2018 sono una delle organizzatrici e community manager di Django Girls Italia, una community che si occupa di far avvicinare le donne al mondo della programmazione attraverso l’organizzazione di workshop pratici e faccio parte dell’associazione no-profit Fuzzy Brains che ha l’obiettivo di abbattere il divario di genere in ambito tech e rendere il mondo tecnologico più inclusivo.\n In questi progetti, ogni giorno metto il cuore. Il mondo STEM e quello tecnologico sono settori che ancora soffrono di inutili stereotipi e pregiudizi di genere.\n I dati statistici sulle percentuali di occupazione dimostrano chiaramente che c’è ancora molta resistenza da parte di studentesse, donne, e altre minoranze, di intraprendere percorsi in questi ambiti.\n È un problema in larga parte culturale, che dobbiamo assolutamente superare. Il settore IT sarà uno dei protagonisti in termini di occupazione nel prossimo futuro e non possiamo permetterci che sia sottorappresentato.\n  Abbiamo bisogno di diffondere una maggiore cultura della diversità e dell’inclusività, in generale, e nel settore tech. Con Fuzzy Brains, che supporta la community Django Girls in Italia, ci occupiamo proprio di questo e io sono contentissima di poter fare la mia parte e mettere le mie competenze a servizio di questi progetti.\n Grazie a Sabrina per aver condiviso la sua esperienza!\n Contatti - LinkedIn\n ", "url": "https:\/\/theredcode.it\/interviste\/voglio-diventare-una-social-media-manager\/" }, "https:\/\/theredcode.it\/persi-senza-google-maps\/": { "title": "Persi senza Google Maps", "tags": ["random",], "content": "Ti è mai capitato di fermarti a pensare come faresti ad andare ad un evento dall’altra parte della città, se non avessi installata qualche app che ti faccia da navigatore?\n Nascere nella generazione in cui è “impossibile perdersi” è una grandissima fortuna. Nessuno dopo di noi, neanche una sola generazione, potrà avere la sensazione di essersi perso così come lo sono state le generazioni prima di noi.\n La realtà è che siamo persi senza Google Maps, letteralmente.\n Intro  Immagina di trovarti in vacanza. Immagina di aver dimenticato il telefono in albergo e di avere una prenotazione in un ristorante nel giro di pochi minuti, ma di trovarti in un posto di cui non sai assolutamente nulla. Che fare?\n La rivoluzione di Google Maps ha toccato dei terreni inesplorati: la frustrazione e la paura che derivano dalla sensazione di perdersi in un territorio sconosciuto.\n La vergogna che si provava a causa dell’incapacità di seguire le indicazioni dettagliate nel Tuttocittà che erano state accuratamente studiate e stampate il giorno prima di un viaggio. L\u0026rsquo;ansia di accostare per chiedere indicazioni a una stazione di servizio. E così via.\n Google Maps rappresenta una di quelle tecnologie di cui si è ampiamente sottostimato il valore e l’impatto.\n Mentre viaggio e mi sposto in giro per il mondo -certamente, prima del Covid-19-, si diventa più consapevoli delle proprie capacità di confidare di essere sulla strada giusta verso la mia destinazione solo grazie ad un telefono.\n La comoda ignoranza di non sapere dove siamo, di sapere quanto abbiamo viaggiato e di quanto tempo ci aspetta prima di arrivare a destinazione, se ci sarà parcheggio o se sarà affollato, sono tutte informazioni che prima erano impensabili.\n  Cristoforo Colombo sarebbe stato un uomo qualunque, se Google Maps fosse esistito già nel 1400.\n  Mentre la navigazione attraverso il classico navigatore GPS ha seguito un percorso contorto verso l\u0026rsquo;obsolescenza, Google Maps ci ha portato il mondo intero.\n Oggi in tutto il mondo le persone atterrano a New York, a Tokyo, al Cairo o persino nella Repubblica Democratica del Congo senza avere la più pallida idea di quale strada dovrà portarli in albergo o se la città sia quella giusta.\n Ovunque, scendono dagli aerei in una terra straniera, in un posto in cui non sono mai stati, e indovina un po\u0026rsquo;, sanno dove sono\u0026quot;.\n Ma\u0026hellip;\n Che cos’è Google Maps?  La piattaforma Google Maps, formalmente nota come API di Google Maps, nasce nel 2005 e da qualche anno ha lanciato diversi aggiornamenti che stanno interessando sia gli sviluppatori che gli imprenditori.\n Google Maps funge sia da motore di ricerca per trovare informazioni su aziende e attività locali, sia da mappa per indirizzare gli utenti verso quella posizione.\n Ciò è particolarmente importante poiché il 30% di tutte le ricerche da dispositivi mobili è basato sulla posizione, il che significa che Google Maps rappresenta un fattore critico per il traffico mobile.\n Un difetto? Le foto sono state “schiacciate” per essere adattate al servizio, anche se in realtà si tratterebbe di ortofoto.\n Posti insoliti  Il tutto ha però anche un lato comico: vediamo qualche esempio di posti divertenti (e straordinari) da guardare seduti comodamente a casa propria.\n Un aereo tra gli alberi\n Gesù ti ama\n Gli stagni di potassio in Utah\n Un branco di bufali in corsa\n Il Gigante di Atacama in Cile\n  Meteor Crater Visitor Center\n  La sede di Batman\n E poi\u0026hellip;  Google Maps è però solo uno dei primi progetti nati su questo tema: pensiamo anche a Google Earth.\n E se volessimo volare fuori dal pianeta?\n Google Earth Pro è gratuito e disponibile per tutti i sistemi operativi. Ci permetterà di fare un bel giro per l\u0026rsquo;universo\u0026hellip;\n Google Mars è un\u0026rsquo;applicazione all\u0026rsquo;interno di Google Earth che è una versione dello stesso programma, ma per le immagini del pianeta Marte.\n Una foto di Marte\n Google gestisce anche una versione basata su browser, sebbene le mappe abbiano una risoluzione molto più accurata all\u0026rsquo;interno di Google Earth e includano terreno 3D, nonché immagini a infrarossi e dati di elevazione.\n Ci sono anche alcune immagini ad altissima risoluzione della telecamera HiRISE del Mars Reconnaissance Orbiter che hanno una risoluzione simile a quelle delle città sulla Terra.\n Marte ha anche una piccola applicazione trovata vicino in una certa zona di Marte. Si chiama Meliza, un personaggio robot con cui l\u0026rsquo;utente può parlare. Spoiler: è abbastanza diffidente!\n Un estratto della conversazione con Meliza\n Infine, quella che originariamente era un\u0026rsquo;applicazione browser, Google Moon è una funzione che consente l\u0026rsquo;esplorazione della Luna. Google ha portato la funzione su Google Earth per il 40° anniversario della missione Apollo 11 il 20 luglio 2009.\n Foto della Luna\n Infine, Google Sky: possiamo esplorare tutte le costellazioni ad ora note inserendo le coordinate della carta celeste, nel formato [ascensione retta] [declinazione] (ad esempio: 12h 46m 10.1s +30° 43′ 55″).\n Galassie topo, parte della Chioma di Berenice\n", "url": "https:\/\/theredcode.it\/persi-senza-google-maps\/" }, "https:\/\/theredcode.it\/tags\/random\/": { "title": "random", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/random\/" }, "https:\/\/theredcode.it\/categories\/random\/": { "title": "random", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/random\/" }, "https:\/\/theredcode.it\/voglio-diventare-una...-digital-transformation-consultant\/": { "title": "Voglio diventare una... Digital Transformation Consultant", "tags": ["interviste","voglio-diventare",], "content": " La serie di articoli a tema \u0026ldquo;cosa voglio fare da grande\u0026rdquo; continua e ogni martedì porterà un ospite diverso, che racconterà quello che è il suo lavoro secondo l\u0026rsquo;esperienza che vive giorno dopo giorno.\n Questa settimana passa la parola a Flavia Marzano, che tra i tanti cappelli ha indossato anche quello di Digital Transformation Consultant.\n Donna con una carriera professionale incredibile, ci ha messo del suo per migliorare la città in cui ha vissuto negli ultimi anni. Ha fatto della sua professione una vera e propria missione, portando avanti delle iniziative che hanno fatto la differenza non solo in ambito digitale, ma toccando temi importantissimi come l\u0026rsquo;accessibilità.\n Ma partiamo dall\u0026rsquo;inizio\u0026hellip;\n Descriviti in poche parole  Sono laureata in Informatica qualche decennio -\u0026ldquo;secolo\u0026rdquo;- fa e ho fatto una tesi basata sull\u0026rsquo;Intelligenza Artificiale, quando di Intelligenza Artificiale quando se ne parlava ancora molto poco.\n Adesso per fortuna si comincia a vedere anche nelle imprese e nella pubblica amministrazione.\n Per più di trent\u0026rsquo;anni ho fatto la consulente nella pubblica amministrazione, anche se all\u0026rsquo;inizio non si parlava di Digital Transformation, ma più di \u0026ldquo;innovazione tecnologica\u0026rdquo;.\n Parliamo di un periodo in cui alcuni comuni non avevano neanche la rete, quindi possiamo parlare di un\u0026rsquo;altra epoca, anche se in fondo siamo solo a trent\u0026rsquo;anni di distanza\u0026hellip;\n  L\u0026rsquo;utilizzo della tecnologia nella pubblica amministrazione all\u0026rsquo;anagrafe o alla ragioneria era qualcosa di avveniristico.\n  All\u0026rsquo;inizio il mio compito era anche quello di aiutarli predisponendo capitolati che permettessero la digitalizzazione, e posso dire che ho visto cose che voi umani\u0026hellip; cosa da raccapriccio!\n Purtroppo capita molto spesso che, in comuni piccoli e grandi, vengano usati gli stessi software da più di trent\u0026rsquo;anni, perché \u0026ldquo;hanno sempre funzionano così bene\u0026hellip;\u0026rdquo;.\n Questo descrive l\u0026rsquo;importanza della Digital Transformation, anche nella politica: una maggiore consapevolezza avrebbe sicuramente evitato diverse situazioni come queste!\n Qual è la soft skill più importante per questa professione?  La consapevolezza digitale. La prima cosa che devi fare quando arrivi a lavorare in un settore come questo della pubblica amministrazione, è farsi fare un elenco dei contratti in essere: cosa viene usato, da quando, quando scadono le licenze\u0026hellip;\n Software? Anche chi non è strettamente tecnico, dovrebbe tenere in considerazione che c\u0026rsquo;è bisogno del digitale. Perché non far sì che i dipartimenti collaborino?\n Adesso c\u0026rsquo;è una figura -obbligatoria- che è il Responsabile della Transazione Digitale e proprio perché non è necessario essere \u0026ldquo;esperti informatici\u0026rdquo;, questo ruolo diventa fondamentale per gestire al meglio le risorse a propria disposizione.\n Questo software è vecchio, che alternative abbiamo? Questo software funziona bene, può essere utile ad altri dipartimenti?\n  Purtroppo lavorare per silos \u0026ldquo;informativi\u0026rdquo; non aiuta: sono necessari momenti di lavoro condiviso, fare lavoro di squadra, spesso così i progetti vengono meglio -e costano meno-.\n  Un esempio: che cosa fa un cittadino romano medio che vede la neve per strada? Guarda sul sito di Roma se è stata lanciata un\u0026rsquo;allerta meteo e se le scuole saranno chiuse.\n In questo caso, sono necessari diversi step, come la comunicazione.\n Serve un banner gigante in prima pagina che permetta agli utenti di rilevare subito l\u0026rsquo;informazione, e non qualcosa che i cittadini devono andare a cercare in giro per il sito.\n Per queste attività è fondamentale avere competenze digitali che siano trasversali: sono tutte cose che si devono e si possono imparare, e non valgono solo per le persone strettamente \u0026ldquo;tecniche\u0026rdquo;.\n Per non parlare di usabilità, data driven design, e soprattutto accessibilità. Parliamo di una legge di più di 16 anni fa, che però richiede ancora tanto lavoro.\n Quando il portale (di Roma) è stato rifatto, è stato prima messo in beta test online, per chiedere agli utenti che cosa funzionasse e cosa no, cosa trovassero facilmente e quale fosse la loro esperienza.\n Non solo: l\u0026rsquo;ho abbiamo fatto analizzare dall\u0026rsquo;Unione Italiana Ciechi Ipovedenti che lo hanno studiato e ci hanno mandato tanti suggerimenti essenziali che ovviamente abbiamo adottato!\n Alla fine di questa esperienza, ho ricevuto una bellissima mail dove mi hanno fatto notare che se tutti i siti della pubblica amministrazione fossero così, i problemi di accessibilità sarebbero drasticamente ridotti.\n E sia chiaro, non perché sono brava io: ho solo posto attenzione all\u0026rsquo;utente finale, togliendo il cappello tecnico e vestendo i panni di chi usa effettivamente il servizio e investendo nella comunicazione e nel trovare un linguaggio comune.\n Esempio pratico? Se un medico ti parla di RMN, non tutti hanno le capacità per capire che si tratta di Risonanza Magnetica Nucleare.\n Allo stesso modo, non tutti sanno che cosa significa avere a disposizione servizi digitalizzati, come la richiesta di un certificato.\n E non solo: se una persona avanti con l’età e con poca familiarità con le tecnologie ha difficoltà, figuriamoci chi magari è a Roma di passaggio e conosce poco la lingua! Ed ecco come sono nati i punti Roma Facile.\n  Il \u0026ldquo;nessuno escluso\u0026rdquo; parte anche da questo.\n  Nei social passa sempre il messaggio del \u0026ldquo;ce l\u0026rsquo;ho fatta\u0026rdquo;, ma parliamo di quando va male.\n Nella tua carriera, qual è stato il più grande fallimento?  Nella mia ultima esperienza c\u0026rsquo;è stato un episodio per cui non riesco a trovare un aggettivo: durante alcune riunioni, provando ad essere una persona educata, alzavo la mano per poter dire la mia durante le varie discussioni.\n Non una volta, ma tante volte, inutilmente. Vedendo che al mio gesto non veniva dato seguito, una volta in cui era davvero importante quello che volevo dire perché a mio avviso si trattava di una delibera sbagliata, mi sono alzata dopo aver verificato che avevano ugualmente il numero legale.\n La sindaca allora mi ha chiesto spiegazioni, dopo le quali ha tolto la delibera dall’ordine del giorno.\n Mi pento di non aver fatto più spesso, e quindi di non aver fatto sentire la mia voce, magari alzandola -come hanno fatto tanti miei colleghi, perlopiù maschi-.\n  Mi vergogno di non aver parlato quando avrei dovuto, perché magari avrei potuto fare la differenza!\n  Tema gender gap in ambito STEM: cosa fare sul serio, e cos\u0026rsquo;hai fatto tu nel tuo piccolo?  \u0026ldquo;Nel mio piccolo\u0026rdquo; è giusto, perché sapessi il mondo quant\u0026rsquo;è grande.. Sicuramente partire dalle elementari: purtroppo e per fortuna le bambine e i bambini sono condizionati dai loro genitori, e sappiamo che nella società la tecnologia è un qualcosa che viene associato ai maschietti.\n Insegnare alle scuole elementari alla bambine e ai bambini che cosa sono le scienze, a che cosa servono, e trasformarle in un gioco, farebbe davvero la differenza. Se in una classe ci fosse un potenziale nuovo Einstein, questo/a magari verrebbe sottovalutato/a e non valorizzato/a come invece dovrebbe, per colpa di una mancanza di competenze non solo digitali ma anche di scienze di base.\n E questo per cominciare\u0026hellip; Creare poi dei momenti formativi non solo per i bambini, ma per i docenti. Iniziative come l\u0026rsquo;Ada Lab e il CoderDojo sono fondamentali per aiutare e supportare anche le più giovani per entrare in questo meraviglioso mondo.\n  Questi sono momenti per far apprezzare il gioco che c\u0026rsquo;è dietro la programmazione, che non è assolutamente lontano dal mondo femminile, anzi!\n  In questo senso, l\u0026rsquo;associazionismo aiuta tanto. Bisognerebbe mettere a fattor comune le competenze e sfruttare le community locali che hanno a cuore questo tema, organizzando eventi che siano in grado di raccogliere queste donne e fare coaching. Io lo faccio, aiutando le ragazze a capire che possono e devono avere più fiducia in sé stesse!\n Aiutare i docenti a identificare le ragazze e i ragazzi nelle loro propensioni e fare da mentori è importantissimo: io ho fatto il classico a Roma e ricordo bene quando la mia professoressa di filosofia, arrivati in fondo al percorso scolastico, mi chiese che cosa volevo fare \u0026ldquo;dopo\u0026rdquo;. Le risposi che le mie due passioni erano le lingue e la matematica.\n Lei mi rispose: \u0026ldquo;Perché non ti iscrivi ad informatica?\u0026rdquo;. Era il 1973: io non sapevo neanche che esistesse, perché a Roma non c\u0026rsquo;era. Mi portò un libro di algebra booleana, me lo sono letto e me ne sono totalmente innamorata.\n Qual è il tuo prossimo obiettivo?  Difficile questa\u0026hellip; ok, ce l\u0026rsquo;ho. Fare formazione alla classe politica italiana. Io non sono in nessun partito, ma dico che se anche istituzioni come Camera o Senato mi autorizzassero e supportassero nel fare formazione sul digitale, sarebbe una grandissima opportunità.\n Basta guardare le varie linee programmatiche: manca quasi sempre un obiettivo che sia concreto e misurabile. Anche gratis, regalo il mio tempo, per fare formazione ad assessori, sindaci, deputati. Vorrei poter trasmettere a queste persone il minimo che permetta loro di avere a cuore la trasformazione digitale.\n Vorrei che quelle digital soft skill fossero ben assimilate e chiare: open source, blockchain e anche intelligenza artificiale, sono tematiche fondamentali e bisogna avere la consapevolezza e la conoscenza di argomenti come questi che ormai sono all\u0026rsquo;ordine del giorno.\n Non a caso, con gli Stati Generali dell\u0026rsquo;Innovazione avevamo prodotto un ebook -che andrebbe aggiornato perché ormai ha 6 anni- che parlava delle le parole dell\u0026rsquo;innovazione che un politico non può ignorare.\n Oltre a tematiche come l\u0026rsquo;Open Data, si parlava anche della legislazione vigente, e del perché questa tematica andrebbe affrontata e valutata. Dobbiamo assolutamente aggiornarlo.. Proviamoci!\n ", "url": "https:\/\/theredcode.it\/voglio-diventare-una...-digital-transformation-consultant\/" }, "https:\/\/theredcode.it\/101-funzioni-async\/await\/": { "title": "101 - Funzioni async\/await", "tags": ["javascript",], "content": "Le funzioni async/await sono l’incubo di tutte le persone che iniziano a lavorare con tecnologie come Javascript, ma in realtà sono tanto facili quanto ordinare una pizza con un\u0026rsquo;app di consegna a domicilio.\n Comprendere una funzione asincrona e farla cooperare con altre funzioni, può sembrare difficile, ma non è assolutamente così.\n In questo articolo, diamo quindi un’occhiata a come rendere le funzioni async/await super facili!\n Che cos\u0026rsquo;è un\u0026rsquo;attività asincrona?  Un\u0026rsquo;attività asincrona consente di completare altre attività mentre l\u0026rsquo;attività asincrona è ancora in fase di completamento. In altre parole, questa funzione verrà eseguita in maniera indipendente rispetto alle altre e manderà una notifica o un evento quando avrà terminato.\n Prendiamo come esempio l’ordine di una pizza su una qualsiasi app di consegna a domicilio.\n Scegli la pizza, mandi l’ordine (async) e chiudi l’app. Nel frattempo che attendi la conferma (await), accendi la TV e scegli che film vedere la sera, mentre la struttura avvia la preparazione dell’ordine e cucina la tua pizza (async).\n Un altro esempio? Una funzione asincrona è quando lavi il pavimento della cucina (async) e mentre aspetti che si asciughi (await), vai a mettere su una lavatrice (async).\n Torniamo al nostro esempio principale e iniziamo a scrivere un po’ di codice!\n Hands on!  Diciamo che vogliamo ordinare una pizza in quel ristorante napoletano sotto casa che ci piace tanto. Il primo passo è aprire l’app e scegliere la pizza; una volta inviato l’ordine, scegliamo il film per la serata e aspettiamo che la pizza sia pronta.\n Quando il rider sarà partito dalla struttura, riceveremo un messaggio e aspetteremo con ansia che il campanello suoni. Ci siamo?\n Ok, procediamo!\n // Funzione per ordinare la pizza const orderPizza = async () =\u0026gt; {  console.log(\u0026#39;Pizza has been chosen and order has been sent! Wait for the confirmation\u0026#39;);  const response = await orderConfirmed();  console.log(response); } // Funzione asincrona che aspetta la conferma dell\u0026#39;ordine const orderConfirmed= async () =\u0026gt; {  return new Promise(resolve =\u0026gt; setTimeout(() =\u0026gt; {  resolve(\u0026#39;Thanks for your order! Pizza is on its way to the oven!\u0026#39;)  }, 3000)); } // Funzioni accessorie const getPizza = () =\u0026gt; console.log(\u0026#39;Order pizza.\u0026#39;); const chooseMovie= () =\u0026gt; console.log(\u0026#39;Opening Netflix and choosing a movie for tonight.\u0026#39;); const watchTV = () =\u0026gt; console.log(\u0026#39;Watching movie.\u0026#39;); // Eseguiamo le funzioni getPizza(); orderPizza(); chooseMovie(); watchTV(); // Output Order pizza. Pizza has been chosen and order has been sent! Wait for the confirmation Opening Netflix and choosing a movie for tonight. Watching movie. Thanks for your order! Pizza is on its way to the oven!  ll risultato è quanto prodotto dalle funzioni asincrone: mentre scegliamo la pizza e ordiniamo (funzione orderPizza()), noi ci sediamo sul divano pronti per un po’ di Netflix (funzione chooseMovie() e watchMovie()) e aspettiamo che l\u0026rsquo;ordine venga confermato.\n Sembra paradossale, ma in Javascript funziona allo stesso modo.\n Breve sintassi sull\u0026rsquo;uso delle funzioni async/await. Credits to Il Blog di Andrea Merlin (https://amerlin.keantex.com)\n Notare però che quando si attende una risposta da una funzione asincrona, è necessario chiamarla all\u0026rsquo;interno di un\u0026rsquo;altra funzione che è sempre asincrona. Questo è ciò che vediamo sopra quando all\u0026rsquo;interno di orderPizza() viene chiamato orderConfirmed().\n Due punti chiave da ricordare:\n   Javascript NON attende il completamento di una funzione asincrona come orderPizza() prima di passare alle attività che seguono come watchTV() e chooseMovie().  Javascript attenderà una funzione asincrona come orderConfirmed() per completare e restituire i dati prima di passare all\u0026rsquo;attività successiva all\u0026rsquo;interno di una funzione asincrona padre. Lo vediamo nel momento in cui ci viene restituita la risposta finale.  E se l’esempio della pizza è chiaro, passiamo al caso in cui abbiamo bisogno di dati che devono essere restituiti da un servizio esterno, ed eseguire delle operazioni solo quando questi dati saranno pronti!\n Definiamo una funzione asincrona (riga 1) che, recuperati dei dati da un’API esterna, attende che questi dati siano restituiti (riga 3) e se la response ottenuta è positiva (riga 4) , li estrae in una nuova variabile (riga 5) li stampa a nei log (riga 6).\n const getTheData = async () =\u0026gt; {  try {  const response = await fetch(\u0026#39;https://jsonplaceholder.typicode.com/users\u0026#39;);  if (!response.ok) throw Error();  const data = await response.json();  console.log(data);  console.log(\u0026#39;End!\u0026#39;) } catch (err) {  console.error(err);  } } getTheData(); console.log(\u0026#39;Begin\u0026#39;); // Output Begin. // data End!  Che dici, è più chiaro ora come si usano le funzioni async/await?\n  Ti potrebbero interessare\u0026hellip; 101 - CORS Policy con Ionic e Node Come costruire un API Gateway con Express HttpClient GetAsync - Asynchronous Coding \u0026amp; Performance ", "url": "https:\/\/theredcode.it\/101-funzioni-async\/await\/" }, "https:\/\/theredcode.it\/tags\/javascript\/": { "title": "javascript", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/javascript\/" }, "https:\/\/theredcode.it\/categories\/javascript\/": { "title": "javascript", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/javascript\/" }, "https:\/\/theredcode.it\/tags\/big-data\/": { "title": "big-data", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/big-data\/" }, "https:\/\/theredcode.it\/tags\/big-data-analytics\/": { "title": "big-data-analytics", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/big-data-analytics\/" }, "https:\/\/theredcode.it\/voglio-diventare-una...-big-data-analyst\/": { "title": "Voglio diventare una... Big Data Analyst", "tags": ["big-data","big-data-analytics","interviste",], "content": " Determinazione: questa è la parola chiave con cui Maria racconta e vive la sua esperienza da Big Data Analyst. Entrare in un mondo a lei totalmente sconosciuto non è stato semplice, ma si è fatta strada in pochissimo tempo: nell\u0026rsquo;intervista di oggi, raccontiamo la sua storia, grazie alle sue stesse parole!\n A proposito: Maria cura anche una bellissima pagina Instagram a tema #tech. Trovi in fondo all\u0026rsquo;articolo il link!\n Descriviti in 100 parole  Ciao a tutti! Mi chiamo Maria e lavoro nel campo della Data Analysis e Big Data Engineering.\n Sono una ragazza di 23 anni e sono fiera del percorso professionale che sto percorrendo. Sono stata fin da piccola appassionata di informatica - smanettando con il mio primo Windows Vista -, ma non ci sono mai state le giuste opportunità per poter studiare questa materia; tuttavia, questo non ha fermato il mio obiettivo.\n Mi sono diplomata in relazioni internazionali per il marketing ed ho iniziato sin da subito il mio percorso lavorativo nell’amministrazione e contabilità. Non sentendomi parte di quel “mondo” sono uscita dalla mia “comfort zone” e ho ricominciato da capo con esperienze nel campo informatico. La scalata è stata graduale ma _molto veloc_e, fino a specializzarmi nell’analisi e trasformazione dei Big Data.\n In cosa consiste il ruolo di data scientist?  Il Data Analyst permette alle aziende di analizzare e aggregare i dati per creare nuovi modelli di business e generare vantaggio competitivo, trasformando dei dati grezzi in informazioni comprensibili.\n Raccoglie dati da diverse fonti, li organizza e li struttura per poi analizzarli e ricavarne informazioni utili per il business.\n Il Data Analyst spesso lavora partendo da un problema: collaborando con i manager dei diversi reparti aziendali (dal Marketing alla Logistica, dalla Produzione alle Risorse Umane, dalla Ricerca \u0026amp; Sviluppo al reparto Sales), con Project Managers e i Data Scientists (vedi capitolo a parte), identificando i problemi che rallentano il business e che possono trovare una soluzione tramite l’analisi statistica dei dati.\n Le sorgenti da cui provengono i dati da elaborare infatti possono essere molto varie, ad esempio software gestionali, database interni o forniti da fonti esterne, transazioni finanziarie, o anche sensori ambientali.\n Sono quindi dati con strutture differenti (valori alfanumerici, documenti, foto, video, audio…), che hanno bisogno di essere processati e organizzati in un formato uniforme che permette l’analisi e il confronto.\n Spesso la pulizia dei dati permette di evidenziare eventuali problemi nella raccolta di queste informazioni, che l’analista riferisce a chi di competenza.\n In alcuni casi è lo stesso Data Analyst il responsabile della creazione e mantenimento dei database e quindi deve occuparsi anche delle relative attività di debugging per migliorare le procedure di raccolta, gestione e conservazione dei dati.\n Le tecniche di data visualization che spesso deve impiegare nel suo lavoro sono infatti molto utili per rendere i risultati comprensibili anche per gli utenti che non hanno skills tecniche.\n Qual è la soft skill più importante che deve possedere una Big Data Analyst?  Le soft skills per me più importanti sono:\n Avere capacità analitica; Essere curiosi; Essere determinati a trovare a tutti i costi una spiegazione ad ogni problema.  Queste qualità possono essere maturate con il tempo e l’esperienza, ma sono fondamentali per lavorare, specialmente in questo ambito.\n Quello che noti immediatamente quando inizi in un’azienda è distinguere ed evidenziare le persone che hanno queste qualità, che hanno successo in azienda e sono un punto di riferimento per tutti i colleghi e gli “esecutori”, ovvero le persone che non hanno piena coscienza in quello che fanno.\n Spesso ai colloqui mi chiedono se sono convinta di fare questo lavoro e se ho ben chiaro le attività che si svolgono al suo interno.\n In alcuni casi, infatti, questo lavoro viene giudicato pesante o “monotono”, ma il problema è sempre lo stesso: in qualsiasi lavoro che intraprendi se non inizi con la giusta motivazione lo trasformerai TU in abitudine e monotonia.\n Avere la giusta attitudine è importantissimo specialmente quando il lavoro richiede molta responsabilità e coscienza nelle proprie azioni.\n Quando tratti dei dati spesso ti trovi in ambiti bancari o contesti molto importanti. Quando sei all’interno di un progetto, nella maggior parte dei casi, il tuo obiettivo è creare una struttura e una logica adatta per estrapolare i dati nel modo più efficiente possibile.\n Ovviamente una volta creata la logica viene anche testata ed è qui che si mettono in pratica le tue doti: quasi sempre ti troverai davanti ad una estrapolazione che dovrai analizzare fino al singolo caso, e applicare nel modo corretto tutte le logiche necessarie ed ottenere il risultato voluto.\n In poche parole, si è sia sviluppatore che tester allo stesso tempo, quindi la responsabilità cresce al momento che non puoi rinviare delle fix e rilasciare delle logiche che già sai non sono corrette.\n Detto questo, chi vuole lavorare come Data Analyst deve prima avere una chiara visione del mondo in cui si sta approcciando e soprattutto essere consapevole di quanta responsabilità e capacità di ragionamento devono essere presenti nella tua quotidianità.\n In questo caso, il mio carattere sembra esser costruito per questo tipo di lavoro: tendo a fare le cose sempre in modo frenetico, e la mia apprensione dà quello sprint in più per creare più velocemente un’analisi. Cerco sempre di avere il controllo della situazione e avere coscienza di ogni mia azione.\n  Prima e dopo un\u0026rsquo;elaborazione mi domando sempre da dove e perché ottengo i dati che sto visualizzando.\n  Questa parte mi porta molto vantaggio competitivo nel mio lavoro ma in certe occasioni può mostrarsi d’intralcio quando non hai più la situazione più sotto controllo a ridosso di scadenze o continue richieste del cliente, che rimescola tutte le carte e crea quella confusione nella mia mente che rallenta tutto lo sviluppo.\n 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.  Più che fallimenti, durante il mio percorso professionale ho dovuto affrontare ostacoli che mi hanno aiutata a formarmi tecnicamente e soprattutto caratterialmente. Grazie a queste esperienze, ho trovato una consapevolezza che prima non avevo, forse per paura, o forse perché non riuscivo a superare quei limiti che a volte ci imponiamo inconsciamente.\n Anche quando pensiamo di trovarci davanti a situazioni difficili da risolvere, dobbiamo riuscire ad andare oltre e imparare a evolvere la nostra forma.\n Per quanto riguarda gli errori si dice sempre la stessa frase “chi non fa non sbaglia”, nessuno ti da in mano un manuale da seguire per non commettere nessuno sbaglio e fare un lavoro perfetto. Per arrivare più vicini alla perfezione bisogna sbagliare tanto e a meno che un giorno non verrà installata una CPU nella nostra mente continueremo a sbagliare.\n  Uno degli errori che ricordo è fidarmi delle indicazioni dei più esperti senza avere la consapevolezza di ciò che si sta facendo.\n  Un consiglio che mi sento di dare è: non sottovalutare mai la tua intelligenza a prescindere dalla seniority che hai o da quanto la situazione sia delicata, non aver mai paura di mettere in dubbio ogni cosa prima di premere il tasto invio.\n Come fare per diventare una Big Data Analyst? Qual è il tuo prossimo obiettivo?  Ho trovato per caso questo lavoro! Ho risposto ad un’offerta come back-office e invece mi sono ritrovata a creare store procedure in SQL e da lì ha avuto inizio il mio percorso. In questo tipo di sviluppo, a differenza di quello web, ci ritroviamo ad un livello più basso e quindi meno evidente e spiegabile a livello di business, ma fondamentale per creare qualunque software strutturato.\n Per quanto riguarda la formazione, scegliere delle facoltà come ingegneria informatica oppure statistica da una buona base per questo tipo di lavoro.\n Non ci sono ancora molti percorsi ufficiali che ti formano in modo completo per questo tipo di professione, per cui quello che può aiutare è fare diversi corsi incentrati sull’analisi dei dati e sui maggiori linguaggi utilizzati per l’ETL e il machine Learning, come SQL, Python o Pyspark, particolarmente utile per la gestione dei Big data.\n Il mio prossimo passo è studiare per approfondire sempre di più questa nuova tecnologia: la blockchain. In vista alle garanzie che sta dimostrando, penso che in futuro tutta la gestione dei dati che posseggono le aziende dovrà essere trasformata per essere più sicura ed efficiente.\n  Un dato di fatto è che i dati diventeranno la ricchezza di ogni azienda e questi stanno crescendo molto velocemente; questo significa che si creeranno un sacco di nuove posizioni come analisti o architetti di dati, i quali avranno il compito di sapere come gestirli al meglio.\n  Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema?  Su questo argomento posso parlare delle esperienze vissute in prima persona.\n Partiamo dal fatto che nonostante la mia giovane età, in tempi di scuola, l’informatica veniva ancora considerata come una materia frequentata da uomini.\n In tutta la scuola industriale su 600 alunni ho contato 5 ragazze (e purtroppo per la prima impressione ho dovuto accantonare il mio percorso per scegliere un ambiente più “vivibile”). Nel mondo del lavoro invece non importa l’età o l’azienda in cui sei, conta l’intelligenza delle persone che ti circondano in quel momento.\n Se sei circondata da persone che seguono una certa etica a lavoro, non sentirai mai nessun tipo di differenza, neanche generazionale. Il problema è individuare le persone che purtroppo non condividono gli stessi principi per poter lavorare nella giusta armonia e per non sentirti a disagio.\n L’unico modo per affrontare una serie di situazioni spiacevoli è saper reagire nel modo giusto e dimostrare con più determinazione il tuo valore.\n Grazie a Maria per aver raccontato la sua esperienza!\n Contatti  GitHub https://github.com/MariaPantone\nInstagram https://www.instagram.com/thinkbeforeudoing._/\n ", "url": "https:\/\/theredcode.it\/voglio-diventare-una...-big-data-analyst\/" }, "https:\/\/theredcode.it\/7-lezioni-di-vita-sul-machine-learning\/": { "title": "7 lezioni di vita sul machine learning", "tags": ["intelligenza-artificiale","machine-learning",], "content": "Gli algoritmi di apprendimento automatico possono riuscire ad eseguire attività importanti generalizzando dagli esempi. Questo è spesso più fattibile ed economico rispetto alla programmazione manuale di una serie di risoluzioni a dei problemi.\n Man mano che diventano disponibili più dati, è possibile affrontare problemi sempre più ambiziosi, e di conseguenza, l\u0026rsquo;apprendimento automatico è ampiamente utilizzato nei computer e in molti altri settori. Tuttavia, lo studio e lo sviluppo di applicazioni di machine learning di successo richiede una notevole quantità di \u0026ldquo;fede cieca\u0026rdquo; in certe situazioni difficile da imparare dai libri di testo.\n Tra tutte le frasi che ho sentito da quando lavoro, ecco 7 lezioni di vita sul machine learning con cui ti ritroverai a combattere prima o poi e che costituiscono delle vere e proprie best practices.\n I dati non bastano   Essendo la generalizzazione l\u0026rsquo;obiettivo, ne consegue che i dati da soli non siano sufficienti.\n So che sembra una notizia piuttosto deprimente: come possiamo sperare di imparare qualcosa, soprattutto su tematiche dove i dati sono scarsi e di bassa qualità?\n Fortunatamente, come la deduzione, anche l\u0026rsquo;induzione fa da leva: trasforma una piccola quantità di conoscenza in ingresso in una grande quantità di conoscenza come risultato. L\u0026rsquo;induzione è qualcosa di anche più potente della deduzione, perché richiede molta meno conoscenza di input per produrre risultati utili, anche se ha bisogno di una conoscenza superiore “allo zero”.\n Certo, può sembrare scontato affermare che per l’apprendimento è necessario avere a disposizione una “fonte di conoscenza”, ma è altrettanto vero che spesso il machine learning viene scambiato per qualcosa che ha della magia.\n Quello che l’apprendimento automatico fa è utilizzare i dati che ha a disposizione per cavarne qualcosa, così come nel mondo della programmazione o dell’agricoltura: la maggior parte del lavoro sta alla natura, ma ci vuole comunque la materia prima e servono gli agricoltori per aiutare i raccolti a crescere.\n Allo stesso modo, chi studia e lavora nel settore, combina la sua esperienza e conoscenza del mondo reale con le tecniche di machine learning, per estrarne una nuova forma di conoscenza.\n Machine learning = Loop Rappresentazione + valutazione + ottimizzazione   Tutti gli algoritmi di apprendimento automatico sono generalmente costruiti per mezzo della combinazione di 3 componenti, che vengono utilizzati come blocchi fondamentali durante una qualsiasi attività che usi tecniche di machine learning.\n Rappresentazione Esistono moltissimi algoritmi che sono a disposizione degli utenti che intendono approcciarsi a questo mondo; mentre però un classificatore viene definito in modo formale tramite diversi linguaggi di programmazione, sta all’utilizzatore finale la scelta di utilizzare l’uno piuttosto che l’altro a seconda del compito. Per scegliere esistono diverse tecniche, dove sicuramente prendere in considerazione le feature a disposizione è fondamentale.\n Valutazione è sempre necessario fornire una valutazione per distinguere i classificatori che hanno dato dei buoni risultati da quelli che hanno avuto un esito negativo. Esistono diverse funzioni anche interne agli algoritmi stessi, che però possono dare risultati diversi da valutazioni esterne, motivo per cui è sempre bene fare un raffronto oggettivo dei risultati ottenuti.\n Ottimizzazione  Completata la fase di valutazione, è molto importante utilizzare un metodo che permetta di imparare dagli errori: cercare tra i classificatori quello con il punteggio più alto non è sufficiente, ma bisogna esaminare attentamente le valutazioni effettuate e cercare di ottimizzare il più possibile l’output ottenuto.\n La scelta della tecnica di ottimizzazione è fondamentale per l’efficacia del risultato e aiuta anche a determinare se la soluzione prodotta ha più di un ottimo. Esistono anche in questo caso moltissime funzioni di ottimizzazione, dalle più standard alle sperimentali, ed è bene studiarne il funzionamento per comprenderne a pieno le potenzialità.\n Il fitting soffre di disturbo di personalità multipla   Cosa succede se gli input e i dati che abbiamo a disposizione non sono sufficienti (troppi o troppo pochi) a determinare completamente il classificatore corretto? Corriamo il rischio di rendere il classificatore uno strumento in grado solo di codificare stranezze casuali nei dati, adattandosi troppo alle conoscenze passate in input.\n Questo problema è chiamato overfitting ed è uno dei principali nemici dell\u0026rsquo;apprendimento automatico, tanto che chi ci inizia a lavorarci, teme di vedere valori come il 100% di accuratezza: questo valore è pressoché impossibile da ottenere, se non in casi di overfitting.\n Tutti nell\u0026rsquo;apprendimento automatico conoscono l\u0026rsquo;overfitting, ma la realtà è che si presenta in molte forme che non sono immediatamente ovvie: spesso si pensa che l’overfitting sia quando un valore viene sovrastimato, ma la realtà è che spesso si trasforma in underfitting.\n Un modo per comprendere l\u0026rsquo;overfitting è scomporre l\u0026rsquo;errore di generalizzazione in bias e varianza.\n Il pregiudizio o bias è la tendenza di un sistema o di una persona a imparare costantemente la stessa cosa sbagliata basandosi su esperienze “sbagliate”. La varianza è invece la tendenza ad apprendere cose casuali indipendentemente dal segnale reale.\n Ad esempio, gli alberi decisionali non hanno problema di bias perché possono rappresentare qualsiasi funzione booleana, ma d\u0026rsquo;altro canto possono soffrire di alta varianza.\n Tecniche come la convalida incrociata può aiutare a combattere l\u0026rsquo;overfitting, ma non è una panacea, dal momento che se la usiamo per fare scegliere troppi parametri, l’overfitting può verificarsi sotto forma di sovrastima.\n Oltre alla convalida incrociata, esistono molti metodi per combattere l\u0026rsquo;overfitting, ma la realtà è che esistono diversi fattori che vanno tenuti in considerazione, e purtroppo non esiste una pozione magica!\n La generalizzazione conta  L\u0026rsquo;obiettivo fondamentale dell\u0026rsquo;apprendimento automatico è generalizzare: questo vuol dire che dopo la fase di addestramento, l’algoritmo deve essere in grado di lavorare con input mai visti.\n Questo perché, indipendentemente dalla quantità di dati di cui disponiamo, è assai improbabile che vedremo di nuovo gli stessi esempi al momento del test; per questa ragione, solitamente si divide il dataset iniziale di modo che il sistema venga addestrato su una parte degli esempi a disposizione, per poi testarne il corretto funzionamento su un insieme di dati mai visto.\n Come dividere correttamente il dataset? Questo è un altro dei grandi dilemmi: i seguenti metodi di partizionamento dei dati sono stati suggeriti in diversi casi nella letteratura inerente il campo dell\u0026rsquo;apprendimento automatico.\n Una prima opzione prevede di suddividere in due parti il dataset originale, di cui quello per il training pari al 75% e il restante per la fase di test; altri suggeriscono anche di utilizzare il 70% dell\u0026rsquo;intero set di dati per la parte relativa al training, 15% per la convalida e 15% per il test.\n Personalmente credo che il metodo empirico per stabilire quale sia la cifra più adatta sia il migliore: mai andare sotto il 70%/30%, ma provare anche con un partizionamento pari a 80%/20% o intermedio per valutare le performance e stabilire quale offre prospettive migliori.\n Comprendere le feature Alla fine della giornata, alcuni progetti di apprendimento automatico hanno successo e altri falliscono. Cosa fa la differenza? Spesso il fattore più importante è rappresentato dalle funzionalità utilizzate. Se hai molte feature indipendenti che si correlano bene con la classe di apprendimento, allora l’attività sarà facile.\n D\u0026rsquo;altra parte, se la classe è invece rappresentabile tramite una funzione molto complessa, potresti non essere in grado di trarre dei buoni risultati. Per questo, analizzare a fondo i dati grezzi a nostra disposizione, facendo delle valutazioni e ipotesi iniziali, ci aiuta poi ad interpretare anche meglio il risultato ottenuto.\n In questo senso, l’intuizione, la creatività e un pizzico di esperienza fanno sì che questa parte del lavoro sia una delle parti più interessanti, perché ci rende degli investigatori dei dati, avendo sotto gli occhi un caso da risolvere, di cui non solo non conosciamo l’assassino, ma neanche il movente o l’arma!\n Per questo spesso mi sento dire: “Tutto qui?” quando ci si trova davanti ad un addestramento concluso e testato, dopo ore e ore spese a raccogliere dati, pulirli ed elaborarli opportunamente. Può sembrare assolutamente banale, ma queste fasi preliminari sono fondamentali, più dell’applicazione di algoritmi super complessi.\n Non fermarti alle apparenze (del modello)  Agli albori dell\u0026rsquo;apprendimento automatico, tutti avevano il loro algoritmo preferito, insieme ad alcuni motivi a priori per credere nella sua superiorità. Negli anni però, la maggior parte degli sforzi è andata a provare molte varianti degli algoritmi iniziali, mostrando che il miglior algoritmo varia da un\u0026rsquo;applicazione all\u0026rsquo;altra e che non ne esiste uno ottimale per ogni tipo di problema.\n Per questa ragione, prima di concludere per la strada più “comoda”, valuta anche alternative da mettere in coda per una valutazione complessiva, che ti permetterà di confermare o ribaltare totalmente il tuo giudizio.\n Più dati, migliori risultati Nella maggior parte dell\u0026rsquo;informatica, le due principali risorse in quantità limitate sono il tempo e la memoria. Nell\u0026rsquo;apprendimento automatico, ce n\u0026rsquo;è una terza: i dati.\n Questo è un dato di fatto che fino a qualche anno fa rappresentava un grande limite e spesso si sente dire che più dati si ha a disposizione, migliori saranno i risultati. Questo è vero, genericamente parlando: ripetiamo che l’overfitting è dietro l’angolo, quindi va sempre posta attenzione in questo senso.\n Soprattutto al giorno d’oggi che sono disponibili enormi quantità di dati e spesso non c\u0026rsquo;è abbastanza tempo per elaborarli, questi vengono utilizzati in maniera impropria.\n Questo porta a un paradosso: anche se in linea di principio più dati significa che si possono produrre risultati anche per situazioni più complesse, in pratica si finisce per usare gli algoritmi più semplici, perché quelli complessi richiedono troppo tempo per digerire grandi moli di dati ed elaborarli.\n Di norma infatti vale la pena provare prima gli algoritmi più semplici, come ad esempio Naive-Bayes prima della regressione logistica, K-Means prima delle SVM. Spesso gli algoritmi più sofisticati rappresentano un’alternativa molto attraente, ma di solito sono più difficili da usare, perché hanno più parametri da gestire e anche una complessità intrinseca che rende il risultato non all’altezza delle aspettative o delle tempistiche.\n Conclusioni Le informazioni e le pratiche viste sono molte, ma fanno parte di un prontuario all’uso che consiglio di tenere sempre a portata di mano: spesso si incappa in “meccanismi” che ci fanno restare nella nostra comfort zone e che ci portano nella direzione sbagliata.\nRicordare che alcuni degli stereotipi con cui ci scontriamo e scontreremo ogni giorno sono, appunto, stereotipi, ci aiuta a mantenere il focus e cercare di migliorarci ogni giorno, grazie anche all’esperienza di chi, prima di noi, ci ha sbattuto la testa!\n", "url": "https:\/\/theredcode.it\/7-lezioni-di-vita-sul-machine-learning\/" }, "https:\/\/theredcode.it\/voglio-diventare-un...-javascript-developer\/": { "title": "Voglio diventare un... Javascript Developer", "tags": ["javascript","voglio-diventare",], "content": "Patryk è un ragazzo con un senso dell\u0026rsquo;umorismo molto spiccato ed è anche molto attivo sui social, tanto da aver creato una community per devs su Telegram (link al gruppo) con oltre 900 membri che ogni giorno mantengono super attiva la chat!\n Non solo: mantiene ben aggiornato il suo profilo GitHub, su cui è possibile trovare moltissimi template pronti all\u0026rsquo;uso sui framework più vari (e non è cosa da poco), a cui dedica moltissimo tempo, perché crede molto nella filosofia del software open source.\n Parliamo allora di come diventare un Javascript Developer attraverso la sua esperienza!\n Descriviti in 100 parole  Uno sviluppatore, povero, che vuole diventare ricco creando software gratis e open source. Questo mi descrive molto bene.\n Sono nato come linuxaro, appassionato delle community dove tutti danno/ricevono qualcosa gratis per il mero gusto di imparare e accrescersi come persone.\n Molti si dimenticano che l\u0026rsquo;informatica è una scienza e, senza l\u0026rsquo;open source, questa sarebba ancora ferma a processori i386, 512kb di ram e, probabilmente, al Pascal o Cobol.\n Sono una persona che si batte affinché questa cosa non venga dimenticata, perché è importante aprire un proprio business, fare soldi con le app e l\u0026rsquo;informatica (non siamo la caritas) ma, se possibile, contribuire con l\u0026rsquo;open source per non tornare al medioevo o arrivare ad uno stallo dell\u0026rsquo;evoluzione tecnologica. Facciamolo!\n  In cosa consiste il ruolo di Javascript developer?  Una volta, ho letto la bio di un ragazzo americano su Twitter che recitava \u0026ldquo;Javascript artist\u0026rdquo;: a quel tempo c\u0026rsquo;erano tanti problemi con Internet Explorer e lui supportava i suoi applicativi e snippet fino a IE6.\n Questa cosa mi ha sempre affascinato e, per un periodo, anche io mi sono etichettato così. 15 anni fa il Javascript developer era quello che lottava contro Internet Explorer, oggi è quello che spera che domani non esca un nuovo framework da imparare che sia uguale ai 10 precedenti.\n Javascript è un linguaggio molto vecchio che ha avuto un\u0026rsquo;evoluzione e una crescita praticamente nulla fino al 2014, dal 2015 in poi praticamente è impossibile stare dietro alla sua evoluzione, perché stanno provando ad aggiustare tutto ciò che è stato fatto male, visto che i browser supportano solo quello. Io, in breve, faccio questo di lavoro: provo a sopravvivere.\n Mi occupo di vari progetti in una società basata sull\u0026rsquo;open source, dove si sviluppa e usa prevalentemente questo tipo di approccio.\n A volte sono team leader e gestisco piccoli team di 4-5 persone, a volte lavoro da solo, altre invece aiuto colleghi con \u0026ldquo;roba legacy\u0026rdquo; su cui non c\u0026rsquo;è budget ma va mantenuta.\n In breve, non per vantarmi, ma faccio il super eroe! Scherzo, ovviamente, sono un developer come tanti che ha passione per questo lavoro che, se sei fortunato, consiste nel creare cose belle e user friendly sul web.\n Qual è la soft skill più importante che deve possedere un Javascript developer  Spoiler: la pazienza. A differenza di altri linguaggi di programmazione, quello del Javascript developer è in assoluto quello che ti farà dire più volte \u0026ldquo;non funziona mai niente\u0026rdquo;.\n Per quanto sottovalutato e sminuito, perchè esistono framework e miliardi di librerie (basta guardare npm dove trovi di tutto), molto spesso i pezzi non si incastrano mai come dovrebbero.\n I meme sul CSS si sprecano: basta un margin fuori posto o una scrollbar che appare dal nulla che si rompe tutto e sviluppare responsive non è mai una cosa così scontata, visto che molti grafici/designer si aspettano determinati risultati e posizioni che non riesci a rispettare (ancora oggi trovi difficoltà a fargli capire che lo spazio è quello e se sei andato a capo con un elemento è perchè non entrava).\n Dall\u0026rsquo;altra parte sei un full-stack che può passare da back-end, frontend o creare app mobile/desktop usando sempre Javascript : sei una macchina super flessibile quando impari a padroneggiare Javascript e non è una visione da sottovalutare che altri linguaggi non possono permettersi.\n 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.  Il mio ex capo diceva \u0026ldquo;chi non sbaglia mai, non lavora\u0026rdquo;. Siamo umani. A me è capitato di eliminare un intero database di produzione di un mio progetto, pubblicare per sbaglio un dato sensibile degli utenti al posto del loro username (sbagliando il nome della variabile).\n Posso anche vantarmi di aver distrutto l\u0026rsquo;intera SEO di un sito cambiando le url delle pagine e non mettendo redirect 301 a quelle nuove (ma come? Google non è così intelligente? ASSURDO).\n Al lavoro mi è successo anche di fidarmi di alcune persone, scoprendo che mi facevano fare cose non preventivate dal mio capo e che poi non ci furono pagate, perchè ingenuamente pensavo \u0026ldquo;si si ti aiuto io\u0026rdquo; ma nel mondo business le feature si pagano (\u0026hellip;e io che pensavo fossimo un team, tutti uniti per arrivare all\u0026rsquo;obiettivo).\n Non abbiate paura di sbagliare: pure Google ogni tanto va down.\n Come fare per diventare un Javascript developer, e q****ual è il tuo prossimo obiettivo?  Javascript, a differenza di altre realtà (oracle, mongodb, atlassian, android e ios), non ha certificazioni valide, non esiste un ente vero e proprio che rilascia certificazioni al riguardo. Io in genere consiglio \u0026ldquo;Eloquent Javascript\u0026rdquo; per iniziare, libro in PDF(in inglese), fatto molto bene.\n A seguire, tutte le risorse online sono valide, ognuno scelga il percorso che preferisce: università, corsi online a pagamento, Udemy, fare esperienza da autodidatta. Non c\u0026rsquo;è un percorso migliore di un altro, ma bisogna tener conto di alcune cose mentre si studia: la famosa \u0026ldquo;roba legacy\u0026rdquo;.\n Studiare jQuery, ad esempio, è controproducente perchè con i framework attuali e nel mondo business non si usa più, quindi seguire una strada sbagliata nello studio può portare ad essere un Javascript developer obsoleto alla nascita, nello stesso tempo ti potrà capitare di fixare o trovare snippet in jQuery che dovrai modificare o adattare ad esempio a React: è il cane che si morde la coda.\n Non invidio chi inizia a studiare oggi Javascript , è un inferno, ma quando riesci domare le fiamme non ti sembrerà così brutto.\n  Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema?  Si, ma sarò molto schietto e diretto: al lavoro per me sono tutti uguali, che siano uomini, donne, gay, cani, manager\u0026hellip;\n Bisogna lavorare per raggiungere l\u0026rsquo;obiettivo e vincere sul progetto di cui si sta facendo parte. Non mi rivedo neanche nel discorso del salario minore: in confronto ad alcuni colleghi uomini dello stesso livello, io prendo meno di RAL, così come alcune colleghe donne prendono più di me e altre meno di me.\n Secondo me, molto lo fa il modo di vendersi. Concludo dicendo che le donne sono molto poche in questo settore, quindi è difficile fare una statistica corretta su qualsiasi punto di vista, ma nel mio mondo lavorativo l\u0026rsquo;unica lamentela che ho ricevuto è stata non aver notato che una mia collega si era fatta i capelli rosa e ci ha tenuto il muso tutto il giorno\u0026hellip; ce lo siamo meritati!\n Fossero questi i problemi del gender gap, sarebbe effettivamente un mondo migliore.\n  Ti potrebbero piacere anche\u0026hellip;\n- Voglio essere un Senior back-end developer;\n- Voglio essere un Senior Software developer;\n", "url": "https:\/\/theredcode.it\/voglio-diventare-un...-javascript-developer\/" }, "https:\/\/theredcode.it\/aws\/hosting-con-aws\/": { "title": "Hosting con S3 e Route 53 per Angular", "tags": ["angular","aws",], "content": "Immaginiamo di avere a disposizione una webapp in Angular e di volerla mettere online: come fare, spendendo meno di dieci euro l’anno?\n Vediamo com’è possibile avere un hosting con S3 e Route 53 per Angular!\n Requisiti: Un dominio; Una webapp in Angular (o anche React.js, Vue.js o Ionic); Un account su AWS  Build del progetto  Per questo esempio, andremo ad utilizzare un template che troviamo sul repository https://github.com/creativetimofficial/now-ui-kit-angular e che offre una webapp con diverse dashboard che possono fungere da gestionale per diversi scopi.\n Per poter utilizzare questo progetto all’interno del nostro bucket, ossia il contenitore del servizio S3 di Amazon che ospiterà il nostro sito, abbiamo bisogno di creare una versione di distribuzione dell’applicazione.\n Andiamo quindi ad eseguire il comando ng build all’interno del progetto e prendiamo come riferimento la cartella dist/ che verrà creata al termine dell’esecuzione di questo comando.\n Generazione della versione di distribuzione per Angular\n Il contenuto della cartella dist/ è proprio quello che ci serve. Teniamo aperta questa scheda e proseguiamo!\n Cartella dist/\n Configurazione del bucket con S3  A questo punto, andiamo a creare il bucket che ospiterà la nostra webapp: tramite la barra di ricerca, cerchiamo il servizio S3 e clicchiamo sul pulsante “Crea Bucket”:\n Creazione bucket su S3\n  Come prima cosa, inseriamo il nome del bucket. In questo caso, lo chiameremo esattamente come il dominio che dovremo andare a configurare, per esempio mymanagement.it. Lasciamo la regione impostata sul territorio europeo e proseguiamo.\n Nella sezione successiva, ci viene dettagliato il funzionamento del blocco degli accessi al bucket: chiaramente, questo blocco verrà rimosso nel momento in cui il nostro sito andrà online, ma per il momento lasciamolo attivo finché la configurazione non è ultimata.\n Molto utile è il versionamento del bucket: ci permette di tenere in canna le diverse versioni di ciò che andremo a caricare al suo interno, per poter eventualmente tornare indietro se qualcosa andasse storto.\n Versionamento del bucket\n Clicchiamo su “Crea bucket” in fondo e proseguiamo.\n Fatto questo, ci verrà mostrato il riepilogo dei bucket: clicchiamo su quello appena creato ed entriamo al suo interno.\nRiepilogo del bucket\n Al momento il bucket è vuoto: lo andremo infatti a riempire con i file prodotti dalla build effettuata allo step precedente. Clicchiamo quindi su “Carica” e teniamo aperta la cartella che contiene tutti i file della webapp.\n Contenuto del bucket\n Caricamento oggetti nel bucket\n Trasciniamo tutti gli oggetti contenuti nella cartella dist del progetto all’interno della schermata della console di AWS e attendiamo il caricamento.\n Riepilogo dei file che verranno caricati\n A questo punto, possiamo cliccare su “Carica” in fondo alla pagina e attendere il caricamento di tutti i file all’interno del bucket.\n Una volta terminato, clicchiamo sul pulsante “Chiudi” in altro a destra e verremo riportati all’interno del bucket, dove potremo vedere tutto il contenuto della cartella dist/ riportato all’interno del bucket.\n Configurazione dell\u0026rsquo;hosting per siti statici\n A questo punto, è necessario verificare che tutto stia funzionando correttamente, prima di collegare il nostro dominio: infatti, dobbiamo attivare la funzionalità di hosting e verificare che il sito sia visibile correttamente.\n Per farlo, clicchiamo su “Proprietà” in alto e andiamo nella sezione “Hosting di siti web statici”, che al momento è disabilitato. Clicchiamo su “Modifica” e poi selezioniamo “Attiva”.\n In questo caso, le configurazioni di default sono sufficienti, quindi clicchiamo su “Salva le modifiche” e andiamo avanti!\n Configurazione dell\u0026rsquo;hosting per siti statici\n Fatto questo, verremo reindirizzati sulla pagina delle proprietà del bucket, e scorrendo verso il basso, vedremo che è stato creato un endpoint per la nostra webapp: se ci clicchiamo sopra, potremo visualizzare il nostro sito sfruttando AWS…\n Errore di permessi\n Cos’è successo? Abbiamo ancora attivo il blocco dell’accesso pubblico: andiamo quindi sul tab “Autorizzazioni” e clicchiamo su “Modifica” nella sezione dedicata al blocco.\n A questo punto, deselezioniamo l’opzione principale e clicchiamo su “Salva le modifiche”:\n Configurazione dell\u0026rsquo;accesso al bucket\n Non basta: infatti, i nostri file non sono stati ancora resi “pubblici”. Per farlo, clicchiamo sul tab “oggetti” e selezioniamo tutti gli oggetti presenti all’interno del bucket. Clicchiamo poi su “Operazioni” e selezioniamo “Rendi pubblico”.\n Conferma della configurazione dell\u0026rsquo;accesso\n Torniamo quindi all’endpoint di prima e aggiorniamo la pagina: finalmente la nostra webapp è online!\n Homepage della webapp Angular\n Questa è la situazione ideale se abbiamo bisogno di mostrare a qualcuno il lavoro fatto in maniera facile e veloce. Se hai a disposizione un account gratuito di AWS, hai a disposizione 5GB di spazio per ospitare il tuo sito gratuitamente per 12 mesi.\n E se volessimo associare un dominio al nostro bucket? Vai col prossimo step!\n  Configurazione di Route 53  Nella barra di ricerca dei servizi, cerchiamo Route 53. Questo servizio ci permetterà di collegare il dominio a nostra disposizione con il bucket di S3 che ospita il nostro sito.\n Creiamo una cosiddetta “zona ospitata” cliccando su “Crea” e inseriamo tutte le informazioni richieste: in questo caso, la zona ci permette di definire la configurazione di come AWS dovrà gestire le richieste in arrivo per il nostro dominio.\n Creazione della zona tramite Route 53\n  Una volta cliccato su “Crea” in fondo, vedremo il riepilogo della zona: vengono creati di default due record, ossia un NS e un SOA. Nel primo caso, abbiamo un Name Server, ossia la definizione di quei server che comunicheranno le informazioni relative ai DNS per gestire il traffico in arrivo.\n Nel caso del record SOA, abbiamo al suo interno tutte le informazioni che riguardano la zona DNS, come il server principale, l’email dell’amministratore di sistema, e via dicendo. Si tratta infatti di tutte le informazioni di base del dominio.\n Record presenti di default nella zona alla creazione\n Questi due record non devono essere modificati per nessun motivo, anzi: il record NS ci sarà molto utile perché, a seconda di dove avremo registrato il nostro dominio, dovremo andare a specificare i diversi DNS riportati nella tabella al provider utilizzato.\n Per esempio, nel caso di Register.it, potremmo dover modificare i DNS di default in questo modo:\n Configurazione dei DNS su Register.it\n Attenzione: il cambio di DNS e quindi la messa online del sito dipende dalla velocità di propagazione delle informazioni relative ai DNS. Nel caso di Register.it, i tempi arrivano fino a 2 giorni!\n L’ultimo step da compiere dopo aver aggiornato i DNS, è quello di creare un record A: questo ci permetterà di instradare le richieste che arrivano al nostro dominio verso il bucket S3.\n Clicchiamo quindi su “Crea record” e selezioniamo come tipologia il record A: le altre impostazioni possono essere liberamente configurate a seconda delle esigenze.\nCreazione dei record su Route 53\n Nel giro di qualche minuto, sempre che i DNS siano stati aggiornati correttamente, il nostro sito sarà online.\n Ma parliamo velocemente dei costi: il costo è di 0.50 centesimi circa al mese:\nCosti di Route 53\n  Quindi, a conti fatti, abbiamo come spesa meno di un euro al mese, escludendo il costo del dominio, che in molti casi viene offerto gratuitamente per il primo anno.\n Non male, no?\n ", "url": "https:\/\/theredcode.it\/aws\/hosting-con-aws\/" }, "https:\/\/theredcode.it\/voglio-diventare...-un-senior-software-developer\/": { "title": "Voglio diventare... un Senior Software Developer", "tags": ["interviste","voglio-diventare",], "content": "Questa settimana diamo spazio ad un altro professionista del settore: Marco Breveglieri (qui il link al suo blog!) ci racconterà cosa vuol dire essere un Senior Software Developer e quali sono le esperienze che ha maturato finora, anche grazie al canale Twitch il cui nome è tutto un programma: Compila Quindi Va trasmette sessioni di live coding settimanali a tema programmazione web e non!\n Descriviti in 100 parole  Se l\u0026rsquo;abilità di Neo era quella di \u0026ldquo;vedere\u0026rdquo; il codice, il mio compito è quello di scriverlo, o almeno ci provo!\n  Mi definisco in generale uno \u0026ldquo;sviluppatore software\u0026rdquo;, nel senso che scrivendo codice cerco di dare vita ad applicazioni vere e proprie, sia per ambienti desktop o per dispositivi mobili, fino ad arrivare a servizi che girano in background.\n In ambito Web, lavoro sia sulla parte relativa al backend che al frontend di siti e applicazioni Web. Quello che imparo da queste esperienze, cerco di divulgarlo a livello professionale con corsi di formazione o, più recentemente, partecipando a community e facendo qualche “live”.\n In cosa consiste il ruolo di Senior Software Developer?  Partiamo dall’appellativo “Senior”: principalmente, serve a cercare di essere pagati di più, più di un Junior appunto\u0026hellip; Scherzo! 😉\n In realtà sta a indicare che sono un po’ più vecchio\u0026hellip; No, scherzo ancora (anche se un pochino è vero). 😁\n Semplicemente, cerco ogni giorno di mettere a disposizione le mie conoscenze nell’ambito dello sviluppo software e del coding, nella speranza che 25 anni di attività vogliano effettivamente dire qualcosa.\n Oltre a lavorare su progetti specifici della mia azienda (ABLS Team), mi offro anche come consulente esterno e sviluppatore “on demand” presso clienti, in outsourcing, entrando a far parte di altri team di sviluppo (di cui poi mi sento comunque parte integrante).\n Per consolidare le mie conoscenze e abilità poi, mi offro per corsi di formazione, organizzati in prima persona o tramite enti per fornire a chi richiede tutte le conoscenze indispensabili per poter fare la mia stessa attività. Credo fortemente che sarebbe bello se ci fosse almeno un developer in ogni tipo di azienda!\n Qual è la soft skill più importante che deve possedere un Senior Software Developer?  C’è una abilità, credo, che uno sviluppatore debba necessariamente avere, in quantità proporzionale alla propria maturità, senza però che questa lo faccia passare al Lato Oscuro di ogni “developer”, ovvero la cosiddetta Sindrome dell’Impostore, la cui caratteristica fondamentale è l’umiltà.\n Non so se sia il termine adatto, ma piuttosto che farsi sottomettere in ogni occasione dalle persone che abbiamo di fronte, è bene avere la capacità di confrontarsi con chiunque in merito a questioni tecniche esponendo con calma e tranquillità il proprio parere, soprattutto motivandolo, senza sovrastare l’altro.\n Questo a mio avviso crea le condizioni affinché il proprio parere venga raccolto senza pregiudizi che non siano tecnici, ponendo l’interlocutore in condizioni di assorbirlo ma anche, se vuole, di contestarlo.\n In breve, si escludono tutte quelle intollerabili situazioni (quasi simili a quelle che si creano nel rapporto tra adolescenti e genitori) del “sono più vecchio (quindi più esperto) di te”, che possono fare anche molto male quando alla fine di una lunga discussione si scopre, dall’alto della propria “seniority”, di avere torto marcio. 😅\n Racconta il tuo più grande fallimento da quando lavori nel settore, che però ti ha reso ciò che sei.  Potrei citarne più di uno, ma in realtà tutti i fallimenti di cui ho memoria avevano una radice comune: l’assenza di una precisa organizzazione dell’attività di sviluppo, una abilità che solo con il tempo e l’esperienza si può maturare, e su cui non ho mai smesso di lavorare perché credo che in quell’ambito non riuscirò mai a raggiungere la perfezione.\n Mi riferiscoin particolare a tutte quelle abilità che girano attorno a una corretta pianificazione e stima delle complessità, al dare il giusto equilibrio tra precisione nella realizzazione tecnica (soprattutto nella scrittura del codice) che va controbilanciata con il rilascio della funzionalità richiesta (dove spesso questo aspetto non è visibile).\n Io purtroppo sono un perfezionista, e questo da un lato tende ad allungare i tempi e ad aumentare l’impegno necessario a raggiungere un risultato; per contro, essendo sicuro dei miei mezzi, ottimista e modestamente capace in alcuni ambiti, riesco nella maggior parte dei casi a uscirne portando a casa entrambe le cose, ma non senza correre pericoli.\n Come fare per diventare Senior Software Developer  La mia filosofia assomiglia un pochino a quella di Auguste Gusteau, lo chef di Ratatouille, riguardo la cucina: “chiunque può programmare”.\n  Quando leggo questa domanda all’interno di gruppi e forum di discussione, spesso vedo il discorso vagare tra diversi estremi: chi suggerisce come imprescindibile un percorso universitario, chi lo sconsiglia e suggerisce basti un corso di pochi giorni, chi invece ritiene servano mesi ma solo per una conoscenza di base, chi distoglie l’interessato dal suo proposito tracciando scenari infausti, paghe da fame e altri eventi tragici.\n A mio avviso, è impossibile dare una risposta precisa, soprattutto quando non si conosce la persona che si ha davanti, quanto è convinto del percorso che vuole intraprendere e cosa è disposto a fare per raggiungere i propri obiettivi.\n È ovvio che l’esperienza pluriennale conta, ma io penso che, usando determinati linguaggi e tecnologie, lo sforzo necessario per poter raggiungere un risultato proficuo, ossia produrre qualcosa che abbia un valore (per sé, per la propria azienda o per un ipotetico cliente) in termini di software non sia così elevato una volta che si sono apprese le tecniche fondamentali, purché si abbia un certo talento personale e un interesse reale verso questa disciplina.\n Parlando di successi, qual è il tuo prossimo obiettivo?  Da quando ho iniziato a scrivere codice, ho sempre pensato che avrei finito i miei giorni facendo questa attività. Tralasciando discorsi macabri e fatalisti, diciamo che la programmazione riserva ogni giorno sempre nuove sorprese: nascono continuamente nuove tecnologie, framework, librerie, strumenti e metodologie che richiedono un aggiornamento costante.\n Detto questo, da qui ai prossimi tre anni vedo me stesso ricoprire sempre il medesimo ruolo, ma non come una nostalgica cozza incrostata che si aggrappa passivamente al proprio scoglio, bensì come un professionista che giorno dopo giorno migliora i propri difetti, consolida le proprie conoscenze e riesce ad essere un Senior Developer sempre più “Senior” e sempre più “Developer”. 😄\n Oggi come oggi, mi accontenterei di riuscire ad avere più tempo di fare un maggior numero di live sul mio canale Twitch (https://www.twitch.tv/compilaquindiva), possibilmente con meno imbarazzo e più spigliatezza. 😉\n Conosci il tema gender gap in ambito STEM? Se sì, cosa puoi fare nel tuo piccolo per combattere questo problema?  Sin dai tempi scolastici, scegliendo un percorso specificatamente orientato al mio attuale lavoro, proseguendo poi nei primi incarichi come dipendente, mi sono trovato in luoghi dove la presenza maschile era in netta prevalenza. Parliamo degli anni attorno al 2000.\n Oggi lo scenario mi sembra stia cambiando, o quantomeno vedo un crescente coinvolgimento del genere femminile, specie nel ramo della programmazione front-end, ed è ironico perché vedendo alcune “stranezze” del linguaggio JavaScript nello specifico, viene naturale pensare che “solo un uomo possa aver creato una robaccia del genere”.\n Ovviamente la mia esperienza aneddotica non è un dato considerabile come campione, e se questo discorso emerge ancora, allora do per scontato che il problema sussista e abbia sempre più bisogno di una soluzione urgente.\n Ho iniziato recentemente a interessarmi alle questioni legate al genere in senso generale e non necessariamente legato all’ambito STEM, e credo che non vi sia assolutamente nulla di precluso a un genere o un altro, tantomeno nell’ambito informatico, e che le capacità di ciascuna persona prescindano completamente da esso.\n La prima cosa che intendo fare per combattere questo problema è innanzitutto informarmi su ciò che evidentemente ancora non conosco a riguardo del fenomeno; in seguito, in base a questo, credo sia giusto promuovere e condividere tutto ciò che possa essere utile per mitigarlo e portarlo progressivamente all’annullamento, poiché credo che nell’ambito dello sviluppo software e in tutto ciò che vi ruota attorno vi sia bisogno dell’apporto di chiunque, e tanto maggiore è la diversificazione in termini di genere, pensiero e talento, meglio è!\n Un enorme grazie a Marco per il suo tempo e per aver condiviso le sue esperienze!\n", "url": "https:\/\/theredcode.it\/voglio-diventare...-un-senior-software-developer\/" }, "https:\/\/theredcode.it\/il-futuro-della-open-innovation\/": { "title": "Il futuro della open innovation", "tags": ["open-innovation","recensione",], "content": "L’estate significa più lavoro, ma anche più tempo libero: aver dedicato gran parte del tempo a disposizione per un po’ di sano “retreat” è stato fondamentale, e tra le molte cose che sono riuscita a fare, c’è stato tempo per leggere…. per cui, partiamo da qui: ecco la recensione de “Il futuro della open innovation” di Henry Chesbrough.\nRecensione  Inizio con il dire che sicuramente non è una lettura per tutti: il testo è improntato -chiaramente- sul business model adottato da molte aziende relativa alla loro esperienza nell’adottare una strategia di open innovation.\n Vengono portati in esame diversi casi di studio con protagonisti anche molto conosciuti, tra cui Procter\u0026amp;Gamble, Intel e la Royal Bank of Scotland, dove non sempre strategie di open innovation hanno portato a risultati positivi.\n  Interessante infatti come l’autore analizzi cosa c’è dietro all’adozione di questo modello: l’open innovation è un processo lungo e tortuoso, che può dover affrontare ostacoli di diverso tipo, che a volte portano a situazioni fallimentari.\n L’iniziativa Smart Villages portata avanti in India, per esempio, ha costituito una vera e propria rivoluzione per una porzione di paese che altrimenti avrebbe continuato a convivere in una situazione di totale povertà.\n Fornendo dei sostegni allo sviluppo, come nuove competenze, prevedere progetti e programmi di aiuto a lungo termine o ancora creare comunità dove l’innovazione viene disseminata e condivisa, l’impatto ottenuto è enorme: grazie all’attenzione data alla formazione dei villaggi, questi sono arrivati a raggiungere risultati impensabili.\n Nel link riportato qui ci sono moltissime informazioni su come il progetto è stato articolato e sui benefici apportati alla comunità: se pensiamo che in Occidente manovre simili sono considerate “il minimo sindacale per il raggiungimento della civiltà”, in paesi come l’India sono necessari per lo sviluppo stesso della civiltà.\n L’ottavo capitolo è quello più interessante: sono riportati i casi di studi delle aziende citate precedentemente con le relative esperienze e soprattutto una sezione alla fine di ogni caso con le “lezioni apprese” da queste aziende, positive e non.\n Questo esempio di struttura permette di analizzare caso per caso e vedere che non c’è una ricetta magica in cui l’open innovation porta al successo, ma piuttosto ci sono diverse strategie da attuare che fanno riferimento ad un’unica filosofia e che vanno poi adattate al contesto.\n La strategia outside-in è quella che statisticamente ha avuto più successo: molte aziende infatti sviluppano delle soluzioni o portano avanti dei progetti in maniera totalmente “segreta” per evitare che queste idee fuoriescano e che qualcuno realizzi la stessa idea prima o meglio.\n Alcune delle idee che questo approccio suggerisce sono infatti basate sul concetto che le conoscenze esterne sono importanti tanto quanto quelle interne: se un’azienda ha bisogno di realizzare un prodotto che magari già altri hanno realizzato, perché perdere tempo a reinventare la ruota? Vale la pena inglobare l’idea, e magari adattarla alle proprie esigenze di business.\n Spesso dietro a tanta reticenza c’è il problema della proprietà intellettuale: si tratta di un lavoro importante e molto complesso, per cui questa non deve costituire un limite, ma piuttosto un incentivo (se ti interessa approfondire, dai un\u0026rsquo;occhiata al libro di Simone Aliprandi sulle licenze software!).\n  Se un’azienda porta avanti, grazie al suo reparto di R\u0026amp;S, delle idee che si rivelano positive per il business model aziendale, è possibile anche esternare queste conoscenze, senza poi perderne il “controllo”, ma anzi, crescendo anche grazie agli utilizzatori esterni.\n Il riconoscimento sociale è fondamentale, ma non sufficiente, soprattutto se parliamo di un’azienda privata: “l’ho fatto io” non basta, ma bisogna anche giustificare in qualche modo gli investimenti atti al raggiungimento di una certa soluzione.\n In questo senso, garantire qualche grado di protezione, come tramite un sistema di licenze, è importante per garantire un successo anche in termini di investimento economico e di tempo speso per lo sviluppo dell’idea.\n Interessante, in questo senso, il caso della NASA, che ha sollecitato diversi aiuti esterni per assicurarsi di affrontare nel modo migliore la progettazione di voli spaziali con equipaggio umano: il contributo ottenuto è stato risolutivo per prevedere le eruzioni solari con l’aiuto di un algoritmo, così da evitare l’esposizione dell’equipaggio alle pericolose radiazioni solari.\n  Un laureato in previsioni meteorologiche risolse il problema, fornendo un algoritmo che garantiva una finestra temporale di 24 ore rispetto alle predizione: un risultato incredibile e raggiunto grazie ad un contributo esterno alla NASA.\n In conclusione: questo è un saggio che molte aziende che hanno voglia e bisogno di crescere dovrebbero leggere, per apprezzare a pieno l’approccio all’open innovation e per ricordarsi e ricordare anche agli altri che non tutte le idee considerate “originali” sono idee che portano al successo, ma che, anzi, spesso hanno bisogno di uscire per poterne apprezzare le potenzialità.\n Inoltre, un approccio che sia outside-in o inside-out, aiuta l’azienda a investire in pretotipi o soluzioni che, tramite tempi e costi ridotti, possono più facilmente essere utilizzati all’interno del processo aziendale.\n Lezione imparata L’open innovation funziona grazie alle persone; Per adottare questo approccio, ci deve essere collaborazione: ci vogliono persone disposte a collaborare fianco a fianco con quelle dell’azienda che condivide con voi la conoscenza, e per farlo ci vogliono dipendenti di talento dell’azienda stessa; Boundary-spanning: persone che sono in grado di accedere a fonti di conoscenza diverse e di combinarle insieme per ottenere un processo innovativo, avendo il ruolo di collegare le reti interne dell\u0026rsquo;organizzazione con fonti esterne di informazioni. Quotes Un requisito da soddisfare per una disseminazione e assimilazione delle nuove conoscenze è l’esistenza di un reparto di ricerca e sviluppo interno.\nUn’impresa può riuscire a fare proprie le conoscenze esterne quanto basta a utilizzarle solo se dispone di una certa quantità di mordente creativo e può lasciare alle persone che lavorano sulle nuove conoscenze il tempo necessario ad applicarle insieme.\n  Potrebbe piacerti anche.. Recensione di Pretotype it Recensione di Big Data Analytics Recensione di Software Licensing e data governance ", "url": "https:\/\/theredcode.it\/il-futuro-della-open-innovation\/" }, "https:\/\/theredcode.it\/tags\/open-innovation\/": { "title": "open-innovation", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/open-innovation\/" }, "https:\/\/theredcode.it\/tags\/recensione\/": { "title": "recensione", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/recensione\/" }, "https:\/\/theredcode.it\/categories\/recensione\/": { "title": "recensione", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/recensione\/" }, "https:\/\/theredcode.it\/voglio-diventare-un-senior-back-end-developer\/": { "title": "Voglio diventare un… Senior back-end developer", "tags": ["interviste","voglio-diventare",], "content": "Iniziamo questa serie con un\u0026rsquo;intervista ad Andrea Carratta, senior back-end developer e professionista freelance (piuttosto attivo su LinkedIn) e che porta avanti un suo blog a tema C# e cloud Azure!\n Andrea Carratta in 100 parole.  Mi chiamo Andrea e da quasi due mesi ho scollinato nei quaranta. Fermandomi un attimo a riflettere ho trascorso più di metà vita su diversi backend e non potrei chiedere di meglio! Come ho scritto nel mio profilo Linkedin, \u0026ldquo;Il mio spirito si nutre di pizza \u0026amp; backend\u0026rdquo; e posso solo sperare nel futuro.\nL\u0026rsquo;Andrea non programmatore ama lo sport. Ho superato le cinquanta maratone (comprese le ultra) ed ho fatto tre IronMan (l\u0026rsquo;ultimo nel 2014). La combo \u0026ldquo;Sport \u0026amp; Coding\u0026rdquo; mi aiuta moltissimo e se non ci fosse stata da quando ho cominciato a lavorare non sarei quello che sono ora.\n In cosa consiste il ruolo di senior back-end developer?  Per definirmi al meglio vorrei usare l\u0026rsquo;espressione utilizzata da un PM durante una valutazione: Andrea è un programmatore da sgabuzzo! Lavoro in team, ma programmo ancora meglio chiuso nel mio angolino (=sgabuzzo) dove riesco a gestire il tutto tra codice, pause bagno meditative (non negate di andare in bagno solo per cambiare aria sperando nell\u0026rsquo;”idea del giorno” che non vi credo) e vita privata. Questo non vuole dire fare quello che si vuole, sia ben chiaro!\n Provo a spiegarvi cosa faccio in poche parole. Il progetto su cui lavoro dal 2018 è in ambito Big data per una startup America che opera a livello mondiale. Si tratta di acquisire dati da attori diversi, validarli, processarli, aspettare eventi esterni ed infine computare i risultati.\n Orchestrare processi tra diverse piattaforme (webhook, API, trigger, ecc.) è un lato del progetto che adoro davvero tanto. Non è per nulla semplice e credo di poterlo definire il mio cavallo di battaglia, soprattutto viste le attività svolte in questo ambito durante anche mesi e mesi di sviluppo.\n Vedere i dati che si muovono secondo una precisa orchestrazione è un qualcosa che riempie gli occhi di lacrime e ti fa battere forte il cuore.\n Qual è la soft skill più importante secondo te?  La soft-skill che preferisco e reputo importante durante la mia attività lavorativa? Essendo freelance credo che la mia soft-skill preferita sia sapere organizzare il tempo. Il fatto che il 90% del mio lavoro sia in \u0026ldquo;orario di ufficio\u0026rdquo; pur lavorando full remote non vuole dire che non bisogni sapere gestire l\u0026rsquo;elemento tempo.\n Quando fare uno sviluppo?\nQuando rilasciare uno sviluppo?\nCome si incastra nel progetto?\nRiuscirò a rispettare la consegna?\n Non dobbiamo dimenticare una cosa importantissima: anche se i meme sui programmatori dicono che non abbiamo una vita, bisogna tenere conto dei nostri impegni personali.\n Personalmente reputo che il concetto delle otto ore di lavoro sia antico e da superare, se non dimenticare. Gestire il proprio tempo in questo lavoro significa anche lavorare avendo ben in mente l\u0026rsquo;obiettivo.\n Uscire a correre in pausa pranzo e quel giorno lavorare mezz\u0026rsquo;ora meno non vuol dire essere lavativi. Sapere concentrarsi e chiudere il task è indice di professionalità. Tutto ha una seconda faccia della medaglia!\n Per la stessa regola sappiate che succede anche di non andare a correre in pausa pranzo, mangiare un qualcosa al volo davanti al monitor e sviluppare sino a tardi per chiudere in tempo.\n Per quanto riguarda l\u0026rsquo;ultima domanda che ho posto \u0026ldquo;Riuscirò a rispettare la consegna?\u0026rdquo; Non ho mancato una consegna in vent\u0026rsquo;anni per colpa mia. Quindi sì, credo di saper gestire il tempo sia professionalmente che intrecciandolo alla mia vita privata!\n 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.\n Racconta il tuo più grande fallimento  da quando lavori nel settore, che però ti ha reso ciò che sei.\n Partiamo da un presupposto molto chiaro. Chi dice di non avere avuto fallimenti clamorosi non si è realmente sporcato le mani come si deve a mio avviso. La domanda è molto chiara: “racconta il tuo più grande fallimento”. Io vorrei raccontarne due. Uno riguarda l\u0026rsquo;ambito professionale/ carriera e l\u0026rsquo;altro riguarda il punto di vista tecnico. Dovendo sceglierne uno ho deciso di raccontare solamente il primo.\n Continuo a pensarci e non riesco a darmi una giustificazione sensata e razionale. Ho \u0026ldquo;sprecato\u0026rdquo; anni su un progetto che non mi stava dando più nulla se non noia. Quando ho cominciato ad avvertire il disgusto di aprire il portatile la mattina per accenderlo ho capito che qualcosa non andava.\n Ho cominciato a mandare via CV e dopo una serie di colloqui sono riuscito ad uscire da quella \u0026ldquo;black box\u0026rdquo; (che personalmente la immagino come un /dev/null per capirci). Di recente un ragazzo mi ha chiesto in privato \u0026ldquo;se dovessi dare un consiglio al te del passato di 10 anni fa, cosa gli diresti?\u0026rdquo;.\n Secondo voi, cosa posso avergli risposto? \u0026ldquo;Lo stesso consiglio che mi rimprovero di non avere applicato. Non hai firmato un patto di sangue su un progetto. Se non ti porta più nulla di interessante, guarda altrove\u0026rdquo;\n Alla fine, la parte più difficile è stata quella di dire \u0026ldquo;ciao, io voglio andare altrove\u0026rdquo; a me stesso rimettendomi in gioco. Purtroppo, avevo utilizzato poco Linkedin sino a quel momento e non ero visibile come ora. Aspettate, riformulo la frase.\n Anche adesso non ho un seguito esagerato, ma riesco ad essere trovato e contattato da nuovi clienti per nuovi progetti, e variare progetto, anche se per poco, aiuta. L\u0026rsquo;esperienza genera esperienza. Anche il rapportarsi con nuovi team aiuta a capire come vengono affrontati i progetti ed i costi.\n Non fatevi sfruttare. Non fatevi mettere in un angolino. Non fatevi dare lavori monotoni da copia ed incolla.\n Infine, e questa ve la scrivo separata perché merita una maggiore attenzione, NON fatevi sminuire e/o sottovalutare per quello che siete con \u0026ldquo;contentini\u0026rdquo; oppure con poca iniziativa personale.\n Se un team vuole un programmatore \u0026ldquo;CTRL+C \u0026amp; CTRL+V\u0026rdquo; ricordatevi: NON dovete essere voi!\n Come fare per diventare un senior back-end developer? Questo tema -anche da quello che leggo sui social- è parecchio discusso.\n Certificazioni? È dal 2018 che dico \u0026ldquo;adesso studio e provo a prendere la mia prima certificazione Microsoft\u0026rdquo;. Secondo voi come è andata? Ovviamente ho studiato ma non ho mai provato a fare delle simulazioni d\u0026rsquo;esame e tanto meno a prenderla. Eppure, lavoro quasi esclusivamente su Cloud Azure!\n Esperienze? Si, queste servono e tanto! Non cercate di \u0026ldquo;farla\u0026rdquo; troppo lontano. Cominciate con quanto alla vostra portata e poi aumentate. Aprire e/o cominciare con un progetto mostruoso non vi lascerà capire le cose come serve.\n Il backend a mio avviso è sentimento puro e odiarlo può essere facile soprattutto all\u0026rsquo;inizio. Ogni tanto ripenso ad alcuni progetti \u0026ldquo;datati\u0026rdquo; e mi domando: ora come l\u0026rsquo;avrei fatto? Sappiate che spesso (=sempre) la risposta è diversa dal progetto svolto.\n Volete sapere cosa vi serve davvero per imparare a crescere in questo mondo?\n - BUG\n- Crollo delle performance\n  Scrivere del codice è facile (circa).\nScrivere IL codice è difficile.\n  Ragazzi, diciamola tutta\u0026hellip; Quando ho cominciato programmare non era come adesso. Ho cominciato con ASP3.0 e, se volete cercare della documentazione, fate pure. Avete idea di cosa voleva dire sviluppare agli inizi del 2000? Niente NuGet e la ruota andava inventata ogni volta.\n Mi sento privilegiato ad avere cominciato in quel momento. L\u0026rsquo;esperienza fatta per scrivere determinate funzionalità ora vi manca in quanto integrata o nei framework o nei NuGet. Volete crescere? Provate a titolo di studio a non usare nulla di pronto \u0026hellip;\n Parlando di successi, qual è il tuo prossimo obiettivo? Quale ruolo vorresti ricoprire entro i prossimi 3 anni?  Come mi vedo da qua a tre anni? Personalmente spero di continuare ad abbronzarmi con la luce da monitor emessa da Visual studio (tema dark) aperto.\n Il grande dilemma che mi pongo spesso è il seguente: in che ambito vorresti programmare? Pensando a questo penso di volere cambiare (o almeno introdurre) ambiti diversi.\n Lavorare con i Big Data è davvero stimolante, ma mi piacerebbe avviare sviluppi in altri ambiti.\nQuali? Al momento ho due filoni nella mia mente: AI \u0026amp; Data Analysis. Come mai? Avere i dati è un discorso. Saperli utilizzare e farli fruttare è un discorso diverso.\n Sempre in C# come dall\u0026rsquo;uscita della primissima versione di .NET? A questa domanda non mi sono ancora dato una risposta.\n Sappiamo tutti benissimo che tre anni nel nostro mondo sono pari a tre ere geologiche per i comuni mortali. Speriamo solo di riuscirci prima che sia troppo tardi!\n Un grazie infinito ad Andrea per aver accettato di partecipare!\n Riferimenti Profilo LinkedIn\nGitHub\nBlog\n", "url": "https:\/\/theredcode.it\/voglio-diventare-un-senior-back-end-developer\/" }, "https:\/\/theredcode.it\/machine-learning-in-una-settimana\/": { "title": "Machine Learning in una settimana", "tags": ["intelligenza-artificiale",], "content": "Intro Entrare nel mondo del machine learning può sembrare un qualcosa di impossibile, soprattutto se inizi dalla fine.\n Tuttavia, esistono moltissime risorse online totalmente gratuite che permettono di accelerare il percorso di formazione e di apprendere velocemente una serie di competenze di base.\n Vediamo quindi come dedicarsi ad imparare il machine learning in una settimana e preparare il terreno per approfondire molto di più!\n Piccolo disclaimer: conoscere Python e avere qualche nozione di matematica e statistica di base è sicuramente di grande aiuto.\n Lunedì  Riferimenti: Imparare il machine learning con Python: https://www.datacamp.com/community/tutorials/machine-learning-python Librerie da studiare: Scikit-learn e pandas per la gestione dei dati; Matplotlib per la visualizzazione dei dati;  La prima giornata dovrebbe concentrarsi nell’imparare in maniera generica che cos’è il machine learning e come gestire dati di diverse tipologie e che provengono da diverse fonti.\n Durante il tuo percorso professionale infatti ti renderai conto che man mano che vai avanti, il recupero e la pulizia dei dati può richiedere molto più tempo rispetto all\u0026rsquo;effettivo tempo dedicato all’applicazione di meccanismi di apprendimento automatico.\n In questo senso, la capacità di scrivere script per estrarre dati dai file o eseguire operazioni di web scraping sono spesso abilità essenziali per aspiranti professionisti dell\u0026rsquo;apprendimento automatico.\n Martedì Riferimenti: Scegliere il giusto algoritmo: https://scikit-learn.org/stable/tutorial/machine_learning_map/ Dataset: https://www.kaggle.com/spscientist/students-performance-in-exams Librerie da utilizzare: Scikit-learn per la stima; Matplotlib per mostrare un riepilogo dei dati iniziali;  Applicare quello che si impara al mondo reale è fondamentale. Quando si tocca con mano un problema reale, è più semplice memorizzare e analizzare quanto fatto, soprattutto se ci perdiamo diverso tempo.\n Un modo per farlo può essere quello di utilizzare un dataset come quello riportato tra i riferimenti e porsi delle domande del tipo: “come posso stimare il voto finale dell’esame, sapendo il livello di istruzione dei genitori dello studente e il tipo di pranzo che hanno avuto?\n Utilizzando le librerie messe a disposizione e scegliendo il giusto algoritmo, è possibile risolvere facilmente problemi come questi.\n La consuetudine in questo tipo di attività è che i dati messi a disposizione vengano visualizzati per ottenere un quadro iniziale della situazione, per poi passare alla risoluzione effettiva.\n Risolvere un problema come questo può sembrare piuttosto banale, ma posso assicurare che approcciarsi ad un argomento nuovo e toccare con mano i risultati prodotti dal lavoro è una forte spinta per la tua motivazione!\nMercoledì Riferimenti: Capire la regressione: https://towardsdatascience.com/understanding-the-fundamentals-of-linear-regression-7e64afd614e1 Capire la classificazione: https://towardsdatascience.com/classification-lets-understand-the-basics-78baa6fbff48 Capire il clustering: https://machinelearningmastery.com/clustering-algorithms-with-python/  Torniamo alla fase iniziale di apprendimento e iniziamo a comprendere le potenzialità di alcune attività, come la regressione e la classificazione. Utilizzando lo schema visto il giorno prima, concentriamoci su due problemi: cosa succede quando applichiamo un algoritmo? Cosa c’è dietro le quinte?\n Passiamo quindi a studiare nel dettaglio cosa succede ai meccanismi di regressione, classificazione e clustering: capire cosa c’è sotto al cofano è fondamentale per applicare al meglio queste tecniche.\n Non è necessario imparare a memoria l’algoritmo, ma è fondamentale comprenderlo: questo rende la fase di apprendimento effettiva, perché non si tratta più dell’applicazione meccanica di algoritmi, ma della risoluzione di problemi.\nGiovedì  Riferimenti: Kaggle: https://www.kaggle.com/competitions Competizione sui tweet più “disastrosi”: https://www.kaggle.com/c/nlp-getting-started  Tempo di mettersi alla prova: sul sito di Kaggle sono presenti moltissime competizioni che permettono di mettere alla prova le proprie capacità. Non tutte sono alla nostra portata per il momento, ma possiamo filtrare per beginners (o magari esplorare quelle già concluse) e avviarci verso un nuovo progetto.\n Un esempio? Vediamo la competizione proposta per chi si approccia al mondo dell’intelligenza artificiale e vuole concentrarsi nell’ambito dell’analisi del linguaggio naturale: la challenge proposta non ha un dataset particolarmente grande ed è un’attività stimolante.\n Il bello di questi progetti è il misurarsi con sé stessi: può essere estremamente frustrante passare le ore a studiare algoritmi e teoremi, per poi ritrovarsi davanti ad un problema reale senza alcuna certezza di dove iniziare con la risoluzione.\n Venerdì Riferimenti: Knime: https://www.knime.com/getting-started-guide Il libro di Big Data Analytics: https://amzn.to/37TY2e3  Il mondo del machine learning è davvero ampio, per cui può essere utile apprendere come utilizzare degli strumenti più “visuali”: un esempio è KNIME Analytics Platform, un programma open-source che permette di creare dei workflow per la scienza dei dati anche attraverso tecniche di machine learning disponibile per tutti i sistemi operativi.\n Tip: se vuoi imparare nel dettaglio come usarlo, consiglio vivamente di leggere il libro Big Data Analytics di Andrea De Mauro, che porta molti esempi pratici di casi d’uso reali e di cui esiste una recensione qui!\n Machine Learning in una settimana :S\n Conclusioni  Farlo per una settimana non solo sarà molto divertente, ma può anche incrementare la tua consapevolezza dell’utilità e dell’importante riscontro nell’utilizzare queste tecniche nel mondo reale.\n Alla fine di questa intensa settimana, dovresti essere in grado di saper svolgere qualche attività di base. Personalmente, posso dire che più ne imparo e più ci lavoro, più vedo quali e quante aree possono essere utilizzate per risolvere i problemi.\n Il machine learning è un campo molto vasto e le professioni che richiedono queste competenze sono molte e diverse: se dopo questa settimana ti piace l’idea di fare di questa materia il tuo futuro lavoro, dai un’occhiata a questo articolo per cercare una specializzazione che ti stimoli!\n", "url": "https:\/\/theredcode.it\/machine-learning-in-una-settimana\/" }, "https:\/\/theredcode.it\/pagamenti-con-paypal-e-ionic\/": { "title": "Pagamenti con Paypal e Ionic", "tags": ["ionic",], "content": " Sapevi che è possibile effettuare pagamenti con Paypal e Ionic? Ormai creare un\u0026rsquo;app che integri anche operazioni di pagamento è fondamentale; ad oggi, possono essere utilizzati diversi gateway di pagamento, tra cui Stripe (se non l\u0026rsquo;hai ancora letto, trovi qui l\u0026rsquo;articolo!), Braintree e ApplePay.\n Oggi, vedremo Paypal: questo metodo di pagamento può essere integrato nei siti web e nelle app mobile con pochi e semplici step.\n Repository\nhttps://github.com/serenasensini/Ionic5-pagamenti-con-Paypal.git\n Intro  PayPal è una società americana che gestisce un sistema di pagamenti online in tutto il mondo e supporta trasferimenti di denaro online tra persone fisiche ed anche attività commerciali. Si tratta di una validissima alternativa ai tradizionali metodi cartacei e per di più a costi molto contenuti.\n Logo di Paypal\n Questa società è stata fondata da un personaggio a noi noto: sai chi? Clicca qui per scoprirlo!\n Hands on!  Per creare un’app che possa gestire i pagamenti, è necessario seguire alcuni passi, tra cui la creazione di un ambiente chiamato sandbox per effettuare i test: se questo termine fosse nuovo, possiamo definire una sandbox come un tipo di ambiente per testare il software che consente l\u0026rsquo;esecuzione isolata di parti di programmi per valutazione, monitoraggio o test indipendenti.\n In questo modo, sarà possibile effettuare dei pagamenti di prova per vedere se tutto il giro ci torna e poi passare alla versione di produzione!\n Creazione account developer Paypal  Per configurare i pagamenti PayPal nella nostra app, è necessario creare un conto PayPal Business e questa è un’operazione che andrà fatta nel momento in cui si decida di pubblicare l’app negli store ufficiali.\n A scopo di test, è possibile utilizzare gli account di test Sandbox. I test saranno esattamente come i pagamenti in tempo reale, ma non detrarranno denaro dal tuo account o dalla tua carta di credito.\n Per ottenere le credenziali Sandbox, procediamo nel seguente modo: colleghiamoci al sito https://developer.paypal.com/developer/accounts/ e creiamo un account Sandbox di test:\n Creazione account sandbox\n Dopodiché, clicchiamo su “My Apps \u0026amp; Credentials” e clicchiamo su \u0026ldquo;Create app\u0026rdquo;: in questo modo, sarà possibile creare tutto l\u0026rsquo;occorrente per iniziare con l\u0026rsquo;integrazione di Paypal.\n Gestione dell\u0026rsquo;integrazione con la tua app\n Le credenziali che andranno collegate all’account di prova sandbox saranno disponibili all\u0026rsquo;interno della nostra app: per esempio, cliccando su \u0026ldquo;Default Application\u0026rdquo; vedremo qualcosa di simile alla seguente schermata:\n Esempio di credenziali API per l\u0026rsquo;ambiente di sandbox\n Fin qui ci siamo!\n Installazione delle dipendenze  Per abilitare il plugin di Paypal sull’app Ionic, installare le librerie tramite comandi:\n $ ionic cordova plugin add com.paypal.cordova.mobilesdk $ npm install @ionic-native/paypal  e importare il plugin tra i providers dell’app.module.ts:\n import { NgModule } from \u0026#39;@angular/core\u0026#39;; import { BrowserModule } from \u0026#39;@angular/platform-browser\u0026#39;; import { RouteReuseStrategy } from \u0026#39;@angular/router\u0026#39;; import { IonicModule, IonicRouteStrategy } from \u0026#39;@ionic/angular\u0026#39;; import { SplashScreen } from \u0026#39;@ionic-native/splash-screen/ngx\u0026#39;; import { StatusBar } from \u0026#39;@ionic-native/status-bar/ngx\u0026#39;; import { AppComponent } from \u0026#39;./app.component\u0026#39;; import { AppRoutingModule } from \u0026#39;./app-routing.module\u0026#39;; import { PayPal } from \u0026#39;@ionic-native/paypal/ngx\u0026#39;; @NgModule({  declarations: [AppComponent],  entryComponents: [],  imports: [  BrowserModule,  IonicModule.forRoot(),  AppRoutingModule  ],  providers: [  StatusBar,  SplashScreen,  PayPal,  { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }  ],  bootstrap: [AppComponent] }) export class AppModule { }  Abilitazione del pagamento  Nel nostro file HTML del componente dove vogliamo inserire il pagamento, andremo a creare, per esempio, un pulsante che richiami la funzione di pagamento e avvii la transazione:\n \u0026lt;ion-button expand=\u0026#34;full\u0026#34; color=\u0026#34;success\u0026#34; (click)=\u0026#34;pagaConPaypal()\u0026#34;\u0026gt;Paga con PayPal\u0026lt;/ion-button\u0026gt;  Nel componente Typescript, andremo invece a creare una funzione che, usando il Client ID recuperato al passaggio precedente, effettua il pagamento.\n Inizieremo utilizzando l\u0026rsquo;oggetto PayPal con l\u0026rsquo;ambiente di Sandbox in cui andremo ad inserire la chiave recuperata per preparare il dispositivo per l\u0026rsquo;elaborazione dei pagamenti.\n Tramite la funzione prepareToRender(), passeremo questa configurazione ed eseguiremo il rendering dell\u0026rsquo;interfaccia utente di PayPal per riscuotere il pagamento dell\u0026rsquo;utente chiamando il metodo renderSinglePaymentUI ():\n this.payPal.init({  PayPalEnvironmentProduction: \u0026#39;[CLIENT_ID]\u0026#39;,  PayPalEnvironmentSandbox: \u0026#39;[CLIENT_ID]\u0026#39; }).then(() =\u0026gt; {  this.payPal.prepareToRender(\u0026#39;PayPalEnvironmentSandbox\u0026#39;, new PayPalConfiguration({  })).then(() =\u0026gt; {  const payment = new PayPalPayment(this.totale, this.currency, \u0026#39;Descrizione\u0026#39;, \u0026#39;vendita\u0026#39;);  this.payPal.renderSinglePaymentUI(payment).then((res) =\u0026gt; {  console.log(res);  }, () =\u0026gt; {  // Errore durante la transazione o chiusura della finestra  });  }, () =\u0026gt; {  // Configurazione errata  }); }, () =\u0026gt; {  // Altro });  Sostituendo i segnaposti [CLIENT_ID] con le chiavi recuperate in precedenza, potremo andare a testare i nostri pagamenti: notare che nella chiamata prepareToRender() il primo parametro è impostato a “PayPalEnvironmentSandbox”, ossia la specifica dell’ambiente di test; se invece l’app dovesse essere rilasciato, questo parametro andrebbe sostituito con “PayPalEnviromentProduction”.\n Una risposta tipo dell’esito del pagamento è la seguente:\n{  \u0026#34;client\u0026#34;: {  \u0026#34;environment\u0026#34;: \u0026#34;sandbox\u0026#34;,  \u0026#34;product_name\u0026#34;: \u0026#34;PayPal iOS SDK\u0026#34;,  \u0026#34;paypal_sdk_version\u0026#34;: \u0026#34;2.16.0\u0026#34;,  \u0026#34;platform\u0026#34;: \u0026#34;iOS\u0026#34;  },  \u0026#34;response_type\u0026#34;: \u0026#34;payment\u0026#34;,  \u0026#34;response\u0026#34;: {  \u0026#34;id\u0026#34;: \u0026#34;PAY-123XXX\u0026#34;,  \u0026#34;state\u0026#34;: \u0026#34;approved\u0026#34;,  \u0026#34;create_time\u0026#34;: \u0026#34;2021-10-03T13:33:33Z\u0026#34;,  \u0026#34;intent\u0026#34;: \u0026#34;sale\u0026#34;  }  All’interno del campo response abbiamo l’esito del pagamento, mentre nel campo client, troviamo le informazioni dell’ambiente tramite il quale è stato effettuato il pagamento.\nSemplice, no?\n  Risorse utili   Letture consigliate: Ionic 5 (disponibile su Amazon) Ionic 6: cosa cambia  ", "url": "https:\/\/theredcode.it\/pagamenti-con-paypal-e-ionic\/" }, "https:\/\/theredcode.it\/recensioni\/software-licensing-e-data-governance\/": { "title": "Software Licensing E Data Governance", "tags": [], "content": "Software licensing e data governance era nel mio Kindle da qualche mese, ma purtroppo non c’era stata occasione di leggerlo con la dovuta attenzione; finalmente, dopo qualche settimana in cui è stato possibile ritagliarsi una mezz’ora al giorno per leggerlo, dedichiamo uno spazio a questo piccolo, ma -spoiler- incredibile manuale.\nRanking Anno 2020 Autore Simone Aliprandi Genere Manuale Livello Per approfondire Scorrevolezza 9 / 10 Originalità 10 / 10 Valutazione 10 / 10 Recensione La prima nota positiva riguarda sicuramente la diversità di argomenti trattati: non si parla di software in senso generico, ma di tutto ciò che coinvolge la creazione e la progettazione del software. Usare librerie, sfruttare repository online, utilizzare open data: questi sono tutti temi che Simone Aliprandi, autore del libro, ha saputo spiegare in maniera molto chiara ed esaustiva, senza mai tralasciare anche i riferimenti alle norme giuridiche. Ma partiamo dall’inizio: si comincia dal diritto d’autore e si fa una panoramica molto ampia su come questo funzioni. Il tema non è per nulla scontato ed è interessante vedere come ci siano una serie di misunderstanding circa l’utilizzo di termini come proprietà intellettuale, copyright, copyleft e via dicendo. Nella parte introduttiva viene infatti spesa qualche parola per definire i diversi perimetri di queste terminologie, che poi ci accompagneranno nel corso di tutto il libro. Non solo: capire qual è il campo di azione del diritto d’autore in ambito software è fondamentale per riuscire a proteggersi e a proteggere. Lo sviluppo software è un ambito relativamente nuovo in ambito giuridico e come l’autore più volte ha ricordato all’interno del manuale, non sempre la legislazione riesce a stare al passo con l’evoluzione tecnologica. È facile incappare tra l’altro in un errore abbastanza comune. Si pensa che il diritto d’autore si applichi solo a seguito di un’apposita registrazione tramite qualche ufficio o istituzione pubblica: in realtà, la semplice creazione implica l’associazione di questo diritto (con i limiti del caso, che riguardano le tipologie di opere coperte da questo diritto). Particolarmente interessante è il capitolo dedicato al software libero e open source. Grazie ad una brevissima introduzione su come questi due settori -affini, ma diversi- siano nati, vengono definite le mille e una licenze che sono a disposizione e che abbiamo davanti agli occhi tutti i giorni. Per esempio, per chi sviluppa e condivide il proprio codice su piattaforme come GitHub, sarà capitato spesso di ritrovarsi a dover scegliere una licenza adatta. Barcamenarsi tra le moltissime possibilità a disposizione non è affatto facile: in questo senso, Simone riesce invece a creare e definire molto bene i limiti e gli utilizzi delle licenze a nostra disposizione. Vengono messi anche a disposizione diversi schemi che riassumono le differenze tra questa tipologia di licenze, nonché l’applicabilità e i diritti relativi: fondamentale quando si tratta di avere a che fare con dei progetti personali, ma soprattutto lavorativi. Abbiamo detto all’inizio che non si parla solo di software in senso stretto, ma anche di tutto ciò che è coinvolto nella “messa in produzione” del codice: importante è proprio il ruolo delle banche dati e di come queste devono essere gestite e soprattutto utilizzate. In un momento storico in cui gli open data sono sempre più accessibili e presenti all’interno del contesto dello sviluppo software, è interessante come l’argomento sia tuttora in corso di trattazione e i problemi di compatibilità tra licenze che riguardano questa tipologia di data sia un tema molto caldo. Soprattutto nell’ambito della ricerca scientifica, questo tipo di dato è fondamentale e va regolamentato conseguentemente: oltre al potenziale infinito nel rispettare i principi cardine alla base degli open data, l’applicabilità è infinita e può davvero portare benefici alla comunità intera. Chiaramente, si tratta di un argomento molto delicato e che richiede particolare attenzione anche in materia di licenze per quanto riguarda la condivisione e l’utilizzo: avere a disposizione dei dati “in sola lettura” è di per sé inutile. Ultima -ma non ultima- nota sul tema dati personali: l’autore spende diverse pagine per parlare di privacy -altro termine abusato nel mondo di oggi- e di come questo si accosti al GDPR.\nCuriosità La parola “licenza” deriva dal latino e significa permettere. Già solo questo aiuta a ricordare a cosa servono le licenze! Mai sentito parlare di Affero GPL? Si tratta di una licenza pubblicata sempre dalla Free Software Foundation che riguarda il software reso fruibile tramite soluzioni “remote”. Inoltre, sapevi che Simone terrà un corso online che parla di copyright e social media? Dai un\u0026rsquo;occhiata qui per iscriverti!\nLezione imparata Il concetto del dual licensing o multilicensing; Come acquisire e cedere software tramite le licenze; Esistono dei dati “indirettamente personali”, come quelli meteorologici o territoriali; La protezione del diritto d’autore copre le espressioni, ma non le idee!  Quotes   In un ventennio di evoluzione normativa e giurisprudenziale, nonché di approfondimenti dottrinali, la scienza giuridica ha fornito risposte a questi interrogativi (parlando di leggi e livelli di applicazione). La situazione è tutt’altro che semplice e uniforme, anche per il semplice fatto che l’evoluzione delle tecnologie telematiche ha una velocità tale per cui il mondo del diritto non riesce a tenere il passo.\n Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/software-licensing-e-data-governance\/" }, "https:\/\/theredcode.it\/docker\/differenze-tra-run-cmd-e-entrypoint\/": { "title": "Differenze tra RUN CMD e ENTRYPOINT", "tags": ["docker","dockerfile",], "content": "Differenze tra RUN CMD e ENTRYPOINT: uno degli argomenti peggiori quando si tratta di avere a che fare con Docker. Oggi sfatiamo qualche mito e facciamo chiarezza su queste tre istruzioni.\n Introduzione  Alcune istruzioni di Docker come quelle sopracitate sembrano molto simili e causano confusione tra gli utilizzatori che hanno appena iniziato a lavorare con Docker o lo fanno in modo discontinuo.\n Versione breve RUN esegue i comandi in un nuovo layer e crea una nuova immagine, spesso definita intermedia. Questo comando viene spesso utilizzato per l\u0026rsquo;installazione di pacchetti tramite i vari package manager. CMD definisce il comando e/o i parametri predefiniti, che possono essere sovrascritti dalla riga di comando durante l\u0026rsquo;esecuzione del container Docker. ENTRYPOINT configura un container che verrà eseguito come eseguibile.  Versione lunga  Quando Docker esegue un container, esegue un\u0026rsquo;immagine al suo interno. Questa immagine viene solitamente creata eseguendo le istruzioni definire nel Dockerfile, che aggiungono livelli (o layer) sopra l\u0026rsquo;immagine esistente.\n La prima istruzione rappresenta la distribuzione scelta -solitamente un sistema operativo con qualche pacchetto- e ogni livello aggiuntivo crea una nuova immagine.\n L\u0026rsquo;immagine finale di Docker ricorda una cipolla con il sistema operativo all\u0026rsquo;interno e diversi livelli sopra questo primo strato. Ad esempio, la tua immagine può essere creata installando diversi pacchetti tramite apt e la tua applicazione può quindi basarsi su una versione minificata di Ubuntu 20.04.\n Architettura Docker come una cipolla\n Modalità diretta vs. modalità shell  Alcuni di questi comandi possono essere eseguiti in due modalità, diretta e shell: nel primo caso, la sintassi è del tipo:\n $ RUN [“apt”, “install”, “python3”]  Nel secondo caso invece, la sintassi è la seguente:\n $ RUN apt install python3  Quando l\u0026rsquo;istruzione viene eseguita con la modalità diretta, viene chiamato l\u0026rsquo;eseguibile e l\u0026rsquo;elaborazione della shell non avviene. Cosa vuol dire?\n Vuol dire che il seguente comando inserito all’interno di un Dockerfile non riuscirebbe a valorizzare la variabile e produrrebbe un risultato pari a “Hello $name”:\n ENTRYPOINT [\u0026#34;/bin/echo\u0026#34;, \u0026#34;Hello $name\u0026#34;]  In questo altro caso, l’output sarebbe corretto:\n ENV name John Doe ENTRYPOINT [\u0026#34;/bin/bash\u0026#34;, \u0026#34;-c\u0026#34;, \u0026#34;echo Hello $name\u0026#34;] $ Hello John Doe   Comando RUN  Abbiamo detto che il comando RUN esegue i comandi in un nuovo layer creando una nuova immagine. Quando usato per installare pacchetti software, fa sì che venga creata un\u0026rsquo;immagine intermedia che poi viene scartata una volta terminata l\u0026rsquo;esecuzione dell\u0026rsquo;attività richiesta.\n Può essere eseguito in entrambe le modalità.\n Esempi  $ RUN npm install python3 $ RUN apt update \u0026amp;\u0026amp; apt install -y \\  git \\  xz\\  unzip  Comando CMD  L\u0026rsquo;istruzione CMD consente di impostare un comando predefinito, che verrà eseguito solo quando si esegue il container senza specificare un comando. Se il container Docker viene eseguito con un comando, il comando predefinito verrà ignorato.\n Se Dockerfile ha più di un\u0026rsquo;istruzione CMD, tutte le istruzioni CMD tranne l\u0026rsquo;ultima vengono ignorate.\n Può essere eseguito in entrambe le modalità.\n Esempi  $ CMD echo “Hello world” $ CMD node server.js   Comando ENTRYPOINT  L\u0026rsquo;istruzione ENTRYPOINT consente di configurare un container che verrà eseguito come eseguibile. È simile all’istruzione CMD, perché consente anche di specificare un comando con dei parametri, ma a differenza è che i parametri non verranno ignorati quando il container Docker viene eseguito con i parametri passati tramite riga di comando.\n Esempi  FROM ubuntu:trusty ENTRYPOINT [\u0026#34;/bin/ping\u0026#34;,\u0026#34;-c\u0026#34;,\u0026#34;3\u0026#34;] CMD [\u0026#34;localhost\u0026#34;] ENTRYPOINT /bin/echo \u0026#34;Welcome, $name\u0026#34; COPY entrypoint.sh /entrypoint.sh ENTRYPOINT [\u0026#34;/entrypoint.sh\u0026#34;]  Esempi di utilizzo Airflow  FROM python:3.8-alpine ENV AIRFLOW_VERSION=1.10.11 ENV AIRFLOW_EXTRAS=async,all_dbs,celery,crypto,devel_hadoop,jdbc,ldap,password,redis,s3,samba,ssh,statsd ENV AIRFLOW_HOME=/opt/airflow ENV AIRFLOW_CONFIG=/opt/airflow/airflow.cfg RUN set -xe \\  \u0026amp;\u0026amp; apk add --no-cache \\  build-base \\  cyrus-sasl-dev \\  freetds \\  freetds-dev \\  krb5-dev \\  libffi-dev \\  mariadb-dev \\  postgresql-dev \\  python3-dev \\  \u0026amp;\u0026amp; pip install --no-cache-dir cython numpy psycopg2-binary \\  \u0026amp;\u0026amp; pip install --no-cache-dir apache-airflow[${AIRFLOW_EXTRAS}]==${AIRFLOW_VERSION} \\  \u0026amp;\u0026amp; apk del \\  build-base \\  cyrus-sasl-dev \\  freetds-dev \\  krb5-dev \\  libffi-dev \\  mariadb-dev \\  postgresql-dev \\  python3-dev \\  \u0026amp;\u0026amp; rm -rf /root/.cache/pip WORKDIR ${AIRFLOW_HOME} VOLUME ${AIRFLOW_HOME} EXPOSE 8080 ENTRYPOINT [\u0026#34;airflow\u0026#34;] CMD [\u0026#34;--help\u0026#34;]  Django CMS FROM vimagick/python:2 WORKDIR /app RUN set -xe \\  \u0026amp;\u0026amp; apk add -U py-pillow tzdata \\  \u0026amp;\u0026amp; pip install --no-cache-dir djangocms-installer \\  \u0026amp;\u0026amp; mkdir -p data \\  \u0026amp;\u0026amp; djangocms --db sqlite://localhost/data/project.db \\  --filer \\  --languages en \\  --no-input \\  --parent-dir . \\  --skip-empty-check \\  --utc \\  mysite VOLUME /app/data EXPOSE 80 CMD [\u0026#34;python\u0026#34;, \u0026#34;manage.py\u0026#34;, \u0026#34;runserver\u0026#34;, \u0026#34;0.0.0.0:80\u0026#34;]   MariaDB FROM alpine RUN set -xe \\  \u0026amp;\u0026amp; apk add -U bash \\  mariadb \\  mariadb-client \\  tzdata \\  \u0026amp;\u0026amp; mkdir -p /run/mysqld \\  \u0026amp;\u0026amp; chown mysql:mysql /run/mysqld \\  \u0026amp;\u0026amp; sed -Ei -e \u0026#39;s/^(bind-address|log)/#\u0026amp;/\u0026#39; \\  -e \u0026#39;s/^\\[mysqld\\]$/\u0026amp;\\nskip-host-cache\\nskip-name-resolve\\nuser=mysql/\u0026#39; /etc/mysql/my.cnf \\  \u0026amp;\u0026amp; rm -rf /var/cache/apk/* COPY docker-entrypoint.sh / VOLUME /var/lib/mysql ENTRYPOINT [\u0026#34;/docker-entrypoint.sh\u0026#34;] EXPOSE 3306 CMD [\u0026#34;mysqld\u0026#34;]   Tomcat FROM tomcat:8.0-alpine ADD sample.war /usr/local/tomcat/webapps/ EXPOSE 8080 CMD [\u0026#34;catalina.sh\u0026#34;, \u0026#34;run\u0026#34;]  Se ancora non fossero chiare le differenze, prova a dare un’occhiata tra le risorse utili per trovare ispirazione!\n Risorse utili Docker Pillole di Docker: RUN, CMD, ENTRYPOINT Dockerfile cheatsheet Docker cheatsheet ", "url": "https:\/\/theredcode.it\/docker\/differenze-tra-run-cmd-e-entrypoint\/" }, "https:\/\/theredcode.it\/tags\/dockerfile\/": { "title": "dockerfile", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/dockerfile\/" }, "https:\/\/theredcode.it\/101-deep-learning\/": { "title": "101 - Deep learning", "tags": ["intelligenza-artificiale",], "content": "Il deep learning è un campo di cui si sente parlare sempre più spesso: vediamo di cosa si tratta e come funziona, sfruttando alcuni esempi pratici.\n Cos\u0026rsquo;è Il deep learning è quel campo di ricerca dell\u0026rsquo;apprendimento automatico e dell\u0026rsquo;intelligenza artificiale che si basa su diversi livelli di rappresentazione, corrispondenti a gerarchie di caratteristiche di fattori o concetti, dove i concetti di alto livello sono definiti sulla base di quelli di basso.\n Tecnica sviluppata già negli anni ’80 (grazie a persone come Geoff Hinton, Yann Lecun, Yoshua Bengio e Jürgen Schmidhuber) ispirandosi ai risultati sulla cognizione umana.\n Uno degli obiettivi è ignorare la (noiosa) fase di definizione di feature ad-hoc per uno specifico problema da esaminare e lasciare alle reti neurali il compito di identificare le features più adatte; risulta particolarmente utile in scenari dove si ha a che fare con grosse moli di dati perlopiù complessi e non strutturati.\n Tra i vantaggi del deep learning c’è la possibilità di condividere e riutilizzare i parametri ottenuti durante l’apprendimento per uno specifico task in altri contesti, nonché la possibilità di sviluppare un unico framework computazionale che può essere implementato ed eseguito su diverse piattaforme.\n Rapporto con l\u0026rsquo;intelligenza artificiale e il machine learning\n Come funziona  Invece di una singola rete con molti parametri da individuare tutti insieme, si suddividono le fasi di elaborazione in più livelli distinti a cascata. L’output di ogni rete neurale è l’input della successiva.\n Tipicamente l’input iniziale è a basso livello (ad esempio, si sfruttano piccoli gruppi di pixel di un’immagine) e ogni rete genera delle rappresentazioni più ad alto livello (ad esempio il contorno viso, la bocca, gli occhi, ecc.). Le elaborazioni degli strati intermedi sono tipicamente meccanismi non supervisionati.\n Funzionamento del deep learning\n  Esempi di utilizzo  Assistenti virtuali  Il cuore della \u0026ldquo;traduzione\u0026rdquo; del discorso e del linguaggio è basate su tecniche di deep learning. Esempi comuni di assistenti virtuali sono Cortana, Siri e Alexa.\n Auto a guida autonoma  Per addestrare un\u0026rsquo;auto come questa, ad esempio una Tesla, sono necessarie un\u0026rsquo;esperienza e una competenza simili a quelle umane.\n Per comprendere gli scenari del traffico per le strade, il significato dei segnali stradali, i pedoni che attraversano la strada, i limiti di velocità e molti altri fattori come questi, è chiaro come sia necessaria una grande quantità di dati.\n Che se ne creda, la prima auto a guida autonoma ha utilizzato le reti neurali per rilevare le linee che delimitano le corsie stradali, segmentare il terreno e altre funzionalità: si chiamava ALVINN ed è stata creata nel 1989.\n Chatbot  La continua interazione dei chatbot con gli esseri umani per fornire servizi ai clienti richiede risposte basate sul contesto, e spesso non sono facilmente interpretabili, magari per banali errori di battitura.\n Per rispondere in modo utile a tutte le domande difficili e fornire una risposta appropriata, è necessario sfruttare diverse tecniche di deep learning, che permettono di fornire in input dialoghi e conversazioni in linguaggio umano che possono essere elaborate e sfruttate per costruire uno strumento di risposta automatica.\n Riconoscimento facciale  Il riconoscimento facciale ha molte funzionalità, dall\u0026rsquo;utilizzo nell\u0026rsquo;ambito della sicurezza al meccanismo fino alla funzione di tagging utilizzato da Facebook ogni qualvolta si aggiunge una foto che contenga delle persone.\n Questo campo di applicazione tuttavia non è semplicissimo: ad esempio, riconoscere una stessa persona con aumento o perdita di peso, dopo la crescita di una barba o senza, nuove acconciature e così via, sono tutte attività che spesso sono difficile per un essere umano, ma non sono difficili tuttavia per un algoritmo di questo tipo.\n Sanità  Personalizzazione dei farmaci in base al profilo genetico e alle malattie sono compiti perfetti come applicazioni del deep learning: questo campo ha ampliato la portata di applicazioni in ambito medico e ha attirato l\u0026rsquo;attenzione delle più grandi aziende farmaceutiche.\n Non solo: il deep learning è alla base di altri meccanismi, come il Deep Fake. Non ne hai mai sentito parlare? Dai un\u0026rsquo;occhiata qui!\n Altri casi d\u0026rsquo;uso Esistono molti livelli di applicazione di questa tecnica, alcuni anche molto specifici:\n POS tagging; Named-entity recognition; Clustering; Similarità tra documenti; Sentiment analysis; Riconoscimento di oggetti nelle immagini.  Risorse utili Costruire un chatbot sfruttando il deep learning (inglese) Deepfake e perché (non) preoccuparsi GAN ed healthcare ", "url": "https:\/\/theredcode.it\/101-deep-learning\/" }, "https:\/\/theredcode.it\/101-lambda-e-api-gateway\/": { "title": "101 Lambda e API Gateway", "tags": ["aws","gateway","lambda",], "content": "Lambda e API Gateway: una combinazione vincente per creare del codice serverless.\n  Introduzione  Immaginiamo di aver bisogno di scrivere una funzione che ci restituisca un risultato, magari in formato JSON, dopo aver eseguito qualche operazione.\n  Just a gif  Magari si tratta di una singola funzione -o anche solo un paio- e mettere su un’intera infrastruttura sembra assurdo: grazie alle funzioni Lambda, il problema può essere facilmente risolto.\n Just a gif  Cos’è una funzione Lambda  Si tratta di un servizio offerto da AWS che permette di eseguire del codice serverless, ossia senza la necessità di avere a disposizione un server o di doverne effettuare il provisioning.\n Il bello delle funzioni Lambda è questo: organizzando il codice in singole funzioni sotto forma di richiesta = risultato, Lambda andrà ad eseguire la funzione solo quando è necessario ridimensionandosi automaticamente.\n Le tariffe sono calcolate solo in base ai tempi di calcolo, perciò non viene addebitato alcun costo quando il codice non è in esecuzione, ma solo quando viene effettivamente utilizzato.\n Qui risiede il concetto chiave: per pagare il meno possibile, queste funzioni devono essere efficienti al massimo. Sono supportati diversi linguaggi, tra cui Node.js e Python, motivo per cui possiamo scrivere il codice utilizzando lo strumento che più ci torna facile e poi crearne una funzione Lambda.\n Come creare una funzione Lambda  Per creare una funzione è necessario prima di tutto accedere alla console di AWS e cercare tra i servizi “Lambda”: la schermata mostrata di seguito è il tipico scenario:\n  Elenco funzioni Lambda  Cliccando sul pulsante in alto a destra “Crea funzione”, si aprirà una schermata come la seguente: da qui, potremo creare la nostra funzione assegnandole un nome e scegliendo quale linguaggio andremo ad utilizzare:\n  Creazione di una funzione Lambda  Le possibilità sono diverse: Node.js, Ruby, Python, ma anche Go, Java 11 e .NET Core 3.1. In questo caso di esempio, andremo ad utilizzare Python 3.7.\n  Elenco dei linguaggi disponibili  Una volta inserite le informazioni richieste nel form precedente, visualizzeremo una schermata come quella riportata nella prossima figura, dove avremo a disposizione un file chiamato lambda_functions.py che ci servirà per inserire il nostro codice.\n  Panoramica della funzione appena creata  Clicchiamo quindi sul file Python e vediamo che c’è già del codice: quello che ci viene mostrato nell’esempio, ci permette di restituire un JSON di risposta con codice HTTP pari a 200 e un body con messaggio tipico da funzioni “Hello world”.\n Codice di esempio per un banale \u0026#34;Hello world\u0026#34;  In questo caso, ci interessa notare due cose: il tasto “Test” ci permette di verificare se, per esempio, nella nostra funzione ci sono errori di sintassi o di esecuzione.\n Chiaramente, nel primo caso, sarebbe opportuno testare prima la funzione in locale e poi creare una Lambda, ma si tratta di una funzionalità molto utile, perché ci permette anche di definire degli “eventi”, ossia dei parametri in ingresso che ci permettono di rendere dinamica la funzione.\n Questi eventi possono essere creati per testare più casi d’uso, utilizzando sempre il formato JSON, proprio come fosse il body di una request tradizionale:\n Esempio di evento  La seconda cosa da notare è il badge in verde sulla destra dove si dice “Changed deployed”: ogni volta che modifichiamo la nostra funzione, gli aggiornamenti devono essere deployati per poter essere utilizzate.\n Se clicchiamo sul tasto “Test”, questo è il risultato dell’esecuzione:\n  Test della funziona getHello  Oltre la response che viene visualizzata nel formato che abbiamo definito nel return della funzione, facciamo caso ai log: nell’ultima riga che afferisce al report, vengono indicati i tempi di elaborazione della funzione (1.74 ms), quanto effettivamente viene conteggiato dalla fatturazione AWS (2 ms), la dimensione della memoria e quella effettivamente utilizzata (il minimo è 128 MB).\n Dobbiamo preoccuparci dei prezzi? Assolutamente no: qui è possibile trovare un riepilogo dei costi, ma basti sapere che il piano di utilizzo gratuito per AWS Lambda include 1 milione di richieste al mese e 400.000 GB/secondo di tempo di elaborazione al mese.\n Anche ammettendo che facessimo oltre 30.000 richieste al giorno ogni giorno per un mese, non riusciremmo a superare la soglia. Non male, no?\n Ok, ora che la nostra funzione è pronta, come possiamo utilizzarla dall’esterno? Ecco qui che viene in soccorso API Gateway.\n Cos’è API Gateway Questo servizio ci permette di gestire delle API mettendosi in mezzo tra un client e una raccolta di servizi back end. In questo caso, è possibile far sì che API Gateway si metta in mezzo tra la rete Internet e le nostre Lambda.\n  Esempio di funzionamento dell\u0026#39;API Gateway Come funziona  Come fatto anche in precedenza, cerchiamo tra i servizi AWS quello relativo all’API Gateway e vedremo una schermata come la seguente:\n Panoramica dell\u0026#39;API Gateway  Per creare un API, basta cliccare nel tasto in alto a destra e scegliere la tipologia da utilizzare. Un API REST può fare al caso nostro, soprattutto se poi volessimo rendere la funzione parametrizzabile:\n Configurazione API Rest  Dopo aver cliccato su “Crea” e aver inserito le informazioni che vengono richieste nel modulo sottostante, come nome e il tipo di protocollo da utilizzare, proseguiamo e andiamo a creare tutto l’occorrente, come risorse e metodi.\n Creazione di una nuova API   Riepilogo delle risorse presenti Come prima cosa, creiamo una risorsa: questo farà sì che sia possibile accedere alla nostra API tramite degli endpoint specifici, come ad esempio getHelloWorld:\n  Creazione di una risorsa Configurazione della risorsa  Una volta creata la risorsa, passiamo al metodo: ci basterà un semplice metodo GET che ci restituisca il messaggio e il codice HTTP visto prima durante il test della Lambda:\n  Creazione di nuovo metodo  In questa sezione, abbiamo la possibilità di scegliere se collegare la nostra API ad una funzione Lambda: iniziamo a scrivere il nome della funzione (nel nostro caso, era getHello) e clicchiamo su “Salva”:\n  Configurazione del metodo  Quello che ci verrà mostrato è lo schema di funzionamento della risorsa appena creata: quando all’API Gateway arriva una richiesta, questa invoca la funzione Lambda, gestisce la risposta e la include nella response della richiesta originale.\n  Schema della risorsa  Per testarla, possiamo cliccare sul pulsante “Test” e visualizzare la stessa risposta che avevamo ottenuto in precedenza.\n Test del metodo  A questo punto, è ora di distribuire la nostra API: apriamo il menù “Operazioni”, clicchiamo su “Distribuisci”:\n Distribuzione dell\u0026#39;API  In questa sezione, andremo a definire la cosiddetta “fase”, ossia la versione in cui si trova la nostra funzione. Possiamo definirla come alpha, beta o anche v1: la fase è qualcosa che serve agli sviluppatori per indicare a che punto è la lavorazione del codice.\n  Definizione della fase dell\u0026#39;API  Clicchiamo su “Distribuzione” e vediamo una pagina come la seguente, dove in alto viene riportato l’endpoint da chiamare per utilizzare la nostra API. Lo copiamo e passiamo a testarlo!\n  Panoramica della fase  Niente di più semplice: basterà aprire Postman (o un qualsiasi altro client), inserire l’URL mostrato nella schermata, aggiungere la risorsa che abbiamo creato (nel nostro caso, gethelloworld) e specificare come metodo della richiesta GET: questo è il risultato:\n  Esempio di utilizzo con Postman  L’esempio mostrato è molto, molto semplice, ma pensiamo a qualcosa che possa prendere in input dei parametri e restituirci un risultato, senza dover ricorrere ad un intero server che ne gestisca la scalabilità, la durabilità o la resilienza, minimizzando i costi: niente male, direi!\n That’s all, folks!\n", "url": "https:\/\/theredcode.it\/101-lambda-e-api-gateway\/" }, "https:\/\/theredcode.it\/tags\/gateway\/": { "title": "gateway", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/gateway\/" }, "https:\/\/theredcode.it\/tags\/deepfake\/": { "title": "deepfake", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/deepfake\/" }, "https:\/\/theredcode.it\/deepfake-e-perch%C3%A9-non-preoccuparsi\/": { "title": "Deepfake e perché (non) preoccuparsi", "tags": ["deepfake","gan","intelligenza-artificiale",], "content": "Vediamo in che modo le reti generative avversarie hanno contributo allo sviluppo della tecnica chiamata Deepfake e perché (non) preoccuparsi della sua evoluzione e della sua rapida diffusione.\n Intro  Diverse testate online e sempre più canali mediatici parlano di questo fenomeno: c’è chi ci ride su, pensando che sia divertente “incollare” la faccia di un attore famoso sulla propria, in modo che il video sembri girato dal finto volto (vedi qui Jim Carrey nei panni di James Bond e qui i video di un creator che genera video imitando Tom Cruise in modo molto realistico), o chi ne studia le possibilità evolutive (vedi Facebook).\n Jim Carrey nei panni di James Bond grazie al Deepfake\n C’è chi è seriamente preoccupato, perché degli utilizzi non positivi sono già venuti fuori (in questo articolo si parla di come alcuni parlamentari sembra siano stati ingannati convinti di aver parlato con un politico russo).\n Vediamo però nel dettaglio di cosa stiamo parlando e quali sono i benefici e i rischi di questa tecnologia.\n Cosa vuol dire Deepfake?  Questa parola deriva da una combinazione di \u0026ldquo;fake\u0026rdquo; che sta per “falso” e “deep”, intenso come abbreviazione di deep learning. Il deep learning è un tipo di algoritmo basato sulle \u0026ldquo;reti neurali\u0026rdquo; che impara a replicare i modelli passando attraverso set di dati.\n Con queste capacità, il Deepfake può creare foto, audio o video falsi molto realistici e convincenti, che ritraggono o imitano persone che fanno o dicono cose che non hanno mai fatto, spesso riuscendo ad ingannare perfettamente il pubblico del video.\n In effetti, il Deepfake è un nuovo tipo di falsificazione di un qualunque oggetto multimediale, chiaramente più complesso da riconoscere a causa delle tecnologie utilizzate. Con il progresso delle GPU negli ultimi anni, i ricercatori sono stati in grado di sviluppare tecniche di deep learning che rendono possibili queste applicazioni, come autoencoder e GAN.\n Parliamo di numeri  Secondo un rapporto della startup Deeptrace, all\u0026rsquo;inizio del 2019 sono stati conteggiati circa 7.964 video messi in rete e frutto di Deepfake, che però sono saliti a 14.678 appena nove mesi dopo. A giugno 2020, un nuovo studio di Sensity rivela che quasi 49.081 video sono stati caricati online, con un aumento di oltre il 330 percento rispetto a luglio del 2019.\n L\u0026rsquo;atto di creare immagini o video manipolati non è nuovo, né lo è la falsificazione di volti nelle immagini. Il termine “deepfake” è apparso per la prima volta nel 2017 dopo che un utente su Reddit si è definito tale e ha condiviso video pornografici dove i protagonisti avevano volti di celebrità sui corpi di altre persone.\n In quell’occasione, la confusione fu tale che molte testate giornalistiche parlarono di video di artisti al centro di molti video per adulti.\n Questo utente ha poi rivelato in un’intervista che il codice prodotto e che ha usato era basato perlopiù su più librerie open source che, combinate insieme, hanno prodotto quel risultato. Per compilare abbastanza materiale di immagini facciali per i suoi video, ha sfruttato immagini prese da Google, screenshot di YouTube e foto d\u0026rsquo;archivio per addestrare l’algoritmo che producesse queste immagini.\n Subito dopo che l\u0026rsquo;utente ha reso pubblico il codice sorgente, sono emerse applicazioni specializzate nella creazione di deepfake come FaceSwap o FakeApp, che hanno avuto una diffusione massiva, rendendo possibile per meno esperti di digitale di utilizzare strumenti come questi.\n Com’è fatto un Deepfake  Le principali tecniche di apprendimento automatico per i deepfake tendono ad essere una combinazione dell\u0026rsquo;utilizzo di autoencoder e reti generative avversarie (abbreviate in GAN) di cui abbiamo già parlato.\n Le GAN utilizzano due reti neurali, chiamate generatore e discriminatore: queste reti sono messe in competizione tra loro, di modo che consentano al sistema di apprendere rapidamente.\n Il generatore tenterà di creare un\u0026rsquo;immagine realistica e il discriminatore proverà a determinare se si tratta di un deepfake o meno.\n Se il generatore inganna il discriminatore, il discriminatore utilizza le informazioni raccolte per diventare un giudice migliore. Allo stesso modo, se il discriminatore determina che l\u0026rsquo;immagine del generatore è un falso, la seconda rete migliorerà nel creare un\u0026rsquo;immagine falsa.\n In questo modo, man mano vengono prodotte delle immagini sempre più realistiche, che lo stesso discriminatore ha sempre più difficoltà a riconoscere.\n Perché (non) preoccuparsi  Tutto quello che abbiamo descritto finora può facilmente risultare terrificante: una tecnica del genere può avere esiti molto negativi, e come abbiamo visto i risultati non hanno tardato ad arrivare.\n Lo stesso Einstein disse, quando il fisico Leo Szilárd parlò all’amico della possibilità di utilizzare la fissione nucleare per utilizzarla nelle bombe atomiche, di non averci nemmeno pensato.\n Come spesso succede, molte delle scoperte nel campo tecnologico possono avere applicazioni positive e negative.\n Per fare un esempio, una tecnica come questa potrebbe permettere agli attori di recitare in tutte le lingue, utilizzando un attore che parla la lingua da doppiare per poi “incollare” il volto dell’originale (qui un esempio).\n La produzione di immagini false, ma realistiche, potrebbe aiutare moltissimo nella realizzazione di dataset specifici su determinate tipologie di immagini di cui non si ha un facile accesso (per questione di privacy), e che renderebbero il lavoro più semplice a chi vuole condurre lavori di ricerca.\n I deepfake hanno anche un notevole potenziale nel mondo dell\u0026rsquo;arte. L\u0026rsquo;anno scorso, i ricercatori del laboratorio di intelligenza artificiale di Samsung a Mosca sono stati in grado di trasformare la famosa Gioconda di Da Vinci in un video utilizzando il deep learning per mostrare il soggetto del dipinto che muoveva gli occhi, la testa e la bocca.\n Allo stesso modo, il Museo Dalí di St. Petersburg, in Florida, ha utilizzato questa tecnologia l\u0026rsquo;anno scorso come parte di una nuova mostra chiamata Dalí Lives: si mostrava un deepfake a grandezza naturale dell\u0026rsquo;artista surrealista che era stato creato tramite 1.000 ore di apprendimento automatico delle vecchie interviste dell\u0026rsquo;artista.\n Tramite questo lavoro, è stato possibile creare e riprendere una varietà di citazioni che Dalí aveva effettivamente pronunciato o scritto nel corso della sua carriera e far sì che fosse possibile “vederlo\u0026quot;.\n Gli esempi appena citati mostrano come i deepfake possono servire a portare la storia e l\u0026rsquo;arte \u0026ldquo;vive\u0026rdquo; per un pubblico più ampio. E se questo aiuta ad interessare migliaia o milioni di persone all\u0026rsquo;arte e alla storia, allora il mondo non può che trarne beneficio.\n L’utilizzo di una tecnica come questa può avere molti risvolti positivi; è chiaro che però ignorare una serie di episodi che sfruttando queste tecnologie con esiti spesso inopportuni vanno contrastati e ridotti: Facebook per prima ha parlato di come riconoscere immagini o video frutto di Deepfake e come gestirli in modo da vietarne la pubblicazione sulla propria piattaforma.\nIn conclusione, operazioni del genere vanno effettuate su larga scala, e non solo: come sempre la tecnologia corre veloce, molto più di quanto la legislazione riesca o possa: in questo senso, è però un intervento necessario, perché una regolamentazione definita è fondamentale per definire il perimetro di utilizzo di questa tecnologia.\n Risorse utili Lettera Einstein-Szilárd Wired: due nuovi sistemi per difendersi dai video deepfake Reti generative avversarie per l\u0026rsquo;healthcare ", "url": "https:\/\/theredcode.it\/deepfake-e-perch%C3%A9-non-preoccuparsi\/" }, "https:\/\/theredcode.it\/tags\/gan\/": { "title": "gan", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/gan\/" }, "https:\/\/theredcode.it\/mary-kenneth-keller-in-3-minuti\/": { "title": "Mary Kenneth Keller in 3 minuti", "tags": ["stem",], "content": "Donne nell’informatica che potresti non aspettarti, soprattutto quando parliamo di suore: vediamo insieme la storia di Mary Kenneth Keller, in 3 minuti.\n Chi è  Monaca cristiana e educatrice, viene considerata un pioniere dell’informatica, per la sua tesi in cui dimostra come costruire algoritmi per la risoluzione analitica di equazioni differenziali, scritta in CDC FORTRAN 63.\n Il suo percorso  Nata in Ohio nel 1913 (più di un secolo fa!), entra giovanissima a far parte dell’ordine delle Suore della Carità della Beata Vergine Maria: aveva infatti solo 29 anni.\n Dieci anni più tardi, consegue un dottorato in scienze matematiche e un master in matematica e fisica.\n Credeva moltissimo nel potere dell’istruzione e soprattutto dei computer, così fondò nel 1965 un dipartimento di informatica nel Clarke College e lo diresse sapientemente per vent’anni.\n Quello stesso anno, ottenne un risultato eccezionale: conseguì un dottorato in informatica, e fu la prima in tutti gli Stati Uniti.\n Qualche anno prima però, fu coinvolta in un progetto di grande rilievo: insieme ad un team di colleghi del Dartmouth College -da sempre aperto solo agli uomini-, lavorò alla prima versione di BASIC, chiamato allora DTSS BASIC.\n  Questo linguaggio, ad oggi sconosciuto ai più, è però stato uno dei primi mattoni dell’informatica: l’acronimo sta per Beginner’s All-purpose Symbolic Instruction Code, proprio perché fu creato con l’intento di aiutare anche i programmatori alle prime armi.\n Basti pensare che questo primo BASIC ha fatto innamorare Bill Gates, che anni dopo ha realizzato la versione Microsoft Basic, fino ad arrivare all’attuale Visual Basic, adottato ampiamente da Microsoft.\n Donna visionaria, prevede l’esplosione della società dell’informazione, gli sviluppi dell’intelligenza artificiale, la digitalizzazione dei dati, la centralità di avere dei dispositivi elettronici nella gestione delle banche dati di biblioteche, aziende ed istituzioni pubbliche.\n Molti anni prima della diffusione di Internet, riconosce il potenziale dei computer nel rendere le informazioni accessibili a tutti: Mary Keller sosteneva fortemente soprattutto il coinvolgimento delle donne nel settore informatico.\n Suor Mary ha lavorato duramente per forgiare il suo percorso unico nella vita ed era un\u0026rsquo;appassionata sostenitrice delle donne nell\u0026rsquo;informatica. Per questa ragione, contribuì alla fondazione dell’Association of Small Computer Users in Education (abbreviato in ASCUE).\n Il computer, scriveva, l’aveva aiutata ad esercitare due virtù: l’umiltà, perché gli errori non sono della macchina ma del programmatore, e la pazienza, nelle infinite operazioni di de-bug, nel cercare le linee di codice contenenti errori e correggerle.\n Oltre ad essere una pioniera nel campo dell\u0026rsquo;informatica, è anche autrice di quattro libri nel settore. Il potenziale che Keller vedeva per il futuro dell\u0026rsquo;informatica era molto in anticipo sui tempi: credeva che l\u0026rsquo;uso dei computer avesse una capacità illimitata per la condivisione delle informazioni.\n Riconoscimenti  In suo onore il Clarke College – oggi Clarke University – ha istituito la borsa di studio in informatica Mary Kenneth Keller e ha ribattezzato il centro informatico dell’istituto Keller Computer Center and Information Services.\n Citazioni   “We\u0026rsquo;re having an information explosion, among others, and it\u0026rsquo;s certainly obvious that information is of no use unless it\u0026rsquo;s available”\n   “For the first time, we can now mechanically simulate the cognitive process. We can make studies in artificial intelligence. Beyond that, this mechanism [the computer] can be used to assist humans in learning. As we are going to have more mature students in greater numbers as time goes on, this type of teaching will probably be increasingly important.”\n  Curiosità  Muore nel 1985, all’età di 71 anni, ma anche in quest’ultima fase della sua vita, non si ferma mai: nella casa di cura in cui trascorre l’ultimo periodo della sua vita, malata di cancro, porta con sé un Apple IIe, che utilizza per tenere un corso di informatica agli altri ospiti della struttura e per scrivere un programma per la gestione e il monitoraggio dei pasti.\n Risorse utili Pioneering Women in Computer Science Timeline of women in science ", "url": "https:\/\/theredcode.it\/mary-kenneth-keller-in-3-minuti\/" }, "https:\/\/theredcode.it\/tags\/stem\/": { "title": "stem", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/stem\/" }, "https:\/\/theredcode.it\/tags\/deep-learning\/": { "title": "deep-learning", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/deep-learning\/" }, "https:\/\/theredcode.it\/gan-ed-healthcare\/": { "title": "GAN ed healthcare", "tags": ["deep-learning","healthcare","intelligenza-artificiale",], "content": "GAN ed healthcare: le reti generative avversarie potrebbero sembrare un gioco da ragazzi: in che modo possono però essere costituire un vantaggio enorme se utilizzate in determinati settori, come in ambito sanitario?\n Introduzione Negli Stati Uniti, a partire dal 2009, con la promulgazione dell’HITECH Act, vengono stanziati 30 milioni in dollari di incentivi per tutte quelle strutture sanitarie che adottassero sistemi che fruissero di cartelle cliniche elettroniche (in inglese, EHR, che sta per Electronic Health Record).\n Questo vuol dire che il passaggio dalle consuete cartelle cartacee ad un sistema completamente digitalizzato che contenesse le informazioni circa la salute dei cittadini prese piedi e nel giro di pochi anni è diventato la consuetudine.\n Infatti, uno studio condotto nel 2016 dall’ONC (aka Office of the National Coordinator for Health Information) ha stimato che il 95% degli ospedali americani ha adottato questo approccio. Non male, no?\n L’utilizzo di queste tecnologie non porta un beneficio solo in termini di durabilità, consistenza e reperibilità delle informazioni, ma queste informazioni hanno portato anche enormi vantaggi per chi quei dati sa sfruttarli: negli ultimi anni abbiamo infatti assistito ad un boom di studi sugli effetti dei Big Data, e gli effetti nel settore healthcare non sono da meno.\n Avere a disposizione grandi quantità di dati su referti medici, immagini di radiografie e via dicendo, ha permesso di portare a compimento l’implementazione di diversi strumenti di diagnostica predittiva, che nel passato utilizzava le reti neurali convoluzionali.\n Questo tipo di rete convoluzionale ha un enorme successo nel momento in cui gli esempi a sua disposizione contengono tanti dati “positivi” quanti “negativi”, per ognuna delle classi che è necessario stimare.\n In questo senso, le reti convoluzionali sono perfette per il riconoscimento di oggetti tramite immagini: insegnare ad un sistema a distinguere un gatto da un cane o da un’auto è piuttosto semplice, anche se non sempre è efficace nel caso dei volti umani (leggi l’articolo Coded Bias).\n Il primo problema si presenta dunque nel momento in cui non sia una “parità” di esempi a disposizione: avere un dataset di buona qualità e quantità è merce rara. Non solo: un problema rilevante è rappresentato dall’anonimizzazione dei dati: i più complottisti potrebbero dire che “usare questi dati compromette la privacy dei pazienti o dell’intera popolazione”.\n In effetti, il problema del rendere non identificabili informazioni di questo genere non è una questione così irrilevante: si parla pur sempre di dati estremamente sensibili, che possono e devono essere utilizzati a scopo benefico, ma senza mai compromettere la privacy della fonte originaria.\n In questo senso, le reti generative avversarie sono perfette, soprattutto per un settore come quello dell’healthcare: vediamo il perché.\n Cos’è una rete neurale convoluzionale Una rete neurale convoluzionale (spesso abbreviata in ConvNet o CNN) è un algoritmo di deep learning che può prendere in input un\u0026rsquo;immagine, assegnare un fattore di rilevanza in termini di pesi e bias a vari aspetti/oggetti nell\u0026rsquo;immagine ed essere in grado di apprendere a riconoscere, ad esempio, oggetti in un’immagine.\n La pre-elaborazione richiesta in una rete di questo tipo è molto più bassa rispetto ad altri algoritmi di classificazione, per cui mentre nei metodi primitivi i filtri sono progettati manualmente, con un addestramento sufficiente, questa rete ha la capacità di apprendere in maniera semi-autonoma a migliorarsi.\n L\u0026rsquo;architettura di una rete come questa è analoga a quella del modello utilizzato dal cervello per gestire la connettività dei neuroni ed è stata ispirata dall\u0026rsquo;organizzazione della corteccia visiva. I singoli neuroni rispondono agli stimoli solo in una regione ristretta del campo visivo nota come campo recettivo.\nCome funziona una rete neurale convoluzionale Questo tipo di rete è costituita da più livelli, ognuno dei quali è specializzato in un’attività diversa: allo stesso modo funziona il cervello umano, perché questo opera delle semplificazioni che ci permette di riconoscere gli oggetti applicando diverse “funzioni”.\nSe dovessimo rappresentarla in modo semplice, questo potrebbe essere uno schema: fornendo un input alla rete, questo passa attraverso diverse “convoluzioni”, viene partizionato e i risultati forniti dai diversi livelli vengono poi assemblati per produrre il risultato finale.\nEsempio di CCN - Credits to Wikimedia\n Che vuol dire convoluzione? Vuol dire che questo strato calcola l\u0026rsquo;output dei neuroni che sono collegati a regioni locali o campi recettivi nell\u0026rsquo;input, calcolando un prodotto scalare tra i loro pesi e un piccolo campo recettivo a cui sono collegati nel volume di input; in altre parole, ogni calcolo porta all\u0026rsquo;estrazione di una mappa delle caratteristiche dell\u0026rsquo;immagine di input.\n Immagina di avere un disegno rappresentato come una matrice di valori 5x5, e prendi una matrice 3x3 e fai scorrere quella finestra 3x3 attorno all\u0026rsquo;immagine.\n In ogni posizione di quella matrice, moltiplichi i valori della tua finestra 3x3 per i valori nell\u0026rsquo;immagine che sono attualmente coperti dalla finestra; di conseguenza, otterrai un singolo numero che rappresenta tutti i valori in quella finestra delle immagini.\n Utilizzi questo livello per filtrare: mentre la finestra si sposta sull\u0026rsquo;immagine, controlli i modelli in quella sezione dell\u0026rsquo;immagine.\n Esempio di convoluzione - Credits to: https://www.cosmos.esa.int/web/machine-learning-group/convolutional-neural-networks-introduction\n Funziona grazie ai filtri, che vengono moltiplicati per i valori emessi dalla convoluzione. Il suo compito principale è dunque quello di individuare degli schemi con una tale precisione che semplificare porti a generalizzare il modello (per approfondire queste tematiche, vedi le risorse utili in fondo).\n Cos’è una rete generativa avversaria Le reti generative avversarie (abbreviate in GAN) sono un insieme di modelli di reti neurali profonde, sviluppate da Ian Goodfellow nel 2014, utilizzate per produrre dati sintetici.\n Vi immaginate? Produrre dei dati che fossero verosimili, ma non simili, rilevanti per una situazione specifica, ma che non provengono dal mondo reale.\n L\u0026rsquo;obiettivo di una GAN è quindi quello di addestrare un discriminatore ad essere in grado di distinguere tra dati reali e falsi e allo stesso tempo addestrare un generatore a produrre istanze sintetiche di dati che possono ingannare in modo affidabile il discriminatore.\n Il discriminatore è una normale rete neurale convoluzionale utilizzata per distinguere tra immagini autentiche e sintetiche e il generatore è una rete neurale convoluzionale modificata e addestrata per produrre immagini false dall\u0026rsquo;aspetto autentico.\n Le GAN addestrano allo stesso modo sia il discriminatore che il generatore per migliorare tramite un approccio iterativo la capacità del discriminatore di individuare immagini false e la capacità del generatore di produrre immagini realistiche, creando una sorta di “battaglia” intestina che però porta benefici progressivi.\n Come funziona una rete generativa avversaria (o GAN) Nella figura seguente, vediamo come le zebre diventino improvvisamente identiche a dei cavalli, anche se appare chiaro che ad un occhio attento le strisce sui corpi dei cavalli siano comunque visibili: questa sorta di “rumore” permette però alla rete di calibrarsi rispetto ad eventuali immagini “false” e lo rende sempre più prestante.\n Zebre vs. cavalli: distinguere i veri dai falsi - Credits to: https://medium.com/analytics-vidhya/implementing-a-gan-in-keras-d6c36bc6ab5f\n Cosa succederebbe se facessimo lo stesso utilizzando delle TAC al cervello? Nell\u0026rsquo;illustrazione seguente, un generatore viene addestrato inserendo dei pixel di rumore casuali e quindi generando immagini cerebrali false. Le immagini false create dal generatore vengono quindi inserite nel discriminatore insieme alle immagini reali, per cui quest’ultimo dovrà imparare a distinguere tra immagini reali e false.\n La formazione del generatore mira a produrre immagini false sempre più realistiche che possano ingannare il discriminatore. Man mano che l\u0026rsquo;addestramento continua, il generatore migliora nel produrre falsi e il discriminatore migliora nel distinguere tra immagini reali e false finché il generatore non produce immagini che assomigliano molto alle immagini autentiche.\n Esempio di GAN applicate alle immagini di TAC\n Una volta completato l\u0026rsquo;addestramento, la GAN ​​dovrebbe essere in grado di produrre immagini realistiche che possono essere utilizzate per aumentare i dati esistenti o creare set di dati completamente nuovi (primo scopo, quindi, la produzione di dati sintetici), nonché a riconoscere correttamente quali sono quelle false da quelle vere.\n Benefici Questa tipologia di rete è utile in questi casi perché possono imparare a produrre falsi esempi dei dati sottorappresentati, addestrando meglio il modello. Oltre a migliorare il rilevamento delle malattie, le GAN possono essere utilizzati per l’anonimizzazione dei dati, che impedisce l\u0026rsquo;esposizione delle informazioni personali del paziente.\n La normativa sulla privacy dell\u0026rsquo;Health Insurance Portability and Accountability Act del 1996 (HIPAA) impone infatti la protezione delle informazioni del paziente, il che significa che lavorare con questi dati non è uno scherzo.\n Vale a dire, la maggior parte dei metodi attuali di anonimizzazione può essere invertita con un po’ di reverse engineering, compromettendo la privacy dei dati personali dei pazienti. In questo senso, le reti avversarie, sia nella ricerca che nella pratica, rappresentano una soluzione promettente a molti dei problemi spinosi che devono affrontare oggi l\u0026rsquo;assistenza sanitaria.\n Oltre all’anonimizzazione infatti, abbiamo detto che spesso un problema è rappresentato dalla scarsità di informazioni a nostra disposizione per l’addestramento, soprattutto se si tratta di avere un dataset sufficiente per avere dei casi reali e dei controesempi: in questo senso, una rete GAN mette a disposizione a termini del suo addestramento un dataset perfetto perché completamente anonimo, ma “veritiero”.\n Non a caso, le applicazioni più diffuse dei GAN nel settore sanitario riguardano l\u0026rsquo;imaging medico. Due importanti attività di imaging medico sono la segmentazione dei dati per i tumori cerebrali e la sintesi di immagini mediche.\n Nel primo caso, si tratta di suddividere le TAC del cervello in singole immagini che identifichino i bordi del tumore, il tessuto sano o anche interi siti di tumore. Sebbene la rilevazione della maggior parte dei tipi di tumore cerebrale sia in genere semplice per un medico, la definizione del confine del tumore mediante la valutazione visiva rimane una sfida.\n Come detto in precedenza, un\u0026rsquo;altra interessante applicazione dei GAN è nella sintesi di immagini mediche. I dati di imaging medico sono raramente disponibili per analisi su larga scala a causa dell\u0026rsquo;alto costo per ottenere annotazioni cliniche.\n Dato questo fattore che costituisce un blocco vero e proprio, molti progetti di ricerca hanno lavorato per sviluppare metodi affidabili per la sintesi di immagini mediche.\n Queste immagini false possono essere utilizzate per aumentare i dati in situazioni in cui il numero di immagini retiniche è limitato e possono essere ulteriormente utilizzate per addestrare futuri modelli di intelligenza artificiale.\n In futuro, questi metodi possono essere utilizzati per produrre dati per modelli di addestramento per rilevare malattie in cui non ci sono abbastanza dati reali per addestrare un modello accurato. Inoltre, questo tipo di dati di imaging sintetici può essere utilizzato per proteggere ulteriormente la privacy del paziente.\n In questo senso, è chiaro che le GAN si siano dimostrate promettenti nello spazio della segmentazione delle immagini e della sintesi: hanno dunque tutto il potenziale per rivoluzionare l\u0026rsquo;analisi sanitaria.\n Il metodo di segmentazione dell\u0026rsquo;immagine in medicina può essere esteso all\u0026rsquo;identificazione di oggetti estranei nelle immagini mediche, al rilevamento di ulteriori tipi di escrescenze tumorali e all\u0026rsquo;identificazione precisa della struttura dell\u0026rsquo;organo.\n Inoltre, possono essere davvero un beneficio a costi ridottissimi nell’ambito della sintesi di immagini mediche. Nella maggior parte dei casi, l\u0026rsquo;analisi delle immagini mediche è limitata dalla mancanza di dati e/o dal costo elevato dei dati autentici.\n Così facendo, si potrebbe fornire uno strumento fondamentale a ricercatori e medici per lavorare con immagini sintetiche ma realistiche e di alta qualità. Ciò potrebbe migliorare significativamente la diagnosi, la prognosi e l\u0026rsquo;analisi della malattia, portando benefici quindi su tutti i fronti nell’ambito sanitario.\n", "url": "https:\/\/theredcode.it\/gan-ed-healthcare\/" }, "https:\/\/theredcode.it\/tags\/healthcare\/": { "title": "healthcare", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/healthcare\/" }, "https:\/\/theredcode.it\/grace-hopper-in-3-minuti\/": { "title": "Grace Hopper in 3 minuti", "tags": ["stem",], "content": "Torniamo a parlare di donne che hanno lavorato nel settore dell\u0026rsquo;ingegneria informatica insieme alla straordinaria Grace Hopper in 3 minuti.\n Chi è Informatica, matematica e militare americana nata agli inizi del ‘900, dimostra fin da piccola una grande propensione per le materie scientifiche, dimostrando grande curiosità.\n Il suo percorso Frequenta la Hartridge School e si laurea al Vassar College in Scienze matematiche e fisiche, ma non si ferma qui: si iscrive alla Yale e ottiene un master e un dottorato di ricerca in Matematica, il quale le vale l’ingresso come docente universitario al Vassare College nel 1941.\nGrazie alla figura paterna che sostiene Grace in tutto e per tutto e soprattutto nello “smontare” i vecchi stereotipi femminili, la incoraggia a praticare sport come hockey, basket e pallanuoto.\nDue anni dopo, si arruola come volontaria nella Marina Militare e prende l’incarico di sviluppatrice dei programmi per il “Mark I”, uno dei primi calcolatori della storia: tenendo conto che l’informatica all’epoca non era considerata una materia scientifica, Grace assume subito un ruolo di primaria importanza.\nIl suo lavoro rappresenta una rivoluzione: insegnare ad un sistema in che modo tradurre diverse operazioni attraverso dei comandi sul nastro perforato (foto di questo strumento anacronistico per chi è nato dopo gli anni ’80) era un qualcosa di incredibile.\nNel 1949 viene assunta dalla Eckert-Mauchly Computer Corporation e crea il primo compilatore della storia, senza parlare del fatto che porta avanti la sua battaglia verso la definizione di un processo di debugging.\nIn quell’epoca, la risoluzione degli errori veniva fatto passo passo sulla base della logica dei programmi e richiedeva moltissimo tempo.\nNell’estate del 1947, mentre Grace e il team di cui faceva parte lavoravano con il Mark II, questo si arrestò all’improvviso, a causa di una falena che entrò dalle finestre e si conficcò in un relè. Fu rimossa con le pinzette e inserito nel registro di gruppo, così che il termine bug prese il via nel settore.\nIl compilatore rappresenta una svolta per l’epoca: in principio, il codice sorgente utilizzato dagli sviluppatori è composto da soli simboli che il computer è in grado di decifrare senza problemi, ma che per un essere umano richiedono uno sforzo maggiore.\nDimostrando che fosse possibile “insegnare” una serie di istruzioni che entrambi gli attori fossero in grado di comprendere, nasce il FLOW-MATIC, ossia un compilatore che utilizzava non più il linguaggio simil-macchina, ma alcune istruzioni in inglese.\nFLOW-MATIC può sembrare qualcosa di molto lontano, ma in realtà è alla base del più famoso Cobol, altro linguaggio inventato da Hopper; questo -e non solo- le valgono il titolo di “regina dell’informatica”.\n Questa la foto più celebre: Grace alla tastiera dell’UNIVAC nel 1960.\n Riconoscimenti Nel 1969 riceve il “Computer sciences man of the year”, premio assegnato di consuetudine a soli uomini.\nNel 1971 viene istituito un premio a suo nome, il “Grace Murray Hopper Award”, assegnato a giovani informatici.\nNel 1973 guadagna il titolo di “Distinguished Fellow of the British Computer Society” come prima donna in assoluto.\nNel 1991 le viene assegnata la Medaglia Nazionale della Tecnologia.\n Citazioni Parlando di quando lavorò per la Marina: “all’improvviso non dovevo decidere nulla, era già tutto sistemato. Non mi dovevo preoccupare neanche di come mi sarei vestita la mattina; era già tutto lì. Prendevo il mio abito e lo indossavo. […] Non dovevo nemmeno decidere che cosa avrei preparato per cena […]. È tutto scomparso, e sono rifiorita. Non ho mai avuto tanta libertà.”\n“Dobbiamo immettere [informazioni] mediante un processore. Poi un essere umano deve trasformare le informazioni in notizie o conoscenze. Tendiamo a dimenticare che nessun computer formulerà mai una domanda nuova.”\n  Curiosità Grazie al suo enorme contributo nel settore informatica, nel corso degli anni ha guadagnato diversi soprannomi come “Amazing Grace” e “Nonna Cobol”.\n Risorse utili Enciclopedia delle donne Pagina nell’enciclopedia britannica ", "url": "https:\/\/theredcode.it\/grace-hopper-in-3-minuti\/" }, "https:\/\/theredcode.it\/recensioni\/link\/": { "title": "Link", "tags": [], "content": "Ranking Anno 2002 Autore Albert­ László Barabási Genere Saggio Livello Per approfondire Scorrevolezza 8 / 10 Originalità 10 / 10 Valutazione 9 / 10 Altro giro, altra corsa: con questa recensione de Link: la scienza delle reti, vediamo in che modo scoprire e definire il concetto di rete ha profondamente cambiato la nostra esistenza, in modi spesso neanche lontanamente immaginabili.\nRecensione Leggere questo libro è stata davvero un\u0026rsquo;esperienza incredibile: concetti come grafo, alberi e reti sono concetti generalmente noti, soprattutto quando si segue un percorso come quello di ingegneria; tuttavia, sono concetti che spesso vengono trattati in maniera molto, troppo teorica, al contrario di questo libro. Pur essendo stato scritto dal celebre fisico Albert-László Barabási, il suo è un trattato per niente scontato: il mondo delle reti attraversa ogni aspetto della nostra vita quotidiana, dai social alla genetica. Per comprendere in che modo le reti permeano ogni aspetto, ogni capitolo è dedicato ad una tematica completamente diversa: ognuno di questi è un link, a partire da Internet, allo studio delle molecole, fino ad arrivare alla sicurezza informatica e perfino alla struttura della società stessa. Alla base, il concetto di hub: questi hanno totalmente rivoluzionato il modo in cui guardiamo diversi episodi della nostra vita. In che modo questi hub cambiano e influenzano totalmente la nostra vita è chiarissimo: in Hollywood i nuovi attori sono sponsorizzati spesso e volentieri da grandi attori che fungono da contatto, così come il mondo degli amministratori delegati è concentrato nelle mani di una piccola fetta della popolazione, dove per entrare in questa élite è fondamentale avere un \u0026ldquo;contatto\u0026rdquo;. Mai sentito parlare di grado di separazione? Se ti stai chiedendo quante persone ti separano tra te e il tuo idolo, sappi che probabilmente questo numero è 6 (qui una breve spiegazione). Le reti spiegano moltissimi aspetti della nostra vita, e non solo: riescono anche a definirlo e modellarlo in maniera precisa, anche se non sempre è semplice contare il numero di nodi. Basti pensare ad Internet: si stimano un trilione di pagine online, ma la realtà è che il numero preciso è impossibile da stimare. Alla velocità con cui Internet cresce ogni secondo, anche i robot non riescono a codificare tutte le pagine che nel frattempo vengono create! In conclusione? Il famoso detto \u0026ldquo;n__el bene o nel male, purché se ne parli\u0026rdquo; è un altro modo di esprimere questa visione del mondo. Le persone \u0026ldquo;di successo\u0026rdquo; -in senso sia positivo che negativo- sono persone che in qualche modo \u0026ldquo;accentrano\u0026rdquo; l\u0026rsquo;attenzione verso di loro, creando diversi collegamenti che riconducono ad un unico centro. Più collegamenti ci sono, più l\u0026rsquo;hub assume importanza. Allo stesso modo, più un hub è importante, più un\u0026rsquo;eventuale cancellazione di quest\u0026rsquo;ultimo può portare a conseguenze gravi: un caso semplice è quello di un sistema distribuito che non conta su delle repliche di sé stesso. Se il componente che coordina tutto viene meno, il sistema smette di funzionare. In questo senso, intravedo una riflessione anche etica e morale: per avere successo o per fare la differenza, è importante lavorare sul proprio ruolo nella società, senza mai trascurare le persone con cui veniamo a contatto. Il contributo che diamo con il nostro lavoro (e non solo) può collegarci ad altri argomenti o persone, che a loro volta possono riscontrare un impatto: in questo senso, le community sono il più grande esempio di hub a nostra disposizione, che cresce o decresce nel tempo e che sopravvive grazie ai collegamenti preferenziali\u0026hellip; Un esempio di rete a invarianza di scala perfetto!\nCuriosità Cos\u0026rsquo;è il numero di Bacon: si assegna a ogni attore o attrice che ha partecipato a un film in cui recita anche Kevin Bacon un numero di Bacon pari a 1, e a ogni attore che abbia lavorato con uno della lista precedente un numero di Bacon pari a 2 e così via. Kevin Bacon ha numero di Bacon 0. Tre studenti dell\u0026rsquo;Albright College di Reading decidono di portare questo dilemma in tv, partecipando al John Stewart Show una sera e lanciando questa provocazione: Kevin Bacon ha recitato in così tanti film che può essere collegato direttamente o indirettamente con qualsiasi attore di Hollywood. In questo modo, hanno avuto il loro quarto d\u0026rsquo;ora di celebrità e hanno portato alla luce una teoria a dir poco geniale. Se vuoi dare un\u0026rsquo;occhiata alla puntata originale, qui trovi il video!\nLezione imparata Il concetto di hub è fondamentale per comprendere come agiamo; Il numero di Bacon esiste; La rete a invarianza di scala descrive la maggior parte delle reti del mondo reale. Quotes \u0026ldquo;Entro il 2020 questi progressi avranno cambiato la medicina in tutti i suoi aspetti. I bambini non verranno più portati dal dottore per un mal di gola: le mamme potranno usufruire di un dispositivo palmare con chip intercambiabile che rivelerà come il mald di gola di Tommy sia stato provocato da un\u0026rsquo;infezione da streptococchi.\u0026rdquo; \u0026ldquo;Il colpo di genio, se così si può definire, di questi tre studenti fu la loro constatazione che ogni attore di Hollywood può essere connesso a Kevin Bacon in non più di due o tre passaggi\u0026rdquo;.\n  Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/link\/" }, "https:\/\/theredcode.it\/helen-meriwether-lewis-thomas-in-3-minuti\/": { "title": "Helen Meriwether Lewis Thomas in 3 minuti", "tags": ["stem",], "content": " Prima donna, seconda americana e terza persona in assoluto a vincere un dottorato di ricerca per il corso di laurea in storia della scienza dell’Università di Harvard: parliamo di Helen Meriwether Lewis Thomas, in 3 minuti.\n Chi è  Helen Meriwether Lewis Thomas prevede trent’anni prima dell’effettiva scoperta fattori come l\u0026rsquo;autonomia, la velocità di crociera, capacità e l\u0026rsquo;uso di motori a reazione da parte delle compagnie aeree commerciali, guadagnando un premio $ 50.000 dalla Trans World Airlines.\n Il suo percorso  Ha iniziato i suoi studi a New York City, dove sua madre lavorava come insegnante di scuola pubblica, continuando gli anni del liceo alla St. Catherine\u0026rsquo;s School di Richmond, in Virginia.\n Il suo interesse per l\u0026rsquo;astronomia fu stimolato dal lavoro universitario svolto presso l\u0026rsquo;Osservatorio di Harvard, dove assistette il professor Willem Luyten nell\u0026rsquo;identificazione delle nane bianche.\n Ha lavorato per tre anni come segretaria di Leon Campbell, a capo dell\u0026rsquo;American Association of Variable Star Observers, allora affiliata all\u0026rsquo;Harvard Observatory.\n È entrata a far parte dello staff dell\u0026rsquo;Osservatorio di Harvard sotto la straordinaria astronoma Cecilia Payne-Goposchkin.\n Alla fine degli anni \u0026lsquo;30 iniziò anche a lavorare per un dottorato di ricerca sotto la supervisione del professore di Harvard George Sarton, preparando una tesi sulla storia delle osservazioni di stelle variabili osservate dal II secolo a.C. al XIX secolo d.C.\n Per questo studiò testi sia latini che arabi. All\u0026rsquo;inizio della Seconda guerra mondiale, il suo lavoro di laurea fu interrotto dal lavoro di guerra e la sua laurea non le fu assegnata fino al 1948.\n  Nel 1947 fu nominata ingegnere senior presso la Raytheon Manufacturing Company, dove rimase fino al 1954, lavorando sui sistemi di guida. Tornò al MIT come redattore e capo delle pubblicazioni presso il Research Laboratory of Electronics fino al suo pensionamento nel 1971.\n Riconoscimenti  Grazie a lei, vengono scoperte diverse stelle variabili, ossia quelle stelle la cui luminosità osservata dalla Terra varia; il tutto viene fuori grazie al suo lavoro di catalogazione di diversi testi appartenenti al II a.C., che lei lesse e tradusse.\n Inoltre, contribuì alla scoperta di oltre 1100 stelle insieme all’astronomo Willem Luyten, oltre ad aver lavorato per la scoperta di alcune nane bianche, delle stelle di piccole dimensioni considerate molto rare e fondamentali per lo studio dell’evoluzione.\nCuriosità Durante la sua adolescenza, rimase estasiata nell’osservare le meteore, tanto da sperare di diventare una “meteorologa”, pensando che questo termine intendesse un esperto in ambito astronomico. E alla fine ci riuscì davvero, ma diventando astronoma e ingegnera!\n Risorse utili Elogio a Helen Meriwether Lewis Thomas Cambridge Women’s Heritage Project In Memory of Helen Meriwether Lewis Thomas August 21, 1905 - August 6, 1997 Margaret Hamilton ", "url": "https:\/\/theredcode.it\/helen-meriwether-lewis-thomas-in-3-minuti\/" }, "https:\/\/theredcode.it\/tags\/podman\/": { "title": "podman", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/podman\/" }, "https:\/\/theredcode.it\/categories\/podman\/": { "title": "podman", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/podman\/" }, "https:\/\/theredcode.it\/docker\/podman-e-docker-compose\/": { "title": "Podman e Docker Compose", "tags": ["docker-compose","podman",], "content": "Ti sei mai chiesto come usare Podman e Docker Compose? Vediamo insieme i vantaggi e le alternative a disposizione.\n Podman: cos’è (short version)  Ref. https://www.theredcode.it/what-is-podman/\n Podman (abbr. Pod Manager) è un container engine rilasciato nel 2018. È stato sviluppato da Red Hat e somiglia a Docker per molti aspetti, come l’utilizzo della riga di comando; questo rende infatti possibile utilizzare i comandi tipici di Docker su Podman, utilizzando l’alias docker=podman.\n Nella maggior parte dei casi il passaggio da Docker a Podman è relativamente semplice; la novità però che caratterizza Podman è l’assenza di un demone centrale come istanza di controllo del singolo container e questo offre la possibilità di accedere alle diverse applicazioni virtualizzate anche senza permessi di root.\n Podman gira su tutte le distribuzioni di Linux disponibili come Ubuntu, Fedora, CentOS, Debian e RHEL ma anche su Raspbian. Per la maggior parte dei casi, questo motore si può installare direttamente attraverso la gestione dei pacchetti del relativo sistema.\n Per installarlo, è possibile seguire le indicazioni della documentazione ufficiale.\n Docker Compose: cos’è (short version)  Docker Compose è uno strumento per definire ed eseguire applicazioni Docker multi-container. Con questo strumento, basta usare un file YAML per configurare diversi servizi che compongono la tua applicazione ed avviarli con un solo comando, creando e avviando tutti i servizi necessari.\n Disponibile per Mac, Windows e Linux, possiamo installarlo tramite i seguenti comandi, che scaricano il pacchetto tramite curl e poi gli assegnano i permessi di esecuzione:\n $ sudo curl -L \u0026#34;https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose   Altrimenti, la maggior parte dei package manager permettono di installarlo da riga di comando:\n $ sudo apt install docker-compose  Usare Docker Compose con Podman  Esistono moltissimi esempi online di file docker-compose.yml da usare come esempio: in questo articolo, useremo questo repository analizzato nel precedente articolo sullo stack MEAN.\nPrima di eseguire Docker Compose, ci assicuriamo che tutti i pacchetti richiesti siano installati e configuriamo il servizio di sistema Podman (in versione 3.0 o successiva) utilizzando systemd.\n Oltre a Podman e alle sue dipendenze, devono essere installati i pacchetti podman-docker e docker-compose, per cui, a seconda del package manager a disposizione, installiamo i suddetti pacchetti.\n Dopo averlo fatto, avviamo il servizio di Podman attivato dalla socket utilizzando il seguente comando:\n $ sudo systemctl start podman.socket  A questo punto, utilizziamo come di consueto Docker Compose per avviare il nostro set di servizi con il seguente comando:\n $ sudo docker-compose up  Una volta che i servizi saranno stati avviati e pronti all’uso, potremo usare come di consueto i comandi che useremmo con Docker:\n $ sudo podman ps # container attivi $ sudo podman volume ls # elenco dei volumi …   Usare Podman Compose  Com’è ovvio, non potevamo non aspettarci un parallelo al consueto Docker Compose: in questo caso, non ci resta che installarlo e provarlo!\n Installazione tramite curl  Utilizzando curl, andiamo a scaricare il pacchetto e gli assegniamo i permessi di esecuzione:\n $ curl -o /usr/local/bin/podman-compose https://raw.githubusercontent.com/containers/podman-compose/devel/podman_compose.py $ chmod +x /usr/local/bin/podman-compose   Installazione con dnf  Per sistemi Fedora e similari, utilizzare il seguente comando:\n $ sudo dnf install podman-compose  Installazione con pip3  Per sistemi che abbiano installato pip3, utilizzare il seguente comando:\n $ pip3 install podman-compose  Dopodiché, per poterlo utilizzare, è sufficiente avere a disposizione il classico file docker-compose.yml, ma sostituendo al classico comando docker-compose, la parola podman:\n $ podman-compose –help $ podman-compose up # crea ed avvia i container $ podman-compose down # arresta e rimuove container, volumi, immagini, ecc. $ podman-compose ps # elenco dei container …  Risorse utili Tantissimi esempi utili per comprendere Docker Compose Esplorando il Dockerfile Cos’è Podman Docker cheatsheet Dockerfile cheatsheet ", "url": "https:\/\/theredcode.it\/docker\/podman-e-docker-compose\/" }, "https:\/\/theredcode.it\/margaret-hamilton-in-3-minuti\/": { "title": "Margaret Hamilton in 3 minuti", "tags": ["stem",], "content": " Parliamo di successo nel settore dell\u0026rsquo;ingegneria informatica, e lo facciamo con questa pioniera: vediamo Margaret Hamilton in 3 minuti.\n Chi è Informatica, ingegnera, imprenditrice, nasce alla fine degli anni \u0026lsquo;30. Questi sono solo alcuni fra i tanti cappelli che Margaret indossa nel corso della sua vita: non per nulla, è stata la prima direttrice del Software Engineering Division del MIT, niente poco di meno che il laboratorio in cui viene sviluppato e progettato il software installato per la missione dello sbarco dell’Apollo 11.\n Il suo percorso Laureata in matematica presso l’Università del Michigan e in matematica e filosofia presso l’Earlham College, dopo aver insegnato per un breve periodo, capisce che la sua strada è un’altra e si trasferisce a Boston: lì inizia a lavorare al MIT nel dipartimento di meteorologia, diventando una pioniera del settore informatico. Infatti, nel 1960, l’informatica non era una disciplina universitaria e tutto quello che Margaret produce è farina del suo sacco.\n Lavoro al progetto SAGE, ossia un sistema che doveva prevedere e simulare eventi meteorologici con una certa accuratezza, visto l’impiego militare: questo le vale la candidatura per la posizione di capo dello sviluppo software del programma Apollo alla NASA. Così, nel giro di una decade, si trova ad occuparsi di un intero gruppo della missione dell’Apollo 11, tanto che grazie al suo lavoro e a quello dei suoi collaboratori, viene evitato l’abbandono della missione dovuto ad errore di configurazione della procedura di aggiornamento di un contatore.\n Riconoscimenti Grazie a lei, viene segnato l’inizio dell’ingegneria del software, che viene finalmente considerata una materia scientifica alla stregua delle altre. Riceve la Medaglia presidenziale della libertà, ossia la più alta decorazione degli Stati Uniti d’America, da Barack Obama come ringraziamento per il lavoro svolto per il paese, oltre al premio Augusta Ada Lovelace Award.\n Citazioni \u0026ldquo;Mia figlia Lauren veniva spesso a lavorare con me di notte e nei fine settimana perché eravamo tutti molto impegnati. Non c\u0026rsquo;era un momento in cui non lavoravamo. Le piaceva giocare all\u0026rsquo;astronauta perché mi vedeva giocare in quel modo in alcune simulazioni avremmo eseguito. Un giorno, provò una simulazione hardware perché volevamo provare se il software funzionasse correttamente con tutti gli altri elementi, come l\u0026rsquo;astronauta. Quindi ricordo una volta quando nella simulazione di Lauren si schiantò e pensai: \u0026ldquo;Oh mio dio, come è successo?\u0026rsquo;\n Curiosità Hai mai visto questa foto?\nQuesta foto incredibile di Hamilton e del codice Apollo del suo team ha fatto il giro dei social media e negli articoli che descrivono in dettaglio i suoi contributi chiave al successo dell\u0026rsquo;Apollo 11. Secondo Hamilton, questa immagine ormai iconica, è stata scattata al MIT nel 1969 da un fotografo dello staff dell\u0026rsquo;Instrumentation Laboratory per essere utilizzata nella promozione del lavoro del laboratorio su il progetto Apollo. La didascalia originale, dice, recita:\n\u0026ldquo;Qui, Margaret è mostrata in piedi accanto agli elenchi del software sviluppato da lei e dal team di cui era responsabile, il team del software di volo di bordo LM [modulo lunare] e CM [modulo di comando]\u0026rdquo;.\n Risorse utili Storia della celebre foto Pagina ufficiale del KLabs ", "url": "https:\/\/theredcode.it\/margaret-hamilton-in-3-minuti\/" }, "https:\/\/theredcode.it\/categories\/stem\/": { "title": "stem", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/stem\/" }, "https:\/\/theredcode.it\/user-onboarding-con-ionic\/": { "title": "User onboarding con Ionic", "tags": ["ionic","user-onboarding",], "content": " Quando sviluppiamo una nuova app, non sempre l\u0026rsquo;utente riesce a percepirne tutte le funzionalità: il processo di user onboarding con Ionic che vedremo in questo articolo ci permette di riuscire alla nostra app di farsi notare e di far scoprire all\u0026rsquo;utente tutte le feature messe a disposizione.\n Repository\nhttps://github.com/serenasensini/Ionic5-onboarding\n User onboarding: cos\u0026rsquo;è  Tutti gli utenti hanno bisogno di una piccola guida quando iniziano a utilizzare la tua nuova app: è fondamentale prenderli per mano e guidarli attraverso le diverse sezioni chiave del tuo prodotto\u0026hellip;\n Ma attenzione: un buon flusso di onboarding è molto più di un semplice tour del prodotto: è necessario illustrare perché quello a cui hai lavorato è perfetto per l\u0026rsquo;utente che sta per utilizzarla, il modo in cui può sfruttarla al meglio e l\u0026rsquo;ideale è che gli utenti si sentano come se conoscessero la tua app da sempre.\n Esempio di user onboarding con Ionic\n Procedimento  In questo esempio, vediamo come creare delle semplici slides che l\u0026rsquo;utente può scorrere per dare un\u0026rsquo;occhiata alle funzionalità della nostra app, e lo faremo seguendo i prossimi passi.\n Definizione delle slides  Andiamo a costruire tre slides, ognuna delle quali con delle immagini esemplificative e una breve descrizione della funzionalità di cui vogliamo illustrare le potenzialità: è chiaro che quanto mostrato di seguito sia puramente di esempio, ma è perfetto per rendere l\u0026rsquo;idea di quello su cui stiamo andando a lavorare.\n All\u0026rsquo;interno della pagina onboarding.page.html andiamo ad inserire un componente ion-slides come riportato di seguito, dove inseriamo due slides che hanno due pulsanit, uno per saltare il tutorial e uno per scorrere in avanti.\n Il componente _ion-slides_ha già di per sé permette tramite la gesture di sliding di passare da una slide all\u0026rsquo;altra in maniera molto semplice, ma è utile guidare in questo senso l\u0026rsquo;utente: in più, attiviamo il pager che permette all\u0026rsquo;utente di capire qual è lo step corrente che sta visualizzando.\n \u0026lt;ion-slides pager=\u0026#34;true\u0026#34;\u0026gt; \u0026lt;ion-slide class=\u0026#34;ion-padding\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;../../assets/slide1.png\u0026#34; \u0026gt; \u0026lt;div class=\u0026#34;slider-text\u0026#34;\u0026gt; \u0026lt;h2\u0026gt;Spiaggia, arrivo!\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ultricies, erat vitae porta consequat. \u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;navigator\u0026#34;\u0026gt; \u0026lt;ion-button color=\u0026#34;primary\u0026#34; fill=\u0026#34;clear\u0026#34; (click)=\u0026#34;skip()\u0026#34;\u0026gt;SALTA\u0026lt;/ion-button\u0026gt; \u0026lt;ion-button color=\u0026#34;primary\u0026#34; fill=\u0026#34;clear\u0026#34; (click)=\u0026#34;next()\u0026#34;\u0026gt;AVANTI\u0026lt;/ion-button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/ion-slide\u0026gt; \u0026lt;ion-slide class=\u0026#34;ion-padding\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;../../assets/slide2.png\u0026#34; \u0026gt; \u0026lt;div class=\u0026#34;slider-text\u0026#34;\u0026gt; \u0026lt;h2\u0026gt;Non vedo l\u0026#39;ora di mangiare gelato...\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ultricies, erat vitae porta consequat. \u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;navigator\u0026#34;\u0026gt; \u0026lt;ion-button color=\u0026#34;primary\u0026#34; fill=\u0026#34;clear\u0026#34; (click)=\u0026#34;skip()\u0026#34;\u0026gt;SALTA\u0026lt;/ion-button\u0026gt; \u0026lt;ion-button color=\u0026#34;primary\u0026#34; fill=\u0026#34;clear\u0026#34; (click)=\u0026#34;next()\u0026#34;\u0026gt;AVANTI\u0026lt;/ion-button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/ion-slide\u0026gt; \u0026lt;ion-slide class=\u0026#34;ion-padding\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;../../assets/slide3.png\u0026#34; \u0026gt; \u0026lt;div class=\u0026#34;slider-text\u0026#34;\u0026gt; \u0026lt;h2\u0026gt;...e nuotare nel mare!\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ultricies, erat vitae porta consequat. \u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;ion-button color=\u0026#34;primary\u0026#34; [routerLink]=\u0026#34;\u0026#39;/home\u0026#39;\u0026#34;\u0026gt;Andiamo!\u0026lt;/ion-button\u0026gt; \u0026lt;/ion-slide\u0026gt; \u0026lt;/ion-slides\u0026gt;  Funzioni avanti e salta Le funzioni che i nostri pulsanti andranno a richiamare dovrebbero compiere due azioni: nel caso della funzione next, si dovrebbe scorrere da una slide all\u0026rsquo;altra, mentre nel caso della funzione skip, l\u0026rsquo;utente decide di saltare il tutorial e quindi non glielo dovremmo più mostrare.\n Definiamo quindi le due funzioni nel seguente modo: per la funzione next, usiamo il decorator ViewChild che ci permette di fare riferimento all\u0026rsquo;oggetto IonSlides e manipolarlo attraverso la pagina onboarding.page.ts:\n @ViewChild(IonSlides) slides: IonSlides; ... next() { this.slides.slideNext(); }  Per la funzione skip andiamo invece ad utilizzare uno dei plugin messi a disposizione dalla community di Ionic che ci permette di memorizzare la scelta dell\u0026rsquo;utente e di ricordarci che questo ha deliberatamente scelto di non seguire il tutorial o di non visualizzarlo più.\n Utilizziamo questo strumento in due punti: quando carichiamo la pagina, controlliamo che non sia già stato visionato il tutorial e che l\u0026rsquo;utente non abbia scelto di nasconderlo; invece, tramite la funzione skip, andiamo a memorizzare la scelta dell\u0026rsquo;utente, per poi mostrare la pagina principale dell\u0026rsquo;app.\n constructor(public storage: NativeStorage, public router: Router) { this.storage.getItem(\u0026#39;skipped\u0026#39;).then((val) =\u0026gt; { console.log(\u0026#39;skipped:\u0026#39;); console.log(val); if (val){ this.router.navigate([\u0026#39;/home\u0026#39;]); } }, reason =\u0026gt; { console.log(reason); }); } ... skip() { this.storage.setItem(\u0026#39;skipped\u0026#39;, true).then(() =\u0026gt; { this.router.navigate([\u0026#39;/home\u0026#39;]); }, reason =\u0026gt; { console.log(reason); this.router.navigate([\u0026#39;/home\u0026#39;]); }); }  Gestione del routing All\u0026rsquo;interno del componente di routing, andiamo a definire il modo in cui la nostra app mostrerà le diverse pagine: la prima sarà sempre quella di onboardin__g, la quale poi effettuerà i dovuti controlli con le funzioni sopra definite.\n Ci saranno poi tutte le altre pagine che fanno riferimento ai vari componenti presenti all\u0026rsquo;interno della nostra app, e nel caso di esempio c\u0026rsquo;è il componente home:\n const routes: Routes = [ { path: \u0026#39;home\u0026#39;, loadChildren: () =\u0026gt; import(\u0026#39;./home/home.module\u0026#39;).then( m =\u0026gt; m.HomePageModule) }, { path: \u0026#39;\u0026#39;, redirectTo: \u0026#39;onboarding\u0026#39;, pathMatch: \u0026#39;full\u0026#39; }, { path: \u0026#39;onboarding\u0026#39;, loadChildren: () =\u0026gt; import(\u0026#39;./onboarding/onboarding.module\u0026#39;).then( m =\u0026gt; m.OnboardingPageModule) }, ]; Test Il risultato ottenuto dovrebbe essere il seguente:\nRisultato ottenuto\n Risorse utili Ionic: guida completa per creare app per Android e iOS Ionic cheatsheet 101 - CORS policy con Ionic e Node.js ", "url": "https:\/\/theredcode.it\/user-onboarding-con-ionic\/" }, "https:\/\/theredcode.it\/tags\/user-onboarding\/": { "title": "user-onboarding", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/user-onboarding\/" }, "https:\/\/theredcode.it\/recensioni\/intelligenza-artificiale-for-dummies\/": { "title": "Intelligenza Artificiale for Dummies", "tags": [], "content": "Il concetto di “intelligenza artificiale” è sulla bocca di tutti: pubblicità di auto, telefoni, lavatrici, ma anche frigoriferi, e soprattutto nel mondo del lavoro Tutti parlano degli svariati usi di tecniche di “intelligenza artificiale” all’interno del loro portfolio; quanti hanno davvero capito di cosa si parla? Con questa recensione de Intelligenza artificiale for dummies esploriamo questo vasto e complessimo mondo.\nRanking Anno 2020 Autore Luca Massaron \u0026amp; Johny Paul Mueller Genere Manuale Livello Per iniziare Scorrevolezza 8 / 10 Originalità 10 / 10 Valutazione 9 / 10 Trama Con questo manuale diviso in tematiche in pieno stile _from zero to hero -_non per niente, fa parte della collana for dummies-, si analizzano i concetti principali e le soluzioni realmente presenti, nonché il presente, passato e futuro di questo settore in continua e rapidissima crescita Non solo: partendo dal concetto di intelligenza, affrontando il machine learning e il deep learning rispetto ai relativi utilizzi, si arriva a parlare delle applicazioni software e del futuro che ci si prospetta nei prossimi anni.\nRecensione In meno di 300 pagine i due autori raccolgono attraverso dei paragrafi brevi ma concisi tutti i concetti che riguardano il settore che ruota intorno alle tecniche di intelligenza artificiale: senza perdersi mai in chiacchere -il che non è scontato-, attraverso moltissime citazioni ed esempi, si parla di casi d’uso e del mondo in cui l’AI viene impiegata nella società, il tutto senza mai far mancare i riferimenti ai singoli concetti Spesso e volentieri, si tratta di gizmo. Un misto di pubblicazione scientifica e di manuale per l’uso di un mondo che è vastissimo e che spesso è al centro di confusione: tra i primi concetti che portano a queste idee errate c’è la comune credenza che il futuro dell’intelligenza artificiale sia solo fatto di morte e distruzione Gli autori non si perdono di animo e con estrema concretezza e razionalità raccolgono le varie critiche e predizioni e le documentano una ad una; i prossimi anni non saranno caratterizzati da lavori che scompariranno, robot che sostituiranno il lavoro degli esseri umani e auto che si guideranno da sole Il presente ci dimostra che l’intelligenza artificiale è fondamentale sostituire le persone in una serie di lavori, ma per una ragione ben precisa: una serie di professioni estremamente manuali e meccaniche possono essere svolte con maggior sicurezza da sistemi intelligenti che possono gestire al meglio i rischi, il tutto sempre sotto la supervisione umana I giornali ci insegnano che non è così strano sentir parlare di incidenti sul lavoro e l’idea di avere una soluzione alternativa, dove dei sistemi dotati di un’intelligenza soccombono a delle attività con dei potenziali rischi, potrebbe davvero fare la differenza Non solo: tra i vari concetti che gli autori portano in questo manuale c’è una spiegazione chiara di quello che è l’intelligenza artificiale e perché siamo lontanissimi da quel futuro distopico di cui sentiamo parlare Non dobbiamo pensare infatti ad un sistema dotato di intelligenza artificiale come qualcosa che sa fare dei conti ad una velocità impressionante, riconoscere dei volti o gestire la guida di un’auto, perché l’intelligenza è ben altro L’intelligenza è visuale e spaziale, corporea, creativa, interpersonale, intrapersonale, linguistica e solo alla fine logica (vedi qui) Calcolare dei risultati è infatti solo uno dei compiti più semplici che è possibile svolgere per un sistema come quello descritto, e questo perché attraverso dei modelli matematici si possono descrivere molti dei problemi che ci troviamo a dover affrontare. La cosa che è più ho apprezzato di questo libro è la concretezza: ci sono tantissime pagine dedicate agli usi dell’AI nella società, ma senza fronzoli: nel campo medicale, nelle applicazioni per computer e nei processi meccanici. Ti è mai capitato di scrivere una mail con Gmail e trovarti dei suggerimenti in grigetto che possiamo utilizzare per velocizzare l’invio? Le frasi suggerite sono perfettamente sensate, e questo grazie all’analisi del linguaggio (qui per approfondire). E cosa c’entrano i robot? Altra confusione derivata dall’uso del concetto di intelligenza artificiale è proprio la confusione con questi sistemi: il ruolo dei robot spesso è ben diverso da quello che fa parte dell’immaginario collettivo e, come detto in precedenza, diventa fondamentale quando si mette da parte la fantascienza e si dà spazio alla messa in sicurezza dei molti professionisti che senza questi strumenti dovrebbero esporsi a rischi molto seri. L’idea chiave è semplice: la noia uccide, e non nel senso metaforico, ma anche letterale. Un essere umano può annoiarsi facilmente nell’eseguire un compito meccanico e ripetitivo, tanto da arrivare a compiere degli errori: un robot non si annoia, anzi: può eseguire uno stesso compito all’infinito senza mai stancarsi. Questa dovrebbe essere una ragione sufficiente per evidenziare il concetto che l’intelligenza artificiale dev’essere vista come un supporto e un aiuto all’attività umana, e non come una sostituzione. Tirare le somme con questo libro è facilissimo: un manuale consigliato a tutti, che evita inutili fronzoli tecnici per chi vuole farsi un’idea più chiara, ma soprattutto per chi vuole fare chiarezza su quello che ci aspetta nei prossimi decenni. Non mancano infatti riferimenti alle grandi aziende del futuro, come SpaceX e Blue Origin: non ci resta che continuare a lavorare e vedere con i nostri occhi quel che verrà. Piccola nota: for dummies non è appropriato, perché delle basi matematiche e statistiche sono necessarie per comprendere a pieno una serie di sezioni. Tuttavia, i concetti generali sono alla portata di tutti!\nLezione imparata Utilizzare in modo efficace i dati non è banale, e questo perché l’errore è dietro l’angolo; Il concetto di inverno dell’AI; Perché gli esseri umani hanno così paura dei robot: effetto uncanny valley.  Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/intelligenza-artificiale-for-dummies\/" }, "https:\/\/theredcode.it\/101-cors-policy-con-ionic-e-node\/": { "title": "101 - CORS policy con Ionic e Node", "tags": ["cors","express-js","ionic","node-js",], "content": "CORS policy con Ionic e Node: che incubo! Hai sviluppato un\u0026rsquo;app e dei servizi back-end e vuoi sapere come gestire la CORS policy?\nMettiti comod****ə e leggi questo articolo.\n Repository\nRepository App Ionic di esempio\nRepository back-end Node.js di esempio\n Breve intro A chi non è capitato di avere a che fare con lo sviluppo di un\u0026rsquo;applicazione che deve comunicare con dei servizi esterni e di vedere che tutto funziona (più o meno) perfettamente, finché non installiamo l\u0026rsquo;app sul device e\u0026hellip; Si rompe.\n Vediamo come gestire questa comunicazione nel modo più semplice possibile (per sviluppo, e non solo), in modo da portare alla luce temi come la CORS policy e la sua gestione.\n Esempio di errore di CORS policy con Ionic e Node\n In questo caso, l\u0026rsquo;app creata è estremamente semplice: permette di inserire una serie di attività da compiere o di cancellarle, il tutto grazie ad un servizio sviluppato in Node.js che comunica con un database MongoDB (se hai dubbi su come questi componenti funzionano o come crearli, controlla le risorse utili in fondo!).\n CORS policy Cos\u0026rsquo;è Si tratta di un meccanismo basato sull’utilizzo del protocollo HTTP che consente a un server di specificare una qualsiasi origine (dominio, schema o porta) oltre alla propria da cui un browser dovrebbe consentire il caricamento delle risorse; in altre parole, serve a specificare chi, in termini di dominio, ha accesso ad una certa risorsa, come ad esempio un servizio.\n Casi d\u0026rsquo;uso  Si basa su un altro meccanismo anche più vecchio: i browser effettuano una richiesta di \u0026ldquo;verifica preliminare\u0026rdquo; rispetto al contenuto che devono accedere (aka preflight) al server che ospita la risorsa, al fine di verificare che il server ne consenta la richiesta effettiva. Per rendere ancora più immediato il concetto, vediamo un esempio: supponendo di avere un dispositivo (browser o mobile che sia) con un indirizzo http://localhost:8100 (che definiamo origine) e un\u0026rsquo;API Node.js che risponde all\u0026rsquo;indirizzo http://localhost:8081 (che definiamo destinazione), se i CORS accettano qualunque tipo di request, abbiamo quanto segue:\n Caso 1: CORS in cui vengono accettate tutte le request\n Allo stesso modo, se configurassimo i servizi Node.js in modo che accettino le request solo da quelle con origine http://localhost:8100, avremmo quest\u0026rsquo;altro caso d\u0026rsquo;uso, che è abbastanza comunque quando si testa un\u0026rsquo;applicazione Ionic in locale:\n Caso 2a: CORS per cui solo http://localhost:8100 è accettata come origin, quindi il browser accede correttamente\n Caso 2b: CORS per cui solo http://localhost:8100 è accettata come origin, quindi da mobile non si accede ai servizi\n Questo è il caso più comune: come visibile nella parte superiore a sinistra dell\u0026rsquo;immagine, dove è riportato quello snippet di codice, vediamo che nella configurazione del back-end abbiamo configurato un\u0026rsquo;origine specifica per cui accettiamo le request in ingresso. Chiaramente, essendo un array, è possibile specificarne più di una e non solo: per come è stata pensata questa policy, è possibile fare riferimento anche ad altri campi inerenti l\u0026rsquo;header delle request, come il campo Access-Control-Allow-Credentials.\n Torniamo però a noi: nei casi che abbiamo appena illustrato, la soluzione sembra semplice. In effetti, lo è se abbiamo controllo sul back-end e quindi possiamo decidere in che modo modificare la gestione di questa policy.\n La stessa documentazione di Ionic suggerisce che, usando Capacitor, è possibile specificare a seconda del sistema operativo, l\u0026rsquo;origine con la quale veicolare le request.\n Per quanto sembri strano, localhost è il valore di default e funzionerà anche una volta che l\u0026rsquo;applicazione sarà disponibile negli store: questo vuol dire che se lasciassimo che il servizio Node.js accetti tutte le richieste da http://localhost, questo meccanismo funzionerebbe come un orologio svizzero anche una volta che il nostro utente avrà scaricato l\u0026rsquo;app dal suo store di riferimento.\n Documentazione ufficiale di Ionic sull\u0026rsquo;uso di Capacitor: https://ionicframework.com/docs/troubleshooting/cors\n Ma siamo sicuri\u0026hellip;?  Tuttavia, è sicuro lasciare localhost come origine? Assolutamente no (anche se\u0026hellip;)\n Come scritto nelle ultime due righe riportate nella figura precedente, localhost dovrebbe essere sostituito da un valore più consono relativo all\u0026rsquo;hostname che diventerà la nostra origine.\n Un suggerimento può essere quello di utilizzare il dominio che fa riferimento all\u0026rsquo;applicazione: se, per esempio, questa avesse un sito di riferimento come pippo.com, l\u0026rsquo;idea dovrebbe essere quella di utilizzare questa come origine.\n Per farlo, sono necessarie due modifiche: in primis, è necessario specificarlo all\u0026rsquo;interno del file capacitor.config.json in questo modo:\n { \u0026#34;appId\u0026#34;: \u0026#34;io.ionic.starter\u0026#34;, \u0026#34;appName\u0026#34;: \u0026#34;todoslist\u0026#34;, \u0026#34;bundledWebRuntime\u0026#34;: false, \u0026#34;npmClient\u0026#34;: \u0026#34;npm\u0026#34;, \u0026#34;webDir\u0026#34;: \u0026#34;www\u0026#34;, \u0026#34;plugins\u0026#34;: { \u0026#34;SplashScreen\u0026#34;: { \u0026#34;launchShowDuration\u0026#34;: 0 } }, \u0026#34;cordova\u0026#34;: {}, \u0026#34;server\u0026#34;: { \u0026#34;hostname\u0026#34;: \u0026#34;http://pippo\u0026#34; } }  Non solo: come visto in precedenza, all\u0026rsquo;interno della dichiarazione della funzione cors() nel servizio Node.js, dobbiamo aggiungere il dominio scelto tra quelli ammessi:\napp.use(cors({origin: [\u0026#39;http://pippo\u0026#39;]})) Caso 3: CORS per cui solo http://pippo è accettata come origin, quindi da mobile si accede correttamente\n Let\u0026rsquo;s test!  Per poter verificare che tutto funzioni correttamente sfruttando la nostra rete di casa, abbiamo bisogno di 2 cose: un dispositivo mobile e una connessione WiFi.\n Prima di tutto, colleghiamo il dispositivo mobile su cui installeremo l\u0026rsquo;app di sviluppo alla stessa rete dove è collegato il nostro portatile; fatto questo, verifichiamo qual è l\u0026rsquo;indirizzo del portatile nella rete locale tramite la riga di comando, con il comando ipconfig per Windows o ifconfig per sistemi GNU/Linux e macOS:\n Esempio di indirizzo IP nella rete locale\n Perfetto, l\u0026rsquo;indirizzo IPv4 è 192.168.1.64; ci aspettiamo che anche il telefono abbia un indirizzo di rete che appartiene alla stessa rete, e possiamo verificarlo tramite le impostazioni, a seconda del sistema operativo. Indicativamente, se inizia con 192.168.1.x, siamo a cavallo!\n A questo punto, modifichiamo il file che riporta l\u0026rsquo;indirizzo di base dei servizi che utilizziamo nella nostra app: in questo caso, è sufficiente modificare il valore della proprietà endpointUrl all\u0026rsquo;interno del file environment.ts in questo modo:\n export const environment = { production: true, baseURL: \u0026#39;http://192.168.1.66:8081/api\u0026#39; };  Fatto questo, siamo pronti: colleghiamo il telefono al portatile, installiamo l\u0026rsquo;app, e verifichiamo che tutto funzioni perfettamente!\n  Risorse utili Ionic 5: Guida completa per creare app per Android e iOS Ionic cheatsheet Documentazione ufficiale delle CORS policy di Ionic Post di dettaglio sul funzionamento della CORS policy nel blog Ionic Spiegazione sul funzionamento della CORS policy Articolo su come funziona uno stack MEAN ", "url": "https:\/\/theredcode.it\/101-cors-policy-con-ionic-e-node\/" }, "https:\/\/theredcode.it\/tags\/cors\/": { "title": "cors", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/cors\/" }, "https:\/\/theredcode.it\/tags\/express-js\/": { "title": "express-js", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/express-js\/" }, "https:\/\/theredcode.it\/tags\/node-js\/": { "title": "node-js", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/node-js\/" }, "https:\/\/theredcode.it\/ia\/coded-bias-e-lintelligenza-non-artificiale\/": { "title": "Coded bias e l\u0027intelligenza non artificiale", "tags": ["intelligenza-artificiale","entertainement",], "content": "Il documentario girato da Netflix e divenuto popolare negli ultimi mesi, dà una visione molto chiara su cosa sia il Coded bias e l\u0026rsquo;intelligenza non artificiale: parliamone insieme.\n Coded Bias e l\u0026rsquo;intelligenza non artificiale\n Trama   In questo documentario (disponibile dal 5 aprile scorso) si parla del funzionamento degli algoritmi di apprendimento automatico che ci sono dietro ad una serie di applicativi anche molto conosciuti, come social media, assistenti vocali e molto altro.\n Non solo: si analizzano gli effetti che questi hanno in termini di risultati: il tutto ha inizio grazie alla storia raccontata da Joy Buolamwini, un\u0026rsquo;informatica e attivista che ha scoperto e denunciato il modo in cui gli algoritmi di riconoscimento facciale utilizzati da grandi società -tra le quali figura IBM- avessero un\u0026rsquo;accuratezza inferiore nel gestire volti femminili o con pelle scura, rispetto a uomini bianchi.\nNel dettaglio\u0026hellip; Il suo studio inizia grazie al dottorato volto all\u0026rsquo;MIT Media Lab, dove progetta uno specchio che permette di vedere il riflesso della propria immagine rispetto alle proprie aspirazioni: Aspire Mirrors si basava su tecnologie quali una telecamera e un software di riconoscimento facciale che, una volta individuato il viso, proiettava sullo schermo una serie di informazioni.\n Durante il documentario, Joy mostra come questo schermo fosse in grado di rilevare una maschera bianca come volto, ma non il suo: questo perché il software di riconoscimento aveva appreso da ciò che gli era stato fornito come input, ossia un insieme di volti di maschi bianchi, piuttosto che di altro genere o etnie.\n Algoritmo pregiudicato In questo frangente nasce dunque il concetto di coded bias, che letteralmente si potrebbe tradurre come algoritmo affetto da pregiudizio. D\u0026rsquo;altronde, il computer è un sistema -attualmente- stupido e possiede un\u0026rsquo;intelligenza artificiale, ossia il frutto della nostra esperienza.\n La storia ci insegna che la società ha un passato a tratti oscuro e macabro e una parte dei dati a nostra disposizione parlano anche di queste fasi: non a caso, i dataset utilizzati contengono il risultato di un razzismo intrinseco che è frutto di decenni di (triste) storia.\n Per fortuna, per Joy questo però è un punto di svolta: il suo progetto si trasforma in un\u0026rsquo;attività tutta nuova, che prende il nome di Gender shades e che, grazie ad una sorta di lega di supereroi informatici, la Algorithmic Justice League, cerca di combattere ogni giorno questa discriminazione algoritmica in cui la cultura patriacarcale e razzista ha influenzato il risultato di alcuni algoritmi.\nIl documentario non si ferma però qui: Joy, insieme ad un\u0026rsquo;altra serie di associazioni non meno degne di nota, si occupa di trovare un dialogo con le aziende produttrici e consumatrici di questi strumenti -tra cui sempre IBM- per aprire un canale di comunicazione e tracciare una roadmap che definisca un percorso di revisione e miglioramento di questi algoritmi.\n Il tutto può sembrare banale e scontato, ma per un\u0026rsquo;azienda di quella portata, ammettere che il proprio lavoro abbia una serie di vizi non è cosa da niente: parliamo di anni di lavoro che devono essere sottoposti ad un cambiamento radicale.\n Il ruolo della matematica Tra le figure con cui Buolamwini collabora, spicca anche la matematica Cathy O\u0026rsquo;Neil, celebre per aver scritto il libro \u0026ldquo;Weapons of Math Destruction\u0026rdquo;: in quest\u0026rsquo;opera, lei denuncia l\u0026rsquo;utilizzo di questi algoritmi in processi completamente automatizzati, che invece richiedono l\u0026rsquo;intervento di un essere umano.\n Un esempio? Algoritmi decisionali che decidono in maniera precisa e puntuale quali CV sono adatti ad un certo profilo o meno, sulla base di ciò che questi file contengono; un esempio che può risultare banale, ma la realtà è che questi strumenti sono sempre più parte della nostra quotidianeità, e il tutto senza rendercene sempre conto.\n Portano come caso di studio anche la città di Londra, che per un lungo periodo ha utilizzato delle camere collegate ad un sistema centralizzato per rilevare i volti delle persone che passavano per strada e, se registrati nel database dei profili criminali, inviavano una segnalazione alla polizia, che si preoccupava di fermare il \u0026ldquo;sospetto\u0026rdquo; e chiedergli informazioni.\n Anche in questo caso, strumento utilizzato nella vita reale, ma con un grado di precisione al di sotto della media: non poche volte diverse persone sono state fermate perché scambiate per altre, come un ragazzo di 14 anni che viene fermato perché sospettato di essere criminale. Inutile dire che il ragazzo in questione era di pelle scura e che l\u0026rsquo;algoritmo aveva totalmente sbagliato persona: l\u0026rsquo;algoritmo ne ha comunque registrato il volto e rilevato le relative informazioni.\n Joy non si ferma qui: arriva a presentare i suoi lavori al Congresso degli Stati Uniti dove trova largo consenso, soprattutto da parte di politici del tutto ignari della questione: nel maggio del 2019, grazie alle lunge battaglie condotte da questi gruppi di attivisti, diverse città iniziano a bandire l\u0026rsquo;utilizzo delle tecnologie di riconoscimento facciale, soprattutto fintanto che non venga redatta una documentazione relativa alla regolamentazione che sia consona ai limiti di utilizzo.\n Aspetti interessanti  Molti degli episodi raccontati durante il documentario sono del tutto sbalorditivi, ma non in senso positivo: immaginare che l\u0026rsquo;intelligenza (non)artificiale possa essere razzista, è a dir poco lontano dall\u0026rsquo;immaginario comune e medio, quando purtroppo i fatti hanno dimostrato altro. Non solo: per tutti coloro che sono terrorizzati all\u0026rsquo;idea che un giorno i computer possano prendere decisioni al posto degli esseri umani e distruggere il mondo intero, un documentario del genere non può che rafforzare una serie di concetti.\n Certo, alcune esperienze che vengono portate come casi di studio non sono proprio positivi: basti pensare all\u0026rsquo;esperimento condotto da Microsoft con Tay, che gli costò la faccia per un bel periodo (qui i dettagli).\n In questo contesto, è infatti utile parlare di intelligenza (non) artificiale: questa intelligenza -debole, ricordiamolo- che stiamo addestrando tramite una serie di input, utilizza quello che per noi rappresenta una porzione di mondo reale: la verità è che questi algoritmi non prevedono il futuro, ma fanno una serie di predizioni sulla base del passato, ed è esattamente in questo modo che gli algoritmi contengono le stesse ideologie razziste che hanno attraversato parte della nostra storia.\n Cosa ci insegnano queste esperienze? Non solo, come scontato, che come esseri umani abbiamo ancora molto lavoro da fare, ma soprattutto che prima di poter utilizzare questi strumenti con una certa autonomia, sarebbe bene analizzarne sul lungo periodo gli effetti, senza vedere queste tecnologie come magia pura, ma piuttosto come il frutto delle nostre esperienze passate.\n Risorse utili Consigli per approfondire alcuni dei temi trattati:\n TedX di Joy intitolato \u0026ldquo;How I\u0026rsquo;m fighting bias in algorithms\u0026rdquo; (video) L\u0026rsquo;intelligenza non artificiale di Meredith Broussard (libro) Le persone non servono di Jerry Kaplan (libro) \u0026ldquo;Non sono una donna?\u0026rdquo; (video) Intelligenza artificiale for dummies (libro) Armi di distruzione matematica (libro) Voglio essere un a data scientist ", "url": "https:\/\/theredcode.it\/ia\/coded-bias-e-lintelligenza-non-artificiale\/" }, "https:\/\/theredcode.it\/tags\/entertainement\/": { "title": "entertainement", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/entertainement\/" }, "https:\/\/theredcode.it\/recensioni\/la-non-intelligenza-artificiale\/": { "title": "La Non Intelligenza Artificiale", "tags": [], "content": "Questo libro era in lista da diverso tempo, ma finalmente ho trovato il tempo per leggerlo, o meglio\u0026hellip; divorarlo! \u0026ldquo;La non intelligenza artificiale\u0026rdquo; è uno di quei libri che dovrebbe far parte di quelli obbligatori quando si intraprende questa carriera (e non solo). Vediamo perché!\nRanking Anno 2021 Autore Meredith Broussard Genere Saggio Livello Per approfondire Scorrevolezza 10 / 10 Originalità 10 / 10 Valutazione 10 / 10 Recensione Comincio con il dire che il libro è diviso in tre parti, di cui la prima è di base un\u0026rsquo;introduzione al funzionamento dei computer, dei sistemi informatici e del mondo della programmazione: può sembrare una banalità, ma ecco perché non lo è. Meredith Broussard, da brava giornalista, non dà per scontato che chi si approccia a questa tematica sia pienamente consapevole delle tematiche/terminologie che andrà ad utilizzare. Non solo: magari, chi è competente nel mondo della programmazione, non lo è nel settore dell\u0026rsquo;AI, o magari ha delle conoscenze di base, che sono sufficienti, ma non adatte a seguire a pieno il contesto trattato. E così, con delle parole estremamente semplici e degli esempi a portata di chiunque (perfino della nonna di Einstein), l\u0026rsquo;autrice ci dà un caloroso benvenuto all\u0026rsquo;interno di quest\u0026rsquo;avventura che è il mondo della tecnologia, senza dimenticare quello che è il suo mestiere e la sua formazione. Super interessante è infatti la sezione dedicata al data journalism, un mestiere che in Italia ha poco riscontro, ma che si sta affermando come professione in diversi paesi europei (per saperne di più, leggi questo articolo). Nella seconda parte passiamo al cuore del libro: perché l\u0026rsquo;intelligenza artificiale NON salverà il mondo. La missione di Meredith Broussard è infatti quella di demistificare le possibilità che i sistemi \u0026ldquo;intelligenti\u0026rdquo; prendano controllo dell\u0026rsquo;umanità fino a distruggerla. Con degli esempi banali, ma alla portata e a conoscenza di tutti -vedi gli esami di fine anno o le automobili a guida autonoma-, distrugge letteralmente uno per uno tutte quelle credenze per cui il nostro futuro sulla Terra è ormai al capolinea. Un esempio? La difficoltà che spesso si ha nel parlare di questioni informatiche tra persone non tecniche e persone che invece sono tecniche, è enorme: basti pensare che insegnare ad un bambino a riconoscere una zebra, richiede più o meno 10 minuti. Ad un computer ci potrebbero volere anche 5 anni. Spesso c\u0026rsquo;è questa credenza per cui se un computer è in grado di calcolare quale debba essere il prezzo giusto per una casa che si trova nel quartiere centrale di Milano con 3 locali, un garage e un salone openspace, allora la fine del mondo è vicina. L\u0026rsquo;intelligenza artificiale a cui viene assegnata una sorta di \u0026ldquo;intelligenza\u0026rdquo; intrinseca e frutto dell\u0026rsquo;esperienza è in realtà il risultato di addestramento che però pecca sulle questioni più banali: è impossibile infatti misurare l\u0026rsquo;intelligenza, figuriamoci per un sistema (qui qualche dettaglio!).\n Se le piccole cose non funzionano, è ingenuo pensare che le cose più complesse funzioneranno per magia.\n L\u0026rsquo;ultima parte è dedicata al futuro, per dare uno sguardo a quelle che sono le prospettive future dell\u0026rsquo;intelligenza artificiale e dei suoi livelli di applicazione. Racconta in particolare di un episodio in cui si è ritrovata a lavorare 3 giorni di fila su un autobus durante uno dei tanti hackaton che vengono organizzati nel settore. La sua idea iniziale (geniale, peraltro) di creare un\u0026rsquo;app che calcolasse quanta pizza ordinare per una festa, ha vinto l\u0026rsquo;hackaton e le ha regalato una grande lezione: la tecnologia che porta dei benefici a lungo termine, richiede un lungo periodo.\n Si tratta di una maratona, non dei 100 metri.\n Spesso, intorno al mondo della tecnologia, e ancor di più sul tema dell\u0026rsquo;intelligenza artificiale, ci sono tante storie e leggende che meritano di essere riviste. Il mondo degli hackaton poi, per chi l\u0026rsquo;ha vissuto, è un qualcosa che dà una carica assurda, stimola la creatività, allarga la rete dei contatti, ma che funziona una volta su un milione, e l\u0026rsquo;autrice lo racconta senza tanti giri di parole. Il taglio che ha questo volume è molto pratico, diretto e senza filtri: è stato bellissimo leggere di come, anche nel suo vissuto, il gender gap nell\u0026rsquo;ambito STEM abbia creato un senso di non appartenza e di disagio. E questo non vale solo in alcuni settori o ambienti: vengono citate università come Harvard, all\u0026rsquo;interno della quale alle studentesse era suggerito di seuguire corsi più facili rispetto ai ragazzi, e di come l\u0026rsquo;intero corpo docenti non contasse neanche una docente senior fino al 2009. Ogni singola pagina del libro merita di essere letta e assaporata, spesso con dell\u0026rsquo;amaro in bocca, perché l\u0026rsquo;esperienza personale dell\u0026rsquo;autrice, insieme all\u0026rsquo;uso di moltissima bibliografia che è stata ben curata, danno un punto di vista assolutamente non banale. Il sottotitolo del libro, non a caso, è \u0026ldquo;come i computer non capiscono il mondo\u0026rdquo;: non solo non ci riescono i computer, ma anche noi esseri umani abbiamo ancora molto su cui lavorare. Non a caso, l\u0026rsquo;autrice è una delle protagoniste di un documentario Netflix che parla proprio di pregiudizi: Coded Bias, per chi non l\u0026rsquo;ha visto, è un MUST per chi vuole capire come il nostro -pessimo- passato abbia influenzato quelli che definiamo \u0026ldquo;sistemi intelligenti\u0026rdquo;.\nLezione imparata   I dati sono costrutti sociali, quindi i sistemi avranno gli stessi pregiudizi che noi esseri umani abbiamo; Se qualcuno ti dice che il computer è come un cervello, no: non è affatto così; L\u0026rsquo;intelligenza artificiale potrà affiancare gli esseri umani, potrà sollevarci da una serie di compiti gravosi e anche pericolosi, ma non potrà né deve sostituire il lavoro svolto dagli esseri umani, né può assumerne il controllo.  Quotes   Occorre aver fede nel fatto che si riuscirà a inventare ciò a cui si sta lavorando e aver fede nel fatto che, alla fine, l\u0026rsquo;aspetto finanziario andrà a posto. L\u0026rsquo;ingegneria, a volte, è un elettrizzante salto nell\u0026rsquo;ignoto.\n   Se le piccole cose non funzionano, è ingenuo pensare che le cose più complesse funzioneranno per magia.\n Disponibile su Amazon\n", "url": "https:\/\/theredcode.it\/recensioni\/la-non-intelligenza-artificiale\/" }, "https:\/\/theredcode.it\/addestramento-ner-con-spacy-per-new-entry\/": { "title": "Addestramento NER con spaCy per new entry", "tags": ["intelligenza-artificiale","python",], "content": " \u0026ldquo;Addestramento NER con spaCy per new entry\u0026rdquo;: what?\n  \n Proseguiamo con il nuovo filone di articoli a tema intelligenza artificiale e parliamo di come addestrare spaCy per riconoscere nuove entità! L\u0026rsquo;ambito dell\u0026rsquo;analisi del linguaggio non è affatto nuovo -nonostante sia credenza usuale pensarlo- ed è un argomento particolarmente a me caro: il primo libro che ho pubblicato ne parla in maniera introduttiva e consiglio di darci un\u0026rsquo;occhiata per iniziare a buttare giù qualche idea.\n  Cos\u0026rsquo;è il NER  Il riconoscimento delle entità nominate (in inglese, Named Entity Recognition) è il processo di identificazione automatica delle entità presenti in un testo e di conseguente classificazione in categorie predefinite come \u0026ldquo;persona\u0026rdquo;, \u0026ldquo;organizzazione\u0026rdquo;, \u0026ldquo;posizione\u0026rdquo; e così via. La libreria spaCy ti consente di utilizzare modelli per il NER già addestrati, ma anche di aggiornarli per adattarli al contesto specifico delle informazioni a nostra disposizione, o ancora di addestrare un nuovo modello da zero.\n La realtà è che questi modelli sono molto sviluppati in inglese e possono riconoscere date, eventi, lingue, località, numeri, percentuali, organizzazioni, persone, prodotti, quantità e molto altro, ma non lo sono in lingue come l\u0026rsquo;italiano: il numero di entità riconosciute si conta con una sola mano. Per averlo chiaro, vediamo come dovrebbe funzionare_,_ e come invece funziona:\n Come dovrebbe funzionare il NER\n Come invece funziona\n Ma facciamo un passo alla volta: vediamo in che modo questo modello funziona e come utilizzarlo!\n Come funziona  Per far sì che venisse fuori un risultato come quello precedente, i passi sono davvero semplici: per prima cosa, è necessario avere una versione di Python 3.x e, nel nostro caso, aver scaricato il modello per l\u0026rsquo;italiano: sempre tramite il sito di spaCy, è possibile scegliere quale modello utilizzare a seconda della lingua e del tipo di lavoro da effettuare. Nel nostro caso, andremo ad utilizzare il modello più grande denominato it_core_news_ls.\n python -m spacy download it_core_news_lg  Piccola precisazione: è possibile anche partire da zero, costruendo un modello da zero, ma non è questo il caso: noi vogliamo piuttosto integrare delle informazioni in quello disponibile.\n Dopo averlo scaricato grazie al precedente comando, passiamo al funzionamento: lo vado a caricare tramite la funzione di spaCy load e, partendo da un semplice file di testo che contiene il testo che vogliamo classificare, andiamo a stampare per ogni entità riconosciuta, l\u0026rsquo;etichetta assegnata:\n import spacy\nCarico modello precedente nlp = spacy.load(\u0026lsquo;it_core_news_lg\u0026rsquo;)\nwith open(\u0026lsquo;articolo.txt\u0026rsquo;) as file: article = file.read()\nApplico modello su file doc = nlp(article) for ent in doc.ents: print(ent.text, ent.label_)\n  Come vediamo, il risultato è abbastanza buono: riconosce Franco Battiato e Francesco Battiato come persone, Riposto e Ionia come luoghi, e via dicendo. Considerando che si tratta di un testo abbastanza semplice, quello che ci viene restituito è accettabile.\n E se invece del testo sulla biografia di Franco Battiato (buon viaggio, maestro!), volessimo poter etichettare delle nuove entità? Abbiamo visto che per l\u0026rsquo;italiano, le possibilità sono poche: luoghi, organizzazioni, persone o altre entità che vengono (spesso erroneamente) categorizzate come \u0026ldquo;miscellaneous\u0026rdquo;.\n Come aggiornare il modello  Ad esempio, proviamo a mettere il nostro modello in grado di riconoscere il cibo: l\u0026rsquo;esempio che andremo ad esaminare è volutamente semplice, perché serve a rendere l\u0026rsquo;idea del lavoro da svolgere per arrivare ad un buon risultato, ma è altrettanto semplice estenderlo.\n Per prima cosa, raccogliamo in un file di testo una decina di frasi che parlino di cibo, in questo modo:\n Ho comprato del latte. Federico adora la cioccolata. Io e mio cugino andiamo matti per le lasagne. Per preparare la pasta, è sufficiente mettere una pentola d\u0026rsquo;acqua sul fuoco\u0026hellip; Per preparare il tiramisù, hai bisogno di\u0026hellip; I savoiardi dovranno essere imbevuti di caffè e poi adagiati in una pirofila. Il gelato alla nocciola è il mio preferito. Hai mai assaggiato le lasagne al pesto? Per cena cucinerò della pasta. Non mi va di cucinare stasera. Ordiniamo della pizza?\n Questi sono esempi scritti a mano, ma sarebbe opportuno avere un vero dataset, che sia molto più completo e ampio: su questo argomento ci torneremo un\u0026rsquo;altra volta. Fatto questo, andiamo a creare un oggetto fatto in questo modo:\n TRAIN_DATA = [ (\u0026ldquo;Prima di tutto dividete i tuorli dagli albumi e metteteli in due ciotole diverse.\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(27, 33, \u0026ldquo;ALIMENTO\u0026rdquo;), (40, 46, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Unite un cucchiaio di zucchero\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(22, 30, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;unire il mascarpone\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(9, 19, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;mescolare le uova\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(13, 17, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;ricopritela con uno strato di savoiardi imbevuti nella bagna\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(30, 39, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Mescolate con il liquore al caffè\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(18, 25, \u0026ldquo;ALIMENTO\u0026rdquo;), (29, 34, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Usare lo sbattitore\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: []}), (\u0026ldquo;Mangiare la pizza una volta a settimana è d\u0026rsquo;obbligo\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(12, 17, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Ho comprato del latte.\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(17, 22, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Marco adora la cioccolata.\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(16, 26, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Io e mio cugino andiamo matti per le lasagne.\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(38, 45, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Per preparare la pasta, è sufficiente mettere una pentola d\u0026rsquo;acqua sul fuoco\u0026hellip;\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(18, 23, \u0026ldquo;ALIMENTO\u0026rdquo;), (61, 66, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Per preparare il tiramisù, hai bisogno di\u0026hellip;\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(18, 26, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;I savoiardi dovranno essere imbevuti di caffè e poi adagiati in una pirofila.\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(3, 12, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Il gelato alla nocciola è il mio preferito.\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(4, 10, \u0026ldquo;ALIMENTO\u0026rdquo;), (16, 24, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Hai mai assaggiato le lasagne al pesto?\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(23, 30, \u0026ldquo;ALIMENTO\u0026rdquo;), (34, 39, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Per cena cucinerò della pasta.\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(20, 25, \u0026ldquo;ALIMENTO\u0026rdquo;)]}), (\u0026ldquo;Non mi va di cucinare stasera. Ordiniamo della pizza?\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(47, 53, \u0026ldquo;ALIMENTO\u0026rdquo;)]})\n]\n Si tratta di un array di tuple, dove ogni tupla è costituita da una stringa rappresentante la frase da cui imparare, mentre la seconda parte rappresenta le entità: queste sono a loro volta definite tramite un array che ne stabilisce la posizione dell\u0026rsquo;oggetto che vogliamo il nostro modello impari e l\u0026rsquo;etichetta che vogliamo assegnargli; infatti, nel caso nella nostra frase ci siano più alimenti, è bene segnalarli tutti.\n (\u0026ldquo;Prima di tutto dividete i tuorli dagli albumi e metteteli in due ciotole diverse.\u0026rdquo;, {\u0026ldquo;entities\u0026rdquo;: [(27, 33, \u0026ldquo;ALIMENTO\u0026rdquo;), (40, 46, \u0026ldquo;ALIMENTO\u0026rdquo;)]}),\n Fatto questo, andiamo ad aggiungere le varie entità all\u0026rsquo;interno delle labels a disposizione del modello di riconoscimento, in questo modo:\n for _, annotations in TRAIN_DATA: for ent in annotations.get(\u0026ldquo;entities\u0026rdquo;): ner.add_label(ent[2])\n Arriviamo al cuore dell\u0026rsquo;attività: dobbiamo addestrare ed aggiornare il nostro modello. Per farlo, andremo ad eseguire 30 iterazioni (o epoche) in cui, per ognuna di queste, i dati saranno rimescolati e andremo a calcolare i valori in termini di losses: significa che utilizzeremo un dizionario per mantenere le informazioni relative alle \u0026ldquo;perdite\u0026rdquo; rispetto a ciascun componente della pipeline. In altre parole, l\u0026rsquo;addestramento è un processo iterativo basato su reti neurali in cui le previsioni del modello vengono confrontate man mano che questo avviene, per poter stimare quello che si chiama gradiente. Questo viene infatti utilizzato per calcolare il valore dei pesi attraverso la retropropagazione degli errori. I gradienti indicano come modificare i valori di peso in modo che le previsioni del modello diventino più simili alle etichette da assegnare. Ma mano che i valori di loss diminuiscono, il nostro modello è sempre più vicino all\u0026rsquo;esser pronto a lavorare per noi!\n   Non ti preoccupare: se questi concetti non ti sono chiari, troverai delle risorse utili alla fine dell\u0026rsquo;articolo per approfondire questi aspetti.\n Inoltre, utilizzeremo i batch, che sono molto utili quando si deve suddividere l\u0026rsquo;input iniziale in gruppi più piccoli: in questo caso, utilizzeremo 2 coppie di frasi (vedi riga con parametro size=2) per ogni minibatch.\n Per ogni frase contenuta nel nostro insieme di addestramento di partenza e per ogni gruppo di entità, andremo a creare un oggetto Example: questo strumento appartenente sempre alla libreria di spaCy è fondamentale per creare gli oggetti con cui il modello potrà \u0026ldquo;aggiornarsi\u0026rdquo;, e lo farà grazie alla funzione update. Ultimo, non ultimo, il valore di drop: questo rappresenta il cosiddetto dropout rate e si tratta di una tecnica che usano le reti neurali per ridurre l\u0026rsquo;eccessivo adattamento all\u0026rsquo;insieme di addestramento. Può infatti succedere che il modello impari troppo alla lettera dagli esempi che gli forniamo e quindi non sappia generalizzare: in questo caso, sarebbe utile come un pappagallo a cui insegnamo a dire \u0026ldquo;cioccolato\u0026rdquo;!\n Il valore per il dropout di default è di 0.2: questo vuol dire che il 20% dei neuroni utilizzati nel modello verrà eliminato in maniera casuale dall\u0026rsquo;addestramento, per rendere più robusto il modello. In questo caso, impostiamo a 0.3, visto che il nostro dataset iniziale è molto piccolo:\n # Import delle librerie import random from spacy.util import minibatch, compounding from pathlib import Path from spacy.training import Example\nAddestramento del modello with nlp.disable_pipes(*unaffected_pipes): # Per 30 iterazioni for iteration in range(30):\n # Shuffle dei dati prima di ogni iterazione random.shuffle(TRAIN\\_DATA) losses = {} batches = minibatch(TRAIN\\_DATA, size=compounding(4.0, 32.0, 1.001)) for batch in spacy.util.minibatch(TRAIN\\_DATA, size=2): for text, annotations in batch: # Creo l'oggetto example doc = nlp.make\\_doc(text) example = Example.from\\_dict(doc, annotations) # Aggiorno il modello nlp.update(\\[example\\], losses=losses, drop=0.3) print(\u0026quot;Losses\u0026quot;, losses)  Una volta che il nostro modello è stato creato, andiamo a salvarlo: in questo modo, sarà possibile utilizzarlo come base di partenza, proprio come abbiamo fatto all\u0026rsquo;inizio sfruttando quello già disponibile chiamato it_core_news_lg: lo salviamo all\u0026rsquo;interno della cartella ner e lo carichiamo nuovamente, per andarlo a testare.\n doc = nlp(\u0026ldquo;Il tiramisù richiede il mascarpone\u0026rdquo;) print(\u0026ldquo;Entità:\u0026rdquo;, [(ent.text, ent.label_) for ent in doc.ents])\nSalvo il modello output_dir = Path(\u0026rsquo;/ner/\u0026rsquo;) nlp.to_disk(output_dir) print(\u0026ldquo;Salvato nella cartella: \u0026ldquo;, output_dir)\n  Test  Così come abbiamo fatto con il primo step, carichiamo tramite la funzione load di spaCy il modello e poi andiamo ad inserire delle frasi nuove, per vedere come lavora:\n # Carico modello print(\u0026ldquo;Carico modello dalla cartella: \u0026ldquo;, output_dir) nlp_updated = spacy.load(output_dir) doc = nlp_updated(\u0026ldquo;Amo il tiramisù con i savoiardi e la pizza con la mozzarella\u0026rdquo;) print(\u0026ldquo;Entità:\u0026rdquo;, [(ent.text, ent.label_) for ent in doc.ents])\ndoc = nlp_updated(\u0026ldquo;Per preparare le tagliatelle, ci vuole la farina\u0026rdquo;) print(\u0026ldquo;Entità:\u0026rdquo;, [(ent.text, ent.label_) for ent in doc.ents])\ndoc = nlp_updated(\u0026ldquo;Marco adora la marmellata\u0026rdquo;) print(\u0026ldquo;Entità:\u0026rdquo;, [(ent.text, ent.label_) for ent in doc.ents])\n Andiamo ad eseguire e\u0026hellip;\n Losses {\u0026rsquo;ner\u0026rsquo;: 13.718762298731333} Losses {\u0026rsquo;ner\u0026rsquo;: 3.8097394014000354} Losses {\u0026rsquo;ner\u0026rsquo;: 3.809832848429478} Losses {\u0026rsquo;ner\u0026rsquo;: 5.24418013019176} Losses {\u0026rsquo;ner\u0026rsquo;: 5.251497398704705} Losses {\u0026rsquo;ner\u0026rsquo;: 5.252461936261976} Losses {\u0026rsquo;ner\u0026rsquo;: 5.252638007338877} Losses {\u0026rsquo;ner\u0026rsquo;: 7.138335501468781} Losses {\u0026rsquo;ner\u0026rsquo;: 10.640419887586425} Losses {\u0026rsquo;ner\u0026rsquo;: 10.643248762972322} Losses {\u0026rsquo;ner\u0026rsquo;: 1.9226063930241843} Losses {\u0026rsquo;ner\u0026rsquo;: 3.5654583980540644} Losses {\u0026rsquo;ner\u0026rsquo;: 5.100164967156944} Losses {\u0026rsquo;ner\u0026rsquo;: 6.197872385207523} \u0026hellip; Losses {\u0026rsquo;ner\u0026rsquo;: 0.0012744452799972822} Losses {\u0026rsquo;ner\u0026rsquo;: 0.001274446825658949} Losses {\u0026rsquo;ner\u0026rsquo;: 0.0012744472823863233} Losses {\u0026rsquo;ner\u0026rsquo;: 0.0013462597426898537} Entità: [(\u0026lsquo;mascarpone\u0026rsquo;, \u0026lsquo;ALIMENTO\u0026rsquo;)] Salvato nella cartella: \\ner Carico modello dalla cartella: \\ner Entità: [(\u0026lsquo;savoiardi\u0026rsquo;, \u0026lsquo;ALIMENTO\u0026rsquo;), (\u0026lsquo;pizza\u0026rsquo;, \u0026lsquo;ALIMENTO\u0026rsquo;), (\u0026lsquo;mozzarella\u0026rsquo;, \u0026lsquo;ALIMENTO\u0026rsquo;)] Entità: [(\u0026lsquo;farina\u0026rsquo;, \u0026lsquo;ALIMENTO\u0026rsquo;)] Entità: [(\u0026lsquo;marmellata\u0026rsquo;, \u0026lsquo;ALIMENTO\u0026rsquo;)]\n Da notare una cosa: parole come \u0026ldquo;farina\u0026rdquo;, \u0026ldquo;mozzarella\u0026rdquo; e \u0026ldquo;marmellata\u0026rdquo; non erano incluse nell\u0026rsquo;insieme di addestramento, ma sono state etichettate correttamente: questo perché il modello non viene addestrato a riconoscere le parole esatte, piuttosto impara a dedurne il contesto e quindi a trarre conclusioni su quali parole possano corrispondere a quella categoria, in modo da poter generalizzare il suo uso\u0026hellip; ed è questa la parte incredibile!\n  Risorse utili Analisi del linguaggio con Python (libro) Repository GitHub Guida from zero to hero (EN): spaCy 101 Le reti neurali in 5 minuti (video) Intelligenza artificiale for dummies (libro) Machine learning for dummies (libro) Python: guida completa (libro) ", "url": "https:\/\/theredcode.it\/addestramento-ner-con-spacy-per-new-entry\/" }, "https:\/\/theredcode.it\/esplorando-il-dockerfile\/": { "title": "Esplorando il Dockerfile", "tags": ["design-dev","docker",], "content": "Finora abbiamo sempre parlato di Docker, ma senza entrare nel dettaglio in merito a cosa succede quando andiamo a farlo funzionare: oggi, esplorando il Dockerfile, cerchiamo di riprendere un po\u0026rsquo; di concetti lasciati da parte e di chiarirne il funzionamento con alcuni esempi.\n Introduzione  Il Dockerfile è alla base della creazione di immagini Docker: per chi ne ha una vaga idea, si tratta di un file di testo che contiene un elenco di comandi (o più genericamente istruzioni) e descrive il modo in cui un\u0026rsquo;immagine Docker viene costruita: un\u0026rsquo;analogia che mi piace spesso fare è quella di paragonare il Dockerfile ad una sorta di ricetta che contiene tutti gli ingredienti del nostro piatto. Una volta che abbiamo bisogno di preparare il nostro piatto, ci basta prendere la ricetta ed \u0026ldquo;avviarne\u0026rdquo; il procedimento, per creare il nostro container.\nVediamo però com\u0026rsquo;è formato, cosa produce e cosa c\u0026rsquo;è dietro le quinte...\n Struttura di un Dockerfile  Un Dockerfile inizia sempre con un comando FROM che indica l\u0026rsquo;immagine di partenza che il container andrà ad utilizzare; infatti, i comandi successivi nel file vengono eseguiti all\u0026rsquo;interno dell\u0026rsquo;immagine di base che deve essere un\u0026rsquo;immagine valida.\nUn esempio di Dockerfile di un\u0026rsquo;applicazione Angular è il seguente:\n # Immagine di base FROM node:16.0.0\nCartella di lavoro WORKDIR \u0026lsquo;/app\u0026rsquo;\nCopia dell\u0026rsquo;elenco dipendenze COPY package.json .\nInstallazione delle dipendenze RUN npm install\nCopia dell\u0026rsquo;applicazione COPY . .\nPorta in ascolto EXPOSE 4200\nAvvio dell\u0026rsquo;applicazione CMD [\u0026ldquo;npm\u0026rdquo;, \u0026ldquo;start\u0026rdquo;]\n (P.s.: se vuoi saperne di più, leggi questo articolo!)\nIn questo caso, l\u0026rsquo;immagine di base è quella di Ubuntu (indicata dalla riga con l\u0026rsquo;istruzione FROM), e poi vengono descritti i vari passaggi che richiede l\u0026rsquo;esecuzione dell\u0026rsquo;applicazione: copia delle dipendenze, installazione, e via dicendo. Ora che ho tutto pronto, cosa faccio?\n Come funziona il contesto  Grazie al concetto di contesto, posso effettuare la build dell\u0026rsquo;immagine: eseguendo infatti il seguente comando all\u0026rsquo;interno della stessa cartella dove è stato salvato il Dockerfile, Docker costruisce il container finale seguendo passo passo le istruzioni che abbiamo inserito all\u0026rsquo;interno della nostra ricetta.\n $ docker image build .\n Una nota importante qui è che la build viene eseguita dal daemon Docker, quindi l\u0026rsquo;intero contesto (la cartella in cui si trova il Dockerfile e all\u0026rsquo;interno del quale andiamo ad eseguire il comando) viene trasferito al daemon. Dall\u0026rsquo;output del comando riportato in precedenza, questo è quanto viene mostrato:\n Dimensione del contesto trasferito\n Come avrai notato, l\u0026rsquo;output indica anche quanti dati vengono trasferiti (25MB nell\u0026rsquo;esempio) grazie al contesto; questo perché l\u0026rsquo;applicazione dispone di diversi componenti e, come la maggior parte delle applicazioni in Angular, l\u0026rsquo;applicazione pesa diversi MB.\n Pertanto, un avviso importante ai telespettatori: MAI utilizzare la directory root come contesto poiché fa sì che la build trasferisca l\u0026rsquo;intero contenuto del tuo disco rigido al daemon Docker.\n No, non è uno scherzo: il path specificato come contesto definisce dove trovare i file per i riferimenti sul contesto da utilizzare nel processo di build del daemon Docker; ciò significa che vengono inviati tutti i file presenti nel contesto, non solo quelli elencati in un\u0026rsquo;eventuale istruzione ADD nel Dockerfile. Il trasferimento del contesto dalla macchina locale al daemon Docker è specificato proprio dalle righe \u0026ldquo;Transferring context\u0026rdquo; o \u0026ldquo;Sending build context\u0026rdquo;.\n E i layers?  Abbiamo detto che il daemon Docker, quando crea la tua immagine, esegue passo passo quanto definito nel Dockerfile. In ogni passaggio viene generato un container intermedio e l\u0026rsquo;istruzione viene eseguita all\u0026rsquo;interno del container generato; una volta che l\u0026rsquo;istruzione ha esito positivo, il container viene memorizzato come una nuova immagine, come nuovo layer. Vuol dire che l\u0026rsquo;istruzione successiva ne costruirà un\u0026rsquo;altra nuova sopra quella precedente.\nDiamo una rapida occhiata all\u0026rsquo;output completo della creazione del Dockerfile di esempio:\n $ docker image build . [+] Building 94.8s (10/10) FINISHED =\u0026gt; [internal] load build definition from Dockerfile 0.1s =\u0026gt; =\u0026gt; transferring dockerfile: 174B 0.0s =\u0026gt; [internal] load .dockerignore 0.0s =\u0026gt; =\u0026gt; transferring context: 57B 0.0s =\u0026gt; [internal] load metadata for docker.io/library/node:16.0.0 2.3s =\u0026gt; [1/5] FROM docker.io/library/node:16.0.0@sha256:25516f3de85ebf588e29d81052495d2e1177b55cddbd7ddab2f5ff2c4496dd5e 0.3s =\u0026gt; =\u0026gt; resolve docker.io/library/node:16.0.0@sha256:25516f3de85ebf588e29d81052495d2e1177b55cddbd7ddab2f5ff2c4496dd5e 0.0s =\u0026gt; =\u0026gt; sha256:2b67c5888e26a4427faec4741c9db1445df567c3bd76bc35c59a39f83ba75ba1 2.21kB / 2.21kB 0.0s =\u0026gt; =\u0026gt; sha256:25516f3de85ebf588e29d81052495d2e1177b55cddbd7ddab2f5ff2c4496dd5e 1.21kB / 1.21kB 0.0s =\u0026gt; =\u0026gt; sha256:6817534de6bde9d1425d176fa9c71177eec84b5e4269c0b92a6f71a8edb82567 7.79kB / 7.79kB 0.0s =\u0026gt; [internal] load build context 0.3s =\u0026gt; =\u0026gt; transferring context: 24.93MB 0.3s =\u0026gt; [2/5] WORKDIR /app 0.1s =\u0026gt; [3/5] COPY package.json . 0.0s =\u0026gt; [4/5] RUN npm install 81.6s =\u0026gt; [5/5] COPY . . 0.2s =\u0026gt; exporting to image 10.2s =\u0026gt; =\u0026gt; exporting layers 10.2s =\u0026gt; =\u0026gt; writing image sha256:c4d6da5125d6ceee71148f84787fdabcfbb0a14b1eb7007240034b6ad1e24a25\n Infatti un\u0026rsquo;immagine Docker è composta da diversi livelli, o layers: ogni container è un\u0026rsquo;immagine con un livello leggibile e scrivibile che viene posto sopra un gruppo di livelli di sola lettura. Questi livelli (chiamati anche immagini intermedie) vengono generati quando i comandi nel Dockerfile vengono eseguiti durante il processo di build dell\u0026rsquo;immagine Docker.\nCome mostrato nell\u0026rsquo;output precedente, quando Docker crea il container a partire dal Dockerfile, ogni passaggio corrisponde a un comando eseguito nel Dockerfile e ogni livello è costituito dal file generato dall\u0026rsquo;esecuzione di quel comando. Insieme a ogni passaggio, il livello creato è elencato e rappresentato dal suo digest generato casualmente (ad esempio, il digest del livello per il passaggio 1 è 6817534de6bde9d1425d176fa9c71177eec84b5e4269c0b92a6f71a8edb82567).\n In questo caso, ci sono 5 passaggi riportati nell\u0026rsquo;output perché ci sono 5 righe di istruzioni nel Dockerfile (escludendo i commenti, ovviamente). Dopo aver completato tutti i passaggi, l\u0026rsquo;immagine verrà visualizzata nell\u0026rsquo;output del comando seguente:\n $ docker images\nREPOSITORY TAG IMAGE ID CREATED SIZE myimage 0.0.1 f6c0798a113c 5 minutes ago 1.5GB\n E se volessimo vedere come è stata costruita la nostra immagine? Eseguiamo il comando docker history :\n History dell\u0026rsquo;immagine appena creata\n Vediamo che nella colonna IMAGE ci sono due valori, ossia una stringa alfanumerica (che corrisponde ad un ID) e una serie di . Ognuna di queste righe riporta anche l\u0026rsquo;istruzione che ha generato quell\u0026rsquo;immagine e la dimensione\u0026hellip; ma cosa rappresenta quel missing?\n Sembra molto più complicato di quanto non sia: storicamente parlando (prima di Docker v1.10), ogni volta che veniva creato un nuovo layer come risultato di un\u0026rsquo;azione, Docker creava anche un\u0026rsquo;immagine corrispondente, identificata da un codice UUID a 256 bit generato casualmente, indicato come ID dell\u0026rsquo;immagine; storicamente si parlava infatti di immagini intermedie, senza tag \u0026ldquo;human-friendly\u0026rdquo;.\nA partire da Docker 1.10, immagini e livelli non sono più sinonimi: invece, un\u0026rsquo;immagine fa riferimento direttamente a uno o più layer che alla fine contribuiscono al filesystem di un container.\nNella colonna IMAGE il termine significa proprio questo: quelle non sono immagini, ma livelli e sono parti costitutive dell\u0026rsquo;immagine.\n  Che diavolo, perché la colonna si chiama così?\nIn realtà, quando viene eseguito il commit di un layer durante la creazione di un\u0026rsquo;immagine, viene creata contemporaneamente un\u0026rsquo;immagine \u0026ldquo;intermedia\u0026rdquo; e, proprio come tutte le altre immagini, ha un elemento di configurazione che è rappresentato da un elenco dei digest che devono essere incorporati come parte dell\u0026rsquo;immagine, e il suo ID contiene un hash dell\u0026rsquo;oggetto di configurazione. Le immagini intermedie non sono contrassegnate con un nome, ma hanno una chiave \u0026ldquo;Parent\u0026rdquo;, che contiene l\u0026rsquo;ID dell\u0026rsquo;immagine principale.\nQuindi, in realtà, quando costruisci localmente, quei layer sono immagini (proprio come erano una volta, anche quando li andavamo ad estrarre da qualche altra parte nella versione precedente descritta) e sono usati per facilitare il processo di cache (parte che rende veloci le build se hai già costruito quel livello).\nQuindi la risposta è \u0026hellip; a volte sono immagini (tecnicamente), a volte sono livelli (e quindi rappresentati in quella colonna come ).\n A tutta cache!  Se andassimo ad eseguire nuovamente il comando di build, vedremmo che i tempi sono notevolmente diminuiti:\n Esempio di uso della cache\n Noterai \u0026ldquo;CACHED\u0026rdquo; in ogni passaggio, il che indica che il daemon Docker ha utilizzato la cache direttamente per generare l\u0026rsquo;immagine intermedia invece di ricostruirla.\nLa cache viene utilizzata quando le istruzioni nel Dockerfile sono uguali o invariate rispetto alla versione precedente, ed è molto utile quando l\u0026rsquo;immagine di cui dobbiamo effettuare la build è corposa.\n Ad ogni occorrenza di un comando RUN nel Dockerfile, Docker creerà e committerà un nuovo layer nell\u0026rsquo;immagine, che è solo un insieme di directory strettamente accoppiate piene di varie strutture di file che comprendono un\u0026rsquo;immagine Docker. In un\u0026rsquo;installazione predefinita, questi si trovano in /var/lib/docker (questo non vale per Docker Desktop).\nDurante una nuova build, tutte queste strutture devono essere create e scritte su disco: è qui che Docker memorizza le immagini di base. Una volta creato, il container (e i successivi nuovi) verrà archiviato nella cartella in questa stessa area.\n Cosa rende importante la cache? Se gli oggetti sul filesystem che Docker sta per produrre rimangono invariati tra le build, riutilizzare la cache di una build precedente sull\u0026rsquo;host è un grande risparmio di tempo -basti pensare che la differenza in termini di tempo dei due processi di build precedenti è di un minuto e mezzo contro 2 secondi quando ci si avvale della cache-.\nTuttavia, quella cache viene utilizzata in modo piuttosto aggressivo e può causare problemi quando si desidera che l\u0026rsquo;output aggiornato di un comando RUN venga inserito nel nuovo container . Allo stato attuale, a meno che il comando RUN non cambi (e quindi invalidi la cache su host di Docker), Docker riutilizzerà i risultati precedenti dalla cache; ciò è chiaramente svantaggioso quando il comando RUN è un checkout del codice sorgente, come ad esempio avviene per il clone di un progetto Git.\n Fortunatamente, ci sono un paio di modi per aggirare questo problema: in primis, è possibile eseguire una build Docker con l\u0026rsquo;opzione \u0026ldquo;-no-cache\u0026rdquo;, che ignora completamente tutta la cache a disposizione e quindi per ogni processo di build sarà necessario tanto tempo quanto la prima.\nQuesto approccio è chiaramente binario: o usi la cache o no, e quindi rappresenta un approccio molto drastico.\nPer ottenere lo stesso risultato, ma sfruttando comunque la cache, si potrebbero inserire delle operazioni di controllo del codice sorgente nell\u0026rsquo;ultima istruzione di RUN nel Dockerfile, assicurandoci che venga eseguita ogni volta: basta racchiudere la build in un altro script che genera un mini-script con numero univoco per l\u0026rsquo;operazione di clonazione.\n  Questo passaggio inserirà l\u0026rsquo;invocazione di quello script nel Dockerfile che viene generato al volo appena prima del processo di build, di modo tale che per l\u0026rsquo;operazione che deve essere eseguita ogni volta - in questo caso, il clone del progetto - la sua istruzione RUN sia davvero unica.\n  Risorse utili Manuale Docker in italiano Docker cheatsheet Dockerfile cheatsheet Guida sulla differenza immagine vs. layer Come installare Docker (e Docker Compose) ", "url": "https:\/\/theredcode.it\/esplorando-il-dockerfile\/" }, "https:\/\/theredcode.it\/tags\/api\/": { "title": "api", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/api\/" }, "https:\/\/theredcode.it\/come-costruire-un-api-gateway-con-express\/": { "title": "Come costruire un API Gateway con Express", "tags": ["api","express-js","gateway","node-js",], "content": " Hai bisogno di sapere come costruire un API Gateway con Express, ma non sai come fare? Nessun problema. Chiariamo il concetto di API gateway e poi vediamo come realizzarne uno, oppure quali tra gli strumenti già esistenti è possibile (e consigliato usare).\n  Cos\u0026rsquo;è un API gateway  Funzionamento dell\u0026rsquo;API gateway con due o più microservizi\n Un API gateway è un componente che accetta tutte le request API dai client e quindi le instrada al microservizio appropriato attraverso il routing, la composizione e il protocollo appropriato. In altre parole, è un servizio che permette di gestire più richieste a servizi diversi, occupandosi di prendere in carico le chiamate e \u0026ldquo;smistarle\u0026rdquo; al microservizio giusto, determinando il percorso migliore. Può occuparsi anche della traduzione tra protocolli Web e protocolli non compatibili con l\u0026rsquo;applicazione del client (come AMQP o WebSocket).\n Inoltre, l\u0026rsquo;API gateway è un vero e proprio pattern: è consigliato se si desidera progettare e creare applicazioni basate su microservizi complessi o di grandi dimensioni con più applicazioni client che devono accedere ad una serie di servizi. Lo scopo è simile a quello del pattern cosiddetto facade: in questo caso però, costituisce un proxy inverso all\u0026rsquo;interno di un sistema e utilizza un modello di comunicazione sincrono.\n Un API gateway fornisce un singolo endpoint o URL che le applicazioni client possono utilizzare e mappa internamente le richieste ai microservizi appropriati; questo fornisce quindi un livello di astrazione maggiore, nascondendo alcuni dettagli di implementazione (ad esempio, il modo in cui la richiesta verrà gestita), oltre a funzionalità aggiuntive come piani di sottoscrizione (chi può interrogare una serie di servizi e fino a quando) o trasformazioni dell\u0026rsquo;input e dell\u0026rsquo;output, o ancora gestione dei logs e degli errori.\n In questo articolo, il nostro API gateway fungerà semplicemente da gateway tra i client e i nostri servizi.\n  Step-by-step  Creazione del progetto Express Gateway Per creare un progetto con Express Gateway, è necessario installare Node.js ed Express Gateway; una volta fatto, è possibile usare questo comando per creare un progetto che ci permetta di scrivere la nostra applicazione:\n $ eg gateway create\n Verrà generato un progetto con i seguenti file:\n File generati dal comando precedente\n Chiaramente, dovremo avere a disposizione uno (o più) servizi con il quale il nostro gateway dovrà interagire. All\u0026rsquo;interno di questo articolo, andremo ad utilizzare questo repository, che offre un servizio di memorizzazione delle attività di una TODO list, ma nulla esclude che il nostro gateway possa in futuro aggiungere altri servizi e fornire un unico punto di accesso!\nConfigurazione del gateway Per creare dei servizi manutenibili, esiste il file gateway.config.yml, che permette di definire un elenco di API che il gateway deve andare ad interrogare quando riceve una richiesta da un client.\n Quando creiamo un progetto ex-novo, il file ha il seguente aspetto:\n Andiamo a modificare le seguenti voci: per prima cosa, definiamo nella riga 6 all\u0026rsquo;interno della proprietà apiEndpoints una nuova API che il nostro gateway andrà ad esporre, ossia tasksApi: a partire dall\u0026rsquo;indirizzo localhost (il nostro gateway si trova in locale, al momento), mapperà tutti i path sotto /tasks* (vedere la definizione all\u0026rsquo;interno del file di routing del singolo microservizio), sfruttando il servizio che andiamo a definire subito dopo, all\u0026rsquo;interno di serviceEndpoints:\n apiEndpoints: tasksApi: host: localhost paths: \u0026lsquo;/tasks*\u0026rsquo; serviceEndpoints: tasksService: url: \u0026lsquo;http://localhost:8081/api\u0026rsquo;\n Anche i servizi sono esposti su localhost, ma sulla porta 8081: nel caso del gateway, andremo ad utilizzare la porta 8080, definendo questa regola all\u0026rsquo;inizio del file:\n http: port: 8080\n L\u0026rsquo;oggetto pipelines ci permette di definire in che modo il gateway deve cablare gli endpoint dell\u0026rsquo;API e il servizio: in questo caso, ne creiamo una ad hoc chiamata tasks che utilizza l\u0026rsquo;API endpoint definito in precedenza e stabilisce a quale servizio deve fare riferimento quando riceve una request:\n pipelines:\n name: tasks apiEndpoints: tasksApi policies: proxy: action: serviceEndpoint: tasksService changeOrigin: true   Testiamo su Postman Per assicurarci che la nostra API funzioni correttamente, possiamo testarla con Postman (o qualunque altro strumento).\n Quello che avremmo fatto in precedenza, utilizzando il microservizio, sarebbe stato di effettuare una chiamata come quella riportata in figura, dove interroghiamo direttamente il servizio attraverso la sua porta:\n Chiamata al microservizio\n Invece, adesso disponiamo di un gateway che ci permette di reindirizzare correttamente le request, utilizzando un\u0026rsquo;unica porta (la 8080):\n Chiamata al microservizio attraverso il gateway\n Abbiamo raggiunto il nostro obiettivo configurando un solo microservizio: se ne volessimo aggiungere altri 10? Sarebbe sufficiente modificare il file seguendo gli step visti in precedenza per ogni nuovo microservizio, ed il gioco è fatto!\n Definire un customer API  Express Gateway offre anche la possibilità di definire dei customer, ossia degli utenti che sono autorizzati ad utilizzare l\u0026rsquo;API, e questo ci permette di mettere in sicurezza i nostri servizi.\n Per creare un nuovo consumer, eseguiamo la seguente request sulla porta 9876 (che viene utilizzata per la gestione amministrativa):\n Creazione di un consumer\n Una volta inserite le informazioni, dobbiamo specificare che la nostra API ha bisogno di una chiave di autenticazione, e lo facciamo in questo modo: inseriamo all\u0026rsquo;interno dell\u0026rsquo;attributo policies la proprietà key-auth, che ci permette di definire che l\u0026rsquo;API sarà esposta tramite una chiave di autenticazione con un header personalizzato (opzionale) che definiamo come CUSTOM-HEADER:\n pipelines:\n name: tasks apiEndpoints: tasksApi policies: key-auth: action: apiKeyHeader: CUSTOM-HEADER disableHeadersScheme: true proxy: action: serviceEndpoint: tasksService changeOrigin: true  A questo punto, creiamo delle credenziali da assegnare all\u0026rsquo;utente creato poco fa con il seguente comando:\n Creazione credenziali nel formato key-auth\n Se proviamo ad eseguire nuovamente una request lasciando le impostazioni così com\u0026rsquo;erano, questo è quello che otteniamo:\n  La response è (giustamente) unauthorized\n  Per far sì che funzioni, andiamo ad aggiungere un header alla nostra request, dove il nome sarà quello configurato in precedenza, e il valore sarà dato dalla keyId:keySecret, ossia le due chiavi che abbiamo ottenuto durante il processo di creazione:\n Aggiunta dell\u0026rsquo;header alla request\n     Alternative  Se ti è sembrato tutto (troppo) complicato, prova a dare un\u0026rsquo;occhiata a queste alternative:\n Amazon API Gateway: https://aws.amazon.com/it/api-gateway/pricing/ Gravitee.io: https://docs.gravitee.io/apim/1.x/apim_installguide_gateway_configuration.html  Risorse utili Documentazione ufficiale: https://www.express-gateway.io/docs Tutorial ufficiali: https://www.express-gateway.io/getting-started/#installation ", "url": "https:\/\/theredcode.it\/come-costruire-un-api-gateway-con-express\/" }, "https:\/\/theredcode.it\/categories\/express-js\/": { "title": "express-js", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/express-js\/" }, "https:\/\/theredcode.it\/categories\/node-js\/": { "title": "node-js", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/node-js\/" }, "https:\/\/theredcode.it\/fare-economia-con-angular\/": { "title": "Fare economia con Angular", "tags": ["angular","design-dev",], "content": "Se sviluppi in Angular o stai cominciando, non puoi perderti questo articolo: vediamo insieme perché fare economia con Angular e come sfruttare al massimo le potenzialità di questo framework durante lo sviluppo!  Può sembrare strano parlare di economia in questo contesto, ma la realtà è che le dimensioni di Angular sono piuttosto care: care in termini di dimensioni perché, come spesso avviene, molto del codice prodotto è codice morto: queste righe apparentemente innocue aggiungono kilobyte (e anche megabyte) all\u0026rsquo;applicazione, che non vengono però mai sfruttate.\n Il codice morto è una perdita di tempo, spazio e consumo di risorse: basti pensare che con un\u0026rsquo;applicazione in Angular appena creata, vengono impiegati circa 4MB. Cosa saranno mai? Niente, se però pensiamo che ancora non sono state inserite immagini, componenti, librerie o CSS. Questo numero varierà in maniera significativa nell\u0026rsquo;arco di poco!\n Esempio di un\u0026rsquo;app in Angular con appena 3 componenti e solo un logo come immagine: il suo peso complessivo è di 20 MB.\n Nel tempo, la crescita della tua applicazione aumenterà: diamolo per scontato. Questo spesso significa più funzionalità e quindi più codice da scrivere; di conseguenza, le dimensioni della tua applicazione diventano poco pratiche. Qui entra in gioco il meccanismo dei budget di Angula: questo permette di fornire avvisi o errori una volta che l\u0026rsquo;applicazione raggiunge una certa dimensione durante il processo di compilazione.\nLa dimensione complessiva della tua applicazione è infatti molto importante perché gli utenti ne pagano le conseguenze: latenza, dati mobile limitati, connessione non rapida (che però influisce sulla reazione dell\u0026rsquo;utente). Il concetto di budget aiuta a diventare maggiormente consapevole delle dimensioni che assume il tuo lavoro e quando raggiunge il limite massimo. In questo modo, se in qualche modo siamo riusciti a raggiungere la soglia impostata, sappiamo che è ora di tornare indietro e operare di refactor.\n Ma come si impostano i budget?  Come prima cosa, andiamo nel file angular.json e scorriamo verso il basso nella sezione riguardante la configurazione della produzione:\n Configurazione del budget nel file angular.json\n Probabilemente esiste già un valore predefinito di avviso (aka maximumWarning) massimo impostato su 2 MB, mentre per il processo di compilazione viene prodotto un errore (aka maximumError) e viene interrotta la build nel caso in cui si arrivi a 5 MB.\n Questo è il momento di pensare ad un valore ragionevole per il contesto della tua applicazione. La build di produzione (quando eseguiamo la build con l\u0026rsquo;opzione --prod) esegue tutto il code shaving possible per fornire una dimensione finale che sia reale; se però il risultato finale è comunque troppo grande e non riesci a capire perché, usando il flag --stats-json durante il processo di build, verrà generato un file stats.json che è possibile utilizzare tramite l\u0026rsquo;analizzatore di Webpack.\n  Per poterlo installare, è sufficient eseguire il seguente comando:\n npm i -D webpack-bundle-analyzer\n e poi all\u0026rsquo;interno del file package.json, aggiungere queste righe all\u0026rsquo;interno della proprietà scripts:\n \u0026ldquo;scripts\u0026rdquo;: { \u0026ldquo;ng\u0026rdquo;: \u0026ldquo;ng\u0026rdquo;, \u0026ldquo;start\u0026rdquo;: \u0026ldquo;ng serve \u0026ndash;host 0.0.0.0 \u0026ndash;poll=500\u0026rdquo;, \u0026ldquo;build\u0026rdquo;: \u0026ldquo;ng build\u0026rdquo;, \u0026ldquo;test\u0026rdquo;: \u0026ldquo;ng test\u0026rdquo;, \u0026ldquo;lint\u0026rdquo;: \u0026ldquo;ng lint\u0026rdquo;, \u0026ldquo;e2e\u0026rdquo;: \u0026ldquo;ng e2e\u0026rdquo;, \u0026ldquo;build:stats\u0026rdquo;: \u0026ldquo;ng build \u0026ndash;stats-json\u0026rdquo;, \u0026ldquo;analyze\u0026rdquo;: \u0026ldquo;webpack-bundle-analyzer dist/frontend/stats.json\u0026rdquo; },\n La sezione build:stats ci consente di creare il file per analizzare le statistiche della nostra applicazione grazie alla creazione del file stats.json; la sezione analyze definisce invece un altro script che esegue il comando per mostrarci l\u0026rsquo;analisi che Webpack esegue sulla nostra applicazione.\n A questo punto, eseguendo il seguente comando, verrà avviata l\u0026rsquo;applicazione per permetterti di analizzare nel dettaglio dove vengono consumati tutti i KB in eccesso.\n npm run analyze\n Statistiche prodotte dell\u0026rsquo;analyzer di Webpack\n Dimenticavo! È possibile specificare il budget della dimensione dell\u0026rsquo;app definendo questi valori nei seguenti formati:\n 123 o 123b: dimensione in byte; 123kb: dimensione in kilobyte; 123mb: dimensione in megabyte.  Non è necessario essere precisi al centesimo: piuttosto, è importante assegnare un valore soglia che non sia arbitrario, ma calibrato sulla base delle dimensioni effettive e necessarie all\u0026rsquo;app per funzionare e non incidere sull\u0026rsquo;esperienza finale.\n That\u0026rsquo;s all, folks! ", "url": "https:\/\/theredcode.it\/fare-economia-con-angular\/" }, "https:\/\/theredcode.it\/docker\/come-distribuire-una-webapp-angular-in-produzione\/": { "title": "Come distribuire una webapp Angular in produzione", "tags": ["angular","apache","docker","nginx",], "content": " Non sai come distribuire una webapp Angular in produzione, ma non sai come fare? Nessun problema: sei nel posto giusto.\n Introduzione  Se non hai familiarità con Angular portato in produzione, nessun problema: questo articolo è quello che fa al caso tuo. Quello che leggerai vale anche per React o Angular o qualsiasi altra applicazione basata su un framework che lavori con un router interno. Dal momento che il codice che viene scritto viene poi eseguito tramite un browser, il quale parla solo HTML, CSS e JavaScript, questa guida descrive esattamente il modo in cui possiamo trasformare il tuo codice per essere impacchettato e portato in produzione. In questo caso, partiremo da una semplice applicazione Angular: se non sai come fare, leggi questo articolo dove, tra le altre cose, vediamo come creare una semplice webapp!\n Dopo aver visto come funziona, vedremo come funziona il processo di build per la creazione dei file di produzione, e poi porteremo l\u0026rsquo;esempio su tre casi d\u0026rsquo;uso piuttosto frequenti: Nginx, Apache e Docker come tecnologia per la messa in produzione della nostra applicazione.\n Come funziona  Utilizzando il comando ng serve per avviare la nostra applicazione, vengono generati cinque file:\n  inline.bundle.js: un piccolo file che aiuta il webpack a caricare le risorse di cui ha bisogno; main.bundle.js: la maggior parte della nostra applicazione Angular; polyfills.bundle.js: questo file tutto l\u0026rsquo;occorrente per far funzionare Angular nei browser meno recenti; styles.bundle.js: gli stili! vendor.bundle.js: contiene la definizione delle librerie di Angular.  Ora che abbiamo una vaga idea di come funziona, passiamo al primo step: il processo di build.\n Step 1: build  Il comando ng serve funziona per eseguire la nostra applicazione in ambiente di sviluppo. E per la produzione? Se guardiamo nel file package.json, possiamo vedere che ci sono diversi script che possiamo usare:\n \u0026#34;scripts\u0026#34;: { \u0026#34;ng\u0026#34;: \u0026#34;ng\u0026#34;, \u0026#34;start\u0026#34;: \u0026#34;ng serve\u0026#34;, \u0026#34;build\u0026#34;: \u0026#34;ng build --prod\u0026#34;, \u0026#34;test\u0026#34;: \u0026#34;ng test\u0026#34;, \u0026#34;lint\u0026#34;: \u0026#34;ng lint\u0026#34;, \u0026#34;e2e\u0026#34;: \u0026#34;ng e2e\u0026#34; },  Per rendere il nostro codice fruibile per la produzione, abbiamo bisogno di configurare un parametro aggiuntivo, ossia il flag \u0026ndash;prod. Possiamo farlo in due modi:\n # utilizzando gli script npm $ npm run build # utilizzando direttamente la cli di Angular $ ng build --prod Your global Angular CLI version (11.2.2) is greater than your local version (11.1.0). The local Angular CLI version is used. To disable this warning use \u0026#34;ng config -g cli.warnings.versionMismatch false\u0026#34;. √ Browser application bundle generation complete. √ Copying assets complete. √ Index html generation complete. Initial Chunk Files | Names | Size main.dc687d6444d7b41c628c.js | main | 563.91 kB styles.ace737526e6d3cb122f0.css | styles | 71.10 kB polyfills.6abdde2583a2e01a2350.js | polyfills | 35.73 kB runtime.7b63b9fd40098a2e8207.js | runtime | 1.45 kB | Initial Total | 672.19 kB Build at: 2021-05-03T15:55:44.502Z - Hash: fea003044cca574ddcf4 - Time: 47700ms  Il comando ng build in questo caso compila l\u0026rsquo;app Angular in una directory di output denominata dist nella cartella principale del progetto (se non specificato diversamente); questa opzione attiva molti flag di ottimizzazione. Uno di questi è –aot per la compilation Ahead Of Time (se non ne hai mai sentito parlare, trovi qui un articolo molto interessante).\n I modelli dei componenti vengono compilati durante la compilazione, quindi TypeScript può rilevare più problemi nel codice di quanti non ne abbiamo rilevati durante l\u0026rsquo;esecuzione in sviluppo: nessun problema!\n  Gli errori sono solitamente molto parlanti, quindi ti basterà dare un\u0026rsquo;occhiata ai log per risolverli.\n  Tornando alla cartella dist, dicevamo che il comando build crea una nuova cartella chiamata per la distribuzione: al suo interno infatti ci sono i file che ci serviranno per dare vita alla nostra applicazione su un server!\n Questo è tutto ciò che serve per distribuire un\u0026rsquo;applicazione Angular:\n  A questo punto, quello che ci serve è solo\u0026hellip; un server. Che sia Apache o qualsiasi altra soluzione, è piuttosto semplice: passiamo allo step successivo!\n Step 2a: usare Nginx  All\u0026rsquo;interno della cartella di Nginx, sotto /etc/nginx/sites-available, crea un nuovo file per l\u0026rsquo;applicazione che hai bisogno di deployare copiando il contenuto riportato di seguito, dove my-website rappresenta il nome del tuo sito:\n $ cd /etc/nginx/sites-available \u0026amp;\u0026amp; nano my-website.com  my-website.com\nserver { root path/to/folder; index index.html; server_name my-website.com; location / { try_files $uri $uri/ /index.html; } }  Con queste semplici righe, facciamo in modo che Nginx serva solo il file index.html, il quale contiene tutto l\u0026rsquo;occorrente per tirare su l\u0026rsquo;applicazione, in maniera del tutto indipendente dall\u0026rsquo;URL del nostro dominio.\n In questo modo, anche quando l\u0026rsquo;utente navigherà l\u0026rsquo;applicazione, il file a cui farà riferimento sarà sempre index.html.\n Il percorso dove andremo a inserire i file dell\u0026rsquo;applicazione viene specificato nella direttiva root: ad esempio, una cartella che possiamo utilizzare per inserire questi file potrebbe essere /usr/share/nginx/html.\n Nginx leggerà le configurazioni dalla cartella sites-enabled ed esporrà le relative applicazioni: ecco perché dobbiamo creare un link verso il file appena creato utilizzando questo comando:\n $ ln -s /etc/nginx/sites-available/my-website /etc/nginx/sites-enabled/  Infine, per verificare che la configurazione sia a posto, eseguiamo questo comando:\n $ sudo nginx -t  Se non ci sono errori, è il momento di riavviare il servizio Nginx.\n $ sudo systemctl restart nginx  Fatto questo, la nostra applicazione è pronta per la produzione!\n  Step 2b: usare Apache  Il processo è del tutto analogo a quanto visto con Nginx: dopo aver installato Apache, all\u0026rsquo;interno della cartella /var/www/html copiamo il contenuto della cartella dist prodotta nel primo step; ci occorre tuttavia fare un passo in più, ossia configurare l\u0026rsquo;errore 404 di reindirizzamento alla pagina index.html, nel caso in cui si utilizzi il router interno di Angular.\n Per farlo, modifichiamo il file 000-default.conf presente nella cartella /etc/apache2/sites-enabled e aggiungiamo la seguente riga:\n ErrorDocument 404 /index.html  Il risultato dovrebbe essere simile al seguente:\n \u0026lt;VirtualHost *:80\u0026gt; ServerAdmin webmaster@localhost DocumentRoot /var/www/html # redirect 404 to index page ErrorDocument 404 /index.html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined \u0026lt;/VirtualHost\u0026gt;  Riavviamo a questo punto il server Apache tramite il seguente comando:\n sudo service apache2 restart  That\u0026rsquo;s all, folks!\n  Step 2c: usare Docker  Infine, vediamo come mettere in produzione un\u0026rsquo;applicazione Angular usando Docker.\n Supponendo che questa applicazione non abbia dipendenze particolari (database, backend, ecc.), possiamo lavorare in questo modo: usiamo una prima immagine di base Node.js per eseguire tutte le operazioni viste in precedenza, ossia installare le dipendenze tramite il file package.json e copiare il contenuto dell\u0026rsquo;app Angular dopo che è stato eseguire il comando ng build \u0026ndash;prod, e poi, grazie all\u0026rsquo;immagine di base di Nginx, andiamo a copiare il contenuto della cartella prodotta all\u0026rsquo;interno della cartella /usr/share/nginx/html:\n FROM node:12.16.1-alpine As builder WORKDIR /usr/src/app COPY package.json package-lock.json ./ RUN npm install COPY . . RUN npm run build --prod FROM nginx:1.15.8-alpine COPY --from=builder /usr/src/app/dist/SampleApp/ /usr/share/nginx/html  Questi sono solo alcuni dei metodi: ne conosci altri?\n Tips\u0026amp;Tricks:  Problemi con il routing? (i.e.: 404: page not found?)  Se, per esempio, l\u0026rsquo;applicazione viene deployata in produzione all\u0026rsquo;interno di una sottocartella del server (ad esempio, sotto /var/www/html/mysite), può darsi che sia necessario eseguire uno step in più: in particolare, dovremo rivedere lo step 1 e cambiare il tag di base nel tuo file index.html, da a \n Questo tag viene infatti utilizzato dal router di Angular per sapere dov\u0026rsquo;è la base di ogni path, però mentre il server di Angular lo interpreta correttamente (perché deploya l\u0026rsquo;applicazione sul contesto principale), nel caso di un webserver con questa gestione delle sottocartelle, c\u0026rsquo;è bisogno di un\u0026rsquo;informazione aggiuntiva.\n", "url": "https:\/\/theredcode.it\/docker\/come-distribuire-una-webapp-angular-in-produzione\/" }, "https:\/\/theredcode.it\/tags\/nginx\/": { "title": "nginx", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/nginx\/" }, "https:\/\/theredcode.it\/categories\/nginx\/": { "title": "nginx", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/nginx\/" }, "https:\/\/theredcode.it\/recensioni\/pretotype-it\/": { "title": "Pretotype It", "tags": [], "content": "Ranking Anno 2014 Autore Alberto Savoia Livello Per tutti Scorrevolezza 10 / 10 Originalità 10 / 10 Valutazione 10 / 10 Recensione Questo libro di appena 60 pagine racchiude una serie di esperienze che, una volta finita l\u0026rsquo;ultima riga dell\u0026rsquo;ultima pagina, ti lasciano a bocca aperta. Scontati in alcuni casi magari, ma tutti consigli a cui non avresti mai pensato finché qualcuno come Alberto Savoia non si fosse messo a buttare giù queste righe. Partiamo dall\u0026rsquo;inizio: questo è il frutto di una delle sessioni di scambio di consigli sui libri con l\u0026rsquo;Uomo della Mansarda: abbiamo gusti molto simili nel leggere in questo periodo e nell\u0026rsquo;ultima call è venuto fuori questo titolo. Perché no, mi sono detta: in fondo questo stesso blog è il frutto di un pretotipo, che magari un giorno diventerà un prodotto! Premesso che quella punta di chiave ironica con cui questo libro viene scritto lo rende assolutamente gradevole e in un pomeriggio o due sarebbe possibile finirlo, è bene sottolineare una cosa: ognuno degli aspetti che vengono analizzati andrebbe letti e, dopo aver chiuso il libro, bisognerebbe chiudere gli occhi e riflettere, riprendendo magari qualche esperienza passata dove abbiamo posto tutte le nostre energie nel progetto più incredibile del mondo, per fare un po\u0026rsquo; di brainstorming. Dove ho sbagliato? Forse il mio progetto è rimasto intrappolato nella Terra del Pensiero per troppo tempo? E se avessi usato il Turco Meccanico? Se sembra che sia sull\u0026rsquo;orlo di una crisi di nervi, ti sbagli di grosso: dietro a dei nomi divertenti, ma efficaci, Alberto Savoia spiega come utilizzare un ventaglio di tecniche a nostro favore per far sì che la Legge dell\u0026rsquo;Insuccesso non ci distrugga economicamente e psicologicamente. Buttarsi a capofitto in un progetto richiede sacrifici, tempo e fatica, come molti hanno provato sulla propria pelle: non esiste una regola universale per avere successo, o McDonald\u0026rsquo;s non sarebbe tra i fast-food più conosciuti al mondo. La realtà è che bisogna pensare alla cosa giusta e poi attuare una serie di azioni che ci permettono di validarla nel minor tempo possibile, e soprattutto con il minor spreco di energie e soldi. Queste righe non si applicano solo al mondo della tecnologia, ma si tratta di una serie di linee guida che valgono per qualunque cosa: l\u0026rsquo;autore infatti parla genericamente della cosa come un\u0026rsquo;idea che deve concretizzarsi, che sia un ristorante, un libro o un sito. Non solo: esiste un blog dove vengono messe una serie di risorse a disposizione, che consiglio vivamente di leggere: Alberto Savoia infatti non è un informatico qualsiasi, ma è stato Google Innovation Agitator (tradotto in italiano, una sorta di Direttore per l\u0026rsquo;Innovazione) per quattro anni, nonché coach alla Stanford University. Consigliato? Assolutamente sì. Da leggere non solo una volta, ma ogni volta che una nuova idea atterra nella Terra del Pensiero.\nLezione imparata Non bisogna essere pronti, bisogna essere fortemente imbarazzati; Pretotipare per sbagliare più rapidamente.  Quotes   \u0026ldquo;La cosa più difficile della pretotipazione non è lo sviluppo di pretotipi, quella è la parte divertente. La parte difficile è vincere il prematuro impulso perfezionista e il nostro desiderio di aggiungere ulteriori funzionalità o contenuti, prima di pubblicare la prima versione.\u0026rdquo; \u0026ldquo;Fallo per Finta Prima di Farlo per Davvero\u0026rdquo; \u0026ldquo;Assicurati di costruire la cosa giusta, prima di costruirla per bene\u0026rdquo;\n  Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/pretotype-it\/" }, "https:\/\/theredcode.it\/come-eseguire-node.js-in-produzione\/": { "title": "Come eseguire Node.js in produzione", "tags": ["express-js","node-js","pm2","process-manager","produzione",], "content": " Se hai sviluppato un\u0026rsquo;applicazione o dei servizi usando Node.js e ora devi passare alla fase successiva: vediamo come eseguire Node.js in produzione.\n Introduzione  Da qualche anno a questa parte, Node.js (e altre tecnologie che sfruttano Javascript e Typescript) sono diventati sempre più popolari: vedi React, Vue, Angular, Svelte, e via dicendo.\n Per quasi tutte le applicazioni che sfruttano questa tecnologia, ci si trova davanti ad un bivio: eseguirla in locale è relativamente semplice (con un comando come npm start, l\u0026rsquo;applicazione è pronta per essere eseguita), ma manutenere e gestire eventuali malfunzionamenti non lo è.\n Inoltre, poiché Node.js è un framework molto utilizzato per chi lavora con servizi di backend, lavorare con processi e thread può rappresentare un ostacolo: è qui che entra in gioco PM2.\n PM2 è infatti un process manager, ossia uno strumento che permette in pochi e semplici -giuro!- comandi di gestire un ambiente come quello di collaudo o produzione.\n Cos\u0026rsquo;è PM2  PM2 è un gestore di processi per applicazioni in Node.js che fornisce un bilanciatore di carico integrato; consente di mantenere in vita le applicazioni costantemente, di riavviarle senza tempi di inattività e di facilitare le attività di amministrazione di sistema.\n Con PM2 è difficile trovarsi nella situazione in cui il processo della tua applicazione o servizio vada in errore, bloccandone l\u0026rsquo;utilizzo fino al riavvio manuale; è infatti possibile definire una strategia di riavvio automatico in caso di arresto anomalo.\n Fornisce anche pratici strumenti di monitoraggio e la capacità di bilanciare il carico su più cluster.\n Esistono moltissime alternative, come Forever, il Process Manager di StrongLoop e il buon vecchio SystemD, ma PM2, con oltre 60 milioni di download e 34.000 stelle GitHub (in costante aumento) è facile da usare e semplifica la gestione di un ambiente di produzione.\n Installare PM2  $ npm install pm2  Come funziona  Supponiamo di aver creato una REST API in Express.js (come mostrato in questo articolo): tramite il comando pm2 start possiamo avviare il processo che rende disponibile la nostra app:\n $ pm2 start index.js $ pm2 start index.js --watch // riavvio automatico se vengono riscontrati dei cambiamenti nei file (!!) $ pm2 start index.js --name my-api // assegno un nome al processo Per verificare lo stato del processo, sarà sufficiente usare l\u0026rsquo;istruzione list, che ci mostrerà lo stato legato alla nostra app, con informazioni riguardo l\u0026rsquo;utilizzo delle risorse, il tempo di esecuzione, e via dicendo:\n $ pm2 list   Non solo: è possibile arrestare, riavviare e rimuovere il processo con i seguenti comandi, passando un ID oppure \u0026ldquo;all\u0026rdquo; come argomento:\n $ pm2 stop all // arresta tutti i processi avviati tramite PM2 $ pm2 restart 123 // riavvia il processo con ID 123 $ pm2 delete all // uccide tutti i processi avviati tramite PM2  E con i logs? Semplice: usiamo logs per stampare i log recenti, flush per cancellare i file dei logs e reloadLogs per aggiornarli:\n $ pm2 logs [TAILING] Tailing last 15 lines for [all] processes (change the value with --lines option) C:\\Users\\user\\.pm2\\pm2.log last 15 lines: PM2 | 2021-05-03T14:33:15: PM2 log: PM2 version : 4.5.6 PM2 | 2021-05-03T14:33:15: PM2 log: Node.js version : 14.15.3 PM2 | 2021-05-03T14:33:15: PM2 log: Current arch : x64 PM2 | 2021-05-03T14:33:15: PM2 log: PM2 home : C:\\Users\\user\\.pm2 PM2 | 2021-05-03T14:33:15: PM2 log: PM2 PID file : C:\\Users\\user\\.pm2\\pm2.pid PM2 | 2021-05-03T14:33:15: PM2 log: RPC socket file : \\\\.\\pipe\\rpc.sock PM2 | 2021-05-03T14:33:15: PM2 log: BUS socket file : \\\\.\\pipe\\pub.sock PM2 | 2021-05-03T14:33:15: PM2 log: Application log path : C:\\Users\\user\\.pm2\\logs PM2 | 2021-05-03T14:33:15: PM2 log: Worker Interval : 30000 PM2 | 2021-05-03T14:33:15: PM2 log: Process dump file : C:\\Users\\user\\.pm2\\dump.pm2 PM2 | 2021-05-03T14:33:15: PM2 log: Concurrent actions : 2 PM2 | 2021-05-03T14:33:15: PM2 log: SIGTERM timeout : 1600 PM2 | 2021-05-03T14:33:15: PM2 log: =============================================================================== PM2 | 2021-05-03T14:33:15: PM2 log: App [index:0] starting in -fork mode- PM2 | 2021-05-03T14:33:15: PM2 log: App [index:0] online C:\\Users\\user\\.pm2\\logs\\index-out.log last 15 lines: 0|index | Db connected successfully 0|index | Running webapp on port 8081 $ pm2 flush [PM2] Flushing C:\\Users\\user\\.pm2\\pm2.log [PM2] Flushing: [PM2] C:\\Users\\user\\.pm2\\logs\\index-out.log [PM2] C:\\Users\\user\\.pm2\\logs\\index-error.log [PM2] Logs flushed $ pm2 reloadLogs Reloading all logs... All logs reloaded  Non finisce qui: è possibile utilizzare PM2 in modalità cluster: in altra parole, PM2 eseguirà diversi processi e sfrutterà il bilanciatore di carico per distribuire il carico di lavoro tra i diversi processi.\n Per attivarlo, è possibile eseguire il seguente comando, dove andiamo a specificare il numero massimo di processi da eseguire:\n $ pm2 start app.js -i max_processes   Il numero massimo di processi è determinato dal numero di core della macchina su cui si sta eseguendo PM2. Ad esempio, se il sistema ha 4 core, il numero massimo potrà essere di 8 processi in esecuzione contemporaneamente, ossia due processi per core.\n  Passiamo al monitoraggio. Eseguiamo quanto segue per visualizzare il monitoraggio di PM2 e vedremo una schermata simile a quella riportata in figura, dove ci vengono mostrate le metriche dell\u0026rsquo;applicazione e i metadata:\n $ pm2 monit   Questo ci offre un modo semplice per visualizzare le informazioni della nostra applicazione NodeJS in produzione con alcune altre informazioni utili.\n Ancora più utile può essere monitorare l\u0026rsquo;applicazione nel caso in cui i processi siano molteplici; supponiamo allora di aver eseguito il comando precedente che ci permetteva di creare un certo numero massimo di processi, e andiamo a eseguire nuovamente il comando per vedere il monitoraggio:\n   Tips\u0026amp;Tricks  Ecosystem  PM2 potenzia il flusso di lavoro della gestione dei processi grazie alla possibilità di mettere a punto il comportamento, le opzioni, le variabili di ambiente, i file di log di ciascuna applicazione tramite un file di processo che descrive l\u0026rsquo;ambiente dove stiamo lavorando sfruttando un file Javascript, YAML o JSON, definendo l\u0026rsquo;ecosistema del nostro processo.\n Per generare un nuovo ecosistema, eseguiamo il comando seguente:\n $ pm2 ecosystem  Grazie a questo comando, verrà generato un file ecosystem.config.js simile al seguente, dove vengono riportate le informazioni sulla definizione dell\u0026rsquo;applicazione e degli ambienti:\n module.exports = { apps: [{ name: \u0026#34;app\u0026#34;, script: \u0026#34;./app.js\u0026#34;, env: { NODE_ENV: \u0026#34;development\u0026#34;, }, env_production: { NODE_ENV: \u0026#34;production\u0026#34;, } }] }  Una volta modificato opportunamente questo file, è possibile sfruttarlo per avviare i servizi con il comando start visto in precedenza:\n $ pm2 start ecosystem.config.js  All\u0026rsquo;interno di questo file possiamo configurare tutte le proprietà viste in precedenza, come watch, l\u0026rsquo;uso della modalità cluster, e via dicendo:\n module.exports = { apps: [{ name: \u0026#34;app\u0026#34;, script: \u0026#34;./app.js\u0026#34;, env: { NODE_ENV: \u0026#34;development\u0026#34;, }, env_production: { NODE_ENV: \u0026#34;production\u0026#34;, }, \u0026#34;instances\u0026#34;: 6, \u0026#34;exec_mode\u0026#34;: \u0026#34;cluster\u0026#34;, \u0026#34;watch\u0026#34;: false }] }  Risorse utili Compatibilità: Ionic con Angular e Node.js ", "url": "https:\/\/theredcode.it\/come-eseguire-node.js-in-produzione\/" }, "https:\/\/theredcode.it\/tags\/pm2\/": { "title": "pm2", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/pm2\/" }, "https:\/\/theredcode.it\/tags\/process-manager\/": { "title": "process-manager", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/process-manager\/" }, "https:\/\/theredcode.it\/tags\/mean\/": { "title": "mean", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/mean\/" }, "https:\/\/theredcode.it\/mean-docker-sviluppare-una-webapp-da-zero-in-meno-di-unora\/": { "title": "MEAN Docker: sviluppare una webapp da zero in meno di un\u0027ora", "tags": ["angular","docker","docker-compose","express-js","mean","mongodb","node-js",], "content": "Containerizzare un singolo servizio è relativamente facile\u0026hellip; ma quando è necessario containerizzare più servizi in container separati, si può avere qualche difficoltà. Uno dei casi classici è avere a che fare con un\u0026rsquo;applicazione basata su uno stack MEAN.\n Esatto, un\u0026rsquo;applicazione full-stack.\n MEAN infatti sta per:\n MongoDB: database noSQL; Express.js: framework per applicazioni web basato su Node.js minimale e flessibile, utilissima per creare REST API; Angular: piattaforma per la creazione di applicazioni web mobili e desktop; NodeJs: ambiente server open source per eseguire JavaScript.  Tramite questa combinazione di tecnologie è possibile infatti definire un ciclo di vita completo di un\u0026rsquo;applicazione web: tramite MongoDB diamo alla nostra applicazione la persistenza di cui ha bisogno; con Node.js e Express.js andiamo a creare dei servizi che ci mettono a disposizione un back-end per gestire la comunicazione con il database; infine, con Angular, è possibile creare un front-end che renda fruibile quello che c\u0026rsquo;è sotto al coperchio.\n  Non c\u0026rsquo;è bisogno di spaventarsi di fronte alla moltitudine di queste tecnologie o alla difficoltà di avere più servizi che dovranno comunicare tra loro: Docker Compose può essere utilizzato per creare container separati per ciascuno degli oggetti che saranno in gioco nell\u0026rsquo;applicazione, permettendogli di \u0026ldquo;parlare\u0026rdquo; tranquillamente.\n Chiaramente questo approccio non è l\u0026rsquo;unico: la combo di queste tecnologie è di per sé conveniente per chi è particolarmente familiare con tecnologie affini a Typescript, ma in realtà si tratta di uno stack piuttosto diffuso come schema implementativo; questo vuol dire che è sufficiente sostituire ogni mattoncino (o servizio) con la tecnologia più congeniale allo sviluppatore per avere lo stesso risultato.\n Una cosa che infatti non si insegna mai (o si insegna troppo tardi) è che il linguaggio di programmazione con cui si decide di sviluppare una soluzione non dev\u0026rsquo;essere posto in cima alla lista delle cose da fare: questo deve essere scelto secondo diversi criteri, che dipendono anche dalla familiarità che si ha con uno di questi.\n In questo caso, si andrà ad utilizzare un approccio bottom-up: partendo infatti dalla definizione degli oggetti che andremo a modellare, andremo via via verso il generale, ossia verso la visualizzazione del nostro progetto.\n Questo è l\u0026rsquo;approccio che preferisco: concentrarsi sui dati che devono essere rappresentati permette di ridurre la complessità nella gestione, ed avere più tempo per i dettagli dell\u0026rsquo;interfaccia. Non a caso una buona base dati è alla base di molte applicazioni!\n  Una premessa è doverosa: siccome lo scopo di questo tutorial è quello di vedere come impacchettare i componenti di uno stack MEAN e renderli dei servizi pronti per essere utilizzati con Docker Compose: nel descrivere la creazione di una REST API con Express.js oppure il front-end con Angular potrebbero sfuggire alcuni dettagli implementativi.\n Detto ciò, una breve considerazione, perché repetita iuvant: questo non è l\u0026rsquo;unico modo per portare a termine questo progetto e ci sono e saranno sicuramente modi anche più intelligenti o produttivi\u0026hellip; vi sfido a provarli tutti!\n Repository\nhttps://github.com/serenasensini/MEAN-boilerplate\n Pre-requisiti Installazione Node.js; Installazione Angular; Installazione Express.js; Installazione MongoDB; Installazione Docker e Docker Compose.  Step-by-step  0: Definizione del progetto  Creiamo una cartella \u0026ldquo;MEAN-app\u0026rdquo; (o con un qualunque altro nome), dove andremo ad impostare tutto il nostro lavoro.\n Per lavorare, io utilizzo WebStorm, il che rende più semplice la creazione di progetti (con pochi click, viene generato un template pronto all\u0026rsquo;uso), ma riporto di seguito i comandi che vengono utilizzati per la creazione dei file che ci serviranno per le diverse applicazioni: come prima cosa, andremo a creare un\u0026rsquo;applicazione per il back-end, quindi andremo ad eseguire i seguenti comandi:\n $ npm i express-generator $ express backend  Verrà creata una cartella con il seguente contenuto:\ncreate : backend/ create : backend/public/ create : backend/public/javascripts/ create : backend/public//img/ create : backend/public/stylesheets/ create : backend/public/stylesheets/style.css create : backend/routes/ create : backend/routes/index.js create : backend/routes/users.js create : backend/views/ create : backend/views/error.jade create : backend/views/index.jade create : backend/views/layout.jade create : backend/app.js create : backend/package.json create : backend/bin/ create : backend/bin/www   All\u0026rsquo;interno di questa cartella, andremo a definire una serie di cartelle che permettono di organizzare il lavoro: controllers, model, data e routes, dove andremo a mettere rispettivamente la logica, i modelli, i dati di test (opzionale) e le routes.\n  Per il momento, è tutto. Passiamo al front-end: in questo caso, eseguiamo i seguenti comandi:\n $ ng new frontend --style=scss --routing  Anche in questo caso, non appena il processo è terminato, andiamo a creare una serie di cartelle per organizzare il lavoro; questi passaggi non sono obbligatori, ma dipendono dal programmatore.\n Ognuno di essi è come uno scrittore: ha il suo stile, il suo modo di lavorare e di gestire lo scaffolding del progetto! Certo, ci sono delle best practices, ma ne parleremo un\u0026rsquo;altra volta\u0026hellip;\n In questo caso, sotto la cartella src/app/, andiamo a creare una cartella components, all\u0026rsquo;interno della quale inseriremo i componenti principali, una layout, che definirà gli oggetti che compongono la struttura della nostra webapp, e infine services, dove inseriremo i servizi che parleranno con il back-end.\n  Fatto! Il lavoro è stato impostato. Next step:\n 1: definizione del JSON  Qui possiamo lavorare di fantasia. Supponiamo ad esempio di voler creare una webapp per la gestione delle richieste che riceviamo, e salviamo proprietà come il nome e la descrizione: il nostro JSON avrà un aspetto come quello riportato di seguito.\n [ { \u0026#34;name\u0026#34;: \u0026#34;John\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Lorem ipsum\u0026#34; } ]  Questo è solo un esempio, ma il tutto può essere modificato a piacimento.\n Next!\n 2: sviluppare e testare il back-end con Express.js  Ora riprendiamo la cartella backend e iniziamo a popolare la cartella model: creiamo un file che chiamo requestModel.js, all\u0026rsquo;interno del quale definisco lo schema che dovrà assumere il mio oggetto: imposto il nome come campo di tipo stringa e obbligatorio, mentre la descrizione sarà solo una stringa opzionale:\n var mongoose = require(\u0026#39;mongoose\u0026#39;); var requestSchema = mongoose.Schema({ name: { type: String, required: true }, description: String }); var Request = module.exports = mongoose.model(\u0026#39;request\u0026#39;, requestSchema); module.exports.get = function (callback, limit) { Request.find(callback).limit(limit); }  Andremo ad utilizzare Mongoose come libreria per la creazione della struttura del nostro oggetto: ne esistono molte altre, quindi vi sfido a provarle!\n Nelle ultime tre righe, vado a definire il modello che verrà esportato e che permetterà di eseguire le operazioni CRUD sugli oggetti di questa tipologia.\n Passiamo ora alla gestione del controller: nell\u0026rsquo;omonima cartella, creo un file requestController.js, dove importo il modello che ho appena creato e definisco i metodi CRUD per l\u0026rsquo;oggetto Request: come riportato di seguito, vengono definiti diversi metodi, tra cui index, new, view, update, delete.\n Ognuno di questi compie un\u0026rsquo;operazione diversa, ossia il recupero di tutti gli oggetti di questa tipologia, la creazione, il recupero di un oggetto a partire dall\u0026rsquo;id, l\u0026rsquo;aggiornamento e la cancellazione:\n Request = require(\u0026#39;../model/requestModel\u0026#39;); exports.index = function (req, res) { Request.get(function (err, requests) { if (err) { res.json({ status: \u0026#34;error\u0026#34;, message: err, }); } res.json({ status: \u0026#34;success\u0026#34;, message: \u0026#34;Requests retrieved successfully\u0026#34;, data: requests }); }); }; exports.new = async function (req, res) { var request = new Request(); request.name = req.body.name ? req.body.name : request.name; request.description = req.body.description; request.save(function (err) { if (err) res.json(err); else res.json({ message: \u0026#39;New request created!\u0026#39;, data: request }); }); }; exports.view = function (req, res) { Request.findById(req.params.request_id, function (err, contact) { if (err) res.send(err); res.json({ message: \u0026#39;Request details loading..\u0026#39;, data: contact }); }); }; exports.update = function (req, res) { Request.findById(req.params.request_id, function (err, request) { if (err) res.send(err); request.name = req.body.name ? req.body.name : request.name; request.save(function (err) { if (err) res.json(err); res.json({ message: \u0026#39;Request Info updated\u0026#39;, data: request }); }); }); }; exports.delete = function (req, res) { Request.remove({ _id: req.params.request_id }, function (err, request) { if (err) res.send(err); res.json({ status: \u0026#34;success\u0026#34;, message: \u0026#39;Request deleted\u0026#39; }); }); };  Prendendo di esempio il metodo che inserisce una nuova richiesta, vediamo cosa succede: nella prima riga, definisco il tipo di operazione che vado a compiere.\n Chiaramente si tratta di un\u0026rsquo;operazione asincrona, in quanto ha bisogno del suo tempo per portare a termine il suo compito!\n Nelle righe successive, creiamo un oggetto di tipo Request e, sfruttando il parametro req (lo so, sembra una ridondanza, ma i due oggetti sono molto diversi) per recuperare le informazioni che vengono passate come parametri all\u0026rsquo;interno del body della request: in questo caso, name e description.\n Infine, avviene il salvataggio dell\u0026rsquo;oggetto nel database: se la richiesta va a buon fine, viene restituito un messaggio che riporta il buon esito dell\u0026rsquo;operazione e anche l\u0026rsquo;oggetto appena creato:\n exports.new = async function (req, res) { var request = new Request(); request.name = req.body.name ? req.body.name : request.name; request.description = req.body.description; request.save(function (err) { if (err) res.json(err); else res.json({ message: \u0026#39;New request created!\u0026#39;, data: request }); }); };  Repetita iuvant: questo non è l\u0026rsquo;unico modo di farlo, ma si tratta di un esempio volutamente semplice, perché l\u0026rsquo;idea è quella di fornire delle linee guida che mettano in condizione chi utilizza questo caso d\u0026rsquo;uso di avere una base pronta su cui lavorare!\n Prossimo passo: andiamo a modificare il file che gestisce le routes e aggiungiamo una route che punti al controller che abbiamo appena definito, come vediamo di seguito:\n In questo caso, siccome le operazioni di recupero delle richieste e la creazione non hanno bisogno di alcun parametro, vengono riportate in un\u0026rsquo;unica route che ha come contesto /requests; nel caso delle altre operazioni, è fondamentale avere l\u0026rsquo;ID dell\u0026rsquo;oggetto, quindi il contesto avrà come parametro request_id:\n var requestController = require(\u0026#39;../controllers/requestController\u0026#39;); router.route(\u0026#39;/requests\u0026#39;) .get(requestController.index) .post(requestController.new); router.route(\u0026#39;/requests/:request_id\u0026#39;) .get(requestController.view) .put(requestController.update) .delete(requestController.delete);  Ci siamo quasi: andiamo nel file principale del progetto, ossia app.js, e inseriamo le informazioni per la connessione al database e per l\u0026rsquo;uso delle routes:\n mongoose.connect(\u0026#39;mongodb://localhost:27017/mydb\u0026#39;, { useNewUrlParser: true}); var db = mongoose.connection; if(!db) console.log(\u0026#34;Error connecting db\u0026#34;) else console.log(\u0026#34;Db connected successfully\u0026#34;) app.get(\u0026#39;/\u0026#39;, (req, res) =\u0026gt; res.send(\u0026#39;Hello World!\u0026#39;)); // STEP 5: definire contesto (opzionale) app.use(\u0026#39;/api\u0026#39;, apiRoutes); app.listen(port, function () { console.log(\u0026#34;Running webapp on port \u0026#34; + port); });  In questo caso, usiamo la porta 8081 per esporre il nostro back-end, ma può essere usata una porta qualsiasi:\n var port = process.env.PORT || 8081;  Ci siamo! Che fatica, vero?\n Per testarla, eseguiamo un semplice comando da terminale:\n $ node index.js  Se tutto va a buon fine, possiamo aprire un qualsiasi client che ci permetta di eseguire delle requests (ad esempio, Postman) e chiamare l\u0026rsquo;indirizzo localhost:8081/api/requests/:\n   Per testare che il funzionamento sia corretto, proviamo a creare una nuova request effettuando una POST sempre tramite Postman e passando come body il seguente JSON:\n  Alla grande!   L\u0026rsquo;ultimo step è quello di preparare il Dockerfile che permetterà al nostro back-end di funzionare: in questo caso, utilizzeremo come immagine base l\u0026rsquo;ultima disponibile di Node; andremo poi a creare una cartella sotto /usr/src/app per copiare il nostro lavoro -partendo dal package.json- e installare tutte le dipendenze.\n Dopo questo passaggio, sarà sufficiente copiare il codice sorgente e inserire come istruzione di avvio del nostro container npm start:\n FROM node:16.0.0 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/ RUN npm install COPY . /usr/src/app CMD [ \u0026#34;npm\u0026#34;, \u0026#34;start\u0026#34; ]  Finito!   Passiamo al front-end.\n3: sviluppare e testare il front-end con Angular  Partiamo dalla creazione del servizio: questo ci metterà a disposizione un punto di comunicazione con il back-end per recuperare le richieste e inserirne di nuove; vediamo intanto come recuperare l\u0026rsquo;elenco completo.\n Dopo esserci posizionati tramite terminale all\u0026rsquo;interno della cartella /src/app/services, eseguiamo il seguente comando per generare un servizio:\n $ ng generate service requests  Verranno creati due file: noi andremo ad utilizzare il file requests.service.ts, all\u0026rsquo;interno del quale andremo a creare un\u0026rsquo;interfaccia che descrive il modello del nostro oggetto e poi, dopo aver importato all\u0026rsquo;interno della funzione constructor l\u0026rsquo;oggetto HttpClient, creiamo la funzione getRequests che ci permetterà di sfruttare il modulo importato per recuperare tutte le richieste:\n import { Injectable } from \u0026#39;@angular/core\u0026#39;; import {HttpClient} from \u0026#39;@angular/common/http\u0026#39;; import {environment} from \u0026#39;../../environments/environment\u0026#39;; export interface RequestData { id: string; name: string; description: string; } @Injectable({ providedIn: \u0026#39;root\u0026#39; }) export class RequestsService { constructor(private http: HttpClient) { } // tslint:disable-next-line:typedef getRequests() { return this.http.get\u0026lt;RequestData[]\u0026gt;(environment.baseURL + \u0026#39;/requests\u0026#39;); } }  A questo punto, possiamo passare al componente: tramite terminale, ci spostiamo nella cartella /src/app/components ed eseguiamo il comando seguente:\n $ ng generate component requests  Andiamo a modificare il file requests.component.ts e inseriamo la logica che ci permette di recuperare e visualizzare l\u0026rsquo;elenco degli oggetti. Anche qui è possibile adottare la strategia che più ci piace: in questo caso, andiamo ad utilizzare AngularMaterial come framework e quindi, all\u0026rsquo;interno del metodo ngOnInit, andiamo a richiamare il servizio precedentemente creato e andiamo ad assegnare al datasource del componente MatTableDataSource l\u0026rsquo;elenco delle richieste:\n import { Injectable } from \u0026#39;@angular/core\u0026#39;; import {HttpClient} from \u0026#39;@angular/common/http\u0026#39;; import {environment} from \u0026#39;../../environments/environment\u0026#39;; export interface RequestData { id: string; name: string; description: string; } @Injectable({ providedIn: \u0026#39;root\u0026#39; }) export class RequestsService { constructor(private http: HttpClient) { } // tslint:disable-next-line:typedef getRequests() { return this.http.get\u0026lt;RequestData[]\u0026gt;(environment.baseURL + \u0026#39;/requests\u0026#39;); } }  Nel file requests.component.html definiamo la tabella che andrà a riepilogare gli oggetti: come input prende il parametro dataSource e come colonne avremo name e description, ossia le due proprietà delle nostre richieste:\n  Ci siamo! Per testare la nostra app, assicuriamoci di avviare il nostro back-end tramite terminale come visto in precedenza, mentre eseguiamo il comando ng serve per visualizzare l\u0026rsquo;applicazione Angular:\n  Ottimo. Anche in questo caso, è necessario definire un Dockerfile: può avere dell\u0026rsquo;incredibile, ma è pressoché identico a quello precedente. In questo caso, andiamo a copiare il contenuto della nostra webapp all\u0026rsquo;interno di /app, ma il tutto è assolutamente opzionale:\n FROM node:16.0.0 WORKDIR \u0026#39;/app\u0026#39; COPY package.json . RUN npm install COPY . . EXPOSE 4200 CMD [\u0026#34;npm\u0026#34;, \u0026#34;start\u0026#34;]  Siamo finalmente pronti per impacchettare il nostro lavoro e utilizzare Docker Compose!\n 4: da single-container a servizi con Docker Compose  Se sei arrivato fin qui, intanto complimenti: il lavoro fatto non è da poco!\n  La nostra cartella principale dovrebbe avere questo aspetto:\n  Eccetto la cartella docker-entrypoint-initdb.d (spoiler prossimo articolo!), dobbiamo passare alla creazione del file docker-compose.yml: lo creiamo nella cartella principale, così da poter poi fare riferimento alle due componenti che abbiamo lavorato finora in maniera efficiente.\n All\u0026rsquo;interno di questo file, andiamo a definire 3 servizi: uno per il front-end, uno per il back-end, e naturalmente uno per Mongo: finora abbiamo utilizzato un\u0026rsquo;istanza locale, ma il nostro obiettivo è quello di rendere tutto il nostro lavoro pronto all\u0026rsquo;uso!\n La strategia è quella di definire i diversi servizi, partendo dal front-end: specifichiamo il nome del container che verrà assegnato, le porte (di default Angular espone sulla 4200) e soprattutto indichiamo che il front-end dipende dal back-end: fintanto che questo non è stato avviato e non è pronto per lavorare, non avviamo il nostro front-end:\n frontend: container_name: frontend restart: always build: frontend ports: - \u0026#34;4200:4200\u0026#34; depends_on: backend: condition: service_healthy   Prossimo: il back-end.\n L\u0026rsquo;idea è la stessa, ma in questo caso definiamo anche il cosiddetto healthcheck: questo ci permette di essere certi che il back-end sia operativo.\n Naturalmente, il back-end dipende da MongoDB: dobbiamo quindi aggiungere una verifica, di modo che siamo sicuri che l\u0026rsquo;istanza del DB sia stato avviato correttamente (se non sai cos\u0026rsquo;è l\u0026rsquo;HEALTHCHECK, guarda qui!).\n backend: container_name: backend restart: always build: backend ports: - \u0026#34;8081:8081\u0026#34; healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;curl\u0026#34;, \u0026#34;-f\u0026#34;, \u0026#34;http://localhost:8081\u0026#34;] interval: 20s timeout: 200s retries: 5 depends_on: mongo: condition: service_healthy  Vediamo l\u0026rsquo;ultimo servizio, ossia quello per Mongo: in questo caso, usiamo l\u0026rsquo;immagine di Mongo e definiamo, oltre al binding delle porte, la definizione dell\u0026rsquo;environment (ossia il nome del database) ed anche l\u0026rsquo;healthcheck: anche in questo caso, dobbiamo verificare che l\u0026rsquo;istanza sia in esecuzoine e pronta per lavorare.\n Per farlo, utilizziamo un semplice comando che pinga il servizio di Mongo e diamo al test 5 tentativi (o retries) prima di dichiarare che non riesce a verificarne il funzionamento, con un ritardo di 40 secondi (così che il container abbia effettivamente il tempo di avviarsi) e un timeout di 10s (ossia il tempo che il test attende prima di concludere con un esito positivo o negativo).\n Ci siamo: il risultato finale dovrebbe essere il seguente:\n version: \u0026#34;3.5\u0026#34; services: frontend: container_name: frontend restart: always build: frontend ports: - \u0026#34;4200:4200\u0026#34; depends_on: backend: condition: service_healthy backend: container_name: backend restart: always build: backend ports: - \u0026#34;8081:8081\u0026#34; healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;curl\u0026#34;, \u0026#34;-f\u0026#34;, \u0026#34;http://localhost:8081\u0026#34;] interval: 20s timeout: 200s retries: 5 depends_on: mongo: condition: service_healthy mongo: container_name: mongo image: mongo command: mongod --port 27017 volumes: - ./docker-entrypoint-initdb.d/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro ports: - \u0026#34;27017:27017\u0026#34; environment: MONGO_INITDB_DATABASE: mydb healthcheck: test: echo \u0026#39;db.runCommand(\u0026#34;ping\u0026#34;).ok\u0026#39; | mongo mongo:27017/mydb --quiet interval: 10s timeout: 10s retries: 5 start_period: 40s  Manca solo un ultimo dettaglio: all\u0026rsquo;interno del backend, nel file index.js, abbiamo definito la stringa di connessione al database, che finora puntava a localhost; ora dobbiamo modificare il puntamento di modo che punti al nome del servizio, e quindi dovrà essere come la seguente:\n mongoose.connect(\u0026#39;mongodb://mongo:27019/mydb\u0026#39;, { useNewUrlParser: true});   Lo so, è stato faticoso, ma ci siamo: possiamo eseguire il comando docker-compose build e docker-compose up e finalmente vedere che il nostro stack è funzionante!\n  That\u0026rsquo;s all, folks!\nRisorse utili Docker cheatsheet\n Libro su Docker\n Libro de Basi di dati\n Come installare Docker (e Docker compose)\n Canale di Emmecilab\n ", "url": "https:\/\/theredcode.it\/mean-docker-sviluppare-una-webapp-da-zero-in-meno-di-unora\/" }, "https:\/\/theredcode.it\/tags\/mongodb\/": { "title": "mongodb", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/mongodb\/" }, "https:\/\/theredcode.it\/categories\/mongodb\/": { "title": "mongodb", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/mongodb\/" }, "https:\/\/theredcode.it\/recensioni\/elon-musk\/": { "title": "Elon Musk", "tags": [], "content": "Diamo un\u0026rsquo;occhiata a questo libro attraverso la recensione de Elon Musk: Tesla, SpaceX e la sfida per un futuro fantastico.\nRanking Anno 2017 Autore Ashlee Vance Genere Biografia Livello Per tutti Scorrevolezza 8 / 10 Originalità 8 / 10 Valutazione 8 / 10 Recensione Ambizione, determinazione e limiti: Elon Musk, arrivando a fondare molte aziende tra cui Tesla e Spacex, ha decisamente lasciato il segno. Non solo veniva accostato a figure del calibro di Steve Jobs, Bill Gates o Jeff Bezos ancor prima di compiere 35 anni, ma ha dimostrato con i dati e i fatti che le sue idee, inizialmente giudicate come strampalate, erano in realtà visionarie. In questo libro, viene delineato il profilo di un uomo che nasce in Sudafrica e si sente stretto nel posto in cui vive: si arma di pazienza e coraggio e viaggia per poter dare concretezza alle sue idee. Attraverso l\u0026rsquo;ambizione di vendere tutto per poter andare a vivere su Marte -quando sulla Terra non sarà più possibile, per via di come lo stesso essere umano la sta riducendo-, porta avanti strenuamente tutti i suoi progetti: partendo dal creare una delle startup più famose di sempre (Paypal), arriva a conquistarsi la fiducia dei molti finanziatori, che hanno creduto in lui ancor prima di vedere qualcosa di concreto realizzarsi. \u0026ldquo;Sono pazzo, secondo te?\u0026rdquo; si chiede molte volte, e come dargli torto? Elon Musk risulta essere una persona estremamente razionale, quasi da risultare incomprensibile ad un occhio non attento: una persona che ci tiene moltissimo alla sua salute fisica e mentale, che cura molto l\u0026rsquo;aspetto relazionale pubblico e non -al contrario di altri personaggi-, ed è una persona che dà sempre il 200% in quello che fa. Non ci sono problemi, ma slo soluzioni è il suo motto: in diversi episodi, molti dei suoi (ex) dipendenti raccontano di come lui non volesse sentir parlare di problemi se non avendo di fronte già delle alternative possibili. Questo perché, come è ben noto, la strada di Musk non è sempre stata spianata: è ben noto ai più che non sempre i lanci organizzati da SpaceX vadano a buon fine, e non manca mai una buone dose di meme a sottolineare ogni fallimento. Molti dei clienti che finanziarono le auto vendute dalla Tesla quando questa era agli inizi -finanziarono, non acquistarono-, non videro arrivare il loro acquisto prima di qualche anno, e spesso le loro supercar arrivarono con diversi problemi. https://twitter.com/i/status/1125874716911251458 Nonostante sia stato additato come un supermaniaco del controllo e un pazzo, quello che invece viene fuori da questo libro è che si ha davanti un uomo che ha del visionario e, nelle sue idee e soprattutto nei suoi progetti (raramente le sue idee rimangono nella Terra del Pensiero, come dice Alberto Savoia), non traspare mai l\u0026rsquo;incertezza, ma solo la determinazione: sa che difficilmente riuscirà a vedere i risultati del lavoro che sta svolgendo, avendo a disposizione un arco temporale così breve come una vita, ma nonostante ciò porta avanti le azioni verso la sua visione del mondo che verrà. Unica pecca è a volte l\u0026rsquo;uso di un linguaggio fortemente tecnico in ambito startup e joint venture: per chi non lavora/bazzica il settore, si tratta di passaggi che lasciano l\u0026rsquo;amaro in bocca, anche se è comprensibile che lo scopo del libro fosse un altro.\nLezione imparata Lui come Steve Jobs hanno una forte intolleranza nei confronti della stupidità; Come leader non sempre si è in grado di fare abbastanza spazio per le relazioni personali; La crescita personale e professionale a volte vanno di pari passo, mentre altre volte viaggiano su binari paralleli.  Quotes \u0026ldquo;Se la Silicon Valley cerca un erede di Steve Jobs, che possa assumere il ruolo di forza dominante e guida per il settore della tecnologia, Musk si profila come il candidato più papabile.\u0026rdquo; \u0026ldquo;Sono un uomo complicato con esigenze molto semplici, ma specifiche.\u0026rdquo; \u0026ldquo;Nessun uomo è un\u0026rsquo;isola, a meno che non sia molto grosso e non galleggi.\u0026rdquo;\n  Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/elon-musk\/" }, "https:\/\/theredcode.it\/voglio-essere-un\/a-data-scientist\/": { "title": "Voglio essere un\/a data scientist", "tags": ["data-scientist","voglio-diventare",], "content": " \u0026ldquo;Voglio essere un/a data scientist.\u0026rdquo;  Questa affermazione l\u0026rsquo;ho sentita fare spesso, seguita da domande come \u0026ldquo;cosa devo fare per lavorare come data scientist?\u0026rdquo; oppure \u0026ldquo;devo saper programmare con Python?\u0026rdquo;, o ancora \u0026ldquo;che corsi devo seguire?\u0026rdquo;.\n La data science è una scienza che è emersa nell\u0026rsquo;ultimo decennio come una delle competenze più richieste: girando per i diversi siti di annunci di lavoro, o magari su LinkedIn, è frequente trovare aziende alla ricerca di data scientist che spesso vengono anche pagati abbastanza bene; alcune università hanno anche avviato dei corsi di specializzazione in data science e hanno riscosso un notevole successo.\n Ma cosa bisogna fare per diventare un data scientist?  Cominciamo con il dire che si tratta di una domanda che non è posta bene: questa scienza è piuttosto ampia, con competenze che vanno dal sapere accedere e manipolare i dati, fino all\u0026rsquo;utilizzo di questi la risoluzione di problemi tramite tecniche di apprendimento automatico, o anche tramite la creazione di dashboard che permettano la visualizzazione di queste informazioni all\u0026rsquo;amministrazione IT.\n  Essere un data scientist significa questo: lavorare in un campo dove è necessario possedere diverse competenze, con lo scopo di interpretare ed estrarre della conoscenza dai dati attraverso delle fasi di analisi e lavorazione degli stessi.\n    Fino a qualche anno fa il termine data scientist indicava queste competenze, tutte all\u0026rsquo;interno dello stesso profilo professionale, ma non è più così.\n A seguito della crescita del numero di competenze richieste, i profili specializzati con skills sempre più diversificate hanno iniziato a crescere all\u0026rsquo;interno del settore IT: per questa ragione, adesso non si parla più solo di data scientist, ma anche di data engineer, data analyst, data modeler, data entry oltre che Big data e data specialist.\n Vediamo nel dettaglio come si differenziano queste professioni e che cosa fanno nel pratico.\n Data Engineer  O anche ingegnere dei dati: una parte importante delle attività di \u0026ldquo;laboratorio\u0026rdquo; della scienza dei dati consiste nel prendersi cura dei dati: attività come l\u0026rsquo;archiviazione, l\u0026rsquo;accesso o l\u0026rsquo;aggiornamento delle informazioni.\n I data engineer devono avere familiarità con servizi cloud, servizi Web gratuiti o anche a pagamento, repository che tracciano Big data, diversi tipi di software di gestione dei database, e via dicendo.\n Inoltre, devono garantire una certa qualità di base dei dati, eliminando incongruenze e/o duplicazioni e implementando KPI comuni per quel dominio aziendale.\n Data Analyst  O anche _analista dei dati, q_uesto termine raccoglie tutte le figure professionali con una profonda esperienza in un dominio specifico, come ad esempio la finanza, la sanità, l\u0026rsquo;IoT o l\u0026rsquo;industria automobilistica.\n Gli analisti di dati non sono necessariamente esperti di dati dal punto di vista dell\u0026rsquo;IT o dell\u0026rsquo;apprendimento automatico, ma conoscono i loro dati dentro e fuori: il processo di raccolta, i casi aziendali, le tecniche di preparazione dei dati e i KPI più adatti per descrivere casi d\u0026rsquo;uso specifici.\n Di solito sono esperti nelle tecniche di visualizzazione dei dati, poiché il loro ruolo principale all\u0026rsquo;interno del laboratorio di scienza dei dati è spiegare il problema, monitorare il processo e interpretare i risultati. Sono il collegamento necessario tra l\u0026rsquo;algoritmo, i dati e gli esperti IT e gli stakeholder aziendali.\n Data entry assistant  L\u0026rsquo;immissione dei dati è un settore in cui i dipendenti aggiungono, verificano e modificano i dati inseriti in un sistema di gestione.\n Molte aziende hanno bisogno di persone per trascrivere gli appunti dalle riunioni, aggiungere dati grezzi nei database e aggiungere i dati di vendita in formati elettronici più volte nel corso di una giornata lavorativa, o ancora registrare dei dati inseriti in delle card tramite software specializzati.\n Un candidato che lavora nell\u0026rsquo;inserimento dei dati dovrà gestire in modo efficiente una grande quantità di informazioni che sono spesso sensibili o riservate.\n L\u0026rsquo;integrità di qualsiasi azienda si basa sui dati che producono e che convalidano l\u0026rsquo;importanza della posizione di data entry. Qualsiasi informazione immessa dal team verrà quindi utilizzata da altre persone per riferimento o rapporti.\n Data modeler  Il ruolo del modellatore di dati è uno dei più richiesti nelle moderne strategie per la gestione dei dati e spesso non è considerato un ruolo a sé, ma parte di altre mansioni: sono sempre più le aziende infatti che convertono i loro attuali modelli di dati in dati non strutturati sfruttando piattaforme NoSQL; questo non solo richiede esperienza nell\u0026rsquo;utilizzo di RDBMS, data warehouse e modello OLAP dimensionale, ma anche una profonda conoscenza nella progettazione di piattaforme per Big data.\n (Big) Data specialist  Il compito di uno specialista di dati è convertire i dati grezzi in formati facilmente accessibili per i clienti: ciò potrebbe includere la progettazione del database e la formazione dei clienti sull\u0026rsquo;uso dei sistemi di archiviazione dati.\n  Il compito in questo caso è quello di analizzare e verificare l\u0026rsquo;autenticità dei dati, convertire i dati in un formato che ne renda più semplice la fruizione e la gestione come un database, generare report dettagliati oltre che fornire supporto tecnico ai tuoi clienti.\n  Questo lavoro ruota attorno all\u0026rsquo;elaborazione e all\u0026rsquo;analisi dei dati: potresti essere chiamato per gestire progetti ad alta priorità e risolvere discrepanze ed errori nei dati per conto di aziende farmaceutiche, agenzie governative o anche aziende IT.\n Ci si aspetta che uno specialista dei dati sia bravo in matematica ed eccellente nella programmazione; deve anche possedere delle buone capacità di ascolto, attenzione ai dettagli e capacità di risoluzione dei problemi.\n Data scientist Alla fine dei conti, i data scientist non sono così tanti, né tantissimi sono necessari. I data scientist esaminano l\u0026rsquo;intero processo, implementano la fase di preparazione dei dati, selezionano, sfruttano e valutano gli algoritmi di machine learning e impacchettano il modello prodotto nell\u0026rsquo;applicazione di distribuzione.\n Un data scientist deve padroneggiare l\u0026rsquo;arte di costruire una pipeline per ottenere un modello addestrato affidabile ed efficiente, adottando le migliori pratiche aggiornate nel campo della scienza dei dati. Deve avere un\u0026rsquo;ampia conoscenza degli algoritmi di apprendimento automatico (e non solo) e delle insidie e problemi associati a ciascuno di essi.\n E quindi\u0026hellip;  Tenendo presente il ruolo professionale che hai scelto, la seconda domanda più frequente è: \u0026ldquo;Ho un background in matematica o analisi dei dati. Cos\u0026rsquo;altro mi serve? Basterebbe un corso online sul deep learning?\u0026rdquo;\n Non esiste una risposta precisa, perché sicuramente l\u0026rsquo;esperienza che si matura grazie all\u0026rsquo;affiancamento di un professionista è già di per sé una scuola molto valida; in realtà, molto dipende dalla profondità dell\u0026rsquo;analisi dei dati e dal background matematico.\n La conoscenza dei fogli Excel e delle istruzioni SQL potrebbe non essere più sufficiente, ma magari sono necessarie delle competenze di livello più tecnico.\n In ogni caso, partire da un corso (online ce ne sono moltissimi, ma anche percorsi universitari specifici sono sicuramente un buon inizio) è l\u0026rsquo;ideale: quando scegli che percorso di studio seguire, però, assicurati che il corso aggiunga un valore reale al tuo background, affrontando i buchi nella tua istruzione e allo stesso tempo esplorando gli argomenti proposti in modo sufficientemente approfondito.\n Se conosci già il tema del machine learning e le diverse tecniche, magari segui un corso sui Big data; viceversa, se sei già un esperto di gestione dei database, magari dovresti approfondire il tema delle tecniche di apprendimento o sulla statistica.\n Molto, troppo spesso, i candidati si presentano ad un colloquio con una conoscenza molto generale (considerata spot) che risulta solo molto confusa e non realmente utile nel pratico: conoscere quali algoritmi sono disponibili nel mondo del deep learning non è sufficiente per saperli usare, ma piuttosto è bene portare dei casi di studio reali.\n Quello che infatti può risultare molto più interessante è parlare di esperienze proprie, anche se non professionali, dove sono state maturate delle competenze che rendono il nostro profilo professionale di rilievo.\n Parlando di casi di studio, non è necessario appunto concentrarsi sul fatto di non avere esperienza: esistono diversi modi per costruirsi una propria esperienza, come ad esempio partecipare a degli hackaton o delle challenge online: Kaggle è uno di quei siti che mette a disposizione delle competizioni piuttosto interessanti e di ogni livello e rappresenta un modo ottimale per farsi le ossa.\n Ma devo saper programmare?  Ultimo aspetto, ma non ultimo: c\u0026rsquo;è molto margine di discussione su questo. Alcune persone dicono che è assolutamente necessario, altre persone dicono che sono la prova vivente che non è necessario programmare per essere un data scientist.\n La realtà è che esistono molti strumenti open source e non affidabili e molto utilizzati in queste situazioni che spesso non richiedono competenze di programmazione, ma più di risoluzione logica oltre che competenze trasversali.\n  È mia opinione che molti di questi strumenti che non richiedono delle solide basi di programmazione, come la piattaforma KNIME, si siano dimostrati più che ottimi e che coprono ampiamente le diverse operazioni sui dati grazie all\u0026rsquo;uso degli algoritmi a disposizione.\n Tuttavia, come abbiamo visto, nessuna di queste attività è strettamente correlata ad una sola competenza o strumento, ma di solito viene richiesta una certa flessibilità nell\u0026rsquo;utilizzare più strumenti: questo significa che quanto più saremo in grado di espandere le nostre conoscenze, tanto più sarà possibile spaziare da un\u0026rsquo;attività all\u0026rsquo;altra.\n Per concludere\u0026hellip;   \u0026hellip; un atteggiamento curioso e incline all\u0026rsquo;apprendimento può portarti lontano.\n  Nella scienza dei dati (e non solo), la conoscenza si evolve costantemente e la tua esperienza diventa rapidamente obsoleta. Un atteggiamento che porti all\u0026rsquo;apprendimento continuo, oltre ad essere rinfrescante, ti consente di rimanere sempre in pista, anche quando le regole del gioco cambiano.\nRicorda che puoi imparare nuove tecniche ovunque e da chiunque: ai corsi, ai webinar, dai colleghi, dagli insegnanti, da campi che sembrano non avere nulla a che fare con la tua attività attuale, dai media, dai blog e così via sopra.\n È buona norma riservarsi del tempo per apprendere periodicamente alcune delle tecniche più recenti.\n  L\u0026rsquo;esperienza viene maturata anche sul lavoro.\n  Il tempo per imparare di più sulle tecniche emergenti deve provenire anche dal lavoro: quello che puoi augurarti è infatti di vere un buon capo - o meglio, leader- che ti guidi nel percorso e ti affianchi ad un team di esperti che sanno indirizzarti verso il tuo percorso di crescita professionale.\n  Un capo che funge da mentore è una grande opportunità per progredire tecnicamente e per plasmare il tuo ruolo. Quindi, scegli con saggezza.\n ", "url": "https:\/\/theredcode.it\/voglio-essere-un\/a-data-scientist\/" }, "https:\/\/theredcode.it\/tags\/android\/": { "title": "android", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/android\/" }, "https:\/\/theredcode.it\/come-sviluppare-unapp-per-android-con-flutter\/": { "title": "Come sviluppare un\u0027app per Android con Flutter", "tags": ["android","flutter",], "content": "Vorresti sviluppare un\u0026rsquo;app per Android, ma non conosci Flutter? Nessun problema: in meno di 20 minuti, la tua app sarà pronta.\nFlutter è un framework open source sviluppato da Google e presentato al Mobile World Congress 2018 che consente di creare applicazioni native per iOS e Android utilizzando un solo ambiente di sviluppo.\nAl momento, la release è arrivata alla 2.0.4; le potenzialità sono già molto ricche, e si prevedono altri rilasci nel prossimo anno, come si può vedere dal repository GitHub (link: https://github.com/flutter/flutter/milestones), che ha più di 110.000 followers.\nRepository\nhttps://github.com/serenasensini/FZTH-Flutter\nMateriale Android Studio Dispositivo Android Cavo USB per il dispositivo Requisiti Attenzione: non sono requisiti minimi, ma semplicemente quelli utilizzati per questo tutorial.\n Android Studio 4.2 Flutter 2.4.0 Windows 10 Android (versione \u0026gt; 4.0) STEP 1: configurazione dell’ambiente di lavoro Andiamo per gradi: per prima cosa, è necessario installare il framework. Dalla pagina https://flutter.dev/docs/get-started/install è possibile scaricare Flutter a seconda del proprio OS; una volta ultimato il download, sarà sufficiente scompattare il pacchetto e copiarlo in una directory facilmente accessibile dal sistema. Nel caso di Windows, è consigliabile utilizzare una qualsiasi sottocartella di “C:\\Users”; è importante non copiare la cartella all’interno di “C:\\Program Files”, perché si potrebbero avere problemi di permessi.\nFatto questo, sarà necessario settare le variabili di ambiente: per chi non sapesse di cosa si tratta, sono delle variabili che ci permettono di indicare al sistema operativo dove trovare determinati file, così da poter eseguire una serie di istruzioni da righe di comando. Andiamo quindi a cliccare sullo Start di Windows, cercando la parola “env” e cliccando su “Modifica le variabili di ambiente relative al sistema”. Andiamo poi a cliccare su “Variabili d’ambiente” in basso a destra, e andiamo a selezionare la variabile dell’utente “Path”, come viene mostrato di seguito:\nConfigurazione delle variabili di ambiente su Windows\nSi aprirà una finestra con l’elenco delle variabili: cliccando su “Nuova”, andiamo ad inserire il path della cartella di Flutter. Ad esempio, se nella fase precedente abbiamo copiato la cartella sotto “C:\\Users\\Pippo\\flutter\\bin”, andremo ad inserire quello stesso percorso come variabile di ambiente.\nCome ultimo passaggio, in questa fase, dobbiamo verificare se sono soddisfatti i requisiti minimi affinché flutter possa essere eseguito; andiamo quindi ad aprire la riga di comando e ad eseguire “flutter doctor”. Questo tool ci permette di verificare se tutti i componenti necessari sono installati o meno, e in tal caso, a correggerli. Come è possibile vedere nella prossima figura, è necessario aver installato Android Studio oppure Intellij, per far sì che si possa creare un progetto Flutter:\nVerifica dei requisiti minimi\nIn questo caso, ho scelto di utilizzare Android Studio: è scaricabile gratuitamente dal sito https://developer.android.com/studio.\nUna volta installato Android Studio, è anche necessario installare due plugin, ovvero Flutter e Dart; Dart è un linguaggio di programmazione sempre sviluppato da Google, con cui Android Studio lavora. Apriamo quindi Android Studio, premiamo Ctrl+Alt+S e clicchiamo su Plugins; andiamo a cercare Flutter e Dart e li andiamo ad installare: Installazione di Flutter e Dart\nSTEP 2: set up del dispositivo su cui installare l’app Per poter installare e usare l’app Flutter, è necessario configurare un dispositivo (in questo caso) Android in modo che sia abilitato in modalità Debug; se il nostro smartphone/tablet ha già questa impostazione settata, è possibile passare allo step successivo. In caso contrario, sarà sufficiente seguire questi semplici passi:\n Aprire le Impostazioni del dispositivo; Selezionare “Sistema”; Selezionare “Info telefono”; Cliccare sette volte sulla voce “Numero di build”, fintanto che non si leggerà un toast con scritto “Opzioni da sviluppatore abilitate!”; Tornando indietro nel menù, dovrebbe leggersi la voce “Opzioni sviluppatore”, come viene mostrato di seguito; da qui, è necessario selezionare le impostazioni _Opzioni sviluppatore\u0026gt;_Debug USB e abilitarle: Configurazione Debug USB su Android\nFatto questo, rimane una sola configurazione: è necessario installare i Driver USB di Google (scaricabili al sito https://developer.android.com/studio/debug/dev-options), seguendo le istruzioni presenti. Colleghiamo quindi il nostro dispositivo tramite cavo USB al computer e verifichiamo che venga rilevato, digitando il comando “adb devices” da riga di comando; se il risultato è simile a quello in figura, significa che siamo pronti per procedere. In caso contrario, rivedere quanto fatto finora:\nControllo che il dispositivo sia collegato correttamente\nSTEP 3 — Hello World in Flutter Per creare la nostra prima app, sarà sufficiente seguire questi passi:\n Cliccare sulla voce “Start a new Flutter Project”, come nella prossima schermata: Avvio di Android Studio\n Selezionare la voce “Flutter Application”, come nella figura successiva, e cliccare su \u0026ldquo;Next\u0026rdquo;; | Creazione di un nuovo progetto Flutter|\n Scegliere un nome per la nostra prima app e installare l’SDK -se non è già stato fatto-, cliccando sulla voce “Install SDK”, come nella seguente immagine: Configurazione dell\u0026rsquo;applicazione\nPer far partire la nostra app, basterà quindi cliccare sull’icona verde di esecuzione in alto a destra, accanto alla voce che indica il modello del dispositivo collegato, come in figura:\nEsecuzione dell\u0026rsquo;app con il dispositivo collegato\nSul dispositivo si avvierà quindi l’app (come visibile nella prima schermata), che mostra il numero di volte che il pulsante “+” viene premuto; il codice a cui fa riferimento il testo in questa parte è nel file main.dart, dove è possibile vedere il componente “Text” con il nostro messaggio e il componente “FloatingActionButton”:\nSchermata dell\u0026rsquo;applicazione di esempio\nPorzione di codice dove viene definito il testo della schermata principale\nThat’s all, folks. Ci vediamo al prossimo articolo!\nRisorse utili \u0026ldquo;Flutter\u0026rdquo; (disponibile su Amazon) ", "url": "https:\/\/theredcode.it\/come-sviluppare-unapp-per-android-con-flutter\/" }, "https:\/\/theredcode.it\/tags\/flutter\/": { "title": "flutter", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/flutter\/" }, "https:\/\/theredcode.it\/categories\/flutter\/": { "title": "flutter", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/flutter\/" }, "https:\/\/theredcode.it\/recensioni\/big-data-analytics\/": { "title": "Big Data Analytics", "tags": [], "content": "Ranking Autore Andrea de Mauro Genere Tecnico Livello Per tutti Scorrevolezza 10 / 10 Originalità 10 / 10 Valutazione 10 / 10 Recensione Comincio dicendo che questo manuale ha una struttura molto chiara: dopo una panoramica teorica -ma mai banale- sul tema, si passa subito all\u0026rsquo;azione: viene infatti introdotto KNIME, uno strumento davvero ben fatto -e open source- dotato di un\u0026rsquo;interfaccia che consente agli utenti meno \u0026ldquo;smanettoni\u0026rdquo; in termini di programmazione di sfruttare tutto il potenziale delle tecniche di machine learning e di creare dei workflow per l\u0026rsquo;analisi dei dati. KNIME non è stato scelto a caso: si tratta infatti di una delle piattaforme leader nell\u0026rsquo;ambito dei Big Data Analytics ed è un competitor diretto di grosse multinazionali (tra le quali, IBM). Attraverso i diversi capitoli, vengono analizzate diverse tecniche di gestione dei dati: esempi concreti di come importare i dati, ripulirli e utilizzare delle formule matematiche (sono elementari, giuro!) per eseguire un\u0026rsquo;esempio di analisi. Non solo: attraverso un capitolo dedicato al machine learning, uno alle tecniche di classificazione ed altri algoritmi, l\u0026rsquo;autore ha portato ad un livello successivo il materiale, corredando ogni singolo esempio da un caso di studio pratico e reale. In un manuale del genere non si possono non apprezzare aspetti come la semplicità del linguaggio, l\u0026rsquo;immediatezza degli esempi (predire un cliente che cambierà operatore o i prezzi degli immobili di una certa zona, per dirne due) e la linearità del testo. Non ci si perde in chiacchere e ogni singolo passaggio è curato nei minimi dettagli, proprio per rendere l\u0026rsquo;esperienza del lettore alla portata di una futura applicazione pratica. E se questo non fosse abbastanza, l\u0026rsquo;ultimo capitolo è dedicato a chi di programmazione ne sa qualcosa: KNIME permette infatti di utilizzare delle estensioni che consentano la programmazione in Python e R; si tratta di una funzionalità che personalmente ho adorato (le black-box non piacciono a nessuno, diciamocelo pure!) e che, anche in questo caso, l\u0026rsquo;autore ha trattato con estrema semplicità, senza mai avere troppa fretta nel concludere l\u0026rsquo;argomento. Credo che parlare di temi non sempre semplici come questi in un modo così interessante sia una dote eccezionale: e questo non vale solo per una persona come Andrea De Mauro che ha un curriculum impressionante, ma è indicativo del fatto che non tutte le persone professionalmente valide sono davvero in grado di rendere in parole la propria conoscenza, mentre lui ci è riuscito alla perfezione. Se per questo libro non bastasse, per fortuna ce n\u0026rsquo;è un altro: Big Data per il Business, ovviamente già nella pila di libri da leggere quest\u0026rsquo;anno.\nLezione imparata Il sovraccarico informativo è una delle più grosse piaghe del XXI secolo; La differenza tra clustering e classificazione è così sottile che a volte non viene compresa a pieno; Il metodo del gomito è un\u0026rsquo;ottima tecnica euristica quando vorresti sbattere la testa nel decidere come gestire un cluster.  Quotes  \u0026ldquo;Una valutazione qualitativa deve necessariamente tradursi in qualcosa di riproducibile da una macchina in fase di apprendimento\u0026rdquo; \u0026ldquo;L\u0026rsquo;euforia legata alla loro [intelligenza artificiale, Big Data, machine learning] affermazione si è trovata spesso a superare la loro stessa comprensione\u0026rdquo; Sapevi che\u0026hellip; \u0026ldquo;KNIME\u0026rdquo; è l\u0026rsquo;unione di \u0026ldquo;KN\u0026rdquo; (la sigla della città di Costanza, dove nasce il progetto), \u0026ldquo;IM\u0026rdquo; (Information Mining) e \u0026ldquo;E\u0026rdquo;, aggiunto per questioni di suono.  Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/big-data-analytics\/" }, "https:\/\/theredcode.it\/come-usare-gitflow-per-gestire-le-features\/": { "title": "Come usare GitFlow per gestire le features", "tags": ["git","gitflow",], "content": " Lavorare in team non è semplice: è abbastanza frequente che più sviluppatori lavorino allo stesso progetto, ma avendo a che fare con features diverse: per evitare di soccombere di fronte al merge con il codice di un collega, vediamo come usare GitFlow per gestire lo sviluppo di nuove features.\n Cos\u0026rsquo;è  GitFlow è un modello di ramificazione per Git, creato da Vincent Driessen. Ha attirato molta attenzione perché è perfetto per lavori in cui si ha a che fare con altri colleghi o un team di sviluppo in continua evoluzione.\n Come funziona  Ogni nuova funzionalità (o feature) dovrebbe risiedere nel proprio branch, che può essere inviato al repository principale una volta ultimata l\u0026rsquo;attività.\n Tradizionalmente, quando si usa Git per sviluppare, è bene utilizzare il branch chiamato master solo per i rilasci di software definitivo e testato; utilizzando un branch chiamato -ad esempio- develop, è possibile salvare anche lavori ancora in via di definizione.\n Con GitFlow, invece avere un uso centralizzato di develop, è possibile utilizzare questo branch come \u0026ldquo;genitore\u0026rdquo; delle future features: quando una funzionalità è completa, viene unita al branch develop.\n Come si vede nella figura seguente, a partire dal ramo master vengono sviluppate due features tra la versione 0.1 e la 0.2: in quei due rami, gli sviluppatori effettuano diversi commit all\u0026rsquo;interno della propria feature; chiaramente, lo sviluppatore continua a ricevere eventuali aggiornamenti dagli altri branch (effettuando un merge), ma può intanto lavorare in parallelo alla propria.\n Una volta chiuso il proprio task, è possibile procedere alla pubblicazione della propria feature sul ramo develop.\n Esempio di come funziona GitFlow nella gestione delle features\n Benefici  Sviluppo in parallelo  Uno dei vantaggi principali di GitFlow è che rende lo sviluppo parallelo molto semplice, isolando il nuovo sviluppo di una certa feature dal lavoro già concluso.\n Il nuovo sviluppo (come lavoro sulle funzionalità e correzioni di bug non di emergenza) viene eseguito nei rami per le feature e viene unito di nuovo nel ramo principale del codice solo quando lo sviluppatore è sicuro che il codice sia pronto per il rilascio.\n Collaborazione  I branch basati su feature rendono inoltre più facile per due o più sviluppatori collaborare alla stessa funzionalità, perché ogni feature viene racchiusa in un branch che è come una sandbox in cui le uniche modifiche sono le modifiche necessarie per far funzionare la nuova funzionalità.\n Ciò rende molto facile vedere e seguire ciò che ogni collaboratore sta facendo.\n Come funziona  Supponiamo di avere un repository chiamato myrepo: eseguiamo i seguenti comandi per creare (se non c\u0026rsquo;è già) il branch develop e per iniziare a lavorare ad una nuova feature chiamata my_feature:\n $ git flow init $ git flow feature start my_feature  Una volta che il lavoro è stato completato, posso eseguire il seguente comando per effettuare il merge con il ramo develop:\n $ git flow feature finish my_feature  Se poi stiamo lavorando in collaborazione con altre persone, possiamo pubblicare la feature eseguendo il primo comando, oppure recuperare eventuali funzionalità pubblicate eseguendo il secondo:\n $ git flow feature publish my_feature $ git flow feature pull origin my_feature  Attenzione però: GitFlow non lavora solo con le features, ma anche con i rilasci e le situazioni di emergenza: infatti, è possibile utilizzare gli stessi comandi visti in precedenza sostituendo la parola release e hotfix al posto di feature, dove nel primo caso si lavora alla preparazione di una nuova versione da rilasciare in produzione oppure per correggere eventuali bug minori, mentre nel secondo caso si ripara a bug che devono essere risolti immediatamente.\n Tip  Se non ricordi tutti i comandi e hai bisogno di un cheatsheet, puoi scaricarlo da qui! E se ancora avessi dei dubbi, qui c\u0026rsquo;è tutta la roadmap di come lavorare con feature, rilasci e fix creata da Daniel Kummer.\n Risorse utili   Letture consigliate: Docker (disponibile su Amazon) Canale di Emmecilab  ", "url": "https:\/\/theredcode.it\/come-usare-gitflow-per-gestire-le-features\/" }, "https:\/\/theredcode.it\/tags\/git\/": { "title": "git", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/git\/" }, "https:\/\/theredcode.it\/tags\/gitflow\/": { "title": "gitflow", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/gitflow\/" }, "https:\/\/theredcode.it\/categories\/gitflow\/": { "title": "gitflow", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/gitflow\/" }, "https:\/\/theredcode.it\/recensioni\/la-mucca-viola\/": { "title": "La Mucca Viola", "tags": [], "content": "In questa recensione de La mucca viola vediamo in che modo è possibile trovare la chiave di lettura di molte storie di successo, più o meno note, che possono però insegnare ancora tanto, anche dopo che l\u0026rsquo;effetto svanisce: in altre parole, che cosa hanno aziende come Apple, Google, o Starbucks che gli altri non hanno? Quali sono le strategie -o le idee- dietro al loro successo?\nRanking Anno 2004 Autore Seth Godin Genere Marketing, Autoaiuto Livello Per tutti Scorrevolezza 8.5 / 10 Originalità 9 / 10 Valutazione 9 / 10 Recensione Letto con estremo ritardo rispetto a quando ho ricevuto il consiglio di un caro amico, man mano che leggevo -anzi, divoravo- le pagine, mi sono resa conto di quanto i miei occhi si focalizzassero su ogni singola frase. Sì, purtroppo sono una di quelle persone che legge tantissimo, ma legge incrociato e spesso applica lo skimming; questo però non è applicabile a letture come questa, che per essere comprese fino in fondo, hanno bisogno della lettura a voce alta in silenzio di ogni singola parola\u0026hellip; ed è così che ho scoperto molte delle idee che hanno reso delle campagne pubblicitarie, e non solo, il successo dietro l\u0026rsquo;ascesa di molte aziende. Tra i casi di studio citati ci sono quelli di Curad (conosciuti per i cerotti decorati con i personaggi dei cartoni animati), il servizio postale USA (che si è inventato un codice postale che gestisse anche zone topografiche di piccole dimensioni, aiutando il marketing ad indirizzare gli annunci in modo ancor più mirato), Tiffany (con il suo inconfondibile colore del packaging), Häagen-Dazs, (grande catena che dà attenzione al singolo grazie all\u0026rsquo;uso di banali biglietti da visita), Nokia con il celebre Vertu, Motorola, e moltissime altre aziende di fama mondiale. L\u0026rsquo;otaku aiuta le persone a scoprire e creare la Mucca Viola, proprio come Willy Wonka ha fatto fondando la Fabbrica di Cioccolato: la sua smodata passione per i dolci che porta avanti fin da ragazzino (con soprattutto la disapprovazione del padre dentista), lo porta a creare un qualcosa di straordinario, che lo renderà celebre in tutto il mondo; quando la Mucca Viola si esaurisce, ecco che arrivano i Golden Tickets: con questa trovata, l\u0026rsquo;azienda ritrova e supera lo splendore iniziale. La sezione che più mi ha colpito è quella relativa al contrario di \u0026ldquo;straordinario\u0026rdquo;: non è \u0026ldquo;pessimo\u0026rdquo;, non è \u0026ldquo;usuale\u0026rdquo;, non è neanche \u0026ldquo;discreto\u0026rdquo;. Il contrario è \u0026ldquo;ottimo\u0026rdquo;, e questo perché lo straordinario è un qualcosa che permette alle persone di avere un argomento di conversazione e di superare qualsiasi aspettativa; questo è ancor più difficile quando abbiamo un target di potenziali consumatori che sì, hanno qualcosa in comune, ma no, non sono tutti uguali. In un\u0026rsquo;epoca poi in cui i consumatori sono persone sempre di fretta e sono bombardati di pubblicità che hanno imparato ad ignorare, è ancora più importante il concetto di Mucca Viola per emergere e richiamare l\u0026rsquo;attenzione dei nostri vecchi clienti, ancor più di quelli nuovi.\nLezione imparata Come vengono classificati i vari consumatori; Come il leader si afferma e sa quando cedere il passo; Meglio stare fermi e non fare niente, piuttosto che prendere iniziative a caso e rischiare di perdere terreno con passi falsi; Puntare sempre su qualcosa di assolutamente fuori dall\u0026rsquo;ordinario; Il concetto di otaku è fondamentale per riuscire a creare una Mucca Viola.  Quotes \u0026ldquo;La maggior parte dei consumatori non può acquistare il nuovo prodotto, perché o non possiede il denaro necessario, o non ne ha il tempo, o non ne ha bisogno.\u0026rdquo; \u0026ldquo;Se un prodotto non sembra destinato ad avere un futuro straordinario - cioè se non riusciamo a immaginare un futuro nel quale la gente sarà ancora affascinata dal nostro prodotto- è venuto il momento di capire che il gioco è cambiato. Anziché investire in un prodotto destinato a morire, prendiamo i profitti e reinvestiamoli nella creazione di un prodotto totalmente nuovo.\u0026rdquo; \u0026ldquo;La mucca viola non è una scorciatoia che garantisce risparmi, ma è la strategia migliore, e forse l\u0026rsquo;unica, per conseguire una crescita.\u0026rdquo;\n  Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/la-mucca-viola\/" }, "https:\/\/theredcode.it\/recensioni\/alibaba\/": { "title": "Alibaba", "tags": [], "content": "In questa recensione di Alibaba: la storia di Jack Ma e dell\u0026rsquo;azienda che ha cambiato l\u0026rsquo;economia globale vediamo uno scorcio di racconto in presa diretta di come un personaggio di nome Jack Ma, nonché fondatore di Alibaba, abbia costruito una delle aziende di maggior valore al mondo (al pari di Amazon) portando dei grandi cambiamenti in termini di strategie aziendali e di economia globale.\nRanking Anno 2018 Autore Duncan Clark Genere Biografie Livello Per tutti Scorrevolezza 10 / 10 Originalità 10 / 10 Valutazione 10 / 10 Recensione Ho letto questo libro diverso tempo fa, ma grazie a Duncan Clark ho deciso di dare una chance ad un genere che difficilmente -a torto- leggevo, ossia le biografie; non tutti gli autori sono in grado di romanzare una vita intera, soprattutto se si tratta della vita di uno dei geni del XXI secolo, ma Clark ci è riuscito in pieno. Il libro è scorrevole, si legge in un paio di giornate. La storia della crescita personale e professionale di Jack Ma, oltre la Silicon Valley, regala un esempio lampante di come farsi le ossa e lavorare sodo porti (quasi) sempre a risultati eccezionali (non ottimi!). Questa non è infatti la classica biografia, ma è più che altro uno spunto che regala una visione del tutto nuova su come partendo da un\u0026rsquo;idea concreta, si possa ad arrivare ad ottenere un successo come quello di Alibaba, oltre al fatto di potersi vedere nell\u0026rsquo;immagine di un uomo di successo a livello professionale; Jack Ma ha infatti lasciato la sua carica di presidente esecutivo dell\u0026rsquo;azienda nel 2018 e da allora si occupa di filantropia a tutto tondo, tanto da guadagnarsi il titolo di \u0026ldquo;eroe della filantropia in Asia\u0026rdquo;. Forse, proprio per questa sua sensibilità dimostrata fin da giovane -nonché per le sue origini-, è arrivato alla conclusione di un percorso che lavorativamente parlando ha richiesto enormi sacrifici (non ha mai nascosto di aver dedicato troppo poco tempo alla sua famiglia), per restituire un po\u0026rsquo; del successo guadagnato a chi ne ha più bisogno. A conferma di questo, parlando con un amico con cui condivido la maggior parte dei gusti letterari, ho capito che l\u0026rsquo;empatia e l\u0026rsquo;ottimismo che trasmette questo personaggio ha un potere infinito: piccole storie di successo quotidiano che ti danno i brividi alle braccia e una ricarica di adrenalina incredibile, pronti per conquistare il mondo con il proprio progetto personale.\nLezione imparata Sfruttare quello che già si ha a disposizione, portando il potenziale all\u0026rsquo;ennesimo livello; Impertinenza, oratoria, intelligenza emotiva e umorismo alla base di un vero leader; Il cliente è il focus, dopo viene tutto il resto.  Quotes \u0026ldquo;Negli ultimi 15 anni abbiamo cambiato la Cina, nei prossimi 15 speriamo di cambiare il mondo intero.\u0026rdquo; \u0026ldquo;La decisione su chi vince e chi perde nel mercato non dovrebbe spettare ai monopoli e alle autorità, ma ai clienti.\u0026rdquo; \u0026ldquo;Non avendo mai studiato all\u0026rsquo;estero, gli piace definirsi \u0026ldquo;made in China\u0026rdquo; al cento per cento.\u0026rdquo; \u0026ldquo;Tutti pensano che Jack Ma sia una persona di grande ingegno. Ho una faccia intelligente, forse: ma il mio cervello è molto stupido.\u0026rdquo; \u0026ldquo;I clienti al primo posto, i dipendenti al secondo, gli azionisti al terzo.\u0026rdquo;\n Sapevi che\u0026hellip; i genitori di Jack Ma lavoravano come musicisti e cantastorie? Jack Ma impiegò tre anni prima di riuscire a passare i test di matematica per entrare al college? il nome di Jack deriva da un amico di penna che conobbe lavorando come guida turistica e che gli assegnò questo nome perché non riusciva a pronunciare il nome cinese?  Disponibile su Amazon ", "url": "https:\/\/theredcode.it\/recensioni\/alibaba\/" }, "https:\/\/theredcode.it\/tags\/goss\/": { "title": "goss", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/goss\/" }, "https:\/\/theredcode.it\/categories\/goss\/": { "title": "goss", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/goss\/" }, "https:\/\/theredcode.it\/quando-usare-healthcheck-con-docker\/": { "title": "Quando usare HEALTHCHECK con Docker", "tags": ["docker",], "content": " A volte è necessario -e consigliato- poter verificare se il nostro container sta lavorando correttamente; una delle features introdotte a partire dalla versione 1.12 di Docker è l\u0026rsquo;istruzione HEALTHCHECK, che ci permette di controllare lo stato di integrità del servizio: vediamo quindi come e quando usare HEALTHCHECK con Docker.\n Repository\nhttps://github.com/docker/docker-ce\n Versione breve  Se hai utilizzato dei _container D_ocker in produzione, potresti aver letto nella documentazione che Docker controlla lo stato di un container utilizzando lo stato del processo (abbreviato in PID) avviato dal comando del Dockerfile.\n Se il processo viene eseguito correttamente, il container viene considerato _sano; s_ebbene questo controllo sia efficace, ci sono alcune situazioni in cui abbiamo bisogno di maggiori informazioni sui container.\n Ad esempio, a volte la nostra applicazione si arresta in modo anomalo ma il processo stesso è ancora in esecuzione; in questo scenario, potremmo non conoscere lo stato esatto del container.\n Usare HEALTHCHECK con Docker è semplice: utilizzando questa istruzione all\u0026rsquo;interno del Dockerfile, abbiamo la possibilità di specificare un comando da eseguire, piuttosto che uno script che dev\u0026rsquo;essere eseguito, dove vengano definite dei controlli da effettuare che garantiscano l\u0026rsquo;effettiva funzionalità del nostro sistema: banalmente, se abbiamo un container con una webapp, potremmo verificare che l\u0026rsquo;applicazione risponda all\u0026rsquo;indirizzo localhost sulla porta 8080.\n Per farlo, possiamo aggiungere questa istruzione:\n HEALTHCHECK CMD curl --fail http://localhost:8080|| exit 1  Se il comando curl restituisce 0, allora il controllo è andato a buon fine e il nostro container è pronto all\u0026rsquo;uso; se invece il codice è pari a 1, sappiamo che c\u0026rsquo;è stato qualche problema.\n Versione lunga  Prendiamo come esempio un\u0026rsquo;applicazione web in Node.js, dove un tipico Dockerfile potrebbe essere il seguente:\n FROM node:alpine WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD [\u0026#34;node\u0026#34;,\u0026#34;app.js\u0026#34;]  Tramite questo Dockerfile, partiamo dall\u0026rsquo;immagine base di Node.js (riga 1): dopo aver definito la cartella di lavoro dove verranno anche copiati i file di lavoro (riga 2), copiamo i file relativi alle dipendenze (riga 3), le installiamo (riga 4) e copiamo i file applicativi (riga 5). Dal momento che si tratta di un\u0026rsquo;applicazione Node.js, informiamo Docker che il nostro container sarà in ascolto sulla porta 3000 (riga 6). In ultimo, andiamo ad eseguire il comando che va ad eseguire l\u0026rsquo;applicazione (riga 7).\nUna volta che abbiamo eseguito il comando docker run per avviare il nostro container, possiamo verificare il suo stato tramite il comando docker ps: se tutto va bene, vedremo che sotto la colonna STATUS c\u0026rsquo;è un messaggio che descrive da quanto la nostra applicazione è stata avviata; questo però ci dice solo che il processo node è attivo, e non se effettivamente l\u0026rsquo;applicazione sta funzionando come previsto.\n $ docker build -t docker-healthcheck . $ docker run -d -p 3000:3000 $ docker-healthcheck:latest $ docker ps  In questo caso, possiamo pensare di aggiungere un\u0026rsquo;istruzione all\u0026rsquo;interno del Dockerfile, per verificare che effettivamente l\u0026rsquo;applicazione sia stata avviata correttamente: l\u0026rsquo;idea è quella di eseguire una chiamata tramite curl alla nostra webapp per vedere se effettivamente Node.js è riuscito ad avviare il servizio e risponde correttamente.\nModifichiamo quindi il Dockerfile in questo modo:\nAndando nuovamente ad eseguire il comando di build, run e ps, vediamo che vicino allo stato nella colonna omonima, c\u0026rsquo;è un messaggio (health: starting): inizialmente, ci vorrà del tempo per avviare il controllo dello stato e l\u0026rsquo;aggiornamento, indipendentemente dal fatto che l\u0026rsquo;applicazione sia integra o meno. Se l\u0026rsquo;applicazione si arresta in modo anomalo o è terminata, lo stato cambierà in unhealthy. Per controllare lo stato, usiamo sempre il comando docker ps.\n FROM node:alpine WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 HEALTHCHECK CMD curl --fail http://localhost:3000 || exit 1 CMD [\u0026#34;node\u0026#34;,\u0026#34;app.js\u0026#34;]  Il comando curl controlla se l\u0026rsquo;applicazione è in esecuzione o meno facendo una richiesta a localhost sulla porta 3000. Se la richiesta restituisce un 200, restituirà il codice di uscita 0; se l\u0026rsquo;applicazione non si è avviata correttamente, restituirà il codice di uscita 1.\n Questi codici di uscita sono il modo in cui HEALTHCHECK di Docker determina l\u0026rsquo;integrità del container.\n Le opzioni che possono apparire prima di CMD sono:\n --interval=[durata] (predefinito: 30 secondi) --timeout=[durata] (predefinito: 30 secondi) --start-period=[durata] (predefinito: 0 secondi) --retries=N (predefinito: 3 volte)  Questi argomenti ci permettono di gestire al meglio il nostro controllo: il parametro interval stabilisce il periodo che è necessario attendere prima di procedere con le verifiche di integrità dell\u0026rsquo;applicazione, in termine di secondi; l\u0026rsquo;opzione timeout permette invece di attendere un periodo di tempo specifico prima di dichiarare che il controllo ha esito positivo o negativo.\nL\u0026rsquo;argomento start-period fornisce il tempo di inizializzazione per i container che necessitano di tempo per il bootstrap; un eventuale fallimento del controllo durante questo periodo di tempo non verrà considerato nel numero massimo di tentativi.\n Tuttavia, se la verifica ha esito positivo durante questa fase, il container viene considerato avviato e tutti gli errori consecutivi faranno parte del conteggio del numero massimo di tentativi; grazie a retries è possibile specificare il numero di errori consecutivi del controllo necessari per dichiarare lo stato del container unhealthy.\n Il controllo dell\u0026rsquo;integrità proverà solo fino al numero di tentativi specificato; se l\u0026rsquo;applicazione non risponde correttamente\n L\u0026rsquo;istruzione HEALTHCHECK permette anche di eseguire delle verifiche personalizzate, e quindi non tramite un singolo comando: potremmo ad esempio creare un file Js che permetta di eseguire più chiamate al nostro servizio per verificare che un insieme di endpoint della nostra webapp siano raggiungibili e funzionanti.\n Per farlo, possiamo definire il nostro file e poi utilizzarlo all\u0026rsquo;interno del controllo nel Dockerfile in questo modo:\n FROM node:alpine WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 HEALTHCHECK --interval=15s --timeout=15s --start-period=30s \\ CMD node healthcheck.js CMD [\u0026#34;node\u0026#34;,\u0026#34;app.js\u0026#34;]  Risorse utili Docker (disponibile su Amazon)\n Come installare Docker (e Docker Compose)\n Docker cheatsheet\n Dockerfile cheatsheet\n Esplorando il Dockerfile\n Canale di Emmecilab\n  ", "url": "https:\/\/theredcode.it\/quando-usare-healthcheck-con-docker\/" }, "https:\/\/theredcode.it\/usare-goss-per-testare-uninfrastruttura\/": { "title": "Usare Goss per testare un\u0027infrastruttura", "tags": ["goss","testing",], "content": "Se hai bisogno di uno strumento che ti permetta di testare un\u0026rsquo;infrastruttura, magari verificando che tutte le installazioni siano andate a buon fine e che una porta sia in ascolto, vediamo allora insieme come usare Goss per testare un\u0026rsquo;infrastruttura.\nRepository\nhttps://github.com/aelsabbahy/goss (repo del progetto)\nhttps://github.com/serenasensini/Goss (cheatsheet)\nCos\u0026rsquo;è Goss Versione breve Goss è uno strumento che consente di convalidare facilmente e rapidamente l\u0026rsquo;infrastruttura di un\u0026rsquo;applicazione; consente di definire come dovrebbe apparire una porzione del sistema grazie all\u0026rsquo;ausilio di un file YAML o JSON.\nCiò è reso ancora più semplice grazie alla possibilità di aggiungere automaticamente le istruzioni alla configurazione di Goss tramite una riga di comando.\nGoss permette di verificare specifiche come la gestione dei file, i permessi degli utenti o dei gruppi, l\u0026rsquo;esistenza e la configurazione di pacchetti, servizi e connettività.\nLa documentazione completa è disponibile qui.\nUn esempio è il seguente: immaginiamo di voler verificare che all\u0026rsquo;interno del nostro sistema se Apache è installato e quale versione è disponibile.\nPer farlo, abbiamo due opzioni: eseguire il seguente comando, che ci permette di aggiungere in modo automatico la definizione Goss per controllare se il pacchetto esiste ed è stato configurato, oppure scrivere le direttive manualmente:\n$ goss -g httpd.yaml autoadd apache2 Adding Package to \u0026#39;httpd.yaml\u0026#39;: apache2: installed: true versions: - 2.4.41-4ubuntu3.1 Alcune cose rendono Goss uno strumento fantastico per la convalidare le applicazioni:\n Scritto in Go: significa che è si tratta di un binario autonomo senza dipendenze da altre librerie o interpreti; È super veloce: sfruttando il modello di concorrenza di Go, i test vengono eseguiti e restituiti quasi istantaneamente (parliamo di 5-10 secondi mediamente); È facile iniziare: definire un file Goss tramite lo standard YAML o JSON è davvero semplice e non richiede che il team impari un nuovo linguaggio. Versione lunga Il README sul sito ufficiale contiene una simpatica \u0026ldquo;introduzione di 45 secondi\u0026rdquo; a cui consiglio di dare una chance per avere un\u0026rsquo;idea più precisa di cosa si può fare con Goss.\nÈ già stato detto che i file Goss sono file YAML o JSON che descrivono i test che si vogliono eseguire per controllare il sistema: Goss ha però una fantastica funzione che aggiunge in maniera automatica che crea alcuni test predefiniti per una data risorsa.\nIniziamo testando un\u0026rsquo;applicazione web che viene esposta tramite Apache, e andremo a verificare i seguenti punti:\n se Apache è installato; se Apache è in esecuzione; se la porta 8080 è in ascolto; se il servizio Apache è abilitato. Per farlo, ci avvaliamo dell\u0026rsquo;uso del parametro autoadd che ci permette di aggiungere man mano le istruzioni di cui abbiamo bisogno; prima di tutto, creiamo il file goss.yaml e poi passiamo all\u0026rsquo;uso di Goss: $ goss -g goss.yaml autoadd httpd # aggiunge automaticamente tutte le risorse corrispondenti alla suite di test per httpd Adding Package to \u0026#39;goss.yaml\u0026#39;: httpd: installed: true versions: - 2.4.37 $ goss -g goss.yaml add service httpd # aggiunge il servizio httpd e verifica che sia abilitato e in esecuzione Adding Service to \u0026#39;goss.yaml\u0026#39;: httpd: enabled: false running: false $ goss -g goss.yaml add port 80 # aggiunge un controllo sulla porta 80 Adding Port to \u0026#39;goss.yaml\u0026#39;: tcp:80: listening: false ip: [] Come vediamo grazie all\u0026rsquo;output dei diversi comandi, il comando add ci permette di aggiungere una risorsa al test; notiamo che, dopo l\u0026rsquo;esecuzione di ciascun comando, vengono aggiunte delle righe che preimpostano alcune proprietà; però, alcune di queste non sono impostate come ci servono.\nPer esempio, nell\u0026rsquo;ultima istruzione dove andiamo ad aggiungere la verifica sul servizio, è necessario impostare a true entrambi i valori per rendere funzionale il test.\nDopo aver apportato quindi alcuni cambiamenti, il nostro file risulterà come il seguente:\npackage: httpd: installed: true versions: - 2.4.37 port: tcp6:80: listening: true ip: [] service: httpd: enabled: true running: true Per eseguire i nostri test, digitiamo il comando seguente:\n$ goss -g httpd.yaml validate --format documentation Process: httpd: running: matches expectation: [true] Port: tcp6:80: listening: matches expectation: [true] Port: tcp6:80: ip: matches expectation: [[\u0026#34;::\u0026#34;]] Package: httpd: installed: matches expectation: [true] Package: httpd: version: matches expectation: [[\u0026#34;2.2.15\u0026#34;]] Service: httpd: enabled: matches expectation: [true] Service: httpd: running: matches expectation: [true] Total Duration: 0.010s Count: 14, Failed: 0, Skipped: 0 Semplice, no?\nTip Sentiamo sempre più spesso parlare di container\u0026hellip; e se volessimo testare la nostra immagine? Per questo, esiste DGoss: il modus operandi è molto simile, ma lo vedremo nella prossima puntata!\n", "url": "https:\/\/theredcode.it\/usare-goss-per-testare-uninfrastruttura\/" }, "https:\/\/theredcode.it\/come-creare-un-sistema-di-raccomandazione-per-film-con-python\/": { "title": "Come creare un sistema di raccomandazione per film con Python", "tags": ["python","intelligenza-artificiale",], "content": "Mai sentito parlare di sistema di raccomandazione?\nLa “data science”, o scienza dei dati, è l’insieme di principi metodologici e tecniche volto ad interpretare ed estrarre conoscenza dai dati. Si tratta di uno dei termini figli del XXI secolo; cercando su Internet, le definizioni sembrano piuttosto generiche e confusionarie, e ancor di più il “come” arrivare a lavorare in questo settore. La figura del data scientist, o scienziato dei dati, è una professione in cui l’individuo può e deve vantare conoscenze in materia di gestione ed estrazione di dati da un database o da una fonte di dati non strutturati, per produrre visualizzazione di base, gestirne il contenuto e produrre nuovi dati. In altre parole? Il data scientist usa i dati in suo possesso come mezzo per estrarre nuove informazioni, come nel caso di Netflix: i dati prodotti dai suoi abbonati permettono a questa multinazionale di estrarre modelli di visione dei film per capire cosa è stimolante o meno per un utente e usano quegli stessi dati per creare suggerimenti per il singolo utente o per produrre delle nuove serie TV originali.\nIn questo breve, ma semplice, tutorial, andremo a vedere come creare tramite Python un sistema di raccomandazione per film, sfruttando i dati a nostro favore: è un piccolo passo per iniziare a muoversi in questo vastissimo settore e per avere un assaggio delle potenzialità. Cominciamo!\nRepository\nhttps://github.com/serenasensini/FZTH-Python-movieRS\nLibrerie Python\n numpy pandas scikit-learn STEP 1 — Studio del dataset Il dataset è composto da quasi cinquemila record che descrivono film e contiene informazioni quali il regista che l’ha prodotto, i principali attori, la durata del film, i feedback ricevuti dai social, il paese di produzione, il budget, il punteggio sulla piattaforma, la lingua, le parole chiave che ne descrivono il contenuto, e via dicendo.\nNel nostro caso, andremo a progettare un cosiddetto “sistema di raccomandazione”, ovvero un sistema di filtraggio delle informazioni che cerca di prevedere la “valutazione” o “preferenza” che un utente darebbe a un dato articolo o prodotto.\nEsistono diverse tipologie di sistemi di raccomandazione: quelli basati sul contenuto, quelli collaborativi, ibridi, e così via. In questo caso, andremo ad utilizzare un approccio basato sul contenuto, sfruttando alcuni degli attributi del dataset a nostra disposizione; quindi decidiamo di utilizzare come attributi principali regista, genere, attori e trama. Andremo a lavorare con questi campi per far sì che sia possibile valutare il grado di somiglianza tra un film e l’altro.\nTramite il pacchetto pandas, andiamo a caricare il dataset in un dataframe, ovvero una struttura dati simile a una tabella:\nimport pandas as pd import numpy as np from sklearn.metrics.pairwise import cosine_similarity from sklearn.feature_extraction.text import CountVectorizer\npd.set_option(\u0026lsquo;display.max_columns\u0026rsquo;, 100) df = pd.read_csv(\u0026lsquo;movie_metadata.csv\u0026rsquo;) print(df.head())\nSTEP 2 — Preprocessamento dei dati Il risultato che otteniamo non è del tutto comprensibile, né utilizzabile. Alcuni dei problemi sono i seguenti:\n• Ci sono alcune righe che non hanno nomi di attori;\n• I nomi e cognomi degli attori sono separati da spazi, il che non li rende semplici da gestire: Peter Jackson e Peter Berg hanno lo stesso nome, il che potrebbe far sì che il sistema li interpreti come simili, anche se è chiaro che non si tratta della stessa persona.\nIl lavoro da fare non è poco… Procediamo per gradi. Cominciamo selezionando le colonne di nostro interesse, ovvero quelle elencate in precedenza; viene anche creata una colonna “actors” per unire i dati delle tre colonne “actor_1_name”, “actor_2_name” e “actor_3_name”.\ndf = df[[\u0026lsquo;director_name\u0026rsquo;, \u0026lsquo;actor_1_name\u0026rsquo;, \u0026lsquo;actor_2_name\u0026rsquo;, \u0026lsquo;actor_3_name\u0026rsquo;, \u0026lsquo;plot_keywords\u0026rsquo;, \u0026lsquo;genres\u0026rsquo;, \u0026lsquo;movie_title\u0026rsquo;]]\nif not df[\u0026lsquo;actor_1_name\u0026rsquo;].empty or not df[\u0026lsquo;actor_2_name\u0026rsquo;].empty or not df[\u0026lsquo;actor_3_name\u0026rsquo;].empty: df[\u0026lsquo;actors\u0026rsquo;] = df[\u0026lsquo;actor_1_name\u0026rsquo;] + \u0026ldquo;,\u0026rdquo; + df[\u0026lsquo;actor_2_name\u0026rsquo;] + \u0026ldquo;,\u0026rdquo; + df[\u0026lsquo;actor_3_name\u0026rsquo;]\ndf = df[[\u0026lsquo;director_name\u0026rsquo;, \u0026lsquo;plot_keywords\u0026rsquo;, \u0026lsquo;genres\u0026rsquo;, \u0026lsquo;movie_title\u0026rsquo;, \u0026lsquo;actors\u0026rsquo;]] df.dropna() print(df.head())\nIl risultato dovrebbe essere questo:\nA questo punto sarebbe utile andare a rimuovere tutte quelle righe che contengono valori nulli: in questo modo possiamo far sì che il grado di somiglianza tra i diversi film sia il più fedele possibile.\ndf.where((pd.notnull(df)), \u0026lsquo;REMOVE\u0026rsquo;) df.replace([\u0026ldquo;NaN\u0026rdquo;], np.nan, inplace=True) df = df.dropna()\nA questo punto, è necessario normalizzare i dati. In che modo? Possiamo pensarla così: due attori/registi possono essere considerati simili se la stringa che li rappresenta è esattamente uguale. Riprendendo l’esempio precedente, se trovassimo due stringhe come “peterjackson” e “peterberg” potremmo dire con certezza che i due attori non sono uguali; andiamo quindi a trasformare queste stringhe in minuscolo, rimuovendo anche i segni di punteggiatura o di separazione come il carattere “|” utilizzato nella trama. Inoltre, andremo a rendere tutti i record minuscoli, così da evitare possibili problemi di somiglianza tra termini.\nfor index, row in df.iterrows(): # process actors names app = row[\u0026lsquo;actors\u0026rsquo;].lower().replace(\u0026rsquo; \u0026lsquo;, \u0026lsquo;\u0026rsquo;) app = app.replace(\u0026rsquo;,\u0026rsquo;, \u0026rsquo; \u0026lsquo;) row[\u0026lsquo;actors\u0026rsquo;] = app\n# process director\\_name app = row\\['director\\_name'\\].lower().replace(' ', '') row\\['director\\_name'\\] = app # process genres app = row\\['genres'\\].lower().replace('|', ' ') row\\['genres'\\] = app # process plot\\_keywords app = row\\['plot\\_keywords'\\].lower().replace('|', ' ') row\\['plot\\_keywords'\\] = app Al termine del ciclo, andiamo a creare un’ultima colonna, chiamata “bag_of_words”: in questa colonna, andiamo ad aggiungere tutti i termini che descrivono il film, siano essi gli attori, il regista, il genere e le parole chiave. In questo modo, avremo un attributo di riferimento per misurare la somiglianza tra un film e l’altro.\nDopo questo lavoro, abbiamo ottenuto un dataset di 4827 voci; questo tipo di lavoro è frutto di molta esperienza; tuttavia, non è l’unica strategia attuabile, né è detto che sia la migliore. Infatti, ognuna delle precedenti fasi può essere utilizzata separatamente in altri casi d’uso, così come esistono altre tecniche per pulire i dati.\nAndiamo infine a settare l’indice del dataframe: questo sarà il valore di riferimento che ci verrà restituito alla fine come raccomandazione:\ndf.set_index(\u0026lsquo;movie_title\u0026rsquo;, inplace = True)\nSTEP 3 — Creazione del modello Per il calcolo della similarità tra due film, andremo ad utilizzare un approccio molto semplice, ovvero la funzione di coseno-similarità: si tratta di una misura della somiglianza tra due vettori diversi da zero di uno spazio interno del prodotto che misura il coseno dell’angolo tra di loro. Applicando la definizione di similarità, questa sarà di fatto uguale a 1 se i due vettori sono identici e sarà 0 se i due sono ortogonali. In altre parole, la somiglianza è un numero limitato tra 0 e 1 che ci dice quanto i due vettori sono simili. In altre parole, il nostro modello non può funzionare con le sole stringhe che abbiamo prodotto, ma è necessario vettorializzare quelle singole stringhe in numeri; a questo scopo, si utilizza la feature di scikit-learn CountVectorizer che converte una raccolta di documenti di testo in una matrice di frequenze di token; si è scelto in questo caso di utilizzare CountVectorizer anziché TfIdfVecorizer per un semplice motivo: si aveva bisogno di un semplice contatore di frequenza per ogni parola nella colonna “bag_of_words”.\ncount = CountVectorizer() count_matrix = count.fit_transform(df[\u0026lsquo;bag_of_words\u0026rsquo;])\nindices = pd.Series(df.index) indices[:5]\ncosine_sim = cosine_similarity(count_matrix, count_matrix) print(cosine_sim)\nDando una breve occhiata alla matrice prodotta, è possibile notare come tutti i numeri sulla diagonale siano pari a 1 perché, ovviamente, ogni film è identico a sé stesso. Anche la matrice è simmetrica perché la somiglianza tra A e B è la stessa della similarità tra B e A.\nA questo punto, è possibile scrivere una funzione che prenda in input un titolo di un film e restituisca i primi 5 film simili. Dobbiamo quindi creare una serie di titoli di film usando degli indici numerici, per abbinare gli indici della matrice di similarità ai titoli di film attuali; infatti la funzione calcola i 5 numeri più alti all’interno della riga corrispondente al film inserito, ottenendo gli indici corrispondenti e abbinandoli ai titoli dei film della serie, per restituire l’elenco dei film consigliati. Per questa ragione, creiamo una funzione recommendations, che prende in input un titolo e la matrice precedentemente calcolata, e stampa il risultato:\ndef recommendations(title, cosine_sim = cosine_sim):\nrecommended\\_movies = \\[\\] idx = -1 for i in range(0, indices.size): if indices\\[i\\] == title: idx = i break score_series = pd.Series(cosine_sim[idx]).sort_values(ascending = False)\ntop_10_indexes = list(score_series.iloc[1:11].index)\nfor i in top\\_10\\_indexes: recommended\\_movies.append(list(df.index)\\[i\\]) return recommended\\_movies STEP 4 — Test Possiamo finalmente testare il nostro programma: andiamo quindi ad inserire il titolo di un film e vediamo cosa ci propone il sistema; inserendo questo film:\nrecommendations(\u0026lsquo;Batman v Superman: Dawn of Justice \u0026lsquo;)\nIl risultato sarà:\nTutti film che in effetti hanno a che fare con Batman!\nThat’s all, folks!\nLetture consigliate: Analisi del linguaggio con Python (disponibile su Amazon) ", "url": "https:\/\/theredcode.it\/come-creare-un-sistema-di-raccomandazione-per-film-con-python\/" }, "https:\/\/theredcode.it\/cos%C3%A8-podman\/": { "title": "Cos\u0027è Podman", "tags": ["docker","podman",], "content": "Sempre più spesso Podman viene contrapposto a sostituzione di Docker: concepito come strumento di debugging per semplificare il lavoro con i cluster Kubernetes, è diventato un software dal motore autonomo e completo per la gestione di container; Podman è infatti un motore per container daemon-less, per lo sviluppo, la gestione e l\u0026rsquo;esecuzione di container OCI.\nRepository\nhttps://github.com/containers/podman (repo del progetto)\nhttps://github.com/serenasensini/FHTZ-Podman/blob/main/Podman.md (cheatsheet)\nVersione breve Podman (abbr. Pod Manager) è un container engine rilasciato nel 2018. È stato sviluppato da Red Hat e somiglia a Docker per molti aspetti, come l\u0026rsquo;utilizzo della riga di comando; questo rende infatti possibile utilizzare i comandi tipici di Docker su Podman, utilizzando l\u0026rsquo;alias docker=podman.\nNella maggior parte dei casi il passaggio da Docker a Podman è relativamente semplice; la novità però che caratterizza Podman è l\u0026rsquo;assenza di un demone centrale come istanza di controllo del singolo container e questo offre la possibilità di accedere alle diverse applicazioni virtualizzate anche senza permessi di root.\nPodman gira su tutte le distribuzioni di Linux disponibili come Ubuntu, Fedora, CentOS, Debian e RHEL ma anche su Raspbian. Per la maggior parte dei casi, questo motore si può installare direttamente attraverso la gestione dei pacchetti del relativo sistema.\nPer installarlo, è possibile seguire le indicazioni della documentazione ufficiale.\nVersione lunga I pod rappresentano una caratteristica fondamentale che contraddistingue Podman da Docker; i pod, che si rifanno al concetto dei pod di Kubernetes, rappresentano un insieme di più container all’interno di uno stesso namespace di Linux che condividono risorse ben definite per combinare in modo flessibile diverse applicazioni virtualizzate.\nPodman ricorre ai namespace dell’utente del kernel di Linux, che assegnano permessi e ID ai processi. In realtà il container è eseguito in qualità di amministratore e questo conferisce all’ambiente virtualizzato di Podman uno standard di sicurezza elevato.\nI cosiddetti infra container rappresentano il cuore pulsante di un pod e sono responsabili delle funzionalità relative all’unione dei vari pod, gestendo e garantendo a questo scopo le risorse singole come namespace, porte di rete, CPU, memoria, ecc.\nInoltre, per la gestione dei pod, Podman ricorre allo strumento di monitoraggio Conmon, che monitora le singole componenti virtualizzate e il che rende i log sicuri. Per di più, questo strumento funge da interfaccia per il terminale del container corrispondente.\nArchitettura di Podman\nLe principali differenze tra Docker e podman (Pod Manager Tool) sono:\n Daemon-less: siamo ai due poli totalmente opposti con Docker, perché quest\u0026rsquo;ultimo esegue un daemon per eseguire tutte le sue attività. Podman è leggero e non richiede che ci sia un\u0026rsquo;istanza sempre in esecuzione per avviare dei container! Rootless: Podman può essere eseguito come root o non root. Possiamo eseguire contenitori podman come utente non root ed essere comunque conformi ai contenitori in esecuzione. Pod: il termine pod ha origine da Kubernetes: sono infatti una raccolta di container che vengono eseguiti il più vicino possibile. Podman fornisce questa funzionalità pronta all\u0026rsquo;uso per eseguire più container insieme tramite l\u0026rsquo;uso di pod, al contrario di Docker che richiede strumenti supplementari. Per poter utilizzare Podman, basta fare riferimento ai comandi Docker: vediamo come avviare, stoppare o eliminare un\u0026rsquo;immagine sia del tutto simile a quanto già disponibile con la CLI Docker.\n$ podman run --rm nginx # avvia l\u0026#39;immagine Nginx $ podman build -t my-image . # esegue la build a partire dal Dockerfile locale $ podman rmi nginx # rimuove l\u0026#39;immagine $ podman images # elenca le immagini in locale $ podman ps -a # elenca i container in locale $ podman login docker.xxx.com -u my-name # login sul registry Docker In più, esistono una serie di comandi che permettono la gestione totale dei pod: chiarito il concetto che un pod è l\u0026rsquo;insieme di uno o più container, vediamo quali comandi abbiamo a disposizione:\n$ podman pod create --name my_pod # crea un pod chiamato my_pod $ podman pod list # elenca i pod presenti in locale $ podman ps -a --pod # mostra i pod in esecuzione $ podman inspect –l # ispeziona un container in esecuzione $ podman run -dt --pod my_pod ubuntu top # top per vedere l\u0026#39;output del pod in cui aggiungiamo il container ubuntu $ podman run -dt --pod new:new_pod -p 31000:80 nginx # creazione pod e deploy del container all\u0026#39;interno di un nuovo pod chiamato new_pod Tip Se ti stai chiedendo da dove viene il termine “pod”, allora sappi che tradotto letteralmente significa “branco di balene”: rende bene l’idea di un insieme di container, che sono comunemente rappresentati grazie alla tecnologia che li ha resi celebri, Docker, che ha come simbolo una balena azzurra. Podman non è altro che l\u0026rsquo;uomo delle balene!\nRisorse utili Letture consigliate: Docker (disponibile su Amazon)\n Canale di Emmecilab\n ", "url": "https:\/\/theredcode.it\/cos%C3%A8-podman\/" }, "https:\/\/theredcode.it\/come-integrare-i-pagamenti-con-stripe-in-ionic\/": { "title": "Come integrare i pagamenti con Stripe in Ionic", "tags": ["ionic","stripe",], "content": "Hai sviluppato una nuova app e vuoi abilitare i pagamenti? Niente di più semplice.\nVediamo in questo articolo come integrare i pagamenti con Stripe in Ionic!\nIntro Fondata nel 2010, Stripe è uno dei principali competitor di Paypal e ora gestisce le transazioni di alcuni dei più grandi marchi in circolazione, tra cui Slack, GitHub, Zoom, Pinterest, Uber, Booking, e molti altri. In effetti, la società afferma che l'89% di tutte le carte di credito in circolazione sono state elaborate su una rete Stripe; attualmente, hanno infatti una capacità di gestire 135 valute, per cui rappresentano una soluzione comune per le aziende che commerciano a livello internazionale.\nStripe ha un\u0026rsquo;enorme quantità di potenziale sotto il suo cofano: si tratta di una piattaforma di elaborazione dei pagamenti che ti consente di trasferire denaro dal conto bancario di un cliente al conto della tua azienda tramite una transazione con carta di credito o di debito.\nCome funziona: per elaborare le transazioni online è necessario sia un gateway di pagamento che un processore di pagamento: mentre il gateway acquisisce e trasmette in modo sicuro le informazioni di pagamento della carta di credito del cliente al processore, quest\u0026rsquo;ultimo elabora effettivamente la transazione. La cifra spesa dal cliente viene quindi inviata temporaneamente al conto del processore, dove le commissioni relative alla carta di credito vengono detratte direttamente dalla somma. Il pagamento viene alla fine indirizzato al conto bancario del commerciante.\nIn realtà è molto più complicato di così, ma per evitare di perderci nella tana del coniglio di Stripe, passiamo alla parte pratica: in questo esempio andremo a configurare Stripe come provider di pagamento per la nostra app.\nRepository\nhttps://github.com/serenasensini/Ionic-5-pagamenti-con-Stripe\nPlugin\n Stripe (https://ionicframework.com/docs/native/stripe) Procedimento Step 1 - Installazione dei plugin Dopo aver creato o aperto la nostra applicazione, installiamo le dipendenze necessarie per far funzionare Stripa tramite i seguenti comandi, dove possiamo scegliere se usare Cordova o Capacitor per l\u0026rsquo;installazione del plugin:\n$ ionic cordova plugin add cordova-plugin-stripe # installazione tramite Cordova\n$ npm i -S @capacitor-community/stripe # installazione tramite Capacitor\n$ npm install @ionic-native/stripe\nAl termine dell\u0026rsquo;installazione, importiamo il modulo Stripe in app.module.ts, e nella pagina stripe.page.ts.\n/src/app/app.module.ts\n@NgModule({ … providers: [ StatusBar, SplashScreen, Stripe, HttpClient, { provide: RouteReuseStrategy, useClass: IonicRouteStrategy } ], bootstrap: [AppComponent] }) export class AppModule { }\nStep 2 - creazione delle funzioni di pagamento Passiamo alla creazione di una funzione di preparazione del pagamento: creiamo quindi preparePayment come viene riportato di seguito: il parametro stripe_key rappresenta la chiave Stripe; infatti questo servizio autentica le tue richieste API utilizzando le chiavi API associata al tuo account. Se non includi questa chiave quando effettui una richiesta o ne utilizzi una non corretta o obsoleta, Stripe restituisce un errore. Crearne una è davvero semplice: è sufficiente andare sul sito https://stripe.com/docs/development e seguire le indicazioni fornite dall\u0026rsquo;azienda stessa.\nOgni account è dotato di chiavi separate per il test e per l\u0026rsquo;esecuzione di transazioni live: infatti, vengono associate due diverse chiavi per permettere agli sviluppatori di testare il corretto funzionamento della propria applicazione senza dover ricorrere a reali transazioni economiche.\nEsistono anche due tipi di chiavi API: pubbliche e segrete. Le chiavi pubblicabili hanno il solo scopo di identificare il tuo account con Stripe; in altre parole, possono essere utilizzate in modo sicuro all\u0026rsquo;interno del tuo codice. Al contrario, le chiavi segrete devono essere mantenute riservate e archiviate, dal momento che con questa chiave è possibile eseguire qualsiasi richiesta tramite le API senza restrizioni.\nTornando al codice, vediamo che all\u0026rsquo;interno della funzione associamo la chiave pubblica, per poi definire i dettagli della carta di test (le informazioni relative ai dettagli della carta di prova appartenente al circuito VISA predefinita di Stripe sono disponibili sempre nella documentazione https://stripe.com/docs/testing#cards ); a questo punto, è possibile creare un token associato al pagamento, che ci permette di completare la transazione ed elaborarlo:\nsrc/app/stripe/stripe.page.ts\n`preparePayment() {\nthis.stripe.setPublishableKey(this.stripe_key);\n this.dettCarta = {\nnumber: \u0026lsquo;4242424242424242\u0026rsquo;,\nexpMonth: 12,\nexpYear: 2020,\ncvc: \u0026lsquo;220\u0026rsquo;\n};\n this.stripe.createCardToken(this.dettCarta)\n.then(token =\u0026gt; {\nconsole.log(token);\nthis.makePayment(token.id);\n})\n.catch(error =\u0026gt; console.error(error));\n}`\nLa funzione makePayment non farà altro che utilizzare il token per effettuare una chiamata al servizio di pagamento di Stripe, con la quale il pagamento verrà convalidato:\nsrc/app/stripe/stripe.page.ts\nmakePayment(token) { this.http .post('https://XXXX/payWithStripe', { token: token.id }) .subscribe(data =\u0026gt; { console.log(data); … }); }\nUna risposta corretta da parte della request appena effettuata sarà simile alla seguente:\n{ \u0026#34;id\u0026#34;: \u0026#34;XXX\u0026#34;, \u0026#34;amount\u0026#34;: 100, … \u0026#34;failure_code\u0026#34;: null, \u0026#34;failure_message\u0026#34;: null, \u0026#34;payment_method_details\u0026#34;: { \u0026#34;card\u0026#34;: { \u0026#34;brand\u0026#34;: \u0026#34;visa\u0026#34;, … \u0026#34;country\u0026#34;: \u0026#34;US\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Visa Classic\u0026#34;, \u0026#34;exp_month\u0026#34;: 2, \u0026#34;exp_year\u0026#34;: 2024, \u0026#34;fingerprint\u0026#34;: \u0026#34;xxx\u0026#34;, \u0026#34;funding\u0026#34;: \u0026#34;credit\u0026#34;, \u0026#34;last4\u0026#34;: \u0026#34;4242\u0026#34;, }, \u0026#34;type\u0026#34;: \u0026#34;card\u0026#34; }, \u0026#34;receipt_url\u0026#34;: \u0026#34;https://pay.stripe.com/receipts/XXX\u0026#34;, ... } Dove i parametri failure_code e failure_message vuoti ci fanno capire che la transazione è andata a buon fine.\nSemplice, no?\nRisorse utili Letture consigliate: Ionic 5 (disponibile su Amazon)\n Ionic 6: cosa cambia\n ", "url": "https:\/\/theredcode.it\/come-integrare-i-pagamenti-con-stripe-in-ionic\/" }, "https:\/\/theredcode.it\/tags\/stripe\/": { "title": "stripe", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/stripe\/" }, "https:\/\/theredcode.it\/perch%C3%A9-il-tag-latest-non-va-utilizzato\/": { "title": "Perché il tag \u0022latest\u0022 non va utilizzato", "tags": ["bestpractice","docker",], "content": "Quante volte hai utilizzato il tag latest senza rifletterci? Vediamo nel dettaglio cos\u0026rsquo;è e quando (non) va usato.\nVersione breve Il tag \u0026ldquo;latest\u0026rdquo; in realtà non significa più recente, non significa nulla.\n\u0026ldquo;latest\u0026rdquo; è solo un alias, come potrebbe esserlo \u0026ldquo;il_mio_tag\u0026rdquo;, quindi questo è solo il frutto di uno sviluppatore che ha avuto una pessima idea.\nVersione lunga Tutti si aspettano che il tag \u0026quot;latest\u0026quot; punti sempre alla versione più recente di un\u0026rsquo;immagine, ma purtroppo quasi mai è così.\nQuesto è solo un tag che viene applicato per impostazione predefinita ad un\u0026rsquo;immagine a cui non è stato associato un tag.\nVediamo una serie di casi d\u0026rsquo;uso: ogni volta che si effettua la build di una nuova immagine, è bene assegnare una nuova versione del tag -ad esempio, 1.0.0- e quindi aggiornare anche il tag \u0026ldquo;latest\u0026rdquo;; negli esempi seguenti, il tag latest viene creato e associato all\u0026rsquo;immagine tramite il secondo comando, ma nel primo e nel terzo non viene associato e quindi non è conoscenza delle ultime modifiche sull\u0026rsquo;immagine:\n$ docker build -t my_image:1.0.0 . # latest non è utilizzato $ docker build -t my_image # latest viene associato all\u0026#39;immagine $ docker build -t my_image:1.0.1 . # latest non viene aggiornato \u0026ldquo;latest\u0026rdquo; viene effettivamente utilizzato quando ci si dimentica di assegnare un tag ad un\u0026rsquo;immagine, come spesso accade quando si effettuano le prime operazioni di build o push; la realtà è che non viene utilizzato quindi come previsto, perché di solito non viene aggiornato insieme all\u0026rsquo;ultima versione dell\u0026rsquo;immagine rilasciata. Come mostrato di seguito, se utilizzato in combinazione con la build di una nuova versione dell\u0026rsquo;immagine, questo viene aggiornato coerentemente con le modifiche più recenti:\n$ docker build -t my_image:1.0.0 -t my_image:latest . # latest viene aggiornato $ docker build -t my_image:1.0.1-t my_image:latest . # latest viene aggiornato # ecc. Risorse utili Letture consigliate: Docker (disponibile su Amazon)\n Canale di Emmecilab\n ", "url": "https:\/\/theredcode.it\/perch%C3%A9-il-tag-latest-non-va-utilizzato\/" }, "https:\/\/theredcode.it\/cookie\/": { "title": "Cookie Policy", "tags": [], "content": "This Cookies Policy explains what Cookies are and how We use them. You should read this policy so You can understand what type of cookies We use, or the information We collect using Cookies and how that information is used. This Cookies Policy has been created with the help of the Cookies Policy Generator.\nCookies do not typically contain any information that personally identifies a user, but personal information that we store about You may be linked to the information stored in and obtained from Cookies. For further information on how We use, store and keep your personal data secure, see our Privacy Policy.\nWe do not store sensitive personal information, such as mailing addresses, account passwords, etc. in the Cookies We use.\nInterpretation and Definitions Interpretation The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.\nDefinitions For the purposes of this Cookies Policy:\n Company (referred to as either \u0026ldquo;the Company\u0026rdquo;, \u0026ldquo;We\u0026rdquo;, \u0026ldquo;Us\u0026rdquo; or \u0026ldquo;Our\u0026rdquo; in this Cookies Policy) refers to TheRedCode. Cookies means small files that are placed on Your computer, mobile device or any other device by a website, containing details of your browsing history on that website among its many uses. Website refers to TheRedCode, accessible from https://theredcode.it You means the individual accessing or using the Website, or a company, or any legal entity on behalf of which such individual is accessing or using the Website, as applicable. The use of the Cookies Type of Cookies We Use Cookies can be \u0026ldquo;Persistent\u0026rdquo; or \u0026ldquo;Session\u0026rdquo; Cookies. Persistent Cookies remain on your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close your web browser.\nWe use both session and persistent Cookies for the purposes set out below:\n Necessary / Essential Cookies\nType: Session Cookies\nAdministered by: Us\nPurpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.\n Functionality Cookies\nType: Persistent Cookies\nAdministered by: Us\nPurpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.\n Your Choices Regarding Cookies If You prefer to avoid the use of Cookies on the Website, first You must disable the use of Cookies in your browser and then delete the Cookies saved in your browser associated with this website. You may use this option for preventing the use of Cookies at any time.\nIf You do not accept Our Cookies, You may experience some inconvenience in your use of the Website and some features may not function properly.\nIf You\u0026rsquo;d like to delete Cookies or instruct your web browser to delete or refuse Cookies, please visit the help pages of your web browser.\n For the Chrome web browser, please visit this page from Google: https://support.google.com/accounts/answer/32050\n For the Internet Explorer web browser, please visit this page from Microsoft: http://support.microsoft.com/kb/278835\n For the Firefox web browser, please visit this page from Mozilla: https://support.mozilla.org/en-US/kb/delete-cookies-remove-info-websites-stored\n For the Safari web browser, please visit this page from Apple: https://support.apple.com/guide/safari/manage-cookies-and-website-data-sfri11471/mac\n For any other web browser, please visit your web browser\u0026rsquo;s official web pages.\nMore Information about Cookies You can learn more about cookies here: All About Cookies by TermsFeed.\nContact Us If you have any questions about this Cookies Policy, You can contact us:\n By email: info@theredcode.it ", "url": "https:\/\/theredcode.it\/cookie\/" }, "https:\/\/theredcode.it\/about-me\/": { "title": "Serena Sensini", "tags": [], "content": "Ingegnera informatica\nEnterprise Architect @ Dedalus spa\nAutrice di 4 libri\nFounder@TheRedCode.it\n:fire:\t\u0026ldquo;Intelligence is the ability to avoid doing work, yet getting the work done.\u0026rdquo; - Linus Torvalds:fire:\nProfilo Linkedin\nProfilo GitHub\n🔧 Skills ", "url": "https:\/\/theredcode.it\/about-me\/" }, "https:\/\/theredcode.it\/dev-tools\/python-online-compiler\/": { "title": "5 strumenti per provare Python online", "tags": ["dev-tools","python",], "content": "Hai bisogno di testare del codice Python, ma non hai nessun IDE a disposizione?\nVediamo alcune valide alternative per provare il tuo codice tramite dei compiler per Python online!\nReplit Replit è un IDE collaborativo online: questo vuol dire che possiamo programmare direttamente all\u0026rsquo;interno del browser, in più di 50 linguaggi di programmazione.\nProvalo\nProgramiz Programiz è una piattaforma per imparare la programmazione creata da dev per dev. Può essere utilizzato per scrivere e testare codice Python, ma anche C/C++, Java, Go e molto altro.\nProvalo\nW3Schools Chi non conosce W3Schools e non l\u0026rsquo;ha utilizzato almeno una volta per imparare qualche linguaggio? W3Schools è una piattaforma ottimizzata per l\u0026rsquo;apprendimento, il test e la formazione dei principali linguaggi di programmazione e strumenti per developer.\nSelezionando Python come linguaggio di base, avremo a disposizione diverse console che ci permetteranno di eseguire del codice Python in un attimo:\nProvalo\nTutorialspoint Tutorialspoint è un altro sito online molto utile per chi vuole apprendere di più sui maggiori linguaggi di programmazione e non solo: questo portale offre molti contenuti di qualità su Machine Learning, Data Science, basi di dati, cybersecurity e molto altro.\nProvalo\nJupyter Jupyter Notebook è una piattaforma informatica interattiva basata sul web ed è un progetto gestito dalla community con l\u0026rsquo;obiettivo di \u0026ldquo;sviluppare software open source, standard aperti e servizi per l\u0026rsquo;informatica interattiva attraverso decine di linguaggi di programmazione\u0026rdquo;\nJupyter è perfetto per chi vuole fare provare del codice per attività di data science in Python, dal momento che è possibile installare dei pacchetti extra sfruttando pip.\nInoltre, permette di testare non solo codice Python, ma anche scritto in C++, Julia, Kotlin, R e Ruby.\nProvalo\nE tu, conosci qualche altro tool? Aggiungilo nei commenti!\n Se ti è piaciuto questo articolo, non ti dimenticare di commentare e condividere! ⬇️\n ", "url": "https:\/\/theredcode.it\/dev-tools\/python-online-compiler\/" }, "https:\/\/theredcode.it\/tags\/dev-tools\/": { "title": "dev-tools", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/tags\/dev-tools\/" }, "https:\/\/theredcode.it\/categories\/dev-tools\/": { "title": "dev-tools", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/categories\/dev-tools\/" }, "https:\/\/theredcode.it\/search\/": { "title": "Search me!", "tags": [], "content": "", "url": "https:\/\/theredcode.it\/search\/" }, } </script> <script src="/js/lunr.min.js"></script> <script src="/js/search.js"></script> </body> </html> <script src="/js/custom.js"></script> <script src="/js/custom.js"></script> <script>(function(w,d, s, id) {if(typeof(w.webpushr)!=='undefined') return;w.webpushr=w.webpushr||function(){(w.webpushr.q=w.webpushr.q||[]).push(arguments)};var js, fjs = d.getElementsByTagName(s)[0];js = d.createElement(s); js.id = id;js.async=1;js.src = "https://cdn.webpushr.com/app.min.js"; fjs.parentNode.appendChild(js);}(window,document, 'script', 'webpushr-jssdk')); webpushr('setup',{'key':'BDvyygpN5kza-ORxqczLfNb7lnm9no3mmbRuykJos84Iheq4STglcy1XmYANRJu3uFu-x24V0ixKOuceKPa-268' });</script> </body> </html>