Category: Développement

Fenster : Une bibliothèque minimale de canevas 2D multiplateforme

2025-08-26
Fenster : Une bibliothèque minimale de canevas 2D multiplateforme

Fenster est une bibliothèque minimale de canevas 2D multiplateforme rappelant les graphismes de Borland BGI ou QBASIC. Elle offre une seule fenêtre d'application, une mémoire tampon d'image RGB 24 bits, une entrée clavier/souris multiplateforme et la lecture audio, le tout avec un minimum de code. Une API de sondage simple évite les rappels ou le multithreading. Elle possède des liaisons pour C99, Go, Zig et Lua, et oui, elle peut même exécuter Doom !

Développement graphiques 2D

La défense multicouche de RubyGems.org contre les gemmes malveillantes

2025-08-26

RubyGems.org a récemment déjoué une attaque impliquant des gemmes malveillantes conçues pour voler des identifiants de médias sociaux. Son succès provient d'une approche de sécurité multicouche : détection automatisée (analyse de code statique et dynamique), notation des risques, analyse rétroactive et sources externes. Après la détection, les gemmes suspectes font l'objet d'un examen manuel ; les gemmes malveillantes confirmées sont supprimées et documentées. Lors d'un incident récent, RubyGems.org a supprimé la plupart des paquets malveillants avant le rapport de Socket.dev et a collaboré activement à l'enquête, démontrant une réponse de sécurité efficace. L'article encourage la participation de la communauté à la maintenance de la sécurité et appelle au soutien des entreprises pour les efforts de sécurité de RubyGems.org.

Développement Gemmes Malveillantes

DeepWiki : Votre outil de codage IA

2025-08-26
DeepWiki : Votre outil de codage IA

DeepWiki transforme instantanément n'importe quel dépôt GitHub en une wiki navigable, améliorant considérablement l'efficacité du codage assisté par IA. Il offre des modes de recherche rapide et approfondie, fournissant des réponses précises avec des liens vers les fichiers sources. Le serveur DeepWiki MCP s'intègre parfaitement aux IDE IA comme Claude et Cursor pour des requêtes contextuelles en temps réel. DeepWiki aide à comprendre les bases de code, à générer des extraits de code, à évaluer la sécurité et les licences des bibliothèques open source, et même à assister à la revue de code. Que vous soyez débutant ou expert, DeepWiki est un outil puissant pour un codage efficace.

Développement

Détection et visualisation 3D en temps réel du mouvement humain utilisant le CSI Wi-Fi

2025-08-26
Détection et visualisation 3D en temps réel du mouvement humain utilisant le CSI Wi-Fi

WiFi-3D-Fusion est un projet open source qui utilise les informations d'état du canal (CSI) du Wi-Fi local pour détecter le mouvement humain en temps réel et le visualiser en 3D. Il prend en charge l'acquisition de données via ESP32-CSI et Nexmon, utilisant des CNN avancées pour la détection et le suivi des personnes, y compris l'identification et la réidentification de plusieurs personnes. Un pipeline d'apprentissage continu permet au modèle de s'améliorer automatiquement pendant le fonctionnement. La visualisation est offerte via une interface web et un pipeline basé sur le terminal. Des intégrations optionnelles avec Person-in-WiFi-3D, NeRF² et 3D Wi-Fi Scanner sont également fournies.

Vérification de capture Scala : la technologie derrière une présentation ratée

2025-08-26

Cet article relate la présentation ratée de l’auteur sur la vérification de capture lors de Scala Days 2025 et la plongée ultérieure dans la technologie. La vérification de capture vise à résoudre le problème des valeurs qui échappent à leur portée prévue, comme la fermeture prématurée des ressources dans les modèles try-with-resource. Scala implémente la vérification de capture en introduisant des « ensembles de capture », une fonctionnalité du système de types qui permet de marquer un type et toutes les valeurs qu’il capture. L’article détaille les ensembles de capture, le sous-typage, le sucre syntaxique et les mécanismes de capture des fonctions et des classes, en explorant le comportement de l’ensemble de capture dans les paramètres de type. Enfin, l’auteur soutient que, bien que la vérification de capture implique de nombreux détails, il s’agit d’une fonctionnalité en grande partie invisible pour la plupart des développeurs, améliorant la sécurité de Scala et permettant une utilisation plus large des capacités.

Développement Vérification de capture

Transformateur Annoté : Implémentation Ligne par Ligne

2025-08-26

Ce document présente une implémentation annotée, ligne par ligne en PyTorch, de l’article sur le Transformateur. Il réorganise et supprime certaines sections de l’article original et ajoute des commentaires tout au long du processus. Le notebook fournit une implémentation complète et exécutable, expliquant l’architecture du Transformateur (encodeur, décodeur, attention, encodage positionnel, etc.), le processus d’apprentissage et un exemple concret (traduction allemand-anglais Multi30k).

Développement

Amélioration inattendue des performances du CPU grâce à l'optimisation de la structure de données

2025-08-26

Un programme traitant un grand ensemble de données a rencontré des goulots d'étranglement en termes de performances de la mémoire et du CPU. Initialement, l'utilisation d'un seul tableau pour stocker les données a entraîné une consommation de mémoire pouvant atteindre 1 Go. En utilisant la programmation orientée données, la division des données en plusieurs tableaux a permis d'économiser environ 200 Mo de mémoire. Une optimisation supplémentaire a consisté à remplacer un tableau de chaînes par des index de tableau d'octets pour les noms de champs, réduisant encore l'utilisation de la mémoire. Étonnamment, ce changement a également diminué considérablement l'utilisation du CPU. La raison réside dans le mécanisme de garbage collection : le traitement d'un tableau de chaînes nécessite que le GC parcoure tous les objets chaîne, tandis que le traitement d'un tableau d'octets ne le fait pas, réduisant ainsi considérablement la surcharge du GC.

xv6-riscv-net : Intégration d'une pile TCP/IP dans xv6 RISC-V

2025-08-26
xv6-riscv-net : Intégration d'une pile TCP/IP dans xv6 RISC-V

Ce projet intègre une pile TCP/IP au système d'exploitation xv6 pour RISC-V, permettant ainsi des fonctionnalités réseau. Il inclut un portage en espace noyau de la pile TCP/IP utilisateur microps, un pilote virtio-net pour l'émulation de périphériques réseau dans QEMU, une API socket standard et une commande ifconfig simple. Quelques commandes suffisent pour construire et lancer QEMU, configurer les adresses IP et effectuer un ping sur l'invité xv6 depuis l'hôte, ainsi que pour tester des applications d'écho TCP/UDP.

Développement

Repousser les limites de la synchronisation temporelle sous Linux : un défi de précision de 500 ns

2025-08-26
Repousser les limites de la synchronisation temporelle sous Linux : un défi de précision de 500 ns

Cet article détaille la quête d'un mois de l'auteur pour obtenir une synchronisation temporelle de haute précision sur plusieurs systèmes Linux d'un réseau local. L'objectif était une précision sub-microseconde pour le traçage distribué. Malgré l'utilisation du GPS et de Chrony, l'auteur a constaté que la précision idéale était difficile à atteindre. Le jitter du récepteur GPS, la latence du réseau et l'asymétrie ont introduit des centaines de nanosecondes d'erreur. Finalement, une précision de synchronisation d'environ 500 ns a été obtenue sur la plupart des systèmes, ce qui n'est pas tout à fait l'objectif, mais suffisant pour le traçage distribué.

Développement

Outils en ligne de commande macOS : cessez d’utiliser ~/Library/Application Support !

2025-08-26
Outils en ligne de commande macOS : cessez d’utiliser ~/Library/Application Support !

De nombreux outils en ligne de commande macOS stockent incorrectement les fichiers de configuration dans le répertoire ~/Library/Application Support, ce qui contredit les attentes des utilisateurs et la spécification XDG. L’article soutient que les bibliothèques et les gestionnaires de fichiers de configuration populaires adhèrent à la spécification XDG, plaçant les fichiers de configuration dans le répertoire ~/.config. L’auteur affirme que les outils en ligne de commande doivent suivre cette convention pour améliorer l’expérience utilisateur et la cohérence ; seuls les applications GUI doivent utiliser ~/Library/Application Support.

Comprendre la notation Big O : un guide pratique

2025-08-25
Comprendre la notation Big O : un guide pratique

Cet article fournit une explication claire et concise de la notation Big O, une méthode pour décrire les performances des algorithmes. En utilisant la fonction `sum` de JavaScript comme exemple, il compare les différences entre les complexités temporelles O(1) constante, O(log n) logarithmique, O(n) linéaire et O(n²) quadratique. Des visualisations et des exemples de code illustrent les complexités temporelles de plusieurs algorithmes, notamment le tri à bulles et la recherche dichotomique. L'article explore également des techniques pour améliorer les performances du code, telles que l'évitement de `indexOf` dans les boucles et l'utilisation du cache pour réduire les calculs redondants. Enfin, il souligne l'importance des tests empiriques, en mettant en garde contre la confiance aveugle dans les résultats théoriques.

Développement complexité temporelle

Maîtriser les pics de demande synchronisée : une approche raisonnée

2025-08-25
Maîtriser les pics de demande synchronisée : une approche raisonnée

Une demande synchronisée, où un grand nombre de clients demandent un service presque simultanément, peut surcharger même les systèmes bien pourvus en ressources. Cet article présente une approche raisonnée pour atténuer ce problème en utilisant un jitter aléatoire pour répartir les demandes dans le temps. En calculant une taille de fenêtre sécurisée (W), les demandes sont distribuées uniformément, réduisant ainsi le taux d’arrivée de pointe. L’article traite également de l’utilisation d’indices côté serveur (tels que les en-têtes Retry-After) et de la limitation de débit pour affiner la stratégie, en équilibrant la stabilité et l’équité du système. L’approche est présentée comme un problème de contrôle, soulignant la nécessité d’une prise de décision et d’une vérification basées sur la télémétrie.

Développement conception système

PEP : Un nouveau format de compression ultra-efficace pour le pixel art

2025-08-25
PEP : Un nouveau format de compression ultra-efficace pour le pixel art

PEP est un nouveau format de compression d'image conçu spécifiquement pour le pixel art à faible nombre de couleurs (≤16 couleurs est optimal, jusqu'à 256 couleurs sont supportées). Il utilise la compression "Prediction by Partial Matching, Order-2", qui est 2 à 10 fois plus lente que GIF, PNG et QOI, mais compresse souvent les images 20 à 50% plus petites que GIF/PNG (et plusieurs fois plus petites que QOI). Si la taille de l'image compressée est importante, PEP est fait pour vous. Il se situe entre GIF et WEBP en termes de compromis vitesse/compression. Il est actuellement en phase expérimentale, mais un en-tête C est fourni pour son utilisation.

Développement

decode-kit : Une bibliothèque légère de validation de données d'exécution pour TypeScript

2025-08-25
decode-kit : Une bibliothèque légère de validation de données d'exécution pour TypeScript

decode-kit est une bibliothèque TypeScript légère et sans dépendances pour valider des données d'exécution arbitraires. Elle utilise une validation basée sur les assertions qui affine vos types sur place : pas de clonage, pas de transformations et une surcharge minimale en temps d'exécution. decode-kit valide vos données et restreint leur type directement ; vos valeurs d'origine restent inchangées. Elle utilise une approche de défaillance rapide, lançant une erreur détaillée lors de la première défaillance de validation, y compris l'emplacement et le schéma attendu. Prenant en charge divers types de données (chaînes, nombres, booléens, tableaux, objets) avec des règles configurables, decode-kit surpasse des bibliothèques comme Zod grâce à son assertion de type sur place, ce qui la rend idéale pour les applications critiques en termes de performances.

Développement Validation de données

Extension Firefox : Cliquer sur les éléments surlignés avec Entrée pour une navigation clavier améliorée

2025-08-25

Un développeur, h43z, a créé une petite extension pour Firefox afin de résoudre les lacunes de la navigation au clavier sur les sites web modernes. L'extension permet aux utilisateurs de cliquer sur les éléments surlignés avec la touche Entrée après avoir utilisé la fonction de recherche du navigateur, améliorant ainsi considérablement l'efficacité, notamment sur les sites utilisant des boutons et des divs au lieu de liens pour la navigation. Elle y parvient en surveillant les événements clavier, en obtenant l'élément parent du texte sélectionné et en simulant un clic.

Développement navigation clavier

OAuth 2.0 : Autorisation sécurisée des applications tierces pour accéder à vos données

2025-08-25
OAuth 2.0 : Autorisation sécurisée des applications tierces pour accéder à vos données

OAuth 2.0 est un protocole d'autorisation permettant aux utilisateurs d'accorder aux applications tierces l'accès à leurs données de compte sans partager leurs mots de passe. Cet article détaille le flux de travail OAuth 2.0, notamment l'autorisation de l'utilisateur, la récupération du code d'autorisation, l'échange du jeton d'accès, et souligne les mesures de sécurité, telles que l'évitement de la transmission directe du jeton d'accès dans les URL. La terminologie clé d'OAuth 2.0 est expliquée, comme le propriétaire de la ressource, le client OAuth, le serveur d'autorisation et le serveur de ressources, ainsi que les concepts de canal frontal et de canal arrière. L'article couvre également PKCE pour les applications sans back-end.

Développement

Agent IA ultraléger de 4,4 Ko exécutant des commandes shell via l'API OpenRouter

2025-08-25
Agent IA ultraléger de 4,4 Ko exécutant des commandes shell via l'API OpenRouter

Un agent IA ultraléger écrit en C qui communique avec l'API OpenRouter et exécute des commandes shell. Ses principales caractéristiques sont : exécution directe des commandes shell via les réponses de l'IA ; binaires optimisés (4,4 Ko sur macOS, ~16 Ko sur Linux) ; gestion de la mémoire par fenêtre glissante pour une efficacité optimale ; compatibilité multiplateforme macOS et Linux. Nécessite GCC, curl et une clé API OpenRouter. Le système de build détecte automatiquement votre plate-forme et applique la compression optimale (GZEXE pour macOS, UPX pour Linux). Le code est dans le domaine public, sans licence.

Développement commandes shell

Cache CAS indépendant du fournisseur avec codecs et stockage de génération plugables

2025-08-25
Cache CAS indépendant du fournisseur avec codecs et stockage de génération plugables

cascache est un cache Compare-And-Set (CAS) indépendant du fournisseur avec des codecs et un stockage de génération plugables. Il offre des lectures de clé unique sécurisées (pas de valeurs obsolètes), une mise en cache en masse facultative avec validation côté lecture et un mode distribué en option pour les déploiements multi-répliques. cascache garantit la sécurité du CAS à l'aide d'instantanés de génération, prend en charge divers magasins sous-jacents (Ristretto, BigCache, Redis) et codecs (JSON, Msgpack, CBOR, Proto), et fournit des modes de stockage de génération locaux et distribués pour des performances et une disponibilité élevées.

Développement distribué

SmallJS : Un compilateur Smalltalk-80 élégant pour JavaScript

2025-08-25

SmallJS est une implémentation gratuite et open source de l'élégant et puissant langage Smalltalk-80, qui compile en JavaScript et s'exécute dans les navigateurs modernes ou Node.js. Son architecture basée sur des fichiers permet le développement dans votre IDE préféré, avec un support par défaut pour Visual Studio Code, y compris la coloration syntaxique et le débogage. Entièrement orienté objet et hautement personnalisable, SmallJS conserve des équivalents JS familiers pour les noms de classes et de méthodes. Il dispose de bibliothèques intégrées pour les environnements navigateur (manipulation du DOM, événements, CSS) et Node.js (serveur HTTP, Express, bases de données, système de fichiers, multithreading). Plusieurs exemples de projets sont fournis pour vous aider à démarrer rapidement.

Développement

L'art de la conception d'API : trouver l'équilibre entre simplicité et flexibilité

2025-08-25

Cet article explore les principes essentiels de la conception d'API, en soulignant l'importance d'éviter les modifications qui pourraient casser le code existant des utilisateurs. L'auteur soutient que les bonnes API doivent être simples et faciles à utiliser, tout en conservant une certaine flexibilité à long terme. L'article détaille des aspects techniques tels que le contrôle de version des API, l'idempotence, la limitation de débit et la pagination, et recommande l'utilisation de clés API pour l'authentification afin de faciliter l'utilisation pour les utilisateurs non-ingénieurs. Il conclut qu'un excellent produit est plus important qu'une API parfaite, mais qu'un produit mal conçu mènera inévitablement à une API médiocre.

Développement

Python 2025 : La science des données domine, l'asynchrone et Rust en hausse

2025-08-25
Python 2025 : La science des données domine, l'asynchrone et Rust en hausse

L'enquête des développeurs Python 2025 révèle que la science des données représente désormais plus de la moitié du développement Python, Pandas et NumPy en tête. Malgré l'utilisation de versions plus anciennes par beaucoup, les nouvelles versions offrent des gains de performance significatifs (jusqu'à 42%). Le développement web connaît une résurgence, avec le framework FastAPI en plein essor. Rust s'intègre de plus en plus pour améliorer les performances. La programmation asynchrone et le multithreading gagnent du terrain, Python 3.14 offrant un support complet pour les threads sans GIL. La documentation est la principale ressource d'apprentissage, et les outils d'IA gagnent rapidement en adoption.

Développement

La conception ingénieuse et les lacunes de std::adjacent_difference en C++

2025-08-25

Cet article explore la philosophie de conception de l'algorithme `std::adjacent_difference` dans la bibliothèque standard C++. Cet algorithme calcule les différences entre les éléments adjacents d'une séquence d'entrée, en copiant le premier élément vers la sortie. Bien que cette conception garantisse la symétrie avec `std::partial_sum`, reflétant la différenciation et l'intégration en calcul, elle limite également sa généricité, car la différence entre des éléments d'un type arbitraire peut avoir un type différent. L'article établit des parallèles avec les dérivées et les intégrales en calcul, expliquant la raison d'être de l'algorithme et le comparant à la fonction `deltas` plus flexible de Q. La conclusion est que, bien que l'intention initiale de Stepanov était solide, l'algorithme manque de généricité ; `pairwise_transform` de C++23 offre une alternative plus flexible.

Développement programmation générique

Cauchemar d'algorithme : une solution O(EV+VlogVlogK) pour compter les chemins de longueur K

2025-08-25

Cet article aborde un problème algorithmique apparemment simple : trouver le nombre de chemins de longueur K entre les nœuds A et B dans un graphe orienté non pondéré. En commençant par le BFS de base et la programmation dynamique, l’auteur se penche sur des techniques plus avancées, notamment l’exponentiation matricielle, les récurrences linéaires, les fonctions génératrices, les polynômes annulateurs et l’algorithme de Berlekamp-Massey. Le résultat est une solution impressionnante O(EV+VlogVlogK), significativement plus rapide que les approches traditionnelles O(EK) ou O(V³logK). L’auteur explique clairement les principes et les connexions entre ces algorithmes, soulignant la complexité du problème et l’élégance de la solution.

Développement récurrences linéaires

Parquet v2 : Gains de performance vs. défis d'adoption de l'écosystème

2025-08-25

Parquet version 2 offre des améliorations significatives des performances, réduisant la taille des fichiers et accélérant les temps de lecture/écriture, en particulier pour les ensembles de données comportant de nombreuses valeurs numériques. Cependant, le support limité de l'écosystème signifie que de nombreux outils restent incompatibles, ce qui entrave la réalisation de ces gains. L'auteur a rencontré des problèmes de compatibilité en première main, soulignant que les avantages de la v2 profitent principalement aux systèmes autonomes, tandis que l'intégration tierce reste un défi. Bien que Parquet v2 montre des améliorations de performances, sa faible adoption limite actuellement ses avantages pratiques. Envisagez d'adopter la dernière spécification uniquement si vous contrôlez l'ensemble du pipeline de traitement des données.

Développement

Performances du système de fichiers en mémoire dans Rust : étonnamment, cela n’a pas d’importance

2025-08-25

Lors de la création d’un outil CLI en Rust, l’auteur a tenté d’utiliser un système de fichiers en mémoire pour accélérer les tests de gestion des fichiers. Après avoir exploré des crates comme `vfs` et `rsfs`, la conclusion surprenante a été que les SSD modernes et la mise en cache du système de fichiers du système d’exploitation sont si efficaces qu’il n’y a pratiquement aucun gain de performance à utiliser un système de fichiers en mémoire. Les benchmarks ont systématiquement montré environ 45 ms pour les tests utilisant des systèmes de fichiers en mémoire, des systèmes de fichiers réguliers et même un ramdisk, un contraste saisissant avec les attentes. L’auteur invite les lecteurs à partager des exemples où l’utilisation d’un système de fichiers en mémoire produit des différences de performances perceptibles.

Sping : Un outil moderne de surveillance de latence HTTP/TCP pour terminal

2025-08-25

Sping est un outil moderne en ligne de commande pour surveiller la latence HTTP/TCP avec une visualisation en temps réel, un chronométrage par phases et une analyse avancée. Il prend en charge les protocoles HTTP et TCP, affichant les temps de réponse, la détection des valeurs aberrantes et les statistiques dans une interface utilisateur de terminal interactive ou via une sortie texte simple et JSON. Les fonctionnalités incluent des intervalles, des nombres, des seuils et plusieurs palettes de couleurs personnalisables. Facile à installer via pip et produisant des captures d'écran attrayantes pour la collaboration, Sping aide à diagnostiquer les problèmes de latence réseau aux couches 4+.

Passerelle ContextForge MCP : Unification de REST, MCP et A2A

2025-08-25
Passerelle ContextForge MCP : Unification de REST, MCP et A2A

La passerelle ContextForge MCP est une passerelle, un proxy et un registre MCP riches en fonctionnalités qui fédèrent les services MCP et REST, unifiant la découverte, l'authentification, la limitation de débit, l'observabilité, les serveurs virtuaux, les protocoles de transport multiples et une interface d'administration facultative en un seul point d'extrémité propre pour vos clients d'IA. Elle fonctionne comme un serveur MCP entièrement conforme, déployable via PyPI ou Docker, et s'adapte aux environnements multicouches sur Kubernetes avec une fédération et une mise en cache basées sur Redis. Actuellement en version alpha/bêta précoce, elle n'est pas prête pour la production et ne doit être utilisée que pour le développement local, les tests ou l'expérimentation.

Développement Passerelle

Git Annex : Maîtrisez vos données, où qu'elles soient

2025-08-25

Bob et Alice sont confrontés à des défis de gestion de données : Bob doit archiver des données sur plusieurs disques hors ligne, tandis qu'Alice a besoin d'une solution transparente pour gérer les données sur un netbook, des clés USB et un serveur cloud. Git Annex résout les deux problèmes. Pour Bob, il fournit une seule arborescence de répertoires pour tous les fichiers, quelle que soit leur emplacement physique, simplifiant l'organisation et évitant la perte accidentelle de données. Pour Alice, il gère plusieurs sources de données comme des dépôts Git distants, permettant une synchronisation et un contrôle de version faciles sans intervention manuelle. Que ce soit hors ligne ou en déplacement, Git Annex garantit l'accessibilité, la sécurité et la préservation à long terme des données.

Développement

Calcul des dettes de carte de crédit avec du code : les mathématiques sont-elles essentielles pour les programmeurs ?

2025-08-24
Calcul des dettes de carte de crédit avec du code : les mathématiques sont-elles essentielles pour les programmeurs ?

Cet article explore si les mathématiques sont une connaissance de base essentielle pour les programmeurs. En construisant un programme Elixir simulant le remboursement d’une carte de crédit, l’auteur montre comment des formules simples et la programmation peuvent résoudre des problèmes du monde réel, tels que le calcul des intérêts composés et les échéanciers de paiement. La simulation du programme montre qu’une légère augmentation du pourcentage de paiement minimum ou l’ajout d’un petit paiement mensuel supplémentaire réduit considérablement le temps de remboursement et permet d’économiser une somme d’argent substantielle, soulignant l’importance de comprendre les intérêts composés et la planification financière. Même sans mathématiques avancées, l’application pratique est démontrée.

Développement

Mode WAL de SQLite : compromis entre durabilité et performance

2025-08-24

Le mode WAL (Write-Ahead Log) de SQLite, souvent utilisé pour un débit d'écriture plus élevé, compromet la durabilité des données par rapport au mode journal par défaut. Le pragma `synchronous` contrôle la fréquence d'appel de fsync ; la valeur par défaut est NORMAL. En mode NORMAL, les fichiers WAL sont synchronisés avant chaque point de contrôle et le fichier de base de données après, mais la plupart des transactions ne comportent pas d'opérations de synchronisation. Pour les applications où la durabilité n'est pas critique, NORMAL est suffisant. Pour une durabilité garantie en cas de panne de courant, `synchronous=FULL` ajoute une synchronisation de fichier WAL après chaque validation de transaction, augmentant la durabilité au détriment de la vitesse d'écriture. Cette explication, motivée par des inquiétudes concernant SurrealDB qui pourrait sacrifier la durabilité pour les performances de référence, clarifie l'approche de SQLite.

(avi.im)
1 2 17 18 19 21 23 24 25 214 215