Le unità di misura delle grandezze fisiche sono estremamente importanti per scienziati e ingegneri. Comunicano molto ma, purtroppo, possono portare a errori enormi e costosi. È stato sviluppato un componente aggiuntivo per aiutare a gestire le unità all'interno di JMP e ridurre questi errori. Questo componente aggiuntivo sfrutta la nuova integrazione Python di JMP 18 per realizzare facilmente ciò che sarebbe stato difficile ottenere in JMP 17. Questa presentazione illustra le funzionalità di questo componente aggiuntivo e il modo in cui è stato sviluppato, inclusi l'uso di Python, il controllo del codice sorgente, i test, la documentazione e i sistemi di compilazione.
Ciao, mi chiamo Evan McCorkle. Sono uno sviluppatore JMP e oggi sono qui per parlare di un componente aggiuntivo che ho sviluppato utilizzando la nuova integrazione Python di JMP 18. Questo componente aggiuntivo è per la conversione di unità fisiche e spiegherò perché l'ho sviluppato, come l'ho sviluppato, le tecniche che utilizzo nel suo sviluppo e alcuni dettagli sull'integrazione Python di JMP 18 utilizzata.
La mia formazione e i miei primi anni di carriera sono stati in ambito ingegneristico. Durante quella formazione e i miei primi anni di carriera, ho dovuto confrontarmi con diversi sistemi di unità di misura e diverse tipologie di unità, principalmente unità consuetudinarie statunitensi e unità metriche. Sono sicuro che anche molti di voi si siano trovati a fare lo stesso, e sono sicuro che molti di voi sappiano che ci sono stati molti errori gravi e costosi dovuti a problemi di conversione delle unità di misura. Per questo motivo, ho sempre cercato di utilizzare uno strumento che mi aiutasse a verificare le mie conversioni di unità di misura.
Spesso, per farlo, utilizzo una libreria Python chiamata Pint. Stavo esaminando la nuova integrazione Python di JMP 18 e volevo capire se fosse possibile integrarla con la funzionalità esistente di JMP di annotare le colonne con le relative unità di misura. Se si accede a una colonna, è possibile assegnare un'unità di misura a quella colonna e utilizzarla per effettuare conversioni di unità di misura, convalidarle e tutto il resto?
Questo è stato l'impulso che ha spinto allo sviluppo di questo componente aggiuntivo. Quindi, quando si importa una tabella, il componente aggiuntivo può rilevare le unità tra parentesi nelle colonne, assegnare automaticamente la proprietà dell'unità e convalidare tali unità. Permette di visualizzare a colpo d'occhio l'intera tabella e le relative unità, apportare modifiche in blocco alle unità, assicurarsi che il sistema comprenda le unità e le abbreviazioni utilizzate, nonché determinare le unità per colonne di formule semplici.
La funzionalità principale del componente aggiuntivo è la conversione delle colonne tra unità di misura. Ad esempio, la conversione da pollici a millimetri. È possibile eseguire questa operazione direttamente sul campo o come nuova colonna. Quando si convertono i dati, vengono convertite anche le proprietà della colonna, come le linee di riferimento, le impostazioni di accesso, i limiti delle specifiche, eccetera.
Oltre a queste funzionalità, è disponibile un database consultabile di tutte le unità supportate e dei modi in cui è possibile comporre le unità, oltre a un'API JSL. Se siete interessati a tutto questo, potete visualizzare il codice QR sullo schermo qui, oppure potete visitare la community e cercare il componente aggiuntivo per la conversione delle unità.
Questo è tutto ciò che dirò sulle funzionalità del componente aggiuntivo. Ora parlerò di come è stato sviluppato. Per il controllo del codice sorgente del componente aggiuntivo, ho utilizzato Git e un'istanza interna di GitLab. Per la compilazione e il deployment del componente aggiuntivo, utilizzo la soluzione personalizzata di un file JSL di build del componente aggiuntivo e di un file JSL manifest, di cui parlerò più dettagliatamente tra un minuto. Per i test, utilizzo il framework JSL Hamcrest, che potete trovare su GitHub. Sono uno sviluppatore di quel framework. Utilizziamo quel framework internamente a JMP per testare JMP stesso, e lo uso anche per testare questo componente aggiuntivo.
Per la documentazione, si utilizzano principalmente file Markdown, che vengono poi convertiti in HTML tramite Pandoc, inseriti nel componente aggiuntivo e visualizzati nel componente aggiuntivo tramite il browser web integrato JMP. Tutto è implementato tramite JSL e Python con la libreria pint in Python. Sono stati poi utilizzati altri strumenti, come JMP, VS Code, Git, Pandoc e Google Material Icons.
La struttura del componente aggiuntivo al livello superiore è la seguente. Bisogna compilare la cartella, i documenti, il codice sorgente, i test e poi i file readme markdown. Quindi i test sono separati. La build contiene il componente aggiuntivo di build, il file manifest e la sottocartella degli artefatti, che è dove va il codice HTML e dove andrà il componente aggiuntivo JMP stesso una volta compilato. I documenti sono per lo più screenshot e cose del genere. Poi la cartella del codice sorgente ha diverse sottocartelle, icone e menu. Quindi il menu contiene questi file JSL di azione che sono molto, molto semplici. Vengono utilizzati dal file JMPcust come punto di partenza, così come dal codice sorgente, che costituisce la maggior parte del codice. Poi abbiamo il file def JMPcust e il file JSL di aggiunta e caricamento.
Per quanto riguarda il file Manifest, si tratta sostanzialmente di un elenco di tutti i file di questa struttura qui a sinistra, che finiranno nell'archivio del componente aggiuntivo JMP che verrà poi installato. Lo script JSL del componente aggiuntivo di build esegue sostanzialmente il passaggio Pandoc per convertire Markdown in HTML, legge il Manifest e utilizza l'API JSL Zip Archive per raccogliere tutti i file e inserirli in un file del componente aggiuntivo JMP nella directory degli artefatti di build.
Ogni volta che volevo aggiungere una nuova funzionalità, inserivo un'icona nel menu sorgente. Avevo un breve codice abbozzato nel menu sorgente, e poi il grosso del codice andava nel sorgente. Prendo tutti e tre quei file, li aggiungo al manifest, modifico il file Cust del componente aggiuntivo JMP in modo che faccia riferimento a quel piccolo abbozzo nel menu sorgente. Quindi potrei compilare il componente aggiuntivo e iniziare a sviluppare su quella funzionalità, quindi aggiungere il test alla suite nei file di test.
Il sottomenu nel menu sorgente eseguirebbe solo una convalida di base, come la ricerca di una tabella dati corrente o qualcosa del genere. Quindi includerebbe il file sorgente principale e quindi richiamerebbe l'interfaccia grafica. Il motivo di questa separazione è che potremmo facilmente includere questo file sorgente principale nel test e quindi testare quella funzionalità senza richiamare l'interfaccia grafica. È semplicemente una bella divisione tra il menu sorgente, che è ciò che viene richiamato interattivamente quando si fa clic sul menu, e i file di test, ed entrambi vengono eseguiti tramite source-source.
Ora, infine, poiché gran parte di questo componente aggiuntivo utilizza la nuova integrazione Python di JMP 18, volevo spiegarne nel dettaglio il funzionamento. Fondamentalmente, si compone di tre parti. Innanzitutto, nel file di caricamento del componente aggiuntivo. Ogni volta che il componente aggiuntivo viene caricato, proviamo a installare i pacchetti Python. Pint è uno di questi. Installalo e assicurati che sia installato. Poi ho un file com_jmp_unitconversion.py installato con il componente aggiuntivo. Procedo e lo importerò con questo nome completo qui.
In pratica, tutto ciò che si trova in quel file Python è solo un mucchio di definizioni di funzione, e tutte usano la libreria pint. Ma non c'è lavoro vero e proprio. Sono solo le definizioni di funzione. Poi, nel codice JSL principale, inserisco quelle chiamate Python usando quel nome completo e l'integrazione Python all'interno di una funzione JSL. Poi, nel resto del componente aggiuntivo, posso semplicemente usare le funzioni JSL qui a destra. Le unità di misura sono convertibili, piedi in chilometri? Sì. Piedi in millilitri? No. Si tratta solo di usare normali funzioni JSL, ma internamente, queste vengono inserite nel codice Python usando l'integrazione Python. Tutto è impostato sul caricamento del componente aggiuntivo e tutto il mio codice Python è ben contenuto all'interno di questo unico pacchetto, quindi non sto inquinando l'intero namespace Python.
Ecco come ho utilizzato la nuova integrazione Python di JMP 18 per sviluppare questo componente aggiuntivo per la conversione di unità fisiche. Grazie.