mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 11:32:39 +02:00
Update theme, weeknotes 18
This commit is contained in:
parent
5cabe5f547
commit
a7150d346b
22 changed files with 428 additions and 230 deletions
24
content/code/2024-02-22-django-urls.md
Normal file
24
content/code/2024-02-22-django-urls.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
title: Using uuids in URLs in a Django app
|
||||
tags: django, urls, uuid
|
||||
---
|
||||
|
||||
After adding a regexp for uuids (which are quite hard to regexp for), I
|
||||
discovered that Django [offers path converters](https://docs.djangoproject.com/
|
||||
en/5.0/topics/http/urls/#path-converters), making this a piece of cake.
|
||||
|
||||
I was using old school `re_path` paths in my `urls.py`, but it's possible to
|
||||
replace them with `path`, like this:
|
||||
|
||||
```python
|
||||
url_patterns = (
|
||||
path(
|
||||
"datalayer/<int:map_id>/<uuid:pk>/",
|
||||
views.DataLayerView.as_view(),
|
||||
name="datalayer_view",
|
||||
),
|
||||
)
|
||||
```
|
||||
|
||||
A few default path converters are defined (str, int, slug, uuid, path), but it's
|
||||
also possible to define your own, as specified in the docs.
|
|
@ -5,6 +5,31 @@ template: worklog
|
|||
total_days: 25
|
||||
---
|
||||
|
||||
## Samedi 24 Février 2024 (4h, 5/5)
|
||||
|
||||
J'ai suivi mon envie de creuser sur les CRDT, je sens qu'on est bientôt prêts pour
|
||||
pouvoir avancer sur le sujet, mais je manque d'une bonne compréhension des différentes
|
||||
libs, de ce qu'elles proposent (API), et de comment on va les utiliser.
|
||||
|
||||
J'ai pris l'approche « article » et donc j'ai commencé la rédaction d'un article de
|
||||
comparaison des différentes approches (ce qu'attends NLNet, d'ailleurs). C'est chouette
|
||||
de voir que j'avance petit à petit, et que le chemin pour arriver à destination, même si
|
||||
il n'est pas complètement clair, est au moins visible.
|
||||
|
||||
## Jeudi 22 Février 2024 (10h, 5/5)
|
||||
|
||||
Une bonne grosse journée :-) J'ai avancé sur le changement vers des UUIDs pour
|
||||
les layers, je suis pas encore sur que ce soit la version finale mais ça avance
|
||||
dans la bonne direction. J'ai l'impression que je vais devoir aller voir d'un
|
||||
peu plus près les entrailles de Django et des migrations pour pouvoir récupérer
|
||||
le bon nom des contraintes qui sont générées par l'ORM.
|
||||
|
||||
J'en ai profité pour remettre au gout du jour la PR sur les IDs des features, et
|
||||
pour commencer à travailler sur le problème du `Last-Modified` qui ne peut pas
|
||||
avoir plus d'une requête à la même seconde, ce qui nous cause des soucis.
|
||||
|
||||
C'est chouette de faire quelques pull requests :-)
|
||||
|
||||
## Lundi 19 Février 2024 (8h, 4/5)
|
||||
|
||||
Un bout de temps pour debugger des histoires d'agent ssh qui n'utilise plus la
|
||||
|
|
|
@ -18,7 +18,7 @@ Un super début de semaine, une perte d'énergie puis du temps pour moi et de la
|
|||
- 🫖 Réussir à tenir les jours « off », ne pas culpabiliser de ne pas travailler !
|
||||
- 😸 La « vie après la journée » ! Aller boire un verre en ville en toute simplicité. Se dire qu'on s'apprécie.
|
||||
- 🚅 Organiser le transport et le logement pour les semaines à venir, je prévois d'être en déplacement et de travailler en même temps. Je suis content de l'avoir fait, ça m'enlève un poids.
|
||||
- 🤗 Prendre le temps de clarifier les enjeux relationnels lors de conflits en cours. Je choisis de ne pas rentrer dans une confrontation parce que sens que ce n'est pas le moment idéal pour le groupe…
|
||||
- 🤗 Prendre le temps de clarifier les enjeux relationnels lors de conflits en cours. Je choisis de ne pas rentrer dans une confrontation parce que je sens que ce n'est pas le moment idéal pour le groupe…
|
||||
|
||||
## Des peines 😬
|
||||
|
||||
|
@ -32,8 +32,8 @@ Un super début de semaine, une perte d'énergie puis du temps pour moi et de la
|
|||
|
||||
- 📘 J'ai terminé la lecture de « Le conflit n'est pas une agression » et [j'ai publié quelques notes sur le livre](https://blog.notmyidea.org/le-conflit-nest-pas-une-agression.html). J'apprécie avoir pris le temps de cette lecture éclairante.
|
||||
- 📖 J'ai commencé à lire « Oser la confiance, propos sur l'engagement des dirigeants ». À suivre.
|
||||
- 🎮 J'ai commencé à jouer à [Outer Wilds](https://fr.wikipedia.org/wiki/Outer_Wilds) sur switch, et je n'ai pas vu les heures défiler. J'ai beaucoup aimé le contraste entre le début du jeu dans une ambiance chill-banjo-coucher-de-soleil et mes premières explorations de planètes tout à fait hostiles ou j'avais du mal à faire quoi que ce soit.
|
||||
- 📻 [Quelques](https://www.youtube.com/watch?v=7GFhgv5jfZk&t=825s) [vidéos](https://www.youtube.com/watch?v=3IroC4pHorY&t=397s) pour mieux comprendre le fonctionnement des systèmes NFC.
|
||||
- 🎮 J'ai commencé à jouer à [Outer Wilds](https://fr.wikipedia.org/wiki/Outer_Wilds) sur switch, et je n'ai pas vu les heures défiler. J'ai beaucoup aimé le contraste entre le début du jeu dans une ambiance chill-banjo-couché-de-soleil et mes premières explorations de planètes tout à fait hostiles ou j'avais du mal à faire quoi que ce soit.
|
||||
- 📻 [Quelques](https://www.youtube.com/watch?v=7GFhgv5jfZk&t=825s) [vidéos](https://www.youtube.com/watch?v=3IroC4pHorY&t=397s) pour mieux comprendre le fonctionnement des systèmes NFC, et leurs failles.
|
||||
- ⏯ Vu [Valeurs actuelles : quand la bourgeoisie s'ensauvage](https://www.youtube.com/watch?v=IjSdrg5Bq3w). Toujours très intéressant de voir les dessous des cartes des médias. Je ne connaissais pas cette émission (rhinocéros), je la garde sous le coude (merci Julie !).
|
||||
- 🎵 Découvert [Crystal Castles](https://www.youtube.com/watch?v=SSc7Oxi0wWE), [Tuba Skinny](https://www.youtube.com/watch?v=861jOEqVr4Q), [le dernier album de Sigur Ros](https://www.youtube.com/watch?v=seQGmak5b7s), [le dernier album d'Idles](https://shop.idlesband.com/) (et [chez tiny desk](https://www.youtube.com/watch?v=wMehItNQKAA))
|
||||
|
||||
|
|
100
content/weeknotes/18.md
Normal file
100
content/weeknotes/18.md
Normal file
|
@ -0,0 +1,100 @@
|
|||
---
|
||||
date: 2024-02-25
|
||||
headline: notes hebdo de la semaine
|
||||
projects: umap
|
||||
---
|
||||
# Notes hebdo #18
|
||||
|
||||
## Ce qui s'est passé
|
||||
|
||||
**🗺️ [uMap](https://umap-projet.org)**
|
||||
: J'ai terminé mon expérimentation sur la synchronisation, ça fonctionne en mode « démo » et ça me donne une compréhension du code suffisante pour avancer sur le sujet.
|
||||
: J'ai commencé à discuter avec Aurélie de comment faire pour la partie expérience utilisateur·ice. C'est chouette parce que je connais mal cette partie. Hâte d'avancer la dessus !
|
||||
: J'ai proposé quelques modifications pour ajouter des identifiants uniques, [pour chaque feature](https://github.com/umap-project/umap/pull/1649), et [pour chaque layer](https://github.com/umap-project/umap/pull/1630).
|
||||
: J'ai avancé sur le choix des bibliothèques pour la partie CRDT, plutôt que d'avancer sur un protocole maison comme j'ai pu le faire par le passé. Ce n'est pas encore clair, mais je me donne un cadre d'analyse qui me parait intéressant, et en lien avec ce qu'on avait décidé pour la proposition à NLNet (ce qui me permettra d'être payé)
|
||||
|
||||
🎵 **Musique**
|
||||
: On a travaillé sur la musique du solo de clown d'Emeline, et repris le travail entamé l'année dernière. J'ai fait des changements pour utiliser la vue « session » d'Ableton, pour que la musique s'adapte à son jeu et pas l'inverse.
|
||||
: On a relancé les défis artistiques avec Sam et Sim: on se donne des contraintes et on réalise une musique avec. [J'ai passé un bon moment](https://soundcloud.com/the-lost-triangle/du-souffle), reggae style :-)
|
||||
: Je continue la fanfare et c'est toujours aussi plaisant. Avoir le temps de travailler avant les répétions, c'est génial.
|
||||
|
||||
🧰 **Réparations, etc**
|
||||
: J'ai prolongé la durée de vie d'un macbook pro 7,1 (de 2011) grâce au travail de [Open Core Legacy Patcher](https://dortania.github.io/OpenCore-Legacy-Patcher/) et cette [liste de conseils](https://gist.github.com/wolfiediscord/d02d5d30898c8cacd6b5c1ab83af95b9#Discord-Servers-for-Support)
|
||||
: J'ai profité du travail pour le clown d'Emeline pour faire remarcher un vieux launchpad, dans l'espoir qu'il permette de ne pas être rivé à l'écran en cadre « live »
|
||||
## Des joies 🤗
|
||||
|
||||
- Discuter méthodologie avec Aurélie, pour savoir comment intégrer la fonctionnalité de collaboration dans uMap. Content de m'éloigner un instant de la technique pour essayer d'avoir un regard un plus global sur ce que j'essaye de faire.
|
||||
- Prendre du plaisir à travailler sur des aspects techniques pour uMap.
|
||||
- Faire plusieurs sessions de *pair programming* et de discussions avec différentes personnes dans la même journée.
|
||||
- Proposer mon aide de manière concrète à des gens qui me l'avaient demandé au fil d'une discussion, et ne m'avaient pas relancés. C'était chouette de m'organiser pour rendre ça possible.
|
||||
- Comprendre mes besoins, proposer une discussion simple pour éviter les malentendus et passer à autre chose une fois le sujet clos.
|
||||
- Reprendre le sport ! C'était bien, même j'ai un peu mal partout.
|
||||
- Me réserver du temps personnel pour lire, jouer et accepter que c'est ce dont j'ai besoin.
|
||||
- Je continue d'adorer aller au brass band. Quel plaisir de retrouver un espace de jeu musical, en toute bienveillance.
|
||||
- Réussir à dépasser un petit conflit en mettant fin à la discussion après plusieurs tentatives pour clarifier mon besoin.
|
||||
- Lire la nuit, prendre des notes et avoir le temps de dormir le lendemain matin. #oiseaudenuit
|
||||
|
||||
## Des peines 😬
|
||||
|
||||
- J'aurais aimé avoir plus de temps pour avancer en pair avec les collègues. J'aimerai trouver des créneaux qui sont plus propices au travail un peu suivi. Trouver le rythme n'est pas toujours évident à deux jours par semaine sur uMap.
|
||||
- Je me sens parfois perdre mes moyens quand je travaille en pair, j'aimerai mieux comprendre ce qui se passe chez moi, et que le regard de l'autre prenne moins de place pour arriver sur des échanges plus sereins et fluides.
|
||||
|
||||
## Vu, Lu, etc
|
||||
|
||||
- 🍿 Vu « La crise » de Coline Serreau, avec au moins [deux](https://www.youtube.com/watch?v=YxwWFIkXcuA) [extraits](https://www.youtube.com/watch?v=rIP7e0IZL9I) mémorables.
|
||||
- 🍿 Vu « Sans jamais nous connaitre », avec Andrew Scott et Paul Mescal. Malgré quelques longueurs j'ai trouvé le film intéressant, beaucoup de tendresse et d'amour. Beaucoup de tristesse aussi.
|
||||
- ⏯ [Sortir du capitalisme, mode d'emploi, sur blast](https://www.youtube.com/watch?app=desktop&v=PrWDrTLB7fU&feature=youtu.be) avec des modèles économiques alternatifs. Le premier modèle concerne une approche à travers l'investissement, et comment cet investissement pourraient être géré de manière démocratique plutôt que d'être laissé à la « main invisible du marché ». Je suis un peu triste de ne pas voir le sujet de la prise de décision plus creusé, ça me semble être un point crucial laissé pour le moment en attente. L'interviewé s'en sort avec une galipette en disant que c'est parce que les gens n'ont jamais tenté d'utiliser ça, et qu'en pratique c'est très simple, et j'avoue avoir un autre rapport au sujet.
|
||||
- ⏯ [Une conférence sur Garage](https://fosdem.org/2024/schedule/event/fosdem-2024-3009-advances-in-garage-the-low-tech-storage-platform-for-geo-distributed-clusters/), de [deuxfleurs](https://deuxfleurs.fr), un outil pour faciliter le stockage de données de manière décentralisée. Ça donne vraiment envie d'essayer de mettre en place quelque chose de similaire !
|
||||
- 🎧 [Les pieds sur terre, Hacking Sauvage](https://www.radiofrance.fr/franceculture/podcasts/les-pieds-sur-terre/hacking-sauvage-7643861), un épisode qui parle de harcèlement numérique. Assez dingue et révoltant.
|
||||
- 🎧 [K.O. pour le véganisme ? - Valéry Giroux (Épisode spécial)](https://www.youtube.com/watch?v=BgC68CR1qN4), un épisode de podcast qui vient parler de l'anti spécisme du point de vue philosophique.
|
||||
- 🎵Redécouvert [HERMIA & CECCALDI & DARRIFOURCQ](https://babel-label.bandcamp.com/track/ho-chi-minh) avec leur album de free jazz « God at the casino ». Génial.
|
||||
- 🎵Découvert [Craven Faults](https://www.youtube.com/watch?v=KRT-tIn9yeE), de la musique ambiant progressive qui me rappelle [des vibes de Archive / Lights](https://www.youtube.com/watch?v=yLuOzNeHw5I). Si vous êtes en recherche de concentration et que vous aimez la répétition, en voici 26 minutes.
|
||||
- 📖 J'ai continué « Oser la confiance »
|
||||
|
||||
## Notes
|
||||
|
||||
### Le principe de Shirky
|
||||
|
||||
Je découvre via Jan Wildeboer [le « principe de Shirky »](https://effectiviology.com/shirky-principle/):
|
||||
|
||||
> The _Shirky principle_ is the adage that “institutions will try to preserve the problem to which they are the solution”. More broadly, it can also be characterized as the adage that “every entity tends to prolong the problem it is solving”.
|
||||
|
||||
Je trouve ça intéressant de comparer ça à l'« homéostasie » (merci Thomas):
|
||||
|
||||
> En biologie et en systémique, l’homéostasie est un phénomène par lequel un facteur clé (par exemple, la température) est maintenu autour d'une valeur bénéfique pour le système considéré, grâce à un processus de régulation.
|
||||
>
|
||||
> – [Wikipedia](https://fr.wikipedia.org/wiki/Hom%C3%A9ostasie)
|
||||
|
||||
### Bluesky & Mastodon
|
||||
|
||||
> - **Composable moderation:** Moderation on Bluesky is not tied to your server, like it is on Mastodon. Defederation, a way of addressing moderation issues in Mastodon by disconnecting servers, is not as relevant on Bluesky because there are other layers to the system. Server operators can set rules for what content they will host, but tools like blocklists and moderation services are what help communities self-organize around moderation preferences. We’ve already integrated block and mute lists, and the tooling for independent moderation services is coming soon.
|
||||
> - **Composable feeds:** We designed your timeline on Bluesky so that it’s not tied to your server. Anyone can build a feed, and there are currently over 40,000 algorithmic feeds to choose from. Your Mastodon timeline is only made up of posts from accounts you follow, and does not pull together posts from the whole network like Bluesky’s custom feeds.
|
||||
> - **Account portability:** We designed federated hosting on Bluesky so that you can move servers easily. Moving hosting services should be like changing your cell phone provider — you should be able to keep your identity and data. Changing servers on Bluesky doesn’t disrupt your username, friends, or posts.
|
||||
>
|
||||
> — https://bsky.social/about/blog/02-22-2024-open-social-web
|
||||
|
||||
Je ne voulais pas regarder du côté de Bluesky tant que les promesses (de fédération) n'étaient pas concrètes. Je suis content de voir que c'est fédéré, open source, et que ça réponds à certains besoins de la communauté d'une manière différente.
|
||||
|
||||
Plusieurs retours me font mieux comprendre ce que Mastodon permet et terme de protection et de soin des usagers.
|
||||
|
||||
Un retour intéressant:
|
||||
|
||||
> As someone who belongs to several identities which are often the target of hate, **I do not actually want a global conversation, or moderation services that let me block users or content.**
|
||||
> *I do not want to be on the same network as the people who hate me.*
|
||||
> "Global conversation" is great for some people. It's really bad for others.
|
||||
>
|
||||
> https://mastodon.social/@tess/111977331532402530
|
||||
|
||||
Bluesky travaille plutôt à rendre des espaces publics et fédérés, sans prendre en compte les aspects de différente visibilité des messages.
|
||||
|
||||
C'est ce qui semble ressortir [dans leur FAQ](https://bsky.social/about/blog/5-19-2023-user-faq).
|
||||
|
||||
> Bluesky is a public social network. Think of your posts as blog posts – **anyone on the web can see them**, even those without an invite code.
|
||||
> [...]
|
||||
> Specifically:
|
||||
> - **Posts and likes are public.**
|
||||
> **- Blocks are public.**
|
||||
> - Mutes are private, but mutelists are public lists. Your mutelist subscriptions are private.
|
||||
> - Invites and invite trees are private.
|
||||
|
||||
Je n'arrive pas encore à y voir clair sur l'approche prise par Bluesky concernant la modération. Est-ce que c'est remettre à l'utilisateur les clés de la modération (avec la charge émotionnelle et politique qui va avec) ? A suivre.
|
|
@ -13,7 +13,7 @@
|
|||
:root {
|
||||
--main-bg-color: #ffffff;
|
||||
--border-color: #ACACAC;
|
||||
--code-bg-color: #e5e5e2;
|
||||
--code-bg-color: #f6f6f6;
|
||||
--quote-bg-color: #f6f6f6;
|
||||
--link-color: #BB7DD4;
|
||||
--text-color: #2d2d2d;
|
||||
|
@ -196,7 +196,6 @@ a {
|
|||
color: inherit;
|
||||
text-decoration-color: var(--link-color);
|
||||
text-decoration-thickness: 3px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
|
@ -253,7 +252,6 @@ header a {
|
|||
|
||||
header h1 {
|
||||
margin-bottom: 30px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
|
||||
|
@ -329,6 +327,14 @@ section.index h1 {
|
|||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
p code {
|
||||
font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
|
||||
background: var(--code-bg-color);
|
||||
padding: 2px 4px;
|
||||
font-size: .9em;
|
||||
line-height: 1;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.note {
|
||||
background: var(--code-bg-color);
|
||||
|
@ -480,4 +486,4 @@ dd {
|
|||
font-size: 1em;
|
||||
display: inline;
|
||||
float: left;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,5 +7,6 @@
|
|||
try {
|
||||
var pageTracker = _gat._getTracker("{{GOOGLE_ANALYTICS}}");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}</script>
|
||||
{% endif %}
|
||||
} catch(err) {}
|
||||
</script>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<header>
|
||||
<h1>Archives</h1>
|
||||
</header>
|
||||
<section id="content" class="body">
|
||||
<dl>
|
||||
{% for year, articles in dates | groupby("date.year") | reverse %}
|
||||
<dt>{{ year }}</dt>
|
||||
{% for article in articles %}
|
||||
<dd><a href='{{ SITEURL }}/{{ article.url }}'>{{ article.title }}</a></dd>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</dl>
|
||||
</section>
|
||||
<header>
|
||||
<h1>Archives</h1>
|
||||
</header>
|
||||
<section id="content" class="body">
|
||||
<dl>
|
||||
{% for year, articles in dates | groupby("date.year") | reverse %}
|
||||
<dt>{{ year }}</dt>
|
||||
{% for article in articles %}
|
||||
<dd>
|
||||
<a href='{{ SITEURL }}/{{ article.url }}'>{{ article.title }}</a>
|
||||
</dd>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</dl>
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,38 +1,44 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}{{ article.title }} - {{ super() }}{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<header>
|
||||
{% if article.category == "Lectures" %}
|
||||
{% if article.category == "Lectures" and article.isbn_cover %}
|
||||
<div class="book-cover">
|
||||
<img src="{{SITEURL}}/{{article.isbn_cover}}" />
|
||||
</div>
|
||||
{% endif %}
|
||||
<h1 class="post-title">{{ article.title }}<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>
|
||||
{% else %}
|
||||
<h1 class="post-title">{{ article.title }}</h1>
|
||||
{% if article.headline %}
|
||||
<p><em>{{ article.headline }}</em></p>
|
||||
{% endif %}
|
||||
<time datetime="{{ article.date.isoformat() }}">{{ article.locale_date }}</time>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<header>
|
||||
{% if article.category == "Lectures" %}
|
||||
{% if article.category == "Lectures" and article.isbn_cover %}
|
||||
<div class="book-cover">
|
||||
<img src="{{ SITEURL }}/{{ article.isbn_cover }}" />
|
||||
</div>
|
||||
{% endif %}
|
||||
<h1 class="post-title">
|
||||
{{ article.title }}<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>
|
||||
{% else %}
|
||||
<h1 class="post-title">{{ article.title }}</h1>
|
||||
{% if article.headline %}
|
||||
<p>
|
||||
<em>{{ article.headline }}</em>
|
||||
</p>
|
||||
{% endif %}
|
||||
<time datetime="{{ article.date.isoformat() }}">{{ article.locale_date }}</time>
|
||||
{% endif %}
|
||||
</header>
|
||||
<article>
|
||||
{{ article.content }}
|
||||
{% 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 %}
|
||||
{% 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 %}
|
||||
</article>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<dl id="categories">
|
||||
{% for category, articles in categories %}
|
||||
{% if category in CATEGORIES_DESCRIPTION.keys() %}
|
||||
<dt><h2><a href="/{{category.slug}}/">{{ CATEGORIES_DESCRIPTION[category][0] }}</a></h2></dt>
|
||||
<dd>{{ CATEGORIES_DESCRIPTION[category][1] }}. {{ articles | length }} articles.</dd>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</dl>
|
||||
|
||||
|
||||
<dl id="categories">
|
||||
{% for category, articles in categories %}
|
||||
{% if category in CATEGORIES_DESCRIPTION.keys() %}
|
||||
<dt>
|
||||
<h2>
|
||||
<a href="/{{ category.slug }}/">{{ CATEGORIES_DESCRIPTION[category][0] }}</a>
|
||||
</h2>
|
||||
</dt>
|
||||
<dd>
|
||||
{{ CATEGORIES_DESCRIPTION[category][1] }}. {{ articles | length }} articles.
|
||||
</dd>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</dl>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,44 +1,42 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
{% if category in CATEGORIES_DESCRIPTION.keys() %}
|
||||
<h1>{{ CATEGORIES_DESCRIPTION[category][0] }}
|
||||
<a id="feed" href="{{ SITEURL }}/feeds/{{ category.slug }}.atom.xml"><img src="{{ SITEURL }}/theme/rss.svg" /></a>
|
||||
</h1>
|
||||
<p>{{ CATEGORIES_DESCRIPTION[category][1] }}</p>
|
||||
{% else %}
|
||||
|
||||
<h1> {{ category }}</h1>
|
||||
{% endif %}
|
||||
<section class="section index">
|
||||
|
||||
{% for article in articles | batch(10) | first %}
|
||||
<section class="section index">
|
||||
{% if not HIDE_DATE %}
|
||||
<time datetime="{{ article.date.isoformat() }}">{{ article.locale_date }}</time>
|
||||
{% endif %}
|
||||
|
||||
<h1><a href="{{ SITEURL }}/{{ article.url }}" id="page-title">{{ article.title }}</a></h1>
|
||||
{% if article.headline %}
|
||||
{{ article.headline }}
|
||||
{% if category in CATEGORIES_DESCRIPTION.keys() %}
|
||||
<h1>
|
||||
{{ CATEGORIES_DESCRIPTION[category][0] }}
|
||||
<a id="feed" href="{{ SITEURL }}/feeds/{{ category.slug }}.atom.xml">
|
||||
<img src="{{ SITEURL }}/theme/rss.svg" />
|
||||
</a>
|
||||
</h1>
|
||||
<p>{{ CATEGORIES_DESCRIPTION[category][1] }}</p>
|
||||
{% else %}
|
||||
{{ article.summary }}
|
||||
<h1>{{ category }}</h1>
|
||||
{% endif %}
|
||||
<br />
|
||||
{% for tag in article.tags %}
|
||||
<a class='tag' href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>{% if not loop.last %}, {% endif %}
|
||||
{% endfor %}
|
||||
</section>
|
||||
{% endfor %}
|
||||
<ul>
|
||||
{% for batch in articles | batch(10) %}
|
||||
{% if not loop.first %}
|
||||
{% for article in batch %}
|
||||
|
||||
<li><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}">{{
|
||||
article.title }}</a></li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</section>
|
||||
{% endblock %}
|
||||
<section class="section index">
|
||||
{% if category != "lectures" %}
|
||||
<ul>
|
||||
{% for year, year_articles in articles | groupby('date.year') | reverse %}
|
||||
<h2>{{ year }}</h2>
|
||||
{% for article in year_articles %}
|
||||
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title">{{ article.title}}</a>,
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
{% for article in articles %}
|
||||
<div class="book">
|
||||
{% if article.category == "Lectures" and article.isbn_cover %}
|
||||
<div class="book-cover">
|
||||
<img src="{{ SITEURL }}/{{ article.isbn_cover }}" />
|
||||
</div>
|
||||
{% endif %}
|
||||
<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>
|
||||
<hr />
|
||||
{% endfor %}
|
||||
</section>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{% if DISQUS_SITENAME %}
|
||||
<hr>
|
||||
<div id="disqus_thread"></div>
|
||||
<script>
|
||||
<hr>
|
||||
<div id="disqus_thread"></div>
|
||||
<script>
|
||||
var disqus_config = function() {
|
||||
this.page.url = '{{ SITEURL }}/{{ output_file }}';
|
||||
this.page.identifier = '{{ article.slug }}';
|
||||
|
@ -13,8 +13,8 @@
|
|||
s.setAttribute('data-timestamp', +new Date());
|
||||
(d.head || d.body).appendChild(s);
|
||||
})();
|
||||
</script>
|
||||
<noscript class="text-muted">
|
||||
Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a>
|
||||
</noscript>
|
||||
</script>
|
||||
<noscript class="text-muted">
|
||||
Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a>
|
||||
</noscript>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{% if DISQUS_SITENAME %}
|
||||
<script type="text/javascript">
|
||||
<script type="text/javascript">
|
||||
var disqus_shortname = '{{ DISQUS_SITENAME }}';
|
||||
(function () {
|
||||
var s = document.createElement('script'); s.async = true;
|
||||
|
@ -7,5 +7,5 @@
|
|||
s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';
|
||||
(document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
|
||||
}());
|
||||
</script>
|
||||
</script>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,9 +1,19 @@
|
|||
{% if GITHUB_URL %}
|
||||
<a href="{{ GITHUB_URL }}">
|
||||
{% if GITHUB_POSITION != "left" %}
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub" />
|
||||
{% else %}
|
||||
<img style="position: absolute; top: 0; left: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_left_white_ffffff.png" alt="Fork me on GitHub" />
|
||||
{% endif %}
|
||||
</a>
|
||||
<a href="{{ GITHUB_URL }}">
|
||||
{% if GITHUB_POSITION != "left" %}
|
||||
<img style="position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
border: 0"
|
||||
src="http://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png"
|
||||
alt="Fork me on GitHub" />
|
||||
{% else %}
|
||||
<img style="position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
border: 0"
|
||||
src="http://s3.amazonaws.com/github/ribbons/forkme_left_white_ffffff.png"
|
||||
alt="Fork me on GitHub" />
|
||||
{% endif %}
|
||||
</a>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,30 +1,36 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<h1>{% block pagetitle %}{% endblock %}</h1>
|
||||
{% if articles %}
|
||||
{% for article in articles | rejectattr("category", "in", ['weeknotes']) | batch(10) | first %}
|
||||
<section class="section index">
|
||||
{% if not HIDE_DATE %}
|
||||
<time datetime="{{ article.date.isoformat() }}">{{ article.locale_date }}</time>
|
||||
{% endif %}
|
||||
|
||||
{% for tag in article.tags %}
|
||||
<a class='tag' href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>{% if not loop.last %}, {% endif %}
|
||||
{% endfor %}
|
||||
<h1><a href="{{ SITEURL }}/{{ article.url }}" id="page-title">{{ article.title }}</a></h1>
|
||||
{% if article.headline %}
|
||||
{{ article.headline }}
|
||||
{% else %}
|
||||
{{ article.summary }}
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endfor %}
|
||||
<ul>
|
||||
{% for article in articles[10:] %}
|
||||
<li><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}">{{
|
||||
article.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</section>
|
||||
<h1>
|
||||
{% block pagetitle %}{% endblock %}
|
||||
</h1>
|
||||
{% if articles %}
|
||||
{% for article in articles | rejectattr("category", "in", ['weeknotes']) | batch(10) | first %}
|
||||
<section class="section index">
|
||||
{% if not HIDE_DATE %}<time datetime="{{ article.date.isoformat() }}">{{ article.locale_date }}</time>{% endif %}
|
||||
{% for tag in article.tags %}
|
||||
<a class='tag' href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>
|
||||
{% if not loop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
<h1>
|
||||
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title">{{ article.title }}</a>
|
||||
</h1>
|
||||
{% if article.headline %}
|
||||
{{ article.headline }}
|
||||
{% else %}
|
||||
{{ article.summary }}
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endfor %}
|
||||
<ul>
|
||||
{% for article in articles[10:] %}
|
||||
<li>
|
||||
<a href="{{ SITEURL }}/{{ article.url }}"
|
||||
rel="bookmark"
|
||||
title="Permalink to {{ article.title|striptags }}">{{
|
||||
article.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</section>
|
||||
{% endif %}
|
||||
{% endblock content %}
|
||||
{% endblock content %}
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}{{ page.title }} - {{ super() }}{% endblock %}
|
||||
{% block content %}
|
||||
<header>
|
||||
</header>
|
||||
<article>
|
||||
{{ page.content }}
|
||||
</article>
|
||||
<header>
|
||||
</header>
|
||||
<article>{{ page.content }}</article>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
{% if DEFAULT_PAGINATION %}
|
||||
<p class="paginator">
|
||||
{% if articles_page.has_previous() %}
|
||||
{% if articles_page.previous_page_number() == 1 %}
|
||||
<a href="{{ SITEURL }}/{{ page_name }}.html">«</a>
|
||||
{% else %}
|
||||
<a href="{{ SITEURL }}/{{ page_name }}{{ articles_page.previous_page_number() }}.html">«</a>
|
||||
<p class="paginator">
|
||||
{% if articles_page.has_previous() %}
|
||||
{% if articles_page.previous_page_number() == 1 %}
|
||||
<a href="{{ SITEURL }}/{{ page_name }}.html">«</a>
|
||||
{% else %}
|
||||
<a href="{{ SITEURL }}/{{ page_name }}{{ articles_page.previous_page_number() }}.html">«</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
Page {{ articles_page.number }} / {{ articles_paginator.num_pages }}
|
||||
{% if articles_page.has_next() %}
|
||||
<a href="{{ SITEURL }}/{{ page_name }}{{ articles_page.next_page_number() }}.html">»</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
Page {{ articles_page.number }} / {{ articles_paginator.num_pages }}
|
||||
{% if articles_page.has_next() %}
|
||||
<a href="{{ SITEURL }}/{{ page_name }}{{ articles_page.next_page_number() }}.html">»</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
|
|
@ -6,11 +6,19 @@
|
|||
var pkBaseURL = (("https:" == document.location.protocol) ? "https://{{ PIWIK_URL }}/" : "http://{{ PIWIK_URL }}/");
|
||||
{% endif %}
|
||||
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script><script type="text/javascript">
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
try {
|
||||
var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", {{ PIWIK_SITE_ID }});
|
||||
piwikTracker.trackPageView();
|
||||
piwikTracker.enableLinkTracking();
|
||||
} catch( err ) {}
|
||||
</script><noscript><p><img src="http://{{ PIWIK_URL }}/piwik.php?idsite={{ PIWIK_SITE_ID }}" style="border:0" alt="" /></p></noscript>
|
||||
{% endif %}
|
||||
</script>
|
||||
<noscript>
|
||||
<p>
|
||||
<img src="http://{{ PIWIK_URL }}/piwik.php?idsite={{ PIWIK_SITE_ID }}"
|
||||
style="border:0"
|
||||
alt="" />
|
||||
</p>
|
||||
</noscript>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,2 +1,11 @@
|
|||
{% if article.tags %}<p>tags: {% for tag in article.tags %}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>{% endfor %}</p>{% endif %}
|
||||
{% if PDF_PROCESSOR %}<p><a href="{{ SITEURL }}/pdf/{{ article.slug }}.pdf">get the pdf</a></p>{% endif %}
|
||||
{% if article.tags %}
|
||||
<p>
|
||||
tags:
|
||||
{% for tag in article.tags %}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>{% endfor %}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if PDF_PROCESSOR %}
|
||||
<p>
|
||||
<a href="{{ SITEURL }}/pdf/{{ article.slug }}.pdf">get the pdf</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<p>Voici une liste de tous les tags utilisés sur ce site :</p>
|
||||
<ul>
|
||||
|
||||
{% for tag, articles in tags|sort(attribute='articles|length', reverse=true) %}
|
||||
<a data-size="{% if articles | length > 1 %}{{articles | length }}{% endif %}" href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<p>Voici une liste de tous les tags utilisés sur ce site :</p>
|
||||
<ul>
|
||||
{% for tag, articles in tags|sort(attribute='articles|length', reverse=true) %}
|
||||
<a data-size="{% if articles | length > 1 %}{{ articles | length }}{% endif %}"
|
||||
href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{% if article.translations %}
|
||||
Translations:
|
||||
Translations:
|
||||
{% for translation in article.translations %}
|
||||
<a href="{{ SITEURL }}/{{ translation.url }}">{{ translation.lang }}</a>
|
||||
{% endfor %}
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
{% if TWITTER_USERNAME %}
|
||||
<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-via="{{TWITTER_USERNAME}}">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
|
||||
{% endif %}
|
||||
<a href="http://twitter.com/share"
|
||||
class="twitter-share-button"
|
||||
data-count="horizontal"
|
||||
data-via="{{ TWITTER_USERNAME }}">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,57 +1,57 @@
|
|||
{% extends "page.html" %}
|
||||
{% block extra_head %}
|
||||
<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-embed@6"></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-embed@6"></script>
|
||||
{% 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 rémunérées</li>
|
||||
<li>{{ page.metadata.worklog['volunteer_hours'] }}h bénévoles</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Mois</td>
|
||||
<td>Heures</td>
|
||||
<td>Jours</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for month, amount in page.metadata.worklog.payed_monthly.items() %}
|
||||
<tr>
|
||||
<td>{{ month }}</td>
|
||||
<td>{{ amount }}</td>
|
||||
<td>{{ (amount / 7.0) | round(1) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</details>
|
||||
</header>
|
||||
<article>
|
||||
<div id="vis"></div>
|
||||
{{ page.content }}
|
||||
</article>
|
||||
<script>
|
||||
<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 rémunérées</li>
|
||||
<li>{{ page.metadata.worklog['volunteer_hours'] }}h bénévoles</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Mois</td>
|
||||
<td>Heures</td>
|
||||
<td>Jours</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for month, amount in page.metadata.worklog.payed_monthly.items() %}
|
||||
<tr>
|
||||
<td>{{ month }}</td>
|
||||
<td>{{ amount }}</td>
|
||||
<td>{{ (amount / 7.0) | round(1) }}</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,
|
||||
|
@ -94,5 +94,5 @@
|
|||
// result.view provides access to the Vega View API
|
||||
.then(result => console.log(result))
|
||||
.catch(console.warn);
|
||||
</script>
|
||||
</script>
|
||||
{% endblock content %}
|
||||
|
|
Loading…
Reference in a new issue