diff options
-rw-r--r-- | Makefile | 10 | ||||
-rwxr-xr-x | content/Informatique/awesome.rst | 25 | ||||
-rwxr-xr-x | content/Informatique/backup.rst | 18 | ||||
-rwxr-xr-x | content/Informatique/chiffrage.rst | 17 | ||||
-rwxr-xr-x | content/Informatique/chroot.rst | 21 | ||||
-rwxr-xr-x | content/Informatique/fail2ban.rst | 10 | ||||
-rwxr-xr-x | content/Informatique/invisible.rst | 149 | ||||
-rwxr-xr-x | content/Informatique/rst.rst | 16 | ||||
-rwxr-xr-x | content/Informatique/rstodt.rst | 5 | ||||
-rwxr-xr-x | content/Perso/net.rst | 6 | ||||
-rwxr-xr-x | develop_server.sh | 103 | ||||
-rwxr-xr-x | pelicanconf.py | 6 | ||||
-rw-r--r-- | plugins/related_posts/__init__.py | 1 | ||||
-rw-r--r-- | plugins/related_posts/related_posts.py | 36 | ||||
-rwxr-xr-x | theme/static/css/main.css | 31 | ||||
-rwxr-xr-x | theme/static/css/styles.css | 81 | ||||
-rwxr-xr-x | theme/templates/archives.html | 2 | ||||
-rwxr-xr-x | theme/templates/article.html | 52 | ||||
-rwxr-xr-x | theme/templates/category.html | 3 | ||||
-rwxr-xr-x | theme/templates/index.html | 3 | ||||
-rwxr-xr-x | theme/templates/menu.html | 6 | ||||
-rwxr-xr-x | theme/templates/meta.html | 17 | ||||
-rwxr-xr-x | theme/templates/page.html | 2 | ||||
-rwxr-xr-x | theme/templates/tag.html | 3 |
24 files changed, 421 insertions, 202 deletions
@@ -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 :</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 :</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>À lire aussi :</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 « {{ category }} »</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 + « <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a> ». + {% if article.tags %} + Mots-clefs : + {% 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 « {{ tag }} »</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 %} |