Compare commits
10 Commits
c6cf861435
...
37f7a0997f
| Author | SHA1 | Date | |
|---|---|---|---|
| 37f7a0997f | |||
| 33ea19257f | |||
| a68eb28877 | |||
| de99b2c58b | |||
| e21fd4823d | |||
| d58fe3c57b | |||
| 2c362a8140 | |||
| b55575e7a8 | |||
| 993ce26f4f | |||
| 806220ccfa |
+29
-5
@@ -41,9 +41,10 @@ _SESSION_DOMAIN = os.environ.get("SESSION_DOMAIN") or None
|
|||||||
_SESSION_TTL = 30 * 24 * 3600 # 30 days (matches bincio_activity)
|
_SESSION_TTL = 30 * 24 * 3600 # 30 days (matches bincio_activity)
|
||||||
_SESSION_COOKIE = "bincio_session"
|
_SESSION_COOKIE = "bincio_session"
|
||||||
|
|
||||||
_SAFE_SLUG = re.compile(r"^[a-zA-Z0-9_][a-zA-Z0-9_\-/]*$")
|
_SAFE_SLUG = re.compile(r"^[a-zA-Z0-9_][a-zA-Z0-9_\-/]*$")
|
||||||
_SAFE_HANDLE = re.compile(r"^[a-z][a-z0-9_-]{1,19}$")
|
_SAFE_HANDLE = re.compile(r"^[a-z][a-z0-9_-]{1,19}$")
|
||||||
_SAFE_HASH = re.compile(r"^[0-9a-f]{4,40}$")
|
_SAFE_HASH = re.compile(r"^[0-9a-f]{4,40}$")
|
||||||
|
_SAFE_REL_PATH = re.compile(r"^(pages|blog)/[a-zA-Z0-9_][a-zA-Z0-9_\-/]*\.md$")
|
||||||
_ALLOWED_IMAGE_TYPES = {"image/jpeg", "image/png", "image/webp", "image/gif"}
|
_ALLOWED_IMAGE_TYPES = {"image/jpeg", "image/png", "image/webp", "image/gif"}
|
||||||
_MAX_IMAGE_BYTES = 10 * 1024 * 1024 # 10 MB
|
_MAX_IMAGE_BYTES = 10 * 1024 * 1024 # 10 MB
|
||||||
|
|
||||||
@@ -288,12 +289,15 @@ async def get_wiki_log(user: User = Depends(require_auth)) -> JSONResponse:
|
|||||||
|
|
||||||
|
|
||||||
@app.get("/api/diff/{commit_hash}")
|
@app.get("/api/diff/{commit_hash}")
|
||||||
async def get_diff(commit_hash: str, user: User = Depends(require_auth)) -> JSONResponse:
|
async def get_diff(commit_hash: str, file: Optional[str] = None, user: User = Depends(require_auth)) -> JSONResponse:
|
||||||
if not _SAFE_HASH.match(commit_hash):
|
if not _SAFE_HASH.match(commit_hash):
|
||||||
raise HTTPException(status_code=400, detail="invalid hash")
|
raise HTTPException(status_code=400, detail="invalid hash")
|
||||||
|
if file is not None and not _SAFE_REL_PATH.match(file):
|
||||||
|
raise HTTPException(status_code=400, detail="invalid file path")
|
||||||
|
paths = [file] if file else ["pages/", "blog/"]
|
||||||
env = _git_env()
|
env = _git_env()
|
||||||
proc = await asyncio.create_subprocess_exec(
|
proc = await asyncio.create_subprocess_exec(
|
||||||
"git", "show", commit_hash, "-p", "--no-color", "--format=", "--", "pages/", "blog/",
|
"git", "show", commit_hash, "-p", "--no-color", "--format=", "--", *paths,
|
||||||
cwd=str(_ROOT), env=env,
|
cwd=str(_ROOT), env=env,
|
||||||
stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE,
|
stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE,
|
||||||
)
|
)
|
||||||
@@ -303,6 +307,26 @@ async def get_diff(commit_hash: str, user: User = Depends(require_auth)) -> JSON
|
|||||||
return JSONResponse({"diff": stdout.decode(errors="replace")})
|
return JSONResponse({"diff": stdout.decode(errors="replace")})
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/api/history/{slug:path}")
|
||||||
|
async def get_history(slug: str, user: User = Depends(require_auth)) -> JSONResponse:
|
||||||
|
if not _SAFE_SLUG.match(slug):
|
||||||
|
raise HTTPException(status_code=400, detail="invalid slug")
|
||||||
|
env = _git_env()
|
||||||
|
proc = await asyncio.create_subprocess_exec(
|
||||||
|
"git", "log", "--format=%h|%ar|%aN|%s", "--author=@bincio.wiki", "-n", "50",
|
||||||
|
"--", f"pages/{slug}.md", f"blog/{slug}.md",
|
||||||
|
cwd=str(_ROOT), env=env,
|
||||||
|
stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.DEVNULL,
|
||||||
|
)
|
||||||
|
stdout, _ = await proc.communicate()
|
||||||
|
entries = []
|
||||||
|
for line in stdout.decode().strip().splitlines():
|
||||||
|
parts = line.split("|", 3)
|
||||||
|
if len(parts) == 4:
|
||||||
|
entries.append({"hash": parts[0], "date": parts[1], "author": parts[2], "message": parts[3]})
|
||||||
|
return JSONResponse({"log": entries})
|
||||||
|
|
||||||
|
|
||||||
@app.get("/api/me")
|
@app.get("/api/me")
|
||||||
async def me(user: User = Depends(require_auth)) -> JSONResponse:
|
async def me(user: User = Depends(require_auth)) -> JSONResponse:
|
||||||
return JSONResponse({
|
return JSONResponse({
|
||||||
|
|||||||
@@ -21,10 +21,9 @@ indipendentemente dall'essere in pianura, in salita, a manetta o a passeggio.
|
|||||||
Se la situazione lo richiede (e.g. c'è tanto caldo) si beve un po' di più, ma
|
Se la situazione lo richiede (e.g. c'è tanto caldo) si beve un po' di più, ma
|
||||||
non si beve mai di meno di quanto si è stabilito.
|
non si beve mai di meno di quanto si è stabilito.
|
||||||
|
|
||||||
### <a id="il_muro" style="scroll-margin-top: 60px;"></a>
|
|
||||||
Il glicogeno muscolare (il carburante per il ciclismo ad alta intensità) si
|
Il glicogeno muscolare (il carburante per il ciclismo ad alta intensità) si
|
||||||
esaurisce in 90-120 minuti di sforzo sostenuto. Dopo quella soglia, se non si
|
esaurisce in 90-120 minuti di sforzo sostenuto. Dopo quella soglia, se non si
|
||||||
ha reintegrato, arriva il "il muro" — crollo energetico
|
ha reintegrato, arriva il <a id="il_muro">muro</a> — crollo energetico
|
||||||
improvviso, difficile da recuperare mentre si è in sella.
|
improvviso, difficile da recuperare mentre si è in sella.
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -54,28 +53,73 @@ giri di un'ora e mezza - due si è sempre sicuri di non arrivare al muro.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Per uscite più lunghe (3+ ore)
|
## Per uscite più lunghe (2+ ore)
|
||||||
|
|
||||||
Si inizia a parlare di strategia:
|
Il carburante utilizzato dai muscoli durante il giro in bici è il glicogeno
|
||||||
|
muscolare; questo si ottiene sostanzialmente dai carboidrati, in particolare
|
||||||
|
dagli zuccheri (si può ottenere anche dai grassi ma sono dettagli che non
|
||||||
|
interessano qui).
|
||||||
|
Di conseguenza, per evitare di finire contro il [muro](#il_muro) bisogna
|
||||||
|
adottare una strategia di reintegro degli zuccheri durante il giro.
|
||||||
|
|
||||||
**La borraccia di zucchero** — acqua, zucchero comune (40-60g per 500ml),
|
Se si ha fame finito il giro, vuol dire che non si è reintegrato abbastanza.
|
||||||
sale, succo di limone. Economica, pratica, efficace. È la soluzione che
|
Questo va bene se è una cosa voluta (e.g. faccio un bel giro, arrivo al
|
||||||
molti nel gruppo usano per le rando e le uscite lunghe. Non è isotonica ma si
|
ristorante e mi sfondo di cibo), mentre è un campanello di allarme se invece
|
||||||
può abbinare a una seconda borraccia d'acqua.
|
si pensava di aver reintegrato correttamente.
|
||||||
|
|
||||||
|
### Principali metodi per assumere zuccheri durante il giro
|
||||||
|
|
||||||
|
**La borraccia di zucchero** — acqua, zucchero comune (40-60g per 500ml), un
|
||||||
|
pizzico di sale. Economica, pratica, efficace. Non è isotonica ma si può abbinare a una
|
||||||
|
seconda borraccia d'acqua. Ad alcune persone può causare problemi di stomaco,
|
||||||
|
soprattutto le prime volte: bisogna abituare lo stomaco, per cui si consiglia
|
||||||
|
di provare le prime volte in uscite brevi, o quando si è sicuri di avere un
|
||||||
|
bagno a portata di mano
|
||||||
|
|
||||||
**Gel** — rapidi, pratici durante la pedalata, ma costosi e non sempre
|
**Gel** — rapidi, pratici durante la pedalata, ma costosi e non sempre
|
||||||
piacevoli da ingerire. Utili per i momenti di sforzo intenso. I marchi più
|
piacevoli da ingerire. Utili per i momenti di sforzo intenso. I marchi più
|
||||||
citati: SiS, Maurten, GU Energy. I Maurten sono considerati i migliori per la
|
citati: SiS, Maurten, GU Energy. I Maurten sono considerati i migliori per la
|
||||||
tolleranza gastrica ma hanno un costo folle — meglio tenerli per le gare
|
tolleranza gastrica ma hanno un costo folle — meglio tenerli per le gare
|
||||||
importanti.
|
importanti. In termini di prestazioni forniscono un vantaggio minimo rispetto
|
||||||
|
alla borraccia con sale e zucchero, per cui sono da utilizzaare quando si
|
||||||
|
ricerca la massima efficienza
|
||||||
|
|
||||||
**Barrette** — più sazianti dei gel, vanno bene nelle fasi di intensità
|
**Barrette** — più sazianti dei gel, vanno bene nelle fasi di intensità
|
||||||
moderata. Homemade (con fiocchi d'avena, miele, frutta secca) sono molto
|
moderata. Homemade (con fiocchi d'avena, miele, frutta secca) sono molto
|
||||||
apprezzate e molto più economiche di quelle in commercio.
|
apprezzate e molto più economiche di quelle in commercio. Quando le si acquista
|
||||||
|
in commercio, controllare sempre l'apporto calorico, e stare sopra le 150kcal
|
||||||
|
per barretta
|
||||||
|
|
||||||
**Elettroliti** — importanti nelle uscite lunghe o in estate. Si perdono sali
|
### Esempio di nutrizione per un giro di 4 ore
|
||||||
con il sudore (sodio soprattutto). Le pastiglie effervescenti da borraccia
|
4 ore di sforzo medio-alto = 2.000-2.500kcal bruciate
|
||||||
funzionano bene.
|
|
||||||
|
Reinegrare con:
|
||||||
|
- 4 borracce da 60g di zucchero (una ogni ora per tutta la durata del giro) = 930kcal
|
||||||
|
- 1 barretta dopo un'ora e mezza/due = 150kcal
|
||||||
|
- pausa al bar dopo due ore e mezza/tre
|
||||||
|
- 2 coca cola da 33cl = 270kcal
|
||||||
|
- 1 pacchetto di patatine piccolo (mangiamo anche qualcosa di salato, se no che palle) = 200kcal
|
||||||
|
- 1 fetta di torta = 250kcal
|
||||||
|
|
||||||
|
|
||||||
|
Totale reintegrato = 1.800kcal
|
||||||
|
|
||||||
|
### Sali
|
||||||
|
Finchè si parla di uscite "normali" (non ultra, non rando, ecc), l'unico sale
|
||||||
|
che bisogna reintegrare durante un giro è il sodio. La fonte più comune di
|
||||||
|
sodio che abbiamo a disposizione è il sale da cucina. Per questo, si consiglia
|
||||||
|
di mettere un pizzico di sale da cucina nella borraccia con lo zucchero (un
|
||||||
|
pizzico non è una quantità molto precisa ma rende bene l'idea. Si consiglia poi
|
||||||
|
di andare a tentativi per trovare la quantità giusta che non renda la bevanda
|
||||||
|
disgustosa nè la faccia legare in bocca, ma che al contempo permetta di
|
||||||
|
reintegrare correttamente). Sale e acqua prevengono i crampi: se durante il
|
||||||
|
giro si hanno i crampi significa che si è bevuto poco o si è reintegrato poco
|
||||||
|
sale (o entrambe), rispetto allo sforzo che si è fatto.
|
||||||
|
D'estate la sudorazione è maggiore e con quella è maggiore la perdita di sali,
|
||||||
|
quindi bisogna aumentare la quantità da mettere nella borraccia.
|
||||||
|
|
||||||
|
**Elettroliti** — possono essere utilizzati nelle uscite lunghe o in estate.
|
||||||
|
Le pastiglie effervescenti da borraccia funzionano bene.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -50,18 +50,6 @@ batteria e cambio, per queste evenienze
|
|||||||
del cambio dal lato del muro non sia appoggiata al muro, altrimenti può
|
del cambio dal lato del muro non sia appoggiata al muro, altrimenti può
|
||||||
risultare perennemente attiva, scaricando la batteria
|
risultare perennemente attiva, scaricando la batteria
|
||||||
|
|
||||||
|
|
||||||
## Test
|
|
||||||
|
|
||||||
1. Uno
|
|
||||||
2. Due
|
|
||||||
3. Tre
|
|
||||||
|
|
||||||
- pallino 1
|
|
||||||
- pallino 2
|
|
||||||
- pallino 3
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Le gamme Shimano
|
## Le gamme Shimano
|
||||||
|
|||||||
+1
-1
Submodule site updated: 5e024b0f29...e6b9ba56b1
Reference in New Issue
Block a user