In Visual Studio 2010 è apparso un nuovo linguaggio: F#. Volete sapere cos'è, da dove nasce e come si scrive in F# ? Ve lo spiegherà il nostro illustre socio Marco Parenzan, che non dimenticherà di illustrarvi perchè in tanti stanno iniziando ad apprezzarlo ancor più del C#... il che è tutto dire!
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...Commit University
Vuoi migliorare la gestione dei progetti a lungo termine con team multidisciplinari e prendere decisioni rischiose in modo sicuro e ponderato? Non perderti il nostro workshop gratuito!
Antonio Dell’Ava, Frontend Developer di eDreams Odigeo, condividerà strategie per aiutarti a ottimizzare la collaborazione nel tuo team, scegliere gli strumenti giusti per ogni situazione e garantire l’evoluzione del progetto nel tempo
Enabling DevOps for Machine Learning with Azure PipelinesLuca Milan
Slides dell'evento DevOps Heroes 2019 a Parma.
Al giorno d'oggi il "Machine Learning" (ML) estende le capacità di tanti software in centinaia di campi applicativi, dalla medicina agli istituti finanziari. Creare modelli predittivi realistici richiede però uno sforzo, da parte di tante persone con differenti background: da una parte, infatti, ci sono i team di sviluppo (Developers / DevOps) e dall'altra i team di "Data Science".
Per questa ragione, la vera sfida che abbiamo di fronte oggi, consiste nel saper rilasciare gli "Artefatti di ML" in maniera automatizzata, riproducibile ed affidabile sfruttando tutte le pratiche DevOps.
In questo talk illustreremo, con l'ausilio di una demo realizzata con il framework ML.NET, i passi che portano alla creazione di pipelines ad "altissima automazione" in grado di gestire le più comuni operazioni di un progetto di ML: dal training alla distribuzione del modello di apprendimento ai diversi "Consumers".
Local SEO & Google My Business per il turismoValerio Tavano
Vuoi farti trovare da nuovi clienti ed ottenere ottimi risultati su Google? Guarda la registrazione del webinar gratuito per scoprire cos'è Google My Business, imparare a registrare gratuitamente la tua attività sul motore di ricerca e pubblicarla su Google maps.
Guarda la registrazione del webinar:
http://bit.ly/freewebinar_LocalSEO
"Come posizionare la tua attività su Google"
Guest Speaker: Valerio Tavano
• Google per il turismo
• Conoscere la prima pagina
• Trovare le parole chiavi più importanti
• Che cos'è Google my business
• Come pubblicare la tua scheda su Maps
• Monitorare l'andamento della tua scheda
• E molto altro ancora
Speaker: Valerio Tavano
Consulente per il marketing e la comunicazione con esperienze in Italia e in UK. Specialista in strategie digitali applicate al turismo, SEO, SEM e Social Media per aziende e liberi professionisti. Gestisce oltre 50 siti web, blog e pagine social per i suoi clienti. Ha curato lo sviluppo commerciale di Tikidoo, la startup che offre visite guidate pensate appositamente per le famiglie che viaggiano con bambini dai 3 ai 14 anni. Scopri di più su valeriotavano.com
Ingegnere orientato alla progettazione di sistemi IT complessi con ottime conoscenze analitiche, contabili e di processo in particolare in ambito Business Intelligence / Data Warehouse, CPM e CRM Analitico.
Consolidata esperienza nella raccolta dei requisiti business intervistando i key user, nel disegno di processi aziendali e negli studi di fattibilità svolgendo un ruolo di facilitatore tra il business e l’IT interno.
Capace nel coordinare team misti con fornitori di terze parti, nel pianificare i progetti controllandone l’avanzamento lavori e rispettandone i tempi/costi e nel gestire le richieste di change da parte degli utenti.
OpenLabor è un'applicazione per sistemi Android che utilizza i dataset della Provincia di Roma relativi a offerte di Lavoro e Formazione. L'applicazione permette all'utente di ricercare le offerte del proprio territorio, selezionare quelle di interesse, candidarsi e condividerle tramite i social network. Ancor più interessante è il fatto che la app non solo permette di visualizzare in modo semplice gli open data della regione ma svolge un lavoro di Indicizzazione e raffinamento dei dati attraverso analisi linguistiche e metadati. Le offete di lavoro sono incrociate con le categorie professionali indicate da ISTAT (rif. 2011) ed un rete semantica basata su MultiWordnet permette all'utenti di avere sempre risultati pertinenti alle proprie ricerche.
Questa elaborazione profonda dei dati è ciò che consente di aggiungere un valore aggiunto ai dati aperti forniti dalla regione sia nei confronti dell'utente finale che per altri sviluppatori e imprese.
Nello sviluppo di OpenLabor vi è la volontà infatti di fornire un servizio utile all'intera comunità: non solo l'utente sarà agevolato nella ricerca del lavoro (o formazione), i prgrammatori potranno sfruttare le capacità di ricerca e analisi di OpenLaboro per proporre nuovi servizi ed infine le Pubbliche Amministrazioni potranno ricavare utili statistiche sulle offerte di lavoro e formazione, e sulle esigenze dei cittadini del proprio territorio.
Programmiamo iPhone e iPad (e non solo!) con MonoTouchStefano Ottaviani
MonoTouch ha delle caratteristiche che lo differenziano rispetto agli altri framework per lo sviluppo su iPhone / iPad: vediamo quali sono, che vantaggi ci possono dare e in che modo possono rivelarsi più divertenti :), in particolar modo nell'ambito delle applicazioni LOB (Line of Business).
Anche se MonoTouch non è direttamente cross-platform, cercheremo inoltre di dare uno sguardo a come organizzare i nostri progetti in modo tale da farli girare anche su altri device, in particolare Android, Windows Phone 7, e perché no, desktop e netbook, col minor sforzo possibile.
Normalmente parliamo e presentiamo Azure IoT (Central) con un taglio un po' da "maker". In questa sessione, invece, vediamo di parlare allo SCADA engineer. Come si configura Azure IoT Central per il mondo industriale? Dov'è OPC/UA? Cosa c'entra IoT Plug & Play in tutto questo? E Azure IoT Central...quali vantaggi ci da? Cerchiamo di rispondere a queste e ad altre domande in questa sessione...
Allo sviluppatore Azure piacciono i servizi PaaS perchè sono "pronti all'uso". Ma quando proponiamo le nostre soluzioni alle aziende, ci scontriamo con l'IT che apprezza gli elementi infrastrutturali, IaaS. Perchè non (ri)scoprirli aggiungendo anche un pizzico di Hybrid che con il recente Azure Kubernetes Services Edge Essentials si può anche usare in un hardware che si può tenere anche in casa? Quindi scopriremo in questa sessione, tra gli altri, le VNET, le VPN S2S, Azure Arc, i Private Endpoints, e AKS EE.
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...Commit University
Vuoi migliorare la gestione dei progetti a lungo termine con team multidisciplinari e prendere decisioni rischiose in modo sicuro e ponderato? Non perderti il nostro workshop gratuito!
Antonio Dell’Ava, Frontend Developer di eDreams Odigeo, condividerà strategie per aiutarti a ottimizzare la collaborazione nel tuo team, scegliere gli strumenti giusti per ogni situazione e garantire l’evoluzione del progetto nel tempo
Enabling DevOps for Machine Learning with Azure PipelinesLuca Milan
Slides dell'evento DevOps Heroes 2019 a Parma.
Al giorno d'oggi il "Machine Learning" (ML) estende le capacità di tanti software in centinaia di campi applicativi, dalla medicina agli istituti finanziari. Creare modelli predittivi realistici richiede però uno sforzo, da parte di tante persone con differenti background: da una parte, infatti, ci sono i team di sviluppo (Developers / DevOps) e dall'altra i team di "Data Science".
Per questa ragione, la vera sfida che abbiamo di fronte oggi, consiste nel saper rilasciare gli "Artefatti di ML" in maniera automatizzata, riproducibile ed affidabile sfruttando tutte le pratiche DevOps.
In questo talk illustreremo, con l'ausilio di una demo realizzata con il framework ML.NET, i passi che portano alla creazione di pipelines ad "altissima automazione" in grado di gestire le più comuni operazioni di un progetto di ML: dal training alla distribuzione del modello di apprendimento ai diversi "Consumers".
Local SEO & Google My Business per il turismoValerio Tavano
Vuoi farti trovare da nuovi clienti ed ottenere ottimi risultati su Google? Guarda la registrazione del webinar gratuito per scoprire cos'è Google My Business, imparare a registrare gratuitamente la tua attività sul motore di ricerca e pubblicarla su Google maps.
Guarda la registrazione del webinar:
http://bit.ly/freewebinar_LocalSEO
"Come posizionare la tua attività su Google"
Guest Speaker: Valerio Tavano
• Google per il turismo
• Conoscere la prima pagina
• Trovare le parole chiavi più importanti
• Che cos'è Google my business
• Come pubblicare la tua scheda su Maps
• Monitorare l'andamento della tua scheda
• E molto altro ancora
Speaker: Valerio Tavano
Consulente per il marketing e la comunicazione con esperienze in Italia e in UK. Specialista in strategie digitali applicate al turismo, SEO, SEM e Social Media per aziende e liberi professionisti. Gestisce oltre 50 siti web, blog e pagine social per i suoi clienti. Ha curato lo sviluppo commerciale di Tikidoo, la startup che offre visite guidate pensate appositamente per le famiglie che viaggiano con bambini dai 3 ai 14 anni. Scopri di più su valeriotavano.com
Ingegnere orientato alla progettazione di sistemi IT complessi con ottime conoscenze analitiche, contabili e di processo in particolare in ambito Business Intelligence / Data Warehouse, CPM e CRM Analitico.
Consolidata esperienza nella raccolta dei requisiti business intervistando i key user, nel disegno di processi aziendali e negli studi di fattibilità svolgendo un ruolo di facilitatore tra il business e l’IT interno.
Capace nel coordinare team misti con fornitori di terze parti, nel pianificare i progetti controllandone l’avanzamento lavori e rispettandone i tempi/costi e nel gestire le richieste di change da parte degli utenti.
OpenLabor è un'applicazione per sistemi Android che utilizza i dataset della Provincia di Roma relativi a offerte di Lavoro e Formazione. L'applicazione permette all'utente di ricercare le offerte del proprio territorio, selezionare quelle di interesse, candidarsi e condividerle tramite i social network. Ancor più interessante è il fatto che la app non solo permette di visualizzare in modo semplice gli open data della regione ma svolge un lavoro di Indicizzazione e raffinamento dei dati attraverso analisi linguistiche e metadati. Le offete di lavoro sono incrociate con le categorie professionali indicate da ISTAT (rif. 2011) ed un rete semantica basata su MultiWordnet permette all'utenti di avere sempre risultati pertinenti alle proprie ricerche.
Questa elaborazione profonda dei dati è ciò che consente di aggiungere un valore aggiunto ai dati aperti forniti dalla regione sia nei confronti dell'utente finale che per altri sviluppatori e imprese.
Nello sviluppo di OpenLabor vi è la volontà infatti di fornire un servizio utile all'intera comunità: non solo l'utente sarà agevolato nella ricerca del lavoro (o formazione), i prgrammatori potranno sfruttare le capacità di ricerca e analisi di OpenLaboro per proporre nuovi servizi ed infine le Pubbliche Amministrazioni potranno ricavare utili statistiche sulle offerte di lavoro e formazione, e sulle esigenze dei cittadini del proprio territorio.
Programmiamo iPhone e iPad (e non solo!) con MonoTouchStefano Ottaviani
MonoTouch ha delle caratteristiche che lo differenziano rispetto agli altri framework per lo sviluppo su iPhone / iPad: vediamo quali sono, che vantaggi ci possono dare e in che modo possono rivelarsi più divertenti :), in particolar modo nell'ambito delle applicazioni LOB (Line of Business).
Anche se MonoTouch non è direttamente cross-platform, cercheremo inoltre di dare uno sguardo a come organizzare i nostri progetti in modo tale da farli girare anche su altri device, in particolare Android, Windows Phone 7, e perché no, desktop e netbook, col minor sforzo possibile.
Normalmente parliamo e presentiamo Azure IoT (Central) con un taglio un po' da "maker". In questa sessione, invece, vediamo di parlare allo SCADA engineer. Come si configura Azure IoT Central per il mondo industriale? Dov'è OPC/UA? Cosa c'entra IoT Plug & Play in tutto questo? E Azure IoT Central...quali vantaggi ci da? Cerchiamo di rispondere a queste e ad altre domande in questa sessione...
Allo sviluppatore Azure piacciono i servizi PaaS perchè sono "pronti all'uso". Ma quando proponiamo le nostre soluzioni alle aziende, ci scontriamo con l'IT che apprezza gli elementi infrastrutturali, IaaS. Perchè non (ri)scoprirli aggiungendo anche un pizzico di Hybrid che con il recente Azure Kubernetes Services Edge Essentials si può anche usare in un hardware che si può tenere anche in casa? Quindi scopriremo in questa sessione, tra gli altri, le VNET, le VPN S2S, Azure Arc, i Private Endpoints, e AKS EE.
Static abstract members nelle interfacce di C# 11 e dintorni di .NET 7.pptxMarco Parenzan
Did interfaces in C# need evolution? Maybe yes. Are they violating some fundamental principles? We see. Are we asking for some hoops? Let's see all this by telling a story (of code, of course)
Azure Synapse Analytics for your IoT SolutionsMarco Parenzan
Let's find out in this session how Azure Synapse Analytics, with its SQL Serverless Pool, ADX, Data Factory, Notebooks, Spark can be useful for managing data analysis in an IoT solution.
Power BI Streaming Data Flow e Azure IoT Central Marco Parenzan
Dal 2015 gli utilizzatori di Power BI hanno potuto analizzare dati in real-time grazie all'integrazione con altri prodotti e servizi Microsoft. Con streaming dataflow, si porterà l'analisi in tempo reale completamente all'interno di Power BI, rimuovendo la maggior parte delle restrizioni che avevamo, integrando al contempo funzionalità di analisi chiave come la preparazione dei dati in streaming e nessuna creazione di codice. Per vederlo in funzione, studieremo un caso specifico di streaming come l'IoT con Azure IoT Central.
Power BI Streaming Data Flow e Azure IoT CentralMarco Parenzan
Dal 2015 gli utilizzatori di Power BI hanno potuto analizzare dati in real-time grazie all'integrazione con altri prodotti e servizi Microsoft. Con streaming dataflow, si porterà l'analisi in tempo reale completamente all'interno di Power BI, rimuovendo la maggior parte delle restrizioni che avevamo, integrando al contempo funzionalità di analisi chiave come la preparazione dei dati in streaming e nessuna creazione di codice. Per vederlo in funzione, studieremo un caso specifico di streaming come l'IoT con Azure IoT Central.
Power BI Streaming Data Flow e Azure IoT CentralMarco Parenzan
Since 2015, Power BI users have been able to analyze data in real-time thanks to the integration with other Microsoft products and services. With streaming dataflow, you'll bring real-time analytics completely within Power BI, removing most of the restrictions we had, while integrating key analytics features like streaming data preparation and no coding. To see it in action, we will study a specific case of streaming such as IoT with Azure IoT Central.
What are the actors? What are they used for? And how can we develop them? And how are they published and used on Azure? Let's see how it's done in this session
Generic Math, funzionalità ora schedulata per .NET 7, e Azure IoT PnP mi hanno risvegliato un argomento che nel mio passato mi hanno portato a fare due/tre viaggi, grazie all'Università di Trieste, a Cambridge (2006/2007 circa) e a Seattle (2010, quando ho parlato pubblicamente per la prima volta di Azure :) e che mi ha fatto conoscere il mito Don Box!), a parlare di codice in .NET che aveva a che fare con la matematica e con la fisica: le unità di misura e le matrici. L'avvento dei Notebook nel mondo .NET e un vecchio sogno legato alla libreria ANTLR (e tutti i miei esercizi di Code Generation) mi portano a mettere in ordine 'sto minestrone di idee...o almeno ci provo (non so se sta tutto in piedi).
322 / 5,000
Translation results
.NET is better every year for a developer who still dreams of developing a video game. Without pretensions and without talking about Unity or any other framework, just "barebones" .NET code, we will try to write a game (or parts of it) in the 80's style (because I was a kid in those years). In Christmas style.
Building IoT infrastructure on edge with .net, Raspberry PI and ESP32 to conn...Marco Parenzan
The document discusses building an IoT infrastructure on the edge with .NET that connects devices like Raspberry Pis and ESP32s to Azure. It describes setting up a network of Raspberry Pi devices running .NET Core and connecting sensors to collect data and send events to an Apache Kafka cluster. The events are then aggregated using Apache Spark on another Raspberry Pi and the results routed to the cloud. Issues encountered include Kafka's Java dependencies, Spark's complex processing model, and lack of documentation around integrating Pi, Kafka and Spark. While the technologies work individually, configuring and integrating them presented challenges at the edge.
How can you handle defects? If you are in a factory, production can produce objects with defects. Or values from sensors can tell you over time that some values are not "normal". What can you do as a developer (not a Data Scientist) with .NET o Azure to detect these anomalies? Let's see how in this session.
Quali vantaggi ci da Azure? Dal punto di vista dello sviluppo software, uno di questi è certamente la varietà dei servizi di gestione dei dati. Questo ci permette di cominciare a non essere SQL centrici ma utilizzare il servizio giusto per il problema giusto fino ad applicare una strategia di Polyglot Persistence (e vedremo cosa significa) nel rispetto di una corretta gestione delle risorse IT e delle pratiche di DevOps.
- Azure IoT Central provides a fully managed platform for building IoT solutions that is compliant with the Azure IoT platform.
- It offers predictable pricing per device, forces useful modeling practices like device twins and plug and play, and provides industry templates to accelerate solution building.
- While it handles much of the complexity, it also maintains compatibility with customizing solutions using the full Azure IoT platform and other Azure services.
Come puoi gestire i difetti? Se sei in una fabbrica, la produzione può produrre oggetti con difetti. Oppure i valori dei sensori possono dirti nel tempo che alcuni valori non sono "normali". Cosa puoi fare come sviluppatore (non come Data Scientist) con .NET o Azure per rilevare queste anomalie? Vediamo come in questa sessione.
It happens that we have to develop several services and deploy them in Azure. They are small, repetitive but different, often not very different. Why not use code generation techniques to simplify the development and implementation of these services? Let's see with .NET comes to meet us and helps us to deploy in Azure.
Running Kafka and Spark on Raspberry PI with Azure and some .net magicMarco Parenzan
IoT scenarios necessarily pass through the Edge component and the Raspberry PI is a great way to explore this world. If we need to receive IoT events from sensors, how do I implement an MQTT endpoint? Kafka is a clever way to do this. And how do I process the data in Kafka? Spark is another clever way of doing this. How do we write custom code for these environments? .NET, now in version 6 is another clever way to do it! And maybe, we also communicate with Azure. We'll see in this session if we can make it all work!
Time Series Anomaly Detection with Azure and .NETTMarco Parenzan
f you have any device or source that generates values over time (also a log from a service), you want to determine if in a time frame, the time serie is correct or you can detect some anomalies. What can you do as a developer (not a Data Scientist) with .NET o Azure? Let's see how in this session.
2. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Non è possibile insegnare a programmare in F#
in un’ora
» Si vuole rispondere a due domande:
• Perchè apprendere l’approccio funzionale?
• Vale la pena imparare F#?
Obiettivi
3. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Da Wikipedia
http://en.wikipedia.org/wiki/Imperative_programming
• «...la computazione viene espressa in termini di
istruzioni che cambiano lo stato di un programma...»
» Nella programmazione imperativa, noi...
• ...NON diciamo COSA vogliamo....
• ...ma DICIAMO COME fare per ottenere quello che
vogliamo
Programmazione Imperativa
4. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Nella programmazione imperativa, i concetti principali sono:
• Lo stato (le variabili)
• L’assegnazione (delle variabili)
• La sequenza delle operazioni (che cambiano lo stato delle variabili)
» Pros
• Approccio «naturale»
• «The hardware implementation of almost all computers is imperative »
• Ad un certo punto l’esecuzione va fatta
• Quando viene insegnato il concetto astratto di algoritmo, viene
implicitamente richiesto di essere gli «esecutori»
» Cons
• La gestione dello stato può essere complicata ed è spesso causa di
errori
• Forse abusiamo delle variabili
• Sempre di più ora che si parla di parallel e distributed programming
Programmazione Imperativa
5. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Da Wikipedia
http://en.wikipedia.org/wiki/Object-oriented_programming
• «...i dati vengono espressi in termini di strutture
contenenti campi e metodi...»
» La programmazione orientata agli oggetti è
implicitamente imperativa, in quanto è «stato»
assieme ai metodi che permetto di «cambiare
questo stato»
» Nel nostro ragionamento, quindi, non ci interessa
• I concetti di OOP non ci danno niente in più nel
confronto Imperativo vs. Funzionale
• Comunque parleremo di F# e OOP
Programmazione Orientata agli Oggetti
7. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
C# and VB Evolution [Source: PDC 2010 – Anders Heijsberg]
Managed Code
Generics
Language
Integrated Query
Dynamic + Language
Parity
C# + VB v.Next
Asynchronous
Programming
C# 1.0 + VB 7.0
C# 2.0 + VB 8.0
C# 3.0 + VB 9.0
C# 4.0 + VB 10.0
8. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» C# 3.0 (rilasciato con .NET Framework 3.5) implementa alcuni aspetti della
programmazione funzionale (http://tomasp.net/articles/csharp3-concepts.aspx)
• Lambda Expression
• Quando le funzioni possono essere create a runtime, possono essere memorizzate in
strutture dati, essere passate come parametri o ritornate come risultati
• Type Inference (Inferenza di tipo)
• Dedurre il tipo dall’espressione, non dalla annotazione della variabile (che, in caso di
ambiguità, si può ancora usare)
• Anonymous Types
• Tipi definiti dall’uso
• Metaprogramming
• È lo scrivere programmi che scrivono o manipolano altri programmi (se scrivono o
manipolano se stessi, si dice «reflection»)
• Le Expressions e gli Expression Trees sono i fondamenti del metaprogramming in .NET
3.5/sp1/4.0 (oltre alla Reflection...)
• In realtà sono: syntactic sugar e librerie
• Cosa succede se questi concetti entrano nella definizione del linguaggio sin
dall’inizio?
Programmazione Funzionale e .NET
9. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Da Wikipedia
http://en.wikipedia.org/wiki/Declarative_programming
• «...esprime la logica della computazione SENZA
descrivere il flusso di controllo...»
» Nella programmazione dichiarativa, noi...
• ...DICIAMO COSA vogliamo....
• ...ma NON diciamo come fare per ottenere quello
che vogliamo
» È l’esatto complemento della programmazione
dichiarativa
Programmazione Dichiarativa
10. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Nella programmazione dichiarativa, i concetti
principali sono:
• Le proprietà (esplicitare dei valori)
• I vincoli (esplicitare le regole cui devono sottostare valori
non esplicitati)
» Pros
• Migliore astrazione
• Non devo pensare alla gestione dello stato
» Cons
• Approccio (forse) non «naturale» (?!?!?!)
• Lo usiamo, ma non sappiamo che lo stiamo facendo
Programmazione Dichiarativa
11. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Tra i linguaggi «dichiarativi» (cioè quelli che
implementano un paradigma di programmazione
«dichiarativo») troviamo i Domain Specific
Languages
» Ne usiamo ogni giorno
• HTML
• Descriviamo cosa vogliamo vedere
• Non descriviamo COME faremo a rappresentarlo (non
disegnamo linee, lettere, colori)
• SQL
• Nella selezione (SELECT) descriviamo i vincoli sui dati che
vogliamo ottenere,
• Non descriviamo COME estrarre i dati da un database
(generazione dell’execution plan)
Domain Specific Languages
12. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
19/11/2010 www.xedotnet.org 12
» Da Wikipedia
http://en.wikipedia.org/wiki/Functional_programming
• «...la computazione viene espressa in termini di funzioni ed evita l’uso di stato e dati mutabili...»
» Nella programmazione funzionale...
• Le funzioni sono First-Class Types (High Order Functions)
• Inferenza dei tipi
• Immutabilità
• La scelta di essere «mutabile» (ed essere a rischio di «side effectes», è esplicita)
• Evita l’uso di stato per evitare insidiosi «side-effects»
• Specie in concurrent programming
• Enfatizza la forma dei dati, non l’implementazione
• Uso di dati polimorfici e di pattern matching
• Modellato sul lambda calcolo
• Expression Oriented
• Promuove la «lazy evaluation»
• Valutazione «pigra», il più tardi possibile (non «eager», «impaziente», «anticipato»)
• Riduce l’enfasi sull’approccio imperativo
• Preferisce la ricorsione all’iterazione
• Innalza il livello di astrazione
Programmazione Funzionale
13. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Nella programmazione funzionale, i concetti
principali sono:
• I valori e la loro immutabilità
• Non ci sono variabili
• Il lambda calcolo
» Pros
• Migliore astrazione
• «... l'aumento delle prestazioni dei calcolatori ha tuttavia
spostato l'attenzione della comunità informatica sullo sviluppo
rapido del software, sulla sua correttezza e manutenibilità...»
» Cons
• Approccio (forse) non «naturale» (?!?!?!)
• Lo usiamo, ma non sappiamo che lo stiamo facendo
Programmazione Funzionale
14. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» È un linguaggio funzionale
• Deriva la sua sintassi dal linguaggio Ocaml
• È il suo obiettivo principale
» È un linguaggio imperativo
• Se non si può fare altrimenti
» È un linguaggio OOP
• Perchè deve essere interoperabile con .NET
» Links
• http://msdn.microsoft.com/en-us/fsharp/default.aspx
• http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/
• http://en.wikipedia.org/wiki/F_Sharp_(programming_language)
Cos’è F#
15. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
F# Evolution [Source: PDC 2010 – Don Syme]
F# 1.0
Functional, Generics (Microsoft
Research)
…
Visual Studio 2008
Interactive, Objects
F# 2.0
Visual Studio 2010
Asynchronous, Parallel, Units of
Measure
Language foundations for strongly typed
access to external named data and
services
F# 3.0
16. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Iniziato nel 2002 in Microsoft Research ad opera
principalmente di Don Syme
• http://blogs.msdn.com/b/dsyme/
• http://en.wikipedia.org/wiki/Don_Syme
» A Don si deve anche l’implementazione dei generics nel
CLR 2.0 (usati poi pesantemente in F#)
» A inizio 2005 viene rilasciata la prima release pubblica di F#
• http://blogs.msdn.com/b/dsyme/archive/2005/01/05/346857.aspx
» Nel 2009 Somasegar annuncia l’inclusione di F# (2.0) in Visual Studio 2010
• http://blogs.msdn.com/b/somasegar/archive/2009/10/09/f-in-vs2010.aspx
» Il 4 novembre 2010 il source code di F# viene rilasciato come Open Source
• http://blogs.msdn.com/b/dsyme/archive/2010/11/04/announcing-the-f-
compiler-library-source-code-drop.aspx
» Si può anche installare sotto Linux e Mac OSX con MONO
• http://fsxplat.codeplex.com/
Storia
17. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» ...fermo restando che F# è un General Purpose
Language
• Implementa anche l’approccio imperativo
» Alcuni domini importanti
• Financial Modeling
• Data Mining
• Scientific Analisys
• Academic
Applicazioni tipiche per F#
18. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Shell per lo scripting interattivo
• Ottimo per la prototipazione
» Conciso
» Type Inference
• Strongly Typed
• Automatic Generalization (sempre generico, se ha senso)
• Poca Type Annotation (attributi)
» First Class Functions
• Currying, Lazy Evaluations
» Pattern matching
Caratteristiche di F#
19. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Utilizzato in ambito amministrativo, matematico o
Dynamic Languages
• Cmd, PowerShell, Mathematica, (Iron)Python, (Iron)Ruby
» L’utente inserisce i comandi uno alla volta,
eseguendoli
• Normalmente, i linguaggi di scripting sono interpretati
• F# è compilato
» Uno scripting è di successo quanto più semplice è
scrivere il codice
• In F# è possibile avere la verifica (statica) dei tipi
Scripting Interattivo
20. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Da riga di comando, digitare
fsi.exe
» Da Visual Studio 2010, due
opzioni
• CTRL+ALT+F per una console F#
interactive
• Creare un progetto F#, inserire un
file .fsx ed eseguire «selezioni» di
codice con ALT+INVIO
L’ambiente interattivo
22. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Shell interattiva
» In una shell
interattiva, i comandi
vengono terminati
con il doppio
carattere ;;
» it è l’ultimo valore
calcolato
» It non è it
• F# è Case Sensitive
Shell Interattiva
> 3+4
> 3+4;;
val it : int = 7
>it
val it : int = 7
>It
Script.fsx(3,1): error FS0039: The value
or constructor 'It' is not defined
23. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Liste
» Tuple
» Record
» Array
Tipi di dati
>let lista = [1..10];;
val lista : int list = [1; 2; 3; 4; 5; 6; 7; 8;
9; 10]
>let tupla = (1, "due", 3.0, false);;
val tupla : int * string * float * bool = (1,
"due", 3.0, false)
>let a,b,c,d = tupla;;
val d : bool = false
val c : float = 3.0
val b : string = "due"
val a : int = 1
>type Person = { Name: string; Surname: string; };;
type Person =
{Name: string;
Surname: string;}
>let p = { Name="Mario"; Surname="Rossi" };;
val p : Person = {Name = "Mario";
Surname = "Rossi";}
>let values = [|10; 20; 30|
val values : int [] = [|10; 20; 30|]
24. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Immutability
• Side-effects
» Composition / Currying
» Pattern Matching
» Type inference
» Recursion
» Workflows
Concetti Chiave
25. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» let permette di
definire valori
• F# applica sempre la
Type Inference (a :
int)
• Simile a var in C#...
• ...ma il feeling è quello
dello scripting...
» a è un valore, non
una variabile
• a è immutabile
Valori, non variabili
> let a = 4;;
val a : int = 4
> let a = 5;;
Script.fsx(5,5): error FS0037: Duplicate
definition of value 'a'
26. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» let mutable
permette di definire
valori mutabili
» a diventa
sostanzialmente una
variabile
» Motto:
• «se proprio serve...»
Valori «mutabili», allora variabili
> let mutable a = 4;;
val a : int = 4
> let a = a + 1;;
val a : int = 5
27. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» let permette di
definire funzioni
• Le funzioni sono valori
• Le funzioni associano
ad valori in ingresso
dei valori in uscita
» Le funzioni sono
valori
Funzioni come valori
> let f x = x + 1;;
val f : int -> int
> f 5;;
val it : int = 6
>
28. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» f x si può anche
scrivere come x |> f
» In caso di due
parametri, il parametro
in pipelining è quello
più a destra
• y |> f x
• È ottimo quando si
usano applicazioni in
sequenza
Pipelining operator
> let incr x = x + 1
val incr : int -> int
> 10 |> incr
val it : int = 11
> let f x y = x*2+y*3
val f : int -> int -> int
> 10 |> f 20
val it : int = 70
>let values = [1..10]
let sumOfValues = values |> List.filter (fun x -> (x % 2 = 0))
|> List.map (fun x -> x*2)
|> List.fold (+) 0
val values : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
val sumOfValues : int = 60
29. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» È possibile valorizzare
parzialmente i parametri di una
funzione componendo un
nuovo valore (partial function
application)
» Infatti notiamo che dopo una
let viene sempre mostrato il
formato del valore
» Il meccanismo si chiama
«currying»
http://en.wikipedia.org/wiki/Cu
rrying
• È una tecnica che permette di
trasformare una funzione di n
parametri in una «catena di
funzioni di un solo parametro»
Composition
>let f x y = x + y
>let incr x = f x 1
>incr 5
val f : int -> int -> int
val incr : int -> int
val it : int = 6
30. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Reflector supportà già
F# (con un suo plug-
in, non ancora
completo)
F# e Reflector
31. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Cosa genera questo
programma in F#? (che
non significa niente...)
let a = 4
let mutable b = a + 5
let f x = x + a
let g = f b
» Se si usa Reflector...
F# e Immutability dal punto di vista di .NET
33. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Anche chiamate
«option types»
» Simile all’ereditarietà
in OOP
• «functional
inheritance»
» Anche il tipo diventa
un valore
• Simile a una Enum???
Discriminated Unions
>type Veicolo =
| Auto
| Moto
| Camion
;;
>let veicolo = Auto;;
val veicolo : Veicolo = Auto
34. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» È possibile adornare
l’alternativa del tipo
con degli attributi
Discriminated Union
>type Nome = string
>type Marca= string
>type Colore = string
>type Veicolo =
| Auto of Colore
| Moto of Marca
| Camion of Nome
>let veicolo = Auto("rossa")
val veicolo : Veicolo = Auto "rossa"
35. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» La «sequenza» di
informazioni di tipo e di
attributi può essere
usata per
«discriminare» il tipo
» La sequenza di tipo e di
attributi è un «pattern»
» È uno dei meccanismi
fondamentali di F#
• http://en.wikibooks.org/wiki/F_Sh
arp_Programming/Pattern_Matchi
ng_Basics
Pattern Matching
type Nome = string
type Marca= string
type Colore = string
type Veicolo =
| Auto of Colore
| Moto of Marca
| Camion of Nome
let veicolo = Auto("rossa")
match veicolo with
| Auto(colore) -> printfn "Un' auto %s" colore
| Moto(marca) -> printfn "Una moto %s" marca
| _ -> printfn "un veicolo qualsiasi"
36. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
type Expr =
| Num of int
| Add of Expr * Expr
| Mul of Expr * Expr
| Var of string
let rec Evaluate (env:Map<string,int>) exp =
match exp with
| Num n -> n
| Add (x,y) -> Evaluate env x + Evaluate env y
| Mul (x,y) -> Evaluate env x * Evaluate env y
| Var id -> env.[id]
let envA = Map.ofList [ "a",1 ;
"b",2 ;
"c",3 ]
let expT1 = Add(Var "a",Mul(Num 2,Var "b"))
let resT1 = Evaluate envA expT1
Un esempio evoluto di pattern matching
type Expr =
| Num of int
| Add of Expr * Expr
| Mul of Expr * Expr
| Var of string
val Evaluate : Map<string,int> -> Expr -> int
val envA : Map<string,int> = map [("a", 1); ("b", 2);
("c", 3)]
val expT1 : Expr = Add (Var "a",Mul (Num 2,Var "b"))
val resT1 : int = 5
37. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Osservare cosa F# ha generato a
fronte del codice scritto prima,
descrive molto bene il concetto
di «declarative programming»
detto all’inizio
» Classi già implementate (e
spesso lo si faceva a mano)
» Uso estensivo di:
• IEquatable
• IStructuralEquatable
• IComparable
» Sono i concetti trovati negli
«anonymous types» in C# 3.0
» In C# lo si poteva fare, ma non
siamo mai stati realmente
abituati a farlo
Discriminated Union, Pattern Matching e Reflector
38. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Una funziona viene
dichiarata ricorsiva con
la parola chiave rec
» È l’equivalente
funzionale
dell’iterazione
» Si ha spesso paura di
usare le funzioni
ricorsive per le
prestazioni e il
«consumo» dello stack
Ricorsione
> let rec factorial = function
| 0 | 1 -> 1
| n -> n * factorial (n - 1)
> factorial 10
val it : int = 3628800
39. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Tail Call Optimization è una caratteristica del
compilatore F# (e in alcuni casi anche del JITer .NET)
che trasforma una funzione ricorsiva in un ciclo
while se la chiamata ricorsiva è l’ultima.
» Questa ottimizzazione risolve il problema dello
stack overflow
» Bisogna sempre tentare di pensare ad una funzione
affinchè sia “tail optimizable”
• Perchè il compilatore (o il JITer) non fanno tutto da solo
» Il TCO è disponibile nel CLR 4.0
• Quindi anche in C#!
Tail Recursion
40. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Il codice che è
applicabile a più tipi,
viene
automaticament
generalizzato
» È interessante notare
come il codice
generato dipenda
fortemente da
funzioni standard di
libreria
Automatic Generalization
>let max a b = if a>b then a else b
val max : 'a -> 'a -> 'a when 'a :
comparison
41. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» Sono un concetto complicato
» Permette di definire un DSL
• F# mette a disposizione delle parole chiave, integrate nel linguaggio (let,
let!, use, use!, do, do!, for, while if, yield, yield!, return, return!)
• «Mappa» queste parole chiave sui metodi di una classe «builder» (Let,
Bind, Using, For, While, if, Combine, Yield, YieldFrom, Return, ReturnFrom)
• Questi metodi possono essere implementati da un programma
• Quindi un «workflow» scritto con quelle parole chiave viene eseguito
come sequenza di metodi dell’oggetto builder, di cui noi abbiamo
pienamente il controllo
» È un approccio AOP (Aspect Oriented Programming)
http://en.wikipedia.org/wiki/Aspect-oriented_programming
• I metodi (Let, Bind, ....) «osservano» l’esecuzione del programma e
agiscono in background
• Ad esempio per un logging...
Computational Workflow
42. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
let bind value1 function1 =
printfn "Bind %A." value1
function1 value1
let result value1 =
printfn "Returning result: %A" value1
fun () -> value1
let delay function1 =
fun () -> function1()
type TraceBuilder() =
member x.Bind(value1, function1) =
bind value1 function1
member x.Return(value1) = result value1
member x.Delay(function1) =
printfn "Starting traced execution."
delay function1
let trace = new TraceBuilder()
let trace1 = trace {
let! x = 7
let! y = 5
let! sum = x + y
return sum
}
trace1()
Tracing Workflow
>val bind : 'a -> ('a -> 'b) -> 'b
val result : 'a -> (unit -> 'a)
val delay : (unit -> 'a) -> unit -> 'a
type TraceBuilder =
class
new : unit -> TraceBuilder
member Bind : value1:'c * function1:('c -> 'd) -> 'd
member Delay : function1:(unit -> 'a) -> (unit -> 'a)
member Return : value1:'b -> (unit -> 'b)
end
val trace : TraceBuilder
Starting traced execution.
val trace1 : (unit -> unit -> int)
Bind 7.
Bind 5.
Bind 12.
Returning result: 12
val it : (unit -> int) = <fun:result@40>
44. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
» È un estensione al Type
system extension
» Non è invasivo
• È un meccanismo di
annotazione basato sul
processo di inferenza
» Non ha costo a runtime
» Attenzione!
• È una prima versione
• Ci sono diverse cose da
fare
• Ma è già un gran bel
lavoro
Unità di Misura
>[<Measure>]
type m;;
[<Measure>]
type m
>[<Measure>]
type s;;
[<Measure>]
type s
>let space = 10.0<m>;;
val space : float<m> = 10.0
>let time = 2.0<s>;;
val time : float<s> = 2.0
>let speed = space/time;;
val speed : float<m/s> = 5.0
>let acc = space/time/time;;
val acc : float<m/s ^ 2> = 2.5
47. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
Perchè apprendere l’approccio funzionale
» Maggiore controllo del codice
• Minimizzare lo stato (mutable)
• Organizzare il codice
• Applicazione di Pattern
• Esalta l’immutabilità dei dati
48. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
Vale la pena imparare F#?
» Tutto ciò che si può fare in C# lo si può fare in F# (almeno, al momento, mi
pare…)
• È multiparadigma (supporta l’approccio imperativo)
• Esalta l’immutabilità dei dati e la valutazione di espressioni (sembra tutto LINQ!)
• È interoperabile con .NET
» Alcune cose sono più semplici
• Applicare i design patterns
• Sintassi più succinta
• Task asincroni (workflow)
• Operazioni di trasformazione
• Computazioni
• Domain Specific Languages
• Aspect Oriented Programming
» Alcune cose sono più complicate
• GUI programming
» C’è già un sacco di codice F# in Internet da riusare
49. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
Libri & Blog
» Beginning F#
• Robert Pickering - APress
• http://www.amazon.com/Beginning-F-Robert-
Pickering/dp/1430223898/ref=sr_1_1?ie=UTF8&s=books&qid=1290127128&sr=8-1-spell
• Blog: http://strangelights.com/blog/
» Expert F# 2.0
• Don Syme, Adam Granicz, Antonio Cisternino - APress
• http://www.amazon.com/Expert-2-0-Experts-Voice-Syme/dp/1430224312/ref=pd_sim_b_3
• Blog: http://blogs.msdn.com/b/dsyme/
» Programming F#
• Chris Smith - O’Reilly
• http://www.amazon.com/Programming-comprehensive-writing-complex-
problems/dp/0596153643/ref=pd_bxgy_b_img_b
• Blog: http://blogs.msdn.com/b/chrsmith/
» Real World Functional Programming: With Examples in F# and C#
• Tomas Petricek – Manning
• http://www.amazon.com/Real-World-Functional-Programming-
Examples/dp/1933988924/ref=pd_bxgy_b_img_b
• Blog: http://tomasp.net/
» Professional F#
• Ted Neward, Aaron Erickson, Talbott Crowll, Rick Minerich – Wrox
• http://www.amazon.com/Professional-F-2-0-Ted-
Neward/dp/047052801X/ref=sr_1_1?ie=UTF8&s=books&qid=1290127457&sr=1-1
• Blog: http://blogs.tedneward.com/
50. www.1nn0va.net
info@1nn0va.net
Sede Legale: Via Monte Coglians, 8 – PORCIA – (PN)
Codice fiscale: 91068510931
blog:
email:
web:
twitter:
slideshare:
Link
» Marco Parenzan
http://blog.codeisvalue.com/
marco.parenzan@libero.it
http://www.codeisvalue.com/
marco_parenzan
http://www.slideshare.com/marco.parenzan