Archives 2018
Friday, 05 October 2018
|
Écrit par
Grégory Soutadé

Logo Odyssea

Deuxième édition sur le front de mer, non loin du célèbre tapis rouge. Ce sera le dernier week-end d'octobre rose, à savoir le dimanche 28 octobre 2018. Les formules sont inchangées. Dans l'ordre de départ :

  • 10km course, départ 9h
  • 1km enfant, départ 11h
  • 5km marche/course, départ 11h15

Idem côté tarif (15€, 12€ et 4€) avec un supplément de 3€ pour ceux qui s'inscrivent sur place. L'objectif étant d'atteindre 3000 participants (2200 l'année dernière). Le circuit étant tout plat, il est accessible au plus grand nombre.

Attention à ne pas oublier son certificat médical pour la première course !

Retour : Changement radical par rapport à l'édition précédente. C'est avec un temps froid et humide que l'on a été accueilli tôt le matin par les bénévoles. Une légère bruine s'ensuit. Mais qui est réveillé à 8h30 un dimanche matin ? Apogée au top du départ du 10km avec une averse bien de chez nous ! Il faudra attendre un petit quart d'heure pour qu'elle se dissipe et profiter enfin de quelques éclaircies. Bref, si les concurrents du 5km ont été épargnés, le temps maussade en aura rebuté quelques un. D'un point de vue purement comptable, 100 personnes de moins se sont inscrites (2100 contre 2200), mais l'objectif des 15 000€ récoltés a été tenu (15 500€ en tout, -500€ par rapport à 2017). Personnellement, j'ai gagné 1'45 (45'49, 103/566), mais ça reste toujours 25" de trop par rapport à l'objectif que je m'étais fixé !! Il va falloir encore travailler pour l'année prochaine !

Friday, 17 August 2018
|
Écrit par
Grégory Soutadé

Il y a un an (déjà), j'avais publié un article faisant echo au "jour du dépassement" paru (entre autres) dans le journal Le Monde. Un an plus tanousrd, Apple s'apprête à sortir trois nouveaux modèles d'iPhone, le feu ravage la Californie, le Portugal, la Suède, la Grêce. L'année précédente a été particulièrement sèche, ce qui a permis aux glaces de fondre en abondance amenant toute une série d'inondations dans le nord de la France durant le printemps. Quant au "jour du dépassement", il est arrivé un jour plus tôt.

Bref, la situation n'est pas bien engagée et les occasions de renverser cette tendance s'amenuisent dangereusement pour atteindre un niveau critique. Une fois passés la coupe du monde, le tour de France et l'affaire Benalla, une série d'articles publiés dans la presse générale m'a fait découvrir la websérie [ NEXT ] crée par Clément Montfort. Il n'en est pas à son coup d'essai, puisqu'il a déjà réalisé des documentaires comme "La guerre des graines" et "Soigneurs de terres" diffusés sur les chaînes nationales.

Jusque dans les années 2000, l'écologie c'était un truc de bobo. Vers 2005 elle a pris plus d'importance aux yeux du grand public avec des chiffres qui commençaient à faire froid dans le dos. Il faut dire que grâce à internet, l'information circule plus rapidement et touche plus de personnes. En 2018, nous sommes dans la phase suivante. Point de départ de la websérie : le livre de Pablo Servigne et Raphaël Stevens. Bien qu'existant depuis les années 70 et le célèbre rapport du "Club de Rome", ils définissent un nouveau courant intellectuel qu'est la "collapsologie" ou "science de l'effondrement" décrivant comment et pourquoi une société s'effondre. Le modèle est similaire depuis une simple société de quelques individus perdus au milieu de l'océan Pacifique jusqu'à l'échelon planétaire.

Ce qui faisait jadis froid dans le dos résonne désormais comme une onde de choc qui lamine les âmes de l'auditorium. Il faut du temps pour l'accepter et s'en remettre. Car au-delà de la peur individuelle de la mort, aucun être vivant n'est préparé au concept de disparition pure et simple de ce que nous avons vu de nos propres yeux et qui nous semble immortel : la transformation d'une planète vivante en un gros cailloux stérile. L'épisode le plus intéressant est l'interview de Cyril Dion réalisateur de "Tomorrow"/"Demain". Je ne suis pas tout à fait d'accord sur certaines causes évoquées dans cette interview, mais les conséquences seront les mêmes.

Si un danger venant de l'extérieur permettrait de mobiliser chaque individualité dans un combat, ce n'est malheureusement pas le cas pour un danger venant de l'intérieur et représenté par chacun. Pour autant, la seule issue possible est collective. Ça ne sert à rien de se cacher au fin fond de la forêt et tenter de vivre en autarcie. Nous avons besoin de vivre en société et partager le travail si l'on veut espérer avoir une vie un tant soit peu descente. Se cacher c'est tomber dans la survie. D'une part, elle ne durera pas bien longtemps et d'autre part, cela n'arrêtera pas les bouleversements écologiques en approche.

Le problème est constitué de la somme des individualités, il faut donc agir sur ce point pour s'en sortir. Et l'on ne peut pas demander à son prochain de faire des efforts si nous ne commençons pas à le faire nous-mêmeŝ : il faut initier le mouvement pour être suivi. Pour cela, il est nécessaire de prendre des initiatives individuelles, mais aussi d'avoir un cadre législatif favorable afin d'orienter les industriels et proposer de vraies alternatives au mode de consommation actuel.

Un triste détail apparaît dans la série. M. Édouard Philippe, premier ministre (autrement dit chef du gouvernement) de la 7e économie mondiale cite régulièrement dans ses conférences à connotation environnementales le livre "Effondrement"/"Collapse" de Jared Diamond. Autrement dit, la personne responsable de notre avenir collectif, mais également celle qui a le pouvoir de changer réellement les choses ne prend pas les mesures à la hauteur des événements qui se profilent. Certes, quelques mesurettes sont prises çà et là, malheureusement insuffisantes et avec des délais d'applications à 2 ou 3 ans. De ses propres paroles : "une société qui ne se transforme pas prend le risque de s'effondrer". Force est de constater que l'immense majorité des personnes adultes censées être responsables (les 30 ans et plus) ne sont pas capable d'auto-régulation. Ce que nous avons fait depuis 50 ans qui est de miser sur le couple intelligence individuelle et progrès technique comme solution absolue est un échec.

Nous savons que le modèle économique actuel n'est pas viable ou le serait pour une population de quelques centaines de millions d'habitants tout au plus (et pas 7 milliards). Aujourd'hui, les centres de productions sont déportés sur la planète entière et les centres de consommation sont regroupés dans les zones urbaines. L'équilibre repose sur la capacité de fournir de l'énergie électrique pour faire fonctionner l'ensemble des machines qui nous entourent ainsi que d'assurer l'interconnexion des centres avec de l'énergie fossile. Le jour où cet équilibre est rompu, soit à cause d'un défaut externe (maladie, guerre, crise économique majeure), soit par un tarissement des ressources (effondrement en cascade de la biodiversité entraînant un défaut d'alimentation global, fin de la ressource pétrole), l'ensemble du monde industrialisé s'effondrera comme un château de carte. Les villes confortables (en France, 80% de la population habite en zone urbaine) qui auront été construites deviendront des pièges mortels sur fond de guerre civile pour la survie. Il ne sera pas possible d'enlever le béton pour y faire pousser des patates. Le pétrole, c'est le sang du monde moderne, lorsqu'il n'arrive plus à un organe, ce dernier meurt. Pourtant, nous continuons d'accélérer la croissance de ces unités rendant un retour en arrière chaque jour un peu plus difficile. Il serait temps d'ouvrir enfin les yeux, car il y a urgence.

Différents scénarios sont envisagés de part l'incertitude du facteur humain, du nombre gigantesque de variables dans l'équation, ainsi que du degré de confiance dans la capacité de résilience du monde vivant. En omettant le facteur de la fin du pétrole, selon les prévisions actuelles, les mécanismes irréversibles d'éffondrement écologiques dûs à la pollution et au réchauffement global de l'atmosphère devraient s'engager entre 2020 et 2030. Autant dire demain. Il n'y a qu'à voir les progrès que nous avons réalisés depuis 10 ans (~ 2007/2008) pour comprendre à quel point nous sommes lents à évoluer. Même en ayant des doutes sur certaines théories catastrophes extrêmes, il faut reconnaître que les signes d'une dégradation environnementale globale sont bien présents : tempêtes, ouragans, sécheresses, pollution atmosphérique, pollution des cours d'eau...

Ceux qui auraient aimés vivre (ou revenir) au temps des dinosaures pour voir comment c'était "avant", n'auront qu'à attendre un petit peu pour apprécier ce que des derniers ont pu ressentir lors de leur extinction.

C'est triste à dire, mais aujourd'hui, le seul moyen viable et humain pour limiter la sur-consommation des ressources naturelles reste d'imposer des quotas. Quotas sur tous les produits manufacturés, plus ou moins importants selon le degré d'utilisation des ressources naturelles (transport inclus) et de rejet de polluants. Quotas sur l'utilisation des climatisations individuelles. Quotas sur les transports de personnes (avions, bateaux, véhicules motorisés). Quotas sur l'importation de pétrole. Quotas sur la production d'énergie... Quotas lissés sur l'année pour éviter des périodes sèches trop importantes. Sans oublier les restrictions afférentes. L'imposition de créer des contenants ré utilisables et l'obligation faite aux industriels de les ré utiliser. Il faut également intégrer toutes ces problématiques environnementales dans le programme de l'éducation nationale et ce, dès le plus jeune âge, ainsi que faire de grandes campagnes de sensibilisation pour le grand public.

En ce qui concerne les produits audiovisuels diffusés gratuitement sur internet, j'ai plutôt tendance à payer si celui-ci me convient. Néanmoins, vu l'urgence de la situation actuelle et, parce qu'avec une contribution même minime de chacun, on arrive à faire de grandes choses, je participe à la campagne Tipee de la web série [ NEXT ], car il est important d'être informé. Nous connaissons les problèmes et les efforts à fournir pour redresser la situation. Chacun prendra ses responsabilités vis-à-vis de son avenir et de celui de ses enfants.

Monday, 06 August 2018
|
Écrit par
Grégory Soutadé

Here is a simple tip to use keyctl in a bash script. keyctl is a wrapper for Linux kernel key management interface. It allows to securely save data in kernel memory. The man documentation is very bigcomplete but I didn't find any example on internet. What I initially wanted to do is to safely store a password entered by user inside a bash shell script and keep private to it (don't share with other processes).

Basically the script looks like :

#!/bin/bash

password=SecretPassword

keyctl new_session > /dev/null
keyid=`keyctl add user mail $password @s`
keyctl show
# echo "KEYID $keyid"
keyctl print $keyid

The first thing to do is to create a new session (to detach the current shared one).

Then we will add the password in the new item "mail". We don't have other choice to set type to "user". The item will be placed into the session keyring (@s). We could create new keyrings to store it with keyctl newring command. The command return item id as a big integer. We can use this integer or its name "%user:mail" for further references.

There is also a command keyctl padd which read data from stdin, but I don't recommend to use it as data is displayed in clear on the terminal.

Finally we show keyring information and print our password. We use print command to have an human friendly output, keyctl read command display it in hex format...

Saturday, 04 August 2018
|
Écrit par
Grégory Soutadé

Gâteau 8 ans

Une bougie de plus pour le blog ! L'occasion de faire un nouveau bilan. Comme chaque année, le temps passe vite et le temps libre devient une ressource rare, dispersée entre le travail professionnel et les multiples activités. Du coup, ce sont les projets informatiques qui prennent du retard. J'ai particulièrement en tête la sortie de Pannous qui a pas mal traînée.

Contrairement à ce que j'avais pré annoncé l'année passée, il n'y a toujours pas de support IPv6, mais ça devrait être réglé d'ici la fin de l'année ! Si on regarde les statistiques, elles sont plutôt stables, avec un pic de connexions en janvier grâce mon vieil article fétiche : 1 message service reçu. La bande passante a bien diminuée car moins de photos en première page. Certes, il y a un petit peu moins d'articles publiés, mais certains sont vraiment conséquents et, même s'ils n'apparaissent pas dans le top 10, j'en suis assez fier. En parlant de chiffres et de fierté, à l'occasion du correctif 0.8.2 de gPass, j'ai jeté un oeil (par hasard) sur les statistiques d'utilisation de l'addon Chrome. Et quelle ne fût pas ma surprise de voir une moyenne de 168 utilisateurs quotidiens + une douzaine sur Firefox ! C'est un chiffre impressionant pour un projet sans pub (mis à part sur le blog), auto hébergé, sans instance centrale et à l'esthétique un peu vieillot (c'est à ça que l'on reconnaît la sécurité).

Les statistiques pour cette année (entre parenthèses, les années précédentes) :

  • 22 articles publiés (30, 31, 34, 49, 50, 60, 60)
  • 9 580 visites (9 510, 23 800, 21 300, 25 000, 12 000, 18 000, 9 000)
  • 12.5 Go de données envoyées (17, 17,9, 9, 5.5, 2.7, 2.5)
  • 19 887 pages affichées (20 180, 26 700)

Le fameux top 10 qui cumule pour cette année 38% des visites (en gras, consultation principalement pour les images. Entre parenthèses, l'année de publication) :

On notera deux entrées : l'astuce pour windows et la revue du Canon EOS M10 de janvier 2017 !

Quid de l'avenir ? Pas d'annonce cette année, ni de projet particulier à mener. Je pense avoir atteint un rythme de croisière et j'espère faire aussi bien (voir mieux) l'année prochaine !

Friday, 27 July 2018
|
Écrit par
Grégory Soutadé

Today, a small Python script to track live stock exchanges. It fetch data from boursorama website and format it for "Generic Monitor" XFCE applet which allows to display result of a command line script. Just setup the path of this script in genmon properties and set the delay to 60s (to avoid flooding website).

#!/usr/bin/python

#
# 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 3 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, see <https://www.gnu.org/licenses/>.
#

import requests
import json

params_gettickseod = {"symbol":"%s","length":"1","period":"0","guid":""}
params_updatecharts = {"symbol":"%s","period":"-1"}

base_headers = {
    'Host': 'www.boursorama.com',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'fr,en-US;q=0.7,en;q=0.3',
    'DNT': '1',
    'Upgrade-Insecure-Requests': '1',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
}
base_address = 'https://www.boursorama.com/cours/'

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'fr,en-US;q=0.7,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate, br',
    'Referer': 'https://www.boursorama.com/cours/%s/',
    'Content-Type': 'application/json; charset=utf-8',
    'X-Requested-With': 'XMLHttpRequest',
    'DNT': '1',
    'Connection': 'keep-alive',
}

xhr_address = 'https://www.boursorama.com/bourse/action/graph/ws/'
address_gettickseod = xhr_address + 'GetTicksEOD'
address_updatecharts = xhr_address + 'UpdateCharts'

cookies = None

def _do_request(address, params, headers):
    if cookies is None:
        req = requests.get(address, params=params, headers=headers)
    else:
        req = requests.get(address, params=params, headers=headers, cookies=cookies)

    if req.status_code == requests.codes.ok:
        j = req.json()
        if len(j) == 0:
            raise Exception('Not available')
        return j
    else:
        raise Exception("Request error!")

def getStock(stock, display_name=None):
    my_headers = headers.copy()
    my_headers['Referer'] = headers['Referer'] % (stock)

    closevalue = 0
    res = ''

    my_params  = params_updatecharts.copy()
    my_params["symbol"] = stock
    try:
        j = _do_request(address_updatecharts, my_params, my_headers)
    except:
        req = requests.get(base_address + stock, headers=base_headers)
        # cookies = req.cookies
        j = _do_request(address_updatecharts, my_params, my_headers)

    current = float(j['d'][0]['c'])
    my_params  = params_gettickseod.copy()
    my_params["symbol"] = stock
    try:
        j = _do_request(address_gettickseod, my_params, my_headers)
        closevalue = float(j['d']['qv']['c'])
    except Exception, e:
        if not len(j):
            raise e
        closevalue = float(j['d'][0]['o']) # Open value

    if closevalue != 0:
        var = ((current/closevalue) - 1)*100
    else:
        var = 0
    if current < closevalue:
        color = 'red'
        var = -var
    else:
        color = 'green'
    if not display_name is None:
        res += '%s ' % (display_name)
    res += '%.3f <span fgcolor="%s">%.2f</span>' % (current, color, var)

    return res

def getMail():
    res = ''
    nb_messages = ''
    pipew = open("/tmp/gmail-pipe-w", "wb+")
    piper = open("/tmp/gmail-pipe-r", "rb+")
    pipew.write("a\n")
    pipew.flush()
    while not len(nb_messages):
        nb_messages = piper.readline()
    if len(nb_messages):
        nb_messages = int(nb_messages)
        if nb_messages == 1:
            res = ', 1 msg'
        elif nb_messages > 1:
            res = ', %d msgs' % (nb_messages)
    pipew.close()
    piper.close()

    return res

def getStocks(stocks):
    res = ''
    for stock in stocks:
        if res != '': res += ', '
        try:
            res += getStock(*stock)
        except Exception, e:
            if len(stock) > 1:
                res += "%s %s" % (stock[1], str(e))
            else:
                res += str(e)
    res += getMail()
    print('<txt>%s</txt>' % (res))

getStocks([('1rPENX', 'Euronext'), ('1rPAIR',)])

Get stock code id from website URL (last part). A file version is available here.

I added another part to get email count from gmail. It relies on a bash script that fetches RSS feeds when data is wrote in the FIFO.

Body of the script :

#!/bin/bash

USER='soutade'

while [ 1 ] ; do
    echo -n "Please enter gmail account password : "
    read -s password
    echo ""
    echo -n "Confirm password : "
    read -s password2
    echo ""
    if [ "$password" != "$password2" ] ; then
        echo -e "Passwords doesn't match !!\n"
        continue
    fi
    break
done

pipew="/tmp/gmail-pipe-w"
piper="/tmp/gmail-pipe-r"

rm -f $pipew $piper
mkfifo $pipew $piper

while [ 1 ] ; do
    read line < $pipew
    feeds=`curl -u "$USER:$password" --silent "https://mail.google.com/mail/feed/atom"`
    echo $feeds | sed  s/.*\<fullcount\>//g | sed  s/\<\\/fullcount\>.*//g > $piper
done

You can hardcode password in the script, but I don't like having my password in clear on the harddrive. A file version is available here.