Ter n i m al (note l'orthographe) est un programme qui dessine une forme de vie animée dans le terminal à l'aide de symboles de bloc Unicode. Il fonctionne dans la plupart des émulateurs terminaux et avec la plupart des polices monospacées.

D'un point de vue pratique, le programme n'est pas très utile. Il contient cependant pas mal de technologies et de mathématiques cool:
Ternimal est également un exercice de minimalisme et de retenue. Écrit en seulement 1000 lignes de rouille, il n'a pas de dépendances et consomme très peu de ressources: 400 Ko sur le disque, 3 Mo de RAM et 4% d'un seul noyau de processeur avec les paramètres par défaut. Il implémente ses propres opérations d'algèbre linéaires à partir de zéro, ainsi que l'analyse de ligne de commande de base et un simple générateur de nombres aléatoires.
Ternimal n'a pas de dépendances en dehors de la bibliothèque Standard Rust et ne nécessite pas de cargaison pour la construction. Seul rustc (> = 1,20) doit être installé, à quel point le ternimal peut être construit avec:
git clone https://github.com/p-e-w/ternimal.git
cd ternimal
rustc -O ternimal.rs
Fondamentalement, Ternimal ne fait rien de plus que de colorer le champ de distance d'un segment d'un chemin sinueux. Il existe de nombreux paramètres contrôlant ce processus, cependant, presque tous peuvent être manipulés via la ligne de commande.
Cela rend le système très flexible. Voici quelques exemples de ce qui est possible:
./ternimal length=100 thickness=1,4,1,0,0 radius=6,12 gradient=0:#666600,0.5:#00ff00,1:#003300

Les ondes sinusoïdales peuvent être utilisées pour générer des formes assez biologiques. Dans ce cas, une seule demi-onde forme le corps d'un serpent.
./ternimal length=200 thickness=0,4,19,0,0

Ternimal ne rend qu'un seul modèle. Cependant, les variations d'épaisseur peuvent donner l'apparence de plusieurs entités déconnectées se déplaçant de manière coordonnée.
./ternimal length=20 thickness=70,15,0,1,0 padding=10 radius=5 gradient=0.03:#ffff00,0.15:#0000ff,0.3:#ff0000,0.5:#00ff00

La fonction d'épaisseur comprend un paramètre de temps. Cela permet de définir des animations de forme. Arbitrairement, de nombreux termes de la série Fourier peuvent être spécifiés, permettant des animations très complexes.
Ternimal est hautement optimisé pour les performances, dans la mesure où dans de nombreuses situations, le temps de CPU nécessaire pour générer sa sortie est inférieur à celui pris par l'émulateur de terminal pour afficher la même chose. Diverses astuces sont utilisées pour minimiser la charge de calcul et la taille de la sortie. Dans GNOME Terminal, les paramètres par défaut rendent jusqu'à 2500 images par seconde.
J'ai tout essayé sous le soleil pour faire sortir encore plus de performances, avec des résultats mitigés. Certaines des tentatives infructueuses / semi-succès comprennent:
f32 à la place de f64 . Cela donne une accélération de 5 à 10%, mais se fait des problèmes de précision après quelques jours. Il pourrait être possible de "réinitialiser" le temps et les valeurs de position à intervalles réguliers pour éviter cela, mais la logique serait assez complexe.stdout . Bien que Ternimal écrit une grande quantité de sortie, cette optimisation ne se traduit par une accélération décevante de 1% et a donc été abandonnée.format! La macro est difficile à battre à cet effet, et chaque alternative que j'ai essayée était égale ou plus lente.target-cpu=native . Cela n'a également donné aucune amélioration mesurable.Le profilage avec Callgrind et Oprofile révèle que la majeure partie du temps de CPU est consacrée à la construction et à l'écriture de la chaîne de sortie et que les calculs de rendu ne jouent qu'un rôle pour de très grands modèles. Étant donné le manque de succès en essayant de rendre la gestion des sorties plus rapidement, il semble raisonnable de dire que les performances de Ternimal sont déjà assez satisfaisantes.
Ternimal a été testé sur Linux, MacOS et Windows.
Sur Linux, presque tous les émulateurs terminaux rendent le terminal parfaitement. Sur MacOS, ITERM2 ou Alacritty sont recommandés. Sur Windows, PowerShell et WSL semblent bien fonctionner, Conemu fonctionnant également mais manquant de couleurs 24 bits.
Très probablement parce que votre terminal ne prend pas en charge les séquences d'échappement de couleur RVB 24 bits. Cela signifie probablement que vous utilisez Terminal.App par défaut de MacOS, qui est le seul émulateur de terminal majeur qui manque toujours cette fonctionnalité.
Vous avez deux options:
true_color=false pour retomber à une palette de 256 couleurs, qui est soutenue par pratiquement chaque émulateur de terminal (mais n'a pas l'air aussi agréable).Soit parce que les caractères de bloc de votre police ne remplissent pas complètement la cellule de caractère, soit parce que votre terminal a un espacement des lignes supérieur à zéro.
Ternimal fonctionne mieux avec les polices qui ont un rapport d'aspect de caractère aussi près de 2: 1 que possible. La police des screencasts est la merveilleuse Iosevka.
La console Linux ne prend pas en charge les polices Unicode. Il semble cependant reconnaître le codage Unicode et tente de traduire certains points de code UNICODE vers des points de code dans son codage interne, qui comprend les symboles de bloc requis par Ternimal.
Il semble y avoir un bug dans cette conversion, cependant. Le caractère du demi-bloc supérieur est traduit correctement, mais le demi-bloc inférieur ne l'est pas, entraînant un motif rayé.
Comme ça:

Les contributeurs sont toujours les bienvenus. Cependant, veuillez déposer un problème décrivant ce que vous avez l'intention d'ajouter avant d'ouvrir une demande de traction, en particulier pour les nouvelles fonctionnalités! J'ai une vision claire de ce que je veux (et je ne veux pas) de Ternimal, donc discuter des ajouts potentiels pourrait vous aider à éviter la duplication et le travail gaspillé.
En contribuant, vous acceptez de libérer vos modifications sous la même licence que le reste du projet (voir ci-dessous).
Copyright © 2017 Philipp Emanuel Weidmann ([email protected])
Selon les termes de la licence publique générale GNU, version 3