knowledgebase/journals/2023_10_18.md
2023-10-23 19:59:14 +02:00

7.6 KiB

  • 20:17 quick capture: AutoGen: Enable Next-Gen Large Language Model Applications #llm
  • 20:43 quick capture: https://github.com/oobabooga/text-generation-webui
  • 20:55 quick capture: Mini PC 12th Gen Intel Alder Lake-N100 (fino a 3,4GHz), 16GB di RAM 512GB M.2 SSD Mini Computer con doppio display 4K/2x HDMI/WiFi 5/BT 4.2/Gigabit Ethernet per casa/ufficio : Amazon.it: Informatica #homelab #hardware
  • 21:02 quick capture: Raspberry Pi 5 vs. Orange Pi 5 Plus vs. Rock 5 Model B #homelab
  • Driver #sqlite in pure #golang per GORM
  • Riunione per docenti tutor
    • Seguire gli studenti delle nostre classi
    • Progetto di orientamento unico PCTO per i ragazzi da orientare
    • Prevedere un numero più ampio di ore per il terzo e quarto anno in modo da diminuire il numero di ore al quinto anno
    • Progetto SISSA
    • 15 ore con UniTS
  • Dialogo con #GPT-4 su disa
  • Dialogo con #GPT-4 per suggerimenti su download/upload di un file #sqlite tramite #REST.
    • Un database sqlite è completamente contenuto in un file?
    • Sì, un database SQLite è completamente contenuto in un singolo file sul disco del dispositivo. Questo lo rende estremamente portatile, poiché può essere copiato o spostato tra diversi dispositivi o sistemi operativi semplicemente trasferendo il file.
    • Come posso trasferire un file sqlite utilizzando un API rest dove client e server sono entrambi scritti in Go? Mostrami un esempio conciso.
    • Per trasferire un file sqlite utilizzando un API rest in Go, è possibile utilizzare i pacchetti net/http e io/ioutil di Go. Di seguito è riportato un esempio conciso.
    • Prima, il server che ospita il file sqlite:
    • package main
      - import (
        "net/http"
        "os"
        "io"
      )
      - func main() {
        http.HandleFunc("/download", func(w http.ResponseWriter, r *http.Request) {
            file, _ := os.Open("your_sqlite_file.db") // sostituisci con il tuo file sqlite
            defer file.Close()
            w.Header().Set("Content-Type", "application/octet-stream")
            io.Copy(w, file)
        })
      - http.ListenAndServe(":8080", nil)
      }
      
    • Quindi, il client che scarica il file sqlite:
    • package main
      - import (
        "net/http"
        "os"
        "io"
      )
      - func main() {
        resp, _ := http.Get("http://localhost:8080/download")
        defer resp.Body.Close()
        out, _ := os.Create("downloaded_sqlite_file.db") // sostituisci con il nome del file che desideri
        defer out.Close()
        io.Copy(out, resp.Body)
      }
      
    • Questo esempio è molto semplice e non gestisce gli errori per brevità. In un'applicazione del mondo reale, dovresti gestire tutti gli errori possibili.
    • Aggiungi un endpoind tramite il quale sia possibile effettuare un upload del file sqlite.
    • Per aggiungere un endpoint per l'upload del file sqlite, è possibile utilizzare la funzione http.PostForm di Go. Di seguito è riportato un esempio di come potrebbe essere fatto.
    • Prima, il server che riceve il file sqlite:
    • package main
      - import (
        "net/http"
        "os"
        "io"
      )
      - func main() {
        http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
            file, _, _ := r.FormFile("file")
            defer file.Close()
            out, _ := os.Create("uploaded_sqlite_file.db") // sostituisci con il nome del file che desideri
            defer out.Close()
            io.Copy(out, file)
        })
      - http.ListenAndServe(":8080", nil)
      }
      
    • Quindi, il client che carica il file sqlite:
    • package main
      - import (
        "net/http"
        "os"
        "mime/multipart"
        "io"
        "bytes"
      )
      - func main() {
        body := &bytes.Buffer{}
        writer := multipart.NewWriter(body)
        part, _ := writer.CreateFormFile("file", "your_sqlite_file.db") // sostituisci con il tuo file sqlite
        file, _ := os.Open("your_sqlite_file.db")
        defer file.Close()
        io.Copy(part, file)
        writer.Close()
        req, _ := http.NewRequest("POST", "http://localhost:8080/upload", body)
        req.Header.Add("Content-Type", writer.FormDataContentType())
        client := &http.Client{}
        client.Do(req)
      }
      
    • Anche in questo caso, l'esempio è molto semplice e non gestisce gli errori per brevità. In un'applicazione del mondo reale, dovresti gestire tutti gli errori possibili.
    • Si potrebbe pensare all'upload di una stringa codificata in base64? Se sì, quali sono i vantaggi e gli svantaggi di un approccio simile?
    • Sì, è assolutamente possibile caricare un file SQLite come stringa codificata in base64. In questo caso, il file SQLite verrebbe prima letto e convertito in una stringa base64, quindi questa stringa verrebbe inviata al server tramite una richiesta HTTP POST. Sul lato server, la stringa base64 verrebbe quindi decodificata di nuovo in un file SQLite.
    • Vantaggi di tale approccio:
      1. Universalità: La codifica base64 può rappresentare tutti i dati binari come stringhe di testo. Questo rende l'approccio molto flessibile, poiché non si è limitati a un certo tipo di file o dati.
      2. Compatibilità: Poiché la codifica base64 produce solo caratteri ASCII, è sicura per il trasporto su canali che sono progettati per gestire il testo. Questo significa che i dati codificati in base64 possono essere inviati in un messaggio HTTP senza problemi di compatibilità.
      3. Integrità dei dati: La codifica base64 può aiutare a garantire l'integrità dei dati durante il trasporto, poiché i dati binari potrebbero essere modificati o corrotti durante la trasmissione.
    • Svantaggi di tale approccio:
      1. Sovraccarico: La codifica base64 aumenta la dimensione dei dati di circa il 33%. Questo potrebbe non essere un problema per i file di piccole dimensioni, ma per i file più grandi, potrebbe comportare un uso significativo della larghezza di banda e dello storage.
      2. Elaborazione: La codifica e la decodifica dei dati in base64 richiede risorse di elaborazione. Per i file di grandi dimensioni, questo potrebbe avere un impatto sulle prestazioni dell'applicazione.
      3. Complessità: Aggiungere un passaggio di codifica/decodifica può aggiungere complessità al codice dell'applicazione.
    • Mostrami un esempio in Go che utilizzi l'approccio base64.
    • Per inviare il file al server:
    • package main
      import (
        "net/http"
        "os"
        "io/ioutil"
        "encoding/base64"
        "bytes"
      )
      func main() {
        file, _ := os.Open("your_sqlite_file.db") // sostituisci con il tuo file sqlite
        defer file.Close()
        fileBytes, _ := ioutil.ReadAll(file)
        encoded := base64.StdEncoding.EncodeToString(fileBytes)
        _, _ = http.Post("http://localhost:8080/upload", "application/octet-stream", bytes.NewBufferString(encoded))
      }
      
    • Quindi, il server che riceve la stringa base64, la decodifica e salva il file sqlite:
    • package main
      import (
        "net/http"
        "os"
        "io/ioutil"
        "encoding/base64"
      )
      func main() {
        http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
            encoded, _ := ioutil.ReadAll(r.Body)
            fileBytes, _ := base64.StdEncoding.DecodeString(string(encoded))
            ioutil.WriteFile("uploaded_sqlite_file.db", fileBytes, 0644) // sostituisci con il nome del file che desideri
        })
        http.ListenAndServe(":8080", nil)
      }
      
    • Come nei precedenti esempi, questo esempio è molto semplice e non gestisce gli errori per brevità. In un'applicazione del mondo reale, dovresti gestire tutti gli errori possibili.