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.

Tuesday, 10 July 2018
|
Écrit par
Grégory Soutadé

Pochette de l'album We The People Of the Soil

10 ans, ça se fête ! À cet effet, les Cluzo sont retournés dans le Tenesee, chez Vance Powell déjà responsable de "Rockfarmers". On peut donc s'attendre à retrouver les mêmes ingrédients pour ce nouvel album. C'est le cas, ceux qui ont aimé le précédent n'en seront que plus conquis. Pour les 10 ans, le duo a voulu marquer encore plus profondément leur ancrage à la terre (the soil), on retrouve donc une musique plus folk/blues, avec une présence forte de la guitare sèche ainsi que la thématique paysanne, l'amitié, l'entraide.

Force est de reconnaître la qualité exceptionnelle de la production. Il y a un fossé très clair avec "Rockfarmers", plus brut de décoffrage, tandis que cet opus offre un son lisse où chaque élément est à sa place. Les mélodies sont beaucoup plus travaillées que précédemment (tout album confondu). Le résultat donne un style rock/blues fusion puissant avec des refrains très doux dûs en partie à un nouveau venu : l'orgue (de type hammond b3). Si on en avait eu un aperçu précédemment, elle est désormais présente dans la plupart des titres. Le premier, "A Man Outstanding In His Field", en est le meilleur exemple avec toute la palette de nuances qu'offre les 40 minutes de l'album. Mais pas que, on trouve beaucoup de ballades : presque la moitié des chansons, avec comme figure de proue "Little Girl And The Whistling Train", ainsi que quelques surprises, comme la participation de Marianne Dissard pour un super duo sur "The Best".

Les fans de la première heure seront peut-être déçus de cette compression excessive du son, mais où est la rock bordel ?? Il est pourtant présent, de manière très propre, relativement profond et énergique. À ce sujet, deux titres sortent du lot : "Pressure on Madalands" proposant un rock psyché avec un son volontairement "crade" et "The Globalisation blues" qui se rapproche plus de "Rockfarmers". Autre élément à souligner, le travail exceptionnel de Laurent quant à sa voix. Certes, les ballades qu'il interprète ne requièrent pas de monter trop haut dans les aiguës, mais la maîtrise qu'il pose sur chaque morceau est énorme. Malheureusement, le final est bâclé avec un chant clairement faux (il fallait passer moins de temps à la piscine et plus en studio).

Autre bémol : malgré sa très bonne qualité d'impression, les pages du livret sont imprimées à l'envers. Livret qui reprend le même format que pour l'album précédent, à savoir un melting pot de photos en noir et blanc et d'aquarelles de leur ami Abu.

N'ayant pas pu l'écouter plus tôt, je ne comprenais pas l'engouement de la presse (L'obs, les inrockuptibles, FIP de la FNAC, C À Vous, France Inter ...) pour ce 6e cru. Mais avec autant d'éléments "mainstream", il est clair que ce dernier sera apprécié d'un large public !

Les Cluzo proposent un pack spécial "10 ans" (en édition limitée), comprenant l'album, 10cl d'Armagnac ainsi que le livre "The Inspector Cluzo - Rockfarmers" de Romain Lejeune (les Inrockuptibles). À la base, il s'agissait d'un article voulu par le journaliste qui donnera finalement lieu, de part la masse d'information recueillie, à l'édition d'une biographie complète du groupe, des deux hommes et de leur parcours formateur jusqu'à la réalisation de leur dernier opus. Un peu réticent au début, je conseille fortement de le commander car il permet de comprendre le cheminement humain des deux "frères". Les premiers chapitres apportent beaucoup d'informations intéressantes, des anecdotes croustillantes. Les derniers étant malheureusement trop redondants concernant le message et le mode de vie des deux fermiers rockeurs : chaque témoignage, bien qu'il émane d'une personnalité reconnue, ressemble au précédent. Une relecture un peu plus attentive aurait également été souhaitée pour corriger les fautes qui émaillent l'ensemble de l'ouvrage ainsi que la fausse transition vers "We the people of the soil", car ce n'est pas avec cet album, mais bien avec "Rockfarmers" que le groupe a signé sa première collaboration avec Vance Powell.

L'Armagnac est à l'image de l'album : d'un équilibre saisissant. D'une belle robe ambrée parée de jambes très lourdes, la bouche offre un bouquet assez riche de fruits compotés pour finir sur une touche légèrement épicée. L'alcool se fait discret, un peu trop présent au nez peut être. Il s'agit d'une cuvée spéciale provenant de la distillerie "La Tuilerie" dont The Inspector Cluzo est partenaire depuis le début. Malheureusement il n'y a pas plus d'informations sur l'étiquette.

Monday, 02 July 2018
|
Écrit par
Grégory Soutadé

Logo gPass

Mise à jour en catastrophe de gPass. Le dernier commit ayant introduit un bug dans la génération des wildcards. Oui, je sais, ça fait déjà 6 mois... Les extensions sont normalement mises à jour automatiquement, donc il n'y a rien à faire (aucun changement n'est à signaler côté serveur).

Pour se tenir informé : Mailing list gPass

Monday, 14 May 2018
|
Écrit par
Grégory Soutadé

Fenêtre principale de KissCount

Enfin ! Après avoir retravaillé l'empaquetement, la compilation et la documentation, voici la version 0.7 de KissCount ! Cela fait un an et demi depuis la dernière version (qui ne comportait que peu de correctifs). En réalité, cette mouture était prête depuis 6 mois, mais j'étais occupé à mettre en place Pannous.

Et pour une version, c'est une belle version, avec en figure de proue la migration vers Qt5 (qui a principalement motivé son développement), ainsi qu'un nouvel exécutable pour Windows ! Là aussi, il y avait un gros retard, puisque le dernier binaire en date était la 0.4 de ... 2013. Cette fois-ci, elle est compilée nativement depuis Visual Studio/Windows 10, alors qu'auparavant, j'utilisais mingw en cross compilation depuis Linux.

À ma grande surprise, la migration de Qt4 vers Qt5 s'est faite tout en douceur avec très peu de changements nécessaires. Cela a surtout été l'occasion de se débarrasser de libkdcharts au profit de la bibliothèque de dessin intégrée à Qt (même si je ne suis pas pleinement satisfait du rendu des graphiques circulaires). Le panneau principal a subi une légère modification, puisque le calendrier migre en bas à gauche, ce qui permet de gagner de la place et d'être plus cohérent.

Autre fonctionnalité intéressante : lorsqu'un compte descend en dessous d'une certaine limite (200€ par défaut) ou en dessous de 0, les jours du calendrier sont colorés (en jaune (configurable) et rouge). Également, plutôt que de "cacher" les comptes clôturés, j'ai intégré une date de début et de fin, plus pratique (je sais, c'est une fonctionnalité de base chez la concurrence...). Finalement, tout un tas de petits bugs ont été corrigés.

Bref, une bien belle version pour inaugurer la nouvelle liste de diffusion kisscount-announce@soutade.fr