summaryrefslogtreecommitdiff
path: root/content/resources
diff options
context:
space:
mode:
authorSébastien Dailly <sebastien@chimrod.com>2014-10-04 16:59:06 +0200
committerSébastien Dailly <sebastien@chimrod.com>2014-10-04 16:59:06 +0200
commit2c3cf5179f16e8303ece57e3dbb191a46f3dcb85 (patch)
tree3d4ea31cd91388149ba43d3c8698c90532a51a59 /content/resources
parent19e71ce6cd7ca7540e0e004d180998e051c57402 (diff)
Moved resources to the blog site
Diffstat (limited to 'content/resources')
-rw-r--r--content/resources/backup.sh100
-rw-r--r--content/resources/ir_control_0.py118
-rw-r--r--content/resources/mymenu.lua67
-rw-r--r--content/resources/rstodt/article.rst185
-rw-r--r--content/resources/rstodt/rst2html-pygments.py55
-rw-r--r--content/resources/rstodt/rst2odt.py77
6 files changed, 602 insertions, 0 deletions
diff --git a/content/resources/backup.sh b/content/resources/backup.sh
new file mode 100644
index 0000000..aaf16f4
--- /dev/null
+++ b/content/resources/backup.sh
@@ -0,0 +1,100 @@
+#!/bin/sh
+###########################################################
+# This script uses rsync to backup directories on a media
+# (ex: USB disk) with a copy and incremental method.
+###########################################################
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+############################################################
+#
+# Written by Spip
+# Adapted by Chimrod
+# added script path detection
+# delete with find
+# Version 1.0
+#
+############################################################
+#to be nice...
+ionice -c3 -p$$
+renice +15 -p $$
+THEDATE=`date +%F_%Hh%M`
+#FILE=`dirname $0`
+FILE=`dirname "$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")"`
+LOGFILE=$FILE'/log/sauvegarde'
+
+SPLIT='====================================================================='
+#check logfile directory
+
+if ! [ -e $LOGFILE ]
+then
+ /bin/mkdir -p $LOGFILE
+fi
+
+#check if the media is mounted
+
+if ! [ -e $FILE ]
+then
+ echo "$THEDATE : péripherique non connecté. Pas de sauvegarde possible" >> "$LOGFILE/save.log"
+ echo $SPLIT >> "$LOGFILE/save.log"
+ exit 0
+fi
+
+#prevent a second task
+LOCKFILE="/var/lock/sauvegarde.lock"
+[ -f $LOCKFILE ] && exit 0
+
+#if the script are stoped, remove lockfile
+trap "rm -f $LOCKFILE" EXIT
+touch $LOCKFILE
+echo "$THEDATE : Début de sauvegarde" >> "$LOGFILE/save.log"
+# $1:time to keep files; $2: name of the backup; $3: target
+
+function save() {
+
+ echo "$SPLIT" >> "$LOGFILE/$2.log"
+ echo "$THEDATE" >> "$LOGFILE/$2.log"
+
+ #Incremental & copie
+ INC="$FILE/$2/INC/$THEDATE"
+ BAK="$FILE/$2/BAK"
+ TOSAVE="$3"
+ mkdir -p $INC
+
+ if ! [ -e "$BAK" ]
+ then
+ /bin/mkdir -p "$BAK"
+ fi
+
+ #a: archivage :recurcif, preserve dates, persmissions, groupes...
+ #v: verbose mode
+ #delete : supprime les fichiers n'etant plus chez l'émeteur >> copie conforme.
+ /usr/bin/rsync -a --stats --delete --backup --backup-dir="$INC" "$TOSAVE" "$BAK" >> "$LOGFILE/$2.log"
+
+ cd $FILE/$2/INC
+ tar -czvf "$INC.tar.gz" "$THEDATE"
+ echo tar -czvf "$INC.tar.gz" "$FILE/$2/INC/$THEDATE"
+ rm -rf "$THEDATE"
+ #Remove the file older than $1 days
+ find "$FILE/$2/INC" -mtime +$1 -delete >> "$LOGFILE/save.log"
+
+}
+
+#List here all repositories to backup
+
+save 90 etc /etc/
+
+#to log the end of the backup
+THEDATE=`date +%F_%Hh%M`
+echo "$THEDATE : Sauvegarde effectuée" >> "$LOGFILE/save.log"
+exit 0
diff --git a/content/resources/ir_control_0.py b/content/resources/ir_control_0.py
new file mode 100644
index 0000000..dfce76a
--- /dev/null
+++ b/content/resources/ir_control_0.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import cwiid
+
+## Configuration
+#wiimote_hwaddr = '' # Use your address to speed up the connection proccess
+wiimote_hwaddr = '00:1F:C5:5A:8C:69'
+
+def connect(wm_addr = ''):
+ '''Connects and syncs with a wiimote
+ wm_addr - Is a string representing the hwaddr of the wiimote we will try to
+ connect, or none to try to connect with any discoverable device
+ for example "00:19:1D:5D:5D:DC"'''
+
+ pygame.display.flip() # called now because cwiid.Wiimote is a blocking call
+
+ # This could be done in a thread to allow pygame to draw while searching
+ # but this is only a test
+ try:
+ return cwiid.Wiimote(wm_addr)
+ except:
+ print "Error conectando con wiimote " + str(wm_addr)
+
+
+def wmplugin_init(id, wiimote_arg):
+ #global wiimote
+
+ #wiimote = wiimote_arg
+ wmplugin.set_rpt_mode(id, cwiid.RPT_IR | cwiid.RPT_BTN)
+ return
+
+def wmplugin_info():
+ return [], \
+ [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0), \
+ ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)], \
+ []
+
+def wmplugin_exec(messages, buton=[0]):
+ '''Wiimote callback managing method
+ Recieves a message list, each element is different, see the libcwiid docs'''
+ x = y = 0
+
+ for msg in messages:
+
+ if msg[0] == cwiid.MESG_BTN:
+ # msg is of the form (cwiid.MESG_BTN, cwiid.BTN_*)
+ buton[0] = msg[1]
+
+ if msg[0] == cwiid.MESG_IR:
+ if screen:
+ # red dot for the sources
+ [screen.fill((255, 0, 0), (point, (4, 4))) \
+ for point in ir_sensor.get_positions_points(msg)]
+
+ if buton[0] & cwiid.BTN_B == 0 :
+ x, y = (0, 0)
+
+ return [], (x, y)
+
+if __name__ == '__main__':
+ import pygame
+ from pygame.locals import *
+ runing = 0
+ def handle_events():
+ '''Typical event handling via pygame'''
+ for event in pygame.event.get():
+ if event.type == QUIT:
+ return 0
+ elif event.type == KEYUP:
+ if event.key == K_ESCAPE:
+ return 0
+ elif event.key == K_SPACE:
+ canvas.fill((0, 0, 0), ((0, 0), canvas.get_size()))
+ return 1
+
+ pygame.init()
+ pygame.display.set_caption('Wiimote IR test')
+ window = pygame.display.set_mode((cwiid.IR_X_MAX, cwiid.IR_Y_MAX), DOUBLEBUF)
+ screen = pygame.display.get_surface()
+ canvas = pygame.Surface(screen.get_size()) # persistent drawing here
+ canvas = canvas.convert()
+
+ wm = None # our wiimote
+ clock = pygame.time.Clock()
+ runing = 1
+ while(runing):
+ clock.tick(100)
+ runing = handle_events()
+ if not wm:
+ wm = connect(wiimote_hwaddr)
+ if not wm:
+ continue
+ # each message will contain info about ir and buttons
+ wm.rpt_mode = cwiid.RPT_IR | cwiid.RPT_BTN # | cwiid.RPT_STATUS
+ # tell cwiid to use the callback interface and allways send button events
+ wm.enable(cwiid.FLAG_MESG_IFC
+ #| cwiid.FLAG_NONBLOCK
+ | cwiid.FLAG_REPEAT_BTN)
+
+ # specify wich function will manage messages AFTER the other settings
+ wm.mesg_callback = wmplugin_exec
+
+ # quick check on the wiimote
+ print "Got Wiimote!"
+ st = wm.state
+ for e in st:
+ print str(e).ljust(8), ">", st[e]
+
+ screen.blit(canvas, (0, 0))
+ pygame.display.flip()
+
+ if wm:
+ wm.close()
+else:
+ #This code is used as a plugin for cwiid, we import the wminput system
+ import wmplugin
+ screen = None
diff --git a/content/resources/mymenu.lua b/content/resources/mymenu.lua
new file mode 100644
index 0000000..b3e5be4
--- /dev/null
+++ b/content/resources/mymenu.lua
@@ -0,0 +1,67 @@
+-- Menu d'application
+
+local awbeautiful = require("beautiful")
+local awful = require("awful")
+local capi = {
+ screen = screen,
+}
+
+local function getStickyIcon(client)
+ if client.sticky then
+ return awbeautiful.get().titlebar_sticky_button_focus_active
+ end
+ return awbeautiful.get().titlebar_sticky_button_focus_inactive
+end
+
+local function getOnTopIcon(client)
+ if client.ontop then
+ return awbeautiful.get().titlebar_ontop_button_focus_active
+ end
+ return awbeautiful.get().titlebar_ontop_button_focus_inactive
+end
+
+function newAppMenu(client)
+ local data = {}
+ local myAppMenu = {}
+
+ local args = {}
+ args.keygrabber = true
+
+ -- Insert the ontop entry
+ -- When onTop is selelected, set in floating mode too
+ table.insert(myAppMenu, {"On Top", function()
+ -- We do not use floating.togle() but syncronize the floating on top value
+ awful.client.floating.set( client, not client.ontop )
+ client.ontop = not client.ontop
+ end , getOnTopIcon(client)} )
+
+ -- Insert the Sticky entry
+ table.insert(myAppMenu, {"Sticky", function() client.sticky = not client.sticky end , getStickyIcon(client)} )
+
+ -- Insert the Hide entry
+ if not client.minimized then
+ table.insert(myAppMenu, {"Minimize", function() client.minimized = true end } )
+ end
+ table.insert(myAppMenu, {"Close", function() client:kill() end, awbeautiful.get().titlebar_close_button_focus } )
+
+ -- Add the move to tag entry
+ local moveToTag = {}
+ local tags = capi.screen[1]:tags()
+ for i = 1, #tags do
+ -- We do not show the curent client tags
+ local isInTag = false
+ local clientTag = tags[i]:clients()
+ for j = 1, #clientTag do
+ isInTag = isInTag or clientTag[j] == client
+ end
+ if not isInTag then
+ table.insert(moveToTag, {tags[i].name, function() awful.client.movetotag(tags[i], client) end } )
+ end
+ end
+ table.insert(myAppMenu, {"Move To", moveToTag } )
+
+ data.menu = awful.menu.new( { items = myAppMenu} )
+ data.menu:show(args)
+
+ return data
+end
diff --git a/content/resources/rstodt/article.rst b/content/resources/rstodt/article.rst
new file mode 100644
index 0000000..3e8001f
--- /dev/null
+++ b/content/resources/rstodt/article.rst
@@ -0,0 +1,185 @@
+.. -*- mode: rst -*-
+.. -*- coding: utf-8 -*-
+
+Blogguer en rst sous wordpress
+##############################
+
+:tags: Libre, reStructuredText
+:summary: |summary|
+
+.. default-role:: literal
+
+Le format reStructuredText_ est un langage de balise (un peu comme le HTML, ou
+le laTex), issu du monde de la programmation. Son but est de répondre au
+problème suivant : comment écrire du texte simplement et sans avoir besoin
+d'apprendre une syntaxe spécifique (ou du moins un minimum), tout en
+conservant des possibilités de formatage et d'export ?
+
+.. _reStructuredText : http://docutils.sourceforge.net/rst.html
+
+Présentation de RST
+===================
+
+.. |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
+exemple pour prendre un extrait de l'article et l'utiliser ailleurs, nous
+sommes obligés de passer à nouveau par cette interface)
+
+Une autre solution est de rédiger notre texte directement dans le format de
+sortie (par exemple HTML), mais cela nécessite de connaître la syntaxe, et ne
+rend pas la lecture du fichier source très lisible (essayez de lire un article
+de presse en HTML avec un éditeur de texte pour voir…)
+
+Le format reStructuredText se veut être une réponse à ces problèmes : un
+fichier RST est lisible (le fichier source est compréhensible et peut être lu
+directement), ne nécessite pas de connaissances particulières (du moins peu), et
+à l'avantage de pouvoir être exporté dans de nombreux format de sortie (odt,
+pdf, latex, html…) On dispose donc d'un format unique pouvant servir à écrire
+des articles de blog, des documents de travail, ou encore de la documentation.
+
+La syntaxe est très simple, et ne charge pas le document à la lecture. Par
+exemple pour voir le document ayant servi à générer cet article est disponible
+ici_ : on laisse des lignes blanches pour indiquer que l'on passe d'un
+paragraphe à un autre, ou « souligne » avec les caractères = _ ou - les titres
+et les sous-titres, et le résultat donne un document très aéré et agréable à
+travailler.
+
+.. _ici : {filename}/resources/rstodt/article.rst
+
+Plugin wordpress
+================
+
+Il existe un plugin wordpress qui permet d'utiliser ce format pour l'écriture
+de documents dans le blog. À chaque fois que l'on va publier un article, le
+plugin va tester si le fichier est au format rst, et dans ce cas, va en faire
+la conversion en html en passant par la commande `rst2html`.
+
+**Attention**, pour le mettre en place, il est
+nécessaire d'avoir un accès à la machine pour y installer quelques
+applications.
+
+Pré-requis
+----------
+
+Python doit être disponible sur la machine, ainsi que le script `rst2html` (je
+ne pense pas que cela soit le cas pour les blogs hébergés et cela limite les
+possibilités).
+
+.. code-block:: console
+
+ $ sudo aptitude install python-docutils
+
+Installation
+------------
+
+Il s'agit juste d'un fichier à installer dans le répertoire des plugin de
+wordpress. Celui-ci est disponible sur launchpad_ et ne pose aucun problème de
+compatibilité.
+
+.. _launchpad : http://bazaar.launchpad.net/~gldnspud/rest-wordpress/trunk/files
+
+Le fichier README explique comment l'installer et le paramétrage à faire; les
+options (comme le chemin vers `rst2pdf`) se font directement dans le fichier php.
+
+.. code-block:: php startinline=True
+
+ // Set this to the prefix of your docutils installation.
+ $prefix = "/usr/local";
+
+ // Set this to the path of rst2html.py
+ $rst2html = "$prefix/bin/rst2html.py";
+
+Un petit test devrait montrer le résultat tout de suite. Dans le cas où le
+contenu est vide, regardez les logs d'erreur du serveur web, vous devriez y
+trouver les causes de votre erreur.
+
+Coloration syntaxique
+---------------------
+
+Il est possible de disposer de la coloration syntaxique automatique du code :
+
+.. code-block:: python
+
+ import os
+ # Standard hello world stuff
+ class Hello()
+ def do_it(self)
+ print "Hello world"
+
+ if __name__ == '__main__':
+ Hello().do_it()
+
+ def main()
+ print "Hello world"
+
+Pour intégrer la coloration syntaxique, il faut passer par pygment (un
+programme python qui s'occupe de ça) :
+
+.. code-block:: console
+
+ # aptitude install python-pygments
+
+Ensuite il va falloir modifier le script à lancer. En effet, par défaut, la
+commande `rst2pdf` n'intègre pas la coloration de code. Nous allons donc devoir
+modifier la commande à exécuter pour le faire (j'ai mis à disposition le script
+à télécharger_). Assurez-vous que le script peut être exécuté par l'utilisateur
+lancé par le service web.
+
+.. _télécharger : {filename}/resources/rstodt/rst2html-pygments.py
+
+La CSS n'est pas inclue dans le document et peut être définie à l'extérieur. Il
+est possible de définir son style à partir de pygment avec la commande suivante
+(pour appliquer le style tango) :
+
+.. code-block:: console
+
+ $ pygmentize -S tango -f html > style.css
+
+Conclusion
+==========
+
+Je cherchais depuis un petit moment une solution pour pouvoir écrire mes
+articles sans me connecter au blog. Les applications clientes ne me convenant
+pas tout à fait, le RST me permet d'utiliser une application totalement séparée
+du blog (par exemple VIM) et un format pérenne.
+
+Je ne sais pas s'il existe une solution équivalente pour les autres moteurs de
+blog, le RST étant encore un format assez jeune, et n'est pas encore très
+répandu…
+
+Sans être aussi complet que le latex, il est bien plus souple et
+beaucoup plus facile à utiliser. De plus il s'agit bien sûr d'un format
+ouvert, pouvant générer des documents sous openOffice, en PDF, voire en latex
+pour ceux qui veulent…
+
+Édit (29/05/11)
+===============
+
+Je reviens sur le plugin en constatant que par défaut, celui-ci met en cache le
+contenu de l'article, même si celui-ci est déjà en html. Une petite
+modification dans le code permet de ne sauvegarder le fichier que s'il s'agit
+d'un fichier rst :
+
+Rechercher dans le script la chaîne suivante :
+
+.. code-block:: php
+
+ if ($pos === false) {
+ // No modeline.
+ $rval = wpautop($text);
+
+Et rajouter la ligne suivante en dessous :
+
+.. code-block:: php
+
+ return $rval;
diff --git a/content/resources/rstodt/rst2html-pygments.py b/content/resources/rstodt/rst2html-pygments.py
new file mode 100644
index 0000000..7e2a826
--- /dev/null
+++ b/content/resources/rstodt/rst2html-pygments.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from docutils.core import publish_cmdline
+
+# Define a new directive `code-block` that uses the `pygments` source
+# highlighter to render code in color.
+#
+
+from docutils import nodes
+from docutils.parsers.rst import directives, Directive
+from pygments import highlight
+
+from pygments.lexers import get_lexer_by_name, TextLexer
+from pygments.formatters import HtmlFormatter
+
+INLINESTYLES = False
+pygments_formatter = HtmlFormatter()
+DEFAULT = HtmlFormatter(noclasses=INLINESTYLES,linenos="table")
+VARIANTS = {}
+
+class Pygments(Directive):
+ """ Source code syntax hightlighting.
+ """
+ required_arguments = 1
+ optional_arguments = 1
+ final_argument_whitespace = True
+
+ has_content = True
+ linenos=1
+
+ def run(self):
+ dic = {}
+
+ # On crée un dictionnaire à partir des options
+ for options in self.arguments[1:]:
+ clef, arg = options.split("=")
+ dic[clef] = arg
+
+ self.assert_has_content()
+ try:
+ lexer = get_lexer_by_name(self.arguments[0], **dic)
+ except ValueError:
+ # no lexer found - use the text one instead of an exception
+ lexer = TextLexer()
+ # take an arbitrary option if more than one is given
+ formatter = self.options and VARIANTS[self.options.keys()[0]] or DEFAULT
+ parsed = highlight(u'\n'.join(self.content), lexer, formatter)
+ return [nodes.raw('', parsed, format='html')]
+
+
+directives.register_directive('code-block', Pygments)
+
+publish_cmdline(writer_name='html')
+
diff --git a/content/resources/rstodt/rst2odt.py b/content/resources/rstodt/rst2odt.py
new file mode 100644
index 0000000..f1f107f
--- /dev/null
+++ b/content/resources/rstodt/rst2odt.py
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+
+# $Id: rst2odt.py 5839 2009-01-07 19:09:28Z dkuhlman $
+# Author: Dave Kuhlman <dkuhlman@rexx.com>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A front end to the Docutils Publisher, producing OpenOffice documents.
+"""
+
+try:
+ import locale
+ locale.setlocale(locale.LC_ALL, '')
+except:
+ pass
+
+from docutils.core import publish_cmdline_to_binary, default_description
+from docutils.writers.odf_odt import Writer, Reader
+
+from docutils.parsers.rst.roles import set_classes
+
+from docutils import nodes
+from docutils.parsers.rst import directives, Directive
+
+
+description = ('Generates OpenDocument/OpenOffice/ODF documents from '
+ 'standalone reStructuredText sources. ' + default_description)
+
+class Codeblock(Directive):
+ """ Source code syntax highlighting.
+ """
+ required_arguments = 1
+ optional_arguments = 1
+ final_argument_whitespace = True
+
+ has_content = True
+ linenos=1
+
+ directives = {":include:": lambda self, *args, **kwargs : self.include(*args, **kwargs)}
+
+ def include(self, param):
+ """ Include a file and return it as a content.
+ """
+ try:
+ self.content = unicode(open(param, 'r').read(), "utf-8").split("\n")
+ except IOError:
+ self.content = ("FileNotFound",)
+
+ def run(self):
+ for argument in self.arguments:
+ directives = argument.split(" ")
+ processor = self.directives.get(directives[0], None)
+ if processor is None:
+ continue
+ processor(self, directives[1])
+
+ set_classes(self.options)
+ self.assert_has_content()
+ text = '\n'.join(self.content)
+ text_nodes, messages = self.state.inline_text(text, self.lineno)
+ node = nodes.literal_block(text, '', *text_nodes, **self.options)
+ node.line = self.content_offset + 1
+ self.add_name(node)
+ node.attributes['language'] = self.arguments[0]
+
+ return [node] + messages
+
+
+directives.register_directive('code-block', Codeblock)
+
+
+writer = Writer()
+reader = Reader()
+output = publish_cmdline_to_binary(reader=reader, writer=writer,
+ description=description)
+
+