martedì 13 settembre 2016

Internet of Things & M.E.A.N Stack

Approfittando degli esperimenti sui protocolli di comunicazione legati al mondo dell’IoT, iniziati con la nota Internet Of Things - Protocolli di Comunicazione, cogliamo l’occasione per valutare il grado di integrabilità, tra le tecnologie che ruotano intorno a questo mondo, ed un insieme di strumenti che ha attirato la mia attenzione durante quest anno, che vanno sotto la denominazione di M.E.A.N Stack, che si propongono come la miglior alternativa ai classici stack per lo sviluppo di applicazioni web (.NET, LAMP, ...).


mongoDB

express

AngularJS

Node.js
M. E. A. N.

Tra le varie risorse utilizzate per apprendere le basi delle tecnologie coinvolte, una menzione speciale va alla piattaforma di e-learning gratuita Microsoft Virtual Academy
ed in particolare ai seguenti tutorial:
Un’altra preziosa fonte di informazioni è stata il video tutorial ed il blog di Travis Tidwell che introduce degli strumenti formidabili per la realizzazione rapida sia delle funzionalità lato server (le API REST che consentiranno, nel nostro caso, si salvare su db i dati provenienti dal campo), che lato client, rendendo possibile la realizzazione di un front-end che sfrutti appieno le tecnologie dello stack in esame.



Il primo risultato di tale integrazione, per i cui dettagli si rimanda al repository creato in occasione della precedente nota, è stato quello di realizzare un’infrastruttura in grado di persistere le letture dal campo del nostro termostato intelligente, su un database mongoDB.
In particolare è stato implementato un server REST che consente le operazioni C.R.U.D. sul db, ed è stato modificato il comportamento dell’oggetto remote in modo da esguire una scrittura sul database per ogni dato ricevuto dall’oggetto thermostat. L’esito di un run della simulazione è quello di avere i dati serializzati nel nostro database NoSQL pronti per eventuali analisi successive.

Eseguendo una query sulla collection thermostats dal prompt dei comandi, l’esito è:

mongo cli

oppure utilizzando il client visuale Robomongo,

Robomongo

Have fun.





lunedì 12 settembre 2016

Internet Of Things - Protocolli di Comunicazione

Riprendendo il discorso iniziato nella nota Industry 4.0. -To boldly go where no man has gone before… (Part II), entro la fine del 2020, 20.8 miliardi di dispositivi saranno connessi ad internet per formare l’Internet delle Cose. Considerando che, per lo stesso anno è prevista una popolazione mondiale di poco superiore a 7.5 miliardi, avremo, connessi ad internet, circa tre dispositivi per abitante sulla terra.
world population
Sulla base di questa considerazione, la domanda che sorge spontanea, è: “come si connetteranno tutti questi dispositivi tra loro, ai provider di servizi o, più in generale al cloud, considerando che, in generale, il requisito principale sarà quello di garantire una minima occupazione di banda, e massima efficienza energetica, e che le risorse computazionali disponibili saranno, nella quasi totalità dei casi, molto ridotte?“.
Una risposta alla domanda, ci viene dalla seguente tabella, che riassume i requisiti minimi dell’hardware e delle infrastrutture di rete per consentire l’implementazione di un’efficace comunicazione M2M.
IoT End-Node/Device Requirements
fonte Electronic Design
Obiettivo di questa nota è quello di esplorare, con un approccio hands-on, alcuni degli strumenti attualmente disponibili per l’implementazione di tale comunicazione, simulando l’implementazione di un termostato intelligente, e di diversi tipi di controllo remoto dello stesso. I risultati, e le note dei vari step intermedi saranno disponibili su un repository Internet Of Things creato per l’occasione su GitHub.

Have fun

martedì 6 settembre 2016

Industry 4.0. -To boldly go where no man has gone before... (Part II)

Dopo un’introduzione generale dell’argomento, definiamo le due aree della rivoluzione Industry 4.0 che meglio si sposano con i miei interessi, ovvero:

  • Internet of Things;
  • Additive Manufacturing (stampa 3D ed affini).

Iniziamo a definire, per grandi linee, il primo dei due, l’Internet of Things (o IoT).

Una prima definizione di Internet of Things venne data nel 1999 da Kevin Ashton, allora a capo dell’Auto-ID Center del Massachusetts Institute of Technology, che legava la nascita dell’IoT alla diffusione dei dispositivi RFID. In altre parole, per parlare di IoT, ogni oggetto doveva poter essere univocamente identificato e/o catalogato. In tal senso, più che di IoT è giusto parlare di Unique Addressability of Things, che però rappresenta correttamente solo uno dei requirements, l’identificabilità univoca di ogni attore del sistema. Con riferimento a tale aspetto, accanto alle tecnologie RFID, citiamo, per completezza due tecnologie più recenti per l’identificazione:
  • Near Field Communication (NFC);
  • Codici visivi mono e bidimensionali (barcodes, QR codes, e via dicendo); 
RFID NFC QR Code

Una descrizione più adeguata, è, a mio parere, quella che definisce l’IoT come “una miscela inestricabile di hardware, software, dati e servizi“, in quanto focalizza l’attenzione su
  • i requisiti di interconnessione tra dispostivi (M2M);
  • tra dispositivi e servizi, software di gestione/controllo (Business Intelligence - BI);
  • lo storage dei dati acquisiti (Data/Cloud);
rendendo di fatto indispensabile, per poter parlare di IoT, una connessione ad Internet stabile, veloce e continua.

Spostando l’attenzione sull’ultima lettera dell’acronimo, un oggetto/dispositivo (Thing),
si caratterizza o definisce per le capacità d’interazione con l’ambiente circostante (sistema) che gli consentono di
  • leggerne’ lo stato attuale mediante un’opportuna serie di sensori;
  • generare un flusso consistente di dati utili alla definizione di modelli in grado di descrivere tale sistema e prevederne l’evoluzione futura al variare delle condizioni al contorno;
  • modificarne lo stato mediante un’adeguata disponibilità di attuatori.
Le possibilità di applicazione dell’IoT sono praticamente illimitate, spaziando dal controllo ambientale alla domotica, dal settore biomedicale ai trasporti, all’efficientamento energetico e all’organizzazione/ottimizzazione dei contesti urbani (Smart Cities), e via dicendo, il che fa si che anche l’interesse in tale settore coinvolge i maggiori attori privati ed istituzionali dell’economia mondiale. A tal proposito, una classificazione utile a definire attori e campi d’intervento è la seguente:
  • Enterprise che raggruppa tutte le categorie dell’Industrial Internet of Things (IIoT);
  • Home (Domotica, wearables, …);
  • Government (Smart Cities, Energy, Biomedicale, …)

Criticità

Studi di settore (Gartner Inc.) prevedono che 20,8 miliardi di dispositivi formeranno l’Internet of Things entro il 2020, aprendo scenari totalmente nuovi che obbligheranno ognuno dei protagonisti sopra citati a rivedere, secondo le proprie competenze/responsabilità, il modo di concepire il mondo come lo conosciamo ora.
Una tra le maggiori sfide è certamente quella riguardante il tema della sicurezza. Poiché Internet è intrinsecamente insicuro, non possiamo aspettarci livelli di sicurezza maggiori dall’IoT. Anzi, il problema è ancora più evidente quando le implementazioni prevedono l’utilizzo di microcontrollori di fascia bassa che inevitabilmente non hanno una potenza di calcolo sufficiente, per esempio, all’esecuzione di opportuni algoritmi di criptaggio dei dati.
Quando poi l’IoT ha la possibilità di modificare lo stato dei sistemi nei quali è integrato, il problema della sicurezza è legato non tanto ai dati scambiati, ma anche all’incolumità delle persone che si trovano in prossimità di tali sistemi.
Per citare un esempio, l’anno scorso fece scalpore la pubblicazione di diversi articoli nei quali si dimostrava la vulnerabilità di un sistema di infotainment installato su molte vetture del gruppo FCA (Hackers Remotely Kill A Jeep On The Highway - With Me In IT ).

L’argomento è vasto e va oltre le finalità di questa nota (oltre che delle mie competenze), ad ogni modo è bene sapere che il problema esiste e va tenuto in conto in fase di studio/progettazione di un sistema IoT.
Maggiori informazioni a tal proposito possono essere trovate nelle seguenti fonti

Enabling technologies

Dopo aver inquadrato sinteticamente il tema dell’IoT, elenchiamo rapidamente quelle che saranno le tecnologie che avranno maggior impatto negli sviluppi futuri, in modo da avere una mappa di possibili argomenti sui quali investigare e/o sperimentare.

  • 4G LTE;
  • WiFi;
  • ZigBee;
  • Bluetooth Low Energy;
  • Sensoristica miniaturizzata più efficiente;
  • CPU multiprocessore più efficienti;
  • Microcontrollori e SOC sempre più economici.

Enjoy





venerdì 2 settembre 2016

Industry 4.0. "To boldly go where no man has gone before..."

E con questa citazione dalla mia serie scifi preferita, quella che, in qualche modo ha condizionato la scelta della mia professione, ricominciamo a prendere qualche nota, ad esplorare nuovi argomenti, ad imparare nuovi concetti, in altre parole, a riprendere la parte più divertente del mio lavoro.
Per iniziare, sfruttiamo quella che è, per certi versi, la #buzzword del momento in ambito IT, Industry 4.0, ovvero quella che è a tutti gli effetti la quarta rivoluzione industriale, che non è minimamente paragonabile alle precedenti tre in termini di velocità, portata e impatto sul mondo così come lo conosciamo. Un’idea dell’entità dei cambiamenti che stiamo per affrontare a livello globale nei prossimi dieci anni, viene delineata nell’articolo scritto sul sito istituzionale del World Economic Form, dal fondatore Klaus Schwab: “The Fourth Industrial Revolution: what it means, how to respond“, sintetizzato egregiamente dal seguente video.

Questa nota introduttiva sull’argomento ha solo l’obiettivo di inquadrare, in modo del tutto generale, ciò che è, da qualche tempo, l’oggetto dei miei studi/esperimenti e che certamente avrà spazio nei prossimi post.
Enjoy

sabato 29 novembre 2014

Utilizzo di una dll .NET da codice 'nativo' (parte 2)

Nel post precedente, abbiamo visto come realizzare una dll con tecnologia .NET, in grado di consentire ad una qualunque applicazione (sviluppata con tecnologia .NET) di usufruire di un generico servizio web. Tuttavia il problema di partenza era quello di creare un ponte tra il framework .NET ed un’applicazione Win 32.

Il wrapper C++/CLI

Passiamo quindi a descrivere i passi per lo sviluppo del nostro wrapper, ovvero della dll che renderà accessibili i servizi esportati dalla libreria dinamica implementata negli step precedenti.
● Il primo passo è quello di creare un progetto C++ per la creazione di una dll, ed abilitare il Supporto Common Language Runtime (/clr).

● Aggiungiamo un riferimento alla dll prodotta dal progetto GoogleMapsAPI

● Fatto ciò aggiungeremo due classi CGoogleMapsClientIntefacePrivate e CGoogleMapsClientInteface.
#pragma once

# include <string>

using namespace std;

class CGoogleMapsClientIntefacePrivate;

class CGoogleMapsClientInteface
{
public:
    CGoogleMapsClientInteface();
    ~CGoogleMapsClientInteface();

#pragma region Attributes
private:

    CGoogleMapsClientIntefacePrivate* _private;

#pragma endregion

#pragma region Properties
public:
    __declspec(property(get = GetLatitude)) double Latitude;
    double GetLatitude(void);

    __declspec(property(get = GetLongitude)) double Longitude;
    double GetLongitude(void);

    __declspec(property(put = SetAddress, get = GetAddress)) const char* Address;
    void SetAddress(const char*);
    const char* GetAddress(void) const;
#pragma endregion
};
● La cui implementazione è la seguente:
#include "stdafx.h"
#include "GoogleMapsClientInteface.h"

# include <msclr\auto_gcroot.h>

using namespace System::Runtime::InteropServices;
using namespace GoogleMapsAPI;

class CGoogleMapsClientIntefacePrivate
{
public:
    msclr::auto_gcroot<GoogleMaps^> googleMapsAPI;
};

CGoogleMapsClientInteface::CGoogleMapsClientInteface()
{
    this->_private = new CGoogleMapsClientIntefacePrivate();
    this->_private->googleMapsAPI = gcnew GoogleMaps();
}


CGoogleMapsClientInteface::~CGoogleMapsClientInteface()
{
    if (this->_private)
        delete this->_private;
}

double CGoogleMapsClientInteface::GetLatitude()
{
    return this->_private->googleMapsAPI->Latitude;
}

double CGoogleMapsClientInteface::GetLongitude()
{
    return this->_private->googleMapsAPI->Longitude;
}

void CGoogleMapsClientInteface::SetAddress(const char* value)
{
    this->_private->googleMapsAPI->Address = gcnew System::String(value);

    this->_private->googleMapsAPI->GetCoordinates();
}
const char* CGoogleMapsClientInteface::GetAddress(void) const
{
    return (const char*)Marshal::StringToHGlobalAnsi(this->_private->googleMapsAPI->Address).ToPointer();

}
Il punto focale dell’implementazione è dato dalla classe auto_gcroot, che, citando l’help online di Microsoft, “può essere utilizzato per incapsulare un handle virtuale in un tipo nativo”. In altre parole questa classe ci fornirà il punto d’accesso al mondo .NET, e, ad essa delegheremo gli oneri legati alle differenti modalità di gestione della memoria tra il mondo nativo ed il mondo gestito. Tuttavia, così com’è, la classe auto_gcroot, parte dell’armamentario C++/CLI, non è utilizzabile in una dll C++ nativa. In primo luogo perchè non verrebbe riconosciuta in fase di compilazione, ed anche perchè se venisse compilata altererebbe irrimediabilmente il livello di astrazione che stiamo cercando di dare all’intero progetto seguendo una delle tecniche care allo sviluppo C++ nativo descritte nel PIMPL Idiom. A tale scopo abbiamo nascosto il nostro handle nella classe CGoogleMapsClientIntefacePrivate ottenendo un’interfaccia compatibile con il mondo nativo.

Funzioni esportate

Ottenuto il punto d’accesso, o il wrapper che dir si voglia, non ci resta che implementare la nostra dll nativa. Dando per scontata la parte legata allo sviluppo della dll in sé per sé, focalizzerei l’attenzione sul fatto che non abbiamo esportato direttamente la classe CGoogleMapsClientInteface, cosa del tutto lecita e possibile, ma abbiamo creato un handle verso essa mediante il metodo CGoogleMapsClientInteface_Create(). Il motivo di tale scelta è dato dal fatto che il nostro client non verrà sviluppato in C++ nativo (in tal caso ci saremmo fermati al passo precedente), ma in Delphi 7, linguaggio che ha una gestione della memoria totalmente differente da quella del C++, e che difficilmente riuscirebbe ad utilizzare una classe esportata direttamente dal nostro wrapper.
#ifdef CLIBRIDGE_EXPORTS
#define CLIBRIDGE_API __declspec(dllexport)
#else
#define CLIBRIDGE_API __declspec(dllimport)
#endif

typedef void* THandle;

# include "GoogleMapsClientInteface.h"

#ifdef __cplusplus
extern "C"
{
#endif

    inline CLIBRIDGE_API THandle CGoogleMapsClientInteface_Create()
    {
        return (THandle) new CGoogleMapsClientInteface();
    }

    inline CLIBRIDGE_API void CGoogleMapsClientInteface_SetAddress(THandle handle, const char* value)
    {
        if (handle)
        {
            ((CGoogleMapsClientInteface*)handle)->Address = value;

            ((CGoogleMapsClientInteface*)handle)->GetAddress();
        }
    }
    inline CLIBRIDGE_API const char* CGoogleMapsClientInteface_GetAddress(THandle handle)
    {
        return (handle)
            ? ((CGoogleMapsClientInteface*)handle)->Address
            : "";
    }

    inline CLIBRIDGE_API double CGoogleMapsClientInteface_GetLatitude(THandle handle)
    {
        return (handle)
            ? ((CGoogleMapsClientInteface*)handle)->Latitude
            : numeric_limits<double>::signaling_NaN();
    }

    inline CLIBRIDGE_API double CGoogleMapsClientInteface_GetLongitude(THandle handle)
    {
        return (handle)
            ? ((CGoogleMapsClientInteface*)handle)->Longitude
            : numeric_limits<double>::signaling_NaN();
    }

    CLIBRIDGE_API int fnCLIBridge(void);
#ifdef __cplusplus
}
#endif

L’applicazione nativa

A questo punto non ci resta che mettere insieme i blocchi sviluppati finora per creare un programma di test scritto in idioma nativo. Si tratta di una semplice applicazione Console, scritta in C++ e non in Delphi 7 (a tutto c’è un limite ;-)).
// Win32CrashTestDummy.cpp : definisce il punto di ingresso dell'applicazione console.
//

#include "stdafx.h"

# include <iostream>
# include <conio.h>

# include "CLIBridge.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cout << " ------------------------ " << endl;
    cout << " ---------START---------- " << endl;
    cout << " ------------------------ " << endl;

    cout << endl;

    // cout << "Exported function \'fnCLIBridge()\' returned: " << fnCLIBridge() << endl;

    THandle handle = CGoogleMapsClientInteface_Create();

    const char* address = "Google Building 44, Mountain View, California, Stati Uniti";

    CGoogleMapsClientInteface_SetAddress(handle, address);

    const char* value = CGoogleMapsClientInteface_GetAddress(handle);

    cout << "Address:\t" << value << endl;

    cout << endl;

    cout << "Latitude:\t" << CGoogleMapsClientInteface_GetLatitude(handle) << endl;

    cout << endl;

    cout << "Longitude:\t" << CGoogleMapsClientInteface_GetLongitude(handle) << endl;

    cout << endl;

    cout << " ------------------------ " << endl;
    cout << " ----------END----------- " << endl;
    cout << " ------------------------ " << endl;

    std::cin.get();
    cout << " ------------------------ " << endl;

    return 0;
}
Il risultato finale è illustrato nell’immagine seguente, nella quale si mette a confronto l’output dell’applicazione console con quella WinForm sviluppata nel post precedente.

Conclusione

Lavorando nel mondo della tecnologia, in qualsiasi ambito, l’eterogeneità degli strumenti da utilizzare è la regola e non l’eccezione, e quindi può capitare che una tecnologia datata, ma ancora efficiente e funzionale, debba poter accedere a nuovi strumenti. Quello illustrato è uno dei casi che ci si può trovare a dover affrontare, ed uno dei possibili metodi per risolverlo.
Il link ai sorgenti dell’intero progetto raggiungibili dal link seguente
Git
Enjoy
Creative Commons Quality is not for sale

sabato 1 novembre 2014

Utilizzo di una dll .NET da codice 'nativo' (parte 1)

Circa un anno fa, un mio collega si è trovato nella condizione di dover utilizzare una dll sviluppata con tecnologia .NET, all’interno del software di controllo di un sistema di assemblaggio e test di componenti per il mercato automotive, sviluppato con un linguaggio nativo. Ovviamente la dll in questione non era COM-aware, ovvero non poteva essere utilizzata come un ActiveX (troppo facile). Poiché in azienda sono tra i pochi ad avere una certa esperienza sia con la tecnologia .NET che con linguaggi nativi, sono stato coinvolto nella ricerca di una soluzione al problema, e, dopo essermi documentato un po’, tra le varie soluzioni possibili, ho deciso di implementare quella illustrata nell’immagine che segue:
In pratica, si tratta di sfruttare la possibilità di incorporare codice gestito in una dll C++, e creare quindi un wrapper che sia in grado di rendere fruibili metodi e proprietà esposti dalla dll .NET, ad un software legacy
Al fine di illustrare tale concetto, il resto del memorandum, che dividerò in due parti, si svilupperà nella scrittura di quanto segue: 
1. una dll C# che che esporti metodi e/o proprietà; 
2. un wrapper C++/CLI che renda visibili le interfacce della dll del punto precedente ad un software nativo; 
3. programma di test, scritto in codice nativo che importi la dll, prodotta allo step 2 e ne usi metodi e/o proprietà. 
Ho già condiviso l’intero progetto su GitHub ed è possibile raggiungerlo dal link che segue CLIWrapperDemo.



La libreria .NET

Il primo passo sarà quello di implementare una libreria di classi .NET attorno alla quale costruiremo il nostro wrapper. Chiameremo la libreria GoogleMapsAPI che, com’è facile capire dal nome, sfrutterà le API di Google Maps, al fine di restituire le coordinate (longitudine e latitudine) dato un indirizzo. Per ulteriori informazioni sul servizio di geolocalizzazione ho fatto riferimento alla documentazione ufficiale Google Maps API Web Services. Il risultato è una classe con tre proprietà ed un metodo.
/// <summary>
/// Returns the location latitude
/// </summary>
public double Latitude { get; private set; }

/// <summary>
/// Returns the location longitude
/// </summary>
public double Longitude { get; private set; }


/// <summary>
/// Set the desired location address
/// </summary>
public string Address { get; set; }

/// <summary>
/// Gets the location coordinates from the Google Maps API Web Service
/// https://developers.google.com/maps/documentation/geocoding/
/// </summary>
/// <returns>true on success, false otherwise</returns>
public bool GetCoordinates()
{
     ...
}

Per testare immediatamente la dll prodotta ho implementato una semplice applicazione WinForm. Il risultato è illustrato nell’immagine che segue:
dotNETCrashTestDummy
Ok, abbiamo una dll .NET e non ci resta che creare il wrapper e provare ad utilizzarlo nel nostro vecchio software legacy. We’ll find out in the next episode!
Enjoy.
Creative Commons Quality is not for sale

mercoledì 15 ottobre 2014

Markdown? What's it?

Logo markdown

Con l’intento di scrivere la documentazione di un nuovo progetto che sto sviluppando, e di sfruttare, a tal fine, l’opzione di associare ad un progetto ‘hostato’ su Bitbucket un Wiki che, per definizione si presta a scrivere/modificare un documento condiviso in un gruppo di lavoro. Una breve lettura delle caratteristiche dello strumento e…

Wiki features:
This wiki uses the Markdown syntax.

MARKDOWN?

Ok,…
1. Cos’è?
2. Qual’è la sintassi?
3. Quali sono gli editor che posso utilizzare?
Ovviamente Google knows e quindi ecco un pò di fonti utili per la sintassi:

Per gli strumenti, non c’è che l’imbarazzo della scelta, e, primo tra tutti StackEdit, ovvero l’editor on-line con il quale sto scrivendo questo appunto, che tra le varie features ha:
- l’integrazione in Chrome
- in Google Drive
- Varie possibilità di pubblicazione dei documenti prodotti, su diversi supporti, tra i quali, Blogger appunto.

Enjoy

Aggiornamento:

Continuando nella ricerca di strumenti per l’editing con sintassi Markdown, tra gli strumenti desktop, ci sono una serie di plugin per Sublime Text. Un’utile guida su come installare ed usare tali plugins è riportata in: