Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b7793f04a |
+1
-6
@@ -18,11 +18,6 @@ export default defineConfig({
|
|||||||
theme: 'github-light',
|
theme: 'github-light',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
integrations: [
|
integrations: [preact(), mdx()],
|
||||||
preact({
|
|
||||||
compat: true,
|
|
||||||
}),
|
|
||||||
mdx(),
|
|
||||||
],
|
|
||||||
output: 'static',
|
output: 'static',
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -21,14 +21,12 @@
|
|||||||
"@fontsource/source-sans-pro": "^5.0.8",
|
"@fontsource/source-sans-pro": "^5.0.8",
|
||||||
"@fontsource/space-mono": "^5.0.20",
|
"@fontsource/space-mono": "^5.0.20",
|
||||||
"@phosphor-icons/core": "^2.1.1",
|
"@phosphor-icons/core": "^2.1.1",
|
||||||
"@phosphor-icons/react": "^2.1.7",
|
|
||||||
"@preact/signals": "^1.3.0",
|
"@preact/signals": "^1.3.0",
|
||||||
"@types/jsdom": "^21.1.7",
|
"@types/jsdom": "^21.1.7",
|
||||||
"astro": "5.1.0",
|
"astro": "5.1.0",
|
||||||
"fuse.js": "^7.0.0",
|
"fuse.js": "^7.0.0",
|
||||||
"katex": "^0.16.9",
|
"katex": "^0.16.9",
|
||||||
"lucide-static": "^0.468.0",
|
"lucide-static": "^0.468.0",
|
||||||
"marked": "^15.0.6",
|
|
||||||
"preact": "^10.19.6",
|
"preact": "^10.19.6",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
},
|
},
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 82 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 645 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.8 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 113 KiB |
@@ -1,116 +0,0 @@
|
|||||||
import { useEffect, useState } from 'preact/hooks'
|
|
||||||
import { Funnel } from '@phosphor-icons/react'
|
|
||||||
import { marked } from 'marked'
|
|
||||||
|
|
||||||
import type { Database } from '@/data/domande-esami.yaml'
|
|
||||||
|
|
||||||
const useRemoteValue = <T,>(url: string): T | null => {
|
|
||||||
const [value, setValue] = useState<T | null>(null)
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
fetch(url)
|
|
||||||
.then(response => response.json())
|
|
||||||
.then(value => setValue(value))
|
|
||||||
}, [url])
|
|
||||||
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
type Props = {
|
|
||||||
course: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export const DomandeEsamiCourse = ({ course }: Props) => {
|
|
||||||
const database = useRemoteValue<Database>(`/domande-esami/api/${course}.json`)
|
|
||||||
if (!database) {
|
|
||||||
return <>Loading...</>
|
|
||||||
}
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
requestIdleCallback(() => window.renderMath())
|
|
||||||
|
|
||||||
console.log(database)
|
|
||||||
|
|
||||||
const courseTags = [
|
|
||||||
...new Set(
|
|
||||||
database.questions
|
|
||||||
.filter(question => question.course === course)
|
|
||||||
.flatMap(question => question.tags)
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
||||||
const [selectedTags, setSelectedTags] = useState<string[]>([])
|
|
||||||
|
|
||||||
const filteredQuestions = database.questions
|
|
||||||
.filter(question => question.course === course)
|
|
||||||
.filter(
|
|
||||||
question => selectedTags.length === 0 || selectedTags.every(tag => question.tags.includes(tag))
|
|
||||||
)
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div class="grid-center">
|
|
||||||
<h3>
|
|
||||||
<a href="/domande-esami">Domande Esami</a>
|
|
||||||
</h3>
|
|
||||||
<h1>{database.names[course]}</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card filter">
|
|
||||||
<div class="grid-h">
|
|
||||||
<Funnel />
|
|
||||||
<strong>Filtra Tag</strong>
|
|
||||||
</div>
|
|
||||||
<div class="flex-row-wrap">
|
|
||||||
{selectedTags.length === 0
|
|
||||||
? courseTags.map(tag => (
|
|
||||||
<div class="chip clickable" onClick={() => setSelectedTags([tag])}>
|
|
||||||
{tag}
|
|
||||||
</div>
|
|
||||||
))
|
|
||||||
: courseTags.map(tag => (
|
|
||||||
<div
|
|
||||||
class={
|
|
||||||
selectedTags.includes(tag)
|
|
||||||
? 'chip clickable'
|
|
||||||
: 'chip clickable disabled'
|
|
||||||
}
|
|
||||||
onClick={() =>
|
|
||||||
setSelectedTags(
|
|
||||||
selectedTags.includes(tag)
|
|
||||||
? selectedTags.filter(t => t !== tag)
|
|
||||||
: [...selectedTags, tag]
|
|
||||||
)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{tag}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="wide-card-list" id="questions">
|
|
||||||
{filteredQuestions.length === 0 ? (
|
|
||||||
<div class="grid-center">
|
|
||||||
<em>No questions found</em>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
filteredQuestions.map(question => (
|
|
||||||
<div class="card">
|
|
||||||
<div
|
|
||||||
class="text"
|
|
||||||
dangerouslySetInnerHTML={{
|
|
||||||
__html: marked(question.content, { async: false }),
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<div class="metadata">
|
|
||||||
{question.tags.map(tag => (
|
|
||||||
<div class="chip small">{tag}</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
id: stampare-via-ssh
|
||||||
|
title: Stampare via SSH
|
||||||
|
description: Come stampare da remoto tramite SSH
|
||||||
|
author: Antonio De Lucreziis
|
||||||
|
tags: [linux, ssh, stampanti]
|
||||||
|
---
|
||||||
|
|
||||||
|
Per stampare in dipartimento non bisogna per forza usare i computer dei laboratori, possiamo che stampare direttamente da remoto tramite SSH. Vediamo come fare!
|
||||||
|
|
||||||
|
Se non l'avete mai fatto prima per prima cosa bisogna poter accedere da remoto ad una macchina del dipartimento chiamata "login", il suo indirizzo è `login.dm.unipi.it`. Per fare l'accesso possiamo usare il seguente comando con l'account di Ateneo (non quello Poisson!)
|
||||||
|
|
||||||
|
```bash shell
|
||||||
|
ssh USERNAME_ATENEO@login.dm.unipi.it
|
||||||
|
```
|
||||||
|
|
||||||
|
Una volta connessi possiamo stampare utilizzando il comando `lpr` seguito dal nome del file che vogliamo stampare. Prima però serve trasferire il file che vogliamo stampare sulla macchina "login". Per fare ciò possiamo usare il comando `scp`, quindi per prima cosa usciamo dalla macchina "login" (premere `Ctrl+D` oppure scrivendo `exit`), andiamo nella cartella dove si trova il file che vogliamo stampare e poi eseguiamo il comando:
|
||||||
|
|
||||||
|
```bash shell
|
||||||
|
scp NOME_FILE.pdf USERNAME_ATENEO@login.dm.unipi.it:~/Documents
|
||||||
|
```
|
||||||
|
|
||||||
|
Dove `NOME_FILE.pdf` è il nome del file che vogliamo stampare e `Documents` è la cartella dove vogliamo trasferirlo. Una volta trasferito il file possiamo rifare ssh su "login" e stampare il file con il comando:
|
||||||
|
|
||||||
|
```bash shell
|
||||||
|
lpr Documents/NOME_FILE.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternativamente possiamo stampare direttamente il file senza trasferirlo con il comando:
|
||||||
|
|
||||||
|
```bash shell
|
||||||
|
cat NOME_FILE.pdf | ssh USERNAME_ATENEO@login.dm.unipi.it lpr OPZIONI... -
|
||||||
|
```
|
||||||
|
|
||||||
|
dove `[OPZIONI...]` sono le opzioni che possiamo passare a `lpr` (vedi sotto). L'ultimo trattino "`-`" è molto importante e indica che il file da stampare è quello in standard input. Più precisamente, `cat NOME_FILE.pdf` invia il contenuto del file `NOME_FILE.pdf` allo standard output e `|` lo ridireziona a input di `ssh`, che a sua volta lo passa a `lpr` via rete.
|
||||||
|
|
||||||
|
## Opzioni di `lpr`
|
||||||
|
|
||||||
|
Il comando `lpr` accetta alcune opzioni che possono essere utili:
|
||||||
|
|
||||||
|
- `-P` seguito dal nome della stampante: permette di specificare la stampante su cui stampare, le stampanti disponibili in dipartimento sono
|
||||||
|
|
||||||
|
- `cdc4` che è la stampante di default e si trova in Aula 4
|
||||||
|
|
||||||
|
- `cdclf` che si trova al piano terra nel corridoio dopo l'Aula 4
|
||||||
|
|
||||||
|
- `cdc3` che si trova in Aula 3 (è un po' vecchia ma di solito funziona)
|
||||||
|
|
||||||
|
- `-#` seguito dal numero di copie: permette di specificare il numero di copie da stampare. In realtà questa opzione non funziona per vari motivi arcani e se uno passa `-#N` per stampare $N$ copie, la stampante stampa $N^2$ copie. (Questo ha scaturito una serie di ragionamenti sul modo ottimo di decomporre $N$ come somma di quadrati [con tanto di sito di comodo](https://shortest-sum-of-squares.netlify.app/)...)
|
||||||
|
|
||||||
|
- `-o sides=two-sided-long-edge`: permette di stampare fronte-retro (che dovrebbe essere già il default)
|
||||||
|
|
||||||
|
- `-o sides=two-sided-short-edge`: permette di stampare fronte-retro con "la rilegatura" delle pagine sul lato corto
|
||||||
|
|
||||||
|
- `-o sides=one-sided`: permette di stampare solo fronte, comodo per stampare i meme di laurea
|
||||||
|
|
||||||
|
- `-o fit-to-page`: permette di ridimensionare il documento per farlo entrare in un foglio (è buona prassi passare sempre questa opzione)
|
||||||
|
|
||||||
|
- `-o media=a4`: permette di specificare il formato del foglio, di default è A4 quindi non dovrebbere servire
|
||||||
|
|
||||||
|
## Altre comodità
|
||||||
|
|
||||||
|
Stampare da remoto porta anche altre comodità, ad esempio possiamo interrompere un file che abbiamo mandato in stampa per sbaglio con il comando (sempre tutti comandi da eseguire su "login")
|
||||||
|
|
||||||
|
```bash shell
|
||||||
|
cancel -a
|
||||||
|
```
|
||||||
|
|
||||||
|
Oppure possiamo vedere lo stato della coda di stampa con il comando
|
||||||
|
|
||||||
|
```bash shell
|
||||||
|
lpq -a
|
||||||
|
```
|
||||||
|
|
||||||
|
o per vedere lo stato delle nostre stampe
|
||||||
|
|
||||||
|
```bash shell
|
||||||
|
lpstat -l
|
||||||
|
```
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
---
|
|
||||||
title: Incidente del 2-7 Gennaio 2025
|
|
||||||
description: Riassunto dell'incidente che ha portato al guasto del server Poisson e delle azioni intraprese per ripristinare i servizi.
|
|
||||||
publishDate: 2025-01-07
|
|
||||||
---
|
|
||||||
|
|
||||||
# Incidente 2-7 Gennaio 2025
|
|
||||||
|
|
||||||
In questi giorni il server fisico principale del PHC, **Poisson**, non è stato operativo. Di conseguenza, i servizi ospitati direttamente su Poisson, come le pagine web degli utenti, l'accesso SSH e Gitea, sono rimasti offline. Al contrario, altri servizi web del PHC che non sono hostati su Poisson non hanno subito interruzioni. La buona notizia è che tutti i dati sono stati recuperati con successo e che l'infrastruttura è tornata pienamente operativa senza ulteriori complicazioni.
|
|
||||||
|
|
||||||
## Cosa è successo?
|
|
||||||
|
|
||||||
Sospettiamo che la causa principale dell'incidente sia stata una serie di brusche accensioni e spegnimenti, che hanno portato al guasto della scheda madre di Poisson. Il server non riusciva più ad avviarsi, neanche accedendo al BIOS, rendendo evidente che il problema era di natura hardware.
|
|
||||||
|
|
||||||
### Diagnosi e sostituzione
|
|
||||||
|
|
||||||
La mattina del 7 Gennaio, grazie alla disponibilità del dipartimento, abbiamo trovato una scheda madre di recupero, simile a quella originale ma meno potente. Questa è stata installata immediatamente, permettendo di riportare Poisson in funzione. Dal punto di vista software non è cambiato nulla: l'architettura della CPU è rimasta invariata, sebbene con meno core e la metà della RAM. Gli Hard Disks e una delle schede di rete sono stati riutilizzati senza problemi.
|
|
||||||
|
|
||||||
In un futuro prossimo si prevede di aggiornare la scheda madre con una più potente, per garantire le prestazioni di Poisson. Preghiamo per ora quindi di evitare di eseguire operazioni troppo pesanti sul server.
|
|
||||||
|
|
||||||
Tutto è stato rimontato nel consueto case bianco che ospita Poisson. Anche se ora è operativo, il server potrebbe essere considerato una nuova incarnazione, sollevando una riflessione interessante: **Poisson è ancora lo stesso server?** Proprio come nel paradosso della nave di Teseo, molti componenti di Poisson sono stati sostituiti nel corso degli anni. Dal 1992, pezzi come HDD, CPU, RAM e schede madri sono stati aggiornati per mantenere il server al passo con i tempi, mentre i dati e le funzionalità sono rimasti intatti.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Ritorno alla normalità
|
|
||||||
|
|
||||||
Grazie all’intervento, i servizi principali sono tornati online. Gli utenti possono nuovamente accedere alle proprie pagine web, utilizzare SSH e lavorare su Gitea senza alcuna modifica ai dati o alle configurazioni precedenti.
|
|
||||||
|
|
||||||
Per chi avesse riscontrato difficoltà nell'accesso, invitiamo a contattare i macchinisti per ricevere supporto.
|
|
||||||
|
|
||||||
> Be a System Administrator, they said. It will be fun, they said 🤦♂️
|
|
||||||
@@ -1,201 +0,0 @@
|
|||||||
names:
|
|
||||||
aritmetica: Aritmetica
|
|
||||||
geometria-1: Geometria 1
|
|
||||||
analisi-1: Analisi 1
|
|
||||||
algebra-1: Algebra 1
|
|
||||||
geometria-2: Geometria 2
|
|
||||||
analisi-2: Analisi 2
|
|
||||||
algebra-2: Algebra 2
|
|
||||||
analisi-3: Analisi 3
|
|
||||||
ricerca-operativa: Ricerca Operativa
|
|
||||||
fisica-3: Fisica 3
|
|
||||||
meccanica-razionale: Meccanica Razionale
|
|
||||||
istituzioni-di-geometria: Istituzioni di Geometria
|
|
||||||
istituzioni-di-analisi: Istituzioni di Analisi
|
|
||||||
istituzioni-di-algebra: Istituzioni di Algebra
|
|
||||||
istituzioni-di-fisica: Istituzioni di Fisica
|
|
||||||
istituzioni-di-probabilità: Istituzioni di Probabilità
|
|
||||||
geometria-e-topologia-differenziale: Geometria e Topologia Differenziale
|
|
||||||
analisi-armonica: Analisi Armonica
|
|
||||||
elementi-di-analisi-complessa: Elementi di Analisi Complessa
|
|
||||||
|
|
||||||
groups:
|
|
||||||
- id: triennale-anno-1
|
|
||||||
name: I Anno Triennale
|
|
||||||
items:
|
|
||||||
- aritmetica
|
|
||||||
- geometria-1
|
|
||||||
- analisi-1
|
|
||||||
- algebra-1
|
|
||||||
|
|
||||||
- id: triennale-anno-2
|
|
||||||
name: II Anno Triennale
|
|
||||||
items:
|
|
||||||
- geometria-2
|
|
||||||
- analisi-2
|
|
||||||
- algebra-1
|
|
||||||
|
|
||||||
- id: triennale-anno-3
|
|
||||||
name: III Anno Triennale
|
|
||||||
items:
|
|
||||||
- ricerca-operativa
|
|
||||||
- fisica-3
|
|
||||||
- meccanica-razionale
|
|
||||||
|
|
||||||
- id: istituzioni
|
|
||||||
name: Istituzioni
|
|
||||||
items:
|
|
||||||
- istituzioni-di-geometria
|
|
||||||
- istituzioni-di-analisi
|
|
||||||
- istituzioni-di-algebra
|
|
||||||
- istituzioni-di-fisica
|
|
||||||
- istituzioni-di-probabilità
|
|
||||||
|
|
||||||
- id: other
|
|
||||||
name: Esami a scelta
|
|
||||||
items:
|
|
||||||
- geometria-e-topologia-differenziale
|
|
||||||
- analisi-armonica
|
|
||||||
- elementi-di-analisi-complessa
|
|
||||||
|
|
||||||
questions:
|
|
||||||
- course: geometria-1
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema spettrale reale
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: gtd
|
|
||||||
content: |
|
|
||||||
Calcolare la curvatura gaussiana di una sfera di raggio $r$
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: geometria-1
|
|
||||||
content: |
|
|
||||||
Dimostrare che _l'area_ di un cerchio è $A = \pi r^2$
|
|
||||||
tags:
|
|
||||||
- 2023
|
|
||||||
|
|
||||||
- course: algebra-1
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Sylow
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: algebra-1
|
|
||||||
content: |
|
|
||||||
Dimostrare che ogni sottogruppo di un gruppo ciclico è ciclico
|
|
||||||
tags:
|
|
||||||
- 2023
|
|
||||||
|
|
||||||
- course: analisi-1
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Weierstrass
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: analisi-1
|
|
||||||
content: |
|
|
||||||
Dimostrare che se $f$ è continua su $[a,b]$, allora $f$ è limitata
|
|
||||||
tags:
|
|
||||||
- 2023
|
|
||||||
|
|
||||||
- course: analisi-2
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Stokes
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: analisi-2
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Green
|
|
||||||
tags:
|
|
||||||
- 2023
|
|
||||||
|
|
||||||
- course: analisi-3
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Cauchy
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: analisi-3
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Liouville
|
|
||||||
tags:
|
|
||||||
- 2023
|
|
||||||
|
|
||||||
- course: algebra-2
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di struttura per i gruppi abeliani finiti
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: algebra-2
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di struttura per i gruppi finiti
|
|
||||||
tags:
|
|
||||||
- 2023
|
|
||||||
|
|
||||||
- course: ricerca-operativa
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di dualità per i problemi di programmazione lineare
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: geometria-topologia-differenziale
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Poincaré-Hopf
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: analisi-armonica
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Hahn-Banach
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: analisi-complessa
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Morera
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
|
|
||||||
- course: analisi-complessa
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema degli zeri di Weierstrass
|
|
||||||
tags:
|
|
||||||
- 2023
|
|
||||||
|
|
||||||
- course: analisi-complessa
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema della mappa aperta
|
|
||||||
tags:
|
|
||||||
- 2022
|
|
||||||
|
|
||||||
- course: analisi-complessa
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema della mappa aperta
|
|
||||||
tags:
|
|
||||||
- 2021
|
|
||||||
|
|
||||||
- course: geometria-2
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema di Van Kampen
|
|
||||||
tags:
|
|
||||||
- 2024
|
|
||||||
- Frigerio
|
|
||||||
|
|
||||||
- course: geometria-2
|
|
||||||
content: |
|
|
||||||
Definizione di gruppo fondamentale
|
|
||||||
tags:
|
|
||||||
- 2023
|
|
||||||
- Frigerio
|
|
||||||
|
|
||||||
- course: geometria-2
|
|
||||||
content: |
|
|
||||||
Dimostrare il teorema Cauchy
|
|
||||||
tags:
|
|
||||||
- 2022
|
|
||||||
- Abate
|
|
||||||
@@ -32,41 +32,11 @@
|
|||||||
|
|
||||||
- fullName: Illya Serdyuk
|
- fullName: Illya Serdyuk
|
||||||
entranceDate: 2020
|
entranceDate: 2020
|
||||||
|
description: Bla bla Void Linux
|
||||||
social:
|
social:
|
||||||
github: https://github.com/Kratacoa
|
github: https://github.com/Kratacoa
|
||||||
|
|
||||||
# Vecchi Macchinisti
|
- fullName: Francesco Manicastri
|
||||||
|
entranceDate: 2022
|
||||||
# - fullName: Francesco Manicastri
|
exitDate: 2024
|
||||||
# entranceDate: 2022
|
description: Bla bla Keenan Crane
|
||||||
# exitDate: 2024
|
|
||||||
# description: Bla bla Keenan Crane
|
|
||||||
|
|
||||||
- fullName: Cristiano Cricci
|
|
||||||
entranceDate: 2010
|
|
||||||
exitDate: 2019
|
|
||||||
social:
|
|
||||||
website: https://poisson.phc.dm.unipi.it/~cricci/
|
|
||||||
|
|
||||||
- fullName: Tommaso Biannucci
|
|
||||||
entranceDate: 2019
|
|
||||||
exitDate: 2022
|
|
||||||
social:
|
|
||||||
github: https://gitlab.com/churli
|
|
||||||
website: https://churli.gitlab.io/
|
|
||||||
|
|
||||||
- fullName: Letizia D'Achille
|
|
||||||
entranceDate: 2018
|
|
||||||
exitDate: 2022
|
|
||||||
description: Appassionata di crittografia, teoria dei codici e matematica computazionale.
|
|
||||||
social:
|
|
||||||
github: https://github.com/letizia-dachille
|
|
||||||
website: https://letizia-dachille.github.io/
|
|
||||||
linkedin: https://www.linkedin.com/in/letizia-dachille/
|
|
||||||
|
|
||||||
- fullName: Emiliano Rago
|
|
||||||
entranceDate: 2000
|
|
||||||
exitDate: 2006
|
|
||||||
description: Traviato da Linux in età troppo giovane ha difficoltà ad usare il mouse ma ama gli shortcuts con una decina di tasti.
|
|
||||||
social:
|
|
||||||
linkedin: https://www.linkedin.com/in/emiliano-rago-1a8018109/
|
|
||||||
|
|||||||
Vendored
-23
@@ -15,26 +15,3 @@ declare module '@/data/macchinisti.yaml' {
|
|||||||
const value: Macchinista[]
|
const value: Macchinista[]
|
||||||
export default value
|
export default value
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module '@/data/domande-esami.yaml' {
|
|
||||||
export type Question = {
|
|
||||||
course: string
|
|
||||||
content: string
|
|
||||||
tags: string[]
|
|
||||||
}
|
|
||||||
|
|
||||||
export type Group = {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
items: Array<string>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type Database = {
|
|
||||||
names: Record<string, string>
|
|
||||||
groups: Group[]
|
|
||||||
questions: Question[]
|
|
||||||
}
|
|
||||||
|
|
||||||
const value: Database
|
|
||||||
export default value
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ const { title, description, thumbnail, pageTags } = Astro.props
|
|||||||
<script>
|
<script>
|
||||||
import renderMathInElement from 'katex/contrib/auto-render'
|
import renderMathInElement from 'katex/contrib/auto-render'
|
||||||
|
|
||||||
const renderMath = () => {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
renderMathInElement(document.body, {
|
renderMathInElement(document.body, {
|
||||||
delimiters: [
|
delimiters: [
|
||||||
{ left: '$$', right: '$$', display: true },
|
{ left: '$$', right: '$$', display: true },
|
||||||
@@ -54,12 +54,7 @@ const { title, description, thumbnail, pageTags } = Astro.props
|
|||||||
],
|
],
|
||||||
throwOnError: false,
|
throwOnError: false,
|
||||||
})
|
})
|
||||||
}
|
})
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => renderMath())
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
window.renderMath = renderMath
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
import type { GetStaticPaths } from 'astro'
|
|
||||||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
|
||||||
import Footer from '@/components/Footer.astro'
|
|
||||||
import Header from '@/components/Header.astro'
|
|
||||||
|
|
||||||
import { marked } from 'marked'
|
|
||||||
|
|
||||||
import database from '@/data/domande-esami.yaml'
|
|
||||||
import PhosphorIcon from '@/components/PhosphorIcon.astro'
|
|
||||||
import { DomandeEsamiCourse } from '@/client/DomandeEsamiCourse'
|
|
||||||
|
|
||||||
export const getStaticPaths = (() => {
|
|
||||||
return Object.keys(database.names).map(course => ({
|
|
||||||
params: { course },
|
|
||||||
}))
|
|
||||||
}) satisfies GetStaticPaths
|
|
||||||
|
|
||||||
const { course } = Astro.params
|
|
||||||
---
|
|
||||||
|
|
||||||
<BaseLayout title="Domande Esami | PHC" pageTags={'domande-esami'}>
|
|
||||||
<Header />
|
|
||||||
<main>
|
|
||||||
<DomandeEsamiCourse client:load course={course} />
|
|
||||||
</main>
|
|
||||||
<Footer />
|
|
||||||
</BaseLayout>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import type { APIRoute } from 'astro'
|
|
||||||
|
|
||||||
import database from '@/data/domande-esami.yaml'
|
|
||||||
|
|
||||||
export const GET: APIRoute = ({}) => {
|
|
||||||
return new Response(JSON.stringify(database), {
|
|
||||||
headers: {
|
|
||||||
'content-type': 'application/json',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
import type { APIRoute, GetStaticPaths } from 'astro'
|
|
||||||
|
|
||||||
import database from '@/data/domande-esami.yaml'
|
|
||||||
|
|
||||||
export const getStaticPaths = (() => {
|
|
||||||
return Object.keys(database.names).map(course => ({
|
|
||||||
params: { course },
|
|
||||||
}))
|
|
||||||
}) satisfies GetStaticPaths
|
|
||||||
|
|
||||||
export const GET: APIRoute = ({ params: { course } }) => {
|
|
||||||
return new Response(
|
|
||||||
JSON.stringify({
|
|
||||||
groups: [],
|
|
||||||
names: Object.fromEntries(Object.entries(database.names).filter(([key]) => key === course)),
|
|
||||||
questions: database.questions.filter(question => question.course === course),
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
'content-type': 'application/json',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
---
|
|
||||||
import { PhosphorIcon } from '@/client/Icon'
|
|
||||||
import Footer from '@/components/Footer.astro'
|
|
||||||
import Header from '@/components/Header.astro'
|
|
||||||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
|
||||||
|
|
||||||
import database from '@/data/domande-esami.yaml'
|
|
||||||
|
|
||||||
const courseQuestionCounts = Object.fromEntries(
|
|
||||||
database.questions.reduce((acc, question) => {
|
|
||||||
acc.set(question.course, (acc.get(question.course) || 0) + 1)
|
|
||||||
return acc
|
|
||||||
}, new Map())
|
|
||||||
)
|
|
||||||
---
|
|
||||||
|
|
||||||
<BaseLayout title="Domande Esami | PHC" pageTags={'domande-esami'}>
|
|
||||||
<Header />
|
|
||||||
<main>
|
|
||||||
<h1>Domande Esami</h1>
|
|
||||||
{
|
|
||||||
database.groups.map(group => (
|
|
||||||
<details open>
|
|
||||||
<summary>
|
|
||||||
<h2 id={group.id}>
|
|
||||||
<div class="details-closed">
|
|
||||||
<PhosphorIcon name="caret-down" />
|
|
||||||
</div>
|
|
||||||
<div class="details-openned">
|
|
||||||
<PhosphorIcon name="caret-up" />
|
|
||||||
</div>
|
|
||||||
{group.name}
|
|
||||||
</h2>
|
|
||||||
</summary>
|
|
||||||
<div class="wide-card-list">
|
|
||||||
{group.items.map(course => (
|
|
||||||
<a href={`/domande-esami/${course}`}>
|
|
||||||
<div class="card">
|
|
||||||
<h2>{database.names[course]}</h2>
|
|
||||||
<div class="text">
|
|
||||||
<p>{courseQuestionCounts[course] || 0} domande</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</details>
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
<h3>Come Contribuire</h3>
|
|
||||||
<div class="card large">
|
|
||||||
<div class="text">
|
|
||||||
<p>Se hai raccolte di domande da condividere, puoi...</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
<Footer />
|
|
||||||
</BaseLayout>
|
|
||||||
@@ -10,7 +10,7 @@ const news = await getCollection('news')
|
|||||||
<h1><a href="/notizie">Notizie</a></h1>
|
<h1><a href="/notizie">Notizie</a></h1>
|
||||||
<div class="card-list">
|
<div class="card-list">
|
||||||
{
|
{
|
||||||
news.toReversed().map(newsItem => (
|
news.map(newsItem => (
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<a href={`/notizie/${newsItem.slug}`} class="title">
|
<a href={`/notizie/${newsItem.slug}`} class="title">
|
||||||
{newsItem.data.title}
|
{newsItem.data.title}
|
||||||
|
|||||||
+24
-125
@@ -14,7 +14,7 @@
|
|||||||
width: 22px;
|
width: 22px;
|
||||||
height: 22px;
|
height: 22px;
|
||||||
|
|
||||||
display: grid inline;
|
display: grid;
|
||||||
place-content: center;
|
place-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +79,29 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.flex-column {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-row {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// just to know for reference
|
||||||
|
.fake-masonry {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(var(--columns), 1fr);
|
||||||
|
grid-auto-flow: dense;
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
grid-row: span var(--masonry-height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.search-results {
|
.search-results {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
@@ -569,13 +592,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.metadata {
|
|
||||||
display: grid;
|
|
||||||
grid-auto-flow: column;
|
|
||||||
justify-content: start;
|
|
||||||
gap: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: $screen-desktop-min) {
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
padding: 0.9rem;
|
padding: 0.9rem;
|
||||||
|
|
||||||
@@ -593,37 +609,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.chip {
|
|
||||||
user-select: none;
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
place-content: center;
|
|
||||||
place-items: center;
|
|
||||||
|
|
||||||
background: #0003;
|
|
||||||
|
|
||||||
padding: 0 0.25rem;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
line-height: 1.5;
|
|
||||||
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 500;
|
|
||||||
|
|
||||||
&.small {
|
|
||||||
font-size: 13px;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled {
|
|
||||||
color: #0005;
|
|
||||||
background: #0002;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a:has(> .card) {
|
|
||||||
display: contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Card List
|
// Card List
|
||||||
//
|
//
|
||||||
@@ -890,90 +875,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.wide-card-list {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(auto, 30rem));
|
|
||||||
gap: 2rem;
|
|
||||||
padding: 2rem;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
.text > * {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: $screen-desktop-min) {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
|
|
||||||
padding: 0;
|
|
||||||
gap: 1rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.filter {
|
|
||||||
min-width: 15rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flex-column {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flex-row {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
gap: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flex-row-wrap {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
gap: 0.5rem;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-h {
|
|
||||||
display: grid;
|
|
||||||
grid-auto-flow: column;
|
|
||||||
justify-content: start;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
gap: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-v {
|
|
||||||
display: grid;
|
|
||||||
justify-items: start;
|
|
||||||
align-content: start;
|
|
||||||
|
|
||||||
grid-auto-flow: row;
|
|
||||||
gap: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-center {
|
|
||||||
display: grid;
|
|
||||||
place-content: center;
|
|
||||||
place-items: center;
|
|
||||||
gap: 0.5rem;
|
|
||||||
grid-auto-flow: row;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clickable {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
// just to know for reference
|
|
||||||
.fake-masonry {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(var(--columns), 1fr);
|
|
||||||
grid-auto-flow: dense;
|
|
||||||
|
|
||||||
& > * {
|
|
||||||
grid-row: span var(--masonry-height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,47 +129,4 @@
|
|||||||
justify-self: center;
|
justify-self: center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
details {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
summary {
|
|
||||||
display: grid;
|
|
||||||
place-content: center;
|
|
||||||
place-items: center;
|
|
||||||
|
|
||||||
list-style: none;
|
|
||||||
&::-webkit-details-marker {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-openned,
|
|
||||||
.details-closed {
|
|
||||||
display: contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not([open]) {
|
|
||||||
.details-openned {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&[open] {
|
|
||||||
summary {
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-closed {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: $screen-desktop-min) {
|
|
||||||
summary {
|
|
||||||
place-content: stretch;
|
|
||||||
place-items: stretch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -208,10 +208,6 @@ body {
|
|||||||
@media screen and (max-width: $screen-desktop-min) {
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
padding: 3rem 1rem;
|
padding: 3rem 1rem;
|
||||||
gap: 3rem;
|
gap: 3rem;
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-29
@@ -437,35 +437,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.domande-esami {
|
|
||||||
background: hsl(45, 100%, 95%);
|
|
||||||
--card-base: hsl(45, 100%, 80%);
|
|
||||||
|
|
||||||
main {
|
|
||||||
justify-self: center;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
padding: 4rem 0;
|
|
||||||
|
|
||||||
gap: 2rem;
|
|
||||||
|
|
||||||
.search {
|
|
||||||
max-width: 80ch;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
background: hsl(45, 100%, 72%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card a {
|
|
||||||
color: color-mix(in srgb, var(--card-base-internal), #000 80%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// .login {
|
// .login {
|
||||||
// background: #ddfaff;
|
// background: #ddfaff;
|
||||||
|
|
||||||
@@ -568,6 +539,12 @@
|
|||||||
padding: 5rem;
|
padding: 5rem;
|
||||||
gap: 5rem;
|
gap: 5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.card-list {
|
||||||
|
> .card {
|
||||||
|
grid-template-rows: auto 1fr auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.guida {
|
.guida {
|
||||||
|
|||||||
@@ -33,18 +33,6 @@
|
|||||||
@layer typography {
|
@layer typography {
|
||||||
@include geometric-headings;
|
@include geometric-headings;
|
||||||
|
|
||||||
strong {
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
em {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text {
|
.text {
|
||||||
// text-align: justify;
|
// text-align: justify;
|
||||||
// hyphens: auto;
|
// hyphens: auto;
|
||||||
@@ -141,9 +129,6 @@
|
|||||||
display: block;
|
display: block;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
|
|
||||||
width: 50ch;
|
|
||||||
max-width: 100%;
|
|
||||||
|
|
||||||
@include neo-brutalist-card(2px);
|
@include neo-brutalist-card(2px);
|
||||||
|
|
||||||
&.fill {
|
&.fill {
|
||||||
@@ -216,10 +201,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
li + li {
|
|
||||||
margin-top: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,
|
a,
|
||||||
a:visited {
|
a:visited {
|
||||||
color: var(--zone-color, #1e6733);
|
color: var(--zone-color, #1e6733);
|
||||||
|
|||||||
Reference in New Issue
Block a user