<?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>MacOS &#8211; SMsoft &#8211; informatica e dintorni</title>
	<atom:link href="https://blog.smsoft.it/category/macos/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.smsoft.it</link>
	<description>consigli settimanali su MacOS, GNU/Linux ed Open Source</description>
	<lastBuildDate>Mon, 28 Sep 2026 17:47:38 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=90401</generator>
	<item>
		<title>Smetti di rispondere al questionario sulla cifratura: la chiave segreta di Info.plist</title>
		<link>https://blog.smsoft.it/2026/07/07/smetti-di-rispondere-al-questionario-sulla-cifratura-la-chiave-segreta-di-info-plist/</link>
					<comments>https://blog.smsoft.it/2026/07/07/smetti-di-rispondere-al-questionario-sulla-cifratura-la-chiave-segreta-di-info-plist/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 07 Jul 2026 08:30:00 +0000</pubDate>
				<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[compliance]]></category>
		<category><![CDATA[info.plist]]></category>
		<category><![CDATA[ITSAppUsesNonExemptEncryption]]></category>
		<category><![CDATA[Testflight]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=7089</guid>

					<description><![CDATA[Se hai mai caricato una build su TestFlight, la conosci benissimo: la build termina il processing e poi resta bloccata con l&#8217;etichetta gialla &#8220;Missing Compliance&#8221;. Finché non apri App Store Connect e rispondi al questionario sulla cifratura, i tester non possono installarla. E la domanda ricompare a ogni nuova build, come un ritornello infinito. La ... <a title="Smetti di rispondere al questionario sulla cifratura: la chiave segreta di Info.plist" class="read-more" href="https://blog.smsoft.it/2026/07/07/smetti-di-rispondere-al-questionario-sulla-cifratura-la-chiave-segreta-di-info-plist/" aria-label="Per saperne di più su Smetti di rispondere al questionario sulla cifratura: la chiave segreta di Info.plist">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Se hai mai caricato una build su TestFlight, la conosci benissimo: la build termina il processing e poi resta bloccata con l&#8217;etichetta gialla <strong>&#8220;Missing Compliance&#8221;</strong>. Finché non apri App Store Connect e rispondi al questionario sulla cifratura, i tester non possono installarla. E la domanda ricompare a ogni nuova build, come un ritornello infinito.</p>



<p class="wp-block-paragraph">La buona notizia è che Apple offre un modo per rispondere <strong>una volta sola</strong>, direttamente nel progetto: la chiave <code>ITSAppUsesNonExemptEncryption</code> in <code>Info.plist</code>.</p>



<h2 class="wp-block-heading">Come funziona</h2>



<p class="wp-block-paragraph">Quando non trova questa chiave, App Store Connect ti fa compilare il questionario di export compliance a ogni caricamento: la build va su server negli Stati Uniti, e le leggi statunitensi sull&#8217;esportazione di software criptato richiedono una dichiarazione. Aggiungendo la chiave al <code>Info.plist</code>, la dichiarazione viaggia <strong>dentro il binario stesso</strong>, e il prompt sparisce sia per TestFlight che per la pubblicazione sull&#8217;App Store.</p>



<p class="wp-block-paragraph">Il valore giusto per la stragrande maggioranza delle app:</p>



<pre class="wp-block-code"><code>&lt;key&gt;ITSAppUsesNonExemptEncryption&lt;/key&gt;
&lt;false/&gt;</code></pre>



<p class="wp-block-paragraph">Un attenzione al dettaglio tecnico: deve essere un <strong>Booleano vero</strong>, non la stringa <code>"NO"</code> o <code>"false"</code> tra virgolette. Xcode lo scrive correttamente se aggiungi la chiave dall&#8217;interfaccia.</p>



<h2 class="wp-block-heading">Aggiungerla da Xcode</h2>



<ol start="1" class="wp-block-list">
<li>Seleziona il progetto nel navigatore, poi il target dell&#8217;app</li>



<li>Apri il tab <strong>Info</strong></li>



<li>Aggiungi una nuova proprietà: <strong>App Uses Non-Exempt Encryption</strong></li>



<li>Tipo: <strong>Boolean</strong>, valore: <strong>NO</strong></li>
</ol>



<p class="wp-block-paragraph">In alternativa, modifica direttamente il file <code>Info.plist</code> in vista sorgente.</p>



<p class="wp-block-paragraph">Dopo averla aggiunta: <strong>Clean Build Folder</strong> (⇧⌘K), archivia di nuovo e carica. La build già presente su App Store Connect non la rileverà retroattivamente, quindi sblocca quella vecchia a mano — ma dalla prossima in poi non te lo chiederà più.</p>



<h2 class="wp-block-heading">Quando è corretto usare <code>false</code></h2>



<p class="wp-block-paragraph">Il nome della chiave si presta a confusione: non chiede se la tua app &#8220;usa la cifratura&#8221;, ma se usa cifratura <strong>non esente</strong> (<em>non-exempt</em>). Puoi impostare <code>false</code> quando l&#8217;app — comprese tutte le librerie di terze parti linkate — non usa cifratura, oppure usa solo cifratura esente dalle documentazioni di export compliance.</p>



<p class="wp-block-paragraph">Copre praticamente tutte le app &#8220;normali&#8221;:</p>



<ul class="wp-block-list">
<li>chiamate HTTPS a un backend tramite <code>URLSession</code> o <code>URLSessionWebSocketTask</code> — l&#8217;HTTPS tramite le API di sistema è esente</li>



<li>salvataggio di credenziali nel Keychain</li>



<li>uso di framework Apple (CryptoKit, Security, CloudKit, StoreKit, Sign in with Apple, push notification)</li>
</ul>



<p class="wp-block-paragraph">Se usi SDK di terze parti che implementano la <strong>propria</strong> crittografia (un proprio motore crittografico, non le API di sistema), vale la pena verificare prima di dichiarare <code>false</code>.</p>



<h2 class="wp-block-heading">Quando invece serve <code>true</code></h2>



<p class="wp-block-paragraph">Impota <code>true</code> solo se la tua app usa cifratura non esente: algoritmi proprietari o non standard, protocolli crittografici custom (es. E2E messaging fatto in casa), librerie crittografiche bundled come OpenSSL o libsodium usate per la cifratura come funzionalità principale. In quel caso non basta la chiave: dovrai caricare la documentazione di export compliance su App Store Connect e, una volta approvata, Apple ti fornirà un codice da inserire in <code>ITSEncryptionExportComplianceCode</code>.</p>



<h2 class="wp-block-heading">Perché conviene anche in CI/CD</h2>



<p class="wp-block-paragraph">Se usi Xcode Cloud o una pipeline CI per archiviare e caricare build, questo blocco diventa un vero ostacolo: i processi automatizzati si fermano in attesa di un&#8217;azione manuale su App Store Connect. Con la chiave nel <code>Info.plist</code>, l&#8217;intero flusso — build, archive, upload, distribuzione ai tester — scorre senza interruzioni.</p>



<h2 class="wp-block-heading">Il risvolto legale, per onestà</h2>



<p class="wp-block-paragraph">Questa dichiarazione è una <strong>dichiarazione legale</strong>: la responsabilità di un&#8217;eventuale classificazione errata ricade sullo sviluppatore, non su Apple. Per la tipica app consumer che comunica con un backend via HTTPS è un&#8217;esenzione tranquilla e consolidata, ma se la tua app ha componenti crittografiche non banali, vale la pena leggere la <a target="_blank" href="https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations" rel="noopener" class="">documentazione Apple sull&#8217;export compliance</a> e, se necessario, consultare un esperto.</p>



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



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Situazione</th><th>Valore</th><th>Conseguenza</th></tr></thead><tbody><tr><td>Solo HTTPS + API di sistema Apple</td><td><code>false</code></td><td>Niente più prompt, nessuna documentazione</td></tr><tr><td>Cifratura proprietaria / custom</td><td><code>true</code></td><td>Documentazione + <code>ITSEncryptionExportComplianceCode</code></td></tr><tr><td>Chiave assente</td><td>—</td><td>Questionario a ogni upload</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Una riga di <code>Info.plist</code> e addio al questionario. Il tempo risparmiato, build dopo build, si accumula più di quanto sembri.</p>



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



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2026/07/07/smetti-di-rispondere-al-questionario-sulla-cifratura-la-chiave-segreta-di-info-plist/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Flutter: l&#8217;applicazione nel device non si avvia se non collegato al cavo</title>
		<link>https://blog.smsoft.it/2026/06/30/flutter-lapplicazione-nel-device-non-si-avvia-se-non-collegato-al-cavo/</link>
					<comments>https://blog.smsoft.it/2026/06/30/flutter-lapplicazione-nel-device-non-si-avvia-se-non-collegato-al-cavo/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 30 Jun 2026 08:30:00 +0000</pubDate>
				<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[iPhone]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=7083</guid>

					<description><![CDATA[Se dopo aver collegato l&#8217;iPhone con il cavo e digitato: per testare l&#8217;applicazione, scollegando il cavo l&#8217;appl&#8217;icazione non riparte e viene mostrato il messaggio: approfitto per ricordarvi che Flutter in debug costruisce un &#8220;app sandbox&#8221; che comunica costantemente via USB/network con l&#8217;host per: Da iOS 14 in poi, per questioni di sicurezza, Apple blocca l&#8217;apertura di queste ... <a title="Flutter: l&#8217;applicazione nel device non si avvia se non collegato al cavo" class="read-more" href="https://blog.smsoft.it/2026/06/30/flutter-lapplicazione-nel-device-non-si-avvia-se-non-collegato-al-cavo/" aria-label="Per saperne di più su Flutter: l&#8217;applicazione nel device non si avvia se non collegato al cavo">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Se dopo aver collegato l&#8217;iPhone con il cavo e digitato:</p>



<pre class="wp-block-code"><code>flutter run -d 00007046-004082773524571B</code></pre>



<p class="wp-block-paragraph">per testare l&#8217;applicazione, scollegando il cavo l&#8217;appl&#8217;icazione non riparte e viene mostrato il messaggio:</p>



<pre class="wp-block-code"><code>In iOS 14+, debug mode Flutter apps can only be launched from Flutter tooling, IDEs with Flutter plugins or from Xcode.
Alternatively, build in profile or release modes to enable launching from the home screen.
</code></pre>



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



<p class="wp-block-paragraph">approfitto per ricordarvi che Flutter in debug costruisce un &#8220;app sandbox&#8221; che comunica costantemente via USB/network con l&#8217;host per:</p>



<ul class="wp-block-list">
<li>Hot reload / hot restart</li>



<li>DevTools (debugger, performance, logging)</li>



<li>Dart VM service</li>
</ul>



<p class="wp-block-paragraph">Da<strong> iOS 14</strong> in poi, per questioni di sicurezza, Apple <strong>blocca</strong> l&#8217;apertura di queste app dalla home se non sono state avviate dal tooling (<strong>Flutter/Xcode</strong>). Non è un bug: è una limitazione voluta.</p>



<h2 class="wp-block-heading">Soluzione: installa in&nbsp;<strong>release</strong>&nbsp;o&nbsp;<strong>profile</strong>&nbsp;mode</h2>



<p class="wp-block-paragraph">Queste due modalità compilano AOT (codice macchina nativo ARM) e non richiedono connessione all&#8217;host. Funzionano a cavo scollegato.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Passaggi da fare:</h2>



<h3 class="wp-block-heading">1. Verifica prerequisiti sull&#8217;iPhone (solo 1a volta)</h3>



<ul class="wp-block-list">
<li><strong>Sblocca iPhone</strong> e tienilo sullo schermo home durante l&#8217;installazione.</li>



<li><strong>Developer Mode ON</strong>: <code>Impostazioni → Privacy e sicurezza → Modalità sviluppatore → ON</code> (riavvio richiesto).</li>



<li><strong>Fiducia computer</strong>: quando compare il popup <code>"Fiducia di questo computer?"</code> su iPhone → tocca <strong>Fiducia</strong> e inserisci il codice.</li>
</ul>



<h3 class="wp-block-heading">2. Controlla che Flutter veda il device</h3>



<pre class="wp-block-code"><code>flutter devices</code></pre>



<p class="wp-block-paragraph">Dovresti vedere <strong><code>iPhone di XXXX (mobile)</code></strong> in elenco (non simulator). Se non lo vede:</p>



<pre class="wp-block-code"><code>brew install libimobiledevice ideviceinstaller ios-deploy</code></pre>



<h3 class="wp-block-heading">3. Installa in RELEASE mode (scelta consigliata per usarlo senza cavo)</h3>



<pre class="wp-block-code"><code>flutter run --release -d </code></pre>



<p class="wp-block-paragraph">oppure con il nome:</p>



<pre class="wp-block-code"><code>flutter run --release -d "iPhone di XXXX"</code></pre>



<p class="wp-block-paragraph">⚠️&nbsp;<strong>Se ti chiede la password del keychain / permessi di accesso a Xcode</strong>: rispondi&nbsp;<strong>Consenti sempre</strong>&nbsp;(il sandbox dell&#8217;IDE spesso inghiotte questi dialoghi, per questo dal terminale esterno è più sicuro).</p>



<h3 class="wp-block-heading">4. Alternative se <code>flutter run</code> fallisce per il signing</h3>



<p class="wp-block-paragraph">Se incontri errori di&nbsp;<strong>code signing / provisioning profile</strong>:</p>



<pre class="wp-block-code"><code>1. Apri Xcode → Apri progetto: ios/Runner.xcworkspace
2. Seleziona target Runner → Tab "Signing &amp; Capabilities"
3. Team: seleziona il tuo account Apple Developer (anche free va bene)
4. Bundle Identifier: metti qualcosa di unico (es. com.tuonome.xxxxx)</code></pre>



<p class="wp-block-paragraph">Poi ridai:</p>



<pre class="wp-block-code"><code>flutter run --release -d "iPhone di XXXX"</code></pre>



<h3 class="wp-block-heading">5. Modalità Profile (utile se vuoi anche performance monitor, ma sempre standalone)</h3>



<p class="wp-block-paragraph">Se vuoi anche misurare performance:</p>



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



<pre class="wp-block-code"><code>flutter run --profile -d "iPhone di XXXX"</code></pre>



<h3 class="wp-block-heading">6. Verifica cavo scollegato</h3>



<p class="wp-block-paragraph">Quando il terminale stampa:</p>



<pre class="wp-block-code"><code>💪  Running with sound null safety
🔥  To hot restart changes while running, press "r" or "R".</code></pre>



<p class="wp-block-paragraph">L&#8217;app è installata e avviata. Adesso puoi:</p>



<ol class="wp-block-list">
<li>Premere <code>q</code> nel terminale per chiudere il processo Flutter (non disinstalla niente).</li>



<li><strong>Staccare il cavo USB</strong>.</li>



<li>Aprire l&#8217;app dgtv direttamente dalla home di iOS: ✅ <strong>funzionerà</strong>.</li>
</ol>



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



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2026/06/30/flutter-lapplicazione-nel-device-non-si-avvia-se-non-collegato-al-cavo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MacOS: Archivi RAR da CLI</title>
		<link>https://blog.smsoft.it/2026/06/09/macos-archivi-rar-da-cli/</link>
					<comments>https://blog.smsoft.it/2026/06/09/macos-archivi-rar-da-cli/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 08:30:00 +0000</pubDate>
				<category><![CDATA[MacOS]]></category>
		<category><![CDATA[rar]]></category>
		<category><![CDATA[unar]]></category>
		<category><![CDATA[unrar]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=7065</guid>

					<description><![CDATA[Tramite brew è possibile installare svariati pacchetti di utilità. L&#8217;utility unrar però non funziona più perché la firma è scaduta. Si può in alternativa usare unar, procediamo in questo modo: enjoy!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Tramite brew è possibile installare svariati pacchetti di utilità. L&#8217;utility unrar però non funziona più perché la firma è scaduta.</p>



<p class="wp-block-paragraph">Si può in alternativa usare unar, procediamo in questo modo:</p>



<pre class="wp-block-code"><code>brew uninstall unrar
brew install unar

unar archivio.rar</code></pre>



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



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2026/06/09/macos-archivi-rar-da-cli/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Firefox: quale scheda sta usando più RAM?</title>
		<link>https://blog.smsoft.it/2026/06/02/firefox-quale-scheda-sta-usando-piu-ram/</link>
					<comments>https://blog.smsoft.it/2026/06/02/firefox-quale-scheda-sta-usando-piu-ram/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 02 Jun 2026 08:30:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[ram]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=7062</guid>

					<description><![CDATA[Ho l&#8217;abitudine di tenere aperte molte schede su firefox, però a lungo andare possono arrivare ad utilizzare una grande quantità di RAM. Ho visto infatti da &#8220;Monitoraggio attività&#8221; di MacOS che c&#8217;erano delle schede che richiedevano oltre 3GB di RAM, ma quali sono? Basta aprire una nuova scheda di Firefox e digitare nella barra degli ... <a title="Firefox: quale scheda sta usando più RAM?" class="read-more" href="https://blog.smsoft.it/2026/06/02/firefox-quale-scheda-sta-usando-piu-ram/" aria-label="Per saperne di più su Firefox: quale scheda sta usando più RAM?">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ho l&#8217;abitudine di tenere aperte molte schede su firefox, però a lungo andare possono arrivare ad utilizzare una grande quantità di RAM. Ho visto infatti da &#8220;Monitoraggio attività&#8221; di MacOS che c&#8217;erano delle schede che richiedevano oltre 3GB di RAM, ma quali sono?</p>



<p class="wp-block-paragraph">Basta aprire una nuova scheda di Firefox e digitare nella barra degli indirizzi:</p>



<pre class="wp-block-code"><code>about:processes</code></pre>



<p class="wp-block-paragraph">Questo mostrerà un elenco di tutte le finestre con il titolo e la RAM usata e, oltretutto, la possibilità di scaricare direttamente la scheda per liberare RAM.</p>



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



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2026/06/02/firefox-quale-scheda-sta-usando-piu-ram/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Docker compose: come passare il proxy nel Dockerfile</title>
		<link>https://blog.smsoft.it/2026/05/19/docker-compose-come-passare-il-proxy-nel-dockerfile/</link>
					<comments>https://blog.smsoft.it/2026/05/19/docker-compose-come-passare-il-proxy-nel-dockerfile/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 19 May 2026 08:30:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker compose]]></category>
		<category><![CDATA[Dockerfile]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=7042</guid>

					<description><![CDATA[Per per utilizzare un proxy all&#8217;interno della procedura di build prevista nel Dockerfile impostato dal compose.yaml è necessario effettuare sia una modifica al compose.yaml che al Dockerfile. Nel mio esempio il proxy è attivo sulla macchina host, pertanto lo si può &#8220;puntare&#8221; con il nome host.docker.internal avendo l&#8217;accortezza di aggiungere, come vedremo in avanti, nel ... <a title="Docker compose: come passare il proxy nel Dockerfile" class="read-more" href="https://blog.smsoft.it/2026/05/19/docker-compose-come-passare-il-proxy-nel-dockerfile/" aria-label="Per saperne di più su Docker compose: come passare il proxy nel Dockerfile">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Per per utilizzare un proxy all&#8217;interno della procedura di build prevista nel <strong>Dockerfile</strong> impostato dal <strong>compose.yaml </strong>è necessario effettuare sia una modifica al compose.yaml che al Dockerfile. </p>



<p class="wp-block-paragraph">Nel mio esempio il proxy è attivo sulla macchina <strong>host</strong>, pertanto lo si può &#8220;puntare&#8221; con il nome <strong>host.docker.internal</strong> avendo l&#8217;accortezza di aggiungere, come vedremo in avanti, nel file <strong>compose.yaml</strong>:</p>



<pre class="wp-block-code"><code>      extra_hosts:
        - "host.docker.internal:host-gateway"</code></pre>



<p class="wp-block-paragraph">Ipotizziamo che il <strong>Dockerfile</strong> contenga qualcosa di questo tipo:</p>



<pre class="wp-block-code"><code># Stage 1: Dipendenze
FROM node:20-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app</code></pre>



<p class="wp-block-paragraph">dobbiamo aggiungere le necessarie variabili facendolo diventare:</p>



<pre class="wp-block-code"><code># Stage 1: Dipendenze
FROM node:20-alpine AS deps
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY

ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
ENV NO_PROXY=${NO_PROXY}
ENV http_proxy=${HTTP_PROXY}
ENV https_proxy=${HTTPS_PROXY}
ENV no_proxy=${NO_PROXY}

RUN apk add --no-cache libc6-compat
WORKDIR /app</code></pre>



<p class="wp-block-paragraph">Importante: Se l&#8217;applicativo cerca la variabile proxy in altro modo, ad esempio pip lanciato nel docker file, bisognerà dichiarare il proxy anche li in modo specifico, es:</p>



<pre class="wp-block-code"><code>COPY requirements.txt .
RUN python -m pip config --user set global.proxy $HTTP_PROXY
RUN pip install --no-cache-dir -r requirements.txt</code></pre>



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



<p class="wp-block-paragraph">ora passiamo a modificare il <strong>compose.yaml</strong> che da:</p>



<pre class="wp-block-code"><code>services:
  app:
    image: gest:latest
    build:
      context: .
      dockerfile: Dockerfile
      args:
        BUILD_GIT_SHA: ${BUILD_GIT_SHA:-unknown}
        BUILD_DATE: ${BUILD_DATE:-unknown}
    container_name: app-club
    restart: unless-stopped</code></pre>



<p class="wp-block-paragraph">dovrà diventare:</p>



<pre class="wp-block-code"><code>services:
  app:
    image: gest:latest
    build:
      context: .
      dockerfile: Dockerfile
      args:
        BUILD_GIT_SHA: ${BUILD_GIT_SHA:-unknown}
        BUILD_DATE: ${BUILD_DATE:-unknown}
        HTTP_PROXY: http://host.docker.internal:8888
        HTTPS_PROXY: http://host.docker.internal:8888
        NO_PROXY: 127.0.0.1,localhost
      extra_hosts:
        - "host.docker.internal:host-gateway"
    container_name: app-club
    restart: unless-stopped
    extra_hosts:
      - "host.docker.internal:host-gateway"</code></pre>



<p class="wp-block-paragraph"><strong>Nota</strong>: il TAG <strong>extra_hosts</strong> è ripetuto due volte, perché uno viene passato come ARG e l&#8217;altro viene usato dalla machcina docker.</p>



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2026/05/19/docker-compose-come-passare-il-proxy-nel-dockerfile/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>rclone: un valido aiuto per storage S3</title>
		<link>https://blog.smsoft.it/2026/04/07/rclone-un-valido-aiuto-per-storage-s3/</link>
					<comments>https://blog.smsoft.it/2026/04/07/rclone-un-valido-aiuto-per-storage-s3/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 07 Apr 2026 08:30:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[rclone]]></category>
		<category><![CDATA[S3]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=6996</guid>

					<description><![CDATA[Rclone (&#8220;rsync for cloud storage&#8221;) è un programma CLI per sincronizzare file e cartelle da/verso provider cloud storage. L&#8217;installazione è molto semplice: Oppure in modo specifico per MacOS: alla prima esecuzione bisogna configurare i dati di connessione: Questi gli step durante la configurazione (che poi viene scritta nel file ~/.config/rclone/rclone.conf): Dopo aver configurato la connessione, ... <a title="rclone: un valido aiuto per storage S3" class="read-more" href="https://blog.smsoft.it/2026/04/07/rclone-un-valido-aiuto-per-storage-s3/" aria-label="Per saperne di più su rclone: un valido aiuto per storage S3">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Rclone <em>(&#8220;rsync for cloud storage&#8221;)</em> è un programma CLI per sincronizzare file e cartelle da/verso provider cloud storage.</p>



<p class="wp-block-paragraph">L&#8217;installazione è molto semplice:</p>



<pre class="wp-block-code"><code>sudo -v ; curl https://rclone.org/install.sh | sudo bash</code></pre>



<p class="wp-block-paragraph">Oppure in modo specifico per MacOS:</p>



<pre class="wp-block-code"><code>brew install rclone</code></pre>



<p class="wp-block-paragraph">alla prima esecuzione bisogna configurare i dati di connessione:</p>



<pre class="wp-block-code"><code>rclone config</code></pre>



<p class="wp-block-paragraph">Questi gli step durante la configurazione (che poi viene scritta nel file <strong>~/.config/rclone/rclone.conf</strong>):</p>



<ul class="wp-block-list">
<li>Premi n per n) New remote.</li>



<li>Inserisci un nome, es eu2.</li>



<li>Inserisci 5 per Amazon S3 Compatibile oppure 4 per Ceph Object Storage.</li>



<li>Inserisci 1 per impostare le credenziali AWS o compatibili nel successivo step.</li>



<li>Inserisci access_key per access_key_id.</li>



<li>Inserisci secret_key, per secret_access_key.</li>



<li>Premi invio per saltare la regione</li>



<li>Inserisci l&#8217;endpoint url S3, es https://eu2.storage.ext.</li>



<li>Premi invio per saltare la location_constraint.</li>



<li>Premi invio per saltare le acl.</li>



<li>Premi invio per saltare server_side_encryption.</li>



<li>Premi invio per saltare  sse_kms_key_id.</li>



<li>Inserisci n per Modificare la configurazione avanzata.</li>



<li>Inserisci y per confermare.</li>



<li>Premi q per uscire dalla configurazione.</li>
</ul>



<p class="wp-block-paragraph">Dopo aver configurato la connessione, vediamo i principali comandi. Ipotizziamo che il nostro server si chiami <strong>eu2</strong>.</p>



<h5 class="wp-block-heading">elenco file nel bucket test su server eu2:</h5>



<pre class="wp-block-code"><code>rclone ls eu2:test/</code></pre>



<h5 class="wp-block-heading">elenco file, con dettagli, nel bucket test su server eu2:</h5>



<pre class="wp-block-code"><code>rclone lsl eu2:test/</code></pre>



<h5 class="wp-block-heading">copio ker.txt dal bucket test dal server eu2 sul disco locale:</h5>



<pre class="wp-block-code"><code>rclone copy eu2:test/ker.txt .</code></pre>



<h5 class="wp-block-heading">sync da /backup/ (source) verso server eu2 sul bucket cpanel(dest):</h5>



<pre class="wp-block-code"><code>rclone sync -P /backup/ eu2:cpanel/ --s3-no-head</code></pre>



<h5 class="wp-block-heading">creo la cartella pluto:</h5>



<pre class="wp-block-code"><code>rclone mkdir eu2:test/pluto</code></pre>



<h5 class="wp-block-heading">sposto pippo.txt nella cartella pluto:</h5>



<pre class="wp-block-code"><code>rclone move eu2:test/pippo.txt ue2:test/pluto/</code></pre>



<h5 class="wp-block-heading">cancello la cartella pluto ed il realtivo contenuto, tipo rm -fr:</h5>



<pre class="wp-block-code"><code>rclone purge eu2:test/pluto</code></pre>



<h5 class="wp-block-heading">cancello il file pippo.txt:</h5>



<pre class="wp-block-code"><code>rclone delete eu2:test/pluto/pippo.txt</code></pre>



<h5 class="wp-block-heading">montare la cartella remota pluto in locale:</h5>



<pre class="wp-block-preformatted">rclone mount eu2:pluto /mnt --vfs-cache-mode full --vfs-fast-fingerprint --no-modtime</pre>



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2026/04/07/rclone-un-valido-aiuto-per-storage-s3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Migrare un ambiente Python venv su una nuova macchina</title>
		<link>https://blog.smsoft.it/2026/02/24/migrare-un-ambiente-python-venv-su-una-nuova-macchina/</link>
					<comments>https://blog.smsoft.it/2026/02/24/migrare-un-ambiente-python-venv-su-una-nuova-macchina/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 24 Feb 2026 09:30:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[pip]]></category>
		<category><![CDATA[requirements.txt]]></category>
		<category><![CDATA[venv]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=6966</guid>

					<description><![CDATA[Python Venv è un modulo python che permette di attivare un ambiente python separato rispetto a quello di sistema. In questo modo possiamo installare una serie di librerie o fare delle configurazione ad-hoc che restano relative solo ad un progetto. Utile per fare dei test senza &#8220;sporcare&#8221; l&#8217;ambiente python di sistema oppure per gestire differenti ... <a title="Migrare un ambiente Python venv su una nuova macchina" class="read-more" href="https://blog.smsoft.it/2026/02/24/migrare-un-ambiente-python-venv-su-una-nuova-macchina/" aria-label="Per saperne di più su Migrare un ambiente Python venv su una nuova macchina">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python Venv è un modulo python che permette di attivare un ambiente python separato rispetto a quello di sistema. In questo modo possiamo installare una serie di librerie o fare delle configurazione ad-hoc che restano relative solo ad un progetto. Utile per fare dei test senza &#8220;sporcare&#8221; l&#8217;ambiente python di sistema oppure per gestire differenti progetti con differenti librerie. Ci sono anche altri sistemi similari, ma venv è sicuramente tra i più diffusi.</p>



<p class="wp-block-paragraph">Partiamo intanto vedendo come si crea un ambiente venv:</p>



<pre class="wp-block-code"><code>python3 -m venv ambiente_venv</code></pre>



<p class="wp-block-paragraph">questo crea nella cartella chiamata <strong>ambiente_venv</strong> il nostro ambiente di sviluppo. All&#8217;interno di questa cartella vengono create una serie di altre cartelle (es bin, lib) con quello che ci occorre. Una volta creato l&#8217;ambiente bisogna attivarlo e questo si fa scrivendo:</p>



<pre class="wp-block-code"><code>cd ambiente_venv
source bin/activate</code></pre>



<p class="wp-block-paragraph">mentre per uscire basterà digitare:</p>



<pre class="wp-block-code"><code>deactivate</code></pre>



<p class="wp-block-paragraph">Nota: Ovviamente possiamo anche eseguire gli script python direttamente scrivendo <strong>bin/python3</strong> in modo da avviare automaticamente l&#8217;ambiene per lo script richiamato.</p>



<p class="wp-block-paragraph">A questo punto ipotizziamo di aver installato una serie di librerie e che sia necessario replicare questo ambiene su una seconda macchina. Sulla prima macchina scriviamo:</p>



<pre class="wp-block-code"><code>pip freeze > requirements.txt</code></pre>



<p class="wp-block-paragraph">se abbiamo prima attivato l&#8217;ambiente, oppure direttamente:</p>



<pre class="wp-block-code"><code>bin/pip freeze > requirements.txt</code></pre>



<p class="wp-block-paragraph">e questo creerà il classico file <strong>requirements.txt</strong> con l&#8217;elenco delle librerie installate. Ora creiamo l&#8217;ambiene venv nella seconda macchina con:</p>



<pre class="wp-block-code"><code>python3 -m venv ambiente_venv</code></pre>



<p class="wp-block-paragraph">poi copiamo il file <strong>requirements.txt</strong>  dalla prima alla seconda macchina, attiviamo l&#8217;ambiente venv:</p>



<pre class="wp-block-code"><code>cd ambiente_venv
source bin/activate</code></pre>



<p class="wp-block-paragraph">ed infine reinstalliamo tutte le librerie necessarie:</p>



<pre class="wp-block-code"><code>pip install -r requirements.txt</code></pre>



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



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2026/02/24/migrare-un-ambiente-python-venv-su-una-nuova-macchina/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>scp: come copiare più file con wildcards</title>
		<link>https://blog.smsoft.it/2025/04/29/scp-come-copiare-piu-file-con-wildcards/</link>
					<comments>https://blog.smsoft.it/2025/04/29/scp-come-copiare-piu-file-con-wildcards/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 29 Apr 2025 08:30:00 +0000</pubDate>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[scp]]></category>
		<category><![CDATA[wildcards]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=6715</guid>

					<description><![CDATA[Con scp è possibile copiare file da/su un host remote tramite SSH. Mentre per copiare, ad esempio, tutti i file .txt da locale al server remoto basta: per fare la copia inversa, occorre inserire il carattere di escape \ prima del carattere *, ovvero: oppure, in alternativa, tutto il riferimento al server/path va racchiuso tra ... <a title="scp: come copiare più file con wildcards" class="read-more" href="https://blog.smsoft.it/2025/04/29/scp-come-copiare-piu-file-con-wildcards/" aria-label="Per saperne di più su scp: come copiare più file con wildcards">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Con scp è possibile copiare file da/su un host remote tramite SSH.</p>



<p class="wp-block-paragraph">Mentre per copiare, ad esempio, tutti i file <strong>.txt</strong> da locale al server remoto basta:</p>



<pre class="wp-block-code"><code>scp *.txt 10.10.10.10:~/</code></pre>



<p class="wp-block-paragraph">per fare la copia inversa, occorre inserire il carattere di escape <strong>\</strong> prima del carattere <strong>*</strong>, ovvero:</p>



<pre class="wp-block-code"><code>scp  10.10.10.10:~/\*.txt .</code></pre>



<p class="wp-block-paragraph">oppure, in alternativa, tutto il riferimento al server/path va racchiuso tra apici o virgolette, es:</p>



<pre class="wp-block-code"><code>scp  "10.10.10.10:~/*.txt" .</code></pre>



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



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



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2025/04/29/scp-come-copiare-piu-file-con-wildcards/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>lftp: come recuperare una sessione in background</title>
		<link>https://blog.smsoft.it/2025/04/22/lftp-come-recuperare-una-sessione-in-background/</link>
					<comments>https://blog.smsoft.it/2025/04/22/lftp-come-recuperare-una-sessione-in-background/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 22 Apr 2025 08:30:00 +0000</pubDate>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[attach]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[lftp]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=6704</guid>

					<description><![CDATA[Se utilizzate lftp, sapete sicuramente che tra le tante caratteristiche c&#8217;è anche quella di poter avviare il download o l&#8217;upload di un intero sito con il comando mirror. Ad esempio, dopo aver fatto il login ed essersi posizionati nel giusto percorso, per copiare in locale tutto il contenuto remoto: o viceversa per copiare in remoto ... <a title="lftp: come recuperare una sessione in background" class="read-more" href="https://blog.smsoft.it/2025/04/22/lftp-come-recuperare-una-sessione-in-background/" aria-label="Per saperne di più su lftp: come recuperare una sessione in background">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Se utilizzate lftp, sapete sicuramente che tra le tante caratteristiche c&#8217;è anche quella di poter avviare il download o l&#8217;upload di un intero sito con il comando mirror.</p>



<p class="wp-block-paragraph">Ad esempio, dopo aver fatto il login ed essersi posizionati nel giusto percorso, per copiare in locale tutto il contenuto remoto:</p>



<pre class="wp-block-code"><code>mirror .</code></pre>



<p class="wp-block-paragraph">o viceversa per copiare in remoto tutto il contenuto locale:</p>



<pre class="wp-block-code"><code>mirror . -R</code></pre>



<p class="wp-block-paragraph">Il comando mirror ha molti parametri, ad esempio per proseguire in caso di errore e lanciare 10 processi paralleli di copia:</p>



<pre class="wp-block-code"><code>mirror . -c --parallel=10</code></pre>



<p class="wp-block-paragraph">La procedura di copia può richiedere molto tempo, in questo caso possiamo uscire da lftp e lasciare a lui completare la procedura. </p>



<p class="wp-block-paragraph">Un&#8217;altra cosa comoda che può richiedere molto tempo è la cancellazione di contenuti, che può essere fatta con il comando <strong>mrm</strong>; ad esempio per cancellare la cartella chiamata <strong>AA</strong> e tutto il suo contenuto</p>



<pre class="wp-block-code"><code>mrm -r AA</code></pre>



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



<p class="wp-block-paragraph">Mentre i dati vengono copiati, premiamo su <strong>CTRL+Z</strong> e vedremo indicato qualcosa tipo:</p>



<pre class="wp-block-code"><code>&#91;0] mirror . -R &amp; -- 53M/53M (99%)</code></pre>



<p class="wp-block-paragraph">Scriviamo poi exit nel terminale e torneremo in console con la scritta:</p>



<pre class="wp-block-code"><code>&#91;1692112] Moving to background to complete transfers…</code></pre>



<p class="wp-block-paragraph">il numero scritto tra parentesi quadre <strong>1692112</strong> è il PID del processo lasciato in esecuzione. Eventualmente non ne prendiamo nota si può ricavare con:</p>



<pre class="wp-block-code"><code>pgrep lftp</code></pre>



<p class="wp-block-paragraph">Prima che la procedura sia completata, possiamo ricollegarci al pid indicato per vedere cosa accade.</p>



<p class="wp-block-paragraph">Lanciamo lftp:</p>



<pre class="wp-block-code"><code>lftp</code></pre>



<p class="wp-block-paragraph">poi scriviamo:</p>



<pre class="wp-block-code"><code>attach 1692112</code></pre>



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



<pre class="wp-block-code"><code>jobs</code></pre>



<p class="wp-block-paragraph">per vedere i processi appesi. Potrebbe essere mostrato qualcosa del genere:</p>



<pre class="wp-block-code"><code>&#91;0] mirror . -R -- 201M/201M (100%)<br>\mirror <code>wp-content' -- 142M/142M (100%) \mirror</code>wp-content/plugins' -- 114M/114M (100%)</code></pre>



<p class="wp-block-paragraph">per fermare il processo:</p>



<pre class="wp-block-code"><code>kill 0</code></pre>



<p class="wp-block-paragraph">perché nell&#8217;elempio precedente il processo ha il numero <strong>0</strong>.</p>



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



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2025/04/22/lftp-come-recuperare-una-sessione-in-background/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Docker: Trasferire un container su un nuovo host</title>
		<link>https://blog.smsoft.it/2025/04/15/docker-trasferire-un-container-su-un-nuovo-host/</link>
					<comments>https://blog.smsoft.it/2025/04/15/docker-trasferire-un-container-su-un-nuovo-host/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 15 Apr 2025 08:30:00 +0000</pubDate>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[docker]]></category>
		<guid isPermaLink="false">https://blog.smsoft.it/?p=6700</guid>

					<description><![CDATA[Immaginiamo di avere una macchina con docker installato ma che non abbiamo più accesso ad internet per poter scaricare nuovi container. La soluzione più semplice è quella di scaricare il container su un server che raggiunge internet, farne un archivio e poi importarlo. Ipotizziamo di voler trasferire portainer. Innanzitutto scarichiamo il container se ancora non ... <a title="Docker: Trasferire un container su un nuovo host" class="read-more" href="https://blog.smsoft.it/2025/04/15/docker-trasferire-un-container-su-un-nuovo-host/" aria-label="Per saperne di più su Docker: Trasferire un container su un nuovo host">Leggi tutto</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Immaginiamo di avere una macchina con docker installato ma che non abbiamo più accesso ad internet per poter scaricare nuovi container. La soluzione più semplice è quella di scaricare il container su un server che raggiunge internet, farne un archivio e poi importarlo.</p>



<p class="wp-block-paragraph">Ipotizziamo di voler trasferire portainer.</p>



<p class="wp-block-paragraph">Innanzitutto scarichiamo il container se ancora non lo abbiamo fatto:</p>



<pre class="wp-block-code"><code>docker pull portainer/portainer-ce:lts</code></pre>



<p class="wp-block-paragraph">ora lo archiviamo:</p>



<pre class="wp-block-code"><code>docker save -o portainer.tgz portainer/portainer-ce:lts</code></pre>



<p class="wp-block-paragraph">Lo copiamo sull&#8217;altro host e lo importiamo con:</p>



<pre class="wp-block-code"><code>docker load -i portainer.tgz</code></pre>



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



<p class="wp-block-paragraph">Nota: qualora sul server di appoggio non serva mantenere l&#8217;immagine di portainer, la possiamo rimuovere con:</p>



<pre class="wp-block-preformatted">docker rmi portainer/portainer-ce:lts</pre>



<p class="wp-block-paragraph">enjoy!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.smsoft.it/2025/04/15/docker-trasferire-un-container-su-un-nuovo-host/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
