13 Dic

Applicazioni desktop multi-piattaforma

Programming Node.JS

Lo sviluppo di applicazioni mobile ci ha abituato ad utilizzare svariati framework (ad esempio Ionic, PhoneGap, Apache Cordova e Xamarin) che permettono di sviluppare applicazioni mobili e di rilasciarle su diverse piattaforme mobili (Android, Windows Phone, iOS). Ma e’  possibile sviluppare un’applicazione desktop con l’obbiettivo di rilasciarla su differenti sitemi operativi (Windows, Linux e Mac OS)? Subito pensiamo a Java e allo slogan che accompagna da sempre questo linguaggio di programmazione: “write once, run anywhere“.

Oltre a Java ci sono altre tecnologie, più o meno datate, che permettono lo sviluppo di applicazioni desktop multi-piattaforma. Tra queste vanno ricordate: Adobe Air, Haxe, Qt. Tuttavia tutte necessitano di competenze specifiche e richiedono team di sviluppo altamente specializzati.

Ci sono invece dei veri e propri framework per lo sviluppo desktop multi-piattaforma che si poggiano su standard e linguaggi tipici dello sviluppo web. Questi framework permettono di sviluppare applicazioni desktop a partire da conoscenze pregresse basate su HTML5, CSS3, Javascript e su tutte quelle librerie e moduli disponibili per il web. Tra i più utilizzati troviamo:

Caratteristica comune è quella di appoggiarsi a Node.js e ad un’istanza di Chromium  per il rendering della user interface.

Tra le tre soluzioni, Electron, pur essendo il framework più recente, annovera diversi progetti di rilievo tra i quali Atom (GitHub), Visual Studio Code (Microsoft), Nuclide (Facebook), Slack, Hive e MongoTron. Punto di forza, oltre allo sviluppo di applicazioni desktop utilizzando tecnologie web, è  quello di combinare Chromium e Node.js in un unico runtime permettendo di distribuire lo stesso pacchetto sui tre sistemi operativi desktop più diffusi: Windows, Linux e Mac OS.

Electron per funzionare non richiede quindi la presenza di virtual machine o interpreti sul sitema operativo di destinazione. L’applicazione puo’ essere distribuita rilasciando i binari di Electron insieme ai file sorgenti dell’applicazione o pacchetizzando il tutto in archivi asar.

Per maggiori dettagli e riferimenti riguardo all’architettura di Electron, nonche’ alcuni esempi interessanti, potete visitare:

24 Feb

Generare file XML con Node.js

Programming Node.JS

Come sappiamo XML (eXtensible Markup Language) è un metalinguaggio utilizzato per definire linguaggi di markup. In parole più semplici, XML serve a creare nuovi linguaggi definendone le regole. I punti di forza di XML sono:

  • semplicità: è basato su una sintassi caratterizzata da poche regole,
  • interoperabilità: è supportato da una grande varietà di linguaggi di programmazione e tecnologie,
  • estensibilità: gli elementi definiti possono essere estesi e adattati ad altri utilizzi.

Oggi XML è principalmente utilizzato per modellare la struttura di documenti e dati. Possiamo dire che lo ritroviamo un po’ ovunque: nei file di configurazioni delle  applicazioni , nei messaggi che si scambiano i servizi web, nelle interazioni tra database eterogenei, nelle repository di dati salvate su file, ecc.

A volte è necessario generare file XML a supporto della logica delle nostre applicazioni.  Per questo scopo ci vengono in aiuto Node.js e il relativo modulo XMLBuilder.

L’utilizzo di XMLBuilder è estremamente semplice. Il suo punto di forza  è la facilità con la quale si possono mappare in un oggetto javascript le regole e i dati del file XML che si vuole generare.

Per utilizzare XMLBuilder bisogna innanzitutto installare node.js. Il package manager di node permette scaricare il modulo XMLBuilder tramite il comando:

> npm install xmlbuilder

Una volta  installato XmlBuilder in locale ci possiamo “divertire” a generare file XML. Ad esempio, salviamo il seguente codice javascript nel file text.js

var builder = require('xmlbuilder');
var xml = builder.create('root')
  .ele('first')
    .ele('second', {'type': 'attribute text'}, '2nd node text')
  .end({ pretty: true});

console.log(xml);

Lanciamo Node puntando al file javascript:

d:\tmp\xmlbuilder> node test.js
<?xml version="1.0"?>
<root>
  <first_node>
    <second_node type="child">some node text</second_node>
  </first_node>
</root>

Come si vede il modulo XmlBuilder ha generato il file XML seguendo le direttive definite nel file test.js

La cosa più interessante di XmlBuilder è la capacità di generare file XML a partire da oggetti javascript. Ad esempio, per ottenere lo stesso risultato, possiamo modificare il file test.js come segue:

var builder = require('xmlbuilder');
var root = builder.create('root');

var obj = {
  first: {
    second: {
    '#text': '2nd node text',
    '@type': 'attribute text'
    }
  }
};

root.ele(obj);
console.log(root.doc().end({ pretty: true}))

Il file XML viene generato da un oggetto javascript (obj nello script). La direttiva ‘#text’ indica di associare del testo al nodo mentre ‘@’ indica di inserire un attributo. XmlBuilder è molto flessibile e personalizzabile. Il risultato prodotto é identico al precedente:

d:\tmp\xmlbuilder> node test.js
<?xml version="1.0"?>
<root>
  <first>
    <second type="attribute text">2nd node text</second>
  </first>
</root>

Si possono concatenare più oggetti, come nell’esempio sottostante:

var builder = require('xmlbuilder');
var root = builder.create('root');

var obj1 = {
  persona: {
    nome: "Mario",
    '@age': 35,
    indirizzo: {
    citta: "Milano"
    },
    telefono: [
      { '#text': "348-123467", '@type': 'casa' }, 
      { '#text': "348-123567", '@type': 'ufficio' }
    ],
    id: function() {
      return 1;
    }
  }
};

var obj2 = {
  persona: {
    nome: "Maria",
    '@age': 57,
    indirizzo: {
      city: "Bari"
    },
    telefono: [
      { '#text': "345-123467", '@type': 'casa' }, 
      { '#text': "345-123567", '@type': 'ufficio' }
    ],
    id: function() {
      return 2;
    },
    figlio: [
      {nome: "Luigi", '@age': 25},
      {nome: "Giuseppe", '@age': 23},
      {nome: "Antonio", '@age': 19},
    ]
  }
};

root.ele(obj1);
root.ele(obj2);

console.log(root.doc().end({ pretty: true}))

Si ottiene il seguente risultato:

d:\tmp\xmlbuilder>node test.js
<?xml version="1.0"?>
<root>
  <persona age="35">
    <nome>Mario</nome>
    <indirizzo>
      <citta>Milano</citta>
    </indirizzo>
    <telefono type="casa">348-123467</telefono>
    <telefono type="ufficio">348-123567</telefono>
    <id>1</id>
  </persona>
  <persona age="57">
    <nome>Maria</nome>
    <indirizzo>
      <city>Bari</city>
    </indirizzo>
    <telefono type="casa">345-123467</telefono>
    <telefono type="ufficio">345-123567</telefono>
    <id>2</id>
    <figlio age="25">
      <nome>Luigi</nome>
    </figlio>
    <figlio age="23">
      <nome>Giuseppe</nome>
    </figlio>
    <figlio age="19">
      <nome>Antonio</nome>
    </figlio>
  </persona>
</root>

La cosa più interessante di XmlBuilder è la completa integrazione di javascript nella definizione della struttura dei file XML. Questo permette di gestire logiche particolari quando generiamo l’output, soprattutto grazie all’utilizzo di funzioni javascript.

Happy programming!