Risorse
Configurazione delle risorse "resources"
Esistono alcune funzioni che, oltre ai loro parametri dinamici, richiedono una configurazione statica supplementare. Si tratta ad es. di tabelle di lookup o anche di funzioni della tecnica di controllo con larghezze di registro o intervalli di conteggio. Questa configurazione statica viene passata alla chiamata della funzione come ultimo parametro sotto forma di oggetto JSON.
La configurazione direttamente nella chiamata della funzione è ancora sensata per pochi parametri singoli; per configurazioni estese, ad es. una classificazione o un filtro, queste risorse possono essere spostate in un'area separata del modulo math per migliorare la leggibilità del set di formule. Grazie a questo spostamento la stessa configurazione può inoltre essere riutilizzata in diversi punti del set di formule.
Nell'ambito delle cosiddette risorse è possibile
- memorizzare testo per la configurazione o per ulteriori elaborazioni,
- spostare oggetti JSON complessi dal set di formule in un'area della configurazione prevista a tale scopo e
- consentire, tramite i cosiddetti decoder, un processo di elaborazione di dati arbitrari (testo o binari).
Queste risorse vengono inizializzate UNA SOLA VOLTA all'avvio del funzionamento di misura e possono essere configurate come segue
{
"module":"math1",
"factory":"mathmodule",
"config": {
...
"resources": {
"someTextResource": [
< LINES OF TEXT >
],
"someObjectResource": {
< JSON STYLE Configuration >
},
"someDecodableResource": {
"decoder": [
< DECODERS >
],
"value": "someInitialResourceValueString"
}
...
}
}
}
Si distingue tra
- semplici risorse di testo, che specificano il testo, in modo analogo al parametro math, come un'unica stringa o come un elenco di stringhe (sotto forma di array JSON). Le singole stringhe dell'elenco vengono unite tramite '\n' prima dell'utilizzo. (nell'esempio sopra someTextResource)
-
risorse oggetto, che mettono a disposizione oggetti JSON rappresentabili per la configurazione di funzioni nel testo delle formule (nell'esempio sopra someObjectResource)
-
e risorse decodificabili, che applicano in successione una sequenza di processi di elaborazione (decoder) a un pacchetto di dati iniziale e rendono disponibile il risultato anch'esso come pacchetto di dati (nell'esempio sopra someDecodableResource). Questo pacchetto di dati può essere un testo leggibile ma anche un pacchetto di dati binario.
Accesso alle risorse e loro conversione
L'accesso alle risorse può avvenire esclusivamente nella posizione dell'ultimo parametro di una funzione che accetta un oggetto JSON come parametro
someJsonObjectAcceptingFunction( ... , {$ref:'someResource'} )
e restituisce tipicamente un oggetto JSON. Un'eccezione è ad es. la funzione lookup(), che si aspetta dalla risorsa un blocco di testo con un'intestazione dati proprietaria e una sequenza di valori di dati per riempire la tabella.
Se invece è attesa una rappresentazione come stringa, il contenuto della risorsa può essere convertito come segue
someStringAcceptingFunction( ... , sResource({$ref:'someResource'}), ... )
In ogni caso è responsabilità dell'utente fornire i dati in modo tale che la funzione utilizzata o il set di formule possano anche interpretarli ed elaborarli.
Esempio: fornitura di una configurazione basata su testo da una risorsa di testo:
Nell'esempio seguente la configurazione di una tabella di lookup è attesa sotto forma di un formato di testo proprietario. I singoli punti dati seguono le righe di intestazione.
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "someTextAcceptingFunction( ... , {$ref:'someText'} );",
"resources": {
"someText": [
"IN kPa 0.0 0.167751 161"
, "OUT l"
, ""
, "0"
, "42.942"
, "87.924"
, "134.946"
, "184.008"
, "235.11"
, "288.252"
, "343.434"
, "400.656"
, "459.918"
, "521.22"
, "584.562"
, "..."
],
...
}
}
}
Altri esempi di applicazione potrebbero essere:
-
Un testo e-mail predefinito per la notifica, in cui nel set di formule i segnaposto del testo vengono sostituiti da valori concreti.
-
Una struttura XML per un sottosistema che deve essere configurato in questo modo per un compito di misura.
Esempio: fornitura di un oggetto JSON atteso da una risorsa oggetto
Nell'esempio seguente è attesa una configurazione statica della funzione sotto forma di oggetto JSON
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "someObjectAcceptingFunction( ... , { someParam: value } );"
}
}
Questa può essere fornita da una risorsa oggetto come segue
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "someObjectAcceptingFunction( ... , {$ref:'someObject'} );",
"resources": {
"someObject": {
someParam: value
},
...
}
}
}
Esempio: fornitura di una stringa elaborata da risorse
Nell'esempio seguente la funzione "someObjectAcceptingFunction" si aspetta una stringa elaborata (come ad es. il contenuto di un file o una rappresentazione decodificata o decompressa della stringa, per i dettagli vedere la sezione "decoder").
Ciò può essere realizzato con una risorsa decodificabile come segue
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "someObjectAcceptingFunction({$ref:'someDecodableResource'});",
"resources": {
"someDecodableResource": {
"decoder": [
"someFirstDecoderStage someFirstFirstDecoderArgument ... someLastFirstDecoderArgument",
...,
"someLastDecoderStage someFirstLastDecoderArgument ... someLastLastDecoderArgument"
],
"value": "someInitialStringValue"
}
}
}
}
In questo caso la prima fase del decoder "someDecoderStageFIRST" converte dapprima il valore stringa iniziale della risorsa "someInitialValueString" in un risultato intermedio, e tutte le fasi successive del decoder calcolano dal risultato intermedio precedente il risultato intermedio seguente, dove l'ultima fase del decoder restituisce il proprio risultato intermedio come risultato finale sotto forma di valore JSON di tipo stringa.
Nota: se questo risultato deve essere utilizzato dove è attesa una stringa, all'accesso deve essere convertito tramite "sResource", come descritto sopra.
Decodifica delle risorse "decoder"
Il compito di un decoder è convertire una stringa di origine in una stringa di destinazione.
Al momento sono disponibili i seguenti decoder
- file per la lettura di un file
- base64 per la decodifica di una stringa in formato base64
- unzip per la decompressione del contenuto di un file compresso con gzip
Inoltre un decoder molto flessibile
- system per la chiamata di processi di sistema
Decoder "file"
Il decoder "file" serve a leggere un file "/sdi/config/some/file/name", come segue
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "someJsonValueAcceptingFunction({$ref:'someFileResource'});",
"resources": {
"someFileResource": {
"decoder": [
"file"
],
"value": "some/file/name"
}
}
}
}
Se come "value" del decoder viene specificato un percorso relativo, questo si riferisce alla directory di configurazione smartCORE /sdi/config/. È tuttavia possibile specificare anche un percorso assoluto.
Decoder "unzip"
Per decomprimere file compressi con gzip è possibile utilizzare il decoder "unzip", ad es. come segue
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "someJsonValueAcceptingFunction({$ref:'someFileResource'});",
"resources": {
"someFileResource": {
"decoder": [
"file",
"unzip"
],
"value": "some/compressed/file/name.gz"
}
}
}
}
Decoder "base64"
Per decodificare file codificati in base64 è possibile utilizzare il decoder "base64", ad es. come segue
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "someJsonValueAcceptingFunction({$ref:'someFileResource'});",
"resources": {
"someFileResource": {
"decoder": [
"file",
"base64"
],
"value": "some/base64/encoded/file.b64"
}
}
}
}
Decoder "system"
Per l'inizializzazione di risorse tramite chiamate di sistema arbitrarie è possibile utilizzare il decoder "system". Questo supporta parametri di chiamata. Esempio:
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "someJsonValueAcceptingFunction({$ref:'someEditedResource'});",
"resources": {
"someEditedResource": {
"decoder": [
"file",
"system sed -e 's/hello/world/g'"
],
"value": "some/source/file"
}
}
}
}