<?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/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>bubidevs</title>
	<atom:link href="https://www.bubidevs.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bubidevs.net</link>
	<description>by AndreaBusi.it</description>
	<lastBuildDate>Thu, 11 May 2023 07:50:05 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2.9</generator>

<image>
	<url>https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/01/mobile-icon-54c154ccv1_site_icon.png?fit=32%2C32&#038;ssl=1</url>
	<title>bubidevs</title>
	<link>https://www.bubidevs.net</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">7272196</site>	<item>
		<title>Come salvare un&#8217;immagine in Swift preservando i dati EXIF</title>
		<link>https://www.bubidevs.net/2023/05/11/come-salvare-unimmagine-in-swift-preservando-i-dati-exif/</link>
					<comments>https://www.bubidevs.net/2023/05/11/come-salvare-unimmagine-in-swift-preservando-i-dati-exif/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Thu, 11 May 2023 09:00:00 +0000</pubDate>
				<category><![CDATA[iOS Dev]]></category>
		<category><![CDATA[coreimage]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[swift]]></category>
		<guid isPermaLink="false">https://www.bubidevs.net/?p=10921</guid>

					<description><![CDATA[<p>In Swift, salvare un'immagine preservando i dati EXIF non è un'operazione immediata. Vediamo come utilizzare CIContext per mantenere i metadati.</p>
<p>The post <a href="https://www.bubidevs.net/2023/05/11/come-salvare-unimmagine-in-swift-preservando-i-dati-exif/">Come salvare un’immagine in Swift preservando i dati EXIF</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Recentemente ho dovuto &#8220;lottare&#8221; con i dati <a href="https://it.wikipedia.org/wiki/Exchangeable_image_file_format">EXIF</a> salvati nelle foto di iOS.</p>



<p>Personalmente era la prima volta che avevo la necessità di fare in modo che le immagini conservassero questi dati anche quando caricate tramite delle API. Pensavo che iOS fornisse dei metodi standard per queste operazioni, invece la questione si è rivelata più particolare del previsto.</p>



<p>In questo articolo troverete l&#8217;implementazione iniziale che utilizzavo, e le nuove modifiche che ho apportato per riuscire a risolvere il problema.</p>



<h2 class="wp-block-heading">Situazione attuale</h2>



<p>Gestisco da diverso tempo (probabilmente dal 2010) il progetto in questione. Una delle varie funzionalità è la possibilità dell&#8217;utente di allegare delle foto, che vengono caricate su un backend tramite un servizio apposito. Di recente, tuttavia, è emersa la necessità che le immagini caricate mantengano i dati EXIF associati, in particolare quelli relativi alla geolocalizzazione.</p>



<p>Facendo alcune prove, ci siamo accorti che le immagini caricate dall&#8217;app iOS erano prive di tali dati, quindi mi sono messo ad indagare la cusa del problema.</p>



<p>L&#8217;implementazione esistente è composta principalmente da tre fasi:</p>



<ol>
<li>selezione delle immagini, utilizzando il picker nativo <code>UIImagePickerController</code></li>



<li>salvataggio in locale (nella directory <code>Cache</code>) delle immagini selezionate, operazione propedeutica allo step 3</li>



<li>upload delle immagini tramite <code>URLSession.uploadTask</code></li>
</ol>



<p>Dopo alcune verifiche, era chiaro che il problema fosse al punto 2: le immagini salvate temporaneamente in locale erano già prive dei dati EXIF.</p>



<h2 class="wp-block-heading">The old way: <code>jpegData(compressionQuality:)</code></h2>



<p>Il codice esistente salvava le immagini ricavate dal rullino utilizzando il metodo <code>jpegData(compressionQuality:)</code> che <code>UIImage</code> mette a disposizione. Partendo dal PHAsset, veniva estratta l&#8217;immagine e poi salvata in locale, in modo da avere un file da trasformare poi in un oggetto di tipo <code>Data</code>.</p>



<p>Questo è un esempio (minimale) di come venivano salvate le immagini:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">private func savePhotoWithoutExif(
    info: [UIImagePickerController.InfoKey : Any],
    localUrl: URL
) throws {
    guard let image = info[.originalImage] as? UIImage else {
        throw PhotoError.missingImageData
    }
        
    guard let data = image.jpegData(compressionQuality: 1.0) else {
        throw PhotoError.invalidImage
    }
        
    do {
        try data.write(to: localUrl)
    } catch {
        throw PhotoError.saveFailed
    }
}</code></pre>



<p>Se andiamo ad analizzare l&#8217;immagine che salva questo metodo, ci accorgeremo che i dati EXIF non sono più presenti (in particolare le coordinate GPS):</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="500" height="382" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_001.png?resize=500%2C382&#038;ssl=1" alt="" class="wp-image-10922" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_001.png?resize=500%2C382&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_001.png?resize=300%2C229&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_001.png?resize=768%2C587&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_001.png?w=1500&amp;ssl=1 1500w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>Per analizzare le immagini, ho utilizzato il Simulatore di iOS e stampato in console il percorso completo del file generato. In questo modo ho potuto navigarci tramite il Finder ed aprire il file con Anteprima, che permette di visualizzare tutti gli EXIF contenuti nel file.</p>



<h2 class="wp-block-heading">The new way: <code>CIContext().writeJPEGRepresentation</code></h2>



<p>Mi sono messo alla ricerca di una soluzione che permettesse di salvare una copia dell&#8217;immagine in locale, senza però perdere i dati EXIF. Dopo qualche ricerca e un po&#8217; di studio della documentazione, ho trovato una soluzione che si basa sull&#8217;utilizzo di <code>CIContext</code>. In sostanza, si tratta di renderizzare ed esportare l&#8217;immagine in formato jpeg, utilizzando il metodo <code>writeJPEGRepresentation(of:to:colorSpace:)</code> presente in <code>CIContext</code>. In questo modo, i dati EXIF vengono mantenuti.</p>



<p>Il codice è leggermente più complesso rispetto al precedente, qui ve lo propongo ripulito di altri controlli che ho aggiunto nella mia implementazione:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">// create request to get all asset metadata
let options = PHContentEditingInputRequestOptions()
// download from iCloud if necessary
options.isNetworkAccessAllowed = true
asset.requestContentEditingInput(with: options) { (contentEditingInput: PHContentEditingInput?, _) -&gt; Void in
    guard let contentEditingInput else {
        print("[ERROR] Unable to get PHContentEditingInput")
        return
    }
    guard 
        let imageUrl = contentEditingInput.fullSizeImageURL,
	let fullImage = CIImage(contentsOf: imageUrl, options: [ .applyOrientationProperty: true ]),
	let colorSpace = fullImage.colorSpace else {
	   print("[ERROR] Unable to create required parameters")
           return
	}
             
    do {
        try CIContext().writeJPEGRepresentation(of: fullImage,
                                                to: localUrl,
                                                colorSpace: colorSpace)
    } catch {
        print("[ERROR] Unable to write image (\(error.localizedDescription))")
    }
}</code></pre>



<p>Si tratta, in sostanza, di ricavare tutti i metadati associati al PHAsset che stiamo gestendo, per poi renderizzare l&#8217;immagine tramite il metodo <code>writeJPEGRepresentation</code>.</p>



<p>Se andiamo a comparare i dati EXIF della foto originale e di quella salvata, vedremo in questo caso che sono identici, non abbiamo perso nessuna informazione:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="382" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_002.png?resize=500%2C382&#038;ssl=1" alt="" class="wp-image-10923" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_002.png?resize=500%2C382&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_002.png?resize=300%2C229&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_002.png?resize=768%2C587&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/comparazione_exif_002.png?w=1500&amp;ssl=1 1500w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<h2 class="wp-block-heading">Conclusioni e progetto</h2>



<p>La soluzione che vi ho presentato è molto ridotta rispetto a quella reale che ho implementato. Non sono supportati, ad esempio, i vari formati che potete trovare in un PHAsset (ad esempio le live photos). L&#8217;obbiettivo era focalizzarmi sul solo punto che effettivamente vi permette di salvare delle immagini conservando i metadati EXIF.</p>



<p>Ho creato un <a href="https://github.com/andreabusi/bubidevs-save-exif-data">repository su GitHub</a> con un semplice progetto d&#8217;esempio, con cui potete verificare le due diverse implementazioni. Per qualsiasi domanda, scrivetemi nei commenti o su <a href="https://mastodon.social/@andreabusi">Mastodon</a>. </p>



<p>Per i più curiosi, questa è l&#8217;immagine che ho utilizzato per le prove di questo articolo, scattata a Tokyo il 26/01/2020 (sigh).</p>



<figure class="wp-block-image alignwide size-full"><img decoding="async" loading="lazy" width="960" height="720" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/tokyo_original_photo-scaled.jpg?resize=960%2C720&#038;ssl=1" alt="" class="wp-image-10926" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/tokyo_original_photo-scaled.jpg?w=2560&amp;ssl=1 2560w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/tokyo_original_photo-scaled.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/tokyo_original_photo-scaled.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/tokyo_original_photo-scaled.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/tokyo_original_photo-scaled.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/tokyo_original_photo-scaled.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/05/tokyo_original_photo-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure>



<p>Ciao!</p><p>The post <a href="https://www.bubidevs.net/2023/05/11/come-salvare-unimmagine-in-swift-preservando-i-dati-exif/">Come salvare un’immagine in Swift preservando i dati EXIF</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2023/05/11/come-salvare-unimmagine-in-swift-preservando-i-dati-exif/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10921</post-id>	</item>
		<item>
		<title>Il mio setup 2023 &#8211; Terminale con iTerm2 e Oh My Zsh</title>
		<link>https://www.bubidevs.net/2023/03/03/il-mio-setup-2023-terminale-con-iterm2-e-oh-my-zsh/</link>
					<comments>https://www.bubidevs.net/2023/03/03/il-mio-setup-2023-terminale-con-iterm2-e-oh-my-zsh/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Fri, 03 Mar 2023 14:44:45 +0000</pubDate>
				<category><![CDATA[OS X]]></category>
		<category><![CDATA[Setup]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[iterm]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[setup]]></category>
		<category><![CDATA[terminale]]></category>
		<guid isPermaLink="false">https://www.bubidevs.net/?p=10875</guid>

					<description><![CDATA[<p>Per la mia produttività utilizzo iTerm2 e Oh My Zsh, per avere un terminale bello e personalizzato in base alle mie esigenze. Nell'articolo vi spiego come ottenere la mia stessa configurazione.</p>
<p>The post <a href="https://www.bubidevs.net/2023/03/03/il-mio-setup-2023-terminale-con-iterm2-e-oh-my-zsh/">Il mio setup 2023 – Terminale con iTerm2 e Oh My Zsh</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Nel <a href="https://www.bubidevs.net/2023/01/26/il-mio-setup-2023-macos-e-app/">precedente articolo</a> di questa mini-serie dedicata al setup del mio Mac, vi ho mostrato le app e le configurazioni che utilizzo quotidianamente in macOS.</p>



<p>C&#8217;era però un grande assente: il terminale. Come ogni sviluppatore che si rispetti, il terminale è un fedele compagno di lavoro, che personalmente mi trovo ad utilizzare per parecchio tempo durante la giornata. Questa è, attualmente, la configurazione del mio terminale:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="665" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_001.png?resize=960%2C665&#038;ssl=1" alt="" class="wp-image-10876" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_001.png?w=2036&amp;ssl=1 2036w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_001.png?resize=300%2C208&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_001.png?resize=500%2C346&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_001.png?resize=768%2C532&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_001.png?resize=1536%2C1064&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_001.png?w=1920&amp;ssl=1 1920w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure></div>


<p>In questo articolo vi parlerò di cosa utilizzo, come l&#8217;ho personalizzato e come l&#8217;ho reso aderente alle mie necessità.</p>



<h2 class="wp-block-heading">Situazione iniziale</h2>



<p>Di default, macOS mette a disposizione un classico terminale, che funziona egregiamente ma è abbastanza spoglio:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="346" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_002.png?resize=500%2C346&#038;ssl=1" alt="" class="wp-image-10899" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_002.png?resize=500%2C346&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_002.png?resize=300%2C208&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/mac_setup_terminal_002.png?w=697&amp;ssl=1 697w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>Da qualche anno <code>zsh</code> è la shell predefinita, e questa è una buona notizia. Come vedremo, infatti, c&#8217;è un ottimo framework che permette di estendere le funzionalità e personalizzare molti aspetti della shell.</p>



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



<p>Come prima cosa, ho sostituito il <code>Terminale</code> con <a href="https://iterm2.com/"><code>iTerm2</code></a>. Si tratta di un sostituto per il terminale di macOS, che offre molte funzionalità in più e una serie quasi infinita di possibili personalizzazioni.</p>



<p>In particolare, ci sono due funzionalità di cui non posso più fare a meno: lo split verticale (e orizzontale) di più sessioni e la ricerca testuale all&#8217;interno di una sessione.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="629" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_002.png?resize=960%2C629&#038;ssl=1" alt="" class="wp-image-10896" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_002.png?w=1215&amp;ssl=1 1215w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_002.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_002.png?resize=500%2C328&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_002.png?resize=768%2C503&amp;ssl=1 768w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure></div>


<p>iTerm2 è gratuito e si scarica direttamente dal <a href="https://iterm2.com/index.html">sito degli sviluppatori</a>. Da qui possiamo iniziare a rendere il terminale sempre migliore.</p>



<h2 class="wp-block-heading">Oh-my-zsh</h2>



<p>Dopo aver scaricato ed installato iTerm2, il passo successivo è installare <code>Oh My Zsh</code>. Questa è la descrizione che viene data dagli sviluppatori:</p>



<blockquote class="wp-block-quote">
<p>Oh My Zsh è un delizioso framework open source guidato dalla community per la gestione della configurazione di Zsh.</p>
</blockquote>



<figure class="wp-block-image alignwide size-full"><img decoding="async" loading="lazy" width="960" height="601" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/ohmyzsh_001-1.png?resize=960%2C601&#038;ssl=1" alt="" class="wp-image-10888" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/ohmyzsh_001-1.png?w=1889&amp;ssl=1 1889w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/ohmyzsh_001-1.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/ohmyzsh_001-1.png?resize=500%2C313&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/ohmyzsh_001-1.png?resize=768%2C481&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/ohmyzsh_001-1.png?resize=1536%2C962&amp;ssl=1 1536w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure>



<p>In sostanza, <code>Oh My Zsh</code> mette a disposizione una serie di temi e plugin sviluppati dalla community, in modo da potervi creare un ambiente cucito sulle vostre esigenze.</p>



<p>L&#8217;installazione è molto semplice, si deve eseguire un comando che potete trovare direttamente sulla <a href="https://ohmyz.sh/#install">home del progetto</a>.</p>



<p>Oh My Zsh non è un&#8217;esclusiva di macOS o di iTerm2: potete installarlo in qualsiasi sistema operativo, a patto di utilizzare una shell <code>zsh</code> (e perchè non dovreste?).</p>



<h2 class="wp-block-heading">Tema, plugin e configurazioni</h2>



<p>Abbiamo quindi installato iTerm2 e Oh My Zsh, siamo pronti per creare l&#8217;assetto più indicato alle nostre necessità. Vi mostro quali sono le personalizzazioni e le configurazioi che ho impostato nel mio ambiente, di cui sono abbastanza soddisfatto.</p>



<h3 class="wp-block-heading">Tema</h3>



<p>Partiamo dal tema. Dopo averne valutati diversi, ho ristretto il cerchio a tre candidati:</p>



<ul>
<li><a href="https://github.com/sindresorhus/pure">Pure</a><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44d.png" alt="👍" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;Minimal e di bel design<br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44e.png" alt="👎" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;Poche possibilità di configurazioni</li>



<li><a href="https://github.com/romkatv/powerlevel10k#for-powerlevel9k-users">Powerlevel10k</a><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44d.png" alt="👍" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;Molte possibilità di personalizzazioni<br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44e.png" alt="👎" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Aspetto un po&#8217; troppo &#8220;pieno&#8221;, ho riscontrato anche qualche problema con alcune funzionalità (es. la visualizzazione della versione di Ruby)</li>



<li><a href="https://spaceship-prompt.sh/">Spaceship</a><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44d.png" alt="👍" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;Design minimale<br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44d.png" alt="👍" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;Ampia possibilità di configurazioni</li>
</ul>



<p>And the winner is… Spaceship!</p>



<script id="asciicast-513451" src="https://asciinema.org/a/513451.js" data-autoplay="true" data-loop="true" data-preload="true" async=""></script>
  <noscript>
    <object class="asciicast" type="image/svg+xml" data="/assets/images/spaceship-demo.svg">
      <img decoding="async" src="/assets/images/spaceship-demo.gif" alt="Spaceship demo">
    </object>
  </noscript>



<p>L&#8217;installazione non è complessa, ma assicuratevi di seguire tutti i passi della <a href="https://spaceship-prompt.sh/getting-started/">documentazione</a>, per fare in modo che tutto funzioni correttamente.</p>



<h3 class="wp-block-heading">Miglioramenti al tema</h3>



<p>Per ottenere il mio stesso design, ci sono alcune modifiche da fare:</p>



<ul>
<li>installare il font Fura Mono Regular, che vi permette di avere anche le icone usate, ad esempio, per i rami di Git (<a href="https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/FiraMono">repository GitHub</a>)</li>



<li>installare il preset colori Snazzy per iTerm2 (<a href="https://github.com/sindresorhus/iterm2-snazzy">repository GitHub</a>)</li>



<li>impostare in iTerm:
<ul>
<li>tema finestra minimale (<code>Appearance -&gt; General -&gt; Theme -&gt; Minimal</code>)</li>



<li>cursore come lampeggiante (<code>Profiles → Text → Cursor: Box e Blinking</code>)</li>
</ul>
</li>
</ul>



<p>Ed ecco il risultato finale:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="897" height="705" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_002.png?resize=897%2C705&#038;ssl=1" alt="" class="wp-image-10880" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_002.png?w=897&amp;ssl=1 897w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_002.png?resize=300%2C236&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_002.png?resize=500%2C393&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_002.png?resize=768%2C604&amp;ssl=1 768w" sizes="(max-width: 897px) 100vw, 897px" data-recalc-dims="1" /></figure></div>


<h3 class="wp-block-heading">Configurazione del prompt</h3>



<p>Il tema Spaceship offre molte possibilità di personalizzazione. Per farlo, è sufficiente agire sul file di configurazione posto in <code>.config/spaceship.conf</code>. Questa è la mia configurazione:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash"># Prompt configuration
SPACESHIP_PROMPT_ORDER=(
  time
  user
  host
  dir
  git
  venv
  line_sep
  char
)

# Char
SPACESHIP_CHAR_SYMBOL="&gt;" # replace default ➜ character
SPACESHIP_CHAR_SUFFIX=" " # add a space after the char symbol

# Dir
SPACESHIP_DIR_PREFIX='' # disable directory prefix, cause it's not the first section
SPACESHIP_DIR_TRUNC='1' # show only last directory</code></pre>



<p><code>SPACESHIP_PROMPT_ORDER</code> definisce gli elementi che vengono visualizzati nel prompt:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="689" height="268" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_001.png?resize=689%2C268&#038;ssl=1" alt="" class="wp-image-10881" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_001.png?w=689&amp;ssl=1 689w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_001.png?resize=300%2C117&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/03/iterm2_config_001.png?resize=500%2C194&amp;ssl=1 500w" sizes="(max-width: 689px) 100vw, 689px" data-recalc-dims="1" /></figure></div>


<p>Con <code>SPACESHIP_CHAR_SYMBOL</code> ho modificato il simbolo che viene mostrato, con il simbolo &#8220;maggiore&#8221; che non mi dispiace.</p>



<p><code>SPACESHIP_DIR_PREFIX</code> permettono, infine, di decidere quante e quali parte del path mostrare. Personalmente mi piace vedere solo la folder in cui sono, non ho la necessità di vedere il path completo.</p>



<h3 class="wp-block-heading">Plugin Oh My Zsh</h3>



<p>All&#8217;interno del file <code>.zshrc</code> è possibile specificare quali plugin di <code>Oh My Zsh</code> vogliamo abilitare.</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">plugins=(
   wd
   xcode
   vscode
)</code></pre>



<ul>
<li><a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/xcode"><code>xcode</code></a>: fornisce alcune utility molto comode per lavorare con Xcode e lo sviluppo iOS in generale</li>



<li><a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/vscode"><code>vscode</code></a>: fornisce alcuni alias molto utili per lavorare con VSCode (ad esempio per aprire la folder corrente o uno specifico file direttamente nell&#8217;editor)</li>



<li><a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/wd"><code>wd</code></a>: è il mio plugin preferito. Consente di creare dello scorciatoie e poi navigarci velocemente. Ad esempio, se ci capita di andare spesso nella folder <code>~/Work/repos/customer_a/project_01</code>, possiamo definire una scorciatoia <code>project_01</code> e richiamarla velocemente con <code>wd project_01</code>, navigando così direttamente dentro la relativa folder. Personalmente non ne posso più fare a meno.</li>
</ul>



<h3 class="wp-block-heading">Alias zshrc</h3>



<p>Ho definito alcuni alias sempre nel file <code>.zshrc</code>, in questo caso il commento penso sia chiaro per tutti i comandi:</p>



<pre class="wp-block-code"><code class=""># open Sublime Merge for current directory
alias sm="smerge ." 
# needed because HEAD^ doesn't work with zsh
alias grh="git reset HEAD~1" 
# shortcut for forced git push
alias gpf="git push -f"
# be sure to always use Bat instead of standard cat
alias cat=bat</code></pre>



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



<p>Sono molto soddisfatto del setup che sono riuscito a creare per il terminale, mi ci trovo molto bene.</p>



<p>Ci sono alcune aggiunte che sto provando e che sto ancora valutando. Una di queste, ad esempio, è <a href="https://github.com/sharkdp/bat#configuration-file">bat</a>, una versione evoluta del classico <code>cat</code>, che offre funzionalità quali i numeri di riga o la formattazione della sintassi.</p>



<p>Spero di avervi dato qualche spunto, se c&#8217;è qualcosa che volete consigliarmi, scrivetemelo nei commenti o parliamone su <a href="https://mastodon.social/@andreabusi">Mastodon</a>!</p><p>The post <a href="https://www.bubidevs.net/2023/03/03/il-mio-setup-2023-terminale-con-iterm2-e-oh-my-zsh/">Il mio setup 2023 – Terminale con iTerm2 e Oh My Zsh</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2023/03/03/il-mio-setup-2023-terminale-con-iterm2-e-oh-my-zsh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10875</post-id>	</item>
		<item>
		<title>Il mio setup 2023 &#8211; macOS e app</title>
		<link>https://www.bubidevs.net/2023/01/26/il-mio-setup-2023-macos-e-app/</link>
					<comments>https://www.bubidevs.net/2023/01/26/il-mio-setup-2023-macos-e-app/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Thu, 26 Jan 2023 17:32:08 +0000</pubDate>
				<category><![CDATA[OS X]]></category>
		<category><![CDATA[Setup]]></category>
		<category><![CDATA[applicazioni]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[setup]]></category>
		<guid isPermaLink="false">https://www.bubidevs.net/?p=10838</guid>

					<description><![CDATA[<p>Ho raccolto le applicazioni che utilizzo ogni giorni per sviluppare e lavorare, ma anche le impostazioni di macOS che sono abituato ad avere su qualsiasi nuovo Mac.</p>
<p>The post <a href="https://www.bubidevs.net/2023/01/26/il-mio-setup-2023-macos-e-app/">Il mio setup 2023 – macOS e app</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Recentemente ho dato una bella ripulita al mio Mac, che iniziava ad essere pieno di applicazioni e tool che non utilizzavo. Ho scelto l&#8217;opzione più drastica: inizializzazione completa e reinstallazione di tutto quello che mi serviva.</p>



<p>Non è stata un&#8217;operazione particolarmente lunga, in una giornata di lavoro sono tornato ad avere tutto configurato. Avendo la maggior parte dei miei dati in cloud, questo tipo di operazioni si è semplificato di molto.</p>



<p>In questo articolo ho raccolto sia le configurazioni che ho fatto a macOS, sia le app che ho installato e che utilizzo (quasi) giornalmente. Dedicherò un altro articolo, invece, alla configurazione del terminale.</p>



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



<p>Ci sono un serie di impostazioni che sono abituato ad avere in macOS e, nel caso di ripristino o di nuovo Mac, vado subito ad impostare. Eccovene alcune, suddivise in base alle nuove categorie introdotte in Ventura</p>



<h4 class="wp-block-heading"><strong>Effetto genio</strong></h4>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="239" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_dock_01.jpeg?resize=960%2C239&#038;ssl=1" alt="" class="wp-image-10840" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_dock_01.jpeg?w=1756&amp;ssl=1 1756w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_dock_01.jpeg?resize=300%2C75&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_dock_01.jpeg?resize=500%2C125&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_dock_01.jpeg?resize=768%2C192&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_dock_01.jpeg?resize=1536%2C383&amp;ssl=1 1536w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /><figcaption class="wp-element-caption"><code>Scrivania e Dock > Contrai le finestre utilizzando: Effetto genio</code></figcaption></figure></div>


<p>Abilita l&#8217;effetto ingrandimento quando si passa con il cursore sopra le icone nel dock.</p>



<h4 class="wp-block-heading"><strong>Tap sul trackpad</strong></h4>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="186" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_trackpad_01.png?resize=500%2C186&#038;ssl=1" alt="" class="wp-image-10846" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_trackpad_01.png?resize=500%2C186&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_trackpad_01.png?resize=300%2C112&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_trackpad_01.png?w=519&amp;ssl=1 519w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /><figcaption class="wp-element-caption"><code>Trackpad > Tocca per fare click: Attivo</code></figcaption></figure></div>


<p>Il singolo tap sul trackpad del MacBook, viene considerato come il click del mouse. Personalmente lo preferisco rispetto al &#8220;clic&#8221; standard che deve essere eseguito sul trackpad.</p>



<h4 class="wp-block-heading"><strong>Non riorganizzare gli spazi</strong></h4>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="187" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_spaces_01.jpeg?resize=960%2C187&#038;ssl=1" alt="" class="wp-image-10849" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_spaces_01.jpeg?w=1014&amp;ssl=1 1014w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_spaces_01.jpeg?resize=300%2C59&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_spaces_01.jpeg?resize=500%2C98&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_spaces_01.jpeg?resize=768%2C150&amp;ssl=1 768w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /><figcaption class="wp-element-caption"><code>Scrivania e Dock > Mission Control > Riorganizza automaticamente gli spazi sulla base dell'utilizzo più recente: Disattivo</code></figcaption></figure></div>


<p>Di default, macOS riorganizza gli spazi in base all&#8217;ultimo utilizzo. Questa cosa mi manda in confusione, preferisco che siano fissi in modo da poter organizzarli in base alle app e al mio flusso di lavoro.</p>



<h4 class="wp-block-heading"><strong>Touch Bar</strong></h4>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="29" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_touchbar_01.png?resize=960%2C29&#038;ssl=1" alt="" class="wp-image-10850" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_touchbar_01.png?w=2008&amp;ssl=1 2008w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_touchbar_01.png?resize=300%2C9&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_touchbar_01.png?resize=500%2C15&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_touchbar_01.png?resize=768%2C23&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_touchbar_01.png?resize=1536%2C46&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macos_touchbar_01.png?w=1920&amp;ssl=1 1920w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /><figcaption class="wp-element-caption"><code>Tastiera > Impostazioni Touch Bar... > Touch Bar mostra: Control Strip espansa</code></figcaption></figure></div>


<p>Non sono l&#8217;unico a pensare che la Touch Bar sia inutile. Non utilizzo mai le azioni che mi propone, quindi ho attivato questa opzione per fare in modo che mostri sempre i controlli che utilizzo di più, come la gestione della luminosità e del volume.</p>



<h4 class="wp-block-heading">Dock</h4>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="403" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/dock_001.png?resize=500%2C403&#038;ssl=1" alt="" class="wp-image-10851" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/dock_001.png?resize=500%2C403&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/dock_001.png?resize=300%2C242&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/dock_001.png?resize=768%2C619&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/dock_001.png?w=915&amp;ssl=1 915w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /><figcaption class="wp-element-caption"><code>Scrivania e Dock > Mostra le applicazioni recenti nel Dock: Disattivo</code></figcaption></figure></div>


<p>Sul dock non mi interessa avere le applicazioni recenti che ho aperto: se le utilizzo spesso, hanno già un posto sul dock, altrimenti le richiamo quando mi servono. Less is more.</p>



<p>Sempre sul dock, ho da sempre avuto l&#8217;abitudine di avere queste tre folder: <code>Applicazioni</code>, <code>Documenti</code> e <code>Download</code>. Tutte, inoltre, sono configurate per essere mostrate come cartelle e la visualizzazione è Griglia.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="360" height="585" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/dock_002.png?resize=360%2C585&#038;ssl=1" alt="" class="wp-image-10852" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/dock_002.png?w=360&amp;ssl=1 360w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/dock_002.png?resize=185%2C300&amp;ssl=1 185w" sizes="(max-width: 360px) 100vw, 360px" data-recalc-dims="1" /></figure></div>


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



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



<p>Vi propongo di seguito l&#8217;elenco delle app che ho attualmente installato sul mio Mac. Ho escluso quelle presenti di default nel sistema operativo e alcune di cui probabilmente non vi interessa nulla (vero orribile client di <code>NowTV</code>?)</p>



<h4 class="wp-block-heading">Utility</h4>



<p>• <a href="https://v2.airbuddy.app/">AirBuddy</a>: utility per gestire al meglio le AirPods connesse al Mac. Tra le varie cose, permette di avere un popup come quello che appare su iOS quando si apre il case delle AirPods in prossimità del Mac.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="444" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/airbuddy_001.png?resize=500%2C444&#038;ssl=1" alt="" class="wp-image-10856" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/airbuddy_001.png?resize=500%2C444&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/airbuddy_001.png?resize=300%2C267&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/airbuddy_001.png?resize=768%2C683&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/airbuddy_001.png?w=846&amp;ssl=1 846w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>• <a href="https://www.alfredapp.com/">Alfred</a>: sostituto di Spotlight, con i superpower. Ho diversi Workflow che utilizzo giornalmente e mi semplificano alcune attività.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" loading="lazy" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/alfred_001.png?resize=713%2C471&#038;ssl=1" alt="" class="wp-image-10857" width="713" height="471" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/alfred_001.png?w=1426&amp;ssl=1 1426w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/alfred_001.png?resize=300%2C198&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/alfred_001.png?resize=500%2C330&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/alfred_001.png?resize=768%2C507&amp;ssl=1 768w" sizes="(max-width: 713px) 100vw, 713px" data-recalc-dims="1" /></figure></div>


<p>• <a href="https://www.macbartender.com/">Bartender 4</a>: permette di gestire al meglio la menu bar, decidendo, tra le altre cose, quali elementi visualizzare e quali nascondere.</p>



<p>• <a href="https://macpaw.com/cleanmymac">CleanMyMac X</a>: app per fare pulizia nel Mac, cancellando file non più necessari o per scovare cartelle &#8220;pesanti&#8221; che ci eravamo dimenticati.</p>



<p>• <a href="https://cloudmounter.net/">CloudMounter</a>: permette di montare gli account di cloud storage, per poterli usare come se fossero dischi collegati al Mac.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="597" height="286" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/cloudmounter_01.png?resize=597%2C286&#038;ssl=1" alt="" class="wp-image-10858" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/cloudmounter_01.png?w=597&amp;ssl=1 597w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/cloudmounter_01.png?resize=300%2C144&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/cloudmounter_01.png?resize=500%2C240&amp;ssl=1 500w" sizes="(max-width: 597px) 100vw, 597px" data-recalc-dims="1" /></figure></div>


<p>• <a href="https://magnet.crowdcafe.com/">Magnet</a>: permette di gestire il posizionamento delle finestre. Funzione su cui macOS è indietro anni luce rispetto a Windows.</p>



<p>• <a href="https://www.lgerckens.de/shortery/">Shortery</a>: permette di definire dei trigger per i Comandi Rapidi. Ad esempio, è possibile eseguire in automatico degli shortcuts quando si connette una periferica o ad un determinato orario.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="500" height="409" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shortery_001.webp?resize=500%2C409&#038;ssl=1" alt="" class="wp-image-10859" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shortery_001.webp?w=500&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shortery_001.webp?resize=300%2C245&amp;ssl=1 300w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>• <a href="https://shottr.cc/">Shottr</a>: tool per effettuare screenshot ed editarli. L&#8217;editor integrato offre alcune funzionalità fantastiche: la possibilità di &#8220;blurrare&#8221; del testo e un righello per misurare la distanza tra elementi. Provatela.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="571" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shottr_01.png?resize=960%2C571&#038;ssl=1" alt="" class="wp-image-10860" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shottr_01.png?w=1722&amp;ssl=1 1722w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shottr_01.png?resize=300%2C178&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shottr_01.png?resize=500%2C297&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shottr_01.png?resize=768%2C457&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/shottr_01.png?resize=1536%2C913&amp;ssl=1 1536w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure></div>


<p>• <a href="https://theunarchiver.com/">The Unarchiver</a>: permette di estrarre qualsiasi archivio, esempio <code>rar</code>, <code>zip</code> o <code>sit</code>.</p>



<p>• <a href="https://www.logitech.com/it-it/software/logi-options-plus.html">Logi Options+</a>: utility necessaria se utilizzate dispositivi Logitech. Permette di modificarne le impostazioni e adattarli alle vostre esigenze.</p>



<h4 class="wp-block-heading">Produttività</h4>



<p>• <a href="https://1password.com/it/">1Password</a>: password manager, il migliore.</p>



<p>• <a href="https://arc.net/">Arc</a>: browser moderno e alternativo, che fornisce alcune funzionalità davvero interessanti (es. split di due tab). Se volete un invito, scrivetemi nei commenti.</p>



<p>• <a href="http://busymac.com/busycal/">BusyCal</a>: app per la gestione dei calendari. Sono fuggito da Fantastical perchè non ho voglia di pagare un abbonamento anche per l&#8217;app del calendario. BusyCal è davvero ottima e si trova spesso in sconto.</p>



<p>• <a href="https://cyberduck.io/">Cyberduck</a>: client per connettersi in FTP a cartelle e server remoti (e non solo).</p>



<p>• <a href="https://mimestream.com/">Mimestream</a>: client per Gmail, nativo e leggero. È ancora in fase beta ma funziona molto bene.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="608" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/mimestream_01.png?resize=960%2C608&#038;ssl=1" alt="" class="wp-image-10861" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/mimestream_01.png?w=1581&amp;ssl=1 1581w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/mimestream_01.png?resize=300%2C190&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/mimestream_01.png?resize=500%2C317&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/mimestream_01.png?resize=768%2C486&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/mimestream_01.png?resize=1536%2C973&amp;ssl=1 1536w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure></div>


<p>• <a href="https://www.notion.so/">Notion</a>: app dell&#8217;omonimo servizio. Se ancora non la usate, recuperate subito.</p>



<p>• <a href="https://obsidian.md/">Obsidian</a>: chiamarlo text editor è limitativo, ma in sostanza è quello che fa. Non ne sono un grande estimatore, lo utilizzo solo per scriverci le bozze dei post giusto per provarlo. Al momento preferisco Notion come idea.</p>



<p>• <a href="https://www.pixelmator.com/pro/">Pixelmator Pro</a>: editor di immagini, più semplice e più economico di Photoshop, ma sempre al top come funzionalità e novità.</p>



<p>• <a href="https://slack.com/">Slack</a>: client per la migliore piattaforma di messaggistica per team</p>



<p>• <a href="https://www.sublimetext.com/">Sublime Text</a>: popolare editor di testo e codice. Lo utilizzo molto per appuntarmi o copiare del testo al volo, trovo fantastico poter chiudere la finestra, riaprirla e trovarmi ancora li quello che avevo digitato.</p>



<p>• <a href="https://iterm2.com/">iTerm</a>: sostituto per il classico terminale, offre una serie infinita di impostazioni e possibilità di personalizzazione.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="551" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/iterm_001.png?resize=960%2C551&#038;ssl=1" alt="" class="wp-image-10862" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/iterm_001.png?w=1665&amp;ssl=1 1665w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/iterm_001.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/iterm_001.png?resize=500%2C287&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/iterm_001.png?resize=768%2C441&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/iterm_001.png?resize=1536%2C881&amp;ssl=1 1536w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure></div>


<h4 class="wp-block-heading">Developer</h4>



<p>• <a href="https://developer.android.com/studio">Android Studio</a>: ambiente di sviluppo per Android (e non solo).</p>



<p>• <a href="https://www.docker.com/products/docker-desktop/">Docker Desktop</a>: app per il celebre gestore di container e immagini Docker.</p>



<p>• <a href="https://git-fork.com/">Fork</a>: client Git nativo per macOS. Davvero ben fatto, pulito e comodissima la possibilità poter aprire più tab. Costa circa 50$, potete prima valutarlo con la versione di prova che non ha scadenza.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="633" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/fork_01.png?resize=960%2C633&#038;ssl=1" alt="" class="wp-image-10863" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/fork_01.png?w=1352&amp;ssl=1 1352w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/fork_01.png?resize=300%2C198&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/fork_01.png?resize=500%2C330&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/fork_01.png?resize=768%2C506&amp;ssl=1 768w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure></div>


<p>• <a href="https://kaleidoscope.app/">Kaleidoscope</a>: app storica per effettuare la comparazione tra files. Fondamentale se bisogna effettuare il merge di file che non sono sotto versionamento.</p>



<p>• <a href="https://www.postman.com/">Postman</a>: originariamente client per effettuare chiamate ad API. Io lo uso principalmente per questo, ma oggi ha davvero un&#8217;infinità di altre funzioni.</p>



<p>• <a href="https://www.sublimemerge.com/">Sublime Merge</a>: è un client Git, ma io lo utilizzo solamente per la risoluzione dei conflitti durante un merge/rebase. È secondo me il migliore in circolazione.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="960" height="549" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/sublimemerge_01.png?resize=960%2C549&#038;ssl=1" alt="" class="wp-image-10864" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/sublimemerge_01.png?w=1555&amp;ssl=1 1555w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/sublimemerge_01.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/sublimemerge_01.png?resize=500%2C286&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/sublimemerge_01.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/sublimemerge_01.png?resize=1536%2C879&amp;ssl=1 1536w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /></figure></div>


<p>• <a href="https://code.visualstudio.com/">Visual Studio Code</a>: forse il più famoso editor di codice degli ultimi anni. Lo utilizzo quando ho file singoli o per progetti Python/web.</p>



<p>• <a href="https://visualstudio.microsoft.com/vs/mac/">Visual Studio</a>: forse il peggior editor di codice per macOS. Necessario per sviluppare in C# su macOS.</p>



<p>• <a href="https://developer.apple.com/xcode/">Xcode</a>: l&#8217;unico IDE possibile per scrivere app per il mondo Apple.</p>



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



<h2 class="wp-block-heading">Bonus: i wallpapers</h2>



<p>Come sfondi del desktop ho trovato questa fantastica collezione chiamata <a href="https://hector.me/aqueux">Aquex</a>: riprendono lo stile dello sfondo di default di Mac OS X 10.0 (che ho <a href="https://www.bubidevs.net/2023/01/04/ho-rimesso-in-funzione-il-mio-imac-g3-bondi-blue/">recentemente provato</a>), con colori però che riprendono le successive versioni di macOS.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="832" height="1142" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/aquex_001.png?resize=832%2C1142&#038;ssl=1" alt="" class="wp-image-10865" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/aquex_001.png?w=832&amp;ssl=1 832w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/aquex_001.png?resize=219%2C300&amp;ssl=1 219w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/aquex_001.png?resize=500%2C686&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/aquex_001.png?resize=768%2C1054&amp;ssl=1 768w" sizes="(max-width: 832px) 100vw, 832px" data-recalc-dims="1" /></figure></div>


<p>Che dire, sono semplicemente stupendi, li potete acquistare direttamente sul sito per soli <strong>3 $</strong>.</p>



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



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



<p>Sono soddisfatto del mio setup attuale, ormai alcune app le utilizzo da diversi anni e non riuscirei più a farne a meno. Ci sono alcune alternative che sto valutando, ma che non mi hanno ancora convinto per uno switch:</p>



<ul>
<li><a href="https://www.raycast.com/">Raycast</a>: alternativa di Alfred, sembra essere molto potente, ma no ho ancora trovato il giusto feeling</li>



<li><a href="https://cron.com/">Cron</a>: alternativa a BusyCal, è molto ben fatta ma al momento supporta solo gli account Google, mentre il mio calendario personale è su iCloud, per ora è una limitazione bloccante</li>
</ul>



<p>Per i più smanettoni, prossimamente pubblicherò un articolo con tutte le configurazioni che ho fatto ad iTerm, il tema e i plugin che utilizzo per configurare <code>zsh</code>.</p><p>The post <a href="https://www.bubidevs.net/2023/01/26/il-mio-setup-2023-macos-e-app/">Il mio setup 2023 – macOS e app</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2023/01/26/il-mio-setup-2023-macos-e-app/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10838</post-id>	</item>
		<item>
		<title>Ho rimesso in funzione il mio iMac G3 Bondi Blue</title>
		<link>https://www.bubidevs.net/2023/01/04/ho-rimesso-in-funzione-il-mio-imac-g3-bondi-blue/</link>
					<comments>https://www.bubidevs.net/2023/01/04/ho-rimesso-in-funzione-il-mio-imac-g3-bondi-blue/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Wed, 04 Jan 2023 15:58:12 +0000</pubDate>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mac Os X]]></category>
		<category><![CDATA[macintosh]]></category>
		<category><![CDATA[vintage]]></category>
		<guid isPermaLink="false">https://www.bubidevs.net/?p=10777</guid>

					<description><![CDATA[<p>Ho aggiornato Ram e hard disk del il mio iMac G3, installando poi Mac OS X. Il tutto tra problemi e installazioni fallite.</p>
<p>The post <a href="https://www.bubidevs.net/2023/01/04/ho-rimesso-in-funzione-il-mio-imac-g3-bondi-blue/">Ho rimesso in funzione il mio iMac G3 Bondi Blue</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Cosa c&#8217;è di meglio da fare durante le vacanze natalizie se non del buon retro computing? È un po&#8217; che guardavo il mio iMac G3 appoggiato sullo scaffale, e finalmente ho trovato il tempo di rimetterlo in sesto.</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="500" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=500%2C500&#038;ssl=1" alt="" class="wp-image-10778" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=1536%2C1536&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=2048%2C2048&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=50%2C50&amp;ssl=1 50w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=60%2C60&amp;ssl=1 60w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?resize=640%2C640&amp;ssl=1 640w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_01.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<span id="more-10777"></span>



<p>Sia chiaro, ora non ho un Mac che posso usare tutti i giorni, e tornerà sicuramente sullo scaffale passata questa euforia, ma è stato divertente metterci mano e riassaporare un po&#8217; la possibilità di smontare il computer e metterci mano, cosa che con i Mac di oggi è impossibile.</p>



<h2 class="wp-block-heading">Situazione iniziale</h2>



<p>L&#8217;iMac è il modello Bondi Blue del 1998 (revisione A), con sistema operativo Mac OS 9.2.2. Le <a href="https://everymac.com/systems/apple/imac/specs/imac_ab.html">caratteristiche tecniche</a> non sono delle migliori:</p>



<ul>
<li>processore PowerPC a 233 MHz</li>



<li>160 MB di RAM (penso fosse già stata aumentata dal precedente proprietario)</li>



<li>4 GB di hard disk</li>



<li>CD-ROM 24x</li>



<li>Ethernet integrata</li>
</ul>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="500" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=500%2C500&#038;ssl=1" alt="" class="wp-image-10779" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=500%2C500&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=1536%2C1536&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=2048%2C2048&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=50%2C50&amp;ssl=1 50w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=60%2C60&amp;ssl=1 60w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?resize=640%2C640&amp;ssl=1 640w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_macos9.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<p>L&#8217;idea è semplice: aumentare la RAM, cambiare l&#8217;hard disk e aggiornare il computer a Mac OS X, magari provando le varie versioni fino alla 10.2. Ufficialmente l&#8217;ultima versione supportata è la 10.3, ma sui vari forum viene sconsigliata perché rende la macchina quasi inutilizzabile.</p>



<h2 class="wp-block-heading">Aggiornamento hardware</h2>



<p>Su eBay ho trovato un banco di RAM da 128 MB, da un venditore tedesco a 6,89 €. Bisogna cercare con attenzione, l&#8217;unica tipologia supportata è la PC66 SDRAM, ma non è nemmeno troppo difficile trovare ancora dei banchi originali o comunque compatibili.</p>



<p>Per l&#8217;hard disk, invece, ho recuperato un disco da 20 GB che non utilizzato, un normale PATA da 3,5&#8243;, come quelli che si montavano nei PC fissi dei primi anni 2000 (quanto mi sento vecchio).</p>



<p>Per installarli, bisogna smontare lo sportello inferiore del Mac, scollegare i cavi e rimuovere la scheda logica:</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="564" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_01.jpg?resize=500%2C564&#038;ssl=1" alt="" class="wp-image-10812" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_01-scaled.jpg?resize=500%2C564&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_01-scaled.jpg?resize=266%2C300&amp;ssl=1 266w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_01-scaled.jpg?resize=768%2C866&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_01-scaled.jpg?resize=1363%2C1536&amp;ssl=1 1363w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_01-scaled.jpg?resize=1817%2C2048&amp;ssl=1 1817w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_01-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="375" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_02.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10813" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_02.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_02.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_02.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_02.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_02.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_02.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<p>Da qui si accede allo scompartimento che contiene la RAM e il processore (nascosto dal dissipatore):</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="627" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_ram.jpg?resize=500%2C627&#038;ssl=1" alt="" class="wp-image-10814" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_ram-scaled.jpg?resize=500%2C627&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_ram-scaled.jpg?resize=239%2C300&amp;ssl=1 239w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_ram-scaled.jpg?resize=768%2C963&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_ram-scaled.jpg?resize=1225%2C1536&amp;ssl=1 1225w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_ram-scaled.jpg?resize=1633%2C2048&amp;ssl=1 1633w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_ram-scaled.jpg?w=2041&amp;ssl=1 2041w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_ram-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<p>L&#8217;hard disk, invece, è leggermente più ostico, perché si trova sotto il lettore CD. Come sempre, la cosa migliore è seguire la <a href="https://www.ifixit.com/Guide/iMac+G3+Model+M4984+Hard+Drive+Replacement/1563">guida di iFixit</a>, che spiega i vari passaggi da effettuare.</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="351" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_hdd.jpg?resize=500%2C351&#038;ssl=1" alt="" class="wp-image-10815" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_hdd-scaled.jpg?resize=500%2C351&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_hdd-scaled.jpg?resize=300%2C211&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_hdd-scaled.jpg?resize=768%2C540&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_hdd-scaled.jpg?resize=1536%2C1080&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_hdd-scaled.jpg?resize=2048%2C1440&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_hdd-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<p>Fatto! Rimontiamo tutto, colleghiamo i cavi e scopriamo se funziona!</p>



<h2 class="wp-block-heading">Batteria e reset CUDA</h2>



<p>Poteva andare tutto liscio? Ovviamente no. Al primo riavvio l&#8217;iMac è partito correttamente, e un&#8217;icona indicava la mancanza dell&#8217;hard disk:</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="667" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_noharddisk.jpg?resize=500%2C667&#038;ssl=1" alt="" class="wp-image-10780" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_noharddisk-scaled.jpg?resize=500%2C667&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_noharddisk-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_noharddisk-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_noharddisk-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_noharddisk-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_noharddisk-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<p>Tutto ok, l&#8217;hard disk era da formattare quindi nessun problema. Al successivo riavvio, però, l&#8217;iMac non voleva saperne di ripartire. Classico &#8220;gong&#8221; iniziale ma schermo nero, nessun segnale di vita.</p>



<p>Smonto tutto nuovamente e provo un reset CUDA. Si tratta di un bottoncino presente sulla scheda madre, che effettua una sorta di reset &#8220;profondo&#8221; e che tendenzialmente risolve questi problemi. Premo il bottone una sola volta, come si trova nei manuali, dovrebbe bastare per eseguire il reset. Rimonto nuovamente l&#8217;iMac, ma ancora nulla, l&#8217;iMac non vuole proprio ripartire.</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="570" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_cuda.jpg?resize=500%2C570&#038;ssl=1" alt="" class="wp-image-10816" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_cuda-scaled.jpg?resize=500%2C570&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_cuda-scaled.jpg?resize=263%2C300&amp;ssl=1 263w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_cuda-scaled.jpg?resize=768%2C876&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_cuda-scaled.jpg?resize=1346%2C1536&amp;ssl=1 1346w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_cuda-scaled.jpg?resize=1795%2C2048&amp;ssl=1 1795w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_smontato_cuda-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<p>Provo quindi una serie infinita di reset, più o meno strani che trovo in rete. Nessun risultato, il Mac non si avvia. Provo a rimettere il vecchio hard disk e togliere il banco nuovo di RAM, ma la situazione non cambia. Ad un certo punto su un forum trovo un utente che scrive:</p>



<blockquote class="wp-block-quote">
<p class="has-text-align-center">I have to press the CUDA button for at least 30 seconds to boot up my Mac</p>
</blockquote>



<p>GENIO! Provo a tenere premuto per 30 secondi questo dannatissimo bottone e.. boom! L&#8217;iMac si accede nuovamente! Finalmente!</p>



<h2 class="wp-block-heading">Mission impossible: masterizzare dei CD nel 2023</h2>



<p>Avevo già scaricato le immagini di Mac OS X dal fantastico sito <a href="https://www.macintoshrepository.org/">MacinotshRepository</a>, che contiene una serie infinita di software per i computer vintage di Apple.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" loading="lazy" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macintoshrepository.png?resize=609%2C415&#038;ssl=1" alt="" class="wp-image-10781" width="609" height="415" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macintoshrepository.png?resize=500%2C341&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macintoshrepository.png?resize=300%2C205&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macintoshrepository.png?resize=768%2C524&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macintoshrepository.png?resize=1536%2C1048&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/macintoshrepository.png?w=1632&amp;ssl=1 1632w" sizes="(max-width: 609px) 100vw, 609px" data-recalc-dims="1" /></figure></div>


<p>Pensavo che masterizzare le immagini sarebbe stato veloce, ma ho sottostimato questo aspetto. Masterizzare dei CD nel 2023 non è per nulla scontato. La prima impresa è stata recuperare dei CD vergini: ne avevo recuperati 3, pensando fossero sufficienti. Ma li ho buttati con le prime prove di masterizzazione. Ho recuperato poi una mezza &#8220;campana&#8221;, circa 20 CD, che fortunatamente sono bastati.</p>



<p>L&#8217;unico computer con un masterizzatore che avevo in casa era il mio MacBook bianco che ho <a href="https://www.bubidevs.net/2022/12/06/storia-di-un-macbook-late-2007-di-pop_os-e-di-un-cavetto/" target="_blank" rel="noopener" title="">recentemente rimesso a nuovo</a>. Ho provato quindi a masterizzare le immagini da li, ma i CD non venivano riconosciuti dal Mac. All&#8217;avvio, infatti, il Mac tentava di partire da CD ma non riusciva, restava in uno stato non ben definito.</p>



<p>Anche qui spulciando sui vari forum consigliavano di masterizzare le immagini con Mac OS, perché a quanto pare altri sistemi operativi saltano qualche file nascosto. Ho dovuto quindi collegare il vecchio hard disk con macOS al MacBook e masterizzarli dal caro vecchio &#8220;Utility Disco&#8221;, che non ha fallito l&#8217;obbiettivo.</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="428" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx_installation_cd.jpg?resize=500%2C428&#038;ssl=1" alt="" class="wp-image-10817" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx_installation_cd.jpg?resize=500%2C428&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx_installation_cd.jpg?resize=300%2C257&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx_installation_cd.jpg?resize=768%2C658&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx_installation_cd.jpg?resize=1536%2C1316&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx_installation_cd.jpg?resize=2048%2C1755&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx_installation_cd.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<h2 class="wp-block-heading">Mac OS X 10.0</h2>



<p>&#8220;Disco dentro, C a martello, scatenate l&#8217;installazione!&#8221; (semicit)</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="386" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_osx10.0_installer.jpg?resize=500%2C386&#038;ssl=1" alt="" class="wp-image-10818" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_osx10.0_installer-scaled.jpg?resize=500%2C386&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_osx10.0_installer-scaled.jpg?resize=300%2C231&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_osx10.0_installer-scaled.jpg?resize=768%2C592&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_osx10.0_installer-scaled.jpg?resize=1536%2C1184&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_osx10.0_installer-scaled.jpg?resize=2048%2C1579&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/imac_g3_osx10.0_installer-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure>



<p>Anche qui, primo inghippo. L&#8217;installer non mi permetteva di selezionare il disco fisso, nonostante lo avessi inizializzato da Utility Disk. Dopo varie ricerche, <a href="https://lowendmac.com/macdan/md07/1207.html">ho scoperto</a> che la partizione in cui installare il sistema operativo deve essere al massimo di 8 GB. Ho quindi partizionato in due il disco, e finalmente ho potuto scegliere la destinazione e proseguire.</p>



<p>L&#8217;installazione dura circa 30/40 minuti, con quel piacevole rumore del CD che gira, un suono che avevo rimosso.</p>



<p>Ed ecco finalmente Mac OS X 10.0:</p>



<figure class="wp-block-gallery has-nested-images columns-2 is-cropped wp-block-gallery-1 is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_01.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10786"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_01.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10786" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_01.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_01.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_01.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_01.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_02.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10785"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_02.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10785" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_02.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_02.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_02.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_02.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_03.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10783"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_03.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10783" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_03.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_03.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_03.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_03.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_04.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10784"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_04.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10784" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_04.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_04.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_04.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_04.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_05.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10787"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_05.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10787" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_05.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_05.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_05.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_05.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_06.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10782"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_06.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10782" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_06.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_06.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_06.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.0_screenshot_06.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>
</figure>



<p>La prima versione di Mac OS X non è sicuramente delle migliori, il sistema è abbastanza lento e qualche applicazione mi è crashata in pochi minuti di utilizzo. Però il design è davvero figo, alcuni degli elementi e parte dell&#8217;interfaccia è praticamente la stessa che c&#8217;è oggi in macOS. La mela colorata nella barra dei menu è qualcosa che dovrebbero reintrodurre!</p>



<p>Si avete visto bene, come browser di default era installato Internet Explorer 5. Purtroppo navigare con quei browser oggi è impossibile, la cifratura dei siti HTTPS moderni non è supportata. Ci <a href="#conclusioni" title="sono dei meccanismi">sono dei meccanismi</a> per risolvere il problema, ma non ho ancora avuto modo di provarci.</p>



<p>Piccola nota, gli screenshot ho dovuto realizzarli con il tool integrato nell&#8217;OS, perché la classica combinazione &#8220;Cmd + Shift + 3&#8221; non funzionava, a quanto pare è stata implementata successivamente.</p>



<h2 class="wp-block-heading">Mac OS X 10.1</h2>



<p>Ho installato poi Mac OS X 10.1, la procedura di installazione è praticamente la stessa, mentre il sistema operativo sembra più stabile e scattante. In questa versione sono stati introdotti iTunes e iMovie:</p>



<figure class="wp-block-gallery has-nested-images columns-2 is-cropped wp-block-gallery-3 is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_01.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10794"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_01.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10794" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_01.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_01.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_01.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_01.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_02.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10793"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_02.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10793" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_02.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_02.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_02.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_02.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_03.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10792"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_03.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10792" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_03.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_03.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_03.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_03.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_04.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10790"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_04.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10790" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_04.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_04.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_04.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_04.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_05.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10788"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_05.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10788" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_05.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_05.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_05.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_05.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_06.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10791"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_06.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10791" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_06.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_06.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_06.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_06.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_07.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10789"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_07.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10789" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_07.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_07.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_07.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.1_screenshot_07.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>
</figure>



<p>PS: qui la combinazione per fare gli screenshot era funzionante.</p>



<h2 class="wp-block-heading">Mac OS X 10.2</h2>



<p>Prima piccola novità avviando il CD di Mac OS X 10.2: invece dell&#8217;icona <a href="https://en.wikipedia.org/wiki/Happy_Mac">dell&#8217;Happy Mac</a>, appare il logo grigio Apple. La procedura di installazione è del tutto simile alle versioni precedenti. In questo caso sono 2 i CD da utilizzare e la procedura è durata circa 1 ora e mezza.</p>



<p>Il sistema è sicuramente più rifinito, non ci sono più quei piccoli errori e imperfezioni delle versioni precedenti (ad esempio alcune parti non localizzate in italiano), anche se l&#8217;iMac sembra faticare un po&#8217; di più rispetto alle precedenti versioni.</p>



<p>Spuntano anche alcune vecchie conoscenze: iChat, Rubrica e iPhoto.</p>



<figure class="wp-block-gallery has-nested-images columns-2 is-cropped wp-block-gallery-5 is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_01.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10802"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_01.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10802" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_01.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_01.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_01.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_01.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_02.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10803"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_02.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10803" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_02.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_02.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_02.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_02.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_03.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10804"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_03.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10804" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_03.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_03.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_03.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_03.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_04.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10805"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_04.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10805" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_04.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_04.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_04.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_04.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_05.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10806"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_05.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10806" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_05.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_05.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_05.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_05.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_06.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10807"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_06.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10807" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_06.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_06.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_06.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_06.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_07.jpg?ssl=1"><img decoding="async" loading="lazy" width="500" height="375" data-id="10808"  src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_07.jpg?resize=500%2C375&#038;ssl=1" alt="" class="wp-image-10808" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_07.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_07.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_07.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2023/01/osx10.2_screenshot_07.jpg?w=1024&amp;ssl=1 1024w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure>
</figure>



<h2 class="wp-block-heading" id="conclusioni">Conclusioni</h2>



<p>Non nego che arrivare in fondo è stata un&#8217;avventura, soprattutto quando il Mac non si avviava ho pensato di richiudere tutto e riporlo nello scaffale. Ma noi ingegneri siamo teste dure, e farci desistere da qualcosa è davvero difficile.</p>



<p>Prossimamente voglio cercare di avere un browser funzionante, per poter visitare <strong>bubidevs</strong> dall&#8217;iMac G3. Ci sono dei proxy server che permettono di navigare con vecchi browser non più supportati. Uno dei più consigliati è <a href="https://github.com/atauenis/webone">WebOne</a>, devo trovare il tempo di configurarlo.</p>



<p>Vorrei anche riuscire a fare il dual boot tra Mac OS X e Mac OS 9, è una procedura supportata, quindi non dovrebbe essere complicato.</p>



<p>In definitiva, avrei potuto impiegare meglio il mio tempo? Si. È stato utile? No. Mi sono divertito? Un sacco. Quindi va bene così, ora posso guardarmi uno dei più bei Mac di sempre ed essere soddisfatto di averlo rimesso in funzione.</p><p>The post <a href="https://www.bubidevs.net/2023/01/04/ho-rimesso-in-funzione-il-mio-imac-g3-bondi-blue/">Ho rimesso in funzione il mio iMac G3 Bondi Blue</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2023/01/04/ho-rimesso-in-funzione-il-mio-imac-g3-bondi-blue/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10777</post-id>	</item>
		<item>
		<title>Storia di un MacBook late 2007, di Pop!_OS e di un cavetto</title>
		<link>https://www.bubidevs.net/2022/12/06/storia-di-un-macbook-late-2007-di-pop_os-e-di-un-cavetto/</link>
					<comments>https://www.bubidevs.net/2022/12/06/storia-di-un-macbook-late-2007-di-pop_os-e-di-un-cavetto/#comments</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Tue, 06 Dec 2022 19:30:00 +0000</pubDate>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[MacBook]]></category>
		<category><![CDATA[pop_os]]></category>
		<category><![CDATA[vintage]]></category>
		<guid isPermaLink="false">https://www.bubidevs.net/?p=10744</guid>

					<description><![CDATA[<p>Ho rispolverato il mio vecchio MacBook white del 2007. Una volta sistemati i problemi hardware, ho installato Pop!_OS e ne sono rimasto piacevolmente sorpreso!</p>
<p>The post <a href="https://www.bubidevs.net/2022/12/06/storia-di-un-macbook-late-2007-di-pop_os-e-di-un-cavetto/">Storia di un MacBook late 2007, di Pop!_OS e di un cavetto</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Qualche settimana fa ho rispolverato il mio vecchio MacBook bianco, che giaceva ormai da anni abbandonato in un armadio. Comprato nel lontano 2007, modello Core 2 Duo A1181, è uno dei pochi computer a cui sono affezionato, perché ha rappresentato l&#8217;inizio della mia avventura nel mondo Apple.</p>



<p>Era inutilizzato da parecchio tempo, in particolare perché la retroilluminazione non funzionava più, quindi era necessario collegarlo sempre ad un monitor esterno.</p>



<p>Mi sono chiesto, &#8220;possibile non riuscire a dargli una seconda (o forse terza) vita?&#8221;. Spoiler: sì, è stato possibile, e questo è il risultato:</p>



<figure class="wp-block-image alignwide size-full"><img decoding="async" loading="lazy" width="960" height="640" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos-scaled.jpg?resize=960%2C640&#038;ssl=1" alt="" class="wp-image-10745" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos-scaled.jpg?w=2560&amp;ssl=1 2560w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos-scaled.jpg?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos-scaled.jpg?resize=500%2C333&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos-scaled.jpg?resize=768%2C512&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos-scaled.jpg?resize=1536%2C1024&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos-scaled.jpg?resize=2048%2C1365&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 960px) 100vw, 960px" data-recalc-dims="1" /><figcaption class="wp-element-caption">Setup completo del MacBook con Pop!_OS</figcaption></figure>



<figure class="wp-block-image alignwide size-large"><img decoding="async" loading="lazy" width="500" height="313" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos_01-1.png?resize=500%2C313&#038;ssl=1" alt="" class="wp-image-10749" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos_01-1.png?resize=500%2C313&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos_01-1.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos_01-1.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_popos_01-1.png?w=1280&amp;ssl=1 1280w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /><figcaption class="wp-element-caption">Il desktop di Pop!_OS una volta completata la configurazione</figcaption></figure>



<p>Questo post farà da diario alle configurazioni e alle sostituzioni fatte e che (spero) di poter fare in futuro.</p>



<h2 class="wp-block-heading">Let&#8217;s fix the hardware!</h2>



<p>Dopo averlo acceso e provato per qualche minuto, ho individuato alcune cose da sistemare:</p>



<ul>
<li>la retroilluminazione: punto fondamentale, un portatile con lo schermo non funzionante è un paradosso</li>



<li>l&#8217;hard disk: montare un SSD può dare un boost alle prestazioni?</li>



<li>la batteria: è esausta, aspetto che compromette anche le prestazioni</li>
</ul>



<h3 class="wp-block-heading">Quel maledetto cavo dell&#8217;inverter</h3>



<p>Il primo problema da risolvere era la retroilluminazione non più funzionante. Problema diffuso per questo modello, a cui però mi ero rassegnato utilizzando un monitor esterno.<br>Spulciando in rete, invece, ho scoperto che il problema è tipicamente dovuto ad un maledetto cavetto che si danneggia e causa il malfunzionamento.</p>



<p>Dove cercare il ricambio? Ma su <a href="https://www.aliexpress.com/item/1005003856801804.html">AliExpress</a>, che domande: 5,62 € (spedizioni incluse) e il nuovo cavo dell&#8217;inverter è arrivato sulla mia scrivania.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="393" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/cavo_inverter.jpg?resize=500%2C393&#038;ssl=1" alt="" class="wp-image-10750" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/cavo_inverter.jpg?resize=500%2C393&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/cavo_inverter.jpg?resize=300%2C236&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/cavo_inverter.jpg?resize=768%2C604&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/cavo_inverter.jpg?resize=1536%2C1207&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/cavo_inverter.jpg?resize=2048%2C1610&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/cavo_inverter.jpg?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>La procedura di sostituzione non è stata delle più semplici, ho dovuto smontare praticamente tutto il computer per accedere al cavo e sostituirlo. Fortunatamente iFixit ha una <a href="https://www.ifixit.com/Guide/MacBook+Core+Duo+Inverter+Cable+Replacement/4766">guida dettagliata</a> sulla procedura da seguire, che mi ha salvato da alcuni errori che avrei sicuramente commesso.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="547" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_inverter_001.jpg?resize=500%2C547&#038;ssl=1" alt="" class="wp-image-10751" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_inverter_001-scaled.jpg?resize=500%2C547&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_inverter_001-scaled.jpg?resize=274%2C300&amp;ssl=1 274w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_inverter_001-scaled.jpg?resize=768%2C840&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_inverter_001-scaled.jpg?resize=1404%2C1536&amp;ssl=1 1404w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/macbook_inverter_001-scaled.jpg?resize=1872%2C2048&amp;ssl=1 1872w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>Piccola nota, non è necessario staccare completamente il display come nella guida, ma basta appoggiarlo ed avrete tranquillamente accesso al cavo da sostituire, risparmiandovi di dover scollegare tutti i cavi nella parte centrale.</p>



<h3 class="wp-block-heading">SSD</h3>



<p>Il secondo step è stato sostituire l&#8217;HDD da 5.400 rpm con un fiammante SSD da 128 GB. Fiammante si fa per dire, anche qui <a href="https://www.aliexpress.com/item/4000404710014.html">AliExpress</a> ha aiutato a contenere il budget: 13,39 € e disco arrivato in meno di 10gg.</p>



<p>La sostituzione è banale, basta togliere la batteria, smontare il profilo metallico e si accede allo slot dell&#8217;hard disk. Lascio comunque il link alla <a href="https://www.ifixit.com/Guide/MacBook+Core+2+Duo+Hard+Drive+Replacement/514">guida di iFixit</a>.</p>



<p>Attenzione: questo modello di MacBook ha un collegamento SATA da 1,5 GB, mentre i moderni SSD hanno una velocità di 6 GB. Solitamente non è un problema, ma alcuni modelli potrebbero non funzionare correttamente. Almeno, così ho letto su diversi forum, io personalmente non ho avuto problemi con il modello che ho acquistato.</p>



<h3 class="wp-block-heading">Batteria (e performance)</h3>



<p>Su Amazon ho acquistato una&nbsp;<a href="https://www.amazon.it/dp/B07NM1P473">nuova batteria</a>&nbsp;(28,99 € la spesa), non proprio uguale a quella originale ma fa il suo lavoro.</p>



<p>Ho sempre saputo che usare il MacBook senza batteria (o con una esausta, come nel mio caso) riduceva le prestazioni del Mac, ma non avevo mai avuto modo di fare una verifica. Ho preso l&#8217;occasione per fare dei test con <a href="https://www.geekbench.com/index.html">Geekbench 5</a> e i risultati sono stati quasi sorprendenti:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="255" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-macbook-1.png?resize=500%2C255&#038;ssl=1" alt="" class="wp-image-10772" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-macbook-1.png?resize=500%2C255&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-macbook-1.png?resize=300%2C153&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-macbook-1.png?resize=768%2C391&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-macbook-1.png?resize=1536%2C783&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-macbook-1.png?resize=2048%2C1044&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-macbook-1.png?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>Il punteggio in Single-core è passato da 187 a 329, mentre quello in Multi-core da 366 a 484! Un incremento davvero notevole!</p>



<p>Piccola curiosità, questa è invece una comparazione tra il MacBook e la mia attuale accoppiata iPhone 13 / MacBook Pro M1:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="258" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-allmodels.png?resize=500%2C258&#038;ssl=1" alt="" class="wp-image-10773" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-allmodels.png?resize=500%2C258&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-allmodels.png?resize=300%2C155&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-allmodels.png?resize=768%2C396&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-allmodels.png?resize=1536%2C792&amp;ssl=1 1536w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-allmodels.png?resize=2048%2C1056&amp;ssl=1 2048w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/geekbench-allmodels.png?w=1920&amp;ssl=1 1920w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>Potete trovare tutti i risultati dei benchmark sul <a href="https://browser.geekbench.com/user/24198">mio profilo</a> di Geekbench.</p>



<h2 class="wp-block-heading">Let&#8217;s fix the software!</h2>



<p>Dopo aver sistemato la ferraglia, è giunto il momento di dare un nuovo software al MacBook. Non volevo installare macOS, l&#8217;ultima versione compatibile era Lion (10.7.5), e provare qualche hack per installare versioni successive non mi andava.</p>



<p>Ho cercato quindi una distro Linux che non fosse troppo pesante ma anche decente graficamente, e ho scoperto Pop!_OS, di cui si <a href="https://www.darrellmoore.me/2021/09/what-is-the-best-linux-distribution-for-an-old-apple-macbook/">parla bene</a>. Quindi, why not?</p>



<h3 class="wp-block-heading">Installazione di Pop!_OS</h3>



<p>L&#8217;installazione di Pop!_OS è quella di una qualsiasi distro Linux:</p>



<ol>
<li>download dell&#8217;ultima immagine disponibile (22.04 al momento in cu scrivo) dal <a href="https://pop.system76.com/">sito ufficiale</a></li>



<li>tramite <a href="https://www.balena.io/etcher/">BalenaEtcher</a>, creazione di una chiavetta USB da cui eseguire il boot</li>



<li>avviare il Mac e premere <code>Alt</code>, apparirà così la possibilità di avviare da USB e non dall&#8217;HDD (che nel mio caso era comunque vuoto)</li>
</ol>



<p>La procedura di avvio della live distro non è delle più veloci, ma tempo 1 minuti e ci si trova nel desktop di Pop!_OS, con la possibilità di completare l&#8217;installazione.</p>



<p>Et voilà!</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="313" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_01.png?resize=500%2C313&#038;ssl=1" alt="" class="wp-image-10752" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_01.png?resize=500%2C313&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_01.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_01.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_01.png?w=1280&amp;ssl=1 1280w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>

<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="313" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_02.png?resize=500%2C313&#038;ssl=1" alt="" class="wp-image-10753" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_02.png?resize=500%2C313&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_02.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_02.png?resize=768%2C480&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_install_02.png?w=1280&amp;ssl=1 1280w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<h3 class="wp-block-heading">Abilitazione scheda di rete</h3>



<p>Poteva funzionare tutto subito? No, altrimenti non sarebbe una distro Linux ma si chiamerebbe macOS <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f60e.png" alt="😎" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>Il primo problema da risolvere è la scheda WiFi non riconosciuta. Per questo specifico modello si tratta di una <strong>Broadcom 4321</strong>. È bastata una veloce ricerca per trovare il <a href="https://askubuntu.com/a/1175754">post giusto</a> con la procedura da eseguire via terminale:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo apt-get update
sudo apt-get --reinstall install bcmwl-kernel-source

sudo modprobe -r b43 ssb wl brcmfmac brcmsmac bcma
sudo modprobe wl</code></pre>



<p>Ovviamente è necessario essere collegati via cavo per poter installare i pacchetti necessari. Dopo un immancabile <code>sudo reboot</code>, ecco la scheda di rete funzionante!</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="347" height="378" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_wifi_01.png?resize=347%2C378&#038;ssl=1" alt="" class="wp-image-10754" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_wifi_01.png?w=347&amp;ssl=1 347w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_wifi_01.png?resize=275%2C300&amp;ssl=1 275w" sizes="(max-width: 347px) 100vw, 347px" data-recalc-dims="1" /></figure></div>


<h3 class="wp-block-heading">Abilitazione iSight</h3>



<p>Una volta connessi via WiFi, ho pensato &#8220;chissà se funziona la webcam&#8221;. Beh potete immaginare la risposta <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="293" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_01.png?resize=500%2C293&#038;ssl=1" alt="" class="wp-image-10755" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_01.png?resize=500%2C293&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_01.png?resize=300%2C176&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_01.png?resize=768%2C450&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_01.png?w=817&amp;ssl=1 817w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<p>La ricerca qui è stata più veloce: ho trovato <a href="https://turanct.wordpress.com/tag/appleusbvideosupport/">un post del 2010</a> con la procedura da effettuare. La riporto di seguito, perchè &#8220;2 copies is megl che one&#8221;.</p>



<p><strong>STEP 1</strong><br>Recuperare il file <code>AppleUSBVideoSupport</code> da un&#8217;installazione di Mac OSX (10.4 o 10.5). Il file si in questo percorso:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBVideoSupport.kext/Contents/MacOS/AppleUSBVideoSupport</code></pre>



<p>Ho impiegato un po&#8217; per recuperare il file (per fortuna avevo il vecchio HD con l&#8217;installazione di MacOS X), quindi lo allego qui per backup.</p>



<p><strong>STEP 2</strong><br>Copiare il file <code>AppleUSBVideoSupport</code> in una folder dell&#8217;installazione Linux (supponiamo sia in <code>~/Downloads</code>)</p>



<p><strong>STEP 3</strong><br>Aprire un terminale e installare <code>iSight Firmware Tools</code>:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">sudo apt-get update
sudo apt-get install isight-firmware-tools</code></pre>



<p><strong>STEP 4</strong><br>L&#8217;installer chiederà di selezionare il file <code>AppleUSBVideoSupport</code>, specificate il percorso completo (nel mio caso, <code>/home/andrea/Downloads/AppleUSBVideoSupport</code>)</p>



<p><strong>STEP 5</strong><br>Effettuate un riavvio e godetevi la vostra fantastica iSight alla risoluzione di 640&#215;480!</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="292" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_02.png?resize=500%2C292&#038;ssl=1" alt="" class="wp-image-10757" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_02.png?resize=500%2C292&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_02.png?resize=300%2C175&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_02.png?resize=768%2C448&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/12/popos_camera_02.png?w=775&amp;ssl=1 775w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>


<h2 class="wp-block-heading">Prossimi step</h2>



<p>Il mio MacBook è tornato operativo e al momento è fisso sulla mia scrivania, perchè mi piace averlo e riprodurci della musica con una qualità audio abbastanza scadente, ma ha il suo fascino.</p>



<p>Ho qualcosa in mente per migliorarlo ulteriormente,</p>



<ul>
<li><s><strong>batteria</strong>: l&#8217;ho ordinata su <a href="https://www.amazon.it/dp/B07NM1P473">Amazon</a> (28,99 €), appena arriva aggiornerò l&#8217;articolo con un benchmark di confronto delle prestazioni</s></li>



<li><strong>frame nuovo</strong>: purtroppo la cornice del display è un po&#8217; rovinata e si è anche rotta durante lo smontaggio. Sto rastrellando eBay alla ricerca di un frame nuovo, ma al momento senza successo</li>



<li><strong>tastiera</strong>: mi piacerebbe provare a montare la tastiera della variante nera del MacBook, o ancora meglio trovare una tastiera non originale ma retroilluminata. Qualcuno l&#8217;aveva già fatto (<a href="https://osxdaily.com/2010/10/30/mac-setups-oreo-macbook/">qui</a> e <a href="https://osxdaily.com/2009/10/09/mac-setups-white-macbook-with-black-keys/">qui</a>), definendolo MacBook &#8220;oreo&#8221;.</li>
</ul>



<p>Terrò aggiornato il post con eventuali modifiche future, chissà se questo Pop!_OS sopravviverà o tornerò al caro vecchio OS X!</p>



<p><strong>Aggiornamento 08/12/2022</strong>: aggiunto il paragrafo <strong>Batteria</strong>, con i relativi benchmark.</p><p>The post <a href="https://www.bubidevs.net/2022/12/06/storia-di-un-macbook-late-2007-di-pop_os-e-di-un-cavetto/">Storia di un MacBook late 2007, di Pop!_OS e di un cavetto</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2022/12/06/storia-di-un-macbook-late-2007-di-pop_os-e-di-un-cavetto/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10744</post-id>	</item>
		<item>
		<title>Swift e Timer, attenzione ai retain cycle</title>
		<link>https://www.bubidevs.net/2022/06/17/swift-e-timer-attenzione-ai-retain-cycle/</link>
					<comments>https://www.bubidevs.net/2022/06/17/swift-e-timer-attenzione-ai-retain-cycle/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Fri, 17 Jun 2022 15:34:25 +0000</pubDate>
				<category><![CDATA[iOS Dev]]></category>
		<category><![CDATA[iOS dev]]></category>
		<category><![CDATA[memory management]]></category>
		<category><![CDATA[swift]]></category>
		<category><![CDATA[timer]]></category>
		<guid isPermaLink="false">https://www.bubidevs.net/?p=10726</guid>

					<description><![CDATA[<p>I timer in Swift possono essere facili cause di retain cycle, è bene quindi sapere con esattezza come gestire in maniera corretta la loro distruzione.</p>
<p>The post <a href="https://www.bubidevs.net/2022/06/17/swift-e-timer-attenzione-ai-retain-cycle/">Swift e Timer, attenzione ai retain cycle</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>La creazione di un timer è un&#8217;operazione che, prima o dopo, qualsiasi sviluppatore iOS si trova a fare.</p>



<p>C&#8217;è una piccola insidia, tuttavia, nella gestione della memoria che può portare ad avere dei retain cycle all&#8217;interno della classe/controller in cui vi trovate a definire il timer.</p>



<p>La documentazione di Apple definisce così la classe <code>Timer</code> (<code>NSTimer</code> per i nostalgici):</p>



<blockquote class="wp-block-quote"><p>Timers work in conjunction with run loops. Run loops maintain strong references to their timers, so you don’t have to maintain your own strong reference to a timer after you have added it to a run loop.</p></blockquote>



<p>Un timer in automatico inserito nel run loop in cui viene istanziato (generalmente il main thread), questo però comporta un&#8217;insidia non da poco. L&#8217;ownership non è (solo) della classe in cui andate a definirlo, ma bisogna agire manualmente per invalidarlo e annullare il suo riferimento.</p>



<p>Proviamo a spiegare il tutto con un semplice esempio.</p>



<h2 class="wp-block-heading">Creiamo un timer ripetuto</h2>



<p>Supponiamo di avere un semplicissimo <code>UIViewController</code> che istanzia un timer:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">import UIKit

class SampleViewController: UIViewController {

    private var timer: Timer?

    // MARK: - Init

    convenience init() {
        self.init(nibName: nil, bundle: nil)
        view.backgroundColor = .white
    }

    deinit {
        print("[SampleViewController] deinit called")
    }

    // MARK: - View Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerFired(_:)), userInfo: nil, repeats: true)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        timer = nil
    }

    // MARK: - Private

    @objc private func timerFired(_ sender: Timer) {
        print("[SampleViewController] timer fired")
    }
}
</code></pre>



<p>Da un altro controller istanziamo <code>SampleViewController</code> e lo dismettiamo con un semplice drag verso il basso.</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">let controller = SampleViewController()
present(controller, animated: true)</code></pre>



<h2 class="wp-block-heading">Retain cycle in agguato</h2>



<p>Ci sembrerebbe di aver fatto tutto in maniera corretta, ma guardando la console notiamo che il <code>deinit</code> non viene chiamato dismettendo il controller:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">[SampleViewController] timer fired
[SampleViewController] timer fired
[SampleViewController] timer fired</code></pre>



<p>Analizzando il memory graph, notiamo effettivamente che il controller è ancora presente in menoria, mantenuto in vita da <code>_NSCFTimer</code>:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="211" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/06/timer-retain-cycle-001.png?resize=500%2C211&#038;ssl=1" alt="" class="wp-image-10729" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/06/timer-retain-cycle-001.png?resize=500%2C211&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/06/timer-retain-cycle-001.png?resize=300%2C127&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/06/timer-retain-cycle-001.png?resize=768%2C325&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/06/timer-retain-cycle-001.png?resize=345%2C146&amp;ssl=1 345w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/06/timer-retain-cycle-001.png?resize=626%2C266&amp;ssl=1 626w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/06/timer-retain-cycle-001.png?w=975&amp;ssl=1 975w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>



<p>La chiave per risolvere il problema sta nel chiamare il metodo <code>invalidate</code> del timer:</p>



<blockquote class="wp-block-quote"><p>This method is the only way to remove a timer from an&nbsp;<a href="doc://com.apple.documentation/documentation/foundation/runloop?language=swift">RunLoop</a>&nbsp;object. The&nbsp;<code>RunLoop</code>object removes its strong reference to the timer, either just before the&nbsp;<a href="doc://com.apple.documentation/documentation/foundation/timer/1415405-invalidate?language=swift">invalidate()</a>method returns or at some later point.<br>If it was configured with target and user info objects, the receiver removes its strong references to those objects as well.</p></blockquote>



<p>In questo caso la documentazione è abbastanza chiara: il timer viene rimosso dal relativo RunLoop e, cosa importante, viene rimosso il riferimento <code>strong</code> all&#8217;oggetto target del timer.</p>



<p>Andiamo quindi a modificare il nostro viewWillDisappear:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        timer?.invalidate()
        timer = nil
    }</code></pre>



<p>Boom! Il nostro controller viene ora deallocato in maniera corretta:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">[SampleViewController] timer fired
[SampleViewController] timer fired
[SampleViewController] timer fired
[SampleViewController] deinit called</code></pre>



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



<p>Nonostante la documentazione si chiara a riguardo, è un problema che trovo spesso nei progetti su cui mi trovo a lavorare e che, ammetto, mi capita di fare.</p>



<p>Piccola nota, il tutto è valido per i timer ripetitivi, ovvero che hanno parametro <code>repeat: true</code>. Per i timer che vengono eseguiti una sola volta, l&#8217;ownership viene rilasciata automaticamente.</p>



<p>Spero di non scordarmelo più dopo averci fatto anche un post a riguardo <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f60e.png" alt="😎" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><p>The post <a href="https://www.bubidevs.net/2022/06/17/swift-e-timer-attenzione-ai-retain-cycle/">Swift e Timer, attenzione ai retain cycle</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2022/06/17/swift-e-timer-attenzione-ai-retain-cycle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10726</post-id>	</item>
		<item>
		<title>Come gestire una tastiera ANSI con Shortcuts, senza impazzire</title>
		<link>https://www.bubidevs.net/2022/04/28/come-gestire-una-tastiera-ansi-con-shortcuts-senza-impazzire/</link>
					<comments>https://www.bubidevs.net/2022/04/28/come-gestire-una-tastiera-ansi-con-shortcuts-senza-impazzire/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Thu, 28 Apr 2022 19:13:32 +0000</pubDate>
				<category><![CDATA[Shortcuts]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[shortcuts]]></category>
		<guid isPermaLink="false">https://www.bubidevs.net/?p=10696</guid>

					<description><![CDATA[<p>Per gestire al meglio una tastiera con layout ANSI, ho utilizzato Shortcuts e Shortery per gestire in automatico il cambio di layout in macOS.</p>
<p>The post <a href="https://www.bubidevs.net/2022/04/28/come-gestire-una-tastiera-ansi-con-shortcuts-senza-impazzire/">Come gestire una tastiera ANSI con Shortcuts, senza impazzire</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Da ormai un anno mi sono convertito alle tastiere meccaniche, con conseguente layout ANSI (<a href="https://deskthority.net/wiki/ANSI_vs_ISO">qui una comparativa</a> per chi non conoscesse la differenza).</p>



<p>Il vantaggio di questo layout è di poter avere tutti i simboli utilizzati nello sviluppo (backtip e parentesi graffe su tutti) molto più accessibili, senza dover ricorrere a combo magiche sulla tastiera.</p>



<p>macOS permette di gestire diversi layout di tastiera, ma questo vi costringerà a continui cambi se, come me, passate spesso dalla vostra tastiera meccanica a quella integrata del MacBook.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img decoding="async" loading="lazy" width="284" height="221" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-001.png?resize=284%2C221&#038;ssl=1" alt="" class="wp-image-10697" data-recalc-dims="1"/></figure></div>



<p>Quale occasione migliore per sperimentare a fondo Shortcuts su macOS?</p>



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



<p>L&#8217;idea è quella di realizzare un comando rapido che mi permetta rapidamente di passare da un layout ad un altro, associando uno shortcut ad una combinazione da tastiera.</p>



<p>Il problema maggiore, tuttavia, è che, ad oggi, non esiste un&#8217;azione di shortcut che permetta di effettuare il cambio di layout. Vediamo quindi come risolvere il problema, scomodando il buon caro vecchio Carbon!</p>



<h2 class="wp-block-heading">Carbon è morto, lunga vita a Carbon!</h2>



<p>Gli sviluppatori &#8220;old school&#8221; come il sottoscritto conosceranno sicuramente Carbon. Per i più giovani, sono delle librerie presenti in macOS che permettono di interagire con il sistema operativo che sono date ormai come vecchie e deprecate da anni, ma continuano a vivere tra noi.</p>



<p>Proprio grazie a Carbon riusciamo a definire due script (in Swift), che ci permetteranno di:</p>



<ul><li>ottenere l&#8217;elenco delle sorgenti di input definite nella nostra installazione di macOS</li><li>impostare la sorgente di input desiderata</li></ul>



<p>Di seguito il primo script, che permette di recuperare tutte le sorgenti di input definite in macOS:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">import Carbon

// retrieve all input sources
guard let cfSources = TISCreateInputSourceList(nil, false),
      let sources = cfSources.takeRetainedValue() as? [TISInputSource] else {
    exit(-1)
}

// print all sources as "name - id"
sources.forEach {
    let cfName = TISGetInputSourceProperty($0, kTISPropertyLocalizedName)!
    let cfID = TISGetInputSourceProperty($0, kTISPropertyInputSourceID)!

    let idString = Unmanaged&lt;CFString&gt;.fromOpaque(cfID).takeUnretainedValue() as String
    let nameString = Unmanaged&lt;CFString&gt;.fromOpaque(cfName).takeUnretainedValue() as String
    print("(nameString) - (idString)")
}</code></pre>



<p>Eseguendo questo script, otterrete un elenco di nome / id simile a questo:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">Italian - com.apple.keylayout.Italian-Pro
Emoji &amp; Symbols - com.apple.CharacterPaletteIM
U.S. - com.apple.keylayout.US
com.apple.PressAndHold - com.apple.PressAndHold
EmojiFunctionRowIM_Extension - com.apple.inputmethod.EmojiFunctionRowItem
Dictation - com.apple.inputmethod.ironwood</code></pre>



<p>Nel mio caso, le due righe di interesse sono &#8220;Italian&#8221; e &#8220;U.S.&#8221;, che torneranno in gioco a breve.</p>



<p>Il secondo script ci permette, invece, di settare la sorgente di input attiva:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">import Carbon

let source = "com.apple.keylayout.Italian-Pro"
let filter = [kTISPropertyInputSourceID: source]

// check if the given source is available in the system
guard let cfSources = TISCreateInputSourceList(filter as CFDictionary?, false),
      let sources = cfSources.takeRetainedValue() as? [TISInputSource],
      let firstSource = sources.first else {
    print("Unable to find source '\(source)'.")
    exit(-1)
}

// select the given input source
let result = TISSelectInputSource(firstSource)
exit(result)</code></pre>



<p>Andremo a breve a fare in modo che il parametro <code>source</code> non sia fisso, ma lo renderemo dinamico in base alla nostra necessità.</p>



<h2 class="wp-block-heading">Creiamo lo shortcut</h2>



<p>Abbiamo ora quello che ci serve per creare il comando rapido <strong>Seleziona layout tastiera</strong> che tanto desideriamo.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="580" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-002.png?resize=500%2C580&#038;ssl=1" alt="" class="wp-image-10699" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-002.png?resize=500%2C580&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-002.png?resize=259%2C300&amp;ssl=1 259w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-002.png?resize=768%2C891&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-002.png?w=1047&amp;ssl=1 1047w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="425" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-003.png?resize=500%2C425&#038;ssl=1" alt="" class="wp-image-10700" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-003.png?resize=500%2C425&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-003.png?resize=300%2C255&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-003.png?resize=768%2C653&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-003.png?w=1047&amp;ssl=1 1047w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>



<p><br>Il comando rapido controlla, per prima cosa, se ha ricevuto l&#8217;identificativo di un layout da impostare. Nel caso non sia fornito, richiama lo script #1 per mostrare l&#8217;elenco delle sorgenti di input disponibili e scegliere quella desiderata. Una volta scelta, richiama nuovamente lo script per impostare il layout appena scelto.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="327" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-004.png?resize=500%2C327&#038;ssl=1" alt="" class="wp-image-10701" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-004.png?resize=500%2C327&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-004.png?resize=300%2C196&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-004.png?w=512&amp;ssl=1 512w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>



<p><br>Comodo, ma possiamo fare di meglio. Possiamo definire altri due comandi rapidi, che richiamano il precedente e settano, in automatico, il layout IT o US senza necessità di interazione.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img decoding="async" loading="lazy" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-005.png?resize=500%2C332&#038;ssl=1" alt="" class="wp-image-10702" width="500" height="332" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-005.png?resize=500%2C332&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-005.png?resize=300%2C199&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-005.png?resize=768%2C511&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-005.png?w=862&amp;ssl=1 862w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="329" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-006.png?resize=500%2C329&#038;ssl=1" alt="" class="wp-image-10703" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-006.png?resize=500%2C329&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-006.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-006.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-006.png?w=862&amp;ssl=1 862w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>



<p><br>A questi due shortcut possiamo assegnare anche una scorciatoia da tastiera (rispettivamente <code>Control + Option + Command + I</code> e <code>Control + Option + Command + U</code> nel mio caso) per richiamarli ancora più velocemente.</p>



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



<p>Il tocco finale ce lo fornire l&#8217;app <a href="https://www.lgerckens.de/shortery/">Shortery</a>, che permette di definire dei trigger per i nostri comandi rapidi (e che, per inciso, dovrebbe essere parte integrante di Shortcuts, diamine!).</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" loading="lazy" width="500" height="409" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-007.png?resize=500%2C409&#038;ssl=1" alt="" class="wp-image-10704" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-007.png?resize=500%2C409&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-007.png?resize=300%2C245&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-007.png?resize=768%2C628&amp;ssl=1 768w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2022/04/keyboard-shortcuts-007.png?w=812&amp;ssl=1 812w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></figure></div>



<p>In questo modo, quando la mia tastiera Bluetooth si connette, Shortery esegue il comando rapido <strong>Seleziona layout US</strong>. La sorgente di input viene subito modificata e io sono subito pronto per lavorare! Allo stesso modo, appena si disconnette viene richiamato lo shortcut <strong>Seleziona layout IT</strong> per reimpostare il layout di default italiano.</p>



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



<p>Per chi fosse interessato, vi lascio i link per scaricare i tre comandi rapidi che ho mostrato nel post.</p>



<ul><li><a href="https://www.icloud.com/shortcuts/abe0fa1862d14045a19a95ca6b3e6b85">Seleziona layout tastiera</a></li><li><a href="https://www.icloud.com/shortcuts/7012688193d849a0b31cd105bda9cc6f">Seleziona layout IT <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f1ee-1f1f9.png" alt="🇮🇹" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></li><li><a href="https://www.icloud.com/shortcuts/f6e2e701893f4c3c95f44ba2feb8c7fb">Seleziona layout US <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f1fa-1f1f8.png" alt="🇺🇸" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></li></ul>



<p>Se avete suggerimenti o miglioramenti, fatemelo sapere nei commenti o su <a href="https://mobile.twitter.com/bubidevs">Twitter</a>.</p><p>The post <a href="https://www.bubidevs.net/2022/04/28/come-gestire-una-tastiera-ansi-con-shortcuts-senza-impazzire/">Come gestire una tastiera ANSI con Shortcuts, senza impazzire</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2022/04/28/come-gestire-una-tastiera-ansi-con-shortcuts-senza-impazzire/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10696</post-id>	</item>
		<item>
		<title>&#8220;Protocol Oriented Programming&#8221; per la gestione degli storyboard segue</title>
		<link>https://www.bubidevs.net/2015/08/10/protocol-oriented-programming-per-la-gestione-degli-storyboard-segue/</link>
					<comments>https://www.bubidevs.net/2015/08/10/protocol-oriented-programming-per-la-gestione-degli-storyboard-segue/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Mon, 10 Aug 2015 13:30:46 +0000</pubDate>
				<category><![CDATA[iOS Dev - Tutorial]]></category>
		<category><![CDATA[protocol]]></category>
		<category><![CDATA[segue]]></category>
		<category><![CDATA[storyboard]]></category>
		<category><![CDATA[swift]]></category>
		<guid isPermaLink="false">http://www.bubidevs.net/?p=9799</guid>

					<description><![CDATA[<p>Uno dei problemi ricorrenti nello sviluppo delle applicazioni iOS è la gestione della Storyboard e dei segue. Questi vengono definiti all&#8217;interno dello storyboard stesso, mentre alcune operazioni devono essere poi effettuate via codice. Tipicamente via codice si effettuano passaggi di dati o configurazioni che devono essere fatte a runtime. Situazione attuale Chiunque abbia utilizzato uno storyboard e i suoi segue avrà poi scritto delle istruzioni simili: Giusto come ripasso, il primo metodo permette di invocare un segue che è stato definito nello storyboard (in questo caso &#8216;detailSegue&#8217;), mentre il metodo prepareForSegue:sender: permette di eseguire delle operazioni prima che il segue venga mostrato a video (tipicamente viene utilizzato per passare dei parametri o delle informazioni al controller invocato). Questo codice, però, ha diversi problemi. Per prima cosa gli identifier dei vari controller sono hard-coded, ovvero sono delle stringhe fisse all&#8217;interno del codice, con tutti i problemi del caso (possibili errori di digitazione, poca manutenibilità del software, etc). Una soluzione spesso utilizzata per risolvere (parzialmente) il problema consiste nel definire un enumerativo che contenga i vari segue gestiti via codice: Vediamo ora come migliorare questo metodo. &#8220;Protocol Oriented Programming&#8221; is the way Con Swift 2 è stata introdotta la &#8220;Protocol Oriented Programming&#8221; [&#8230;]</p>
<p>The post <a href="https://www.bubidevs.net/2015/08/10/protocol-oriented-programming-per-la-gestione-degli-storyboard-segue/">“Protocol Oriented Programming” per la gestione degli storyboard segue</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Uno dei problemi ricorrenti nello sviluppo delle applicazioni iOS è la gestione della Storyboard e dei segue. Questi vengono definiti all&#8217;interno dello storyboard stesso, mentre alcune operazioni devono essere poi effettuate via codice. Tipicamente via codice si effettuano passaggi di dati o configurazioni che devono essere fatte a runtime.</p>



<h2 class="wp-block-heading">Situazione attuale</h2>



<p>Chiunque abbia utilizzato uno storyboard e i suoi segue avrà poi scritto delle istruzioni simili:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift line-numbers">@IBAction func doSomething() {
    performSegueWithIdentifier("detailSegue", sender: nil)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "detailSegue" {
        ...
    }
}
</code></pre>



<span id="more-9799"></span>



<p>Giusto come ripasso, il primo metodo permette di invocare un segue che è stato definito nello storyboard (in questo caso &#8216;detailSegue&#8217;), mentre il metodo <code>prepareForSegue:sender:</code> permette di eseguire delle operazioni prima che il segue venga mostrato a video (tipicamente viene utilizzato per passare dei parametri o delle informazioni al controller invocato).</p>



<p>Questo codice, però, ha diversi problemi. Per prima cosa gli <em>identifier</em> dei vari controller sono <em>hard-coded</em>, ovvero sono delle stringhe fisse all&#8217;interno del codice, con tutti i problemi del caso (possibili errori di digitazione, poca manutenibilità del software, etc). Una soluzione spesso utilizzata per risolvere (parzialmente) il problema consiste nel definire un enumerativo che contenga i vari segue gestiti via codice:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift line-numbers">enum SegueIdentifier : String {
   case ShowRed = "ShowRed"
   case ShowBlue = "ShowBlue"
   case ShowMagic = "ShowMagic"
}</code></pre>



<p>Vediamo ora come migliorare questo metodo.</p>



<h2 class="wp-block-heading">&#8220;Protocol Oriented Programming&#8221; is the way</h2>



<p>Con Swift 2 è stata introdotta la &#8220;Protocol Oriented Programming&#8221; che, tra le varie novità che introduce, permette di definire protocolli che abbiamo già della logica definita ed implementata al loro interno. Nella <a href="https://developer.apple.com/videos/wwdc/2015/?id=411">sessione 411 della WWDC 2015</a>, Apple ha mostrato come utilizzare la protocol oriented programming per migliorare la gestione dei segue. Vi consiglio di dare un&#8217;occhiata al video, contiene molti altri spunti interessanti!</p>



<p>Il protocollo che risolverà qualsiasi nostro problema è il seguente:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift line-numbers">protocol SegueHandlerType {
    typealias SegueIdentifier: RawRepresentable
}

extension SegueHandlerType where Self: UIViewController, SegueIdentifier.RawValue == String {
    
    func performSegueWithIdentifier(segueIdentifier: SegueIdentifier, sender: AnyObject?) {
        performSegueWithIdentifier(segueIdentifier.rawValue, sender: sender)
    }
    
    func segueIdentifierForSegue(segue: UIStoryboardSegue) -&gt; SegueIdentifier {
        guard let identifier = segue.identifier, segueIdentifier = SegueIdentifier(rawValue: identifier) else {
            fatalError("Invalid segue identifier")
        }
        return segueIdentifier
    }
}</code></pre>



<p>Vediamo di analizzarlo nei suoi punti chiave. Per prima cosa, definiamo un protocollo <code>SegueHandlerType</code>, in cui al suo interno dichiariamo un typealias <code>SegueIndentifier</code>, che ci servirà per definire gli identificativi dei segue da gestire.</p>



<p>Fatto ciò, creiamo un&#8217;estensione per il protocollo (che, al momento, è ancora del tutto vuoto). L&#8217;estensione ci permette di specificarlo e dettagliarlo:</p>



<ul><li>Il protocollo potrà essere applicato solo a classi di tipo UIViewController (o che derivino da questa)</li><li>Il typealias SegueIdentifier che abbiamo definito in precedenza dovrà avere come valore base il tipo String</li></ul>



<p>I due metodi che vengono definiti dovrebbero già sembrarvi familiari. Il primo ci permette di invocare un segue utilizzando SegueIdentifier come parametro. Il secondo metodo, <code>segueIdentifierForSegue:</code>, merita invece più attenzione. Questo metodo riceve come parametro un oggetto UIStoryboardSegue, da cui andremo a ricavare l&#8217;identificativo del segue che sta per essere visualizzato. Utilizzando il nuovo statement <code>guard</code>, eseguiamo l&#8217;unwrapping dell&#8217;identificativo e convertiamolo in un valore di SegueIdentifier. Se queste due operazioni hanno successo (quindi il segue ha un identificativo valido che viene gestito nel nostro codice) il metodo ritorna il valore definito, altrimenti il metodo lancia un errore che causerà il crash della nostra applicazione. Questa può sembrare una forzatura, ma vi permetterà di scrivere codice più sicuro e robusto, gestendo tutti i segue della vostra applicazione.</p>



<h2 class="wp-block-heading">SegueHandlerType in azione!</h2>



<p>Vediamo ora un esempio di come utilizzare questo protocollo.</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift line-numbers">class HomeViewController: UIViewController, SegueHandlerType {

    enum SegueIdentifier : String {
        case ShowRed = "ShowRed"
        case ShowBlue = "ShowBlue"
        case ShowMagic = "ShowMagic"
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // MARK: - Navigation

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        switch segueIdentifierForSegue(segue) {
        case .ShowRed:
            // logic here
        case .ShowBlue:
            // logic here
        case .ShowMagic:
            // logic here
        }
    }
    
    // MARK: - Actions
    
    @IBAction func doSomethingMagic() {
        performSegueWithIdentifier(.ShowMagic, sender: nil)
    }
}
</code></pre>



<p>L&#8217;enumerativo <code>SegueIdentifier</code> contiene la definizione di tutti i segue associati al controller. Ad ogni valore è associato l&#8217;esatto identificativo utilizzato nello storyboard, che verrà utilizzato dal metodo <code>segueIdentifierForSegue:</code> per ricavare il corretto enumerativo.</p>



<p>All&#8217;interno del metodo <code>prepareForSegue:sender:</code> sarà sufficiente richiamare il metodo <code>segueIdentifierForSegue:</code> e verificare il valore ritornato. Utilizzando uno switch, inoltre, Swift ci obbligherà a gestire tutti i casi possibili, aiutandoci così a realizzare un codice robusto e affidabile.</p>



<p>Il metodo <code>doSomethingMagic</code>, infine, mostra come invocare uno specifico segue utilizzando l&#8217;apposito metodo definito sempre nel protocollo.</p>



<p>That&#8217;s all folks! Una volta provato questo metodo di gestione dei segue vi assicuro che non ne potrete più fare a meno :]</p>



<p>Trovate il protocollo SegueHandlerIdentifier in <a href="https://github.com/BubiDevs/SegueHandlerProtocol">questa repository</a> di GitHub, mentre a <a href="https://developer.apple.com/videos/wwdc/2015/?id=411"><em>questo link</em></a> potete (e dovete!) vedere il video della sessione di apple alla WWDC 2015.</p><p>The post <a href="https://www.bubidevs.net/2015/08/10/protocol-oriented-programming-per-la-gestione-degli-storyboard-segue/">“Protocol Oriented Programming” per la gestione degli storyboard segue</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2015/08/10/protocol-oriented-programming-per-la-gestione-degli-storyboard-segue/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9799</post-id>	</item>
		<item>
		<title>Risolvere il problema di cache della tastiera con UIResponder+KeyboardCache</title>
		<link>https://www.bubidevs.net/2015/07/31/risolvere-il-problema-di-cache-della-tastiera-con-uiresponderkeyboardcache/</link>
					<comments>https://www.bubidevs.net/2015/07/31/risolvere-il-problema-di-cache-della-tastiera-con-uiresponderkeyboardcache/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Fri, 31 Jul 2015 17:00:57 +0000</pubDate>
				<category><![CDATA[iOS Dev - Tips]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[swift]]></category>
		<category><![CDATA[uiresponder]]></category>
		<guid isPermaLink="false">http://www.bubidevs.net/?p=9782</guid>

					<description><![CDATA[<p>C&#8217;è un fastidioso bug in iOS che causa un ritardo piuttosto significativo tra la prima volta che la tastiera viene richiesta e quando questa appare effettivamente su schermo. Il problema si presenta solo al primo avvio della tastiera, che viene poi mantenuta in cache dal sistema. Per risolvere questo problema, ho rilasciato su GitHub creato un&#8217;estensione in Swift, che permette di forzare la procedura di cache della tastiera (la category originale in ObjectiveC è invece disponibile in questa repository). L&#8217;utilizzo è molto semplice: L&#8217;ideale è richiamare la funzione durante un&#8217;operazione già in corso, ad esempio durante una connessione ad un server remoto, in modo da minimizzare l&#8217;attesa dell&#8217;utente. Se avete avuto lo stesso problema o avete soluzioni alternative fatemelo sapere 🙂</p>
<p>The post <a href="https://www.bubidevs.net/2015/07/31/risolvere-il-problema-di-cache-della-tastiera-con-uiresponderkeyboardcache/">Risolvere il problema di cache della tastiera con UIResponder+KeyboardCache</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>C&#8217;è un fastidioso bug in iOS che causa un <em>ritardo</em> piuttosto significativo tra la prima volta che la tastiera viene richiesta e quando questa appare effettivamente su schermo. Il problema si presenta solo al primo avvio della tastiera, che viene poi mantenuta in cache dal sistema.</p>



<p>Per risolvere questo problema, ho rilasciato su <a href="https://github.com/BubiDevs/UIResponder-KeyboardCache">GitHub</a> creato un&#8217;estensione in Swift, che permette di forzare la procedura di cache della tastiera (la category originale in ObjectiveC è invece disponibile in questa <a href="https://github.com/mbrandonw/UIResponder-KeyboardCache">repository</a>).</p>



<span id="more-9782"></span>



<p>L&#8217;utilizzo è molto semplice:</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">UIResponder.cacheKeyboard()</code></pre>



<p>L&#8217;ideale è richiamare la funzione durante un&#8217;operazione già in corso, ad esempio durante una connessione ad un server remoto, in modo da minimizzare l&#8217;attesa dell&#8217;utente.</p>



<p>Se avete avuto lo stesso problema o avete soluzioni alternative fatemelo sapere <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><p>The post <a href="https://www.bubidevs.net/2015/07/31/risolvere-il-problema-di-cache-della-tastiera-con-uiresponderkeyboardcache/">Risolvere il problema di cache della tastiera con UIResponder+KeyboardCache</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2015/07/31/risolvere-il-problema-di-cache-della-tastiera-con-uiresponderkeyboardcache/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9782</post-id>	</item>
		<item>
		<title>Incremento automatico del numero di build in Xcode</title>
		<link>https://www.bubidevs.net/2015/04/07/incremento-automatico-del-numero-di-build-in-xcode/</link>
					<comments>https://www.bubidevs.net/2015/04/07/incremento-automatico-del-numero-di-build-in-xcode/#respond</comments>
		
		<dc:creator><![CDATA[Andrea]]></dc:creator>
		<pubDate>Tue, 07 Apr 2015 09:25:11 +0000</pubDate>
				<category><![CDATA[iOS Dev - Guide]]></category>
		<category><![CDATA[auto increment]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Xcode]]></category>
		<guid isPermaLink="false">http://www.bubidevs.net/?p=9535</guid>

					<description><![CDATA[<p>Su GitHub ho trovato un utile script che permette di eseguire l&#8217;incremento automatico del numero di build in un progetto Xcode. Lo script incrementa ad ogni run il numero di build del progetto (CFBundleVersion), che deve essere impostato in precedenza ad un valore intero iniziale (ad esempio 1). Eccovi lo script in questione: Utilizzo Per utilizzarlo dovrete seguire questi semplici passi: Selezionate il vostro Target in Xcode Spostatevi nel tab Build Phases Selezionate Add build phase -> Add Run Script Phase Nella nuova sezione creata copiate lo script Spostate la nuova fase Run Script subito sotto Link Binaries With Libraries Verificate nell&#8217;Info.plist che il valore di Bundle Version (CFBundleVersion) sia settato ad un intero Ora basterà eseguire in Run del vostro progetto per veder incrementare il numero di build. Questo script può essere molto utile se utilizzare TestFlight, in cui non potete variare il numero di versione dell&#8217;applicazione dopo averla creata sul portale. In questo modo avrete un identificativo univoco e automatico della versione dell&#8217;applicazione che i vostri utenti stanno testando. Sulla repository GitHub è presente anche una seconda versione dello script, che esegue l&#8217;incremento del numero di versione (CFBundleShortVersionString) durante l&#8217;Archive del progetto. Happy coding! :]</p>
<p>The post <a href="https://www.bubidevs.net/2015/04/07/incremento-automatico-del-numero-di-build-in-xcode/">Incremento automatico del numero di build in Xcode</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Su <a href="https://gist.github.com/sekati/3172554#file-xcode-version-bump-sh">GitHub</a> ho trovato un utile script che permette di eseguire l&#8217;incremento automatico del numero di build in un progetto Xcode.</p>



<p>Lo script incrementa ad ogni run il numero di build del progetto (<code>CFBundleVersion</code>), che deve essere impostato in precedenza ad un valore intero iniziale (ad esempio 1).</p>



<p>Eccovi lo script in questione:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"</code></pre>



<span id="more-9535"></span>



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



<p>Per utilizzarlo dovrete seguire questi semplici passi:</p>



<ol><li>Selezionate il vostro Target in Xcode</li><li>Spostatevi nel tab <code>Build Phases</code></li><li>Selezionate <code>Add build phase -> Add Run Script Phase</code><br><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen1.png"><img decoding="async" loading="lazy" width="500" height="350" class="aligncenter size-large wp-image-9539" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen1-500x350.png?resize=500%2C350" alt="Creazione 'Run Script Phase'" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen1.png?resize=500%2C350&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen1.png?resize=300%2C210&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen1.png?w=1113&amp;ssl=1 1113w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></li><li>Nella nuova sezione creata copiate lo script</li><li>Spostate la nuova fase <code>Run Script</code> subito sotto <code>Link Binaries With Libraries</code><br><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen2.png"><img decoding="async" loading="lazy" width="500" height="335" class="aligncenter size-large wp-image-9542" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen2-500x335.png?resize=500%2C335" alt="Inserimento script" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen2.png?resize=500%2C335&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen2.png?resize=300%2C201&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen2.png?w=1252&amp;ssl=1 1252w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></li><li>Verificate nell&#8217;Info.plist che il valore di <code>Bundle Version (CFBundleVersion)</code> sia settato ad un intero<br><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen3.png"><img decoding="async" loading="lazy" width="500" height="185" class="aligncenter size-large wp-image-9543" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen3-500x185.png?resize=500%2C185" alt="Verifica dell'Info.plist" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen3.png?resize=500%2C185&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen3.png?resize=300%2C111&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen3.png?w=739&amp;ssl=1 739w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></li></ol>



<p>Ora basterà eseguire in Run del vostro progetto per veder incrementare il numero di build.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen4.png"><img decoding="async" loading="lazy" width="500" height="246" src="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen4-500x246.png?resize=500%2C246" alt="Incremento del numero di build" class="wp-image-9544" srcset="https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen4.png?resize=500%2C246&amp;ssl=1 500w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen4.png?resize=300%2C147&amp;ssl=1 300w, https://i0.wp.com/www.bubidevs.net/wp-content/uploads/2015/04/autoincrement-screen4.png?w=560&amp;ssl=1 560w" sizes="(max-width: 500px) 100vw, 500px" data-recalc-dims="1" /></a></figure></div>



<p>Questo script può essere molto utile se utilizzare <strong>TestFlight</strong>, in cui non potete variare il numero di versione dell&#8217;applicazione dopo averla creata sul portale. In questo modo avrete un identificativo univoco e automatico della versione dell&#8217;applicazione che i vostri utenti stanno testando.</p>



<p>Sulla <a href="https://gist.github.com/sekati/3172554#file-xcode-version-bump-sh">repository GitHub</a> è presente anche una seconda versione dello script, che esegue l&#8217;incremento del numero di versione (<code>CFBundleShortVersionString</code>) durante l&#8217;Archive del progetto.</p>



<p>Happy coding! :]</p><p>The post <a href="https://www.bubidevs.net/2015/04/07/incremento-automatico-del-numero-di-build-in-xcode/">Incremento automatico del numero di build in Xcode</a> first appeared on <a href="https://www.bubidevs.net">bubidevs</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.bubidevs.net/2015/04/07/incremento-automatico-del-numero-di-build-in-xcode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">9535</post-id>	</item>
	</channel>
</rss>
