Shape Suffixes – Good Coding Style
Résumé indisponible pour cet article.
Les meilleurs longs formats de Hacker News, relus plus calmement.
Résumé indisponible pour cet article.
L'auteur a quitté Stainless pour consacrer son temps à River, son projet parallèle qu'il souhaite transformer en entreprise durable. Il évoque la crainte que les modèles LLM permettent aux entreprises de recréer en interne des logiciels payants, illustrée par l'anecdote d'une équipe ayant remplacé Jira pour économiser 400 $/mois. Il rappelle que si les LLM rendent le développement moins cher, ils n'annulent pas les coûts de construction et de maintenance, notamment le temps humain nécessaire pour affiner et superviser les boucles de rétroaction. En comparant des exemples chiffrés, il montre que pour des services peu onéreux comme Jira la reconstruction interne ne rentre souvent pas dans les comptes, alors que pour des produits très coûteux comme Salesforce une solution interne devient souvent viable, d'où la notion de zone de viabilité du logiciel acheté. River est un projet open source offrant des fonctionnalités de base gratuitement et une version Pro payante avec des fonctions avancées, tarifée à partir de 125 $/mois pour jusqu'à 20 développeurs, et l'auteur mise son avenir professionnel sur la pérennité de ce modèle.
Résumé indisponible pour cet article.
L'auteur soutient que la duplication est souvent moins coûteuse qu'une abstraction erronée et recommande de préférer la duplication à la mauvaise abstraction. L'article décrit un schéma fréquent où un développeur extrait du code dupliqué en une abstraction, puis des paramètres et des conditionnelles s'accumulent au fil des nouvelles exigences, rendant le code illisible. Le texte explique que le code existant exerce une pression conservatrice (biais du coût irrécupérable) qui pousse à étendre une abstraction inadaptée plutôt qu'à la remplacer. La solution proposée est de revenir en arrière en ré-inlinant le code chez chaque appelant, supprimer les parties inutiles et, une fois clarifiées les différences, ré-extraire des abstractions correctes. La morale est qu'abandonner rapidement une abstraction fausse n'est pas un recul mais un progrès qui facilite l'évolution et la maintenance du code.
La petite enfance est la période critique pour acquérir l'oreille absolue, qui se ferme vers l'âge de six ans et n'est généralement pas acquise à l'âge adulte. L'application fait apprendre la reconnaissance d'accords de piano en associant chaque accord à une couleur, en commençant par deux et en ajoutant progressivement d'autres couleurs à mesure que l'enfant progresse. La méthode Eguchi, décrite dans Psychology of Music, préconise des sessions courtes et régulières (cinq fois par jour de 2–3 minutes) et recommande d'introduire un nouvel accord au minimum toutes les deux semaines seulement après une identification parfaite des accords existants. L'application suit la précision, ajuste la fréquence d'apparition des accords avec un algorithme adaptatif qui favorise les accords plus difficiles et gère plusieurs profils utilisateur, avec une progression commençant par neuf accords sur les touches blanches puis cinq accords sur les touches noires. Le projet est dérivé du CIM Trainer open source de Paul Ganssle, reconstruit séparément à sa demande et distribué sous licence Apache 2.0, avec des instructions de construction nécessitant Node.js et Android Studio pour exécuter l'application.
Les auteurs compilent des estimations de latences d'opérations CPU pour remplacer les micro-benchmarks, en précisant que les chiffres sont fiables seulement à un ordre de grandeur. Les multiplicateurs entiers prennent typiquement 3–5 cycles tandis que les divisions restent coûteuses (les divisions 64 bits modernes peuvent atteindre une dizaine de cycles voire davantage), avec une différence 32/64 bits réduite depuis ~2020. Le RTTI augmente la taille du code mais n'ajoute pas d'overhead par instance pour les classes polymorphes, et les exceptions C++ sont en pratique « zéro‑coût » lorsqu'elles ne sont pas levées mais impliquent des milliers de cycles lorsqu'elles se produisent, changeant l'équilibre par rapport aux codes de retour selon la fréquence des erreurs. Les opérations atomiques (CAS) coûtent modestement localement (ordre de dizaines de cycles) mais peuvent monter à plusieurs centaines sur NUMA ou multi‑socket et provoquent des effets secondaires sur le parallélisme d'instruction et la bande passante, tandis que certaines architectures favorisent LL/SC (RISC‑V) et d'autres CAS (x86/x64). Un appel de fonction direct coûte typiquement une dizaine ou quelques dizaines de cycles et les appels indirects/virtuels sont plus lents, l'inlining permet d'éliminer ces coûts et d'activer des optimisations substantielles, les accès thread_local exigent des indirections supplémentaires, et les changements de contexte sont très coûteux au‑delà du coût direct (quelques milliers de cycles) à cause des invalidations de cache qui peuvent pousser l'impact beaucoup plus haut.
L'article explique que la conjugaison japonaise repose essentiellement sur la concaténation de suffixes à une racine (stem), avec les verbes ichidan à racine fixe et les verbes godan dont la voyelle finale alterne (notée *). Il introduit l'idée de "voyelles secrètes" dans les suffixes qui se révèlent si la racine comporte un joker (*), et précise que la romanisation aide à visualiser ces mouvements mais qu'il faut penser en syllabes japonaises (hiragana). Des cas particuliers phonétiques et historiques sont décrits, notamment l'insertion d'un [w] devant a pour éviter la collision de voyelles, les substitutions t/s → chi/shi, et des heuristiques pour deviner la racine selon la terminaison du dictionnaire. La formation des formes en -ta/-te pour les godan suit des schémas spécifiques (m/b/n → -nda, k/g → -ita/-ida, autres → -tta), et l'article rappelle les principales irrégularités à mémoriser, comme suru, kuru, aru et iku. Enfin, l'auteur propose une vision unifiée où le -u/-ru se comprend comme un suffixe -[r]u à "consonne secrète" qui disparaît devant *, applique le même mécanisme au conditionnel et au causatif, et conseille d'apprendre la racine puis d'utiliser l'ordre "poli, négatif, passé" pour choisir les suffixes.
Le navigateur propose des packs linguistiques pour prendre en charge de nombreuses langues, y compris l'anglais, le chinois et l'espagnol. Ces packs visent à permettre à des utilisateurs du monde entier de naviguer dans la langue de leur choix. PowerFox est conforme aux standards et conçu pour être riche en fonctionnalités afin d'assurer la compatibilité avec les sites modernes. Il prend en charge des technologies récentes telles que WebGL, un moteur JavaScript à jour et les emoji en couleur. Le navigateur offre également un support pour les plugins NPAPI et d'autres fonctionnalités destinées à améliorer l'expérience web.
Le jeu simule en temps réel chaque unité, projectile et explosion, incluant la balistique des projectiles, la physique des explosions et la déformation du terrain. L'échelle et le réalisme permettent de commander des unités individuelles ou des armées de milliers dans une expérience RTS immersive. La topographie des champs de bataille influence les stratégies et l'efficacité des unités, le radar ne traversant pas les montagnes et les armes nucléaires modifiant physiquement le terrain. Plus de dix classes d'unités, y compris des unités expérimentales tout-terrain, offrent des possibilités tactiques variées à combiner. La réussite dépend de l'équilibre entre la croissance des ressources et la production d'armes, permettant des stratégies allant de frappes précises à des offensives massives.
L'article explique comment utiliser JSON-LD pour ajouter des données structurées aux pages web afin d'améliorer la compréhension sémantique par les moteurs de recherche et les aperçus enrichis. Il détaille l'insertion d'un script de type application/ld+json contenant @context pointant vers Schema.org et un @graph regroupant des nœuds décrivant le site. Il présente les nœuds principaux utiles pour un site personnel — WebSite, WebPage (ainsi que ProfilePage et CollectionPage), Person, Blog/BlogPosting, SoftwareApplication et BreadcrumbList — et illustre leurs propriétés par des exemples. L'auteur recommande des bonnes pratiques : utiliser des @id uniques sous forme d'URL avec fragment (#), inclure systématiquement un nœud Person sur chaque page, relier les nœuds avec isPartOf/mainEntity et alléger la description WebSite hors de la page racine. En conclusion, même un déploiement minimal (WebSite, ProfilePage et Person) améliore la représentation par les crawlers et le guide fournit des extraits prêts à copier-coller pour faciliter l'implémentation.