Category: Développement

Accordeur stroboscopique en Odin : Détection précise de la hauteur et gain adaptatif

2025-09-08
Accordeur stroboscopique en Odin : Détection précise de la hauteur et gain adaptatif

Un développeur a créé un accordeur stroboscopique novateur écrit en Odin. Cet accordeur utilise l'algorithme de détection de hauteur NSDF, offrant un retour visuel fluide, une sélection manuelle de la note cible, des modes harmonique et vernier. Il atteint une détection précise de la hauteur et des effets visuels grâce à un DFT à un seul bin et un algorithme de comparateur de phase, intégrant un contrôle de gain adaptatif pour maintenir un contraste visuel constant. Comparé aux approches alternatives, cet accordeur offre des avantages significatifs en termes de résolution visuelle, de sensibilité et de latence.

TheAuditor : Apporter la vérité fondamentale au développement assisté par IA

2025-09-08
TheAuditor : Apporter la vérité fondamentale au développement assisté par IA

TheAuditor est une plateforme de test de sécurité d'applications statiques (SAST) et d'intelligence de code, priorisant le mode hors ligne et centrée sur l'IA. Elle utilise des outils d'analyse de code standard de l'industrie et génère des rapports structurés et exploitables par l'IA, fournissant aux développeurs et aux assistants IA une source fiable de "vérité fondamentale". Contrairement aux outils SAST traditionnels, TheAuditor s'attaque aux défis de sécurité et d'assurance qualité inhérents au développement assisté par IA, empêchant l'IA de générer du code non sécurisé ou défectueux. Il prend en charge plusieurs langages et frameworks, offre une visualisation des graphes de dépendances, la détection de refactorisation et plus encore, visant finalement une boucle de développement IA autocorrectrice et sans intervention humaine.

Développement

Une conception logicielle flexible l'emporte sur les modèles de domaine rigides

2025-09-08

Cet article remet en question le principe populaire de conception logicielle consistant à lier étroitement le code au modèle de domaine. L'auteur soutient qu'en mettant trop l'accent sur l'évitement des états invalides, par exemple au moyen de schémas de base de données stricts et de contraintes de type, on limite la flexibilité du logiciel et on rend difficile la gestion des exceptions inévitables du monde réel. En utilisant les machines à états et les contraintes de clé étrangère comme exemples, l'auteur montre comment permettre des transitions d'état arbitraires tout en maintenant la simplicité du design central, améliorant ainsi l'adaptabilité et la maintenabilité du logiciel. En fin de compte, l'auteur plaide pour permettre la représentation de certains états invalides dans les logiciels orientés utilisateur afin de faire face aux exigences en évolution et aux circonstances imprévues.

Développement modèle de domaine

Bibliothèque C++ pour le capteur d'angle du couvercle du MacBook

2025-09-08
Bibliothèque C++ pour le capteur d'angle du couvercle du MacBook

Ce projet open-source fournit une bibliothèque C++ pour lire les données du capteur d'angle du couvercle du MacBook. Grâce à la rétro-ingénierie des spécifications des périphériques HID, la bibliothèque offre des mesures d'angle précises en temps réel (0-360 degrés), une API performante et facile à utiliser, et une gestion complète des exceptions. Elle prend en charge les MacBook Pro 16 pouces de 2019 et les MacBook Pro de la série M. Cette bibliothèque est un portage et une extension C++ du travail original en Objective-C de Sam Gold.

Développement Capteur

Linus Torvalds en a assez des liens inutiles dans les commits Git

2025-09-08

Linus Torvalds, le créateur de Linux, en a assez des balises "Link:" inutiles dans les messages de commit Git pour le noyau Linux. Il trouve que beaucoup de ces liens redirigent simplement vers le même patch déjà présent, sans fournir de contexte supplémentaire. À l'avenir, il sera plus strict quant à l'acceptation des demandes d'extraction avec ces liens inutiles. Bien qu'il apprécie les liens pour les lettres de présentation des séries de correctifs multi-parties, il encourage une meilleure automatisation pour filtrer les liens sans valeur, suggérant même que l'IA pourrait aider à déterminer l'utilité d'un lien. Il exhorte les développeurs à s'assurer que toutes les balises "Link:" ajoutent une valeur réelle, évitant les redondances qui font perdre du temps.

Développement

L'allocateur par défaut de Musl : un cauchemar de performances 7x !

2025-09-08
L'allocateur par défaut de Musl : un cauchemar de performances 7x !

Un benchmark réel a révélé un ralentissement choquant de 7x en utilisant l'allocateur par défaut de Musl par rapport aux autres. L'auteur recommande fortement à tous les projets Rust de passer immédiatement à un autre allocateur comme mimalloc ou jemalloc en ajoutant quelques lignes de code à leur `main.rs`. La cause principale est la contention des threads lors de l'allocation de mémoire, qui empire avec plus de threads ou d'allocations. Le changement est conseillé même si vous ne ciblez pas Musl ou pour les programmes monothreadés. L'auteur explique les raisons de l'utilisation de Musl (compilation croisée et exécutables statiques) et détaille le processus de découverte. De nombreux autres projets ont rencontré ce problème, avec des benchmarks sur différents nombres de cœurs montrant des ralentissements jusqu'à 700x ! L'auteur conclut en encourageant le passage à un allocateur plus performant.

Développement Allocation mémoire

Programmer avec de la musique et des photos ? Exploration du monde étrange des langages ésotériques

2025-09-08
Programmer avec de la musique et des photos ? Exploration du monde étrange des langages ésotériques

Un nouveau livre, "Forty-Four Esolangs: The Art of Esoteric Code", explore 44 langages de programmation étranges, certains utilisant la notation musicale, d'autres produisant des résultats différents à chaque exécution, et même un utilisant des photographies. L'auteur Daniel Temkin utilise ces langages pour explorer la créativité de la programmation et les dynamiques de pouvoir subtiles entre le programmeur et la machine. Il souligne le contraste entre les langages ésotériques et le code généré par l'IA, ce dernier manquant souvent de créativité. L'histoire des langages ésotériques remonte aux débuts de l'informatique et est liée à l'essor du shareware, de la demoscene et de l'internet naissant.

Développement langages ésotériques

La Formatage de Code Résolu dans les Années 80 ? Le Cas de DIANA et du Rational R1000

2025-09-08
La Formatage de Code Résolu dans les Années 80 ? Le Cas de DIANA et du Rational R1000

Dans les années 1980, les développeurs travaillant sur le compilateur Ada ont utilisé une représentation intermédiaire (IR) appelée DIANA (Descriptive Intermediate Attributed Notation for Ada) au lieu du code source en texte brut, résolvant ainsi efficacement le problème du formatage du code. Le compilateur et l'IDE manipulaient directement l'arbre DIANA, permettant aux utilisateurs de personnaliser le format d'affichage du code sans se soucier des espaces ou des tabulations. Cela a permis la compilation incrémentale, la refactorisation et une intégration rapide. L'auteur utilise cet exemple pour réfléchir à la manière dont le formatage du code reste un problème pour les programmeurs aujourd'hui, encourageant l'exploration de solutions plus avancées.

Développement

Ressusciter un pilote de bande de 25 ans grâce à l'IA

2025-09-08

L'auteur aime récupérer des données d'anciennes cassettes QIC-80, un support de sauvegarde populaire dans les années 1990. Ces cassettes nécessitent le pilote ftape obsolète, compatible uniquement avec de très anciennes versions de Linux (CentOS 3.5). Utilisant Claude Code, un modèle d'IA, l'auteur a modernisé le pilote ftape pour qu'il compile et fonctionne sur les noyaux Linux modernes. Après plusieurs itérations et quelques ajustements manuels, un module de noyau chargeable a été créé, lisant avec succès des cassettes test sur Xubuntu 24.04. L'auteur partage les leçons apprises en collaborant avec l'IA, en soulignant la nécessité d'instructions claires, la compréhension des limites de l'IA et l'utilisation de l'IA comme multiplicateur de compétences.

Développement

SQLite : Un moteur de base de données façonné par Tcl

2025-09-07

SQLite, le moteur de base de données le plus utilisé au monde, doit beaucoup au langage de programmation Tcl. Bien que le SQLite moderne soit une bibliothèque C autonome, indépendante de Tcl en interne, son processus de développement reste fortement dépendant de Tcl. De la création des cas de test et de la génération de code à la documentation et aux outils de développement, Tcl joue un rôle crucial. L'auteur, s'appuyant sur 17 ans d'expérience dans le développement de SQLite, plaide en faveur des capacités d'augmentation de l'efficacité de Tcl et suggère que, sans Tcl, le succès de SQLite serait inimaginable.

Pas de solution miracle : 10 façons de protéger les secrets des logs

2025-09-07

Cet article traite du problème persistant des fuites de données sensibles dans les logs. L’auteur soutient qu’il n’existe pas de solution unique, mais qu’une stratégie de défense multicouche est essentielle. Six causes courantes sont identifiées, notamment l’enregistrement direct et les objets d’erreur contenant des secrets. Dix solutions sont proposées, allant des changements architecturaux et des transformations de données aux types de données personnalisés, aux objets à lecture unique, aux formatteurs de logs, aux tests unitaires, aux analyseurs de données sensibles, aux préprocesseurs de logs, à la vérification de la contamination et à la formation des équipes. L’auteur souligne l’importance d’une approche multicouche pour une protection robuste.

Campfire : une application de chat web déployée avec Docker

2025-09-07
Campfire : une application de chat web déployée avec Docker

Campfire est une application de chat web prenant en charge plusieurs salles, la messagerie directe, les pièces jointes avec aperçus, la recherche, les notifications push web, les @mentions et une API pour l'intégration de bots. Il s'agit d'un système mono-tenant ; plusieurs instances sont déployées pour différents groupes de clients. L'image Docker inclut tout le nécessaire pour un déploiement sur une seule machine : application web, tâches en arrière-plan, mise en cache, service de fichiers et SSL. Pour la persistance de la base de données et des pièces jointes, mappez un volume sur /rails/storage. Configurez SSL, les notifications push web et les rapports d'erreurs via des variables d'environnement.

Firefox Nightly intègre le chatbot Copilot de Microsoft, de nouveaux widgets sur la page d'onglet arrivent

2025-09-07
Firefox Nightly intègre le chatbot Copilot de Microsoft, de nouveaux widgets sur la page d'onglet arrivent

Mozilla a intégré le chatbot Copilot de Microsoft dans Firefox Nightly, ainsi que de nouveaux widgets sur la page d'onglet. Copilot rejoint les chatbots existants tels que ChatGPT et Claude, mais avec des limitations d'utilisation. Mozilla encourage également activement les fonctionnalités de résumé de pages Web par des chatbots tiers et a mis à jour la page d'onglet avec des widgets de tâches et de minuterie, dans le but d'enrichir ses fonctionnalités. Cependant, cela soulève des inquiétudes concernant la surcharge d'informations et l'expérience utilisateur.

Développement

Résolution élégante du problème de l'expression : envoi multiple et méthodes ouvertes

2025-09-07

Cet article explore le « problème de l'expression », un défi qui touche à la fois la programmation orientée objet et la programmation fonctionnelle : ajouter de nouveaux types de données et des opérations sans modifier le code existant. À l'aide d'exemples en C++ et en Haskell, l'auteur illustre le cœur du problème. La POO traditionnelle a du mal à étendre les types et les opérations simultanément, et la programmation fonctionnelle rencontre des limitations similaires. L'article analyse en profondeur le modèle visiteur et ses extensions, puis utilise les multimethods et les protocoles de Clojure pour montrer comment l'envoi multiple et les méthodes ouvertes résolvent élégamment le problème de l'expression, permettant un code flexible et extensible.

Développement envoi multiple

Les développeurs seniors adoptent la génération de code par IA, mais à quel prix ?

2025-09-07
Les développeurs seniors adoptent la génération de code par IA, mais à quel prix ?

Une enquête de Fastly révèle que plus de la moitié du code livré par près d'un tiers des développeurs seniors (plus de 10 ans d'expérience) est généré par IA, contre seulement 13 % des développeurs juniors. Si les outils d'IA augmentent la productivité, près d'un tiers des répondants ont déclaré corriger fréquemment le code généré par IA, compensant ainsi le gain de temps. Cela suggère que, même si les développeurs expérimentés font davantage confiance à l'IA en production, la supervision humaine reste cruciale pour garantir la qualité et la sécurité du code.

Le Problème de l'Expression : Solutions Élégantes en POO et FP

2025-09-07

Cet article explore le « problème de l'expression » en conception logicielle : comment ajouter de nouveaux types de données et des opérations sans modifier le code existant. L'auteur utilise des exemples en C++ et Haskell pour illustrer les limites de la programmation orientée objet et fonctionnelle pour résoudre ce problème. L'article explore ensuite des solutions élégantes utilisant le modèle visiteur et les multimethods et protocoles de Clojure. L'approche de Clojure tire parti intelligemment de la puissance des méthodes ouvertes, en séparant les définitions des méthodes des définitions des types, ce qui permet une extension flexible sans modifier le code existant.

Effets algébriques : de la recherche au développement logiciel réel

2025-09-07
Effets algébriques : de la recherche au développement logiciel réel

Les effets algébriques ne sont plus un simple concept de recherche ; ils constituent un outil puissant pour le développement de logiciels réels. Cet article explore leurs principaux avantages : amélioration de la testabilité du code, meilleure visibilité du comportement du code et capacité à créer des abstractions de flux de contrôle personnalisées. Contrairement aux monades, les effets algébriques offrent une approche plus intuitive de la gestion des effets secondaires, offrant des avantages immédiats. À l’aide de Flix, un langage disposant d’un support intégré pour les effets algébriques, l’article montre des applications pratiques, notamment la gestion des exceptions, les opérations asynchrones, les coroutines, les générateurs et la recherche par retour arrière, aboutissant à une application de recommandation de films d’IA en situation réelle.

Développement

ck : La recherche sémantique de code redéfinie

2025-09-07
ck : La recherche sémantique de code redéfinie

ck est un outil puissant de recherche de code qui va au-delà du grep traditionnel en comprenant la sémantique du code. Décrivez ce que vous recherchez en langage naturel (par exemple, « gestion des erreurs »), et ck trouvera le code pertinent, y compris les blocs try/catch, les retours d'erreur et le traitement des exceptions, même si ces mots exacts ne sont pas présents. Il offre des modes de recherche basés sur les mots clés, basés sur la sémantique et hybrides, produisant une sortie JSON structurée idéale pour l'analyse de code, la génération de documentation et la refactorisation automatisée. Conservant l'interface en ligne de commande familière et le comportement de grep tout en ajoutant une intelligence sémantique, ck est parfait pour les développeurs, les agents d'IA et les équipes.

Factures exorbitantes des fournisseurs de cloud : le cauchemar d'un développeur de jeux vidéo après une attaque DDoS

2025-09-07
Factures exorbitantes des fournisseurs de cloud : le cauchemar d'un développeur de jeux vidéo après une attaque DDoS

Un développeur gérant un site semi-populaire de téléchargement de jeux WebGL a subi une attaque DDoS, entraînant une facture de 100 000 $ sur Firebase. Ce n'était que le début de son cauchemar. Il a reçu des factures exorbitantes de BigQuery, Cloudflare, AWS S3, Netlify et Vercel, totalisant des dizaines de milliers de dollars. Les causes allaient de l'envoi massif de courriels pendant l'attaque, à la perte de base de données et à des pics de trafic massifs dus à une activité malveillante. Ces cas mettent en évidence l'importance de la gestion des coûts du cloud et l'impact dévastateur des attaques DDoS sur les entreprises en ligne.

Développement factures inattendues

Plongeon au cœur du format de fichier de base de données SQLite

2025-09-07

Ce document détaille le format de fichier de base de données sur disque utilisé par toutes les versions de SQLite depuis la version 3.0.0. Les bases de données SQLite résident généralement dans un seul fichier, le « fichier de base de données principal », contenant l'état de la base de données. Des fichiers supplémentaires, journaux de restauration ou fichiers WAL, aident à la restauration d'un état cohérent. Ce document se concentre sur le fichier de base de données principal, couvrant la taille et les types de pages, les pages d'arbres B, les listes libres et le format d'enregistrement. Les formats de fichiers journaux de restauration et WAL sont également brièvement décrits.

Développement

Générateur de fractales du jeu du chaos en Rust

2025-09-07
Générateur de fractales du jeu du chaos en Rust

Une application en ligne de commande écrite en Rust qui génère des fractales en utilisant l'algorithme du « Jeu du chaos ». L'application sélectionne itérativement les sommets d'un polygone et déplace un point d'une certaine proportion vers le sommet sélectionné, créant des motifs complexes. Les utilisateurs peuvent personnaliser des paramètres tels que le nombre de côtés du polygone, le rapport de distance et les itérations. De plus, elle permet aux utilisateurs de créer des règles personnalisées pour générer des fractales encore plus complexes. Le projet est open-source et fournit des instructions détaillées et des méthodes d'extension.

Développement jeu du chaos

Microdot : Un framework web léger pour microcontrôleurs

2025-09-07

À l'EuroPython 2025, Miguel Grinberg a présenté Microdot, un framework web léger fonctionnant à la fois sur MicroPython et CPython, adapté aux systèmes allant des appareils IoT aux serveurs cloud. Inspiré par Flask mais considérablement plus petit, Microdot a été créé suite à l'expérience de Grinberg avec un thermostat intelligent défectueux dans sa maison irlandaise. Il a construit un système basé sur MicroPython pour contrôler le chauffage et a utilisé Microdot pour créer une interface web simple permettant de surveiller la température et l'humidité. Le cœur de Microdot est remarquablement concis, avec 765 lignes de code, prenant en charge les opérations asynchrones et les fonctionnalités courantes, tandis que les extensions fournissent des fonctionnalités avancées. Sa conception met l'accent sur la simplicité et évite la complexité, ce qui en fait un outil idéal pour créer des applications web sur microcontrôleurs.

Développement

Reveal : Une porte ouverte sur vos programmes Clojure en exécution

2025-09-07

Reveal est une boîte à outils d'inspection de données orientée Clojure, conçue pour simplifier le processus d'examen des objets dans votre JVM. Offrant à la fois des panneaux et des outils REPL interactifs, elle prend en charge les processus locaux et distants. Disponible en version gratuite et open source et en version Pro payante (gratuite pour les citoyens ukrainiens), Reveal permet aux utilisateurs d'inspecter en profondeur les structures de données. Une documentation complète, des tutoriels et des vidéos guident les utilisateurs à travers ses fonctionnalités, ce qui en fait un outil inestimable pour les développeurs Clojure.

Développement Inspection de données

Fonctions récursives anonymes dans Racket : la macro lam/anon♻️

2025-09-07
Fonctions récursives anonymes dans Racket : la macro lam/anon♻️

Les programmeurs Racket se retrouvent souvent à écrire des fonctions anonymes et réalisent à mi-chemin qu'une récursion est nécessaire. Les solutions traditionnelles nécessitent de réécrire le code, d'introduire `letrec`, d'augmenter l'indentation et d'ajouter de la complexité. Cet article présente une macro appelée `lam/anon♻️` qui permet des fonctions récursives anonymes dans Racket sans nommage explicite. Elle imite la syntaxe de PowerShell en liant `$MyInvocation`, simplifiant le code et améliorant l'efficacité. Bien que Racket propose déjà `rec` pour une fonctionnalité similaire, la macro `lam/anon♻️` offre une approche plus concise pour la récursion anonyme.

Développement récursion anonyme

Guerres des frameworks de code Claude : comment l’IA redéfinit le développement logiciel

2025-09-07
Guerres des frameworks de code Claude : comment l’IA redéfinit le développement logiciel

Le paysage du développement logiciel est en pleine mutation grâce à des outils d’IA comme Claude. Claude n’est plus seulement un chatbot, il est en train de devenir une infrastructure de développement prévisible et efficace. Les développeurs explorent différentes méthodes pour utiliser Claude afin d’automatiser le codage et d’accroître l’efficacité. L’article examine sept choix clés : la gestion des tâches, les invites structurées, la coordination multi-agents, la gestion des sessions, l’intégration des outils, le flux de travail de développement du code et la préservation du contexte. Grâce à une infrastructure bien structurée, Claude peut assumer plusieurs rôles : chef de projet, architecte, développeur et testeur, ce qui libère les développeurs des tâches répétitives et leur permet de se concentrer sur des tâches à plus forte valeur ajoutée. L’objectif final est d’intégrer l’IA de manière transparente dans le cycle de vie de développement logiciel, en faisant de celle-ci un membre d’équipe gérable plutôt qu’une boîte noire mystérieuse.

Développement

Dites adieu à la validation CLI redondante : présentation d’Optique

2025-09-07
Dites adieu à la validation CLI redondante : présentation d’Optique

Fatigué d’écrire du code de validation redondant pour les arguments d’interface en ligne de commande ? L’auteur partage son expérience de création de la bibliothèque Optique. Optique utilise des combinateurs d’analyseurs pour analyser directement les arguments d’interface en ligne de commande dans le type attendu, éliminant ainsi le besoin d’une validation ultérieure et évitant des problèmes tels que la logique de validation qui se désynchronise des options. L’inférence de type de TypeScript capture les erreurs au moment de la compilation, améliorant considérablement l’efficacité du développement et la fiabilité du code. Bien qu’il ne s’agisse pas d’une solution miracle, Optique réduit considérablement le code et améliore la maintenabilité pour les outils CLI complexes.

Développement validation d’arguments

Arrêtez d'utiliser les PNG comme textures de jeu !

2025-09-07
Arrêtez d'utiliser les PNG comme textures de jeu !

Vous utilisez toujours des PNG pour les textures de jeu ? Cet article explique pourquoi c’est sous-optimal et présente une meilleure approche. Bien que les PNG soient parfaites pour l’échange, elles n’ont pas été conçues pour les données de texture et ne prennent pas en charge la compression de texture compatible GPU (comme BCn), ce qui entraîne des temps de chargement lents et une utilisation élevée de la VRAM. L’auteur préconise des formats de texture tels que KTX2 ou DDS, et fournit un outil open source, Zex, pour convertir les PNG en KTX2 avec compression BC7 et supercompression zlib. Des conseils sur la pré-génération des mipmaps et l’automatisation du processus de conversion sont également partagés, ainsi qu’une recommandation d’utiliser Tacentview pour visualiser les formats de texture.

Développement Compression de textures

MVC Smalltalk : Déconstruire les idées fausses sur le Modèle-Vue-Contrôleur

2025-09-07

Cet article explore en profondeur le modèle MVC de Smalltalk, clarifiant les malentendus de longue date concernant MVC, notamment les divergences dans la version Cocoa d'Apple. L'auteur souligne l'indépendance et la réutilisabilité du modèle dans Smalltalk MVC, en notant que le modèle interagit avec la vue et le contrôleur uniquement indirectement via des notifications. Cela contraste avec la version Cocoa de MVC, où les contrôleurs (et maintenant les contrôleurs de vue) deviennent souvent les composants les moins réutilisables. L'article explique également comment identifier correctement les modèles, des simples booléens observables aux modèles complexes, et comment gérer les modèles de vue et les modèles d'arguments de fonction pour construire des architectures d'applications plus propres et plus faciles à maintenir.

flint : Une interface utilisateur moderne pour la gestion de KVM

2025-09-07
flint : Une interface utilisateur moderne pour la gestion de KVM

flint est une solution de gestion de virtualisation KVM autonome et monobinaire, conçue pour les développeurs, les administrateurs système et les laboratoires domestiques avancés. Elle dispose d'une interface web élégante, d'une CLI et d'une API, permettant une gestion efficace des machines virtuelles sans la surcharge des plates-formes complexes. Le binaire de 8,4 Mo ne nécessite que libvirt (aucune autre dépendance), offrant une configuration simplifiée. Il prend en charge Cloud-Init, une bibliothèque d'images gérée et plusieurs options d'importation, tout en restant non intrusif. Compatible avec Linux, macOS et Windows.

Développement Interface web

Optimisation des performances d'E/S de fichiers sous Linux avec Zig et io_uring

2025-09-07

Cet article explore comment maximiser les performances d'E/S de fichiers sous Linux en utilisant Zig et io_uring. Une implémentation personnalisée en Zig a été comparée à l'outil de benchmark fio, atteignant des vitesses d'écriture de 3,802 Go/s et des vitesses de lecture de 6,996 Go/s, légèrement inférieures aux vitesses d'écriture de 4,083 Go/s et de lecture de 7,33 Go/s de fio, mais toujours dans les plages attendues. L'auteur détaille des techniques d'implémentation cruciales, notamment les E/S interrogées, les tampons enregistrés et la fonctionnalité SQ_THREAD_POLL, toutes ayant un impact significatif sur les performances. Bien que marginalement plus lent que fio, les performances du code Zig sont remarquablement proches, et son temps d'exécution correspond presque exactement à celui de fio, ce qui suggère de petites différences dans la mesure de la bande passante.

Développement Performances E/S fichiers
1 2 8 9 10 12 14 15 16 214 215