mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 11:32:39 +02:00
New theme, and small changes on the content
This commit is contained in:
parent
701d3027b6
commit
c73db5e285
23 changed files with 995 additions and 695 deletions
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
title: Micropolitiques des groupes
|
title: Micropolitiques des groupes
|
||||||
author: David Vercauteren
|
author: David Vercauteren
|
||||||
headline: Une livre qui vise à créer une culture des précédents dans les collectifs (militants). Plusieurs chapitres et un découpage par sujets. A relire au fur et à mesure des expériences.
|
headline: Un livre qui vise à créer une culture des précédents dans les collectifs (militants). Plusieurs chapitres et un découpage par sujets. A relire au fur et à mesure des expériences.
|
||||||
isbn: 9782354801786
|
isbn: 9782354801786
|
||||||
---
|
---
|
||||||
## Artifices
|
## Artifices
|
||||||
|
@ -75,4 +75,4 @@ Idée : prendre du recul sur nos mots d'ordre, pour voir ce qui nous traverse.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[micropolitiques des groupes - pour une écologie des pratiques collectives](https://micropolitiques.collectifs.net)
|
[micropolitiques des groupes - pour une écologie des pratiques collectives](https://micropolitiques.collectifs.net)
|
||||||
|
|
|
@ -5,6 +5,7 @@ headline: Rhétorique de la souffrance, responsabilité collective et devoir de
|
||||||
tags: conflit, agression, facilitation
|
tags: conflit, agression, facilitation
|
||||||
isbn: 9782490077489
|
isbn: 9782490077489
|
||||||
---
|
---
|
||||||
|
|
||||||
J'ai commencé ce livre en fin d'été, et je l'ai lu par petits morceaux. Pas que ce soit difficile à lire, mais plutôt parce que j'avais envie/besoin de lire et de relire certains passages qui faisaient écho à des situations que j'ai pu traverser, que ce soit dans le cadre pro ou ailleurs.
|
J'ai commencé ce livre en fin d'été, et je l'ai lu par petits morceaux. Pas que ce soit difficile à lire, mais plutôt parce que j'avais envie/besoin de lire et de relire certains passages qui faisaient écho à des situations que j'ai pu traverser, que ce soit dans le cadre pro ou ailleurs.
|
||||||
|
|
||||||
Si je devais ne retenir qu'une chose de ce livre, ce serait le travail autour de « l'escalade du conflit ». Le propos principal de Sarah Schulmann me semble être qu'il est important de detecter et d'éviter les mécaniques d'escalade (du conflit vers l'agression), cette escalade pouvant être une distraction pour éviter de discuter réellement des problèmes.
|
Si je devais ne retenir qu'une chose de ce livre, ce serait le travail autour de « l'escalade du conflit ». Le propos principal de Sarah Schulmann me semble être qu'il est important de detecter et d'éviter les mécaniques d'escalade (du conflit vers l'agression), cette escalade pouvant être une distraction pour éviter de discuter réellement des problèmes.
|
||||||
|
@ -20,13 +21,13 @@ Quelques morceaux choisis:
|
||||||
>
|
>
|
||||||
> — page 25.
|
> — page 25.
|
||||||
|
|
||||||
---
|
___
|
||||||
|
|
||||||
> Et si l'autre personne mettait le doigt sur quelque chose que je n'étais pas en mesure d'exprimer toute seule ? **Est-ce que ça me mettrait en colère ou est-ce que je refuserais de voir la réalité ? Plutôt que de me livrer à l'introspection, est-ce que je trouverais une manière de l'accuser ?** Et si elle m'aidait, au contraire, à reconnaître cette réalité ou à en prendre conscience ?
|
> Et si l'autre personne mettait le doigt sur quelque chose que je n'étais pas en mesure d'exprimer toute seule ? **Est-ce que ça me mettrait en colère ou est-ce que je refuserais de voir la réalité ? Plutôt que de me livrer à l'introspection, est-ce que je trouverais une manière de l'accuser ?** Et si elle m'aidait, au contraire, à reconnaître cette réalité ou à en prendre conscience ?
|
||||||
|
|
||||||
Je trouve intéressante la manière dont les choses sont posées. L'idée étant de permettre à tout·e un·e chacun·e de mieux se connaitre, et de prendre conscience de nos fonctionnements construits pour pouvoir les dépasser.
|
Je trouve intéressante la manière dont les choses sont posées. L'idée étant de permettre à tout·e un·e chacun·e de mieux se connaitre, et de prendre conscience de nos fonctionnements construits pour pouvoir les dépasser.
|
||||||
|
|
||||||
---
|
___
|
||||||
|
|
||||||
> **le refus de communiquer à toujours été la cause principale des accusations mensongères car il permet de nourrir toutes sortes de fantasmes négatifs à propos de l'autre**, surtout dans les domaines symboliquement chargés tels que la sexualité, l'amour, la communauté, la famille, les ressources matérielles, les identités de groupe, le genre, le pouvoir, le capital social et la violence.
|
> **le refus de communiquer à toujours été la cause principale des accusations mensongères car il permet de nourrir toutes sortes de fantasmes négatifs à propos de l'autre**, surtout dans les domaines symboliquement chargés tels que la sexualité, l'amour, la communauté, la famille, les ressources matérielles, les identités de groupe, le genre, le pouvoir, le capital social et la violence.
|
||||||
> Refuser catégoriquement d'adresser la parole à quelqu'un est un acte de destruction aussi étrange qu'immature; personne n'en sort gagnant.
|
> Refuser catégoriquement d'adresser la parole à quelqu'un est un acte de destruction aussi étrange qu'immature; personne n'en sort gagnant.
|
||||||
|
@ -37,7 +38,7 @@ Je trouve intéressante la manière dont les choses sont posées. L'idée étant
|
||||||
|
|
||||||
D'où l'importance de réussir à faire la différence entre un ressenti et un fantasme. J'apprécie ce que « projeter des fantasmes négatifs » apporte comme compréhension. Dans ces cas là, peut-être qu'on parle a nos peurs plutôt qu'a notre interlocuteur·ice. 😮💨
|
D'où l'importance de réussir à faire la différence entre un ressenti et un fantasme. J'apprécie ce que « projeter des fantasmes négatifs » apporte comme compréhension. Dans ces cas là, peut-être qu'on parle a nos peurs plutôt qu'a notre interlocuteur·ice. 😮💨
|
||||||
|
|
||||||
---
|
___
|
||||||
|
|
||||||
> Aujourd'hui, le caractère réducteur des slogans publicitaires est également appliqué à des domaines très sérieux tels que les droits humains ou la sécurité. Ces messages ne sont plus seulement destinés à vendre du liquide vaisselle, mais par exemple à aider les femmes à se protéger contre la violence masculine. Cependant, leur manque de subtilité peut également contribuer à renforcer le déni sur ces questions. **Le désaccord est un terrain complexe dont nous devons pourtant embrasser les nuances si nous voulons agir de manière constructive, avec honnêteté et sincérité.**
|
> Aujourd'hui, le caractère réducteur des slogans publicitaires est également appliqué à des domaines très sérieux tels que les droits humains ou la sécurité. Ces messages ne sont plus seulement destinés à vendre du liquide vaisselle, mais par exemple à aider les femmes à se protéger contre la violence masculine. Cependant, leur manque de subtilité peut également contribuer à renforcer le déni sur ces questions. **Le désaccord est un terrain complexe dont nous devons pourtant embrasser les nuances si nous voulons agir de manière constructive, avec honnêteté et sincérité.**
|
||||||
|
|
||||||
|
@ -72,7 +73,7 @@ Je me demande comment réussir à dépasser ça. L'obéissance n'étant bien sur
|
||||||
|
|
||||||
Je ne connaissais pas cette distinction entre d'un côté la honte et de l'autre la culpabilité, et de ce que ça montre des différents *styles* qui peuvent être adoptés lorsque le stress s'en mêle. Je me demande quand même si l'explication n'est pas un peu simpliste (même si elle m'arrange bien 🫢).
|
Je ne connaissais pas cette distinction entre d'un côté la honte et de l'autre la culpabilité, et de ce que ça montre des différents *styles* qui peuvent être adoptés lorsque le stress s'en mêle. Je me demande quand même si l'explication n'est pas un peu simpliste (même si elle m'arrange bien 🫢).
|
||||||
|
|
||||||
---
|
___
|
||||||
## Elements déclancheurs
|
## Elements déclancheurs
|
||||||
|
|
||||||
> les situations vécues comme des éléments déclencheur sont des formes de réaction qui s'avère déterminantes dans l'amalgame entre un conflit et une agression. De manière générale dans la vie, nous sommes amenés à réagir en permanence. Nous ne nous rendons pas compte de la plupart de nos réactions car elles sont proportionnelles aux stimuli qui les ont provoqués. **Une réaction disproportionnée se démarque parce qu'elle est démesurée au regard de ce qui est réellement en train de se passer**.
|
> les situations vécues comme des éléments déclencheur sont des formes de réaction qui s'avère déterminantes dans l'amalgame entre un conflit et une agression. De manière générale dans la vie, nous sommes amenés à réagir en permanence. Nous ne nous rendons pas compte de la plupart de nos réactions car elles sont proportionnelles aux stimuli qui les ont provoqués. **Une réaction disproportionnée se démarque parce qu'elle est démesurée au regard de ce qui est réellement en train de se passer**.
|
||||||
|
@ -91,7 +92,7 @@ Je ne connaissais pas cette distinction entre d'un côté la honte et de l'autre
|
||||||
|
|
||||||
Ah, la la.
|
Ah, la la.
|
||||||
|
|
||||||
---
|
___
|
||||||
|
|
||||||
Il y a toute un chapitre ou l'autrice parle de différentes approches (psychologie, psychiatrie moderne et pop psychologie) qui convergent vers les mêmes conclusions concernant la définition d'une réaction et ses conséquences. (j'ai formaté le texte pour le rendre plus lisible)
|
Il y a toute un chapitre ou l'autrice parle de différentes approches (psychologie, psychiatrie moderne et pop psychologie) qui convergent vers les mêmes conclusions concernant la définition d'une réaction et ses conséquences. (j'ai formaté le texte pour le rendre plus lisible)
|
||||||
|
|
||||||
|
@ -112,12 +113,12 @@ Il y a toute un chapitre ou l'autrice parle de différentes approches (psycholog
|
||||||
>
|
>
|
||||||
> — page 189
|
> — page 189
|
||||||
|
|
||||||
---
|
___
|
||||||
|
|
||||||
En guise de conclusion :
|
En guise de conclusion :
|
||||||
|
|
||||||
> D'une certaine manière, on pourrait résumer la chose par « se sentir mieux » versus « aller mieux ». Refouler des informations (sur nous-mêmes, sur nos amis), créer des bouc-émissaires de sorte à nous détourner de nos problèmes, exclure afin d'unifier un collectif et de créer une identité de groupe : **tous ces mécanismes aident les gens à se sentir mieux, parce qu'ils leur permet de se sentir supérieurs**. Or la seule manière d'aller véritablement mieux et de nous confronter aux autres, de les regarder en face, de communiquer.
|
> D'une certaine manière, on pourrait résumer la chose par « se sentir mieux » versus « aller mieux ». Refouler des informations (sur nous-mêmes, sur nos amis), créer des bouc-émissaires de sorte à nous détourner de nos problèmes, exclure afin d'unifier un collectif et de créer une identité de groupe : **tous ces mécanismes aident les gens à se sentir mieux, parce qu'ils leur permet de se sentir supérieurs**. Or la seule manière d'aller véritablement mieux et de nous confronter aux autres, de les regarder en face, de communiquer.
|
||||||
|
|
||||||
---
|
___
|
||||||
|
|
||||||
> Si nous appartenons à des groupes qui ne sont pas capables d'autocritique, et qui sanctionnent en conséquence la différence, nous nous joindrons à l'effort collectif qui revient à fuir, exclure et mépriser. **Mais si nous nous trouvons dans des groupes qui promeuvent l'acceptation, qui font en sorte de créer des conditions de communication, et qui reconnaissent que les gens sont porteurs de contradiction, nous serons capables de composer avec la nature réelle du conflit** : son caractère collectif, d'une part, et, d'autre part, le fait qu'il ne peut pas se régler en faisant usage de cruauté, en faisant courir des rumeurs, en promulguant des lois, où on emprisonna des gens, en envahissant et en occupant leur territoire.
|
> Si nous appartenons à des groupes qui ne sont pas capables d'autocritique, et qui sanctionnent en conséquence la différence, nous nous joindrons à l'effort collectif qui revient à fuir, exclure et mépriser. **Mais si nous nous trouvons dans des groupes qui promeuvent l'acceptation, qui font en sorte de créer des conditions de communication, et qui reconnaissent que les gens sont porteurs de contradiction, nous serons capables de composer avec la nature réelle du conflit** : son caractère collectif, d'une part, et, d'autre part, le fait qu'il ne peut pas se régler en faisant usage de cruauté, en faisant courir des rumeurs, en promulguant des lois, où on emprisonna des gens, en envahissant et en occupant leur territoire.
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
---
|
|
||||||
title: The 37C3
|
|
||||||
status: draft
|
|
||||||
---
|
|
||||||
|
|
||||||
For the past few days I've been at the 37C3, in Hambourg. It's the first time
|
|
||||||
I'm attending a tech conference in the last 7 years, and I've never been to any
|
|
||||||
CCC event before.
|
|
||||||
|
|
||||||
There were definitely a lot going on a the same time: talks, assemblies,
|
|
||||||
workshops, concerts and just meeting and discussing with friends and community
|
|
||||||
members.
|
|
||||||
|
|
||||||
It's all taking place in the CCH, the congress center of hambourg, which is… huge, to say the least.
|
|
||||||
|
|
||||||
## Feelings
|
|
||||||
|
|
||||||
I've seen a bunch of people tellming me this was a great conference, and this sets up expectations somehow for me. I didn't know exactly what to expect, but I definitely had some.
|
|
||||||
|
|
||||||
I believe that's because of where the conference is at: the crossroads of different subjects that matters to me: open-source, privacy and ethics.
|
|
||||||
|
|
||||||
## The talks
|
|
||||||
|
|
||||||
There were a lot of different talks on different subjects. Some of them were in big large lecture halls, and some others
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
title: Parsing JSON into Specific Pydantic Models
|
title: Discriminate pydantic objects by field
|
||||||
tags: pydantic, python, match
|
tags: pydantic, python, match
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -7,8 +7,7 @@ tags: pydantic, python, match
|
||||||
I really like [Pydantic](https://docs.pydantic.dev/latest/) because it makes it
|
I really like [Pydantic](https://docs.pydantic.dev/latest/) because it makes it
|
||||||
easy to define the the structure of the objects I want to use, using typing.
|
easy to define the the structure of the objects I want to use, using typing.
|
||||||
|
|
||||||
One use case I have at the moment is to parse a json object and build different
|
I wanted to parse a json object and build a different object depending on the value of some specific key in the JSON object.
|
||||||
objects depending on some key in the json object.
|
|
||||||
|
|
||||||
Here, I have three types of messages: `OperationMessage`, `PeerMessage` and
|
Here, I have three types of messages: `OperationMessage`, `PeerMessage` and
|
||||||
`ServerRequest`, as follows:
|
`ServerRequest`, as follows:
|
||||||
|
@ -21,9 +20,6 @@ from pydantic import BaseModel
|
||||||
class OperationMessage(BaseModel):
|
class OperationMessage(BaseModel):
|
||||||
kind: Literal["operation"] = "operation"
|
kind: Literal["operation"] = "operation"
|
||||||
verb: Literal["upsert", "update", "delete"]
|
verb: Literal["upsert", "update", "delete"]
|
||||||
subject: Literal["map", "layer", "feature"]
|
|
||||||
metadata: Optional[dict] = None
|
|
||||||
key: Optional[str] = None
|
|
||||||
|
|
||||||
|
|
||||||
class PeerMessage(BaseModel):
|
class PeerMessage(BaseModel):
|
||||||
|
@ -33,13 +29,13 @@ class PeerMessage(BaseModel):
|
||||||
message: dict
|
message: dict
|
||||||
|
|
||||||
|
|
||||||
class ServerRequest(BaseModel):
|
class ServerMessage(BaseModel):
|
||||||
kind: Literal["server"] = "server"
|
kind: Literal["server"] = "server"
|
||||||
action: Literal["list-peers"]
|
action: Literal["list-peers"]
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Each of these classes share the same `kind` property, which can act as a discriminator.
|
Each of these classes share the same `kind` key, but each of them has a different value for it. it's our discriminator.
|
||||||
|
|
||||||
Let's build a generic `Request` class that will be able to build for me the proper objects:
|
Let's build a generic `Request` class that will be able to build for me the proper objects:
|
||||||
|
|
||||||
|
@ -49,7 +45,7 @@ from pydantic import Field, RootModel, ValidationError
|
||||||
|
|
||||||
|
|
||||||
class Request(RootModel):
|
class Request(RootModel):
|
||||||
root: Union[ServerRequest, PeerMessage, OperationMessage] = Field(
|
root: Union[ServerMessage, PeerMessage, OperationMessage] = Field(
|
||||||
discriminator="kind"
|
discriminator="kind"
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
@ -60,11 +56,11 @@ Which can be used this way:
|
||||||
try:
|
try:
|
||||||
incoming = Request.model_validate_json(raw_message)
|
incoming = Request.model_validate_json(raw_message)
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
# raise
|
# Oh noes.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
And, because we have classes, we can leverage the `match` statement:
|
Because we have classes, we can leverage the `match` statement:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
match incoming.root:
|
match incoming.root:
|
||||||
|
@ -77,5 +73,5 @@ match incoming.root:
|
||||||
peer = connections.get(_id)
|
peer = connections.get(_id)
|
||||||
if peer:
|
if peer:
|
||||||
await peer.send(raw_message)
|
await peer.send(raw_message)
|
||||||
|
# ... Etc.
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
---
|
---
|
||||||
save_as: projets/index.html
|
save_as: projets/index.html
|
||||||
slug: projets
|
slug: projets
|
||||||
|
subtitle: À propos
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# Alexis Métaireau
|
||||||
|
|
||||||
## 🌟 Valeurs et intérets
|
## 🌟 Valeurs et intérets
|
||||||
|
|
||||||
Logiciel Libre
|
Logiciel Libre
|
||||||
|
@ -30,7 +33,10 @@ J'ai pu <del>jouer avec</del> travailler sur plusieurs projets au fil des année
|
||||||
|
|
||||||
Voici quelques logiciels auxquels j'ai participé. Vous pouvez aussi aller faire un tour sur mes dépots publics ([Github](https://github.com/almet) ou [Gitlab](https://gitlab.com/almet))
|
Voici quelques logiciels auxquels j'ai participé. Vous pouvez aussi aller faire un tour sur mes dépots publics ([Github](https://github.com/almet) ou [Gitlab](https://gitlab.com/almet))
|
||||||
|
|
||||||
🗺️ [uMap](https://umap-project.org) (2023-2024)
|
⚠️ [Dangerzone](https://dangerzone.rocks) (2024-*)
|
||||||
|
: Un logiciel pour transformer des documents potentiellement dangereux en documents sûrs, pour le compte de la foundation américaine pour la libérté de la presse ([Freedom of the Press Foundation](https://freedom.press))
|
||||||
|
|
||||||
|
🗺️ [uMap](https://umap-project.org) (2023-*)
|
||||||
: Un logiciel de création de cartes pour le web. J'y travaille sur l'ajout de fonctionalités de collaboration, pour que plusieurs utilisateur·ices puissent voir les éditions des autres, en « temps réel ».
|
: Un logiciel de création de cartes pour le web. J'y travaille sur l'ajout de fonctionalités de collaboration, pour que plusieurs utilisateur·ices puissent voir les éditions des autres, en « temps réel ».
|
||||||
|
|
||||||
🚨 [Argos](https://framasoft.frama.io/framaspace/argos/) (2023-2024)
|
🚨 [Argos](https://framasoft.frama.io/framaspace/argos/) (2023-2024)
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
---
|
---
|
||||||
save_as: resume/index.html
|
save_as: resume/index.html
|
||||||
slug: resume
|
slug: resume
|
||||||
title: Alexis Métaireau / Resume
|
title: Alexis Métaireau
|
||||||
---
|
---
|
||||||
# Alexis Métaireau - Resume
|
|
||||||
|
Here is a resume.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,88 @@ save_as: dangerzone/index.html
|
||||||
template: worklog-en
|
template: worklog-en
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Jeudi 11 Juillet 2024 (5h, 5/5)
|
||||||
|
|
||||||
|
- Update the REALEASE.md file with notes taken during the release
|
||||||
|
- Check how to run Dangerzone with Colima / explore the situation and give feedback to a user trying to make things work
|
||||||
|
- DZ biweekly meeting
|
||||||
|
|
||||||
|
## Mercredi 10 Juillet 2024 (8h, 5/5)
|
||||||
|
|
||||||
|
- We released 0.7.0, finally :-)
|
||||||
|
|
||||||
|
## Mardi 09 Juillet 2024 (8h, 5/5)
|
||||||
|
|
||||||
|
- Rebuilt all the Linux targeted distributions for the 0.7.0 release with the latest fixes, updated the pull requests on {apt,yum}-tools-prod repositories.
|
||||||
|
- Some poking around with L_ee to ensure the Windows virtualbox machine has access to the SmartCard.
|
||||||
|
- Rebuilt the Windows .msi
|
||||||
|
- Started thinking about what could be automated in our setup
|
||||||
|
|
||||||
|
## Lundi 08 Juillet 2024 (8h, 5/5)
|
||||||
|
|
||||||
|
- Sync up with a_pyrgio on the next steps for the release (when the mac mini will be back again).
|
||||||
|
- Documented myself on certificate transparency, and on how / if we should put trust in the Github releases pages for Dangerzone. I started an issue about that on the DZ repository.
|
||||||
|
- Discussed a bit with A_da about how the infra is setup and how we should use github PAT
|
||||||
|
- Read a bit about the latest SSL exploit, I didn't realized it was that problematic.
|
||||||
|
|
||||||
|
## Mardi 02 Juillet 2024 (6h, 5/5)
|
||||||
|
|
||||||
|
- 0.7.0 is almost there. Everything is signed and ready. Let's wait the green lights.
|
||||||
|
|
||||||
|
We finished the last steps for the release. Building and signing everything, by pairing together most of the day with Alex_P.
|
||||||
|
- I now know how to juggle with three different keyboard layouts !
|
||||||
|
|
||||||
|
## Lundi 01 Juillet 2024 (6h, 5/5)
|
||||||
|
|
||||||
|
- QA on my windows machine, and then
|
||||||
|
- Hopping to the windows VM to do the build and sign. Session with Alex_P where we did some debugging
|
||||||
|
- Reviewed a PR about adding timeouts on kill commands
|
||||||
|
|
||||||
|
## Jeudi 27 Juin 2024 (8h, 5/5)
|
||||||
|
|
||||||
|
- Today way mostly QAing for the 0.7.0 release, which is lining up.
|
||||||
|
- And we merged the drag-n-drop feature!
|
||||||
|
- Biweekly meeting, we discussed about how to deal with security problems when maintainers aren't around, and what's next for the redesign :-)
|
||||||
|
|
||||||
|
## Mercredi 26 Juin 2024 (6h, 4/5)
|
||||||
|
|
||||||
|
- Understanding how the mac minis are working, starting drafting a release there ;
|
||||||
|
- Reviewing Alex_P PR about using custom seccomp profiles on some specific Docker Desktop versions (see above)
|
||||||
|
- Started bumping python to 3.12 for Windows and macOS buildd, finding some bumps in the road.
|
||||||
|
|
||||||
|
|
||||||
|
## Mardi 25 Juin 2024 (8h, 5/5)
|
||||||
|
|
||||||
|
- Sync with AlexP on the upcoming 0.7.0 release
|
||||||
|
- Debugged a seccomp filter related bug with runc old versions on silicon mac + Docker Desktop w/ AlexP
|
||||||
|
- Started drafting a solution for it
|
||||||
|
- Changelog-related discussions
|
||||||
|
- Attended the XZ postmortem meeting
|
||||||
|
|
||||||
|
## Jeudi 20 Juin 2024 (8h, 5/5)
|
||||||
|
|
||||||
|
- Started the 0.7.0 release
|
||||||
|
- Updated dependencies
|
||||||
|
- Removed support for Fedora 38
|
||||||
|
- Started writing the CHANGELOG
|
||||||
|
- Synced w/ Alex
|
||||||
|
## Mercredi 19 Juin 2024 (8h, 4/5)
|
||||||
|
|
||||||
|
- Merged the two PRs for testing packages for fedora and debian
|
||||||
|
- Found out an issue with line endings on windows, when building the docker image
|
||||||
|
- 1:1 Discussion with M_icah
|
||||||
|
- Got access to the release machines, and found some way to circumvent the network at my workplace being tempered.
|
||||||
|
|
||||||
|
## Mardi 18 Juin 2024 (7h, 5/5)
|
||||||
|
|
||||||
|
- Fixing the CI for .deb testing
|
||||||
|
- Installing a windows machine to check current work on drag-n-drop there
|
||||||
|
- Started working on a PR for CI checking fedora packages
|
||||||
|
|
||||||
|
## Vendredi 14 Juin 2024 (6h, 4/5)
|
||||||
|
|
||||||
|
- Added CI for testing the built debian images are working properly.
|
||||||
|
- Some more work on the drag-n-drop feature, it's now passing the CI tests and is working everywhere I tried.
|
||||||
## Jeudi 13 Juin 2024 (8h, 5/5)
|
## Jeudi 13 Juin 2024 (8h, 5/5)
|
||||||
|
|
||||||
- Extended session with w/ Alex where we prepared the next 0.7.0 release, trying to see how much effort each task would be.
|
- Extended session with w/ Alex where we prepared the next 0.7.0 release, trying to see how much effort each task would be.
|
||||||
|
@ -25,12 +107,6 @@ Tomorrow looks like:
|
||||||
- Sprint planning
|
- Sprint planning
|
||||||
- Read about alternatives to Docker Desktop on macOS and windows.
|
- Read about alternatives to Docker Desktop on macOS and windows.
|
||||||
|
|
||||||
- [ ] (2) Install Qubes
|
|
||||||
- [x] (1) Review [Illegal chars filenames - Pull Request #834](https://github.com/freedomofpress/dangerzone/pull/834)
|
|
||||||
|
|
||||||
- [ ]
|
|
||||||
Quite a long day today, but spent a lot of time installing arch on my new machine.
|
|
||||||
|
|
||||||
## Mardi 11 Juin 2024 (7h, 5/5)
|
## Mardi 11 Juin 2024 (7h, 5/5)
|
||||||
|
|
||||||
- Sync w/ Alex in the morning
|
- Sync w/ Alex in the morning
|
||||||
|
|
|
@ -4,6 +4,41 @@ save_as: umap/index.html
|
||||||
template: worklog
|
template: worklog
|
||||||
total_days: 90
|
total_days: 90
|
||||||
---
|
---
|
||||||
|
## Vendredi 04 Juillet 2024 (7h, 5/5)
|
||||||
|
|
||||||
|
On se fait une session de pair avec Yohan le matin, continuée l'aprem, durant laquelle on a avancé des cas offline, et de comment réconcilier les messages manquants.
|
||||||
|
|
||||||
|
David nous rejoint en fin d'aprèm. Une bonne session !
|
||||||
|
|
||||||
|
## Jeudi 04 Juillet 2024 (10h, 5/5)
|
||||||
|
|
||||||
|
Je reprends le travail sur les messages échangés entre le serveur et les clients, pour trouver un moyen de récupérer les informations qui dates d'avant le "join". Je réussis finalement à trouver un moyen d'utiliser Pydantic comme je le veux, pour parser un message et avoir en retour différents objets, créés dynamiquement, en fonction du type de message.
|
||||||
|
|
||||||
|
Je réussis à envoyer l'ensemble des messages d'un client de l'autre côté, et ça s'affiche !
|
||||||
|
## Lundi 24 Juin 2024 (7h, 5/5)
|
||||||
|
|
||||||
|
Un bug remonté par un utilisateur me fait me rendre compte d'un impensé dans le code, et en tirant le fil, je trouve quelques bugs assez génants. Je les corrige.
|
||||||
|
|
||||||
|
Une discussion sur la gouvernance, qui débouche sur l'idée d'essayer d'avoir plus de clarté sur notre manière de nous organiser collectivement. Content devoir ce sujet pris en compte, et avancer.
|
||||||
|
|
||||||
|
On pair-prog avec David, et c'est aussi l'occasion de discuter ensemble.
|
||||||
|
|
||||||
|
## Lundi 17 Juin 2024 (5h, 5/5)
|
||||||
|
|
||||||
|
Je commence par décrire ce que je compte faire pour avoir les idées un peu plus
|
||||||
|
claires, puis j'enchaine sur l'implémentation de la sauvegarde des messages, du
|
||||||
|
HLC et du protocole de discussion avec le serveur.
|
||||||
|
|
||||||
|
Au passage, je me rends compte que le nombre de messages générés par le
|
||||||
|
`FormBuilder` est bien trop important, et qu'il faudrait plutôt utiliser
|
||||||
|
l'évènement `onBlur` pour éviter d'envoyer des messages à chaque modification
|
||||||
|
d'un `input`.
|
||||||
|
|
||||||
|
Le serveur à maintenant la possibilité de gérer différents types de messages, et
|
||||||
|
j'en suis au moment où je fais la selection du pair pour que celui ci envoie ses
|
||||||
|
messages de l'autre côté. Il me reste à demander côté client, puis à recevoir la
|
||||||
|
le message et à y répondre, pour enfin récupérer la liste des opérations et les
|
||||||
|
appliquer localement.
|
||||||
|
|
||||||
## Lundi 10 Juin 2024 (6h, 4/5)
|
## Lundi 10 Juin 2024 (6h, 4/5)
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,9 @@
|
||||||
date: 2024-07-12
|
date: 2024-07-12
|
||||||
headline: notes hebdo des semaines écoulées
|
headline: notes hebdo des semaines écoulées
|
||||||
projects: dangerzone, umap
|
projects: dangerzone, umap
|
||||||
status: draft
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Notes hebdo
|
# Notes hebdo #34
|
||||||
|
|
||||||
J'ai eu beaucoup de mal à trouver du temps pour ces notes hebdo dans les
|
J'ai eu beaucoup de mal à trouver du temps pour ces notes hebdo dans les
|
||||||
dernières semaines. Pas mal d'énergie mise sur d'autres projets et d'autres
|
dernières semaines. Pas mal d'énergie mise sur d'autres projets et d'autres
|
||||||
|
@ -42,12 +41,11 @@ point sur le mois passé, depuis la dernière note.
|
||||||
- Je me sens reposé. Ça me fait bizarre de l'écrire, mais ça faisait longtemps que ça ne m'était pas arrivé.
|
- Je me sens reposé. Ça me fait bizarre de l'écrire, mais ça faisait longtemps que ça ne m'était pas arrivé.
|
||||||
- Je m'autorise à prendre plus de pauses, ce qui fait que j'ai un rapport plus constructif au travail.
|
- Je m'autorise à prendre plus de pauses, ce qui fait que j'ai un rapport plus constructif au travail.
|
||||||
- Voir que ça va faire trop, et m'autoriser à annuler ce qui ferait déborder le vase.
|
- Voir que ça va faire trop, et m'autoriser à annuler ce qui ferait déborder le vase.
|
||||||
- Des rencontres à côté du boulot qui sont simples et motivantes, être à fond.
|
- Des rencontres à côté du boulot qui sont simples et motivantes, être à fond le temps d'un week-end.
|
||||||
- Me remettre à faire des trucs fermentés (légumes lactofermentés, kombucha)
|
|
||||||
- Prendre le temps d'animer des ateliers d'autodéfense numérique.
|
- Prendre le temps d'animer des ateliers d'autodéfense numérique.
|
||||||
- Sentir le temps se décaller, me coucher tard et me leve tard, me reposer quand
|
- Sentir le temps se décaller, me coucher tard et me lever tard, me reposer quand
|
||||||
j'en ai envie. C'est surement ça que j'appelle « retrouver le contrôle de mon
|
j'en ai envie. C'est surement ça que j'appelle « retrouver le contrôle de mon
|
||||||
temps »», un peu paradoxalement peut-être.
|
temps », un peu paradoxalement peut-être.
|
||||||
|
|
||||||
## Des peines 😬
|
## Des peines 😬
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
/*
|
/*
|
||||||
Theme Name: mnmlist modified by Alexis Métaireau
|
Theme Name: mnmlist modified by Alexis Métaireau
|
||||||
|
|
||||||
Theme URI: http://mathieu.agopian.info/mnmlist/theme.html
|
Theme URI: http://mathieu.agopian.info/mnmlist/theme.html
|
||||||
Description: Theme adapted from http://mnmlist.com/theme/ from Leo Babauta, a very clean minimalist theme, without comments, search, archives or other features.
|
Description: Theme adapted from http://mnmlist.com/theme/ from Leo Babauta,
|
||||||
|
a very clean minimalist theme, without comments, search, archives or other
|
||||||
|
features.
|
||||||
|
|
||||||
Author: Mathieu Agopian, Mathieu Leplatre, Alexis Métaireau
|
Author: Mathieu Agopian, Mathieu Leplatre, Alexis Métaireau
|
||||||
Autor URI: http://mathieu.agopian.info
|
Author URI: https://notmyidea.org
|
||||||
|
|
||||||
This theme is uncopyrighted, free, and offered as is.
|
This theme is uncopyrighted, free, and offered as is.
|
||||||
*/
|
*/
|
||||||
|
@ -11,36 +15,38 @@
|
||||||
@import url("pygment.css");
|
@import url("pygment.css");
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--main-bg-color: #ffffff;
|
--main-bg-color: hsl(0, 0%, 100%);
|
||||||
--border-color: #ACACAC;
|
--text-color: hsl(0, 0%, 18%);
|
||||||
--code-bg-color: #f6f6f6;
|
--reverse-bg-color: hsl(0, 0%, 20%);
|
||||||
--quote-bg-color: #f6f6f6;
|
--reverse-text-color: hsl(0, 0%, 100%);
|
||||||
--link-color: #BB7DD4;
|
--border-color: hsl(0, 0%, 67%);
|
||||||
--text-color: #2d2d2d;
|
--code-bg-color: hsl(0, 0%, 96%);
|
||||||
--menu-color: #7971D0;
|
--quote-bg-color: hsl(24, 100%, 98%);
|
||||||
--link-color-menu: #36194D;
|
--quote-bold-color: hsla(9, 100%, 60%, 0.3);
|
||||||
--headers-color: #000;
|
--highlight: hsla(200, 13%, 76%, 0.15);
|
||||||
--citation-bold-color: #f5ff889a;
|
--highlight-hover: hsl(165, 16%, 59%);
|
||||||
--highlight: #8f9fa926;
|
--link-color: hsl(9, 100%, 64%);
|
||||||
--highlight-hover: #84a59d;
|
--link-color-menu: hsl(9, 100%, 64%);
|
||||||
--gray: #ACACAC;
|
--headers-color: hsl(0, 0%, 0%);
|
||||||
--lightgray: #e0dcd3;
|
--headers-background-color: hsl(9, 100%, 64%);
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Luciole";
|
font-family: "Caveat";
|
||||||
src: url("../fonts/Luciole-Regular.ttf") format("ttf");
|
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 350;
|
font-weight: 400 700;
|
||||||
font-stretch: 100%;
|
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
|
src: url("../fonts/Caveat.woff2") format("woff2");
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
||||||
|
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
|
||||||
|
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background: var(--main-bg-color);
|
background: var(--main-bg-color);
|
||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
font-family: "Luciole", Arial, sans-serif;
|
font-family: "Cantarell", "Luciole", Arial, sans-serif;
|
||||||
/* background-image: url(/theme/white-waves.webp); */
|
/* background-image: url(/theme/white-waves.webp); */
|
||||||
background-repeat: repeat;
|
background-repeat: repeat;
|
||||||
|
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
|
@ -52,7 +58,6 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 768px) {
|
@media only screen and (max-width: 768px) {
|
||||||
|
|
||||||
/* For mobile phones: */
|
/* For mobile phones: */
|
||||||
body {
|
body {
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
@ -71,6 +76,7 @@ h2,
|
||||||
h3,
|
h3,
|
||||||
h4 {
|
h4 {
|
||||||
color: var(--headers-color);
|
color: var(--headers-color);
|
||||||
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
|
@ -78,14 +84,12 @@ h1 {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
line-height: 1.2em;
|
line-height: 1.2em;
|
||||||
}
|
a {
|
||||||
|
text-decoration-style: unset;
|
||||||
h1 a {
|
}
|
||||||
text-decoration-style: unset;
|
small {
|
||||||
}
|
font-size: 0.7em;
|
||||||
|
}
|
||||||
h1 small {
|
|
||||||
font-size: 0.7em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
|
@ -101,10 +105,17 @@ h4 {
|
||||||
}
|
}
|
||||||
|
|
||||||
time {
|
time {
|
||||||
font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
|
font-family:
|
||||||
|
ui-monospace,
|
||||||
|
SFMono-Regular,
|
||||||
|
SF Mono,
|
||||||
|
Menlo,
|
||||||
|
Consolas,
|
||||||
|
Liberation Mono,
|
||||||
|
monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
.book-container{
|
.book-container {
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
display: grid;
|
display: grid;
|
||||||
align-items: start;
|
align-items: start;
|
||||||
|
@ -151,9 +162,8 @@ blockquote {
|
||||||
}
|
}
|
||||||
|
|
||||||
blockquote strong {
|
blockquote strong {
|
||||||
background-color: var(--citation-bold-color);
|
background-color: var(--quote-bold-color);
|
||||||
font-weight: normal !important;
|
font-weight: normal !important;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
blockquote::before,
|
blockquote::before,
|
||||||
|
@ -181,7 +191,6 @@ blockquote::after {
|
||||||
content: "»";
|
content: "»";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
p {
|
p {
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
margin: 30px auto;
|
margin: 30px auto;
|
||||||
|
@ -193,7 +202,6 @@ p.caption {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
text-decoration-color: var(--link-color);
|
text-decoration-color: var(--link-color);
|
||||||
|
@ -206,17 +214,16 @@ a:hover {
|
||||||
|
|
||||||
a.tag {
|
a.tag {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 0 .1rem;
|
padding: 0 0.1rem;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag {
|
.tag {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 0 .1rem;
|
padding: 0 0.1rem;
|
||||||
font-size: 0.7em;
|
font-size: 0.7em;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a.tag:hover {
|
a.tag:hover {
|
||||||
|
@ -229,7 +236,6 @@ ol li {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
@ -244,17 +250,75 @@ pre {
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
white-space: pre-wrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
header a {
|
.ecriture {
|
||||||
text-decoration: none;
|
font-family: "Caveat";
|
||||||
|
font-size: 1.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
header h1 {
|
header {
|
||||||
margin-bottom: 30px;
|
display: inline-block;
|
||||||
}
|
width: 100%;
|
||||||
|
word-break: keep-all;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
white-space: normal;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
figure {
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
min-height: 2em;
|
||||||
|
font-size: clamp(5rem, 6rem, 6rem);
|
||||||
|
margin-bottom: 0px;
|
||||||
|
text-shadow: 10px 1px 3px var(--link-color);
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0.5em;
|
||||||
|
color: var(--headers-color);
|
||||||
|
background: repeating-linear-gradient(
|
||||||
|
45deg,
|
||||||
|
var(--link-color) 0px,
|
||||||
|
var(--link-color) 3px,
|
||||||
|
transparent 2px,
|
||||||
|
transparent 9px
|
||||||
|
);
|
||||||
|
margin-bottom: 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
figcaption {
|
||||||
|
top: -4rem;
|
||||||
|
right: 1rem;
|
||||||
|
position: relative;
|
||||||
|
background: white;
|
||||||
|
float: right;
|
||||||
|
font-size: 1.3em;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 600px) {
|
||||||
|
figure {
|
||||||
|
h1 {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
figcaption {
|
||||||
|
font-size: 1em;
|
||||||
|
right: 1rem;
|
||||||
|
top: -3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dt {
|
dt {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
@ -276,51 +340,99 @@ section.index h1 {
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#links {
|
||||||
|
li {
|
||||||
|
display: initial;
|
||||||
|
list-style-type: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
#links {}
|
li:nth-child(1) {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
#links li {
|
ul {
|
||||||
display: initial;
|
padding: 0;
|
||||||
list-style-type: none;
|
}
|
||||||
white-space: nowrap;
|
|
||||||
|
a {
|
||||||
|
padding-top: 5px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
|
||||||
|
text-decoration-color: var(--link-color-menu);
|
||||||
|
/*text-decoration-thickness: unset;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
li a:not(.main) {
|
||||||
|
text-transform: lower-case;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: var(--link-color-menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
a.main {
|
||||||
|
color: #fff;
|
||||||
|
background-color: var(--link-color-menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
a.selected {
|
||||||
|
text-decoration-color: var(--link-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
a.selected:hover {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# links li:nth-child(1) {
|
article,
|
||||||
display: inline-block;
|
.index {
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4 {
|
||||||
|
border-left: 0.6em var(--headers-background-color) solid;
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
position: relative;
|
||||||
|
list-style-type: none;
|
||||||
|
|
||||||
|
li::before {
|
||||||
|
content: "→";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5 {
|
||||||
|
padding-left: 0px;
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#links a {
|
.more {
|
||||||
padding-top: 5px;
|
color: var(--reverse-text-color);
|
||||||
padding-bottom: 5px;
|
background-color: var(--reverse-bg-color);
|
||||||
padding-left: 10px;
|
padding: 1em;
|
||||||
padding-right: 10px;
|
|
||||||
|
|
||||||
text-decoration-color: var(--link-color-menu);
|
h1,
|
||||||
/*text-decoration-thickness: unset;*/
|
h2,
|
||||||
|
h3 {
|
||||||
|
color: var(--reverse-text-color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.more details {
|
||||||
#links li a:not(.main){
|
padding-bottom: 1em;
|
||||||
text-transform: lower-case;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#links a:hover {
|
|
||||||
color: var(--link-color-menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
#links a.main {
|
|
||||||
color: #fff;
|
|
||||||
background-color: var(--link-color-menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
#links a.selected {
|
|
||||||
text-decoration-color: var(--link-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
#links a.selected:hover {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#article-list {
|
#article-list {
|
||||||
margin-top: 100px;
|
margin-top: 100px;
|
||||||
}
|
}
|
||||||
|
@ -332,10 +444,17 @@ section.index h1 {
|
||||||
}
|
}
|
||||||
|
|
||||||
p code {
|
p code {
|
||||||
font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
|
font-family:
|
||||||
|
ui-monospace,
|
||||||
|
SFMono-Regular,
|
||||||
|
SF Mono,
|
||||||
|
Menlo,
|
||||||
|
Consolas,
|
||||||
|
Liberation Mono,
|
||||||
|
monospace;
|
||||||
background: var(--code-bg-color);
|
background: var(--code-bg-color);
|
||||||
padding: 2px 4px;
|
padding: 2px 4px;
|
||||||
font-size: .9em;
|
font-size: 0.9em;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
}
|
}
|
||||||
|
@ -357,10 +476,9 @@ p code {
|
||||||
}
|
}
|
||||||
|
|
||||||
.note p.first::after {
|
.note p.first::after {
|
||||||
content: ' : ';
|
content: " : ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: var(--headers-color);
|
color: var(--headers-color);
|
||||||
|
@ -398,7 +516,7 @@ table th {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
table tbody tr:nth-child(2n+1) {
|
table tbody tr:nth-child(2n + 1) {
|
||||||
background-color: rgba(0, 0, 0, 0.025);
|
background-color: rgba(0, 0, 0, 0.025);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,28 +525,18 @@ table td {
|
||||||
}
|
}
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
background-color: var(--lightgray);
|
|
||||||
color: var(--gray);
|
|
||||||
text-align: center;
|
|
||||||
border: none;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 1px;
|
height: 0.5em;
|
||||||
margin: 3rem auto;
|
border: 0px;
|
||||||
border-color: var(--gray);
|
background: repeating-linear-gradient(
|
||||||
overflow: visible;
|
45deg,
|
||||||
|
var(--text-color) 0px,
|
||||||
|
var(--text-color) 3px,
|
||||||
|
transparent 2px,
|
||||||
|
transparent 9px
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
hr::after {
|
|
||||||
content: "* * *";
|
|
||||||
margin: -1em 0 .5em;
|
|
||||||
padding: .5em 1em;
|
|
||||||
font-size: 1.5em;
|
|
||||||
display: inline-block;
|
|
||||||
background-color: var(--main-bg-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@media screen and (max-width: 710px) {
|
@media screen and (max-width: 710px) {
|
||||||
ul li:nth-child(1):after {
|
ul li:nth-child(1):after {
|
||||||
content: "\A";
|
content: "\A";
|
||||||
|
@ -436,10 +544,6 @@ hr::after {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#links ul {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
a[data-size]::after {
|
a[data-size]::after {
|
||||||
content: attr(data-size);
|
content: attr(data-size);
|
||||||
vertical-align: super;
|
vertical-align: super;
|
||||||
|
@ -447,19 +551,19 @@ a[data-size]::after {
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
a[data-size='2'] {
|
a[data-size="2"] {
|
||||||
font-size: 1.3em;
|
font-size: 1.3em;
|
||||||
}
|
}
|
||||||
|
|
||||||
a[data-size='3'] {
|
a[data-size="3"] {
|
||||||
font-size: 1.6em;
|
font-size: 1.6em;
|
||||||
}
|
}
|
||||||
|
|
||||||
a[data-size='4'] {
|
a[data-size="4"] {
|
||||||
font-size: 1.8em;
|
font-size: 1.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
a[data-size='5'] {
|
a[data-size="5"] {
|
||||||
font-size: 2.2em;
|
font-size: 2.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,13 +583,10 @@ a[data-size='5'] {
|
||||||
.book-cover {
|
.book-cover {
|
||||||
max-width: 128px;
|
max-width: 128px;
|
||||||
max-height: 192px;
|
max-height: 192px;
|
||||||
margin: auto;
|
padding: 1em;
|
||||||
margin-top: 2em;
|
float: left;
|
||||||
padding-right: 0.5em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dd {
|
dd {
|
||||||
padding-bottom: 1em;
|
padding-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
@ -501,29 +602,34 @@ dd {
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.post-title {
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.items {
|
.items {
|
||||||
padding-left: 0px;
|
padding-left: 0px;
|
||||||
|
|
||||||
|
@media screen and (max-width: 600px) {
|
||||||
|
padding-left: 5px;
|
||||||
|
.item::before {
|
||||||
|
content: "→";
|
||||||
|
position: absolute;
|
||||||
|
left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.item {
|
.item {
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
display: flex;
|
display: flex;
|
||||||
padding-bottom: 0.5em;
|
padding-bottom: 0.5em;
|
||||||
}
|
|
||||||
|
|
||||||
.item>time {
|
time {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
color: #797878;
|
color: #797878;
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
}
|
|
||||||
|
|
||||||
#content header{
|
@media screen and (max-width: 600px) {
|
||||||
text-align: center;
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nav {
|
nav {
|
||||||
|
@ -547,6 +653,12 @@ nav {
|
||||||
|
|
||||||
.navigation > li::after {
|
.navigation > li::after {
|
||||||
content: " ";
|
content: " ";
|
||||||
letter-spacing: 1em;
|
letter-spacing: 1em;
|
||||||
background: linear-gradient(90deg, transparent calc(50% - 0.03125em), currentColor 0, currentColor calc(50% + 0.03125em), transparent 0);
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent calc(50% - 0.03125em),
|
||||||
|
currentColor 0,
|
||||||
|
currentColor calc(50% + 0.03125em),
|
||||||
|
transparent 0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,85 +1,125 @@
|
||||||
pre { line-height: 125%; }
|
:root {
|
||||||
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
|
--background-color: #f9f5f0;
|
||||||
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
|
--text-color: #333333;
|
||||||
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
|
--heading-color: #ff6347; /* tomato */
|
||||||
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
|
--subdued-heading-color: #e55a40; /* slightly muted tomato for better contrast */
|
||||||
.highlight .hll { background-color: #ffffcc }
|
--comment-color: #767676;
|
||||||
.highlight { background: #282C34; color: #ABB2BF }
|
--keyword-color: #d73a49;
|
||||||
.highlight .c { color: #7F848E } /* Comment */
|
--string-color: #22863a;
|
||||||
.highlight .err { color: #ABB2BF } /* Error */
|
--number-color: #005cc5;
|
||||||
.highlight .esc { color: #ABB2BF } /* Escape */
|
--function-color: #6f42c1;
|
||||||
.highlight .g { color: #ABB2BF } /* Generic */
|
--class-color: #e36209;
|
||||||
.highlight .k { color: #C678DD } /* Keyword */
|
--tag-color: #22863a;
|
||||||
.highlight .l { color: #ABB2BF } /* Literal */
|
--attribute-color: #005cc5;
|
||||||
.highlight .n { color: #E06C75 } /* Name */
|
--error-color: #cb2431;
|
||||||
.highlight .o { color: #56B6C2 } /* Operator */
|
--highlight-bg: #fff8e6;
|
||||||
.highlight .x { color: #ABB2BF } /* Other */
|
--line-number-color: #999999;
|
||||||
.highlight .p { color: #ABB2BF } /* Punctuation */
|
--line-number-bg: #f0ece6;
|
||||||
.highlight .ch { color: #7F848E } /* Comment.Hashbang */
|
}
|
||||||
.highlight .cm { color: #7F848E } /* Comment.Multiline */
|
|
||||||
.highlight .cp { color: #7F848E } /* Comment.Preproc */
|
pre {
|
||||||
.highlight .cpf { color: #7F848E } /* Comment.PreprocFile */
|
line-height: 125%;
|
||||||
.highlight .c1 { color: #7F848E } /* Comment.Single */
|
background-color: var(--background-color);
|
||||||
.highlight .cs { color: #7F848E } /* Comment.Special */
|
color: var(--text-color);
|
||||||
.highlight .gd { color: #ABB2BF } /* Generic.Deleted */
|
border-radius: 5px;
|
||||||
.highlight .ge { color: #ABB2BF } /* Generic.Emph */
|
overflow-x: auto;
|
||||||
.highlight .ges { color: #ABB2BF } /* Generic.EmphStrong */
|
display: block;
|
||||||
.highlight .gr { color: #ABB2BF } /* Generic.Error */
|
white-space: pre;
|
||||||
.highlight .gh { color: #ABB2BF } /* Generic.Heading */
|
word-wrap: normal;
|
||||||
.highlight .gi { color: #ABB2BF } /* Generic.Inserted */
|
}
|
||||||
.highlight .go { color: #ABB2BF } /* Generic.Output */
|
|
||||||
.highlight .gp { color: #ABB2BF } /* Generic.Prompt */
|
td.linenos .normal,
|
||||||
.highlight .gs { color: #ABB2BF } /* Generic.Strong */
|
span.linenos {
|
||||||
.highlight .gu { color: #ABB2BF } /* Generic.Subheading */
|
color: var(--comment-color);
|
||||||
.highlight .gt { color: #ABB2BF } /* Generic.Traceback */
|
background-color: transparent;
|
||||||
.highlight .kc { color: #E5C07B } /* Keyword.Constant */
|
padding-left: 5px;
|
||||||
.highlight .kd { color: #C678DD } /* Keyword.Declaration */
|
padding-right: 5px;
|
||||||
.highlight .kn { color: #C678DD } /* Keyword.Namespace */
|
}
|
||||||
.highlight .kp { color: #C678DD } /* Keyword.Pseudo */
|
|
||||||
.highlight .kr { color: #C678DD } /* Keyword.Reserved */
|
td.linenos .special,
|
||||||
.highlight .kt { color: #E5C07B } /* Keyword.Type */
|
span.linenos.special {
|
||||||
.highlight .ld { color: #ABB2BF } /* Literal.Date */
|
color: var(--comment-color);
|
||||||
.highlight .m { color: #D19A66 } /* Literal.Number */
|
background-color: #ffffd7;
|
||||||
.highlight .s { color: #98C379 } /* Literal.String */
|
padding-left: 5px;
|
||||||
.highlight .na { color: #E06C75 } /* Name.Attribute */
|
padding-right: 5px;
|
||||||
.highlight .nb { color: #E5C07B } /* Name.Builtin */
|
}
|
||||||
.highlight .nc { color: #E5C07B } /* Name.Class */
|
|
||||||
.highlight .no { color: #E06C75 } /* Name.Constant */
|
.highlight .hll {
|
||||||
.highlight .nd { color: #61AFEF } /* Name.Decorator */
|
background-color: var(--highlight-bg);
|
||||||
.highlight .ni { color: #E06C75 } /* Name.Entity */
|
}
|
||||||
.highlight .ne { color: #E06C75 } /* Name.Exception */
|
|
||||||
.highlight .nf { color: #61AFEF; font-weight: bold } /* Name.Function */
|
.highlight {
|
||||||
.highlight .nl { color: #E06C75 } /* Name.Label */
|
background: var(--background-color);
|
||||||
.highlight .nn { color: #E06C75 } /* Name.Namespace */
|
color: var(--text-color);
|
||||||
.highlight .nx { color: #E06C75 } /* Name.Other */
|
}
|
||||||
.highlight .py { color: #E06C75 } /* Name.Property */
|
|
||||||
.highlight .nt { color: #E06C75 } /* Name.Tag */
|
.highlight .c {
|
||||||
.highlight .nv { color: #E06C75 } /* Name.Variable */
|
color: var(--comment-color);
|
||||||
.highlight .ow { color: #56B6C2 } /* Operator.Word */
|
} /* Comment */
|
||||||
.highlight .pm { color: #ABB2BF } /* Punctuation.Marker */
|
.highlight .err {
|
||||||
.highlight .w { color: #ABB2BF } /* Text.Whitespace */
|
color: var(--error-color);
|
||||||
.highlight .mb { color: #D19A66 } /* Literal.Number.Bin */
|
} /* Error */
|
||||||
.highlight .mf { color: #D19A66 } /* Literal.Number.Float */
|
.highlight .k {
|
||||||
.highlight .mh { color: #D19A66 } /* Literal.Number.Hex */
|
color: var(--keyword-color);
|
||||||
.highlight .mi { color: #D19A66 } /* Literal.Number.Integer */
|
} /* Keyword */
|
||||||
.highlight .mo { color: #D19A66 } /* Literal.Number.Oct */
|
.highlight .s {
|
||||||
.highlight .sa { color: #98C379 } /* Literal.String.Affix */
|
color: var(--string-color);
|
||||||
.highlight .sb { color: #98C379 } /* Literal.String.Backtick */
|
} /* Literal.String */
|
||||||
.highlight .sc { color: #98C379 } /* Literal.String.Char */
|
.highlight .n {
|
||||||
.highlight .dl { color: #98C379 } /* Literal.String.Delimiter */
|
color: var(--text-color);
|
||||||
.highlight .sd { color: #98C379 } /* Literal.String.Doc */
|
} /* Name */
|
||||||
.highlight .s2 { color: #98C379 } /* Literal.String.Double */
|
.highlight .o {
|
||||||
.highlight .se { color: #98C379 } /* Literal.String.Escape */
|
color: var(--keyword-color);
|
||||||
.highlight .sh { color: #98C379 } /* Literal.String.Heredoc */
|
} /* Operator */
|
||||||
.highlight .si { color: #98C379 } /* Literal.String.Interpol */
|
.highlight .p {
|
||||||
.highlight .sx { color: #98C379 } /* Literal.String.Other */
|
color: var(--text-color);
|
||||||
.highlight .sr { color: #98C379 } /* Literal.String.Regex */
|
} /* Punctuation */
|
||||||
.highlight .s1 { color: #98C379 } /* Literal.String.Single */
|
|
||||||
.highlight .ss { color: #98C379 } /* Literal.String.Symbol */
|
.highlight .cm,
|
||||||
.highlight .bp { color: #E5C07B } /* Name.Builtin.Pseudo */
|
.highlight .cp,
|
||||||
.highlight .fm { color: #56B6C2; font-weight: bold } /* Name.Function.Magic */
|
.highlight .c1,
|
||||||
.highlight .vc { color: #E06C75 } /* Name.Variable.Class */
|
.highlight .cs {
|
||||||
.highlight .vg { color: #E06C75 } /* Name.Variable.Global */
|
color: var(--comment-color);
|
||||||
.highlight .vi { color: #E06C75 } /* Name.Variable.Instance */
|
} /* Comments */
|
||||||
.highlight .vm { color: #E06C75 } /* Name.Variable.Magic */
|
|
||||||
.highlight .il { color: #D19A66 } /* Literal.Number.Integer.Long */
|
.highlight .gd {
|
||||||
|
color: var(--error-color);
|
||||||
|
background-color: #ffeef0;
|
||||||
|
} /* Generic.Deleted */
|
||||||
|
.highlight .gi {
|
||||||
|
color: var(--tag-color);
|
||||||
|
background-color: #f0fff4;
|
||||||
|
} /* Generic.Inserted */
|
||||||
|
|
||||||
|
.highlight .kc,
|
||||||
|
.highlight .kd,
|
||||||
|
.highlight .kn,
|
||||||
|
.highlight .kp,
|
||||||
|
.highlight .kr {
|
||||||
|
color: var(--keyword-color);
|
||||||
|
} /* Keyword variations */
|
||||||
|
.highlight .kt {
|
||||||
|
color: var(--class-color);
|
||||||
|
} /* Keyword.Type */
|
||||||
|
|
||||||
|
.highlight .m {
|
||||||
|
color: var(--number-color);
|
||||||
|
} /* Literal.Number */
|
||||||
|
|
||||||
|
.highlight .na {
|
||||||
|
color: var(--attribute-color);
|
||||||
|
} /* Name.Attribute */
|
||||||
|
.highlight .nb {
|
||||||
|
color: var(--function-color);
|
||||||
|
} /* Name.Builtin */
|
||||||
|
.highlight .nc {
|
||||||
|
color: var(--class-color);
|
||||||
|
} /* Name.Class */
|
||||||
|
.highlight .nf {
|
||||||
|
color: var(--function-color);
|
||||||
|
} /* Name.Function */
|
||||||
|
.highlight .nt {
|
||||||
|
color: var(--tag-color);
|
||||||
|
} /* Name.Tag */
|
||||||
|
|
||||||
|
/* Add more class definitions as needed, following the pattern above */
|
||||||
|
|
|
@ -1,19 +1,30 @@
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %} {% block content %}
|
||||||
{% block content %}
|
<header>
|
||||||
<header>
|
<figure>
|
||||||
<h1>Archives</h1>
|
<h1>Archives</h1>
|
||||||
</header>
|
</figure>
|
||||||
<section id="content" class="body">
|
</header>
|
||||||
{% for year, articles in dates | groupby("date.year") | reverse %}
|
<article>
|
||||||
<h2>{{ year }}</h2>
|
{% for year, y_articles in dates | groupby("date.year") | reverse %}
|
||||||
<ul>
|
<h2>{{ year }}</h2>
|
||||||
{% for article in articles[0:20] %}
|
<ul>
|
||||||
<li>
|
{% for month, m_articles in y_articles | groupby("date.month") | reverse %}
|
||||||
<time datetime="{{ article.date.isoformat() }}">{{ article.date.strftime("%Y-%m-%d") }}</time>
|
<h3>
|
||||||
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title">{{ CATEGORIES_DESCRIPTION.get(article.category)[0] }}: {{ article.title }}</a>
|
{% if month == 1 %}Janvier{% elif month == 2 %}Février {% elif month == 3
|
||||||
</li>
|
%}Mars {% elif month == 4 %}Avril {% elif month == 5 %}Mai {% elif month
|
||||||
{% endfor %}
|
== 6 %}Juin {% elif month == 7 %}Juillet {% elif month == 8 %}Aout {% elif
|
||||||
</ul>
|
month == 9 %}Septembre {% elif month == 10 %}Octobre {% elif month == 11
|
||||||
{% endfor %}
|
%}Novembre {% elif month == 12 %}Décembre {% endif %}
|
||||||
</section>
|
</h3>
|
||||||
|
{% for article in m_articles %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title"
|
||||||
|
>{{ CATEGORIES_DESCRIPTION.get(article.category)[0] }}: {{ article.title
|
||||||
|
}}</a
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
{% endfor %} {% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endfor %}
|
||||||
|
</article>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,58 +1,73 @@
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %} {% block title %}{{ article.title }} - {{ super() }}{%
|
||||||
{% block title %}{{ article.title }} - {{ super() }}{% endblock %}
|
endblock %} {% block content %} {% set lectures = (article.category ==
|
||||||
{% block content %}
|
"Lectures") %}
|
||||||
<header>
|
<header class="{{ article.category }}">
|
||||||
{% if article.category == "Lectures" %}
|
<figure>
|
||||||
<h1 class="post-title">
|
<h1 class="post-title">{{ article.title }}</h1>
|
||||||
{{ article.title }}<small>
|
<figcaption>
|
||||||
<br />
|
{% if lectures %} Lu en {{ article.date | strftime("%B %Y") }} {% else %}
|
||||||
de {{ article.author }}</small>
|
{{ article.locale_date }} {% endif %}
|
||||||
</h1>
|
</figcaption>
|
||||||
<time datetime="{{ article.date.isoformat() }}">Lu en {{ article.date | strftime("%B %Y") }}</time>
|
</figure>
|
||||||
{% else %}
|
<nav>
|
||||||
<h1 class="post-title">{{ article.title }}</h1>
|
<ul class="navigation">
|
||||||
<time datetime="{{ article.date.isoformat() }}">{{ article.locale_date }}</time>
|
{% if article.prev_article_in_category %}
|
||||||
{% endif %}
|
<li>
|
||||||
<nav>
|
<a
|
||||||
<ul class="navigation">
|
href="{{ SITEURL }}/{{ article.prev_article_in_category.url }}"
|
||||||
{% if article.prev_article %}
|
title="{{ article.prev_article_in_category.title | striptags }}"
|
||||||
<li>
|
>← Précédent</a
|
||||||
<a href="{{ SITEURL }}/{{ article.prev_article.url }}"
|
>
|
||||||
title="{{ article.prev_article.title | striptags }}">← Précédent</a>
|
</li>
|
||||||
</li>
|
{% endif %}
|
||||||
{% endif %}
|
<li>
|
||||||
<li>
|
<a href="{{ SITEURL }}">Accueil</a>
|
||||||
<a href="{{ SITEURL }}">Accueil</a>
|
</li>
|
||||||
</li>
|
{% if article.next_article_in_category %}
|
||||||
{% if article.next_article %}
|
<li>
|
||||||
<li>
|
<a
|
||||||
<a href="{{ SITEURL }}/{{ article.next_article.url }}"
|
href="{{ SITEURL }}/{{ article.next_article_in_category.url }}"
|
||||||
title="{{ article.next_article.title | striptags }}">Suivant →</a>
|
title="{{ article.next_article_in_category.title | striptags }}"
|
||||||
</li>
|
>Suivant →</a
|
||||||
{% endif %}
|
>
|
||||||
</ul>
|
</li>
|
||||||
</nav>
|
{% endif %}
|
||||||
{% if article.headline and article.category != "weeknotes" %}
|
</ul>
|
||||||
<p>
|
</nav>
|
||||||
<em>{{ article.headline }}</em>
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
{% if article.isbn_cover %}
|
|
||||||
<div class="book-cover">
|
|
||||||
<img src="{{ SITEURL }}/{{ article.isbn_cover }}" />
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</header>
|
</header>
|
||||||
<article>
|
<article class="{{ article.category }}">
|
||||||
{{ article.content }}
|
{% if lectures %}
|
||||||
{% if article.tags %}
|
<p>{% if article.isbn_cover %}</p>
|
||||||
<p>
|
|
||||||
{% for tag in article.tags %}
|
<div class="book-cover">
|
||||||
<a href="{{ SITEURL }}/{{ tag.url }}">#{{ tag }}</a>
|
<img src="{{ SITEURL }}/{{ article.isbn_cover }}" />
|
||||||
{% if not loop.last %},{% endif %}
|
</div>
|
||||||
{% endfor %}
|
{% endif %}
|
||||||
- Posté dans la catégorie <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>
|
<p>de {{ article.author }}</p>
|
||||||
</p>
|
{% if article.headline %}
|
||||||
|
<p><em>{{ article.headline }}</em></p>
|
||||||
|
{% endif %}
|
||||||
|
<hr />
|
||||||
|
{% endif %} {{ article.content }}
|
||||||
|
</article>
|
||||||
|
{% if article.contraintes or article.tags %} {% if article.contraintes %}
|
||||||
|
<details>
|
||||||
|
<summary>+ d'infos sur ce texte (au risque de casser la magie)…</summary>
|
||||||
|
{% endif %}
|
||||||
|
<section class="more">
|
||||||
|
{% if article.contraintes %}
|
||||||
|
<h2>Contraintes</h2>
|
||||||
|
{{ article.contraintes }} {% endif %} {% if article.tags %}
|
||||||
|
<p>
|
||||||
|
{% for tag in article.tags %}
|
||||||
|
<a href="{{ SITEURL }}/{{ tag.url }}">#{{ tag }}</a>
|
||||||
|
{% if not loop.last %},{% endif %} {% endfor %} - Posté dans la catégorie
|
||||||
|
<a href="{{ SITEURL }}/{{ article.category.url }}"
|
||||||
|
>{{ article.category }}</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</article>
|
</section>
|
||||||
{% endblock %}
|
{% if article.contraintes %}
|
||||||
|
</details>
|
||||||
|
{% endif %} {% endif %} {% endblock %}
|
||||||
|
|
|
@ -1,51 +1,56 @@
|
||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="fr">
|
<html lang="fr">
|
||||||
<head>
|
<head>
|
||||||
<title>
|
<title>{% block title %}{{ SITENAME }}{% endblock %}</title>
|
||||||
{% block title %}{{ SITENAME }}{% endblock %}
|
<meta charset="utf-8" />
|
||||||
</title>
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta charset="utf-8" />
|
<link
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
rel="stylesheet"
|
||||||
<link rel="stylesheet"
|
href="{{ SITEURL }}/theme/css/{{ CSS_FILE }}?v4"
|
||||||
href="{{ SITEURL }}/theme/css/{{ CSS_FILE }}?v4"
|
type="text/css"
|
||||||
type="text/css" />
|
/>
|
||||||
<link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}"
|
<link
|
||||||
type="application/atom+xml"
|
href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}"
|
||||||
rel="alternate"
|
type="application/atom+xml"
|
||||||
title="{{ SITENAME }} ATOM Feed" />
|
rel="alternate"
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
title="{{ SITENAME }} ATOM Feed"
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
/>
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||||
<link rel="manifest" href="/site.webmanifest">
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
||||||
{% if FEED_RSS %}
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
||||||
<link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}"
|
<link rel="manifest" href="/site.webmanifest" />
|
||||||
type="application/atom+xml"
|
{% if FEED_RSS %}
|
||||||
rel="alternate"
|
<link
|
||||||
title="{{ SITENAME }} RSS Feed" />
|
href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}"
|
||||||
{% endif %}
|
type="application/atom+xml"
|
||||||
{% block extra_head %}{% endblock %}
|
rel="alternate"
|
||||||
</head>
|
title="{{ SITENAME }} RSS Feed"
|
||||||
<body>
|
/>
|
||||||
<div id="content">
|
{% endif %} {% block extra_head %}{% endblock %}
|
||||||
{% block content %}{% endblock %}
|
</head>
|
||||||
<hr />
|
<body>
|
||||||
<footer>
|
<div id="content">
|
||||||
<ul id="links">
|
{% if page_name != "index" and not article %}
|
||||||
<li>
|
<a href="/">Aller à l'accueil</a>
|
||||||
<a class="main" href="/">{{ SITENAME }}</a>
|
{% endif %} {% block content %}{% endblock %}
|
||||||
</li>
|
<hr />
|
||||||
{% for title, link in FOOTERITEMS %}
|
<footer>
|
||||||
<li>
|
<ul id="links">
|
||||||
<a href="{{ link }}">{{ title }}</a>
|
<li>
|
||||||
</li>
|
<a class="main" href="/">{{ SITENAME }}</a>
|
||||||
{% endfor %}
|
</li>
|
||||||
<li>
|
{% for title, link in FOOTERITEMS %}
|
||||||
<a id="feed" href="/feeds/all.atom.xml">
|
<li>
|
||||||
<img alt="RSS Logo" src="/theme/rss.svg" />
|
<a href="{{ link }}">{{ title }}</a>
|
||||||
</a>
|
</li>
|
||||||
</li>
|
{% endfor %}
|
||||||
</ul>
|
<li>
|
||||||
</footer>
|
<a id="feed" href="/feeds/all.atom.xml">
|
||||||
</div>
|
<img alt="RSS Logo" src="/theme/rss.svg" />
|
||||||
</body>
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,53 +1,35 @@
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %} {% block content %}
|
||||||
{% block content %}
|
<header class="{{ category }}">
|
||||||
|
<figure>
|
||||||
{% if category in CATEGORIES_DESCRIPTION.keys() %}
|
{% if category in CATEGORIES_DESCRIPTION.keys() %}
|
||||||
<h1>
|
<h1 class="post-title">{{ CATEGORIES_DESCRIPTION[category][0] }}</h1>
|
||||||
{{ CATEGORIES_DESCRIPTION[category][0] }}
|
<figcaption>
|
||||||
<a id="feed" href="{{ SITEURL }}/feeds/{{ category.slug }}.atom.xml">
|
<a id="feed" href="{{ SITEURL }}/feeds/{{ category.slug }}.atom.xml">
|
||||||
<img src="{{ SITEURL }}/theme/rss.svg" />
|
Flux RSS <img src="{{ SITEURL }}/theme/rss.svg" />
|
||||||
</a>
|
</a>
|
||||||
</h1>
|
</figcaption>
|
||||||
<p>{{ CATEGORIES_DESCRIPTION[category][1] }}</p>
|
<p>{{ CATEGORIES_DESCRIPTION[category][1] }}</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
<h1>{{ category }}</h1>
|
<h1>{{ category }}</h1>
|
||||||
{% endif %}
|
|
||||||
<section class="section index">
|
|
||||||
{% if category != "lectures" %}
|
|
||||||
{% for year, year_articles in articles | groupby('date.year') | reverse %}
|
|
||||||
<h2>En {{ year }}</h2>
|
|
||||||
<ul>
|
|
||||||
{% for article in year_articles %}
|
|
||||||
<li>
|
|
||||||
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title">{{ article.title }}</a>
|
|
||||||
{% for tag in article.tags %}<div class="tag">{{ tag }}</div>{% endfor %}
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% endfor %}
|
|
||||||
{% else %}
|
|
||||||
{% for article in articles %}
|
|
||||||
<div class="book-container">
|
|
||||||
{% if article.category == "Lectures" and article.isbn_cover %}
|
|
||||||
<div class="book-cover">
|
|
||||||
<img src="{{ SITEURL }}/{{ article.isbn_cover }}" />
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
<div class="book">
|
|
||||||
<h1 class="post-title">
|
|
||||||
<a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a><small>
|
|
||||||
<br />
|
|
||||||
par {{ article.author }}</small>
|
|
||||||
</h1>
|
|
||||||
{% if article.headline %}
|
|
||||||
<p>
|
|
||||||
<em>{{ article.headline }}</em>
|
|
||||||
</p>
|
|
||||||
{% endif %}
|
|
||||||
<time datetime="{{ article.date.isoformat() }}">Lu en {{ article.date | strftime("%B %Y") }}</time>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr />
|
|
||||||
{% endfor %}
|
|
||||||
</section>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</figure>
|
||||||
|
</header>
|
||||||
|
<article class="{{ category }}">
|
||||||
|
{% for year, year_articles in articles | groupby('date.year') | reverse %}
|
||||||
|
<h2>{{ year }}</h2>
|
||||||
|
<ul>
|
||||||
|
{% for article in year_articles %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title"
|
||||||
|
>{{ article.title }}</a
|
||||||
|
>
|
||||||
|
{% if article.category == "Lectures" %}de {{article.author}}{% endif %} {%
|
||||||
|
for tag in article.tags %}
|
||||||
|
<div class="tag">{{ tag }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endfor %}
|
||||||
|
</article>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,34 +1,65 @@
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %} {% block content %}
|
||||||
{% block content %}
|
<header>
|
||||||
<header>
|
<figure>
|
||||||
<h1 class="post-title">{{ SITENAME }}</h1>
|
<h1 class="post-title">{{ SITENAME }}</h1>
|
||||||
</header>
|
<figcaption>Carnets web d'Alexis M</figcaption>
|
||||||
<article>
|
</figure>
|
||||||
<p>
|
</header>
|
||||||
👋 <strong>Bienvenue par ici</strong>,
|
<article>
|
||||||
</p>
|
<p>👋 <strong>Bienvenue</strong></p>
|
||||||
<p>
|
<p>
|
||||||
Vous retrouverez sur ce bout de toile <a href="/weeknotes">mes notes hebdo</a>, un
|
Si vous êtes ici, c'est sûrement que vous vous êtes perdus lors d'une
|
||||||
<a href="/journal">journal de bord</a>, des <a href="/lectures">notes de lectures</a>, <a href="/code">des bouts
|
exploration, au détour d'un clic, et que vous essayez d'en savoir plus.
|
||||||
de code</a> et <a href="/ecriture">des textes</a> que je veux partager. Aussi, <a href="/projets">une petite présentation</a>.
|
</p>
|
||||||
Bonne lecture !
|
<p>
|
||||||
</p>
|
Ici, je range (enfin, j'essaye) certains bouts de réflexion et des notes que
|
||||||
<p>
|
je veux garder dans un coin. Vous pouvez trouver:
|
||||||
Pour me contacter, envoyez-moi un email sur <code>alexis@</code> ce domaine (en enlevant <code>blog.</code>).
|
</p>
|
||||||
</p>
|
<ul>
|
||||||
</article>
|
<li>
|
||||||
{% if articles %}
|
<a href="/ecriture">Des écrits</a>, poésie et fiction, souvent au format
|
||||||
<hr />
|
court.
|
||||||
<h2>Les derniers articles</h2>
|
</li>
|
||||||
<ul class="items">
|
<li>
|
||||||
{% for article in articles[0:20] %}
|
<a href="/lectures">Des notes de lecture</a>, sur differents bouquins,
|
||||||
<li class="item">
|
pour pouvoir retrouver certains passages et alimenter des discussions.
|
||||||
{% set category_description = CATEGORIES_DESCRIPTION.get(article.category)[0] %}
|
</li>
|
||||||
<a href="{{ SITEURL }}/{{ article.url }}" class="page-title">{{ category_description }}: {{ article.title.replace(category_description, "") }}</a>
|
<li>
|
||||||
<time datetime="{{ article.date.isoformat() }}">{{ article.date.strftime("%Y-%m-%d") }}</time>
|
<a href="/code">Des bouts de code</a>, astuces et autres découvertes
|
||||||
</li>
|
autour du développement logiciel, que je veux garder et/ou partager.
|
||||||
{% endfor %}
|
</li>
|
||||||
</ul>
|
<li>
|
||||||
Voir <a href="archives.html">toutes les archives</a>
|
<a href="/weeknotes">Mes notes hebdo</a>, une sorte de journal de mes
|
||||||
{% endif %}
|
activités pro, avec une tentative de prise de recul sur les semaines
|
||||||
{% endblock content %}
|
passées.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Aussi, <a href="/projets">une présentation</a>, parce que bon, ça se fait
|
||||||
|
pas de pas se présenter.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Si vous voulez me contacter, envoyez-moi un email sur
|
||||||
|
<code>alexis@</code> ce domaine (en enlevant <code>blog.</code>).
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
{% if articles %}
|
||||||
|
<hr />
|
||||||
|
<h2>Les derniers articles</h2>
|
||||||
|
<ul class="items">
|
||||||
|
{% for article in articles[0:20] %}
|
||||||
|
<li class="item">
|
||||||
|
{% set category_description =
|
||||||
|
CATEGORIES_DESCRIPTION.get(article.category)[0] %}
|
||||||
|
<a href="{{ SITEURL }}/{{ article.url }}" class="page-title"
|
||||||
|
>{{ category_description }}: {{
|
||||||
|
article.title.replace(category_description, "") }}</a
|
||||||
|
>
|
||||||
|
<time datetime="{{ article.date.isoformat() }}"
|
||||||
|
>{{ article.date.strftime("%Y-%m-%d") }}</time
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
Voir <a href="archives.html">toutes les archives</a>
|
||||||
|
{% endif %} {% endblock content %}
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %} {% block title %}{{ page.title }} - {{ super() }}{%
|
||||||
{% block title %}{{ page.title }} - {{ super() }}{% endblock %}
|
endblock %} {% block content %}
|
||||||
{% block content %}<article>{{ page.content }}</article>{% endblock %}
|
<header>
|
||||||
|
<figure>
|
||||||
|
<h1>{{ page.title }}</h1>
|
||||||
|
{% if page.subtitle %}
|
||||||
|
<figcaption>{{ page.subtitle}}</figcaption>
|
||||||
|
{% endif %}
|
||||||
|
</figure>
|
||||||
|
</header>
|
||||||
|
<article>{{ page.content }}</article>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -1,3 +1,27 @@
|
||||||
{% extends "index.html" %}
|
{% extends "base.html" %} {% block title %}Tag {{ tag.name }} - {{ super() }}{%
|
||||||
{% block title %}{{ tag }} - {{ super() }}{% endblock %}
|
endblock %} {% block content %}
|
||||||
{% block pagetitle %}Tag « {{ tag }} »{% endblock %}
|
<header class="tag">
|
||||||
|
<figure>
|
||||||
|
<h1 class="post-title">{{ tag }}</h1>
|
||||||
|
<figcaption>
|
||||||
|
<a id="feed" href="{{ SITEURL }}/feeds/tags/{{ tag.slug }}.atom.xml">
|
||||||
|
Flux RSS <img src="{{ SITEURL }}/theme/rss.svg" />
|
||||||
|
</a>
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
|
</header>
|
||||||
|
<article class="{{ category }}">
|
||||||
|
<ul>
|
||||||
|
{% for article in articles %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title"
|
||||||
|
>{{ article.title }}</a
|
||||||
|
>
|
||||||
|
{% for tag in article.tags %}
|
||||||
|
<div class="tag">{{ tag }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -1,94 +1,80 @@
|
||||||
{% extends "page.html" %}
|
{% extends "page.html" %} {% block extra_head %}
|
||||||
{% block extra_head %}
|
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
|
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
|
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
|
{% endblock extra_head %} {% block content %}
|
||||||
{% endblock extra_head %}
|
|
||||||
{% block content %}
|
|
||||||
<header>
|
|
||||||
<h1 class="post-title">{{ page.title }}</h1>
|
|
||||||
<details>
|
|
||||||
<summary>Stats</summary>
|
|
||||||
{% if "total_days" in page.metadata.keys() %}
|
|
||||||
{% set percentage = page.metadata.worklog['percentage'] %}
|
|
||||||
{% set total_blocks = 10 %}
|
|
||||||
{% set percentage_value = (percentage / 100.0) %}
|
|
||||||
{% set full_blocks = ((percentage_value * total_blocks) | round(0, 'floor') ) | int %}
|
|
||||||
{% set empty_blocks = total_blocks - full_blocks %}
|
|
||||||
<div>
|
|
||||||
{# Display full blocks #}
|
|
||||||
{% for i in range(full_blocks) %}▓{% endfor %}
|
|
||||||
{# Display empty blocks #}
|
|
||||||
{% for i in range(empty_blocks) %}░{% endfor %}
|
|
||||||
{{ percentage }}% ({{ page.metadata.worklog['payed_hours'] }}h / {{ page.metadata.worklog['total_hours'] }} prévues)
|
|
||||||
</div>
|
|
||||||
<ul>
|
|
||||||
<li>{{ page.metadata.worklog['payed_hours'] }}h</li>
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td>Month</td>
|
|
||||||
<td>Hours</td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for month, hours in page.metadata.worklog.monthly_hours.items() %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ month }}</td>
|
|
||||||
<td>{{ hours['payed'] }}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</details>
|
|
||||||
</header>
|
|
||||||
<article>
|
|
||||||
<div id="vis"></div>
|
|
||||||
{{ page.content }}
|
|
||||||
</article>
|
|
||||||
<script>
|
|
||||||
const spec = {
|
|
||||||
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
|
|
||||||
"width": 500,
|
|
||||||
"height": 200,
|
|
||||||
"data":
|
|
||||||
{
|
|
||||||
"name": "table",
|
|
||||||
"values": [
|
|
||||||
{% for date, item in page.metadata.worklog.data.items() %}
|
|
||||||
{"date": "{{ date }}", "series": "Worked", "count": {{ item['payed_hours'] }}},
|
|
||||||
{% endfor %}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
,
|
|
||||||
"mark": "bar",
|
|
||||||
"encoding": {
|
|
||||||
"x": {
|
|
||||||
"timeUnit": {"unit": "", "utc": true},
|
|
||||||
"field": "date",
|
|
||||||
"axis": {"format": "%d/%m"},
|
|
||||||
"title": "Date"
|
|
||||||
},
|
|
||||||
"y": {
|
|
||||||
"aggregate": "sum",
|
|
||||||
"field": "count",
|
|
||||||
"title": "Hours",
|
|
||||||
},
|
|
||||||
"color": {
|
|
||||||
"field": "series",
|
|
||||||
"scale": {
|
|
||||||
"domain": ["Worked"],
|
|
||||||
"range": ["#1f77b4"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
vegaEmbed("#vis", spec)
|
<header>
|
||||||
// result.view provides access to the Vega View API
|
<figure>
|
||||||
.then(result => console.log(result))
|
<h1 class="post-title">{{ page.title }}</h1>
|
||||||
.catch(console.warn);
|
<figcaption>Work journal</figcaption>
|
||||||
</script>
|
</figure>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Stats</summary>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td>Month</td>
|
||||||
|
<td>Hours</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for month, hours in page.metadata.worklog.monthly_hours.items() %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ month }}</td>
|
||||||
|
<td>{{ hours['payed'] }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</details>
|
||||||
|
</header>
|
||||||
|
<article>
|
||||||
|
<div id="vis"></div>
|
||||||
|
{{ page.content }}
|
||||||
|
</article>
|
||||||
|
<script>
|
||||||
|
const spec = {
|
||||||
|
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
|
||||||
|
"width": 500,
|
||||||
|
"height": 200,
|
||||||
|
"data":
|
||||||
|
{
|
||||||
|
"name": "table",
|
||||||
|
"values": [
|
||||||
|
{% for date, item in page.metadata.worklog.data.items() %}
|
||||||
|
{"date": "{{ date }}", "series": "Worked", "count": {{ item['payed_hours'] }}},
|
||||||
|
{% endfor %}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
,
|
||||||
|
"mark": "bar",
|
||||||
|
"encoding": {
|
||||||
|
"x": {
|
||||||
|
"timeUnit": {"unit": "", "utc": true},
|
||||||
|
"field": "date",
|
||||||
|
"axis": {"format": "%d/%m"},
|
||||||
|
"title": "Date"
|
||||||
|
},
|
||||||
|
"y": {
|
||||||
|
"aggregate": "sum",
|
||||||
|
"field": "count",
|
||||||
|
"title": "Hours",
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"field": "series",
|
||||||
|
"scale": {
|
||||||
|
"domain": ["Worked"],
|
||||||
|
"range": ["#1f77b4"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
vegaEmbed("#vis", spec)
|
||||||
|
// result.view provides access to the Vega View API
|
||||||
|
.then(result => console.log(result))
|
||||||
|
.catch(console.warn);
|
||||||
|
</script>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
|
@ -1,98 +1,98 @@
|
||||||
{% extends "page.html" %}
|
{% extends "page.html" %} {% block extra_head %}
|
||||||
{% block extra_head %}
|
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
|
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
|
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
|
{% endblock extra_head %} {% block content %}
|
||||||
{% endblock extra_head %}
|
<header>
|
||||||
{% block content %}
|
<figure>
|
||||||
<header>
|
<h1 class="post-title">Journal {{ page.title }}</h1>
|
||||||
<h1 class="post-title">{{ page.title }}</h1>
|
<figcaption>
|
||||||
<details>
|
{% if "total_days" in page.metadata.keys() %} {% set percentage =
|
||||||
<summary>Stats</summary>
|
page.metadata.worklog['percentage'] %} {% set total_blocks = 10 %} {% set
|
||||||
{% if "total_days" in page.metadata.keys() %}
|
percentage_value = (percentage / 100.0) %} {% set full_blocks =
|
||||||
{% set percentage = page.metadata.worklog['percentage'] %}
|
((percentage_value * total_blocks) | round(0, 'floor') ) | int %} {% set
|
||||||
{% set total_blocks = 10 %}
|
empty_blocks = total_blocks - full_blocks %}
|
||||||
{% set percentage_value = (percentage / 100.0) %}
|
<div>
|
||||||
{% set full_blocks = ((percentage_value * total_blocks) | round(0, 'floor') ) | int %}
|
{# Display full blocks #} {% for i in range(full_blocks) %}▓{% endfor %}
|
||||||
{% set empty_blocks = total_blocks - full_blocks %}
|
{# Display empty blocks #} {% for i in range(empty_blocks) %}░{% endfor
|
||||||
<div>
|
%} {{ percentage }}%
|
||||||
{# Display full blocks #}
|
</div>
|
||||||
{% for i in range(full_blocks) %}▓{% endfor %}
|
{% endif %}
|
||||||
{# Display empty blocks #}
|
</figcaption>
|
||||||
{% for i in range(empty_blocks) %}░{% endfor %}
|
</figure>
|
||||||
{{ percentage }}% ({{ page.metadata.worklog['payed_hours'] }}h / {{ page.metadata.worklog['total_hours'] }} prévues)
|
<details>
|
||||||
</div>
|
<summary>Stats</summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li>{{ page.metadata.worklog['payed_hours'] }}h rémunérées</li>
|
<li>{{ page.metadata.worklog['total_hours'] }}h prévues</li>
|
||||||
<li>{{ page.metadata.worklog['volunteer_hours'] }}h bénévoles</li>
|
<li>{{ page.metadata.worklog['payed_hours'] }}h rémunérées</li>
|
||||||
</ul>
|
<li>{{ page.metadata.worklog['volunteer_hours'] }}h bénévoles</li>
|
||||||
{% endif %}
|
</ul>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Mois</td>
|
<td>Mois</td>
|
||||||
<td>Jours rémunérés</td>
|
<td>Jours rémunérés</td>
|
||||||
<td>Jours bénévoles</td>
|
<td>Jours bénévoles</td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for month, hours in page.metadata.worklog.monthly_hours.items() %}
|
{% for month, hours in page.metadata.worklog.monthly_hours.items() %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ month }}</td>
|
<td>{{ month }}</td>
|
||||||
<td>{{ (hours['payed'] / 7.0) | round(1) }}</td>
|
<td>{{ (hours['payed'] / 7.0) | round(1) }}</td>
|
||||||
<td>{{ (hours['volunteered'] / 7.0) | round(1) }}</td>
|
<td>{{ (hours['volunteered'] / 7.0) | round(1) }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</details>
|
</details>
|
||||||
</header>
|
</header>
|
||||||
<article>
|
<article>
|
||||||
<div id="vis"></div>
|
<div id="vis"></div>
|
||||||
{{ page.content }}
|
{{ page.content }}
|
||||||
</article>
|
</article>
|
||||||
<script>
|
<script>
|
||||||
const spec = {
|
const spec = {
|
||||||
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
|
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
|
||||||
"width": 500,
|
"width": 500,
|
||||||
"height": 200,
|
"height": 200,
|
||||||
"data":
|
"data":
|
||||||
{
|
{
|
||||||
"name": "table",
|
"name": "table",
|
||||||
"values": [
|
"values": [
|
||||||
{% for date, item in page.metadata.worklog.data.items() %}
|
{% for date, item in page.metadata.worklog.data.items() %}
|
||||||
{"date": "{{ date }}", "series": "Rémunéré", "count": {{ item['payed_hours'] }}},
|
{"date": "{{ date }}", "series": "Rémunéré", "count": {{ item['payed_hours'] }}},
|
||||||
{"date": "{{ date }}", "series": "Bénévole", "count": {{ item['volunteer_hours'] }}},
|
{"date": "{{ date }}", "series": "Bénévole", "count": {{ item['volunteer_hours'] }}},
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
"mark": "bar",
|
"mark": "bar",
|
||||||
"encoding": {
|
"encoding": {
|
||||||
"x": {
|
"x": {
|
||||||
"timeUnit": {"unit": "", "utc": true},
|
"timeUnit": {"unit": "", "utc": true},
|
||||||
"field": "date",
|
"field": "date",
|
||||||
"axis": {"format": "%d/%m"},
|
"axis": {"format": "%d/%m"},
|
||||||
"title": "Date"
|
"title": "Date"
|
||||||
},
|
},
|
||||||
"y": {
|
"y": {
|
||||||
"aggregate": "sum",
|
"aggregate": "sum",
|
||||||
"field": "count",
|
"field": "count",
|
||||||
"title": "Heures",
|
"title": "Heures",
|
||||||
},
|
},
|
||||||
"color": {
|
"color": {
|
||||||
"field": "series",
|
"field": "series",
|
||||||
"scale": {
|
"scale": {
|
||||||
"domain": ["Bénévole", "Rémunéré"],
|
"domain": ["Bénévole", "Rémunéré"],
|
||||||
"range": ["#e7ba52", "#1f77b4"]
|
"range": ["#e7ba52", "#1f77b4"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
vegaEmbed("#vis", spec)
|
vegaEmbed("#vis", spec)
|
||||||
// result.view provides access to the Vega View API
|
// result.view provides access to the Vega View API
|
||||||
.then(result => console.log(result))
|
.then(result => console.log(result))
|
||||||
.catch(console.warn);
|
.catch(console.warn);
|
||||||
</script>
|
</script>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
PATH = "content"
|
PATH = "content"
|
||||||
SITENAME = "Alexis Métaireau"
|
SITENAME = "(not my) ideas"
|
||||||
AUTHOR = ""
|
AUTHOR = ""
|
||||||
THEME = "mnmlist"
|
THEME = "mnmlist"
|
||||||
STATIC_PATHS = ["images", "audio", "extra", "docs"]
|
STATIC_PATHS = ["images", "audio", "extra", "docs"]
|
||||||
|
@ -14,10 +14,11 @@ EXTRA_PATH_METADATA = {
|
||||||
"extra/apple-touch-icon.png": {"path": "apple-touch-icon.png"},
|
"extra/apple-touch-icon.png": {"path": "apple-touch-icon.png"},
|
||||||
"extra/favicon-16x16.png": {"path": "favicon-16x16.png"},
|
"extra/favicon-16x16.png": {"path": "favicon-16x16.png"},
|
||||||
"extra/favicon-32x32.png": {"path": "favicon-32x32.png"},
|
"extra/favicon-32x32.png": {"path": "favicon-32x32.png"},
|
||||||
"extra/favicon-32x32.png": {"path": "favicon-32x32.png"},
|
|
||||||
"extra/robots.txt": {"path": "robots.txt"},
|
"extra/robots.txt": {"path": "robots.txt"},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FORMATTED_FIELDS = "contraintes"
|
||||||
|
|
||||||
SITEURL = ""
|
SITEURL = ""
|
||||||
RELATIVE_URLS = True
|
RELATIVE_URLS = True
|
||||||
|
|
||||||
|
|
|
@ -65,8 +65,7 @@ class WorklogPreprocessor(Preprocessor):
|
||||||
happiness,
|
happiness,
|
||||||
) = match.groups()
|
) = match.groups()
|
||||||
|
|
||||||
volunteer_hours = int(
|
volunteer_hours = int(volunteer_hours) if volunteer_hours else 0
|
||||||
volunteer_hours) if volunteer_hours else 0
|
|
||||||
payed_hours = int(payed_hours)
|
payed_hours = int(payed_hours)
|
||||||
happiness = int(happiness)
|
happiness = int(happiness)
|
||||||
date = datetime.strptime(f"{day} {month} {year}", "%d %B %Y")
|
date = datetime.strptime(f"{day} {month} {year}", "%d %B %Y")
|
||||||
|
@ -76,8 +75,8 @@ class WorklogPreprocessor(Preprocessor):
|
||||||
"happiness": happiness,
|
"happiness": happiness,
|
||||||
}
|
}
|
||||||
current_date = date.strftime("%Y/%m")
|
current_date = date.strftime("%Y/%m")
|
||||||
self.monthly_hours[current_date]['payed'] += payed_hours
|
self.monthly_hours[current_date]["payed"] += payed_hours
|
||||||
self.monthly_hours[current_date]['volunteered'] += volunteer_hours
|
self.monthly_hours[current_date]["volunteered"] += volunteer_hours
|
||||||
displayed_date = date.strftime("%A %d %B %Y")
|
displayed_date = date.strftime("%A %d %B %Y")
|
||||||
|
|
||||||
# Replace the line with just the date
|
# Replace the line with just the date
|
||||||
|
@ -93,8 +92,7 @@ class WorklogPreprocessor(Preprocessor):
|
||||||
This is run once, after everything has been parsed
|
This is run once, after everything has been parsed
|
||||||
"""
|
"""
|
||||||
payed_hours = sum([item["payed_hours"] for item in self.data.values()])
|
payed_hours = sum([item["payed_hours"] for item in self.data.values()])
|
||||||
volunteer_hours = sum([item["volunteer_hours"]
|
volunteer_hours = sum([item["volunteer_hours"] for item in self.data.values()])
|
||||||
for item in self.data.values()])
|
|
||||||
|
|
||||||
data = dict(
|
data = dict(
|
||||||
data=self.data,
|
data=self.data,
|
||||||
|
@ -122,10 +120,10 @@ class SimpleReader(MarkdownReader):
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(SimpleReader, self).__init__(*args, **kwargs)
|
super(SimpleReader, self).__init__(*args, **kwargs)
|
||||||
self.settings["MARKDOWN"]["extensions"].append(
|
self.settings["MARKDOWN"]["extensions"].append("markdown.extensions.toc")
|
||||||
"markdown.extensions.toc")
|
|
||||||
self.settings["MARKDOWN"]["extension_configs"].update(
|
self.settings["MARKDOWN"]["extension_configs"].update(
|
||||||
{'markdown.extensions.toc': {'toc_depth': 3}})
|
{"markdown.extensions.toc": {"toc_depth": 3}}
|
||||||
|
)
|
||||||
|
|
||||||
def read(self, source_path):
|
def read(self, source_path):
|
||||||
self._source_path = source_path
|
self._source_path = source_path
|
||||||
|
@ -168,8 +166,7 @@ class SimpleReader(MarkdownReader):
|
||||||
|
|
||||||
if "slug" not in metadata:
|
if "slug" not in metadata:
|
||||||
metadata["slug"] = slugify(
|
metadata["slug"] = slugify(
|
||||||
metadata["title"], self.settings.get(
|
metadata["title"], self.settings.get("SLUG_REGEX_SUBSTITUTIONS", [])
|
||||||
"SLUG_REGEX_SUBSTITUTIONS", [])
|
|
||||||
)
|
)
|
||||||
|
|
||||||
category = os.path.basename(
|
category = os.path.basename(
|
||||||
|
|
Loading…
Reference in a new issue