Se da terminale avete riscontrato questo errore provando ad eseguire git (o altro software di sviluppo), potete risolvere velocemente.
L’errore si verifica, alcune volte, dopo aver aggiornato macOS o Xcode. Indica che è necessario installare gli strumenti di sviluppo a linea di comando.
È sufficiente digitare il seguente comando sul terminale:
xcode-select --install
e attendere il termine del download e dell’installazione.
Breve antefatto: mi chiedono di generare dei qrCode 600×600 per una lista di URL. Apro Xcode, creo un nuovo Playground e in dieci minuti preparo un programmino in Swift 😚
Generare un qrCode con CoreImage è questioni di pochi minuti:
import CoreImage
import CoreImage.CIFilterBuiltins
let qrCodeFilter = CIFilter.qrCodeGenerator()
qrCodeFilter.setValue("Hello,World!".data(using: .utf8, allowLossyConversion: false), forKey: "inputMessage")
if let rawQRCode = qrCodeFilter.outputImage {
let scale = 600 / rawQRCode.extent.width
let qrCodeOutput = rawQRCode.transformed(by: CGAffineTransform(scaleX: scale, y: scale))
//salviamo un png nella home dell'utente
//per iOS utilizzare un percorso diverso... homeDirectoryForCurrentUser è disponibile solo su macOS
try! CIContext().writePNGRepresentation(of: qrCodeOutput, to: FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent("qrcode.png"), format: CIFormat.RGBA16, colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!, options: [:])
}
Ognuno di questi tipi ha un range di valori validi. MySQL gestisce questi dati in un formato specifico, ma accetta una varietà di formati in ingresso che è in grado di interpretare e convertire correttamente. In alternativa, vengono fornite specifiche funzioni per la conversione dei dati, come ad esempio STR_TO_DATE().
Il formato di questi tipi di dato è il seguente:
TIPO
FORMATO
RANGE
DATETIME
YYYY-MM-DD hh:mm:ss[.fraction]
da '1000-01-01 00:00:00' a '9999-12-31 23:59:59'
DATE
YYYY-MM-DD
da '1000-01-01' a '9999-12-31'
TIME
hh:mm:ss[.fraction]
da '-838:59:59.000000' a'838:59:59.000000'
YEAR
YYYY
da 1901 a 2155
TIMESTAMP
YYYY-MM-DD hh:mm:ss[.fraction]
da '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC
Il formato TIMESTAMP memorizza il dato in formato “unix type”: il tempo viene rappresentato come il numero di secondi trascorsi dalla mezzanotte del 01 gennaio 1970 (epoch) UTC. A seconda della versione del DBMS, è disponibile una risoluzione in microsecondi del timestamp.
Questa rappresentazione offre il vantaggio di gestire la data come numero intero e in modo indipendente dai fusi orari. MySQL ha funzioni dirette per convertire il formato.
Usare TIMESTAMP per data creazione e modifica del record
Il tipo TIMESTAMP si rileva utile per memorizzare in specifiche colonne la data di creazione di un record e la data dell’ultima modifica in maniera automatica. Per fare questo è possibile definire due colonne di questo tipo:
create table test
(
...
date_created timestamp default current_timestamp() not null,
last_updated timestamp default current_timestamp() not null on update current_timestamp()
);
In questo modo, ogni volta che verrà aggiunto un record alla tabella i campi date_created e last_updated verranno valorizzati con il timestamp corrente. In caso di modifica del record il campo last_updated verrà automaticamente aggiornata con il timestamp della modifica.
Immaginiamo una tabella con un campo datetime. Se volessimo filtrare la nostra query select per i record dell’anno passato possiamo procedere nel seguente modo:
select * from table t where YEAR(t.date) = YEAR(current_date - INTERVAL 1 YEAR);
Abbiamo utilizzato le seguenti funzioni:
YEAR(dt) questa funzione restituisce un intero rappresentante l’anno del paremetro date o datetimedt
CURRENT_DATE() questa funzione restituisce la data corrente nel formato 'YYYY-MM-DD'
INTERVAL questa funzione meriterebbe un articolo intero. È usata per effettuare calcoli con DATE e TIME. La sintassi è la seguente: INTERVAL expr unit
Naturalmente, modificando il valore dell’espressione INTERVAL 1 YEAR è possibile selezionare anche record con anni precedenti.
NB: è possibile anche fare a meno di INTERVAL e usare una semplice sottrazione:
select * from table t where YEAR(t.date) = YEAR(current_date)-1;
ma volevo approfittarne per introdurre l’espressione INTERVAL di cui parlerò con maggiori dettagli in un prossimo articolo.
Immaginiamo una tabella con un campo datetime. Se volessimo filtrare la nostra query select per i record dell’anno corrente possiamo procedere nel seguente modo:
select * from table t where YEAR(t.date) = YEAR(current_date);
Abbiamo utilizzato le seguenti funzioni:
YEAR(dt) questa funzione restituisce un intero rappresentante l’anno del paremetro date o datetimedt
CURRENT_DATE() questa funzione restituisce la data corrente nel formato 'YYYY-MM-DD'
PHP 7.4 è la prossima minor release di PHP 7. Sarà rilasciata alla General Availability a fine novembre 2019.
Si tratta di una minor release della versione 7, non ci aspettiamo quindi grosse novità. La versione PHP 8 sarà la prossima milestone che promette diverse rivoluzioni, in primis l’inclusione di JIT che incrementerà notevolmente le prestazioni di PHP.
Novità di PHP 7.4
Attualmente è già disponibile la beta 1 e ho già fatto diversi test. Il rilascio per la GA è previsto per il 28 nove,bre.
L’elenco completo di tutte le funzionalità della nuova versione è, come sempre, disponibile su php.net in questa pagina.
Le novità principali sono:
Core
Array Spread Operator
Arrow Function (closure) con implicit by-value scope binding
money_format() (usare NumberFormatter per formattare un numero come valuta)
I benchmark hanno già dimostrato come la versione 7 di PHP è nettamente più performante di tutte le altre versioni. Chi non lo ha fatto, dovrebbe fin da ora passare a PHP 7.x per ottenerne tutti i vantaggi.
Eventuale lavoro di migrazione del codice alla nuova versione, sarà ampiamente ripagato dal guadagno di prestazioni che si otterrà. Inoltre, si sarà già pronti per le succose novità di PHP 8!
Qualche giorno fa ho letto un articolo molto interessante: “How Memory Leaks Happen in a Java Application”.
Uno dei vantaggi del linguaggio Java è quello di gestire la deallocazione degli oggetti in maniera automatica attraverso il “garage collector”. In particolari circostanze questa gestione può fallire e possono verificarsi dei memory leak.
In informatica, un memory leak (“perdita o fuoriuscita di memoria”) è un particolare tipo di consumo non voluto di memoria dovuto alla mancata deallocazione dalla stessa, di variabili/dati non più utilizzati da parte dei processi. (Wikipedia)
I memory leak non dipendono da una errata implementazione del garbage collector, ma da un uso improprio degli oggetti costruiti dall’applicazione. È un classico problema di PEBCAK (Problem Exists Between Chair And Keyboard), ed è tra i più difficili da diagnosticare.
Per alcuni il Protocol Oriented Programming è solo un reinventare l’acqua calda, asserendo che le classi astratte e le interfacce non sono nulla di nuovo o che si tratta semplicemente di una buzzword coniata da Apple.
In effetti è stata proprio Apple nel World Wide Developers Conference (WWDC) del 2015 a dire che con Swift hanno “realizzato il primo linguaggio protocol-oriented”. (tradotto testualmente da “we made the first protocol-oriented programming language”).
Cos’è il Protocol Oriented Programming? È davvero così rivoluzionario? Quali sono i suoi punti deboli?
JSON è ormai utilizzato diffusamente come formato di interscambio dati su internet. È molto comune per uno sviluppatore lavorare con JSON, specie se si tratta di app per smartphone.
In Swift 4 è stato introdotto il protocol Codable come parte del framework Foundation e serializzare o deserializzare un oggetto in JSON richiede tre linee di codice ;).
Le nuove API disponibili nel framework Foundation sono state presentate al WWDC 2017, vi consiglio di guardare il video a questo link: What’s New in Foundation (le API di cui sto parlando vengono illustrate dal minuto 23 in poi).
Vediamo come è diventato immediato e semplice convertire un oggetto in JSON e viceversa.