summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Dailly <sebastien@chimrod.com>2013-04-28 19:54:45 +0200
committerSébastien Dailly <sebastien@chimrod.com>2013-05-01 10:33:08 +0200
commitdc214056449119b29ad7b19b8d47e81b343ff453 (patch)
treee5fbae31ed73509852d45354ab682e8c96e5c42f
parentbfc347fdea8ebf0246902cbf7c95cfd5b518b4e8 (diff)
Updated theme and templates
Updated to pelican 3.2
-rw-r--r--Makefile10
-rwxr-xr-xcontent/Informatique/awesome.rst25
-rwxr-xr-xcontent/Informatique/backup.rst18
-rwxr-xr-xcontent/Informatique/chiffrage.rst17
-rwxr-xr-xcontent/Informatique/chroot.rst21
-rwxr-xr-xcontent/Informatique/fail2ban.rst10
-rwxr-xr-xcontent/Informatique/invisible.rst149
-rwxr-xr-xcontent/Informatique/rst.rst16
-rwxr-xr-xcontent/Informatique/rstodt.rst5
-rwxr-xr-xcontent/Perso/net.rst6
-rwxr-xr-xdevelop_server.sh103
-rwxr-xr-xpelicanconf.py6
-rw-r--r--plugins/related_posts/__init__.py1
-rw-r--r--plugins/related_posts/related_posts.py36
-rwxr-xr-xtheme/static/css/main.css31
-rwxr-xr-xtheme/static/css/styles.css81
-rwxr-xr-xtheme/templates/archives.html2
-rwxr-xr-xtheme/templates/article.html52
-rwxr-xr-xtheme/templates/category.html3
-rwxr-xr-xtheme/templates/index.html3
-rwxr-xr-xtheme/templates/menu.html6
-rwxr-xr-xtheme/templates/meta.html17
-rwxr-xr-xtheme/templates/page.html2
-rwxr-xr-xtheme/templates/tag.html3
24 files changed, 421 insertions, 202 deletions
diff --git a/Makefile b/Makefile
index 824b521..8543c12 100644
--- a/Makefile
+++ b/Makefile
@@ -28,6 +28,7 @@ help:
@echo ' make publish generate using production settings '
@echo ' make serve serve site at http://localhost:8000'
@echo ' make devserver start/restart develop_server.sh '
+ @echo ' make stopserver stop local server '
@echo ' ssh_upload upload the web site via SSH '
@echo ' rsync_upload upload the web site via rsync+ssh '
@echo ' dropbox_upload upload the web site via Dropbox '
@@ -43,17 +44,22 @@ $(OUTPUTDIR)/%.html:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
clean:
- find $(OUTPUTDIR) -mindepth 1 -delete
+ [ ! -d $(OUTPUTDIR) ] || find $(OUTPUTDIR) -mindepth 1 -delete
regenerate: clean
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
serve:
- cd $(OUTPUTDIR) && python -m SimpleHTTPServer
+ cd $(OUTPUTDIR) && python -m pelican.server
devserver:
$(BASEDIR)/develop_server.sh restart
+stopserver:
+ kill -9 `cat pelican.pid`
+ kill -9 `cat srv.pid`
+ @echo 'Stopped Pelican and SimpleHTTPServer processes running in background.'
+
publish:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS)
diff --git a/content/Informatique/awesome.rst b/content/Informatique/awesome.rst
index 0895c9e..506faf8 100755
--- a/content/Informatique/awesome.rst
+++ b/content/Informatique/awesome.rst
@@ -6,6 +6,7 @@ Un menu pour awesome
:date: 2010-06-06
:tags: Libre
+:summary: |summary|
Awesome est un window manager (wm) en mode pavement (les fenêtres se
disposent de manière à ne jamais se chevaucher). Cela permet de ne pas
@@ -52,13 +53,18 @@ Bien sûr le temps de paramétrage au début est un peu long, mais
maintenant que l'API est stable, il n'est plus nécessaire de tout
reprendre à chaque fois que l'on met à jour awesome.
-Je trouvais qu'il manquait à Awesome un menu avec les actions
-disponibles sur les fenêtres : la faire passer au premier plan, la
-minimiser… Tout ceci est disponible avec des raccourcis claviers, mais
-il n'y a pas d'option centralisée pour les retrouver. J'ai donc décidé
-de me plonger un petit peu dans lua pour produire le menu que voilà :
+|summary|
-|Menu pour awesome| Le menu permet les actions suivantes :
+.. |summary| replace::
+ Je trouvais qu'il manquait à Awesome un menu avec les actions
+ disponibles sur les fenêtres : la faire passer au premier plan, la
+ minimiser… Tout ceci est disponible avec des raccourcis claviers, mais
+ il n'y a pas d'option centralisée pour les retrouver. J'ai donc décidé
+ de me plonger un petit peu dans lua pour produire le menu que voilà :
+
+|Menu pour awesome|
+
+Le menu permet les actions suivantes :
- On top : Pour mettre le client sélectionné au premier plan et le
rendre flottant
@@ -76,13 +82,13 @@ Pour le faire fonctionner, il faut télécharger le script et le placer
dans son répertoire ${HOME}/.config/awesome . Ensuite, éditer le fichier
rc.lua et y ajouter la ligne suivante en en-tête :
-::
+.. code-block:: lua
require("mymenu")
et dans la partie Key Binding :
-::
+.. code-block:: lua
clientkeys = awful.util.table.join(
[…]
@@ -93,4 +99,7 @@ Le menu apparaîtra sur le raccourci Mod4 + Flèche du bas
Le fichier : `mymenu.lua <http://chimrod.com/downloads/mymenu.lua>`_
.. |Awesome| image:: http://awesome.naquadah.org/index/320x240-screen.png
+ :class: floatleft
+
.. |Menu pour awesome| image:: |filename|../images/menu.png
+ :class: floatright
diff --git a/content/Informatique/backup.rst b/content/Informatique/backup.rst
index 2e71f9e..ebd54e3 100755
--- a/content/Informatique/backup.rst
+++ b/content/Informatique/backup.rst
@@ -6,14 +6,18 @@ Un système de backup automatique
:date: 2009-10-18
:tags: Libre
+:summary: |summary|
-On le sait tous, il faut faire des sauvegardes de manière régulière. On
-le sais également, pour que celles-ci se fassent sur le long terme, il
-faut que celles-ci se fassent de manière automatique, et sur un autre
-support que le PC que l'on souhaite sauvegarder. Le problème qui se pose
-est le suivant : comment concilier ces deux conditions sur un PC de
-bureau (ne disposant donc pas d'une série de serveur allumés en
-permanences et prêt à recevoir nos sauvegardes en continu…) ?
+.. |summary| replace::
+ On le sait tous, il faut faire des sauvegardes de manière régulière. On le
+ sait également, pour que celles-ci se fassent sur le long terme, il faut
+ que celles-ci se fassent de manière automatique, et sur un autre support
+ que le PC que l'on souhaite sauvegarder. Le problème qui se pose est le
+ suivant : comment concilier ces deux conditions sur un PC de bureau (ne
+ disposant donc pas d'une série de serveur allumés en permanences et prêt à
+ recevoir nos sauvegardes en continu…) ?
+
+|summary|
Pour répondre à tout cela, nous allons mettre en place un système de backup sur
disque dur externe, qui se lancera à chaque fois que notre disque sera monté. À
diff --git a/content/Informatique/chiffrage.rst b/content/Informatique/chiffrage.rst
index e3af66d..fcda1dd 100755
--- a/content/Informatique/chiffrage.rst
+++ b/content/Informatique/chiffrage.rst
@@ -6,13 +6,16 @@ Mettre en place une solution de chiffrage avec authentification forte
:date: 2008/11/07
:tags: Libre
+:summary: |summary|
-Voici une méthode que j'ai mise en place pour protéger l'accès à mon
-répertoire /home via Cryptsetup. Il existe de nombreux tutoriels
-expliquant comment créer une partition chiffrée, je ne vais pas
-détailler cela ici. L'intérêt du script que je propose ici est qu'il se
-lance au moment du login, et qu'il va chercher le mot de passe sur une
-clef USB.
+.. |summary| replace::
+ Voici une méthode que j'ai mise en place pour protéger l'accès à mon
+ répertoire /home via Cryptsetup. Il existe de nombreux tutoriels expliquant
+ comment créer une partition chiffrée, je ne vais pas détailler cela ici.
+ L'intérêt du script que je propose ici est qu'il se lance au moment du
+ login, et qu'il va chercher le mot de passe sur une clef USB.
+
+|summary|
Charger le mot de passe contenu dans la clef USB
------------------------------------------------
@@ -22,7 +25,7 @@ fois l'authentification réussie.
Voici le script en question
-::
+.. code-block:: bash
#!/bin/sh
diff --git a/content/Informatique/chroot.rst b/content/Informatique/chroot.rst
index e78aa16..d126d99 100755
--- a/content/Informatique/chroot.rst
+++ b/content/Informatique/chroot.rst
@@ -102,7 +102,7 @@ aussi d'être sûr que le répertoire .ssh ne sera pas effacé par erreur
par l'utilisateur…) J'ai donc mis un lien symbolique pour lier le /home
de l'utilisateur avec son répertoire d'échange :
-::
+.. code-block:: console
# mkdir /home/${user}/echanges
# ln -s /var/chroot/home/${user} /home/${user}/echanges
@@ -119,9 +119,9 @@ l'ordinateur, nous allons l'empêcher de se balader dans les autres
répertoires des utilisateurs : cela se fait en une ligne de commande
(pour chacun des répertoires que nous allons ouvrir en sftp :)
-::
+.. code-block:: console
- # for fichier in /var/chroot/home/*; do chmod o-r ${fichier}; done
+ # for fichier in /var/chroot/home/* ; do chmod o-r ${fichier}; done
Et voilà ! Les utilisateurs peuvent voir qu'il existe d'autres comptes
que le leur, mais ne peuvent pas y accéder.
@@ -140,7 +140,7 @@ la demande !) de manière plus fine. Cela implique pour moi deux choses :
Pour le premier point, c'est facile il suffit d'ajouter l'utilisateur A
au groupe de l'utilisateur B :
-::
+.. code-block:: console
# usermod -a -G ${user} ${un_autre_utilisateur}
@@ -155,7 +155,7 @@ propriétaire. Par exemple : l'utilisateur A dépose un fichier dans le
répertoire d'échange de l'utilisateur B. Il faut que les droits de ce
fichier se présentent ainsi une fois le transfert terminé :
-::
+.. code-block:: console
$ ls -l fichier
-rw-rw---- 1 utilisateurA utilisateurB
@@ -167,10 +167,12 @@ fichiers qui seront créés dans le répertoire (plus d'info
`ici <http://en.wikipedia.org/wiki/Setuid>`_). Pour le déterminer on
passe par chmod :
-::
+.. code-block:: console
# chmod g+s /var/chroot/${user}
+|image2|
+
Cela détermine bien quel est le groupe qui sera propriétaire du fichier,
mais cela ne donne pas à ce groupe le droit de le modifier pour autant !
Sous linux, c'est la commande umask qui permet de déterminer les droits
@@ -184,7 +186,6 @@ trouvé énormément de documentations (la plupart des bidouillages) pour
contourner le problème, mais la solution la plus simple vient de la
dernière version d'OpenSSH (5.4) sortie le 8 mars dernier.
-|image2|
Une nouvelle option sur le serveur sftp permet d'indiquer quel est
l'umask qui sera appliqué (dans notre cas 002) : dans le
@@ -225,5 +226,11 @@ sauvegarder sa clef privée dans son home (le vrai), au cas où il
perdrait le fichier.
.. |Création de la clef ssh avec puttygen| image:: |filename|../images/puttygen-300x276.jpg
+ :class: floatleft
+
+
.. |image1| image:: |filename|../images/filezilla-300x140.jpg
+ :class: floatright
+
.. |image2| image:: |filename|../images/conf-300x175.jpg
+ :class: floatleft
diff --git a/content/Informatique/fail2ban.rst b/content/Informatique/fail2ban.rst
index 794797f..a276ca4 100755
--- a/content/Informatique/fail2ban.rst
+++ b/content/Informatique/fail2ban.rst
@@ -90,9 +90,9 @@ qui consistera à bloquer une IP pendant telle période :
Dans fail2ban, nous allons créer un nouveau fichier action, qui se
présentera comme suit :
-::
+.. code-block:: bash
- #On crée une nouvelle table
+ #On crée une nouvelle table
actionstart = iptables -N fail2ban-<name>
#On bloque les connexions 2 fois sur 3
iptables -A fail2ban- -m statistic --mode random --probability .33 -j REJECT --reject-with icmp-host unreachable
@@ -122,13 +122,13 @@ droits limités. Notre règle iptables consistera juste à rediriger les
connexions entrantes sur le port 80 vers le port où l'on fait tourner
socat.
-::
+.. code-block:: bash
sudo -u nobody socat tcp4-listen:6666,reuseaddr,fork exec:"cat /etc/apache2/banned.html" &
et la règle iptables à mettre en place :
-::
+.. code-block:: bash
#On crée la règle sur la table de préroutage :
actionstart = iptables -t nat -N fail2ban-<name>
@@ -142,7 +142,7 @@ et la règle iptables à mettre en place :
et pour lancer l'action, là encore, on simule une perte de paquet pour
ralentir le temps d'affichage de la page
-::
+.. code-block:: bash
actionban = iptables -t nat -I fail2ban-<name> 1 -s -p tcp -m multiport --dports <port> -m statistic --mode nth --every 3 -j REDIRECT --to-port 6666
iptables -I fail2ban-<name> 1 -s -j DROP
diff --git a/content/Informatique/invisible.rst b/content/Informatique/invisible.rst
index 6b94148..dcee14b 100755
--- a/content/Informatique/invisible.rst
+++ b/content/Informatique/invisible.rst
@@ -6,101 +6,98 @@ Les utilisateurs invisibles de Linux
:date: 2010-02-17
:tags: Libre, Humeur
-
-Bonjour à tous, pour mon premier article sur le planet-libre, je
-voudrais faire part d'une réflexion qui m'interpelle depuis un moment
-concernant l'univers Linux : le fait que les utilisateurs non
-administrateurs soient exclus de toute la documentation/prise en main
-que l'on peut trouver sur le système. Je ne donne ici que quelques
-aspects de cette réflexion mais je pense qu'elle touche l'ensemble des
-participants au monde du libre.
-
-La plupart des articles que l'on peut voir sur le net qui concernent
-l'utilisation du PC sous Linux restent limités à un point : souvent ils
-oublient le fait que plusieurs utilisateurs puissent être enregistrés
-sur le PC, et que tous ne soient pas forcément des administrateurs (
-ceux qui peuvent avoir des droits root sur la machine). Pourquoi donc ?
-Est-ce que cela signifie que la plupart des linuxiens sont les seuls à
-utiliser le PC ? C'est possible, mais là n'est pas mon sujet. Je pense
-que le problème est que les utilisateurs sont pour l'instant invisible
-de la littérature sur Linux que l'on peut trouver sur le net. À la fois
-invisible du côté des distributions, et invisible du côté des
-communautés.
+:summary: |summary|
+
+Bonjour à tous, pour mon premier article sur le planet-libre, je voudrais faire
+part d'une réflexion qui m'interpelle depuis un moment concernant l'univers
+Linux : le fait que les utilisateurs non administrateurs soient exclus de toute
+la documentation/prise en main que l'on peut trouver sur le système. Je ne
+donne ici que quelques aspects de cette réflexion mais je pense qu'elle touche
+l'ensemble des participants au monde du libre.
+
+.. |summary| replace::
+ La plupart des articles que l'on peut voir sur le net qui concernent
+ l'utilisation du PC sous Linux restent limités à un point : souvent ils
+ oublient le fait que plusieurs utilisateurs puissent être enregistrés sur
+ le PC, et que tous ne soient pas forcément des administrateurs ( ceux qui
+ peuvent avoir des droits root sur la machine). Pourquoi donc ? Est-ce que
+ cela signifie que la plupart des linuxiens sont les seuls à utiliser le PC ?
+ C'est possible, mais là n'est pas mon sujet. Je pense que le problème est
+ que les utilisateurs sont pour l'instant invisible de la littérature sur
+ Linux que l'on peut trouver sur le net. À la fois invisible du côté des
+ distributions, et invisible du côté des communautés.
+
+|summary|
Le problème se retrouve présent dans deux aspects : d'une part dans la
documentation s'adressant aux administrateurs, et d'autre part dans la
documentaiton s'adressant aux utilisateurs.
-Si l'on suit les manipulations que l'on peut trouver un peu partout sur
-le net, on trouve souvent des modifications qui ont pour conséquences de
-modifier la configuration générale du système, et l'on trouve plus
-souvent des modifications dans /etc/ que dans ~/.config/
+Si l'on suit les manipulations que l'on peut trouver un peu partout sur le net,
+on trouve souvent des modifications qui ont pour conséquences de modifier la
+configuration générale du système, et l'on trouve plus souvent des
+modifications dans /etc/ que dans ~/.config/
Suivre les besoins des utilisateurs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Tous les utilisateurs n'utilisent pas forcément l'ordinateur de la même
-manière et il faut prévoir quels sont leurs besoins avant de se lancer
-dans une opération générale. Par exemple, il n'y a pas longtemps était
-paru sur le planet-libre un article sur privoxy qui se terminait par une
-manière élégante d'utiliser privoxy sans configuration
-supplémentaire[1]. Or privoxy est lent pour traiter les sites puisant
-des ressources un peu partout — par exemple google news ou planet-libre
-(!) et se transformer en inconfort pour l'utilisateur.
+Tous les utilisateurs n'utilisent pas forcément l'ordinateur de la même manière
+et il faut prévoir quels sont leurs besoins avant de se lancer dans une
+opération générale. Par exemple, il n'y a pas longtemps était paru sur le
+planet-libre un article sur privoxy qui se terminait par une manière élégante
+d'utiliser privoxy sans configuration supplémentaire\ [1]_. Or privoxy est lent
+pour traiter les sites puisant des ressources un peu partout — par exemple
+google news ou planet-libre (!) et se transformer en inconfort pour
+l'utilisateur.
Les mises à jour
~~~~~~~~~~~~~~~~
-Faire une mise à jour est toujours quelque chose de périlleux, et l'on
-ne sait pas forcément comment le système va réagir; entre le logiciel
-qui ne fonctionne plus car sa configuration a changé ou celui qui ne
-fonctionne plus car un bug a été introduit dans la nouvelle version, les
-risques sont possibles (je n'ai par exemple pu plus lire de dvd lors de
-la mise à jour du noyau 2.6.30[2]…)
-
-Je ne veux pas relancer le débat sur le packaging des distributions (
-rolling release contre version fixes) mais le problème doit être posé :
-comment être sûr en faisant une mise à jour que l'on ne va pas casser
-tel composant ?
-
-En plus des modifications générales sur la configuration que peuvent
-introduire les modifications, on peut se retrouver dans la situation
-inverse : l'utilisateur n'a pas le droit de visualiser les fichiers de
-logs, d'installer un paquet ou de modifier un fichier de configuration
-et ne pourra donc pas suivre la documentation qu'il peut trouver ici et
-là sur le net.
+Faire une mise à jour est toujours quelque chose de périlleux, et l'on ne sait
+pas forcément comment le système va réagir; entre le logiciel qui ne fonctionne
+plus car sa configuration a changé ou celui qui ne fonctionne plus car un bug a
+été introduit dans la nouvelle version, les risques sont possibles (je n'ai par
+exemple pu plus lire de dvd lors de la mise à jour du noyau 2.6.30\ [2]_…)
+
+Je ne veux pas relancer le débat sur le packaging des distributions ( rolling
+release contre version fixes) mais le problème doit être posé : comment être
+sûr en faisant une mise à jour que l'on ne va pas casser tel composant ?
+
+En plus des modifications générales sur la configuration que peuvent introduire
+les modifications, on peut se retrouver dans la situation inverse :
+l'utilisateur n'a pas le droit de visualiser les fichiers de logs, d'installer
+un paquet ou de modifier un fichier de configuration et ne pourra donc pas
+suivre la documentation qu'il peut trouver ici et là sur le net.
Pouvoir utiliser ses propres applications ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Les distributions n'ont pour l'instant pas de solutions pour gérer
-l'installation de paquets par un utilisateur normal (qui irait
-s'installer dans /opt// par exemple), pouvant être installés sans droit
-root, et ne pouvant être exécutés que par l'utilisateur ayant fait son
-installation.
+l'installation de paquets par un utilisateur normal (qui irait s'installer dans
+/opt/ par exemple), pouvant être installés sans droit root, et ne pouvant être
+exécutés que par l'utilisateur ayant fait son installation.
Utiliser des commandes non root
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-En fait, ce système que l'on nous décrit ouvert ne l'est réellement que
-si l'on est admin dessus. Pour les autres, la manipulation se limite à
-bash, python… Dans la documentation, on trouve même des exemples
-demandant à l'utilisateur d'être root alors qu'une commande équivalente
-peut être lancée par un utilisateur normal (par exemple $netstat -ie au
-lieu de #ifconfig)
-
-Ce problème de l'utilisateur non root est pour l'instant contourné
-(par exemple en configurant sudo dès l'installation), mais il reste
-posé, et n'est jamais attaqué de front.
-
-Le fait que cette situation ne soit jamais évoquée est pour moi
-significative de l'utilisation faite de linux aujourd'hui : bien loin du
-grand public. Nous sommes tous ici des utilisateurs bidouilleurs, et ne
-voyons pas forcément une utilisation quotidienne d'un utilisateur
-standard. Je ne veux pas en faire une généralisation sur l'avenir de
-Linux et une remise en cause nécessaire. Je pose juste ici un constat
-sur une situation qui est pour moi, encore trop souvent invisible.
-
-[2] `Artisan Numérique » Se prémunir des "SpyWebs" avec
-Privoxy <http://artisan.karma-lab.net/node/1204>`_ [1]
-`http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=557340 <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=557340>`_
+En fait, ce système que l'on nous décrit ouvert ne l'est réellement que si l'on
+est admin dessus. Pour les autres, la manipulation se limite à bash, python…
+Dans la documentation, on trouve même des exemples demandant à l'utilisateur
+d'être root alors qu'une commande équivalente peut être lancée par un
+utilisateur normal (par exemple $netstat -ie au lieu de #ifconfig)
+
+Ce problème de l'utilisateur non root est pour l'instant contourné (par exemple
+en configurant sudo dès l'installation), mais il reste posé, et n'est jamais
+attaqué de front.
+
+Le fait que cette situation ne soit jamais évoquée est pour moi significative
+de l'utilisation faite de linux aujourd'hui : bien loin du grand public. Nous
+sommes tous ici des utilisateurs bidouilleurs, et ne voyons pas forcément une
+utilisation quotidienne d'un utilisateur standard. Je ne veux pas en faire une
+généralisation sur l'avenir de Linux et une remise en cause nécessaire. Je pose
+juste ici un constat sur une situation qui est pour moi, encore trop souvent
+invisible.
+
+
+.. [1] `Artisan Numérique » Se prémunir des "SpyWebs" avec Privoxy <http://artisan.karma-lab.net/node/1204>`_
+.. [2] `http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=557340 <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=557340>`_
diff --git a/content/Informatique/rst.rst b/content/Informatique/rst.rst
index 124f0d3..0bd15f1 100755
--- a/content/Informatique/rst.rst
+++ b/content/Informatique/rst.rst
@@ -6,6 +6,7 @@ Blogguer en rst sous wordpress
:date: 2010-10-04
:tags: Libre, reStructuredText
+:summary: |summary|
Le format reStructuredText_ est un langage de balise (un peu comme le HTML, ou
@@ -19,12 +20,15 @@ conservant des possibilités de formatage et d'export ?
Présentation de RST
===================
-Quand on écrit un article (par exemple ici cet article de blog), il est
-nécessaire d'indiquer des directives de mise en page : ceci est un paragraphe,
-ceci est un lien, inclure une image, une citation… Pour cela on ne passe pas
-par un logiciel de traitement de texte pour le faire (openOffice) : c'est lourd
-et cela n'apporte rien, mais la plupart du temps par un éditeur intégré au blog
-qui permet de formater notre texte.
+.. |summary| replace::
+ Quand on écrit un article (par exemple ici cet article de blog), il est
+ nécessaire d'indiquer des directives de mise en page : ceci est un
+ paragraphe, ceci est un lien, inclure une image, une citation… Pour cela on
+ ne passe pas par un logiciel de traitement de texte pour le faire
+ (openOffice) : c'est lourd et cela n'apporte rien, mais la plupart du temps
+ par un éditeur intégré au blog qui permet de formater notre texte.
+
+|summary|
Cet éditeur se charge pour nous de formater le texte en quelques clics. Le
problème est que bien souvent ce texte ne pourra pas sortir du blog (par
diff --git a/content/Informatique/rstodt.rst b/content/Informatique/rstodt.rst
index eb6ecc4..2f0b5b2 100755
--- a/content/Informatique/rstodt.rst
+++ b/content/Informatique/rstodt.rst
@@ -7,7 +7,9 @@ Coloration syntaxique avec rst2odt
:date: 2012-08-18
:tags: Libre, reStructuredText
-|logo|
+.. image:: http://farm4.staticflickr.com/3609/3325975129_a8e246dd20_s.jpg
+ :class: floatleft
+ :alt: Arbre
Le langage rst, déjà évoqué dans un `article précédent`_, possède plusieurs
formats sortie : pdf, odt, html, xml… Cependant, les outils pour générer la
@@ -50,7 +52,6 @@ Et voilà, ça s'utilise comme ça :
(Source de l'image : Kea_)
-.. |logo| image:: http://farm4.staticflickr.com/3609/3325975129_a8e246dd20_s.jpg
.. _article précédent: |filename|rst.rst
.. _rst2pdf: http://rst2pdf.ralsina.com.ar/
.. _ici: http://chimrod.com/downloads/rst2odt.py
diff --git a/content/Perso/net.rst b/content/Perso/net.rst
index dbe952d..b03d1b9 100755
--- a/content/Perso/net.rst
+++ b/content/Perso/net.rst
@@ -5,8 +5,10 @@ Le net en france
----------------
:date: 2009-02-25
+:tags: Humeur
-|HADOPI - Le Net en France : black-out|
+.. image:: http://media.laquadrature.net/Quadrature_black-out_HADOPI_468x60px.gif
+ :alt: Le Net en France: black-out
La quadrature du net lance un appel à la mobilisation contre le projet
de loi Hadopi qui vise à réguler le "piratage" sur le net. non seulement
@@ -47,5 +49,3 @@ Facilement car :
Avant qu'il ne soit interdit d'utiliser un logiciel non conforme,
essayons de préserver notre liberté et d'affirmer ce que nous défendons.
-
-.. |HADOPI - Le Net en France : black-out| image:: http://media.laquadrature.net/Quadrature_black-out_HADOPI_468x60px.gif
diff --git a/develop_server.sh b/develop_server.sh
new file mode 100755
index 0000000..d49f866
--- /dev/null
+++ b/develop_server.sh
@@ -0,0 +1,103 @@
+#!/usr/bin/env bash
+##
+# This section should match your Makefile
+##
+PELICAN=pelican
+PELICANOPTS=$pelicanopts
+
+BASEDIR=$(pwd)
+INPUTDIR=$BASEDIR/content
+OUTPUTDIR=$BASEDIR/output
+CONFFILE=$BASEDIR/pelicanconf.py
+
+DEVCONF=$BASEDIR/.pelican.py
+
+###
+# Don't change stuff below here unless you are sure
+###
+
+SRV_PID=$BASEDIR/srv.pid
+PELICAN_PID=$BASEDIR/pelican.pid
+
+function usage(){
+ echo "usage: $0 (stop) (start) (restart)"
+ echo "This starts pelican in debug and reload mode and then launches"
+ echo "A pelican.server to help site development. It doesn't read"
+ echo "your pelican options so you edit any paths in your Makefile"
+ echo "you will need to edit it as well"
+ exit 3
+}
+
+function alive() {
+ kill -0 $1 >/dev/null 2>&1
+}
+
+function shut_down(){
+ PID=$(cat $SRV_PID)
+ if [[ $? -eq 0 ]]; then
+ if alive $PID; then
+ echo "Killing pelican.server"
+ kill $PID
+ else
+ echo "Stale PID, deleting"
+ fi
+ rm $SRV_PID
+ else
+ echo "pelican.server PIDFile not found"
+ fi
+
+ PID=$(cat $PELICAN_PID)
+ if [[ $? -eq 0 ]]; then
+ if alive $PID; then
+ echo "Killing Pelican"
+ kill $PID
+ else
+ echo "Stale PID, deleting"
+ fi
+ rm $PELICAN_PID
+ else
+ echo "Pelican PIDFile not found"
+ fi
+}
+
+function start_up(){
+ echo "Starting up Pelican and pelican.server"
+
+ sed -e 's|SITEURL.*|SITEURL=\"http://localhost:8000\"|' -e 's|DISQUS_SITENAME.*||' $CONFFILE > $DEVCONF
+
+ shift
+ $PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $DEVCONF $PELICANOPTS &
+ pelican_pid=$!
+ echo $pelican_pid > $PELICAN_PID
+ cd $OUTPUTDIR
+ python -m pelican.server &
+ srv_pid=$!
+ echo $srv_pid > $SRV_PID
+ cd $BASEDIR
+ sleep 1
+ if ! alive $pelican_pid ; then
+ echo "Pelican didn't start. Is the pelican package installed?"
+ return 1
+ elif ! alive $srv_pid ; then
+ echo "pelican.server didn't start. Is the pelican package installed?"
+ return 1
+ fi
+ echo 'Pelican and pelican.server processes now running in background.'
+}
+
+###
+# MAIN
+###
+[[ $# -ne 1 ]] && usage
+if [[ $1 == "stop" ]]; then
+ shut_down
+elif [[ $1 == "restart" ]]; then
+ shut_down
+ start_up
+elif [[ $1 == "start" ]]; then
+ if ! start_up; then
+ shut_down
+ fi
+else
+ usage
+fi
diff --git a/pelicanconf.py b/pelicanconf.py
index d20f05c..68e654d 100755
--- a/pelicanconf.py
+++ b/pelicanconf.py
@@ -40,7 +40,9 @@ FILES_TO_COPY = (
('../extras/htaccess', '.htaccess'),
)
-from pelican.plugins import related_posts
-PLUGINS = [related_posts]
+PLUGIN_PATH = 'plugins'
+
+#from pelican.plugins import related_posts
+PLUGINS = ['related_posts']
SUMMARY_MAX_LENGTH=100
diff --git a/plugins/related_posts/__init__.py b/plugins/related_posts/__init__.py
new file mode 100644
index 0000000..c78861e
--- /dev/null
+++ b/plugins/related_posts/__init__.py
@@ -0,0 +1 @@
+from .related_posts import *
diff --git a/plugins/related_posts/related_posts.py b/plugins/related_posts/related_posts.py
new file mode 100644
index 0000000..4000e03
--- /dev/null
+++ b/plugins/related_posts/related_posts.py
@@ -0,0 +1,36 @@
+"""
+Related posts plugin for Pelican
+================================
+
+Adds related_posts variable to article's context
+"""
+
+from pelican import signals
+from collections import Counter
+
+
+def add_related_posts(generator):
+ # get the max number of entries from settings
+ # or fall back to default (5)
+ numentries = generator.settings.get('RELATED_POSTS_MAX', 5)
+
+ for article in generator.articles:
+ # no tag, no relation
+ if not hasattr(article, 'tags'):
+ continue
+
+ # score = number of common tags
+ scores = Counter()
+ for tag in article.tags:
+ scores += Counter(generator.tags[tag])
+
+ # remove itself
+ scores.pop(article)
+
+ article.related_posts = [other for other, count
+ in scores.most_common(numentries)]
+
+
+def register():
+ signals.article_generator_finalized.connect(add_related_posts)
+
diff --git a/theme/static/css/main.css b/theme/static/css/main.css
index c8c0a01..e8b773b 100755
--- a/theme/static/css/main.css
+++ b/theme/static/css/main.css
@@ -87,6 +87,10 @@ table.docutils {
border: none;
}
+table.footnote td {
+ border: none;
+}
+
td, th {
margin: 0;
padding: 2px 5px;
@@ -269,28 +273,6 @@ div#page {
font-weight: bolder;
}
-// aside#sidebar {
-// float: right;
-// width: 24%;
-// }
-// #sidebar .widget {
-// margin-bottom: 10px;
-// }
-// #sidebar .widget ul {
-// list-style-type: none;
-// margin: auto auto auto 15px;
-// }
-// #sidebar .widget ul li:before {
-// content: '» ';
-// }
-//
-// #sidebar .widget ul a.more {
-// display: inline-block;
-// padding-top: 5px;
-// text-decoration: none;
-// }
-
-
footer#footer {
clear:both;
border-top: 1px solid grey;
@@ -301,3 +283,8 @@ div#page {
direction:rtl;
unicode-bidi:bidi-override;
}
+
+.floatleft { float: left; margin: 0px 5px 5px 0px; }
+.floatright { float: right; margin: 0px 0px 5px 5px; }
+
+.clear { clear:both; }
diff --git a/theme/static/css/styles.css b/theme/static/css/styles.css
index ec426de..3ebca0b 100755
--- a/theme/static/css/styles.css
+++ b/theme/static/css/styles.css
@@ -1,25 +1,72 @@
#cssmenu ul, #cssmenu hr { margin: 0px; }
#cssmenu hr { margin: auto; }
-#cssmenu{ height:39px; display:block; padding:0; margin: 0; margin-left:10px; margin-right:10px; }
+#cssmenu {
+ height:39px;
+ display:block;
+ padding:0;
+ margin: 0; margin-left:10px; margin-right:10px;
+ border-color:#000;
+}
#cssmenu > ul {list-style:inside none; padding:0; margin:0;}
#cssmenu > ul > li {list-style:inside none; padding:0; margin:0; float:left; display:block; position:relative;}
-#cssmenu > ul > li > a{ outline:none; display:block; position:relative; padding:12px 20px; font: 13px/100% Arial, Helvetica, sans-serif; text-align:center; text-decoration:none; text-shadow:1px 1px 0 rgba(0,0,0, 0.4); }
-#cssmenu > ul > li:first-child > a{border-radius:5px 0 0 5px;}
-#cssmenu > ul > li > a:after{ content:''; position:absolute; border-right:1px solid; top:-1px; bottom:-1px; right:-2px; z-index:99; }
-#cssmenu ul li.has-sub:hover > a:after{top:0; bottom:0;}
-#cssmenu > ul > li.has-sub > a:before{ content:''; position:absolute; top:18px; right:6px; border:5px solid transparent; border-top:5px solid #fff; }
-#cssmenu > ul > li.has-sub:hover > a:before{top:19px;}
-#cssmenu ul li.has-sub:hover > a{ background:#3f3f3f; border-color:#3f3f3f; padding-bottom:13px; padding-top:13px; top:-1px; z-index:999; }
+
+#cssmenu > ul > li > span {
+ outline:none;
+ display:block;
+ position:relative;
+ padding:13px 20px;
+ font: 13px/100% Arial, Helvetica, sans-serif; text-align:center;
+ text-shadow:1px 1px 0 rgba(0,0,0, 0.4);
+ height: 13px;
+ border-right:1px solid #000;
+ color:#fff;
+}
+
+#cssmenu a {
+ color: #fff;
+}
+#cssmenu > ul > li > span > a {
+ text-decoration:underline;
+}
+
+#cssmenu > ul > li > span:after {
+ content:'';
+ position:absolute;
+ border-right:1px solid;
+ top:1px; bottom:0px;
+ right:-2px;
+ z-index:99;
+ border-color: #444;
+}
+
+#cssmenu ul li.has-sub:hover > span:after {top:0; bottom:0;}
+#cssmenu > ul > li.has-sub > span:before {
+ content:'';
+ position:absolute;
+ top:19px; right:6px;
+ border:5px solid transparent;
+ border-top:5px solid #fff;
+}
+
+#cssmenu > ul > li.has-sub:hover > span:before {top:19px;}
+#cssmenu ul li.has-sub:hover > span { background:#3f3f3f; padding-bottom:13px; padding-top:13px; top:0px; z-index:999; }
#cssmenu ul li.has-sub:hover > ul, #cssmenu ul li.has-sub:hover > div{display:block;}
-#cssmenu ul li.has-sub > a:hover{background:#3f3f3f; border-color:#3f3f3f;}
-#cssmenu ul li > ul, #cssmenu ul li > div{ display:none; width:auto; position:absolute; top:38px; padding:10px 0; background:#3f3f3f; border-radius:0 0 5px 5px; z-index:999; }
+#cssmenu ul li.has-sub > a:hover {background:#3f3f3f; border-color:#3f3f3f;}
+
+#cssmenu ul li > ul, #cssmenu ul li > div {
+ display:none; width:auto; position:absolute;
+ top:39px; padding:10px 0; background:#3f3f3f;
+ border-radius:0 0 5px 5px;
+ z-index:999;
+}
+
#cssmenu ul li > ul{width:200px;}
#cssmenu ul li > ul li{display:block; list-style:inside none; padding:0; margin:0; position:relative;}
-#cssmenu ul li > ul li a{ outline:none; display:block; position:relative; margin:0; padding:8px 20px; font:10pt Arial, Helvetica, sans-serif; color:#fff; text-decoration:none; text-shadow:1px 1px 0 rgba(0,0,0, 0.5); }
-
+#cssmenu ul li > ul li a{
+ outline:none; display:block; position:relative; margin:0;
+ padding:8px 20px; font:10pt Arial, Helvetica, sans-serif;
+ text-shadow:1px 1px 0 rgba(0,0,0, 0.5);
+ text-decoration:none;
+}
-#cssmenu, #cssmenu > ul > li > ul > li a:hover{ background-color:#323232; }
-#cssmenu{border-color:#000;}
-#cssmenu > ul > li > a{border-right:1px solid #000; color:#fff;}
-#cssmenu > ul > li > a:after{border-color:#444;}
-#cssmenu > ul > li > a:hover{background:#111;}
+#cssmenu, #cssmenu > ul > li > ul > li a:hover { background-color:#323232; }
diff --git a/theme/templates/archives.html b/theme/templates/archives.html
index f3c2990..f0441d9 100755
--- a/theme/templates/archives.html
+++ b/theme/templates/archives.html
@@ -3,7 +3,7 @@
{%block title %}{{ SITENAME }} - Archives{%endblock%}
{% block content %}
- <h2 class="page_title">Archives</h2>
+ <h1 class="page_title">Archives</h1>
<table id="archives">
<tbody>
{% for article in dates %}
diff --git a/theme/templates/article.html b/theme/templates/article.html
index 1328834..044c386 100755
--- a/theme/templates/article.html
+++ b/theme/templates/article.html
@@ -3,38 +3,40 @@
{% block title %}{{ SITENAME }} - {{ article.title |striptags }}{% endblock %}
{% block content %}
- <article class="post">
- <h1 class="page_title"><a href="{{ article.url }}">{{ article.title }}</a></h1>
- {%include 'meta.html'%}
+ <article class="post">
+ <h1 class="page_title"><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></h1>
+ {%include 'meta.html'%}
+
+ <section class="post_content">
+ {{ article.content }}
+ </section>
+
+ </article>
- <section class="post_content">
- {{ article.content }}
- </section>
+ {% if DISQUS_SITENAME %}
+ <div class="comments">
+ <h2>Commentaires&nbsp;:</h2>
+ <div id="disqus_thread"></div>
+ <script type="text/javascript">
+ var disqus_identifier = "{{ article.url }}";
+ (function() {
+ var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+ dsq.src = 'http://{{ DISQUS_SITENAME }}.disqus.com/embed.js';
+ (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+ })();
+ </script>
+ </div>
+ {% endif %}
- </article>
+ {% if article.related_posts and article.related_posts %}
- {% if DISQUS_SITENAME %}
- <div class="comments">
- <h2>Commentaires&nbsp;:</h2>
- <div id="disqus_thread"></div>
- <script type="text/javascript">
- var disqus_identifier = "{{ article.url }}";
- (function() {
- var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
- dsq.src = 'http://{{ DISQUS_SITENAME }}.disqus.com/embed.js';
- (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
- })();
- </script>
- </div>
- {% endif %}
+ <h2>&Agrave; lire aussi&nbsp;:</h2>
-{#
- {% if article.related_posts %}
<ul>
{% for related_post in article.related_posts %}
- <li>{{ related_post.url }}</li>
+ <li><a href="{{ SITEURL }}/{{ related_post.url }}">{{ related_post.title }}</a></li>
{% endfor %}
</ul>
{% endif %}
-#}
+
{% endblock %}
diff --git a/theme/templates/category.html b/theme/templates/category.html
index f476d93..b323285 100755
--- a/theme/templates/category.html
+++ b/theme/templates/category.html
@@ -2,7 +2,7 @@
{% block title %}{{ SITENAME }} - {{ category}}{% endblock %}
{% block content %}
- <h2 class="page_title">Articles dans la catégorie «{{ category }}»</h2>
+ <h1 class="page_title">Articles dans la catégorie «&thinsp;{{ category }}&thinsp;»</h1>
{% if articles %}
{% for article in (articles_page.object_list if articles_page else articles) %}
<article class="post">
@@ -11,6 +11,7 @@
<section class="post_content">
{{ article.summary }}
+ <div class="clear" />
{% if not loop.last %}
<hr>
{% endif %}
diff --git a/theme/templates/index.html b/theme/templates/index.html
index 245c708..d045910 100755
--- a/theme/templates/index.html
+++ b/theme/templates/index.html
@@ -5,11 +5,12 @@
{% if articles %}
{% for article in (articles_page.object_list if articles_page else articles) %}
<article class="post">
- <h2 class="title"><a href="{{ SITEURL }}/{{ article.url}}">{{ article.title }}</a></h2>
+ <h1 class="title"><a href="{{ SITEURL }}/{{ article.url}}">{{ article.title }}</a></h1>
<time class="meta" datetime="{{ article.date.isoformat() }}" pubdate="pubdate">{{ article.locale_date }}</time>
<section class="post_content">
{{ article.summary }}
+ <div class="clear" />
{% if not loop.last %}
<hr>
{% endif %}
diff --git a/theme/templates/menu.html b/theme/templates/menu.html
index 037d85a..bab98fa 100755
--- a/theme/templates/menu.html
+++ b/theme/templates/menu.html
@@ -1,6 +1,6 @@
{% macro submenu(elements, link, name) -%}
{% if elements %}
- <li class='has-sub'><a href="{{ SITEURL }}/{{link}}.html"><span>{{name}}</span></a>
+ <li class='has-sub'><span><a href="{{ SITEURL }}/{{link}}.html">{{name}}</a></span>
<ul>
{% for tag, articles in elements %}
<li><a href="{{SITEURL}}/{{tag.url}}"><span>{{ tag }}</span></a></li>
@@ -12,7 +12,7 @@
<div id="cssmenu">
<ul>
- <li class='has-sub'><a href="{{ SITEURL }}/">Articles</a>
+ <li class='has-sub'><span><a href="{{ SITEURL }}/">Articles</a></span>
<ul>
{% for article in articles %}
{% if loop.index < FEED_MAX_ITEMS %}
@@ -26,7 +26,7 @@
{{ submenu(categories, 'categories', 'Catégories') }}
- <li class='has-sub'><a href="{{ SITEURL }}/"><span>À lire</span></a>
+ <li class='has-sub'><span>À lire</span>
<ul>
{% for page in pages %}
<li><a href="{{SITEURL}}/{{page.url}}"><span>{{ page.title }}</span></a></li>
diff --git a/theme/templates/meta.html b/theme/templates/meta.html
index db36173..287f6b2 100755
--- a/theme/templates/meta.html
+++ b/theme/templates/meta.html
@@ -1,5 +1,12 @@
- <details class="meta">
- Publié le <time datetime="{{ article.date.isoformat() }}" pubdate="pubdate">{{ article.locale_date }}</time>
- {% if article.author %} par {{ article.author }}{% endif %} dans «<a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>».
- {% if article.tags %}Mots-clés: {% for tag in article.tags %}{%if loop.index > 1%}, {%endif%}<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>{% endfor %}</p>{% endif %}
- </details>
+<details class="meta">
+ Publié le <time datetime="{{ article.date.isoformat() }}" pubdate="pubdate">{{ article.locale_date }}</time>
+{# {% if article.author %} par {{ article.author }}{% endif %} #}
+ dans
+ «&thinsp;<a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>&thinsp;».
+ {% if article.tags %}
+ Mots-clefs&thinsp;:
+ {% for tag in article.tags %}{%if loop.index > 1%},{%endif%}
+ <a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>{% endfor %}
+ </p>
+ {% endif %}
+</details>
diff --git a/theme/templates/page.html b/theme/templates/page.html
index 1608771..114daea 100755
--- a/theme/templates/page.html
+++ b/theme/templates/page.html
@@ -1,6 +1,6 @@
{% extends "base.html" %}
-{% block title %}{{ page.title }}{% endblock %}
+{% block title %}{{ page.title | striptags }}{% endblock %}
{% block content %}
<h1 class="page_title"><a href="{{ SITEURL }}/{{ page.url }}">{{ page.title }}</a></h1>
{% if PDF_PROCESSOR %}<a href="{{ SITEURL }}/pdf/{{ page.slug }}.pdf">get
diff --git a/theme/templates/tag.html b/theme/templates/tag.html
index 49ed222..8282855 100755
--- a/theme/templates/tag.html
+++ b/theme/templates/tag.html
@@ -2,7 +2,7 @@
{% block title %}{{ SITENAME }} - «{{ tag }}»{% endblock %}
{% block content %}
- <h2 class="page_title">Articles avec le mot-clé «{{ tag }}»</h2>
+ <h1 class="page_title">Articles avec le mot-clef «&thinsp;{{ tag }}&thinsp;»</h1>
{% if articles %}
{% for article in (articles_page.object_list if articles_page else articles) %}
<article class="post">
@@ -11,6 +11,7 @@
<section class="post_content">
{{ article.summary }}
+ <div class="clear" />
{% if not loop.last %}
<hr>
{% endif %}