Update of the blog!

This commit is contained in:
Alexis Métaireau 2021-01-15 23:10:37 +01:00
parent 9f9e98c887
commit 592f4d8c76
63 changed files with 839 additions and 65 deletions

View file

@ -7,7 +7,7 @@ CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
VENV := $(shell echo $${VIRTUAL_ENV-$(shell pwd)/.venv})
VIRTUALENV = virtualenv -p /usr/bin/python3.7
VIRTUALENV = python3 -m venv
INSTALL_STAMP = $(VENV)/.install.stamp
PYTHON=$(VENV)/bin/python

View file

@ -0,0 +1,79 @@
---
title: Artfevre 2020 - Défi artistique en février
---
En Février, il y a 29 Jours, et avec un ami on s'est dit qu'on aimerait bien utiliser chacun d'entre eux pour créer — de manière intensive et sans jugement — hors de notre zone de confort, et avec des contraintes imposées.
L'idée, c'est qu'à la fin du mois, chacun⋅e puisse se retourner (c'est une image hein) et se dire : « Ouah, jai fait tout ça !? »
Cest donc une une liste de 29 thèmes (un par jour du mois) : chaque jour, on doit faire quelque chose dartistique à partir du thème proposé.
## Quelques retours
Je n'ai pas réussi à faire des créations pour les 29 thèmes, mais dans l'ensemble je suis très content de ce que j'ai pu créer : j'ai pu expérimenter des choses que je n'avais pas imaginées. J'ai pu faire :
- Du montage vidéo ;
- De la musique acoustique ;
- De la musique électronique ;
- Du montage audio ;
- De l'écriture de nouvelles ;
- Une comptine ;
- De la photo ;
- Du montage photo ;
- De l'Art Plastique ;
C'était très sympa de voir les créations des unes et des uns arriver sur notre espace de partage de fichiers, certaines créations étaient vraiment géniales ! Et j'ai même carrément hâte de remettre ça l'an prochain :-)
## Un peu plus d'infos
Voici des infos qu'on a envoyé aux participant⋅e⋅s, et que je consigne ici question de l'avoir quelque part
Voici une liste d'idées de « trucs » à faire chaque jour : Faire un dessin, Composer (et enregistrer ?) une musique, Filmer quelque chose, Inventer une chorégraphie, Écrire un texte, Inventer une origami, Se faire un tatouage (en fonction du thème, pas conseillé), Inventer un exercice de théâtre, Créer un jeu, Faire une sculpture dargile, Créer une position de Yoga, Prendre une photo, inventer une recette de cuisine, Écrire un slam, etc, etc.
Vous pouvez décider de ne choisir quune forme artistique (par exemple que la musique) pour vous forcer à explorer un médium en dehors de votre zone de confort (« je sais faire une musique rapidement, mais sais-je faire 29 fois une musique différente rapidement ? »), ou alors changer dexpression artistique tous les jours. Voyez ce qui vous amuse / anime le plus !
On aimerait mettre en commun nos productions quelque part, pour voir comment les gens différents se sont approprié un même thème ! Bien sur c'est tout à fait optionnel : libre à vous de participer sans publier vos créations.
Ça vous botte ? Envoyez nous un petit mail a artfevre@notmyidea.org et on vous tient au courant !
Techniquement ?
Si vous voulez poster vos créations, on vous propose de le faire sur un espace en ligne. Plusieurs choses sur ce « cloud » :
- On a préparé un dossier par jour, postez votre / vos création(s) dans le dossier qui va bien. Il y a également un dossier « Les thèmes & ressources » qui contient les photos, vidéos et musiques qui serviront de contraintes certains jours, ainsi qu'un rappel des thèmes ;
- On a aucun moyen de savoir qui poste quoi, si vous voulez être crédités, mettez votre pseudo / nom dans le nom du fichier (ex. « Sam-3-fevrier.jpg » ou « AlexCompo7Fevrier.mp3 »). Si vous préférez l'ombre à la lumière, vous pouvez laisser un titre poétique comme «W33.jpg » ;
- Ne repostez pas les contenus d'autres participant⋅es (d'aucun diraient « d'autrui ») sans leur accord ;
Pour avoir l'adresse du cloud magique, envoyez nous un mail à artfevre@notmyidea.org.
## Invitations
Le défi commence le samedi 1er Février, mais il est possible de nous rejoindre en route : si vous voulez en parler à des ami⋅e⋅s, n'hésitez pas !
Donnez leur l'adresse du site web : https://artfevre.notmyidea.org
## Rappels
Pas de pression : Amusons-nous, l'idée est de passer de bons moments
- Je ne veux faire qu'une seule semaine ? Pas de soucis !
- J'ai pas envie de poser mes publications en public… No problem !
- J'ai loupé trois jours, c'est la merde ! Hakuna Matata !
- J'ai envie de faire un thème à plusieurs ! No problemo !
Personne d'autre que vous ne juge ce que vous faites ! Et… à propos de ça, même vous d'ailleurs n'y êtes pas obligés.
## Des questions ? Des réponses !
### Jai envie de le faire, mais je suis trop perfectionniste pour finir un truc par jour !
Cest tout le sens du projet ! Si je dois finir cette chanson/ce dessin/ce texte aujourdhui, ça ne sera peut-être pas le meilleur des dessins, mais au moins il aura le mérite dexister. Dans mon expérience personnelle, si jattends davoir produit le meilleur objet, je finis par ne rien finir, car rien nest parfait. Là, au moins, lobjet existe, et si vous le souhaitez, il peut servir de base plus tard à un re-travail pour viser quelque chose de plus « fignolé ».
### Mais si je rate un jour, si jai pas le temps ?
Chacun⋅e fait comme iel veut/peut et sastreint la discipline quiel a envie de tester ! Personne ne viendra surveiller ou juger le travail des autres. Si vous prenez 2 jours par thème et que vous continuez le truc jusquà fin mars pour finir, pas de soucis !
### Jai peur de pas avoir linspiration !
Pour nous, attendre linspiration est un prétexte qu'on se donne pour repousser le moment de se mettre au travail. Linspiration, ça se provoque, ça ne sattend pas. Et puis peut-être que je trouverai nulle ma création du jour, mais au moins jaurai fait quelque chose. 1 vaut mieux que 0. Et de ce truc que moi je trouve nul (cest pas pour ça que cest nul, à vrai dire), peut-être que j'en tirerai une note que jaime bien, une formulation qui me plaît, un mouvement que jadore, et que je ré-utiliserai après dans une autre création. Ou alors, peut-être que je ne retirerai que la satisfaction de lavoir fait, et cest déjà pas mal !

View file

@ -1,8 +1,6 @@
title: Antisexisme ou antiracisme ? Un faux dilemme
author: Christine Delphy
tags: sexisme
voile
racisme
tags: sexisme, voile, racisme
link: https://www.cairn.info/revue-nouvelles-questions-feministes-2006-1-page-59.htm
read_on: Septembre 2019

View file

@ -1,8 +1,7 @@
title: Comment la non-violence protège l'état
headline: Essai sur l'inefficacité des mouvements sociaux
author: Peter Gelderloos
tags: non-violence
critique
tags: non-violence, anarchisme
isbn: 978-2-9556782-4-4
image: https://www.editionslibre.org/wp-content/uploads/2018/02/siteinternet4.png
read_on: Juin 2019

View file

@ -1,7 +1,6 @@
title: Hommes Anarchistes face au féminisme
author: Françis Dupuis-Déri
tags: féminisme
anarchisme
tags: féminisme, anarchisme
headline: Pistes de réflexion au sujet de la politique, de l'amour et de la sexualité
read_on: Septembre 2019
link: https://refractions.plusloin.org/IMG/pdf/2412_1_.pdf

View file

@ -18,7 +18,7 @@ read_on: Janvier 2020
## Penser ensemble l'émancipation
> L'objectif de changer le sort de toutes les femmes semble s'être perdu en route quand le féminisme n'est plus décrit par certaines camarades que comme un outil pour être « à l'aise avec [s]on identité de genre ». Ainsi une oppression ne serait problématique que parce qu'elle crée du malaise, pas quand elle est si bien intégrée qu'elle en paraît naturelle. Ce féminisme ne s'adresse plus à toutes les femmes mais à celles qui sauront s'en saisir dans leur parcours de vie. Le mouvement qui donnait une importance nouvelle au personnel pour changer le politique laisse apparaître parfois de manière marginale, parfois de manière plus prégnante, une entreprise émancipatrice individuelle ou à la dimension collective réduite, attentive aux parcours et identités des personnes qui l'investissent.
> L'objectif de changer le sort de toutes les femmes semble s'être perdu en route quand le féminisme n'est plus décrit par certaines camarades que comme un outil pour être « à l'aise avec son identité de genre ». Ainsi une oppression ne serait problématique que parce qu'elle crée du malaise, pas quand elle est si bien intégrée qu'elle en paraît naturelle. Ce féminisme ne s'adresse plus à toutes les femmes mais à celles qui sauront s'en saisir dans leur parcours de vie. Le mouvement qui donnait une importance nouvelle au personnel pour changer le politique laisse apparaître parfois de manière marginale, parfois de manière plus prégnante, une entreprise émancipatrice individuelle ou à la dimension collective réduite, attentive aux parcours et identités des personnes qui l'investissent.
> Au lieu de lutter de front contre les assignations de genre, de tenter de les neutraliser — au moins le temps de l'enfance, comme le proposent les féministes pour les écoles suédoises — on va plutôt chercher à les adapter aux besoins individuels et à rendre confortable l'habitude (finalement plus problématique du tout !) de s'adresser à chacun⋅e en fonction de son identité de genre, pourvu qu'elle coïncide avec ses souhaits.

View file

@ -1,10 +0,0 @@
title: Le « mouvement » est mort, Vive… la réforme !
headline: Une critique de la « composition » et de ses élites
author: Un groupuscule Insignifiant
tags: zad
anarchisme
apellisme
read_on: Décembre 2019
status: draft
>

View file

@ -1,7 +1,6 @@
title: L'effondrement, parlons-en...
author: Jérémie Cravatte
tags: écologie
collapsologie
tags: écologie, collapsologie
headline: Les limites de la "collapsologie".
read_on: Octobre 2019
link: http://www.barricade.be/publications/analyses-etudes/effondrement-parlons-limites-collapsologie

View file

@ -1,7 +1,6 @@
title: Refuser d'être un homme
author: John Stolenberg
tags: féminisme
masculinisme
tags: féminisme, masculinisme
headline: Pour en finir avec la virilité
read_on: Octobre 2019
image: https://www.syllepse.net/syllepse_images/produits/refuser_d_etre_un_homme.jpg

View file

@ -1,8 +1,6 @@
title: Rupture anarchiste et trahison pro-féministe
author: Léo Thiers-Vidal
tags: féminisme
anarchisme
masculinismes
tags: féminisme, anarchisme, masculinismes
isbn: 978-2954323701
headline: Écrits et échanges de Léo Thiers-Vidal.
read_on: Août 2019

View file

@ -1,8 +1,7 @@
title: Égologie
headline: Écologie, individualisme et course au bonheur
author: Aude Vidal
tags: écologie
développement-personnel
tags: écologie, développement-personnel
isbn: 979-10-91772-19-8
image: https://products-images.di-static.com/image/aude-vidal-egologie/9791091772198-475x500-1.jpg
read_on: Septembre 2019

View file

@ -40,7 +40,7 @@ Ce second graphique montre les personnes qui se considèrent en recherche d'empl
## Budget de l'assurance chômage
![](/images/chomage/dette-chomage.png)
![Budget dette](/images/chomage/dette-chomage.png)
## Financement de l'assurance chômage

View file

@ -0,0 +1,53 @@
---
title: Forum ouvert, animation et posture
headline: Quelques retours et questionnements sur les postures d'animation au sein des forums ouverts
---
Début Février j'ai participé à un Forum Ouvert. Il s'agit de la troisième fois, et cette fois ci j'étais particulièrement attentif aux procédés mis en place pour sa tenue, puisque je faisais partie de l'équipe d'organisation.
## Un forum ouvert ?
Les forums ouverts sont des outils qui permettent de se retrouver avec un groupe de personnes et d'avoir des échanges. L'idée est de créer un cadre assez léger qui permette aux personnes d'échanger de manière assez horizontale.
Les 4 principes :
- les personnes présentes sont les bonnes personnes ;
- quoi qu'il arrive, c'est la seule chose qui pouvait arriver ;
- ça commence quand ça commence ;
- quand cest fini, cest fini.
La loi de la mobilité ou loi des deux pieds : si à un moment vous vous rendez compte que vous n'être ni en train dapprendre, ni de contribuer, aller voir autre chose !
Retours :
- J'étais hyper surpris de voir à quel point l'outil est fonctionnel en tant que tel : les discussions auxquelles j'ai pu participer étaient souvent assez « poussées » alors même que les personnes ne se connaissaient pas d'avant le forum.
- Durant le forum ouvert, il y avait la possibilité de prendre des notes, et de les partager avec tout le monde dans un espace prévu pour ça. Je n'y croyais pas trop, mais ça à vraiment fonctionné ! On avait préparé des pads en ligne (un espace de prise de notes partagées) avant l'évènement ce qui à permis de faciliter la prise de notes ;
- Avoir un endroit pour afficher les notes prises durant les discussions est utile, et créé un sentiment de satisfaction collectif ;
- Répartition de la parole : à un moment, on propose aux participant⋅e⋅s de venir proposer des sujets, et on s'est rendu compte que c'était (comme bien trop souvent) en grande partie des hommes cis (assignés hommes à la naissance) qui prenaient la parole à ce moment là. Pour éviter que ce ne soit le cas, laisser un temps de réflexion à tou⋅te⋅s avant de prendre la parole peut être utile.
- Inclusion des personnes trans et non-binaires : Faire un tour des pronoms peut permettre aux personnes trans et non-binaires d'être plus incluses, ou en tout cas de visibiliser leur présence. On ne l'avait pas fait lors du premier jour et ça à manqué ;
- Sur un plan plus pragmatique, trouver une logistique pour faire à manger de manière collective / faire le ménage / installer les tables etc, pourrait permettre aux organisateur⋅ice⋅s de participer aux discussions.
- Lors de la phase d'organisation, il est possible de fusionner les sujets, et ça à été le cas pour au moins deux sujets proposés, ce qui à créé une situations problématique. Dans son livre qui parle des forums ouverts, Owen indique que parfois il vaut mieux ne pas fusionner les sujets, et je pense qu'on aurait sûrement du ici. Les attentes des participant⋅e⋅s ne sont pas forcement les mêmes, et ça peut créer de la frustration si les choses ne sont pas forcément bien amenées. C'est sûrement quelque chose à souligner aux participant⋅e⋅s lors du temps d'accueil.
## Animer et/ou participer ?
A titre personnel, j'ai été assez frustré par la posture un peu floue que j'avais durant le forum : je faisais partie de l'équipe d'organisation mais je ne m'occupais pas de l'animation, nourrissant l'espoir de participer aux discussions.
J'ai pu participer à certaines discussions, mais jamais (sauf une exception) pour une session entière, et j'ai trouvé ça dommage. Après une discussion avec Thomas qui à déjà animé au moins un forum ouvert, il semble possible d'« ouvrir » et de « fermer » les temps d'organisation, pour permettre aux organisateur⋅ice⋅s d'animer et de participer.
J'aime bien cette idée, parce que ça veut dire que tout le monde peut participer, et que la posture d'animation ne signifie pas un « sacrifice », mais peut-être que cette idée à aussi ses défauts : lors d'une discussion avec un⋅e des animateurs⋅rices iel m'a indiqué qu'iel préférait rester extérieur aux discussions, pour éviter les prises de pouvoir.
Autrement dit, faire l'animation du forum ouvert conférerait un pouvoir qui pourrait être néfaste lors des discussions. Je ne sais pas trop quoi penser de cette idée, mais il me semble pertinent de pousser la réflexion. Dans une posture plus « classique » de facilitation, on s'efforce de rester extérieur aux discussions, pour ne pas avoir de conflit d'intérêt.
Mais dans le cas du forum ouvert, je n'ai pas l'impression que faire l'animation confère un pouvoir sur le groupe, autre que celui d'être garant⋅e des règles du fonctionnement collectif (rappel de l'heure par exemple, rappel du cadre de bienveillance). Si vous avez des retours sur ce sujet je suis preneur !
Voire, je me demande même quel rapports cela génère de — justement — rester extérieur et de ne pas participer, alors même qu'on est présent⋅e. Dit autrement, alors que tout le monde se rencontre à travers les discussions, se met en jeu, ce n'est pas le cas des animateur⋅ice⋅s, et je me demande si ça impacte l'ambiance générale ?
En tout cas, j'aime bien l'idée qu'il soit possible d'à la fois animer les temps de forums et de participer. Dans ce cas là, existe-il des stratagèmes / artifices pour permettre de visibiliser ces prises de pouvoir pendant les discussions ?
Je suis preneur de tout retour d'expérience sur le sujet !

View file

@ -17,7 +17,8 @@ PEP20](http://www.python.org/dev/peps/pep-0020/), qui constituent une
très bonne introduction au langage, qui prends la forme d'un *easter
egg* présent dans python
``` sourceCode bash
```bash
>>> import this
The Zen of Python, by Tim Peters

View file

@ -71,7 +71,8 @@ If you want to find all the distributions of the "EggsAndSpam" project,
you could do the following (do not take so attention to the names here,
as the API will probably change a bit):
``` sourceCode python
```python
>>> index = SimpleIndex()
>>> index.find("EggsAndSpam")
[EggsAndSpam 1.1, EggsAndSpam 1.2, EggsAndSpam 1.3]
@ -79,7 +80,8 @@ as the API will probably change a bit):
We also could use version specifiers:
``` sourceCode python
```python
>>> index.find("EggsAndSpam (< =1.2)")
[EggsAndSpam 1.1, EggsAndSpam 1.2]
```

View file

@ -25,7 +25,7 @@ You can find a repository to fork at
If you just want to get started, use your installer of choice (pip,
easy\_install, …) And then have a look to the help (pelican --help)
``` sourceCode bash
```
$ pip install pelican
```
@ -33,7 +33,7 @@ $ pip install pelican
Here's a sample usage of pelican
``` sourceCode bash
``` bash
$ pelican .
writing /home/alexis/projets/notmyidea.org/output/index.html
writing /home/alexis/projets/notmyidea.org/output/tags.html
@ -48,7 +48,8 @@ Done !
You also can use the --help option for the command line to get more
informations
``` sourceCode bash
```bash
$pelican --help
usage: pelican [-h] [-t TEMPLATES] [-o OUTPUT] [-m MARKUP] [-s SETTINGS] [-b]
path

View file

@ -12,20 +12,23 @@ Some time ago, I've made a little python script to ease that, and you
can now use it too. It's named "gnome-background-generator", and you can
install it via pip for instance.
``` sourceCode shell
```
shell
$ pip install gnome-background-generator
```
Then, you have just to use it this way:
``` sourceCode shell
```
shell
$ gnome-background-generator -p ~/Images/walls -s
/home/alexis/Images/walls/dynamic-wallpaper.xml generated
```
Here is a extract of the \`--help\`:
``` sourceCode shell
```
shell
$ gnome-background-generator --help
usage: gnome-background-generator [-h] [-p PATH] [-o OUTPUT]
[-t TRANSITION_TIME] [-d DISPLAY_TIME] [-s]

View file

@ -11,7 +11,8 @@ After a bit of reflexion, that's also really easy to do using directly
the command line tools curl, grep and tail (but really harder to
read).
``` sourceCode bash
```bash
curl -X POST -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&l0\=1\&l1\=0\&tid\=RESTART -d "0=17&2=`curl -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&l0\=1\&l1\=0\&tid\=RESTART | grep -o "name='2' value='[0-9]\+" | grep -o "[0-9]\+" | tail -n 1`&1"
```
@ -20,7 +21,8 @@ curl -X POST -u joel:joel http://bebox.config/cgi/b/info/restart/\?be\=0\&l0\=1\
Well, that's not the optimal solution, that's a bit "gruik", but it
works.
``` sourceCode python
```python
import urllib2
import urlparse
import re

View file

@ -16,7 +16,8 @@ wheel, so it is easily pluggable with validations frameworks, such as
Here is how it works:
``` sourceCode python
```python
service = Service(name="service", path="/service")
@ -72,7 +73,8 @@ to the requests.
For instance, in our validator, we can chose to validate the parameter
passed and use it in the body of the webservice:
``` sourceCode python
```python
service = Service(name="service", path="/service")
@ -109,7 +111,8 @@ Let's refine a bit our previous example, by specifying which
content-types are supported, using the accept
parameter:
``` sourceCode python
```python
@service.get(validator=is_awesome, accept=("application/json", "text/json"))
def get1(request):
return {"test": "yay!"}
@ -135,7 +138,8 @@ writing documentation for web services can be painful, especially when
your services evolve. Cornice provides a sphinx directive to
automatically document your API in your docs.
``` sourceCode rst
```
rst
.. services::
:package: coolapp
:service: quote

View file

@ -17,7 +17,8 @@ without the need from the developer to deal with them nor to know them.
If you're not familiar with Cornice, here is how you define a simple
service with it:
``` sourceCode python
```python
from cornice.service import Service
bar = Service(path="/bar")
@ -40,7 +41,8 @@ this was via an extensive use of decorators internally.
The API of the cornice.service.Service class was as following
(simplified so you can get the gist of it).
``` sourceCode python
```python
class Service(object):
def __init__(self, **service_kwargs):
@ -110,7 +112,8 @@ touching the API that much.
Here is the gist of the new architecture:
``` sourceCode python
```python
class Service(object):
# we define class-level variables that will be the default values for
# this service. This makes things more extensible than it was before.
@ -170,7 +173,8 @@ and nothing more. No more route registration logic goes here. Instead, I
added this as another feature, even in a different module. The function
is named register\_service\_views and has the following signature:
``` sourceCode python
```python
register_service_views(config, service)
```

View file

@ -56,7 +56,8 @@ consume any REST API with a SPORE endpoint.
Here is how you can let cornice describe your web service for you
``` sourceCode python
```python
from cornice.ext.spore import generate_spore_description
from cornice.service import Service, get_services
@ -101,7 +102,8 @@ You can [find the project on
github](http://github.com/spiral-project/respire), but here is how to
use it, really quickly (these examples are how to interact with daybed)
``` sourceCode python
```python
>>> from respire import client_from_url
>>> # create the client from the SPORE definition

View file

@ -137,7 +137,8 @@ CORS support as well.
In Cornice, you define a service like this:
``` sourceCode python
```python
from cornice import Service
foobar = Service(name="foobar", path="/foobar")
@ -151,7 +152,8 @@ def get_foobar(request):
To add CORS support to this resource, you can go this way, with the
cors\_origins parameter:
``` sourceCode python
```python
foobar = Service(name='foobar', path='/foobar', cors_origins=('*',))
```
@ -166,7 +168,8 @@ need to stick with \*, which means "authorize everyone".
You can define the headers you want to expose for the service:
``` sourceCode python
```python
foobar = Service(name='foobar', path='/foobar', cors_origins=('*',))
@foobar.get(cors_headers=('X-My-Header', 'Content-Type'))
@ -212,7 +215,8 @@ the time.
I introduced another way to pass the CORS policy, so you can do
something like that:
``` sourceCode python
```python
policy = dict(enabled=False,
headers=('X-My-Header', 'Content-Type'),
origins=('*.notmyidea.org'),

View file

@ -80,7 +80,8 @@ into two parts, the first 32 hex caracters are the hawk id, and the next
Credentials:
``` sourceCode javascript
```
javascript
credentials = {
'id': keyMaterial[0:32],
'key': keyMaterial[32:64],
@ -109,7 +110,8 @@ Doing hawk requests in your terminal is now as simple as:
In addition, it will help you to craft requests using the requests
library:
``` sourceCode python
```python
import requests
from requests_hawk import HawkAuth
@ -123,7 +125,8 @@ Alternatively, if you don't have the token id and key, you can pass the
hawk session token I talked about earlier and the lib will take care of
the derivation for you:
``` sourceCode python
```python
hawk_auth = HawkAuth(
hawk_session=resp.headers['hawk-session-token'],
server_url=self.server_url
@ -140,7 +143,8 @@ simple it is to use it.
Here is a demo of how we implemented it for Daybed:
``` sourceCode python
```python
from pyramid_hawkauth import HawkAuthenticationPolicy
policy = HawkAuthenticationPolicy(decode_hawk_id=get_hawk_id)
@ -164,7 +168,8 @@ finally came up factorizing everything in a library for express, named
In order to plug it in your application, you'll need to use it as a
middleware:
``` sourceCode javascript
```
javascript
var express = require("express");
var hawk = require("express-hawkauth");
app = express();

View file

@ -112,7 +112,8 @@ terme, et que *Remote Storage* devienne une facette de notre solution.
permet de manipuler des enregistrements en local et de les synchroniser
vers une base distante.
``` sourceCode javascript
```
javascript
var db = new PouchDB('dbname');
db.put({

View file

@ -42,15 +42,13 @@ Une phrase de passe devrait:
Une des techniques consiste à utiliser des mots du dictionnaire,
sélectionnés de manière aléatoire, puis modifiés.
![](https://imgs.xkcd.com/comics/password_strength.png)
![Trough 20 years of effort, we've succesfully trained everyone to use passwords that are hard for humans to remember, but easy for computers to guess](https://imgs.xkcd.com/comics/password_strength.png)
Micah Lee [travaille également sur un
outil](https://github.com/micahflee/passphrases) qui vise à rendre la
mémorisation des phrases de passe plus aisée, de par leur répétition
avec des pauses de plus en plus longues.
![](%7Bfilename%7D/static/passphrases.png)
Oui, ce n'est pas aussi simple que ce qu'il y parait. Pour ma part, j'ai
une copie en local de mes clés, dans un fichier chiffré avec une autre
clé que j'ai généré pour l'occasion et que je ne partagerait pas. J'ai

View file

@ -3,6 +3,7 @@ Service de nuages : Garantir l'intégrité des données via des signatures
:summary: Comment garantir l'intégrité des données en utilisant les signatures.
:lang: fr
:date: 2016-03-01
*Cet article est repris depuis le blog « Service de Nuages » de mon équipe à Mozilla*

3
mnmlist/LICENSE Normal file
View file

@ -0,0 +1,3 @@
This theme is uncopyrighted (http://mathieu.agopian.info/mnmlist/theme.html), and is an adaptation of the mnmlist theme for wordpress, which is also uncopyrighted (http://mnmlist.com/theme/).
This theme is also free, and offered as is.

28
mnmlist/README.rst Normal file
View file

@ -0,0 +1,28 @@
mnmlist
#######
This is the `mnmlist theme <http://mnmlist.com/theme>`_ adapted for Pelican.
Settings
~~~~~~~~
There's one additional setting used by this theme, if present:
::
HIDE_DATE = False
If ``HIDE_DATE`` is set to ``True``, dates won't be displayed under the blog post titles.
Compass
~~~~~~~
The ``main.css`` file is generated from the ``compass/src/main.scss`` sass file, using http://compass-style.org/.
Screenshot
----------
.. image:: screenshot.png
:alt: Screenshot of the theme

BIN
mnmlist/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

296
mnmlist/static/css/main.css Normal file
View file

@ -0,0 +1,296 @@
/*
Theme Name: mnmlist modified by leplatrem
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.
Author: Mathieu Agopian, Mathieu Leplatre
Autor URI: http://mathieu.agopian.info
This theme is uncopyrighted, free, and offered as is.
*/
@import url("pygment.css");
:root {
--main-bg-color: #fff;
--border-color: #ACACAC;
--code-bg-color: #e5e5e2;
--link-color:
#BB7DD4
;
--text-color: #2d2d2d;
--menu-color:
#7971D0
;
--link-color-menu:
#36194D
;
--headers-color: #000;
--citation-bold-color: #bb7dd49a
}
body {
background: var(--main-bg-color);
color: var(--text-color);
font-family: "Helvetica Neue",Arial,sans-serif;
margin-left: auto;
margin-right: auto;
padding: 16px;
max-width: 35em;
font-size: 20px;
}
.section {
margin-top: 40px;
}
h1, h2, h3, h4 {
color: var(--headers-color);
}
h1 {
font-size: 2em;
font-weight: normal;
margin-bottom: 0;
font-weight: bold;
line-height: 1.2em;
}
h1 a {
text-decoration-style: unset;
}
h2 {
font-size: 1.3em;
}
h3 {
font-size: 1em;
}
h4 {
font-size: 0.9em;
}
time {
font-weight: bold;
border-bottom: 1px solid;
padding-bottom: 10px;
padding-right: 5em;
}
img {
border: none;
max-width: 100%;
}
.align-right {
float: right;
max-width: 50%;
}
.align-center {
margin-left: auto;
margin-right: auto;
width: max-content;
max-width: 100%;
}
.footnote:first-of-type {
padding-top: 30px;
}
.footnote:last-of-type {
padding-bottom: 30px;
}
.footnote-reference {
vertical-align: super;
font-size: 0.7em;
}
blockquote {
position: relative;
margin: 1.5em 2ch 1.5em 2ch;
padding: 0;
}
blockquote strong {
background-color: var(--citation-bold-color);
font-weight: normal !important;
}
blockquote::before {
position: absolute;
top: 0;
left: -2ch;
bottom: 0;
width: 1ch;
overflow: hidden;
white-space: pre;
line-height: 30px;
content: ">\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a>\a";
cursor: default;
}
p {
line-height: 30px;
margin:30px auto;
text-indent: 0px;
}
p.caption {
font-size: 80%;
margin-top: 0;
}
a {
color: inherit;
text-decoration-color: var(--link-color);
text-decoration-thickness: 3px;
}
a:hover {
color: var(--link-color);
}
ul, ol {
padding: .5em 0em 1em 3.2em;
}
ul li, ol li {
line-height: 30px;
padding: 0;
}
strong {
font-weight: bold;
}
tt, pre {
font-family: Inconsolata, Monaco, monospace;
line-height: 1.2em;
}
pre {
font-size: 0.8em;
overflow: auto;
padding: 10px;
}
header {
padding-bottom: 20px;
}
header a {
text-decoration: none;
}
header h1 {
margin-bottom: 30px;
}
dt {
font-weight: bold;
}
section.index {
margin-top: 3em;
line-height: 1.5em;
}
section.index h1 {
margin-top: 5px;
margin-bottom: 5px;
}
.index time {
border-bottom: none;
}
#links {
}
#links li {
display: inline-block;
}
#links a {
margin-right: 15px;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 10px;
padding-right: 10px;
text-decoration-color: var(--link-color-menu);
/*text-decoration-thickness: unset;*/
}
#links a:hover {
color: var(--link-color-menu);
}
#links a.selected {
color: #fff;
background-color: var(--link-color-menu);
}
#links a.selected:hover {
cursor: default;
}
#article-list {
margin-top: 100px;
}
#article-list ol li {
line-height: 1.2em;
list-style-type: none;
padding-bottom: 10px;
}
.note {
background: var(--code-bg-color);
font-style: italic;
padding: 1em 0.5em;
margin: 1em 0;
font-family: Georgia, serif;
}
.note p {
display: inline;
}
.note p.first {
font-weight: bold;
}
.note p.first::after {
content: ' : ';
}
footer {
color: var(--headers-color);
font-size: 13px;
letter-spacing:4px;
margin-left: 20px;
}
footer li {
display: inline;
}
footer p {
text-align: right;
}
footer a {
text-decoration-thickness: unset;
}

View file

@ -0,0 +1,74 @@
pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #408080; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #7D9029 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.highlight .no { color: #880000 } /* Name.Constant */
.highlight .nd { color: #AA22FF } /* Name.Decorator */
.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0000FF } /* Name.Function */
.highlight .nl { color: #A0A000 } /* Name.Label */
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #666666 } /* Literal.Number.Bin */
.highlight .mf { color: #666666 } /* Literal.Number.Float */
.highlight .mh { color: #666666 } /* Literal.Number.Hex */
.highlight .mi { color: #666666 } /* Literal.Number.Integer */
.highlight .mo { color: #666666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0000FF } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */

View file

@ -0,0 +1,11 @@
{% if GOOGLE_ANALYTICS %}
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("{{GOOGLE_ANALYTICS}}");
pageTracker._trackPageview();
} catch(err) {}</script>
{% endif %}

View file

@ -0,0 +1,14 @@
{% extends "base.html" %}
{% block content %}
<header>
<h1>Archives</h1>
</header>
<section id="content" class="body">
<dl>
{% for article in dates %}
<dt>{{ article.locale_date }}</dt>
<dd><a href='{{ SITEURL }}/{{ article.url }}'>{{ article.title }}</a></dd>
{% endfor %}
</dl>
</section>
{% endblock %}

View file

@ -0,0 +1,32 @@
{% extends "base.html" %}
{% block title %}{{ article.title }} - {{ super() }}{% endblock %}
{% block content %}
<header>
{% if article.category == "Lectures" %}
<h3>Notes de lecture</h3>
<h1 class="post-title">« {{ article.title }} » par {{ article.author }}</h1>
<time datetime="{{ article.date.isoformat() }}">Lu le {{ article.locale_date }}</time>
{% else %}
<h1 class="post-title">{{ article.title }}</h1>
<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 %}
- Posted in the <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a> category
</p>
{% endif %}
</article>
{% endblock %}

View file

@ -0,0 +1,2 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - {{ author }}{% endblock %}

View file

View file

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>{% block title %}{{ SITENAME }}{%endblock%}</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="{{ SITEURL }}/theme/css/{{ CSS_FILE }}" type="text/css" />
<link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} ATOM Feed" />
{% if FEED_RSS %}
<link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
{% endif %}
</head>
<body>
<section id="links">
<li>
<a class="{% if page_name == 'index' %}selected{% endif %}" href="{{ SITEURL }}/" id="site-title">Blog</a>
</li>
{% for p in pages %}
<li><a class="{% if page and page.slug == p.slug %}selected{% endif %}" href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a></li>
{% endfor %}
</section>
{% include 'github.html' %}
{% block content %}
{% endblock %}
</body>
</html>

View file

@ -0,0 +1,8 @@
{% extends "base.html" %}
{% block content %}
<ul>
{% for category, articles in categories %}
<li><a href="{{ SITEURL }}/{{ category.url }}">{{ category }}</a></li>
{% endfor %}
</ul>
{% endblock %}

View file

@ -0,0 +1,3 @@
{% extends "index.html" %}
{% block title %}{{ category }} - {{ super() }}{% endblock %}
{% block pagetitle %}{{ category }} posts{% endblock %}

View file

@ -0,0 +1,20 @@
{% if DISQUS_SITENAME %}
<hr>
<div id="disqus_thread"></div>
<script>
var disqus_config = function() {
this.page.url = '{{ SITEURL }}/{{ output_file }}';
this.page.identifier = '{{ article.slug }}';
};
(function() {
var d = document;
var s = d.createElement('script');
s.src = '//{{ DISQUS_SITENAME }}.disqus.com/embed.js';
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>
{% endif %}

View file

@ -0,0 +1,11 @@
{% if DISQUS_SITENAME %}
<script type="text/javascript">
var disqus_shortname = '{{ DISQUS_SITENAME }}';
(function () {
var s = document.createElement('script'); s.async = true;
s.type = 'text/javascript';
s.src = 'https://' + disqus_shortname + '.disqus.com/count.js';
(document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
}());
</script>
{% endif %}

View file

@ -0,0 +1,9 @@
{% 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>
{% endif %}

View file

@ -0,0 +1,30 @@
{% extends "base.html" %}
{% block content %}
<h1>{% block pagetitle %}{% endblock %}</h1>
{% if articles %}
{% for article in articles %}
{% if loop.index <= DEFAULT_PAGINATION %}
<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>
{{ article.content|striptags|truncate(200) }}
</section>
{% else %}
{% if loop.index0 == DEFAULT_PAGINATION %}
<section>
<h1>More...</h1>
<ul>
{% endif %}
<li><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></li>
{% if loop.last %}
</ul>
</section>
{% endif %}
{% endif %}
{% endfor %}
{% else %}
No posts found.
{% endif %}
{% endblock content %}

View file

@ -0,0 +1,9 @@
{% extends "base.html" %}
{% block title %}{{ page.title }} - {{ super() }}{% endblock %}
{% block content %}
<header>
</header>
<article>
{{ page.content }}
</article>
{% endblock %}

View file

@ -0,0 +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">&laquo;</a>
{% else %}
<a href="{{ SITEURL }}/{{ page_name }}{{ articles_page.previous_page_number() }}.html">&laquo;</a>
{% 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">&raquo;</a>
{% endif %}
</p>
{% endif %}

View file

@ -0,0 +1,16 @@
{% if PIWIK_URL and PIWIK_SITE_ID %}
<script type="text/javascript">
{% if PIWIK_SSL_URL %}
var pkBaseURL = (("https:" == document.location.protocol) ? "https://{{ PIWIK_SSL_URL }}/" : "http://{{ PIWIK_URL }}/");
{% else %}
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">
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 %}

View file

@ -0,0 +1,3 @@
{% extends "index.html" %}
{% block title %}{{ tag }} - {{ super() }}{% endblock %}
{% block pagetitle %}Posts with #{{ tag }} tag{% endblock %}

View file

@ -0,0 +1,2 @@
{% 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 %}

View file

@ -0,0 +1,9 @@
{% extends "base.html" %}
{% block content %}
<ul>
{% for tag, articles in tags %}
<li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a></li>
{% endfor %}
</ul>
{% endblock %}

View file

@ -0,0 +1,6 @@
{% if article.translations %}
Translations:
{% for translation in article.translations %}
<a href="{{ SITEURL }}/{{ translation.url }}">{{ translation.lang }}</a>
{% endfor %}
{% endif %}

View file

@ -0,0 +1,3 @@
{% 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 %}

View file

@ -3,8 +3,9 @@
PATH = "content"
AUTHOR = u""
SITENAME = u"Carnets en ligne"
THEME = "theme"
THEME = "mnmlist"
DISQUS_SITENAME = "notmyidea"
DEFAULT_PAGINATION = 10
STATIC_PATHS = ["static", "images"]
SITEURL = ""

View file

@ -1,2 +1,3 @@
pelican
markdown
datefinder

View file

@ -14,7 +14,7 @@ class BlockquotesPreprocessor(Preprocessor):
new_lines = []
for line in lines:
if line.startswith(">"):
new_lines.append("&nbsp;")
# new_lines.append("&nbsp;")
new_lines.append(line)
else:
new_lines.append(line)