This commit is contained in:
Andrea Fazzi 2023-10-23 10:03:07 +02:00
commit 46f941cc04
28 changed files with 462 additions and 42 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View file

@ -1,3 +1,3 @@
- **06:52** [[quick capture]]: How much salary does a Kubernetes engineer get? - DEV Community 👩‍💻👨‍💻 [How much salary does a Kubernetes engineer get? - DEV Community 👩‍💻👨‍💻](https://dev.to/vikcodes/how-much-salary-does-a-kubernetes-engineer-get-329p) #freelance #finanze
- **06:52** [[quick capture]]: How much salary does a Kubernetes engineer get? - DEV Community 👩‍💻👨‍💻 [How much salary does a Kubernetes engineer get? - DEV Community 👩‍💻👨‍💻](https://dev.to/vikcodes/how-much-salary-does-a-kubernetes-engineer-get-329p) #freelance #finance
- **20:53** [[quick capture]]: https://github.com/themsaid/ibis #ebook #Markdown
- **19:36** [[quick capture]]: Using Postgres as a task queue for rowdy Gophers - DEV Community 👩‍💻👨‍💻 [Using Postgres as a task queue for rowdy Gophers - DEV Community 👩‍💻👨‍💻](https://ente.io/blog/tech/postgres-queue/) #golang #postgres

View file

@ -1,6 +1,6 @@
- **10:19** [[quick capture]]: The Linux Command Line [The Linux Command Line](https://news.ycombinator.com/item?id=34161081) #linux #linuxcommandline #book #[[Amministrazione Sistemi Linux]]
id:: 63bbf018-28d3-4074-a0b9-9fb7cee289c9
- **10:26** [[quick capture]]: Poll: What's the best laptop for Linux these days? [Poll: What's the best laptop for Linux these days?](https://news.ycombinator.com/item?id=34180508) #linux #laptop
- **10:39** [[quick capture]]: PostgREST Serve a RESTful API from any Postgres database [PostgREST Serve a RESTful API from any Postgres database](https://news.ycombinator.com/item?id=34172205) #postgres #supabase #rest
- **10:39** [[quick capture]]: PostgREST Serve a RESTful API from any Postgres database [PostgREST Serve a RESTful API from any Postgres database](https://news.ycombinator.com/item?id=34172205) #postgres #supabase #REST
- =======
- [Tutorial](https://www.raeffs.dev/blog/self-hosting/2022-11-11-mastodon-with-docker/) per l'installazione di un'instanza #mastodon utilizzando #docker #selfhosting #fediverse

View file

@ -1,9 +1,9 @@
- **08:14** [[quick capture]]: https://andy-bell.co.uk/my-favourite-3-lines-of-css/ #css
- **20:22** [[quick capture]]: Django and HTMX - DEV Community 👩‍💻👨‍💻 [Django and HTMX - DEV Community 👩‍💻👨‍💻](https://dev.to/kummerer94/django-and-htmx-i5c) #htmx #jwt
- **20:24** [[quick capture]]: A Beginner's Guide to Using Fetch and Axios to Consume REST APIs in React - DEV Community 👩‍💻👨‍💻 [A Beginner's Guide to Using Fetch and Axios to Consume REST APIs in React - DEV Community 👩‍💻👨‍💻](https://dev.to/jhimmyofficial/a-beginners-guide-to-using-fetch-and-axios-to-consume-rest-apis-in-react-3dib) #Javascript #rest #nojsframework
- **20:24** [[quick capture]]: A Beginner's Guide to Using Fetch and Axios to Consume REST APIs in React - DEV Community 👩‍💻👨‍💻 [A Beginner's Guide to Using Fetch and Axios to Consume REST APIs in React - DEV Community 👩‍💻👨‍💻](https://dev.to/jhimmyofficial/a-beginners-guide-to-using-fetch-and-axios-to-consume-rest-apis-in-react-3dib) #Javascript #REST #nojsframework
- **20:28** [[quick capture]]: How to Create Your Own Commands in Linux - DEV Community 👩‍💻👨‍💻 [How to Create Your Own Commands in Linux - DEV Community 👩‍💻👨‍💻](https://dev.to/ther4v3n/how-to-create-your-own-commands-in-linux-3kgb) #linuxcommandline #[[Amministrazione Sistemi Linux]]
- **20:54** [[quick capture]]: sqlite package - crawshaw.io/sqlite - Go Packages [sqlite package - crawshaw.io/sqlite - Go Packages](https://pkg.go.dev/crawshaw.io/sqlite) #sqlite
- **21:07** [[quick capture]]: Retrieve User's Posts Write.as API Documentation [Retrieve User's Posts Write.as API Documentation](https://developers.write.as/docs/api/#retrieve-user-39-s-posts) #WriteFreely #rest
- **21:07** [[quick capture]]: Retrieve User's Posts Write.as API Documentation [Retrieve User's Posts Write.as API Documentation](https://developers.write.as/docs/api/#retrieve-user-39-s-posts) #WriteFreely #REST
- **21:09** [[quick capture]]: writeas package - github.com/writeas/go-writeas/v2 - Go Packages [writeas package - github.com/writeas/go-writeas/v2 - Go Packages](https://pkg.go.dev/github.com/writeas/go-writeas/v2) #WriteFreely
-
- **21:32** [[quick capture]]: Prompt Engineering Guide: Guides, papers, and resources for prompt engineering [Prompt Engineering Guide: Guides, papers, and resources for prompt engineering](https://news.ycombinator.com/item?id=34883486) #AI #prompt-engineering

View file

@ -15,4 +15,4 @@
- **15:12** [[quick capture]]: [Show HN: Open Interpreter CodeLlama in your terminal, executing code](https://news.ycombinator.com/item?id=37315866) #llm #programming
- **19:42** [[quick capture]]: [Usenet, the OG social network, rises again like a text-only phoenix](https://news.ycombinator.com/item?id=37336606) #usenet
- **21:15** [[quick capture]]: [Teaching with AI](https://news.ycombinator.com/item?id=37340314) #llm #teaching
- **22:45** [[quick capture]]: [Ghostfolio: Open-source wealth management software](https://news.ycombinator.com/item?id=37337482) #finanze
- **22:45** [[quick capture]]: [Ghostfolio: Open-source wealth management software](https://news.ycombinator.com/item?id=37337482) #finance

View file

@ -1,4 +1,4 @@
- **09:47** [[quick capture]]: [How to Learn Emacs (2012)](https://news.ycombinator.com/item?id=37438842) #emacs
- **09:49** [[quick capture]]: [How to Learn Emacs (2012)](https://news.ycombinator.com/item?id=37438842)
- **10:15** [[quick capture]]: ![Manuale_e-note_WEB](../assets/Manuale_e-note_WEB.pdf)
- **15:42** [[quick capture]]: https://replicate.com/ #ai #rest
- **15:42** [[quick capture]]: https://replicate.com/ #ai #REST

View file

@ -13,5 +13,5 @@
find . -maxdepth 1 -type d | sed 's/\.\///g' | tail -n +2 | while IFS= read -r line; do echo $line; done;
```
- **14:46** [[quick capture]]: [Show HN: Free High-quality TailwindCSS Components. No attribution required](https://news.ycombinator.com/item?id=37465533) #tailwind
- **15:42** [[quick capture]]: [REST API - Nextcloud Deck](https://deck.readthedocs.io/en/latest/API/) #rest #API
- **15:42** [[quick capture]]: [REST API - Nextcloud Deck](https://deck.readthedocs.io/en/latest/API/) #REST #API
- **21:28** [[quick capture]]: [You Don't Need UUID](https://news.ycombinator.com/item?id=37469857) #uuid #Probo

View file

@ -1 +1 @@
- **09:07** [[quick capture]]: [Show HN: Every Breath You Take Heart Rate Variability Training](https://news.ycombinator.com/item?id=37538028)
- **09:07** [[quick capture]]: [Show HN: Every Breath You Take Heart Rate Variability Training](https://news.ycombinator.com/item?id=37538028) #fitness

View file

@ -12,6 +12,5 @@
- Un PDF prodotto dalla scuola ha bisogno sempre di una firma digitale
- La DS riceve in doppia autenticazione un codice OTP
- Interessante la differenza tra firma forte e firma debole (firmato elettronicamente)
- **21:11** [[quick capture]]: @morpheu5@livellosegreto.it 🔗 https://livellosegreto.it/users/morpheu5/statuses/111086896444359524
-
Per un giochino stile Papers Please però a tema negozi, pagamenti, eccetera, mi servirebbero delle tracce per la colonna sonora, idealmente chiptune o synthwave (o synthwave chiptune) un po' upbeat ma non troppo, livello muzak, possibilmente loopabili. Qualcuno ha elenchi di roba o gratis o royalty free a cifre ragionevoli per uso non esclusivo? Taggherei @kenobit e @sio che mi sembrano nel giro, ma chiunque è il benvenuto. Condiviso via Fedilab
- **21:11** [[quick capture]]: @morpheu5@livellosegreto.it 🔗 https://livellosegreto.it/users/morpheu5/statuses/111086896444359524 #retrogaming
- Per un giochino stile Papers Please però a tema negozi, pagamenti, eccetera, mi servirebbero delle tracce per la colonna sonora, idealmente chiptune o synthwave (o synthwave chiptune) un po' upbeat ma non troppo, livello muzak, possibilmente loopabili. Qualcuno ha elenchi di roba o gratis o royalty free a cifre ragionevoli per uso non esclusivo? Taggherei @kenobit e @sio che mi sembrano nel giro, ma chiunque è il benvenuto. Condiviso via Fedilab

View file

@ -1,5 +1,3 @@
<<<<<<< HEAD
- **09:34** [[quick capture]]: ![Screenshot_20230919-093403](../assets/Screenshot_20230919-093403.png)
- **12:04** [[quick capture]]: [miraclecast as source · Issue #4 · albfan/miraclecast · GitHub](https://github.com/albfan/miraclecast/issues/4)
- **15:32** [[quick capture]]: [Fx Terminal JSON Viewer](https://news.ycombinator.com/item?id=37567009) #json

View file

@ -1,9 +1,9 @@
- **06:46** [[quick capture]]: [Show HN: ElectricSQL, Postgres to SQLite active-active sync for local-first apps](https://news.ycombinator.com/item?id=37584049) #postgres #sqlite #local
- **20:20** [[quick capture]]: [isomorphic-git · A pure JavaScript implementation of git for node and browsers!](https://isomorphic-git.org/) #git #Javascript
- **20:30** [[quick capture]]: https://opensource.com/article/21/1/raspberry-pi-hifi #raspberrypi #tinkering #music
- **20:34** [[quick capture]]: https://github.com/samuelclay/NewsBlur
- **20:34** [[quick capture]]: https://github.com/samuelclay/NewsBlur #selfhosting
- **20:49** [[quick capture]]: https://www.gog.com/en/partner/free_games
- Se utilizzo il comando `kill` senza opzioni il segnale di default è `SIGTERM`
- Man-In-The-Middle proxy https://github.com/mitmproxy/mitmproxy da utilizzare nel corso #[[Cybersecurity con sistemi Linux]]
- Archivio pubblico di certificati SSL
- Archivio pubblico di certificati SSL #cybersecurity
- https://crt.sh

View file

@ -7,7 +7,7 @@
docker exec -it -u www-data nextcloud_app_1 ./occ trashbin:cleanup --all-users
```
- ## 1 D LIN
- Studenti assenti il giorno dello sciopero
- Studenti assenti il giorno dello sciopero #teaching
- DEVETTA
- GAROFALO
- LO VECCHIO

View file

@ -1,4 +1,4 @@
- I seguenti studenti della 1 D LIN sono senza compiti
- I seguenti studenti della 1 D LIN sono senza compiti #teaching
- MUNI
- GIOVANNA
- Per installare la suite da ufficio `collabora` su un'istanza di #nextcloud utilizzando la #linuxcommandline
@ -8,4 +8,4 @@
```
- Font `monospace` utilizzati nel sito [musicforprogramming](https://musicforprogramming.net/credits) #programming #music #freelance
- https://github.com/IBM/plex/
- **21:42** [[quick capture]]: [Show HN: RISC-V assembly tabletop board game (hack your opponent)](https://news.ycombinator.com/item?id=37704760)
- **21:42** [[quick capture]]: [Show HN: RISC-V assembly tabletop board game (hack your opponent)](https://news.ycombinator.com/item?id=37704760)

View file

@ -2,6 +2,5 @@
- Facchettin (conoscenze confuse su grafico velocità tempo ed espressione della velocità in funzione del tempo)
- Coslovich (conoscenze confuse su caduta dei gravi)
- Mosca (6,5)
- =======
- **13:48** [[quick capture]]: https://github.com/trholding/llama2.c
- **13:48** [[quick capture]]: https://github.com/trholding/llama2.c #llm #llama
- **19:48** [[quick capture]]: [Running Stable Diffusion XL 1.0 in 298MB of RAM](https://news.ycombinator.com/item?id=37752632) #stablediffusion

View file

@ -2,6 +2,5 @@
- Name
- Query
- In particolare il campo `Query` è una stringa di ricerca utile a selezionare i quiz in base a dei criteri (ad esempio il tag).
=======
- **16:27** [[quick capture]]: [An Interactive Intro to CRDTs](https://news.ycombinator.com/item?id=37764581) #Probo #CRDT #local
- **19:46** [[quick capture]]: [The Greening of Milan: Porta Nuova and Vertical Forest](https://news.ycombinator.com/item?id=37736211)

View file

@ -1,4 +1,3 @@
- Per installare #Docker su una distro Kali Linux con package manger `apt` occorre modificare il file `docker.list` inserendo come nome della release `bookworm` o comunque la release `Debian` da cui quella distribuzione di Kali deriva
=======
- **07:46** [[quick capture]]: [Show HN: Sqinn-Go is a Golang library for accessing SQLite databases in pure Go](https://news.ycombinator.com/item?id=37769633) #sqlite #Golang #Probo
- **18:52** [[quick capture]]: [Bitmagnet: A self-hosted BitTorrent indexer, DHT crawler, and torrent search](https://news.ycombinator.com/item?id=37777347)
- **18:52** [[quick capture]]: [Bitmagnet: A self-hosted BitTorrent indexer, DHT crawler, and torrent search](https://news.ycombinator.com/item?id=37777347) #htpc #torrent

View file

@ -1,2 +1,2 @@
- **07:31** [[quick capture]]: [Ollama is now available as an official Docker image](https://news.ycombinator.com/item?id=37786525) #llama #docker #llm
- **14:49** [[quick capture]]: [Show HN: Another way to use an old tablet as an extra screen](https://news.ycombinator.com/item?id=37789371)
- **14:49** [[quick capture]]: [Show HN: Another way to use an old tablet as an extra screen](https://news.ycombinator.com/item?id=37789371) #productivity #hardware

View file

@ -1,5 +1,4 @@
- **14:48** [[quick capture]]: [A Clutter-Free Life: Going Paperless with Paperless-Ngx](https://news.ycombinator.com/item?id=37800951)
- **14:48** [[quick capture]]: [A Clutter-Free Life: Going Paperless with Paperless-Ngx](https://news.ycombinator.com/item?id=37800951) #selfhosting
- **20:17** [[quick capture]]: [GitHub - alecthomas/participle: A parser library for Go](https://github.com/alecthomas/participle) #Golang #Probo
- **20:18** [[quick capture]]: [Let's build a search query parser in Go](https://prasanthmj.github.io/go/simple-query-parser/) #Golang
- **20:35** [[quick capture]]: [Paperless-ngx Open source document management system](https://news.ycombinator.com/item?id=37800951)
-
- **20:35** [[quick capture]]: [Paperless-ngx Open source document management system](https://news.ycombinator.com/item?id=37800951) #selfhosting

View file

@ -1,2 +1 @@
- **07:53** [[quick capture]]: [World On A Wire (1973) : Rainer Werner Fassbiner : Free Download, Borrow, and Streaming : Internet Archive](https://archive.org/details/world-on-a-wire-1973-welt-am-draht-original-title-crime-mystery-sci-fi-r-w-fassbinder-360p)
-
- **07:53** [[quick capture]]: [World On A Wire (1973) : Rainer Werner Fassbiner : Free Download, Borrow, and Streaming : Internet Archive](https://archive.org/details/world-on-a-wire-1973-welt-am-draht-original-title-crime-mystery-sci-fi-r-w-fassbinder-360p) #movies #teaching

View file

@ -1,3 +1,3 @@
- **06:00** [[quick capture]]: [DSLinux Linux for the Nintendo DS](https://news.ycombinator.com/item?id=37826357)
- **06:00** [[quick capture]]: [DSLinux Linux for the Nintendo DS](https://news.ycombinator.com/item?id=37826357) #linux #retrogaming #tinkering
- **10:02** [[quick capture]]: [How to Make a Cantenna (2013)](https://news.ycombinator.com/item?id=37826256) #teaching #networking
-

View file

@ -1,4 +1,4 @@
- **12:49** [[quick capture]]: [Show HN: Obligator An OpenID Connect server for self-hosters](https://news.ycombinator.com/item?id=37848793) #auth #selfhosting
- **21:24** [[quick capture]]: [Show HN: Nostalgist.js Run emulators of retro consoles, within web browsers](https://news.ycombinator.com/item?id=37854844)
- **21:35** [[quick capture]]: https://whenwillirunoutofmoney.com/
- **21:42** [[quick capture]]: https://news.ycombinator.com/user?id=tynmann
- **21:24** [[quick capture]]: [Show HN: Nostalgist.js Run emulators of retro consoles, within web browsers](https://news.ycombinator.com/item?id=37854844) #retrogaming
- **21:35** [[quick capture]]: https://whenwillirunoutofmoney.com/ #finance
- **21:42** [[quick capture]]: https://news.ycombinator.com/user?id=tynmann #writing #llm

View file

@ -1,4 +1,3 @@
- Livello 8 di Lemmings SGXPW #retrogaming
- Livello 9 di Lemmings BYBGD #retrogaming
- Livello 10 di Lemmings GRXMN #retrogaming
-
- Livello 10 di Lemmings GRXMN #retrogaming

View file

@ -1 +1 @@
- **06:49** [[quick capture]]: [The MP3mobile (1998)](https://news.ycombinator.com/item?id=37870061)
- **06:49** [[quick capture]]: [The MP3mobile (1998)](https://news.ycombinator.com/item?id=37870061) #music #tinkering

View file

@ -1,6 +1,180 @@
- **20:00** [[quick capture]]: [Better HTTP server routing in Go 1.22](https://news.ycombinator.com/item?id=37898999) #Golang #HTTP #rest #Probo
- **20:08** [[quick capture]]: [Compile SQL to type-safe code | sqlc.dev](https://sqlc.dev/)
- Conversazione con #GPT-4 su configurazione storage ibrido #sqlite e filesystem per #Probo
- Ho bisogno di una consulenza che riguarda lo sviluppo di un'applicazione local-first i cui dati sono principalmente costituiti da file markdown locali. I file sono debolmente in relazione tra loro se non per la presenza di tags identificati all'interno del testo markdown da un prefisso '#'.
- È plausibile, secondo te, utilizzare delle strutture dati completamente in memoria senza necessità di operare con un dbms relazionale tipo sqlite?
- Come gestiresti in tal caso l'aggiornamento delle strutture al cambiare delle informazioni presenti sul disco?
- Si potrebbe anche pensare ad un approccio ibrido in cui viene comunque creato un DB locale, per esempio SQLite, pur mantenendo i file markdown come sorgente principale dei dati?
- Come gestiresti in tal caso l'aggiornamento delle relazioni tra i dati al cambiare delle informazioni presenti sul disco?
- Sì, è plausibile utilizzare delle strutture dati completamente in memoria, come ad esempio hash map o liste, per gestire i dati dei tuoi file markdown. Questo approccio può essere molto efficiente in termini di velocità, ma potrebbe presentare dei problemi in termini di persistenza dei dati e gestione della memoria, soprattutto se la quantità di dati è molto grande.
- Per gestire l'aggiornamento delle strutture al cambiare delle informazioni presenti sul disco, potresti utilizzare un approccio basato su eventi o polling. Ad esempio, potresti avere un processo in background che monitora i file sul disco e, quando rileva un cambiamento, aggiorna le strutture dati in memoria.
- Un approccio ibrido che prevede l'utilizzo di un DB locale come SQLite potrebbe essere una buona soluzione se hai bisogno di una maggiore persistenza dei dati e se la quantità di dati è molto grande. In questo caso, i file markdown sarebbero la sorgente principale dei dati, ma questi verrebbero anche salvati nel database per facilitare le operazioni di query e aggiornamento.
- Per gestire l'aggiornamento delle relazioni tra i dati al cambiare delle informazioni presenti sul disco, potresti utilizzare un approccio simile a quello descritto sopra. Ad esempio, potresti avere un processo in background che monitora i file sul disco e, quando rileva un cambiamento, aggiorna sia le strutture dati in memoria che il database. Per mantenere la coerenza tra i dati in memoria e quelli nel database, potresti utilizzare un meccanismo di transazione o locking.
- Un altro aspetto da considerare è l'indicizzazione dei dati. Se hai bisogno di eseguire frequentemente operazioni di ricerca o query sui tuoi dati, potrebbe essere utile creare degli indici, ad esempio basati sui tags, per accelerare queste operazioni. Questi indici potrebbero essere salvati sia in memoria che nel database, a seconda delle tue esigenze.
- Parlami più approfonditamente degli indici basati sui tags utilizzando l'approccio in-memory. Produci un semplice esempio in Go.
- Gli indici basati sui tag possono essere utilizzati per velocizzare le operazioni di ricerca e query sui tuoi dati. In un contesto in-memory, potresti creare un indice come una mappa in cui le chiavi sono i tag e i valori sono le liste dei file markdown che contengono quel tag.
- Ecco un esempio molto semplice in Go:
- ```go
package main
- import (
"fmt"
"strings"
)
- // Struttura dati per i file markdown
type MarkdownFile struct {
Id string
Data string
}
- // Indice basato sui tag
var tagIndex map[string][]*MarkdownFile
- func main() {
// Inizializza l'indice
tagIndex = make(map[string][]*MarkdownFile)
- // Crea alcuni file markdown
file1 := &MarkdownFile{
Id: "1",
Data: "#tag1 Contenuto del file 1",
}
file2 := &MarkdownFile{
Id: "2",
Data: "#tag2 Contenuto del file 2",
}
file3 := &MarkdownFile{
Id: "3",
Data: "#tag1 #tag2 Contenuto del file 3",
}
- // Aggiunge i file all'indice
addToIndex(file1)
addToIndex(file2)
addToIndex(file3)
- // Stampa i file che contengono un certo tag
printFilesWithTag("#tag1")
printFilesWithTag("#tag2")
}
- // Aggiunge un file all'indice
func addToIndex(file *MarkdownFile) {
// Estrae i tag dal contenuto del file
tags := strings.FieldsFunc(file.Data, func(r rune) bool {
return r == '#'
})
- // Aggiunge il file all'elenco di file per ogni tag
for _, tag := range tags {
tagIndex[tag] = append(tagIndex[tag], file)
}
}
- // Stampa i file che contengono un certo tag
func printFilesWithTag(tag string) {
files, ok := tagIndex[tag]
if !ok {
fmt.Printf("Nessun file con il tag %s\n", tag)
return
}
fmt.Printf("File con il tag %s:\n", tag)
for _, file := range files {
fmt.Printf("- %s\n", file.Id)
}
}
```
- In questo esempio, la funzione `addToIndex` estrae i tag dal contenuto di un file markdown e aggiunge il file all'elenco di file per ogni tag nell'indice. La funzione `printFilesWithTag` stampa gli ID dei file che contengono un certo tag.
- Questo è un esempio molto semplice e potrebbe non essere adatto per un'applicazione reale, in cui potrebbe essere necessario gestire un numero molto grande di file e tag, e in cui i file potrebbero essere modificati o eliminati. Inoltre, potrebbe essere necessario gestire i tag in un modo più sofisticato, ad esempio ignorando la distinzione tra maiuscole e minuscole o normalizzando i tag in qualche modo.
- Ora mostrami un esempio di approccio ibrido in cui viene utilizzato anche un dbms tipo sqlite.
- In un approccio ibrido, potresti utilizzare SQLite per salvare i tuoi dati in modo persistente e per facilitare le operazioni di query e aggiornamento. Tuttavia, potresti anche mantenere in memoria le strutture dati per velocizzare le operazioni di ricerca e query.
- Ecco un esempio molto semplice in Go che utilizza sia un database SQLite che una struttura dati in memoria:
- ```go
package main
- import (
"database/sql"
"fmt"
"strings"
- _ "github.com/mattn/go-sqlite3"
)
- // Struttura dati per i file markdown
type MarkdownFile struct {
Id string
Data string
}
- // Indice basato sui tag
var tagIndex map[string][]*MarkdownFile
- func main() {
// Inizializza l'indice
tagIndex = make(map[string][]*MarkdownFile)
- // Apri il database SQLite
db, err := sql.Open("sqlite3", "./markdown.db")
if err != nil {
panic(err)
}
defer db.Close()
- // Crea la tabella dei file markdown, se non esiste
_, err = db.Exec("CREATE TABLE IF NOT EXISTS files (id TEXT, data TEXT)")
if err != nil {
panic(err)
}
- // Crea alcuni file markdown
file1 := &MarkdownFile{
Id: "1",
Data: "#tag1 Contenuto del file 1",
}
file2 := &MarkdownFile{
Id: "2",
Data: "#tag2 Contenuto del file 2",
}
file3 := &MarkdownFile{
Id: "3",
Data: "#tag1 #tag2 Contenuto del file 3",
}
- // Salva i file nel database e aggiungili all'indice
saveAndIndexFile(db, file1)
saveAndIndexFile(db, file2)
saveAndIndexFile(db, file3)
- // Stampa i file che contengono un certo tag
printFilesWithTag("#tag1")
printFilesWithTag("#tag2")
}
- // Salva un file nel database e lo aggiunge all'indice
func saveAndIndexFile(db *sql.DB, file *MarkdownFile) {
// Salva il file nel database
_, err := db.Exec("INSERT INTO files (id, data) VALUES (?, ?)", file.Id, file.Data)
if err != nil {
panic(err)
}
- // Aggiunge il file all'indice
addToIndex(file)
}
- // Aggiunge un file all'indice
func addToIndex(file *MarkdownFile) {
// Estrae i tag dal contenuto del file
tags := strings.FieldsFunc(file.Data, func(r rune) bool {
return r == '#'
})
- // Aggiunge il file all'elenco di file per ogni tag
for _, tag := range tags {
tagIndex[tag] = append(tagIndex[tag], file)
}
}
- // Stampa i file che contengono un certo tag
func printFilesWithTag(tag string) {
files, ok := tagIndex[tag]
if !ok {
fmt.Printf("Nessun file con il tag %s\n", tag)
return
}
fmt.Printf("File con il tag %s:\n", tag)
for _, file := range files {
fmt.Printf("- %s\n", file.Id)
}
}
```
- In questo esempio, la funzione `saveAndIndexFile` salva un file markdown nel database SQLite e lo aggiunge all'indice in memoria. La funzione `addToIndex` e `printFilesWithTag` funzionano come nell'esempio precedente.
- Anche in questo caso, questo è un esempio molto semplice e potrebbe non essere adatto per un'applicazione reale, in cui potrebbe essere necessario gestire un numero molto grande di file e tag, e in cui i file potrebbero essere modificati o eliminati. Inoltre, potrebbe essere necessario gestire i tag in un modo più sofisticato, ad esempio ignorando la distinzione tra maiuscole e minuscole o normalizzando i tag in qualche modo.
- Per importare una connessione #openvpn tramite il provider ExpressVPN utilizzando la #linuxcommandline su una distribuzione #archlinux
- ```bash
sudo nmcli connection import type openvpn file ~/housecloud.andreafazzi.eu/conf/expressvpn/express_vpn_milan.ovpn
```
- Per inserire lo username attraverso il comando `nmcli`
- ```bash
nmcli connection modify express_vpn_milan +vpn.data username=USERNAME
```
- **20:00** [[quick capture]]: [Better HTTP server routing in Go 1.22](https://news.ycombinator.com/item?id=37898999) #Golang #HTTP #REST #Probo
- **20:08** [[quick capture]]: [Compile SQL to type-safe code | sqlc.dev](https://sqlc.dev/) #sqlite #Probo
- **20:18** [[quick capture]]: [GitHub - glebarez/sqlite: The pure-Go SQLite driver for GORM](https://github.com/glebarez/sqlite) #sqlite #orm #Probo
-
- **20:49** [[quick capture]]: [connectivity_plus | Flutter Package](https://pub.dev/packages/connectivity_plus) #flutter #Probo #Android
- **20:52** [[quick capture]]: [GitHub - emacs-lsp/lsp-dart: lsp-mode dart](https://github.com/emacs-lsp/lsp-dart#additional-packages)
- **20:52** [[quick capture]]: [GitHub - emacs-lsp/lsp-dart: lsp-mode dart](https://github.com/emacs-lsp/lsp-dart#additional-packages) #emacs #dart #flutter

View file

@ -1,7 +1,108 @@
- Riflessioni su backend #Probo (aka ProboArena) per la somministrazione dei test
- L'arena è un backend separato dal collector
- Espone un API REST per ricevere i test dal collector
- Per creare un test (collezione di quiz)`GET /test/create`
- Nella richiesta vanno inseriti i quiz e i partecipanti
- Espone un API REST per la somministrazione dei test ai partecipanti
- Per ricevere il test da svolgere `GET /{id}`
- Il parametro `id` identifica in maniera univoca il test da svolgere
- Si potrebbe pensare di scrivere il db sqlite all'interno di un file locale e di trasferire tutto il file sul backend in modo da ricrearlo in remoto.
- **10:36** [[quick capture]]: [FAQ - Docker Mailserver](https://docker-mailserver.github.io/docker-mailserver/latest/faq/) #docker #mailserver
- **10:39** [[quick capture]]: [VPS Hosting » Server virtuali | Da 1 €/mese | IONOS](https://www.ionos.it/server/vps) #vpn #vps #selfhosting
- **10:43** [[quick capture]]: [Configuring NGINX as a Mail Proxy Server | NGINX Documentation](https://docs.nginx.com/nginx/admin-guide/mail-proxy/mail-proxy/) #nginx #selfhosting
- Conversazione con #GPT-4 su configurazione #openvpn #wireguard
- guard e deve servire solo per raggiungere i servizi della mia infrastruttura homelab sulla rete 10.6.0.0/24 e il DNS server all'indirizzo 10.2.0.100. L'altra VPN è basata sul servizio ExpressVPN e funziona attraverso OpenVPN. Per quest'ultima possiedo il file di configurazione ovpn. La VPN basata su ExpressVPN mi serve per "uscire" su internet. Di conseguenza, l'IP pubblico associato alla mia macchina dev'essere quello fornito da Express VPN. Mostrami la configurazione necessaria e rilevante per configurare la mia distribuzione Arch Linux in modo da gestire contemporaneamente le due VPN.
- Per raggiungere il tuo obiettivo, dovrai configurare entrambe le VPN e impostare le regole di routing appropriate. Ecco una guida passo-passo su come farlo:
- 1. Installa Wireguard e OpenVPN:
- ```
sudo pacman -Syu openvpn wireguard-tools
```
- 2. Configura la VPN Wireguard:
- Crea un file di configurazione Wireguard (ad esempio `/etc/wireguard/wg0.conf`) e inserisci i dettagli della tua VPN Wireguard. Assicurati di impostare `AllowedIPs` alla rete del tuo homelab, cioè `10.6.0.0/24`.
- ```
[Interface]
PrivateKey = YOUR_PRIVATE_KEY
Address = YOUR_WIREGUARD_VPN_ADDRESS
- [Peer]
PublicKey = PEER_PUBLIC_KEY
AllowedIPs = 10.6.0.0/24
Endpoint = PEER_ENDPOINT
```
- 3. Avvia la VPN Wireguard:
- ```
sudo wg-quick up wg0
```
- 4. Configura la VPN OpenVPN:
- Metti il tuo file di configurazione OpenVPN (ad esempio `client.ovpn`) nella directory `/etc/openvpn/client/`.
- 5. Modifica il file di configurazione OpenVPN:
- Apri il file `client.ovpn` con un editor di testo e aggiungi la seguente riga alla fine del file:
- ```
route-nopull
route 0.0.0.0 128.0.0.0
route 128.0.0.0 128.0.0.0
```
- Questo configurerà la VPN OpenVPN per gestire tutto il traffico Internet, tranne il traffico destinato alla rete `10.6.0.0/24`.
- 6. Avvia la VPN OpenVPN:
- ```
sudo systemctl start openvpn-client@client
```
- 7. Configura il DNS:
- Crea un file di configurazione per systemd-resolved (ad esempio `/etc/systemd/resolved.conf.d/dns.conf`) e inserisci il seguente contenuto:
- ```
[Resolve]
DNS=10.2.0.100
Domains=~.
```
- Riavvia systemd-resolved:
- ```
sudo systemctl restart systemd-resolved
```
- A questo punto, dovresti essere in grado di connetterti sia alla tua infrastruttura homelab tramite la VPN Wireguard che a Internet tramite la VPN ExpressVPN.
- Non capisco il significato di queste due linee di configurazione:
- route 0.0.0.0 128.0.0.0
- route 128.0.0.0 128.0.0.0
- Queste due righe di configurazione sono usate per dividere il traffico Internet in modo che tutto passi attraverso la VPN OpenVPN. Questo è noto come "split tunneling".
- La riga `route 0.0.0.0 128.0.0.0` indica che tutti gli indirizzi IP da `0.0.0.0` a `127.255.255.255` dovrebbero essere instradati attraverso la VPN.
- La riga `route 128.0.0.0 128.0.0.0` indica che tutti gli indirizzi IP da `128.0.0.0` a `255.255.255.255` dovrebbero essere instradati attraverso la VPN.
Insieme, queste due righe coprono tutti gli indirizzi IP possibili (0.0.0.0 - 255.255.255.255), che significa che tutto il traffico Internet verrà instradato attraverso la VPN. Tuttavia, poiché hai configurato la VPN Wireguard per gestire il traffico destinato alla rete `10.6.0.0/24`, quel traffico specifico non passerà attraverso la VPN OpenVPN.
- Quali sono i comandi da linea di comando che posso utilizzare per verificare le impostazioni delle rotte, degii indirizzi ip configurati e delle interfacce di rete?
- Per verificare le impostazioni delle rotte, puoi utilizzare il comando `ip route` o `route -n`. Questi comandi mostrano la tabella di routing del kernel. Ecco un esempio di output:
- ```
$ ip route
default via 192.168.1.1 dev eth0 proto static
10.6.0.0/24 dev wg0 proto kernel scope link src 10.6.0.1
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
```
- Per verificare gli indirizzi IP configurati, puoi utilizzare il comando `ip addr` o `ifconfig`. Questi comandi mostrano le informazioni di configurazione per tutte le interfacce di rete. Ecco un esempio di output:
- ```
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:45:22:37 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.6.0.1/24 scope global wg0
valid_lft forever preferred_lft forever
```
- Per verificare le interfacce di rete, puoi utilizzare il comando `ip link` o `ifconfig`. Questi comandi mostrano lo stato di tutte le interfacce di rete. Ecco un esempio di output:
- ```
$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether b8:27:eb:45:22:37 brd ff:ff:ff:ff:ff:ff
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/none
```
- **10:36** [[quick capture]]: [FAQ - Docker Mailserver](https://docker-mailserver.github.io/docker-mailserver/latest/faq/) #docker #mailserver
- **10:39** [[quick capture]]: [VPS Hosting » Server virtuali | Da 1 €/mese | IONOS](https://www.ionos.it/server/vps) #vpn #vps #selfhosting
- **10:43** [[quick capture]]: [Configuring NGINX as a Mail Proxy Server | NGINX Documentation](https://docs.nginx.com/nginx/admin-guide/mail-proxy/mail-proxy/) #nginx #selfhosting
- **13:56** [[quick capture]]: [FAQ - Docker Mailserver](https://docker-mailserver.github.io/docker-mailserver/latest/faq/)
- **18:25** [[quick capture]]: [Interviews in the Age of AI: Ditch Leetcode Try Code Reviews Instead](https://news.ycombinator.com/item?id=37913506) #freelance
- **20:19** [[quick capture]]: [Making CRDTs 98% More Efficient](https://news.ycombinator.com/item?id=37915934) @
- **20:23** [[quick capture]]: [Llemma: An Open Language Model for Mathematics](https://news.ycombinator.com/item?id=37918327) #llm
- **20:23** [[quick capture]]: [Llemma: An Open Language Model for Mathematics](https://news.ycombinator.com/item?id=37918327) #llm

View file

@ -1,4 +1,147 @@
- **20:17** [[quick capture]]: [AutoGen: Enable Next-Gen Large Language Model Applications](https://news.ycombinator.com/item?id=37926741) #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](https://www.amazon.it/Lake-N100-Computer-display-Gigabit-Ethernet/dp/B0C4H29D4H) #homelab #hardware
- **21:02** [[quick capture]]: [Raspberry Pi 5 vs. Orange Pi 5 Plus vs. Rock 5 Model B](https://news.ycombinator.com/item?id=37920682) #homelab
- **21:02** [[quick capture]]: [Raspberry Pi 5 vs. Orange Pi 5 Plus vs. Rock 5 Model B](https://news.ycombinator.com/item?id=37920682) #homelab
- Driver #sqlite in pure #golang per GORM
- https://github.com/glebarez/sqlite
- 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:
- ```go
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:
- ```go
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:
- ```go
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:
- ```go
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:
- ```go
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:
- ```go
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.

View file

@ -1 +1,9 @@
- **07:40** [[quick capture]]: [Localsend: Open-Source Airdrop Alternative](https://news.ycombinator.com/item?id=37938183) #[[Lezioni di Cybersecurity con sistemi Linux]] #[[Amministrazione Sistemi Linux]]
- **07:40** [[quick capture]]: [Localsend: Open-Source Airdrop Alternative](https://news.ycombinator.com/item?id=37938183) #[[Lezioni di Cybersecurity con sistemi Linux]] #[[Amministrazione Sistemi Linux]]
- Verifica orale 1 D LIN
- SLOBEZ 5-
- Incerta su potenze con esponente pari e base negativa
- Non svolge esercizi per casa
- RIVOLA
- Continuare l'interrogazione
- Verifica orale 1 C LIN
- BELLIA 5

View file

@ -0,0 +1,3 @@
- Treni
- ![image.png](../assets/image_1697643615795_0.png)
-