Preferì rinunciare alla vita piuttosto che abiurare se stesso…

Era un uomo dalle mille anime, Alan Turing. Matematico, logico, crittografo, antesignano dell’informatica moderna. Uno spirito libero dall’intelligenza fuori dal comune. Peccato però che vivesse nell’Inghilterra perbenista degli anni ’50, troppo bigotta per comprendere la sua geniale complessità.
Di giorno lavorava come scienziato per conto dei servizi segreti britannici, contribuendo in modo decisivo a sconfiggere i nazisti grazie alla decrittazione del famigerato codice Enigma. La notte inseguiva i suoi istinti, a caccia di fugaci avventure omosessuali tra locali malfamati e parchi cittadini. Una pericolosa doppiezza, che alla fine gli costò la carriera e la vita.
Le sue due anime coesistevano faticosamente: razionalità e trasgressione, logica e istinto. Di giorno Turing era celebrato come eroe della patria, la mente matematica che aveva cambiato le sorti della guerra. Di notte braccato come deviante, reietto da nascondere nell’ombra. Un paradosso insostenibile, che lo logorò fino alla disperazione.
La fama del genio e l’emarginazione del diverso: due facce della stessa medaglia d’oro che gli avevano appuntato sul petto. Onorificenza amara, che non gli risparmiò l’onta del processo né l’obbligo dell’orribile “cura” a base di estrogeni. Un martirio davvero poco logico, per uno come lui.
Povero Turing, talmente avanti da non capire la meschinità del suo tempo. Vedeva solo bellezza nella matematica e nei corpi maschili, senza curarsi di pregiudizi e perbenismi. Avrebbe meritato di vivere nel futuro che aveva intuito, quello dei computer e delle menti aperte. Invece si ritrovò schiacciato dall’ottusità passatista, lui che guardava lontano.
Alla fine la sua logica luminosa soccombette alle tenebre dell’ignoranza. Si arrese allo stupido binomio del suo tempo: genio o omosessuale, tertium non datur. Preferì rinunciare alla vita piuttosto che abiurare se stesso. Una sconfitta per la ragione e per l’amore, ma forse una vittoria per la sua dignità.
Oggi Turing è riabilitato e la sua memoria risplende finalmente integra. Ma la ferita inflitta alla logica resta aperta. Perché tanta irrazionalità fu riversata su un uomo che aveva fatto della razionalità la sua divinità? Misteri della mente umana, che neppure la logica più fine potrà mai decifrare fino in fondo.

Tracciare il progresso dell’anno corrente in SwiftUI

Nell’ambito dello sviluppo di applicazioni, esistono numerose situazioni in cui potrebbe essere utile visualizzare una progress bar per tracciare il progresso di un’attività. In questo articolo, discuteremo come abbiamo implementato una progress bar in SwiftUI che traccia il progresso dell’anno corrente, mostrando non solo una barra di progresso visiva, ma anche una rappresentazione testuale che può essere facilmente copiata negli appunti.

Parte 1: Scelte progettuali

Il nostro obiettivo principale era creare un’app che potesse tracciare il progresso dell’anno corrente in modo visivo e testuale. Per realizzare ciò, abbiamo utilizzato SwiftUI, uno dei framework più potenti di Apple per lo sviluppo di interfacce utente. Ecco le variabili di stato che abbiamo definito all’inizio del nostro ContentView:

@State private var progress: Float = 0.0
@State private var monthsElapsed: Int = 0
@State private var daysElapsed: Int = 0
@State private var hoursElapsed: Int = 0
@State private var minutesElapsed: Int = 0
@State private var secondsElapsed: Int = 0

Queste variabili rappresentano il progresso dell’anno corrente e le unità di tempo trascorse dall’inizio dell’anno. Utilizzando @State, SwiftUI rileva automaticamente quando queste variabili vengono aggiornate e aggiorna l’interfaccia utente di conseguenza.

Parte 2: Calcolo del progresso

Il cuore del nostro codice risiede nella funzione calculateProgress(). Questa funzione calcola l’intervallo di tempo dall’inizio dell’anno ad ora, e lo divide per l’intervallo di tempo totale dell’anno per ottenere il progresso come un valore frazionario. Questo valore viene poi moltiplicato per 100 per ottenere una percentuale.

let elapsedSeconds = now.timeIntervalSince(startOfYear)
let totalSeconds = endOfYear.timeIntervalSince(startOfYear)
progress = Float(elapsedSeconds / totalSeconds)

Oltre a ciò, calculateProgress() calcola anche il numero di mesi, giorni, ore, minuti e secondi trascorsi dall’inizio dell’anno. Fa ciò utilizzando il metodo dateComponents(_:from:to:) dell’oggetto Calendar.current.

Parte 3: Visualizzazione del progresso

Per visualizzare il progresso, abbiamo utilizzato la classe ProgressView di SwiftUI. Questa vista è configurata per mostrare il progresso come una barra di avanzamento, con il valore del progresso impostato sul valore della variabile di stato progress.

ProgressView(value: progress)
    .progressViewStyle(LinearProgressViewStyle(tint: .blue))
    .frame(width: UIScreen.main.bounds.width * 0.8)
    .padding(.bottom, 20)

Oltre alla progress bar, abbiamo aggiunto delle etichette per mostrare il numero di mesi, giorni, ore, minuti e secondi trascorsi dall’inizio dell’anno.

Parte 4: Generazione di una barra di avanzamento testuale

Abbiamo anche voluto dare agli utenti la possibilità di copiare una rappresentazione testuale della progress bar negli appunti. Per realizzare ciò, abbiamo aggiunto un pulsante alla barra di navigazione che genera una stringa di progress bar quando viene premuto.

let filledSection = String(repeating: "▓", count: Int(progress * 20))
let unfilledSection = String(repeating: "░", count: 20 - Int(progress * 20))
let progressBarString = "\(filledSection)\(unfilledSection) \(Int(progress * 100))%"

Questo codice genera una stringa di progress bar con 20 caratteri totali. Il numero di “▓” nella stringa corrisponde alla percentuale del progresso.

Parte 5: Copia della barra di avanzamento negli appunti

Per copiare la barra di avanzamento negli appunti, abbiamo utilizzato il framework UIKit di Apple. Poiché UIKit non è nativamente compatibile con SwiftUI, abbiamo dovuto usare UIPasteboard.general.string per interagire con gli appunti.

Button(action: {
    UIPasteboard.general.string = progressBarString
}) {
    Image(systemName: "doc.on.doc")
}

Con questo codice, ogni volta che l’utente preme il pulsante, la stringa di progress bar viene copiata negli appunti, pronta per essere incollata in un’altra app o condivisa con qualcun altro.

Questo un esempio della barra testuale generata dal codice:

▓▓▓▓▓▓▓░░░░░░░ 50%

Qui, il reposity della app su GitHub.