Journal Licht 0.1

Posté par (page perso) . Licence CC by-sa
Tags : aucun
49
13
fév.
2018

Sommaire

Bonjour à tous, j'ouvre aujourd'hui un journal pour vous présenter licht, un tableur en console.

Licht

C'est la première version que je diffuse, et après plus d'un an passé sur le programme, je me rends compte que je n'ai pas grand-chose d'aguicheur à vendre :

  • ça utilise l'interface sexy de ncurse,
  • la prise en charge des fichiers openOffice est basique,
  • le nombre de fonctions disponibles restent limitées.

En gros, ça suffit pour faire des petits calculs sans charger sa mémoire, mais il ne faut pas s'attendre à quelque chose de révolutionnaire. C'est d'ailleurs pour cela qu'il s'agit d'une version 0.1 : c'est une version minimale propose un minimum de fonction, mais qui est censé fonctionner.

J'avais commencé à écrire licht suite à un article dans un vieux GLMF, sur un tableur écrit en C en 200 lignes de codes. Ça avait l'air assez simple, et j'ai essayé de m'y mettre. Résultat des courses, après plus d'un an de temps libre passer à coder, je n'ai pas encore la totalité des fonctionnalités présentées dans ces deux pages (pas de camemberts, pas de graphiques) : je crois que j'ai dû me louper quelque part…

À la place, j'ai un système de typage, un catalogue dynamique de fonctions (que je compte utiliser plus tard pour mettre en place un système de plugins), une gestion (partielle) des fichiers open document en lecture et écriture et surtout j'ai appris plein de trucs !

  • Calculer des jour julien
  • Comment me servir des GADTs en OCaml pour écrire un système de typage
  • Écrire des grammaires (pour lire les saisies des utilisateurs, ou les formules stockées dans libreOffice)
  • Des arbres splays (qui me fascinaient depuis ma lecture d'Okasaki),
  • Et j'ai également eu l'occasion de réfléchir à ce qu'est un tableur (mais j'y reviendrai un peu plus loin).

Je suis content du code (qui n'est pas parfait, mais qui est assez organisé pour que j'ose le montrer), et j'ai pris plaisir à l'écrire, ce qui est l'essentiel (-: Maintenant si d'autres personnes trouve un intérêt, que ça soit dans l'utilisation ou dans le code, n'hésitez pas à m'en faire part, ça me fera plaisir !

Installation

Le plus simple pour l'installation est de passer par opam :

# sudo aptitude install opam libncures-dev libiconv-dev libgmp-dev zlib1g-dev
$ opam pin add -k git licht http://git.chimrod.com/cgit.cgi/licht.git

Vous pourrez ensuite lancer licht accompagné ou non d'un fichier ods en paramètre.

Utilisation

Vous trouverez sur la page du projet une petite description de ce que l'on peut faire avec.

Attention ! J'ai dit que le support des fichiers ods était basique, aussi, je vous déconseille de réécrire un fichier ouvert : le fichier est complètement réécrit, et toutes les fonctions non gérées seront perdues (formatage, etc)

Réflexions sur les tableurs

Alors comme je n'ai pas grand-chose à dire sur ce que j'ai produit, je vais enrichir mon journal en présentant des choses que je n'ai pas écrites. Pour commencer, je vais vous présenter mes voisins.

SC l'ancètre

sc est un tableur en console qui fourni les fonctions de base. Il offre même le luxe de pouvoir aligner le texte.

Il présente l'avantage de pouvoir sauvegarder ses fichiers dans un format texte, qui présente chaque formule comme une affectation.

Le programme trouverait ses origines en 1987, ce qui en fait une antiquité. Malheureusement, je n'ai pas réussi à retrouver les sources datant de cette époque. En termes de fonctionnalités, on a l'impression que ça n'a pas beaucoup évolué depuis, l'interface sobre en noir et blanc résume ce que l'on peut faire avec l'application.

On ne lui jettera toutefois pas la pierre, à part le fait de mélanger le formatage avec le contenu de la cellule, il a surtout le défaut de ne pas être connu !

SC-IM la continuité

scim est à sc ce que vim est à vim : une continuité et une avancée. Il propose de la couleur, une interaction avec gnuplot, et le prise en charge des formats excels. Regardez la page du projet qui est assez alléchante ! Une belle attention a été portée aux fonctionnalités de l'ihm ce qui le rend assez intéressant.

J'avais testé un peu avant de commencer à coder licht, et le projet était encore un peu jeune. Il semble avoir bien muri si l'on en croit les changements qui ont eu lieu depuis.

Dans les points négatifs, je citerai une gestion incompréhensible des copier/coller (en tout cas pour moi), et s'être concentré sur le format xslx plutôt que ods.

LibreOffice

Le mastodonte des tableurs, je le cite ici car il est communément utilisé par tout le monde. Je m'en suis servi de référence quand je me posais des questions existentielles en écrivant licht.

C'est la référence pour la liste des fonctions disponibles, et d'outils pour analyser et mettre en forme les données (y compris les fameux tableaux croisés dynamiques que ma femme aimerait me voir implémenter dans licht !).

Il s'offre également le luxe d'internationaliser le nom des fonctions disponibles (même si cela m'a toujours plus perturbé que simplifié la vie). Et je l'ai utilisé pour tester le comportement du tableur sur quelques cas limites, ce qui m'a permit de tomber sur des incohérences…

Allez ? Bon, je vous explique en deux mots : covariance et contravariance. C'est plus clair ? Là je vois les experts du typage qui lèvent les yeux en disant : « mais qu'est ce que ça vient faire dans un tableur ? » Ok, allons y pour la version longue : quand on construit une liste d'éléments, il faut que toutes les valeurs soient du même type. Le problème se pose avec les date, car elles sont gérées en interne comme des nombres. Quel est donc le résultat d'une fonction qui mélange des dates et des nombres, par exemple SUM(A1:A2) ? Et bien avec LO, selon le type de la dernière valeur, nous pourrons avoir un résultat sous forme de date ou de nombre… Fichtre ! (Pour ma part, fait le choix que la date étant un format plus spécialisé que le nombre, il est avait une priorité plus importante, si vous avez une solution plus élégante, je suis preneur !)

Les manques

Bon, je ne vais pas lister tous les tableurs existants, Wikipédia fera ça mieux que moi. Je voudrai revenir sur ce que devrait être un tableur. Vraiment. Pas sûr ce qu'il faudrait ajouter pour avoir le truc à la mode, mais ce qu'il faut pour qu'un tableur redevienne ce qu'il est censé être : un éditeur de formules. J'ai cité ci-dessus le problème de la covariance et la contravariance qui est un sujet que l'on retrouve dans la programmation, essayons d'aller plus loin et voir ce qui manque vraiment pour qu'une feuille de calcul soit capable de faire vraiment des calculs (en mode Oulipo, parce qu'on peut écrire ses calculs dans tous les sens)

Pour vous guider dans mon raisonnement, je vais partir de la formule ci-dessous :

À première vue, il s'agit d'une formule toute simple composée d'additions et de multiplications. En fait, si la fonction P (pour Prédicat) renvoie 1 ou 0, alors cette formule et la version mathématique du code ci-dessous :

if (P(x)) {
  f(y);
} else {
  g(z);
}

C'est d'ailleurs pour cela que la fonction IF (ou SI en version francisée) est disponible dans les tableurs évolués : il s'agit bien d'une formule déguisée.

En travaillant simplement sur des formules mathématiques, il est possible d'exprimer des concepts que l'on retrouve dans les langages informatiques (la réciproque n'est cependant pas vrai) Malheureusement, aucun tableur ne permet aujourd'hui de saisir de telles formules. Des fonctions sont disponibles pour pallier ce manque, mais certaines fonctions sortent du cadre de ce qu'un tableur devrait proposer (même si cela permet de transformer un tableur en une machine de turing)

J'avoue ne pas trop maitriser le domaine de la calculabilité, et j'ouvre juste le sujet en laissant la porte ouverte.

Le futur

J'ai envie de continuer à travailler le côté formule. Je ne cherche pas la parfaite compatibilité avec les fichiers LibreOffice (mais je suis preneur de toute contribution qui irait dans ce sens, que ça soit pour enrichir le catalogue des fonctions existantes, ou pour une meilleur intégration du format), et proposer un format un format incompatible ne me gêne pas.

Sans changer la syntaxe en profondeur, je pense qu'il est possible d'écrire des formules telles que :

A1(x; y; z) = (x + y) / z
A2 = A1(1; 2; 3)

c'est à dire laisser l'utilisateur composer lui même ses propres formules et pouvoir enrichir le catalogue de fonctions présenté par défaut. Dans l'idéal, toute fonction élémentaire devrait ainsi pouvoir être saisie directement. Le tableur pourrait proposer la fonction SOMME et PRODUIT qui permet de calculer, non pas la somme d'une liste d'élément (SUM(A1:D6)), mais la fonction telle qu'on la retrouve en mathématique :

que l'on pourrait coder comme la fonction : B2=SUM(1; 99; A1(_))

Avec cette simple évolution, on devrait être capable d'écrire une formule capable de calculer la nième décimale de pi, ou le nième nombre premier, si vous voulez prendre un peu d'avance sur la prochaine version, vous pouvez en discuter dans les commentaires (-;

J'ai également parlé de plugins, et c'est un point que j'ai envie d'ajouter rapidement, pour pouvoir ajouter des fonctions spécifiques qui ne rentrent pas dans le module standard. Le code pour écrire une nouvelle fonction est assez simple, et donc peut être facilement enrichi. Je pense que je vais commencer par coder les jets de dés.

Et après ? Bah je ne sais pas. Je suis en train de quitter mon poste actuel vers un autre dans lequel je lâche complètement la technique, et ne sais pas trop quel sera mon emploi du temps dans les mois à venir. Cette première version est donc une manière de mettre au propre les à côtés sur lesquels je travaille (et une manière aussi de répondre à ma femme qui n'arrête pas de me dire « tu fais toujours plein de choses sur l'ordinateur, mais ça serait bien qu'on voit un peu le résultat ») !

Je me suis fait plaisir en codant, et envie d'explorer d'autres horizons, j'espère avoir réussi un peu à transmettre tout ça dans ce journal. J'apprends, comme nous tous, tout les jours, et cette annonce est aussi l'occasion d'avoir des retours, ou d'autres pistes qui peuvent venir s'intégrer dans cette réflexion sur les tableurs. La discussion est ouverte, c'est maintenant à vous !

  • # Non, l'ancêtre est…

    Posté par (page perso) . Évalué à 5.

    Visicalc (y'a aussi eu ensuite Lotus 123, Multiplan le précurseur d'Excel).

    Python 3 - Apprendre à programmer en Python avec PyZo et Jupyter Notebook → https://www.dunod.com/sciences-techniques/python-3

    • [^] # Re: Non, l'ancêtre est…

      Posté par (page perso) . Évalué à 5.

      Exact, mais mon tour d'horizon n'était pas de présenter tous les tableurs existants (comme dit plus haut, Wikipédia fera ça mieux que moi), mais d'en présenter quelques-uns, dont j'ai pu m'inspirer ou qui peuvent valoir le détour. sc est encore maintenu, et disponible dans les dépôts de debian par exemple.

  • # Intérêt ?

    Posté par . Évalué à 3.

    Une question qui a le goût du troll mais qui est une vraie question :

    De nos jours, quel est l'intérêt d'un tableur en console ?

    • [^] # Re: Intérêt ?

      Posté par (page perso) . Évalué à 4.

      Pour l'utilisateur, aucune idée. À part vouloir travailler dans une session ssh, ou alors être un fan du terminal je ne sais pas trop. C'est comme les roguelikes, certains continuent d'y jouer en console, voire de faire des interfaces qui imitent un terminal… tous les goûts sont dans la nature…

      De mon côté, je l'ai plus pris comme un défi, dont la mayonnaise à pris. Et aujourd'hui, je sais bien que les tableurs font mieux que moi la mise en forme de calculs.

      Pour un fana du scripting, on pourrait imaginer appliquer un script sur chaque cellule, pour réinjecter ensuite le résultat dans le tableau ou ce genre de chose, mais pour l'instant c'est juste une idée que je n'ai pas encore complètement développée.

      • [^] # Re: Intérêt ?

        Posté par . Évalué à 2.

        Oui je n'imaginais même pas que cela puisse encore exister. Mais c'est bien d'avoir le choix. sur SC-IM, le plotting m'a impressioné :)

      • [^] # Re: Intérêt ?

        Posté par . Évalué à 0.

        Certains continuent vraiment à jouer à des Rogue-like en console? Là c'est hard quand même…

    • [^] # Re: Intérêt ?

      Posté par (page perso) . Évalué à 5.

      Travailler sur un csv de 4To depuis ssh oklm?

      Incubez l'excellence sur https://linuxfr.org/board/

      • [^] # Re: Intérêt ?

        Posté par . Évalué à 2.

        Tant qu'à faire, je prends R (ou Python selon l'affinité personnelle) pour ce genre de tâches.

        Ça, ce sont les sources. Le mouton que tu veux est dedans.

      • [^] # Re: Intérêt ?

        Posté par . Évalué à 4.

        Genre les données ultra-pertinentes issu d’un bouchot classifié, aspirées sans vergogne par un dev< assoiffé de TSV ? ;)

    • [^] # Re: Intérêt ?

      Posté par . Évalué à 7.

      Personnellement, je préfère souvent travailler en console… pas parce que je suis nostalgique d'une interface pourrie qui date d'un demi-siècle, mais parce beaucoup de GUI sont particulièrement mal conçues au niveau des raccourcis claviers ou de la réactivité. Un bel exemple de foirage total et continu est la quasi-totalité des sélecteurs de fichiers, avec une mention spéciale pour gtk.

  • # Fonctions qui manquent dans beaucoup de tableurs

    Posté par (page perso) . Évalué à 3.

    Il y a deux fonctions qui manquent dans beaucoup de tableurs. La première est assez basique et consiste à travailler, au lieu d'une grosse feuille avec des cellules, de petites tables en indexant de façon spéciale les lignes pied-de-table et haut-de-table. La seconde est “un mode contrôle” qui permettrait de voir simultanément toutes les définitions d'une feuille ou d'une table. Est-ce que tu as écrit ça?

    • [^] # Re: Fonctions qui manquent dans beaucoup de tableurs

      Posté par (page perso) . Évalué à 2.

      Pour ta première demande, je ne me représente pas très bien ce que tu souhaites : c'est une sorte de pagination ? Comment ça s'intégrerai avec le reste du tableur ? Je veux bien des exemples pour comprendre un peu mieux.

      Le mode contrôle serait facile à mettre en place, puisqu'il s'agit de parcourir toutes les cellules pour afficher leur contenu : en gros c'est ce que je fait au moment de la sauvegarde la feuille de calcul, il faudrait juste faire une sortie écran au lieu d'une sortie fichier. Pour l'instant rien n'est prévu dans l'IHM pour mettre en place des boites de dialogue, donc ça serait aussi à ajouter, mais ça fait partie des évolutions à prévoir.

      • [^] # Re: Fonctions qui manquent dans beaucoup de tableurs

        Posté par . Évalué à 2.

        Si j'ai bien compris la première, il s'agit d'avoir une vue document telle qu'elle est disponible dans writer/word, mais avec une tableur plutôt qu'un traitement de texte. Les en-tête et pied de page seraient alors aussi des cellules, mais communes à toutes les pages.

        • [^] # Re: Fonctions qui manquent dans beaucoup de tableurs

          Posté par (page perso) . Évalué à 3.

          Dans une table en général il y a d'une part le “gros” des données, au dessus et à gauche des annotations de type légende et en bas de colonne parfois des agrégats (somme, moyenne, écart-type, quartiles, ou quoiqu'on veuille y mettre). Pour moi j'aimerais bien pouvoir penser à ma ma table comme:

          table {
            header {
              a1 = "TITRE DE MON TABLEAU"
              a2 = 2015
              b2 = 2016
              c2 = 2017
              d2 = 2018
            }
            data {
              a1 = …
              a2 = …
            }
            foot {
              a1 = average(../data/a:)
              a2 = standard_deviation(../data/a:)
              b1 = average(../data/a:)
              b2 = standard_deviation(../data/a:)
            }
          }
          

          L'intérêt est que ça évite de devoir changer les références dans les cellules aussi souvent que dans les modèles classiques. Dans la plupart des tableurs, si on insère une ligne au dessus de sa ligne avec la moyenne, le tableur change les définitions. En plus d'être plus propre, plus facile à vérifier dans une présentation de type “preuve”, ça permet aussi de facilement représenter les imports externes (genre data = sqlite(file.db) ou data = csv(file.csv)). Je trouve ça assez idiot qu'un logiciel ajoute une sémantique à une donnée (le pied de page) sans rendre cette donnée “représentable”.

      • [^] # Re: Fonctions qui manquent dans beaucoup de tableurs

        Posté par . Évalué à 1.

        Il y a deux fonctions qui manquent dans beaucoup de tableurs. La première est assez basique et consiste à travailler, au lieu d'une grosse feuille avec des cellules, de petites tables en indexant de façon spéciale les lignes pied-de-table et haut-de-table. La seconde est “un mode contrôle” qui permettrait de voir simultanément toutes les définitions d'une feuille ou d'une table.

        Si je comprends bien, la première fonction correspond à Mettre sous forme de tableau dans Excel. Les formules ne font plus référence aux cellules sous la forme A5 mais sous la forme =Tableau1[[#Cette ligne];[Colonne1]]. Il y a aussi des noms pour faire référence aux entêtes et pieds du tableau même si on a droit qu'à une seule ligne pour chacun.

        Pour la seconde, ça correspond au raccourci Ctrl+" dans Excel (Ctrl+` dans la version anglaise).

        Est-ce que ces fonctions existent dans Calc ? Je n'utilise que Writer dans LibreOffice.

        Cette signature est publiée sous licence WTFPL

        • [^] # Re: Fonctions qui manquent dans beaucoup de tableurs

          Posté par (page perso) . Évalué à 2.

          Si je comprends bien, la première fonction correspond à Mettre sous forme de tableau dans Excel.

          Non ce n'est pas du tout ça. Ce que je veux c'est pouvoir lire ces définitions sans passer mon temps à cliquer sur la boiboîte pour y mettre le focus puis déclencher l'action qui me montre ce que je veux voir. Même un truc aussi basique que ce que je décris dans cet autre commentaire 1729925 me suffirait. Juste une pile de texte qui me permet de vérifier ce que fait ma table.

          En l'état actuel des choses, une feuille de calcul et en gros un programme mais qui fait de son mieux pour qu'on ne puisse pas le lire. Résultat: dès qu'on fait quelque chose de vaguement compliqué et qu'on se rend compte qu'il faudrait ajouter un résultat intermédiaire etc. tout part en cacahouète.

          • [^] # Re: Fonctions qui manquent dans beaucoup de tableurs

            Posté par . Évalué à 1.

            Je ne suis pas sûr de bien comprendre ce que tu cherches à faire.

            Pour reprendre ton exemple, tu crées un tableau data dans Excel avec pour entêtes de colonne 2015, 2016, 2017 et 2018, tu peux calculer la moyenne et l'écart type en dessous de la première colonne en tapant =MOYENNE(data[2015]) et =ECARTTYPE(data[2015]). Dès que tu tapes data[, il te propose le nom des colonnes.

            Si c'est juste pour vérifier que les formules sont correctes, tu tapes Ctrl+" et il t'affiche toutes les formules à la place des valeurs.

            Personnellement, s'il y a besoin de résultats intermédiaires, je crée un tableau croisé dynamique. C'est plus flexible.

            On peut aussi lier les données de ton tableau à une base de données Access, Microsoft SQL Server ou Sharepoint et les mettre à jour automatiquement. Bon, c'est mesquin parce que cette fonctionnalité est reservée aux données venant des produits Microsoft. Si tu importes depuis un fichier XML ou CSV, tu ne peux pas avoir à la fois la liaison avec la source et les données sous forme de tableau.

            J'ai regardé dans Calc, il ne semble pas y avoir ce type de tableau. On peut obtenir le même résultat en ajoutant des plages nommées et des filtres un par un comme dans Excel 2003 et précédent mais c'est très fastidieux.

            Cette signature est publiée sous licence WTFPL

  • # covariance / contravariance

    Posté par . Évalué à 2.

    Et bien avec LO, selon le type de la dernière valeur, nous pourrons avoir un résultat sous forme de date ou de nombre… Fichtre ! (Pour ma part, fait le choix que la date étant un format plus spécialisé que le nombre, il est avait une priorité plus importante, si vous avez une solution plus élégante, je suis preneur !)

    Je ferai plutôt l'inverse: prendre le type le plus large capable de représenter toutes les données.
    Sinon, comment représenter les données qui ne peuvent être représentées dans le type spécialisé? Que faire quand il y a plusieurs types de données spécialisés dans la sélection?

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.