domenica 23 gennaio 2022

Github Pages

Github permette di ospitare delle applicazioni web oltre che il repository dei sorgenti mediante il servizio GitHub Pages

In estrema sintesi e' sufficiente creare un nuovo branch denominato gh-pages e puntare il browser all'indirizzo del progetto



dopo aver creato aver fatto il primo commit si puo' procedere con 

git checkout -b gh-pages 

git push https://TOKEN@github.com/c1p81/tabellone.git 

Total 0 (delta 0), reused 0 (delta 0), pack-reused 0

remote: 

remote: Create a pull request for 'gh-pages' on GitHub by visiting:

remote:      https://github.com/c1p81/tabellone/pull/new/gh-pages

remote: 

To https://github.com/c1p81/tabellone.git

 * [new branch]      gh-pages -> gh-pages

La applicazione e' quindi disponibile

https://c1p81.github.io/tabellone/

domenica 16 gennaio 2022

Esplosione Hunga-Tonga-Hunga-Ha'apai registrata in Toscana

Il giorno 15 gennaio alle ore UTC 04:27 e' avvenuta l'esplosione del vulcano Hunga-Tonga-Hunga-Ha'apai alle isole Tonga

Le immagini dal satellite sono impressionanti ma ancora piu' impressionante e' che circa 16 ore quasi dalla parte opposta del mondo e a circa 17000 Km di distanza ovvero in Toscana e' stata registrato un sensibile aumento della pressione atmosferica dovuto alla propagazione dell'onda di pressione. La velocita' con tutte le approssimazioni introdotte e' quella del suono 

Prendendo dati di stazioni meteo pubbliche si puo' vedere 

Stazione di Molin del Piano (Fi)

Una anomalia del sensore?


Aulla

Carrara

Bordighera






venerdì 14 gennaio 2022

Web bluetooth e ITag

Sto facendo un po' di esperimenti con il supporto bluetooth per browser in relazione ad dispositivo ITag (non quello di Apple...la versione cinese)


ITag Anti Lost smart bluetooth tracker

Il dispositivo espone alcuni servizi .. a me interessa il Custom Service che corrisponde ad una notifica legata alla pressione del pulsante




da questo link si osserva che l'UUID del servizio e della caratteristica non e' costante  tra i vari dispositivi che sono in vendita

#define SERVICE_UUID1 "0000ffe0-0000-1000-8000-00805f9b34fb"
#define SERVICE_UUID2 "0000fff0-0000-1000-8000-00805f9b34fb"

#define CHAR_UUID1 "0000ffe1-0000-1000-8000-00805f9b34fb"
#define CHAR_UUID2 "0000fff1-0000-1000-8000-00805f9b34fb"


Per accendere si preme il pulsante per 3 secondi e si sente un doppio beep, per spengere sempre 3 secondi di pulsante con lungo segnale acustico. Per alcune impostazione, come la disattivazione della suoneria si puo' usare la app Kindelf per Android ed IOS


Per prima cosa c'e' da dire che non e' una passeggiata ed il supporto delle API al momento e' molto limitato ...praticamente solo Chrome 


 In ogni caso anche per Chrome si deve abilitare esplicitamente le API tramite

chrome://flags/#enable-experimental-web-platform-features

nonostante avere abilitato la flag non ho trovato il sistema per rendere affidabile la comunicazione tra il pulsante e il computer...inoltre c'e' da segnalare che Chrome su IOS non ha la possibilita' di abilitare questo flag (non e' presente nella lista)

Utilizzando chrome://bluetooth-internals/#adapter si puo' verificare che non tutte le funzionalita' sono ancora implementate (se si apre il widget di ricerca del sistema operativo per fare una scansione il discovering da browser diventa rosso)



questa schermata e' stata fatta su un Lenovo T470 con RHEL 

Per i test ho trovato questa applicazione in ReactJS
Per installarla si inizia con 


git clone https://github.com/rdeprey/web-bluetooth-starter

npm install -g create-react-app

npm install --global yarn

npm install (per scaricare le librerie collegate)

npm start (per lanciare il programma)

per creare una versione da inserire in produzione si puo' digitare npm run build oppure yarn build (verra' creata una directory build in cui sono contenuti i file da mettere sul server di produzione)

Ho modificato la funzione di subscribe to notification per impostare il service e la characteristic sulla base del pulsante

const connectToDeviceAndSubscribeToUpdates = async () => {
try {
// Search for Bluetooth devices that advertise a battery service
const device = await navigator.bluetooth
.requestDevice({
filters: [{
namePrefix: "iTAG"
//services: ['battery_service']
}],
//0000FFF0-0000-1000-8000-00805F9B34FB
optionalServices: ["0000ffe0-0000-1000-8000-00805f9b34fb"]
});

setIsDisconnected(false);

// Add an event listener to detect when a device disconnects
device.addEventListener('gattserverdisconnected', onDisconnected);

// Try to connect to the remote GATT Server running on the Bluetooth device
const server = await device.gatt.connect();

// Get service from the Bluetooth device
const service = await server.getPrimaryService('0000ffe0-0000-1000-8000-00805f9b34fb');

// Get the characteristic from the Bluetooth device
const characteristic = await service.getCharacteristic('0000ffe1-0000-1000-8000-00805f9b34fb');

// Subscribe to notifications
characteristic.startNotifications();

// When the battery level changes, call a function
characteristic.addEventListener('characteristicvaluechanged',
handleCharacteristicValueChanged);
const reading = await characteristic.readValue();

// Show the initial reading on the web page
//setBatteryLevel(reading.getUint8(0));
} catch(error) {
console.log(`There was an error: ${error}`);
}
};

Una volta avviato il programma si riesce ad ottenere la prima notifica di pressione del pulsante e subito dopo viene generato l'errore


index.js:1 Uncaught Error: The error you provided does not contain a stack trace.

at M (index.js:1:1)

at ee (index.js:1:1)

at index.js:1:1

at index.js:1:1

at l (index.js:1:1)

M @ index.js:1

ee @ index.js:1

(anonymous) @ index.js:1

(anonymous) @ index.js:1

l @ index.js:1

localhost/:1 Uncaught (in promise) DOMException: GATT Error: Not supported


Il problema sembra legato alla funzione characteristic.startNotifications()). I valori possono essere letti dal dispositivo ma non possono essere ricevuti come notifica bluetooth
Peraltro il valore della characteristic della pressione pulsante rimane settata ad 1 dopo le pressione e non ritorna  a zero quando il pulsante viene rilasciato

Ho provato anche un pulsante di remote shutter per la video camera (AB Shutter 3 su Amazon) che funziona in modo differente..in pratica si comporta come un dispositivo HID  Bluetooth...in pratica una tastiera con un solo tasto...accoppiando il pulsante con GNOME il risultato e' che si attiva la funzione di alzare il volume e quindi non e' utile per lo scopo che mi ero prefisso






Nebulosa di Orione con telescopio

 Nuovo tentativo della Nebulosa di Orione stavolta con il telescopio

Il mio telescopio non e' idoneo a fare fotografie di spazio profondo ed anche il motore di inseguimento lascia molto a desiderare

Ho provato quindi a non fare stacking facendo scatti molto brevi....nonostante tutto anche a 0.6 si osserva iniziare star trailing. Immagini riprocessate con Gimp. Scatti a 1600 e 3200 iso





questa e' l'immagine presa da Stellarium come riferimento


mercoledì 12 gennaio 2022

Nebulosa di Orione con DSLR

 Foto della nebulosa di Orione M42 ripresa dal centro di Firenze con una DSLR Canon Eos 500d e tele...condizioni peggiori e' difficile immaginarsele. 1600 ISO 2 secondi per scatto

Immagine singola


Stack processato con DeepSkyStacker

Questo il disegno della nebulosa di Orione contenuto nel Sidereus Nuncius di Galileo (fonte progetto Manunzio)


venerdì 7 gennaio 2022

Ambiente di sviluppo Golang senza permessi di amministratore

 Per impostare un ambiente di lavoro Golang su Windows senza avere i permessi di amministrazione si inizia scaricando GO non in versione installer ma in versione archive del tipo  go1.17.6.windows-amd64.zip




Si decomprime la cartella nella propria home

A questo punto si impostano le variabili di ambiente per l'account aggiungendo alla PATH la directory appena scompattata puntando alla directory /bin

Dopo di cio' si crea una nuova variabile di nome GOPATH e la si fa puntare alla directory dove si intende effettuare lo sviluppo

Se si e' dietro ad un proxy si puo' settare la variabile GOPROXY



sabato 1 gennaio 2022

UI per Golang

 Go non ha una UI di default. Si possono utilizzare dei bindings con GTK3 o delle UI native 



go mod init luca.innocenti.gtk3test

si caricano i moduli

go get github.com/gotk3/gotk3/glib

go get github.com/gotk3/gotk3/gtk

si apre quindi Glade per creare la pgina (una semplice textbox Entry nel linguaggio di GTK, una label ed un pulsante)

---- completo.glade -----------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="main_window">
    <property name="can_focus">False</property>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkBox">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="margin_top">4</property>
        <property name="margin_bottom">4</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkEntry" id="txt1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="lbl1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Etichetta</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="btn1">
            <property name="label" translatable="yes">Ok</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="halign">center</property>
            <property name="valign">center</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

---------------------------------------------

nel codice go si carica il file completo.glade

Si tratta di una piccola modifica del codice degli esempi che si trovano su GitHub 

Gli eventi possono essere creati (connessi) sia nel codice sia all;'interno dei segnali di Glade...in questo caso sono tutti contenuti nel codice applicazione. In ogni caso se si puo' associare in Glade un segnnale di nome "pressione" all'evento di click del pulsante

package main

import (
"errors"
"fmt"
"log"
"os"

"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
)

const appId = "com.github.gotk3.gotk3-examples.glade"

func main() {
// Create a new application.
application, err := gtk.ApplicationNew(appId, glib.APPLICATION_FLAGS_NONE)
errorCheck(err)

// Connect function to application startup event, this is not required.
application.Connect("startup", func() {
log.Println("application startup")
})

// Connect function to application activate event
application.Connect("activate", func() {
log.Println("application activate")

// Get the GtkBuilder UI definition in the glade file.
// builder, err := gtk.BuilderNewFromFile("ui/example.glade")
builder, err := gtk.BuilderNewFromFile("/home/luca/glade/completo.glade")
errorCheck(err)

obj, _ := builder.GetObject("txt1")
entry1 := obj.(*gtk.Entry)

obj2, _ := builder.GetObject("btn1")
button1 := obj2.(*gtk.Button)

obj3, _ := builder.GetObject("lbl1")
label1 := obj3.(*gtk.Label)

button1.Connect("clicked", func() {
text, err := entry1.GetText()
if err == nil {
label1.SetText(text)
}
})

// Map the handlers to callback functions, and connect the signals
// to the Builder.
signals := map[string]interface{}{
"on_main_window_destroy": onMainWindowDestroy,
//"pressione": clickedTestButton,
}
builder.ConnectSignals(signals)

// Get the object with the id of "main_window".
obj4, err := builder.GetObject("main_window")
errorCheck(err)

// Verify that the object is a pointer to a gtk.ApplicationWindow.
win, err := isWindow(obj4)
errorCheck(err)

// Show the Window and all of its components.
win.Show()
application.AddWindow(win)
})

// Connect function to application shutdown event, this is not required.
application.Connect("shutdown", func() {
log.Println("application shutdown")
})

// Connect function to application shutdown event, this is not required.
application.Connect("pressione", func() {
log.Println("pressione")
fmt.Println("pressione")
})

// Launch the application
os.Exit(application.Run(os.Args))
}

func isWindow(obj glib.IObject) (*gtk.Window, error) {
// Make type assertion (as per gtk.go).
if win, ok := obj.(*gtk.Window); ok {
return win, nil
}
return nil, errors.New("not a *gtk.Window")
}

func errorCheck(e error) {
if e != nil {
// panic for any errors.
log.Panic(e)
}
}

/*
func clickedTestButton() {
fmt.Println("Testclick")
//headerBar.SetTitle("New Title!!")
}*/

// onMainWindowDestory is the callback that is linked to the
// on_main_window_destroy handler. It is not required to map this,
// and is here to simply demo how to hook-up custom callbacks.
func onMainWindowDestroy() {
log.Println("onMainWindowDestroy")
}

per eseguire il programma 

go run -tags pango_1_42,gtk_3_22 .


con la libreria nativa il codice e' piu' pulito. L'unico problema e' che si tratta di una libreria dichiarata ancora in alpha e che non risulta aggiornata da due anni

package main

import (
"github.com/andlabs/ui"
)

func main() {
err := ui.Main(func() {
input := ui.NewEntry()
button := ui.NewButton("Ok")
greeting := ui.NewLabel("")
box := ui.NewVerticalBox()
box.Append(ui.NewLabel("Label"), false)
box.Append(input, false)
box.Append(button, false)
box.Append(greeting, false)
window := ui.NewWindow("UI", 200, 100, false)
window.SetMargined(true)
window.SetChild(box)
button.OnClicked(func(*ui.Button) {
greeting.SetText(input.Text())
})
window.OnClosing(func(*ui.Window) bool {
ui.Quit()
return true
})
window.Show()
})
if err != nil {
panic(err)
}
}


Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...