martedì 19 aprile 2016

La nuova versione di Delphi: 10.1 Berlin

RAD Studio10.1 Berlin


Da poche ore è stata rilasciata la nuova versione di Delphi/C++/RAD Studio: 10.1 Berlin.

La prima sorpresa nel nome, dopo che sulla roadmap era stata segnalata con il code name "BigBen", ecco invece che il nome ufficiale vira sul teutonico Berlin :-)

Fortunatamente non è l'unica novità da segnalare, anzi in quest'articolo mi soffermerò solo su quelle che ritengo più interessanti, per una lettura completa vi rimando quindi all'elenco delle novità di questa versione.

Nuovo installer

La novità più visibile (anche perchè è la prima che si incontra) è il nuovo installer, completamente rifatto e sensibilmente più veloce e snello.

Opzioni installer

Dopo una prima selezione di percorso di destinazione e alcune opzioni generali, viene installata in pochissimi minuti una prima versione di RAD Studio (funzionante, è possibile infatti usarla come generico editor), in seguito verrà presentata una finestra per selezionare le successive funzionalità che si desidera installare.

Feature Installer: platform selection
Come potete vedere adesso è possibile selezionare in modo chiaro le piattaforme da installare salvando quindi spazio su disco e tempo di installazione.
Con una successiva finestra è poi possibile scegliere di installare alcuni componenti aggiuntivi come l'help, gli esempi ed alcuni componenti tipicamenti distribuiti con Delphi.

Feature Installer: option selection
L'aspetto interessante è che, se in un secondo momento volessimo aggiungere ulteriori piattaforme basterebbe invocare ancora il "Feature Installer/Manager" per aggiungerla alla nostra installazione.
Ricordatevi, una volta terminata l'installazione, di lanciare GetIt per installare componenti opzionali che prima invece erano parte dell'installer (CodeSite, IoT, ecc...)


GetIt Package Manager - IoT components

Personalmente mi sembra un enorme passo in avanti rispetto all'attuale "esperienza di installazione".

Il nuovo installer funziona solamente "online" (per questa versione almeno), se qualcuno avesse bisogno di una installazione offline può usare il vecchio installer che sarà comunque possibile scaricare.

IDE


Floating Form Designer

Un gradito ritorno, adesso Delphi può essere usato anche in modalità "floating" (alla Delphi 7 per intenderci), per abilitare la modalità andate nel menu:
Tools -> Options > Form Designer e togliete il check sull'opzione Embedded Designer

FireUI Live Preview

FireUI Live Preview

Fa la comparsa in 10.1 Berlin un nuovo strumento, la FireUI Live Preview, che serve a vedere come si presenta l'applicazione sui diversi device, tutto ciò mentre si lavora nell'IDE, Un tool davvero molto potente che IMO amplia ulteriormente il divario di Delphi rispetto ad altri strumenti di sviluppo per app mobile per quanto riguarda la progettazione visuale delle viste.

Lo strumento si basa sull'architettura client/server dove l'IDE funge da server accettando connessioni dai client (i vari device) per spedire "live" la form in progettazione.

La tecnologia usata per realizzare questo tool la conosciamo già bene: App Tethering, framework di comunicazione introdotto in Delphi XE6.

High DPI Awareness

L' IDE è adesso completamente DPI-aware. Una feature richiesta a gran voce soprattutto con l'introduzione degli schermi ad altissima densità di pixel (maggiore di 96 PPI)

Bookmark Stack

Questa è un'interessante funzionalità per una navigazione nel codice più potente e allo stesso tempo semplice. E' possibile ora definire una serie di bookmark che verranno visualizzati in una pila (stack)  potendo navigare, con una logica LIFO, su questi bookmark.

Selection Expansion

Da fanatico della tastiera quale sono questa funzionalità mi fa molto piacere, premendo Ctrl-W  è possibile espandere la selezione dall'identificatore, alla riga selezionata, al blocco di statement, all'intera procedura, alla sezione implementation fino ad arrivare all'intera unit. Ho qualche perplessità solo sulla scelta del tasto rapido, visto che in altri sistemi operativi e (anche in molte applicazioni Windows) questo tasto rapido corrisponde alla chiusura della finestra attiva!

Method Toxicity Metrics


Metrica Method Texicity

Altra cosa molto interessante che dovrebbe essere usata a tappeto su tutti i metodi delle nostre applicazioni. E' una metrica che ci suggerisce quando un metodo avrebbe bisogno di refactoring, ovvero di una bella.. rivisitata. La metrica si basa su parametri quali: la lunghezza (numero di righe), il numero di parametri, il numero di livelli di if, dando come risultato un numero che ci dice appunto quanto il metodo sia.. "tossico" :-)

Come tutte le metriche ricordate che cercano solo di aiutarci a migliorare la struttura del nostro codice cercando di farci abbandonare quelle "brutte abitudini" e farci adottare uno stile di scrittura del codice più... sano, quindi, usatele!

Altre modifiche migliorie nell'IDE includono:

  • Structure View Improvements for C++
  • Android Service Improvements
  • Support for Running iOS Ad hoc Applications
  • Customizable info.plist File
  • Design-Time Improvements for Android Smart Watches
  • GetIt Dependencies
  • New Options Page for File Associations
  • New Option to Show Information Messages from the Delphi Compiler


Utilities


The Java2OP.exe tool now works with JDK 8.
New SdkTransform.exe tool. It can be used to convert Objective-C or C++ headers to Delphi headers.

Per tutti quelli che abitualmente si devono interfacciare con codice scritto in altri linguaggi questi due tool sono fondamentali soprattutto (per quanto mi riguarda) il nuovo strumento SdkTransform che (promette) di convertire automaticamente gli header C++ in Pascal. Sono curioso di testarlo, staremo a vedere.

FireMonkey


Supporto Android 6.0

Supporto ufficiale per Android 6 (API Level 23)

Componente TAddressBook


Address Book
 Per le piattaforme mobile è disponibile un nuovo componente (TAddressBook) che permette alle app di accedere alla rubrica :


  • Sending a request to access a device Address Book and getting the access status.
  • Accessing all sources defined in the device Address Book.
  • Fetching all or individual contacts from specified source.
  • Fetching all contacts from specified group(s).
  • Editing or removing existing contacts and groups.
  • Creation of new contacts, creation of new groups.



Improved Style Designer


Style Designer

Altra cosa attesa da tutti gli sviluppatori FireMonkey: un deciso miglioramento allo Style Designer con una finestra di preview, il supporto allo zoom e il supporto alla multi selezione nella vista struttura.

New ListView Item Designer

ListView Item Designer

Sempre su FireMonkey, il controllo ListView ha un nuovo tipo di ItemAppearance: DynamicAppearance che si può usare per personalizzare il contenuto di ogni singolo item. In aggiunta se si clicca con il pulsante destro la ListView nel Form Designer e si seleziona la voce Toggle DesignMode, è possibile visualizzare un editor che consente di editare visualmente i controlli piazzati sugli item.

Altre migliorie/novità sulla piattaforma FireMonkey:

  • Extended Clipboard Support Service
  • Improvement on the Image List Editor
  • TGrid Improvements
  • High DPI Support on Windows
  • Improved Support for Accelerator Keys
  • Support for Extended Font Styles
  • Hint Property Changes
  • Simplified Dialog API


RTL


Miglioramenti su TStrings e TStringList

C'è poco da dire, TStringList è forse la classe più utilizzata di tutta la RTL. E' sempre stata una classe versatilissima adatta a diversi "task" e, anche se ultimamente è stata affiancata dalle altrettanto utili classi: liste di oggetti, dictionary, stack e queue, la string list è indubbiamente quella più usata.

Dalla versione 10.1 Berlin la classe TStrings guadagna queste funzionalità:

  • Metodo AddPair, per aggiungere coppie key-value alla lista potendo anceh usare lo stile "fluent": LList.AddPair('Nome', 'Paolo').AddPair('Cognome': 'Rossi');
  • Proprietà KeyNames, per ottenere una lista di key da una lista di stringhe in formato key-value
  • Proprietà Options, per controllare le opzioni associate alla stringlist
  • Metodo SetStrings, per copiare stringhe da un altro oggetto TStrings. E' simile al metodo Assign ma SetStrings copia solo le stringhe senza toccare le altre proprietà (che invece Assign copia)
  • Proprietà TrailingLineBreak, determina se la proprietà deve contenere un line break alla fine oppure no.
  • Proprietà di sola lettura Updating, indica se la lista è impegnata in una operazione di update
  • Proprietà UseLocale, determina quali funzioni sono usate per il confronto delle stringhe, se True vengono usate AnsiCompareStr/AnsiCompareText, se False vengono invece usate CompareStr/CompareText
  • La classe TStringList ha nuovi costruttori (overloaded) che consentono maggior libertà in fase di inizializzazione

Miglioramenti sulla classe TMemIniFile

Per chi usa la classe TMemIniFile queste sono interessanti aggiunte, vediamole:
  • E' possibile adesso specificare la proprietà CaseSensitive nel costruttore
  • La nuova proprietà Modified indica se il file INI è stato modificato dal suo caricamento da disco.
  • La nuova proprietà AutoSave determina se l'istanza di TMemIniFile deve automaticamente salvare su disco i cambiamenti al momento della sua distruzione.

Supporto buffering per la classe TFileStream

Un grazie a FireDAC che "regala" alla RTL una sua classe, la classe TFDFileStream è stata infatti spostata nella unit System.Classes ed è stata rinominata in TBufferedFileStream.
La classe TBufferedFileStream è un TFileStream discendente che ottimizza sensibilmente brevi letture o scritture consecutive, ovvero, aggiunge il supporto al buffering ai file stream.

Support Bluetooth LE e Beacon su Windows 10


Finalmente la possibilità di usare Bluetooth LE e Beacon anche in Windows 10, per me molto utile soprattutto per testare un'applicazione BluetoothLE/Beacon in Windows senza continuamente passare per il deploy sul device. Il supporto in Windows 10 include:
  • Improved Bluetooth LE Discovery Performance
  • Bluetooth LE Includes New Events to Handle Subscriptions to Characteristics
  • Eddystone Beacon Format Support
  • Improved Beacon Scan Performance
  • TBeaconDevice Component Supports Eddystone Beacon Format

Ottimizzazione delle Regular Expressions

Buonissimo risultato di ottimizzazione delle RegEx (che uso sempre di più nella gestione di stringhe). L'ottimizzazione è sia sul tempo di esecuzione sia sull'uso di memoria!
Se guardate la wiki mostra una prova in cui il tempo di esecuzione di una serie di match passa da 5900ms a 29ms, un guadagno di oltre 300 volte!

Ottimizzazione sulla funzione StringReplace 

Le performance della funzione StringReplace sono state particolarmente ottimizzate, può sembrare un miglioramento insignificante ma in tutti i programmi che ho visto StringReplace è pesantemente utilizzata e quindi... benvenuta a questa miglioria.

Migliorie App Tethering

App Tethering è una interessante tecnologia che, introdotta in Delphi XE6, ha conosciuto release dopo release significanti aggiunte, migliorie e ottimizzazioni. Vediamo quelle in questa release:
  • Due nuovi network adapters che forniscono il supporto multicast per IPv4 e IPv6.
  • E' possibile specificare un range di indirizzi IPv4 come target del remote manager per l'auto discovery.
  • Supporto per il Log filtering. E' adesso possibile dis/abilitare il log per uno specifico item dell'architettura app tethering.
  • I profili possono permettere o meno connessioni da profili remoti.

Comunicazione HTTP, web programming

Le prossime funzionalità sono particolarmente interessanti a tutti quelli che si occupano di programmazione web oppure di framework di comunicazione (come la libreria REST MARS). Nel dettaglio:
  • Supporto per le operazioni asincrone HTTP
  • Supporto per i file ZIP criptati
  • Supporto per i client HTTP per la decompressione automatica di un contenuto "gzippato" spedito dal server
  • Migliorie sulla connessione HTTP
  • Funzioni di URLEncode/URLDecode
  • Le stringhe UTF8String and RawByteString sono adesso supportate anche sulle piattaforme mobile (iOS, Android)


Compilatore


Anche queste aggiunte e migliorie sono "nascoste" ma comunque importantissime, vediamole nel dettaglio.

Miglioramenti delle performance nella compilazione dei generics

I compilatori Delphi hanno visto numerosi cambiamenti che riguardano la gestione dei generici risultanti in diversi miglioramenti:
  • Il parsing dei generici è adesso fino a 3 volte più veloce
  • Le performance dei compilatori DCC32, DCC64 e DCCOSX quando linkano progetti che usano estensivamente i generici estensivamente sono decisamente aumentate.

Attributi supportati da tutti i compilatori

Adesso tutti i compilatori Delphi supportano i seguenti attributi:
  • unsafe: permette di annotare il risultato di una funzione per non farla gestire al sistema ARC
  • volatile: utile per annotare un campo di classe che possono essere cambiati dall'interno di differenti thread (il codice quindi per questi campi non viene ottimizzato dal compilatore copiando il contenuto nei registri CPU)
  • weak: Utile per annotare un campo come una "weak reference" ovvero che non incrementa il reference count del'oggetto a cui punta

Modifica su class e record helper

Attenzione! Questa modifica potrebbe avere un impatto sul codice già scritto se avete usato (o usato da librerie impiegate da voi) i class e record helper. Dalla versione 10.1 Berlin infatti gli helper non hanno più visibilità siu membri privati. A mio avviso una chiusura di una falla logica (non sicuramente un bug vero e proprio) che rischiava di far nascere codice "sporco".

Altre migliorie sui compilatori Delphi

  • The memory allocated to conditional symbols has been extended from 256 bytes to 4096 bytes.
  • The size of Extended is now 16 bytes to be compatible with BCCOSX

EMS (Enterprise Mobility Services)

EMS System Diagram

EMS sta conoscendo un'evoluzione costante da quando è stato introdotto e, pur avendo una policy di deployment che non è graditissima alla stragrande maggioranza dei programmatori Delphi, dobbiamo dire che tecnologicamente si appresta a diventare un framework davvero interessante. Le aggiunte e migliorie in questa release;
  • Apache Server Support
  • Cross-Domain API Calls to the EMS Server
  • EMS EdgeModules
  • EMS EdgeModules Resource
  • ThingPoints Overview
  • EMS API Resource
  • Custom API Documentation

(Mie) Opinioni sulla release 10.1 Berlin


Ovviamente adesso posso giudicare solo sulla carta tutte queste novità e funzionalità, è chiaro che il responso definitivo verrà espresso dopo un adeguato uso di questa versione.
Ma... vedendo la lista di novità e l'impegno effettivo nel bug fixing e in una generale revisione anche di dettagli (ma sempre importanti) si denota un'attenzione reale verso il prodotto e non solo focalizzata sulle "selling features". Date uno sguardo anche all'impressionante lista di bug fissati in questa release!

Concludo la recensione della release 10.1 Berlin puntandovi al documento della feature matrix per avere un dettaglio (anche troppo) su tutte le funzionalità divise a seconda della edition (Starter, Professional, Enterprise) in vostro possesso.

Embarcadero focalizzata sugli sviluppatori

L'ultimo paragrafo è relativo ad un recente annuncio.

Embarcadero, da poco acquisita da IDERA (leggi qui l'articolo), dopo aver svelato la roadmap per i prossimi mesi annuncia di focalizzarsi esclusivamente sugli strumenti di sviluppo (Delphi, C++ Builder, RAD Studio, Interbase) mentre gli strumenti database entreranno a far parte del portafoglio prodotti di IDERA.

Per prevenire eventuali dubbi, faccio notare che per prodotti database non si intendono FireDAC o altri componenti DB per Delphi/C++ Builder ma solo i prodotti originali di Embarcadero: E/R Studio, DB Change Manager, ecc...

Speriamo che questa svolta consenta ad Embarcadero di concentrarsi su Delphi e C++ rilasciando versioni sempre più stabili e ricche di funzionalità.


Un saluto.