Re: delle variabili in bash e in php

2025-03-20 Per discussione Leonardo Boselli

On Thu, 20 Mar 2025, Diego Zuccato wrote:

Il 19/03/2025 14:22, Leonardo Boselli ha scritto:
Premessa: i dati vengono o inviati da processi esterni creando dei file che 
contengono all'interno il dato (o da solo o in un record CSV) oppure 
aggiornati periodicamante da un processo cron
Hint: *standardizza* in un unico formato i dati da leggere. Cioè fai in modo 
che da ogni sorgente arrivino nello stesso formato. Crei dei filtri per ogni 
sorgente che convertono da quel che genera quella sorgente al formato che 
intendi usare dopo. E già hai ridotto notevolmente la complessità.


sono tutti csv, con uno o più valori perché ogni lettura può fornire più 
valri, di fenomeni differenti.


  1. se ho uno script bash posso fare i test su variabili locali o varibili 
di ambiente. Come faccio a fare il test sul contenuto di un file, senza 
dovere fare prima un varlocale=`cat file` ?
Che test devi fare sul contenuto? Per capire se è stato aggiornato può essere 
sufficiente analizzare i metadati, ma se devi proprio guardare il contenuto 
lo devi leggere e parsare.


il problema è che in genere ogni script sarebbe un:

while [ NOW -lt $c ]
 do
  sleep 20
  aggiorna-status-variabili
  if [VAR-A -lt $a && VAR-B -lt $b ]
  then
esegui-quello-che-deve-fare
break
  else
sleep 20
aggiorna-status-variabili
  fi
 done

ora NOW è il tempo ... come la infilo nel loop (ossia il loop attende che 
si verifichino de condizioni su VAR-A e VAR-B, ma solo fino a un certo 
orario.



  1bis. nel test di bash come metto una formula ?

Dipende dalla formula.


vedi sopra ...

  2. la presentazione viene fatta da uno script php, in certi casi però è 
necessario che questo script "solleciti" i dati aggiornati.
il modo più semplice è fare una chiamata http al server remoto, che però 
fornsce un record json .
E già nobbuono. Se servono i dati aggiornati, non deve (generalmente) essere 
la presentazione a richiederli ma il filtro di ingresso.


la presentazione sa QUANDO gli servono i dati aggiornati, e quindi 
sollecita l'aggiornamento solo quando gli servono veramente. misurare 
certi valori "disturba" il fenomeno misurato, per cui se li chiedi troppo 
spesso, il valore ha un errore dovuto al disturbo della misura.



Quindi devi usare
$ob['gate:1']['action']
$ob['gate:1']['res'][0]
$ob['gate:1']['res'][1]


FUNZIONA !!

a questo punto mi sa che lo script lo faccio direttamante in php

Grazie per l'aiuto !

--
Leonardo Boselli
Firenze, Toscana, Europa

Re: delle variabili in bash e in php

2025-03-20 Per discussione Diego Zuccato

Il 19/03/2025 14:22, Leonardo Boselli ha scritto:

Premessa: i dati vengono o inviati da processi esterni creando dei file 
che contengono all'interno il dato (o da solo o in un record CSV) oppure 
aggiornati periodicamante da un processo cron
Hint: *standardizza* in un unico formato i dati da leggere. Cioè fai in 
modo che da ogni sorgente arrivino nello stesso formato. Crei dei filtri 
per ogni sorgente che convertono da quel che genera quella sorgente al 
formato che intendi usare dopo. E già hai ridotto notevolmente la 
complessità.


  1. se ho uno script bash posso fare i test su variabili locali o 
varibili di ambiente. Come faccio a fare il test sul contenuto di un 
file, senza dovere fare prima un varlocale=`cat file` ?
Che test devi fare sul contenuto? Per capire se è stato aggiornato può 
essere sufficiente analizzare i metadati, ma se devi proprio guardare il 
contenuto lo devi leggere e parsare.



  1bis. nel test di bash come metto una formula ?

Dipende dalla formula.

  2. la presentazione viene fatta da uno script php, in certi casi però 
è necessario che questo script "solleciti" i dati aggiornati.
il modo più semplice è fare una chiamata http al server remoto, che però 
fornsce un record json .
E già nobbuono. Se servono i dati aggiornati, non deve (generalmente) 
essere la presentazione a richiederli ma il filtro di ingresso.


Questo recold viene decodificato senza problemi con jq ma mi sono 
trovato di fronte a un grosso problema con php, o chiesto a esperti di 
quel sistema, ma non hannop saputo dare rispposte valide, e tutti gli 
esmpi fanno riferimento a record jso "piatti".

Il record che mi arriva è del tipo
{"nome":"as001","gate:1":{"last_time":1742374708,"action"=1,"res": 
[0.04,19]},"gate:2":{"last_time":1742374718,"action"=3,"res":[1.00,0.99]}}
Che sia piatto o meno, è indifferente: accedi allo stesso modo, solo 
specificando più livelli.


e a me servono gate:1.action e i due valori di res . ma in php non sono 
riuscito a trovare un modo di tirarli fuori, dovo aver dato 
$ob=jsondecode($record); (ma var_dump($record) me li fa vedere tutti, 
quindi la decodifica è giusta ...)

La struttura scritta in modo più leggibile è:
{
  "nome":"as001",
  "gate:1": {
"last_time":1742374708,
"action"=1,
"res": [0.04,19]
},
  "gate:2": {
"last_time":1742374718,
"action"=3,
"res":[1.00,0.99]
}
}

Quindi devi usare
$ob['gate:1']['action']
$ob['gate:1']['res'][0]
$ob['gate:1']['res'][1]

--
Diego Zuccato
DIFA - Dip. di Fisica e Astronomia
Servizi Informatici
Alma Mater Studiorum - Università di Bologna
V.le Berti-Pichat 6/2 - 40127 Bologna - Italy
tel.: +39 051 20 95786