Skip Navigation
InitialsDiceBearhttps://github.com/dicebear/dicebearhttps://creativecommons.org/publicdomain/zero/1.0/„Initials” (https://github.com/dicebear/dicebear) by „DiceBear”, licensed under „CC0 1.0” (https://creativecommons.org/publicdomain/zero/1.0/)CH
Chimrod @lemmy.world
Posts 2
Comments 55
A quick guide to GADTs and why you ain't gonna need them
  • I’ve tried something recently in a project with Dream.

    Suppose you have an url like /page/param1/param2/ : you want to be able to do three things:

    1. Build this url in the application in a safe way, which mean : param1 -> param2 -> string
    2. Create a route which handle this url pattern (the compilation should fail if you don’t handle all the arguments)
    3. Ensure the handler will have the signature param1 -> param2 -> Dream.handler

    Of course, some pages will have two arguments, some other three, and you have to find a way represent this in the type system.

    For this, I’ve used a gadt:

    
    type ('a, 'b) t =
      | Static : string * ('a, 'b) t -> (unit -> 'a, 'b) t
      | Int : string * ('a, 'b) t -> (int64 -> 'a, 'b) t
      | String : string * ('a, 'b) t -> (string -> 'a, 'b) t
      | End : ('a, 'a) t
    

    The string is the parameter name in the url (id, login, …) and the gadt make the representation for this parameter in the type system. This gives me a way to declare some urls in the application:

    val root : (unit -> 'a, 'a) t
    (** The path to root / *)
    
    val topic_url : (string -> 'a, 'a) t
    (** The path to /:topic *)
    
    val thread_url : (string -> int64 -> 'a, 'a) t
    (** The path to /:topic/:thread *)
    

    Then I have some some functions wihch handle this gadt:

    val repr : (unit -> ('a, 'b) t) -> string
    (** Represent the route associated with this path *)
    
    val unzip : (unit -> ('a, 'b) t) -> (string -> string) -> 'a -> 'b
    (** Extract the parameters from the request. 
    
        [unzip path extract f] will apply the function extract for all the
        arguments in the path, and gives them to f 
    
        The function [extract] is given in argument in order to break dependency
        circle.
    
        This should be something like: 
    
            let extract_param request name =
              Dream.param request name |> Dream.from_percent_encoded
    
    *)
    
  • Trop flemmard.e, vous avez pourtant des choses à dire ? Devenez expert.e !
  • C'est d'autant plus vrai en entreprise. J'ai compris ca le jour ou j'ai été présenté comme un "expert en PDF". Bah oui, l'expert est celui qui apporte une expertise (un avis quoi), ca ne veut pas dire qu'il donne de bons avis (ce qui ferait de lui un bon expert si vous avez suivi), mais juste qu'il se permet d'en donner.

  • Un vinaigre balsamique (presque) aussi bon que le vrai - Je Pense donc Je Cuis
  • Alors c'est parti, digressons (le vinaigre balsamique n'est pas vraiment un vinaigre donc je suis un hors sujet)

    J'ai un vinaigrier dans la cuisine et je fais propre vinaigre. En fait c'est pas compliqué, une fois que la transformation est lancée, ca continuer tout seul, ca prend juste du temps. Donc le vinaigre se fait pas l'action d'un champignon qui transforme l'alcool en acide.

    Ce champignon se développe en milieu acide et continue d'acidifier son environnement, une fois que ca a commencé on est en tranquille, il n'y a pas de risque que ca tourne mal.

    Bref, tous les trois mois, je retire 1/4 du contenu, et je le remplace par du vin nouveau. Et j'ai un vinaigre parfumé et gouteux, qui n'a rien a voir avec ce que l'on achète (mais ca prend du temps), on sent le goût derrière l'acidité (comme on peut sentir le goût du vin derrière l'alcool)

    Je pense qu'il ne doit plus y avoir grand monde a faire ca chez soi, mais je vous assure que c'est un vrai plaisir d'avoir ca dans sa cuisine

  • Cette sérénité après avoir s'être plongé dans une activité pendant quelques heures
  • J'allais le proposer ! Les mises a jours sont fréquentes et le jeu est très riche.

    Mon seul regret est la gestion de la difficultés, qui se fait en appliquant des coefficients de plus en plus penalisants. Je trouve que ca ne permet pas de réfléchir aux différentes stratégies dans chaque parties, ca donne plutôt le sentiment d'avoir "une" stratégie gagnante, qui oblige a suivre un chemin de plus en étroit quand on monte en difficulté

  • la France a le record avec 2500 brasseries !
  • Je ne comprend pas les axes :

    • nombre de brasserie
    • nombre de brasserie par habitants

    Cela aurait fait sens si le deuxième axe indiquait le nombre d'habitants, mais là, je n'arrive pas a me représenter la diagonale du graphique

  • Question inutile du jour.
  • Je suis bien d'accord, disais ca dans le sens ou quel que soit le prix que l'on est prêt a mettre, ca vaudra toujours moins cher que ce qu'il nous apporte !

    C'est juste inestimable un bon lit !

  • Self-hosted Password Manager Recommendation?
  • I'm using passwordstore + self hosted git server.

    Passwordstore uses gpg for the encryption layer which combine fine with ssh (used to connect to the private repo).

    I'm using qtpass as gui and there is also a client for Android named password store

  • une maison construite au XVe siècle affiche un bon DPE sans rénovations
  • Quand t'as des murs en pierre de 30cm d'épaisseur c'est pas étonnant.

    Par contre il faut accepter de ne pas pouvoir mettre d'étagère parce que les murs ne sont pas droits, ne pas capter le wifi a l'étage, et devoir faire un dossier auprès de l'architecte des bâtiments de France avant de repeindre tes volets..

  • [Nouvelle] Serveur confusion - ep. 01 - Architecture
  • Merci, j’ai beaucoup aimé :)

    Je n’arrive plus à retrouver le nom de ce projet d’écriture collectif qui se présente sous la forme formes de rapports sur des évènements fantastiques. Ça m’a fait penser à ça.

  • Linux c’est le bazar

    Je voulais initialement commenter le post de @DniMan, mais j’ai finalement préféré écrire un nouveau post pour répondre et lancer une nouvelle discussion. Le titre est assumé — il fait référence à un ouvrage d’Éric Raymond, mais je vais essayer d’expliquer justement en quoi ce bazar fait partie du système. Je sais que le public ici est très "tech" et je ne vais peut-etre redire que des évidences, mais l’exercice de poser tout ça en mot n’en reste pas moins intéressante :)

    D’abord c’est quoi Linux ? Si je devais prendre une image, ça serait ça :

    !image

    (source : https://commons.wikimedia.org/wiki/File:Lego_dimensions.svg?uselang=fr) concrètement, avec linux seul, on ne fait pas grand-chose. Mais on peut "placer" linux dans des contextes qui n’ont rien à voir : les téléphones android utilisent linux, le serveur faisant tourner lemmy.world aussi ou le PC à partir duquel je suis en train d’écrire ce message.

    En quoi c’est différent ? La réponse n’est pas du coté de la technique (les dimensions de la brique de Lego pour reprendre mon image), mais dans l’écosystème qui gravite autour. Les dimensions de la brique étant publiques, il y a eu plein de projets qui l’utilisent dans leurs constructions, au point d’avoir aujourd’hui suffisamment d’applications pour tous les usages du quotidien. Et c’est là où c’est le bazar !

    Certaines applications sont l’héritage d’une époque où linux n’existaient pas encore :

    !image

    D’autres sont là pour juste pour un besoin spécifique, mais ont été jugées suffisamment intéressantes pour être utilisées par d’autres (par exemple les économiseurs d’écrans qui se lancent sur tous les PC de bureaux proviennent d’un site qui sent bon le siècle passé), et il n’y a pas vraiment d’homogénéité dans tout ça, chacun peut y aller comme il veut.

    Les distributions sont un moyen de mettre un peu d’ordre dans tout ça : il s’agit d’un pack de briques, déjà sélectionné pour les besoins courants. Par exemple Debian est disponible avec plus de 50.000 paquets différents, Buildroot fourni plus de 2.500 applications. Certaines sont incompatibles entre-elles et ne peuvent pas être installées ensemble, d’autres ne sont utilisées que par une dizaine de personnes dans le monde. Le but n’est pas d’être exhaustif, mais seulement de fournir un cadre commun. Ces distributions ne peuvent exister qu’à une seule condition : il faut que les auteurs aient autorisé la diffusion de leurs logiciels (sinon ça serait juste du piratage et le système n’existerait plus). C’est rempli par la licence GPL, qui donne le droit a tout le monde d’aller récupérer le code source, le modifier, et le rediffuser à sa sauce.

    Cela donne parfois l’occasion d’avoir des situations intéressantes : l’application XMMS (qui était une reprise de Winamp pour Linux, en 1997), a été ensuite modifiée par un autre développeur pour devenir Beep Media Player, qui est devenu à son tour BMPx et Audacious (qui existe encore aujourd’hui).

    Un autre exemple vient de XFree86, qui est apparu avant que Linux n’existe, et équipait la totalité des bureaux lors de sa grande époque. L’équipe de développement changea les conditions de diffusion, ce qui rendait l’application incompatible avec une intégration dans les distributions grand-public. Très vite, le code initial fut repris, modifié, et est aujourd’hui remplacé par une autre application répondant au même besoin.

    Il n’y a donc pas un standard, mais pleins de standards qui gravitent les uns autour des autres et cohabitent ensemble. (J’écris ces notes dans Zim, qui utilise sa propre syntaxe, inspirée de DokuWiki, elle même inspirée de…) Des applications qui étaient utilisées il y a plus trente ans (et devenues standard) cohabitent avec des applications utilisées par a peine une poignée d’utilisateurs, et tout ce monde évolue au quotidien.

    Comment on s’y retrouve ? pour commencer, il faut commencer par rester dans le standard. J’ai du plus haut que debian avait plus de 50.000 paquets différents, c’est largement suffisant pour couvrir ses usages au quotidien. Il y a des outils pour nous guider dans l’installation et nous permettre d’obtenir un système qui fonctionne sans se poser de question. Laissons aux gestionnaires de debian choisir d’inclure tel ou tel logiciel. À notre niveau, nous ne sommes que des utilisateurs. Ensuite se laisser le temps. On peut désinstaller gnome et utiliser ratpoison, mais vous pourrez très bien vivre sans (et si vous en arrivez là, je n’ai plus rien à vous apprendre). C’est comme tout, on peut très bien vivre en étant un simple utilisateur, puis de l’utilisateur à l’amateur, mais cela ne se fait pas tout seul. Je pense qu’une distribution grand public est aujourd’hui suffisamment généraliste pour être utilisée autant par quelqu’un qui installe le système pour la première fois qu’un expert ayant installé Kheops il y a 25 ans !

    Tout ça pour dire que oui, c’est le bazar, mais ça a toujours fonctionné comme ça (et c’est qui fait que l’on fini par avoir le système qui nous correspond).

    10

    What kind of socket to use ?

    Hello,

    I’m building my first keyboard (a dumbpad), and I have a basic question which should be easy to solve when you know how to do it.

    I’ve choosen to socket the microcontroller (in case of error, bad choice…) but I have now a question for putting the screen above: what kind of header should I use ? Is there high profile header or should I stack multiples headers ?

    !

    What would you use for this ?

    7