PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

antistress : Gérer les extensions pour GNOME Shell avec Firefox en 2017

jeudi 26 janvier 2017 à 00:02

Capture d'écran du site officiel des extensions pour GNOME Shell

Il y a quasiment cinq ans, en même temps que sortait la version 3.4 de GNOME, était inauguré le site extensions.gnome.org qui concrétisait le projet SweetTooth (wiki du projet, article d'explications), soit un logiciel en ligne permettant, à la façon du site addons.mozilla.org ou du magasin d'applications Android, d'installer/désinstaller facilement des extensions pour GNOME Shell.

Jusqu'à présent, un plugin NPAPI était requis pour pouvoir faire fonctionner le site avec un navigateur comme Firefox. Ce qui n'est pas sans inconvénients – j'en vois deux pour ma part :

Face à l'arrêt annoncé de la prise en charge des plugins NPAPI par les principaux navigateurs, les développeurs de GNOME ont réalisé une extension permettant d'accéder au site officiel des extensions pour GNOME Shell en remplacement du plugin utilisé jusqu'alors (/usr/lib/mozilla/plugins/libgnome-shell-browser-plugin.so, qui n'est plus nécessaire).

Utilisateurs du bureau GNOME, pensez donc à mettre à jour votre configuration !

L'installation se fait en deux temps : il faut installer le connecteur natif (des paquets sont proposés pour Arch, Debian, Fedora, Gentoo et Ubuntu) et l'extension (en version 8 minimum).

Bénéfice accessoire de ce changement (remplacement d'un plugin par une extension) : vous limitez les possibilités de vous pister par la technique du fingeprinting (n'oubliez pas qu'il existe différentes contre-mesure à cet effet, comme le recours à l'extension User Agent Switcher pour Firefox...).

Gravatar de antistress
Original post of antistress.Votez pour ce billet sur Planet Libre.

Articles similaires

Thuban : Un GUI en python : TP 3, la guerre des boutons

mercredi 25 janvier 2017 à 14:24

C'est mercredi, le jour du TP, youpi !

Notre visionneuse grandit doucement mais sûrement. Maintenant qu'elle affiche des dialogues et sait ouvrir les images sur le disque, elle est assez agée pour avoir ses premiers boutons ^^.

On va donc voir comment ajouter des boutons et comment relier une action à ces boutons.

Avec tkinter, un bouton se crée tout simplement ainsi :

monbouton = Button(parent, text="coucou", command=fonction)

Si on décompose, on voit un appel à Button. Jusque là, pas trop de surprises. On précise ensuite avec parent dans quel autre widget le bouton sera inséré, par exemple une Frame. Ensuite, on choisit le texte à mettre dans le bouton avec text="coucou". On peut aussi définir une image avec image=variable_image.
Enfin, on relie le bouton à une fonction avec command=fonction. Il faut noter qu'avec cette méthode, la fonction recevra en argument le bouton lui-même. Ça peut être pratique si on veut le modifier dans la fonction, mais la plupart du temps on se contentera d'utiliser lambda, qui permet d'exécuter une fonction plus simplement sans s'occuper des arguments. Par exemple, ça donnera :

monbouton = Button(parent, text="coucou", command=lambda: print("coucou")))

Je vous propose d'ajouter à notre visionneuse trois boutons : "Ouvrir une image", "Image précédente" et "Image suivante".
Nous mettrons les boutons en bas de la fenêtre. Afin de les contenir, on va créer une Frame rien que pour eux :

# Frame contenant les boutons en bas de la fenêtre : 
btnbox = Frame(mainframe)
btnbox.pack()

Commençons par le bouton pour ouvrir une image :

b_open = Button(btnbox, text="Ouvrir", command=lambda: pick_img())
b_open.pack()

Ici, on appelle une fonction pick_img qu'il faut créer. Heureusement, nous avons déjà tout le code qui permet d'afficher un dialogue pour trouver une image.

def pick_img():
    img_path = filedialog.askopenfilename(\\
                initialdir=(os.path.expanduser("~")),\\
                filetypes=[('Images', ('.png', '.PNG', '.jpg', '.JPG', '.gif', '.GIF')), ('Tout', '.*')],\\
                title="Image à ouvrir",\\
                parent=w)
    return img_path

Si vous lancez ce code, vous devriez voir votre zoli bouton :

En cliquant dessus, on a bien la fenêtre pour choisir un autre fichier qui apparaît.

Mais c'est tout pourri, ça ne change pas l'image quand j'en choisis une autre

En effet. Au lieu de seulement choisir une image, il faut aussi la modifier. On crée alors une fonction "open_img" qui appelera "pick_img".

La fonction open_img ressemble alors à :

def open_img(img_container, img_path):
    # Ouverture de l'image
    image = Image.open(img_path)
    # Dimensions de l'écran : 
    gap = 100 # marge par rapport aux bords de l'écran
    screen_width = w.winfo_screenwidth() - gap
    screen_height = w.winfo_screenheight() - gap

    if image.width > screen_width : 
        image = image.resize((screen_width, int(image.height * screen_width / image.width)), Image.ANTIALIAS)
    if image.height > screen_height :   
        image = image.resize((int(image.width * screen_height / image.height), screen_height), Image.ANTIALIAS)

    # Chargement de l'image en mémoire
    img = ImageTk.PhotoImage(image)

    # On met l'image dans le conteneur
    img_container.configure(image = img)
    # On s'assure que l'image sera bien gardée en mémoire
    img_container.image = img
    # Ainsi que son emplacement
    img_container.path = img_path

J'en profite pour créer une fonction "chg_img" pour modifier l'image avec le bouton. Ce n'est pas obligatoire mais ça sera plus pratique :

def chg_img(img_container):
    i = pick_img()
    if i: # On a bien choisi une image
        open_img(img_container,i)

Actuellement, notre code fait bien ce qu'on attend de lui et ressemble à ça :

#!/usr/bin/env python
# -*- coding:Utf-8 -*- 

import os
import sys
import mimetypes
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk


### Fonctions ###
def pick_img():
    img_path = filedialog.askopenfilename(\\
                initialdir=(os.path.expanduser("~")),\\
                filetypes=[('Images', ('.png', '.PNG', '.jpg', '.JPG', '.gif', '.GIF')), ('Tout', '.*')],\\
                title="Image à ouvrir",\\
                parent=w)
    return img_path

def open_img(img_container, img_path):
    # Ouverture de l'image
    image = Image.open(img_path)
    # Dimensions de l'écran : 
    gap = 100 # marge par rapport aux bords de l'écran
    screen_width = w.winfo_screenwidth() - gap
    screen_height = w.winfo_screenheight() - gap

    if image.width > screen_width : 
        image = image.resize((screen_width, int(image.height * screen_width / image.width)), Image.ANTIALIAS)
    if image.height > screen_height :   
        image = image.resize((int(image.width * screen_height / image.height), screen_height), Image.ANTIALIAS)

    # Chargement de l'image en mémoire
    img = ImageTk.PhotoImage(image)

    # On met l'image dans le conteneur
    img_container.configure(image = img)
    # On s'assure que l'image sera bien gardée en mémoire
    img_container.image = img
    # Ainsi que son emplacement
    img_container.path = img_path

def chg_img(img_container):
    i = pick_img()
    if i: # On a bien choisi une image
        open_img(img_container,i)


### tkv ###

# Notre fenêtre principale
w = Tk()
w.title("tkv : visionneuse d'images") # Un titre
w.configure(background='#000000')     # Fond noir

# Un conteneur dans la fenêtre
mainframe = Frame(w)
mainframe.pack(fill=BOTH,expand=True, padx=15, pady=15)

# Ouverture de l'image
img_path=""
if len(sys.argv) == 2:
    # On a une image en agument
    img_path = sys.argv[1]

if not os.path.isfile(img_path):
    # On va chercher une image sur le disque
    img_path = pick_img()
    if not img_path: # L'utilisateur n'a choisi aucune image, on quitte
        sys.exit(0)

    # Est-ce un fichier valide ?
mimtyp = mimetypes.guess_type(img_path)[0] # i.e 'image/jpeg'
if not mimtyp or "image" not in mimtyp :
    # Il n'y a pas le mot "image" dans le mimetype
    from tkinter import messagebox
    messagebox.showerror("Fichier invalide", "Le fichier demandé n'est pas une image.")
    sys.exit(1)

# Conteneur de l'image
img_widget = Label(mainframe)
img_widget.pack()

# Insertion de l'image dans le conteneur.
open_img(img_widget, img_path)

# Frame contenant les boutons en bas de la fenêtre : 
btnbox = Frame(mainframe)
btnbox.pack()

# Bouton ouvrir
b_open = Button(btnbox, text="Ouvrir", command=lambda: chg_img(img_widget))
b_open.pack()

# Démarrage du programme
w.mainloop()

sys.exit(0)

Entendez-vous cette petite voix du bon développeur ?

c'est pas malin, tu aurais pu utiliser une classe !

En effet, mais ça fera l'objet d'un autre TP. Na ! :p

On peut maintenant passer à nos boutons "précédent" et "suivant". Afin de trouver automatiquement les images suivantes ou précédentes, je vais suivre la méthode suivante :

Ça nous donne la fonction defile_img :

def defile_img(img_container, sens):
    """
    On fait défiler les images dans un sens ou dans l'autre
    sens == "prev" : précédent,
    sens == "next" : suivant,

    On a besoin de passer le conteneur de l'image
    en argument pour retrouver l'emplacement de l'image courante.
    """
    # Emplacement de l'image actuelle : 
    cur_path = img_container.path
    # Dossier de l'image actuelle : 
    d = os.path.dirname(cur_path)
    # Liste des images
    l = os.listdir(d)

    # on ne garde que les images
    # "{}/{}".format(d,i) : on met le chemin complet vers l'image 
    # for i in l :pour toutes les images dans la liste l
    # if os.path.splitext(i)[1] in img_extensions : 
    #     si l'extension de l'image est dans la liste des extensions
    img_list = [ "{}/{}".format(d,i) for i in l if os.path.splitext(i)[1] in img_extensions ]

    # On met dans l'ordre
    img_list = sorted(img_list)

    # On ne fait tourner que si il y a plusieurs images
    if len(img_list) > 1:
        # on retrouve la position de l'image actuelle
        pos = img_list.index(cur_path)

        if sens == "next":
            open_img(img_container, img_list[pos + 1])
        elif sens == "prev":
            open_img(img_container, img_list[pos - 1])

Et voilà !

On peut maintenant ajouter nos boutons. J'en profite pour leur définir une largeur afin de rendre l'interface plus cohérente :

# Bouton ouvrir
b_open = Button(btnbox, text="Ouvrir", width=12, command=lambda: chg_img(img_widget))

# Boutons suivant et précédent
b_next = Button(btnbox, text="Suivant →", width=12, command=lambda: defile_img(img_widget, "next"))
b_prev = Button(btnbox, text="← Précédent", width=12, command=lambda: defile_img(img_widget, "prev"))

# On affiche les boutons dans la boîte les uns à côté des autres
b_open.pack(side=LEFT)
b_prev.pack(side=LEFT)
b_next.pack(side=LEFT)

Nous avons finalement nos boutons qui permettent de visualiser les images plus simplement.

Ceux qui auraient voulu une classe s'apercevront qu'avec tkinter, il est très facile de s'en passer.

La semaine prochaine, nous verrons comment améliorer l'apparence de nos widgets tkinter.

Comme d'habitude, voici le code final :

#!/usr/bin/env python
# -*- coding:Utf-8 -*- 

import os
import sys
import mimetypes
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk

img_extensions = ('.png', '.PNG', '.jpg', '.JPG', '.gif', '.GIF')

### Fonctions ###
def pick_img():
    img_path = filedialog.askopenfilename(\\
                initialdir=(os.path.expanduser("~")),\\
                filetypes=[('Images', img_extensions), ('Tout', '.*')],\\
                title="Image à ouvrir",\\
                parent=w)
    return img_path

def open_img(img_container, img_path):
    # Ouverture de l'image
    image = Image.open(img_path)
    # Dimensions de l'écran : 
    gap = 100 # marge par rapport aux bords de l'écran
    screen_width = w.winfo_screenwidth() - gap
    screen_height = w.winfo_screenheight() - gap

    if image.width > screen_width : 
        image = image.resize((screen_width, int(image.height * screen_width / image.width)), Image.NEAREST)
    if image.height > screen_height :   
        image = image.resize((int(image.width * screen_height / image.height), screen_height), Image.NEAREST)

    # Chargement de l'image en mémoire
    img = ImageTk.PhotoImage(image)

    # On met l'image dans le conteneur
    img_container.configure(image = img)
    # On s'assure que l'image sera bien gardée en mémoire
    img_container.image = img
    # Ainsi que son emplacement
    img_container.path = img_path

def chg_img(img_container):
    # change l'image affichée
    i = pick_img()
    if i: # On a bien choisi une image
        open_img(img_container,i)

def defile_img(img_container, sens):
    """
    On fait défiler les images dans un sens ou dans l'autre
    sens == "prev" : précédent,
    sens == "next" : suivant,

    On a besoin de passer le conteneur de l'image
    en argument pour retrouver l'emplacement de l'image courante.
    """
    # Emplacement de l'image actuelle : 
    cur_path = img_container.path
    # Dossier de l'image actuelle : 
    d = os.path.dirname(cur_path)
    # Liste des images
    l = os.listdir(d)

    # on ne garde que les images
    # "{}/{}".format(d,i) : on met le chemin complet vers l'image 
    # for i in l :pour toutes les images dans la liste l
    # if os.path.splitext(i)[1] in img_extensions : 
    #     si l'extension de l'image est dans la liste des extensions
    img_list = [ "{}/{}".format(d,i) for i in l if os.path.splitext(i)[1] in img_extensions ]

    # On met dans l'ordre
    img_list = sorted(img_list)

    # On ne fait tourner que si il y a plusieurs images
    if len(img_list) > 1:
        # on retrouve la position de l'image actuelle
        pos = img_list.index(cur_path)

        if sens == "next":
            open_img(img_container, img_list[pos + 1])
        elif sens == "prev":
            open_img(img_container, img_list[pos - 1])



### tkv ###

# Notre fenêtre principale
w = Tk()
w.title("tkv : visionneuse d'images") # Un titre
w.configure(background='#000000')     # Fond noir

# Un conteneur dans la fenêtre
mainframe = Frame(w)
mainframe.pack(fill=BOTH,expand=True, padx=15, pady=15)

# Ouverture de l'image
img_path=""
if len(sys.argv) == 2:
    # On a une image en agument
    img_path = sys.argv[1]

if not os.path.isfile(img_path):
    # On va chercher une image sur le disque
    img_path = pick_img()
    if not img_path: # L'utilisateur n'a choisi aucune image, on quitte
        sys.exit(0)

    # Est-ce un fichier valide ?
mimtyp = mimetypes.guess_type(img_path)[0] # i.e 'image/jpeg'
if not mimtyp or "image" not in mimtyp :
    # Il n'y a pas le mot "image" dans le mimetype
    from tkinter import messagebox
    messagebox.showerror("Fichier invalide", "Le fichier demandé n'est pas une image.")
    sys.exit(1)

# Conteneur de l'image
img_widget = Label(mainframe)
img_widget.pack()

# Insertion de l'image dans le conteneur.
open_img(img_widget, img_path)

# Frame contenant les boutons en bas de la fenêtre : 
btnbox = Frame(mainframe)
btnbox.pack()

# Bouton ouvrir
b_open = Button(btnbox, text="Ouvrir", width=12, command=lambda: chg_img(img_widget))

# Boutons suivant et précédent
b_next = Button(btnbox, text="Suivant →", width=12, command=lambda: defile_img(img_widget, "next"))
b_prev = Button(btnbox, text="← Précédent", width=12, command=lambda: defile_img(img_widget, "prev"))

# On affiche les boutons dans la boîte les uns à côté des autres
b_open.pack(side=LEFT)
b_prev.pack(side=LEFT)
b_next.pack(side=LEFT)

# Démarrage du programme
w.mainloop()

sys.exit(0)

Gravatar de Thuban
Original post of Thuban.Votez pour ce billet sur Planet Libre.

Littlewing : Recherche des erreurs d’un ESB dans ELASTICSEARCH

mardi 24 janvier 2017 à 15:47

,Depuis quelques temps, on a extrait les différents appels transitant dans un ESB (TIBCO BW dans mon cas) pour les déverser dans ELASTICSEARCH. On peut même utiliser la plateforme CONFLUENT pour faire du Change Data Capture pour transférer les données via KAFKA.

Cette solution permet de déterminer quelques statistiques intéressantes telles que le nombre d’appels, le nombre d’erreurs par service,…

Au delà des beaux graphiques fournis par KIBANA, je suis en train de me plonger dans la gestion des alertes. En effet, dans l’addon payant d’ELASTICSEARCH (XPACK), il y a un plugin assez intéressant : WATCHER.

Ce dernier permet, grâce à la percolation de lancer des alertes via API REST par exemple. Celles-ci sont déclenchées de manière périodique via un système analogue au CRON.

Dans cet article, je décrirai la requête et le mapping de données qui me permettent de stocker les données et de faire la recherche en question. Je décrirai dans un futur article, la création de l’alerte

 

Mapping

put /monitoring
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings": {
      "monitoring": {
        "properties": {
          "DEPLOYMENT_NAME": {
            "type": "keyword"
          },
          "DURATION_MS": {
            "type": "long"
          },
          "JOBEND": {
            "type": "date"
          },
          "JOBSTART": {
            "type": "date"
          },
          "LOGID": {
            "type": "text"
          },
          "STATUS": {
            "type": "keyword"
          }
        }
      }
    }
}

Requête

Mon besoin est d’identifier les services qui ont un fort taux d’erreur et de lancer une erreur le cas échéant. Par exemple, si un service a 30% d’erreur pendant un laps de temps de 30mn, on pourra appeler via une API REST un service de création d’anomalie (ex. JIRA).

Voici la requête que j’ai crée.Celle-ci utilise le mécanisme des agrégations pour déterminer pour chaque service le pourcentage d’erreur.

POST /monitoring/_search
{
  "size": 0,
  "query": {
    "range": {
      "JOBSTART": {
        "gte": "now-15d/d",
        "lte": "now"
      }
    }
  },
  "aggs": {
    "services":{
      "terms":{
        "field": "DEPLOYMENT_NAME"
      },
      "aggs": {
        "success":{
          "filter":{
            "term": {
              "STATUS": "success"
            }
          }
        },
         "errors":{
          "filter":{
            "term": {
              "STATUS": "error"
            }
          }
        },
        "percentage":{
          "bucket_script": {
            "buckets_path": {
              "numberOfSuccess": "success>_count",
              "numberOfErrors" : "errors>_count"
            },
            "script": "params.numberOfErrors /(params.numberOfErrors+params.numberOfSuccess)"
          }
        }
      }
    }

  }
}

Conclusion

Maintenant j’ai ma requête ELASTICSEARCH. La suite dans un autre article pour la création de l’alerte

 

 

Gravatar de Littlewing
Original post of Littlewing.Votez pour ce billet sur Planet Libre.

Framablog : Wallabag it, une belle occasion d’y aller de votre poche !

mardi 24 janvier 2017 à 13:37

Pour ne plus avoir 50 onglets ouverts « à lire plus tard » et garder tous les articles qu’on veut lire dans la poche, il existe une solution simple et libre : wallabag.

Wallabag, c’est le logiciel qui se trouve derrière notre service Framabag. Le principe est simple : vous vous inscrivez au service, et vous ajoutez l’extension à votre navigateur (Firefox ou Chrome/Chromium) afin d’avoir le bouton magique qui vous permet de sauvegarder vos articles à lire plus tard.

Ensuite, il ne vous reste plus qu’à aller les lire sur le site web du service ou depuis l’application de votre ordiphone…

Côté serveur, de notre côté donc, ce n’est pas la même paire de manchots. Voilà plusieurs mois que wallabag a sorti une version majeure (2.X), avec de mirifiques nouvelles fonctionnalités. Mais Framabag reste obstinément dans une version antérieure (1.9.X).

La raison est simple, nous sommes victimes de notre succès : migrer plus de 11 000 comptes vers une nouvelle version majeure est un très gros travail, un travail concernant des données sensibles (qu’on ne peut donc pas déléguer à n’importe qui). Or, comme toujours, nos bénévoles et salariés ont déjà une toudou liste qui déborde… Ce qui ne veut pas dire qu’on ne fera jamais la mise à jour, juste qu’elle est trop importante pour qu’on la fasse dans l’urgence, et que nous allons prendre notre temps.

Bien entendu, le top serait que chacun-e d’entre vous auto-héberge son wallabag, par exemple en utilisant Yunohost ou le tutoriel dédié. Malheureusement, ce n’est pas (encore) une solution accessible à toutes et tous.

Qu’à cela ne tienne, Nicolas Lœuillet, créateur et développeur principal de wallabag, et par ailleurs membre de Framasoft, propose une alternative intéressante (parce que payante) : wallabag.it !

Alors non : nous ne nous sommes pas concertés, mais oui : cela nous arrange. 11 000 comptes Framabag, c’est beaucoup trop, et il y a grandement besoin de solutions d’hébergement alternatives. C’est surtout l’occasion de démontrer une fois encore que libre ne signifie pas gratuit, et qu’il est important de ne pas mettre toutes ses données dans le même panier, fût-ce dans celui de Framasoft… Mais parlons-en donc avec le principal intéressé.

Une illustration de Wallabag V2 piquée au blog de Dadall

Bonjour Nicolas ! Peux-tu te présenter au lectorat du Framablog ?

Salut le lectorat du Framablog.

Je suis Nicolas, développeur web de métier et développeur de wallabag (vous avez vu ? Pas de w majuscule !) à mes heures perdues. Depuis maintenant trois ans, je suis également membre (à mes minutes perdues) de Framasoft.

Du coup c’est quoi, wallabag it ? Un Framabag survitaminé ? Quels sont les avantages et nouvelles fonctionnalités de ce service ?

wallabag.it, c’est un service en ligne qui te permet d’utiliser wallabag sans se soucier de l’installation, de la maintenance, des mises à jour de l’application.

Tu viens, tu crées ton compte et tu utilises. C’est tout.

C’est pas un Framabag survitaminé : c’est pareil que Framabag dans l’idée. La différence, c’est la version de wallabag : comme c’est si bien expliqué dans l’introduction du billet, nous avons publié une nouvelle version majeure l’an dernier (la deuxième du nom) et la mise à jour de Framabag est quelque peu complexe.

Les avantages de ce service, c’est la simplicité de création de compte. Pas besoin d’avoir les compétences pour installer une application web.

Il n’y a aucune différence de fonctionnalité entre le service et l’application que tu pourrais installer chez toi, sur ton serveur personnel. Et il n’y en aura jamais. Au mieux, certaines fonctionnalités seront proposées avant sur wallabag.it, mais à terme, tout sera rendu à la communauté.

D’accord, mais si je m’inscris, ça va me coûter combien cette affaire ? Un café ? Un menu Falafel-Frites-Ice tea ? Une Porsche Carrera 911 ?

Si tu t’inscris, ça ne te coûte rien pendant 14 jours. Pas besoin de carte de crédit pour te créer un compte, juste une adresse mail valide.

Ensuite, ça te coûtera 12 euros par an. Douze euros. Un seul euro par mois. Soit pas grand chose. Moins d’un café par mois, du coup. Et un peu moins qu’une Porsche.

Et puisqu’on est sympas, l’abonnement annuel est actuellement à 9 euro par an (et puis il parait que ça fait bien niveau marketing).

Juste pour comparer, voici l’interface d’un wallabag en V1…

Imaginons que je sois sur Framabag (ou sur Pocket, tiens !) et que je veuille migrer vers wallabag it… Comment je fais pour migrer mes données ? Y’a besoin d’un bac + 42 en administration système ?

Si tu es sur Framabag et que tu souhaites migrer vers wallabag.it, tu dois exporter tes données (dans la page Configuration, il y a un lien pour ça). Ensuite, tu importes le fichier généré dans wallabag.it, rubrique Import. Tu choisis « wallabag v1 », tu sélectionnes ton fichier et roule ma poule.

Ça, c’est en théorie. Parce qu’en réalité, l’export depuis Framabag connaît parfois quelques ratés (certains diront que l’export depuis Framabag fonctionne de temps en temps, la nuance est minime). Si c’est le cas pour toi, contacte le support de Framasoft ou contacte le support de wallabag.it et on s’occupe d’exporter tes données (et au passage, on les revendra pour s’enrichir encore plus).

Si tu es sur Pocket et que tu souhaites migrer vers wallabag.it, c’est plus simple. Rubrique Import, tu choisis Pocket et tu te laisses aller (pas trop non plus). Ça devrait marcher tout seul, certains sont arrivés de Pocket avec 20.000 articles en poche 😆

Cela fait combien de temps que wallabag est dans ta vie ? Tu as déjà compté le nombre d’heures, de journées, de lignes de code passées bénévolement sur ce projet ?

wallabag et moi, on se connaît depuis bientôt quatre ans. Tout a commencé en avril 2013. Je marchais sur une plage, un peu comme celle-ci.

Je n’ai jamais compté mes heures pour wallabag, et je pense qu’il ne faut pas. Quand on aime, de toute façon, on ne compte pas.

Par contre les lignes de code, c’est plus simple : y’en a plus de 220.000 actuellement dans le projet. C’est uniquement un chiffre qui ne veut rien dire, et puis dedans y’a des lignes de javascript ou de HTML et comme chacun le sait, c’est pas vraiment du code, donc ça compte pas.

On dit souvent que « Libre ne veut pas dire gratuit »… est-ce que proposer wallabag It est aussi une façon de faire reconnaître le travail fourni sur ce logiciel et de le rémunérer pour que tu puisses t’y consacrer plus amplement ?

Le but à terme, oui ça serait ça : pouvoir me dégager encore plus de temps pour wallabag et faire avancer ce projet. Aujourd’hui, je suis salarié dans une petite SSII à 80 %, le reste c’est pour wallabag. Si je peux encore réduire mon temps de travail, ça serait bien.

C’est gentil tout cela, mais si je m’inscris sur wallabag it, qu’est-ce qui me garantit que demain, ou dans un an, tu ne fermeras pas le code de wallabag, me demanderas un bras au lieu de 12 €, ou carrément l’âme de ma première-née pour utiliser ton service… ?

La confiance. Tu ne peux te baser que sur ça : wallabag est et restera toujours open source et sous licence libre.

Concernant le service wallabag.it, je ne peux pas te dire que ça restera toujours 12 euros. Si tu veux me donner un bras, ça peut nous intéresser : on en manque par moment dans l’équipe, donc ça pourrait être pratique pour coder.

Question-perso-de-Pouhiou : moi j’ai déjà un wallabag V2 sur ma Brique Internet (et je le kiffe). Mais j’ai aussi une liseuse (la Cybook Muse HD de chez Bookeen, pour tout te dire…) sur laquelle j’aimerais bien lire les articles de mon wallabag… Comment je fais ? Est-ce que te soutenir te permettra de mettre en place de telles collaborations ? Et tu préfères que je te fasse un don (où ?) ou bien que j’offre un compte wallabag it à mon petit frère ?

Pour Bookeen, rassure-toi, il parait que ça arrive : une application wallabag native sur leurs liseuses 🎉

Tu peux payer un compte wallabag.it à ton petit frère et aussi à tous ceux que tu connais : j’ai des vacances à payer, merci.

Pour celles et ceux qui utilisent la liseuse Touch Lux 3 de chez Pocketbook, sachez qu’il existe une application pour lire vos articles wallabag !

Dis, j’y pense : proposer un service payant, c’est chaud niveau données : moyen de paiement, contact par email, chiffrage peut-être, etc. Que prévois-tu pour respecter les données de ta clientèle ?

Oui, c’est chaud niveau données.

Pour lancer le service, je m’étais fixé une obligation : ne bosser qu’avec des prestataires européens voire français.

L’hébergement est chez Web4all.fr

Le système de paiement est chez Payplug

L’emailing est chez Mailjet

Le nom de domaine et le certificat SSL sont proposés par Gandi

Alors, ça vaut ce que ça vaut, bien sûr, mais je ne voulais pas de services américains.

Et niveau respect des données, accès / revente de celles-ci, c’est pareil que les services proposés par Framasoft : c’est basé sur la confiance. Une phrase du site que j’aime bien : Parce que notre modèle économique est basé uniquement sur vos abonnements, nous n’avons pas besoin de lire ou revendre vos données.

Et si on est convaincu-e, on fait quoi, on s’inscrit où ?

Si t’es convaincu-e, tu te crées un compte ici.

Ensuite, tu peux bénéficier des 14 jours gratuits, puis te rendre dans la partie Abonnements.

Et le tour est joué !

Comme d’habitude, on te laisse le mot de la fin….

Merci à mes parents, sans qui je ne serai pas là aujourd’hui.

Non, plus sérieusement, merci à toute l’équipe wallabag (et ils sont nombreux) et merci à l’équipe Framasoft, qui m’ont tous soutenu depuis très longtemps maintenant.

Et dépêchez-vous de prendre un abonnement wallabag.it : début mars, ça repasse à 12 euros !

Gravatar de Framablog
Original post of Framablog.Votez pour ce billet sur Planet Libre.

Nizar Kerkeni : Association CLibre : Campagne d’abonnements 2017

mardi 24 janvier 2017 à 12:42

Support CLibre

L’association pour la Culture numérique Libre – CLibre lance sa campagne d’abonnements pour la nouvelle année 2017. Les activistes et les amoureux du Libre qui veulent s’impliquer dans les futures actions de notre association et la supporter peuvent devenir des membres.

Pour devenir membre il suffit de payer la cotisation annuelle et de remplir le formulaire d’abonnement suivant : formulaire d’abonnement 2017.

 

Banniere CLibre

share this

Gravatar de Nizar Kerkeni
Original post of Nizar Kerkeni.Votez pour ce billet sur Planet Libre.

Articles similaires