<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alessio Marinelli</title>
	<atom:link href="https://www.alessiomarinelli.it/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.alessiomarinelli.it/</link>
	<description>Volevo solo giocare con i Lego</description>
	<lastBuildDate>Thu, 19 Jun 2025 13:08:57 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Autenticazione NTLM in container Docker Linux</title>
		<link>https://www.alessiomarinelli.it/2025/06/autenticazione-ntlm-in-container-docker-linux/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Thu, 19 Jun 2025 13:08:56 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=572</guid>

					<description><![CDATA[<p>Le chiamate a API con autenticazione NTLM da Linux vanno in 401 Unauthorized? Ecco la soluzione!</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2025/06/autenticazione-ntlm-in-container-docker-linux/">Autenticazione NTLM in container Docker Linux</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover is-light"><img fetchpriority="high" decoding="async" width="1024" height="366" class="wp-block-cover__image-background wp-image-573 size-large" alt="Carico di Container" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/container_sea-1024x366.jpg" data-object-fit="cover" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/container_sea-1024x366.jpg 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/container_sea-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/container_sea-768x274.jpg 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/container_sea.jpg 1400w" sizes="(max-width: 1024px) 100vw, 1024px" /><span aria-hidden="true" class="wp-block-cover__background has-background-dim" style="background-color:#83909e"></span><div class="wp-block-cover__inner-container is-layout-constrained wp-block-cover-is-layout-constrained">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Autenticazione NTLM in container Docker Linux</p>
</div></div>



<p class="wp-block-paragraph">Durante l&#8217;ammodernamento di una webapp ASP.NET distribuita su una macchina Windows Server con IIS, abbiamo deciso (tra gli altri interventi) di aggiungere il supporto Docker per poterla distribuire in un contenitore.</p>



<p class="wp-block-paragraph">L&#8217;applicazione, una volta eseguita nel container, ha iniziato però a dare problemi nelle chiamate ad alcuni servizi esterni la cui autenticazione era basata su protocollo NTLM (come ad esempio SQL Server Reporting Services).</p>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""> // ...

 var uri = new Uri("https://ssrs.intra/reports/api/V2.0");
 var networkCredential = new NetworkCredential("username", "password", "domain");

 var credentialsCache = new CredentialCache { { uri, "NTLM", networkCredential } };
 var handler = new HttpClientHandler { Credentials = credentialsCache };

 var client = new HttpClient(handler) { BaseAddress = uri };
 var response= await client.GetAsync("reports");
</pre>



<p class="wp-block-paragraph">Tutte le chiamate, nonostante il codice tentasse correttamente una autenticazione NTLM, venivano rimbalzate con errore <code>401 - Unauthorized</code>.</p>



<p class="wp-block-paragraph">Ciò è dovuto all&#8217;assenza, all&#8217;interno dell&#8217;immagine Docker base utilizzata per la distribuzione, di una implementazione del security provider NTLM, non consentendo quindi all&#8217;applicativo di risolvere adeguatamente le challenge NTLM/NTLMv2.</p>



<p class="wp-block-paragraph">La soluzione pertanto è stata molto semplice (molto più complesso capirla e trovarla): aggiungere all&#8217;immagine Docker il pacchetto <code>gss-ntlmssp</code>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="dockerfile" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends gss-ntlmssp</pre>



<p class="wp-block-paragraph"><strong>Approfondimenti:</strong></p>



<ul class="wp-block-list">
<li><a href="https://github.com/gssapi/gss-ntlmssp">gss-ntlmssp (GitHub)</a></li>



<li>Unable to Authenticate with NTLM from Linux with .NET 8 (<a href="https://stackoverflow.com/questions/79031074/unable-to-authenticate-with-ntlm-from-linux-with-net-8">StackOverflow.com</a>)</li>
</ul>



<div style="height:152px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Foto di <a href="https://unsplash.com/it/@carrier_lost?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Ian Taylor</a> su <a href="https://unsplash.com/it/foto/nave-da-carico-blu-e-rossa-in-mare-durante-il-giorno-jOqJbvo1P9g?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></p>



<p class="wp-block-paragraph"></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2025/06/autenticazione-ntlm-in-container-docker-linux/">Autenticazione NTLM in container Docker Linux</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Formattare un disco con partizioni EFI con Windows</title>
		<link>https://www.alessiomarinelli.it/2025/06/formattare-un-disco-con-partizioni-efi-con-windows/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Sat, 14 Jun 2025 17:04:26 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=557</guid>

					<description><![CDATA[<p>I device usati come dischi di sistema contengono partizioni EFI che non è possibile rimuovere da Gestione Disco di Windows. Vediamo come farlo con diskpart!</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2025/06/formattare-un-disco-con-partizioni-efi-con-windows/">Formattare un disco con partizioni EFI con Windows</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover is-light"><img decoding="async" width="1024" height="366" class="wp-block-cover__image-background wp-image-570 size-large" alt="Hard disk" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/hard_disk-1024x366.jpg" data-object-fit="cover" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/hard_disk-1024x366.jpg 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/hard_disk-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/hard_disk-768x274.jpg 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/hard_disk.jpg 1400w" sizes="(max-width: 1024px) 100vw, 1024px" /><span aria-hidden="true" class="wp-block-cover__background has-background-dim" style="background-color:#aaa59e"></span><div class="wp-block-cover__inner-container is-layout-constrained wp-block-cover-is-layout-constrained">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Formattare un disco con partizioni EFI con Windows</p>
</div></div>



<p class="wp-block-paragraph">I device utilizzati come dischi di sistema o dispositivi avviabili spesso contengono partizioni di sistema EFI che non è possibile rimuovere da Gestione Disco di Windows:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="197" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-3-1024x197.png" alt="Gestione Disco di Windows con partizione di sistema non eliminabile" class="wp-image-558" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-3-1024x197.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-3-300x58.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-3-768x148.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-3.png 1027w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Per riutilizzare appieno questi dischi è tuttavia necessario rimuovere tutte le partizioni, crearne una grande tutto il disco e poi formattarlo a piacere. </p>


<span class="su-highlight" style="background:#fffc59;color:#000000">&nbsp;ATTENZIONE: l&#8217;eliminazione delle partizioni è una attività distruttiva spesso non annullabile che porta alla distruzione di tutti i dati contenuti nel dispositivo di memoria. Procedi solo se sai cosa stai facendo e sotto la tua piena responsabilità.&nbsp;</span>



<p class="wp-block-paragraph">Su Windows è disponibile l&#8217;utility da riga di comando diskpart, da lanciare tramite una console Powershell eseguita con privilegi di amministrazione: </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="128" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-4-1024x128.png" alt="Esegui diskpart da riga di comando" class="wp-image-559" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-4-1024x128.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-4-300x37.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-4-768x96.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-4.png 1531w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">A questo punto è possibile visualizzare un elenco dei dischi disponibili con il comando</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">list disk</pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="142" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-5-1024x142.png" alt="diskpart list disk" class="wp-image-560" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-5-1024x142.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-5-300x42.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-5-768x106.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-5.png 1525w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Per selezionare il disco da cui rimuovere le partizioni, utilizzare il comando</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">select disk &lt;numerodisco></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="68" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-6-1024x68.png" alt="diskpart select disk 2" class="wp-image-561" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-6-1024x68.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-6-300x20.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-6-768x51.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-6.png 1511w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Una volta selezionato il disco, è possibile visualizzare le sue partizioni con il comando</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">list partition</pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="168" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-7-1024x168.png" alt="diskpart list partition" class="wp-image-562" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-7-1024x168.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-7-300x49.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-7-768x126.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-7.png 1445w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">A questo punto è possibile la singola partitzione con il comando:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">select partition &lt;numeropartizione></pre>



<p class="wp-block-paragraph">ed eliminarla con il comando (NON ANNULLABILE):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">delete partition override</pre>



<p class="wp-block-paragraph">è quindi sufficiente ripetere la stessa sequenza di comandi per tutte le partizioni, e il dispositivo sarà quindi riutilizzabile per intero direttamente da Gestione Disco.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="602" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-8-1024x602.png" alt="diskpart delete partition" class="wp-image-563" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-8-1024x602.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-8-300x177.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-8-768x452.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-8.png 1528w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="185" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-9-1024x185.png" alt="Gestione Disco, partizione non allocata" class="wp-image-564" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-9-1024x185.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-9-300x54.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-9-768x139.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-9.png 1035w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="190" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-10.png" alt="Gestione disco, formattazione in corso" class="wp-image-565" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-10.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-10-300x56.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-10-768x143.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Digita il comando <code>exit</code> per chiudere diskpart.</p>



<div style="height:140px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Photo by <a href="https://unsplash.com/@xiazheng1995?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">铮 夏</a> on <a href="https://unsplash.com/photos/black-and-silver-hard-disk-drive-O2wmp6aSLDU?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2025/06/formattare-un-disco-con-partizioni-efi-con-windows/">Formattare un disco con partizioni EFI con Windows</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Montare un disco Linux su Windows con WSL</title>
		<link>https://www.alessiomarinelli.it/2025/06/montare-un-disco-linux-su-windows-con-wsl/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Fri, 06 Jun 2025 07:54:08 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[WSL]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=547</guid>

					<description><![CDATA[<p>Montare un disco esterno Linux ext4 su Windows 11 con WSL è facile e veloce, e non richiede alcun software aggiuntivo!</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2025/06/montare-un-disco-linux-su-windows-con-wsl/">Montare un disco Linux su Windows con WSL</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover"><img loading="lazy" decoding="async" width="1024" height="366" class="wp-block-cover__image-background wp-image-551 size-large" alt="Hard disk del notebook" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/notebook_hard_disk-1024x366.jpg" data-object-fit="cover" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/notebook_hard_disk-1024x366.jpg 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/notebook_hard_disk-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/notebook_hard_disk-768x274.jpg 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/notebook_hard_disk.jpg 1400w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><span aria-hidden="true" class="wp-block-cover__background has-background-dim" style="background-color:#7c6561"></span><div class="wp-block-cover__inner-container is-layout-constrained wp-block-cover-is-layout-constrained">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Montare un disco Linux su Windows con WSL</p>
</div></div>



<p class="wp-block-paragraph">La scorsa settimana ho recuperato un disco da 500 GB da un vecchio portatile muletto, e, volendo backupparlo prima di formattarlo, l&#8217;ho montato al volo su una macchina Windows 11 con WSL installato.</p>



<p class="wp-block-paragraph">Il disco infatti ospitava una vecchia installazione di Kubuntu, per cui era formattato in formato ext4 (non direttamente leggibile da macchine Windows se non con software aggiuntivo).</p>



<p class="wp-block-paragraph">Montarlo con WSL invece è facile e molto veloce. Ho infilato il disco in un case esterno USB 3.0 (uno come <a href="https://amzn.to/43H6mM1">questo</a> per intenderci), e in una console Powershell eseguita con diritti di amministrazione ho inserito il comando seguente per verificare come il servizio Windows Management Instrumentation vedesse il disco:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""> wmic diskdrive list brief</pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="104" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-1024x104.png" alt="" class="wp-image-548" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-1024x104.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-300x30.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-768x78.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image.png 1449w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Il disco esterno viene visto come <code>\\.\PHYSICALDRIVE1</code> con 2 partizioni (nel mio caso la partizione dati era l&#8217;ultima), per cui procediamo a montarlo in WSL dalla medesima console Powershell con il comando:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">wsl --mount \\.\PHYSICALDRIVE1 --partition 2</pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="89" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-1-1024x89.png" alt="" class="wp-image-549" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-1-1024x89.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-1-300x26.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-1-768x67.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-1.png 1419w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Ora che il disco è montato in WSL, è possibile aprire una console Linux WSL, e accedere al punto di mount <code>/mnt/wsl/&lt;mountname&gt;</code>, quindi nel mio caso:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="93" src="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-2-1024x93.png" alt="" class="wp-image-550" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-2-1024x93.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-2-300x27.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-2-768x69.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-2-1536x139.png 1536w, https://www.alessiomarinelli.it/wp-content/uploads/2025/06/image-2.png 1603w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><em>Et voilà!</em> </p>



<p class="wp-block-paragraph">Tutto il disco è navigabile, ed è possibile visualizzare o copiare i file con i comandi classici Linux, ad esempio:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bash" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">cp -R -v /mnt/wsl/PHYSICALDRIVE1p2/home/ /mnt/c/backup</pre>



<p class="wp-block-paragraph">Al termine delle operazioni, è preferibile smontare il disco da WSL (sempre da una console Powershell con diritti di amministrazione):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="powershell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">wsl --unmount \\.\PHYSICALDRIVE1</pre>



<div style="height:160px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Photo by <a href="https://unsplash.com/@nwiths?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Aaron Boucicault</a> on <a href="https://unsplash.com/photos/a-broken-cell-phone-sitting-on-top-of-a-wooden-table-G3Bh2KE31Uo?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2025/06/montare-un-disco-linux-su-windows-con-wsl/">Montare un disco Linux su Windows con WSL</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Docker Desktop bloccato durante passaggio a Windows container</title>
		<link>https://www.alessiomarinelli.it/2024/10/docker-desktop-bloccato-durante-passaggio-a-windows-container/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Sat, 05 Oct 2024 12:09:59 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[cli]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=533</guid>

					<description><![CDATA[<p>Durante alcuni test con Docker e Docker Desktop, ho tentato la creazione di un progetto multi-platform con docker compose, e ho avuto qualche difficoltà.</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2024/10/docker-desktop-bloccato-durante-passaggio-a-windows-container/">Docker Desktop bloccato durante passaggio a Windows container</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover"><span aria-hidden="true" class="wp-block-cover__background has-background-dim" style="background-color:#73655e"></span><img loading="lazy" decoding="async" width="1400" height="500" class="wp-block-cover__image-background wp-image-538" alt="Containers" src="https://www.alessiomarinelli.it/wp-content/uploads/2024/10/container2_unsplash.jpg" data-object-fit="cover" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2024/10/container2_unsplash.jpg 1400w, https://www.alessiomarinelli.it/wp-content/uploads/2024/10/container2_unsplash-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2024/10/container2_unsplash-1024x366.jpg 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2024/10/container2_unsplash-768x274.jpg 768w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /><div class="wp-block-cover__inner-container is-layout-constrained wp-block-cover-is-layout-constrained">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Docker Desktop bloccato durante passaggio a Windows container</p>
</div></div>



<p class="wp-block-paragraph">Durante alcuni test con Docker e Docker Desktop, ho tentato la creazione di un progetto multi-platform con docker compose, e ho avuto qualche difficoltà.</p>



<p class="wp-block-paragraph">Nel caso specifico, l&#8217;obiettivo era creare un contesto in cui il frontend Blazor fosse dockerizzato in un container Linux, mentre le API fossero servite da un progetto ASP.NET Web API (.NET Framework 4.7.2) in un container Windows, per simulare una casistica di revamping di vecchi applicativi.</p>



<p class="wp-block-paragraph">Il primo passo per fare questo è verificare i <a href="https://docs.docker.com/desktop/install/windows-install/#:~:text=To%20run%20Windows%20containers,%20you%20need%20Windows%2010%20or%20Windows" target="_blank" rel="noreferrer noopener">prerequisiti per l&#8217;esecuzione di container Windows</a>, e quindi configurare l&#8217;ambiente Docker per eseguirli (di default Docker Desktop imposta la modalità Linux/WSL). Modificare questa impostazione con Docker Desktop è estremamente semplice, è sufficiente cliccare di destro sulla tray icon dell&#8217;applicativo e selezionare &#8220;Switch to Windows containers&#8221;.</p>



<p class="wp-block-paragraph">Dopo un po&#8217; di rimuginamenti, Docker Desktop va in errore, e si pianta con un messaggio abbastanza sibillino:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Something went wrong - Post "http://ipc/windowsfeatures/check": open \\.\pipe\dockerBackendV2: The system cannot find the file specified.</pre>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="838" height="247" src="https://www.alessiomarinelli.it/wp-content/uploads/2024/10/Screenshot-2024-10-04-141449.png" alt="Screenshot errore Docker Desktop: &quot;Something went wrong - Post &quot;http://ipc/windowsfeatures/check&quot;: open \\.\pipe\dockerBackendV2: The system cannot find the file specified.&quot;" class="wp-image-534" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2024/10/Screenshot-2024-10-04-141449.png 838w, https://www.alessiomarinelli.it/wp-content/uploads/2024/10/Screenshot-2024-10-04-141449-300x88.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2024/10/Screenshot-2024-10-04-141449-768x226.png 768w" sizes="auto, (max-width: 838px) 100vw, 838px" /></figure>



<p class="wp-block-paragraph">Anche l&#8217;esecuzione da riga di comando del client con log verboso non dà molte informazioni in più:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="shell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">> cd "C:\Program Files\Docker\Docker"
> .\DockerCli.exe -Verbose
[2024-10-04T12:18:39.554157800Z][DockerCli.exe.ipc][I] ipc.NewClient: dcfbb6ca-docker-cli -> \\.\pipe\dockerBackendApiServer BackendAPI</pre>



<p class="wp-block-paragraph">Ho tentato anche di tornare ai container Linux, sia da tray icon, che da CLI, senza successo (sempre stesso errore):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="shell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">> ./DockerCli.exe -SwitchLinuxEngine</pre>



<p class="wp-block-paragraph">Alla fine mi sono rassegnato, e ho proceduto ad una reinstallazione pulita di Docker Desktop (con rimozione della cartelle <code>%AppData%\Docker</code> e <code>%UserProfile%\.docker</code>). Questo ovviamente ha comportato l&#8217;eliminazione di tutti i container e le immagini scaricate.</p>



<p class="wp-block-paragraph">Una volta completata la reinstallazione, da tray icon sono riuscito a configurare la modalità Windows containers.</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2024/10/docker-desktop-bloccato-durante-passaggio-a-windows-container/">Docker Desktop bloccato durante passaggio a Windows container</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Eseguire SQL Server in Docker</title>
		<link>https://www.alessiomarinelli.it/2024/03/eseguire-sql-server-in-docker/</link>
					<comments>https://www.alessiomarinelli.it/2024/03/eseguire-sql-server-in-docker/#respond</comments>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Fri, 15 Mar 2024 11:03:10 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[YAML]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=522</guid>

					<description><![CDATA[<p>Eseguire Microsoft SQL Server in Docker è semplicissimo, e permette di organizzare ambienti di sviluppo e test in maniera ordinata e replicabile</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2024/03/eseguire-sql-server-in-docker/">Eseguire SQL Server in Docker</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover"><span aria-hidden="true" class="wp-block-cover__background has-background-dim"></span><img loading="lazy" decoding="async" width="1400" height="500" class="wp-block-cover__image-background wp-image-526" alt="Container" src="https://www.alessiomarinelli.it/wp-content/uploads/2024/03/container_unsplash.jpg" data-object-fit="cover" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2024/03/container_unsplash.jpg 1400w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/container_unsplash-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/container_unsplash-1024x366.jpg 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/container_unsplash-768x274.jpg 768w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /><div class="wp-block-cover__inner-container is-layout-constrained wp-block-cover-is-layout-constrained">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Eseguire SQL Server in Docker</p>
</div></div>



<p class="wp-block-paragraph">Una delle cose che apprezzo di più della virtualizzazione con Docker, è la possibilità di creare ambiente di sviluppo e test ordinati e replicabili con pochissimo sforzo, senza dover installare nulla.</p>



<p class="wp-block-paragraph">Inoltre, lavorando su progetti e stack diversi, è spesso necessario che nella macchina di sviluppo convivano versioni diverse dello stesso servizio o dello stesso database server, cosa che diventa quasi impossibile installando direttamente tali prodotti.</p>



<p class="wp-block-paragraph">Docker di fatto risolve tutti questi problemi, e anche tirare su un database server di classe enterprise come Microsoft SQL Server è semplice come digitare questo comando nella shell:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="shell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=&lt;password_sa>" -p 1433:1433 --name sql-2022 --hostname sql-2022 -v /mnt/c/SqlServerData:/var/opt/mssql/data -u root -d mcr.microsoft.com/mssql/server:2022-latest</pre>



<p class="wp-block-paragraph">Questo comando chiede a Docker di:</p>



<ul class="wp-block-list">
<li>Utilizzare un&#8217;immagine di SQL Server 2022 ultima versione</li>



<li>Eseguire il database server con il nome host &#8220;sql-2022&#8221;</li>



<li>Impostare la password dell&#8217;utente SA</li>



<li>Montare una cartella locale come volume persistente per ospitare i file dei database creati</li>
</ul>



<p class="wp-block-paragraph">In pochi istanti avrete tutto pronto per iniziare a lavorare sul database server.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="75" src="https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1024x75.png" alt="" class="wp-image-524" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1024x75.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-300x22.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-768x56.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1536x112.png 1536w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image.png 2036w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">È anche possibile creare un file <em>YAML docker-compose</em> per evitare ogni volta di dover inserire un comando così lungo, per orchestrare il database con altri container o per inserire configurazioni più raffinate:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="yaml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">version: '3.9'
services:
    sql-2022:
        container_name: sql-2022
        hostname: sql-2022
        image: mcr.microsoft.com/mssql/server:2022-latest
        user: root
        volumes:
            - /mnt/c/SqlServerData/data:/var/opt/mssql/data
            - /mnt/c/SqlServerLog:/var/opt/mssql/log
            - /mnt/c/SqlServerSecrets:/var/opt/mssql/secrets
        ports:
            - 1433:1433
        environment:
            - ACCEPT_EULA=Y
            - MSSQL_SA_PASSWORD=&lt;password>
            - MSSQL_PID=Express
        restart: unless-stopped
        healthcheck:
            test:
                [
                    "CMD-SHELL",
                    "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P &lt;password> -Q 'SELECT 1' || exit 1"
                ]
            interval: 10s
            retries: 10
            start_period: 10s
            timeout: 3s</pre>



<p class="wp-block-paragraph">Il file YAML così creato è eseguibile in maniera molto più semplice inserendo da shell il seguente comando:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">docker-compose -f file.yml up</pre>



<p class="wp-block-paragraph">In aggiunta a quanto visto per il comando diretto, in questo esempio docker-compose ho aggiunto:</p>



<ul class="wp-block-list">
<li>La mappatura dei volumi per ospitare i <em>log </em>e i <em>secrets</em></li>



<li>Il riavvio automatico del server (se dovesse crashare o riavviarsi per qualsiasi motivo)</li>



<li>L&#8217;utilizzo della versione Express di SQL Server 2022</li>



<li>Un controllo <em>healtcheck</em> per permettere a docker-compose di valutare lo stato di salute del container, e intraprendere azioni qualora sia degradato</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="65" src="https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1-1024x65.png" alt="" class="wp-image-525" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1-1024x65.png 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1-300x19.png 300w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1-768x49.png 768w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1-1536x98.png 1536w, https://www.alessiomarinelli.it/wp-content/uploads/2024/03/image-1-2048x131.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">In questo caso specifico il controllo healtcheck utilizza l&#8217;utility <em>sqlcmd</em> per lanciare una semplicissima query ad intervalli regolari di 10 secondi; nella colonna <em>Status</em> dei processi Docker attivi è ora visualizzato anche lo stato di salute del container, e non solo l&#8217;<em>uptime/downtime</em>.</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Approfondimenti</h2>



<ul class="wp-block-list">
<li><a href="https://learn.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&amp;pivots=cs1-bash" target="_blank" rel="noreferrer noopener">Quickstart: Run SQL Server Linux container images with Docker (learn.microsoft.com)</a></li>



<li><a href="https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-docker-container-configure?view=sql-server-ver16&amp;pivots=cs1-bash" target="_blank" rel="noreferrer noopener">Configure and customize SQL Server Docker containers (learn.microsoft.com)</a></li>



<li><a href="https://learn.microsoft.com/en-us/sql/linux/tutorial-restore-backup-in-sql-server-container?view=sql-server-ver16" target="_blank" rel="noreferrer noopener">Restore a SQL Server database in a Linux container (learn.microsoft.com)</a></li>



<li><a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck" target="_blank" rel="noreferrer noopener">Docker Compose file version 3 reference &#8211; HEALTCHECK (docs.docker.com)</a></li>



<li><a href="https://mcr.microsoft.com/en-us/product/mssql/server/tags" target="_blank" rel="noreferrer noopener">Microsoft SQL Server &#8211; Ubuntu based images (mcr.microsoft.com)</a></li>
</ul>



<div style="height:146px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Photo by <a href="https://unsplash.com/@hooverpaul55?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Paul Teysen</a> on <a href="https://unsplash.com/photos/blue-red-and-yellow-intermodal-containers-bukjsECgmeU?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2024/03/eseguire-sql-server-in-docker/">Eseguire SQL Server in Docker</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.alessiomarinelli.it/2024/03/eseguire-sql-server-in-docker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Italian Toolkit 1.2 &#8211; Riconoscimento delle targhe automobilistiche italiane</title>
		<link>https://www.alessiomarinelli.it/2023/10/italian-toolkit-1-2-riconoscimento-delle-targhe-automobilistiche-italiane/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Thu, 12 Oct 2023 09:04:17 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ANPR]]></category>
		<category><![CDATA[Italian Toolkit]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=511</guid>

					<description><![CDATA[<p>Nuova versione dalla mia libreria Italian Toolkit, che un validatore formale delle targhe automobilistiche italiane attualmente in corso di validità.</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/10/italian-toolkit-1-2-riconoscimento-delle-targhe-automobilistiche-italiane/">Italian Toolkit 1.2 &#8211; Riconoscimento delle targhe automobilistiche italiane</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover"><span aria-hidden="true" class="wp-block-cover__background has-background-dim-80 has-background-dim"></span><img loading="lazy" decoding="async" width="1400" height="500" class="wp-block-cover__image-background wp-image-482" alt="Tastiera del computer" src="https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header.jpg" style="object-position:53% 56%" data-object-fit="cover" data-object-position="53% 56%" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header.jpg 1400w, https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header-1024x366.jpg 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header-768x274.jpg 768w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Riconoscimento delle targhe automobilistiche italiane</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Nuova versione dalla mia libreria <strong>Italian Toolkit</strong>, che con il rilascio 1.2 aggiunge un validatore formale delle targhe automobilistiche italiane attualmente in corso di validità.</p>



<p class="wp-block-paragraph">La validazione è formale (ovvero ne viene verificata la correttezza strutturale, non se il veicolo è effettivamente esistente o registrato al PRA), e sono supportate tutte le principali tipologie di targhe, incluse quelle dei veicoli delle Forze dell&#8217;Ordine, delle Forze Armate e dei Corpi Diplomatici e Consolari.</p>



<p class="wp-block-paragraph">Il codice sorgente è disponibile <a href="https://github.com/Defkon1/italian-toolkit" target="_blank" rel="noreferrer noopener">qui</a>, mentre su NuGet trovate già <a href="https://www.nuget.org/packages/ItalianToolkit" target="_blank" rel="noreferrer noopener">il pacchetto pronto per l&#8217;utilizzo</a>.</p>



<div style="height:162px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Photo by&nbsp;<a href="https://unsplash.com/@jay_zhang?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Jay Zhang</a>&nbsp;on&nbsp;<a href="https://unsplash.com/backgrounds/phone/keyboard?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/10/italian-toolkit-1-2-riconoscimento-delle-targhe-automobilistiche-italiane/">Italian Toolkit 1.2 &#8211; Riconoscimento delle targhe automobilistiche italiane</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Eseguire processi di sistema in una Web API C#</title>
		<link>https://www.alessiomarinelli.it/2023/10/eseguire-processi-di-sistema-in-una-web-api-c/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Thu, 12 Oct 2023 08:44:52 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=504</guid>

					<description><![CDATA[<p>Alcuni contesti applicativi richiedono l'esecuzione di processi di sistema o console application per assolvere alle funzioni richieste dall'utente, e talvolta è necessario impacchettare tali funzionalità all'interno di una REST API.</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/10/eseguire-processi-di-sistema-in-una-web-api-c/">Eseguire processi di sistema in una Web API C#</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover"><span aria-hidden="true" class="wp-block-cover__background has-background-dim"></span><img loading="lazy" decoding="async" width="1400" height="500" class="wp-block-cover__image-background wp-image-340" alt="" src="https://www.alessiomarinelli.it/wp-content/uploads/2017/08/bits.jpg" data-object-fit="cover" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2017/08/bits.jpg 1400w, https://www.alessiomarinelli.it/wp-content/uploads/2017/08/bits-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2017/08/bits-768x274.jpg 768w, https://www.alessiomarinelli.it/wp-content/uploads/2017/08/bits-1024x366.jpg 1024w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /><div class="wp-block-cover__inner-container is-layout-constrained wp-block-cover-is-layout-constrained">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Eseguire processi di sistema in una Web API C#</p>
</div></div>



<p class="wp-block-paragraph">Alcuni contesti applicativi richiedono l&#8217;esecuzione di processi di sistema o console application per assolvere alle funzioni richieste dall&#8217;utente, e talvolta è necessario impacchettare tali funzionalità all&#8217;interno di una REST API.</p>



<p class="wp-block-paragraph">Ad esempio potremmo essere di fronte ad un revamping di funzionalità fornite da console application o da software on-premise, o potrebbero esserci contesti operativi in cui si vogliono utilizzare programmi di terze parti distribuite direttamente in formato eseguibile.</p>



<p class="wp-block-paragraph">Qualsiasi sia il vostro contesto operativo, è molto semplice inglobare tali software all&#8217;interno di una API, utilizzando le classi messe a disposizione dal namespace <code>System.Diagnostics</code> e redirigendo i flussi standard di input, output ed errore.</p>



<p class="wp-block-paragraph">L&#8217;esempio che ho pubblicato su Github è ispirato da un post di qualche settimana fa di Marco Giannini <a href="https://www.marcosbox.org/2023/09/perle-di-saggezza-nel-terminale.html" target="_blank" rel="noreferrer noopener">sul suo blog Marco&#8217;s Box</a>, che spiegava come utilizzare <a href="https://en.wikipedia.org/wiki/Fortune_(Unix)" target="_blank" rel="noreferrer noopener">fortune</a> per stampare nella CLI Linux delle piccole perle di saggezza, personalizzabile anche con dizionari custom.</p>



<p class="wp-block-paragraph">I punti di interesse di questo progetto di esempio sono due: come utilizzare un processo di sistema (in questo caso <code>fortune</code> con dizionari personalizzati in un container Debian) e come aggiungere applicazioni nel container Docker che ospita l&#8217;applicativo.</p>



<h2 class="wp-block-heading">Eseguire un processo di sistema all&#8217;interno di una Web API C#</h2>



<p class="wp-block-paragraph">Esattamente come nei contesti più classici (console application e applicazioni desktop), per eseguire un processo di sistema è sufficiente istanziare un nuovo oggetto <code>System.Diagnostics.ProcessStartInfo</code> in cui inserire tutti i parametri del processo da lanciare, e su cui configurare il redirect dei flussi standard di input, output ed errore:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// https://github.com/Defkon1/pikaquote/blob/main/Pikaquote/Pikaquote.Core/Services/QuotesService.cs

try
{
    var psi = new ProcessStartInfo()
    {
        FileName = "/usr/games/fortune",
        Arguments = argument,
        UseShellExecute = false,
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    };

    using (var process = Process.Start(psi))
    {
        errors = await process.StandardError.ReadToEndAsync();

        results = await process.StandardOutput.ReadToEndAsync();
    }

    return new QuoteDto()
    {
        CreatedAt = DateTime.UtcNow,
        Message = results,
        UsedDictionary = supportedDictionary?.Name ?? _supportedDictionaries.First(d => string.IsNullOrEmpty(d.Slug)).Name
    };
}
catch (System.ComponentModel.Win32Exception exception)
{
    _logger.LogError(exception, message: errors);
}
catch (Exception exception)
{
    _logger.LogError(exception, "Unknown error");
}</pre>



<p class="wp-block-paragraph">In questo caso il processo di fortune è installato in <code>/usr/games/fortune</code> e prende come argomento l&#8217;eventuale dizionario personalizzato da utilizzare; il risultato (la perla di saggezza) viene recuperata redirigendo lo standard output, mentre gli eventuali errori vengono catturati direttamente dallo standard error.</p>



<p class="wp-block-paragraph">Il risultato viene impacchettato in DTO di risposta e restituito al controller. Semplice e veloce.</p>



<h2 class="wp-block-heading">Aggiungere applicazioni di sistema nel container Docker Web API</h2>



<p class="wp-block-paragraph">L&#8217;immagine di default utilizzata da ASP.NET Core (nel caso mostrato basata su Debian) non include <code>fortune</code> out-of-the-box, per cui ho modificato il <code>DockerFile</code> per fare nell&#8217;ordine:</p>



<ul class="wp-block-list">
<li>aggiungere <code>contrib</code> all&#8217;elenco sorgenti</li>



<li>installare i pacchett <code>fortune-mod</code>, <code>wget </code>e <code>dos2unix</code></li>



<li>scaricare da PasteBin i dizionari personalizzati <a href="https://www.marcosbox.org/2023/09/perle-di-saggezza-nel-terminale.html" target="_blank" rel="noreferrer noopener">citati nell&#8217;articolo di Marco Giannini</a> con <code>wget</code></li>



<li>convertire i line break dei file scaricati da formato DOS a formato Unix con <code>dos2unix</code></li>



<li>trasformare i file di testo scaricati in dizionari per <code>fortune </code>con <code>strfile </code>(incluso nel pacchetto <code>fortune-mod</code>)</li>
</ul>



<p class="wp-block-paragraph">Tutte queste operazioni sono facilmente eseguite mediante comandi <code>RUN </code>direttamente nel DockerFile sull&#8217;immagine base:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="dockerfile" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">RUN sed -i'.bak' 's/$/ contrib/' /etc/apt/sources.list
RUN apt-get update &amp;&amp; apt-get install -y fortune-mod
RUN apt-get install -y wget
RUN apt-get install -y dos2unix
RUN wget --no-check-certificate https://pastebin.com/raw/p296KDcE -O /usr/games/fortune-devops
RUN dos2unix /usr/games/fortune-devops
RUN strfile /usr/games/fortune-devops</pre>



<p class="wp-block-paragraph">In questo modo il container risulta essere già pronto con tutti gli strumenti necessari all&#8217;invocazione del processo dall&#8217;interno dell&#8217;API.</p>



<p class="wp-block-paragraph">Il codice sorgente completo dell&#8217;esempio è disponibile su Github con licenza MIT: <a href="https://github.com/Defkon1/pikaquote/" target="_blank" rel="noreferrer noopener">https://github.com/Defkon1/pikaquote/</a> (la stellina è sempre gradita)</p>



<p class="wp-block-paragraph">Have fun!</p>



<p class="wp-block-paragraph"></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/10/eseguire-processi-di-sistema-in-una-web-api-c/">Eseguire processi di sistema in una Web API C#</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Italian Toolkit 1.1.1 &#8211; Supporto all&#8217;Identificativo unico nazionale (ID ANPR)</title>
		<link>https://www.alessiomarinelli.it/2023/06/italian-toolkit-1-1-1-supporto-allidentificativo-unico-nazionale-id-anpr/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Thu, 29 Jun 2023 06:40:00 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ANPR]]></category>
		<category><![CDATA[Italian Toolkit]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=494</guid>

					<description><![CDATA[<p>Nuova versione dalla mia libreria Italian Toolkit, che aggiunge il supporto all'Identificativo Unico Nazionale (ID ANPR), che sostituirà il codice fiscale</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/06/italian-toolkit-1-1-1-supporto-allidentificativo-unico-nazionale-id-anpr/">Italian Toolkit 1.1.1 &#8211; Supporto all&#8217;Identificativo unico nazionale (ID ANPR)</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover"><span aria-hidden="true" class="wp-block-cover__background has-background-dim-80 has-background-dim"></span><img loading="lazy" decoding="async" width="1400" height="500" class="wp-block-cover__image-background wp-image-482" alt="Tastiera del computer" src="https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header.jpg" style="object-position:53% 56%" data-object-fit="cover" data-object-position="53% 56%" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header.jpg 1400w, https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header-1024x366.jpg 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2023/05/keyboard_header-768x274.jpg 768w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Identificativo unico nazionale &#8211; ID ANPR</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Nuova versione dalla mia libreria <strong>Italian Toolkit</strong>, che con il rilascio 1.1.1 aggiunge il supporto SPERIMENTALE all&#8217;<strong>Identificativo Unico Nazionale (ID ANPR)</strong>, che sostituirà nel medio periodo l&#8217;uso del codice fiscale.</p>



<p class="wp-block-paragraph">L&#8217;Identificativo Unico Nazionale è stato definito con Decreto Ministeriale del 03/03/2023 pubblicato in Gazzetta Ufficiale s.g. 91 del 18/04/2023, ma il suo supporto è marchiato come SPERIMENTALE perché attualmente non è stato ancora pubblicato il documento tecnico ufficiale sulle modalità di calcolo del nono carattere (check digit). L&#8217;algoritmo utilizzato sembra essere un <strong>Luhn mod N</strong>, ma la libreria si basa attualmente sul reverse engineering del calcolo (e numerose prove empiriche).</p>



<p class="wp-block-paragraph">Per maggiori dettagli sull&#8217;algoritmo utilizzato e sull&#8217;ID ANPR, vi rimando all&#8217;<a href="https://github.com/Defkon1/italian-toolkit/issues/1" target="_blank" rel="noreferrer noopener">issue aperto nel repository</a>.</p>



<p class="wp-block-paragraph">Il codice sorgente è disponibile <a href="https://github.com/Defkon1/italian-toolkit" target="_blank" rel="noreferrer noopener">qui</a>, mentre su NuGet trovate già <a href="https://www.nuget.org/packages/ItalianToolkit" target="_blank" rel="noreferrer noopener">il pacchetto pronto per l&#8217;utilizzo</a>.</p>



<div style="height:162px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Photo by&nbsp;<a href="https://unsplash.com/@jay_zhang?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Jay Zhang</a>&nbsp;on&nbsp;<a href="https://unsplash.com/backgrounds/phone/keyboard?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/06/italian-toolkit-1-1-1-supporto-allidentificativo-unico-nazionale-id-anpr/">Italian Toolkit 1.1.1 &#8211; Supporto all&#8217;Identificativo unico nazionale (ID ANPR)</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tagliare un MP3 da riga di comando</title>
		<link>https://www.alessiomarinelli.it/2023/06/tagliare-un-mp3-da-riga-di-comando/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Wed, 28 Jun 2023 14:32:00 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[mp3tag]]></category>
		<category><![CDATA[mp4]]></category>
		<category><![CDATA[youtube-dl]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=477</guid>

					<description><![CDATA[<p>Spesso vengono pubblicati video di cui si vorrebbe estrarre l'audio e separarlo in più tracce per un ascolto più agevole. Vediamo come farlo con ffmpeg!</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/06/tagliare-un-mp3-da-riga-di-comando/">Tagliare un MP3 da riga di comando</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cover"><span aria-hidden="true" class="wp-block-cover__background has-background-dim-70 has-background-dim"></span><img loading="lazy" decoding="async" width="1400" height="500" class="wp-block-cover__image-background wp-image-492" alt="Cuffie audio su sfondo giallo" src="https://www.alessiomarinelli.it/wp-content/uploads/2023/06/cuffie.jpg" data-object-fit="cover" srcset="https://www.alessiomarinelli.it/wp-content/uploads/2023/06/cuffie.jpg 1400w, https://www.alessiomarinelli.it/wp-content/uploads/2023/06/cuffie-300x107.jpg 300w, https://www.alessiomarinelli.it/wp-content/uploads/2023/06/cuffie-1024x366.jpg 1024w, https://www.alessiomarinelli.it/wp-content/uploads/2023/06/cuffie-768x274.jpg 768w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Tagliare un MP3 da riga di comando</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Talvolta sulle piattaforme di sharing video vengono pubblicati video (tutorial, concerti, &#8230;) di cui si vorrebbe estrarre l&#8217;audio e magari separarlo in più tracce per un ascolto offline più agevole.</p>



<p class="wp-block-paragraph">Ci sono decine di prodotti commerciali utili allo scopo, ma in realtà possiamo procedere da riga di comando con il solo ausilio di <a href="https://ffmpeg.org/" target="_blank" rel="noreferrer noopener">ffmpeg</a>. Vediamo come!</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="su-service"><div class="su-service-title" style="padding-left:46px;min-height:32px;line-height:32px"><i class="sui sui-warning" style="font-size:32px;color:#d72020"></i> ATTENZIONE</div><div class="su-service-content su-u-clearfix su-u-trim" style="padding-left:46px">L&#8217;articolo è pubblicato a solo scopo didattico/informativo. <br />
Si ricorda che il download non autorizzato di materiale soggetto a copyright è reato.</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">1. Ottenere il file originale</h2>



<p class="wp-block-paragraph">Il primo passo è ovviamente ottenere il file originale; ad esempio è possibile utilizzare un altro tool da riga di comando come <a href="https://youtube-dl.org/" target="_blank" rel="noreferrer noopener">youtube-dl</a> per scaricare direttamente il contenuto audio in formato MP3:</p>



<pre class="wp-block-prismatic-blocks"><code class="language-shell-session">youtube-dl --ignore-errors --no-check-certificate --format bestaudio --extract-audio --audio-format mp3 --audio-quality 160K --output &quot;%(title)s.%(ext)s&quot; https://&lt;url_del_video&gt;</code></pre>



<p class="wp-block-paragraph">Se preferite utilizzare un programma con GUI, vi consiglio l&#8217;ottimo <a href="https://jdownloader.org/" target="_blank" rel="noreferrer noopener">jDownloader</a>.</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">2. Convertire il file originale da MP4 in MP3</h2>



<p class="wp-block-paragraph">Qualora abbiate disponibile il file video (ad esempio in formato MP4), è sempre possibile estrarre la traccia audio proprio con l&#8217;aiuto di ffmpeg:</p>



<pre class="wp-block-prismatic-blocks"><code class="language-shell-session">ffmpeg -i &lt;file_sorgente&gt;.mp4 &lt;file_destinazione&gt;.mp3</code></pre>



<p class="wp-block-paragraph"><strong>Nota bene:</strong> ffmpeg è un tool potentissimo e ogni comando ha decine di parametri; nel caso sopra provvederà a tentare l&#8217;autoriconoscimento dei formati coinvolti, ma vi consiglio di <a href="https://ffmpeg.org/ffmpeg.html" target="_blank" rel="noreferrer noopener">visionare la documentazione ufficiale</a> per maggiori dettagli sui parametri disponibili.</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">3. Tagliare il file MP3 in multiple tracce</h2>



<p class="wp-block-paragraph">Una volta ottenuto il file MP3 sorgente, dovrete decidere in quali punti tagliare.</p>



<p class="wp-block-paragraph">Ad esempio, potremmo avere un video tutorial da dividere in 5 tracce a questi minutaggi:</p>



<ul class="wp-block-list">
<li>00:00:00 Introduzione</li>



<li>00:10:21 Capitolo 1</li>



<li>00:38:34 Capitolo 2</li>



<li>00:52:13 Capitolo 3</li>



<li>01:08:35 Conclusioni</li>
</ul>



<p class="wp-block-paragraph">Il comando per tagliare una singola traccia in ffmpeg è abbastanza semplice; la prima traccia sarebbe ad esempio estraibile nel seguente modo:</p>



<pre class="wp-block-prismatic-blocks"><code class="language-shell-session">ffmpeg -ss 00:00:00.0 -i &lt;file_da_tagliare&gt;.mp3 -acodec copy -t 00:10:21.0 &lt;traccia_1&gt;.mp3
</code></pre>



<p class="wp-block-paragraph">Oppure potreste usare questo comodo script CLI per tagliarle tutte insieme:</p>



<pre class="wp-block-prismatic-blocks"><code class="language-shell-session">source=&quot;source audio &lt;file_da_tagliare&gt;.mp3&quot;; i=0; t1=0:00; for end_time in 10:21 38:34 52:13 1:08:35 &#039;&#039;; do i=$((i+1)); t0=$t1 t1=$end_time; echo ffmpeg -i &quot;$source&quot; -acodec copy -ss $t0 ${t1:+-to} $t1 $(printf &quot;track%02d.%s&quot; $i ${source##*.}); done</code></pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">4. Aggiungere i tag</h2>



<p class="wp-block-paragraph">Se volete &#8220;lavorare di fino&#8221;, potete poi rinominare i file tagliati e aggiungerci i metadata, ad esempio utilizzando <a href="https://www.mp3tag.de/en/" target="_blank" rel="noreferrer noopener">Mp3tag</a>.</p>



<p class="wp-block-paragraph">Enjoy!</p>



<div style="height:241px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Photo by <a href="https://unsplash.com/es/@cdx2?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">C D-X</a> on <a href="https://unsplash.com/photos/PDX_a_82obo?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/06/tagliare-un-mp3-da-riga-di-comando/">Tagliare un MP3 da riga di comando</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Italian Toolkit &#8211; developizza e maindolino</title>
		<link>https://www.alessiomarinelli.it/2023/05/italian-toolkit-developizza-e-maindolino/</link>
		
		<dc:creator><![CDATA[Defkon1]]></dc:creator>
		<pubDate>Mon, 15 May 2023 08:25:03 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[githubhack23]]></category>
		<category><![CDATA[Italian Toolkit]]></category>
		<guid isPermaLink="false">https://www.alessiomarinelli.it/?p=480</guid>

					<description><![CDATA[<p>Ho pubblicato la mia prima libreria su NuGet!</p>
<p>È una piccola libreria che contiene una serie di metodi helper e classi utility per la gestione e validazione di dati di uso comune quando si lavora nel contesto italiano, come ad esempio codici fiscali, targhe automobilistiche e unità territoriali.</p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/05/italian-toolkit-developizza-e-maindolino/">Italian Toolkit &#8211; developizza e maindolino</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ho pubblicato la mia prima libreria su <a href="https://www.nuget.org/packages/ItalianToolkit/" target="_blank" rel="noreferrer noopener">NuGet</a>!</p>



<p class="wp-block-paragraph">È una piccola libreria che contiene una serie di metodi helper e classi utility per la gestione e validazione di dati di uso comune quando si lavora nel contesto italiano, come ad esempio codici fiscali, targhe automobilistiche e unità territoriali (regioni, province, comuni e aree metropolitane).</p>



<p class="wp-block-paragraph">Al momento nella versione 1.0.1 sono disponibili i seguenti metodi per la gestione dei codici fiscali:</p>



<ul class="wp-block-list">
<li>Validazione formale dei codici fiscali (standard e temporanei)</li>



<li>Calcolo del codice fiscale a partire dai dati anagrafici</li>



<li>Calcolo delle omocodie a partire dal codice fiscale standard</li>



<li>Validazione di un codice fiscale omocodo</li>
</ul>



<p class="wp-block-paragraph">La libreria ha come target .NET Standard 2.0 per essere il più trasversale possibile, ed è installabile da <a href="https://www.nuget.org/packages/ItalianToolkit/" target="_blank" rel="noreferrer noopener">NuGet </a>tramite il Package Manager o da riga di comando:</p>



<pre class="wp-block-code"><code>dotnet add package ItalianToolkit</code></pre>



<p class="wp-block-paragraph">Il codice sorgente è disponibile con licenza MIT su GitHub all&#8217;indirizzo <a href="https://github.com/Defkon1/italian-toolkit" target="_blank" rel="noreferrer noopener">https://github.com/Defkon1/italian-toolkit</a> ed è aperto a discussioni e contributi.</p>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph"><a href="https://github.com/Defkon1/italian-toolkit" target="_blank" rel="noreferrer noopener">Italian Toolkit</a> partecipa al <a href="https://dev.to/devteam/announcing-the-github-dev-2023-hackathon-4ocn" target="_blank" rel="noreferrer noopener">GitHub + DEV 2023 Hackaton</a> e al suo interno è possibile vedere l&#8217;utilizzo di GitHub Actions per la pubblicazione automatica, per l&#8217;aggiornamento del README e per l&#8217;analisi del codice (CodeQL e Linter).</p>



<p class="wp-block-paragraph">Per maggiori dettagli (come contribuire, roadmap delle prossime implementazioni, &#8230;) andate direttamente sul repository <a href="https://github.com/Defkon1/italian-toolkit" target="_blank" rel="noreferrer noopener">https://github.com/Defkon1/italian-toolkit</a>!</p>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph"> Voglio ringraziare tutta la community italiana di .NET ed in particolare <a href="https://github.com/marcominerva" target="_blank" rel="noreferrer noopener">Marco Minerva</a> per il suo continuo ed instancabile lavoro di diffusione di contenuti!</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">Photo by <a href="https://unsplash.com/@jay_zhang?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Jay Zhang</a> on <a href="https://unsplash.com/backgrounds/phone/keyboard?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
<p>L'articolo <a href="https://www.alessiomarinelli.it/2023/05/italian-toolkit-developizza-e-maindolino/">Italian Toolkit &#8211; developizza e maindolino</a> proviene da <a href="https://www.alessiomarinelli.it">Alessio Marinelli</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
