OpenSource sur Clojure

Run Loop invite ceux qui fabriquent des produits sympas de leurs propres mains. Nikita Prokopov ( tonsky ) - un homme et un navire, a réussi à créer plusieurs projets OpenSource que d'autres personnes aiment utiliser.

Tout d'abord, parlons de la police FiraCode, Clojure, et de projets complètement différents, par exemple, le wrapper ClojureScript pour React. Et ensuite passons à des discussions plus générales sur les bonnes interfaces, le bon sens et les modèles de formation pour les programmeurs.



À propos de l'invité : Nikita Prokopov est remarquable par le fait qu'il a créé FiraCode, a apporté une contribution significative au développement de la communauté Clojure et publié des projets tels que Datascript et Rum dans OpenSource. De plus, il écrit sur Objective-C sous macOS: le programme AnyBar vous informera de l'occurrence d'un événement dans la barre d'état, oh, la barre de menu de votre ordinateur.

Présentateurs : Roman Busygin (développeur de Yandex.Music pour iOS) et Alexey Mileev (App in the Air).

Nikita : Je suis programmeur à Novossibirsk, mais maintenant je vis à Moscou. Il était principalement engagé dans des projets web, j'aime les interfaces. Récemment, j'ai programmé en Clojure.

Roman : Je propose de construire la conversation d'aujourd'hui autour de vos projets Open Source et publics. Je veux commencer par la première chose et la plus intéressante pour moi - c'est la police FiraCode . Il est utilisé par beaucoup de mes collègues et moi-même. J'ai toujours été intéressé par la façon de créer ma propre police, comment cela se produit, s'il existe un programme spécial, quelles connaissances vous devez posséder pour créer votre propre police. Veuillez en parler.

Firacode


Nikita : Ce n'est pas tout à fait correct de dire que c'est ma police. J'ai pris la police monospace terminée et terminé les ligatures, je n'ai pas dessiné de lettres moi-même. Pour faire les lettres elles-mêmes, vous avez besoin de beaucoup d'expérience et de persévérance. C'est très difficile, il y a un million de subtilités subtiles. Il y a des polices amateurs et vous pouvez toujours voir qu'elles sont maladroites, mais ce n'est pas toujours clair ce qu'est cette chose maladroite.

J'ai pris une bonne police FiraMono de Mozilla et y ai dessiné des ligatures, il existe plusieurs programmes pour cela. J'ai utilisé le programme Glyphs assez populaire. Je ne suis pas un expert en conception de polices, j'ai donc regardé ce que les autres utilisent et je l'ai également utilisé. Il peut être surprenant que cela coûte assez cher, mais ils m'ont donné une licence pour développer FiraCode. Les glyphes sont comme un éditeur de graphiques vectoriels. Vous ouvrez, il y a des lettres, vous trouvez des cellules et dessinez des images. De plus, toutes sortes de subtilités associées aux polices, par exemple, que les lettres ont une taille, des points d'ancrage, des transitions de gras à non gras. Tout est assez simple.

Fait intéressant, à l'intérieur de la police OpenType, il existe un langage de programmation sur la base duquel ce remplacement de ligatures est effectué. Initialement, il a été créé comme un moyen pour la mise en œuvre de toutes sortes d'astuces dans les polices. Par exemple, les ligatures, lorsque fi, ffi et similaires dans les polices ordinaires sont remplacées par des ligatures. De plus, il existe une variabilité, des styles de fin de lettres: si une lettre est au début et à la fin d'un mot, une queue y est ajoutée. Tout cela peut être programmé en utilisant des motifs délicats, ainsi que les ligatures qu'il a faites.

Roman : Combien de temps at-il fallu pour finaliser le FiraMono au type de FiraCode que tout le monde utilise maintenant?

Nikita : Ce sera difficile à calculer. La première version n'a pas été très difficile. Comme toujours, tout a commencé assez rapidement, mais il a fallu un certain temps pour comprendre ce qui se passait, comment le mettre en œuvre: il n'y avait pas beaucoup d'exemples.

Roman : Autrement dit, il y avait aussi plusieurs versions. En quoi différaient-ils?

Nikita : Oui, et les versions sont en cours de mise à jour. Premièrement, je termine de nouvelles ligatures, enlève parfois les anciennes si elles entrent en conflit avec quelque chose. À un moment donné, le mécanisme de dessin des ligatures y a changé. À l'intérieur, il y a un problème algorithmique très intéressant: il y a une longue séquence de caractères, à partir de laquelle vous devez isoler les combinaisons qui composent les ligatures, mais si elles se croisent, alors il doit y avoir un autre remplacement. J'ai même un programme Clojure qui génère un ensemble de règles qui sont ensuite insérées dans la police - assez difficile. Cette chose a changé, la méthode de rendu des ligatures a changé. Auparavant, ils étaient remplacés par un caractère, maintenant ils sont remplacés par trois. En fait, pour l'utilisateur, ça va mieux, moins de bugs, plus de ligatures.

Roman : Intéressant. Je n'ai jamais pensé qu'il pourrait y avoir des bugs dans les polices. Les règles selon lesquelles le peintre décide quand insérer des ligatures et quand non, sont décrites dans un langage de programmation spécial ou simplement de manière déclarative?

Nikita : de manière déclarative, puis traduite en interne assez efficacement dans la table de remplacement.

Set pour la première version des ligatures


Roman : Dites-moi, quand avez-vous trouvé un ensemble de ligatures, avez-vous regardé des langages de programmation spécifiques ou existe-t-il une liste plus ou moins générale de ce dont les gens ont besoin dans la vie quotidienne?

Nikita : Je n'ai pas eu cette idée moi-même. J'ai vu qu'il existe une police Hasklig spécialement conçue pour Haskell. Mais je n'avais pas besoin de Haskell, donc j'ai pensé que je devais faire la même police, mais, premièrement, basée sur la police que j'aime, et deuxièmement, pour n'importe quelle langue. Ensuite, j'ai pris tout ce qui m'est venu à l'esprit . Les premières choses sont évidentes: <=,> =, ->, <-. Vous écrivez comme en C, mais il est remplacé par une flèche. À mon avis, tout a commencé.

Clojure


Alexei : Au tout début, vous avez mentionné que vous écrivez sur Clojure maintenant. Dites-moi comment vous êtes arrivée à Clojure, comment tout a commencé, comment en êtes-vous arrivée à cette langue?

Nikita : J'ai regardé quelques conférences de Rich Hickey (je recommande, par exemple, ceci et cela ). Ils sont cool et polyvalents sur le thème du fonctionnement d'une tête de programmeur, en gros, sur la conception de systèmes. Les conférences ont ouvert une énorme quantité d'informations importantes et concentrées pour moi, et j'étais un fan de Rich Hickey. Puis il s'est intéressé à ce qu'il avait fait. Il s'est avéré qu'il a fait la langue Clojure. Je suis allé le lire, j'ai tout compris et c'est parti.

Roman : Je peux également être enregistré en tant que fan de Rich Hickey. J'ai vu ses performances: elles sont à la fois longues et, surtout, intéressantes. Autrement dit, il parvient à garder l'attention des auditeurs pendant longtemps.

Alexei : Qu'est-ce que tu aimes exactement chez Clojure?

Nikita : Lors de la dernière conférence, Rich Hickey a fait la remarque suivante:

Clojure est un langage pour les programmeurs plus âgés et fatigués.

Ils ne viennent pas à lui en début de carrière, mais il devient intéressant après 10-15 ans. Tout d'abord, vous avez une liberté absolue. Tout ce dont vous avez besoin, vous faites vous-même ou prenez des bibliothèques. Dans la langue elle-même, un minimum de choses sont cousues . Tout ce que vous concevez, faites exactement ce dont vous avez besoin. Tout est fait maison et peut être changé. C'est dangereux lorsque vous êtes débutant, mais utile si vous êtes déjà un expert et savez ce dont vous avez besoin.

Dans cette langue, la pensée s'exprime de la manière la plus claire et la plus compacte possible. Autrement dit, l'écart minimum entre la complexité de ce que vous essayez d'exprimer et la complexité de la façon dont il est écrit. En Java, par exemple, vous pouvez faire quelque chose de complètement trivial, mais il s'étirera sur 10 lignes et vous vous fatiguerez. Dans Clojure, si une chose est triviale, alors elle est écrite, très probablement, trivialement, en une ou deux lignes.

Roman : J'ai réalisé que vous avez répondu à ma question. Lorsque j'ai entendu dire que Clojure ne vous imposait aucune restriction, pour une raison quelconque, je me suis immédiatement souvenu de C, qui se tenait également sur ses oreilles. Mais j'ai entendu la réponse qu'après tout, ce n'est pas seulement du sucre syntaxique, mais aussi un langage pratique et compact qui vous permet d'exprimer vos pensées avec moins de code.

Nikita : Oui, c'est très haut niveau, et C est bas niveau.

Alexei : Je me demande si une telle liberté de langage n'interfère pas avec le travail dans de grands projets avec un grand nombre de personnes. Ou dans OpenSource, où vous devez surveiller attentivement chaque changement? D'après ce que j'ai entendu, les choses sont autorisées dans Clojure jusqu'à changer la syntaxe du langage . Cela ne vous dérange pas?

Cela me rappelle la situation avec Scala, quand la langue connaît beaucoup de choses, et dans chaque grand projet, tout le monde est enveloppé dans une sorte de râteau. En conséquence, ils en arrivent à une pratique courante, à ce que nous l'utilisions, et ce n'est pas le cas. En conséquence, Scala dans un projet et Scala dans un autre sont deux Scala différents . Existe-t-il un tel problème à Clojure?

Nikita : Je n'ai pas travaillé dans des projets particulièrement importants. Dans ceux dans lesquels il travaillait, il y avait de légères variations. En fait, pour une raison quelconque, une telle confusion directe ne se produit pas. Il me semble que c'est parce que dans Scala, disons, il y a des fans pour théoriser et spéculer sur la façon de faire quelque chose le plus correctement. Comme vous l'avez dit, il y a beaucoup de tout - vous ne pouvez pas choisir cela. À Clojure, au contraire, il n'y a pas grand-chose - vous ne pouvez pas choisir la mauvaise chose. C'est un langage très pratique. Clojure n'aime pas faire des abstractions pour l'avenir. Si vous avez besoin d'imprimer quelque chose, par exemple, alors vous imprimez simplement aussi pratique que possible et ne vous inquiétez pas d'où vient l'imprimante, quelle interface, quel protocole vous implémentez. Vous faites exactement ce dont vous avez besoin. Par conséquent, ce caractère pratique est probablement un dénominateur commun.

Projets chez Clojure


Roman : Autant que je sache, vous avez plusieurs projets sur Clojure sur GitHub. Dites-nous en plus à leur sujet.

Javascript


Nikita : Mon premier projet OpenSource relativement réussi est Datascript . Il s'agit du stockage client pour le navigateur. Ce n'est probablement pas très utile pour le site, et si vous écrivez une sorte d'application interactive dans le navigateur, vous devez stocker les états quelque part. Datascript n'est qu'un référentiel d'états. Ses jetons:

  • Il est immuable . Autrement dit, il ne détruit pas les versions précédentes, il crée simplement une nouvelle copie de stockage assez efficacement.
  • Il est trié . Il prend automatiquement en charge les index sur les attributs, sur n'importe quel entity_id, etc. Il vous permet de trouver rapidement tout ce dont vous avez besoin. tout ce dont vous avez besoin.
  • C'est plat . Si vous n'avez pas vraiment réfléchi à la façon d'implémenter le stockage sur le client, la première chose à faire est la structure du JSON imbriqué. Dans le stockage Datascript est plat, à tout moment, vous pouvez aller à n'importe quel endroit et trouver ce dont vous avez besoin.

En général, il s'agit d'un accès relativement pratique aux données, dans les deux sens: vous pouvez passer d'un parent à un enfant, ou vous pouvez également passer d'un enfant à un parent.

Pour la communauté Clojure, il présente un autre avantage: il est réalisé avec la même API que Datomic. Datomic est une base de données Clojure. Puisqu'ils ont la même interface, si vous connaissez Datomic, - vous connaissez Datascript. Il existe également des requêtes, vous pouvez écrire des requêtes de données dans le langage Datalog. Je n'ai pas trouvé cette fonctionnalité particulièrement utile pour l'interface, mais il y a des gens qui trouvent cela utile. Ceci est semblable à SQL, vous pouvez ouvrir les conditions et obtenir des résultats à partir du référentiel client.

Roman : Veuillez nous expliquer pourquoi Datascript est unique. La tâche de stockage de l'état sur le client dans une application interactive est assez courante. Il semble qu'il devrait déjà être intégré quelque part dans le langage lui-même ou dans une sorte de cadre. Cependant, vous avez décidé de prendre votre décision. Qu'est-ce qui vous a poussé?

Nikita : Je me demandais si je pouvais fabriquer de petits outils Datomic. Il était intéressant de répéter un système existant. Ensuite, il s'est avéré que c'est en fait une bonne idée, et il est très pratique d'organiser et d'accéder à l'état de cette manière. Il existe probablement des solutions similaires dans le monde JavaScript. Il existe une chose telle que le relais. Pour autant que je m'en souvienne, cela résout le problème de la synchronisation et du stockage des données. Elle est quelque peu similaire, mais, à mon avis, est apparue plus tard.

Rhum


Alexey : Il y a une autre bibliothèque de rhums . Parlez-moi d'elle, s'il vous plaît.

Nikita : Rum n'est qu'un wrapper React pour ClojureScript. React est cool, génial, et tout le monde aime ça. Je veux l'utiliser b dans ClojureScript à utiliser. C'est un script Java, mais je veux l'utiliser dans Clojurescript. Il y avait plusieurs solutions dans le monde ClojureScript, mais elles étaient toutes trop conceptuelles. Ils ont proposé leur modèle, qui utilisait en interne React. Ce n'est pas pur, mais son propre concept, qui utilise React.

L'idée de Rum est née du fait que vous ne pouviez pas utiliser Datascript avec ces liants précédents, mais je voulais l'utiliser. En conséquence, je suis arrivé à un design dans lequel Rum est la liaison la plus transparente et la plus triviale de React. Nous offrons tout la même chose que dans React, uniquement enveloppé dans une interface pratique pour utiliser ClojureScript. Il ne cache rien, vous pouvez accéder aux composants natifs de React. Il est agnostique, comme vous le souhaitez, et organise l'application et l'architecture.

Roman : D'après les histoires de typographes familiers, et en général, en regardant dans le sens de React et React Native, je vois à quel point votre projet devient fou. Vous avez dit que c'était enroulé autour de React. Mais React est un énorme projet, et vous avez réussi à faire du rhum très petit sans étudier des tonnes de sources React. Comment as-tu fait ça?

Nikita : React n'est pas un projet aussi énorme en fait. Tous les éléments essentiels de React se trouvent dans la bibliothèque Preact, qui ne prend que 3 Ko. React a une API assez petite et un tas de hacks pour les nouveaux navigateurs, cela n'a aucun sens d'apprendre les hacks, ils sont tous à l'intérieur de React.

Roman : Le G6 fait-il partie de React ou non?

Nikita : Officiellement - non, c'est un composant séparé.

Roman : L'avez-vous porté ou laissé de côté?

Nikita : Non, je ne l'ai pas porté, vous ne l'utilisez pas dans ClojureScript. Dans ClojureScript, le code est des données et tout cela, vous n'avez même pas besoin de quelque chose comme G6, vous avez déjà votre propre syntaxe vectorielle, qui est acceptée dans la communauté Clojure. En utilisant les données, nous présentons la même chose qui se fait dans G6 par la macro et le prétraitement des sources.

Roman : Wow! Maintenant, je propose de passer au prochain projet. J'ai été très surpris et ravi quand j'ai vu que vous, Nikita, avez écrit le projet AnyBar - une application de barre de menu qui montre différents indicateurs près de l'horloge. Étonnamment, mon premier projet MacOS était également une application de barre de menus qui montrait des notifications de nouvelles lettres de Yandex.Mail. J'ai regardé la source et je suis revenu directement sur les 8 dernières années.

Le projet est très simple et populaire. Certes, ils l'utilisent pour certaines tâches appliquées. Veuillez me dire comment le projet est apparu, comment vous l'utilisez vous-même ou, peut-être, vous savez comment quelqu'un l'utilise?

Anybar


Nikita : Le projet est apparu tout à fait par accident. Vous savez, les programmeurs adorent écrire quelque chose, et ici. Le code Clojure n'a pas besoin d'être compilé, contrairement au code ClojureScript. Chaque fois que vous changez la source, elle est recompilée. Cela prend un certain temps: un démarrage à froid prend 30 à 40 secondes, par exemple, et une construction incrémentielle d'une seconde à dix secondes. Vous avez modifié la source, basculé sur le navigateur et vous ne savez toujours pas si vous pouvez déjà regarder ou devez encore attendre, car la source n'a pas été compilée. Pour le savoir, j'ai trouvé un indicateur.

Tous fonctionnent principalement sur des ordinateurs portables, il n'y a pas beaucoup d'espace, où les obtenir. Vous devez basculer vers le terminal et attendre que tout soit compilé dans le terminal, puis basculer vers le navigateur. Afin de ne pas revenir au terminal, je me suis fait un indicateur dans la barre de menu, qui montre le statut de la build: elle compile, compile et compile avec une erreur. Si une erreur se produit, vous n'avez pas besoin de rafraîchir la page cent fois, mais rien ne s'applique.

Je ne l'ai pas fait de manière spécifique, mais je l'ai fait aussi universellement que possible. Pour changer la couleur de l'indicateur dans AnyBar, il vous suffit d'envoyer un paquet UDP, c'est le moyen le plus simple de communication croisée. Il s'avère que c'est une chose super flexible, qui est triviale pour le script. J'ai utilisé principalement pour le statut de construction uniquement.

Quelqu'un, par exemple, a récemment tweeté qu'il avait fait un indicateur du statut des sièges vides à l'ambassade. Pour que vous puissiez prendre rendez-vous immédiatement, quand il y a un siège vide. Il a également été affiché dans AnyBar.

Roman : Nikita, cette chose fonctionne-t-elle uniquement sur Localhost, ou ma machine virtuelle en Hollande peut-elle cingler mon ordinateur portable et afficher quelque chose dans la barre de menu?

Nikita : Si vous pouvez envoyer un paquet UDP depuis votre machine virtuelle pour un ordinateur portable, alors oui.

Alexei : Après avoir entendu parler du temps de construction à froid de 30 à 40 secondes, puis du rechargement à chaud pendant une seconde ou deux, bien sûr, je ne peux que jalouser du monde Android. Mais ici, j'ai cette question: tout cela a-t-il été envahi par un ensemble de scripts shell prêts à l'emploi, des plug-ins prêts à l'emploi que vous ne pouvez même pas écrire, mais simplement branchés pour que tout fonctionne immédiatement?

Nikita : Ce n'est pas envahi, parce que je ne l'ai pas beaucoup fait. Je suis même surpris que quelqu'un d'autre soit intéressé. Il y a beaucoup de choses: beaucoup d'idées, même beaucoup de clones. Les gens veulent afficher du texte ou plusieurs indicateurs, etc. J'allais faire tout cela, mais mes mains n'ont pas atteint.

grumpy.website


Alexei : Passons à votre prochain projet. Dites-moi ce qu'est un site grincheux.

Nikita : grumpy.website est un blog sur des exemples de mauvaises interfaces. Nous collectons tous les montants dans les interfaces de l'ordinateur et du non-ordinateur, discutons, nous plaignons à leur sujet.

Alexey : Depuis combien de temps ce site est-il apparu?

Nikita : Il y a environ un an.

Alexei : Combien de personnes publient quelque chose là-bas?

Nikita : Ceci est un projet d'auteur, nous avons maintenant quatre auteurs. Nous publions principalement, mais cinq autres personnes envoient régulièrement leurs suggestions. Il s'agit d'un moteur entièrement personnalisé écrit sur Clojure en direct sur ma chaîne YouTube . Il a diffusé 13-14 numéros, dont la description complète se trouve dans Gist . Si vous êtes intéressé par la façon de créer une application Web à partir de zéro sur Clojure, vous pouvez le voir.

Roman : Ce cours est-il déjà terminé, ou le projet est-il encore en cours de finalisation, et affichez-vous les notes en cours de finalisation?

Nikita: C'est plus un blog vidéo. Cela s'est terminé par l'état dans lequel se trouve maintenant grumpy.website - c'est en temps réel. Ce qui est maintenant sur le site, puis sur le blog.

Conception et convivialité


Roman : En tant que personne qui a soulevé le projet sur les stupidités de la conception d'interfaces, vous êtes très probablement versé dans la conception et la convivialité. Comment êtes-vous entré dans ce domaine? Comment vous êtes-vous intéressé à cela?

Nikita : C'est arrivé assez tôt, au début d'une carrière. J'étais engagé dans des projets web, et il me semblait que pour bien faire les interfaces, j'avais besoin de comprendre ce que nous faisions. On avait le sentiment que tout n'allait pas bien avec les interfaces informatiques.

J'ai lu plusieurs livres célèbres et tout cela semblait très raisonnable. D'une part, vous devez surveiller les bonnes interfaces. Le bon sens, d'autre part. Pour lire grumpy.website , vous n'avez pas besoin d'être un expert de l'interface, le bon sens suffit pour comprendre qu'il s'agit d'horreur-horreur.

Roman : Je me souviens qu'après avoir lu le livre «Design of familiar things» de Donald Norman, j'ai vraiment commencé à en voir plus. Mais avant cela, j'ai utilisé ces bêtises, ces défauts et mes yeux ne se sont pas accrochés.

Rapport AppsConf


Alexey : Nikita prendra la parole à l'AppsConf avec le rapport « Acquisition de compétences ». Nikita, dites-moi comment un tel rapport est apparu.

Nikita : J'ai regardé un reportage sur le modèle driftfus. Il s'agit d'un modèle d'acquisition de compétences, selon lequel chaque personne, étudiant un nouveau domaine, passe par différentes étapes: débutant, compétent, spécialiste, expert, maître. Je suis allé lire, j'ai compris ce que sont ces niveaux, comment ils diffèrent, j'ai compris comment cela tombe sur la programmation et tout ce que je vois autour de la programmation: cours, livres, discussions sur Internet, les langages de programmation des appareils. Autrement dit, c'est par rapport à différents niveaux de programmeur ou de programmation. Il s'est avéré que c'est un modèle intéressant qui explique beaucoup de choses. , , .

, : , . — , — . . , , , .

: , , , , , . , . , .
AppsConf — 8 9 . . ( : , ), .

YouTube- , .

Source: https://habr.com/ru/post/fr420147/


All Articles